diff --git a/src/object/moving_sprite.hpp b/src/object/moving_sprite.hpp index 6f678eb155d..43938e57e30 100644 --- a/src/object/moving_sprite.hpp +++ b/src/object/moving_sprite.hpp @@ -64,6 +64,7 @@ class MovingSprite : public MovingObject virtual void on_type_change(int old_type) override; virtual int get_layer() const override { return m_layer; } + void set_layer(int layer) { m_layer = layer; } bool has_found_sprite() const { return m_sprite_found; } const std::string& get_sprite_name() const { return m_sprite_name; } diff --git a/src/object/player.cpp b/src/object/player.cpp index 09aa84595d4..ca8fa48e46d 100644 --- a/src/object/player.cpp +++ b/src/object/player.cpp @@ -150,6 +150,9 @@ const float TURN_MAGNITUDE_BOOST = 0.2f; const float BUTTJUMP_WAIT_TIME = 0.2f; // the length of time that the buttjump action is being played const float BUTTJUMP_SPEED = 800.f; +const int MAX_FIRE_BULLETS = 2; +const int MAX_ICE_BULLETS = 2; + } // namespace Player::Player(PlayerStatus& player_status, const std::string& name_, int player_id) : @@ -1562,10 +1565,8 @@ Player::handle_input() /* Shoot! */ auto active_bullets = Sector::get().get_object_count([this](const Bullet& b){ return &b.get_player() == this; }); if (m_controller->pressed(Control::ACTION) && (get_bonus() == FIRE_BONUS || get_bonus() == ICE_BONUS) && !just_grabbed) { - if ((get_bonus() == FIRE_BONUS && - active_bullets < m_player_status.max_fire_bullets[get_id()]) || - (get_bonus() == ICE_BONUS && - active_bullets < m_player_status.max_ice_bullets[get_id()])) + if ((get_bonus() == FIRE_BONUS && active_bullets < MAX_FIRE_BULLETS) || + (get_bonus() == ICE_BONUS && active_bullets < MAX_ICE_BULLETS)) { Vector pos = get_pos() + Vector(m_col.m_bbox.get_width() / 2.f, m_col.m_bbox.get_height() / 2.f); Direction swim_dir; @@ -1896,7 +1897,7 @@ Player::add_bonus(BonusType type, bool animate) } bool -Player::set_bonus(BonusType type, bool animate, bool increment_powerup_counter) +Player::set_bonus(BonusType type, bool animate) { if (m_dying) { return false; @@ -1932,21 +1933,6 @@ Player::set_bonus(BonusType type, bool animate, bool increment_powerup_counter) if (m_does_buttjump) m_does_buttjump = false; } - if ((type == NO_BONUS) || (type == GROWUP_BONUS)) { - m_player_status.max_fire_bullets[get_id()] = 0; - m_player_status.max_ice_bullets[get_id()] = 0; - m_player_status.max_air_time[get_id()] = 0; - m_player_status.max_earth_time[get_id()] = 0; - } - - if (increment_powerup_counter) - { - if (type == FIRE_BONUS) m_player_status.max_fire_bullets[get_id()]++; - if (type == ICE_BONUS) m_player_status.max_ice_bullets[get_id()]++; - if (type == AIR_BONUS) m_player_status.max_air_time[get_id()]++; - if (type == EARTH_BONUS) m_player_status.max_earth_time[get_id()]++; - } - if (type > GROWUP_BONUS) { m_player_status.add_item_to_pocket(get_bonus(), this); diff --git a/src/object/player.hpp b/src/object/player.hpp index 720ec781949..6d4104fc637 100644 --- a/src/object/player.hpp +++ b/src/object/player.hpp @@ -136,11 +136,11 @@ class Player final : public MovingObject bool is_dying() const { return m_dying; } /** - * Returns true if the player is currently alive + * Returns true if the player is currently alive * (not dying or dead) */ bool is_alive() const { return !is_dying() && !is_dead(); } - + /** * Returns true if the player can be controlled. * (alive and not currently in a win sequence) @@ -201,7 +201,7 @@ class Player final : public MovingObject bool add_bonus(BonusType type, bool animate = false); /** like add_bonus, but can also downgrade the bonus items carried */ - bool set_bonus(BonusType type, bool animate = false, bool increment_powerup_counter = true); + bool set_bonus(BonusType type, bool animate = false); BonusType get_bonus() const; std::string bonus_to_string() const; diff --git a/src/supertux/game_session.cpp b/src/supertux/game_session.cpp index f476f8aafde..20c2d7046cd 100644 --- a/src/supertux/game_session.cpp +++ b/src/supertux/game_session.cpp @@ -92,8 +92,6 @@ GameSession::GameSession(const std::string& levelfile_, Savegame& savegame, Stat set_start_point(DEFAULT_SECTOR_NAME, DEFAULT_SPAWNPOINT_NAME); m_boni_at_start.resize(InputManager::current()->get_num_users(), NO_BONUS); - m_max_fire_bullets_at_start.resize(InputManager::current()->get_num_users(), 0); - m_max_ice_bullets_at_start.resize(InputManager::current()->get_num_users(), 0); m_data_table.clear(); @@ -118,8 +116,6 @@ GameSession::reset_level() PlayerStatus& currentStatus = m_savegame.get_player_status(); currentStatus.coins = m_coins_at_start; currentStatus.bonus = m_boni_at_start; - currentStatus.max_fire_bullets = m_max_fire_bullets_at_start; - currentStatus.max_ice_bullets = m_max_ice_bullets_at_start; clear_respawn_points(); m_activated_checkpoint = nullptr; @@ -163,8 +159,6 @@ GameSession::restart_level(bool after_death, bool preserve_music) { const PlayerStatus& currentStatus = m_savegame.get_player_status(); m_coins_at_start = currentStatus.coins; - m_max_fire_bullets_at_start = currentStatus.max_fire_bullets; - m_max_ice_bullets_at_start = currentStatus.max_ice_bullets; m_boni_at_start = currentStatus.bonus; // Needed for the title screen apparently. @@ -174,7 +168,7 @@ GameSession::restart_level(bool after_death, bool preserve_music) { for (const auto& p : m_currentsector->get_players()) { - p->set_bonus(m_boni_at_start.at(p->get_id()), false, false); + p->set_bonus(m_boni_at_start.at(p->get_id()), false); m_boni_at_start[p->get_id()] = currentStatus.bonus[p->get_id()]; } } @@ -425,8 +419,6 @@ GameSession::abort_level() PlayerStatus& currentStatus = m_savegame.get_player_status(); currentStatus.coins = m_coins_at_start; - currentStatus.max_fire_bullets = m_max_fire_bullets_at_start; - currentStatus.max_ice_bullets = m_max_ice_bullets_at_start; SoundManager::current()->stop_sounds(); } diff --git a/src/supertux/menu/cheat_apply_menu.cpp b/src/supertux/menu/cheat_apply_menu.cpp index 242612ab071..f07e6e1afd0 100644 --- a/src/supertux/menu/cheat_apply_menu.cpp +++ b/src/supertux/menu/cheat_apply_menu.cpp @@ -25,9 +25,7 @@ #include "supertux/sector.hpp" CheatApplyMenu::CheatApplyMenu(std::function callback) : - m_callback_1(callback), - m_callback_2(nullptr), - m_stack_count(-1) + m_callback(callback) { add_label(_("Apply cheat to player")); add_hl(); @@ -42,26 +40,6 @@ CheatApplyMenu::CheatApplyMenu(std::function callback) : add_back(_("Back")); } -CheatApplyMenu::CheatApplyMenu(std::function callback) : - m_callback_1(nullptr), - m_callback_2(callback), - m_stack_count(1) -{ - add_label(_("Apply cheat to player")); - add_hl(); - - add_intfield(_("Count"), &m_stack_count, -2); - add_hl(); - add_entry(-1, _("All Players")); - for (const auto player : Sector::get().get_players()) - { - add_entry(player->get_id(), fmt::format(_("Player {}"), player->get_id() + 1)); - } - - add_hl(); - add_back(_("Back")); -} - void CheatApplyMenu::menu_action(MenuItem& item) { @@ -72,13 +50,9 @@ CheatApplyMenu::menu_action(MenuItem& item) for (const auto& player : Sector::get().get_players()) { - if (id == -1 || id == player->get_id()) + if ((id == -1 || id == player->get_id()) && m_callback) { - if (m_callback_2) - m_callback_2(*player, m_stack_count); - - if (m_callback_1) - m_callback_1(*player); + m_callback(*player); } } diff --git a/src/supertux/menu/cheat_apply_menu.hpp b/src/supertux/menu/cheat_apply_menu.hpp index 560eb3217ef..86e6078b971 100644 --- a/src/supertux/menu/cheat_apply_menu.hpp +++ b/src/supertux/menu/cheat_apply_menu.hpp @@ -25,15 +25,11 @@ class CheatApplyMenu final : public Menu { public: CheatApplyMenu(std::function callback); - /** Use this for cheats that need a stack count, e. g. giving fire flowers */ - CheatApplyMenu(std::function callback); void menu_action(MenuItem& item) override; private: - std::function m_callback_1; - std::function m_callback_2; - int m_stack_count; + std::function m_callback; private: CheatApplyMenu(const CheatApplyMenu&) = delete; diff --git a/src/supertux/menu/cheat_menu.cpp b/src/supertux/menu/cheat_menu.cpp index 871efec94e4..16bbd5b2ac9 100644 --- a/src/supertux/menu/cheat_menu.cpp +++ b/src/supertux/menu/cheat_menu.cpp @@ -82,30 +82,26 @@ CheatMenu::menu_action(MenuItem& item) break; case MNID_FIRE: - MenuManager::instance().push_menu(std::make_unique([](Player& player, int count){ + MenuManager::instance().push_menu(std::make_unique([](Player& player){ player.set_bonus(FIRE_BONUS); - player.get_status().max_fire_bullets[player.get_id()] = count; })); break; case MNID_ICE: - MenuManager::instance().push_menu(std::make_unique([](Player& player, int count){ + MenuManager::instance().push_menu(std::make_unique([](Player& player){ player.set_bonus(ICE_BONUS); - player.get_status().max_ice_bullets[player.get_id()] = count; })); break; case MNID_AIR: - MenuManager::instance().push_menu(std::make_unique([](Player& player, int count){ + MenuManager::instance().push_menu(std::make_unique([](Player& player){ player.set_bonus(AIR_BONUS); - player.get_status().max_air_time[player.get_id()] = count; })); break; case MNID_EARTH: - MenuManager::instance().push_menu(std::make_unique([](Player& player, int count){ + MenuManager::instance().push_menu(std::make_unique([](Player& player){ player.set_bonus(EARTH_BONUS); - player.get_status().max_earth_time[player.get_id()] = count; })); break; diff --git a/src/supertux/menu/worldmap_cheat_apply_menu.cpp b/src/supertux/menu/worldmap_cheat_apply_menu.cpp index 4a5c80040cb..01da6d274b1 100644 --- a/src/supertux/menu/worldmap_cheat_apply_menu.cpp +++ b/src/supertux/menu/worldmap_cheat_apply_menu.cpp @@ -25,11 +25,9 @@ #include "supertux/sector.hpp" WorldmapCheatApplyMenu::WorldmapCheatApplyMenu(int num_players, - std::function callback) : + std::function callback) : m_num_players(num_players), - m_callback_1(callback), - m_callback_2(nullptr), - m_stack_count(-1) + m_callback(callback) { add_label(_("Apply cheat to player")); add_hl(); @@ -41,27 +39,6 @@ WorldmapCheatApplyMenu::WorldmapCheatApplyMenu(int num_players, add_back(_("Back")); } -WorldmapCheatApplyMenu::WorldmapCheatApplyMenu(int num_players, - std::function callback) : - m_num_players(num_players), - m_callback_1(nullptr), - m_callback_2(callback), - m_stack_count(1) -{ - add_label(_("Apply cheat to player")); - add_hl(); - - add_intfield("Count", &m_stack_count, -2); - add_hl(); - add_entry(-1, _("All Players")); - - for (int i = 0; i < m_num_players; i++) - add_entry(i, fmt::format(_("Player {}"), i + 1)); - - add_hl(); - add_back(_("Back")); -} - void WorldmapCheatApplyMenu::menu_action(MenuItem& item) { @@ -74,20 +51,14 @@ WorldmapCheatApplyMenu::menu_action(MenuItem& item) { for (int i = 0; i < m_num_players; i++) { - if (m_callback_2) - m_callback_2(i, m_stack_count); - - if (m_callback_1) - m_callback_1(i); + if (m_callback) + m_callback(i); } } else { - if (m_callback_2) - m_callback_2(id, m_stack_count); - - if (m_callback_1) - m_callback_1(id); + if (m_callback) + m_callback(id); } MenuManager::instance().clear_menu_stack(); diff --git a/src/supertux/menu/worldmap_cheat_apply_menu.hpp b/src/supertux/menu/worldmap_cheat_apply_menu.hpp index 1fdb724125a..bee28a24830 100644 --- a/src/supertux/menu/worldmap_cheat_apply_menu.hpp +++ b/src/supertux/menu/worldmap_cheat_apply_menu.hpp @@ -25,16 +25,12 @@ class WorldmapCheatApplyMenu final : public Menu { public: WorldmapCheatApplyMenu(int num_players, std::function callback); - /** Use this for cheats that need a stack count, e. g. giving fire flowers */ - WorldmapCheatApplyMenu(int num_players, std::function callback); void menu_action(MenuItem& item) override; private: int m_num_players; - std::function m_callback_1; - std::function m_callback_2; - int m_stack_count; + std::function m_callback; private: WorldmapCheatApplyMenu(const WorldmapCheatApplyMenu&) = delete; diff --git a/src/supertux/menu/worldmap_cheat_menu.cpp b/src/supertux/menu/worldmap_cheat_menu.cpp index 7a061373873..b50c021a710 100644 --- a/src/supertux/menu/worldmap_cheat_menu.cpp +++ b/src/supertux/menu/worldmap_cheat_menu.cpp @@ -76,30 +76,26 @@ WorldmapCheatMenu::menu_action(MenuItem& item) break; case MNID_FIRE: - do_cheat(status, [&status](int player, int count) { + do_cheat(status, [&status](int player) { status.bonus[player] = FIRE_BONUS; - status.max_fire_bullets[player] = count; }); break; case MNID_ICE: - do_cheat(status, [&status](int player, int count) { + do_cheat(status, [&status](int player) { status.bonus[player] = ICE_BONUS; - status.max_ice_bullets[player] = count; }); break; case MNID_AIR: - do_cheat(status, [&status](int player, int count) { + do_cheat(status, [&status](int player) { status.bonus[player] = AIR_BONUS; - status.max_air_time[player] = count; }); break; case MNID_EARTH: - do_cheat(status, [&status](int player, int count) { + do_cheat(status, [&status](int player) { status.bonus[player] = EARTH_BONUS; - status.max_earth_time[player] = count; }); break; @@ -174,13 +170,6 @@ WorldmapCheatMenu::do_cheat(PlayerStatus& status, } } -void -WorldmapCheatMenu::do_cheat(PlayerStatus& status, - std::function callback) -{ - MenuManager::instance().push_menu(std::make_unique(status.m_num_players, callback)); -} - WorldmapLevelSelectMenu::WorldmapLevelSelectMenu() { auto worldmap_sector = worldmap::WorldMapSector::current(); diff --git a/src/supertux/menu/worldmap_cheat_menu.hpp b/src/supertux/menu/worldmap_cheat_menu.hpp index 2f32e2ade98..5c82bfa2341 100644 --- a/src/supertux/menu/worldmap_cheat_menu.hpp +++ b/src/supertux/menu/worldmap_cheat_menu.hpp @@ -49,7 +49,6 @@ class WorldmapCheatMenu final : public Menu private: void do_cheat(PlayerStatus& status, std::function callback); - void do_cheat(PlayerStatus& status, std::function callback); private: WorldmapCheatMenu(const WorldmapCheatMenu&) = delete; diff --git a/src/supertux/player_status.cpp b/src/supertux/player_status.cpp index 2d3059ebca7..7715589c486 100644 --- a/src/supertux/player_status.cpp +++ b/src/supertux/player_status.cpp @@ -37,10 +37,6 @@ PlayerStatus::PlayerStatus(int num_players) : m_item_pockets(num_players), coins(START_COINS), bonus(num_players), - max_fire_bullets(num_players), - max_ice_bullets(num_players), - max_air_time(num_players), - max_earth_time(num_players), worldmap_sprite("images/worldmap/common/tux.sprite"), last_worldmap(), title_level() @@ -72,14 +68,6 @@ PlayerStatus::reset(int num_players) // Keep in sync with a section in read() bonus.clear(); bonus.resize(num_players, NO_BONUS); - max_fire_bullets.clear(); - max_fire_bullets.resize(num_players, 0); - max_ice_bullets.clear(); - max_ice_bullets.resize(num_players, 0); - max_air_time.clear(); - max_air_time.resize(num_players, 0); - max_earth_time.clear(); - max_earth_time.resize(num_players, 0); m_item_pockets.clear(); m_item_pockets.resize(num_players, NO_BONUS); @@ -197,12 +185,6 @@ PlayerStatus::write(Writer& writer) } writer.write("bonus", get_bonus_name(bonus[i])); - - writer.write("fireflowers", max_fire_bullets[i]); - writer.write("iceflowers", max_ice_bullets[i]); - writer.write("airflowers", max_air_time[i]); - writer.write("earthflowers", max_earth_time[i]); - writer.write("item-pocket", get_bonus_name(m_item_pockets[i])); if (i != 0) @@ -244,18 +226,6 @@ PlayerStatus::read(const ReaderMapping& mapping) if (bonus.size() < static_cast(id)) bonus.resize(id, NO_BONUS); - if (max_fire_bullets.size() < static_cast(id)) - max_fire_bullets.resize(id, 0); - - if (max_ice_bullets.size() < static_cast(id)) - max_ice_bullets.resize(id, 0); - - if (max_air_time.size() < static_cast(id)) - max_air_time.resize(id, 0); - - if (max_earth_time.size() < static_cast(id)) - max_earth_time.resize(id, 0); - if (m_item_pockets.size() < static_cast(id)) m_item_pockets.resize(id, NO_BONUS); } @@ -301,6 +271,7 @@ PlayerStatus::give_item_from_pocket(Player* player) powerup.physic.set_velocity_y(-200); powerup.physic.set_gravity_modifier(0.4f); + powerup.set_layer(LAYER_FOREGROUND1); powerup.get_collision_object()->m_group = COLGROUP_TOUCHABLE; powerup.set_pos(pos); } @@ -321,13 +292,10 @@ PlayerStatus::parse_bonus_mapping(const ReaderMapping& map, int id) if (map.get("bonus", bonusname)) { bonus[id] = get_bonus_from_name(bonusname); } + if (map.get("item-pocket", bonusname)) { m_item_pockets[id] = get_bonus_from_name(bonusname); } - map.get("fireflowers", max_fire_bullets[id]); - map.get("iceflowers", max_ice_bullets[id]); - map.get("airflowers", max_air_time[id]); - map.get("earthflowers", max_earth_time[id]); } std::string @@ -356,10 +324,6 @@ PlayerStatus::add_player() m_num_players++; bonus.resize(m_num_players, NO_BONUS); - max_fire_bullets.resize(m_num_players, 0); - max_ice_bullets.resize(m_num_players, 0); - max_air_time.resize(m_num_players, 0); - max_earth_time.resize(m_num_players, 0); m_item_pockets.resize(m_num_players, NO_BONUS); } @@ -371,18 +335,10 @@ PlayerStatus::remove_player(int player_id) for (int i = player_id; i < m_num_players; i++) { bonus[i] = bonus[i + 1]; - max_fire_bullets[i] = max_fire_bullets[i + 1]; - max_ice_bullets[i] = max_ice_bullets[i + 1]; - max_air_time[i] = max_air_time[i + 1]; - max_earth_time[i] = max_earth_time[i + 1]; m_item_pockets[i] = m_item_pockets[i + 1]; } bonus.resize(m_num_players, NO_BONUS); - max_fire_bullets.resize(m_num_players, 0); - max_ice_bullets.resize(m_num_players, 0); - max_air_time.resize(m_num_players, 0); - max_earth_time.resize(m_num_players, 0); m_item_pockets.resize(m_num_players, NO_BONUS); } diff --git a/src/supertux/player_status.hpp b/src/supertux/player_status.hpp index 50ee2ba9091..dd79ac7ec22 100644 --- a/src/supertux/player_status.hpp +++ b/src/supertux/player_status.hpp @@ -48,7 +48,6 @@ class PlayerStatus final void write(Writer& writer); void read(const ReaderMapping& mapping); - int get_item_pockets_max(); void give_item_from_pocket(Player* player); void add_item_to_pocket(BonusType bonustype, Player* player); @@ -76,10 +75,6 @@ class PlayerStatus final int coins; std::vector bonus; - std::vector max_fire_bullets; /**< maximum number of fire bullets in play */ - std::vector max_ice_bullets; /**< maximum number of ice bullets in play */ - std::vector max_air_time; /** max_earth_time; /**< determines maximum number of seconds player can turn to stone */ std::string worldmap_sprite; /**< the sprite of Tux that should be used in worldmap */ std::string last_worldmap; /**< the last played worldmap */ diff --git a/src/supertux/player_status_hud.cpp b/src/supertux/player_status_hud.cpp index e945bb08411..a3b4d3524ec 100644 --- a/src/supertux/player_status_hud.cpp +++ b/src/supertux/player_status_hud.cpp @@ -33,8 +33,6 @@ PlayerStatusHUD::PlayerStatusHUD(PlayerStatus& player_status) : displayed_coins(DISPLAYED_COINS_UNSET), displayed_coins_frame(0), coin_surface(Surface::from_file("images/engine/hud/coins-0.png")), - fire_surface(Surface::from_file("images/engine/hud/fire-0.png")), - ice_surface(Surface::from_file("images/engine/hud/ice-0.png")), m_bonus_sprites(), m_item_pocket_border(Surface::from_file("images/engine/hud/item_pocket.png")) { @@ -98,61 +96,6 @@ PlayerStatusHUD::draw(DrawingContext& context) PlayerStatusHUD::text_color); } - hudpos += 8.f; - for (int target = 0; target < InputManager::current()->get_num_users(); target++) - { - SurfacePtr surface; - std::string ammo_text; - - if (m_player_status.bonus[target] == FIRE_BONUS) - { - surface = fire_surface; - ammo_text = std::to_string(m_player_status.max_fire_bullets[target]); - } - else if (m_player_status.bonus[target] == ICE_BONUS) - { - surface = ice_surface; - ammo_text = std::to_string(m_player_status.max_ice_bullets[target]); - } - else - { - continue; - } - - hudpos += static_cast(surface->get_height()); - - const float ammo_text_width = Resources::fixed_font->get_text_width(ammo_text); - - if (InputManager::current()->get_num_users() > 1) - { - const std::string player_text = std::to_string(target + 1) + ":"; - - context.color().draw_text(Resources::fixed_font, - player_text, - Vector(context.get_width() - BORDER_X - ammo_text_width - - static_cast(surface->get_width()) - - Resources::fixed_font->get_text_width(player_text) - 3.f, - hudpos + 13.f), - ALIGN_LEFT, - LAYER_HUD, - PlayerStatusHUD::text_color); - } - - context.color().draw_surface(surface, - Vector(context.get_width() - BORDER_X - ammo_text_width - - static_cast(surface->get_width()), - hudpos), - LAYER_HUD); - - context.color().draw_text(Resources::fixed_font, - ammo_text, - Vector(context.get_width() - BORDER_X - ammo_text_width, - hudpos + 13.f), - ALIGN_LEFT, - LAYER_HUD, - PlayerStatusHUD::text_color); - } - for (int i = 0; i < m_player_status.m_num_players; i++) { float ypos = static_cast(m_item_pocket_border->get_height() * i); Vector pos(BORDER_X, BORDER_Y + ypos); diff --git a/src/supertux/player_status_hud.hpp b/src/supertux/player_status_hud.hpp index b001d02f9ff..38038c7438d 100644 --- a/src/supertux/player_status_hud.hpp +++ b/src/supertux/player_status_hud.hpp @@ -52,8 +52,6 @@ class PlayerStatusHUD : public GameObject int displayed_coins; int displayed_coins_frame; SurfacePtr coin_surface; - SurfacePtr fire_surface; - SurfacePtr ice_surface; std::unordered_map m_bonus_sprites; SurfacePtr m_item_pocket_border;