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:
@@ -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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
55
src/format.h
55
src/format.h
@@ -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,
|
||||||
|
106
src/lara.h
106
src/lara.h
@@ -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
|
||||||
|
Reference in New Issue
Block a user