v1.3.0: very early impl on ascension challenge debuff

This commit is contained in:
Evan Debenham
2022-06-02 14:00:16 -04:00
parent f0405f5e77
commit 0911953ffa
11 changed files with 132 additions and 5 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 3.0 KiB

View File

@@ -29,6 +29,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.ToxicGas;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Adrenaline;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.AllyBuff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ArcaneArmor;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.AscensionChallenge;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Barkskin;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Berserk;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Bleeding;
@@ -314,7 +315,7 @@ public abstract class Char extends Actor {
} else if (hit( this, enemy, accMulti )) {
int dr = enemy.drRoll();
int dr = Math.round(enemy.drRoll() * AscensionChallenge.statModifier(this));
Barkskin bark = enemy.buff(Barkskin.class);
if (bark != null) dr += Random.NormalIntRange( 0 , bark.level() );
@@ -330,7 +331,7 @@ public abstract class Char extends Actor {
dr = 0;
}
}
int dmg;
Preparation prep = buff(Preparation.class);
if (prep != null){
@@ -467,6 +468,7 @@ public abstract class Char extends Actor {
for (ChampionEnemy buff : attacker.buffs(ChampionEnemy.class)){
acuRoll *= buff.evasionAndAccuracyFactor();
}
acuRoll *= AscensionChallenge.statModifier(attacker);
float defRoll = Random.Float( defStat );
if (defender.buff(Bless.class) != null) defRoll *= 1.25f;
@@ -474,6 +476,7 @@ public abstract class Char extends Actor {
for (ChampionEnemy buff : defender.buffs(ChampionEnemy.class)){
defRoll *= buff.evasionAndAccuracyFactor();
}
defRoll *= AscensionChallenge.statModifier(defender);
return (acuRoll * accMulti) >= defRoll;
}
@@ -509,6 +512,7 @@ public abstract class Char extends Actor {
damage *= buff.meleeDamageFactor();
buff.onAttackProc( enemy );
}
damage = Math.round( damage * AscensionChallenge.statModifier(this));
return damage;
}
@@ -557,6 +561,7 @@ public abstract class Char extends Actor {
for (ChampionEnemy buff : buffs(ChampionEnemy.class)){
dmg = (int) Math.ceil(dmg * buff.damageTakenFactor());
}
dmg = (int)Math.ceil(dmg / AscensionChallenge.statModifier(this));
if (!(src instanceof LifeLink) && buff(LifeLink.class) != null){
HashSet<LifeLink> links = buffs(LifeLink.class);

View File

@@ -0,0 +1,106 @@
/*
* Pixel Dungeon
* Copyright (C) 2012-2015 Oleg Dolya
*
* Shattered Pixel Dungeon
* Copyright (C) 2014-2022 Evan Debenham
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*/
package com.shatteredpixel.shatteredpixeldungeon.actors.buffs;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.*;
import com.shatteredpixel.shatteredpixeldungeon.ui.BuffIndicator;
import com.watabou.noosa.Image;
import java.util.HashMap;
public class AscensionChallenge extends Buff{
{
revivePersists = true;
}
private static HashMap<Class<?extends Mob>, Float> modifiers = new HashMap<>();
static {
modifiers.put(Rat.class, 10f);
modifiers.put(Snake.class, 8f);
modifiers.put(Gnoll.class, 8f);
modifiers.put(Swarm.class, 7f);
modifiers.put(Crab.class, 6f);
modifiers.put(Slime.class, 6f);
modifiers.put(Skeleton.class, 4.5f);
modifiers.put(Thief.class, 4.5f);
modifiers.put(DM100.class, 4f);
modifiers.put(Guard.class, 3.5f);
modifiers.put(Necromancer.class, 3.5f);
modifiers.put(Bat.class, 2.5f);
modifiers.put(Brute.class, 2.25f);
modifiers.put(Shaman.class, 2.25f);
modifiers.put(Spinner.class, 2f);
modifiers.put(DM200.class, 2f);
modifiers.put(Ghoul.class, 1.67f);
modifiers.put(Elemental.class, 1.5f);
modifiers.put(Warlock.class, 1.33f);
modifiers.put(Monk.class, 1.33f);
modifiers.put(Golem.class, 1.25f);
modifiers.put(RipperDemon.class, 1.2f);
modifiers.put(Succubus.class, 1.2f);
modifiers.put(Eye.class, 1f);
modifiers.put(Scorpio.class, 1f);
}
public static float statModifier(Char ch){
if (Dungeon.hero.buff(AscensionChallenge.class) == null){
return 1;
}
for (Class<?extends Mob> cls : modifiers.keySet()){
if (ch.getClass().isAssignableFrom(cls)){
return modifiers.get(cls);
}
}
return 1;
}
//TODO lots of impl still to do here
//for Exp: treat all enemies with multiplier as needing 14 EXP (except ghouls/rippers, which are 7/10)
//For damage scaling effects: Treat as if floor 26 (bombs, toxic gas, corrosion, electricity, sac fire(?)
// Burning, ooze,
//for allies/enemies with depth scaling effects, treat as if floor 26
// How though?
@Override
public int icon() {
return BuffIndicator.AMULET;
}
@Override
public void tintIcon(Image icon) {
icon.hardlight(1, 1, 0);
}
}

View File

@@ -24,6 +24,7 @@ package com.shatteredpixel.shatteredpixeldungeon.actors.mobs;
import com.shatteredpixel.shatteredpixeldungeon.Badges;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.AscensionChallenge;
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.SparkParticle;
import com.shatteredpixel.shatteredpixeldungeon.items.Generator;
import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica;
@@ -91,6 +92,7 @@ public class DM100 extends Mob implements Callback {
if (hit( this, enemy, true )) {
int dmg = Random.NormalIntRange(3, 10);
dmg = Math.round(dmg * AscensionChallenge.statModifier(this));
enemy.damage( dmg, new LightningBolt() );
if (enemy.sprite.visible) {

View File

@@ -25,6 +25,7 @@ import com.shatteredpixel.shatteredpixeldungeon.Badges;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.AscensionChallenge;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Light;
import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter;
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.PurpleParticle;
@@ -177,7 +178,9 @@ public class Eye extends Mob {
}
if (hit( this, ch, true )) {
ch.damage( Random.NormalIntRange( 30, 50 ), new DeathGaze() );
int dmg = Random.NormalIntRange( 30, 50 );
dmg = Math.round(dmg * AscensionChallenge.statModifier(this));
ch.damage( dmg, new DeathGaze() );
if (Dungeon.level.heroFOV[pos]) {
ch.sprite.flash();

View File

@@ -25,6 +25,7 @@ import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Badges;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.AscensionChallenge;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Hex;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Vulnerable;
@@ -117,6 +118,7 @@ public abstract class Shaman extends Mob {
}
int dmg = Random.NormalIntRange( 6, 15 );
dmg = Math.round(dmg * AscensionChallenge.statModifier(this));
enemy.damage( dmg, new EarthenBolt() );
if (!enemy.isAlive() && enemy == Dungeon.hero) {

View File

@@ -24,6 +24,7 @@ package com.shatteredpixel.shatteredpixeldungeon.actors.mobs;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.AscensionChallenge;
import com.shatteredpixel.shatteredpixeldungeon.items.Generator;
import com.shatteredpixel.shatteredpixeldungeon.items.Item;
import com.shatteredpixel.shatteredpixeldungeon.levels.features.Chasm;
@@ -68,7 +69,8 @@ public class Skeleton extends Mob {
for (int i = 0; i < PathFinder.NEIGHBOURS8.length; i++) {
Char ch = findChar( pos + PathFinder.NEIGHBOURS8[i] );
if (ch != null && ch.isAlive()) {
int damage = Random.NormalIntRange(6, 12);
int damage = Math.round(Random.NormalIntRange(6, 12));
damage = Math.round( damage * AscensionChallenge.statModifier(this));
damage = Math.max( 0, damage - (ch.drRoll() + ch.drRoll()) );
ch.damage( damage, this );
if (ch == Dungeon.hero && !ch.isAlive()) {

View File

@@ -25,6 +25,7 @@ import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Blob;
import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Web;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.AscensionChallenge;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Dread;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Poison;
@@ -119,7 +120,10 @@ public class Spinner extends Mob {
public int attackProc(Char enemy, int damage) {
damage = super.attackProc( enemy, damage );
if (Random.Int(2) == 0) {
Buff.affect(enemy, Poison.class).set(Random.IntRange(7, 8) );
int duration = Random.IntRange(7, 8);
//we only use half the ascension modifier here as total poison dmg doesn't scale linearly
duration = Math.round(duration * (AscensionChallenge.statModifier(this)/2f + 0.5f));
Buff.affect(enemy, Poison.class).set(duration);
webCoolDown = 0;
state = FLEEING;
}

View File

@@ -25,6 +25,7 @@ import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Badges;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.AscensionChallenge;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Degrade;
import com.shatteredpixel.shatteredpixeldungeon.items.Generator;
@@ -110,6 +111,7 @@ public class Warlock extends Mob implements Callback {
}
int dmg = Random.NormalIntRange( 12, 18 );
dmg = Math.round(dmg * AscensionChallenge.statModifier(this));
enemy.damage( dmg, new DarkBolt() );
if (enemy == Dungeon.hero && !enemy.isAlive()) {

View File

@@ -109,6 +109,7 @@ public class BuffIndicator extends Component {
public static final int ENDURE = 56;
public static final int INVERT_MARK = 57;
public static final int NATURE_POWER= 58;
public static final int AMULET = 59;
public static final int SIZE_SMALL = 7;
public static final int SIZE_LARGE = 16;