From ffc70e97236098033a2c968d836b1e5fcca70684 Mon Sep 17 00:00:00 2001 From: Overhaul Date: Tue, 11 Sep 2007 11:19:03 +0000 Subject: [PATCH] Fixed buffer overrun for LUA strings Made direction variables more consistent as unsigned chars. Several function prototypes updated for this. Many memory leaks plugged: External options, video overlays, laptop file lists, tactical message queue, strategic pathing, autobandage, merc hiring, detailed placements, crate in Drassen, tactical placement New functions and attributes for soldiers in LUA (still for debugging at best): Soldier.APs (current APs), Soldier.changestance (changes stance, uses game heights) File catalog ignores .SVN directories (game load speedup) Fix CTD in mouse regions JA2 window now refuses to move to negative coords Checks to prevent DirectX-related infinite loops due to minimizing and task switching Invading enemies should now appear on the borders even when reinforcements disabled in .ini Suppression should no longer work on mercs in medium water Infant/Young creatures use restored spit instead of Molotov Creatures begin with their 'guns' (spit) 'locked and loaded' (cartridge in chamber) Further fix to AXP and AlaarDB's weapon ready check: Now 'firing' is always counted as 'ready'. Prevent mercs from falling and flying back through obstacles Check whether battle group is even set before testing its location for battle setup Burst spread locations now limited to 6, the limit within the soldier struct Extra burst spread locations zeroed out so that they aren't used unless necessary Spread code now only shoots at locations in the spread, and will shoot at all 6 Only mercs in the sector where autobandage happens will be made to stand up after it's done Throwing a grenade at the tail of the plane in Drassen should not result in a CTD Reset attack busy count when loading a new sector git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@1347 3b4a5df2-a311-0410-b5c6-a8a6f20db521 --- Editor/EditorMercs.cpp | 8 +- GameSettings.cpp | 5 + GameSettings.h | 1 + Laptop/files.cpp | 1 + Standard Gaming Platform/FileCat.cpp | 3 +- Standard Gaming Platform/mousesystem.cpp | 3 +- Standard Gaming Platform/sgp.cpp | 30 ++- Standard Gaming Platform/video.cpp | 54 +++++ Strategic/AI Viewer.cpp | 14 +- Strategic/Assignments.cpp | 24 +- Strategic/Game Init.cpp | 1 + Strategic/Map Screen Interface Map.cpp | 1 + Strategic/Merc Contract.cpp | 2 +- Strategic/Queen Command.cpp | 98 ++++---- Strategic/Strategic Movement.cpp | 2 +- Strategic/Strategic Pathing.cpp | 8 +- Strategic/mapscreen.cpp | 1 + Tactical/Auto Bandage.cpp | 8 +- Tactical/Boxing.cpp | 2 +- Tactical/End Game.cpp | 2 +- Tactical/Enemy Soldier Save.cpp | 24 +- Tactical/Handle Doors.cpp | 2 +- Tactical/Handle Items.cpp | 2 +- Tactical/Handle UI Plan.cpp | 6 +- Tactical/Handle UI.cpp | 23 +- Tactical/Interface Dialogue.cpp | 10 +- Tactical/Interface Items.cpp | 8 +- Tactical/Interface Panels.cpp | 4 +- Tactical/Item Types.h | 4 +- Tactical/Items.cpp | 54 ++--- Tactical/LOS.cpp | 16 +- Tactical/Merc Hiring.cpp | 3 +- Tactical/Militia Control.cpp | 4 +- Tactical/Overhead.cpp | 44 ++-- Tactical/PATHAI.cpp | 8 +- Tactical/Points.cpp | 12 +- Tactical/Rotting Corpses.cpp | 20 +- Tactical/Rotting Corpses.h | 2 +- Tactical/Soldier Add.cpp | 16 +- Tactical/Soldier Ani.cpp | 116 ++++----- Tactical/Soldier Ani.h | 2 +- Tactical/Soldier Control.cpp | 297 +++++++++++++++-------- Tactical/Soldier Control.h | 17 +- Tactical/Soldier Create.cpp | 21 +- Tactical/Soldier Create.h | 4 +- Tactical/Soldier Init List.cpp | 4 +- Tactical/Soldier Profile.cpp | 2 +- Tactical/Soldier Tile.cpp | 8 +- Tactical/Spread Burst.cpp | 23 +- Tactical/Tactical Save.cpp | 2 +- Tactical/Turn Based Input.cpp | 12 +- Tactical/UI Cursors.cpp | 2 +- Tactical/Vehicles.cpp | 2 +- Tactical/Weapons.cpp | 150 +++++++----- Tactical/Weapons.h | 2 +- Tactical/fov.cpp | 4 +- Tactical/opplist.cpp | 58 ++--- TacticalAI/AIMain.cpp | 32 +-- TacticalAI/AIUtils.cpp | 22 +- TacticalAI/Attacks.cpp | 29 ++- TacticalAI/CreatureDecideAction.cpp | 12 +- TacticalAI/DecideAction.cpp | 42 ++-- TacticalAI/Movement.cpp | 4 +- TileEngine/Buildings.cpp | 38 +-- TileEngine/Explosion Control.cpp | 109 +++++---- TileEngine/Isometric Utils.cpp | 8 +- TileEngine/Isometric Utils.h | 2 +- TileEngine/Map Edgepoints.cpp | 2 +- TileEngine/SaveLoadMap.cpp | 5 + TileEngine/Smell.cpp | 4 +- TileEngine/Tactical Placement GUI.cpp | 4 +- TileEngine/physics.cpp | 2 +- TileEngine/renderworld.cpp | 2 +- TileEngine/tiledef.h | 16 +- TileEngine/worlddef.cpp | 3 + TileEngine/worldman.cpp | 14 +- gameloop.cpp | 2 + gamescreen.cpp | 1 + ja2_2005Express.vcproj | 4 + lua/lua.cpp | 36 +++ lua/lwstring.cpp | 2 +- 81 files changed, 972 insertions(+), 679 deletions(-) diff --git a/Editor/EditorMercs.cpp b/Editor/EditorMercs.cpp index 7a3658f6..27dc5f42 100644 --- a/Editor/EditorMercs.cpp +++ b/Editor/EditorMercs.cpp @@ -528,7 +528,7 @@ void AddMercToWorld( INT32 iMapIndex ) gTempBasicPlacement.bAttitude = gbDefaultAttitude; gTempBasicPlacement.bRelativeAttributeLevel = gbDefaultRelativeAttributeLevel; gTempBasicPlacement.bRelativeEquipmentLevel = gbDefaultRelativeEquipmentLevel; - gTempBasicPlacement.bDirection = gbDefaultDirection; + gTempBasicPlacement.ubDirection = gbDefaultDirection; //Generate detailed placement information given the temp placement information. CreateDetailedPlacementGivenBasicPlacementInfo( &gTempDetailedPlacement, &gTempBasicPlacement ); @@ -645,7 +645,7 @@ void ResetAllMercPositions() // EVENT_SetSoldierPosition( gpSelected->pSoldier, (FLOAT)(sCellX + 5), (FLOAT)(sCellY + 5) ); // if( gpSelected->pBasicPlacement->fOnRoof ) // SetSoldierHeight( gpSelected->pSoldier, 58.0 ); - // SetMercDirection( gpSelected->pBasicPlacement->bDirection ); + // SetMercDirection( gpSelected->pBasicPlacement->ubDirection ); //} curr = curr->next; } @@ -1451,7 +1451,7 @@ void SetMercDirection( INT8 bDirection ) ClickEditorButton( FIRST_MERCS_DIRECTION_BUTTON + bDirection ); gbDefaultDirection = bDirection; - gpSelected->pBasicPlacement->bDirection = bDirection; + gpSelected->pBasicPlacement->ubDirection = bDirection; // ATE: Changed these to call functions.... EVENT_SetSoldierDirection( gpSelected->pSoldier, bDirection ); @@ -1676,7 +1676,7 @@ void IndicateSelectedMerc( INT16 sID ) //assigns the soldier with the same orders/attitude. SetMercOrders( gpSelected->pSoldier->bOrders ); SetMercAttitude( gpSelected->pSoldier->bAttitude ); - SetMercDirection( gpSelected->pSoldier->bDirection ); + SetMercDirection( gpSelected->pSoldier->ubDirection ); if( gpSelected->pBasicPlacement->fPriorityExistance ) ClickEditorButton( MERCS_PRIORITYEXISTANCE_CHECKBOX ); else diff --git a/GameSettings.cpp b/GameSettings.cpp index 145a251b..4c49d441 100644 --- a/GameSettings.cpp +++ b/GameSettings.cpp @@ -708,6 +708,11 @@ void LoadGameExternalOptions() } +void FreeGameExternalOptions() +{ + MemFree( gGameExternalOptions.iaIMPSlots); +} + BOOLEAN GetCDLocation( ) { UINT32 uiStrngLength = 0; diff --git a/GameSettings.h b/GameSettings.h index 08189c76..8d73475f 100644 --- a/GameSettings.h +++ b/GameSettings.h @@ -438,6 +438,7 @@ BOOLEAN SaveGameSettings(); BOOLEAN LoadGameSettings(); // Snap: Read options from an INI file in the default of custom Data directory void LoadGameExternalOptions(); +void FreeGameExternalOptions(); void InitGameOptions(); diff --git a/Laptop/files.cpp b/Laptop/files.cpp index e1ddd6ed..8c113073 100644 --- a/Laptop/files.cpp +++ b/Laptop/files.cpp @@ -1292,6 +1292,7 @@ void ClearFileStringList( void ) { pDeleteFileString = pFileString; pFileString = pFileString -> Next; + MemFree( pDeleteFileString->pString); MemFree( pDeleteFileString ); } diff --git a/Standard Gaming Platform/FileCat.cpp b/Standard Gaming Platform/FileCat.cpp index d18e72af..a977d597 100644 --- a/Standard Gaming Platform/FileCat.cpp +++ b/Standard Gaming Platform/FileCat.cpp @@ -75,6 +75,7 @@ void TFileCat::TraverseDir(std::string dir, int depth) using std::string; static string dot( "."); static string dotdot( ".."); + static string svn( ".svn"); if (!dir.empty()) dir += '\\'; @@ -84,7 +85,7 @@ void TFileCat::TraverseDir(std::string dir, int depth) unsigned attrib; while ( readDir.NextFile(fileName, attrib) ) { - if (dot == fileName || dotdot == fileName) continue; + if (dot == fileName || dotdot == fileName || svn == fileName) continue; string fullPath = dir + fileName; diff --git a/Standard Gaming Platform/mousesystem.cpp b/Standard Gaming Platform/mousesystem.cpp index 24fffb44..3e2ab714 100644 --- a/Standard Gaming Platform/mousesystem.cpp +++ b/Standard Gaming Platform/mousesystem.cpp @@ -622,7 +622,8 @@ void MSYS_UpdateMouseRegion(void) #endif } - MSYS_CurrRegion->FastHelpTimer = gsFastHelpDelay; + if (MSYS_CurrRegion) + MSYS_CurrRegion->FastHelpTimer = gsFastHelpDelay; // Force a callbacks to happen on previous region to indicate that // the mouse has left the old region diff --git a/Standard Gaming Platform/sgp.cpp b/Standard Gaming Platform/sgp.cpp index 14bcf310..eabaa98d 100644 --- a/Standard Gaming Platform/sgp.cpp +++ b/Standard Gaming Platform/sgp.cpp @@ -133,7 +133,8 @@ INT32 FAR PASCAL WindowProcedure(HWND hWindow, UINT16 Message, WPARAM wParam, LP FreeConsole(); return 0L; } - + BOOL visible = IsWindowVisible(hWindow); + if(gfIgnoreMessages) return(DefWindowProc(hWindow, Message, wParam, lParam)); @@ -159,11 +160,29 @@ INT32 FAR PASCAL WindowProcedure(HWND hWindow, UINT16 Message, WPARAM wParam, LP #ifdef JA2 case WM_MOVE: // if( 1==iScreenMode ) -// { + { GetClientRect(hWindow, &rcWindow); ClientToScreen(hWindow, (LPPOINT)&rcWindow); ClientToScreen(hWindow, (LPPOINT)&rcWindow+1); -// } + int xPos = (int)(short) LOWORD(lParam); + int yPos = (int)(short) HIWORD(lParam); + BOOL needchange = FALSE; + if (xPos < 0) + { + xPos = 0; + needchange = TRUE; + } + if (yPos < 0) + { + yPos = 0; + needchange = TRUE; + } + if (needchange) + { + SetWindowPos( hWindow, NULL, xPos, yPos, 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_SHOWWINDOW); + } + + } break; case WM_GETMINMAXINFO: { @@ -792,7 +811,10 @@ int PASCAL HandledWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR p //end rain #ifdef _DEBUG - _CrtSetDbgFlag( _CRTDBG_CHECK_ALWAYS_DF | _CRTDBG_DELAY_FREE_MEM_DF | _CRTDBG_LEAK_CHECK_DF); + // Use this one ONLY if you're having memory corruption issues that can be repeated in a short time + // Otherwise it will just run out of memory. + //_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_DELAY_FREE_MEM_DF | _CRTDBG_LEAK_CHECK_DF | _CRTDBG_CHECK_ALWAYS_DF); + _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF | _CRTDBG_CHECK_EVERY_1024_DF); #endif ghInstance = hInstance; diff --git a/Standard Gaming Platform/video.cpp b/Standard Gaming Platform/video.cpp index a1479124..35bbd881 100644 --- a/Standard Gaming Platform/video.cpp +++ b/Standard Gaming Platform/video.cpp @@ -1083,6 +1083,12 @@ void ScrollJA2Background(UINT32 uiDirection, INT16 sScrollXIncrement, INT16 sScr ReturnCode = IDirectDrawSurface2_SGPBltFast(pDest, sScrollXIncrement, gsVIEWPORT_WINDOW_START_Y, pSource, (LPRECT)&Region, DDBLTFAST_NOCOLORKEY); if ((ReturnCode != DD_OK)&&(ReturnCode != DDERR_WASSTILLDRAWING)) { + // Prevent the assertion failure lockup + if (ReturnCode == DDERR_INVALIDRECT) + { + break; + } + DirectXAttempt ( ReturnCode, __LINE__, __FILE__ ); if (ReturnCode == DDERR_SURFACELOST) @@ -1124,6 +1130,12 @@ void ScrollJA2Background(UINT32 uiDirection, INT16 sScrollXIncrement, INT16 sScr ReturnCode = IDirectDrawSurface2_SGPBltFast(pDest, 0, gsVIEWPORT_WINDOW_START_Y, pSource, (LPRECT)&Region, DDBLTFAST_NOCOLORKEY); if ((ReturnCode != DD_OK)&&(ReturnCode != DDERR_WASSTILLDRAWING)) { + // Prevent the assertion failure lockup + if (ReturnCode == DDERR_INVALIDRECT) + { + break; + } + DirectXAttempt ( ReturnCode, __LINE__, __FILE__ ); if (ReturnCode == DDERR_SURFACELOST) @@ -1166,6 +1178,12 @@ void ScrollJA2Background(UINT32 uiDirection, INT16 sScrollXIncrement, INT16 sScr ReturnCode = IDirectDrawSurface2_SGPBltFast(pDest, 0, gsVIEWPORT_WINDOW_START_Y + sScrollYIncrement, pSource, (LPRECT)&Region, DDBLTFAST_NOCOLORKEY); if ((ReturnCode != DD_OK)&&(ReturnCode != DDERR_WASSTILLDRAWING)) { + // Prevent the assertion failure lockup + if (ReturnCode == DDERR_INVALIDRECT) + { + break; + } + DirectXAttempt ( ReturnCode, __LINE__, __FILE__ ); if (ReturnCode == DDERR_SURFACELOST) @@ -1207,6 +1225,12 @@ void ScrollJA2Background(UINT32 uiDirection, INT16 sScrollXIncrement, INT16 sScr ReturnCode = IDirectDrawSurface2_SGPBltFast(pDest, 0, gsVIEWPORT_WINDOW_START_Y, pSource, (LPRECT)&Region, DDBLTFAST_NOCOLORKEY); if ((ReturnCode != DD_OK)&&(ReturnCode != DDERR_WASSTILLDRAWING)) { + // Prevent the assertion failure lockup + if (ReturnCode == DDERR_INVALIDRECT) + { + break; + } + DirectXAttempt ( ReturnCode, __LINE__, __FILE__ ); if (ReturnCode == DDERR_SURFACELOST) @@ -1249,6 +1273,12 @@ void ScrollJA2Background(UINT32 uiDirection, INT16 sScrollXIncrement, INT16 sScr ReturnCode = IDirectDrawSurface2_SGPBltFast(pDest, sScrollXIncrement, gsVIEWPORT_WINDOW_START_Y + sScrollYIncrement, pSource, (LPRECT)&Region, DDBLTFAST_NOCOLORKEY); if ((ReturnCode != DD_OK)&&(ReturnCode != DDERR_WASSTILLDRAWING)) { + // Prevent the assertion failure lockup + if (ReturnCode == DDERR_INVALIDRECT) + { + break; + } + DirectXAttempt ( ReturnCode, __LINE__, __FILE__ ); if (ReturnCode == DDERR_SURFACELOST) @@ -1294,6 +1324,12 @@ void ScrollJA2Background(UINT32 uiDirection, INT16 sScrollXIncrement, INT16 sScr ReturnCode = IDirectDrawSurface2_SGPBltFast(pDest, 0, gsVIEWPORT_WINDOW_START_Y + sScrollYIncrement, pSource, (LPRECT)&Region, DDBLTFAST_NOCOLORKEY); if ((ReturnCode != DD_OK)&&(ReturnCode != DDERR_WASSTILLDRAWING)) { + // Prevent the assertion failure lockup + if (ReturnCode == DDERR_INVALIDRECT) + { + break; + } + DirectXAttempt ( ReturnCode, __LINE__, __FILE__ ); if (ReturnCode == DDERR_SURFACELOST) @@ -1338,6 +1374,12 @@ void ScrollJA2Background(UINT32 uiDirection, INT16 sScrollXIncrement, INT16 sScr ReturnCode = IDirectDrawSurface2_SGPBltFast(pDest, sScrollXIncrement, gsVIEWPORT_WINDOW_START_Y, pSource, (LPRECT)&Region, DDBLTFAST_NOCOLORKEY); if ((ReturnCode != DD_OK)&&(ReturnCode != DDERR_WASSTILLDRAWING)) { + // Prevent the assertion failure lockup + if (ReturnCode == DDERR_INVALIDRECT) + { + break; + } + DirectXAttempt ( ReturnCode, __LINE__, __FILE__ ); if (ReturnCode == DDERR_SURFACELOST) @@ -1385,6 +1427,12 @@ void ScrollJA2Background(UINT32 uiDirection, INT16 sScrollXIncrement, INT16 sScr ReturnCode = IDirectDrawSurface2_SGPBltFast(pDest, 0, gsVIEWPORT_WINDOW_START_Y, pSource, (LPRECT)&Region, DDBLTFAST_NOCOLORKEY); if ((ReturnCode != DD_OK)&&(ReturnCode != DDERR_WASSTILLDRAWING)) { + // Prevent the assertion failure lockup + if (ReturnCode == DDERR_INVALIDRECT) + { + break; + } + DirectXAttempt ( ReturnCode, __LINE__, __FILE__ ); if (ReturnCode == DDERR_SURFACELOST) @@ -1456,6 +1504,12 @@ void ScrollJA2Background(UINT32 uiDirection, INT16 sScrollXIncrement, INT16 sScr ReturnCode = IDirectDrawSurface2_SGPBltFast(pDest, StripRegions[ cnt ].left, StripRegions[ cnt ].top, gpFrameBuffer, (LPRECT)&( StripRegions[ cnt ] ), DDBLTFAST_NOCOLORKEY); if ((ReturnCode != DD_OK)&&(ReturnCode != DDERR_WASSTILLDRAWING)) { + // Prevent the assertion failure lockup + if (ReturnCode == DDERR_INVALIDRECT) + { + break; + } + DirectXAttempt ( ReturnCode, __LINE__, __FILE__ ); } diff --git a/Strategic/AI Viewer.cpp b/Strategic/AI Viewer.cpp index e1a2ea0a..f3f3d0e8 100644 --- a/Strategic/AI Viewer.cpp +++ b/Strategic/AI Viewer.cpp @@ -540,7 +540,7 @@ void RenderMovingGroupsAndMercs() UINT8 ubNumTroops, ubNumAdmins, ubNumElites; float ratio; INT32 minX, maxX, minY, maxY; - INT32 iSector = 0; + //INT32 iSector = 0; UINT8 ubIconType; UINT8 ubIconColor; UINT8 ubFontColor; @@ -577,7 +577,7 @@ void RenderMovingGroupsAndMercs() if( pGroup->fPlayer ) { - ubIconType = ( pGroup->uiTraverseTime ) ? ICON_TYPE_ASSAULT : ICON_TYPE_STOPPED; + ubIconType = (UINT8) (( pGroup->uiTraverseTime ) ? ICON_TYPE_ASSAULT : ICON_TYPE_STOPPED); ubIconColor = ICON_COLOR_GREEN; ubFontColor = FONT_YELLOW; } @@ -1447,16 +1447,16 @@ void ExtractAndUpdatePopulations() //CIniReader iniReader("..\\Ja2_Options.ini"); //INT32 iMaxEnemyGroupSize = iniReader.ReadInteger("Options","MAX_STRATEGIC_TEAM_SIZE",20); - gsAINumAdmins = min( GetNumericStrictValueFromField( 0 ), gGameExternalOptions.iMaxEnemyGroupSize ); + gsAINumAdmins = (INT16) min( GetNumericStrictValueFromField( 0 ), gGameExternalOptions.iMaxEnemyGroupSize ); SetInputFieldStringWithNumericStrictValue( 0, gsAINumAdmins ); - gsAINumTroops = min( GetNumericStrictValueFromField( 1 ), gGameExternalOptions.iMaxEnemyGroupSize ); + gsAINumTroops = (INT16) min( GetNumericStrictValueFromField( 1 ), gGameExternalOptions.iMaxEnemyGroupSize ); SetInputFieldStringWithNumericStrictValue( 1, gsAINumTroops ); - gsAINumElites = min( GetNumericStrictValueFromField( 2 ), gGameExternalOptions.iMaxEnemyGroupSize ); + gsAINumElites = (INT16) min( GetNumericStrictValueFromField( 2 ), gGameExternalOptions.iMaxEnemyGroupSize ); SetInputFieldStringWithNumericStrictValue( 2, gsAINumElites ); - gsAINumCreatures = min( GetNumericStrictValueFromField( 3 ), gGameExternalOptions.iMaxEnemyGroupSize ); + gsAINumCreatures = (INT16) min( GetNumericStrictValueFromField( 3 ), gGameExternalOptions.iMaxEnemyGroupSize ); SetInputFieldStringWithNumericStrictValue( 3, gsAINumCreatures ); } @@ -1866,7 +1866,7 @@ void BlitGroupIcon( UINT8 ubIconType, UINT8 ubIconColor, UINT32 uiX, UINT32 uiY, Assert( ubIconType < NUM_ICON_TYPES ); Assert( ubIconColor < NUM_ICON_COLORS ); - ubObjectIndex = ( ubIconType * NUM_ICON_COLORS ) + ubIconColor; + ubObjectIndex = (UINT8)( ubIconType * NUM_ICON_COLORS ) + ubIconColor; BltVideoObject( FRAME_BUFFER, hVObject, ubObjectIndex, uiX, uiY, VO_BLT_SRCTRANSPARENCY, NULL ); } diff --git a/Strategic/Assignments.cpp b/Strategic/Assignments.cpp index 96d11453..f95fedc6 100644 --- a/Strategic/Assignments.cpp +++ b/Strategic/Assignments.cpp @@ -917,8 +917,8 @@ BOOLEAN CanCharacterRepairButDoesntHaveARepairkit( SOLDIERTYPE *pSoldier ) // check that character is alive, oklife, has repair skill, and equipment, etc. BOOLEAN CanCharacterRepair( SOLDIERTYPE *pSoldier ) { - INT8 bPocket = 0; - BOOLEAN fToolKitFound = FALSE; + //INT8 bPocket = 0; + //BOOLEAN fToolKitFound = FALSE; if ( !BasicCanCharacterAssignment( pSoldier, TRUE ) ) { @@ -1565,8 +1565,8 @@ BOOLEAN CanCharacterPractise( SOLDIERTYPE *pSoldier ) BOOLEAN CanCharacterTrainTeammates( SOLDIERTYPE *pSoldier ) { - INT32 cnt = 0; - SOLDIERTYPE *pTeamSoldier = NULL; + //INT32 cnt = 0; + //SOLDIERTYPE *pTeamSoldier = NULL; // can character train at all if( CanCharacterPractise( pSoldier ) == FALSE ) @@ -1588,7 +1588,7 @@ BOOLEAN CanCharacterTrainTeammates( SOLDIERTYPE *pSoldier ) BOOLEAN CanCharacterBeTrainedByOther( SOLDIERTYPE *pSoldier ) { - INT32 iCounter = 0; + //INT32 iCounter = 0; // can character train at all if( CanCharacterPractise( pSoldier ) == FALSE ) @@ -2047,8 +2047,8 @@ UINT8 FindNumberInSectorWithAssignment( INT16 sX, INT16 sY, INT8 bAssignment ) { // run thought list of characters find number with this assignment SOLDIERTYPE *pSoldier, *pTeamSoldier; - INT32 cnt=0; - INT32 iCounter=0; + INT32 cnt=0; + //INT32 iCounter=0; INT8 bNumberOfPeople = 0; // set psoldier as first in merc ptrs @@ -2137,11 +2137,11 @@ UINT16 CalculateHealingPointsForDoctor(SOLDIERTYPE *pDoctor, UINT16 *pusMaxPts, } // calculate effective doctoring rate (adjusted for drugs, alcohol, etc.) - usHealPts = ( EffectiveMedical( pDoctor ) * (( EffectiveDexterity( pDoctor ) + EffectiveWisdom( pDoctor ) ) / 2) * (100 + ( 5 * EffectiveExpLevel( pDoctor) ) ) ) / gGameExternalOptions.ubDoctoringRateDivisor; + usHealPts = (UINT16) (( EffectiveMedical( pDoctor ) * (( EffectiveDexterity( pDoctor ) + EffectiveWisdom( pDoctor ) ) / 2) * (100 + ( 5 * EffectiveExpLevel( pDoctor) ) ) ) / gGameExternalOptions.ubDoctoringRateDivisor); // calculate normal doctoring rate - what it would be if his stats were "normal" (ignoring drugs, fatigue, equipment condition) // and equipment was not a hindrance - *pusMaxPts = ( pDoctor -> bMedical * (( pDoctor -> bDexterity + pDoctor -> bWisdom ) / 2 ) * (100 + ( 5 * pDoctor->bExpLevel) ) ) / gGameExternalOptions.ubDoctoringRateDivisor; + *pusMaxPts = (UINT16) (( pDoctor -> bMedical * (( pDoctor -> bDexterity + pDoctor -> bWisdom ) / 2 ) * (100 + ( 5 * pDoctor->bExpLevel) ) ) / gGameExternalOptions.ubDoctoringRateDivisor); // adjust for fatigue ReducePointsForFatigue( pDoctor, &usHealPts ); @@ -2196,11 +2196,11 @@ UINT8 CalculateRepairPointsForRepairman(SOLDIERTYPE *pSoldier, UINT16 *pusMaxPts } // calculate effective repair rate (adjusted for drugs, alcohol, etc.) - usRepairPts = (EffectiveMechanical( pSoldier ) * EffectiveDexterity( pSoldier ) * (100 + ( 5 * EffectiveExpLevel( pSoldier) ) ) ) / ( gGameExternalOptions.ubRepairRateDivisor * gGameExternalOptions.ubAssignmentUnitsPerDay ); + usRepairPts = (UINT16) ((EffectiveMechanical( pSoldier ) * EffectiveDexterity( pSoldier ) * (100 + ( 5 * EffectiveExpLevel( pSoldier) ) ) ) / ( gGameExternalOptions.ubRepairRateDivisor * gGameExternalOptions.ubAssignmentUnitsPerDay )); // calculate normal repair rate - what it would be if his stats were "normal" (ignoring drugs, fatigue, equipment condition) // and equipment was not a hindrance - *pusMaxPts = ( pSoldier -> bMechanical * pSoldier -> bDexterity * (100 + ( 5 * pSoldier->bExpLevel) ) ) / ( gGameExternalOptions.ubRepairRateDivisor * gGameExternalOptions.ubAssignmentUnitsPerDay ); + *pusMaxPts = (UINT16) (( pSoldier -> bMechanical * pSoldier -> bDexterity * (100 + ( 5 * pSoldier->bExpLevel) ) ) / ( gGameExternalOptions.ubRepairRateDivisor * gGameExternalOptions.ubAssignmentUnitsPerDay )); // adjust for fatigue @@ -2275,7 +2275,7 @@ void HandleDoctorsInSector( INT16 sX, INT16 sY, INT8 bZ ) { SOLDIERTYPE *pSoldier, *pTeamSoldier; INT32 cnt=0; - INT32 iCounter=0; + //INT32 iCounter=0; // set psoldier as first in merc ptrs pSoldier = MercPtrs[0]; diff --git a/Strategic/Game Init.cpp b/Strategic/Game Init.cpp index b826cb9a..e159d375 100644 --- a/Strategic/Game Init.cpp +++ b/Strategic/Game Init.cpp @@ -352,6 +352,7 @@ void ShutdownStrategicLayer() TrashUndergroundSectorInfo(); DeleteCreatureDirectives(); KillStrategicAI(); + ClearTacticalMessageQueue(); } BOOLEAN InitNewGame( BOOLEAN fReset ) diff --git a/Strategic/Map Screen Interface Map.cpp b/Strategic/Map Screen Interface Map.cpp index 6477edc8..94b203b1 100644 --- a/Strategic/Map Screen Interface Map.cpp +++ b/Strategic/Map Screen Interface Map.cpp @@ -2055,6 +2055,7 @@ void PlotPathForHelicopter( INT16 sX, INT16 sY ) void PlotATemporaryPathForHelicopter( INT16 sX, INT16 sY ) { // clear old temp path + pTempHelicopterPath = MoveToBeginningOfPathList( pTempHelicopterPath); pTempHelicopterPath = ClearStrategicPathList( pTempHelicopterPath, 0 ); // is cursor allowed here?..if not..don't build temp path diff --git a/Strategic/Merc Contract.cpp b/Strategic/Merc Contract.cpp index 20a16f4b..1f3f1830 100644 --- a/Strategic/Merc Contract.cpp +++ b/Strategic/Merc Contract.cpp @@ -1263,7 +1263,7 @@ BOOLEAN HandleFiredDeadMerc( SOLDIERTYPE *pSoldier ) SET_PALETTEREP_ID ( Corpse.SkinPal, pSoldier->SkinPal ); SET_PALETTEREP_ID ( Corpse.PantsPal, pSoldier->PantsPal ); - Corpse.bDirection = pSoldier->bDirection; + Corpse.bDirection = pSoldier->ubDirection; // Set time of death Corpse.uiTimeOfDeath = GetWorldTotalMin( ); diff --git a/Strategic/Queen Command.cpp b/Strategic/Queen Command.cpp index 11404cd6..a32fcc6d 100644 --- a/Strategic/Queen Command.cpp +++ b/Strategic/Queen Command.cpp @@ -443,54 +443,58 @@ BOOLEAN PrepareEnemyForSectorBattle() if( gbWorldSectorZ > 0 ) return PrepareEnemyForUndergroundBattle(); - // Reinforcement groups? Bring it on! That is, if this is an enemy invasion. - if( gGameExternalOptions.gfAllowReinforcements && - !( (GetTownIdForSector( gWorldSectorX, gWorldSectorY ) == OMERTA )&&( gGameOptions.ubDifficultyLevel != DIF_LEVEL_INSANE ) ) && - gpBattleGroup && !gpBattleGroup->fPlayer ) + // Add the invading group + if (gpBattleGroup && !gpBattleGroup->fPlayer ) { - UINT16 pusMoveDir[4][3]; - UINT8 ubDirNumber = 0, ubIndex; - GROUP *pGroup; - SECTORINFO *pThisSector; - //The enemy has instigated the battle which means they are the ones entering the conflict. //The player was actually in the sector first, and the enemy doesn't use reinforced placements HandleArrivalOfReinforcements( gpBattleGroup ); - // They arrived in multiple groups, so here they come - pThisSector = &SectorInfo[ SECTOR( gWorldSectorX, gWorldSectorY ) ]; - - GenerateDirectionInfos( gWorldSectorX, gWorldSectorY, &ubDirNumber, pusMoveDir, - ( GetTownIdForSector( gWorldSectorX, gWorldSectorY ) != BLANK_SECTOR ? TRUE : FALSE ), TRUE, IS_ONLY_IN_CITIES ); - - for( ubIndex = 0; ubIndex < ubDirNumber; ubIndex++ ) + // Reinforcement groups? Bring it on! + if( gGameExternalOptions.gfAllowReinforcements && + !( (GetTownIdForSector( gWorldSectorX, gWorldSectorY ) == OMERTA )&&( gGameOptions.ubDifficultyLevel != DIF_LEVEL_INSANE ) ) ) { - while ( NumMobileEnemiesInSector( SECTORX( pusMoveDir[ ubIndex ][ 0 ] ), SECTORY( pusMoveDir[ ubIndex ][ 0 ] ) ) && GetEnemyGroupInSector( SECTORX( pusMoveDir[ ubIndex][ 0 ] ), SECTORY( pusMoveDir[ ubIndex ][ 0 ] ) ) ) + UINT16 pusMoveDir[4][3]; + UINT8 ubDirNumber = 0, ubIndex; + GROUP *pGroup; + SECTORINFO *pThisSector; + + // They arrived in multiple groups, so here they come + pThisSector = &SectorInfo[ SECTOR( gWorldSectorX, gWorldSectorY ) ]; + + GenerateDirectionInfos( gWorldSectorX, gWorldSectorY, &ubDirNumber, pusMoveDir, + ( GetTownIdForSector( gWorldSectorX, gWorldSectorY ) != BLANK_SECTOR ? TRUE : FALSE ), TRUE, IS_ONLY_IN_CITIES ); + + for( ubIndex = 0; ubIndex < ubDirNumber; ubIndex++ ) { - pGroup = GetEnemyGroupInSector( SECTORX( pusMoveDir[ ubIndex][ 0 ] ), SECTORY( pusMoveDir[ ubIndex ][ 0 ] ) ); + while ( NumMobileEnemiesInSector( SECTORX( pusMoveDir[ ubIndex ][ 0 ] ), SECTORY( pusMoveDir[ ubIndex ][ 0 ] ) ) && GetEnemyGroupInSector( SECTORX( pusMoveDir[ ubIndex][ 0 ] ), SECTORY( pusMoveDir[ ubIndex ][ 0 ] ) ) ) + { + pGroup = GetEnemyGroupInSector( SECTORX( pusMoveDir[ ubIndex][ 0 ] ), SECTORY( pusMoveDir[ ubIndex ][ 0 ] ) ); - pGroup->ubPrevX = pGroup->ubSectorX; - pGroup->ubPrevY = pGroup->ubSectorY; + pGroup->ubPrevX = pGroup->ubSectorX; + pGroup->ubPrevY = pGroup->ubSectorY; - pGroup->ubSectorX = pGroup->ubNextX = (UINT8)gWorldSectorX; - pGroup->ubSectorY = pGroup->ubNextY = (UINT8)gWorldSectorY; + pGroup->ubSectorX = pGroup->ubNextX = (UINT8)gWorldSectorX; + pGroup->ubSectorY = pGroup->ubNextY = (UINT8)gWorldSectorY; + } } - } - //It is now possible that other enemy groups have also arrived. Add them in the same manner. - pGroup = gpGroupList; - while( pGroup ) - { - if( pGroup != gpBattleGroup && !pGroup->fPlayer && !pGroup->fVehicle && - pGroup->ubSectorX == gpBattleGroup->ubSectorX && + //It is now possible that other enemy groups have also arrived. Add them in the same manner. + pGroup = gpGroupList; + while( pGroup ) + { + if( pGroup != gpBattleGroup && !pGroup->fPlayer && !pGroup->fVehicle && + pGroup->ubSectorX == gpBattleGroup->ubSectorX && pGroup->ubSectorY == gpBattleGroup->ubSectorY && !pGroup->pEnemyGroup->ubAdminsInBattle && !pGroup->pEnemyGroup->ubTroopsInBattle && !pGroup->pEnemyGroup->ubElitesInBattle ) - { - HandleArrivalOfReinforcements( pGroup ); + { + HandleArrivalOfReinforcements( pGroup ); + } + pGroup = pGroup->next; } - pGroup = pGroup->next; + } ValidateEnemiesHaveWeapons(); @@ -670,24 +674,29 @@ BOOLEAN PrepareEnemyForSectorBattle() pGroup = gpGroupList; while( pGroup && sNumSlots ) { - i = gTacticalStatus.Team[ ENEMY_TEAM ].bFirstID; - pSoldier = &Menptr[ i ]; - if( !pGroup->fPlayer && !pGroup->fVehicle && pGroup->ubSectorX == gWorldSectorX && pGroup->ubSectorY == gWorldSectorY && !gbWorldSectorZ ) + if( !pGroup->fPlayer && !pGroup->fVehicle && + pGroup->ubSectorX == gWorldSectorX && pGroup->ubSectorY == gWorldSectorY && !gbWorldSectorZ ) { - num = pGroup->ubGroupSize; ubNumAdmins = pGroup->pEnemyGroup->ubAdminsInBattle; ubNumTroops = pGroup->pEnemyGroup->ubTroopsInBattle; ubNumElites = pGroup->pEnemyGroup->ubElitesInBattle; - while( num && sNumSlots && i <= gTacticalStatus.Team[ ENEMY_TEAM ].bLastID ) + num = ubNumAdmins + ubNumTroops + ubNumElites; + + for (i= gTacticalStatus.Team[ ENEMY_TEAM ].bFirstID; + i<= gTacticalStatus.Team[ ENEMY_TEAM ].bLastID && num; + i++) { - while( !pSoldier->bActive || pSoldier->ubGroupID ) + // At this point we should not have added more soldiers than are in slots + Assert( sNumSlots); + + pSoldier = &Menptr[ i ]; + + // Skip inactive and already grouped soldiers + if (!pSoldier->bActive || pSoldier->ubGroupID) { - pSoldier = &Menptr[ ++i ]; - if( i > gTacticalStatus.Team[ ENEMY_TEAM ].bLastID ) - { - AssertMsg( 0, "Failed to assign battle counters for enemies properly. Please send save. KM:0." ); - } + continue; } + switch( pSoldier->ubSoldierClass ) { case SOLDIER_CLASS_ADMINISTRATOR: @@ -718,8 +727,9 @@ BOOLEAN PrepareEnemyForSectorBattle() } break; } - pSoldier = &Menptr[ ++i ]; } + + Assert( ubNumElites + ubNumTroops + ubNumAdmins + num == 0); } pGroup = pGroup->next; } diff --git a/Strategic/Strategic Movement.cpp b/Strategic/Strategic Movement.cpp index eb5983e4..62c15b47 100644 --- a/Strategic/Strategic Movement.cpp +++ b/Strategic/Strategic Movement.cpp @@ -1552,7 +1552,7 @@ void AddCorpsesToBloodcatLair( INT16 sSectorX, INT16 sSectorY ) SET_PALETTEREP_ID ( Corpse.PantsPal, "GREENPANTS" ); - Corpse.bDirection = (INT8)Random(8); + Corpse.ubDirection = (UINT8)Random(8); // Set time of death // Make sure they will be rotting! diff --git a/Strategic/Strategic Pathing.cpp b/Strategic/Strategic Pathing.cpp index 5b1b6656..7f999693 100644 --- a/Strategic/Strategic Pathing.cpp +++ b/Strategic/Strategic Pathing.cpp @@ -495,7 +495,9 @@ PathStPtr BuildAStrategicPath(PathStPtr pPath , INT16 iStartSectorNum, INT16 iEn INT32 iOldDelta = 0; iCurrentSectorNum=iStartSectorNum; - + if(iEndSectorNum < MAP_WORLD_X-1) + return NULL; + if (pNode==NULL) { // start new path list @@ -513,9 +515,6 @@ PathStPtr BuildAStrategicPath(PathStPtr pPath , INT16 iStartSectorNum, INT16 iEn pHeadOfPathList = pNode; } - if(iEndSectorNum < MAP_WORLD_X-1) - return NULL; - iPathLength=((INT32)FindStratPath(((INT16)iStartSectorNum),((INT16)iEndSectorNum), sMvtGroupNumber, fTacticalTraversal )); while(iPathLength > iCount) { @@ -885,6 +884,7 @@ PathStPtr ClearStrategicPathList( PathStPtr pHeadOfPath, INT16 sMvtGroup ) // move to next node pNode = pNode -> pNext; + pNode->pPrev = NULL; // delete delete node MemFree( pDeleteNode ); diff --git a/Strategic/mapscreen.cpp b/Strategic/mapscreen.cpp index 5478289f..c9ec3a13 100644 --- a/Strategic/mapscreen.cpp +++ b/Strategic/mapscreen.cpp @@ -7510,6 +7510,7 @@ void CheckToSeeIfMouseHasLeftMapRegionDuringPathPlotting( ) // clear the temp path if( pTempCharacterPath ) { + pTempCharacterPath = MoveToBeginningOfPathList( pTempCharacterPath); pTempCharacterPath = ClearStrategicPathList( pTempCharacterPath, 0 ); } } diff --git a/Tactical/Auto Bandage.cpp b/Tactical/Auto Bandage.cpp index 2f2fc8d5..ffb7454c 100644 --- a/Tactical/Auto Bandage.cpp +++ b/Tactical/Auto Bandage.cpp @@ -456,7 +456,8 @@ void AutoBandage( BOOLEAN fStart ) cnt = gTacticalStatus.Team[ OUR_TEAM ].bFirstID; for ( pSoldier = MercPtrs[ cnt ]; cnt <= gTacticalStatus.Team[ OUR_TEAM ].bLastID; cnt++,pSoldier++) { - if ( pSoldier->bActive ) + // 0verhaul: Make sure the merc is also in the sector before making him stand up! + if ( pSoldier->bActive && pSoldier->bInSector ) { ActionDone( pSoldier ); if ( pSoldier->bSlotItemTakenFrom != NO_SLOT ) @@ -523,7 +524,12 @@ void AutoBandage( BOOLEAN fStart ) DoScreenIndependantMessageBox(pDoctorWarningString[ 1 ], MSG_BOX_FLAG_OK, NULL ); gfAutoBandageFailed = FALSE; } + + // Memory cleanup! + MemFree( sAutoBandageString); + sAutoBandageString = NULL; } + guiAutoBandageSeconds = 0; ResetAllMercSpeeds( ); diff --git a/Tactical/Boxing.cpp b/Tactical/Boxing.cpp index 01528c31..336fcfca 100644 --- a/Tactical/Boxing.cpp +++ b/Tactical/Boxing.cpp @@ -133,7 +133,7 @@ void BoxingPlayerDisqualified( SOLDIERTYPE * pOffender, INT8 bReason ) { if (bReason == BOXER_OUT_OF_RING || bReason == NON_BOXER_IN_RING) { - EVENT_StopMerc( pOffender, pOffender->sGridNo, pOffender->bDirection ); + EVENT_StopMerc( pOffender, pOffender->sGridNo, pOffender->ubDirection ); } SetBoxingState( DISQUALIFIED ); TriggerNPCRecord( DARREN, 21 ); diff --git a/Tactical/End Game.cpp b/Tactical/End Game.cpp index 7844e1e1..ff72550c 100644 --- a/Tactical/End Game.cpp +++ b/Tactical/End Game.cpp @@ -437,7 +437,7 @@ void BeginHandleQueenBitchDeath( SOLDIERTYPE *pKillerSoldier, INT16 sGridNo, INT { // gTacticalStatus.ubAttackBusyCount++; DebugAttackBusy( "Killing off a queen ally.\n"); - EVENT_SoldierGotHit( pTeamSoldier, 0, 10000, 0, pTeamSoldier->bDirection, 320, NOBODY , FIRE_WEAPON_NO_SPECIAL, pTeamSoldier->bAimShotLocation, 0, NOWHERE ); + EVENT_SoldierGotHit( pTeamSoldier, 0, 10000, 0, pTeamSoldier->ubDirection, 320, NOBODY , FIRE_WEAPON_NO_SPECIAL, pTeamSoldier->bAimShotLocation, 0, NOWHERE ); } } } diff --git a/Tactical/Enemy Soldier Save.cpp b/Tactical/Enemy Soldier Save.cpp index 534ad043..94a52f10 100644 --- a/Tactical/Enemy Soldier Save.cpp +++ b/Tactical/Enemy Soldier Save.cpp @@ -289,7 +289,7 @@ BOOLEAN LoadEnemySoldiersFromTempFile() *curr->pDetailedPlacement = tempDetailedPlacement; curr->pBasicPlacement->fPriorityExistance = TRUE; - curr->pBasicPlacement->bDirection = curr->pDetailedPlacement->bDirection; + curr->pBasicPlacement->ubDirection = curr->pDetailedPlacement->ubDirection; curr->pBasicPlacement->bOrders = curr->pDetailedPlacement->bOrders; curr->pBasicPlacement->bAttitude = curr->pDetailedPlacement->bAttitude; curr->pBasicPlacement->bBodyType = curr->pDetailedPlacement->bBodyType; @@ -332,7 +332,7 @@ BOOLEAN LoadEnemySoldiersFromTempFile() curr->pDetailedPlacement->sSectorX * 7 - curr->pDetailedPlacement->ubSoldierClass * 4 + curr->pDetailedPlacement->bTeam * 7 + - curr->pDetailedPlacement->bDirection * 5 + + curr->pDetailedPlacement->ubDirection * 5 + curr->pDetailedPlacement->fOnRoof * 17 + curr->pDetailedPlacement->sInsertionGridNo * 1 + 3; @@ -519,7 +519,7 @@ BOOLEAN SaveEnemySoldiersToTempFile( INT16 sSectorX, INT16 sSectorY, INT8 bSecto curr->pDetailedPlacement->bSectorZ = pSoldier->bSectorZ; curr->pDetailedPlacement->ubSoldierClass = pSoldier->ubSoldierClass; curr->pDetailedPlacement->bTeam = pSoldier->bTeam; - curr->pDetailedPlacement->bDirection = pSoldier->bDirection; + curr->pDetailedPlacement->ubDirection = pSoldier->ubDirection; //we don't want the player to think that all the enemies start in the exact position when we //left the map, so randomize the start locations either current position or original position. @@ -729,7 +729,7 @@ BOOLEAN SaveEnemySoldiersToTempFile( INT16 sSectorX, INT16 sSectorY, INT8 bSecto curr->pDetailedPlacement->sSectorX * 7 - curr->pDetailedPlacement->ubSoldierClass * 4 + curr->pDetailedPlacement->bTeam * 7 + - curr->pDetailedPlacement->bDirection * 5 + + curr->pDetailedPlacement->ubDirection * 5 + curr->pDetailedPlacement->fOnRoof * 17 + curr->pDetailedPlacement->sInsertionGridNo * 1 + 3; @@ -1016,7 +1016,7 @@ BOOLEAN NewWayOfLoadingEnemySoldiersFromTempFile() *curr->pDetailedPlacement = tempDetailedPlacement; curr->pBasicPlacement->fPriorityExistance = TRUE; - curr->pBasicPlacement->bDirection = curr->pDetailedPlacement->bDirection; + curr->pBasicPlacement->ubDirection = curr->pDetailedPlacement->ubDirection; curr->pBasicPlacement->bOrders = curr->pDetailedPlacement->bOrders; curr->pBasicPlacement->bAttitude = curr->pDetailedPlacement->bAttitude; curr->pBasicPlacement->bBodyType = curr->pDetailedPlacement->bBodyType; @@ -1059,7 +1059,7 @@ BOOLEAN NewWayOfLoadingEnemySoldiersFromTempFile() curr->pDetailedPlacement->sSectorX * 7 - curr->pDetailedPlacement->ubSoldierClass * 4 + curr->pDetailedPlacement->bTeam * 7 + - curr->pDetailedPlacement->bDirection * 5 + + curr->pDetailedPlacement->ubDirection * 5 + curr->pDetailedPlacement->fOnRoof * 17 + curr->pDetailedPlacement->sInsertionGridNo * 1 + 3; @@ -1376,7 +1376,7 @@ BOOLEAN NewWayOfLoadingCiviliansFromTempFile() *curr->pDetailedPlacement = tempDetailedPlacement; curr->pBasicPlacement->fPriorityExistance = TRUE; - curr->pBasicPlacement->bDirection = curr->pDetailedPlacement->bDirection; + curr->pBasicPlacement->ubDirection = curr->pDetailedPlacement->ubDirection; curr->pBasicPlacement->bOrders = curr->pDetailedPlacement->bOrders; curr->pBasicPlacement->bAttitude = curr->pDetailedPlacement->bAttitude; curr->pBasicPlacement->bBodyType = curr->pDetailedPlacement->bBodyType; @@ -1419,7 +1419,7 @@ BOOLEAN NewWayOfLoadingCiviliansFromTempFile() curr->pDetailedPlacement->sSectorX * 7 - curr->pDetailedPlacement->ubSoldierClass * 4 + curr->pDetailedPlacement->bTeam * 7 + - curr->pDetailedPlacement->bDirection * 5 + + curr->pDetailedPlacement->ubDirection * 5 + curr->pDetailedPlacement->fOnRoof * 17 + curr->pDetailedPlacement->sInsertionGridNo * 1 + 3; @@ -1614,7 +1614,7 @@ BOOLEAN NewWayOfSavingEnemyAndCivliansToTempFile( INT16 sSectorX, INT16 sSectorY curr->pDetailedPlacement->bSectorZ = pSoldier->bSectorZ; curr->pDetailedPlacement->ubSoldierClass = pSoldier->ubSoldierClass; curr->pDetailedPlacement->bTeam = pSoldier->bTeam; - curr->pDetailedPlacement->bDirection = pSoldier->bDirection; + curr->pDetailedPlacement->ubDirection = pSoldier->ubDirection; //we don't want the player to think that all the enemies start in the exact position when we //left the map, so randomize the start locations either current position or original position. @@ -1807,7 +1807,7 @@ BOOLEAN NewWayOfSavingEnemyAndCivliansToTempFile( INT16 sSectorX, INT16 sSectorY curr->pDetailedPlacement->sSectorX * 7 - curr->pDetailedPlacement->ubSoldierClass * 4 + curr->pDetailedPlacement->bTeam * 7 + - curr->pDetailedPlacement->bDirection * 5 + + curr->pDetailedPlacement->ubDirection * 5 + curr->pDetailedPlacement->fOnRoof * 17 + curr->pDetailedPlacement->sInsertionGridNo * 1 + 3; @@ -2073,7 +2073,7 @@ BOOLEAN CountNumberOfElitesRegularsAdminsAndCreaturesFromEnemySoldiersTempFile( *curr->pDetailedPlacement = tempDetailedPlacement; curr->pBasicPlacement->fPriorityExistance = TRUE; - curr->pBasicPlacement->bDirection = curr->pDetailedPlacement->bDirection; + curr->pBasicPlacement->ubDirection = curr->pDetailedPlacement->ubDirection; curr->pBasicPlacement->bOrders = curr->pDetailedPlacement->bOrders; curr->pBasicPlacement->bAttitude = curr->pDetailedPlacement->bAttitude; curr->pBasicPlacement->bBodyType = curr->pDetailedPlacement->bBodyType; @@ -2116,7 +2116,7 @@ BOOLEAN CountNumberOfElitesRegularsAdminsAndCreaturesFromEnemySoldiersTempFile( curr->pDetailedPlacement->sSectorX * 7 - curr->pDetailedPlacement->ubSoldierClass * 4 + curr->pDetailedPlacement->bTeam * 7 + - curr->pDetailedPlacement->bDirection * 5 + + curr->pDetailedPlacement->ubDirection * 5 + curr->pDetailedPlacement->fOnRoof * 17 + curr->pDetailedPlacement->sInsertionGridNo * 1 + 3; diff --git a/Tactical/Handle Doors.cpp b/Tactical/Handle Doors.cpp index afc1ee5f..d82b62f3 100644 --- a/Tactical/Handle Doors.cpp +++ b/Tactical/Handle Doors.cpp @@ -307,7 +307,7 @@ void InteractWithOpenableStruct( SOLDIERTYPE *pSoldier, STRUCTURE *pStructure, U if ( pDoorStatus && (pDoorStatus->ubFlags & DOOR_BUSY) ) { // Send this guy into stationary stance.... - EVENT_StopMerc( pSoldier, pSoldier->sGridNo, pSoldier->bDirection ); + EVENT_StopMerc( pSoldier, pSoldier->sGridNo, pSoldier->ubDirection ); if ( pSoldier->bTeam == gbPlayerNum ) { diff --git a/Tactical/Handle Items.cpp b/Tactical/Handle Items.cpp index fdda0e0f..5eb13b00 100644 --- a/Tactical/Handle Items.cpp +++ b/Tactical/Handle Items.cpp @@ -2152,7 +2152,7 @@ OBJECTTYPE* InternalAddItemToPool( INT16 *psGridNo, OBJECTTYPE *pObject, INT8 bV // IF SO, DONT'T ADD! bTerrainID = GetTerrainType( *psGridNo ); - if ( bTerrainID == DEEP_WATER || bTerrainID == LOW_WATER || bTerrainID == MED_WATER ) + if ( TERRAIN_IS_WATER( bTerrainID) ) { // if ( Item[ pObject->usItem ].fFlags & ITEM_SINKS ) if ( Item[ pObject->usItem ].sinks ) diff --git a/Tactical/Handle UI Plan.cpp b/Tactical/Handle UI Plan.cpp index 4c8e4a8a..24ac2c53 100644 --- a/Tactical/Handle UI Plan.cpp +++ b/Tactical/Handle UI Plan.cpp @@ -115,7 +115,7 @@ BOOLEAN AddUIPlan( UINT16 sGridNo, UINT8 ubPlanID ) bDirection = (INT8)gpUIPlannedSoldier->usPathingData[ gpUIPlannedSoldier->usPathDataSize - 1 ]; // Set direction - pPlanSoldier->bDirection = bDirection; + pPlanSoldier->ubDirection = bDirection; pPlanSoldier->bDesiredDirection = bDirection; // Set walking animation @@ -194,7 +194,7 @@ BOOLEAN AddUIPlan( UINT16 sGridNo, UINT8 ubPlanID ) bDirection = (INT8)gpUIPlannedSoldier->usPathingData[ gpUIPlannedSoldier->usPathDataSize - 1 ]; // Set direction - pPlanSoldier->bDirection = bDirection; + pPlanSoldier->ubDirection = bDirection; pPlanSoldier->bDesiredDirection = bDirection; // Set walking animation @@ -220,7 +220,7 @@ BOOLEAN AddUIPlan( UINT16 sGridNo, UINT8 ubPlanID ) bDirection = (INT8)GetDirectionFromGridNo( sGridNo, gpUIPlannedSoldier ); // Set direction - gpUIPlannedSoldier->bDirection = bDirection; + gpUIPlannedSoldier->ubDirection = bDirection; gpUIPlannedSoldier->bDesiredDirection = bDirection; // Set to shooting animation diff --git a/Tactical/Handle UI.cpp b/Tactical/Handle UI.cpp index 184db366..d524ef3b 100644 --- a/Tactical/Handle UI.cpp +++ b/Tactical/Handle UI.cpp @@ -85,6 +85,7 @@ #include "qarray.h" #include "environment.h" #include "Map Information.h" +#include "Soldier Control.h" #endif @@ -246,8 +247,6 @@ void SetUIbasedOnStance( SOLDIERTYPE *pSoldier, INT8 bNewStance ); INT8 DrawUIMovementPath( SOLDIERTYPE *pSoldier, UINT16 usMapPos, UINT32 uiFlags ); INT8 UIHandleInteractiveTilesAndItemsOnTerrain( SOLDIERTYPE *pSoldier, INT16 usMapPos, BOOLEAN fUseOKCursor, BOOLEAN fItemsOnlyIfOnIntTiles ); -extern void EVENT_InternalSetSoldierDesiredDirection( SOLDIERTYPE *pSoldier, UINT16 usNewDirection, BOOLEAN fInitalMove, UINT16 usAnimState ); - extern BOOLEAN gfExitDebugScreen; extern INT8 gCurDebugPage; extern BOOLEAN gfGetNewPathThroughPeople; @@ -1238,7 +1237,7 @@ UINT32 UIHandleTestHit( UI_EVENT *pUIEvent ) // gTacticalStatus.ubAttackBusyCount++; DebugAttackBusy( "Testing a hit.\n" ); - EVENT_SoldierGotHit( pSoldier, 1, bDamage, 10, pSoldier->bDirection, 320, NOBODY , FIRE_WEAPON_NO_SPECIAL, pSoldier->bAimShotLocation, 0, NOWHERE ); + EVENT_SoldierGotHit( pSoldier, 1, bDamage, 10, pSoldier->ubDirection, 320, NOBODY , FIRE_WEAPON_NO_SPECIAL, pSoldier->bAimShotLocation, 0, NOWHERE ); // callahan update end - put everything as it was } return( GAME_SCREEN ); @@ -2136,7 +2135,7 @@ UINT32 UIHandleMAdjustStanceMode( UI_EVENT *pUIEvent ) // IF we are on a basic level...(temp) if ( pSoldier->bLevel == 0 ) { - if ( FindHeigherLevel( pSoldier, pSoldier->sGridNo, pSoldier->bDirection, &bNewDirection ) ) + if ( FindHeigherLevel( pSoldier, pSoldier->sGridNo, pSoldier->ubDirection, &bNewDirection ) ) { ubNearHeigherLevel = TRUE; } @@ -2145,7 +2144,7 @@ UINT32 UIHandleMAdjustStanceMode( UI_EVENT *pUIEvent ) // IF we are higher... if ( pSoldier->bLevel > 0 ) { - if ( FindLowerLevel( pSoldier, pSoldier->sGridNo, pSoldier->bDirection, &bNewDirection ) ) + if ( FindLowerLevel( pSoldier, pSoldier->sGridNo, pSoldier->ubDirection, &bNewDirection ) ) { ubNearLowerLevel = TRUE; } @@ -3000,7 +2999,7 @@ void GetMercClimbDirection( UINT8 ubSoldierID, BOOLEAN *pfGoDown, BOOLEAN *pfGoU if ( pSoldier->bLevel == 0 ) { // See if we are not in a building! - if ( FindHeigherLevel( pSoldier, pSoldier->sGridNo, pSoldier->bDirection, &bNewDirection ) ) + if ( FindHeigherLevel( pSoldier, pSoldier->sGridNo, pSoldier->ubDirection, &bNewDirection ) ) { *pfGoUp = TRUE; } @@ -3009,7 +3008,7 @@ void GetMercClimbDirection( UINT8 ubSoldierID, BOOLEAN *pfGoDown, BOOLEAN *pfGoU // IF we are higher... if ( pSoldier->bLevel > 0 ) { - if ( FindLowerLevel( pSoldier, pSoldier->sGridNo, pSoldier->bDirection, &bNewDirection ) ) + if ( FindLowerLevel( pSoldier, pSoldier->sGridNo, pSoldier->ubDirection, &bNewDirection ) ) { *pfGoDown = TRUE; } @@ -4571,7 +4570,7 @@ UINT32 UIHandleLCOnTerrain( UI_EVENT *pUIEvent ) sFacingDir = GetDirectionFromXY( sXPos, sYPos, pSoldier ); // Set # of APs - if ( sFacingDir != pSoldier->bDirection ) + if ( sFacingDir != pSoldier->ubDirection ) { gsCurrentActionPoints = GetAPsToLook( pSoldier ); gfUIHandleShowMoveGrid = FALSE; @@ -4627,7 +4626,7 @@ BOOLEAN MakeSoldierTurn( SOLDIERTYPE *pSoldier, INT16 sXPos, INT16 sYPos ) // Get direction from mouse pos sFacingDir = GetDirectionFromXY( sXPos, sYPos, pSoldier ); - if ( sFacingDir != pSoldier->bDirection ) + if ( sFacingDir != pSoldier->ubDirection ) { sAPCost = GetAPsToLook( pSoldier ); @@ -5341,7 +5340,7 @@ UINT32 UIHandleJumpOver( UI_EVENT *pUIEvent ) { SOLDIERTYPE *pSoldier; UINT16 usMapPos; - INT8 bDirection; + UINT8 ubDirection; // Here, first get map screen if ( !GetSoldier( &pSoldier, gusSelectedSoldier ) ) @@ -5366,11 +5365,11 @@ UINT32 UIHandleJumpOver( UI_EVENT *pUIEvent ) pSoldier->ubPendingAction = NO_PENDING_ACTION; // Get direction to goto.... - bDirection = (INT8)GetDirectionFromGridNo( usMapPos, pSoldier ); + ubDirection = GetDirectionFromGridNo( usMapPos, pSoldier ); pSoldier->fDontChargeTurningAPs = TRUE; - EVENT_InternalSetSoldierDesiredDirection( pSoldier, bDirection, FALSE, pSoldier->usAnimState ); + EVENT_SetSoldierDesiredDirection( pSoldier, ubDirection); pSoldier->fTurningUntilDone = TRUE; // ATE: Reset flag to go back to prone... //pSoldier->fTurningFromPronePosition = TURNING_FROM_PRONE_OFF; diff --git a/Tactical/Interface Dialogue.cpp b/Tactical/Interface Dialogue.cpp index c485f94d..26b800ff 100644 --- a/Tactical/Interface Dialogue.cpp +++ b/Tactical/Interface Dialogue.cpp @@ -1775,7 +1775,7 @@ void HandleNPCDoAction( UINT8 ubTargetNPC, UINT16 usActionCode, UINT8 ubQuoteNum // see if we are facing this person ubDesiredMercDir = atan8(CenterX(pSoldier->sGridNo),CenterY(pSoldier->sGridNo),CenterX(pSoldier2->sGridNo),CenterY(pSoldier2->sGridNo)); // if not already facing in that direction, - if (pSoldier->bDirection != ubDesiredMercDir) + if (pSoldier->ubDirection != ubDesiredMercDir) { EVENT_SetSoldierDesiredDirection( pSoldier, ubDesiredMercDir ); } @@ -1961,7 +1961,7 @@ void HandleNPCDoAction( UINT8 ubTargetNPC, UINT16 usActionCode, UINT8 ubQuoteNum pSoldier = FindSoldierByProfileID( ubTargetNPC, FALSE ); if (pSoldier && pSoldier->inv[HANDPOS].usItem != NOTHING) { - sGridNo = pSoldier->sGridNo + DirectionInc( pSoldier->bDirection ); + sGridNo = pSoldier->sGridNo + DirectionInc( pSoldier->ubDirection ); SoldierReadyWeapon( pSoldier, (INT16) (sGridNo % WORLD_COLS), (INT16) (sGridNo / WORLD_COLS), FALSE ); } break; @@ -2226,7 +2226,7 @@ void HandleNPCDoAction( UINT8 ubTargetNPC, UINT16 usActionCode, UINT8 ubQuoteNum if (bItemIn != NO_SLOT && bItemIn != HANDPOS) { SwapObjs( &(pSoldier->inv[HANDPOS]), &(pSoldier->inv[bItemIn]) ); - sGridNo = pSoldier->sGridNo + DirectionInc( pSoldier->bDirection ); + sGridNo = pSoldier->sGridNo + DirectionInc( pSoldier->ubDirection ); SoldierReadyWeapon( pSoldier, (INT16) (sGridNo % WORLD_COLS), (INT16) (sGridNo / WORLD_COLS), FALSE ); } // fall through so that the person faces the nearest merc! @@ -2240,7 +2240,7 @@ void HandleNPCDoAction( UINT8 ubTargetNPC, UINT16 usActionCode, UINT8 ubQuoteNum // see if we are facing this person ubDesiredMercDir = atan8(CenterX(pSoldier->sGridNo),CenterY(pSoldier->sGridNo),CenterX(sGridNo),CenterY(sGridNo)); // if not already facing in that direction, - if (pSoldier->bDirection != ubDesiredMercDir) + if (pSoldier->ubDirection != ubDesiredMercDir) { EVENT_SetSoldierDesiredDirection( pSoldier, ubDesiredMercDir ); } @@ -2395,7 +2395,7 @@ void HandleNPCDoAction( UINT8 ubTargetNPC, UINT16 usActionCode, UINT8 ubQuoteNum if (pSoldier) { DeleteTalkingMenu(); - EVENT_SoldierGotHit( pSoldier, 1, 100, 10, pSoldier->bDirection, 320, NOBODY , FIRE_WEAPON_NO_SPECIAL, AIM_SHOT_TORSO, 0, NOWHERE ); + EVENT_SoldierGotHit( pSoldier, 1, 100, 10, pSoldier->ubDirection, 320, NOBODY , FIRE_WEAPON_NO_SPECIAL, AIM_SHOT_TORSO, 0, NOWHERE ); } break; diff --git a/Tactical/Interface Items.cpp b/Tactical/Interface Items.cpp index 4a1fa6db..bbcc3616 100644 --- a/Tactical/Interface Items.cpp +++ b/Tactical/Interface Items.cpp @@ -4455,7 +4455,7 @@ BOOLEAN SoldierCanSeeCatchComing( SOLDIERTYPE *pSoldier, INT16 sSrcGridNo ) bTargetDirection = (INT8)GetDirectionToGridNoFromGridNo( pSoldier->sGridNo, sSrcGridNo ); // Look 3 directions Clockwise from what we are facing.... - bDirection = pSoldier->bDirection; + bDirection = pSoldier->ubDirection; for ( cnt = 0; cnt < 3; cnt++ ) { @@ -4468,7 +4468,7 @@ BOOLEAN SoldierCanSeeCatchComing( SOLDIERTYPE *pSoldier, INT16 sSrcGridNo ) } // Look 3 directions CounterClockwise from what we are facing.... - bDirection = pSoldier->bDirection; + bDirection = pSoldier->ubDirection; for ( cnt = 0; cnt < 3; cnt++ ) { @@ -4826,7 +4826,7 @@ BOOLEAN HandleItemPointerClick( UINT16 usMapPos ) } // Don't allow if our soldier is a # of things... - if ( AM_AN_EPC( gpItemPointerSoldier ) || gpItemPointerSoldier->bLife < OKLIFE || gpItemPointerSoldier->bOverTerrainType == DEEP_WATER ) + if ( AM_AN_EPC( gpItemPointerSoldier ) || gpItemPointerSoldier->bLife < OKLIFE || MercInDeepWater( gpItemPointerSoldier) ) { return( FALSE ); } @@ -5130,7 +5130,7 @@ BOOLEAN HandleItemPointerClick( UINT16 usMapPos ) ubFacingDirection = (UINT8)GetDirectionFromGridNo( gpItemPointerSoldier->sGridNo, pSoldier ); // Stop merc first.... - EVENT_StopMerc( pSoldier, pSoldier->sGridNo, pSoldier->bDirection ); + EVENT_StopMerc( pSoldier, pSoldier->sGridNo, pSoldier->ubDirection ); // WANNE: Also turn merc if he is crouched and he passes an item if ( !MercInWater( pSoldier ) ) diff --git a/Tactical/Interface Panels.cpp b/Tactical/Interface Panels.cpp index d062e46e..0780c1e4 100644 --- a/Tactical/Interface Panels.cpp +++ b/Tactical/Interface Panels.cpp @@ -900,7 +900,7 @@ void UpdateSMPanel( ) } } - if ( FindFenceJumpDirection( gpSMCurrentMerc, gpSMCurrentMerc->sGridNo, gpSMCurrentMerc->bDirection, &bDirection ) ) + if ( FindFenceJumpDirection( gpSMCurrentMerc, gpSMCurrentMerc->sGridNo, gpSMCurrentMerc->ubDirection, &bDirection ) ) { EnableButton( iSMPanelButtons[ CLIMB_BUTTON ] ); } @@ -3140,7 +3140,7 @@ void BtnClimbCallback(GUI_BUTTON *btn,INT32 reason) BeginSoldierClimbUpRoof( gpSMCurrentMerc ); } - if ( FindFenceJumpDirection( gpSMCurrentMerc, gpSMCurrentMerc->sGridNo, gpSMCurrentMerc->bDirection, &bDirection ) ) + if ( FindFenceJumpDirection( gpSMCurrentMerc, gpSMCurrentMerc->sGridNo, gpSMCurrentMerc->ubDirection, &bDirection ) ) { BeginSoldierClimbFence( gpSMCurrentMerc ); } diff --git a/Tactical/Item Types.h b/Tactical/Item Types.h index 86837226..08cb7f67 100644 --- a/Tactical/Item Types.h +++ b/Tactical/Item Types.h @@ -586,10 +586,10 @@ typedef enum BIG_TEAR_GAS, SMALL_CREATURE_GAS, LARGE_CREATURE_GAS, - VERY_SMALL_CREATURE_GAS, + VERY_SMALL_CREATURE_GAS=995, // Renumbered because the original 160 was lost // armor - FLAK_JACKET, //= FIRST_ARMOUR, ( We're out of space! ) + FLAK_JACKET=161, //= FIRST_ARMOUR, ( We're out of space! ) FLAK_JACKET_18, FLAK_JACKET_Y, KEVLAR_VEST, diff --git a/Tactical/Items.cpp b/Tactical/Items.cpp index 74f7daee..95331fe2 100644 --- a/Tactical/Items.cpp +++ b/Tactical/Items.cpp @@ -4844,6 +4844,7 @@ BOOLEAN CreateGun( UINT16 usItem, INT8 bStatus, OBJECTTYPE * pObj ) { pObj->ItemData.Gun.ubGunShotsLeft = GetMagSize(pObj); pObj->ItemData.Gun.ubGunAmmoType = AMMO_MONSTER; + pObj->ItemData.Gun.ubGunState |= GS_CARTRIDGE_IN_CHAMBER; // 0verhaul: Monsters don't have to reload! } else if ( EXPLOSIVE_GUN( usItem ) ) { @@ -5701,7 +5702,7 @@ void WaterDamage( SOLDIERTYPE *pSoldier ) INT8 bLoop, bDamage, bDieSize; UINT32 uiRoll; - if ( pSoldier->bOverTerrainType == DEEP_WATER ) + if ( MercInDeepWater( pSoldier) ) { for ( bLoop = 0; bLoop < NUM_INV_SLOTS; bLoop++ ) { @@ -5733,7 +5734,7 @@ void WaterDamage( SOLDIERTYPE *pSoldier ) { // reduce camouflage by 2% per tile of deep water // and 1% for medium water - if ( pSoldier->bOverTerrainType == DEEP_WATER ) + if ( MercInDeepWater( pSoldier) ) pSoldier->bCamo = __max( 0, pSoldier->bCamo - 2 ); else pSoldier->bCamo = __max( 0, pSoldier->bCamo - 1 ); @@ -5746,7 +5747,7 @@ void WaterDamage( SOLDIERTYPE *pSoldier ) { // reduce camouflage by 2% per tile of deep water // and 1% for medium water - if ( pSoldier->bOverTerrainType == DEEP_WATER ) + if ( MercInDeepWater( pSoldier) ) pSoldier->urbanCamo = __max( 0, pSoldier->urbanCamo - 2 ); else pSoldier->urbanCamo = __max( 0, pSoldier->urbanCamo - 1 ); @@ -5759,7 +5760,7 @@ void WaterDamage( SOLDIERTYPE *pSoldier ) { // reduce camouflage by 2% per tile of deep water // and 1% for medium water - if ( pSoldier->bOverTerrainType == DEEP_WATER ) + if ( MercInDeepWater( pSoldier) ) pSoldier->desertCamo = __max( 0, pSoldier->desertCamo - 2 ); else pSoldier->desertCamo = __max( 0, pSoldier->desertCamo - 1 ); @@ -5772,7 +5773,7 @@ void WaterDamage( SOLDIERTYPE *pSoldier ) { // reduce camouflage by 2% per tile of deep water // and 1% for medium water - if ( pSoldier->bOverTerrainType == DEEP_WATER ) + if ( MercInDeepWater( pSoldier) ) pSoldier->snowCamo = __max( 0, pSoldier->snowCamo - 2 ); else pSoldier->snowCamo = __max( 0, pSoldier->snowCamo - 1 ); @@ -5798,7 +5799,7 @@ void WaterDamage( SOLDIERTYPE *pSoldier ) if ( pSoldier->bTeam == gbPlayerNum && pSoldier->bMonsterSmell > 0 ) { - if ( pSoldier->bOverTerrainType == DEEP_WATER ) + if ( MercInDeepWater( pSoldier) ) { bDieSize = 10; } @@ -6557,8 +6558,6 @@ INT16 GetVisionRangeBonus( SOLDIERTYPE * pSoldier ) UINT16 usItem; INVTYPE *pItem; - //ADB and AXP 28.03.2007: CtH bug fix: We also want to check on a firing weapon, "raised" alone is not enough ;) - bool usingGunScope = WeaponReady(pSoldier); for (int i = HELMETPOS; i < BIGPOCK1POS; i++) { // Okay, it's time for some optimization here too @@ -6572,15 +6571,16 @@ INT16 GetVisionRangeBonus( SOLDIERTYPE * pSoldier ) continue; } - if (!IsWeapon(usItem) || (IsWeapon(usItem) && usingGunScope == true) ) + if (!IsWeapon(usItem) || (IsWeapon(usItem) && WeaponReady(pSoldier) ) ) { bns += BonusReduceMore( pItem->visionrangebonus, pObj->ItemData.Generic.bStatus[0] ); } } - // Snap: check only attachments on a raised weapon! + // Snap: check only attachments on a readied weapon! + // 0verhaul: Moved this bug fix into WeaponReady so that all CTH modifier functions may benefit from this fix //AXP 28.03.2007: CtH bug fix: We also want to check on a firing weapon, "raised" alone is not enough ;) - if ( usingGunScope == true ) + if ( WeaponReady(pSoldier) ) { pObj = &( pSoldier->inv[HANDPOS]); @@ -6614,8 +6614,6 @@ INT16 GetNightVisionRangeBonus( SOLDIERTYPE * pSoldier, UINT8 bLightLevel ) UINT16 usItem; INVTYPE *pItem; - //ADB and AXP 28.03.2007: CtH bug fix: We also want to check on a firing weapon, "raised" alone is not enough ;) - bool usingGunScope = WeaponReady(pSoldier); for (int i = HELMETPOS; i < BIGPOCK1POS; i++) { // More optimization @@ -6629,7 +6627,7 @@ INT16 GetNightVisionRangeBonus( SOLDIERTYPE * pSoldier, UINT8 bLightLevel ) continue; } - if (!IsWeapon(usItem) || (IsWeapon(usItem) && usingGunScope == true ) ) + if (!IsWeapon(usItem) || (IsWeapon(usItem) && WeaponReady(pSoldier) ) ) { bns += BonusReduceMore( NightBonusScale( pItem->nightvisionrangebonus, bLightLevel ), @@ -6638,7 +6636,7 @@ INT16 GetNightVisionRangeBonus( SOLDIERTYPE * pSoldier, UINT8 bLightLevel ) } // Snap: check only attachments on a raised weapon! - if ( usingGunScope == true ) + if ( WeaponReady(pSoldier) ) { pObj = &( pSoldier->inv[HANDPOS]); @@ -6660,8 +6658,6 @@ INT16 GetCaveVisionRangeBonus( SOLDIERTYPE * pSoldier, UINT8 bLightLevel ) UINT16 usItem; INVTYPE *pItem; - //ADB and AXP 28.03.2007: CtH bug fix: We also want to check on a firing weapon, "raised" alone is not enough ;) - bool usingGunScope = WeaponReady(pSoldier); for (int i = 0; i < BIGPOCK1POS; i++) { // More optimization @@ -6676,7 +6672,7 @@ INT16 GetCaveVisionRangeBonus( SOLDIERTYPE * pSoldier, UINT8 bLightLevel ) continue; } - if (!IsWeapon(usItem) || (IsWeapon(usItem) && usingGunScope == true ) ) + if (!IsWeapon(usItem) || (IsWeapon(usItem) && WeaponReady(pSoldier) ) ) { bns += BonusReduceMore( NightBonusScale( pItem->cavevisionrangebonus, bLightLevel ), @@ -6685,7 +6681,7 @@ INT16 GetCaveVisionRangeBonus( SOLDIERTYPE * pSoldier, UINT8 bLightLevel ) } // Snap: check only attachments on a raised weapon! - if ( usingGunScope == true ) + if ( WeaponReady(pSoldier) ) { pObj = &( pSoldier->inv[HANDPOS]); @@ -6709,8 +6705,6 @@ INT16 GetDayVisionRangeBonus( SOLDIERTYPE * pSoldier, UINT8 bLightLevel ) // Snap: Scale the bonus with the light level - //ADB and AXP 28.03.2007: CtH bug fix: We also want to check on a firing weapon, "raised" alone is not enough ;) - bool usingGunScope = WeaponReady(pSoldier); for (int i = 0; i < BIGPOCK1POS; i++) { // More optimization @@ -6725,7 +6719,7 @@ INT16 GetDayVisionRangeBonus( SOLDIERTYPE * pSoldier, UINT8 bLightLevel ) continue; } - if (!IsWeapon(usItem) || (IsWeapon(usItem) && usingGunScope == true ) ) + if (!IsWeapon(usItem) || (IsWeapon(usItem) && WeaponReady(pSoldier) ) ) { bns += BonusReduceMore( idiv( pItem->dayvisionrangebonus * (NORMAL_LIGHTLEVEL_NIGHT - bLightLevel), NORMAL_LIGHTLEVEL_NIGHT ), @@ -6734,7 +6728,7 @@ INT16 GetDayVisionRangeBonus( SOLDIERTYPE * pSoldier, UINT8 bLightLevel ) } // Snap: check only attachments on a raised weapon! - if ( usingGunScope == true ) + if ( WeaponReady(pSoldier) ) { pObj = &( pSoldier->inv[HANDPOS]); @@ -6758,8 +6752,6 @@ INT16 GetBrightLightVisionRangeBonus( SOLDIERTYPE * pSoldier, UINT8 bLightLevel // Snap: Scale the bonus with the light level - //ADB and AXP 28.03.2007: CtH bug fix: We also want to check on a firing weapon, "raised" alone is not enough ;) - bool usingGunScope = WeaponReady(pSoldier); for (int i = 0; i < BIGPOCK1POS; i++) { // More optimization @@ -6774,7 +6766,7 @@ INT16 GetBrightLightVisionRangeBonus( SOLDIERTYPE * pSoldier, UINT8 bLightLevel continue; } - if (!IsWeapon(usItem) || (IsWeapon(usItem) && usingGunScope == true ) ) + if (!IsWeapon(usItem) || (IsWeapon(usItem) && WeaponReady(pSoldier) ) ) { bns += BonusReduceMore( idiv( pItem->brightlightvisionrangebonus * (NORMAL_LIGHTLEVEL_DAY - bLightLevel), NORMAL_LIGHTLEVEL_DAY ), @@ -6783,7 +6775,7 @@ INT16 GetBrightLightVisionRangeBonus( SOLDIERTYPE * pSoldier, UINT8 bLightLevel } // Snap: check only attachments on a raised weapon! - if ( usingGunScope == true ) + if ( WeaponReady(pSoldier) ) { pObj = &( pSoldier->inv[HANDPOS]); @@ -6850,9 +6842,8 @@ UINT8 GetPercentTunnelVision( SOLDIERTYPE * pSoldier ) } } - bool usingGunScope = WeaponReady(pSoldier); // Snap: check only attachments on a raised weapon! - if ( usingGunScope == true ) + if ( WeaponReady(pSoldier) ) { OBJECTTYPE *pInv = &(pSoldier->inv[HANDPOS]); usItem = pInv->usItem; @@ -6877,7 +6868,6 @@ UINT8 GetPercentTunnelVision( SOLDIERTYPE * pSoldier ) BOOLEAN HasThermalOptics( SOLDIERTYPE * pSoldier ) { - bool usingGunScope = WeaponReady(pSoldier); for (int i = 0; i < BIGPOCK1POS; i++) { if ( (i == HANDPOS || i == SECONDHANDPOS) && @@ -6886,7 +6876,7 @@ BOOLEAN HasThermalOptics( SOLDIERTYPE * pSoldier ) continue; } - if (!IsWeapon(pSoldier->inv[i].usItem) || (IsWeapon(pSoldier->inv[i].usItem) && usingGunScope == true) ) + if (!IsWeapon(pSoldier->inv[i].usItem) || (IsWeapon(pSoldier->inv[i].usItem) && WeaponReady(pSoldier) ) ) { if (Item[pSoldier->inv[i].usItem].thermaloptics) return TRUE; @@ -6894,7 +6884,7 @@ BOOLEAN HasThermalOptics( SOLDIERTYPE * pSoldier ) } // Snap: check only attachments on a raised weapon! - if ( usingGunScope == true ) + if ( WeaponReady(pSoldier) ) { for (int i=0; i < MAX_ATTACHMENTS; i++) { diff --git a/Tactical/LOS.cpp b/Tactical/LOS.cpp index 8d5fbe1f..bfe11802 100644 --- a/Tactical/LOS.cpp +++ b/Tactical/LOS.cpp @@ -1410,12 +1410,12 @@ BOOLEAN CalculateSoldierZPos( SOLDIERTYPE * pSoldier, UINT8 ubPosType, FLOAT * p // Crow always as prone... ubHeight = ANIM_PRONE; } - else if (pSoldier->bOverTerrainType == DEEP_WATER) + else if ( MercInDeepWater( pSoldier) ) { // treat as prone ubHeight = ANIM_PRONE; } - else if ( pSoldier->bOverTerrainType == LOW_WATER || pSoldier->bOverTerrainType == MED_WATER ) + else if ( MercInShallowWater(pSoldier) ) { // treat as crouched ubHeight = ANIM_CROUCH; @@ -2020,7 +2020,7 @@ BOOLEAN BulletHitMerc( BULLET * pBullet, STRUCTURE * pStructure, BOOLEAN fIntend if ( (pTarget->ubBodyType >= ADULTFEMALEMONSTER) && (pTarget->ubBodyType <= YAM_MONSTER) ) { ubAttackDirection = (UINT8) GetDirectionToGridNoFromGridNo( pBullet->pFirer->sGridNo, pTarget->sGridNo ); - if ( ubAttackDirection == pTarget->bDirection || ubAttackDirection == gOneCCDirection[ pTarget->bDirection ] || ubAttackDirection == gOneCDirection[ pTarget->bDirection ] ) + if ( ubAttackDirection == pTarget->ubDirection || ubAttackDirection == gOneCCDirection[ pTarget->ubDirection ] || ubAttackDirection == gOneCDirection[ pTarget->ubDirection ] ) { // may hit weak spot! if (0) // check fact @@ -2043,7 +2043,7 @@ BOOLEAN BulletHitMerc( BULLET * pBullet, STRUCTURE * pStructure, BOOLEAN fIntend if (ubHitLocation == AIM_SHOT_RANDOM) // i.e. if not set yet { - if (pTarget->bOverTerrainType == DEEP_WATER) + if (MercInDeepWater( pTarget) ) { // automatic head hit! ubHitLocation = AIM_SHOT_HEAD; @@ -2054,7 +2054,7 @@ BOOLEAN BulletHitMerc( BULLET * pBullet, STRUCTURE * pStructure, BOOLEAN fIntend { case ANIM_STAND: // Fall through to crouch if in shallow or medium water - if ( pTarget->bOverTerrainType != LOW_WATER && pTarget->bOverTerrainType != MED_WATER ) + if ( !MercInShallowWater( pTarget) ) { dZPosRelToMerc = FixedToFloat( pBullet->qCurrZ ) - CONVERT_PIXELS_TO_HEIGHTUNITS( gpWorldLevelData[pBullet->sGridNo].sHeight ); if ( dZPosRelToMerc > HEIGHT_UNITS ) @@ -2110,7 +2110,7 @@ BOOLEAN BulletHitMerc( BULLET * pBullet, STRUCTURE * pStructure, BOOLEAN fIntend ubAttackDirection = (UINT8) GetDirectionToGridNoFromGridNo( pBullet->pFirer->sGridNo, pTarget->sGridNo ); ubOppositeDirection = gOppositeDirection[ ubAttackDirection ]; - if ( ! ( ubOppositeDirection == pTarget->bDirection || ubAttackDirection == gOneCCDirection[ pTarget->bDirection ] || ubAttackDirection == gOneCDirection[ pTarget->bDirection ] ) ) + if ( ! ( ubOppositeDirection == pTarget->ubDirection || ubAttackDirection == gOneCCDirection[ pTarget->ubDirection ] || ubAttackDirection == gOneCDirection[ pTarget->ubDirection ] ) ) { // lucky bastard was facing away! } @@ -4724,7 +4724,7 @@ INT32 CheckForCollision( FLOAT dX, FLOAT dY, FLOAT dZ, FLOAT dDeltaX, FLOAT dDel if (iCurrAboveLevelZ < 0) { // ground is in the way! - if ( pMapElement->ubTerrainID == DEEP_WATER || pMapElement->ubTerrainID == LOW_WATER || pMapElement->ubTerrainID == MED_WATER ) + if ( TERRAIN_IS_WATER( pMapElement->ubTerrainID) ) { return ( COLLISION_WATER ); } @@ -4764,7 +4764,7 @@ INT32 CheckForCollision( FLOAT dX, FLOAT dY, FLOAT dZ, FLOAT dDeltaX, FLOAT dDel if ( dZ < iLandHeight) { // ground is in the way! - if ( pMapElement->ubTerrainID == DEEP_WATER || pMapElement->ubTerrainID == LOW_WATER || pMapElement->ubTerrainID == MED_WATER ) + if ( TERRAIN_IS_WATER( pMapElement->ubTerrainID) ) { return ( COLLISION_WATER ); } diff --git a/Tactical/Merc Hiring.cpp b/Tactical/Merc Hiring.cpp index dab6dfe2..8b959478 100644 --- a/Tactical/Merc Hiring.cpp +++ b/Tactical/Merc Hiring.cpp @@ -111,7 +111,8 @@ INT8 HireMerc( MERC_HIRE_STRUCT *pHireMerc) } // BUILD STRUCTURES - memset( &MercCreateStruct, 0, sizeof( MercCreateStruct ) ); + // MercCreateStruct has been C++'d + //memset( &MercCreateStruct, 0, sizeof( MercCreateStruct ) ); MercCreateStruct.ubProfile = ubCurrentSoldier; MercCreateStruct.fPlayerMerc = TRUE; MercCreateStruct.sSectorX = pHireMerc->sSectorX; diff --git a/Tactical/Militia Control.cpp b/Tactical/Militia Control.cpp index ab1b6e5b..19183f42 100644 --- a/Tactical/Militia Control.cpp +++ b/Tactical/Militia Control.cpp @@ -124,7 +124,7 @@ void ResetMilitia() UINT8 ubNumGreen = 0; UINT8 ubNumReg = 0; UINT8 ubNumVet = 0; - UINT32 cnt; + //UINT32 cnt; // if ( gWorldSectorX !=0 && gWorldSectorY != 0 && NumEnemiesInSector( gWorldSectorX, gWorldSectorY ) ) // fBattleInProgress = TRUE; @@ -1096,7 +1096,7 @@ BOOLEAN CheckIfRadioIsEquipped( void ) //sFacingDir = GetDirectionFromXY( sXPos, sYPos, pTMilitiaSoldier ); //SendSoldierSetDesiredDirectionEvent( pTMilitiaSoldier, sFacingDir ); //SendSoldierSetDesiredDirectionEvent( pTMilitiaSoldier, gOppositeDirection[ sFacingDir ] ); -//EVENT_StopMerc( pTMilitiaSoldier, pTMilitiaSoldier->sGridNo, pTMilitiaSoldier->bDirection ); +//EVENT_StopMerc( pTMilitiaSoldier, pTMilitiaSoldier->sGridNo, pTMilitiaSoldier->ubDirection ); //SendChangeSoldierStanceEvent( pTMilitiaSoldier, ANIM_PRONE ); //SendChangeSoldierStanceEvent( pTMilitiaSoldier, ANIM_CROUCH ); diff --git a/Tactical/Overhead.cpp b/Tactical/Overhead.cpp index 3046216c..051ba50a 100644 --- a/Tactical/Overhead.cpp +++ b/Tactical/Overhead.cpp @@ -2023,13 +2023,13 @@ BOOLEAN HandleGotoNewGridNo( SOLDIERTYPE *pSoldier, BOOLEAN *pfKeepMoving, BOOLE { if ( pSoldier2->bActive ) { - EVENT_StopMerc( pSoldier2, pSoldier2->sGridNo, pSoldier2->bDirection ); + EVENT_StopMerc( pSoldier2, pSoldier2->sGridNo, pSoldier2->ubDirection ); } } } else { - EVENT_StopMerc( pSoldier, pSoldier->sGridNo, pSoldier->bDirection ); + EVENT_StopMerc( pSoldier, pSoldier->sGridNo, pSoldier->ubDirection ); } (*pfKeepMoving) = FALSE; @@ -2049,7 +2049,7 @@ BOOLEAN HandleGotoNewGridNo( SOLDIERTYPE *pSoldier, BOOLEAN *pfKeepMoving, BOOLE if (sMineGridNo != NOWHERE) { - EVENT_StopMerc( pSoldier, pSoldier->sGridNo, pSoldier->bDirection ); + EVENT_StopMerc( pSoldier, pSoldier->sGridNo, pSoldier->ubDirection ); (*pfKeepMoving) = FALSE; if (pSoldier->bSide != 0) @@ -2179,7 +2179,7 @@ BOOLEAN HandleGotoNewGridNo( SOLDIERTYPE *pSoldier, BOOLEAN *pfKeepMoving, BOOLE { if ( pExplosive ) { - EVENT_StopMerc( pSoldier, pSoldier->sGridNo, pSoldier->bDirection ); + EVENT_StopMerc( pSoldier, pSoldier->sGridNo, pSoldier->ubDirection ); fDontContinue = TRUE; DishOutGasDamage( pSoldier, pExplosive, TRUE, FALSE, @@ -2215,7 +2215,7 @@ BOOLEAN HandleGotoNewGridNo( SOLDIERTYPE *pSoldier, BOOLEAN *pfKeepMoving, BOOLE } if ( (pSoldier->bBlindedCounter > 0) && (pSoldier->usAnimState == RUNNING) && (Random( 5 ) == 0) && - OKFallDirection( pSoldier, (INT16) (pSoldier->sGridNo + DirectionInc( pSoldier->bDirection ) ), pSoldier->bLevel, pSoldier->bDirection, pSoldier->usAnimState ) ) + OKFallDirection( pSoldier, (INT16) (pSoldier->sGridNo + DirectionInc( pSoldier->ubDirection ) ), pSoldier->bLevel, pSoldier->ubDirection, pSoldier->usAnimState ) ) { // 20% chance of falling over! DoMercBattleSound( pSoldier, BATTLE_SOUND_CURSE1 ); @@ -2228,7 +2228,7 @@ BOOLEAN HandleGotoNewGridNo( SOLDIERTYPE *pSoldier, BOOLEAN *pfKeepMoving, BOOLE return( FALSE ); } else if ( ( GetDrunkLevel( pSoldier ) == DRUNK ) && (Random( 5 ) == 0) && - OKFallDirection( pSoldier, (INT16) (pSoldier->sGridNo + DirectionInc( pSoldier->bDirection ) ), pSoldier->bLevel, pSoldier->bDirection, pSoldier->usAnimState ) ) + OKFallDirection( pSoldier, (INT16) (pSoldier->sGridNo + DirectionInc( pSoldier->ubDirection ) ), pSoldier->bLevel, pSoldier->ubDirection, pSoldier->usAnimState ) ) { // 20% chance of falling over! DoMercBattleSound( pSoldier, BATTLE_SOUND_CURSE1 ); @@ -2255,7 +2255,7 @@ BOOLEAN HandleGotoNewGridNo( SOLDIERTYPE *pSoldier, BOOLEAN *pfKeepMoving, BOOLE pSoldier->ubNumTilesMovesSinceLastForget = 0; TacticalCharacterDialogue( pSoldier, QUOTE_PERSONALITY_TRAIT ); - EVENT_StopMerc( pSoldier, pSoldier->sGridNo, pSoldier->bDirection ); + EVENT_StopMerc( pSoldier, pSoldier->sGridNo, pSoldier->ubDirection ); if (pSoldier->bActionPoints > 0) { pSoldier->bActionPoints -= (INT8) (Random( pSoldier->bActionPoints ) + 1); @@ -2373,7 +2373,7 @@ void HandleMaryArrival( SOLDIERTYPE * pSoldier ) // Mary has arrived SetFactTrue( FACT_MARY_OR_JOHN_ARRIVED ); - EVENT_StopMerc( pSoldier, pSoldier->sGridNo, pSoldier->bDirection ); + EVENT_StopMerc( pSoldier, pSoldier->sGridNo, pSoldier->ubDirection ); TriggerNPCRecord( MARY, 13 ); } @@ -2417,12 +2417,12 @@ void HandleJohnArrival( SOLDIERTYPE * pSoldier ) SetFactTrue( FACT_MARY_OR_JOHN_ARRIVED ); - EVENT_StopMerc( pSoldier, pSoldier->sGridNo, pSoldier->bDirection ); + EVENT_StopMerc( pSoldier, pSoldier->sGridNo, pSoldier->ubDirection ); // if Mary is alive/dead if ( pSoldier2 ) { - EVENT_StopMerc( pSoldier2, pSoldier2->sGridNo, pSoldier2->bDirection ); + EVENT_StopMerc( pSoldier2, pSoldier2->sGridNo, pSoldier2->ubDirection ); TriggerNPCRecord( JOHN, 13 ); } else @@ -2519,7 +2519,7 @@ BOOLEAN HandleAtNewGridNo( SOLDIERTYPE *pSoldier, BOOLEAN *pfKeepMoving ) if (SetOffBombsInGridNo( pSoldier->ubID, pSoldier->sGridNo, FALSE, pSoldier->bLevel ) ) { (*pfKeepMoving) = FALSE; - EVENT_StopMerc( pSoldier, pSoldier->sGridNo, pSoldier->bDirection ); + EVENT_StopMerc( pSoldier, pSoldier->sGridNo, pSoldier->ubDirection ); return( FALSE ); } @@ -2615,13 +2615,13 @@ BOOLEAN HandleAtNewGridNo( SOLDIERTYPE *pSoldier, BOOLEAN *pfKeepMoving ) { if ( pSoldier2->bActive ) { - EVENT_StopMerc( pSoldier2, pSoldier2->sGridNo, pSoldier2->bDirection ); + EVENT_StopMerc( pSoldier2, pSoldier2->sGridNo, pSoldier2->ubDirection ); } } } else { - EVENT_StopMerc( pSoldier, pSoldier->sGridNo, pSoldier->bDirection ); + EVENT_StopMerc( pSoldier, pSoldier->sGridNo, pSoldier->ubDirection ); } (*pfKeepMoving) = FALSE; @@ -2641,7 +2641,7 @@ BOOLEAN HandleAtNewGridNo( SOLDIERTYPE *pSoldier, BOOLEAN *pfKeepMoving ) if (sMineGridNo != NOWHERE) { - EVENT_StopMerc( pSoldier, pSoldier->sGridNo, pSoldier->bDirection ); + EVENT_StopMerc( pSoldier, pSoldier->sGridNo, pSoldier->ubDirection ); (*pfKeepMoving) = FALSE; gpWorldLevelData[ sMineGridNo ].uiFlags |= MAPELEMENT_ENEMY_MINE_PRESENT; @@ -2668,7 +2668,7 @@ BOOLEAN HandleAtNewGridNo( SOLDIERTYPE *pSoldier, BOOLEAN *pfKeepMoving ) if (PythSpacesAway( pSoldier->sGridNo, 8842 ) < 11) { // Skyrider has arrived! - EVENT_StopMerc( pSoldier, pSoldier->sGridNo, pSoldier->bDirection ); + EVENT_StopMerc( pSoldier, pSoldier->sGridNo, pSoldier->ubDirection ); SetFactTrue( FACT_SKYRIDER_CLOSE_TO_CHOPPER ); TriggerNPCRecord( SKYRIDER, 15 ); SetUpHelicopterForPlayer( 13, MAP_ROW_B ); @@ -2698,7 +2698,7 @@ BOOLEAN HandleAtNewGridNo( SOLDIERTYPE *pSoldier, BOOLEAN *pfKeepMoving ) // if Joey walks near Martha then trigger Martha record 7 if ( CheckFact( FACT_JOEY_NEAR_MARTHA, 0 ) ) { - EVENT_StopMerc( pSoldier, pSoldier->sGridNo, pSoldier->bDirection ); + EVENT_StopMerc( pSoldier, pSoldier->sGridNo, pSoldier->ubDirection ); TriggerNPCRecord( JOEY, 9 ); } } @@ -4603,7 +4603,7 @@ INT16 FindAdjacentGridEx( SOLDIERTYPE *pSoldier, INT16 sGridNo, UINT8 *pubDirect // Set default direction if (pubDirection) { - *pubDirection = pSoldier->bDirection; + *pubDirection = pSoldier->ubDirection; } // CHECK IF WE WANT TO FORCE GRIDNO TO PERSON @@ -4896,7 +4896,7 @@ INT16 FindNextToAdjacentGridEx( SOLDIERTYPE *pSoldier, INT16 sGridNo, UINT8 *pub // CHECK IF IT'S THE SAME ONE AS WE'RE ON, IF SO, RETURN THAT! if ( pSoldier->sGridNo == sGridNo ) { - *pubDirection = pSoldier->bDirection; + *pubDirection = pSoldier->ubDirection; return( sGridNo ); } @@ -5023,7 +5023,7 @@ INT16 FindNextToAdjacentGridEx( SOLDIERTYPE *pSoldier, INT16 sGridNo, UINT8 *pub { (*pubDirection) = (UINT8)GetDirectionFromGridNo( sGridNo, pSoldier ); } - //*pubDirection = pSoldier->bDirection; + //*pubDirection = pSoldier->ubDirection; return( sSpot ); } @@ -5417,7 +5417,7 @@ void CommonEnterCombatModeCode( ) pSoldier->usQuoteSaidFlags &= (~SOLDIER_QUOTE_SAID_MULTIPLE_CREATURES); // Hault! - EVENT_StopMerc( pSoldier, pSoldier->sGridNo, pSoldier->bDirection ); + EVENT_StopMerc( pSoldier, pSoldier->sGridNo, pSoldier->ubDirection ); // END AI actions CancelAIAction( pSoldier, TRUE ); @@ -7053,7 +7053,7 @@ void HandleSuppressionFire( UINT8 ubTargetedMerc, UINT8 ubCausedAttacker ) } break; default: // standing! - if (pSoldier->bOverTerrainType == LOW_WATER || pSoldier->bOverTerrainType == DEEP_WATER) + if ( MercInWater( pSoldier )) { // can't change stance here! break; @@ -7900,7 +7900,7 @@ void CencelAllActionsForTimeCompression( void ) if ( pSoldier->bInSector ) { // Hault! - EVENT_StopMerc( pSoldier, pSoldier->sGridNo, pSoldier->bDirection ); + EVENT_StopMerc( pSoldier, pSoldier->sGridNo, pSoldier->ubDirection ); // END AI actions CancelAIAction( pSoldier, TRUE ); diff --git a/Tactical/PATHAI.cpp b/Tactical/PATHAI.cpp index 303eec23..b258a076 100644 --- a/Tactical/PATHAI.cpp +++ b/Tactical/PATHAI.cpp @@ -2384,11 +2384,11 @@ INT32 FindBestPath(SOLDIERTYPE *s , INT16 sDestination, INT8 ubLevel, INT16 usMo { if (fReverse) { - iLastDir = gOppositeDirection[s->bDirection]; + iLastDir = gOppositeDirection[s->ubDirection]; } else { - iLastDir = s->bDirection; + iLastDir = s->ubDirection; } // start prev-to-last dir at same as current (could cause a problem) iPrevToLastDir = iLastDir; @@ -2442,7 +2442,7 @@ INT32 FindBestPath(SOLDIERTYPE *s , INT16 sDestination, INT8 ubLevel, INT16 usMo { if (trailTreeNdx < 2) { - iLastDir = s->bDirection; + iLastDir = s->ubDirection; } else if ( trailTree[pCurrPtr->sPathNdx].fFlags & STEP_BACKWARDS ) { @@ -3866,7 +3866,7 @@ INT16 PlotPath( SOLDIERTYPE *pSold, INT16 sDestGridno, INT8 bCopyRoute, INT8 bPl usMovementModeToUseForAPs = usMovementMode; // ATE - MAKE MOVEMENT ALWAYS WALK IF IN WATER - if ( gpWorldLevelData[ sTempGrid ].ubTerrainID == DEEP_WATER || gpWorldLevelData[ sTempGrid ].ubTerrainID == MED_WATER || gpWorldLevelData[ sTempGrid ].ubTerrainID == LOW_WATER ) + if ( TERRAIN_IS_WATER( gpWorldLevelData[ sTempGrid ].ubTerrainID) ) { usMovementModeToUseForAPs = WALKING; } diff --git a/Tactical/Points.cpp b/Tactical/Points.cpp index 2ed13acc..6132c260 100644 --- a/Tactical/Points.cpp +++ b/Tactical/Points.cpp @@ -216,7 +216,7 @@ INT16 TerrainBreathPoints(SOLDIERTYPE * pSoldier, INT16 sGridno,INT8 bDir, UINT1 iPoints = iPoints * BreathPointAdjustmentForCarriedWeight( pSoldier ) / 100; // ATE - MAKE MOVEMENT ALWAYS WALK IF IN WATER - if ( gpWorldLevelData[ sGridno ].ubTerrainID == DEEP_WATER || gpWorldLevelData[ sGridno ].ubTerrainID == MED_WATER || gpWorldLevelData[ sGridno ].ubTerrainID == LOW_WATER ) + if ( TERRAIN_IS_WATER( gpWorldLevelData[ sGridno ].ubTerrainID) ) { usMovementMode = WALKING; } @@ -276,7 +276,7 @@ INT16 ActionPointCost( SOLDIERTYPE *pSoldier, INT16 sGridNo, INT8 bDir, UINT16 u } // ATE - MAKE MOVEMENT ALWAYS WALK IF IN WATER - if ( gpWorldLevelData[ sGridNo ].ubTerrainID == DEEP_WATER || gpWorldLevelData[ sGridNo ].ubTerrainID == MED_WATER || gpWorldLevelData[ sGridNo ].ubTerrainID == LOW_WATER ) + if ( TERRAIN_IS_WATER( gpWorldLevelData[ sGridNo ].ubTerrainID) ) { usMovementMode = WALKING; } @@ -1257,7 +1257,7 @@ void GetAPChargeForShootOrStabWRTGunRaises( SOLDIERTYPE *pSoldier, INT16 sGridNo ubDirection = (UINT8)GetDirectionFromGridNo( sGridNo, pSoldier ); // Is it the same as he's facing? - if ( ubDirection != pSoldier->bDirection ) + if ( ubDirection != pSoldier->ubDirection ) { fAddingTurningCost = TRUE; } @@ -1465,7 +1465,7 @@ UINT8 MinAPsToPunch(SOLDIERTYPE *pSoldier, INT16 sGridNo, UINT8 ubAddTurningCost ubDirection = (UINT8)GetDirectionFromGridNo( sGridNo, pSoldier ); // Is it the same as he's facing? - if ( ubDirection != pSoldier->bDirection ) + if ( ubDirection != pSoldier->ubDirection ) { bAPCost += AP_LOOK_STANDING; } @@ -1520,7 +1520,7 @@ INT8 PtsToMoveDirection(SOLDIERTYPE *pSoldier, INT8 bDirection ) // ATE: Check if the new place is watter and we were tying to run.... bOverTerrainType = GetTerrainType( sGridno ); - if ( bOverTerrainType == MED_WATER || bOverTerrainType == DEEP_WATER || bOverTerrainType == LOW_WATER ) + if ( TERRAIN_IS_WATER( bOverTerrainType) ) { usMoveModeToUse = WALKING; } @@ -2222,7 +2222,7 @@ INT16 MinAPsToThrow( SOLDIERTYPE *pSoldier, INT16 sGridNo, UINT8 ubAddTurningCos ubDirection = (UINT8)GetDirectionFromGridNo( sGridNo, pSoldier ); // Is it the same as he's facing? - if ( ubDirection != pSoldier->bDirection ) + if ( ubDirection != pSoldier->ubDirection ) { //Lalien: disabled it again //AXP 25.03.2007: Reenabled look cost diff --git a/Tactical/Rotting Corpses.cpp b/Tactical/Rotting Corpses.cpp index 0ed76e5c..580bb76e 100644 --- a/Tactical/Rotting Corpses.cpp +++ b/Tactical/Rotting Corpses.cpp @@ -412,7 +412,7 @@ UINT16 GetCorpseStructIndex( ROTTING_CORPSE_DEFINITION *pCorpseDef, BOOLEAN fFor case HUMMER_DEAD: // OK , these have 2 directions.... - bDirection = gb2DirectionsFrom8[ pCorpseDef->bDirection ]; + bDirection = gb2DirectionsFrom8[ pCorpseDef->ubDirection ]; if ( fForImage ) { bDirection = gOneCDirection[ bDirection ]; @@ -427,7 +427,7 @@ UINT16 GetCorpseStructIndex( ROTTING_CORPSE_DEFINITION *pCorpseDef, BOOLEAN fFor case FMERC_FALLF: // OK , these have 4 directions.... - bDirection = gb4DirectionsFrom8[ pCorpseDef->bDirection ]; + bDirection = gb4DirectionsFrom8[ pCorpseDef->ubDirection ]; // if ( fForImage ) // { @@ -438,7 +438,7 @@ UINT16 GetCorpseStructIndex( ROTTING_CORPSE_DEFINITION *pCorpseDef, BOOLEAN fFor default: // Uses 8 - bDirection = pCorpseDef->bDirection; + bDirection = pCorpseDef->ubDirection; if ( fForImage ) { @@ -541,7 +541,7 @@ INT32 AddRottingCorpse( ROTTING_CORPSE_DEFINITION *pCorpseDef ) AniParams.sX = CenterX( pCorpse->def.sGridNo ); AniParams.sY = CenterY( pCorpse->def.sGridNo ); AniParams.sZ = (INT16)pCorpse->def.sHeightAdjustment; - AniParams.uiUserData3 = pCorpse->def.bDirection; + AniParams.uiUserData3 = pCorpse->def.ubDirection; if ( !gGameSettings.fOptions[ TOPTION_BLOOD_N_GORE ] ) @@ -847,7 +847,7 @@ BOOLEAN TurnSoldierIntoCorpse( SOLDIERTYPE *pSoldier, BOOLEAN fRemoveMerc, BOOLE // Determine corpse type! ubType = (UINT8)gubAnimSurfaceCorpseID[ pSoldier->ubBodyType][ pSoldier->usAnimState ]; - Corpse.bDirection = pSoldier->bDirection; + Corpse.ubDirection = pSoldier->ubDirection; // If we are a vehicle.... only use 1 direction.... if ( pSoldier->uiStatusFlags & SOLDIER_VEHICLE ) @@ -856,17 +856,17 @@ BOOLEAN TurnSoldierIntoCorpse( SOLDIERTYPE *pSoldier, BOOLEAN fRemoveMerc, BOOLE if ( pSoldier->ubBodyType != ICECREAMTRUCK && pSoldier->ubBodyType != HUMVEE ) { - Corpse.bDirection = 7; + Corpse.ubDirection = 7; } else { - Corpse.bDirection = gb2DirectionsFrom8[ Corpse.bDirection ]; + Corpse.ubDirection = gb2DirectionsFrom8[ Corpse.ubDirection ]; } } if ( ubType == QUEEN_MONSTER_DEAD || ubType == BURNT_DEAD || ubType == EXPLODE_DEAD ) { - Corpse.bDirection = 7; + Corpse.ubDirection = 7; } @@ -1077,7 +1077,7 @@ void AddCrowToCorpse( ROTTING_CORPSE *pCorpse ) MercCreateStruct.sSectorY = gWorldSectorY; MercCreateStruct.bSectorZ = gbWorldSectorZ; MercCreateStruct.bBodyType = bBodyType; - MercCreateStruct.bDirection = SOUTH; + MercCreateStruct.ubDirection = SOUTH; MercCreateStruct.bTeam = CIV_TEAM; MercCreateStruct.sInsertionGridNo = pCorpse->def.sGridNo; RandomizeNewSoldierStats( &MercCreateStruct ); @@ -1693,7 +1693,7 @@ INT16 FindNearestAvailableGridNoForCorpse( ROTTING_CORPSE_DEFINITION *pDef, INT8 { if ( fSetDirection ) { - pDef->bDirection = ubBestDirection; + pDef->ubDirection = ubBestDirection; } return sLowestGridNo; diff --git a/Tactical/Rotting Corpses.h b/Tactical/Rotting Corpses.h index f5c1b5e9..7747325f 100644 --- a/Tactical/Rotting Corpses.h +++ b/Tactical/Rotting Corpses.h @@ -99,7 +99,7 @@ typedef struct PaletteRepID VestPal; PaletteRepID SkinPal; - INT8 bDirection; + UINT8 ubDirection; UINT32 uiTimeOfDeath; UINT16 usFlags; diff --git a/Tactical/Soldier Add.cpp b/Tactical/Soldier Add.cpp index e55a0aa6..c37db569 100644 --- a/Tactical/Soldier Add.cpp +++ b/Tactical/Soldier Add.cpp @@ -296,7 +296,7 @@ UINT16 FindGridNoFromSweetSpotWithStructData( SOLDIERTYPE *pSoldier, UINT16 usAn // If we are already at this gridno.... if ( pSoldier->sGridNo == sSweetGridNo && !( pSoldier->uiStatusFlags & SOLDIER_VEHICLE ) ) { - *pubDirection = pSoldier->bDirection; + *pubDirection = pSoldier->ubDirection; return( sSweetGridNo ); } @@ -461,7 +461,7 @@ UINT16 FindGridNoFromSweetSpotWithStructDataUsingGivenDirectionFirst( SOLDIERTYP // If we are already at this gridno.... if ( pSoldier->sGridNo == sSweetGridNo && !( pSoldier->uiStatusFlags & SOLDIER_VEHICLE ) ) { - *pubDirection = pSoldier->bDirection; + *pubDirection = pSoldier->ubDirection; return( sSweetGridNo ); } @@ -1219,7 +1219,7 @@ BOOLEAN InternalAddSoldierToSector( UINT8 ubID, BOOLEAN fCalculateDirection, BOO //Add if(gTacticalStatus.uiFlags & LOADING_SAVED_GAME ) - AddSoldierToSectorGridNo( pSoldier, sGridNo, pSoldier->bDirection, fUseAnimation, usAnimState, usAnimCode ); + AddSoldierToSectorGridNo( pSoldier, sGridNo, pSoldier->ubDirection, fUseAnimation, usAnimState, usAnimCode ); else AddSoldierToSectorGridNo( pSoldier, sGridNo, ubDirection, fUseAnimation, usAnimState, usAnimCode ); @@ -1279,7 +1279,7 @@ void InternalSoldierInSectorSleep( SOLDIERTYPE *pSoldier, INT16 sGridNo, BOOLEAN EVENT_SetSoldierDirection( pSoldier, ubNewDirection ); EVENT_SetSoldierDesiredDirection( pSoldier, ubNewDirection ); - //pSoldier->bDesiredDirection = pSoldier->bDirection; + //pSoldier->bDesiredDirection = pSoldier->ubDirection; if ( AM_AN_EPC( pSoldier ) ) { @@ -1320,7 +1320,7 @@ void SoldierInSectorIncompaciated( SOLDIERTYPE *pSoldier, INT16 sGridNo ) EVENT_SetSoldierDirection( pSoldier, ubNewDirection ); EVENT_SetSoldierDesiredDirection( pSoldier, ubNewDirection ); - //pSoldier->bDesiredDirection = pSoldier->bDirection; + //pSoldier->bDesiredDirection = pSoldier->ubDirection; EVENT_InitNewSoldierAnim( pSoldier, STAND_FALLFORWARD_STOP, 1, TRUE ); } @@ -1356,7 +1356,7 @@ void SoldierInSectorPatient( SOLDIERTYPE *pSoldier, INT16 sGridNo ) EVENT_SetSoldierDirection( pSoldier, ubNewDirection ); EVENT_SetSoldierDesiredDirection( pSoldier, ubNewDirection ); - //pSoldier->bDesiredDirection = pSoldier->bDirection; + //pSoldier->bDesiredDirection = pSoldier->ubDirection; if ( !IS_MERC_BODY_TYPE( pSoldier ) ) { @@ -1391,7 +1391,7 @@ void SoldierInSectorDoctor( SOLDIERTYPE *pSoldier, INT16 sGridNo ) EVENT_SetSoldierDirection( pSoldier, ubNewDirection ); EVENT_SetSoldierDesiredDirection( pSoldier, ubNewDirection ); - //pSoldier->bDesiredDirection = pSoldier->bDirection; + //pSoldier->bDesiredDirection = pSoldier->ubDirection; if ( !IS_MERC_BODY_TYPE( pSoldier ) ) { @@ -1426,7 +1426,7 @@ void SoldierInSectorRepair( SOLDIERTYPE *pSoldier, INT16 sGridNo ) EVENT_SetSoldierDirection( pSoldier, ubNewDirection ); EVENT_SetSoldierDesiredDirection( pSoldier, ubNewDirection ); - //pSoldier->bDesiredDirection = pSoldier->bDirection; + //pSoldier->bDesiredDirection = pSoldier->ubDirection; if ( !IS_MERC_BODY_TYPE( pSoldier ) ) { diff --git a/Tactical/Soldier Ani.cpp b/Tactical/Soldier Ani.cpp index a044b2ad..2e086fd2 100644 --- a/Tactical/Soldier Ani.cpp +++ b/Tactical/Soldier Ani.cpp @@ -238,7 +238,7 @@ BOOLEAN AdjustToNextAnimationFrame( SOLDIERTYPE *pSoldier ) case 406: // Move merc up - if ( pSoldier->bDirection == NORTH ) + if ( pSoldier->ubDirection == NORTH ) { SetSoldierHeight( pSoldier, (FLOAT)(pSoldier->sHeightAdjustment + 2 ) ); } @@ -257,14 +257,14 @@ BOOLEAN AdjustToNextAnimationFrame( SOLDIERTYPE *pSoldier ) { INT16 sXPos, sYPos; - //usNewGridNo = NewGridNo( (UINT16)pSoldier->sGridNo, (UINT16)DirectionInc( pSoldier->bDirection ) ); + //usNewGridNo = NewGridNo( (UINT16)pSoldier->sGridNo, (UINT16)DirectionInc( pSoldier->ubDirection ) ); ConvertMapPosToWorldTileCenter( pSoldier->sTempNewGridNo, &sXPos, &sYPos ); EVENT_SetSoldierPosition( pSoldier, (FLOAT)sXPos, (FLOAT)sYPos ); } // Move two CC directions - EVENT_SetSoldierDirection( pSoldier, gTwoCCDirection[ pSoldier->bDirection ] ); + EVENT_SetSoldierDirection( pSoldier, gTwoCCDirection[ pSoldier->ubDirection ] ); - EVENT_SetSoldierDesiredDirection( pSoldier, pSoldier->bDirection ); + EVENT_SetSoldierDesiredDirection( pSoldier, pSoldier->ubDirection ); // Set desired anim height! pSoldier->ubDesiredHeight = ANIM_CROUCH; @@ -324,9 +324,9 @@ BOOLEAN AdjustToNextAnimationFrame( SOLDIERTYPE *pSoldier ) // CODE: SPECIALMOVE CLIMB DOWN EVENT // Move two C directions - EVENT_SetSoldierDirection( pSoldier, gTwoCDirection[ pSoldier->bDirection ] ); + EVENT_SetSoldierDirection( pSoldier, gTwoCDirection[ pSoldier->ubDirection ] ); - EVENT_SetSoldierDesiredDirection( pSoldier, pSoldier->bDirection ); + EVENT_SetSoldierDesiredDirection( pSoldier, pSoldier->ubDirection ); // Adjust height SetSoldierHeight( pSoldier, (FLOAT)gClimbDownRoofStartDist[ pSoldier->ubBodyType ] ); // Adjust position @@ -479,14 +479,14 @@ BOOLEAN AdjustToNextAnimationFrame( SOLDIERTYPE *pSoldier ) case 437: // CHANGE DIRECTION AND GET-UP - //sGridNo = NewGridNo( (UINT16)pSoldier->sGridNo, (UINT16)(-1 * DirectionInc( pSoldier->bDirection ) ) ); + //sGridNo = NewGridNo( (UINT16)pSoldier->sGridNo, (UINT16)(-1 * DirectionInc( pSoldier->ubDirection ) ) ); //ConvertMapPosToWorldTileCenter( pSoldier->sGridNo, &sXPos, &sYPos ); //SetSoldierPosition( pSoldier, (FLOAT)sXPos, (FLOAT)sYPos ); // Reverse direction - EVENT_SetSoldierDirection( pSoldier, gOppositeDirection[ pSoldier->bDirection ] ); - EVENT_SetSoldierDesiredDirection( pSoldier, pSoldier->bDirection ); + EVENT_SetSoldierDirection( pSoldier, gOppositeDirection[ pSoldier->ubDirection ] ); + EVENT_SetSoldierDesiredDirection( pSoldier, pSoldier->ubDirection ); ChangeSoldierState( pSoldier, GETUP_FROM_ROLLOVER, 0 , FALSE ); return( TRUE ); @@ -558,7 +558,7 @@ BOOLEAN AdjustToNextAnimationFrame( SOLDIERTYPE *pSoldier ) UINT16 usNewGridNo; INT16 sXPos, sYPos; - usNewGridNo = NewGridNo( (UINT16)pSoldier->sGridNo, DirectionInc( pSoldier->bDirection ) ); + usNewGridNo = NewGridNo( (UINT16)pSoldier->sGridNo, DirectionInc( pSoldier->ubDirection ) ); ConvertGridNoToCenterCellXY( usNewGridNo, &sXPos, &sYPos ); LightSpritePosition( pSoldier->iMuzFlash, (INT16)(sXPos/CELL_X_SIZE), (INT16)(sYPos/CELL_Y_SIZE)); @@ -583,7 +583,7 @@ BOOLEAN AdjustToNextAnimationFrame( SOLDIERTYPE *pSoldier ) case 443: // MOVE GUY FORWARD FOR FENCE HOP ANIMATION - switch( pSoldier->bDirection ) + switch( pSoldier->ubDirection ) { case SOUTH: case EAST: @@ -606,9 +606,9 @@ BOOLEAN AdjustToNextAnimationFrame( SOLDIERTYPE *pSoldier ) sY = CenterY( pSoldier->sForcastGridno ); EVENT_InternalSetSoldierPosition( pSoldier, (FLOAT) sX, (FLOAT) sY, FALSE, FALSE, FALSE ); - EVENT_SetSoldierDirection( pSoldier, gTwoCDirection[ pSoldier->bDirection ] ); + EVENT_SetSoldierDirection( pSoldier, gTwoCDirection[ pSoldier->ubDirection ] ); pSoldier->sZLevelOverride = -1; - EVENT_SetSoldierDesiredDirection( pSoldier, pSoldier->bDirection ); + EVENT_SetSoldierDesiredDirection( pSoldier, pSoldier->ubDirection ); if ( gTacticalStatus.bBoxingState == BOXING_WAITING_FOR_PLAYER || gTacticalStatus.bBoxingState == PRE_BOXING || gTacticalStatus.bBoxingState == BOXING ) @@ -618,7 +618,7 @@ BOOLEAN AdjustToNextAnimationFrame( SOLDIERTYPE *pSoldier ) if ( SetOffBombsInGridNo( pSoldier->ubID, pSoldier->sGridNo, FALSE, pSoldier->bLevel )) { - EVENT_StopMerc( pSoldier, pSoldier->sGridNo, pSoldier->bDirection ); + EVENT_StopMerc( pSoldier, pSoldier->sGridNo, pSoldier->ubDirection ); return( TRUE ); } @@ -652,7 +652,7 @@ BOOLEAN AdjustToNextAnimationFrame( SOLDIERTYPE *pSoldier ) case 445: // CODE: MOVE GUY FORWARD ONE TILE, BASED ON WHERE WE ARE FACING - switch( pSoldier->bDirection ) + switch( pSoldier->ubDirection ) { case SOUTH: case EAST: @@ -684,14 +684,14 @@ BOOLEAN AdjustToNextAnimationFrame( SOLDIERTYPE *pSoldier ) // TRY FORWARDS... // FIRST GRIDNO - sNewGridNo = NewGridNo( (UINT16)pSoldier->sGridNo, (UINT16)( DirectionInc( pSoldier->bDirection ) ) ); + sNewGridNo = NewGridNo( (UINT16)pSoldier->sGridNo, (UINT16)( DirectionInc( pSoldier->ubDirection ) ) ); - if ( OKFallDirection( pSoldier, sNewGridNo, pSoldier->bLevel, pSoldier->bDirection, FALLFORWARD_HITDEATH_STOP ) ) + if ( OKFallDirection( pSoldier, sNewGridNo, pSoldier->bLevel, pSoldier->ubDirection, FALLFORWARD_HITDEATH_STOP ) ) { // SECOND GRIDNO - // sNewGridNo = NewGridNo( (UINT16)sNewGridNo, (UINT16)( DirectionInc( pSoldier->bDirection ) ) ); + // sNewGridNo = NewGridNo( (UINT16)sNewGridNo, (UINT16)( DirectionInc( pSoldier->ubDirection ) ) ); - // if ( OKFallDirection( pSoldier, sNewGridNo, pSoldier->bLevel, pSoldier->bDirection, FALLFORWARD_HITDEATH_STOP ) ) + // if ( OKFallDirection( pSoldier, sNewGridNo, pSoldier->bLevel, pSoldier->ubDirection, FALLFORWARD_HITDEATH_STOP ) ) { // ALL'S OK HERE... pSoldier->fTryingToFall = FALSE; @@ -704,17 +704,17 @@ BOOLEAN AdjustToNextAnimationFrame( SOLDIERTYPE *pSoldier ) // ATE: Added Feb1 - can be either direction.... if ( pSoldier->fFallClockwise ) { - EVENT_SetSoldierDirection( pSoldier, gOneCDirection[ pSoldier->bDirection ] ); + EVENT_SetSoldierDirection( pSoldier, gOneCDirection[ pSoldier->ubDirection ] ); } else { - EVENT_SetSoldierDirection( pSoldier, gOneCCDirection[ pSoldier->bDirection ] ); + EVENT_SetSoldierDirection( pSoldier, gOneCCDirection[ pSoldier->ubDirection ] ); } - EVENT_SetSoldierDesiredDirection( pSoldier, pSoldier->bDirection ); + EVENT_SetSoldierDesiredDirection( pSoldier, pSoldier->ubDirection ); sLastAniFrame = gusAnimInst[ pSoldier->usAnimState ][ ( pSoldier->usAniCode - 2 ) ]; ConvertAniCodeToAniFrame( pSoldier, (INT16)( sLastAniFrame ) ); - if ( pSoldier->bDirection == pSoldier->bStartFallDir ) + if ( pSoldier->ubDirection == pSoldier->bStartFallDir ) { // GO FORWARD HERE... pSoldier ->fTryingToFall = FALSE; @@ -852,7 +852,7 @@ BOOLEAN AdjustToNextAnimationFrame( SOLDIERTYPE *pSoldier ) if ( pSoldier->sSpreadLocations[ pSoldier->fDoSpread - 1 ] != 0 ) { EVENT_SetSoldierDirection( pSoldier, (INT8)GetDirectionToGridNoFromGridNo( pSoldier->sGridNo, pSoldier->sSpreadLocations[ pSoldier->fDoSpread - 1 ] ) ); - EVENT_SetSoldierDesiredDirection( pSoldier, pSoldier->bDirection ); + EVENT_SetSoldierDesiredDirection( pSoldier, pSoldier->ubDirection ); } } break; @@ -869,8 +869,8 @@ BOOLEAN AdjustToNextAnimationFrame( SOLDIERTYPE *pSoldier ) //CODE: BEGINHOPFENCE // MOVE TWO FACGIN GRIDNOS - sNewGridNo = NewGridNo( (UINT16)pSoldier->sGridNo, (UINT16)( DirectionInc( pSoldier->bDirection ) ) ); - sNewGridNo = NewGridNo( (UINT16)sNewGridNo, (UINT16)( DirectionInc( pSoldier->bDirection ) ) ); + sNewGridNo = NewGridNo( (UINT16)pSoldier->sGridNo, (UINT16)( DirectionInc( pSoldier->ubDirection ) ) ); + sNewGridNo = NewGridNo( (UINT16)sNewGridNo, (UINT16)( DirectionInc( pSoldier->ubDirection ) ) ); pSoldier->sForcastGridno = sNewGridNo; break; @@ -878,7 +878,7 @@ BOOLEAN AdjustToNextAnimationFrame( SOLDIERTYPE *pSoldier ) case 451: // CODE: MANAGE START z-buffer override - switch( pSoldier->bDirection ) + switch( pSoldier->ubDirection ) { case NORTH: case WEST: @@ -891,7 +891,7 @@ BOOLEAN AdjustToNextAnimationFrame( SOLDIERTYPE *pSoldier ) case 452: // CODE: MANAGE END z-buffer override - switch( pSoldier->bDirection ) + switch( pSoldier->ubDirection ) { case SOUTH: case EAST: @@ -919,7 +919,7 @@ BOOLEAN AdjustToNextAnimationFrame( SOLDIERTYPE *pSoldier ) // CODE: HANDLE CLIMBING ROOF, // Move merc up - if ( pSoldier->bDirection == NORTH ) + if ( pSoldier->ubDirection == NORTH ) { SetSoldierHeight( pSoldier, (FLOAT)(pSoldier->dHeightAdjustment + gClimbUpRoofDist[ pSoldier->ubBodyType ] ) ); } @@ -943,7 +943,7 @@ BOOLEAN AdjustToNextAnimationFrame( SOLDIERTYPE *pSoldier ) // CODE: HANDLE CLIMBING ROOF, // Move merc DOWN - if ( pSoldier->bDirection == NORTH ) + if ( pSoldier->ubDirection == NORTH ) { SetSoldierHeight( pSoldier, (FLOAT)(pSoldier->dHeightAdjustment - gClimbUpRoofDist[ pSoldier->ubBodyType ] ) ); } @@ -1040,7 +1040,7 @@ BOOLEAN AdjustToNextAnimationFrame( SOLDIERTYPE *pSoldier ) INT16 sTempGridNo, sNewX, sNewY; //Get Next GridNo; - sTempGridNo = NewGridNo( (UINT16)pSoldier->sGridNo, (INT16)( DirectionInc(pSoldier->bDirection ) ) ); + sTempGridNo = NewGridNo( (UINT16)pSoldier->sGridNo, (INT16)( DirectionInc(pSoldier->ubDirection ) ) ); // Get center XY ConvertGridNoToCenterCellXY( sTempGridNo, &sNewX, &sNewY ); @@ -1049,8 +1049,8 @@ BOOLEAN AdjustToNextAnimationFrame( SOLDIERTYPE *pSoldier ) EVENT_SetSoldierPosition( pSoldier, sNewX, sNewY ); // Move two CC directions - EVENT_SetSoldierDirection( pSoldier, gTwoCCDirection[ pSoldier->bDirection ] ); - EVENT_SetSoldierDesiredDirection( pSoldier, pSoldier->bDirection ); + EVENT_SetSoldierDirection( pSoldier, gTwoCCDirection[ pSoldier->ubDirection ] ); + EVENT_SetSoldierDesiredDirection( pSoldier, pSoldier->ubDirection ); // Set desired anim height! pSoldier->ubDesiredHeight = ANIM_CROUCH; @@ -1112,7 +1112,7 @@ BOOLEAN AdjustToNextAnimationFrame( SOLDIERTYPE *pSoldier ) ///CODE: FOR HELIDROP, SET DIRECTION EVENT_SetSoldierDirection( pSoldier, EAST ); - EVENT_SetSoldierDesiredDirection( pSoldier, pSoldier->bDirection ); + EVENT_SetSoldierDesiredDirection( pSoldier, pSoldier->ubDirection ); gfIngagedInDrop = FALSE; @@ -1267,7 +1267,7 @@ BOOLEAN AdjustToNextAnimationFrame( SOLDIERTYPE *pSoldier ) { if ( pSoldier->bLife >= OKLIFE ) { - InternalSoldierReadyWeapon( pSoldier, pSoldier->bDirection, FALSE ); + InternalSoldierReadyWeapon( pSoldier, pSoldier->ubDirection, FALSE ); } return( TRUE ); } @@ -1359,7 +1359,7 @@ BOOLEAN AdjustToNextAnimationFrame( SOLDIERTYPE *pSoldier ) if ( pSoldier->bLife >= OKLIFE && pSoldier->bBreath > 0 && pSoldier->bLevel == 0 ) { // Save old direction - pSoldier->uiPendingActionData1 = pSoldier->bDirection; + pSoldier->uiPendingActionData1 = pSoldier->ubDirection; // If we got a head shot...more chance of turning... if ( pSoldier->ubHitLocation != AIM_SHOT_HEAD ) @@ -1369,21 +1369,21 @@ BOOLEAN AdjustToNextAnimationFrame( SOLDIERTYPE *pSoldier ) // 30 % chance to change direction one way if ( uiChance < 30 ) { - bNewDirection = gOneCDirection[ pSoldier->bDirection ]; + bNewDirection = gOneCDirection[ pSoldier->ubDirection ]; } // 30 % chance to change direction the other way else if ( uiChance >= 30 && uiChance < 60 ) { - bNewDirection = gOneCCDirection[ pSoldier->bDirection ]; + bNewDirection = gOneCCDirection[ pSoldier->ubDirection ]; } // 30 % normal.... else { - bNewDirection = pSoldier->bDirection; + bNewDirection = pSoldier->ubDirection; } EVENT_SetSoldierDirection( pSoldier, bNewDirection ); - EVENT_SetSoldierDesiredDirection( pSoldier, pSoldier->bDirection ); + EVENT_SetSoldierDesiredDirection( pSoldier, pSoldier->ubDirection ); } else @@ -1402,13 +1402,13 @@ BOOLEAN AdjustToNextAnimationFrame( SOLDIERTYPE *pSoldier ) // Pick evenly between both if ( Random( 50 ) < 25 ) { - bNewDirection = gOneCDirection[ pSoldier->bDirection ]; + bNewDirection = gOneCDirection[ pSoldier->ubDirection ]; bNewDirection = gOneCDirection[ bNewDirection ]; bNewDirection = gOneCDirection[ bNewDirection ]; } else { - bNewDirection = gOneCCDirection[ pSoldier->bDirection ]; + bNewDirection = gOneCCDirection[ pSoldier->ubDirection ]; bNewDirection = gOneCCDirection[ bNewDirection ]; bNewDirection = gOneCCDirection[ bNewDirection ]; } @@ -1431,7 +1431,7 @@ BOOLEAN AdjustToNextAnimationFrame( SOLDIERTYPE *pSoldier ) //{ /// if ( !( pSoldier->uiStatusFlags & SOLDIER_TURNINGFROMHIT ) ) // { - /// pSoldier->bDirection = (INT8)pSoldier->uiPendingActionData1; + /// pSoldier->ubDirection = (INT8)pSoldier->uiPendingActionData1; // pSoldier->bDesiredDirection = (INT8)pSoldier->uiPendingActionData1; // } //} @@ -1715,7 +1715,7 @@ BOOLEAN AdjustToNextAnimationFrame( SOLDIERTYPE *pSoldier ) if ( gAnimControl[ pTSoldier->usAnimState ].ubHeight == ANIM_STAND ) { // OK, stop merc.... - EVENT_StopMerc( pTSoldier, pTSoldier->sGridNo, pTSoldier->bDirection ); + EVENT_StopMerc( pTSoldier, pTSoldier->sGridNo, pTSoldier->ubDirection ); if ( pTSoldier->bTeam != gbPlayerNum ) { @@ -2620,7 +2620,7 @@ BOOLEAN AdjustToNextAnimationFrame( SOLDIERTYPE *pSoldier ) { // Dish out damage! - EVENT_SoldierGotHit( MercPtrs[ pSoldier->uiPendingActionData4 ], TAKE_DAMAGE_BLADE, (INT16) 25, (INT16) 25, gOppositeDirection[ pSoldier->bDirection ], 50, pSoldier->ubID, 0, ANIM_PRONE, 0, 0 ); + EVENT_SoldierGotHit( MercPtrs[ pSoldier->uiPendingActionData4 ], TAKE_DAMAGE_BLADE, (INT16) 25, (INT16) 25, gOppositeDirection[ pSoldier->ubDirection ], 50, pSoldier->ubID, 0, ANIM_PRONE, 0, 0 ); } break; @@ -2671,7 +2671,7 @@ BOOLEAN AdjustToNextAnimationFrame( SOLDIERTYPE *pSoldier ) InternalDropBlood( pSoldier->sGridNo, pSoldier->bLevel, 0, (UINT8)(MAXBLOODQUANTITY), 1 ); // Move forward one gridno.... - sNewGridNo = NewGridNo( (UINT16)pSoldier->sGridNo, (UINT16)( DirectionInc( gOppositeDirection[ pSoldier->bDirection ] ) ) ); + sNewGridNo = NewGridNo( (UINT16)pSoldier->sGridNo, (UINT16)( DirectionInc( gOppositeDirection[ pSoldier->ubDirection ] ) ) ); InternalDropBlood( sNewGridNo, pSoldier->bLevel, 0, (UINT8)(MAXBLOODQUANTITY), 1 ); @@ -3503,7 +3503,7 @@ void CheckForAndHandleSoldierIncompacitated( SOLDIERTYPE *pSoldier ) // Randomly fall back or forward, if we are in the standing hit animation if ( pSoldier->usAnimState == GENERIC_HIT_STAND || pSoldier->usAnimState == STANDING_BURST_HIT || pSoldier->usAnimState == RIFLE_STAND_HIT ) { - INT8 bTestDirection = pSoldier->bDirection; + INT8 bTestDirection = pSoldier->ubDirection; BOOLEAN fForceDirection = FALSE; BOOLEAN fDoFallback = FALSE; @@ -3561,7 +3561,7 @@ void CheckForAndHandleSoldierIncompacitated( SOLDIERTYPE *pSoldier ) EVENT_SetSoldierDesiredDirection( pSoldier, bTestDirection ); EVENT_SetSoldierDirection( pSoldier, bTestDirection ); } - ChangeToFallbackAnimation( pSoldier, pSoldier->bDirection ); + ChangeToFallbackAnimation( pSoldier, pSoldier->ubDirection ); return; } } @@ -3749,7 +3749,7 @@ BOOLEAN CheckForImproperFireGunEnd( SOLDIERTYPE *pSoldier ) if ( Item[ pSoldier->inv[ SECONDHANDPOS ].usItem ].usItemClass != IC_GUN ) { // OK, put gun down.... - InternalSoldierReadyWeapon( pSoldier, pSoldier->bDirection, TRUE ); + InternalSoldierReadyWeapon( pSoldier, pSoldier->ubDirection, TRUE ); return( TRUE ); } } @@ -3846,7 +3846,7 @@ if ( pSoldier->bLife >= OKLIFE ) // Randomly fall back or forward, if we are in the standing hit animation if ( pSoldier->usAnimState == GENERIC_HIT_STAND || pSoldier->usAnimState == RIFLE_STAND_HIT ) { - INT8 bTestDirection = pSoldier->bDirection; + INT8 bTestDirection = pSoldier->ubDirection; BOOLEAN fForceDirection = FALSE; BOOLEAN fDoFallback = FALSE; @@ -3882,20 +3882,22 @@ if ( pSoldier->bLife >= OKLIFE ) #endif -BOOLEAN OKFallDirection( SOLDIERTYPE *pSoldier, INT16 sGridNo, INT8 bLevel, INT8 bTestDirection, UINT16 usAnimState ) +BOOLEAN OKFallDirection( SOLDIERTYPE *pSoldier, INT16 sGridNo, INT8 bLevel, UINT8 ubTestDirection, UINT16 usAnimState ) { DebugMsg (TOPIC_JA2,DBG_LEVEL_3,"OKFallDirection"); STRUCTURE_FILE_REF * pStructureFileRef; UINT16 usAnimSurface; + UINT8 bOverTerrainType; // How are the movement costs? - if ( gubWorldMovementCosts[ sGridNo ][ bTestDirection ][ bLevel ] > TRAVELCOST_SHORE ) + if ( gubWorldMovementCosts[ sGridNo ][ ubTestDirection ][ bLevel ] > TRAVELCOST_SHORE ) { return( FALSE ); } + bOverTerrainType = GetTerrainType( sGridNo); //NOT ok if in water.... - if ( GetTerrainType( sGridNo ) == MED_WATER || GetTerrainType( sGridNo ) == DEEP_WATER || GetTerrainType( sGridNo ) == LOW_WATER ) + if ( TERRAIN_IS_WATER( bOverTerrainType) ) { return( FALSE ); } @@ -3922,9 +3924,9 @@ BOOLEAN OKFallDirection( SOLDIERTYPE *pSoldier, INT16 sGridNo, INT8 bLevel, INT8 // work now. The function is passing in an adjacent gridno but we need to place the structure // data in the tile BEFORE. So we take one step back in the direction opposite to bTestDirection // and use that gridno - sTestGridNo = NewGridNo( sGridNo, (UINT16)( DirectionInc( gOppositeDirection[ bTestDirection ] ) ) ); + sTestGridNo = NewGridNo( sGridNo, DirectionInc( gOppositeDirection[ ubTestDirection ] ) ); - if ( ! OkayToAddStructureToWorld( sTestGridNo, bLevel, &(pStructureFileRef->pDBStructureRef[ gOneCDirection[ bTestDirection ] ]), usStructureID ) ) + if ( ! OkayToAddStructureToWorld( sTestGridNo, bLevel, &(pStructureFileRef->pDBStructureRef[ gOneCDirection[ ubTestDirection ] ]), usStructureID ) ) { // can't go in that dir! return( FALSE ); @@ -4071,7 +4073,7 @@ void KickOutWheelchair( SOLDIERTYPE *pSoldier ) INT16 sNewGridNo; // Move forward one gridno.... - sNewGridNo = NewGridNo( (UINT16)pSoldier->sGridNo, (UINT16)( DirectionInc( pSoldier->bDirection ) ) ); + sNewGridNo = NewGridNo( (UINT16)pSoldier->sGridNo, (UINT16)( DirectionInc( pSoldier->ubDirection ) ) ); // ATE: Make sure that the gridno is unoccupied! if ( !NewOKDestination( pSoldier, sNewGridNo, TRUE, pSoldier->bLevel ) ) @@ -4080,7 +4082,7 @@ void KickOutWheelchair( SOLDIERTYPE *pSoldier ) sNewGridNo = pSoldier->sGridNo; } - EVENT_StopMerc( pSoldier, sNewGridNo, pSoldier->bDirection ); + EVENT_StopMerc( pSoldier, sNewGridNo, pSoldier->ubDirection ); pSoldier->ubBodyType = REGMALE; if ( pSoldier->ubProfile == SLAY && pSoldier->bTeam == CIV_TEAM && !pSoldier->bNeutral ) { diff --git a/Tactical/Soldier Ani.h b/Tactical/Soldier Ani.h index 477463cc..cfedb906 100644 --- a/Tactical/Soldier Ani.h +++ b/Tactical/Soldier Ani.h @@ -9,7 +9,7 @@ BOOLEAN CheckForAndHandleSoldierDyingNotFromHit( SOLDIERTYPE *pSoldier ); BOOLEAN HandleSoldierDeath( SOLDIERTYPE *pSoldier , BOOLEAN *pfMadeCorpse ); -BOOLEAN OKFallDirection( SOLDIERTYPE *pSoldier, INT16 sGridNo, INT8 bLevel, INT8 bTestDirection, UINT16 usAnimState ); +BOOLEAN OKFallDirection( SOLDIERTYPE *pSoldier, INT16 sGridNo, INT8 bLevel, UINT8 ubTestDirection, UINT16 usAnimState ); BOOLEAN HandleCheckForDeathCommonCode( SOLDIERTYPE *pSoldier ); diff --git a/Tactical/Soldier Control.cpp b/Tactical/Soldier Control.cpp index 02685996..77ca338b 100644 --- a/Tactical/Soldier Control.cpp +++ b/Tactical/Soldier Control.cpp @@ -839,7 +839,7 @@ UINT16 *CreateEnemyGreyGlow16BPPPalette( SGPPaletteEntry *pPalette, UINT32 rscal void SoldierBleed( SOLDIERTYPE *pSoldier, BOOLEAN fBandagedBleed ); INT32 CheckBleeding( SOLDIERTYPE *pSoldier ); -void EVENT_InternalSetSoldierDesiredDirection( SOLDIERTYPE *pSoldier, UINT16 usNewDirection, BOOLEAN fInitalMove, UINT16 usAnimState ); +void EVENT_InternalSetSoldierDesiredDirection( SOLDIERTYPE *pSoldier, UINT8 ubNewDirection, BOOLEAN fInitalMove, UINT16 usAnimState ); #ifdef JA2BETAVERSION extern void ValidatePlayersAreInOneGroupOnly(); @@ -961,7 +961,7 @@ void HandleCrowShadowNewGridNo( SOLDIERTYPE *pSoldier ) AniParams.sZ = 0; strcpy( AniParams.zCachedFile, "TILECACHE\\FLY_SHDW.STI" ); - AniParams.uiUserData3 = pSoldier->bDirection; + AniParams.uiUserData3 = pSoldier->ubDirection; pSoldier->pAniTile = CreateAnimationTile( &AniParams ); @@ -996,7 +996,7 @@ void HandleCrowShadowNewDirection( SOLDIERTYPE *pSoldier ) { if ( pSoldier->pAniTile != NULL ) { - pSoldier->pAniTile->uiUserData3 = pSoldier->bDirection; + pSoldier->pAniTile->uiUserData3 = pSoldier->ubDirection; } } } @@ -2181,7 +2181,7 @@ BOOLEAN EVENT_InitNewSoldierAnim( SOLDIERTYPE *pSoldier, UINT16 usNewState, UINT if ( usNewState == WALKING || usNewState == RUNNING || usNewState == SWATTING ) { // CHECK FOR SIDEWAYS! - if ( pSoldier->bDirection == gPurpendicularDirection[ pSoldier->bDirection ][ pSoldier->usPathingData[ pSoldier->usPathIndex ] ] ) + if ( pSoldier->ubDirection == gPurpendicularDirection[ pSoldier->ubDirection ][ pSoldier->usPathingData[ pSoldier->usPathIndex ] ] ) { // We are perpendicular! usNewState = SIDE_STEP; @@ -2220,7 +2220,7 @@ BOOLEAN EVENT_InitNewSoldierAnim( SOLDIERTYPE *pSoldier, UINT16 usNewState, UINT } // If we are in water.....and trying to run, change to run - if ( pSoldier->bOverTerrainType == LOW_WATER || pSoldier->bOverTerrainType == MED_WATER ) + if ( MercInWater( pSoldier) ) { // Check animation // Change to walking @@ -2638,14 +2638,14 @@ BOOLEAN EVENT_InitNewSoldierAnim( SOLDIERTYPE *pSoldier, UINT16 usNewState, UINT DeductPoints( pSoldier, AP_JUMP_OVER, BP_JUMP_OVER ); - usNewGridNo = NewGridNo( (UINT16)pSoldier->sGridNo, DirectionInc( pSoldier->bDirection ) ); - usNewGridNo = NewGridNo( (UINT16)usNewGridNo, DirectionInc( pSoldier->bDirection ) ); + usNewGridNo = NewGridNo( (UINT16)pSoldier->sGridNo, DirectionInc( pSoldier->ubDirection ) ); + usNewGridNo = NewGridNo( (UINT16)usNewGridNo, DirectionInc( pSoldier->ubDirection ) ); pSoldier->usPathDataSize = 0; pSoldier->usPathIndex = 0; - pSoldier->usPathingData[ pSoldier->usPathDataSize ] = pSoldier->bDirection; + pSoldier->usPathingData[ pSoldier->usPathDataSize ] = pSoldier->ubDirection; pSoldier->usPathDataSize++; - pSoldier->usPathingData[ pSoldier->usPathDataSize ] = pSoldier->bDirection; + pSoldier->usPathingData[ pSoldier->usPathDataSize ] = pSoldier->ubDirection; pSoldier->usPathDataSize++; pSoldier->sFinalDestination = usNewGridNo; // Set direction @@ -3243,7 +3243,7 @@ void SetSoldierGridNo( SOLDIERTYPE *pSoldier, INT16 sNewGridNo, BOOLEAN fForceRe // OK, If we were not in deep water but we are now, handle deep animations! - if ( pSoldier->bOverTerrainType == DEEP_WATER && pSoldier->bOldOverTerrainType != DEEP_WATER ) + if ( TERRAIN_IS_DEEP_WATER( pSoldier->bOverTerrainType) && !TERRAIN_IS_DEEP_WATER( pSoldier->bOldOverTerrainType) ) { // Based on our current animation, change! switch( pSoldier->usAnimState ) @@ -3263,13 +3263,13 @@ void SetSoldierGridNo( SOLDIERTYPE *pSoldier, INT16 sNewGridNo, BOOLEAN fForceRe } // Damage water if in deep water.... - if ( pSoldier->bOverTerrainType == MED_WATER || pSoldier->bOverTerrainType == DEEP_WATER ) + if ( MercInHighWater( pSoldier) ) { WaterDamage( pSoldier ); } // OK, If we were in deep water but we are NOT now, handle mid animations! - if ( pSoldier->bOverTerrainType != DEEP_WATER && pSoldier->bOldOverTerrainType == DEEP_WATER ) + if ( !TERRAIN_IS_DEEP_WATER( pSoldier->bOverTerrainType) && TERRAIN_IS_DEEP_WATER( pSoldier->bOldOverTerrainType) ) { // Make transition from low to deep EVENT_InitNewSoldierAnim( pSoldier, DEEP_TO_LOW_WATER, 0 , FALSE ); @@ -3791,7 +3791,7 @@ void SelectFallAnimation( SOLDIERTYPE *pSoldier ) BOOLEAN SoldierReadyWeapon( SOLDIERTYPE *pSoldier ) { - return( InternalSoldierReadyWeapon( pSoldier, (INT8)pSoldier->bDirection, FALSE ) ); + return( InternalSoldierReadyWeapon( pSoldier, (INT8)pSoldier->ubDirection, FALSE ) ); } BOOLEAN SoldierReadyWeapon( SOLDIERTYPE *pSoldier, INT16 sTargetXPos, INT16 sTargetYPos, BOOLEAN fEndReady ) @@ -3839,7 +3839,7 @@ BOOLEAN InternalSoldierReadyWeapon( SOLDIERTYPE *pSoldier, UINT8 sFacingDir, BOO EVENT_InternalSetSoldierDesiredDirection( pSoldier, sFacingDir, FALSE, usAnimState ); // Check if facing dir is different from ours and change direction if so! - //if ( sFacingDir != pSoldier->bDirection ) + //if ( sFacingDir != pSoldier->ubDirection ) //{ // DeductPoints( pSoldier, AP_CHANGE_FACING, 0 ); //}// @@ -3859,7 +3859,7 @@ UINT16 PickSoldierReadyAnimation( SOLDIERTYPE *pSoldier, BOOLEAN fEndReady ) return( INVALID_ANIMATION ); } - if ( pSoldier->bOverTerrainType == DEEP_WATER ) + if ( MercInDeepWater( pSoldier) ) { return( INVALID_ANIMATION ); } @@ -4490,12 +4490,12 @@ void EVENT_SoldierGotHit( SOLDIERTYPE *pSoldier, UINT16 usWeaponIndex, INT16 sDa } // If here, we are a merc, check if we are in water - if ( pSoldier->bOverTerrainType == LOW_WATER ) + if ( MercInShallowWater( pSoldier) ) { EVENT_InitNewSoldierAnim( pSoldier, WATER_HIT, 0 , FALSE ); return; } - if ( pSoldier->bOverTerrainType == DEEP_WATER ) + if ( MercInDeepWater( pSoldier) ) { EVENT_InitNewSoldierAnim( pSoldier, DEEP_WATER_HIT, 0 , FALSE ); return; @@ -4573,7 +4573,7 @@ void DoGenericHit( SOLDIERTYPE *pSoldier, UINT8 ubSpecial, INT16 bDirection ) { //SetSoldierDesiredDirection( pSoldier, bDirection ); EVENT_SetSoldierDirection( pSoldier, (INT8)bDirection ); - EVENT_SetSoldierDesiredDirection( pSoldier, pSoldier->bDirection ); + EVENT_SetSoldierDesiredDirection( pSoldier, pSoldier->ubDirection ); EVENT_InitNewSoldierAnim( pSoldier, STANDING_BURST_HIT, 0 , FALSE ); } @@ -4623,14 +4623,14 @@ void SoldierGotHitGunFire( SOLDIERTYPE *pSoldier, UINT16 usWeaponIndex, INT16 sD { if (SpacesAway( pSoldier->sGridNo, Menptr[ubAttackerID].sGridNo ) <= MAX_DISTANCE_FOR_MESSY_DEATH || (SpacesAway( pSoldier->sGridNo, Menptr[ubAttackerID].sGridNo ) <= MAX_BARRETT_DISTANCE_FOR_MESSY_DEATH && usWeaponIndex == BARRETT )) { - usNewGridNo = NewGridNo( (UINT16)pSoldier->sGridNo, (INT8)( DirectionInc( pSoldier->bDirection ) ) ); + usNewGridNo = NewGridNo( (UINT16)pSoldier->sGridNo, (INT8)( DirectionInc( pSoldier->ubDirection ) ) ); // CHECK OK DESTINATION! - if ( OKFallDirection( pSoldier, usNewGridNo, pSoldier->bLevel, pSoldier->bDirection, JFK_HITDEATH ) ) + if ( OKFallDirection( pSoldier, usNewGridNo, pSoldier->bLevel, pSoldier->ubDirection, JFK_HITDEATH ) ) { - usNewGridNo = NewGridNo( (UINT16)usNewGridNo, (INT8)( DirectionInc( pSoldier->bDirection ) ) ); + usNewGridNo = NewGridNo( (UINT16)usNewGridNo, (INT8)( DirectionInc( pSoldier->ubDirection ) ) ); - if ( OKFallDirection( pSoldier, usNewGridNo, pSoldier->bLevel, pSoldier->bDirection, pSoldier->usAnimState ) ) + if ( OKFallDirection( pSoldier, usNewGridNo, pSoldier->bLevel, pSoldier->ubDirection, pSoldier->usAnimState ) ) { fHeadHit = TRUE; } @@ -4646,9 +4646,9 @@ void SoldierGotHitGunFire( SOLDIERTYPE *pSoldier, UINT16 usWeaponIndex, INT16 sD { // possibly play torso explosion anim! - if (pSoldier->bDirection == bDirection) + if (pSoldier->ubDirection == bDirection) { - usNewGridNo = NewGridNo( (UINT16)pSoldier->sGridNo, DirectionInc( gOppositeDirection[ pSoldier->bDirection ] ) ); + usNewGridNo = NewGridNo( (UINT16)pSoldier->sGridNo, DirectionInc( gOppositeDirection[ pSoldier->ubDirection ] ) ); if ( OKFallDirection( pSoldier, usNewGridNo, pSoldier->bLevel, gOppositeDirection[ bDirection ], FLYBACK_HIT ) ) { @@ -4824,7 +4824,7 @@ void SoldierGotHitExplosion( SOLDIERTYPE *pSoldier, UINT16 usWeaponIndex, INT16 if ( OKFallDirection( pSoldier, sNewGridNo, pSoldier->bLevel, gOppositeDirection[ bDirection ], FLYBACK_HIT ) ) { EVENT_SetSoldierDirection( pSoldier, (INT8)bDirection ); - EVENT_SetSoldierDesiredDirection( pSoldier, pSoldier->bDirection ); + EVENT_SetSoldierDesiredDirection( pSoldier, pSoldier->ubDirection ); ChangeToFallbackAnimation( pSoldier, (INT8)bDirection ); } else @@ -4855,7 +4855,7 @@ void SoldierGotHitExplosion( SOLDIERTYPE *pSoldier, UINT16 usWeaponIndex, INT16 } EVENT_SetSoldierDirection( pSoldier, (INT8)bDirection ); - EVENT_SetSoldierDesiredDirection( pSoldier, pSoldier->bDirection ); + EVENT_SetSoldierDesiredDirection( pSoldier, pSoldier->ubDirection ); // Check behind us! sNewGridNo = NewGridNo( (UINT16)pSoldier->sGridNo, DirectionInc( gOppositeDirection[ bDirection ] ) ); @@ -5067,7 +5067,7 @@ BOOLEAN EVENT_InternalGetNewSoldierPath( SOLDIERTYPE *pSoldier, UINT16 sDestGrid usMoveAnimState = pSoldier->usUIMovementMode; - if ( pSoldier->bOverTerrainType == DEEP_WATER ) + if ( MercInDeepWater( pSoldier) ) { usMoveAnimState = DEEP_WATER_SWIM; } @@ -5120,7 +5120,7 @@ BOOLEAN EVENT_InternalGetNewSoldierPath( SOLDIERTYPE *pSoldier, UINT16 sDestGrid // If true, we're OK, if not, WAIT for a guy to pass! // If we are in deep water, we can only swim! - if ( pSoldier->bOverTerrainType == DEEP_WATER ) + if ( MercInDeepWater( pSoldier) ) { usMoveAnimState = DEEP_WATER_SWIM; } @@ -5168,7 +5168,7 @@ void StopSoldier( SOLDIERTYPE *pSoldier ) if ( !( gAnimControl[ pSoldier->usAnimState ].uiFlags & ANIM_STATIONARY ) ) { //SoldierGotoStationaryStance( pSoldier ); - EVENT_StopMerc( pSoldier, pSoldier->sGridNo, pSoldier->bDirection ); + EVENT_StopMerc( pSoldier, pSoldier->sGridNo, pSoldier->ubDirection ); } // Set desination @@ -5196,7 +5196,7 @@ void SoldierGotoStationaryStance( SOLDIERTYPE *pSoldier ) } // Check if we are in deep water! - if ( pSoldier->bOverTerrainType == DEEP_WATER ) + if ( MercInDeepWater( pSoldier) ) { // IN deep water, tred! EVENT_InitNewSoldierAnim( pSoldier, DEEP_WATER_TRED, 0 , FALSE ); @@ -5258,6 +5258,12 @@ void ChangeSoldierStance( SOLDIERTYPE *pSoldier, UINT8 ubDesiredStance ) return; } + if (!IsValidStance( pSoldier, ubDesiredStance)) + { + AssertMsg( 0, "Attempted to set soldier to an invalid stance."); + return; + } + // Set UI Busy SetUIBusy( pSoldier->ubID ); @@ -5285,22 +5291,22 @@ void ChangeSoldierStance( SOLDIERTYPE *pSoldier, UINT8 ubDesiredStance ) } } -void EVENT_InternalSetSoldierDestination( SOLDIERTYPE *pSoldier, UINT16 usNewDirection, BOOLEAN fFromMove, UINT16 usAnimState ) +void EVENT_InternalSetSoldierDestination( SOLDIERTYPE *pSoldier, UINT8 ubNewDirection, BOOLEAN fFromMove, UINT16 usAnimState ) { - UINT16 usNewGridNo; + INT16 sNewGridNo; INT16 sXPos, sYPos; // Get dest gridno, convert to center coords - usNewGridNo = NewGridNo( (UINT16)pSoldier->sGridNo, DirectionInc( usNewDirection ) ); + sNewGridNo = NewGridNo( pSoldier->sGridNo, DirectionInc( ubNewDirection ) ); - ConvertMapPosToWorldTileCenter( usNewGridNo, &sXPos, &sYPos ); + ConvertMapPosToWorldTileCenter( sNewGridNo, &sXPos, &sYPos ); // Save new dest gridno, x, y - pSoldier->sDestination = usNewGridNo; + pSoldier->sDestination = sNewGridNo; pSoldier->sDestXPos = sXPos; pSoldier->sDestYPos = sYPos; - pSoldier->bMovementDirection = (INT8)usNewDirection; + pSoldier->bMovementDirection = (INT8)ubNewDirection; // OK, ATE: If we are side_stepping, calculate a NEW desired direction.... @@ -5309,17 +5315,17 @@ void EVENT_InternalSetSoldierDestination( SOLDIERTYPE *pSoldier, UINT16 usNewDir UINT8 ubPerpDirection; // Get a new desired direction, - ubPerpDirection = gPurpendicularDirection[ pSoldier->bDirection ][ usNewDirection ]; + ubPerpDirection = gPurpendicularDirection[ pSoldier->ubDirection ][ ubNewDirection ]; // CHange actual and desired direction.... EVENT_SetSoldierDirection( pSoldier, ubPerpDirection ); - pSoldier->bDesiredDirection = pSoldier->bDirection; + pSoldier->bDesiredDirection = pSoldier->ubDirection; } else { if ( !( gAnimControl[ usAnimState ].uiFlags & ANIM_SPECIALMOVE ) ) { - EVENT_InternalSetSoldierDesiredDirection( pSoldier, usNewDirection, fFromMove, usAnimState ); + EVENT_InternalSetSoldierDesiredDirection( pSoldier, ubNewDirection, fFromMove, usAnimState ); } } } @@ -5409,17 +5415,17 @@ INT8 MultiTiledTurnDirection( SOLDIERTYPE * pSoldier, INT8 bStartDirection, INT8 -void EVENT_InternalSetSoldierDesiredDirection( SOLDIERTYPE *pSoldier, UINT16 usNewDirection, BOOLEAN fInitalMove, UINT16 usAnimState ) +void EVENT_InternalSetSoldierDesiredDirection( SOLDIERTYPE *pSoldier, UINT8 ubNewDirection, BOOLEAN fInitalMove, UINT16 usAnimState ) { //if ( usAnimState == WALK_BACKWARDS ) if ( pSoldier->bReverse && usAnimState != SIDE_STEP ) { // OK, check if we are going to go in the exact opposite than our facing.... - usNewDirection = gOppositeDirection[ usNewDirection ]; + ubNewDirection = gOppositeDirection[ ubNewDirection ]; } - pSoldier->bDesiredDirection = (INT8)usNewDirection; + pSoldier->bDesiredDirection = (INT8)ubNewDirection; // If we are prone, goto crouched first! // ONly if we are stationary, and only if directions are differnet! @@ -5434,7 +5440,7 @@ void EVENT_InternalSetSoldierDesiredDirection( SOLDIERTYPE *pSoldier, UINT16 usN AdjustNoAPToFinishMove( pSoldier, FALSE ); } - if ( pSoldier->bDesiredDirection != pSoldier->bDirection ) + if ( pSoldier->bDesiredDirection != pSoldier->ubDirection ) { if ( gAnimControl[ usAnimState ].uiFlags & ( ANIM_BREATH | ANIM_OK_CHARGE_AP_FOR_TURN | ANIM_FIREREADY ) && !fInitalMove && !pSoldier->fDontChargeTurningAPs ) { @@ -5492,7 +5498,7 @@ void EVENT_InternalSetSoldierDesiredDirection( SOLDIERTYPE *pSoldier, UINT16 usN // Set desired direction for the extended directions... pSoldier->ubHiResDesiredDirection = ubExtDirection[ pSoldier->bDesiredDirection ]; - if ( pSoldier->bDesiredDirection != pSoldier->bDirection ) + if ( pSoldier->bDesiredDirection != pSoldier->ubDirection ) { if ( pSoldier->uiStatusFlags & ( SOLDIER_VEHICLE ) || CREATURE_OR_BLOODCAT( pSoldier ) ) { @@ -5509,20 +5515,20 @@ void EVENT_InternalSetSoldierDesiredDirection( SOLDIERTYPE *pSoldier, UINT16 usN { if ( pSoldier->uiStatusFlags & SOLDIER_MULTITILE ) { - pSoldier->bTurningIncrement = (INT8) MultiTiledTurnDirection( pSoldier, pSoldier->bDirection, pSoldier->bDesiredDirection ); + pSoldier->bTurningIncrement = (INT8) MultiTiledTurnDirection( pSoldier, pSoldier->ubDirection, pSoldier->bDesiredDirection ); } else { - pSoldier->bTurningIncrement = (INT8) QuickestDirection( pSoldier->bDirection, pSoldier->bDesiredDirection ); + pSoldier->bTurningIncrement = (INT8) QuickestDirection( pSoldier->ubDirection, pSoldier->bDesiredDirection ); } } } -void EVENT_SetSoldierDesiredDirection( SOLDIERTYPE *pSoldier, UINT16 usNewDirection ) +void EVENT_SetSoldierDesiredDirection( SOLDIERTYPE *pSoldier, UINT8 ubNewDirection ) { - EVENT_InternalSetSoldierDesiredDirection( pSoldier, usNewDirection, FALSE, pSoldier->usAnimState ); + EVENT_InternalSetSoldierDesiredDirection( pSoldier, ubNewDirection, FALSE, pSoldier->usAnimState ); } @@ -5531,10 +5537,10 @@ void EVENT_SetSoldierDirection( SOLDIERTYPE *pSoldier, UINT16 usNewDirection ) // Remove old location data HandleAnimationProfile( pSoldier, pSoldier->usAnimState, TRUE ); - pSoldier->bDirection = (INT8)usNewDirection; + pSoldier->ubDirection = (INT8)usNewDirection; // Updated extended direction..... - pSoldier->ubHiResDirection = ubExtDirection[ pSoldier->bDirection ]; + pSoldier->ubHiResDirection = ubExtDirection[ pSoldier->ubDirection ]; // Add new stuff HandleAnimationProfile( pSoldier, pSoldier->usAnimState, FALSE ); @@ -5809,7 +5815,7 @@ BOOLEAN ConvertAniCodeToAniFrame( SOLDIERTYPE *pSoldier, UINT16 usAniFrame ) CHECKF( usAnimSurface != INVALID_ANIMATION_SURFACE ); // COnvert world direction into sprite direction - ubTempDir = gOneCDirection[ pSoldier->bDirection ]; + ubTempDir = gOneCDirection[ pSoldier->ubDirection ]; //If we are only one frame, ignore what the script is telling us! if ( gAnimSurfaceDatabase[ usAnimSurface ].ubFlags & ANIM_DATA_FLAG_NOFRAMES ) @@ -5834,22 +5840,22 @@ BOOLEAN ConvertAniCodeToAniFrame( SOLDIERTYPE *pSoldier, UINT16 usAniFrame ) // Check # of directions /surface, adjust if ness. else if ( gAnimSurfaceDatabase[ usAnimSurface ].uiNumDirections == 3 ) { - if ( pSoldier->bDirection == NORTHWEST ) + if ( pSoldier->ubDirection == NORTHWEST ) { ubTempDir = 1; } - if ( pSoldier->bDirection == WEST ) + if ( pSoldier->ubDirection == WEST ) { ubTempDir = 0; } - if ( pSoldier->bDirection == EAST ) + if ( pSoldier->ubDirection == EAST ) { ubTempDir = 2; } } else if ( gAnimSurfaceDatabase[ usAnimSurface ].uiNumDirections == 2 ) { - ubTempDir = gDirectionFrom8to2[ pSoldier->bDirection ]; + ubTempDir = gDirectionFrom8to2[ pSoldier->ubDirection ]; } pSoldier->usAniFrame = usAniFrame + (UINT16) ( ( gAnimSurfaceDatabase[ usAnimSurface ].uiNumFramesPerDir * ubTempDir ) ); @@ -5892,7 +5898,7 @@ void TurnSoldier( SOLDIERTYPE *pSoldier) if ( pSoldier->bDesiredDirection > 7 || pSoldier->bDesiredDirection < 0) { DebugMsg( TOPIC_JA2, DBG_LEVEL_3, String("TurnSoldier() Warinig: Invalid desired direction for non-vehicle unit") ); - pSoldier->bDesiredDirection = pSoldier->bDirection; + pSoldier->bDesiredDirection = pSoldier->ubDirection; } } // Lesh: patch ended @@ -5914,7 +5920,7 @@ void TurnSoldier( SOLDIERTYPE *pSoldier) if ( pSoldier->fTurningToShoot ) { - if ( pSoldier->bDirection == pSoldier->bDesiredDirection ) + if ( pSoldier->ubDirection == pSoldier->bDesiredDirection ) { if ( ( (gAnimControl[ pSoldier->usAnimState ].uiFlags & ANIM_FIREREADY ) && !pSoldier->fTurningFromPronePosition ) || pSoldier->ubBodyType == ROBOTNOWEAPON || pSoldier->ubBodyType == TANK_NW || pSoldier->ubBodyType == TANK_NE ) { @@ -5946,7 +5952,7 @@ void TurnSoldier( SOLDIERTYPE *pSoldier) if ( pSoldier->fTurningToFall ) { - if ( pSoldier->bDirection == pSoldier->bDesiredDirection ) + if ( pSoldier->ubDirection == pSoldier->bDesiredDirection ) { SelectFallAnimation( pSoldier ); pSoldier->fTurningToFall = FALSE; @@ -5955,7 +5961,7 @@ void TurnSoldier( SOLDIERTYPE *pSoldier) if ( pSoldier->fTurningUntilDone && ( pSoldier->ubPendingStanceChange != NO_PENDING_STANCE ) ) { - if ( pSoldier->bDirection == pSoldier->bDesiredDirection ) + if ( pSoldier->ubDirection == pSoldier->bDesiredDirection ) { SendChangeSoldierStanceEvent( pSoldier, pSoldier->ubPendingStanceChange ); pSoldier->ubPendingStanceChange = NO_PENDING_STANCE; @@ -5965,7 +5971,7 @@ void TurnSoldier( SOLDIERTYPE *pSoldier) if ( pSoldier->fTurningUntilDone && ( pSoldier->usPendingAnimation != NO_PENDING_ANIMATION ) ) { - if ( pSoldier->bDirection == pSoldier->bDesiredDirection ) + if ( pSoldier->ubDirection == pSoldier->bDesiredDirection ) { UINT16 usPendingAnimation; @@ -5978,7 +5984,7 @@ void TurnSoldier( SOLDIERTYPE *pSoldier) } // Don't do anything if we are at dest direction! - if ( pSoldier->bDirection == pSoldier->bDesiredDirection ) + if ( pSoldier->ubDirection == pSoldier->bDesiredDirection ) { if ( pSoldier->ubBodyType == TANK_NW || pSoldier->ubBodyType == TANK_NE ) { @@ -6124,8 +6130,8 @@ void TurnSoldier( SOLDIERTYPE *pSoldier) else { // Get new direction - //sDirection = pSoldier->bDirection + QuickestDirection( pSoldier->bDirection, pSoldier->bDesiredDirection ); - sDirection = pSoldier->bDirection + pSoldier->bTurningIncrement; + //sDirection = pSoldier->ubDirection + QuickestDirection( pSoldier->ubDirection, pSoldier->bDesiredDirection ); + sDirection = pSoldier->ubDirection + pSoldier->bTurningIncrement; if (sDirection > 7) { sDirection = 0; @@ -6180,7 +6186,7 @@ void TurnSoldier( SOLDIERTYPE *pSoldier) // If we are a creature, or multi-tiled, cancel AI action.....? else if ( pSoldier->uiStatusFlags & SOLDIER_MULTITILE ) { - pSoldier->bDesiredDirection = pSoldier->bDirection; + pSoldier->bDesiredDirection = pSoldier->ubDirection; } } @@ -6972,7 +6978,7 @@ void MoveMercFacingDirection( SOLDIERTYPE *pSoldier, BOOLEAN fReverse, FLOAT dMo FLOAT dAngle = (FLOAT)0; // Determine which direction we are in - switch( pSoldier->bDirection ) + switch( pSoldier->ubDirection ) { case NORTH: dAngle = (FLOAT)( -1 * PI ); @@ -7024,7 +7030,7 @@ void BeginSoldierClimbUpRoof( SOLDIERTYPE *pSoldier ) UINT8 ubWhoIsThere; - if ( FindHeigherLevel( pSoldier, pSoldier->sGridNo, pSoldier->bDirection, &bNewDirection ) && ( pSoldier->bLevel == 0 ) ) + if ( FindHeigherLevel( pSoldier, pSoldier->sGridNo, pSoldier->ubDirection, &bNewDirection ) && ( pSoldier->bLevel == 0 ) ) { if ( EnoughPoints( pSoldier, GetAPsToClimbRoof( pSoldier, FALSE ), 0, TRUE ) ) { @@ -7074,7 +7080,7 @@ void BeginSoldierClimbFence( SOLDIERTYPE *pSoldier ) } else { - bDirection = pSoldier->bDirection; + bDirection = pSoldier->ubDirection; } if ( FindFenceJumpDirection( pSoldier, pSoldier->sGridNo, bDirection, &bDirection ) ) @@ -8215,7 +8221,7 @@ BOOLEAN CheckSoldierHitRoof( SOLDIERTYPE *pSoldier ) return( FALSE ); } - if ( FindLowerLevel( pSoldier, pSoldier->sGridNo, pSoldier->bDirection, &bNewDirection ) && ( pSoldier->bLevel > 0 ) ) + if ( FindLowerLevel( pSoldier, pSoldier->sGridNo, pSoldier->ubDirection, &bNewDirection ) && ( pSoldier->bLevel > 0 ) ) { // ONly if standing! if ( gAnimControl[ pSoldier->usAnimState ].ubHeight == ANIM_STAND ) @@ -8237,11 +8243,11 @@ BOOLEAN CheckSoldierHitRoof( SOLDIERTYPE *pSoldier ) } // Are wee near enough to fall forwards.... - if ( pSoldier->bDirection == gOneCDirection[ bNewDirection ] || - pSoldier->bDirection == gTwoCDirection[ bNewDirection ] || - pSoldier->bDirection == bNewDirection || - pSoldier->bDirection == gOneCCDirection[ bNewDirection ] || - pSoldier->bDirection == gTwoCCDirection[ bNewDirection ] ) + if ( pSoldier->ubDirection == gOneCDirection[ bNewDirection ] || + pSoldier->ubDirection == gTwoCDirection[ bNewDirection ] || + pSoldier->ubDirection == bNewDirection || + pSoldier->ubDirection == gOneCCDirection[ bNewDirection ] || + pSoldier->ubDirection == gTwoCCDirection[ bNewDirection ] ) { // Do backwards... fDoForwards = FALSE; @@ -8290,7 +8296,7 @@ void BeginSoldierClimbDownRoof( SOLDIERTYPE *pSoldier ) UINT8 ubWhoIsThere; - if ( FindLowerLevel( pSoldier, pSoldier->sGridNo, pSoldier->bDirection, &bNewDirection ) && ( pSoldier->bLevel > 0 ) ) + if ( FindLowerLevel( pSoldier, pSoldier->sGridNo, pSoldier->ubDirection, &bNewDirection ) && ( pSoldier->bLevel > 0 ) ) { if ( EnoughPoints( pSoldier, GetAPsToClimbRoof( pSoldier, TRUE ), 0, TRUE ) ) { @@ -8334,7 +8340,7 @@ INT8 bNewDirection; UINT8 ubWhoIsThere; -if ( FindLowerLevel( pSoldier, pSoldier->sGridNo, pSoldier->bDirection, &bNewDirection ) && ( pSoldier->bLevel > 0 ) ) +if ( FindLowerLevel( pSoldier, pSoldier->sGridNo, pSoldier->ubDirection, &bNewDirection ) && ( pSoldier->bLevel > 0 ) ) { if ( EnoughPoints( pSoldier, GetAPsToClimbRoof( pSoldier, TRUE ), 0, TRUE ) ) { @@ -8487,7 +8493,7 @@ void MoveMerc( SOLDIERTYPE *pSoldier, FLOAT dMovementChange, FLOAT dAngle, BOOLE } -INT16 GetDirectionFromGridNo( INT16 sGridNo, SOLDIERTYPE *pSoldier ) +UINT8 GetDirectionFromGridNo( INT16 sGridNo, SOLDIERTYPE *pSoldier ) { INT16 sXPos, sYPos; @@ -8508,7 +8514,7 @@ INT16 GetDirectionToGridNoFromGridNo( INT16 sGridNoDest, INT16 sGridNoSrc ) } -INT16 GetDirectionFromXY( INT16 sXPos, INT16 sYPos, SOLDIERTYPE *pSoldier ) +UINT8 GetDirectionFromXY( INT16 sXPos, INT16 sYPos, SOLDIERTYPE *pSoldier ) { INT16 sXPos2, sYPos2; @@ -8812,7 +8818,7 @@ void AdjustForFastTurnAnimation( SOLDIERTYPE *pSoldier ) // ATE: Mod: Only fastturn for OUR guys! if ( gAnimControl[ pSoldier->usAnimState ].uiFlags & ANIM_FASTTURN && pSoldier->bTeam == gbPlayerNum && !( pSoldier->uiStatusFlags & SOLDIER_TURNINGFROMHIT ) ) { - if ( pSoldier->bDirection != pSoldier->bDesiredDirection ) + if ( pSoldier->ubDirection != pSoldier->bDesiredDirection ) { pSoldier->sAniDelay = FAST_TURN_ANIM_SPEED; } @@ -8989,7 +8995,7 @@ void ReleaseSoldiersAttacker( SOLDIERTYPE *pSoldier ) BOOLEAN MercInWater( SOLDIERTYPE *pSoldier ) { // Our water texture , for now is of a given type - if ( pSoldier->bOverTerrainType == LOW_WATER || pSoldier->bOverTerrainType == MED_WATER || pSoldier->bOverTerrainType == DEEP_WATER ) + if ( TERRAIN_IS_WATER( pSoldier->bOverTerrainType)) { return( TRUE ); } @@ -8999,6 +9005,47 @@ BOOLEAN MercInWater( SOLDIERTYPE *pSoldier ) } } +BOOLEAN MercInShallowWater( SOLDIERTYPE *pSoldier ) +{ + // Our water texture , for now is of a given type + if ( TERRAIN_IS_SHALLOW_WATER( pSoldier->bOverTerrainType)) + { + return( TRUE ); + } + else + { + return( FALSE ); + } +} + + +BOOLEAN MercInDeepWater( SOLDIERTYPE *pSoldier ) +{ + // Our water texture , for now is of a given type + if ( TERRAIN_IS_DEEP_WATER( pSoldier->bOverTerrainType)) + { + return( TRUE ); + } + else + { + return( FALSE ); + } +} + +BOOLEAN MercInHighWater( SOLDIERTYPE *pSoldier ) +{ + // Our water texture , for now is of a given type + if ( TERRAIN_IS_HIGH_WATER( pSoldier->bOverTerrainType)) + { + return( TRUE ); + } + else + { + return( FALSE ); + } +} + + void RevivePlayerTeam( ) { @@ -9083,7 +9130,7 @@ void HandleAnimationProfile( SOLDIERTYPE *pSoldier, UINT16 usAnimState, BOOLEAN pProfile = &(gpAnimProfiles[ bProfileID ] ); // Get direction - pProfileDir = &( pProfile->Dirs[ pSoldier->bDirection ] ); + pProfileDir = &( pProfile->Dirs[ pSoldier->ubDirection ] ); // Loop tiles and set accordingly into world for( iTileCount = 0; iTileCount < pProfileDir->ubNumTiles; iTileCount++ ) @@ -9180,7 +9227,7 @@ BOOLEAN GetProfileFlagsFromGridno( SOLDIERTYPE *pSoldier, UINT16 usAnimState, UI pProfile = &(gpAnimProfiles[ bProfileID ] ); // Get direction - pProfileDir = &( pProfile->Dirs[ pSoldier->bDirection ] ); + pProfileDir = &( pProfile->Dirs[ pSoldier->ubDirection ] ); // Loop tiles and set accordingly into world for( iTileCount = 0; iTileCount < pProfileDir->ubNumTiles; iTileCount++ ) @@ -9214,7 +9261,7 @@ void EVENT_SoldierBeginGiveItem( SOLDIERTYPE *pSoldier ) { // CHANGE DIRECTION AND GOTO ANIMATION NOW pSoldier->bDesiredDirection = pSoldier->bPendingActionData3; - pSoldier->bDirection = pSoldier->bPendingActionData3; + pSoldier->ubDirection = pSoldier->bPendingActionData3; // begin animation EVENT_InitNewSoldierAnim( pSoldier, GIVE_ITEM, 0 , FALSE ); @@ -9330,7 +9377,7 @@ void EVENT_SoldierBeginBladeAttack( SOLDIERTYPE *pSoldier, INT16 sGridNo, UINT8 if ( !( pTSoldier->uiStatusFlags & ( SOLDIER_MONSTER | SOLDIER_ANIMAL | SOLDIER_VEHICLE ) ) ) { // OK, stop merc.... - EVENT_StopMerc( pTSoldier, pTSoldier->sGridNo, pTSoldier->bDirection ); + EVENT_StopMerc( pTSoldier, pTSoldier->sGridNo, pTSoldier->ubDirection ); if ( pTSoldier->bTeam != gbPlayerNum ) { @@ -9487,7 +9534,7 @@ void EVENT_SoldierBeginPunchAttack( SOLDIERTYPE *pSoldier, INT16 sGridNo, UINT8 if ( !( pTSoldier->uiStatusFlags & ( SOLDIER_MONSTER | SOLDIER_ANIMAL | SOLDIER_VEHICLE ) ) ) { // OK, stop merc.... - EVENT_StopMerc( pTSoldier, pTSoldier->sGridNo, pTSoldier->bDirection ); + EVENT_StopMerc( pTSoldier, pTSoldier->sGridNo, pTSoldier->ubDirection ); if ( pTSoldier->bTeam != gbPlayerNum ) { @@ -10004,7 +10051,7 @@ void HaultSoldierFromSighting( SOLDIERTYPE *pSoldier, BOOLEAN fFromSightingEnemy //EV_S_STOP_MERC SStopMerc; //SStopMerc.sGridNo = pSoldier->sGridNo; - //SStopMerc.bDirection = pSoldier->bDirection; + //SStopMerc.bDirection = pSoldier->ubDirection; //SStopMerc.usSoldierID = pSoldier->ubID; //AddGameEvent( S_STOP_MERC, 0, &SStopMerc ); @@ -10065,7 +10112,7 @@ void HaultSoldierFromSighting( SOLDIERTYPE *pSoldier, BOOLEAN fFromSightingEnemy if ( !( gTacticalStatus.uiFlags & INCOMBAT ) ) { - EVENT_StopMerc( pSoldier, pSoldier->sGridNo, pSoldier->bDirection ); + EVENT_StopMerc( pSoldier, pSoldier->sGridNo, pSoldier->ubDirection ); } else { @@ -10595,7 +10642,7 @@ BOOLEAN InternalIsValidStance( SOLDIERTYPE *pSoldier, INT8 bDirection, INT8 bNew BOOLEAN IsValidStance( SOLDIERTYPE *pSoldier, INT8 bNewStance ) { - return( InternalIsValidStance( pSoldier, pSoldier->bDirection, bNewStance ) ); + return( InternalIsValidStance( pSoldier, pSoldier->ubDirection, bNewStance ) ); } @@ -10915,11 +10962,11 @@ void SoldierCollapse( SOLDIERTYPE *pSoldier ) { case ANIM_STAND: - if ( pSoldier->bOverTerrainType == DEEP_WATER ) + if ( MercInDeepWater( pSoldier) ) { EVENT_InitNewSoldierAnim( pSoldier, DEEP_WATER_DIE, 0, FALSE ); } - else if ( pSoldier->bOverTerrainType == LOW_WATER ) + else if ( MercInShallowWater( pSoldier) ) { EVENT_InitNewSoldierAnim( pSoldier, WATER_DIE, 0, FALSE ); } @@ -11218,7 +11265,7 @@ void PickPickupAnimation( SOLDIERTYPE *pSoldier, INT32 iItemIndex, INT16 sGridNo default: - bDirection = pSoldier->bDirection; + bDirection = pSoldier->ubDirection; break; } @@ -11486,13 +11533,33 @@ void ResetSoldierChangeStatTimer( SOLDIERTYPE *pSoldier ) } -void ChangeToFlybackAnimation( SOLDIERTYPE *pSoldier, INT8 bDirection ) +void ChangeToFlybackAnimation( SOLDIERTYPE *pSoldier, UINT8 ubDirection ) { - UINT16 usNewGridNo; + INT16 sNewGridNo; + UINT8 ubOppositeDir; + INT16 sDirectionInc; + + ubOppositeDir = gOppositeDirection[ ubDirection ]; + sDirectionInc = DirectionInc( ubOppositeDir); // Get dest gridno, convert to center coords - usNewGridNo = NewGridNo( (UINT16)pSoldier->sGridNo, DirectionInc( gOppositeDirection[ bDirection ] ) ); - usNewGridNo = NewGridNo( (UINT16)usNewGridNo, DirectionInc( gOppositeDirection[ bDirection ] ) ); + sNewGridNo = NewGridNo( pSoldier->sGridNo, sDirectionInc ); + if ( gubWorldMovementCosts[ sNewGridNo ][ ubOppositeDir ][ pSoldier->bLevel ] >= TRAVELCOST_BLOCKED ) + { + // No room to fly back. Pretend we hit the wall and fall forward instead + BeginTyingToFall( pSoldier ); + ChangeSoldierState( pSoldier, FALLFORWARD_FROMHIT_STAND, 0, FALSE ); + return; + } + + sNewGridNo = NewGridNo( sNewGridNo, sDirectionInc ); + if ( gubWorldMovementCosts[ sNewGridNo ][ ubOppositeDir ][ pSoldier->bLevel ] >= TRAVELCOST_BLOCKED ) + { + // No room to fly back. Fall back instead + BeginTyingToFall( pSoldier ); + ChangeSoldierState( pSoldier, FALLBACK_HIT_STAND, 0, FALSE ); + } + // Remove any previous actions pSoldier->ubPendingAction = NO_PENDING_ACTION; @@ -11500,23 +11567,38 @@ void ChangeToFlybackAnimation( SOLDIERTYPE *pSoldier, INT8 bDirection ) // Set path.... pSoldier->usPathDataSize = 0; pSoldier->usPathIndex = 0; - pSoldier->usPathingData[ pSoldier->usPathDataSize ] = gOppositeDirection[ pSoldier->bDirection ]; + pSoldier->usPathingData[ pSoldier->usPathDataSize ] = ubOppositeDir; pSoldier->usPathDataSize++; - pSoldier->usPathingData[ pSoldier->usPathDataSize ] = gOppositeDirection[ pSoldier->bDirection ]; + pSoldier->usPathingData[ pSoldier->usPathDataSize ] = ubOppositeDir; pSoldier->usPathDataSize++; - pSoldier->sFinalDestination = usNewGridNo; + pSoldier->sFinalDestination = sNewGridNo; EVENT_InternalSetSoldierDestination( pSoldier, pSoldier->usPathingData[ pSoldier->usPathIndex ], FALSE, FLYBACK_HIT ); // Get a new direction based on direction EVENT_InitNewSoldierAnim( pSoldier, FLYBACK_HIT, 0 , FALSE ); } -void ChangeToFallbackAnimation( SOLDIERTYPE *pSoldier, INT8 bDirection ) +void ChangeToFallbackAnimation( SOLDIERTYPE *pSoldier, UINT8 ubDirection ) { - UINT16 usNewGridNo; + INT16 sNewGridNo; + UINT8 ubOppositeDir; + INT16 sDirection; + + ubOppositeDir = gOppositeDirection[ ubDirection ]; + sDirection = DirectionInc( ubOppositeDir); // Get dest gridno, convert to center coords - usNewGridNo = NewGridNo( (UINT16)pSoldier->sGridNo, DirectionInc( gOppositeDirection[ bDirection ] ) ); + sNewGridNo = NewGridNo( pSoldier->sGridNo, sDirection ); + if ( gubWorldMovementCosts[ sNewGridNo ][ ubOppositeDir ][ pSoldier->bLevel ] >= TRAVELCOST_BLOCKED ) + { + // No room to fly back. Pretend we hit the wall and fall forward instead + BeginTyingToFall( pSoldier ); + ChangeSoldierState( pSoldier, FALLFORWARD_FROMHIT_STAND, 0, FALSE ); + return; + } + + // Get dest gridno, convert to center coords + //sNewGridNo = NewGridNo( sNewGridNo, sDirection ); //usNewGridNo = NewGridNo( (UINT16)usNewGridNo, (UINT16)(-1 * DirectionInc( bDirection ) ) ); // Remove any previous actions @@ -11525,10 +11607,11 @@ void ChangeToFallbackAnimation( SOLDIERTYPE *pSoldier, INT8 bDirection ) // Set path.... pSoldier->usPathDataSize = 0; pSoldier->usPathIndex = 0; - pSoldier->usPathingData[ pSoldier->usPathDataSize ] = gOppositeDirection[ pSoldier->bDirection ]; + pSoldier->usPathingData[ pSoldier->usPathDataSize ] = ubOppositeDir; pSoldier->usPathDataSize++; - pSoldier->sFinalDestination = usNewGridNo; - EVENT_InternalSetSoldierDestination( pSoldier, pSoldier->usPathingData[ pSoldier->usPathIndex ], FALSE, FALLBACK_HIT_STAND ); + pSoldier->sFinalDestination = sNewGridNo; + //pSoldier->sFinalDestination = pSoldier->sGridNo; + EVENT_InternalSetSoldierDestination( pSoldier, ubOppositeDir, FALSE, FALLBACK_HIT_STAND ); // Get a new direction based on direction EVENT_InitNewSoldierAnim( pSoldier, FALLBACK_HIT_STAND, 0 , FALSE ); @@ -11664,7 +11747,7 @@ BOOLEAN PlayerSoldierStartTalking( SOLDIERTYPE *pSoldier, UINT8 ubTargetID, BOOL SendSoldierSetDesiredDirectionEvent( pTSoldier, gOppositeDirection[ sFacingDir ] ); // Stop our guys... - EVENT_StopMerc( pSoldier, pSoldier->sGridNo, pSoldier->bDirection ); + EVENT_StopMerc( pSoldier, pSoldier->sGridNo, pSoldier->ubDirection ); } pTMilitiaSoldier = pTSoldier; //lal @@ -12051,12 +12134,12 @@ void InternalPlaySoldierFootstepSound( SOLDIERTYPE * pSoldier ) { ubSoundBase = WALK_LEFT_ROAD; } - else if ( pSoldier->bOverTerrainType == LOW_WATER || pSoldier->bOverTerrainType == MED_WATER ) + else if ( MercInShallowWater( pSoldier) ) { ubSoundBase = WATER_WALK1_IN; ubRandomMax = 2; } - else if ( pSoldier->bOverTerrainType == DEEP_WATER ) + else if ( MercInDeepWater( pSoldier) ) { ubSoundBase = SWIM_1; ubRandomMax = 2; @@ -12208,7 +12291,7 @@ void DebugValidateSoldierData( ) void BeginTyingToFall( SOLDIERTYPE *pSoldier ) { - pSoldier->bStartFallDir = pSoldier->bDirection; + pSoldier->bStartFallDir = pSoldier->ubDirection; pSoldier->fTryingToFall = TRUE; // Randomize direction diff --git a/Tactical/Soldier Control.h b/Tactical/Soldier Control.h index ad621aa7..af612971 100644 --- a/Tactical/Soldier Control.h +++ b/Tactical/Soldier Control.h @@ -503,7 +503,7 @@ public: FLOAT dOldYPos; INT16 sInitialGridNo; INT16 sGridNo; - INT8 bDirection; + UINT8 ubDirection; INT16 sHeightAdjustment; INT16 sDesiredHeight; INT16 sTempNewGridNo; // New grid no for advanced animations @@ -1158,7 +1158,7 @@ void EVENT_GetNewSoldierPath( SOLDIERTYPE *pSoldier, UINT16 sDestGridNo, UINT16 BOOLEAN EVENT_InternalGetNewSoldierPath( SOLDIERTYPE *pSoldier, UINT16 sDestGridNo, UINT16 usMovementAnim, BOOLEAN fFromUI, BOOLEAN fForceRestart ); void EVENT_SetSoldierDirection( SOLDIERTYPE *pSoldier, UINT16 usNewDirection ); -void EVENT_SetSoldierDesiredDirection( SOLDIERTYPE *pSoldier, UINT16 usNewDirection ); +void EVENT_SetSoldierDesiredDirection( SOLDIERTYPE *pSoldier, UINT8 ubNewDirection ); void EVENT_FireSoldierWeapon( SOLDIERTYPE *pSoldier, INT16 sTargetGridNo ); void EVENT_SoldierGotHit( SOLDIERTYPE *pSoldier, UINT16 usWeaponIndex, INT16 ubDamage, INT16 sBreathLoss, UINT16 bDirection , UINT16 sRange, UINT8 ubAttackerID, UINT8 ubSpecial, UINT8 ubHitLocation, INT16 sSubsequent, INT16 sLocationGridNo ); void EVENT_SoldierBeginBladeAttack( SOLDIERTYPE *pSoldier, INT16 sGridNo, UINT8 ubDirection ); @@ -1204,8 +1204,8 @@ BOOLEAN DeletePaletteData( ); // UTILITY FUNCTUIONS void MoveMerc( SOLDIERTYPE *pSoldier, FLOAT dMovementChange, FLOAT dAngle, BOOLEAN fCheckRange ); void MoveMercFacingDirection( SOLDIERTYPE *pSoldier, BOOLEAN fReverse, FLOAT dMovementDist ); -INT16 GetDirectionFromXY( INT16 sXPos, INT16 sYPos, SOLDIERTYPE *pSoldier ); -INT16 GetDirectionFromGridNo( INT16 sGridNo, SOLDIERTYPE *pSoldier ); +UINT8 GetDirectionFromXY( INT16 sXPos, INT16 sYPos, SOLDIERTYPE *pSoldier ); +UINT8 GetDirectionFromGridNo( INT16 sGridNo, SOLDIERTYPE *pSoldier ); UINT8 atan8( INT16 sXPos, INT16 sYPos, INT16 sXPos2, INT16 sYPos2 ); UINT8 atan8FromAngle( DOUBLE dAngle ); INT8 CalcActionPoints(SOLDIERTYPE *pSold ); @@ -1214,6 +1214,9 @@ INT16 GetDirectionToGridNoFromGridNo( INT16 sGridNoDest, INT16 sGridNoSrc ); // This function is now obsolete. Call ReduceAttackBusyCount instead. // void ReleaseSoldiersAttacker( SOLDIERTYPE *pSoldier ); BOOLEAN MercInWater( SOLDIERTYPE *pSoldier ); +BOOLEAN MercInShallowWater( SOLDIERTYPE *pSoldier ); +BOOLEAN MercInDeepWater( SOLDIERTYPE *pSoldier ); +BOOLEAN MercInHighWater( SOLDIERTYPE *pSoldier ); UINT16 GetNewSoldierStateFromNewStance( SOLDIERTYPE *pSoldier, UINT8 ubDesiredStance ); UINT16 GetMoveStateBasedOnStance( SOLDIERTYPE *pSoldier, UINT8 ubStanceHeight ); void SoldierGotoStationaryStance( SOLDIERTYPE *pSoldier ); @@ -1270,10 +1273,10 @@ void PositionSoldierLight( SOLDIERTYPE *pSoldier ); void SetCheckSoldierLightFlag( SOLDIERTYPE *pSoldier ); -void EVENT_InternalSetSoldierDestination( SOLDIERTYPE *pSoldier, UINT16 usNewDirection, BOOLEAN fFromMove, UINT16 usAnimState ); +void EVENT_InternalSetSoldierDestination( SOLDIERTYPE *pSoldier, UINT8 ubNewDirection, BOOLEAN fFromMove, UINT16 usAnimState ); -void ChangeToFlybackAnimation( SOLDIERTYPE *pSoldier, INT8 bDirection ); -void ChangeToFallbackAnimation( SOLDIERTYPE *pSoldier, INT8 bDirection ); +void ChangeToFlybackAnimation( SOLDIERTYPE *pSoldier, UINT8 ubDirection ); +void ChangeToFallbackAnimation( SOLDIERTYPE *pSoldier, UINT8 ubDirection ); //reset soldier timers void ResetSoldierChangeStatTimer( SOLDIERTYPE *pSoldier ); diff --git a/Tactical/Soldier Create.cpp b/Tactical/Soldier Create.cpp index cea5f4d4..ba1de8bf 100644 --- a/Tactical/Soldier Create.cpp +++ b/Tactical/Soldier Create.cpp @@ -414,10 +414,10 @@ SOLDIERTYPE* TacticalCreateSoldier( SOLDIERCREATE_STRUCT *pCreateStruct, UINT8 * Soldier.sSectorX = pCreateStruct->sSectorX; Soldier.sSectorY = pCreateStruct->sSectorY; Soldier.bSectorZ = pCreateStruct->bSectorZ; - Soldier.ubInsertionDirection = pCreateStruct->bDirection; - Soldier.bDesiredDirection = pCreateStruct->bDirection; - Soldier.bDominantDir = pCreateStruct->bDirection; - Soldier.bDirection = pCreateStruct->bDirection; + Soldier.ubInsertionDirection = pCreateStruct->ubDirection; + Soldier.bDesiredDirection = pCreateStruct->ubDirection; + Soldier.bDominantDir = pCreateStruct->ubDirection; + Soldier.ubDirection = pCreateStruct->ubDirection; Soldier.sInsertionGridNo = pCreateStruct->sInsertionGridNo; Soldier.bOldLife = Soldier.bLifeMax; @@ -812,7 +812,7 @@ BOOLEAN TacticalCopySoldierFromProfile( SOLDIERTYPE *pSoldier, SOLDIERCREATE_STR pSoldier->bOrders = pCreateStruct->bOrders; pSoldier->bAttitude = pCreateStruct->bAttitude; - pSoldier->bDirection = pCreateStruct->bDirection; + pSoldier->ubDirection = pCreateStruct->ubDirection; pSoldier->bPatrolCnt = pCreateStruct->bPatrolCnt; memcpy( pSoldier->usPatrolGrid, pCreateStruct->sPatrolGrid, sizeof( INT16 ) * MAXPATROLGRIDS ); @@ -1642,7 +1642,7 @@ void CreateDetailedPlacementGivenBasicPlacementInfo( SOLDIERCREATE_STRUCT *pp, B //Pass over mandatory information specified from the basic placement pp->bOrders = bp->bOrders; pp->bAttitude = bp->bAttitude; - pp->bDirection = bp->bDirection; + pp->ubDirection = bp->ubDirection; DebugMsg(TOPIC_JA2,DBG_LEVEL_3,String("CreateDetailedPlacementGivenBasicPlacementInfo: determine soldier's class")); @@ -1861,7 +1861,7 @@ void CreateStaticDetailedPlacementGivenBasicPlacementInfo( SOLDIERCREATE_STRUCT //Pass over mandatory information specified from the basic placement spp->bOrders = bp->bOrders; spp->bAttitude = bp->bAttitude; - spp->bDirection = bp->bDirection; + spp->ubDirection = bp->ubDirection; //Only creatures have mandatory body types specified. if( spp->bTeam == CREATURE_TEAM ) @@ -1929,7 +1929,7 @@ void CreateDetailedPlacementGivenStaticDetailedPlacementAndBasicPlacementInfo( // Copy over team pp->bTeam = bp->bTeam; - pp->bDirection = bp->bDirection; + pp->ubDirection = bp->ubDirection; pp->sInsertionGridNo = bp->usStartingGridNo; //ATE: Copy over sector coordinates from profile to create struct @@ -1941,7 +1941,7 @@ void CreateDetailedPlacementGivenStaticDetailedPlacementAndBasicPlacementInfo( pp->bOrders = bp->bOrders; pp->bAttitude = bp->bAttitude; - pp->bDirection = bp->bDirection; + pp->ubDirection = bp->ubDirection; pp->bPatrolCnt = bp->bPatrolCnt; memcpy( pp->sPatrolGrid, bp->sPatrolGrid, sizeof( INT16 ) * MAXPATROLGRIDS ); pp->fHasKeys = bp->fHasKeys; @@ -2383,7 +2383,8 @@ SOLDIERTYPE* TacticalCreateMilitia( UINT8 ubMilitiaClass ) UINT8 ubID; SOLDIERTYPE * pSoldier; - if (gpBattleGroup->ubSectorZ == gbWorldSectorZ && + if (gpBattleGroup && + gpBattleGroup->ubSectorZ == gbWorldSectorZ && gpBattleGroup->ubSectorX == gWorldSectorX && gpBattleGroup->ubSectorY == gWorldSectorY && guiCurrentScreen == AUTORESOLVE_SCREEN && !gfPersistantPBI ) diff --git a/Tactical/Soldier Create.h b/Tactical/Soldier Create.h index 4161c1d9..260938a1 100644 --- a/Tactical/Soldier Create.h +++ b/Tactical/Soldier Create.h @@ -43,7 +43,7 @@ typedef struct INT8 bTeam; //The team this individual is part of. INT8 bRelativeAttributeLevel; INT8 bRelativeEquipmentLevel; - INT8 bDirection; //1 of 8 values (always mandatory) + UINT8 ubDirection; //1 of 8 values (always mandatory) INT8 bOrders; INT8 bAttitude; INT8 bBodyType; //up to 128 body types, -1 means random @@ -101,7 +101,7 @@ public: //Location information INT16 sSectorX; INT16 sSectorY; - INT8 bDirection; + UINT8 ubDirection; INT16 sInsertionGridNo; // Can force a team, but needs flag set diff --git a/Tactical/Soldier Init List.cpp b/Tactical/Soldier Init List.cpp index f3ae808c..6a8645e2 100644 --- a/Tactical/Soldier Init List.cpp +++ b/Tactical/Soldier Init List.cpp @@ -2368,7 +2368,9 @@ void StripEnemyDetailedPlacementsIfSectorWasPlayerLiberated() { if( curr->pBasicPlacement->bTeam == ENEMY_TEAM ) { - MemFree( curr->pDetailedPlacement ); + // pDetailedPlacement has been C++'d + //MemFree( curr->pDetailedPlacement ); + delete curr->pDetailedPlacement; curr->pDetailedPlacement = NULL; curr->pBasicPlacement->fDetailedPlacement = FALSE; curr->pBasicPlacement->fPriorityExistance = FALSE; diff --git a/Tactical/Soldier Profile.cpp b/Tactical/Soldier Profile.cpp index 5b776770..fdb15adf 100644 --- a/Tactical/Soldier Profile.cpp +++ b/Tactical/Soldier Profile.cpp @@ -915,7 +915,7 @@ SOLDIERTYPE *ChangeSoldierTeam( SOLDIERTYPE *pSoldier, UINT8 ubTeam ) MercCreateStruct.sSectorY = pSoldier->sSectorY; MercCreateStruct.bSectorZ = pSoldier->bSectorZ; MercCreateStruct.sInsertionGridNo = pSoldier->sGridNo; - MercCreateStruct.bDirection = pSoldier->bDirection; + MercCreateStruct.ubDirection = pSoldier->ubDirection; if ( pSoldier->uiStatusFlags & SOLDIER_VEHICLE ) { diff --git a/Tactical/Soldier Tile.cpp b/Tactical/Soldier Tile.cpp index 2979f69c..6fbf6577 100644 --- a/Tactical/Soldier Tile.cpp +++ b/Tactical/Soldier Tile.cpp @@ -166,7 +166,7 @@ void SetFinalTile( SOLDIERTYPE *pSoldier, INT16 sGridNo, BOOLEAN fGivenUp ) ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, TacticalStr[ NO_PATH_FOR_MERC ], pSoldier->name ); } - EVENT_StopMerc( pSoldier, pSoldier->sGridNo, pSoldier->bDirection ); + EVENT_StopMerc( pSoldier, pSoldier->sGridNo, pSoldier->ubDirection ); } @@ -427,7 +427,7 @@ BOOLEAN HandleNextTile( SOLDIERTYPE *pSoldier, INT8 bDirection, INT16 sGridNo, I OutputDebugInfoForTurnBasedNextTileWaiting( pSoldier ); } #endif - EVENT_StopMerc( pSoldier, pSoldier->sGridNo, pSoldier->bDirection ); + EVENT_StopMerc( pSoldier, pSoldier->sGridNo, pSoldier->ubDirection ); // Restore... pSoldier->sFinalDestination = sOldFinalDest; @@ -449,7 +449,7 @@ BOOLEAN HandleNextTile( SOLDIERTYPE *pSoldier, INT8 bDirection, INT16 sGridNo, I OutputDebugInfoForTurnBasedNextTileWaiting( pSoldier ); } #endif - EVENT_StopMerc( pSoldier, pSoldier->sGridNo, pSoldier->bDirection ); + EVENT_StopMerc( pSoldier, pSoldier->sGridNo, pSoldier->ubDirection ); // Restore... pSoldier->sFinalDestination = sOldFinalDest; @@ -471,7 +471,7 @@ BOOLEAN HandleNextTile( SOLDIERTYPE *pSoldier, INT8 bDirection, INT16 sGridNo, I bOverTerrainType = GetTerrainType( sGridNo ); // Check if we are going into water! - if ( bOverTerrainType == LOW_WATER || bOverTerrainType == MED_WATER || bOverTerrainType == DEEP_WATER ) + if ( TERRAIN_IS_WATER( bOverTerrainType) ) { // Check if we are of prone or crawl height and change stance accordingly.... switch( gAnimControl[ pSoldier->usAnimState ].ubHeight ) diff --git a/Tactical/Spread Burst.cpp b/Tactical/Spread Burst.cpp index 706129c2..a3193c7a 100644 --- a/Tactical/Spread Burst.cpp +++ b/Tactical/Spread Burst.cpp @@ -122,7 +122,7 @@ void AccumulateBurstLocation( INT16 sGridNo ) void PickBurstLocations( SOLDIERTYPE *pSoldier ) { UINT8 ubShotsPerBurst = 0; - FLOAT dAccululator = 0; + FLOAT dAccumulator = 0; FLOAT dStep = 0; INT32 cnt; UINT8 ubLocationNum; @@ -147,7 +147,7 @@ void PickBurstLocations( SOLDIERTYPE *pSoldier ) while(EnoughPoints( pSoldier, sAPCosts, 0, FALSE ) && pSoldier->inv[ pSoldier->ubAttackingHand ].ItemData.Gun.ubGunShotsLeft >= pSoldier->bDoAutofire && gbNumBurstLocations >= pSoldier->bDoAutofire); pSoldier->bDoAutofire--; - ubShotsPerBurst = __min(pSoldier->bDoAutofire,MAX_BURST_SPREAD_TARGETS); + ubShotsPerBurst = pSoldier->bDoAutofire; } else if ( gbNumBurstLocations > 0 ) ubShotsPerBurst = pSoldier->bDoAutofire / gbNumBurstLocations; @@ -156,11 +156,13 @@ void PickBurstLocations( SOLDIERTYPE *pSoldier ) else { if ( pSoldier->bWeaponMode == WM_ATTACHED_GL_BURST ) - ubShotsPerBurst = __min(Weapon[GetAttachedGrenadeLauncher(&pSoldier->inv[HANDPOS])].ubShotsPerBurst,MAX_BURST_SPREAD_TARGETS); + ubShotsPerBurst = Weapon[GetAttachedGrenadeLauncher(&pSoldier->inv[HANDPOS])].ubShotsPerBurst; else - ubShotsPerBurst = __min(GetShotsPerBurst(&pSoldier->inv[ HANDPOS ]),MAX_BURST_SPREAD_TARGETS); + ubShotsPerBurst = GetShotsPerBurst(&pSoldier->inv[ HANDPOS ]); } + ubShotsPerBurst = __min( ubShotsPerBurst, MAX_BURST_SPREAD_TARGETS); + // Use # gridnos accululated and # burst shots to determine accululator dStep = gbNumBurstLocations / (FLOAT)ubShotsPerBurst; @@ -168,13 +170,18 @@ void PickBurstLocations( SOLDIERTYPE *pSoldier ) for ( cnt = 0; cnt < ubShotsPerBurst; cnt++ ) { // Get index into list - ubLocationNum = (UINT8)( dAccululator ); + ubLocationNum = (UINT8)( dAccumulator ); // Add to merc location pSoldier->sSpreadLocations[ cnt ] = gsBurstLocations[ ubLocationNum ].sGridNo; DebugMsg(TOPIC_JA2,DBG_LEVEL_3,String("PickBurstLocations: loc#%d = %d", cnt, pSoldier->sSpreadLocations[ cnt ])); // Acculuate index value - dAccululator += dStep; + dAccumulator += dStep; + } + + for (; cnt < MAX_BURST_SPREAD_TARGETS; cnt++) + { + pSoldier->sSpreadLocations[ cnt ] = 0; } // OK, they have been added @@ -219,6 +226,10 @@ void AIPickBurstLocations( SOLDIERTYPE *pSoldier, INT8 bTargets, SOLDIERTYPE *pT dAccululator += dStep; } + for (; cnt < MAX_BURST_SPREAD_TARGETS; cnt++) + { + pSoldier->sSpreadLocations[ cnt ] = 0; + } // OK, they have been added } diff --git a/Tactical/Tactical Save.cpp b/Tactical/Tactical Save.cpp index 05d5efb2..65668016 100644 --- a/Tactical/Tactical Save.cpp +++ b/Tactical/Tactical Save.cpp @@ -2779,7 +2779,7 @@ BOOLEAN AddDeadSoldierToUnLoadedSector( INT16 sMapX, INT16 sMapY, UINT8 bMapZ, S SET_PALETTEREP_ID ( Corpse.SkinPal, pSoldier->SkinPal ); SET_PALETTEREP_ID ( Corpse.PantsPal, pSoldier->PantsPal ); - Corpse.bDirection = pSoldier->bDirection; + Corpse.ubDirection = pSoldier->ubDirection; // Set time of death Corpse.uiTimeOfDeath = GetWorldTotalMin( ); diff --git a/Tactical/Turn Based Input.cpp b/Tactical/Turn Based Input.cpp index 9beb290b..07ec3a50 100644 --- a/Tactical/Turn Based Input.cpp +++ b/Tactical/Turn Based Input.cpp @@ -2358,7 +2358,7 @@ void GetKeyboardInput( UINT32 *puiNewEvent ) BeginSoldierClimbUpRoof( pjSoldier ); } - if ( FindFenceJumpDirection( pjSoldier, pjSoldier->sGridNo, pjSoldier->bDirection, &bDirection ) ) + if ( FindFenceJumpDirection( pjSoldier, pjSoldier->sGridNo, pjSoldier->ubDirection, &bDirection ) ) { BeginSoldierClimbFence( pjSoldier ); } @@ -4392,7 +4392,7 @@ void TeleportSelectedSoldier() { SetSoldierHeight( pSoldier, 0 ); TeleportSoldier( pSoldier, usMapPos, FALSE ); - EVENT_StopMerc( pSoldier, pSoldier->sGridNo, pSoldier->bDirection ); + EVENT_StopMerc( pSoldier, pSoldier->sGridNo, pSoldier->ubDirection ); } else { @@ -4402,7 +4402,7 @@ void TeleportSelectedSoldier() SetSoldierHeight( pSoldier, 50.0 ); TeleportSoldier( pSoldier, usMapPos, TRUE ); - EVENT_StopMerc( pSoldier, pSoldier->sGridNo, pSoldier->bDirection ); + EVENT_StopMerc( pSoldier, pSoldier->sGridNo, pSoldier->ubDirection ); } } } @@ -4519,7 +4519,7 @@ void ObliterateSector() // CreateAnimationTile( &AniParams ); //PlayJA2Sample( EXPLOSION_1, RATE_11025, MIDVOLUME, 1, MIDDLEPAN ); - EVENT_SoldierGotHit( pTSoldier, 0, 400, 0, pTSoldier->bDirection, 320, NOBODY , FIRE_WEAPON_NO_SPECIAL, pTSoldier->bAimShotLocation, 0, NOWHERE ); + EVENT_SoldierGotHit( pTSoldier, 0, 400, 0, pTSoldier->ubDirection, 320, NOBODY , FIRE_WEAPON_NO_SPECIAL, pTSoldier->bAimShotLocation, 0, NOWHERE ); } } } @@ -4544,7 +4544,7 @@ void JumpFence() INT8 bDirection; if ( GetSoldier( &pSoldier, gusSelectedSoldier ) ) { - if ( FindFenceJumpDirection( pSoldier, pSoldier->sGridNo, pSoldier->bDirection, &bDirection ) ) + if ( FindFenceJumpDirection( pSoldier, pSoldier->sGridNo, pSoldier->ubDirection, &bDirection ) ) { BeginSoldierClimbFence( pSoldier ); } @@ -4568,7 +4568,7 @@ void CreateNextCivType() MercCreateStruct.sSectorY = gWorldSectorY; MercCreateStruct.bSectorZ = gbWorldSectorZ; MercCreateStruct.bBodyType = bBodyType; - MercCreateStruct.bDirection = SOUTH; + MercCreateStruct.ubDirection = SOUTH; bBodyType++; diff --git a/Tactical/UI Cursors.cpp b/Tactical/UI Cursors.cpp index 86007da7..8743c30a 100644 --- a/Tactical/UI Cursors.cpp +++ b/Tactical/UI Cursors.cpp @@ -2347,7 +2347,7 @@ UINT8 GetActionModeCursor( SOLDIERTYPE *pSoldier ) } // Now check our terrain to see if we cannot do the action now... - if ( pSoldier->bOverTerrainType == DEEP_WATER ) + if ( WaterTooDeepForAttacks( pSoldier->sGridNo) ) { ubCursor = INVALIDCURS; } diff --git a/Tactical/Vehicles.cpp b/Tactical/Vehicles.cpp index 4e94f685..50a16a4c 100644 --- a/Tactical/Vehicles.cpp +++ b/Tactical/Vehicles.cpp @@ -576,7 +576,7 @@ BOOLEAN AddSoldierToVehicle( SOLDIERTYPE *pSoldier, INT32 iId ) EVENT_SetSoldierPosition( pSoldier, pVehicleSoldier->dXPos, pVehicleSoldier->dYPos ); // Stop from any movement..... - EVENT_StopMerc( pSoldier, pSoldier->sGridNo, pSoldier->bDirection ); + EVENT_StopMerc( pSoldier, pSoldier->sGridNo, pSoldier->ubDirection ); // can't call SetCurrentSquad OR SelectSoldier in mapscreen, that will initialize interface panels!!! if ( guiCurrentScreen == GAME_SCREEN ) diff --git a/Tactical/Weapons.cpp b/Tactical/Weapons.cpp index 311c184a..d5b28027 100644 --- a/Tactical/Weapons.cpp +++ b/Tactical/Weapons.cpp @@ -1314,28 +1314,36 @@ BOOLEAN FireWeapon( SOLDIERTYPE *pSoldier , INT16 sTargetGridNo ) else { // ATE: PAtch up - bookkeeping for spreading done out of whak - if ( pSoldier->fDoSpread && !pSoldier->bDoBurst ) + if ( pSoldier->fDoSpread) { - pSoldier->fDoSpread = FALSE; - } - - if ( pSoldier->fDoSpread >= MAX_BURST_SPREAD_TARGETS ) - { - //If we have more than MAX_BURST_SPREAD_TARGETS bullets, loop over and start again from the first target location - pSoldier->fDoSpread = 1; + if (pSoldier->bDoBurst ) + { + pSoldier->fDoSpread = FALSE; + } + // 0verhaul: The original code seemed brain damaged: If the current spread target was 0 it would shoot at the + // non-spread target grid # instead. Also fDoSpread is used as a counter from 1 to MAX_BURST_SPREAD_TARGETS, + // but was actually reset before it got there. So the final spread target would never be shot at. Hopefully this + // will work better. + else if (pSoldier->fDoSpread > MAX_BURST_SPREAD_TARGETS || + pSoldier->sSpreadLocations[ pSoldier->fDoSpread - 1 ] == 0) + { + if (pSoldier->fDoSpread == 1) + { + // If no spread locations are defined, don't spread + pSoldier->fDoSpread = 0; + } + else + { + // If we hit the end of the array, either by finding a 0 or by exceeding its size, reset + pSoldier->fDoSpread = 1; + } + } } if ( pSoldier->fDoSpread ) { - if ( pSoldier->sSpreadLocations[ pSoldier->fDoSpread - 1 ] != 0 ) - { - UseGun( pSoldier, pSoldier->sSpreadLocations[ pSoldier->fDoSpread - 1 ] ); - } - else - { - UseGun( pSoldier, sTargetGridNo ); - } + UseGun( pSoldier, pSoldier->sSpreadLocations[ pSoldier->fDoSpread - 1 ] ); pSoldier->fDoSpread++; } else @@ -1357,28 +1365,36 @@ BOOLEAN FireWeapon( SOLDIERTYPE *pSoldier , INT16 sTargetGridNo ) UseGun( pSoldier, sTargetGridNo ); else // ATE: PAtch up - bookkeeping for spreading done out of whak - if ( pSoldier->fDoSpread && !pSoldier->bDoBurst ) + if ( pSoldier->fDoSpread) { - pSoldier->fDoSpread = FALSE; - } + if (!pSoldier->bDoBurst ) + { + pSoldier->fDoSpread = FALSE; + } - if ( pSoldier->fDoSpread >= MAX_BURST_SPREAD_TARGETS ) - { - //If we have more than MAX_BURST_SPREAD_TARGETS bullets, loop over and start again from the first target location - pSoldier->fDoSpread = 1; + // 0verhaul: The original code seemed brain damaged: If the current spread target was 0 it would shoot at the + // non-spread target grid # instead. Also fDoSpread is used as a counter from 1 to MAX_BURST_SPREAD_TARGETS, + // but was actually reset before it got there. So the final spread target would never be shot at. Hopefully this + // will work better. + else if ( pSoldier->fDoSpread > MAX_BURST_SPREAD_TARGETS || + pSoldier->sSpreadLocations[ pSoldier->fDoSpread - 1 ] == 0) + { + if (pSoldier->fDoSpread == 1) + { + // If no spread locations are defined, don't spread + pSoldier->fDoSpread = 0; + } + else + { + // If we hit the end of the array, either by finding a 0 or by exceeding its size, reset + pSoldier->fDoSpread = 1; + } + } } - if ( pSoldier->fDoSpread ) { - if ( pSoldier->sSpreadLocations[ pSoldier->fDoSpread - 1 ] != 0 ) - { - UseLauncher( pSoldier, pSoldier->sSpreadLocations[ pSoldier->fDoSpread - 1 ] ); - } - else - { - UseLauncher( pSoldier, sTargetGridNo ); - } + UseLauncher( pSoldier, pSoldier->sSpreadLocations[ pSoldier->fDoSpread - 1 ] ); pSoldier->fDoSpread++; } else @@ -1917,7 +1933,7 @@ BOOLEAN UseGun( SOLDIERTYPE *pSoldier , INT16 sTargetGridNo ) } // Direction to center of explosion - ubDirection = gOppositeDirection[ pSoldier->bDirection ]; + ubDirection = gOppositeDirection[ pSoldier->ubDirection ]; sNewGridNo = NewGridNo( (UINT16)pSoldier->sGridNo, (UINT16)(1 * DirectionInc( ubDirection ) ) ); // Check if a person exists here and is not prone.... @@ -1932,7 +1948,7 @@ BOOLEAN UseGun( SOLDIERTYPE *pSoldier , INT16 sTargetGridNo ) DebugMsg( TOPIC_JA2, DBG_LEVEL_3, String("Incrementing Attack: Exaust from LAW", gTacticalStatus.ubAttackBusyCount ) ); DebugAttackBusy( "Incrementing Attack: Exaust from LAW\n" ); - EVENT_SoldierGotHit( MercPtrs[ ubMerc ], MINI_GRENADE, 10, 200, pSoldier->bDirection, 0, pSoldier->ubID, 0, ANIM_CROUCH, 0, sNewGridNo ); + EVENT_SoldierGotHit( MercPtrs[ ubMerc ], MINI_GRENADE, 10, 200, pSoldier->ubDirection, 0, pSoldier->ubID, 0, ANIM_CROUCH, 0, sNewGridNo ); } } } @@ -2602,7 +2618,7 @@ BOOLEAN UseThrown( SOLDIERTYPE *pSoldier, INT16 sTargetGridNo ) //AXP 25.03.2007: Cleaned up throwing AP costs. Now only turning + stance change AP // costs are deducted. Final throw cost is deducted on creating the grenade object - if ( (UINT8)GetDirectionFromGridNo( sTargetGridNo, pSoldier ) != pSoldier->bDirection ) + if ( (UINT8)GetDirectionFromGridNo( sTargetGridNo, pSoldier ) != pSoldier->ubDirection ) sAPCost += (INT16)GetAPsToLook( pSoldier ); sAPCost += (INT16)GetAPsToChangeStance( pSoldier, ANIM_STAND ); @@ -2897,29 +2913,30 @@ BOOLEAN DoSpecialEffectAmmoMiss( UINT8 ubAttackerID, INT16 sGridNo, INT16 sXPos, // gTacticalStatus.ubAttackBusyCount++; // DebugMsg( TOPIC_JA2, DBG_LEVEL_3, String("Incrementing Attack: Explosion gone off, COunt now %d", gTacticalStatus.ubAttackBusyCount ) ); - PlayJA2Sample( CREATURE_GAS_NOISE, RATE_11025, SoundVolume( HIGHVOLUME, sGridNo ), 1, SoundDir( sGridNo ) ); + PlayJA2Sample( CREATURE_GAS_NOISE, RATE_11025, SoundVolume( HIGHVOLUME, sGridNo ), 1, SoundDir( sGridNo ) ); + // 0verhaul: Not ready to simplify this to a single call yet. What we need in order to + // fix this correctly is to detach 'alien spit' as a special caliber and instead add 3 new calibers for actual "ammo": + // very small spit, small spit, and large spit. Then we need to add a special effect miss index to point to the + // appropriate smoke effect to disperse. + //NewSmokeEffect( sGridNo, usItem, 0, ubAttackerID); -// WDS fix 07/25/2007 -// Don't have monsters cause explosions - // NewSmokeEffect( sGridNo, usItem, 0, ubAttackerID ); + // Do Spread effect....... + switch( usItem ) + { + case CREATURE_YOUNG_MALE_SPIT: + case CREATURE_INFANT_SPIT: - // // Do Spread effect....... - // switch( usItem ) - // { - // case CREATURE_YOUNG_MALE_SPIT: - //case CREATURE_INFANT_SPIT: + NewSmokeEffect( sGridNo, VERY_SMALL_CREATURE_GAS, 0, ubAttackerID ); + break; + case CREATURE_OLD_MALE_SPIT: + NewSmokeEffect( sGridNo, SMALL_CREATURE_GAS, 0, ubAttackerID ); + break; - // NewSmokeEffect( sGridNo, VERY_SMALL_CREATURE_GAS, 0, ubAttackerID ); - // break; - // case CREATURE_OLD_MALE_SPIT: - // NewSmokeEffect( sGridNo, SMALL_CREATURE_GAS, 0, ubAttackerID ); - // break; - - // case CREATURE_QUEEN_SPIT: - // NewSmokeEffect( sGridNo, LARGE_CREATURE_GAS, 0, ubAttackerID ); - // break; - // } - } + case CREATURE_QUEEN_SPIT: + NewSmokeEffect( sGridNo, LARGE_CREATURE_GAS, 0, ubAttackerID ); + break; + } + } return( FALSE ); } @@ -2980,7 +2997,7 @@ void WeaponHit( UINT16 usSoldierID, UINT16 usWeaponIndex, INT16 sDamage, INT16 s DoSpecialEffectAmmoMiss( ubAttackerID, pTargetSoldier->sGridNo, sXPos, sYPos, sZPos, FALSE, FALSE, 0 ); // OK, SHOT HAS HIT, DO THINGS APPROPRIATELY - // ATE: This is 'cause of that darn smoke effect that could potnetially kill + // ATE: This is 'cause of that darn smoke effect that could potentially kill // the poor bastard .. so check if ( !pTargetSoldier->fDoingExternalDeath ) { @@ -2988,7 +3005,7 @@ void WeaponHit( UINT16 usSoldierID, UINT16 usWeaponIndex, INT16 sDamage, INT16 s } // else // { - // Buddy had died from additional dammage - free up attacker here... + // Buddy had died from additional damage - free up attacker here... // ReduceAttackBusyCount( pTargetSoldier->ubAttackerID, FALSE ); // DebugMsg( TOPIC_JA2, DBG_LEVEL_3, String("Special effect killed before bullet impact, attack count now %d", gTacticalStatus.ubAttackBusyCount) ); // OutputDebugString( "Special effect killed before bullet impact\n" ); @@ -3228,7 +3245,7 @@ void StructureHit( INT32 iBullet, UINT16 usWeaponIndex, INT8 bWeaponStatus, UINT usMissTileType = FIRSTMISS; // Check if we are in water... - if ( gpWorldLevelData[ sGridNo ].ubTerrainID == LOW_WATER || gpWorldLevelData[ sGridNo ].ubTerrainID == DEEP_WATER ) + if ( TERRAIN_IS_WATER( gpWorldLevelData[ sGridNo ].ubTerrainID) ) { usMissTileIndex = SECONDMISS1; usMissTileType = SECONDMISS; @@ -3688,7 +3705,7 @@ UINT32 CalcChanceToHitGun(SOLDIERTYPE *pSoldier, UINT16 sGridNo, UINT8 ubAimTime { iSightRange = SoldierTo3DLocationLineOfSightTest( pSoldier, sGridNo, pSoldier->bTargetLevel, pSoldier->bTargetCubeLevel, TRUE, NO_DISTANCE_LIMIT ); } - + //restore old flag gAnimControl[ pSoldier->usAnimState ].uiFlags = oldFlag; @@ -4498,7 +4515,7 @@ INT32 BulletImpact( SOLDIERTYPE *pFirer, SOLDIERTYPE * pTarget, UINT8 ubHitLocat break; case AIM_SHOT_LEGS: // is the damage enough to make us fall over? - if ( pubSpecial && IS_MERC_BODY_TYPE( pTarget ) && gAnimControl[ pTarget->usAnimState ].ubEndHeight == ANIM_STAND && pTarget->bOverTerrainType != LOW_WATER && pTarget->bOverTerrainType != MED_WATER && pTarget->bOverTerrainType != DEEP_WATER ) + if ( pubSpecial && IS_MERC_BODY_TYPE( pTarget ) && gAnimControl[ pTarget->usAnimState ].ubEndHeight == ANIM_STAND && !MercInWater( pTarget) ) { if (iImpactForCrits > MIN_DAMAGE_FOR_AUTO_FALL_OVER ) { @@ -5355,6 +5372,14 @@ INT32 CalcMaxTossRange( SOLDIERTYPE * pSoldier, UINT16 usItem, BOOLEAN fArmed ) // better max range due to expertise iRange = iRange * (100 + gbSkillTraitBonus[THROWING] * NUM_SKILL_TRAITS( pSoldier, THROWING ) ) / 100; } + + // Adjust for thrower's stance + if (gAnimControl[ pSoldier->usAnimState ].ubEndHeight < ANIM_STAND) + { + // For now we just assume the thrower is crouched since we don't allow prone tossing at the moment + // So dock 30% from the distance + iRange = (iRange * 70) / 100; + } } if (iRange < 1) @@ -5768,12 +5793,13 @@ BOOLEAN WeaponReady(SOLDIERTYPE * pSoldier) if ( AM_A_ROBOT( pSoldier) ) return TRUE; #endif - if ( gAnimControl[ pSoldier->usAnimState ].uiFlags & ANIM_FIREREADY ) + if ( (gAnimControl[ pSoldier->usAnimState ].uiFlags & ANIM_FIREREADY ) || + (gAnimControl[ pSoldier->usAnimState ].uiFlags & ANIM_FIRE ) ) return TRUE; else return FALSE; - } + INT8 GetAPsToReload( OBJECTTYPE *pObj ) { // DebugMsg(TOPIC_JA2,DBG_LEVEL_3,String("GetAPsToReload")); diff --git a/Tactical/Weapons.h b/Tactical/Weapons.h index 9874b7ea..4f97e44e 100644 --- a/Tactical/Weapons.h +++ b/Tactical/Weapons.h @@ -162,7 +162,7 @@ typedef struct BOOLEAN antiTank; BOOLEAN dart; BOOLEAN knife; - BOOLEAN monsterSpit; + UINT16 monsterSpit; BOOLEAN ignoreArmour; BOOLEAN acidic; INT16 lockBustingPower; diff --git a/Tactical/fov.cpp b/Tactical/fov.cpp index 8b36ce18..531bdd3c 100644 --- a/Tactical/fov.cpp +++ b/Tactical/fov.cpp @@ -351,7 +351,7 @@ void RevealRoofsAndItems(SOLDIERTYPE *pSoldier, UINT32 itemsToo, BOOLEAN fShowLo who = pSoldier->ubID; - dir = pSoldier->bDirection; + dir = pSoldier->ubDirection; //NumMessage("good old reveal",dir); @@ -374,7 +374,7 @@ void RevealRoofsAndItems(SOLDIERTYPE *pSoldier, UINT32 itemsToo, BOOLEAN fShowLo // create gridno increment for NOVIEW - in other words, no increment! Inc[5] = 0; - Dir[5] = pSoldier->bDirection; + Dir[5] = pSoldier->ubDirection; if (dir % 2 == 1) /* even numbers use ViewPath2 */ Path2 = TRUE; diff --git a/Tactical/opplist.cpp b/Tactical/opplist.cpp index 88b6c565..00db003a 100644 --- a/Tactical/opplist.cpp +++ b/Tactical/opplist.cpp @@ -1151,7 +1151,7 @@ INT16 DistanceVisible( SOLDIERTYPE *pSoldier, INT8 bFacingDir, INT8 bSubjectDir, bSubjectDir = (INT8) GetDirectionToGridNoFromGridNo( pSoldier->sGridNo, sSubjectGridNo ); } if (bFacingDir == DIRECTION_IRRELEVANT) { - bFacingDir = pSoldier->bDirection; + bFacingDir = pSoldier->ubDirection; } sDistVisible = gbLookDistance[bFacingDir][bSubjectDir]; @@ -1205,8 +1205,8 @@ INT16 DistanceVisible( SOLDIERTYPE *pSoldier, INT8 bFacingDir, INT8 bSubjectDir, // valid map references then use the ambient light level instead. if(0 > sSubjectGridNo || sSubjectGridNo > WORLD_MAX) { - DebugMsg(TOPIC_JA2, DBG_LEVEL_3, String("113/UC Warning! Tried to detect the light level when character %ls[%d] looks at a location outside of the valid map (gridno %d). Assigning default %d", - pSoldier->name, pSoldier->ubID, pSoldier->sGridNo, ubAmbientLightLevel)); + DebugMsg(TOPIC_JA2, DBG_LEVEL_3, String("113/UC Warning! Tried to detect the light level when character %ls[%d] looks at a location outside of the valid map (gridno %d). Assigning default %d", + pSoldier->name, pSoldier->ubID, pSoldier->sGridNo, ubAmbientLightLevel)); bLightLevel = ubAmbientLightLevel; } @@ -1232,7 +1232,7 @@ INT16 DistanceVisible( SOLDIERTYPE *pSoldier, INT8 bFacingDir, INT8 bSubjectDir, sDistVisible += sDistVisible * GetTotalVisionRangeBonus(pSoldier, bLightLevel) / 100; } - + // give one step better vision for people with nightops if (HAS_SKILL_TRAIT( pSoldier, NIGHTOPS )) { @@ -1254,7 +1254,7 @@ INT16 DistanceVisible( SOLDIERTYPE *pSoldier, INT8 bFacingDir, INT8 bSubjectDir, if ( TANK(pSoldier) && sDistVisible > 0 && pSubject) { sDistVisible = __max( sDistVisible + 5, pSubject->GetMaxDistanceVisible(pSoldier->sGridNo, pSoldier->bLevel) ); - } + } else { sDistVisible = __max( sDistVisible + 5, pSoldier->GetMaxDistanceVisible() ); } @@ -2111,7 +2111,7 @@ void ManSeesMan(SOLDIERTYPE *pSoldier, SOLDIERTYPE *pOpponent, INT16 sOppGridno, { CancelAIAction( pSoldier, TRUE ); pSoldier->sAbsoluteFinalDestination = NOWHERE; - EVENT_StopMerc( pSoldier, pSoldier->sGridNo, pSoldier->bDirection ); + EVENT_StopMerc( pSoldier, pSoldier->sGridNo, pSoldier->ubDirection ); TriggerNPCRecord( ANGEL, 20 ); // trigger Angel to walk off afterwards //TriggerNPCRecord( ANGEL, 24 ); @@ -3852,7 +3852,7 @@ void DebugSoldierPage2( ) SetFontShade(LARGEFONT1, FONT_SHADE_GREEN); gprintf( 0, LINE_HEIGHT * ubLine, L"Direction:"); SetFontShade(LARGEFONT1, FONT_SHADE_NEUTRAL); - gprintf( 150, LINE_HEIGHT * ubLine, L"%S", gzDirectionStr[ pSoldier->bDirection] ); + gprintf( 150, LINE_HEIGHT * ubLine, L"%S", gzDirectionStr[ pSoldier->ubDirection] ); ubLine++; SetFontShade(LARGEFONT1, FONT_SHADE_GREEN); @@ -5688,14 +5688,14 @@ void HearNoise(SOLDIERTYPE *pSoldier, UINT8 ubNoiseMaker, UINT16 sGridNo, INT8 b sNoiseX = CenterX(sGridNo); sNoiseY = CenterY(sGridNo); bDirection = atan8(pSoldier->sX,pSoldier->sY,sNoiseX,sNoiseY); - if ( pSoldier->bDirection != bDirection && pSoldier->bDirection != gOneCDirection[ bDirection ] && pSoldier->bDirection != gOneCCDirection[ bDirection ] ) + if ( pSoldier->ubDirection != bDirection && pSoldier->ubDirection != gOneCDirection[ bDirection ] && pSoldier->ubDirection != gOneCCDirection[ bDirection ] ) { // temporarily turn off muzzle flash so DistanceVisible can be calculated without it MercPtrs[ ubNoiseMaker ]->fMuzzleFlash = FALSE; fMuzzleFlash = TRUE; } } - + int sDistVisible = pSoldier->GetMaxDistanceVisible(sGridNo, bLevel, CALC_FROM_WANTED_DIR ); if ( fMuzzleFlash ) @@ -5703,14 +5703,14 @@ void HearNoise(SOLDIERTYPE *pSoldier, UINT8 ubNoiseMaker, UINT16 sGridNo, INT8 b // turn flash on again MercPtrs[ ubNoiseMaker ]->fMuzzleFlash = TRUE; } - + if (PythSpacesAway(pSoldier->sGridNo,sGridNo) <= sDistVisible ) { // just use the XXadjustedXX center of the gridno sNoiseX = CenterX(sGridNo); sNoiseY = CenterY(sGridNo); - if (pSoldier->bDirection != atan8(pSoldier->sX,pSoldier->sY,sNoiseX,sNoiseY)) + if (pSoldier->ubDirection != atan8(pSoldier->sX,pSoldier->sY,sNoiseX,sNoiseY)) { bHadToTurn = TRUE; } @@ -6530,27 +6530,27 @@ void NoticeUnseenAttacker( SOLDIERTYPE * pAttacker, SOLDIERTYPE * pDefender, INT } bOldOppList = pDefender->bOppList[ pAttacker->ubID ]; - // check LOS, considering we are now aware of the attacker - // ignore muzzle flashes when must turning head - if ( pAttacker->fMuzzleFlash ) - { - bDirection = atan8( pDefender->sX,pDefender->sY, pAttacker->sX, pAttacker->sY ); - if ( pDefender->bDirection != bDirection && pDefender->bDirection != gOneCDirection[ bDirection ] && pDefender->bDirection != gOneCCDirection[ bDirection ] ) + // check LOS, considering we are now aware of the attacker + // ignore muzzle flashes when must turning head + if ( pAttacker->fMuzzleFlash ) { - // temporarily turn off muzzle flash so DistanceVisible can be calculated without it - pAttacker->fMuzzleFlash = FALSE; - fMuzzleFlash = TRUE; + bDirection = atan8( pDefender->sX,pDefender->sY, pAttacker->sX, pAttacker->sY ); + if ( pDefender->ubDirection != bDirection && pDefender->ubDirection != gOneCDirection[ bDirection ] && pDefender->ubDirection != gOneCCDirection[ bDirection ] ) + { + // temporarily turn off muzzle flash so DistanceVisible can be calculated without it + pAttacker->fMuzzleFlash = FALSE; + fMuzzleFlash = TRUE; + } } - } if (SoldierToSoldierLineOfSightTest( pDefender, pAttacker, TRUE, CALC_FROM_WANTED_DIR ) != 0) - { - fSeesAttacker = TRUE; - } - if ( fMuzzleFlash ) - { - pAttacker->fMuzzleFlash = TRUE; - } + { + fSeesAttacker = TRUE; + } + if ( fMuzzleFlash ) + { + pAttacker->fMuzzleFlash = TRUE; + } if (fSeesAttacker) { @@ -7011,4 +7011,4 @@ BOOLEAN SoldierHasLimitedVision(SOLDIERTYPE * pSoldier) return TRUE; else return FALSE; -} \ No newline at end of file +} diff --git a/TacticalAI/AIMain.cpp b/TacticalAI/AIMain.cpp index ec12886b..5a161b74 100644 --- a/TacticalAI/AIMain.cpp +++ b/TacticalAI/AIMain.cpp @@ -1101,7 +1101,7 @@ void FreeUpNPCFromTurning(SOLDIERTYPE *pSoldier, INT8 bLook) { #ifdef TESTAI DebugMsg( TOPIC_JA2AI, DBG_LEVEL_3, - String("FREEUPNPCFROMTURNING: our action %d, desdir %d dir %d",pSoldier->bAction,pSoldier->bDesiredDirection,pSoldier->bDirection) ); + String("FREEUPNPCFROMTURNING: our action %d, desdir %d dir %d",pSoldier->bAction,pSoldier->bDesiredDirection,pSoldier->ubDirection) ); #endif @@ -1160,7 +1160,7 @@ void ActionDone(SOLDIERTYPE *pSoldier) { #ifdef TESTAI DebugMsg( TOPIC_JA2AI, DBG_LEVEL_3, - String("Cancelling actiondone: our action %d, desdir %d dir %d",pSoldier->bAction,pSoldier->bDesiredDirection,pSoldier->bDirection) ); + String("Cancelling actiondone: our action %d, desdir %d dir %d",pSoldier->bAction,pSoldier->bDesiredDirection,pSoldier->ubDirection) ); #endif } @@ -1177,7 +1177,7 @@ void ActionDone(SOLDIERTYPE *pSoldier) if ( !pSoldier->fNoAPToFinishMove ) { - EVENT_StopMerc( pSoldier, pSoldier->sGridNo, pSoldier->bDirection ); + EVENT_StopMerc( pSoldier, pSoldier->sGridNo, pSoldier->ubDirection ); AdjustNoAPToFinishMove( pSoldier, FALSE ); } @@ -1276,9 +1276,9 @@ void NPCDoesAct(SOLDIERTYPE *pSoldier) // CJC Feb 18 99: make sure that soldier is not in the middle of a turn due to visual crap to make enemies // face and point their guns at us - if ( pSoldier->bDesiredDirection != pSoldier->bDirection ) + if ( pSoldier->bDesiredDirection != pSoldier->ubDirection ) { - pSoldier->bDesiredDirection = pSoldier->bDirection; + pSoldier->bDesiredDirection = pSoldier->ubDirection; } DebugMsg (TOPIC_JA2,DBG_LEVEL_3,"NPCDoesAct done"); @@ -1421,16 +1421,16 @@ NameMessage(pSoldier,"will now be freed up from turning...",2000); // force him to face in the right direction (as long as it's legal) if ((pSoldier->bDesiredDirection >= 1) && (pSoldier->bDesiredDirection <= 8)) -pSoldier->bDirection = pSoldier->bDesiredDirection; +pSoldier->ubDirection = pSoldier->bDesiredDirection; else -pSoldier->bDesiredDirection = pSoldier->bDirection; +pSoldier->bDesiredDirection = pSoldier->ubDirection; // free up ONLY players from whom we haven't received an AI_ACTION_DONE yet // we can all agree the action is DONE and we can continue... // (otherwise they'll be calling FreeUp... twice and get REAL screwed up) NetSend.msgType = NET_FREE_UP_TURN; NetSend.ubID = pSoldier->ubID; -NetSend.misc_UCHAR = pSoldier->bDirection; +NetSend.misc_UCHAR = pSoldier->ubDirection; NetSend.answer = pSoldier->bDesiredDirection; for (cnt = 0; cnt < MAXPLAYERS; cnt++) @@ -2416,7 +2416,7 @@ INT8 ExecuteAction(SOLDIERTYPE *pSoldier) case AI_ACTION_PULL_TRIGGER: // activate an adjacent panic trigger // turn to face trigger first - if ( FindStructure( (INT16)(pSoldier->sGridNo + DirectionInc( NORTH )), STRUCTURE_SWITCH ) ) + if ( FindStructure( pSoldier->sGridNo + DirectionInc( NORTH ), STRUCTURE_SWITCH ) ) { SendSoldierSetDesiredDirectionEvent( pSoldier, NORTH ); } @@ -2553,17 +2553,17 @@ INT8 ExecuteAction(SOLDIERTYPE *pSoldier) case AI_ACTION_LOCK_DOOR: { STRUCTURE * pStructure; - INT8 bDirection; + UINT8 ubDirection; INT16 sDoorGridNo; - bDirection = (INT8) GetDirectionFromGridNo( pSoldier->usActionData, pSoldier ); - if (bDirection == EAST || bDirection == SOUTH) + ubDirection = GetDirectionFromGridNo( (INT16)pSoldier->usActionData, pSoldier ); + if (ubDirection == EAST || ubDirection == SOUTH) { sDoorGridNo = pSoldier->sGridNo; } else { - sDoorGridNo = pSoldier->sGridNo + DirectionInc( bDirection ); + sDoorGridNo = pSoldier->sGridNo + DirectionInc( ubDirection ); } pStructure = FindStructure( sDoorGridNo, STRUCTURE_ANYDOOR ); @@ -2582,14 +2582,14 @@ INT8 ExecuteAction(SOLDIERTYPE *pSoldier) EndAIGuysTurn( pSoldier ); } - StartInteractiveObject( sDoorGridNo, pStructure->usStructureID, pSoldier, bDirection ); - InteractWithInteractiveObject( pSoldier, pStructure, bDirection ); + StartInteractiveObject( sDoorGridNo, pStructure->usStructureID, pSoldier, ubDirection ); + InteractWithInteractiveObject( pSoldier, pStructure, ubDirection ); } break; case AI_ACTION_LOWER_GUN: // for now, just do "action done" - InternalSoldierReadyWeapon(pSoldier,pSoldier->bDirection,TRUE); + InternalSoldierReadyWeapon(pSoldier,pSoldier->ubDirection,TRUE); HandleSight(pSoldier, SIGHT_LOOK ); ActionDone( pSoldier ); break; diff --git a/TacticalAI/AIUtils.cpp b/TacticalAI/AIUtils.cpp index bcf20399..7004f5f7 100644 --- a/TacticalAI/AIUtils.cpp +++ b/TacticalAI/AIUtils.cpp @@ -448,7 +448,7 @@ BOOLEAN IsActionAffordable(SOLDIERTYPE *pSoldier) { INT8 bMinPointsNeeded = 0; INT8 bAPForStandUp = 0; - INT8 bAPToLookAtWall = ( FindDirectionForClimbing( pSoldier->sGridNo ) == pSoldier->bDirection ) ? 0 : 1; + INT8 bAPToLookAtWall = ( FindDirectionForClimbing( pSoldier->sGridNo ) == pSoldier->ubDirection ) ? 0 : 1; //NumMessage("AffordableAction - Guy#",pSoldier->ubID); @@ -583,7 +583,7 @@ INT16 RandomFriendWithin(SOLDIERTYPE *pSoldier) UINT32 uiLoop; UINT16 usMaxDist; UINT8 ubFriendCount, ubFriendIDs[MAXMERCS], ubFriendID; - UINT16 usDirection; + UINT8 ubDirection; UINT8 ubDirsLeft; BOOLEAN fDirChecked[8]; BOOLEAN fRangeRestricted = FALSE, fFound = FALSE; @@ -663,9 +663,9 @@ INT16 RandomFriendWithin(SOLDIERTYPE *pSoldier) // should be close enough, try to find a legal ->sDestination within 1 tile // clear dirChecked flag for all 8 directions - for (usDirection = 0; usDirection < 8; usDirection++) + for (ubDirection = 0; ubDirection < 8; ubDirection++) { - fDirChecked[usDirection] = FALSE; + fDirChecked[ubDirection] = FALSE; } ubDirsLeft = 8; @@ -677,14 +677,14 @@ INT16 RandomFriendWithin(SOLDIERTYPE *pSoldier) // randomly select a direction which hasn't been 'checked' yet do { - usDirection = (UINT16) Random(8); + ubDirection = (UINT8) Random(8); } - while (fDirChecked[usDirection]); + while (fDirChecked[ubDirection]); - fDirChecked[usDirection] = TRUE; + fDirChecked[ubDirection] = TRUE; // determine the gridno 1 tile away from current friend in this direction - usDest = NewGridNo(Menptr[ubFriendID].sGridNo,DirectionInc((INT16)(usDirection + 1))); + usDest = NewGridNo(Menptr[ubFriendID].sGridNo,DirectionInc(ubDirection)); // if that's out of bounds, ignore it & check next direction if (usDest == Menptr[ubFriendID].sGridNo) @@ -2189,7 +2189,7 @@ INT32 CalcManThreatValue( SOLDIERTYPE *pEnemy, INT16 sMyGrid, UINT8 ubReduceForC else { // ADD 5% if man's already facing me - if (pEnemy->bDirection == atan8(CenterX(pEnemy->sGridNo),CenterY(pEnemy->sGridNo),CenterX(sMyGrid),CenterY(sMyGrid))) + if (pEnemy->ubDirection == atan8(CenterX(pEnemy->sGridNo),CenterY(pEnemy->sGridNo),CenterX(sMyGrid),CenterY(sMyGrid))) { iThreatValue += (iThreatValue / 20); } @@ -2441,13 +2441,13 @@ BOOLEAN ValidCreatureTurn( SOLDIERTYPE * pCreature, INT8 bNewDirection ) INT8 bLoop; BOOLEAN fFound; - bDirChange = (INT8) QuickestDirection( pCreature->bDirection, bNewDirection ); + bDirChange = (INT8) QuickestDirection( pCreature->ubDirection, bNewDirection ); for( bLoop = 0; bLoop < 2; bLoop++ ) { fFound = TRUE; - bTempDir = pCreature->bDirection; + bTempDir = pCreature->ubDirection; do { diff --git a/TacticalAI/Attacks.cpp b/TacticalAI/Attacks.cpp index a0c6e1b2..1f86b176 100644 --- a/TacticalAI/Attacks.cpp +++ b/TacticalAI/Attacks.cpp @@ -399,7 +399,7 @@ void CalcBestShot(SOLDIERTYPE *pSoldier, ATTACKTYPE *pBestShot, BOOLEAN shootUns BOOLEAN CloseEnoughForGrenadeToss( INT16 sGridNo, INT16 sGridNo2 ) { INT16 sTempGridNo; - INT8 bDirection; + UINT8 ubDirection; INT16 sXPos, sYPos, sXPos2, sYPos2; UINT8 ubMovementCost; @@ -407,10 +407,10 @@ BOOLEAN CloseEnoughForGrenadeToss( INT16 sGridNo, INT16 sGridNo2 ) { // checking the same space; if there is a closed door next to location in ANY direction then forget it // (could be the player closed a door on us) - for (bDirection = 0; bDirection < NUM_WORLD_DIRECTIONS; bDirection++) + for (ubDirection = 0; ubDirection < NUM_WORLD_DIRECTIONS; ubDirection++) { - sTempGridNo = NewGridNo( sGridNo, DirectionInc( bDirection ) ); - ubMovementCost = gubWorldMovementCosts[ sTempGridNo ][ bDirection ][ 0 ]; + sTempGridNo = NewGridNo( sGridNo, DirectionInc( ubDirection ) ); + ubMovementCost = gubWorldMovementCosts[ sTempGridNo ][ ubDirection ][ 0 ]; if ( IS_TRAVELCOST_DOOR( ubMovementCost ) ) { ubMovementCost = DoorTravelCost( NULL, sTempGridNo, ubMovementCost, FALSE, NULL ); @@ -437,14 +437,14 @@ BOOLEAN CloseEnoughForGrenadeToss( INT16 sGridNo, INT16 sGridNo2 ) sYPos = CenterY( sGridNo ); sXPos2 = CenterX( sGridNo2 ); sYPos2 = CenterY( sGridNo2 ); - bDirection = atan8( sXPos, sYPos, sXPos2, sYPos2 ); + ubDirection = atan8( sXPos, sYPos, sXPos2, sYPos2 ); // For each step of the loop, we are checking for door or obstacle movement costs. If we // find we're blocked, then this is no good for grenade tossing! do { - sTempGridNo = NewGridNo( sTempGridNo, DirectionInc( bDirection ) ); - ubMovementCost = gubWorldMovementCosts[ sTempGridNo ][ bDirection ][ 0 ]; + sTempGridNo = NewGridNo( sTempGridNo, DirectionInc( ubDirection ) ); + ubMovementCost = gubWorldMovementCosts[ sTempGridNo ][ ubDirection ][ 0 ]; if ( IS_TRAVELCOST_DOOR( ubMovementCost ) ) { ubMovementCost = DoorTravelCost( NULL, sTempGridNo, ubMovementCost, FALSE, NULL ); @@ -1575,6 +1575,8 @@ INT32 EstimateShotDamage(SOLDIERTYPE *pSoldier, SOLDIERTYPE *pOpponent, UINT8 ub INT32 iTotalProt; INT8 bPlatePos; UINT8 ubAmmoType; + UINT16 usItem; + OBJECTTYPE *pObj; /* if ( pOpponent->uiStatusFlags & SOLDIER_VEHICLE ) @@ -1584,19 +1586,22 @@ INT32 EstimateShotDamage(SOLDIERTYPE *pSoldier, SOLDIERTYPE *pOpponent, UINT8 ub } */ - if ( Item[ pSoldier->inv[pSoldier->ubAttackingHand].usItem ].usItemClass & IC_THROWING_KNIFE ) + pObj = &(pSoldier->inv[pSoldier->ubAttackingHand]); + usItem = pObj->usItem; + + if ( Item[ usItem ].usItemClass & IC_THROWING_KNIFE ) { ubAmmoType = AMMO_KNIFE; } else { - ubAmmoType = pSoldier->inv[pSoldier->ubAttackingHand].ItemData.Gun.ubGunAmmoType; + ubAmmoType = pObj->ItemData.Gun.ubGunAmmoType; } // calculate distance to target, obtain his gun's maximum range rating iRange = GetRangeInCellCoordsFromGridNoDiff( pSoldier->sGridNo, pOpponent->sGridNo ); - iMaxRange = Weapon[pSoldier->inv[HANDPOS].usItem].usRange; + iMaxRange = Weapon[usItem].usRange; // bullet loses speed and penetrating power, 50% loss per maximum range iPowerLost = ((50 * iRange) / iMaxRange); @@ -1604,7 +1609,7 @@ INT32 EstimateShotDamage(SOLDIERTYPE *pSoldier, SOLDIERTYPE *pOpponent, UINT8 ub // up to 50% extra impact for making particularly accurate successful shots ubBonus = ubChanceToHit / 4; // /4 is really /2 and /2 again - iDamage = ((GetDamage(&pSoldier->inv[HANDPOS])) * (100 - iPowerLost + ubBonus) / 100) ; + iDamage = ((GetDamage(pObj)) * (100 - iPowerLost + ubBonus) / 100) ; //NumMessage("Pre-protection damage: ",damage); @@ -1679,7 +1684,7 @@ INT32 EstimateShotDamage(SOLDIERTYPE *pSoldier, SOLDIERTYPE *pOpponent, UINT8 ub { // cheat and emphasize shots //iDamage = (iDamage * 15) / 10; - switch( pSoldier->inv[pSoldier->ubAttackingHand].usItem ) + switch( usItem ) { // explosive damage is 100-200% that of the rated, so multiply by 3/2s here case CREATURE_QUEEN_SPIT: //TODO: Madd - remove the hardcoding here diff --git a/TacticalAI/CreatureDecideAction.cpp b/TacticalAI/CreatureDecideAction.cpp index 0e9ffb51..b4ca2156 100644 --- a/TacticalAI/CreatureDecideAction.cpp +++ b/TacticalAI/CreatureDecideAction.cpp @@ -391,7 +391,7 @@ INT8 CreatureDecideActionGreen( SOLDIERTYPE * pSoldier ) // if man has a LEGAL dominant facing, and isn't facing it, he will turn // back towards that facing 50% of the time here (normally just enemies) if ((pSoldier->bDominantDir >= 0) && (pSoldier->bDominantDir <= 8) && - (pSoldier->bDirection != pSoldier->bDominantDir) && PreRandom(2)) + (pSoldier->ubDirection != pSoldier->bDominantDir) && PreRandom(2)) { pSoldier->usActionData = pSoldier->bDominantDir; } @@ -399,7 +399,7 @@ INT8 CreatureDecideActionGreen( SOLDIERTYPE * pSoldier ) { pSoldier->usActionData = (UINT16)PreRandom(8); } - } while (pSoldier->usActionData == pSoldier->bDirection); + } while (pSoldier->usActionData == pSoldier->ubDirection); #ifdef DEBUGDECISIONS STR16 tempstr; @@ -479,7 +479,7 @@ INT8 CreatureDecideActionYellow( SOLDIERTYPE * pSoldier ) // if soldier is not already facing in that direction, // and the noise source is close enough that it could possibly be seen - if ((GetAPsToLook( pSoldier ) <= pSoldier->bActionPoints) && (pSoldier->bDirection != ubNoiseDir) && PythSpacesAway(pSoldier->sGridNo,sNoiseGridNo) <= STRAIGHT) + if ((GetAPsToLook( pSoldier ) <= pSoldier->bActionPoints) && (pSoldier->ubDirection != ubNoiseDir) && PythSpacesAway(pSoldier->sGridNo,sNoiseGridNo) <= STRAIGHT) { // set base chance according to orders if ((pSoldier->bOrders == STATIONARY) || (pSoldier->bOrders == ONGUARD)) @@ -850,7 +850,7 @@ INT8 CreatureDecideActionRed(SOLDIERTYPE *pSoldier, UINT8 ubUnconsciousOK) // note, have to change this to use the level returned from ClosestKnownOpponent sDistVisible = pSoldier->GetMaxDistanceVisible(sClosestOpponent, 0 ); - if ((pSoldier->bDirection != ubOpponentDir) && (PythSpacesAway(pSoldier->sGridNo,sClosestOpponent) <= sDistVisible)) + if ((pSoldier->ubDirection != ubOpponentDir) && (PythSpacesAway(pSoldier->sGridNo,sClosestOpponent) <= sDistVisible)) { // set base chance according to orders if ((pSoldier->bOrders == STATIONARY) || (pSoldier->bOrders == ONGUARD)) @@ -1405,7 +1405,7 @@ INT8 CreatureDecideActionBlack( SOLDIERTYPE * pSoldier ) bDirection = atan8(CenterX(pSoldier->sGridNo),CenterY(pSoldier->sGridNo),CenterX(sClosestOpponent),CenterY(sClosestOpponent)); // if we're not facing towards him - if (pSoldier->bDirection != bDirection && ValidCreatureTurn( pSoldier, bDirection ) ) + if (pSoldier->ubDirection != bDirection && ValidCreatureTurn( pSoldier, bDirection ) ) { pSoldier->usActionData = bDirection; @@ -1699,7 +1699,7 @@ INT8 CrowDecideActionGreen( SOLDIERTYPE * pSoldier ) // Change facing sFacingDir = GetDirectionFromGridNo( sCorpseGridNo, pSoldier ); - if ( sFacingDir != pSoldier->bDirection ) + if ( sFacingDir != pSoldier->ubDirection ) { pSoldier->usActionData = sFacingDir; return(AI_ACTION_CHANGE_FACING); diff --git a/TacticalAI/DecideAction.cpp b/TacticalAI/DecideAction.cpp index c27492a1..6645c9f1 100644 --- a/TacticalAI/DecideAction.cpp +++ b/TacticalAI/DecideAction.cpp @@ -550,7 +550,7 @@ INT8 DecideActionBoxerEnteringRing(SOLDIERTYPE *pSoldier) ubDesiredMercDir = atan8(CenterX(pSoldier->sGridNo),CenterY(pSoldier->sGridNo),CenterX(sDesiredMercLoc),CenterY(sDesiredMercLoc)); // if not already facing in that direction, - if ( pSoldier->bDirection != ubDesiredMercDir && InternalIsValidStance( pSoldier, ubDesiredMercDir, gAnimControl[ pSoldier->usAnimState ].ubEndHeight ) ) + if ( pSoldier->ubDirection != ubDesiredMercDir && InternalIsValidStance( pSoldier, ubDesiredMercDir, gAnimControl[ pSoldier->usAnimState ].ubEndHeight ) ) { pSoldier->usActionData = ubDesiredMercDir; @@ -610,7 +610,7 @@ INT8 DecideActionNamedNPC( SOLDIERTYPE * pSoldier ) ubDesiredMercDir = atan8(CenterX(pSoldier->sGridNo),CenterY(pSoldier->sGridNo),CenterX(sDesiredMercLoc),CenterY(sDesiredMercLoc)); // if not already facing in that direction, - if (pSoldier->bDirection != ubDesiredMercDir && InternalIsValidStance( pSoldier, ubDesiredMercDir, gAnimControl[ pSoldier->usAnimState ].ubEndHeight ) ) + if (pSoldier->ubDirection != ubDesiredMercDir && InternalIsValidStance( pSoldier, ubDesiredMercDir, gAnimControl[ pSoldier->usAnimState ].ubEndHeight ) ) { pSoldier->usActionData = ubDesiredMercDir; @@ -754,7 +754,7 @@ INT8 DecideActionGreen(SOLDIERTYPE *pSoldier) ubRingDir = atan8(CenterX(pSoldier->sGridNo),CenterY(pSoldier->sGridNo),CenterX(CENTER_OF_RING),CenterY(CENTER_OF_RING)); if ( gfTurnBasedAI || GetAPsToLook( pSoldier ) <= pSoldier->bActionPoints ) { - if ( pSoldier->bDirection != ubRingDir ) + if ( pSoldier->ubDirection != ubRingDir ) { pSoldier->usActionData = ubRingDir; return( AI_ACTION_CHANGE_FACING ); @@ -1220,7 +1220,7 @@ INT8 DecideActionGreen(SOLDIERTYPE *pSoldier) // if man has a LEGAL dominant facing, and isn't facing it, he will turn // back towards that facing 50% of the time here (normally just enemies) if ((pSoldier->bDominantDir >= 0) && (pSoldier->bDominantDir <= 8) && - (pSoldier->bDirection != pSoldier->bDominantDir) && PreRandom(2) && pSoldier->bOrders != SNIPER ) + (pSoldier->ubDirection != pSoldier->bDominantDir) && PreRandom(2) && pSoldier->bOrders != SNIPER ) { pSoldier->usActionData = pSoldier->bDominantDir; } @@ -1234,7 +1234,7 @@ INT8 DecideActionGreen(SOLDIERTYPE *pSoldier) if (sNoiseGridNo == NOWHERE || (ubNoiseDir = atan8(CenterX(pSoldier->sGridNo),CenterY(pSoldier->sGridNo),CenterX(sNoiseGridNo),CenterY(sNoiseGridNo)) - ) == pSoldier->bDirection ) + ) == pSoldier->ubDirection ) { pSoldier->usActionData = (UINT16)PreRandom(8); @@ -1244,7 +1244,7 @@ INT8 DecideActionGreen(SOLDIERTYPE *pSoldier) pSoldier->usActionData = ubNoiseDir; } } - } while (pSoldier->usActionData == pSoldier->bDirection); + } while (pSoldier->usActionData == pSoldier->ubDirection); #ifdef DEBUGDECISIONS @@ -1355,7 +1355,7 @@ INT8 DecideActionYellow(SOLDIERTYPE *pSoldier) // and the noise source is close enough that it could possibly be seen if ( !gfTurnBasedAI || GetAPsToLook( pSoldier ) <= pSoldier->bActionPoints ) { - if ((pSoldier->bDirection != ubNoiseDir) && PythSpacesAway(pSoldier->sGridNo,sNoiseGridNo) <= pSoldier->GetMaxDistanceVisible(sNoiseGridNo) ) + if ((pSoldier->ubDirection != ubNoiseDir) && PythSpacesAway(pSoldier->sGridNo,sNoiseGridNo) <= pSoldier->GetMaxDistanceVisible(sNoiseGridNo) ) { // set base chance according to orders if ((pSoldier->bOrders == STATIONARY) || (pSoldier->bOrders == ONGUARD) ) @@ -2154,10 +2154,10 @@ INT8 DecideActionRed(SOLDIERTYPE *pSoldier, UINT8 ubUnconsciousOK) // if firing mortar make sure we have room if ( Item[pSoldier->inv[ BestThrow.bWeaponIn ].usItem].mortar ) { - ubOpponentDir = (UINT8)GetDirectionFromGridNo( BestThrow.sTarget, pSoldier ); + ubOpponentDir = GetDirectionFromGridNo( BestThrow.sTarget, pSoldier ); // Get new gridno! - sCheckGridNo = NewGridNo( (UINT16)pSoldier->sGridNo, (UINT16)DirectionInc( ubOpponentDir ) ); + sCheckGridNo = NewGridNo( pSoldier->sGridNo, DirectionInc( ubOpponentDir ) ); if ( OKFallDirection( pSoldier, sCheckGridNo, pSoldier->bLevel, ubOpponentDir, pSoldier->usAnimState ) ) { @@ -2181,10 +2181,10 @@ INT8 DecideActionRed(SOLDIERTYPE *pSoldier, UINT8 ubUnconsciousOK) BestThrow.ubPossible = FALSE; // try behind us, see if there's room to move back - sCheckGridNo = NewGridNo( (UINT16)pSoldier->sGridNo, (UINT16)DirectionInc( gOppositeDirection[ ubOpponentDir ] ) ); + sCheckGridNo = NewGridNo( pSoldier->sGridNo, DirectionInc( gOppositeDirection[ ubOpponentDir ] ) ); if ( OKFallDirection( pSoldier, sCheckGridNo, pSoldier->bLevel, gOppositeDirection[ ubOpponentDir ], pSoldier->usAnimState ) ) { - pSoldier->usActionData = sCheckGridNo; + pSoldier->usActionData = (UINT16) sCheckGridNo; return( AI_ACTION_GET_CLOSER ); } @@ -2909,7 +2909,7 @@ INT8 DecideActionRed(SOLDIERTYPE *pSoldier, UINT8 ubUnconsciousOK) // if soldier is not already facing in that direction, // and the opponent is close enough that he could possibly be seen - if ( pSoldier->bDirection != ubOpponentDir && InternalIsValidStance( pSoldier, ubOpponentDir, gAnimControl[ pSoldier->usAnimState ].ubEndHeight ) ) + if ( pSoldier->ubDirection != ubOpponentDir && InternalIsValidStance( pSoldier, ubOpponentDir, gAnimControl[ pSoldier->usAnimState ].ubEndHeight ) ) { // turn pSoldier->usActionData = ubOpponentDir; @@ -3162,7 +3162,7 @@ INT8 DecideActionRed(SOLDIERTYPE *pSoldier, UINT8 ubUnconsciousOK) // note, have to change this to use the level returned from ClosestKnownOpponent sDistVisible = pSoldier->GetMaxDistanceVisible(sClosestOpponent, 0, CALC_FROM_ALL_DIRS ); - if ((pSoldier->bDirection != ubOpponentDir) && (PythSpacesAway(pSoldier->sGridNo,sClosestOpponent) <= sDistVisible)) + if ((pSoldier->ubDirection != ubOpponentDir) && (PythSpacesAway(pSoldier->sGridNo,sClosestOpponent) <= sDistVisible)) { // set base chance according to orders if ((pSoldier->bOrders == STATIONARY) || (pSoldier->bOrders == ONGUARD)) @@ -3197,7 +3197,7 @@ INT8 DecideActionRed(SOLDIERTYPE *pSoldier, UINT8 ubUnconsciousOK) return(AI_ACTION_CHANGE_FACING); } } - else if ( pSoldier->bDirection == ubOpponentDir && pSoldier->bOrders == SNIPER ) + else if ( pSoldier->ubDirection == ubOpponentDir && pSoldier->bOrders == SNIPER ) { if (!gfTurnBasedAI || GetAPsToReadyWeapon( pSoldier, READY_RIFLE_CROUCH ) <= pSoldier->bActionPoints) { @@ -3216,7 +3216,7 @@ INT8 DecideActionRed(SOLDIERTYPE *pSoldier, UINT8 ubUnconsciousOK) if ( sClosestDisturbance != NOWHERE ) { ubOpponentDir = atan8( CenterX( pSoldier->sGridNo ), CenterY( pSoldier->sGridNo ), CenterX( sClosestDisturbance ), CenterY( sClosestDisturbance ) ); - if ( pSoldier->bDirection == ubOpponentDir ) + if ( pSoldier->ubDirection == ubOpponentDir ) { ubOpponentDir = (UINT8) PreRandom( NUM_WORLD_DIRECTIONS ); } @@ -3226,7 +3226,7 @@ INT8 DecideActionRed(SOLDIERTYPE *pSoldier, UINT8 ubUnconsciousOK) ubOpponentDir = (UINT8) PreRandom( NUM_WORLD_DIRECTIONS ); } - if ( (pSoldier->bDirection != ubOpponentDir) ) + if ( (pSoldier->ubDirection != ubOpponentDir) ) { if ( (pSoldier->bActionPoints == pSoldier->bInitialActionPoints || (INT16)PreRandom(100) < 60) && InternalIsValidStance( pSoldier, ubOpponentDir, gAnimControl[ pSoldier->usAnimState ].ubEndHeight ) ) { @@ -3365,7 +3365,7 @@ INT8 DecideActionRed(SOLDIERTYPE *pSoldier, UINT8 ubUnconsciousOK) if ( sClosestDisturbance != NOWHERE ) { ubOpponentDir = atan8( CenterX( pSoldier->sGridNo ), CenterY( pSoldier->sGridNo ), CenterX( sClosestDisturbance ), CenterY( sClosestDisturbance ) ); - if ( pSoldier->bDirection != ubOpponentDir ) + if ( pSoldier->ubDirection != ubOpponentDir ) { if ( !gfTurnBasedAI || GetAPsToLook( pSoldier ) <= pSoldier->bActionPoints ) { @@ -4277,7 +4277,7 @@ INT8 DecideActionBlack(SOLDIERTYPE *pSoldier) if (ubBestStance != 0) { // change stance first! - if ( pSoldier->bDirection != bDirection && InternalIsValidStance( pSoldier, bDirection, gAnimControl[ pSoldier->usAnimState ].ubEndHeight ) ) + if ( pSoldier->ubDirection != bDirection && InternalIsValidStance( pSoldier, bDirection, gAnimControl[ pSoldier->usAnimState ].ubEndHeight ) ) { // we're not facing towards him, so turn first! pSoldier->usActionData = bDirection; @@ -4632,7 +4632,7 @@ INT8 DecideActionBlack(SOLDIERTYPE *pSoldier) if ( pSoldier->usActionData != NOWHERE ) { // truncate path to 1 step - pSoldier->usActionData = pSoldier->sGridNo + DirectionInc( pSoldier->usPathingData[0] ); + pSoldier->usActionData = pSoldier->sGridNo + DirectionInc( (UINT8) pSoldier->usPathingData[0] ); pSoldier->sFinalDestination = pSoldier->usActionData; pSoldier->bNextAction = AI_ACTION_END_TURN; return( AI_ACTION_GET_CLOSER ); @@ -4749,7 +4749,7 @@ INT8 DecideActionBlack(SOLDIERTYPE *pSoldier) bDirection = atan8(CenterX(pSoldier->sGridNo),CenterY(pSoldier->sGridNo),CenterX(sClosestOpponent),CenterY(sClosestOpponent)); // if we're not facing towards him - if (pSoldier->bDirection != bDirection) + if (pSoldier->ubDirection != bDirection) { if ( InternalIsValidStance( pSoldier, bDirection, (INT8) pSoldier->usActionData) ) { @@ -4807,7 +4807,7 @@ INT8 DecideActionBlack(SOLDIERTYPE *pSoldier) bDirection = atan8(CenterX(pSoldier->sGridNo),CenterY(pSoldier->sGridNo),CenterX(sClosestOpponent),CenterY(sClosestOpponent)); // if we're not facing towards him - if ( pSoldier->bDirection != bDirection && InternalIsValidStance( pSoldier, bDirection, gAnimControl[ pSoldier->usAnimState ].ubEndHeight ) ) + if ( pSoldier->ubDirection != bDirection && InternalIsValidStance( pSoldier, bDirection, gAnimControl[ pSoldier->usAnimState ].ubEndHeight ) ) { pSoldier->usActionData = bDirection; diff --git a/TacticalAI/Movement.cpp b/TacticalAI/Movement.cpp index 84edbeb4..7d6cf80a 100644 --- a/TacticalAI/Movement.cpp +++ b/TacticalAI/Movement.cpp @@ -998,7 +998,7 @@ INT16 TrackScent( SOLDIERTYPE * pSoldier ) ubBestStrength = ubStrength; bDir = atan8( (INT16) iXStart, (INT16) iYStart, (INT16) (iXStart + iXDiff), (INT16) (iYStart + iYDiff) ); // now convert it into a difference in degree between it and our current dir - ubBestDirDiff = abs( pSoldier->bDirection - bDir ); + ubBestDirDiff = abs( pSoldier->ubDirection - bDir ); if (ubBestDirDiff > 4 ) // dir 0 compared with dir 6, for instance { ubBestDirDiff = 8 - ubBestDirDiff; @@ -1018,7 +1018,7 @@ INT16 TrackScent( SOLDIERTYPE * pSoldier ) // start by calculating direction to the new gridno bDir = atan8( (INT16) iXStart, (INT16) iYStart, (INT16) (iXStart + iXDiff), (INT16) (iYStart + iYDiff) ); // now convert it into a difference in degree between it and our current dir - ubDirDiff = abs( pSoldier->bDirection - bDir ); + ubDirDiff = abs( pSoldier->ubDirection - bDir ); if (ubDirDiff > 4 ) // dir 0 compared with dir 6, for instance { ubDirDiff = 8 - ubDirDiff; diff --git a/TileEngine/Buildings.cpp b/TileEngine/Buildings.cpp index 6bcd6a2a..cc579748 100644 --- a/TileEngine/Buildings.cpp +++ b/TileEngine/Buildings.cpp @@ -44,7 +44,7 @@ BUILDING * GenerateBuilding( INT16 sDesiredSpot ) UINT32 uiLoop2; INT16 sTempGridNo, sNextTempGridNo, sVeryTemporaryGridNo; INT16 sStartGridNo, sCurrGridNo, sPrevGridNo = NOWHERE, sRightGridNo; - INT8 bDirection, bTempDirection; + UINT8 ubDirection, ubTempDirection; BOOLEAN fFoundDir, fFoundWall; UINT32 uiChanceIn = ROOF_LOCATION_CHANCE; // chance of a location being considered INT16 sWallGridNo; @@ -77,13 +77,13 @@ BUILDING * GenerateBuilding( INT16 sDesiredSpot ) RoofReachableTest( sDesiredSpot, ubBuildingID ); // From sGridNo, search until we find a spot that isn't part of the building - bDirection = NORTHWEST; + ubDirection = NORTHWEST; sTempGridNo = sDesiredSpot; // using diagonal directions to hopefully prevent picking a // spot that while( (gpWorldLevelData[ sTempGridNo ].uiFlags & MAPELEMENT_REACHABLE ) ) { - sNextTempGridNo = NewGridNo( sTempGridNo, DirectionInc( bDirection ) ); + sNextTempGridNo = NewGridNo( sTempGridNo, DirectionInc( ubDirection ) ); if ( sTempGridNo == sNextTempGridNo ) { // hit edge of map!??! @@ -103,12 +103,12 @@ BUILDING * GenerateBuilding( INT16 sDesiredSpot ) if ( gpWorldLevelData[ sVeryTemporaryGridNo ].uiFlags & MAPELEMENT_REACHABLE ) { // go north first - bDirection = NORTH; + ubDirection = NORTH; } else { // go that way (east) - bDirection = EAST; + ubDirection = EAST; } gpWorldLevelData[ sStartGridNo ].ubExtFlags[0] |= MAPELEMENT_EXT_ROOFCODE_VISITED; @@ -118,7 +118,7 @@ BUILDING * GenerateBuilding( INT16 sDesiredSpot ) { // if point to (2 clockwise) is not part of building and is not visited, // or is starting point, turn! - sRightGridNo = NewGridNo( sCurrGridNo, DirectionInc( gTwoCDirection[ bDirection ] ) ); + sRightGridNo = NewGridNo( sCurrGridNo, DirectionInc( gTwoCDirection[ ubDirection ] ) ); sTempGridNo = sRightGridNo; if ( ( ( !(gpWorldLevelData[ sTempGridNo ].uiFlags & MAPELEMENT_REACHABLE) && !(gpWorldLevelData[ sTempGridNo ].ubExtFlags[0] & MAPELEMENT_EXT_ROOFCODE_VISITED) ) || (sTempGridNo == sStartGridNo) ) && (sCurrGridNo != sStartGridNo) ) { @@ -128,47 +128,47 @@ BUILDING * GenerateBuilding( INT16 sDesiredSpot ) { return( NULL ); } - bDirection = gTwoCDirection[ bDirection ]; + ubDirection = gTwoCDirection[ ubDirection ]; // try in that direction continue; } iLoopCount = 0; // if spot ahead is part of building, turn - sTempGridNo = NewGridNo( sCurrGridNo, DirectionInc( bDirection ) ); + sTempGridNo = NewGridNo( sCurrGridNo, DirectionInc( ubDirection ) ); if ( gpWorldLevelData[ sTempGridNo ].uiFlags & MAPELEMENT_REACHABLE ) { // first search for a spot that is neither part of the building or visited // we KNOW that the spot in the original direction is blocked, so only loop 3 times - bTempDirection = gTwoCDirection[ bDirection ]; + ubTempDirection = gTwoCDirection[ ubDirection ]; fFoundDir = FALSE; for ( uiLoop = 0; uiLoop < 3; uiLoop++ ) { - sTempGridNo = NewGridNo( sCurrGridNo, DirectionInc( bTempDirection ) ); + sTempGridNo = NewGridNo( sCurrGridNo, DirectionInc( ubTempDirection ) ); if ( !(gpWorldLevelData[ sTempGridNo ].uiFlags & MAPELEMENT_REACHABLE) && !(gpWorldLevelData[ sTempGridNo ].ubExtFlags[0] & MAPELEMENT_EXT_ROOFCODE_VISITED) ) { // this is the way to go! fFoundDir = TRUE; break; } - bTempDirection = gTwoCDirection[ bTempDirection ]; + ubTempDirection = gTwoCDirection[ ubTempDirection ]; } if (!fFoundDir) { // now search for a spot that is just not part of the building - bTempDirection = gTwoCDirection[ bDirection ]; + ubTempDirection = gTwoCDirection[ ubDirection ]; fFoundDir = FALSE; for ( uiLoop = 0; uiLoop < 3; uiLoop++ ) { - sTempGridNo = NewGridNo( sCurrGridNo, DirectionInc( bTempDirection ) ); + sTempGridNo = NewGridNo( sCurrGridNo, DirectionInc( ubTempDirection ) ); if ( !(gpWorldLevelData[ sTempGridNo ].uiFlags & MAPELEMENT_REACHABLE) ) { // this is the way to go! fFoundDir = TRUE; break; } - bTempDirection = gTwoCDirection[ bTempDirection ]; + ubTempDirection = gTwoCDirection[ ubTempDirection ]; } if (!fFoundDir) { @@ -176,7 +176,7 @@ BUILDING * GenerateBuilding( INT16 sDesiredSpot ) return( NULL ); } } - bDirection = bTempDirection; + ubDirection = ubTempDirection; // try in that direction continue; } @@ -184,7 +184,7 @@ BUILDING * GenerateBuilding( INT16 sDesiredSpot ) // move ahead sPrevGridNo = sCurrGridNo; sCurrGridNo = sTempGridNo; - sRightGridNo = NewGridNo( sCurrGridNo, DirectionInc( gTwoCDirection[ bDirection ] ) ); + sRightGridNo = NewGridNo( sCurrGridNo, DirectionInc( gTwoCDirection[ ubDirection ] ) ); #ifdef ROOF_DEBUG if (gsCoverValue[sCurrGridNo] == 0x7F7F) @@ -219,7 +219,7 @@ BUILDING * GenerateBuilding( INT16 sDesiredSpot ) // if south or west, the wall would be in the gridno two clockwise fFoundWall = FALSE; - switch( bDirection ) + switch( ubDirection ) { case NORTH: sWallGridNo = sCurrGridNo; @@ -230,11 +230,11 @@ BUILDING * GenerateBuilding( INT16 sDesiredSpot ) bDesiredOrientation = OUTSIDE_TOP_LEFT; break; case SOUTH: - sWallGridNo = (INT16) ( sCurrGridNo + DirectionInc( gTwoCDirection[ bDirection ] ) ); + sWallGridNo = (INT16) ( sCurrGridNo + DirectionInc( gTwoCDirection[ ubDirection ] ) ); bDesiredOrientation = OUTSIDE_TOP_RIGHT; break; case WEST: - sWallGridNo = (INT16) ( sCurrGridNo + DirectionInc( gTwoCDirection[ bDirection ] ) ); + sWallGridNo = (INT16) ( sCurrGridNo + DirectionInc( gTwoCDirection[ ubDirection ] ) ); bDesiredOrientation = OUTSIDE_TOP_LEFT; break; default: diff --git a/TileEngine/Explosion Control.cpp b/TileEngine/Explosion Control.cpp index bbee3744..e782c3b8 100644 --- a/TileEngine/Explosion Control.cpp +++ b/TileEngine/Explosion Control.cpp @@ -406,7 +406,7 @@ void GenerateExplosionFromExplosionPointer( EXPLOSIONTYPE *pExplosion ) AniParams.sStartFrame = pExplosion->sCurrentFrame; AniParams.uiFlags = ANITILE_CACHEDTILE | ANITILE_FORWARD | ANITILE_EXPLOSION; - if ( ubTerrainType == LOW_WATER || ubTerrainType == MED_WATER || ubTerrainType == DEEP_WATER ) + if ( TERRAIN_IS_WATER(ubTerrainType) ) { // Change type to water explosion... ubTypeID = WATER_BLAST; @@ -1209,7 +1209,6 @@ BOOLEAN ExplosiveDamageStructureAtGridNo( STRUCTURE * pCurrent, STRUCTURE **ppNe STRUCTURE *gStruct; -// Lesh: somewhere here once I got CTD when militia stepped on mine in cambria sam void ExplosiveDamageGridNo( INT16 sGridNo, INT16 sWoundAmt, UINT32 uiDist, BOOLEAN *pfRecompileMovementCosts, BOOLEAN fOnlyWalls, INT8 bMultiStructSpecialFlag, BOOLEAN fSubSequentMultiTilesTransitionDamage, UINT8 ubOwner, INT8 bLevel ) { STRUCTURE * pCurrent, *pNextCurrent, *pStructure; @@ -1233,7 +1232,7 @@ void ExplosiveDamageGridNo( INT16 sGridNo, INT16 sWoundAmt, UINT32 uiDist, BOOLE // (1) we might need to destroy the currently-examined structure while (pCurrent != NULL) { - // ATE: These are for the chacks below for multi-structs.... + // ATE: These are for the checks below for multi-structs.... pBaseStructure = FindBaseStructure( pCurrent ); if ( pBaseStructure ) @@ -1243,7 +1242,6 @@ void ExplosiveDamageGridNo( INT16 sGridNo, INT16 sWoundAmt, UINT32 uiDist, BOOLE fMultiStructure = ( ( pBaseStructure->fFlags & STRUCTURE_MULTI ) != 0 ); ppTile = (DB_STRUCTURE_TILE **) MemAlloc( sizeof( DB_STRUCTURE_TILE* ) * ubNumberOfTiles ); - // Lesh: CTD was in next line once memcpy( ppTile, pBaseStructure->pDBStructureRef->ppTile, sizeof( DB_STRUCTURE_TILE* ) * ubNumberOfTiles ); if ( bMultiStructSpecialFlag == -1 ) @@ -1271,7 +1269,7 @@ void ExplosiveDamageGridNo( INT16 sGridNo, INT16 sWoundAmt, UINT32 uiDist, BOOLE { fExplodeDamageReturn = ExplosiveDamageStructureAtGridNo( pCurrent, &pNextCurrent, sGridNo, sWoundAmt, uiDist, pfRecompileMovementCosts, fOnlyWalls, 0, ubOwner, bLevel ); - // Are we overwritting damage due to multi-tile...? + // Are we overwriting damage due to multi-tile...? if ( fExplodeDamageReturn ) { if ( fSubSequentMultiTilesTransitionDamage == 2) @@ -1288,65 +1286,74 @@ void ExplosiveDamageGridNo( INT16 sGridNo, INT16 sWoundAmt, UINT32 uiDist, BOOLE { fToBreak = TRUE; } - } + //} - // OK, for multi-structs... - // AND we took damage... - if ( fMultiStructure && !fOnlyWalls && fExplodeDamageReturn == 0 ) - { - // ATE: Don't after first attack... - if ( uiDist > 1 ) + // 0verhaul: The following was combined with the previous code block. I don't think they intended to execute this + // part unless fExplodeDamageReturn was actually set. When it was being executed, tossing a grenade just behind the + // plane in Drassen, for instance, would cause an infinite recursion in this code. The reason is that the plane's + // armor is (amazingly enough) stronger than a grenade blast can even damage. This code here seems to rely on the + // structure in question being destroyed by the blast since it indiscriminently recurses on neighbors, creating a + // ping pong on two adjacent parts of the plane. Probably the reason this was not found before is that fExplodeDamageReturn + // was uninitialized before and usually was non-zero. Now it is initialized to false. + + // OK, for multi-structs... + // AND we took damage... + if ( fMultiStructure && !fOnlyWalls && fExplodeDamageReturn == 0 ) { - if ( pBaseStructure ) + // ATE: Don't after first attack... + if ( uiDist > 1 ) { - MemFree( ppTile ); - } - return; - } - - { - - for ( ubLoop = BASE_TILE; ubLoop < ubNumberOfTiles; ubLoop++) - { - sNewGridNo = sBaseGridNo + ppTile[ubLoop]->sPosRelToBase; - - // look in adjacent tiles - for ( ubLoop2 = 0; ubLoop2 < NUM_WORLD_DIRECTIONS; ubLoop2++ ) + if ( pBaseStructure ) { - sNewGridNo2 = NewGridNo( sNewGridNo, DirectionInc( ubLoop2 ) ); - if ( sNewGridNo2 != sNewGridNo && sNewGridNo2 != sGridNo ) + MemFree( ppTile ); + } + return; + } + + { + + for ( ubLoop = BASE_TILE; ubLoop < ubNumberOfTiles; ubLoop++) + { + sNewGridNo = sBaseGridNo + ppTile[ubLoop]->sPosRelToBase; + + // look in adjacent tiles + for ( ubLoop2 = 0; ubLoop2 < NUM_WORLD_DIRECTIONS; ubLoop2++ ) { - pStructure = FindStructure( sNewGridNo2, STRUCTURE_MULTI ); - if ( pStructure ) + sNewGridNo2 = NewGridNo( sNewGridNo, DirectionInc( ubLoop2 ) ); + if ( sNewGridNo2 != sNewGridNo && sNewGridNo2 != sGridNo ) { - fMultiStructSpecialFlag = ( ( pStructure->fFlags & STRUCTURE_SPECIAL ) != 0 ); - - if ( ( bMultiStructSpecialFlag == fMultiStructSpecialFlag ) ) + pStructure = FindStructure( sNewGridNo2, STRUCTURE_MULTI ); + if ( pStructure ) { - // If we just damaged it, use same damage value.... - if ( fMultiStructSpecialFlag ) - { - ExplosiveDamageGridNo( sNewGridNo2, sWoundAmt, uiDist, pfRecompileMovementCosts, fOnlyWalls, bMultiStructSpecialFlag, 1, ubOwner, bLevel ); - } - else - { - ExplosiveDamageGridNo( sNewGridNo2, sWoundAmt, uiDist, pfRecompileMovementCosts, fOnlyWalls, bMultiStructSpecialFlag, 2, ubOwner, bLevel ); - } + fMultiStructSpecialFlag = ( ( pStructure->fFlags & STRUCTURE_SPECIAL ) != 0 ); + if ( ( bMultiStructSpecialFlag == fMultiStructSpecialFlag ) ) { - InternalIgniteExplosion( ubOwner, CenterX( sNewGridNo2 ), CenterY( sNewGridNo2 ), 0, sNewGridNo2, RDX, FALSE, bLevel ); - } + // If we just damaged it, use same damage value.... + if ( fMultiStructSpecialFlag ) + { + ExplosiveDamageGridNo( sNewGridNo2, sWoundAmt, uiDist, pfRecompileMovementCosts, fOnlyWalls, bMultiStructSpecialFlag, 1, ubOwner, bLevel ); + } + else + { + ExplosiveDamageGridNo( sNewGridNo2, sWoundAmt, uiDist, pfRecompileMovementCosts, fOnlyWalls, bMultiStructSpecialFlag, 2, ubOwner, bLevel ); + } - fToBreak = TRUE; + { + InternalIgniteExplosion( ubOwner, CenterX( sNewGridNo2 ), CenterY( sNewGridNo2 ), 0, sNewGridNo2, RDX, FALSE, bLevel ); + } + + fToBreak = TRUE; + } } } } } } - } - if ( fToBreak ) - { - break; + if ( fToBreak ) + { + break; + } } } @@ -2862,7 +2869,7 @@ void PerformItemAction( INT16 sGridNo, OBJECTTYPE * pObj ) { // stop the merc... - EVENT_StopMerc( MercPtrs[ ubID ], MercPtrs[ ubID ]->sGridNo, MercPtrs[ ubID ]->bDirection ); + EVENT_StopMerc( MercPtrs[ ubID ], MercPtrs[ ubID ]->sGridNo, MercPtrs[ ubID ]->ubDirection ); switch( sGridNo ) { @@ -3673,7 +3680,7 @@ UINT8 DetermineFlashbangEffect( SOLDIERTYPE *pSoldier, INT8 ubExplosionDir, BOOL INT8 bNumTurns; UINT16 usHeadItem1, usHeadItem2; - bNumTurns = FindNumTurnsBetweenDirs(pSoldier->bDirection, ubExplosionDir); + bNumTurns = FindNumTurnsBetweenDirs(pSoldier->ubDirection, ubExplosionDir); usHeadItem1 = pSoldier->inv[ HEAD1POS ].usItem; usHeadItem2 = pSoldier->inv[ HEAD2POS ].usItem; diff --git a/TileEngine/Isometric Utils.cpp b/TileEngine/Isometric Utils.cpp index a30f038e..97faea3f 100644 --- a/TileEngine/Isometric Utils.cpp +++ b/TileEngine/Isometric Utils.cpp @@ -549,9 +549,9 @@ INT16 NewGridNo(INT16 sGridno, INT16 sDirInc) } -INT16 DirectionInc(INT16 sDirection) +INT16 DirectionInc(UINT8 ubDirection) { - if ((sDirection < 0) || (sDirection > 7)) + if ((ubDirection < 0) || (ubDirection > 7)) { //#ifdef BETAVERSION @@ -559,11 +559,11 @@ INT16 DirectionInc(INT16 sDirection) //#endif //direction = random(8); // replace garbage with random direction - sDirection = 1; + ubDirection = 1; } - return(DirIncrementer[sDirection]); + return(DirIncrementer[ubDirection]); } BOOLEAN CellXYToScreenXY(INT16 sCellX, INT16 sCellY, INT16 *sScreenX, INT16 *sScreenY) diff --git a/TileEngine/Isometric Utils.h b/TileEngine/Isometric Utils.h index 9d64ec26..f5542e3a 100644 --- a/TileEngine/Isometric Utils.h +++ b/TileEngine/Isometric Utils.h @@ -42,7 +42,7 @@ void ConvertGridNoToCenterCellXY( INT16 sGridNo, INT16 *sXPos, INT16 *sYPos ); // GRID NO MANIPULATION FUNCTIONS INT16 NewGridNo(INT16 sGridno, INT16 sDirInc); -INT16 DirectionInc(INT16 sDirection); +INT16 DirectionInc(UINT8 ubDirection); INT32 OutOfBounds(INT16 sGridno, INT16 sProposedGridno); diff --git a/TileEngine/Map Edgepoints.cpp b/TileEngine/Map Edgepoints.cpp index a685d9db..e5e45b32 100644 --- a/TileEngine/Map Edgepoints.cpp +++ b/TileEngine/Map Edgepoints.cpp @@ -1166,7 +1166,7 @@ void ChooseMapEdgepoints( MAPEDGEPOINTINFO *pMapEdgepointInfo, UINT8 ubStrategic psArray = psTempArray; for (i = 0; i < usArraySize; i++) { - if (GetTerrainType(psArray[ i ]) == MED_WATER || GetTerrainType(psArray[ i ]) == DEEP_WATER) + if (TERRAIN_IS_HIGH_WATER( GetTerrainType(psArray[ i ]) ) ) { if (i == usArraySize - 1) { diff --git a/TileEngine/SaveLoadMap.cpp b/TileEngine/SaveLoadMap.cpp index 932ff743..66d5ef99 100644 --- a/TileEngine/SaveLoadMap.cpp +++ b/TileEngine/SaveLoadMap.cpp @@ -1145,6 +1145,7 @@ BOOLEAN ChangeStatusOfOpenableStructInUnloadedSector( UINT16 usSectorX, UINT16 u if( uiNumBytesRead != uiFileSize ) { FileClose( hFile ); + MemFree( pTempArrayOfMaps); return( FALSE ); } @@ -1180,6 +1181,7 @@ BOOLEAN ChangeStatusOfOpenableStructInUnloadedSector( UINT16 usSectorX, UINT16 u if( hFile == 0 ) { //Error opening map modification file, + MemFree( pTempArrayOfMaps); return( FALSE ); } @@ -1188,11 +1190,14 @@ BOOLEAN ChangeStatusOfOpenableStructInUnloadedSector( UINT16 usSectorX, UINT16 u if( uiNumBytesWritten != uiFileSize ) { FileClose( hFile ); + MemFree( pTempArrayOfMaps); return( FALSE ); } FileClose( hFile ); + MemFree( pTempArrayOfMaps); + return( TRUE ); } diff --git a/TileEngine/Smell.cpp b/TileEngine/Smell.cpp index 6269da6c..1a3a76f0 100644 --- a/TileEngine/Smell.cpp +++ b/TileEngine/Smell.cpp @@ -359,14 +359,16 @@ void InternalDropBlood( INT16 sGridNo, INT8 bLevel, UINT8 ubType, UINT8 ubStreng MAP_ELEMENT * pMapElement; UINT8 ubOldStrength=0; UINT8 ubNewStrength=0; + UINT8 bOverTerrainType; /* * Dropping some blood; * We can check the type of blood by consulting the type in the smell byte */ + bOverTerrainType = GetTerrainType( sGridNo); // If we are in water... - if ( GetTerrainType( sGridNo ) == DEEP_WATER || GetTerrainType( sGridNo ) == LOW_WATER || GetTerrainType( sGridNo ) == MED_WATER ) + if ( TERRAIN_IS_WATER( bOverTerrainType) ) { return; } diff --git a/TileEngine/Tactical Placement GUI.cpp b/TileEngine/Tactical Placement GUI.cpp index 20eadc1d..58add8d6 100644 --- a/TileEngine/Tactical Placement GUI.cpp +++ b/TileEngine/Tactical Placement GUI.cpp @@ -831,6 +831,8 @@ void KillTacticalPlacementGUI() ScreenMsg( FONT_RED, MSG_ERROR, L"Substituted different entry side due to invalid entry points or map edgepoints. KM, LC : 1" ); } #endif + + MemFree( gMercPlacement); } void ChooseRandomEdgepoints() @@ -1178,7 +1180,7 @@ void PutDownMercPiece( INT32 iPlacement ) ConvertGridNoToCellXY( sGridNo, &sCellX, &sCellY ); EVENT_SetSoldierPosition( pSoldier, (FLOAT)sCellX, (FLOAT)sCellY ); EVENT_SetSoldierDirection( pSoldier, ubDirection ); - pSoldier->ubInsertionDirection = pSoldier->bDirection; + pSoldier->ubInsertionDirection = pSoldier->ubDirection; gMercPlacement[ iPlacement ].fPlaced = TRUE; gMercPlacement[ iPlacement ].pSoldier->bInSector = TRUE; } diff --git a/TileEngine/physics.cpp b/TileEngine/physics.cpp index 32458e32..9489ac69 100644 --- a/TileEngine/physics.cpp +++ b/TileEngine/physics.cpp @@ -2297,7 +2297,7 @@ void CheckForObjectHittingMerc( REAL_OBJECT *pObject, UINT16 usStructureID ) sDamage = 1; sBreath = 0; - EVENT_SoldierGotHit( pSoldier, NOTHING, sDamage, sBreath, pSoldier->bDirection, 0, pObject->ubOwner, FIRE_WEAPON_TOSSED_OBJECT_SPECIAL, 0, 0, NOWHERE ); + EVENT_SoldierGotHit( pSoldier, NOTHING, sDamage, sBreath, pSoldier->ubDirection, 0, pObject->ubOwner, FIRE_WEAPON_TOSSED_OBJECT_SPECIAL, 0, 0, NOWHERE ); pObject->ubLastTargetTakenDamage = (UINT8)( usStructureID ); } diff --git a/TileEngine/renderworld.cpp b/TileEngine/renderworld.cpp index e1847a60..e46c57d4 100644 --- a/TileEngine/renderworld.cpp +++ b/TileEngine/renderworld.cpp @@ -1602,7 +1602,7 @@ void RenderTiles(UINT32 uiFlags, INT32 iStartPointX_M, INT32 iStartPointY_M, INT } else { - sMultiTransShadowZBlitterIndex = gOneCDirection[ pSoldier->bDirection ]; + sMultiTransShadowZBlitterIndex = gOneCDirection[ pSoldier->ubDirection ]; } } else diff --git a/TileEngine/tiledef.h b/TileEngine/tiledef.h index 68a542e9..3103f733 100644 --- a/TileEngine/tiledef.h +++ b/TileEngine/tiledef.h @@ -108,20 +108,20 @@ typedef struct UINT8 bZOffsetY; // This union contains different data based on tile type - union - { +// union +// { // Land and overlay type - struct - { +// struct +// { INT16 sOffsetHeight; UINT16 usWallOrientation; UINT8 ubFullTile; // For animated tiles TILE_ANIMATION_DATA *pAnimData; - }; +// }; - }; +// }; // Reserved for added room and 32-byte boundaries BYTE bReserved[ 3 ]; @@ -139,6 +139,10 @@ typedef struct } land_undo_struct; +#define TERRAIN_IS_WATER(x) ((x) == LOW_WATER || (x) == MED_WATER || (x) == DEEP_WATER) +#define TERRAIN_IS_SHALLOW_WATER(x) ((x) == LOW_WATER || (x) == MED_WATER) +#define TERRAIN_IS_HIGH_WATER(x) ((x) == MED_WATER || (x) == DEEP_WATER) +#define TERRAIN_IS_DEEP_WATER(x) ((x) == DEEP_WATER) // Globals used extern TILE_ELEMENT gTileDatabase[ NUMBEROFTILES ]; diff --git a/TileEngine/worlddef.cpp b/TileEngine/worlddef.cpp index 92b8d7c0..4eea227b 100644 --- a/TileEngine/worlddef.cpp +++ b/TileEngine/worlddef.cpp @@ -3295,6 +3295,9 @@ void TrashWorld( void ) } } + // Reset attack busy since a militia might have been in the middle of radioing + gTacticalStatus.ubAttackBusyCount = 0; + RemoveCorpses( ); // Remove all ani tiles... diff --git a/TileEngine/worldman.cpp b/TileEngine/worldman.cpp index 10d79a73..5c56d150 100644 --- a/TileEngine/worldman.cpp +++ b/TileEngine/worldman.cpp @@ -2208,18 +2208,18 @@ BOOLEAN AddMercStructureInfoFromAnimSurface( INT16 sGridNo, SOLDIERTYPE *pSoldie } else { - fReturn = AddStructureToWorld( sGridNo, pSoldier->bLevel, &( pStructureFileRef->pDBStructureRef[ gOneCDirection[ pSoldier->bDirection ] ] ), pSoldier->pLevelNode ); + fReturn = AddStructureToWorld( sGridNo, pSoldier->bLevel, &( pStructureFileRef->pDBStructureRef[ gOneCDirection[ pSoldier->ubDirection ] ] ), pSoldier->pLevelNode ); } /* if ( fReturn == FALSE ) { // try to add default - ScreenMsg( MSG_FONT_YELLOW, MSG_DEBUG, L"FAILED: add struct info for merc: %d, at %d direction %d, trying default instead", pSoldier->ubID, sGridNo, pSoldier->bDirection ); + ScreenMsg( MSG_FONT_YELLOW, MSG_DEBUG, L"FAILED: add struct info for merc: %d, at %d direction %d, trying default instead", pSoldier->ubID, sGridNo, pSoldier->ubDirection ); pStructureFileRef = GetDefaultStructureRef( pSoldier->ubID ); if ( pStructureFileRef ) { - fReturn = AddStructureToWorld( sGridNo, pSoldier->bLevel, &( pStructureFileRef->pDBStructureRef[ gOneCDirection[ pSoldier->bDirection ] ] ), pSoldier->pLevelNode ); + fReturn = AddStructureToWorld( sGridNo, pSoldier->bLevel, &( pStructureFileRef->pDBStructureRef[ gOneCDirection[ pSoldier->ubDirection ] ] ), pSoldier->pLevelNode ); } } */ @@ -2228,9 +2228,9 @@ 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->bDirection ); + 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->bDirection ] ].pDBStructure->ubNumberOfTiles > 1 ) + if ( pStructureFileRef->pDBStructureRef[ gOneCDirection[ pSoldier->ubDirection ] ].pDBStructure->ubNumberOfTiles > 1 ) { // If we have more than one tile pSoldier->uiStatusFlags |= SOLDIER_MULTITILE_Z; @@ -3441,7 +3441,7 @@ BOOLEAN Water( INT16 sGridNo ) } pMapElement = &(gpWorldLevelData[sGridNo]); - if ( pMapElement->ubTerrainID == LOW_WATER || pMapElement->ubTerrainID == MED_WATER || pMapElement->ubTerrainID == DEEP_WATER ) + if ( TERRAIN_IS_WATER( pMapElement->ubTerrainID) ) { // check for a bridge! otherwise... return( TRUE ); @@ -3457,7 +3457,7 @@ BOOLEAN DeepWater( INT16 sGridNo ) MAP_ELEMENT * pMapElement; pMapElement = &(gpWorldLevelData[sGridNo]); - if (pMapElement->ubTerrainID == DEEP_WATER) + if (TERRAIN_IS_DEEP_WATER( pMapElement->ubTerrainID) ) { // check for a bridge! otherwise... return( TRUE ); diff --git a/gameloop.cpp b/gameloop.cpp index 43796aee..13865f21 100644 --- a/gameloop.cpp +++ b/gameloop.cpp @@ -169,6 +169,8 @@ void ShutdownGame(void) InitTacticalSave( FALSE ); ShutdownLua( ); + + FreeGameExternalOptions(); } diff --git a/gamescreen.cpp b/gamescreen.cpp index 623c90a1..20feea77 100644 --- a/gamescreen.cpp +++ b/gamescreen.cpp @@ -848,6 +848,7 @@ UINT32 MainGameScreenHandle(void) if ( gfScrollPending ) { + DeleteVideoOverlaysArea( ); AllocateVideoOverlaysArea( ); SaveVideoOverlaysArea( FRAME_BUFFER ); ExecuteVideoOverlays( ); diff --git a/ja2_2005Express.vcproj b/ja2_2005Express.vcproj index 5dd7fe3b..3f2949ec 100644 --- a/ja2_2005Express.vcproj +++ b/ja2_2005Express.vcproj @@ -345,6 +345,10 @@ RelativePath=".\ja2.h" > + + diff --git a/lua/lua.cpp b/lua/lua.cpp index 13411d0a..81425328 100644 --- a/lua/lua.cpp +++ b/lua/lua.cpp @@ -256,6 +256,31 @@ int LuaSetSoldierGrid( lua_State *L ) return 0; } +int LuaGetSoldierAPs( lua_State *L ) +{ + SOLDIERTYPE **ppSoldier = (SOLDIERTYPE**) lua_touserdata( L, 1 ); + SOLDIERTYPE *pSoldier = *ppSoldier; + if (!pSoldier) + { + lua_pushnil( L ); + } + else + { + lua_pushinteger( L, pSoldier->bActionPoints); + } + return 1; +} + +int LuaSetSoldierAPs( lua_State *L ) +{ + SOLDIERTYPE **ppSoldier = (SOLDIERTYPE**) lua_touserdata( L, 1 ); + SOLDIERTYPE *pSoldier = *ppSoldier; + int newaps = luaL_checkinteger( L, 3); + luaL_argcheck( L, newaps > 0 && newaps < 256, 2, "The grid number must be on screen!" ); + pSoldier->bActionPoints = (INT8) newaps; + return 0; +} + int LuaSoldierWalkTo( lua_State *L ) { SOLDIERTYPE **ppSoldier = (SOLDIERTYPE**) luaL_checkudata( L, 1, SOLDIER_CLASS ); @@ -282,12 +307,23 @@ int LuaSoldierRunTo( lua_State *L ) return 0; } +int LuaSoldierChangeStance( lua_State *L ) +{ + SOLDIERTYPE **ppSoldier = (SOLDIERTYPE**) luaL_checkudata( L, 1, SOLDIER_CLASS ); + SOLDIERTYPE *pSoldier = *ppSoldier; + int newstance = luaL_checkinteger( L, 2); + ChangeSoldierStance( pSoldier, (UINT8) newstance); + return 0; +} + LuaAttrib Soldier[] = { { "name", LuaGetSoldierName, }, { "fullname", LuaGetSoldierFullName, }, { "grid", LuaGetSoldierGrid, LuaSetSoldierGrid }, + { "APs", LuaGetSoldierAPs, LuaSetSoldierAPs }, { "walkto", NULL, NULL, LuaSoldierWalkTo }, { "runto", NULL, NULL, LuaSoldierRunTo }, + { "changestance", NULL, NULL, LuaSoldierChangeStance }, { NULL, }, }; diff --git a/lua/lwstring.cpp b/lua/lwstring.cpp index 81b4c539..3b92a463 100644 --- a/lua/lwstring.cpp +++ b/lua/lwstring.cpp @@ -13,7 +13,7 @@ void luaWS_newlstr (lua_State *L, const CHAR16 *str, size_t l) int size = sizewstring( l); ts = (TWString*) lua_newuserdata( L, size ); ts->len = l; - memcpy( ts->data, str, size); + memcpy( ts->data, str, l*sizeof(CHAR16)+sizeof(CHAR16)); // Make this data a wstring luaL_getmetatable(L, "wstring");