128 lines
3.5 KiB
C++
128 lines
3.5 KiB
C++
#include "Enemy.hpp"
|
|
#include "g_common.hpp"
|
|
#include "a_common.hpp"
|
|
#include <stdio.h>
|
|
|
|
Enemy::Enemy() {
|
|
target = NULL;
|
|
type = ENTITY_ENEMY;
|
|
flags = ENTITY_LEFT;
|
|
max_force = 3.0f;
|
|
speed = 1.0f;
|
|
damage = 1;
|
|
}
|
|
Enemy::~Enemy() {
|
|
|
|
}
|
|
void Enemy::doThink(int delta) {
|
|
if (target == NULL) {
|
|
std::vector<Entity*>::iterator entity_it, entity_end;
|
|
for (entity_it = g_entities.begin(), entity_end = g_entities.end(); entity_it != entity_end; ++entity_it) {
|
|
if ((*entity_it)->type == ENTITY_JULIET) {
|
|
target = (*entity_it);
|
|
break;
|
|
}
|
|
}
|
|
} else {
|
|
if (flags & ENTITY_DIE) {
|
|
if (sprite.frame >= 10) {
|
|
flags |= ENTITY_DESTROY;
|
|
}
|
|
} else if (flags & ENTITY_HURT) {
|
|
if (!(flags & ENTITY_HAS_HURT)) {
|
|
sprite.frame = 0;
|
|
sprite.setAnimation(2);
|
|
flags |= ENTITY_HAS_HURT;
|
|
} else {
|
|
if (sprite.frame >= 6) {
|
|
sprite.frame = 0;
|
|
sprite.setAnimation(0);
|
|
flags &= ~ENTITY_HAS_HURT;
|
|
flags &= ~ENTITY_HURT;
|
|
}
|
|
}
|
|
} else if (flags & ENTITY_ATTACK) {
|
|
if (sprite.frame == 6) { // frame 6 is hit
|
|
if (!(flags & ENTITY_HAS_HIT)) {
|
|
float diff_x = target->x - x;
|
|
float diff_y = target->y - y;
|
|
if (diff_y > -48 && diff_y < 48) {
|
|
if (diff_x > 0 && diff_x < 32) {
|
|
Mix_PlayChannel(-1, a_sfx[SFX_HIT], 0);
|
|
target->takeDamage(damage);
|
|
flags |= ENTITY_HAS_HIT;
|
|
target->addForce((float)damage*3, (float)damage*3);
|
|
} else if (diff_x <= 0 && diff_x > -32) {
|
|
Mix_PlayChannel(-1, a_sfx[SFX_HIT], 0);
|
|
target->takeDamage(damage);
|
|
flags |= ENTITY_HAS_HIT;
|
|
target->addForce(-(float)damage*3, (float)damage*3);
|
|
}
|
|
}
|
|
}
|
|
} else if (sprite.frame >= 10) {
|
|
sprite.setAnimation(0);
|
|
sprite.frame = 0;
|
|
flags &= ~ENTITY_ATTACK;
|
|
flags &= ~ENTITY_HAS_HIT;
|
|
frame_time = 100;
|
|
}
|
|
} else {
|
|
float diff_x = target->x - x;
|
|
float diff_y = target->y - y;
|
|
if (diff_x > -48 && diff_x < 48 && diff_y > -48 && diff_y < 48) {
|
|
sprite.setAnimation(1);
|
|
sprite.frame = 0;
|
|
frame_time = 75;
|
|
flags |= ENTITY_ATTACK;
|
|
}
|
|
if (target->x > x) {
|
|
if (!(flags & ENTITY_RIGHT)) {
|
|
flags |= ENTITY_RIGHT;
|
|
flags &= ~ENTITY_LEFT;
|
|
sprite.flipSprite();
|
|
}
|
|
if (vel_x > -max_force && vel_x < max_force) {
|
|
if (sprite.frame == 4 || sprite.frame == 9) {
|
|
addForce(speed, 0);
|
|
} else {
|
|
addForce(speed/2.0f, 0);
|
|
}
|
|
flags |= ENTITY_WALK;
|
|
}
|
|
} else if (target->x < x) {
|
|
if (!(flags & ENTITY_LEFT)) {
|
|
flags |= ENTITY_LEFT;
|
|
flags &= ~ENTITY_RIGHT;
|
|
sprite.flipSprite();
|
|
}
|
|
if (vel_x > -max_force && vel_x < max_force) {
|
|
if (sprite.frame == 4 || sprite.frame == 9) {
|
|
addForce(-speed, 0);
|
|
} else {
|
|
addForce(-(speed/2.0f), 0);
|
|
}
|
|
flags |= ENTITY_WALK;
|
|
}
|
|
}
|
|
if (target->y > y+32) {
|
|
if (!(flags & ENTITY_FALLING)) {
|
|
flags |= ENTITY_JUMP;
|
|
addForce(0, 2);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
frame_elapsed += delta;
|
|
if (frame_elapsed >= frame_time) {
|
|
frame_elapsed = 0;
|
|
sprite.loopFrame();
|
|
}
|
|
if (health <= 0) {
|
|
sprite.frame = 0;
|
|
sprite.setAnimation(3);
|
|
flags |= ENTITY_DIE;
|
|
health = 100; // cheat
|
|
}
|
|
}
|