v0.9.3: implemented structure for selecting armor abilities

This commit is contained in:
Evan Debenham 2021-04-08 18:02:22 -04:00
parent 42b1bbc9a6
commit 27a3a37474
11 changed files with 156 additions and 39 deletions

View File

@ -333,12 +333,12 @@ actors.buffs.wellfed.desc=You feel quite satisfied and full.\n\nWhile well fed,
###hero ###hero
##abilities ##abilities
actors.hero.abilities.warrior.warrior1.name=test1 actors.hero.abilities.warrior.warrior1.name=heroic leap
actors.hero.abilities.warrior.warrior1.desc=test10 actors.hero.abilities.warrior.warrior1.desc=Allows the Warrior to perform a heroic leap towards a targeted location, slamming down to stun all neighbouring enemies.
actors.hero.abilities.warrior.warrior2.name=test2 actors.hero.abilities.warrior.warrior2.name=shockwave
actors.hero.abilities.warrior.warrior2.desc=test20 actors.hero.abilities.warrior.warrior2.desc=Allows the Warrior to slam the ground, disrupting all enemies in a cone AOE in front of him.
actors.hero.abilities.warrior.warrior3.name=test3 actors.hero.abilities.warrior.warrior3.name=???
actors.hero.abilities.warrior.warrior3.desc=test30 actors.hero.abilities.warrior.warrior3.desc=I haven't decided on this ability yet
actors.hero.hero.name=you actors.hero.hero.name=you
actors.hero.hero.leave=You can't leave yet, the rest of the dungeon awaits below! actors.hero.hero.leave=You can't leave yet, the rest of the dungeon awaits below!

View File

@ -2,8 +2,8 @@ ui.quickslotbutton.select_item=Quickslot an item
ui.talentspane.tier=tier %d ui.talentspane.tier=tier %d
ui.talentspane.unlock_tier2=Reach level 6 to unlock more talents. ui.talentspane.unlock_tier2=Reach level 6 to unlock more talents.
ui.talentspane.unlock_tier3=Reach level 12 and choose a subclass to unlock more talents. ui.talentspane.unlock_tier3=Reach level 12 and defeat the second boss to unlock more talents.
ui.talentspane.coming_soon=More talents coming soon! ui.talentspane.unlock_tier4=Reach level 20 and defeat the fourth boss to unlock more talents.
ui.toolbar.examine_prompt=Press again to search\nPress a tile to examine ui.toolbar.examine_prompt=Press again to search\nPress a tile to examine

View File

@ -4,6 +4,8 @@ windows.wndblacksmith.reforge=Reforge them
windows.wndchallenges.title=Challenges windows.wndchallenges.title=Challenges
windows.wndchooseability.message=The crown glows as it rests on your head, and both it and your armor become hot to the touch. You can feel the magic of the crown begin to act on your armor, but it must be directed. Which armor ability do you choose?
windows.wndchooseway.message=As the mask fits over your face, your eyesight fades and visions of new power flood into your mind. How will you direct the mask's power? windows.wndchooseway.message=As the mask fits over your face, your eyesight fades and visions of new power flood into your mind. How will you direct the mask's power?
windows.wndchooseway.cancel=I'll decide later windows.wndchooseway.cancel=I'll decide later

View File

