1414#define BEAM_DMG 8
1515#define BEAM_COL 253
1616#define BEAM_HEIGHT 16
17+ #define BEAM_DUR 100
1718
1819#ifndef NO_SOUND
1920#include "audio.h"
@@ -192,6 +193,7 @@ static void update(void)
192193 static long prev_upd ;
193194 long dt ;
194195 int i , j , x , y , dx , dy ;
196+ int32_t gx , gy ;
195197 struct level_cell * cell ;
196198
197199 dt = time_msec - prev_upd ;
@@ -213,14 +215,29 @@ static void update(void)
213215 dx += SCROLL_SPEED * dt >> 2 ;
214216 }
215217
216- if (mob_move (& player , dx , dy )) {
217- scrollto (player .x , player .y );
218- }
219-
220218 if (player .state == MOB_FIRE ) {
221- /* TODO */
219+ if (player .state_t == 0 ) {
220+ vscr_to_grid (mouse_x + xscroll , mouse_y + yscroll , & gx , & gy );
221+ gx -= 128 ;
222+ gy -= 128 ;
223+ mob_lookat (& player , gx , gy );
224+ mob_beam (& player , gx , gy , BEAM_DMG );
225+
226+ } else if (player .state_t >= BEAM_DUR ) {
227+
228+ /* fire duration ended, change state and remove beam */
229+ mob_state (& player , MOB_IDLE );
230+ mob_beamstop (& player );
231+ }
232+
233+ } else {
234+ if (mob_move (& player , dx , dy )) {
235+ scrollto (player .x , player .y );
236+ }
222237 }
223238
239+ player .state_t += dt ;
240+
224241 /* compute the list of visible cells */
225242 num_vis = 0 ;
226243 cell = lvl .cells ;
@@ -278,10 +295,9 @@ static void scrgame_display(void)
278295
279296static void draw_bitplane (int bpl )
280297{
281- int i , j , x , y , x1 , y1 , mouse_cx , mouse_cy , mouse_gx , mouse_gy , player_cx , player_cy ;
298+ int i , j , x , y , x1 , y1 , player_cx , player_cy ;
299+ int32_t mouse_gx , mouse_gy ;
282300 struct level_cell * cell ;
283- struct tileimg * tile ;
284- struct tileseq * seq ;
285301 struct beamseg * bseg ;
286302 struct mob * mob ;
287303
@@ -320,7 +336,6 @@ static void draw_bitplane(int bpl)
320336 draw_line (x + 1 , y , x1 + 1 , y1 , BEAM_COL );
321337 }
322338
323- /*tiles_blit_rle(balltile, x1, y1, bpl);*/
324339 bseg = bseg -> next ;
325340 }
326341
@@ -336,37 +351,25 @@ static void draw_bitplane(int bpl)
336351 tiles_blit_rle (seltile , cell -> x , cell -> y , bpl );
337352
338353 spr_draw (& player .spr , x - xscroll , y - yscroll , player .dir );
339-
340- if (player .beam .nseg ) {
341- grid_to_vscr (player .beam .x1 , player .beam .y1 , & x , & y );
342- tiles_blit_rle (balltile , x - xscroll , y - yscroll , bpl );
343- }
344354 }
345355 }
346356 }
347357 }
348358
349- /* mouseover highlight */
350- /*vscr_to_cell(mouse_x + xscroll, mouse_y + yscroll, &mouse_cx, &mouse_cy);
351- if(BOUNDCHK(mouse_cx, lvl.size) && BOUNDCHK(mouse_cy, lvl.size)) {
352- cell_to_vscr(mouse_cx, mouse_cy, &x, &y);
353- x -= xscroll;
354- y -= yscroll;
355- tiles_blit_rle(seltile, x, y, bpl);
356- }
357- */
359+ /*for(i=0; i<4; i++) {
360+ int yoffs = i * 8;
361+ draw_line(100 + i, 100 + yoffs, 140 + i, 180 + yoffs, 0xff);
362+ }*/
363+
358364 vscr_to_grid (mouse_x + xscroll , mouse_y + yscroll , & mouse_gx , & mouse_gy );
359365 mouse_gx -= 128 ;
360366 mouse_gy -= 128 ;
361367
362368 tiles_blit_rle (cursors [mouse_mode ], mouse_x , mouse_y , bpl );
363369
364370 gprintf (0 , 0 , fps_text );
365- /*gprintf(0, 8, "vsync: %s", vsync ? "on" : "off");*/
366371 gprintf (90 , 0 , "vis:%d" , num_vis );
367372 gprintf (160 , 0 , "cell:%d,%d %s" , player_cx , player_cy , strcellflags (player .cell -> flags ));
368- /*gprintf(0, 8, "player: %s,%s\n", fixpstr(player.x, 8), fixpstr(player.y, 8));
369- gprintf(180, 8, "mouse: %s,%s\n", fixpstr(mouse_gx, 8), fixpstr(mouse_gy, 8));*/
370373}
371374
372375static void scrgame_keyb (int key , int press )
@@ -393,34 +396,18 @@ static void scrgame_keyb(int key, int press)
393396
394397static void scrgame_mouse (int bn , int press , int x , int y )
395398{
396- int cx , cy , gx , gy ;
397-
398399 prev_mx = x ;
399400 prev_my = y ;
400401
401-
402- if (press ) {
403- if (bn == 0 ) {
404- vscr_to_cell (mouse_x + xscroll , mouse_y + yscroll , & cx , & cy );
405-
406- vscr_to_grid (mouse_x + xscroll , mouse_y + yscroll , & gx , & gy );
407- gx -= 128 ;
408- gy -= 128 ;
409- mob_lookat (& player , gx , gy );
410- mob_state (& player , MOB_FIRE );
411-
412- mob_beam (& player , gx , gy , BEAM_DMG );
413- }
414- } else {
415- if (bn == 0 ) {
416- mob_state (& player , MOB_IDLE );
417- }
402+ if (bn == 0 && press ) {
403+ mob_state (& player , MOB_FIRE );
418404 }
419405}
420406
421407static void scrgame_motion (int x , int y )
422408{
423- int dx , dy , gx , gy ;
409+ int dx , dy ;
410+ int32_t gx , gy ;
424411
425412 dx = mouse_x - prev_mx ;
426413 dy = mouse_y - prev_my ;
0 commit comments