Added tiger

This commit is contained in:
MontyTRC89 2018-09-17 08:02:23 +02:00
parent 48ecbbbb6b
commit e219cb26b4
5 changed files with 176 additions and 43 deletions

Binary file not shown.

View file

@ -73,7 +73,7 @@ typedef enum object_types {
ID_SCIENTIST, ID_SCIENTIST,
ID_MERCENARY, // TR3 ID_MERCENARY, // TR3
ID_WILLOWISP, ID_WILLOWISP,
ID_SHARK, // TR2 ID_SHARK, // TR2 - OK
ID_INVISIBLE_GHOST, ID_INVISIBLE_GHOST,
ID_BADDY1, // TR4 - OK (implement picking, correct special moves) ID_BADDY1, // TR4 - OK (implement picking, correct special moves)
ID_REAPER, ID_REAPER,
@ -418,7 +418,7 @@ typedef enum object_types {
ID_WATERFALLSS1, ID_WATERFALLSS1,
ID_WATERFALLSS2, ID_WATERFALLSS2,
ID_ANIMATING1, ID_ANIMATING1,
ID_BARRACUDA, // TR2 - 28 ID_BARRACUDA, // TR2 - OK
ID_ANIMATING2, ID_ANIMATING2,
ID_MONK_WITH_STICK, // TR2 - 53 ID_MONK_WITH_STICK, // TR2 - 53
ID_ANIMATING3, ID_ANIMATING3,
@ -428,11 +428,11 @@ typedef enum object_types {
ID_ANIMATING5, ID_ANIMATING5,
ID_DISK, // TR2 - 61 ID_DISK, // TR2 - 61
ID_ANIMATING6, ID_ANIMATING6,
ID_STATUE_WITH_BLADE, // TR2 - 82 ID_STATUE_WITH_BLADE, // TR2 - OK
ID_ANIMATING7, ID_ANIMATING7,
ID_SPRINGBOARD, // TR2 - 57? ID_SPRINGBOARD, // TR2 - OK
ID_ANIMATING8, ID_ANIMATING8,
ID_ROLLING_SPINDLE, // TR2 - 80 ID_ROLLING_SPINDLE, // TR2 - OK
ID_ANIMATING9, ID_ANIMATING9,
ID_WOLF, // TR1 - 7 ID_WOLF, // TR1 - 7
ID_ANIMATING10, ID_ANIMATING10,

View file

@ -14,6 +14,7 @@ BITE_INFO smallScorpionBiteInfo2 = { 0, 0, 0, 23 };
BITE_INFO batBiteInfo = { 0, 16, 45, 4 }; BITE_INFO batBiteInfo = { 0, 16, 45, 4 };
BITE_INFO barracudaBite = { 2, -60, 121, 7 }; BITE_INFO barracudaBite = { 2, -60, 121, 7 };
BITE_INFO sharkBite = { 17, -22, 344, 12 }; BITE_INFO sharkBite = { 17, -22, 344, 12 };
BITE_INFO tigerBite = { 19, -13, 3, 26 };
void __cdecl InitialiseWildBoar(__int16 itemNum) void __cdecl InitialiseWildBoar(__int16 itemNum)
{ {
@ -691,4 +692,134 @@ void __cdecl SharkControl(__int16 itemNum)
} }
else else
AnimateItem(item); 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);
} }

View file

@ -74,3 +74,5 @@ void __cdecl InitialiseKillerStatue(__int16 item_number);
void __cdecl KillerStatueControl(__int16 item_number); void __cdecl KillerStatueControl(__int16 item_number);
void __cdecl SpringBoardControl(__int16 item_number); void __cdecl SpringBoardControl(__int16 item_number);
void __cdecl TigerControl(__int16 itemNum);

View file

