Browse Source

reset splash anim when starting. more mp preparations.

Thomas B 1 month ago
parent
commit
3b81878953
3 changed files with 105 additions and 73 deletions
  1. 88
    61
      src/game.c
  2. 2
    0
      src/game.h
  3. 15
    12
      src/main.c

+ 88
- 61
src/game.c View File

@@ -55,6 +55,8 @@
55 55
 #define POWER_INC 2
56 56
 #define POWER_DEC 4
57 57
 
58
+BANKREF(game)
59
+
58 60
 enum ACCELERATION {
59 61
     ACC_X = 1,
60 62
     ACC_Y = 2,
@@ -64,7 +66,6 @@ enum ACCELERATION {
64 66
 static int16_t spd_x = 0;
65 67
 static int16_t spd_y = 0;
66 68
 static enum SPRITE_ROT rot = 0;
67
-static enum ACCELERATION prev_acc = 0xFF; // so we draw the ship on the first frame
68 69
 static enum ACCELERATION acc = 0;
69 70
 static uint16_t health = HEALTH_MAX;
70 71
 static uint16_t power = POWER_MAX;
@@ -416,9 +417,6 @@ void handle_acceleration(void) BANKED {
416 417
             }
417 418
             acc |= ACC_Y;
418 419
             break;
419
-
420
-        default:
421
-            break;
422 420
     }
423 421
 }
424 422
 
