From b3862ac6cfb7db355f35de75b8b426740f0cba9d Mon Sep 17 00:00:00 2001 From: LingASDJ <2735951230@qq.com> Date: Mon, 15 Aug 2022 22:30:30 +0800 Subject: [PATCH] Update Beta20.65 Add CustomName in Wepaon and Arrmor Fixed Bug --- .../main/assets/environment/tiles_gold.png | Bin 0 -> 35483 bytes .../assets/messages/actors/actors.properties | 9 +- .../assets/messages/levels/levels.properties | 2 +- .../src/main/assets/messages/ui/ui.properties | 2 + .../messages/windows/windows.properties | 6 + core/src/main/assets/sprites/items/wf.png | Bin 0 -> 476 bytes .../shatteredpixeldungeon/Assets.java | 2 + .../shatteredpixeldungeon/SPDSettings.java | 2 +- .../actors/buffs/Sanity.java | 4 - .../actors/hero/HeroClass.java | 1 - .../actors/mobs/Bestiary.java | 4 +- .../actors/mobs/BlackHost.java | 2 +- .../actors/mobs/FlameC01.java | 2 +- .../actors/mobs/KagenoNusujin.java | 22 ++- .../actors/mobs/Mob.java | 8 +- .../actors/mobs/RandomBlueFire.java | 20 ++- .../actors/mobs/RandomBlueFireDE.java | 49 ++----- .../actors/mobs/Rat.java | 1 + .../actors/mobs/RedMurderer.java | 4 +- .../actors/mobs/SlimeKing.java | 42 +----- .../actors/mobs/Thief.java | 4 +- .../items/EquipableItem.java | 23 ++++ .../items/wands/Wand.java | 14 +- .../items/weapon/melee/MagesStaff.java | 4 +- .../levels/CaveTwoBossLevel.java | 2 +- .../levels/ShopBossLevel.java | 104 ++++++++++++++ .../scenes/InterlevelScene.java | 2 +- .../sprites/FireBallMobSprite.java | 2 +- .../sprites/WFSprite.java | 27 ++++ .../ui/changelist/mlpd/vM0_6_7_X_Changes.java | 37 +++++ .../windows/WndInfoItem.java | 129 +++++++----------- .../windows/WndSettings.java | 3 - .../windows/WndStartGame.java | 11 +- .../windows/WndTextInput.java | 8 +- .../windows/WndUseItem.java | 113 +++++++++++---- 35 files changed, 431 insertions(+), 234 deletions(-) create mode 100644 core/src/main/assets/environment/tiles_gold.png create mode 100644 core/src/main/assets/sprites/items/wf.png create mode 100644 core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/ShopBossLevel.java create mode 100644 core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/WFSprite.java diff --git a/core/src/main/assets/environment/tiles_gold.png b/core/src/main/assets/environment/tiles_gold.png new file mode 100644 index 0000000000000000000000000000000000000000..1cff905e24c88dcbf315d69513dd4dec944e4485 GIT binary patch literal 35483 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 literal 0 HcmV?d00001 diff --git a/core/src/main/assets/messages/actors/actors.properties b/core/src/main/assets/messages/actors/actors.properties index 6570d3cc0..da9c2253a 100644 --- a/core/src/main/assets/messages/actors/actors.properties +++ b/core/src/main/assets/messages/actors/actors.properties @@ -502,10 +502,11 @@ actors.mobs.ogpdzsls.desc=它们会咬人,但只有大量出现才会危及生 actors.mobs.srpdhblr.name = 赏金猎人 actors.mobs.srpdhblr.desc = 这些赏金猎人曾经想来到这个地牢终结最终的黑暗,没想到现在却被地牢暗处的黑暗魔力给腐蚀。现在他们毫无一点神志,他们游荡在监狱附近,等待下一个来到这个地牢的可怜人。 -actors.mobs.randombluefirede.fuck=你很烦人!我要鲨了你! +actors.mobs.randombluefirede.fuck=无知者纵欲奈何,你又有什么资格拯救我们? actors.mobs.randombluefire.name = 诡异磷魂(狂暴) -actors.mobs.randombluefire.desc = 矮人王国的亡魂和地牢深处溢出的魔力诞生出的诡异生物。他们拥有恐怖的能力,并且半血会进入狂暴状态。但是它们没有视力,你只要不惊扰它们就好。不过,地牢的警报同样会让他们警觉起来。请小心行事!\n\n他们的幻影可能存在这里,必须在你离开后才会消失。 - +actors.mobs.randombluefire.died = 最终,终于还是解脱了…… +actors.mobs.randombluefire.desc = 矮人王国的亡魂和地牢深处溢出的魔力诞生出的诡异生物。他们拥有恐怖的能力,并且半血会进入狂暴状态。他们的幻影可能存在这里,必须在击败他们后才会消失。 +actors.mobs.randombluefire.notice = 你想尝试磷火带来的痛苦吗? actors.mobs.randombluefirede.name = 诡异磷魂 actors.mobs.randombluefirede.desc = 矮人王国的亡魂和地牢深处溢出的魔力诞生出的诡异生物。他们拥有恐怖的能力,并且半血会进入狂暴状态。但是它们没有视力,你只要不惊扰它们就好。不过,地牢的警报同样会让他们警觉起来。请小心行事! @@ -514,7 +515,7 @@ actors.mobs.ogpdnqhz.name = 健壮的老鼠 actors.mobs.ogpdnqhz.desc = 这个老鼠很健壮,某些时刻可能给你致命一击 actors.mobs.kagenonusujin.name=影子盗贼 -actors.mobs.kagenonusujin.desc=这个邪魔外道的小偷为了偷取什么宝贵之物而在此处游荡着。学习了来自深渊的黑暗法术的他,能够化作黑暗中的影子潜藏其间,又立刻消逝。\n\n这个怪物会尝试造成一次大伤害,之后将瞬移到地图上另一个地方。\n\n如果失败,则会召唤爆炎陷阱! +actors.mobs.kagenonusujin.desc=这个邪魔外道的小偷为了偷取什么宝贵之物而在此处游荡着。学习了来自深渊的黑暗法术的他,能够化作黑暗中的影子潜藏其间,又立刻消逝。\n\n这个怪物会尝试偷取玩家物品,之后将玩家瞬移到地图上另一个地方,并被魔法反噬流血。\n\n如果失败,则会因为魔法反噬而中毒! actors.mobs.fireghost.name=红色怨灵 actors.mobs.fireghost.desc=这只全身赤色的怨灵由地牢深处的死灵学家们从烈焰之中唤醒,虽然它们没有火元素强大,但也已可无限毗近。\n\n这个怪物会点燃你。 diff --git a/core/src/main/assets/messages/levels/levels.properties b/core/src/main/assets/messages/levels/levels.properties index 32fe23815..158608b84 100644 --- a/core/src/main/assets/messages/levels/levels.properties +++ b/core/src/main/assets/messages/levels/levels.properties @@ -233,5 +233,5 @@ levels.prisonlevel.bookshelf_desc=这个书架可能是监狱图书馆的残留 levels.sewerlevel.water_name=圣境水池 levels.sewerlevel.water_desc=进入水潭中可熄灭身上的火焰。\n显然,这里的邪恶魔力十分微弱,你踩在水上面甚至有_圣境的力量_保护你前行。\n但是在一些魔力聚焦的地方无法影响到你。 -levels.sewerlevel.empty_deco_desc=幽蓝且神秘的菌菇长在了这里。 +levels.sewerlevel.empty_deco_desc=圣境密林的植物正在这里缓慢生长 levels.sewerlevel.bookshelf_desc=这个书架塞满了没用的成功学书籍。烧掉怎么样? diff --git a/core/src/main/assets/messages/ui/ui.properties b/core/src/main/assets/messages/ui/ui.properties index a79ec3c3d..db8e4e091 100644 --- a/core/src/main/assets/messages/ui/ui.properties +++ b/core/src/main/assets/messages/ui/ui.properties @@ -457,4 +457,6 @@ ui.changelist.mlpd.vm0_6_7_x_changes.bug_06x22=-1.修复了两个种子缺失飞 ui.changelist.mlpd.vm0_6_7_x_changes.bug_06x23=-1.修复了玫瑰秘卷不制作的问题\n-2.修复了矮人大师的小恶魔无限循环问题\n-3.修复了玫瑰秘卷的错误快捷配方 ui.changelist.mlpd.vm0_6_7_x_changes.bug_06x24=-1.修复了DM300闪退的问题\n-2.修复了盗贼披风的天赋不生效问题\n-3.修复了挑战徽章获取异常的问题\n-4.修复了红龙之王的问题\n-5.修复了黑金钥匙使用后不消失的问题\n-6.修复了突变巨兽活死怪的问题\n-7.修复了狱火刻印对磷火无效的问题 + +ui.changelist.mlpd.vm0_6_7_x_changes.bug_06x25=-1.修复了DM720闪退的问题\n-2.修复了盗贼蝙蝠无限召唤的问题\n-3.修复了矮人大师召唤异常的问题\n-4.修复开发者模式降级变玩家的问题 //ui.changelist.mlpd.vm0_5_x_changes.xxx// \ No newline at end of file diff --git a/core/src/main/assets/messages/windows/windows.properties b/core/src/main/assets/messages/windows/windows.properties index b3c3d7f73..bfc155db7 100644 --- a/core/src/main/assets/messages/windows/windows.properties +++ b/core/src/main/assets/messages/windows/windows.properties @@ -18,6 +18,12 @@ windows.wndstartgame.custom_name_desc=输入你需要的自定义名字,最多 windows.wndstartgame.custom_name_set=接受 windows.wndstartgame.custom_name_clear=清空 +windows.wndgame.rename=装备重命名 +windows.wndgame.dialog=装备重命名 +windows.wndgame.dialog_title=好的装备名字能让你在游戏中更有亲切感\n现在!为你的_装备进行个性化命名设置_吧。\n\n_最多可以输入30字符,若要恢复默认点击该点的按钮_ +windows.wndgame.dialog_rename=重命名 +windows.wndgame.dialog_revert=恢复默认 + windows.wndsettings$datatab.firebase=FireBase数据提交 windows.wndsettings$displaytab.firebase_active=FireBase数据提交 windows.wndsettings$displaytab.firebase_desc=FireBase是一款由_Google_推出的一种开发者服务。Ling在魔绫这边添加了_FireBase崩溃日志收集报告_。\n当你尚未开启此功能时,你的_所有崩溃报告都会保存在本地Data数据区域(使用Root才能访问)_\n\n当你开启本功能后,你在魔绫游玩的所有崩溃报告将会在下次启动魔绫一并提交到程序后台以便JDSALing我维护。\n-开启此功能代表你同意提交你的崩溃数据和Δ手机的基本公开信息Δ_(手机型号,ROOT权限检测,安卓版本,运存检测,屏幕方向,手机内存)_,同时非常感谢你开启此功能以供Ling后续维护魔绫。\nΔ感谢你的支持与理解,同时感谢你的游玩Δ\n\nΞ开启此功能后重启游戏后本地崩溃数据将自动提交到魔绫控制终端Ξ diff --git a/core/src/main/assets/sprites/items/wf.png b/core/src/main/assets/sprites/items/wf.png new file mode 100644 index 0000000000000000000000000000000000000000..6d1a884cce03a2b93f7e1037d55b652b6440ada9 GIT binary patch literal 476 zcmV<20VDp2P)~bbmri0a1>Fit99#q`C=P<35g65jp3dwDPE0*ACEM#emHRO{l29iE&s zV=MX_Ub1PfcqC#$qVf(=^_G4cu?r_6$`a855s8Xw#`oCSKwDy@#0%exr!fGG3%+@H zg5=NobpP7&ysd#mEJ$*+fb15799={4igBm^{=E(@??f(hfsoH?zPlZKqQ8XQvmxkx z0(_+!7hF_SV!bXnW-HXvYId*+6FN5-Mw-L!2t z$6s)fxjKRm&Mw=6TO|7h3QHaeOCFN_0?B@XyVpfUrJ22qrO$1{8wW3ZAx#~@9RLUb ziscU&*JAm@cIu2zY;I#7ulYwFwkc{DTry59Dk^{K(NKhF(Ux{iaQ|Tb1>g&arMz41 Se=vgp0000= 180) { return BuffIndicator.BLESS; @@ -65,7 +64,6 @@ public class Sanity extends Buff { //San值检测系统 V1 if ( (hero.buff(Light.class)==null) ) { if (sanity >= 180) { - //-1-(1/10)+2=-1-0.1+2=0 sanity -= Dungeon.depth/5+1; if(sanity == 179) { GLog.w(Messages.get(Sanity.class,"bad")); @@ -73,7 +71,6 @@ public class Sanity extends Buff { } else if (sanity >= 120) { sanity -= Dungeon.depth/5+2; if(sanity == 119) { - //GLog.n("我在干什么……邪恶的灵魂正在蚕食你……"); GLog.n(Messages.get(Sanity.class,"tobad")); } } else { @@ -97,7 +94,6 @@ public class Sanity extends Buff { } public void set( int value, int time ) { - //decide whether to override, preferring high value + low interval if (Math.sqrt(interval)*sanity <= Math.sqrt(time)*value) { sanity = value; interval = time; 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 fbc6806cc..1d11f0e58 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 @@ -348,7 +348,6 @@ public enum HeroClass { hero.belongings.weapon.activate(hero); WandOfFireblast woc = new WandOfFireblast(); - woc.level(Random.NormalIntRange(1,3)); woc.identify().quantity(1).collect(); WandOfFrost wox = new WandOfFrost(); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Bestiary.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Bestiary.java index e985bf81e..3f3077afb 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Bestiary.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Bestiary.java @@ -210,9 +210,9 @@ public class Bestiary { case 8: return new ArrayList<>(Arrays.asList(Skeleton.class, Skeleton.class, - Thief.class, Shaman.random(),BrownBat.class,SpectralNecromancer.class, + Thief.class, Shaman.random(),BrownBat.class,KagenoNusujin.class, Shaman.random(), Guard.class, SRPDHBLR.class,Necromancer.class, - SpectralNecromancer.class,BrownBat.class)); + KagenoNusujin.class,BrownBat.class)); case 9: return new ArrayList<>(Arrays.asList(Skeleton.class, Skeleton.class, Skeleton.class, Thief.class,Thief.class,BrownBat.class, diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/BlackHost.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/BlackHost.java index 2b2081ace..694b0c777 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/BlackHost.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/BlackHost.java @@ -38,7 +38,7 @@ public class BlackHost extends Mob { } public int damageRoll() { - return Random.NormalIntRange(6, 19); + return Random.NormalIntRange(6, 12); } public int drRoll() { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/FlameC01.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/FlameC01.java index 50a9dd1a8..b7cae24c0 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/FlameC01.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/FlameC01.java @@ -109,7 +109,7 @@ public class FlameC01 extends Mob { spriteClass = FlameC01Sprite.class; properties.add(Property.INORGANIC); properties.add(Property.FIERY); - HP = HT = 120; + HP = HT = 40; defenseSkill = 23; EXP = 10; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/KagenoNusujin.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/KagenoNusujin.java index 7ffe43807..2f494a966 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/KagenoNusujin.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/KagenoNusujin.java @@ -6,19 +6,26 @@ package com.shatteredpixel.shatteredpixeldungeon.actors.mobs; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Bleeding; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; +import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; +import com.shatteredpixel.shatteredpixeldungeon.levels.traps.PoisonDartTrap; import com.shatteredpixel.shatteredpixeldungeon.levels.traps.TeleportationTrap; import com.shatteredpixel.shatteredpixeldungeon.sprites.KagenoNusujinSprite; import com.watabou.utils.Random; -public class KagenoNusujin extends Mob { +public class KagenoNusujin extends Thief { public KagenoNusujin() { this.spriteClass = KagenoNusujinSprite.class; - this.HT = this.HP =10; + this.HT = this.HP =50; this.defenseSkill = 16; this.maxLvl = 34; this.properties.add(Property.UNDEAD); + WANDERING = new Wandering(); + FLEEING = new Fleeing(); } + @Override public int attackProc(Char var1, int var2) { int var3 = var2; if (Random.Int(3) == 0) { @@ -26,11 +33,16 @@ public class KagenoNusujin extends Mob { TeleportationTrap var4 = new TeleportationTrap(); var4.pos = super.pos; var4.activate(); + if (steal( (Hero)enemy )) { + state = FLEEING; + Buff.affect( this, Bleeding.class ).set( 20f ); + } } else { var3 = var2 +4; - //BlazingTrap var4 = new BlazingTrap(); - //var4.pos = super.pos; - //var4.activate(); + PoisonDartTrap var4 = new PoisonDartTrap(); + var4.pos = super.pos; + var4.activate(); + } return var3; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Mob.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Mob.java index a1701e41f..01e27b1af 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Mob.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Mob.java @@ -183,16 +183,15 @@ public abstract class Mob extends Char { alerted = false; if (Dungeon.isChallenged(Challenges.SBSG) && scaleFactor == 1f && !properties().contains(Property.NOBIG)&&!properties().contains(Property.BOSS)){ - scaleFactor = Random.Float(1f, 1.8f); + scaleFactor = Random.Float(1f, 1.5f); HP = HT = (int) (HT * scaleFactor); - if (scaleFactor >= 1.15f){ + if (scaleFactor >= 1.45f){ HP = HT = (int) (HT * 1.15f); - }else if (scaleFactor >= 1.4f) { + }else if (scaleFactor >= 1.35f) { HP = HT = (int) (HT * 1.4f); } sprite.linkVisuals(this); sprite.link(this); - } if (justAlerted){ @@ -877,7 +876,6 @@ public abstract class Mob extends Char { } else { BGMPlayer.playBoss(); } - return; } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/RandomBlueFire.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/RandomBlueFire.java index 42e55643f..95c3cefe0 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/RandomBlueFire.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/RandomBlueFire.java @@ -12,13 +12,13 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.HalomethaneFire; import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter; import com.shatteredpixel.shatteredpixeldungeon.effects.Speck; import com.shatteredpixel.shatteredpixeldungeon.effects.particles.BlastParticle; +import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfHealing; import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfLiquidFlameX; import com.shatteredpixel.shatteredpixeldungeon.levels.features.Chasm; import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; import com.shatteredpixel.shatteredpixeldungeon.sprites.FireBallMobSpriteKB; -import com.shatteredpixel.shatteredpixeldungeon.ui.BossHealthBar; import com.watabou.utils.Bundle; import com.watabou.utils.PathFinder; import com.watabou.utils.Random; @@ -31,8 +31,8 @@ public class RandomBlueFire extends Mob { public float lifespan; public RandomBlueFire() { this.spriteClass = FireBallMobSpriteKB.class; - this.HT = 300; - this.HP = 300; + this.HT = 75; + this.HP = 75; this.defenseSkill = 10; this.EXP = 15; this.loot = new PotionOfLiquidFlameX(); @@ -48,7 +48,6 @@ public class RandomBlueFire extends Mob { @Override public void notice() { super.notice(); - BossHealthBar.assignBoss(this); yell( Messages.get(this, "notice") ); } @@ -100,18 +99,27 @@ public class RandomBlueFire extends Mob { return var3; } + @Override public int damageRoll() { - return Random.NormalIntRange(7, 12); + return Random.NormalIntRange( 10, 20 ); } public void die(Object var1) { Dungeon.level.drop( new PotionOfLiquidFlameX(), pos ).sprite.drop(); Dungeon.level.drop( new PotionOfLiquidFlameX(), pos ).sprite.drop(); + Dungeon.level.drop( new PotionOfHealing(), pos ).sprite.drop(); + Dungeon.level.drop( new PotionOfHealing(), pos ).sprite.drop(); super.die(var1); if (var1 != Chasm.class) { int var2 = Random.Int(this.deathCurse.length); - this.sprite.showStatus(16711680, this.deathCurse[var2], new Object[0]); + this.sprite.showStatus(16711680, this.deathCurse[var2]); } + for (Mob mob : (Iterable)Dungeon.level.mobs.clone()) { + if ( mob instanceof FlameC01) { + mob.die( var1 ); + } + } + yell( Messages.get(this, "died") ); } protected boolean getCloser(int var1) { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/RandomBlueFireDE.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/RandomBlueFireDE.java index c5eab9353..9a1dfeb67 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/RandomBlueFireDE.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/RandomBlueFireDE.java @@ -21,16 +21,12 @@ package com.shatteredpixel.shatteredpixeldungeon.actors.mobs; -import com.shatteredpixel.shatteredpixeldungeon.Assets; -import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; -import com.shatteredpixel.shatteredpixeldungeon.effects.Speck; import com.shatteredpixel.shatteredpixeldungeon.levels.features.Chasm; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; import com.shatteredpixel.shatteredpixeldungeon.sprites.FireBallMobSprite; import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; -import com.watabou.noosa.audio.Music; import com.watabou.utils.Random; public class RandomBlueFireDE extends Mob { @@ -40,33 +36,14 @@ public class RandomBlueFireDE extends Mob { private String[] deathCurse = {"没有任何的悲哀可以给我,你彻底激怒我了!"}; public RandomBlueFireDE() { this.spriteClass = FireBallMobSprite.class; - this.HT = 200; - this.HP = 200; + this.HT = 40; + this.HP = 40; this.defenseSkill = 4; this.EXP = 7; this.maxLvl = 15; this.state = this.SLEEPING; } - @Override - public boolean act() { - - if (Dungeon.level.water[pos] && HP < HT) { - if (Dungeon.level.heroFOV[pos] ){ - sprite.emitter().burst( Speck.factory( Speck.HEALING ), 1 ); - } - - HP++; - Music.INSTANCE.play(Assets.BGM_BOSSA, true); - } - - if (state != SLEEPING){ - Dungeon.level.seal(); - } - - return super.act(); - } - @Override public void damage( int dmg, Object src ) { //半血狂暴 @@ -74,34 +51,29 @@ public class RandomBlueFireDE extends Mob { if (HP <= HT / 2) { destroy(); Mob mob = new RandomBlueFire(); - mob.HP = mob.HT / 2; + mob.HP = mob.HT; mob.pos = pos; GameScene.add(mob); new FlameC01().spawnAround(pos); - Music.INSTANCE.play(Assets.BGM_BOSSD, true); GLog.n( Messages.get(this, "fuck") ); } } @Override public int damageRoll() { - return Random.NormalIntRange( 1, 2 ); + return Random.NormalIntRange( 5, 12 ); } - public int attackProc(Char enemy, int damage) { - if (Random.Int(0, 10) > 7) { - this.sprite.showStatus(16711680, this.attackCurse[Random.Int(this.attackCurse.length)], new Object[0]); - } - int damage2 = RandomBlueFireDE.super.attackProc(enemy, this.combo + damage); - this.combo++; - return damage2; + public int attackProc( Char enemy, int damage ) { + this.sprite.showStatus(16711680, this.attackCurse[Random.Int(this.attackCurse.length)]); + super.attackProc( enemy, damage ); + return damage; } public void die(Object cause) { RandomBlueFireDE.super.die(cause); if (cause != Chasm.class) { this.sprite.showStatus(16711680, this.deathCurse[Random.Int(this.deathCurse.length)], new Object[0]); - } } @@ -109,10 +81,5 @@ public class RandomBlueFireDE extends Mob { public int attackSkill( Char target ) { return 8; } - - @Override - public int drRoll() { - return Random.NormalIntRange(0, 1); - } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Rat.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Rat.java index d8febce91..85e58b5a3 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Rat.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Rat.java @@ -48,6 +48,7 @@ public class Rat extends Mob { if(Dungeon.isChallenged(LIGHTBLACK)) { if (Random.Int(5) == 1) { sanity -= 1; + //扣除理智-1 hero.sprite.showStatus( 0x808080, "1"); } } else { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/RedMurderer.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/RedMurderer.java index 20bcf51bf..945c1aea2 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/RedMurderer.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/RedMurderer.java @@ -43,7 +43,7 @@ import com.watabou.utils.Random; public class RedMurderer extends Mob { public Item item; - public static int Money = 0; + { spriteClass = MurdererSprite.RedMuderer.class; @@ -227,8 +227,6 @@ public class RedMurderer extends Mob { } if (item != null){ - Money++; - System.out.println("测试"+Money); GLog.n( Messages.get(RedMurderer.class, "escapes", item.name())); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/SlimeKing.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/SlimeKing.java index 8ddb28be6..f0d4478ec 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/SlimeKing.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/SlimeKing.java @@ -36,7 +36,6 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.HalomethaneBurning; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Poison; import com.shatteredpixel.shatteredpixeldungeon.effects.Chains; import com.shatteredpixel.shatteredpixeldungeon.effects.Pushing; -import com.shatteredpixel.shatteredpixeldungeon.effects.Speck; import com.shatteredpixel.shatteredpixeldungeon.items.Item; import com.shatteredpixel.shatteredpixeldungeon.items.keys.SkeletonKey; import com.shatteredpixel.shatteredpixeldungeon.items.quest.GooBlob; @@ -47,6 +46,7 @@ import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.SlimeKingSprite; import com.shatteredpixel.shatteredpixeldungeon.ui.BossHealthBar; import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; +import com.watabou.noosa.audio.Music; import com.watabou.noosa.audio.Sample; import com.watabou.utils.Callback; import com.watabou.utils.PathFinder; @@ -54,12 +54,10 @@ import com.watabou.utils.Random; public class SlimeKing extends Golem implements Callback { - private static final String COMBO = "combo"; - private String[] attackCurse = {"雕虫小技", "班门弄斧", + private final String[] attackCurse = {"雕虫小技", "班门弄斧", "GAMEOVER"}; private int combo = 0; private static final float TIME_TO_ZAP = 0.5f; - private String[] deathCurse = {"一无所知的蠢货!"}; { HP =100; @@ -131,7 +129,7 @@ public class SlimeKing extends Golem implements Callback { @Override public int attackProc(Char enemy, int damage) { if (Random.Int(0, 10) > 7) { - this.sprite.showStatus(0x009999, this.attackCurse[Random.Int(this.attackCurse.length)], new Object[0]); + this.sprite.showStatus(0x009999, this.attackCurse[Random.Int(this.attackCurse.length)]); } int damage2 = SlimeKing.super.attackProc(enemy, this.combo + damage); this.combo++; @@ -150,24 +148,6 @@ public class SlimeKing extends Golem implements Callback { return Random.NormalIntRange(5, 2); } - private int delay = 0; - - private boolean canTryToSummon() { - - int ratCount = 0; - for (Mob mob : Dungeon.level.mobs.toArray(new Mob[0])){ - - if (mob instanceof Rat){ - ratCount++; - } - } - if (ratCount < 3 && delay <= 0) { - return true; - } else { - return false; - } - } - private boolean chainsUsed = false; private boolean chain(int target){ if (chainsUsed || enemy.properties().contains(Property.IMMOVABLE)) @@ -197,7 +177,6 @@ public class SlimeKing extends Golem implements Callback { if (sprite.visible) { yell(Messages.get(this, "scorpion")); - //summon(); new Item().throwSound(); Sample.INSTANCE.play(Assets.Sounds.CHAINS); sprite.parent.add(new Chains(sprite.center(), enemy.sprite.center(), new Callback() { @@ -215,7 +194,7 @@ public class SlimeKing extends Golem implements Callback { } } } - //chainsUsed = true; + chainsUsed = true; return true; } @@ -229,7 +208,6 @@ public class SlimeKing extends Golem implements Callback { GameScene.updateFog(); } } - private int var2; public void move( int step ) { @@ -237,21 +215,11 @@ public class SlimeKing extends Golem implements Callback { super.move( step ); } - private void summon() { - - delay = 8; - - sprite.centerEmitter().start( Speck.factory( Speck.SCREAM ), 0.4f, 2 ); - Sample.INSTANCE.play( Assets.Sounds.CHALLENGE ); - - yell( Messages.get(this, "arise") ); - } - @Override public void notice() { super.notice(); BossHealthBar.assignBoss(this); - //Music.INSTANCE.play(Assets.BGM_BOSSA, true); + Music.INSTANCE.play(Assets.BGM_BOSSA, true); yell( Messages.get(this, "notice") ); //summon(); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Thief.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Thief.java index bee2cbb78..2f300e7b5 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Thief.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Thief.java @@ -183,7 +183,7 @@ public class Thief extends Mob { return desc; } - private class Wandering extends Mob.Wandering { + public class Wandering extends Mob.Wandering { @Override public boolean act(boolean enemyInFOV, boolean justAlerted) { @@ -198,7 +198,7 @@ public class Thief extends Mob { } } - private class Fleeing extends Mob.Fleeing { + public class Fleeing extends Mob.Fleeing { @Override protected void nowhereToRun() { if (buff( Terror.class ) == null diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/EquipableItem.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/EquipableItem.java index 409e69a24..fa9126b29 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/EquipableItem.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/EquipableItem.java @@ -33,10 +33,33 @@ import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; import com.watabou.noosa.audio.Sample; +import com.watabou.utils.Bundle; import java.util.ArrayList; public abstract class EquipableItem extends Item { + public String customName = ""; + + public String name() { + return this.customName.equals("") ? super.name() : this.customName; + } + + @Override + public void restoreFromBundle(Bundle bundle) { + super.restoreFromBundle(bundle); + if (bundle.contains("customName")) { + this.customName = bundle.getString("customName"); + } + } + + @Override + public void storeInBundle(Bundle bundle) { + super.storeInBundle(bundle); + if (!this.customName.equals("")) { + bundle.put("customName", this.customName); + } + } + public static final String AC_EQUIP = "EQUIP"; public static final String AC_UNEQUIP = "UNEQUIP"; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/wands/Wand.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/wands/Wand.java index c9ddf9236..5f341243a 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/wands/Wand.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/wands/Wand.java @@ -63,9 +63,14 @@ import com.watabou.utils.Random; import java.util.ArrayList; public abstract class Wand extends Item { - public static final String AC_ZAP = "ZAP"; + public String customName = ""; + + public String name() { + return this.customName.equals("") ? super.name() : this.customName; + } + private static final float TIME_TO_ZAP = 1f; public int maxCharges = initialCharges(); @@ -491,6 +496,10 @@ public abstract class Wand extends Item { bundle.put( PARTIALCHARGE , partialCharge ); bundle.put( CURSE_INFUSION_BONUS, curseInfusionBonus ); bundle.put( RESIN_BONUS, resinBonus ); + if (!this.customName.equals("")) { + bundle.put("customName", this.customName); + } + } @Override @@ -506,6 +515,9 @@ public abstract class Wand extends Item { curCharges = bundle.getInt( CUR_CHARGES ); curChargeKnown = bundle.getBoolean( CUR_CHARGE_KNOWN ); partialCharge = bundle.getFloat( PARTIALCHARGE ); + if (bundle.contains("customName")) { + this.customName = bundle.getString("customName"); + } } @Override diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/MagesStaff.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/MagesStaff.java index 15908ce96..99dc0f895 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/MagesStaff.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/MagesStaff.java @@ -323,7 +323,9 @@ public class MagesStaff extends MeleeWeapon { @Override public String name() { - if (wand == null) { + if (!super.customName.equals("")) { + return super.name(); + } else if (wand == null) { return super.name(); } else { String name = Messages.get(wand, "staff_name"); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/CaveTwoBossLevel.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/CaveTwoBossLevel.java index 83a114e2f..91d56eb3a 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/CaveTwoBossLevel.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/CaveTwoBossLevel.java @@ -282,7 +282,7 @@ public class CaveTwoBossLevel extends Level { public void unseal() { super.unseal(); - blobs.get(PylonEnergy.class).fullyClear(); + //blobs.get(PylonEnergy.class).fullyClear(); set( entrance, Terrain.ENTRANCE ); int i = 14 + 13*width(); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/ShopBossLevel.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/ShopBossLevel.java new file mode 100644 index 000000000..ee2ea91d8 --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/ShopBossLevel.java @@ -0,0 +1,104 @@ +package com.shatteredpixel.shatteredpixeldungeon.levels; + +import static com.shatteredpixel.shatteredpixeldungeon.levels.Terrain.WALL; +import static com.shatteredpixel.shatteredpixeldungeon.levels.Terrain.WATER; + +import com.shatteredpixel.shatteredpixeldungeon.Assets; +import com.shatteredpixel.shatteredpixeldungeon.actors.Actor; +import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob; + +public class ShopBossLevel extends Level { + + private static final int W = WALL; + private static final int X = WATER; + private static final int P = Terrain.EMPTY; + private static final int G = Terrain.EMPTY; + private static final int S = Terrain.CHASM; + private static final int R = Terrain.EMPTY_SP; + private static final int J = Terrain.WELL; + private static final int K = Terrain.ALCHEMY; + private static final int D = Terrain.STATUE; + private static final int H = Terrain.PEDESTAL; + + private static final int[] code_map = { + W,W,W,W,W,W,W,W,W,W,W,W,S,S,S,S,S,S,S,S,S,S,S,W,W,W,W,W,W,W,W,W,W,W,W, + W,J,P,P,R,P,R,P,P,P,W,W,W,S,S,S,S,S,S,S,S,S,W,W,W,P,P,P,R,P,R,P,P,J,W, + W,P,P,R,R,R,R,R,P,P,W,P,W,W,S,S,S,S,S,S,S,W,W,P,W,P,P,R,R,R,R,R,P,P,W, + W,P,R,P,R,P,R,P,R,P,W,P,P,W,W,S,S,S,S,S,W,W,P,P,W,P,R,P,R,P,R,P,R,P,W, + W,P,P,P,R,P,R,P,R,P,W,P,P,P,W,W,S,S,S,W,W,P,P,P,W,P,R,P,R,P,R,P,P,P,W, + W,P,R,R,R,K,R,R,R,P,W,P,P,P,P,W,W,S,W,W,P,P,P,P,W,P,R,R,R,K,R,R,R,P,W, + W,P,R,P,R,P,R,P,P,P,W,P,P,P,P,P,W,W,W,P,P,P,P,P,W,P,P,P,R,P,R,P,R,P,W, + W,P,R,P,R,P,R,P,R,P,W,P,P,P,P,R,P,W,P,R,P,P,P,P,W,P,R,P,R,P,R,P,R,P,W, + W,P,P,R,R,R,R,R,P,P,W,P,P,P,R,P,P,R,P,P,R,P,P,P,W,P,P,R,R,R,R,R,P,P,W, + W,P,P,P,R,P,R,P,P,W,W,P,P,R,P,P,P,R,P,P,P,R,P,P,W,W,P,P,R,P,R,P,P,P,W, + W,W,W,W,W,W,W,W,W,W,J,P,R,P,P,P,P,R,P,P,P,P,R,P,J,W,W,W,W,W,W,W,W,W,W, + W,W,P,P,P,P,P,P,P,P,P,R,R,R,R,R,R,R,R,R,R,R,R,R,P,P,P,P,P,P,P,P,P,W,W, + S,W,W,P,P,P,P,P,P,P,R,R,R,D,G,G,G,H,X,X,X,X,R,R,R,P,P,P,P,P,P,P,W,W,S, + S,S,W,W,P,P,P,P,P,R,P,R,X,R,G,G,G,R,X,X,X,R,D,R,P,R,P,P,P,P,P,W,W,S,S, + S,S,S,W,W,P,P,P,R,P,P,R,X,X,R,G,G,R,X,X,R,G,G,R,P,P,R,P,P,P,W,W,S,S,S, + S,S,S,S,W,W,P,R,P,P,P,R,X,X,X,R,D,R,X,R,G,G,G,R,P,P,P,R,P,W,W,S,S,S,S, + S,S,S,S,S,W,W,P,P,P,P,R,X,X,X,X,R,R,R,D,G,G,G,R,P,P,P,P,W,W,S,S,S,S,S, + S,S,S,S,S,S,W,W,R,R,R,R,H,R,R,R,R,R,R,R,R,R,H,R,R,R,R,W,W,S,S,S,S,S,S, + S,S,S,S,S,W,W,P,P,P,P,R,G,G,G,D,R,R,R,X,X,X,X,R,P,P,P,P,W,W,S,S,S,S,S, + S,S,S,S,W,W,P,R,P,P,P,R,G,G,G,R,X,R,D,R,X,X,X,R,P,P,P,R,P,W,W,S,S,S,S, + S,S,S,W,W,P,P,P,R,P,P,R,G,G,R,X,X,R,G,G,R,X,X,R,P,P,R,P,P,P,W,W,S,S,S, + S,S,W,W,P,P,P,P,P,R,P,R,D,R,X,X,X,R,G,G,G,R,X,R,P,R,P,P,P,P,P,W,W,S,S, + S,W,W,P,P,P,P,P,P,P,R,R,R,X,X,X,X,H,G,G,G,D,R,R,R,P,P,P,P,P,P,P,W,W,S, + W,W,P,P,P,P,P,P,P,P,P,R,R,R,R,R,R,R,R,R,R,R,R,R,P,P,P,P,P,P,P,P,P,W,W, + W,W,W,W,W,W,W,W,W,W,J,P,R,P,P,P,P,R,P,P,P,P,R,P,J,W,W,W,W,W,W,W,W,W,W, + W,P,R,P,P,P,P,P,R,W,W,P,P,R,P,P,P,R,P,P,P,R,P,P,W,W,R,P,P,P,P,P,R,P,W, + W,P,P,R,P,P,P,R,P,P,W,P,P,P,R,P,P,R,P,P,R,P,P,P,W,P,P,R,P,P,P,R,P,P,W, + W,P,P,P,R,P,R,P,P,P,W,P,P,P,P,R,P,W,P,R,P,P,P,P,W,P,P,P,R,P,R,P,P,P,W, + W,P,P,P,P,R,P,P,P,P,W,P,P,P,P,P,W,W,W,P,P,P,P,P,W,P,P,P,P,R,P,P,P,P,W, + W,P,R,R,R,K,R,R,R,P,W,P,P,P,P,W,W,S,W,W,P,P,P,P,W,P,R,R,R,K,R,R,R,P,W, + W,P,P,P,P,R,P,P,P,P,W,P,P,P,W,W,S,S,S,W,W,P,P,P,W,P,P,P,P,R,P,P,P,P,W, + W,P,R,R,R,R,R,R,R,P,W,P,P,W,W,S,S,S,S,S,W,W,P,P,W,P,R,R,R,R,R,R,R,P,W, + W,P,P,P,P,R,P,P,P,P,W,P,W,W,S,S,S,S,S,S,S,W,W,P,W,P,P,P,P,R,P,P,P,P,W, + W,J,P,P,P,R,P,P,P,P,W,W,W,S,S,S,S,S,S,S,S,S,W,W,W,P,P,P,P,R,P,P,P,J,W, + W,W,W,W,W,W,W,W,W,W,W,W,S,S,S,S,S,S,S,S,S,S,S,W,W,W,W,W,W,W,W,W,W,W,W, + }; + + { + color1 = 5459774; + color2 = 12179041; + } + + protected boolean build() { + setSize(35, 35); + map = code_map.clone(); + + this.entrance = (this.width * 25) + 17; + exit = 0; + return true; + } + + protected void createItems() { + // + } + + public Mob createMob() { + return null; + } + + protected void createMobs() { + // + } + + public int randomRespawnCell() { + return this.entrance - width(); + } + + public Actor respawner() { + return null; + } + + public String tilesTex() { + return Assets.Environment.TILES_COLD; + } + + public String waterTex() { + return Assets.Environment.WATER_COLD; + } + +} + diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/InterlevelScene.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/InterlevelScene.java index 893f7a048..7dfce1273 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/InterlevelScene.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/InterlevelScene.java @@ -175,7 +175,7 @@ public class InterlevelScene extends PixelScene { fadeTime += 0.9f; //adds 1 second total //speed up transition when debugging } else if (DeviceCompat.isDebug()){ - fadeTime = 0.1f; + fadeTime = 0.8f; } SkinnedBlock bg = new SkinnedBlock(Camera.main.width, Camera.main.height, loadingAsset ){ diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/FireBallMobSprite.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/FireBallMobSprite.java index b10c7223d..b4d32bc42 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/FireBallMobSprite.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/FireBallMobSprite.java @@ -34,7 +34,7 @@ public class FireBallMobSprite extends MobSprite { TextureFilm frames = new TextureFilm( texture, 10, 14 ); - idle = new Animation( 8, true ); + idle = new Animation( 14, true ); idle.frames( frames, 0, 1, 2, 3,0, 1, 2, 3,0, 1, 2 ,0, 1, 2, 3 ); run = new Animation( 6, true ); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/WFSprite.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/WFSprite.java new file mode 100644 index 000000000..355f5d832 --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/WFSprite.java @@ -0,0 +1,27 @@ +package com.shatteredpixel.shatteredpixeldungeon.sprites; + +import com.shatteredpixel.shatteredpixeldungeon.Assets; +import com.watabou.noosa.TextureFilm; + +public class WFSprite extends MobSprite { + + public WFSprite() { + super(); + + texture( Assets.Sprites.WFS ); + TextureFilm film = new TextureFilm( texture, 16, 16 ); + + idle = new Animation( 10, true ); + idle.frames( film, 1, 1, 1, 1, 1, 0, 0, 0, 0 ); + + die = new Animation( 20, false ); + die.frames( film, 0 ); + + run = idle.clone(); + + attack = idle.clone(); + + idle(); + } +} + 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 5524444f3..f2d3b2499 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 @@ -7,6 +7,9 @@ import com.shatteredpixel.shatteredpixeldungeon.sprites.BlueBatSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.FlameBoiSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; +import com.shatteredpixel.shatteredpixeldungeon.sprites.KagenoNusujinSprite; +import com.shatteredpixel.shatteredpixeldungeon.sprites.SRPDHBLRTT; +import com.shatteredpixel.shatteredpixeldungeon.sprites.WFSprite; import com.shatteredpixel.shatteredpixeldungeon.ui.Icons; import com.shatteredpixel.shatteredpixeldungeon.ui.Window; import com.shatteredpixel.shatteredpixeldungeon.ui.changelist.ChangeButton; @@ -18,6 +21,7 @@ import java.util.ArrayList; public class vM0_6_7_X_Changes { public static void addAllChanges(ArrayList changeInfos) { + add_v0_6_5_Changes(changeInfos); add_v0_6_4_Changes(changeInfos); add_v0_6_3_Changes(changeInfos); add_v0_6_2_Changes(changeInfos); @@ -25,6 +29,39 @@ public class vM0_6_7_X_Changes { add_v0_6_0_Changes(changeInfos); } + public static void add_v0_6_5_Changes( ArrayList changeInfos ) { + ChangeInfo changes = new ChangeInfo("v0.6.0.0-Beta20.(1-6)", 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(Icons.get(Icons.INFO), ("其他说明"), + ("1.圣境密林层贴图更新\n2.监狱BGM正式实装"))); + + changes.addButton(new ChangeButton(Icons.get(Icons.RENAME_ON), ("重命名系统"), + ("为你中意的英雄进行自定义重命名吧,击败第一大层的任意Boss解锁\n" + + "为你中意的装备进行自定义重命名吧,解锁条件同上所述。"))); + + changes = new ChangeInfo("改动", false, null); + changes.hardlight(Window.SKYBULE_COLOR); + changeInfos.add(changes); + + changes.addButton(new ChangeButton(new SRPDHBLRTT(), ("赏金猎人"), + ("伤害下调至9-12"))); + + changes.addButton(new ChangeButton(new KagenoNusujinSprite(), ("影子盗贼"), + ("AI逻辑改变"))); + + changes.addButton(new ChangeButton(new WFSprite(), ("法师初始改动"), + ("茉莉伊洛是双属性的魔法少女,拥有强大的魔力,她将会把烈焰法杖和冰雪法杖进行随机化作为初始法杖"))); + + 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_06X25"))); + } + public static void add_v0_6_4_Changes( ArrayList changeInfos ) { ChangeInfo changes = new ChangeInfo("v0.6.0.0-Beta19", true, ""); changes.hardlight(Window.TITLE_COLOR); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndInfoItem.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndInfoItem.java index f319a50d8..c4006a6d9 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndInfoItem.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndInfoItem.java @@ -21,106 +21,81 @@ package com.shatteredpixel.shatteredpixeldungeon.windows; +import com.shatteredpixel.shatteredpixeldungeon.Badges; +import com.shatteredpixel.shatteredpixeldungeon.items.EquipableItem; import com.shatteredpixel.shatteredpixeldungeon.items.Heap; import com.shatteredpixel.shatteredpixeldungeon.items.Item; +import com.shatteredpixel.shatteredpixeldungeon.items.wands.Wand; import com.shatteredpixel.shatteredpixeldungeon.scenes.PixelScene; -import com.shatteredpixel.shatteredpixeldungeon.ui.ItemSlot; import com.shatteredpixel.shatteredpixeldungeon.ui.RenderedTextBlock; import com.shatteredpixel.shatteredpixeldungeon.ui.Window; public class WndInfoItem extends Window { - - private static final float GAP = 2; - - private static final int WIDTH_MIN = 120; - private static final int WIDTH_MAX = 220; - - //only one WndInfoItem can appear at a time private static WndInfoItem INSTANCE; - public WndInfoItem( Heap heap ) { - - super(); - - if (INSTANCE != null){ - INSTANCE.hide(); + public WndInfoItem(Heap heap) { + WndInfoItem wndInfoItem = INSTANCE; + if (wndInfoItem != null) { + wndInfoItem.hide(); } INSTANCE = this; - if (heap.type == Heap.Type.HEAP) { - fillFields( heap.peek() ); - + fillFields(heap.peek()); } else { - fillFields( heap ); - + fillFields(heap); } } - - public WndInfoItem( Item item ) { - super(); - if (INSTANCE != null){ - INSTANCE.hide(); + public WndInfoItem(Item item) { + WndInfoItem wndInfoItem = INSTANCE; + if (wndInfoItem != null) { + wndInfoItem.hide(); } INSTANCE = this; - - fillFields( item ); + fillFields(item); + } + + private void fillFields(Heap heap) { + IconTitle iconTitle = new IconTitle(heap); + iconTitle.color(16777028); + layoutFields(null, iconTitle, PixelScene.renderTextBlock(heap.info(), 6)); + } + + private void fillFields(Item item) { + int color; + if ((!(item instanceof EquipableItem) || ((EquipableItem) item).customName.equals("")) && (!(item instanceof Wand) || ((Wand) item).customName.equals(""))) { + color = Window.SKYBULE_COLOR; + } else { + color = Window.CYELLOW; + } + IconTitle iconTitle = new IconTitle(item); + iconTitle.color(color); + layoutFields(item, iconTitle, PixelScene.renderTextBlock(item.info(), 6)); + } + + private void layoutFields(Item item, IconTitle iconTitle, RenderedTextBlock renderedTextBlock) { + int i = 120; + renderedTextBlock.maxWidth(120); + while (PixelScene.landscape() && renderedTextBlock.height() > 100.0f && i < 220) { + i += 20; + renderedTextBlock.maxWidth(i); + } + if (!Badges.isUnlocked(Badges.Badge.BOSS_SLAIN_1) || !(this instanceof WndUseItem) || (!(item instanceof EquipableItem) && !(item instanceof Wand))) { + iconTitle.setRect(0.0f, 0.0f, (float) i, 0.0f); + } else { + iconTitle.setRect(0.0f, 0.0f, (float) (i - 16), 0.0f); + } + add(iconTitle); + renderedTextBlock.setPos(iconTitle.left(), iconTitle.bottom() + 2.0f); + add(renderedTextBlock); + resize(i, (int) (renderedTextBlock.bottom() + 2.0f)); } @Override public void hide() { super.hide(); - if (INSTANCE == this){ + if (INSTANCE == this) { INSTANCE = null; } } - - private void fillFields(Heap heap ) { - - IconTitle titlebar = new IconTitle( heap ); - titlebar.color( TITLE_COLOR ); - - RenderedTextBlock txtInfo = PixelScene.renderTextBlock( heap.info(), 6 ); - - layoutFields(titlebar, txtInfo); - } - - private void fillFields( Item item ) { - - int color = TITLE_COLOR; - if (item.levelKnown && item.level() > 0) { - color = ItemSlot.UPGRADED; - } else if (item.levelKnown && item.level() < 0) { - color = ItemSlot.DEGRADED; - } - - IconTitle titlebar = new IconTitle( item ); - titlebar.color( color ); - - RenderedTextBlock txtInfo = PixelScene.renderTextBlock( item.info(), 6 ); - - layoutFields(titlebar, txtInfo); - } - - private void layoutFields(IconTitle title, RenderedTextBlock info){ - int width = WIDTH_MIN; - - info.maxWidth(width); - - //window can go out of the screen on landscape, so widen it as appropriate - while (PixelScene.landscape() - && info.height() > 100 - && width < WIDTH_MAX){ - width += 20; - info.maxWidth(width); - } - - title.setRect( 0, 0, width, 0 ); - add( title ); - - info.setPos(title.left(), title.bottom() + GAP); - add( info ); - - resize( width, (int)(info.bottom() + 2) ); - } -} +} \ No newline at end of file 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 5bccb425a..9ba4a7010 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndSettings.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndSettings.java @@ -287,9 +287,6 @@ public class WndSettings extends WndTabbed { Boolean landscape = SPDSettings.landscape(); if (landscape == null){ landscape = Game.width > Game.height; - } else { - SPDSettings.toolbarMode(Toolbar.Mode.SPLIT.name()); - Toolbar.updateLayout(); } Boolean finalLandscape = landscape; btnOrientation = new RedButton(finalLandscape ? diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndStartGame.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndStartGame.java index e0bc8964b..c5a23d528 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndStartGame.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndStartGame.java @@ -90,8 +90,10 @@ public class WndStartGame extends Window { } } ); } - }; + }; + chkSaver.active = false; + chkSaver.alpha(0.5f); chkSaver.icon(new ItemSprite(ItemSpriteSheet.DG26, null)); add( chkSaver ); buttons.add(chkSaver); @@ -102,7 +104,7 @@ public class WndStartGame extends Window { public void onClick() { if(Badges.isUnlocked(Badges.Badge.BOSS_SLAIN_1)){ Game.runOnRenderThread(() -> ShatteredPixelDungeon.scene().add(new WndTextInput(Messages.get(WndStartGame.class,"custom_name"), - Messages.get(WndStartGame.class, "custom_name_desc")+SPDSettings.heroName(),null, SPDSettings.heroName(), 20, + Messages.get(WndStartGame.class, "custom_name_desc")+SPDSettings.heroName(),null, 20, false, Messages.get(WndStartGame.class,"custom_name_set"), Messages.get(WndStartGame.class,"custom_name_clear")){ @Override @@ -311,16 +313,15 @@ public class WndStartGame extends Window { public void update() { if( !visible && GamesInProgress.selectedClass != null){ visible = true; + optionsPane.setRect(WIDTH-50, HEIGHT-120, 20, 20); } super.update(); } }; optionsPane.layout(); - - optionsPane.setRect(WIDTH-50, HEIGHT-120, 20, 20); optionsPane.visible = false; add(optionsPane); - + optionsPane.setRect(WIDTH-500, HEIGHT-1200, 20, 20); resize(WIDTH, HEIGHT); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndTextInput.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndTextInput.java index 6ac4cf49d..619ffa409 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndTextInput.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndTextInput.java @@ -38,7 +38,7 @@ public class WndTextInput extends Window { protected TextInput textBox; - public WndTextInput(String custom_name, final String title, final String body, String s, final int maxLength, + public WndTextInput(final String title, final String body, final String initialValue, final int maxLength, final boolean multiLine, final String posTxt, final String negTxt) { super(); @@ -61,9 +61,9 @@ public class WndTextInput extends Window { float pos = 2; if (title != null) { - final RenderedTextBlock txtTitle = PixelScene.renderTextBlock(title, 7); + final RenderedTextBlock txtTitle = PixelScene.renderTextBlock(title, 9); txtTitle.maxWidth(width); - //txtTitle.hardlight(Window.TITLE_COLOR); + txtTitle.hardlight(Window.TITLE_COLOR); txtTitle.setPos((width - txtTitle.width()) / 2, 2); add(txtTitle); @@ -88,7 +88,7 @@ public class WndTextInput extends Window { hide(); } }; - + if (initialValue != null) textBox.setText(initialValue); textBox.setMaxLength(maxLength); //sets different height depending on whether this is a single or multi line input. diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndUseItem.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndUseItem.java index 15abe18dd..d747edf6d 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndUseItem.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndUseItem.java @@ -21,31 +21,38 @@ package com.shatteredpixel.shatteredpixeldungeon.windows; +import com.shatteredpixel.shatteredpixeldungeon.Badges; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; +import com.shatteredpixel.shatteredpixeldungeon.items.EquipableItem; import com.shatteredpixel.shatteredpixeldungeon.items.Item; +import com.shatteredpixel.shatteredpixeldungeon.items.wands.Wand; +import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; +import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; +import com.shatteredpixel.shatteredpixeldungeon.ui.IconButton; +import com.shatteredpixel.shatteredpixeldungeon.ui.Icons; import com.shatteredpixel.shatteredpixeldungeon.ui.InventoryPane; import com.shatteredpixel.shatteredpixeldungeon.ui.RedButton; import com.shatteredpixel.shatteredpixeldungeon.ui.Window; +import com.watabou.noosa.Image; import java.util.ArrayList; public class WndUseItem extends WndInfoItem { private static final float BUTTON_HEIGHT = 16; - - private static final float GAP = 2; - - public WndUseItem( final Window owner, final Item item ) { - - super(item); + private static final float GAP = 2; + + public WndUseItem( final Window owner, final Item item ) { + + super(item); float y = height; - + if (Dungeon.hero.isAlive() && Dungeon.hero.belongings.contains(item)) { y += GAP; ArrayList buttons = new ArrayList<>(); for (final String action : item.actions( Dungeon.hero )) { - + RedButton btn = new RedButton( item.actionName(action, Dungeon.hero), 8 ) { @Override protected void onClick() { @@ -55,7 +62,7 @@ public class WndUseItem extends WndInfoItem { item.execute( Dungeon.hero, action ); } Item.updateQuickslot(); - if (action == item.defaultAction && item.usesTargeting && owner == null){ + if (action.equals(item.defaultAction) && item.usesTargeting && owner == null){ InventoryPane.useTargeting(); } } @@ -67,21 +74,75 @@ public class WndUseItem extends WndInfoItem { if (action.equals(item.defaultAction)) { btn.textColor( TITLE_COLOR ); } - + if (Badges.isUnlocked(Badges.Badge.BOSS_SLAIN_1)) { + label43: { + boolean var9 = item instanceof EquipableItem; + if (!var9) { + if (!(item instanceof Wand)) { + break label43; + } + } + Image var12 = Icons.get(Icons.RENAME_OFF); + Image var11 = var12; + if (var9) { + if (!((EquipableItem)item).customName.equals("")) { + var11 = Icons.get(Icons.RENAME_ON); + } + } + + if (item instanceof Wand) { + if (!((Wand)item).customName.equals("")) { + Icons.get(Icons.RENAME_ON); + } + } + + IconButton Rename = new IconButton(var11) { + public String hoverText() { + return Messages.titleCase(Messages.get(WndGame.class, "rename")); + } + + public void onClick() { + GameScene.show(new WndTextInput(Messages.get(WndGame.class, "dialog"), Messages.get(WndGame.class, "dialog_title"), item.name(), 30, false, Messages.get(WndGame.class, "dialog_rename"), Messages.get(WndGame.class, "dialog_revert")) { + public void onSelect(boolean name, String str) { + if (name) { + if (item instanceof EquipableItem) { + ((EquipableItem) item).customName = str; + } else { + ((Wand) item).customName = str; + } + } else { + if (item instanceof EquipableItem) { + ((EquipableItem) item).customName = ""; + } else { + ((Wand) item).customName = ""; + } + } + + WndUseItem.this.hide(); + GameScene.show(new WndUseItem(owner, item)); + } + }); + } + }; + Rename.setRect((float)(super.width - 16), 0.0F, 16.0F, 16.0F); + this.add(Rename); + } + } + } y = layoutButtons(buttons, width, y); } - + resize( width, (int)(y) ); } private static float layoutButtons(ArrayList buttons, float width, float y){ ArrayList curRow = new ArrayList<>(); float widthLeftThisRow = width; - + while( !buttons.isEmpty() ){ RedButton btn = buttons.get(0); - + widthLeftThisRow -= btn.width(); if (curRow.isEmpty()) { curRow.add(btn); @@ -93,22 +154,22 @@ public class WndUseItem extends WndInfoItem { buttons.remove(btn); } } - + //layout current row. Currently forces a max of 3 buttons but can work with more if (buttons.isEmpty() || widthLeftThisRow <= 0 || curRow.size() >= 3){ - + //re-use this variable for laying out the buttons widthLeftThisRow = width - (curRow.size()-1); for (RedButton b : curRow){ widthLeftThisRow -= b.width(); } - + //while we still have space in this row, find the shortest button(s) and extend them while (widthLeftThisRow > 0){ - + ArrayList shortest = new ArrayList<>(); RedButton secondShortest = null; - + for (RedButton b : curRow) { if (shortest.isEmpty()) { shortest.add(b); @@ -124,9 +185,9 @@ public class WndUseItem extends WndInfoItem { } } } - + float widthToGrow; - + if (secondShortest == null){ widthToGrow = widthLeftThisRow / shortest.size(); widthLeftThisRow = 0; @@ -139,28 +200,28 @@ public class WndUseItem extends WndInfoItem { widthLeftThisRow -= widthToGrow * shortest.size(); } } - + for (RedButton toGrow : shortest){ toGrow.setRect(0, 0, toGrow.width()+widthToGrow, toGrow.height()); } } - + //finally set positions float x = 0; for (RedButton b : curRow){ b.setRect(x, y, b.width(), b.height()); x += b.width() + 1; } - + //move to next line and reset variables y += BUTTON_HEIGHT+1; widthLeftThisRow = width; curRow.clear(); - + } - + } - + return y - 1; }