1
0
mirror of https://github.com/XProger/OpenLara.git synced 2025-08-15 09:34:18 +02:00

#14 crocodile fast turn

This commit is contained in:
XProger
2018-06-24 21:31:14 +03:00
parent 8fb22a796d
commit d435da6744

View File

@@ -527,13 +527,13 @@ struct Enemy : Character {
} }
}; };
#define WOLF_TURN_FAST (DEG2RAD * 150) #define WOLF_TURN_FAST (DEG2RAD * 150)
#define WOLF_TURN_SLOW (DEG2RAD * 60) #define WOLF_TURN_SLOW (DEG2RAD * 60)
#define WOLF_DIST_STALK STALK_BOX #define WOLF_DIST_STALK STALK_BOX
#define WOLF_DIST_BITE 345 #define WOLF_DIST_BITE 345
#define WOLF_DIST_ATTACK (1024 + 512) #define WOLF_DIST_ATTACK (1024 + 512)
struct Wolf : Enemy { struct Wolf : Enemy {
enum { enum {
@@ -573,38 +573,28 @@ struct Wolf : Enemy {
} }
virtual int getStateGround() { virtual int getStateGround() {
if (!flags.active)
return (state == STATE_STOP || state == STATE_SLEEP) ? STATE_SLEEP : STATE_STOP;
if (!think(false)) if (!think(false))
return state; return state;
float angle;
getTargetInfo(0, NULL, NULL, &angle, NULL);
bool inZone = target ? target->zone == zone : false;
if (nextState == state) if (nextState == state)
nextState = STATE_NONE; nextState = STATE_NONE;
switch (state) { switch (state) {
case STATE_SLEEP : case STATE_SLEEP :
if (mood == MOOD_ESCAPE || inZone) { if (mood == MOOD_ESCAPE || target->zone == zone)
nextState = STATE_GROWL; nextState = STATE_GROWL;
return STATE_STOP; else if (rand() < 32)
}
if (randf() < 0.0001f) {
nextState = STATE_WALK; nextState = STATE_WALK;
return STATE_STOP; else
} break;
break; return STATE_STOP;
case STATE_STOP : return nextState != STATE_NONE ? nextState : STATE_WALK; case STATE_STOP : return nextState != STATE_NONE ? nextState : STATE_WALK;
case STATE_WALK : case STATE_WALK :
if (mood != MOOD_SLEEP) { if (mood != MOOD_SLEEP) {
nextState = STATE_NONE; nextState = STATE_NONE;
return STATE_STALK; return STATE_STALK;
} }
if (randf() < 0.0001f) { if (rand() < 32) {
nextState = STATE_SLEEP; nextState = STATE_SLEEP;
return STATE_STOP; return STATE_STOP;
} }
@@ -624,7 +614,7 @@ struct Wolf : Enemy {
if (!targetInView || targetFromView || targetDist > WOLF_DIST_ATTACK) if (!targetInView || targetFromView || targetDist > WOLF_DIST_ATTACK)
return STATE_RUN; return STATE_RUN;
} }
if (randf() < 0.012f) { if (rand() < 384) {
nextState = STATE_HOWL; nextState = STATE_HOWL;
return STATE_GROWL; return STATE_GROWL;
} }
@@ -799,6 +789,7 @@ struct Lion : Enemy {
} }
}; };
#define GORILLA_DIST_ATTACK 430 #define GORILLA_DIST_ATTACK 430
#define GORILLA_DIST_AGGRESSION 2048 #define GORILLA_DIST_AGGRESSION 2048
#define GORILLA_TURN_FAST (DEG2RAD * 150) #define GORILLA_TURN_FAST (DEG2RAD * 150)
@@ -1055,19 +1046,17 @@ struct Rat : Enemy {
if (nextState == state) if (nextState == state)
nextState = STATE_NONE; nextState = STATE_NONE;
bool isBite = targetInView && fabsf(target->pos.y - pos.y) < 256.0f;
switch (state) { switch (state) {
case STATE_STOP : case STATE_STOP :
if (nextState != STATE_NONE) if (nextState != STATE_NONE)
return nextState; return nextState;
if (isBite && targetDist < RAT_DIST_BITE) if (targetCanAttack && targetDist < RAT_DIST_BITE)
return STATE_BITE; return STATE_BITE;
return STATE_RUN; return STATE_RUN;
case STATE_RUN : case STATE_RUN :
if (targetInView && (collide(target) & HIT_MASK)) if (targetInView && (collide(target) & HIT_MASK))
return STATE_STOP; return STATE_STOP;
if (isBite && targetDist < RAT_DIST_ATTACK) if (targetCanAttack && targetDist < RAT_DIST_ATTACK)
return STATE_ATTACK; return STATE_ATTACK;
if (targetInView && randf() < RAT_WAIT) { if (targetInView && randf() < RAT_WAIT) {
nextState = STATE_WAIT; nextState = STATE_WAIT;
@@ -1247,15 +1236,13 @@ struct Crocodile : Enemy {
if (nextState == state) if (nextState == state)
nextState = STATE_NONE; nextState = STATE_NONE;
bool isBite = targetInView && fabsf(target->pos.y - pos.y) < 256.0f;
switch (state) { switch (state) {
case STATE_STOP : case STATE_STOP :
if (isBite && targetDist < CROCODILE_DIST_BITE) if (targetCanAttack && targetDist < CROCODILE_DIST_BITE)
return STATE_BITE; return STATE_BITE;
switch (mood) { switch (mood) {
case MOOD_ESCAPE : return STATE_RUN; case MOOD_ESCAPE : return STATE_RUN;
case MOOD_ATTACK : return STATE_RUN; // TODO: turn case MOOD_ATTACK : return (targetInView || targetDist < CROCODILE_DIST_TURN) ? STATE_RUN : STATE_TURN;
case MOOD_STALK : return STATE_WALK; case MOOD_STALK : return STATE_WALK;
default : return state; default : return state;
} }
@@ -1265,7 +1252,7 @@ struct Crocodile : Enemy {
switch (mood) { switch (mood) {
case MOOD_SLEEP : return STATE_STOP; case MOOD_SLEEP : return STATE_STOP;
case MOOD_STALK : return STATE_WALK; case MOOD_STALK : return STATE_WALK;
case MOOD_ATTACK : if (targetDist < CROCODILE_DIST_TURN) return STATE_STOP; // TODO: check turn angles case MOOD_ATTACK : if (targetDist > CROCODILE_DIST_TURN && !targetInView) return STATE_STOP;
default : return state; default : return state;
} }
case STATE_WALK : case STATE_WALK :
@@ -1277,8 +1264,8 @@ struct Crocodile : Enemy {
case MOOD_ESCAPE : return STATE_RUN; case MOOD_ESCAPE : return STATE_RUN;
default : return state; default : return state;
} }
case STATE_TURN : // TODO turn case STATE_TURN :
return STATE_WALK; return targetInView ? STATE_WALK : state;
case STATE_BITE : case STATE_BITE :
if (nextState == STATE_NONE) { if (nextState == STATE_NONE) {
bite(9, vec3(5.0f, -21.0f, 467.0f), CROCODILE_DAMAGE); bite(9, vec3(5.0f, -21.0f, 467.0f), CROCODILE_DAMAGE);
@@ -1324,7 +1311,11 @@ struct Crocodile : Enemy {
} }
virtual void updatePosition() { virtual void updatePosition() {
turn((stand == STAND_GROUND && (state == STATE_RUN || state == STATE_WALK)) || (stand == STAND_UNDERWATER && state == STATE_WATER_SWIM), CROCODILE_TURN_FAST); if (state == STATE_TURN)
angle.y += CROCODILE_TURN_FAST * Core::deltaTime;
else
turn((stand == STAND_GROUND && (state == STATE_RUN || state == STATE_WALK)) || (stand == STAND_UNDERWATER && state == STATE_WATER_SWIM), CROCODILE_TURN_FAST);
angle.z = 0.0f;
if (state == STATE_DEATH) { if (state == STATE_DEATH) {
animation.overrideMask = 0; animation.overrideMask = 0;