1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
|
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| #uselib "comctl32.dll"
#func global CreateStatusWindow "CreateStatusWindow" int , int , int , int
#uselib "user32.dll"
#func global SetTimer "SetTimer" int, int, int, int
#func global KillTimer "KillTimer" int, int
#func global SendMessage "SendMessageA" int, int, int, int
#func global CreateMenu "CreateMenu"
#func global AppendMenu "AppendMenuA" int, int, int, int
#func global SetMenu "SetMenu" int, int
#func global DrawMenuBar "DrawMenuBar" int
#module
#defcfunc CarretPosX int p1
return ( 20 + ( p1 * 8 ) )
#defcfunc CarretPosY int p1
return ( 20 + ( p1 * 18 ) )
#deffunc DrawRuler
redraw 2
color
boxf
color 128, 128, 128
line 0, 18, 640, 18
line 15, 0, 15, 480
pos 0 ,20
repeat 26
pos 0,
mes strf("%2d", cnt+1 )
loop
pos 5, 0
repeat 77
if ((cnt+1)\10) = 0 :color 96 :else :color 128 , 128, 128
pos GINFO_CX+GINFO_MESX, 0
mes strf("%1d", (cnt+1)\10 )
loop
redraw 1
return
#deffunc DrawScreen
redraw 2
color
boxf 16,20, 640, 480
color 64, 32, 32
repeat 32, 1
line 15, 19+cnt*18,640, 19+cnt*18
loop
repeat 78,1
line 12+cnt*8, 18, 12+cnt*8, 480
loop
color 255, 255, 255
s = ""
num_cmd = 0 repeat numline@+1
cnt_ = cnt
f = 0
repeat strlen ( text@( cnt_ ) )
ltr = peek( text@( cnt_ ), cnt )
if f != -1 {
SWITCH ( ltr )
CASE '\\'
if s != "\\" :color 160 :else { color 255, 255,255 :f = 1 }
SWBREAK
CASE '*'
if s != "\\" { color 128, 128, 255 :f = -1 } else { color 255,255,255 :f = 1 }
SWBREAK
CASE '/'
if s != "\\" { color 128, 128, 128 :f = -1 } else { color 255, 255,255 :f = 1 }
SWBREAK
CASE '['
num_cmd ++
CASE ']'
CASE '{'
CASE '}'
if s != "\\" { color 255 } else {
color 255, 255,255 :f = 1
if ltr = '[' :num_cmd --
}
SWBREAK
DEFAULT
color 255, 255, 255
SWBREAK
SWEND
}
pos CarretPosX(cnt), CarretPosY(cnt_)
poke s, 0, ltr
mes s
if f=1 :s = "" :f = 0
loop
loop
redraw 1
st = "命令数 : " + num_cmd
SendMessage hstatus@,0x0401,0,varptr(st)
return
#global
screen 0,,,2
// ウィンドウ初期化
buffer 10 // 保存用バッファ
screen 11, 640, 519, 2 // メインスクリーン
// テキストバッファ
sdim text, 96,32
// ファイル名
loadfile = "scenario_.txt"
// キャレット線の現在位置
carret_cx = 0
carret_cy = 0
numline = -1
// メニューバー
CreateMenu
hmenu = stat
s = "Open" :AppendMenu hmenu,0,40,varptr(s)
s = "Save" :AppendMenu hmenu,0,10,varptr(s)
s = "Load" :AppendMenu hmenu,0,20,varptr(s)
s = "Exit" :AppendMenu hmenu,0,30,varptr(s)
SetMenu hwnd, hmenu
DrawMenuBar hwnd
// ステータスバー設定
String = ""
CreateStatusWindow 0x50000803,varptr(String),hwnd,0
hstatus = stat
a1 = ""
SendMessage stshwnd,0x0404,1,varptr(a1)
gosub *lbl__set
stop
*lbl__set
// 画面を描く
DrawRuler
DrawScreen
numline ++
// 現在の設定をコピー
buffer 10
gcopy 11, 0, 0, 640, 480
gsel 11, 1
// タイマーON
SetTimer hwnd, 1, 500, 0
onexit goto *lbl__exit
oncmd gosub *lbl__0x0100, 0x0100 // WM_KEYDOWN
oncmd gosub *lbl__0x0102, 0x0102 // WM_CAHR
oncmd gosub *lbl__0x0111, 0x0111 // WM_COMMAND
oncmd gosub *lbl__0x0113, 0x0113 // WM_TIMER
return
//WM_KEYDOWN
*lbl__0x0100
x = carret_cx
y = carret_cy
// キャレットを消す
carret = 0
gosub *lbl__0x0113
SWITCH ( wparam )
// ↑
CASE 0x26
if carret_cy > 0 :carret_cy --
SWBREAK
// ↓
CASE 0x28
if carret_cy < 25 :carret_cy ++
SWBREAK
// ←
CASE 0x25
if carret_cx > 0 :carret_cx --
SWBREAK
// →
CASE 0x27
if carret_cx < 77 :carret_cx ++
SWBREAK
SWEND
// x軸に対し、有効字数を超えた
if strlen(text(carret_cy)) < carret_cx :carret_cx = strlen(text(carret_cy))
// y軸に対し、有効行数を越えた
if numline < carret_cy { carret_cy = numline :carret_cx = strlen( text( carret_cy ) ) }
// 変更が無かった場合、キャレットを書く。
if ( x != carret_cx ) | ( y != carret_cy ) {
carret = 1
gosub *lbl__0x0113
}
return
// WM_CHAR
*lbl__0x0102
SWITCH ( wparam )
// Enter
CASE 0x0D
carret_cx = 0
carret_cy ++
numline ++
SWBREAK
// BackSpace
CASE 0x08
// 現在の文をコピー
s = text(carret_cy)
// キャレットが左端にいたら・・・
if carret_cx == 0 {
if carret_cy == 0 :SWBREAK
carret_cy --
carret_cx = strlen( text( carret_cy ) )
numline --
SWBREAK
}
// 文字を消す
text(carret_cy) = strmid( s, 0, carret_cx-1 ) + strmid( s, carret_cx, strlen(s) )
DrawScreen
carret_cx --
pos carret_cx, carret_cy
SWBREAK
DEFAULT
// それ以外はそのまま表示&記憶
x = ""
wpoke x, 0, ( wparam & 0xFF )
text(carret_cy) = strmid( text(carret_cy), 0, carret_cx ) +x+ strmid( text(carret_cy), carret_cx, strlen(text(carret_cy)) )
DrawScreen
carret_cx ++
SWBREAK
SWEND
color 255,255,255
// 現在の画面をコピー
buffer 10
gcopy 11, 0, 0, 640, 480
gsel 11
return
// タイマー用(キャレット線描画)
*lbl__0x0113
if carret = 1 {
// キャレットを描く(描く前に保存画面にコピー)
buffer 10
gcopy 11, 0, 0, 640, 480
gsel 11
pos CarretPosX( carret_cx )-3, CarretPosY( carret_cy )
color 255, 128
mes "|"
color 255, 255, 255
} else {
// キャレットを消す(保存画面を貼り付ける)
pos 0, 0
gcopy 10, 0, 0, 640 ,480
}
// フラグ反転
carret ^= 1
pos CarretPosX( carret_cx ), CarretPosY( carret_cy )
return
*lbl__exit
// 非表示にする
screen wparam,,,2
// エディター本体なら終了
if wparam = 11 { KillTimer hwnd, 1 :end }
// それ以外はエディターに戻す
gsel 11
gosub *lbl__set
stop
// WM_COMMAND
*lbl__0x0111
num = wparam
if num == 30 { KillTimer hwnd, 1 :end }
if num == 40 {
// ファイル選択
dialog "txt",16
// 選択されなかった
if stat = 0 :return
// ファイル名を記憶
loadfile = refstr
// ロード用バッファ確保&文字列初期化
sdim txtSaveA, 32000
sdim text, 96,32
// 読み込み
bload loadfile, txtSaveA
// ファイル名を検出
i = 0
repeat
j = instr( loadfile, i, "\\" )
if j == -1 :break
i += j+1
loop
loadfile = strmid( loadfile, i, strlen( loadfile ) )
// 読み込んだバッファを表示用文字列に振り分ける
n = 0
repeat
getstr text(cnt) ,txtSaveA, n
n += strsize
if n >= strlen( txtSaveA ) :break
loop
DrawScreen
carret = 1
return
}
// エディターの内容を保存する
// バッファ確保
s = ""
sdim txtSaveA, 32000 // エディタ用
sdim txtSaveB, 32000 // エンジン用
// 内容を移す
repeat numline+1
txtSaveA += text( cnt ) + "\n"
loop
// エディタ用からエンジン用へ変換(まだ何もしてない)
i = 0
repeat strlen( txtSaveA )
t = peek( txtSaveA, cnt )
if t = NONE :continue
poke txtSaveB, i, t
i ++
loop
// 保存
bsave "_"+loadfile, txtSaveA, strlen( txtSaveA )
bsave loadfile, txtSaveB, strlen( txtSaveB )
if num == 10 :dialog "file saved..."
if num != 20 :return
// タイマーの破棄
KillTimer hwnd, 1
#define global SCENARIO_FILE loadfile
#include "main.hsp"
stop
|