/* This file is part of Minitrem. Minitrem is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. Minitrem is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Minitrem. If not, see . */ #include "game.hpp" namespace game { unit_spider_t::unit_spider_t(game::state_t *game) : unit_t(game, UNIT_SPIDER) { size[0] = v2f_t(-0.2f, +0.0f); size[1] = v2f_t(+0.2f, +0.3f); render_size[0] = v2f_t(-0.3f, -0.3f); render_size[1] = v2f_t(+0.3f, +0.3f); cmodel.cflags = CF_BODY_SMALL; move.cflags = CF_SOLID | CF_WATER | CF_BODY_SMALL; name = text::get(text::UNIT_NAME_SPIDER); ignore_waking = false; health = max_health = 4; } void unit_spider_t::target_and_attack(void) { unit_t *target; world::trace_t trace; if (game->now < next_targetting) return; target = find_target(world, x, 10.0f, true); if (!target) return; start_moving(target->x); next_targetting = game->now + game->prng.next_float(0.2f, 0.4f); if (last_attack + 0.5 > game->now) return; if ((x - target->x).len() >= 1.0f) return; trace = world->trace(x, target->x, CF_SOLID); if (trace.hit) return; last_attack = game->now; target->damage(15, this); } void unit_spider_t::on_think(void) { return; target_and_attack(); keep_moving(4.0); if (!move.moving && wake_time + 5 < game->now) sleep(); } void unit_spider_t::on_wake(void) { } void unit_spider_t::on_death(void) { render_layer = -1; cmodel.cflags = CF_BACKGROUND; } void unit_spider_t::render_to(render::state_t *render) { bool moving; moving = move.moving && !move.blocked; if (!dead) render->render(game->now * 20, (moving ? &assets::spider.walking : &assets::spider.idle), render_bounds, move.angle); else render->render(game->now * 20, &assets::spider.dead, render_bounds); unit_t::render_to(render); } }