#include "Enemy.hpp" #include "g_common.hpp" #include "a_common.hpp" #include 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::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 } }