Fixed meshes and cleaned code

This commit is contained in:
MontyTRC89 2020-03-18 06:27:45 +01:00
parent 7f25a5dfa2
commit abc5ece111
4 changed files with 18 additions and 254 deletions

View file

@ -6,11 +6,9 @@
#include "../../Game/people.h"
#include "../../Game/tomb4fx.h"
#include "../../Game/draw.h"
BITE_INFO SwatGun = { 80, 200, 13, 0 };
BITE_INFO SniperGun = { 0, 480, 110, 13 };
BITE_INFO ArmedBaddy2Gun = { -50, 220, 60, 13 };
#define STATE_GUARD_STOP 1
#define STATE_GUARD_TURN180 2
#define STATE_GUARD_FIRE_SINGLE 3
@ -36,11 +34,9 @@ BITE_INFO ArmedBaddy2Gun = { -50, 220, 60, 13 };
#define STATE_GUARD_START_USE_COMPUTER 37
#define STATE_GUARD_USE_COMPUTER 38
#define STATE_GUARD_SURREND 39
#define ANIMATION_GUARD_DEATH1 11
#define ANIMATION_GUARD_DEATH2 16
#define ANIMATION_GUARD_START_JUMP 41
#define STATE_MAFIA2_STOP 1
#define STATE_MAFIA2_TURN180_UNDRAW_GUNS 2
#define STATE_MAFIA2_FIRE 3
@ -55,26 +51,22 @@ BITE_INFO ArmedBaddy2Gun = { -50, 220, 60, 13 };
#define STATE_MAFIA2_LANDING 29
#define STATE_MAFIA2_TURN180 32
#define STATE_MAFIA2_UNDRAW_GUNS 37
#define STATE_SNIPER_STOP 1
#define STATE_SNIPER_UNHIDE 2
#define STATE_SNIPER_AIM 3
#define STATE_SNIPER_FIRE 4
#define STATE_SNIPER_HIDE 5
#define STATE_SNIPER_DEATH 6
void InitialiseGuard(short itemNum)
{
ITEM_INFO* item, *item2;
short anim;
short roomItemNumber;
item = &Items[itemNum];
ClearItem(itemNum);
anim = Objects[ID_SWAT].animIndex;
if (!Objects[ID_SWAT].loaded)
anim = Objects[ID_GUARD1].animIndex;
switch (item->triggerFlags)
{
case 0:
@ -122,7 +114,6 @@ void InitialiseGuard(short itemNum)
case 5:
FLOOR_INFO *floor;
short roomNumber;
item->animNumber = anim + 26;
item->goalAnimState = STATE_GUARD_ROPE_DOWN;
roomNumber = item->roomNumber;
@ -153,11 +144,9 @@ void InitialiseGuard(short itemNum)
break;
}
}
void InitialiseSniper(short itemNum)
{
ITEM_INFO* item;
item = &Items[itemNum];
ClearItem(itemNum);
item->animNumber = Objects[item->objectNumber].animIndex;
@ -168,11 +157,9 @@ void InitialiseSniper(short itemNum)
item->pos.xPos += SIN(item->pos.yRot);
item->pos.zPos += COS(item->pos.yRot);
}
void InitialiseGuardLaser(short itemNum)
{
ITEM_INFO* item;
item = &Items[itemNum];
ClearItem(itemNum);
item->animNumber = Objects[item->objectNumber].animIndex + 6;
@ -180,53 +167,40 @@ void InitialiseGuardLaser(short itemNum)
item->goalAnimState = STATE_GUARD_STOP;
item->currentAnimState = STATE_GUARD_STOP;
}
void GuardControl(short itemNum)
{
if (!CreatureActive(itemNum))
return;
int animIndex = 0;
if (Objects[ID_SWAT].loaded)
animIndex= Objects[ID_SWAT].animIndex;
else
animIndex = Objects[ID_GUARD1].animIndex;
ITEM_INFO* item = &Items[itemNum];
CREATURE_INFO* creature = (CREATURE_INFO*)item->data;
short angle = 0;
short joint2 = 0;
short joint1 = 0;
short joint0 = 0;
int x = item->pos.xPos;
int z = item->pos.zPos;
int dx = 870 * SIN(item->pos.yRot) >> W2V_SHIFT;
int dz = 870 * COS(item->pos.yRot) >> W2V_SHIFT;
x += dx;
z += dz;
short roomNumber = item->roomNumber;
FLOOR_INFO* floor = GetFloor(x, item->pos.yPos, z, &roomNumber);
int height1 = GetFloorHeight(floor, x, item->pos.yPos, z);
x += dx;
z += dz;
roomNumber = item->roomNumber;
floor = GetFloor(x, item->pos.yPos, z, &roomNumber);
int height2 = GetFloorHeight(floor, x, item->pos.yPos, z);
x += dx;
z += dz;
roomNumber = item->roomNumber;
floor = GetFloor(x, item->pos.yPos, z, &roomNumber);
int height3 = GetFloorHeight(floor, x, item->pos.yPos, z);
bool canJump1block;
if (item->boxNumber == LaraItem->boxNumber
|| item->pos.yPos >= height1 - 384
@ -235,7 +209,6 @@ void GuardControl(short itemNum)
canJump1block = false;
else
canJump1block = true;
bool canJump2blocks;
if (item->boxNumber == LaraItem->boxNumber
|| item->pos.yPos >= height1 - 384
@ -245,7 +218,6 @@ void GuardControl(short itemNum)
canJump2blocks = false;
else
canJump2blocks = true;
if (item->firedWeapon)
{
PHD_VECTOR pos;
@ -256,17 +228,13 @@ void GuardControl(short itemNum)
TriggerDynamicLight(pos.x, pos.y, pos.z, 2 * item->firedWeapon + 10, 192, 128, 32);
item->firedWeapon--;
}
if (item->aiBits)
GetAITarget(creature);
else
creature->enemy = LaraItem;
AI_INFO info;
AI_INFO laraInfo;
CreatureAIInfo(item, &info);
if (creature->enemy == LaraItem)
{
laraInfo.angle = info.angle;
@ -276,7 +244,6 @@ void GuardControl(short itemNum)
{
int dx = LaraItem->pos.xPos - item->pos.xPos;
int dz = LaraItem->pos.zPos - item->pos.zPos;
laraInfo.angle = ATAN(dz, dx) - item->pos.yRot;
laraInfo.distance = SQUARE(dx) + SQUARE(dz);
}
@ -303,7 +270,6 @@ void GuardControl(short itemNum)
else
{
GetCreatureMood(item, &info, creature->enemy != LaraItem);
if (item->objectNumber == ID_SCIENTIST)
{
if (item->hitPoints >= Objects[ID_SCIENTIST].hitPoints)
@ -316,7 +282,6 @@ void GuardControl(short itemNum)
creature->mood = ESCAPE_MOOD;
}
}
if (Rooms[item->roomNumber].flags & ENV_FLAG_NO_LENSFLARE) // CHECK
{
if (item->objectNumber == ID_SWAT_PLUS)
@ -341,13 +306,10 @@ void GuardControl(short itemNum)
}
}
}
CreatureMood(item, &info, creature->enemy != LaraItem);
ITEM_INFO * enemy = creature->enemy;
angle = CreatureTurn(item, creature->maximumTurn);
creature->enemy = LaraItem;
if (laraInfo.distance < 0x400000 && LaraItem->speed > 20
|| item->hitStatus
|| TargetVisible(item, &laraInfo))
@ -358,38 +320,28 @@ void GuardControl(short itemNum)
AlertAllGuards(itemNum);
}
}
creature->enemy = enemy;
GAME_VECTOR src;
src.x = item->pos.xPos;
src.y = item->pos.yPos - 384;
src.z = item->pos.zPos;
src.roomNumber = item->roomNumber;
short* frame = GetBestFrame(LaraItem);
GAME_VECTOR dest;
dest.x = LaraItem->pos.xPos;
dest.y = LaraItem->pos.yPos + ((frame[3] + 3 * frame[2]) >> 2);
dest.z = LaraItem->pos.zPos;
bool los = !LOS(&src, &dest) && item->triggerFlags != 10;
creature->maximumTurn = 0;
ITEM_INFO* currentItem;
short currentItemNumber;
PHD_VECTOR pos1, pos2;
switch (item->currentAnimState)
{
case STATE_GUARD_STOP:
creature->LOT.isJumping = false;
joint2 = laraInfo.angle;
creature->flags = 0;
if (info.ahead)
{
if (!(item->aiBits & FOLLOW))
@ -398,7 +350,6 @@ void GuardControl(short itemNum)
joint1 = info.xAngle;
}
}
if (item->objectNumber == ID_SCIENTIST && item == Lara.target)
{
item->goalAnimState = STATE_GUARD_SURREND;
@ -413,7 +364,6 @@ void GuardControl(short itemNum)
joint2 = 0;
else
joint2 = AIGuard(creature);
if (item->aiBits & PATROL1)
{
item->triggerFlags--;
@ -472,11 +422,9 @@ void GuardControl(short itemNum)
{
item->goalAnimState = STATE_GUARD_STOP;
}
if (item->triggerFlags == 11)
item->triggerFlags = 0;
break;
case STATE_GUARD_TURN180:
creature->flags = 0;
if (info.angle >= 0)
@ -486,7 +434,6 @@ void GuardControl(short itemNum)
if (item->frameNumber == Anims[item->animNumber].frameEnd)
item->pos.yRot += -ANGLE(180);
break;
case STATE_GUARD_FIRE_SINGLE:
case STATE_GUARD_FIRE_FAST:
joint0 = laraInfo.angle >> 1;
@ -504,7 +451,6 @@ void GuardControl(short itemNum)
{
item->pos.yRot += info.angle;
}
if (item->currentAnimState == STATE_GUARD_FIRE_FAST)
{
if (creature->flags)
@ -514,7 +460,6 @@ void GuardControl(short itemNum)
creature->flags = 0;
}
}
if (!creature->flags)
{
creature->flags = 1;
@ -523,11 +468,9 @@ void GuardControl(short itemNum)
ShotLara(item, &info, &SwatGun, joint0, 30);
else
ShotLara(item, &info, &SwatGun, joint0, 10);
TriggerEnergyArc((PHD_VECTOR*)& item->pos, (PHD_VECTOR*)& LaraItem->pos, 0, 0, 128, 256, 150);
}
break;
case STATE_GUARD_AIM:
creature->flags = 0;
joint0 = laraInfo.angle >> 1;
@ -545,7 +488,6 @@ void GuardControl(short itemNum)
{
item->pos.yRot += info.angle;
}
if (!Targetable(item, &info))
item->goalAnimState = STATE_GUARD_STOP;
else if (item->objectNumber == ID_GUARD1 || item->objectNumber == ID_GUARD2)
@ -553,7 +495,6 @@ void GuardControl(short itemNum)
else
item->goalAnimState = STATE_GUARD_FIRE_FAST;
break;
case STATE_GUARD_WALK:
creature->LOT.isJumping = false;
creature->maximumTurn = ANGLE(5);
@ -599,7 +540,6 @@ void GuardControl(short itemNum)
item->goalAnimState = STATE_GUARD_AIM;
}
break;
case STATE_GUARD_RUN:
creature->LOT.isJumping = false;
creature->maximumTurn = ANGLE(10);
@ -633,10 +573,8 @@ void GuardControl(short itemNum)
creature->maximumTurn = 0;
}
break;
case STATE_GUARD_ROPE_DOWN:
joint2 = laraInfo.angle;
if (item->pos.yPos <= item->floor - 2048 || item->triggerFlags != 5)
{
if (item->pos.yPos >= item->floor - 512)
@ -663,13 +601,11 @@ void GuardControl(short itemNum)
item->pos.yRot += info.angle;
}
break;
case STATE_GUARD_SITTING:
joint2 = AIGuard(creature);
if (creature->alerted)
item->goalAnimState = STATE_GUARD_STAND_UP;
break;
case STATE_GUARD_STAND_UP:
case 18:
if (item->frameNumber == Anims[item->animNumber].frameBase)
@ -680,20 +616,16 @@ void GuardControl(short itemNum)
TestTriggers(TriggerIndex, 1, 0);
break;
}
if (item->frameNumber == Anims[item->animNumber].frameBase + 44)
{
item->swapMeshFlags = 0;
short currentItemNumber = Rooms[item->roomNumber].itemNumber;
if (currentItemNumber == NO_ITEM)
break;
ITEM_INFO * currentItem;
while (true)
{
currentItem = &Items[currentItemNumber];
if (currentItem->objectNumber >= ID_ANIMATING1
&& currentItem->objectNumber <= ID_ANIMATING15
&& currentItem->roomNumber == item->roomNumber)
@ -705,10 +637,8 @@ void GuardControl(short itemNum)
if (currentItemNumber == -1)
break;
}
if (currentItemNumber == NO_ITEM)
break;
currentItem->meshBits = -3;
}
else if (item->frameNumber == Anims[item->animNumber].frameEnd)
@ -716,7 +646,6 @@ void GuardControl(short itemNum)
item->pos.yRot -= ANGLE(90);
}
break;
case 17:
joint2 = 0;
if (!item->hitStatus && LaraItem->speed < 40 && !Lara.hasFired)
@ -724,13 +653,11 @@ void GuardControl(short itemNum)
if (creature->alerted)
item->goalAnimState = 18;
break;
case STATE_GUARD_WAITING_ON_WALL:
joint2 = AIGuard(creature);
if (creature->alerted)
item->goalAnimState = STATE_GUARD_STOP;
break;
case STATE_GUARD_HUNTING:
case STATE_GUARD_HUNTING_IDLE:
if (item->currentAnimState == STATE_GUARD_HUNTING_IDLE)
@ -738,13 +665,11 @@ void GuardControl(short itemNum)
if (item->triggerFlags != 8 || !los || item->hitStatus)
item->goalAnimState = STATE_GUARD_HUNTING;
}
creature->LOT.isJumping = false;
creature->maximumTurn = ANGLE(5);
if (canJump1block || canJump2blocks || info.distance < 0x100000 || !los || item->hitStatus)
item->goalAnimState = STATE_GUARD_STOP;
break;
case STATE_GUARD_INSERT_CODE:
if (item->frameNumber == Anims[item->animNumber].frameBase + 39)
{
@ -754,7 +679,6 @@ void GuardControl(short itemNum)
TestTriggers(TriggerIndex, 1, 0);
}
break;
case STATE_GUARD_START_USE_COMPUTER:
currentItem = NULL;
for (currentItemNumber = Rooms[item->roomNumber].itemNumber; currentItemNumber != NO_ITEM; currentItemNumber = currentItem->nextItem)
@ -763,7 +687,6 @@ void GuardControl(short itemNum)
if (item->objectNumber == ID_PUZZLE_HOLE8)
break;
}
if (item->frameNumber == Anims[item->animNumber].frameBase)
{
currentItem->meshBits = 0x1FFF;
@ -806,7 +729,6 @@ void GuardControl(short itemNum)
}
}
break;
case STATE_GUARD_USE_COMPUTER:
if ((item->objectNumber != ID_SCIENTIST || item != Lara.target)
&& (GetRandomControl() & 0x7F || item->triggerFlags >= 10 || item->triggerFlags == 9))
@ -829,7 +751,6 @@ void GuardControl(short itemNum)
item->goalAnimState = STATE_GUARD_STOP;
}
break;
case STATE_GUARD_SURREND:
if (item != Lara.target && !(GetRandomControl() & 0x3F))
{
@ -837,7 +758,6 @@ void GuardControl(short itemNum)
item->requiredAnimState = STATE_GUARD_USE_COMPUTER;
item->goalAnimState = STATE_GUARD_STOP;
}
if (item->frameNumber == Anims[item->animNumber].frameBase + 39)
{
roomNumber = item->roomNumber;
@ -846,17 +766,13 @@ void GuardControl(short itemNum)
TestTriggers(TriggerIndex, 1, 0);
}
break;
default:
break;
}
}
CreatureJoint(item, 0, joint0);
CreatureJoint(item, 1, joint1);
CreatureJoint(item, 2, joint2);
if (creature->reachedGoal && creature->enemy)
{
ITEM_INFO* enemy = creature->enemy;
@ -902,7 +818,6 @@ void GuardControl(short itemNum)
item->requiredAnimState = 37;
}
}
if ((item->currentAnimState >= 20
|| item->currentAnimState == 6
|| item->currentAnimState == 8)
@ -920,35 +835,30 @@ void GuardControl(short itemNum)
item->currentAnimState = 23;
item->frameNumber = Anims[item->animNumber].frameBase;
break;
case 1:
creature->maximumTurn = 0;
item->animNumber = animIndex + 39;
item->currentAnimState = 24;
item->frameNumber = Anims[item->animNumber].frameBase;
break;
case 2:
creature->maximumTurn = 0;
item->animNumber = animIndex + 40;
item->currentAnimState = 25;
item->frameNumber = Anims[item->animNumber].frameBase;
break;
case 6:
creature->maximumTurn = 0;
item->animNumber = animIndex + 35;
item->currentAnimState = 20;
item->frameNumber = Anims[item->animNumber].frameBase;
break;
case 7:
creature->maximumTurn = 0;
item->animNumber = animIndex + 36;
item->currentAnimState = 21;
item->frameNumber = Anims[item->animNumber].frameBase;
break;
case 8:
creature->maximumTurn = 0;
item->animNumber = animIndex + 37;
@ -958,7 +868,6 @@ void GuardControl(short itemNum)
}
}
}
void SniperControl(short itemNumber)
{
if (CreatureActive(itemNumber))
@ -967,24 +876,18 @@ void SniperControl(short itemNumber)
short joint0 = 0;
short joint2 = 0;
short joint1 = 0;
ITEM_INFO* item = &Items[itemNumber];
CREATURE_INFO* creature = (CREATURE_INFO*)item->data;
if (item->firedWeapon)
{
PHD_VECTOR pos;
pos.x = SniperGun.x;
pos.y = SniperGun.y;
pos.z = SniperGun.z;
GetJointAbsPosition(item, &pos, SniperGun.meshNum);
TriggerDynamicLight(pos.x, pos.y, pos.z, 2 * item->firedWeapon + 10, 192, 128, 32);
item->firedWeapon--;
}
if (item->hitPoints > 0)
{
if (item->aiBits)
@ -995,24 +898,18 @@ void SniperControl(short itemNumber)
{
creature->enemy = LaraItem;
}
AI_INFO info;
CreatureAIInfo(item, &info);
GetCreatureMood(item, &info, VIOLENT);
CreatureMood(item, &info, VIOLENT);
angle = CreatureTurn(item, creature->maximumTurn);
if (info.ahead)
{
joint0 = info.angle >> 1;
joint2 = info.angle >> 1;
joint1 = info.xAngle;
}
creature->maximumTurn = 0;
switch (item->currentAnimState)
{
case STATE_SNIPER_STOP:
@ -1020,11 +917,9 @@ void SniperControl(short itemNumber)
if (TargetVisible(item, &info))
item->goalAnimState = STATE_SNIPER_UNHIDE;
break;
case STATE_SNIPER_UNHIDE:
item->meshBits = -1;
break;
case 3:
creature->flags = 0;
if (!TargetVisible(item, &info)
@ -1038,7 +933,6 @@ void SniperControl(short itemNumber)
item->goalAnimState = STATE_SNIPER_FIRE;
}
break;
case STATE_SNIPER_FIRE:
if (!creature->flags)
{
@ -1047,7 +941,6 @@ void SniperControl(short itemNumber)
item->firedWeapon = 2;
}
break;
default:
break;
}
@ -1062,7 +955,6 @@ void SniperControl(short itemNumber)
item->frameNumber = Anims[item->animNumber].frameBase;
}
}
CreatureTilt(item, 0);
CreatureJoint(item, 0, joint0);
CreatureJoint(item, 1, joint1);
@ -1070,63 +962,47 @@ void SniperControl(short itemNumber)
CreatureAnimation(itemNumber, angle, 0);
}
}
void InitialiseMafia2(short itemNum)
{
ITEM_INFO* item = &Items[itemNum];
ClearItem(itemNum);
item->animNumber = Objects[item->objectNumber].animIndex;
item->frameNumber = Anims[item->animNumber].frameBase;
item->goalAnimState = STATE_GUARD_STOP;
item->currentAnimState = STATE_GUARD_STOP;
item->swapMeshFlags = 9216;
}
void Mafia2Control(short itemNum)
{
if (!CreatureActive(itemNum))
return;
ITEM_INFO* item = &Items[itemNum];
CREATURE_INFO* creature = (CREATURE_INFO*)item->data;
short angle = 0;
short joint2 = 0;
short joint1 = 0;
short joint0 = 0;
// Can baddy jump? Check for a distance of 1 and 2 sectors
int x = item->pos.xPos;
int y = item->pos.yPos;
int z = item->pos.zPos;
int dx = 870 * SIN(item->pos.yRot) >> W2V_SHIFT;
int dz = 870 * COS(item->pos.yRot) >> W2V_SHIFT;
x += dx;
z += dz;
short roomNumber = item->roomNumber;
FLOOR_INFO* floor = GetFloor(x, y, z, &roomNumber);
int height1 = GetFloorHeight(floor, x, y, z);
x += dx;
z += dz;
roomNumber = item->roomNumber;
floor = GetFloor(x, y, z, &roomNumber);
int height2 = GetFloorHeight(floor, x, y, z);
x += dx;
z += dz;
roomNumber = item->roomNumber;
floor = GetFloor(x, y, z, &roomNumber);
int height3 = GetFloorHeight(floor, x, y, z);
int height = 0;
bool canJump1sector = true;
if (item->boxNumber == LaraItem->boxNumber
@ -1137,7 +1013,6 @@ void Mafia2Control(short itemNum)
height = height2;
canJump1sector = false;
}
bool canJump2sectors = true;
if (item->boxNumber == LaraItem->boxNumber
|| y >= height1 - 384
@ -1147,34 +1022,26 @@ void Mafia2Control(short itemNum)
{
canJump2sectors = false;
}
if (item->firedWeapon)
{
PHD_VECTOR pos;
pos.x = ArmedBaddy2Gun.x;
pos.y = ArmedBaddy2Gun.y;
pos.z = ArmedBaddy2Gun.z;
GetJointAbsPosition(item, &pos, ArmedBaddy2Gun.meshNum);
TriggerDynamicLight(pos.x, pos.y, pos.z, 4 * item->firedWeapon + 8, 24, 16, 4);
item->firedWeapon--;
}
AI_INFO info;
AI_INFO laraInfo;
ZeroMemory(&info, sizeof(AI_INFO));
if (item->hitPoints > 0)
{
if (item->aiBits)
GetAITarget(creature);
else
creature->enemy = LaraItem;
CreatureAIInfo(item, &info);
if (creature->enemy == LaraItem)
{
laraInfo.angle = info.angle;
@ -1184,17 +1051,13 @@ void Mafia2Control(short itemNum)
{
dx = LaraItem->pos.xPos - item->pos.xPos;
dz = LaraItem->pos.zPos - item->pos.zPos;
laraInfo.angle = ATAN(dz, dx) - item->pos.yRot;
laraInfo.distance = SQUARE(dx) + SQUARE(dz);
}
GetCreatureMood(item, &info, creature->enemy != LaraItem);
CreatureMood(item, &info, creature->enemy != LaraItem);
angle = CreatureTurn(item, creature->maximumTurn);
creature->enemy = LaraItem;
if (laraInfo.distance < SQUARE(2048) && LaraItem->speed > 20 || item->hitStatus || TargetVisible(item, &laraInfo))
{
if (!(item->aiBits & FOLLOW))
@ -1203,7 +1066,6 @@ void Mafia2Control(short itemNum)
AlertAllGuards(itemNum);
}
}
switch (item->currentAnimState)
{
case STATE_MAFIA2_STOP:
@ -1211,19 +1073,16 @@ void Mafia2Control(short itemNum)
joint2 = laraInfo.angle;
creature->flags = 0;
creature->maximumTurn = 0;
if (info.ahead && !(item->aiBits & GUARD))
{
joint0 = info.angle >> 1;
joint1 = info.xAngle;
}
if (item->aiBits & GUARD)
{
joint2 = AIGuard(creature);
break;
}
if (laraInfo.angle <= 20480 && laraInfo.angle >= -20480)
{
if (item->swapMeshFlags == 9216)
@ -1237,7 +1096,6 @@ void Mafia2Control(short itemNum)
item->goalAnimState = STATE_MAFIA2_TURN180;
break;
}
if (Targetable(item, &info))
{
if (info.distance < SQUARE(1024) || info.zoneNumber != info.enemyZone)
@ -1282,7 +1140,6 @@ void Mafia2Control(short itemNum)
}
}
break;
case STATE_MAFIA2_TURN180_UNDRAW_GUNS:
case STATE_MAFIA2_TURN180:
creature->maximumTurn = 0;
@ -1290,7 +1147,6 @@ void Mafia2Control(short itemNum)
item->pos.yRot -= ANGLE(2);
else
item->pos.yRot += ANGLE(2);
if (item->frameNumber != Anims[item->animNumber].frameBase + 16
|| item->swapMeshFlags != 9216)
{
@ -1302,7 +1158,6 @@ void Mafia2Control(short itemNum)
item->swapMeshFlags = 128;
}
break;
case STATE_MAFIA2_FIRE:
joint0 = laraInfo.angle >> 1;
joint2 = laraInfo.angle >> 1;
@ -1327,7 +1182,6 @@ void Mafia2Control(short itemNum)
item->firedWeapon = 2;
}
break;
case STATE_MAFIA2_AIM:
joint0 = laraInfo.angle >> 1;
joint2 = laraInfo.angle >> 1;
@ -1359,7 +1213,6 @@ void Mafia2Control(short itemNum)
item->goalAnimState = STATE_MAFIA2_STOP;
}
break;
case STATE_MAFIA2_WALK:
creature->LOT.isJumping = false;
creature->maximumTurn = ANGLE(5);
@ -1394,7 +1247,6 @@ void Mafia2Control(short itemNum)
}
}
break;
case STATE_MAFIA2_RUN:
creature->LOT.isJumping = false;
creature->maximumTurn = ANGLE(10);
@ -1419,7 +1271,6 @@ void Mafia2Control(short itemNum)
item->goalAnimState = STATE_MAFIA2_WALK;
}
break;
case STATE_MAFIA2_UNDRAW_GUNS:
creature->maximumTurn = 0;
if (info.angle >= 0)
@ -1430,7 +1281,6 @@ void Mafia2Control(short itemNum)
&& item->swapMeshFlags == 9216)
item->swapMeshFlags = 128;
break;
default:
break;
}
@ -1454,11 +1304,9 @@ void Mafia2Control(short itemNum)
item->frameNumber = Anims[item->animNumber].frameBase;
}
}
CreatureJoint(item, 0, joint0);
CreatureJoint(item, 1, joint1);
CreatureJoint(item, 2, joint2);
if (item->currentAnimState >= 20 || item->currentAnimState == 6 || item->currentAnimState == 8)
{
CreatureAnimation(itemNum, angle, 0);
@ -1508,3 +1356,8 @@ void Mafia2Control(short itemNum)
}
}
}
void ControlGuardLaser(short itemNumber)
{
}

View file

@ -488,17 +488,17 @@ bool Renderer11::PrepareDataForTheRenderer()
// HACK: mesh pointer 0 is the placeholder for Lara's body parts and is right hand with pistols
// We need to override the bone index because the engine will take mesh 0 while drawing pistols anim,
// and vertices have bone index 0 and not 10
int boneIndex = (Meshes[obj->meshIndex + j] == Meshes[0] ? LM_RHAND : j);
RendererMesh * mesh = getRendererMeshFromTrMesh(moveable,
Meshes[obj->meshIndex + j],
boneIndex, MoveablesIds[i] == ID_LARA_SKIN_JOINTS,
j, MoveablesIds[i] == ID_LARA_SKIN_JOINTS,
MoveablesIds[i] == ID_LARA_HAIR);
moveable->ObjectMeshes.push_back(mesh);
}
if (objNum == ID_IMP_ROCK || objNum == ID_ENERGY_BUBBLES || objNum == ID_BUBBLES)
if (objNum == ID_IMP_ROCK || objNum == ID_ENERGY_BUBBLES || objNum == ID_BUBBLES || objNum == ID_BODY_PART)
{
// HACK: these objects must have nmeshes = 0 because engine will use them in a different way while drawing Effects.
// In Core's code this was done in SETUP.C but we must do it here because we need to create renderer's meshes.
obj->nmeshes = 0;
}
else
@ -747,21 +747,6 @@ bool Renderer11::PrepareDataForTheRenderer()
}
}
// Create missing meshes (effect objects like ID_BODY_PART have nmeshes = 0 and they are "lost" with current procedures)
/*for (int i = 0; i < NumMeshPointers; i++)
{
unsigned int mp = reinterpret_cast<unsigned int>(Meshes[i]);
//RendererMesh* mesh = m_meshPointersToMesh[mp];
if (m_meshPointersToMesh.find(mp) == m_meshPointersToMesh.end())
{
RendererMesh* mesh = getRendererMeshFromTrMesh(NULL,
Meshes[i],
0,
false,
false);
}
}*/
// Create a single vertex buffer and a single index buffer for all statics
m_staticsVertexBuffer = VertexBuffer::Create(m_device, staticsVertices.size(), staticsVertices.data());
m_staticsIndexBuffer = IndexBuffer::Create(m_device, staticsIndices.size(), staticsIndices.data());