@ -374,7 +374,7 @@ public enum Talent {
public static class SuckerPunchTracker extends Buff{}; public static class SuckerPunchTracker extends Buff{};
public static class FollowupStrikeTracker extends Buff{}; public static class FollowupStrikeTracker extends Buff{};
public static final int MAX_TALENT_TIERS = 3; public static final int MAX_TALENT_TIERS = 4;
public static void initClassTalents( Hero hero ){ public static void initClassTalents( Hero hero ){
initClassTalents( hero.heroClass, hero.talents ); initClassTalents( hero.heroClass, hero.talents );
@ -505,7 +505,13 @@ public enum Talent {
public static void initArmorTalents(ArmorAbility abil, ArrayList<LinkedHashMap<Talent, Integer>> talents ){ public static void initArmorTalents(ArmorAbility abil, ArrayList<LinkedHashMap<Talent, Integer>> talents ){
if (abil == null) return; if (abil == null) return;
//TODO while (talents.size() < MAX_TALENT_TIERS){
talents.add(new LinkedHashMap<>());
}
for (Talent t : abil.talents()){
talents.get(3).put(t, 0);
}
} }
private static final String TALENT_TIER = "talents_tier_"; private static final String TALENT_TIER = "talents_tier_";

View File

@ -21,6 +21,7 @@
package com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities; package com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.watabou.utils.Bundlable; import com.watabou.utils.Bundlable;
import com.watabou.utils.Bundle; import com.watabou.utils.Bundle;
@ -37,6 +38,8 @@ public abstract class ArmorAbility implements Bundlable {
return Messages.get(this, "desc"); return Messages.get(this, "desc");
} }
public abstract Talent[] talents();
@Override @Override
public void storeInBundle(Bundle bundle) { public void storeInBundle(Bundle bundle) {
} }

View File

@ -21,8 +21,13 @@
package com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.warrior; package com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.warrior;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.ArmorAbility; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.ArmorAbility;
public class Warrior1 extends ArmorAbility { public class Warrior1 extends ArmorAbility {
@Override
public Talent[] talents() {
return new Talent[]{Talent.HEARTY_MEAL, Talent.ARMSMASTERS_INTUITION, Talent.TEST_SUBJECT, Talent.IRON_WILL};
}
} }

View File

@ -21,7 +21,13 @@
package com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.warrior; package com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.warrior;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.ArmorAbility; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.ArmorAbility;
public class Warrior2 extends ArmorAbility { public class Warrior2 extends ArmorAbility {
@Override
public Talent[] talents() {
return new Talent[]{Talent.EMPOWERING_MEAL, Talent.SCHOLARS_INTUITION, Talent.TESTED_HYPOTHESIS, Talent.BACKUP_BARRIER};
}
} }

View File

@ -21,7 +21,13 @@
package com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.warrior; package com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.warrior;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.ArmorAbility; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.ArmorAbility;
public class Warrior3 extends ArmorAbility { public class Warrior3 extends ArmorAbility {
@Override
public Talent[] talents() {
return new Talent[]{Talent.HEARTY_MEAL, Talent.HEARTY_MEAL, Talent.HEARTY_MEAL, Talent.HEARTY_MEAL};
}
} }

View File

@ -24,14 +24,17 @@ package com.shatteredpixel.shatteredpixeldungeon.items;
import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor; import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.ArmorAbility;
import com.shatteredpixel.shatteredpixeldungeon.effects.Speck; import com.shatteredpixel.shatteredpixeldungeon.effects.Speck;
import com.shatteredpixel.shatteredpixeldungeon.items.armor.Armor; import com.shatteredpixel.shatteredpixeldungeon.items.armor.Armor;
import com.shatteredpixel.shatteredpixeldungeon.items.armor.ClassArmor; import com.shatteredpixel.shatteredpixeldungeon.items.armor.ClassArmor;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
import com.shatteredpixel.shatteredpixeldungeon.sprites.HeroSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.HeroSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
import com.shatteredpixel.shatteredpixeldungeon.windows.WndBag; import com.shatteredpixel.shatteredpixeldungeon.windows.WndChooseAbility;
import com.watabou.noosa.audio.Sample; import com.watabou.noosa.audio.Sample;
import java.util.ArrayList; import java.util.ArrayList;
@ -62,7 +65,7 @@ public class KingsCrown extends Item {
curUser = hero; curUser = hero;
if (hero.belongings.armor != null){ if (hero.belongings.armor != null){
upgrade(hero.belongings.armor); GameScene.show( new WndChooseAbility(this, hero.belongings.armor, hero));
} else { } else {
GLog.w( Messages.get(this, "naked")); GLog.w( Messages.get(this, "naked"));
} }
@ -80,19 +83,19 @@ public class KingsCrown extends Item {
return true; return true;
} }
private void upgrade( Armor armor ) { public void upgradeArmor(Hero hero, Armor armor, ArmorAbility ability) {
detach( curUser.belongings.backpack ); detach( hero.belongings.backpack );
curUser.sprite.centerEmitter().start( Speck.factory( Speck.KIT ), 0.05f, 10 ); hero.sprite.centerEmitter().start( Speck.factory( Speck.KIT ), 0.05f, 10 );
//TODO add a spell icon? //TODO add a spell icon?
curUser.spend( Actor.TICK ); hero.spend( Actor.TICK );
curUser.busy(); hero.busy();
GLog.p( Messages.get(this, "upgraded")); GLog.p( Messages.get(this, "upgraded"));
ClassArmor classArmor = ClassArmor.upgrade( curUser, armor ); ClassArmor classArmor = ClassArmor.upgrade( hero, armor );
if (curUser.belongings.armor == armor) { if (hero.belongings.armor == armor) {
curUser.belongings.armor = classArmor; curUser.belongings.armor = classArmor;
((HeroSprite)curUser.sprite).updateArmor(); ((HeroSprite)curUser.sprite).updateArmor();
@ -104,17 +107,11 @@ public class KingsCrown extends Item {
classArmor.collect( curUser.belongings.backpack ); classArmor.collect( curUser.belongings.backpack );
} }
hero.armorAbility = ability;
Talent.initArmorTalents(hero);
curUser.sprite.operate( curUser.pos ); curUser.sprite.operate( curUser.pos );
Sample.INSTANCE.play( Assets.Sounds.MASTERY ); Sample.INSTANCE.play( Assets.Sounds.MASTERY );
} }
private final WndBag.Listener itemSelector = new WndBag.Listener() {
@Override
public void onSelect( Item item ) {
if (item != null) {
KingsCrown.this.upgrade( (Armor)item );
}
}
};
} }

View File

@ -70,6 +70,8 @@ public class TalentsPane extends ScrollPane {
} }
if (tiersAvailable > 2 && Dungeon.hero.subClass == HeroSubClass.NONE){ if (tiersAvailable > 2 && Dungeon.hero.subClass == HeroSubClass.NONE){
tiersAvailable = 2; tiersAvailable = 2;
} else if (tiersAvailable > 3 && Dungeon.hero.armorAbility == null){
tiersAvailable = 3;
} }
} }
@ -95,12 +97,16 @@ public class TalentsPane extends ScrollPane {
if (tiersAvailable == 1) { if (tiersAvailable == 1) {
blockText = PixelScene.renderTextBlock(Messages.get(this, "unlock_tier2"), 6); blockText = PixelScene.renderTextBlock(Messages.get(this, "unlock_tier2"), 6);
content.add(blockText);
} else if (tiersAvailable == 2) { } else if (tiersAvailable == 2) {
blockText = PixelScene.renderTextBlock(Messages.get(this, "unlock_tier3"), 6); blockText = PixelScene.renderTextBlock(Messages.get(this, "unlock_tier3"), 6);
content.add(blockText);
} else if (tiersAvailable == 3) {
blockText = PixelScene.renderTextBlock(Messages.get(this, "unlock_tier4"), 6);
content.add(blockText);
} else { } else {
blockText = PixelScene.renderTextBlock(Messages.get(this, "coming_soon"), 6); blockText = null;
} }
content.add(blockText);
} }
@Override @Override
@ -121,15 +127,22 @@ public class TalentsPane extends ScrollPane {
} }
float bottom = Math.max(height, top + 20); float bottom;
if (blockText != null) {
bottom = Math.max(height, top + 20);
blocker.x = 0; blocker.x = 0;
blocker.y = top; blocker.y = top;
blocker.size(width, bottom - top); blocker.size(width, bottom - top);
blockText.maxWidth((int)width); blockText.maxWidth((int) width);
blockText.align(RenderedTextBlock.CENTER_ALIGN); blockText.align(RenderedTextBlock.CENTER_ALIGN);
blockText.setPos((width - blockText.width())/2f, blocker.y + (bottom - blocker.y - blockText.height())/2); blockText.setPos((width - blockText.width()) / 2f, blocker.y + (bottom - blocker.y - blockText.height()) / 2);
} else {
bottom = Math.max(height, top);
blocker.visible = false;
}
content.setSize(width, bottom); content.setSize(width, bottom);
} }

