v0.9.2: added visible buffs to several new talents

This commit is contained in:
Evan Debenham 2021-02-14 13:56:07 -05:00
parent 071cc236e9
commit 6433c6200f
13 changed files with 331 additions and 51 deletions

View File

@ -149,6 +149,9 @@ actors.buffs.drowsy.desc=A magical force is making it difficult to stay awake.\n
actors.buffs.earthimbue.name=Imbued with Earth
actors.buffs.earthimbue.desc=You are imbued with the power of earth!\n\nAll physical attacks will shift the earth under the enemy, crippling them for a short time.\n\nTurns of earth imbue remaining: %s.
actors.buffs.enhancedrings.name=Enhanced Rings
actors.buffs.enhancedrings.desc=The Rogue's recently used artifact is empowering his rings. Granting them +1 upgrade for %d more turns.
actors.buffs.fireimbue.name=Imbued with Fire
actors.buffs.fireimbue.desc=You are imbued with the power of fire!\n\nAll physical attacks will have a chance to light enemies ablaze. Additionally, you are completely immune to the effects of fire.\n\nTurns of fire imbue remaining: %s.
@ -179,6 +182,9 @@ actors.buffs.hex.name=Hexed
actors.buffs.hex.heromsg=You have been hexed!
actors.buffs.hex.desc=Dark magic which saps focus, making the target slightly disoriented.\n\nHexing reduces accuracy and evasion by 20%%, making the target less effective in combat.\n\nTurns of hex remaining: %s.
actors.buffs.holdfast.name=Hold Fast
actors.buffs.holdfast.desc=The Warrior is holding his position, increasing his armor by 0-%d. This will last until he moves.
actors.buffs.hunger.hungry=Hungry
actors.buffs.hunger.starving=Starving
actors.buffs.hunger.onhungry=You are hungry.
@ -265,10 +271,19 @@ actors.buffs.prismaticguard.desc=You are being guarded by a prismatic image whic
actors.buffs.recharging.name=Recharging
actors.buffs.recharging.desc=Energy is coursing through you, improving the rate that your wands and staffs charge.\n\nEach turn this buff will increase current charge by one quarter, in addition to regular recharge.\n\nTurns of recharging remaining: %s.
actors.buffs.revealedarea.name=Revealed Area
actors.buffs.revealedarea.desc=An area of the dungeon has been temporarily revealed to the hero, They will see it no matter where they are.\n\nTurns remaining: %s.
actors.buffs.revealedchar.name=Revealed
actors.buffs.revealedchar.desc=This character is revealed to the hero, They will be visible no matter where they are.\n\nTurns remaining: %s.
actors.buffs.roots.name=Rooted
actors.buffs.roots.heromsg=You can't move!
actors.buffs.roots.desc=Roots (magical or natural) grab at the feet, forcing them down to the ground.\n\nRoots lock a target in place, making it impossible for them to move, but other actions are not affected.\n\nTurns of root remaining: %s.
actors.buffs.scrollempower.name=Scroll Empower
actors.buffs.scrollempower.desc=The energy from the Mage's recently read scroll is empowering his wands! His next wand zap within %1$d turns will gain +%2$d levels.
actors.buffs.shadows.name=Shadowmelded
actors.buffs.shadows.desc=You are blended into the shadows around you, granting you invisibility and slowing your metabolism.\n\nWhile you are invisible enemies are unable to attack or follow you. Most physical attacks and magical effects (such as scrolls and wands) will immediately cancel invisibility. Additionally, while shadowmelded, your rate of hunger is slowed.\n\nYou will remain shadowmelded until you leave the shadows or an enemy comes into contact with you.

View File

