Begin Network Implementation
This commit is contained in:
parent
31d576e879
commit
a014be2c5a
4 changed files with 241 additions and 3 deletions
195
source/Network.c
Normal file
195
source/Network.c
Normal file
|
@ -0,0 +1,195 @@
|
||||||
|
#include "Network.h"
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <malloc.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
bool udsRunning;
|
||||||
|
|
||||||
|
size_t scannedNetworksCount;
|
||||||
|
udsNetworkScanInfo *scannedNetworks;
|
||||||
|
|
||||||
|
bool isConnected;
|
||||||
|
bool isServer;
|
||||||
|
|
||||||
|
size_t networkBufferSize;
|
||||||
|
u32 *networkBuffer;
|
||||||
|
|
||||||
|
udsNetworkStruct networkStruct;
|
||||||
|
udsBindContext networkBindCtx;
|
||||||
|
|
||||||
|
void networkInit() {
|
||||||
|
Result ret = udsInit(0x3000, NULL);
|
||||||
|
if(R_FAILED(ret)) {
|
||||||
|
udsRunning = false;
|
||||||
|
} else {
|
||||||
|
udsRunning = true;
|
||||||
|
|
||||||
|
scannedNetworksCount = 0;
|
||||||
|
scannedNetworks = NULL;
|
||||||
|
isConnected = false;
|
||||||
|
isServer = false;
|
||||||
|
|
||||||
|
networkBufferSize = 0x4000;
|
||||||
|
networkBuffer = malloc(networkBufferSize);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void networkExit() {
|
||||||
|
//TODO: Additionally to shutting down the service, clear any left over memory!
|
||||||
|
if(udsRunning) {
|
||||||
|
//cleanup any dynamically reserved memory
|
||||||
|
if(scannedNetworks!=NULL) free(scannedNetworks);
|
||||||
|
scannedNetworks = NULL;
|
||||||
|
|
||||||
|
free(networkBuffer);
|
||||||
|
networkDisconnect();
|
||||||
|
|
||||||
|
udsExit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool networkAvailable() {
|
||||||
|
return udsRunning;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool networkHost() {
|
||||||
|
if(udsRunning && !isConnected) {
|
||||||
|
udsGenerateDefaultNetworkStruct(&networkStruct, NETWORK_WLANCOMMID, 0, NETWORK_MAXPLAYERS);
|
||||||
|
|
||||||
|
Result ret = udsCreateNetwork(&networkStruct, NETWORK_PASSPHRASE, strlen(NETWORK_PASSPHRASE)+1, &networkBindCtx, NETWORK_CHANNEL, NETWORK_RECVBUFSIZE);
|
||||||
|
if(R_FAILED(ret)) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
isConnected = true;
|
||||||
|
isServer = true;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void networkScan() {
|
||||||
|
if(udsRunning) {
|
||||||
|
//reset values from last scan
|
||||||
|
if(scannedNetworks!=NULL) free(scannedNetworks);
|
||||||
|
scannedNetworks = NULL;
|
||||||
|
scannedNetworksCount = 0;
|
||||||
|
|
||||||
|
//scan
|
||||||
|
memset(networkBuffer, 0, networkBufferSize);
|
||||||
|
Result ret = udsScanBeacons(networkBuffer, networkBufferSize, &scannedNetworks, &scannedNetworksCount, NETWORK_WLANCOMMID, 0, NULL, isConnected);
|
||||||
|
if(R_FAILED(ret)) {
|
||||||
|
//TODO: what do?
|
||||||
|
scannedNetworksCount = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int networkGetScanCount() {
|
||||||
|
if(udsRunning) {
|
||||||
|
return scannedNetworksCount;
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool networkGetScanName(char *name, int pos) {
|
||||||
|
if(udsRunning) {
|
||||||
|
if(pos<0 || pos>=scannedNetworksCount) return false;
|
||||||
|
|
||||||
|
Result ret = udsGetNodeInfoUsername(&scannedNetworks[pos].nodes[0], name);
|
||||||
|
if(R_FAILED(ret)) {
|
||||||
|
//TODO: what do?
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool networkConnect(int pos) {
|
||||||
|
if(udsRunning && !isConnected) {
|
||||||
|
if(pos<0 || pos>=scannedNetworksCount) return false;
|
||||||
|
|
||||||
|
Result ret = udsConnectNetwork(&scannedNetworks[pos].network, NETWORK_PASSPHRASE, strlen(NETWORK_PASSPHRASE)+1, &networkBindCtx, UDS_BROADCAST_NETWORKNODEID, UDSCONTYPE_Client, NETWORK_CHANNEL, NETWORK_RECVBUFSIZE);
|
||||||
|
if(R_FAILED(ret)) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
isConnected = true;
|
||||||
|
isServer = false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void networkDisconnect() {
|
||||||
|
//TODO: For clients this just means disconnect, for the server it means destroy the network
|
||||||
|
if(udsRunning && isConnected) {
|
||||||
|
//TODO
|
||||||
|
if(isServer) {
|
||||||
|
udsDisconnectNetwork();
|
||||||
|
} else {
|
||||||
|
//TODO: Clients need to cleanup too, how can I tell they got disconnected
|
||||||
|
udsDestroyNetwork();
|
||||||
|
}
|
||||||
|
udsUnbind(&networkBindCtx);
|
||||||
|
|
||||||
|
isConnected = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool networkConnected() {
|
||||||
|
return isConnected;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
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;
|
||||||
|
} else {
|
||||||
|
dest = UDS_HOST_NETWORKNODEID;
|
||||||
|
}
|
||||||
|
|
||||||
|
Result ret = udsSendTo(dest, NETWORK_CHANNEL, UDS_SENDFLAG_Default, packet, size);
|
||||||
|
if(UDS_CHECK_SENDTO_FATALERROR(ret)) {
|
||||||
|
//TODO: what do?
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void networkRecieve() {
|
||||||
|
//TODO: Should recieve actually handle all the packets or just return them?
|
||||||
|
if(udsRunning && isConnected) {
|
||||||
|
size_t actualSize = 0;
|
||||||
|
u16 sourceNetworkNodeID;
|
||||||
|
|
||||||
|
memset(networkBuffer, 0, networkBufferSize);
|
||||||
|
|
||||||
|
Result ret = udsPullPacket(&networkBindCtx, networkBuffer, networkBufferSize, &actualSize, &sourceNetworkNodeID);
|
||||||
|
if(R_FAILED(ret)) {
|
||||||
|
//TODO: what do?
|
||||||
|
}
|
||||||
|
|
||||||
|
//actualSize will be 0 if no packet is available
|
||||||
|
if(actualSize) {
|
||||||
|
networkPacket *packet = (networkPacket*) networkBuffer;
|
||||||
|
|
||||||
|
//TODO: Differenciate the packets and process them
|
||||||
|
if(packet->analyze.type==0) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
40
source/Network.h
Normal file
40
source/Network.h
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <3ds.h>
|
||||||
|
|
||||||
|
#define NETWORK_WLANCOMMID 0x11441850
|
||||||
|
#define NETWORK_PASSPHRASE "minicraft3ds localplay passphrase"
|
||||||
|
#define NETWORK_CHANNEL 1
|
||||||
|
|
||||||
|
#define NETWORK_RECVBUFSIZE UDS_DEFAULT_RECVBUFSIZE
|
||||||
|
|
||||||
|
#define NETWORK_MAXPLAYERS UDS_MAXNODES
|
||||||
|
|
||||||
|
//TODO: Every other packet struct should start with a u8 type to match this
|
||||||
|
typedef struct {
|
||||||
|
u8 type;
|
||||||
|
} packetAnalyze;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
union {
|
||||||
|
packetAnalyze analyze;
|
||||||
|
|
||||||
|
};
|
||||||
|
} networkPacket;
|
||||||
|
|
||||||
|
void networkInit();
|
||||||
|
void networkExit();
|
||||||
|
|
||||||
|
bool networkAvailable();
|
||||||
|
|
||||||
|
bool networkHost();
|
||||||
|
void networkScan();
|
||||||
|
int networkGetScanCount();
|
||||||
|
bool networkGetScanName(char *name, int pos); //TODO: Name should be long enough to handle all allowed names (char[256])
|
||||||
|
bool networkConnect(int pos);
|
||||||
|
void networkDisconnect();
|
||||||
|
|
||||||
|
bool networkConnected();
|
||||||
|
|
||||||
|
void networkSend(networkPacket *packet, size_t size); //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?
|
|
@ -124,7 +124,7 @@ void openNPCMenu(int npc) {
|
||||||
currentTalk2 = "or stupid to be walking";
|
currentTalk2 = "or stupid to be walking";
|
||||||
currentTalk3 = "around in this dungeon.";
|
currentTalk3 = "around in this dungeon.";
|
||||||
currentTalk4 = "";
|
currentTalk4 = "";
|
||||||
currentTalk5 = "Who can I help you?";
|
currentTalk5 = "How can I help you?";
|
||||||
break;
|
break;
|
||||||
case NPC_DWARF:
|
case NPC_DWARF:
|
||||||
if(questManager.questlines[1].currentQuest<=1) {
|
if(questManager.questlines[1].currentQuest<=1) {
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
#include "MapGen.h"
|
#include "MapGen.h"
|
||||||
#include "Menu.h"
|
#include "Menu.h"
|
||||||
#include "texturepack.h"
|
#include "texturepack.h"
|
||||||
|
#include "Network.h"
|
||||||
|
|
||||||
// TODO: Dungeon is way to difficult
|
// TODO: Dungeon is way to difficult
|
||||||
// -> Skeleton arrows are slower, do a little less damage
|
// -> Skeleton arrows are slower, do a little less damage
|
||||||
|
@ -182,9 +183,10 @@ int main() {
|
||||||
osSetSpeedupEnable(shouldSpeedup);
|
osSetSpeedupEnable(shouldSpeedup);
|
||||||
fclose(file);
|
fclose(file);
|
||||||
}
|
}
|
||||||
|
sf2d_init();
|
||||||
sf2d_init();
|
|
||||||
csndInit();
|
csndInit();
|
||||||
|
networkInit();
|
||||||
|
|
||||||
noItem = newItem(ITEM_NULL, 0);
|
noItem = newItem(ITEM_NULL, 0);
|
||||||
|
|
||||||
initMenus();
|
initMenus();
|
||||||
|
@ -325,6 +327,7 @@ int main() {
|
||||||
sf2d_free_texture(minimap[4]);
|
sf2d_free_texture(minimap[4]);
|
||||||
sf2d_free_texture(minimap[5]);
|
sf2d_free_texture(minimap[5]);
|
||||||
freeSounds();
|
freeSounds();
|
||||||
|
networkExit();
|
||||||
csndExit();
|
csndExit();
|
||||||
cfguExit();
|
cfguExit();
|
||||||
sf2d_fini();
|
sf2d_fini();
|
||||||
|
|
Loading…
Add table
Reference in a new issue