Decompiled ControlGuard()

This commit is contained in:
Montagna Marco 2019-12-24 13:52:22 +01:00
parent b4e36a0e28
commit bf5aa5703b
2 changed files with 548 additions and 565 deletions

View file

@ -126,7 +126,6 @@ void InitialiseGuardLaser(short itemNum)
item->currentAnimState = 1; item->currentAnimState = 1;
} }
/*
void ControlGuard(short itemNum) void ControlGuard(short itemNum)
{ {
if (!CreatureActive(itemNum)) if (!CreatureActive(itemNum))
@ -138,13 +137,9 @@ void ControlGuard(short itemNum)
else else
animIndex = Objects[ID_BLUE_GUARD].animIndex; animIndex = Objects[ID_BLUE_GUARD].animIndex;
HIWORD(v2) = HIWORD(items);
ITEM_INFO* item = &Items[itemNum]; ITEM_INFO* item = &Items[itemNum];
CREATURE_INFO* creature = (CREATURE_INFO*)item->data; CREATURE_INFO* creature = (CREATURE_INFO*)item->data;
LOWORD(v2) = item->roomNumber;
short angle = 0; short angle = 0;
short joint2 = 0; short joint2 = 0;
short joint1 = 0; short joint1 = 0;
@ -252,10 +247,6 @@ void ControlGuard(short itemNum)
} }
else else
{ {
}
GetCreatureMood(item, &info, creature->enemy != LaraItem); GetCreatureMood(item, &info, creature->enemy != LaraItem);
if (item->objectNumber == ID_SCIENTIST) if (item->objectNumber == ID_SCIENTIST)
@ -553,303 +544,306 @@ void ControlGuard(short itemNum)
{ {
item->goalAnimState = 4; item->goalAnimState = 4;
} }
else if (v119 || v117) else if (canJump1block || canJump2blocks)
{ {
v64 = animIndex;
creature->maximumTurn = 0; creature->maximumTurn = 0;
v57 = v117 == 0; item->animNumber = animIndex + 50;
item->animNumber = v64 + 50;
v65 = Anims[(v64 + 50)].frameBase;
item->currentAnimState = 26; item->currentAnimState = 26;
item->frameNumber = v65; item->frameNumber = Anims[item->animNumber].frameBase;
if (v57) if (canJump1block)
item->goalAnimState = 27; item->goalAnimState = 27;
else else
item->goalAnimState = 28; item->goalAnimState = 28;
LOBYTE(creature->LOT.flags) |= 8u; creature->LOT.isJumping = true;
} }
else if (v45) else if (los)
{ {
item->goalAnimState = 1; item->goalAnimState = 1;
} }
else if (info.distance < &unk_900000) else if (info.distance < 0x900000)
{ {
item->goalAnimState = 5; item->goalAnimState = 5;
} }
if (item->triggerFlags == 11) if (item->triggerFlags == 11)
{ {
LOBYTE(creature->LOT.flags) |= 8u; creature->LOT.isJumping = true;
creature->maximumTurn = 0; creature->maximumTurn = 0;
} }
goto LABEL_255; break;
case 14: case 14:
v68 = item->pos.yPos;
joint2 = laraInfo.angle; joint2 = laraInfo.angle;
v69 = item->floor;
if (v68 <= item->floor - 2048 || item->triggerFlags != 5) if (item->pos.yPos <= item->floor - 2048 || item->triggerFlags != 5)
{ {
if (v68 >= v69 - 512) if (item->pos.yPos >= item->floor - 512)
item->goalAnimState = 4; item->goalAnimState = 4;
} }
else else
{ {
LOWORD(v69) = item->roomNumber; roomNumber = item->roomNumber;
item->triggerFlags = 0; item->triggerFlags = 0;
*a4 = v69; floor = GetFloor(item->pos.xPos, item->pos.yPos, item->pos.zPos, &roomNumber);
v70 = GetFloor(*v42, item->pos.yPos, item->pos.zPos, a4); GetFloorHeight(floor, item->pos.xPos, item->pos.yPos, item->pos.zPos);
GetHeight(v70, *v42, item->pos.yPos, item->pos.zPos); TestTriggers(TriggerIndex, 1, 0);
TestTriggers(trigger_index, 1, 0); SoundEffect(SFX_LARA_ROPEDOWN_LOOP, &item->pos, 0);
SoundEffect(340, &item->pos, 0);
} }
if (abs(info.angle) >= 364) if (abs(info.angle) >= 364)
{ {
if ((info.angle & 0x8000u) == 0) if ((info.angle & 0x8000) == 0)
item->pos.yRot += 364; item->pos.yRot += ANGLE(2);
else else
item->pos.yRot -= 364; item->pos.yRot -= ANGLE(2);
} }
else else
{ {
item->pos.yRot += info.angle; item->pos.yRot += info.angle;
} }
goto LABEL_255; break;
case 15: case 15:
LOWORD(v72) = AIGuard(creature); joint2 = AIGuard(creature);
joint2 = v72; if (creature->alerted)
if (creature->bitfield & 1)
item->goalAnimState = 16; item->goalAnimState = 16;
goto LABEL_255; break;
case 16: case 16:
case 18: case 18:
v74 = Anims[item->animNumber].frameBase; if (item->frameNumber == Anims[item->animNumber].frameBase)
v75 = item->frameNumber;
if (v75 == v74)
goto LABEL_254;
if (v75 == v74 + 44)
{ {
v76 = item->roomNumber; roomNumber = item->roomNumber;
*item->pad2 = 0; floor = GetFloor(item->pos.xPos, item->pos.yPos, item->pos.zPos, &roomNumber);
v77 = room[v76].item_number; GetFloorHeight(floor, item->pos.xPos, item->pos.yPos, item->pos.zPos);
if (v77 == -1) TestTriggers(TriggerIndex, 1, 0);
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; break;
} }
v77 = v80->next_item;
if (v77 == -1) if (item->frameNumber == Anims[item->animNumber].frameBase + 44)
goto LABEL_255;
}
v80->mesh_bits = -3;
}
else if (v75 == Anims[item->animNumber].frame_end)
{ {
item->pos.yRot -= 0x4000; *item->pad2 = 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)
{
if (currentItem->triggerFlags > 2 && currentItem->triggerFlags < 5)
break;
} }
goto LABEL_255; currentItemNumber = currentItem->nextItem;
if (currentItemNumber == -1)
break;
}
if (currentItemNumber == NO_ITEM)
break;
currentItem->meshBits = -3;
}
else if (item->frameNumber == Anims[item->animNumber].frameEnd)
{
item->pos.yRot -= ANGLE(90);
}
break;
case 17: case 17:
v71 = item->_bf15ea;
joint2 = 0; joint2 = 0;
if (!(v71 & 0x10) && LaraItem->speed < 40 && !(*(&lara + 69) & 0x10)) if (!item->hitStatus && LaraItem->speed < 40 && !Lara.hasFired)
creature->bitfield &= 0xFFFEu; creature->alerted = false;
if (creature->bitfield & 1) if (creature->alerted)
item->goalAnimState = 18; item->goalAnimState = 18;
goto LABEL_255;
case 19:
LOWORD(v73) = AIGuard(creature);
joint2 = v73;
if (creature->bitfield & 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:
creature->LOT.flags &= 0xFFF7u;
v57 = v119 == 0;
creature->maximumTurn = 910;
if (!v57 || v117 || info.distance < 0x100000 || !v45 || item->_bf15ea & 0x10)
item->goalAnimState = 1;
goto LABEL_255;
case 36:
goto LABEL_253;
case 37:
v82 = 0;
for (i = room[item->roomNumber].item_number; i != -1; i = v82->next_item)
{
v82 = &items[i];
if (items[i].object_number == 249)
break; break;
}
v84 = item->frameNumber; case 19:
v85 = &Anims[item->animNumber]; joint2 = AIGuard(creature);
creature2 = v85; if (creature->alerted)
LOWORD(v85) = HIWORD(v85->aiTarget.floor);
if (v84 == v85)
{
v86 = v82->pos.yRot;
v82->mesh_bits = 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->mesh_bits = 16381;
}
else if (v84 == v85->aiTarget.item_flags)
{
v82->mesh_bits = 278461;
}
else if (v84 == &v85->aiTarget.pad_ex_light[16])
{
v82->mesh_bits = 802621;
}
else if (v84 == (&v85->aiTarget.draw_room + 1))
{
v82->mesh_bits = 819001;
}
else if (v84 == &v85->aiTarget.pad1[30])
{
v82->mesh_bits = 17592121;
}
else if (v84 == LOWORD(creature2->aiTarget.touch_bits))
{
v82->mesh_bits = 0x1FFF;
LOWORD(v88) = item->roomNumber;
*a4 = v88;
v89 = GetFloor(item->pos.xPos, item->pos.yPos, item->pos.zPos, a4);
GetHeight(v89, item->pos.xPos, item->pos.yPos, item->pos.zPos);
TestTriggers(trigger_index, 1, 0);
item->requriedAnimState = 5;
*item->pad2 = 0;
}
}
goto LABEL_255;
case 38:
if ((v120 != 69 || item != lara.target)
&& (GetRandomControl() & 0x7F || (v90 = item->triggerFlags, v90 >= 10) || v90 == 9))
{
v91 = item->_bf15ea;
if (v91 & 0x200)
{
LOWORD(v92) = AIGuard(creature);
joint2 = 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; item->goalAnimState = 1;
} break;
goto LABEL_255;
case 39: case 30:
if (item != lara.target && !(GetRandomControl() & 0x3F)) case 31:
if (item->currentAnimState == 31)
{ {
v94 = item->triggerFlags; if (item->triggerFlags != 8 || !los || item->hitStatus)
if (v94 == 7 || v94 == 9) item->goalAnimState = 30;
item->requriedAnimState = 38;
item->goalAnimState = 1;
} }
LABEL_253:
HIWORD(v44) = HIWORD(anims); creature->LOT.isJumping = false;
creature->maximumTurn = ANGLE(5);
if (canJump1block || canJump2blocks || info.distance < 0x100000 || !los || item->hitStatus)
item->goalAnimState = 1;
break;
case 36:
if (item->frameNumber == Anims[item->animNumber].frameBase + 39) if (item->frameNumber == Anims[item->animNumber].frameBase + 39)
{ {
LABEL_254: roomNumber = item->roomNumber;
LOWORD(v44) = item->roomNumber; floor = GetFloor(item->pos.xPos, item->pos.yPos, item->pos.zPos, &roomNumber);
*a4 = v44; GetFloorHeight(floor, item->pos.xPos, item->pos.yPos, item->pos.zPos);
v95 = GetFloor(*v42, item->pos.yPos, item->pos.zPos, a4); TestTriggers(TriggerIndex, 1, 0);
GetHeight(v95, *v42, item->pos.yPos, item->pos.zPos);
TestTriggers(trigger_index, 1, 0);
} }
goto LABEL_255; break;
case 37:
ITEM_INFO* currentItem = NULL;
for (short currentItemNumber = Rooms[item->roomNumber].itemNumber; currentItemNumber != NO_ITEM; currentItemNumber = currentItem->nextItem)
{
currentItem = &Items[currentItemNumber];
if (item->objectNumber == ID_PUZZLE_HOLE8)
break;
}
if (item->frameNumber == Anims[item->animNumber].frameBase)
{
currentItem->meshBits = 0x1FFF;
item->pos.xPos = currentItem->pos.xPos - 256;
item->pos.yRot = currentItem->pos.yRot;
item->pos.zPos = currentItem->pos.zPos + 128;
*item->pad2 = 1024;
}
else
{
if (item->frameNumber == Anims[item->animNumber].frameBase + 32)
{
currentItem->meshBits = 16381;
}
else if (item->frameNumber == Anims[item->animNumber].frameBase + 74)
{
currentItem->meshBits = 278461;
}
else if (item->frameNumber == Anims[item->animNumber].frameBase + 120)
{
currentItem->meshBits = 802621;
}
else if (item->frameNumber == Anims[item->animNumber].frameBase + 157)
{
currentItem->meshBits = 819001;
}
else if (item->frameNumber == Anims[item->animNumber].frameBase + 190)
{
currentItem->meshBits = 17592121;
}
else if (item->frameNumber == Anims[item->animNumber].frameBase + Anims[item->animNumber].frameEnd)
{
currentItem->meshBits = 0x1FFF;
roomNumber = item->roomNumber;
floor = GetFloor(item->pos.xPos, item->pos.yPos, item->pos.zPos, &roomNumber);
GetFloorHeight(floor, item->pos.xPos, item->pos.yPos, item->pos.zPos);
TestTriggers(TriggerIndex, 1, 0);
item->requiredAnimState = 5;
*item->pad2 = 0;
}
}
break;
case 38:
if ((item->objectNumber != ID_SCIENTIST || item != Lara.target)
&& (GetRandomControl() & 0x7F || item->triggerFlags >= 10 || item->triggerFlags == 9))
{
if (item->aiBits & GUARD)
{
joint2 = AIGuard(creature);
if (item->aiBits & PATROL1)
{
item->triggerFlags--;
if (item->triggerFlags < 1)
{
item->aiBits = PATROL1 | MODIFY;
}
}
}
}
else
{
item->goalAnimState = 1;
}
break;
case 39:
if (item != Lara.target && !(GetRandomControl() & 0x3F))
{
if (item->triggerFlags == 7 || item->triggerFlags == 9)
item->requiredAnimState = 38;
item->goalAnimState = 1;
}
if (item->frameNumber == Anims[item->animNumber].frameBase + 39)
{
roomNumber = item->roomNumber;
floor = GetFloor(item->pos.xPos, item->pos.yPos, item->pos.zPos, &roomNumber);
GetFloorHeight(floor, item->pos.xPos, item->pos.yPos, item->pos.zPos);
TestTriggers(TriggerIndex, 1, 0);
}
break;
default: default:
goto LABEL_255; break;
}
} }
LABEL_255:
CreatureJoint(item, 0, joint0); CreatureJoint(item, 0, joint0);
CreatureJoint(item, 1, joint1); CreatureJoint(item, 1, joint1);
CreatureJoint(item, 2, joint2); CreatureJoint(item, 2, joint2);
if (!(creature->bitfield & 8))
goto LABEL_269; if (creature->reachedGoal && creature->enemy)
v97 = creature->enemy;
if (!v97)
goto LABEL_269;
v98 = v97->flags;
if (v98 != 4)
{ {
if (v98 & 0x10) ITEM_INFO* enemy = creature->enemy;
if (enemy->flags != 4)
{
if (enemy->flags & 0x10)
{ {
v99 = item->_bf15ea;
item->goalAnimState = 1; item->goalAnimState = 1;
item->requriedAnimState = 38; item->requiredAnimState = 38;
item->triggerFlags = 300; item->triggerFlags = 300;
BYTE1(v99) &= 0xCBu; item->aiBits = GUARD | PATROL1;
} }
else else
{ {
if (v98 & 0x20) if (enemy->flags & 0x20)
{ {
v100 = item->_bf15ea;
item->goalAnimState = 1; item->goalAnimState = 1;
item->requriedAnimState = 36; item->requiredAnimState = 36;
BYTE1(v100) = BYTE1(v100) & 0xC9 | 8; item->aiBits = PATROL1 | MODIFY;
item->_bf15ea = v100;
goto LABEL_268;
} }
LOWORD(v96) = v97->roomNumber; else
*a4 = v96; {
v101 = GetFloor(creature->enemy->pos.xPos, creature->enemy->pos.yPos, creature->enemy->pos.zPos, a4); roomNumber = enemy->roomNumber;
GetHeight(v101, creature->enemy->pos.xPos, creature->enemy->pos.yPos, creature->enemy->pos.zPos); floor = GetFloor(creature->enemy->pos.xPos, creature->enemy->pos.yPos, creature->enemy->pos.zPos, &roomNumber);
TestTriggers(trigger_index, 1, 0); GetFloorHeight(floor, creature->enemy->pos.xPos, creature->enemy->pos.yPos, creature->enemy->pos.zPos);
item->requriedAnimState = 5; TestTriggers(TriggerIndex, 1, 0);
item->requiredAnimState = 5;
if (creature->enemy->flags & 2) if (creature->enemy->flags & 2)
item->item_flags[3] = item->pad2[6] - 1; item->itemFlags[3] = item->pad2[6] - 1;
if (!(creature->enemy->flags & 8)) if (creature->enemy->flags & 8)
goto LABEL_268; {
v99 = item->_bf15ea; item->requiredAnimState = 1;
item->requriedAnimState = 1;
item->triggerFlags = 300; item->triggerFlags = 300;
item->aiBits |= GUARD | PATROL1;
} }
BYTE1(v99) |= 0xAu;
item->_bf15ea = v99;
goto LABEL_268;
} }
}
}
else
{
item->goalAnimState = 1; item->goalAnimState = 1;
item->requriedAnimState = 37; item->requiredAnimState = 37;
LABEL_268: }
++item->item_flags[3]; }
creature->bitfield &= 0xFFF7u;
creature->enemy = 0; if ((item->currentAnimState >= 20
LABEL_269: || item->currentAnimState == 6
v102 = item->currentAnimState; || item->currentAnimState == 8)
if ((v102 >= 20 || v102 == 6 || v102 == 8) && v102 != 30) && item->currentAnimState != 30)
{ {
CreatureAnimation(itemNum, angle, 0); CreatureAnimation(itemNum, angle, 0);
} }
@ -858,58 +852,46 @@ LABEL_269:
switch (CreatureVault(itemNum, angle, 2, 256) + 4) switch (CreatureVault(itemNum, angle, 2, 256) + 4)
{ {
case 0: case 0:
v113 = animIndex;
creature->maximumTurn = 0; creature->maximumTurn = 0;
item->animNumber = v113 + 38; item->animNumber = animIndex + 38;
v114 = Anims[(v113 + 38)].frameBase;
item->currentAnimState = 23; item->currentAnimState = 23;
item->frameNumber = v114; item->frameNumber = Anims[item->animNumber].frameBase;
break; break;
case 1: case 1:
v111 = animIndex;
creature->maximumTurn = 0; creature->maximumTurn = 0;
v111 += 39; item->animNumber = animIndex + 39;
item->animNumber = v111;
v112 = Anims[v111].frameBase;
item->currentAnimState = 24; item->currentAnimState = 24;
item->frameNumber = v112; item->frameNumber = Anims[item->animNumber].frameBase;
break; break;
case 2: case 2:
v109 = animIndex;
creature->maximumTurn = 0; creature->maximumTurn = 0;
item->animNumber = v109 + 40; item->animNumber = animIndex + 40;
v110 = Anims[(v109 + 40)].frameBase;
item->currentAnimState = 25; item->currentAnimState = 25;
item->frameNumber = v110; item->frameNumber = Anims[item->animNumber].frameBase;
break; break;
case 6: case 6:
v103 = animIndex;
creature->maximumTurn = 0; creature->maximumTurn = 0;
item->animNumber = v103 + 35; item->animNumber = animIndex + 35;
v104 = Anims[(v103 + 35)].frameBase;
item->currentAnimState = 20; item->currentAnimState = 20;
item->frameNumber = v104; item->frameNumber = Anims[item->animNumber].frameBase;
break; break;
case 7: case 7:
v105 = animIndex;
creature->maximumTurn = 0; creature->maximumTurn = 0;
v105 += 36; item->animNumber = animIndex + 36;
item->animNumber = v105;
v106 = Anims[v105].frameBase;
item->currentAnimState = 21; item->currentAnimState = 21;
item->frameNumber = v106; item->frameNumber = Anims[item->animNumber].frameBase;
break; break;
case 8: case 8:
v107 = animIndex;
creature->maximumTurn = 0; creature->maximumTurn = 0;
item->animNumber = v107 + 37; item->animNumber = animIndex + 37;
v108 = Anims[(v107 + 37)].frameBase;
item->currentAnimState = 22; item->currentAnimState = 22;
item->frameNumber = v108; item->frameNumber = Anims[item->animNumber].frameBase;
break; break;
default:
return;
} }
} }
return; }
}*/

