1
0
mirror of https://github.com/XProger/OpenLara.git synced 2025-08-17 18:36:43 +02:00

#3 draft of hang/reach animation, add animation effect command types

This commit is contained in:
XProger
2016-10-11 03:51:38 +03:00
parent f6cb9c5000
commit bf5c3a3232
3 changed files with 128 additions and 69 deletions

View File

@@ -103,7 +103,7 @@ struct Controller {
TR::Animation &anim = level->anims[animIndex]; TR::Animation &anim = level->anims[animIndex];
animTime = frame == -1 ? 0.0f : ((frame - anim.frameStart) / 30.0f); animTime = frame == -1 ? 0.0f : ((frame - anim.frameStart) / 30.0f);
ASSERT(anim.frameStart <= anim.frameEnd); ASSERT(anim.frameStart <= anim.frameEnd);
animPrevFrame = -1; animPrevFrame = int(animTime * 30.0f) - 1;
return state = anim.state; return state = anim.state;
} }
@@ -345,9 +345,9 @@ struct Controller {
return vec3((float)sx, (float)sy, (float)sz); return vec3((float)sx, (float)sy, (float)sz);
break; break;
} }
case TR::ANIM_CMD_SPEED : // cmd jump speed case TR::ANIM_CMD_SPEED : // cmd jump speed
case TR::ANIM_CMD_SOUND : // play sound case TR::ANIM_CMD_SOUND : // play sound
case TR::ANIM_CMD_SPECIAL : // special commands case TR::ANIM_CMD_EFFECT : // special commands
ptr += 2; ptr += 2;
break; break;
} }
@@ -394,28 +394,24 @@ struct Controller {
break; break;
case TR::ANIM_CMD_KILL : // kill case TR::ANIM_CMD_KILL : // kill
break; break;
case TR::ANIM_CMD_SOUND : { // play sound case TR::ANIM_CMD_SOUND : // play sound
case TR::ANIM_CMD_EFFECT : { // special commands
int frame = (*ptr++); int frame = (*ptr++);
int id = (*ptr++) & 0x3FFF; int id = (*ptr++) & 0x3FFF;
int idx = frame - anim->frameStart; int idx = frame - anim->frameStart;
if (idx > animPrevFrame && idx <= frameIndex) if (idx > animPrevFrame && idx <= frameIndex) {
playSound(id); if (cmd == TR::ANIM_CMD_EFFECT) {
switch (id) {
case TR::EFFECT_ROTATE_180 : angle.y = angle.y + PI; break;
case TR::EFFECT_LARA_BUBBLES : playSound(TR::SND_BUBBLE); break;
default : LOG("unknown special cmd %d (anim %d)\n", id, animIndex);
}
} else
playSound(id);
}
break; break;
} }
case TR::ANIM_CMD_SPECIAL : // special commands
if (frameIndex != animPrevFrame && frameIndex + anim->frameStart == ptr[0]) {
switch (ptr[1]) {
case TR::ANIM_CMD_SPECIAL_FLIP : angle.y = angle.y + PI; break;
case TR::ANIM_CMD_SPECIAL_BUBBLE : playSound(TR::SND_BUBBLE); break;
case TR::ANIM_CMD_SPECIAL_CTRL : LOG("water out ?\n"); break;
default : LOG("unknown special cmd %d\n", (int)ptr[1]);
}
}
ptr += 2;
break;
default :
LOG("unknown animation command %d\n", cmd);
} }
} }
} }

View File