View File

@ -0,0 +1,79 @@
/*
* Pixel Dungeon
* Copyright (C) 2012-2015 Oleg Dolya
*
* Shattered Pixel Dungeon
* Copyright (C) 2014-2021 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.windows;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.ArmorAbility;
import com.shatteredpixel.shatteredpixeldungeon.items.KingsCrown;
import com.shatteredpixel.shatteredpixeldungeon.items.armor.Armor;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.scenes.PixelScene;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSprite;
import com.shatteredpixel.shatteredpixeldungeon.ui.RedButton;
import com.shatteredpixel.shatteredpixeldungeon.ui.RenderedTextBlock;
import com.shatteredpixel.shatteredpixeldungeon.ui.Window;
public class WndChooseAbility extends Window {
private static final int WIDTH = 120;
private static final float GAP = 2;
public WndChooseAbility(final KingsCrown crown, final Armor armor, final Hero hero){
super();
IconTitle titlebar = new IconTitle();
titlebar.icon( new ItemSprite( crown.image(), null ) );
titlebar.label( crown.name() );
titlebar.setRect( 0, 0, WIDTH, 0 );
add( titlebar );
RenderedTextBlock body = PixelScene.renderTextBlock( 6 );
body.text( Messages.get(this, "message"), WIDTH );
body.setPos( titlebar.left(), titlebar.bottom() + GAP );
add( body );
float pos = body.bottom() + 3*GAP;
for (ArmorAbility ability : hero.heroClass.armorAbilities()) {
RedButton abilityButton = new RedButton("_" + Messages.titleCase(ability.name()) + ":_ " + ability.desc(), 6){
@Override
protected void onClick() {
super.onClick();
hide();
crown.upgradeArmor(hero, armor, ability);
}
};
abilityButton.leftJustify = true;
abilityButton.multiline = true;
abilityButton.setSize(WIDTH, abilityButton.reqHeight()+2);
abilityButton.setRect(0, pos, WIDTH, abilityButton.reqHeight()+2);
add(abilityButton);
pos = abilityButton.bottom() + GAP;
}
resize(WIDTH, (int)pos);
}
}