Commit a982b748 authored by nanahira's avatar nanahira

Merge branch 'master' of github.com:Fluorohydride/ygopro-core

parents 9235e8e2 fa5440d1
...@@ -84,7 +84,7 @@ int32 effect::is_can_be_forbidden() { ...@@ -84,7 +84,7 @@ int32 effect::is_can_be_forbidden() {
// check if a single/field/equip effect is available // check if a single/field/equip effect is available
// check properties: range, EFFECT_FLAG_OWNER_RELATE, STATUS_BATTLE_DESTROYED, STATUS_EFFECT_ENABLED, disabled/forbidden // check properties: range, EFFECT_FLAG_OWNER_RELATE, STATUS_BATTLE_DESTROYED, STATUS_EFFECT_ENABLED, disabled/forbidden
// check fucntions: condition // check fucntions: condition
int32 effect::is_available() { int32 effect::is_available(int32 neglect_disabled) {
if (type & EFFECT_TYPE_ACTIONS) if (type & EFFECT_TYPE_ACTIONS)
return FALSE; return FALSE;
if ((type & (EFFECT_TYPE_SINGLE | EFFECT_TYPE_XMATERIAL)) && !(type & EFFECT_TYPE_FIELD)) { if ((type & (EFFECT_TYPE_SINGLE | EFFECT_TYPE_XMATERIAL)) && !(type & EFFECT_TYPE_FIELD)) {
...@@ -102,9 +102,9 @@ int32 effect::is_available() { ...@@ -102,9 +102,9 @@ int32 effect::is_available() {
return FALSE; return FALSE;
if(powner == phandler && is_can_be_forbidden() && phandler->get_status(STATUS_FORBIDDEN)) if(powner == phandler && is_can_be_forbidden() && phandler->get_status(STATUS_FORBIDDEN))
return FALSE; return FALSE;
if(is_flag(EFFECT_FLAG_OWNER_RELATE) && !is_flag(EFFECT_FLAG_CANNOT_DISABLE) && powner->is_status(STATUS_DISABLED)) if(is_flag(EFFECT_FLAG_OWNER_RELATE) && !(is_flag(EFFECT_FLAG_CANNOT_DISABLE) || neglect_disabled) && powner->is_status(STATUS_DISABLED))
return FALSE; return FALSE;
if(powner == phandler && !is_flag(EFFECT_FLAG_CANNOT_DISABLE) && phandler->get_status(STATUS_DISABLED)) if(powner == phandler && !(is_flag(EFFECT_FLAG_CANNOT_DISABLE) || neglect_disabled) && phandler->get_status(STATUS_DISABLED))
return FALSE; return FALSE;
} }
if (type & EFFECT_TYPE_EQUIP) { if (type & EFFECT_TYPE_EQUIP) {
...@@ -114,9 +114,9 @@ int32 effect::is_available() { ...@@ -114,9 +114,9 @@ int32 effect::is_available() {
return FALSE; return FALSE;
if(owner == handler && is_can_be_forbidden() && handler->get_status(STATUS_FORBIDDEN)) if(owner == handler && is_can_be_forbidden() && handler->get_status(STATUS_FORBIDDEN))
return FALSE; return FALSE;
if(is_flag(EFFECT_FLAG_OWNER_RELATE) && !is_flag(EFFECT_FLAG_CANNOT_DISABLE) && owner->is_status(STATUS_DISABLED)) if(is_flag(EFFECT_FLAG_OWNER_RELATE) && !(is_flag(EFFECT_FLAG_CANNOT_DISABLE) || neglect_disabled) && owner->is_status(STATUS_DISABLED))
return FALSE; return FALSE;
if(owner == handler && !is_flag(EFFECT_FLAG_CANNOT_DISABLE) && handler->get_status(STATUS_DISABLED)) if(owner == handler && !(is_flag(EFFECT_FLAG_CANNOT_DISABLE) || neglect_disabled) && handler->get_status(STATUS_DISABLED))
return FALSE; return FALSE;
if(!is_flag(EFFECT_FLAG_SET_AVAILABLE)) { if(!is_flag(EFFECT_FLAG_SET_AVAILABLE)) {
if(!(handler->get_status(STATUS_EFFECT_ENABLED))) if(!(handler->get_status(STATUS_EFFECT_ENABLED)))
...@@ -141,9 +141,9 @@ int32 effect::is_available() { ...@@ -141,9 +141,9 @@ int32 effect::is_available() {
return FALSE; return FALSE;
if(powner == phandler && is_can_be_forbidden() && phandler->get_status(STATUS_FORBIDDEN)) if(powner == phandler && is_can_be_forbidden() && phandler->get_status(STATUS_FORBIDDEN))
return FALSE; return FALSE;
if(is_flag(EFFECT_FLAG_OWNER_RELATE) && !is_flag(EFFECT_FLAG_CANNOT_DISABLE) && powner->is_status(STATUS_DISABLED)) if(is_flag(EFFECT_FLAG_OWNER_RELATE) && !(is_flag(EFFECT_FLAG_CANNOT_DISABLE) || neglect_disabled) && powner->is_status(STATUS_DISABLED))
return FALSE; return FALSE;
if(powner == phandler && !is_flag(EFFECT_FLAG_CANNOT_DISABLE) && phandler->get_status(STATUS_DISABLED)) if(powner == phandler && !(is_flag(EFFECT_FLAG_CANNOT_DISABLE) || neglect_disabled) && phandler->get_status(STATUS_DISABLED))
return FALSE; return FALSE;
if(phandler->is_status(STATUS_BATTLE_DESTROYED) && !is_flag(EFFECT_FLAG2_AVAILABLE_BD)) if(phandler->is_status(STATUS_BATTLE_DESTROYED) && !is_flag(EFFECT_FLAG2_AVAILABLE_BD))
return FALSE; return FALSE;
...@@ -161,6 +161,10 @@ int32 effect::is_available() { ...@@ -161,6 +161,10 @@ int32 effect::is_available() {
status &= ~EFFECT_STATUS_AVAILABLE; status &= ~EFFECT_STATUS_AVAILABLE;
return res; return res;
} }
// check if a count limit effect counter is available, which should be available even if the effect is disabled
int32 effect::limit_counter_is_available() {
return is_available(TRUE);
}
// check if a effect is EFFECT_TYPE_SINGLE and is ready // check if a effect is EFFECT_TYPE_SINGLE and is ready
// check: range, enabled, condition // check: range, enabled, condition
int32 effect::is_single_ready() { int32 effect::is_single_ready() {
...@@ -302,6 +306,8 @@ int32 effect::is_activateable(uint8 playerid, const tevent& e, int32 neglect_con ...@@ -302,6 +306,8 @@ int32 effect::is_activateable(uint8 playerid, const tevent& e, int32 neglect_con
return FALSE; return FALSE;
if((phandler->get_type() & TYPE_CONTINUOUS) && (phandler->get_type() & TYPE_EQUIP)) if((phandler->get_type() & TYPE_CONTINUOUS) && (phandler->get_type() & TYPE_EQUIP))
return FALSE; return FALSE;
if((type & EFFECT_TYPE_QUICK_O) && is_flag(EFFECT_FLAG_DELAY) && !in_range(phandler))
return FALSE;
if(!neglect_faceup && (phandler->current.location & (LOCATION_ONFIELD | LOCATION_REMOVED))) { if(!neglect_faceup && (phandler->current.location & (LOCATION_ONFIELD | LOCATION_REMOVED))) {
if(!phandler->is_position(POS_FACEUP) && !is_flag(EFFECT_FLAG_SET_AVAILABLE)) if(!phandler->is_position(POS_FACEUP) && !is_flag(EFFECT_FLAG_SET_AVAILABLE))
return FALSE; return FALSE;
......
...@@ -68,7 +68,8 @@ public: ...@@ -68,7 +68,8 @@ public:
int32 is_disable_related(); int32 is_disable_related();
int32 is_self_destroy_related(); int32 is_self_destroy_related();
int32 is_can_be_forbidden(); int32 is_can_be_forbidden();
int32 is_available(); int32 is_available(int32 neglect_disabled = FALSE);
int32 limit_counter_is_available();
int32 is_single_ready(); int32 is_single_ready();
int32 check_count_limit(uint8 playerid); int32 check_count_limit(uint8 playerid);
int32 is_activateable(uint8 playerid, const tevent& e, int32 neglect_cond = FALSE, int32 neglect_cost = FALSE, int32 neglect_target = FALSE, int32 neglect_loc = FALSE, int32 neglect_faceup = FALSE); int32 is_activateable(uint8 playerid, const tevent& e, int32 neglect_cond = FALSE, int32 neglect_cost = FALSE, int32 neglect_target = FALSE, int32 neglect_loc = FALSE, int32 neglect_faceup = FALSE);
...@@ -478,6 +479,7 @@ inline effect_flag operator|(effect_flag flag1, effect_flag flag2) ...@@ -478,6 +479,7 @@ inline effect_flag operator|(effect_flag flag1, effect_flag flag2)
#define EFFECT_OVERLAY_RITUAL_MATERIAL 364 #define EFFECT_OVERLAY_RITUAL_MATERIAL 364
#define EFFECT_CHANGE_GRAVE_ATTRIBUTE 365 #define EFFECT_CHANGE_GRAVE_ATTRIBUTE 365
#define EFFECT_CHANGE_GRAVE_RACE 366 #define EFFECT_CHANGE_GRAVE_RACE 366
#define EFFECT_ACTIVATION_COUNT_LIMIT 367
#define EVENT_STARTUP 1000 #define EVENT_STARTUP 1000
#define EVENT_FLIP 1001 #define EVENT_FLIP 1001
......
...@@ -2283,7 +2283,7 @@ void field::set_spsummon_counter(uint8 playerid) { ...@@ -2283,7 +2283,7 @@ void field::set_spsummon_counter(uint8 playerid) {
if(core.global_flag & GLOBALFLAG_SPSUMMON_COUNT) { if(core.global_flag & GLOBALFLAG_SPSUMMON_COUNT) {
for(auto& peffect : effects.spsummon_count_eff) { for(auto& peffect : effects.spsummon_count_eff) {
card* pcard = peffect->get_handler(); card* pcard = peffect->get_handler();
if(peffect->is_available()) { if(peffect->limit_counter_is_available()) {
if(((playerid == pcard->current.controler) && peffect->s_range) || ((playerid != pcard->current.controler) && peffect->o_range)) { if(((playerid == pcard->current.controler) && peffect->s_range) || ((playerid != pcard->current.controler) && peffect->o_range)) {
pcard->spsummon_counter[playerid]++; pcard->spsummon_counter[playerid]++;
} }
......
...@@ -726,6 +726,7 @@ public: ...@@ -726,6 +726,7 @@ public:
#define GLOBALFLAG_SELF_TOGRAVE 0x100 #define GLOBALFLAG_SELF_TOGRAVE 0x100
#define GLOBALFLAG_SPSUMMON_ONCE 0x200 #define GLOBALFLAG_SPSUMMON_ONCE 0x200
#define GLOBALFLAG_TUNE_MAGICIAN 0x400 #define GLOBALFLAG_TUNE_MAGICIAN 0x400
#define GLOBALFLAG_ACTIVATION_COUNT 0x800
// //
#define PROCESSOR_NONE 0 #define PROCESSOR_NONE 0
#define PROCESSOR_WAITING 0x10000 #define PROCESSOR_WAITING 0x10000
......
...@@ -29,11 +29,19 @@ interpreter::interpreter(duel* pd): coroutines(256) { ...@@ -29,11 +29,19 @@ interpreter::interpreter(duel* pd): coroutines(256) {
lua_setglobal(lua_state, "io"); lua_setglobal(lua_state, "io");
lua_pushnil(lua_state); lua_pushnil(lua_state);
lua_setglobal(lua_state, "os"); lua_setglobal(lua_state, "os");
lua_pushnil(lua_state);
lua_setglobal(lua_state, "package");
lua_pushnil(lua_state);
lua_setglobal(lua_state, "debug");
luaL_getsubtable(lua_state, LUA_REGISTRYINDEX, "_LOADED"); luaL_getsubtable(lua_state, LUA_REGISTRYINDEX, "_LOADED");
lua_pushnil(lua_state); lua_pushnil(lua_state);
lua_setfield(lua_state, -2, "io"); lua_setfield(lua_state, -2, "io");
lua_pushnil(lua_state); lua_pushnil(lua_state);
lua_setfield(lua_state, -2, "os"); lua_setfield(lua_state, -2, "os");
lua_pushnil(lua_state);
lua_setfield(lua_state, -2, "package");
lua_pushnil(lua_state);
lua_setfield(lua_state, -2, "debug");
lua_pop(lua_state, 1); lua_pop(lua_state, 1);
#endif #endif
//add bit lib back //add bit lib back
...@@ -241,9 +249,18 @@ int32 interpreter::load_card_script(uint32 code) { ...@@ -241,9 +249,18 @@ int32 interpreter::load_card_script(uint32 code) {
lua_pushstring(current_state, "__index"); lua_pushstring(current_state, "__index");
lua_pushvalue(current_state, -2); lua_pushvalue(current_state, -2);
lua_rawset(current_state, -3); lua_rawset(current_state, -3);
lua_getglobal(current_state, class_name);
lua_setglobal(current_state, "self_table");
lua_pushinteger(current_state, code);
lua_setglobal(current_state, "self_code");
char script_name[64]; char script_name[64];
sprintf(script_name, "./script/c%d.lua", code); sprintf(script_name, "./script/c%d.lua", code);
if(!load_script(script_name)) { int32 res = load_script(script_name);
lua_pushnil(current_state);
lua_setglobal(current_state, "self_table");
lua_pushnil(current_state);
lua_setglobal(current_state, "self_code");
if(!res) {
return OPERATION_FAIL; return OPERATION_FAIL;
} }
} }
......
...@@ -417,7 +417,7 @@ int32 scriptlib::effect_get_owner(lua_State *L) { ...@@ -417,7 +417,7 @@ int32 scriptlib::effect_get_owner(lua_State *L) {
check_param_count(L, 1); check_param_count(L, 1);
check_param(L, PARAM_TYPE_EFFECT, 1); check_param(L, PARAM_TYPE_EFFECT, 1);
effect* peffect = *(effect**) lua_touserdata(L, 1); effect* peffect = *(effect**) lua_touserdata(L, 1);
interpreter::card2value(L, peffect->owner); interpreter::card2value(L, peffect->get_owner());
return 1; return 1;
} }
int32 scriptlib::effect_get_handler(lua_State *L) { int32 scriptlib::effect_get_handler(lua_State *L) {
......
...@@ -1683,6 +1683,13 @@ int32 field::process_quick_effect(int16 step, int32 skip_freechain, uint8 priori ...@@ -1683,6 +1683,13 @@ int32 field::process_quick_effect(int16 step, int32 skip_freechain, uint8 priori
core.select_chains.push_back(newchain); core.select_chains.push_back(newchain);
} }
} }
pr = effects.quick_o_effect.equal_range(ev.event_code);
for(auto eit = pr.first; eit != pr.second;) {
effect* peffect = eit->second;
++eit;
if(peffect->is_flag(EFFECT_FLAG_DELAY) && peffect->is_condition_check(peffect->get_handler()->current.controler, ev))
core.delayed_quick.emplace(peffect, ev);
}
} }
// delayed quick // delayed quick
for(auto eit = core.delayed_quick.begin(); eit != core.delayed_quick.end();) { for(auto eit = core.delayed_quick.begin(); eit != core.delayed_quick.end();) {
...@@ -3158,11 +3165,11 @@ int32 field::process_battle_command(uint16 step) { ...@@ -3158,11 +3165,11 @@ int32 field::process_battle_command(uint16 step) {
if(core.attack_target) if(core.attack_target)
raise_single_event(core.attack_target, 0, EVENT_DAMAGE_STEP_END, 0, 0, 0, 0, 1); raise_single_event(core.attack_target, 0, EVENT_DAMAGE_STEP_END, 0, 0, 0, 0, 1);
raise_event((card*)0, EVENT_DAMAGE_STEP_END, 0, 0, 0, 0, 0); raise_event((card*)0, EVENT_DAMAGE_STEP_END, 0, 0, 0, 0, 0);
process_single_event();
process_instant_event();
core.attacker->set_status(STATUS_BATTLE_DESTROYED, FALSE); core.attacker->set_status(STATUS_BATTLE_DESTROYED, FALSE);
if(core.attack_target) if(core.attack_target)
core.attack_target->set_status(STATUS_BATTLE_DESTROYED, FALSE); core.attack_target->set_status(STATUS_BATTLE_DESTROYED, FALSE);
process_single_event();
process_instant_event();
pduel->write_buffer8(MSG_HINT); pduel->write_buffer8(MSG_HINT);
pduel->write_buffer8(HINT_EVENT); pduel->write_buffer8(HINT_EVENT);
pduel->write_buffer8(0); pduel->write_buffer8(0);
...@@ -3432,6 +3439,7 @@ void field::calculate_battle_damage(effect** pdamchange, card** preason_card, ui ...@@ -3432,6 +3439,7 @@ void field::calculate_battle_damage(effect** pdamchange, card** preason_card, ui
} }
effect_set eset; effect_set eset;
core.attacker->filter_effect(EFFECT_CHANGE_BATTLE_DAMAGE, &eset, FALSE); core.attacker->filter_effect(EFFECT_CHANGE_BATTLE_DAMAGE, &eset, FALSE);
core.attacker->filter_effect(EFFECT_CHANGE_INVOLVING_BATTLE_DAMAGE, &eset, FALSE);
core.attack_target->filter_effect(EFFECT_CHANGE_INVOLVING_BATTLE_DAMAGE, &eset, FALSE); core.attack_target->filter_effect(EFFECT_CHANGE_INVOLVING_BATTLE_DAMAGE, &eset, FALSE);
filter_player_effect(pa, EFFECT_CHANGE_BATTLE_DAMAGE, &eset, FALSE); filter_player_effect(pa, EFFECT_CHANGE_BATTLE_DAMAGE, &eset, FALSE);
filter_player_effect(1 - pa, EFFECT_CHANGE_BATTLE_DAMAGE, &eset, FALSE); filter_player_effect(1 - pa, EFFECT_CHANGE_BATTLE_DAMAGE, &eset, FALSE);
...@@ -3551,6 +3559,7 @@ void field::calculate_battle_damage(effect** pdamchange, card** preason_card, ui ...@@ -3551,6 +3559,7 @@ void field::calculate_battle_damage(effect** pdamchange, card** preason_card, ui
} }
effect_set eset; effect_set eset;
reason_card->filter_effect(EFFECT_CHANGE_BATTLE_DAMAGE, &eset, FALSE); reason_card->filter_effect(EFFECT_CHANGE_BATTLE_DAMAGE, &eset, FALSE);
reason_card->filter_effect(EFFECT_CHANGE_INVOLVING_BATTLE_DAMAGE, &eset, FALSE);
if(dam_card) if(dam_card)
dam_card->filter_effect(EFFECT_CHANGE_INVOLVING_BATTLE_DAMAGE, &eset, FALSE); dam_card->filter_effect(EFFECT_CHANGE_INVOLVING_BATTLE_DAMAGE, &eset, FALSE);
filter_player_effect(damp, EFFECT_CHANGE_BATTLE_DAMAGE, &eset, FALSE); filter_player_effect(damp, EFFECT_CHANGE_BATTLE_DAMAGE, &eset, FALSE);
...@@ -5034,8 +5043,10 @@ int32 field::adjust_step(uint16 step) { ...@@ -5034,8 +5043,10 @@ int32 field::adjust_step(uint16 step) {
return FALSE; return FALSE;
} }
case 15: { case 15: {
if(!check_event(EVENT_ADJUST)) {
raise_event((card*)0, EVENT_ADJUST, 0, 0, PLAYER_NONE, PLAYER_NONE, 0); raise_event((card*)0, EVENT_ADJUST, 0, 0, PLAYER_NONE, PLAYER_NONE, 0);
process_instant_event(); process_instant_event();
}
return FALSE; return FALSE;
} }
case 16: { case 16: {
......
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