View file

@ -1481,7 +1481,7 @@ bool Renderer11::drawRats()
if (rat->on)
{
short* meshPtr = Meshes[Objects[ID_RATS_EMITTER].meshIndex + (((i + Wibble) >> 1) & 0xE)];
short* meshPtr = Meshes[Objects[ID_RATS_EMITTER].meshIndex + (rand() % 8)];
RendererMesh * mesh = m_meshPointersToMesh[reinterpret_cast<unsigned int>(meshPtr)];
Matrix translation = Matrix::CreateTranslation(rat->pos.xPos, rat->pos.yPos, rat->pos.zPos);
Matrix rotation = Matrix::CreateFromYawPitchRoll(rat->pos.yRot, rat->pos.xRot, rat->pos.zRot);

View file

@ -189,10 +189,6 @@ void NewObjects()
Bones[obj->boneIndex + 28 * 4] |= ROT_X;
Bones[obj->boneIndex + 88 * 4] |= ROT_Y;
Bones[obj->boneIndex + 88 * 4] |= ROT_X;
/*Meshes[obj->meshIndex + 18] = Meshes[Objects[ID_MESHSWAP_BADDY1].meshIndex + 16];
Meshes[obj->meshIndex + 30] = Meshes[Objects[ID_MESHSWAP_BADDY1].meshIndex + 28];
Meshes[obj->meshIndex + 18] = Meshes[Objects[ID_MESHSWAP_BADDY1].meshIndex + 11];*/
}
obj = &Objects[ID_BADDY2];
@ -929,11 +925,6 @@ void NewObjects()
Bones[obj->boneIndex + 6 * 4] |= ROT_X | ROT_Y;
Bones[obj->boneIndex + 20 * 4] |= ROT_X | ROT_Y;
// TODO: check if constants are byte, short or int
Meshes[obj->meshIndex + 60] = Meshes[Objects[ID_MESHSWAP2].meshIndex + 60];
Meshes[obj->meshIndex + 72] = Meshes[Objects[ID_MESHSWAP2].meshIndex + 72];
Meshes[obj->meshIndex + 84] = Meshes[Objects[ID_MESHSWAP2].meshIndex + 84];
}
obj = &Objects[ID_CROCODILE];
@ -1047,12 +1038,6 @@ void NewObjects()
obj->saveFlags = true;
}
// TODO: fix this
obj = &Objects[ID_ENERGY_BUBBLES];
obj->loaded = true;
obj->control = BubblesControl;
obj->nmeshes = 0;
obj = &Objects[ID_MP_WITH_GUN];
if (obj->loaded)
{
@ -1219,8 +1204,6 @@ void BaddyObjects()
Bones[obj->boneIndex + 6 * 4] |= ROT_X;
Bones[obj->boneIndex + 13 * 4] |= ROT_Y;
Bones[obj->boneIndex + 13 * 4] |= ROT_X;
//Meshes[obj->meshIndex + 10] = Meshes[Objects[ID_MESHSWAP1].meshIndex + 10];
//Meshes[obj->meshIndex + 13] = Meshes[Objects[ID_MESHSWAP1].meshIndex + 13];
}
obj = &Objects[ID_GUARD1];
@ -1249,8 +1232,6 @@ void BaddyObjects()
Bones[obj->boneIndex + 6 * 4] |= ROT_X;
Bones[obj->boneIndex + 13 * 4] |= ROT_Y;
Bones[obj->boneIndex + 13 * 4] |= ROT_X;
Meshes[obj->meshIndex + 10] = Meshes[Objects[ID_MESHSWAP1].meshIndex + 10];
Meshes[obj->meshIndex + 13] = Meshes[Objects[ID_MESHSWAP1].meshIndex + 13];
}
obj = &Objects[ID_SWAT_PLUS];
@ -1282,8 +1263,6 @@ void BaddyObjects()
Bones[obj->boneIndex + 6 * 4] |= ROT_X;
Bones[obj->boneIndex + 13 * 4] |= ROT_Y;
Bones[obj->boneIndex + 13 * 4] |= ROT_X;
//Meshes[obj->meshIndex + 10] = Meshes[Objects[ID_MESHSWAP1].meshIndex + 10];
//Meshes[obj->meshIndex + 13] = Meshes[Objects[ID_MESHSWAP1].meshIndex + 13];
}
obj = &Objects[ID_MAFIA];
@ -1316,8 +1295,6 @@ void BaddyObjects()
Bones[obj->boneIndex + 6 * 4] |= ROT_X;
Bones[obj->boneIndex + 13 * 4] |= ROT_Y;
Bones[obj->boneIndex + 13 * 4] |= ROT_X;
Meshes[obj->meshIndex + 10] = Meshes[Objects[ID_MESHSWAP1].meshIndex + 10];
Meshes[obj->meshIndex + 13] = Meshes[Objects[ID_MESHSWAP1].meshIndex + 13];
}
obj = &Objects[ID_SCIENTIST];
@ -1347,8 +1324,6 @@ void BaddyObjects()
Bones[Objects[69].boneIndex + 6 * 4] |= ROT_X;
Bones[Objects[69].boneIndex + 13 * 4] |= ROT_Y;
Bones[Objects[69].boneIndex + 13 * 4] |= ROT_X;
//Meshes[Objects[69].meshIndex + 10] = Meshes[Objects[ID_MESHSWAP1].meshIndex + 10];
//Meshes[Objects[69].meshIndex + 13] = Meshes[Objects[ID_MESHSWAP1].meshIndex + 13];
}
obj = &Objects[ID_GUARD2];
@ -1381,8 +1356,6 @@ void BaddyObjects()
Bones[obj->boneIndex + 6 * 4] |= ROT_X;
Bones[obj->boneIndex + 13 * 4] |= ROT_Y;
Bones[obj->boneIndex + 13 * 4] |= ROT_X;
Meshes[obj->meshIndex + 10] = Meshes[Objects[405].meshIndex + 10];
Meshes[obj->meshIndex + 13] = Meshes[Objects[405].meshIndex + 13];
}
obj = &Objects[ID_GUARD3];
@ -1415,8 +1388,6 @@ void BaddyObjects()
Bones[obj->boneIndex + 6 * 4] |= ROT_X;
Bones[obj->boneIndex + 13 * 4] |= ROT_Y;
Bones[obj->boneIndex + 13 * 4] |= ROT_X;
Meshes[obj->meshIndex + 10] = Meshes[Objects[405].meshIndex + 10];
Meshes[obj->meshIndex + 13] = Meshes[Objects[405].meshIndex + 13];
}
obj = &Objects[ID_ATTACK_SUB];
@ -1546,10 +1517,6 @@ void BaddyObjects()
Bones[obj->boneIndex + 6 * 4] |= ROT_X;
Bones[obj->boneIndex + 13 * 4] |= ROT_Y;
Bones[obj->boneIndex + 13 * 4] |= ROT_X;
/*Meshes[obj->meshIndex + 7] = Meshes[Objects[ID_MESHSWAP_MAFIA2].meshIndex + 7];
Meshes[obj->meshIndex + 10] = Meshes[Objects[ID_MESHSWAP_MAFIA2].meshIndex + 10];
Meshes[obj->meshIndex + 13] = Meshes[Objects[ID_MESHSWAP_MAFIA2].meshIndex + 13];*/
}
obj = &Objects[ID_PIERRE];
@ -1676,7 +1643,6 @@ void BaddyObjects()
Bones[obj->boneIndex] |= ROT_X;
Bones[obj->boneIndex + 4] |= ROT_Y;
Bones[obj->boneIndex + 4] |= ROT_X;
Meshes[obj->meshIndex + 10] = Meshes[Objects[ID_MESHSWAP1].meshIndex + 2];
}
obj = &Objects[ID_HYDRA];
@ -1726,8 +1692,6 @@ void BaddyObjects()
Bones[obj->meshIndex + 4 * 4] |= ROT_X;
Bones[obj->meshIndex + 9 * 4] |= ROT_Z;
Bones[obj->meshIndex + 9 * 4] |= ROT_X;
//Meshes[obj->meshIndex + 10] = Meshes[Objects[ID_MESHSWAP_IMP].meshIndex + 10];
}
obj = &Objects[ID_WILLOWISP];
@ -1881,20 +1845,6 @@ void BaddyObjects()
Bones[obj->boneIndex + 6 * 4] |= ROT_X;
Bones[obj->boneIndex + 13 * 4] |= ROT_Y;
Bones[obj->boneIndex + 13 * 4] |= ROT_X;
for (int i = (obj->nmeshes - 1); i > 0; i--)
{
Meshes[obj->meshIndex + i] = Meshes[Objects[ID_MESHSWAP1].meshIndex + i];
}
/*
do
{
(&Meshes[v36 + 1])[obj->meshIndex] = Meshes[v36 + Objects[ID_MESHSWAP1].meshIndex];
v36 = v45 + 2;
v25 = v42 == 1;
v45 += 2;
--v42;
} while (!v25);*/
}
obj = &Objects[ID_ROMAN_GOD];
@ -1920,21 +1870,6 @@ void BaddyObjects()
Bones[obj->boneIndex + 24] |= ROT_X;
Bones[obj->boneIndex + 52] |= ROT_Y;
Bones[obj->boneIndex + 52] |= ROT_X;
/*for (int i = (obj->nmeshes - 1); i > 0; i--)
{
Meshes[obj->meshIndex + i] = Meshes[Objects[ID_MESHSWAP_ROMAN_GOD].meshIndex + i];
}
do
{
(&meshes[v38 + 1])[Objects[61].mesh_index] = meshes[v38 + Objects[405].mesh_index];
v38 = v46 + 2;
v25 = v43 == 1;
v46 += 2;
--v43;
} while (!v25);
*/
}
obj = &Objects[ID_GUARDIAN];
@ -2618,18 +2553,6 @@ void ObjectObjects()
obj->savePosition = true;
}
/*
v25 = 0;
do
{
v26 = v25 + Objects[ID_SCUBA_HARPOON].mesh_index;
v27 = v25 + Objects[ID_BURNING_ROOTS].mesh_index;
v25 += 2;
meshes[v27 + 1] = meshes[v26];
}
while ( v25 < 56 );
*/
obj = &Objects[ID_XRAY_CONTROLLER];
if (obj->loaded)
{
@ -2642,7 +2565,6 @@ void ObjectObjects()
// by default loaded, explosion time :D
obj = &Objects[ID_BODY_PART];
obj->loaded = true;
obj->nmeshes = 0;
obj = &Objects[ID_EARTHQUAKE];
if (obj->loaded)
@ -2706,18 +2628,22 @@ void ObjectObjects()
obj->saveFlags = true;
}
obj = &Objects[ID_ENERGY_BUBBLES];
if (obj->loaded)
{
obj->control = BubblesControl;
}
obj = &Objects[ID_BUBBLES];
if (obj->loaded)
{
obj->control = MissileControl;
obj->nmeshes = 0;
}
obj = &Objects[ID_IMP_ROCK];
if (obj->loaded)
{
obj->control = MissileControl;
//obj->nmeshes = 0;
}
obj = &Objects[ID_WATERFALLMIST];