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
 #define POWER_INC 2
55
 #define POWER_INC 2
56
 #define POWER_DEC 4
56
 #define POWER_DEC 4
57
 
57
 
58
+BANKREF(game)
59
+
58
 enum ACCELERATION {
60
 enum ACCELERATION {
59
     ACC_X = 1,
61
     ACC_X = 1,
60
     ACC_Y = 2,
62
     ACC_Y = 2,
64
 static int16_t spd_x = 0;
66
 static int16_t spd_x = 0;
65
 static int16_t spd_y = 0;
67
 static int16_t spd_y = 0;
66
 static enum SPRITE_ROT rot = 0;
68
 static enum SPRITE_ROT rot = 0;
67
-static enum ACCELERATION prev_acc = 0xFF; // so we draw the ship on the first frame
68
 static enum ACCELERATION acc = 0;
69
 static enum ACCELERATION acc = 0;
69
 static uint16_t health = HEALTH_MAX;
70
 static uint16_t health = HEALTH_MAX;
70
 static uint16_t power = POWER_MAX;
71
 static uint16_t power = POWER_MAX;
416
             }
417
             }
417
             acc |= ACC_Y;
418
             acc |= ACC_Y;
418
             break;
419
             break;
419
-
420
-        default:
421
-            break;
422
     }
420
     }
423
 }
421
 }
424
 
422
 
437
     spd_x = 0;
435
     spd_x = 0;
438
     spd_y = 0;
436
     spd_y = 0;
439
     rot = 0;
437
     rot = 0;
440
-    prev_acc = 0xFF; // so we draw the ship on the first frame
441
     health = HEALTH_MAX;
438
     health = HEALTH_MAX;
442
     power = POWER_MAX;
439
     power = POWER_MAX;
443
     score = 0;
440
     score = 0;
519
         }
516
         }
520
 
517
 
521
         if (key_pressed(J_B)) {
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
             switch (rot) {
522
             switch (rot) {
525
                 case ROT_0:
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
                     break;
528
                     break;
530
 
529
 
531
                 case ROT_22_5:
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
                     break;
535
                     break;
536
 
536
 
537
                 case ROT_45:
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
                     break;
542
                     break;
542
 
543
 
543
                 case ROT_67_5:
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
                     break;
549
                     break;
548
 
550
 
549
                 case ROT_90:
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
                     break;
556
                     break;
554
 
557
 
555
                 case ROT_112_5:
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
                     break;
563
                     break;
560
 
564
 
561
                 case ROT_135:
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
                     break;
570
                     break;
566
 
571
 
567
                 case ROT_157_5:
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
                     break;
577
                     break;
572
 
578
 
573
                 case ROT_180:
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
                     break;
584
                     break;
578
 
585
 
579
                 case ROT_202_5:
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
                     break;
591
                     break;
584
 
592
 
585
                 case ROT_225:
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
                     break;
598
                     break;
590
 
599
 
591
                 case ROT_247_5:
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
                     break;
605
                     break;
596
 
606
 
597
                 case ROT_270:
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
                     break;
612
                     break;
602
 
613
 
603
                 case ROT_292_5:
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
                     break;
619
                     break;
608
 
620
 
609
                 case ROT_315:
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
                     break;
626
                     break;
614
 
627
 
615
                 case ROT_337_5:
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
                     break;
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
             if (ret == OBJ_ADDED) {
640
             if (ret == OBJ_ADDED) {
626
                 sample_play(SFX_SHOT);
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
 
708
 
680
         hide_sprites_range(hiwater, MAX_HARDWARE_SPRITES);
709
         hide_sprites_range(hiwater, MAX_HARDWARE_SPRITES);
681
 
710
 
682
-        prev_acc = acc;
683
-
684
         if (score != prev_score) {
711
         if (score != prev_score) {
685
             uint8_t x_off = win_game_draw(score);
712
             uint8_t x_off = win_game_draw(score);
686
             move_win(MINWNDPOSX + DEVICE_SCREEN_PX_WIDTH - x_off, MINWNDPOSY + DEVICE_SCREEN_PX_HEIGHT - 16);
713
             move_win(MINWNDPOSX + DEVICE_SCREEN_PX_WIDTH - x_off, MINWNDPOSY + DEVICE_SCREEN_PX_HEIGHT - 16);

+ 2
- 0
src/game.h View File

44
 
44
 
45
 int32_t game(enum GAME_MODE mode);
45
 int32_t game(enum GAME_MODE mode);
46
 
46
 
47
+BANKREF_EXTERN(game)
48
+
47
 #endif // __GAME_H__
49
 #endif // __GAME_H__

+ 15
- 12
src/main.c View File

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

Loading…
Cancel
Save