Fixed AiPickupCollision; Fixed setup flags of many objects; Fixed item savegames; Refactored inventory; Added InitialseShootSwitch;

This commit is contained in:
Montagna Marco 2020-01-12 08:02:48 +01:00
parent 5a2209fc6f
commit c69cdeee40
23 changed files with 445 additions and 156 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -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))

View file

@ -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();

View file

@ -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;

View file

@ -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);

View file

@ -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;
}

View file

@ -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;

View file

@ -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;

View file

@ -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();

View file

@ -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];

View file

@ -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;

View file

@ -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

View file

@ -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
{

View file

@ -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

View file

@ -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;
}
}
}

View file

@ -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);

View file

@ -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;
}
}

View file

@ -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; \
}