Commit 26e0134c authored by salix5's avatar salix5
parent 8f6ed154
...@@ -411,7 +411,27 @@ int32 card::get_base_attack() { ...@@ -411,7 +411,27 @@ int32 card::get_base_attack() {
if(swap) if(swap)
filter_effect(EFFECT_SET_BASE_DEFENSE, &eset, FALSE); filter_effect(EFFECT_SET_BASE_DEFENSE, &eset, FALSE);
eset.sort(); eset.sort();
int32 swap_final_b = FALSE; // calculate continous effects of this first
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;
temp.base_attack = batk;
eset.remove_item(i);
continue;
case EFFECT_SET_BASE_DEFENSE:
bdef = eset[i]->get_value(this);
if(bdef < 0)
bdef = 0;
eset.remove_item(i);
continue;
}
}
++i;
}
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:
...@@ -425,16 +445,11 @@ int32 card::get_base_attack() { ...@@ -425,16 +445,11 @@ int32 card::get_base_attack() {
bdef = 0; bdef = 0;
break; break;
case EFFECT_SWAP_BASE_AD: case EFFECT_SWAP_BASE_AD:
if(!(eset[i]->type & EFFECT_TYPE_FIELD)) std::swap(batk, bdef);
std::swap(batk, bdef);
else
swap_final_b = !swap_final_b;
break; break;
} }
temp.base_attack = batk; temp.base_attack = batk;
} }
if(swap_final_b)
batk = bdef;
temp.base_attack = -1; temp.base_attack = -1;
return batk; return batk;
} }
...@@ -447,39 +462,22 @@ int32 card::get_attack() { ...@@ -447,39 +462,22 @@ int32 card::get_attack() {
return data.attack; return data.attack;
if (temp.attack != -1) if (temp.attack != -1)
return temp.attack; return temp.attack;
int32 batk = data.attack; int32 batk = get_base_attack();
if(batk < 0)
batk = 0;
int32 bdef = data.defense;
if(bdef < 0)
bdef = 0;
temp.base_attack = batk;
temp.attack = batk; temp.attack = batk;
int32 atk = -1; int32 atk = -1;
int32 def = -1;
int32 currect_def = bdef;
int32 up_atk = 0, upc_atk = 0; int32 up_atk = 0, upc_atk = 0;
int32 up_def = 0, upc_def = 0; int32 swap_final = FALSE;
effect_set eset; effect_set eset;
filter_effect(EFFECT_SWAP_AD, &eset, FALSE); filter_effect(EFFECT_SWAP_AD, &eset, FALSE);
filter_effect(EFFECT_SWAP_BASE_AD, &eset, FALSE);
int32 swap = eset.size();
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); filter_effect(EFFECT_SWAP_ATTACK_FINAL, &eset, FALSE);
if(swap) {
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_SET_BASE_DEFENSE, &eset, FALSE);
}
eset.sort(); eset.sort();
int32 rev = FALSE; int32 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; effect_set effects_atk, effects_atk_r;
int32 swap_final = FALSE, swap_final_b = FALSE;
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:
...@@ -505,95 +503,38 @@ int32 card::get_attack() { ...@@ -505,95 +503,38 @@ int32 card::get_attack() {
effects_atk_r.add_item(eset[i]); effects_atk_r.add_item(eset[i]);
} }
break; break;
case EFFECT_SET_BASE_ATTACK: case EFFECT_SWAP_ATTACK_FINAL:
batk = eset[i]->get_value(this); atk = eset[i]->get_value(this);
if(batk < 0) up_atk = 0;
batk = 0; upc_atk = 0;
temp.base_attack = batk;
atk = -1;
break;
case EFFECT_UPDATE_DEFENSE:
if((eset[i]->type & EFFECT_TYPE_SINGLE) && !eset[i]->is_flag(EFFECT_FLAG_SINGLE_RANGE))
up_def += eset[i]->get_value(this);
else
upc_def += eset[i]->get_value(this);
break;
case EFFECT_SET_DEFENSE:
def = eset[i]->get_value(this);
if(!(eset[i]->type & EFFECT_TYPE_SINGLE))
up_def = 0;
break;
case EFFECT_SET_DEFENSE_FINAL:
if((eset[i]->type & EFFECT_TYPE_SINGLE) && !eset[i]->is_flag(EFFECT_FLAG_SINGLE_RANGE)) {
def = eset[i]->get_value(this);
up_def = 0;
upc_def = 0;
}
break;
case EFFECT_SET_BASE_DEFENSE:
bdef = eset[i]->get_value(this);
if(bdef < 0)
bdef = 0;
def = -1;
break; break;
case EFFECT_SWAP_AD: case EFFECT_SWAP_AD:
if((eset[i]->type & EFFECT_TYPE_SINGLE) && !eset[i]->is_flag(EFFECT_FLAG_SINGLE_RANGE)) { swap_final = !swap_final;
atk = currect_def;
up_atk = 0;
upc_atk = 0;
def = temp.attack;
up_def = 0;
upc_def = 0;
} else
swap_final = !swap_final;
break;
case EFFECT_SWAP_BASE_AD:
if(!(eset[i]->type & EFFECT_TYPE_FIELD)) {
std::swap(batk, bdef);
temp.base_attack = batk;
} else
swap_final_b = !swap_final_b;
break; break;
} }
if(!rev) { if(!rev) {
temp.attack = ((atk < 0) ? batk : atk) + up_atk + upc_atk; temp.attack = ((atk < 0) ? batk : atk) + up_atk + upc_atk;
currect_def = ((def < 0) ? bdef : def) + up_def + upc_def;
} else { } else {
temp.attack = ((atk < 0) ? batk : atk) - up_atk - upc_atk; temp.attack = ((atk < 0) ? batk : atk) - up_atk - upc_atk;
currect_def = ((def < 0) ? bdef : def) - up_def - upc_def;
} }
if(temp.attack < 0) if(temp.attack < 0)
temp.attack = 0; temp.attack = 0;
} }
if(swap_final_b) {
std::swap(batk, bdef);
temp.base_attack = batk;
if(!rev) {
temp.attack = ((atk < 0) ? batk : atk) + up_atk + upc_atk;
currect_def = ((def < 0) ? bdef : def) + up_def + upc_def;
} else {
temp.attack = ((atk < 0) ? batk : atk) - up_atk - upc_atk;
currect_def = ((def < 0) ? bdef : def) - up_def - upc_def;
}
if(temp.attack < 0)
temp.attack = 0;
}
if(swap_final) {
temp.attack = currect_def;
if(temp.attack < 0)
temp.attack = 0;
}
for(int32 i = 0; i < effects_atk.size(); ++i) for(int32 i = 0; i < effects_atk.size(); ++i)
temp.attack = effects_atk[i]->get_value(this); temp.attack = effects_atk[i]->get_value(this);
for(int32 i = 0; i < effects_atk_r.size(); ++i) { if(temp.defense == -1){
temp.attack = effects_atk_r[i]->get_value(this); if(swap_final) {
if(effects_atk_r[i]->is_flag(EFFECT_FLAG_REPEAT)) temp.attack = get_defense();
}
for(int32 i = 0; i < effects_atk_r.size(); ++i) {
temp.attack = effects_atk_r[i]->get_value(this); 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; atk = temp.attack;
if(atk < 0) if(atk < 0)
atk = 0; atk = 0;
temp.base_attack = -1;
temp.attack = -1; temp.attack = -1;
return atk; return atk;
} }
...@@ -618,7 +559,26 @@ int32 card::get_base_defense() { ...@@ -618,7 +559,26 @@ int32 card::get_base_defense() {
if(swap) if(swap)
filter_effect(EFFECT_SET_BASE_ATTACK, &eset, FALSE); filter_effect(EFFECT_SET_BASE_ATTACK, &eset, FALSE);
eset.sort(); eset.sort();
int32 swap_final_b = FALSE; 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;
}
}
++i;
}
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:
...@@ -632,16 +592,11 @@ int32 card::get_base_defense() { ...@@ -632,16 +592,11 @@ int32 card::get_base_defense() {
bdef = 0; bdef = 0;
break; break;
case EFFECT_SWAP_BASE_AD: case EFFECT_SWAP_BASE_AD:
if(!(eset[i]->type & EFFECT_TYPE_FIELD)) std::swap(batk, bdef);
std::swap(batk, bdef);
else
swap_final_b = !swap_final_b;
break; break;
} }
temp.base_defense = bdef; temp.base_defense = bdef;
} }
if(swap_final_b)
bdef = batk;
temp.base_defense = -1; temp.base_defense = -1;
return bdef; return bdef;
} }
...@@ -654,65 +609,24 @@ int32 card::get_defense() { ...@@ -654,65 +609,24 @@ int32 card::get_defense() {
return data.defense; return data.defense;
if (temp.defense != -1) if (temp.defense != -1)
return temp.defense; return temp.defense;
int32 batk = data.attack; int32 bdef = get_base_defense();
if(batk < 0)
batk = 0;
int32 bdef = data.defense;
if(bdef < 0)
bdef = 0;
temp.base_defense = bdef;
temp.defense = bdef; temp.defense = bdef;
int32 atk = -1;
int32 def = -1; int32 def = -1;
int32 current_atk = batk;
int32 up_atk = 0, upc_atk = 0;
int32 up_def = 0, upc_def = 0; int32 up_def = 0, upc_def = 0;
int32 swap_final = FALSE;
effect_set eset; effect_set eset;
filter_effect(EFFECT_SWAP_AD, &eset, FALSE); filter_effect(EFFECT_SWAP_AD, &eset, FALSE);
filter_effect(EFFECT_SWAP_BASE_AD, &eset, FALSE);
int32 swap = eset.size();
filter_effect(EFFECT_UPDATE_DEFENSE, &eset, FALSE); filter_effect(EFFECT_UPDATE_DEFENSE, &eset, FALSE);
filter_effect(EFFECT_SET_DEFENSE, &eset, FALSE); filter_effect(EFFECT_SET_DEFENSE, &eset, FALSE);
filter_effect(EFFECT_SET_DEFENSE_FINAL, &eset, FALSE); filter_effect(EFFECT_SET_DEFENSE_FINAL, &eset, FALSE);
filter_effect(EFFECT_SET_BASE_DEFENSE, &eset, FALSE); filter_effect(EFFECT_SWAP_DEFENSE_FINAL, &eset, FALSE);
if(swap) {
filter_effect(EFFECT_UPDATE_ATTACK, &eset, FALSE);
filter_effect(EFFECT_SET_ATTACK, &eset, FALSE);
filter_effect(EFFECT_SET_ATTACK_FINAL, &eset, FALSE);
filter_effect(EFFECT_SET_BASE_ATTACK, &eset, FALSE);
}
eset.sort(); eset.sort();
int32 rev = FALSE; int32 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_def, effects_def_r; effect_set effects_def, effects_def_r;
int32 swap_final = FALSE, swap_final_b = FALSE;
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:
if((eset[i]->type & EFFECT_TYPE_SINGLE) && !eset[i]->is_flag(EFFECT_FLAG_SINGLE_RANGE))
up_atk += eset[i]->get_value(this);
else
upc_atk += eset[i]->get_value(this);
break;
case EFFECT_SET_ATTACK:
atk = eset[i]->get_value(this);
if(!(eset[i]->type & EFFECT_TYPE_SINGLE))
up_atk = 0;
break;
case EFFECT_SET_ATTACK_FINAL:
if((eset[i]->type & EFFECT_TYPE_SINGLE) && !eset[i]->is_flag(EFFECT_FLAG_SINGLE_RANGE)) {
atk = eset[i]->get_value(this);
up_atk = 0;
upc_atk = 0;
}
break;
case EFFECT_SET_BASE_ATTACK:
batk = eset[i]->get_value(this);
if(batk < 0)
batk = 0;
atk = -1;
break;
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);
...@@ -736,71 +650,38 @@ int32 card::get_defense() { ...@@ -736,71 +650,38 @@ int32 card::get_defense() {
effects_def_r.add_item(eset[i]); effects_def_r.add_item(eset[i]);
} }
break; break;
case EFFECT_SET_BASE_DEFENSE: case EFFECT_SWAP_DEFENSE_FINAL:
bdef = eset[i]->get_value(this); def = eset[i]->get_value(this);
if(bdef < 0) up_def = 0;
bdef = 0; upc_def = 0;
temp.base_defense = bdef;
def = -1;
break; break;
case EFFECT_SWAP_AD: case EFFECT_SWAP_AD:
if((eset[i]->type & EFFECT_TYPE_SINGLE) && !eset[i]->is_flag(EFFECT_FLAG_SINGLE_RANGE)) { swap_final = !swap_final;
atk = temp.defense;
up_atk = 0;
upc_atk = 0;
def = current_atk;
up_def = 0;
upc_def = 0;
} else
swap_final = !swap_final;
break;
case EFFECT_SWAP_BASE_AD:
if(!(eset[i]->type & EFFECT_TYPE_FIELD)) {
std::swap(batk, bdef);
temp.base_defense = bdef;
} else
swap_final_b = !swap_final_b;
break; break;
} }
if(!rev) { if(!rev) {
current_atk = ((atk < 0) ? batk : atk) + up_atk + upc_atk;
temp.defense = ((def < 0) ? bdef : def) + up_def + upc_def; temp.defense = ((def < 0) ? bdef : def) + up_def + upc_def;
} else { } else {
current_atk = ((atk < 0) ? batk : atk) - up_atk - upc_atk;
temp.defense = ((def < 0) ? bdef : def) - up_def - upc_def; temp.defense = ((def < 0) ? bdef : def) - up_def - upc_def;
} }
if(temp.defense < 0) if(temp.defense < 0)
temp.defense = 0; temp.defense = 0;
} }
if(swap_final_b) {
std::swap(batk, bdef);
temp.base_defense = bdef;
if(!rev) {
current_atk = ((atk < 0) ? batk : atk) + up_atk + upc_atk;
temp.defense = ((def < 0) ? bdef : def) + up_def + upc_def;
} else {
current_atk = ((atk < 0) ? batk : atk) - up_atk - upc_atk;
temp.defense = ((def < 0) ? bdef : def) - up_def - upc_def;
}
if(temp.defense < 0)
temp.defense = 0;
}
if(swap_final) {
temp.defense = current_atk;
if(temp.defense < 0)
temp.defense = 0;
}
for(int32 i = 0; i < effects_def.size(); ++i) for(int32 i = 0; i < effects_def.size(); ++i)
temp.defense = effects_def[i]->get_value(this); temp.defense = effects_def[i]->get_value(this);
for(int32 i = 0; i < effects_def_r.size(); ++i) { if(temp.attack == -1){
temp.defense = effects_def_r[i]->get_value(this); if(swap_final) {
if(effects_def_r[i]->is_flag(EFFECT_FLAG_REPEAT)) temp.defense = get_attack();
}
for(int32 i = 0; i < effects_def_r.size(); ++i) {
temp.defense = effects_def_r[i]->get_value(this); 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);
}
} }
def = temp.defense; def = temp.defense;
if(def < 0) if(def < 0)
def = 0; def = 0;
temp.base_defense = -1;
temp.defense = -1; temp.defense = -1;
return def; return def;
} }
......
...@@ -281,6 +281,8 @@ inline effect_flag operator|(effect_flag flag1, effect_flag flag2) ...@@ -281,6 +281,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_SWAP_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 //
......
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