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
         key_read();
180
         key_read();
181
 
181
 
182
         if (mode != GM_SINGLE) {
182
         if (mode != GM_SINGLE) {
183
-            mp_handle();
183
+            if (mp_handle()) {
184
+                // TODO
185
+                //mp_new_state();
186
+            }
184
         }
187
         }
185
 
188
 
186
         enum ACCELERATION acc = 0;
189
         enum ACCELERATION acc = 0;

+ 9
- 2
src/gbprinter.c View File

365
     static uint8_t map_buff[2 * DEVICE_SCREEN_WIDTH];
365
     static uint8_t map_buff[2 * DEVICE_SCREEN_WIDTH];
366
     static uint8_t tile_buff[2 * DEVICE_SCREEN_WIDTH * 16];
366
     static uint8_t tile_buff[2 * DEVICE_SCREEN_WIDTH * 16];
367
 
367
 
368
+    uint8_t r = PRN_STATUS_OK;
369
+
368
     for (int y = 0; y < DEVICE_SCREEN_HEIGHT; y += 2) {
370
     for (int y = 0; y < DEVICE_SCREEN_HEIGHT; y += 2) {
369
         for (int y2 = 0; y2 < 2; y2++) {
371
         for (int y2 = 0; y2 < 2; y2++) {
370
             for (int x = 0; x < DEVICE_SCREEN_WIDTH; x++) {
372
             for (int x = 0; x < DEVICE_SCREEN_WIDTH; x++) {
379
                 : fill_bkg_rect(0, y + y2, DEVICE_SCREEN_WIDTH, 1, 0);
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
 }
163
 }
164
 
164
 
165
 void map_dbg_reset(void) NONBANKED {
165
 void map_dbg_reset(void) NONBANKED {
166
+#ifndef WRAP_BG
166
     uint16_t camera_x = abs_x >> POS_SCALE_BG;
167
     uint16_t camera_x = abs_x >> POS_SCALE_BG;
167
     uint16_t camera_y = abs_y >> POS_SCALE_BG;
168
     uint16_t camera_y = abs_y >> POS_SCALE_BG;
168
     uint8_t map_pos_x = camera_x >> 3;
169
     uint8_t map_pos_x = camera_x >> 3;
179
                 attr);
180
                 attr);
180
         }
181
         }
181
     }
182
     }
183
+#endif // ! WRAP_BG
182
 }
184
 }
183
 
185
 