@@ -22,14 +22,59 @@ namespace TR {
ANIM_CMD_EMPTY , ANIM_CMD_EMPTY ,
ANIM_CMD_KILL , ANIM_CMD_KILL ,
ANIM_CMD_SOUND , ANIM_CMD_SOUND ,
ANIM_CMD_SPECIAL , ANIM_CMD_EFFECT ,
}; };
// https://dl.dropboxusercontent.com/u/62482708/Secret/TR4%26TR5%20PSX%20Stuff.zip
enum { enum {
ANIM_CMD_SPECIAL_FLIP = 0, EFFECT_ROTATE_180 ,
ANIM_CMD_SPECIAL_BUBBLE = 3, EFFECT_FLOOR_SHAKE ,
ANIM_CMD_SPECIAL_CTRL = 12, EFFECT_LARA_NORMAL ,
}; EFFECT_LARA_BUBBLES ,
EFFECT_FINISH_LEVEL ,
EFFECT_ACTIVATE_CAMERA ,
EFFECT_ACTIVATE_KEY ,
EFFECT_RUBBLEFX ,
EFFECT_CROWBAR ,
EFFECT_CURTAINFX ,
EFFECT_SETCHANGEFX ,
EFFECT_EXPLOSION_FX ,
EFFECT_LARA_HANDSFREE ,
EFFECT_FLIP_MAP ,
EFFECT_DRAW_RIGHTGUN ,
EFFECT_DRAW_LEFTGUN ,
EFFECT_SHOOT_RIGHTGUN ,
EFFECT_SHOOT_LEFTGUN ,
EFFECT_MESH_SWAP1 ,
EFFECT_MESH_SWAP2 ,
EFFECT_MESH_SWAP3 ,
EFFECT_INV_ON ,
EFFECT_INV_OFF ,
EFFECT_DYN_ON ,
EFFECT_DYN_OFF ,
EFFECT_STATUEFX ,
EFFECT_RESET_HAIR ,
EFFECT_BOILERFX ,
EFFECT_SETFOG ,
EFFECT_GHOSTTRAP ,
EFFECT_LARALOCATION ,
EFFECT_CLEARSCARABS ,
EFFECT_FOOTPRINT_FX ,
EFFECT_FLIP_MAP0 ,
EFFECT_FLIP_MAP1 ,
EFFECT_FLIP_MAP2 ,
EFFECT_FLIP_MAP3 ,
EFFECT_FLIP_MAP4 ,
EFFECT_FLIP_MAP5 ,
EFFECT_FLIP_MAP6 ,
EFFECT_FLIP_MAP7 ,
EFFECT_FLIP_MAP8 ,
EFFECT_FLIP_MAP9 ,
EFFECT_POURSWAP1 ,
EFFECT_POURSWAP2 ,
EFFECT_LARALOCATIONPAD ,
EFFECT_KILLACTIVEBADDIES,
};
enum { enum {
SND_NO = 2, SND_NO = 2,

View File

@@ -29,6 +29,8 @@ struct Lara : Controller {
ANIM_CLIMB_JUMP = 26, ANIM_CLIMB_JUMP = 26,
ANIM_HANG_UP = 29,
ANIM_FALL = 34, ANIM_FALL = 34,
ANIM_SMASH_JUMP = 32, ANIM_SMASH_JUMP = 32,
@@ -48,6 +50,11 @@ struct Lara : Controller {
ANIM_BACK_DESCEND_RIGHT = 62, ANIM_BACK_DESCEND_RIGHT = 62,
ANIM_SLIDE_FORTH = 70, ANIM_SLIDE_FORTH = 70,
ANIM_HANG_FORTH = 96,
ANIM_STAND_NORMAL = 103,
ANIM_SLIDE_BACK = 105, ANIM_SLIDE_BACK = 105,
ANIM_WATER_FALL = 112, ANIM_WATER_FALL = 112,
@@ -82,7 +89,7 @@ struct Lara : Controller {
STATE_BACK, STATE_BACK,
STATE_SWIM, STATE_SWIM,
STATE_GLIDE, STATE_GLIDE,
STATE_HANG_JUMP, STATE_HANG_UP,
STATE_FAST_TURN, STATE_FAST_TURN,
STATE_STEP_RIGHT, STATE_STEP_RIGHT,
STATE_STEP_LEFT, STATE_STEP_LEFT,
@@ -305,30 +312,13 @@ struct Lara : Controller {
break; break;
} }
return vec3(0.0f, h, 0.0f); return vec3(0.0f, h, 0.0f);
/*
return offset;
*/
/*
switch (stand) {
case Controller::STAND_AIR :
case Controller::STAND_GROUND :
case Controller::STAND_SLIDE :
case Controller::STAND_HANG :
offset.y = 768.0f;
break;
case Controller::STAND_UNDERWATER :
case Controller::STAND_ONWATER :
offset.y = 256.0f;
break;
}*/
} }
virtual Stand getStand() { virtual Stand getStand() {
if (stand == STAND_HANG && (mask & ACTION))
return stand;
if (stand == STAND_ONWATER && state != STATE_DIVE && state != STATE_STOP) if (stand == STAND_ONWATER && state != STATE_DIVE && state != STATE_STOP)
return stand; return stand;
@@ -349,7 +339,7 @@ struct Lara : Controller {
int extra = stand != STAND_AIR ? 256 : 0; int extra = stand != STAND_AIR ? 256 : 0;
if (info.roomBelow == 0xFF && e.y + extra >= info.floor) if (stand != STAND_HANG && info.roomBelow == 0xFF && e.y + extra >= info.floor)
return STAND_GROUND; return STAND_GROUND;
return STAND_AIR; return STAND_AIR;
@@ -364,6 +354,21 @@ struct Lara : Controller {
virtual int getStateAir() { virtual int getStateAir() {
angle.x = 0.0f; angle.x = 0.0f;
if ((state == STATE_REACH || state == STATE_UP_JUMP) && (mask & ACTION)) {
vec3 p = pos + getDir() * 128.0f;
TR::Level::FloorInfo info;
level->getFloorInfo(getRoomIndex(), (int)p.x, (int)p.z, info);
if (abs(info.floor - (p.y - 768.0f + 64.0f)) < 32) {
turnToWall();
pos = pos - getDir() * 128.0f; // TODO: collision wall offset
pos.y = info.floor + 768.0f - 64.0f;
stand = STAND_HANG;
updateEntity();
return setAnimation(state == STATE_HANG ? ANIM_HANG_UP : ANIM_HANG_FORTH);
}
}
if (state == STATE_FORWARD_JUMP) { if (state == STATE_FORWARD_JUMP) {
if (mask & ACTION) return STATE_REACH; if (mask & ACTION) return STATE_REACH;
if ((mask & (FORTH | WALK)) == (FORTH | WALK)) return STATE_SWAN_DIVE; if ((mask & (FORTH | WALK)) == (FORTH | WALK)) return STATE_SWAN_DIVE;
@@ -423,17 +428,27 @@ struct Lara : Controller {
return STATE_STOP; return STATE_STOP;
} }
if ( (mask & (FORTH | ACTION)) == (FORTH | ACTION) ) { if ( (mask & (FORTH | ACTION)) == (FORTH | ACTION) && (animIndex == ANIM_STAND || animIndex == ANIM_STAND_NORMAL) ) {
vec3 p = pos + getDir() * 64.0f; vec3 p = pos + getDir() * 64.0f;
TR::Level::FloorInfo info; TR::Level::FloorInfo info;
level->getFloorInfo(getRoomIndex(), (int)p.x, (int)p.z, info); level->getFloorInfo(getRoomIndex(), (int)p.x, (int)p.z, info);
int h = (int)pos.y - info.floor; int h = (int)pos.y - info.floor;
if (h >= 2 * 256 - 16 && h <= 2 * 256 + 16 && animIndex != ANIM_CLIMB_2)
return setAnimation(ANIM_CLIMB_2); int aIndex = animIndex;
if (h >= 3 * 256 - 16 && h <= 3 * 256 + 16 && animIndex != ANIM_CLIMB_3) if (h < 2 * 256 - 16)
return setAnimation(ANIM_CLIMB_3); ; // do nothing
if (h >= 4 * 256 - 16 && h <= 7 * 256 + 16 && state != STATE_HANG_JUMP) else if (h <= 2 * 256 + 16)
return setAnimation(ANIM_CLIMB_JUMP); aIndex = ANIM_CLIMB_2;
else if (h <= 3 * 256 + 16)
aIndex = ANIM_CLIMB_3;
else if (h <= 7 * 256 + 16)
aIndex = ANIM_CLIMB_JUMP;
if (aIndex != animIndex) {
turnToWall();
updateEntity();
return setAnimation(aIndex);
}
} }
// only dpad buttons pressed // only dpad buttons pressed
@@ -483,7 +498,10 @@ struct Lara : Controller {
} }
virtual int getStateHang() { virtual int getStateHang() {
return Controller::getStateHang(); if (mask & LEFT) return STATE_HANG_LEFT;
if (mask & RIGHT) return STATE_HANG_RIGHT;
if (mask & FORTH) return (mask & WALK) ? STATE_HANDSTAND : STATE_HANG_UP;
return STATE_HANG;
} }
virtual int getStateUnderwater() { virtual int getStateUnderwater() {
@@ -532,10 +550,13 @@ struct Lara : Controller {
} }
virtual int getStateDefault() { virtual int getStateDefault() {
if (state == STATE_DIVE) return state; if (state == STATE_DIVE) return state;
if (stand == STAND_ONWATER) return STATE_SURF_TREAD; switch (stand) {
if (stand == STAND_UNDERWATER) return STATE_TREAD; case STAND_GROUND : return STATE_STOP;
if (stand == STAND_GROUND) return STATE_STOP; case STAND_HANG : return STATE_HANG;
case STAND_ONWATER : return STATE_SURF_TREAD;
case STAND_UNDERWATER : return STATE_TREAD;
}
return STATE_FALL; return STATE_FALL;
} }
@@ -646,11 +667,13 @@ struct Lara : Controller {
case STATE_LEFT_JUMP : case STATE_LEFT_JUMP :
case STATE_STEP_LEFT : case STATE_STEP_LEFT :
case STATE_SURF_LEFT : case STATE_SURF_LEFT :
case STATE_HANG_LEFT :
angleExt -= PI * 0.5f; angleExt -= PI * 0.5f;
break; break;
case STATE_RIGHT_JUMP : case STATE_RIGHT_JUMP :
case STATE_STEP_RIGHT : case STATE_STEP_RIGHT :
case STATE_SURF_RIGHT : case STATE_SURF_RIGHT :
case STATE_HANG_RIGHT :
angleExt += PI * 0.5f; angleExt += PI * 0.5f;
break; break;
} }
@@ -776,20 +799,15 @@ struct Lara : Controller {
velocity.y = 0.0f; velocity.y = 0.0f;
} else { } else {
velocity.x = velocity.z = 0.0f; velocity.x = velocity.z = 0.0f;
pos.y = p.y; pos.y = p.y + offset.y;
updateEntity(); updateEntity();
} }
break; break;
case STAND_GROUND : case STAND_GROUND :
if (state != STATE_UP_JUMP) { // early stage of up jump if (delta <= -256 * 4 && state == STATE_RUN)
if (delta <= -256 * 4 && state == STATE_RUN) setAnimation(left ? ANIM_SMASH_RUN_LEFT : ANIM_SMASH_RUN_RIGHT);
setAnimation(left ? ANIM_SMASH_RUN_LEFT : ANIM_SMASH_RUN_RIGHT); else
else setAnimation(ANIM_STAND);
setAnimation(ANIM_STAND);
} else {
pos.y = p.y;
updateEntity();
}
velocity.x = velocity.z = 0.0f; velocity.x = velocity.z = 0.0f;
break; break;
default : ;// no smash animation default : ;// no smash animation