v2.0.0: added an ability for sneak attack weapons

This commit is contained in:
Evan Debenham
2022-11-25 13:56:10 -05:00
parent 8b6089be82
commit 4fb4b11dd7
4 changed files with 98 additions and 0 deletions

View File

@@ -1482,6 +1482,8 @@ items.weapon.enchantments.vampiric.desc=This powerful enchantment leeches life f
###melee weapons
items.weapon.melee.assassinsblade.name=assassin's blade
items.weapon.melee.assassinsblade.stats_desc=This weapon is stronger against unaware enemies.
items.weapon.melee.assassinsblade.ability_name=sneak
items.weapon.melee.assassinsblade.ability_desc=The duelist can _sneak_ while wielding an assassin's blade. This ability lets the duelist blink up to 3 tiles away and grants her 1 turn of invisibility, but costs 2 charges.
items.weapon.melee.assassinsblade.desc=A small wavy blade made of obsidian, difficult to use despite being lightweight, but deadly if it finds the right mark.
items.weapon.melee.battleaxe.name=battle axe
@@ -1494,10 +1496,14 @@ items.weapon.melee.crossbow.desc=A fairly intricate weapon which shoots bolts at
items.weapon.melee.dagger.name=dagger
items.weapon.melee.dagger.stats_desc=This weapon is stronger against unaware enemies.
items.weapon.melee.dagger.ability_name=sneak
items.weapon.melee.dagger.ability_desc=The duelist can _sneak_ while wielding a dagger. This ability lets the duelist blink up to 5 tiles away and grants her 1 turn of invisibility, but costs 2 charges.
items.weapon.melee.dagger.desc=A simple iron dagger with a worn wooden handle.
items.weapon.melee.dirk.name=dirk
items.weapon.melee.dirk.stats_desc=This weapon is stronger against unaware enemies.
items.weapon.melee.dirk.ability_name=sneak
items.weapon.melee.dirk.ability_desc=The duelist can _sneak_ while wielding a dirk. This ability lets the duelist blink up to 4 tiles away and grants her 1 turn of invisibility, but costs 2 charges.
items.weapon.melee.dirk.desc=A longer thrusting dagger, gives a bit more steel to plunge into foes.
items.weapon.melee.flail.name=flail

View File

@@ -25,6 +25,7 @@ import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
import com.watabou.utils.Random;
@@ -65,4 +66,19 @@ public class AssassinsBlade extends MeleeWeapon {
return super.damageRoll(owner);
}
@Override
public int abilityChargeUse() {
return 2;
}
@Override
public String targetingPrompt() {
return Messages.get(this, "prompt");
}
@Override
protected void duelistAbility(Hero hero, Integer target) {
Dagger.sneakAbility(hero, target, 3, this);
}
}

View File

@@ -22,10 +22,23 @@
package com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Invisibility;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter;
import com.shatteredpixel.shatteredpixeldungeon.effects.Speck;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
import com.shatteredpixel.shatteredpixeldungeon.utils.BArray;
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
import com.watabou.noosa.audio.Sample;
import com.watabou.utils.Callback;
import com.watabou.utils.PathFinder;
import com.watabou.utils.Random;
public class Dagger extends MeleeWeapon {
@@ -67,4 +80,51 @@ public class Dagger extends MeleeWeapon {
return super.damageRoll(owner);
}
@Override
public int abilityChargeUse() {
return 2;
}
@Override
public String targetingPrompt() {
return Messages.get(this, "prompt");
}
@Override
protected void duelistAbility(Hero hero, Integer target) {
sneakAbility(hero, target, 5, this);
}
public static void sneakAbility(Hero hero, Integer target, int maxDist, MeleeWeapon wep){
if (target == null) {
return;
}
if (Actor.findChar(target) != null || !Dungeon.level.heroFOV[target]) {
GLog.w(Messages.get(wep, "ability_bad_position"));
return;
}
PathFinder.buildDistanceMap(Dungeon.hero.pos, BArray.not(Dungeon.level.solid, null), maxDist);
if (PathFinder.distance[target] == Integer.MAX_VALUE) {
GLog.w(Messages.get(wep, "ability_bad_position"));
return;
}
Buff.affect(hero, Invisibility.class, Math.max(1, 1/hero.speed()));
hero.spendAndNext(1/hero.speed());
wep.onAbilityUsed(hero);
Dungeon.hero.sprite.turnTo( Dungeon.hero.pos, target);
Dungeon.hero.pos = target;
Dungeon.level.occupyCell(Dungeon.hero);
Dungeon.observe();
GameScene.updateFog();
Dungeon.hero.checkVisibleMobs();
Dungeon.hero.sprite.place( Dungeon.hero.pos );
CellEmitter.get( Dungeon.hero.pos ).burst( Speck.factory( Speck.WOOL ), 6 );
Sample.INSTANCE.play( Assets.Sounds.PUFF );
}
}

View File

@@ -25,6 +25,7 @@ import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
import com.watabou.utils.Random;
@@ -65,4 +66,19 @@ public class Dirk extends MeleeWeapon {
return super.damageRoll(owner);
}
@Override
public int abilityChargeUse() {
return 2;
}
@Override
public String targetingPrompt() {
return Messages.get(this, "prompt");
}
@Override
protected void duelistAbility(Hero hero, Integer target) {
Dagger.sneakAbility(hero, target, 4, this);
}
}