diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 00000000..30cf57ed --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,10 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Ignored default folder with query files +/queries/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 00000000..3c623d49 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 00000000..ca338c25 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 00000000..35eb1ddf --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/battle/entity/Entity.java b/battle/entity/Entity.java index 34b40ef7..97e8fd51 100755 --- a/battle/entity/Entity.java +++ b/battle/entity/Entity.java @@ -955,6 +955,7 @@ private void add(POISON ws) { if (ws.type.unstackable) list.removeIf(e -> e.type.unstackable && type(e) == type(ws)); ws.prob = 0; // used as counter + list.add(ws); getMax(); } @@ -962,7 +963,10 @@ private void add(POISON ws) { private void damage(int dmg, int type) { type &= 3; long mul = type == 0 ? 100 : type == 1 ? e.maxH : type == 2 ? e.health : (e.maxH - e.health); + e.damage += mul * dmg / 100; + + } private void getMax() { @@ -1125,7 +1129,24 @@ private void doRevive(int c) { deadAnim += ea.getEAnim(ZombieEff.REVIVE).len(); e.status[P_REVIVE][1] = deadAnim; int maxR = maxRevHealth(); - e.health = e.maxH * maxR / 100; + + // set how much health to revive with + long reviveHealth = e.maxH * maxR / 100; + + // if revive health exceeds max health, update the max health + if (reviveHealth > e.maxH) + { + e.maxH = reviveHealth; + e.health = e.maxH; + } + + // otherwise set health as normal + else + { + e.health = reviveHealth; + } + + if (c == 1) e.status[P_REVIVE][0]--; else if (c == 2) @@ -1438,6 +1459,12 @@ public void update() { */ private boolean killCounted = false; + + /** + * Damage to use for poison + */ + private int poisonDamage = 0; + /** * cooldown timer for regeneration ability */ @@ -1455,6 +1482,12 @@ protected Entity(StageBasis b, MaskEntity de, EAnimU ea, float atkMagnif, float maxCurrentShield = currentShield = (int) (de.getProc().DEMONSHIELD.hp * hpMagnif); shieldMagnification = hpMagnif; regentimer = getProc().HPREGEN.interval; + + // scale poison damage with mag if option is enabled, otherwise keep poison damage to set value + poisonDamage = de.getProc().POISON.damage; + if (de.getProc().POISON.type.scaleWithBuff) { + poisonDamage = (int) (((float) poisonDamage) * atkMagnif); + } } protected Entity(StageBasis b, MaskEntity de, EAnimU ea, float lvMagnif, float tAtk, float tHP, PCoin pc, Level lv) { @@ -1478,6 +1511,7 @@ protected Entity(StageBasis b, MaskEntity de, EAnimU ea, float lvMagnif, float t status[P_REVIVE][0] = getProc().REVIVE.count; status[P_DMGCUT][0] = getProc().DMGCUT.type.magnif ? (int) (lvMagnif * getProc().DMGCUT.dmg) : getProc().DMGCUT.dmg; status[P_DMGCAP][0] = getProc().DMGCAP.type.magnif ? (int) (lvMagnif * getProc().DMGCAP.dmg) : getProc().DMGCAP.dmg; + presetStatus(lvMagnif); presetSealedProcs(); maxCurrentShield = currentShield = (int) (de.getProc().DEMONSHIELD.hp * lvMagnif); @@ -1825,6 +1859,7 @@ private void processProcs(AttackAb atk) { if (!(ctargetable(atk.trait, atk.attacker, false) || (receive(-1) && atk.SPtr) || (receive(1) && !atk.SPtr))) return; + boolean cannonResist = atk.canon > 0 && getProc().IMUCANNON.exists() && (atk.canon & getProc().IMUCANNON.type) > 0; if (atk.getProc().POIATK.mult > 0) { int rst = getProc().IMUPOIATK.mult; @@ -1992,8 +2027,10 @@ private void processProcs(AttackAb atk) { ws.time = ws.time * (100 - res) / 100; + ws.damage = atk.attacker.poisonDamage; + if (atk.atk != 0 && ws.type.modifAffected) - ws.damage = (int) (ws.damage * (float) getDamage(atk, atk.atk) / atk.atk); + ws.damage = (int) (atk.attacker.poisonDamage * (float) getDamage(atk, atk.atk) / atk.atk); pois.add(ws); anim.getEff(P_POISON); diff --git a/common.iml b/common.iml new file mode 100644 index 00000000..cd8d4e29 --- /dev/null +++ b/common.iml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/util/Data.java b/util/Data.java index 67b1007d..99fae4a1 100755 --- a/util/Data.java +++ b/util/Data.java @@ -194,6 +194,8 @@ public static class TYPE extends IntType { public boolean ignoreMetal; @Order(3) public boolean modifAffected; + @Order(4) + public boolean scaleWithBuff; } @Order(0) diff --git a/util/lang/Editors.java b/util/lang/Editors.java index 2af648c7..decf3137 100644 --- a/util/lang/Editors.java +++ b/util/lang/Editors.java @@ -384,7 +384,9 @@ else if (t.mult == 0) t.type.range_type = 0; t.type.revive_non_zombie = false; } else { - t.health = MathUtil.clip(t.health, 1, 100); + // min revive health should be 1% with no upper cap + t.health = Math.max(1, t.health); + t.time = Math.max(t.time, 1); if (!t.type.revive_others) { t.dis_0 = t.dis_1 = 0; @@ -494,6 +496,7 @@ else if (t.mult == 0) t.type.unstackable = false; t.type.ignoreMetal = false; t.type.modifAffected = false; + t.type.scaleWithBuff = false; } else { t.time = Math.max(1, t.time); t.itv = Math.max(1, t.itv); diff --git a/util/lang/assets/proc.json b/util/lang/assets/proc.json index 513c8da5..43c2f134 100644 --- a/util/lang/assets/proc.json +++ b/util/lang/assets/proc.json @@ -792,6 +792,10 @@ "type.modifAffected": { "name": "Consider Abilities", "tooltip": "Toggle this to make poison damage affected by damage-modifying abilities such as strong against or critical." + }, + "type.scaleWithBuff": { + "name": "Scale With Buff", + "tooltip": "Toggle this to make the damage increase with magnifications. Works best with burn." } } },