@@ -437,7 +435,6 @@ int32_t game(enum GAME_MODE mode) NONBANKED {
437 435
     spd_x = 0;
438 436
     spd_y = 0;
439 437
     rot = 0;
440
-    prev_acc = 0xFF; // so we draw the ship on the first frame
441 438
     health = HEALTH_MAX;
442 439
     power = POWER_MAX;
443 440
     score = 0;
@@ -519,114 +516,146 @@ int32_t game(enum GAME_MODE mode) NONBANKED {
519 516
         }
520 517
 
521 518
         if (key_pressed(J_B)) {
522
-            int8_t ret = -1;
519
+            int16_t shot_pos_x = 0, shot_pos_y = 0;
520
+            int16_t shot_spd_x = 0, shot_spd_y = 0;
523 521
 
524 522
             switch (rot) {
525 523
                 case ROT_0:
526
-                    ret = obj_add(SPR_SHOT,
527
-                                  0, -SHIP_OFF,
528
-                                  spd_x, spd_y - SHOT_SPEED);
524
+                    shot_pos_x = 0;
525
+                    shot_pos_y = -SHIP_OFF;
526
+                    shot_spd_x = spd_x;
527
+                    shot_spd_y = spd_y - SHOT_SPEED;
529 528
                     break;
530 529
 
531 530
                 case ROT_22_5:
532
-                    ret = obj_add(SPR_SHOT,
533
-                                  SHIP_OFF / 2 - 1, -SHIP_OFF / 2 - 4,
534
-                                  spd_x + SHOT_SPEED_D_LO, spd_y - SHOT_SPEED_D_HI);
531
+                    shot_pos_x = SHIP_OFF / 2 - 1;
532
+                    shot_pos_y = -SHIP_OFF / 2 - 4;
533
+                    shot_spd_x = spd_x + SHOT_SPEED_D_LO;
534
+                    shot_spd_y = spd_y - SHOT_SPEED_D_HI;
535 535
                     break;
536 536
 
537 537
                 case ROT_45:
538
-                    ret = obj_add(SPR_SHOT,
539
-                                  SHIP_OFF / 2 + 3, -SHIP_OFF / 2 - 2,
540
-                                  spd_x + SHOT_SPEED_DIAG, spd_y - SHOT_SPEED_DIAG);
538
+                    shot_pos_x = SHIP_OFF / 2 + 3;
539
+                    shot_pos_y = -SHIP_OFF / 2 - 2;
540
+                    shot_spd_x = spd_x + SHOT_SPEED_DIAG;
541
+                    shot_spd_y = spd_y - SHOT_SPEED_DIAG;
541 542
                     break;
542 543
 
543 544
                 case ROT_67_5:
544
-                    ret = obj_add(SPR_SHOT,
545
-                                  SHIP_OFF / 2 + 5, -SHIP_OFF / 2 + 2,
546
-                                  spd_x + SHOT_SPEED_D_HI, spd_y - SHOT_SPEED_D_LO);
545
+                    shot_pos_x = SHIP_OFF / 2 + 5;
546
+                    shot_pos_y = -SHIP_OFF / 2 + 2;
547
+                    shot_spd_x = spd_x + SHOT_SPEED_D_HI;
548
+                    shot_spd_y = spd_y - SHOT_SPEED_D_LO;
547 549
                     break;
548 550
 
549 551
                 case ROT_90:
550
-                    ret = obj_add(SPR_SHOT,
551
-                                  SHIP_OFF, 0,
552
-                                  spd_x + SHOT_SPEED, spd_y);
552
+                    shot_pos_x = SHIP_OFF;
553
+                    shot_pos_y = 0;
554
+                    shot_spd_x = spd_x + SHOT_SPEED;
555
+                    shot_spd_y = spd_y;
553 556
                     break;
554 557
 
555 558
                 case ROT_112_5:
556
-                    ret = obj_add(SPR_SHOT,
557
-                                  SHIP_OFF / 2 + 5, SHIP_OFF / 2 + 0,
558
-                                  spd_x + SHOT_SPEED_D_HI, spd_y + SHOT_SPEED_D_LO);
559
+                    shot_pos_x = SHIP_OFF / 2 + 5;
560
+                    shot_pos_y = SHIP_OFF / 2 + 0;
561
+                    shot_spd_x = spd_x + SHOT_SPEED_D_HI;
562
+                    shot_spd_y = spd_y + SHOT_SPEED_D_LO;
559 563
                     break;
560 564
 
561 565
                 case ROT_135:
562
-                    ret = obj_add(SPR_SHOT,
563
-                                  SHIP_OFF / 2 + 3, SHIP_OFF / 2 + 2,
564
-                                  spd_x + SHOT_SPEED_DIAG, spd_y + SHOT_SPEED_DIAG);
566
+                    shot_pos_x = SHIP_OFF / 2 + 3;
567
+                    shot_pos_y = SHIP_OFF / 2 + 2;
568
+                    shot_spd_x = spd_x + SHOT_SPEED_DIAG;
569
+                    shot_spd_y = spd_y + SHOT_SPEED_DIAG;
565 570
                     break;
566 571
 
567 572
                 case ROT_157_5:
568
-                    ret = obj_add(SPR_SHOT,
569
-                                  SHIP_OFF / 2 + 1, SHIP_OFF / 2 + 4,
570
-                                  spd_x + SHOT_SPEED_D_LO, spd_y + SHOT_SPEED_D_HI);
573
+                    shot_pos_x = SHIP_OFF / 2 + 1;
574
+                    shot_pos_y = SHIP_OFF / 2 + 4;
575
+                    shot_spd_x = spd_x + SHOT_SPEED_D_LO;
576
+                    shot_spd_y = spd_y + SHOT_SPEED_D_HI;
571 577
                     break;
572 578
 
573 579
                 case ROT_180:
574
-                    ret = obj_add(SPR_SHOT,
575
-                                  0, SHIP_OFF,
576
-                                  spd_x, spd_y + SHOT_SPEED);
580
+                    shot_pos_x = 0;
581
+                    shot_pos_y = SHIP_OFF;
582
+                    shot_spd_x = spd_x;
583
+                    shot_spd_y = spd_y + SHOT_SPEED;
577 584
                     break;
578 585
 
579 586
                 case ROT_202_5:
580
-                    ret = obj_add(SPR_SHOT,
581
-                                  -SHIP_OFF / 2 + 2, SHIP_OFF / 2 + 3,
582
-                                  spd_x - SHOT_SPEED_D_LO, spd_y + SHOT_SPEED_D_HI);
587
+                    shot_pos_x = -SHIP_OFF / 2 + 2;
588
+                    shot_pos_y = SHIP_OFF / 2 + 3;
589
+                    shot_spd_x = spd_x - SHOT_SPEED_D_LO;
590
+                    shot_spd_y = spd_y + SHOT_SPEED_D_HI;
583 591
                     break;
584 592
 
585 593
                 case ROT_225:
586
-                    ret = obj_add(SPR_SHOT,
587
-                                  -SHIP_OFF / 2 - 3, SHIP_OFF / 2 + 2,
588
-                                  spd_x - SHOT_SPEED_DIAG, spd_y + SHOT_SPEED_DIAG);
594
+                    shot_pos_x = -SHIP_OFF / 2 - 3;
595
+                    shot_pos_y = SHIP_OFF / 2 + 2;
596
+                    shot_spd_x = spd_x - SHOT_SPEED_DIAG;
597
+                    shot_spd_y = spd_y + SHOT_SPEED_DIAG;
589 598
                     break;
590 599
 
591 600
                 case ROT_247_5:
592
-                    ret = obj_add(SPR_SHOT,
593
-                                  -SHIP_OFF / 2 - 5, SHIP_OFF / 2 - 1,
594
-                                  spd_x - SHOT_SPEED_D_HI, spd_y + SHOT_SPEED_D_LO);
601
+                    shot_pos_x = -SHIP_OFF / 2 - 5;
602
+                    shot_pos_y = SHIP_OFF / 2 - 1;
603
+                    shot_spd_x = spd_x - SHOT_SPEED_D_HI;
604
+                    shot_spd_y = spd_y + SHOT_SPEED_D_LO;
595 605
                     break;
596 606
 
597 607
                 case ROT_270:
598
-                    ret = obj_add(SPR_SHOT,
599
-                                  -SHIP_OFF, 0,
600
-                                  spd_x - SHOT_SPEED, spd_y);
608
+                    shot_pos_x = -SHIP_OFF;
609
+                    shot_pos_y = 0;
610
+                    shot_spd_x = spd_x - SHOT_SPEED;
611
+                    shot_spd_y = spd_y;
601 612
                     break;
602 613
 
603 614
                 case ROT_292_5:
604
-                    ret = obj_add(SPR_SHOT,
605
-                                  -SHIP_OFF / 2 - 2, -SHIP_OFF / 2 + 2,
606
-                                  spd_x - SHOT_SPEED_D_HI, spd_y - SHOT_SPEED_D_LO);
615
+                    shot_pos_x = -SHIP_OFF / 2 - 2;
616
+                    shot_pos_y = -SHIP_OFF / 2 + 2;
617
+                    shot_spd_x = spd_x - SHOT_SPEED_D_HI;
618
+                    shot_spd_y = spd_y - SHOT_SPEED_D_LO;
607 619
                     break;
608 620
 
609 621
                 case ROT_315:
610
-                    ret = obj_add(SPR_SHOT,
611
-                                  -SHIP_OFF / 2 - 3, -SHIP_OFF / 2 - 2,
612
-                                  spd_x - SHOT_SPEED_DIAG, spd_y - SHOT_SPEED_DIAG);
622
+                    shot_pos_x = -SHIP_OFF / 2 - 3;
623
+                    shot_pos_y = -SHIP_OFF / 2 - 2;
624
+                    shot_spd_x = spd_x - SHOT_SPEED_DIAG;
625
+                    shot_spd_y = spd_y - SHOT_SPEED_DIAG;
613 626
                     break;
614 627
 
615 628
                 case ROT_337_5:
616
-                    ret = obj_add(SPR_SHOT,
617
-                                  -SHIP_OFF / 2 + 1, -SHIP_OFF / 2 - 4,
618
-                                  spd_x - SHOT_SPEED_D_LO, spd_y - SHOT_SPEED_D_HI);
619
-                    break;
620
-
621
-                default:
629
+                    shot_pos_x = -SHIP_OFF / 2 + 1;
630
+                    shot_pos_y = -SHIP_OFF / 2 - 4;
631
+                    shot_spd_x = spd_x - SHOT_SPEED_D_LO;
632
+                    shot_spd_y = spd_y - SHOT_SPEED_D_HI;
622 633
                     break;
623 634
             }
624 635
 
636
+            int8_t ret = obj_add(SPR_SHOT,
637
+                                 shot_pos_x, shot_pos_y,
638
+                                 shot_spd_x, shot_spd_y);
639
+
625 640
             if (ret == OBJ_ADDED) {
626 641
                 sample_play(SFX_SHOT);
627 642
 
628
-                if (score > 0) {
629
-                    score--;
643
+                if (mode == GM_SINGLE) {
644
+                    if (score > 0) {
645
+                        score--;
646
+                    }
647
+                } else {
648
+                    static struct mp_shot_state state;
649
+
650
+                    // TODO send absolute coordinate
651
+                    state.pos_x = shot_pos_x;
652
+                    state.pos_y = shot_pos_y;
653
+
654
+                    // TODO scale?
655
+                    state.spd_x = shot_spd_x;
656
+                    state.spd_y = shot_spd_y;
657
+
658
+                    mp_add_shot(&state);
630 659
                 }
631 660
             }
632 661
         }
@@ -679,8 +708,6 @@ int32_t game(enum GAME_MODE mode) NONBANKED {
679 708
 
680 709
         hide_sprites_range(hiwater, MAX_HARDWARE_SPRITES);
681 710
 
682
-        prev_acc = acc;
683
-
684 711
         if (score != prev_score) {
685 712
             uint8_t x_off = win_game_draw(score);
686 713
             move_win(MINWNDPOSX + DEVICE_SCREEN_PX_WIDTH - x_off, MINWNDPOSY + DEVICE_SCREEN_PX_HEIGHT - 16);

+ 2
- 0
src/game.h View File

@@ -44,4 +44,6 @@ void game_set_mp_shot(struct mp_shot_state *state);
44 44
 
45 45
 int32_t game(enum GAME_MODE mode);
46 46
 
47
+BANKREF_EXTERN(game)
48
+
47 49
 #endif // __GAME_H__

+ 15
- 12
src/main.c View File

@@ -45,6 +45,9 @@
45 45
 uint8_t debug_menu_index = 0;
46 46
 uint8_t debug_special_value = 0;
47 47
 
48
+static uint8_t anim_frame = 0;
49
+static uint8_t anim_state = 0;
50
+
48 51
 BANKREF(main)
49 52
 
50 53
 const struct conf_entry conf_entries[CONF_ENTRY_COUNT] = {
@@ -223,13 +226,10 @@ static void splash_win(void) NONBANKED {
223 226
 }
224 227
 
225 228
 static void splash_anim(uint8_t *hiwater) NONBANKED {
226
-    static uint8_t frame = 0;
227
-    static uint8_t state = 0;
228
-
229
-    if (++frame >= 60) {
230
-        frame = 0;
231
-        if (++state >= 12) {
232
-            state = 0;
229
+    if (++anim_frame >= 60) {
230
+        anim_frame = 0;
231
+        if (++anim_state >= 12) {
232
+            anim_state = 0;
233 233
         }
234 234
     }
235 235
 
@@ -253,9 +253,9 @@ static void splash_anim(uint8_t *hiwater) NONBANKED {
253 253
      * 11: top-right
254 254
      */
255 255
 
256
-    switch (state) {
256
+    switch (anim_state) {
257 257
         case 1:
258
-            if (frame == 0) {
258
+            if (anim_frame == 0) {
259 259
                 obj_add(SPR_SHOT, SHIP_OFF, -42, SHOT_SPEED, 0);
260 260
                 sample_play(SFX_SHOT);
261 261
             }
@@ -265,7 +265,7 @@ static void splash_anim(uint8_t *hiwater) NONBANKED {
265 265
             break;
266 266
 
267 267
         case 3:
268
-            if (frame == 30) {
268
+            if (anim_frame == 30) {
269 269
                 obj_add(SPR_LIGHT, 42, -42, 0, 0);
270 270
             }
271 271
         case 11:
@@ -273,7 +273,7 @@ static void splash_anim(uint8_t *hiwater) NONBANKED {
273 273
             break;
274 274
 
275 275
         case 9:
276
-            if (frame == 30) {
276
+            if (anim_frame == 30) {
277 277
                 obj_add(SPR_DARK, -42, -42, 0, 0);
278 278
             }
279 279
         case 5:
@@ -286,7 +286,7 @@ static void splash_anim(uint8_t *hiwater) NONBANKED {
286 286
             break;
287 287
 
288 288
         case 7:
289
-            if (frame == 0) {
289
+            if (anim_frame == 0) {
290 290
                 obj_add(SPR_SHOT, -SHIP_OFF, -42, -SHOT_SPEED, 0);
291 291
                 sample_play(SFX_SHOT);
292 292
             }
@@ -309,6 +309,9 @@ static void splash(void) NONBANKED {
309 309
     SHOW_SPRITES;
310 310
     SPRITES_8x8;
311 311
 
312
+    anim_frame = 0;
313
+    anim_state = 0;
314
+
312 315
     obj_init();
313 316
     obj_add(SPR_LIGHT, 42, -42, 0, 0);
314 317
     obj_add(SPR_DARK, -42, -42, 0, 0);

Loading…
Cancel
Save