ruby-miyako 2.1.0 → 2.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README +275 -20
- data/extern.h +21 -1
- data/install_miyako.rb +5 -3
- data/lib/Miyako/API/audio.rb +11 -6
- data/lib/Miyako/API/basic_data.rb +0 -985
- data/lib/Miyako/API/bitmap.rb +19 -22
- data/lib/Miyako/API/choices.rb +203 -69
- data/lib/Miyako/API/collision.rb +451 -9
- data/lib/Miyako/API/color.rb +177 -0
- data/lib/Miyako/API/diagram.rb +18 -20
- data/lib/Miyako/API/fixedmap.rb +207 -73
- data/lib/Miyako/API/font.rb +111 -18
- data/lib/Miyako/API/i_yuki.rb +1201 -0
- data/lib/Miyako/API/input.rb +65 -0
- data/lib/Miyako/API/layout.rb +41 -29
- data/lib/Miyako/API/map.rb +202 -157
- data/lib/Miyako/API/map_event.rb +86 -19
- data/lib/Miyako/API/map_struct.rb +268 -0
- data/lib/Miyako/API/modules.rb +136 -37
- data/lib/Miyako/API/movie.rb +8 -8
- data/lib/Miyako/API/parts.rb +63 -20
- data/lib/Miyako/API/plane.rb +4 -4
- data/lib/Miyako/API/screen.rb +16 -8
- data/lib/Miyako/API/sprite.rb +290 -23
- data/lib/Miyako/API/sprite_animation.rb +23 -11
- data/lib/Miyako/API/sprite_list.rb +406 -183
- data/lib/Miyako/API/story.rb +4 -65
- data/lib/Miyako/API/struct_point.rb +157 -0
- data/lib/Miyako/API/struct_rect.rb +233 -0
- data/lib/Miyako/API/struct_segment.rb +641 -0
- data/lib/Miyako/API/struct_size.rb +158 -0
- data/lib/Miyako/API/struct_square.rb +253 -0
- data/lib/Miyako/API/textbox.rb +49 -35
- data/lib/Miyako/API/viewport.rb +5 -5
- data/lib/Miyako/API/wait_counter.rb +350 -0
- data/lib/Miyako/API/yuki.rb +95 -60
- data/lib/Miyako/EXT/raster_scroll.rb +30 -8
- data/lib/Miyako/EXT/slides.rb +6 -6
- data/lib/Miyako/miyako.rb +25 -11
- data/lib/miyako.rb +28 -0
- data/lib/miyako_require_only.rb +35 -0
- data/miyako_basicdata.c +201 -17
- data/miyako_collision.c +315 -6
- data/miyako_diagram.c +331 -0
- data/miyako_drawing.c +26 -7
- data/miyako_font.c +259 -129
- data/miyako_input_audio.c +24 -14
- data/miyako_layout.c +106 -8
- data/miyako_no_katana.c +398 -171
- data/miyako_sprite2.c +275 -38
- data/miyako_transform.c +113 -107
- data/miyako_utility.c +34 -48
- data/miyako_yuki.c +241 -0
- data/sample/Diagram_sample/diagram_sample_yuki2.rb +30 -30
- data/sample/Room3/blue.rb +19 -19
- data/sample/Room3/green.rb +9 -9
- data/sample/Room3/main.rb +12 -12
- data/sample/Room3/red.rb +12 -12
- data/sample/Room3/title.rb +15 -10
- data/sample/collision_test2.rb +2 -1
- data/sample/fixed_map_test/fixed_map_sample.rb +7 -6
- data/sample/map_test/main_scene.rb +12 -10
- data/sample/map_test/map_manager.rb +14 -13
- data/sample/rasterscroll.rb +5 -5
- data/sample/takahashi.rb +3 -3
- data/sample/textbox_sample.rb +7 -6
- data/sample/transform.rb +2 -1
- data/uninstall_miyako.rb +4 -1
- data/win/miyako_no_katana.so +0 -0
- metadata +15 -4
- data/lib/Miyako/EXT/miyako_cairo.rb +0 -62
- 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
|