Hairs done on GPU now

This commit is contained in:
Montagna Marco 2020-07-07 07:32:33 +02:00
parent e88d24347b
commit 2a1c491c7e
65 changed files with 358 additions and 450 deletions

View file

@ -514,7 +514,7 @@ int CreatureAnimation(short itemNumber, short angle, short tilt)
item = &Items[itemNumber]; item = &Items[itemNumber];
if (item->data == NULL) if (item->data == NULL)
return FALSE; return false;
creature = (CREATURE_INFO*)item->data; creature = (CREATURE_INFO*)item->data;
LOT = &creature->LOT; LOT = &creature->LOT;
@ -536,7 +536,7 @@ int CreatureAnimation(short itemNumber, short angle, short tilt)
if (item->status == ITEM_DEACTIVATED) if (item->status == ITEM_DEACTIVATED)
{ {
CreatureDie(itemNumber, FALSE); CreatureDie(itemNumber, FALSE);
return FALSE; return false;
} }
bounds = GetBoundsAccurate(item); bounds = GetBoundsAccurate(item);
@ -714,7 +714,7 @@ int CreatureAnimation(short itemNumber, short angle, short tilt)
item->pos.yRot -= BIFF_AVOID_TURN; item->pos.yRot -= BIFF_AVOID_TURN;
else else
item->pos.yRot += BIFF_AVOID_TURN; item->pos.yRot += BIFF_AVOID_TURN;
return TRUE; return true;
} }
if (LOT->fly != NO_FLYING && item->hitPoints > 0) if (LOT->fly != NO_FLYING && item->hitPoints > 0)
@ -857,7 +857,7 @@ int CreatureAnimation(short itemNumber, short angle, short tilt)
if (item->roomNumber != roomNumber) if (item->roomNumber != roomNumber)
ItemNewRoom(itemNumber, roomNumber); ItemNewRoom(itemNumber, roomNumber);
return TRUE; return true;
} }
void CreatureDie(short itemNumber, int explode) void CreatureDie(short itemNumber, int explode)
@ -916,7 +916,7 @@ int BadFloor(int x, int y, int z, int boxHeight, int nextHeight, short roomNumbe
int CreatureCreature(short itemNumber) int CreatureCreature(short itemNumber)
{ {
ITEM_INFO* item, *linked; ITEM_INFO* item, *linked;
ObjectInfo* obj; OBJECT_INFO* obj;
ROOM_INFO* r; ROOM_INFO* r;
int x, z, xDistance, zDistance, distance = 0; int x, z, xDistance, zDistance, distance = 0;
short link, radius; short link, radius;
@ -999,8 +999,6 @@ void TargetBox(LOT_INFO* LOT, short boxNumber)
boxNumber &= NO_BOX; boxNumber &= NO_BOX;
box = &Boxes[boxNumber]; box = &Boxes[boxNumber];
//LOT->target.x = (((((box->bottom - box->top) - 1) * GetRandomControl()) / 32) + (box->top * 1024)) + 512;
//LOT->target.z = (((((box->right - box->left) - 1) * GetRandomControl()) / 32) + (box->left * 1024)) + 512;
LOT->target.x = ((box->top << WALL_SHIFT) + GetRandomControl() * ((box->bottom - box->top) - 1) >> 5) + WALL_SIZE / 2; LOT->target.x = ((box->top << WALL_SHIFT) + GetRandomControl() * ((box->bottom - box->top) - 1) >> 5) + WALL_SIZE / 2;
LOT->target.z = ((box->left << WALL_SHIFT) + GetRandomControl() * ((box->right - box->left) - 1) >> 5) + WALL_SIZE / 2; LOT->target.z = ((box->left << WALL_SHIFT) + GetRandomControl() * ((box->right - box->left) - 1) >> 5) + WALL_SIZE / 2;
LOT->requiredBox = boxNumber; LOT->requiredBox = boxNumber;
@ -1048,14 +1046,14 @@ int SearchLOT(LOT_INFO* LOT, int depth)
searchZone = zone[LOT->head]; searchZone = zone[LOT->head];
if (depth <= 0) if (depth <= 0)
return 1; return true;
for (int i = 0; i < depth; i++) for (int i = 0; i < depth; i++)
{ {
if (LOT->head == NO_BOX) if (LOT->head == NO_BOX)
{ {
LOT->tail = NO_BOX; LOT->tail = NO_BOX;
return FALSE; return false;
} }
node = &LOT->node[LOT->head]; node = &LOT->node[LOT->head];
@ -1068,7 +1066,7 @@ int SearchLOT(LOT_INFO* LOT, int depth)
boxNumber = Overlaps[index++]; boxNumber = Overlaps[index++];
if (boxNumber & BOX_END_BIT) if (boxNumber & BOX_END_BIT)
{ {
done = TRUE; done = true;
boxNumber &= BOX_NUMBER; boxNumber &= BOX_NUMBER;
} }
@ -1117,21 +1115,22 @@ int SearchLOT(LOT_INFO* LOT, int depth)
node->nextExpansion = NO_BOX; node->nextExpansion = NO_BOX;
} }
return TRUE; return true;
} }
int CreatureActive(short itemNumber) int CreatureActive(short itemNumber)
{ {
ITEM_INFO* item = &Items[itemNumber]; ITEM_INFO* item = &Items[itemNumber];
if (!(item->flags & IFLAG_KILLED) && item->status & ITEM_INVISIBLE) if (!(item->flags & IFLAG_KILLED)
&& item->status & ITEM_INVISIBLE)
{ {
if (!EnableBaddieAI(itemNumber, FALSE)) if (!EnableBaddieAI(itemNumber, false))
return FALSE; return false;
item->status = ITEM_ACTIVE; item->status = ITEM_ACTIVE;
} }
return TRUE; return true;
} }
void InitialiseCreature(short itemNumber) void InitialiseCreature(short itemNumber)
@ -1142,7 +1141,7 @@ void InitialiseCreature(short itemNumber)
int StalkBox(ITEM_INFO* item, ITEM_INFO* enemy, short boxNumber) int StalkBox(ITEM_INFO* item, ITEM_INFO* enemy, short boxNumber)
{ {
if (enemy == NULL) if (enemy == NULL)
return FALSE; return false;
BOX_INFO* box; BOX_INFO* box;
int x, z, xrange, zrange; int x, z, xrange, zrange;
@ -1156,7 +1155,7 @@ int StalkBox(ITEM_INFO* item, ITEM_INFO* enemy, short boxNumber)
z = ((box->left + box->right) << (WALL_SHIFT - 1)) - enemy->pos.zPos; z = ((box->left + box->right) << (WALL_SHIFT - 1)) - enemy->pos.zPos;
if (x > xrange || x < -xrange || z > zrange || z < -zrange) if (x > xrange || x < -xrange || z > zrange || z < -zrange)
return FALSE; return false;
enemyQuad = (enemy->pos.yRot >> W2V_SHIFT) + 2; enemyQuad = (enemy->pos.yRot >> W2V_SHIFT) + 2;
@ -1167,7 +1166,7 @@ int StalkBox(ITEM_INFO* item, ITEM_INFO* enemy, short boxNumber)
boxQuad = (x > 0) ? 3 : 0; boxQuad = (x > 0) ? 3 : 0;
if (enemyQuad == boxQuad) if (enemyQuad == boxQuad)
return FALSE; return false;
baddieQuad = 0; baddieQuad = 0;
if (item->pos.zPos > enemy->pos.zPos) if (item->pos.zPos > enemy->pos.zPos)
@ -1176,9 +1175,9 @@ int StalkBox(ITEM_INFO* item, ITEM_INFO* enemy, short boxNumber)
baddieQuad = (item->pos.xPos > enemy->pos.xPos) ? 3 : 0; baddieQuad = (item->pos.xPos > enemy->pos.xPos) ? 3 : 0;
if (enemyQuad == baddieQuad && abs(enemyQuad - boxQuad) == 2) if (enemyQuad == baddieQuad && abs(enemyQuad - boxQuad) == 2)
return FALSE; return false;
return TRUE; return true;
} }
int CreatureVault(short itemNum, short angle, int vault, int shift) int CreatureVault(short itemNum, short angle, int vault, int shift)
@ -1458,20 +1457,20 @@ void CreatureAIInfo(ITEM_INFO* item, AI_INFO* info)
if (item->data == NULL) if (item->data == NULL)
return; return;
CREATURE_INFO* creature; CREATURE_INFO * creature;
ITEM_INFO* enemy; ITEM_INFO * enemy;
ObjectInfo* obj; OBJECT_INFO * obj;
ROOM_INFO* r; ROOM_INFO * r;
short* zone, angle; short* zone, angle;
int x, y, z; int x, y, z;
creature = (CREATURE_INFO*)item->data; creature = (CREATURE_INFO*)item->data;
obj = &Objects[item->objectNumber]; obj = &Objects[item->objectNumber];
enemy = creature->enemy; enemy = creature->enemy;
if (!enemy) if (!enemy)
{ {
enemy = LaraItem; enemy = LaraItem;
creature->enemy = LaraItem; creature->enemy = LaraItem;
} }
@ -1480,11 +1479,11 @@ void CreatureAIInfo(ITEM_INFO* item, AI_INFO* info)
r = &Rooms[item->roomNumber]; r = &Rooms[item->roomNumber];
item->boxNumber = XZ_GET_SECTOR(r, item->pos.xPos - r->x, item->pos.zPos - r->z).box & BOX_NUMBER; item->boxNumber = XZ_GET_SECTOR(r, item->pos.xPos - r->x, item->pos.zPos - r->z).box & BOX_NUMBER;
info->zoneNumber = zone[item->boxNumber]; info->zoneNumber = zone[item->boxNumber];
r = &Rooms[enemy->roomNumber]; r = &Rooms[enemy->roomNumber];
enemy->boxNumber = XZ_GET_SECTOR(r, enemy->pos.xPos - r->x, enemy->pos.zPos - r->z).box & BOX_NUMBER; enemy->boxNumber = XZ_GET_SECTOR(r, enemy->pos.xPos - r->x, enemy->pos.zPos - r->z).box & BOX_NUMBER;
info->enemyZone = zone[enemy->boxNumber]; info->enemyZone = zone[enemy->boxNumber];
if (!obj->nonLot) if (!obj->nonLot)
{ {
if (Boxes[enemy->boxNumber].overlapIndex & creature->LOT.blockMask) if (Boxes[enemy->boxNumber].overlapIndex & creature->LOT.blockMask)
@ -1520,11 +1519,11 @@ void CreatureAIInfo(ITEM_INFO* item, AI_INFO* info)
} }
info->angle = angle - item->pos.yRot; info->angle = angle - item->pos.yRot;
info->enemyFacing = ANGLE(180) + angle - enemy->pos.yRot; info->enemyFacing = -ANGLE(180) + angle - enemy->pos.yRot;
x = abs(x); x = abs(x);
z = abs(z); z = abs(z);
if (enemy == LaraItem) if (enemy == LaraItem)
{ {
short laraState = LaraItem->currentAnimState; short laraState = LaraItem->currentAnimState;
@ -1545,7 +1544,7 @@ void CreatureAIInfo(ITEM_INFO* item, AI_INFO* info)
info->xAngle = phd_atan(z + (x >> 1), y); info->xAngle = phd_atan(z + (x >> 1), y);
info->ahead = (info->angle > -FRONT_ARC && info->angle < FRONT_ARC); info->ahead = (info->angle > -FRONT_ARC && info->angle < FRONT_ARC);
info->bite = (info->ahead && enemy->hitPoints > 0 && abs(enemy->pos.yPos - item->pos.yPos) <= (STEP_SIZE*2)); info->bite = (info->ahead && enemy->hitPoints > 0 && abs(enemy->pos.yPos - item->pos.yPos) <= (STEP_SIZE * 2));
} }
void CreatureMood(ITEM_INFO* item, AI_INFO* info, int violent) void CreatureMood(ITEM_INFO* item, AI_INFO* info, int violent)
@ -1634,6 +1633,8 @@ void CreatureMood(ITEM_INFO* item, AI_INFO* info, int violent)
if (LOT->targetBox == NO_BOX) if (LOT->targetBox == NO_BOX)
TargetBox(LOT, item->boxNumber); TargetBox(LOT, item->boxNumber);
CalculateTarget(&creature->target, item, &creature->LOT);
creature->jumpAhead = false; creature->jumpAhead = false;
creature->monkeyAhead = false; creature->monkeyAhead = false;
@ -1656,8 +1657,6 @@ void CreatureMood(ITEM_INFO* item, AI_INFO* info, int violent)
creature->monkeyAhead = true; creature->monkeyAhead = true;
} }
} }
/*Unk_00EEFB6C =*/ CalculateTarget(&creature->target, item, &creature->LOT);
} }
void GetCreatureMood(ITEM_INFO* item, AI_INFO* info, int isViolent) void GetCreatureMood(ITEM_INFO* item, AI_INFO* info, int isViolent)
@ -1677,7 +1676,8 @@ void GetCreatureMood(ITEM_INFO* item, AI_INFO* info, int isViolent)
if (creature->LOT.node[item->boxNumber].searchNumber == (creature->LOT.searchNumber | BLOCKED_SEARCH)) if (creature->LOT.node[item->boxNumber].searchNumber == (creature->LOT.searchNumber | BLOCKED_SEARCH))
creature->LOT.requiredBox = NO_BOX; creature->LOT.requiredBox = NO_BOX;
if (creature->mood != ATTACK_MOOD && creature->LOT.requiredBox != NO_BOX) if (creature->mood != ATTACK_MOOD
&& creature->LOT.requiredBox != NO_BOX)
{ {
if (!ValidBox(item, info->zoneNumber, creature->LOT.targetBox)) if (!ValidBox(item, info->zoneNumber, creature->LOT.targetBox))
{ {
@ -1720,13 +1720,14 @@ void GetCreatureMood(ITEM_INFO* item, AI_INFO* info, int isViolent)
break; break;
} }
} }
else if (!isViolent) else
{ {
switch (creature->mood) switch (creature->mood)
{ {
case BORED_MOOD: case BORED_MOOD:
case STALK_MOOD: case STALK_MOOD:
if (creature->alerted && info->zoneNumber != info->enemyZone) if (creature->alerted
&& info->zoneNumber != info->enemyZone)
{ {
if (info->distance > 3072) if (info->distance > 3072)
creature->mood = STALK_MOOD; creature->mood = STALK_MOOD;
@ -1735,7 +1736,9 @@ void GetCreatureMood(ITEM_INFO* item, AI_INFO* info, int isViolent)
} }
else if (info->zoneNumber == info->enemyZone) else if (info->zoneNumber == info->enemyZone)
{ {
if (info->distance < ATTACK_RANGE || (creature->mood == STALK_MOOD && LOT->requiredBox == NO_BOX)) if (info->distance < ATTACK_RANGE
|| (creature->mood == STALK_MOOD
&& LOT->requiredBox == NO_BOX))
creature->mood = ATTACK_MOOD; creature->mood = ATTACK_MOOD;
else else
creature->mood = STALK_MOOD; creature->mood = STALK_MOOD;
@ -1743,14 +1746,17 @@ void GetCreatureMood(ITEM_INFO* item, AI_INFO* info, int isViolent)
break; break;
case ATTACK_MOOD: case ATTACK_MOOD:
if (item->hitStatus && (GetRandomControl() < ESCAPE_CHANCE || info->zoneNumber != info->enemyZone)) if (item->hitStatus
&& (GetRandomControl() < ESCAPE_CHANCE
|| info->zoneNumber != info->enemyZone))
creature->mood = STALK_MOOD; creature->mood = STALK_MOOD;
else if (info->zoneNumber != info->enemyZone && info->distance > (WALL_SIZE*6)) else if (info->zoneNumber != info->enemyZone && info->distance > (WALL_SIZE*6))
creature->mood = BORED_MOOD; creature->mood = BORED_MOOD;
break; break;
case ESCAPE_MOOD: case ESCAPE_MOOD:
if (info->zoneNumber == info->enemyZone && GetRandomControl() < RECOVER_CHANCE) if (info->zoneNumber == info->enemyZone
&& GetRandomControl() < RECOVER_CHANCE)
creature->mood = STALK_MOOD; creature->mood = STALK_MOOD;
break; break;
} }

View file

@ -70,7 +70,7 @@ void LookAt(CAMERA_INFO* cam, short roll)
Vector3 target = Vector3(cam->target.x, cam->target.y, cam->target.z); Vector3 target = Vector3(cam->target.x, cam->target.y, cam->target.z);
Vector3 up = Vector3(0.0f, -1.0f, 0.0f); Vector3 up = Vector3(0.0f, -1.0f, 0.0f);
float fov = TO_RAD(CurrentFOV / 1.333333f); float fov = TO_RAD(CurrentFOV / 1.333333f);
float r = TO_RAD(roll); float r = 0; TO_RAD(roll);
g_Renderer.UpdateCameraMatrices(cam, r, fov); g_Renderer.UpdateCameraMatrices(cam, r, fov);
} }

View file

@ -450,14 +450,14 @@ int FindGridShift(int x, int z)
int TestBoundsCollideStatic(short* bounds, PHD_3DPOS* pos, int radius) int TestBoundsCollideStatic(short* bounds, PHD_3DPOS* pos, int radius)
{ {
if (!(bounds[5] | bounds[4] | bounds[0] | bounds[1] | bounds[2] | bounds[3])) if (!(bounds[5] | bounds[4] | bounds[0] | bounds[1] | bounds[2] | bounds[3]))
return FALSE; return false;
short* frame = GetBestFrame(LaraItem); short* frame = GetBestFrame(LaraItem);
if (pos->yPos + bounds[3] <= LaraItem->pos.yPos + frame[2]) if (pos->yPos + bounds[3] <= LaraItem->pos.yPos + frame[2])
return FALSE; return false;
if (pos->yPos + bounds[2] >= LaraItem->pos.yPos + frame[3]) if (pos->yPos + bounds[2] >= LaraItem->pos.yPos + frame[3])
return FALSE; return false;
int c, s; int c, s;
int x, z, dx, dz; int x, z, dx, dz;
@ -474,11 +474,11 @@ int TestBoundsCollideStatic(short* bounds, PHD_3DPOS* pos, int radius)
&& dz <= radius + bounds[5] && dz <= radius + bounds[5]
&& dz >= bounds[4] - radius) && dz >= bounds[4] - radius)
{ {
return TRUE; return true;
} }
else else
{ {
return FALSE; return false;
} }
} }
@ -506,7 +506,7 @@ int ItemPushLaraStatic(ITEM_INFO* item, short* bounds, PHD_3DPOS* pos, COLL_INFO
|| rx >= maxX || rx >= maxX
|| rz <= minZ || rz <= minZ
|| rz >= maxZ) || rz >= maxZ)
return FALSE; return false;
left = rx - minX; left = rx - minX;
top = maxZ - rz; top = maxZ - rz;
@ -554,7 +554,7 @@ int ItemPushLaraStatic(ITEM_INFO* item, short* bounds, PHD_3DPOS* pos, COLL_INFO
Lara.gunStatus = LG_NO_ARMS; Lara.gunStatus = LG_NO_ARMS;
} }
return TRUE; return true;
} }
int ItemPushLara(ITEM_INFO* item, ITEM_INFO* l, COLL_INFO* coll, int spazon, char bigpush) int ItemPushLara(ITEM_INFO* item, ITEM_INFO* l, COLL_INFO* coll, int spazon, char bigpush)
@ -596,7 +596,7 @@ int ItemPushLara(ITEM_INFO* item, ITEM_INFO* l, COLL_INFO* coll, int spazon, cha
|| rx >= maxX || rx >= maxX
|| rz <= minZ || rz <= minZ
|| rz >= maxZ) || rz >= maxZ)
return FALSE; return false;
left = rx - minX; left = rx - minX;
top = maxZ - rz; top = maxZ - rz;
@ -662,7 +662,7 @@ int ItemPushLara(ITEM_INFO* item, ITEM_INFO* l, COLL_INFO* coll, int spazon, cha
Lara.gunStatus = LG_NO_ARMS; Lara.gunStatus = LG_NO_ARMS;
} }
return TRUE; return true;
} }
void AIPickupCollision(short itemNumber, ITEM_INFO* l, COLL_INFO* c) void AIPickupCollision(short itemNumber, ITEM_INFO* l, COLL_INFO* c)
@ -739,17 +739,17 @@ int TestLaraPosition(short* bounds, ITEM_INFO* item, ITEM_INFO* l)
zRotRel = l->pos.zRot - item->pos.zRot; zRotRel = l->pos.zRot - item->pos.zRot;
if (xRotRel < bounds[6]) if (xRotRel < bounds[6])
return FALSE; return false;
if (xRotRel > bounds[7]) if (xRotRel > bounds[7])
return FALSE; return false;
if (yRotRel < bounds[8]) if (yRotRel < bounds[8])
return FALSE; return false;
if (yRotRel > bounds[9]) if (yRotRel > bounds[9])
return FALSE; return false;
if (zRotRel < bounds[10]) if (zRotRel < bounds[10])
return FALSE; return false;
if (zRotRel > bounds[11]) if (zRotRel > bounds[11])
return FALSE; return false;
Vector3 pos = Vector3(l->pos.xPos - item->pos.xPos, l->pos.yPos - item->pos.yPos, l->pos.zPos - item->pos.zPos); Vector3 pos = Vector3(l->pos.xPos - item->pos.xPos, l->pos.yPos - item->pos.yPos, l->pos.zPos - item->pos.zPos);
@ -766,9 +766,9 @@ int TestLaraPosition(short* bounds, ITEM_INFO* item, ITEM_INFO* l)
rz = pos.z; rz = pos.z;
if (rx < bounds[0] || rx > bounds[1] || ry < bounds[2] || ry > bounds[3] || rz < bounds[4] || rz > bounds[5]) if (rx < bounds[0] || rx > bounds[1] || ry < bounds[2] || ry > bounds[3] || rz < bounds[4] || rz > bounds[5])
return FALSE; return false;
return TRUE; return true;
} }
int Move3DPosTo3DPos(PHD_3DPOS* src, PHD_3DPOS* dest, int velocity, short angAdd) int Move3DPosTo3DPos(PHD_3DPOS* src, PHD_3DPOS* dest, int velocity, short angAdd)
@ -923,7 +923,7 @@ int MoveLaraPosition(PHD_VECTOR* vec, ITEM_INFO* item, ITEM_INFO* l)
if (abs(height - l->pos.yPos) <= CLICK(2)) if (abs(height - l->pos.yPos) <= CLICK(2))
{ {
if (sqrt(SQUARE(dest.xPos - l->pos.xPos) + SQUARE(dest.yPos - l->pos.yPos) + SQUARE(dest.zPos - l->pos.zPos)) < (STEP_SIZE/2)) if (sqrt(SQUARE(dest.xPos - l->pos.xPos) + SQUARE(dest.yPos - l->pos.yPos) + SQUARE(dest.zPos - l->pos.zPos)) < (STEP_SIZE/2))
return TRUE; return true;
return Move3DPosTo3DPos(&l->pos, &dest, LARA_VELOCITY, ANGLE(2)); return Move3DPosTo3DPos(&l->pos, &dest, LARA_VELOCITY, ANGLE(2));
} }
@ -934,7 +934,7 @@ int MoveLaraPosition(PHD_VECTOR* vec, ITEM_INFO* item, ITEM_INFO* l)
Lara.gunStatus = LG_NO_ARMS; Lara.gunStatus = LG_NO_ARMS;
} }
return FALSE; return false;
} }
int TestBoundsCollide(ITEM_INFO* item, ITEM_INFO* l, int radius) int TestBoundsCollide(ITEM_INFO* item, ITEM_INFO* l, int radius)
@ -964,12 +964,12 @@ int TestBoundsCollide(ITEM_INFO* item, ITEM_INFO* l, int radius)
&& dz >= bounds[4] - radius && dz >= bounds[4] - radius
&& dz <= radius + bounds[5]) && dz <= radius + bounds[5])
{ {
return TRUE; return true;
} }
} }
} }
return FALSE; return false;
} }
void CreatureCollision(short itemNum, ITEM_INFO* l, COLL_INFO* coll) void CreatureCollision(short itemNum, ITEM_INFO* l, COLL_INFO* coll)
@ -1372,7 +1372,7 @@ void GetCollisionInfo(COLL_INFO* coll, int xPos, int yPos, int zPos, int roomNum
void LaraBaddieCollision(ITEM_INFO* l, COLL_INFO* coll) void LaraBaddieCollision(ITEM_INFO* l, COLL_INFO* coll)
{ {
ITEM_INFO* item; ITEM_INFO* item;
ObjectInfo* obj; OBJECT_INFO* obj;
l->hitStatus = false; l->hitStatus = false;
Lara.hitDirection = -1; Lara.hitDirection = -1;

View file

@ -309,7 +309,7 @@ GAME_STATUS ControlPhase(int numFrames, int demoMode)
LaserSight = true; LaserSight = true;
/*if (!(gfLevelFlags & GF_LVOP_TRAIN)) /*if (!(gfLevelFlags & GF_LVOP_TRAIN))
InfraRed = TRUE; InfraRed = true;
else* else*
InfraRed = false;*/ InfraRed = false;*/
Infrared = true; Infrared = true;
@ -322,7 +322,7 @@ GAME_STATUS ControlPhase(int numFrames, int demoMode)
if (LaserSight) if (LaserSight)
{ {
/*if (!(gfLevelFlags & GF_LVOP_TRAIN)) /*if (!(gfLevelFlags & GF_LVOP_TRAIN))
InfraRed = TRUE; InfraRed = true;
else else
InfraRed = false;*/ InfraRed = false;*/
Infrared = true; Infrared = true;
@ -330,7 +330,7 @@ GAME_STATUS ControlPhase(int numFrames, int demoMode)
else else
{ {
/*if ((gfLevelFlags & GF_LVOP_TRAIN) && (inputBusy & IN_ACTION)) /*if ((gfLevelFlags & GF_LVOP_TRAIN) && (inputBusy & IN_ACTION))
InfraRed = TRUE; InfraRed = true;
else else
InfraRed = false;*/ InfraRed = false;*/
Infrared = false; Infrared = false;
@ -446,6 +446,8 @@ GAME_STATUS ControlPhase(int numFrames, int demoMode)
InItemControlLoop = false; InItemControlLoop = false;
KillMoveItems(); KillMoveItems();
g_Renderer.UpdateLaraAnimations(true);
// Update Lara's ponytails // Update Lara's ponytails
HairControl(0, 0, 0); HairControl(0, 0, 0);
if (level->LaraType == LARA_YOUNG) if (level->LaraType == LARA_YOUNG)
@ -554,7 +556,7 @@ unsigned CALLBACK GameMain(void *)
PostMessage(WindowsHandle, WM_CLOSE, NULL, NULL); PostMessage(WindowsHandle, WM_CLOSE, NULL, NULL);
EndThread(); EndThread();
return TRUE; return true;
} }
GAME_STATUS DoTitle(int index) GAME_STATUS DoTitle(int index)
@ -1627,7 +1629,7 @@ int GetFloorHeight(FLOOR_INFO *floor, int x, int y, int z)
int xOff, yOff, trigger; int xOff, yOff, trigger;
ITEM_INFO *item; ITEM_INFO *item;
ObjectInfo *obj; OBJECT_INFO *obj;
int tilts, t0, t1, t2, t3, t4, dx, dz, h1, h2; int tilts, t0, t1, t2, t3, t4, dx, dz, h1, h2;
do do
@ -2642,7 +2644,7 @@ int DoRayBox(GAME_VECTOR *start, GAME_VECTOR *end, short *box, PHD_3DPOS *itemOr
{ {
// For items instead we need to test spheres // For items instead we need to test spheres
ITEM_INFO *item = &Items[closesItemNumber]; ITEM_INFO *item = &Items[closesItemNumber];
ObjectInfo *obj = &Objects[item->objectNumber]; OBJECT_INFO *obj = &Objects[item->objectNumber];
// Get the ransformed sphere of meshes // Get the ransformed sphere of meshes
GetSpheres(item, CreatureSpheres, SPHERES_SPACE_WORLD, Matrix::Identity); GetSpheres(item, CreatureSpheres, SPHERES_SPACE_WORLD, Matrix::Identity);

View file

@ -78,7 +78,7 @@ void SequenceDoorControl(short itemNumber)
OpenThatDoor(&door->d2, door); OpenThatDoor(&door->d2, door);
OpenThatDoor(&door->d1flip, door); OpenThatDoor(&door->d1flip, door);
OpenThatDoor(&door->d2flip, door); OpenThatDoor(&door->d2flip, door);
door->opened = TRUE; door->opened = true;
item->flags |= 0x3E; item->flags |= 0x3E;
} }
} }
@ -90,7 +90,7 @@ void SequenceDoorControl(short itemNumber)
ShutThatDoor(&door->d2, door); ShutThatDoor(&door->d2, door);
ShutThatDoor(&door->d1flip, door); ShutThatDoor(&door->d1flip, door);
ShutThatDoor(&door->d2flip, door); ShutThatDoor(&door->d2flip, door);
door->opened = FALSE; door->opened = false;
item->flags &= 0xC1; item->flags &= 0xC1;
} }
} }
@ -320,7 +320,7 @@ void PushPullKickDoorControl(short itemNumber)
OpenThatDoor(&door->d2, door); OpenThatDoor(&door->d2, door);
OpenThatDoor(&door->d1flip, door); OpenThatDoor(&door->d1flip, door);
OpenThatDoor(&door->d2flip, door); OpenThatDoor(&door->d2flip, door);
door->opened = TRUE; door->opened = true;
} }
AnimateItem(item); AnimateItem(item);
@ -440,7 +440,7 @@ void DoorControl(short itemNumber)
OpenThatDoor(&door->d2, door); OpenThatDoor(&door->d2, door);
OpenThatDoor(&door->d1flip, door); OpenThatDoor(&door->d1flip, door);
OpenThatDoor(&door->d2flip, door); OpenThatDoor(&door->d2flip, door);
door->opened = TRUE; door->opened = true;
} }
} }
else else
@ -456,7 +456,7 @@ void DoorControl(short itemNumber)
ShutThatDoor(&door->d2, door); ShutThatDoor(&door->d2, door);
ShutThatDoor(&door->d1flip, door); ShutThatDoor(&door->d1flip, door);
ShutThatDoor(&door->d2flip, door); ShutThatDoor(&door->d2flip, door);
door->opened = FALSE; door->opened = false;
} }
} }
} }
@ -479,7 +479,7 @@ void DoorControl(short itemNumber)
OpenThatDoor(&door->d2, door); OpenThatDoor(&door->d2, door);
OpenThatDoor(&door->d1flip, door); OpenThatDoor(&door->d1flip, door);
OpenThatDoor(&door->d2flip, door); OpenThatDoor(&door->d2flip, door);
door->opened = TRUE; door->opened = true;
} }
/*if (item->frameNumber == Anims[item->animNumber].frameEnd) /*if (item->frameNumber == Anims[item->animNumber].frameEnd)
{ {
@ -536,7 +536,7 @@ void DoorControl(short itemNumber)
ShutThatDoor(&door->d2, door); ShutThatDoor(&door->d2, door);
ShutThatDoor(&door->d1flip, door); ShutThatDoor(&door->d1flip, door);
ShutThatDoor(&door->d2flip, door); ShutThatDoor(&door->d2flip, door);
door->opened = FALSE; door->opened = false;
} }
} }
else else

View file

@ -160,7 +160,7 @@ int Sync()
void DrawAnimatingItem(ITEM_INFO* item) void DrawAnimatingItem(ITEM_INFO* item)
{ {
// TODO: to refactor // TODO: to refactor
// Empty stub because actually we disable items drawing when drawRoutine pointer is NULL in ObjectInfo // Empty stub because actually we disable items drawing when drawRoutine pointer is NULL in OBJECT_INFO
} }
void GetLaraJointPosition(PHD_VECTOR* pos, int LM_enum) void GetLaraJointPosition(PHD_VECTOR* pos, int LM_enum)

View file

@ -82,7 +82,7 @@ void DetatchSpark(int num, SpriteEnumFlag type)// (F) (D)
case SP_FX: case SP_FX:
if (sptr->flags & SP_USEFXOBJPOS) if (sptr->flags & SP_USEFXOBJPOS)
{ {
sptr->on = FALSE; sptr->on = false;
} }
else else
{ {
@ -96,7 +96,7 @@ void DetatchSpark(int num, SpriteEnumFlag type)// (F) (D)
case SP_ITEM: case SP_ITEM:
if (sptr->flags & SP_USEFXOBJPOS) if (sptr->flags & SP_USEFXOBJPOS)
{ {
sptr->on = FALSE; sptr->on = false;
} }
else else
{ {

View file

@ -11,7 +11,7 @@
#include "level.h" #include "level.h"
using T5M::Renderer::g_Renderer; using T5M::Renderer::g_Renderer;
int FirstHair[HAIR_MAX]; int FirstHair[HAIR_MAX];
HAIR_STRUCT Hairs[HAIR_MAX][HAIR_SEGMENTS]; HAIR_STRUCT Hairs[HAIR_MAX][HAIR_SEGMENTS + 1];
int WindAngle; int WindAngle;
int DWindAngle; int DWindAngle;
int Wind; int Wind;
@ -29,7 +29,7 @@ void InitialiseHair()
Hairs[h][0].pos.yRot = 0; Hairs[h][0].pos.yRot = 0;
Hairs[h][0].pos.xRot = -0x4000; Hairs[h][0].pos.xRot = -0x4000;
for (int i = 1; i < HAIR_SEGMENTS; i++, bone += 4) for (int i = 1; i < HAIR_SEGMENTS + 1; i++, bone += 4)
{ {
Hairs[h][i].pos.xPos = *(bone + 1); Hairs[h][i].pos.xPos = *(bone + 1);
Hairs[h][i].pos.yPos = *(bone + 2); Hairs[h][i].pos.yPos = *(bone + 2);
@ -46,7 +46,7 @@ void InitialiseHair()
void HairControl(int cutscene, int ponytail, short* framePtr) void HairControl(int cutscene, int ponytail, short* framePtr)
{ {
SPHERE sphere[HAIR_SPHERE]; SPHERE sphere[HAIR_SPHERE];
ObjectInfo* object = &Objects[ID_LARA]; OBJECT_INFO* object = &Objects[ID_LARA];
short* frame; short* frame;
int spaz; int spaz;
bool youngLara = g_GameFlow->GetLevel(CurrentLevel)->LaraType == LARA_YOUNG; bool youngLara = g_GameFlow->GetLevel(CurrentLevel)->LaraType == LARA_YOUNG;
@ -179,7 +179,7 @@ void HairControl(int cutscene, int ponytail, short* framePtr)
Hairs[ponytail][0].pos.yPos = pos.y; Hairs[ponytail][0].pos.yPos = pos.y;
Hairs[ponytail][0].pos.zPos = pos.z; Hairs[ponytail][0].pos.zPos = pos.z;
for (int i = 0; i < HAIR_SEGMENTS - 1; i++, bone += 4) for (int i = 0; i < HAIR_SEGMENTS; i++, bone += 4)
{ {
world = Matrix::CreateTranslation(Hairs[ponytail][i].pos.xPos, Hairs[ponytail][i].pos.yPos, Hairs[ponytail][i].pos.zPos); world = Matrix::CreateTranslation(Hairs[ponytail][i].pos.xPos, Hairs[ponytail][i].pos.yPos, Hairs[ponytail][i].pos.zPos);
world = Matrix::CreateFromYawPitchRoll(TO_RAD(Hairs[ponytail][i].pos.yRot), TO_RAD(Hairs[ponytail][i].pos.xRot), 0) * world; world = Matrix::CreateFromYawPitchRoll(TO_RAD(Hairs[ponytail][i].pos.yRot), TO_RAD(Hairs[ponytail][i].pos.xRot), 0) * world;
@ -235,7 +235,7 @@ void HairControl(int cutscene, int ponytail, short* framePtr)
SmokeWindX = (((rcossin_tbl[WindAngle]) * Wind) >> 12); SmokeWindX = (((rcossin_tbl[WindAngle]) * Wind) >> 12);
SmokeWindZ = (((rcossin_tbl[WindAngle + 1]) * Wind) >> 12); SmokeWindZ = (((rcossin_tbl[WindAngle + 1]) * Wind) >> 12);
for (int i = 1; i < HAIR_SEGMENTS; i++, bone += 4) for (int i = 1; i < HAIR_SEGMENTS + 1; i++, bone += 4)
{ {
Hairs[ponytail][0].hvel.x = Hairs[ponytail][i].pos.xPos; Hairs[ponytail][0].hvel.x = Hairs[ponytail][i].pos.xPos;
Hairs[ponytail][0].hvel.y = Hairs[ponytail][i].pos.yPos; Hairs[ponytail][0].hvel.y = Hairs[ponytail][i].pos.yPos;
@ -316,7 +316,7 @@ void HairControl(int cutscene, int ponytail, short* framePtr)
world = Matrix::CreateTranslation(Hairs[ponytail][i - 1].pos.xPos, Hairs[ponytail][i - 1].pos.yPos, Hairs[ponytail][i - 1].pos.zPos); world = Matrix::CreateTranslation(Hairs[ponytail][i - 1].pos.xPos, Hairs[ponytail][i - 1].pos.yPos, Hairs[ponytail][i - 1].pos.zPos);
world = Matrix::CreateFromYawPitchRoll(TO_RAD(Hairs[ponytail][i - 1].pos.yRot), TO_RAD(Hairs[ponytail][i - 1].pos.xRot), 0) * world; world = Matrix::CreateFromYawPitchRoll(TO_RAD(Hairs[ponytail][i - 1].pos.yRot), TO_RAD(Hairs[ponytail][i - 1].pos.xRot), 0) * world;
if (i == HAIR_SEGMENTS - 1) if (i == HAIR_SEGMENTS)
world = Matrix::CreateTranslation(*(bone - 3), *(bone - 2), *(bone - 1)) * world; world = Matrix::CreateTranslation(*(bone - 3), *(bone - 2), *(bone - 1)) * world;
else else
world = Matrix::CreateTranslation(*(bone + 1), *(bone + 2), *(bone + 3)) * world; world = Matrix::CreateTranslation(*(bone + 1), *(bone + 2), *(bone + 3)) * world;

View file

@ -3,7 +3,7 @@
#include "phd_global.h" #include "phd_global.h"
constexpr auto HAIR_MAX = 2; // HAIR_NORMAL = 0, HAIR_YOUNG = 1 constexpr auto HAIR_MAX = 2; // HAIR_NORMAL = 0, HAIR_YOUNG = 1
constexpr auto HAIR_SEGMENTS = 7; // classic = 7, young = 14 constexpr auto HAIR_SEGMENTS = 6; // classic = 7, young = 14
constexpr auto HAIR_SPHERE = 5; // current hair max collision constexpr auto HAIR_SPHERE = 5; // current hair max collision
struct HAIR_STRUCT struct HAIR_STRUCT
@ -12,7 +12,7 @@ struct HAIR_STRUCT
PHD_VECTOR hvel; PHD_VECTOR hvel;
PHD_VECTOR unknown; PHD_VECTOR unknown;
}; };
extern HAIR_STRUCT Hairs[HAIR_MAX][HAIR_SEGMENTS]; extern HAIR_STRUCT Hairs[HAIR_MAX][HAIR_SEGMENTS + 1];
void InitialiseHair(); void InitialiseHair();
void HairControl(int cutscene, int ponytail, short* framePtr); void HairControl(int cutscene, int ponytail, short* framePtr);

View file

@ -483,7 +483,7 @@ int UseSpecialItem(ITEM_INFO* item)
short selectedObject = g_Inventory.GetSelectedObject(); short selectedObject = g_Inventory.GetSelectedObject();
if (item->animNumber != ANIMATION_LARA_STAY_IDLE || Lara.gunStatus || selectedObject == NO_ITEM) if (item->animNumber != ANIMATION_LARA_STAY_IDLE || Lara.gunStatus || selectedObject == NO_ITEM)
return FALSE; return false;
if (selectedObject >= ID_WATERSKIN1_EMPTY && selectedObject <= ID_WATERSKIN2_5) if (selectedObject >= ID_WATERSKIN1_EMPTY && selectedObject <= ID_WATERSKIN2_5)
{ {
@ -521,7 +521,7 @@ int UseSpecialItem(ITEM_INFO* item)
} }
else else
{ {
return FALSE; return false;
} }
item->frameNumber = Anims[item->animNumber].frameBase; item->frameNumber = Anims[item->animNumber].frameBase;
@ -531,7 +531,7 @@ int UseSpecialItem(ITEM_INFO* item)
Lara.gunStatus = LG_HANDS_BUSY; Lara.gunStatus = LG_HANDS_BUSY;
g_Inventory.SetSelectedObject(NO_ITEM); g_Inventory.SetSelectedObject(NO_ITEM);
return TRUE; return true;
} }
void lara_as_stop(ITEM_INFO* item, COLL_INFO* coll) void lara_as_stop(ITEM_INFO* item, COLL_INFO* coll)

View file

@ -1425,7 +1425,7 @@ void DoGrenadeDamageOnBaddie(ITEM_INFO* dest, ITEM_INFO* src)
{ {
dest->hitStatus = true; dest->hitStatus = true;
ObjectInfo* obj = &Objects[dest->objectNumber]; OBJECT_INFO* obj = &Objects[dest->objectNumber];
if (!obj->undead) if (!obj->undead)
{ {
HitTarget(dest, 0, 30, 1); HitTarget(dest, 0, 30, 1);

View file

@ -692,7 +692,7 @@ int WeaponObjectMesh(int weaponType)
void HitTarget(ITEM_INFO* item, GAME_VECTOR* hitPos, int damage, int flag) void HitTarget(ITEM_INFO* item, GAME_VECTOR* hitPos, int damage, int flag)
{ {
CREATURE_INFO* creature = (CREATURE_INFO*)item->data; CREATURE_INFO* creature = (CREATURE_INFO*)item->data;
ObjectInfo* obj = &Objects[item->objectNumber]; OBJECT_INFO* obj = &Objects[item->objectNumber];
item->hitStatus = true; item->hitStatus = true;
if (creature != nullptr && item != LaraItem) if (creature != nullptr && item != LaraItem)

View file

@ -106,7 +106,7 @@ void DisableBaddieAI(short itemNumber)
void InitialiseSlot(short itemNum, short slot) void InitialiseSlot(short itemNum, short slot)
{ {
ITEM_INFO* item = &Items[itemNum]; ITEM_INFO* item = &Items[itemNum];
ObjectInfo* obj = &Objects[item->objectNumber]; OBJECT_INFO* obj = &Objects[item->objectNumber];
CREATURE_INFO* creature = &BaddieSlots[slot]; CREATURE_INFO* creature = &BaddieSlots[slot];
item->data = creature; item->data = creature;

View file

@ -130,7 +130,7 @@ void ControlMissile(short fxNumber)
void ControlNatlaGun(short fx_number) void ControlNatlaGun(short fx_number)
{ {
FX_INFO* fx, *newfx; FX_INFO* fx, *newfx;
ObjectInfo* object; OBJECT_INFO* object;
FLOOR_INFO* floor; FLOOR_INFO* floor;
short roomNumber; short roomNumber;
int x, y, z; int x, y, z;

View file

@ -1424,7 +1424,7 @@ short* FindPlinth(ITEM_INFO* item)
for (itemNumber = room->itemNumber; itemNumber != NO_ITEM; itemNumber = Items[itemNumber].nextItem) for (itemNumber = room->itemNumber; itemNumber != NO_ITEM; itemNumber = Items[itemNumber].nextItem)
{ {
ITEM_INFO* current = &Items[itemNumber]; ITEM_INFO* current = &Items[itemNumber];
ObjectInfo* obj = &Objects[current->objectNumber]; OBJECT_INFO* obj = &Objects[current->objectNumber];
if (!obj->isPickup if (!obj->isPickup
&& item->pos.xPos == current->pos.xPos && item->pos.xPos == current->pos.xPos

View file

@ -122,7 +122,7 @@ void SaveGame::saveItems()
void SaveGame::saveItem(int itemNumber, int runtimeItem) void SaveGame::saveItem(int itemNumber, int runtimeItem)
{ {
ITEM_INFO* item = &Items[itemNumber]; ITEM_INFO* item = &Items[itemNumber];
ObjectInfo* obj = &Objects[item->objectNumber]; OBJECT_INFO* obj = &Objects[item->objectNumber];
LEB128::Write(m_stream, itemNumber); LEB128::Write(m_stream, itemNumber);
LEB128::Write(m_stream, runtimeItem); LEB128::Write(m_stream, runtimeItem);
@ -550,7 +550,7 @@ bool SaveGame::readItem()
ITEM_INFO* item = &Items[itemNumber]; ITEM_INFO* item = &Items[itemNumber];
item->objectNumber = LEB128::ReadInt16(m_stream); item->objectNumber = LEB128::ReadInt16(m_stream);
ObjectInfo* obj = &Objects[item->objectNumber]; OBJECT_INFO* obj = &Objects[item->objectNumber];
// Runtime items must be initialised // Runtime items must be initialised
// TODO: test test test!!! // TODO: test test test!!!
@ -1012,7 +1012,7 @@ bool SaveGame::readItemChunks(ChunkId* chunkId, int maxSize, int itemNumber)
{ {
EnableBaddieAI(itemNumber, 1); EnableBaddieAI(itemNumber, 1);
ObjectInfo* obj = &Objects[item->objectNumber]; OBJECT_INFO* obj = &Objects[item->objectNumber];
CREATURE_INFO* creature = (CREATURE_INFO*)item->data; CREATURE_INFO* creature = (CREATURE_INFO*)item->data;
creature->jointRotation[0] = LEB128::ReadInt16(m_stream); creature->jointRotation[0] = LEB128::ReadInt16(m_stream);
@ -1116,7 +1116,7 @@ bool SaveGame::readStatistics()
void SaveGame::saveItemFlags(int arg1, int arg2) void SaveGame::saveItemFlags(int arg1, int arg2)
{ {
ITEM_INFO* item = &Items[arg1]; ITEM_INFO* item = &Items[arg1];
ObjectInfo* obj = &Objects[item->objectNumber]; OBJECT_INFO* obj = &Objects[item->objectNumber];
LEB128::Write(m_stream, item->flags); LEB128::Write(m_stream, item->flags);
LEB128::Write(m_stream, item->active); LEB128::Write(m_stream, item->active);
@ -1140,7 +1140,7 @@ void SaveGame::saveItemFlags(int arg1, int arg2)
void SaveGame::saveItemIntelligentData(int arg1, int arg2) void SaveGame::saveItemIntelligentData(int arg1, int arg2)
{ {
ITEM_INFO* item = &Items[arg1]; ITEM_INFO* item = &Items[arg1];
ObjectInfo* obj = &Objects[item->objectNumber]; OBJECT_INFO* obj = &Objects[item->objectNumber];
CREATURE_INFO* creature = (CREATURE_INFO*)item->data; CREATURE_INFO* creature = (CREATURE_INFO*)item->data;
ITEM_INFO* enemy = (ITEM_INFO*)((char*)creature->enemy - (ptrdiff_t)malloc_buffer); ITEM_INFO* enemy = (ITEM_INFO*)((char*)creature->enemy - (ptrdiff_t)malloc_buffer);

View file

@ -650,7 +650,7 @@ void TurnSwitchCollision(short itemNum, ITEM_INFO* l, COLL_INFO* coll)
Lara.torsoXrot = 0; Lara.torsoXrot = 0;
Lara.gunStatus = LG_HANDS_BUSY; Lara.gunStatus = LG_HANDS_BUSY;
l->currentAnimState = ANIMATION_LARA_TRY_HANG_SOLID; l->currentAnimState = ANIMATION_LARA_TRY_HANG_SOLID;
UseForcedFixedCamera = TRUE; UseForcedFixedCamera = true;
ForcedFixedCamera.y = item->pos.yPos - 2048; ForcedFixedCamera.y = item->pos.yPos - 2048;
ForcedFixedCamera.roomNumber = item->roomNumber; ForcedFixedCamera.roomNumber = item->roomNumber;
AddActiveItem(itemNum); AddActiveItem(itemNum);

View file

@ -1195,7 +1195,7 @@ void TriggerLaraDrips()// (F)
int ExplodingDeath(short itemNumber, int meshBits, short flags) int ExplodingDeath(short itemNumber, int meshBits, short flags)
{ {
ITEM_INFO* item = &Items[itemNumber]; ITEM_INFO* item = &Items[itemNumber];
ObjectInfo* obj = &Objects[item->objectNumber]; OBJECT_INFO* obj = &Objects[item->objectNumber];
short* frame = GetBestFrame(item); short* frame = GetBestFrame(item);

View file

@ -152,7 +152,7 @@ void UpdateLocusts(void)
locust->counter--; locust->counter--;
if (locust->counter == 0) if (locust->counter == 0)
{ {
locust->on = FALSE; locust->on = false;
break; break;
} }

View file

@ -113,7 +113,7 @@ void BigRatControl(short itemNumber)
return; return;
ITEM_INFO* item; ITEM_INFO* item;
ObjectInfo* obj; OBJECT_INFO* obj;
CREATURE_INFO* big_rat; CREATURE_INFO* big_rat;
AI_INFO info; AI_INFO info;
short head, angle; short head, angle;
@ -171,7 +171,7 @@ void BigRatControl(short itemNumber)
if ((item->hitStatus || info.distance < BIG_RAT_ALERT_RANGE) || (TargetVisible(item, &info) && info.distance < BIG_RAT_VISIBILITY_RANGE)) if ((item->hitStatus || info.distance < BIG_RAT_ALERT_RANGE) || (TargetVisible(item, &info) && info.distance < BIG_RAT_VISIBILITY_RANGE))
{ {
if (!big_rat->alerted) if (!big_rat->alerted)
big_rat->alerted = TRUE; big_rat->alerted = true;
AlertAllGuards(itemNumber); AlertAllGuards(itemNumber);
} }
@ -213,7 +213,7 @@ void BigRatControl(short itemNumber)
{ {
CreatureEffect(item, &big_ratBite, DoBloodSplat); CreatureEffect(item, &big_ratBite, DoBloodSplat);
LaraItem->hitPoints -= BIG_RAT_BITE_DAMAGE; LaraItem->hitPoints -= BIG_RAT_BITE_DAMAGE;
LaraItem->hitStatus = TRUE; LaraItem->hitStatus = true;
item->requiredAnimState = BIG_RAT_STOP; item->requiredAnimState = BIG_RAT_STOP;
} }
break; break;
@ -223,7 +223,7 @@ void BigRatControl(short itemNumber)
{ {
CreatureEffect(item, &big_ratBite, DoBloodSplat); CreatureEffect(item, &big_ratBite, DoBloodSplat);
LaraItem->hitPoints -= BIG_RAT_CHARGE_DAMAGE; LaraItem->hitPoints -= BIG_RAT_CHARGE_DAMAGE;
LaraItem->hitStatus = TRUE; LaraItem->hitStatus = true;
item->requiredAnimState = BIG_RAT_RUN; item->requiredAnimState = BIG_RAT_RUN;
} }
break; break;
@ -253,7 +253,7 @@ void BigRatControl(short itemNumber)
{ {
CreatureEffect(item, &big_ratBite, DoBloodSplat); CreatureEffect(item, &big_ratBite, DoBloodSplat);
LaraItem->hitPoints -= BIG_RAT_BITE_DAMAGE; LaraItem->hitPoints -= BIG_RAT_BITE_DAMAGE;
LaraItem->hitStatus = TRUE; LaraItem->hitStatus = true;
} }
item->goalAnimState = BIG_RAT_SWIM; item->goalAnimState = BIG_RAT_SWIM;

View file

@ -18,7 +18,7 @@
#include "setup.h" #include "setup.h"
#include "level.h" #include "level.h"
static void StartBaddy(ObjectInfo* obj) static void StartBaddy(OBJECT_INFO* obj)
{ {
obj = &Objects[ID_WOLF]; obj = &Objects[ID_WOLF];
if (obj->loaded) if (obj->loaded)
@ -150,17 +150,17 @@ static void StartBaddy(ObjectInfo* obj)
} }
} }
static void StartObject(ObjectInfo* obj) static void StartObject(OBJECT_INFO* obj)
{ {
} }
static void StartTrap(ObjectInfo* obj) static void StartTrap(OBJECT_INFO* obj)
{ {
} }
static ObjectInfo* objToInit; static OBJECT_INFO* objToInit;
void InitialiseTR1Objects() void InitialiseTR1Objects()
{ {
StartBaddy(objToInit); StartBaddy(objToInit);

View file

@ -108,7 +108,7 @@ static void SkidooBaddieCollision(short itemNum, ITEM_INFO* skidoo)
ITEM_INFO* target = &Items[itemNum]; ITEM_INFO* target = &Items[itemNum];
if (target->collidable && target->status != ITEM_INVISIBLE && target != LaraItem && target != skidoo) if (target->collidable && target->status != ITEM_INVISIBLE && target != LaraItem && target != skidoo)
{ {
ObjectInfo* object = &Objects[target->objectNumber]; OBJECT_INFO* object = &Objects[target->objectNumber];
if (object->collision && (object->intelligent || target->objectNumber == ID_ROLLINGBALL)) if (object->collision && (object->intelligent || target->objectNumber == ID_ROLLINGBALL))
{ {
int x = skidoo->pos.xPos - target->pos.xPos; int x = skidoo->pos.xPos - target->pos.xPos;

View file

@ -35,7 +35,7 @@
#include "setup.h" #include "setup.h"
#include "level.h" #include "level.h"
static void StartBaddy(ObjectInfo* obj) static void StartBaddy(OBJECT_INFO* obj)
{ {
obj = &Objects[ID_SHARK]; obj = &Objects[ID_SHARK];
if (obj->loaded) if (obj->loaded)
@ -600,12 +600,12 @@ static void StartBaddy(ObjectInfo* obj)
} }
} }
static void StartObject(ObjectInfo* obj) static void StartObject(OBJECT_INFO* obj)
{ {
} }
static void StartTrap(ObjectInfo* obj) static void StartTrap(OBJECT_INFO* obj)
{ {
obj = &Objects[ID_ROLLING_SPINDLE]; obj = &Objects[ID_ROLLING_SPINDLE];
if (obj->loaded) if (obj->loaded)
@ -628,7 +628,7 @@ static void StartTrap(ObjectInfo* obj)
} }
// boat, snowmobile, snowmobile gun // boat, snowmobile, snowmobile gun
static void StartVehicles(ObjectInfo* obj) static void StartVehicles(OBJECT_INFO* obj)
{ {
// TODO: fix BoatControl() not using int BoatControl(void) // TODO: fix BoatControl() not using int BoatControl(void)
obj = &Objects[ID_SPEEDBOAT]; obj = &Objects[ID_SPEEDBOAT];
@ -654,7 +654,7 @@ static void StartVehicles(ObjectInfo* obj)
} }
} }
static ObjectInfo* objToInit; static OBJECT_INFO* objToInit;
void InitialiseTR2Objects() void InitialiseTR2Objects()
{ {
StartBaddy(objToInit); StartBaddy(objToInit);

View file

@ -92,7 +92,7 @@ static void LondonBossDie(short item_number)
{ {
ITEM_INFO* item; ITEM_INFO* item;
item = &Items[item_number]; item = &Items[item_number];
item->collidable = FALSE; item->collidable = false;
item->hitPoints = -16384; item->hitPoints = -16384;
KillItem(item_number); KillItem(item_number);

View file

@ -98,7 +98,7 @@ static void TriggerTonyFlame(short itemNum, int hand)
return; return;
sptr = &Sparks[GetFreeSpark()]; sptr = &Sparks[GetFreeSpark()];
sptr->on = TRUE; sptr->on = true;
sptr->sR = 255; sptr->sR = 255;
sptr->sG = 48 + (GetRandomControl() & 31); sptr->sG = 48 + (GetRandomControl() & 31);
sptr->sB = 48; sptr->sB = 48;
@ -156,7 +156,7 @@ static void TriggerFireBallFlame(short fxNumber, long type, long xv, long yv, lo
return; return;
sptr = &Sparks[GetFreeSpark()]; sptr = &Sparks[GetFreeSpark()];
sptr->on = TRUE; sptr->on = true;
sptr->sR = 255; sptr->sR = 255;
sptr->sG = 48 + (GetRandomControl() & 31); sptr->sG = 48 + (GetRandomControl() & 31);
sptr->sB = 48; sptr->sB = 48;
@ -424,7 +424,7 @@ void ControlTonyFireBall(short fxNumber)
{ {
if (ItemNearLara(&fx->pos, 200)) if (ItemNearLara(&fx->pos, 200))
{ {
LaraItem->hitStatus = TRUE; LaraItem->hitStatus = true;
KillEffect(fxNumber); KillEffect(fxNumber);
LaraItem->hitPoints -= 200; LaraItem->hitPoints -= 200;
LaraBurn(); LaraBurn();
@ -449,7 +449,7 @@ static void TonyBossDie(short itemNum)
{ {
ITEM_INFO* item; ITEM_INFO* item;
item = &Items[itemNum]; item = &Items[itemNum];
item->collidable = FALSE; item->collidable = false;
item->hitPoints = -16384; item->hitPoints = -16384;
KillItem(itemNum); KillItem(itemNum);

View file

@ -1097,7 +1097,7 @@ static void KayakToBaddieCollision(ITEM_INFO* kayak)
if (item->collidable && item->status != ITEM_INVISIBLE) if (item->collidable && item->status != ITEM_INVISIBLE)
{ {
ObjectInfo* object; OBJECT_INFO* object;
object = &Objects[item->objectNumber]; object = &Objects[item->objectNumber];

View file

@ -199,7 +199,7 @@ static void CartToBaddieCollision(ITEM_INFO* v)
ITEM_INFO* item = &Items[itemNum]; ITEM_INFO* item = &Items[itemNum];
if (item->collidable && item->status != ITEM_INVISIBLE && item != LaraItem && item != v) if (item->collidable && item->status != ITEM_INVISIBLE && item != LaraItem && item != v)
{ {
ObjectInfo* object = &Objects[item->objectNumber]; OBJECT_INFO* object = &Objects[item->objectNumber];
if (object->collision && (object->intelligent || item->objectNumber == ID_ROLLINGBALL || item->objectNumber == ID_ANIMATING2)) if (object->collision && (object->intelligent || item->objectNumber == ID_ROLLINGBALL || item->objectNumber == ID_ANIMATING2))
{ {
int x = v->pos.xPos - item->pos.xPos; int x = v->pos.xPos - item->pos.xPos;

View file

@ -323,7 +323,7 @@ static void QuadBaddieCollision(ITEM_INFO* quad)
ITEM_INFO* item = &Items[itemNum]; ITEM_INFO* item = &Items[itemNum];
if (item->collidable && item->status != ITEM_INVISIBLE && item != LaraItem && item != quad) if (item->collidable && item->status != ITEM_INVISIBLE && item != LaraItem && item != quad)
{ {
ObjectInfo* object = &Objects[item->objectNumber]; OBJECT_INFO* object = &Objects[item->objectNumber];
if (object->collision && object->intelligent) if (object->collision && object->intelligent)
{ {
int x = quad->pos.xPos - item->pos.xPos; int x = quad->pos.xPos - item->pos.xPos;

View file

@ -34,7 +34,7 @@
#include "setup.h" #include "setup.h"
#include "level.h" #include "level.h"
static void StartBaddy(ObjectInfo* obj) static void StartBaddy(OBJECT_INFO* obj)
{ {
obj = &Objects[ID_TONY_BOSS]; obj = &Objects[ID_TONY_BOSS];
if (obj->loaded) if (obj->loaded)
@ -350,17 +350,17 @@ static void StartBaddy(ObjectInfo* obj)
} }
} }
static void StartObject(ObjectInfo* obj) static void StartObject(OBJECT_INFO* obj)
{ {
} }
static void StartTrap(ObjectInfo* obj) static void StartTrap(OBJECT_INFO* obj)
{ {
} }
static void StartVehicles(ObjectInfo* obj) static void StartVehicles(OBJECT_INFO* obj)
{ {
obj = &Objects[ID_QUAD]; obj = &Objects[ID_QUAD];
if (obj->loaded) if (obj->loaded)
@ -394,14 +394,14 @@ static void StartVehicles(ObjectInfo* obj)
} }
} }
static void StartProjectiles(ObjectInfo* obj) static void StartProjectiles(OBJECT_INFO* obj)
{ {
obj = &Objects[ID_TONY_BOSS_FLAME]; obj = &Objects[ID_TONY_BOSS_FLAME];
obj->control = ControlTonyFireBall; obj->control = ControlTonyFireBall;
obj->drawRoutine = NULL; obj->drawRoutine = NULL;
} }
static ObjectInfo* objToInit; static OBJECT_INFO* objToInit;
void InitialiseTR3Objects() void InitialiseTR3Objects()
{ {
StartBaddy(objToInit); StartBaddy(objToInit);

View file

@ -125,7 +125,7 @@ void AhmetControl(short itemNumber)
// dont clear it ! // dont clear it !
if (item->frameNumber == Anims[item->animNumber].frameEnd) if (item->frameNumber == Anims[item->animNumber].frameEnd)
{ {
item->collidable = FALSE; // NOTE: not exist in the original game, avoid wreid collision with lara... item->collidable = false; // NOTE: not exist in the original game, avoid wreid collision with lara...
item->frameNumber = (Anims[item->animNumber].frameEnd - 1); item->frameNumber = (Anims[item->animNumber].frameEnd - 1);
} }
} }
@ -269,14 +269,14 @@ void AhmetControl(short itemNumber)
if (!(ahmet->flags & 1) && item->frameNumber > (Anims[item->animNumber].frameBase + 7) && (item->touchBits & AHMET_LEFT_TOUCH)) if (!(ahmet->flags & 1) && item->frameNumber > (Anims[item->animNumber].frameBase + 7) && (item->touchBits & AHMET_LEFT_TOUCH))
{ {
LaraItem->hitStatus = TRUE; LaraItem->hitStatus = true;
LaraItem->hitPoints -= AHMET_HAND_DAMAGE; LaraItem->hitPoints -= AHMET_HAND_DAMAGE;
CreatureEffect2(item, &ahmetBiteLeft, 10, -1, DoBloodSplat); CreatureEffect2(item, &ahmetBiteLeft, 10, -1, DoBloodSplat);
ahmet->flags |= 1; ahmet->flags |= 1;
} }
else if (!(ahmet->flags & 2) && item->frameNumber > (Anims[item->animNumber].frameBase + 32) && (item->touchBits & AHMET_RIGHT_TOUCH)) else if (!(ahmet->flags & 2) && item->frameNumber > (Anims[item->animNumber].frameBase + 32) && (item->touchBits & AHMET_RIGHT_TOUCH))
{ {
LaraItem->hitStatus = TRUE; LaraItem->hitStatus = true;
LaraItem->hitPoints -= AHMET_HAND_DAMAGE; LaraItem->hitPoints -= AHMET_HAND_DAMAGE;
CreatureEffect2(item, &ahmetBiteRight, 10, -1, DoBloodSplat); CreatureEffect2(item, &ahmetBiteRight, 10, -1, DoBloodSplat);
ahmet->flags |= 2; ahmet->flags |= 2;
@ -305,7 +305,7 @@ void AhmetControl(short itemNumber)
{ {
if (item->frameNumber > (Anims[item->animNumber].frameBase + 11) && (item->touchBits & AHMET_LEFT_TOUCH)) if (item->frameNumber > (Anims[item->animNumber].frameBase + 11) && (item->touchBits & AHMET_LEFT_TOUCH))
{ {
LaraItem->hitStatus = TRUE; LaraItem->hitStatus = true;
LaraItem->hitPoints -= AHMET_JAW_DAMAGE; LaraItem->hitPoints -= AHMET_JAW_DAMAGE;
CreatureEffect2(item, &ahmetBiteJaw, 10, -1, DoBloodSplat); CreatureEffect2(item, &ahmetBiteJaw, 10, -1, DoBloodSplat);
ahmet->flags |= 1; ahmet->flags |= 1;
@ -334,14 +334,14 @@ void AhmetControl(short itemNumber)
{ {
if (!(ahmet->flags & 1) && item->frameNumber > (Anims[item->animNumber].frameBase + 14) && (item->touchBits & AHMET_LEFT_TOUCH)) if (!(ahmet->flags & 1) && item->frameNumber > (Anims[item->animNumber].frameBase + 14) && (item->touchBits & AHMET_LEFT_TOUCH))
{ {
LaraItem->hitStatus = TRUE; LaraItem->hitStatus = true;
LaraItem->hitPoints -= AHMET_HAND_DAMAGE; LaraItem->hitPoints -= AHMET_HAND_DAMAGE;
CreatureEffect2(item, &ahmetBiteLeft, 10, -1, DoBloodSplat); CreatureEffect2(item, &ahmetBiteLeft, 10, -1, DoBloodSplat);
ahmet->flags |= 1; ahmet->flags |= 1;
} }
else if (!(ahmet->flags & 2) && item->frameNumber > (Anims[item->animNumber].frameBase + 22) && (item->touchBits & AHMET_RIGHT_TOUCH)) else if (!(ahmet->flags & 2) && item->frameNumber > (Anims[item->animNumber].frameBase + 22) && (item->touchBits & AHMET_RIGHT_TOUCH))
{ {
LaraItem->hitStatus = TRUE; LaraItem->hitStatus = true;
LaraItem->hitPoints -= AHMET_HAND_DAMAGE; LaraItem->hitPoints -= AHMET_HAND_DAMAGE;
CreatureEffect2(item, &ahmetBiteRight, 10, -1, DoBloodSplat); CreatureEffect2(item, &ahmetBiteRight, 10, -1, DoBloodSplat);
ahmet->flags |= 2; ahmet->flags |= 2;

View file

@ -143,7 +143,7 @@ static bool CheckRespawnedBaboon(short itemNumber)
static void UpdateRespawnedBaboon(short itemNumber) static void UpdateRespawnedBaboon(short itemNumber)
{ {
ITEM_INFO* item; ITEM_INFO* item;
ObjectInfo* obj; OBJECT_INFO* obj;
BaboonRespawnStruct* baboon; BaboonRespawnStruct* baboon;
item = &Items[itemNumber]; item = &Items[itemNumber];
@ -177,11 +177,11 @@ static void UpdateRespawnedBaboon(short itemNumber)
if (item->triggerFlags == 1) if (item->triggerFlags == 1)
return; return;
else else
item->collidable = TRUE; item->collidable = true;
} }
else if (item->triggerFlags == 0) else if (item->triggerFlags == 0)
{ {
item->collidable = TRUE; item->collidable = true;
} }
} }
@ -560,7 +560,7 @@ void BaboonControl(short itemNumber)
|| (item->touchBits & BABOON_JUMP_TOUCHBITS))) || (item->touchBits & BABOON_JUMP_TOUCHBITS)))
{ {
LaraItem->hitPoints -= BABOON_DAMAGE; LaraItem->hitPoints -= BABOON_DAMAGE;
LaraItem->hitStatus = TRUE; LaraItem->hitStatus = true;
CreatureEffect2(item, &baboonBite, 10, -1, DoBloodSplat); CreatureEffect2(item, &baboonBite, 10, -1, DoBloodSplat);
baboon->flags = 1; baboon->flags = 1;
} }

View file

@ -280,7 +280,7 @@ void BaddyControl(short itemNum)
ITEM_INFO* item = &Items[itemNum]; ITEM_INFO* item = &Items[itemNum];
CREATURE_INFO* creature = (CREATURE_INFO*)item->data; CREATURE_INFO* creature = (CREATURE_INFO*)item->data;
ITEM_INFO* enemyItem = creature->enemy; ITEM_INFO* enemyItem = creature->enemy;
ObjectInfo* obj = &Objects[ID_BADDY1]; OBJECT_INFO* obj = &Objects[ID_BADDY1];
short tilt = 0; short tilt = 0;
short angle = 0; short angle = 0;

View file

@ -65,7 +65,7 @@ void BatControl(short itemNumber)
{ {
item->goalAnimState = BAT_DEATH; item->goalAnimState = BAT_DEATH;
item->pos.yPos = item->floor; item->pos.yPos = item->floor;
item->gravityStatus = FALSE; item->gravityStatus = false;
} }
else else
{ {
@ -150,7 +150,7 @@ void BatControl(short itemNumber)
if (bat->enemy == LaraItem) if (bat->enemy == LaraItem)
{ {
LaraItem->hitPoints -= BAT_DAMAGE; LaraItem->hitPoints -= BAT_DAMAGE;
LaraItem->hitStatus = TRUE; LaraItem->hitStatus = true;
} }
bat->flags = 1; bat->flags = 1;
} }

View file

@ -101,7 +101,7 @@ void CrocodileControl(short itemNumber)
return; return;
ITEM_INFO* item; ITEM_INFO* item;
ObjectInfo* obj; OBJECT_INFO* obj;
CREATURE_INFO* crocodile; CREATURE_INFO* crocodile;
AI_INFO info; AI_INFO info;
OBJECT_Bones boneRot; OBJECT_Bones boneRot;
@ -158,7 +158,7 @@ void CrocodileControl(short itemNumber)
if ((item->hitStatus || info.distance < CROC_ALERT_RANGE) || (TargetVisible(item, &info) && info.distance < CROC_VISIBILITY_RANGE)) if ((item->hitStatus || info.distance < CROC_ALERT_RANGE) || (TargetVisible(item, &info) && info.distance < CROC_VISIBILITY_RANGE))
{ {
if (!crocodile->alerted) if (!crocodile->alerted)
crocodile->alerted = TRUE; crocodile->alerted = true;
AlertAllGuards(itemNumber); AlertAllGuards(itemNumber);
} }
@ -242,7 +242,7 @@ void CrocodileControl(short itemNumber)
{ {
CreatureEffect2(item, &crocBite, 10, -1, DoBloodSplat); CreatureEffect2(item, &crocBite, 10, -1, DoBloodSplat);
LaraItem->hitPoints -= CROC_DAMAGE; LaraItem->hitPoints -= CROC_DAMAGE;
LaraItem->hitStatus = TRUE; LaraItem->hitStatus = true;
item->requiredAnimState = CROC_IDLE; item->requiredAnimState = CROC_IDLE;
} }
} }
@ -285,7 +285,7 @@ void CrocodileControl(short itemNumber)
{ {
CreatureEffect2(item, &crocBite, 10, -1, DoBloodSplat); CreatureEffect2(item, &crocBite, 10, -1, DoBloodSplat);
LaraItem->hitPoints -= CROC_DAMAGE; LaraItem->hitPoints -= CROC_DAMAGE;
LaraItem->hitStatus = TRUE; LaraItem->hitStatus = true;
item->requiredAnimState = WCROC_SWIM; item->requiredAnimState = WCROC_SWIM;
} }
} }

View file

@ -35,7 +35,7 @@ static void DemigodThrowEnergyAttack(PHD_3DPOS* pos, short roomNumber, int flags
fx->pos.yRot = pos->yRot + (GetRandomControl() & 0x7FF) - 1024; fx->pos.yRot = pos->yRot + (GetRandomControl() & 0x7FF) - 1024;
} }
ObjectInfo* obj = &Objects[ID_ENERGY_BUBBLES]; OBJECT_INFO* obj = &Objects[ID_ENERGY_BUBBLES];
fx->pos.zRot = 0; fx->pos.zRot = 0;
fx->roomNumber = roomNumber; fx->roomNumber = roomNumber;

View file

@ -35,7 +35,7 @@ void GuideControl(short itemNumber)
ITEM_INFO* item = &Items[itemNumber]; ITEM_INFO* item = &Items[itemNumber];
CREATURE_INFO* creature = (CREATURE_INFO*)item->data; CREATURE_INFO* creature = (CREATURE_INFO*)item->data;
ObjectInfo* obj = &Objects[item->objectNumber]; OBJECT_INFO* obj = &Objects[item->objectNumber];
short angle = 0; short angle = 0;
short tilt = 0; short tilt = 0;

View file

@ -260,7 +260,7 @@ void HarpyControl(short itemNumber)
return; return;
CREATURE_INFO* creature = (CREATURE_INFO*)item->data; CREATURE_INFO* creature = (CREATURE_INFO*)item->data;
ObjectInfo* obj = &Objects[item->objectNumber]; OBJECT_INFO* obj = &Objects[item->objectNumber];
short angle = 0; short angle = 0;
short joint0 = 0; short joint0 = 0;

View file

@ -92,7 +92,7 @@ static void HorsemanSparks(PHD_3DPOS* pos, int param1, int num)
void InitialiseHorse(short itemNumber) void InitialiseHorse(short itemNumber)
{ {
ITEM_INFO* item = &Items[itemNumber]; ITEM_INFO* item = &Items[itemNumber];
ObjectInfo* obj = &Objects[ID_HORSE]; OBJECT_INFO* obj = &Objects[ID_HORSE];
item->animNumber = obj->animIndex + 2; item->animNumber = obj->animIndex + 2;
item->frameNumber = Anims[item->animNumber].frameBase; item->frameNumber = Anims[item->animNumber].frameBase;
@ -103,7 +103,7 @@ void InitialiseHorse(short itemNumber)
void InitialiseHorseman(short itemNumber) void InitialiseHorseman(short itemNumber)
{ {
ITEM_INFO* item = &Items[itemNumber]; ITEM_INFO* item = &Items[itemNumber];
ObjectInfo* obj = &Objects[ID_HORSEMAN]; OBJECT_INFO* obj = &Objects[ID_HORSEMAN];
ClearItem(itemNumber); ClearItem(itemNumber);

View file

@ -8,7 +8,7 @@
void InitialiseJeanYves(short itemNumber) void InitialiseJeanYves(short itemNumber)
{ {
ITEM_INFO* item = &Items[itemNumber]; ITEM_INFO* item = &Items[itemNumber];
ObjectInfo* obj = &Objects[item->objectNumber]; OBJECT_INFO* obj = &Objects[item->objectNumber];
item->goalAnimState = 1; item->goalAnimState = 1;
item->currentAnimState = 1; item->currentAnimState = 1;

View file

@ -32,7 +32,7 @@ void KnightTemplarControl(short itemNumber)
return; return;
ITEM_INFO* item = &Items[itemNumber]; ITEM_INFO* item = &Items[itemNumber];
ObjectInfo* obj = &Objects[item->objectNumber]; OBJECT_INFO* obj = &Objects[item->objectNumber];
if (item->animNumber == obj->animIndex || if (item->animNumber == obj->animIndex ||
item->animNumber - obj->animIndex == 1 || item->animNumber - obj->animIndex == 1 ||

View file

@ -68,7 +68,7 @@ void TriggerMutantRocketEffects(short fxNumber, short xVel, short yVel, short zV
fx = &EffectList[fxNumber]; fx = &EffectList[fxNumber];
sptr = &Sparks[GetFreeSpark()]; sptr = &Sparks[GetFreeSpark()];
sptr->on = TRUE; sptr->on = true;
color = (GetRandomControl() & 0x3F) - 128; color = (GetRandomControl() & 0x3F) - 128;
sptr->sB = 0; sptr->sB = 0;
sptr->sR = color; sptr->sR = color;

View file

@ -78,7 +78,7 @@ static void WakeUpSkeleton(ITEM_INFO* item)
void InitialiseSkeleton(short itemNumber) void InitialiseSkeleton(short itemNumber)
{ {
ITEM_INFO* item = &Items[itemNumber]; ITEM_INFO* item = &Items[itemNumber];
ObjectInfo* obj = &Objects[ID_SKELETON]; OBJECT_INFO* obj = &Objects[ID_SKELETON];
ClearItem(itemNumber); ClearItem(itemNumber);

View file

@ -30,7 +30,7 @@ void SphinxControl(short itemNumber)
ITEM_INFO* item = &Items[itemNumber]; ITEM_INFO* item = &Items[itemNumber];
CREATURE_INFO* creature = (CREATURE_INFO*)item->data; CREATURE_INFO* creature = (CREATURE_INFO*)item->data;
ObjectInfo* obj = &Objects[item->objectNumber]; OBJECT_INFO* obj = &Objects[item->objectNumber];
int x = item->pos.xPos + 614 * phd_sin(item->pos.yRot) >> W2V_SHIFT; int x = item->pos.xPos + 614 * phd_sin(item->pos.yRot) >> W2V_SHIFT;
int y = item->pos.yPos; int y = item->pos.yPos;

View file

@ -41,7 +41,7 @@ void TroopsControl(short itemNumber)
ITEM_INFO* item = &Items[itemNumber]; ITEM_INFO* item = &Items[itemNumber];
CREATURE_INFO* creature = (CREATURE_INFO*)item->data; CREATURE_INFO* creature = (CREATURE_INFO*)item->data;
ObjectInfo* obj = &Objects[item->objectNumber]; OBJECT_INFO* obj = &Objects[item->objectNumber];
short angle = 0; short angle = 0;
short tilt = 0; short tilt = 0;
short joint0 = 0; short joint0 = 0;

View file

@ -537,7 +537,7 @@ static void JeepBaddieCollision(ITEM_INFO* jeep)
} }
else else
{ {
ObjectInfo* object = &Objects[item->objectNumber]; OBJECT_INFO* object = &Objects[item->objectNumber];
if (object->collision && object->intelligent || if (object->collision && object->intelligent ||
item->objectNumber == ID_ROLLINGBALL) item->objectNumber == ID_ROLLINGBALL)
{ {

View file

@ -231,7 +231,7 @@ static void DrawMotorbikeLight(ITEM_INFO* item)
rnd = (2 * motorbike->lightPower) - (GetRandomControl() & 0xF); rnd = (2 * motorbike->lightPower) - (GetRandomControl() & 0xF);
// TODO: Spot Light // TODO: Spot Light
/*if (rnd <= 0) /*if (rnd <= 0)
SpotLightEnabled = FALSE; SpotLightEnabled = false;
else else
CreateSpotLight(&start, &target, item->pos.yRot, rnd);*/ CreateSpotLight(&start, &target, item->pos.yRot, rnd);*/
} }
@ -247,22 +247,22 @@ static BOOL GetOnMotorBike(short itemNumber)
item = &Items[itemNumber]; item = &Items[itemNumber];
if (item->flags & ONESHOT || Lara.gunStatus == LG_HANDS_BUSY || LaraItem->gravityStatus) if (item->flags & ONESHOT || Lara.gunStatus == LG_HANDS_BUSY || LaraItem->gravityStatus)
return FALSE; return false;
if ((abs(item->pos.yPos - LaraItem->pos.yPos) >= STEP_SIZE || !(TrInput & IN_ACTION)) && g_Inventory.GetSelectedObject() != ID_PUZZLE_ITEM1) if ((abs(item->pos.yPos - LaraItem->pos.yPos) >= STEP_SIZE || !(TrInput & IN_ACTION)) && g_Inventory.GetSelectedObject() != ID_PUZZLE_ITEM1)
return FALSE; return false;
dx = LaraItem->pos.xPos - item->pos.xPos; dx = LaraItem->pos.xPos - item->pos.xPos;
dz = LaraItem->pos.zPos - item->pos.zPos; dz = LaraItem->pos.zPos - item->pos.zPos;
distance = SQUARE(dx) + SQUARE(dz); distance = SQUARE(dx) + SQUARE(dz);
if (distance > 170000) if (distance > 170000)
return FALSE; return false;
room_number = item->roomNumber; room_number = item->roomNumber;
floor = GetFloor(item->pos.xPos, item->pos.yPos, item->pos.zPos, &room_number); floor = GetFloor(item->pos.xPos, item->pos.yPos, item->pos.zPos, &room_number);
height = GetFloorHeight(floor, item->pos.xPos, item->pos.yPos, item->pos.zPos); height = GetFloorHeight(floor, item->pos.xPos, item->pos.yPos, item->pos.zPos);
if (height < -32000) if (height < -32000)
return FALSE; return false;
angle = phd_atan(item->pos.zPos - LaraItem->pos.zPos, item->pos.xPos - LaraItem->pos.xPos) - item->pos.yRot; angle = phd_atan(item->pos.zPos - LaraItem->pos.zPos, item->pos.xPos - LaraItem->pos.xPos) - item->pos.yRot;
tempangle = angle - item->pos.yRot; tempangle = angle - item->pos.yRot;
@ -270,15 +270,15 @@ static BOOL GetOnMotorBike(short itemNumber)
{ {
// left // left
if (tempangle > -ANGLE(45.0f) && angle < ANGLE(135.0f)) if (tempangle > -ANGLE(45.0f) && angle < ANGLE(135.0f))
return FALSE; return false;
} }
else else
{ {
// right // right
if (tempangle > ANGLE(225.0f) && tempangle < ANGLE(315.0f)) if (tempangle > ANGLE(225.0f) && tempangle < ANGLE(315.0f))
return FALSE; return false;
} }
return TRUE; return true;
} }
void MotorbikeCollision(short itemNumber, ITEM_INFO* laraitem, COLL_INFO* coll) void MotorbikeCollision(short itemNumber, ITEM_INFO* laraitem, COLL_INFO* coll)
@ -306,7 +306,7 @@ void MotorbikeCollision(short itemNumber, ITEM_INFO* laraitem, COLL_INFO* coll)
{ {
CreateFlare(ID_FLARE_ITEM, FALSE); CreateFlare(ID_FLARE_ITEM, FALSE);
undraw_flare_meshes(); undraw_flare_meshes();
Lara.flareControlLeft = FALSE; Lara.flareControlLeft = false;
Lara.gunType = WEAPON_NONE; Lara.gunType = WEAPON_NONE;
Lara.requestGunType = WEAPON_NONE; Lara.requestGunType = WEAPON_NONE;
Lara.flareAge = 0; Lara.flareAge = 0;
@ -343,7 +343,7 @@ void MotorbikeCollision(short itemNumber, ITEM_INFO* laraitem, COLL_INFO* coll)
Lara.hitDirection = -1; Lara.hitDirection = -1;
AnimateItem(laraitem); AnimateItem(laraitem);
motorbike->revs = 0; motorbike->revs = 0;
item->collidable = TRUE; item->collidable = true;
} }
else else
{ {
@ -500,11 +500,11 @@ static int MotorBikeCheckGetOff(void)
Lara.Vehicle = NO_ITEM; Lara.Vehicle = NO_ITEM;
Lara.gunStatus = LG_NO_ARMS; Lara.gunStatus = LG_NO_ARMS;
DashTimer = 120; DashTimer = 120;
return TRUE; return true;
} }
if (LaraItem->frameNumber != Anims[LaraItem->animNumber].frameEnd) if (LaraItem->frameNumber != Anims[LaraItem->animNumber].frameEnd)
return TRUE; return true;
// exit when falling // exit when falling
// if (LaraItem->state_current == BIKE_EMPTY6) { // if (LaraItem->state_current == BIKE_EMPTY6) {
@ -514,7 +514,7 @@ static int MotorBikeCheckGetOff(void)
// lara death when falling too much // lara death when falling too much
// } // }
return FALSE; return false;
} }
static int DoMotorBikeDynamics(int height, int fallspeed, int* y, int flags) static int DoMotorBikeDynamics(int height, int fallspeed, int* y, int flags)
@ -705,7 +705,7 @@ static int MotorBikeDynamics(ITEM_INFO* item)
if (anglex < 0) if (anglex < 0)
anglex2 = -anglex; anglex2 = -anglex;
if (anglex2 > 24) if (anglex2 > 24)
NoGetOff = TRUE; NoGetOff = true;
anglex *= 16; anglex *= 16;
motorbike->velocity -= anglex; motorbike->velocity -= anglex;
} }
@ -714,7 +714,7 @@ static int MotorBikeDynamics(ITEM_INFO* item)
if (abs(anglez) > 32) if (abs(anglez) > 32)
{ {
short ang, angabs; short ang, angabs;
NoGetOff = TRUE; NoGetOff = true;
if (anglez >= 0) if (anglez >= 0)
ang = item->pos.yRot + 0x4000; ang = item->pos.yRot + 0x4000;
else else
@ -814,7 +814,7 @@ static int MotorBikeDynamics(ITEM_INFO* item)
if (&Items[Lara.Vehicle] == item && motorbike->velocity >= 0x8000 && newspeed < (motorbike->velocity - 10)) if (&Items[Lara.Vehicle] == item && motorbike->velocity >= 0x8000 && newspeed < (motorbike->velocity - 10))
{ {
LaraItem->hitPoints -= (motorbike->velocity - newspeed) >> 7; LaraItem->hitPoints -= (motorbike->velocity - newspeed) >> 7;
LaraItem->hitStatus = TRUE; LaraItem->hitStatus = true;
} }
if (motorbike->velocity > 0 && newspeed < motorbike->velocity) if (motorbike->velocity > 0 && newspeed < motorbike->velocity)
@ -847,17 +847,17 @@ static BOOL MotorbikeCanGetOff(void)
floor = GetFloor(x, y, z, &room_number); floor = GetFloor(x, y, z, &room_number);
height = GetFloorHeight(floor, x, y, z); height = GetFloorHeight(floor, x, y, z);
if (HeightType == BIG_SLOPE || HeightType == DIAGONAL || height == -NO_HEIGHT) if (HeightType == BIG_SLOPE || HeightType == DIAGONAL || height == -NO_HEIGHT)
return FALSE; return false;
if (abs(height - item->pos.yPos) > STEP_SIZE) if (abs(height - item->pos.yPos) > STEP_SIZE)
return FALSE; return false;
ceiling = GetCeiling(floor, x, y, z); ceiling = GetCeiling(floor, x, y, z);
if ((ceiling - item->pos.yPos) > -LARA_HITE) if ((ceiling - item->pos.yPos) > -LARA_HITE)
return FALSE; return false;
if ((height - ceiling) < LARA_HITE) if ((height - ceiling) < LARA_HITE)
return FALSE; return false;
return TRUE; return true;
} }
static void AnimateMotorbike(ITEM_INFO* item, int collide, BOOL dead) static void AnimateMotorbike(ITEM_INFO* item, int collide, BOOL dead)
@ -1239,7 +1239,7 @@ void SetLaraOnMotorBike(ITEM_INFO* item, ITEM_INFO* laraitem)
laraitem->goalAnimState = BIKE_IDLE; laraitem->goalAnimState = BIKE_IDLE;
laraitem->animNumber = Objects[ID_MOTORBIKE_LARA_ANIMS].animIndex + BIKE_IDLE_ANIM; laraitem->animNumber = Objects[ID_MOTORBIKE_LARA_ANIMS].animIndex + BIKE_IDLE_ANIM;
laraitem->frameNumber = Anims[laraitem->animNumber].frameBase; laraitem->frameNumber = Anims[laraitem->animNumber].frameBase;
laraitem->gravityStatus = FALSE; laraitem->gravityStatus = false;
item->animNumber = laraitem->animNumber + (Objects[ID_MOTORBIKE].animIndex - Objects[ID_MOTORBIKE_LARA_ANIMS].animIndex); item->animNumber = laraitem->animNumber + (Objects[ID_MOTORBIKE].animIndex - Objects[ID_MOTORBIKE_LARA_ANIMS].animIndex);
item->frameNumber = laraitem->frameNumber + (Anims[ID_MOTORBIKE].frameBase - Anims[ID_MOTORBIKE_LARA_ANIMS].frameBase); item->frameNumber = laraitem->frameNumber + (Anims[ID_MOTORBIKE].frameBase - Anims[ID_MOTORBIKE_LARA_ANIMS].frameBase);
item->hitPoints = 1; item->hitPoints = 1;
@ -1279,11 +1279,11 @@ int MotorbikeControl(void)
if (LaraItem->hitPoints <= 0) if (LaraItem->hitPoints <= 0)
{ {
TrInput &= ~(IN_LEFT | IN_RIGHT | IN_BACK | IN_FORWARD); TrInput &= ~(IN_LEFT | IN_RIGHT | IN_BACK | IN_FORWARD);
dead = TRUE; dead = true;
} }
else else
{ {
dead = FALSE; dead = false;
} }
if (motorbike->flags) if (motorbike->flags)