@ -49,10 +49,10 @@ void __cdecl NewObjects()
obj->saveAnim = true; obj->saveAnim = true;
obj->saveFlags = true; obj->saveFlags = true;
Bones[obj->boneIndex + 192] |= 0x10; Bones[obj->boneIndex + 192] |= ROT_Z;
Bones[obj->boneIndex + 192] |= 0x08; Bones[obj->boneIndex + 192] |= ROT_Y;
Bones[obj->boneIndex + 208] |= 0x10; Bones[obj->boneIndex + 208] |= ROT_Z;
Bones[obj->boneIndex + 208] |= 0x08; Bones[obj->boneIndex + 208] |= ROT_Y;
} }
obj = &Objects[ID_BAT]; obj = &Objects[ID_BAT];
@ -142,10 +142,10 @@ void __cdecl NewObjects()
obj->saveAnim = true; obj->saveAnim = true;
obj->saveFlags = true; obj->saveFlags = true;
Bones[obj->boneIndex + 112] |= 0x08; Bones[obj->boneIndex + 112] |= ROT_Y;
Bones[obj->boneIndex + 112] |= 0x04; Bones[obj->boneIndex + 112] |= ROT_X;
Bones[obj->boneIndex + 352] |= 0x08; Bones[obj->boneIndex + 352] |= ROT_Y;
Bones[obj->boneIndex + 352] |= 0x04; Bones[obj->boneIndex + 352] |= ROT_X;
Meshes[obj->meshIndex + 36] = Meshes[Objects[ID_MESHSWAP1].meshIndex + 32]; Meshes[obj->meshIndex + 36] = Meshes[Objects[ID_MESHSWAP1].meshIndex + 32];
Meshes[obj->meshIndex + 60] = Meshes[Objects[ID_MESHSWAP1].meshIndex + 56]; Meshes[obj->meshIndex + 60] = Meshes[Objects[ID_MESHSWAP1].meshIndex + 56];
@ -168,10 +168,10 @@ void __cdecl NewObjects()
obj->saveAnim = true; obj->saveAnim = true;
obj->saveFlags = true; obj->saveFlags = true;
Bones[obj->boneIndex + 112] |= 0x08; Bones[obj->boneIndex + 112] |= ROT_Y;
Bones[obj->boneIndex + 112] |= 0x04; Bones[obj->boneIndex + 112] |= ROT_X;
Bones[obj->boneIndex + 352] |= 0x08; Bones[obj->boneIndex + 352] |= ROT_Y;
Bones[obj->boneIndex + 352] |= 0x04; Bones[obj->boneIndex + 352] |= ROT_X;
} }
obj = &Objects[ID_SAS_CAIRO]; obj = &Objects[ID_SAS_CAIRO];
@ -190,10 +190,10 @@ void __cdecl NewObjects()
obj->saveAnim = true; obj->saveAnim = true;
obj->saveFlags = true; obj->saveFlags = true;
Bones[obj->boneIndex] |= 0x08; Bones[obj->boneIndex] |= ROT_Y;
Bones[obj->boneIndex] |= 0x04; Bones[obj->boneIndex] |= ROT_X;
Bones[obj->boneIndex + 112] |= 0x08; Bones[obj->boneIndex + 112] |= ROT_Y;
Bones[obj->boneIndex + 112] |= 0x04; Bones[obj->boneIndex + 112] |= ROT_X;
} }
obj = &Objects[ID_MUMMY]; obj = &Objects[ID_MUMMY];
@ -211,9 +211,9 @@ void __cdecl NewObjects()
obj->saveAnim = true; obj->saveAnim = true;
obj->saveFlags = true; obj->saveFlags = true;
Bones[obj->boneIndex + 112] |= 0x08; Bones[obj->boneIndex + 112] |= ROT_Y;
Bones[obj->boneIndex + 112] |= 0x04; Bones[obj->boneIndex + 112] |= ROT_X;
Bones[obj->boneIndex + 288] |= 0x08; Bones[obj->boneIndex + 288] |= ROT_Y;
} }
obj = &Objects[ID_QUAD]; obj = &Objects[ID_QUAD];
@ -280,7 +280,25 @@ void __cdecl NewObjects()
{ {
obj->control = SpringBoardControl; obj->control = SpringBoardControl;
obj->saveAnim = true; 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->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]; obj = &Objects[ID_COBRA];
if (obj->loaded) if (obj->loaded)
{ {