This commit is contained in:
Montagna Marco 2020-03-23 06:59:43 +01:00
commit e135e1a0a6
4 changed files with 206 additions and 36 deletions

View file

@ -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;

View file

@ -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);

View file

@ -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);

View file

@ -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;