From 267bb84c1fb4cbb0391210708fda04caf40fd183 Mon Sep 17 00:00:00 2001 From: LingASDJ <2735951230@qq.com> Date: Tue, 30 May 2023 01:24:46 +0800 Subject: [PATCH] Update V0.6.2.0-Beta4 --- build.gradle | 4 +- .../assets/messages/items/items.properties | 29 ++- .../main/assets/messages/misc/misc.properties | 2 +- .../src/main/assets/messages/ui/ui.properties | 2 + .../shatteredpixeldungeon/Badges.java | 6 +- .../actors/buffs/Invisibility.java | 6 + .../actors/hero/HeroClass.java | 3 +- .../actors/mobs/npcs/RedDragon.java | 5 +- .../items/Generator.java | 6 +- .../items/artifacts/WraithAmulet.java | 192 ++++++++++++++---- .../items/potions/Potion.java | 5 +- .../items/scrolls/ScrollOfRemoveCurse.java | 8 +- .../journal/Catalog.java | 5 +- .../shatteredpixeldungeon/levels/Level.java | 2 +- .../shatteredpixeldungeon/ui/Toolbar.java | 25 +-- .../ui/changelist/mlpd/vM0_6_7_X_Changes.java | 26 +++ .../windows/WndSettings.java | 2 +- 17 files changed, 247 insertions(+), 81 deletions(-) diff --git a/build.gradle b/build.gradle index 2c2273b2e..04fd55a19 100644 --- a/build.gradle +++ b/build.gradle @@ -17,8 +17,8 @@ allprojects { appName = 'Magic Ling Pixel Dungeon' appPackageName = 'com.ansdomagiclingpixeldungeon.ling' - appVersionCode =900871 - appVersionName = '0.6.2.0-Beta3' + appVersionCode =900872 + appVersionName = '0.6.2.0-Beta4' appJavaCompatibility = JavaVersion.VERSION_11 diff --git a/core/src/main/assets/messages/items/items.properties b/core/src/main/assets/messages/items/items.properties index c431038a6..1026d4441 100644 --- a/core/src/main/assets/messages/items/items.properties +++ b/core/src/main/assets/messages/items/items.properties @@ -89,11 +89,6 @@ items.bombs.laserpython.name=激光十字晶柱召唤器 items.bombs.laserpython.desc=这枚召唤器会在爆炸后立刻生成一个十字晶柱。 items.bombs.laserpython.didnot_pick=你无法拾取该物品…… -items.artifacts.wraithamulet.name=暗金宝石护符 -items.artifacts.wraithamulet.desc=来自于异世界的产物,能使自己进入虚无化。当护符能量足够多的时候,你还可以对敌人实行一次暗夜袭击,护符能量将会随着时间自动恢复。\n\n这个护符是证明给强者之人用的,冰雪魔女已经输的心服口服,现在她将此护身符给予给你。 -items.artifacts.wraithamulet.ac_ghost=遁入虚无 -items.artifacts.wraithamulet.ac_darkkill=暗夜袭击 - items.food.pasty.moon=月饼 items.food.pasty.moonling=月饼的味道让你回味无穷,你感到十分畅快。 items.food.pasty.moon_desc=月饼象征着团圆美满,吃下这佳节诞生的产物,危险的地牢也在中秋节洋溢着快乐的气氛。中秋节快乐,%s! @@ -172,7 +167,7 @@ items.weapon.melee.endingblade.ac_diedghost=✦死亡宣告✦ items.weapon.melee.endingblade.ac_healreset=_千里追魂_ items.weapon.melee.washcrime.name=涤罪 -items.weapon.melee.washcrime.desc=铁链的末端绑了一把巨镰,上面的Γ血迹Γ已然生锈。\n命中有几率释放✦未安息的亡魂✦助战,并给敌人施加✦餐费✦效果,武器伤害随杀敌数增加,但在一定阈值后停止增加。\n\n_这把武器拥有额外的攻击距离但攻速极慢_ +items.weapon.melee.washcrime.desc=铁链的末端绑了一把巨镰,上面的Γ血迹Γ已然生锈。\n命中有几率释放✦未安息的亡魂✦助战,并给敌人施加✦残废✦效果,武器伤害随杀敌数增加,但在一定阈值后停止增加。\n\n_这把武器拥有额外的攻击距离但攻速极慢_ items.weapon.melee.washcrime$diedghost.name=未安息的亡魂 items.weapon.melee.washcrime$diedghost.desc=肉身已然逝去,灵魂尚未得到安息,脑海遵照主人的意愿,直到真正的死亡降临。 @@ -848,8 +843,30 @@ items.artifacts.unstablespellbook.desc_index=这本魔典的目录并不完整 items.artifacts.unstablespellbook.desc_empowered=被你放进书中的卷轴闪耀着魔力的微光。你能够利用魔典进一步激发卷轴能力,展现出秘卷效果,但这样也会消耗你额外的充能。 items.artifacts.unstablespellbook.read_empowered=被你放入魔典的卷轴都充满了魔法能量。你可以自主选择导引出该卷轴的正常或秘卷能力。\n\n如果选择释放秘卷能力,则会消耗2点魔典充能。 +items.artifacts.wraithamulet.name=暗金宝石护符 +items.artifacts.wraithamulet.desc=来自于不属于这个世界的产物,能使自己进入虚无化。\n\n当护符能量足够多的时候,你还可以对敌人实行一次暗夜突袭,对目标造成_最大生命值x4的伤害_。\n\n如果是首领,则受到_最大生命值的50%伤害_。护符能量将会随着时间自动恢复。\n\n这个护符曾经是一个少女来探险的护身符,自从她在地牢中失踪后,这个护符就一直被遗弃在这里…… +items.artifacts.wraithamulet.ghost=你遁入了虚无,你的身体变得透明了。 +items.artifacts.wraithamulet.cooddown=你的护符能量正在冷却,你暂时无法使用任何能力。 +items.artifacts.wraithamulet.nochareup=你的护符能量不足,你无法使用任何能力。 +items.artifacts.wraithamulet.cursed=少女的怨念与诅咒魔力在此凝聚,你的灵魂被束缚在这里,你无法使用护符的能力。\n\n_被诅咒的暗金宝石护符将抑制饮用药水的能力,并且周期性吸取穿戴者的生命精华_ +items.artifacts.wraithamulet.ac_ghost=遁入虚无 +items.artifacts.wraithamulet.ac_darkkill=暗夜突袭 +items.artifacts.wraithamulet.noequip=你必须装备此神器才能使用它的能力。 +items.artifacts.wraithamulet.must_nocursed=你必须净化护符的诅咒才能使用它的能力。 +items.artifacts.wraithamulet.drink_cursed=就当你准备饮用药水时,被诅咒的暗金宝石护符发射出一道无形的结界阻止了你饮用药水。 +items.artifacts.wraithamulet$wraithrecharge.ondeath=你的灵魂被护符吸食殆尽了…… +items.artifacts.wraithamulet$wraithrecharge.cursed=我会让你的灵魂永远留在这里…… +items.artifacts.wraithamulet$wraithrecharge.rankings_desc=被暗金护符吸食殆尽…… +items.artifacts.wraithamulet$wraithrecharge.ghoststong=你的暗金护符变得更加强大了。 + +items.artifacts.wraithamulet$1.selectkill=选择刺杀目标 +items.artifacts.wraithamulet$1.far=刺杀目标太远,无法进行刺杀。 +items.artifacts.wraithamulet$1.rooted=你的身体被束缚在这里,无法进行刺杀。 +items.artifacts.wraithamulet$1.notthere=那里没有任何目标 +items.artifacts.wraithamulet$1.killmobs=该生物成功被暗夜突袭处决! +items.artifacts.wraithamulet$1.killboss=该首领成功被暗夜突袭重创! ###bags items.bags.bag.name=背包 diff --git a/core/src/main/assets/messages/misc/misc.properties b/core/src/main/assets/messages/misc/misc.properties index 5cc58541f..839503858 100644 --- a/core/src/main/assets/messages/misc/misc.properties +++ b/core/src/main/assets/messages/misc/misc.properties @@ -70,7 +70,7 @@ badges$badge.yasd.title=另类死亡爱好者 badges$badge.yasd.desc=解锁所有关于死因的徽章 badges$badge.boss_slain_1.title=丛林之熵 -badges$badge.boss_slain_1.desc=击败丛尽头的任意Boss +badges$badge.boss_slain_1.desc=击败丛林尽头的任意Boss badges$badge.boss_slain_2.title=冰狱噩梦 badges$badge.boss_slain_2.desc=击败监狱尽头的任意Boss badges$badge.boss_slain_3.title=冰雪诅咒 diff --git a/core/src/main/assets/messages/ui/ui.properties b/core/src/main/assets/messages/ui/ui.properties index f99d6ae89..f81151a6e 100644 --- a/core/src/main/assets/messages/ui/ui.properties +++ b/core/src/main/assets/messages/ui/ui.properties @@ -523,4 +523,6 @@ ui.changelist.mlpd.vm0_6_7_x_changes.bug_06x67=-V0.6.2-Beta2\n1.修复提灯, ui.changelist.mlpd.vm0_6_7_x_changes.bug_06x68=-V0.6.2-Beta3\n1.修复嗜血荆棘的一些错误\n2.修复快捷栏在遗物状态下仍然可以使用的Bug +ui.changelist.mlpd.vm0_6_7_x_changes.bug_06x69=-V0.6.2-Beta4\n1.修复快捷栏的初始配置问题\n2.修复徽章的一些错误\n3.矫正部分错误文案 + //ui.changelist.mlpd.vm0_5_x_changes.xxx// \ No newline at end of file diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Badges.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Badges.java index 5d3cd5ebb..5dd05dd70 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Badges.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Badges.java @@ -1072,7 +1072,7 @@ public class Badges { if (global.contains( badge )) { if (!badge.meta) { - GLog.h( Messages.get(Badges.class, "endorsed", badge.desc()) ); + GLog.h( Messages.get(Badges.class, "endorsed", badge.title()) ); } } else { @@ -1081,9 +1081,9 @@ public class Badges { saveNeeded = true; if (badge.meta) { - GLog.h( Messages.get(Badges.class, "new_super", badge.desc()) ); + GLog.h( Messages.get(Badges.class, "new_super", badge.title()) ); } else { - GLog.h( Messages.get(Badges.class, "new", badge.desc()) ); + GLog.h( Messages.get(Badges.class, "new", badge.title()) ); } PixelScene.showBadge( badge ); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Invisibility.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Invisibility.java index a3d852326..f6fc10528 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Invisibility.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Invisibility.java @@ -114,4 +114,10 @@ public class Invisibility extends FlavourBuff { public String toString() { return Messages.get(this, "name"); } + + @Override + public String desc() { + return Messages.get(this, "desc", dispTurns()); + } + } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/HeroClass.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/HeroClass.java index f6904ae45..544d8e01b 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/HeroClass.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/HeroClass.java @@ -135,7 +135,7 @@ public enum HeroClass { } public void initHero( Hero hero ) { - + //new WraithAmulet().quantity(1).identify().collect(); if (Dungeon.isChallenged(Challenges.RLPT)) { new Ankh().quantity(1).identify().collect(); } @@ -166,6 +166,7 @@ public enum HeroClass { new MysteryMeat().quantity(100).identify().collect(); Buff.affect(hero, ChampionHero.AntiMagic.class, 50000f); + //new WraithAmulet().quantity(1).identify().collect(); new BloodthirstyThorn().quantity(1).identify().collect(); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/RedDragon.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/RedDragon.java index 757778d63..e7ef75a9a 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/RedDragon.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/RedDragon.java @@ -44,6 +44,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.ChaliceOfBlood; import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.DriedRose; import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.SandalsOfNature; import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.TimekeepersHourglass; +import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.WraithAmulet; import com.shatteredpixel.shatteredpixeldungeon.items.potions.brews.BlizzardBrew; import com.shatteredpixel.shatteredpixeldungeon.items.potions.brews.Brew; import com.shatteredpixel.shatteredpixeldungeon.items.potions.brews.CausticBrew; @@ -362,7 +363,7 @@ public class RedDragon extends NPC { Item item = randomArtifact(); if(item != null) { - switch (Random.Int(6)){ + switch (Random.NormalIntRange(1,7)){ case 1: armor = new CapeOfThorns(); break; case 2: @@ -375,6 +376,8 @@ public class RedDragon extends NPC { armor = new SandalsOfNature(); break; case 6: armor = new TimekeepersHourglass(); break; + case 7: + armor = new WraithAmulet(); break; } } else { switch (Random.chances(new float[]{0, 0, 10, 6, 3, 1})){ diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Generator.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Generator.java index a2fc5900d..14a518d6e 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Generator.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Generator.java @@ -43,6 +43,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.SandalsOfNature; import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.TalismanOfForesight; import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.TimekeepersHourglass; import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.UnstableSpellbook; +import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.WraithAmulet; import com.shatteredpixel.shatteredpixeldungeon.items.food.Food; import com.shatteredpixel.shatteredpixeldungeon.items.food.MysteryMeat; import com.shatteredpixel.shatteredpixeldungeon.items.food.Pasty; @@ -491,9 +492,10 @@ public class Generator { AlchemistsToolkit.class, DriedRose.class, LloydsBeacon.class, - EtherealChains.class + EtherealChains.class, + WraithAmulet.class, }; - ARTIFACT.defaultProbs = new float[]{ 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1}; + ARTIFACT.defaultProbs = new float[]{ 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1,1}; ARTIFACT.probs = ARTIFACT.defaultProbs.clone(); } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/WraithAmulet.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/WraithAmulet.java index 46db9d797..4224297d9 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/WraithAmulet.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/WraithAmulet.java @@ -1,41 +1,54 @@ package com.shatteredpixel.shatteredpixeldungeon.items.artifacts; +import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.hero; + 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.Invisibility; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; -import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob; +import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.NPC; import com.shatteredpixel.shatteredpixeldungeon.effects.particles.ShadowParticle; import com.shatteredpixel.shatteredpixeldungeon.items.Item; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfTeleportation; -import com.shatteredpixel.shatteredpixeldungeon.levels.Level; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.scenes.CellSelector; import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; +import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; +import com.shatteredpixel.shatteredpixeldungeon.ui.BuffIndicator; import com.shatteredpixel.shatteredpixeldungeon.ui.QuickSlotButton; import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; +import com.watabou.utils.Bundle; import com.watabou.utils.Random; import java.util.ArrayList; -import java.util.HashSet; -import java.util.Objects; public class WraithAmulet extends Artifact { { image = ItemSpriteSheet.WRALIPS; cooldown = 0; - charge = Math.min(level()+3, 10); + charge = Math.min(level()+1, 10); partialCharge = 0; - chargeCap = Math.min(level()+3, 10); + chargeCap = Math.min(level()+1, 10); level = 0; levelCap = 10; defaultAction = AC_GHOST; } - + @Override + public boolean doEquip(Hero hero) { + if (super.doEquip(hero)){ + if (cursed) { + Buff.affect(hero, CursedAmulet.class).set( (100), 1 ); + } + return true; + } else { + return false; + } + } private static final String AC_GHOST = "ghost"; private static final String AC_ASSASSINATE = "darkkill"; @@ -55,16 +68,16 @@ public class WraithAmulet extends Artifact { @Override public void execute(Hero hero, String action) { super.execute(hero, action); - if(action.equals(AC_GHOST)){ + if(action.equals(AC_GHOST) && !cursed){ if (cooldown > 0) { - GLog.i(Messages.get(this,"cooddown")); + GLog.w(Messages.get(this,"cooddown")); } else if(useableBasic()) { if(this.isEquipped(Dungeon.hero)){ if(this.charge > 0) { exp += 5; Buff.affect(Dungeon.hero, Invisibility.class, Invisibility.DURATION); - GLog.i(Messages.get(this,"ghost")); - cooldown = 12 - (level / 2); + GLog.p(Messages.get(this,"ghost")); + cooldown = 34 - (level / 2); charge--; } else { GLog.i(Messages.get(this,"nochareup")); @@ -73,15 +86,16 @@ public class WraithAmulet extends Artifact { GLog.i(Messages.get(this,"noequip")); } } else { - GLog.i(Messages.get(this,"whoareyou")); + GLog.n(Messages.get(this,"whoareyou")); } - } else if (action.equals(AC_ASSASSINATE)) { + } else if (action.equals(AC_ASSASSINATE) && !cursed) { if(this.charge >= 5){ GameScene.selectCell(porter); - charge-=5; } else { GLog.i(Messages.get(this,"nochareup")); } + } else if(cursed) { + GLog.i(Messages.get(this,"must_nocursed")); } } @@ -89,16 +103,12 @@ public class WraithAmulet extends Artifact { return true; } - protected boolean useable(){ - return true; - } - @Override public ArrayList actions(Hero hero) { ArrayList actions = super.actions(hero); - if (isEquipped(hero)) + if (isEquipped(hero) && !cursed) actions.add(AC_GHOST); - if (isEquipped(hero) && charge >= 7) + if (isEquipped(hero) && charge >= 7 && !cursed) actions.add(AC_ASSASSINATE); return actions; } @@ -111,6 +121,7 @@ public class WraithAmulet extends Artifact { public class WraithRecharge extends ArtifactBuff{ @Override public boolean act() { + if (charge < chargeCap && !cursed && useableBasic()) { partialCharge += 1 / (150f - (chargeCap - charge) * 15f); @@ -123,9 +134,14 @@ public class WraithAmulet extends Artifact { } } } else if(cursed){ - if(Random.Int(40) == 0){ - GLog.i(Messages.get(this,"cursed")); + int level = level() == 0 ? 1 : level(); + hero.sprite.showStatus(CharSprite.NEGATIVE, Messages.get(this,"cursed")); + hero.damage(Random.Int(4*level, 6*level), this); + if (!hero.isAlive()) { + Dungeon.fail(getClass()); + GLog.n(Messages.get(this, "ondeath")); } + spend(90f); } if(exp > level * 50){ @@ -151,7 +167,16 @@ public class WraithAmulet extends Artifact { @Override public String desc() { - return Messages.get(this, "desc"); + String result = Messages.get(this, "desc"); + + if (isEquipped(Dungeon.hero)) { + if (cursed) { + Buff.affect(hero, CursedAmulet.class).set( (100), 1 ); + result += "\n\n" + Messages.get(this, "cursed"); + } + } + + return result; } public int getCharge(){ return this.charge; @@ -163,35 +188,130 @@ public class WraithAmulet extends Artifact { } @Override public void onSelect(Integer target) { - HashSet victim = new HashSet(); + if (target != null ) { if (target == curUser.pos) { - GLog.i(Messages.get(this,"select")); + GLog.i(Messages.get(this, "select")); return; } QuickSlotButton.target(Actor.findChar(target)); - if(Actor.findChar(target) != null){ - if(Level.distancex(Dungeon.hero.pos, target) == 1) { + Char enemy = Actor.findChar(target); + if (enemy != null && !(enemy instanceof NPC)) { + if (hero.rooted || Dungeon.level.distance(hero.pos, target) < 3) { final WraithAmulet amulet = (WraithAmulet) Item.curItem; amulet.charge--; amulet.exp += 10; - Objects.requireNonNull(Actor.findChar(target)).damage(Objects.requireNonNull(Actor.findChar(target)).HT, WraithAmulet.class); - Dungeon.hero.pos = target; - Dungeon.hero.sprite.emitter().start(ShadowParticle.UP, 0.05f, 10); - ScrollOfTeleportation.appear(Dungeon.hero, target); + hero.pos = target; + if (enemy.properties().contains(Char.Property.BOSS)) { + enemy.damage(enemy.HT / 2, WraithAmulet.class); + GLog.i(Messages.get(this, "killboss")); + } else { + enemy.damage(enemy.HT * 4, WraithAmulet.class); + GLog.i(Messages.get(this, "killmobs")); + } + hero.sprite.emitter().start(ShadowParticle.UP, 0.05f, 10); + ScrollOfTeleportation.appear(hero, target); Dungeon.observe(); - GLog.i(Messages.get(this,"killmobs")); - } - } else { - GLog.i(Messages.get(this,"far")); + + amulet.charge -= 5; + } else if(Dungeon.level.distance(hero.pos, target) < 3) { + GLog.i(Messages.get(this, "far")); + } else if (hero.rooted) { + GLog.i(Messages.get(this, "rooted")); } } else { - GLog.i(Messages.get(this,"notthere")); + GLog.i(Messages.get(this, "notthere")); } + } } }; + public static class CursedAmulet extends Buff { + + { + type = buffType.POSITIVE; + } + + public static int level = 0; + private int interval = 1; + + @Override + public boolean act() { + if (target.isAlive()) { + + spend(interval); + if (level <= 0) { + detach(); + } + + } + + return true; + } + + public int level() { + return level; + } + + public void set( int value, int time ) { + //decide whether to override, preferring high value + low interval + if (Math.sqrt(interval)*level <= Math.sqrt(time)*value) { + level = value; + interval = time; + spend(time - cooldown() - 1); + } + } + + @Override + public float iconFadePercent() { + if (target instanceof Hero){ + float max = ((Hero) target).lvl; + return Math.max(0, (max-level)/max); + } + return 0; + } + + @Override + public String toString() { + return Messages.get(this, "name"); + } + + @Override + public String desc() { + return Messages.get(this, "desc", level, dispTurns(visualcooldown())); + } + + private static final String LEVEL = "level"; + private static final String INTERVAL = "interval"; + + @Override + public void storeInBundle( Bundle bundle ) { + super.storeInBundle( bundle ); + bundle.put( INTERVAL, interval ); + bundle.put( LEVEL, level ); + } + + @Override + public void restoreFromBundle( Bundle bundle ) { + super.restoreFromBundle( bundle ); + interval = bundle.getInt( INTERVAL ); + level = bundle.getInt( LEVEL ); + } + +// @Override +// public void tintIcon(Image icon) { +// icon.hardlight(0x990000); +// } + + @Override + public int icon() { + return BuffIndicator.BLESS; + } + + + } + } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/Potion.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/Potion.java index 2db4f9aa5..e4cf540b8 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/Potion.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/Potion.java @@ -35,6 +35,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.Generator; import com.shatteredpixel.shatteredpixeldungeon.items.Item; import com.shatteredpixel.shatteredpixeldungeon.items.ItemStatusHandler; import com.shatteredpixel.shatteredpixeldungeon.items.Recipe; +import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.WraithAmulet; import com.shatteredpixel.shatteredpixeldungeon.items.bags.Bag; import com.shatteredpixel.shatteredpixeldungeon.items.potions.elixirs.ElixirOfHoneyedHealing; import com.shatteredpixel.shatteredpixeldungeon.items.potions.exotic.ExoticPotion; @@ -236,7 +237,9 @@ public class Potion extends Item { } else if (action.equals( AC_DRINK )) { - if (isKnown() && mustThrowPots.contains(getClass())) { + if(Dungeon.hero.buff(WraithAmulet.CursedAmulet.class) != null) { + GLog.n(Messages.get(WraithAmulet.class, "drink_cursed")); + } else if (isKnown() && mustThrowPots.contains(getClass())) { GameScene.show( new WndOptions(new ItemSprite(this), diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/scrolls/ScrollOfRemoveCurse.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/scrolls/ScrollOfRemoveCurse.java index afe45ca09..ddaea9164 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/scrolls/ScrollOfRemoveCurse.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/scrolls/ScrollOfRemoveCurse.java @@ -23,6 +23,7 @@ package com.shatteredpixel.shatteredpixeldungeon.items.scrolls; import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.hero; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Degrade; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Belongings; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; @@ -31,6 +32,7 @@ import com.shatteredpixel.shatteredpixeldungeon.effects.particles.ShadowParticle import com.shatteredpixel.shatteredpixeldungeon.items.EquipableItem; import com.shatteredpixel.shatteredpixeldungeon.items.Item; import com.shatteredpixel.shatteredpixeldungeon.items.armor.Armor; +import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.WraithAmulet; import com.shatteredpixel.shatteredpixeldungeon.items.wands.Wand; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.Weapon; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.EndingBlade; @@ -95,7 +97,11 @@ public class ScrollOfRemoveCurse extends InventoryScroll { for (Item item : items) { if (item != null) { item.cursedKnown = true; - if (item instanceof EndingBlade) { + if (item instanceof WraithAmulet) { + Buff.detach(hero, WraithAmulet.CursedAmulet.class); + procced = true; + item.cursed = false; + } else if (item instanceof EndingBlade) { item.cursed = true; } else { if (item.cursed) { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/journal/Catalog.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/journal/Catalog.java index 86a2f0555..6dcefa904 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/journal/Catalog.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/journal/Catalog.java @@ -34,6 +34,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.armor.RogueArmor; import com.shatteredpixel.shatteredpixeldungeon.items.armor.ScaleArmor; import com.shatteredpixel.shatteredpixeldungeon.items.armor.WarriorArmor; import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.AlchemistsToolkit; +import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.CapeOfThorns; import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.ChaliceOfBlood; import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.CloakOfShadows; import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.DriedRose; @@ -44,6 +45,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.SandalsOfNature; import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.TalismanOfForesight; import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.TimekeepersHourglass; import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.UnstableSpellbook; +import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.WraithAmulet; import com.shatteredpixel.shatteredpixeldungeon.items.books.bookslist.BrokenBooks; import com.shatteredpixel.shatteredpixeldungeon.items.books.bookslist.DeepBloodBooks; import com.shatteredpixel.shatteredpixeldungeon.items.books.bookslist.GrassKingBooks; @@ -260,7 +262,8 @@ public enum Catalog { RINGS.seen.put( RingOfWealth.class, false); ARTIFACTS.seen.put( AlchemistsToolkit.class, false); - //ARTIFACTS.seen.put( CapeOfThorns.class, false); + ARTIFACTS.seen.put( CapeOfThorns.class, false); + ARTIFACTS.seen.put( WraithAmulet.class, false); ARTIFACTS.seen.put( ChaliceOfBlood.class, false); ARTIFACTS.seen.put( CloakOfShadows.class, false); ARTIFACTS.seen.put( DriedRose.class, false); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/Level.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/Level.java index 3579c9877..27d609e08 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/Level.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/Level.java @@ -248,7 +248,7 @@ public abstract class Level implements Bundlable { int ay = a / getWidth(); int bx = b % getWidth(); int by = b / getWidth(); - return Math.max(Math.abs(ax - bx), Math.abs(ay - by)); + return Math.max( Math.abs( ax - bx ), Math.abs( ay - by ) ); } public static final int WIDTHX = 48; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/Toolbar.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/Toolbar.java index b0106fe11..1748040fb 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/Toolbar.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/Toolbar.java @@ -232,30 +232,7 @@ public class Toolbar extends Component { */ float wMin = Game.width / PixelScene.MIN_WIDTH_FULL; float hMin = Game.height / PixelScene.MIN_HEIGHT_FULL; - final int maxHorizontalQuickslots = - /** 中文 - * 如果是竖屏,那么最多显示12个快捷栏 - * 如果是竖屏且>=5x缩放,那么下方最多显示4个快捷栏 - * 如果是竖屏且>=4x缩放,那么下方最多显示5个快捷栏 - * 如果是竖屏且>=3x缩放,那么下方最多显示8个快捷栏 - * 如果是横屏,那么所有快捷栏在游戏界面底部生成布局 - */ - - /**English - //If it is a vertical screen, then at most 12 quick slots are displayed below - //If it is a vertical screen and >=5x zoom, then at most 4 quick slots are displayed below - //If it is a vertical screen and >=4x zoom, then at most 5 quick slots are displayed below - //If it is a vertical screen and >=3x zoom, then at most 8 quick slots are displayed below - //If it is a horizontal screen, then all quick slots are generated at the bottom of the game interface - */ - - PixelScene.landscape() ? 12 : - - SPDSettings.scale() >= 5 ? 4 : - - SPDSettings.scale() >= 4 ? 5 : - - SPDSettings.scale() >= 3 ? 8 : 12; + final int maxHorizontalQuickslots = PixelScene.landscape() ? 8 : 4; float right = width; if (SPDSettings.interfaceSize() > 0){ btnInventory.setPos(right - btnInventory.width(), y); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/changelist/mlpd/vM0_6_7_X_Changes.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/changelist/mlpd/vM0_6_7_X_Changes.java index 89bb87fb1..cbcff2bce 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/changelist/mlpd/vM0_6_7_X_Changes.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/changelist/mlpd/vM0_6_7_X_Changes.java @@ -51,6 +51,7 @@ import java.util.ArrayList; public class vM0_6_7_X_Changes { public static void addAllChanges(ArrayList changeInfos) { + add_v0_6_40_Changes(changeInfos); add_v0_6_39_Changes(changeInfos); add_v0_6_38_Changes(changeInfos); add_v0_6_37_Changes(changeInfos); @@ -93,6 +94,31 @@ public class vM0_6_7_X_Changes { add_v0_6_0_Changes(changeInfos); } + public static void add_v0_6_40_Changes( ArrayList changeInfos ) { + + ChangeInfo changes = new ChangeInfo("v0.6.2.0-Beta4", true, ""); + changes.hardlight(Window.TITLE_COLOR); + changeInfos.add(changes); + + changes = new ChangeInfo("新内容", false, null); + changes.hardlight(Window.GREEN_COLOR); + changeInfos.add(changes); + + changes.addButton(new ChangeButton(new ItemSprite(ItemSpriteSheet.WRALIPS), "新神器:暗金宝石护符", + "曾经是一位与你一样是一名冒险家的少女的护身符,而如今已是物是人非。")); + + changes = new ChangeInfo("改动", false, null); + changes.hardlight(Window.CYELLOW); + changeInfos.add(changes); + + changes.addButton(new ChangeButton(Icons.get(Icons.PREFS), ("徽章改进"), + ("修复了徽章的一些错误。"))); + + changes.addButton(new ChangeButton(new Image("sprites/spinner.png", 144, 0, 16, 16), + Messages.get(ChangesScene.class, "bugfixes"), Messages.get(vM0_6_7_X_Changes.class, "bug_06X69"))); + + } + public static void add_v0_6_39_Changes( ArrayList changeInfos ) { ChangeInfo changes = new ChangeInfo("v0.6.2.0-Beta3", true, ""); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndSettings.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndSettings.java index accc520de..1b176e272 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndSettings.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndSettings.java @@ -665,7 +665,7 @@ public class WndSettings extends WndTabbed { if (width > 200){ ClassUI.setRect(0, bottom, width, SLIDER_HEIGHT); optSplashScreen.setRect(0, ClassUI.bottom() + GAP, width, SLIDER_HEIGHT); - optFPSLimit.setRect(0, optSplashScreen.bottom() + GAP, width, SLIDER_HEIGHT); + optFPSLimit.setRect(0, optSplashScreen.bottom() + GAP, width/2, SLIDER_HEIGHT); if(Game.scene()!=null && Game.scene().getClass() == GameScene.class) { quickslots.setRect(optFPSLimit.right(), optFPSLimit.top(), width/2, SLIDER_HEIGHT); wxts.visible = false;