diff --git a/Build/PCTomb5.idb b/Build/PCTomb5.idb index d5d4a83e4..5ff61b3a4 100644 Binary files a/Build/PCTomb5.idb and b/Build/PCTomb5.idb differ diff --git a/TR5Main/Global/objectslist.h b/TR5Main/Global/objectslist.h index e945b28f5..94c3d7169 100644 --- a/TR5Main/Global/objectslist.h +++ b/TR5Main/Global/objectslist.h @@ -73,7 +73,7 @@ typedef enum object_types { ID_SCIENTIST, ID_MERCENARY, // TR3 ID_WILLOWISP, - ID_SHARK, // TR2 + ID_SHARK, // TR2 - OK ID_INVISIBLE_GHOST, ID_BADDY1, // TR4 - OK (implement picking, correct special moves) ID_REAPER, @@ -418,7 +418,7 @@ typedef enum object_types { ID_WATERFALLSS1, ID_WATERFALLSS2, ID_ANIMATING1, - ID_BARRACUDA, // TR2 - 28 + ID_BARRACUDA, // TR2 - OK ID_ANIMATING2, ID_MONK_WITH_STICK, // TR2 - 53 ID_ANIMATING3, @@ -428,11 +428,11 @@ typedef enum object_types { ID_ANIMATING5, ID_DISK, // TR2 - 61 ID_ANIMATING6, - ID_STATUE_WITH_BLADE, // TR2 - 82 + ID_STATUE_WITH_BLADE, // TR2 - OK ID_ANIMATING7, - ID_SPRINGBOARD, // TR2 - 57? + ID_SPRINGBOARD, // TR2 - OK ID_ANIMATING8, - ID_ROLLING_SPINDLE, // TR2 - 80 + ID_ROLLING_SPINDLE, // TR2 - OK ID_ANIMATING9, ID_WOLF, // TR1 - 7 ID_ANIMATING10, diff --git a/TR5Main/Objects/animals.cpp b/TR5Main/Objects/animals.cpp index 84b339e36..8ea472911 100644 --- a/TR5Main/Objects/animals.cpp +++ b/TR5Main/Objects/animals.cpp @@ -14,6 +14,7 @@ BITE_INFO smallScorpionBiteInfo2 = { 0, 0, 0, 23 }; BITE_INFO batBiteInfo = { 0, 16, 45, 4 }; BITE_INFO barracudaBite = { 2, -60, 121, 7 }; BITE_INFO sharkBite = { 17, -22, 344, 12 }; +BITE_INFO tigerBite = { 19, -13, 3, 26 }; void __cdecl InitialiseWildBoar(__int16 itemNum) { @@ -691,4 +692,134 @@ void __cdecl SharkControl(__int16 itemNum) } else AnimateItem(item); +} + +void __cdecl TigerControl(__int16 itemNum) +{ + __int16 head = 0; + __int16 angle = 0; + __int16 tilt = 0; + + if (!CreatureActive(itemNum)) + return; + + ITEM_INFO* item = &Items[itemNum]; + CREATURE_INFO* creature = (CREATURE_INFO *)item->data; + + if (item->hitPoints <= 0) + { + if (item->currentAnimState != 9) + { + item->animNumber = Objects[item->objectNumber].animIndex + 11; + item->frameNumber = Anims[item->animNumber].frameBase; + item->currentAnimState = 9; + } + } + else + { + AI_INFO info; + CreatureAIInfo(item, &info); + + if (info.ahead) + head = info.angle; + + GetCreatureMood(item, &info, 1); + + if (creature->alerted && info.zoneNumber != info.enemyZone) + creature->mood = MOOD_TYPE::ESCAPE_MOOD; + + CreatureMood(item, &info, 1); + + angle = CreatureTurn(item, creature->maximumTurn); + + switch (item->currentAnimState) + { + case 1: + creature->maximumTurn = 0; + creature->flags = 0; + + if (creature->mood == MOOD_TYPE::ESCAPE_MOOD) + { + if (Lara.target != item && info.ahead) + item->goalAnimState = 1; + else + item->goalAnimState = 3; + } + else if (creature->mood == MOOD_TYPE::BORED_MOOD) + { + __int16 random = GetRandomControl(); + if (random < 0x60) + item->goalAnimState = 5; + else if (random < 0x460); + item->goalAnimState = 2; + } + else if (info.bite && info.distance < SQUARE(340)) + item->goalAnimState = 6; + else if (info.bite && info.distance < SQUARE(1024)) + { + creature->maximumTurn = ANGLE(3); + item->goalAnimState = 8; + } + else if (item->requiredAnimState) + item->goalAnimState = item->requiredAnimState; + else if (creature->mood != ATTACK_MOOD && GetRandomControl() < 0x60) + item->goalAnimState = 5; + else + item->goalAnimState = 3; + break; + + case 2: + creature->maximumTurn = ANGLE(3); + + if (creature->mood == MOOD_TYPE::ESCAPE_MOOD || creature->mood == MOOD_TYPE::ATTACK_MOOD) + item->goalAnimState = 3; + else if (GetRandomControl() < 0x60) + { + item->goalAnimState = 1; + item->requiredAnimState = 5; + } + break; + + case 3: + creature->maximumTurn = ANGLE(6); + + if (creature->mood == MOOD_TYPE::BORED_MOOD) + item->goalAnimState = 1; + else if (creature->flags && info.ahead) + item->goalAnimState = 1; + else if (info.bite && info.distance < SQUARE(1536)) + { + if (LaraItem->speed == 0) + item->goalAnimState = 1; + else + item->goalAnimState = 7; + } + else if (creature->mood != MOOD_TYPE::ATTACK_MOOD && GetRandomControl() < 0x60) + { + item->requiredAnimState = 5; + item->goalAnimState = 1; + } + else if (creature->mood == MOOD_TYPE::ESCAPE_MOOD && Lara.target != item && info.ahead) + item->goalAnimState = 1; + + creature->flags = 0; + break; + + case 6: + case 7: + case 8: + if (!creature->flags && (item->touchBits & 0x7FDC000)) + { + LaraItem->hitStatus = true; + LaraItem->hitPoints -= 90; + CreatureEffect(item, &tigerBite, DoBloodSplat); + creature->flags = 1; + } + break; + } + } + + CreatureTilt(item, tilt); + CreatureJoint(item, 0, head); + CreatureAnimation(itemNum, angle, tilt); } \ No newline at end of file diff --git a/TR5Main/Objects/objects.h b/TR5Main/Objects/objects.h index 3822e803a..16e37dc06 100644 --- a/TR5Main/Objects/objects.h +++ b/TR5Main/Objects/objects.h @@ -74,3 +74,5 @@ void __cdecl InitialiseKillerStatue(__int16 item_number); void __cdecl KillerStatueControl(__int16 item_number); void __cdecl SpringBoardControl(__int16 item_number); + +void __cdecl TigerControl(__int16 itemNum); diff --git a/TR5Main/Specific/setup.cpp b/TR5Main/Specific/setup.cpp index fb88599e3..d99f40083 100644 --- a/TR5Main/Specific/setup.cpp +++ b/TR5Main/Specific/setup.cpp @@ -49,10 +49,10 @@ void __cdecl NewObjects() obj->saveAnim = true; obj->saveFlags = true; - Bones[obj->boneIndex + 192] |= 0x10; - Bones[obj->boneIndex + 192] |= 0x08; - Bones[obj->boneIndex + 208] |= 0x10; - Bones[obj->boneIndex + 208] |= 0x08; + Bones[obj->boneIndex + 192] |= ROT_Z; + Bones[obj->boneIndex + 192] |= ROT_Y; + Bones[obj->boneIndex + 208] |= ROT_Z; + Bones[obj->boneIndex + 208] |= ROT_Y; } obj = &Objects[ID_BAT]; @@ -142,10 +142,10 @@ void __cdecl NewObjects() obj->saveAnim = true; obj->saveFlags = true; - Bones[obj->boneIndex + 112] |= 0x08; - Bones[obj->boneIndex + 112] |= 0x04; - Bones[obj->boneIndex + 352] |= 0x08; - Bones[obj->boneIndex + 352] |= 0x04; + Bones[obj->boneIndex + 112] |= ROT_Y; + Bones[obj->boneIndex + 112] |= ROT_X; + Bones[obj->boneIndex + 352] |= ROT_Y; + Bones[obj->boneIndex + 352] |= ROT_X; Meshes[obj->meshIndex + 36] = Meshes[Objects[ID_MESHSWAP1].meshIndex + 32]; Meshes[obj->meshIndex + 60] = Meshes[Objects[ID_MESHSWAP1].meshIndex + 56]; @@ -168,10 +168,10 @@ void __cdecl NewObjects() obj->saveAnim = true; obj->saveFlags = true; - Bones[obj->boneIndex + 112] |= 0x08; - Bones[obj->boneIndex + 112] |= 0x04; - Bones[obj->boneIndex + 352] |= 0x08; - Bones[obj->boneIndex + 352] |= 0x04; + Bones[obj->boneIndex + 112] |= ROT_Y; + Bones[obj->boneIndex + 112] |= ROT_X; + Bones[obj->boneIndex + 352] |= ROT_Y; + Bones[obj->boneIndex + 352] |= ROT_X; } obj = &Objects[ID_SAS_CAIRO]; @@ -190,10 +190,10 @@ void __cdecl NewObjects() obj->saveAnim = true; obj->saveFlags = true; - Bones[obj->boneIndex] |= 0x08; - Bones[obj->boneIndex] |= 0x04; - Bones[obj->boneIndex + 112] |= 0x08; - Bones[obj->boneIndex + 112] |= 0x04; + Bones[obj->boneIndex] |= ROT_Y; + Bones[obj->boneIndex] |= ROT_X; + Bones[obj->boneIndex + 112] |= ROT_Y; + Bones[obj->boneIndex + 112] |= ROT_X; } obj = &Objects[ID_MUMMY]; @@ -211,9 +211,9 @@ void __cdecl NewObjects() obj->saveAnim = true; obj->saveFlags = true; - Bones[obj->boneIndex + 112] |= 0x08; - Bones[obj->boneIndex + 112] |= 0x04; - Bones[obj->boneIndex + 288] |= 0x08; + Bones[obj->boneIndex + 112] |= ROT_Y; + Bones[obj->boneIndex + 112] |= ROT_X; + Bones[obj->boneIndex + 288] |= ROT_Y; } obj = &Objects[ID_QUAD]; @@ -280,7 +280,25 @@ void __cdecl NewObjects() { obj->control = SpringBoardControl; obj->saveAnim = true; - obj->saveFlags = true;; + obj->saveFlags = true; + } + + obj = &Objects[ID_TIGER]; + if (obj->loaded) + { + obj->control = TigerControl; + obj->collision = CreatureCollision; + obj->shadowSize = 128; + obj->hitPoints = 24; + obj->pivotLength = 200; + obj->radius = 340; + obj->intelligent = true; + obj->savePosition = true; + obj->saveHitpoints = true; + obj->saveAnim = true; + obj->saveFlags = true; + + Bones[obj->boneIndex + 21 * 4] |= ROT_Y; } /* @@ -293,24 +311,6 @@ void __cdecl NewObjects() obj->saveFlags = true; } - obj = &Objects[ID_TIGER]; - if (obj->loaded) - { - obj->control = TigerControl; - obj->collision = CreatureCollision; - obj->shadowSize = UNIT_SHADOW / 2; - obj->hitPoints = TIGER_hitPoints; - obj->pivotLength = 200; - obj->radius = TIGER_RADIUS; - obj->intelligent = true; - obj->savePosition = true; - obj->saveHitpoints = true; - obj->saveAnim = true; - obj->saveFlags = true; - - Bones[obj->boneIndex + 21 * 4] |= ROT_Y; - } - obj = &Objects[ID_COBRA]; if (obj->loaded) {