From 7acb3a3613f734e01ce653f75266956f2f67609f Mon Sep 17 00:00:00 2001 From: Pontus Fransson Date: Mon, 16 Dec 2013 08:59:38 +0100 Subject: [PATCH 1/7] Network - --- Code/Network/NetworkAPI/Translator.cpp | 74 +++++++++---------- Code/Network/NetworkAPI/Translator.h | 4 +- .../NetworkDependencies/Connection.cpp | 15 ++-- Code/Network/NetworkDependencies/Connection.h | 4 +- .../Network/NetworkDependencies/IConnection.h | 4 +- .../NetworkDependencies/ThreadedClient.cpp | 2 +- .../OysterNetworkClient/ClientMain.cpp | 14 ++-- .../OysterNetworkClient.vcxproj | 11 ++- .../OysterNetworkServer.vcxproj | 17 +++-- .../OysterNetworkServer/ServerMain.cpp | 32 +++++++- 10 files changed, 103 insertions(+), 74 deletions(-) diff --git a/Code/Network/NetworkAPI/Translator.cpp b/Code/Network/NetworkAPI/Translator.cpp index e331f1aa..28b62dd8 100644 --- a/Code/Network/NetworkAPI/Translator.cpp +++ b/Code/Network/NetworkAPI/Translator.cpp @@ -51,13 +51,13 @@ struct Translator::PrivateData } //Packages a header with a size(int) and a string of characters(char) - void PackHeader(SmartPointer &bytes, CustomNetProtocol& protocol) + void PackHeader(OysterByte &bytes, CustomNetProtocol& protocol) { auto it = ((MyCastingStruct*)protocol.privateData)->attributes.begin(); auto end = ((MyCastingStruct*)protocol.privateData)->attributes.end(); size = 4; //size(int) - message.PackInt(size, *bytes); + message.PackInt(size, bytes); //Find all the data types for(; it != end; it++) @@ -65,19 +65,19 @@ struct Translator::PrivateData headerString.push_back(it->second.type); } - message.PackShort(size, *bytes); + message.PackShort(size, bytes); size += 2; for(int i = 0; i < (int)headerString.size(); i++) { - message.PackChar(headerString.at(i), *bytes); + message.PackChar(headerString.at(i), bytes); size++; } message.SetSize(bytes); } - void PackMessage(SmartPointer &bytes, CustomNetProtocol& protocol) + void PackMessage(OysterByte &bytes, CustomNetProtocol& protocol) { auto it = ((MyCastingStruct*)protocol.privateData)->attributes.begin(); auto end = ((MyCastingStruct*)protocol.privateData)->attributes.end(); @@ -87,40 +87,40 @@ struct Translator::PrivateData switch((int)headerString.at(i)) { case NetAttributeType_Bool: - message.PackBool(it->second.value.netBool, *bytes); + message.PackBool(it->second.value.netBool, bytes); break; case NetAttributeType_Char: - message.PackChar(it->second.value.netChar, *bytes); + message.PackChar(it->second.value.netChar, bytes); break; case NetAttributeType_UnsignedChar: - message.PackUnsignedChar(it->second.value.netUChar, *bytes); + message.PackUnsignedChar(it->second.value.netUChar, bytes); break; case NetAttributeType_Short: - message.PackShort(it->second.value.netShort, *bytes); + message.PackShort(it->second.value.netShort, bytes); break; case NetAttributeType_UnsignedShort: - message.PackUnsignedShort(it->second.value.netUShort, *bytes); + message.PackUnsignedShort(it->second.value.netUShort, bytes); break; case NetAttributeType_Int: - message.PackInt(it->second.value.netInt, *bytes); + message.PackInt(it->second.value.netInt, bytes); break; case NetAttributeType_UnsignedInt: - message.PackUnsignedInt(it->second.value.netUInt, *bytes); + message.PackUnsignedInt(it->second.value.netUInt, bytes); break; case NetAttributeType_Int64: - message.PackInt64(it->second.value.netInt64, *bytes); + message.PackInt64(it->second.value.netInt64, bytes); break; case NetAttributeType_UnsignedInt64: - message.PackUnsignedInt64(it->second.value.netUInt64, *bytes); + message.PackUnsignedInt64(it->second.value.netUInt64, bytes); break; case NetAttributeType_Float: - message.PackFloat(it->second.value.netFloat, *bytes); + message.PackFloat(it->second.value.netFloat, bytes); break; case NetAttributeType_Double: - message.PackDouble(it->second.value.netDouble, *bytes); + message.PackDouble(it->second.value.netDouble, bytes); break; case NetAttributeType_CharArray: - message.PackStr(it->second.value.netCharPtr, *bytes); + message.PackStr(it->second.value.netCharPtr, bytes); break; default: numberOfUnknownTypes++; @@ -131,27 +131,27 @@ struct Translator::PrivateData message.SetSize(bytes); } - bool UnpackHeader(CustomNetProtocol& protocol, SmartPointer &bytes) + bool UnpackHeader(CustomNetProtocol& protocol, OysterByte &bytes) { message.SetSize(0); - int packageSize = message.UnpackInt(*bytes); - if(packageSize != bytes->GetSize()) + int packageSize = message.UnpackInt(bytes); + if(packageSize != bytes.GetSize()) { return false; } - short numberOfTypes = message.UnpackShort(*bytes); + short numberOfTypes = message.UnpackShort(bytes); for(int i = 0; i < numberOfTypes; i++) { - char temp = message.UnpackChar(*bytes); + char temp = message.UnpackChar(bytes); headerString.push_back(temp); } return true; } - void UnpackMessage(CustomNetProtocol& protocol, SmartPointer &bytes) + void UnpackMessage(CustomNetProtocol& protocol, OysterByte &bytes) { for(int i = 0; i < (int)headerString.size(); i++) { @@ -159,40 +159,40 @@ struct Translator::PrivateData switch(protocol[i].type) { case NetAttributeType_Bool: - protocol[i].value.netBool = message.UnpackBool(*bytes); + protocol[i].value.netBool = message.UnpackBool(bytes); break; case NetAttributeType_Char: - protocol[i].value.netChar = message.UnpackChar(*bytes); + protocol[i].value.netChar = message.UnpackChar(bytes); break; case NetAttributeType_UnsignedChar: - protocol[i].value.netUChar = message.UnpackUnsignedChar(*bytes); + protocol[i].value.netUChar = message.UnpackUnsignedChar(bytes); break; case NetAttributeType_Short: - protocol[i].value.netShort = message.UnpackShort(*bytes); + protocol[i].value.netShort = message.UnpackShort(bytes); break; case NetAttributeType_UnsignedShort: - protocol[i].value.netUShort = message.UnpackUnsignedShort(*bytes); + protocol[i].value.netUShort = message.UnpackUnsignedShort(bytes); break; case NetAttributeType_Int: - protocol[i].value.netInt = message.UnpackInt(*bytes); + protocol[i].value.netInt = message.UnpackInt(bytes); break; case NetAttributeType_UnsignedInt: - protocol[i].value.netUInt = message.UnpackUnsignedInt(*bytes); + protocol[i].value.netUInt = message.UnpackUnsignedInt(bytes); break; case NetAttributeType_Int64: - protocol[i].value.netInt64 = message.UnpackInt64(*bytes); + protocol[i].value.netInt64 = message.UnpackInt64(bytes); break; case NetAttributeType_UnsignedInt64: - protocol[i].value.netUInt64 = message.UnpackUnsignedInt64(*bytes); + protocol[i].value.netUInt64 = message.UnpackUnsignedInt64(bytes); break; case NetAttributeType_Float: - protocol[i].value.netFloat = message.UnpackFloat(*bytes); + protocol[i].value.netFloat = message.UnpackFloat(bytes); break; case NetAttributeType_Double: - protocol[i].value.netDouble = message.UnpackDouble(*bytes); + protocol[i].value.netDouble = message.UnpackDouble(bytes); break; case NetAttributeType_CharArray: - protocol[i].value.netCharPtr = message.UnpackCStr(*bytes); + protocol[i].value.netCharPtr = message.UnpackCStr(bytes); break; default: numberOfUnknownTypes++; @@ -222,7 +222,7 @@ Translator::~Translator() } } -void Translator::Pack(SmartPointer &bytes, CustomNetProtocol& protocol) +void Translator::Pack(OysterByte &bytes, CustomNetProtocol& protocol) { privateData->headerString.clear(); @@ -230,7 +230,7 @@ void Translator::Pack(SmartPointer &bytes, CustomNetProtocol& protoc privateData->PackMessage(bytes, protocol); } -bool Translator::Unpack(CustomNetProtocol& protocol, SmartPointer &bytes) +bool Translator::Unpack(CustomNetProtocol& protocol, OysterByte &bytes) { if(!privateData->UnpackHeader(protocol, bytes)) { diff --git a/Code/Network/NetworkAPI/Translator.h b/Code/Network/NetworkAPI/Translator.h index 3f5fe673..aed765f8 100644 --- a/Code/Network/NetworkAPI/Translator.h +++ b/Code/Network/NetworkAPI/Translator.h @@ -49,10 +49,10 @@ namespace Oyster Translator (); ~Translator(); - void Pack(Utility::DynamicMemory::SmartPointer &bytes, CustomNetProtocol& protocol); + void Pack(OysterByte &bytes, CustomNetProtocol& protocol); //Returns false if it discovers any faulty stuff with the package. - bool Unpack(CustomNetProtocol& protocol, Utility::DynamicMemory::SmartPointer &bytes); + bool Unpack(CustomNetProtocol& protocol, OysterByte &bytes); private: struct PrivateData; diff --git a/Code/Network/NetworkDependencies/Connection.cpp b/Code/Network/NetworkDependencies/Connection.cpp index b470ebc2..bf0b108e 100644 --- a/Code/Network/NetworkDependencies/Connection.cpp +++ b/Code/Network/NetworkDependencies/Connection.cpp @@ -104,11 +104,11 @@ int Connection::Disconnect() return 0; } -int Connection::Send(Utility::DynamicMemory::SmartPointer &bytes) +int Connection::Send(OysterByte &bytes) { int nBytes; - nBytes = send(this->socket, *bytes, bytes->GetSize(), 0); + nBytes = send(this->socket, bytes, bytes.GetSize(), 0); if(nBytes == SOCKET_ERROR) { return WSAGetLastError(); @@ -117,20 +117,20 @@ int Connection::Send(Utility::DynamicMemory::SmartPointer &bytes) return 0; } -int Connection::Recieve(Utility::DynamicMemory::SmartPointer &bytes) +int Connection::Recieve(OysterByte &bytes) { int nBytes; - bytes->Resize(1000); - nBytes = recv(this->socket, *bytes, 1000, 0); + bytes.Resize(1000); + nBytes = recv(this->socket, bytes, 1000, 0); if(nBytes == SOCKET_ERROR) { - bytes->SetSize(0); + bytes.SetSize(0); return WSAGetLastError(); } else { - bytes->SetSize(nBytes); + bytes.SetSize(nBytes); } return 0; @@ -177,6 +177,7 @@ int Connection::SetBlockingMode(bool blocking) return WSAGetLastError(); } + //Success return 0; } diff --git a/Code/Network/NetworkDependencies/Connection.h b/Code/Network/NetworkDependencies/Connection.h index 815c1d32..ae76a3f7 100644 --- a/Code/Network/NetworkDependencies/Connection.h +++ b/Code/Network/NetworkDependencies/Connection.h @@ -23,8 +23,8 @@ namespace Oyster virtual int InitiateServer( unsigned short port ); virtual int InitiateClient(); - virtual int Send( Utility::DynamicMemory::SmartPointer &bytes ); - virtual int Recieve( Utility::DynamicMemory::SmartPointer &bytes ); + virtual int Send( OysterByte &bytes ); + virtual int Recieve( OysterByte &bytes ); virtual int Disconnect(); virtual int Connect( unsigned short port , const char serverName[] ); diff --git a/Code/Network/NetworkDependencies/IConnection.h b/Code/Network/NetworkDependencies/IConnection.h index ecfe3869..76736071 100644 --- a/Code/Network/NetworkDependencies/IConnection.h +++ b/Code/Network/NetworkDependencies/IConnection.h @@ -19,8 +19,8 @@ namespace Oyster //sends and recieve functions with bytearrays, //will send to the users connection via socket - virtual int Send( Utility::DynamicMemory::SmartPointer &bytes ) = 0; - virtual int Recieve( Utility::DynamicMemory::SmartPointer &bytes) = 0; + virtual int Send( OysterByte &bytes ) = 0; + virtual int Recieve( OysterByte &bytes) = 0; //initiates sockets and address for server and client virtual int InitiateServer( unsigned short port ) { return false; }; diff --git a/Code/Network/NetworkDependencies/ThreadedClient.cpp b/Code/Network/NetworkDependencies/ThreadedClient.cpp index 204b26c3..fc652f7f 100644 --- a/Code/Network/NetworkDependencies/ThreadedClient.cpp +++ b/Code/Network/NetworkDependencies/ThreadedClient.cpp @@ -84,7 +84,7 @@ int ThreadedClient::Recv() { int errorCode = -1; - SmartPointer temp = new OysterByte; + OysterByte temp; errorCode = this->connection->Recieve(temp); if(errorCode == 0) diff --git a/Code/Network/OysterNetworkClient/ClientMain.cpp b/Code/Network/OysterNetworkClient/ClientMain.cpp index 2b75c92d..b2f4c4bd 100644 --- a/Code/Network/OysterNetworkClient/ClientMain.cpp +++ b/Code/Network/OysterNetworkClient/ClientMain.cpp @@ -18,9 +18,6 @@ using namespace Oyster::Network; using namespace Utility; using namespace Utility::DynamicMemory; -void chat(ThreadedClient &client); -void PrintOutMessage(ProtocolSet* set); - void proc(CustomNetProtocol& protocol) { @@ -40,14 +37,13 @@ int main() NetworkClient client; //Connect to server - errorCode = client.Connect(15151, "193.11.186.101"); + if(client.Connect(15151, "localhost")) + { + cout << "FAILED" << endl; + } client.SetRecieverObject(proc, NetworkProtocolCallbackType_Function); - if(errorCode != 0) - { - wstring errorTest = GetErrorMessage(errorCode); - wcout << "errorMessage: " << errorTest << endl; - } + cout << "Done" << endl; while(1) { diff --git a/Code/Network/OysterNetworkClient/OysterNetworkClient.vcxproj b/Code/Network/OysterNetworkClient/OysterNetworkClient.vcxproj index f4a69e17..bc491966 100644 --- a/Code/Network/OysterNetworkClient/OysterNetworkClient.vcxproj +++ b/Code/Network/OysterNetworkClient/OysterNetworkClient.vcxproj @@ -70,28 +70,28 @@ $(SolutionDir)..\Obj\$(ProjectName)\$(PlatformShortName)\$(Configuration)\ $(ProjectName)_$(PlatformShortName)D $(SolutionDir)..\External\Include\;$(IncludePath);$(IncludePath);C:\Program Files %28x86%29\Visual Leak Detector\include;$(IncludePath) - $(OutDir)..\DLL\;$(LibraryPath);$(SolutionDir)..\External\Lib\NetworkAPI;$(SolutionDir)..\Bin\DLL;C:\Program Files (x86)\Visual Leak Detector\lib\Win32 + $(OutDir)..\DLL\;$(LibraryPath);$(SolutionDir)..\External\Lib\NetworkAPI;$(SolutionDir)..\Bin\DLL;C:\Program Files (x86)\Visual Leak Detector\lib\Win32;$(OutDir)..\DLL\ $(SolutionDir)..\Bin\Executable\ $(SolutionDir)..\Obj\$(ProjectName)\$(PlatformShortName)\$(Configuration)\ $(ProjectName)_$(PlatformShortName) C:\Program Files %28x86%29\Visual Leak Detector\include;$(IncludePath) - C:\Program Files (x86)\Visual Leak Detector\lib\Win32;$(LibraryPath) + C:\Program Files (x86)\Visual Leak Detector\lib\Win32;$(LibraryPath);$(OutDir)..\DLL\ $(SolutionDir)..\Bin\Executable\ $(SolutionDir)..\Obj\$(ProjectName)\$(PlatformShortName)\$(Configuration)\ $(ProjectName)_$(PlatformShortName)D C:\Program Files %28x86%29\Visual Leak Detector\include;$(IncludePath) - C:\Program Files (x86)\Visual Leak Detector\lib\Win64;$(LibraryPath) + C:\Program Files (x86)\Visual Leak Detector\lib\Win64;$(LibraryPath);$(OutDir)..\DLL\ $(SolutionDir)..\Bin\Executable\ $(SolutionDir)..\Obj\$(ProjectName)\$(PlatformShortName)\$(Configuration)\ $(ProjectName)_$(PlatformShortName) C:\Program Files %28x86%29\Visual Leak Detector\include;$(IncludePath) - C:\Program Files (x86)\Visual Leak Detector\lib\Win64;$(LibraryPath) + C:\Program Files (x86)\Visual Leak Detector\lib\Win64;$(LibraryPath);$(OutDir)..\DLL\ @@ -116,6 +116,7 @@ true + NetworkAPI_$(PlatformShortName)D.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) @@ -131,6 +132,7 @@ true true true + NetworkAPI_$(PlatformShortName)D.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) @@ -146,6 +148,7 @@ true true true + NetworkAPI_$(PlatformShortName)D.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) diff --git a/Code/Network/OysterNetworkServer/OysterNetworkServer.vcxproj b/Code/Network/OysterNetworkServer/OysterNetworkServer.vcxproj index 335b889c..089427f7 100644 --- a/Code/Network/OysterNetworkServer/OysterNetworkServer.vcxproj +++ b/Code/Network/OysterNetworkServer/OysterNetworkServer.vcxproj @@ -66,32 +66,32 @@ - $(SolutionDir)..\External\Lib\$(ProjectName)\ + $(SolutionDir)..\Bin\Executable\ $(SolutionDir)..\Obj\$(ProjectName)\$(PlatformShortName)\$(Configuration)\ $(ProjectName)_$(PlatformShortName)D C:\Program Files %28x86%29\Visual Leak Detector\include;$(IncludePath) - C:\Program Files (x86)\Visual Leak Detector\lib\Win32;$(LibraryPath) + C:\Program Files (x86)\Visual Leak Detector\lib\Win32;$(LibraryPath);$(OutDir)..\DLL\ - $(SolutionDir)..\External\Lib\$(ProjectName)\ + $(SolutionDir)..\Bin\Executable\ $(SolutionDir)..\Obj\$(ProjectName)\$(PlatformShortName)\$(Configuration)\ $(ProjectName)_$(PlatformShortName) C:\Program Files %28x86%29\Visual Leak Detector\include;$(IncludePath) - C:\Program Files (x86)\Visual Leak Detector\lib\Win32;$(LibraryPath) + C:\Program Files (x86)\Visual Leak Detector\lib\Win32;$(LibraryPath);$(OutDir)..\DLL\ - $(SolutionDir)..\External\Lib\$(ProjectName)\ + $(SolutionDir)..\Bin\Executable\ $(SolutionDir)..\Obj\$(ProjectName)\$(PlatformShortName)\$(Configuration)\ $(ProjectName)_$(PlatformShortName)D C:\Program Files %28x86%29\Visual Leak Detector\include;$(IncludePath) - C:\Program Files (x86)\Visual Leak Detector\lib\Win64;$(LibraryPath) + C:\Program Files (x86)\Visual Leak Detector\lib\Win64;$(LibraryPath);$(OutDir)..\DLL\ - $(SolutionDir)..\External\Lib\$(ProjectName)\ + $(SolutionDir)..\Bin\Executable\ $(SolutionDir)..\Obj\$(ProjectName)\$(PlatformShortName)\$(Configuration)\ $(ProjectName)_$(PlatformShortName) C:\Program Files %28x86%29\Visual Leak Detector\include;$(IncludePath) - C:\Program Files (x86)\Visual Leak Detector\lib\Win64;$(LibraryPath) + C:\Program Files (x86)\Visual Leak Detector\lib\Win64;$(LibraryPath);$(OutDir)..\DLL\ @@ -104,6 +104,7 @@ true + NetworkAPI_$(PlatformShortName)D.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) diff --git a/Code/Network/OysterNetworkServer/ServerMain.cpp b/Code/Network/OysterNetworkServer/ServerMain.cpp index 52624ca6..7f78bc78 100644 --- a/Code/Network/OysterNetworkServer/ServerMain.cpp +++ b/Code/Network/OysterNetworkServer/ServerMain.cpp @@ -2,16 +2,44 @@ #include #include #include "../NetworkDependencies/WinsockFunctions.h" +#include "../NetworkAPI/NetworkServer.h" +using namespace Oyster::Network; using namespace std; +void proc(NetworkClient client) +{ + cout << "Hej" << endl; +} + int main() { - if(!InitWinSock()) + NetworkServer server; + Oyster::Network::NetworkServer::INIT_DESC desc; + desc.port = 15151; + desc.callbackType = NetworkClientCallbackType_Function; + desc.recvObj = proc; + + if(!server.Init(desc)) { - cout << "errorMessage: unable to start winsock" << endl; + cout << "Init failed" << endl; + return 0; } + if(!server.Start()) + { + cout << "Start failed" << endl; + return 0; + } + + cout << "Server started" << endl; + + while(1) + { + + } + + system("pause"); return 0; From 6f979b1044f43e0028d4eb16b086a519e4e29a41 Mon Sep 17 00:00:00 2001 From: Pontus Fransson Date: Mon, 16 Dec 2013 09:15:13 +0100 Subject: [PATCH 2/7] Network - Merge with gamelogic --- Bin/DLL/NetworkAPI_x86D.pdb | Bin 2944000 -> 2944000 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Bin/DLL/NetworkAPI_x86D.pdb b/Bin/DLL/NetworkAPI_x86D.pdb index 6173afe28732424278051af8c7c6fb3872f90ec5..39d11475ac06ee704dac9cf9769a7c70ece1d182 100644 GIT binary patch delta 28693 zcma)_30xD$`~N2d6i@I@K{ zJ*c8k>w#x&>w(s@TBRP?V2lkt_AIN{;>X>;`|+|{aOl8!yBpShU8Us`LX4f{85{OF&RZF4 zmdseIHH_6LV=QYCV+&U?cDkuzaaXl{*J1_p-K1ax>kCq@e-0-q*wZlzc7DEsXFqOY?0ha`HYoXJBxCN?85`Jzu{{kHtR@UNTf|uD z7mQghGxowu!3qvBwg#EHB`DY-d~V{?bsS?2{$;E&j80EguxfuXmT``;y{!~1Xo7-O z_IA|C)|Za*J>AdPYUJTI+s@d9D@Y6joX1xd=UV(j0K8A~Z)tR#am zFI4V7l@x3T&X0G)aMVu2{}}tis$jFaF{YZTK$*p38uFO50fyo%I~K=O{@^QE{9_|W z^2gg1?9~It)?Z+3QC|i7J$d(=#+5wnUu844`%lK+{^}6#8{s%#e#TfNs$B&c;b_Fz zMbuI}YT$qCQFHaBW}tb#U@RI1pkx0i$N5eTG0hg#{v3nj+AyE7EA?e;DoTFy3A*4z#y-5x*fR9;b?DKD;YV~-Ub47rQ~QB>4&`Ml9cSmi z8zDIp{p|N*$DO_CW2;c+7HEX|HqnfyaMd4BEILf(MW?^xkaiR8GmJiedb&nps+O-aA)2nOiZXs=YwGIzy9}?cHYrA%uZf&N;X=cS~6!^H| zqr}G@9}j#g;ZqqOPkgH2Qx%_T_*BQI20k?l<1}6!rzse}Y`53f{FpsnRro#yUTtt= zVu4o&oQev(ZsW9OkJn}1s|a}FUazsZaepu2Lcc<VnI{>|(EA zCC*!pdU?^g=!92exNYH;pS-d#-WJAO_wqffs9Tu&wfD}oit&XF`__6Ku22+u=hW(6 zSD}~{yR24W?6TS)HpSoBdu!uU2cNq5)GN&1TYo9;7goPof6RKEQzteUqr~}?y}{p= zaNa+&L7X?vb@>KyjffXCSm%jz^#cudH^jO4YJ=neMeRa=r7F6avZ(9!!YqGPGlg=? z=&Ss?0M%6w)#1%-B%jbqHGubRrK-k14N!Gi+P|P4AJ9tG#@(|tTEWM+Qk8o2VI^!5 z|3!eR7hf8vs?YPms^)yzpHYNG(SjHy*6K|yQ)KBNw{i_o08+M z^6BkWKPo3ADR^^xRcC%eq-w4*chdz*KY))JQN0GG@6T`RpwcL3&lU7sbep}AztKT8 zi1+BEnx&lGr z-h8xsjcWYc-l|E;qBG-pdmq(lW%h!r{Gh(7ACw%wnfL9dIkO@HK>JF48u zm@vq~tO0y{v`XVX!tW~MqXwx)@DHP5esMGBWyt_s-q(&Vrv(FXsoHWuxGZ(|Z{bL% z<#S?GIqqc(%f$+{gH<0Wlep12T^U=8k%04#iT7X;+^!S02Ty&DbaZ28E(X(HmW#z| zeoGB0_<3u{Xg8+e%D^VL80V+ydg9uPb7N||F|Ktkrrlr{Yop;yV^z(ECnjimFqY@K zuaEQ@uLwK($K((<=2?sNl-l80i|lBZox9PE*%C^?TDar_b-#4!k=eG}@~3XBWgxE| zrt-0mv6_2f!gHlD>IU3t_j}p&n`7Kqnzalp&BgSQ$vgI>O{@H6bLh6_^hU(zVz$m@ zd(^u52WJl6nqtHi>W$`@UcZiCzi&=i4-(Y$lR#$F z5xc9}rf_2!ro8^r%CQ>9-O_AmFeSN>8w(FB1;bog-WdAGUY+J71;iiuA1YPvJph4{ zGee{~)u+Mu$#VyyF%pasQG*bxx&%FIJ*xhw^!ugBMmILpmJc?|#l{Tnmwfo~Rb#f! zjafVL+lHg|(vnLsVVK>W8Jkmgs)x)RllzGY$}RDj_KwtcGS6D8`4L}NT{Z$nr6iP^ z7&}|Z$r3ZBOnLD5**Bj=z~Ij2OvVs}xC*m3=Bq7J1|)8CW0r(`DT_lQg8Ns^Sm(yZ zSj(i4r5T9**DSJ?8`DQ>;E$rxG%K-(O$RMQQ+77Xm_CwU6Q}ZNX-TIvd%k^<;f8$5 zkOt)`H_DcNHD~_U%3G>HH)hcDrAUvaj33V!8lpT6V}CE`GbQN1F1aLM3?|AmM)J>J zo?*l^=np3)a!V!_{&aTzul)1+V&cFF>+ccF1w;_# zQu?#ycOOMbo#Vtxz&cA9w{1$h-;$2mh;dUTN^wm(>#Tb7H?bVBiaL9J{`qra_F}+_ zO6SgPyp*8#w0D(${q;w^iJ8GFDjnA9ui?b5(67@IEBX%{S=e(A0|!Fa%m zO21dk6{xCBgjn z2!^vO`9g;8VU?S|&L*ar`L0f{kL)#t3@b7_dgJ_vr!#~MD?%{Ow@qgY8NP@0T{G-U zAw!I36${bGdq))^!}qYOb-(N&?X;OkN#K~K1jjqQ-OylQOu%u z6||js!cp5`u@d=Jl`^eSVRsji9GA=3VhP*V@Zp=VCYIlbm4Zo)%2B-CKly`xeTYT* zLMmP&_{WdupEp^3zZ$_6qXqjodQy@kp;qhIEaL$s$pLFEVe3A+pQp_K_BOF%uwV(h z)8q%$pFgbXLX6=ltfJh;yzvNkV3U+J#tl+>?0U*YAwwwy}lo8`&#;97t zeO|s^(&Wa{XkiS_!$WL0i7u)Xd-U+vLO!ce2nqY6(&Fh|140BZhyjz%HT%v_*t)#k z^kyWN{~q?iY271Y-gYeWjglxWKHlNs-A0e96U+sRk}%3J$8h^!Vx?deGn{^2y@ps6 zBGqt-Tu!*Man8E&g4g7NMM;=_*@3<}lP_!=D<}o*B7u)HbN1Y9`uYqp&F75umN5Ts z3T}-5H0VcSxnQoD3)eU1ZYW-BY$?p9W$%$wE`KFVPBH7S?jW5;KbT~m;MVo%Zc%cnYOu z8{gG)=lI@@f*!C<5;g9-&Et-CJ}`$E2T-v^Zw+tz3o$cT8;RW4)qi>YNBg%zi{|?R zO6QK~(WQZTPd@#V1o;w&f!yYIhuSK)EoUiB4%k_Va)T*&;lOQsIugs>@~&LHFN3xa zD|-)ns$RB|SPUi~*GNg>Fb$QDcee>9SPWQk+}G~NjUmQ;#TZt9T@~G9R2yrv7d3?8 z*Zeisl_iWX)(N%WWKHX`VSle1Dah|Y=A=h>`eW?p@cmz>yy)DRSS}dmI2SwM`_kNg z&NDr+sGV4Xmaxi07uYNJ2yQ{F1gstYaOzyH=pFY@#_|Ki^6a~?-g9%MhC=Vodk+h$(o_h{*d8p#N{k8PJHPGHzv~J?=U%y+M3C<-d-zo7 z`MH4qNd$lI`Egy{l#7CYl@wx3l`!7h;PBx30Y@B?W%`wwgivYOfGC6(4waOb(A5fPx1 z+~nj<1f#$z4gzm)?h#x&2Mkr>GW61fBUMy0XGf7-F<4vt;Vi_krp<@C{qOc7V!7z} zQzUZL|F}_dxWII9FhM>q+2JAkaZW-dpJNOS>{8Tt*UC1V*Y2DsWO5$wy(Fw(`)>+- zj(RK+*w1)sldw;J-@Gnq(}_G{B^Tt3@0g-${s9VmiLo9M8TavSTb~X+kR#ZYlcMqo z!o-R+gC%LYh0e)p)c7006Jsu89+WWtB=n+n^RHm3TXKK4-?mn#6Zc_t1nFU!=wyoS{sd0ucG4J2d_a%lZZghJPcXDedV)?h^I{9Mch1LkP&0a8U&9yO< zMsxe!N~rnzcs#M(_ps%g+T15r23E0x1{X{mL@e*_yWMHXqZLA>m)Ze4NesT8b#d05 zlS_rD#e5I1PNBfrXIdOf46M^*-XT(&b6+0Md3o1wGV|Vx^~6fw!~Fd7ml2D?h}vDE zGj?U)DhrY>J#biB0TP?)b~KFy*&p&CvF@lpZV!L-GM88kSX+rwJ}_0)9DSn<_oY60 zKICx9mK5*jg3JRs<8vU>4=wmm9yhjbvg&wa_s2s?#{3@k=v71jv62dmFH2SVL}E4N zKm*<6-+G5onyA0z^Xo6kH6OK|o-6c`60qaaGW0O1nnQ?BH3?plQ-&Av5`M2&t^K1G zgbEE+1}5$2bC$Wkm=*c@56V;X=v|ij`)y%{GlMOW=xpV^w)|1hR=GI%Nb zWn7nI?(N$DOfVm?uM^_jN_i({!?W|piFrSMmp#~RSVheI9=79vZWgf;Fll4Gsmgvi zGPt|Yz;?~Q@4|YCgKCms?t9pw8JD&aD+8N?v(tqioNfD&rp!Z_!}FfVA4p&BnEqo? z)Z>>V$DZOXuqbC|_vR;TIy`#yTY_de6xhL^ha?j#1)CrWvX-9)S;~SmLg{l5c^D+@ zLYFr`^;HS2EQC4~E;$YDd&_6Q$vFr9CY{_%ermc(g+|E33oz-^SL1^@r6qfh2w^pc zi18bV_FFTIkM~}f_k=XC$_h45qP@eRG2_2E%Y^FF;09nXJ3(=87$t( zc(qwogL)Nira5ooyr3q_R|LMM*_Gu~Q?LON#>bi+UOdsPYKa-`lYdKt>RbO1dUPpX z=?6>G9y6=L`5R_cr4{2;^)VH6ZZxyW<-Ktkq&U7N-g8P4&v^W-aw~iH0mL|LNLVOg z%e6y%7OeheHZfj1PUVAcorhP3CP|uV>r!-sdY!0GX*9Luh79z&IWfO~v+cyp6&PPU zPI%BS!~M<@ef)FB{oLAk^)J1zu{gqqXq>%J4%F`diq9P*-7)-P3u3a(=lKS7S(s~4 zombk^f=ZfW+d;VwcVjZ0_hxiMp!riH>a-Gikq*xse%wWFV1#Y(p>56tNu z?pR^p5V-X7jZ>>(cuKZ#{tDN^ggeuk8Z_#Ata*?6u)}E01;ch3!S~$lOr!lVWk|;p zw`plSB3#o_!7MIgv=M%Dn%h5Lar>ql(`FQd*<4H)dCUJsXq0ln9w<$X$KIGWE|z6& z*+ReOaeX$E3XunP-Nl%$=+)Nk$Cq~*=f;wZ_ToSV8|i}SSz99u2K+DQXm@02)U;MG zKc}Tkm+-L0C;JvPX^*MQX3YyyxRyfPnMwQUAK$8WKXfa0W06`GjGaX;Isfbkzreh6 zfhW+_tz0~I6N&lh?S=^_Q;+s>H%xM4ZpA0x}d(0ucnXJL8hHZiz=S)))Q@ou)FdVJ>4*xmWgy)q?-}tG++p25RHmN(Gs2EIo@@a_DdEshOg}vH8lS)M`xZ)_7Im#(jtrlP!5*AGw$|%X`bYd+Khx?x88P z-t833E;>|#MSrbvd|=VbkI+4I`GDarK`Yn($HqSdzUut38%xh(5mJ_#LG0+s#Eb9? zV~mWMEyT8s`(`|~eIA%-sEvc6_Eq6A8+YQRl##WUD$UT7;FC8!F)6397%*qV;f_+3 ze)^!vz!xtg@%Ahu56l_jpsS@(6!U{V4J%ez=`2#l%-2iKou1pFnvI+^USJsIX%28_ z{@DaOk6wQmB}^&?%qTCtlBIKn5r1!Q7`iCYjpSrSN-w;MwaHwn1430 z5zoKEK$D)tuxVJLU9l-}b3~l%Y9Ffn9!%no*)=f+uve82&d7P0j8ICLnX6VpC0ze+4pH6=1`-p zxQBvaql(Z>O1%2@7MjL4?_y@1`J-vR ze_Y7ub~Wle;NtiBXM5eu)gT@?YUSuyz`xDF#C?Ew34U!muZouk~-kEpua; z#+YFW_SR)+kjCy=w4`tQeW^6V<_=fTdx&y5yEVhMW>Fn`3p772moX^`C;qCl=k2jys-jm|ibqPBErZyZ z&r5e;;^K1bqZADL)XJ?%)4y2SBKF~pg9k9Ou@bEqL@D95AJ-qeDk8!{qh)&h#|rkT z%NSj%fAI7VhJEaP8a0!`MvFm_lBF6>O!<0y?WMioq-pvnFy{=5Zm+Wk7KEOEtepM` zUTVyj37R+(Z1!r{8ET3$84J=7J9y_mg#9TA8f-drMq%VL#9jofeoQ`N23z4WG|O76 z-dokEr2$wlL39)C6WipllIs1$Go3Aaw^cxZspD0zDt|P%%{)?qhnqDGf z;Q_?{K39~EQrM!<@S-spLWY0MiHN|q4|BeZaY-asGNTvbXl)j!haBdg^0wCqC44gU zGgMoGC6}O!jS*^Q=%LyegbBJ^s4P-ZG^ClZDBcmyDg?F34HW)=TsH?8C8tAj3?SBAxL}hVR~KfC9uiav*3P9gH9f^P=~&xi8?X?R zo~%hzxZbiV(MwJ|SXw-<_L4O;2<3t~LwO|zEDGi0u8o77LCayb6J|rZF#U2#6wBvb z$ge|=Q4Bc4)rJ~vP~3)JX1#QqO`})-I0Z{|8KaG8t~l{z#r(5&$Yp3O3Kr{RfAzFLJ@kgHk)DU;peY|L)4| z|Kt7j6kxFN81-D1>J8h!{cUz_(`3x|5#inw6>OKQ^wtcPyj(T)ao@=_beDmBCbE>f zm20+2xUd0!VM))QBtCQ~VK_Z=EPT1PjT_>hOm4D*dAX`BBq+4()qy#>mDe%M8glGn z#Hxhl6k7i>W9oOPQbQ@2GqgtNl|-R+%qfrk7@#s@a>NI7jEJdwo-DYmZI^~+DT^^5 z%oXav|C1=vonmi|_RX@gDWW5y3+ZW_K=@C4@z7x#9}m{8yo8wJQ|Rr9CN5SovxS&D1`J2HzhhAUzyWkfy6|U8JH#XMT;@`|O$B%7AcS_BO z2m8t;XEfIenjUxN$4RIeD;G6O^b2azS;3)Q>I}G2nIQC6c>Um_V zjzg)0Y!1GX;$jJ=%+%&ZulH;2P$|m5oN)ru8Yxb=IO1szYArHqu9R{9#BM%ri5Mcw znk!=&`p0&_%|E48M=26Z0i6K`S(@1B=LS9Y*TF(pf+=dA7?RV}IhT7B&-@i=rih?C zuvsoclQY5!^lkolbG;F!W<$(;h3nlW1spY68*UExHxCn#Nt?F-&wtJ*RZ5&RrD;yH zvNh2(vUxAWcNSbq1GKxRHY*(O?%NERn`0KCeam|crQP0d%!CCu`*d(aS1!qw`i0F( ze$oC^OfM>sX0bSNkseH3_W85Ewf#baLY@rbp#!s8*ok!*gaWkQOBC!AmoY(_-y=%- zOQ!toLMgx=xQq!-aoe+MT6B67te6;W-plcI6s5CyGfcN8{9M#w*N4l=FSyT0C+1&z z0wRYBex8vzbm0P2cWOpHpmTMPLa|T%4z54#J-7$DT5#?v1=~3k|hU!vJRo5Ibr1b8K;n|w=xq{twvEY;h_ZLH(*}dzbZ(Gvy*5SKQE*Ku* z)A4Fxg#9qQJJ^_;Ck_~tme%6?UFeO`i}No9b3Xl2iRtNg+Pq;u)7TO9g~GKb12q-g z^7ZNAN!#LI;Q7yz2Ns9?gy%mRT7UHDopZKh8k%CP(fdnrA%Z5Bpo^mhz3Co>?qoLQ zfOT~lnr!(w!1w;xurp};?1)k@QtGHttF~X41$XEB<;T)I60=^M)Tl=5T^QBAOQrkv z4*+dZ8}TI&m!QFV^lVDIUloJ#^lLK2ZxSCWsWwi3xh&z=e`Xv)cS_IMEOjWY`G-S3 zXKQ9Q9*EWnE&~$>sGy(`_DO-^D^+;JgE3p2g{UO7y}mGNu4;H2cuEj|?tscy5hk4Y zk^`zCxEbxZImB^Odr)-*H>Wyo&UV}!aY*HZo68(mxrbEYxZ32ny5nHG90Em-(?Q`> z7+b8mF~H9G<@I!D&C6@RgK=SzPg)#*Sun2(O2SHHEZs(IPyR2bF((*UFR5IHz}#AF zJP2oG8ZayZ3(eudQY;ht*NaQ8cM7#*HO5Ps9lNaw?#x{TIL4YQh0JOz?DawXKhGYV zMf;~0gY9-H)khwx=#Tf^H9JF?C4n* zH2uV1w}|n9-fG%Qrin=$baVcgL3EGxcX#z%4_pquWIA*2#uiMHShlXfKC0C6QrnJQ z(c&-^ED&evWF(g~V@|#C7heYmI-}iLq=YS;k@;ul%IAL(i?IWKEP)4y9*#ROFk&mg z60k4{TNcvzi1&k&Cy8+b++9z1lwso*k*)fA|CUB9{ypr@Pah)&!aD%44kTZ0XhhEu zce9W5D{4Wo3@};(cTF7o@Ajpa5Uaw{fmn`{Fn)e5HNBrNu5dqf+P1*CuLt6p2sK<% zOYMU{_=mOBEl~xH{}|u?zhE8{In}zn)xMbgq1zGdw?b{kgE=2hsc?KuZS^iYCh8&X zu9YQsjHRc3yFT*S#`a?{92!c&oGsvvg&%6wi>Kxyuk>VYsFVe06I*V7Q{vVJk3(2E z1arEd5+fOT&v#Ml`amu#S0bmhV+JCnpSNg@kT}6qB8B)S1Tn)`Tkp|i;2rCZZ}K{7 znL^tqqqCm#p^KFmDouGZri&!@DE~P!v;=F0iH0iiP)R!L9B6<(o}ss!Wzb>F-PrAz z#I0ODnD{tk`2fT1=sm{{Fu zD1M9M>mv+*QZwa&g}5>d(Aw|aPR_6WB~Oz>X`Ef`D6lkP_cw3z2YxyBJgu$7j}Utp zt*zX>TjlZRZ>m2<`)c!LEGUIo?yhciAg5s?rKQ(vsn@m)Jq(?g{lLUE8Kc%{@ARc^ zpXx0f+ic92!32{LY}W28c#_bXxR0cQmV|--j(L5yD{Z>8a=Bp69<9Wjo-pB;7ut~n z7gFg;A6ddIKdj=F_`H-+T_I;#{0n5jxH zSyQgj-^DVP9kJ|cqpYdlANm44Ft|*{%oZ9Odk%U4e~Q#{TB%O|Z0NKf|Go7NEan)3 zVq{PkNf~BL_!E{I({jL^4uuj64z(k$(<6EUDVDK_Aab@?)xymbOtO!qazPqu3O>e; z6)BrF3QQvgg(fWxcIJNB{?yfS0G-uFnH2Gs?@z9ud4@_@B4cKY&2oO8F5TRiVlr;D z=-u@2U>`qj=h~MX;&V%IJXr5?N2CzBtXk)wS`Aw255Q@HiU9*$P@7hm+d$o%Cd#N~ z?ykie8nrqu_8Z_`bqTx>!|r?7w8bY-EjX6HE2q+(!P5tZaxiDSL^?n2+p*8V<~Lsx zE0!`E(+NJ<^ocO^ax2_rySm5C`>63YFCHNXlvZGc=H}{33OhG8_cPHFtZiz=66maD zGRAbo93@CH#;lUcrCW(PO2Aq3!JH+)YGRsL0)x$awS-}OHHalh)0+WX!&;iDXi=0( zFyqlrCR#Afm$77vSi0eD$ zeT-UNEPYT)sfCusmVhK&wJQ>p)3IhYw|9IftQ2b%B=;SR_^v*wfVgSWqbyU1h3u&T0n>AO)QWA(c^cgctWz3RJ?7M@TJ!sn0920fYfFbIP2+EPN#`yN1 zs5He;B87NpF4Sw(``jp$#xZ*J*bfogv$}ZZbjLZ$TN5Qj4jtR5X-8AT3inB-n%{ug zB*VRjT^f>ZqopN3FmKYwG*R?AlHUe>wRKj!Rbrmy_u-J4g?HMhcPQ-XNfEd!8j#Mt znJ{Vw(lJ_Z>L_EDbVKs~A_wFAqh!ozn|HDbt(`zFL*GNjBDHaR;vxr2HT01(Z!CEI z?O$-*0c{!4{I3yewLQfWBTa?Htss^;B=%o-ZsjhFSQrW?hj43jfo>ersPE7~X z8dGHqul?3HZ|Go_1hb4~8B2Q&ph*GwX(Q}58MGL3?~e6zz@U_D8A~-3FIZ)Eur&Qd z8B5dU__qDc!Svc38A~vQOkb4cVBrDNWh}#5BpqDLCjMDIx-zeXl#wycX&$2c;?z5p2;YZNm~ z&DbDgI)j*@C1Hz8g!nrMDi-CB4b)%B%%zEaYj`c!?vvQ11~F*tI3#F;sXY4bt$v6 zv6411*lI{2yjN6e<-Ebf9x&D@veb;aGA8VI5HNOM7*#Tc{YB*m3SqQ21f;rkR9{;1 z3Qgtm;SbLaGC_Yy)mk|}8Pgj?rD+C#8B36~Wq3fKj78Y#xl}l4^NB_VjS`k%3X?NQ zAJ0gL022$5sS^v4klJ3x5=r&gmG+e}CMjW(v7d~kON`;H{bkIUChD|Vqrvck#@Y6% z1`+Bk17w0W+L0w37{#;$Wh{k>a$M3N8M8?Gcq$hoV_G8=(vTtyjfTN8XiOEA8qxuOlf+in4y`| z%jCGx-$qnNaxOOdlyf=r^CTttHJAtJyDOVUp61=8D0b-QMoO{3QLJ8+}YB*oph0_XNz^Lg`zbl(BGb z?jX-e<;?GtL@9LAy9nV>vesOQOs*3r#tWRi)dd+GEmazEMW!?~RBWcuHrHixoW#%w zu2ja%Qk`LUWIF8{uG~;9NOi&}W)bF8;ah=4{w+SheDK#XDhQ@0CmC5l4x;b=O&7Lx*;p}Gn z_T>&ZnyW5@T>zgTY>i`9swH=66pm?2S&+x-kG8S@LhRW`ExF}gL^uqwu1 zu@qqu-**}E){$Wt$H@elWJL5c_{kXOH&^xGkwdN%=Pzg6QqL!}1pzgx;R59>bhx+O z*|+^dH8R+Vd!gBQ->EcA#<))6lkR9Pq5?bYF>kU%E;Ov8jKyj;wi`f;5Hyx>QN(Ec zcT7N|B`XYOu7^yJ8!atGA319!4p15{TF(5$LU5g8WUMtuhEV>n#*i2*gIp`IgnqFj zOOF*=` z&K0t0fcP0yFj|3dvd~MHu++*= z?yc@vo3ZPl^(B-))!XsH>wa%_IK&cj@AL;2H1UCb)bv%ylhyIXc8Sch)enS-m2xWq zqosUjZcWDTF7Ma4Spz>RD=k^;!!?g01DaImd zfk{+9wT>+hYVg~Ws5@#lXE`^77d&?Ad=A!2qI1|TZ?ZxtXH4%pa(koMjCM}=ux|NU zUHRHy-k3Eros8APcg}I)%#bfdVX*Yczrq>09T<}|%$ar@($cu$Ov`p&M6M14u7E`g z%uy#Hk6K@GGG5zHP2Wb&g-1y1biw|@W6m^zFal<}bQf;ur=DENZnM_)6@8GtxkCa! zd=~KqJ^piGsAxgR9otKY9Y|U`4l8ZxVKU};I8GS){5M)L?*rz{%pEU^=&13}sAvo$ zN%3ILLSi^^MBFR8o=l{jo%5v-k9#E8q~74xSiMUxk|}j8DRkY3-$BGeWeJ!k(o)S~ zbUf%rcYK{!-}Tzo9MuWEgWuKt^WeXH1>MzCg>47{n| z*>~%9w@F)<5wpEVSGyQ}6=L(jym5981-C0NS{Sx4E{j+m7=~RJ!=G$;@TQQC*khKLP;7ou8{%MA{_ z3Y|JnFlT=B9X&g>#HVK;ptb_Efq>4Iz)MdJ3D(hP)`{|7Sb!mdn>_>*v}jF82pJO@^mjArvfE@C z+N?qe1NIp3l@~)XnA6qJTXd9RSytb6v>bI3Oe}!G?Z@x6PwVIPWjny-T7rF4dumvk_?R`SXk>iGBl>00uxJUNuUgU zH#fqN91&h7W7Z5Ry}Ciy#?LEvvoOr-Kmd+QCgBKYx%r0tpLY^IZH?r8)Z075!)Y5I>rX(^ciw!lC%5T z(*{$uO$2n75Y}0#6bY3MVYt>C@?;s}3pzM#Z5Mt*d+m#48S1rErH%f%mqb2u3d~uf zsD6Kv3rjS|y0FeM9b>T^$EZ11S5V(h zm1USxIBJ~wwwpaY>sXv9LwjyXrvKD{eJ~{bI+(K=XsZPoxm)jd8HKZzfjN!DoFdfb ze(v8iu%zc;P9yQn1_K${uZ0fHj{BIEoHkY|JYZ9|re83m?Q zwDs`QnPv4OuXH6=!vAlox<*S(i^C6HR82UGPL1JfETUG40I}yewd)Y$xoM7Qx#Ki- zOGL|cC!CzKzRLh11Q>zAucGn)`)(!%AI4^b^^oW+sk-u4kIV;ZLFYE;?1!k_BnB$f zT8laahW4;E#$bY9kADyAa(K{aVtHV)#_*o5rXLreiv1!m_D@PvogX({U8hPx+^vap z*-^Okj8vxi(uz=7N+x%##yTm!hf6GX7_w} zIi3Z~l#rmtAbYdy7i4_<>afZuz z&h_4ZN5~dwDrS4NQ+i8c9ns}0>i*jQU<+cY?_n!!1=v}QNLIqoH2YiZC<0TXp<^$pb> zKYs0hu`P{M8)R~0^>z|`-Mw)kEY)6+L9>O}A9<^>&)dqm+oVdz8p+W9Cq9HLq-I2c zIco-mFp`|X^{b-w#3|%8=#z<$Fa(P$BA$7xHt2HfUd=6kmQcy9}15 z!~k}5l|C)A_^0QJSH1}yXaZm65G-$dli-N!e{YI0+?r7WCf1rZlWJ|q?cx8y^G)<4 zIwG^A6Kj3MUQ~<14*E%Mu}Y0LvQ+)QDp#OXn<^2+_EDi%@ITbffd^~W$e2M-N*A`f zfzl^iPJubcYud_6AiIp zN}-?b6cpsRB$AuZp!-S4WfjPnL#NH~BgR^-{*H`UtRxpd>}n%Bg(7t)id93Q2*H1& zYoTu&Z9Tw5V={y`yxK*%7z0gej*O*clA*uWx1rV|wfki{{j*8u-<4j(kRv`6Sre4r zF(mpQ42DCc>l@;AhO?b$&ud}eJoQIjc3ou7di>Z?Rdjm%rzj5<;UhvgL+2*=U_dCQ zdGBt+?6|{My{=NI?Q$5@@HE&0{K@S7AeW-@8w zt9Uz@G0naK&}j|*OwXWV%_0ZX8?Jx_yE05+g#lH6aWMR10%pqQE@m_S`?7(Tg9W8T zfjJ9-vDvU?VfYvaGjTRBXCW{KwAY_08OA%HQC9>QEhvpDMuXZqG|;YhuRq+X#ye=2az`r0wqWbtwdx~Ege>l^{)I4|OVd2BkVeX0{hthvJqXN&d|?yzCzF>52eqaPE_&(H>ztYa`>(r)xLbxMm53$mg~66->5$Czy*#Q+cpVd)PBd+olR=Y zzW86G38E331y&+lDK0opR~)D7!m04sX7!TlkhsDxE>Qa_t_vqVw?I&H-*NMya9Xhk z^)EzqdyvqZABPkFYLB`lKY5S3CLgv}5b<-|pS@SeIZ(J#XdI_7;Z*p1ulh~h%J?c+ z4aREogHNd&cogAJZ^xe}U4Qb?r_}8#u{W+89yMz^CHVcP)Y$OI+fS=o@gJN<{za$N zK2Z7;Ng4{8__EXLaNKE$c5`II_c#MG2V6))$hwnZ5Xdr_?@$1!vTsy9I?) zpK*kAj74D`9ZwjJqY~yB>Tx;v0N}r1V`0uYb$aK3w%vPn>(!=5_ttGfdWNZn$2i?xor_@DE_TgvbA`RCKum-oK+oO|v%_uTtl&~|OF$OcEL zw7GnE+1CjoLWuX>agQJW;}g0>H}Kx7HvVJxwr>8e!S2upqCHBfbGb|^tFHfn+nZ!Z~+Rt27Cm&skgjT@TKOX0=L@!MQor zDy0qbvR3Py;oSIetG%t^TyecsR%cOP2UH@RC7gEvU|2FwJ3*slSC5Rg<>krPkzNo-n5APN$LFLanztE4P=;lvQz588>AuC zzPmhy%2&y^IoVfSCSx7f7JvCRiTB#QzHkykB``Z~1Dm#J+AXW$Y{eUVP*Ro`b20 zYWX~A>KFY)R28PzrZ#SZ=?76e`^i<3l7c&^=Zd6a)n5D(M>+ME&z8I@*-I_%FTWyv zxO^g^lp1+FRURatD^1_9xAt;LFkDuv@6eamB=SO9Pb{T9!{{#w0sV6VYws&V<#QxO zoBpV^`d(ufv|@_W0evw!L5&QT51=Z;Ac<}CL~3}r{E|eLHIeETA;0A0oi&k+q5LD{ z(NtWde3p|2uGiDo%i@|iQ$7PgODf#EhW7?gG14ZDsG0%t$r7955@n5&pO@H+?ojd3 z^0Sg_`eMpsp!}5N;m~3-@+!%SEp)1pluawQNt`F%p;MKQ7%Xoq8J(1E3n63; z_y(m+o9;y7i}#$iJbvMRJWxywYHcVXg)Ga-`z_bM?5FMiqr}8$ss=WZWrV0gPTzQa zDa}m`_v~SWbYodf4ONvS_Zk9e!U-v1?~CHyi$y(8JeuM!CgC~~!M7vVfOhmLvTsIx zmB2c&a*bSn2@apoD|FclG08DgBa-FrRzmV42{Eu~q$KuUpWmxz+)fh{y|Nlu9?MM1 ztgrXwO|QSf3(H{}K!}B9>a^;83jKm3a}va4j6oU2XN06{7I{{Vcy<$QssILF!BKBk zQjbLbTD7Go)& zr4V%v!b2-(uEPwg`4Fy={nt_5MNIm-s-Qn|O6$?=Nr(8QD3>o_P`K48a(5qx{Jw8q z7tp#P4V0(0yAyKVwqS?kj@%a+RR!s-7E^jLAOm;-5^vyNfED zof4BEQVA@GWr-H$&Z&KV8-3COHJYiM##2hnfvB_D%J+YZNobJ`7^l-@K%J3m*S^9+ zSStW>N(*SE^X9c%A|`61Y&u`5&VovJ>=-sc3`XYzY^4 zXZrK1m}C($gRe8mYC@$muHKhozeoqjDK*fRekYm-)t#190*q5?Fr(7T^L6LMBrvBM z7&i_KCLALTvW|dGb)0G@pILOsw(Lpmk2RV<6WWjy%*{nu68EzN1l6SiLA4rLZ*r{^ z{A6CWfLRKW)%SW=1cflEX7P0f`66=}W^IatDqp~K=KWTH3j$uu#7QwO+#H zyCnBy-+eV_=V4b-%?G#1vcQ~_hrvTSPnnTK+W;(vW%}&Z>(-_JsY1o`F*SfD=dkL5QMEiSlYhLr-Q zGoxJo%;5KsVU}tU-x#$Xjq!+|`VzWWfy@q&E4?y^iWv#+L#;*y@6P!ig;p|a7xNVu zEU2K@tkY227E39xB-UV)@5*`;%$lC}7h_44c0xX5nZ-0jsnppwjFIUz^c zGzA&A8jrvGB<#i>F)1e1z_=MdH0NdXuchB@Sy&A%H=5F>$$hLk^P6{{x4*R{27GX~ zu4E;@QV79HvBnH}2ad)_RuQ6M^YJx5s`uH9kk0E8VDCxQ;og)B@;0K7^JM7cXd zdi??;KRX{-4^}Qnxufwf?;iE7fi?uE?*WjTEu39rMpgNiJpc4hF-gjyD$&5)T;*22 zbIqiET!Xu&i!e*+ZNM(F%FPzTxNeK$cJ2#=O0n3t@#S)8r`%$L-!=@zss+rU^MzvR z3NYBBh3SU%jVUBekIwPg-X7h+p=4G72LU(=_GRP|Iv#2>Ge^p&i+;gW935 zvIB!ztyVW7hdtip_nrGP6PacgA=xZ*cCDYd&{{vdTPHDz&94O32ddh!hIDpaCK{0P zPr-+|YzO!sPw@AMk69Q!)eeVfARr7tY{K(PR4f<$Qttt@I!vf3Rsyx?Lr`j4j­G@^RDDZ` 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 Date: Mon, 16 Dec 2013 09:45:12 +0100 Subject: [PATCH 3/7] GL - added C_obj files, client obj in game state to send input --- Bin/Content/Shaders/DebugVertex.cso | Bin 12292 -> 0 bytes Bin/Content/Shaders/TextureDebug.cso | Bin 14560 -> 0 bytes Code/DanBias.sln | 1 + Code/Game/DanBiasGame/DanBiasGame.vcxproj | 16 ++--- Code/Game/DanBiasGame/DanBiasGame_Impl.cpp | 66 +++++++++--------- .../GameClientState/C_obj/C_DynamicObj.cpp | 42 +++++++++++ .../GameClientState/C_obj/C_DynamicObj.h | 22 ++++++ .../GameClientState/C_obj/C_Player.cpp | 46 ++++++++++++ .../GameClientState/C_obj/C_Player.h | 25 +++++++ .../GameClientState/C_obj/C_StaticObj.cpp | 45 ++++++++++++ .../GameClientState/C_obj/C_StaticObj.h | 22 ++++++ .../GameClientState/C_obj/C_UIobject.cpp | 43 ++++++++++++ .../GameClientState/C_obj/C_UIobject.h | 22 ++++++ .../GameClientState/GameClientState.h | 3 +- .../DanBiasGame/GameClientState/GameState.cpp | 42 ++++++++--- .../DanBiasGame/GameClientState/GameState.h | 2 +- .../GameClientState/LobbyState.cpp | 8 +-- .../DanBiasGame/GameClientState/LobbyState.h | 2 +- Code/Game/DanBiasGame/Include/DanBiasGame.h | 2 +- Code/Game/DanBiasLauncher/Launcher.cpp | 6 +- 20 files changed, 355 insertions(+), 60 deletions(-) delete mode 100644 Bin/Content/Shaders/DebugVertex.cso delete mode 100644 Bin/Content/Shaders/TextureDebug.cso create mode 100644 Code/Game/DanBiasGame/GameClientState/C_obj/C_DynamicObj.cpp create mode 100644 Code/Game/DanBiasGame/GameClientState/C_obj/C_DynamicObj.h create mode 100644 Code/Game/DanBiasGame/GameClientState/C_obj/C_Player.cpp create mode 100644 Code/Game/DanBiasGame/GameClientState/C_obj/C_Player.h create mode 100644 Code/Game/DanBiasGame/GameClientState/C_obj/C_StaticObj.cpp create mode 100644 Code/Game/DanBiasGame/GameClientState/C_obj/C_StaticObj.h create mode 100644 Code/Game/DanBiasGame/GameClientState/C_obj/C_UIobject.cpp create mode 100644 Code/Game/DanBiasGame/GameClientState/C_obj/C_UIobject.h diff --git a/Bin/Content/Shaders/DebugVertex.cso b/Bin/Content/Shaders/DebugVertex.cso deleted file mode 100644 index 4783f8a659621357d2c64b81e5a731d5e5b2a744..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12292 zcmeHNO>9(E6uxiTVmq|Z777RnxluIy&P@3&705uRrA-QLI;A#oVi{&$r^8I=P2QW9 zHfqv^3se%KVd26BCg`RMhzl`nAaSJ&qYD#v7(a>*mK_ocio`=eKXIZuqc!%RNm9Q63Uv1#}Z|4Y&hrK*4F? zPoO8#+Lni{SPn5$@nE_Fdi>;0w8apj5|Dr^Wlm!CY9YG2q8+^* zT_?rl?58>FLs12fH{?XCS`*t#)NE%e#*LK{H!saocQNWn!@(oVCV{g}C% zZ`*9!kAP;h_h|1Wl>6Aok>WH>Y`+kh-F_i$i|aNiiZSG0^haLy893@@v1=Y+V~g^Ad&ugiEw9`%KI zU@&XM3wz~oJe}JrolM@aWV3X`A#xisMd6Ve|7$h=DpN0vm^q26FV*mEFk-o;g2M)+xGFmXqg0%8_cBC+> zCorkMAk6JV=YEfk9Cb(1>HPu#`8nz zgcY-6e=)`ZW6|_*KC4IcGb1T5z_Cv^3;I}KC~IYfNHoVr6vw2^G5If!$x(-+^(Y(_ zXK*~{a7@l{Opv3YIHp{VmWoftNF!z`j!DH)9Y>2eF48sijB}n`fo^v;TT~x8_Hsx6 zFSY51kT!uHZuh@f+4sj+nlsKL_sRN<54xHSNs#eg_I-NYrz_f!W;rL~l1I{$67T>| zqLboKT`d<#s}h^VFVEj9bM=3S(xaRG;&7eD%cLzEPgx=~wofqE8#hyWL5x}h`vyYF z(wZxnba;Nk<9^WqS>N$1%(8qbdC*jmji?9(>~ zH`*V@jrNCeqkT3vA0j!wf&phtx7KQ}ti6Bi$5($U|IYfkE&0ioZ-khFy&a%v_=Q!9 z-m>FD^gH4N6OLA~BIX%0V*J2|QH${#Y-~$$wVm^hrRIT^Up8t@B!%<090()nM--6j zRyKhH1ZD+Z1NN1}YhhDE7=t$#@n^++s<2N>_)SQWg-Yr7H~IkgQ~q>1o^ z{{Q_N0|YzMxlBiH&=A2~d|0EcZQ zz$%~$pdabil|VH>-_ozVzi`}oKy5ytJ$XDH OXm~usdZU(z2mS^TMpq#K diff --git a/Bin/Content/Shaders/TextureDebug.cso b/Bin/Content/Shaders/TextureDebug.cso deleted file mode 100644 index 6a324d8d0624c9aabf58e655c66dfca897029b8b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14560 zcmeHOU2Ggz6+UaniM{c<>!fx}Qle36s!f{MySAI8A&s1RZO4`W>RG!ftdy+RV|(lM z?rLT?wrK;A=tD)Q+KN2z_t1wH1-YV9U;3j~6j~txqJRVvAV3Hq^#P&c&_Y#JHQ#q< zW;=Flr$AfQ=^pFsz4yCk&OP_spSeHd=;=GVzW2Mpn~#0rnRmZ`S-Tvn`qjfe5&6?m zk*x?3$lKsY0lo@8ULo=u@JO_~=Q-dm0g~fPR4p%8LGH_ljzl97VohKT90E6kYr&)k zz?CYt@&}I#`AcBxtpaZWFM|-MyZ}NyB6(w822x2gYh@?%T4-dycB)_R*YxScgkfr3 z+1XqwjmYgS?ctW&+rr_N$l>;*9kRICr}qv%3LVs24W0&*Sgvc+4T$FnIz(LMBXZsa z5fZ1J+rSTkT_R4V9)0Z0@Q~gY>l+%BSoi6!p`nqe3=WM9oa~ok#^U1Q5bQb#d6q-F zG_Xt5MRN4TPLA|;$50pjRQKr|@L}*x;QJmD-{)BL*&tFPr<+jCoE;w>6&VjoWm_<) z$}k{zMYHp|MK1nOH7A7yJot+Ygw+{dLFpc67jw8$l?gs zl}mLe-dbqx>wV^~zg9o;?l*ttKEu4#>&}ypwXKF+@p8C{Jn-Hd@4dl>{5CgwUB}|1 zmSI})sFBH}7+5p;Y%XriWYdXwbS%BW@`pCzO%cWYb8Mu#GG|M=E#P#;tJRoF&qV4R!l~$S>{?`7So} zd;3Mck`Z~w#AX-W!iV_R4q&fX5c%~jBKPw!z}fC1R;EqtftypAWV$e6X#3vpA^QUU zfZrK;ZBY%~TRWzi##D+!Hk1$V|7^goCpbt=J)g)MnjY~ASV|z^pG;>H`3`M1k;;U| z3=?XG3YZ@QKiF4*Zp!&%GjGVV!W(TX;0bPQSUiD40M*9NoZY=Y(6 zhls_T4(*ci9=QSk3KRM=9t+yFs~)kPuzvBGtBPkKrPuy=%m4phpq@A9rkRgC zJ-s||JY)AG8aUgXq4Old?|@&&qV+B?*RF>=o7e}P19sjuldf4F$H2e0)jqGl3H6(>fc0h94f=lj{I|aGm*l^ut!>Zh7a!jF zV|yM6`Wj#RHg4#%mRwn4+J|&d zM#m__bOq8)VlV1ljL$R+m-Di;SE?G6%}Nh-iF8PDJ0X7Y?O;FQoZ*+I20qKSuaoK^ z`}i)zs}R=7E|piw3cwc1Ry(qc*QmHuC^<;@J#yPUa+uv>jw$IA;FJ=47 zw*7A&h_*-dQ_+#)9JrP?P2}uacp2OL9^ifN?wZ!6CR8PexvT*p=Si0jIdKFV5~jOr zl6Fmr4?{pr$RCEHvW_)8!1WFLN|~+?5A2Z7s6E$LQ5~PN6>F5c>-`we+nldKI7i@M z9&5h4>jS{IDxBYmEHC35(=u&h4{S7VyYGfgT)ndC*YE(_c&;X*&i(4}ee(_S>?`aO z{a_8uJ#37N0f!n9e#%Wap_`pUT3fYNtiW#TMdy`#3HgjZez6z7HmSp$Og3X6dFX|f zrHyq}sBg$QQ_*f}V42m9eivitQzh9MPe7*hZscQEecDiZHoku+Okca-il{bn8;Tip zxJ?01oH=DGaSv?t{nrB8xV1l(nd!?+W~DWQ>tRb;Ei>6VZSem`#?#s4j15fU-$<<1 z6Evr7wQTCUrxt@#ADs&v)7jvAoI-O`ALLS0##pYgcQSO)E8ZhOzf=M6n z13jwJz<)qFXThJxl&Q`Gf&Cr_YEL1&4CcMeSsc@KB2Ef{k3yF3hbWlmdfXTAe{cAX z*ahZ$gyzsJ-rv=NX+BNm|0m&nqpCq0c7S(+x&P$ZX_-DA53GKde>|m@ODPo({2TUS B&?f)@ diff --git a/Code/DanBias.sln b/Code/DanBias.sln index 315bd416..894caec6 100644 --- a/Code/DanBias.sln +++ b/Code/DanBias.sln @@ -196,6 +196,7 @@ Global {2A1BC987-AF42-4500-802D-89CD32FC1309}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 {2A1BC987-AF42-4500-802D-89CD32FC1309}.Debug|Mixed Platforms.Build.0 = Debug|Win32 {2A1BC987-AF42-4500-802D-89CD32FC1309}.Debug|Win32.ActiveCfg = Debug|Win32 + {2A1BC987-AF42-4500-802D-89CD32FC1309}.Debug|Win32.Build.0 = Debug|Win32 {2A1BC987-AF42-4500-802D-89CD32FC1309}.Debug|x64.ActiveCfg = Debug|x64 {2A1BC987-AF42-4500-802D-89CD32FC1309}.Debug|x64.Build.0 = Debug|x64 {2A1BC987-AF42-4500-802D-89CD32FC1309}.Release|Mixed Platforms.ActiveCfg = Release|Win32 diff --git a/Code/Game/DanBiasGame/DanBiasGame.vcxproj b/Code/Game/DanBiasGame/DanBiasGame.vcxproj index c4ad8f96..ff05bc23 100644 --- a/Code/Game/DanBiasGame/DanBiasGame.vcxproj +++ b/Code/Game/DanBiasGame/DanBiasGame.vcxproj @@ -192,26 +192,26 @@ - + + + + - - - - - + + + + - - diff --git a/Code/Game/DanBiasGame/DanBiasGame_Impl.cpp b/Code/Game/DanBiasGame/DanBiasGame_Impl.cpp index 1729708d..f3792db6 100644 --- a/Code/Game/DanBiasGame/DanBiasGame_Impl.cpp +++ b/Code/Game/DanBiasGame/DanBiasGame_Impl.cpp @@ -30,38 +30,38 @@ namespace DanBias void ProtocolRecievedCallback(Oyster::Network::CustomNetProtocol& p) override { - int pType = p[0].value.netInt; - Client::GameClientState::ProtocolStruct* protocol; - switch (pType) - { - case protocol_PlayerNavigation: + int pType = p[0].value.netInt; + Client::GameClientState::ProtocolStruct* protocol; + switch (pType) + { + case protocol_PlayerNavigation: - break; - case protocol_PlayerPosition: - protocol = new Client::GameClientState::PlayerPos; - for(int i = 0; i< 3; i++) - { - ((Client::GameClientState::PlayerPos*)protocol)->playerPos[i] = p[i].value.netFloat; - } - gameClientState->Protocol(protocol); - delete protocol; - protocol = NULL; - break; + break; + case protocol_PlayerPosition: + protocol = new Client::GameClientState::PlayerPos; + for(int i = 0; i< 3; i++) + { + ((Client::GameClientState::PlayerPos*)protocol)->playerPos[i] = p[i].value.netFloat; + } + gameClientState->Protocol(protocol); + delete protocol; + protocol = NULL; + break; - case protocol_ObjectPosition: - protocol = new Client::GameClientState::ObjPos; - for(int i = 0; i< 16; i++) - { - ((Client::GameClientState::ObjPos*)protocol)->worldPos[i] = p[i].value.netFloat; - } - gameClientState->Protocol(protocol); - delete protocol; - protocol = NULL; - break; + case protocol_ObjectPosition: + protocol = new Client::GameClientState::ObjPos; + for(int i = 0; i< 16; i++) + { + ((Client::GameClientState::ObjPos*)protocol)->worldPos[i] = p[i].value.netFloat; + } + gameClientState->Protocol(protocol); + delete protocol; + protocol = NULL; + break; - default: - break; + default: + break; } @@ -112,12 +112,12 @@ namespace DanBias prevTimeStamp = 0; QueryPerformanceCounter((LARGE_INTEGER*)&prevTimeStamp); - - // Start in lobby state - m_data->gameClientState = new Client::LobbyState(); - m_data->gameClientState->Init(); m_data->r = new MyRecieverObject; m_data->r->nwClient = new Oyster::Network::NetworkClient(); + // Start in lobby state + m_data->gameClientState = new Client::LobbyState(); + m_data->gameClientState->Init(m_data->r->nwClient); + return DanBiasClientReturn_Sucess; } @@ -253,7 +253,7 @@ namespace DanBias return E_FAIL; break; } - m_data->gameClientState->Init(); // send game client + m_data->gameClientState->Init(m_data->r->nwClient); // send game client } return S_OK; diff --git a/Code/Game/DanBiasGame/GameClientState/C_obj/C_DynamicObj.cpp b/Code/Game/DanBiasGame/GameClientState/C_obj/C_DynamicObj.cpp new file mode 100644 index 00000000..686bbca9 --- /dev/null +++ b/Code/Game/DanBiasGame/GameClientState/C_obj/C_DynamicObj.cpp @@ -0,0 +1,42 @@ +#include "C_DynamicObj.h" +#include "DllInterfaces/GFXAPI.h" +using namespace DanBias::Client; +struct C_DynamicObj::myData +{ + myData(){} + Oyster::Graphics::Model::Model *model; + // light + // sound + // effect +}privData; +C_DynamicObj::C_DynamicObj(void) +{ +} + + +C_DynamicObj::~C_DynamicObj(void) +{ + +} +void C_DynamicObj::Init(ModelInitData modelInit) +{ + // load models + privData = new myData(); + privData->model = Oyster::Graphics::API::CreateModel(modelInit.modelPath); + privData->model->WorldMatrix = modelInit.world; + privData->model->Visible = modelInit.visible; +} +void C_DynamicObj::setPos() +{ + +} + +void C_DynamicObj::Render() +{ + Oyster::Graphics::API::RenderModel(*(privData->model)); +} +void C_DynamicObj::Release() +{ + Oyster::Graphics::API::DeleteModel(privData->model); + delete privData; +} \ No newline at end of file diff --git a/Code/Game/DanBiasGame/GameClientState/C_obj/C_DynamicObj.h b/Code/Game/DanBiasGame/GameClientState/C_obj/C_DynamicObj.h new file mode 100644 index 00000000..ca0f3b8c --- /dev/null +++ b/Code/Game/DanBiasGame/GameClientState/C_obj/C_DynamicObj.h @@ -0,0 +1,22 @@ +#ifndef DANBIAS_CLIENT_CDYNAMICOBJECT_H +#define DANBIAS_CLIENT_CDYNAMICOBJECT_H +#include "../C_Object.h" +namespace DanBias +{ + namespace Client + { +class C_DynamicObj : public C_Object +{ +private: + struct myData; + myData* privData; +public: + C_DynamicObj(void); + virtual ~C_DynamicObj(void); + void Init(ModelInitData modelInit); + void setPos(); + + void Render(); + void Release(); +};};}; +#endif diff --git a/Code/Game/DanBiasGame/GameClientState/C_obj/C_Player.cpp b/Code/Game/DanBiasGame/GameClientState/C_obj/C_Player.cpp new file mode 100644 index 00000000..e47d98ef --- /dev/null +++ b/Code/Game/DanBiasGame/GameClientState/C_obj/C_Player.cpp @@ -0,0 +1,46 @@ +#include "C_Player.h" +#include "DllInterfaces/GFXAPI.h" +using namespace DanBias::Client; + +struct C_Player::myData +{ + myData(){} + Oyster::Math3D::Float4x4 view; + Oyster::Math3D::Float4x4 proj; + Oyster::Graphics::Model::Model *model; +}privData; + +C_Player::C_Player(void) +{ +} + + +C_Player::~C_Player(void) +{ + +} + +void C_Player::Init(ModelInitData modelInit) +{ + // load models + privData = new myData(); + privData->model = Oyster::Graphics::API::CreateModel(modelInit.modelPath); + privData->model->WorldMatrix = modelInit.world; + privData->model->Visible = modelInit.visible; + + +} +void C_Player::setPos() +{ + +} + +void C_Player::Render() +{ + Oyster::Graphics::API::RenderModel(*(privData->model)); +} +void C_Player::Release() +{ + Oyster::Graphics::API::DeleteModel(privData->model); + delete privData; +} diff --git a/Code/Game/DanBiasGame/GameClientState/C_obj/C_Player.h b/Code/Game/DanBiasGame/GameClientState/C_obj/C_Player.h new file mode 100644 index 00000000..5d9c9d59 --- /dev/null +++ b/Code/Game/DanBiasGame/GameClientState/C_obj/C_Player.h @@ -0,0 +1,25 @@ +#ifndef DANBIAS_CLIENT_CPLAYER_H +#define DANBIAS_CLIENT_CPLAYER_H +#include "../C_Object.h" +namespace DanBias +{ + namespace Client + { +class C_Player : public C_Object +{ +private: + struct myData; + myData* privData; + //Oyster::Graphics:: LIght +public: + C_Player(void); + ~C_Player(void); + void Init(ModelInitData modelInit); + void setPos(); + + void Render(); + void Release(); + +};};}; +#endif + diff --git a/Code/Game/DanBiasGame/GameClientState/C_obj/C_StaticObj.cpp b/Code/Game/DanBiasGame/GameClientState/C_obj/C_StaticObj.cpp new file mode 100644 index 00000000..54c36c2a --- /dev/null +++ b/Code/Game/DanBiasGame/GameClientState/C_obj/C_StaticObj.cpp @@ -0,0 +1,45 @@ + +#include "C_StaticObj.h" +#include "DllInterfaces/GFXAPI.h" +using namespace DanBias::Client; + +struct C_StaticObj::myData +{ + myData(){} + Oyster::Graphics::Model::Model *model; + // light + // sound + // effect +}privData; +C_StaticObj::C_StaticObj(void) +{ +} + + +C_StaticObj::~C_StaticObj(void) +{ + +} +void C_StaticObj::Init(ModelInitData modelInit) +{ + // load models + privData = new myData(); + privData->model = Oyster::Graphics::API::CreateModel(modelInit.modelPath); + privData->model->WorldMatrix = modelInit.world; + privData->model->Visible = modelInit.visible; + +} +void C_StaticObj::setPos() +{ + +} + +void C_StaticObj::Render() +{ + Oyster::Graphics::API::RenderModel(*(privData->model)); +} +void C_StaticObj::Release() +{ + Oyster::Graphics::API::DeleteModel(privData->model); + delete privData; +} \ No newline at end of file diff --git a/Code/Game/DanBiasGame/GameClientState/C_obj/C_StaticObj.h b/Code/Game/DanBiasGame/GameClientState/C_obj/C_StaticObj.h new file mode 100644 index 00000000..768344f0 --- /dev/null +++ b/Code/Game/DanBiasGame/GameClientState/C_obj/C_StaticObj.h @@ -0,0 +1,22 @@ +#ifndef DANBIAS_CLIENT_CSTATICOBJECT_H +#define DANBIAS_CLIENT_CSTATICOBJECT_H +#include "../C_Object.h" +namespace DanBias +{ + namespace Client + { +class C_StaticObj : public C_Object +{ +private: + struct myData; + myData* privData; +public: + C_StaticObj(void); + virtual ~C_StaticObj(void); + void Init(ModelInitData modelInit); + void setPos(); + + void Render(); + void Release(); +};};}; +#endif \ No newline at end of file diff --git a/Code/Game/DanBiasGame/GameClientState/C_obj/C_UIobject.cpp b/Code/Game/DanBiasGame/GameClientState/C_obj/C_UIobject.cpp new file mode 100644 index 00000000..b07ec6fa --- /dev/null +++ b/Code/Game/DanBiasGame/GameClientState/C_obj/C_UIobject.cpp @@ -0,0 +1,43 @@ +#include "C_UIobject.h" +#include "DllInterfaces/GFXAPI.h" +using namespace DanBias::Client; + +struct C_UIobject::myData +{ + myData(){} + Oyster::Math3D::Float4x4 view; + Oyster::Math3D::Float4x4 proj; + Oyster::Graphics::Model::Model *model; +}privData; + +C_UIobject::C_UIobject(void) +{ +} + + +C_UIobject::~C_UIobject(void) +{ +} +void C_UIobject::Init(ModelInitData modelInit) +{ + // load models + privData = new myData(); + privData->model = Oyster::Graphics::API::CreateModel(modelInit.modelPath); + privData->model->WorldMatrix = modelInit.world; + privData->model->Visible = modelInit.visible; + +} +void C_UIobject::setPos() +{ + +} + +void C_UIobject::Render() +{ + Oyster::Graphics::API::RenderModel(*(privData->model)); +} +void C_UIobject::Release() +{ + Oyster::Graphics::API::DeleteModel(privData->model); + delete privData; +} \ No newline at end of file diff --git a/Code/Game/DanBiasGame/GameClientState/C_obj/C_UIobject.h b/Code/Game/DanBiasGame/GameClientState/C_obj/C_UIobject.h new file mode 100644 index 00000000..203b5398 --- /dev/null +++ b/Code/Game/DanBiasGame/GameClientState/C_obj/C_UIobject.h @@ -0,0 +1,22 @@ +#ifndef DANBIAS_CLIENT_CUIOBJECT_H +#define DANBIAS_CLIENT_CUIOBJECT_H +#include "../C_Object.h" +namespace DanBias +{ + namespace Client + { + class C_UIobject : public C_Object + { + private: + struct myData; + myData* privData; + public: + C_UIobject(void); + virtual ~C_UIobject(void); + void Init(ModelInitData modelInit); + void setPos(); + + void Render(); + void Release(); +};};}; +#endif \ No newline at end of file diff --git a/Code/Game/DanBiasGame/GameClientState/GameClientState.h b/Code/Game/DanBiasGame/GameClientState/GameClientState.h index 4e0d723b..368fca6a 100644 --- a/Code/Game/DanBiasGame/GameClientState/GameClientState.h +++ b/Code/Game/DanBiasGame/GameClientState/GameClientState.h @@ -3,6 +3,7 @@ #define NOMINMAX #include "L_inputClass.h" +#include "NetworkClient.h" namespace DanBias { @@ -42,7 +43,7 @@ public: public: GameClientState(void); virtual ~GameClientState(void); - virtual bool Init() = 0; + virtual bool Init(Oyster::Network::NetworkClient* nwClient) = 0; virtual ClientState Update(float deltaTime, InputClass* KeyInput) = 0; virtual bool Render() = 0; virtual bool Release() = 0; diff --git a/Code/Game/DanBiasGame/GameClientState/GameState.cpp b/Code/Game/DanBiasGame/GameClientState/GameState.cpp index 64b1babb..588e6ab8 100644 --- a/Code/Game/DanBiasGame/GameClientState/GameState.cpp +++ b/Code/Game/DanBiasGame/GameClientState/GameState.cpp @@ -1,7 +1,7 @@ #include "GameState.h" #include "DllInterfaces/GFXAPI.h" -#include "Obj/C_Player.h" -#include "Obj/C_DynamicObj.h" +#include "C_obj/C_Player.h" +#include "C_obj/C_DynamicObj.h" #include "NetworkClient.h" #include "PlayerProtocols.h" @@ -28,11 +28,12 @@ GameState::~GameState(void) { } -bool GameState::Init() +bool GameState::Init(Oyster::Network::NetworkClient* nwClient) { // load models privData = new myData(); privData->state = gameStateState_loading; + privData->nwClient = nwClient; privData->state = LoadGame(); return true; } @@ -92,12 +93,37 @@ GameClientState::ClientState GameState::Update(float deltaTime, InputClass* KeyI // update objects // Client.send(obj); { - GameLogic::Protocol_PlayerMovement movePlayer; - - //privData->nwClient->Send(movePlayer); + GameLogic::Protocol_PlayerMovement movePlayer; + movePlayer.bForward = false; + movePlayer.bBackward = false; + movePlayer.bStrafeLeft = false; + movePlayer.bStrafeRight = false; + movePlayer.bTurnLeft = false; + movePlayer.bTurnRight = false; - if(KeyInput->IsKeyPressed(DIK_L)) - privData->state = GameState::gameStateState_end; + + if(KeyInput->IsKeyPressed(DIK_W)) + { + movePlayer.bForward = true; + } + if(KeyInput->IsKeyPressed(DIK_S)) + { + movePlayer.bBackward = true; + } + if(KeyInput->IsKeyPressed(DIK_A)) + { + movePlayer.bStrafeLeft = true; + } + if(KeyInput->IsKeyPressed(DIK_D)) + { + movePlayer.bStrafeRight = true; + } + + + privData->nwClient->Send(movePlayer); + + if(KeyInput->IsKeyPressed(DIK_L)) + privData->state = GameState::gameStateState_end; } break; case gameStateState_end: diff --git a/Code/Game/DanBiasGame/GameClientState/GameState.h b/Code/Game/DanBiasGame/GameClientState/GameState.h index 26ec0caa..05f9ac3d 100644 --- a/Code/Game/DanBiasGame/GameClientState/GameState.h +++ b/Code/Game/DanBiasGame/GameClientState/GameState.h @@ -22,7 +22,7 @@ private: public: GameState(void); ~GameState(void); - bool Init(); + bool Init(Oyster::Network::NetworkClient* nwClient); GameClientState::ClientState Update(float deltaTime, InputClass* KeyInput) override; bool LoadModels(std::wstring mapFile) ; bool InitCamera(Oyster::Math::Float3 startPos) ; diff --git a/Code/Game/DanBiasGame/GameClientState/LobbyState.cpp b/Code/Game/DanBiasGame/GameClientState/LobbyState.cpp index 8d54bd24..2c07c27f 100644 --- a/Code/Game/DanBiasGame/GameClientState/LobbyState.cpp +++ b/Code/Game/DanBiasGame/GameClientState/LobbyState.cpp @@ -1,9 +1,9 @@ #include "LobbyState.h" #include "DllInterfaces/GFXAPI.h" #include "OysterMath.h" -#include "Obj/C_Player.h" -#include "Obj/C_StaticObj.h" -#include "Obj/C_DynamicObj.h" +#include "C_obj/C_Player.h" +#include "C_obj/C_StaticObj.h" +#include "C_obj/C_DynamicObj.h" using namespace DanBias::Client; @@ -28,7 +28,7 @@ LobbyState::~LobbyState(void) } -bool LobbyState::Init() +bool LobbyState::Init(Oyster::Network::NetworkClient* nwClient) { privData = new myData(); diff --git a/Code/Game/DanBiasGame/GameClientState/LobbyState.h b/Code/Game/DanBiasGame/GameClientState/LobbyState.h index c00a3b8f..e7cb7b8c 100644 --- a/Code/Game/DanBiasGame/GameClientState/LobbyState.h +++ b/Code/Game/DanBiasGame/GameClientState/LobbyState.h @@ -17,7 +17,7 @@ private: public: LobbyState(void); ~LobbyState(void); - bool Init(); + bool Init(Oyster::Network::NetworkClient* nwClient); bool LoadModels(std::wstring file); bool InitCamera(Oyster::Math::Float3 startPos); ClientState Update(float deltaTime, InputClass* KeyInput); diff --git a/Code/Game/DanBiasGame/Include/DanBiasGame.h b/Code/Game/DanBiasGame/Include/DanBiasGame.h index a8d1a96f..206a21e8 100644 --- a/Code/Game/DanBiasGame/Include/DanBiasGame.h +++ b/Code/Game/DanBiasGame/Include/DanBiasGame.h @@ -1,7 +1,7 @@ #ifndef DANBIASGAME_DANBIASGAME_H #define DANBIASGAME_DANBIASGAME_H -#define DANBIAS_CLIENT_L +#define DANBIAS_CLIENT #if defined (DANBIAS_GAME_DLL_EXPORT) #define DANBIAS_GAME_DLL __declspec(dllexport) diff --git a/Code/Game/DanBiasLauncher/Launcher.cpp b/Code/Game/DanBiasLauncher/Launcher.cpp index 0efd5e2e..a970d372 100644 --- a/Code/Game/DanBiasLauncher/Launcher.cpp +++ b/Code/Game/DanBiasLauncher/Launcher.cpp @@ -6,8 +6,8 @@ #include -#include "DanBiasServerAPI.h" -//#include "DanBiasGame.h" +//#include "DanBiasServerAPI.h" +#include "DanBiasGame.h" int WINAPI WinMain( HINSTANCE hinst, HINSTANCE prevInst, PSTR cmdLine, int cmdShow) @@ -22,7 +22,7 @@ int WINAPI WinMain( HINSTANCE hinst, HINSTANCE prevInst, PSTR cmdLine, int cmdSh DanBias::DanBiasServerAPI::Run(); DanBias::DanBiasServerAPI::Release(); } -#elif defined(DANBIAS_CLIENT_L) +#elif defined(DANBIAS_CLIENT) if(SetDllDirectory(L"..\\DLL") == FALSE) { return cmdShow; From 8a8cfcc5d66129b96347a5394688f3430a634c4a Mon Sep 17 00:00:00 2001 From: Pontus Fransson Date: Mon, 16 Dec 2013 09:48:41 +0100 Subject: [PATCH 4/7] Network - Forgot to use Initiateclient(). --- Code/Network/NetworkAPI/NetworkClient.cpp | 2 + .../OysterNetworkClient/ClientMain.cpp | 5 +- .../ClientMain.cpp.BACKUP.7056.cpp | 65 ------------------- .../ClientMain.cpp.BASE.7056.cpp | 61 ----------------- .../ClientMain.cpp.LOCAL.7056.cpp | 57 ---------------- .../ClientMain.cpp.REMOTE.7056.cpp | 62 ------------------ 6 files changed, 5 insertions(+), 247 deletions(-) delete mode 100644 Code/Network/OysterNetworkClient/ClientMain.cpp.BACKUP.7056.cpp delete mode 100644 Code/Network/OysterNetworkClient/ClientMain.cpp.BASE.7056.cpp delete mode 100644 Code/Network/OysterNetworkClient/ClientMain.cpp.LOCAL.7056.cpp delete mode 100644 Code/Network/OysterNetworkClient/ClientMain.cpp.REMOTE.7056.cpp diff --git a/Code/Network/NetworkAPI/NetworkClient.cpp b/Code/Network/NetworkAPI/NetworkClient.cpp index aed1046f..e99ab502 100644 --- a/Code/Network/NetworkAPI/NetworkClient.cpp +++ b/Code/Network/NetworkAPI/NetworkClient.cpp @@ -49,6 +49,7 @@ struct ClientDataContainer callbackType = NetworkProtocolCallbackType_Unknown; sendPostBox = new PostBox(); connection.SetBlockingMode(false); + connection.InitiateClient(); } ClientDataContainer(IThreadObject* o, unsigned int socket ) :connection(socket), ID(currID++) @@ -56,6 +57,7 @@ struct ClientDataContainer InitWinSock(); callbackType = NetworkProtocolCallbackType_Unknown; sendPostBox = new PostBox(); + connection.InitiateClient(); connection.SetBlockingMode(false); } ~ClientDataContainer() diff --git a/Code/Network/OysterNetworkClient/ClientMain.cpp b/Code/Network/OysterNetworkClient/ClientMain.cpp index 45e59e3a..31e499cc 100644 --- a/Code/Network/OysterNetworkClient/ClientMain.cpp +++ b/Code/Network/OysterNetworkClient/ClientMain.cpp @@ -41,11 +41,12 @@ int main() errorCode = client.Connect(15151, "127.0.0.1"); client.SetRecieverObject(proc, NetworkProtocolCallbackType_Function); - if(errorCode != 0) + if(errorCode != 1) { + printf("%d", errorCode); cout << "FAILED" << endl; } - client.SetRecieverObject(proc, NetworkProtocolCallbackType_Function); + //client.SetRecieverObject(proc, NetworkProtocolCallbackType_Function); cout << "Done" << endl; diff --git a/Code/Network/OysterNetworkClient/ClientMain.cpp.BACKUP.7056.cpp b/Code/Network/OysterNetworkClient/ClientMain.cpp.BACKUP.7056.cpp deleted file mode 100644 index 581f41ad..00000000 --- a/Code/Network/OysterNetworkClient/ClientMain.cpp.BACKUP.7056.cpp +++ /dev/null @@ -1,65 +0,0 @@ -#include -#include -#include -#include "../NetworkDependencies/WinsockFunctions.h" -#include "..\NetworkDependencies\Protocols.h" -#include "../NetworkDependencies/OysterByte.h" -#include "../../Misc/ThreadSafeQueue.h" -#include "../NetworkDependencies/ThreadedClient.h" -#include "../../Misc/WinTimer.h" -#include "../../Misc/Utilities.h" -#include "../NetworkAPI/NetworkClient.h" - -#pragma comment(lib, "ws2_32.lib") - -using namespace std; -using namespace Oyster::Network::Protocols; -using namespace Oyster::Network; -using namespace Utility; -using namespace Utility::DynamicMemory; - -void proc(CustomNetProtocol& protocol) -{ - -} - -int main() -{ - int errorCode; - - char msgRecv[255] = "\0"; - - InitWinSock(); - - cout << "Client" << endl; - - //Create Client - NetworkClient client; - - //Connect to server -<<<<<<< HEAD - if(client.Connect(15151, "localhost")) -======= - //errorCode = client->Connect(15151, "193.11.186.101"); - errorCode = client.Connect(15151, "127.0.0.1"); - client.SetRecieverObject(proc, NetworkProtocolCallbackType_Function); - - if(errorCode != 0) ->>>>>>> 9eb8fcba40e4dec4f338cd012ba69bc15d456cc9 - { - cout << "FAILED" << endl; - } - client.SetRecieverObject(proc, NetworkProtocolCallbackType_Function); - - cout << "Done" << endl; - - while(1) - { - - } - - ShutdownWinSock(); - - system("pause"); - return 0; -} \ No newline at end of file diff --git a/Code/Network/OysterNetworkClient/ClientMain.cpp.BASE.7056.cpp b/Code/Network/OysterNetworkClient/ClientMain.cpp.BASE.7056.cpp deleted file mode 100644 index 2b75c92d..00000000 --- a/Code/Network/OysterNetworkClient/ClientMain.cpp.BASE.7056.cpp +++ /dev/null @@ -1,61 +0,0 @@ -#include -#include -#include -#include "../NetworkDependencies/WinsockFunctions.h" -#include "..\NetworkDependencies\Protocols.h" -#include "../NetworkDependencies/OysterByte.h" -#include "../../Misc/ThreadSafeQueue.h" -#include "../NetworkDependencies/ThreadedClient.h" -#include "../../Misc/WinTimer.h" -#include "../../Misc/Utilities.h" -#include "../NetworkAPI/NetworkClient.h" - -#pragma comment(lib, "ws2_32.lib") - -using namespace std; -using namespace Oyster::Network::Protocols; -using namespace Oyster::Network; -using namespace Utility; -using namespace Utility::DynamicMemory; - -void chat(ThreadedClient &client); -void PrintOutMessage(ProtocolSet* set); - -void proc(CustomNetProtocol& protocol) -{ - -} - -int main() -{ - int errorCode; - - char msgRecv[255] = "\0"; - - InitWinSock(); - - cout << "Client" << endl; - - //Create Client - NetworkClient client; - - //Connect to server - errorCode = client.Connect(15151, "193.11.186.101"); - client.SetRecieverObject(proc, NetworkProtocolCallbackType_Function); - - if(errorCode != 0) - { - wstring errorTest = GetErrorMessage(errorCode); - wcout << "errorMessage: " << errorTest << endl; - } - - while(1) - { - - } - - ShutdownWinSock(); - - system("pause"); - return 0; -} \ No newline at end of file diff --git a/Code/Network/OysterNetworkClient/ClientMain.cpp.LOCAL.7056.cpp b/Code/Network/OysterNetworkClient/ClientMain.cpp.LOCAL.7056.cpp deleted file mode 100644 index b2f4c4bd..00000000 --- a/Code/Network/OysterNetworkClient/ClientMain.cpp.LOCAL.7056.cpp +++ /dev/null @@ -1,57 +0,0 @@ -#include -#include -#include -#include "../NetworkDependencies/WinsockFunctions.h" -#include "..\NetworkDependencies\Protocols.h" -#include "../NetworkDependencies/OysterByte.h" -#include "../../Misc/ThreadSafeQueue.h" -#include "../NetworkDependencies/ThreadedClient.h" -#include "../../Misc/WinTimer.h" -#include "../../Misc/Utilities.h" -#include "../NetworkAPI/NetworkClient.h" - -#pragma comment(lib, "ws2_32.lib") - -using namespace std; -using namespace Oyster::Network::Protocols; -using namespace Oyster::Network; -using namespace Utility; -using namespace Utility::DynamicMemory; - -void proc(CustomNetProtocol& protocol) -{ - -} - -int main() -{ - int errorCode; - - char msgRecv[255] = "\0"; - - InitWinSock(); - - cout << "Client" << endl; - - //Create Client - NetworkClient client; - - //Connect to server - if(client.Connect(15151, "localhost")) - { - cout << "FAILED" << endl; - } - client.SetRecieverObject(proc, NetworkProtocolCallbackType_Function); - - cout << "Done" << endl; - - while(1) - { - - } - - ShutdownWinSock(); - - system("pause"); - return 0; -} \ No newline at end of file diff --git a/Code/Network/OysterNetworkClient/ClientMain.cpp.REMOTE.7056.cpp b/Code/Network/OysterNetworkClient/ClientMain.cpp.REMOTE.7056.cpp deleted file mode 100644 index 2274fb5e..00000000 --- a/Code/Network/OysterNetworkClient/ClientMain.cpp.REMOTE.7056.cpp +++ /dev/null @@ -1,62 +0,0 @@ -#include -#include -#include -#include "../NetworkDependencies/WinsockFunctions.h" -#include "..\NetworkDependencies\Protocols.h" -#include "../NetworkDependencies/OysterByte.h" -#include "../../Misc/ThreadSafeQueue.h" -#include "../NetworkDependencies/ThreadedClient.h" -#include "../../Misc/WinTimer.h" -#include "../../Misc/Utilities.h" -#include "../NetworkAPI/NetworkClient.h" - -#pragma comment(lib, "ws2_32.lib") - -using namespace std; -using namespace Oyster::Network::Protocols; -using namespace Oyster::Network; -using namespace Utility; -using namespace Utility::DynamicMemory; - -void chat(ThreadedClient &client); -void PrintOutMessage(ProtocolSet* set); - -void proc(CustomNetProtocol& protocol) -{ - -} - -int main() -{ - int errorCode; - - char msgRecv[255] = "\0"; - - InitWinSock(); - - cout << "Client" << endl; - - //Create Client - NetworkClient client; - - //Connect to server - //errorCode = client->Connect(15151, "193.11.186.101"); - errorCode = client.Connect(15151, "127.0.0.1"); - client.SetRecieverObject(proc, NetworkProtocolCallbackType_Function); - - if(errorCode != 0) - { - wstring errorTest = GetErrorMessage(errorCode); - wcout << "errorMessage: " << errorTest << endl; - } - - while(1) - { - - } - - ShutdownWinSock(); - - system("pause"); - return 0; -} \ No newline at end of file From 7cda07507a674fabb0929a2e3e1be025451170aa Mon Sep 17 00:00:00 2001 From: dean11 Date: Mon, 16 Dec 2013 09:50:23 +0100 Subject: [PATCH 5/7] GameLogic - Pre merge with Netowkr --- .../ServerObjects/Lobby/MainLobby.cpp | 29 ++++++++++--------- .../ServerObjects/Lobby/MainLobby.h | 2 +- .../GameProtocols/ProtocolIdentificationID.h | 14 ++++----- Code/Misc/PostBox/PostBox.h | 2 +- 4 files changed, 24 insertions(+), 23 deletions(-) diff --git a/Code/Game/DanBiasServer/ServerObjects/Lobby/MainLobby.cpp b/Code/Game/DanBiasServer/ServerObjects/Lobby/MainLobby.cpp index e7edddd4..97033790 100644 --- a/Code/Game/DanBiasServer/ServerObjects/Lobby/MainLobby.cpp +++ b/Code/Game/DanBiasServer/ServerObjects/Lobby/MainLobby.cpp @@ -18,25 +18,26 @@ namespace DanBias void MainLobby::Frame() { - if(!this->box.IsEmpty()) - { - NetEvent &e = this->box.Fetch(); - ParseEvent(e); - } + ParseEvents(); } //////// Private - void MainLobby::ParseEvent(NetEvent& e) + void MainLobby::ParseEvents() { - static const short i = MAXSHORT; - if(e.protocol[0].type != Oyster::Network::NetAttributeType_Short) return; - - short f = e.protocol[0].value.netShort; - - switch (f) + if(!this->box.IsEmpty()) { - default: - break; + NetEvent &e = this->box.Fetch(); + + if(e.protocol[0].type != Oyster::Network::NetAttributeType_Short) return; + + short f = e.protocol[0].value.netShort; + + switch (f) + { + default: + + break; + } } } diff --git a/Code/Game/DanBiasServer/ServerObjects/Lobby/MainLobby.h b/Code/Game/DanBiasServer/ServerObjects/Lobby/MainLobby.h index 8e8b520a..c78f70e2 100644 --- a/Code/Game/DanBiasServer/ServerObjects/Lobby/MainLobby.h +++ b/Code/Game/DanBiasServer/ServerObjects/Lobby/MainLobby.h @@ -15,7 +15,7 @@ namespace DanBias void Frame(); private: - void ParseEvent(NetEvent& e); + void ParseEvents(); }; }//End namespace DanBias diff --git a/Code/Game/GameProtocols/ProtocolIdentificationID.h b/Code/Game/GameProtocols/ProtocolIdentificationID.h index 09f1aeed..cb90fa7f 100644 --- a/Code/Game/GameProtocols/ProtocolIdentificationID.h +++ b/Code/Game/GameProtocols/ProtocolIdentificationID.h @@ -7,15 +7,15 @@ /* THERE CAN ABSOLUTLEY NOT BE TWO DEFINITIONS WITH THE SAME ID!! */ -#define protocol_PlayerNavigation 0 -#define protocol_PlayerPosition 1 -#define protocol_ObjectPosition 2 +#define protocol_Gamplay_PlayerNavigation 0 +#define protocol_Gamplay_PlayerPosition 1 +#define protocol_Gamplay_ObjectPosition 2 -#define protocol_Lobby_Msg 60 +#define protocol_Lobby_Msg 100 -#define protocol_General_Disconnect 100 -#define protocol_General_Ping 101 +#define protocol_General_Disconnect 200 +#define protocol_General_Ping 201 -#define PROTOCOL_TEST 1000 +#define PROTOCOL_TEST 1000 #endif // !GAMEPROTOCOL_PROTOCOL_DEFINITION_ID_H diff --git a/Code/Misc/PostBox/PostBox.h b/Code/Misc/PostBox/PostBox.h index c01eeead..1e8dfb74 100644 --- a/Code/Misc/PostBox/PostBox.h +++ b/Code/Misc/PostBox/PostBox.h @@ -54,7 +54,7 @@ namespace Oyster template bool PostBox::IsEmpty() { - return !messages.IsEmpty(); + return messages.IsEmpty(); } } From b60166a6e807f4630e70134a3eea7936db0fc157 Mon Sep 17 00:00:00 2001 From: Linda Andersson Date: Mon, 16 Dec 2013 09:55:51 +0100 Subject: [PATCH 6/7] GL - connect to server, need right IP --- Code/Game/DanBiasGame/DanBiasGame_Impl.cpp | 32 ++++++++++++--------- Code/Game/DanBiasGame/Include/DanBiasGame.h | 1 + Code/Game/DanBiasLauncher/Launcher.cpp | 1 + 3 files changed, 20 insertions(+), 14 deletions(-) diff --git a/Code/Game/DanBiasGame/DanBiasGame_Impl.cpp b/Code/Game/DanBiasGame/DanBiasGame_Impl.cpp index f3792db6..15e799bf 100644 --- a/Code/Game/DanBiasGame/DanBiasGame_Impl.cpp +++ b/Code/Game/DanBiasGame/DanBiasGame_Impl.cpp @@ -31,40 +31,38 @@ namespace DanBias { int pType = p[0].value.netInt; - Client::GameClientState::ProtocolStruct* protocol; + Client::GameClientState::ProtocolStruct* protocolData; switch (pType) { case protocol_PlayerNavigation: break; case protocol_PlayerPosition: - protocol = new Client::GameClientState::PlayerPos; + protocolData = new Client::GameClientState::PlayerPos; for(int i = 0; i< 3; i++) { - ((Client::GameClientState::PlayerPos*)protocol)->playerPos[i] = p[i].value.netFloat; + ((Client::GameClientState::PlayerPos*)protocolData)->playerPos[i] = p[i].value.netFloat; } - gameClientState->Protocol(protocol); - delete protocol; - protocol = NULL; + gameClientState->Protocol(protocolData); + delete protocolData; + protocolData = NULL; break; case protocol_ObjectPosition: - protocol = new Client::GameClientState::ObjPos; + protocolData = new Client::GameClientState::ObjPos; for(int i = 0; i< 16; i++) { - ((Client::GameClientState::ObjPos*)protocol)->worldPos[i] = p[i].value.netFloat; + ((Client::GameClientState::ObjPos*)protocolData)->worldPos[i] = p[i].value.netFloat; } - gameClientState->Protocol(protocol); - delete protocol; - protocol = NULL; + gameClientState->Protocol(protocolData); + delete protocolData; + protocolData = NULL; break; default: break; - } - - + } } }; class DanBiasGamePrivateData @@ -114,6 +112,12 @@ namespace DanBias m_data->r = new MyRecieverObject; m_data->r->nwClient = new Oyster::Network::NetworkClient(); + m_data->r->nwClient->Connect(desc.port, desc.IP); + if (!m_data->r->nwClient->IsConnected()) + { + // failed to connect + return DanBiasClientReturn_Error; + } // Start in lobby state m_data->gameClientState = new Client::LobbyState(); m_data->gameClientState->Init(m_data->r->nwClient); diff --git a/Code/Game/DanBiasGame/Include/DanBiasGame.h b/Code/Game/DanBiasGame/Include/DanBiasGame.h index 206a21e8..f146f343 100644 --- a/Code/Game/DanBiasGame/Include/DanBiasGame.h +++ b/Code/Game/DanBiasGame/Include/DanBiasGame.h @@ -29,6 +29,7 @@ namespace DanBias { //Stuff goes here... int port; + const char* IP; HINSTANCE hinst; int nCmdShow; diff --git a/Code/Game/DanBiasLauncher/Launcher.cpp b/Code/Game/DanBiasLauncher/Launcher.cpp index a970d372..8ae0f29c 100644 --- a/Code/Game/DanBiasLauncher/Launcher.cpp +++ b/Code/Game/DanBiasLauncher/Launcher.cpp @@ -30,6 +30,7 @@ int WINAPI WinMain( HINSTANCE hinst, HINSTANCE prevInst, PSTR cmdLine, int cmdSh // Game client starter code goes here DanBias::DanBiasGameDesc gameDesc; gameDesc.port = 1; + gameDesc.IP = "10.1010.303"; gameDesc.hinst = hinst; gameDesc.nCmdShow = cmdShow; From 6bfe7711abf0ba454392ab77679711bc1a6c76e2 Mon Sep 17 00:00:00 2001 From: dean11 Date: Mon, 16 Dec 2013 10:02:30 +0100 Subject: [PATCH 7/7] Gamelogic - Modified gameprotocol id:s --- Code/Game/GameProtocols/PlayerProtocols.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Code/Game/GameProtocols/PlayerProtocols.h b/Code/Game/GameProtocols/PlayerProtocols.h index d620af81..f0464ffc 100644 --- a/Code/Game/GameProtocols/PlayerProtocols.h +++ b/Code/Game/GameProtocols/PlayerProtocols.h @@ -25,7 +25,7 @@ namespace GameLogic Protocol_PlayerMovement() { - this->protocol[0].value = ProtocolID = protocol_PlayerNavigation; + this->protocol[0].value = ProtocolID = protocol_Gamplay_PlayerNavigation; this->protocol[0].type = Oyster::Network::NetAttributeType_Int; this->protocol[1].type = Oyster::Network::NetAttributeType_Bool; @@ -58,7 +58,7 @@ namespace GameLogic Protocol_PlayerPosition() { - this->protocol[0].value = protocol_PlayerPosition; + this->protocol[0].value = protocol_Gamplay_PlayerPosition; this->protocol[0].type = Oyster::Network::NetAttributeType_Int; this->protocol[1].type = Oyster::Network::NetAttributeType_Float;