v3.0.0: recall glyph now works with runestones

This commit is contained in:
Evan Debenham
2024-11-04 14:36:54 -05:00
parent d5bb26b840
commit 9dbaaa006f
10 changed files with 73 additions and 43 deletions
@@ -60,12 +60,12 @@ import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.HornOfPlenty;
import com.shatteredpixel.shatteredpixeldungeon.items.rings.Ring; import com.shatteredpixel.shatteredpixeldungeon.items.rings.Ring;
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.Scroll; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.Scroll;
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfRecharging; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfRecharging;
import com.shatteredpixel.shatteredpixeldungeon.items.stones.Runestone;
import com.shatteredpixel.shatteredpixeldungeon.items.trinkets.ShardOfOblivion; import com.shatteredpixel.shatteredpixeldungeon.items.trinkets.ShardOfOblivion;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.Wand; import com.shatteredpixel.shatteredpixeldungeon.items.wands.Wand;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.SpiritBow; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.SpiritBow;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.Weapon; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.Weapon;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.Gloves; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.Gloves;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.MagesStaff;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.MeleeWeapon; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.MeleeWeapon;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.MissileWeapon; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.MissileWeapon;
import com.shatteredpixel.shatteredpixeldungeon.levels.Level; import com.shatteredpixel.shatteredpixeldungeon.levels.Level;
@@ -707,18 +707,11 @@ public enum Talent {
} }
} }
public static void onUpgradeScrollUsed( Hero hero ){ public static void onRunestoneUsed( Hero hero, int pos, Class<?extends Item> cls ){
if (hero.hasTalent(INSCRIBED_POWER)){ if (hero.heroClass == HeroClass.CLERIC
if (hero.heroClass == HeroClass.MAGE) { && hero.hasTalent(RECALL_GLYPH)
MagesStaff staff = hero.belongings.getItem(MagesStaff.class); && Runestone.class.isAssignableFrom(cls)){
if (staff != null) { Buff.affect(hero, RecallGlyph.UsedGlyphTracker.class, hero.pointsInTalent(RECALL_GLYPH) == 2 ? 300 : 10).item = cls;
staff.gainCharge(2 + 2 * hero.pointsInTalent(INSCRIBED_POWER), true);
ScrollOfRecharging.charge(Dungeon.hero);
SpellSprite.show(hero, SpellSprite.CHARGE);
}
} else {
Buff.affect(hero, Recharging.class, 4 + 8 * hero.pointsInTalent(INSCRIBED_POWER));
}
} }
} }
@@ -32,6 +32,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfTransmutat
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.exotic.ExoticScroll; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.exotic.ExoticScroll;
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.exotic.ScrollOfEnchantment; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.exotic.ScrollOfEnchantment;
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.exotic.ScrollOfMetamorphosis; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.exotic.ScrollOfMetamorphosis;
import com.shatteredpixel.shatteredpixeldungeon.items.stones.InventoryStone;
import com.shatteredpixel.shatteredpixeldungeon.items.stones.Runestone; import com.shatteredpixel.shatteredpixeldungeon.items.stones.Runestone;
import com.shatteredpixel.shatteredpixeldungeon.items.stones.StoneOfAugmentation; import com.shatteredpixel.shatteredpixeldungeon.items.stones.StoneOfAugmentation;
import com.shatteredpixel.shatteredpixeldungeon.items.stones.StoneOfEnchantment; import com.shatteredpixel.shatteredpixeldungeon.items.stones.StoneOfEnchantment;
@@ -66,10 +67,16 @@ public class RecallGlyph extends ClericSpell {
item.setCurrent(hero); item.setCurrent(hero);
//TODO runestones
if (item instanceof Scroll){ if (item instanceof Scroll){
((Scroll) item).anonymize(); ((Scroll) item).anonymize();
((Scroll) item).doRead(); ((Scroll) item).doRead();
} else if (item instanceof Runestone){
((Runestone) item).anonymize();
if (item instanceof InventoryStone){
((InventoryStone) item).directActivate();
} else {
item.doThrow(hero);
}
} }
onSpellCast(tome, hero); onSpellCast(tome, hero);
@@ -61,6 +61,10 @@ public abstract class InventoryStone extends Runestone {
GameScene.selectItem( itemSelector ); GameScene.selectItem( itemSelector );
} }
public void directActivate(){
GameScene.selectItem( itemSelector );
}
protected void useAnimation() { protected void useAnimation() {
curUser.spend( 1f ); curUser.spend( 1f );
curUser.busy(); curUser.busy();
@@ -24,6 +24,7 @@ package com.shatteredpixel.shatteredpixeldungeon.items.stones;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor; import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Invisibility; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Invisibility;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent;
import com.shatteredpixel.shatteredpixeldungeon.items.Item; import com.shatteredpixel.shatteredpixeldungeon.items.Item;
import com.shatteredpixel.shatteredpixeldungeon.journal.Catalog; import com.shatteredpixel.shatteredpixeldungeon.journal.Catalog;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
@@ -35,14 +36,25 @@ public abstract class Runestone extends Item {
defaultAction = AC_THROW; defaultAction = AC_THROW;
} }
//anonymous stones don't count as consumed, do not drop, etc.
//useful for stones which are only spawned for their effects
protected boolean anonymous = false;
public void anonymize(){
image = ItemSpriteSheet.STONE_HOLDER;
anonymous = true;
}
@Override @Override
protected void onThrow(int cell) { protected void onThrow(int cell) {
///inventory stones are thrown like normal items, other stones don't trigger when thrown into pits ///inventory stones are thrown like normal items, other stones don't trigger when thrown into pits
if (this instanceof InventoryStone || if (this instanceof InventoryStone ||
(Dungeon.level.pit[cell] && Actor.findChar(cell) == null)){ (Dungeon.level.pit[cell] && Actor.findChar(cell) == null)){
super.onThrow( cell ); if (!anonymous) super.onThrow( cell );
} else { } else {
Catalog.countUse(getClass()); if (!anonymous) {
Catalog.countUse(getClass());
Talent.onRunestoneUsed(curUser, cell, getClass());
}
activate(cell); activate(cell);
if (Actor.findChar(cell) == null) Dungeon.level.pressCell( cell ); if (Actor.findChar(cell) == null) Dungeon.level.pressCell( cell );
Invisibility.dispel(); Invisibility.dispel();
@@ -30,7 +30,6 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.FlavourBuff;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter; import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter;
import com.shatteredpixel.shatteredpixeldungeon.effects.Speck; import com.shatteredpixel.shatteredpixeldungeon.effects.Speck;
import com.shatteredpixel.shatteredpixeldungeon.items.Heap;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
import com.shatteredpixel.shatteredpixeldungeon.ui.BuffIndicator; import com.shatteredpixel.shatteredpixeldungeon.ui.BuffIndicator;
import com.watabou.noosa.audio.Sample; import com.watabou.noosa.audio.Sample;
@@ -52,16 +51,11 @@ public class StoneOfAggression extends Runestone {
} else { } else {
Buff.prolong(ch, Aggression.class, Aggression.DURATION); Buff.prolong(ch, Aggression.class, Aggression.DURATION);
} }
CellEmitter.center(cell).start( Speck.factory( Speck.SCREAM ), 0.3f, 3 );
Sample.INSTANCE.play( Assets.Sounds.READ );
} else {
//Item.onThrow
Heap heap = Dungeon.level.drop( this, cell );
if (!heap.isEmpty()) {
heap.sprite.drop( cell );
}
} }
CellEmitter.center(cell).start( Speck.factory( Speck.SCREAM ), 0.3f, 3 );
Sample.INSTANCE.play( Assets.Sounds.READ );
} }
public static class Aggression extends FlavourBuff { public static class Aggression extends FlavourBuff {
@@ -22,6 +22,7 @@
package com.shatteredpixel.shatteredpixeldungeon.items.stones; package com.shatteredpixel.shatteredpixeldungeon.items.stones;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Belongings; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Belongings;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent;
import com.shatteredpixel.shatteredpixeldungeon.items.Item; import com.shatteredpixel.shatteredpixeldungeon.items.Item;
import com.shatteredpixel.shatteredpixeldungeon.items.armor.Armor; import com.shatteredpixel.shatteredpixeldungeon.items.armor.Armor;
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfUpgrade; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfUpgrade;
@@ -61,8 +62,11 @@ public class StoneOfAugmentation extends InventoryStone {
weapon.augment = augment; weapon.augment = augment;
useAnimation(); useAnimation();
ScrollOfUpgrade.upgrade(curUser); ScrollOfUpgrade.upgrade(curUser);
curItem.detach( curUser.belongings.backpack ); if (!anonymous) {
Catalog.countUse(getClass()); curItem.detach(curUser.belongings.backpack);
Catalog.countUse(getClass());
Talent.onRunestoneUsed(curUser, curUser.pos, getClass());
}
} }
public void apply( Armor armor, Armor.Augment augment ) { public void apply( Armor armor, Armor.Augment augment ) {
@@ -70,8 +74,11 @@ public class StoneOfAugmentation extends InventoryStone {
armor.augment = augment; armor.augment = augment;
useAnimation(); useAnimation();
ScrollOfUpgrade.upgrade(curUser); ScrollOfUpgrade.upgrade(curUser);
curItem.detach( curUser.belongings.backpack ); if (!anonymous) {
Catalog.countUse(getClass()); curItem.detach(curUser.belongings.backpack);
Catalog.countUse(getClass());
Talent.onRunestoneUsed(curUser, curUser.pos, getClass());
}
} }
@Override @Override
@@ -144,7 +151,7 @@ public class StoneOfAugmentation extends InventoryStone {
@Override @Override
protected void onClick() { protected void onClick() {
hide(); hide();
StoneOfAugmentation.this.collect(); if (!anonymous) StoneOfAugmentation.this.collect();
} }
}; };
btnCancel.setRect( MARGIN, pos + MARGIN, BUTTON_WIDTH, BUTTON_HEIGHT ); btnCancel.setRect( MARGIN, pos + MARGIN, BUTTON_WIDTH, BUTTON_HEIGHT );
@@ -155,7 +162,7 @@ public class StoneOfAugmentation extends InventoryStone {
@Override @Override
public void onBackPressed() { public void onBackPressed() {
StoneOfAugmentation.this.collect(); if (!anonymous) StoneOfAugmentation.this.collect();
super.onBackPressed(); super.onBackPressed();
} }
} }
@@ -53,7 +53,7 @@ public class StoneOfBlink extends Runestone {
@Override @Override
protected void activate(int cell) { protected void activate(int cell) {
if (!ScrollOfTeleportation.teleportToLocation(curUser, cell)){ if (!ScrollOfTeleportation.teleportToLocation(curUser, cell) && !anonymous){
Dungeon.level.drop(this, cell).sprite.drop(); Dungeon.level.drop(this, cell).sprite.drop();
} }
} }
@@ -22,6 +22,7 @@
package com.shatteredpixel.shatteredpixeldungeon.items.stones; package com.shatteredpixel.shatteredpixeldungeon.items.stones;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Belongings; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Belongings;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent;
import com.shatteredpixel.shatteredpixeldungeon.items.EquipableItem; import com.shatteredpixel.shatteredpixeldungeon.items.EquipableItem;
import com.shatteredpixel.shatteredpixeldungeon.items.Item; import com.shatteredpixel.shatteredpixeldungeon.items.Item;
import com.shatteredpixel.shatteredpixeldungeon.items.armor.Armor; import com.shatteredpixel.shatteredpixeldungeon.items.armor.Armor;
@@ -82,8 +83,11 @@ public class StoneOfDetectMagic extends InventoryStone {
GLog.w(Messages.get(this, "detected_bad")); GLog.w(Messages.get(this, "detected_bad"));
} }
curItem.detach( curUser.belongings.backpack ); if (!anonymous) {
Catalog.countUse(getClass()); curItem.detach(curUser.belongings.backpack);
Catalog.countUse(getClass());
Talent.onRunestoneUsed(curUser, curUser.pos, getClass());
}
} }
@@ -22,6 +22,7 @@
package com.shatteredpixel.shatteredpixeldungeon.items.stones; package com.shatteredpixel.shatteredpixeldungeon.items.stones;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Belongings; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Belongings;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent;
import com.shatteredpixel.shatteredpixeldungeon.effects.Enchanting; import com.shatteredpixel.shatteredpixeldungeon.effects.Enchanting;
import com.shatteredpixel.shatteredpixeldungeon.effects.Speck; import com.shatteredpixel.shatteredpixeldungeon.effects.Speck;
import com.shatteredpixel.shatteredpixeldungeon.items.Item; import com.shatteredpixel.shatteredpixeldungeon.items.Item;
@@ -49,8 +50,11 @@ public class StoneOfEnchantment extends InventoryStone {
@Override @Override
protected void onItemSelected(Item item) { protected void onItemSelected(Item item) {
curItem.detach( curUser.belongings.backpack ); if (!anonymous) {
Catalog.countUse(getClass()); curItem.detach(curUser.belongings.backpack);
Catalog.countUse(getClass());
Talent.onRunestoneUsed(curUser, curUser.pos, getClass());
}
if (item instanceof Weapon) { if (item instanceof Weapon) {
@@ -24,6 +24,7 @@ package com.shatteredpixel.shatteredpixeldungeon.items.stones;
import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent;
import com.shatteredpixel.shatteredpixeldungeon.effects.Identification; import com.shatteredpixel.shatteredpixeldungeon.effects.Identification;
import com.shatteredpixel.shatteredpixeldungeon.items.Item; import com.shatteredpixel.shatteredpixeldungeon.items.Item;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.Potion; import com.shatteredpixel.shatteredpixeldungeon.items.potions.Potion;
@@ -90,6 +91,7 @@ public class StoneOfIntuition extends InventoryStone {
private static Class curGuess = null; private static Class curGuess = null;
//TODO CLERIC! yikes...
public class WndGuess extends Window { public class WndGuess extends Window {
private static final int WIDTH = 120; private static final int WIDTH = 120;
@@ -114,7 +116,6 @@ public class StoneOfIntuition extends InventoryStone {
protected void onClick() { protected void onClick() {
super.onClick(); super.onClick();
useAnimation(); useAnimation();
Catalog.countUse(StoneOfIntuition.class);
if (item.getClass() == curGuess){ if (item.getClass() == curGuess){
if (item instanceof Ring){ if (item instanceof Ring){
((Ring) item).setKnown(); ((Ring) item).setKnown();
@@ -126,11 +127,15 @@ public class StoneOfIntuition extends InventoryStone {
} else { } else {
GLog.w( Messages.get(WndGuess.class, "incorrect") ); GLog.w( Messages.get(WndGuess.class, "incorrect") );
} }
if (curUser.buff(IntuitionUseTracker.class) == null){ if (!anonymous) {
Buff.affect(curUser, IntuitionUseTracker.class); Catalog.countUse(StoneOfIntuition.class);
} else { Talent.onRunestoneUsed(curUser, curUser.pos, StoneOfIntuition.class);
curItem.detach( curUser.belongings.backpack ); if (curUser.buff(IntuitionUseTracker.class) == null) {
curUser.buff(IntuitionUseTracker.class).detach(); Buff.affect(curUser, IntuitionUseTracker.class);
} else {
curItem.detach(curUser.belongings.backpack);
curUser.buff(IntuitionUseTracker.class).detach();
}
} }
curGuess = null; curGuess = null;
hide(); hide();