Commit 81e40af1 authored by wind2009's avatar wind2009

Merge remote-tracking branch 'upstream/master'

parents 1162d9c7 9a0d752c
...@@ -1754,6 +1754,8 @@ int32_t card::add_effect(effect* peffect) { ...@@ -1754,6 +1754,8 @@ int32_t card::add_effect(effect* peffect) {
return 0; return 0;
if (peffect->type & EFFECT_TYPES_TRIGGER_LIKE && is_continuous_event(peffect->code)) if (peffect->type & EFFECT_TYPES_TRIGGER_LIKE && is_continuous_event(peffect->code))
return 0; return 0;
if (peffect->type & EFFECT_TYPES_CHAIN_LINK && peffect->owner == pduel->game_field->temp_card)
return 0;
// the trigger effect in phase is "once per turn" by default // the trigger effect in phase is "once per turn" by default
if (peffect->get_code_type() == CODE_PHASE && peffect->code & (PHASE_DRAW | PHASE_STANDBY | PHASE_END) if (peffect->get_code_type() == CODE_PHASE && peffect->code & (PHASE_DRAW | PHASE_STANDBY | PHASE_END)
&& peffect->type & (EFFECT_TYPE_TRIGGER_O | EFFECT_TYPE_TRIGGER_F) && !peffect->is_flag(EFFECT_FLAG_COUNT_LIMIT)) { && peffect->type & (EFFECT_TYPE_TRIGGER_O | EFFECT_TYPE_TRIGGER_F) && !peffect->is_flag(EFFECT_FLAG_COUNT_LIMIT)) {
......
...@@ -31,8 +31,8 @@ duel::~duel() { ...@@ -31,8 +31,8 @@ duel::~duel() {
delete pgroup; delete pgroup;
for(auto& peffect : effects) for(auto& peffect : effects)
delete peffect; delete peffect;
delete lua;
delete game_field; delete game_field;
delete lua;
} }
void duel::clear() { void duel::clear() {
for(auto& pcard : cards) for(auto& pcard : cards)
......
...@@ -1164,6 +1164,8 @@ void field::add_effect(effect* peffect, uint8_t owner_player) { ...@@ -1164,6 +1164,8 @@ void field::add_effect(effect* peffect, uint8_t owner_player) {
return; return;
if (effects.indexer.find(peffect) != effects.indexer.end()) if (effects.indexer.find(peffect) != effects.indexer.end())
return; return;
if (peffect->type & EFFECT_TYPES_CHAIN_LINK && peffect->owner == temp_card)
return;
effect_container::iterator it; effect_container::iterator it;
if (!(peffect->type & EFFECT_TYPE_ACTIONS)) { if (!(peffect->type & EFFECT_TYPE_ACTIONS)) {
it = effects.aura_effect.emplace(peffect->code, peffect); it = effects.aura_effect.emplace(peffect->code, peffect);
...@@ -2622,6 +2624,16 @@ int32_t field::check_tuner_material(lua_State* L, card* pcard, card* tuner, int3 ...@@ -2622,6 +2624,16 @@ int32_t field::check_tuner_material(lua_State* L, card* pcard, card* tuner, int3
return FALSE; return FALSE;
} }
} }
effect* extra_synchro_material_effect = tuner->is_affected_by_effect(EFFECT_EXTRA_SYNCHRO_MATERIAL);
if (extra_synchro_material_effect) {
if (!extra_synchro_material_effect->check_count_limit(playerid)) {
return FALSE;
}
int32_t value = extra_synchro_material_effect->get_value(pcard);
if (value <= 0) {
return FALSE;
}
}
int32_t mzone_limit = get_mzone_limit(playerid, playerid, LOCATION_REASON_TOFIELD); int32_t mzone_limit = get_mzone_limit(playerid, playerid, LOCATION_REASON_TOFIELD);
if(mzone_limit < 0) { if(mzone_limit < 0) {
if(location == LOCATION_HAND) { if(location == LOCATION_HAND) {
......
...@@ -14,13 +14,11 @@ ...@@ -14,13 +14,11 @@
#include "ocgapi.h" #include "ocgapi.h"
#include "interpreter.h" #include "interpreter.h"
interpreter::interpreter(duel* pd, bool enable_unsafe_libraries): coroutines(256) { interpreter::interpreter(duel* pd, bool enable_unsafe_libraries)
: coroutines(256), pduel(pd), enable_unsafe_feature(enable_unsafe_libraries) {
lua_state = luaL_newstate(); lua_state = luaL_newstate();
current_state = lua_state; current_state = lua_state;
pduel = pd;
std::memcpy(lua_getextraspace(lua_state), &pd, LUA_EXTRASPACE); //set_duel_info std::memcpy(lua_getextraspace(lua_state), &pd, LUA_EXTRASPACE); //set_duel_info
no_action = 0;
call_depth = 0;
//Initial //Initial
#ifdef YGOPRO_NO_LUA_SAFE #ifdef YGOPRO_NO_LUA_SAFE
luaL_openlibs(lua_state); luaL_openlibs(lua_state);
...@@ -146,7 +144,11 @@ int32_t interpreter::load_script(const char* script_name) { ...@@ -146,7 +144,11 @@ int32_t interpreter::load_script(const char* script_name) {
return OPERATION_FAIL; return OPERATION_FAIL;
++no_action; ++no_action;
luaL_checkstack(current_state, 2, nullptr); luaL_checkstack(current_state, 2, nullptr);
int32_t error = luaL_loadbuffer(current_state, (const char*)buffer, len, script_name) || lua_pcall(current_state, 0, 0, 0); int32_t error = 0;
if (enable_unsafe_feature)
error = luaL_loadbuffer(current_state, (const char*)buffer, len, script_name) || lua_pcall(current_state, 0, 0, 0);
else
error = luaL_loadbufferx(current_state, (const char*)buffer, len, script_name, "t") || lua_pcall(current_state, 0, 0, 0);
if (error) { if (error) {
interpreter::sprintf(pduel->strbuffer, "%s", lua_tostring(current_state, -1)); interpreter::sprintf(pduel->strbuffer, "%s", lua_tostring(current_state, -1));
handle_message(pduel, 1); handle_message(pduel, 1);
......
...@@ -44,14 +44,15 @@ public: ...@@ -44,14 +44,15 @@ public:
using param_list = std::list<std::pair<lua_param, LuaParamType>>; using param_list = std::list<std::pair<lua_param, LuaParamType>>;
duel* pduel; duel* pduel;
char msgbuf[64]; char msgbuf[64]{};
lua_State* lua_state; lua_State* lua_state;
lua_State* current_state; lua_State* current_state;
param_list params; param_list params;
param_list resumes; param_list resumes;
coroutine_map coroutines; coroutine_map coroutines;
int32_t no_action; int32_t no_action{};
int32_t call_depth; int32_t call_depth{};
bool enable_unsafe_feature{};
explicit interpreter(duel* pd, bool enable_unsafe_libraries); explicit interpreter(duel* pd, bool enable_unsafe_libraries);
~interpreter(); ~interpreter();
......
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
int32_t scriptlib::duel_enable_global_flag(lua_State *L) { int32_t scriptlib::duel_enable_global_flag(lua_State *L) {
check_param_count(L, 1); check_param_count(L, 1);
int32_t flag = (int32_t)lua_tointeger(L, 1); uint32_t flag = (uint32_t)lua_tointeger(L, 1);
duel* pduel = interpreter::get_duel_info(L); duel* pduel = interpreter::get_duel_info(L);
pduel->game_field->core.global_flag |= flag; pduel->game_field->core.global_flag |= flag;
return 0; return 0;
......
...@@ -24,7 +24,7 @@ int32_t field::negate_chain(uint8_t chaincount) { ...@@ -24,7 +24,7 @@ int32_t field::negate_chain(uint8_t chaincount) {
pchain.flag |= CHAIN_DISABLE_ACTIVATE; pchain.flag |= CHAIN_DISABLE_ACTIVATE;
pchain.disable_reason = core.reason_effect; pchain.disable_reason = core.reason_effect;
pchain.disable_player = core.reason_player; pchain.disable_player = core.reason_player;
if((pchain.triggering_effect->type & EFFECT_TYPE_ACTIVATE) && (phandler->current.location == LOCATION_SZONE)) { if((pchain.triggering_effect->type & EFFECT_TYPE_ACTIVATE) && phandler->is_has_relation(pchain) && (phandler->current.location == LOCATION_SZONE)) {
phandler->set_status(STATUS_LEAVE_CONFIRMED, TRUE); phandler->set_status(STATUS_LEAVE_CONFIRMED, TRUE);
phandler->set_status(STATUS_ACTIVATE_DISABLED, TRUE); phandler->set_status(STATUS_ACTIVATE_DISABLED, TRUE);
} }
......
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