View file

@ -57,7 +57,7 @@
#include "setup.h" #include "setup.h"
#include "level.h" #include "level.h"
static void StartBaddy(ObjectInfo* obj) static void StartBaddy(OBJECT_INFO* obj)
{ {
obj = &Objects[ID_SMALL_SCORPION]; obj = &Objects[ID_SMALL_SCORPION];
if (obj->loaded) if (obj->loaded)
@ -558,12 +558,12 @@ static void StartBaddy(ObjectInfo* obj)
obj->hitPoints = NOT_TARGETABLE; obj->hitPoints = NOT_TARGETABLE;
obj->pivotLength = 50; obj->pivotLength = 50;
obj->radius = 128; obj->radius = 128;
obj->intelligent = TRUE; obj->intelligent = true;
obj->saveAnim = TRUE; obj->saveAnim = true;
obj->saveFlags = TRUE; obj->saveFlags = true;
obj->saveMesh = TRUE; obj->saveMesh = true;
obj->savePosition = TRUE; obj->savePosition = true;
obj->undead = TRUE; obj->undead = true;
obj->hitEffect = HIT_SMOKE; obj->hitEffect = HIT_SMOKE;
obj->zoneType = ZONE_WATER; obj->zoneType = ZONE_WATER;
Bones[obj->boneIndex + 6 * 4] |= ROT_Y | ROT_X; Bones[obj->boneIndex + 6 * 4] |= ROT_Y | ROT_X;
@ -576,7 +576,7 @@ static void StartBaddy(ObjectInfo* obj)
obj->initialise = InitialiseLocust; obj->initialise = InitialiseLocust;
obj->control = LocustControl; obj->control = LocustControl;
obj->drawRoutine = NULL; obj->drawRoutine = NULL;
obj->saveFlags = TRUE; obj->saveFlags = true;
obj->zoneType = ZONE_BASIC; obj->zoneType = ZONE_BASIC;
} }
@ -587,7 +587,7 @@ static void StartBaddy(ObjectInfo* obj)
} }
} }
static void StartObject(ObjectInfo* obj) static void StartObject(OBJECT_INFO* obj)
{ {
obj = &Objects[ID_SARCOPHAGUS]; obj = &Objects[ID_SARCOPHAGUS];
if (obj->loaded) if (obj->loaded)
@ -599,7 +599,7 @@ static void StartObject(ObjectInfo* obj)
} }
} }
static void StartTrap(ObjectInfo* obj) static void StartTrap(OBJECT_INFO* obj)
{ {
obj = &Objects[ID_CHAIN]; obj = &Objects[ID_CHAIN];
if (obj->loaded) if (obj->loaded)
@ -757,7 +757,7 @@ static void StartTrap(ObjectInfo* obj)
} }
} }
static void StartVehicles(ObjectInfo* obj) static void StartVehicles(OBJECT_INFO* obj)
{ {
obj = &Objects[ID_JEEP]; obj = &Objects[ID_JEEP];
if (obj->loaded) if (obj->loaded)
@ -782,12 +782,12 @@ static void StartVehicles(ObjectInfo* obj)
} }
} }
static void StartSwitch(ObjectInfo* obj) static void StartSwitch(OBJECT_INFO* obj)
{ {
} }
static ObjectInfo* objToInit; static OBJECT_INFO* objToInit;
void InitialiseTR4Objects() void InitialiseTR4Objects()
{ {
StartBaddy(objToInit); StartBaddy(objToInit);

View file

@ -83,7 +83,7 @@ void HitmanControl(short itemNumber)
{ {
ITEM_INFO* item = &Items[itemNumber]; ITEM_INFO* item = &Items[itemNumber];
CREATURE_INFO* creature = (CREATURE_INFO*)item->data; CREATURE_INFO* creature = (CREATURE_INFO*)item->data;
ObjectInfo* obj = &Objects[item->objectNumber]; OBJECT_INFO* obj = &Objects[item->objectNumber];
short angle = 0; short angle = 0;
short joint2 = 0; short joint2 = 0;

View file

@ -36,7 +36,7 @@ void Tr5DogControl(short itemNumber)
ITEM_INFO* item = &Items[itemNumber]; ITEM_INFO* item = &Items[itemNumber];
CREATURE_INFO* creature = (CREATURE_INFO*)item->data; CREATURE_INFO* creature = (CREATURE_INFO*)item->data;
ObjectInfo* obj = &Objects[item->objectNumber]; OBJECT_INFO* obj = &Objects[item->objectNumber];
if (item->hitPoints <= 0) if (item->hitPoints <= 0)
{ {

View file

@ -46,7 +46,7 @@ void LagoonWitchControl(short itemNumber)
ITEM_INFO* item = &Items[itemNumber]; ITEM_INFO* item = &Items[itemNumber];
CREATURE_INFO* creature = (CREATURE_INFO*)item->data; CREATURE_INFO* creature = (CREATURE_INFO*)item->data;
ObjectInfo* obj = &Objects[item->objectNumber]; OBJECT_INFO* obj = &Objects[item->objectNumber];
if (item->hitPoints <= 0) if (item->hitPoints <= 0)
{ {

View file

@ -17,7 +17,7 @@ void InitialiseTwoBlocksPlatform(short itemNumber)
BOOL IsOnTwoBlocksPlatform(ITEM_INFO* item, int x, int z) BOOL IsOnTwoBlocksPlatform(ITEM_INFO* item, int x, int z)
{ {
if (!item->meshBits) if (!item->meshBits)
return FALSE; return false;
short angle = item->pos.yRot; short angle = item->pos.yRot;
int xb = x >> WALL_SHIFT; int xb = x >> WALL_SHIFT;
@ -26,15 +26,15 @@ BOOL IsOnTwoBlocksPlatform(ITEM_INFO* item, int x, int z)
int itemzb = item->pos.zPos >> WALL_SHIFT; int itemzb = item->pos.zPos >> WALL_SHIFT;
if (!angle && (xb == itemxb || xb == itemxb - 1) && (zb == itemzb || zb == itemzb + 1)) if (!angle && (xb == itemxb || xb == itemxb - 1) && (zb == itemzb || zb == itemzb + 1))
return TRUE; return true;
if (angle == -ANGLE(180) && (xb == itemxb || xb == itemxb + 1) && (zb == itemzb || zb == itemzb - 1)) if (angle == -ANGLE(180) && (xb == itemxb || xb == itemxb + 1) && (zb == itemzb || zb == itemzb - 1))
return TRUE; return true;
if (angle == ANGLE(90) && (zb == itemzb || zb == itemzb - 1) && (xb == itemxb || xb == itemxb + 1)) if (angle == ANGLE(90) && (zb == itemzb || zb == itemzb - 1) && (xb == itemxb || xb == itemxb + 1))
return TRUE; return true;
if (angle == -ANGLE(90) && (zb == itemzb || zb == itemzb - 1) && (xb == itemxb || xb == itemxb - 1)) if (angle == -ANGLE(90) && (zb == itemzb || zb == itemzb - 1) && (xb == itemxb || xb == itemxb - 1))
return TRUE; return true;
return FALSE; return false;
} }
void TwoBlocksPlatformFloor(ITEM_INFO* item, int x, int y, int z, int* height) void TwoBlocksPlatformFloor(ITEM_INFO* item, int x, int y, int z, int* height)

View file

@ -65,7 +65,7 @@
/// register objects /// register objects
#include "object_helper.h" #include "object_helper.h"
static void StartBaddy(ObjectInfo* obj) static void StartBaddy(OBJECT_INFO* obj)
{ {
obj = &Objects[ID_LARA]; obj = &Objects[ID_LARA];
if (obj->loaded) if (obj->loaded)
@ -869,13 +869,13 @@ static void StartBaddy(ObjectInfo* obj)
obj->saveAnim = true; obj->saveAnim = true;
obj->zoneType = ZONE_BASIC; obj->zoneType = ZONE_BASIC;
obj->hitEffect = HIT_BLOOD; obj->hitEffect = HIT_BLOOD;
obj->castShadows = TRUE; obj->castShadows = true;
obj->hitPoints = 100; obj->hitPoints = 100;
} }
} }
static void StartObject(ObjectInfo* obj) static void StartObject(OBJECT_INFO* obj)
{ {
InitPickupItem(obj, FlareControl, ID_FLARE_ITEM); InitPickupItem(obj, FlareControl, ID_FLARE_ITEM);
InitPickupItem(obj, TorchControl, ID_BURNING_TORCH_ITEM, true); InitPickupItem(obj, TorchControl, ID_BURNING_TORCH_ITEM, true);
@ -1024,7 +1024,7 @@ static void StartObject(ObjectInfo* obj)
} }
} }
static void StartTrap(ObjectInfo* obj) static void StartTrap(OBJECT_INFO* obj)
{ {
obj = &Objects[ID_ZIPLINE_HANDLE]; obj = &Objects[ID_ZIPLINE_HANDLE];
if (obj->loaded) if (obj->loaded)
@ -1144,7 +1144,7 @@ static void StartTrap(ObjectInfo* obj)
} }
} }
static void StartSwitch(ObjectInfo* obj) static void StartSwitch(OBJECT_INFO* obj)
{ {
obj = &Objects[ID_COG_SWITCH]; obj = &Objects[ID_COG_SWITCH];
if (obj->loaded) if (obj->loaded)
@ -1166,13 +1166,13 @@ static void StartSwitch(ObjectInfo* obj)
} }
} }
static void StartShatter(ObjectInfo* obj) static void StartShatter(OBJECT_INFO* obj)
{ {
for (int i = ID_SMASH_OBJECT1; i <= ID_SMASH_OBJECT16; i++) for (int i = ID_SMASH_OBJECT1; i <= ID_SMASH_OBJECT16; i++)
InitSmashObject(obj, i); InitSmashObject(obj, i);
} }
static void StartProjectiles(ObjectInfo* obj) static void StartProjectiles(OBJECT_INFO* obj)
{ {
InitProjectile(obj, BubblesControl, ID_ENERGY_BUBBLES, true); InitProjectile(obj, BubblesControl, ID_ENERGY_BUBBLES, true);
InitProjectile(obj, MissileControl, ID_BUBBLES, true); InitProjectile(obj, MissileControl, ID_BUBBLES, true);
@ -1183,7 +1183,7 @@ static void StartProjectiles(ObjectInfo* obj)
InitProjectile(obj, ControlCrossbowBolt, ID_CROSSBOW_BOLT); InitProjectile(obj, ControlCrossbowBolt, ID_CROSSBOW_BOLT);
} }
static void StartPickup(ObjectInfo* obj) static void StartPickup(OBJECT_INFO* obj)
{ {
for (int objNumber = ID_PUZZLE_ITEM1; objNumber <= ID_EXAMINE8_COMBO2; objNumber++) for (int objNumber = ID_PUZZLE_ITEM1; objNumber <= ID_EXAMINE8_COMBO2; objNumber++)
{ {
@ -1229,7 +1229,7 @@ static void StartPickup(ObjectInfo* obj)
InitPickup(obj, ID_GOLDROSE_ITEM); InitPickup(obj, ID_GOLDROSE_ITEM);
} }
static ObjectInfo* objToInit; static OBJECT_INFO* objToInit;
void InitialiseTR5Objects() void InitialiseTR5Objects()
{ {
StartBaddy(objToInit); StartBaddy(objToInit);

View file

@ -7,7 +7,7 @@
#include "tr5_smashobject.h" #include "tr5_smashobject.h"
#include "tr5_pushableblock.h" #include "tr5_pushableblock.h"
using std::function; using std::function;
void InitSmashObject(ObjectInfo* obj, int objectNumber) void InitSmashObject(OBJECT_INFO* obj, int objectNumber)
{ {
obj = &Objects[objectNumber]; obj = &Objects[objectNumber];
if (obj->loaded) if (obj->loaded)
@ -21,7 +21,7 @@ void InitSmashObject(ObjectInfo* obj, int objectNumber)
} }
} }
void InitKeyHole(ObjectInfo* obj, int objectNumber) void InitKeyHole(OBJECT_INFO* obj, int objectNumber)
{ {
obj = &Objects[objectNumber]; obj = &Objects[objectNumber];
if (obj->loaded) if (obj->loaded)
@ -31,7 +31,7 @@ void InitKeyHole(ObjectInfo* obj, int objectNumber)
} }
} }
void InitPuzzleHole(ObjectInfo* obj, int objectNumber) void InitPuzzleHole(OBJECT_INFO* obj, int objectNumber)
{ {
obj = &Objects[objectNumber]; obj = &Objects[objectNumber];
if (obj->loaded) if (obj->loaded)
@ -44,7 +44,7 @@ void InitPuzzleHole(ObjectInfo* obj, int objectNumber)
} }
} }
void InitPuzzleDone(ObjectInfo* obj, int objectNumber) void InitPuzzleDone(OBJECT_INFO* obj, int objectNumber)
{ {
obj = &Objects[objectNumber]; obj = &Objects[objectNumber];
if (obj->loaded) if (obj->loaded)
@ -56,7 +56,7 @@ void InitPuzzleDone(ObjectInfo* obj, int objectNumber)
} }
} }
void InitAnimating(ObjectInfo* obj, int objectNumber) void InitAnimating(OBJECT_INFO* obj, int objectNumber)
{ {
obj = &Objects[objectNumber]; obj = &Objects[objectNumber];
if (obj->loaded) if (obj->loaded)
@ -72,7 +72,7 @@ void InitAnimating(ObjectInfo* obj, int objectNumber)
} }
} }
void InitPickup(ObjectInfo* obj, int objectNumber) void InitPickup(OBJECT_INFO* obj, int objectNumber)
{ {
obj = &Objects[objectNumber]; obj = &Objects[objectNumber];
if (obj->loaded) if (obj->loaded)
@ -86,7 +86,7 @@ void InitPickup(ObjectInfo* obj, int objectNumber)
} }
} }
void InitPickupItem(ObjectInfo* obj, function<InitFunction> func, int objectNumber, bool useDrawAnimItem) void InitPickupItem(OBJECT_INFO* obj, function<InitFunction> func, int objectNumber, bool useDrawAnimItem)
{ {
obj = &Objects[objectNumber]; obj = &Objects[objectNumber];
if (obj->loaded) if (obj->loaded)
@ -109,7 +109,7 @@ void InitPickupItem(ObjectInfo* obj, function<InitFunction> func, int objectNumb
} }
} }
void InitProjectile(ObjectInfo* obj, function<InitFunction> func, int objectNumber, bool noLoad) void InitProjectile(OBJECT_INFO* obj, function<InitFunction> func, int objectNumber, bool noLoad)
{ {
obj = &Objects[objectNumber]; obj = &Objects[objectNumber];
if (obj->loaded || noLoad) if (obj->loaded || noLoad)
@ -123,7 +123,7 @@ void InitProjectile(ObjectInfo* obj, function<InitFunction> func, int objectNumb
} }
} }
void InitSearchObject(ObjectInfo* obj, int objectNumber) void InitSearchObject(OBJECT_INFO* obj, int objectNumber)
{ {
obj = &Objects[objectNumber]; obj = &Objects[objectNumber];
if (obj->loaded) if (obj->loaded)
@ -135,7 +135,7 @@ void InitSearchObject(ObjectInfo* obj, int objectNumber)
} }
} }
void InitPushableObject(ObjectInfo* obj, int objectNumber) void InitPushableObject(OBJECT_INFO* obj, int objectNumber)
{ {
obj = &Objects[objectNumber]; obj = &Objects[objectNumber];
if (obj->loaded) if (obj->loaded)

View file

@ -3,13 +3,13 @@
#define InitFunction void(short itemNumber) #define InitFunction void(short itemNumber)
void InitSmashObject(ObjectInfo* obj, int objectNumber); void InitSmashObject(OBJECT_INFO* obj, int objectNumber);
void InitKeyHole(ObjectInfo* obj, int objectNumber); void InitKeyHole(OBJECT_INFO* obj, int objectNumber);
void InitPuzzleHole(ObjectInfo* obj, int objectNumber); void InitPuzzleHole(OBJECT_INFO* obj, int objectNumber);
void InitPuzzleDone(ObjectInfo* obj, int objectNumber); void InitPuzzleDone(OBJECT_INFO* obj, int objectNumber);
void InitAnimating(ObjectInfo* obj, int objectNumber); void InitAnimating(OBJECT_INFO* obj, int objectNumber);
void InitPickup(ObjectInfo* obj, int objectNumber); void InitPickup(OBJECT_INFO* obj, int objectNumber);
void InitPickupItem(ObjectInfo* obj, std::function<InitFunction> func, int objectNumber, bool useDrawAnimItem = false); void InitPickupItem(OBJECT_INFO* obj, std::function<InitFunction> func, int objectNumber, bool useDrawAnimItem = false);
void InitProjectile(ObjectInfo* obj, std::function<InitFunction> func, int objectNumber, bool noLoad = false); void InitProjectile(OBJECT_INFO* obj, std::function<InitFunction> func, int objectNumber, bool noLoad = false);
void InitSearchObject(ObjectInfo* obj, int objectNumber); void InitSearchObject(OBJECT_INFO* obj, int objectNumber);
void InitPushableObject(ObjectInfo* obj, int objectNumber); void InitPushableObject(OBJECT_INFO* obj, int objectNumber);

View file

@ -128,7 +128,7 @@ namespace T5M::Renderer
// Update waterfalls textures // Update waterfalls textures
/*for (int i = ID_WATERFALL1; i <= ID_WATERFALLSS2; i++) { /*for (int i = ID_WATERFALL1; i <= ID_WATERFALLSS2; i++) {
ObjectInfo* obj = &Objects[i]; OBJECT_INFO* obj = &Objects[i];
if (obj->loaded) { if (obj->loaded) {
RendererObject* waterfall = m_moveableObjects[i]; RendererObject* waterfall = m_moveableObjects[i];
@ -262,7 +262,7 @@ namespace T5M::Renderer
if (!force && itemToDraw->DoneAnimations) if (!force && itemToDraw->DoneAnimations)
return; return;
ObjectInfo *obj = &Objects[item->objectNumber]; OBJECT_INFO *obj = &Objects[item->objectNumber];
RendererObject &moveableObj = *m_moveableObjects[item->objectNumber]; RendererObject &moveableObj = *m_moveableObjects[item->objectNumber];
// Update animation matrices // Update animation matrices
@ -458,9 +458,10 @@ namespace T5M::Renderer
vertex.Color.w = 1.0f; vertex.Color.w = 1.0f;
vertex.Bone = meshPtr->bones[v]; vertex.Bone = meshPtr->bones[v];
vertex.OriginalIndex = v;
//vertex.Bone = boneIndex; //vertex.Bone = boneIndex;
if (isHairs) /*if (isHairs)
vertex.Bone = v; vertex.Bone = v;*/
bucket->Vertices.push_back(vertex); bucket->Vertices.push_back(vertex);
} }

