First network test

Warning: old, unfinished code
This commit is contained in:
André Schweiger 2017-04-26 21:39:46 +02:00
parent c107f82abb
commit 3b2a0f4de8
7 changed files with 149 additions and 45 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 32 KiB

View file

@ -1483,7 +1483,7 @@ void renderMenu(int menu,int xscr,int yscr){
char * text = malloc((50+8+1) * sizeof(char)); char * text = malloc((50+8+1) * sizeof(char));
memset(text, 0, (50+8+1) * sizeof(char)); memset(text, 0, (50+8+1) * sizeof(char));
networkGetScanName(text, i); networkGetScanName(text, i);
strcpy(text, "'s World"); strcat(text, "'s World");
if(i != currentSelection) color &= 0xFF7F7F7F; // Darken color. if(i != currentSelection) color &= 0xFF7F7F7F; // Darken color.

View file

@ -151,19 +151,28 @@ bool networkConnected() {
return isConnected; return isConnected;
} }
bool networkIsServer() {
return isServer;
}
void networkSend(networkPacket *packet, size_t size) { void networkSend(networkPacket *packet, size_t size) {
if(udsRunning && isConnected) { if(udsRunning && isConnected) {
//Server broadcasts to all clients but clients only send info to server //Server broadcasts to all clients but clients only send info to server
u16 dest;
if(isServer) { if(isServer) {
dest = UDS_BROADCAST_NETWORKNODEID; networkSendTo(packet, size, UDS_BROADCAST_NETWORKNODEID);
} else { } else {
dest = UDS_HOST_NETWORKNODEID; networkSendTo(packet, size, UDS_HOST_NETWORKNODEID);
}
}
} }
Result ret = udsSendTo(dest, NETWORK_CHANNEL, UDS_SENDFLAG_Default, packet, size); //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(reciever, NETWORK_CHANNEL, UDS_SENDFLAG_Default, packet, size);
if(UDS_CHECK_SENDTO_FATALERROR(ret)) { if(UDS_CHECK_SENDTO_FATALERROR(ret)) {
//TODO: what do? //TODO: what do?
} }
@ -187,7 +196,7 @@ void networkRecieve() {
if(actualSize) { if(actualSize) {
networkPacket *packet = (networkPacket*) networkBuffer; networkPacket *packet = (networkPacket*) networkBuffer;
processPacket(packet, packet->analyze.type); processPacket(packet, packet->analyze.type, sourceNetworkNodeID);
} }
} }
} }

View file

@ -56,6 +56,8 @@ bool networkConnect(int pos);
void networkDisconnect(); void networkDisconnect();
bool networkConnected(); bool networkConnected();
bool networkIsServer();
void networkSend(networkPacket *packet, size_t size); //TODO: Should this be a pointer? Calling function needs to cleanup itself 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? void networkRecieve(); //TODO: Should recieve actually handle all the packets or just return them?

View file

@ -1,10 +1,48 @@
#include "PacketHandler.h" #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 //TODO: Differenciate the packets and process them
if(networkIsServer()) {
if(type==PACKET_REQUEST_MAPDATA) { if(type==PACKET_REQUEST_MAPDATA) {
u8 level = packet->requestMapData.level;
} else if(type==PACKET_MAPDATA) { 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?
}
} }
} }

View file

@ -2,4 +2,4 @@
#include "Network.h" #include "Network.h"
void processPacket(networkPacket *packet, u8 type); void processPacket(networkPacket *packet, u8 type, u16 sender);

View file

@ -18,6 +18,13 @@
// -> Skeleton arrows are slower, do a little less damage // -> Skeleton arrows are slower, do a little less damage
// -> Or instead of less damage, implement a simple armor system // -> 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() { void initMiniMapData() {
int i; int i;
for(i = 0; i < 128 * 128; ++i) { for(i = 0; i < 128 * 128; ++i) {
@ -75,6 +82,12 @@ void setupGame(bool loadUpWorld, bool remote) {
initMiniMap(loadUpWorld); initMiniMap(loadUpWorld);
} else { } 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) //TODO: Can Packets get dropped - if yes, should resending be handled by network functions (so I dont need to do it everywhere)
networkPacket packet = { networkPacket packet = {
.requestMapData = { .requestMapData = {
@ -286,6 +299,8 @@ int main() {
if (currentMenu == 0) { if (currentMenu == 0) {
tick(); tick();
//TODO: Multiplayer should use normal drawing code -> so remove this first test again
if(!isRemote) {
sf2d_start_frame(GFX_TOP, GFX_LEFT); sf2d_start_frame(GFX_TOP, GFX_LEFT);
offsetX = xscr; offsetX = xscr;
@ -321,6 +336,46 @@ int main() {
renderZoomedMap(); renderZoomedMap();
} }
sf2d_end_frame(); 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 { } else {
tickMenu(currentMenu); tickMenu(currentMenu);
renderMenu(currentMenu, xscr, yscr); renderMenu(currentMenu, xscr, yscr);