Commit 56a07d91 authored by VanillaSalt's avatar VanillaSalt

update SetUniqueOnField

parent 7861b594
......@@ -1311,6 +1311,8 @@ int32 card::add_effect(effect* peffect) {
remove_effect(rm->second);
}
}
if(peffect->code == EFFECT_CHANGE_CODE)
unique_uid = pduel->game_field->infos.field_id++;
eit = single_effect.insert(std::make_pair(peffect->code, peffect));
} else if (peffect->type & EFFECT_TYPE_EQUIP) {
eit = equip_effect.insert(std::make_pair(peffect->code, peffect));
......@@ -1388,6 +1390,8 @@ void card::remove_effect(effect* peffect) {
void card::remove_effect(effect* peffect, effect_container::iterator it) {
card* check_target = this;
if (peffect->type & EFFECT_TYPE_SINGLE) {
if(peffect->code == EFFECT_CHANGE_CODE)
unique_uid = pduel->game_field->infos.field_id++;
single_effect.erase(it);
} else if (peffect->type & EFFECT_TYPE_EQUIP) {
equip_effect.erase(it);
......@@ -2289,15 +2293,16 @@ int32 card::check_fusion_substitute(card* fcard) {
return TRUE;
return FALSE;
}
int32 card::is_equipable(card* pcard) {
effect_set eset;
if(this == pcard || pcard->current.location != LOCATION_MZONE)
return FALSE;
filter_effect(EFFECT_EQUIP_LIMIT, &eset);
if(eset.size() == 0)
int32 card::check_unique_code(card* pcard) {
if(!unique_code)
return FALSE;
for(int32 i = 0; i < eset.size(); ++i)
if(eset[i]->get_value(pcard))
if(unique_code == 1) {
pduel->lua->add_param(pcard, PARAM_TYPE_CARD);
return pduel->lua->get_function_value(unique_function, 1);
}
uint32 code1 = pcard->get_code();
uint32 code2 = pcard->get_another_code();
if(code1 == unique_code || (code2 && code2 == unique_code))
return TRUE;
return FALSE;
}
......
......@@ -126,15 +126,16 @@ public:
uint16 turnid;
uint16 turn_counter;
uint8 unique_pos[2];
uint16 unique_uid;
uint32 unique_uid;
uint32 unique_code;
uint32 unique_location;
int32 unique_function;
effect* unique_effect;
uint32 spsummon_code;
uint16 spsummon_counter[2];
uint16 spsummon_counter_rst[2];
uint8 assume_type;
uint32 assume_value;
effect* unique_effect;
card* equiping_target;
card* pre_equip_target;
card* overlay_target;
......@@ -247,7 +248,7 @@ public:
void fusion_select(uint8 playerid, group* fusion_m, card* cg, uint32 chkf);
int32 check_fusion_substitute(card* fcard);
int32 is_equipable(card* pcard);
int32 check_unique_code(card* pcard);
int32 is_summonable_card();
int32 is_fusion_summonable_card(uint32 summon_type);
int32 is_spsummonable(effect* peffect);
......
......@@ -218,6 +218,7 @@ void field::add_card(uint8 playerid, card* pcard, uint8 location, uint8 sequence
pcard->apply_field_effect();
pcard->fieldid = infos.field_id++;
pcard->fieldid_r = pcard->fieldid;
pcard->unique_uid = pcard->fieldid;
pcard->turnid = infos.turn_id;
if (location == LOCATION_MZONE)
player[playerid].used_location |= 1 << sequence;
......@@ -1529,7 +1530,6 @@ void field::add_unique_card(card* pcard) {
core.unique_cards[con].insert(pcard);
if(pcard->unique_pos[1])
core.unique_cards[1 - con].insert(pcard);
pcard->unique_uid = infos.copy_id++;
}
void field::remove_unique_card(card* pcard) {
......@@ -1543,16 +1543,42 @@ void field::remove_unique_card(card* pcard) {
}
// return: pcard->unique_effect or 0
effect* field::check_unique_onfield(card* pcard, uint8 controler, uint8 location) {
if(!pcard->unique_code)
return 0;
for(auto iter = core.unique_cards[controler].begin(); iter != core.unique_cards[controler].end(); ++iter) {
card* ucard = *iter;
if((ucard != pcard) && ucard->is_position(POS_FACEUP) && ucard->get_status(STATUS_EFFECT_ENABLED)
&& (ucard->unique_code == pcard->unique_code) && (ucard->unique_location & location)
if(ucard == pcard)
continue;
if(ucard->is_position(POS_FACEUP) && ucard->get_status(STATUS_EFFECT_ENABLED)
&& !ucard->get_status(STATUS_DISABLED | STATUS_FORBIDDEN)
&& ucard->check_unique_code(ucard) && ucard->check_unique_code(pcard) && (ucard->unique_location & location)
&& (!(pcard->current.location & ucard->unique_location) || pcard->is_position(POS_FACEDOWN)
|| ((!pcard->get_status(STATUS_DISABLED | STATUS_FORBIDDEN) || !ucard->get_status(STATUS_DISABLED | STATUS_FORBIDDEN)) && ucard->unique_uid < pcard->unique_uid)))
|| (ucard->unique_uid < pcard->unique_uid)))
return ucard->unique_effect;
}
if(!pcard->unique_code || !pcard->check_unique_code(pcard))
return 0;
int32 is_tofield = !(pcard->current.location & location);
int32 is_flipping = pcard->is_position(POS_FACEDOWN);
int32 is_enabled = pcard->get_status(STATUS_EFFECT_ENABLED) && !pcard->get_status(STATUS_DISABLED | STATUS_FORBIDDEN);
for(int32 p = 0; p < 2; ++p) {
if(pcard->unique_pos[p]) {
if(pcard->unique_location & LOCATION_MZONE) {
for(int32 i = 0; i < 5; ++i) {
card* ucard = player[controler ^ p].list_mzone[i];
if(ucard && (ucard != pcard) && ucard->is_position(POS_FACEUP) && pcard->check_unique_code(ucard)
&& (is_tofield || is_flipping || (is_enabled && (ucard->unique_uid < pcard->unique_uid))))
return pcard->unique_effect;
}
}
if(pcard->unique_location & LOCATION_SZONE) {
for(int32 i = 0; i < 8; ++i) {
card* ucard = player[controler ^ p].list_szone[i];
if(ucard && (ucard != pcard) && ucard->is_position(POS_FACEUP) && pcard->check_unique_code(ucard)
&& (is_tofield || is_flipping || (is_enabled && (ucard->unique_uid < pcard->unique_uid))))
return pcard->unique_effect;
}
}
}
}
return 0;
}
......
......@@ -2346,6 +2346,10 @@ int32 scriptlib::card_set_unique_onfield(lua_State *L) {
card* pcard = *(card**) lua_touserdata(L, 1);
pcard->unique_pos[0] = lua_tointeger(L, 2);
pcard->unique_pos[1] = lua_tointeger(L, 3);
if(lua_isfunction(L, 4)) {
pcard->unique_code = 1;
pcard->unique_function = interpreter::get_function_handle(L, 4);
} else
pcard->unique_code = lua_tointeger(L, 4);
uint32 location = LOCATION_ONFIELD;
if(lua_gettop(L) > 4)
......
......@@ -1759,6 +1759,7 @@ int32 field::flip_summon(uint16 step, uint8 sumplayer, card * target) {
target->previous.position = target->current.position;
target->current.position = POS_FACEUP_ATTACK;
target->fieldid = infos.field_id++;
target->unique_uid = target->fieldid;
core.phase_action = TRUE;
core.flipsummon_state_count[sumplayer]++;
check_card_counter(target, 4, sumplayer);
......@@ -4009,6 +4010,7 @@ int32 field::change_position(uint16 step, group * targets, effect * reason_effec
core.hint_timing[pcard->current.controler] |= TIMING_POS_CHANGE;
if((opos & POS_FACEDOWN) && (npos & POS_FACEUP)) {
pcard->fieldid = infos.field_id++;
pcard->unique_uid = pcard->fieldid;
if(pcard->current.location == LOCATION_MZONE) {
raise_single_event(pcard, 0, EVENT_FLIP, reason_effect, 0, reason_player, 0, flag);
flips.insert(pcard);
......
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