Commit abd5b23d authored by salix5's avatar salix5 Committed by GitHub

fix ATK calculating (#428)

* add EFFECT_SET_BASE_ATTACK_FINAL

remove EFFECT_FLAG_REPEAT

* add get_base_atk_def(), get_atk_def()

* use get_atk_def()
parent 6dc48e12
...@@ -101,6 +101,7 @@ card::card(duel* pd) { ...@@ -101,6 +101,7 @@ card::card(duel* pd) {
uint32 card::get_infos(byte* buf, int32 query_flag, int32 use_cache) { uint32 card::get_infos(byte* buf, int32 query_flag, int32 use_cache) {
int32* p = (int32*)buf; int32* p = (int32*)buf;
int32 tdata = 0; int32 tdata = 0;
std::pair<int32, int32> atk_def(-10, -10);
p += 2; p += 2;
if(query_flag & QUERY_CODE) *p++ = data.code; if(query_flag & QUERY_CODE) *p++ = data.code;
if(query_flag & QUERY_POSITION) *p++ = get_info_location(); if(query_flag & QUERY_POSITION) *p++ = get_info_location();
...@@ -111,8 +112,16 @@ uint32 card::get_infos(byte* buf, int32 query_flag, int32 use_cache) { ...@@ -111,8 +112,16 @@ uint32 card::get_infos(byte* buf, int32 query_flag, int32 use_cache) {
if(query_flag & QUERY_RANK) q_cache.rank = *p++ = get_rank(); if(query_flag & QUERY_RANK) q_cache.rank = *p++ = get_rank();
if(query_flag & QUERY_ATTRIBUTE) q_cache.attribute = *p++ = get_attribute(); if(query_flag & QUERY_ATTRIBUTE) q_cache.attribute = *p++ = get_attribute();
if(query_flag & QUERY_RACE) q_cache.race = *p++ = get_race(); if(query_flag & QUERY_RACE) q_cache.race = *p++ = get_race();
if(query_flag & QUERY_ATTACK) q_cache.attack = *p++ = get_attack(); if (query_flag & QUERY_ATTACK) {
if(query_flag & QUERY_DEFENSE) q_cache.defense = *p++ = get_defense(); atk_def = get_atk_def();
q_cache.attack = *p++ = atk_def.first;
}
if (query_flag & QUERY_DEFENSE) {
if(atk_def.second == -10)
q_cache.defense = *p++ = get_defense();
else
q_cache.defense = *p++ = atk_def.second;
}
if(query_flag & QUERY_BASE_ATTACK) q_cache.base_attack = *p++ = get_base_attack(); if(query_flag & QUERY_BASE_ATTACK) q_cache.base_attack = *p++ = get_base_attack();
if(query_flag & QUERY_BASE_DEFENSE) q_cache.base_defense = *p++ = get_base_defense(); if(query_flag & QUERY_BASE_DEFENSE) q_cache.base_defense = *p++ = get_base_defense();
if(query_flag & QUERY_REASON) q_cache.reason = *p++ = current.reason; if(query_flag & QUERY_REASON) q_cache.reason = *p++ = current.reason;
...@@ -482,33 +491,42 @@ uint32 card::get_link_type() { ...@@ -482,33 +491,42 @@ uint32 card::get_link_type() {
return data.type; return data.type;
return get_type(); return get_type();
} }
int32 card::get_base_attack() { std::pair<int32, int32> card::get_base_atk_def() {
if(!(data.type & TYPE_MONSTER) && !(get_type() & TYPE_MONSTER) && !is_affected_by_effect(EFFECT_PRE_MONSTER)) if (!(data.type & TYPE_MONSTER) && !(get_type() & TYPE_MONSTER) && !is_affected_by_effect(EFFECT_PRE_MONSTER))
return 0; return std::pair<int32, int32>(0, 0);
std::pair<int32, int32> ret(data.attack, 0);
if (!(data.type & TYPE_LINK))
ret.second = data.defense;
if (current.location != LOCATION_MZONE || get_status(STATUS_SUMMONING | STATUS_SPSUMMON_STEP)) if (current.location != LOCATION_MZONE || get_status(STATUS_SUMMONING | STATUS_SPSUMMON_STEP))
return data.attack; return ret;
if (temp.base_attack != -1) if (temp.base_attack != -1){
return temp.base_attack; ret.first = temp.base_attack;
ret.second = temp.base_defense;
return ret;
}
int32 batk = data.attack; int32 batk = data.attack;
if(batk < 0) if (batk < 0)
batk = 0; batk = 0;
int32 bdef = data.defense; int32 bdef = 0;
if(bdef < 0) if (!(data.type & TYPE_LINK)) {
bdef = 0; bdef = data.defense;
if (bdef < 0)
bdef = 0;
}
temp.base_attack = batk; temp.base_attack = batk;
temp.base_defense = bdef;
effect_set eset; effect_set eset;
int32 swap = 0;
if(!(data.type & TYPE_LINK)) {
filter_effect(EFFECT_SWAP_BASE_AD, &eset, FALSE);
swap = eset.size();
}
filter_effect(EFFECT_SET_BASE_ATTACK, &eset, FALSE); filter_effect(EFFECT_SET_BASE_ATTACK, &eset, FALSE);
if(swap) filter_effect(EFFECT_SET_BASE_ATTACK_FINAL, &eset, FALSE);
if (!(data.type & TYPE_LINK)) {
filter_effect(EFFECT_SWAP_BASE_AD, &eset, FALSE);
filter_effect(EFFECT_SET_BASE_DEFENSE, &eset, FALSE); filter_effect(EFFECT_SET_BASE_DEFENSE, &eset, FALSE);
filter_effect(EFFECT_SET_BASE_DEFENSE_FINAL, &eset, FALSE);
}
eset.sort(); eset.sort();
// calculate continuous effects of this first // calculate single effects of this first
for(int32 i = 0; i < eset.size();) { for(int32 i = 0; i < eset.size();) {
if(!(eset[i]->type & EFFECT_TYPE_SINGLE) || eset[i]->is_flag(EFFECT_FLAG_SINGLE_RANGE)) { if (eset[i]->type & EFFECT_TYPE_SINGLE) {
switch(eset[i]->code) { switch(eset[i]->code) {
case EFFECT_SET_BASE_ATTACK: case EFFECT_SET_BASE_ATTACK:
batk = eset[i]->get_value(this); batk = eset[i]->get_value(this);
...@@ -521,6 +539,7 @@ int32 card::get_base_attack() { ...@@ -521,6 +539,7 @@ int32 card::get_base_attack() {
bdef = eset[i]->get_value(this); bdef = eset[i]->get_value(this);
if(bdef < 0) if(bdef < 0)
bdef = 0; bdef = 0;
temp.base_defense = bdef;
eset.remove_item(i); eset.remove_item(i);
continue; continue;
} }
...@@ -530,11 +549,13 @@ int32 card::get_base_attack() { ...@@ -530,11 +549,13 @@ int32 card::get_base_attack() {
for(int32 i = 0; i < eset.size(); ++i) { for(int32 i = 0; i < eset.size(); ++i) {
switch(eset[i]->code) { switch(eset[i]->code) {
case EFFECT_SET_BASE_ATTACK: case EFFECT_SET_BASE_ATTACK:
case EFFECT_SET_BASE_ATTACK_FINAL:
batk = eset[i]->get_value(this); batk = eset[i]->get_value(this);
if(batk < 0) if(batk < 0)
batk = 0; batk = 0;
break; break;
case EFFECT_SET_BASE_DEFENSE: case EFFECT_SET_BASE_DEFENSE:
case EFFECT_SET_BASE_DEFENSE_FINAL:
bdef = eset[i]->get_value(this); bdef = eset[i]->get_value(this);
if(bdef < 0) if(bdef < 0)
bdef = 0; bdef = 0;
...@@ -544,327 +565,229 @@ int32 card::get_base_attack() { ...@@ -544,327 +565,229 @@ int32 card::get_base_attack() {
break; break;
} }
temp.base_attack = batk; temp.base_attack = batk;
temp.base_defense = bdef;
} }
ret.first = batk;
ret.second = bdef;
temp.base_attack = -1; temp.base_attack = -1;
return batk; temp.base_defense = -1;
} return ret;
int32 card::get_attack() { }
if(assume_type == ASSUME_ATTACK) std::pair<int32, int32> card::get_atk_def() {
return assume_value; if (assume_type == ASSUME_ATTACK)
if(!(data.type & TYPE_MONSTER) && !(get_type() & TYPE_MONSTER) && !is_affected_by_effect(EFFECT_PRE_MONSTER)) return std::pair<int32, int32>(assume_value, 0);
return 0; if (assume_type == ASSUME_DEFENSE) {
if (data.type & TYPE_LINK)
return std::pair<int32, int32>(0, 0);
else
return std::pair<int32, int32>(0, assume_value);
}
if (!(data.type & TYPE_MONSTER) && !(get_type() & TYPE_MONSTER) && !is_affected_by_effect(EFFECT_PRE_MONSTER))
return std::pair<int32, int32>(0, 0);
std::pair<int32, int32> ret(data.attack, 0);
if (!(data.type & TYPE_LINK))
ret.second = data.defense;
if (current.location != LOCATION_MZONE || get_status(STATUS_SUMMONING | STATUS_SPSUMMON_STEP)) if (current.location != LOCATION_MZONE || get_status(STATUS_SUMMONING | STATUS_SPSUMMON_STEP))
return data.attack; return ret;
if (temp.attack != -1) if (temp.attack != -1) {
return temp.attack; ret.first = temp.attack;
ret.second = temp.defense;
return ret;
}
int32 atk = -1, def = -1;
int32 up_atk = 0, upc_atk = 0;
int32 up_def = 0, upc_def = 0;
bool swap_final = false;
effect_set eset;
effect_set effects_atk_final, effects_atk_wicked, effects_atk_option;
effect_set effects_def_final, effects_def_wicked, effects_def_option;
int32 batk = data.attack; int32 batk = data.attack;
if(batk < 0) if (batk < 0)
batk = 0; batk = 0;
int32 bdef = data.defense; int32 bdef = 0;
if(bdef < 0) if (!(data.type & TYPE_LINK)) {
bdef = 0; bdef = data.defense;
temp.base_attack = batk; if (bdef < 0)
bdef = 0;
}
temp.attack = batk; temp.attack = batk;
int32 atk = -1; temp.defense = bdef;
int32 up_atk = 0, upc_atk = 0; std::pair<int32, int32> base_val = get_base_atk_def();
int32 swap_final = FALSE; atk = base_val.first;
effect_set eset; def = base_val.second;
temp.attack = atk;
temp.defense = def;
filter_effect(EFFECT_UPDATE_ATTACK, &eset, FALSE); filter_effect(EFFECT_UPDATE_ATTACK, &eset, FALSE);
filter_effect(EFFECT_SET_ATTACK, &eset, FALSE); filter_effect(EFFECT_SET_ATTACK, &eset, FALSE);
filter_effect(EFFECT_SET_ATTACK_FINAL, &eset, FALSE); filter_effect(EFFECT_SET_ATTACK_FINAL, &eset, FALSE);
filter_effect(EFFECT_SET_BASE_ATTACK, &eset, FALSE); if (!(data.type & TYPE_LINK)) {
if(!(data.type & TYPE_LINK)) {
filter_effect(EFFECT_SWAP_AD, &eset, FALSE); filter_effect(EFFECT_SWAP_AD, &eset, FALSE);
filter_effect(EFFECT_SWAP_BASE_AD, &eset, FALSE); filter_effect(EFFECT_UPDATE_DEFENSE, &eset, FALSE);
filter_effect(EFFECT_SET_BASE_DEFENSE, &eset, FALSE); filter_effect(EFFECT_SET_DEFENSE, &eset, FALSE);
filter_effect(EFFECT_SET_DEFENSE_FINAL, &eset, FALSE);
} }
eset.sort(); eset.sort();
int32 rev = FALSE; bool rev = false;
if(is_affected_by_effect(EFFECT_REVERSE_UPDATE)) if (is_affected_by_effect(EFFECT_REVERSE_UPDATE))
rev = TRUE; rev = true;
effect_set effects_atk, effects_atk_r; for (int32 i = 0; i < eset.size();) {
for(int32 i = 0; i < eset.size();) { if (eset[i]->type & EFFECT_TYPE_SINGLE) {
if(!(eset[i]->type & EFFECT_TYPE_SINGLE) || eset[i]->is_flag(EFFECT_FLAG_SINGLE_RANGE)) { switch (eset[i]->code) {
switch(eset[i]->code) { case EFFECT_SET_ATTACK:
case EFFECT_SET_BASE_ATTACK: atk = eset[i]->get_value(this);
batk = eset[i]->get_value(this); if (atk < 0)
if(batk < 0) atk = 0;
batk = 0; temp.attack = atk;
temp.base_attack = batk;
eset.remove_item(i); eset.remove_item(i);
continue; continue;
case EFFECT_SET_BASE_DEFENSE: case EFFECT_SET_DEFENSE:
bdef = eset[i]->get_value(this); def = eset[i]->get_value(this);
if(bdef < 0) if (def < 0)
bdef = 0; def = 0;
temp.defense = def;
eset.remove_item(i); eset.remove_item(i);
continue; continue;
} }
} }
++i; ++i;
} }
temp.attack = batk; for (int32 i = 0; i < eset.size(); ++i) {
for(int32 i = 0; i < eset.size(); ++i) { switch (eset[i]->code) {
switch(eset[i]->code) {
case EFFECT_UPDATE_ATTACK: case EFFECT_UPDATE_ATTACK:
if((eset[i]->type & EFFECT_TYPE_SINGLE) && !eset[i]->is_flag(EFFECT_FLAG_SINGLE_RANGE)) if ((eset[i]->type & EFFECT_TYPE_SINGLE) && !eset[i]->is_flag(EFFECT_FLAG_SINGLE_RANGE))
up_atk += eset[i]->get_value(this); up_atk += eset[i]->get_value(this);
else else
upc_atk += eset[i]->get_value(this); upc_atk += eset[i]->get_value(this);
break; break;
case EFFECT_SET_ATTACK: case EFFECT_SET_ATTACK:
atk = eset[i]->get_value(this); atk = eset[i]->get_value(this);
if(!(eset[i]->type & EFFECT_TYPE_SINGLE)) if (atk < 0)
up_atk = 0; atk = 0;
up_atk = 0;
break; break;
case EFFECT_SET_ATTACK_FINAL: case EFFECT_SET_ATTACK_FINAL:
if((eset[i]->type & EFFECT_TYPE_SINGLE) && !eset[i]->is_flag(EFFECT_FLAG_SINGLE_RANGE)) { if ((eset[i]->type & EFFECT_TYPE_SINGLE) && !eset[i]->is_flag(EFFECT_FLAG_SINGLE_RANGE)) {
atk = eset[i]->get_value(this); atk = eset[i]->get_value(this);
if (atk < 0)
atk = 0;
up_atk = 0; up_atk = 0;
upc_atk = 0; upc_atk = 0;
} else {
if(!eset[i]->is_flag(EFFECT_FLAG_DELAY))
effects_atk.add_item(eset[i]);
else
effects_atk_r.add_item(eset[i]);
} }
break; else if (eset[i]->is_flag(EFFECT_FLAG2_OPTION)) {
case EFFECT_SET_BASE_ATTACK: effects_atk_option.add_item(eset[i]);
batk = eset[i]->get_value(this);
if(batk < 0)
batk = 0;
atk = -1;
break;
case EFFECT_SET_BASE_DEFENSE:
bdef = eset[i]->get_value(this);
if(bdef < 0)
bdef = 0;
break;
case EFFECT_SWAP_AD:
swap_final = !swap_final;
break;
case EFFECT_SWAP_BASE_AD:
std::swap(batk, bdef);
break;
}
temp.base_attack = batk;
if(!rev) {
temp.attack = ((atk < 0) ? batk : atk) + up_atk + upc_atk;
} else {
temp.attack = ((atk < 0) ? batk : atk) - up_atk - upc_atk;
}
if(temp.attack < 0)
temp.attack = 0;
}
for(int32 i = 0; i < effects_atk.size(); ++i)
temp.attack = effects_atk[i]->get_value(this);
if(temp.defense == -1) {
if(swap_final) {
temp.attack = get_defense();
}
for(int32 i = 0; i < effects_atk_r.size(); ++i) {
temp.attack = effects_atk_r[i]->get_value(this);
if(effects_atk_r[i]->is_flag(EFFECT_FLAG_REPEAT))
temp.attack = effects_atk_r[i]->get_value(this);
}
}
atk = temp.attack;
if(atk < 0)
atk = 0;
temp.base_attack = -1;
temp.attack = -1;
return atk;
}
int32 card::get_base_defense() {
if(data.type & TYPE_LINK)
return 0;
if(!(data.type & TYPE_MONSTER) && !(get_type() & TYPE_MONSTER) && !is_affected_by_effect(EFFECT_PRE_MONSTER))
return 0;
if (current.location != LOCATION_MZONE || get_status(STATUS_SUMMONING | STATUS_SPSUMMON_STEP))
return data.defense;
if (temp.base_defense != -1)
return temp.base_defense;
int32 batk = data.attack;
if(batk < 0)
batk = 0;
int32 bdef = data.defense;
if(bdef < 0)
bdef = 0;
temp.base_defense = bdef;
effect_set eset;
filter_effect(EFFECT_SWAP_BASE_AD, &eset, FALSE);
int32 swap = eset.size();
filter_effect(EFFECT_SET_BASE_DEFENSE, &eset, FALSE);
if(swap)
filter_effect(EFFECT_SET_BASE_ATTACK, &eset, FALSE);
eset.sort();
for(int32 i = 0; i < eset.size();) {
if(!(eset[i]->type & EFFECT_TYPE_SINGLE) || eset[i]->is_flag(EFFECT_FLAG_SINGLE_RANGE)) {
switch(eset[i]->code) {
case EFFECT_SET_BASE_ATTACK:
batk = eset[i]->get_value(this);
if(batk < 0)
batk = 0;
eset.remove_item(i);
continue;
case EFFECT_SET_BASE_DEFENSE:
bdef = eset[i]->get_value(this);
if(bdef < 0)
bdef = 0;
temp.base_defense = bdef;
eset.remove_item(i);
continue;
} }
} else if (eset[i]->is_flag(EFFECT_FLAG2_WICKED)) {
++i; effects_atk_wicked.add_item(eset[i]);
}
for(int32 i = 0; i < eset.size(); ++i) {
switch(eset[i]->code) {
case EFFECT_SET_BASE_ATTACK:
batk = eset[i]->get_value(this);
if(batk < 0)
batk = 0;
break;
case EFFECT_SET_BASE_DEFENSE:
bdef = eset[i]->get_value(this);
if(bdef < 0)
bdef = 0;
break;
case EFFECT_SWAP_BASE_AD:
std::swap(batk, bdef);
break;
}
temp.base_defense = bdef;
}
temp.base_defense = -1;
return bdef;
}
int32 card::get_defense() {
if(data.type & TYPE_LINK)
return 0;
if(assume_type == ASSUME_DEFENSE)
return assume_value;
if(!(data.type & TYPE_MONSTER) && !(get_type() & TYPE_MONSTER) && !is_affected_by_effect(EFFECT_PRE_MONSTER))
return 0;
if (current.location != LOCATION_MZONE || get_status(STATUS_SUMMONING | STATUS_SPSUMMON_STEP))
return data.defense;
if (temp.defense != -1)
return temp.defense;
int32 batk = data.attack;
if(batk < 0)
batk = 0;
int32 bdef = data.defense;
if(bdef < 0)
bdef = 0;
temp.base_defense = bdef;
temp.defense = bdef;
int32 def = -1;
int32 up_def = 0, upc_def = 0;
int32 swap_final = FALSE;
effect_set eset;
filter_effect(EFFECT_SWAP_AD, &eset, FALSE);
filter_effect(EFFECT_UPDATE_DEFENSE, &eset, FALSE);
filter_effect(EFFECT_SET_DEFENSE, &eset, FALSE);
filter_effect(EFFECT_SET_DEFENSE_FINAL, &eset, FALSE);
filter_effect(EFFECT_SWAP_BASE_AD, &eset, FALSE);
filter_effect(EFFECT_SET_BASE_ATTACK, &eset, FALSE);
filter_effect(EFFECT_SET_BASE_DEFENSE, &eset, FALSE);
eset.sort();
int32 rev = FALSE;
if(is_affected_by_effect(EFFECT_REVERSE_UPDATE))
rev = TRUE;
effect_set effects_def, effects_def_r;
for(int32 i = 0; i < eset.size();) {
if(!(eset[i]->type & EFFECT_TYPE_SINGLE) || eset[i]->is_flag(EFFECT_FLAG_SINGLE_RANGE)) {
switch(eset[i]->code) {
case EFFECT_SET_BASE_ATTACK:
batk = eset[i]->get_value(this);
if(batk < 0)
batk = 0;
eset.remove_item(i);
continue;
case EFFECT_SET_BASE_DEFENSE:
bdef = eset[i]->get_value(this);
if(bdef < 0)
bdef = 0;
temp.base_defense = bdef;
eset.remove_item(i);
continue;
} }
} else {
++i; effects_atk_final.add_item(eset[i]);
} }
temp.defense = bdef; break;
for(int32 i = 0; i < eset.size(); ++i) { // def
switch(eset[i]->code) {
case EFFECT_UPDATE_DEFENSE: case EFFECT_UPDATE_DEFENSE:
if((eset[i]->type & EFFECT_TYPE_SINGLE) && !eset[i]->is_flag(EFFECT_FLAG_SINGLE_RANGE)) if ((eset[i]->type & EFFECT_TYPE_SINGLE) && !eset[i]->is_flag(EFFECT_FLAG_SINGLE_RANGE))
up_def += eset[i]->get_value(this); up_def += eset[i]->get_value(this);
else else
upc_def += eset[i]->get_value(this); upc_def += eset[i]->get_value(this);
break; break;
case EFFECT_SET_DEFENSE: case EFFECT_SET_DEFENSE:
def = eset[i]->get_value(this); def = eset[i]->get_value(this);
if(!(eset[i]->type & EFFECT_TYPE_SINGLE)) if (def < 0)
up_def = 0; def = 0;
up_def = 0;
break; break;
case EFFECT_SET_DEFENSE_FINAL: case EFFECT_SET_DEFENSE_FINAL:
if((eset[i]->type & EFFECT_TYPE_SINGLE) && !eset[i]->is_flag(EFFECT_FLAG_SINGLE_RANGE)) { if ((eset[i]->type & EFFECT_TYPE_SINGLE) && !eset[i]->is_flag(EFFECT_FLAG_SINGLE_RANGE)) {
def = eset[i]->get_value(this); def = eset[i]->get_value(this);
if (def < 0)
def = 0;
up_def = 0; up_def = 0;
upc_def = 0; upc_def = 0;
} else {
if(!eset[i]->is_flag(EFFECT_FLAG_DELAY))
effects_def.add_item(eset[i]);
else
effects_def_r.add_item(eset[i]);
} }
break; else if (eset[i]->is_flag(EFFECT_FLAG2_OPTION)) {
case EFFECT_SET_BASE_DEFENSE: effects_def_option.add_item(eset[i]);
bdef = eset[i]->get_value(this); }
if(bdef < 0) else if (eset[i]->is_flag(EFFECT_FLAG2_WICKED)) {
bdef = 0; effects_def_wicked.add_item(eset[i]);
def = -1; }
break; else {
case EFFECT_SET_BASE_ATTACK: effects_def_final.add_item(eset[i]);
batk = eset[i]->get_value(this); }
if(batk < 0)
batk = 0;
break; break;
case EFFECT_SWAP_AD: case EFFECT_SWAP_AD:
swap_final = !swap_final; swap_final = !swap_final;
break; break;
case EFFECT_SWAP_BASE_AD:
std::swap(batk, bdef);
break;
} }
temp.base_defense = bdef; if (!rev) {
if(!rev) { temp.attack = atk + up_atk + upc_atk;
temp.defense = ((def < 0) ? bdef : def) + up_def + upc_def; temp.defense = def + up_def + upc_def;
} else {
temp.defense = ((def < 0) ? bdef : def) - up_def - upc_def;
} }
if(temp.defense < 0) else {
temp.defense = 0; temp.attack = atk - up_atk - upc_atk;
} temp.defense = def - up_def - upc_def;
for(int32 i = 0; i < effects_def.size(); ++i)
temp.defense = effects_def[i]->get_value(this);
if(temp.attack == -1) {
if(swap_final) {
temp.defense = get_attack();
}
for(int32 i = 0; i < effects_def_r.size(); ++i) {
temp.defense = effects_def_r[i]->get_value(this);
if(effects_def_r[i]->is_flag(EFFECT_FLAG_REPEAT))
temp.defense = effects_def_r[i]->get_value(this);
} }
if (temp.attack < 0)
temp.attack = 0;
if (temp.defense < 0)
temp.defense = 0;
} }
def = temp.defense; for (int32 i = 0; i < effects_atk_final.size(); ++i) {
if(def < 0) atk = effects_atk_final[i]->get_value(this);
def = 0; if (atk < 0)
temp.base_defense = -1; atk = 0;
temp.attack = atk;
}
for (int32 i = 0; i < effects_def_final.size(); ++i){
def = effects_def_final[i]->get_value(this);
if (def < 0)
def = 0;
temp.defense = def;
}
if (swap_final)
std::swap(temp.attack, temp.defense);
// The Wicked
for (int32 i = 0; i < effects_atk_wicked.size(); ++i) {
atk = effects_atk_wicked[i]->get_value(this);
if (atk < 0)
atk = 0;
temp.attack = atk;
}
for (int32 i = 0; i < effects_def_wicked.size(); ++i) {
def = effects_def_wicked[i]->get_value(this);
if (def < 0)
def = 0;
temp.defense = def;
}
// Gradius' Option
for (int32 i = 0; i < effects_atk_option.size(); ++i) {
atk = effects_atk_option[i]->get_value(this);
if (atk < 0)
atk = 0;
temp.attack = atk;
}
for (int32 i = 0; i < effects_def_option.size(); ++i) {
def = effects_def_option[i]->get_value(this);
if (def < 0)
def = 0;
temp.defense = def;
}
ret.first = temp.attack;
ret.second = temp.defense;
temp.attack = -1;
temp.defense = -1; temp.defense = -1;
return def; return ret;
}
int32 card::get_base_attack() {
return get_base_atk_def().first;
}
int32 card::get_attack() {
return get_atk_def().first;
}
int32 card::get_base_defense() {
return get_base_atk_def().second;
}
int32 card::get_defense() {
return get_atk_def().second;
} }
int32 card::get_battle_attack() { int32 card::get_battle_attack() {
effect_set eset; effect_set eset;
...@@ -872,7 +795,7 @@ int32 card::get_battle_attack() { ...@@ -872,7 +795,7 @@ int32 card::get_battle_attack() {
if(eset.size()) if(eset.size())
return eset.get_last()->get_value(this); return eset.get_last()->get_value(this);
else else
return get_attack(); return get_atk_def().first;
} }
int32 card::get_battle_defense() { int32 card::get_battle_defense() {
effect_set eset; effect_set eset;
...@@ -880,7 +803,7 @@ int32 card::get_battle_defense() { ...@@ -880,7 +803,7 @@ int32 card::get_battle_defense() {
if(eset.size()) if(eset.size())
return eset.get_last()->get_value(this); return eset.get_last()->get_value(this);
else else
return get_defense(); return get_atk_def().second;
} }
uint32 card::get_level() { uint32 card::get_level() {
if((data.type & (TYPE_XYZ | TYPE_LINK)) || (status & STATUS_NO_LEVEL) if((data.type & (TYPE_XYZ | TYPE_LINK)) || (status & STATUS_NO_LEVEL)
...@@ -1659,35 +1582,69 @@ int32 card::add_effect(effect* peffect) { ...@@ -1659,35 +1582,69 @@ int32 card::add_effect(effect* peffect) {
card_set check_target = { this }; card_set check_target = { this };
effect_container::iterator eit; effect_container::iterator eit;
if (peffect->type & EFFECT_TYPE_SINGLE) { if (peffect->type & EFFECT_TYPE_SINGLE) {
if((peffect->code == EFFECT_SET_ATTACK || peffect->code == EFFECT_SET_BASE_ATTACK) && !peffect->is_flag(EFFECT_FLAG_SINGLE_RANGE)) { // assign atk/def
if(peffect->code == EFFECT_SET_ATTACK && !peffect->is_flag(EFFECT_FLAG_SINGLE_RANGE)) {
for(auto it = single_effect.begin(); it != single_effect.end();) { for(auto it = single_effect.begin(); it != single_effect.end();) {
auto rm = it++; auto rm = it++;
if((rm->second->code == EFFECT_SET_ATTACK || rm->second->code == EFFECT_SET_ATTACK_FINAL || rm->second->code == EFFECT_SET_BASE_ATTACK) if(rm->second->code == EFFECT_SET_ATTACK && !rm->second->is_flag(EFFECT_FLAG_SINGLE_RANGE))
&& !rm->second->is_flag(EFFECT_FLAG_SINGLE_RANGE))
remove_effect(rm->second); remove_effect(rm->second);
} }
} }
if(peffect->code == EFFECT_SET_ATTACK_FINAL && !peffect->is_flag(EFFECT_FLAG_SINGLE_RANGE)) { if(peffect->code == EFFECT_SET_ATTACK_FINAL && !peffect->is_flag(EFFECT_FLAG_SINGLE_RANGE)) {
for(auto it = single_effect.begin(); it != single_effect.end();) { for(auto it = single_effect.begin(); it != single_effect.end();) {
auto rm = it++; auto rm = it++;
if((rm->second->code == EFFECT_UPDATE_ATTACK || rm->second->code == EFFECT_SET_ATTACK auto code = rm->second->code;
|| rm->second->code == EFFECT_SET_ATTACK_FINAL) && !rm->second->is_flag(EFFECT_FLAG_SINGLE_RANGE)) if((code == EFFECT_UPDATE_ATTACK || code == EFFECT_SET_ATTACK || code == EFFECT_SET_ATTACK_FINAL)
&& !rm->second->is_flag(EFFECT_FLAG_SINGLE_RANGE))
remove_effect(rm->second); remove_effect(rm->second);
} }
} }
if((peffect->code == EFFECT_SET_DEFENSE || peffect->code == EFFECT_SET_BASE_DEFENSE) && !peffect->is_flag(EFFECT_FLAG_SINGLE_RANGE)) { if(peffect->code == EFFECT_SET_DEFENSE && !peffect->is_flag(EFFECT_FLAG_SINGLE_RANGE)) {
for(auto it = single_effect.begin(); it != single_effect.end();) { for(auto it = single_effect.begin(); it != single_effect.end();) {
auto rm = it++; auto rm = it++;
if((rm->second->code == EFFECT_SET_DEFENSE || rm->second->code == EFFECT_SET_DEFENSE_FINAL || rm->second->code == EFFECT_SET_BASE_DEFENSE) if(rm->second->code == EFFECT_SET_DEFENSE && !rm->second->is_flag(EFFECT_FLAG_SINGLE_RANGE))
&& !rm->second->is_flag(EFFECT_FLAG_SINGLE_RANGE))
remove_effect(rm->second); remove_effect(rm->second);
} }
} }
if(peffect->code == EFFECT_SET_DEFENSE_FINAL && !peffect->is_flag(EFFECT_FLAG_SINGLE_RANGE)) { if(peffect->code == EFFECT_SET_DEFENSE_FINAL && !peffect->is_flag(EFFECT_FLAG_SINGLE_RANGE)) {
for(auto it = single_effect.begin(); it != single_effect.end();) { for(auto it = single_effect.begin(); it != single_effect.end();) {
auto rm = it++; auto rm = it++;
if((rm->second->code == EFFECT_UPDATE_DEFENSE || rm->second->code == EFFECT_SET_DEFENSE auto code = rm->second->code;
|| rm->second->code == EFFECT_SET_DEFENSE_FINAL) && !rm->second->is_flag(EFFECT_FLAG_SINGLE_RANGE)) if((code == EFFECT_UPDATE_DEFENSE || code == EFFECT_SET_DEFENSE || code == EFFECT_SET_DEFENSE_FINAL)
&& !rm->second->is_flag(EFFECT_FLAG_SINGLE_RANGE))
remove_effect(rm->second);
}
}
// assign base atk/def
if (peffect->code == EFFECT_SET_BASE_ATTACK && !peffect->is_flag(EFFECT_FLAG_SINGLE_RANGE)) {
for (auto it = single_effect.begin(); it != single_effect.end();) {
auto rm = it++;
if (rm->second->code == EFFECT_SET_BASE_ATTACK && !rm->second->is_flag(EFFECT_FLAG_SINGLE_RANGE))
remove_effect(rm->second);
}
}
if (peffect->code == EFFECT_SET_BASE_ATTACK_FINAL && !peffect->is_flag(EFFECT_FLAG_SINGLE_RANGE)) {
for (auto it = single_effect.begin(); it != single_effect.end();) {
auto rm = it++;
auto code = rm->second->code;
if ((code == EFFECT_SET_BASE_ATTACK || code == EFFECT_SET_BASE_ATTACK_FINAL || code == EFFECT_SET_ATTACK || code == EFFECT_SET_ATTACK_FINAL)
&& !rm->second->is_flag(EFFECT_FLAG_SINGLE_RANGE))
remove_effect(rm->second);
}
}
if (peffect->code == EFFECT_SET_BASE_DEFENSE && !peffect->is_flag(EFFECT_FLAG_SINGLE_RANGE)) {
for (auto it = single_effect.begin(); it != single_effect.end();) {
auto rm = it++;
if (rm->second->code == EFFECT_SET_BASE_DEFENSE && !rm->second->is_flag(EFFECT_FLAG_SINGLE_RANGE))
remove_effect(rm->second);
}
}
if (peffect->code == EFFECT_SET_BASE_DEFENSE_FINAL && !peffect->is_flag(EFFECT_FLAG_SINGLE_RANGE)) {
for (auto it = single_effect.begin(); it != single_effect.end();) {
auto rm = it++;
auto code = rm->second->code;
if ((code == EFFECT_SET_BASE_DEFENSE || code == EFFECT_SET_BASE_DEFENSE_FINAL || code == EFFECT_SET_DEFENSE || code == EFFECT_SET_DEFENSE_FINAL)
&& !rm->second->is_flag(EFFECT_FLAG_SINGLE_RANGE))
remove_effect(rm->second); remove_effect(rm->second);
} }
} }
......
...@@ -232,6 +232,8 @@ public: ...@@ -232,6 +232,8 @@ public:
uint32 get_synchro_type(); uint32 get_synchro_type();
uint32 get_xyz_type(); uint32 get_xyz_type();
uint32 get_link_type(); uint32 get_link_type();
std::pair<int32, int32> get_base_atk_def();
std::pair<int32, int32> get_atk_def();
int32 get_base_attack(); int32 get_base_attack();
int32 get_attack(); int32 get_attack();
int32 get_base_defense(); int32 get_base_defense();
......
...@@ -188,7 +188,7 @@ enum effect_flag : uint32 { ...@@ -188,7 +188,7 @@ enum effect_flag : uint32 {
EFFECT_FLAG_UNCOPYABLE = 0x40000, EFFECT_FLAG_UNCOPYABLE = 0x40000,
EFFECT_FLAG_OATH = 0x80000, EFFECT_FLAG_OATH = 0x80000,
EFFECT_FLAG_SPSUM_PARAM = 0x100000, EFFECT_FLAG_SPSUM_PARAM = 0x100000,
EFFECT_FLAG_REPEAT = 0x200000, // EFFECT_FLAG_REPEAT = 0x200000,
EFFECT_FLAG_NO_TURN_RESET = 0x400000, EFFECT_FLAG_NO_TURN_RESET = 0x400000,
EFFECT_FLAG_EVENT_PLAYER = 0x800000, EFFECT_FLAG_EVENT_PLAYER = 0x800000,
EFFECT_FLAG_OWNER_RELATE = 0x1000000, EFFECT_FLAG_OWNER_RELATE = 0x1000000,
...@@ -203,6 +203,8 @@ enum effect_flag : uint32 { ...@@ -203,6 +203,8 @@ enum effect_flag : uint32 {
enum effect_flag2 : uint32 { enum effect_flag2 : uint32 {
EFFECT_FLAG2_MILLENNIUM_RESTRICT = 0x0001, EFFECT_FLAG2_MILLENNIUM_RESTRICT = 0x0001,
EFFECT_FLAG2_COF = 0x0002, EFFECT_FLAG2_COF = 0x0002,
EFFECT_FLAG2_WICKED = 0x0004,
EFFECT_FLAG2_OPTION = 0x0008,
}; };
inline effect_flag operator|(effect_flag flag1, effect_flag flag2) inline effect_flag operator|(effect_flag flag1, effect_flag flag2)
{ {
...@@ -308,8 +310,8 @@ inline effect_flag operator|(effect_flag flag1, effect_flag flag2) ...@@ -308,8 +310,8 @@ inline effect_flag operator|(effect_flag flag1, effect_flag flag2)
#define EFFECT_REVERSE_UPDATE 108 // #define EFFECT_REVERSE_UPDATE 108 //
#define EFFECT_SWAP_AD 109 // #define EFFECT_SWAP_AD 109 //
#define EFFECT_SWAP_BASE_AD 110 // #define EFFECT_SWAP_BASE_AD 110 //
//#define EFFECT_SWAP_ATTACK_FINAL 111 #define EFFECT_SET_BASE_ATTACK_FINAL 111 //
//#define EFFECT_SWAP_DEFENSE_FINAL 112 #define EFFECT_SET_BASE_DEFENSE_FINAL 112 //
#define EFFECT_ADD_CODE 113 // #define EFFECT_ADD_CODE 113 //
#define EFFECT_CHANGE_CODE 114 // #define EFFECT_CHANGE_CODE 114 //
#define EFFECT_ADD_TYPE 115 // #define EFFECT_ADD_TYPE 115 //
......
...@@ -36,8 +36,9 @@ void chain::set_triggering_state(card* pcard) { ...@@ -36,8 +36,9 @@ void chain::set_triggering_state(card* pcard) {
triggering_state.rank = pcard->get_rank(); triggering_state.rank = pcard->get_rank();
triggering_state.attribute = pcard->get_attribute(); triggering_state.attribute = pcard->get_attribute();
triggering_state.race = pcard->get_race(); triggering_state.race = pcard->get_race();
triggering_state.attack = pcard->get_attack(); std::pair<int32, int32> atk_def = pcard->get_atk_def();
triggering_state.defense = pcard->get_defense(); triggering_state.attack = atk_def.first;
triggering_state.defense = atk_def.second;
} }
bool tevent::operator< (const tevent& v) const { bool tevent::operator< (const tevent& v) const {
return std::memcmp(this, &v, sizeof(tevent)) < 0; return std::memcmp(this, &v, sizeof(tevent)) < 0;
......
...@@ -3822,8 +3822,9 @@ int32 field::send_to(uint16 step, group * targets, effect * reason_effect, uint3 ...@@ -3822,8 +3822,9 @@ int32 field::send_to(uint16 step, group * targets, effect * reason_effect, uint3
pcard->previous.rank = pcard->get_rank(); pcard->previous.rank = pcard->get_rank();
pcard->previous.attribute = pcard->get_attribute(); pcard->previous.attribute = pcard->get_attribute();
pcard->previous.race = pcard->get_race(); pcard->previous.race = pcard->get_race();
pcard->previous.attack = pcard->get_attack(); std::pair<int32, int32> atk_def = pcard->get_atk_def();
pcard->previous.defense = pcard->get_defense(); pcard->previous.attack = atk_def.first;
pcard->previous.defense = atk_def.second;
} }
} else { } else {
effect_set eset; effect_set eset;
......
...@@ -2876,7 +2876,8 @@ int32 field::process_battle_command(uint16 step) { ...@@ -2876,7 +2876,8 @@ int32 field::process_battle_command(uint16 step) {
} }
case 26: { case 26: {
// Duel.CalculateDamage() goes here // Duel.CalculateDamage() goes here
uint32 aa = core.attacker->get_attack(), ad = core.attacker->get_defense(); std::pair<int32, int32> atk_def = core.attacker->get_atk_def();
uint32 aa = atk_def.first, ad = atk_def.second;
uint32 da = 0, dd = 0; uint32 da = 0, dd = 0;
uint8 pa = core.attacker->current.controler, pd; uint8 pa = core.attacker->current.controler, pd;
core.attacker->q_cache.attack = aa; core.attacker->q_cache.attack = aa;
...@@ -2884,8 +2885,9 @@ int32 field::process_battle_command(uint16 step) { ...@@ -2884,8 +2885,9 @@ int32 field::process_battle_command(uint16 step) {
core.attacker->set_status(STATUS_BATTLE_RESULT, FALSE); core.attacker->set_status(STATUS_BATTLE_RESULT, FALSE);
core.attacker->set_status(STATUS_BATTLE_DESTROYED, FALSE); core.attacker->set_status(STATUS_BATTLE_DESTROYED, FALSE);
if(core.attack_target) { if(core.attack_target) {
da = core.attack_target->get_attack(); atk_def = core.attack_target->get_atk_def();
dd = core.attack_target->get_defense(); da = atk_def.first;
dd = atk_def.second;
core.attack_target->q_cache.attack = da; core.attack_target->q_cache.attack = da;
core.attack_target->q_cache.defense = dd; core.attack_target->q_cache.defense = dd;
core.attack_target->set_status(STATUS_BATTLE_RESULT, FALSE); core.attack_target->set_status(STATUS_BATTLE_RESULT, FALSE);
......
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