juliet/src/Enemy.cpp

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
}
}