void EffectManager::addEffect(EffectDef &effect, int duration, int magnitude, bool item, int trigger, int passive_id, int source_type) { int effect_type = getType(effect.type); // if we're already immune, don't add negative effects if (immunity_damage && (effect_type == EFFECT_DAMAGE || effect_type == EFFECT_DAMAGE_PERCENT)) return; else if (immunity_slow && effect_type == EFFECT_SPEED && magnitude < 100) return; else if (immunity_stun && effect_type == EFFECT_STUN) return; else if (immunity_knockback && effect_type == EFFECT_KNOCKBACK) return; // only allow one knockback effect at a time if (effect_type == EFFECT_KNOCKBACK && knockback_speed != 0) return; for (size_t i=effect_list.size(); i>0; i--) { if (effect_list[i-1].name == effect.id) { if (trigger > -1 && effect_list[i-1].trigger == trigger) return; // trigger effects can only be cast once per trigger if (!effect.can_stack) removeEffect(i-1); } // if we're adding an immunity effect, remove all negative effects if (effect_type == EFFECT_IMMUNITY) clearNegativeEffects(); else if (effect_type == EFFECT_IMMUNITY_DAMAGE) clearNegativeEffects(EFFECT_IMMUNITY_DAMAGE); else if (effect_type == EFFECT_IMMUNITY_SLOW) clearNegativeEffects(EFFECT_IMMUNITY_SLOW); else if (effect_type == EFFECT_IMMUNITY_STUN) clearNegativeEffects(EFFECT_IMMUNITY_STUN); else if (effect_type == EFFECT_IMMUNITY_KNOCKBACK) clearNegativeEffects(EFFECT_IMMUNITY_KNOCKBACK); } Effect e; e.name = effect.id; e.icon = effect.icon; e.type = effect_type; e.render_above = effect.render_above; if (effect.animation != "") { anim->increaseCount(effect.animation); e.animation = loadAnimation(effect.animation); e.animation_name = effect.animation; } e.ticks = e.duration = duration; e.magnitude = e.magnitude_max = magnitude; e.item = item; e.trigger = trigger; e.passive_id = passive_id; e.source_type = source_type; effect_list.push_back(e); }
void EffectManager::addEffect(std::string id, int icon, int duration, int magnitude, std::string type, std::string animation, bool additive, bool item, int trigger, bool render_above, int passive_id, int source_type) { // if we're already immune, don't add negative effects if (immunity) { if (type == "damage") return; else if (type == "speed" && magnitude < 100) return; else if (type == "stun") return; } // only allow one forced_move effect // TODO remove this limitation if (forced_move) { if (type == "forced_move") return; } for (unsigned i=0; i<effect_list.size(); i++) { if (effect_list[i].id == id) { if (trigger > -1 && effect_list[i].trigger == trigger) return; // trigger effects can only be cast once per trigger if (effect_list[i].duration <= duration && effect_list[i].type != "death_sentence") { effect_list[i].ticks = effect_list[i].duration = duration; if (effect_list[i].animation) effect_list[i].animation->reset(); } if (effect_list[i].duration > duration && effect_list[i].type == "death_sentence") { effect_list[i].ticks = effect_list[i].duration = duration; if (effect_list[i].animation) effect_list[i].animation->reset(); } if (additive) break; // this effect will stack if (effect_list[i].magnitude_max <= magnitude) { effect_list[i].magnitude = effect_list[i].magnitude_max = magnitude; if (effect_list[i].animation) effect_list[i].animation->reset(); } return; // we already have this effect } // if we're adding an immunity effect, remove all negative effects if (type == "immunity") { clearNegativeEffects(); } } Effect e; e.id = id; e.icon = icon; e.ticks = e.duration = duration; e.magnitude = e.magnitude_max = magnitude; e.type = type; e.item = item; e.trigger = trigger; e.render_above = render_above; e.passive_id = passive_id; e.source_type = source_type; if (animation != "") { anim->increaseCount(animation); e.animation = loadAnimation(animation); e.animation_name = animation; } effect_list.push_back(e); }
void EffectManager::addEffect(EffectDef &effect, int duration, int magnitude, bool item, int trigger, int passive_id, int source_type) { // if we're already immune, don't add negative effects if (immunity) { if (effect.type == "damage") return; else if (effect.type == "speed" && magnitude < 100) return; else if (effect.type == "stun") return; } for (unsigned i=effect_list.size(); i>0; i--) { if (effect_list[i-1].name == effect.name) { if (trigger > -1 && effect_list[i-1].trigger == trigger) return; // trigger effects can only be cast once per trigger if (!effect.can_stack) removeEffect(i-1); } // if we're adding an immunity effect, remove all negative effects if (effect.type == "immunity") { clearNegativeEffects(); } } Effect e; e.name = effect.name; e.icon = effect.icon; e.type = effect.type; e.render_above = effect.render_above; if (effect.animation != "") { anim->increaseCount(effect.animation); e.animation = loadAnimation(effect.animation); e.animation_name = effect.animation; } e.ticks = e.duration = duration; e.magnitude = e.magnitude_max = magnitude; e.item = item; e.trigger = trigger; e.passive_id = passive_id; e.source_type = source_type; effect_list.push_back(e); }
void EffectManager::addEffect(EffectDef &effect, int duration, int magnitude, bool item, int trigger, int passive_id, int source_type) { int effect_type = getType(effect.type); refresh_stats = true; // if we're already immune, don't add negative effects if (immunity_damage && (effect_type == EFFECT_DAMAGE || effect_type == EFFECT_DAMAGE_PERCENT)) return; else if (immunity_slow && effect_type == EFFECT_SPEED && magnitude < 100) return; else if (immunity_stun && effect_type == EFFECT_STUN) return; else if (immunity_knockback && effect_type == EFFECT_KNOCKBACK) return; else if (immunity_stat_debuff && effect_type > EFFECT_COUNT && magnitude < 0) return; // only allow one knockback effect at a time if (effect_type == EFFECT_KNOCKBACK && knockback_speed != 0) return; if (effect_type == EFFECT_ATTACK_SPEED && magnitude < 100) { logInfo("EffectManager: Attack speeds less than 100 are unsupported."); return; } bool insert_effect = false; int stacks_applied = 0; size_t insert_pos; for (size_t i=effect_list.size(); i>0; i--) { if (effect_list[i-1].id == effect.id) { if (trigger > -1 && effect_list[i-1].trigger == trigger) return; // trigger effects can only be cast once per trigger if (!effect.can_stack) { removeEffect(i-1); } else{ if(effect_type == EFFECT_SHIELD && effect.group_stack){ effect_list[i-1].magnitude += magnitude; if(effect.max_stacks == -1 || (magnitude != 0 && effect_list[i-1].magnitude_max/magnitude < effect.max_stacks)){ effect_list[i-1].magnitude_max += magnitude; } if(effect_list[i-1].magnitude > effect_list[i-1].magnitude_max){ effect_list[i-1].magnitude = effect_list[i-1].magnitude_max; } return; } if (insert_effect == false) { // to keep matching effects together, they are inserted after the most recent matching effect // otherwise, they are added to the end of the effect list insert_effect = true; insert_pos = i; } stacks_applied++; } } // if we're adding an immunity effect, remove all negative effects if (effect_type == EFFECT_IMMUNITY) clearNegativeEffects(); else if (effect_type == EFFECT_IMMUNITY_DAMAGE) clearNegativeEffects(EFFECT_IMMUNITY_DAMAGE); else if (effect_type == EFFECT_IMMUNITY_SLOW) clearNegativeEffects(EFFECT_IMMUNITY_SLOW); else if (effect_type == EFFECT_IMMUNITY_STUN) clearNegativeEffects(EFFECT_IMMUNITY_STUN); else if (effect_type == EFFECT_IMMUNITY_KNOCKBACK) clearNegativeEffects(EFFECT_IMMUNITY_KNOCKBACK); } Effect e; e.id = effect.id; e.name = effect.name; e.icon = effect.icon; e.type = effect_type; e.render_above = effect.render_above; e.group_stack = effect.group_stack; e.color_mod = effect.color_mod; e.alpha_mod = effect.alpha_mod; e.attack_speed_anim = effect.attack_speed_anim; if (effect.animation != "") { anim->increaseCount(effect.animation); e.animation = loadAnimation(effect.animation); e.animation_name = effect.animation; } e.ticks = e.duration = duration; e.magnitude = e.magnitude_max = magnitude; e.item = item; e.trigger = trigger; e.passive_id = passive_id; e.source_type = source_type; if(effect.max_stacks != -1 && stacks_applied >= effect.max_stacks){ //Remove the oldest effect of the type removeEffect(insert_pos-stacks_applied); //All elemnts have shiftef to left insert_pos--; } if (insert_effect) effect_list.insert(effect_list.begin() + insert_pos, e); else effect_list.push_back(e); }