diff --git a/engine/include/GearSrc/Net.h b/engine/include/GearSrc/Net.h index 21c485d..aaadcc4 100644 --- a/engine/include/GearSrc/Net.h +++ b/engine/include/GearSrc/Net.h @@ -8,10 +8,28 @@ extern "C" { #endif +/** + * 6 bits reserved + * 1 bit unsafe or safe + * 1 bit ack or normal + * 4 bytes index + * 4 bytes sequence + * + * if unsafe: + * n bytes data + * else if ack: + * no data continues + * else if sequence is 0: + * 4 bytes sequence count + * else: + * n bytes data + */ + #define GSNetDefaultPort 23903 #define GSNetAcknowledgeTimeout 500 #define GSNetPacketFlagAcknowledge (1 << 0) +#define GSNetPacketFlagUnsafe (1 << 1) /* net_client.c */ GSDECL GSNetClient GSNetClientOpen(GSClient net, const char* hostname, int port); diff --git a/engine/include/GearSrc/Resource.h b/engine/include/GearSrc/Resource.h index b5ecaba..a9221de 100644 --- a/engine/include/GearSrc/Resource.h +++ b/engine/include/GearSrc/Resource.h @@ -8,6 +8,25 @@ extern "C" { #endif +/** + * signature: 0x7F PAK + * + * entry: + * 1 byte: type + * 4 bytes: name crc32 + * 1 byte: name len + * n bytes: name + * if file { + * 4 bytes: actual size + * 4 bytes: compressed size + * 4 bytes: seek pos + * } else { + * 2 bytes: number of entries + * 4 bytes: total size + * n bytes: entries + * } + */ + GSDECL GSResource GSResourceOpen(GSEngine engine, const char* path); GSDECL void* GSResourceGet(GSResource resource, const char* name, unsigned int* size); GSDECL void GSResourceClose(GSResource resource); diff --git a/engine/include/GearSrc/TypeDefs.h b/engine/include/GearSrc/TypeDefs.h index 54dd12f..a31b43b 100644 --- a/engine/include/GearSrc/TypeDefs.h +++ b/engine/include/GearSrc/TypeDefs.h @@ -141,6 +141,8 @@ struct _GSNetAddress { struct _GSBinary { void* data; int size; + + int flag; }; struct _GSNetState { diff --git a/engine/src/net/net_state.c b/engine/src/net/net_state.c index daac8be..3ca23c7 100644 --- a/engine/src/net/net_state.c +++ b/engine/src/net/net_state.c @@ -11,7 +11,16 @@ enum states { }; void GSNetStateRead(GSNetState* state, GSNetSocket sock, GSNetPacket* packet, GSNetAddress* address) { - if(packet->header.flag & GSNetPacketFlagAcknowledge) { + if(packet->header.flag & GSNetPacketFlagUnsafe) { + GSBinary binary; + + binary.size = 508 - sizeof(packet->header); + binary.data = malloc(binary.size); + + memcpy(binary.data, packet->data, binary.size); + + arrput(state->rx, binary); + } else if(packet->header.flag & GSNetPacketFlagAcknowledge) { if(arrlen(state->tx) > 0 && state->txstate == WaitingAcknowledge && state->txindex == packet->header.index && state->txseq == packet->header.seq) { GSLog(state->engine, GSLogDebug, "%s: Received acknowledge packet %d:%d", state->name, state->txindex, state->txseq); @@ -33,6 +42,8 @@ void GSNetStateRead(GSNetState* state, GSNetSocket sock, GSNetPacket* packet, GS state->rxtotal = GSEndianSwapU32BE(*(GSU32*)packet->data); } + /* TODO: buffer what it got */ + state->rxseq++; if(state->rxseq == (state->rxtotal + 1)) { state->rxseq = 0; @@ -54,6 +65,25 @@ void GSNetStateRead(GSNetState* state, GSNetSocket sock, GSNetPacket* packet, GS void GSNetStateWrite(GSNetState* state, GSNetSocket sock, GSNetAddress* address) { if(arrlen(state->tx) > 0) { + int i; + for(i = 0; i < arrlen(state->tx); i++) { + if(state->tx[i].flag & GSNetPacketFlagUnsafe) { + GSNetPacket pkt; + + pkt.header.flag = GSNetPacketFlagUnsafe; + pkt.header.index = 0; + pkt.header.seq = 0; + pkt.size = state->tx[i].size; + + memcpy(pkt.data, state->tx[i].data, pkt.size); + + GSNetPacketWrite(sock, &pkt, address); + + arrdel(state->tx, i); + i--; + } + } + if(state->txstate == Acknowledged) { int n = state->tx[0].size; GSNetPacket pkt; diff --git a/engine/src/resource.c b/engine/src/resource.c index ec6d4a6..214ad57 100644 --- a/engine/src/resource.c +++ b/engine/src/resource.c @@ -8,25 +8,6 @@ #include -/** - * signature: 0x7F PAK - * - * entry: - * 1 byte: type - * 4 bytes: name crc32 - * 1 byte: name len - * n bytes: name - * if file { - * 4 bytes: actual size - * 4 bytes: compressed size - * 4 bytes: seek pos - * } else { - * 2 bytes: number of entries - * 4 bytes: total size - * n bytes: entries - * } - */ - static unsigned char res_sig[4] = { 0x7f, 'P',