@ -27,6 +27,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Amok;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Awareness;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Light;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.MindVision;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.RevealedArea;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
@ -769,12 +770,12 @@ public class Dungeon {
GameScene.updateFog(h.pos, 2);
}
Talent.SeerShotTracker seerShot = hero.buff(Talent.SeerShotTracker.class);
if (seerShot != null && seerShot.depth == Dungeon.depth){
BArray.or( level.visited, level.heroFOV, seerShot.pos - 1 - level.width(), 3, level.visited );
BArray.or( level.visited, level.heroFOV, seerShot.pos - 1, 3, level.visited );
BArray.or( level.visited, level.heroFOV, seerShot.pos - 1 + level.width(), 3, level.visited );
GameScene.updateFog(seerShot.pos, 2);
for (RevealedArea a : hero.buffs(RevealedArea.class)){
if (Dungeon.depth != a.depth) continue;
BArray.or( level.visited, level.heroFOV, a.pos - 1 - level.width(), 3, level.visited );
BArray.or( level.visited, level.heroFOV, a.pos - 1, 3, level.visited );
BArray.or( level.visited, level.heroFOV, a.pos - 1 + level.width(), 3, level.visited );
GameScene.updateFog(a.pos, 2);
}
GameScene.afterObserve();

View File

@ -0,0 +1,61 @@
/*
* 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.actors.buffs;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.ui.BuffIndicator;
import com.watabou.noosa.Image;
public class EnhancedRings extends FlavourBuff{
{
type = Buff.buffType.POSITIVE;
}
@Override
public int icon() {
return BuffIndicator.UPGRADE;
}
@Override
public void tintIcon(Image icon) {
icon.hardlight(0, 1, 0);
}
@Override
public float iconFadePercent() {
float max = 5*Dungeon.hero.pointsInTalent(Talent.ENHANCED_RINGS);
return Math.max(0, (max-visualcooldown()) / max);
}
@Override
public String toString() {
return Messages.get(this, "name");
}
@Override
public String desc() {
return Messages.get(this, "desc", (int)visualcooldown());
}
}

View File

@ -0,0 +1,70 @@
/*
* 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.actors.buffs;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.ui.BuffIndicator;
import com.watabou.noosa.Image;
public class HoldFast extends Buff {
{
type = buffType.POSITIVE;
}
public int pos = -1;
@Override
public boolean act() {
if (pos == -1) pos = target.pos;
if (pos != target.pos) {
detach();
} else {
spend(TICK);
}
return true;
}
@Override
public int icon() {
return BuffIndicator.ARMOR;
}
@Override
public void tintIcon(Image icon) {
icon.hardlight(1.9f, 2.4f, 3.25f);
}
@Override
public String toString() {
return Messages.get(this, "name");
}
@Override
public String desc() {
return Messages.get(this, "desc", 2*Dungeon.hero.pointsInTalent(Talent.HOLD_FAST));
}
}

View File

@ -0,0 +1,88 @@
/*
* 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.actors.buffs;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
import com.shatteredpixel.shatteredpixeldungeon.ui.BuffIndicator;
import com.watabou.noosa.Image;
import com.watabou.utils.Bundle;
public class RevealedArea extends FlavourBuff{
{
type = Buff.buffType.POSITIVE;
}
public int pos, depth;
@Override
public void detach() {
GameScene.updateFog(pos, 2);
super.detach();
}
@Override
public int icon() {
return BuffIndicator.MIND_VISION;
}
@Override
public void tintIcon(Image icon) {
icon.hardlight(0, 1, 1);
}
@Override
public float iconFadePercent() {
float max = 5*Dungeon.hero.pointsInTalent(Talent.SEER_SHOT);
return Math.max(0, (max-visualcooldown()) / max);
}
@Override
public String toString() {
return Messages.get(this, "name");
}
@Override
public String desc() {
return Messages.get(this, "desc", (int)visualcooldown());
}
private static final String DEPTH = "depth";
private static final String POS = "pos";
@Override
public void storeInBundle(Bundle bundle) {
super.storeInBundle(bundle);
bundle.put(DEPTH, depth);
bundle.put(POS, pos);
}
@Override
public void restoreFromBundle(Bundle bundle) {
super.restoreFromBundle(bundle);
depth = bundle.getInt(DEPTH);
pos = bundle.getInt(POS);
}
}

View File

@ -0,0 +1,68 @@
/*
* 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.actors.buffs;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent;
import com.shatteredpixel.shatteredpixeldungeon.items.Item;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.ui.BuffIndicator;
import com.watabou.noosa.Image;
public class ScrollEmpower extends FlavourBuff {
{
type = buffType.POSITIVE;
}
@Override
public void detach() {
super.detach();
Item.updateQuickslot();
}
@Override
public int icon() {
return BuffIndicator.UPGRADE;
}
@Override
public void tintIcon(Image icon) {
icon.hardlight(1, 1, 0);
}
@Override
public float iconFadePercent() {
return Math.max(0, (10-visualcooldown()) / 10f);
}
@Override
public String toString() {
return Messages.get(this, "name");
}
@Override
public String desc() {
return Messages.get(this, "desc", (int)visualcooldown(), Dungeon.hero.pointsInTalent(Talent.EMPOWERING_SCROLLS));
}
}

View File

@ -43,6 +43,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Combo;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Drowsy;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Foresight;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Fury;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.HoldFast;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Hunger;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Invisibility;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.MindVision;
@ -471,7 +472,7 @@ public class Hero extends Char {
Blocking.BlockBuff block = buff(Blocking.BlockBuff.class);
if (block != null) dr += block.blockingRoll();
if (buff(Talent.HoldFastTracker.class) != null){
if (buff(HoldFast.class) != null){
dr += Random.NormalIntRange(0, 2*pointsInTalent(Talent.HOLD_FAST));
}
@ -1067,7 +1068,7 @@ public class Hero extends Char {
spendAndNext( TIME_TO_REST );
if (!fullRest) {
if (hasTalent(Talent.HOLD_FAST)){
Buff.affect(this, Talent.HoldFastTracker.class);
Buff.affect(this, HoldFast.class);
}
if (sprite != null) {
sprite.showStatus(CharSprite.DEFAULT, Messages.get(this, "wait"));

View File

@ -28,6 +28,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ArtifactRecharge;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.CounterBuff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.EnhancedRings;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.FlavourBuff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Haste;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Recharging;
@ -112,40 +113,10 @@ public enum Talent {
public static class ImprovisedProjectileCooldown extends FlavourBuff{};
public static class LethalMomentumTracker extends FlavourBuff{};
public static class HoldFastTracker extends Buff{
public int pos = -1;
@Override
public boolean act() {
if (pos == -1) pos = target.pos;
if (pos != target.pos) {
detach();
} else {
spend(TICK);
}
return true;
}
}
public static class WandPreservationCounter extends CounterBuff{};
public static class EmpoweringScrollsTracker extends FlavourBuff{
@Override
public void detach() {
super.detach();
Item.updateQuickslot();
}
};
public static class EmpoweredStrikeTracker extends FlavourBuff{};
public static class EnhancedRingsTracker extends FlavourBuff{};
public static class BountyHunterTracker extends FlavourBuff{};
public static class RejuvenatingStepsCooldown extends FlavourBuff{};
public static class SeerShotTracker extends FlavourBuff{
public int depth, pos; //TODO bundle
@Override
public void detach() {
GameScene.updateFog(pos, 2);
super.detach();
}
}
public static class SeerShotCooldown extends FlavourBuff{};
int icon;
@ -338,7 +309,7 @@ public enum Talent {
public static void onArtifactUsed( Hero hero ){
if (hero.hasTalent(ENHANCED_RINGS)){
Buff.affect(hero, EnhancedRingsTracker.class, 5f*hero.pointsInTalent(ENHANCED_RINGS));
Buff.prolong(hero, EnhancedRings.class, 5f*hero.pointsInTalent(ENHANCED_RINGS));
}
}

View File

@ -25,6 +25,7 @@ import com.shatteredpixel.shatteredpixeldungeon.Badges;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.EnhancedRings;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent;
import com.shatteredpixel.shatteredpixeldungeon.items.Generator;
@ -289,7 +290,7 @@ public class Ring extends KindofMisc {
@Override
public int buffedLvl() {
int lvl = super.buffedLvl();
if (Dungeon.hero.buff(Talent.EnhancedRingsTracker.class) != null){
if (Dungeon.hero.buff(EnhancedRings.class) != null){
lvl++;
}
return lvl;

View File

@ -26,6 +26,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Blindness;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Invisibility;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.MagicImmune;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ScrollEmpower;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent;
import com.shatteredpixel.shatteredpixeldungeon.items.Generator;
@ -186,7 +187,7 @@ public abstract class Scroll extends Item {
((HeroSprite)curUser.sprite).read();
if (curUser.hasTalent(Talent.EMPOWERING_SCROLLS)){
Buff.affect(curUser, Talent.EmpoweringScrollsTracker.class, 10f);
Buff.affect(curUser, ScrollEmpower.class, 10f);
updateQuickslot();
}

View File

@ -32,6 +32,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Invisibility;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.LockedFloor;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.MagicImmune;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Recharging;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ScrollEmpower;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.SoulMark;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.HeroSubClass;
@ -305,7 +306,7 @@ public abstract class Wand extends Item {
int lvl = super.buffedLvl();
if (charger != null && charger.target != null) {
if (charger.target.buff(Talent.EmpoweringScrollsTracker.class) != null){
if (charger.target.buff(ScrollEmpower.class) != null){
lvl += Dungeon.hero.pointsInTalent(Talent.EMPOWERING_SCROLLS);
}
@ -361,9 +362,9 @@ public abstract class Wand extends Item {
curCharges -= cursed ? 1 : chargesPerCast();
Talent.EmpoweringScrollsTracker tracker = curUser.buff(Talent.EmpoweringScrollsTracker.class);
if (tracker != null){
tracker.detach();
ScrollEmpower empower = curUser.buff(ScrollEmpower.class);
if (empower != null){
empower.detach();
}
WandOfMagicMissile.MagicCharge buff = curUser.buff(WandOfMagicMissile.MagicCharge.class);

View File

@ -26,6 +26,7 @@ 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.RevealedArea;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent;
import com.shatteredpixel.shatteredpixeldungeon.effects.Splash;
@ -344,9 +345,9 @@ public class SpiritBow extends Weapon {
&& user.buff(Talent.SeerShotCooldown.class) == null){
int shotPos = throwPos(user, dst);
if (Actor.findChar(shotPos) == null) {
Talent.SeerShotTracker seerShot = Buff.affect(user, Talent.SeerShotTracker.class, 5 * user.pointsInTalent(Talent.SEER_SHOT));
seerShot.depth = Dungeon.depth;
seerShot.pos = shotPos;
RevealedArea a = Buff.affect(user, RevealedArea.class, 5 * user.pointsInTalent(Talent.SEER_SHOT));
a.depth = Dungeon.depth;
a.pos = shotPos;
Buff.affect(user, Talent.SeerShotCooldown.class, 20f);
}
}

View File

@ -39,6 +39,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ChampionEnemy;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.LockedFloor;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.MagicalSight;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.MindVision;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.RevealedArea;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Shadows;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.HeroSubClass;
@ -1191,10 +1192,10 @@ public abstract class Level implements Bundlable {
}
}
Talent.SeerShotTracker seerShot = c.buff(Talent.SeerShotTracker.class);
if (seerShot != null && seerShot.depth == Dungeon.depth){
for (RevealedArea a : c.buffs(RevealedArea.class)){
if (Dungeon.depth != a.depth) continue;
for (int i : PathFinder.NEIGHBOURS9)
fieldOfView[seerShot.pos+i] = true;
fieldOfView[a.pos+i] = true;
}
}