184
 void map_move(int16_t delta_x, int16_t delta_y) NONBANKED {
186
 void map_move(int16_t delta_x, int16_t delta_y) NONBANKED {

+ 85
- 13
src/multiplayer.c View File

26
 
26
 
27
 #define RETRANSMIT_TIME 200
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
 enum mp_state {
47
 enum mp_state {
30
     MP_M_SEND = 0,
48
     MP_M_SEND = 0,
31
     MP_M_WAIT = 1,
49
     MP_M_WAIT = 1,
40
 static uint16_t next_t = 0;
58
 static uint16_t next_t = 0;
41
 static uint8_t our_turn = 0;
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
 uint8_t mp_connection_status = 0;
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
 uint8_t mp_master_ready(void) BANKED {
91
 uint8_t mp_master_ready(void) BANKED {
46
     switch (state) {
92
     switch (state) {
47
         case MP_M_SEND:
93
         case MP_M_SEND:
48
-            SB_REG = MASTER_HELLO;
49
-            SC_REG = SIOF_XFER_START | SIOF_CLOCK_INT;
94
+            Tx(MASTER_HELLO);
50
             next_t = timer_get() + RETRANSMIT_TIME;
95
             next_t = timer_get() + RETRANSMIT_TIME;
51
             mp_connection_status++;
96
             mp_connection_status++;
52
             state = MP_M_WAIT;
97
             state = MP_M_WAIT;
53
             break;
98
             break;
54
 
99
 
55
         case MP_M_WAIT:
100
         case MP_M_WAIT:
56
-            if (!(SC_REG & SIOF_XFER_START)) {
101
+            if (!transmitting()) {
57
                 if (SB_REG == SLAVE_HELLO) {
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
                     next_t = timer_get() + RETRANSMIT_TIME;
104
                     next_t = timer_get() + RETRANSMIT_TIME;
61
                     mp_connection_status++;
105
                     mp_connection_status++;
62
                     state = MP_M_REPLY;
106
                     state = MP_M_REPLY;
68
             break;
112
             break;
69
 
113
 
70
         case MP_M_REPLY:
114
         case MP_M_REPLY:
71
-            if (!(SC_REG & SIOF_XFER_START)) {
115
+            if (!transmitting()) {
72
                 if (SB_REG == MASTER_HELLO) {
116
                 if (SB_REG == MASTER_HELLO) {
73
                     return 1;
117
                     return 1;
74
                 } else {
118
                 } else {
90
 
134
 
91
 void mp_master_start(void) BANKED {
135
 void mp_master_start(void) BANKED {
92
     our_turn = 1;
136
     our_turn = 1;
137
+    remaining = 0;
138
+    next_t = timer_get() + RETRANSMIT_TIME;
139
+
93
     game(GM_MULTI);
140
     game(GM_MULTI);
141
+
94
     state = 0;
142
     state = 0;
95
 }
143
 }
96
 
144
 
97
 uint8_t mp_slave_ready(void) BANKED {
145
 uint8_t mp_slave_ready(void) BANKED {
98
     switch (state) {
146
     switch (state) {
99
         case MP_S_START:
147
         case MP_S_START:
100
-            SB_REG = SLAVE_HELLO;
101
-            SC_REG = SIOF_XFER_START | SIOF_CLOCK_EXT;
148
+            Rx(SLAVE_HELLO);
102
             next_t = timer_get() + RETRANSMIT_TIME;
149
             next_t = timer_get() + RETRANSMIT_TIME;
103
             mp_connection_status++;
150
             mp_connection_status++;
104
             state = MP_S_WAIT;
151
             state = MP_S_WAIT;
105
             break;
152
             break;
106
 
153
 
107
         case MP_S_WAIT:
154
         case MP_S_WAIT:
108
-            if (!(SC_REG & SIOF_XFER_START)) {
155
+            if (!transmitting()) {
109
                 if (SB_REG == MASTER_HELLO) {
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
                     next_t = timer_get() + RETRANSMIT_TIME;
158
                     next_t = timer_get() + RETRANSMIT_TIME;
113
                     mp_connection_status++;
159
                     mp_connection_status++;
114
                     state = MP_S_REPLY;
160
                     state = MP_S_REPLY;
122
             break;
168
             break;
123
 
169
 
124
         case MP_S_REPLY:
170
         case MP_S_REPLY:
125
-            if (!(SC_REG & SIOF_XFER_START)) {
171
+            if (!transmitting()) {
126
                 if (SB_REG == SLAVE_HELLO) {
172
                 if (SB_REG == SLAVE_HELLO) {
127
                     return 1;
173
                     return 1;
128
                 }
174
                 }
142
 
188
 
143
 void mp_slave_start(void) BANKED {
189
 void mp_slave_start(void) BANKED {
144
     our_turn = 0;
190
     our_turn = 0;
191
+    remaining = 0;
192
+    next_t = timer_get() + RETRANSMIT_TIME;
193
+
145
     game(GM_MULTI);
194
     game(GM_MULTI);
195
+
146
     state = 0;
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
 #include <gbdk/platform.h>
23
 #include <gbdk/platform.h>
24
 #include <stdint.h>
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
 uint8_t mp_master_ready(void) BANKED;
39
 uint8_t mp_master_ready(void) BANKED;
27
 void mp_master_start(void) BANKED;
40
 void mp_master_start(void) BANKED;
28
 
41
 
29
 uint8_t mp_slave_ready(void) BANKED;
42
 uint8_t mp_slave_ready(void) BANKED;
30
 void mp_slave_start(void) BANKED;
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
 extern uint8_t mp_connection_status;
50
 extern uint8_t mp_connection_status;
35
 
51
 

Loading…
Cancel
Save