From 3b2a0f4de877e7d93e9fdaa55b98cf2700410ab3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Schweiger?= Date: Wed, 26 Apr 2017 21:39:46 +0200 Subject: [PATCH] First network test Warning: old, unfinished code --- data/icons2.png | Bin 33115 -> 33141 bytes source/Menu.c | 2 +- source/Network.c | 19 +++++-- source/Network.h | 2 + source/PacketHandler.c | 50 ++++++++++++++--- source/PacketHandler.h | 2 +- source/main.c | 119 ++++++++++++++++++++++++++++++----------- 7 files changed, 149 insertions(+), 45 deletions(-) diff --git a/data/icons2.png b/data/icons2.png index 83c8034c99d24c14858d88bdb0f527f04b6825c5..b9f6d6ab2903a59e103cc0a653ad1364aecb8fd0 100644 GIT binary patch delta 26327 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%0AmMrj%|HH+RuW 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 diff --git a/source/Menu.c b/source/Menu.c index 6041dd1..17ed172 100644 --- a/source/Menu.c +++ b/source/Menu.c @@ -1483,7 +1483,7 @@ void renderMenu(int menu,int xscr,int yscr){ char * text = malloc((50+8+1) * sizeof(char)); memset(text, 0, (50+8+1) * sizeof(char)); networkGetScanName(text, i); - strcpy(text, "'s World"); + strcat(text, "'s World"); if(i != currentSelection) color &= 0xFF7F7F7F; // Darken color. diff --git a/source/Network.c b/source/Network.c index d2a44c9..c0fdcde 100644 --- a/source/Network.c +++ b/source/Network.c @@ -151,19 +151,28 @@ bool networkConnected() { return isConnected; } +bool networkIsServer() { + return isServer; +} + void networkSend(networkPacket *packet, size_t size) { if(udsRunning && isConnected) { //Server broadcasts to all clients but clients only send info to server - u16 dest; if(isServer) { - dest = UDS_BROADCAST_NETWORKNODEID; + networkSendTo(packet, size, UDS_BROADCAST_NETWORKNODEID); } else { - dest = UDS_HOST_NETWORKNODEID; + networkSendTo(packet, size, UDS_HOST_NETWORKNODEID); } + } +} + +//TODO: I somehow need to implement a relieable protocol on top of uds +void networkSendTo(networkPacket *packet, size_t size, u16 reciever) { + if(udsRunning && isConnected) { - Result ret = udsSendTo(dest, NETWORK_CHANNEL, UDS_SENDFLAG_Default, packet, size); + Result ret = udsSendTo(reciever, NETWORK_CHANNEL, UDS_SENDFLAG_Default, packet, size); if(UDS_CHECK_SENDTO_FATALERROR(ret)) { //TODO: what do? } @@ -187,7 +196,7 @@ void networkRecieve() { if(actualSize) { networkPacket *packet = (networkPacket*) networkBuffer; - processPacket(packet, packet->analyze.type); + processPacket(packet, packet->analyze.type, sourceNetworkNodeID); } } } diff --git a/source/Network.h b/source/Network.h index 10eec2f..fcbc70d 100644 --- a/source/Network.h +++ b/source/Network.h @@ -56,6 +56,8 @@ bool networkConnect(int pos); void networkDisconnect(); bool networkConnected(); +bool networkIsServer(); void networkSend(networkPacket *packet, size_t size); //TODO: Should this be a pointer? Calling function needs to cleanup itself +void networkSendTo(networkPacket *packet, size_t size, u16 reciever); //TODO: Should this be a pointer? Calling function needs to cleanup itself void networkRecieve(); //TODO: Should recieve actually handle all the packets or just return them? diff --git a/source/PacketHandler.c b/source/PacketHandler.c index f444379..a1f2da5 100644 --- a/source/PacketHandler.c +++ b/source/PacketHandler.c @@ -1,10 +1,48 @@ #include "PacketHandler.h" -void processPacket(networkPacket *packet, u8 type) { +#include "Globals.h" + +void processPacket(networkPacket *packet, u8 type, u16 sender) { //TODO: Differenciate the packets and process them - if(type==PACKET_REQUEST_MAPDATA) { - - } else if(type==PACKET_MAPDATA) { - - } + if(networkIsServer()) { + if(type==PACKET_REQUEST_MAPDATA) { + u8 level = packet->requestMapData.level; + + if(level>=0 && level<=5) { + //send back tile data + for(int y=0; y<128; y++) { + networkPacket packet = { + .mapData = { + .type = PACKET_MAPDATA, + .level = level, + .offset = y + } + }; + for(int x=0; x<128; x++) { + packet.mapData.map[x] = map[level][x+y*128]; + packet.mapData.data[x] = data[level][x+y*128]; + } + networkSendTo(&packet, sizeof(packetMapData), sender); + } + } + } else { + //TODO: Unknown packet - how to handle? + } + } else { + if(type==PACKET_MAPDATA) { + u8 level = packet->mapData.level; + + if(level>=0 && level<=5) { + //recieve tile data + //TODO: This should really check whether the values are in valid range + int y = packet->mapData.offset; + for(int x=0; x<128; x++) { + map[level][x+y*128] = packet->mapData.map[x]; + data[level][x+y*128] = packet->mapData.data[x]; + } + } + } else { + //TODO: Unknown packet - how to handle? + } + } } diff --git a/source/PacketHandler.h b/source/PacketHandler.h index 911a669..6566a5f 100644 --- a/source/PacketHandler.h +++ b/source/PacketHandler.h @@ -2,4 +2,4 @@ #include "Network.h" -void processPacket(networkPacket *packet, u8 type); +void processPacket(networkPacket *packet, u8 type, u16 sender); diff --git a/source/main.c b/source/main.c index a19fdcd..0e9274d 100644 --- a/source/main.c +++ b/source/main.c @@ -18,6 +18,13 @@ // -> Skeleton arrows are slower, do a little less damage // -> Or instead of less damage, implement a simple armor system +//TODO: Multiplayer should use normal drawing code -> so remove this first test again +float tmxscr = 400; +float tmyscr = 400; +float tmenuxa = 0.25; +float tmenuya = 0.25; + + void initMiniMapData() { int i; for(i = 0; i < 128 * 128; ++i) { @@ -75,6 +82,12 @@ void setupGame(bool loadUpWorld, bool remote) { initMiniMap(loadUpWorld); } else { + //reset level data so no old data can somehow remain + memset(map, 0, 128*128*5 * sizeof(u8)); + memset(data, 0, 128*128*5 * sizeof(u8)); + + currentLevel = 1; + //TODO: Can Packets get dropped - if yes, should resending be handled by network functions (so I dont need to do it everywhere) networkPacket packet = { .requestMapData = { @@ -286,41 +299,83 @@ int main() { if (currentMenu == 0) { tick(); - sf2d_start_frame(GFX_TOP, GFX_LEFT); + //TODO: Multiplayer should use normal drawing code -> so remove this first test again + if(!isRemote) { + sf2d_start_frame(GFX_TOP, GFX_LEFT); - offsetX = xscr; - offsetY = yscr; - sf2d_draw_rectangle(0, 0, 400, 240, 0xFF0C0C0C); //RGBA8(12, 12, 12, 255)); //You might think "real" black would be better, but it actually looks better that way - - renderLightsToStencil(false, false, true); + offsetX = xscr; + offsetY = yscr; + sf2d_draw_rectangle(0, 0, 400, 240, 0xFF0C0C0C); //RGBA8(12, 12, 12, 255)); //You might think "real" black would be better, but it actually looks better that way + + renderLightsToStencil(false, false, true); - renderBackground(xscr, yscr); - renderEntities(player.x, player.y, &eManager); - renderPlayer(); - renderWeather(xscr, yscr); - - resetStencilStuff(); - - renderDayNight(); - - offsetX = 0; - offsetY = 0; - - if(shouldRenderDebug){ - sprintf(fpsstr, " FPS: %.0f, X:%d, Y:%d, E:%d", sf2d_get_fps(), player.x, player.y, eManager.lastSlot[currentLevel]); - drawText(fpsstr, 2, 225); - } - - sf2d_end_frame(); + renderBackground(xscr, yscr); + renderEntities(player.x, player.y, &eManager); + renderPlayer(); + renderWeather(xscr, yscr); + + resetStencilStuff(); + + renderDayNight(); + + offsetX = 0; + offsetY = 0; + + if(shouldRenderDebug){ + sprintf(fpsstr, " FPS: %.0f, X:%d, Y:%d, E:%d", sf2d_get_fps(), player.x, player.y, eManager.lastSlot[currentLevel]); + drawText(fpsstr, 2, 225); + } + + sf2d_end_frame(); - sf2d_start_frame(GFX_BOTTOM, GFX_LEFT); - if(!shouldRenderMap){ - sf2d_draw_texture(bottombg, 0, 0); - renderGui(); - } else { - renderZoomedMap(); - } - sf2d_end_frame(); + sf2d_start_frame(GFX_BOTTOM, GFX_LEFT); + if(!shouldRenderMap){ + sf2d_draw_texture(bottombg, 0, 0); + renderGui(); + } else { + renderZoomedMap(); + } + sf2d_end_frame(); + //TODO: Multiplayer should use normal drawing code -> so remove this first test again + } else { + //TODO: Temporary way of getting back to the menu + if (k_pause.clicked){ + sf2d_set_clear_color(0xFF); + currentSelection = 0; + currentMenu = MENU_TITLE; + + networkDisconnect(); + + playMusic(music_menu); + } + + tmxscr += tmenuxa; + tmyscr += tmenuya; + + if (tmxscr < 16) { + tmxscr = 16; + tmenuxa = -tmenuxa; + } else if (tmxscr > 1832) { + tmxscr = 1832; + tmenuxa = -tmenuxa; + } + if (tmyscr < 16) { + tmyscr = 16; + tmenuya = -tmenuya; + } else if (tmyscr > 1792) { + tmyscr = 1792; + tmenuya = -tmenuya; + } + + sf2d_start_frame(GFX_TOP, GFX_LEFT); + offsetX = (int) tmxscr; offsetY = (int) tmyscr; + renderBackground((int) tmxscr, (int) tmyscr); + offsetX = 0; offsetY = 0; + sf2d_end_frame(); + + sf2d_start_frame(GFX_BOTTOM, GFX_LEFT); + sf2d_end_frame(); + } } else { tickMenu(currentMenu); renderMenu(currentMenu, xscr, yscr);