TombEngine/TR5Main/Game/inventory.cpp

1418 lines
31 KiB
C++
Raw Normal View History

2018-08-19 09:46:58 +02:00
#include "inventory.h"
#include "draw.h"
#include "control.h"
#include "larafire.h"
#include "sound.h"
#include "gameflow.h"
#include "sound.h"
#include "savegame.h"
2018-08-19 09:46:58 +02:00
#include "..\Global\global.h"
#include "..\Specific\input.h"
Inventory* g_Inventory;
extern GameScript* g_Script;
2018-08-19 09:46:58 +02:00
void Inject_Inventory()
{
}
Inventory::Inventory()
{
ZeroMemory(&m_objectsTable[0], sizeof(InventoryObjectDefinition) * INVENTORY_TABLE_SIZE);
// Copy the old table
for (__int32 i = 0; i < 100; i++)
{
m_objectsTable[i].objectNumber = InventoryObjectsList[i].objectNumber;
m_objectsTable[i].objectName = InventoryObjectsList[i].objectNumber;
m_objectsTable[i].meshBits = InventoryObjectsList[i].meshBits;
}
// Assign new objects
m_objectsTable[INV_OBJECT_PASSAPORT].objectNumber = ID_INVENTORY_PASSPORT;
m_objectsTable[INV_OBJECT_PASSAPORT].objectName = STRING_INV_PASSPORT;
m_objectsTable[INV_OBJECT_PASSAPORT].meshBits = -1;
m_objectsTable[INV_OBJECT_KEYS].objectNumber = ID_INVENTORY_KEYS;
m_objectsTable[INV_OBJECT_KEYS].objectName = STRING_INV_CONTROLS;
m_objectsTable[INV_OBJECT_KEYS].meshBits = -1;
m_objectsTable[INV_OBJECT_SUNGLASSES].objectNumber = ID_INVENTORY_SUNGLASSES;
m_objectsTable[INV_OBJECT_SUNGLASSES].objectName = STRING_INV_DISPLAY;
m_objectsTable[INV_OBJECT_SUNGLASSES].meshBits = -1;
m_objectsTable[INV_OBJECT_POLAROID].objectNumber = ID_INVENTORY_POLAROID;
m_objectsTable[INV_OBJECT_POLAROID].objectName = STRING_INV_LARA_HOME;
m_objectsTable[INV_OBJECT_POLAROID].meshBits = -1;
m_objectsTable[INV_OBJECT_POLAROID].rotY = 16384;
m_objectsTable[INV_OBJECT_HEADPHONES].objectNumber = ID_INVENTORY_HEADPHONES;
m_objectsTable[INV_OBJECT_HEADPHONES].objectName = STRING_INV_SOUND;
m_objectsTable[INV_OBJECT_HEADPHONES].meshBits = -1;
}
Inventory::~Inventory()
{
}
InventoryRing* Inventory::GetRing(__int32 index)
{
return &m_rings[index];
}
__int32 Inventory::GetActiveRing()
{
return m_activeRing;
}
void Inventory::SetActiveRing(__int32 index)
{
m_activeRing = index;
}
void Inventory::InsertObject(__int32 ring, __int32 objectNumber)
{
m_rings[ring].objects[m_rings[ring].numObjects].inventoryObject = objectNumber;
m_rings[ring].numObjects++;
}
void Inventory::Initialise()
{
// Reset the objects in inventory
for (__int32 i = 0; i < NUM_INVENTORY_RINGS; i++)
{
m_rings[i].numObjects = 0;
m_rings[i].movement = 0;
m_rings[i].currentObject = 0;
m_rings[i].focusState = INV_FOCUS_STATE_NONE;
for (__int32 j = 0; j < NUM_INVENTORY_OBJECTS_PER_RING; j++)
{
m_rings[i].objects[j].inventoryObject = -1;
m_rings[i].objects[j].rotation = 0;
m_rings[i].objects[j].scale = INV_OBJECT_SCALE;
}
}
// DEBUG
{
//Lara.uzisTypeCarried = 1;
//Lara.numUziAmmo = 1000;
/*Lara.shotgunTypeCarried = 1;
2018-08-19 09:46:58 +02:00
Lara.numShotgunAmmo1 = 1000;
Lara.numShotgunAmmo2 = 1000;
2018-08-19 09:46:58 +02:00
Lara.numRevolverAmmo = 1000;
Lara.numShotgunAmmo2 = 1000;
Lara.crowbar = 1;
Lara.sixshooterTypeCarried = 1;*/
//Lara.uzisTypeCarried = 1;
//Lara.numUziAmmo = 10000;
2018-08-19 09:46:58 +02:00
//Lara.crossbowTypeCarried = 1;
//Lara.numCrossbowAmmo1 = 1000;
}
// Now fill the rings
if (!(gfLevelFlags & 1))
{
if (Lara.pistolsTypeCarried & 1)
InsertObject(INV_RING_WEAPONS, INV_OBJECT_PISTOLS);
if (Lara.uzisTypeCarried & 1)
InsertObject(INV_RING_WEAPONS, INV_OBJECT_UZIS);
if (Lara.numUziAmmo)
InsertObject(INV_RING_WEAPONS, 18);
if (Lara.sixshooterTypeCarried & 1)
{
if (Lara.sixshooterTypeCarried & 4)
InsertObject(INV_RING_WEAPONS, 4);
else
InsertObject(INV_RING_WEAPONS, 3);
}
if (Lara.numRevolverAmmo)
InsertObject(INV_RING_WEAPONS, 17);
if (Lara.shotgunTypeCarried & 1)
{
InsertObject(INV_RING_WEAPONS, 2);
//if (Lara.shotgunTypeCarried & 0x10)
// CurrentShotGunAmmoType = 1;
}
else
{
if (Lara.numShotgunAmmo1)
InsertObject(INV_RING_WEAPONS, 9);
if (Lara.numShotgunAmmo2)
InsertObject(INV_RING_WEAPONS, 10);
}
if (Lara.HKtypeCarried & 1)
{
if (Lara.HKtypeCarried & 2)
InsertObject(INV_RING_WEAPONS, 8);
else
InsertObject(INV_RING_WEAPONS, 7);
if (Lara.HKtypeCarried & 0x10)
{
//CurrentGrenadeGunAmmoType = 1;
}
else if (Lara.HKtypeCarried & 0x20)
{
//CurrentGrenadeGunAmmoType = 2;
}
}
if (Lara.numHKammo1)
InsertObject(INV_RING_WEAPONS, 14);
if (Lara.crossbowTypeCarried & 1)
{
if (CurrentLevel < 0xBu || CurrentLevel > 0xEu)
{
if (Lara.crossbowTypeCarried & 4)
InsertObject(INV_RING_WEAPONS, 6);
else
InsertObject(INV_RING_WEAPONS, 5);
//if (Lara.crossbowTypeCarried & 0x10)
// CurrentCrossBowAmmoType = 1;
}
else
{
InsertObject(INV_RING_WEAPONS, 95);
//CurrentCrossBowAmmoType = 0;
}
}
if (CurrentLevel < 0xBu || CurrentLevel > 0xEu)
{
if (Lara.numCrossbowAmmo1)
InsertObject(INV_RING_WEAPONS, 15);
if (Lara.numCrossbowAmmo2)
InsertObject(INV_RING_WEAPONS, 16);
}
if (Lara.numCrossbowAmmo1)
InsertObject(INV_RING_WEAPONS, 96);
if (Lara.laserSight)
InsertObject(INV_RING_WEAPONS, 20);
if (Lara.silencer)
InsertObject(INV_RING_WEAPONS, 21);
if (Lara.binoculars)
InsertObject(INV_RING_WEAPONS, 24);
if (Lara.numFlares)
InsertObject(INV_RING_WEAPONS, 25);
}
//InsertObject(INV_RING_OPTIONS, 26);
if (Lara.numSmallMedipack)
InsertObject(INV_RING_WEAPONS, 23);
if (Lara.numLargeMedipack)
InsertObject(INV_RING_WEAPONS, 22);
if (Lara.crowbar)
InsertObject(INV_RING_WEAPONS, 90);
__int32 i = 0;
do
{
if (Lara.puzzleItems[i])
InsertObject(INV_RING_PUZZLES, i + 29);
i++;
} while (i < 8);
i = 0;
do
{
if ((1 << i) & Lara.puzzleItemsCombo)
InsertObject(INV_RING_PUZZLES, i + 37);
i++;
} while (i < 16);
i = 0;
do
{
if ((1 << i) & Lara.keyItems)
InsertObject(INV_RING_PUZZLES, i + 53);
i++;
} while (i < 8);
i = 0;
do
{
if ((1 << i) & Lara.keyItemsCombo)
InsertObject(INV_RING_PUZZLES, i + 61);
i++;
} while (i < 16);
i = 0;
do
{
if ((1 << i) & Lara.pickupItems)
InsertObject(INV_RING_PUZZLES, i + 77);
i++;
} while (i < 4);
i = 0;
do
{
if ((1 << i) & Lara.pickupItemsCombo)
InsertObject(INV_RING_PUZZLES, i + 81);
i++;
} while (i < 8);
if (Lara.examine1)
InsertObject(INV_RING_PUZZLES, 91);
if (Lara.examine2)
InsertObject(INV_RING_PUZZLES, 92);
if (Lara.examine3)
InsertObject(INV_RING_PUZZLES, 93);
if (Lara.wetcloth == 2)
InsertObject(INV_RING_PUZZLES, 94);
if (Lara.wetcloth == 1)
InsertObject(INV_RING_PUZZLES, 97);
if (Lara.bottle)
InsertObject(INV_RING_PUZZLES, 98);
InventoryRing* ring = &m_rings[INV_RING_OPTIONS];
// Reset the objects in inventory
ring->numObjects = 0;
ring->movement = 0;
ring->currentObject = 0;
ring->focusState = INV_FOCUS_STATE_NONE;
for (__int32 j = 0; j < NUM_INVENTORY_OBJECTS_PER_RING; j++)
{
ring->objects[j].inventoryObject = -1;
ring->objects[j].rotation = 0;
ring->objects[j].scale = 2.0f;
}
InsertObject(INV_RING_OPTIONS, INV_OBJECT_PASSAPORT);
InsertObject(INV_RING_OPTIONS, INV_OBJECT_SUNGLASSES);
InsertObject(INV_RING_OPTIONS, INV_OBJECT_HEADPHONES);
InsertObject(INV_RING_OPTIONS, INV_OBJECT_KEYS);
m_activeRing = INV_RING_WEAPONS;
m_type = INV_TYPE_GAME;
m_deltaMovement = 0;
m_movement = INV_MOVE_STOPPED;
m_type = INV_TYPE_GAME;
InventoryItemChosen = -1;
}
INVENTORY_RESULT Inventory::DoInventory()
2018-08-19 09:46:58 +02:00
{
Initialise();
m_rings[INV_RING_PUZZLES].draw = true;
m_rings[INV_RING_WEAPONS].draw = true;
m_rings[INV_RING_OPTIONS].draw = true;
m_activeRing = INV_RING_WEAPONS;
g_Renderer->DumpGameScene();
g_Renderer->DrawInventory();
INVENTORY_RESULT result = INVENTORY_RESULT::INVENTORY_RESULT_NONE;
2018-08-19 09:46:58 +02:00
while (!ResetFlag)
{
SetDebounce = true;
S_UpdateInput();
SetDebounce = false;
GameTimer++;
// Handle input
if (DbInput & 0x200000)
{
SoundEffect(SFX_MENU_SELECT, NULL, 0);
2018-08-19 09:46:58 +02:00
// Exit from inventory
GlobalEnterInventory = -1;
return INVENTORY_RESULT::INVENTORY_RESULT_NONE;
2018-08-19 09:46:58 +02:00
}
else if (DbInput & 1 &&
(m_activeRing == INV_RING_WEAPONS && m_rings[INV_RING_PUZZLES].numObjects != 0 ||
m_activeRing == INV_RING_OPTIONS))
{
SoundEffect(SFX_MENU_ROTATE, NULL, 0);
2018-08-19 09:46:58 +02:00
// Go to the upper ring
for (__int32 i = 0; i < 8; i++)
{
m_movement -= 1024.0f;
g_Renderer->DrawInventory();
g_Renderer->SyncRenderer();
}
if (m_activeRing == INV_RING_WEAPONS)
m_activeRing = INV_RING_PUZZLES;
else
m_activeRing = INV_RING_WEAPONS;
m_movement = 0;
continue;
}
else if (DbInput & 2 && (m_activeRing == INV_RING_PUZZLES || m_activeRing == INV_RING_WEAPONS))
{
SoundEffect(SFX_MENU_ROTATE, NULL, 0);
2018-08-19 09:46:58 +02:00
// Go to the lower ring
for (__int32 i = 0; i < 8; i++)
{
m_movement += 1024.0f;
g_Renderer->DrawInventory();
g_Renderer->SyncRenderer();
}
if (m_activeRing == INV_RING_WEAPONS)
m_activeRing = INV_RING_OPTIONS;
else
m_activeRing = INV_RING_WEAPONS;
m_movement = 0;
continue;
}
else if (DbInput & 4)
{
SoundEffect(SFX_MENU_ROTATE, NULL, 0);
2018-08-19 09:46:58 +02:00
// Change object right
float deltaAngle = 360.0f / m_rings[m_activeRing].numObjects / 8.0f;
m_rings[m_activeRing].movement = 0;
for (__int32 i = 0; i < 8; i++)
{
m_rings[m_activeRing].movement += deltaAngle;
g_Renderer->DrawInventory();
g_Renderer->SyncRenderer();
}
if (m_rings[m_activeRing].currentObject == m_rings[m_activeRing].numObjects - 1)
m_rings[m_activeRing].currentObject = 0;
else
m_rings[m_activeRing].currentObject++;
m_rings[m_activeRing].movement = 0;
}
else if (DbInput & 8)
{
SoundEffect(SFX_MENU_ROTATE, NULL, 0);
2018-08-19 09:46:58 +02:00
// Change object left
float deltaAngle = 360.0f / m_rings[m_activeRing].numObjects / 8.0f;
m_rings[m_activeRing].movement = 0;
for (__int32 i = 0; i < 8; i++)
{
m_rings[m_activeRing].movement -= deltaAngle;
g_Renderer->DrawInventory();
g_Renderer->SyncRenderer();
}
if (m_rings[m_activeRing].currentObject == 0)
m_rings[m_activeRing].currentObject = m_rings[m_activeRing].numObjects - 1;
else
m_rings[m_activeRing].currentObject--;
m_rings[m_activeRing].movement = 0;
}
else if (DbInput & 0x100000)
{
// Handle action
if (m_activeRing == INV_RING_OPTIONS)
{
if (m_rings[INV_RING_OPTIONS].objects[m_rings[INV_RING_OPTIONS].currentObject].inventoryObject == INV_OBJECT_PASSAPORT)
{
INVENTORY_RESULT passportResult = DoPassport();
if (passportResult == INVENTORY_RESULT::INVENTORY_RESULT_NEW_GAME ||
passportResult == INVENTORY_RESULT::INVENTORY_RESULT_EXIT_TO_TILE ||
passportResult == INVENTORY_RESULT::INVENTORY_RESULT_LOAD_GAME)
{
return passportResult;
}
}
2018-08-19 09:46:58 +02:00
// DEPRECATED: all the followings will be done by passaport
2018-08-19 09:46:58 +02:00
if (m_rings[INV_RING_OPTIONS].objects[m_rings[INV_RING_OPTIONS].currentObject].inventoryObject == INV_OBJECT_TIMEX)
DoStatisticsMenu();
if (m_rings[INV_RING_OPTIONS].objects[m_rings[INV_RING_OPTIONS].currentObject].inventoryObject == INV_OBJECT_LOAD_FLOPPY)
DoLoadGameMenu();
if (m_rings[INV_RING_OPTIONS].objects[m_rings[INV_RING_OPTIONS].currentObject].inventoryObject == INV_OBJECT_SAVE_FLOPPY)
DoSaveGameMenu();
}
else if (m_activeRing == INV_RING_WEAPONS || m_activeRing == INV_RING_PUZZLES)
{
UseCurrentItem();
// Exit from inventory
GlobalEnterInventory = -1;
return INVENTORY_RESULT::INVENTORY_RESULT_USE_ITEM;
2018-08-19 09:46:58 +02:00
}
}
g_Renderer->DrawInventory();
g_Renderer->SyncRenderer();
}
return result;
2018-08-19 09:46:58 +02:00
}
void Inventory::UseCurrentItem()
{
InventoryRing* ring = &m_rings[m_activeRing];
InventoryObject* inventoryObject = &ring->objects[ring->currentObject];
__int16 objectNumber = m_objectsTable[inventoryObject->inventoryObject].objectNumber;
LaraItem->meshBits = -1;
// Small medipack
if (objectNumber == ID_SMALLMEDI_ITEM)
{
if ((LaraItem->hitPoints <= 0 || LaraItem->hitPoints >= 1000) && !Lara.poisoned)
{
SayNo();
return;
}
if (Lara.numSmallMedipack != -1)
Lara.numSmallMedipack--;
Lara.dpoisoned = 0;
LaraItem->hitPoints += 500;
if (LaraItem->hitPoints > 1000)
LaraItem->hitPoints = 1000;
SoundEffect(116, 0, 2);
Savegame.Game.HealthUsed++;
SoundEffect(SFX_MENU_MEDI, NULL, 0);
2018-08-19 09:46:58 +02:00
return;
}
// Big medipack
if (objectNumber == ID_BIGMEDI_ITEM)
{
if ((LaraItem->hitPoints <= 0 || LaraItem->hitPoints >= 1000) && !Lara.poisoned)
{
SayNo();
return;
}
if (Lara.numLargeMedipack != -1)
Lara.numLargeMedipack--;
Lara.dpoisoned = 0;
LaraItem->hitPoints += 1000;
if (LaraItem->hitPoints > 1000)
LaraItem->hitPoints = 1000;
SoundEffect(116, 0, 2);
Savegame.Game.HealthUsed++;
SoundEffect(SFX_MENU_MEDI, NULL, 0);
2018-08-19 09:46:58 +02:00
return;
}
// Binoculars
if (objectNumber == ID_BINOCULARS_ITEM)
{
/*
if ( lara_item->current_anim_state == 2 && lara_item->anim_number == 103
|| (LOBYTE(objectNum) = *(&lara + 68), *(&lara + 69) & 8) && !(input & 0x20000000) )
{
LOBYTE(objectNum) = SniperCamActive;
if ( !SniperCamActive && !bUseSpotCam && !bTrackCamInit )
{
oldLaraBusy = 1;
BinocularRange = 128;
if ( lara.gun_status )
lara.gun_status = 3;
}
}
if ( v0 )
BinocularRange = v0;
else
BinocularOldCamera = dword_EEF964;
return objectNum;
*/
}
// Crowbar and puzzles
if (objectNumber == ID_CROWBAR_ITEM ||
objectNumber >= ID_PUZZLE_ITEM1 && objectNumber <= ID_PUZZLE_ITEM8 ||
objectNumber >= ID_PUZZLE_ITEM1_COMBO1 && objectNumber <= ID_PUZZLE_ITEM8_COMBO2 ||
objectNumber >= ID_KEY_ITEM1 && objectNumber <= ID_KEY_ITEM8 ||
objectNumber >= ID_KEY_ITEM1_COMBO1 && objectNumber <= ID_KEY_ITEM8_COMBO2 ||
objectNumber >= ID_PICKUP_ITEM1 && objectNumber <= ID_PICKUP_ITEM3 ||
objectNumber >= ID_PICKUP_ITEM1_COMBO1 && objectNumber <= ID_PICKUP_ITEM3_COMBO2)
{
// Only if above water
if (Lara.waterStatus == LW_ABOVE_WATER)
{
InventoryItemChosen = objectNumber;
SoundEffect(SFX_MENU_CHOOSE, NULL, 0);
2018-08-19 09:46:58 +02:00
return;
}
else
{
SayNo();
return;
}
}
// Flares
if (objectNumber == ID_FLARE_INV_ITEM)
{
if (Lara.waterStatus == LW_ABOVE_WATER)
{
InventoryItemChosen = objectNumber;
SoundEffect(SFX_MENU_CHOOSE, NULL, 0);
2018-08-19 09:46:58 +02:00
return;
}
else
{
SayNo();
return;
}
}
bool canUseWeapons = !(LaraItem->currentAnimState == 80 || LaraItem->currentAnimState == 81 ||
LaraItem->currentAnimState == 84 || LaraItem->currentAnimState == 85 ||
LaraItem->currentAnimState == 86 || LaraItem->currentAnimState == 88 ||
LaraItem->currentAnimState == 71 || LaraItem->currentAnimState == 105 ||
LaraItem->currentAnimState == 106 || Lara.waterStatus != LW_ABOVE_WATER);
// Pistols
if (objectNumber == ID_PISTOLS_ITEM)
{
if (canUseWeapons)
{
Lara.requestGunType = WEAPON_PISTOLS;
if (!Lara.gunStatus && Lara.gunType == WEAPON_PISTOLS)
Lara.gunStatus = LG_DRAW_GUNS;
SoundEffect(SFX_MENU_CHOOSE, NULL, 0);
2018-08-19 09:46:58 +02:00
}
else
{
SayNo();
return;
}
}
// Uzis
if (objectNumber == ID_UZI_ITEM)
{
if (canUseWeapons)
{
Lara.requestGunType = WEAPON_UZI;
if (!Lara.gunStatus && Lara.gunType == WEAPON_UZI)
Lara.gunStatus = LG_DRAW_GUNS;
SoundEffect(SFX_MENU_CHOOSE, NULL, 0);
2018-08-19 09:46:58 +02:00
}
else
{
SayNo();
return;
}
}
// Revolver
if (objectNumber == ID_REVOLVER_ITEM)
{
if (canUseWeapons)
{
Lara.requestGunType = WEAPON_REVOLVER;
if (!Lara.gunStatus && Lara.gunType == WEAPON_REVOLVER)
Lara.gunStatus = LG_DRAW_GUNS;
SoundEffect(SFX_MENU_CHOOSE, NULL, 0);
2018-08-19 09:46:58 +02:00
}
else
{
SayNo();
return;
}
}
// Shotgun
if (objectNumber == ID_SHOTGUN_ITEM)
{
if (canUseWeapons)
{
Lara.requestGunType = WEAPON_SHOTGUN;
if (!Lara.gunStatus && Lara.gunType == WEAPON_SHOTGUN)
Lara.gunStatus = LG_DRAW_GUNS;
SoundEffect(SFX_MENU_CHOOSE, NULL, 0);
2018-08-19 09:46:58 +02:00
}
else
{
SayNo();
return;
}
}
// Crossbow/grappling gun
if (objectNumber == ID_CROSSBOW_ITEM)
{
if (canUseWeapons)
{
Lara.requestGunType = WEAPON_CROSSBOW;
if (!Lara.gunStatus && Lara.gunType == WEAPON_CROSSBOW)
Lara.gunStatus = LG_DRAW_GUNS;
SoundEffect(SFX_MENU_CHOOSE, NULL, 0);
2018-08-19 09:46:58 +02:00
}
else
{
SayNo();
return;
}
}
// HK
if (objectNumber == ID_HK_ITEM)
{
if (canUseWeapons)
{
Lara.requestGunType = WEAPON_HK;
if (!Lara.gunStatus && Lara.gunType == WEAPON_HK)
Lara.gunStatus = LG_DRAW_GUNS;
SoundEffect(SFX_MENU_CHOOSE, NULL, 0);
2018-08-19 09:46:58 +02:00
}
else
{
SayNo();
return;
}
}
// Flares
if (objectNumber == ID_FLARE_INV_ITEM)
{
if (!Lara.gunStatus)
{
if (LaraItem->currentAnimState != 80
&& LaraItem->currentAnimState != 81
&& LaraItem->currentAnimState != 84
&& LaraItem->currentAnimState != 85
&& LaraItem->currentAnimState != 86
&& LaraItem->currentAnimState != 88
&& Lara.waterStatus == LW_ABOVE_WATER)
{
if (Lara.gunType != WEAPON_FLARE)
{
TrInput = 0x80000;
LaraGun();
TrInput = 0;
SoundEffect(SFX_MENU_CHOOSE, NULL, 0);
2018-08-19 09:46:58 +02:00
}
return;
}
}
else
{
SayNo();
return;
}
}
SayNo();
return;
}
float Inventory::GetVerticalOffset()
{
return m_movement;
}
void Inventory::InitialiseTitle()
{
InventoryRing* ring = &m_rings[INV_RING_OPTIONS];
// Reset the objects in inventory
ring->numObjects = 0;
ring->movement = 0;
ring->currentObject = 0;
ring->focusState = INV_FOCUS_STATE_NONE;
for (__int32 j = 0; j < NUM_INVENTORY_OBJECTS_PER_RING; j++)
{
ring->objects[j].inventoryObject = -1;
ring->objects[j].rotation = 0;
ring->objects[j].scale = INV_OBJECT_SCALE;
}
InsertObject(INV_RING_OPTIONS, INV_OBJECT_PASSAPORT);
InsertObject(INV_RING_OPTIONS, INV_OBJECT_POLAROID);
InsertObject(INV_RING_OPTIONS, INV_OBJECT_SUNGLASSES);
InsertObject(INV_RING_OPTIONS, INV_OBJECT_HEADPHONES);
InsertObject(INV_RING_OPTIONS, INV_OBJECT_KEYS);
m_activeRing = INV_RING_OPTIONS;
m_deltaMovement = 0;
m_movement = INV_MOVE_STOPPED;
m_type = INV_TYPE_TITLE;
InventoryItemChosen = -1;
}
INVENTORY_RESULT Inventory::DoTitleInventory()
2018-08-19 09:46:58 +02:00
{
InitialiseTitle();
m_rings[INV_RING_PUZZLES].draw = false;
m_rings[INV_RING_WEAPONS].draw = false;
m_rings[INV_RING_OPTIONS].draw = true;
InventoryRing* ring = &m_rings[INV_RING_OPTIONS];
m_activeRing = INV_RING_OPTIONS;
g_Renderer->DrawInventory();
INVENTORY_RESULT result = INVENTORY_RESULT::INVENTORY_RESULT_NONE;
2018-08-19 09:46:58 +02:00
while (!ResetFlag)
{
SetDebounce = true;
S_UpdateInput();
SetDebounce = false;
GameTimer++;
// Handle input
if (DbInput & 4)
{
SoundEffect(SFX_MENU_ROTATE, NULL, 0);
2018-08-19 09:46:58 +02:00
// Change object right
float deltaAngle = 360.0f / ring->numObjects / 8.0f;
ring->movement = 0;
for (__int32 i = 0; i < 8; i++)
{
ring->movement += deltaAngle;
g_Renderer->DrawInventory();
g_Renderer->SyncRenderer();
}
if (ring->currentObject == ring->numObjects - 1)
ring->currentObject = 0;
else
ring->currentObject++;
ring->movement = 0;
}
else if (DbInput & 8)
{
SoundEffect(SFX_MENU_ROTATE, NULL, 0);
2018-08-19 09:46:58 +02:00
// Change object left
float deltaAngle = 360.0f / ring->numObjects / 8.0f;
ring->movement = 0;
for (__int32 i = 0; i < 8; i++)
{
ring->movement -= deltaAngle;
g_Renderer->DrawInventory();
g_Renderer->SyncRenderer();
}
if (ring->currentObject == 0)
ring->currentObject = ring->numObjects - 1;
else
ring->currentObject--;
ring->movement = 0;
}
else if (DbInput & 0x100000)
{
SoundEffect(SFX_MENU_SELECT, NULL, 0);
2018-08-19 09:46:58 +02:00
if (ring->objects[ring->currentObject].inventoryObject == INV_OBJECT_PASSAPORT)
{
INVENTORY_RESULT passportResult = DoPassport();
if (passportResult == INVENTORY_RESULT::INVENTORY_RESULT_NEW_GAME ||
passportResult == INVENTORY_RESULT::INVENTORY_RESULT_EXIT_GAME ||
passportResult == INVENTORY_RESULT::INVENTORY_RESULT_LOAD_GAME)
{
return result;
}
}
2018-08-19 09:46:58 +02:00
if (ring->objects[ring->currentObject].inventoryObject == INV_OBJECT_TIMEX)
DoStatisticsMenu();
if (ring->objects[ring->currentObject].inventoryObject == INV_OBJECT_LOAD_FLOPPY)
DoLoadGameMenu();
if (ring->objects[ring->currentObject].inventoryObject == INV_OBJECT_SAVE_FLOPPY)
DoSaveGameMenu();
}
g_Renderer->DrawInventory();
g_Renderer->SyncRenderer();
}
return result;
2018-08-19 09:46:58 +02:00
}
InventoryObjectDefinition* Inventory::GetInventoryObject(__int32 index)
{
return &m_objectsTable[index];
}
INVENTORY_RESULT Inventory::DoPassport()
2018-08-19 09:46:58 +02:00
{
InventoryRing* ring = &m_rings[m_activeRing];
ring->frameIndex = 0;
__int16 choice = 0;
vector<__int32> choices;
if (m_type == INV_TYPE_TITLE)
{
choices.push_back(INV_WHAT_PASSPORT_NEW_GAME);
choices.push_back(INV_WHAT_PASSPORT_SELECT_LEVEL);
2018-08-19 09:46:58 +02:00
choices.push_back(INV_WHAT_PASSPORT_LOAD_GAME);
choices.push_back(INV_WHAT_PASSPORT_EXIT_GAME);
}
else
{
choices.push_back(INV_WHAT_PASSPORT_NEW_GAME);
choices.push_back(INV_WHAT_PASSPORT_LOAD_GAME);
choices.push_back(INV_WHAT_PASSPORT_SAVE_GAME);
choices.push_back(INV_WHAT_PASSPORT_EXIT_TO_TITLE);
}
ring->passportAction = choices[0];
PopupObject();
// Open the passport
for (__int32 i = 0; i < 14; i++)
{
g_Renderer->DrawInventory();
g_Renderer->SyncRenderer();
ring->frameIndex++;
}
bool moveLeft = false;
bool moveRight = false;
bool closePassport = false;
INVENTORY_RESULT result = INVENTORY_RESULT::INVENTORY_RESULT_NONE;
2018-08-19 09:46:58 +02:00
// Do the passport
while (true)
{
// Handle input
SetDebounce = true;
S_UpdateInput();
SetDebounce = false;
GameTimer++;
// Handle input
if (DbInput & 0x200000 || closePassport)
{
moveLeft = false;
moveRight = false;
closePassport = false;
break;
}
else if (DbInput & 4 || moveLeft)
{
moveLeft = false;
moveRight = false;
closePassport = false;
if (choice > 0)
{
ring->frameIndex = 19;
for (__int32 i = 0; i < 5; i++)
{
g_Renderer->DrawInventory();
g_Renderer->SyncRenderer();
ring->frameIndex--;
}
choice--;
}
}
else if (DbInput & 8 || moveRight)
{
moveLeft = false;
moveRight = false;
closePassport = false;
2018-08-19 09:46:58 +02:00
if (choice < choices.size() - 1)
{
ring->frameIndex = 14;
for (__int32 i = 0; i < 5; i++)
{
g_Renderer->DrawInventory();
g_Renderer->SyncRenderer();
ring->frameIndex++;
}
choice++;
}
}
if (choices[choice] == INV_WHAT_PASSPORT_LOAD_GAME)
{
// Load game
__int32 selectedSavegame = 0;
while (true)
{
SetDebounce = 1;
S_UpdateInput();
SetDebounce = 0;
// Process input
if (DbInput & 0x200000)
{
moveLeft = false;
moveRight = false;
closePassport = true;
break;
}
else if (DbInput & 1 && selectedSavegame > 0)
{
selectedSavegame--;
continue;
}
else if (DbInput & 2 && selectedSavegame < MAX_SAVEGAMES - 1)
{
selectedSavegame++;
continue;
}
else if (DbInput & 4)
{
moveLeft = true;
moveRight = false;
closePassport = false;
break;
}
else if (DbInput & 8)
{
moveLeft = false;
moveRight = true;
closePassport = false;
break;
}
else if (DbInput & 0x100000)
{
ReadSavegame(selectedSavegame);
result = INVENTORY_RESULT::INVENTORY_RESULT_LOAD_GAME;
moveLeft = false;
moveRight = false;
closePassport = true;
break;
2018-08-19 09:46:58 +02:00
}
ring->selectedIndex = selectedSavegame;
ring->passportAction = INV_WHAT_PASSPORT_LOAD_GAME;
LoadSavegameInfos();
g_Renderer->DrawInventory();
g_Renderer->SyncRenderer();
}
}
else if (choices[choice] == INV_WHAT_PASSPORT_SAVE_GAME)
{
// Save game
__int32 selectedSavegame = 0;
while (true)
{
SetDebounce = 1;
S_UpdateInput();
SetDebounce = 0;
// Process input
if (DbInput & 0x200000)
{
moveLeft = false;
moveRight = false;
closePassport = true;
break;
}
else if (DbInput & 1 && selectedSavegame > 0)
{
selectedSavegame--;
continue;
}
else if (DbInput & 2 && selectedSavegame < MAX_SAVEGAMES - 1)
{
selectedSavegame++;
continue;
}
else if (DbInput & 4)
{
moveLeft = true;
moveRight = false;
closePassport = false;
break;
}
else if (DbInput & 8)
{
moveLeft = false;
moveRight = true;
closePassport = false;
break;
}
else if (DbInput & 0x100000)
{
CreateSavegame();
WriteSavegame(selectedSavegame);
moveLeft = false;
moveRight = false;
closePassport = true;
break;
2018-08-19 09:46:58 +02:00
}
ring->selectedIndex = selectedSavegame;
ring->passportAction = INV_WHAT_PASSPORT_SAVE_GAME;
LoadSavegameInfos();
g_Renderer->DrawInventory();
g_Renderer->SyncRenderer();
}
}
else if (choices[choice] == INV_WHAT_PASSPORT_SELECT_LEVEL)
{
// Save game
__int32 selectedLevel = 0;
while (true)
{
SetDebounce = 1;
S_UpdateInput();
SetDebounce = 0;
// Process input
if (DbInput & 0x200000)
{
moveLeft = false;
moveRight = false;
closePassport = true;
break;
}
else if (DbInput & 1 && selectedLevel > 0)
{
selectedLevel--;
continue;
}
else if (DbInput & 2 && selectedLevel < g_Script->GetNumLevels() - 1)
{
selectedLevel++;
continue;
}
else if (DbInput & 4)
{
moveLeft = true;
moveRight = false;
closePassport = false;
break;
}
else if (DbInput & 8)
{
moveLeft = false;
moveRight = true;
closePassport = false;
break;
}
else if (DbInput & 0x100000)
{
result = INVENTORY_RESULT::INVENTORY_RESULT_NEW_GAME;
g_Script->SelectedLevelForNewGame = selectedLevel + 1;
moveLeft = false;
moveRight = false;
closePassport = true;
break;
}
ring->selectedIndex = selectedLevel;
ring->passportAction = INV_WHAT_PASSPORT_SELECT_LEVEL;
g_Renderer->DrawInventory();
g_Renderer->SyncRenderer();
}
}
2018-08-19 09:46:58 +02:00
else if (choices[choice] == INV_WHAT_PASSPORT_NEW_GAME)
{
// New game
while (true)
{
SetDebounce = 1;
S_UpdateInput();
SetDebounce = 0;
// Process input
if (DbInput & 0x200000)
{
moveLeft = false;
moveRight = false;
closePassport = true;
break;
}
else if (DbInput & 4)
{
moveLeft = true;
moveRight = false;
closePassport = false;
break;
}
else if (DbInput & 8)
{
moveLeft = false;
moveRight = true;
closePassport = false;
break;
}
else if (DbInput & 0x100000)
{
result = INVENTORY_RESULT::INVENTORY_RESULT_NEW_GAME;
moveLeft = false;
moveRight = false;
closePassport = true;
break;
2018-08-19 09:46:58 +02:00
}
ring->passportAction = INV_WHAT_PASSPORT_NEW_GAME;
g_Renderer->DrawInventory();
g_Renderer->SyncRenderer();
}
}
else if (choices[choice] == INV_WHAT_PASSPORT_EXIT_GAME)
{
// Exit game
while (true)
{
SetDebounce = 1;
S_UpdateInput();
SetDebounce = 0;
// Process input
if (DbInput & 0x200000)
{
moveLeft = false;
moveRight = false;
closePassport = true;
break;
}
else if (DbInput & 4)
{
moveLeft = true;
moveRight = false;
closePassport = false;
break;
}
else if (DbInput & 8)
{
moveLeft = false;
moveRight = true;
closePassport = false;
break;
}
else if (DbInput & 0x100000)
{
result = INVENTORY_RESULT::INVENTORY_RESULT_EXIT_GAME;
moveLeft = false;
moveRight = false;
closePassport = true;
break;
2018-08-19 09:46:58 +02:00
}
ring->passportAction = INV_WHAT_PASSPORT_EXIT_GAME;
g_Renderer->DrawInventory();
g_Renderer->SyncRenderer();
}
}
else if (choices[choice] == INV_WHAT_PASSPORT_EXIT_TO_TITLE)
{
// Exit game
while (true)
{
SetDebounce = 1;
S_UpdateInput();
SetDebounce = 0;
// Process input
if (DbInput & 0x200000)
{
moveLeft = false;
moveRight = false;
closePassport = true;
break;
}
else if (DbInput & 4)
{
moveLeft = true;
moveRight = false;
closePassport = false;
break;
}
else if (DbInput & 8)
{
moveLeft = false;
moveRight = true;
closePassport = false;
break;
}
else if (DbInput & 0x100000)
{
result = INVENTORY_RESULT::INVENTORY_RESULT_EXIT_TO_TILE;
moveLeft = false;
moveRight = false;
closePassport = true;
break;
2018-08-19 09:46:58 +02:00
}
ring->passportAction = INV_WHAT_PASSPORT_EXIT_TO_TITLE;
g_Renderer->DrawInventory();
g_Renderer->SyncRenderer();
}
}
else
{
g_Renderer->DrawInventory();
g_Renderer->SyncRenderer();
}
}
// Close the passport
ring->frameIndex = 24;
for (__int32 i = 24; i < 30; i++)
{
g_Renderer->DrawInventory();
g_Renderer->SyncRenderer();
ring->frameIndex++;
}
ring->frameIndex = 0;
PopoverObject();
return result;
2018-08-19 09:46:58 +02:00
}
__int32 Inventory::PopupObject()
{
InventoryRing* ring = &m_rings[m_activeRing];
__int32 steps = 8;
__int32 deltaAngle = (0 - ring->objects[ring->currentObject].rotation) / steps;
float deltaScale = INV_OBJECT_SCALE / (float)steps;
ring->focusState = INV_FOCUS_STATE_POPUP;
for (__int32 i = 0; i < steps; i++)
{
g_Renderer->DrawInventory();
g_Renderer->SyncRenderer();
ring->objects[ring->currentObject].rotation += deltaAngle;
ring->objects[ring->currentObject].scale += deltaScale;
}
ring->focusState = INV_FOCUS_STATE_FOCUSED;
return 0;
}
__int32 Inventory::PopoverObject()
{
InventoryRing* ring = &m_rings[m_activeRing];
__int32 steps = 8;
__int32 deltaAngle = (0 - ring->objects[ring->currentObject].rotation) / steps;
float deltaScale = INV_OBJECT_SCALE / (float)steps;
ring->focusState = INV_FOCUS_STATE_POPOVER;
for (__int32 i = 0; i < steps; i++)
{
g_Renderer->DrawInventory();
g_Renderer->SyncRenderer();
ring->objects[ring->currentObject].rotation -= deltaAngle;
ring->objects[ring->currentObject].scale -= deltaScale;
}
ring->focusState = INV_FOCUS_STATE_NONE;
return 0;
}
__int32 Inventory::GetType()
{
return m_type;
}