From 2c8e84a3d2fe93f84d0ffca63967e81a03534c00 Mon Sep 17 00:00:00 2001 From: Paweł Redman Date: Sun, 1 Apr 2018 13:56:14 +0200 Subject: Split units.cpp. --- src/game/unit_spider.cpp | 104 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 src/game/unit_spider.cpp (limited to 'src/game/unit_spider.cpp') diff --git a/src/game/unit_spider.cpp b/src/game/unit_spider.cpp new file mode 100644 index 0000000..ed6b0f0 --- /dev/null +++ b/src/game/unit_spider.cpp @@ -0,0 +1,104 @@ +/* +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->dice_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); +} + +} -- cgit