diff --git a/TR5Main/Objects/TR5/tr5_guard.cpp b/TR5Main/Objects/TR5/tr5_guard.cpp index 391e61ff2..2543ef603 100644 --- a/TR5Main/Objects/TR5/tr5_guard.cpp +++ b/TR5Main/Objects/TR5/tr5_guard.cpp @@ -126,7 +126,6 @@ void InitialiseGuardLaser(short itemNum) item->currentAnimState = 1; } -/* void ControlGuard(short itemNum) { if (!CreatureActive(itemNum)) @@ -138,13 +137,9 @@ void ControlGuard(short itemNum) else animIndex = Objects[ID_BLUE_GUARD].animIndex; - HIWORD(v2) = HIWORD(items); - ITEM_INFO* item = &Items[itemNum]; CREATURE_INFO* creature = (CREATURE_INFO*)item->data; - LOWORD(v2) = item->roomNumber; - short angle = 0; short joint2 = 0; short joint1 = 0; @@ -252,263 +247,142 @@ void ControlGuard(short itemNum) } else { + GetCreatureMood(item, &info, creature->enemy != LaraItem); - } - - - GetCreatureMood(item, &info, creature->enemy != LaraItem); - - if (item->objectNumber == ID_SCIENTIST) - { - if (item->hitPoints >= Objects[ID_SCIENTIST].hitPoints) + if (item->objectNumber == ID_SCIENTIST) { - if (creature->enemy == LaraItem) - creature->mood = BORED_MOOD; - } - else - { - creature->mood = ESCAPE_MOOD; - } - } - - if (Rooms[item->roomNumber].flags & ENV_FLAG_NO_LENSFLARE) // CHECK - { - if (item->objectNumber == ID_SWAT_PLUS) - { - item->itemFlags[0]++; - if (item->itemFlags[0] > 60 && !(GetRandomControl() & 0xF)) + if (item->hitPoints >= Objects[ID_SCIENTIST].hitPoints) { - SoundEffect(SFX_BIO_BREATHE_OUT, &item->pos, 0); - item->itemFlags[0] = 0; - } - } - else - { - if (!(GlobalCounter & 7)) - item->hitPoints--; - creature->mood = ESCAPE_MOOD; - if (item->hitPoints <= 0) - { - item->currentAnimState = 8; - item->animNumber = animIndex + 16; - item->frameNumber = Anims[item->animNumber].frameBase; - } - } - } - - 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)) - { - if (!(item->aiBits & FOLLOW) && item->objectNumber != ID_SCIENTIST && abs(item->pos.yPos - LaraItem->pos.yPos) < 1280) - { - creature->enemy = LaraItem; - AlertAllGuards(itemNum); - } - } - - creature->enemy = enemy; - - GAME_VECTOR src; - src.x = item->pos.xPos; - src.y = item->pos.yPos - 384; - src.z = item->pos.zPos; - - 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; - - switch (item->currentAnimState) - { - case 1: - creature->LOT.isJumping = false; - joint2 = laraInfo.angle; - creature->flags = 0; - - if (info.ahead) - { - if (!(item->aiBits & FOLLOW)) - { - joint0 = info.angle >> 1; - joint1 = info.xAngle; - } - } - - if (item->objectNumber == ID_SCIENTIST && item == Lara.target) - { - item->goalAnimState = 39; - } - else if (item->requiredAnimState) - { - item->goalAnimState = item->requiredAnimState; - } - else if (item->aiBits & GUARD) - { - if (item->aiBits & MODIFY) - joint2 = 0; - else - joint2 = AIGuard(creature); - - if (item->aiBits & PATROL1) - { - item->triggerFlags--; - if (item->triggerFlags < 1) - item->aiBits &= ~GUARD; - } - } - else if (creature->enemy == LaraItem && (laraInfo.angle > 20480 || laraInfo.angle < -20480) && item->objectNumber != ID_SCIENTIST) - { - item->goalAnimState = 2; - } - else if (item->aiBits & PATROL1) - { - item->goalAnimState = 5; - } - else if (item->aiBits & AMBUSH) - { - item->goalAnimState = 7; - } - else if (Targetable(item, &info) && item->objectNumber != ID_SCIENTIST) - { - if (info.distance >= 0x1000000 && info.zoneNumber == info.enemyZone) - { - if (!(item->aiBits & MODIFY)) - item->goalAnimState = 5; + if (creature->enemy == LaraItem) + creature->mood = BORED_MOOD; } else - item->goalAnimState = 4; + { + creature->mood = ESCAPE_MOOD; + } } - else if (canJump1block || canJump2blocks) + + if (Rooms[item->roomNumber].flags & ENV_FLAG_NO_LENSFLARE) // CHECK { - creature->maximumTurn = 0; - item->animNumber = animIndex + 41; - item->currentAnimState = 26; - item->frameNumber = Anims[item->animNumber].frameBase; - if (canJump1block) - item->goalAnimState = 27; + if (item->objectNumber == ID_SWAT_PLUS) + { + item->itemFlags[0]++; + if (item->itemFlags[0] > 60 && !(GetRandomControl() & 0xF)) + { + SoundEffect(SFX_BIO_BREATHE_OUT, &item->pos, 0); + item->itemFlags[0] = 0; + } + } else - item->goalAnimState = 28; - creature->LOT.isJumping = true; + { + if (!(GlobalCounter & 7)) + item->hitPoints--; + creature->mood = ESCAPE_MOOD; + if (item->hitPoints <= 0) + { + item->currentAnimState = 8; + item->animNumber = animIndex + 16; + item->frameNumber = Anims[item->animNumber].frameBase; + } + } } - else if (los) + + 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)) { - item->goalAnimState = 31; + if (!(item->aiBits & FOLLOW) && item->objectNumber != ID_SCIENTIST && abs(item->pos.yPos - LaraItem->pos.yPos) < 1280) + { + creature->enemy = LaraItem; + AlertAllGuards(itemNum); + } } - else if (creature->mood) + + creature->enemy = enemy; + + GAME_VECTOR src; + src.x = item->pos.xPos; + src.y = item->pos.yPos - 384; + src.z = item->pos.zPos; + + 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; + + switch (item->currentAnimState) { - if (info.distance < 0x900000 || item->aiBits & FOLLOW) + case 1: + creature->LOT.isJumping = false; + joint2 = laraInfo.angle; + creature->flags = 0; + + if (info.ahead) + { + if (!(item->aiBits & FOLLOW)) + { + joint0 = info.angle >> 1; + joint1 = info.xAngle; + } + } + + if (item->objectNumber == ID_SCIENTIST && item == Lara.target) + { + item->goalAnimState = 39; + } + else if (item->requiredAnimState) + { + item->goalAnimState = item->requiredAnimState; + } + else if (item->aiBits & GUARD) + { + if (item->aiBits & MODIFY) + joint2 = 0; + else + joint2 = AIGuard(creature); + + if (item->aiBits & PATROL1) + { + item->triggerFlags--; + if (item->triggerFlags < 1) + item->aiBits &= ~GUARD; + } + } + else if (creature->enemy == LaraItem && (laraInfo.angle > 20480 || laraInfo.angle < -20480) && item->objectNumber != ID_SCIENTIST) + { + item->goalAnimState = 2; + } + else if (item->aiBits & PATROL1) { item->goalAnimState = 5; } - else - item->goalAnimState = 7; - } - else - { - item->goalAnimState = 1; - } - - if (item->triggerFlags == 11) - item->triggerFlags = 0; - break; - - case 2: - creature->flags = 0; - if (info.angle >= 0) - item->pos.yRot -= ANGLE(2); - else - item->pos.yRot += ANGLE(2); - if (item->frameNumber == Anims[item->animNumber].frameEnd) - item->pos.yRot += -ANGLE(180); - break; - - case 3: - case 35: - joint0 = laraInfo.angle >> 1; - joint2 = laraInfo.angle >> 1; - if (info.ahead) - joint1 = info.xAngle; - if (abs(info.angle) >= ANGLE(2)) - { - if (info.angle >= 0) - item->pos.yRot += ANGLE(2); - else - item->pos.yRot -= ANGLE(2); - } - else - { - item->pos.yRot += info.angle; - } - - if (item->currentAnimState == 35) - { - if (creature->flags) + else if (item->aiBits & AMBUSH) { - if (item->frameNumber < Anims[item->animNumber].frameBase + 10 - && (item->frameNumber - Anims[item->animNumber].frameBase) & 1) - creature->flags = 0; + item->goalAnimState = 7; } - } - - if (!creature->flags) - { - creature->flags = 1; - item->firedWeapon = 2; - if (item->currentAnimState == 3) - ShotLara(item, &info, &swatGun, joint0, 30); - else - ShotLara(item, &info, &swatGun, joint0, 10); - } - break; - - case 4: - creature->flags = 0; - joint0 = laraInfo.angle >> 1; - joint2 = laraInfo.angle >> 1; - if (info.ahead) - joint1 = info.xAngle; - if (abs(info.angle) >= ANGLE(2)) - { - if (info.angle >= 0) - item->pos.yRot += ANGLE(2); - else - item->pos.yRot -= ANGLE(2); - } - else - { - item->pos.yRot += info.angle; - } - - if (!Targetable(item, &info)) - item->goalAnimState = 1; - else if (item->objectNumber == ID_BLUE_GUARD || item->objectNumber == ID_CRANE_GUY) - item->goalAnimState = 3; - else - item->goalAnimState = 35; - break; - - case 5: - creature->LOT.isJumping = false; - creature->maximumTurn = ANGLE(5); - if (!Targetable(item, &info) - || info.distance >= 0x1000000 && info.zoneNumber == info.enemyZone - || item->objectNumber == ID_SCIENTIST - || item->aiBits & AMBUSH || item->aiBits & PATROL1) // CHECK - { - if (canJump1block || canJump2blocks) + else if (Targetable(item, &info) && item->objectNumber != ID_SCIENTIST) + { + if (info.distance >= 0x1000000 && info.zoneNumber == info.enemyZone) + { + if (!(item->aiBits & MODIFY)) + item->goalAnimState = 5; + } + else + item->goalAnimState = 4; + } + else if (canJump1block || canJump2blocks) { creature->maximumTurn = 0; item->animNumber = animIndex + 41; @@ -520,14 +394,136 @@ void ControlGuard(short itemNum) item->goalAnimState = 28; creature->LOT.isJumping = true; } - else if (info.distance >= 0x100000) + else if (los) { - if (!los || item->aiBits) + item->goalAnimState = 31; + } + else if (creature->mood) + { + if (info.distance < 0x900000 || item->aiBits & FOLLOW) { - if (info.distance > 0x900000) + item->goalAnimState = 5; + } + else + item->goalAnimState = 7; + } + else + { + item->goalAnimState = 1; + } + + if (item->triggerFlags == 11) + item->triggerFlags = 0; + break; + + case 2: + creature->flags = 0; + if (info.angle >= 0) + item->pos.yRot -= ANGLE(2); + else + item->pos.yRot += ANGLE(2); + if (item->frameNumber == Anims[item->animNumber].frameEnd) + item->pos.yRot += -ANGLE(180); + break; + + case 3: + case 35: + joint0 = laraInfo.angle >> 1; + joint2 = laraInfo.angle >> 1; + if (info.ahead) + joint1 = info.xAngle; + if (abs(info.angle) >= ANGLE(2)) + { + if (info.angle >= 0) + item->pos.yRot += ANGLE(2); + else + item->pos.yRot -= ANGLE(2); + } + else + { + item->pos.yRot += info.angle; + } + + if (item->currentAnimState == 35) + { + if (creature->flags) + { + if (item->frameNumber < Anims[item->animNumber].frameBase + 10 + && (item->frameNumber - Anims[item->animNumber].frameBase) & 1) + creature->flags = 0; + } + } + + if (!creature->flags) + { + creature->flags = 1; + item->firedWeapon = 2; + if (item->currentAnimState == 3) + ShotLara(item, &info, &swatGun, joint0, 30); + else + ShotLara(item, &info, &swatGun, joint0, 10); + } + break; + + case 4: + creature->flags = 0; + joint0 = laraInfo.angle >> 1; + joint2 = laraInfo.angle >> 1; + if (info.ahead) + joint1 = info.xAngle; + if (abs(info.angle) >= ANGLE(2)) + { + if (info.angle >= 0) + item->pos.yRot += ANGLE(2); + else + item->pos.yRot -= ANGLE(2); + } + else + { + item->pos.yRot += info.angle; + } + + if (!Targetable(item, &info)) + item->goalAnimState = 1; + else if (item->objectNumber == ID_BLUE_GUARD || item->objectNumber == ID_CRANE_GUY) + item->goalAnimState = 3; + else + item->goalAnimState = 35; + break; + + case 5: + creature->LOT.isJumping = false; + creature->maximumTurn = ANGLE(5); + if (!Targetable(item, &info) + || info.distance >= 0x1000000 && info.zoneNumber == info.enemyZone + || item->objectNumber == ID_SCIENTIST + || item->aiBits & AMBUSH || item->aiBits & PATROL1) // CHECK + { + if (canJump1block || canJump2blocks) + { + creature->maximumTurn = 0; + item->animNumber = animIndex + 41; + item->currentAnimState = 26; + item->frameNumber = Anims[item->animNumber].frameBase; + if (canJump1block) + item->goalAnimState = 27; + else + item->goalAnimState = 28; + creature->LOT.isJumping = true; + } + else if (info.distance >= 0x100000) + { + if (!los || item->aiBits) { - if (!(item->InDrawRoom)) - item->goalAnimState = 7; + if (info.distance > 0x900000) + { + if (!(item->InDrawRoom)) + item->goalAnimState = 7; + } + } + else + { + item->goalAnimState = 1; } } else @@ -536,320 +532,318 @@ void ControlGuard(short itemNum) } } else + { + item->goalAnimState = 4; + } + break; + + case 7: + creature->LOT.isJumping = false; + creature->maximumTurn = ANGLE(10); + if (Targetable(item, &info) && (info.distance < 0x1000000 || info.enemyZone == info.zoneNumber) && item->objectNumber != ID_SCIENTIST) + { + item->goalAnimState = 4; + } + else if (canJump1block || canJump2blocks) + { + creature->maximumTurn = 0; + item->animNumber = animIndex + 50; + item->currentAnimState = 26; + item->frameNumber = Anims[item->animNumber].frameBase; + if (canJump1block) + item->goalAnimState = 27; + else + item->goalAnimState = 28; + creature->LOT.isJumping = true; + } + else if (los) { item->goalAnimState = 1; } - } - else - { - item->goalAnimState = 4; - } - break; - - case 7: - creature->LOT.isJumping = false; - creature->maximumTurn = ANGLE(10); - if (Targetable(item, &info) && (info.distance < 0x1000000 || info.enemyZone == info.zoneNumber) && item->objectNumber != ID_SCIENTIST) - { - item->goalAnimState = 4; - } - else if (v119 || v117) - { - v64 = animIndex; - creature->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; - LOBYTE(creature->LOT.flags) |= 8u; - } - else if (v45) - { - item->goalAnimState = 1; - } - else if (info.distance < &unk_900000) - { - item->goalAnimState = 5; - } - if (item->triggerFlags == 11) - { - LOBYTE(creature->LOT.flags) |= 8u; - creature->maximumTurn = 0; - } - goto LABEL_255; - case 14: - v68 = item->pos.yPos; - joint2 = laraInfo.angle; - 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); - GetHeight(v70, *v42, item->pos.yPos, item->pos.zPos); - TestTriggers(trigger_index, 1, 0); - SoundEffect(340, &item->pos, 0); - } - if (abs(info.angle) >= 364) - { - if ((info.angle & 0x8000u) == 0) - item->pos.yRot += 364; - else - item->pos.yRot -= 364; - } - else - { - item->pos.yRot += info.angle; - } - goto LABEL_255; - case 15: - LOWORD(v72) = AIGuard(creature); - joint2 = v72; - if (creature->bitfield & 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 = room[v76].item_number; - if (v77 == -1) - goto LABEL_255; - while (1) + else if (info.distance < 0x900000) { - v78 = v77; - v79 = items[v78].object_number; - v80 = &items[v78]; - if (v79 >= 416 && v79 <= 444 && v80->roomNumber == v76) + item->goalAnimState = 5; + } + if (item->triggerFlags == 11) + { + creature->LOT.isJumping = true; + creature->maximumTurn = 0; + } + break; + + case 14: + joint2 = laraInfo.angle; + + if (item->pos.yPos <= item->floor - 2048 || item->triggerFlags != 5) + { + if (item->pos.yPos >= item->floor - 512) + item->goalAnimState = 4; + } + else + { + roomNumber = item->roomNumber; + item->triggerFlags = 0; + 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); + SoundEffect(SFX_LARA_ROPEDOWN_LOOP, &item->pos, 0); + } + if (abs(info.angle) >= 364) + { + if ((info.angle & 0x8000) == 0) + item->pos.yRot += ANGLE(2); + else + item->pos.yRot -= ANGLE(2); + } + else + { + item->pos.yRot += info.angle; + } + break; + + case 15: + joint2 = AIGuard(creature); + if (creature->alerted) + item->goalAnimState = 16; + break; + + case 16: + case 18: + if (item->frameNumber == Anims[item->animNumber].frameBase) + { + 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; + } + + if (item->frameNumber == Anims[item->animNumber].frameBase + 44) + { + *item->pad2 = 0; + short currentItemNumber = Rooms[item->roomNumber].itemNumber; + if (currentItemNumber == NO_ITEM) + break; + + ITEM_INFO * currentItem; + + while (true) { - v81 = v80->triggerFlags; - if (v81 > 2 && v81 < 5) + currentItem = &Items[currentItemNumber]; + + if (currentItem->objectNumber >= ID_ANIMATING1 + && currentItem->objectNumber <= ID_ANIMATING15 + && currentItem->roomNumber == item->roomNumber) + { + if (currentItem->triggerFlags > 2 && currentItem->triggerFlags < 5) + break; + } + currentItemNumber = currentItem->nextItem; + if (currentItemNumber == -1) break; } - v77 = v80->next_item; - if (v77 == -1) - goto LABEL_255; + + if (currentItemNumber == NO_ITEM) + break; + + currentItem->meshBits = -3; } - v80->mesh_bits = -3; - } - else if (v75 == Anims[item->animNumber].frame_end) - { - item->pos.yRot -= 0x4000; - } - goto LABEL_255; - case 17: - v71 = item->_bf15ea; - joint2 = 0; - if (!(v71 & 0x10) && LaraItem->speed < 40 && !(*(&lara + 69) & 0x10)) - creature->bitfield &= 0xFFFEu; - if (creature->bitfield & 1) - 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; - } - v84 = item->frameNumber; - v85 = &Anims[item->animNumber]; - creature2 = v85; - 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) + else if (item->frameNumber == Anims[item->animNumber].frameEnd) { - v82->mesh_bits = 16381; + item->pos.yRot -= ANGLE(90); } - else if (v84 == v85->aiTarget.item_flags) + break; + + case 17: + joint2 = 0; + if (!item->hitStatus && LaraItem->speed < 40 && !Lara.hasFired) + creature->alerted = false; + if (creature->alerted) + item->goalAnimState = 18; + break; + + case 19: + joint2 = AIGuard(creature); + if (creature->alerted) + item->goalAnimState = 1; + break; + + case 30: + case 31: + if (item->currentAnimState == 31) { - v82->mesh_bits = 278461; + if (item->triggerFlags != 8 || !los || item->hitStatus) + item->goalAnimState = 30; } - else if (v84 == &v85->aiTarget.pad_ex_light[16]) + + 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) { - v82->mesh_bits = 802621; + 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); } - else if (v84 == (&v85->aiTarget.draw_room + 1)) + break; + + case 37: + ITEM_INFO* currentItem = NULL; + for (short currentItemNumber = Rooms[item->roomNumber].itemNumber; currentItemNumber != NO_ITEM; currentItemNumber = currentItem->nextItem) { - v82->mesh_bits = 819001; + currentItem = &Items[currentItemNumber]; + if (item->objectNumber == ID_PUZZLE_HOLE8) + break; } - else if (v84 == &v85->aiTarget.pad1[30]) + + if (item->frameNumber == Anims[item->animNumber].frameBase) { - v82->mesh_bits = 17592121; + 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 (v84 == LOWORD(creature2->aiTarget.touch_bits)) + else { - 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->frameNumber == Anims[item->animNumber].frameBase + 32) { - if (--item->triggerFlags < 1) + 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) { - BYTE1(v93) = BYTE1(v93) & 0xC9 | 8; - item->_bf15ea = v93; + 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: + break; + + } + } + + CreatureJoint(item, 0, joint0); + CreatureJoint(item, 1, joint1); + CreatureJoint(item, 2, joint2); + + if (creature->reachedGoal && creature->enemy) + { + ITEM_INFO* enemy = creature->enemy; + + if (enemy->flags != 4) + { + if (enemy->flags & 0x10) + { + item->goalAnimState = 1; + item->requiredAnimState = 38; + item->triggerFlags = 300; + item->aiBits = GUARD | PATROL1; + } + else + { + if (enemy->flags & 0x20) + { + item->goalAnimState = 1; + item->requiredAnimState = 36; + item->aiBits = PATROL1 | MODIFY; + } + else + { + roomNumber = enemy->roomNumber; + floor = GetFloor(creature->enemy->pos.xPos, creature->enemy->pos.yPos, creature->enemy->pos.zPos, &roomNumber); + GetFloorHeight(floor, creature->enemy->pos.xPos, creature->enemy->pos.yPos, creature->enemy->pos.zPos); + TestTriggers(TriggerIndex, 1, 0); + item->requiredAnimState = 5; + if (creature->enemy->flags & 2) + item->itemFlags[3] = item->pad2[6] - 1; + if (creature->enemy->flags & 8) + { + item->requiredAnimState = 1; + item->triggerFlags = 300; + item->aiBits |= GUARD | PATROL1; } } } } else { - LABEL_242: item->goalAnimState = 1; + item->requiredAnimState = 37; } - goto LABEL_255; - case 39: - if (item != lara.target && !(GetRandomControl() & 0x3F)) - { - v94 = item->triggerFlags; - if (v94 == 7 || v94 == 9) - item->requriedAnimState = 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); - GetHeight(v95, *v42, item->pos.yPos, item->pos.zPos); - TestTriggers(trigger_index, 1, 0); - } - goto LABEL_255; - default: - goto LABEL_255; } - -LABEL_255: - CreatureJoint(item, 0, joint0); - CreatureJoint(item, 1, joint1); - CreatureJoint(item, 2, joint2); - if (!(creature->bitfield & 8)) - goto LABEL_269; - v97 = creature->enemy; - if (!v97) - goto LABEL_269; - v98 = v97->flags; - if (v98 != 4) - { - if (v98 & 0x10) - { - v99 = item->_bf15ea; - item->goalAnimState = 1; - item->requriedAnimState = 38; - item->triggerFlags = 300; - BYTE1(v99) &= 0xCBu; - } - else - { - if (v98 & 0x20) - { - v100 = item->_bf15ea; - item->goalAnimState = 1; - item->requriedAnimState = 36; - BYTE1(v100) = BYTE1(v100) & 0xC9 | 8; - item->_bf15ea = v100; - goto LABEL_268; - } - LOWORD(v96) = v97->roomNumber; - *a4 = v96; - v101 = GetFloor(creature->enemy->pos.xPos, creature->enemy->pos.yPos, creature->enemy->pos.zPos, a4); - GetHeight(v101, creature->enemy->pos.xPos, creature->enemy->pos.yPos, creature->enemy->pos.zPos); - TestTriggers(trigger_index, 1, 0); - item->requriedAnimState = 5; - if (creature->enemy->flags & 2) - item->item_flags[3] = item->pad2[6] - 1; - if (!(creature->enemy->flags & 8)) - goto LABEL_268; - v99 = item->_bf15ea; - item->requriedAnimState = 1; - item->triggerFlags = 300; - } - BYTE1(v99) |= 0xAu; - item->_bf15ea = v99; - goto LABEL_268; - } - item->goalAnimState = 1; - item->requriedAnimState = 37; -LABEL_268: - ++item->item_flags[3]; - creature->bitfield &= 0xFFF7u; - creature->enemy = 0; -LABEL_269: - v102 = item->currentAnimState; - if ((v102 >= 20 || v102 == 6 || v102 == 8) && v102 != 30) + if ((item->currentAnimState >= 20 + || item->currentAnimState == 6 + || item->currentAnimState == 8) + && item->currentAnimState != 30) { CreatureAnimation(itemNum, angle, 0); } @@ -858,58 +852,46 @@ LABEL_269: switch (CreatureVault(itemNum, angle, 2, 256) + 4) { case 0: - v113 = animIndex; creature->maximumTurn = 0; - item->animNumber = v113 + 38; - v114 = Anims[(v113 + 38)].frameBase; + item->animNumber = animIndex + 38; item->currentAnimState = 23; - item->frameNumber = v114; + item->frameNumber = Anims[item->animNumber].frameBase; break; + case 1: - v111 = animIndex; creature->maximumTurn = 0; - v111 += 39; - item->animNumber = v111; - v112 = Anims[v111].frameBase; + item->animNumber = animIndex + 39; item->currentAnimState = 24; - item->frameNumber = v112; + item->frameNumber = Anims[item->animNumber].frameBase; break; + case 2: - v109 = animIndex; creature->maximumTurn = 0; - item->animNumber = v109 + 40; - v110 = Anims[(v109 + 40)].frameBase; + item->animNumber = animIndex + 40; item->currentAnimState = 25; - item->frameNumber = v110; + item->frameNumber = Anims[item->animNumber].frameBase; break; + case 6: - v103 = animIndex; creature->maximumTurn = 0; - item->animNumber = v103 + 35; - v104 = Anims[(v103 + 35)].frameBase; + item->animNumber = animIndex + 35; item->currentAnimState = 20; - item->frameNumber = v104; + item->frameNumber = Anims[item->animNumber].frameBase; break; + case 7: - v105 = animIndex; creature->maximumTurn = 0; - v105 += 36; - item->animNumber = v105; - v106 = Anims[v105].frameBase; + item->animNumber = animIndex + 36; item->currentAnimState = 21; - item->frameNumber = v106; + item->frameNumber = Anims[item->animNumber].frameBase; break; + case 8: - v107 = animIndex; creature->maximumTurn = 0; - item->animNumber = v107 + 37; - v108 = Anims[(v107 + 37)].frameBase; + item->animNumber = animIndex + 37; item->currentAnimState = 22; - item->frameNumber = v108; + item->frameNumber = Anims[item->animNumber].frameBase; break; - default: - return; } } - return; -}*/ \ No newline at end of file +} \ No newline at end of file diff --git a/TR5Main/Objects/oldobjects.h b/TR5Main/Objects/oldobjects.h index ae9d1b3b7..879ea3844 100644 --- a/TR5Main/Objects/oldobjects.h +++ b/TR5Main/Objects/oldobjects.h @@ -1,7 +1,7 @@ #pragma once #include "../Global/global.h" -#define ControlGuard ((void (__cdecl*)(short)) 0x0046F5E0) +//#define ControlGuard ((void (__cdecl*)(short)) 0x0046F5E0) #define ControlSubmarine ((void (__cdecl*)(short)) 0x0045D3F0) #define ControlDoberman ((void (__cdecl*)(short)) 0x00428A10) #define ControlDog ((void (__cdecl*)(short)) 0x0043B730) @@ -53,4 +53,5 @@ void PushableBlockControl(short itemNumber); void PushableBlockCollision(short itemNum, ITEM_INFO* laraitem, COLL_INFO* coll); int TestBlockMovable(ITEM_INFO* item, int blokhite); int TestBlockPush(ITEM_INFO* item, int blokhite, unsigned short quadrant); -int TestBlockPull(ITEM_INFO* item, int blokhite, short quadrant); \ No newline at end of file +int TestBlockPull(ITEM_INFO* item, int blokhite, short quadrant); +void ControlGuard(short itemNum); \ No newline at end of file