TombEngine/TR5Main/Game/swat.cpp

1049 lines
23 KiB
C++
Raw Normal View History

#include "swat.h"
#include "..\Global\global.h"
#include "..\Game\Box.h"
#include "..\Game\items.h"
#include "..\Game\lot.h"
#include "..\Game\control.h"
#include "..\Game\effects.h"
#include "..\Game\draw.h"
#include "..\Game\sphere.h"
#include "..\Game\effect2.h"
#include "..\Game\people.h"
2019-11-21 07:43:34 +01:00
#include "..\Game\Lara.h"
/*
void InitialiseGuard(short itemNum)
{
ITEM_INFO* item = &Items[itemNum];
ClearItem(itemNum);
short animIndex = Objects[ID_SWAT].animIndex;
if (!Objects[ID_SWAT].loaded)
animIndex = Objects[ID_BLUE_GUARD].animIndex;
switch (item->triggerFlags)
{
case 0:
case 10:
item->animNumber = animIndex;
item->goalAnimState = 1;
break;
case 1:
item->goalAnimState = 11;
item->animNumber = v4 + 23;
break;
case 2:
item->goalAnimState = 13;
item->animNumber = v5 + 25;
item->_bf15ea ^= (item->_bf15ea ^ ((item->_bf15ea & 0xFE) + 2)) & 6;
break;
case 3:
v6 = item->roomNumber;
v7 = itemNum + 28;
item->goalAnimState = 15;
item->animNumber = v7;
*item->pad2 = 9216;
v8 = Rooms[v6].item_number;
if (v8 != -1)
{
while (1)
{
v9 = v8;
v10 = Items[v9].object_number;
v11 = &Items[v9];
if (v10 >= 416 && v10 <= 444 && v11->roomNumber == v6 && v11->triggerFlags == 3)
break;
v8 = v11->next_item;
if (v8 == -1)
goto LABEL_21;
}
v11->meshBits = -5;
}
break;
case 4:
v12 = itemNum;
item->goalAnimState = 17;
*item->pad2 = 0x2000;
item->animNumber = v12 + 30;
break;
case 5:
LOWORD(v3) = item->roomNumber;
item->animNumber = itemNum + 26;
v13 = item->pos.zPos;
itemNum = v3;
v14 = item->pos.yPos;
v15 = item->pos.xPos;
item->goalAnimState = 14;
v16 = GetFloor(v15, v14, v13, &itemNum);
GetFloorHeight(v16, item->pos.xPos, item->pos.yPos, item->pos.zPos);
item->pos.yPos = GetCeiling(v16, item->pos.xPos, item->pos.yPos, item->pos.zPos) - 2048;
break;
case 6:
v17 = itemNum;
item->goalAnimState = 19;
item->animNumber = v17 + 32;
break;
case 7:
case 9:
v18 = item->pos.xPos;
v19 = itemNum + 59;
item->goalAnimState = 38;
item->animNumber = v19;
LOWORD(v19) = item->pos.yRot;
v20 = (v19 >> 3) & 0x1FFE;
item->pos.xPos = v18 - (rcossin_tbl[v20] << 9 >> 14);
item->pos.zPos -= rcossin_tbl[v20 + 1] << 9 >> 14;
break;
case 8:
v21 = itemNum;
item->goalAnimState = 31;
item->animNumber = v21 + 46;
break;
case 11:
v22 = itemNum;
item->goalAnimState = 7;
item->animNumber = v22 + 12;
break;
default:
break;
}
LABEL_21:
result = anims;
v24 = item->goalAnimState;
item->frameNumber = Anims[item->animNumber].frameBase;
item->currentAnimState = v24;
return result;
}
void ControlGuard(int itemNum)
{
int v1; // eax
int v2; // ecx
ITEM_INFO* item; // esi
int v4; // eax
int v5; // edi
int v6; // ebp
int v7; // eax
int v8; // ebx
int v9; // ecx
int v10; // edi
int v11; // ebp
struct FLOOR_INFO* v12; // eax
int v13; // eax
int v14; // ebp
int v15; // edi
struct FLOOR_INFO* v16; // eax
int v17; // eax
int v18; // edx
int v19; // edi
int v20; // ebp
struct FLOOR_INFO* v21; // eax
int v22; // eax
unsigned short v23; // cx
unsigned short v24; // dx
int v25; // edi
int v26; // eax
CREATURE_INFO* v27; // ebp
ITEM_INFO* v28; // ecx
short v29; // ax
int v30; // edi
int v31; // ebx
short v32; // bx
short v33; // cx
short v34; // bx
short v35; // bx
int v36; // edi
int v37; // eax
int v38; // eax
enum mood_type v39; // edi
ITEM_INFO* v40; // ecx
int v41; // eax
int* v42; // edi
int v43; // eax
int v44; // ecx
_BOOL2 v45; // bx
short v46; // cx
int v47; // eax
int v48; // eax
int v49; // eax
short v50; // di
short v51; // ax
int v52; // eax
int v53; // eax
int v54; // eax
int v55; // eax
short v56; // dx
bool v57; // zf
short v58; // dx
int v59; // ecx
int v60; // ecx
int v61; // eax
short v62; // dx
short v63; // dx
short v64; // dx
short v65; // dx
int v66; // eax
int v67; // ecx
int v68; // ecx
int v69; // eax
struct FLOOR_INFO* v70; // eax
char v71; // al
int v72; // eax
int v73; // eax
short v74; // cx
short v75; // ax
short v76; // di
short v77; // ax
int v78; // eax
short v79; // cx
ITEM_INFO* v80; // eax
short v81; // cx
ITEM_INFO* v82; // eax
short i; // cx
short v84; // di
CREATURE_INFO_FINAL* v85; // ecx
short v86; // cx
int v87; // eax
int v88; // edx
struct FLOOR_INFO* v89; // eax
short v90; // ax
int v91; // eax
int v92; // eax
int v93; // eax
short v94; // ax
struct FLOOR_INFO* v95; // eax
int v96; // edx
int v97; // eax
short v98; // cx
int v99; // eax
int v100; // ecx
struct FLOOR_INFO* v101; // eax
short v102; // ax
short v103; // dx
short v104; // dx
short v105; // ax
short v106; // ax
short v107; // cx
short v108; // cx
short v109; // dx
short v110; // dx
short v111; // ax
short v112; // ax
short v113; // cx
short v114; // cx
int a4; // [esp+Ch] [ebp-8Ch]
int animIndex; // [esp+10h] [ebp-88h]
int v117; // [esp+14h] [ebp-84h]
int v118; // [esp+18h] [ebp-80h]
int v119; // [esp+1Ch] [ebp-7Ch]
int v120; // [esp+20h] [ebp-78h]
int v121; // [esp+24h] [ebp-74h]
int a2; // [esp+28h] [ebp-70h]
int v123; // [esp+2Ch] [ebp-6Ch]
int v124; // [esp+30h] [ebp-68h]
int v125; // [esp+38h] [ebp-60h]
int v126; // [esp+40h] [ebp-58h]
CREATURE_INFO_FINAL* creature; // [esp+44h] [ebp-54h]
int v128; // [esp+48h] [ebp-50h]
int v129; // [esp+4Ch] [ebp-4Ch]
int v130; // [esp+50h] [ebp-48h]
char v131; // [esp+54h] [ebp-44h]
int v132; // [esp+58h] [ebp-40h]
int v133; // [esp+64h] [ebp-34h]
int v134; // [esp+6Ch] [ebp-2Ch]
int v135; // [esp+70h] [ebp-28h]
int v136; // [esp+74h] [ebp-24h]
int v137; // [esp+78h] [ebp-20h]
int v138; // [esp+7Ch] [ebp-1Ch]
int v139; // [esp+80h] [ebp-18h]
short v140; // [esp+84h] [ebp-14h]
int v141; // [esp+88h] [ebp-10h]
int v142; // [esp+8Ch] [ebp-Ch]
int v143; // [esp+90h] [ebp-8h]
CreatureActive(itemNum);
if (!v1)
return;
if (*(&Objects[33] + 50) & 1)
LOWORD(animIndex) = Objects[33].animIndex;
else
LOWORD(animIndex) = Objects[37].animIndex;
HIWORD(v2) = HIWORD(items);
item = &Items[itemNum];
creature = Items[itemNum].data;
LOWORD(v2) = item->roomNumber;
v128 = 0;
v118 = 0;
v126 = 0;
v121 = 0;
v4 = item->object_number;
LOWORD(v120) = item->object_number;
a4 = v2;
LOWORD(v4) = item->pos.yRot;
v5 = item->pos.xPos;
v6 = item->pos.zPos;
v7 = (v4 >> 3) & 0x1FFE;
v8 = item->pos.yPos;
v9 = rcossin_tbl[v7 + 1];
v119 = 3480 * rcossin_tbl[v7] >> 14;
v10 = v119 + v5;
v11 = (3480 * v9 >> 14) + v6;
v117 = 3480 * v9 >> 14;
v12 = GetFloor(v10, v8, v11, &a4);
v13 = GetFloorHeight(v12, v10, v8, v11);
v14 = v117 + v11;
v130 = v13;
LOWORD(v13) = item->roomNumber;
v15 = v119 + v10;
a4 = v13;
v16 = GetFloor(v15, v8, v14, &a4);
v17 = GetFloorHeight(v16, v15, v8, v14);
LOWORD(v18) = item->roomNumber;
v129 = v17;
a4 = v18;
v19 = v119 + v15;
v20 = v117 + v14;
v21 = GetFloor(v19, v8, v20, &a4);
v22 = GetFloorHeight(v21, v19, v8, v20);
v23 = item->box_number;
2019-12-01 08:13:19 +01:00
v24 = LaraItem->box_number;
if (v23 == v24 || v8 >= v130 - 384 || (v25 = v129, v8 >= v129 + 256) || v8 <= v129 - 256)
{
v25 = v129;
v119 = 0;
}
else
{
v119 = 1;
}
if (v23 == v24 || v8 >= v130 - 384 || v8 >= v25 - 384 || v8 >= v22 + 256 || (v117 = 1, v8 <= v22 - 256))
v117 = 0;
if (item->firedWeapon)
{
v134 = SwatGunX;
v135 = SwatGunY;
v136 = SwatGunZ;
GetJointAbsPosition(item, &v134, SwatGunMesh);
2019-12-01 08:13:19 +01:00
TriggerDynamicLight(v134, v135, v136, 2 * item->firedWeapon + 10, 192, 128, 32);
item->firedWeapon--;
}
v26 = item->_bf15ea;
v27 = creature;
if (v26 & 0x3E00)
GetAITarget(creature);
else
2019-12-01 08:13:19 +01:00
creature->enemy = LaraItem;
CreatureAIInfo(item, &a2);
2019-12-01 08:13:19 +01:00
v28 = LaraItem;
if (*(&v27->mood + 2) == LaraItem)
{
v29 = v125;
LOWORD(v133) = v125;
v132 = v123;
}
else
{
2019-12-01 08:13:19 +01:00
v30 = LaraItem->pos.zPos - item->pos.zPos;
v31 = LaraItem->pos.xPos - item->pos.xPos;
v29 = phd_atan(v30, v31) - item->pos.yRot;
v132 = v30 * v30 + v31 * v31;
2019-12-01 08:13:19 +01:00
v28 = LaraItem;
LOWORD(v133) = v29;
}
v32 = animIndex;
if (item->hitPoints <= 0)
{
v33 = item->currentAnimState;
if (v33 != 8 && v33 != 6)
{
if (v29 >= 12288 || v29 <= -12288)
{
v35 = animIndex + 16;
item->currentAnimState = 8;
item->animNumber = v35;
item->pos.yRot += v133 + -32768;
}
else
{
v34 = animIndex + 11;
item->currentAnimState = 6;
item->animNumber = v34;
item->pos.yRot += v133;
}
item->frameNumber = Anims[item->animNumber].frameBase;
}
goto LABEL_255;
}
v36 = *(&v27->mood + 2) != v28;
GetCreatureMood(item, &a2, v36);
if (v120 == 69)
{
if (item->hitPoints >= Objects[69].hitPoints)
{
2019-12-01 08:13:19 +01:00
if (*(&v27->mood + 2) == LaraItem)
* (&v27->_bfc + 1) = 0;
}
else
{
*(&v27->_bfc + 1) = 2;
}
}
if (SLOBYTE(Rooms[item->roomNumber].flags) < 0)
{
if (item->object_number == 35)
{
if (++item->itemFlags[0] > 60 && !(GetRandomControl() & 0xF))
{
SoundEffect(88, &item->pos, 0);
item->itemFlags[0] = 0;
}
}
else
{
if (!(GlobalCounter & 7))
--item->hitPoints;
*(&v27->_bfc + 1) = 2;
if (item->hitPoints <= 0)
{
item->currentAnimState = 8;
item->animNumber = v32 + 16;
item->frameNumber = Anims[(v32 + 16)].frameBase;
}
}
}
CreatureMood(item, &a2, v36);
LOWORD(v37) = v27->maximumTurn;
LOWORD(v38) = CreatureTurn(item, v37);
v39 = *(&v27->mood + 2);
v128 = v38;
2019-12-01 08:13:19 +01:00
*(&v27->mood + 2) = LaraItem;
v40 = LaraItem;
if (v132 < 0x400000 && LaraItem->speed > 20 || item->_bf15ea & 0x10)
goto LABEL_52;
if (TargetVisible(item, &v131))
{
2019-12-01 08:13:19 +01:00
v40 = LaraItem;
LABEL_52:
v41 = item->_bf15ea;
if (!(v41 & 0x2000) && item->object_number != 69 && abs(item->pos.yPos - v40->pos.yPos) < 1280)
{
*(&v27->mood + 2) = v40;
AlertAllGuards(itemNum);
}
}
*(&v27->mood + 2) = v39;
v42 = &item->pos.xPos;
v137 = item->pos.xPos;
v138 = item->pos.yPos - 384;
v139 = item->pos.zPos;
v140 = item->roomNumber;
2019-12-01 08:13:19 +01:00
v141 = LaraItem->pos.xPos;
v43 = GetBestFrame(LaraItem);
v142 = LaraItem->pos.yPos + ((*(v43 + 6) + 3 * *(v43 + 4)) >> 2);
v143 = LaraItem->pos.zPos;
v45 = !LOS(&v137, &v141) && item->triggerFlags != 10;
v27->maximumTurn = 0;
v46 = item->currentAnimState;
v47 = v46 - 1;
switch (v46)
{
case 1:
v48 = v133;
HIWORD(v27[24].LOT.target.x) &= 0xFFF7u;
v118 = v48;
v27->flags = 0;
if (v124)
{
v49 = item->_bf15ea;
if (!(v49 & 0x200))
{
LOWORD(v49) = v125 >> 1;
v121 = v49;
v126 = *(&v125 + 2);
}
}
v50 = v120;
2019-11-21 07:43:34 +01:00
if (v120 == 69 && item == Lara.target)
{
item->goalAnimState = 39;
goto LABEL_105;
}
v51 = item->requiredAnimState;
if (v51)
{
item->goalAnimState = v51;
goto LABEL_105;
}
v52 = item->_bf15ea;
if (v52 & 0x200)
{
if (v52 & 0x1000)
{
v118 = 0;
}
else
{
LOWORD(v53) = AIGuard(v27);
v118 = v53;
}
v54 = item->_bf15ea;
if (v54 & 0x800)
{
if (--item->triggerFlags < 1)
{
BYTE1(v54) &= 0xFDu;
item->_bf15ea = v54;
}
}
goto LABEL_105;
}
2019-12-01 08:13:19 +01:00
if (*(&v27->mood + 2) == LaraItem && (v133 > 20480 || v133 < -20480) && v120 != 69)
{
item->goalAnimState = 2;
goto LABEL_105;
}
if (v52 & 0x800)
{
item->goalAnimState = 5;
goto LABEL_105;
}
if (v52 & 0x400)
{
item->goalAnimState = 7;
goto LABEL_105;
}
if (Targetable(item, &a2) && v50 != 69)
{
if (v123 >= 0x1000000 && a2 == HIWORD(a2))
{
if ((item->_bf15ea & 0x3E00) == 4096)
goto LABEL_105;
goto LABEL_90;
}
item->goalAnimState = 4;
}
else if (v119 || v117)
{
v56 = animIndex;
v27->maximumTurn = 0;
v57 = v117 == 0;
item->animNumber = v56 + 41;
v58 = Anims[(v56 + 41)].frameBase;
item->currentAnimState = 26;
item->frameNumber = v58;
if (v57)
item->goalAnimState = 27;
else
item->goalAnimState = 28;
BYTE2(v27[24].LOT.target.x) |= 8u;
}
else if (v45)
{
item->goalAnimState = 31;
}
else if (*(&v27->_bfc + 1))
{
if (v123 < &unk_900000 || (v55 = item->_bf15ea, BYTE1(v55) & 0x20))
{
LABEL_90:
item->goalAnimState = 5;
goto LABEL_105;
}
item->goalAnimState = 7;
}
else
{
item->goalAnimState = 1;
}
LABEL_105:
if (item->triggerFlags == 11)
item->triggerFlags = 0;
LABEL_255:
CreatureJoint(item, 0, v121);
CreatureJoint(item, 1, v126);
CreatureJoint(item, 2, v118);
if (!(v27->_bfc & 8))
goto LABEL_269;
v97 = *(&v27->mood + 2);
if (!v97)
goto LABEL_269;
v98 = *(v97 + 40);
if (v98 != 4)
{
if (v98 & 0x10)
{
v99 = item->_bf15ea;
item->goalAnimState = 1;
item->requiredAnimState = 38;
item->triggerFlags = 300;
BYTE1(v99) &= 0xCBu;
}
else
{
if (v98 & 0x20)
{
v100 = item->_bf15ea;
item->goalAnimState = 1;
item->requiredAnimState = 36;
BYTE1(v100) = BYTE1(v100) & 0xC9 | 8;
item->_bf15ea = v100;
goto LABEL_268;
}
LOWORD(v96) = *(v97 + 24);
a4 = v96;
v101 = GetFloor(*(*(&v27->mood + 2) + 64), *(*(&v27->mood + 2) + 68), *(*(&v27->mood + 2) + 72), &a4);
GetFloorHeight(v101, *(*(&v27->mood + 2) + 64), *(*(&v27->mood + 2) + 68), *(*(&v27->mood + 2) + 72));
TestTriggers(TriggerIndex, 1, 0);
item->requiredAnimState = 5;
if (*(*(&v27->mood + 2) + 40) & 2)
item->itemFlags[3] = item->pad2[6] - 1;
if (!(*(*(&v27->mood + 2) + 40) & 8))
goto LABEL_268;
v99 = item->_bf15ea;
item->requiredAnimState = 1;
item->triggerFlags = 300;
}
BYTE1(v99) |= 0xAu;
item->_bf15ea = v99;
goto LABEL_268;
}
item->goalAnimState = 1;
item->requiredAnimState = 37;
LABEL_268:
++item->itemFlags[3];
v27->_bfc &= 0xFFF7u;
*(&v27->mood + 2) = 0;
LABEL_269:
v102 = item->currentAnimState;
if ((v102 >= 20 || v102 == 6 || v102 == 8) && v102 != 30)
{
CreatureAnimation(itemNum, v128, 0);
}
else
{
switch (CreatureVault(itemNum, v128, 2, 256) + 4)
{
case 0:
v113 = animIndex;
v27->maximumTurn = 0;
item->animNumber = v113 + 38;
v114 = Anims[(v113 + 38)].frameBase;
item->currentAnimState = 23;
item->frameNumber = v114;
break;
case 1:
v111 = animIndex;
v27->maximumTurn = 0;
v111 += 39;
item->animNumber = v111;
v112 = Anims[v111].frameBase;
item->currentAnimState = 24;
item->frameNumber = v112;
break;
case 2:
v109 = animIndex;
v27->maximumTurn = 0;
item->animNumber = v109 + 40;
v110 = Anims[(v109 + 40)].frameBase;
item->currentAnimState = 25;
item->frameNumber = v110;
break;
case 6:
v103 = animIndex;
v27->maximumTurn = 0;
item->animNumber = v103 + 35;
v104 = Anims[(v103 + 35)].frameBase;
item->currentAnimState = 20;
item->frameNumber = v104;
break;
case 7:
v105 = animIndex;
v27->maximumTurn = 0;
v105 += 36;
item->animNumber = v105;
v106 = Anims[v105].frameBase;
item->currentAnimState = 21;
item->frameNumber = v106;
break;
case 8:
v107 = animIndex;
v27->maximumTurn = 0;
item->animNumber = v107 + 37;
v108 = Anims[(v107 + 37)].frameBase;
item->currentAnimState = 22;
item->frameNumber = v108;
break;
default:
return;
}
}
return;
case 2:
v27->flags = 0;
if ((v125 & 0x8000u) == 0)
item->pos.yRot -= 364;
else
item->pos.yRot += 364;
if (item->frameNumber == Anims[item->animNumber].frameEnd)
item->pos.yRot += -32768;
goto LABEL_255;
case 3:
case 35:
LOWORD(v47) = v133 >> 1;
v121 = v47;
v118 = v47;
if (v124)
v126 = *(&v125 + 2);
if (abs(v125) >= 364)
{
if ((v125 & 0x8000u) == 0)
item->pos.yRot += 364;
else
item->pos.yRot -= 364;
}
else
{
item->pos.yRot += v125;
}
if (v46 != 35)
goto LABEL_168;
if (!v27->flags)
goto LABEL_283;
v66 = Anims[item->animNumber].frameBase;
v67 = item->frameNumber;
if (v67 < v66 + 10 && (v67 - v66) & 1)
v27->flags = 0;
LABEL_168:
if (!v27->flags)
{
LABEL_283:
v27->flags = 1;
v57 = item->currentAnimState == 3;
item->fired_weapon = 2;
if (v57)
ShotLara(item, &a2, &SwatGunX, v121, 30 * ((gfCurrentLevel > 0xAu) + 1));
else
ShotLara(item, &a2, &SwatGunX, v121, 10);
}
goto LABEL_255;
case 4:
LOWORD(v47) = v133;
v27->flags = 0;
LOWORD(v47) = v47 >> 1;
v121 = v47;
v118 = v47;
if (v124)
v126 = *(&v125 + 2);
if (abs(v125) >= 364)
{
if ((v125 & 0x8000u) == 0)
item->pos.yRot += 364;
else
item->pos.yRot -= 364;
}
else
{
item->pos.yRot += v125;
}
if (!Targetable(item, &a2))
goto LABEL_242;
if (v120 == 37 || v120 == 55)
item->goalAnimState = 3;
else
item->goalAnimState = 35;
goto LABEL_255;
case 5:
HIWORD(v27[24].LOT.target.x) &= 0xFFF7u;
v27->maximumTurn = 910;
if (!Targetable(item, &a2)
|| v123 >= 0x1000000 && a2 == HIWORD(a2)
|| v120 == 69
|| (v59 = item->_bf15ea, BYTE1(v59) & 0xC))
{
if (v119 || v117)
{
v62 = animIndex;
v27->maximumTurn = 0;
v57 = v117 == 0;
item->animNumber = v62 + 41;
v63 = Anims[(v62 + 41)].frameBase;
item->currentAnimState = 26;
item->frameNumber = v63;
if (v57)
item->goalAnimState = 27;
else
item->goalAnimState = 28;
BYTE2(v27[24].LOT.target.x) |= 8u;
}
else if (v123 >= 0x100000)
{
if (!v45 || (v60 = item->_bf15ea, BYTE1(v60) & 0x3E))
{
if (v123 > & unk_900000)
{
v61 = item->_bf15ea;
if (!(v61 & 0x800))
item->goalAnimState = 7;
}
}
else
{
item->goalAnimState = 1;
}
}
else
{
item->goalAnimState = 1;
}
}
else
{
item->goalAnimState = 4;
}
goto LABEL_255;
case 7:
HIWORD(v27[24].LOT.target.x) &= 0xFFF7u;
v27->maximumTurn = 1820;
if (Targetable(item, &a2) && (v123 < 0x1000000 || a2 != HIWORD(a2)) && v120 != 69)
{
item->goalAnimState = 4;
}
else if (v119 || v117)
{
v64 = animIndex;
v27->maximumTurn = 0;
v57 = v117 == 0;
item->animNumber = v64 + 50;
v65 = Anims[(v64 + 50)].frameBase;
item->currentAnimState = 26;
item->frameNumber = v65;
if (v57)
item->goalAnimState = 27;
else
item->goalAnimState = 28;
BYTE2(v27[24].LOT.target.x) |= 8u;
}
else if (v45)
{
item->goalAnimState = 1;
}
else if (v123 < &unk_900000)
{
item->goalAnimState = 5;
}
if (item->triggerFlags == 11)
{
BYTE2(v27[24].LOT.target.x) |= 8u;
v27->maximumTurn = 0;
}
goto LABEL_255;
case 14:
v68 = item->pos.yPos;
v118 = v133;
v69 = item->floor;
if (v68 <= item->floor - 2048 || item->triggerFlags != 5)
{
if (v68 >= v69 - 512)
item->goalAnimState = 4;
}
else
{
LOWORD(v69) = item->roomNumber;
item->triggerFlags = 0;
a4 = v69;
v70 = GetFloor(*v42, item->pos.yPos, item->pos.zPos, &a4);
GetFloorHeight(v70, *v42, item->pos.yPos, item->pos.zPos);
TestTriggers(TriggerIndex, 1, 0);
SoundEffect(340, &item->pos, 0);
}
if (abs(v125) >= 364)
{
if ((v125 & 0x8000u) == 0)
item->pos.yRot += 364;
else
item->pos.yRot -= 364;
}
else
{
item->pos.yRot += v125;
}
goto LABEL_255;
case 15:
LOWORD(v72) = AIGuard(v27);
v118 = v72;
if (v27->_bfc & 1)
item->goalAnimState = 16;
goto LABEL_255;
case 16:
case 18:
v74 = Anims[item->animNumber].frameBase;
v75 = item->frameNumber;
if (v75 == v74)
goto LABEL_254;
if (v75 == v74 + 44)
{
v76 = item->roomNumber;
*item->pad2 = 0;
v77 = Rooms[v76].item_number;
if (v77 == -1)
goto LABEL_255;
while (1)
{
v78 = v77;
v79 = Items[v78].object_number;
v80 = &Items[v78];
if (v79 >= 416 && v79 <= 444 && v80->roomNumber == v76)
{
v81 = v80->triggerFlags;
if (v81 > 2 && v81 < 5)
break;
}
v77 = v80->next_item;
if (v77 == -1)
goto LABEL_255;
}
v80->meshBits = -3;
}
else if (v75 == Anims[item->animNumber].frameEnd)
{
item->pos.yRot -= 0x4000;
}
goto LABEL_255;
case 17:
v71 = item->_bf15ea;
v118 = 0;
2019-12-01 08:13:19 +01:00
if (!(v71 & 0x10) && LaraItem->speed < 40 && !(*(&lara + 69) & 0x10))
v27->_bfc &= 0xFFFEu;
if (v27->_bfc & 1)
item->goalAnimState = 18;
goto LABEL_255;
case 19:
LOWORD(v73) = AIGuard(v27);
v118 = v73;
if (v27->_bfc & 1)
item->goalAnimState = 1;
goto LABEL_255;
case 30:
goto LABEL_176;
case 31:
if (item->triggerFlags != 8 || !v45 || item->_bf15ea & 0x10)
item->goalAnimState = 30;
LABEL_176:
HIWORD(v27[24].LOT.target.x) &= 0xFFF7u;
v57 = v119 == 0;
v27->maximumTurn = 910;
if (!v57 || v117 || v123 < 0x100000 || !v45 || item->_bf15ea & 0x10)
item->goalAnimState = 1;
goto LABEL_255;
case 36:
goto LABEL_253;
case 37:
v82 = 0;
for (i = Rooms[item->roomNumber].item_number; i != -1; i = v82->next_item)
{
v82 = &Items[i];
if (Items[i].object_number == 249)
break;
}
v84 = item->frameNumber;
v85 = &Anims[item->animNumber];
creature = v85;
LOWORD(v85) = HIWORD(v85->aiTarget.floor);
if (v84 == v85)
{
v86 = v82->pos.yRot;
v82->meshBits = 0x1FFF;
item->pos.yRot = v86;
item->pos.xPos = v82->pos.xPos - 256;
v87 = v82->pos.zPos;
*item->pad2 = 1024;
item->pos.zPos = v87 + 128;
}
else
{
v85 = v85;
v88 = v84;
if (v84 == v85 + 32)
{
v82->meshBits = 16381;
}
else if (v84 == v85->aiTarget.itemFlags)
{
v82->meshBits = 278461;
}
else if (v84 == &v85->aiTarget.pad_ex_light[16])
{
v82->meshBits = 802621;
}
else if (v84 == (&v85->aiTarget.draw_room + 1))
{
v82->meshBits = 819001;
}
else if (v84 == &v85->aiTarget.pad1[30])
{
v82->meshBits = 17592121;
}
else if (v84 == LOWORD(creature->aiTarget.touch_bits))
{
v82->meshBits = 0x1FFF;
LOWORD(v88) = item->roomNumber;
a4 = v88;
v89 = GetFloor(item->pos.xPos, item->pos.yPos, item->pos.zPos, &a4);
GetFloorHeight(v89, item->pos.xPos, item->pos.yPos, item->pos.zPos);
TestTriggers(TriggerIndex, 1, 0);
item->requiredAnimState = 5;
*item->pad2 = 0;
}
}
goto LABEL_255;
case 38:
2019-11-21 07:43:34 +01:00
if ((v120 != 69 || item != Lara.target)
&& (GetRandomControl() & 0x7F || (v90 = item->triggerFlags, v90 >= 10) || v90 == 9))
{
v91 = item->_bf15ea;
if (v91 & 0x200)
{
LOWORD(v92) = AIGuard(v27);
v118 = v92;
v93 = item->_bf15ea;
if (v93 & 0x800)
{
if (--item->triggerFlags < 1)
{
BYTE1(v93) = BYTE1(v93) & 0xC9 | 8;
item->_bf15ea = v93;
}
}
}
}
else
{
LABEL_242:
item->goalAnimState = 1;
}
goto LABEL_255;
case 39:
2019-11-21 07:43:34 +01:00
if (item != Lara.target && !(GetRandomControl() & 0x3F))
{
v94 = item->triggerFlags;
if (v94 == 7 || v94 == 9)
item->requiredAnimState = 38;
item->goalAnimState = 1;
}
LABEL_253:
HIWORD(v44) = HIWORD(anims);
if (item->frameNumber == Anims[item->animNumber].frameBase + 39)
{
LABEL_254:
LOWORD(v44) = item->roomNumber;
a4 = v44;
v95 = GetFloor(*v42, item->pos.yPos, item->pos.zPos, &a4);
GetFloorHeight(v95, *v42, item->pos.yPos, item->pos.zPos);
TestTriggers(TriggerIndex, 1, 0);
}
goto LABEL_255;
default:
goto LABEL_255;
}
}**/