TombEngine/TR5Main/Game/gui.h
2021-12-24 03:32:19 +03:00

613 lines
14 KiB
C++

#pragma once
#include "Scripting/LanguageScript.h"
#include "Specific/configuration.h"
enum class InventoryMode
{
None,
InGame,
Pause,
Statistics,
Examine,
Diary,
Load,
Save
};
enum class InventoryResult
{
None,
UseItem,
NewGame,
LoadGame,
SaveGame,
ExitGame,
ExitToTitle,
NewGameSelectedLevel
};
enum class MenuType
{
None,
Use,
ChooseAmmo,
Combine,
Seperate,
Equip,
Ammo1,
Ammo2,
Ammo3,
Load,
Save,
Examine,
Statistics,
Diary
};
enum ItemOptions : uint64_t
{
OPT_ALWAYSCOMBINE = 1 << 0,
OPT_EQUIP = 1 << 1,
OPT_USE = 1 << 2,
OPT_COMBINABLE = 1 << 3,
OPT_SEPERATABLE = 1 << 4,
OPT_EXAMINABLE = 1 << 5,
OPT_CHOOSEAMMO_SHOTGUN = 1 << 6,
OPT_CHOOSEAMMO_CROSSBOW = 1 << 7,
OPT_CHOOSEAMMO_GRENADEGUN = 1 << 8,
OPT_CHOOSEAMMO_UZI = 1 << 9,
OPT_CHOOSEAMMO_PISTOLS = 1 << 10,
OPT_CHOOSEAMMO_REVOLVER = 1 << 11,
OPT_LOAD = 1 << 12,
OPT_SAVE = 1 << 13,
OPT_CHOOSEAMMO_HK = 1 << 14,
OPT_STATS = 1 << 15,
OPT_CHOOSEAMMO_HARPOON = 1 << 16,
OPT_CHOOSEAMMO_ROCKET = 1 << 17,
OPT_DIARY = 1 << 18
};
enum RotationFlags
{
INV_ROT_X = 1,
INV_ROT_Y = 2,
INV_ROT_Z = 4
};
enum class RingTypes
{
Inventory,
Ammo
};
enum class Menu
{
Title,
Pause,
Statistics,
SelectLevel,
LoadGame,
Options,
Display,
Controls,
Sound
};
enum InventoryObjectTypes
{
// Weapons and ammos
INV_OBJECT_PISTOLS,
INV_OBJECT_PISTOLS_AMMO,
INV_OBJECT_UZIS,
INV_OBJECT_UZI_AMMO,
INV_OBJECT_SHOTGUN,
INV_OBJECT_SHOTGUN_AMMO1,
INV_OBJECT_SHOTGUN_AMMO2,
INV_OBJECT_REVOLVER,
INV_OBJECT_REVOLVER_AMMO,
INV_OBJECT_REVOLVER_LASER,
INV_OBJECT_CROSSBOW,
INV_OBJECT_CROSSBOW_LASER,
INV_OBJECT_CROSSBOW_AMMO1,
INV_OBJECT_CROSSBOW_AMMO2,
INV_OBJECT_CROSSBOW_AMMO3,
INV_OBJECT_HK,
INV_OBJECT_HK_SILENCER,
INV_OBJECT_HK_AMMO,
INV_OBJECT_GRENADE_LAUNCHER,
INV_OBJECT_GRENADE_AMMO1,
INV_OBJECT_GRENADE_AMMO2,
INV_OBJECT_GRENADE_AMMO3,
INV_OBJECT_HARPOON_GUN,
INV_OBJECT_HARPOON_AMMO,
INV_OBJECT_ROCKET_LAUNCHER,
INV_OBJECT_ROCKET_AMMO,
// Misc objects
INV_OBJECT_LASERSIGHT,
INV_OBJECT_SILENCER,
INV_OBJECT_LARGE_MEDIPACK,
INV_OBJECT_SMALL_MEDIPACK,
INV_OBJECT_BINOCULARS,
INV_OBJECT_FLARES,
INV_OBJECT_TIMEX,
INV_OBJECT_LOAD_FLOPPY,
INV_OBJECT_SAVE_FLOPPY,
INV_OBJECT_BRUNING_TORCH,
INV_OBJECT_CROWBAR,
INV_OBJECT_DIARY,
INV_OBJECT_COMPASS,
INV_OBJECT_BEETLE,
INV_OBJECT_BEETLE_PART1,
INV_OBJECT_BEETLE_PART2,
INV_OBJECT_SMOL_WATERSKIN,
INV_OBJECT_SMOL_WATERSKIN1L,
INV_OBJECT_SMOL_WATERSKIN2L,
INV_OBJECT_SMOL_WATERSKIN3L,
INV_OBJECT_BIG_WATERSKIN,
INV_OBJECT_BIG_WATERSKIN1L,
INV_OBJECT_BIG_WATERSKIN2L,
INV_OBJECT_BIG_WATERSKIN3L,
INV_OBJECT_BIG_WATERSKIN4L,
INV_OBJECT_BIG_WATERSKIN5L,
INV_OBJECT_OPEN_DIARY,
// Puzzle, keys, pickups, examines
INV_OBJECT_PUZZLE1,
INV_OBJECT_PUZZLE2,
INV_OBJECT_PUZZLE3,
INV_OBJECT_PUZZLE4,
INV_OBJECT_PUZZLE5,
INV_OBJECT_PUZZLE6,
INV_OBJECT_PUZZLE7,
INV_OBJECT_PUZZLE8,
INV_OBJECT_PUZZLE9,
INV_OBJECT_PUZZLE10,
INV_OBJECT_PUZZLE11,
INV_OBJECT_PUZZLE12,
INV_OBJECT_PUZZLE13,
INV_OBJECT_PUZZLE14,
INV_OBJECT_PUZZLE15,
INV_OBJECT_PUZZLE16,
INV_OBJECT_PUZZLE1_COMBO1,
INV_OBJECT_PUZZLE1_COMBO2,
INV_OBJECT_PUZZLE2_COMBO1,
INV_OBJECT_PUZZLE2_COMBO2,
INV_OBJECT_PUZZLE3_COMBO1,
INV_OBJECT_PUZZLE3_COMBO2,
INV_OBJECT_PUZZLE4_COMBO1,
INV_OBJECT_PUZZLE4_COMBO2,
INV_OBJECT_PUZZLE5_COMBO1,
INV_OBJECT_PUZZLE5_COMBO2,
INV_OBJECT_PUZZLE6_COMBO1,
INV_OBJECT_PUZZLE6_COMBO2,
INV_OBJECT_PUZZLE7_COMBO1,
INV_OBJECT_PUZZLE7_COMBO2,
INV_OBJECT_PUZZLE8_COMBO1,
INV_OBJECT_PUZZLE8_COMBO2,
INV_OBJECT_PUZZLE9_COMBO1,
INV_OBJECT_PUZZLE9_COMBO2,
INV_OBJECT_PUZZLE10_COMBO1,
INV_OBJECT_PUZZLE10_COMBO2,
INV_OBJECT_PUZZLE11_COMBO1,
INV_OBJECT_PUZZLE11_COMBO2,
INV_OBJECT_PUZZLE12_COMBO1,
INV_OBJECT_PUZZLE12_COMBO2,
INV_OBJECT_PUZZLE13_COMBO1,
INV_OBJECT_PUZZLE13_COMBO2,
INV_OBJECT_PUZZLE14_COMBO1,
INV_OBJECT_PUZZLE14_COMBO2,
INV_OBJECT_PUZZLE15_COMBO1,
INV_OBJECT_PUZZLE15_COMBO2,
INV_OBJECT_PUZZLE16_COMBO1,
INV_OBJECT_PUZZLE16_COMBO2,
INV_OBJECT_KEY1,
INV_OBJECT_KEY2,
INV_OBJECT_KEY3,
INV_OBJECT_KEY4,
INV_OBJECT_KEY5,
INV_OBJECT_KEY6,
INV_OBJECT_KEY7,
INV_OBJECT_KEY8,
INV_OBJECT_KEY9,
INV_OBJECT_KEY10,
INV_OBJECT_KEY11,
INV_OBJECT_KEY12,
INV_OBJECT_KEY13,
INV_OBJECT_KEY14,
INV_OBJECT_KEY15,
INV_OBJECT_KEY16,
INV_OBJECT_KEY1_COMBO1,
INV_OBJECT_KEY1_COMBO2,
INV_OBJECT_KEY2_COMBO1,
INV_OBJECT_KEY2_COMBO2,
INV_OBJECT_KEY3_COMBO1,
INV_OBJECT_KEY3_COMBO2,
INV_OBJECT_KEY4_COMBO1,
INV_OBJECT_KEY4_COMBO2,
INV_OBJECT_KEY5_COMBO1,
INV_OBJECT_KEY5_COMBO2,
INV_OBJECT_KEY6_COMBO1,
INV_OBJECT_KEY6_COMBO2,
INV_OBJECT_KEY7_COMBO1,
INV_OBJECT_KEY7_COMBO2,
INV_OBJECT_KEY8_COMBO1,
INV_OBJECT_KEY8_COMBO2,
INV_OBJECT_KEY9_COMBO1,
INV_OBJECT_KEY9_COMBO2,
INV_OBJECT_KEY10_COMBO1,
INV_OBJECT_KEY10_COMBO2,
INV_OBJECT_KEY11_COMBO1,
INV_OBJECT_KEY11_COMBO2,
INV_OBJECT_KEY12_COMBO1,
INV_OBJECT_KEY12_COMBO2,
INV_OBJECT_KEY13_COMBO1,
INV_OBJECT_KEY13_COMBO2,
INV_OBJECT_KEY14_COMBO1,
INV_OBJECT_KEY14_COMBO2,
INV_OBJECT_KEY15_COMBO1,
INV_OBJECT_KEY15_COMBO2,
INV_OBJECT_KEY16_COMBO1,
INV_OBJECT_KEY16_COMBO2,
INV_OBJECT_PICKUP1,
INV_OBJECT_PICKUP2,
INV_OBJECT_PICKUP3,
INV_OBJECT_PICKUP4,
INV_OBJECT_PICKUP5,
INV_OBJECT_PICKUP6,
INV_OBJECT_PICKUP7,
INV_OBJECT_PICKUP8,
INV_OBJECT_PICKUP9,
INV_OBJECT_PICKUP10,
INV_OBJECT_PICKUP11,
INV_OBJECT_PICKUP12,
INV_OBJECT_PICKUP13,
INV_OBJECT_PICKUP14,
INV_OBJECT_PICKUP15,
INV_OBJECT_PICKUP16,
INV_OBJECT_PICKUP1_COMBO1,
INV_OBJECT_PICKUP1_COMBO2,
INV_OBJECT_PICKUP2_COMBO1,
INV_OBJECT_PICKUP2_COMBO2,
INV_OBJECT_PICKUP3_COMBO1,
INV_OBJECT_PICKUP3_COMBO2,
INV_OBJECT_PICKUP4_COMBO1,
INV_OBJECT_PICKUP4_COMBO2,
INV_OBJECT_PICKUP5_COMBO1,
INV_OBJECT_PICKUP5_COMBO2,
INV_OBJECT_PICKUP6_COMBO1,
INV_OBJECT_PICKUP6_COMBO2,
INV_OBJECT_PICKUP7_COMBO1,
INV_OBJECT_PICKUP7_COMBO2,
INV_OBJECT_PICKUP8_COMBO1,
INV_OBJECT_PICKUP8_COMBO2,
INV_OBJECT_PICKUP9_COMBO1,
INV_OBJECT_PICKUP9_COMBO2,
INV_OBJECT_PICKUP10_COMBO1,
INV_OBJECT_PICKUP10_COMBO2,
INV_OBJECT_PICKUP11_COMBO1,
INV_OBJECT_PICKUP11_COMBO2,
INV_OBJECT_PICKUP12_COMBO1,
INV_OBJECT_PICKUP12_COMBO2,
INV_OBJECT_PICKUP13_COMBO1,
INV_OBJECT_PICKUP13_COMBO2,
INV_OBJECT_PICKUP14_COMBO1,
INV_OBJECT_PICKUP14_COMBO2,
INV_OBJECT_PICKUP15_COMBO1,
INV_OBJECT_PICKUP15_COMBO2,
INV_OBJECT_PICKUP16_COMBO1,
INV_OBJECT_PICKUP16_COMBO2,
INV_OBJECT_EXAMINE1,
INV_OBJECT_EXAMINE2,
INV_OBJECT_EXAMINE3,
INV_OBJECT_EXAMINE4,
INV_OBJECT_EXAMINE5,
INV_OBJECT_EXAMINE6,
INV_OBJECT_EXAMINE7,
INV_OBJECT_EXAMINE8,
INV_OBJECT_EXAMINE1_COMBO1,
INV_OBJECT_EXAMINE1_COMBO2,
INV_OBJECT_EXAMINE2_COMBO1,
INV_OBJECT_EXAMINE2_COMBO2,
INV_OBJECT_EXAMINE3_COMBO1,
INV_OBJECT_EXAMINE3_COMBO2,
INV_OBJECT_EXAMINE4_COMBO1,
INV_OBJECT_EXAMINE4_COMBO2,
INV_OBJECT_EXAMINE5_COMBO1,
INV_OBJECT_EXAMINE5_COMBO2,
INV_OBJECT_EXAMINE6_COMBO1,
INV_OBJECT_EXAMINE6_COMBO2,
INV_OBJECT_EXAMINE7_COMBO1,
INV_OBJECT_EXAMINE7_COMBO2,
INV_OBJECT_EXAMINE8_COMBO1,
INV_OBJECT_EXAMINE8_COMBO2,
INVENTORY_TABLE_SIZE
};
struct MenuOption
{
MenuType type;
char const* text;
};
struct ObjectList
{
short invitem;
unsigned short xrot;
unsigned short yrot;
unsigned short zrot;
unsigned short bright;
};
struct InventoryRing
{
ObjectList current_object_list[INVENTORY_TABLE_SIZE + 1];
int ringactive;
int objlistmovement;
int curobjinlist;
int numobjectsinlist;
};
struct AmmoList
{
short invitem;
short amount;
unsigned short xrot;
unsigned short yrot;
unsigned short zrot;
};
struct SettingsData
{
bool waitingForkey = false; // Waiting for a key to be pressed when configuring controls
bool ignoreInput = false; // Ignore input unless all keys were released
int videoMode;
GameConfiguration conf;
};
struct CombineList
{
void (*combine_routine)(int flag);
short item1;
short item2;
short combined_item;
};
struct InventoryObject
{
short object_number;
short yoff;
float scale1;
short yrot;
short xrot;
short zrot;
unsigned __int64 opts;
const char* objname;
unsigned long meshbits;
short rot_flags;
};
class GuiController
{
public:
int CallInventory(bool reset_mode);
InventoryResult TitleOptions();
InventoryResult DoPauseMenu();
void HandleInventoryMenu();
void DrawInventory();
void DrawCurrentObjectList(int ringnum);
int IsObjectInInventory(short object_number);
int ConvertObjectToInventoryItem(short obj);
int ConvertInventoryItemToObject(int obj);
void FadeAmmoSelector();
void DrawAmmoSelector();
bool PerformWaterskinCombine(int flag);
void DrawCompass();
// Getters
InventoryRing* GetRings(char num);
short GetSelectedOption();
Menu GetMenuToDisplay();
InventoryMode GetInventoryMode();
int GetInventoryItemChosen();
int GetEnterInventory();
int GetLastInventoryItem();
SettingsData GetCurrentSettings();
short GetLoadSaveSelection();
// Setters
void SetSelectedOption(short menu);
void SetMenuToDisplay(Menu menu);
void SetInventoryMode(InventoryMode mode);
void SetEnterInventory(int num);
void SetInventoryItemChosen(int num);
private:
void DoDebouncedInput();
void ClearInputVariables(bool flag);
void HandleDisplaySettingsInput(bool pause);
void HandleControlSettingsInput(bool pause);
void HandleSoundSettingsInput(bool pause);
void FillSound();
bool DoObjectsCombine(int obj1, int obj2);
void InitializeInventory();
void FillDisplayOptions();
bool IsItemCurrentlyCombinable(short obj);
bool IsItemInInventory(short obj);
void CombineObjects(short obj1, short obj2);
void SetupObjectListStartPosition(short newobj);
void SetupObjectListStartPosition2(short newobj);
void HandleObjectChangeover(int ringnum);
void SetupAmmoSelector();
void ConstructObjectList();
void SeparateObject(short obj);
void InsertObjectIntoList(int num);
void InsertObjectIntoList_v2(int num);
void UseCurrentItem();
void SpinBack(unsigned short* angle);
void UpdateWeaponStatus();
void DoStatisticsMode();
void DoExamineMode();
void DoDiary();
int DoLoad();
void DoSave();
void ConstructCombineObjectList();
/*vars*/
// Input
bool goUp, goDown, goRight, goLeft, goSelect, goDeselect;
bool dbUp, dbDown, dbRight, dbLeft, dbSelect, dbDeselect;
long rptRight, rptLeft;
bool stop_killing_me_you_dumb_input_system;
bool stop_killing_me_you_dumb_input_system2;
// Inventory
short combine_obj1;
short combine_obj2;
char useItem;
char seperate_type_flag;
char combine_type_flag;
int compassNeedleAngle;
InventoryRing pcring1;
InventoryRing pcring2;
InventoryRing* rings[2];
int current_selected_option;
int menu_active;
char ammo_selector_flag;
char num_ammo_slots;
char* current_ammo_type;
AmmoList ammo_object_list[3];
short ammo_selector_fade_val;
short ammo_selector_fade_dir;
short combine_ring_fade_val;
short combine_ring_fade_dir;
short normal_ring_fade_val;
short normal_ring_fade_dir;
unsigned char ammo_active;
int OBJLIST_SPACING;
MenuOption current_options[3];
InventoryMode invMode;
int inventoryItemChosen;
int enterInventory;
int lastInvItem;
bool ExitInvLoop;
// Ammo vars
unsigned short AmountShotGunAmmo1;
unsigned short AmountShotGunAmmo2;
unsigned short AmountHKAmmo1;
unsigned short AmountCrossBowAmmo1;
unsigned short AmountCrossBowAmmo2;
unsigned short AmountCrossBowAmmo3;
unsigned short AmountGrenadeAmmo1;
unsigned short AmountGrenadeAmmo2;
unsigned short AmountGrenadeAmmo3;
unsigned short AmountRocketsAmmo;
unsigned short AmountHarpoonAmmo;
unsigned short AmountUziAmmo;
unsigned short AmountRevolverAmmo;
unsigned short AmountPistolsAmmo;
char CurrentPistolsAmmoType;
char CurrentUziAmmoType;
char CurrentRevolverAmmoType;
char CurrentShotGunAmmoType;
char CurrentHKAmmoType;
char CurrentGrenadeGunAmmoType;
char CurrentCrossBowAmmoType;
char CurrentHarpoonAmmoType;
char CurrentRocketAmmoType;
char StashedCurrentPistolsAmmoType;
char StashedCurrentUziAmmoType;
char StashedCurrentRevolverAmmoType;
char StashedCurrentShotGunAmmoType;
char StashedCurrentGrenadeGunAmmoType;
char StashedCurrentCrossBowAmmoType;
char Stashedcurrent_selected_option;
char StashedCurrentHKAmmoType;
char StashedCurrentHarpoonAmmoType;
char StashedCurrentRocketAmmoType;
Menu menu_to_display = Menu::Title;
short selected_option;
int option_count;
SettingsData CurrentSettings;
// Load / save
short selected_slot;
};
/*inventory*/
void combine_revolver_lasersight(int flag);
void combine_crossbow_lasersight(int flag);
void combine_HK_SILENCER(int flag);
void combine_PuzzleItem1(int flag);
void combine_PuzzleItem2(int flag);
void combine_PuzzleItem3(int flag);
void combine_PuzzleItem4(int flag);
void combine_PuzzleItem5(int flag);
void combine_PuzzleItem6(int flag);
void combine_PuzzleItem7(int flag);
void combine_PuzzleItem8(int flag);
void combine_PuzzleItem9(int flag);
void combine_PuzzleItem10(int flag);
void combine_PuzzleItem11(int flag);
void combine_PuzzleItem12(int flag);
void combine_PuzzleItem13(int flag);
void combine_PuzzleItem14(int flag);
void combine_PuzzleItem15(int flag);
void combine_PuzzleItem16(int flag);
void combine_KeyItem1(int flag);
void combine_KeyItem2(int flag);
void combine_KeyItem3(int flag);
void combine_KeyItem4(int flag);
void combine_KeyItem5(int flag);
void combine_KeyItem6(int flag);
void combine_KeyItem7(int flag);
void combine_KeyItem8(int flag);
void combine_KeyItem9(int flag);
void combine_KeyItem10(int flag);
void combine_KeyItem11(int flag);
void combine_KeyItem12(int flag);
void combine_KeyItem13(int flag);
void combine_KeyItem14(int flag);
void combine_KeyItem15(int flag);
void combine_KeyItem16(int flag);
void combine_PickupItem1(int flag);
void combine_PickupItem2(int flag);
void combine_PickupItem3(int flag);
void combine_PickupItem4(int flag);
void combine_PickupItem5(int flag);
void combine_PickupItem6(int flag);
void combine_PickupItem7(int flag);
void combine_PickupItem8(int flag);
void combine_PickupItem9(int flag);
void combine_PickupItem10(int flag);
void combine_PickupItem11(int flag);
void combine_PickupItem12(int flag);
void combine_PickupItem13(int flag);
void combine_PickupItem14(int flag);
void combine_PickupItem15(int flag);
void combine_PickupItem16(int flag);
void combine_Examine1(int flag);
void combine_Examine2(int flag);
void combine_Examine3(int flag);
void combine_Examine4(int flag);
void combine_Examine5(int flag);
void combine_Examine6(int flag);
void combine_Examine7(int flag);
void combine_Examine8(int flag);
void combine_ClockWorkBeetle(int flag);
extern GuiController g_Gui;
extern InventoryObject inventry_objects_list[];
extern const char* controlmsgs[];