update 0.6.5.0-Alpha4
-1.电子斗蛐蛐v0.2更新 -2.改善一些界面 修复一些问题 -3.更多查阅游戏更新记录
This commit is contained in:
parent
dec3b2bd77
commit
a14cfe9d27
|
@ -18,8 +18,8 @@ allprojects {
|
|||
appName = 'Magic Ling Pixel Dungeon'
|
||||
appPackageName = 'com.ansdomagiclingpixeldungeon.ling'
|
||||
|
||||
appVersionCode =907400
|
||||
appVersionName = '0.6.5.0-Alpha3'
|
||||
appVersionCode =907500
|
||||
appVersionName = '0.6.5.0-Alpha4'
|
||||
|
||||
appJavaCompatibility = JavaVersion.VERSION_11
|
||||
|
||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 52 KiB After Width: | Height: | Size: 52 KiB |
Binary file not shown.
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 22 KiB |
|
@ -360,7 +360,7 @@ custom.testmode.mobplacer.elite_name4={成长{
|
|||
custom.testmode.mobplacer.elite_name5=]索敌]
|
||||
custom.testmode.mobplacer.elite_name6=_鬼磷_
|
||||
custom.testmode.mobplacer.elite_name7=|苦痛|
|
||||
custom.testmode.mobplacer.elite_name8=}盟友}
|
||||
custom.testmode.mobplacer.elite_name8={炼狱{
|
||||
|
||||
custom.testmode.mobplacer.elite_name9=失败体
|
||||
custom.testmode.mobplacer.elite_name10=爆炸体
|
||||
|
@ -369,6 +369,8 @@ custom.testmode.mobplacer.elite_name12=危险体
|
|||
custom.testmode.mobplacer.elite_name13=烟雾体
|
||||
custom.testmode.mobplacer.elite_name14=酸液体
|
||||
|
||||
custom.testmode.mobplacer.elite_name15=[友好[
|
||||
|
||||
actors.mobs.bloodbat$bloodbatrecharge.name=血影充能
|
||||
actors.mobs.bloodbat$bloodbatrecharge.desc=小血影正在充能,等待下一次和主人并肩作战的时候!\n\n剩余充能时长:%s回合.
|
||||
|
||||
|
@ -835,7 +837,11 @@ actors.mobs.slime_sz.name=史莱姆-圣紫守护者
|
|||
actors.mobs.slime_sz.desc=史莱姆七大守护者中的_圣紫使者_\n它发出的攻击有几率让入侵者受到_迟缓效果_!
|
||||
|
||||
actors.mobs.slimeking.name=史莱姆王子
|
||||
actors.mobs.slimeking.desc=史莱姆王子,圣境密林的守护者,没有人能从它这里活着走过去。你或许在质疑为什么圣境密林层会有它的存在,实际上,这也是史莱姆一族需要解决的问题。
|
||||
actors.mobs.slimeking.desc=史莱姆王子,史莱姆族群的代理人,没有人能从它这里活着走过去。你或许在质疑为什么会有它的存在,实际上,这也是史莱姆一族需要解决的问题。[设计原型:泰拉瑞亚]
|
||||
|
||||
actors.mobs.spical.slimekingmob.name=史莱姆王子
|
||||
actors.mobs.spical.slimekingmob.desc=史莱姆王子,史莱姆族群的代理人,没有人能从它这里活着走过去。你或许在质疑为什么会有它的存在,实际上,这也是史莱姆一族需要解决的问题。[设计原型:泰拉瑞亚]
|
||||
|
||||
actors.mobs.slimeking.notice=你清楚你在与谁抗衡吗?
|
||||
actors.mobs.slimeking.defeated=不……这不可能……
|
||||
actors.mobs.slimeking.arise=无礼!朕为了一切什么都能付出
|
||||
|
@ -918,10 +924,10 @@ actors.mobs.rgoo100.enraged=激怒
|
|||
actors.mobs.rgoo100.gluuurp=咕——————!
|
||||
actors.mobs.rgoo100.rankings_desc=被小粘咕消化
|
||||
|
||||
actors.mobs.xtg100.name=小天狗-100实验体-狂暴
|
||||
actors.mobs.xtg100.name=Tengu-100
|
||||
actors.mobs.xtg100.desc=和大天狗长得差不多的幻影,但血量只有大天狗的四分之一。你已经彻底激怒他们,他们仍然能使用喷火器,但弹药不是无限的。\n\当前弹药总共还有_%s发_.
|
||||
|
||||
actors.mobs.xtg200.name=小天狗-100实验体
|
||||
actors.mobs.xtg200.name=Tengu-100
|
||||
actors.mobs.xtg200.desc=和大天狗长得差不多的幻影,但血量只有大天狗的四分之一。
|
||||
|
||||
actors.mobs.sb.name=矮人国亡
|
||||
|
@ -1922,8 +1928,8 @@ actors.mobs.brute$bruterage.desc=这个豺狼暴徒的死亡已经不可避免
|
|||
actors.mobs.causticslime.name=蚀化史莱姆
|
||||
actors.mobs.causticslime.desc=这个史莱姆似乎已经被下方渗透的黑暗能量完全侵蚀了。它已经失去了体表原有的绿色光泽,并且在不断滴落腐蚀污泥。
|
||||
|
||||
actors.mobs.crab.name=下水道螃蟹
|
||||
actors.mobs.crab.desc=这些巨型的螃蟹位居下水道食物链的顶端。它们行动极其迅速且其厚重的甲壳能承受沉重的打击。
|
||||
actors.mobs.crab.name=密林螃蟹
|
||||
actors.mobs.crab.desc=这些巨型的螃蟹位居密林食物链的顶端。它们行动极其迅速且其厚重的甲壳能承受沉重的打击。
|
||||
|
||||
actors.mobs.crystalmimic.name=水晶宝箱怪
|
||||
actors.mobs.crystalmimic.ate=水晶宝箱怪吃掉了你的%s!
|
||||
|
@ -2003,7 +2009,7 @@ actors.mobs.ghoul.name=矮人尸群
|
|||
actors.mobs.ghoul.desc=在矮人王国逐渐衰亡,现在的矮人国王掌握了绝对的权力时,一些较为弱小的或是反抗国王的矮人受到了不公的待遇。然而随着矮人国王逐渐精通黑暗魔法,这些矮人逐渐屈从于其意志,并最终沦为了其大军中的一枚棋子。\n\n矮人尸群中的个体本身没有强大的战斗力,但它们总是结伴作战,试图利用数量优势击败强大的对手。_一名矮人尸群成员被击倒时,如果周围仍有其他同类,它将会在几回合后重生_。
|
||||
|
||||
actors.mobs.gnoll.name=豺狼巡查
|
||||
actors.mobs.gnoll.desc=豺狼是鬣狗状的类人生物。它们在下水道和地牢里游荡,不时向上行动试图向地表发起进攻。豺狼巡查是它们种群里最普通的一员,它们既没有豺狼暴徒强壮,也赶不上萨满聪明。
|
||||
actors.mobs.gnoll.desc=豺狼是鬣狗状的类人生物。它们在密林和地牢里游荡,不时向上行动试图向地表发起进攻。豺狼巡查是它们种群里最普通的一员,它们既没有豺狼暴徒强壮,也赶不上萨满聪明。
|
||||
|
||||
actors.mobs.gnolltrickster.name=豺狼诡术师
|
||||
actors.mobs.gnolltrickster.desc=即使以豺狼人的标准来看,这个生物也非常的诡异。它佝偻着腰,鬼鬼祟祟地行进着,大嘴咧开,露出邪恶的笑容,肩上挂着的挎包鼓得同摇篮一般。它的瞳孔中混杂着恐惧与兴奋。\n\n它的挎包里有一大批粗制滥造的飞镖,它们似乎包含着各种有害物质。
|
||||
|
@ -2023,12 +2029,16 @@ actors.mobs.goo.pumpup=粘咕正在不断地抽动!
|
|||
actors.mobs.goo.enraged=激怒
|
||||
actors.mobs.goo.gluuurp=咕——————!
|
||||
actors.mobs.goo.rankings_desc=被粘咕消化
|
||||
actors.mobs.goo.desc=我们对粘咕所知甚少。它甚至很有可能不是一个生物,而是下水道表面聚集的邪恶物质得到基本智能而产生的实体。不管怎样,很明显是黑暗魔法造就了这个生物。\n\n其凝胶性质让它吸收了很多黑暗能量,你光是靠近就感受到了一股寒意。如果粘咕使用这种能量对你进行攻击那你肯定支撑不了多久。
|
||||
actors.mobs.goo.desc=我们对粘咕所知甚少。它甚至很有可能不是一个生物,而是密林表面聚集的邪恶物质得到基本智能而产生的实体。不管怎样,很明显是黑暗魔法造就了这个生物。\n\n其凝胶性质让它吸收了很多黑暗能量,你光是靠近就感受到了一股寒意。如果粘咕使用这种能量对你进行攻击那你肯定支撑不了多久。
|
||||
|
||||
actors.mobs.spical.goomob.name=粘咕
|
||||
actors.mobs.spical.goomob.desc=我们对粘咕所知甚少。它甚至很有可能不是一个生物,而是密林表面聚集的邪恶物质得到基本智能而产生的实体。不管怎样,很明显是黑暗魔法造就了这个生物。\n\n其凝胶性质让它吸收了很多黑暗能量,你光是靠近就感受到了一股寒意。如果粘咕使用这种能量对你进行攻击那你肯定支撑不了多久。
|
||||
|
||||
|
||||
actors.mobs.greatcrab.name=巨大螃蟹
|
||||
actors.mobs.greatcrab.noticed=巨型螃蟹用它硕大的钳子格挡了这次攻击。
|
||||
actors.mobs.greatcrab.def_verb=格挡
|
||||
actors.mobs.greatcrab.desc=这只螃蟹的块头相当大,甚至超过了其他的下水道螃蟹。它的蓝色甲壳上布满了裂纹和藤壶,足以证明其经历的无数岁月。它爬行缓慢,那只巨大的钳子让它难以保持平衡。\n\n尽管这螃蟹只剩下一边的钳子,但钳子的个头完全弥补了这点不足。螃蟹只要发现危险就会把爪子举在身前,利用坚不可摧的甲壳进行防御。不过螃蟹无法格挡未察觉的攻击,也无法同时格挡多个敌人的进攻。
|
||||
actors.mobs.greatcrab.desc=这只螃蟹的块头相当大,甚至超过了其他的密林螃蟹。它的蓝色甲壳上布满了裂纹和藤壶,足以证明其经历的无数岁月。它爬行缓慢,那只巨大的钳子让它难以保持平衡。\n\n尽管这螃蟹只剩下一边的钳子,但钳子的个头完全弥补了这点不足。螃蟹只要发现危险就会把爪子举在身前,利用坚不可摧的甲壳进行防御。不过螃蟹无法格挡未察觉的攻击,也无法同时格挡多个敌人的进攻。
|
||||
|
||||
actors.mobs.guard.name=监狱守卫
|
||||
actors.mobs.guard.scorpion=给我过来!
|
||||
|
@ -2077,7 +2087,7 @@ actors.mobs.pylon.desc_inactive=这是一座用于分配区域内机械用电的
|
|||
actors.mobs.pylon.desc_active=这是一座用于分配区域内机械用电的能量塔。此刻能量塔电能涌动,定是它正在为DM-300充能!\n\n这时的能量塔可被摧毁,却会顺时针向四周释放电弧。厚重的金属结构为其提供了强劲的防御。
|
||||
|
||||
actors.mobs.rat.name=啮齿小鼠
|
||||
actors.mobs.rat.desc=虽说啮齿小鼠们具有攻击性,可它们依旧是下水道居民里的弱者。它们的啮咬非常烦人,但只有数量巨大时才会有生命威胁。
|
||||
actors.mobs.rat.desc=虽说啮齿小鼠们具有攻击性,可它们依旧是密林居民里的弱者。它们的啮咬非常烦人,但只有数量巨大时才会有生命威胁。
|
||||
|
||||
actors.mobs.ripperdemon.name=恶魔撕裂者
|
||||
actors.mobs.ripperdemon.leap=恶魔撕裂者正准备扑杀!
|
||||
|
@ -2113,9 +2123,9 @@ actors.mobs.skeleton.desc=骷髅是从那些悲惨的冒险者及地牢原住民
|
|||
|
||||
actors.mobs.slime.name=史莱姆
|
||||
actors.mobs.slime.def_verb=格挡
|
||||
actors.mobs.slime.desc=史莱姆是一种具有胶质外形与液态内核的奇特魔法生物。城市的下水道为它们提供了充分的水源和富足的养分。\n\n史莱姆的外层胶膜具有极强的弹性,这使得任何单次攻击都难以对它们造成超过_6点的伤害_。
|
||||
actors.mobs.slime.desc=史莱姆是一种具有胶质外形与液态内核的奇特魔法生物。城市的密林为它们提供了充分的水源和富足的养分。\n\n史莱姆的外层胶膜具有极强的弹性,这使得任何单次攻击都难以对它们造成超过_6点的伤害_。
|
||||
|
||||
actors.mobs.snake.name=下水道巨蛇
|
||||
actors.mobs.snake.name=密林巨蛇
|
||||
actors.mobs.snake.hint=试试点击检查按钮再选择蛇,以了解如何击败它们。
|
||||
actors.mobs.snake.desc=这些体型庞大的蛇能通过快速滑行以闪避普通的攻击,让它们难以命中。不过伏击与魔法攻击会使它们措手不及。\n\n在这条蛇的视野外攻击它时可以触发伏击。当这条蛇在追击你时,可以尝试躲入一扇门后,再_在蛇进门的瞬间发动攻击_。
|
||||
|
||||
|
@ -2130,7 +2140,7 @@ actors.mobs.statue.def_verb=格挡
|
|||
actors.mobs.statue.desc=你可能认为这只是地牢里的又一具雕像摆设,但它发出红光的眼睛出卖了自己。 \n\n尽管雕像本身是用石头做的,但它手上握着的_%s_看起来像是真的。
|
||||
|
||||
actors.mobs.succubus.name=魅魔
|
||||
actors.mobs.succubus.desc=魅魔是一种善于操纵敌人的精神的变形恶魔。这一只化为了哥特风的苍白人形,或许是为了吸引矮人噬魂女皇?\n\n在攻击时,魅魔能够暂时魅惑目标,使其无法直接攻击魅魔本身。魅魔在攻击被魅惑的目标时能吸取其生命精华。
|
||||
actors.mobs.succubus.desc=魅魔是一种善于操纵敌人的精神的变形恶魔。这一只化为了哥特风的苍白人形,或许是为了吸引矮人术士?\n\n在攻击时,魅魔能够暂时魅惑目标,使其无法直接攻击魅魔本身。魅魔在攻击被魅惑的目标时能吸取其生命精华。
|
||||
|
||||
actors.mobs.swarm.name=蝇群
|
||||
actors.mobs.swarm.desc=致命的飞蝇群愤怒地发出嗡嗡声。每次非魔法攻击都会把它分割成两群更小但同样危险的飞蝇群。
|
||||
|
|
|
@ -969,7 +969,7 @@ actors.mobs.ghoul.name=dwarven ghoul
|
|||
actors.mobs.ghoul.desc=As dwarven society slowly began to collapse, and the current king of the dwarves seized absolute power, those who were weak or who resisted him were not treated well. As the king grew more adept at wielding dark magic, he bent these dwarves to his will, and now they make up the footsoldiers of his army.\n\nGhouls are not especially strong on their own, but always travel in groups and are much harder to kill in large numbers. _When a ghoul is defeated, it will rise again after a few turns as long as another ghoul is nearby._
|
||||
|
||||
actors.mobs.gnoll.name=ノールの斥候
|
||||
actors.mobs.gnoll.desc=ノールはハイエナのような人型生物だ。彼らは下水道やダンジョンに生息し、時々地表を襲うために危険を犯す。ノールの斥候は悪漢ほど強くなく、巫師よりも賢くないが、部隊の大多数を占めている。
|
||||
actors.mobs.gnoll.desc=ノールはハイエナのような人型生物だ。彼らは密林やダンジョンに生息し、時々地表を襲うために危険を犯す。ノールの斥候は悪漢ほど強くなく、巫師よりも賢くないが、部隊の大多数を占めている。
|
||||
|
||||
actors.mobs.gnolltrickster.name=ノールの奇術師
|
||||
actors.mobs.gnolltrickster.desc=ノールの標準と比べても、とても奇妙な見た目をしている。背は曲がっており、邪悪な笑みを浮かべながら、肩にかかっている鞄を揺らしている。恐れと興奮が入り混じった目を見開いている。\n\n鞄には雑に作られた投矢の膨大なコレクションで埋め尽くされており、先端には様々な有害物質が塗られているように見える。
|
||||
|
|
|
@ -11,6 +11,7 @@ items.weapon.melee.legend.diedcrossbow.king_desc=_战术扇形爆炸弩炮_\n\n
|
|||
items.weapon.melee.legend.diedcrossbow.ac_king=战术扇形爆炸弩炮
|
||||
items.weapon.melee.legend.diedcrossbow.no_cooldown=弩炮装置正在重新装填,请稍后……
|
||||
items.weapon.melee.legend.diedcrossbow.no_equip=必须装备重型弩炮才能使用它。
|
||||
items.weapon.melee.legend.diedcrossbow.ondeath=你被爆炸弩炮炸的渣的不剩了……
|
||||
|
||||
items.weapon.melee.sdbsword.name=钻石大剑
|
||||
items.weapon.melee.sdbsword.desc=钻石制成的奇特大剑,现在它已经给予了足够多的能量,它回到了巅峰时刻\n剑身残留着钻石宝箱王的魔力,因此对其他魔力有着莫名的亲和性。相比于其他武器,这把武器会随着等级的提升增加更多伤害。\n这把武器攻击速度极慢,但精准极高。\n该武器已经重回巅峰,可以发射剑气。(该武器尚未完成,切勿使用)
|
||||
|
@ -697,11 +698,11 @@ items.artifacts.driedrose$ghosthero.def_verb=躲避
|
|||
items.artifacts.driedrose$ghosthero.hello=再次向你问好,%s。
|
||||
items.artifacts.driedrose$ghosthero.introduce=我的灵魂与这朵玫瑰相连,它对我非常珍贵,是我在地面上相别的爱人送给我的礼物。\n\n我无法回去见他了,但感谢你给我再一次完成旅程的机会。当我准备好后,我会回应你的呼唤与你并肩作战。\n\n只要你拿着玫瑰我就可以听到你的声音,你可以在远处指引我前进。\n\n希望你能在我倒下的地方继续走下去……
|
||||
|
||||
items.artifacts.driedrose$ghosthero.dialogue_sewers_1=下水道以前是安全的,人们甚至会住进来过冬。
|
||||
items.artifacts.driedrose$ghosthero.dialogue_sewers_1=密林以前是安全的,人们甚至会住进来过冬。
|
||||
items.artifacts.driedrose$ghosthero.dialogue_sewers_2=不知道这里的守卫怎么了,他们放弃守护这片地方了吗?
|
||||
items.artifacts.driedrose$ghosthero.dialogue_sewers_3=我在地牢外还有家人,希望他们一切安好。
|
||||
items.artifacts.driedrose$ghosthero.dialogue_sewers_4=守卫没能解决这些怪物,但也许我们能。
|
||||
items.artifacts.driedrose$ghosthero.dialogue_sewers_5=连下水道都这么危险,不知道更深处会有些什么……
|
||||
items.artifacts.driedrose$ghosthero.dialogue_sewers_5=连密林都这么危险,不知道更深处会有些什么……
|
||||
items.artifacts.driedrose$ghosthero.dialogue_sewers_6=这些老鼠和螃蟹是怎么长这么大的?
|
||||
items.artifacts.driedrose$ghosthero.dialogue_prison_1=我听过不少关于这里的传闻,没有一个是好消息。
|
||||
items.artifacts.driedrose$ghosthero.dialogue_prison_2=虽说这里是座监狱,但怎么看都更像个地牢。
|
||||
|
@ -712,7 +713,7 @@ items.artifacts.driedrose$ghosthero.dialogue_prison_6=这些人其实没必要
|
|||
items.artifacts.driedrose$ghosthero.dialogue_caves_1=看起来这里已经很久未被人类和矮人们踏足了。
|
||||
items.artifacts.driedrose$ghosthero.dialogue_caves_2=究竟是什么原因让矮人放弃这一整座黄金矿脉的?
|
||||
items.artifacts.driedrose$ghosthero.dialogue_caves_3=这里的黄金在地表上没什么用,真是太可惜了。
|
||||
items.artifacts.driedrose$ghosthero.dialogue_caves_4=就像下水道里的一样,这些生物也都被扭曲了。
|
||||
items.artifacts.driedrose$ghosthero.dialogue_caves_4=就像密林里的一样,这些生物也都被扭曲了。
|
||||
items.artifacts.driedrose$ghosthero.dialogue_caves_5=这里连蝙蝠都这么狂暴嗜血。
|
||||
items.artifacts.driedrose$ghosthero.dialogue_caves_6=没有看到任何采矿设备,它们都被矮人回收了吗?
|
||||
items.artifacts.driedrose$ghosthero.dialogue_city_1=矮人一族勤奋,稳重且守信,但他们既贪婪又容易记仇。
|
||||
|
|
|
@ -255,6 +255,10 @@ badges$badge.read_book_three.desc=一局累计阅读五本书籍。
|
|||
badges$badge.read_book_four.title=书籍博学家
|
||||
badges$badge.read_book_four.desc=一局累计阅读七本书籍。
|
||||
|
||||
badges$badge.bombbow_died.title=碎片飞溅
|
||||
badges$badge.bombbow_died.desc=你的遗体碎片四溅,下次记得别对着自己开炮……
|
||||
|
||||
|
||||
|
||||
###隐藏
|
||||
|
||||
|
@ -329,7 +333,7 @@ challenges.rlpt = ]支离破碎]
|
|||
challenges.rlpt_desc=地下涌动的神秘力量正在渐渐腐蚀这里,这里不过是而言是另一场噩梦。\n\n从第六层开始,怪物必定有几个不是本大层的怪物,但不会超过两级。一般来说,在监狱遇到矮人层的怪物几率很小。通常遇到矿洞层的怪物。
|
||||
|
||||
challenges.sbsg = ]基因突变]
|
||||
challenges.sbsg_desc=地牢中的神秘魔力让一些生物发生了重大的变化\n-所有生物都会因为突变激素变得各不相同,给探索地牢的脚步带来更大的困难。\n-敌人有6种突变类型,且除爆炸体和酸液体概率为5%后,其余Roll出权重一致:\n\n突变失败体:近战伤害减少35%,移速提高到1.3。\n\n突变爆炸体:移速减少50%,攻击力降低30%,但死亡时拥有爆炸伤害。\n\n突变完全体:移速和攻击力各提高25%,且拥有30%伤害减免。\n\n突变危险体:攻击力提升20%,攻击有10%概率造成流血。死亡时有5%概率立刻向本层发出警报。\n\n突变烟雾体:攻击力减少10%,攻击范围+2,攻击敌人10%概率造成眩晕……\n\n突变酸液体:敌人获得额外远程技能,攻击范围+6,造成自身可造成的伤害20%的额外法术伤害并有概率随机产生一种有害烟雾(酸雾,毒雾,眩雾)\n\n_特别说明:如果开启精英强敌,词条会和精英词条共存,届时你将遭遇更大的挑战_
|
||||
challenges.sbsg_desc=地牢中的神秘魔力让一些生物发生了重大的变化\n-所有生物都会因为突变激素变得各不相同,给探索地牢的脚步带来更大的困难。\n-敌人有6种突变类型,且除爆炸体和酸液体概率为5%后,其余Roll出权重一致:\n\n突变失败体:近战伤害减少35%,移速提高到1.3。\n\n突变爆炸体:移速减少50%,攻击力降低30%,但死亡时拥有爆炸伤害。\n\n突变完全体:移速和攻击力各提高25%,且拥有30%伤害减免。\n\n突变危险体:攻击力提升20%,攻击有10%概率造成流血。死亡时有5%概率立刻向本层发出警报。\n\n突变烟雾体:攻击力减少10%,攻击范围+2,攻击敌人10%概率造成眩晕……\n\n突变酸液体:敌人获得额外远程技能,攻击范围+6,造成自身可造成的伤害20%的额外法术伤害并有概率随机产生一种有害烟雾(酸雾,毒雾,眩雾)\n\n_特别说明:如果开启精英强敌,词条会和精英词条可能共存于一个怪物,届时你将遭遇更大的挑战_
|
||||
|
||||
challenges.exsg = ]药水癔症]
|
||||
challenges.exsg_desc=药水癔症详细规则:\n力量药水--60%概率力量-1\n灵视药剂--60%概率喝后失明5回合\n隐形药剂--60%概率喝后立刻怒吼\n极速药剂--60%概率喝后立刻残废8回合\n==========================\n小型口粮-吃后立刻获得极速4回合\n冷冻生肉片-吃后获得奥术护盾\n全肉大饼-吃后立刻获得8回合极速,且有大概率+1力量(_随着力量的追加,获得力量的概率会渐渐变低_)\n\n高级药水_(合剂/魔药)_不受影响\n不知道何种原因,大部分正面药水你都感觉有毒!\n你的臆想会导致药水有毒,但食物却会很有用!而且地牢里面还会追加自动售货机,会售卖一些更加高级的东西。
|
||||
|
|
|
@ -93,7 +93,7 @@ ui.changelist.mlpd.vm0_5_x_changes.kage1=影子盗贼
|
|||
ui.changelist.mlpd.vm0_5_x_changes.kagelogs=如果在$施法失败$时有可能释放€爆炎诅咒€。
|
||||
|
||||
ui.changelist.mlpd.vm0_5_x_changes.cold=冰雪极地层
|
||||
ui.changelist.mlpd.vm0_5_x_changes.coldlogs=下水道层现在改成冰雪层,未来将会加入更多_地形怪物_\n冰雪层_特殊房间_和_普通房间_会生成更多。
|
||||
ui.changelist.mlpd.vm0_5_x_changes.coldlogs=密林层现在改成冰雪层,未来将会加入更多_地形怪物_\n冰雪层_特殊房间_和_普通房间_会生成更多。
|
||||
|
||||
ui.changelist.mlpd.vm0_5_x_changes.bug_0507=1.修复了矿洞层巨魔二次生成问题\n2.修复地牢_生成混乱_问题\n3.彻底移除_快捷攻击栏_
|
||||
|
||||
|
@ -348,7 +348,7 @@ ui.changelist.mlpd.vm0_5_x_changes.mohblr=血月火把猎人改动
|
|||
ui.changelist.mlpd.vm0_5_x_changes.mohblrlogs=血量降低
|
||||
|
||||
ui.changelist.mlpd.vm0_5_x_changes.sjd=圣境密林
|
||||
ui.changelist.mlpd.vm0_5_x_changes.sjdlogs=下水道层正式改为圣境密林,感谢_Daniel_Clan_的原创素材。
|
||||
ui.changelist.mlpd.vm0_5_x_changes.sjdlogs=密林层正式改为圣境密林,感谢_Daniel_Clan_的原创素材。
|
||||
|
||||
ui.changelist.mlpd.vm0_5_x_changes.musipa=原创音乐圣境层实装&&借用音乐说明
|
||||
ui.changelist.mlpd.vm0_5_x_changes.musipalogs=作者_Prohonor_原创发力!\n\n借用泰拉瑞亚双子魔眼BGM,光之女皇BGM\n\n借用橙光战斗BGM第二组\n\n本游戏完全用爱发电,不用于任何商业用途!
|
||||
|
@ -556,4 +556,6 @@ ui.changelist.mlpd.vm0_6_7_x_changes.bug_06x83=1.修复上个版本的FireBase
|
|||
|
||||
ui.changelist.mlpd.vm0_6_7_x_changes.bug_06x84=1.修复酸液体和爆炸体权重错误的问题\n2.成功的移除了炼狱精英
|
||||
|
||||
ui.changelist.mlpd.vm0_6_7_x_changes.bug_06x85=1.修复酸液体和爆炸体权重错误的问题\n2.修复一些少量错误
|
||||
|
||||
//ui.changelist.mlpd.vm0_5_x_changes.xxx//
|
|
@ -226,7 +226,7 @@ windows.wndsettings$langstab.credits=クレジット
|
|||
windows.wndsettings$langstab.reviewers=レビュワー
|
||||
windows.wndsettings$langstab.translators=翻訳者
|
||||
|
||||
windows.wndstory.sewers=ダンジョンの上階は、意外なことに市の下水道を構成している。\n\n暗黒のエネルギーが地底から忍び寄ってくるにつれ、無害だった下水の生物はどんどん危険になってゆく。都市は警備員を地下に送り込んで安全を維持しようとしたが、彼らは段々といなくなっていった。\n\nこの地域は危険だが、少なくともここに作用している邪悪な魔法は弱まっている。
|
||||
windows.wndstory.sewers=ダンジョンの上階は、意外なことに市の密林を構成している。\n\n暗黒のエネルギーが地底から忍び寄ってくるにつれ、無害だった下水の生物はどんどん危険になってゆく。都市は警備員を地下に送り込んで安全を維持しようとしたが、彼らは段々といなくなっていった。\n\nこの地域は危険だが、少なくともここに作用している邪悪な魔法は弱まっている。
|
||||
windows.wndstory.prison=何年も前に、危険な犯罪者を閉じ込めるために牢獄がここに建設された。厳重に管理され安全と言われており、有罪判決を受けた者たちがここに収容されて長い時間を過ごしていた。\n\nしかし、暗黒の瘴気が深部から忍び寄るにつれ、看守と囚人の心を捻じ曲げていった。\n\n混乱に乗じ、都市は全ての牢獄を封印した。壁の中に居るはずの、死人や放置された人の現在を知る者は存在しない…
|
||||
windows.wndstory.caves=廃墟となった牢獄の地下に広がる人口の少ない洞窟だ。鉱物が豊富で、かつては地下のドワーフ社会の賑やかな貿易と産業の中心地だったが、ドワーフが黒魔術に夢中になったために放棄された。\n\n現在、洞窟内には地下の野生動物やノール、放棄された機械などが生息しており、上の地域に影響を与えたのと同じ力に堕落されているようだ。
|
||||
windows.wndstory.city=ドワーフの都は、かつてドワーフの中でも最も偉大な都市国家だった。最盛期には、ドワーフは金属と魔法の不思議な機械を作り、それによって都市は急速に発展しました。\n\nしかし、ある日突然、城門が封鎖され、ドワーフの消息は途絶えてしまった。閉鎖された都市から逃げ出した少数の人々は、王位を奪った狂気の黒魔術師と、彼が学んだ恐ろしい魔法の話をした。
|
||||
|
|
|
@ -88,6 +88,8 @@ public class Badges {
|
|||
|
||||
BRUTE_BOT_DIED ( 25 ),
|
||||
|
||||
BOMBBOW_DIED ( 26 ),
|
||||
|
||||
//silver
|
||||
NO_MONSTERS_SLAIN ( 32 ),
|
||||
GRIM_WEAPON ( 33 ),
|
||||
|
@ -738,6 +740,12 @@ public class Badges {
|
|||
displayBadge( badge );
|
||||
}
|
||||
|
||||
public static void BOMB() {
|
||||
Badge badge = Badge.BOMBBOW_DIED;
|
||||
local.add( badge );
|
||||
displayBadge( badge );
|
||||
}
|
||||
|
||||
private static void validateGOODMAKE() {
|
||||
if (global.contains( Badge.KILL_ROTHEART ) &&
|
||||
global.contains( Badge.GET_SC ) &&
|
||||
|
@ -756,7 +764,7 @@ public class Badges {
|
|||
global.contains( Badge.DEATH_FROM_GAS ) &&
|
||||
global.contains( Badge.DEATH_FROM_HUNGER) &&
|
||||
global.contains( Badge.DEATH_FROM_GLYPH) &&
|
||||
global.contains( Badge.DEATH_FROM_FALLING) && global.contains( Badge.HALOFIRE_DIED) && global.contains( Badge.BRUTE_BOT_DIED)) {
|
||||
global.contains( Badge.DEATH_FROM_FALLING) && global.contains( Badge.HALOFIRE_DIED) && global.contains( Badge.BRUTE_BOT_DIED) && global.contains( Badge.BOMBBOW_DIED)) {
|
||||
|
||||
Badge badge = Badge.YASD;
|
||||
displayBadge( badge );
|
||||
|
|
|
@ -9,9 +9,11 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Burning;
|
|||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Poison;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.Generator;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.SalamanderSprites;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
|
||||
import com.watabou.utils.Bundle;
|
||||
import com.watabou.utils.Random;
|
||||
|
||||
|
@ -40,6 +42,11 @@ public class Salamander extends Mob {
|
|||
} else {
|
||||
enemy.sprite.showStatus( CharSprite.NEUTRAL, enemy.defenseVerb() );
|
||||
}
|
||||
|
||||
if (enemy == Dungeon.hero && !enemy.isAlive()) {
|
||||
Dungeon.fail( getClass() );
|
||||
GLog.n( Messages.capitalize(Messages.get(Char.class, "kill", name())) );
|
||||
}
|
||||
}
|
||||
|
||||
public void onZapComplete() {
|
||||
|
|
|
@ -0,0 +1,247 @@
|
|||
package com.shatteredpixel.shatteredpixeldungeon.actors.mobs.spical;
|
||||
|
||||
import com.shatteredpixel.shatteredpixeldungeon.Challenges;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.Conducts;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.LockedFloor;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Ooze;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Goo;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.effects.Speck;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.GooSprite;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.ui.BossHealthBar;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
|
||||
import com.watabou.noosa.Camera;
|
||||
import com.watabou.utils.Bundle;
|
||||
import com.watabou.utils.Random;
|
||||
|
||||
public class GooMob extends Mob {
|
||||
|
||||
{
|
||||
if (Dungeon.isDLC(Conducts.Conduct.BOSSRUSH)) {
|
||||
HP = HT = 180;
|
||||
} else {
|
||||
HP = HT = Dungeon.isChallenged(Challenges.STRONGER_BOSSES) ? 120 : 100;
|
||||
}
|
||||
|
||||
EXP = 10;
|
||||
defenseSkill = 8;
|
||||
spriteClass = GooSprite.class;
|
||||
|
||||
properties.add(Property.BOSS);
|
||||
properties.add(Property.DEMONIC);
|
||||
properties.add(Property.ACIDIC);
|
||||
}
|
||||
|
||||
private int pumpedUp = 0;
|
||||
private int healInc = 1;
|
||||
|
||||
@Override
|
||||
public int damageRoll() {
|
||||
int min = 1;
|
||||
int max = (HP*2 <= HT) ? 12 : 8;
|
||||
if (pumpedUp > 0) {
|
||||
pumpedUp = 0;
|
||||
return Random.NormalIntRange( min*3, max*3 );
|
||||
} else {
|
||||
return Random.NormalIntRange( min, max );
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int attackSkill( Char target ) {
|
||||
int attack = 10;
|
||||
if (HP*2 <= HT) attack = 15;
|
||||
if (pumpedUp > 0) attack *= 2;
|
||||
return attack;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int defenseSkill(Char enemy) {
|
||||
return (int)(super.defenseSkill(enemy) * ((HP*2 <= HT)? 1.5 : 1));
|
||||
}
|
||||
|
||||
@Override
|
||||
public int drRoll() {
|
||||
return Random.NormalIntRange(0, 2);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean act() {
|
||||
|
||||
if (Dungeon.level.water[pos] && HP < HT) {
|
||||
HP += healInc;
|
||||
|
||||
LockedFloor lock = Dungeon.hero.buff(LockedFloor.class);
|
||||
if (lock != null) lock.removeTime(healInc*2);
|
||||
|
||||
if (Dungeon.level.heroFOV[pos] ){
|
||||
sprite.emitter().burst( Speck.factory( Speck.HEALING ), healInc );
|
||||
}
|
||||
if (Dungeon.isChallenged(Challenges.STRONGER_BOSSES) && healInc < 3) {
|
||||
healInc++;
|
||||
}
|
||||
if (HP*2 > HT) {
|
||||
BossHealthBar.bleed(false);
|
||||
((GooSprite)sprite).spray(false);
|
||||
HP = Math.min(HP, HT);
|
||||
}
|
||||
} else {
|
||||
healInc = 1;
|
||||
}
|
||||
|
||||
return super.act();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean canAttack( Char enemy ) {
|
||||
if (pumpedUp > 0){
|
||||
//we check both from and to in this case as projectile logic isn't always symmetrical.
|
||||
//this helps trim out BS edge-cases
|
||||
return Dungeon.level.distance(enemy.pos, pos) <= 2
|
||||
&& new Ballistica( pos, enemy.pos, Ballistica.PROJECTILE).collisionPos == enemy.pos
|
||||
&& new Ballistica( enemy.pos, pos, Ballistica.PROJECTILE).collisionPos == pos;
|
||||
} else {
|
||||
return super.canAttack(enemy);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int attackProc( Char enemy, int damage ) {
|
||||
damage = super.attackProc( enemy, damage );
|
||||
if (Random.Int( 3 ) == 0) {
|
||||
Buff.affect( enemy, Ooze.class ).set( Ooze.DURATION );
|
||||
enemy.sprite.burst( 0x000000, 5 );
|
||||
}
|
||||
|
||||
if (pumpedUp > 0) {
|
||||
Camera.main.shake( 3, 0.2f );
|
||||
}
|
||||
|
||||
return damage;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateSpriteState() {
|
||||
super.updateSpriteState();
|
||||
|
||||
if (pumpedUp > 0){
|
||||
((GooSprite)sprite).pumpUp( pumpedUp );
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean doAttack( Char enemy ) {
|
||||
if (pumpedUp == 1) {
|
||||
pumpedUp++;
|
||||
((GooSprite)sprite).pumpUp( pumpedUp );
|
||||
|
||||
spend( attackDelay() );
|
||||
|
||||
return true;
|
||||
} else if (pumpedUp >= 2 || Random.Int( (HP*2 <= HT) ? 2 : 5 ) > 0) {
|
||||
|
||||
boolean visible = Dungeon.level.heroFOV[pos];
|
||||
|
||||
if (visible) {
|
||||
if (pumpedUp >= 2) {
|
||||
((GooSprite) sprite).pumpAttack();
|
||||
} else {
|
||||
sprite.attack(enemy.pos);
|
||||
}
|
||||
} else {
|
||||
if (pumpedUp >= 2){
|
||||
((GooSprite)sprite).triggerEmitters();
|
||||
}
|
||||
attack( enemy );
|
||||
spend( attackDelay() );
|
||||
}
|
||||
|
||||
return !visible;
|
||||
|
||||
} else {
|
||||
|
||||
pumpedUp++;
|
||||
if (Dungeon.isChallenged(Challenges.STRONGER_BOSSES)){
|
||||
pumpedUp++;
|
||||
}
|
||||
|
||||
((GooSprite)sprite).pumpUp( pumpedUp );
|
||||
|
||||
if (Dungeon.level.heroFOV[pos]) {
|
||||
sprite.showStatus( CharSprite.NEGATIVE, Messages.get(Goo.class, "!!!") );
|
||||
GLog.n( Messages.get(Goo.class, "pumpup") );
|
||||
}
|
||||
|
||||
spend( attackDelay() );
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean attack( Char enemy, float dmgMulti, float dmgBonus, float accMulti ) {
|
||||
boolean result = super.attack( enemy, dmgMulti, dmgBonus, accMulti );
|
||||
pumpedUp = 0;
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean getCloser( int target ) {
|
||||
if (pumpedUp != 0) {
|
||||
pumpedUp = 0;
|
||||
sprite.idle();
|
||||
}
|
||||
return super.getCloser( target );
|
||||
}
|
||||
|
||||
@Override
|
||||
public void damage(int dmg, Object src) {
|
||||
boolean bleeding = (HP*2 <= HT);
|
||||
super.damage(dmg, src);
|
||||
if ((HP*2 <= HT) && !bleeding){
|
||||
sprite.showStatus(CharSprite.NEGATIVE, Messages.get(Goo.class, "enraged"));
|
||||
((GooSprite)sprite).spray(true);
|
||||
yell(Messages.get(Goo.class, "gluuurp"));
|
||||
}
|
||||
LockedFloor lock = Dungeon.hero.buff(LockedFloor.class);
|
||||
if (lock != null) lock.addTime(dmg*2);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void die( Object cause ) {
|
||||
super.die( cause );
|
||||
}
|
||||
|
||||
private final String PUMPEDUP = "pumpedup";
|
||||
private final String HEALINC = "healinc";
|
||||
|
||||
@Override
|
||||
public void storeInBundle( Bundle bundle ) {
|
||||
|
||||
super.storeInBundle( bundle );
|
||||
|
||||
bundle.put( PUMPEDUP , pumpedUp );
|
||||
bundle.put( HEALINC, healInc );
|
||||
}
|
||||
|
||||
@Override
|
||||
public void restoreFromBundle( Bundle bundle ) {
|
||||
|
||||
super.restoreFromBundle( bundle );
|
||||
|
||||
pumpedUp = bundle.getInt( PUMPEDUP );
|
||||
if (state != SLEEPING) BossHealthBar.assignBoss(this);
|
||||
if ((HP*2 <= HT)) BossHealthBar.bleed(true);
|
||||
|
||||
//if check is for pre-0.9.3 saves
|
||||
healInc = bundle.getInt(HEALINC);
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,319 @@
|
|||
package com.shatteredpixel.shatteredpixeldungeon.actors.mobs.spical;
|
||||
|
||||
import com.shatteredpixel.shatteredpixeldungeon.Assets;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.Conducts;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Blindness;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Cripple;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Degrade;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.CausticSlime;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.ColdMagicRat;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Crab;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Rat;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Slime;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.SlimeKing;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Swarm;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.effects.Chains;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.effects.Pushing;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.Item;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.levels.traps.SummoningTrap;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.SlimeKingSprite;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
|
||||
import com.watabou.noosa.audio.Sample;
|
||||
import com.watabou.utils.Bundle;
|
||||
import com.watabou.utils.Callback;
|
||||
import com.watabou.utils.Random;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
public class SlimeKingMob extends Mob {
|
||||
|
||||
private final String[] attackCurse = {"雕虫小技", "班门弄斧",
|
||||
"GAMEOVER"};
|
||||
private int combo = 0;
|
||||
private static final float TIME_TO_ZAP = 0.5f;
|
||||
|
||||
private boolean PartCold = false;
|
||||
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public int defenseProc(Char enemy, int damage ) {
|
||||
|
||||
if (HP >= damage + 2) {
|
||||
ArrayList<Integer> candidates = new ArrayList<>();
|
||||
|
||||
int[] neighbours = {pos + 1, pos - 1, pos + Dungeon.level.width(), pos - Dungeon.level.width()};
|
||||
for (int n : neighbours) {
|
||||
if (!Dungeon.level.solid[n] && Actor.findChar( n ) == null
|
||||
&& (!properties().contains(Property.LARGE) || Dungeon.level.openSpace[n])) {
|
||||
candidates.add( n );
|
||||
}
|
||||
}
|
||||
|
||||
if (candidates.size() > 0 && HP < 60 && Random.Float() < 0.45f) {
|
||||
CausticSlime mini = new CausticSlime();
|
||||
mini.pos = this.pos;
|
||||
mini.state = mini.HUNTING;
|
||||
mini.HP /= 4;
|
||||
mini.maxLvl = -5;
|
||||
Dungeon.level.occupyCell(mini);
|
||||
GameScene.add( mini , 0f );
|
||||
Actor.addDelayed( new Pushing( mini, pos, mini.pos ), -1 );
|
||||
}
|
||||
}
|
||||
|
||||
return super.defenseProc(enemy, damage);
|
||||
}
|
||||
|
||||
|
||||
private static final String partcold = "partcold";
|
||||
private static final String chainsused = "chainsused";
|
||||
|
||||
@Override
|
||||
public void storeInBundle(Bundle bundle) {
|
||||
super.storeInBundle(bundle);
|
||||
bundle.put(partcold, PartCold);
|
||||
bundle.put(chainsused, chainsUsed);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void restoreFromBundle(Bundle bundle) {
|
||||
super.restoreFromBundle(bundle);
|
||||
PartCold = bundle.getBoolean(partcold);
|
||||
chainsUsed = bundle.getBoolean(chainsused);
|
||||
}
|
||||
|
||||
{
|
||||
if (Dungeon.isDLC(Conducts.Conduct.BOSSRUSH)) {
|
||||
HP =190;
|
||||
HT= 190;
|
||||
|
||||
} else {
|
||||
HP =140;
|
||||
HT= 140;
|
||||
}
|
||||
|
||||
EXP = 20;
|
||||
defenseSkill = 12;
|
||||
spriteClass = SlimeKingSprite.class;
|
||||
lootChance = 1;
|
||||
HUNTING = new Hunting();
|
||||
properties.add(Property.BOSS);
|
||||
baseSpeed = 0.4f;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean act() {
|
||||
|
||||
if(HP < 70 && !PartCold){
|
||||
baseSpeed = 1f;
|
||||
SummoningTrap var4 = new SummoningTrap();
|
||||
var4.pos = super.pos;
|
||||
var4.activate();
|
||||
PartCold = true;
|
||||
chainsUsed = true;
|
||||
GLog.n(Messages.get(SlimeKing.class,"fuck"));
|
||||
} else if (HP < 70) {
|
||||
baseSpeed = 1f;
|
||||
}
|
||||
|
||||
return super.act();
|
||||
}
|
||||
|
||||
private void zap() {
|
||||
spend( TIME_TO_ZAP );
|
||||
|
||||
if (hit( this, enemy, true )) {
|
||||
//TODO would be nice for this to work on ghost/statues too
|
||||
if (Random.Int( 2 ) == 0) {
|
||||
Buff.prolong( enemy, Blindness.class, Degrade.DURATION );
|
||||
Sample.INSTANCE.play( Assets.Sounds.DEBUFF );
|
||||
}
|
||||
|
||||
int dmg = Random.NormalIntRange( 2, 4 );
|
||||
enemy.damage( dmg, new ColdMagicRat.DarkBolt() );
|
||||
|
||||
if (enemy == Dungeon.hero && !enemy.isAlive()) {
|
||||
Dungeon.fail( getClass() );
|
||||
GLog.n( Messages.get(SlimeKing.class, "frost_kill") );
|
||||
}
|
||||
} else {
|
||||
enemy.sprite.showStatus( CharSprite.NEUTRAL, enemy.defenseVerb() );
|
||||
}
|
||||
}
|
||||
|
||||
protected boolean doAttack( Char enemy ) {
|
||||
|
||||
if (Dungeon.level.adjacent( pos, enemy.pos )) {
|
||||
|
||||
return super.doAttack( enemy );
|
||||
|
||||
} else {
|
||||
|
||||
if (sprite != null && (sprite.visible || enemy.sprite.visible)) {
|
||||
sprite.zap( enemy.pos );
|
||||
return false;
|
||||
} else {
|
||||
zap();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void onZapComplete() {
|
||||
zap();
|
||||
next();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int damageRoll() {
|
||||
if(HP < 70 && Random.Float() > 0.10f) {
|
||||
return Random.NormalIntRange(8, 12);
|
||||
} else {
|
||||
return Random.NormalIntRange(4, 6);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int attackSkill( Char target ) {
|
||||
return 12;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int attackProc(Char enemy, int damage) {
|
||||
if (Random.Int(0, 10) > 7) {
|
||||
this.sprite.showStatus(0x009999, this.attackCurse[Random.Int(this.attackCurse.length)]);
|
||||
}
|
||||
int damage2 = super.attackProc(enemy, this.combo + damage);
|
||||
this.combo++;
|
||||
// int effect = Random.Int(3);
|
||||
//// if (enemy.buff(Poison.class) == null && Random.Float() <= 0.25f) {
|
||||
//// Buff.affect( enemy, Poison.class).set((effect-2) );
|
||||
//// }
|
||||
if (this.combo > 3) {
|
||||
this.combo = 1;
|
||||
}
|
||||
return damage2;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int drRoll() {
|
||||
if(HP < 70 && !PartCold) {
|
||||
return 0;
|
||||
} else {
|
||||
return 5;
|
||||
}
|
||||
}
|
||||
|
||||
private boolean chainsUsed = false;
|
||||
private boolean chain(int target){
|
||||
if (chainsUsed || enemy.properties().contains(Property.IMMOVABLE))
|
||||
return false;
|
||||
|
||||
Ballistica chain = new Ballistica(pos, target, Ballistica.PROJECTILE);
|
||||
|
||||
if (chain.collisionPos != enemy.pos
|
||||
|| chain.path.size() < 2
|
||||
|| Dungeon.level.pit[chain.path.get(1)])
|
||||
return false;
|
||||
else {
|
||||
int newPos;
|
||||
newPos = -1;
|
||||
for (int i : chain.subPath(1, chain.dist)){
|
||||
if (!Dungeon.level.solid[i] && Actor.findChar(i) == null){
|
||||
newPos = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (newPos == 0){
|
||||
return false;
|
||||
} else {
|
||||
final int newPosFinal = newPos;
|
||||
this.target = newPos;
|
||||
|
||||
if (sprite.visible) {
|
||||
yell(Messages.get(SlimeKing.class, "scorpion"));
|
||||
new Item().throwSound();
|
||||
Sample.INSTANCE.play(Assets.Sounds.CHAINS);
|
||||
sprite.parent.add(new Chains(sprite.center(), enemy.sprite.destinationCenter(), new Callback() {
|
||||
public void call() {
|
||||
Actor.addDelayed(new Pushing(enemy, enemy.pos, newPosFinal, new Callback() {
|
||||
public void call() {
|
||||
pullEnemy(enemy, newPosFinal);
|
||||
}
|
||||
}), -1);
|
||||
next();
|
||||
}
|
||||
}));
|
||||
} else {
|
||||
pullEnemy(enemy, newPos);
|
||||
}
|
||||
}
|
||||
}
|
||||
chainsUsed = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
private void pullEnemy( Char enemy, int pullPos ){
|
||||
enemy.pos = pullPos;
|
||||
enemy.sprite.place(pullPos);
|
||||
Dungeon.level.occupyCell(enemy);
|
||||
Cripple.prolong(enemy, Cripple.class, 4f);
|
||||
if (enemy == Dungeon.hero) {
|
||||
Dungeon.hero.interrupt();
|
||||
Dungeon.observe();
|
||||
GameScene.updateFog();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void move( int step ) {
|
||||
super.move( step );
|
||||
}
|
||||
|
||||
@Override
|
||||
public void die( Object cause ) {
|
||||
super.die( cause );
|
||||
for (Mob mob : Dungeon.level.mobs.toArray(new Mob[0])){
|
||||
if ( mob instanceof Swarm ||
|
||||
mob instanceof Crab ||
|
||||
mob instanceof Rat ||
|
||||
mob instanceof Slime) {
|
||||
mob.die( cause );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private class Hunting extends Mob.Hunting{
|
||||
@Override
|
||||
public boolean act( boolean enemyInFOV, boolean justAlerted ) {
|
||||
enemySeen = enemyInFOV;
|
||||
|
||||
if (!chainsUsed
|
||||
&& enemyInFOV
|
||||
&& !isCharmedBy( enemy )
|
||||
&& !canAttack( enemy )
|
||||
&& Dungeon.level.distance( pos, enemy.pos ) < 5
|
||||
|
||||
|
||||
&& chain(enemy.pos)){
|
||||
return !(sprite.visible || enemy.sprite.visible);
|
||||
} else {
|
||||
return super.act( enemyInFOV, justAlerted );
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,12 +1,14 @@
|
|||
package com.shatteredpixel.shatteredpixeldungeon.custom.dict;
|
||||
|
||||
import com.shatteredpixel.shatteredpixeldungeon.Assets;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.BombGnollTricksterSprites;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.BruteBotSprite;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.ClearElementalSprites;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.ColdGuardSprite;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.ColdRatSprite;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.FireAcidicSprite;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.FlameBoiSprite;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.FlameC01Sprite;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.GooSprite;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.IceFireScorpioSprite;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.IceGolemSprite;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSprite;
|
||||
|
@ -24,6 +26,8 @@ import com.shatteredpixel.shatteredpixeldungeon.sprites.SRPDICLRTT;
|
|||
import com.shatteredpixel.shatteredpixeldungeon.sprites.STenguSprite;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.SalamanderSprites;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.ShieldHuntsmanSprite;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.SkullShamanSprite;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.SlimeKingSprite;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.SpectralNecromancerSprite;
|
||||
import com.watabou.noosa.Image;
|
||||
|
||||
|
@ -80,7 +84,15 @@ public class DictSpriteSheet {
|
|||
case MOLO:
|
||||
return new MolotovHuntsmanSprite();
|
||||
case FLAME:
|
||||
return new FlameBoiSprite();
|
||||
return new SlimeKingSprite();
|
||||
case FLAMEC01:
|
||||
return new FlameC01Sprite();
|
||||
case GnollK:
|
||||
return new BombGnollTricksterSprites();
|
||||
case GnollF:
|
||||
return new SkullShamanSprite();
|
||||
case Goo:
|
||||
return new GooSprite();
|
||||
case GNOLL:
|
||||
return new Image(Assets.Sprites.GNOLL, 0, 0, 12, 15);
|
||||
case STX:
|
||||
|
@ -304,6 +316,14 @@ public class DictSpriteSheet {
|
|||
public static final int CAX = 228 + 10000;
|
||||
public static final int IAS = 229 + 10000;
|
||||
|
||||
public static final int FLAMEC01 = 330 + 10000;
|
||||
|
||||
public static final int GnollK = 331 + 10000;
|
||||
|
||||
public static final int GnollF = 332 + 10000;
|
||||
|
||||
public static final int Goo = 333 + 10000;
|
||||
|
||||
public static final int BRTX = 230 + 10000;
|
||||
public static final int GOO = 231 + 10000;
|
||||
public static final int GKS = 232 + 10000;
|
||||
|
|
|
@ -28,9 +28,10 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Elemental;
|
|||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Eye;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.FetidRat;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Fire_Scorpio;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.FlameB01;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.FlameC01;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Ghoul;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Gnoll;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.GnollShiled;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.GnollTrickster;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Golem;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.GreatCrab;
|
||||
|
@ -60,6 +61,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Senior;
|
|||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Shaman;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.ShieldHuntsman;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Skeleton;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.SkullShaman;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Slime;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Snake;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.SpectralNecromancer;
|
||||
|
@ -71,6 +73,8 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Thief;
|
|||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Warlock;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Wraith;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.XTG200;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.spical.GooMob;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.spical.SlimeKingMob;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.custom.dict.DictSpriteSheet;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.custom.messages.M;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfTeleportation;
|
||||
|
@ -82,6 +86,7 @@ import com.shatteredpixel.shatteredpixeldungeon.scenes.PixelScene;
|
|||
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.ui.CheckBox;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.ui.IconButton;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.ui.OptionSlider;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.ui.RedButton;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.ui.RenderedTextBlock;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.ui.Window;
|
||||
|
@ -105,6 +110,9 @@ public class MobPlacer extends TestItem{
|
|||
private int mobTier = 1;
|
||||
private int mobIndex = 0;
|
||||
private int elite = 0;
|
||||
|
||||
private int HT = 1;
|
||||
private int ST = 1;
|
||||
private int elite_op = 0;
|
||||
|
||||
private final ArrayList<Class<? extends ChampionEnemy>> eliteBuffs = new ArrayList<>();
|
||||
|
@ -117,7 +125,7 @@ public class MobPlacer extends TestItem{
|
|||
eliteBuffs.add(ChampionEnemy.Projecting.class);
|
||||
eliteBuffs.add(ChampionEnemy.Halo.class);
|
||||
eliteBuffs.add(ChampionEnemy.DelayMob.class);
|
||||
eliteBuffs.add(WandOfAnmy.AllyToRestartOK.class);
|
||||
eliteBuffs.add(ChampionEnemy.King.class);
|
||||
|
||||
eliteBuffs.add(ChampionEnemy.Small.class);
|
||||
eliteBuffs.add(ChampionEnemy.Bomber.class);
|
||||
|
@ -126,6 +134,7 @@ public class MobPlacer extends TestItem{
|
|||
eliteBuffs.add(ChampionEnemy.Sider.class);
|
||||
eliteBuffs.add(ChampionEnemy.LongSider.class);
|
||||
|
||||
eliteBuffs.add(WandOfAnmy.AllyToRestartOK.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -148,9 +157,15 @@ public class MobPlacer extends TestItem{
|
|||
try {
|
||||
Mob m = Reflection.newInstance(allData.get(dataThreshold(mobTier) + mobIndex).mobClass);
|
||||
m.pos = cell;
|
||||
m.state = m.HUNTING;
|
||||
GameScene.add(m);
|
||||
|
||||
if(HT>1){
|
||||
m.HT = m.HP = (m.HT*HT);
|
||||
}
|
||||
|
||||
if(elite_op>0){
|
||||
for(int i=0;i<15;++i){
|
||||
for(int i=0;i<16;++i){
|
||||
if((elite_op & (1<<i))>0){
|
||||
Buff.affect(m, eliteBuffs.get(i));
|
||||
}
|
||||
|
@ -222,6 +237,8 @@ public class MobPlacer extends TestItem{
|
|||
b.put("mobTier", mobTier);
|
||||
b.put("mobIndex", mobIndex);
|
||||
b.put("eliteTags", elite);
|
||||
b.put("htTags", HT);
|
||||
b.put("stTags", ST);
|
||||
b.put("elite_ops", elite_op);
|
||||
}
|
||||
|
||||
|
@ -231,6 +248,8 @@ public class MobPlacer extends TestItem{
|
|||
mobTier = b.getInt("mobTier");
|
||||
mobIndex = b.getInt("mobIndex");
|
||||
elite = b.getInt("eliteTags");
|
||||
HT = b.getInt("htTags");
|
||||
ST = b.getInt("stTags");
|
||||
elite_op = b.getInt("elite_ops");
|
||||
}
|
||||
|
||||
|
@ -238,14 +257,14 @@ public class MobPlacer extends TestItem{
|
|||
private class WndSetMob extends Window{
|
||||
|
||||
private static final int WIDTH = 150;
|
||||
private static final int HEIGHT = 150;
|
||||
private static final int HEIGHT = 180;
|
||||
private static final int BTN_SIZE = 18;
|
||||
private static final int GAP = 2;
|
||||
|
||||
private RenderedTextBlock selectedPage;
|
||||
private ArrayList<IconButton> mobButtons = new ArrayList<>();
|
||||
private RenderedTextBlock selectedMob;
|
||||
private ArrayList<CheckBox> eliteOptions = new ArrayList<>(15);
|
||||
private ArrayList<CheckBox> eliteOptions = new ArrayList<>(16);
|
||||
|
||||
public WndSetMob(){
|
||||
super();
|
||||
|
@ -290,22 +309,10 @@ public class MobPlacer extends TestItem{
|
|||
selectedMob.hardlight(0xFFFF44);
|
||||
PixelScene.align(selectedMob);
|
||||
add(selectedMob);
|
||||
/*
|
||||
OptionSlider op = new OptionSlider
|
||||
(M.L(MobPlacer.class, "elite"), "0", String.valueOf(MAX_ELITE), 0, MAX_ELITE) {
|
||||
@Override
|
||||
protected void onChange() {
|
||||
elite = getSelectedValue();
|
||||
}
|
||||
};
|
||||
op.setRect(GAP, 92, WIDTH - 2*GAP, 24);
|
||||
op.setSelectedValue(elite);
|
||||
add(op);
|
||||
|
||||
*/
|
||||
float pos = 92;
|
||||
float pos = 96;
|
||||
int column = 0;
|
||||
for (int i = 0; i < 15 && column < 3; ++i) {
|
||||
for (int i = 0; i < 16 && column < 3; ++i) {
|
||||
CheckBox cb = new CheckBox(M.L(MobPlacer.class, "elite_name" + i));
|
||||
cb.active = true;
|
||||
cb.checked((elite_op & (1<<i))>0);
|
||||
|
@ -322,10 +329,31 @@ public class MobPlacer extends TestItem{
|
|||
pos += 16 + GAP; // 换行
|
||||
}
|
||||
|
||||
if(i==15){
|
||||
cb.setRect(WIDTH/2f+GAP, 78, (WIDTH/2f - GAP), 16);
|
||||
}
|
||||
|
||||
OptionSlider op = new OptionSlider
|
||||
("_修改血量_","1x","6x",1,6) {
|
||||
@Override
|
||||
public int getTitleTextSize(){
|
||||
return 6;
|
||||
}
|
||||
@Override
|
||||
protected void onChange() {
|
||||
HT = getSelectedValue();
|
||||
}
|
||||
};
|
||||
op.setRect((WIDTH/3f)/6f-8, 78, (WIDTH/2f - GAP), 16);
|
||||
op.setSelectedValue(HT);
|
||||
add(op);
|
||||
|
||||
column++;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
createMobImage();
|
||||
|
||||
updateSelectedMob();
|
||||
|
@ -334,7 +362,7 @@ public class MobPlacer extends TestItem{
|
|||
|
||||
private void updateEliteSettings(){
|
||||
int el = 0;
|
||||
for(int i=0;i<15;++i){
|
||||
for(int i=0;i<16;++i){
|
||||
el += eliteOptions.get(i).checked() ? (1<<i) : 0;
|
||||
}
|
||||
elite_op = el;
|
||||
|
@ -360,7 +388,7 @@ public class MobPlacer extends TestItem{
|
|||
selectedPage.maxWidth(WIDTH / 2);
|
||||
selectedPage.setPos((WIDTH - selectedPage.width())/2, 5);
|
||||
selectedMob.maxWidth(WIDTH);
|
||||
selectedMob.setPos((WIDTH - selectedMob.width())/2, 80);
|
||||
selectedMob.setPos((WIDTH - selectedMob.width())/2, 16);
|
||||
resize(WIDTH, (int)eliteOptions.get(14).bottom() + 1);
|
||||
}
|
||||
|
||||
|
@ -484,7 +512,13 @@ public class MobPlacer extends TestItem{
|
|||
BLACK(BlackHost.class, DictSpriteSheet.BLACK),
|
||||
HBLR(SRPDHBLR.class, DictSpriteSheet.HBLR),
|
||||
MOlO(MolotovHuntsman.class, DictSpriteSheet.MOLO),
|
||||
Flame(FlameB01.class, DictSpriteSheet.FLAME),
|
||||
|
||||
GnollK(GnollShiled.class, DictSpriteSheet.GnollK),
|
||||
GnollF(SkullShaman.class, DictSpriteSheet.GnollF),
|
||||
FlameC(FlameC01.class, DictSpriteSheet.FLAMEC01),
|
||||
Good_VI50(GooMob.class, DictSpriteSheet.Goo),
|
||||
|
||||
Flame(SlimeKingMob.class, DictSpriteSheet.FLAME),
|
||||
NQHZ(OGPDNQHZ.class, DictSpriteSheet.OGPDNQHZ),
|
||||
|
||||
CLEARS(ClearElemental.class, DictSpriteSheet.CLEARS),
|
||||
|
|
|
@ -24,6 +24,7 @@ package com.shatteredpixel.shatteredpixeldungeon.items.bags;
|
|||
import com.shatteredpixel.shatteredpixeldungeon.items.Item;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.bombs.Bomb;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.wands.Wand;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfAnmy;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.MissileWeapon;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
|
||||
|
||||
|
@ -38,7 +39,7 @@ public class MagicalHolster extends Bag {
|
|||
|
||||
@Override
|
||||
public boolean canHold( Item item ) {
|
||||
if (item instanceof Wand || item instanceof MissileWeapon || item instanceof Bomb){
|
||||
if (item instanceof Wand && !(item instanceof WandOfAnmy) || item instanceof MissileWeapon || item instanceof Bomb ){
|
||||
return super.canHold(item);
|
||||
} else {
|
||||
return false;
|
||||
|
|
|
@ -1,9 +1,7 @@
|
|||
package com.shatteredpixel.shatteredpixeldungeon.items.wands;
|
||||
|
||||
import com.shatteredpixel.shatteredpixeldungeon.Assets;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.Badges;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.Statistics;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Fire;
|
||||
|
@ -12,7 +10,6 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
|
|||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ChampionEnemy;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.PinCushion;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.effects.MagicMissile;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.Heap;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.MagesStaff;
|
||||
|
@ -69,25 +66,7 @@ public class WandOfAnmy extends DamageWand {
|
|||
}
|
||||
}
|
||||
|
||||
//for when applying an ally buff should also cause that enemy to give exp/loot as if they had died
|
||||
//consider that chars with the ally alignment do not drop items or award exp on death
|
||||
public static void affectAndLoot(Mob enemy, Hero hero, Class<?extends AllyBuff> buffCls){
|
||||
boolean droppingLoot = enemy.alignment != Char.Alignment.ALLY;
|
||||
Buff.affect(enemy, buffCls);
|
||||
|
||||
if (enemy.buff(buffCls) != null){
|
||||
if (droppingLoot) enemy.rollToDropLoot();
|
||||
Statistics.enemiesSlain++;
|
||||
Badges.validateMonstersSlain();
|
||||
Statistics.qualifiedForNoKilling = false;
|
||||
if (enemy.EXP > 0 && hero.lvl <= enemy.maxLvl) {
|
||||
hero.sprite.showStatus(CharSprite.POSITIVE, Messages.get(enemy, "exp", enemy.EXP));
|
||||
hero.earnExp(enemy.EXP, enemy.getClass());
|
||||
} else {
|
||||
hero.earnExp(0, enemy.getClass());
|
||||
}
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public String toString() {
|
||||
return Messages.get(AllyToRestart.class, "name");
|
||||
|
@ -101,11 +80,11 @@ public class WandOfAnmy extends DamageWand {
|
|||
@Override
|
||||
public void fx(boolean on) {
|
||||
if (on) {
|
||||
target.sprite.add(CharSprite.State.SHIELDED);
|
||||
target.sprite.add(CharSprite.State.HEARTS);
|
||||
//Statistics.TryUsedAnmy = true;
|
||||
}
|
||||
else
|
||||
target.sprite.remove(CharSprite.State.SHIELDED);
|
||||
target.sprite.remove(CharSprite.State.HEARTS);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -133,11 +112,11 @@ public class WandOfAnmy extends DamageWand {
|
|||
@Override
|
||||
public void fx(boolean on) {
|
||||
if (on) {
|
||||
target.sprite.add(CharSprite.State.SHIELDED);
|
||||
target.sprite.add(CharSprite.State.HEARTS);
|
||||
//Statistics.TryUsedAnmy = true;
|
||||
}
|
||||
else
|
||||
target.sprite.remove(CharSprite.State.SHIELDED);
|
||||
target.sprite.remove(CharSprite.State.HEARTS);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -1,6 +1,9 @@
|
|||
package com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.legend;
|
||||
|
||||
import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.hero;
|
||||
|
||||
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;
|
||||
|
@ -9,7 +12,6 @@ import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter;
|
|||
import com.shatteredpixel.shatteredpixeldungeon.effects.Splash;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.BlastParticle;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.SmokeParticle;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.bombs.Bomb;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.SpiritBow;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.darts.TippedDart;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica;
|
||||
|
@ -38,7 +40,7 @@ public class DiedCrossBow extends LegendWeapon {
|
|||
baseMax = 20;
|
||||
min = Lmin();
|
||||
max = Lmax();
|
||||
usesTargeting = true;
|
||||
usesTargeting = cooldown == 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -46,6 +48,10 @@ public class DiedCrossBow extends LegendWeapon {
|
|||
return new DiedCrossBow.Recharge();
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
|
||||
public class Recharge extends LegendWeapon.LegendWeaponBuff {
|
||||
@Override
|
||||
public boolean act() {
|
||||
|
@ -142,7 +148,7 @@ public class DiedCrossBow extends LegendWeapon {
|
|||
|
||||
@Override
|
||||
public int proc(Char attacker, Char defender, int damage) {
|
||||
DiedCrossBow dartGun = Dungeon.hero.belongings.getItem(DiedCrossBow.class);
|
||||
DiedCrossBow dartGun = hero.belongings.getItem(DiedCrossBow.class);
|
||||
damage = Random.NormalIntRange(dartGun.Lmin(), dartGun.Lmax());
|
||||
this.explodeBomb(defender.pos);
|
||||
|
||||
|
@ -207,7 +213,7 @@ public class DiedCrossBow extends LegendWeapon {
|
|||
continue;
|
||||
}
|
||||
|
||||
DiedCrossBow diedCrossBow = Dungeon.hero.belongings.getItem(DiedCrossBow.class);
|
||||
DiedCrossBow diedCrossBow = hero.belongings.getItem(DiedCrossBow.class);
|
||||
int dmg = Random.NormalIntRange(diedCrossBow.Lmin(),diedCrossBow.Lmin());
|
||||
|
||||
//those not at the center of the blast take less damage
|
||||
|
@ -221,8 +227,10 @@ public class DiedCrossBow extends LegendWeapon {
|
|||
ch.damage(dmg, this);
|
||||
}
|
||||
|
||||
if (ch == Dungeon.hero && !ch.isAlive()) {
|
||||
Dungeon.fail(Bomb.class);
|
||||
if (ch == hero && !ch.isAlive()) {
|
||||
Badges.BOMB();
|
||||
Dungeon.fail( getClass() );
|
||||
GLog.n( Messages.get(DiedCrossBow.class, "ondeath") );
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -117,7 +117,8 @@ public abstract class LegendWeapon extends MeleeWeapon {
|
|||
return Messages.get(LegendWeapon.class, "stats_desc", legend, Messages.get(this, "king_desc"), Lmin(),
|
||||
Lmax());
|
||||
} else {
|
||||
return Messages.get(LegendWeapon.class, "typical_stats_desc", 9);
|
||||
return Messages.get(LegendWeapon.class, "typical_stats_desc",legend, 9,Lmin(),
|
||||
Lmax());
|
||||
}
|
||||
} else {
|
||||
return "";
|
||||
|
|
|
@ -3,6 +3,7 @@ package com.shatteredpixel.shatteredpixeldungeon.levels;
|
|||
import com.shatteredpixel.shatteredpixeldungeon.Assets;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.tiles.CustomTilemap;
|
||||
import com.watabou.noosa.Tilemap;
|
||||
|
||||
/***
|
||||
* TODO LIST
|
||||
* 熔岩地块-【5层-EX子层】-火龙巢穴
|
||||
|
@ -74,6 +75,8 @@ public class LaveCavesBossLevel extends Level{
|
|||
|
||||
private static final short Y = Terrain.EMPTY;
|
||||
|
||||
private static final short V = Terrain.EMPTY_SP;
|
||||
|
||||
private static final short X = Terrain.ENTRANCE;
|
||||
|
||||
private static final short G = Terrain.HIGH_GRASS;
|
||||
|
@ -83,16 +86,16 @@ public class LaveCavesBossLevel extends Level{
|
|||
private static final short L= Terrain.PEDESTAL;
|
||||
private static final int[] codedMap = {
|
||||
W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,
|
||||
W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,Y,Y,W,W,W,W,W,W,W,
|
||||
W,W,W,W,W,W,W,W,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,Y,Y,W,W,W,W,W,W,W,
|
||||
W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,Y,W,W,W,W,W,W,W,
|
||||
W,W,W,W,W,W,W,W,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,W,W,W,W,W,W,W,W,W,
|
||||
W,W,W,W,W,W,R,R,R,R,R,R,R,R,R,R,R,R,R,R,Y,R,R,R,R,W,W,W,W,W,W,W,
|
||||
W,W,W,W,R,R,R,R,R,R,R,R,R,R,Y,Y,R,R,Y,R,R,R,R,R,Y,W,W,W,W,W,W,W,
|
||||
W,W,W,R,R,R,R,R,R,R,R,R,R,Y,G,Y,Y,Y,Y,R,R,R,R,Y,R,W,W,W,W,W,W,W,
|
||||
W,W,W,R,R,R,R,R,R,R,R,R,Y,Y,Y,Y,Y,Y,Y,Y,R,R,R,R,R,W,W,W,W,W,W,W,
|
||||
W,W,R,R,R,R,R,R,R,R,R,R,Y,Y,Y,Y,Y,R,R,Y,Y,R,R,R,Y,R,W,W,W,W,W,W,
|
||||
W,W,R,R,R,R,R,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,R,R,R,Y,Y,Y,Y,Y,Y,R,R,W,W,W,W,
|
||||
W,W,R,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,R,R,R,Y,Y,Y,Y,Y,R,R,R,Y,Y,W,W,
|
||||
W,R,Y,Y,Y,Y,R,R,Y,Y,Y,Y,Y,Y,L,Y,Y,Y,R,R,Y,Y,Y,Y,Y,R,R,R,Y,Y,W,W,
|
||||
W,W,R,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,R,R,R,Y,Y,Y,Y,Y,R,R,R,W,W,W,W,
|
||||
W,R,Y,Y,Y,Y,R,R,Y,Y,Y,Y,Y,Y,L,Y,Y,Y,R,R,Y,Y,Y,Y,Y,R,R,R,W,W,W,W,
|
||||
W,R,Y,R,R,R,R,R,R,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,R,R,R,W,W,
|
||||
W,Y,Y,R,R,R,R,R,R,R,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,R,R,Y,R,R,Y,Y,R,R,W,W,
|
||||
W,Y,Y,R,R,R,R,R,R,R,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,R,R,R,R,R,R,Y,Y,R,R,W,W,
|
||||
|
@ -132,7 +135,9 @@ public class LaveCavesBossLevel extends Level{
|
|||
vis.pos(0, 0);
|
||||
customTiles.add(vis);
|
||||
//((GameScene) RPD.scene()).addCustomTile(vis);
|
||||
|
||||
CustomTilemap via = new townAbove();
|
||||
via.pos(0, 0);
|
||||
customTiles.add(via);
|
||||
|
||||
|
||||
buildFlagMaps();
|
||||
|
|
|
@ -59,6 +59,8 @@ public class Terrain {
|
|||
|
||||
public static final int WATER = 29;
|
||||
|
||||
public static final int LAVA = 30;
|
||||
|
||||
public static final int PASSABLE = 0x01;
|
||||
public static final int LOS_BLOCKING = 0x02;
|
||||
public static final int FLAMABLE = 0x04;
|
||||
|
@ -75,6 +77,7 @@ public class Terrain {
|
|||
flags[GRASS] = PASSABLE | FLAMABLE;
|
||||
flags[EMPTY_WELL] = PASSABLE;
|
||||
flags[WATER] = PASSABLE | LIQUID;
|
||||
flags[LAVA] = AVOID | PIT | LIQUID;
|
||||
flags[WALL] = LOS_BLOCKING | SOLID;
|
||||
flags[DOOR] = PASSABLE | LOS_BLOCKING | FLAMABLE | SOLID;
|
||||
flags[OPEN_DOOR] = PASSABLE | FLAMABLE;
|
||||
|
|
|
@ -270,7 +270,7 @@ public class NewsScene extends PixelScene {
|
|||
icon(News.parseArticleIcon(article));
|
||||
long lastRead = SPDSettings.newsLastRead();
|
||||
if (lastRead > 0 && article.date.getTime() > lastRead) {
|
||||
textColor(Window.TITLE_COLOR);
|
||||
textColor(Window.SHPX_COLOR);
|
||||
}
|
||||
|
||||
Calendar cal = Calendar.getInstance();
|
||||
|
@ -325,9 +325,8 @@ public class NewsScene extends PixelScene {
|
|||
ShatteredPixelDungeon.platform.openURI(link);
|
||||
}
|
||||
};
|
||||
link.setRect(0, height + 2, width, BTN_HEIGHT);
|
||||
add(link);
|
||||
resize(width, (int) link.bottom());
|
||||
link.setHeight(BTN_HEIGHT);
|
||||
addToBottom(link);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -92,7 +92,7 @@ public class CharSprite extends MovieClip implements Tweener.Listener, MovieClip
|
|||
|
||||
public enum State {
|
||||
BURNING, LEVITATING, INVISIBLE, PARALYSED, FROZEN, ILLUMINATED, CHILLED, DARKENED, MARKED, HEALING, SHIELDED,
|
||||
ROSESHIELDED,HALOMETHANEBURNING,FROSTBURNING,BUTTER,SPINVISIBLE,SMOKER
|
||||
ROSESHIELDED,HALOMETHANEBURNING,FROSTBURNING,BUTTER,SPINVISIBLE,SMOKER,HEARTS
|
||||
}
|
||||
private int stunStates = 0;
|
||||
|
||||
|
@ -133,7 +133,7 @@ public class CharSprite extends MovieClip implements Tweener.Listener, MovieClip
|
|||
protected Emitter marked;
|
||||
protected Emitter levitation;
|
||||
protected Emitter healing;
|
||||
|
||||
protected Emitter hearts;
|
||||
protected IceBlock iceBlock;
|
||||
protected DarkBlock darkBlock;
|
||||
protected TorchHalo light;
|
||||
|
@ -469,6 +469,10 @@ public class CharSprite extends MovieClip implements Tweener.Listener, MovieClip
|
|||
case ROSESHIELDED:
|
||||
GameScene.effect( roseshield = new RoseHalo( this ));
|
||||
break;
|
||||
case HEARTS:
|
||||
hearts = emitter();
|
||||
hearts.pour(Speck.factory(Speck.HEART), 0.5f);
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -567,6 +571,11 @@ public class CharSprite extends MovieClip implements Tweener.Listener, MovieClip
|
|||
roseshield.putOut();
|
||||
}
|
||||
break;
|
||||
case HEARTS:
|
||||
if (hearts != null){
|
||||
hearts.on = false;
|
||||
hearts = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -600,7 +609,9 @@ public class CharSprite extends MovieClip implements Tweener.Listener, MovieClip
|
|||
if (flashTime > 0 && (flashTime -= Game.elapsed) <= 0) {
|
||||
resetColor();
|
||||
}
|
||||
|
||||
if (hearts != null){
|
||||
hearts.visible = visible;
|
||||
}
|
||||
if (burning != null) {
|
||||
burning.visible = visible;
|
||||
}
|
||||
|
|
|
@ -9,14 +9,14 @@ public class SkullShamanSprite extends MobSprite {
|
|||
this.texture("SRPD/SkullShaman.png");
|
||||
TextureFilm var1 = new TextureFilm(this.texture, 12, 15);
|
||||
this.idle = new Animation(2, true);
|
||||
this.idle.frames(var1, new Object[]{0, 0, 0, 1, 0, 0, 1, 1});
|
||||
this.idle.frames(var1, 0, 0, 0, 1, 0, 0, 1, 1);
|
||||
this.run = new Animation(12, true);
|
||||
this.run.frames(var1, new Object[]{4, 5, 6, 7});
|
||||
this.run.frames(var1, 4, 5, 6, 7);
|
||||
this.attack = new Animation(12, false);
|
||||
this.attack.frames(var1, new Object[]{2, 3, 0});
|
||||
this.attack.frames(var1, 2, 3, 0);
|
||||
this.zap = this.attack.clone();
|
||||
this.die = new Animation(12, false);
|
||||
this.die.frames(var1, new Object[]{8, 9, 10});
|
||||
this.die.frames(var1, 8, 9, 10);
|
||||
this.play(this.idle);
|
||||
}
|
||||
|
||||
|
|
|
@ -49,7 +49,9 @@ public abstract class OptionSlider extends Component {
|
|||
private ColorBlock sliderBG;
|
||||
private ColorBlock[] sliderTicks;
|
||||
private float tickDist;
|
||||
|
||||
public int getTitleTextSize(){
|
||||
return 9;
|
||||
}
|
||||
|
||||
public OptionSlider(String title, String minTxt, String maxTxt, int minVal, int maxVal){
|
||||
super();
|
||||
|
@ -93,7 +95,7 @@ public abstract class OptionSlider extends Component {
|
|||
add( BG = Chrome.get(Chrome.Type.RED_BUTTON));
|
||||
BG.alpha(0.5f);
|
||||
|
||||
add(title = PixelScene.renderTextBlock(9));
|
||||
add(title = PixelScene.renderTextBlock(getTitleTextSize()));
|
||||
add(this.minTxt = PixelScene.renderTextBlock(6));
|
||||
add(this.maxTxt = PixelScene.renderTextBlock(6));
|
||||
|
||||
|
|
|
@ -116,6 +116,12 @@ public class StatusPane extends Component {
|
|||
|
||||
this.large = large;
|
||||
|
||||
if (SPDSettings.ClassUI()) {
|
||||
asset = Assets.Interfaces.STATUS;
|
||||
} else {
|
||||
asset = Assets.Interfaces.STATUS_DARK;
|
||||
}
|
||||
|
||||
if (large) bg = new NinePatch( asset, 0, 64, 41, 39, 33, 0, 4, 0 );
|
||||
else bg = new NinePatch( asset, 0, 0, 128, 36, 85, 0, 45, 0 );
|
||||
add( bg );
|
||||
|
|
|
@ -74,7 +74,7 @@ public class Window extends Group implements Signal.Listener<KeyEvent> {
|
|||
public static final int BLUE_COLOR = 0x0000FF;
|
||||
public static final int CBLACK = 0x808080;
|
||||
|
||||
|
||||
public final void setHeight(int height) { resize(width, height); }
|
||||
public Window() {
|
||||
this( 0, 0, Chrome.get( Chrome.Type.WINDOW ) );
|
||||
}
|
||||
|
|
|
@ -346,7 +346,7 @@ public class S_Changes {
|
|||
changes.addButton( new ChangeButton(new Image(new RatSprite()), "老鼠加强",
|
||||
"老鼠的_攻击和生存能力_都得到了提升"));
|
||||
|
||||
changes.addButton( new ChangeButton(new Image(new SnakeSprite()), "下水道巨蛇加强",
|
||||
changes.addButton( new ChangeButton(new Image(new SnakeSprite()), "密林巨蛇加强",
|
||||
"巨蛇的_攻击和生存能力_都得到了提升"));
|
||||
|
||||
}
|
||||
|
@ -492,7 +492,7 @@ public class S_Changes {
|
|||
changeInfo14.hardlight(16736000);
|
||||
arrayList.add(changeInfo14);
|
||||
changeInfo14.addButton(new ChangeButton(new Image("sprites/spinner.png", 144, 0, 16, 16), "BUG修复", "1.修复_酸蚀法杖_崩溃闪退问题\n\n2.修复_钥匙剑_变量问题[修复者:_Ren_]\n\n3.修复楼层_重置闪退_问题,理论上得到解决"));
|
||||
changeInfo14.addButton(new ChangeButton(new Image("sprites/snake.png", 0, 0, 14, 16), "新怪物", "_下水道巨蛇_\n\n_下水道3层开始刷新_"));
|
||||
changeInfo14.addButton(new ChangeButton(new Image("sprites/snake.png", 0, 0, 14, 16), "新怪物", "_密林巨蛇_\n\n_密林3层开始刷新_"));
|
||||
changeInfo14.addButton(new ChangeButton(new ItemSprite(ItemSpriteSheet.DG6), "新法杖", "幻蓝_焰浪_神杖\n\n这根法杖由_蓝磷元素_制成,饰以_魔紫树叶_这使它看起来相当霸气。它的顶端噼啪作响嘶嘶而鸣,渴望着释放其_强大的魔法。_"));
|
||||
ChangeInfo changeInfo15 = new ChangeInfo("V0.2.5-6", true, "");
|
||||
changeInfo15.hardlight(65535);
|
||||
|
@ -530,7 +530,7 @@ public class S_Changes {
|
|||
changeInfos.add(changes);
|
||||
changes.addButton( new ChangeButton(new Image("SRPD/TorchHuntsman.png", 0, 0, 16, 16), "怪物新改动",
|
||||
"新怪物!!!\n" +
|
||||
"-下水道层:\n-_棕色老鼠_,\n-_灰黑老鼠_,\n-_老年老鼠_,\n(来自OGPD)" +
|
||||
"-密林层:\n-_棕色老鼠_,\n-_灰黑老鼠_,\n-_老年老鼠_,\n(来自OGPD)" +
|
||||
"\n-监狱层:_赏金猎人_\n(来自SRPD)"+
|
||||
"\n-矿洞层:_Flame-B01_\n(来自OGPD)"+
|
||||
"\n后续层数正在开发,敬请期待\n\n"+
|
||||
|
@ -556,7 +556,7 @@ public class S_Changes {
|
|||
changes.addButton( new ChangeButton(new Image(Assets.Environment.TILES_SEWERS, 48, 48, 16
|
||||
, 16), "房间改动",
|
||||
"房间数量得到了调整,具体改动如下表\n" +
|
||||
"-下水道层:房间数量_9个_,默认刷怪数量_20个_,额外刷怪_7个_\n" +
|
||||
"-密林层:房间数量_9个_,默认刷怪数量_20个_,额外刷怪_7个_\n" +
|
||||
"-监狱层:房间数量_8个_,默认刷怪数量_26个_,额外刷怪_11个_\n"+
|
||||
"-矿洞层:房间数量_10个_,默认刷怪数量_30个_,额外刷怪_16个_\n"+
|
||||
"-矮人层:房间数量_12个_,默认刷怪数量_21个_,额外刷怪_6个_\n"+
|
||||
|
|
|
@ -142,6 +142,39 @@ public class vM0_6_7_X_Changes {
|
|||
changes.addButton(new ChangeButton(i, ("熔岩火龙"),
|
||||
("丛林暴乱的真相")));
|
||||
|
||||
changes = new ChangeInfo("v0.6.5.0-Alpha4", true, "");
|
||||
changes.hardlight(Window.TITLE_COLOR);
|
||||
changeInfos.add(changes);
|
||||
|
||||
changes = new ChangeInfo("新内容", false, null);
|
||||
changes.hardlight(Window.GREEN_COLOR);
|
||||
changeInfos.add(changes);
|
||||
|
||||
changes.addButton(new ChangeButton(Icons.get(Icons.CHALLENGE_ON), ("电子斗蛐蛐v0.2"),
|
||||
("开发者模式怪物放置器拥有更多功能,欢迎尝试!另追加黏咕,史莱姆王,豺狼炼药长老,豺狼萨满长老,Flame-C01")));
|
||||
|
||||
changes.addButton(new ChangeButton(Icons.get(Icons.DISPLAY), ("信息栏滚动"),
|
||||
("在游戏缩放较大或者拥有较多词条时,该项会很有用。")));
|
||||
|
||||
changes.addButton(new ChangeButton(Icons.get(Icons.BADGES), ("新徽章:碎片飞溅"),
|
||||
("又是一个死亡徽章,新人:悲鸣 因为意味着另类死亡爱好者多了一个新徽章(未解锁该徽章的就更麻烦了)")));
|
||||
|
||||
changes = new ChangeInfo("改动", false, null);
|
||||
changes.hardlight(Window.CYELLOW);
|
||||
changeInfos.add(changes);
|
||||
|
||||
changes.addButton(new ChangeButton(new SalamanderSprites(), ("深蓝蝾螈"),
|
||||
("修复被深蓝蝾螈击败不会记录在排行榜的问题。")));
|
||||
|
||||
changes.addButton(new ChangeButton(new ItemSprite(ItemSpriteSheet.DIEDCROSSBOW), ("重型弩炮"),
|
||||
("修复使用还会扣减飞镖的问题。")));
|
||||
|
||||
changes.addButton(new ChangeButton(new ItemSprite(ItemSpriteSheet.WAND_KCX), ("共生法杖"),
|
||||
("修复共生法杖可能能被永续的问题。")));
|
||||
|
||||
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_06X85")));
|
||||
|
||||
changes = new ChangeInfo("v0.6.5.0-Alpha3", true, "");
|
||||
changes.hardlight(Window.TITLE_COLOR);
|
||||
changeInfos.add(changes);
|
||||
|
@ -1233,7 +1266,7 @@ public class vM0_6_7_X_Changes {
|
|||
changes.addButton(new ChangeButton(new OGPDNQHZTT(), ("OGPD老鼠组"),
|
||||
("曾经的魔绫代表怪物,如今也正式退出魔绫的舞台。2021.2.21--2023.3.24(R.I.P.)")));
|
||||
|
||||
changes.addButton(new ChangeButton(new SnakeSprite(), ("下水道巨蛇"),
|
||||
changes.addButton(new ChangeButton(new SnakeSprite(), ("密林巨蛇"),
|
||||
("破碎的代表怪物,由于不符合魔绫的世界观,故而被移除。")));
|
||||
}
|
||||
|
||||
|
|
|
@ -53,8 +53,7 @@ public class WndHardNotification extends WndTitledMessage{
|
|||
};
|
||||
btnOkay.setRect(0, height + GAP, width, 16);
|
||||
btnOkay.enable(false);
|
||||
add(btnOkay);
|
||||
|
||||
addToBottom(btnOkay);
|
||||
resize(width, (int) btnOkay.bottom());
|
||||
}
|
||||
|
||||
|
|
|
@ -23,47 +23,126 @@ package com.shatteredpixel.shatteredpixeldungeon.windows;
|
|||
|
||||
import com.shatteredpixel.shatteredpixeldungeon.scenes.PixelScene;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.ui.RenderedTextBlock;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.ui.ScrollPane;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.ui.Window;
|
||||
import com.watabou.noosa.Image;
|
||||
import com.watabou.noosa.ui.Component;
|
||||
|
||||
public class WndTitledMessage extends Window {
|
||||
|
||||
protected static int maxHeight() {
|
||||
return (int) (PixelScene.uiCamera.height * 0.9);
|
||||
}
|
||||
|
||||
protected static final int WIDTH_MIN = 120;
|
||||
protected static final int WIDTH_MAX = 220;
|
||||
protected static final int GAP = 2;
|
||||
|
||||
public WndTitledMessage( Image icon, String title, String message ) {
|
||||
public WndTitledMessage(Image icon, String title, String message) {
|
||||
|
||||
this( new IconTitle( icon, title ), message );
|
||||
this(icon, title, message, WIDTH_MAX);
|
||||
|
||||
}
|
||||
|
||||
public WndTitledMessage( Component titlebar, String message ) {
|
||||
public WndTitledMessage(Image icon, String title, String message, int maxWidth) {
|
||||
|
||||
this(new IconTitle(icon, title), message, maxWidth);
|
||||
|
||||
}
|
||||
|
||||
ScrollPane sp;
|
||||
|
||||
public WndTitledMessage(Component titlebar, String message) {
|
||||
this(titlebar, message, WIDTH_MAX);
|
||||
}
|
||||
|
||||
public WndTitledMessage(Component titlebar, String message, int maxWidth) {
|
||||
|
||||
super();
|
||||
|
||||
int width = WIDTH_MIN;
|
||||
|
||||
titlebar.setRect( 0, 0, width, 0 );
|
||||
titlebar.setRect(0, 0, width, 0);
|
||||
add(titlebar);
|
||||
|
||||
RenderedTextBlock text = PixelScene.renderTextBlock( 6 );
|
||||
text.text( message, width );
|
||||
text.setPos( titlebar.left(), titlebar.bottom() + 2*GAP );
|
||||
add( text );
|
||||
RenderedTextBlock text = PixelScene.renderTextBlock(6);
|
||||
text.text(message, width);
|
||||
text.setPos(titlebar.left(), titlebar.bottom() + 2 * GAP);
|
||||
|
||||
while (PixelScene.landscape()
|
||||
&& text.bottom() > (PixelScene.MIN_HEIGHT_L - 10)
|
||||
&& width < WIDTH_MAX){
|
||||
&& width < maxWidth) {
|
||||
width += 20;
|
||||
titlebar.setRect(0, 0, width, 0);
|
||||
text.setPos( titlebar.left(), titlebar.bottom() + 2*GAP );
|
||||
text.maxWidth(width);
|
||||
|
||||
titlebar.setWidth(width);
|
||||
text.setPos(titlebar.left(), titlebar.bottom() + 2 * GAP);
|
||||
}
|
||||
Component comp = new Component();
|
||||
comp.add(text);
|
||||
text.setPos(0, GAP);
|
||||
comp.setSize(text.width(), text.height() + GAP * 2);
|
||||
resize(width, (int) Math.min((int) comp.bottom() + 2 + titlebar.height() + GAP, maxHeight()));
|
||||
|
||||
add(sp = new ScrollPane(comp));
|
||||
sp.setRect(titlebar.left(), titlebar.bottom() + GAP, comp.width(), Math.min((int) comp.bottom() + 2, maxHeight() - titlebar.bottom() - GAP));
|
||||
|
||||
bringToFront(titlebar);
|
||||
|
||||
resize( width, (int)text.bottom() + 2 );
|
||||
}
|
||||
|
||||
@Override
|
||||
public void offset(int xOffset, int yOffset) {
|
||||
super.offset(xOffset, yOffset);
|
||||
// refresh the scrollbar pane
|
||||
sp.setPos(sp.left(), sp.top());
|
||||
}
|
||||
|
||||
// adds to the bottom of a titled message, below the message itself.
|
||||
// this only works ONCE currently.
|
||||
public final void addToBottom(Component c) {
|
||||
addToBottom(c, GAP);
|
||||
}
|
||||
|
||||
public final void addToBottom(Component c, int gap) {
|
||||
addToBottom(c, gap, 0);
|
||||
}
|
||||
|
||||
public void addToBottom(Component c, int gapBefore, int gapAfter) {
|
||||
// attempt to place normally.
|
||||
c.setRect(0, height + gapBefore, width, c.height() + gapAfter); // assumes there is space at the bottom first. note that I'm baking in the bottom spacing into the component itself
|
||||
add(c);
|
||||
// in order to make things fit, we need to change the size of the scrollbar to make the component fit properly.
|
||||
// fixme even though it *feels* like I should be able to stop here if everything fits, I can't. why?
|
||||
setHeight((int) Math.min(c.bottom(), maxHeight()));
|
||||
float y; c.setY(y = height - c.height()); // put the component into its final position.
|
||||
// scrollbar height is reduced to respect top spacing
|
||||
sp.setRect(0, sp.top(), width, y - sp.top() - gapBefore);
|
||||
}
|
||||
|
||||
// fixme this wrapper component is very unable to moved after it's placed. If I need to move it again, I won't be able to.
|
||||
// should be able to simulate the previous behavior...
|
||||
public Component addToBottom(int gapBefore, int gapAfter, Component... components) {
|
||||
// this ensures that things are formatted correctly vertically.
|
||||
Component wrapper = new Component();
|
||||
if(components.length == 0) return wrapper;
|
||||
float top=Float.MAX_VALUE, bottom=Float.MIN_VALUE;
|
||||
for(Component c : components) {
|
||||
top = Math.min(top, c.top());
|
||||
bottom = Math.max(bottom, c.bottom());
|
||||
wrapper.add(c);
|
||||
}
|
||||
wrapper.setRect(0, top, width, bottom-top);
|
||||
addToBottom(wrapper, gapBefore, gapAfter);
|
||||
|
||||
top -= wrapper.top();
|
||||
|
||||
for(Component c : components) c.setY(c.top() - top);
|
||||
|
||||
return wrapper;
|
||||
}
|
||||
// yes the order is different. deal with it.
|
||||
public Component addToBottom(int gap, Component... components) { return addToBottom(gap, 0, components); }
|
||||
public Component addToBottom(Component... components) { return addToBottom(GAP, components); }
|
||||
}
|
|
@ -80,6 +80,7 @@ public class WndTradeItem extends WndInfoItem {
|
|||
hide();
|
||||
}
|
||||
};
|
||||
btnSell.setHeight( BTN_HEIGHT );
|
||||
btnSell.setRect( 0, pos + GAP, width, BTN_HEIGHT );
|
||||
btnSell.icon(new ItemSprite(ItemSpriteSheet.GOLD));
|
||||
add( btnSell );
|
||||
|
@ -163,6 +164,7 @@ public class WndTradeItem extends WndInfoItem {
|
|||
btnStole.alpha(0.3f);
|
||||
btnStole.active=false;
|
||||
}
|
||||
|
||||
btnStole.setRect( 0, pos + GAP, width, BTN_HEIGHT );
|
||||
btnStole.icon(Statistics.fireGirlnoshopping && !Statistics.deadshoppingdied ? new FireMagicGirlSprite() :
|
||||
new ShopGuardDead.ShopGuardianRedSprite());
|
||||
|
|
Loading…
Reference in New Issue
Block a user