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];
animTime = frame == -1 ? 0.0f : ((frame - anim.frameStart) / 30.0f);
ASSERT(anim.frameStart <= anim.frameEnd);
animPrevFrame = -1;
animPrevFrame = int(animTime * 30.0f) - 1;
return state = anim.state;
}
@@ -347,7 +347,7 @@ struct Controller {
}
case TR::ANIM_CMD_SPEED : // cmd jump speed
case TR::ANIM_CMD_SOUND : // play sound
case TR::ANIM_CMD_SPECIAL : // special commands
case TR::ANIM_CMD_EFFECT : // special commands
ptr += 2;
break;
}
@@ -394,28 +394,24 @@ struct Controller {
break;
case TR::ANIM_CMD_KILL : // kill
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 id = (*ptr++) & 0x3FFF;
int idx = frame - anim->frameStart;
if (idx > animPrevFrame && idx <= frameIndex)
if (idx > animPrevFrame && idx <= frameIndex) {
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;
}
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,13 +22,58 @@ namespace TR {
ANIM_CMD_EMPTY ,
ANIM_CMD_KILL ,
ANIM_CMD_SOUND ,
ANIM_CMD_SPECIAL ,
ANIM_CMD_EFFECT ,
};
// https://dl.dropboxusercontent.com/u/62482708/Secret/TR4%26TR5%20PSX%20Stuff.zip
enum {
ANIM_CMD_SPECIAL_FLIP = 0,
ANIM_CMD_SPECIAL_BUBBLE = 3,
ANIM_CMD_SPECIAL_CTRL = 12,
EFFECT_ROTATE_180 ,
EFFECT_FLOOR_SHAKE ,
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 {

View File

@@ -29,6 +29,8 @@ struct Lara : Controller {
ANIM_CLIMB_JUMP = 26,
ANIM_HANG_UP = 29,
ANIM_FALL = 34,
ANIM_SMASH_JUMP = 32,
@@ -48,6 +50,11 @@ struct Lara : Controller {
ANIM_BACK_DESCEND_RIGHT = 62,
ANIM_SLIDE_FORTH = 70,
ANIM_HANG_FORTH = 96,
ANIM_STAND_NORMAL = 103,
ANIM_SLIDE_BACK = 105,
ANIM_WATER_FALL = 112,
@@ -82,7 +89,7 @@ struct Lara : Controller {
STATE_BACK,
STATE_SWIM,
STATE_GLIDE,
STATE_HANG_JUMP,
STATE_HANG_UP,
STATE_FAST_TURN,
STATE_STEP_RIGHT,
STATE_STEP_LEFT,
@@ -305,30 +312,13 @@ struct Lara : Controller {
break;
}
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() {
if (stand == STAND_HANG && (mask & ACTION))
return stand;
if (stand == STAND_ONWATER && state != STATE_DIVE && state != STATE_STOP)
return stand;
@@ -349,7 +339,7 @@ struct Lara : Controller {
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_AIR;
@@ -364,6 +354,21 @@ struct Lara : Controller {
virtual int getStateAir() {
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 (mask & ACTION) return STATE_REACH;
if ((mask & (FORTH | WALK)) == (FORTH | WALK)) return STATE_SWAN_DIVE;
@@ -423,17 +428,27 @@ struct Lara : Controller {
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;
TR::Level::FloorInfo info;
level->getFloorInfo(getRoomIndex(), (int)p.x, (int)p.z, info);
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);
if (h >= 3 * 256 - 16 && h <= 3 * 256 + 16 && animIndex != ANIM_CLIMB_3)
return setAnimation(ANIM_CLIMB_3);
if (h >= 4 * 256 - 16 && h <= 7 * 256 + 16 && state != STATE_HANG_JUMP)
return setAnimation(ANIM_CLIMB_JUMP);
int aIndex = animIndex;
if (h < 2 * 256 - 16)
; // do nothing
else if (h <= 2 * 256 + 16)
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
@@ -483,7 +498,10 @@ struct Lara : Controller {
}
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() {
@@ -533,9 +551,12 @@ struct Lara : Controller {
virtual int getStateDefault() {
if (state == STATE_DIVE) return state;
if (stand == STAND_ONWATER) return STATE_SURF_TREAD;
if (stand == STAND_UNDERWATER) return STATE_TREAD;
if (stand == STAND_GROUND) return STATE_STOP;
switch (stand) {
case 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;
}
@@ -646,11 +667,13 @@ struct Lara : Controller {
case STATE_LEFT_JUMP :
case STATE_STEP_LEFT :
case STATE_SURF_LEFT :
case STATE_HANG_LEFT :
angleExt -= PI * 0.5f;
break;
case STATE_RIGHT_JUMP :
case STATE_STEP_RIGHT :
case STATE_SURF_RIGHT :
case STATE_HANG_RIGHT :
angleExt += PI * 0.5f;
break;
}
@@ -776,20 +799,15 @@ struct Lara : Controller {
velocity.y = 0.0f;
} else {
velocity.x = velocity.z = 0.0f;
pos.y = p.y;
pos.y = p.y + offset.y;
updateEntity();
}
break;
case STAND_GROUND :
if (state != STATE_UP_JUMP) { // early stage of up jump
if (delta <= -256 * 4 && state == STATE_RUN)
setAnimation(left ? ANIM_SMASH_RUN_LEFT : ANIM_SMASH_RUN_RIGHT);
else
setAnimation(ANIM_STAND);
} else {
pos.y = p.y;
updateEntity();
}
velocity.x = velocity.z = 0.0f;
break;
default : ;// no smash animation