From 73acf25c7a0fdcc44cb144ca118cf0f6f2ba762e Mon Sep 17 00:00:00 2001 From: haydent Date: Wed, 21 May 2008 10:23:54 +0000 Subject: [PATCH] fixed up AI interrupts git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@2192 3b4a5df2-a311-0410-b5c6-a8a6f20db521 --- Multiplayer/client.cpp | 75 ++++++++++++++++++++++++++++++++++---- Multiplayer/fresh_header.h | 13 ++++++- Multiplayer/network.h | 5 ++- Multiplayer/server.cpp | 21 ++++++++++- Multiplayer/test_space.cpp | 4 +- Tactical/TeamTurns.cpp | 28 +++++++++----- TileEngine/worldman.cpp | 3 +- 7 files changed, 127 insertions(+), 22 deletions(-) diff --git a/Multiplayer/client.cpp b/Multiplayer/client.cpp index 14e416dd..cd65ad15 100644 --- a/Multiplayer/client.cpp +++ b/Multiplayer/client.cpp @@ -657,6 +657,7 @@ void recieveHIRE(RPCParameters *rpcParameters) gMercProfiles[ pSoldier->ubProfile ].ubMiscFlags |= PROFILE_MISC_FLAG_RECRUITED; if(!SAME_MERC)gMercProfiles[ pSoldier->ubProfile ].bMercStatus = MERC_WORKING_ELSEWHERE; pSoldier->bSide=0; //default coop only + gTacticalStatus.Team[MercCreateStruct.bTeam ].bSide=0; if(MercCreateStruct.ubProfile==64)//slay { @@ -669,11 +670,16 @@ void recieveHIRE(RPCParameters *rpcParameters) if(PLAYER_BSIDE==0)//all vs all only { pSoldier->bSide=1; + gTacticalStatus.Team[MercCreateStruct.bTeam ].bSide=1; } if(PLAYER_BSIDE==1) //allow teams { - if(sHireMerc->team != TEAM)pSoldier->bSide=1; + if(sHireMerc->team != TEAM) + { + pSoldier->bSide=1; + gTacticalStatus.Team[MercCreateStruct.bTeam ].bSide=1; + } } @@ -781,6 +787,7 @@ void send_EndTurn( UINT8 ubNextTeam ) turn_struct tStruct; + if(is_server)Sawarded=false; tStruct.tsnetbTeam = netbTeam; tStruct.tsubNextTeam = ubNextTeam; @@ -800,6 +807,7 @@ void recieveEndTurn(RPCParameters *rpcParameters) UINT8 ubTeam; sender_bTeam=tStruct->tsnetbTeam; ubTeam=tStruct->tsubNextTeam; + if(is_server)Sawarded=false; if(is_server || sender_bTeam==6) { @@ -1455,7 +1463,7 @@ void send_interrupt (SOLDIERTYPE *pSoldier) //if(gubOutOfTurnPersons>0)ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"Sent Int: bTeam-%d ubID-%d", INT.bTeam,INT.ubID ); - gTacticalStatus.ubCurrentTeam=INT.bTeam; + if(INT.bTeam !=netbTeam) gTacticalStatus.ubCurrentTeam=INT.bTeam; client->RPC("sendINTERRUPT",(const char*)&INT, (int)sizeof(INT_STRUCT)*8, HIGH_PRIORITY, RELIABLE, 0, UNASSIGNED_SYSTEM_ADDRESS, true, 0, UNASSIGNED_NETWORK_ID,0); @@ -1465,9 +1473,9 @@ void send_interrupt (SOLDIERTYPE *pSoldier) void recieveINTERRUPT (RPCParameters *rpcParameters) { INT_STRUCT* INT = (INT_STRUCT*)rpcParameters->input; - + SOLDIERTYPE* pOpponent = MercPtrs[ INT->Interrupted]; - if(INT->bTeam==netbTeam) + if(INT->bTeam==netbTeam)// ||pOpponent->bTeam==1 )//for us or AI { INT->bTeam=0; INT->ubID=INT->ubID - ubID_prefix; @@ -1484,7 +1492,7 @@ void recieveINTERRUPT (RPCParameters *rpcParameters) } - if( INT->bTeam !=0) + if( INT->bTeam != 0) { ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, MPClientMessage[17] ); //stop moving merc who was interrupted and init UI bar @@ -1499,6 +1507,11 @@ void recieveINTERRUPT (RPCParameters *rpcParameters) gTacticalStatus.fInterruptOccurred = TRUE; } + //else if ( pOpponent->bTeam == 1)// + //{ + // StartInterrupt(); + // ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"ai is interrupted" ); + //} else { //it for us ! :) @@ -1513,7 +1526,7 @@ void recieveINTERRUPT (RPCParameters *rpcParameters) ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, MPClientMessage[37] ); SOLDIERTYPE* pSoldier = MercPtrs[ INT->ubID ]; - SOLDIERTYPE* pOpponent = MercPtrs[ INT->Interrupted]; + //SOLDIERTYPE* pOpponent = MercPtrs[ INT->Interrupted]; ManSeesMan(pSoldier,pOpponent,pOpponent->sGridNo,pOpponent->pathing.bLevel,2,1); StartInterrupt(); } @@ -1523,6 +1536,21 @@ void recieveINTERRUPT (RPCParameters *rpcParameters) //if(INT->gubOutOfTurnPersons > 0)ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"Recieved Int: bTeam-%d ubID-%d", INT->bTeam,INT->ubID ); } +void intAI (SOLDIERTYPE *pSoldier ) + { + ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, MPClientMessage[17] ); + //stop moving merc who was interrupted and init UI bar + //SOLDIERTYPE* pMerc = MercPtrs[ INT->ubID ]; + ////AdjustNoAPToFinishMove( pMerc, TRUE ); + //pMerc->HaultSoldierFromSighting(TRUE); + //pMerc->fTurningFromPronePosition = FALSE;// hmmm ?? + //FreezeInterfaceForEnemyTurn(); + //InitEnemyUIBar( 0, 0 ); + //fInterfacePanelDirty = DIRTYLEVEL2; + AddTopMessage( COMPUTER_TURN_MESSAGE, TeamTurnString[ pSoldier->bTeam ] ); + gTacticalStatus.fInterruptOccurred = TRUE; + + } void end_interrupt ( BOOLEAN fMarkInterruptOccurred ) { @@ -1537,6 +1565,7 @@ void end_interrupt ( BOOLEAN fMarkInterruptOccurred ) memcpy(INT.gubOutOfTurnOrder, gubOutOfTurnOrder, sizeof(UINT8) * MAXMERCS); INT.gubOutOfTurnPersons = gubOutOfTurnPersons; INT.fMarkInterruptOccurred=fMarkInterruptOccurred; + if(is_server)Sawarded=false; if(INT.bTeam==0) { @@ -1562,8 +1591,9 @@ void end_interrupt ( BOOLEAN fMarkInterruptOccurred ) void resume_turn(RPCParameters *rpcParameters) { INT_STRUCT* INT = (INT_STRUCT*)rpcParameters->input; + if(is_server)Sawarded=false; - if(INT->bTeam==netbTeam)//may need working + if(INT->bTeam==netbTeam || (INT->bTeam==1 && is_server))//may need working { ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, MPClientMessage[18] ); @@ -1582,6 +1612,11 @@ void resume_turn(RPCParameters *rpcParameters) EndInterrupt( INT->fMarkInterruptOccurred ); } + else if(INT->bTeam==1) + { + ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"im not server but ai just got back its turn after being interrupted..." ); + //maybe can add something. + } } void grid_display ( void ) //print mouse coordinates, helpfull for crate placement. @@ -2625,6 +2660,31 @@ void recieve_heal (RPCParameters *rpcParameters) } + +void requestAIint(SOLDIERTYPE *pSoldier ) +{ + AIint data; + data.ubID=pSoldier->ubID; + data.bteam=netbTeam; + ScreenMsg( FONT_LTGREEN, MSG_INTERFACE, L"interrupt requested" ); + + client->RPC("rINT",(const char*)&data, (int)sizeof(AIint)*8, HIGH_PRIORITY, RELIABLE, 0, UNASSIGNED_SYSTEM_ADDRESS, true, 0, UNASSIGNED_NETWORK_ID,0); +} + +void awardINT (RPCParameters *rpcParameters) +{ + AIint* data= (AIint*)rpcParameters->input; + + SOLDIERTYPE *pSoldier = MercPtrs[ data->ubID ]; + + StartInterrupt(); + //send_EndTurn(netbTeam); + + ScreenMsg( FONT_LTGREEN, MSG_INTERFACE, L"interrupt awarded" ); + +} + + //*************************** //*** client connection***** //************************* @@ -2672,6 +2732,7 @@ void connect_client ( void ) REGISTER_STATIC_RPC(client, gotoRT); REGISTER_STATIC_RPC(client, recieve_wipe); REGISTER_STATIC_RPC(client, recieve_heal); + REGISTER_STATIC_RPC(client, awardINT); //*** if (b) diff --git a/Multiplayer/fresh_header.h b/Multiplayer/fresh_header.h index 233ec846..ca32dc09 100644 --- a/Multiplayer/fresh_header.h +++ b/Multiplayer/fresh_header.h @@ -24,6 +24,13 @@ INT8 bLife; INT8 bBleeding; }heal; +typedef struct +{ + UINT16 ubID; + INT8 bteam; + +}AIint; + void send_door ( SOLDIERTYPE *pSoldier, INT16 sGridNo, BOOLEAN fNoAnimations ); @@ -65,6 +72,8 @@ void startCombat(UINT8 ubStartingTeam); extern int WEAPON_READIED_BONUS; +void intAI (SOLDIERTYPE *pSoldier ); + void teamwiped (void); BOOLEAN check_status (void); @@ -73,4 +82,6 @@ extern INT8 NumActiveAndConsciousTeamMembers( UINT8 ubTeam ); void send_heal (SOLDIERTYPE *pSoldier ); -extern int DISABLE_SPEC_MODE; \ No newline at end of file +extern int DISABLE_SPEC_MODE; + +void requestAIint(SOLDIERTYPE *pSoldier ); \ No newline at end of file diff --git a/Multiplayer/network.h b/Multiplayer/network.h index 6901a760..abc22942 100644 --- a/Multiplayer/network.h +++ b/Multiplayer/network.h @@ -3,7 +3,7 @@ //this one just for structs, variables and functions used between the client and server scripts... extern char CLIENT_NAME[30]; - +extern bool Sawarded; typedef struct @@ -82,4 +82,5 @@ typedef struct typedef struct { UINT8 ubStartingTeam; -}sc_struct; \ No newline at end of file +}sc_struct; + diff --git a/Multiplayer/server.cpp b/Multiplayer/server.cpp index e6e35573..e4b50c81 100644 --- a/Multiplayer/server.cpp +++ b/Multiplayer/server.cpp @@ -23,12 +23,14 @@ INT32 gsMAX_MERCS; bool gsMORALE; int gsREPORT_NAME; + + #include "text.h" #include "connect.h" #include "message.h" #include "network.h" #include "overhead.h" - +#include "fresh_header.h" UINT16 nc; //number of open connection UINT16 ncr; //number of ready confirmed connections //something keep record of ready connections .. @@ -59,6 +61,8 @@ RakPeerInterface *server; int numreadyteams; int readyteamreg[10]; +bool Sawarded; + SystemAddress blank; typedef struct @@ -201,6 +205,20 @@ void sendHEAL(RPCParameters *rpcParameters) { server->RPC("recieve_heal",(const char*)rpcParameters->input, (*rpcParameters).numberOfBitsOfData, HIGH_PRIORITY, RELIABLE, 0, rpcParameters->sender, true, 0, UNASSIGNED_NETWORK_ID,0); } +// +//void rINT(RPCParameters *rpcParameters)//who is first +//{ +// +// AIint* data = (AIint*)rpcParameters->input; +// +// if( !Sawarded ) +// { +// PauseAITemporarily(); +// Sawarded=true; +// //send back to sender +// server->RPC("awardINT",(const char*)rpcParameters->input, (*rpcParameters).numberOfBitsOfData, HIGH_PRIORITY, RELIABLE, 0, rpcParameters->sender, false, 0, UNASSIGNED_NETWORK_ID,0); +// } +//} void startCOMBAT(RPCParameters *rpcParameters) { @@ -566,6 +584,7 @@ if(gsPLAYER_BSIDE==2)//only enable ai during coop REGISTER_STATIC_RPC(server, startCOMBAT); REGISTER_STATIC_RPC(server, sendWIPE); REGISTER_STATIC_RPC(server, sendHEAL); + //REGISTER_STATIC_RPC(server, rINT); // diff --git a/Multiplayer/test_space.cpp b/Multiplayer/test_space.cpp index 7cf4a38f..b2f49f14 100644 --- a/Multiplayer/test_space.cpp +++ b/Multiplayer/test_space.cpp @@ -106,13 +106,15 @@ bool ovh_ready; //int cnt = 40; -void test_func2 (void)//now bound to "0" //currently displays coordinates of the mouse +void test_func2 (void)//now bound to "0" { ScreenMsg( FONT_LTGREEN, MSG_CHAT, L"test_func2 - function testing ground:" ); SOLDIERTYPE * pSoldier=MercPtrs[ 0 ]; +PauseAITemporarily(); + //RemoveOneOpponent( pSoldier ); //SOLDIERTYPE * pSoldier2=MercPtrs[ 127 ]; // diff --git a/Tactical/TeamTurns.cpp b/Tactical/TeamTurns.cpp index 90940f4e..e2dced72 100644 --- a/Tactical/TeamTurns.cpp +++ b/Tactical/TeamTurns.cpp @@ -351,6 +351,11 @@ void EndAITurn( void ) EndDeadlockMsg( ); if (INTERRUPT_QUEUED) { + if(is_networked) + { + end_interrupt( FALSE );//this tells other client to go on from where he was + ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"ending interrupt" ); + } EndInterrupt( FALSE ); } else @@ -1013,12 +1018,15 @@ void EndInterrupt( BOOLEAN fMarkInterruptOccurred ) StartInterrupt(); } - else if(nbTeam == 0) //its an interrupt for own merc team + else if(is_server && gTacticalStatus.ubCurrentTeam == 1)// against ai { - //ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"interrupt for our team"); - //hayden - StartInterrupt(); - send_interrupt( npSoldier ); // + + //hayden + send_interrupt( npSoldier ); // + if(nbTeam !=0)intAI(npSoldier); + else StartInterrupt();// + //requestAIint( npSoldier ); + ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"AI is interrupted"); } else { @@ -2033,20 +2041,22 @@ void DoneAddingToIntList( SOLDIERTYPE * pSoldier, BOOLEAN fChange, UINT8 ubInter nbTeam = npSoldier->bTeam; - if ((nbTeam > 0) && (nbTeam <6 ) && is_server) //is AI and are server + if ((nbTeam > 0) && (nbTeam <6 ) && is_server) //is for AI and are server { ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"interrupt for AI team"); send_interrupt( npSoldier ); StartInterrupt(); } - else if(nbTeam == 0 && gTacticalStatus.ubCurrentTeam == 0) //its an interrupt for own merc team && its our turn + else if(is_server && gTacticalStatus.ubCurrentTeam == 1)// against ai { //hayden - StartInterrupt(); send_interrupt( npSoldier ); // - ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"interrupt for my team"); + if(nbTeam !=0)intAI(npSoldier); + else StartInterrupt();// + //requestAIint( npSoldier ); + ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"AI is interrupted"); } else if(gTacticalStatus.ubCurrentTeam == 0)//its our turn (we are moving) { diff --git a/TileEngine/worldman.cpp b/TileEngine/worldman.cpp index 254f3d40..d5557f54 100644 --- a/TileEngine/worldman.cpp +++ b/TileEngine/worldman.cpp @@ -27,6 +27,7 @@ #include "render fun.h" #include "GameSettings.h" #endif +#include "connect.h" extern BOOLEAN gfBasement; @@ -2228,7 +2229,7 @@ BOOLEAN AddMercStructureInfoFromAnimSurface( INT16 sGridNo, SOLDIERTYPE *pSoldie { // Debug msg - ScreenMsg( MSG_FONT_RED, MSG_DEBUG, L"FAILED: add struct info for merc %d (%s), at %d direction %d", pSoldier->ubID, pSoldier->name, sGridNo, pSoldier->ubDirection ); + if(!is_networked)ScreenMsg( MSG_FONT_RED, MSG_DEBUG, L"FAILED: add struct info for merc %d (%s), at %d direction %d", pSoldier->ubID, pSoldier->name, sGridNo, pSoldier->ubDirection ); if ( pStructureFileRef->pDBStructureRef[ gOneCDirection[ pSoldier->ubDirection ] ].pDBStructure->ubNumberOfTiles > 1 ) {