Commit 07785303 authored by fallenstardust's avatar fallenstardust

sync ocgcore

parent 726db1af
......@@ -63,6 +63,7 @@ effect::effect(duel* pd) {
target = 0;
value = 0;
operation = 0;
cost_checked = FALSE;
}
int32 effect::is_disable_related() {
if (code == EFFECT_IMMUNE_EFFECT || code == EFFECT_DISABLE || code == EFFECT_CANNOT_DISABLE || code == EFFECT_FORBIDDEN)
......@@ -410,18 +411,22 @@ int32 effect::is_activate_ready(effect* reason_effect, uint8 playerid, const tev
return FALSE;
}
}
if(!neglect_cost && cost && !(type & EFFECT_TYPE_CONTINUOUS)) {
pduel->lua->add_param(reason_effect, PARAM_TYPE_EFFECT);
pduel->lua->add_param(playerid, PARAM_TYPE_INT);
pduel->lua->add_param(e.event_cards, PARAM_TYPE_GROUP);
pduel->lua->add_param(e.event_player, PARAM_TYPE_INT);
pduel->lua->add_param(e.event_value, PARAM_TYPE_INT);
pduel->lua->add_param(e.reason_effect, PARAM_TYPE_EFFECT);
pduel->lua->add_param(e.reason, PARAM_TYPE_INT);
pduel->lua->add_param(e.reason_player, PARAM_TYPE_INT);
pduel->lua->add_param((ptr)0, PARAM_TYPE_INT);
if(!pduel->lua->check_condition(cost, 9)) {
return FALSE;
if(!neglect_cost && !(type & EFFECT_TYPE_CONTINUOUS)) {
cost_checked = TRUE;
if(cost) {
pduel->lua->add_param(reason_effect, PARAM_TYPE_EFFECT);
pduel->lua->add_param(playerid, PARAM_TYPE_INT);
pduel->lua->add_param(e.event_cards, PARAM_TYPE_GROUP);
pduel->lua->add_param(e.event_player, PARAM_TYPE_INT);
pduel->lua->add_param(e.event_value, PARAM_TYPE_INT);
pduel->lua->add_param(e.reason_effect, PARAM_TYPE_EFFECT);
pduel->lua->add_param(e.reason, PARAM_TYPE_INT);
pduel->lua->add_param(e.reason_player, PARAM_TYPE_INT);
pduel->lua->add_param((ptr)0, PARAM_TYPE_INT);
if(!pduel->lua->check_condition(cost, 9)) {
cost_checked = FALSE;
return FALSE;
}
}
}
if(!neglect_target && target) {
......@@ -435,9 +440,11 @@ int32 effect::is_activate_ready(effect* reason_effect, uint8 playerid, const tev
pduel->lua->add_param(e.reason_player, PARAM_TYPE_INT);
pduel->lua->add_param((ptr)0, PARAM_TYPE_INT);
if(!pduel->lua->check_condition(target, 9)) {
cost_checked = FALSE;
return FALSE;
}
}
cost_checked = FALSE;
return TRUE;
}
int32 effect::is_activate_ready(uint8 playerid, const tevent& e, int32 neglect_cond, int32 neglect_cost, int32 neglect_target) {
......
......@@ -61,6 +61,7 @@ public:
int32 target;
int32 value;
int32 operation;
uint8 cost_checked;
explicit effect(duel* pd);
~effect() = default;
......
......@@ -1907,10 +1907,12 @@ int32 scriptlib::card_is_relate_to_effect(lua_State *L) {
return 1;
}
int32 scriptlib::card_is_relate_to_chain(lua_State *L) {
check_param_count(L, 2);
check_param_count(L, 1);
check_param(L, PARAM_TYPE_CARD, 1);
card* pcard = *(card**) lua_touserdata(L, 1);
uint32 chain_count = (uint32)lua_tointeger(L, 2);
uint32 chain_count = 0;
if(lua_gettop(L) >= 2)
chain_count = (uint32)lua_tointeger(L, 2);
duel* pduel = pcard->pduel;
if(chain_count > pduel->game_field->core.current_chain.size() || chain_count < 1)
chain_count = (uint32)pduel->game_field->core.current_chain.size();
......@@ -2436,6 +2438,13 @@ int32 scriptlib::card_is_faceup(lua_State *L) {
lua_pushboolean(L, pcard->is_position(POS_FACEUP));
return 1;
}
int32 scriptlib::card_is_faceup_ex(lua_State *L) {
check_param_count(L, 1);
check_param(L, PARAM_TYPE_CARD, 1);
card* pcard = *(card**) lua_touserdata(L, 1);
lua_pushboolean(L, pcard->is_position(POS_FACEUP) | (pcard->current.location & (LOCATION_HAND | LOCATION_GRAVE | LOCATION_DECK)));
return 1;
}
int32 scriptlib::card_is_attack_pos(lua_State *L) {
check_param_count(L, 1);
check_param(L, PARAM_TYPE_CARD, 1);
......@@ -3421,6 +3430,7 @@ static const struct luaL_Reg cardlib[] = {
{ "IsAttackable", scriptlib::card_is_attackable },
{ "IsChainAttackable", scriptlib::card_is_chain_attackable },
{ "IsFaceup", scriptlib::card_is_faceup },
{ "IsFaceupEx", scriptlib::card_is_faceup_ex },
{ "IsAttackPos", scriptlib::card_is_attack_pos },
{ "IsFacedown", scriptlib::card_is_facedown },
{ "IsDefensePos", scriptlib::card_is_defense_pos },
......
......@@ -1431,7 +1431,11 @@ int32 scriptlib::duel_check_lp_cost(lua_State *L) {
uint32 playerid = (uint32)lua_tointeger(L, 1);
if(playerid != 0 && playerid != 1)
return 0;
uint32 cost = (uint32)lua_tointeger(L, 2);
int32 cost = (int32)lua_tointeger(L, 2);
if(cost <= 0) {
lua_pushboolean(L, 0);
return 1;
}
duel* pduel = interpreter::get_duel_info(L);
uint32 must_pay = FALSE;
if(lua_gettop(L) > 2)
......@@ -2343,6 +2347,13 @@ int32 scriptlib::duel_adjust_instantly(lua_State *L) {
pduel->game_field->adjust_instant();
return 0;
}
int32 scriptlib::duel_adjust_all(lua_State* L) {
duel* pduel = interpreter::get_duel_info(L);
pduel->game_field->adjust_all();
return lua_yieldk(L, 0, (lua_KContext)pduel, [](lua_State *L, int32 status, lua_KContext ctx) {
return 0;
});
}
/**
* \brief Duel.GetFieldGroup
* \param playerid, location1, location2
......@@ -4674,6 +4685,7 @@ static const struct luaL_Reg duellib[] = {
{ "ChainAttack", scriptlib::duel_chain_attack },
{ "Readjust", scriptlib::duel_readjust },
{ "AdjustInstantly", scriptlib::duel_adjust_instantly },
{ "AdjustAll", scriptlib::duel_adjust_all },
{ "GetFieldGroup", scriptlib::duel_get_field_group },
{ "GetFieldGroupCount", scriptlib::duel_get_field_group_count },
{ "GetDecktopGroup", scriptlib::duel_get_decktop_group },
......
......@@ -512,13 +512,20 @@ int32 scriptlib::effect_is_activatable(lua_State *L) {
lua_pushboolean(L, peffect->is_activateable(playerid, peffect->pduel->game_field->nil_event, 0, 0, neglect_target, neglect_loc));
return 1;
}
int32 scriptlib::effect_is_activated(lua_State * L) {
int32 scriptlib::effect_is_activated(lua_State *L) {
check_param_count(L, 1);
check_param(L, PARAM_TYPE_EFFECT, 1);
effect* peffect = *(effect**) lua_touserdata(L, 1);
lua_pushboolean(L, (peffect->type & 0x7f0));
return 1;
}
int32 scriptlib::effect_is_cost_checked(lua_State *L) {
check_param_count(L, 1);
check_param(L, PARAM_TYPE_EFFECT, 1);
effect* peffect = *(effect**)lua_touserdata(L, 1);
lua_pushboolean(L, peffect->cost_checked);
return 1;
}
int32 scriptlib::effect_get_activate_location(lua_State *L) {
check_param_count(L, 1);
check_param(L, PARAM_TYPE_EFFECT, 1);
......@@ -610,6 +617,7 @@ static const struct luaL_Reg effectlib[] = {
{ "IsHasType", scriptlib::effect_is_has_type },
{ "IsActivatable", scriptlib::effect_is_activatable },
{ "IsActivated", scriptlib::effect_is_activated },
{ "IsCostChecked", scriptlib::effect_is_cost_checked },
{ "GetActivateLocation", scriptlib::effect_get_activate_location },
{ "GetActivateSequence", scriptlib::effect_get_activate_sequence },
{ "CheckCountLimit", scriptlib::effect_check_count_limit },
......
......@@ -222,6 +222,7 @@ public:
static int32 card_is_attackable(lua_State *L);
static int32 card_is_chain_attackable(lua_State *L);
static int32 card_is_faceup(lua_State *L);
static int32 card_is_faceup_ex(lua_State *L);
static int32 card_is_attack_pos(lua_State *L);
static int32 card_is_facedown(lua_State *L);
static int32 card_is_defense_pos(lua_State *L);
......@@ -329,6 +330,7 @@ public:
static int32 effect_is_has_type(lua_State *L);
static int32 effect_is_activatable(lua_State *L);
static int32 effect_is_activated(lua_State *L);
static int32 effect_is_cost_checked(lua_State *L);
static int32 effect_get_activate_location(lua_State *L);
static int32 effect_get_activate_sequence(lua_State *L);
static int32 effect_check_count_limit(lua_State *L);
......@@ -486,6 +488,7 @@ public:
static int32 duel_chain_attack(lua_State *L);
static int32 duel_readjust(lua_State *L);
static int32 duel_adjust_instantly(lua_State *L);
static int32 duel_adjust_all(lua_State *L);
static int32 duel_get_field_group(lua_State *L);
static int32 duel_get_field_group_count(lua_State *L);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment