1 /* 2 * Open Fodder 3 * --------------- 4 * 5 * Copyright (C) 2008-2018 Open Fodder 6 * 7 * This program is free software; you can redistribute it and/or modify 8 * it under the terms of the GNU General Public License as published by 9 * the Free Software Foundation; either version 3 of the License, or 10 * (at your option) any later version. 11 * 12 * This program is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 * GNU General Public License for more details. 16 * 17 * You should have received a copy of the GNU General Public License along 18 * with this program; if not, write to the Free Software Foundation, Inc., 19 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 */ 22 23 #include "Sprites.hpp" 24 #include "GameData.hpp" 25 26 #define INVALID_SPRITE_PTR (sSprite*) -1 27 28 29 enum eWeaponSelected { 30 eWeapon_None = 0, 31 eWeapon_Grenade = 1, 32 eWeapon_Rocket = 3, 33 }; 34 35 enum eSquad_Weapon_SplitMode { 36 eSquad_Weapon_Split_All = 0, 37 eSquad_Weapon_Split_Half = 1, 38 eSquad_Weapon_Split_None = 2 39 }; 40 41 struct sMapPosition { 42 int16 mX; 43 int16 mY; 44 sMapPositionsMapPosition45 sMapPosition(const int16& pX = 0, const int16& pY = 0) { mX = pX; mY = pY; } 46 operator ==sMapPosition47 bool operator==(const sMapPosition& pPos) { 48 return mX == pPos.mX && mY == pPos.mY; 49 } 50 }; 51 52 union sMapTarget { 53 int32 asInt; 54 55 struct { 56 int16 mX; 57 int16 mY; 58 }; 59 }; 60 61 struct sSavedGame { 62 std::string mFileName; 63 std::string mName; 64 }; 65 66 struct sService_Draw { 67 int16 mSpriteType; 68 int16 mFrame; 69 int16 mX; 70 int16 mY; 71 sService_DrawsService_Draw72 sService_Draw(int16 pSpriteType, int16 pFrame, int16 pX, int16 pY) { 73 mSpriteType = pSpriteType; 74 mFrame = pFrame; 75 mX = pX; 76 mY = pY; 77 } 78 }; 79 80 extern const sSpriteSheet_pstuff mSpriteSheet_PStuff[209]; 81 extern const int16 mMap_Direction_Calculations[256]; 82 extern const int8 mMap_Distance_Calculations[1025]; 83 extern const int16 mMap_DirectionsBetweenPoints[]; 84 85 class cFodder { 86 public: 87 std::string mInput; 88 89 bool mOpenFodder_Intro_Done; 90 bool mSoundDisabled; 91 92 bool mVersionPlatformSwitchDisabled; 93 const sGameVersion* mVersionDefault; // Version to switch back to when looking for data 94 const sGameVersion* mVersionCurrent; // Version currently being used 95 bool mVersionReturnAfterPhase; // Return to default data after phase 96 97 std::shared_ptr<sFodderParameters> mStartParams; 98 std::shared_ptr<sFodderParameters> mParams; 99 100 std::shared_ptr<cGraphics> mGraphics; 101 std::shared_ptr<cSound> mSound; 102 std::shared_ptr<cResources> mResources; 103 std::shared_ptr<cWindow> mWindow; 104 std::shared_ptr<cVersions> mVersions; 105 106 sGameData mGame_Data; 107 sGameData mGame_Data_Backup; 108 109 cPseudorand mRandom; 110 sSprite mSprite_Spare; 111 std::vector<sSprite> mSprites; 112 113 const sSpriteSheet** mSprite_SheetPtr; 114 115 void (cFodder::*mSprite_Function[118])(sSprite* pSprite); 116 std::string mSprite_Names[118]; 117 118 std::stringstream mWindowTitle; 119 120 std::string mFilenameCopt; 121 std::string mFilenameBaseSwp; 122 std::string mFilenameBaseHit; 123 std::string mFilenameBaseBht; 124 std::string mFilenameArmy; 125 std::string mFilenameSubSwp; 126 std::string mFilenameSubHit; 127 std::string mFilenameSubBht; 128 std::string mFilenameBasePal; 129 130 cSurface* mSurfaceMapOverview; 131 cSurface* mSurface; 132 cSurface* mSurface2; 133 int32 mSurfaceMapTop, mSurfaceMapLeft; 134 135 uint8 mKeyCode; 136 137 tSharedBuffer mMap; 138 std::shared_ptr<cMap> mMapLoaded; 139 140 tSharedBuffer mTile_BaseBlk; 141 tSharedBuffer mTile_SubBlk; 142 143 bool mInput_Enabled; 144 uint16 mGame_InputTicks; 145 146 int16 mButtonPressLeft, mButtonPressRight; 147 148 bool mVehicle_Input_Disabled; 149 150 151 152 153 154 int16 mMouse_Button_Left_Toggle; 155 int16 mMouse_Button_Right_Toggle; 156 bool mMouse_Button_LeftRight_Toggle; 157 bool mMouse_Button_LeftRight_Toggle2; 158 159 int16 mMouse_Exit_Loop; 160 cPosition mMouse_EventLastPosition; 161 uint32 mMouse_EventLastButtonsPressed; 162 cPosition mMouse_EventLastWheel; 163 bool mMouse_Locked; 164 165 bool mSquad_Member_Fire_CoolDown_Override; 166 167 168 int32 dword_39F36; 169 170 int16 mMapTile_DrawX; 171 int16 mMapTile_DrawY; 172 int16 mMapTile_MoveDirectionX; 173 int16 mMapTile_MoveDirectionY; 174 int16 mMapTile_MoveDirectionX_Previous; 175 int16 mMapTile_MoveDirectionY_Previous; 176 int32 mMapTile_SpeedX; 177 int32 mMapTile_SpeedY; 178 int16 mMapTile_SpeedX_Previous; 179 int16 mMapTile_SpeedY_Previous; 180 181 int32 mMapTile_TargetX; 182 int32 mMapTile_TargetY; 183 184 int16 mCamera_Panning_ToTarget; 185 int32 mCamera_AccelerationX; 186 int32 mCamera_AccelerationY; 187 int16 mCamera_MoveDirectionX; 188 int16 mCamera_MoveDirectionY; 189 int16 mCamera_MovePauseX; 190 int16 mCamera_MovePauseY; 191 int16 mCamera_PanTargetX; 192 int16 mCamera_PanTargetY; 193 int16 mCamera_Scroll_Speed; 194 bool mCamera_Speed_Reset_X; 195 bool mCamera_Speed_Reset_Y; 196 int32 mCamera_Speed_X; 197 int32 mCamera_Speed_Y; 198 int16 mCamera_StartPosition_X; 199 int16 mCamera_StartPosition_Y; 200 int16 mCamera_SquadLeaderX; 201 int16 mCamera_SquadLeaderY; 202 int32 mCamera_TileSpeed_Overflow; 203 int16 mCamera_TileX; 204 int16 mCamera_TileY; 205 int32 mCamera_TileSpeedX; 206 int32 mCamera_TileSpeedY; 207 208 int16 mKeyCodeAscii; 209 210 sSprite* mSquad_Leader; 211 int16 mSquad_Selected; 212 int16 mSquad_JoiningTo; 213 214 int16 mSprite_Frame_1; 215 int16 mSprite_Frame_Modifier_Update_Countdown; 216 int16 mSprite_Frame_2; 217 int16 mSprite_Frame3_ChangeCount; 218 int16 mSprite_Frame_3; 219 220 bool mTroop_Weapon_Grenade_Disabled; 221 bool mTroop_Weapon_Bullet_Disabled; 222 bool mTroop_Weapon_Rocket_Disabled; 223 224 uint16 mSidebar_SmallMode; 225 int32 dword_3A030; 226 227 int8 mSquads_TroopCount[4]; 228 uint16 word_3A05F; 229 230 std::vector<sSprite*> mSprite_DrawList_First; 231 std::vector<sSprite*> mSprite_DrawList_Second; 232 std::vector<sSprite*> mSprite_DrawList_Third; 233 std::vector<sSprite*> mSprite_DrawList_Final; 234 235 std::vector<int16> mMap_PathToDest; 236 237 238 int32 mStoredSpriteX; 239 int32 mStoredSpriteY; 240 int16 mTmp_FrameNumber; 241 242 int16 mSidebar_Draw_Y; 243 int16 word_3A3BF; 244 245 int16 mDirectionMod; 246 247 sMapPosition mCheckPattern_Position; 248 249 bool mPhase_Aborted2; 250 bool mPhase_Aborted; 251 bool mPhase_EscapeKeyAbort; 252 253 bool mPhase_Complete; 254 int16 mPhase_Completed_Timer; 255 bool mPhase_In_Progress; 256 bool mPhase_Paused; 257 bool mPhase_TryAgain; 258 bool mPhase_TryingAgain; 259 260 bool mPhase_Finished; 261 int16 mPhase_ShowMapOverview; 262 263 int16 mEnemy_BuildingCount; 264 int16 mSquad_SwitchWeapon; 265 int16 word_3A9B8; 266 int16 mSquad_Walk_Target_Indexes[3]; // values here, seem to be a byte count originally.. now its an index 267 int16 mSquad_Walk_Target_Steps[3]; 268 int16 mSprite_Bumped_Into_SquadMember; 269 int16 mSprite_Player_CheckWeapon; 270 271 int8 mSprite_Projectile_Counters[4]; 272 int8 mSprite_Missile_Projectile_Counters[4]; 273 274 int32 mCamera_Speed_Max; 275 276 int16 mSprites_Found_Count; 277 278 int16 mSquad_Grenades[3]; 279 int16 mSquad_Rockets[3]; 280 281 int16 mGUI_Squad_Icon[3]; 282 283 size_t mTroops_Enemy_Count; 284 int16 mHostage_Count; 285 sSprite* mHostage_Rescue_Tent; 286 287 bool mCamera_Start_Adjust; 288 int16 word_3AA1D; // 2 = Use mSprite_Frame_3 289 int16 mCamera_Reached_Target; 290 int16 word_3AA21; 291 int16 mSprite_FaceWeaponTarget; 292 int16 word_3AA45; 293 int16 mSquad_Select_Timer; 294 int16 mSprite_Find_Distance; 295 296 int16 mSprite_Reached_Target; 297 int16 mStoredSpriteFrame; 298 int16 word_3ABB1; 299 int16 mSquad_Member_Fire_CoolDown; 300 size_t mTroop_Rotate_Next; 301 int16 mPhase_MapIs17x12; 302 sWeaponData mSprite_Weapon_Data; 303 int16 mSprite_Bullet_Time_Modifier; 304 int16 mSprite_Bullet_Fire_Speed_Modifier; 305 int16 mSquad_Member_Clicked_TroopInSameSquad; 306 sMission_Troop* mSquad_Member_Clicked_TroopPtr; 307 308 int16 mString_GapCharID; // Replace spaces in strings with this id 309 310 int16 mGUI_Loop_Squad_Current; 311 int16 mGUI_Loop_Draw_Y; 312 int16 word_3AC2D[3]; 313 int16 mGUI_Print_String_To_Sidebar; 314 int16 mGUI_Squad_NextDraw_Y; 315 int16 mGUI_Sidebar_Setup; 316 int8 mGUI_RefreshSquadGrenades[3]; 317 int8 mGUI_RefreshSquadRockets[3]; 318 int16 mSquad_CurrentWeapon[3]; 319 320 int16 mGUI_Loop_Is_CurrentSquad; 321 int16 word_3AC4B; 322 int16 word_3AC4D; 323 int16 word_3AC51; 324 sGUI_Element mGUI_Elements[42]; 325 sGUI_Element* mGUI_NextFreeElement; 326 int16 mGUI_TroopName_DrawOffset; 327 328 int16 mMap_Destroy_Tile_LastTile; 329 int16 mMap_Destroy_Tile_X; 330 int16 mMap_Destroy_Tile_Y; 331 int16 mMap_Destroy_Tiles_Countdown; 332 std::vector<sMapPosition> mMap_Destroy_Tiles; 333 334 int16 mSprite_SpareUsed; 335 int16 mSprite_SpareUsed2; 336 int16 mSquad_WalkTargetX; 337 int16 mSquad_WalkTargetY; 338 int16 mSprite_Bullet_Destroy; 339 int16 mSprite_Helicopter_DestroyLight; 340 int16 mSprite_DistanceTo_Squad0; 341 int16 mSprite_Tank_SpriteX; 342 int16 mSprite_Tank_SpriteY; 343 int16 mSprite_Tank_Squad0_X; 344 int16 mSprite_Tank_DistanceTo_Squad0; 345 int16 mSprite_Missile_LaunchDistance_X; 346 int16 mSprite_Missile_LaunchDistance_Y; 347 int16 mSprite_Bullet_Deviate_Counter; 348 int32 dword_3B1CB; 349 350 int16 mMission_EngineTicks; 351 bool mRecruit_Mission_Restarting; 352 sSprite* mMission_Troops_SpritePtrs[9]; 353 354 int16 mMission_Final_TimeToDie_Ticker; 355 int16 mMission_Final_TimeRemain; 356 int16 mMission_Final_TimeToAbort; 357 int16 mMission_Save_Blocked[0x18]; 358 359 sSprite* mSquad_CurrentVehicles[3]; 360 sSprite* mSquad_CurrentVehicle; 361 362 bool mSprite_HumanVehicles_Found; 363 std::vector<sSprite*> mSprites_HumanVehicles; 364 int16 dword_3B24B; 365 366 int16 word_3B25B; 367 int16 word_3B25D; 368 int16 mGUI_SaveLoadAction; 369 int16 word_3B2CF; 370 int16 word_3B2D1[6]; 371 int16 mSprite_Find_Types[5]; 372 int16 word_3B2ED; 373 int16 mSpawnSpriteType; 374 int16 word_3B2F1; 375 int16 word_3B2F3; 376 int16 mSprite_Field10_Saved; 377 int16 word_3B2F7; 378 379 int16 mGUI_Temp_X; 380 int16 mGUI_Temp_Width; 381 382 int16 mGUI_Temp_Y; 383 int16 mGUI_Draw_LastHeight; 384 385 void (cFodder::*mGUI_Select_File_String_Input_Callback)(int16 pPosY); 386 387 int16 mGUI_Select_File_ShownItems; 388 int16 mGUI_Select_File_CurrentIndex; 389 int16 mGUI_Select_File_Count; 390 int16 mGUI_Select_File_SelectedFileIndex; 391 392 int16 mIntro_PlayTextDuration; 393 int16 mSoundEffectToPlay_Set; 394 int16 mSoundEffectToPlay; 395 396 int16 mSquad_EnteredVehicleTimer[3]; 397 sSprite* mSprite_OpenCloseDoor_Ptr; 398 int16 mSprite_Civilian_GotHome; 399 bool mSwitchesActivated; 400 int16 mSprite_Civilian_Tmp_X; 401 int16 mSprite_Civilian_Tmp_Y; 402 int16 word_3B481; 403 int16 word_3B483; 404 int16 mHelicopterCallPadCount; 405 int16 mHelicopterCallPadPressedCount; 406 sSprite* mSprite_TroopsAlive[16]; 407 int16 mHelicopterCall_X; 408 int16 mHelicopterCall_Y; 409 sSprite* mTroop_InRange_Callpad; 410 411 int16 mGUI_Sidebar_MapButton_Prepared; 412 413 int16 mTurretFires_HomingMissile; 414 int16 word_3B4ED[2]; 415 416 int16 mImage_Aborted; 417 int16 mBriefing_Aborted; 418 419 int32 mMapTile_Ptr; // Tile in the top left corner of the screen (under the sidebar) 420 int16 mMapTile_ColumnOffset; 421 int16 mMapTile_RowOffset; 422 int16 mMapTile_MovedHorizontal; 423 int16 mMapTile_MovedVertical; 424 425 size_t mSidebar_Buffer_Size; 426 uint16* mSidebar_Screen_Buffer; 427 uint16* mSidebar_Back_Buffer; 428 429 int16 mRecruit_Button_Load_Pressed; 430 int16 mRecruit_Button_Save_Pressed; 431 int16 mRecruit_Hill_Positions_Use[0x0F]; 432 433 std::vector<sRecruitRendered> mRecruit_Rendereds; 434 std::vector<sRecruitRendered>::iterator mRecruit_RenderedNext; 435 436 bool mRecruit_Screen_Active; 437 int16 mRecruit_Sidebar_Draw_Y_Start; 438 int16 mRecruit_Truck_Animation_Play; 439 int16 mRecruit_Truck_Troops_ToEnter_Count; 440 int16 mRecruit_Truck_Frame; 441 int16 mRecruit_Truck_FrameAnimBufferPtr; 442 uint16 mRecruit_Truck_FramesPlay[100]; // This probably doesn't need to be this big 443 int16 mRecruit_Truck_Reached; 444 int16 mRecruit_Render_Name_SmallGap; 445 446 int16 mMouseX; 447 int16 mMouseY; 448 int16 mMouseX_Offset; 449 int16 mMouseY_Offset; 450 451 int32 mCameraX; 452 int32 mCameraY; 453 454 int16 mMouseCursor_Enabled; 455 456 int16 mMouseSpriteNew; 457 int16 mMouseSetToCursor; 458 int16 mMouseDisabled; 459 460 uint16 mSquad_Grenade_SplitMode; 461 uint16 mSquad_Rocket_SplitMode; 462 uint16 mGUI_Sidebar_TroopList_Name_BreakOnSpace; 463 464 sSprite* mSquad_0_Sprites[9]; 465 sSprite* mSquad_1_Sprites[9]; 466 sSprite* mSquad_2_Sprites[9]; 467 sSprite* mSquad_3_Sprites[9]; 468 sSprite* mSquad_4_Sprites[9]; 469 470 sSprite** mSquads[5]; 471 int16 mSprite_Frame1_Modifier; 472 int16 mSprite_Frame2_Modifier; 473 int16 mSprite_Frame_3_Modifier; 474 int16 mGUI_Mouse_Modifier_X; 475 int16 mGUI_Mouse_Modifier_Y; 476 477 uint16 word_3BED5[5]; 478 479 sMapTarget mSquad_WalkTargets[10][30]; 480 int8 mSquad_Join_TargetSquad[3]; 481 sSprite* mSquad_Join_TargetSprite[6]; 482 483 bool mIntroDone; 484 485 int16 mTile_Hit[512]; 486 int8 mTile_BHit[512][8]; 487 int16 mTile_Destroy_Swap[400]; 488 489 int16 mMapTile_Column_CurrentScreen; 490 int16 mMapTile_Row_CurrentScreen; 491 uint16* mSidebar_Screen_BufferPtr; 492 493 sGUI_Element mSidebar_OverlayButtons[2]; 494 495 int16 mBriefing_Render_1_Mode; 496 497 int16 mDebug_PhaseSkip; 498 int16 mKeyControlPressed; 499 500 int16 mMouseSpriteCurrent; 501 int16 mService_ExitLoop; 502 503 uint8* mVideo_Draw_FrameDataPtr; 504 int16 mVideo_Draw_PosX; 505 int16 mVideo_Draw_PosY; 506 int16 mVideo_Draw_Columns; 507 int16 mVideo_Draw_Rows; 508 uint8 mVideo_Draw_PaletteIndex; 509 size_t mDraw_Source_SkipPixelsPerRow; 510 size_t mDraw_Dest_SkipPixelsPerRow; 511 uint16 mVideo_Draw_ColumnsMax; 512 513 514 int16 word_428B6; 515 int16 word_428B8; 516 uint16 word_428BA; 517 518 uint32 mHelicopterPosX; 519 uint32 mHelicopterPosY; 520 int16 mBriefing_Helicopter_Off1; 521 int16 mBriefing_Helicopter_Off2; 522 int16 mBriefing_Helicopter_Off3; 523 const int16* mBriefing_Helicopter_Off4; 524 uint16 mBriefing_ParaHeli_Frame; 525 int16 mBriefing_Helicopter_Moving; 526 int16 word_428D8; 527 528 int16 mMouseButtonStatus; 529 int16 mInputMouseX; 530 int16 mInputMouseY; 531 532 int16 mService_Promotion_Exit_Loop; 533 std::vector<sService_Draw> mService_Draw_List; 534 535 int16 byte_44AC0; 536 int16 mInput_LastKey; 537 538 int16 mDemo_ExitMenu; 539 int16 mCustom_ExitMenu; 540 541 eCustomMode mCustom_Mode; 542 543 int64 mTicks; 544 int64 mTicksDiff; 545 std::vector<std::string> mCampaignList; 546 547 void(cFodder::*mGUI_Handle_Button_SelectSquad_Array[3])(void); 548 549 public: 550 551 bool Demo_Amiga_ShowMenu(); 552 553 void Custom_ShowMapSelection(); 554 void Campaign_Selection(); 555 556 void Campaign_Select_Sprite_Prepare(); 557 558 void Campaign_Select_Setup(); 559 560 std::string Campaign_Select_File(const char* pTitle, const char* pSubTitle, const char* pPath, const char* pType, eDataType pData = eData); 561 void Campaign_Select_File_Cycle(const char* pTitle, const char* pSubTitle); 562 void Campaign_Select_File_Loop(const char* pTitle, const char* pSubTitle); 563 void Campaign_Select_DrawMenu(const char* pTitle, const char* pSubTitle); 564 565 void Image_FadeIn(); 566 void Image_FadeOut(); 567 568 bool Engine_Loop(); 569 570 virtual int16 Mission_Loop(); 571 virtual int16 Phase_Cycle(); 572 virtual int16 Phase_Loop(); 573 void Phase_Prepare(); 574 575 void Game_Handle(); 576 void Camera_Handle(); 577 void Camera_PanTarget_AdjustToward_SquadLeader(); 578 579 void GameData_Reset(); 580 void GameData_Backup(); 581 void GameData_Restore(); 582 583 void Phase_EngineReset(); 584 void Phase_SquadPrepare(); 585 void Squad_Set_Squad_Leader(); 586 587 void Sprite_Clear_All(); 588 589 // Campaign 590 bool Campaign_Load(std::string pName); 591 592 // Map Functions 593 void Map_Create(sMapParams pParams); 594 void Map_Load(); 595 void Map_Load_Sprites(); 596 void Map_Load_Sprites_Count(); 597 void Map_Load_Resources(); 598 599 void Map_Add_Structure(const sStructure& pStructure, int16 pTileX, int16 pTileY); 600 601 bool Tiles_Load_Data(); 602 int16 Tile_FindType(const eTerrainFeature pType); 603 std::vector<int16> Tile_FindType(const eTerrainFeature pType, const eTerrainFeature pType2); 604 605 void Music_Play_Tileset(); 606 607 // Mission Functions 608 void Phase_Soldiers_Count(); 609 void Phase_Soldiers_Prepare(const bool pPrebriefing); 610 void Mission_Troop_Prepare_Next_Recruits(); 611 void Phase_Soldiers_AttachToSprites(); 612 void Mission_Troops_Clear_Selected(); 613 614 void Camera_Speed_Update_From_PanTarget(); 615 int16 sub_119E1(int16& pX1, int16& pY1, int16 pX2, int16 pY2); 616 617 void Camera_Speed_Calculate(); 618 void Camera_Prepare(); 619 void Camera_SetTargetToStartPosition(); 620 void Camera_Pan_To_Target(); 621 void Camera_Pan_Set_Speed(); 622 void Camera_Update_Mouse_Position_For_Pan(); 623 624 void MapTile_UpdateFromCamera(); 625 void Camera_Reset(); 626 void Camera_TileSpeedX_Set(); 627 void Camera_TileSpeedY_Set(); 628 void Camera_Speed_MaxSet(); 629 void Camera_Speed_Reset(); 630 void Camera_Acceleration_Set(); 631 632 void Sprite_Sort_DrawList(); 633 void Sprite_Bullet_SetData(); 634 635 void Mission_Final_Timer(); 636 637 void Phase_Goals_Check(); 638 void Phase_Goals_Set(); 639 void Phase_Progress_Check(); 640 641 void Phase_Map_Overview_Show(); 642 643 void Mission_Set_Final_TimeRemaining(); 644 void Mission_Sprites_Handle(); 645 646 void Phase_GameOver(); 647 void Phase_Paused(); 648 649 void Phase_Show_Complete(); 650 void Phase_Show_TryAgain(); 651 void Phase_TextSprite_Prepare(sSprite* pData2C); 652 void Phase_TextSprite_Create_Mission(sSprite* pData2C); 653 void Phase_TextSprite_Create_Phase(sSprite* pData2C); 654 void Phase_TextSprite_Create_Complete(sSprite* pData2C); 655 void Phase_TextSprite_Create_Try(sSprite* pData2C); 656 void Phase_TextSprite_Create_Again(sSprite* pData2C); 657 void Phase_TextSprite_Create_GameOver(sSprite* pData2C); 658 659 void Squad_Member_PhaseCount(); 660 void Squad_Set_CurrentVehicle(); 661 void Squad_EnteredVehicle_TimerTick(); 662 663 void Map_Overview_Prepare(); 664 665 void Sprite_Find_HumanVehicles(); 666 void Sprite_Count_HelicopterCallPads(); 667 668 void Sprite_HelicopterCallPad_Check(); 669 670 int16 Sprite_Create_RandomExplosion(); 671 672 void GUI_Draw_Frame_8(int32 pSpriteType, int32 pFrame, const size_t pPositionX, const size_t pPositionY); 673 void GUI_Draw_Frame_16(int16 pSpriteType, int16 pFrame, const size_t pPosX, const size_t pPosY); 674 void Sprite_Draw_Frame(sSprite* pDi, int16 pSpriteType, int16 pFrame, cSurface *pDestination = 0); 675 676 bool Sprite_OnScreen_Check(); 677 void Sprites_Draw(); 678 void Sprite_Map_Sound_Play(int16& pData0); 679 680 void Sound_Play(sSprite* pSprite, int16 pSoundEffect, int16 pData8); 681 682 // 14EAC 683 void Mission_Intro_Draw_OpenFodder(); 684 void Mission_Intro_Helicopter_Start(); 685 void Mission_Intro_Draw_Mission_Name(); 686 687 void sub_1594F(); 688 689 void CopyProtection(); 690 void CopyProtection_EncodeInput(); 691 692 /* Recruitment */ 693 int16 Recruit_Show(); 694 void Recruit_Prepare(); 695 bool Recruit_Loop(); 696 void Recruit_Draw_String(int32 pParam0, size_t pParam8, size_t pParamC, const std::string& pString); 697 void Recruit_Truck_Anim_Prepare(); 698 void Recruit_Truck_Anim_CopyFrames(uint16** pDi, const int16* pSource); 699 void Recruit_Render_Sidebar(); 700 void Recruit_Render_Squad_Names(); 701 void Recruit_Render_Squad_RankKills(); 702 void Recruit_Render_Number(int16 pNumber, int16 pData10); 703 void Recruit_Render_HeroList(); 704 void Recruit_Render_Names_UnusedSlots(); 705 void Recruit_Sidebar_Render_SquadName(); 706 void Recruit_Update_Actors(); 707 void sub_175C0(); 708 void Recruit_Update_Soldiers(); 709 void Recruit_Prepare_Anims(); 710 void Recruit_Frame_Check(); 711 void Recruit_Position_Troops(); 712 void Recruit_Update_Truck(); 713 void Recruit_Copy_Sprites(); 714 void Recruit_Cycle(); 715 void Recruit_Draw_Graves(); 716 void Recruit_Draw_Grave(int16 pSpriteType, const size_t pPosX, const size_t pPosY); 717 bool Recruit_Check_Buttons_SaveLoad(); 718 void GUI_Render_Text_Centred(const char* pText, const size_t pPosY); 719 /* End Recruitment */ 720 721 /* Promotion / Heroes */ 722 void Service_Show(); 723 void Service_KIA_Loop(); 724 void Service_Promotion_Loop(); 725 int16 Service_KIA_Troop_Prepare(); 726 int16 Service_Promotion_Prepare_Draw(); 727 void Service_Draw_Troop_And_Rank(int16 pRecruitID, int16 pRank); 728 void Service_Draw_String(const std::string& pText, const bool pLarge, const size_t pY); 729 void Service_Draw_List(); 730 void Service_ScrollUp_DrawList(); 731 void Service_Draw_String(const std::string& pText, const uint8* pData28, int16 pData0, int16 pData8, int16 pDataC); 732 int16 Service_Sprite_Draw(int16& pSpriteType, int16& pFrame, int16& pX, int16& pY); 733 int16 Service_Sprite_OnScreen_Check(); 734 void Service_Mission_Text_Prepare(); 735 void Service_Promotion_Check(); 736 737 /* End Promotion / Heroes */ 738 739 int16 Squad_Join(sSprite* pSprite); 740 741 742 void Briefing_Update_Helicopter(); 743 void Briefing_Draw_Mission_Title(int16 pDrawAtY); 744 745 void Briefing_Draw_Phase(); 746 void Briefing_Draw_With(); 747 void Briefing_DrawBox(int16 pX, int16 pY, int16 pWidth, int16 pHeight, uint8 pColor); 748 void Briefing_Draw_Horizontal_Line(int16 pX, int16 pWidth, int16 pY, uint8 pColor); 749 void Briefing_Draw_Vertical_Line(int16 pX, int16 pHeight, int16 pY, uint8 pColor); 750 751 void Briefing_Draw_Pixel(int16 pX, int16 pY, uint8 pColor); 752 753 int16 Briefing_Show(); 754 void Briefing_Show_PreReady(); 755 void Briefing_Show_Ready(); 756 757 void Mission_Intro_Play(const bool pShowHelicopter = false, eTileTypes pTileset = eTileTypes_Jungle); 758 void Intro_Print_String(const sIntroString* pString); 759 760 void Sprite_Frame_Modifier_Update(); 761 762 void Sprite_Table_Setup(); 763 764 void Sprite_Handle_Loop(); 765 void Sprite_Handle_Null(sSprite* pSprite); 766 767 void Sprite_Handle_Player(sSprite* pSprite); // 0 768 void Sprite_Handle_Grenade(sSprite* pSprite); // 2 769 void Sprite_Projectile_Counters_Decrease(sSprite* pSprite); 770 void Sprite_Handle_ShadowSmall(sSprite* pSprite); // 3 771 void Sprite_Handle_Enemy(sSprite* pSprite); // 5 772 void Sprite_Handle_Bullet(sSprite* pSprite); // 6 773 void Sprite_Handle_Helicopter(sSprite* pSprite); 774 void Sprite_Handle_Explosion(sSprite* pSprite); // 12 775 void Sprite_Handle_Shrub(sSprite* pSprite); // 13 776 void Sprite_Handle_Tree(sSprite* pSprite); // 14 777 void Sprite_Handle_BuildingRoof(sSprite* pSprite); // 15 778 void Sprite_Handle_Snowman(sSprite* pSprite); // 16 779 void Sprite_Handle_Shrub2(sSprite* pSprite); // 17 780 void Sprite_Handle_Waterfall(sSprite* pSprite); // 18 781 void Sprite_Handle_Bird2_Left(sSprite* pSprite); // 19 782 783 void Sprite_Handle_BuildingDoor(sSprite* pSprite); // 20 784 void Sprite_Handle_Player_Rank(sSprite* pSprite); // 21 785 void Sprite_Handle_Player_Shadow(sSprite* pSprite); // 22 786 void Sprite_Handle_BloodTrail(sSprite* pSprite); // 23 787 void Sprite_Handle_GroundHole(sSprite* pSprite); // 24 788 void Sprite_Handle_BuildingDoor2(sSprite* pSprite); // 25 789 void Sprite_Handle_Floating_Dead_Soldier(sSprite* pSprite); // 27 790 void Sprite_Handle_Text_Complete(sSprite* pSprite); // 28 791 void Sprite_Handle_Text_Mission(sSprite* pSprite); // 29 792 793 void Sprite_Handle_Text_Phase(sSprite* pSprite); // 30 794 void Sprite_Handle_Vehicle(sSprite* pSprite); 795 void Sprite_Handle_Rocket(sSprite* pSprite); // 33 796 void Sprite_Handle_Text_GameOver(sSprite* pSprite); // 34 797 void Sprite_Handle_Shadow(sSprite* pSprite); // 35 798 void Sprite_Handle_Enemy_Rocket(sSprite* pSprite); // 36 799 void Sprite_Handle_GrenadeBox(sSprite* pSprite); // 37 800 void Sprite_Handle_RocketBox(sSprite* pSprite); // 38 801 void Sprite_Handle_Building_Explosion(sSprite* pSprite); // 39 802 803 void Sprite_Handle_Helicopter_Grenade_Enemy(sSprite* pSprite); // 40 804 void Sprite_Handle_Flashing_Light(sSprite* pSprite); // 41 805 void Sprite_Handle_Helicopter_Grenade2_Enemy(sSprite* pSprite); // 42 806 void Sprite_Handle_Helicopter_Missile_Enemy(sSprite* pSprite); // 43 807 void Sprite_Handle_Helicopter_Homing_Enemy(sSprite* pSprite); // 44 808 void Sprite_Handle_Missile(sSprite* pSprite); // 45 809 void Sprite_Handle_MissileHoming(sSprite* pSprite); // 46 810 void Sprite_Handle_Sparks(sSprite* pSprite); // 47 811 void Sprite_Handle_FireTrail(sSprite* pSprite); // 48 812 void Sprite_Handle_Helicopter_Grenade2_Human(sSprite* pSprite); // 49 813 814 void Sprite_Handle_Helicopter_Grenade_Human(sSprite* pSprite); // 50 815 void Sprite_Handle_Helicopter_Missile_Human(sSprite* pSprite); // 51 816 void Sprite_Handle_Helicopter_Homing_Human(sSprite* pSprite); // 52 817 void Sprite_Handle_Helicopter_PropCrash(sSprite* pSprite); // 53 818 void Sprite_Handle_Mine(sSprite* pSprite); // 54 819 void Sprite_Handle_Mine2(sSprite* pSprite); // 55 820 void Sprite_Handle_Spike(sSprite* pSprite); // 56 821 void Sprite_Handle_Smoke(sSprite* pSprite); // 57 822 void Sprite_Handle_Text_Try(sSprite* pSprite); // 58 823 void Sprite_Handle_Text_Again(sSprite* pSprite); // 59 824 825 void Sprite_Handle_BoilingPot(sSprite* pSprite); // 60 826 void Sprite_Handle_Civilian(sSprite* pSprite); // 61 827 void Sprite_Handle_Civilian2(sSprite* pSprite); // 62 828 void Sprite_Handle_VehicleNoGun_Human(sSprite* pSprite); // 63 829 void Sprite_Handle_VehicleGun_Human(sSprite* pSprite); // 64 830 void Sprite_Handle_Tank_Human(sSprite* pSprite); // 65 831 void Sprite_Handle_Bird_Left(sSprite* pSprite); // 66 832 void Sprite_Handle_Bird_Right(sSprite* pSprite); // 67 833 void Sprite_Handle_Seal(sSprite* pSprite); // 68 834 void Sprite_Handle_Tank_Enemy(sSprite* pSprite); // 69 835 836 void Sprite_Handle_Civilian_Spear(sSprite* pSprite); // 70 837 void Sprite_Handle_Civilian_Spear2(sSprite* pSprite); // 71 838 void Sprite_Handle_Hostage(sSprite* pSprite); // 72 839 void Sprite_Handle_Hostage_Rescue_Tent(sSprite* pSprite); // 73 840 void Sprite_Handle_Door_Civilian(sSprite* pSprite); // 74 841 void Sprite_Handle_Door2_Civilian(sSprite* pSprite); // 75 842 void Sprite_Handle_Door_Civilian_Spear(sSprite* pSprite);// 76 843 void Sprite_Handle_Cannon(sSprite* pSprite); // 77 844 void Sprite_Handle_Turret_Missile_Human(sSprite* pSprite); // 78 845 void Sprite_Handle_Turret_Missile2_Human(sSprite* pSprite);// 79 846 847 void Sprite_Handle_VehicleNoGun_Enemy(sSprite* pSprite); // 80 848 void Sprite_Handle_VehicleGun_Enemy(sSprite* pSprite); // 81 849 void Sprite_Handle_Vehicle_Unk_Enemy(sSprite* pSprite); // 82 850 void Sprite_Handle_Civilian_Invisible(sSprite* pSprite); // 83 851 void Sprite_Handle_Turret_Missile_Enemy(sSprite* pSprite); // 84 852 void Sprite_Handle_Turret_Missile2_Enemy(sSprite* pSprite);// 85 853 void Sprite_Handle_Vehicle_Sinking_1(sSprite* pSprite); // 86 854 void Sprite_Handle_Vehicle_Sinking_2(sSprite* pSprite); // 87 855 void Sprite_Handle_BuildingDoor3(sSprite* pSprite); // 88 856 void Sprite_Handle_Explosion2(sSprite* pSprite); // 89 857 858 void Sprite_Handle_Door_Civilian_Rescue(sSprite* pSprite); // 90 859 void Sprite_Handle_Seal_Mine(sSprite* pSprite); // 91 860 void Sprite_Handle_Spider_Mine(sSprite* pSprite); // 92 861 void Sprite_Handle_Bonus_RankToGeneral(sSprite* pSprite); // 93 862 void Sprite_Handle_Bonus_Rockets(sSprite* pSprite); // 94 863 void Sprite_Handle_Bonus_Armour(sSprite* pSprite); // 95 864 void Sprite_Handle_Bonus_RankHomingInvin_SquadLeader(sSprite* pSprite); // 96 865 void Sprite_Handle_MissileHoming2(sSprite* pSprite); // 97 866 void Sprite_Handle_Bonus_RankHomingInvin_Squad(sSprite* pSprite); // 98 867 void Sprite_Handle_Helicopter_CallPad(sSprite* pSprite); // 99 868 869 void Sprite_Handle_BuildingDoor_Reinforced(sSprite* pSprite); // 100 870 void Sprite_Handle_Helicopter_Grenade2_Human_Called(sSprite* pSprite); // 101 871 void Sprite_Handle_Helicopter_Grenade_Human_Called(sSprite* pSprite); // 102 872 void Sprite_Handle_Helicopter_Missile_Human_Called(sSprite* pSprite); // 103 873 void Sprite_Handle_Helicopter_Homing_Human_Called(sSprite* pSprite); // 104 874 void Sprite_Handle_Turret_HomingMissile_Enemy(sSprite* pSprite); // 105 875 void Sprite_Handle_Enemy_Leader(sSprite* pSprite); // 106 876 void Sprite_Handle_Helicopter_Homing_Enemy2(sSprite* pSprite); // 107 877 void Sprite_Handle_Computer_1(sSprite* pSprite); // 108 878 void Sprite_Handle_Computer_2(sSprite* pSprite); // 109 879 void Sprite_Handle_Computer_3(sSprite* pSprite); // 110 880 881 // Cannon Fodder 2 Sprites 882 void Sprite_Handle_UFO_Callpad(sSprite* pSprite); // 111 883 void Sprite_Handle_Turret_Cannon_Invulnerable(sSprite* pSprite); // 112 884 void Sprite_Handle_Turret_Missile_Invulnerable(sSprite* pSprite); // 113 885 void Sprite_Handle_Looping_Vehicle_Left(sSprite* pSprite); // 114 886 void Sprite_Handle_Looping_Vehicle_Right(sSprite* pSprite); // 115 887 void Sprite_Handle_Looping_Vehicle_Up(sSprite* pSprite); // 116 888 void Sprite_Handle_Looping_Vehicle_Down(sSprite* pSprite); // 117 889 890 void Sprite_PositionNext_AdjustByHeight(sSprite* pSprite); 891 int16 sub_1D92E(sSprite* pSprite); 892 893 void Sprite_Native_Sound_Play(sSprite* pSprite, int16 pSoundID); 894 int16 Sprite_Handle_Soldier_Animation(sSprite* pSprite); 895 virtual int16 Sprite_Troop_Dies(sSprite* pSprite); 896 int16 loc_1F043(sSprite* pSprite); 897 void loc_1F092(sSprite* pSprite, sSprite* pData24); 898 899 int16 Sprite_Handle_Player_MissionOver(sSprite* pSprite); 900 void Sprite_Handle_Troop_Weapon(sSprite* pSprite); 901 void Sprite_Handle_Troop_Direct_TowardWeaponTarget(sSprite* pSprite); 902 void Sprite_Handle_Troop_Direct_TowardMouse(sSprite* pSprite); 903 904 void Sprite_XY_Store(sSprite* pSprite); 905 void Sprite_XY_Restore(sSprite* pSprite); 906 907 void Sprite_Handle_Player_Adjust_Movement_Speed(sSprite* pSprite); 908 void Sprite_Draw_Row_Update(sSprite* pSprite); 909 void Sprite_Handle_Troop_FrameUnk(sSprite* pSprite); 910 void sub_1FCF2(sSprite* pSprite); 911 void sub_1FDE7(sSprite* pSprite); 912 void Sprite_Create_Player_Shadow(sSprite* pSprite); 913 int16 Sprite_Create_BloodTrail(sSprite* pSprite, sSprite*& pData2C, sSprite*& pData30); 914 void Sprite_Terrain_Check(sSprite* pSprite, int16& pData4); 915 916 int16 Sprite_Handle_Troop_Get_Frame_For_Direction(sSprite* pSprite); 917 void Sprite_Reached_MapEdge(sSprite* pSprite); 918 919 int16 Sprite_Destroy_Wrapper(sSprite* pSprite); 920 int16 Sprite_Destroy(sSprite* pSprite); 921 int16 Sprite_Create_Bullet(sSprite* pSprite); 922 int16 Sprite_Create_Grenade(sSprite* pSprite); 923 void Sprite_Set_Direction_To_Next(sSprite* pSprite); 924 int16 Sprite_Reached_Target(sSprite* pSprite); 925 void Sprite_Movement_Speed_Update(sSprite* pSprite); 926 927 void Sprite_Handle_Player_Close_To_SquadMember(sSprite* pSprite); 928 int16 Sprite_Get_Free_Max42(int16& pData0, sSprite*& pData2C, sSprite*& pData30); 929 int16 Sprite_Get_Free_Max29(int16& pData0, sSprite*& pData2C, sSprite*& pData30); 930 931 void Sprite_Handle_Exploidable(sSprite* pSprite); 932 void Sprite_Create_Shadow(sSprite* pSprite); 933 void Sprite_Handle_Grenade_Terrain_Check(sSprite* pSprite); 934 int16 Sprite_Projectile_Collision_Check(sSprite* pSprite); 935 void Sprite_Create_Sparks(sSprite* pSprite, int16 pData18); 936 void Sprite_Create_FireTrail(sSprite* pSprite); 937 void Sprite_Turn_Into_Building_Explosion(sSprite* pSprite); 938 int16 Sprite_Create_Building_Explosion_Wrapper(int16& pX, int16& pY); 939 int16 Sprite_Create_Building_Explosion(sSprite* pData2C, int16& pX, int16& pY); 940 int16 Sprite_Create_Enemy(sSprite* pSprite, sSprite*& pData2C); 941 void Sprite_Enemy_Aggression_Update(sSprite* pData2C); 942 void Sprite_Create_Rank(); 943 void sub_21CD1(sSprite* pSprite); 944 945 void sub_2212A(sSprite* pSprite); 946 int16 Sprite_Handle_BuildingDoor_Explode(sSprite* pSprite); 947 int16 sub_222A3(sSprite* pSprite); 948 void sub_223B2(sSprite* pSprite); 949 int16 Map_Get_Distance_Between_Sprite_And_Squadleader(sSprite* pSprite, int16& pData0); 950 int16 Sprite_Create_Rocket(sSprite* pSprite); 951 int16 Sprite_Homing_LockInRange(sSprite* pSprite, sSprite*& pFoundSprite); 952 void Sprite_Projectile_HitTarget(sSprite* pSprite); 953 void Sprite_Destroy_Wrapper_At_TopLeft(sSprite* pSprite); 954 int16 Sprite_Destroy_Wrapper_2(sSprite* pSprite); 955 void Sprite_Handle_Player_InVehicle(sSprite* pSprite); 956 void Sprite_Handle_Player_Enter_Vehicle(sSprite* pSprite); 957 void sub_22C87(sSprite* pSprite); 958 void sub_22CD7(sSprite* pSprite, int16& Data0, int16& Data4); 959 void Sprite_Handle_Vehicle_Terrain_Check(sSprite* pSprite); 960 void Sprite_Under_Vehicle(sSprite* pSprite, int16 pData8, int16 pDataC, int16 pData10, int16 pData14, int16 pData18, int16 pData1C); 961 int16 Sprite_Animation_SlideOrDie(sSprite* pSprite); 962 int16 Map_Sprite_Check_Around_Position(sSprite* pSprite); 963 void Sprite_Handle_Vehicle_Human(sSprite* pSprite); 964 int16 Sprite_Create_Smoke(sSprite* pSprite, sSprite*& pData2C); 965 void sub_23525(sSprite* pSprite); 966 void sub_236F7(sSprite* pSprite); 967 void Sprite_Handle_Tank_FireMissile(sSprite* pSprite); 968 int16 Sprite_Create_Missile(sSprite* pSprite, sSprite*& pData2C); 969 void Sprite_Enemy_Set_Target(sSprite* pData2C); 970 void Sprite_Handle_Helicopter_Human(sSprite* pSprite); 971 int16 Sprite_Handle_Helicopter_Terrain_Check(sSprite* pSprite); 972 void sub_23E01(sSprite* pSprite, int16& pData0, int16& pData4); 973 void Sprites_HumanVehicles_Remove(sSprite* pSprite); 974 void Sprite_Handle_Turret(sSprite* pSprite); 975 void Sprite_Handle_Turret_Fire(sSprite* pSprite, sSprite* pData34); 976 int16 Sprite_Find_By_Types(sSprite* pSprite, int16& pData0, int16& pData4, int16& pData8, int16& pDataC, int16& pData10, sSprite*& pData28); 977 void sub_243E9(sSprite* pSprite); 978 int16 Sprite_Handle_Vehicle_Sinking(sSprite* pSprite); 979 void sub_245BF(sSprite* pSprite); 980 int16 Sprite_Create_Cannon(sSprite* pSprite); 981 void Sprite_Handle_Helicopter_Human_Deploy_Weapon(sSprite* pSprite); 982 int16 Sprite_Create_Grenade2(sSprite* pSprite); 983 int16 Sprite_Create_MissileHoming(sSprite* pSprite, sSprite*& pData2C, sSprite*& pData34); 984 int16 Sprite_Handle_Helicopter_Enemy_Weapon(sSprite* pSprite, sSprite*& pData30); 985 void Sprite_Handle_Vehicle_Enemy(sSprite* pSprite); 986 void Sprite_Handle_Helicopter_Enemy(sSprite* pSprite); 987 void Sprite_Handle_Civilian_Unk(sSprite* pSprite); 988 void Sprite_Handle_Civilian_Movement(sSprite* pSprite); 989 int16 Sprite_Handle_Civilian_Within_Range_OpenCloseDoor(sSprite* pSprite); 990 void Sprite_Handle_Civilian_Death(sSprite* pSprite); 991 void sub_2593D(sSprite* pSprite); 992 void sub_25A31(sSprite* pSprite); 993 void sub_25A66(sSprite* pSprite); 994 int16 Sprite_Handle_Civilian_RandomMovement(sSprite* pSprite); 995 int16 Sprite_Create_Civilian_Spear2(sSprite* pSprite); 996 int16 sub_25DCF(sSprite* pSprite); 997 void sub_25F2B(sSprite* pSprite); 998 void Sprite_Handle_Hostage_Movement(sSprite* pSprite); 999 void Sprite_Handle_Hostage_FrameUpdate2(sSprite* pSprite); 1000 void Sprite_Handle_Hostage_FrameUpdate(sSprite* pSprite); 1001 void sub_26490(sSprite* pSprite); 1002 void sub_264B0(sSprite* pSprite); 1003 int16 Sprite_Create_Native(sSprite* pSprite, sSprite*& pData2C, sSprite*& pData30); 1004 int16 Sprite_Handle_Helicopter_Callpad_InRange(sSprite* pSprite, sSprite*& pData2C); 1005 void Sprite_Handle_Helicopter_Human_CallCheck(sSprite* pSprite); 1006 void Sprite_Handle_Computer(sSprite* pSprite, int16 pData1C); 1007 1008 int16 Map_Get_Distance_BetweenSprites_Within_Window(const sSprite* pSprite, const sSprite* pSprite2); 1009 int16 Map_Get_Distance_BetweenPoints_Within_Window(int16& pX, int16 pY, int16& pX2, int16& pY2); 1010 int16 Direction_Between_Points(int16& pData0, int16& pData4, int16& pData8, int16& pDataC); 1011 1012 int16 map_GetRandomX(); 1013 int16 map_GetRandomY(); 1014 1015 int16 tool_RandomGet(); 1016 uint16 tool_RandomGet(size_t pMin, size_t pMax); 1017 1018 void Sprite_Movement_Calculate(sSprite* pSprite); 1019 int16 Sprite_Direction_Between_Points(sSprite* pSprite, int16& pData0, int16& pData4); 1020 void sub_2A3D4(sSprite* pSprite); 1021 void Squad_Walk_Steps_Decrease(); 1022 int16 Map_PathCheck_CalculateTo(int16& pX1, int16& pY1, int16& pX2, int16& pY2); 1023 void Map_PathCheck_Generate(int16& pX1, int16& pY1, int16& pX2, int16& pY2, int16& pData18, int16& pData1C); 1024 int16 Map_PathCheck_CanPass(int16& pData0); 1025 int16 Map_Get_Distance_BetweenPoints(int16& pPosX, int16& pPosY, int16& pPosX2, int16& pDistanceMax, int16& pPosY2); 1026 int32 Map_Get_Distance_BetweenPositions(cPosition pPos1, cPosition pPos2, int32 pDistanceMax); 1027 1028 int16 Map_Terrain_Get_Type_And_Walkable(int16& pY, int16& pX); 1029 int16 Map_Terrain_Get_Type_And_Walkable(sSprite* pSprite, int16& pY, int16& pX); 1030 int16 Map_Terrain_Get(int16& pY, int16& pX, int16& pData10, int16& pData14); 1031 int16 Map_Terrain_Get(int16 pX, int16 pY); 1032 int16 Tile_Terrain_Get(const int16 pTileID, int16 pX, int16 pY); 1033 1034 void Squad_Walk_Target_SetAll(int16 pValue); 1035 void Squad_Walk_Target_Set(int16 pTargetX, int16 pTargetY, int16 pSquadNumber, int16 pData10); 1036 int16 Squad_Member_Sprite_Hit_In_Region(sSprite* pSprite, int16 pData8, int16 pDataC, int16 pData10, int16 pData14); 1037 1038 const sSpriteSheet* Sprite_Get_Sheet(int16 pSpriteType, int16 pFrame); 1039 1040 void sub_2AEB6(int16 pColumns, int16 pRows, int16 *pData8, int16* pDataC); 1041 1042 void Sprite_SetDirectionMod(sSprite* pSprite); 1043 void Sprite_Vehicle_Direction_Update(sSprite* pSprite, int16& pData1C); 1044 1045 int16 Map_Terrain_Get_Moveable_Wrapper(const int8* pMovementData, int16& pX, int16& pY, int16& pData10, int16& pData14); 1046 int16 Map_Terrain_Get_Moveable(const int8* pMovementData, int16& pX, int16& pY); 1047 1048 void Map_Get_Distance_BetweenPoints_Within_640(int16& pX, int16& pY, int16& pX2, int16& pY2); 1049 1050 bool MapTile_Update_Position(); 1051 1052 void MapTile_Move_Right(int16 pPanTiles); 1053 void MapTile_Move_Left(int16 pPanTiles); 1054 void MapTile_Move_Down(int16 pPanTiles); 1055 void MapTile_Move_Up(int16 pPanTiles); 1056 1057 void MapTile_Update_Y(); 1058 void MapTile_Update_X(); 1059 1060 int32 MapTile_Get(const size_t pTileX, const size_t pTileY); 1061 void MapTile_Set(const size_t pTileX, const size_t pTileY, const size_t pTileID); 1062 sSprite* Sprite_Add(const size_t pSpriteID, const int16 pTileX, const int16 pTileY); 1063 1064 void Squad_Troops_Count(); 1065 int16 Mission_Troop_GetDeviatePotential(sMission_Troop* pSquadMember); 1066 void Squad_Member_Rotate_Can_Fire(); 1067 int16 Sprite_Find_In_Region(sSprite* pSprite, sSprite*& pData24, int16 pData8, int16 pDataC, int16 pData10, int16 pData14); 1068 void Sprite_Handle_Player_DestroyAll(); 1069 void Sprite_Handle_Player_Destroy_Unk(); 1070 void Squad_Prepare_GrenadesAndRockets(); 1071 void Sprite_Aggression_Set(); 1072 void Sprite_Handle_Enemy_Aggression_Set(sSprite* pSprite); 1073 int16 Sprite_Next_WalkTarget_Set(sSprite* pSprite); 1074 int16 Squad_Join_Check(sSprite* pSprite); 1075 void Squad_Walk_Target_Update(int16 pData0); 1076 void Sprite_Handle_Explosion_MapTiles(sSprite* pSprite); 1077 void Map_Destroy_Tiles(); 1078 void Map_Destroy_Tiles_Next(); 1079 1080 void Game_Load(); 1081 std::vector<sSavedGame> Game_Load_Filter(const std::vector<std::string>& pFiles); 1082 1083 void Game_Save(); 1084 bool GameOverCheck(); 1085 1086 void GUI_Handle_Element_Mouse_Check(sGUI_Element* pData20); 1087 1088 void Game_Save_Wrapper(); 1089 1090 void GUI_Element_Reset(); 1091 1092 void GUI_Button_Setup(void(cFodder::*pFunction)(void)); 1093 void GUI_Button_Setup_Small(void(cFodder::*pFunction)(void)); 1094 1095 void GUI_Button_Draw(std::string pText, const size_t pY, const size_t pColorShadow = 0xBF, const size_t pColorPrimary = 0xBC); 1096 void GUI_Button_Draw_Small(const std::string pText, const size_t pY, const size_t pColorShadow = 0xBF, const size_t pColorPrimary = 0xBC); 1097 void GUI_Button_Draw_SmallAt(const std::string pText, const size_t pX, const size_t pY, const size_t pColorShadow = 0xBF, const size_t pColorPrimary = 0xBC); 1098 1099 void GUI_Box_Draw(const size_t pColorShadow, const size_t pColorPrimary); 1100 void GUI_Select_File_Loop(bool pShowCursor); 1101 std::string GUI_Select_File(const char* pTitle, const std::vector<sSavedGame>& pSave, const std::vector<std::string> &pMaps); 1102 1103 1104 void GUI_Input_CheckKey(); 1105 void GUI_Button_Load_MouseWheel(); 1106 void GUI_Button_Load_Up(); 1107 void GUI_Button_Load_Down(); 1108 void GUI_Button_Load_Exit(); 1109 void GUI_Button_Show_About(); 1110 void GUI_Button_Filename(); 1111 1112 int16 GUI_Button_NoAction(); 1113 void GUI_Button_NoAction2(); 1114 void GUI_Sidebar_Prepare_Squads(); 1115 1116 void GUI_Button_SelectQuiz(); 1117 void GUI_Button_SelectMap0(); 1118 void GUI_Button_SelectMap1(); 1119 void GUI_Button_SelectMap2(); 1120 void GUI_Button_SelectMap3(); 1121 void GUI_Element_Mouse_Over(const sGUI_Element *pA0); 1122 void Demo_Quiz(); 1123 void GUI_Button_ExitMenu(); 1124 void GUI_Button_Quiz_2(); 1125 void GUI_Button_Quiz_3(); 1126 void GUI_Button_Quiz_4(); 1127 void GUI_Button_Quiz_5(); 1128 void GUI_Button_Quiz_6(); 1129 void GUI_Button_Quiz_7(); 1130 void GUI_Button_Quiz_8(); 1131 void GUI_Button_Quiz_9(); 1132 void GUI_Button_Quiz_10(); 1133 void GUI_Button_Quiz_11(); 1134 void Demo_Quiz_ShowScreen(const char* pFilename); 1135 1136 void GUI_Loop_Draw_Prepare(int16& pData0, int16& pData4); 1137 void GUI_Sidebar_Prepare(int16 pData0, int16 pData4); 1138 void GUI_Sidebar_Add_Sidebar_Overlay(); 1139 void GUI_SetElementsFrom(sGUI_Element* pTo, sGUI_Element* pFrom); 1140 void GUI_ClearElement(sGUI_Element *pData20); 1141 void GUI_Sidebar_SplitButton_Draw(); 1142 void GUI_Prepare_Button_Squad(); 1143 void GUI_Handle_Button_SelectSquad_0(); 1144 void GUI_Handle_Button_SelectSquad_1(); 1145 void GUI_Handle_Button_SelectSquad_2(); 1146 void Squad_Select(int16 pData4, bool pCheckMouse = true); 1147 void GUI_Handle_Button_SplitSquad(); 1148 void Mission_Set_Initial_Weapon(); 1149 1150 void MapTiles_Draw(); 1151 1152 void Recruit_CheckLoadSaveButtons(); 1153 void GUI_Sidebar_Grenades_Draw(); 1154 1155 void GUI_Prepare_Button_Grenade(); 1156 void GUI_Handle_Button_Grenades(); 1157 virtual void GUI_Sidebar_TroopList_Draw(); 1158 void GUI_Sidebar_TroopList_Name_Draw(int16 pData0, int16 pData8, int16 pDataC, const char* pData28); 1159 void GUI_Sidebar_SquadIcon_Update(); 1160 void GUI_Sidebar_SquadIcon_Current_Draw(); 1161 int16 GUI_Sidebar_SquadIcon_Set(); 1162 void GUI_Sidebar_Draw(); 1163 void GUI_Sidebar_SquadIcons_Draw(); 1164 void GUI_Sidebar_Grenades_CurrentSquad_Draw(); 1165 void GUI_Sidebar_Grenades_Draw(int16 pData0); 1166 void GUI_Sidebar_Rockets_CurrentSquad_Draw(); 1167 void GUI_Sidebar_Rockets_Draw(int16 pData0); 1168 int16 GUI_Sidebar_SelectedTroops_Count(); 1169 void GUI_Sidebar_Setup(); 1170 void sub_2FA05(); 1171 void GUI_Sidebar_MapButton_Prepare(); 1172 void GUI_Sidebar_Squad0_Prepare(); 1173 void GUI_Sidebar_Squad1_Prepare(); 1174 void GUI_Sidebar_Squad2_Prepare(); 1175 1176 void GUI_Sidebar_Ready(); 1177 void GUI_Sidebar_Rockets_Draw(); 1178 1179 void GUI_Prepare_Button_Rockets(); 1180 void GUI_Handle_Button_Rockets(); 1181 1182 void GUI_Prepare_Button_TroopName(); 1183 void GUI_Handle_Button_TroopName(); 1184 1185 void Squad_Select_Grenades(); 1186 void Squad_Select_Rockets(); 1187 1188 int16 sub_2FF41(); 1189 1190 void Squad_Split_Assets(); 1191 1192 void GUI_Sidebar_MapButton_RenderWrapper(); 1193 void GUI_Sidebar_Number_Draw(int16 pNumber, int16 pX, int16 pData8, int16 pY, int16 pData10); 1194 void GUI_Sidebar_MapButton_Render(); 1195 void GUI_Handle_Button_ShowOverview(); 1196 void sub_3037A(); 1197 void sub_3049B(); 1198 void GUI_Sidebar_Rockets_Refresh_CurrentSquad_Wrapper(); 1199 void Squad_Member_Click_Check(); 1200 1201 void sub_303AE(); 1202 void Sidebar_Render_SquadIcon(); 1203 void GUI_Sidebar_Squad_Split_Icon_Draw(); 1204 void Sidebar_Render_To_BackBuffer(); 1205 void Sidebar_Render_To_ScreenBuffer(); 1206 void Squad_Switch_Weapon(); 1207 void Mission_Final_TimeToDie(); 1208 int16 sub_305D5(sSprite*& pData20); 1209 1210 void Squad_Member_Target_Set(); 1211 1212 void Squad_Switch_Timer(); 1213 void Squad_Switch_To(int16 pData0); 1214 void Vehicle_Input_Handle(); 1215 void sub_311A7(); 1216 int16 sub_313CD(); 1217 void Vehicle_Target_Set(); 1218 1219 void String_CalculateWidth(int32 pPosX, const uint8* pWidths, const std::string& pString); 1220 void String_CalculateWidth(int32 pPosX, const uint8* pWidths, const char* pString); 1221 1222 void String_Print(const uint8* pWidths, int32 pFontSpriteID, size_t pParam08, size_t pParamC, const char* pText); 1223 void String_Print(const uint8* pWidths, int32 pFontSpriteID, size_t pParam08, size_t pParamC, const std::string& pText); 1224 1225 void intro_LegionMessage(); 1226 int16 intro_Play(); 1227 1228 void intro_main(); 1229 1230 void intro_Retail(); 1231 void intro_AmigaTheOne(); 1232 void Intro_OpenFodder(); 1233 1234 void Sidebar_Clear_ScreenBufferPtr(); 1235 1236 void WonGame(); 1237 1238 void Video_SurfaceRender( const bool pRestoreSurface = true ); 1239 void Cycle_End(); 1240 1241 void sleepLoop(int64 pMilliseconds); 1242 int16 ShowImage_ForDuration(const std::string& pFilename, uint16 pDuration, size_t pBackColor = 0, bool pCanAbort = true); 1243 1244 void Mouse_ButtonCheck(); 1245 int16 Mouse_Button_Left_Toggled(); 1246 int16 Mouse_Button_Right_Toggled(); 1247 void Mouse_Cursor_Handle(); 1248 void Mouse_Cursor_Update(); 1249 void Mouse_DrawCursor(); 1250 virtual void Mouse_Inputs_Get(); 1251 void Mouse_Inputs_Check(); 1252 void Mouse_Setup(); 1253 1254 void eventProcess(const cEvent& pEvent); 1255 void eventsProcess(); 1256 void keyProcess(uint8 pKeyCode, bool pPressed); 1257 1258 void Game_Setup(); 1259 GetGraphics()1260 template <typename tType> std::shared_ptr<tType> GetGraphics() { 1261 return std::dynamic_pointer_cast<tType>(mGraphics); 1262 } 1263 GetSound()1264 template <typename tType> std::shared_ptr<tType> GetSound() { 1265 return std::dynamic_pointer_cast<tType>(mSound); 1266 } 1267 1268 public: 1269 1270 cFodder(std::shared_ptr<cWindow> pWindow); 1271 virtual ~cFodder(); 1272 1273 void SetActiveSpriteSheetPtr(const sSpriteSheet** pSpriteSheet); 1274 1275 void String_Input_Print(int16 pPosY); 1276 void String_Input_Check(); 1277 1278 void String_Print_Small(std::string pText, const size_t pY); 1279 void String_Print_Small(std::string pText, const size_t pX, const size_t pY); 1280 void String_Print_Large(std::string pText, const bool pOverAndUnderLine, const size_t pY); 1281 void String_Print_Large(std::string pText, const bool pOverAndUnderLine, const size_t pX, const size_t pY); 1282 1283 void DataNotFound(); 1284 virtual void Prepare(std::shared_ptr<sFodderParameters> pParams); 1285 1286 void Playground(); 1287 1288 void About(); 1289 void CreateRandom(); 1290 virtual void Start(); 1291 void Exit(unsigned int pExitCode); 1292 1293 void WindowTitleSet(bool pInMission); 1294 void WindowTitleBaseSetup(); 1295 1296 void Menu_Button_Reset(); 1297 void Menu_Loop(const std::function<void()> pButtonHandler); 1298 bool Menu_Draw(const std::function<void()> pButtonHandler); 1299 1300 bool Demo_Load(); 1301 void Window_UpdateScreenSize(); 1302 1303 void VersionSwitch(const sGameVersion* pVersion); 1304 1305 cDimension getSurfaceSize() const; 1306 cDimension getWindowSize() const; 1307 int16 getWindowWidth() const; 1308 1309 int16 getWindowRows() const; 1310 int16 getWindowColumns() const; 1311 1312 int16 getCameraWidth() const; 1313 int16 getCameraHeight() const; 1314 }; 1315