Skip to content

Commit

Permalink
Fix possible crash in IsPlayerCanDiscardDeckAsCost with count of 0
Browse files Browse the repository at this point in the history
If 0 was passed as count, and the checked player had no cards in his deck, and a EFFECT_TO_GRAVE_REDIRECT was applied, the core would've crashed
  • Loading branch information
edo9300 committed Dec 21, 2023
1 parent 8b5c5d9 commit 48a4ecf
Show file tree
Hide file tree
Showing 3 changed files with 10 additions and 11 deletions.
10 changes: 6 additions & 4 deletions field.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2618,16 +2618,18 @@ int32_t field::check_with_sum_greater_limit_m(const card_vector& mats, int32_t a
int32_t field::is_player_can_draw(uint8_t playerid) {
return !is_player_affected_by_effect(playerid, EFFECT_CANNOT_DRAW);
}
int32_t field::is_player_can_discard_deck(uint8_t playerid, int32_t count) {
if(player[playerid].list_main.size() < (uint32_t)count)
int32_t field::is_player_can_discard_deck(uint8_t playerid, uint32_t count) {
if(player[playerid].list_main.size() < count)
return FALSE;
return !is_player_affected_by_effect(playerid, EFFECT_CANNOT_DISCARD_DECK);
}
int32_t field::is_player_can_discard_deck_as_cost(uint8_t playerid, int32_t count) {
if(player[playerid].list_main.size() < (uint32_t)count)
int32_t field::is_player_can_discard_deck_as_cost(uint8_t playerid, uint32_t count) {
if(player[playerid].list_main.size() < count)
return FALSE;
if(is_player_affected_by_effect(playerid, EFFECT_CANNOT_DISCARD_DECK))
return FALSE;
if(player[playerid].list_main.empty())
return TRUE;
card* topcard = player[playerid].list_main.back();
if((count == 1) && topcard->is_position(POS_FACEUP))
return topcard->is_capable_cost_to_grave(playerid);
Expand Down
4 changes: 2 additions & 2 deletions field.h
Original file line number Diff line number Diff line change
Expand Up @@ -529,8 +529,8 @@ class field {
static int32_t check_with_sum_greater_limit_m(const card_vector& mats, int32_t acc, int32_t index, int32_t opmin, int32_t must_count, int32_t* should_continue);

int32_t is_player_can_draw(uint8_t playerid);
int32_t is_player_can_discard_deck(uint8_t playerid, int32_t count);
int32_t is_player_can_discard_deck_as_cost(uint8_t playerid, int32_t count);
int32_t is_player_can_discard_deck(uint8_t playerid, uint32_t count);
int32_t is_player_can_discard_deck_as_cost(uint8_t playerid, uint32_t count);
int32_t is_player_can_discard_hand(uint8_t playerid, card* pcard, effect* peffect, uint32_t reason);
int32_t is_player_can_action(uint8_t playerid, uint32_t actionlimit);
int32_t is_player_can_summon(uint32_t sumtype, uint8_t playerid, card* pcard, uint8_t toplayer);
Expand Down
7 changes: 2 additions & 5 deletions libduel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3596,11 +3596,8 @@ LUA_STATIC_FUNCTION(IsPlayerCanDraw) {
return 1;
}
auto count = lua_get<uint32_t, 0>(L, 2);
if(count == 0)
lua_pushboolean(L, pduel->game_field->is_player_can_draw(playerid));
else
lua_pushboolean(L, pduel->game_field->is_player_can_draw(playerid)
&& (pduel->game_field->player[playerid].list_main.size() >= count));
lua_pushboolean(L, pduel->game_field->is_player_can_draw(playerid)
&& (pduel->game_field->player[playerid].list_main.size() >= count));
return 1;
}
LUA_STATIC_FUNCTION(IsPlayerCanDiscardDeck) {
Expand Down

0 comments on commit 48a4ecf

Please sign in to comment.