View file

@ -63,7 +63,7 @@ namespace T5M::Renderer
DirectX::SimpleMath::Vector4 Color; DirectX::SimpleMath::Vector4 Color;
float Bone; float Bone;
int IndexInPoly; int IndexInPoly;
//int OriginalIndex; int OriginalIndex;
}; };

View file

@ -316,7 +316,7 @@ namespace T5M::Renderer
for (int i = 0; i < MoveablesIds.size(); i++) for (int i = 0; i < MoveablesIds.size(); i++)
{ {
int objNum = MoveablesIds[i]; int objNum = MoveablesIds[i];
ObjectInfo *obj = &Objects[objNum]; OBJECT_INFO *obj = &Objects[objNum];
if (obj->nmeshes > 0) if (obj->nmeshes > 0)
{ {
@ -516,28 +516,86 @@ namespace T5M::Renderer
} }
} }
} }
else if (MoveablesIds[i] == ID_LARA_HAIR && skinPresent)
if (MoveablesIds[i] == ID_LARA_HAIR)
{ {
hairsPresent = true; hairsPresent = true;
for (int j = 0; j < moveable.ObjectMeshes.size(); j++)
for (int j = 0; j< obj->nmeshes;j++)
{ {
RendererMesh *mesh = moveable.ObjectMeshes[j]; RendererMesh* currentMesh = moveable.ObjectMeshes[j];
for (int n = 0; n < NUM_BUCKETS; n++) RendererBone* currentBone = moveable.LinearizedBones[j];
for (int b1 = 0; b1 < NUM_BUCKETS; b1++)
{ {
m_numHairVertices += mesh->Buckets[n].Vertices.size(); RendererBucket* currentBucket = &currentMesh->Buckets[b1];
m_numHairIndices += mesh->Buckets[n].Indices.size();
for (int v1 = 0; v1 < currentBucket->Vertices.size(); v1++)
{
RendererVertex* currentVertex = &currentBucket->Vertices[v1];
currentVertex->Bone = j + 1;
if (j == 0)
{
// Mesh 0 must be linked with head
int parentVertices[] = { 37,39,40,38 };
RendererObject& skinObj = *m_moveableObjects[ID_LARA_SKIN];
RendererMesh* parentMesh = skinObj.ObjectMeshes[LM_HEAD];
RendererBone* parentBone = skinObj.LinearizedBones[LM_HEAD];
if (currentVertex->OriginalIndex < 4)
{
for (int b2 = 0; b2 < NUM_BUCKETS; b2++)
{
RendererBucket* parentBucket = &parentMesh->Buckets[b2];
for (int v2 = 0; v2 < parentBucket->Vertices.size(); v2++)
{
RendererVertex* parentVertex = &parentBucket->Vertices[v2];
if (parentVertex->OriginalIndex == parentVertices[currentVertex->OriginalIndex])
{
currentVertex->Bone = 0;
currentVertex->Position = parentVertex->Position;
currentVertex->Normal = parentVertex->Normal;
}
}
}
}
}
else
{
// Meshes > 0 must be linked with hair parent meshes
RendererMesh* parentMesh = moveable.ObjectMeshes[j - 1];
RendererBone* parentBone = moveable.LinearizedBones[j - 1];
for (int b2 = 0; b2 < NUM_BUCKETS; b2++)
{
RendererBucket* parentBucket = &parentMesh->Buckets[b2];
for (int v2 = 0; v2 < parentBucket->Vertices.size(); v2++)
{
RendererVertex* parentVertex = &parentBucket->Vertices[v2];
int x1 = currentBucket->Vertices[v1].Position.x + currentBone->GlobalTranslation.x;
int y1 = currentBucket->Vertices[v1].Position.y + currentBone->GlobalTranslation.y;
int z1 = currentBucket->Vertices[v1].Position.z + currentBone->GlobalTranslation.z;
int x2 = parentBucket->Vertices[v2].Position.x + parentBone->GlobalTranslation.x;
int y2 = parentBucket->Vertices[v2].Position.y + parentBone->GlobalTranslation.y;
int z2 = parentBucket->Vertices[v2].Position.z + parentBone->GlobalTranslation.z;
if (abs(x1 - x2) < 2 && abs(y1 - y2) < 2 && abs(z1 - z2) < 2)
{
currentVertex->Bone = j;
currentVertex->Position = parentVertex->Position;
currentVertex->Normal = parentVertex->Normal;
break;
}
}
}
}
}
} }
} }
m_hairVertices.clear();
m_hairIndices.clear();
RendererVertex vertex;
for (int m = 0; m < m_numHairVertices * 2; m++)
m_hairVertices.push_back(vertex);
for (int m = 0; m < m_numHairIndices * 2; m++)
m_hairIndices.push_back(0);
} }
} }
@ -632,7 +690,7 @@ namespace T5M::Renderer
for (int i = 0; i < MoveablesIds.size(); i++) for (int i = 0; i < MoveablesIds.size(); i++)
{ {
ObjectInfo *obj = &Objects[MoveablesIds[i]]; OBJECT_INFO *obj = &Objects[MoveablesIds[i]];
if (obj->nmeshes < 0) if (obj->nmeshes < 0)
{ {

View file

@ -55,7 +55,7 @@ namespace T5M::Renderer
view = Matrix::CreateLookAt(Vector3(0.0f, 0.0f, 2048.0f), Vector3(0.0f, 0.0f, 0.0f), Vector3(0.0f, -1.0f, 0.0f)); view = Matrix::CreateLookAt(Vector3(0.0f, 0.0f, 2048.0f), Vector3(0.0f, 0.0f, 0.0f), Vector3(0.0f, -1.0f, 0.0f));
projection = Matrix::CreateOrthographic(ScreenWidth, ScreenHeight, -1024.0f, 1024.0f); projection = Matrix::CreateOrthographic(ScreenWidth, ScreenHeight, -1024.0f, 1024.0f);
ObjectInfo *obj = &Objects[objectNum]; OBJECT_INFO *obj = &Objects[objectNum];
RendererObject &moveableObj = *m_moveableObjects[objectNum]; RendererObject &moveableObj = *m_moveableObjects[objectNum];
if (obj->animIndex != -1) if (obj->animIndex != -1)
@ -414,7 +414,7 @@ namespace T5M::Renderer
if (gunshell->counter > 0) if (gunshell->counter > 0)
{ {
ObjectInfo *obj = &Objects[gunshell->objectNumber]; OBJECT_INFO *obj = &Objects[gunshell->objectNumber];
RendererObject &moveableObj = *m_moveableObjects[gunshell->objectNumber]; RendererObject &moveableObj = *m_moveableObjects[gunshell->objectNumber];
Matrix translation = Matrix::CreateTranslation(gunshell->pos.xPos, gunshell->pos.yPos, gunshell->pos.zPos); Matrix translation = Matrix::CreateTranslation(gunshell->pos.xPos, gunshell->pos.yPos, gunshell->pos.zPos);
@ -569,7 +569,7 @@ namespace T5M::Renderer
Matrix rotation = Matrix::CreateRotationY(TO_RAD(ring->objects[objectIndex].rotation + 16384 + g_Inventory.GetInventoryObject(inventoryObject)->rotY)); Matrix rotation = Matrix::CreateRotationY(TO_RAD(ring->objects[objectIndex].rotation + 16384 + g_Inventory.GetInventoryObject(inventoryObject)->rotY));
Matrix transform = (scale * rotation) * translation; Matrix transform = (scale * rotation) * translation;
ObjectInfo *obj = &Objects[objectNumber]; OBJECT_INFO *obj = &Objects[objectNumber];
if (!m_moveableObjects[objectNumber].has_value()) if (!m_moveableObjects[objectNumber].has_value())
continue; continue;
RendererObject &moveableObj = *m_moveableObjects[objectNumber]; RendererObject &moveableObj = *m_moveableObjects[objectNumber];
@ -1389,7 +1389,7 @@ namespace T5M::Renderer
if (Objects[ID_SPIDERS_EMITTER].loaded) if (Objects[ID_SPIDERS_EMITTER].loaded)
{ {
ObjectInfo* obj = &Objects[ID_SPIDERS_EMITTER]; OBJECT_INFO* obj = &Objects[ID_SPIDERS_EMITTER];
RendererObject* moveableObj = m_moveableObjects[ID_SPIDERS_EMITTER].get(); RendererObject* moveableObj = m_moveableObjects[ID_SPIDERS_EMITTER].get();
short* meshPtr = Meshes[Objects[ID_SPIDERS_EMITTER].meshIndex + ((Wibble >> 2) & 2)]; short* meshPtr = Meshes[Objects[ID_SPIDERS_EMITTER].meshIndex + ((Wibble >> 2) & 2)];
RendererMesh* mesh = m_meshPointersToMesh[meshPtr]; RendererMesh* mesh = m_meshPointersToMesh[meshPtr];
@ -1462,7 +1462,7 @@ namespace T5M::Renderer
if (Objects[ID_RATS_EMITTER].loaded) if (Objects[ID_RATS_EMITTER].loaded)
{ {
ObjectInfo *obj = &Objects[ID_RATS_EMITTER]; OBJECT_INFO *obj = &Objects[ID_RATS_EMITTER];
RendererObject &moveableObj = *m_moveableObjects[ID_RATS_EMITTER]; RendererObject &moveableObj = *m_moveableObjects[ID_RATS_EMITTER];
for (int m = 0; m < 32; m++) for (int m = 0; m < 32; m++)
@ -1513,7 +1513,7 @@ namespace T5M::Renderer
if (Objects[ID_BATS_EMITTER].loaded) if (Objects[ID_BATS_EMITTER].loaded)
{ {
ObjectInfo *obj = &Objects[ID_BATS_EMITTER]; OBJECT_INFO *obj = &Objects[ID_BATS_EMITTER];
RendererObject& moveableObj = *m_moveableObjects[ID_BATS_EMITTER]; RendererObject& moveableObj = *m_moveableObjects[ID_BATS_EMITTER];
RendererMesh *mesh = getMesh(Objects[ID_BATS_EMITTER].meshIndex + (-GlobalCounter & 3)); RendererMesh *mesh = getMesh(Objects[ID_BATS_EMITTER].meshIndex + (-GlobalCounter & 3));
@ -2189,7 +2189,7 @@ namespace T5M::Renderer
} }
RendererRoom &const room = m_rooms[item->Item->roomNumber]; RendererRoom &const room = m_rooms[item->Item->roomNumber];
RendererObject &moveableObj = *m_moveableObjects[item->Item->objectNumber]; RendererObject &moveableObj = *m_moveableObjects[item->Item->objectNumber];
ObjectInfo *obj = &Objects[item->Item->objectNumber]; OBJECT_INFO *obj = &Objects[item->Item->objectNumber];
m_stItem.World = item->World; m_stItem.World = item->World;
m_stItem.Position = Vector4(item->Item->pos.xPos, item->Item->pos.yPos, item->Item->pos.zPos, 1.0f); m_stItem.Position = Vector4(item->Item->pos.xPos, item->Item->pos.yPos, item->Item->pos.zPos, 1.0f);

View file

@ -490,7 +490,7 @@ namespace T5M::Renderer {
RendererObject& laraObj = *m_moveableObjects[ID_LARA]; RendererObject& laraObj = *m_moveableObjects[ID_LARA];
RendererObject& laraSkin = *m_moveableObjects[ID_LARA_SKIN]; RendererObject& laraSkin = *m_moveableObjects[ID_LARA_SKIN];
ObjectInfo* obj = &Objects[0]; OBJECT_INFO* obj = &Objects[0];
RendererRoom& const room = m_rooms[LaraItem->roomNumber]; RendererRoom& const room = m_rooms[LaraItem->roomNumber];
RendererItem* item = &m_items[Lara.itemNumber]; RendererItem* item = &m_items[Lara.itemNumber];
@ -538,7 +538,7 @@ namespace T5M::Renderer {
break; break;
} }
ObjectInfo* flashObj = &Objects[ID_GUN_FLASH]; OBJECT_INFO* flashObj = &Objects[ID_GUN_FLASH];
RendererObject& flashMoveable = *m_moveableObjects[ID_GUN_FLASH]; RendererObject& flashMoveable = *m_moveableObjects[ID_GUN_FLASH];
RendererMesh* flashMesh = flashMoveable.ObjectMeshes[0]; RendererMesh* flashMesh = flashMoveable.ObjectMeshes[0];
@ -594,7 +594,7 @@ namespace T5M::Renderer {
RendererItem* item = m_itemsToDraw[i]; RendererItem* item = m_itemsToDraw[i];
// Does the item need gunflash? // Does the item need gunflash?
ObjectInfo* obj = &Objects[item->Item->objectNumber]; OBJECT_INFO* obj = &Objects[item->Item->objectNumber];
if (obj->biteOffset == -1 || !item->Item->firedWeapon) if (obj->biteOffset == -1 || !item->Item->firedWeapon)
continue; continue;
@ -931,7 +931,7 @@ namespace T5M::Renderer {
for (int i = 0; i < m_effectsToDraw.size(); i++) { for (int i = 0; i < m_effectsToDraw.size(); i++) {
RendererEffect* effect = m_effectsToDraw[i]; RendererEffect* effect = m_effectsToDraw[i];
RendererRoom& const room = m_rooms[effect->Effect->roomNumber]; RendererRoom& const room = m_rooms[effect->Effect->roomNumber];
ObjectInfo* obj = &Objects[effect->Effect->objectNumber]; OBJECT_INFO* obj = &Objects[effect->Effect->objectNumber];
if (obj->drawRoutine && obj->loaded) if (obj->drawRoutine && obj->loaded)
drawEffect(effect, transparent); drawEffect(effect, transparent);

View file

@ -450,7 +450,7 @@ namespace T5M::Renderer
if (fx->objectNumber < 0) if (fx->objectNumber < 0)
continue; continue;
ObjectInfo *obj = &Objects[fx->objectNumber]; OBJECT_INFO *obj = &Objects[fx->objectNumber];
RendererEffect *newEffect = &m_effects[fxNum]; RendererEffect *newEffect = &m_effects[fxNum];

View file

@ -220,9 +220,9 @@ bool Renderer11::Initialise(int w, int h, int refreshRate, bool windowed, HWND h
} }
D3D11_BLEND_DESC blendStateDesc{}; D3D11_BLEND_DESC blendStateDesc{};
blendStateDesc.AlphaToCoverageEnable = FALSE; blendStateDesc.AlphaToCoverageEnable = false;
blendStateDesc.IndependentBlendEnable = FALSE; blendStateDesc.IndependentBlendEnable = false;
blendStateDesc.RenderTarget[0].BlendEnable = TRUE; blendStateDesc.RenderTarget[0].BlendEnable = true;
blendStateDesc.RenderTarget[0].SrcBlend = D3D11_BLEND_SRC_ALPHA; blendStateDesc.RenderTarget[0].SrcBlend = D3D11_BLEND_SRC_ALPHA;
blendStateDesc.RenderTarget[0].DestBlend = D3D11_BLEND_INV_SRC_ALPHA; blendStateDesc.RenderTarget[0].DestBlend = D3D11_BLEND_INV_SRC_ALPHA;
blendStateDesc.RenderTarget[0].BlendOp = D3D11_BLEND_OP_REV_SUBTRACT; blendStateDesc.RenderTarget[0].BlendOp = D3D11_BLEND_OP_REV_SUBTRACT;

View file

@ -9,6 +9,7 @@
#include "sphere.h" #include "sphere.h"
#include "level.h" #include "level.h"
#include "GameFlowScript.h" #include "GameFlowScript.h"
#include <Specific\setup.h>
using namespace T5M::Renderer; using namespace T5M::Renderer;
extern GameFlow *g_GameFlow; extern GameFlow *g_GameFlow;
@ -135,137 +136,6 @@ void Renderer11::UpdateLaraAnimations(bool force)
for (int m = 0; m < 15; m++) for (int m = 0; m < 15; m++)
laraObj.AnimationTransforms[m] = item->AnimationTransforms[m]; laraObj.AnimationTransforms[m] = item->AnimationTransforms[m];
// At this point, Lara's matrices are ready. Now let's do ponytails...
// TODO: disabled for now
if (m_moveableObjects[ID_LARA_HAIR].has_value())
{
RendererObject& hairsObj = *m_moveableObjects[ID_LARA_HAIR];
lastMatrix = Matrix::Identity;
identity = Matrix::Identity;
Vector3 parentVertices[6][4];
Matrix headMatrix;
RendererObject& objSkin = *m_moveableObjects[ID_LARA_SKIN];
RendererObject& objLara = *m_moveableObjects[ID_LARA];
RendererMesh* parentMesh = objSkin.ObjectMeshes[LM_HEAD];
RendererBone* parentBone = objSkin.LinearizedBones[LM_HEAD];
world = objLara.AnimationTransforms[LM_HEAD] * m_LaraWorldMatrix;
int lastVertex = 0;
int lastIndex = 0;
GameScriptLevel* level = g_GameFlow->GetLevel(CurrentLevel);
for (int p = 0; p < ((level->LaraType == LARA_YOUNG) ? 2 : 1); p++)
{
// We can't use hardware skinning here, however hairs have just a few vertices so
// it's not so bad doing skinning in software
if (level->LaraType == LARA_YOUNG)
{
if (p == 1)
{
parentVertices[0][0] = Vector3::Transform(parentMesh->Positions[68], world);
parentVertices[0][1] = Vector3::Transform(parentMesh->Positions[69], world);
parentVertices[0][2] = Vector3::Transform(parentMesh->Positions[70], world);
parentVertices[0][3] = Vector3::Transform(parentMesh->Positions[71], world);
}
else
{
parentVertices[0][0] = Vector3::Transform(parentMesh->Positions[78], world);
parentVertices[0][1] = Vector3::Transform(parentMesh->Positions[78], world);
parentVertices[0][2] = Vector3::Transform(parentMesh->Positions[77], world);
parentVertices[0][3] = Vector3::Transform(parentMesh->Positions[76], world);
}
}
else
{
parentVertices[0][0] = Vector3::Transform(parentMesh->Positions[37], world);
parentVertices[0][1] = Vector3::Transform(parentMesh->Positions[39], world);
parentVertices[0][2] = Vector3::Transform(parentMesh->Positions[40], world);
parentVertices[0][3] = Vector3::Transform(parentMesh->Positions[38], world);
}
for (int i = 0; i < 6; i++)
{
RendererMesh* mesh = hairsObj.ObjectMeshes[i];
RendererBucket* bucket = &mesh->Buckets[RENDERER_BUCKET_SOLID];
translation = Matrix::CreateTranslation(Hairs[p][i + 1].pos.xPos, Hairs[p][i + 1].pos.yPos, Hairs[p][i + 1].pos.zPos);
rotation = Matrix::CreateFromYawPitchRoll(TO_RAD(Hairs[p][i + 1].pos.yRot), TO_RAD(Hairs[p][i + 1].pos.xRot), 0);
m_hairsMatrices[6 * p + i] = rotation * translation;
int baseVertex = lastVertex;
for (int j = 0; j < bucket->Vertices.size(); j++)
{
int oldVertexIndex = (int)bucket->Vertices[j].Bone;
if (oldVertexIndex < 4)
{
m_hairVertices[lastVertex].Position.x = parentVertices[i][oldVertexIndex].x;
m_hairVertices[lastVertex].Position.y = parentVertices[i][oldVertexIndex].y;
m_hairVertices[lastVertex].Position.z = parentVertices[i][oldVertexIndex].z;
m_hairVertices[lastVertex].UV.x = bucket->Vertices[j].UV.x;
m_hairVertices[lastVertex].UV.y = bucket->Vertices[j].UV.y;
Vector3 n = Vector3(bucket->Vertices[j].Normal.x, bucket->Vertices[j].Normal.y, bucket->Vertices[j].Normal.z);
n.Normalize();
n = Vector3::TransformNormal(n, m_hairsMatrices[6 * p + i]);
n.Normalize();
m_hairVertices[lastVertex].Normal.x = n.x;
m_hairVertices[lastVertex].Normal.y = n.y;
m_hairVertices[lastVertex].Normal.z = n.z;
m_hairVertices[lastVertex].Color = Vector4::One * 0.5f;
lastVertex++;
}
else
{
Vector3 in = Vector3(bucket->Vertices[j].Position.x, bucket->Vertices[j].Position.y, bucket->Vertices[j].Position.z);
Vector3 out = Vector3::Transform(in, m_hairsMatrices[6 * p + i]);
if (i < 5)
{
parentVertices[i + 1][oldVertexIndex - 4].x = out.x;
parentVertices[i + 1][oldVertexIndex - 4].y = out.y;
parentVertices[i + 1][oldVertexIndex - 4].z = out.z;
}
m_hairVertices[lastVertex].Position.x = out.x;
m_hairVertices[lastVertex].Position.y = out.y;
m_hairVertices[lastVertex].Position.z = out.z;
m_hairVertices[lastVertex].UV.x = bucket->Vertices[j].UV.x;
m_hairVertices[lastVertex].UV.y = bucket->Vertices[j].UV.y;
Vector3 n = Vector3(bucket->Vertices[j].Normal.x, bucket->Vertices[j].Normal.y, bucket->Vertices[j].Normal.z);
n.Normalize();
n = Vector3::TransformNormal(n, m_hairsMatrices[6 * p + i]);
n.Normalize();
m_hairVertices[lastVertex].Normal.x = n.x;
m_hairVertices[lastVertex].Normal.y = n.y;
m_hairVertices[lastVertex].Normal.z = n.z;
m_hairVertices[lastVertex].Color = Vector4::One * 0.5f;
lastVertex++;
}
}
for (int j = 0; j < bucket->Indices.size(); j++)
{
m_hairIndices[lastIndex] = baseVertex + bucket->Indices[j];
lastIndex++;
}
}
}
}
m_items[Lara.itemNumber].DoneAnimations = true; m_items[Lara.itemNumber].DoneAnimations = true;
} }
@ -371,19 +241,21 @@ bool Renderer11::drawLara(bool transparent, bool shadowMap)
} }
} }
if (!transparent) if (!transparent && Objects[ID_LARA_HAIR].loaded)
{ {
/*RendererObject& hairsObj = *m_moveableObjects[ID_LARA_HAIR]; RendererObject& hairsObj = *m_moveableObjects[ID_LARA_HAIR];
Matrix matrices[8]; // First matrix is Lara's head matrix, then all 6 hairs matrices. Bones are adjusted at load time for accounting this.
matrices[0] = (laraObj.AnimationTransforms.data())[LM_HEAD]; m_stItem.World = Matrix::Identity;
Matrix matrices[7];
matrices[0] = laraObj.AnimationTransforms[LM_HEAD] * m_LaraWorldMatrix;
for (int i = 0; i < hairsObj.BindPoseTransforms.size(); i++) for (int i = 0; i < hairsObj.BindPoseTransforms.size(); i++)
{ {
HAIR_STRUCT* hairs = &Hairs[0][i]; HAIR_STRUCT* hairs = &Hairs[0][i];
Matrix world = Matrix::CreateFromYawPitchRoll(TO_RAD(hairs->pos.yRot), TO_RAD(hairs->pos.xRot), TO_RAD(hairs->pos.zRot))* Matrix::CreateTranslation(hairs->pos.xPos-LaraItem->pos.xPos, hairs->pos.yPos - LaraItem->pos.yPos, hairs->pos.zPos - LaraItem->pos.zPos); Matrix world = Matrix::CreateFromYawPitchRoll(TO_RAD(hairs->pos.yRot), TO_RAD(hairs->pos.xRot), 0) * Matrix::CreateTranslation(hairs->pos.xPos, hairs->pos.yPos, hairs->pos.zPos);
matrices[i] = (laraObj.AnimationTransforms.data())[LM_HEAD] * world; matrices[i + 1] = world;
} }
memcpy(m_stItem.BonesMatrices, matrices, sizeof(Matrix) * 8); memcpy(m_stItem.BonesMatrices, matrices, sizeof(Matrix) * 7);
updateConstantBuffer<CItemBuffer>(m_cbItem, m_stItem); updateConstantBuffer<CItemBuffer>(m_cbItem, m_stItem);
m_context->VSSetConstantBuffers(1, 1, &m_cbItem); m_context->VSSetConstantBuffers(1, 1, &m_cbItem);
m_context->PSSetConstantBuffers(1, 1, &m_cbItem); m_context->PSSetConstantBuffers(1, 1, &m_cbItem);
@ -403,38 +275,7 @@ bool Renderer11::drawLara(bool transparent, bool shadowMap)
m_context->DrawIndexed(bucket->Indices.size(), bucket->StartIndex, 0); m_context->DrawIndexed(bucket->Indices.size(), bucket->StartIndex, 0);
m_numDrawCalls++; m_numDrawCalls++;
} }
}*/ }
/*for (int k = 0; k < laraSkin->ObjectMeshes.size(); k++)
{
RendererMesh* mesh = laraSkin.ObjectMeshes[k];
for (int j = 0; j < NUM_BUCKETS; j++)
{
RendererBucket* bucket = &mesh->Buckets[j];
if (bucket->Vertices.size() == 0)
continue;
// Draw vertices
m_context->DrawIndexed(bucket->Indices.size(), bucket->StartIndex, 0);
m_numDrawCalls++;
}
}*/
// Hairs are pre-transformed
Matrix matrices[8] = { Matrix::Identity, Matrix::Identity, Matrix::Identity, Matrix::Identity,
Matrix::Identity, Matrix::Identity, Matrix::Identity, Matrix::Identity };
memcpy(m_stItem.BonesMatrices, matrices, sizeof(Matrix) * 8);
m_stItem.World = Matrix::Identity;
updateConstantBuffer<CItemBuffer>(m_cbItem,m_stItem);
if (m_moveableObjects[ID_LARA_HAIR].has_value())
{
m_primitiveBatch->Begin();
m_primitiveBatch->DrawIndexed(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST, (const uint16_t*)m_hairIndices.data(), m_numHairIndices, m_hairVertices.data(), m_numHairVertices);
m_primitiveBatch->End();
}
} }
return true; return true;

View file

@ -195,7 +195,7 @@ int LoadItems()
void LoadObjects() void LoadObjects()
{ {
memset(Objects, 0, sizeof(ObjectInfo) * ID_NUMBER_OBJECTS); memset(Objects, 0, sizeof(OBJECT_INFO) * ID_NUMBER_OBJECTS);
memset(StaticObjects, 0, sizeof(StaticInfo) * MAX_STATICS); memset(StaticObjects, 0, sizeof(StaticInfo) * MAX_STATICS);
int numMeshes = ReadInt32(); int numMeshes = ReadInt32();

View file

@ -36,7 +36,7 @@ extern byte Sequences[3];
extern byte CurrentSequence; extern byte CurrentSequence;
extern int NumRPickups; extern int NumRPickups;
ObjectInfo Objects[ID_NUMBER_OBJECTS]; OBJECT_INFO Objects[ID_NUMBER_OBJECTS];
StaticInfo StaticObjects[MAX_STATICS]; StaticInfo StaticObjects[MAX_STATICS];
void InitialiseGameFlags() void InitialiseGameFlags()
@ -52,7 +52,7 @@ void InitialiseGameFlags()
void ObjectObjects() void ObjectObjects()
{ {
ObjectInfo* obj; OBJECT_INFO* obj;
obj = &Objects[ID_CAMERA_TARGET]; obj = &Objects[ID_CAMERA_TARGET];
if (obj->loaded) if (obj->loaded)
@ -617,7 +617,7 @@ void ObjectObjects()
void TrapObjects() void TrapObjects()
{ {
ObjectInfo* obj; OBJECT_INFO* obj;
obj = &Objects[ID_KILL_ALL_TRIGGERS]; obj = &Objects[ID_KILL_ALL_TRIGGERS];
if (obj->loaded) if (obj->loaded)
{ {
@ -795,7 +795,7 @@ void CustomObjects()
void InitialiseObjects() void InitialiseObjects()
{ {
ObjectInfo* obj; OBJECT_INFO* obj;
for (int i = 0; i < ID_NUMBER_OBJECTS; i++) for (int i = 0; i < ID_NUMBER_OBJECTS; i++)
{ {

View file

@ -12,7 +12,7 @@ typedef enum HitEffectEnum
MAX_HIT_EFFECT MAX_HIT_EFFECT
}; };
typedef struct ObjectInfo typedef struct OBJECT_INFO
{ {
short nmeshes; short nmeshes;
short meshIndex; short meshIndex;
@ -75,7 +75,7 @@ typedef struct StaticInfo
constexpr auto GRAVITY = 6; constexpr auto GRAVITY = 6;
constexpr auto SWAMP_GRAVITY = 2; constexpr auto SWAMP_GRAVITY = 2;
extern ObjectInfo Objects[ID_NUMBER_OBJECTS]; extern OBJECT_INFO Objects[ID_NUMBER_OBJECTS];
extern StaticInfo StaticObjects[MAX_STATICS]; extern StaticInfo StaticObjects[MAX_STATICS];
void InitialiseGameFlags(); void InitialiseGameFlags();