-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy patht6worm.hsp
307 lines (254 loc) · 7.01 KB
/
t6worm.hsp
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
#include "hsp3dish.as"
#include "t6worm.as"
title "tan6 worm"
;-------------------------------------------------------------------------------
;
; 最初期設定
;
;-------------------------------------------------------------------------------
*first
; フォント画像のロード(半角)
celload "fon_cha1.png", 2
celdiv 2, g_font_png_x, g_font_png_y, 0, 0
; フォント画像のロード(全角)
celload "fon_cha2.png", 3
celdiv 3, g_font_png_y, g_font_png_y, 0, 0
int_mousex = 0
int_mousey = 0
int_max_x = g_screen_x / g_font_x
int_max_y = ( g_screen_y / g_font_y ) - 2
; フィールド配列
dim arr_field, int_max_x, int_max_y
sdim str_arr_char, 4, 4
str_arr_char(0) = " "
str_arr_char(1) = "o"
str_arr_char(2) = "@"
str_arr_char(3) = "#"
; 虫配列
dim arr_worm_x, int_max_x * int_max_y
dim arr_worm_y, int_max_x * int_max_y
; 進行方向。-1ならば停止
int_direction = -1
; 虫の長さ
int_length = 1
int_length_add = 3
arr_worm_x(0) = int_max_x / 4
arr_worm_y(0) = int_max_y / 4
; 乱数初期化
randomize
; 画面クリア設定
setcls CLSMODE_SOLID, 0
; 餌の場所
int_feed_x = rnd(int_max_x - 2) + 1
int_feed_y = rnd(int_max_y - 2) + 1
int_feed_level = rnd(9) + 1
int_score = 0
int_flame = 0 ; フレーム数取得
int_flame_first = 0 ; 再開時の誤入力を防ぐ初期入力不可時間
int_vanish = 255
*play
; 入力
int_new_direction = -1
if ( int_flame_first > 9 ) {
stick int_stk, 256
if ( int_stk & 256 ) {
j = 0 :k = 0
int_mousex = mousex
int_mousey = mousey
if ( int_mousey >= ( int_max_y + 1 ) * g_font_y ) {
int_new_direction = 4 * int_mousex / g_screen_x
}
}
getkey int_gky, 37 :if ( int_gky ) :int_new_direction = 0
getkey int_gky, 40 :if ( int_gky ) :int_new_direction = 1
getkey int_gky, 38 :if ( int_gky ) :int_new_direction = 2
getkey int_gky, 39 :if ( int_gky ) :int_new_direction = 3
getkey int_gky, 72 :if ( int_gky ) :int_new_direction = 0
getkey int_gky, 74 :if ( int_gky ) :int_new_direction = 1
getkey int_gky, 75 :if ( int_gky ) :int_new_direction = 2
getkey int_gky, 76 :if ( int_gky ) :int_new_direction = 3
} else {
; 入力受付不可時間
int_flame_first++
}
; 虫の動作
if ( int_flame = 5 ) {
; 虫の方向転換
if ( int_new_direction >= 0 ) {
if ( int_direction != ( int_new_direction ^ 3 )) {
int_direction = int_new_direction
}
}
; 虫を伸ばす・移動
if ( int_length_add = 0 ) {
for i, 0, int_length, 1
arr_worm_x(i) = arr_worm_x(i+1)
arr_worm_y(i) = arr_worm_y(i+1)
next
int_make_next = int_length - 1
gosub *make_next
} else {
int_make_next = int_length
gosub *make_next
int_length_add--
int_length++
}
}
; フィールドの初期化
gosub *init_field
; フィールドに反映
i = 0
while ( i < int_length )
if ( i = ( int_length - 1 ) ) :j = 2 :else :j = 1
; ゲームオーバー判定
if (( j = 2 ) & ( arr_field( arr_worm_x(i), arr_worm_y(i) ) & 1 ) & ( int_direction >= 0 )) {
goto *dead
}
; 餌食い判定
if (( j = 2 ) & ( arr_worm_x(i) = int_feed_x ) & ( arr_worm_y(i) = int_feed_y )) {
int_length_add += int_feed_level
int_score += int_feed_level
; 実プレイでは問題ないと思うが空き地チェック
k = 0
for m, 0, int_max_x, 1
for n, 0, int_max_y, 1
if ( arr_field( m, n ) = 0 ) {
k = 1 :_break
}
next
if ( k ) :_break
next
; 空き地があるなら餌発生
if ( k ) {
do
int_feed_x = rnd(int_max_x - 2) + 1
int_feed_y = rnd(int_max_y - 2) + 1
until ( arr_field( int_feed_x, int_feed_y ) = 0 )
int_feed_level = rnd(9) + 1
}
}
arr_field( arr_worm_x(i), arr_worm_y(i) ) = j
i++
wend
; 描画
redraw 0
gfilter 1
for i, 0, int_max_x, 1
for j, 0, int_max_y, 1
pos i * g_font_x, j * g_font_y
if (( i = int_feed_x ) & ( j = int_feed_y )) {
fprint "" + int_feed_level, 255
} else {
fprint str_arr_char( arr_field( i, j ) ), 255
}
next
next
pos 2 * g_font_x, int_max_y * g_font_y
fprint "Score : ", 255
pos ( 14 - log10(int_score) ) * g_font_x, int_max_y * g_font_y
fprint "" + int_score, 255
; ステータスバーの表示
gosub *status_bar_at_game
int_flame++ :if ( int_flame > 5 ) :int_flame = 0
redraw 1
await 16
goto *play
*dead
redraw 0
gfilter 1
; 描画
color int_vanish / 5, 0, 0
boxf 0, 0, g_screen_x, g_screen_y
for i, 0, int_max_x, 1
for j, 0, int_max_y, 1
pos i * g_font_x, j * g_font_y
if (( i = int_feed_x ) & ( j = int_feed_y )) {
fprint "" + int_feed_level, 51
} else {
if (( arr_field( i, j ) = 1 ) | ( arr_field( i, j ) = 2 )) {
fprint str_arr_char( arr_field( i, j ) ), int_vanish
} else {
fprint str_arr_char( arr_field( i, j ) ), 255
}
}
next
next
pos 2 * g_font_x, int_max_y * g_font_y
fprint "Score : ", 255
pos ( 14 - log10(int_score) ) * g_font_x, int_max_y * g_font_y
fprint "" + int_score, 255
; ステータスバーの表示
gosub *status_bar_at_game
if ( int_vanish > 0 ) :int_vanish-=5 :else :goto *menu
redraw 1
await 16
goto *dead
*menu
redraw 0
gfilter 1
stick int_stk, 0 :if ( int_stk & 256 ) {
int_mousex = mousex
int_mousey = mousey
if ( int_mousey >= ( int_max_y + 1 ) * g_font_y ) {
goto *first
}
} else {
if ( int_stk ) {
goto *first
}
}
pos 2 * g_font_x, 1 * g_font_y
fprint "Your score is " + int_score + ".", 255
pos 2 * g_font_x, 3 * g_font_y
fprint g_tan6 + "worm。 v1.2", 255
pos 2 * g_font_x, 4 * g_font_y
fprint "2012-2013(C) m-ushi", 255
; ステータスバーの表示
color 85, 85, 102
boxf 0, ( int_max_y + 1 ) * g_font_y, g_screen_x, g_screen_y
color 255, 255, 255
line 0, ( int_max_y + 1 ) * g_font_y, g_screen_x, ( int_max_y + 1 ) * g_font_y
pos ( 2 * g_screen_x / 4 ) - ( 5 * g_font_x / 2 ), ( int_max_y + 1 ) * g_font_y
fprint "Retry", 255
redraw 1
await 16
goto *menu
*init_field
dim arr_field, int_max_x, int_max_y
for i, 0, int_max_x, 1 :arr_field(i, 0) = 3 :arr_field(i, int_max_y - 1) = 3 :next
for j, 0, int_max_y, 1 :arr_field(0, j) = 3 :arr_field(int_max_x - 1, j) = 3 :next
return
*make_next
arr_worm_x(int_make_next) = arr_worm_x(int_make_next - 1)
arr_worm_y(int_make_next) = arr_worm_y(int_make_next - 1)
switch int_direction
case 0 :
arr_worm_x(int_make_next)--
swbreak
case 1 :
arr_worm_y(int_make_next)++
swbreak
case 2 :
arr_worm_y(int_make_next)--
swbreak
case 3 :
arr_worm_x(int_make_next)++
swbreak
swend
return
*status_bar_at_game
color 85, 85, 102
boxf 0, ( int_max_y + 1 ) * g_font_y, g_screen_x, g_screen_y
color 255, 255, 255
line 0, ( int_max_y + 1 ) * g_font_y, g_screen_x, ( int_max_y + 1 ) * g_font_y
for i, 1, 4, 1
line i * g_screen_x / 4, ( int_max_y + 1 ) * g_font_y, i * g_screen_x / 4, g_screen_y
next
for i, 0, 4, 1
pos (( 2 * i + 1 ) * g_screen_x / 8 ) - ( g_font_x ), ( int_max_y + 1 ) * g_font_y
if ( i = 0 ) :fprint "「", 255
if ( i = 1 ) :fprint "」", 255
if ( i = 2 ) :fprint "、", 255
if ( i = 3 ) :fprint "・", 255
next
return