View file

@ -1,7 +1,7 @@
#pragma once #pragma once
#include "../Global/global.h" #include "../Global/global.h"
#define ControlGuard ((void (__cdecl*)(short)) 0x0046F5E0) //#define ControlGuard ((void (__cdecl*)(short)) 0x0046F5E0)
#define ControlSubmarine ((void (__cdecl*)(short)) 0x0045D3F0) #define ControlSubmarine ((void (__cdecl*)(short)) 0x0045D3F0)
#define ControlDoberman ((void (__cdecl*)(short)) 0x00428A10) #define ControlDoberman ((void (__cdecl*)(short)) 0x00428A10)
#define ControlDog ((void (__cdecl*)(short)) 0x0043B730) #define ControlDog ((void (__cdecl*)(short)) 0x0043B730)
@ -54,3 +54,4 @@ void PushableBlockCollision(short itemNum, ITEM_INFO* laraitem, COLL_INFO* coll)
int TestBlockMovable(ITEM_INFO* item, int blokhite); int TestBlockMovable(ITEM_INFO* item, int blokhite);
int TestBlockPush(ITEM_INFO* item, int blokhite, unsigned short quadrant); int TestBlockPush(ITEM_INFO* item, int blokhite, unsigned short quadrant);
int TestBlockPull(ITEM_INFO* item, int blokhite, short quadrant); int TestBlockPull(ITEM_INFO* item, int blokhite, short quadrant);
void ControlGuard(short itemNum);