Skip to content

Commit

Permalink
powerup stacking is gone
Browse files Browse the repository at this point in the history
  • Loading branch information
MatusGuy committed Oct 6, 2024
1 parent 04348f8 commit 336ea97
Show file tree
Hide file tree
Showing 15 changed files with 32 additions and 240 deletions.
1 change: 1 addition & 0 deletions src/object/moving_sprite.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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; }
Expand Down
26 changes: 6 additions & 20 deletions src/object/player.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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) :
Expand Down Expand Up @@ -1562,10 +1565,8 @@ Player::handle_input()
/* Shoot! */
auto active_bullets = Sector::get().get_object_count<Bullet>([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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand Down
6 changes: 3 additions & 3 deletions src/object/player.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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;
Expand Down
10 changes: 1 addition & 9 deletions src/supertux/game_session.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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();

Expand All @@ -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;
Expand Down Expand Up @@ -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.
Expand All @@ -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()];
}
}
Expand Down Expand Up @@ -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();
}

Expand Down
32 changes: 3 additions & 29 deletions src/supertux/menu/cheat_apply_menu.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,7 @@
#include "supertux/sector.hpp"

CheatApplyMenu::CheatApplyMenu(std::function<void(Player&)> callback) :
m_callback_1(callback),
m_callback_2(nullptr),
m_stack_count(-1)
m_callback(callback)
{
add_label(_("Apply cheat to player"));
add_hl();
Expand All @@ -42,26 +40,6 @@ CheatApplyMenu::CheatApplyMenu(std::function<void(Player&)> callback) :
add_back(_("Back"));
}

CheatApplyMenu::CheatApplyMenu(std::function<void(Player&, int)> 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)
{
Expand All @@ -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);
}
}

Expand Down
6 changes: 1 addition & 5 deletions src/supertux/menu/cheat_apply_menu.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,15 +25,11 @@ class CheatApplyMenu final : public Menu
{
public:
CheatApplyMenu(std::function<void(Player&)> callback);
/** Use this for cheats that need a stack count, e. g. giving fire flowers */
CheatApplyMenu(std::function<void(Player&, int)> callback);

void menu_action(MenuItem& item) override;

private:
std::function<void(Player&)> m_callback_1;
std::function<void(Player&, int)> m_callback_2;
int m_stack_count;
std::function<void(Player&)> m_callback;

private:
CheatApplyMenu(const CheatApplyMenu&) = delete;
Expand Down
12 changes: 4 additions & 8 deletions src/supertux/menu/cheat_menu.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -82,30 +82,26 @@ CheatMenu::menu_action(MenuItem& item)
break;

case MNID_FIRE:
MenuManager::instance().push_menu(std::make_unique<CheatApplyMenu>([](Player& player, int count){
MenuManager::instance().push_menu(std::make_unique<CheatApplyMenu>([](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<CheatApplyMenu>([](Player& player, int count){
MenuManager::instance().push_menu(std::make_unique<CheatApplyMenu>([](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<CheatApplyMenu>([](Player& player, int count){
MenuManager::instance().push_menu(std::make_unique<CheatApplyMenu>([](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<CheatApplyMenu>([](Player& player, int count){
MenuManager::instance().push_menu(std::make_unique<CheatApplyMenu>([](Player& player){
player.set_bonus(EARTH_BONUS);
player.get_status().max_earth_time[player.get_id()] = count;
}));
break;

Expand Down
41 changes: 6 additions & 35 deletions src/supertux/menu/worldmap_cheat_apply_menu.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,9 @@
#include "supertux/sector.hpp"

WorldmapCheatApplyMenu::WorldmapCheatApplyMenu(int num_players,
std::function<void(int)> callback) :
std::function<void(int)> 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();
Expand All @@ -41,27 +39,6 @@ WorldmapCheatApplyMenu::WorldmapCheatApplyMenu(int num_players,
add_back(_("Back"));
}

WorldmapCheatApplyMenu::WorldmapCheatApplyMenu(int num_players,
std::function<void(int, int)> 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)
{
Expand All @@ -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();
Expand Down
6 changes: 1 addition & 5 deletions src/supertux/menu/worldmap_cheat_apply_menu.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,16 +25,12 @@ class WorldmapCheatApplyMenu final : public Menu
{
public:
WorldmapCheatApplyMenu(int num_players, std::function<void(int)> callback);
/** Use this for cheats that need a stack count, e. g. giving fire flowers */
WorldmapCheatApplyMenu(int num_players, std::function<void(int, int)> callback);

void menu_action(MenuItem& item) override;

private:
int m_num_players;
std::function<void(int)> m_callback_1;
std::function<void(int, int)> m_callback_2;
int m_stack_count;
std::function<void(int)> m_callback;

private:
WorldmapCheatApplyMenu(const WorldmapCheatApplyMenu&) = delete;
Expand Down
19 changes: 4 additions & 15 deletions src/supertux/menu/worldmap_cheat_menu.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -174,13 +170,6 @@ WorldmapCheatMenu::do_cheat(PlayerStatus& status,
}
}

void
WorldmapCheatMenu::do_cheat(PlayerStatus& status,
std::function<void(int, int)> callback)
{
MenuManager::instance().push_menu(std::make_unique<WorldmapCheatApplyMenu>(status.m_num_players, callback));
}

WorldmapLevelSelectMenu::WorldmapLevelSelectMenu()
{
auto worldmap_sector = worldmap::WorldMapSector::current();
Expand Down
1 change: 0 additions & 1 deletion src/supertux/menu/worldmap_cheat_menu.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,6 @@ class WorldmapCheatMenu final : public Menu

private:
void do_cheat(PlayerStatus& status, std::function<void(int)> callback);
void do_cheat(PlayerStatus& status, std::function<void(int, int)> callback);

private:
WorldmapCheatMenu(const WorldmapCheatMenu&) = delete;
Expand Down
Loading

0 comments on commit 336ea97

Please sign in to comment.