Browse Source

multiplayer packet structs

Thomas B 1 month ago
parent
commit
07e89b2881
5 changed files with 117 additions and 17 deletions
  1. 4
    1
      src/game.c
  2. 9
    2
      src/gbprinter.c
  3. 2
    0
      src/maps.c
  4. 85
    13
      src/multiplayer.c
  5. 17
    1
      src/multiplayer.h

+ 4
- 1
src/game.c View File

@@ -180,7 +180,10 @@ int32_t game(enum GAME_MODE mode) NONBANKED {
180 180
         key_read();
181 181
 
182 182
         if (mode != GM_SINGLE) {
183
-            mp_handle();
183
+            if (mp_handle()) {
184
+                // TODO
185
+                //mp_new_state();
186
+            }
184 187
         }
185 188
 
186 189
         enum ACCELERATION acc = 0;

+ 9
- 2
src/gbprinter.c View File

@@ -365,6 +365,8 @@ uint8_t gbprinter_screenshot(uint8_t win) BANKED {
365 365
     static uint8_t map_buff[2 * DEVICE_SCREEN_WIDTH];
366 366
     static uint8_t tile_buff[2 * DEVICE_SCREEN_WIDTH * 16];
367 367
 
368
+    uint8_t r = PRN_STATUS_OK;
369
+
368 370
     for (int y = 0; y < DEVICE_SCREEN_HEIGHT; y += 2) {
369 371
         for (int y2 = 0; y2 < 2; y2++) {
370 372
             for (int x = 0; x < DEVICE_SCREEN_WIDTH; x++) {
@@ -379,7 +381,12 @@ uint8_t gbprinter_screenshot(uint8_t win) BANKED {
379 381
                 : fill_bkg_rect(0, y + y2, DEVICE_SCREEN_WIDTH, 1, 0);
380 382
         }
381 383
 
382
-        gbprinter_print_image(map_buff, tile_buff, 0, DEVICE_SCREEN_WIDTH, 2,
383
-                              (y == (DEVICE_SCREEN_HEIGHT - 2)) ? 1 : 0);
384
+        r = gbprinter_print_image(map_buff, tile_buff, 0, DEVICE_SCREEN_WIDTH, 2,
385
+                                  (y == (DEVICE_SCREEN_HEIGHT - 2)) ? 1 : 0);
386
+        if (r != PRN_STATUS_OK) {
387
+            break;
388
+        }
384 389
     }
390
+
391
+    return r;
385 392
 }

+ 2
- 0
src/maps.c View File

@@ -163,6 +163,7 @@ static inline void set(uint8_t dst_x, uint8_t dst_y,
163 163
 }
164 164
 
165 165
 void map_dbg_reset(void) NONBANKED {
166
+#ifndef WRAP_BG
166 167
     uint16_t camera_x = abs_x >> POS_SCALE_BG;
167 168
     uint16_t camera_y = abs_y >> POS_SCALE_BG;
168 169
     uint8_t map_pos_x = camera_x >> 3;
@@ -179,6 +180,7 @@ void map_dbg_reset(void) NONBANKED {
179 180
                 attr);
180 181
         }
181 182
     }
183
+#endif // ! WRAP_BG
182 184
 }
183 185
 
184 186
 void map_move(int16_t delta_x, int16_t delta_y) NONBANKED {

+ 85
- 13
src/multiplayer.c View File

@@ -26,6 +26,24 @@
26 26
 
27 27
 #define RETRANSMIT_TIME 200
28 28
 
29
+#define PKT_TYPE_PLAYER 0x00
30
+#define PKT_TYPE_SHOT 0x01
31
+
32
+struct mp_header {
33
+    uint8_t type;
34
+};
35
+
36
+struct mp_packet {
37
+    struct mp_header header;
38
+    union {
39
+        struct mp_player_state player;
40
+        struct mp_shot_state shot;
41
+    } data;
42
+};
43
+
44
+#define PKT_SIZE_PLAYER (sizeof(struct mp_player_state) + sizeof(struct mp_header))
45
+#define PKT_SIZE_SHOT (sizeof(struct mp_shot_state) + sizeof(struct mp_header))
46
+
29 47
 enum mp_state {
30 48
     MP_M_SEND = 0,
31 49
     MP_M_WAIT = 1,
@@ -40,23 +58,49 @@ static enum mp_state state = 0;
40 58
 static uint16_t next_t = 0;
41 59
 static uint8_t our_turn = 0;
42 60
 
61
+static uint8_t *data = NULL;
62
+static uint8_t remaining = 0;
63
+
64
+static uint8_t rx_buff[sizeof(struct mp_packet)] = {0};
65
+static uint8_t rx_len = 0;
66
+
43 67
 uint8_t mp_connection_status = 0;
44 68
 
69
+static inline void Tx(uint8_t x) {
70
+    SB_REG = x;
71
+    SC_REG = SIOF_XFER_START | SIOF_CLOCK_INT;
72
+}
73
+
74
+static inline void Rx(uint8_t x) {
75
+    SB_REG = x;
76
+    SC_REG = SIOF_XFER_START | SIOF_CLOCK_EXT;
77
+}
78
+
79
+static inline void tx_rx(uint8_t x) {
80
+    our_turn ? Tx(x) : Rx(x);
81
+}
82
+
83
+static inline void transmit(struct mp_packet *pkt) {
84
+
85
+}
86
+
87
+static inline uint8_t transmitting(void) {
88
+    return SC_REG & SIOF_XFER_START;
89
+}
90
+
45 91
 uint8_t mp_master_ready(void) BANKED {
46 92
     switch (state) {
47 93
         case MP_M_SEND:
48
-            SB_REG = MASTER_HELLO;
49
-            SC_REG = SIOF_XFER_START | SIOF_CLOCK_INT;
94
+            Tx(MASTER_HELLO);
50 95
             next_t = timer_get() + RETRANSMIT_TIME;
51 96
             mp_connection_status++;
52 97
             state = MP_M_WAIT;
53 98
             break;
54 99
 
55 100
         case MP_M_WAIT:
56
-            if (!(SC_REG & SIOF_XFER_START)) {
101
+            if (!transmitting()) {
57 102
                 if (SB_REG == SLAVE_HELLO) {
58
-                    SB_REG = SLAVE_HELLO;
59
-                    SC_REG = SIOF_XFER_START | SIOF_CLOCK_EXT;
103
+                    Rx(SLAVE_HELLO);
60 104
                     next_t = timer_get() + RETRANSMIT_TIME;
61 105
                     mp_connection_status++;
62 106
                     state = MP_M_REPLY;
@@ -68,7 +112,7 @@ uint8_t mp_master_ready(void) BANKED {
68 112
             break;
69 113
 
70 114
         case MP_M_REPLY:
71
-            if (!(SC_REG & SIOF_XFER_START)) {
115
+            if (!transmitting()) {
72 116
                 if (SB_REG == MASTER_HELLO) {
73 117
                     return 1;
74 118
                 } else {
@@ -90,25 +134,27 @@ uint8_t mp_master_ready(void) BANKED {
90 134
 
91 135
 void mp_master_start(void) BANKED {
92 136
     our_turn = 1;
137
+    remaining = 0;
138
+    next_t = timer_get() + RETRANSMIT_TIME;
139
+
93 140
     game(GM_MULTI);
141
+
94 142
     state = 0;
95 143
 }
96 144
 
97 145
 uint8_t mp_slave_ready(void) BANKED {
98 146
     switch (state) {
99 147
         case MP_S_START:
100
-            SB_REG = SLAVE_HELLO;
101
-            SC_REG = SIOF_XFER_START | SIOF_CLOCK_EXT;
148
+            Rx(SLAVE_HELLO);
102 149
             next_t = timer_get() + RETRANSMIT_TIME;
103 150
             mp_connection_status++;
104 151
             state = MP_S_WAIT;
105 152
             break;
106 153
 
107 154
         case MP_S_WAIT:
108
-            if (!(SC_REG & SIOF_XFER_START)) {
155
+            if (!transmitting()) {
109 156
                 if (SB_REG == MASTER_HELLO) {
110
-                    SB_REG = MASTER_HELLO;
111
-                    SC_REG = SIOF_XFER_START | SIOF_CLOCK_INT;
157
+                    Tx(MASTER_HELLO);
112 158
                     next_t = timer_get() + RETRANSMIT_TIME;
113 159
                     mp_connection_status++;
114 160
                     state = MP_S_REPLY;
@@ -122,7 +168,7 @@ uint8_t mp_slave_ready(void) BANKED {
122 168
             break;
123 169
 
124 170
         case MP_S_REPLY:
125
-            if (!(SC_REG & SIOF_XFER_START)) {
171
+            if (!transmitting()) {
126 172
                 if (SB_REG == SLAVE_HELLO) {
127 173
                     return 1;
128 174
                 }
@@ -142,10 +188,36 @@ uint8_t mp_slave_ready(void) BANKED {
142 188
 
143 189
 void mp_slave_start(void) BANKED {
144 190
     our_turn = 0;
191
+    remaining = 0;
192
+    next_t = timer_get() + RETRANSMIT_TIME;
193
+
145 194
     game(GM_MULTI);
195
+
146 196
     state = 0;
147 197
 }
148 198
 
149
-void mp_handle(void) BANKED {
199
+uint8_t mp_handle(void) BANKED {
200
+    if ((our_turn) && (timer_get() >= next_t) && data && (remaining > 0)) {
201
+        if (rx_len < sizeof(struct mp_packet)) {
202
+            rx_buff[rx_len++] = SB_REG;
203
+        }
204
+        tx_rx(*(data++));
205
+        remaining--;
206
+    } else if ((!our_turn) && (!transmitting()) && data && (remaining > 0)) {
207
+        if (rx_len < sizeof(struct mp_packet)) {
208
+            rx_buff[rx_len++] = SB_REG;
209
+        }
210
+        tx_rx(*(data++));
211
+        remaining--;
212
+    }
213
+
214
+    return our_turn && (remaining == 0);
215
+}
216
+
217
+void mp_new_state(struct mp_player_state *state) BANKED {
218
+    // TODO
219
+}
150 220
 
221
+void mp_add_shot(struct mp_shot_state *state) BANKED {
222
+    // TODO
151 223
 }

+ 17
- 1
src/multiplayer.h View File

@@ -23,13 +23,29 @@
23 23
 #include <gbdk/platform.h>
24 24
 #include <stdint.h>
25 25
 
26
+#include "sprites.h"
27
+
28
+struct mp_player_state {
29
+    int8_t pos_x, pos_y;
30
+    int8_t spd_x, spd_y;
31
+    enum SPRITE_ROT rot;
32
+};
33
+
34
+struct mp_shot_state {
35
+    int8_t pos_x, pos_y;
36
+    int8_t spd_x, spd_y;
37
+};
38
+
26 39
 uint8_t mp_master_ready(void) BANKED;
27 40
 void mp_master_start(void) BANKED;
28 41
 
29 42
 uint8_t mp_slave_ready(void) BANKED;
30 43
 void mp_slave_start(void) BANKED;
31 44
 
32
-void mp_handle(void) BANKED;
45
+uint8_t mp_handle(void) BANKED;
46
+
47
+void mp_new_state(struct mp_player_state *state) BANKED;
48
+void mp_add_shot(struct mp_shot_state *state) BANKED;
33 49
 
34 50
 extern uint8_t mp_connection_status;
35 51
 

Loading…
Cancel
Save