mirror of
https://github.com/TombEngine/TombEngine.git
synced 2025-05-12 05:26:57 +03:00
Merge branch 'master' of https://github.com/MontyTRC89/TR5Main
This commit is contained in:
commit
e135e1a0a6
4 changed files with 206 additions and 36 deletions
|
@ -1774,7 +1774,7 @@ void UpdateDebris()
|
|||
}
|
||||
}
|
||||
|
||||
int LOS(GAME_VECTOR* start, GAME_VECTOR* end)
|
||||
int LOS(GAME_VECTOR* start, GAME_VECTOR* end) // (F) (D)
|
||||
{
|
||||
int result1, result2;
|
||||
|
||||
|
@ -1800,7 +1800,7 @@ int LOS(GAME_VECTOR* start, GAME_VECTOR* end)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int xLOS(GAME_VECTOR* start, GAME_VECTOR* end)
|
||||
int xLOS(GAME_VECTOR* start, GAME_VECTOR* end) // (F) (D)
|
||||
{
|
||||
int dx, dy, dz, x, y, z, flag;
|
||||
short room, room2;
|
||||
|
@ -1905,7 +1905,7 @@ int xLOS(GAME_VECTOR* start, GAME_VECTOR* end)
|
|||
return flag;
|
||||
}
|
||||
|
||||
int zLOS(GAME_VECTOR* start, GAME_VECTOR* end)
|
||||
int zLOS(GAME_VECTOR* start, GAME_VECTOR* end) // (F) (D)
|
||||
{
|
||||
int dx, dy, dz, x, y, z, flag;
|
||||
short room, room2;
|
||||
|
@ -2010,7 +2010,7 @@ int zLOS(GAME_VECTOR* start, GAME_VECTOR* end)
|
|||
return flag;
|
||||
}
|
||||
|
||||
int ClipTarget(GAME_VECTOR* start, GAME_VECTOR* target)
|
||||
int ClipTarget(GAME_VECTOR* start, GAME_VECTOR* target) // (F) (D)
|
||||
{
|
||||
short room;
|
||||
int x, y, z, wx, wy, wz;
|
||||
|
@ -2058,7 +2058,7 @@ int ClipTarget(GAME_VECTOR* start, GAME_VECTOR* target)
|
|||
return 1;
|
||||
}
|
||||
|
||||
int GetTargetOnLOS(GAME_VECTOR* src, GAME_VECTOR* dest, int DrawTarget, int firing)
|
||||
int GetTargetOnLOS(GAME_VECTOR* src, GAME_VECTOR* dest, int DrawTarget, int firing) // (F) (D)
|
||||
{
|
||||
GAME_VECTOR target;
|
||||
int result, flag, itemNumber, count;
|
||||
|
@ -2292,7 +2292,7 @@ int GetTargetOnLOS(GAME_VECTOR* src, GAME_VECTOR* dest, int DrawTarget, int firi
|
|||
return flag;
|
||||
}
|
||||
|
||||
int ObjectOnLOS2(GAME_VECTOR* start, GAME_VECTOR* end, PHD_VECTOR* vec, MESH_INFO** mesh)
|
||||
int ObjectOnLOS2(GAME_VECTOR* start, GAME_VECTOR* end, PHD_VECTOR* vec, MESH_INFO** mesh) // (F) (D)
|
||||
{
|
||||
int r, m;
|
||||
ROOM_INFO* room;
|
||||
|
@ -2360,29 +2360,29 @@ int ObjectOnLOS2(GAME_VECTOR* start, GAME_VECTOR* end, PHD_VECTOR* vec, MESH_INF
|
|||
return ClosestItem;
|
||||
}
|
||||
|
||||
int GetRandomControl()
|
||||
int GetRandomControl() // (F) (D)
|
||||
{
|
||||
rand_1 = 1103515245 * rand_1 + 12345;
|
||||
return rand_1 >> 10 & 0x7FFF;
|
||||
}
|
||||
|
||||
void SeedRandomControl(int seed)
|
||||
void SeedRandomControl(int seed) // (F) (D)
|
||||
{
|
||||
rand_1 = seed;
|
||||
}
|
||||
|
||||
int GetRandomDraw()
|
||||
int GetRandomDraw() // (F) (D)
|
||||
{
|
||||
rand_2 = 1103515245 * rand_2 + 12345;
|
||||
return rand_2 >> 10 & 0x7FFF;
|
||||
}
|
||||
|
||||
void SeedRandomDraw(int seed)
|
||||
void SeedRandomDraw(int seed) // (F) (D)
|
||||
{
|
||||
rand_2 = seed;
|
||||
}
|
||||
|
||||
int GetCeiling(FLOOR_INFO* floor, int x, int y, int z)
|
||||
int GetCeiling(FLOOR_INFO* floor, int x, int y, int z) // (F) (D)
|
||||
{
|
||||
ROOM_INFO* room;
|
||||
FLOOR_INFO* floor2;
|
||||
|
|
|
@ -36,7 +36,6 @@ static short RightClimbTab[4] = // offset 0xA0640
|
|||
|
||||
extern Inventory* g_Inventory;
|
||||
|
||||
short angle = 0;
|
||||
short elevation = 57346;
|
||||
bool doJump = false;
|
||||
short OldAngle = 1;
|
||||
|
@ -5793,7 +5792,7 @@ LABEL_44:
|
|||
return result;
|
||||
}*/
|
||||
|
||||
void SnapLaraToEdgeOfBlock(ITEM_INFO* item, COLL_INFO* coll, short angle)//12E54, 12F04 (F)
|
||||
void SnapLaraToEdgeOfBlock(ITEM_INFO* item, COLL_INFO* coll, short angle) // (F) (D)
|
||||
{
|
||||
if (item->currentAnimState == STATE_LARA_SHIMMY_RIGHT)
|
||||
{
|
||||
|
@ -5836,16 +5835,16 @@ void SnapLaraToEdgeOfBlock(ITEM_INFO* item, COLL_INFO* coll, short angle)//12E54
|
|||
}
|
||||
}
|
||||
|
||||
int LaraTestHangOnClimbWall(ITEM_INFO* item, COLL_INFO* coll)//12C54, 12D04 (F)
|
||||
int LaraTestHangOnClimbWall(ITEM_INFO* item, COLL_INFO* coll) // (F) (D)
|
||||
{
|
||||
short* bounds;
|
||||
ANIM_FRAME* bounds;
|
||||
int shift, result;
|
||||
|
||||
if (Lara.climbStatus == 0)
|
||||
return false;
|
||||
return 0;
|
||||
|
||||
if (item->fallspeed < 0)
|
||||
return false;
|
||||
return 0;
|
||||
|
||||
switch ((unsigned short) (item->pos.yRot + ANGLE(45)) / ANGLE(90))
|
||||
{
|
||||
|
@ -5863,7 +5862,7 @@ int LaraTestHangOnClimbWall(ITEM_INFO* item, COLL_INFO* coll)//12C54, 12D04 (F)
|
|||
break;
|
||||
}
|
||||
|
||||
bounds = GetBoundsAccurate(item);
|
||||
bounds = (ANIM_FRAME*) GetBoundsAccurate(item);
|
||||
|
||||
if (Lara.moveAngle != item->pos.yRot)
|
||||
{
|
||||
|
@ -5871,18 +5870,22 @@ int LaraTestHangOnClimbWall(ITEM_INFO* item, COLL_INFO* coll)//12C54, 12D04 (F)
|
|||
short r = LaraCeilingFront(item, Lara.moveAngle, 128, 0);
|
||||
|
||||
if (abs(l - r) > 60)
|
||||
return false;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (LaraTestClimbPos(item, coll->radius, coll->radius, bounds[2], bounds[3] - bounds[2], &shift) ||
|
||||
LaraTestClimbPos(item, coll->radius, -coll->radius, bounds[2], bounds[3] - bounds[2], &shift) ||
|
||||
LaraTestClimbPos(item, coll->radius, 0, bounds[2], bounds[3] - bounds[2], &shift))
|
||||
if (LaraTestClimbPos(item, coll->radius, coll->radius, bounds->MinY, bounds->MaxY - bounds->MinY, &shift) &&
|
||||
LaraTestClimbPos(item, coll->radius, -coll->radius, bounds->MinY, bounds->MaxY - bounds->MinY, &shift))
|
||||
{
|
||||
item->pos.yPos += shift;
|
||||
return true;
|
||||
result = LaraTestClimbPos(item, coll->radius, 0, bounds->MinY, bounds->MaxY - bounds->MinY, &shift);
|
||||
if (result)
|
||||
{
|
||||
if (result != 1)
|
||||
item->pos.yPos += shift;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void LaraSlideEdgeJump(ITEM_INFO* item, COLL_INFO* coll)//12B18, 12BC8 (F)
|
||||
|
@ -6325,7 +6328,7 @@ int LaraFallen(ITEM_INFO* item, COLL_INFO* coll)//11B6C, 11C1C (F)
|
|||
return 0;
|
||||
}*/
|
||||
|
||||
short LaraCeilingFront(ITEM_INFO* item, short ang, int dist, int h)//1189C, 1194C (F)
|
||||
short LaraCeilingFront(ITEM_INFO* item, short ang, int dist, int h) // (F) (D)
|
||||
{
|
||||
short room = item->roomNumber;
|
||||
|
||||
|
@ -6341,7 +6344,7 @@ short LaraCeilingFront(ITEM_INFO* item, short ang, int dist, int h)//1189C, 1194
|
|||
return height;
|
||||
}
|
||||
|
||||
short LaraFloorFront(ITEM_INFO* item, short ang, int dist)//117B0, 11860 (F)
|
||||
short LaraFloorFront(ITEM_INFO* item, short ang, int dist) // (F) (D)
|
||||
{
|
||||
short room = item->roomNumber;
|
||||
|
||||
|
@ -6720,6 +6723,174 @@ int TestLaraSlide(ITEM_INFO* item, COLL_INFO* coll)
|
|||
return 1;
|
||||
}
|
||||
|
||||
int LaraHangTest(ITEM_INFO* item, COLL_INFO* coll) // (F) (D)
|
||||
{
|
||||
int delta, flag, flag2, front, dfront, x, z, result;
|
||||
short angle, hdif, cdif, dir;
|
||||
ANIM_FRAME* frame;
|
||||
|
||||
delta = 0;
|
||||
flag = 0;
|
||||
angle = Lara.moveAngle;
|
||||
if (angle == (short) (item->pos.yRot - ANGLE(90)))
|
||||
{
|
||||
delta = -100;
|
||||
}
|
||||
else if (angle == (short) (item->pos.yRot + ANGLE(90)))
|
||||
{
|
||||
delta = 100;
|
||||
}
|
||||
hdif = LaraFloorFront(item, angle, 100);
|
||||
if (hdif < 200)
|
||||
flag = 1;
|
||||
cdif = LaraCeilingFront(item, angle, 100, 0);
|
||||
dir = (unsigned short) (item->pos.yRot + ANGLE(45)) / ANGLE(90);
|
||||
switch (dir)
|
||||
{
|
||||
case NORTH:
|
||||
item->pos.zPos += 4;
|
||||
break;
|
||||
case EAST:
|
||||
item->pos.xPos += 4;
|
||||
break;
|
||||
case SOUTH:
|
||||
item->pos.zPos -= 4;
|
||||
break;
|
||||
case WEST:
|
||||
item->pos.xPos -= 4;
|
||||
break;
|
||||
}
|
||||
coll->badPos = NO_BAD_POS;
|
||||
coll->badNeg = -STEPUP_HEIGHT;
|
||||
coll->badCeiling = 0;
|
||||
Lara.moveAngle = item->pos.yRot;
|
||||
GetLaraCollisionInfo(item, coll);
|
||||
result = 0;
|
||||
if (Lara.climbStatus)
|
||||
{
|
||||
if (TrInput & IN_ACTION && item->hitPoints > 0)
|
||||
{
|
||||
Lara.moveAngle = angle;
|
||||
if (!LaraTestHangOnClimbWall(item, coll))
|
||||
{
|
||||
if (item->animNumber != ANIMATION_LARA_LADDER_TO_HANDS_RIGHT && item->animNumber != ANIMATION_LARA_LADDER_TO_HANDS_LEFT)
|
||||
{
|
||||
SnapLaraToEdgeOfBlock(item, coll, dir);
|
||||
item->pos.yPos = coll->old.y;
|
||||
item->currentAnimState = STATE_LARA_HANG;
|
||||
item->goalAnimState = STATE_LARA_HANG;
|
||||
item->animNumber = ANIMATION_LARA_HANG_IDLE;
|
||||
item->frameNumber = Anims[item->animNumber].frameBase + 21;
|
||||
}
|
||||
result = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (item->animNumber == ANIMATION_LARA_HANG_IDLE && item->frameNumber == Anims[ANIMATION_LARA_HANG_IDLE].frameBase + 21 && LaraTestClimbStance(item, coll))
|
||||
item->goalAnimState = STATE_LARA_LADDER_IDLE;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
item->animNumber = ANIMATION_LARA_FREE_FALL_FORWARD;
|
||||
item->currentAnimState = STATE_LARA_JUMP_FORWARD;
|
||||
item->goalAnimState = STATE_LARA_JUMP_FORWARD;
|
||||
item->frameNumber = Anims[item->animNumber].frameBase;
|
||||
item->pos.yPos += 256;
|
||||
item->gravityStatus = true;
|
||||
item->speed = 2;
|
||||
item->fallspeed = 1;
|
||||
Lara.gunStatus = LG_NO_ARMS;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (TrInput & IN_ACTION && item->hitPoints > 0 && coll->frontFloor <= 0)
|
||||
{
|
||||
if (flag && hdif > 0 && (delta > 0 && coll->leftFloor > coll->rightFloor || delta < 0 && coll->leftFloor < coll->rightFloor))
|
||||
flag = 0;
|
||||
frame = (ANIM_FRAME*) GetBoundsAccurate(item);
|
||||
front = coll->frontFloor;
|
||||
dfront = coll->frontFloor - frame->MinY;
|
||||
flag2 = 0;
|
||||
x = item->pos.xPos;
|
||||
z = item->pos.zPos;
|
||||
switch (dir)
|
||||
{
|
||||
case NORTH:
|
||||
x += delta;
|
||||
break;
|
||||
case EAST:
|
||||
z -= delta;
|
||||
break;
|
||||
case SOUTH:
|
||||
x -= delta;
|
||||
break;
|
||||
case WEST:
|
||||
z += delta;
|
||||
break;
|
||||
}
|
||||
Lara.moveAngle = angle;
|
||||
if (256 << dir & GetClimbTrigger(x, item->pos.yPos, z, item->roomNumber))
|
||||
{
|
||||
if (!LaraTestHangOnClimbWall(item, coll))
|
||||
dfront = 0;
|
||||
}
|
||||
else if (abs(coll->leftFloor2 - coll->rightFloor2) >= 60)
|
||||
{
|
||||
if (delta < 0 && coll->leftFloor2 != coll->frontFloor || delta > 0 && coll->rightFloor2 != coll->frontFloor)
|
||||
flag2 = 1;
|
||||
}
|
||||
coll->frontFloor = front;
|
||||
if (!flag2 && coll->midCeiling < 0 && coll->collType == CT_FRONT && !flag && !coll->hitStatic && cdif <= -950 && dfront >= -60 && dfront <= 60)
|
||||
{
|
||||
switch (dir)
|
||||
{
|
||||
case NORTH:
|
||||
case SOUTH:
|
||||
item->pos.zPos += coll->shift.z;
|
||||
break;
|
||||
case EAST:
|
||||
case WEST:
|
||||
item->pos.xPos += coll->shift.x;
|
||||
break;
|
||||
}
|
||||
item->pos.yPos += dfront;
|
||||
}
|
||||
else
|
||||
{
|
||||
item->pos.xPos = coll->old.x;
|
||||
item->pos.yPos = coll->old.y;
|
||||
item->pos.zPos = coll->old.z;
|
||||
if (item->currentAnimState == STATE_LARA_SHIMMY_LEFT || item->currentAnimState == STATE_LARA_SHIMMY_RIGHT)
|
||||
{
|
||||
item->currentAnimState = STATE_LARA_HANG;
|
||||
item->goalAnimState = STATE_LARA_HANG;
|
||||
item->animNumber = ANIMATION_LARA_HANG_IDLE;
|
||||
item->frameNumber = Anims[item->animNumber].frameBase + 21;
|
||||
}
|
||||
result = 1;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
item->currentAnimState = STATE_LARA_JUMP_UP;
|
||||
item->goalAnimState = STATE_LARA_JUMP_UP;
|
||||
item->animNumber = ANIMATION_LARA_TRY_HANG_VERTICAL;
|
||||
item->frameNumber = Anims[item->animNumber].frameBase + 9;
|
||||
frame = (ANIM_FRAME*) GetBoundsAccurate(item);
|
||||
item->pos.xPos += coll->shift.x;
|
||||
item->pos.yPos += frame->MaxY;
|
||||
item->pos.zPos += coll->shift.z;
|
||||
item->gravityStatus = true;
|
||||
item->speed = 2;
|
||||
item->fallspeed = 1;
|
||||
Lara.gunStatus = LG_NO_ARMS;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
void Inject_Lara()
|
||||
{
|
||||
//INJECT(0x00448010, lara_as_stop);
|
||||
|
|
|
@ -53,7 +53,6 @@ extern LaraExtraInfo g_LaraExtra;
|
|||
|
||||
#define GetLaraJointPosition ((void (__cdecl*)(PHD_VECTOR*, int)) 0x0041E2A0)
|
||||
//#define AnimateLara ((int (__cdecl*)(ITEM_INFO*)) 0x004563F0)
|
||||
#define LaraHangTest ((int (__cdecl*)(ITEM_INFO*, COLL_INFO*)) 0x004460F0)
|
||||
|
||||
extern void(*lara_control_routines[NUM_LARA_STATES + 1])(ITEM_INFO* item, COLL_INFO* coll);
|
||||
extern void(*lara_collision_routines[NUM_LARA_STATES + 1])(ITEM_INFO* item, COLL_INFO* coll);
|
||||
|
@ -214,7 +213,7 @@ int TestHangSwingIn(ITEM_INFO* item, short angle);
|
|||
int LaraHangLeftCornerTest(ITEM_INFO* item, COLL_INFO* coll);
|
||||
int LaraHangRightCornerTest(ITEM_INFO* item, COLL_INFO* coll);
|
||||
int IsValidHangPos(ITEM_INFO* item, COLL_INFO* coll);
|
||||
//int LaraHangTest(ITEM_INFO* item, COLL_INFO* coll);
|
||||
int LaraHangTest(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void SnapLaraToEdgeOfBlock(ITEM_INFO* item, COLL_INFO* coll, short angle);
|
||||
int LaraTestHangOnClimbWall(ITEM_INFO* item, COLL_INFO* coll);
|
||||
void LaraSlideEdgeJump(ITEM_INFO* item, COLL_INFO* coll);
|
||||
|
|
|
@ -15,7 +15,7 @@ short LeftExtRightIntTab[4] = // offset 0xA0B84
|
|||
0x0200, 0x0400, 0x0800, 0x0100
|
||||
};
|
||||
|
||||
short GetClimbTrigger(int x, int y, int z, short roomNumber)//46E38, 4729C (F)
|
||||
short GetClimbTrigger(int x, int y, int z, short roomNumber) // (F) (D)
|
||||
{
|
||||
GetFloorHeight(GetFloor(x, y, z, &roomNumber), x, y, z);
|
||||
|
||||
|
@ -24,15 +24,15 @@ short GetClimbTrigger(int x, int y, int z, short roomNumber)//46E38, 4729C (F)
|
|||
if (data == NULL)
|
||||
return 0;
|
||||
|
||||
if ((*data & 0x1F) == 5)
|
||||
if ((*data & DATA_TYPE) == LAVA_TYPE)
|
||||
{
|
||||
if (*data & 0x8000)
|
||||
if (*data & END_BIT)
|
||||
return 0;
|
||||
|
||||
data++;
|
||||
}
|
||||
|
||||
return (*data & 0x1F) == 6 ? *data : 0;
|
||||
return (*data & DATA_TYPE) == CLIMB_TYPE ? *data : 0;
|
||||
}
|
||||
|
||||
void lara_col_climbend(ITEM_INFO* item, COLL_INFO* coll)//46E30(<), 47294(<) (F)
|
||||
|
@ -452,11 +452,11 @@ void lara_as_climbstnc(ITEM_INFO* item, COLL_INFO* coll)//463F0, 46854 (F)
|
|||
}
|
||||
}
|
||||
|
||||
int LaraTestClimbPos(ITEM_INFO* item, int front, int right, int origin, int height, int* shift)//462F8, 4675C (F)
|
||||
int LaraTestClimbPos(ITEM_INFO* item, int front, int right, int origin, int height, int* shift) // (F) (D)
|
||||
{
|
||||
short angle = (unsigned short) (item->pos.yRot + ANGLE(45)) >> W2V_SHIFT;
|
||||
int x = 0;
|
||||
int z = 0;
|
||||
int x;
|
||||
int z;
|
||||
int xfront = 0;
|
||||
int zfront = 0;
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue