mirror of
https://github.com/TombEngine/TombEngine.git
synced 2025-05-10 20:46:47 +03:00
Fixed AiPickupCollision; Fixed setup flags of many objects; Fixed item savegames; Refactored inventory; Added InitialseShootSwitch;
This commit is contained in:
parent
5a2209fc6f
commit
c69cdeee40
23 changed files with 445 additions and 156 deletions
BIN
Build/savegame.0
BIN
Build/savegame.0
Binary file not shown.
BIN
Build/savegame.1
BIN
Build/savegame.1
Binary file not shown.
BIN
Build/savegame.2
BIN
Build/savegame.2
Binary file not shown.
BIN
Build/savegame.3
BIN
Build/savegame.3
Binary file not shown.
BIN
Build/savegame.4
BIN
Build/savegame.4
Binary file not shown.
BIN
Build/savegame.5
BIN
Build/savegame.5
Binary file not shown.
|
@ -661,7 +661,7 @@ int ItemPushLara(ITEM_INFO* item, ITEM_INFO* l, COLL_INFO* coll, int spazon, cha
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
void AIPickupCollision(short itemNumber)
|
||||
void AIPickupCollision(short itemNumber, ITEM_INFO* l, COLL_INFO* c)
|
||||
{
|
||||
ITEM_INFO* item = &Items[itemNumber];
|
||||
if (item->objectNumber == ID_SHOOT_SWITCH1 && !(item->meshBits & 1))
|
||||
|
|
|
@ -20,7 +20,7 @@ short GetTiltType(FLOOR_INFO* floor, int x, int y, int z);
|
|||
int FindGridShift(int x, int z);
|
||||
int TestBoundsCollideStatic(short* bounds, PHD_3DPOS* pos, int radius);
|
||||
int ItemPushLaraStatic(ITEM_INFO* item, short* bounds, PHD_3DPOS* pos, COLL_INFO* coll);
|
||||
void AIPickupCollision(short itemNumber);
|
||||
void AIPickupCollision(short itemNumber, ITEM_INFO* l, COLL_INFO* c);
|
||||
void ObjectCollision(short itemNumber, ITEM_INFO* l, COLL_INFO* c);
|
||||
void AlignLaraPosition(PHD_VECTOR* vec, ITEM_INFO* item, ITEM_INFO* l);
|
||||
void TriggerLaraBlood();
|
||||
|
|
|
@ -568,6 +568,8 @@ GAME_STATUS DoLevel(int index, int ambient, bool loadFromSavegame)
|
|||
Camera.target.y = LaraItem->pos.yPos;
|
||||
Camera.target.z = LaraItem->pos.zPos;
|
||||
|
||||
int x = Lara.weaponItem;
|
||||
|
||||
RequiredStartPos = false;
|
||||
InitialiseGame = false;
|
||||
g_GameFlow->SelectedSaveGame = 0;
|
||||
|
|
|
@ -269,7 +269,7 @@ void Inventory::LoadObjects(bool isReload)
|
|||
}
|
||||
}
|
||||
|
||||
g_LaraExtra.Weapons[WEAPON_REVOLVER].Present = true;
|
||||
/*g_LaraExtra.Weapons[WEAPON_REVOLVER].Present = true;
|
||||
g_LaraExtra.Weapons[WEAPON_REVOLVER].Ammo[0] = 1000;
|
||||
g_LaraExtra.Weapons[WEAPON_REVOLVER].SelectedAmmo = WEAPON_AMMO1;
|
||||
g_LaraExtra.Weapons[WEAPON_REVOLVER].HasLasersight = true;
|
||||
|
@ -296,8 +296,8 @@ void Inventory::LoadObjects(bool isReload)
|
|||
g_LaraExtra.Weapons[WEAPON_GRENADE_LAUNCHER].SelectedAmmo = WEAPON_AMMO1;
|
||||
|
||||
g_LaraExtra.Weapons[WEAPON_HARPOON_GUN].Present = true;
|
||||
g_LaraExtra.Weapons[WEAPON_HARPOON_GUN].Ammo[0] = 1000;*/
|
||||
}
|
||||
g_LaraExtra.Weapons[WEAPON_HARPOON_GUN].Ammo[0] = 1000;
|
||||
}*/
|
||||
|
||||
// Now fill the rings
|
||||
if (g_GameFlow->GetLevel(CurrentLevel)->LaraType != LARA_YOUNG)
|
||||
|
@ -422,49 +422,49 @@ void Inventory::LoadObjects(bool isReload)
|
|||
InsertObject(INV_RING_WEAPONS, INV_OBJECT_CROWBAR);
|
||||
|
||||
int i;
|
||||
for (i = 0; i < 8; i++)
|
||||
for (i = 0; i < NUM_PUZZLES; i++)
|
||||
{
|
||||
if (g_LaraExtra.Puzzles[i])
|
||||
InsertObject(INV_RING_PUZZLES, i + INV_OBJECT_PUZZLE1);
|
||||
}
|
||||
|
||||
for (i = 0; i < 16; i++)
|
||||
for (i = 0; i < NUM_PUZZLES * 2; i++)
|
||||
{
|
||||
if (g_LaraExtra.PuzzlesCombo[i])
|
||||
InsertObject(INV_RING_PUZZLES, i + INV_OBJECT_PUZZLE1_COMBO1);
|
||||
}
|
||||
|
||||
for (i = 0; i < 8; i++)
|
||||
for (i = 0; i < NUM_KEYS; i++)
|
||||
{
|
||||
if (g_LaraExtra.Keys[i])
|
||||
InsertObject(INV_RING_PUZZLES, i + INV_OBJECT_KEY1);
|
||||
}
|
||||
|
||||
for (i = 0; i < 16; i++)
|
||||
for (i = 0; i < NUM_KEYS * 2; i++)
|
||||
{
|
||||
if (g_LaraExtra.KeysCombo[i])
|
||||
InsertObject(INV_RING_PUZZLES, i + INV_OBJECT_KEY1_COMBO1);
|
||||
}
|
||||
|
||||
for (i = 0; i < 4; i++)
|
||||
for (i = 0; i < NUM_PICKUPS; i++)
|
||||
{
|
||||
if (g_LaraExtra.Pickups[i])
|
||||
InsertObject(INV_RING_PUZZLES, i + INV_OBJECT_PICKUP1);
|
||||
}
|
||||
|
||||
for (i = 0; i < 8; i++)
|
||||
for (i = 0; i < NUM_PICKUPS * 2; i++)
|
||||
{
|
||||
if (g_LaraExtra.PickupsCombo[i])
|
||||
InsertObject(INV_RING_PUZZLES, i + INV_OBJECT_PICKUP1_COMBO1);
|
||||
}
|
||||
|
||||
for (i = 0; i < 3; i++)
|
||||
for (i = 0; i < NUM_EXAMINES; i++)
|
||||
{
|
||||
if (g_LaraExtra.Examines[i])
|
||||
InsertObject(INV_RING_PUZZLES, i + INV_OBJECT_EXAMINE1);
|
||||
}
|
||||
|
||||
for (i = 0; i < 6; i++)
|
||||
for (i = 0; i < NUM_EXAMINES * 2; i++)
|
||||
{
|
||||
if (g_LaraExtra.ExaminesCombo[i])
|
||||
InsertObject(INV_RING_PUZZLES, i + INV_OBJECT_EXAMINE1_COMBO1);
|
||||
|
|
|
@ -657,12 +657,13 @@ void InitialiseLara(int restore)
|
|||
else
|
||||
{
|
||||
memset(&Lara, 0, sizeof(LARA_INFO));
|
||||
ZeroMemory(&g_LaraExtra, sizeof(LaraExtraInfo));
|
||||
|
||||
g_LaraExtra.ExtraAnim = -1;
|
||||
g_LaraExtra.Vehicle = NO_ITEM;
|
||||
g_LaraExtra.Weapons[WEAPON_PISTOLS].Present = Objects[ID_PISTOLS_ITEM].loaded;
|
||||
}
|
||||
|
||||
Lara.look = TRUE;
|
||||
Lara.look = true;
|
||||
Lara.itemNumber = itemNumber;
|
||||
Lara.hitDirection = -1;
|
||||
Lara.air = 1800;
|
||||
|
@ -676,43 +677,32 @@ void InitialiseLara(int restore)
|
|||
Lara.highestLocation = -1;
|
||||
Lara.ropePtr = -1;
|
||||
LaraItem->hitPoints = 1000;
|
||||
|
||||
/*
|
||||
TODO: scripting
|
||||
for (i = 0; i < gfNumPickups; i++)
|
||||
{
|
||||
DEL_picked_up_object(convert_invobto_obj(gfPickups[i]));
|
||||
}
|
||||
|
||||
gfNumPickups = 0;*/
|
||||
|
||||
Lara.gunStatus = LG_NO_ARMS;
|
||||
Lara.skelebob = 0;
|
||||
|
||||
short gun = WEAPON_NONE;
|
||||
|
||||
if (LaraDrawType != LARA_YOUNG && Objects[ID_PISTOLS_ITEM].loaded)
|
||||
gun = WEAPON_PISTOLS;
|
||||
|
||||
//if ((gfLevelFlags & GF_LVOP_TRAIN) && Objects[HK_ITEM].loaded && (Lara.hk_type_carried & WTYPE_PRESENT))
|
||||
// gun = WEAPON_HK;
|
||||
if (LaraDrawType != LARA_YOUNG)
|
||||
{
|
||||
if (Objects[ID_PISTOLS_ITEM].loaded)
|
||||
gun = WEAPON_PISTOLS;
|
||||
else if (Objects[ID_HK_ITEM].loaded)
|
||||
gun = WEAPON_HK;
|
||||
}
|
||||
|
||||
Lara.lastGunType = Lara.gunType = Lara.requestGunType = gun;
|
||||
|
||||
LaraInitialiseMeshes();
|
||||
|
||||
Lara.skelebob = 0;
|
||||
|
||||
if (Objects[ID_PISTOLS_ITEM].loaded)
|
||||
if (gun == WEAPON_PISTOLS)
|
||||
{
|
||||
g_LaraExtra.Weapons[WEAPON_PISTOLS].Present = true;
|
||||
g_LaraExtra.Weapons[WEAPON_PISTOLS].Ammo[WEAPON_AMMO1] = -1;
|
||||
}
|
||||
|
||||
// DEBUG LINES
|
||||
//g_LaraExtra.Weapons[WEAPON_SHOTGUN].Present = true;
|
||||
//g_LaraExtra.Weapons[WEAPON_SHOTGUN].Ammo[WEAPON_AMMO1] = -1;
|
||||
//g_LaraExtra.Weapons[WEAPON_UZI].Present = true;
|
||||
//g_LaraExtra.Weapons[WEAPON_UZI].Ammo[WEAPON_AMMO1] = -1;
|
||||
else if (gun == WEAPON_HK)
|
||||
{
|
||||
g_LaraExtra.Weapons[WEAPON_HK].Present = true;
|
||||
g_LaraExtra.Weapons[WEAPON_HK].Ammo[WEAPON_AMMO1] = 100;
|
||||
}
|
||||
|
||||
g_LaraExtra.Binoculars = true;
|
||||
|
||||
|
@ -729,51 +719,8 @@ void InitialiseLara(int restore)
|
|||
|
||||
DashTimer = 120;
|
||||
|
||||
/*for (i = 0; i < gfNumTakeaways; i++)
|
||||
{
|
||||
NailInvItem(convert_invobto_obj(gfTakeaways[i]));
|
||||
}
|
||||
|
||||
gfNumTakeaways = 0;*/
|
||||
|
||||
//weapons[WEAPON_REVOLVER].damage = gfCurrentLevel >= LVL5_BASE ? 15 : 6;
|
||||
|
||||
/*switch (gfCurrentLevel)
|
||||
{
|
||||
case 6u:
|
||||
Lara.pickupitems &= 0xFFF7u;
|
||||
|
||||
Lara.puzzleitems[0] = 10;
|
||||
return;
|
||||
case 5u:
|
||||
Lara.pickupitems = 0;
|
||||
Lara.pickupitemscombo = 0;
|
||||
Lara.keyitems = 0;
|
||||
Lara.keyitemscombo = 0;
|
||||
Lara.puzzleitemscombo = 0;
|
||||
|
||||
memset(Lara.puzzleitems, 0, 12);
|
||||
return;
|
||||
case 7u:
|
||||
Lara.pickupitems = 0;
|
||||
|
||||
Lara.puzzleitems[0] = 0;
|
||||
return;
|
||||
case 0xCu:
|
||||
Lara.pickupitems &= 0xFFFEu;
|
||||
|
||||
Lara.puzzleitems[2] = 0;
|
||||
Lara.puzzleitems[3] = 0;
|
||||
break;
|
||||
case 0xEu:
|
||||
Lara.pickupitems &= 0xFFFDu;
|
||||
break;
|
||||
default:
|
||||
if (gfCurrentLevel < LVL5_THIRTEENTH_FLOOR || gfCurrentLevel > LVL5_RED_ALERT)
|
||||
Lara.pickupitems &= 0xFFF7u;
|
||||
return;
|
||||
}*/
|
||||
|
||||
Lara.bottle = 0;
|
||||
Lara.wetcloth = CLOTH_MISSING;
|
||||
}
|
||||
|
|
|
@ -625,7 +625,7 @@ void PuzzleHoleCollision(short itemNum, ITEM_INFO* l, COLL_INFO* coll)
|
|||
}
|
||||
}
|
||||
|
||||
RemoveObjectFromInventory(item->objectNumber - 70, 1);
|
||||
RemoveObjectFromInventory(item->objectNumber - (ID_PUZZLE_HOLE1 - ID_PUZZLE_ITEM1), 1);
|
||||
|
||||
if (flag == 1)
|
||||
{
|
||||
|
@ -722,7 +722,7 @@ void KeyHoleCollision(short itemNum, ITEM_INFO* l, COLL_INFO* coll)
|
|||
l->animNumber = ANIMATION_LARA_USE_KEYCARD;
|
||||
else
|
||||
{
|
||||
RemoveObjectFromInventory(item->objectNumber - 62, 1);
|
||||
RemoveObjectFromInventory(item->objectNumber - (ID_KEY_HOLE1 - ID_KEY_ITEM1), 1);
|
||||
l->animNumber = ANIMATION_LARA_USE_KEY;
|
||||
}
|
||||
l->currentAnimState = STATE_LARA_INSERT_KEY;
|
||||
|
|
|
@ -48,6 +48,17 @@ ChunkId* SaveGame::m_chunkItemQuadInfo;
|
|||
ChunkId* SaveGame::m_chunkBats;
|
||||
ChunkId* SaveGame::m_chunkRats;
|
||||
ChunkId* SaveGame::m_chunkSpiders;
|
||||
ChunkId* SaveGame::m_chunkLaraExtraInfo;
|
||||
ChunkId* SaveGame::m_chunkWeaponInfo;
|
||||
ChunkId* SaveGame::m_chunkPuzzle;
|
||||
ChunkId* SaveGame::m_chunkKey;
|
||||
ChunkId* SaveGame::m_chunkPickup;
|
||||
ChunkId* SaveGame::m_chunkExamine;
|
||||
ChunkId* SaveGame::m_chunkPuzzleCombo;
|
||||
ChunkId* SaveGame::m_chunkKeyCombo;
|
||||
ChunkId* SaveGame::m_chunkPickupCombo;
|
||||
ChunkId* SaveGame::m_chunkExamineCombo;
|
||||
ChunkId* SaveGame::m_chunkWeaponItem;
|
||||
|
||||
extern vector<AudioTrack> g_AudioTracks;
|
||||
extern byte SequenceUsed[6];
|
||||
|
@ -127,8 +138,6 @@ void SaveGame::saveItem(int itemNumber, int runtimeItem)
|
|||
}
|
||||
|
||||
LEB128::Write(m_stream, item->objectNumber);
|
||||
LEB128::Write(m_stream, item->speed);
|
||||
LEB128::Write(m_stream, item->fallspeed);
|
||||
|
||||
if (hasData)
|
||||
{
|
||||
|
@ -146,8 +155,8 @@ void SaveGame::saveItem(int itemNumber, int runtimeItem)
|
|||
if (obj->saveFlags)
|
||||
m_writer->WriteChunkWithChildren(m_chunkItemFlags, &saveItemFlags, itemNumber, 0);
|
||||
|
||||
/*if (obj->saveMesh)
|
||||
m_writer->WriteChunk(m_chunkItemMeshes, &saveItemMesh, itemNumber, 0);*/
|
||||
if (obj->saveMesh)
|
||||
m_writer->WriteChunk(m_chunkItemMeshes, &saveItemMesh, itemNumber, 0);
|
||||
|
||||
if (obj->intelligent && item->data != NULL)
|
||||
m_writer->WriteChunk(m_chunkItemIntelligentData, &saveItemIntelligentData, itemNumber, 0);
|
||||
|
@ -203,24 +212,122 @@ void SaveGame::saveLara(int arg1, int arg2)
|
|||
for (int i = 0; i < 15; i++)
|
||||
lara.meshPtrs[i] = (short*)((char*)lara.meshPtrs[i] - (ptrdiff_t)MeshBase);
|
||||
|
||||
lara.leftArm.frameBase = (short*)((char *)lara.leftArm.frameBase - (ptrdiff_t)Objects[ID_PISTOLS_ANIM].frameBase);
|
||||
lara.rightArm.frameBase = (short*)((char *)lara.rightArm.frameBase - (ptrdiff_t)Objects[ID_PISTOLS_ANIM].frameBase);
|
||||
lara.leftArm.frameBase = (short*)((char *)lara.leftArm.frameBase - (ptrdiff_t)Objects[ID_LARA].frameBase);
|
||||
lara.rightArm.frameBase = (short*)((char *)lara.rightArm.frameBase - (ptrdiff_t)Objects[ID_LARA].frameBase);
|
||||
lara.generalPtr = (char *)lara.generalPtr - (ptrdiff_t)MallocBuffer;
|
||||
|
||||
m_stream->Write(reinterpret_cast<char*>(&lara), sizeof(Lara));
|
||||
|
||||
// Lara weapon data
|
||||
ITEM_INFO* weaponItem = &Items[Lara.weaponItem];
|
||||
if (Lara.weaponItem != NO_ITEM)
|
||||
m_writer->WriteChunk(m_chunkWeaponItem, &saveWeaponItem, Lara.weaponItem, 0);
|
||||
|
||||
// Save Lara extra info
|
||||
m_writer->WriteChunk(m_chunkLaraExtraInfo, &saveLaraExtraInfo, 0, 0);
|
||||
|
||||
// Save carried weapons
|
||||
for (int i = 0; i < NUM_WEAPONS; i++)
|
||||
{
|
||||
m_writer->WriteChunk(m_chunkWeaponInfo, &saveWeaponInfo, i, 0);
|
||||
}
|
||||
|
||||
// Save carried puzzles, keys, pickups and examines
|
||||
for (int i = 0; i < NUM_PUZZLES; i++)
|
||||
{
|
||||
if (g_LaraExtra.Puzzles[i] > 0)
|
||||
m_writer->WriteChunk(m_chunkPuzzle, &savePuzzle, i, g_LaraExtra.Puzzles[i]);
|
||||
}
|
||||
|
||||
for (int i = 0; i < NUM_PUZZLES * 2; i++)
|
||||
{
|
||||
if (g_LaraExtra.PuzzlesCombo[i] > 0)
|
||||
m_writer->WriteChunk(m_chunkPuzzleCombo, &savePuzzle, i, g_LaraExtra.PuzzlesCombo[i]);
|
||||
}
|
||||
|
||||
for (int i = 0; i < NUM_KEYS; i++)
|
||||
{
|
||||
if (g_LaraExtra.Keys[i] > 0)
|
||||
m_writer->WriteChunk(m_chunkKey, &savePuzzle, i, g_LaraExtra.Keys[i]);
|
||||
}
|
||||
|
||||
for (int i = 0; i < NUM_KEYS * 2; i++)
|
||||
{
|
||||
if (g_LaraExtra.KeysCombo[i] > 0)
|
||||
m_writer->WriteChunk(m_chunkKeyCombo, &savePuzzle, i, g_LaraExtra.KeysCombo[i]);
|
||||
}
|
||||
|
||||
for (int i = 0; i < NUM_PICKUPS; i++)
|
||||
{
|
||||
if (g_LaraExtra.Pickups[i] > 0)
|
||||
m_writer->WriteChunk(m_chunkPickup, &savePuzzle, i, g_LaraExtra.Pickups[i]);
|
||||
}
|
||||
|
||||
for (int i = 0; i < NUM_PICKUPS * 2; i++)
|
||||
{
|
||||
if (g_LaraExtra.PickupsCombo[i] > 0)
|
||||
m_writer->WriteChunk(m_chunkPickupCombo, &savePuzzle, i, g_LaraExtra.PickupsCombo[i]);
|
||||
}
|
||||
|
||||
for (int i = 0; i < NUM_EXAMINES; i++)
|
||||
{
|
||||
if (g_LaraExtra.Examines[i] > 0)
|
||||
m_writer->WriteChunk(m_chunkExamine, &savePuzzle, i, g_LaraExtra.Examines[i]);
|
||||
}
|
||||
|
||||
for (int i = 0; i < NUM_EXAMINES * 2; i++)
|
||||
{
|
||||
if (g_LaraExtra.ExaminesCombo[i] > 0)
|
||||
m_writer->WriteChunk(m_chunkExamineCombo, &savePuzzle, i, g_LaraExtra.ExaminesCombo[i]);
|
||||
}
|
||||
}
|
||||
|
||||
void SaveGame::saveWeaponItem(int arg1, int arg2)
|
||||
{
|
||||
ITEM_INFO* weaponItem = &Items[arg1];
|
||||
|
||||
LEB128::Write(m_stream, weaponItem->objectNumber);
|
||||
LEB128::Write(m_stream, weaponItem->animNumber);
|
||||
LEB128::Write(m_stream, weaponItem->frameNumber);
|
||||
LEB128::Write(m_stream, weaponItem->currentAnimState);
|
||||
LEB128::Write(m_stream, weaponItem->goalAnimState);
|
||||
LEB128::Write(m_stream, weaponItem->requiredAnimState);
|
||||
}
|
||||
|
||||
// Lara extra data
|
||||
m_writer->WriteChunkInt(m_chunkVehicle, g_LaraExtra.Vehicle);
|
||||
void SaveGame::saveLaraExtraInfo(int arg1, int arg2)
|
||||
{
|
||||
LEB128::Write(m_stream, (g_LaraExtra.Binoculars ? 1 : 0));
|
||||
LEB128::Write(m_stream, (g_LaraExtra.Lasersight ? 1 : 0));
|
||||
LEB128::Write(m_stream, (g_LaraExtra.Crowbar ? 1 : 0));
|
||||
LEB128::Write(m_stream, (g_LaraExtra.Silencer ? 1 : 0));
|
||||
LEB128::Write(m_stream, (g_LaraExtra.Torch ? 1 : 0));
|
||||
LEB128::Write(m_stream, g_LaraExtra.Secrets);
|
||||
LEB128::Write(m_stream, g_LaraExtra.ExtraAnim);
|
||||
LEB128::Write(m_stream, g_LaraExtra.Vehicle);
|
||||
LEB128::Write(m_stream, g_LaraExtra.mineL);
|
||||
LEB128::Write(m_stream, g_LaraExtra.mineR);
|
||||
LEB128::Write(m_stream, g_LaraExtra.NumFlares);
|
||||
LEB128::Write(m_stream, g_LaraExtra.NumLargeMedipacks);
|
||||
LEB128::Write(m_stream, g_LaraExtra.NumSmallMedipacks);
|
||||
}
|
||||
|
||||
void SaveGame::savePuzzle(int arg1, int arg2)
|
||||
{
|
||||
LEB128::Write(m_stream, arg1); // ID
|
||||
LEB128::Write(m_stream, arg2); // Quantity
|
||||
}
|
||||
|
||||
void SaveGame::saveWeaponInfo(int arg1, int arg2)
|
||||
{
|
||||
CarriedWeaponInfo* weapon = &g_LaraExtra.Weapons[arg1];
|
||||
|
||||
LEB128::Write(m_stream, arg1);
|
||||
LEB128::Write(m_stream, weapon->Present);
|
||||
LEB128::Write(m_stream, weapon->SelectedAmmo);
|
||||
LEB128::Write(m_stream, weapon->Ammo[WEAPON_AMMO1]);
|
||||
LEB128::Write(m_stream, weapon->Ammo[WEAPON_AMMO2]);
|
||||
LEB128::Write(m_stream, weapon->Ammo[WEAPON_AMMO3]);
|
||||
LEB128::Write(m_stream, weapon->HasSilencer);
|
||||
LEB128::Write(m_stream, weapon->HasLasersight);
|
||||
}
|
||||
|
||||
void SaveGame::saveVariables()
|
||||
|
@ -281,6 +388,17 @@ void SaveGame::Start()
|
|||
m_chunkBats = ChunkId::FromString("TR5MSgBats");
|
||||
m_chunkRats = ChunkId::FromString("TR5MSgRats");
|
||||
m_chunkSpiders = ChunkId::FromString("TR5MSgSpiders");
|
||||
m_chunkLaraExtraInfo = ChunkId::FromString("TR5MSgLaraExtraInfo");
|
||||
m_chunkWeaponInfo = ChunkId::FromString("TR5MSgWeapon");
|
||||
m_chunkPuzzle = ChunkId::FromString("TR5MSgPuzzle");
|
||||
m_chunkPuzzleCombo = ChunkId::FromString("TR5MSgPuzzleC");
|
||||
m_chunkKey = ChunkId::FromString("TR5MSgKey");
|
||||
m_chunkKeyCombo = ChunkId::FromString("TR5MSgKeyC");
|
||||
m_chunkPickup = ChunkId::FromString("TR5MSgPickup");
|
||||
m_chunkPickupCombo = ChunkId::FromString("TR5MSgPickupC");
|
||||
m_chunkExamine = ChunkId::FromString("TR5MSgExamine");
|
||||
m_chunkExamineCombo = ChunkId::FromString("TR5MSgExamineC");
|
||||
m_chunkWeaponItem = ChunkId::FromString("TR5MSgWeaponItem");
|
||||
|
||||
LastSaveGame = 0;
|
||||
}
|
||||
|
@ -317,6 +435,8 @@ void SaveGame::End()
|
|||
delete m_chunkBats;
|
||||
delete m_chunkRats;
|
||||
delete m_chunkSpiders;
|
||||
delete m_chunkLaraExtraInfo;
|
||||
delete m_chunkWeaponInfo;
|
||||
}
|
||||
|
||||
bool SaveGame::Save(char* fileName)
|
||||
|
@ -380,15 +500,16 @@ bool SaveGame::readLara()
|
|||
for (int i = 0; i < 15; i++)
|
||||
{
|
||||
Lara.meshPtrs[i] = ADD_PTR(Lara.meshPtrs[i], short, MeshBase);
|
||||
printf("MeshPtr: %d\n", Lara.meshPtrs[i]);
|
||||
//printf("MeshPtr: %d\n", Lara.meshPtrs[i]);
|
||||
}
|
||||
|
||||
Lara.leftArm.frameBase = ADD_PTR(Lara.leftArm.frameBase, short, Objects[ID_PISTOLS_ANIM].frameBase);
|
||||
Lara.rightArm.frameBase = ADD_PTR(Lara.rightArm.frameBase, short, Objects[ID_PISTOLS_ANIM].frameBase);
|
||||
Lara.leftArm.frameBase = ADD_PTR(Lara.leftArm.frameBase, short, Objects[ID_LARA].frameBase);
|
||||
Lara.rightArm.frameBase = ADD_PTR(Lara.rightArm.frameBase, short, Objects[ID_LARA].frameBase);
|
||||
|
||||
Lara.target = NULL;
|
||||
Lara.spazEffect = NULL;
|
||||
Lara.generalPtr = ADD_PTR(Lara.generalPtr, char, MallocBuffer);
|
||||
Lara.weaponItem = NO_ITEM;
|
||||
|
||||
// Is Lara burning?
|
||||
if (Lara.burn)
|
||||
|
@ -405,23 +526,6 @@ bool SaveGame::readLara()
|
|||
if (smokeFlag)
|
||||
Lara.burnSmoke = true;
|
||||
}
|
||||
|
||||
// Lara weapon data
|
||||
if (Lara.weaponItem)
|
||||
{
|
||||
short weaponItemNum = CreateItem();
|
||||
Lara.weaponItem = weaponItemNum;
|
||||
|
||||
ITEM_INFO* weaponItem = &Items[Lara.weaponItem];
|
||||
|
||||
weaponItem->objectNumber = LEB128::ReadInt16(m_stream);
|
||||
weaponItem->animNumber = LEB128::ReadInt16(m_stream);
|
||||
weaponItem->frameNumber = LEB128::ReadInt16(m_stream);
|
||||
weaponItem->currentAnimState = LEB128::ReadInt16(m_stream);
|
||||
weaponItem->goalAnimState = LEB128::ReadInt16(m_stream);
|
||||
weaponItem->requiredAnimState = LEB128::ReadInt16(m_stream);
|
||||
weaponItem->roomNumber = 255;
|
||||
}
|
||||
|
||||
m_reader->ReadChunks(&readLaraChunks, 0);
|
||||
|
||||
|
@ -451,9 +555,6 @@ bool SaveGame::readItem()
|
|||
AddActiveItem(itemNumber);
|
||||
}
|
||||
|
||||
item->speed = LEB128::ReadInt16(m_stream);
|
||||
item->fallspeed = LEB128::ReadInt16(m_stream);
|
||||
|
||||
if (itemKind == 0x2000)
|
||||
{
|
||||
KillItem(itemNumber);
|
||||
|
@ -631,11 +732,102 @@ void SaveGame::saveStaticFlag(int arg1, int arg2)
|
|||
|
||||
bool SaveGame::readLaraChunks(ChunkId* chunkId, int maxSize, int arg)
|
||||
{
|
||||
if (chunkId->EqualsTo(m_chunkVehicle))
|
||||
if (chunkId->EqualsTo(m_chunkLaraExtraInfo))
|
||||
{
|
||||
g_LaraExtra.Vehicle = m_reader->ReadChunkInt16(maxSize);
|
||||
g_LaraExtra.Binoculars = LEB128::ReadByte(m_stream);
|
||||
g_LaraExtra.Lasersight = LEB128::ReadByte(m_stream);
|
||||
g_LaraExtra.Crowbar = LEB128::ReadByte(m_stream);
|
||||
g_LaraExtra.Silencer = LEB128::ReadByte(m_stream);
|
||||
g_LaraExtra.Torch = LEB128::ReadByte(m_stream);
|
||||
g_LaraExtra.Secrets = LEB128::ReadInt32(m_stream);
|
||||
g_LaraExtra.ExtraAnim = LEB128::ReadInt16(m_stream);
|
||||
g_LaraExtra.Vehicle = LEB128::ReadInt16(m_stream);
|
||||
g_LaraExtra.mineL = LEB128::ReadByte(m_stream);
|
||||
g_LaraExtra.mineR = LEB128::ReadByte(m_stream);
|
||||
g_LaraExtra.NumFlares = LEB128::ReadInt32(m_stream);
|
||||
g_LaraExtra.NumLargeMedipacks = LEB128::ReadInt32(m_stream);
|
||||
g_LaraExtra.NumSmallMedipacks = LEB128::ReadInt32(m_stream);
|
||||
|
||||
return true;
|
||||
}
|
||||
else if (chunkId->EqualsTo(m_chunkWeaponInfo))
|
||||
{
|
||||
int id = LEB128::ReadInt32(m_stream);
|
||||
|
||||
CarriedWeaponInfo* weapon = &g_LaraExtra.Weapons[id];
|
||||
|
||||
weapon->Present = LEB128::ReadByte(m_stream);
|
||||
weapon->SelectedAmmo = LEB128::ReadByte(m_stream);
|
||||
weapon->Ammo[WEAPON_AMMO1] = LEB128::ReadInt16(m_stream);
|
||||
weapon->Ammo[WEAPON_AMMO2] = LEB128::ReadInt16(m_stream);
|
||||
weapon->Ammo[WEAPON_AMMO3] = LEB128::ReadInt16(m_stream);
|
||||
weapon->HasSilencer = LEB128::ReadByte(m_stream);
|
||||
weapon->HasLasersight = LEB128::ReadByte(m_stream);
|
||||
}
|
||||
else if (chunkId->EqualsTo(m_chunkPuzzle))
|
||||
{
|
||||
int id = LEB128::ReadInt32(m_stream);
|
||||
int quantity = LEB128::ReadInt32(m_stream);
|
||||
g_LaraExtra.Puzzles[id] = quantity;
|
||||
}
|
||||
else if (chunkId->EqualsTo(m_chunkPuzzleCombo))
|
||||
{
|
||||
int id = LEB128::ReadInt32(m_stream);
|
||||
int quantity = LEB128::ReadInt32(m_stream);
|
||||
g_LaraExtra.PuzzlesCombo[id] = quantity;
|
||||
}
|
||||
else if (chunkId->EqualsTo(m_chunkKey))
|
||||
{
|
||||
int id = LEB128::ReadInt32(m_stream);
|
||||
int quantity = LEB128::ReadInt32(m_stream);
|
||||
g_LaraExtra.Keys[id] = quantity;
|
||||
}
|
||||
else if (chunkId->EqualsTo(m_chunkKeyCombo))
|
||||
{
|
||||
int id = LEB128::ReadInt32(m_stream);
|
||||
int quantity = LEB128::ReadInt32(m_stream);
|
||||
g_LaraExtra.KeysCombo[id] = quantity;
|
||||
}
|
||||
else if (chunkId->EqualsTo(m_chunkPickup))
|
||||
{
|
||||
int id = LEB128::ReadInt32(m_stream);
|
||||
int quantity = LEB128::ReadInt32(m_stream);
|
||||
g_LaraExtra.Pickups[id] = quantity;
|
||||
}
|
||||
else if (chunkId->EqualsTo(m_chunkPickupCombo))
|
||||
{
|
||||
int id = LEB128::ReadInt32(m_stream);
|
||||
int quantity = LEB128::ReadInt32(m_stream);
|
||||
g_LaraExtra.PickupsCombo[id] = quantity;
|
||||
}
|
||||
else if (chunkId->EqualsTo(m_chunkExamine))
|
||||
{
|
||||
int id = LEB128::ReadInt32(m_stream);
|
||||
int quantity = LEB128::ReadInt32(m_stream);
|
||||
g_LaraExtra.Examines[id] = quantity;
|
||||
}
|
||||
else if (chunkId->EqualsTo(m_chunkExamineCombo))
|
||||
{
|
||||
int id = LEB128::ReadInt32(m_stream);
|
||||
int quantity = LEB128::ReadInt32(m_stream);
|
||||
g_LaraExtra.ExaminesCombo[id] = quantity;
|
||||
}
|
||||
else if (chunkId->EqualsTo(m_chunkWeaponItem))
|
||||
{
|
||||
short weaponItemNum = CreateItem();
|
||||
Lara.weaponItem = weaponItemNum;
|
||||
|
||||
ITEM_INFO* weaponItem = &Items[Lara.weaponItem];
|
||||
|
||||
weaponItem->objectNumber = LEB128::ReadInt16(m_stream);
|
||||
weaponItem->animNumber = LEB128::ReadInt16(m_stream);
|
||||
weaponItem->frameNumber = LEB128::ReadInt16(m_stream);
|
||||
weaponItem->currentAnimState = LEB128::ReadInt16(m_stream);
|
||||
weaponItem->goalAnimState = LEB128::ReadInt16(m_stream);
|
||||
weaponItem->requiredAnimState = LEB128::ReadInt16(m_stream);
|
||||
weaponItem->roomNumber = 255;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -777,6 +969,9 @@ bool SaveGame::readItemChunks(ChunkId* chunkId, int maxSize, int itemNumber)
|
|||
if (item->roomNumber != roomNumber)
|
||||
ItemNewRoom(itemNumber, roomNumber);
|
||||
|
||||
item->speed = LEB128::ReadInt16(m_stream);
|
||||
item->fallspeed = LEB128::ReadInt16(m_stream);
|
||||
|
||||
return true;
|
||||
}
|
||||
else if (chunkId->EqualsTo(m_chunkItemHitPoints))
|
||||
|
@ -864,6 +1059,13 @@ bool SaveGame::readItemChunks(ChunkId* chunkId, int maxSize, int itemNumber)
|
|||
|
||||
return true;
|
||||
}
|
||||
else if (chunkId->EqualsTo(m_chunkItemMeshes))
|
||||
{
|
||||
item->meshBits = LEB128::ReadInt32(m_stream);
|
||||
item->swapMeshFlags = LEB128::ReadInt32(m_stream);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
@ -993,12 +1195,16 @@ void SaveGame::saveItemPosition(int arg1, int arg2)
|
|||
LEB128::Write(m_stream, item->pos.yRot);
|
||||
LEB128::Write(m_stream, item->pos.zRot);
|
||||
LEB128::Write(m_stream, item->roomNumber);
|
||||
LEB128::Write(m_stream, item->speed);
|
||||
LEB128::Write(m_stream, item->fallspeed);
|
||||
}
|
||||
|
||||
void SaveGame::saveItemMesh(int arg1, int arg2)
|
||||
{
|
||||
ITEM_INFO* item = &Items[arg1];
|
||||
|
||||
LEB128::Write(m_stream, item->meshBits);
|
||||
LEB128::Write(m_stream, item->swapMeshFlags);
|
||||
}
|
||||
|
||||
void SaveGame::saveItemAnims(int arg1, int arg2)
|
||||
|
@ -1327,8 +1533,7 @@ bool SaveGame::readBats()
|
|||
|
||||
char* buffer = (char*)malloc(sizeof(BAT_STRUCT));
|
||||
m_stream->Read(buffer, sizeof(BAT_STRUCT));
|
||||
BAT_STRUCT* b = reinterpret_cast<BAT_STRUCT*>(buffer);
|
||||
memcpy(&bats, b, sizeof(BAT_STRUCT));
|
||||
memcpy(bats, buffer, sizeof(BAT_STRUCT));
|
||||
free(buffer);
|
||||
|
||||
return true;
|
||||
|
@ -1342,8 +1547,7 @@ bool SaveGame::readRats()
|
|||
|
||||
char* buffer = (char*)malloc(sizeof(RAT_STRUCT));
|
||||
m_stream->Read(buffer, sizeof(RAT_STRUCT));
|
||||
RAT_STRUCT* r = reinterpret_cast<RAT_STRUCT*>(buffer);
|
||||
memcpy(&rats, r, sizeof(RAT_STRUCT));
|
||||
memcpy(rats, buffer, sizeof(RAT_STRUCT));
|
||||
free(buffer);
|
||||
|
||||
return true;
|
||||
|
@ -1357,8 +1561,7 @@ bool SaveGame::readSpiders()
|
|||
|
||||
char* buffer = (char*)malloc(sizeof(SPIDER_STRUCT));
|
||||
m_stream->Read(buffer, sizeof(SPIDER_STRUCT));
|
||||
SPIDER_STRUCT* s = reinterpret_cast<SPIDER_STRUCT*>(buffer);
|
||||
memcpy(&spiders, s, sizeof(SPIDER_STRUCT));
|
||||
memcpy(spiders, buffer, sizeof(SPIDER_STRUCT));
|
||||
free(buffer);
|
||||
|
||||
return true;
|
||||
|
|
|
@ -69,6 +69,17 @@ private:
|
|||
static ChunkId* m_chunkRats;
|
||||
static ChunkId* m_chunkSpiders;
|
||||
static ChunkId* m_chunkBats;
|
||||
static ChunkId* m_chunkLaraExtraInfo;
|
||||
static ChunkId* m_chunkWeaponInfo;
|
||||
static ChunkId* m_chunkPuzzle;
|
||||
static ChunkId* m_chunkKey;
|
||||
static ChunkId* m_chunkPickup;
|
||||
static ChunkId* m_chunkExamine;
|
||||
static ChunkId* m_chunkPuzzleCombo;
|
||||
static ChunkId* m_chunkKeyCombo;
|
||||
static ChunkId* m_chunkPickupCombo;
|
||||
static ChunkId* m_chunkExamineCombo;
|
||||
static ChunkId* m_chunkWeaponItem;
|
||||
|
||||
static void saveGameStatus(int arg1, int arg2);
|
||||
static void saveLara(int arg1, int arg2);
|
||||
|
@ -99,6 +110,10 @@ private:
|
|||
static void saveRats(int arg1, int arg2);
|
||||
static void saveBats(int arg1, int arg2);
|
||||
static void saveSpiders(int arg1, int arg2);
|
||||
static void saveLaraExtraInfo(int arg1, int arg2);
|
||||
static void savePuzzle(int arg1, int arg2);
|
||||
static void saveWeaponInfo(int arg1, int arg2);
|
||||
static void saveWeaponItem(int arg1, int arg2);
|
||||
|
||||
static bool readGameStatus();
|
||||
static bool readLara();
|
||||
|
|
|
@ -1375,6 +1375,13 @@ void InitialiseSwitch(short itemNumber)
|
|||
}
|
||||
}
|
||||
|
||||
void InitialiseShootSwitch(short itemNumber)
|
||||
{
|
||||
ITEM_INFO* item = &Items[itemNumber];
|
||||
if (item->triggerFlags == 444)
|
||||
item->meshBits &= ~(1 << (Objects[item->objectNumber].nmeshes - 2));
|
||||
}
|
||||
|
||||
void InitialisePulleySwitch(short itemNumber)
|
||||
{
|
||||
ITEM_INFO* item = &Items[itemNumber];
|
||||
|
|
|
@ -31,6 +31,7 @@ void InitialiseSwitch(short itemNum);
|
|||
void InitialisePulleySwitch(short itemNumber);
|
||||
void InitialiseCrowDoveSwitch(short itemNumber);
|
||||
void ProcessExplodingSwitchType8(ITEM_INFO* item);
|
||||
void InitialiseShootSwitch(short itemNumber);
|
||||
|
||||
extern int PulleyItemNumber;
|
||||
|
||||
|
|
|
@ -187,8 +187,3 @@ constexpr auto MAX_SPLASH = 8;
|
|||
#define BAD_JUMP_CEILING ((STEP_SIZE*3)/4)
|
||||
#define LARA_RAD 100
|
||||
#define LARA_VELOCITY 12
|
||||
|
||||
#define NUM_PUZZLES 8
|
||||
#define NUM_KEYS 8
|
||||
#define NUM_PICKUPS 4
|
||||
#define NUM_EXAMINES 3
|
||||
|
|
|
@ -601,6 +601,12 @@ typedef enum GAME_OBJECT_ID
|
|||
|
||||
ID_NUMBER_OBJECTS
|
||||
};
|
||||
|
||||
#define NUM_PUZZLES (ID_PUZZLE_ITEM8 - ID_PUZZLE_ITEM1 + 1)
|
||||
#define NUM_KEYS (ID_KEY_ITEM8 - ID_KEY_ITEM1 + 1)
|
||||
#define NUM_PICKUPS (ID_PICKUP_ITEM4 - ID_PICKUP_ITEM1 + 1)
|
||||
#define NUM_EXAMINES (ID_EXAMINE3 - ID_EXAMINE1 + 1)
|
||||
|
||||
#else
|
||||
typedef enum GAME_OBJECT_ID
|
||||
{
|
||||
|
|
|
@ -241,9 +241,9 @@ typedef struct item_info_t {
|
|||
unsigned int aiBits : 5; // offset=133.1
|
||||
unsigned int reallyActive : 1; // offset=133.6
|
||||
unsigned int InDrawRoom : 1; // offset=133.7
|
||||
int swapMeshFlags;
|
||||
int swapMeshFlags;// OFF=5614
|
||||
short drawRoom;
|
||||
short TOSSPAD; // OFF=5614
|
||||
short TOSSPAD;
|
||||
} ITEM_INFO;
|
||||
|
||||
typedef struct creature_info_t
|
||||
|
|
|
@ -856,24 +856,28 @@ void Renderer11::getVisibleRooms(int from, int to, Vector4* viewPort, bool water
|
|||
collectEffects(node->To);
|
||||
|
||||
Vector4 clipPort;
|
||||
short numDoors = *(room->door);
|
||||
if (numDoors)
|
||||
|
||||
if (room->door != NULL)
|
||||
{
|
||||
short* door = room->door + 1;
|
||||
for (int i = 0; i < numDoors; i++) {
|
||||
short adjoiningRoom = *(door);
|
||||
short numDoors = *(room->door);
|
||||
if (numDoors)
|
||||
{
|
||||
short* door = room->door + 1;
|
||||
for (int i = 0; i < numDoors; i++) {
|
||||
short adjoiningRoom = *(door);
|
||||
|
||||
if (node->From != adjoiningRoom && checkPortal(node->To, door, viewPort, &node->ClipPort))
|
||||
{
|
||||
RendererRoomNode* childNode = &nodes[nextNode++];
|
||||
childNode->From = node->To;
|
||||
childNode->To = adjoiningRoom;
|
||||
if (node->From != adjoiningRoom && checkPortal(node->To, door, viewPort, &node->ClipPort))
|
||||
{
|
||||
RendererRoomNode* childNode = &nodes[nextNode++];
|
||||
childNode->From = node->To;
|
||||
childNode->To = adjoiningRoom;
|
||||
|
||||
// Push
|
||||
stack[stackDepth++] = childNode;
|
||||
// Push
|
||||
stack[stackDepth++] = childNode;
|
||||
}
|
||||
|
||||
door += 16;
|
||||
}
|
||||
|
||||
door += 16;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2055,6 +2055,7 @@ bool Renderer11::drawScene(bool dump)
|
|||
printDebugMessage("Lara.currentAnimState: %d", LaraItem->currentAnimState);
|
||||
printDebugMessage("Lara.requiredAnimState: %d", LaraItem->requiredAnimState);
|
||||
printDebugMessage("Lara.goalAnimState: %d", LaraItem->goalAnimState);
|
||||
printDebugMessage("Lara.weaponItem: %d", Lara.weaponItem);
|
||||
printDebugMessage("Room: %d %d %d %d", r->x, r->z, r->x + r->xSize * WALL_SIZE, r->z + r->ySize * WALL_SIZE);
|
||||
printDebugMessage("Camera.pos: %d %d %d", Camera.pos.x, Camera.pos.y, Camera.pos.z);
|
||||
printDebugMessage("Camera.target: %d %d %d", Camera.target.x, Camera.target.y, Camera.target.z);
|
||||
|
|
|
@ -2182,6 +2182,9 @@ void ObjectObjects()
|
|||
obj->initialise = InitialiseDoor;
|
||||
obj->control = DoorControl;
|
||||
obj->collision = DoorCollision;
|
||||
obj->saveAnim = true;
|
||||
obj->saveFlags = true;
|
||||
obj->saveMesh = true;
|
||||
}
|
||||
obj = &Objects[ID_DOOR_TYPE2];
|
||||
if (obj->loaded)
|
||||
|
@ -2189,6 +2192,9 @@ void ObjectObjects()
|
|||
obj->initialise = InitialiseDoor;
|
||||
obj->control = DoorControl;
|
||||
obj->collision = DoorCollision;
|
||||
obj->saveAnim = true;
|
||||
obj->saveFlags = true;
|
||||
obj->saveMesh = true;
|
||||
}
|
||||
obj = &Objects[ID_DOOR_TYPE3];
|
||||
if (obj->loaded)
|
||||
|
@ -2196,6 +2202,9 @@ void ObjectObjects()
|
|||
obj->initialise = InitialiseDoor;
|
||||
obj->control = DoorControl;
|
||||
obj->collision = DoorCollision;
|
||||
obj->saveAnim = true;
|
||||
obj->saveFlags = true;
|
||||
obj->saveMesh = true;
|
||||
}
|
||||
obj = &Objects[ID_DOOR_TYPE4];
|
||||
if (obj->loaded)
|
||||
|
@ -2203,6 +2212,9 @@ void ObjectObjects()
|
|||
obj->initialise = InitialiseDoor;
|
||||
obj->control = DoorControl;
|
||||
obj->collision = DoorCollision;
|
||||
obj->saveAnim = true;
|
||||
obj->saveFlags = true;
|
||||
obj->saveMesh = true;
|
||||
}
|
||||
obj = &Objects[ID_DOOR_TYPE5];
|
||||
if (obj->loaded)
|
||||
|
@ -2210,6 +2222,9 @@ void ObjectObjects()
|
|||
obj->initialise = InitialiseDoor;
|
||||
obj->control = DoorControl;
|
||||
obj->collision = DoorCollision;
|
||||
obj->saveAnim = true;
|
||||
obj->saveFlags = true;
|
||||
obj->saveMesh = true;
|
||||
}
|
||||
obj = &Objects[ID_DOOR_TYPE6];
|
||||
if (obj->loaded)
|
||||
|
@ -2217,6 +2232,9 @@ void ObjectObjects()
|
|||
obj->initialise = InitialiseDoor;
|
||||
obj->control = DoorControl;
|
||||
obj->collision = DoorCollision;
|
||||
obj->saveAnim = true;
|
||||
obj->saveFlags = true;
|
||||
obj->saveMesh = true;
|
||||
}
|
||||
obj = &Objects[ID_DOOR_TYPE7];
|
||||
if (obj->loaded)
|
||||
|
@ -2224,6 +2242,9 @@ void ObjectObjects()
|
|||
obj->initialise = InitialiseDoor;
|
||||
obj->control = DoorControl;
|
||||
obj->collision = DoorCollision;
|
||||
obj->saveAnim = true;
|
||||
obj->saveFlags = true;
|
||||
obj->saveMesh = true;
|
||||
}
|
||||
obj = &Objects[ID_DOOR_TYPE8];
|
||||
if (obj->loaded)
|
||||
|
@ -2231,6 +2252,9 @@ void ObjectObjects()
|
|||
obj->initialise = InitialiseDoor;
|
||||
obj->control = DoorControl;
|
||||
obj->collision = DoorCollision;
|
||||
obj->saveAnim = true;
|
||||
obj->saveFlags = true;
|
||||
obj->saveMesh = true;
|
||||
}
|
||||
obj = &Objects[ID_CLOSED_DOOR1];
|
||||
if (obj->loaded)
|
||||
|
@ -2238,6 +2262,9 @@ void ObjectObjects()
|
|||
obj->initialise = InitialiseDoor;
|
||||
obj->control = DoorControl;
|
||||
obj->collision = DoorCollision;
|
||||
obj->saveAnim = true;
|
||||
obj->saveFlags = true;
|
||||
obj->saveMesh = true;
|
||||
}
|
||||
obj = &Objects[ID_CLOSED_DOOR1];
|
||||
if (obj->loaded)
|
||||
|
@ -2245,6 +2272,9 @@ void ObjectObjects()
|
|||
obj->initialise = InitialiseDoor;
|
||||
obj->control = DoorControl;
|
||||
obj->collision = DoorCollision;
|
||||
obj->saveAnim = true;
|
||||
obj->saveFlags = true;
|
||||
obj->saveMesh = true;
|
||||
}
|
||||
obj = &Objects[ID_CLOSED_DOOR2];
|
||||
if (obj->loaded)
|
||||
|
@ -2252,6 +2282,9 @@ void ObjectObjects()
|
|||
obj->initialise = InitialiseDoor;
|
||||
obj->control = DoorControl;
|
||||
obj->collision = DoorCollision;
|
||||
obj->saveAnim = true;
|
||||
obj->saveFlags = true;
|
||||
obj->saveMesh = true;
|
||||
}
|
||||
obj = &Objects[ID_CLOSED_DOOR3];
|
||||
if (obj->loaded)
|
||||
|
@ -2259,6 +2292,9 @@ void ObjectObjects()
|
|||
obj->initialise = InitialiseDoor;
|
||||
obj->control = DoorControl;
|
||||
obj->collision = DoorCollision;
|
||||
obj->saveAnim = true;
|
||||
obj->saveFlags = true;
|
||||
obj->saveMesh = true;
|
||||
}
|
||||
obj = &Objects[ID_CLOSED_DOOR4];
|
||||
if (obj->loaded)
|
||||
|
@ -2266,6 +2302,9 @@ void ObjectObjects()
|
|||
obj->initialise = InitialiseDoor;
|
||||
obj->control = DoorControl;
|
||||
obj->collision = DoorCollision;
|
||||
obj->saveAnim = true;
|
||||
obj->saveFlags = true;
|
||||
obj->saveMesh = true;
|
||||
}
|
||||
obj = &Objects[ID_CLOSED_DOOR5];
|
||||
if (obj->loaded)
|
||||
|
@ -2273,6 +2312,9 @@ void ObjectObjects()
|
|||
obj->initialise = InitialiseDoor;
|
||||
obj->control = DoorControl;
|
||||
obj->collision = DoorCollision;
|
||||
obj->saveAnim = true;
|
||||
obj->saveFlags = true;
|
||||
obj->saveMesh = true;
|
||||
}
|
||||
obj = &Objects[ID_CLOSED_DOOR6];
|
||||
if (obj->loaded)
|
||||
|
@ -2280,6 +2322,9 @@ void ObjectObjects()
|
|||
obj->initialise = InitialiseDoor;
|
||||
obj->control = DoorControl;
|
||||
obj->collision = DoorCollision;
|
||||
obj->saveAnim = true;
|
||||
obj->saveFlags = true;
|
||||
obj->saveMesh = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2289,6 +2334,7 @@ void ObjectObjects()
|
|||
obj->initialise = InitialiseDoor;
|
||||
obj->control = DoorControl;
|
||||
obj->drawRoutine = Legacy_DrawLiftDoor;
|
||||
obj->saveFlags = true;
|
||||
}
|
||||
|
||||
obj = &Objects[ID_LIFT_DOORS2];
|
||||
|
@ -2297,6 +2343,7 @@ void ObjectObjects()
|
|||
obj->initialise = InitialiseDoor;
|
||||
obj->control = DoorControl;
|
||||
obj->drawRoutine = Legacy_DrawLiftDoor;
|
||||
obj->saveFlags = true;
|
||||
}
|
||||
|
||||
obj = &Objects[ID_SEQUENCE_DOOR1];
|
||||
|
@ -2305,6 +2352,8 @@ void ObjectObjects()
|
|||
obj->initialise = InitialiseDoor;
|
||||
obj->collision = DoorCollision;
|
||||
obj->control = SequenceDoorControl;
|
||||
obj->saveAnim = true;
|
||||
obj->saveFlags = true;
|
||||
}
|
||||
|
||||
obj = &Objects[ID_DOUBLE_DOORS];
|
||||
|
@ -2313,6 +2362,8 @@ void ObjectObjects()
|
|||
obj->initialise = InitialiseDoor;
|
||||
obj->collision = DoubleDoorCollision;
|
||||
obj->control = PushPullKickDoorControl;
|
||||
obj->saveAnim = true;
|
||||
obj->saveFlags = true;
|
||||
}
|
||||
|
||||
obj = &Objects[ID_UNDERWATER_DOOR];
|
||||
|
@ -2321,6 +2372,8 @@ void ObjectObjects()
|
|||
obj->initialise = InitialiseDoor;
|
||||
obj->collision = UnderwaterDoorCollision;
|
||||
obj->control = PushPullKickDoorControl;
|
||||
obj->saveAnim = true;
|
||||
obj->saveFlags = true;
|
||||
}
|
||||
|
||||
{
|
||||
|
@ -2330,6 +2383,8 @@ void ObjectObjects()
|
|||
obj->initialise = InitialiseDoor;
|
||||
obj->collision = PushPullKickDoorCollision;
|
||||
obj->control = PushPullKickDoorControl;
|
||||
obj->saveAnim = true;
|
||||
obj->saveFlags = true;
|
||||
}
|
||||
obj = &Objects[ID_PUSHPULL_DOOR2];
|
||||
if (obj->loaded)
|
||||
|
@ -2337,6 +2392,8 @@ void ObjectObjects()
|
|||
obj->initialise = InitialiseDoor;
|
||||
obj->collision = PushPullKickDoorCollision;
|
||||
obj->control = PushPullKickDoorControl;
|
||||
obj->saveAnim = true;
|
||||
obj->saveFlags = true;
|
||||
}
|
||||
obj = &Objects[ID_KICK_DOOR1];
|
||||
if (obj->loaded)
|
||||
|
@ -2344,6 +2401,8 @@ void ObjectObjects()
|
|||
obj->initialise = InitialiseDoor;
|
||||
obj->collision = PushPullKickDoorCollision;
|
||||
obj->control = PushPullKickDoorControl;
|
||||
obj->saveAnim = true;
|
||||
obj->saveFlags = true;
|
||||
}
|
||||
obj = &Objects[ID_KICK_DOOR2];
|
||||
if (obj->loaded)
|
||||
|
@ -2351,6 +2410,8 @@ void ObjectObjects()
|
|||
obj->initialise = InitialiseDoor;
|
||||
obj->collision = PushPullKickDoorCollision;
|
||||
obj->control = PushPullKickDoorControl;
|
||||
obj->saveAnim = true;
|
||||
obj->saveFlags = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2361,6 +2422,8 @@ void ObjectObjects()
|
|||
obj->initialise = InitialiseTrapDoor;
|
||||
obj->collision = FloorTrapDoorCollision;
|
||||
obj->control = TrapDoorControl;
|
||||
obj->saveAnim = true;
|
||||
obj->saveFlags = true;
|
||||
}
|
||||
obj = &Objects[ID_FLOOR_TRAPDOOR2];
|
||||
if (obj->loaded)
|
||||
|
@ -2368,6 +2431,8 @@ void ObjectObjects()
|
|||
obj->initialise = InitialiseTrapDoor;
|
||||
obj->collision = FloorTrapDoorCollision;
|
||||
obj->control = TrapDoorControl;
|
||||
obj->saveAnim = true;
|
||||
obj->saveFlags = true;
|
||||
}
|
||||
obj = &Objects[ID_CEILING_TRAPDOOR1];
|
||||
if (obj->loaded)
|
||||
|
@ -2375,6 +2440,8 @@ void ObjectObjects()
|
|||
obj->initialise = InitialiseTrapDoor;
|
||||
obj->collision = CeilingTrapDoorCollision;
|
||||
obj->control = TrapDoorControl;
|
||||
obj->saveAnim = true;
|
||||
obj->saveFlags = true;
|
||||
}
|
||||
obj = &Objects[ID_CEILING_TRAPDOOR2];
|
||||
if (obj->loaded)
|
||||
|
@ -2382,6 +2449,8 @@ void ObjectObjects()
|
|||
obj->initialise = InitialiseTrapDoor;
|
||||
obj->collision = CeilingTrapDoorCollision;
|
||||
obj->control = TrapDoorControl;
|
||||
obj->saveAnim = true;
|
||||
obj->saveFlags = true;
|
||||
}
|
||||
obj = &Objects[ID_TRAPDOOR1];
|
||||
if (obj->loaded)
|
||||
|
@ -2389,6 +2458,8 @@ void ObjectObjects()
|
|||
obj->initialise = InitialiseTrapDoor;
|
||||
obj->collision = TrapDoorCollision;
|
||||
obj->control = TrapDoorControl;
|
||||
obj->saveAnim = true;
|
||||
obj->saveFlags = true;
|
||||
}
|
||||
obj = &Objects[ID_TRAPDOOR2];
|
||||
if (obj->loaded)
|
||||
|
@ -2396,6 +2467,8 @@ void ObjectObjects()
|
|||
obj->initialise = InitialiseTrapDoor;
|
||||
obj->collision = TrapDoorCollision;
|
||||
obj->control = TrapDoorControl;
|
||||
obj->saveAnim = true;
|
||||
obj->saveFlags = true;
|
||||
}
|
||||
obj = &Objects[ID_TRAPDOOR3];
|
||||
if (obj->loaded)
|
||||
|
@ -2403,6 +2476,8 @@ void ObjectObjects()
|
|||
obj->initialise = InitialiseTrapDoor;
|
||||
obj->collision = TrapDoorCollision;
|
||||
obj->control = TrapDoorControl;
|
||||
obj->saveAnim = true;
|
||||
obj->saveFlags = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2600,6 +2675,7 @@ void ObjectObjects()
|
|||
obj->initialise = InitialiseTightRope;
|
||||
obj->collision = TightRopeCollision;
|
||||
obj->drawRoutine = NULL;
|
||||
obj->saveFlags = true;
|
||||
}
|
||||
|
||||
obj = &Objects[ID_PARALLEL_BARS];
|
||||
|
@ -2614,6 +2690,10 @@ void ObjectObjects()
|
|||
obj->initialise = InitialiseSteelDoor;
|
||||
obj->collision = SteelDoorCollision;
|
||||
obj->control = Legacy_SteelDoorControl;
|
||||
obj->saveAnim = true;
|
||||
obj->saveFlags = true;
|
||||
obj->saveMesh = true;
|
||||
obj->savePosition = true;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -2634,6 +2714,7 @@ void ObjectObjects()
|
|||
obj->initialise = InitialiseXRayMachine;
|
||||
obj->control = ControlXRayMachine;
|
||||
obj->drawRoutine = NULL;
|
||||
obj->saveFlags = true;
|
||||
}
|
||||
|
||||
// by default loaded, explosion time :D
|
||||
|
@ -2645,6 +2726,7 @@ void ObjectObjects()
|
|||
if (obj->loaded)
|
||||
{
|
||||
obj->drawRoutine = NULL;
|
||||
obj->saveFlags = true;
|
||||
}
|
||||
|
||||
obj = &Objects[ID_HIGH_OBJECT2];
|
||||
|
@ -2659,7 +2741,7 @@ void ObjectObjects()
|
|||
{
|
||||
obj->initialise = InitialiseRaisingBlock;
|
||||
obj->control = ControlRaisingBlock;
|
||||
//obj->drawRoutine = DrawScaledSpike;
|
||||
obj->saveFlags = true;
|
||||
}
|
||||
|
||||
obj = &Objects[ID_RAISING_BLOCK2];
|
||||
|
@ -2667,7 +2749,7 @@ void ObjectObjects()
|
|||
{
|
||||
obj->initialise = InitialiseRaisingBlock;
|
||||
obj->control = ControlRaisingBlock;
|
||||
//obj->drawRoutine = DrawScaledSpike;
|
||||
obj->saveFlags = true;
|
||||
}
|
||||
|
||||
obj = &Objects[ID_SMOKE_EMITTER_BLACK];
|
||||
|
@ -2676,6 +2758,7 @@ void ObjectObjects()
|
|||
obj->initialise = InitialiseSmokeEmitter;
|
||||
obj->control = SmokeEmitterControl;
|
||||
obj->drawRoutine = NULL;
|
||||
obj->saveFlags = true;
|
||||
}
|
||||
|
||||
obj = &Objects[ID_SMOKE_EMITTER_WHITE];
|
||||
|
@ -2684,6 +2767,7 @@ void ObjectObjects()
|
|||
obj->initialise = InitialiseSmokeEmitter;
|
||||
obj->control = SmokeEmitterControl;
|
||||
obj->drawRoutine = NULL;
|
||||
obj->saveFlags = true;
|
||||
}
|
||||
|
||||
obj = &Objects[ID_SMOKE_EMITTER];
|
||||
|
@ -2692,12 +2776,14 @@ void ObjectObjects()
|
|||
obj->initialise = InitialiseSmokeEmitter;
|
||||
obj->control = SmokeEmitterControl;
|
||||
obj->drawRoutine = NULL;
|
||||
obj->saveFlags = true;
|
||||
}
|
||||
|
||||
obj = &Objects[ID_LENS_FLARE];
|
||||
if (obj->loaded)
|
||||
{
|
||||
obj->drawRoutine = DrawLensFlare;
|
||||
obj->saveFlags = true;
|
||||
}
|
||||
|
||||
obj = &Objects[ID_BUBBLES];
|
||||
|
@ -2713,48 +2799,64 @@ void ObjectObjects()
|
|||
{
|
||||
obj->control = ControlWaterfallMist;
|
||||
obj->drawRoutine = NULL;
|
||||
obj->saveFlags = true;
|
||||
}
|
||||
|
||||
obj = &Objects[ID_WATERFALL1];
|
||||
if (obj->loaded)
|
||||
{
|
||||
obj->control = ControlWaterfall;
|
||||
obj->saveFlags = true;
|
||||
}
|
||||
|
||||
obj = &Objects[ID_WATERFALL2];
|
||||
if (obj->loaded)
|
||||
{
|
||||
obj->control = ControlWaterfall;
|
||||
obj->saveFlags = true;
|
||||
}
|
||||
|
||||
obj = &Objects[ID_WATERFALL3];
|
||||
if (obj->loaded)
|
||||
{
|
||||
obj->control = ControlWaterfall;
|
||||
obj->saveFlags = true;
|
||||
}
|
||||
|
||||
obj = &Objects[ID_WATERFALLSS1];
|
||||
if (obj->loaded)
|
||||
{
|
||||
obj->control = ControlWaterfall;
|
||||
obj->saveFlags = true;
|
||||
}
|
||||
|
||||
obj = &Objects[ID_WATERFALLSS2];
|
||||
if (obj->loaded)
|
||||
{
|
||||
obj->control = ControlWaterfall;
|
||||
obj->saveFlags = true;
|
||||
}
|
||||
|
||||
obj = &Objects[ID_SHOOT_SWITCH1]; /* @FIXME This setup can be wrong */
|
||||
obj = &Objects[ID_SHOOT_SWITCH1];
|
||||
if (obj->loaded)
|
||||
{
|
||||
obj->collision = ObjectCollision;
|
||||
obj->initialise = InitialiseShootSwitch;
|
||||
obj->control = AnimatingControl;
|
||||
obj->collision = AIPickupCollision;
|
||||
obj->saveAnim = true;
|
||||
obj->saveFlags = true;
|
||||
obj->saveMesh = true;
|
||||
}
|
||||
|
||||
obj = &Objects[ID_SHOOT_SWITCH2]; /* @FIXME This setup can be wrong */
|
||||
obj = &Objects[ID_SHOOT_SWITCH2];
|
||||
if (obj->loaded)
|
||||
{
|
||||
obj->collision = ObjectCollision;
|
||||
obj->initialise = InitialiseShootSwitch;
|
||||
obj->control = AnimatingControl;
|
||||
obj->collision = AIPickupCollision;
|
||||
obj->saveAnim = true;
|
||||
obj->saveFlags = true;
|
||||
obj->saveMesh = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -27,6 +27,7 @@ obj = &Objects[obid]; \
|
|||
if (obj->loaded) \
|
||||
{ \
|
||||
obj->collision = KeyHoleCollision; \
|
||||
obj->saveFlags = true; \
|
||||
}
|
||||
|
||||
#define INIT_PUZZLEHOLE(obid) \
|
||||
|
@ -35,6 +36,8 @@ if (obj->loaded) \
|
|||
{ \
|
||||
obj->collision = PuzzleHoleCollision; \
|
||||
obj->control = AnimatingControl; \
|
||||
obj->saveFlags = true; \
|
||||
obj->saveAnim = true; \
|
||||
}
|
||||
|
||||
#define INIT_PUZZLEDONE(obid) \
|
||||
|
@ -43,12 +46,10 @@ if (obj->loaded) \
|
|||
{ \
|
||||
obj->collision = PuzzleDoneCollision; \
|
||||
obj->control = AnimatingControl; \
|
||||
obj->saveFlags = true; \
|
||||
obj->saveAnim = true; \
|
||||
}
|
||||
|
||||
// normally INIT_ANIMATING have:
|
||||
//Bones[obj->boneIndex] |= ROT_Y;
|
||||
//Bones[obj->boneIndex + 4] |= ROT_X;
|
||||
|
||||
#define INIT_ANIMATING(obid) \
|
||||
obj = &Objects[obid]; \
|
||||
if (obj->loaded) \
|
||||
|
@ -56,4 +57,9 @@ if (obj->loaded) \
|
|||
obj->initialise = InitialiseAnimating; \
|
||||
obj->control = AnimatingControl; \
|
||||
obj->collision = ObjectCollision; \
|
||||
obj->saveFlags = true; \
|
||||
obj->saveAnim = true; \
|
||||
obj->saveMesh = true; \
|
||||
Bones[obj->boneIndex] |= ROT_Y; \
|
||||
Bones[obj->boneIndex + 4] |= ROT_X; \
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue