From 89d9690c2430d7a52945f64010fe06da9d113382 Mon Sep 17 00:00:00 2001 From: LingASDJ <2735951230@qq.com> Date: Wed, 21 Jun 2023 00:57:38 +0800 Subject: [PATCH] Update Beta3.6-V0630 --- .../android/AndroidGame.java | 1 - build.gradle | 4 +- core/src/main/assets/interfaces/icons.png | Bin 18472 -> 18609 bytes .../assets/messages/actors/actors.properties | 15 +- .../assets/messages/items/items.properties | 2 +- .../main/assets/messages/misc/misc.properties | 2 +- .../src/main/assets/messages/ui/ui.properties | 4 + .../messages/windows/windows.properties | 3 + .../shatteredpixeldungeon/BGMPlayer.java | 92 ++++---- .../actors/buffs/ChampionEnemy.java | 91 ++++++-- .../actors/mobs/Mob.java | 205 +++++++++--------- .../actors/mobs/bosses/DCrystal.java | 2 +- .../actors/mobs/bosses/FireMagicDied.java | 4 +- .../actors/mobs/npcs/AutoShopReBot.java | 6 +- .../actors/mobs/npcs/NullDiedTO.java | 5 +- .../actors/mobs/npcs/Nyz.java | 9 +- .../actors/mobs/npcs/RenShop.java | 5 +- .../scenes/FeedBackScene.java | 5 +- .../shatteredpixeldungeon/scenes/GoScene.java | 5 +- .../scenes/JAmuletScene.java | 5 +- .../scenes/SPSLScene.java | 5 +- .../sprites/CharSprite.java | 19 ++ .../shatteredpixeldungeon/ui/Icons.java | 5 + .../shatteredpixeldungeon/ui/MenuPane.java | 24 ++ .../ui/changelist/mlpd/vM0_6_7_X_Changes.java | 82 +++++-- .../windows/WndRedDragon.java | 4 +- .../services/analytics/Analytics.java | 4 + 27 files changed, 406 insertions(+), 202 deletions(-) create mode 100644 services/src/main/java/com/shatteredpixel/shatteredpixeldungeon/services/analytics/Analytics.java diff --git a/android/src/main/java/com/shatteredpixel/shatteredpixeldungeon/android/AndroidGame.java b/android/src/main/java/com/shatteredpixel/shatteredpixeldungeon/android/AndroidGame.java index 717f16682..7d930eb78 100644 --- a/android/src/main/java/com/shatteredpixel/shatteredpixeldungeon/android/AndroidGame.java +++ b/android/src/main/java/com/shatteredpixel/shatteredpixeldungeon/android/AndroidGame.java @@ -33,7 +33,6 @@ import com.badlogic.gdx.backends.android.AndroidApplication; import com.badlogic.gdx.backends.android.AndroidApplicationConfiguration; import com.badlogic.gdx.backends.android.AndroidAudio; import com.badlogic.gdx.backends.android.AsynchronousAndroidAudio; -import com.google.firebase.analytics.FirebaseAnalytics; import com.shatteredpixel.shatteredpixeldungeon.SPDSettings; import com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon; import com.shatteredpixel.shatteredpixeldungeon.services.news.GameNesImpl; diff --git a/build.gradle b/build.gradle index 087fc5261..a2192eb8f 100644 --- a/build.gradle +++ b/build.gradle @@ -17,8 +17,8 @@ allprojects { appName = 'Magic Ling Pixel Dungeon' appPackageName = 'com.ansdomagiclingpixeldungeon.ling' - appVersionCode =900904 - appVersionName = '0.6.3.0-Beta3.1' + appVersionCode =900906 + appVersionName = '0.6.3.0-Beta3.6' appJavaCompatibility = JavaVersion.VERSION_11 diff --git a/core/src/main/assets/interfaces/icons.png b/core/src/main/assets/interfaces/icons.png index d9d7a3107e22e711e5a59a8076c18b8861ffa219..a1e2cdbb5741bc44252a9e58e4916b5e8420a506 100644 GIT binary patch literal 18609 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 RJ!}8~002ovPDHLkV1m5WqOt%0 literal 18472 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 TY0S&m00000NkvXXu0mjfRb@xA diff --git a/core/src/main/assets/messages/actors/actors.properties b/core/src/main/assets/messages/actors/actors.properties index 2c9f7b772..9b60431f7 100644 --- a/core/src/main/assets/messages/actors/actors.properties +++ b/core/src/main/assets/messages/actors/actors.properties @@ -996,6 +996,9 @@ actors.buffs.championenemy$big.desc=攻击力提升20%,攻击有20%概率造成 actors.buffs.championenemy$longsider.name=突变烟雾体 actors.buffs.championenemy$longsider.desc=攻击力减少10%,攻击范围+2,攻击敌人10%概率造成眩晕……\n\n突变烟雾体喜好在远处骚扰敌人,他就像烟雾一样来无影去无踪…… +actors.buffs.championenemy$sider.name=突变酸液体 +actors.buffs.championenemy$sider.desc=该词条的敌人获得远程攻击,攻击范围+6,造成自身可造成的伤害20%的额外法术伤害并有概率随机产生一种有害烟雾。\n\n突变酸液体喜欢使用酸液来攻击敌人,他们的酸液不稳定性可以造成大量伤害,但是这种致命的酸液需要时间来准备,因此他们的攻击速度会降低_200%_。 + actors.buffs.charm.name=魅惑 actors.buffs.charm.heromsg=你被魅惑了! @@ -1349,10 +1352,14 @@ actors.hero.heroclass.warrior_desc_item=蕾零安洁初始携带一枚可以贴 actors.hero.heroclass.warrior_desc_loadout=蕾零安洁初始携带一把_破损的短剑。_这把武器的直接近战伤害是所有初始武器中最高的。\n\n蕾零安洁初始携带_三块石子。_石子可以扔出攻击远处,造成一定的少量伤害。\n\n蕾零安洁初始携带一个可以收纳各种药水并保护药水瓶不被冻碎的_药水架。_\n\n蕾零安洁初始携带一个不会被消耗的_唤魔晶柱_ actors.hero.heroclass.warrior_desc_misc=蕾零安洁每次食用食物时都能恢复少量生命值。\n\n蕾零安洁开局鉴定的物品有:\n- 鉴定卷轴\n- 治疗药水\n- 盛怒卷轴\n\n蕾零安洁初始携带一个不会被消耗的_唤魔晶柱_ actors.hero.heroclass.warrior_desc_subclasses=在击杀第二个Boss后可以选择一种专精。蕾零安洁可以在两种专精中二选一: -actors.hero.heroclass.warrior_story=.... -actors.hero.heroclass.huntress_story=剧情故事待补充-456 -actors.hero.heroclass.rogue_story=剧情故事待补充-789 -actors.hero.heroclass.mage_story=剧情故事待补充-101112 + +actors.hero.heroclass.warrior_story=蕾蕶安洁--战术策略\n\n她出生于霜落帝国,这里常年都是寒风刺骨的状态。蕾蕶安洁是毕业于战术高等学府的优秀学员。她不主张使用魔法,而是在于攻防兼备。她的家族世世代代都以战术策略为主,她的家族是霜落帝国中为数不多的仍然未使用魔法或者特殊能力的家族。\n如今由于地表三巨头的诱人悬赏,加上她自己也有来地牢的一些调查,她就此来到了这里。 + +actors.hero.heroclass.huntress_story=颐莲梅錵--精灵血裔\n\n颐莲梅錵诞生于绿林圣境,这里是精灵的聚集地。她的母亲是这里的最高管理者,然而,她向往外面的世界,不希望自己就一直在母亲的保护和圣境的结界中过完一生。为此,她私自开启了结界,这带来了一场重大的变故。最后还是她母亲发现异常后重新修补了结界,但她本人从此在圣境中消失了。最高管理者其实什么都知道,为此也没有派人寻找她....\n\n多年后,她为了提升自己的力量前往了这里。地牢深处的宝物是她此行的目的,而她不知道的是,她已是最后一位精灵血裔... + +actors.hero.heroclass.rogue_story=极影铃虹--迷离少女\n\n极影铃虹出生于深渊魔都,是拥有皇家血脉的人。然而,她在每次外出的时候,都会看见底层的人们深受生活的折磨,并且遭到贵族的歧视。这些现象都给纯洁无知的她带来了很多影响,自那以后,皇室中总有一个黑影盗窃东西,都是由于这个黑影每次盗窃的都是食物方面。为此皇室高层是搁置不管此事。皇室高层在外巡游的时候,听到底层的人们谈论有一个蒙着面纱的女性将食物送给他们。皇室高层自然联想到了那个黑影......\n但是,并没有人知道是她。而她听说地牢最深处的东西可以实现愿望,便说服自己的父亲来到了这里,父亲在她的斗篷中植入了一颗暗黑的种子,必要时刻,它会保护她前行。 + +actors.hero.heroclass.mage_story=茉莉伊洛--渊初少女\n\n茉莉伊洛的出生地并不是这片国土,而是远在天边的神秘之境。那里魔力满溢,每个人都是这里的顶尖魔法师。她因为一些变故,离开了自己的家乡,来到了地表三巨头管辖的区域,并且在法师学府毕业。懂得强大的冰与火的魔力,能在战斗中随机应变。但由于她并不属于这里,这里的魔力束缚了她,为此她的真正力量从未显现。她为了调查有关于水晶之心的谜团,便前往来到这地牢的面前.... actors.hero.heroclass.mage=茉莉伊洛 actors.hero.heroclass.mage_unlock=茉莉伊洛精通各类法杖,并在开局时持有一根_独特的魔杖_。\n\n_在一局游戏中使用两张升级卷轴_以解锁茉莉伊洛。 diff --git a/core/src/main/assets/messages/items/items.properties b/core/src/main/assets/messages/items/items.properties index 293842fc1..3709686c9 100644 --- a/core/src/main/assets/messages/items/items.properties +++ b/core/src/main/assets/messages/items/items.properties @@ -2145,7 +2145,7 @@ items.weapon.weapon.identify=你对手中的武器已经足够熟悉并将其完 items.weapon.weapon.too_heavy=因为你的力量不足,该武器会降低你的攻速和精准,并让你无法偷袭。 items.weapon.weapon.excess_str=你的额外力量让你在使用这件武器时最多能够造成_%d点额外伤害_。 items.weapon.weapon.incompatible=不同属性的魔法相冲突,消除了武器上的附魔! -items.weapon.weapon.cursed_worn=由于这件武器被诅咒,你无法将其放下。 +items.weapon.weapon.cursed_worn=由于这件武器被诅咒,你无f法将其放下。 items.weapon.weapon.cursed=你能感觉到这件武器里潜伏着一股充满恶意的魔力。 items.weapon.weapon.not_cursed=这件武器没有被诅咒。 items.weapon.weapon.faster=这件武器强化了_攻速_。 diff --git a/core/src/main/assets/messages/misc/misc.properties b/core/src/main/assets/messages/misc/misc.properties index a0210ea7c..dfd732279 100644 --- a/core/src/main/assets/messages/misc/misc.properties +++ b/core/src/main/assets/messages/misc/misc.properties @@ -317,7 +317,7 @@ challenges.rlpt = ]支离破碎] challenges.rlpt_desc=地下涌动的神秘力量正在渐渐腐蚀这里,这里不过是而言是另一场噩梦。\n\n从第六层开始,怪物必定有几个不是本大层的怪物,但不会超过两级。一般来说,在监狱遇到矮人层的怪物几率很小。通常遇到矿洞层的怪物。 challenges.sbsg = ]基因突变] -challenges.sbsg_desc=地牢中的神秘魔力让一些生物发生了重大的变化\n-所有生物都会因为突变激素变得各不相同,给探索地牢的脚步带来更大的困难。\n-敌人有5种突变类型:\n突变失败体_(30%概率)_:近战伤害减少35%,移速提高到1.3。\n突变爆炸体_(25%概率)_:移速减少50%,攻击力降低30%,但死亡时拥有爆炸伤害。\n突变完全体_(20%概率)_:移速和攻击力各提高25%,且拥有30%伤害减免。\n突变危险体_(15%概率)_:攻击力提升20%,攻击有10%概率造成流血。死亡时有5%概率立刻向本层发出警报。\n突变烟雾体_(10%概率)_:攻击力减少10%,攻击范围+2,攻击敌人10%概率造成眩晕……\n\n_特别说明:如果开启精英强敌,词条会和精英词条共存_ +challenges.sbsg_desc=地牢中的神秘魔力让一些生物发生了重大的变化\n-所有生物都会因为突变激素变得各不相同,给探索地牢的脚步带来更大的困难。\n-敌人有6种突变类型,且Roll出权重一致:\n\n突变失败体:近战伤害减少35%,移速提高到1.3。\n\n突变爆炸体:移速减少50%,攻击力降低30%,但死亡时拥有爆炸伤害。\n\n突变完全体:移速和攻击力各提高25%,且拥有30%伤害减免。\n\n突变危险体:攻击力提升20%,攻击有10%概率造成流血。死亡时有5%概率立刻向本层发出警报。\n\n突变烟雾体:攻击力减少10%,攻击范围+2,攻击敌人10%概率造成眩晕……\n\n突变酸液体:敌人获得额外远程技能,攻击范围+6,造成自身可造成的伤害20%的额外法术伤害并有概率随机产生一种有害烟雾(酸雾,毒雾,眩雾)\n\n_特别说明:如果开启精英强敌,词条会和精英词条共存,届时你将遭遇更大的挑战_ challenges.exsg = ]药水癔症] challenges.exsg_desc=药水癔症详细规则:\n力量药水--60%概率力量-1\n灵视药剂--60%概率喝后失明5回合\n隐形药剂--60%概率喝后立刻怒吼\n极速药剂--60%概率喝后立刻残废8回合\n==========================\n小型口粮-吃后立刻获得极速4回合\n冷冻生肉片-吃后获得奥术护盾\n全肉大饼-吃后立刻获得8回合极速,且有大概率+1力量(_随着力量的追加,获得力量的概率会渐渐变低_)\n\n高级药水_(合剂/魔药)_不受影响\n不知道何种原因,大部分正面药水你都感觉有毒!\n你的臆想会导致药水有毒,但食物却会很有用!而且地牢里面还会追加自动售货机,会售卖一些更加高级的东西。 diff --git a/core/src/main/assets/messages/ui/ui.properties b/core/src/main/assets/messages/ui/ui.properties index 1eb249a3c..c81aeac69 100644 --- a/core/src/main/assets/messages/ui/ui.properties +++ b/core/src/main/assets/messages/ui/ui.properties @@ -535,4 +535,8 @@ ui.changelist.mlpd.vm0_6_7_x_changes.bug_06x73=-V0.6.3-Beta1.5\n1.修复时光 ui.changelist.mlpd.vm0_6_7_x_changes.bug_06x74=-V0.6.3-Beta2.0\n1.修复BossRush的一些问题\n2.改善部分代码 +ui.changelist.mlpd.vm0_6_7_x_changes.bug_06x75=-V0.6.3-Beta3.5\n1.修复一些错误,修复DM720概率为40%而非20%的问题。\n2.PC端音乐崩溃属于正常现象,后续更新会优化,如果崩溃重启即可。 + +ui.changelist.mlpd.vm0_6_7_x_changes.bug_06x76=-V0.6.3-Beta3.6\n1.修复PC端音乐偶尔崩溃的问题\n2.修复一些文案错误 + //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 96c083521..e7d25b7e3 100644 --- a/core/src/main/assets/messages/windows/windows.properties +++ b/core/src/main/assets/messages/windows/windows.properties @@ -154,6 +154,9 @@ windows.bosssettingwindows.bossgold=在游戏中,随着你探索的深度, windows.bosssettingwindows.bug=购买通行证 windows.bosssettingwindows.not_yet=取消 windows.bosssettingwindows.no_money=ERROR:你的金币不够,无法购买通行证。 + +windows.bosssettingwindows.no_level=ERROR:不能在交界处退还金币。 + windows.bosssettingwindows.getboss=染血金币控制终端已经为你打开一条秘密通道,其路径通往: windows.bosssettingwindows.takenotapplic=你已取消挑战此领袖,已返还金币: windows.bosssettingwindows.cancal=ERROR:用户取消购买,已自动关闭。 diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/BGMPlayer.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/BGMPlayer.java index 974712807..33e5406c5 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/BGMPlayer.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/BGMPlayer.java @@ -3,9 +3,22 @@ package com.shatteredpixel.shatteredpixeldungeon; import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.depth; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.LockedFloor; +import com.watabou.noosa.Game; import com.watabou.noosa.audio.Music; +import com.watabou.utils.Callback; public class BGMPlayer { + + + public static void playBGM(String name, boolean loop) { + Game.runOnRenderThread(new Callback() { + @Override + public void call() { + Music.INSTANCE.play(name, loop); + } + }); + } + public static void playBGMWithDepth() { if (Dungeon.hero != null) { if (Dungeon.hero.buff(LockedFloor.class) != null) { @@ -18,44 +31,44 @@ public class BGMPlayer { if (Dungeon.isDLC(Conducts.Conduct.BOSSRUSH)) { if (d == -1) { - Music.INSTANCE.play(Assets.SNOWCYON, true); + playBGM(Assets.SNOWCYON, true); }else if (d == 0||d==27) { - Music.INSTANCE.play(Assets.SNOWCYON, true); + playBGM(Assets.SNOWCYON, true); } else if (d > 0 && d <= 5) { - Music.INSTANCE.play(Assets.BGM_1, true); + playBGM(Assets.BGM_1, true); } else if (d > 5 && d <= 10) { - Music.INSTANCE.play(Assets.BGM_2, true); + playBGM(Assets.BGM_2, true); } else if (d > 10 && d <= 15) { - Music.INSTANCE.play(Assets.BGM_3, true); + playBGM(Assets.BGM_3, true); } else if (d > 15 && d <= 20) { - Music.INSTANCE.play(Assets.BGM_4, true); + playBGM(Assets.BGM_4, true); } else if (d > 20 && d <= 26) { - Music.INSTANCE.play(Assets.BGM_5, true); + playBGM(Assets.BGM_5, true); } else if (d ==-5||d ==-15) { - Music.INSTANCE.play(Assets.SNOWCYON, true); + playBGM(Assets.SNOWCYON, true); } else //default - Music.INSTANCE.play(Assets.Music.THEME, true); + playBGM(Assets.Music.THEME, true); } else { if (d == -1) { - Music.INSTANCE.play(Assets.TOWN, true); + playBGM(Assets.TOWN, true); }else if (d == 0) { - Music.INSTANCE.play(Assets.TOWN, true); + playBGM(Assets.TOWN, true); } else if (d > 0 && d <= 5) { - Music.INSTANCE.play(Assets.BGM_1, true); + playBGM(Assets.BGM_1, true); } else if (d > 5 && d <= 10) { - Music.INSTANCE.play(Assets.BGM_2, true); + playBGM(Assets.BGM_2, true); } else if (d > 10 && d <= 15) { - Music.INSTANCE.play(Assets.BGM_3, true); + playBGM(Assets.BGM_3, true); } else if (d > 15 && d <= 20) { - Music.INSTANCE.play(Assets.BGM_4, true); + playBGM(Assets.BGM_4, true); } else if (d > 20 && d <= 26) { - Music.INSTANCE.play(Assets.BGM_5, true); + playBGM(Assets.BGM_5, true); } else if (d ==-5||d ==-15) { - Music.INSTANCE.play(Assets.SNOWCYON, true); + playBGM(Assets.SNOWCYON, true); } else //default - Music.INSTANCE.play(Assets.Music.THEME, true); + playBGM(Assets.Music.THEME, true); } @@ -105,57 +118,54 @@ public class BGMPlayer { if (Dungeon.isDLC(Conducts.Conduct.BOSSRUSH)) { switch (depth){ case 2: - Music.INSTANCE.play(Assets.BGM_BOSSA, true); + playBGM(Assets.BGM_BOSSA, true); break; case 4:case 5: - Music.INSTANCE.play(Assets.BGM_BOSSB, true); - break; + playBGM(Assets.BGM_BOSSB, true); + break; case 8: case 10: - Music.INSTANCE.play(Assets.BGM_BOSSC, true); + playBGM(Assets.BGM_BOSSC, true); break; case 12: case 14: - Music.INSTANCE.play(Assets.BGM_BOSSD, true); + playBGM(Assets.BGM_BOSSD, true); break; case 16: - Music.INSTANCE.play(Assets.BGM_BOSSC3, true); + playBGM(Assets.BGM_BOSSC3, true); break; case 19: case 21: - Music.INSTANCE.play(Assets.BGM_BOSSD2, true); + playBGM(Assets.BGM_BOSSD2, true); break; case 25: - Music.INSTANCE.play(Assets.BGM_FRBOSS, true); + playBGM(Assets.BGM_FRBOSS, true); break; case 26: - Music.INSTANCE.play(Assets.BGM_BOSSE3, true); + playBGM(Assets.BGM_BOSSE3, true); break; case 28: - Music.INSTANCE.play( Assets.BGM_0, true ); + playBGM( Assets.BGM_0, true ); break; } } else { if (Dungeon.bossLevel() && t == 5) { - Music.INSTANCE.play(Assets.BGM_BOSSA, true); + playBGM(Assets.BGM_BOSSA, true); } else if (Dungeon.bossLevel() && t == 10) { - Music.INSTANCE.play(Assets.BGM_BOSSB, true); + playBGM(Assets.BGM_BOSSB, true); } else if (Dungeon.bossLevel() && t == 15 && Statistics.spawnersIce > 0) { - Music.INSTANCE.play(Assets.BGM_BOSSC3, true); + playBGM(Assets.BGM_BOSSC3, true); } else if (Dungeon.bossLevel() && t == 15) { - if((Statistics.boss_enhance & 0x4) != 0) Music.INSTANCE.play(Assets.BGM_BOSSC3, true); - else Music.INSTANCE.play(Assets.BGM_BOSSC, true); + if((Statistics.boss_enhance & 0x4) != 0) playBGM(Assets.BGM_BOSSC3, true); + else playBGM(Assets.BGM_BOSSC, true); } else if (Dungeon.bossLevel() && t == 20) { - if((Statistics.boss_enhance & 0x8) != 0) Music.INSTANCE.play(Assets.BGM_BOSSD2, true); - else Music.INSTANCE.play(Assets.BGM_BOSSD, true); + if((Statistics.boss_enhance & 0x8) != 0) playBGM(Assets.BGM_BOSSD2, true); + else playBGM(Assets.BGM_BOSSD, true); } else if (Dungeon.bossLevel() && t == 25 && (Statistics.spawnersAlive > 0)) { - Music.INSTANCE.play(Assets.BGM_BOSSE3, true); + playBGM(Assets.BGM_BOSSE3, true); }else if (Dungeon.bossLevel() && t == 25){ - Music.INSTANCE.play(Assets.BGM_BOSSE, true); + playBGM(Assets.BGM_BOSSE, true); } else if (Dungeon.bossLevel() && t == -15) { - Music.INSTANCE.play(Assets.BGM_FRBOSS, true); + playBGM(Assets.BGM_FRBOSS, true); } } - - - } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/ChampionEnemy.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/ChampionEnemy.java index d426f3e5a..bb4e20055 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/ChampionEnemy.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/ChampionEnemy.java @@ -21,11 +21,16 @@ package com.shatteredpixel.shatteredpixeldungeon.actors.buffs; +import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Challenges; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Blob; +import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.ConfusionGas; +import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.CorrosiveGas; import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Fire; +import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.StormCloud; +import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.ToxicGas; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob; import com.shatteredpixel.shatteredpixeldungeon.items.bombs.Bomb; import com.shatteredpixel.shatteredpixeldungeon.levels.traps.AlarmTrap; @@ -33,7 +38,9 @@ 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.noosa.audio.Sample; import com.watabou.utils.Bundle; +import com.watabou.utils.Callback; import com.watabou.utils.PathFinder; import com.watabou.utils.Random; @@ -107,21 +114,25 @@ public abstract class ChampionEnemy extends Buff { Class buffCls; - if (Random.Float() < 0.3f) { - //30% - buffCls = ChampionEnemy.Small.class; - } else if (Random.Float() < 0.25f) { - //25% - buffCls = ChampionEnemy.Bomber.class; - } else if (Random.Float() < 0.2f) { - //20% - buffCls = ChampionEnemy.Middle.class; - } else if (Random.Float() < 0.15f) { - //15% - buffCls = ChampionEnemy.Big.class; - } else { - //10% - buffCls = ChampionEnemy.LongSider.class; + switch (Random.NormalIntRange(0,6)){ + case 0: default: + buffCls = ChampionEnemy.Small.class; + break; + case 1: + buffCls = ChampionEnemy.Bomber.class; + break; + case 2: + buffCls = ChampionEnemy.Middle.class; + break; + case 3: + buffCls = ChampionEnemy.Big.class; + break; + case 4: + buffCls = ChampionEnemy.Sider.class; + break; + case 5: + buffCls = ChampionEnemy.LongSider.class; + break; } if (Dungeon.mobsToStateLing <= 0 && Dungeon.isChallenged(Challenges.SBSG)) { @@ -158,6 +169,56 @@ public abstract class ChampionEnemy extends Buff { } + } + + public static class Sider extends ChampionEnemy implements Callback { + { + color = 0xe59d9d; + } + + public static class DarkBolt{} + + public void onZapComplete() { + next(); + } + + @Override + public void call() { + next(); + } + + @Override + public boolean canAttackWithExtraReach(Char enemy) { + //attack range of 2 + /** 实现效果,此外还要关联CharSprite.java和Mob.java以实现远程效果*/ + + if(Random.Float()<0.1f) { + switch (Random.NormalIntRange(0,5)){ + //默认为毒雾 + case 1:default: + GameScene.add(Blob.seed(enemy.pos, 45, ToxicGas.class)); + break; + case 2: + GameScene.add(Blob.seed(enemy.pos, 45, CorrosiveGas.class)); + break; + case 3: + GameScene.add(Blob.seed(enemy.pos, 45, ConfusionGas.class)); + break; + case 4: + GameScene.add(Blob.seed(enemy.pos, 45, StormCloud.class)); + break; + } + Sample.INSTANCE.play( Assets.Sounds.DEBUFF ); + } + + target.sprite.zaplink( enemy.pos ); + int dmg = Random.NormalIntRange( target.damageRoll()/5+3, target.damageRoll()/5+7 ); + enemy.damage( dmg, new DarkBolt() ); + return target.fieldOfView[enemy.pos] && Dungeon.level.distance(target.pos, enemy.pos) <= 6; + } + + + } public static class Small extends ChampionEnemy { 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 d03848c0e..78cf94c19 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 @@ -45,7 +45,6 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Charm; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Corruption; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Dread; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Hunger; -import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.LockedFloor; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Preparation; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Sleep; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.SoulMark; @@ -92,10 +91,14 @@ import java.util.HashSet; public abstract class Mob extends Char { + public void onZapComplete() { + next(); + } + public float scaleFactor = 1f; { actPriority = MOB_PRIO; - + alignment = Alignment.ENEMY; } public ArrayList items; @@ -107,11 +110,11 @@ public abstract class Mob extends Char { public void updateHT(boolean boostHP) { if(Dungeon.isDIFFICULTY(EASY)){ - HP = HT = (int) (0.8f * HP); + HP = HT = (int) (0.8f * HP); } else if(Dungeon.isDIFFICULTY(Difficulty.DifficultyConduct.NORMAL)){ - HP=HT *= 1f; + HP=HT *= 1f; } else if(Dungeon.isDIFFICULTY(HARD)){ - HP=HT *= 1.25f; + HP=HT *= 1.25f; if (properties().contains(Property.BOSS)) { HP = HT *= 5f; } else if (properties().contains(Property.MINIBOSS)) { @@ -160,30 +163,30 @@ public abstract class Mob extends Char { public AiState FLEEING = new Fleeing(); public AiState PASSIVE = new Passive(); public AiState state = SLEEPING; - + public Class spriteClass; - + protected int target = -1; - + public int defenseSkill = 0; - + public int EXP = 1; public int maxLvl = Hero.MAX_LEVEL; - + protected Char enemy; protected boolean enemySeen; protected boolean alerted = false; protected static final float TIME_TO_WAKE_UP = 1f; - + private static final String STATE = "state"; private static final String SEEN = "seen"; private static final String TARGET = "target"; private static final String MAX_LVL = "max_lvl"; - + @Override public void storeInBundle( Bundle bundle ) { - + super.storeInBundle( bundle ); if (state == SLEEPING) { @@ -201,10 +204,10 @@ public abstract class Mob extends Char { bundle.put( TARGET, target ); bundle.put( MAX_LVL, maxLvl ); } - + @Override public void restoreFromBundle( Bundle bundle ) { - + super.restoreFromBundle( bundle ); String state = bundle.getString( STATE ); @@ -226,26 +229,26 @@ public abstract class Mob extends Char { if (bundle.contains(MAX_LVL)) maxLvl = bundle.getInt(MAX_LVL); } - + public CharSprite sprite() { return Reflection.newInstance(spriteClass); } - + @Override protected boolean act() { - + super.act(); - + boolean justAlerted = alerted; alerted = false; - + if (justAlerted){ sprite.showAlert(); } else { sprite.hideAlert(); sprite.hideLost(); } - + if (paralysed > 0) { enemySeen = false; spend( TICK ); @@ -257,18 +260,18 @@ public abstract class Mob extends Char { } - + enemy = chooseEnemy(); - + boolean enemyInFOV = enemy != null && enemy.isAlive() && fieldOfView[enemy.pos] && enemy.invisible <= 0; return state.act( enemyInFOV, justAlerted ); } - + //FIXME this is sort of a band-aid correction for allies needing more intelligent behaviour protected boolean intelligentAlly = false; - + protected Char chooseEnemy() { Dread dread = buff( Dread.class ); @@ -286,7 +289,7 @@ public abstract class Mob extends Char { return source; } } - + //if we are an alert enemy, auto-hunt a target that is affected by aggression, even another enemy if (alignment == Alignment.ENEMY && state != PASSIVE && state != SLEEPING) { if (enemy != null && enemy.buff(StoneOfAggression.Aggression.class) != null){ @@ -307,10 +310,10 @@ public abstract class Mob extends Char { //we have no enemy, or the current one is dead/missing if ( enemy == null || !enemy.isAlive() || !Actor.chars().contains(enemy) || state == WANDERING) { newEnemy = true; - //We are amoked and current enemy is the hero + //We are amoked and current enemy is the hero } else if (buff( Amok.class ) != null && enemy == Dungeon.hero) { newEnemy = true; - //We are charmed and current enemy is what charmed us + //We are charmed and current enemy is what charmed us } else if (buff(Charm.class) != null && buff(Charm.class).object == enemy.id()) { newEnemy = true; } @@ -320,7 +323,7 @@ public abstract class Mob extends Char { //current enemy is also an ally if (enemy.alignment == Alignment.ALLY){ newEnemy = true; - //current enemy is invulnerable + //current enemy is invulnerable } else if (enemy.isInvulnerable(getClass())){ newEnemy = true; } @@ -338,7 +341,7 @@ public abstract class Mob extends Char { && fieldOfView[mob.pos] && mob.invisible <= 0) { enemies.add(mob); } - + if (enemies.isEmpty()) { //try to find ally mobs to attack second. for (Mob mob : Dungeon.level.mobs) @@ -346,7 +349,7 @@ public abstract class Mob extends Char { && fieldOfView[mob.pos] && mob.invisible <= 0) { enemies.add(mob); } - + if (enemies.isEmpty()) { //try to find the hero third if (fieldOfView[Dungeon.hero.pos] && Dungeon.hero.invisible <= 0) { @@ -354,8 +357,8 @@ public abstract class Mob extends Char { } } } - - //if we are an ally... + + //if we are an ally... } else if ( alignment == Alignment.ALLY ) { //look for hostile mobs to attack for (Mob mob : Dungeon.level.mobs) @@ -366,8 +369,8 @@ public abstract class Mob extends Char { (mob.state != mob.SLEEPING && mob.state != mob.PASSIVE && mob.state != mob.WANDERING)) { enemies.add(mob); } - - //if we are an enemy... + + //if we are an enemy... } else if (alignment == Alignment.ENEMY) { //look for ally mobs to attack for (Mob mob : Dungeon.level.mobs) @@ -378,7 +381,7 @@ public abstract class Mob extends Char { if (fieldOfView[Dungeon.hero.pos] && Dungeon.hero.invisible <= 0) { enemies.add(Dungeon.hero); } - + } //do not target anything that's charming us @@ -409,7 +412,7 @@ public abstract class Mob extends Char { } else return enemy; } - + @Override public void add( Buff buff ) { super.add( buff ); @@ -422,7 +425,7 @@ public abstract class Mob extends Char { postpone( Sleep.SWS ); } } - + @Override public void remove( Buff buff ) { super.remove( buff ); @@ -436,7 +439,7 @@ public abstract class Mob extends Char { } } } - + protected boolean canAttack( Char enemy ) { if (Dungeon.level.adjacent( pos, enemy.pos )){ return true; @@ -448,9 +451,9 @@ public abstract class Mob extends Char { } return false; } - + protected boolean getCloser( int target ) { - + if (rooted || target == pos) { return false; } @@ -487,7 +490,7 @@ public abstract class Mob extends Char { //shorten for a closer one if (Dungeon.level.adjacent(target, pos)) { path.add(target); - //extend the path for a further target + //extend the path for a further target } else { path.add(last); path.add(target); @@ -497,11 +500,11 @@ public abstract class Mob extends Char { //if the new target is simply 1 earlier in the path shorten the path if (path.getLast() == target) { - //if the new target is closer/same, need to modify end of path + //if the new target is closer/same, need to modify end of path } else if (Dungeon.level.adjacent(target, path.getLast())) { path.add(target); - //if the new target is further away, need to extend the path + //if the new target is further away, need to extend the path } else { path.add(last); path.add(target); @@ -581,12 +584,12 @@ public abstract class Mob extends Char { return false; } } - + protected boolean getFurther( int target ) { if (rooted || target == pos) { return false; } - + int step = Dungeon.flee( this, target, Dungeon.level.passable, fieldOfView, true ); if (step != -1) { move( step ); @@ -619,6 +622,10 @@ public abstract class Mob extends Char { delay = 1f; } + if(buff(ChampionEnemy.Sider.class) != null){ + delay = 4.0f; + } + return super.attackDelay()*(delay); } @@ -672,18 +679,18 @@ public abstract class Mob extends Char { protected boolean doAttack( Char enemy ) { - + if (sprite != null && (sprite.visible || enemy.sprite.visible)) { sprite.attack( enemy.pos ); return false; - + } else { attack( enemy ); spend( attackDelay() ); return true; } } - + @Override public void onAttackComplete() { attack( enemy ); @@ -716,12 +723,12 @@ public abstract class Mob extends Char { return 0; } } - + protected boolean hitWithRanged = false; - + @Override public int defenseProc( Char enemy, int damage ) { - + if (enemy instanceof Hero && ((Hero) enemy).belongings.weapon() instanceof MissileWeapon && !hitWithRanged){ @@ -729,14 +736,14 @@ public abstract class Mob extends Char { Statistics.thrownAssists++; Badges.validateHuntressUnlock(); } - + if (surprisedBy(enemy)) { Statistics.sneakAttacks++; Badges.validateRogueUnlock(); //TODO this is somewhat messy, it would be nicer to not have to manually handle delays here // playing the strong hit sound might work best as another property of weapon? if (Dungeon.hero.belongings.weapon() instanceof SpiritBow.SpiritArrow - || Dungeon.hero.belongings.weapon() instanceof Dart){ + || Dungeon.hero.belongings.weapon() instanceof Dart){ Sample.INSTANCE.playDelayed(Assets.Sounds.HIT_STRONG, 0.125f); } else { Sample.INSTANCE.play(Assets.Sounds.HIT_STRONG); @@ -757,7 +764,7 @@ public abstract class Mob extends Char { if (buff(SoulMark.class) != null) { int restoration = Math.min(damage, HP+shielding()); - + //physical damage that doesn't come from the hero is less effective if (enemy != Dungeon.hero){ restoration = Math.round(restoration * 0.4f*Dungeon.hero.pointsInTalent(Talent.SOUL_SIPHON)/3f); @@ -788,7 +795,7 @@ public abstract class Mob extends Char { state = HUNTING; } } - + public boolean isTargeting( Char ch){ return enemy == ch; } @@ -808,25 +815,25 @@ public abstract class Mob extends Char { deferred.prolong( dmg ); } - + super.damage( dmg, src ); } - - + + @Override public void destroy() { - + super.destroy(); - + Dungeon.level.mobs.remove( this ); - + if (Dungeon.hero.isAlive()) { - + if (alignment == Alignment.ENEMY) { Statistics.enemiesSlain++; Badges.validateMonstersSlain(); Statistics.qualifiedForNoKilling = false; - + int exp = Dungeon.hero.lvl <= maxLvl ? EXP : 0; //难度系统 英雄获得的经验 @@ -848,7 +855,7 @@ public abstract class Mob extends Char { } } } - + @Override public void die( Object cause ) { @@ -897,7 +904,7 @@ public abstract class Mob extends Char { return lootChance; } - + public void rollToDropLoot(){ if (Dungeon.hero.lvl > maxLvl + 2) return; @@ -910,7 +917,7 @@ public abstract class Mob extends Char { } } } - + //ring of wealth logic if (Ring.getBuffedBonus(Dungeon.hero, RingOfWealth.Wealth.class) > 0) { int rolls = 1; @@ -922,7 +929,7 @@ public abstract class Mob extends Char { RingOfWealth.showFlareForBonusDrop(sprite); } } - + //lucky enchant logic if (buff(Lucky.LuckProc.class) != null){ Dungeon.level.drop(Lucky.genLoot(), pos).sprite.drop(); @@ -944,10 +951,10 @@ public abstract class Mob extends Char { } } - + protected Object loot = null; protected float lootChance = 0; - + @SuppressWarnings("unchecked") public Item createLoot() { Item item; @@ -971,21 +978,21 @@ public abstract class Mob extends Char { public float spawningWeight(){ return 1; } - + public boolean reset() { return false; } - + public void beckon( int cell ) { - + notice(); - + if (state != HUNTING && state != FLEEING) { state = WANDERING; } target = cell; } - + public String description() { return Messages.get(this, "desc"); } @@ -1001,11 +1008,11 @@ public abstract class Mob extends Char { } public void notice() { - if (Dungeon.hero.buff(LockedFloor.class) != null) { - BGMPlayer.playBoss(); + if (Dungeon.level.locked) { + BGMPlayer.playBoss(); } } - + public void yell( String str ) { GLog.newLine(); GLog.n( "%s: \"%s\" ", Messages.titleCase(name()), str ); @@ -1099,15 +1106,15 @@ public abstract class Mob extends Char { } } - + protected boolean noticeEnemy(){ enemySeen = true; - + notice(); alerted = true; state = HUNTING; target = enemy.pos; - + if (alignment == Alignment.ENEMY && Dungeon.isChallenged( Challenges.SWARM_INTELLIGENCE )) { for (Mob mob : Dungeon.level.mobs) { if (mob.paralysed <= 0 @@ -1117,13 +1124,13 @@ public abstract class Mob extends Char { } } } - + return true; } - + protected boolean continueWandering(){ enemySeen = false; - + int oldPos = pos; if (target != -1 && getCloser( target )) { spend( 1 / speed() ); @@ -1132,10 +1139,10 @@ public abstract class Mob extends Char { target = Dungeon.level.randomDestination( Mob.this ); spend( TICK ); } - + return true; } - + } protected class Hunting implements AiState { @@ -1164,10 +1171,10 @@ public abstract class Mob extends Char { spend( TICK ); return true; } - + int oldPos = pos; if (target != -1 && getCloser( target )) { - + spend( 1 / speed() ); return moveSprite( oldPos, pos ); @@ -1210,8 +1217,8 @@ public abstract class Mob extends Char { //loses target when 0-dist rolls a 6 or greater. if (enemy == null || !enemyInFOV && 1 + Random.Int(Dungeon.level.distance(pos, target)) >= 6){ target = -1; - - //if enemy isn't in FOV, keep running from their previous position. + + //if enemy isn't in FOV, keep running from their previous position. } else if (enemyInFOV) { target = enemy.pos; } @@ -1246,8 +1253,8 @@ public abstract class Mob extends Char { return true; } } - - + + private static ArrayList heldAllies = new ArrayList<>(); public static void holdAllies( Level level ){ @@ -1262,8 +1269,8 @@ public abstract class Mob extends Char { ((DirectableAlly) mob).clearDefensingPos(); level.mobs.remove( mob ); heldAllies.add(mob); - - //preserve intelligent allies if they are near the hero + + //preserve intelligent allies if they are near the hero } else if (mob.alignment == Alignment.ALLY && mob.intelligentAlly && Dungeon.level.distance(holdFromPos, mob.pos) <= 5){ @@ -1279,7 +1286,7 @@ public abstract class Mob extends Char { public static void restoreAllies( Level level, int pos, int gravitatePos ){ if (!heldAllies.isEmpty()){ - + ArrayList candidatePositions = new ArrayList<>(); for (int i : PathFinder.NEIGHBOURS8) { if (!Dungeon.level.solid[i+pos] && level.findMob(i+pos) == null){ @@ -1299,11 +1306,11 @@ public abstract class Mob extends Char { } }); } - + for (Mob ally : heldAllies) { level.mobs.add(ally); ally.state = ally.WANDERING; - + if (!candidatePositions.isEmpty()){ ally.pos = candidatePositions.remove(0); } else { @@ -1315,12 +1322,12 @@ public abstract class Mob extends Char { ally.fieldOfView = new boolean[level.length()]; } Dungeon.level.updateFieldOfView( ally, ally.fieldOfView ); - + } } heldAllies.clear(); } - + public static void clearHeldAllies(){ heldAllies.clear(); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/bosses/DCrystal.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/bosses/DCrystal.java index e5336c7f0..a9013b0e3 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/bosses/DCrystal.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/bosses/DCrystal.java @@ -41,7 +41,7 @@ public class DCrystal extends Mob { return super.act(); } - private void onZapComplete(){ + public void onZapComplete(){ for (Mob boss : Dungeon.level.mobs.toArray(new Mob[0])) { //如果宝箱王存在,且在五格范围内,给予它血量吧 //困难模式治疗范围改为无限 diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/bosses/FireMagicDied.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/bosses/FireMagicDied.java index e295affac..b27d4f0b6 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/bosses/FireMagicDied.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/bosses/FireMagicDied.java @@ -1,5 +1,6 @@ package com.shatteredpixel.shatteredpixeldungeon.actors.mobs.bosses; +import static com.shatteredpixel.shatteredpixeldungeon.BGMPlayer.playBGM; import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.hero; import static com.shatteredpixel.shatteredpixeldungeon.levels.ShopBossLevel.CryStalPosition; import static com.shatteredpixel.shatteredpixeldungeon.levels.ShopBossLevel.FALSEPosition; @@ -65,7 +66,6 @@ import com.shatteredpixel.shatteredpixeldungeon.tiles.DungeonTilemap; import com.shatteredpixel.shatteredpixeldungeon.ui.BossHealthBar; import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; import com.watabou.noosa.Camera; -import com.watabou.noosa.audio.Music; import com.watabou.noosa.audio.Sample; import com.watabou.noosa.particles.Emitter; import com.watabou.utils.Bundle; @@ -773,7 +773,7 @@ public class FireMagicDied extends Mob implements Callback { super.notice(); BossHealthBar.assignBoss(this); - Music.INSTANCE.play(Assets.BGM_FRBOSS, true); + playBGM(Assets.BGM_FRBOSS, true); yell( Messages.get(this, "notice") ); //summon(); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/AutoShopReBot.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/AutoShopReBot.java index 0b0f87b46..6f502deb9 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/AutoShopReBot.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/AutoShopReBot.java @@ -1,5 +1,6 @@ package com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs; +import static com.shatteredpixel.shatteredpixeldungeon.BGMPlayer.playBGM; import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.hero; import com.shatteredpixel.shatteredpixeldungeon.Assets; @@ -23,7 +24,6 @@ import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; import com.shatteredpixel.shatteredpixeldungeon.windows.WndAutoShop; import com.shatteredpixel.shatteredpixeldungeon.windows.WndQuest; import com.watabou.noosa.Game; -import com.watabou.noosa.audio.Music; import com.watabou.utils.Bundle; import com.watabou.utils.Callback; @@ -102,10 +102,10 @@ public class AutoShopReBot extends NPC { GLog.p(Messages.get(this, "greetings", Dungeon.hero.name())); seenBefore = true; } else if (seenBefore && !Dungeon.level.heroFOV[pos] && Dungeon.depth == 0) { - Music.INSTANCE.play(Assets.TOWN, true); + playBGM(Assets.TOWN, true); seenBefore = false; } else if (seenBefore && !Dungeon.level.heroFOV[pos] && Dungeon.depth == 12) { - Music.INSTANCE.play(Assets.BGM_2,true); + playBGM(Assets.BGM_2,true); seenBefore = false; } throwItem(); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/NullDiedTO.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/NullDiedTO.java index cad924260..2e4d23c54 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/NullDiedTO.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/NullDiedTO.java @@ -1,5 +1,7 @@ package com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs; +import static com.shatteredpixel.shatteredpixeldungeon.BGMPlayer.playBGM; + import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Conducts; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; @@ -26,7 +28,6 @@ import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; import com.shatteredpixel.shatteredpixeldungeon.windows.WndKingShop; import com.shatteredpixel.shatteredpixeldungeon.windows.WndQuest; import com.watabou.noosa.Game; -import com.watabou.noosa.audio.Music; import com.watabou.utils.Bundle; import com.watabou.utils.Callback; @@ -70,7 +71,7 @@ public class NullDiedTO extends NTNPC { public void flee() { destroy(); Dungeon.level.seal(); - Music.INSTANCE.play(Assets.BGM_FRBOSS, true); + playBGM(Assets.BGM_FRBOSS, true); GameScene.flash(0x8000FFFF); sprite.killAndErase(); CellEmitter.get( pos ).burst(SnowParticle.FACTORY, 6 ); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Nyz.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Nyz.java index 9172f4588..50998e899 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Nyz.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Nyz.java @@ -1,5 +1,7 @@ package com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs; +import static com.shatteredpixel.shatteredpixeldungeon.BGMPlayer.playBGM; + import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Conducts; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; @@ -25,7 +27,6 @@ import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; import com.shatteredpixel.shatteredpixeldungeon.windows.WndNyzShop; import com.shatteredpixel.shatteredpixeldungeon.windows.WndQuest; import com.watabou.noosa.Game; -import com.watabou.noosa.audio.Music; import com.watabou.utils.Callback; import java.util.ArrayList; @@ -53,14 +54,14 @@ public class Nyz extends NTNPC { GLog.p(Messages.get(this, "greetings", Dungeon.hero.name())); //TODO 诡异奈亚子 早上好 中午好 晚上好 if(!Dungeon.isDLC(Conducts.Conduct.BOSSRUSH)){ - Music.INSTANCE.play(Assets.NYZSHOP, true); + playBGM(Assets.NYZSHOP, true); } seenBefore = true; } else if (seenBefore && !Dungeon.level.heroFOV[pos] && Dungeon.depth == 0) { - Music.INSTANCE.play(Assets.TOWN, true); + playBGM(Assets.TOWN, true); seenBefore = false; } else if (seenBefore && !Dungeon.level.heroFOV[pos] && Dungeon.depth == 12) { - Music.INSTANCE.play(Assets.BGM_2,true); + playBGM(Assets.BGM_2,true); seenBefore = false; } throwItem(); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/RenShop.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/RenShop.java index ab360aa89..c7db63450 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/RenShop.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/RenShop.java @@ -1,5 +1,7 @@ package com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs; +import static com.shatteredpixel.shatteredpixeldungeon.BGMPlayer.playBGM; + import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.BGMPlayer; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; @@ -18,7 +20,6 @@ import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; import com.shatteredpixel.shatteredpixeldungeon.windows.WndBag; import com.shatteredpixel.shatteredpixeldungeon.windows.WndTradeItem; import com.watabou.noosa.Game; -import com.watabou.noosa.audio.Music; import com.watabou.utils.Callback; public class RenShop extends NPC { @@ -39,7 +40,7 @@ public class RenShop extends NPC { if (!Dungeon.level.heroFOV[pos]) { BGMPlayer.playBGMWithDepth(); } else { - Music.INSTANCE.play(Assets.Music.RENSHOP, true); + playBGM(Assets.Music.RENSHOP, true); } throwItem(); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/FeedBackScene.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/FeedBackScene.java index f8c649151..81ba9c832 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/FeedBackScene.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/FeedBackScene.java @@ -1,12 +1,13 @@ package com.shatteredpixel.shatteredpixeldungeon.scenes; +import static com.shatteredpixel.shatteredpixeldungeon.BGMPlayer.playBGM; + import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon; import com.shatteredpixel.shatteredpixeldungeon.ui.Archs; import com.shatteredpixel.shatteredpixeldungeon.windows.WndFeedback; import com.watabou.input.KeyEvent; import com.watabou.noosa.Camera; -import com.watabou.noosa.audio.Music; public class FeedBackScene extends PixelScene { @@ -15,7 +16,7 @@ public class FeedBackScene extends PixelScene { @Override public void create() { super.create(); - Music.INSTANCE.play( Assets.Music.SHOP, true ); + playBGM( Assets.Music.SHOP, true ); wndFeedback = new WndFeedback(false) { @Override public void onBackPressed() { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/GoScene.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/GoScene.java index dd5d883bd..a048201d1 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/GoScene.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/GoScene.java @@ -1,12 +1,13 @@ package com.shatteredpixel.shatteredpixeldungeon.scenes; +import static com.shatteredpixel.shatteredpixeldungeon.BGMPlayer.playBGM; + import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.SPDSettings; import com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon; import com.watabou.noosa.Camera; import com.watabou.noosa.Game; import com.watabou.noosa.Image; -import com.watabou.noosa.audio.Music; import com.watabou.utils.GameMath; public class GoScene extends PixelScene { @@ -26,7 +27,7 @@ public class GoScene extends PixelScene { @Override public void create() { super.create(); - Music.INSTANCE.play( Assets.Music.GO, true ); + playBGM( Assets.Music.GO, true ); if (SPDSettings.splashScreen() < 1 || done) { ShatteredPixelDungeon.switchForceFade(WelcomeScene.class); return; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/JAmuletScene.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/JAmuletScene.java index 7d8669bca..bec7f22f3 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/JAmuletScene.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/JAmuletScene.java @@ -1,5 +1,7 @@ package com.shatteredpixel.shatteredpixeldungeon.scenes; +import static com.shatteredpixel.shatteredpixeldungeon.BGMPlayer.playBGM; + import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.GamesInProgress; @@ -11,7 +13,6 @@ import com.shatteredpixel.shatteredpixeldungeon.ui.RenderedTextBlock; import com.watabou.noosa.Camera; import com.watabou.noosa.Game; import com.watabou.noosa.Image; -import com.watabou.noosa.audio.Music; import com.watabou.utils.Random; public class JAmuletScene extends PixelScene { @@ -28,7 +29,7 @@ public class JAmuletScene extends PixelScene { @Override public void create() { super.create(); - Music.INSTANCE.play( Assets.Music.NBPL, true ); + playBGM( Assets.Music.NBPL, true ); RenderedTextBlock text = null; if (!noText) { text = renderTextBlock( Messages.get(this, "text"), 8 ); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/SPSLScene.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/SPSLScene.java index 9f012374d..fa0714cb5 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/SPSLScene.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/SPSLScene.java @@ -1,5 +1,7 @@ package com.shatteredpixel.shatteredpixeldungeon.scenes; +import static com.shatteredpixel.shatteredpixeldungeon.BGMPlayer.playBGM; + import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Chrome; import com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon; @@ -18,7 +20,6 @@ import com.watabou.noosa.Game; import com.watabou.noosa.Image; import com.watabou.noosa.NinePatch; import com.watabou.noosa.PointerArea; -import com.watabou.noosa.audio.Music; import com.watabou.noosa.audio.Sample; import com.watabou.noosa.ui.Component; @@ -30,7 +31,7 @@ public class SPSLScene extends PixelScene { @Override public void create() { super.create(); - Music.INSTANCE.play( Assets.Music.SHOP, true ); + playBGM( Assets.Music.SHOP, true ); final float colWidth = Camera.main.width / (landscape() ? 2 : 1); final float colTop = (Camera.main.height / 2) - (landscape() ? 30 : 90); final float colOffset = landscape() ? colWidth : 0; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/CharSprite.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/CharSprite.java index 6ba936939..fddbab9b0 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/CharSprite.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/CharSprite.java @@ -30,6 +30,7 @@ import com.shatteredpixel.shatteredpixeldungeon.effects.EmoIcon; import com.shatteredpixel.shatteredpixeldungeon.effects.Flare; import com.shatteredpixel.shatteredpixeldungeon.effects.FloatingText; import com.shatteredpixel.shatteredpixeldungeon.effects.IceBlock; +import com.shatteredpixel.shatteredpixeldungeon.effects.MagicMissile; import com.shatteredpixel.shatteredpixeldungeon.effects.RoseHalo; import com.shatteredpixel.shatteredpixeldungeon.effects.ShieldHalo; import com.shatteredpixel.shatteredpixeldungeon.effects.Speck; @@ -94,6 +95,24 @@ public class CharSprite extends MovieClip implements Tweener.Listener, MovieClip } private int stunStates = 0; + public void zaplink( int cell ) { + + turnTo( ch.pos , cell ); + play( attack ); + + MagicMissile.boltFromChar( parent, + MagicMissile.SHAMAN_BLUE, + this, + cell, + new Callback() { + @Override + public void call() { + ((Mob)ch).onZapComplete(); + } + } ); + Sample.INSTANCE.play( Assets.Sounds.ZAP ); + } + protected Animation idle; protected Animation run; protected Animation attack; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/Icons.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/Icons.java index 58f1c9891..d03ad7619 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/Icons.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/Icons.java @@ -104,6 +104,8 @@ public enum Icons { DEPTH_SECRETS, CHAL_COUNT, + HAPPY_ICON, + //icons that appear in the about screen, variable spacing LIBGDX, ALEKS, @@ -334,6 +336,9 @@ public enum Icons { case CHAL_COUNT: icon.frame( icon.texture.uvRectBySize( 48, 72, 7, 7 ) ); break; + case HAPPY_ICON: + icon.frame( icon.texture.uvRectBySize( 56, 72, 7, 5 ) ); + break; case LIBGDX: icon.frame( icon.texture.uvRectBySize( 0, 96, 16, 13 ) ); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/MenuPane.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/MenuPane.java index 02ea8edb5..fc55b37db 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/MenuPane.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/MenuPane.java @@ -27,6 +27,7 @@ import static com.shatteredpixel.shatteredpixeldungeon.ui.Window.RED_COLOR; import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Challenges; +import com.shatteredpixel.shatteredpixeldungeon.Conducts; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.SPDAction; import com.shatteredpixel.shatteredpixeldungeon.SPDSettings; @@ -57,8 +58,10 @@ public class MenuPane extends Component { private Button depthButton; private Image challengeIcon; + private Image gameHappyIcon; private BitmapText challengeText; private Button challengeButton; + private Button gameHappyIconButton; private JournalButton btnJournal; private MenuButton btnMenu; @@ -165,6 +168,18 @@ public class MenuPane extends Component { add(challengeButton); } + if (!Dungeon.isDLC(Conducts.Conduct.NULL)){ + gameHappyIcon = Icons.get(Icons.HAPPY_ICON); + add(gameHappyIcon); + gameHappyIconButton = new Button(){ + @Override + protected void onClick() { + // + } + }; + add(gameHappyIconButton); + } + btnJournal = new JournalButton(); add( btnJournal ); @@ -218,6 +233,15 @@ public class MenuPane extends Component { challengeButton.setRect(challengeIcon.x, challengeIcon.y, challengeIcon.width(), challengeIcon.height() + challengeText.height()); } + if (gameHappyIcon != null){ + gameHappyIcon.x = btnJournal.left() - 20 + (7 - gameHappyIcon.width())/2f - 0.1f; + gameHappyIcon.y = y + 1; + if (SPDSettings.interfaceSize() == 0) gameHappyIcon.y++; + PixelScene.align(gameHappyIcon); + + gameHappyIconButton.setRect(gameHappyIcon.x, gameHappyIcon.y, gameHappyIcon.width(), gameHappyIcon.height()); + } + version.scale.set(PixelScene.align(0.5f)); version.measure(); version.x = x + WIDTH - version.width(); 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 984500d3e..21dd244fe 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 @@ -54,6 +54,8 @@ import java.util.ArrayList; public class vM0_6_7_X_Changes { public static void addAllChanges(ArrayList changeInfos) { + add_v0_6_48_Changes(changeInfos); + add_v0_6_47_Changes(changeInfos); add_v0_6_46_Changes(changeInfos); add_v0_6_45_Changes(changeInfos); add_v0_6_44_Changes(changeInfos); @@ -103,6 +105,55 @@ public class vM0_6_7_X_Changes { add_v0_6_0_Changes(changeInfos); } + public static void add_v0_6_48_Changes( ArrayList changeInfos ) { + ChangeInfo changes = new ChangeInfo("v0.6.3.0-Beta3.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.CHALLENGE_ON), ("基因突变改进"), + ("现在所有特殊敌人刷新权重一致"))); + + changes = new ChangeInfo("改动", false, null); + changes.hardlight(Window.CYELLOW); + changeInfos.add(changes); + + 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_06X76"))); + + } + + public static void add_v0_6_47_Changes( ArrayList changeInfos ) { + ChangeInfo changes = new ChangeInfo("v0.6.3.0-Beta3.5", 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.CHALLENGE_ON), ("基因突变新种类"), + ("突变酸液体,敌人获得远程攻击,并且更加危险。"))); + + changes = new ChangeInfo("平衡", false, null); + changes.hardlight(Window.RED_COLOR); + changeInfos.add(changes); + + changes.addButton(new ChangeButton(new BruteBotSprite(), ("重甲豺狼"), + ("削弱重甲豺狼的属性"))); + + changes = new ChangeInfo("改动", false, null); + changes.hardlight(Window.CYELLOW); + changeInfos.add(changes); + + 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_06X75"))); + + } + public static void add_v0_6_46_Changes( ArrayList changeInfos ) { ChangeInfo changes = new ChangeInfo("v0.6.3.0-Beta3.0", true, ""); changes.hardlight(Window.TITLE_COLOR); @@ -112,6 +163,9 @@ public class vM0_6_7_X_Changes { changes.hardlight(Window.GREEN_COLOR); changeInfos.add(changes); + changes.addButton(new ChangeButton(new ItemSprite(ItemSpriteSheet.BLACKBOOK), ("人物背景"), + ("四大角色的人物背景已初步加入,后续会进行文案优化。"))); + changes.addButton(new ChangeButton(Icons.get(Icons.BADGES), ("新徽章:豺狼的复仇"), ("别惹它们,我是说真的-----已逝去的冒险者"))); @@ -478,21 +532,21 @@ public class vM0_6_7_X_Changes { issxsaxs.scale.set(PixelScene.align(0.8f)); changes.addButton(new ChangeButton(issxsaxs, ("精英刷怪机制调整"), ("在原有基础上修改以下精英怪:\n" + - "魔像---》冰魔像 精英\n" + - "监狱守卫---》赏金猎人 精英\n"+ - "洞穴蜘蛛---》豺狼炼药长老 精英\n" + - "红色怨灵---》血月火把猎人 精英\n\n" + - "同时现阶段有关于上面的正常刷怪被移除,也就是说冰魔像他们不再是常规刷新了。"))); + "魔像---》冰魔像 精英\n" + + "监狱守卫---》赏金猎人 精英\n"+ + "洞穴蜘蛛---》豺狼炼药长老 精英\n" + + "红色怨灵---》血月火把猎人 精英\n\n" + + "同时现阶段有关于上面的正常刷怪被移除,也就是说冰魔像他们不再是常规刷新了。"))); changes.addButton(new ChangeButton(new ItemSprite(ItemSpriteSheet.REDDRAGON), "核子可乐回归", "核子可乐现在回归正常模式,且仅在困难难度前获得,并且效果有所减弱。")); changes.addButton(new ChangeButton(new ItemSprite(ItemSpriteSheet.LANTERNB), "部分灯火Buff调整", "部分灯火buff都进行了一定的调整:\n" + - "1.纯洁的祝福--前路\n调整:回血效果减半\n\n" + - "2.魔女的低语--无力\n调整:效果持续期间力量从-3调整至-1\n\n" + - "3.纯洁的祝福--安息\n调整:物理伤害从x2调整至x1.5\n\n" + - "4.纯洁的祝福--守护\n调整:效果持续期间每150回合获得一些护盾")); + "1.纯洁的祝福--前路\n调整:回血效果减半\n\n" + + "2.魔女的低语--无力\n调整:效果持续期间力量从-3调整至-1\n\n" + + "3.纯洁的祝福--安息\n调整:物理伤害从x2调整至x1.5\n\n" + + "4.纯洁的祝福--守护\n调整:效果持续期间每150回合获得一些护盾")); changes = new ChangeInfo("改动", false, null); changes.hardlight(Window.CYELLOW); @@ -756,7 +810,7 @@ public class vM0_6_7_X_Changes { changes.addButton(new ChangeButton(new Image("sprites/spinner.png", 144, 0, 16, 16), Messages.get(ChangesScene.class, - "bugfixes"), + "bugfixes"), ("1.快捷栏翻转修复\n2.修复新生火元素无法被冰冻类buff秒杀的问题\n3.修复深蓝蝾螈会让幽灵任务错误完成的问题\n4.修复元素风暴特效错误问题"))); } @@ -931,7 +985,7 @@ public class vM0_6_7_X_Changes { Messages.get(ChangesScene.class, "bugfixes"), Messages.get(vM0_6_7_X_Changes.class, "bug_06X50"))); } - + public static void add_v0_6_21_Changes( ArrayList changeInfos ) { ChangeInfo changes = new ChangeInfo("v0.6.0.0-Beta21-p2.950", true, ""); @@ -943,8 +997,8 @@ public class vM0_6_7_X_Changes { changeInfos.add(changes); changes.addButton(new ChangeButton(new Image("ADE.png", 0, 0, 32, 32), - ("ADE环境部署成功"), - ("AndroidIDE+AIDE综合部署,现在作者可以手机/电脑协同开发,也可以避免部分时候遇到一些重大bug没有代码而难以处理的问题"))); + ("ADE环境部署成功"), + ("AndroidIDE+AIDE综合部署,现在作者可以手机/电脑协同开发,也可以避免部分时候遇到一些重大bug没有代码而难以处理的问题"))); changes = new ChangeInfo("调整", false, null); changes.hardlight(Window.CBLACK); @@ -952,7 +1006,7 @@ public class vM0_6_7_X_Changes { changes.addButton(new ChangeButton(new ItemSprite(ItemSpriteSheet.ICEFISHSWORD), ("尚方宝剑"), ("尚方宝剑现在力量初始为16,但是必定获得一个随机诅咒,商人对它的价值提升" ))); - + } public static void add_v0_6_20_Changes(ArrayList changeInfos) { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndRedDragon.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndRedDragon.java index 50cb9d096..c8963d0a1 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndRedDragon.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndRedDragon.java @@ -21,6 +21,7 @@ package com.shatteredpixel.shatteredpixeldungeon.windows; +import static com.shatteredpixel.shatteredpixeldungeon.BGMPlayer.playBGM; import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.hero; import static com.shatteredpixel.shatteredpixeldungeon.items.Generator.randomArtifact; @@ -49,7 +50,6 @@ import com.shatteredpixel.shatteredpixeldungeon.ui.RenderedTextBlock; import com.shatteredpixel.shatteredpixeldungeon.ui.Window; import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; import com.watabou.noosa.NinePatch; -import com.watabou.noosa.audio.Music; import com.watabou.noosa.audio.Sample; import com.watabou.noosa.ui.Component; @@ -202,7 +202,7 @@ public class WndRedDragon extends Window { Buff.affect(hero, Bleeding.class).set(8); Buff.prolong(hero, Blindness.class, Degrade.DURATION); Buff.prolong(hero, Cripple.class, Cripple.DURATION); - Music.INSTANCE.play(Assets.RUN, true); + playBGM(Assets.RUN, true); } } diff --git a/services/src/main/java/com/shatteredpixel/shatteredpixeldungeon/services/analytics/Analytics.java b/services/src/main/java/com/shatteredpixel/shatteredpixeldungeon/services/analytics/Analytics.java new file mode 100644 index 000000000..619dd099d --- /dev/null +++ b/services/src/main/java/com/shatteredpixel/shatteredpixeldungeon/services/analytics/Analytics.java @@ -0,0 +1,4 @@ +package com.shatteredpixel.shatteredpixeldungeon.services.analytics; + +public class Analytics { +}