v1.1.0: reworked potion of holy furor into potion of divine inspiration

This commit is contained in:
Evan Debenham 2021-11-09 15:17:12 -05:00
parent ae082455c7
commit f28c15b842
11 changed files with 228 additions and 59 deletions

View File

@ -734,8 +734,11 @@ items.potions.exotic.potionofdragonsbreath.desc=This flask contains an unusual c
items.potions.exotic.potionofearthenarmor.name=potion of earthen armor
items.potions.exotic.potionofearthenarmor.desc=Rather than paralyze, this liquid has a hardening effect on the skin which will turn it into temporary natural armor.
items.potions.exotic.potionofholyfuror.name=potion of holy furor
items.potions.exotic.potionofholyfuror.desc=The power of holy energy reduced to liquid form, this draught will bless you for an extended period of time.
items.potions.exotic.potionofdivineinspiration.name=potion of divine inspiration
items.potions.exotic.potionofdivineinspiration.no_more_points=You can't gain any more bonus talent points.
items.potions.exotic.potionofdivineinspiration.select_tier=Select a talent tier to gain two bonus points in. You must have unlocked the tier to be able to spend the points.
items.potions.exotic.potionofdivineinspiration.bonus=+2 Talent Points!
items.potions.exotic.potionofdivineinspiration.desc=The power of holy energy reduced to liquid form, this draught will imbue the drinker with divine power, granting them two bonus talent points in a tier of their choosing.\n\nThis potion can only be used once for each talent tier.
items.potions.exotic.potionofmagicalsight.name=potion of magical sight
items.potions.exotic.potionofmagicalsight.desc=After drinking this, your senses will be briefly heightened to incredible levels, increasing your vision range and allowing you to see through walls!

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@ -55,6 +55,9 @@ public class ShatteredPixelDungeon extends Game {
com.watabou.utils.Bundle.addAlias(
com.shatteredpixel.shatteredpixeldungeon.items.scrolls.exotic.ScrollOfChallenge.class,
"com.shatteredpixel.shatteredpixeldungeon.items.scrolls.exotic.ScrollOfConfusion" );
com.watabou.utils.Bundle.addAlias(
com.shatteredpixel.shatteredpixeldungeon.items.potions.exotic.PotionOfDivineInspiration.class,
"com.shatteredpixel.shatteredpixeldungeon.items.potions.exotic.PotionOfHolyFuror" );
//v1.0.0
com.watabou.utils.Bundle.addAlias(

View File

@ -92,6 +92,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.potions.Potion;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfExperience;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfHealing;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.elixirs.ElixirOfMight;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.exotic.PotionOfDivineInspiration;
import com.shatteredpixel.shatteredpixeldungeon.items.rings.RingOfAccuracy;
import com.shatteredpixel.shatteredpixeldungeon.items.rings.RingOfEvasion;
import com.shatteredpixel.shatteredpixeldungeon.items.rings.RingOfForce;
@ -343,14 +344,27 @@ public class Hero extends Char {
}
public int talentPointsAvailable(int tier){
if (lvl < Talent.tierLevelThresholds[tier]
if (lvl < (Talent.tierLevelThresholds[tier] - 1)
|| (tier == 3 && subClass == HeroSubClass.NONE)
|| (tier == 4 && armorAbility == null)) {
return 0;
} else if (lvl >= Talent.tierLevelThresholds[tier+1]){
return Talent.tierLevelThresholds[tier+1] - Talent.tierLevelThresholds[tier] - talentPointsSpent(tier);
return Talent.tierLevelThresholds[tier+1] - Talent.tierLevelThresholds[tier] - talentPointsSpent(tier) + bonusTalentPoints(tier);
} else {
return 1 + lvl - Talent.tierLevelThresholds[tier] - talentPointsSpent(tier);
return 1 + lvl - Talent.tierLevelThresholds[tier] - talentPointsSpent(tier) + bonusTalentPoints(tier);
}
}
public int bonusTalentPoints(int tier){
if (lvl < (Talent.tierLevelThresholds[tier]-1)
|| (tier == 3 && subClass == HeroSubClass.NONE)
|| (tier == 4 && armorAbility == null)) {
return 0;
} else if (buff(PotionOfDivineInspiration.DivineInspirationTracker.class) != null
&& buff(PotionOfDivineInspiration.DivineInspirationTracker.class).isBoosted(tier)) {
return 2;
} else {
return 0;
}
}

View File

@ -79,8 +79,8 @@ public class ExoticPotion extends Potion {
regToExo.put(PotionOfLevitation.class, PotionOfStormClouds.class);
exoToReg.put(PotionOfStormClouds.class, PotionOfLevitation.class);
regToExo.put(PotionOfExperience.class, PotionOfHolyFuror.class);
exoToReg.put(PotionOfHolyFuror.class, PotionOfExperience.class);
regToExo.put(PotionOfExperience.class, PotionOfDivineInspiration.class);
exoToReg.put(PotionOfDivineInspiration.class, PotionOfExperience.class);
regToExo.put(PotionOfPurity.class, PotionOfCleansing.class);
exoToReg.put(PotionOfCleansing.class, PotionOfPurity.class);

View File

@ -0,0 +1,171 @@
/*
* 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.items.potions.exotic;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
import com.shatteredpixel.shatteredpixeldungeon.ui.StatusPane;
import com.shatteredpixel.shatteredpixeldungeon.ui.TalentsPane;
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
import com.shatteredpixel.shatteredpixeldungeon.windows.WndHero;
import com.shatteredpixel.shatteredpixeldungeon.windows.WndOptions;
import com.watabou.noosa.audio.Sample;
import com.watabou.utils.Bundle;
public class PotionOfDivineInspiration extends ExoticPotion {
{
icon = ItemSpriteSheet.Icons.POTION_DIVINE;
}
@Override
//need to override drink so that time isn't spent right away
protected void drink(final Hero hero) {
curUser = hero;
curItem = this;
boolean[] enabled = new boolean[5];
enabled[1] = enabled[2] = enabled[3] = enabled[4] = true;
DivineInspirationTracker tracker = hero.buff(DivineInspirationTracker.class);
if (tracker != null){
boolean allBoosted = true;
for (int i = 1; i <= 4; i++){
if (tracker.isBoosted(i)){
enabled[i] = false;
} else {
allBoosted = false;
}
}
if (allBoosted){
GLog.w(Messages.get(this, "no_more_bonus"));
return;
}
}
if (!isIdentified()) {
curItem.detach(curUser.belongings.backpack);
}
GameScene.show(new WndOptions(
new ItemSprite(this),
Messages.titleCase(trueName()),
Messages.get(PotionOfDivineInspiration.class, "select_tier"),
Messages.titleCase(Messages.get(TalentsPane.class, "tier", 1)),
Messages.titleCase(Messages.get(TalentsPane.class, "tier", 2)),
Messages.titleCase(Messages.get(TalentsPane.class, "tier", 3)),
Messages.titleCase(Messages.get(TalentsPane.class, "tier", 4))
){
@Override
protected boolean enabled(int index) {
return enabled[index+1];
}
@Override
protected void onSelect(int index) {
super.onSelect(index);
if (index != -1){
Buff.affect(curUser, DivineInspirationTracker.class).setBoosted(index+1);
if (isIdentified()) {
curItem.detach(curUser.belongings.backpack);
}
identify();
curUser.busy();
curUser.sprite.operate(curUser.pos);
curUser.spendAndNext(1f);
boolean unspentTalents = false;
for (int i = 1; i <= Dungeon.hero.talents.size(); i++){
if (Dungeon.hero.talentPointsAvailable(i) > 0){
unspentTalents = true;
break;
}
}
if (unspentTalents){
StatusPane.talentBlink = 10f;
WndHero.lastIdx = 1;
}
GameScene.showlevelUpStars();
Sample.INSTANCE.play( Assets.Sounds.DRINK );
Sample.INSTANCE.playDelayed(Assets.Sounds.LEVELUP, 0.3f, 0.7f, 1.2f);
Sample.INSTANCE.playDelayed(Assets.Sounds.LEVELUP, 0.6f, 0.7f, 1.2f);
GLog.p(Messages.get(PotionOfDivineInspiration.class, "bonus"));
}
}
@Override
public void onBackPressed() {
//do nothing, prevents accidentally closing
}
});
}
public static class DivineInspirationTracker extends Buff {
{
type = buffType.POSITIVE;
revivePersists = true;
}
private boolean[] boostedTiers = new boolean[5];
private static final String BOOSTED_TIERS = "boosted_tiers";
@Override
public void storeInBundle(Bundle bundle) {
super.storeInBundle(bundle);
bundle.put(BOOSTED_TIERS, boostedTiers);
}
@Override
public void restoreFromBundle(Bundle bundle) {
super.restoreFromBundle(bundle);
boostedTiers = bundle.getBooleanArray(BOOSTED_TIERS);
}
public void setBoosted( int tier ){
boostedTiers[tier] = true;
}
public boolean isBoosted( int tier ){
return boostedTiers[tier];
}
}
}

View File

@ -1,41 +0,0 @@
/*
* 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.items.potions.exotic;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Bless;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
public class PotionOfHolyFuror extends ExoticPotion {
{
icon = ItemSpriteSheet.Icons.POTION_HOLYFUROR;
}
@Override
public void apply( Hero hero ) {
identify();
Buff.prolong(hero, Bless.class, Bless.DURATION*4f);
}
}

View File

@ -964,6 +964,10 @@ public class GameScene extends PixelScene {
if (scene != null) scene.pane.flashForPage( page );
}
public static void showlevelUpStars(){
if (scene != null) scene.pane.showStarParticles();
}
public static void updateKeyDisplay(){
if (scene != null) scene.pane.updateKeys();
}

View File

@ -792,7 +792,7 @@ public class ItemSpriteSheet {
assignIconRect( SCROLL_CHALLENGE, 7, 7 );
assignIconRect( SCROLL_PSIBLAST, 5, 6 );
assignIconRect( SCROLL_DREAD, 5, 7 );
assignIconRect( SCROLL_POLYMORPH, 7, 6 );
assignIconRect( SCROLL_POLYMORPH, 7, 7 );
}
//16 free slots
@ -837,7 +837,7 @@ public class ItemSpriteSheet {
public static final int POTION_STRMCLOUD= EXOTIC_POTIONS+8;
public static final int POTION_EARTHARMR= EXOTIC_POTIONS+9;
public static final int POTION_CLEANSE = EXOTIC_POTIONS+10;
public static final int POTION_HOLYFUROR= EXOTIC_POTIONS+11;
public static final int POTION_DIVINE = EXOTIC_POTIONS+11;
static {
assignIconRect( POTION_ARENSURGE, 7, 7 );
assignIconRect( POTION_SHIELDING, 6, 6 );
@ -850,7 +850,7 @@ public class ItemSpriteSheet {
assignIconRect( POTION_STRMCLOUD, 7, 7 );
assignIconRect( POTION_EARTHARMR, 6, 6 );
assignIconRect( POTION_CLEANSE, 7, 7 );
assignIconRect( POTION_HOLYFUROR, 5, 7 );
assignIconRect( POTION_DIVINE, 7, 7 );
}
//16 free slots

View File

@ -241,10 +241,7 @@ public class StatusPane extends Component {
if (Dungeon.hero.lvl != lastLvl) {
if (lastLvl != -1) {
Emitter emitter = (Emitter)recycle( Emitter.class );
emitter.revive();
emitter.pos( 27, 27 );
emitter.burst( Speck.factory( Speck.STAR ), 12 );
showStarParticles();
}
lastLvl = Dungeon.hero.lvl;
@ -262,6 +259,13 @@ public class StatusPane extends Component {
}
}
public void showStarParticles(){
Emitter emitter = (Emitter)recycle( Emitter.class );
emitter.revive();
emitter.pos( 27, 27 );
emitter.burst( Speck.factory( Speck.STAR ), 12 );
}
public void pickup( Item item, int cell) {
pickedUp.reset( item,
cell,

View File

@ -193,7 +193,7 @@ public class TalentsPane extends ScrollPane {
stars.clear();
}
int totStars = Talent.tierLevelThresholds[tier+1] - Talent.tierLevelThresholds[tier];
int totStars = Talent.tierLevelThresholds[tier+1] - Talent.tierLevelThresholds[tier] + Dungeon.hero.bonusTalentPoints(tier);
int openStars = Dungeon.hero.talentPointsAvailable(tier);
int usedStars = Dungeon.hero.talentPointsSpent(tier);
for (int i = 0; i < totStars; i++){
@ -212,16 +212,27 @@ public class TalentsPane extends ScrollPane {
protected void layout() {
super.layout();
int regStars = Talent.tierLevelThresholds[tier+1] - Talent.tierLevelThresholds[tier];
float titleWidth = title.width();
titleWidth += 2 + stars.size()*6;
titleWidth += 2 + Math.min(stars.size(), regStars)*6;
title.setPos(x + (width - titleWidth)/2f, y);
float left = title.right() + 2;
float starTop = title.top();
if (regStars < stars.size()) starTop -= 2;
for (Image star : stars){
star.x = left;
star.y = title.top();
star.y = starTop;
PixelScene.align(star);
left += 6;
regStars--;
if (regStars == 0){
starTop += 6;
left = title.right() + 2;
}
}
float gap = (width - buttons.size()*TalentButton.WIDTH)/(buttons.size()+1);