ruby-miyako-mswin32 2.1.0 → 2.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (59) hide show
  1. data/README +275 -20
  2. data/install_miyako.rb +5 -3
  3. data/lib/Miyako/API/audio.rb +11 -6
  4. data/lib/Miyako/API/basic_data.rb +0 -985
  5. data/lib/Miyako/API/bitmap.rb +19 -22
  6. data/lib/Miyako/API/choices.rb +203 -69
  7. data/lib/Miyako/API/collision.rb +451 -9
  8. data/lib/Miyako/API/color.rb +177 -0
  9. data/lib/Miyako/API/diagram.rb +18 -20
  10. data/lib/Miyako/API/fixedmap.rb +207 -73
  11. data/lib/Miyako/API/font.rb +111 -18
  12. data/lib/Miyako/API/i_yuki.rb +1201 -0
  13. data/lib/Miyako/API/input.rb +65 -0
  14. data/lib/Miyako/API/layout.rb +41 -29
  15. data/lib/Miyako/API/map.rb +202 -157
  16. data/lib/Miyako/API/map_event.rb +86 -19
  17. data/lib/Miyako/API/map_struct.rb +268 -0
  18. data/lib/Miyako/API/modules.rb +136 -37
  19. data/lib/Miyako/API/movie.rb +8 -8
  20. data/lib/Miyako/API/parts.rb +63 -20
  21. data/lib/Miyako/API/plane.rb +4 -4
  22. data/lib/Miyako/API/screen.rb +16 -8
  23. data/lib/Miyako/API/sprite.rb +290 -23
  24. data/lib/Miyako/API/sprite_animation.rb +23 -11
  25. data/lib/Miyako/API/sprite_list.rb +406 -183
  26. data/lib/Miyako/API/story.rb +4 -65
  27. data/lib/Miyako/API/struct_point.rb +157 -0
  28. data/lib/Miyako/API/struct_rect.rb +233 -0
  29. data/lib/Miyako/API/struct_segment.rb +641 -0
  30. data/lib/Miyako/API/struct_size.rb +158 -0
  31. data/lib/Miyako/API/struct_square.rb +253 -0
  32. data/lib/Miyako/API/textbox.rb +49 -35
  33. data/lib/Miyako/API/viewport.rb +5 -5
  34. data/lib/Miyako/API/wait_counter.rb +350 -0
  35. data/lib/Miyako/API/yuki.rb +95 -60
  36. data/lib/Miyako/EXT/raster_scroll.rb +30 -8
  37. data/lib/Miyako/EXT/slides.rb +6 -6
  38. data/lib/Miyako/miyako.rb +25 -11
  39. data/lib/Miyako/miyako_no_katana.so +0 -0
  40. data/lib/miyako.rb +28 -0
  41. data/lib/miyako_require_only.rb +35 -0
  42. data/sample/Diagram_sample/diagram_sample_yuki2.rb +30 -30
  43. data/sample/Room3/blue.rb +19 -19
  44. data/sample/Room3/green.rb +9 -9
  45. data/sample/Room3/main.rb +12 -12
  46. data/sample/Room3/red.rb +12 -12
  47. data/sample/Room3/title.rb +15 -10
  48. data/sample/collision_test2.rb +2 -1
  49. data/sample/fixed_map_test/fixed_map_sample.rb +7 -6
  50. data/sample/map_test/main_scene.rb +12 -10
  51. data/sample/map_test/map_manager.rb +14 -13
  52. data/sample/rasterscroll.rb +5 -5
  53. data/sample/takahashi.rb +3 -3
  54. data/sample/textbox_sample.rb +8 -5
  55. data/sample/transform.rb +2 -1
  56. data/uninstall_miyako.rb +4 -1
  57. metadata +13 -4
  58. data/lib/Miyako/EXT/miyako_cairo.rb +0 -62
  59. data/sample/cairo_sample.rb +0 -25
