mirror of
https://github.com/XProger/OpenLara.git
synced 2025-08-21 12:21:33 +02:00
#3 fix align to movable block
This commit is contained in:
@@ -221,10 +221,33 @@ struct Controller {
|
|||||||
return vec3(angle.x, angle.y);
|
return vec3(angle.x, angle.y);
|
||||||
}
|
}
|
||||||
|
|
||||||
void alignToWall(float offset = 0.0f) {
|
bool alignToWall(float offset = 0.0f, int quadrant = -1, int maxDist = 0, int maxWidth = 0) {
|
||||||
int q = angleQuadrant(angle.y);
|
int q = angleQuadrant(angle.y);
|
||||||
int x = int(pos.x) & ~1023;
|
int ix = int(pos.x);
|
||||||
int z = int(pos.z) & ~1023;
|
int iz = int(pos.z);
|
||||||
|
int x = ix & ~1023;
|
||||||
|
int z = iz & ~1023;
|
||||||
|
|
||||||
|
if (quadrant > -1 && quadrant != q)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (maxDist) { // check dist
|
||||||
|
int dist = 0;
|
||||||
|
switch (q) {
|
||||||
|
case 0 : dist = z + 1024 - iz; break;
|
||||||
|
case 1 : dist = x + 1024 - ix; break;
|
||||||
|
case 2 : dist = iz - z; break;
|
||||||
|
case 3 : dist = ix - x; break;
|
||||||
|
}
|
||||||
|
if (dist > maxDist)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (maxWidth) {
|
||||||
|
int width = abs( ((q % 2) ? (iz - z) : (ix - x)) - 512);
|
||||||
|
if (width > maxWidth)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
switch (q) {
|
switch (q) {
|
||||||
case 0 : pos.z = z + 1024 + offset; break;
|
case 0 : pos.z = z + 1024 + offset; break;
|
||||||
@@ -235,6 +258,7 @@ struct Controller {
|
|||||||
|
|
||||||
angle.y = q * (PI * 0.5f);
|
angle.y = q * (PI * 0.5f);
|
||||||
updateEntity();
|
updateEntity();
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual Box getBoundingBox() {
|
virtual Box getBoundingBox() {
|
||||||
|
151
src/lara.h
151
src/lara.h
@@ -406,104 +406,25 @@ struct Lara : Character {
|
|||||||
|
|
||||||
if (level->extra.braid > -1)
|
if (level->extra.braid > -1)
|
||||||
braid = new Braid(this, vec3(-4.0f, 24.0f, -48.0f));
|
braid = new Braid(this, vec3(-4.0f, 24.0f, -48.0f));
|
||||||
/*
|
|
||||||
pos = vec3(40448, 3584, 60928);
|
|
||||||
angle = vec3(0.0f, PI * 0.5f, 0.0f);
|
|
||||||
getEntity().room = 14;
|
|
||||||
stand = STAND_ONWATER;
|
|
||||||
animation.setAnim(ANIM_TO_ONWATER);
|
|
||||||
updateEntity();
|
|
||||||
*/
|
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
/*
|
//reset(14, vec3(40448, 3584, 60928), PI * 0.5f); // gym (pool)
|
||||||
// gym
|
//stand = STAND_ONWATER;
|
||||||
pos = vec3(43182, 2473, 51556);
|
//animation.setAnim(ANIM_TO_ONWATER);
|
||||||
angle = vec3(0.0f, PI * 0.5f, 0.0f);
|
|
||||||
getEntity().room = 12;
|
|
||||||
|
|
||||||
// gym (pool)
|
//reset(14, vec3(20215, 6656, 52942), PI); // level 1 (bridge)
|
||||||
pos = vec3(40448, 3584, 60928);
|
//reset(15, vec3(70067, -256, 29104), -0.68f); // level 2 (pool)
|
||||||
angle = vec3(0.0f, PI * 0.5f, 0.0f);
|
//reset(61, vec3(27221, -1024, 29205), PI * 0.5f); // level 2 (blade)
|
||||||
getEntity().room = 14;
|
//reset(43, vec3(31400, -2560, 25200), PI); // level 2 (reach)
|
||||||
stand = STAND_ONWATER;
|
//reset(16, vec3(60907, 0, 39642), PI * 3 / 2); // level 2 (hang & climb)
|
||||||
animation.setAnim(ANIM_TO_ONWATER);
|
reset(19, vec3(60843, 1024, 30557), PI); // level 2 (block)
|
||||||
|
//reset(7, vec3(64108, -512, 16514), -PI * 0.5f); // level 2 (bat trigger)
|
||||||
// level 2 (pool)
|
//reset(15, vec3(70082, -512, 26935), PI * 0.5f); // level 2 (bear)
|
||||||
pos = vec3(70067, -256, 29104);
|
//reset(63, vec3(31390, -2048, 33472), 0.0f); // level 2 (trap floor)
|
||||||
angle = vec3(0.0f, -0.68f, 0.0f);
|
//reset(61, vec3(21987, -1024, 29144), PI * 3.0f * 0.5f); // level 2 (trap door)
|
||||||
getEntity().room = 15;
|
//reset(51, vec3(41015, 3584, 34494), -PI); // level 3a (t-rex)
|
||||||
|
//reset(5, vec3(38643, -3072, 92370), PI * 0.5f); // level 3a (gears)
|
||||||
// level 2 (blade)
|
//reset(0, vec3(40913, -1012, 42252), PI); // level 8c
|
||||||
pos = vec3(27221, -1024, 29205);
|
|
||||||
angle = vec3(0.0f, PI * 0.5f, 0.0f);
|
|
||||||
getEntity().room = 61;
|
|
||||||
|
|
||||||
// level 2 (wolf)
|
|
||||||
pos = vec3(75671, -1024, 22862);
|
|
||||||
angle = vec3(0.0f, -PI * 0.25f, 0.0f);
|
|
||||||
getEntity().room = 13;
|
|
||||||
|
|
||||||
// level 2 (reach)
|
|
||||||
pos = vec3(31400, -2560, 25200);
|
|
||||||
angle = vec3(0.0f, PI, 0.0f);
|
|
||||||
getEntity().room = 43;
|
|
||||||
|
|
||||||
// level 2 (hang & climb)
|
|
||||||
pos = vec3(60907, 0, 39642);
|
|
||||||
angle = vec3(0.0f, PI * 3 / 2, 0.0f);
|
|
||||||
getEntity().room = 16;
|
|
||||||
|
|
||||||
// level 2 (medikit)
|
|
||||||
pos = vec3(30800, -7936, 22131);
|
|
||||||
angle = vec3(0.0f, 0.0f, 0.0f);
|
|
||||||
getEntity().room = 58;
|
|
||||||
|
|
||||||
// level 2 (block)
|
|
||||||
pos = vec3(60843, 1024, 30557);
|
|
||||||
angle = vec3(0.0f, PI, 0.0f);
|
|
||||||
getEntity().room = 19;
|
|
||||||
|
|
||||||
// level 2 (bat trigger)
|
|
||||||
pos = vec3(64108, -512, 16514);
|
|
||||||
angle = vec3(0.0f, -PI * 0.5f, 0.0f);
|
|
||||||
getEntity().room = 7;
|
|
||||||
|
|
||||||
// level 2 (bear)
|
|
||||||
pos = vec3(70082, -512, 26935);
|
|
||||||
angle = vec3(0.0f, PI * 0.5f, 0.0f);
|
|
||||||
getEntity().room = 15;
|
|
||||||
|
|
||||||
// level 2 (trap floor)
|
|
||||||
pos = vec3(31390, -2048, 33472);
|
|
||||||
angle = vec3(0.0f, 0.0f, 0.0f);
|
|
||||||
getEntity().room = 63;
|
|
||||||
|
|
||||||
// level 2 (trap door)
|
|
||||||
pos = vec3(21987, -1024, 29144);
|
|
||||||
angle = vec3(0.0f, PI * 3.0f * 0.5f, 0.0f);
|
|
||||||
getEntity().room = 61;
|
|
||||||
|
|
||||||
// level 3a (t-rex)
|
|
||||||
pos = vec3(41015, 3584, 34494);
|
|
||||||
angle = vec3(0.0f, -PI, 0.0f);
|
|
||||||
getEntity().room = 51;
|
|
||||||
|
|
||||||
// level 3a (gears)
|
|
||||||
pos = vec3(38643, -3072, 92370);
|
|
||||||
angle = vec3(0.0f, PI * 0.5f, 0.0f);
|
|
||||||
getEntity().room = 5;
|
|
||||||
|
|
||||||
// level 1
|
|
||||||
pos = vec3(20215, 6656, 52942);
|
|
||||||
angle = vec3(0.0f, PI, 0.0f);
|
|
||||||
getEntity().room = 14;
|
|
||||||
|
|
||||||
// level 8c
|
|
||||||
pos = vec3(40913, -1012, 42252);
|
|
||||||
angle = vec3(0.0f, PI, 0.0f);
|
|
||||||
getEntity().room = 0;
|
|
||||||
*/
|
|
||||||
updateEntity();
|
|
||||||
#endif
|
#endif
|
||||||
chestOffset = animation.getJoints(getMatrix(), 7).pos;
|
chestOffset = animation.getJoints(getMatrix(), 7).pos;
|
||||||
}
|
}
|
||||||
@@ -512,6 +433,13 @@ struct Lara : Character {
|
|||||||
delete braid;
|
delete braid;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void reset(int room, const vec3 &pos, float angle) {
|
||||||
|
getEntity().room = room;
|
||||||
|
this->pos = pos;
|
||||||
|
this->angle = vec3(0.0f, angle, 0.0f);
|
||||||
|
updateEntity();
|
||||||
|
}
|
||||||
|
|
||||||
void wpnSet(Weapon::Type wType) {
|
void wpnSet(Weapon::Type wType) {
|
||||||
wpnCurrent = wType;
|
wpnCurrent = wType;
|
||||||
wpnState = Weapon::IS_FIRING;
|
wpnState = Weapon::IS_FIRING;
|
||||||
@@ -1435,28 +1363,39 @@ struct Lara : Character {
|
|||||||
return state;
|
return state;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int entityQuadrant(const TR::Entity &entity) {
|
||||||
|
int ix = int(pos.x) / 1024;
|
||||||
|
int iz = int(pos.z) / 1024;
|
||||||
|
|
||||||
|
int bx = entity.x / 1024;
|
||||||
|
int bz = entity.z / 1024;
|
||||||
|
|
||||||
|
int q = -1;
|
||||||
|
if (abs(bx - ix) ^ abs(bz - iz)) {
|
||||||
|
if (bx > ix) q = 1;
|
||||||
|
if (bx < ix) q = 3;
|
||||||
|
if (bz > iz) q = 0;
|
||||||
|
if (bz < iz) q = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
return q;
|
||||||
|
}
|
||||||
|
|
||||||
Block* getBlock() {
|
Block* getBlock() {
|
||||||
int x = (int)pos.x;
|
int y = int(pos.y);
|
||||||
int y = (int)pos.y;
|
|
||||||
int z = (int)pos.z;
|
|
||||||
|
|
||||||
for (int i = 0; i < level->entitiesCount; i++) {
|
for (int i = 0; i < level->entitiesCount; i++) {
|
||||||
TR::Entity &e = level->entities[i];
|
TR::Entity &e = level->entities[i];
|
||||||
if (e.isBlock() && e.y == y) {
|
|
||||||
int dx = abs(e.x - x);
|
|
||||||
int dz = abs(e.z - z);
|
|
||||||
if ((dx <= (512 + 128) && dz <= (512 - 128)) ||
|
|
||||||
(dx <= (512 - 128) && dz <= (512 + 128))) {
|
|
||||||
|
|
||||||
alignToWall(-LARA_RADIUS);
|
int q = entityQuadrant(e);
|
||||||
|
|
||||||
|
if (q > -1 && e.isBlock() && e.y == y && alignToWall(-LARA_RADIUS, q, 64 + LARA_RADIUS, 512 - LARA_RADIUS)) {
|
||||||
Block *block = (Block*)e.controller;
|
Block *block = (Block*)e.controller;
|
||||||
block->angle.y = angle.y;
|
block->angle.y = angle.y;
|
||||||
block->updateEntity();
|
block->updateEntity();
|
||||||
return block;
|
return block;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user