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