diff --git a/SPD-classes/src/main/java/com/watabou/noosa/RenderedText.java b/SPD-classes/src/main/java/com/watabou/noosa/RenderedText.java index c1ed5604e..d78e17ce2 100644 --- a/SPD-classes/src/main/java/com/watabou/noosa/RenderedText.java +++ b/SPD-classes/src/main/java/com/watabou/noosa/RenderedText.java @@ -76,7 +76,7 @@ public class RenderedText extends Image { private synchronized void measure(){ - if (Thread.currentThread().getName().equals("CAPD Actor Thread")){ + if (Thread.currentThread().getName().equals("SHPD Actor Thread")){ throw new RuntimeException("Text measured from the actor thread!"); } diff --git a/SPD-classes/src/main/java/com/watabou/noosa/TextInput.java b/SPD-classes/src/main/java/com/watabou/noosa/TextInput.java index 352be8d0d..85310b9b5 100644 --- a/SPD-classes/src/main/java/com/watabou/noosa/TextInput.java +++ b/SPD-classes/src/main/java/com/watabou/noosa/TextInput.java @@ -73,7 +73,7 @@ public class TextInput extends Component { skin = new Skin(FileUtils.getFileHandle(Files.FileType.Internal, "gdx/textfield.json")); TextField.TextFieldStyle style = skin.get(TextField.TextFieldStyle.class); - style.font = Game.platform.getFont(size, "", false, false,false); + style.font = Game.platform.getFont(size, "", false, false,true); style.background = null; textField = multiline ? new TextArea("", style) : new TextField("", style); textField.setProgrammaticChangeEvents(true); @@ -83,7 +83,7 @@ public class TextInput extends Component { textField.addListener(new ChangeListener() { @Override public void changed(ChangeEvent event, Actor actor) { - BitmapFont f = Game.platform.getFont(size, textField.getText(), false, false,false); + BitmapFont f = Game.platform.getFont(size, textField.getText(), false, false,true); TextField.TextFieldStyle style = textField.getStyle(); if (f != style.font){ style.font = f; diff --git a/SPD-classes/src/main/java/com/watabou/utils/PlatformSupport.java b/SPD-classes/src/main/java/com/watabou/utils/PlatformSupport.java index 2c1b3bdce..52de7fe18 100644 --- a/SPD-classes/src/main/java/com/watabou/utils/PlatformSupport.java +++ b/SPD-classes/src/main/java/com/watabou/utils/PlatformSupport.java @@ -23,7 +23,6 @@ package com.watabou.utils; import com.badlogic.gdx.Application; import com.badlogic.gdx.Gdx; -import com.badlogic.gdx.Input; import com.badlogic.gdx.graphics.Pixmap; import com.badlogic.gdx.graphics.g2d.BitmapFont; import com.badlogic.gdx.graphics.g2d.PixmapPacker; @@ -179,66 +178,16 @@ public abstract class PlatformSupport { //does nothing by default } - public boolean supportsFullScreen(){ - switch (Gdx.app.getType()){ - case Android: - //Android 4.4+ supports hiding UI via immersive mode - return Gdx.app.getVersion() >= 19; - case iOS: - //iOS supports hiding UI via drawing into the gesture safe area - return Gdx.graphics.getSafeInsetBottom() != 0; - default: - //TODO implement functionality for other platforms here - return true; - } - } - public boolean isAndroid() { return Gdx.app.getType() == Application.ApplicationType.Android; } - public boolean isiOS() { - return Gdx.app.getType() == Application.ApplicationType.iOS; - } - public boolean isDesktop() { return Gdx.app.getType() == Application.ApplicationType.Desktop; } - public boolean hasHardKeyboard() { - return Gdx.input.isPeripheralAvailable(Input.Peripheral.HardwareKeyboard); - } - - public boolean isDebug() { - return Game.version.contains("INDEV"); - } - - public boolean isSnapshot() { - return Game.version.contains("SNAPSHOT"); - } - public boolean openURI( String URI ) { return Gdx.net.openURI(URI); } - public void log( String tag, String message ){ - Gdx.app.log( tag, message ); - } - - public void debug( String message ) { - if (isDebug()) Gdx.app.log("DEBUG", message); - } - - public void setClipboardContents( String str ) { - Gdx.app.getClipboard().setContents( str ); - } - - public String getClipboardContents() { - return Gdx.app.getClipboard().getContents(); - } - - public boolean isClipboardEmpty() { - return !Gdx.app.getClipboard().hasContents(); - } - } \ No newline at end of file diff --git a/android/src/main/java/com/shatteredpixel/shatteredpixeldungeon/android/AndroidPlatformSupport.java b/android/src/main/java/com/shatteredpixel/shatteredpixeldungeon/android/AndroidPlatformSupport.java index 9a0c5dad6..8a54d190a 100644 --- a/android/src/main/java/com/shatteredpixel/shatteredpixeldungeon/android/AndroidPlatformSupport.java +++ b/android/src/main/java/com/shatteredpixel/shatteredpixeldungeon/android/AndroidPlatformSupport.java @@ -340,12 +340,6 @@ public class AndroidPlatformSupport extends PlatformSupport { public boolean isAndroid() { return true; } - - @Override - public boolean isiOS() { - return false; - } - @Override public boolean isDesktop() { return false; diff --git a/build.gradle b/build.gradle index 5623dc544..e5082b489 100644 --- a/build.gradle +++ b/build.gradle @@ -16,8 +16,8 @@ allprojects { appName = 'Magic Ling Pixel Dungeon' appPackageName = 'com.ansdomagiclingpixeldungeon.ling' - appVersionCode =700925 - appVersionName = '0.6.0.0-Beta21-p3-PreTest4.3' + appVersionCode =800000 + appVersionName = '0.6.1.0-Beta1(P3)' appJavaCompatibility = JavaVersion.VERSION_1_8 diff --git a/core/src/main/assets/fonts/pixel_font.ttf b/core/src/main/assets/fonts/pixel_font.ttf index 599cb17b6..699f2b875 100644 Binary files a/core/src/main/assets/fonts/pixel_font.ttf and b/core/src/main/assets/fonts/pixel_font.ttf differ diff --git a/core/src/main/assets/interfaces/badges.png b/core/src/main/assets/interfaces/badges.png index b2692464b..2fefea608 100644 Binary files a/core/src/main/assets/interfaces/badges.png and b/core/src/main/assets/interfaces/badges.png differ diff --git a/core/src/main/assets/messages/actors/actors.properties b/core/src/main/assets/messages/actors/actors.properties index ae69c73b1..5b2f5f0f6 100644 --- a/core/src/main/assets/messages/actors/actors.properties +++ b/core/src/main/assets/messages/actors/actors.properties @@ -70,7 +70,7 @@ actors.buffs.magicgirldebuff.magicgirlsaykill.name=魔女的低语-审判 actors.buffs.magicgirldebuff.magicgirlsaykill.desc=灯火摇摆不定,朦胧中你似乎看见了一个魔女向你挥起了剑。(一切是你们咎由自取)\n\n本大层怪物近战伤害提升10% actors.buffs.magicgirldebuff.magicgirlsayslowy.name=魔女的低语-迟钝 -actors.buffs.magicgirldebuff.magicgirlsayslowy.desc=缓慢的走向死亡吧……\n\n本大层英雄移动1回合相当于3回合 +actors.buffs.magicgirldebuff.magicgirlsayslowy.desc=缓慢的走向死亡吧……\n\n本大层英雄每移动10回合获得3回合残废。 actors.buffs.magicgirldebuff.magicgirlsaysoftdied.name=魔女的低语-软弱 actors.buffs.magicgirldebuff.magicgirlsaysoftdied.desc=软弱不是你的缺点,恐惧才是!\n\n本大层所有被护甲减免过的物理伤害增加5% @@ -80,7 +80,7 @@ actors.buffs.magicgirldebuff.magicgirlsaymoneymore.desc=贪婪的欲望是人类 ### Good Blees Buffs actors.buffs.clearbleesdgoodbuff.blessgoodstr.name=纯洁的祝福-坚毅 -actors.buffs.clearbleesdgoodbuff.blessgoodstr.desc=坚毅是我们不屈的斗志!\n\n本大层玩家额外追加8点力量 +actors.buffs.clearbleesdgoodbuff.blessgoodstr.desc=坚毅是我们不屈的斗志!\n\n本大层玩家额外追加3点力量 actors.buffs.clearbleesdgoodbuff.blessnomoney.name=纯洁的祝福-富饶 actors.buffs.clearbleesdgoodbuff.blessnomoney.desc=魔女的气息在我们身旁徘徊,商人们一定会对你毕恭毕敬。\n\n本大层商店全场打3折 @@ -89,13 +89,13 @@ actors.buffs.clearbleesdgoodbuff.blessmobdied.name=纯洁的祝福-安息 actors.buffs.clearbleesdgoodbuff.blessmobdied.desc=安息吧!怪物们!!!\n\n本大层英雄物理伤害x2! actors.buffs.clearbleesdgoodbuff.blessmixshiled.name=纯洁的祝福-守护 -actors.buffs.clearbleesdgoodbuff.blessmixshiled.desc=守护我们最后的种子!\n\n本大层英雄在血满的情况下每300回合获得一些护盾。 +actors.buffs.clearbleesdgoodbuff.blessmixshiled.desc=守护我们最后的种子!\n\n本大层英雄在血满的情况下每100回合获得一些护盾。 actors.buffs.clearbleesdgoodbuff.blessimmune.name=纯洁的祝福-隐没 -actors.buffs.clearbleesdgoodbuff.blessimmune.desc=隐没在这人群之中,我们便是超凡脱俗的个体\n\n本大层英雄免疫魔法效果和减少20%的伤害。 +actors.buffs.clearbleesdgoodbuff.blessimmune.desc=隐没在这人群之中,我们便是超凡脱俗的个体\n\n本大层英雄免疫诅咒效果和减少40%的物理伤害。 actors.buffs.clearbleesdgoodbuff.blessgoread.name=纯洁的祝福-前路 -actors.buffs.clearbleesdgoodbuff.blessgoread.desc=行走在这令人惧怕的地牢中,灯火是前路的指引\n\n本大层英雄饥饿值高于90%的情况下,获得每两回合+2的血量。 +actors.buffs.clearbleesdgoodbuff.blessgoread.desc=行走在这令人惧怕的地牢中,灯火是前路的指引\n\n本大层英雄灯火值高于60%的情况下,获得每回合进行血量回复。 ###MLPD actors.mobs.bosses.crossdiedtower.dead=控制目标已丢失,已自动摧毁…… @@ -203,7 +203,7 @@ text.herostat.real_time = 总时间 text.herostat.seed_dungeon = 种子序列号 text.herostat.seed_custom_no = text.textchallenges.seed_custom_title = 种子 -text.textchallenges.hint = 不输入即为随机种子 +text.textchallenges.hint = text.textchallenges.delete_seed_input = 清除 actors.mobs.bloodbat$bloodbatrecharge.name=血影充能 @@ -282,7 +282,7 @@ actors.buffs.reloadshop.name=购买成功! actors.buffs.reloadshoptwo.heromsg= actors.buffs.reloadshoptwo.name=刷新成功 -actors.mobs.bosses.dwarfmaster.name=矮人大师领主 +actors.mobs.bosses.dwarfmaster.name=矮人将军 actors.mobs.bosses.dwarfmaster.desc=前矮人王国正规军首领,如今已经被邪恶魔法腐蚀同化。\n\n他仍然记得矮人王国曾经的辉煌,也记得矮人王国最后的灭亡。你的到来他明显认为是入侵者,小心行事,他作为前矮人王国的正规军首领,作风往往比现阶段的矮人国王更加残暴。\n\n失败不代表一切,死亡不代表结束。 actors.mobs.bosses.dwarfmaster.death_rattle=矮人王国……最终还是失败了吗…… actors.mobs.bosses.dwarfmaster.notice=你 是 谁 ?! 为 什 么 踏 入 了 这 里 ? @@ -308,9 +308,9 @@ actors.mobs.bosses.dwarfmaster$dkghoul.rankings_desc=被大师说服加入了矮 actors.mobs.bosses.dwarfmaster$dkmonk.rankings_desc=被大师说服加入了矮人亡灵军队 actors.mobs.bosses.dwarfmaster$dkwarlock.rankings_desc=被大师说服加入了矮人亡灵军队 actors.mobs.bosses.dwarfmaster.rankings_desc=被大师说服加入了矮人亡灵军队 -actors.mobs.bosses.dwarfmaster.no_rose=矮人大师领主:她的力量不能在这里帮助你! -actors.mobs.bosses.dwarfmaster.no_fire=矮人大师领主:免疫火焰?这里不允许你这样! -actors.mobs.bosses.dwarfmaster.no_inst=矮人大师领主:直面我,不要躲在暗处! +actors.mobs.bosses.dwarfmaster.no_rose=矮人将军:她的力量不能在这里帮助你! +actors.mobs.bosses.dwarfmaster.no_fire=矮人将军:免疫火焰?这里不允许你这样! +actors.mobs.bosses.dwarfmaster.no_inst=矮人将军:直面我,不要躲在暗处! actors.mobs.dimandmimic.name=钻石宝箱怪 actors.mobs.dimandmimic.desc=长得几乎和钻石宝箱王一模一样,但是远比宝箱王弱的多! @@ -600,7 +600,7 @@ actors.mobs.npcs.slyl.readbooks=温馨提示:教程书籍正在翻修,敬请 actors.mobs.npcs.slyl.def_verb=风暴将临 actors.mobs.npcs.slyl.desc=_冷群_是一位掌握冰系力量的魔女,是300年前_寒冰圣都_的管理者。\n由于地下异常的不断出现,她来到这里调查异常的原因。\n看起来她似乎正在摸鱼。 -actors.mobs.npcs.slyl.howuse=你好,我是冷群。\n\n欢迎使用我们_寒冰圣都_的可以扰乱_魔力流_的_魔法金币_,通过它我们可以看见_特定的首领_。\n\n其中_抛动一次_会出现_天痕粘咕(5层),天狗(10层),DM300(15层),矮人国王(20层),Yog(25层)_\nΠ抛动两次Π是_史莱姆王(5层),钻石宝箱王(10层),DM720(15层),矮人大师领主(20层),Yog-Zot(25层)_\nΞ抛动三次Ξ是_(15层 寒冰魔女)_(抛动三次次仅在_特定楼层显示_)\n\n同时,仅在Boss前一楼层显示,每一次的最后的一次抛动将会决定下一层Boss的生成。\n\n好的,以上就是_使用方法和介绍了_,祝你_地牢冒险愉快_。 +actors.mobs.npcs.slyl.howuse=你好,我是冷群。\n\n欢迎使用我们_寒冰圣都_的可以扰乱_魔力流_的_魔法金币_,通过它我们可以看见_特定的首领_。\n\n其中_抛动一次_会出现_天痕粘咕(5层),天狗(10层),DM300(15层),矮人国王(20层),Yog(25层)_\nΠ抛动两次Π是_史莱姆王(5层),钻石宝箱王(10层),DM720(15层),矮人将军(20层),Yog-Zot(25层)_\nΞ抛动三次Ξ是_(15层 寒冰魔女)_(抛动三次次仅在_特定楼层显示_)\n\n同时,仅在Boss前一楼层显示,每一次的最后的一次抛动将会决定下一层Boss的生成。\n\n好的,以上就是_使用方法和介绍了_,祝你_地牢冒险愉快_。 actors.mobs.npcs.nxhy.guards=看来你需要更加艰难的试炼了。 actors.mobs.npcs.nxhy.thief=看来你需要更加艰难的试炼了。 diff --git a/core/src/main/assets/messages/items/items.properties b/core/src/main/assets/messages/items/items.properties index 20cb32223..a2de151e7 100644 --- a/core/src/main/assets/messages/items/items.properties +++ b/core/src/main/assets/messages/items/items.properties @@ -20,6 +20,13 @@ items.food.crivusfruitsfood.eat_msg2=你感觉味道十分不错,香甜可口 items.quest.crivusfruitsflake.name=赤果碎片 items.quest.crivusfruitsflake.desc=克里弗斯之果破碎时,炸的四分五裂,但看起来大概无法食用。\n\n物品自身并没有什么实际用途,但长期的魔力汲取让它拥有一股神秘的力量,或许它能商人眼前一亮。它本身还可以用作炼金制作一些不错的东西。再不济,它也能提供相当的炼金能量。 +items.wands.wandofhighthunderstorm.name=风暴雷霆法杖 +items.wands.wandofhighthunderstorm.staff_name=雷暴之杖 +items.wands.wandofhighthunderstorm.ondeath=你用风暴雷霆法杖杀死了自己… +items.wands.wandofhighthunderstorm.desc=这根法杖由神秘的水晶和雷霆法杖和一些炼金反应原料综合制成,顶部镶嵌有紫色的宝石,电弧正在顶端两个内弯的叉齿间跳跃。 +items.wands.wandofhighthunderstorm.stats_desc=这支法杖能向任何瞄准的地方射出一道极其强大的电弧并在附近生成水雾,造成_%1$d~%2$d点伤害_。这道闪电能在附近多个目标间跳跃,在水里会更强力。要是太接近,同样可能电到你自己,却不会波及到你的同伴。 +items.wands.wandofhighthunderstorm.bmage_desc=当_战斗法师_以雷暴之杖近战攻击目标时,能像拥有电击附魔一样有概率释放电弧攻击附近的目标,同时获得额外的奥术护盾。 +items.wands.wandofhighthunderstorm.eleblast_desc=雷暴之杖的元素风暴造成15%伤害,击晕目标8回合并使水体带电。 ###MLPD items.lightblack.oilpotion.name= 油瓶 diff --git a/core/src/main/assets/messages/journal/journal.properties b/core/src/main/assets/messages/journal/journal.properties index 3e01fb7c1..feea3a2e5 100644 --- a/core/src/main/assets/messages/journal/journal.properties +++ b/core/src/main/assets/messages/journal/journal.properties @@ -40,7 +40,7 @@ journal.document.alchemy_guide.exotic_scrolls.body=将一张卷轴与一些炼 journal.document.alchemy_guide.bombs.title=改造炸弹 journal.document.alchemy_guide.bombs.body=一个标准的黑火药炸弹可以与一个特定的物品共炼来制作一个强化炸弹。 journal.document.alchemy_guide.weapons.title=强化武器 -journal.document.alchemy_guide.weapons.body=投掷武器与法杖也可参与到炼金反应当中!\n\n每个投掷物可以融化为一定量的液金,足以完全修复阶级与等级一样的单件投掷物。\n\n法杖可以裂解为一定量的奥术聚酯,足以升级两把同等级的法杖。不可通过此方法将法杖升级至+3以上。 +journal.document.alchemy_guide.weapons.body=投掷武器与法杖也可参与到炼金反应当中!\n\n每个投掷物可以融化为一定量的液金,足以完全修复阶级与等级一样的单件投掷物。\n\n法杖可以裂解为一定量的奥术聚酯,足以升级两把同等级的法杖。不可通过此方法将法杖升级至+3以上。\n\n通过注入击败Boss的战利品可以获得更加高阶的法杖,并且每个高阶法杖都有至少+2的保底,最高+4,优先使用0级法杖,如果已经有等级,请手动放入炼金釜中。 journal.document.alchemy_guide.catalysts.title=炼制催化剂 journal.document.alchemy_guide.catalysts.body=催化剂可以用一张卷轴或一瓶药水与一个种子或一个符石制得。如果原料较为匹配,将不会消耗炼金能量。\n\n催化剂的主要用处是在接下来两页的配方中充当炼金原料,不过也可以直接使用以获取一种随机效果。 journal.document.alchemy_guide.brews_elixirs.title=炼制魔药与秘药 diff --git a/core/src/main/assets/messages/misc/misc.properties b/core/src/main/assets/messages/misc/misc.properties index 504bc347a..2a321c947 100644 --- a/core/src/main/assets/messages/misc/misc.properties +++ b/core/src/main/assets/messages/misc/misc.properties @@ -87,19 +87,22 @@ badges$badge.champion_5x=救世之主\n\n_开启10项以上挑战通关\n\n[不 badges$badge.unlock_mage=解锁法师 badges$badge.unlock_rogue=解锁盗贼 badges$badge.unlock_huntress=解锁女猎手 -badges$badge.kill_dm=取得钻石宝箱王的宝藏 +badges$badge.kill_dm=击败拟态之王\n\n一场”公平"的讨伐 badges$badge.rlpt=_支离破碎征服者_\n\n开启挑战并击败古神\n\n_奖励:0层随机神器(四大基座上)_ badges$badge.sbdjs=风暴袭来,未完待续\n\n你通过它成功离开,却不知,外面风暴袭来\n\n水晶之心仍然在你手中闪闪发光,或许,这事还没完! badges$badge.kill_mg=击败冰雪魔女-冬铃\n\n冰雪之地的女王\n\n_奖励:0层额外十字架(四大基座上,与DM720不叠加)_ badges$badge.firegirl=击败圣火魔女-莲娜\n\n雪凛峡谷的守护者 badges$badge.slimepr=击败史莱姆公主\n\n妥协的结果 -badges$badge.drawf_head=击败矮人大师领主\n\n矮人王国的正规军残党 +badges$badge.drawf_head=击败矮人将军\n\n矮人王国的正规军残党 + +badges$badge.kill_apple=击败克里弗斯之果\n\n盘踞在森林底部的幕后“主谋" + badges$badge.spicealboss=累计击败全部特殊BOSS\n\n风暴正在降临 badges$badge.nyz_shop=奈亚大亨\n\n让奈亚子自愿入驻0层!\n\n_奖励:0层奈亚子常驻,1200初始金币,5次奈亚子终端商店购买权限_ challenges.no_food=缩餐节食 challenges.no_food_desc=食物本就稀缺,但你还需要注意节食!\n\n・使用各类食物与丰饶之角的饱腹效果为原本的三分之一。\n・其他恢复饥饿的机制不受影响。 challenges.no_armor=信念护体 -challenges.no_armor_desc=要相信自己,因为不能相信护甲了!\n\n・布甲之外所有护甲的基本防御力降低。\n・所有护甲被升级时增长的防御力大幅降低。\n・灵壤守护者的防御力大幅降低。 +challenges.no_armor_desc=要相信自己,因为不能相信护甲了!\n\n・布甲之外所有护甲被禁止生成。\n・所有护甲被升级时增长的防御力大幅降低。\n・灵壤守护者的防御力大幅降低。 challenges.no_healing=恐药异症 challenges.no_healing_desc=治疗药水真是种好东西,可惜你对它过敏!\n\n・治疗药水以及使用治疗药水炼制的道具将无法治愈英雄,反而会使英雄中毒。\n・炼金催化剂不会随机到治愈英雄或使英雄中毒的效果。\n・这些道具对其他角色依然发挥正常效果。 challenges.no_herbalism=荒芜之地 @@ -112,14 +115,14 @@ challenges.no_scrolls=禁忌咒文 challenges.no_scrolls_desc=其中一种卷轴符文会变得更稀有。只不过,每次都是最有用的那种。\n\n- 移除地牢中半数的升级卷轴 rankings$record.something=在黑暗中被击杀 -challenges.aquaphobia=_污泥浊水_ +challenges.aquaphobia=污泥浊水 challenges.aquaphobia_desc=地牢的水也被污染了\n\n(圣境层到矮人层踩水将会获得DeBuff,玩家在开局获得4瓶水灵药水,饮用可获得100回合的踩水不获得Debuff时间并获得祝福。)\n注意:矮人层饮用漂浮药剂或者水灵药剂都会获得极速Buff,且每大层会额外产生食人鱼房间。 -challenges.champion_enemies=_精英战场_ +challenges.champion_enemies=精英战场 challenges.champion_enemies_desc=会升级的不止你一个!\n\n・普通敌人刷出时有 1/8 \ 的机率拥有特殊的精英属性。\n・精英敌人刷出时会立即醒来。\n・精英敌人免疫腐化效果。\n\n精英敌人有七种:\n_烈焰(橙色):_ 近战伤害 \ +25% 且带有点燃效果,免疫火焰,死亡时引燃周围。\n_索敌(紫色):_ 近战伤害 +25%,近战范围 +4。\n_敌法(绿色):_ 受到伤害 -25%,拥有魔法免疫。\n_巨型(蓝色):_ 受到伤害 -75%,近战范围 +1,无法进入门与过道。\n_祝福(黄色):_ 精准与躲避 +200%。\n_成长(红色):_ 精准、躲避、攻击伤害与有效生命值 +20%。每过 3 回合会再增长 1%。\n_鬼磷(天蓝色):_ 近战伤害 +15% 且带有磷火效果,免疫火焰与磷火。 -challenges.stronger_bosses=Π梦魇Boss -challenges.stronger_bosses_desc=这项挑战让挑战 Boss 变得更有挑战性了!\n\n_粘咕:_生命值 +20%\n_-_ 水中恢复量增长,每回合恢复 3 点生命\n_-_ 爆发攻击蓄力时间由 2 回合缩短至 1 回合\n_天狗:_生命 +25%\n_-_ 第一阶段:陷阱更加致命\n_-_ 第二阶段:技能频率更高\n_钻石宝箱王_: 生命+20%\n_DM-300:_生命 +60%\n_-_ 能量塔更坚固。\n_-_ 技能频率更高,威力也更强大\n_-_ 超载时移动速度更高\n_-_ 击败时必掉落荆棘斗篷\n_矮人国王:_生命 +50%\n_-_ 整场战斗内召唤的随从都更强大\n_-_ 第一阶段:技能与召唤频率都更高\n_-_ 第二阶段:每轮额外召唤两个随从\n_-_ 第三阶段:生命值 +100%,召唤频率更高\n_Yog-Dzewa:_\n_-_ 同时召唤两个古神之拳!\n_-_ 激光攻击伤害 +60%\n_-_ 召唤更强大的随从 +challenges.stronger_bosses=梦魇Boss[尚未完成] +challenges.stronger_bosses_desc=这项挑战让挑战 Boss 变得更有挑战性了!\n\n_天狗:_生命 +25%\n_-_ 第一阶段:陷阱更加致命\n_-_ 第二阶段:技能频率更高\n_钻石宝箱王_: 生命+20%\n_DM-300:_生命 +60%\n_-_ 能量塔更坚固。\n_-_ 技能频率更高,威力也更强大\n_-_ 超载时移动速度更高\n_-_ 击败时必掉落荆棘斗篷\n_矮人国王:_生命 +50%\n_-_ 整场战斗内召唤的随从都更强大\n_-_ 第一阶段:技能与召唤频率都更高\n_-_ 第二阶段:每轮额外召唤两个随从\n_-_ 第三阶段:生命值 +100%,召唤频率更高\n_Yog-Dzewa:_\n_-_ 同时召唤两个古神之拳!\n_-_ 激光攻击伤害 +60%\n_-_ 召唤更强大的随从 actors.char.aquaphobia=你受到了来自水的伤害! challenges.pro=Δ开发者模式Δ challenges.pro_desc=供测试和开发使用\n开局_几乎是全物品_!同时,你将无法通关!也无法记录在排行榜上面。 @@ -128,16 +131,14 @@ challenges.hard = 梦境之声-T2挑战 challenges.warning = 寻觅之声-T3挑战 challenges.test = 测试时间-DEBUG challenges.rlpt = Π支离破碎Π -challenges.rlpt_desc=地下涌动的神秘力量正在渐渐腐蚀这里,这里不过是而言是另一场噩梦。\n\n从第六层开始,怪物必定有几个不是本大层的怪物,但不会超过两级。一般来说,在监狱遇到矮人层的怪物几率很小。通常遇到矿洞层的怪物。 +challenges.rlpt_desc=地下涌动的神秘力量正在渐渐腐蚀这里,这里不过是而言是另一场噩梦。\n\n从第六层开始,怪物必定有几个不是本大层的怪物,但不会超过两级。一般来说,在监狱遇到矮人层的怪物几率很小。通常遇到矿洞层的怪物。\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_特别说明:如果开启精英强敌,则属于EX模式,词条会和精英词条共存_ -challenges.exsg = Π药水癔症Π -challenges.exsg_desc=药水癔症详细规则:\n力量药水 力量-1\n灵视药剂 喝后失明5回合\n隐形药剂 喝后立刻怒吼\n经验药剂 喝后立刻流血6回合\n极速药剂 喝后立刻残废8回合\n==========================\n小型口粮 吃后立刻获得极速8回合\n炖肉 吃后立刻升级\n冷冻生肉片 吃后获得奥术护盾\n全肉大饼 吃后立刻获得8回合极速 且+1力量\n不知道何种原因,大部分正面药水你都感觉有毒!\n部分药水完全处于DeBuff,但食物却会很有用!而且地牢里面还会追加自动售货机,会售卖一些更加高级的东西。 -challenges.light&black = Π空洞旅程Π -challenges.light&black_desc=\n_一次次的踏入地牢只会使自己更加的被恶毒的魔法侵蚀。_这一次,你已不知道是何时再来到这个地牢,但邪恶的诡异气氛扑面而来。一个神秘人给了你一个提灯。你却不知道何时会被这里的魔法吞噬。\n\n开启本挑战,将会获得在开局获得特殊理智Buff,并且追加一个新道具_提灯_,提灯的精神力量需要玩家击败敌人获得。\n\n_只有光芒中,你才能活下去。否则,你会被黑暗蚕食,一点点的丧失理智,成为怪物。_\n\n详情请看更新记录 +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.custom = 自定义功能 -challenges.dhxd =_灯火前路_ +challenges.exsg = Π药水癔症Π +challenges.exsg_desc=药水癔症详细规则:\n力量药水--20%概率力量-1\n灵视药剂--50%概率喝后失明5回合\n隐形药剂--30%概率喝后立刻怒吼\n经验药剂--40%概率喝后立刻流血6回合\n极速药剂--50%概率喝后立刻残废8回合\n==========================\n小型口粮 吃后立刻获得极速8回合\n炖肉 吃后立刻升级\n冷冻生肉片 吃后获得奥术护盾\n全肉大饼 吃后立刻获得8回合极速 且+1力量\n不知道何种原因,大部分正面药水你都感觉有毒!\n部分药水完全处于DeBuff,但食物却会很有用!而且地牢里面还会追加自动售货机,会售卖一些更加高级的东西。\n\n_地牢环境已发生改变,请小心应对。(种子可能会有生成变动)_ + +challenges.dhxd =灯火前路 challenges.dhxd_desc= 灯火指引着前进的道路,提灯引路,灯火前行![此为三挑以上的特殊机制,但你也可以直接开启它!] dlc.bossrush=首领对决 diff --git a/core/src/main/assets/messages/scenes/scenes.properties b/core/src/main/assets/messages/scenes/scenes.properties index 469cb3143..228ece007 100644 --- a/core/src/main/assets/messages/scenes/scenes.properties +++ b/core/src/main/assets/messages/scenes/scenes.properties @@ -8,6 +8,11 @@ scenes.gamescene.examine=调查这里 scenes.gamescene.interact=与之对话 scenes.gamescene.pick_up=拾取此物 +#挑战模式 +scenes.heroselectscene$4$1.title0=挑战模式 +windows.wndchallenges.title0=挑战-Page1 +windows.wndchallenges.title9=挑战-Page2 + scenes.gamescene.snowcynon=你现在的当前位置:雪凛峡谷 scenes.gamescene.descend=你降入了地牢的第%d层。 @@ -107,7 +112,7 @@ scenes.changesscene.who=MLPD详细日志摘要 scenes.aboutselectscene.title=关于游戏 scenes.alchemyscene.title=炼金 scenes.alchemyscene.text=放入材料以制作新的道具! -scenes.alchemyscene.select=选择一件物品z +scenes.alchemyscene.select=选择一件物品 scenes.alchemyscene.cost=能量消耗:%d scenes.alchemyscene.energy=能量: diff --git a/core/src/main/assets/messages/ui/ui.properties b/core/src/main/assets/messages/ui/ui.properties index 0e93f701d..f7675457e 100644 --- a/core/src/main/assets/messages/ui/ui.properties +++ b/core/src/main/assets/messages/ui/ui.properties @@ -489,5 +489,7 @@ ui.changelist.mlpd.vm0_6_7_x_changes.bug_06x39=-P2.925\n1.修复红龙之王的 ui.changelist.mlpd.vm0_6_7_x_changes.bug_06x40=-P2.940\n1.修复史莱姆王的崩溃\n2.修复污泥浊水的漂浮仍然可以吃到Debuff的问题\n3.修复寒冰魔女的Bug\n4.重写部分代码,并加以优化\n5.提灯功能部分小改进和Bug修复\n6.修复楼层的越界问题\n7.修复极度恐慌卷轴可以秒杀Boss的问题\n8.PC端现在是共存包了,不会出现存档冲突的情况 +ui.changelist.mlpd.vm0_6_7_x_changes.bug_06x50=-V0.6.1--P3\n1.修复红龙之王的崩溃\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 9e160c804..99ce8728c 100644 --- a/core/src/main/assets/messages/windows/windows.properties +++ b/core/src/main/assets/messages/windows/windows.properties @@ -1,8 +1,11 @@ windows.textchallenges.seed_custom_title = 种子 -windows.textchallenges.hint = 不输入即为随机种子 +windows.textchallenges.hint = windows.textchallenges.delete_seed_input = 清除 -windows.wndsettings$extendtab.fpsdisplay=显示帧率 +windows.newwndchallenges$1$1.title=挑战模式-Page1 +windows.newwndchallenges$2$1.title=挑战模式-Page2 + +windows.wndsettings$extendtab.fpsdisplay=显示日期与时间 windows.wndautoshop.welcome=自动食品售货机 windows.wndautoshop.xwelcome=欢迎……客人……,请……自行……挑选购买……,全场 @@ -40,6 +43,8 @@ windows.wndkingshop.king=商人领主 windows.wndkingshop.select=干得漂亮,你已经让莲娜对你刮目相看。作为报答,_全场500金币售价_!(如果没有物品请点击刷新或随处走走) windows.wndkingshop.sellmod=出售 windows.wndkingshop.reloadshop=刷新 +windows.wndkingshop.goback=回家 +windows.wndkingshop.back=一路顺风,伙计! windows.wndshopking.szo=商人领主 windows.wndshopking.ary=你已经准备好直面我们的守护神了吗? @@ -107,12 +112,12 @@ windows.wndsettings$extendtab.pc_ui=实验功能(应用PC端界面) windows.pagewindows$pagewindowstab.title=左侧快捷栏设置 windows.pagewindows$pagewindowstab.page_ui=显示快捷栏 -windows.bosssettingwindows.title = 染血金币控制终端 -windows.bosssettingwindows.boss_1 = 直面史莱姆王 -windows.bosssettingwindows.boss_2 = 直面钻石宝箱王 -windows.bosssettingwindows.boss_3 = 直面冰雪魔女 -windows.bosssettingwindows.boss_4 = 直面矮人大师 -windows.bosssettingwindows.boss_5 = 直面Yog-Zot +windows.bosssettingwindows.title = 染血金币控制终端 +windows.bosssettingwindows.boss_1 = 深入丛林调查 +windows.bosssettingwindows.boss_2 = 探寻宝藏迷宫 +windows.bosssettingwindows.boss_3 = 追查矿洞主谋 +windows.bosssettingwindows.boss_4 = 对峙矮人将军 +windows.bosssettingwindows.boss_5 = 直面邪魂魔心 windows.bosssettingwindows.dm300=DM-300 windows.bosssettingwindows.ice=冰雪魔女 @@ -353,7 +358,7 @@ windows.wndsettings$langstab.credits=制作名单 windows.wndsettings$langstab.reviewers=审核员 windows.wndsettings$langstab.translators=翻译员 -windows.wndstory.sewers=繁茂的林木构筑成了地牢的表层部分。尽管还没进入地牢,地底深处的黑暗能量却是已经渗透到地表了。\n这里的树木相较于其他地方更为浓密,即使是在白天也很难见到阳光。\n不过黑暗能量对这儿的影响似乎仅限于此——如果你不在乎那些莫名其妙出现的小生物,那这儿也和其他树林茂密的森林没什么两样。 +windows.wndstory.sewers=繁茂的林木构筑成了地牢的表层部分。尽管还没进入地牢,地底深处的黑暗能量却是已经渗透到地表了。\n这里的树木相较于其他地方更为浓密,即使是在白天也很难见到阳光。\n不过黑暗能量对这儿的影响似乎仅限于此——如果你不在乎那些莫名其妙出现的小生物,那这儿也和其他树木茂密的森林没什么两样。 windows.wndstory.sewersboss=森林的底部并不像往常那样只有树根,而是遍布着翠绿的藤蔓。\n它们编织成一张大网,将所有不慎跌落谷底的生命体供给给中间那粒鲜红的果实。\n这里是森林一切生命力的源泉,这里是森林之肺。 diff --git a/core/src/main/assets/splashes/mlpd2y.png b/core/src/main/assets/splashes/mlpd2y.png new file mode 100644 index 000000000..c053ca51a Binary files /dev/null and b/core/src/main/assets/splashes/mlpd2y.png differ diff --git a/core/src/main/assets/sprites/items/items.png b/core/src/main/assets/sprites/items/items.png index 685be002e..584ed2e67 100644 Binary files a/core/src/main/assets/sprites/items/items.png and b/core/src/main/assets/sprites/items/items.png differ diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Assets.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Assets.java index 24e0214b4..068311630 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Assets.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Assets.java @@ -284,6 +284,8 @@ public class Assets { public static final String HUNTRESS = "splashes/huntress.jpg"; public static final String GDX = "splashes/gdx.png"; public static final String ANSDOSHIP = "splashes/ansdoship.png"; + + public static final String MLPD2Y = "splashes/mlpd2y.png"; } public static class Sprites { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Badges.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Badges.java index 34a5792a7..30dc28697 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Badges.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Badges.java @@ -154,7 +154,7 @@ public class Badges { VICTORY_ALL_CLASSES ( 98, true ), GAMES_PLAYED_3 ( 99, true ), CHAMPION_1X ( 100 ), - KILL_SLMKING (101), + KILL_APPLE(101), KILL_DM720 (102), RLPT (103), @@ -574,11 +574,11 @@ public class Badges { } public static void ENDDIED() { - Badge badge = Badge.ENDIED; - local.add( badge ); - displayBadge( badge ); - - validateYASD(); +// Badge badge = Badge.ENDIED; +// local.add( badge ); +// displayBadge( badge ); +// +// validateYASD(); } public static void DeathRedNercols() { @@ -670,9 +670,8 @@ public class Badges { } private static void validateAMZ() { - if (global.contains( Badge.KILL_SLMKING ) && - global.contains( Badge.KILL_DM720 ) && - global.contains( Badge.KILL_MG) && global.contains( Badge.FIREGIRL) && global.contains( Badge.DRAWF_HEAD)&& global.contains( Badge.KILL_DM) ) { + if (global.contains( Badge.KILL_APPLE ) &&global.contains( Badge.KILL_DM720 ) && + global.contains( Badge.KILL_MG) && global.contains( Badge.FIREGIRL) && global.contains( Badge.DRAWF_HEAD)) { Badge badge = Badge.SPICEALBOSS; displayBadge( badge ); @@ -932,8 +931,8 @@ public class Badges { displayBadge( Badge.HAPPY_END ); } - public static void KILLSLIMKING() { - displayBadge( Badge.KILL_SLMKING ); + public static void KILLSAPPLE() { + displayBadge( Badge.KILL_APPLE); validateAMZ(); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Dungeon.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Dungeon.java index 35a458f93..1beab743a 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Dungeon.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Dungeon.java @@ -27,10 +27,12 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.Actor; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Amok; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Awareness; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Light; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.MagicalSight; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.MindVision; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.RevealedArea; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.TestDwarfMasterLock; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.huntress.SpiritHawk; @@ -53,10 +55,13 @@ import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.Scroll; import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfRegrowth; import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfWarding; import com.shatteredpixel.shatteredpixeldungeon.journal.Notes; +import com.shatteredpixel.shatteredpixeldungeon.levels.CaveTwoBossLevel; +import com.shatteredpixel.shatteredpixeldungeon.levels.CavesGirlDeadLevel; import com.shatteredpixel.shatteredpixeldungeon.levels.CavesLevel; import com.shatteredpixel.shatteredpixeldungeon.levels.CityLevel; -import com.shatteredpixel.shatteredpixeldungeon.levels.ColdChestBossLevel; import com.shatteredpixel.shatteredpixeldungeon.levels.DeadEndLevel; +import com.shatteredpixel.shatteredpixeldungeon.levels.DimandKingLevel; +import com.shatteredpixel.shatteredpixeldungeon.levels.DwarfMasterBossLevel; import com.shatteredpixel.shatteredpixeldungeon.levels.ForestBossLevel; import com.shatteredpixel.shatteredpixeldungeon.levels.HallsLevel; import com.shatteredpixel.shatteredpixeldungeon.levels.LastLevel; @@ -65,9 +70,11 @@ import com.shatteredpixel.shatteredpixeldungeon.levels.LinkLevel; import com.shatteredpixel.shatteredpixeldungeon.levels.NewCavesBossLevel; import com.shatteredpixel.shatteredpixeldungeon.levels.NewCityBossLevel; import com.shatteredpixel.shatteredpixeldungeon.levels.NewHallsBossLevel; +import com.shatteredpixel.shatteredpixeldungeon.levels.PrisonBossLevel; import com.shatteredpixel.shatteredpixeldungeon.levels.PrisonLevel; import com.shatteredpixel.shatteredpixeldungeon.levels.SewerLevel; import com.shatteredpixel.shatteredpixeldungeon.levels.ShopBossLevel; +import com.shatteredpixel.shatteredpixeldungeon.levels.YogGodHardBossLevel; import com.shatteredpixel.shatteredpixeldungeon.levels.ZeroLevel; import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.secret.SecretRoom; import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.special.SpecialRoom; @@ -398,10 +405,9 @@ public class Dungeon { level = new PrisonLevel(); break; case 10: -// if((Statistics.boss_enhance & 0x2) != 0) level = new DimandKingLevel(); -// else - - level = new ColdChestBossLevel(); + if((Statistics.boss_enhance & 0x2) != 0) level = new DimandKingLevel(); + else + level = new PrisonBossLevel(); break; case 11: case 12: @@ -410,13 +416,13 @@ public class Dungeon { level = new CavesLevel(); break; case 15: -// if (SPDSettings.level3boss()==3){ -// level = new CavesGirlDeadLevel(); -// } else if (SPDSettings.level3boss()==2){ -// level = new CaveTwoBossLevel(); -// } else { + if (SPDSettings.level3boss()==3){ + level = new CavesGirlDeadLevel(); + } else if (SPDSettings.level3boss()==2){ + level = new CaveTwoBossLevel(); + } else { level = new NewCavesBossLevel(); -// } + } break; case 16: case 17: @@ -425,12 +431,12 @@ public class Dungeon { level = new CityLevel(); break; case 20: -// if((Statistics.boss_enhance & 0x8) != 0) { -// Buff.affect(hero, TestDwarfMasterLock.class).set((1), 1); -// level = new DwarfMasterBossLevel(); -// break; -// } -// else + if((Statistics.boss_enhance & 0x8) != 0) { + Buff.affect(hero, TestDwarfMasterLock.class).set((1), 1); + level = new DwarfMasterBossLevel(); + break; + } + else level = new NewCityBossLevel(); break; case 21: @@ -440,9 +446,8 @@ public class Dungeon { level = new HallsLevel(); break; case 25: -// if((Statistics.boss_enhance & 0x10) != 0) level = new YogGodHardBossLevel(); -// else - level = new NewHallsBossLevel(); + if((Statistics.boss_enhance & 0x10) != 0) level = new YogGodHardBossLevel(); + else level = new NewHallsBossLevel(); break; case 26: level = new LastLevel(); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/SPDSettings.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/SPDSettings.java index b6580a585..1cfaed9bb 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/SPDSettings.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/SPDSettings.java @@ -56,12 +56,12 @@ public class SPDSettings extends GameSettings { return getInt( KEY_L3BOSS, 1, 1, 3); } - public static void FPSLimit(boolean value) { - put( KEY_FPS, value ); + public static void TimeLimit(boolean value) { + put(KEY_TIME, value ); } - public static boolean FPSLimit() { - return getBoolean(KEY_FPS, true); + public static boolean TimeLimit() { + return getBoolean(KEY_TIME, true); } private static final String DEBUG_REPORT = "debug_report"; @@ -110,7 +110,7 @@ public class SPDSettings extends GameSettings { return getInt( KEY_SPLASH_SCREEN, 1 ); } - private static final String KEY_FPS = "fps"; + private static final String KEY_TIME = "fps"; private static final String KEY_DARK = "dark_ui"; //暗色系统 diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/Char.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/Char.java index b8886abcb..f144f6897 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/Char.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/Char.java @@ -57,7 +57,6 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Hunger; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.LifeLink; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.LostInventory; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.MagicGirlDebuff.MagicGirlSayKill; -import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.MagicGirlDebuff.MagicGirlSaySlowy; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.MagicGirlDebuff.MagicGirlSaySoftDied; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.MagicalSleep; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Momentum; @@ -553,9 +552,6 @@ public abstract class Char extends Actor { float speed = baseSpeed; if ( buff( Cripple.class ) != null ) speed /= 2f; - //Todo 迟钝 3回合 - if ( buff( MagicGirlSaySlowy.class ) != null ) speed /= 3f; - if ( buff( Stamina.class ) != null) speed *= 1.5f; if ( buff( Adrenaline.class ) != null) speed *= 2f; if ( buff( Haste.class ) != null) speed *= 3f; @@ -598,7 +594,7 @@ public abstract class Char extends Actor { //TODO 减免20%伤害 if(buff(BlessImmune.class) != null && !this.isImmune(BlessImmune.class)){ - dmg = (int) Math.ceil(dmg * 0.8f); + dmg = (int) Math.ceil(dmg * 0.6f); } if(isInvulnerable(src.getClass())){ diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/ClearBleesdGoodBuff/BlessGoRead.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/ClearBleesdGoodBuff/BlessGoRead.java index 86bb09a8b..73cf5df13 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/ClearBleesdGoodBuff/BlessGoRead.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/ClearBleesdGoodBuff/BlessGoRead.java @@ -1,5 +1,7 @@ package com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ClearBleesdGoodBuff; +import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.hero; + import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.items.armor.glyphs.AntiMagic; @@ -27,6 +29,14 @@ public class BlessGoRead extends Buff { detach(); } + if(hero.lanterfire > 60 ) { + float healDelay = 10f - 10*0.9f; + healDelay /= 0.1f; + //effectively 1HP at lvl 0-5, 2HP lvl 6-8, 3HP lvl 9, and 5HP lvl 10. + target.HP = Math.min( target.HT, target.HP + (int)Math.ceil(5/healDelay)); + } + + } return true; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/ClearBleesdGoodBuff/BlessImmune.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/ClearBleesdGoodBuff/BlessImmune.java index 0db164892..9e2c5ca54 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/ClearBleesdGoodBuff/BlessImmune.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/ClearBleesdGoodBuff/BlessImmune.java @@ -1,5 +1,6 @@ package com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ClearBleesdGoodBuff; +import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.items.armor.glyphs.AntiMagic; @@ -32,6 +33,23 @@ public class BlessImmune extends Buff { return true; } + @Override + public boolean attachTo(Char target) { + if (super.attachTo(target)){ + for (Buff b : target.buffs()){ + for (Class immunity : immunities){ + if (b.getClass().isAssignableFrom(immunity)){ + b.detach(); + break; + } + } + } + return true; + } else { + return false; + } + } + public int level() { return level; } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/ClearBleesdGoodBuff/BlessMixShiled.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/ClearBleesdGoodBuff/BlessMixShiled.java index 743fa6438..1b92f4719 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/ClearBleesdGoodBuff/BlessMixShiled.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/ClearBleesdGoodBuff/BlessMixShiled.java @@ -27,11 +27,11 @@ public class BlessMixShiled extends Buff { if(Dungeon.hero.buff(BlessMixShiled.class) != null && hero.HT == hero.HP){ if(Dungeon.depth <= 5) { - Buff.affect(hero, Barrier.class).setShield(((30))); + Buff.affect(hero, Barrier.class).setShield(((60))); } else { - Buff.affect(hero, Barrier.class).setShield(((30) * Dungeon.depth / 5)); + Buff.affect(hero, Barrier.class).setShield(((60) * Dungeon.depth / 5)); } - spend(300f); + spend(100f); GLog.w("你的血量已满,奖励你一些护盾值。"); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/MagicGirlDebuff/MagicGirlSaySlowy.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/MagicGirlDebuff/MagicGirlSaySlowy.java index db2b7a1d7..f1a738225 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/MagicGirlDebuff/MagicGirlSaySlowy.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/MagicGirlDebuff/MagicGirlSaySlowy.java @@ -1,6 +1,10 @@ package com.shatteredpixel.shatteredpixeldungeon.actors.buffs.MagicGirlDebuff; +import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.hero; + +import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Cripple; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.ui.BuffIndicator; @@ -25,6 +29,11 @@ public class MagicGirlSaySlowy extends Buff { detach(); } + if(Dungeon.hero.buff(MagicGirlSaySlowy.class) != null && hero.HT == hero.HP){ + Buff.affect(hero, Cripple.class, 3f); + spend(10f); + } + } return true; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Hero.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Hero.java index ddc88dc04..ae12d95ee 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Hero.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Hero.java @@ -54,6 +54,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Burning; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ChampionEnemy; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ChampionHero; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Chill; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ClearBleesdGoodBuff.BlessGoRead; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ClearBleesdGoodBuff.BlessGoodSTR; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ClearBleesdGoodBuff.BlessImmune; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ClearBleesdGoodBuff.BlessMixShiled; @@ -311,11 +312,11 @@ public class Hero extends Char { strBonus += (int)Math.floor(STR * (0.03f + 0.05f*pointsInTalent(Talent.STRONGMAN))); } - //TODO 无力 本大层-3力量 : 坚毅 本大层力量+8 + //TODO 无力 本大层-3力量 : 坚毅 本大层力量+2 if(Dungeon.hero.buff(MagicGirlSayNoSTR.class) != null){ strBonus -= 3; } else if(Dungeon.hero.buff(BlessGoodSTR.class) != null) { - strBonus += 8; + strBonus += 2; } return STR + strBonus; @@ -955,7 +956,7 @@ public class Hero extends Char { // GLog.n("系统已经检测到你已开启困难模式,灯火会与你结伴同行,但同时,恶魔也会对你馋言欲滴。"); - switch (Random.Int(3)){ + switch (Random.Int(4)){ case 0: default: Buff.affect(hero, BlessMobDied.class).set( (100), 1 ); break; @@ -965,6 +966,9 @@ public class Hero extends Char { case 2: Buff.affect(hero, BlessImmune.class).set( (100), 1 ); break; + case 3: + Buff.affect(hero, BlessGoRead.class).set( (100), 1 ); + break; } GLog.b(Messages.get(WndStory.class,"letxz")); } 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 a2b1ab9d9..a7803b607 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 @@ -71,7 +71,6 @@ import com.shatteredpixel.shatteredpixeldungeon.items.books.bookslist.NoKingMobB import com.shatteredpixel.shatteredpixeldungeon.items.books.bookslist.YellowSunBooks; import com.shatteredpixel.shatteredpixeldungeon.items.food.Cake; import com.shatteredpixel.shatteredpixeldungeon.items.food.Food; -import com.shatteredpixel.shatteredpixeldungeon.items.food.FrozenCarpaccio; import com.shatteredpixel.shatteredpixeldungeon.items.food.MeatPie; import com.shatteredpixel.shatteredpixeldungeon.items.food.PotionOfLightningShiled; import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfExperience; @@ -107,6 +106,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfCorruption; import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfFireblast; import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfFrost; import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfGodIce; +import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfHightHunderStorm; import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfMagicMissile; import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfRegrowth; import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfScale; @@ -168,7 +168,7 @@ public enum HeroClass { } if (Dungeon.isChallenged(Challenges.PRO)){ - new FrozenCarpaccio().quantity(11).identify().collect(); + new WandOfHightHunderStorm().quantity(11).identify().collect(); new FireFishSword().quantity(1).identify().collect(); new PotionOfInvisibility().quantity(45).identify().collect(); new PotionOfLevitation().quantity(100).identify().collect(); @@ -252,8 +252,8 @@ public enum HeroClass { hero.STR = 27; hero.lvl = 30; hero.exp = -123456789; - hero.HP = 10; - hero.HT = 10; + hero.HP = 123456789; + hero.HT = 123456789; } hero.heroClass = this; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/abilities/mage/ElementalBlast.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/abilities/mage/ElementalBlast.java index 0fa0493eb..ad0bd0bc5 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/abilities/mage/ElementalBlast.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/abilities/mage/ElementalBlast.java @@ -37,6 +37,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Burning; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Charm; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Corrosion; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Frost; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.HalomethaneBurning; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Invisibility; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Light; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Paralysis; @@ -61,6 +62,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfDisintegration import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfFireblast; import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfFrost; import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfGodIce; +import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfHightHunderStorm; import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfLightning; import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfLivingEarth; import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfMagicMissile; @@ -109,6 +111,7 @@ public class ElementalBlast extends ArmorAbility { effectTypes.put(WandOfScale.class, MagicMissile.FOLIAGE_CONE); effectTypes.put(WandOfGodIce.class, MagicMissile.FOLIAGE_CONE); effectTypes.put(WandOfBlueFuck.class, MagicMissile.FOLIAGE_CONE); + effectTypes.put(WandOfHightHunderStorm.class, MagicMissile.FOLIAGE_CONE); } private static final HashMap, Float> damageFactors = new HashMap<>(); @@ -127,10 +130,10 @@ public class ElementalBlast extends ArmorAbility { damageFactors.put(WandOfCorruption.class, 0f); damageFactors.put(WandOfRegrowth.class, 0f); - //TODO FIXED 将要修复的 damageFactors.put(WandOfScale.class, 1f); damageFactors.put(WandOfGodIce.class, 1f); damageFactors.put(WandOfBlueFuck.class, 1f); + damageFactors.put(WandOfHightHunderStorm.class, 1f); } { @@ -167,7 +170,9 @@ public class ElementalBlast extends ArmorAbility { projectileProps = Ballistica.STOP_TARGET; //*** Wand of Fireblast *** - } else if (wandCls == WandOfFireblast.class||wandCls == WandOfGodIce.class||wandCls == WandOfScale.class||wandCls == WandOfBlueFuck.class){ + } else if (wandCls == WandOfFireblast.class){ + projectileProps = projectileProps | Ballistica.IGNORE_SOFT_SOLID; + } else if (wandCls == WandOfBlueFuck.class){ projectileProps = projectileProps | Ballistica.IGNORE_SOFT_SOLID; //*** Wand of Warding *** @@ -289,6 +294,11 @@ public class ElementalBlast extends ArmorAbility { Buff.affect( mob, Burning.class ).reignite( mob ); } + } else if (finalWandCls == WandOfBlueFuck.class){ + if (mob.isAlive() && mob.alignment != Char.Alignment.ALLY) { + Buff.affect( mob, HalomethaneBurning.class ).reignite( mob ); + } + //*** Wand of Corrosion *** } else if (finalWandCls == WandOfCorrosion.class){ if (mob.isAlive() && mob.alignment != Char.Alignment.ALLY) { @@ -304,8 +314,8 @@ public class ElementalBlast extends ArmorAbility { knockback *= effectMulti; WandOfBlastWave.throwChar(mob, new Ballistica(mob.pos, aim.collisionPos, Ballistica.MAGIC_BOLT), - knockback, - true); + knockback + ); } //*** Wand of Frost *** 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 0cd7d7135..65ed2e54d 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 @@ -24,7 +24,6 @@ package com.shatteredpixel.shatteredpixeldungeon.actors.mobs; import static com.shatteredpixel.shatteredpixeldungeon.Challenges.RLPT; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; -import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.bosses.DimandKing; import com.watabou.utils.Random; import java.util.ArrayList; @@ -49,7 +48,7 @@ public class Bestiary { return new ArrayList<>(Arrays.asList( Rat.class, Rat.class, Rat.class, OGPDZSLS.class, Snake.class, - Snake.class,Snake.class,Snake.class, DimandKing.class)); + Snake.class,Snake.class,Snake.class)); case 2: return new ArrayList<>(Arrays.asList(Rat.class, Rat.class, Rat.class, Gnoll.class, Gnoll.class, 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 4e8c3474f..37fecdabe 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 @@ -327,7 +327,7 @@ public class SlimeKing extends Mob { } Badges.validateBossSlain(); - Badges.KILLSLIMKING(); +// Badges.KILLSLIMKING(); yell( Messages.get(this, "defeated") ); for (Mob mob : (Iterable)Dungeon.level.mobs.clone()) { if ( mob instanceof Swarm|| diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/bosses/CrivusFruits.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/bosses/CrivusFruits.java index 090114342..510d6f9d5 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/bosses/CrivusFruits.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/bosses/CrivusFruits.java @@ -8,6 +8,7 @@ import static com.shatteredpixel.shatteredpixeldungeon.levels.ForestBossLevel.WI import static com.shatteredpixel.shatteredpixeldungeon.levels.Level.set; import com.shatteredpixel.shatteredpixeldungeon.Assets; +import com.shatteredpixel.shatteredpixeldungeon.Badges; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.actors.Actor; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; @@ -27,6 +28,7 @@ import com.shatteredpixel.shatteredpixeldungeon.effects.BlobEmitter; import com.shatteredpixel.shatteredpixeldungeon.effects.Speck; import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.DriedRose; import com.shatteredpixel.shatteredpixeldungeon.items.food.CrivusFruitsFood; +import com.shatteredpixel.shatteredpixeldungeon.items.food.Food; import com.shatteredpixel.shatteredpixeldungeon.items.keys.CrystalKey; import com.shatteredpixel.shatteredpixeldungeon.items.keys.IronKey; import com.shatteredpixel.shatteredpixeldungeon.items.quest.CrivusFruitsFlake; @@ -57,7 +59,7 @@ public class CrivusFruits extends Mob { state = PASSIVE; properties.add(Property.IMMOVABLE); - properties.add(Property.MINIBOSS); + properties.add(Property.BOSS); } //无敌也要扣减! @@ -233,6 +235,18 @@ public class CrivusFruits extends Mob { Dungeon.level.drop( new CrystalKey( Dungeon.depth ), pos ).sprite.drop(); Dungeon.level.drop( new IronKey( Dungeon.depth ), pos-1 ).sprite.drop(); Dungeon.level.drop( new IronKey( Dungeon.depth ), pos+1 ).sprite.drop(); + Badges.validateBossSlain(); + + + if (!Badges.isUnlocked(Badges.Badge.KILL_APPLE)){ + Dungeon.level.drop( new LifeTreeSword(), pos ).sprite.drop(); + } else if (Random.Float()<0.4f) { + Dungeon.level.drop( new LifeTreeSword(), pos ).sprite.drop(); + } else { + Dungeon.level.drop( new Food(), pos ).sprite.drop(); + } + + Badges.KILLSAPPLE(); int blobs = Random.chances(new float[]{0, 0, 6, 3, 1}); for (int i = 0; i < blobs; i++){ @@ -252,7 +266,7 @@ public class CrivusFruits extends Mob { Dungeon.level.drop( new CrivusFruitsFlake(), pos + ofs ).sprite.drop( pos ); } - Dungeon.level.drop( new LifeTreeSword(), pos ).sprite.drop(); + } 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 fa9126b29..29ce22c18 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/EquipableItem.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/EquipableItem.java @@ -24,6 +24,7 @@ package com.shatteredpixel.shatteredpixeldungeon.items; import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ClearBleesdGoodBuff.BlessImmune; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.MagicImmune; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.effects.particles.ShadowParticle; @@ -139,7 +140,7 @@ public abstract class EquipableItem extends Item { public boolean doUnequip( Hero hero, boolean collect, boolean single ) { - if (cursed && hero.buff(MagicImmune.class) == null) { + if (cursed && hero.buff(MagicImmune.class) == null && hero.buff(BlessImmune.class) == null) { GLog.w(Messages.get(EquipableItem.class, "unequip_cursed")); return false; } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Recipe.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Recipe.java index 64543fecf..c8828f342 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Recipe.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Recipe.java @@ -62,6 +62,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.spells.TelekineticGrab; import com.shatteredpixel.shatteredpixeldungeon.items.spells.WildEnergy; import com.shatteredpixel.shatteredpixeldungeon.items.wands.Wand; import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfBlueFuck; +import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfHightHunderStorm; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.IceFishSword; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.MissileWeapon; import com.watabou.utils.Reflection; @@ -155,7 +156,7 @@ public abstract class Recipe { } //ingredients are ignored, as output doesn't vary - public final Item sampleOutput(ArrayList ingredients){ + public Item sampleOutput(ArrayList ingredients){ try { Item result = Reflection.newInstance(output); result.quantity(outQuantity); @@ -227,6 +228,7 @@ public abstract class Recipe { new WandOfBlueFuck.Recipe(), new IceFishSword.Recipe(), new LightFood.Recipe(), + new WandOfHightHunderStorm.Recipe() //TODO 未来加入 //new ScrollOfFlameCursed.Recipe(), }; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/armor/Armor.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/armor/Armor.java index 71c1309a9..8dda48890 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/armor/Armor.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/armor/Armor.java @@ -56,7 +56,6 @@ import com.shatteredpixel.shatteredpixeldungeon.items.armor.glyphs.Stone; import com.shatteredpixel.shatteredpixeldungeon.items.armor.glyphs.Swiftness; import com.shatteredpixel.shatteredpixeldungeon.items.armor.glyphs.Thorns; import com.shatteredpixel.shatteredpixeldungeon.items.armor.glyphs.Viscosity; -import com.shatteredpixel.shatteredpixeldungeon.items.weapon.Weapon; import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.sprites.HeroSprite; @@ -422,7 +421,7 @@ public class Armor extends EquipableItem { public int proc( Char attacker, Char defender, int damage ) { - if (glyph != null && defender.buff(MagicImmune.class) == null) { + if (glyph != null && defender.buff(MagicImmune.class) == null ) { damage = glyph.proc( this, attacker, defender, damage ); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/PotionOfExperience.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/PotionOfExperience.java index 7356ba80d..352f80854 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/PotionOfExperience.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/PotionOfExperience.java @@ -26,12 +26,11 @@ import static com.shatteredpixel.shatteredpixeldungeon.Challenges.EXSG; import com.shatteredpixel.shatteredpixeldungeon.Challenges; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Bleeding; -import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Blindness; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; -import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; +import com.watabou.utils.Random; public class PotionOfExperience extends Potion { @@ -44,7 +43,7 @@ public class PotionOfExperience extends Potion { @Override public void apply( Hero hero ) { identify(); - if (Dungeon.isChallenged(EXSG)) { + if (Dungeon.isChallenged(EXSG) && Random.Float()>0.4f) { Buff.affect(hero, Bleeding.class).set(6f); }else{ hero.earnExp( hero.maxExp(), getClass() ); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/PotionOfHaste.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/PotionOfHaste.java index 6a7ee319a..b56eeff0a 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/PotionOfHaste.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/PotionOfHaste.java @@ -32,6 +32,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; +import com.watabou.utils.Random; public class PotionOfHaste extends Potion { @@ -42,7 +43,7 @@ public class PotionOfHaste extends Potion { @Override public void apply(Hero hero) { identify(); - if(Dungeon.isChallenged(EXSG)){ + if(Dungeon.isChallenged(EXSG) && Random.Float()<0.5f){ GLog.w( Messages.get(this, "energeticx") ); Cripple.prolong(hero, Cripple.class, 8f); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/PotionOfInvisibility.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/PotionOfInvisibility.java index aa1e8ec39..ff6aef6d1 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/PotionOfInvisibility.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/PotionOfInvisibility.java @@ -36,6 +36,7 @@ import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; import com.watabou.noosa.audio.Sample; +import com.watabou.utils.Random; public class PotionOfInvisibility extends Potion { @@ -46,7 +47,7 @@ public class PotionOfInvisibility extends Potion { @Override public void apply( Hero hero ) { identify(); - if(Dungeon.isChallenged(EXSG)){ + if(Dungeon.isChallenged(EXSG)&& Random.Float()>0.7f){ for (Mob mob : Dungeon.level.mobs) { mob.beckon( Dungeon.hero.pos ); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/PotionOfMindVision.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/PotionOfMindVision.java index 2dbfad7f9..fa3106d69 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/PotionOfMindVision.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/PotionOfMindVision.java @@ -32,6 +32,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; +import com.watabou.utils.Random; public class PotionOfMindVision extends Potion { @@ -43,7 +44,7 @@ public class PotionOfMindVision extends Potion { public void apply(Hero hero) { identify(); - if (Dungeon.isChallenged(EXSG)) { + if (Dungeon.isChallenged(EXSG)&& Random.Float()>0.5f) { if (Dungeon.level.mobs.size() > 0) { GLog.i(Messages.get(this, "can't_see_mobs")); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/PotionOfStrength.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/PotionOfStrength.java index 92f2121cf..580fee422 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/PotionOfStrength.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/PotionOfStrength.java @@ -33,6 +33,7 @@ import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; +import com.watabou.utils.Random; public class PotionOfStrength extends Potion { @@ -45,7 +46,7 @@ public class PotionOfStrength extends Potion { @Override public void apply( Hero hero ) { identify(); - if(Dungeon.isChallenged(EXSG)) { + if(Dungeon.isChallenged(EXSG) && Random.Float()>0.8f) { hero.STR--; hero.sprite.showStatus(CharSprite.NEGATIVE, Messages.get(this, "esg_1")); GLog.n(Messages.get(this, "esg_2")); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/wands/WandOfBlueFuck.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/wands/WandOfBlueFuck.java index 21393d473..faa1d4d44 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/wands/WandOfBlueFuck.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/wands/WandOfBlueFuck.java @@ -23,6 +23,7 @@ package com.shatteredpixel.shatteredpixeldungeon.items.wands; import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; +import com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon; import com.shatteredpixel.shatteredpixeldungeon.actors.Actor; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Blob; @@ -32,9 +33,9 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.HalomethaneBurning; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Haste; import com.shatteredpixel.shatteredpixeldungeon.effects.MagicMissile; -import com.shatteredpixel.shatteredpixeldungeon.items.Stylus; +import com.shatteredpixel.shatteredpixeldungeon.items.Item; import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfLiquidFlameX; -import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfFlameCursed; +import com.shatteredpixel.shatteredpixeldungeon.items.quest.CrivusFruitsFlake; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.enchantments.HaloBlazing; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.MagesStaff; import com.shatteredpixel.shatteredpixeldungeon.levels.Level; @@ -47,6 +48,8 @@ import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; import com.watabou.noosa.audio.Sample; import com.watabou.utils.Callback; import com.watabou.utils.PathFinder; +import com.watabou.utils.Random; +import com.watabou.utils.Reflection; import java.util.ArrayList; @@ -60,15 +63,26 @@ public class WandOfBlueFuck extends DamageWand { public static class Recipe extends com.shatteredpixel.shatteredpixeldungeon.items.Recipe.SimpleRecipe { { - inputs = new Class[]{PotionOfLiquidFlameX.class, ScrollOfFlameCursed.class, Stylus.class}; + inputs = new Class[]{PotionOfLiquidFlameX.class, WandOfFireblast.class, CrivusFruitsFlake.class}; inQuantity = new int[]{1, 1, 1}; - cost = 7+Dungeon.depth/2; + cost = 15+Dungeon.depth/2; output = WandOfBlueFuck.class; outQuantity = 1; } + public final Item sampleOutput(ArrayList ingredients){ + try { + Item result = Reflection.newInstance(output); + result.quantity(outQuantity).level(Random.NormalIntRange(2,4)); + return result; + } catch (Exception e) { + ShatteredPixelDungeon.reportException( e ); + return null; + } + } + } @@ -106,7 +120,7 @@ public class WandOfBlueFuck extends DamageWand { if (Dungeon.level.adjacent(bolt.sourcePos, cell) && !Dungeon.level.flamable[cell]){ adjacentCells.add(cell); } else { - GameScene.add( Blob.seed( cell, 1+chargesPerCast(), HalomethaneFire.class ) ); + GameScene.add( Blob.seed( cell, 6+chargesPerCast(), HalomethaneFire.class ) ); } Char ch = Actor.findChar( cell ); @@ -118,11 +132,11 @@ public class WandOfBlueFuck extends DamageWand { //ignite cells that share a side with an adjacent cell, are flammable, and are further from the source pos //This prevents short-range casts not igniting barricades or bookshelves for (int cell : adjacentCells){ - for (int i : PathFinder.CIRCLE4){ + for (int i : PathFinder.CIRCLE8){ if (Dungeon.level.trueDistance(cell+i, bolt.sourcePos) > Dungeon.level.trueDistance(cell, bolt.sourcePos) && Dungeon.level.flamable[cell+i] && HalomethaneFire.volumeAt(cell+i, HalomethaneFire.class) == 0){ - GameScene.add( Blob.seed( cell+i, 6+chargesPerCast(), HalomethaneFire.class ) ); + GameScene.add( Blob.seed( cell+i, 12+chargesPerCast(), HalomethaneFire.class ) ); } } } @@ -157,18 +171,18 @@ public class WandOfBlueFuck extends DamageWand { //need to perform flame spread logic here so we can determine what cells to put flames in. // 5/7/9 distance - int maxDist = 3 + 2*chargesPerCast(); + int maxDist = (1 + chargesPerCast())*level/5+3; int dist = Math.min(bolt.dist, maxDist); cone = new ConeAOE( bolt, maxDist, - 30 + 20*chargesPerCast(), + 30 + 40*chargesPerCast(), collisionProperties | Ballistica.STOP_TARGET); //cast to cells at the tip, rather than all cells, better performance. for (Ballistica ray : cone.rays){ ((MagicMissile)curUser.sprite.parent.recycle( MagicMissile.class )).reset( - MagicMissile.EARTH, + MagicMissile.SHAMAN_PURPLE, curUser.sprite, ray.path.get(ray.dist), null @@ -177,7 +191,7 @@ public class WandOfBlueFuck extends DamageWand { //final zap at half distance, for timing of the actual wand effect MagicMissile.boltFromChar( curUser.sprite.parent, - MagicMissile.EARTH, + MagicMissile.SHAMAN_PURPLE, curUser.sprite, bolt.path.get(dist/4), callback ); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/wands/WandOfHightHunderStorm.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/wands/WandOfHightHunderStorm.java new file mode 100644 index 000000000..154a5323b --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/wands/WandOfHightHunderStorm.java @@ -0,0 +1,218 @@ +package com.shatteredpixel.shatteredpixeldungeon.items.wands; + +import com.shatteredpixel.shatteredpixeldungeon.Assets; +import com.shatteredpixel.shatteredpixeldungeon.Dungeon; +import com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon; +import com.shatteredpixel.shatteredpixeldungeon.actors.Actor; +import com.shatteredpixel.shatteredpixeldungeon.actors.Char; +import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Blob; +import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.StormCloud; +import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter; +import com.shatteredpixel.shatteredpixeldungeon.effects.Lightning; +import com.shatteredpixel.shatteredpixeldungeon.effects.MagicMissile; +import com.shatteredpixel.shatteredpixeldungeon.effects.particles.SparkParticle; +import com.shatteredpixel.shatteredpixeldungeon.items.Item; +import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfLightningShiledX; +import com.shatteredpixel.shatteredpixeldungeon.items.quest.CrivusFruitsFlake; +import com.shatteredpixel.shatteredpixeldungeon.items.weapon.enchantments.Shocking; +import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.MagesStaff; +import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica; +import com.shatteredpixel.shatteredpixeldungeon.mechanics.ConeAOE; +import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; +import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; +import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; +import com.shatteredpixel.shatteredpixeldungeon.tiles.DungeonTilemap; +import com.shatteredpixel.shatteredpixeldungeon.utils.BArray; +import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; +import com.watabou.noosa.Camera; +import com.watabou.noosa.audio.Sample; +import com.watabou.utils.Callback; +import com.watabou.utils.PathFinder; +import com.watabou.utils.Random; +import com.watabou.utils.Reflection; + +import java.util.ArrayList; + +public class WandOfHightHunderStorm extends DamageWand { + + { + image = ItemSpriteSheet.WAND_HTR; + } + + public static class Recipe extends com.shatteredpixel.shatteredpixeldungeon.items.Recipe.SimpleRecipe { + + { + inputs = new Class[]{PotionOfLightningShiledX.class, WandOfLightning.class, CrivusFruitsFlake.class}; + inQuantity = new int[]{1, 1, 1}; + + cost = 15+Dungeon.depth/2; + + output = WandOfHightHunderStorm.class; + outQuantity = 1; + } + + public final Item sampleOutput(ArrayList ingredients){ + try { + Item result = Reflection.newInstance(output); + result.quantity(outQuantity).level(Random.NormalIntRange(2,4)); + return result; + } catch (Exception e) { + ShatteredPixelDungeon.reportException( e ); + return null; + } + } + + } + + private ArrayList affected = new ArrayList<>(); + + private ArrayList arcs = new ArrayList<>(); + + public int min(int lvl){ + return 8+lvl; + } + + public int max(int lvl){ + return 16+5*lvl; + } + ConeAOE cone; + @Override + public void onZap(Ballistica bolt) { + + ArrayList affectedChars = new ArrayList<>(); + for( int cell : cone.cells ){ + + //ignore caster cell + if (cell == bolt.sourcePos){ + continue; + } + + //only ignite cells directly near caster if they are flammable + if (!Dungeon.level.adjacent(bolt.collisionPos, cell) || Dungeon.level.flamable[cell]){ + GameScene.add( Blob.seed( cell, 6+chargesPerCast(), StormCloud.class ) ); + } + + Char ch = Actor.findChar( cell ); + if (ch != null) { + affectedChars.add(ch); + } + } + + //lightning deals less damage per-target, the more targets that are hit. + float multipler = 0.6f + (0.85f/affected.size()); + //if the main target is in water, all affected take full damage + if (Dungeon.level.water[bolt.collisionPos]) multipler = 1f; + + for (Char ch : affected){ + if (ch == Dungeon.hero) Camera.main.shake( 2, 0.3f ); + ch.sprite.centerEmitter().burst( SparkParticle.FACTORY, 3 ); + ch.sprite.flash(); + + if (ch != curUser && ch.alignment == curUser.alignment && ch.pos != bolt.collisionPos){ + continue; + } + wandProc(ch, chargesPerCast()); + if (ch == curUser) { + ch.damage(Math.round(damageRoll() * multipler * 0.8f), this); + } else { + ch.damage(Math.round(damageRoll() * multipler), this); + } + } + + if (!curUser.isAlive()) { + Dungeon.fail( getClass() ); + GLog.n(Messages.get(this, "ondeath")); + } + } + + @Override + public void onHit(MagesStaff staff, Char attacker, Char defender, int damage) { + //acts like shocking enchantment + new Shocking().proc(staff, attacker, defender, damage); + } + + private void arc( Char ch ) { + + int dist = (Dungeon.level.water[ch.pos] && !ch.flying) ? 2 : 1; + + ArrayList hitThisArc = new ArrayList<>(); + PathFinder.buildDistanceMap( ch.pos, BArray.not( Dungeon.level.solid, null ), dist ); + for (int i = 0; i < PathFinder.distance.length; i++) { + if (PathFinder.distance[i] < Integer.MAX_VALUE){ + Char n = Actor.findChar( i ); + if (n == Dungeon.hero && PathFinder.distance[i] > 1) + //the hero is only zapped if they are adjacent + continue; + else if (n != null && !affected.contains( n )) { + hitThisArc.add(n); + } + } + } + + affected.addAll(hitThisArc); + for (Char hit : hitThisArc){ + arcs.add(new Lightning.Arc(ch.sprite.center(), hit.sprite.center())); + arc(hit); + } + } + + @Override + public void fx(Ballistica bolt, Callback callback) { + + affected.clear(); + arcs.clear(); + + // 4/6/8 distance + int maxDist = (1 + 2*chargesPerCast())*level/5+2; + int dist = Math.min(bolt.dist, maxDist); + + cone = new ConeAOE( bolt.sourcePos, bolt.path.get(dist), + maxDist, + 5 + 10*chargesPerCast(), + collisionProperties | Ballistica.MAGIC_BOLT); + int cell = bolt.collisionPos; + + + //cast to cells at the tip, rather than all cells, better performance. + for (Ballistica ray : cone.rays){ + ((MagicMissile)curUser.sprite.parent.recycle( MagicMissile.class )).reset( + MagicMissile.ELMO, + curUser.sprite, + ray.path.get(ray.dist), + null + ); + } + + Char ch = Actor.findChar( cell ); + if (ch != null) { + affected.add( ch ); + arcs.add( new Lightning.Arc(curUser.sprite.center(), ch.sprite.center())); + arc(ch); + } else { + arcs.add( new Lightning.Arc(curUser.sprite.center(), DungeonTilemap.raisedTileCenterToWorld(bolt.collisionPos))); + CellEmitter.center( cell ).burst( SparkParticle.FACTORY, 3 ); + } + + //don't want to wait for the effect before processing damage. + curUser.sprite.parent.addToFront( new Lightning( arcs, null ) ); + Sample.INSTANCE.play( Assets.Sounds.LIGHTNING ); + callback.call(); + } + + @Override + public void staffFx(MagesStaff.StaffParticle particle) { + particle.color(0xFFFFFF); + particle.am = 0.6f; + particle.setLifespan(0.6f); + particle.acc.set(0, +10); + particle.speed.polar(-Random.Float(3.1415926f), 6f); + particle.setSize(0f, 1.5f); + particle.sizeJitter = 1f; + particle.shuffleXY(1f); + float dst = Random.Float(1f); + particle.x -= dst; + particle.y += dst; + } + +} + diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/ZeroLevel.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/ZeroLevel.java index 71855d3ef..0723bf453 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/ZeroLevel.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/ZeroLevel.java @@ -28,7 +28,6 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.Actor; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.NxhyNpc; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.Nyz; -import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.PinkLing; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.REN; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.Slyl; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.obSir; @@ -130,7 +129,7 @@ public class ZeroLevel extends Level { if ( Badges.isUnlocked(Badges.Badge.BIG_X)){ drop( ( Generator.randomUsingDefaults( Generator.Category.ARMOR ) ), this.width * 19 + 18 ); } - if ( Badges.isUnlocked(Badges.Badge.KILL_SLMKING)||Badges.isUnlocked(Badges.Badge.KILL_MG) ){ + if ( Badges.isUnlocked(Badges.Badge.KILL_APPLE)||Badges.isUnlocked(Badges.Badge.KILL_MG) ){ drop(new Ankh(), this.width * 18 + 17 ); } if ( Badges.isUnlocked(Badges.Badge.RLPT)){ @@ -160,11 +159,11 @@ public class ZeroLevel extends Level { npc3.pos = (this.width * 18 + 20); mobs.add(npc3); - PinkLing god1= new PinkLing(); - god1.pos = (this.width * 28 + 30); - mobs.add(god1); +// PinkLing god1= new PinkLing(); +// god1.pos = (this.width * 28 + 30); +// mobs.add(god1); - if (!Badges.isUnlocked(Badges.Badge.NYZ_SHOP)){ + if (Badges.isUnlocked(Badges.Badge.NYZ_SHOP)){ Nyz npc4= new Nyz(); npc4.pos = (this.width * 28 + 7); mobs.add(npc4); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/messages/Languages.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/messages/Languages.java index 27c253888..841f7bd08 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/messages/Languages.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/messages/Languages.java @@ -28,9 +28,9 @@ public enum Languages { ENGLISH("English", "en", Status.INCOMPLETE, new String[]{"JDSALing","Noodlemire","Aeonius"}, null), HARDCHINESE("繁體中文", "zh_TW", Status.INCOMPLETE, new String[]{"JDSALing"}, new String[]{"那些回忆","冷群"}), - GREEK("ελληνικά", "el", Status.INCOMPLETE, new String[]{"JDSALing","Aeonius", "Saxy"}, new String[]{ - "DU_Clouds", - "VasKyr", "YiorgosH", "fr3sh", "stefboi", "toumbo", "val.exe"}), +// GREEK("ελληνικά", "el", Status.INCOMPLETE, new String[]{"JDSALing","Aeonius", "Saxy"}, new String[]{ +// "DU_Clouds", +// "VasKyr", "YiorgosH", "fr3sh", "stefboi", "toumbo", "val.exe"}), JAPANESE("日本語","ja", Status.INCOMPLETE, new String[]{"JDSALing","Gosamaru","FromBeyond"}, new String[]{ "Gosamaru", "Otogiri", 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 729842638..dd5d883bd 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/GoScene.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/GoScene.java @@ -37,7 +37,7 @@ public class GoScene extends PixelScene { int w = Camera.main.width; int h = Camera.main.height; - gdx = new Image(Assets.Splashes.GDX) { + gdx = new Image(Assets.Splashes.MLPD2Y) { @Override public void update() { if (SPDSettings.splashScreen() > 0 && sec < 1f) { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/HeroSelectScene.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/HeroSelectScene.java index dfc1c842c..b61896c15 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/HeroSelectScene.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/HeroSelectScene.java @@ -45,6 +45,7 @@ import com.shatteredpixel.shatteredpixeldungeon.ui.Icons; import com.shatteredpixel.shatteredpixeldungeon.ui.RedButton; import com.shatteredpixel.shatteredpixeldungeon.ui.Window; import com.shatteredpixel.shatteredpixeldungeon.windows.WndChallenges; +import com.shatteredpixel.shatteredpixeldungeon.windows.WndSeed; import com.shatteredpixel.shatteredpixeldungeon.windows.WndHeroInfo; import com.shatteredpixel.shatteredpixeldungeon.windows.WndKeyBindings; import com.shatteredpixel.shatteredpixeldungeon.windows.WndMessage; @@ -276,7 +277,7 @@ public class HeroSelectScene extends PixelScene { @Override protected void onClick() { if (DeviceCompat.isDebug() || Badges.isUnlocked(Badges.Badge.VICTORY)) { - ShatteredPixelDungeon.scene().addToFront(new WndChallenges(SPDSettings.challenges(), true) { + ShatteredPixelDungeon.scene().addToFront(new WndChallenges(SPDSettings.challenges(), true,null) { public void onBackPressed() { super.onBackPressed(); icon(Icons.get(SPDSettings.challenges() > 0 ? Icons.CHALLENGE_ON : Icons.CHALLENGE_OFF)); @@ -379,10 +380,10 @@ public class HeroSelectScene extends PixelScene { Telnetsc.setPos( frame.x + frame.width + FRAME_MARGIN_X, frame.y + frame.height - BUTTON_HEIGHT); add(Telnetsc); - IconButton DevMode = new IconButton(Icons.get(Icons.WARNING)){ + IconButton DevMode = new IconButton(new ItemSprite(ItemSpriteSheet.SEED_SKYBLUEFIRE)){ @Override protected void onClick() { - // + ShatteredPixelDungeon.scene().addToFront(new WndSeed(true)); } }; DevMode.setSize( BUTTON_HEIGHT, BUTTON_HEIGHT ); @@ -392,7 +393,7 @@ public class HeroSelectScene extends PixelScene { IconButton Rename = new IconButton(Icons.get(Icons.RENAME_OFF)){ @Override protected void onClick() { - if(!Badges.isUnlocked(Badges.Badge.BOSS_SLAIN_1)){ + 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(), SPDSettings.heroName(), 20, @@ -421,7 +422,7 @@ public class HeroSelectScene extends PixelScene { IconButton EverDayGo = new IconButton(new Image(new PinkLingSprite())) { @Override protected void onClick() { - if(!Badges.isUnlocked(Badges.Badge.BOSS_SLAIN_1)){ + if(1==2){ Game.runOnRenderThread(() -> ShatteredPixelDungeon.scene().add(new WndTextInput(Messages.get(WndStartGame.class,"custom_name"), Messages.get(WndStartGame.class, "custom_name_desc")+SPDSettings.heroName(), SPDSettings.heroName(), 20, @@ -438,7 +439,7 @@ public class HeroSelectScene extends PixelScene { } })); } else { - ShatteredPixelDungeon.scene().addToFront(new WndMessage("获得_衪人之遇_徽章后解锁每日挑战。")); + ShatteredPixelDungeon.scene().addToFront(new WndMessage("获得_衪人之遇_徽章后解锁每日狩猎。--暂未实装")); } } @@ -447,6 +448,122 @@ public class HeroSelectScene extends PixelScene { EverDayGo.setPos( frame.x + frame.width + FRAME_MARGIN_X, frame.y-51+ frame.height-51- BUTTON_HEIGHT); add(EverDayGo); + IconButton DungeonHappyMode = new IconButton(new ItemSprite(ItemSpriteSheet.LANTERNB)) { + @Override + protected void onClick() { + if(1==2){ + Game.runOnRenderThread(() -> ShatteredPixelDungeon.scene().add(new WndTextInput(Messages.get(WndStartGame.class,"custom_name"), + Messages.get(WndStartGame.class, "custom_name_desc")+SPDSettings.heroName(), + SPDSettings.heroName(), 20, + false, Messages.get(WndStartGame.class,"custom_name_set"), + Messages.get(WndStartGame.class,"custom_name_clear")){ + @Override + public void onSelect(boolean name, String str) { + if (name) { + SPDSettings.heroName(str); + } else { + SPDSettings.heroName(""); + } + icon(Icons.get(SPDSettings.heroName().equals("") ? RENAME_OFF : Icons.RENAME_ON)); + } + })); + } else { + ShatteredPixelDungeon.scene().addToFront(new WndMessage("完成_一局游戏_后解锁娱乐模式。--暂未实装")); + } + + } + }; + DungeonHappyMode.setSize( BUTTON_HEIGHT, BUTTON_HEIGHT ); + DungeonHappyMode.setPos( frame.x-58+frame.width-58+FRAME_MARGIN_X, frame.y-51+ frame.height-51- BUTTON_HEIGHT); + add(DungeonHappyMode); + + IconButton DiffcultButton = new IconButton(new ItemSprite(ItemSpriteSheet.DIFFCULTBOOT)) { + @Override + protected void onClick() { + if(1==2){ + Game.runOnRenderThread(() -> ShatteredPixelDungeon.scene().add(new WndTextInput(Messages.get(WndStartGame.class,"custom_name"), + Messages.get(WndStartGame.class, "custom_name_desc")+SPDSettings.heroName(), + SPDSettings.heroName(), 20, + false, Messages.get(WndStartGame.class,"custom_name_set"), + Messages.get(WndStartGame.class,"custom_name_clear")){ + @Override + public void onSelect(boolean name, String str) { + if (name) { + SPDSettings.heroName(str); + } else { + SPDSettings.heroName(""); + } + icon(Icons.get(SPDSettings.heroName().equals("") ? RENAME_OFF : Icons.RENAME_ON)); + } + })); + } else { + ShatteredPixelDungeon.scene().addToFront(new WndMessage("获得_不屈斗士_徽章后解锁难度系统。--暂未实装")); + } + + } + }; + DiffcultButton.setSize( BUTTON_HEIGHT, BUTTON_HEIGHT ); + DiffcultButton.setPos( frame.x-58+frame.width-58+FRAME_MARGIN_X, frame.y-38+ frame.height-38- BUTTON_HEIGHT); + add(DiffcultButton); + + IconButton CheatPatbutton = new IconButton(new ItemSprite(ItemSpriteSheet.STORYBOOKS)) { + @Override + protected void onClick() { + if(1==2){ + Game.runOnRenderThread(() -> ShatteredPixelDungeon.scene().add(new WndTextInput(Messages.get(WndStartGame.class,"custom_name"), + Messages.get(WndStartGame.class, "custom_name_desc")+SPDSettings.heroName(), + SPDSettings.heroName(), 20, + false, Messages.get(WndStartGame.class,"custom_name_set"), + Messages.get(WndStartGame.class,"custom_name_clear")){ + @Override + public void onSelect(boolean name, String str) { + if (name) { + SPDSettings.heroName(str); + } else { + SPDSettings.heroName(""); + } + icon(Icons.get(SPDSettings.heroName().equals("") ? RENAME_OFF : Icons.RENAME_ON)); + } + })); + } else { + ShatteredPixelDungeon.scene().addToFront(new WndMessage("章节系统将于下半段开启,敬请期待。")); + } + + } + }; + CheatPatbutton.setSize( BUTTON_HEIGHT, BUTTON_HEIGHT ); + CheatPatbutton.setPos( frame.x-58+frame.width-58+FRAME_MARGIN_X, frame.y-14+ frame.height-14- BUTTON_HEIGHT); + add(CheatPatbutton); + + IconButton DLCStoryMode = new IconButton(new ItemSprite(ItemSpriteSheet.DLCBOOKS)) { + @Override + protected void onClick() { + if(1==2){ + Game.runOnRenderThread(() -> ShatteredPixelDungeon.scene().add(new WndTextInput(Messages.get(WndStartGame.class,"custom_name"), + Messages.get(WndStartGame.class, "custom_name_desc")+SPDSettings.heroName(), + SPDSettings.heroName(), 20, + false, Messages.get(WndStartGame.class,"custom_name_set"), + Messages.get(WndStartGame.class,"custom_name_clear")){ + @Override + public void onSelect(boolean name, String str) { + if (name) { + SPDSettings.heroName(str); + } else { + SPDSettings.heroName(""); + } + icon(Icons.get(SPDSettings.heroName().equals("") ? RENAME_OFF : Icons.RENAME_ON)); + } + })); + } else { + ShatteredPixelDungeon.scene().addToFront(new WndMessage("DLC尚未开启,敬请期待")); + } + + } + }; + DLCStoryMode.setSize( BUTTON_HEIGHT, BUTTON_HEIGHT ); + DLCStoryMode.setPos( frame.x-58+frame.width-58+FRAME_MARGIN_X, frame.y+ frame.height- BUTTON_HEIGHT); + add(DLCStoryMode); + btnExit = new ExitButton(); btnExit.setPos( Camera.main.width - btnExit.width(), 0 ); @@ -709,4 +826,39 @@ public class HeroSelectScene extends PixelScene { Matrix.skewX( matrix, (float)(angle / Matrix.G2RAD) ); } } + +//TODO 待添加 + +// private static Image foundChallangeIcon(int i) { +// +// if (Challenges.NAME_IDS[i].equals("no_food")) { +// return new ItemSprite(ItemSpriteSheet.OVERPRICED,new ItemSprite.Glowing( 0xFF0000 )); +// } else if (Challenges.NAME_IDS[i].equals("no_armor")) { +// return new ItemSprite(ItemSpriteSheet.ARMOR_MAGE,new ItemSprite.Glowing( 0xFF0000 )); +// } else if (Challenges.NAME_IDS[i].equals("no_healing")) { +// return new RatSprite(); +// } else if (Challenges.NAME_IDS[i].equals("no_herbalism")) { +// return new GnollSprite(); +// } else if (Challenges.NAME_IDS[i].equals("darkness")) { +// return Icons.get(Icons.NEWS); +// } else if (Challenges.NAME_IDS[i].equals("no_scrolls")) { +// return Icons.get(Icons.LANGS); +// } else if (Challenges.NAME_IDS[i].equals("aquaphobia")) { +// return Icons.get(Icons.SHPX); +// } else if (Challenges.NAME_IDS[i].equals("rlpt")) { +// return Icons.get(Icons.LIBGDX); +// } else if (Challenges.NAME_IDS[i].equals("sbsg")) { +// return Icons.get(Icons.WATA); +// } else if (Challenges.NAME_IDS[i].equals("exsg")) { +// return Icons.get(Icons.SHPX); +// } else if (Challenges.NAME_IDS[i].equals("stronger_bosses")) { +// return Icons.get(Icons.HUNTRESS); +// } else if (Challenges.NAME_IDS[i].equals("dhxd")) { +// return Icons.get(Icons.SKULL); +// } else { +// return Icons.get(Icons.STATS); +// } +// +// } + } \ No newline at end of file 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 f5c95362a..9e04505f0 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/InterlevelScene.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/InterlevelScene.java @@ -182,7 +182,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/scenes/TitleScene.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/TitleScene.java index d04b99b47..1963bf358 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/TitleScene.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/TitleScene.java @@ -28,7 +28,6 @@ import com.watabou.utils.ColorMath; import com.watabou.utils.DeviceCompat; import com.watabou.utils.GameMath; import com.watabou.utils.Point; -import com.watabou.utils.Random; import java.util.Date; @@ -40,7 +39,7 @@ public class TitleScene extends PixelScene { public void create() { super.create(); - Music.INSTANCE.play(Random.Float() < 0.6f ? Assets.Music.THEME : Assets.Music.THEME_1, true); + Music.INSTANCE.play(Assets.Music.THEME_1, true); uiCamera.visible = false; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/ItemSpriteSheet.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/ItemSpriteSheet.java index eca046702..affe24b44 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/ItemSpriteSheet.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/ItemSpriteSheet.java @@ -386,8 +386,9 @@ public class ItemSpriteSheet { public static final int WAND_WARDING = WANDS+10; public static final int WAND_REGROWTH = WANDS+11; public static final int WAND_TRANSFUSION = WANDS+12; + public static final int WAND_HTR = WANDS+14; static { - for (int i = WANDS; i < WANDS+16; i++) + for (int i = WANDS; i < WANDS+12; i++) assignItemRect(i, 14, 14); } @@ -779,6 +780,10 @@ public class ItemSpriteSheet { public static final int FBK= MAINBOOKINDEX+9; public static final int LASERPYTHON= MAINBOOKINDEX+10; + public static final int DLCBOOKS= MAINBOOKINDEX+11; + public static final int DIFFCULTBOOT= MAINBOOKINDEX+12; + public static final int STORYBOOKS= MAINBOOKINDEX+13; + private static final int MAINPALYBOOKS = xy(1, 40); public static final int MONEYBOOKS= MAINPALYBOOKS+1; public static final int PINKBOOKS= MAINPALYBOOKS+2; @@ -786,6 +791,23 @@ public class ItemSpriteSheet { //16 free slots //16 free slots + private static final int CHALLANEESICONINDEX = xy(1, 42); //16 slots + + public static final int CHALLANEESICON_1= CHALLANEESICONINDEX+0; + public static final int CHALLANEESICON_2= CHALLANEESICONINDEX+1; + public static final int CHALLANEESICON_3= CHALLANEESICONINDEX+2; + public static final int CHALLANEESICON_4= CHALLANEESICONINDEX+3; + public static final int CHALLANEESICON_5= CHALLANEESICONINDEX+4; + public static final int CHALLANEESICON_6= CHALLANEESICONINDEX+5; + + public static final int CHALLANEESICON_7= CHALLANEESICONINDEX+6; + public static final int CHALLANEESICON_8= CHALLANEESICONINDEX+7; + public static final int CHALLANEESICON_9= CHALLANEESICONINDEX+8; + public static final int CHALLANEESICON_10= CHALLANEESICONINDEX+9; + public static final int CHALLANEESICON_11= CHALLANEESICONINDEX+10; + public static final int CHALLANEESICON_12= CHALLANEESICONINDEX+11; + public static final int CHALLANEESICON_13= CHALLANEESICONINDEX+12; + //for smaller 8x8 icons that often accompany an item sprite public static class Icons { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/BossSelectIndicator.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/BossSelectIndicator.java index 0d76b812e..0d72336f7 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/BossSelectIndicator.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/BossSelectIndicator.java @@ -5,8 +5,8 @@ import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.Slyl; import com.shatteredpixel.shatteredpixeldungeon.items.Item; -import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; +import com.shatteredpixel.shatteredpixeldungeon.windows.BossSettingWindows; import com.shatteredpixel.shatteredpixeldungeon.windows.WndQuest; import com.watabou.noosa.Game; import com.watabou.noosa.Image; @@ -74,7 +74,7 @@ public class BossSelectIndicator extends Button { protected void onClick() { super.onClick(); // - tell(Messages.get(Slyl.class, "tips")); + GameScene.show(new BossSettingWindows()); } }); 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 0d4d9c2a9..02ea8edb5 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/MenuPane.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/MenuPane.java @@ -154,7 +154,7 @@ public class MenuPane extends Component { challengeButton = new Button(){ @Override protected void onClick() { - GameScene.show(new WndChallenges(Dungeon.challenges, false)); + GameScene.show(new WndChallenges(Dungeon.challenges, false,null)); } @Override diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/QuickRecipe.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/QuickRecipe.java index c8c27c123..64f623fa6 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/QuickRecipe.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/QuickRecipe.java @@ -28,7 +28,6 @@ import com.shatteredpixel.shatteredpixeldungeon.items.Generator; import com.shatteredpixel.shatteredpixeldungeon.items.Item; import com.shatteredpixel.shatteredpixeldungeon.items.LiquidMetal; import com.shatteredpixel.shatteredpixeldungeon.items.Recipe; -import com.shatteredpixel.shatteredpixeldungeon.items.Stylus; import com.shatteredpixel.shatteredpixeldungeon.items.bombs.Bomb; import com.shatteredpixel.shatteredpixeldungeon.items.food.Blandfruit; import com.shatteredpixel.shatteredpixeldungeon.items.food.Food; @@ -41,6 +40,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.food.StewedMeat; import com.shatteredpixel.shatteredpixeldungeon.items.potions.AlchemicalCatalyst; import com.shatteredpixel.shatteredpixeldungeon.items.potions.Potion; import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfHealing; +import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfLightningShiledX; import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfLiquidFlameX; import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfNoWater; import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfPurity; @@ -57,8 +57,8 @@ import com.shatteredpixel.shatteredpixeldungeon.items.potions.elixirs.ElixirOfMi import com.shatteredpixel.shatteredpixeldungeon.items.potions.elixirs.ElixirOfToxicEssence; import com.shatteredpixel.shatteredpixeldungeon.items.potions.elixirs.WaterSoul; import com.shatteredpixel.shatteredpixeldungeon.items.potions.exotic.ExoticPotion; +import com.shatteredpixel.shatteredpixeldungeon.items.quest.CrivusFruitsFlake; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.Scroll; -import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfFlameCursed; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.exotic.ExoticScroll; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.exotic.ScrollOfRoseShiled; import com.shatteredpixel.shatteredpixeldungeon.items.spells.Alchemize; @@ -78,6 +78,9 @@ import com.shatteredpixel.shatteredpixeldungeon.items.stones.Runestone; import com.shatteredpixel.shatteredpixeldungeon.items.stones.StoneOfBlink; import com.shatteredpixel.shatteredpixeldungeon.items.wands.Wand; import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfBlueFuck; +import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfFireblast; +import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfHightHunderStorm; +import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfLightning; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.IceFishSword; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.MissileWeapon; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; @@ -353,10 +356,6 @@ public class QuickRecipe extends Component { new ArrayList(Arrays.asList(new PotionOfPurity(), new AlchemicalCatalyst(), new StoneOfBlink())), new ScrollOfRoseShiled().quantity(3))); - result.add(new QuickRecipe( new WandOfBlueFuck.Recipe(), - new ArrayList(Arrays.asList(new PotionOfLiquidFlameX(), new ScrollOfFlameCursed(), - new Stylus())), - new WandOfBlueFuck())); return result; case 4: r = new ExoticScroll.ScrollToExotic(); @@ -395,6 +394,15 @@ public class QuickRecipe extends Component { result.add(new QuickRecipe( new ArcaneResin.Recipe(), new ArrayList(Arrays.asList(new Wand.PlaceHolder())), new ArcaneResin())); + result.add(new QuickRecipe( new WandOfBlueFuck.Recipe(), + new ArrayList(Arrays.asList(new PotionOfLiquidFlameX(), new WandOfFireblast(), + new CrivusFruitsFlake())), + new WandOfBlueFuck())); + result.add(new QuickRecipe( new WandOfHightHunderStorm.Recipe(), + new ArrayList(Arrays.asList(new PotionOfLightningShiledX(), + new WandOfLightning(), + new CrivusFruitsFlake())), + new WandOfHightHunderStorm())); return result; case 7: result.add(new QuickRecipe(new AlchemicalCatalyst.Recipe(), new ArrayList<>(Arrays.asList(new Potion.PlaceHolder(), new Plant.Seed.PlaceHolder())), new AlchemicalCatalyst())); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/StatusPane.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/StatusPane.java index e0ff19f4c..1454b3a2e 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/StatusPane.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/StatusPane.java @@ -24,7 +24,6 @@ package com.shatteredpixel.shatteredpixeldungeon.ui; import static com.shatteredpixel.shatteredpixeldungeon.SPDSettings.ClassPage; import static com.shatteredpixel.shatteredpixeldungeon.Statistics.lanterfireactive; -import com.badlogic.gdx.Gdx; import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.SPDAction; @@ -32,6 +31,7 @@ import com.shatteredpixel.shatteredpixeldungeon.SPDSettings; import com.shatteredpixel.shatteredpixeldungeon.Statistics; import com.shatteredpixel.shatteredpixeldungeon.actors.Actor; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Hunger; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.LockedFloor; import com.shatteredpixel.shatteredpixeldungeon.effects.CircleArc; import com.shatteredpixel.shatteredpixeldungeon.effects.Speck; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; @@ -51,6 +51,11 @@ import com.watabou.noosa.particles.Emitter; import com.watabou.noosa.ui.Component; import com.watabou.utils.ColorMath; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.Locale; + public class StatusPane extends Component { private NinePatch bg; @@ -98,7 +103,8 @@ public class StatusPane extends Component { private boolean large; - private BitmapText fpsText; + private RenderedTextBlock timeText; + private RenderedTextBlock timeStatusText; public StatusPane( boolean large ){ super(); @@ -166,9 +172,13 @@ public class StatusPane extends Component { add(hgText); //FPS TEXT - fpsText = new BitmapText(PixelScene.pixelFont); - fpsText.alpha(1f); - add(fpsText); + timeText = PixelScene.renderTextBlock(5); + timeText.alpha(0.6f); + add(timeText); + + timeStatusText = PixelScene.renderTextBlock( 5 ); + timeStatusText.alpha(0.6f); + add(timeStatusText); heroInfoOnBar = new Button(){ @Override @@ -269,14 +279,19 @@ public class StatusPane extends Component { heroInfoOnBar.setRect(heroInfo.right(), y + 19, 130, 20); - if(SPDSettings.FPSLimit()) { - fpsText.scale.set(PixelScene.align(0.8f)); - fpsText.x = MenuPane.version.x - 15; - fpsText.y = MenuPane.version.y - 10; - PixelScene.align(fpsText); + if(SPDSettings.TimeLimit()) { +// fpsText.scale.set(PixelScene.align(0.8f)); +// timeText.x = MenuPane.version.x; +// timeText.y = MenuPane.version.y+6; + PixelScene.align(timeText); + timeStatusText.x = MenuPane.version.x; + timeStatusText.y = MenuPane.version.y+10; + PixelScene.align(timeStatusText); } else { - fpsText.visible=false; - fpsText.active=false; + timeText.visible=false; + timeText.active=false; + timeStatusText.active=false; + timeStatusText.visible=false; } // buffs.setPos( x + 31, y +15 ); @@ -322,22 +337,28 @@ public class StatusPane extends Component { buffs.setPos( x + 31, y + 12 ); - if(SPDSettings.FPSLimit()) { - fpsText.scale.set(PixelScene.align(0.8f)); - fpsText.x = MenuPane.version.x - 15; - fpsText.y = MenuPane.version.y - 10; - PixelScene.align(fpsText); - } else { - fpsText.visible=false; - fpsText.active=false; - } - busy.x = x + 1; busy.y = y + 33; lanter.setPos(0, 500); } + if(SPDSettings.TimeLimit()) { + timeText.x = MenuPane.version.x; + + timeText.y = MenuPane.version.y + 5; + + PixelScene.align(timeText); + timeStatusText.x = MenuPane.version.x; + timeStatusText.y = MenuPane.version.y+10; + PixelScene.align(timeStatusText); + } else { + timeText.visible=false; + timeText.active=false; + timeStatusText.active=false; + timeStatusText.visible=false; + } + counter.point(busy.center()); } @@ -373,6 +394,14 @@ public class StatusPane extends Component { bg.texture = TextureCache.get(Assets.Interfaces.STATUS); } + if(SPDSettings.TimeLimit()) { + if (Dungeon.hero.buff(LockedFloor.class) != null) { + timeText.y = MenuPane.version.y + 14; + } else { + timeText.y = MenuPane.version.y + 5; + } + } + if (ClassPage()) { page.setPos(0, 40); pageb.setPos(0, 500); @@ -406,18 +435,23 @@ public class StatusPane extends Component { } if(Dungeon.hero.isAlive()){ - fpsText.text("FPS:"+ Gdx.graphics.getFramesPerSecond()); + Date date = new Date(); + String strDateFormat = "yyyy-MM-dd HH:mm:ss"; + SimpleDateFormat sdf = new SimpleDateFormat(strDateFormat, Locale.getDefault()); + Calendar cal=Calendar.getInstance(); + int s=cal.get(Calendar.SECOND); + if(s<20) { + timeText.hardlight(Window.CWHITE); + } else if(s<40) { + timeText.hardlight(Window.CYELLOW); + } else { + timeText.hardlight(Window.SKYBULE_COLOR); + } + timeText.text(sdf.format(date)); + } else { + timeText.text("满目疮痍!游戏结束!"); } - if(Gdx.graphics.getFramesPerSecond()>=90){ - fpsText.hardlight(Window.SKYBULE_COLOR); - } else if(Gdx.graphics.getFramesPerSecond()>=60){ - fpsText.hardlight(Window.CWHITE); - } else if(Gdx.graphics.getFramesPerSecond()>=30){ - fpsText.hardlight(Window.CYELLOW); - } else { - fpsText.hardlight(Window.RED_COLOR); - } if (!Dungeon.hero.isAlive()) { avatar.tint(0x000000, 0.5f); 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 0be3b487e..6312121b7 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 @@ -9,6 +9,7 @@ import com.shatteredpixel.shatteredpixeldungeon.sprites.AutoShopRoBotSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.BlueBatSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.ColdGuardSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.ColdRatSprite; +import com.shatteredpixel.shatteredpixeldungeon.sprites.CrivusFruitsSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.DM300Sprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.DiedMonkLoaderSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.FlameBoiSprite; @@ -39,6 +40,7 @@ import java.util.ArrayList; public class vM0_6_7_X_Changes { public static void addAllChanges(ArrayList changeInfos) { + add_v0_6_22_Changes(changeInfos); add_v0_6_21_Changes(changeInfos); add_v0_6_20_Changes(changeInfos); add_v0_6_19_Changes(changeInfos); @@ -62,34 +64,63 @@ public class vM0_6_7_X_Changes { add_v0_6_1_Changes(changeInfos); add_v0_6_0_Changes(changeInfos); } - - public static void add_v0_6_20_Changes(ArrayList changeInfos) { - ChangeInfo changes = new ChangeInfo("v0.6.0.0-Beta21-p2.940", true, ""); - changes.hardlight(65535); + + public static void add_v0_6_22_Changes( ArrayList changeInfos ) { + ChangeInfo changes = new ChangeInfo("v0.6.1.0-Beta1(P3)", true, ""); + changes.hardlight(Window.TITLE_COLOR); changeInfos.add(changes); - ChangeInfo changes2 = new ChangeInfo("新内容", false, (String) null); - changes2.hardlight(65280); - changeInfos.add(changes2); - changes2.addButton(new ChangeButton(Icons.get(Icons.CHALLENGE_ON), "污泥浊水", "1.矮人层饮用漂浮药剂或者水灵药剂都会获得极速Buff,且每大层会额外产生食人鱼房间。\n-2.修复漂浮效果存在时还能获得Debuff的问题")); - changes2.addButton(new ChangeButton(Icons.get(Icons.INFO), "圣诞与常规两个主界面Logo", "现在圣诞和常规有两个主界面logo,未来还会有更多。")); - ChangeInfo changes3 = new ChangeInfo("修复", false, (String) null); - changes3.hardlight(16776960); - changeInfos.add(changes3); - changes3.addButton(new ChangeButton(new Image("sprites/spinner.png", 144, 0, 16, 16), Messages.get(ChangesScene.class, "bugfixes", new Object[0]), Messages.get(vM0_6_7_X_Changes.class, "bug_06X40", new Object[0]))); - ChangeInfo changes4 = new ChangeInfo("重制", false, (String) null); - changes4.hardlight(16711680); - changeInfos.add(changes4); - changes4.addButton(new ChangeButton(new ItemSprite(ItemSpriteSheet.SKELETONGOLD), "Boss重制计划", "冰雪魔女,钻石宝箱王,矮人大师,Yog-Zot,史莱姆王将在完全重制后重新加入,并且可能会改名。且弃用注解版的Boss。并且现在Boss终端暂时暂停使用。")); - changes4.addButton(new ChangeButton(new ItemSprite(ItemSpriteSheet.DG20), "教程重制计划", "教程文档正在返修,敬请期待")); - ChangeInfo changes5 = new ChangeInfo("调整", false, (String) null); - changes5.hardlight(8421504); - changeInfos.add(changes5); - changes5.addButton(new ChangeButton(new ItemSprite(ItemSpriteSheet.REDDRAGON), "核子可乐", "核子可乐现在不能在红龙之王处被获得,但会在未来的娱乐模式中加入。")); - changes5.addButton(new ChangeButton(new ItemSprite(ItemSpriteSheet.DG26), "玫瑰秘卷", "玫瑰秘卷无敌时间从35回合改为5回合,且不能在此期间使用吸血圣杯。制造配方能量消耗从20改为14")); - changes5.addButton(new ChangeButton(Icons.get(Icons.CHALLENGE_OFF), "挑战重制计划", "药水癔症,基因突变,暴力Boss将会在未来重新加入,现在暂时禁用!")); - changes5.addButton(new ChangeButton(new ItemSprite(ItemSpriteSheet.DG24), "极度秘卷", "暂时移除,将在未来加入。")); - changes5.addButton(new ChangeButton(new ItemSprite(ItemSpriteSheet.ICEFISHSWORD), "尚方宝剑", "初始力量变为20,每10大层进行+1力量,成长面板调整,攻击特效从100%改为20%有几率触发。")); + + changes = new ChangeInfo("新内容", false, null); + changes.hardlight(Window.GREEN_COLOR); + changeInfos.add(changes); + + changes.addButton(new ChangeButton(Icons.get(Icons.CHALLENGE_ON), ("挑战界面更新"), + ("换成了更好的九宫格图标界面,特别感谢Tianscar的帮忙。"))); + + changes.addButton(new ChangeButton(Icons.get(Icons.DATA), ("日期时间的更新"), + ("玩游戏老是忘了时间?现在可以直接在游戏查看时间。在额外设置中启用"))); + + changes.addButton(new ChangeButton(Icons.get(Icons.DISPLAY), ("界面优化"), + ("部分界面进行了优化处理。"))); + + changes.addButton(new ChangeButton(Icons.get(Icons.PREFS), ("下雪特效"), + ("从第六层加入下雪效果,为即将到来的寒冷效果做铺垫"))); + + changes.addButton(new ChangeButton(new CrivusFruitsSprite(), ("新Boss:克里弗斯之果"), + ("它们编织成一张大网,将所有不慎跌落谷底的生命体供给给中间那粒鲜红的果实。"))); + + changes.addButton(new ChangeButton(new ItemSprite(ItemSpriteSheet.LifeTreeSword), ("“倒悬的生命树”"), + ("克里弗斯之果Boss专武,首次击败必定获得。后续40%概率。" ))); + + changes.addButton(new ChangeButton(new ItemSprite(ItemSpriteSheet.WAND_HTR), ("风暴雷霆法杖"), + ("全新法杖登场,同时开启法杖高阶炼金机制。" ))); + + changes = new ChangeInfo("调整", false, null); + changes.hardlight(Window.CBLACK); + changeInfos.add(changes); + + changes.addButton(new ChangeButton(new ItemSprite(ItemSpriteSheet.LANTERNB), ("灯火前路"), + ("灯火前路已经进行了一些修改:\n\n" + + "-纯洁的祝福(前路&隐没)正式实装\n" + + "-纯洁的祝福(坚毅力量+8改为+2)\n" + + "-纯洁的祝福(守护从300回合改成100回合,初始护盾值从30改为60)\n" + + "-魔女的低语-迟缓(改为每10回合给予残废3回合)" ))); + + changes.addButton(new ChangeButton(Icons.get(Icons.CHALLENGE_OFF), ("部分挑战改动:"), + ("药水癔症挑战已经进行一些小的改进,具体请查看挑战具体说明\n" + + "梦魇Boss尚未完全实现,请金山游玩。"))); + + changes.addButton(new ChangeButton(new ItemSprite(ItemSpriteSheet.SKELETONGOLD), "终端重新开放", + "Boss终端现在重新开放,但在后续更新中,终端的作用会发生改变")); + + changes.addButton(new ChangeButton(new ItemSprite(ItemSpriteSheet.DG6), "磷焰法杖", + "配方改变,攻击效果改进。")); + + 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_06X50"))); + } + public static void add_v0_6_21_Changes( ArrayList changeInfos ) { ChangeInfo changes = new ChangeInfo("v0.6.0.0-Beta21-p2.950", true, ""); @@ -110,10 +141,38 @@ 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) { + ChangeInfo changes = new ChangeInfo("v0.6.0.0-Beta21-p2.940", true, ""); + changes.hardlight(65535); + changeInfos.add(changes); + ChangeInfo changes2 = new ChangeInfo("新内容", false, (String) null); + changes2.hardlight(65280); + changeInfos.add(changes2); + changes2.addButton(new ChangeButton(Icons.get(Icons.CHALLENGE_ON), "污泥浊水", "1.矮人层饮用漂浮药剂或者水灵药剂都会获得极速Buff,且每大层会额外产生食人鱼房间。\n-2.修复漂浮效果存在时还能获得Debuff的问题")); + changes2.addButton(new ChangeButton(Icons.get(Icons.INFO), "圣诞与常规两个主界面Logo", "现在圣诞和常规有两个主界面logo,未来还会有更多。")); + ChangeInfo changes3 = new ChangeInfo("修复", false, (String) null); + changes3.hardlight(16776960); + changeInfos.add(changes3); + changes3.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_06X40"))); + ChangeInfo changes4 = new ChangeInfo("重制", false, (String) null); + changes4.hardlight(16711680); + changeInfos.add(changes4); + changes4.addButton(new ChangeButton(new ItemSprite(ItemSpriteSheet.SKELETONGOLD), "Boss重制计划", "冰雪魔女,钻石宝箱王,矮人大师,Yog-Zot,史莱姆王将在完全重制后重新加入,并且可能会改名。且弃用注解版的Boss。并且现在Boss终端暂时暂停使用。")); + changes4.addButton(new ChangeButton(new ItemSprite(ItemSpriteSheet.DG20), "教程重制计划", "教程文档正在返修,敬请期待")); + ChangeInfo changes5 = new ChangeInfo("调整", false, (String) null); + changes5.hardlight(8421504); + changeInfos.add(changes5); + changes5.addButton(new ChangeButton(new ItemSprite(ItemSpriteSheet.REDDRAGON), "核子可乐", "核子可乐现在不能在红龙之王处被获得,但会在未来的娱乐模式中加入。")); + changes5.addButton(new ChangeButton(new ItemSprite(ItemSpriteSheet.DG26), "玫瑰秘卷", "玫瑰秘卷无敌时间从35回合改为5回合,且不能在此期间使用吸血圣杯。制造配方能量消耗从20改为14")); + changes5.addButton(new ChangeButton(Icons.get(Icons.CHALLENGE_OFF), "挑战重制计划", "药水癔症,基因突变,暴力Boss将会在未来重新加入,现在暂时禁用!")); + changes5.addButton(new ChangeButton(new ItemSprite(ItemSpriteSheet.DG24), "极度秘卷", "暂时移除,将在未来加入。")); + changes5.addButton(new ChangeButton(new ItemSprite(ItemSpriteSheet.ICEFISHSWORD), "尚方宝剑", "初始力量变为20,每10大层进行+1力量,成长面板调整,攻击特效从100%改为20%有几率触发。")); + } + + public static void add_v0_6_19_Changes( ArrayList changeInfos ) { ChangeInfo changesx = new ChangeInfo("v0.6.0.0-Beta21-p2.920-925", true, ""); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/BossSettingWindows.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/BossSettingWindows.java index 2fd1bc02f..7ddc80867 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/BossSettingWindows.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/BossSettingWindows.java @@ -34,14 +34,25 @@ public class BossSettingWindows extends Window { for(int i = 0; i<5; ++i){ CheckBox cb = new CheckBox(Messages.get(this, "boss_"+ (i + 1))); cb.setRect(GAP, pos, WIDTH - GAP * 2, BOX_HEIGHT); - if(i == 2){ - cb.setRect(GAP, 500, WIDTH - GAP * 2, BOX_HEIGHT); - } + + add(cb); cbs.add(cb); pos += BOX_HEIGHT + GAP; - cb.checked((Statistics.boss_enhance & (1<0); - cb.enable(Statistics.deepestFloor < (5+i*5)); + + if(i == 2){ + cb.setRect(GAP, 500, WIDTH - GAP * 2, BOX_HEIGHT); + } + + if(i == 1 || i == 0 || i==4){ + cb.alpha(0.4f); + cb.active=false; + cb.checked(false); + } else { + cb.checked((Statistics.boss_enhance & (1<0); + cb.enable(Statistics.deepestFloor < (5+i*5)); + } + } level3 = new OptionSlider("", Messages.get(this, "dm300"), diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/NewWndChallenges.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/NewWndChallenges.java new file mode 100644 index 000000000..a983db0ef --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/NewWndChallenges.java @@ -0,0 +1,297 @@ +//package com.shatteredpixel.shatteredpixeldungeon.windows; +// +//import com.shatteredpixel.shatteredpixeldungeon.Challenges; +//import com.shatteredpixel.shatteredpixeldungeon.SPDSettings; +//import com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon; +//import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; +//import com.shatteredpixel.shatteredpixeldungeon.scenes.PixelScene; +//import com.shatteredpixel.shatteredpixeldungeon.sprites.GnollSprite; +//import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSprite; +//import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; +//import com.shatteredpixel.shatteredpixeldungeon.sprites.RatSprite; +//import com.shatteredpixel.shatteredpixeldungeon.ui.IconButton; +//import com.shatteredpixel.shatteredpixeldungeon.ui.Icons; +//import com.shatteredpixel.shatteredpixeldungeon.ui.RedButton; +//import com.shatteredpixel.shatteredpixeldungeon.ui.RenderedTextBlock; +//import com.shatteredpixel.shatteredpixeldungeon.ui.Window; +//import com.watabou.noosa.Image; +//import com.watabou.noosa.ui.Component; +//import com.watabou.utils.Callback; +// +//import java.util.ArrayList; +// +//public class NewWndChallenges extends Window { +// +// private static final int WIDTH = 120; +// private static final int TTL_HEIGHT = 16; +// private static final int BTN_HEIGHT = 16; +// private static final int GAP = 1; +// +// private boolean editable; +// private ArrayList boxes; +// +// public int index = 0; +// private static int boundIndex(int index) { +// int result = index; +// while (result < 0) result += 9; +// while (result >= Challenges.NAME_IDS.length) result -= 9; +// result = (int) (Math.floor(result / 9.0)) * 9; +// return result; +// } +// protected Callback backPressCallback; +// +// private int checked; +// public NewWndChallenges(int checked, boolean editable ) { +// +// super(); +// +// this.checked = checked; +// this.editable = editable; +// +// RenderedTextBlock title = PixelScene.renderTextBlock( Messages.get(this, "title"), 12 ); +// title.hardlight( TITLE_COLOR ); +// title.setPos( +// (WIDTH - title.width()) / 2, +// (TTL_HEIGHT - title.height()) / 2 +// ); +// PixelScene.align(title); +// add( title ); +// +// boxes = new ArrayList<>(); +// +// float pos = TTL_HEIGHT; +// +// float infoBottom = 0; +// index = boundIndex(index); +// for (int i = index; i < index + 9; i++) { +// +// if (i >= Challenges.NAME_IDS.length) break; +// final String challenge = Challenges.NAME_IDS[i]; +// +// if (i > 0 && i % 3 == 0) { +// pos += GAP; +// } +// NewWndChallenges.ChallengeInfo info = new NewWndChallenges.ChallengeInfo(foundChallangeIcon(i) /*挑战的LOGO*/, challenge, false /*是否冲突*/, null +// /*冲突按钮的点击回调*/); +// NewWndChallenges.ChallengeButton cb = info.check; +// cb.checked((checked & Challenges.MASKS[i]) != 0); +// cb.active = editable; +// boxes.add( cb ); +// info.setRect((i % 3) * 40, pos, 40, 0); +// infoBottom = Math.max(infoBottom, info.bottom()); +// +// add( info ); +// +// if (i % 3 == 2) { +// pos = infoBottom; +// } +// } +// RedButton btnPrev; RedButton btnNext; RedButton btnFirst; RedButton btnLast; +// btnPrev = new RedButton("上页" /*需要替换为国际化文本*/) { +// @Override +// protected void onClick() { +// index = boundIndex(index - 9); +// NewWndChallenges.this.hide(); +// ShatteredPixelDungeon.scene().addToFront(new NewWndChallenges(refreshChecked(checked), editable) { +// { +// index = NewWndChallenges.this.index; +// backPressCallback = NewWndChallenges.this.backPressCallback; +// } +// }); +// } +// }; +// add( btnPrev ); +// pos += GAP; +// +// btnPrev.setRect(0, pos, (WIDTH - GAP) * 0.5f, BTN_HEIGHT); +// btnNext = new RedButton("下页" /*需要替换为国际化文本*/) { +// @Override +// protected void onClick() { +// index = boundIndex(index + 9); +// NewWndChallenges.this.hide(); +// ShatteredPixelDungeon.scene().addToFront(new NewWndChallenges(refreshChecked(checked), editable) { +// { +// index = NewWndChallenges.this.index; +// backPressCallback = NewWndChallenges.this.backPressCallback; +// } +// }); +// } +// }; +// add( btnNext ); +// btnNext.setRect(btnPrev.right() + GAP, pos, (WIDTH - GAP) * 0.5f, BTN_HEIGHT); +// +// pos += BTN_HEIGHT; +// +// btnFirst = new RedButton("首页" /*需要替换为国际化文本*/) { +// @Override +// protected void onClick() { +// index = 0; +// NewWndChallenges.this.hide(); +// ShatteredPixelDungeon.scene().addToFront(new NewWndChallenges(refreshChecked(checked), editable) { +// { +// index = NewWndChallenges.this.index; +// backPressCallback = NewWndChallenges.this.backPressCallback; +// } +// }); +// } +// }; +// add( btnFirst ); +// pos += GAP; +// +// btnFirst.setRect(0, pos, (WIDTH - GAP) * 0.5f, BTN_HEIGHT); +// btnLast = new RedButton("末页" /*需要替换为国际化文本*/) { +// @Override +// protected void onClick() { +// index = Challenges.NAME_IDS.length - 1; +// NewWndChallenges.this.hide(); +// ShatteredPixelDungeon.scene().addToFront(new NewWndChallenges(refreshChecked(checked), editable) { +// { +// index = NewWndChallenges.this.index; +// backPressCallback = NewWndChallenges.this.backPressCallback; +// } +// }); +// } +// }; +// add( btnLast ); +// btnLast.setRect(btnFirst.right() + GAP, pos, (WIDTH - GAP) * 0.5f, BTN_HEIGHT); +// +// pos += BTN_HEIGHT; +// +// resize( WIDTH, (int)pos ); +// } +// +// @Override +// public void onBackPressed() { +// +// if (editable) { +// int value = 0; +// for (int i=0; i < boxes.size(); i++) { +// if (boxes.get( i ).checked()) { +// value |= Challenges.MASKS[i]; +// } +// } +// SPDSettings.challenges( value ); +// } +// +// super.onBackPressed(); +// } +// +// private int refreshChecked(int checked) { +// int value = checked; +// for (int i = 0; i < boxes.size(); i ++) { +// if (index + i >= Challenges.MASKS.length) break; +// value &= ~Challenges.MASKS[index + i]; +// if (boxes.get( i ).checked()) { +// value |= Challenges.MASKS[index + i]; +// } +// } +// return value; +// } +// +// private static class ChallengeButton extends IconButton { +// private boolean checked = false; +// public ChallengeButton() { +// super( Icons.get( Icons.CHALLENGE_OFF )); +// } +// @Override +// protected void onClick() { +// checked(!checked); +// } +// public boolean checked() { +// return checked; +// } +// public void checked( boolean checked ) { +// this.checked = checked; +// icon( Icons.get( checked ? Icons.CHALLENGE_ON : Icons.CHALLENGE_OFF ) ); +// } +// } +// +// private static class ChallengeInfo extends Component { +// Image icon; +// IconButton info; +// NewWndChallenges.ChallengeButton check; +// IconButton conflict; +// public ChallengeInfo(Image icon, String challenge, boolean conflict, Callback onConflict) { +// super(); +// this.icon = icon; +// add( icon ); +// info = new IconButton(Icons.get(Icons.INFO)){ +// @Override +// protected void onClick() { +// ShatteredPixelDungeon.scene().add( +// new WndTitledMessage(new Image(NewWndChallenges.ChallengeInfo.this.icon), +// Messages.titleCase(Messages.get(Challenges.class, challenge)), +// Messages.get(Challenges.class, challenge+"_desc")) +// ); +// } +// }; +// add( info ); +// check = new NewWndChallenges.ChallengeButton(); +// add( check ); +// if (conflict) { +// this.conflict = new IconButton(Icons.get(Icons.WARNING)) { +// @Override +// protected void onClick() { +// if (onConflict != null) onConflict.call(); +// } +// }; +// add( this.conflict ); +// } +// else this.conflict = null; +// } +// +// @Override +// protected void layout() { +// icon.x = x + (width - 32) / 2; +// icon.y = y; +// PixelScene.align( icon ); +// info.setRect(icon.x + icon.width, y, 16, BTN_HEIGHT); +// PixelScene.align( info ); +// if (conflict == null) { +// check.setRect(x + (width - 16) / 2, y + BTN_HEIGHT, 16, BTN_HEIGHT); +// PixelScene.align( check ); +// } +// else { +// check.setRect(x + (width - 32) / 2, y + BTN_HEIGHT, 16, BTN_HEIGHT); +// PixelScene.align( check ); +// conflict.setRect(check.right(), check.top(), 16, BTN_HEIGHT); +// PixelScene.align( conflict ); +// } +// height = BTN_HEIGHT * 2; +// } +// +// } +// +// private static Image foundChallangeIcon(int i) { +// +// if (Challenges.NAME_IDS[i].equals("no_food")) { +// return new ItemSprite(ItemSpriteSheet.OVERPRICED,new ItemSprite.Glowing( 0xFF0000 )); +// } else if (Challenges.NAME_IDS[i].equals("no_armor")) { +// return new ItemSprite(ItemSpriteSheet.ARMOR_MAGE,new ItemSprite.Glowing( 0xFF0000 )); +// } else if (Challenges.NAME_IDS[i].equals("no_healing")) { +// return new RatSprite(); +// } else if (Challenges.NAME_IDS[i].equals("no_herbalism")) { +// return new GnollSprite(); +// } else if (Challenges.NAME_IDS[i].equals("darkness")) { +// return Icons.get(Icons.NEWS); +// } else if (Challenges.NAME_IDS[i].equals("no_scrolls")) { +// return Icons.get(Icons.LANGS); +// } else if (Challenges.NAME_IDS[i].equals("aquaphobia")) { +// return Icons.get(Icons.SHPX); +// } else if (Challenges.NAME_IDS[i].equals("rlpt")) { +// return Icons.get(Icons.LIBGDX); +// } else if (Challenges.NAME_IDS[i].equals("sbsg")) { +// return Icons.get(Icons.WATA); +// } else if (Challenges.NAME_IDS[i].equals("exsg")) { +// return Icons.get(Icons.SHPX); +// } else if (Challenges.NAME_IDS[i].equals("stronger_bosses")) { +// return Icons.get(Icons.HUNTRESS); +// } else if (Challenges.NAME_IDS[i].equals("dhxd")) { +// return Icons.get(Icons.SKULL); +// } else { +// return Icons.get(Icons.STATS); +// } +// +// } +// +//} diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndChallenges.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndChallenges.java index 8f4c79154..a3b102f19 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndChallenges.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndChallenges.java @@ -22,282 +22,316 @@ package com.shatteredpixel.shatteredpixeldungeon.windows; import com.shatteredpixel.shatteredpixeldungeon.Challenges; -import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.SPDSettings; import com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon; -import com.shatteredpixel.shatteredpixeldungeon.custom.visuals.TextField; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.scenes.PixelScene; -import com.shatteredpixel.shatteredpixeldungeon.ui.CheckBox; +import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSprite; +import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; import com.shatteredpixel.shatteredpixeldungeon.ui.IconButton; import com.shatteredpixel.shatteredpixeldungeon.ui.Icons; import com.shatteredpixel.shatteredpixeldungeon.ui.RedButton; import com.shatteredpixel.shatteredpixeldungeon.ui.RenderedTextBlock; -import com.shatteredpixel.shatteredpixeldungeon.ui.ScrollPane; import com.shatteredpixel.shatteredpixeldungeon.ui.Window; -import com.shatteredpixel.shatteredpixeldungeon.utils.DungeonSeed; import com.watabou.noosa.Image; import com.watabou.noosa.ui.Component; +import com.watabou.utils.Callback; import java.util.ArrayList; public class WndChallenges extends Window { private static final int WIDTH = 120; - private static final int HEIGHT = 162; + private static final int TTL_HEIGHT = 16; private static final int BTN_HEIGHT = 16; private static final int GAP = 1; private boolean editable; - private ArrayList boxes; - private ArrayList infos; - private CanScrollTextField cstf; - private CanScrollButton deleteSeedInput; + private ArrayList boxes; - public WndChallenges( long checked, boolean editable ) { + public int index; + private static int boundIndex(int index) { + int result = index; + while (result < 0) result += 9; + while (result >= Challenges.NAME_IDS.length) result -= 9; + result = (int) (Math.floor(result / 9.0)) * 9; + return result; + } + + private Callback callback; + + private int checked; + + public WndChallenges( int checked, boolean editable, Callback callback ) { + this(checked, 0, editable, callback); + } + private WndChallenges( int checked, int index, boolean editable, Callback callback ) { super(); - resize(WIDTH, HEIGHT); - + this.checked = checked; + this.index = index; this.editable = editable; + this.callback = callback; + + RenderedTextBlock title = PixelScene.renderTextBlock( Messages.get(this, "title"+ + WndChallenges.this.index), 12 ); + title.hardlight( TITLE_COLOR ); + title.setPos( + (WIDTH - title.width()) / 2, + (TTL_HEIGHT - title.height()) / 2 + ); + PixelScene.align(title); + add( title ); + + - ScrollPane pane = new ScrollPane(new Component()) { - @Override - public void onClick(float x, float y) { - int max_size = boxes.size(); - for (int i = 0; i < max_size; ++i) { - if (boxes.get(i).onClick(x, y)) - return; - } - max_size = infos.size(); - for(int i = 0; i(); - infos = new ArrayList<>(); - final int normal_mode = 0; - final int hard_mode = 7; - final int warning_mode =9; - final int custom_mode = 13; - final int Test_Debug = 14; - boolean isCustom = false; - float pos = 0; + float pos = TTL_HEIGHT; - for (int i = 0; i < Challenges.NAME_IDS.length; i++) { + float infoBottom = 0; + index = boundIndex(index); + for (int i = index; i < index + 9; i++) { + if (i >= Challenges.NAME_IDS.length) break; final String challenge = Challenges.NAME_IDS[i]; - if(i==normal_mode || i==hard_mode || i==warning_mode|| i==custom_mode || i==Test_Debug){ - RenderedTextBlock block = PixelScene.renderTextBlock(10); - switch (i){ - case normal_mode: - block.text(Messages.get(Challenges.class, "traditional")); - block.hardlight(0x00FF00); - break; - case hard_mode: - block.text(Messages.get(Challenges.class, "hard")); - block.hardlight(0xFF00FF); - break; - case warning_mode: - block.text(Messages.get(Challenges.class, "warning")); - block.hardlight(0xFF0000); - break; - case custom_mode: - block.text(Messages.get(Challenges.class, "custom")); - block.hardlight(Window.Pink_COLOR); - break; - case Test_Debug: - block.text(Messages.get(Challenges.class, "test")); - block.hardlight(0xFFFF00); - break; - } - block.setPos((WIDTH - block.width()) / 2, - pos + GAP *4); - PixelScene.align(block); - content.add(block); - pos += block.height() + 11*GAP; + if (i > index && i % 3 == 0) { + pos += GAP; } + ChallengeInfo info = new ChallengeInfo(foundChallangeIcon(i), challenge,false, + null); - CanScrollCheckBox cb = new CanScrollCheckBox(Messages.get(Challenges.class, challenge)); + ChallengeButton cb = info.check; cb.checked((checked & Challenges.MASKS[i]) != 0); cb.active = editable; - //Disable - if(Challenges.NAME_IDS[i].equals("stronger_bosses")||Challenges.NAME_IDS[i].equals("sbsg")||Challenges.NAME_IDS[i].equals("exsg")){ - cb.active = false; - cb.checked(false); - cb.alpha(0.5f); +// //Disable +// if(Challenges.NAME_IDS[i].equals("stronger_bosses")){ +// cb.active = false; +// cb.checked(false); +// cb.visible=false; +// } + + boxes.add( cb ); + info.setRect((i % 3) * 40, pos, 40, 0); + infoBottom = Math.max(infoBottom, info.bottom()); + + add( info ); + + if (i % 3 == 2) { + pos = infoBottom; } - - - if (i > 0) { - pos += GAP; - } - cb.setRect(0, pos, WIDTH - 16, BTN_HEIGHT); - - content.add(cb); - boxes.add(cb); - - boolean finalIsCustom = isCustom; - CanScrollInfo info = new CanScrollInfo(Icons.get(Icons.INFO)) { - @Override - protected void onClick() { - super.onClick(); - ShatteredPixelDungeon.scene().add( - new WndMessage(Messages.get(finalIsCustom ? TextChallenges.class : Challenges.class, challenge + "_desc")) - ); - } - }; - info.setRect(cb.right(), pos, 16, BTN_HEIGHT); - infos.add(info); - content.add(info); - - pos = cb.bottom(); } - - pos += GAP; - cstf = new CanScrollTextField(Messages.get(TextChallenges.class, "seed_custom_title")); - cstf.setHint(Messages.get(TextChallenges.class, "hint")); - content.add(cstf); - cstf.enable(editable); - cstf.setLarge(false); - cstf.setMaxStringLength(22); - cstf.setRect(0, pos, WIDTH-16-GAP, 22); - cstf.text(editable ? CustomGameSettings.getSeedString() : DungeonSeed.convertToCode(Dungeon.seed)); - deleteSeedInput = new CanScrollButton(Messages.get(TextChallenges.class, "delete_seed_input")){ + RedButton btnPrev; RedButton btnNext; RedButton btnFirst; RedButton btnLast; + btnPrev = new RedButton("上页" /*需要替换为国际化文本*/) { @Override protected void onClick() { - super.onClick(); - cstf.text(""); - cstf.onTextChange(); + final int lastIndex = WndChallenges.this.index; + WndChallenges.this.hide(); + ShatteredPixelDungeon.scene().addToFront(new WndChallenges(refreshChecked(checked), + WndChallenges.boundIndex(lastIndex - 9), editable, callback)); } }; - content.add(deleteSeedInput); - deleteSeedInput.enable(editable); - deleteSeedInput.setRect(cstf.right() + GAP, pos, 16, 22); - pos = cstf.bottom(); - content.setSize(WIDTH, (int) pos + GAP*2); - pane.scrollTo(0, 0); + add( btnPrev ); + pos += GAP; + + btnPrev.setRect(0, pos, (WIDTH - GAP) * 0.5f, BTN_HEIGHT); + btnNext = new RedButton("下页" /*需要替换为国际化文本*/) { + @Override + protected void onClick() { + final int lastIndex = WndChallenges.this.index; + WndChallenges.this.hide(); + ShatteredPixelDungeon.scene().addToFront(new WndChallenges(refreshChecked(checked), + WndChallenges.boundIndex(lastIndex + 9), editable, callback)); + } + }; + add( btnNext ); + btnNext.setRect(btnPrev.right() + GAP, pos, (WIDTH - GAP) * 0.5f, BTN_HEIGHT); + + pos += BTN_HEIGHT; + + btnFirst = new RedButton("首页" /*需要替换为国际化文本*/) { + @Override + protected void onClick() { + WndChallenges.this.hide(); + ShatteredPixelDungeon.scene().addToFront(new WndChallenges(refreshChecked(checked), 0, editable, callback)); + } + }; + add( btnFirst ); + pos += GAP; + + btnFirst.setRect(0, pos, (WIDTH - GAP) * 0.5f, BTN_HEIGHT); + btnLast = new RedButton("末页" /*需要替换为国际化文本*/) { + @Override + protected void onClick() { + WndChallenges.this.hide(); + ShatteredPixelDungeon.scene().addToFront(new WndChallenges(refreshChecked(checked), + WndChallenges.boundIndex(Challenges.NAME_IDS.length - 1), editable, callback)); + } + }; + add( btnLast ); + btnLast.setRect(btnFirst.right() + GAP, pos, (WIDTH - GAP) * 0.5f, BTN_HEIGHT); + + RedButton btnClear = new RedButton("清空本页挑战", 7) { + @Override + protected void onClick() { + for (int i = 0; i < boxes.size(); i++) { + setCheckedNoUpdate(i, false); + } + } + }; + btnClear.setRect(btnFirst.left()+ GAP, pos+20, (WIDTH - GAP), BTN_HEIGHT); + add(btnClear); + if (!editable) { + btnClear.enable(false); + } + + pos += BTN_HEIGHT+20; + + resize( WIDTH, (int)pos ); } + private void setCheckedNoUpdate(int id, boolean checked) { + boxes.get(id).checked(checked); + } @Override public void onBackPressed() { if (editable) { - int value = 0; - for (int i=0; i < boxes.size(); i++) { - if (boxes.get( i ).checked()) { - value |= Challenges.MASKS[i]; - } - } - SPDSettings.challenges( value ); + SPDSettings.challenges( refreshChecked(checked) ); } super.onBackPressed(); + if (callback != null) callback.call(); } - public static class CanScrollCheckBox extends CheckBox{ - - public CanScrollCheckBox(String label) { - super(label); + private int refreshChecked(int checked) { + int value = checked; + for (int i = 0; i < boxes.size(); i ++) { + if (index + i >= Challenges.MASKS.length) break; + value &= ~Challenges.MASKS[index + i]; + if (boxes.get( i ).checked()) { + value |= Challenges.MASKS[index + i]; + } } + return value; + } - protected boolean onClick(float x, float y){ - if(!inside(x,y)) return false; - if(active) - onClick(); - - return true; + private static class ChallengeButton extends IconButton { + private boolean checked = false; + public ChallengeButton() { + super( Icons.get( Icons.CHALLENGE_OFF )); } - @Override - protected void layout(){ - super.layout(); - hotArea.width = hotArea.height = 0; + protected void onClick() { + checked(!checked); + } + public boolean checked() { + return checked; + } + public void checked( boolean checked ) { + this.checked = checked; + icon( Icons.get( checked ? Icons.CHALLENGE_ON : Icons.CHALLENGE_OFF ) ); } } - public static class CanScrollInfo extends IconButton{ - public CanScrollInfo(Image Icon){super(Icon);} - - protected boolean onClick(float x, float y){ - if(!inside(x,y)) return false; - if(active) onClick(); - return true; - } - - @Override - protected void layout(){ - super.layout(); - hotArea.width = hotArea.height = 0; - } - } - - public static class CanScrollTextField extends TextField { - - public CanScrollTextField(String label) { - super(label); - } - - @Override - public void onTextChange() { - CustomGameSettings.putSeedString(text()); - } - - @Override - public void onTextCancel() { - + private class ChallengeInfo extends Component { + Image icon; + IconButton info; + ChallengeButton check; + IconButton conflict; + public ChallengeInfo(Image icon, String challenge, boolean conflict, Callback onConflict) { + super(); + this.icon = icon; + add( icon ); + info = new IconButton(Icons.get(Icons.INFO)){ + @Override + protected void onClick() { + ShatteredPixelDungeon.scene().add( + new WndTitledMessage(new Image(ChallengeInfo.this.icon), + Messages.titleCase(Messages.get(Challenges.class, challenge)), + Messages.get(Challenges.class, challenge+"_desc")) + ); + } + }; + add( info ); + check = new ChallengeButton(); + add( check ); + if (conflict) { + this.conflict = new IconButton(Icons.get(Icons.HUNTRESS)) { + @Override + protected void onClick() { + if (onConflict != null) + onConflict.call(); + } + }; + add( this.conflict ); + } + else this.conflict = null; } @Override protected void layout() { - super.layout(); - hotArea.height = hotArea.width = 0; + icon.x = x + (width - 32) / 2; + icon.y = y; + PixelScene.align( icon ); + info.setRect(icon.x + icon.width, y, 16, BTN_HEIGHT); + PixelScene.align( info ); + if (conflict == null) { + check.setRect(x + (width - 16) / 2, y + BTN_HEIGHT, 16, BTN_HEIGHT); + PixelScene.align( check ); + } + else { + check.setRect(x + (width - 32) / 2, y + BTN_HEIGHT, 16, BTN_HEIGHT); + PixelScene.align( check ); + conflict.setRect(check.right(), check.top(), 16, BTN_HEIGHT); + PixelScene.align( conflict ); + } + height = BTN_HEIGHT * 2; } - protected boolean onClick(float x, float y){ - if(!inside(x,y)) return false; - if(active) onClick(); - - return true; - } } - public static class CanScrollButton extends RedButton{ - public CanScrollButton(String label) { - super(label, 7); + private Image foundChallangeIcon(int i) { + + if (Challenges.NAME_IDS[i].equals("no_food")) { + return new ItemSprite(ItemSpriteSheet.CHALLANEESICON_1,new ItemSprite.Glowing( 0xFF0000 )); + } else if (Challenges.NAME_IDS[i].equals("no_armor")) { + return new ItemSprite(ItemSpriteSheet.CHALLANEESICON_2,new ItemSprite.Glowing( 0x8f8f8f )); + } else if (Challenges.NAME_IDS[i].equals("no_healing")) { + return new ItemSprite(ItemSpriteSheet.CHALLANEESICON_3,new ItemSprite.Glowing( 0xff0000 )); + } else if (Challenges.NAME_IDS[i].equals("no_herbalism")) { + return new ItemSprite(ItemSpriteSheet.CHALLANEESICON_4); + } else if (Challenges.NAME_IDS[i].equals("swarm_intelligence")) { + return new ItemSprite(ItemSpriteSheet.CHALLANEESICON_5,new ItemSprite.Glowing( 0xffff00 )); + } else if (Challenges.NAME_IDS[i].equals("darkness")) { + return new ItemSprite(ItemSpriteSheet.CHALLANEESICON_6,new ItemSprite.Glowing( 0x8f8f8f )); + } else if (Challenges.NAME_IDS[i].equals("no_scrolls")) { + return new ItemSprite(ItemSpriteSheet.CHALLANEESICON_7,new ItemSprite.Glowing( 0x00dd00 )); + } else if (Challenges.NAME_IDS[i].equals("aquaphobia")) { + return new ItemSprite(ItemSpriteSheet.CHALLANEESICON_8,new ItemSprite.Glowing( 0xac89cc )); + } else if (Challenges.NAME_IDS[i].equals("champion_enemies")) { + return new ItemSprite(ItemSpriteSheet.CHALLANEESICON_9,new ItemSprite.Glowing( 0x333333 )); + } else if (Challenges.NAME_IDS[i].equals("rlpt")) { + return new ItemSprite(ItemSpriteSheet.CHALLANEESICON_10,new ItemSprite.Glowing( 0xc6cc6c )); + } else if (Challenges.NAME_IDS[i].equals("sbsg")) { + return new ItemSprite(ItemSpriteSheet.CHALLANEESICON_11,new ItemSprite.Glowing( 0x3b1051 )); + } else if (Challenges.NAME_IDS[i].equals("exsg")) { + return new ItemSprite(ItemSpriteSheet.CHALLANEESICON_12,new ItemSprite.Glowing( 0xd1ce9f )); + } else if (Challenges.NAME_IDS[i].equals("stronger_bosses")) { + return new ItemSprite(ItemSpriteSheet.CHALLANEESICON_13,new ItemSprite.Glowing( 0xff0000 )); + } else if (Challenges.NAME_IDS[i].equals("dhxd")) { + return new ItemSprite(ItemSpriteSheet.LANTERNB,new ItemSprite.Glowing( 0x384976 )); + } else { + return Icons.get(Icons.PREFS); } - @Override - protected void layout() { - super.layout(); - hotArea.height = hotArea.width = 0; - } - - protected boolean onClick(float x, float y){ - if(!inside(x,y)) return false; - if(active) onClick(); - - return true; - } } + } \ No newline at end of file diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndGame.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndGame.java index 92f94c98e..3328c1ab0 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndGame.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndGame.java @@ -78,7 +78,7 @@ public class WndGame extends Window { @Override protected void onClick() { hide(); - GameScene.show( new WndChallenges( Dungeon.challenges, false ) ); + GameScene.show( new WndChallenges( Dungeon.challenges, false,null ) ); } } ); curBtn.icon(Icons.get(Icons.CHALLENGE_ON)); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndGameInProgress.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndGameInProgress.java index 5c4a70db9..485d79b06 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndGameInProgress.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndGameInProgress.java @@ -106,7 +106,7 @@ public class WndGameInProgress extends Window { RedButton btnChallenges = new RedButton( Messages.get(this, "challenges") ) { @Override protected void onClick() { - Game.scene().add( new WndChallenges( info.challenges, false ) ); + Game.scene().add( new WndChallenges( info.challenges, false,null ) ); } }; btnChallenges.icon(Icons.get(Icons.CHALLENGE_ON)); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndKingShop.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndKingShop.java index 1bfe1d6a3..76a3e1f95 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndKingShop.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndKingShop.java @@ -14,6 +14,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.NullDiedTO; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.Shopkeeper; import com.shatteredpixel.shatteredpixeldungeon.items.Item; import com.shatteredpixel.shatteredpixeldungeon.items.armor.Armor; +import com.shatteredpixel.shatteredpixeldungeon.items.quest.BackGoKey; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; import com.shatteredpixel.shatteredpixeldungeon.scenes.PixelScene; @@ -178,7 +179,26 @@ public class WndKingShop extends Window { btnReload.setRect(80,-2, 40, 20 ); add(btnReload); - resize(WIDTH, (int) s6.bottom()); + StyledButton btnGoBack = new StyledButton(Chrome.Type.RED_BUTTON, Messages.get(this,"goback"),6){ + @Override + protected void onClick() { + super.onClick(); + Game.runOnRenderThread(new Callback() { + @Override + public void call() { + hide(); + GameScene.show(new BackGoKey.WndSelectLevel()); + GLog.w(Messages.get(WndKingShop.class,"back")); + } + }); + } + }; + btnGoBack.textColor(Window.CYELLOW); + btnGoBack.icon(Icons.get(Icons.DEPTH)); + btnGoBack.setRect(s1.left(), s6.bottom()+5,111,BTN_SIZE ); + add(btnGoBack); + + resize(WIDTH, (int) btnGoBack.bottom()); } public static WndBag sell() { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndRanking.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndRanking.java index f1fbdf084..590a06819 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndRanking.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndRanking.java @@ -218,7 +218,7 @@ public class WndRanking extends WndTabbed { RedButton btnChallenges = new RedButton( Messages.get(this, "challenges") ) { @Override protected void onClick() { - Game.scene().add( new WndChallenges( Dungeon.challenges, false ) ); + Game.scene().add( new WndChallenges( Dungeon.challenges, false,null ) ); } }; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndHard.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndSeed.java similarity index 63% rename from core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndHard.java rename to core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndSeed.java index 5f0a6dc3a..56644b165 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndHard.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndSeed.java @@ -24,16 +24,12 @@ package com.shatteredpixel.shatteredpixeldungeon.windows; import com.shatteredpixel.shatteredpixeldungeon.Challenges; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.SPDSettings; -import com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon; import com.shatteredpixel.shatteredpixeldungeon.custom.messages.M; import com.shatteredpixel.shatteredpixeldungeon.custom.utils.CustomGameSettings; import com.shatteredpixel.shatteredpixeldungeon.custom.visuals.TextField; -import com.shatteredpixel.shatteredpixeldungeon.scenes.PixelScene; import com.shatteredpixel.shatteredpixeldungeon.ui.CheckBox; import com.shatteredpixel.shatteredpixeldungeon.ui.IconButton; -import com.shatteredpixel.shatteredpixeldungeon.ui.Icons; import com.shatteredpixel.shatteredpixeldungeon.ui.RedButton; -import com.shatteredpixel.shatteredpixeldungeon.ui.RenderedTextBlock; import com.shatteredpixel.shatteredpixeldungeon.ui.ScrollPane; import com.shatteredpixel.shatteredpixeldungeon.ui.Window; import com.shatteredpixel.shatteredpixeldungeon.utils.DungeonSeed; @@ -42,11 +38,10 @@ import com.watabou.noosa.ui.Component; import java.util.ArrayList; -public class WndHard extends Window { +public class WndSeed extends Window { private static final int WIDTH = 120; - private static final int HEIGHT = 162; - private static final int BTN_HEIGHT = 16; + private static final int HEIGHT = 26; private static final int GAP = 1; private boolean editable; @@ -55,7 +50,7 @@ public class WndHard extends Window { private CanScrollTextField cstf; private CanScrollButton deleteSeedInput; - public WndHard ( long checked, boolean editable ) { + public WndSeed(boolean editable ) { super(); @@ -66,17 +61,6 @@ public class WndHard extends Window { ScrollPane pane = new ScrollPane(new Component()) { @Override public void onClick(float x, float y) { - int max_size = boxes.size(); - for (int i = 0; i < max_size; ++i) { - if (boxes.get(i).onClick(x, y)) - return; - } - max_size = infos.size(); - for(int i = 0; i(); infos = new ArrayList<>(); - final int normal_mode = 0; - final int hard_mode = 7; - final int warning_mode =9; - final int Test_Debug = 12; - boolean isCustom = false; - //boolean isCustom = false; + float pos = 0; - for (int i = 0; i < Challenges.NAME_IDS.length; i++) { - - final String challenge = Challenges.NAME_IDS[i]; - - if(i==normal_mode || i==hard_mode || i==warning_mode || i==Test_Debug){ - RenderedTextBlock block = PixelScene.renderTextBlock(10); - switch (i){ - case normal_mode: - block.text(M.L(Challenges.class, "traditional")); - block.hardlight(0x00FF00); - break; - case hard_mode: - block.text(M.L(Challenges.class, "hard")); - block.hardlight(0xFF00FF); - break; - case warning_mode: - block.text(M.L(Challenges.class, "warning")); - block.hardlight(0xFF0000); - break; - case Test_Debug: - block.text(M.L(Challenges.class, "test")); - block.hardlight(0xFFFF00); - break; - } - block.setPos((WIDTH - block.width()) / 2, - pos + GAP *4); - PixelScene.align(block); - content.add(block); - pos += block.height() + 11*GAP; - } - - CanScrollCheckBox cb = new CanScrollCheckBox(M.TL(Challenges.class, challenge)); - cb.checked((checked & Challenges.MASKS[i]) != 0); - cb.active = editable; - - if (i > 0) { - pos += GAP; - } - cb.setRect(0, pos, WIDTH - 16, BTN_HEIGHT); - - content.add(cb); - boxes.add(cb); - - boolean finalIsCustom = isCustom; - CanScrollInfo info = new CanScrollInfo(Icons.get(Icons.INFO)) { - @Override - protected void onClick() { - super.onClick(); - ShatteredPixelDungeon.scene().add( - new WndMessage(M.L(finalIsCustom ? TextChallenges.class : Challenges.class, challenge + "_desc")) - ); - } - }; - info.setRect(cb.right(), pos, 16, BTN_HEIGHT); - infos.add(info); - content.add(info); - - pos = cb.bottom(); - } - pos += GAP; - - cstf = new CanScrollTextField(M.L(TextChallenges.class, "seed_custom_title")); cstf.setHint(M.L(TextChallenges.class, "hint")); content.add(cstf); 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 d03b442d0..096ad3623 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndSettings.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndSettings.java @@ -632,10 +632,10 @@ public class WndSettings extends WndTabbed { @Override protected void onClick() { super.onClick(); - SPDSettings.FPSLimit(checked()); + SPDSettings.TimeLimit(checked()); } }; - optFPSLimit.checked(SPDSettings.FPSLimit()); + optFPSLimit.checked(SPDSettings.TimeLimit()); add(optFPSLimit); quickslots = new OptionSlider(Messages.get(this, "quickslots"), "" + Constants.MIN_QUICKSLOTS, 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 b1309879c..80abaa0f4 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndStartGame.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndStartGame.java @@ -102,7 +102,7 @@ public class WndStartGame extends Window { "hard"), 5){ @Override protected void onClick() { - ShatteredPixelDungeon.scene().addToFront(new WndChallenges(SPDSettings.challenges(), true) { + ShatteredPixelDungeon.scene().addToFront(new WndChallenges(SPDSettings.challenges(), false, null) { public void onBackPressed() { super.onBackPressed(); icon(Icons.get(SPDSettings.challenges() > 0 ? Icons.CHALLENGE_ON : Icons.CHALLENGE_OFF)); @@ -158,7 +158,7 @@ public class WndStartGame extends Window { "news"), 5){ @Override protected void onClick() { - ShatteredPixelDungeon.scene().addToFront(new WndChallenges(SPDSettings.challenges(), true) { + ShatteredPixelDungeon.scene().addToFront(new WndChallenges(SPDSettings.challenges(), false, null) { public void onBackPressed() { super.onBackPressed(); icon(Icons.get(SPDSettings.challenges() > 0 ? Icons.CHALLENGE_ON : Icons.CHALLENGE_OFF)); @@ -283,7 +283,7 @@ public class WndStartGame extends Window { Icons.get( SPDSettings.challenges() > 0 ? Icons.CHALLENGE_ON :Icons.CHALLENGE_OFF)){ @Override protected void onClick() { - ShatteredPixelDungeon.scene().addToFront(new WndChallenges(SPDSettings.challenges(), true) { + ShatteredPixelDungeon.scene().addToFront(new WndChallenges(SPDSettings.challenges(), false, null) { public void onBackPressed() { super.onBackPressed(); if (parent != null) { 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 d747edf6d..313eaf3d3 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndUseItem.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndUseItem.java @@ -21,6 +21,8 @@ package com.shatteredpixel.shatteredpixeldungeon.windows; +import static com.shatteredpixel.shatteredpixeldungeon.ui.Icons.RENAME_OFF; + import com.shatteredpixel.shatteredpixeldungeon.Badges; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.items.EquipableItem; @@ -75,18 +77,17 @@ public class WndUseItem extends WndInfoItem { btn.textColor( TITLE_COLOR ); } if (Badges.isUnlocked(Badges.Badge.BOSS_SLAIN_1)) { - label43: { - boolean var9 = item instanceof EquipableItem; - if (!var9) { + ling: { + boolean itemname = item instanceof EquipableItem; + if (!itemname) { if (!(item instanceof Wand)) { - break label43; + break ling; } } - Image var12 = Icons.get(Icons.RENAME_OFF); - Image var11 = var12; - if (var9) { + Image renamebutton = Icons.get(Icons.RENAME_OFF); + if (itemname) { if (!((EquipableItem)item).customName.equals("")) { - var11 = Icons.get(Icons.RENAME_ON); + renamebutton = Icons.get(Icons.RENAME_ON); } } @@ -96,7 +97,7 @@ public class WndUseItem extends WndInfoItem { } } - IconButton Rename = new IconButton(var11) { + IconButton Rename = new IconButton(renamebutton) { public String hoverText() { return Messages.titleCase(Messages.get(WndGame.class, "rename")); } @@ -122,6 +123,7 @@ public class WndUseItem extends WndInfoItem { GameScene.show(new WndUseItem(owner, item)); } }); + icon(Icons.get(!item.name().equals("") ? RENAME_OFF : Icons.RENAME_ON)); } }; Rename.setRect((float)(super.width - 16), 0.0F, 16.0F, 16.0F); diff --git a/desktop/src/main/java/com/shatteredpixel/shatteredpixeldungeon/desktop/DesktopPlatformSupport.java b/desktop/src/main/java/com/shatteredpixel/shatteredpixeldungeon/desktop/DesktopPlatformSupport.java index 818aea1b9..a9d4336f6 100644 --- a/desktop/src/main/java/com/shatteredpixel/shatteredpixeldungeon/desktop/DesktopPlatformSupport.java +++ b/desktop/src/main/java/com/shatteredpixel/shatteredpixeldungeon/desktop/DesktopPlatformSupport.java @@ -56,7 +56,7 @@ public class DesktopPlatformSupport extends PlatformSupport { SPDSettings.windowResolution( previousSizes[0] ); } } - + @Override public void updateSystemUI() { Gdx.app.postRunnable( new Runnable() { @@ -71,7 +71,7 @@ public class DesktopPlatformSupport extends PlatformSupport { } } ); } - + @Override public boolean connectedToUnmeteredNetwork() { return true; //no easy way to check this in desktop, just assume user doesn't care @@ -105,12 +105,12 @@ public class DesktopPlatformSupport extends PlatformSupport { } /* FONT SUPPORT */ - + //custom pixel font, for use with Latin and Cyrillic languages private static FreeTypeFontGenerator basicFontGenerator; //droid sans fallback, for asian fonts private static FreeTypeFontGenerator asianFontGenerator; - + @Override public void setupFontGenerators(int pageSize, boolean systemfont) { //don't bother doing anything if nothing has changed @@ -127,6 +127,7 @@ public class DesktopPlatformSupport extends PlatformSupport { basicFontGenerator = asianFontGenerator = fallbackFontGenerator = new FreeTypeFontGenerator(Gdx.files.internal("fonts/droid_sans.ttf")); } else { basicFontGenerator = new FreeTypeFontGenerator(Gdx.files.internal("fonts/pixel_font.ttf")); + //TODO 改成你自己的字库文件名,放到fonts文件夹里面 asianFontGenerator = new FreeTypeFontGenerator(Gdx.files.internal("fonts/fusion_pixel.ttf")); fallbackFontGenerator = new FreeTypeFontGenerator(Gdx.files.internal("fonts/droid_sans.ttf")); } @@ -137,7 +138,7 @@ public class DesktopPlatformSupport extends PlatformSupport { packer = new PixmapPacker(pageSize, pageSize, Pixmap.Format.RGBA8888, 1, false); } - + private static Matcher asianMatcher = Pattern.compile("\\p{InHangul_Syllables}|" + "\\p{InCJK_Unified_Ideographs}|\\p{InCJK_Symbols_and_Punctuation}|\\p{InHalfwidth_and_Fullwidth_Forms}|" + "\\p{InHiragana}|\\p{InKatakana}").matcher(""); @@ -150,7 +151,7 @@ public class DesktopPlatformSupport extends PlatformSupport { return basicFontGenerator; } } - + //splits on newlines, underscores, and chinese/japaneses characters private Pattern regularsplitter = Pattern.compile( "(?<=\n)|(?=\n)|(?<=_)|(?=_)|" + @@ -158,7 +159,7 @@ public class DesktopPlatformSupport extends PlatformSupport { "(?<=\\p{InKatakana})|(?=\\p{InKatakana})|" + "(?<=\\p{InCJK_Unified_Ideographs})|(?=\\p{InCJK_Unified_Ideographs})|" + "(?<=\\p{InCJK_Symbols_and_Punctuation})|(?=\\p{InCJK_Symbols_and_Punctuation})"); - + //additionally splits on words, so that each word can be arranged individually private Pattern regularsplitterMultiline = Pattern.compile( "(?<= )|(?= )|(?<=\n)|(?=\n)|(?<=_)|(?=_)|" + @@ -166,7 +167,7 @@ public class DesktopPlatformSupport extends PlatformSupport { "(?<=\\p{InKatakana})|(?=\\p{InKatakana})|" + "(?<=\\p{InCJK_Unified_Ideographs})|(?=\\p{InCJK_Unified_Ideographs})|" + "(?<=\\p{InCJK_Symbols_and_Punctuation})|(?=\\p{InCJK_Symbols_and_Punctuation})"); - + @Override public String[] splitforTextBlock(String text, boolean multiline) { if (multiline) {