v0.7.4: various polish for both new wands

This commit is contained in:
Evan Debenham 2019-07-07 16:35:50 -04:00
parent 87f909d1fe
commit c174e998bc
7 changed files with 137 additions and 31 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@ -98,6 +98,7 @@ public class Assets {
public static final String ROT_HEART= "rot_heart.png";
public static final String GUARD = "guard.png";
public static final String WARDS = "wards.png";
public static final String GUARDIAN = "guardian.png";
public static final String ITEMS = "items.png";
public static final String TERRAIN_FEATURES = "terrain_features.png";

View File

@ -161,11 +161,15 @@ public abstract class Wand extends Item {
}
protected void processSoulMark(Char target, int chargesUsed){
processSoulMark(target, level(), chargesUsed);
}
protected static void processSoulMark(Char target, int wandLevel, int chargesUsed){
if (target != Dungeon.hero &&
Dungeon.hero.subClass == HeroSubClass.WARLOCK &&
//standard 1 - 0.92^x chance, plus 7%. Starts at 15%
Random.Float() > (Math.pow(0.92f, (level()*chargesUsed)+1) - 0.07f)){
SoulMark.prolong(target, SoulMark.class, SoulMark.DURATION + level());
Random.Float() > (Math.pow(0.92f, (wandLevel*chargesUsed)+1) - 0.07f)){
SoulMark.prolong(target, SoulMark.class, SoulMark.DURATION + wandLevel);
}
}

View File

@ -34,8 +34,8 @@ import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.MagesStaff;
import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
import com.shatteredpixel.shatteredpixeldungeon.sprites.EarthGuardianSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
import com.shatteredpixel.shatteredpixeldungeon.sprites.StatueSprite;
import com.shatteredpixel.shatteredpixeldungeon.ui.BuffIndicator;
import com.watabou.noosa.audio.Sample;
import com.watabou.utils.Bundle;
@ -56,13 +56,14 @@ public class WandOfLivingEarth extends DamageWand {
@Override
public int max(int lvl) {
return 6 + 3*lvl;
return 4 + 2*lvl;
}
@Override
protected void onZap(Ballistica bolt) {
Char ch = Actor.findChar(bolt.collisionPos);
int damage = damageRoll();
int armorToAdd = Math.round(damage*1.33f);
EarthGuardian guardian = null;
for (Mob m : Dungeon.level.mobs){
@ -77,13 +78,13 @@ public class WandOfLivingEarth extends DamageWand {
buff = Buff.affect(curUser, RockArmor.class);
}
if (buff != null){
buff.addArmor(level(), damage);
buff.addArmor(level(), armorToAdd);
}
//shooting at the guardian
if (guardian != null && guardian == ch){
guardian.sprite.centerEmitter().burst(MagicMissile.EarthParticle.ATTRACT, 5 + level() / 2);
guardian.setInfo(curUser, level(), damage);
guardian.setInfo(curUser, level(), armorToAdd);
processSoulMark(guardian, chargesPerCast());
//shooting the guardian at a location
@ -149,7 +150,7 @@ public class WandOfLivingEarth extends DamageWand {
curUser.sprite.centerEmitter().burst(MagicMissile.EarthParticle.ATTRACT, 5 + level() / 2);
} else {
guardian.sprite.centerEmitter().burst(MagicMissile.EarthParticle.ATTRACT, 5 + level() / 2);
guardian.setInfo(curUser, level(), damage);
guardian.setInfo(curUser, level(), armorToAdd);
if (ch != null) guardian.aggro( ch );
}
}
@ -253,8 +254,7 @@ public class WandOfLivingEarth extends DamageWand {
public static class EarthGuardian extends NPC {
{
//TODO visuals
spriteClass = StatueSprite.class;
spriteClass = EarthGuardianSprite.class;
alignment = Alignment.ALLY;
state = HUNTING;
@ -275,19 +275,25 @@ public class WandOfLivingEarth extends DamageWand {
HT = 20 + 10 * wandLevel;
}
HP = Math.min(HT, HP + healthToAdd);
//same as the hero
defenseSkill = hero.lvl + 4;
//half of hero's evasion
defenseSkill = (hero.lvl + 4)/2;
}
@Override
public int attackSkill(Char target) {
//same as the hero
return defenseSkill + 5;
return 2*defenseSkill + 5;
}
@Override
public int attackProc(Char enemy, int damage) {
if (enemy instanceof Mob) ((Mob)enemy).aggro(this);
return super.attackProc(enemy, damage);
}
@Override
public int damageRoll() {
return Random.NormalIntRange(wandLevel, 6 + 3*wandLevel);
return Random.NormalIntRange(2+wandLevel, 6 + 3*wandLevel);
}
@Override
@ -295,20 +301,25 @@ public class WandOfLivingEarth extends DamageWand {
return Random.NormalIntRange(wandLevel, 4 + 4*wandLevel);
}
private static final String DEFENCE = "defence";
@Override
public String description() {
return Messages.get(this, "desc", wandLevel, 4 + 4*wandLevel);
}
private static final String DEFENSE = "defense";
private static final String WAND_LEVEL = "wand_level";
@Override
public void storeInBundle(Bundle bundle) {
super.storeInBundle(bundle);
bundle.put(DEFENCE, defenseSkill);
bundle.put(DEFENSE, defenseSkill);
bundle.put(WAND_LEVEL, wandLevel);
}
@Override
public void restoreFromBundle(Bundle bundle) {
super.restoreFromBundle(bundle);
defenseSkill = bundle.getInt(DEFENCE);
defenseSkill = bundle.getInt(DEFENSE);
wandLevel = bundle.getInt(WAND_LEVEL);
}

View File

@ -9,6 +9,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.NPC;
import com.shatteredpixel.shatteredpixeldungeon.effects.MagicMissile;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.MagesStaff;
import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
@ -48,27 +49,28 @@ public class WandOfWarding extends Wand {
((Ward) ch).upgrade(level());
} else {
if (((Ward) ch).tier <= 3){
GLog.w("Your wand can't sustain any more wards.");
GLog.w( Messages.get(this, "no_more_wards"));
} else {
((Ward) ch).wandHeal( level() );
}
}
ch.sprite.emitter().burst(MagicMissile.WardParticle.UP, ((Ward) ch).tier);
} else {
GLog.w("There isn't room to place a ward here");
GLog.w( Messages.get(this, "bad_location"));
}
} else if (canPlaceWard(bolt.collisionPos)){
if (canPlaceMore) {
Ward ward = new Ward();
ward.pos = bolt.collisionPos;
ward.wandLevel = level();
GameScene.add(ward, 1f);
ward.sprite.emitter().burst(MagicMissile.WardParticle.UP, ward.tier);
QuickSlotButton.target(ward);
} else {
GLog.w("Your wand can't sustain any more wards.");
GLog.w( Messages.get(this, "no_more_wards"));
}
} else {
GLog.w("There isn't room to place a ward here");
GLog.w( Messages.get(this, "bad_location"));
}
}
@ -144,6 +146,8 @@ public class WandOfWarding extends Wand {
viewDistance = 3;
state = WANDERING;
name = Messages.get(this, "name_" + tier );
}
public void upgrade( int wandLevel ){
@ -172,6 +176,7 @@ public class WandOfWarding extends Wand {
if (tier < 6){
tier++;
viewDistance++;
name = Messages.get(this, "name_" + tier );
updateSpriteState();
}
}
@ -196,6 +201,23 @@ public class WandOfWarding extends Wand {
}
}
@Override
public int defenseSkill(Char enemy) {
if (tier > 3){
defenseSkill = 4 + Dungeon.depth;
}
return super.defenseSkill(enemy);
}
@Override
public int drRoll() {
if (tier > 3){
return Math.round(Random.NormalIntRange(0, 3 + Dungeon.depth/2) / (7f - tier));
} else {
return 0;
}
}
@Override
protected float attackDelay() {
switch (tier){
@ -231,6 +253,9 @@ public class WandOfWarding extends Wand {
//always hits
int dmg = Random.Int( 2 + wandLevel, 8 + 4*wandLevel );
enemy.damage( dmg, WandOfWarding.class );
if (enemy.isAlive()){
Wand.processSoulMark(enemy, wandLevel, 1);
}
if (!enemy.isAlive() && enemy == Dungeon.hero) {
Dungeon.fail( getClass() );
@ -295,7 +320,10 @@ public class WandOfWarding extends Wand {
@Override
public boolean interact() {
GameScene.show(new WndOptions("test", "dismiss this ward?", "yes", "no"){
GameScene.show(new WndOptions( Messages.get(this, "dismiss_title"),
Messages.get(this, "dismiss_body"),
Messages.get(this, "dismiss_confirm"),
Messages.get(this, "dismiss_cancel") ){
@Override
protected void onSelect(int index) {
if (index == 0){
@ -306,6 +334,11 @@ public class WandOfWarding extends Wand {
return true;
}
@Override
public String description() {
return Messages.get(this, "desc_" + tier, 2+wandLevel, 8 + 4*wandLevel );
}
private static final String TIER = "tier";
private static final String WAND_LEVEL = "wand_level";
private static final String TOTAL_ZAPS = "total_zaps";
@ -322,6 +355,7 @@ public class WandOfWarding extends Wand {
public void restoreFromBundle(Bundle bundle) {
super.restoreFromBundle(bundle);
tier = bundle.getInt(TIER);
name = Messages.get(this, "name_" + tier );
wandLevel = bundle.getInt(WAND_LEVEL);
totalZaps = bundle.getInt(TOTAL_ZAPS);
}

View File

@ -0,0 +1,35 @@
package com.shatteredpixel.shatteredpixeldungeon.sprites;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.watabou.noosa.TextureFilm;
public class EarthGuardianSprite extends MobSprite {
public EarthGuardianSprite() {
super();
texture( Assets.GUARDIAN );
TextureFilm frames = new TextureFilm( texture, 12, 15 );
idle = new Animation( 2, true );
idle.frames( frames, 0, 0, 0, 0, 0, 1, 1 );
run = new Animation( 15, true );
run.frames( frames, 2, 3, 4, 5, 6, 7 );
attack = new Animation( 12, false );
attack.frames( frames, 8, 9, 10 );
die = new Animation( 5, false );
die.frames( frames, 11, 12, 13, 14, 15, 15 );
play( idle );
}
@Override
public int blood() {
return 0xFFcdcdb7;
}
}

View File

@ -1148,6 +1148,11 @@ items.wands.wandofblastwave.ondeath=You killed yourself with your own Wand of Bl
items.wands.wandofblastwave.desc=This wand is made of a sort of marbled stone, with gold trim and a round black gem at the tip. It feels very weighty in your hand.
items.wands.wandofblastwave.stats_desc=This wand shoots a bolt which violently detonates at a target location. The force of this blast deals _%1$d-%2$d damage_ and is strong enough to send most enemies flying.
items.wands.wandofcorrosion.name=wand of corrosion
items.wands.wandofcorrosion.staff_name=staff of corrosion
items.wands.wandofcorrosion.desc=This wand has an ashen body which opens to a brilliant orange gem.
items.wands.wandofcorrosion.stats_desc=This wand shoots a bolt which explodes into a cloud of highly corrosive gas at a targeted location. Anything caught inside this cloud will take continual damage, increasing with time.
items.wands.wandofcorruption.name=wand of corruption
items.wands.wandofcorruption.staff_name=staff of corruption
items.wands.wandofcorruption.already_corrupted=That character cannot be influenced further.
@ -1177,12 +1182,12 @@ items.wands.wandoflightning.stats_desc=This wand sends powerful lightning arcing
items.wands.wandoflivingearth.name=wand of living earth
items.wands.wandoflivingearth.staff_name=staff of living earth
items.wands.wandoflivingearth.desc=TODO
items.wands.wandoflivingearth.stats_desc=TODO\n\ndeals _%1$d-%2$d damage._
items.wands.wandoflivingearth.desc=This wand is made from a curious rock, with bands of glowing yellow energy. The rocks seem to shift slightly as you grip the wand, as if they can feel your hand.
items.wands.wandoflivingearth.stats_desc=This wand sends bolts of magical rock at enemies, dealing _%1$d-%2$d damage._ The rocks will then re-form around the user, granting them armor in proportion to the damage dealt. If enough armor is built, it will form into a rock guardian when the wand is next zapped.
items.wands.wandoflivingearth$rockarmor.name=Rock Armor
items.wands.wandoflivingearth$rockarmor.desc=TODO\n\nArmor: %1$d\n\nNeeded for Guardian: %2$d
items.wands.wandoflivingearth$rockarmor.desc=Magical rocks are surrounding your body, when you are attacked they will attempt to block for you, and will reduce the damage you take by 50%%. Each damage blocked scrapes away some of the rock however.\n\nRemaining Armor: %1$d.\n\nIf enough rock is built around you, the next zap from your wand of living earth with cause the rocks to form up into a guardian which will fight with you.\n\nArmor needed for Guardian: %2$d.
items.wands.wandoflivingearth$earthguardian.name=earthen guardian
items.wands.wandoflivingearth$earthguardian.desc=TODO (probably want to give some basic stats)
items.wands.wandoflivingearth$earthguardian.desc=The rocks from your wand of living earth have formed into a protective earthen guardian! This rocky protector will attack nearby enemies, which will force them to focus the guardian instead of you. When all nearby threats are gone, the guardian will re-form around you, and will return when you next use your wand.\n\nThe guardian's defensive power is tied to the level of your wand. It currently blocks _%1$d-%2$d damage._
items.wands.wandofmagicmissile.name=wand of magic missile
items.wands.wandofmagicmissile.staff_name=staff of magic missile
@ -1210,12 +1215,28 @@ items.wands.wandoftransfusion.charged=Your staff is charged with the life energy
items.wands.wandoftransfusion.desc=A fairly plainly shaped wand, it stands out due to its magenta hue and pitch black gem at the tip.
items.wands.wandoftransfusion.stats_desc=When used on allies, this wand saps some of your own health to heal or shield them. When used on enemies, the wand briefly charms them while pulling a bit of energy back to you. Hostile undead will be damaged instead of charmed.
items.wands.wandofcorrosion.name=wand of corrosion
items.wands.wandofcorrosion.staff_name=staff of corrosion
items.wands.wandofcorrosion.desc=This wand has an ashen body which opens to a brilliant orange gem.
items.wands.wandofcorrosion.stats_desc=This wand shoots a bolt which explodes into a cloud of highly corrosive gas at a targeted location. Anything caught inside this cloud will take continual damage, increasing with time.
items.wands.wandofwarding.name=wand of warding
items.wands.wandofwarding.staff_name=staff of warding
items.wands.wandofwarding.no_more_wards=Your wand can't sustain any more wards.
items.wands.wandofwarding.bad_location=There isn't enough room to place a ward here.
items.wands.wandofwarding.desc=This short metal wand has a bright purple gem floating above its tip.
items.wands.wandofwarding.stats_desc=Rather than directly damaging an enemy, this wand will summon stationary wards and sentries. Note that wards require some empty space around where they are summoned, and the wand can only sustain so many wards or sentries at one time.
items.wands.wandofwarding$ward.name_1=lesser ward
items.wands.wandofwarding$ward.desc_1=This basic ward will automatically zap any enemy which comes into its range of vision, dealing _%1$d-%2$d damage._\n\nZapping this ward with your wand of warding will upgrade it.\n\nThis ward will only zap a single time before dissipating.
items.wands.wandofwarding$ward.name_2=ward
items.wands.wandofwarding$ward.desc_2=This upgraded ward has a more intricate pattern, and can attack multiple times. Each zap from this ward will deal _%1$d-%2$d damage._\n\nZapping this ward with your wand of warding will upgrade it.\n\nThis ward will zap two times before dissipating.
items.wands.wandofwarding$ward.name_3=greater ward
items.wands.wandofwarding$ward.desc_3=This fully upgraded ward is able to attack more times, and more quickly, than its predecessors. Each zap from this ward will deal _%1$d-%2$d damage._\n\nZapping this ward with your wand of warding will upgrade it.\n\nThis ward will zap four times before dissipating.
items.wands.wandofwarding$ward.name_4=lesser sentry
items.wands.wandofwarding$ward.desc_4=This smaller sentry has the same attack power as a greater ward, but isn't nearly as fragile. It resembles the gem at the tip of your wand of warding. Each zap from this sentry will deal _%1$d-%2$d damage._\n\nZapping this sentry with your wand of warding will upgrade and heal it.\n\nThis sentry will spend some health each time it zaps an enemy, but can be healed by using your wand of warding on it.
items.wands.wandofwarding$ward.name_5=sentry
items.wands.wandofwarding$ward.desc_5=This upgraded sentry is larger and able to attack more quickly than a lesser sentry. Each zap from this sentry will deal _%1$d-%2$d damage._\n\nZapping this sentry with your wand of warding will upgrade and heal it.\n\nThis sentry will spend some health each time it zaps an enemy, but can be healed by using your wand of warding on it.
items.wands.wandofwarding$ward.name_6=greater sentry
items.wands.wandofwarding$ward.desc_6=This fully upgraded sentry is significantly more durable than its predecessors. Each zap from this sentry will deal _%1$d-%2$d damage._\n\nZapping this sentry with your wand of warding will heal it.\n\nThis sentry will spend some health each time it zaps an enemy, but can be healed by using your wand of warding on it.
items.wands.wandofwarding$ward.dismiss_title=Dismiss this ward?
items.wands.wandofwarding$ward.dismiss_body=You can dispel this ward if you no longer want your wand to maintain it. Doing so immediately doing so immediately destroys the ward.\n\nDismiss this ward?
items.wands.wandofwarding$ward.dismiss_confirm=yes
items.wands.wandofwarding$ward.dismiss_cancel=no
###weapon curses
items.weapon.curses.annoying.name=annoying %s