/* 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_replicator_t::unit_replicator_t(game::state_t *game_) : unit_t(game_, UNIT_REPLICATOR) { size[0] = v2f_t(-0.4f, -0.2f) * 1.3f; size[1] = v2f_t(+0.4f, +0.4f) * 1.3f; render_size[0] = v2f_t(-0.4f, -0.666667f) * 1.3f; render_size[1] = v2f_t(+0.4f, +0.4f) * 1.3f; cmodel.cflags = CF_SOLID; name = "Replicator"; ignore_waking = false; max_health = 30; health = 4; friendly = true; controllable = true; constructed = false; storage.shells = 0; storage.max_shells = 200; storage.grenades = 0; storage.max_grenades = 20; } void unit_replicator_t::on_damage(unit_t *attacker) { assets::teleporter.damage.play_3d(x); } void unit_replicator_t::on_death(void) { game->explosion(x); game->deletion_list.insert(this); } void unit_replicator_t::activate(bool grenades) { size_t amount, price; if (grenades) { amount = 2; price = 10; if (storage.max_grenades - storage.grenades < amount) { say("Storage full."); return; } } else { amount = 15; price = 8; if (storage.max_shells - storage.shells < amount) { say("Storage full."); return; } } if (game->crystals < price) { game->interface.print("Insufficient crystals; " + std::to_string(price - game->crystals) + " more needed."); return; } game->crystals -= price; if (grenades) storage.grenades += amount; else storage.shells += amount; assets::teleporter.sound.play_3d(x); last_activation = game->time; } void unit_replicator_t::render_to(render::state_t *render) { if (!constructed) render->render(game->now, &assets::replicator.unfinished, render_bounds); else if (last_activation && game->time - last_activation < MSEC(300)) render->render(30 * game->now, &assets::replicator.working, render_bounds); else render->render(game->now, &assets::replicator.idle, render_bounds); unit_t::render_to(render); } }