@@ -0,0 +1,1201 @@
1
+ # -*- encoding: utf-8 -*-
2
+ =begin
3
+ --
4
+ Miyako v2.1
5
+ Copyright (C) 2007-2009 Cyross Makoto
6
+
7
+ This library is free software; you can redistribute it and/or
8
+ modify it under the terms of the GNU Lesser General Public
9
+ License as published by the Free Software Foundation; either
10
+ version 2.1 of the License, or (at your option) any later version.
11
+
12
+ This library is distributed in the hope that it will be useful,
13
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15
+ Lesser General Public License for more details.
16
+
17
+ You should have received a copy of the GNU Lesser General Public
18
+ License along with this library; if not, write to the Free Software
19
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20
+ ++
21
+ =end
22
+
23
+ #lambdaの別名として、yuki_plotメソッドを追加
24
+ alias :yuki_plot :lambda
25
+
26
+ #=シナリオ言語Yuki実装モジュール
27
+ module Miyako
28
+
29
+ #==InitiativeYukiクラスに対応したテンプレートモジュール
30
+ module InitiativeYukiTemplate
31
+ def render_inner(yuki)
32
+ end
33
+
34
+ def render_to_inner(yuki, dst)
35
+ end
36
+
37
+ def update_animation_inner(yuki)
38
+ end
39
+
40
+ def update_inner(yuki)
41
+ end
42
+
43
+ def text_inner(yuki, ch)
44
+ end
45
+
46
+ def cr_inner(yuki)
47
+ end
48
+
49
+ def clear_inner(yuki)
50
+ end
51
+
52
+ def input_inner(yuki)
53
+ end
54
+
55
+ def pausing_inner(yuki)
56
+ end
57
+
58
+ def selecting_inner(yuki)
59
+ end
60
+
61
+ def waiting_inner(yuki)
62
+ end
63
+
64
+ def plot
65
+ end
66
+ end
67
+
68
+ #==主導権を持ったYuki本体クラス
69
+ #Yukiの内容をオブジェクト化したクラス
70
+ #Yukiのプロット処理を外部メソッドで管理可能
71
+ #プロットは、引数を一つ(Yuki2クラスのインスタンス)を取ったメソッドもしくはブロック
72
+ #として記述する。
73
+ class InitiativeYuki
74
+ include InitiativeYukiTemplate
75
+ include SpriteBase
76
+ include Animation
77
+
78
+ #==キャンセルを示す構造体
79
+ #コマンド選択がキャンセルされたときに生成される構造体
80
+ Canceled = Struct.new(:dummy)
81
+
82
+ #==コマンド構造体
83
+ #_body_:: コマンドの名称(移動する、調べるなど、アイコンなどの画像も可)
84
+ #_body_selected_:: 選択時コマンドの名称(移動する、調べるなど、アイコンなどの画像も可)(省略時は、bodyと同一)
85
+ #_condition_:: 表示条件(ブロック)。評価の結果、trueのときのみ表示
86
+ #_result_:: 選択結果(移動先シーンクラス名、シナリオ(メソッド)名他のオブジェクト)
87
+ #_body_disable_:: 選択不可時コマンドの名称(移動する、調べるなど、アイコンなどの画像も可)(省略時は、bodyと同一)
88
+ #_enabe_:: コマンド選択の時はtrue、選択不可の時はfalseを設定
89
+ Command = Struct.new(:body, :body_selected, :condition, :result, :body_disable, :enable)
90
+
91
+ #==コマンド構造体
92
+ #_body_:: コマンドの名称(移動する、調べるなど、アイコンなどの画像も可)
93
+ #_body_selected_:: 選択時コマンドの名称(移動する、調べるなど、アイコンなどの画像も可)(省略時は、bodyと同一)
94
+ #_condition_:: 表示条件(ブロック)。評価の結果、trueのときのみ表示
95
+ #_result_:: 選択結果(移動先シーンクラス名、シナリオ(メソッド)名他のオブジェクト)
96
+ #_end_select_proc_:: この選択肢を選択したときに優先的に処理するブロック。
97
+ #_body_disable_:: 選択不可時コマンドの名称(移動する、調べるなど、アイコンなどの画像も可)(省略時は、bodyと同一)
98
+ #ブロックは1つの引数を取る(コマンド選択テキストボックス))。デフォルトはnil
99
+ #_enabe_:: コマンド選択の時はtrue、選択不可の時はfalseを設定
100
+ CommandEX = Struct.new(:body, :body_selected, :condition, :result, :end_select_proc, :body_disable, :enable)
101
+
102
+ attr_reader :visibles, :base
103
+ attr_reader :valign
104
+ #release_checks:: ポーズ解除を問い合わせるブロックの配列。
105
+ #callメソッドを持ち、true/falseを返すインスタンスを配列操作で追加・削除できる。
106
+ #ok_checks:: コマンド選択決定を問い合わせるブロックの配列。
107
+ #callメソッドを持ち、true/falseを返すインスタンスを配列操作で追加・削除できる。
108
+ #cancel_checks:: コマンド選択解除(キャンセル)を問い合わせるブロックの配列。
109
+ #callメソッドを持ち、true/falseを返すインスタンスを配列操作で追加・削除できる。
110
+ attr_reader :release_checks, :ok_checks, :cancel_checks
111
+ attr_reader :pre_pause, :pre_command, :pre_cancel, :post_pause, :post_command, :post_cancel, :on_disable
112
+ #selecting_procs:: コマンド選択時に行うブロックの配列。
113
+ #ブロックは4つの引数を取る必要がある。
114
+ #(1)コマンド決定ボタンを押した?(true/false)
115
+ #(2)キャンセルボタンを押した?(true/false)
116
+ #(3)キーパッドの移動量を示す配列([dx,dy])
117
+ #(4)マウスの位置を示す配列([x,y])
118
+ #callメソッドを持つブロックが使用可能。
119
+ attr_reader :selecting_procs
120
+
121
+ #===Yukiにメソッドを追加する(すべてのYukiインスタンスに適応)
122
+ #ブロックを渡すことで、Yukiに新しいメソッドを追加できる。
123
+ #追加したメソッドは、すべてのYukiインスタンスで利用可能となる。
124
+ #コンテキストはYukiクラスのインスタンスとなるため、Yukiスクリプトと同じ感覚でメソッドを追加できる。
125
+ #ただし、すでに追加したメソッド(もしくはYukiクラスですでに追加されているメソッド)を追加しようとすると例外が発生する
126
+ #
127
+ #_name_:: ブロックに渡す引数リスト
128
+ #_block_:: メソッドとして実行させるブロック
129
+ def Yuki.add_method(name, &block)
130
+ name = name.to_sym
131
+ raise MiyakoError, "Already added method! : #{name.to_s}" if self.methods.include?(name)
132
+ define_method(name, block)
133
+ return nil
134
+ end
135
+
136
+ #===Yukiにメソッドを追加する(指定のYukiインスタンスのみ適応)
137
+ #ブロックを渡すことで、Yukiに新しいメソッドを追加できる。
138
+ #追加したメソッドは、指定したYukiインスタンスのみ利用可能となる。
139
+ #コンテキストはYukiクラスのインスタンスとなるため、Yukiスクリプトと同じ感覚でメソッドを追加できる。
140
+ #ただし、すでに追加したメソッド(もしくはYukiクラスですでに追加されているメソッド)を追加しようとすると例外が発生する
141
+ #
142
+ #_name_:: ブロックに渡す引数リスト
143
+ #_block_:: メソッドとして実行させるブロック
144
+ def add_method(name, &block)
145
+ name = name.to_sym
146
+ raise MiyakoError, "Already added method! : #{name.to_s}" if self.methods.include?(name)
147
+ self.define_singleton_method(name, block)
148
+ return nil
149
+ end
150
+
151
+ #===Yukiを初期化する
152
+ #
153
+ #ブロック引数として、テキストボックスの変更などの処理をブロック内に記述することが出来る。
154
+ #引数の数とブロック引数の数が違っていれば例外が発生する
155
+ #_params_:: ブロックに渡す引数リスト(ただし、ブロックを渡しているときのみに有効)
156
+ def initialize(*params, &proc)
157
+ @base = nil
158
+ @yuki = { }
159
+ @text_box = nil
160
+ @command_box = nil
161
+
162
+ @exec_plot = nil
163
+
164
+ @pausing = false
165
+ @selecting = false
166
+ @waiting = false
167
+
168
+ @pause_release = false
169
+ @select_ok = false
170
+ @select_cancel = false
171
+ @select_amount = [0, 0]
172
+ @mouse_amount = nil
173
+
174
+ @result = nil
175
+ @plot_result = nil
176
+
177
+ @parts = {}
178
+ @visibles = SpriteList.new
179
+ @vars = {}
180
+
181
+ @text_methods = {:char => self.method(:text_by_char),
182
+ :string => self.method(:text_by_str) }
183
+ @text_method_name = :char
184
+
185
+ @valign = :middle
186
+
187
+ @release_checks_default = [lambda{ Input.pushed_any?(:btn1, :spc) }, lambda{ Input.click?(:left) } ]
188
+ @release_checks = @release_checks_default.dup
189
+
190
+ @ok_checks_default = [lambda{ Input.pushed_any?(:btn1, :spc) },
191
+ lambda{ self.commandbox.attach_any_command?(*Input.get_mouse_position) && Input.click?(:left) } ]
192
+ @ok_checks = @ok_checks_default.dup
193
+
194
+ @cancel_checks_default = [lambda{ Input.pushed_any?(:btn2, :esc) },
195
+ lambda{ Input.click?(:right) } ]
196
+ @cancel_checks = @cancel_checks_default.dup
197
+
198
+ @key_amount_proc = lambda{ Input.pushed_amount }
199
+ @mouse_amount_proc = lambda{ Input.mouse_cursor_inner? ? Input.get_mouse_position : nil }
200
+
201
+ @pre_pause = []
202
+ @pre_command = []
203
+ @pre_cancel = []
204
+ @post_pause = []
205
+ @post_command = []
206
+ @post_cancel = []
207
+ @on_disable = []
208
+ @selecting_procs = []
209
+
210
+ @is_outer_height = self.method(:is_outer_height)
211
+
212
+ @now_page = nil
213
+ @first_page = nil
214
+
215
+ raise MiyakoProcError, "Aagument count is not same block parameter count!" if proc && proc.arity.abs != params.length
216
+ instance_exec(*params, &proc) if block_given?
217
+ end
218
+
219
+ def initialize_copy(obj) #:nodoc:
220
+ raise MiyakoCopyError.not_copy("Yuki")
221
+ end
222
+
223
+ def render_inner(yuki)
224
+ @base.render_inner(yuki)
225
+ end
226
+
227
+ def render_to_inner(yuki, dst)
228
+ @base.render_to_inner(yuki, dst)
229
+ end
230
+
231
+ def update_animation_inner(yuki)
232
+ @base.update_animation_inner(yuki)
233
+ end
234
+
235
+ def update_inner(yuki)
236
+ @base.update_inner(yuki)
237
+ end
238
+
239
+ def text_inner(yuki, ch)
240
+ @base.text_inner(yuki, ch)
241
+ end
242
+
243
+ def cr_inner(yuki)
244
+ @base.cr_inner(yuki)
245
+ end
246
+
247
+ def clear_inner(yuki)
248
+ @base.clear_inner(yuki)
249
+ end
250
+
251
+ def input_inner(yuki)
252
+ @base.input_inner(yuki)
253
+ end
254
+
255
+ def pausing_inner(yuki)
256
+ @base.pausing_inner(yuki)
257
+ end
258
+
259
+ def selecting_inner(yuki)
260
+ @base.selecting_inner(yuki)
261
+ end
262
+
263
+ def waiting_inner(yuki)
264
+ @base.waiting_inner(yuki)
265
+ end
266
+
267
+ #===Yuki#showで表示指定した画像を描画する
268
+ #描画順は、showメソッドで指定した順に描画される(先に指定した画像は後ろに表示される)
269
+ #なお、visibleの値がfalseの時は描画されない。
270
+ #返却値:: 自分自身を返す
271
+ def render
272
+ @visibles.render
273
+ render_inner(self)
274
+ return self
275
+ end
276
+
277
+ #===Yuki#showで表示指定した画像を描画する
278
+ #描画順は、showメソッドで指定した順に描画される(先に指定した画像は後ろに表示される)
279
+ #なお、visibleの値がfalseの時は描画されない。
280
+ #返却値:: 自分自身を返す
281
+ def render_to(dst)
282
+ @visibles.render
283
+ render_to_inner(self, dst)
284
+ return self
285
+ end
286
+
287
+ #===プロット処理を更新する
288
+ #ポーズ中、コマンド選択中、 Yuki#wait メソッドによるウェイトの状態確認を行う。
289
+ #プロット処理の実行確認は出来ない
290
+ def update
291
+ update_inner(self)
292
+ @pause_release = false
293
+ @select_ok = false
294
+ @select_cancel = false
295
+ @select_amount = [0, 0]
296
+ return nil
297
+ end
298
+
299
+ #===Yuki#showで表示指定した画像のアニメーションを更新する
300
+ #showメソッドで指定した画像のupdate_animationメソッドを呼び出す
301
+ #返却値:: 描く画像のupdate_spriteメソッドを呼び出した結果を配列で返す
302
+ def update_animation
303
+ update_animation_inner(self)
304
+ @visibles.update_animation
305
+ end
306
+
307
+ #===変数を参照する
308
+ #[[Yukiスクリプトとして利用可能]]
309
+ #変数の管理オブジェクトを、ハッシュとして参照する。
310
+ #変数名nameを指定して、インスタンスを参照できる。
311
+ #未登録の変数はnilが変える。
312
+ #(例)vars[:a] = 2 # 変数への代入
313
+ # vars[:b] = vars[:a] + 5
314
+ # show vars[:my_name]
315
+ #
316
+ #_name_:: パーツ名(シンボル)
317
+ #
318
+ #返却値:: 変数管理ハッシュ
319
+ def vars
320
+ @vars
321
+ end
322
+
323
+ #===変数を参照する
324
+ #[[Yukiスクリプトとして利用可能]]
325
+ #変数の管理オブジェクトを、ハッシュとして参照する。
326
+ #変数名nameを指定して、インスタンスを参照できる。
327
+ #未登録の変数はnilが変える。
328
+ #(例)vars[:a] = 2 # 変数への代入
329
+ # vars[:b] = vars[:a] + 5
330
+ # vars_names => [:a, :b]
331
+ #
332
+ #_name_:: パーツ名(シンボル)
333
+ #
334
+ #返却値:: 変数管理ハッシュ
335
+ def vars_names
336
+ @vars.keys
337
+ end
338
+
339
+ #===パーツを参照する
340
+ #[[Yukiスクリプトとして利用可能]]
341
+ #パーツの管理オブジェクトを、ハッシュとして参照する。
342
+ #パーツ名nameを指定して、インスタンスを参照できる
343
+ #未登録のパーツはnilが返る
344
+ #(例)parts[:chr1]
345
+ #
346
+ #返却値:: パーツ管理ハッシュ
347
+ def parts
348
+ @parts
349
+ end
350
+
351
+ #===パーツ名の一覧を参照する
352
+ #[[Yukiスクリプトとして利用可能]]
353
+ #パーツ管理オブジェクトに登録されているパーツ名の一覧を配列として返す。
354
+ #順番は登録順。
355
+ #まだ何も登録されていないときは空の配列が返る。
356
+ #(例)regist_parts :chr1, hoge
357
+ # regist_parts :chr2, fuga
358
+ # parts_names # => [:chr1, :chr2]
359
+ #
360
+ #返却値:: パーツ管理ハッシュ
361
+ def parts_names
362
+ @parts.keys
363
+ end
364
+
365
+ #===現在描画対象のパーツ名のリストを取得する
366
+ #[[Yukiスクリプトとして利用可能]]
367
+ #現在描画しているパーツ名の配列を参照する。
368
+ #実体のインスタンスは、partsメソッドで参照できるハッシュの値として格納されている。
369
+ #Yuki#renderで描画する際、配列の先頭から順に、要素に対応するインスタンスを描画する(つまり、配列の後ろにある方が前に描画される
370
+ #(例):[:a, :b, :c]の順に並んでいたら、:cが指すインスタンスが一番前に描画される。
371
+ #
372
+ #返却値:: 描画対象リスト
373
+ def visibles
374
+ @visibles.names
375
+ end
376
+
377
+ #===オブジェクトを登録する
378
+ #[[Yukiスクリプトとして利用可能]]
379
+ #オブジェクトをパーツnameとして登録する。
380
+ #Yuki::parts[name]で参照可能
381
+ #_name_:: パーツ名(シンボル)
382
+ #_parts_:: 登録対象のインスタンス
383
+ #
384
+ #返却値:: 自分自身を返す
385
+ def regist_parts(name, parts)
386
+ @parts[name] = parts
387
+ return self
388
+ end
389
+
390
+ #===表示・描画対象のテキストボックスを選択する
391
+ #[[Yukiスクリプトとして利用可能]]
392
+ #_box_:: テキストボックスのインスタンス
393
+ #
394
+ #返却値:: 自分自身を返す
395
+ def select_textbox(box)
396
+ @text_box = box
397
+ return self
398
+ end
399
+
400
+ #===表示・描画対象のコマンドボックスを選択する
401
+ #[[Yukiスクリプトとして利用可能]]
402
+ #_box_:: テキストボックスのインスタンス
403
+ #
404
+ #返却値:: 自分自身を返す
405
+ def select_commandbox(box)
406
+ @command_box = box
407
+ return self
408
+ end
409
+
410
+ #===テキストボックスを取得する
411
+ #[[Yukiスクリプトとして利用可能]]
412
+ #テキストボックスが登録されていないときはnilを返す
413
+ #返却値:: テキストボックスのインスタンス
414
+ def textbox
415
+ return @text_box
416
+ end
417
+
418
+ #===コマンドボックスを取得する
419
+ #[[Yukiスクリプトとして利用可能]]
420
+ #コマンドボックスが登録されていないときはnilを返す
421
+ #返却値:: コマンドボックスのインスタンス
422
+ def commandbox
423
+ return @command_box
424
+ end
425
+
426
+ #===オブジェクトの登録を解除する
427
+ #[[Yukiスクリプトとして利用可能]]
428
+ #パーツnameとして登録されているオブジェクトを登録から解除する。
429
+ #_name_:: パーツ名(シンボル)
430
+ #
431
+ #返却値:: 自分自身を返す
432
+ def remove_parts(name)
433
+ @parts.delete(name)
434
+ return self
435
+ end
436
+
437
+ #===パーツで指定したオブジェクトを先頭に表示する
438
+ #[[Yukiスクリプトとして利用可能]]
439
+ #描画時に、指定したパーツを描画する
440
+ #すでにshowメソッドで表示指定している場合は、先頭に表示させる
441
+ #_names_:: パーツ名(シンボル)、複数指定可能(指定した順番に描画される)
442
+ #返却値:: 自分自身を返す
443
+ def show(*names)
444
+ names.each{|name|
445
+ @visibles.add(name, @parts[name])
446
+ @parts[name].show
447
+ }
448
+ return self
449
+ end
450
+
451
+ #===パーツで指定したオブジェクトを隠蔽する
452
+ #[[Yukiスクリプトとして利用可能]]
453
+ #描画時に、指定したパーツを描画させないよう指定する
454
+ #_names_:: パーツ名(シンボル)、複数指定可能
455
+ #返却値:: 自分自身を返す
456
+ def hide(*names)
457
+ names.each{|name|
458
+ @parts[name].hide
459
+ @visibles.delete(name)
460
+ }
461
+ return self
462
+ end
463
+
464
+ #===パーツで指定したオブジェクトの処理を開始する
465
+ #[[Yukiスクリプトとして利用可能]]
466
+ #nameで指定したパーツが持つ処理(例:アニメーション)を開始する。
467
+ #(但し、パーツで指定したオブジェクトがstartメソッドを持つことが条件)
468
+ #_name_:: パーツ名(シンボル)
469
+ #返却値:: 自分自身を返す
470
+ def start(name)
471
+ @parts[name].start
472
+ post_process
473
+ return self
474
+ end
475
+
476
+ #===パーツで指定したオブジェクトを再生する
477
+ #[[Yukiスクリプトとして利用可能]]
478
+ #nameで指定したパーツを再生(例:BGM)する。
479
+ #(但し、パーツで指定したオブジェクトがplayメソッドを持つことが条件)
480
+ #_name_:: パーツ名(シンボル)
481
+ #返却値:: 自分自身を返す
482
+ def play(name)
483
+ @parts[name].play
484
+ post_process
485
+ return self
486
+ end
487
+
488
+ #===パーツで指定したオブジェクトの処理を停止する
489
+ #[[Yukiスクリプトとして利用可能]]
490
+ #nameで指定したパーツが持つ処理を停止する。
491
+ #(但し、パーツで指定したオブジェクトがstopメソッドを持つことが条件)
492
+ #_name_:: パーツ名(シンボル)
493
+ #返却値:: 自分自身を返す
494
+ def stop(name)
495
+ @parts[name].stop
496
+ post_process
497
+ return self
498
+ end
499
+
500
+ #===遷移図の処理が終了するまで待つ
501
+ #[[Yukiスクリプトとして利用可能]]
502
+ #nameで指定した遷移図の処理が終了するまで、プロットを停止する
503
+ #_name_: 遷移図名(シンボル)
504
+ #返却値:: 自分自身を返す
505
+ def wait_by_finish(name)
506
+ until @parts[name].finish?
507
+ pre_process
508
+ @update_inner.call(self)
509
+ post_process
510
+ end
511
+ return self
512
+ end
513
+
514
+ def process(is_clear = true)
515
+ pre_process(is_clear)
516
+ post_process
517
+ end
518
+
519
+ def pre_process(is_clear = true)
520
+ Audio.update
521
+ Input.update
522
+ self.update_input
523
+ self.update
524
+ self.update_animation
525
+ Screen.clear if is_clear
526
+ end
527
+
528
+ def post_process
529
+ self.render
530
+ Screen.render
531
+ end
532
+
533
+ #===別のYukiエンジンを実行する
534
+ #[[Yukiスクリプトとして利用可能]]
535
+ #もう一つのYukiエンジンを実行させ、並行実行させることができる
536
+ #ウインドウの上にウインドウを表示したりするときに、このメソッドを使う
537
+ #renderメソッドで描画する際は、自分のインスタンスが描画した直後に描画される
538
+ #自分自身を実行しようとするとMiyakoValueError例外が発生する
539
+ #_yuki_:: 実行対象のYukiインスタンス(事前にsetupの呼び出しが必要)
540
+ #_plot_:: プロットインスタンス。すでにsetupなどで登録しているときはnilを渡す
541
+ #_params_:: プロット実行開始時に、プロットに渡す引数
542
+ #返却値:: 自分自身を返す
543
+ def over_exec(yuki, plot, *params)
544
+ raise MiyakoValueError, "This Yuki engine is same as self!" if yuki.eql?(self)
545
+ @over_yuki = yuki
546
+ @over_yuki.start_plot(self, plot, *params)
547
+ return self
548
+ end
549
+
550
+ #===シーンのセットアップ時に実行する処理
551
+ #
552
+ #ブロック引数として、テキストボックスの変更などの処理をブロック内に記述することが出来る。
553
+ #引数の数とブロック引数の数が違っていれば例外が発生する
554
+ #_params_:: ブロックに渡す引数リスト(ブロックを渡しているときのみ)
555
+ #返却値:: 自分自身を返す
556
+ def setup(*params, &proc)
557
+ @exec_plot = nil
558
+
559
+ @pause_release = false
560
+ @select_ok = false
561
+ @select_cancel = false
562
+ @select_amount = [0, 0]
563
+ @mouse_amount = nil
564
+
565
+ @result = nil
566
+ @plot_result = nil
567
+
568
+ @now_page = nil
569
+ @first_page = nil
570
+
571
+ raise MiyakoProcError, "Aagument count is not same block parameter count!" if proc && proc.arity.abs != params.length
572
+ instance_exec(*params, &proc) if proc
573
+
574
+ return self
575
+ end
576
+
577
+ #===実行するプロットと登録する
578
+ #_plot_proc_:: プロットの実行部をインスタンス化したオブジェクト
579
+ #返却値:: 自分自身を返す
580
+ def select_plot(plot_proc)
581
+ @exec_plot = plot_proc
582
+ return self
583
+ end
584
+
585
+ #===プロット処理を実行する(明示的に呼び出す必要がある場合)
586
+ #引数もしくはブロックで指定したプロット処理を非同期に実行する。
587
+ #呼び出し可能なプロットは以下の3種類。(上から優先度が高い順)
588
+ #プロットが見つからなければ例外が発生する
589
+ #
590
+ #1)引数prot_proc(Procクラスのインスタンス)
591
+ #
592
+ #2)引数として渡したブロック
593
+ #
594
+ #3)select_plotメソッドで登録したブロック(Procクラスのインスタンス)
595
+ #
596
+ #_base_:: プロットの実行部をインスタンス化したオブジェクト。省略時はnil(paramsを指定するときは必ず設定すること)
597
+ #_plot_proc_:: プロットの実行部をインスタンス化したオブジェクト。省略時はnil(paramsを指定するときは必ず設定すること)
598
+ #_params_:: プロットに引き渡す引数リスト
599
+ #返却値:: 自分自身を返す
600
+ def start_plot(base, plot_proc = nil, *params, &plot_block)
601
+ raise MiyakoValueError, "Yuki Error! Textbox is not selected!" unless @text_box
602
+ raise MiyakoProcError, "Aagument count is not same block parameter count!" if plot_proc && plot_proc.arity.abs != params.length
603
+ raise MiyakoProcError, "Aagument count is not same block parameter count!" if plot_block && plot_block.arity.abs != params.length
604
+ raise MiyakoProcError, "Aagument count is not same block parameter count!" if @exec_plot && @exec_plot.arity.abs != params.length
605
+ @base = base
606
+ plot_facade(plot_proc, *params, &plot_block)
607
+ return self
608
+ end
609
+
610
+ #===プロット用ブロックをYukiへ渡すためのインスタンスを作成する
611
+ #プロット用に用意したブロック(ブロック引数無し)を、Yukiでの選択結果や移動先として利用できる
612
+ #インスタンスに変換する
613
+ #返却値:: ブロックをオブジェクトに変換したものを返す
614
+ def to_plot(&plot)
615
+ return plot
616
+ end
617
+
618
+ #===プロット処理に使用する入力情報を更新する
619
+ #ポーズ中、コマンド選択中に使用する入力デバイスの押下状態を更新する
620
+ #(但し、プロット処理の実行中にのみ更新する)
621
+ #Yuki#update メソッドをそのまま使う場合は呼び出す必要がないが、 Yuki#exec_plot メソッドを呼び出す
622
+ #プロット処理の場合は、メインスレッドから明示的に呼び出す必要がある
623
+ #返却値:: nil を返す
624
+ def update_input
625
+ input_inner(self)
626
+ return nil
627
+ end
628
+
629
+ def plot_facade(plot_proc = nil, *params, &plot_block) #:nodoc:
630
+ @plot_result = nil
631
+ exec_plot = @exec_plot
632
+ @plot_result = plot_proc ? self.instance_exec(*params, &plot_proc) :
633
+ block_given? ? self.instance_exec(*params, &plot_block) :
634
+ exec_plot ? self.instance_exec(*params, &exec_plot) :
635
+ raise(MiyakoProcError, "Cannot find plot!")
636
+ end
637
+
638
+ #===プロット処理中に別のプロットを呼び出す
639
+ #呼び出し可能なプロットは以下の2種類。(上から優先度が高い順)
640
+ #
641
+ #1)引数prot_proc(Procクラスのインスタンス)
642
+ #
643
+ #2)引数として渡したブロック
644
+ #
645
+ #_plot_proc_:: プロットの実行部をインスタンス化したオブジェクト
646
+ #返却値:: プロットの実行結果を返す
647
+ def call_plot(plot_proc = nil, &plot_block)
648
+ return plot_proc ? self.instance_exec(&plot_proc) :
649
+ self.instance_exec(&plot_block)
650
+ end
651
+
652
+ #===ポーズ解除問い合わせメソッド配列を初期状態に戻す
653
+ #返却値:: 自分自身を返す
654
+ def reset_release_checks
655
+ @release_checks = @release_checks_default.dup
656
+ return self
657
+ end
658
+
659
+ #===コマンド選択決定問い合わせメソッド配列を初期状態に戻す
660
+ #返却値:: 自分自身を返す
661
+ def reset_ok_checks
662
+ @ok_checks = @ok_checks_default.dup
663
+ return self
664
+ end
665
+
666
+ #===コマンド選択キャンセル問い合わせメソッド配列を初期状態に戻す
667
+ #返却値:: 自分自身を返す
668
+ def reset_cancel_checks
669
+ @cancel_checks = @cancel_checks_default.dup
670
+ return self
671
+ end
672
+
673
+ #===ポーズ前後処理メソッド配列を初期状態に戻す
674
+ #pre_pause/post_pauseの処理を初期状態([])に戻す
675
+ #返却値:: 自分自身を返す
676
+ def reset_pre_post_release
677
+ @pre_pause = []
678
+ @post_pause = []
679
+ return self
680
+ end
681
+
682
+ #===コマンド選択前後処理メソッド配列を初期状態に戻す
683
+ #pre_command/post_commandの処理を初期状態([])に戻す
684
+ #返却値:: 自分自身を返す
685
+ def reset_pre_post_command
686
+ @pre_command = []
687
+ @post_command = []
688
+ return self
689
+ end
690
+
691
+ #===コマンド選択キャンセル前後処理メソッド配列を初期状態に戻す
692
+ #pre_cancel/post_cancelの処理を初期状態([])に戻す
693
+ #返却値:: 自分自身を返す
694
+ def reset_pre_post_cancel
695
+ @pre_acncel = []
696
+ @post_cancel = []
697
+ return self
698
+ end
699
+
700
+ #===ブロック評価中、ポーズ解除問い合わせメソッド配列を置き換える
701
+ #同時に、ポーズ時処理(Yuki#pre_pause)、ポーズ解除時処理(Yuki#post_pause)を引数で設定できる。
702
+ #ブロックの評価が終われば、メソッド配列・ポーズ時処理・ポーズ解除時処理を元に戻す
703
+ #procs:: 置き換えるメソッド配列(callメソッドを持ち、true/falseを返すメソッドの配列)
704
+ #pre_proc:: ポーズ開始時に実行させるProc(デフォルトは[](何もしない))
705
+ #post_proc:: ポーズ解除時に実行させるProc(デフォルトは[](何もしない))
706
+ #返却値:: 自分自身を返す
707
+ def release_checks_during(procs, pre_procs = [], post_procs = [])
708
+ raise MiyakoProcError, "Can't find block!" unless block_given?
709
+ backup = [@release_checks, @pre_pause, @post_pause]
710
+ @release_checks, @pre_pause, @post_pause = procs, pre_proc, post_proc
711
+ yield
712
+ @release_checks, @pre_pause, @post_pause = backup.pop(3)
713
+ return self
714
+ end
715
+
716
+ #===ブロック評価中、コマンド選択決定問い合わせメソッド配列を置き換える
717
+ #同時に、コマンド選択開始時処理(Yuki#pre_command)、コマンド選択終了時処理(Yuki#post_command)を引数で設定できる。
718
+ #ブロックの評価が終われば、メソッド配列・コマンド選択開始時処理・コマンド選択終了時処理を元に戻す
719
+ #procs:: 置き換えるメソッド配列(callメソッドを持ち、true/falseを返すメソッドの配列)
720
+ #pre_proc:: コマンド選択開始時に実行させるProc(デフォルトは[](何もしない))
721
+ #post_proc:: コマンド選択決定時に実行させるProc(デフォルトは[](何もしない))
722
+ #返却値:: 自分自身を返す
723
+ def ok_checks_during(procs, pre_procs = [], post_procs = [])
724
+ raise MiyakoProcError, "Can't find block!" unless block_given?
725
+ backup = [@ok_checks, @pre_command, @post_command]
726
+ @ok_checks, @pre_command, @post_command = procs, pre_proc, post_proc
727
+ yield
728
+ @ok_checks, @pre_command, @post_command = backup.pop(3)
729
+ return self
730
+ end
731
+
732
+ #===ブロック評価中、コマンド選択キャンセル問い合わせメソッド配列を置き換える
733
+ #同時に、コマンド選択開始時処理(Yuki#pre_cancel)、コマンド選択終了時処理(Yuki#post_cancel)を引数で設定できる。
734
+ #ブロックの評価が終われば、メソッド配列・コマンド選択開始時処理・コマンド選択終了時処理を元に戻す
735
+ #procs:: 置き換えるメソッド配列(callメソッドを持ち、true/falseを返すメソッドの配列)
736
+ #pre_proc:: コマンド選択開始時に実行させるProc(デフォルトは[](何もしない))
737
+ #post_proc:: コマンド選択キャンセル時に実行させるProc(デフォルトは[](何もしない))
738
+ #返却値:: 自分自身を返す
739
+ def cancel_checks_during(procs, pre_procs = [], post_procs = [])
740
+ raise MiyakoProcError, "Can't find block!" unless block_given?
741
+ backup = [@cancel_checks, @pre_cancel, @post_cancel]
742
+ @cancel_checks, @pre_cancel, @post_cancel = procs, pre_proc, post_proc
743
+ yield
744
+ @cancel_checks, @pre_cancel, @post_cancel = backup.pop(3)
745
+ return self
746
+ end
747
+
748
+ #===プロットの処理結果を返す
749
+ #[[Yukiスクリプトとして利用可能]]
750
+ #プロット処理の結果を返す。
751
+ #まだ結果が得られていない場合はnilを得る
752
+ #プロット処理が終了していないのに結果を得られるので注意!
753
+ #返却値:: プロットの処理結果
754
+ def result
755
+ return @plot_result
756
+ end
757
+
758
+ #===プロット処理の結果を設定する
759
+ #[[Yukiスクリプトとして利用可能]]
760
+ #_ret_:: 設定する結果。デフォルトはnil
761
+ #返却値:: 自分自身を返す
762
+ def result=(ret = nil)
763
+ @plot_result = ret
764
+ return self
765
+ end
766
+
767
+ #===結果がシーンかどうかを問い合わせる
768
+ #[[Yukiスクリプトとして利用可能]]
769
+ #結果がシーン(シーンクラス名)のときはtrueを返す
770
+ #対象の結果は、選択結果、プロット処理結果ともに有効
771
+ #返却値:: 結果がシーンかどうか(true/false)
772
+ def is_scene?(result)
773
+ return (result.class == Class && result.include?(Story::Scene))
774
+ end
775
+
776
+ #===結果がシナリオかどうかを問い合わせる
777
+ #[[Yukiスクリプトとして利用可能]]
778
+ #結果がシナリオ(メソッド)のときはtrueを返す
779
+ #対象の結果は、選択結果、プロット処理結果ともに有効
780
+ #返却値:: 結果がシナリオかどうか(true/false)
781
+ def is_scenario?(result)
782
+ return (result.kind_of?(Proc) || result.kind_of?(Method))
783
+ end
784
+
785
+ #===コマンド選択がキャンセルされたときの結果を返す
786
+ #[[Yukiスクリプトとして利用可能]]
787
+ #返却値:: キャンセルされたときはtrue、されていないときはfalseを返す
788
+ def canceled?
789
+ return result == @cancel
790
+ end
791
+
792
+ #===ブロックを条件として設定する
793
+ #[[Yukiスクリプトとして利用可能]]
794
+ #メソッドをMethodクラスのインスタンスに変換する
795
+ #_block_:: シナリオインスタンスに変換したいメソッド名(シンボル)
796
+ #返却値:: シナリオインスタンスに変換したメソッド
797
+ def condition(&block)
798
+ return block
799
+ end
800
+
801
+ #===条件に合っていればポーズをかける
802
+ #[[Yukiスクリプトとして利用可能]]
803
+ #引数で設定した条件(Proc,メソッドインスタンス,ブロック)を評価した結果、trueのときはポーズを行い、
804
+ #condの値がnilで、ブロックが渡されていないときは何もしない
805
+ #falseのときは改行してプロットの処理を継続する
806
+ #_cond_:: 条件を示すオブジェクト(返却値はtrue/false)。デフォルトはnil(渡されたブロックを評価する)
807
+ #返却値:: 自分自身を返す
808
+ def wait_by_cond(cond = nil)
809
+ return yield ? pause_and_clear : cr if block_given?
810
+ return cond.call ? pause_and_clear : cr if cond
811
+ return self
812
+ end
813
+
814
+ #===テキストボックスに文字を表示する方法を指定する
815
+ #引数に、:charを渡すと1文字ごと、:stringを渡すと文字列ごとに表示される。それ以外を指定したときは例外が発生
816
+ #ブロックを渡せば、ブロックの評価中のみ設定が有効になる。
817
+ #ブロック評価終了後、呼び出し前の設定に戻る
818
+ #_mode_:: テキストの表示方法。:charのときは文字ごと、:stringのときは文字列ごとに表示される。それ以外を指定したときは例外が発生
819
+ #返却値:: 自分自身を返す
820
+ def text_method(mode)
821
+ raise MiyakoValueError, "undefined text_mode! #{mode}" unless [:char,:string].include?(mode)
822
+ backup = @text_method_name
823
+ @text_method_name = mode
824
+ if block_given?
825
+ yield
826
+ @text_method_name = backup
827
+ end
828
+ return self
829
+ end
830
+
831
+ #===テキストボックスに文字を表示する
832
+ #[[Yukiスクリプトとして利用可能]]
833
+ #テキストボックスとして用意している画像に文字を描画する。
834
+ #描画する単位(文字単位、文字列単位)によって、挙動が違う。
835
+ #(文字単位の時)
836
+ #Yuki#text_by_charメソッドと同じ挙動。
837
+ #(文字列単位の時)
838
+ #Yuki#text_by_strメソッドと同じ挙動。
839
+ #デフォルトは文字単位。
840
+ #引数txtの値は、内部で1文字ずつ分割され、1文字描画されるごとに、
841
+ #update_textメソッドが呼び出され、続けてYuki#start_plotもしくはYuki#updateメソッド呼び出し直後に戻る
842
+ #_txt_:: 表示させるテキスト
843
+ #返却値:: 自分自身を返す
844
+ def text(txt)
845
+ return self if txt.eql?(self)
846
+ return self if txt.empty?
847
+ return @text_methods[@text_method_name].call(txt)
848
+ end
849
+
850
+ #===テキストボックスに文字を1文字ずつ表示する
851
+ #[[Yukiスクリプトとして利用可能]]
852
+ #引数txtの値は、内部で1文字ずつ分割され、1文字描画されるごとに、
853
+ #update_textメソッドが呼び出され、続けてYuki#start_plotもしくはYuki#updateメソッド呼び出し直後に戻る
854
+ #注意として、改行が文字列中にあれば改行、タブやフィードが文字列中にあれば、nilを返す。
855
+ #_txt_:: 表示させるテキスト
856
+ #返却値:: 自分自身を返す
857
+ def text_by_char(txt)
858
+ return self if txt.eql?(self)
859
+ txt.chars{|ch|
860
+ pre_process
861
+ if /[\n\r]/.match(ch)
862
+ next wait_by_cond(@is_outer_height)
863
+ elsif @text_box.locate.x + @text_box.font.text_size(ch)[0] >= @text_box.textarea.w
864
+ wait_by_cond(@is_outer_height)
865
+ elsif /[\t\f]/.match(ch)
866
+ next nil
867
+ end
868
+ @text_box.draw_text(ch)
869
+ text_inner(self, ch)
870
+ post_process
871
+ }
872
+ return self
873
+ end
874
+
875
+ #===テキストボックスに文字を表示する
876
+ #[[Yukiスクリプトとして利用可能]]
877
+ #文字列が描画されるごとに、update_textメソッドが呼び出され、
878
+ #続けてYuki#start_plotもしくはYuki#updateメソッド呼び出し直後に戻る
879
+ #注意として、改行が文字列中にあれば改行、タブやフィードが文字列中にあれば、nilを返す。
880
+ #_txt_:: 表示させるテキスト
881
+ #返却値:: 自分自身を返す
882
+ def text_by_str(txt)
883
+ return self if txt.eql?(self)
884
+ use_cr = false
885
+ until txt.empty? do
886
+ pre_process
887
+ if /[\n\r]/.match(txt)
888
+ tmp = Regexp.last_match.pre_match
889
+ txt = Regexp.last_match.post_match
890
+ use_cr = true
891
+ elsif @text_box.locate.x + @text_box.font.text_size(txt)[0] >= @text_box.textarea.w
892
+ w = (@text_box.textarea.w - @text_box.locate.x) / @text_box.font.size
893
+ tmp = txt.slice!(0,w)
894
+ use_cr = true
895
+ elsif /[\t\f]/.match(txt)
896
+ post_process
897
+ next nil
898
+ else
899
+ tmp = txt
900
+ txt = ""
901
+ end
902
+ @text_box.draw_text(tmp)
903
+ self.cr if use_cr
904
+ text_inner(self, tmp)
905
+ use_cr = false
906
+ post_process
907
+ end
908
+ return self
909
+ end
910
+
911
+ def is_outer_height #:nodoc:
912
+ return @text_box.locate.y + @text_box.max_height >= @text_box.textarea.h
913
+ end
914
+
915
+ private :is_outer_height
916
+
917
+ #===文字色を変更する
918
+ #[[Yukiスクリプトとして利用可能]]
919
+ #ブロック内で指定した文字列を、指定の色で描画する
920
+ #_color_:: 文字色
921
+ #返却値:: 自分自身を返す
922
+ def color(color, &block)
923
+ @text_box.color_during(Color.to_rgb(color)){ text block.call }
924
+ return self
925
+ end
926
+
927
+ #===ブロック評価中、行中の表示位置を変更する
928
+ #[[Yukiスクリプトとして利用可能]]
929
+ #ブロックを評価している間だけ、デフォルトの縦の表示位置を変更する
930
+ #変更できる値は、:top、:middle、:bottomの3種類。
931
+ #ブロックを渡していないときはエラーを返す
932
+ #_valign_:: 文字の縦の位置(top, middle, bottom)
933
+ #返却値:: 自分自身を返す
934
+ def valign_during(valign)
935
+ raise MiyakoProcError, "Can't find block!" unless block_given?
936
+ oalign, @valign = @valign, valign
937
+ yield
938
+ @valign = oalign
939
+ return self
940
+ end
941
+
942
+ #===文字の大きさを変更する
943
+ #[[Yukiスクリプトとして利用可能]]
944
+ #ブロック内で指定した文字列を、指定の大きさで描画する
945
+ #_size_:: 文字の大きさ(整数)
946
+ #_valign_:: 文字の縦の位置(top, middle, bottom)。デフォルトは:middle(Yuki#valign=,Yuki#valign_duringで変更可能)
947
+ #返却値:: 自分自身を返す
948
+ def size(size, valign = @valign, &block)
949
+ @text_box.font_size_during(size){
950
+ @text_box.margin_during(@text_box.margin_height(valign)){ text block.call }
951
+ }
952
+ return self
953
+ end
954
+
955
+ #===太文字を描画する
956
+ #[[Yukiスクリプトとして利用可能]]
957
+ #ブロック内で指定した文字列を太文字で表示する
958
+ #(使用すると文字の端が切れてしまう場合あり!)
959
+ #返却値:: 自分自身を返す
960
+ def bold(&block)
961
+ @text_box.font_bold{ text block.call }
962
+ return self
963
+ end
964
+
965
+ #===斜体文字を描画する
966
+ #[[Yukiスクリプトとして利用可能]]
967
+ #ブロック内で指定した文字列を斜体で表示する
968
+ #(使用すると文字の端が切れてしまう場合あり!)
969
+ #返却値:: 自分自身を返す
970
+ def italic(&block)
971
+ @text_box.font_italic{ text block.call }
972
+ return self
973
+ end
974
+
975
+ #===下線付き文字を描画する
976
+ #[[Yukiスクリプトとして利用可能]]
977
+ #ブロック内で指定した文字列を下線付きで表示する
978
+ #返却値:: 自分自身を返す
979
+ def under_line(&block)
980
+ @text_box.font_under_line{ text block.call }
981
+ return self
982
+ end
983
+
984
+ #===改行を行う
985
+ #[[Yukiスクリプトとして利用可能]]
986
+ #開業後にupdate_crテンプレートメソッドが1回呼ばれる
987
+ #_tm_:: 改行回数。デフォルトは1
988
+ #返却値:: 自分自身を返す
989
+ def cr(tm = 1)
990
+ tm.times{|n|
991
+ @text_box.cr
992
+ cr_inner(self)
993
+ }
994
+ return self
995
+ end
996
+
997
+ #===テキストボックスの内容を消去する
998
+ #[[Yukiスクリプトとして利用可能]]
999
+ #開業後にupdate_clearテンプレートメソッドが1回呼ばれる
1000
+ #返却値:: 自分自身を返す
1001
+ def clear
1002
+ @text_box.clear
1003
+ clear_inner(self)
1004
+ return self
1005
+ end
1006
+
1007
+ #===ポーズを行う
1008
+ #[[Yukiスクリプトとして利用可能]]
1009
+ #ポーズが行われると、ポーズ用のカーソルが表示される
1010
+ #所定のボタンを押すとポーズが解除され、カーソルが消える
1011
+ #解除後は、プロットの続きを処理する
1012
+ #引数無しのブロックを渡せば、ポーズ開始前に行いたい処理を施すことが出来る
1013
+ #ポーズ中、update_innerメソッドを呼び出し、続けて、処理をYuki#startもしくはYuki#update呼び出し直後に戻す
1014
+ #Yuki#updateが呼び出されてもポーズ中の場合は、再び上記の処理を繰り返す
1015
+ #(たとえば、一定時間後に自動的にポーズ解除する場合、そのタイマーを開始させるなど)
1016
+ #返却値:: 自分自身を返す
1017
+ def pause
1018
+ @pre_pause.each{|proc| proc.call}
1019
+ yield if block_given?
1020
+ @text_box.pause
1021
+ pause_release = false
1022
+ until pause_release
1023
+ pre_process
1024
+ pausing_inner(self)
1025
+ pause_release = @release_checks.inject(false){|r, c| r |= c.call }
1026
+ post_process
1027
+ end
1028
+ @post_pause.each{|proc| proc.call}
1029
+ return self
1030
+ end
1031
+
1032
+ #===ポーズをかけて、テキストボックスの内容を消去する
1033
+ #[[Yukiスクリプトとして利用可能]]
1034
+ #ポーズをかけ、ポーズを解除するときにテキストボックスの内容を消去する
1035
+ #返却値:: 自分自身を返す
1036
+ def pause_and_clear
1037
+ return pause.clear
1038
+ end
1039
+
1040
+ #===コマンドを表示する
1041
+ #[[Yukiスクリプトとして利用可能]]
1042
+ #表示対象のコマンド群をCommand構造体の配列で示す。
1043
+ #キャンセルのときの結果も指定可能(既定ではキャンセル不可状態)
1044
+ #body_selectedをnilにした場合は、bodyと同一となる
1045
+ #body_selectedを文字列を指定した場合は、文字色が赤色になることに注意
1046
+ #引数無しのブロックを渡せば、コマンド選択開始前に、決定判別・キャンセル判別に必要な前処理を施すことが出来る
1047
+ #選択中、update_innerメソッドを呼び出し、続けて、処理をYuki#startもしくはYuki#update呼び出し直後に戻す
1048
+ #Yuki#updateが呼び出されても選択中の場合は、再び上記の処理を繰り返す
1049
+ #_command_list_:: 表示するコマンド群。各要素はCommand構造体の配列
1050
+ #_cancel_to_:: キャンセルボタンを押したときの結果。デフォルトはnil(キャンセル無効)
1051
+ #_chain_block_:: コマンドの表示方法。TextBox#create_choices_chainメソッド参照
1052
+ #返却値:: 自分自身を返す
1053
+ def command(command_list, cancel_to = Canceled, &chain_block)
1054
+ raise MiyakoValueError, "Yuki Error! Commandbox is not selected!" unless @command_box
1055
+ @cancel = cancel_to
1056
+
1057
+ choices = []
1058
+ command_list.each{|cm|
1059
+ if (cm[:condition] == nil || cm[:condition].call)
1060
+ cm_array = [cm[:body], cm[:body_selected], cm[:body_disable], cm[:enable], cm[:result]]
1061
+ methods = cm.methods
1062
+ cm_array << (methods.include?(:end_select_proc) ? cm[:end_select_proc] : nil)
1063
+ choices.push(cm_array)
1064
+ end
1065
+ }
1066
+ return self if choices.length == 0
1067
+
1068
+ @pre_command.each{|proc| proc.call}
1069
+ @pre_cancel.each{|proc| proc.call}
1070
+ yield if block_given?
1071
+ @command_box.command(@command_box.create_choices_chain(choices, &chain_block))
1072
+ @result = nil
1073
+ selecting = true
1074
+ reset_selecting
1075
+ while selecting
1076
+ pre_process
1077
+ selecting_inner(self)
1078
+ @select_ok = true if @ok_checks.inject(false){|r, c| r |= c.call }
1079
+ @select_cancel = true if @cancel_checks.inject(false){|r, c| r |= c.call }
1080
+ @select_amount = @key_amount_proc.call
1081
+ @mouse_amount = @mouse_amount_proc.call
1082
+ @selecting_procs.each{|sp|
1083
+ sp.call(@select_ok, @select_cansel, @select_amount, @mouse_amount)
1084
+ }
1085
+ if @select_ok
1086
+ unless @command_box.enable_choice?
1087
+ @on_disable.each{|proc| proc.call}
1088
+ post_process
1089
+ next
1090
+ end
1091
+ @result = @command_box.result
1092
+ @command_box.finish_command
1093
+ @text_box.release
1094
+ selecting = false
1095
+ reset_selecting
1096
+ elsif @select_cancel
1097
+ @result = @cancel
1098
+ @command_box.finish_command
1099
+ @text_box.release
1100
+ selecting = false
1101
+ reset_selecting
1102
+ elsif @select_amount != [0,0]
1103
+ @command_box.move_cursor(*@select_amount)
1104
+ reset_selecting
1105
+ elsif @mouse_amount
1106
+ @command_box.attach_cursor(*@mouse_amount.to_a)
1107
+ reset_selecting
1108
+ end
1109
+ post_process
1110
+ end
1111
+ @post_cancel.each{|proc| proc.call}
1112
+ @post_command.each{|proc| proc.call}
1113
+ return self
1114
+ end
1115
+
1116
+ def reset_selecting #:nodoc:
1117
+ @select_ok = false
1118
+ @select_cancel = false
1119
+ @select_amount = [0, 0]
1120
+ end
1121
+
1122
+ #===コマンドの選択結果を返す
1123
+ #[[Yukiスクリプトとして利用可能]]
1124
+ #コマンド選択の結果を返す。
1125
+ #まだ結果が得られていない場合はnilを得る
1126
+ #プロット処理・コマンド選択が終了していないのに結果を得られるので注意!
1127
+ #返却値:: コマンドの選択結果
1128
+ def select_result
1129
+ return @result
1130
+ end
1131
+
1132
+ #===プロットの処理を待機する
1133
+ #[[Yukiスクリプトとして利用可能]]
1134
+ #指定の秒数(少数可)、プロットの処理を待機する。
1135
+ #待機中、update_innerメソッドを呼び出し、続けて、処理をYuki#startもしくはYuki#update呼び出し直後に戻す
1136
+ #Yuki#updateが呼び出されても待機中の場合は、再び上記の処理を繰り返す
1137
+ #_length_:: 待機する長さ。単位は秒。少数可。
1138
+ #返却値:: 自分自身を返す
1139
+ def wait(length)
1140
+ @waiting_timer = WaitCounter.new(length)
1141
+ @waiting_timer.start
1142
+ waiting = true
1143
+ while waiting
1144
+ pre_process
1145
+ waiting_inner(self)
1146
+ waiting = @waiting_timer.waiting?
1147
+ post_process
1148
+ end
1149
+ return self
1150
+ end
1151
+
1152
+ #===シナリオ上の括り(ページ)を実装する
1153
+ #[[Yukiスクリプトとして利用可能]]
1154
+ #シナリオ上、「このプロットの明示的な範囲」を示すために使用する(セーブ時の再現位置の指定など)
1155
+ #Yuki#select_first_pageメソッドで開始位置が指定されている場合、以下の処理を行う。
1156
+ #(1)select_first_pageメソッドで指定されたページから処理する。それまでのページは無視される
1157
+ #(2)開始ページを処理する前に、select_first_pageメソッドの内容をクリアする(nilに変更する)
1158
+ #このメソッドはブロックが必須。ブロックがないと例外が発生する。
1159
+ #_name_:: ページ名。select_first_pageメソッドは、この名前を検索する。また、now_pageメソッドの返却値でもある
1160
+ #_use_pause_::ページの処理が終了した後、必ずpauseメソッドを呼び出すかどうかのフラグ。デフォルトはtrue
1161
+ #返却値:: select_first_pageメソッドで指定されていないページのときはnil、指定されているページの場合は引数nameの値
1162
+ def page(name, use_pause = true)
1163
+ raise MiyakoProcError, "Yuki#page needs block!" unless block_given?
1164
+ return nil if (@first_page && name != @first_page)
1165
+ @first_page = nil
1166
+ @now_page = name
1167
+ yield
1168
+ pause if use_pause
1169
+ @now_page = nil
1170
+ return name
1171
+ end
1172
+
1173
+ #===シナリオ上の現在のページを返す
1174
+ #[[Yukiスクリプトとして利用可能]]
1175
+ #呼び出し当時、シナリオ上、pageメソッドでくくられていない場合は、nilを返す
1176
+ #返却値:: ページ名
1177
+ def now_page
1178
+ return @now_page
1179
+ end
1180
+
1181
+ #===プロット上の最初に実行するページを指定知る
1182
+ #[[Yukiスクリプトとして利用可能]]
1183
+ #但し、ページ名を指定しないときはnilを指定する。
1184
+ #_name_:: 最初に実行するページ名
1185
+ def select_first_page(name)
1186
+ @first_page = name
1187
+ end
1188
+
1189
+ #===インスタンスで使用しているオブジェクトを解放する
1190
+ def dispose
1191
+ @parts.clear
1192
+ @parts = nil
1193
+ @visibles.clear
1194
+ @visibles = nil
1195
+ @vars.clear
1196
+ @vars = nil
1197
+
1198
+ @is_outer_height = nil
1199
+ end
1200
+ end
1201
+ end