diff options
author | Paweł Redman <pawel.redman@gmail.com> | 2018-04-22 17:37:38 +0200 |
---|---|---|
committer | Paweł Redman <pawel.redman@gmail.com> | 2018-04-22 17:37:38 +0200 |
commit | 87422cff1507f8b5a8633eee5dadbadfef872dab (patch) | |
tree | 19335fc72bde60efd41c9f87f3b8f44b153af5a4 /src/game/unit_builder.cpp | |
parent | 478c6d955abc27024599aefbf483f55efe39da55 (diff) |
Add the builder.
Diffstat (limited to 'src/game/unit_builder.cpp')
-rw-r--r-- | src/game/unit_builder.cpp | 153 |
1 files changed, 153 insertions, 0 deletions
diff --git a/src/game/unit_builder.cpp b/src/game/unit_builder.cpp new file mode 100644 index 0000000..1f5b81c --- /dev/null +++ b/src/game/unit_builder.cpp @@ -0,0 +1,153 @@ +/* +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 <http://www.gnu.org/licenses/>. +*/ + +#include "game.hpp" + +namespace game { + +static std::string builder_name(procgen::prng_t *prng) +{ + std::stringstream ss; + static const char *names[] = { + "Janusz", "Henryk", "Wiesław", "Bolesław", "Edward", + "Roman", "Mirosław", "Zbigniew", "Jerzy", "Józef", "Jan" + }; + + ss << "Pan "; + ss << names[prng->next() % (sizeof(names) / sizeof(names[0]))]; + + return ss.str(); +} + +unit_builder_t::unit_builder_t(game::state_t *game) : unit_t(game, UNIT_BUILDER) +{ + size[0] = v2f_t(-0.3f, +0.0f); + size[1] = v2f_t(+0.3f, +0.3f); + render_size[0] = v2f_t(-0.5f, -1.2f); + render_size[1] = v2f_t(+0.5f, +0.3f); + cmodel.cflags = CF_BODY; + move.cflags = CF_SOLID | CF_BODY | CF_WATER; + + name = builder_name(&game->prng); + + wake(); + friendly = true; + controllable = true; + + health = max_health = 45; +} + +void unit_builder_t::on_think(void) +{ + keep_moving(2.0); + game->wake_area(x); + + if (!move.moving) + move_marker.reset(); + + if (move.moving && (x - move.last_step).len() > 0.5f) { + move.last_step = x; + assets::soldier.step_stone.play_3d(x); + } +} + +void unit_builder_t::on_damage(unit_t *attacker) +{ + if (health < -30) { + assets::fx.gibbing.play_3d(x); + game->deletion_list.insert(this); + return; + } else if (health < -10) { + render_size[0] = v2f_t(-0.5f, -1.2f); + render_size[1] = v2f_t(+0.5f, +0.3f); + + if (!gibbed) + assets::fx.gibbing.play_3d(x); + else + assets::fx.corpse_hit.play_3d(x); + + place(world, x); + gibbed = true; + } else if (health <= 0) { + render_size[0] = v2f_t(-0.75f, -0.5f); + render_size[1] = v2f_t(+0.75f, +0.5f); + if (!dead) + assets::soldier.death.play_3d(x); + else + assets::fx.corpse_hit.play_3d(x); + + place(world, x); + } else + assets::soldier.pain.play_3d(x); +} + +void unit_builder_t::on_death(void) +{ + render_layer = render::LAYER_FLAT; + cmodel.cflags = CF_BACKGROUND; + place(world, x); + controllable = false; + move_marker.reset(); +} + +void unit_builder_t::render_to(render::state_t *render) +{ + sf::Color selection_color; + + if (selected == selection_cookie) { + if (health == max_health) + selection_color = sf::Color::Green; + else if (health >= max_health / 2) + selection_color = sf::Color::Yellow; + else if (dead) + selection_color = sf::Color::Black; + else + selection_color = sf::Color::Red; + + render->render(0.0, &assets::unit_selected, cmodel.bounds, selection_color); + } + + if (!dead) { + render::oriented_sprite_t *legs; + + if (move.moving && !move.blocked) + legs = &assets::soldier.legs_walking; + else + legs = &assets::soldier.legs_idle; + + render->render(game->now * 10, legs, render_bounds, move.angle); + render->render(game->now * 10, &assets::builder.body_idle, render_bounds, move.angle); + render->render(game->now * 10, &assets::builder.head_idle, render_bounds, move.angle); + } else { + float phase = clamp<float>((game->now - death_time) * 5, 0, 0.9); + + if (gibbed) + render->render(phase, &assets::builder.gibbing, render_bounds); + else + render->render(phase, &assets::builder.dead, render_bounds); + } + + unit_t::render_to(render); +} + +void unit_builder_t::render_late_to(render::state_t *render) +{ + if (selected == selection_cookie) + render->render(0.0, &assets::unit_selected_halo, cmodel.bounds, selection_color); +} + +} |