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_nest.cpp | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 src/game/unit_nest.cpp (limited to 'src/game/unit_nest.cpp') diff --git a/src/game/unit_nest.cpp b/src/game/unit_nest.cpp new file mode 100644 index 0000000..326741e --- /dev/null +++ b/src/game/unit_nest.cpp @@ -0,0 +1,96 @@ +/* +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_nest_t::unit_nest_t(game::state_t *game_) : unit_t(game_, UNIT_NEST) +{ + size[0] = {-0.6f, +0.2f}; + size[1] = {+0.6f, +0.6f}; + render_size[0] = {-0.6f, -0.6f}; + render_size[1] = {+0.6f, +0.6f}; + cmodel.cflags = CF_BACKGROUND; + + name = text::get(text::UNIT_NAME_NEST); + + ignore_waking = false; + + health = max_health = 45; + + next_spawning = game->now + 5.0; +} + +void spawn_spider(game::state_t *game, v2f_t nest) +{ + for (size_t i = 0; i < 5; i++) { // Try a few times before giving up. + v2f_t offset, x; + world::cmodel_t cmodel; + unit_spider_t *spider; + + offset = game->dice_prng.unit_vec2(); + x = nest + offset * (game->dice_prng.next_float() * 0.2 + 0.4); + + cmodel.bounds = rectf_t(v2f_t(-0.5f, -0.5f), v2f_t(0.5f, 0.5f)) + x; + cmodel.cflags = CF_SOLID | CF_WATER | CF_BODY_SMALL; + if (game->world.test_rect(&cmodel, NULL)) + continue; + + spider = new unit_spider_t(game); + spider->place(&game->world, x); + return; + } +} + +void unit_nest_t::on_think(void) +{ + if (wake_time + 30 > game->now) + sleep(); + + if (next_spawning > game->now) + return; + + spawn_spider(game, x); + next_spawning = game->now + game->dice_prng.next_float() * 10 + 5; +} + +void unit_nest_t::on_spawn(void) +{ + spawn_spider(game, x); + spawn_spider(game, x); + spawn_spider(game, x); +} + +void unit_nest_t::on_death(void) +{ + render_layer = -1; + cmodel.cflags = CF_BACKGROUND; +} + +void unit_nest_t::render_to(render::state_t *render) +{ + if (!dead) + render->render(game->now, &assets::nest.idle, render_bounds); + else + render->render(game->now, &assets::nest.dead, render_bounds); + + unit_t::render_to(render); +} + +} -- cgit