update 0.6.5.0-Alpha6-Patch8 and Hollow
-由于代码修正众多,特定提交两次 -本次代码改动了以下方面: 1.迭代了部分素材 2.添加破碎的天狗BGM,并且优化天狗的策略 3.修复一些分数的扣除错误 4.灯火现已支持小数扣减 5.一些底层的修改变动 6.矮人国王额外召唤重甲豺狼和冰雪魔像 7.Yog二阶段额外召唤两个拳头
|
@ -18,8 +18,8 @@ allprojects {
|
|||
appName = 'Magic Ling Pixel Dungeon'
|
||||
appPackageName = 'com.ansdomagiclingpixeldungeon.ling'
|
||||
|
||||
appVersionCode =916000
|
||||
appVersionName = '0.6.5.0-Alpha6-Patch6'
|
||||
appVersionCode =917000
|
||||
appVersionName = '0.6.5.0-Alpha6-Patch7'
|
||||
|
||||
appJavaCompatibility = JavaVersion.VERSION_1_8
|
||||
|
||||
|
|
BIN
core/src/main/assets/DiLing.png
Normal file
After Width: | Height: | Size: 2.1 KiB |
BIN
core/src/main/assets/dog.png
Normal file
After Width: | Height: | Size: 706 B |
Before Width: | Height: | Size: 551 B After Width: | Height: | Size: 995 B |
Before Width: | Height: | Size: 46 KiB After Width: | Height: | Size: 24 KiB |
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 37 KiB |
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 30 KiB |
Before Width: | Height: | Size: 44 KiB After Width: | Height: | Size: 50 KiB |
BIN
core/src/main/assets/environment/tiles_tengu.png
Normal file
After Width: | Height: | Size: 24 KiB |
BIN
core/src/main/assets/interfaces/bosslogo/tengu-clear.png
Normal file
After Width: | Height: | Size: 1.9 KiB |
BIN
core/src/main/assets/interfaces/bosslogo/tengu-title.png
Normal file
After Width: | Height: | Size: 1.6 KiB |
BIN
core/src/main/assets/interfaces/mapname/hollow.png
Normal file
After Width: | Height: | Size: 218 KiB |
|
@ -1,11 +1,21 @@
|
|||
#####MLPD-P3文本
|
||||
|
||||
actors.mobs.bosses.cerberus.name=刻耳柏洛斯
|
||||
actors.mobs.bosses.cerberus.desc=刻耳柏洛斯,是一只来自异界的守门恶犬。它凝视着周围的一切,似乎充满了恶意和威胁。\n它身边的环境异常寂静,毫无生机。刻耳柏洛斯以死亡和绝望为代表,具有无比的威力,堪称死亡的化身。
|
||||
|
||||
|
||||
actors.mobs.hollow.apprenticewitch.name=见习魔女
|
||||
actors.mobs.hollow.apprenticewitch.desc=她曾是某魔法学院的学生,因为太过顽皮,没能通过魔法考试,所以无法成为一名合格的法师。\n\n有些人会吸取教训,继续努力学习成为出色的法师,但她却渐渐失去了对魔力的控制,境况逐渐堕落。如今,她只能作为一名见习魔女游荡在荒野之外,以汲取过路人灵魂或给予她糖果为乐。如果没有给她糖果,那么她会生气,你的灵魂会被她汲取。
|
||||
|
||||
actors.mobs.hollow.frankenstein.name=未尽梦偶
|
||||
actors.mobs.hollow.frankenstein.desc=游荡在万圣大殿的未完成人偶,据说制作它们的主人因为它们失败的外型和缓慢的速度最终抛弃了它们。它们已经陷入了癫狂之中,会寻找一切活着的生命,并撕碎他们的灵魂。
|
||||
|
||||
actors.mobs.hollow.hollowmimic.minames=南瓜灯
|
||||
actors.mobs.hollow.hollowmimic.midescs=古堡中随处可见的南瓜灯,你能看见它正在对你微笑,这让你不免毛骨悚然。
|
||||
|
||||
actors.mobs.hollow.hollowmimic.name=墙怪
|
||||
actors.mobs.hollow.hollowmimic.desc=墙怪也是拟态怪家族的一员,只不过,它们与它的宝箱怪近亲不同的地方在于它们并不喜欢用宝箱勾引冒险者上钩。\n\n它们更加喜欢让冒险家放松警惕时倚靠墙壁时吗,从背后来上一大口,使冒险者背后出现一个大的伤口,从而失血过多昏迷而死。
|
||||
|
||||
actors.mobs.blackmimic.name=暗金宝箱怪
|
||||
actors.mobs.blackmimic.desc=宝箱怪是一种能随意改变外形的魔法生物。在地牢里它们几乎一直以宝箱形态出现,因为这样总能吸引不防备的冒险者。\n\n暗金宝箱怪是在极度魔力紊乱下才会出现的极度危险的怪物。它们潜伏在暗影中等待猎物的到来……
|
||||
|
||||
|
@ -92,7 +102,7 @@ actors.mobs.bosses.sakafishboss.rankings_desc=成为了萨卡班甲鱼的食物
|
|||
|
||||
|
||||
actors.mobs.bosses.dictfish.name=板足鲎
|
||||
actors.mobs.bosses.dictfish.desc=底栖顶级捕食者,他的巨鳌和巨颚可以碾碎你的铠甲。\n\n与_房角石_是共生互助,因此死后房角石会狂暴,获得的特殊攻击带有冲击,可以击退敌人造成大量伤害。
|
||||
actors.mobs.bosses.dictfish.desc=底栖顶级捕食者,他的巨鳌和巨颚可以碾碎你的铠甲。\n\n与_房角石_是共生互助,因此死后房角石会狂暴,获得的特殊攻击带有冲击,可以击退敌人造成大量伤害。且免疫火焰。
|
||||
actors.mobs.bosses.dictfish.notice=板足鲎:大哥!
|
||||
actors.mobs.bosses.dictfish.death=大哥,接下来就交给你了!
|
||||
actors.mobs.bosses.dictfish.angry=板足鲎:大哥!该死的人类!我要你们付出代价!
|
||||
|
@ -1884,6 +1894,7 @@ actors.mobs.npcs.blacksmith.completed=噢,你终于回来了… 算了,总
|
|||
actors.mobs.npcs.blacksmith.get_lost=我忙着呢。滚开!
|
||||
actors.mobs.npcs.blacksmith.same_item=选择2个不一样的,不是2次一样的!
|
||||
actors.mobs.npcs.blacksmith.diff_type=选择2个相同类型的物品!
|
||||
actors.mobs.npcs.blacksmith.oil=这是什么垃圾?!我不能帮你合成这玩意!
|
||||
actors.mobs.npcs.blacksmith.un_ided=我得知道我在拿什么干活,先鉴定!
|
||||
actors.mobs.npcs.blacksmith.cursed=我可不碰诅咒的东西!
|
||||
actors.mobs.npcs.blacksmith.degraded=这简直就是个垃圾,质量太差了!
|
||||
|
@ -2253,6 +2264,12 @@ actors.mobs.tengu.defeated=终于...我解脱了...
|
|||
actors.mobs.tengu.rankings_desc=被天狗暗杀
|
||||
actors.mobs.tengu.desc=一位著名的神秘皇家刺客,其名源于她脸上面具的蚀刻。\n\n天狗的手腕和膝下都带着镣铐,但她似乎很久以前就摆脱掉了锁链的束缚。\n\n她将利用陷阱、欺骗性的魔法、精准致命的攻击,来消灭唯一能阻止她逃脱的人:你。
|
||||
|
||||
actors.mobs.tengu.cut_you=天狗突然出现在你面前!
|
||||
actors.mobs.tengu.cut_you2=%s,我已经在此等候多时了!接招!
|
||||
actors.mobs.tengu.rose=突然间,一张玫瑰结界在你面前展开.......
|
||||
actors.mobs.tengu.ready=好,%s,你的反应力不错,那么,让我来见识见识你的利爪!
|
||||
|
||||
|
||||
actors.mobs.tengu$bombability$bombblob.desc=这里翻滚着一片过热的烟尘。当心,要爆炸了!
|
||||
actors.mobs.tengu$bombability$bombitem.name=烟尘炸弹
|
||||
actors.mobs.tengu$bombability$bombitem.cant_pickup=它固定在地面上,你无法搬动它!
|
||||
|
@ -2326,6 +2343,14 @@ actors.mobs.yogfist$darkfist.name=暗影之拳
|
|||
actors.mobs.yogfist$darkfist.teleport=暗影之拳在一片使你光源熄灭的漆黑中传送到了别处!
|
||||
actors.mobs.yogfist$darkfist.desc=暗影之拳是由纯粹的暗能量形成的。它能在每回合射出强大的暗黑法术!这些法术除了造成大量伤害外,还会削弱你的光源。暗影之拳为了逃脱还能瞬间使全场陷入一片漆黑!\n\n暗影之拳在近战中并没有特殊能力。
|
||||
|
||||
actors.mobs.yogfist$freezingfist.name=寒冰之拳
|
||||
actors.mobs.yogfist$freezingfist.desc=寒冰之拳催生于地牢的冰寒之气,它能够施展魔法能量,每隔3回合释放出冻伤的力量。\n\n_寒冰之拳常与鬼磷之拳一同行动。当鬼磷之拳存在时,寒冰之拳将不会受到任何与火有关的伤害。_
|
||||
actors.mobs.yogfist$halofist.name=鬼磷之拳
|
||||
actors.mobs.yogfist$halofist.desc=鬼磷之拳的诞生源自无数冒险者的尸体聚集,古神巧妙地利用这股怨气创造了这个怪物。\n\n鬼磷之拳足迹所及之处,将留下熠熠发光的磷火,同时水分也会被蒸发殆尽。\n\n此外,若鬼磷之拳的生命力渐趋微弱且战斗持续时间过长,它还会定期借助亡灵的诅咒释放一道道激光来对你进行攻击。这些激光充满邪恶之力,将给你带来巨大的威胁。\n\n_鬼磷之拳通常与寒冰之拳一起行动。_
|
||||
|
||||
actors.mobs.yogfist.halofist=鬼磷之拳已被击败,寒冰之拳的免疫火焰效果已失效。
|
||||
|
||||
|
||||
|
||||
actors.char.kill=%s杀害了你…
|
||||
actors.char.defeat=你击败了%s。
|
||||
|
|
|
@ -157,10 +157,10 @@ levels.newcavesbosslevel.gate_desc=一面高大的金属城门挡住了通往矮
|
|||
levels.newcavesbosslevel.gate_desc_broken=这扇大门一定是以某种形式与DM-300相连,因为在DM-300损坏时它也随之爆炸。现在这扇门炸得只剩下零星的碎片。
|
||||
levels.newcavesbosslevel.water_desc=周围奔涌着强大的电流,这里的水可能不太安全...
|
||||
|
||||
levels.citybosslevel.throne_name=王座
|
||||
levels.citybosslevel.throne_desc=这座醒目的高大王座曾是矮人国王的席位,但现在它已属于一位沉湎于力量的死灵法师。\n\n说不清是不是有什么魔法或是机械装置与王座相连,矮人国王在上面坐着时会拥有额外的能力。
|
||||
levels.citybosslevel.summoning_name=唤灵基座
|
||||
levels.citybosslevel.summoning_desc=唤灵基座的中央有一个巨大的开口,时不时涌出一些黑暗能量。\n\n矮人国王利用这些基座来聚焦死灵魔法,为其召唤奴仆。召唤物的生成需要一段时间的能量聚集,召唤物的类型取决于聚积于此的魔力。
|
||||
levels.newcitybosslevel.throne_name=王座
|
||||
levels.newcitybosslevel.throne_desc=这座醒目的高大王座曾是矮人国王的席位,但现在它已属于一位沉湎于力量的死灵法师。\n\n说不清是不是有什么魔法或是机械装置与王座相连,矮人国王在上面坐着时会拥有额外的能力。
|
||||
levels.newcitybosslevel.summoning_name=唤灵基座
|
||||
levels.newcitybosslevel.summoning_desc=唤灵基座的中央有一个巨大的开口,时不时涌出一些黑暗能量。\n\n矮人国王利用这些基座来聚焦死灵魔法,为其召唤奴仆。召唤物的生成需要一段时间的能量聚集,召唤物的类型取决于聚积于此的魔力。
|
||||
|
||||
levels.caveslevel.grass_name=荧光地苔
|
||||
levels.caveslevel.high_grass_name=荧光菌菇
|
||||
|
|
|
@ -368,7 +368,7 @@ challenges.no_armorx = 这片大地吃布甲之外的护甲从不挑食,侦查
|
|||
kill=\n_冰雪魔女:_\n_-_生命+25%\n_-_ 水中召唤的仆从更多\n-击败时必定掉落紫金宝石护符\n_矮人大师:_\n_-_ 致命技能更加频繁\n_-_ 生命值+50%\n-击败时必定掉落自然神圣护符\n_史莱姆王:_\n_-_ 生命值+100%\n_-_ 伤害更高,速度更快\n_-_ 在开局额外召唤豺狼诡术师,巨钳螃蟹,腐臭老鼠,蚀化史莱姆\n_-_ 击败时必定掉落凝胶手套\n_DM720:_\n_-_ 获得全新技能\n_-_ 击败时必定掉落DM150控制终端[尚未完成]
|
||||
|
||||
windows.wndchallenges.boss_title=绝命头目-测试版
|
||||
windows.wndchallenges.boss_desc=这项挑战让挑战 Boss 变得更有挑战性了!\n开启后你将遭遇更加强大的 Boss,\n以及额外的积分和永久货币奖励(WIP)和更好的战利品!!!\n还等什么,立刻开始你的行动吧!!!\n\n注意:BossRush直接默认绝命头目开启,且部分BR独占头目无此加成。\n\n}第一区域-圣境密林层}\n\n_A.克里弗斯之果(加强效果预览):_\n_-_ 第二阶段:\n_-_ 触手可以远程攻击,但场上出现额外柱子以方便躲避。\n_-_ 不再额外提供净化药水。\n_-_ 第三阶段:\n_-_ 触手和本体在战斗过程中拥有额外护盾加成\n_-_ 在{困难模式{中则会获得额外技能-_丛林质问_\n\n_B.奥克拉赫之花(加强效果预览-WIP):_\n即将到来\n\n[第二区域-冰雪监狱层[\n\n_A.天狗(加强效果预览):_\n_-_ 生命 +25%\n_-_ 第一阶段:\n_-_ 陷阱更加致命\n_-_ 第二阶段:\n_-_ 技能频率更高\n\n_B.拟态之王(加强效果预览-WIP):_\n即将到来\n\n_C.暗黑天狗(加强效果预览-WIP)_\n即将到来\n\n]第三区域-冰雪熔洞层]\n\n_A.DM-300(加强效果预览):_\n_-_ 全局阶段:\n_-_ 生命 +60%\n_-_ 能量塔更坚固。\n_-_ 技能频率更高,威力也更强大\n_-_ 超载时移动速度更高\n_-_ 击败时必掉落随机一枚+2戒指。\n\n_B.DM-720(加强效果预览-WIP):_\n_-_ 全局阶段:\n_-_ 生命 +50%\n_-_ 驾驶员出现时立刻改变地形,并且需要拆除四个能量塔才能攻击血月长老。\n\n_C.冰雪魔女-冬铃(加强效果预览-WIP):_\n即将到来\n\n|第四区域-废都遗址层|\n\n_A.矮人国王(加强效果预览):_\n_-_ 全局阶段\n_-_ 生命 +50%\n_-_ 整场战斗内召唤的随从都更强大\n_-_ 第一阶段:技能与召唤频率都更高\n_-_ 第二阶段:每轮额外召唤两个随从\n_-_ 第三阶段:生命值 +100%,召唤频率更高\n\n_B.矮人将军(加强效果预览-WIP):_\n_-_ 全局阶段:\n_-_ 生命+80%\n_-_ 第二阶段:整场战斗内召唤的随从都更强大。\n_-_ 第三阶段:大激光伤害x2。\n\n[第五区域-恶魔郊区[\n_A.Yog-Dzewa(加强效果预览):_\n_-_ 同时召唤两个古神之拳!\n_-_ 激光攻击伤害 +60%\n_-_ 召唤更强大的随从\n_B.极度恐惧-水晶意志(加强效果预览-WIP):_\n即将到来\n\n*额外区域-EX头目*\n额外区域的Boss们我目前暂无加强想法,或许未来会有。\n\n_总之,这是一个WIP(未完成)_
|
||||
windows.wndchallenges.boss_desc=这项挑战让挑战 Boss 变得更有挑战性了!\n开启后你将遭遇更加强大的 Boss,\n以及额外的积分和永久货币奖励(WIP)和更好的战利品!!!\n还等什么,立刻开始你的行动吧!!!\n\n注意:BossRush直接默认绝命头目开启,且部分BR独占头目无此加成。\n\n}第一区域-圣境密林层}\n\n_A.克里弗斯之果(加强效果预览):_\n_-_ 第二阶段:\n_-_ 触手可以远程攻击,但场上出现额外柱子以方便躲避。\n_-_ 不再额外提供净化药水。\n_-_ 第三阶段:\n_-_ 触手和本体在战斗过程中拥有额外护盾加成\n_-_ 在{困难模式{中则会获得额外技能-_丛林质问_\n\n_B.奥克拉赫之花(加强效果预览-WIP):_\n即将到来\n\n[第二区域-冰雪监狱层[\n\n_A.天狗(加强效果预览):_\n_-_ 生命 +25%\n_-_ 第一阶段:\n_-_ 陷阱更加致命\n_-_ 第二阶段:\n_-_ 技能频率更高\n\n_B.拟态之王(加强效果预览-WIP):_\n即将到来\n\n_C.暗黑天狗(加强效果预览-WIP)_\n即将到来\n\n]第三区域-冰雪熔洞层]\n\n_A.DM-300(加强效果预览):_\n_-_ 全局阶段:\n_-_ 生命 +60%\n_-_ 能量塔更坚固。\n_-_ 技能频率更高,威力也更强大\n_-_ 超载时移动速度更高\n_-_ 击败时必掉落随机一枚+2戒指。\n\n_B.DM-720(加强效果预览-WIP):_\n_-_ 全局阶段:\n_-_ 生命 +50%\n_-_ 驾驶员出现时立刻改变地形,并且需要拆除四个能量塔才能攻击血月长老。\n\n_C.冰雪魔女-冬铃(加强效果预览-WIP):_\n即将到来\n\n|第四区域-废都遗址层|\n\n_A.矮人国王(加强效果预览):_\n_-_ 全局阶段\n_-_ 生命 +50%\n_-_ 整场战斗内召唤的随从都更强大\n_-_ 第一阶段:技能与召唤频率都更高\n_-_ 第二阶段:额外召唤霜冻魔像和重甲豺狼,重甲豺狼只有原本的62.5%血量。\n_-_ 第三阶段:生命值 +100%,召唤频率更高\n\n_B.矮人将军(加强效果预览-WIP):_\n_-_ 全局阶段:\n_-_ 生命+80%\n_-_ 第二阶段:整场战斗内召唤的随从都更强大。\n_-_ 第三阶段:大激光伤害x2。\n\n[第五区域-恶魔郊区[\n_A.Yog-Dzewa(加强效果预览):_\n_-_ 同时召唤两个古神之拳!\n_-_ 二阶段额外召唤寒冰与鬼磷拳头\n_-_ 激光攻击伤害 +60%\n_-_ 召唤更强大的随从\n_B.极度恐惧-水晶意志(加强效果预览-WIP):_\n即将到来\n\n*额外区域-EX头目*\n额外区域的Boss们我目前暂无加强想法,或许未来会有。\n\n_总之,这是一个WIP(未完成)_
|
||||
windows.wndchallenges.ok=返回挑战页面
|
||||
|
||||
|
||||
|
|
|
@ -12,6 +12,8 @@ scenes.gamescene.examine=调查这里
|
|||
scenes.gamescene.interact=与之对话
|
||||
scenes.gamescene.pick_up=拾取此物
|
||||
|
||||
scenes.mobcatlogscene.title=生物档案库
|
||||
|
||||
|
||||
|
||||
#挑战模式
|
||||
|
@ -199,6 +201,7 @@ scenes.interlevelscene.file_not_found=未能找到存档文件。如果重启后
|
|||
scenes.interlevelscene.io_error=未能找到存档文件。如果重启后问题依旧存在, 那这个存档可能已经损坏。节哀顺变。
|
||||
|
||||
scenes.introscene.text=自宇宙诞生以来,我们的创世神便创造了圣灵之心并建立了我们最初的家园。\n时间不知道过了多久,由于创世神需要离开家园,于是便创造了三个管理者。\n并嘱咐他们一定要守护好这里。创世神始终放不下他们,于是将圣灵之心力量的一半给予了三个管理者,三个管理者叫了一名工匠帮忙制作。于是,水晶之心,就此诞生……\n然而,好景不长。一名管理者突然下落不明,就在同时,另外两个管理者所管理的国度开始受到了未知的毁灭性的袭击。战火蔓延到了每一个角落,但创世神早已离去……\n无奈之下,其中一名的管理者出来发动了一个禁忌魔法,一瞬间,袭击停止了。但这名管理者也消耗了自己的四分之一的生命。并且,由于袭击过于庞大,战后的鬼魂与怨念仍然是头号危机。危急之下,创世神突然归来,并使用水晶之心将全部污秽净化,并用水晶之心把所有的灵体镇压,随后将它放在三国交界处的废弃地牢深处之中。\n但这一做,创世神违背了天地平衡,故此也没有人再记得她。\n所有关于她的记忆,她的传说,被一并消除。\n3个世纪后……\n当时的三大管理者,如今已成为地表三巨头。\n关于那个地牢,近期有传言称里面的环境越来越不稳定,且还有垂涎于水晶之心的人前往。\n你也是其中的一员,你会找到真相吗?是时候开始你自己的冒险了!
|
||||
|
||||
scenes.newsscene.title=游戏动态情报
|
||||
scenes.newsscene.read_more=查阅更多
|
||||
scenes.newsscene$newsinfo.english_warn=新闻仅能由开发者以中文撰写。
|
||||
|
@ -239,6 +242,9 @@ scenes.titlescene.play=开始
|
|||
|
||||
scenes.titlescene.enter=进入地牢
|
||||
|
||||
scenes.titlescene.mobcat=生物档案资料库
|
||||
|
||||
|
||||
scenes.titlescene.go=走向地牢之外
|
||||
|
||||
scenes.titlescene.dark=夜幕之下 危机四伏
|
||||
|
@ -246,6 +252,10 @@ scenes.titlescene.dark=夜幕之下 危机四伏
|
|||
scenes.titlescene.rankings=排行榜
|
||||
scenes.titlescene.badges=徽章
|
||||
scenes.titlescene.news=游戏动态情报
|
||||
|
||||
scenes.titlescene.news2=新闻
|
||||
scenes.titlescene.mobcat2=生物档案
|
||||
|
||||
scenes.titlescene.changes=改动
|
||||
scenes.titlescene.update=更新
|
||||
scenes.titlescene.install=安装
|
||||
|
@ -306,13 +316,13 @@ scenes.guidescene.title_9=0层加成
|
|||
scenes.guidescene.page_9=当你完成了一些特殊挑战后,0层的四个基座就会追加更多的补给品。\n\n-请小心,挑战非常困难,但一旦开着挑战胜利了是不是很有成就感了,对吧!\n\n-同时0层随着探索的深入还会出现更多NPC,他们会在你的后续探索中让你获得更多受益。
|
||||
scenes.guidescene.title_10=寒冷系统
|
||||
scenes.guidescene.page_10=从监狱开始,暴风雪将会开始在地牢飘絮。当然,命运也在照顾我们。\n\n在监狱会有篝火房间,在篝火房间中能获得温度,克制寒冷的侵蚀。
|
||||
scenes.guidescene.title_11=娱乐模式
|
||||
scenes.guidescene.page_11=厌倦了常规模式,想游玩更多模式?\n\n娱乐模式欢迎你的到来!点击英雄选择界面右边的_提灯_即可进入。
|
||||
scenes.guidescene.title_11=DLC模式
|
||||
scenes.guidescene.page_11=厌倦了常规模式,想游玩更多模式?\n\nDLC模式欢迎你的到来!点击英雄选择界面右边的_提灯_即可进入。
|
||||
|
||||
scenes.thanksscene.code=编码致谢:\n-REN(夜临2作者)\n-Alexstrasza(注解作者)\n-SmuJB(诅咒作者)\n-Tianscar(碳素作者)\n-TrashBoxbodylev(经验作者)
|
||||
scenes.thanksscene.test=\n\n测试致谢:\n-CodenameE\n-熊猫头\n-迷茫\n-小狐狸\n-摘希\n-ZIOM-ObSir\n-坏猫猫\n-不是史神\n-月鸾\n-口水猫
|
||||
scenes.thanksscene.music=\n\n音乐致谢:\n-Prohonor\n-泰拉瑞亚
|
||||
scenes.thanksscene.code=编码&设计致谢:\n-REN(夜临2作者)\n-Alexstrasza(注解作者)\n-SmuJB(诅咒作者)\n-Tianscar(碳素作者)\n-TrashBoxbodylev(经验作者)\n-阿巴阿巴(MLPD设寄师)\n-AAC(音乐总策划)\n-罐装狐腻(文本优化)
|
||||
scenes.thanksscene.test=\n\n测试致谢:\nBzmdr(_首席测试员_)\n-CodenameE(_前席纳谏员_)\n-熊猫头(_首席攻略员_)\n-迷茫\n-小狐狸\n-摘希\n-ZIOM-ObSir\n-坏猫猫\n-不是史神\n-月鸾\n-口水猫
|
||||
scenes.thanksscene.music=\n\n原创音乐致谢:\n-Prohonor\n-犬羅\n\n第三方音乐借用:\n-泰拉瑞亚\n-泰坦之魂\n-Arknight\n\n(本PDMOD不用于任何商业用途)
|
||||
scenes.thanksscene.art=\n\n美术致谢:\n-被子\n-冷群怪\n-REN\n-Daniel Clan\n-奈亚子-\nTianScar\n-ObSir\n-Nxhy
|
||||
scenes.thanksscene.ad=\n\n宣传致谢:\n-_那些回忆\n-罗贝里\n-泰勒\n-Ømicrónrg9_\n\n翻译致谢:\n-English:\n_Noodlemire & JDSALing_\n\n-繁体中文:\n-_那些回忆 & 冷群_\n\n-日本语:\n-_FromBeyond_
|
||||
scenes.thanksscene.ad=\n\n宣传致谢:\n-_那些回忆\n-QinYue\n-罗贝里\n-泰勒\n-Ømicrónrg9_\n\n翻译致谢:\n-English:\n_Noodlemire & JDSALing_\n\n-繁体中文:\n-_那些回忆 & 冷群_\n\n-日本语:\n-_FromBeyond_
|
||||
scenes.thanksscene.join=加入魔绫总群
|
||||
scenes.thanksscene.link=https://jq.qq.com/?_wv=1027&k=wzMjU0f7
|
|
@ -564,4 +564,6 @@ ui.changelist.mlpd.vm0_6_7_x_changes.bug_06x87=1:修复中秋节活动时间
|
|||
|
||||
ui.changelist.mlpd.vm0_6_7_x_changes.bug_06x88=1.修复死亡楼层可以使用锁链传送出去的问题\n2.暗金宝石护符进行了一定的平衡\n3.修复精英策略中错误的DM300原型机生成\n4.修复裂缝遇到任何实体变成地块的问题\n5.削弱绿野精灵的数值\n6.克里弗斯之果改进,特别净化药水在战斗结束后自动删除
|
||||
|
||||
ui.changelist.mlpd.vm0_6_7_x_changes.bug_06x89=1.修复了棱光法杖光源冲突的问题,在灯火状态下棱光法杖可以在视野低于直接给灯火能量充能5点,该效果有200回合冷却。\n2.修复了号角可以被盗贼充能\n3.修复了上个版本由FireBase提到的诸多问题\n4.修复了浊焰魔女的一些问题
|
||||
|
||||
//ui.changelist.mlpd.vm0_5_x_changes.xxx//
|
BIN
core/src/main/assets/music/Tengu.ogg
Normal file
BIN
core/src/main/assets/sprites/hollow/Cerberus.png
Normal file
After Width: | Height: | Size: 18 KiB |
BIN
core/src/main/assets/sprites/hollow/crumb.png
Normal file
After Width: | Height: | Size: 529 B |
BIN
core/src/main/assets/sprites/hollow/gingerbread.png
Normal file
After Width: | Height: | Size: 2.3 KiB |
BIN
core/src/main/assets/sprites/hollow/mimicry.png
Normal file
After Width: | Height: | Size: 2.7 KiB |
BIN
core/src/main/assets/sprites/hollow/morpheus.png
Normal file
After Width: | Height: | Size: 8.1 KiB |
BIN
core/src/main/assets/sprites/hollow/typhon.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 90 KiB After Width: | Height: | Size: 94 KiB |
Before Width: | Height: | Size: 9.3 KiB After Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 3.9 KiB After Width: | Height: | Size: 6.6 KiB |
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 4.1 KiB |
|
@ -37,6 +37,7 @@ public class Assets {
|
|||
public static final String TOWN = "music/town.ogg";
|
||||
public static final String BGM_BOSSA = "music/Boss1.ogg";
|
||||
public static final String BGM_BOSSB = "music/Boss2.ogg";
|
||||
public static final String BGM_BOSSB2 = "music/Tengu.ogg";
|
||||
public static final String BGM_BOSSC = "music/Boss3.ogg";
|
||||
public static final String BGM_BOSSC3 = "music/Ice.ogg";
|
||||
public static final String BGM_BOSSD = "music/Boss4.ogg";
|
||||
|
@ -70,7 +71,7 @@ public class Assets {
|
|||
public static final String TILES_PRISON = "environment/tiles_prison.png";
|
||||
public static final String TILES_COLDCHEST = "environment/tiles_coldchest.png";
|
||||
public static final String TILES_FIRE = "environment/tiles_fire.png";
|
||||
|
||||
public static final String TILES_TENGUS = "environment/tiles_tengu.png";
|
||||
public static final String TILES_HOLLOW = "environment/tiles_halloween.png";
|
||||
|
||||
public static final String TILES_CAVES = "environment/tiles_caves.png";
|
||||
|
@ -125,6 +126,9 @@ public class Assets {
|
|||
public static final String SakaBJY_Title = "interfaces/bosslogo/sakabjy-title.png";
|
||||
public static final String SakaBJY_Clear = "interfaces/bosslogo/sakabjy-clear.png";
|
||||
|
||||
public static final String Tengu_Title = "interfaces/bosslogo/tengu-title.png";
|
||||
public static final String Tengu_Clear = "interfaces/bosslogo/tengu-clear.png";
|
||||
|
||||
public static final String ARCS_BG = "interfaces/arcs1.png";
|
||||
public static final String ARCS_FG = "interfaces/arcs2.png";
|
||||
|
||||
|
@ -331,9 +335,14 @@ public class Assets {
|
|||
|
||||
//HOLLOW
|
||||
public static final String APWHEEL = "sprites/hollow/apprentice_witch.png";
|
||||
public static final String CSBR = "sprites/hollow/Cerberus.png";
|
||||
public static final String TYPHON = "sprites/hollow/typhon.png";
|
||||
public static final String MPHON = "sprites/hollow/morpheus.png";
|
||||
|
||||
public static final String ZOMBIE = "sprites/hollow/frankenstein.png";
|
||||
|
||||
public static final String MIMICRY = "sprites/hollow/mimicry.png";
|
||||
|
||||
public static final String KEEPERKINGBOT = "sprites/npc/autoshop.png";
|
||||
|
||||
//BOSS
|
||||
|
|
|
@ -150,8 +150,10 @@ public class BGMPlayer {
|
|||
} else {
|
||||
if (Dungeon.bossLevel() && t == 5 || t == 4) {
|
||||
playBGM(Assets.BGM_BOSSA, true);
|
||||
} else if (Dungeon.bossLevel() && t == 10) {
|
||||
} else if (Dungeon.bossLevel() && t == 10 && Statistics.mimicking) {
|
||||
playBGM(Assets.BGM_BOSSB, true);
|
||||
} else if (Dungeon.bossLevel() && t == 10) {
|
||||
playBGM(Assets.BGM_BOSSB2, true);
|
||||
} else if (t == 14) {
|
||||
playBGM(Assets.BGM_BOSSC, true);
|
||||
} else if (Dungeon.bossLevel() && t == 15) {
|
||||
|
|
|
@ -396,7 +396,7 @@ public class Badges {
|
|||
badge = Badge.HIGH_SCORE_4;
|
||||
local.add( badge );
|
||||
}
|
||||
if (score >= SSSP_SCORE * chalMultiplier * (amuletObtained ? 0.7 : 4.5)) {
|
||||
if (score >= SSSP_SCORE * chalMultiplier * (amuletObtained ? 1 : 5)) {
|
||||
badge = Badge.HIGH_SCORE_5;
|
||||
local.add( badge );
|
||||
}
|
||||
|
|
|
@ -5,7 +5,6 @@ import com.watabou.utils.Bundlable;
|
|||
import com.watabou.utils.Bundle;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
|
||||
public class Conducts {
|
||||
public enum Conduct {
|
||||
|
@ -33,8 +32,6 @@ public class Conducts {
|
|||
conducts = new ArrayList<>();
|
||||
}
|
||||
|
||||
public ConductStorage(Conduct... conducts) {this.conducts = new ArrayList<>(Arrays.asList(conducts));}
|
||||
|
||||
public ConductStorage(ConductStorage storage) {this.conducts = new ArrayList<>(storage.conducts);}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -140,7 +140,7 @@ public abstract class Char extends Actor {
|
|||
public int HT;
|
||||
public int HP;
|
||||
|
||||
protected float baseSpeed = 1;
|
||||
public float baseSpeed = 1;
|
||||
protected PathFinder.Path path;
|
||||
|
||||
public int paralysed = 0;
|
||||
|
|
|
@ -9,7 +9,6 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.bosses.CrystalDiedTo
|
|||
import com.shatteredpixel.shatteredpixeldungeon.effects.Beam;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.effects.FloatingText;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.tiles.DungeonTilemap;
|
||||
import com.watabou.utils.Bundle;
|
||||
import com.watabou.utils.PointF;
|
||||
|
@ -28,7 +27,7 @@ public class BeamTowerAdbility extends Buff {
|
|||
if (ch.alignment != Char.Alignment.ENEMY) {
|
||||
ch.damage(Random.IntRange(6, 10), CrystalDiedTower.class);
|
||||
Statistics.bossScores[3] -= 300;
|
||||
hero.sprite.showStatus(CharSprite.NEGATIVE, "300");
|
||||
//hero.sprite.showStatus(CharSprite.NEGATIVE, "300");
|
||||
Buff.affect(ch, Cripple.class, 2f);
|
||||
if (ch == hero && !ch.isAlive()) {
|
||||
Dungeon.fail(getClass());
|
||||
|
|
|
@ -66,7 +66,7 @@ public class Nyctophobia extends Buff implements Hero.Doom {
|
|||
}
|
||||
spend(90f);
|
||||
} else if(hero.lanterfire < 0){
|
||||
hero.damage( (Dungeon.depth/5)*(Math.abs(hero.lanterfire)/2)+10, this );
|
||||
hero.damage( (int)((Dungeon.depth/5)*(Math.abs(hero.lanterfire)/2)+10), this );
|
||||
spend(24f);
|
||||
GLog.w( Messages.get(this, "desc6") );
|
||||
}
|
||||
|
|
|
@ -277,7 +277,7 @@ public class Hero extends Char {
|
|||
public int exp = 0;
|
||||
|
||||
//TODO 灯火前行
|
||||
public int lanterfire;
|
||||
public float lanterfire;
|
||||
|
||||
public int icehp;
|
||||
|
||||
|
@ -2675,7 +2675,7 @@ public class Hero extends Char {
|
|||
hero.sprite.showStatus(0x808080, String.valueOf(value));
|
||||
}
|
||||
|
||||
public void healLantern(int value){
|
||||
public void healLantern(float value){
|
||||
lanterfire = Math.min(lanterfire+value,100);
|
||||
hero.sprite.showStatus(0x00ff00, String.valueOf(value));
|
||||
}
|
||||
|
|
|
@ -87,11 +87,13 @@ import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfMagicMappi
|
|||
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfRage;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfTeleportation;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfUpgrade;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.exotic.ScrollOfMetamorphosis;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.spells.AquaBlast;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.spells.MagicalInfusion;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfFrost;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfLightning;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfMagicMissile;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfPrismaticLight;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfRegrowth;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.SpiritBow;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.BloodthirstyThorn;
|
||||
|
@ -164,6 +166,7 @@ public enum HeroClass {
|
|||
new LevelTeleporter().quantity(1).identify().collect();
|
||||
new LockSword().quantity(1).identify().collect();
|
||||
new MIME.GOLD_THREE().quantity(1).identify().collect();
|
||||
new ScrollOfMetamorphosis().quantity(111).identify().collect();
|
||||
new DriedRose().quantity(1).identify().collect();
|
||||
new PotionOfInvisibility().quantity(45).identify().collect();
|
||||
new AncityArmor().quantity(1).identify().collect();
|
||||
|
@ -195,6 +198,8 @@ public enum HeroClass {
|
|||
new SkyBlueFireBloom.Seed().quantity(51).identify().collect();
|
||||
new AikeLaier.Seed().quantity(51).identify().collect();
|
||||
new Fadeleaf.Seed().quantity(15).identify().collect();
|
||||
|
||||
new WandOfPrismaticLight().quantity(1).identify().collect();
|
||||
new WandOfRegrowth().quantity(1).identify().collect();
|
||||
new WandOfFrost().quantity(1).identify().collect();
|
||||
new MagicalInfusion().quantity(1).identify().collect();
|
||||
|
|
|
@ -154,6 +154,16 @@ public enum Talent {
|
|||
public String toString() { return Messages.get(this, "name"); }
|
||||
public String desc() { return Messages.get(this, "desc", dispTurns(visualcooldown())); }
|
||||
};
|
||||
public static class LanterCooldown extends FlavourBuff{
|
||||
public int icon() { return BuffIndicator.NONE; }
|
||||
public void tintIcon(Image icon) { icon.hardlight(0.15f, 0.2f, 0.5f); }
|
||||
public float iconFadePercent() { return Math.max(0, visualcooldown() / 50); }
|
||||
public String toString() { return Messages.get(this, "name"); }
|
||||
public String desc() { return Messages.get(this, "desc", dispTurns(visualcooldown())); }
|
||||
};
|
||||
|
||||
|
||||
|
||||
public static class LethalMomentumTracker extends FlavourBuff{};
|
||||
public static class StrikingWaveTracker extends FlavourBuff{};
|
||||
public static class WandPreservationCounter extends CounterBuff{{revivePersists = true;}};
|
||||
|
|
|
@ -56,7 +56,7 @@ public class BlackMimic extends Mimic {
|
|||
}
|
||||
|
||||
@Override
|
||||
protected void generatePrize() {
|
||||
public void generatePrize() {
|
||||
super.generatePrize();
|
||||
//all existing prize items are guaranteed uncursed, and have a 50% chance to be +1 if they were +0
|
||||
for (Item i : items){
|
||||
|
|
|
@ -175,7 +175,7 @@ public class CrystalMimic extends Mimic {
|
|||
}
|
||||
|
||||
@Override
|
||||
protected void generatePrize() {
|
||||
public void generatePrize() {
|
||||
//Crystal mimic already contains a prize item. Just guarantee it isn't cursed.
|
||||
for (Item i : items){
|
||||
i.cursed = false;
|
||||
|
|
|
@ -159,7 +159,7 @@ public class DimandMimic extends Mimic {
|
|||
}
|
||||
|
||||
@Override
|
||||
protected void generatePrize() {
|
||||
public void generatePrize() {
|
||||
super.generatePrize();
|
||||
//all existing prize items are guaranteed uncursed, and have a 50% chance to be +1 if they were +0
|
||||
for (Item i : items){
|
||||
|
|
|
@ -40,8 +40,9 @@ import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter;
|
|||
import com.shatteredpixel.shatteredpixeldungeon.effects.Pushing;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.effects.Speck;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.ElmoParticle;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.RainbowParticle;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.ShadowParticle;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.SparkParticle;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.SnowParticle;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.Heap;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.Item;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.KingsCrown;
|
||||
|
@ -230,6 +231,8 @@ public class DwarfKing extends Mob {
|
|||
} else {
|
||||
summonSubject(3, DKGolem.class);
|
||||
summonSubject(3, DKGolem.class);
|
||||
summonSubject(3, DKBrute.class);
|
||||
summonSubject(3, DKBrute.class);
|
||||
summonsMade += 2;
|
||||
spend(TICK);
|
||||
}
|
||||
|
@ -294,6 +297,8 @@ public class DwarfKing extends Mob {
|
|||
if (summonsMade % 3 == 2) {
|
||||
if (summonsMade % 9 == 8) {
|
||||
return summonSubject(delay, DKGolem.class);
|
||||
} else if (summonsMade % 10 == 8){
|
||||
return summonSubject(delay, DKBrute.class);
|
||||
} else {
|
||||
return summonSubject(delay, Random.Int(2) == 0 ? DKMonk.class : DKWarlock.class);
|
||||
}
|
||||
|
@ -324,7 +329,7 @@ public class DwarfKing extends Mob {
|
|||
private HashSet<Mob> getSubjects(){
|
||||
HashSet<Mob> subjects = new HashSet<>();
|
||||
for (Mob m : Dungeon.level.mobs){
|
||||
if (m.alignment == alignment && (m instanceof Ghoul || m instanceof Monk || m instanceof Warlock || m instanceof Golem)){
|
||||
if (m.alignment == alignment && (m instanceof Ghoul || m instanceof Monk || m instanceof Warlock || m instanceof IceGolem||m instanceof BruteBot)){
|
||||
subjects.add(m);
|
||||
}
|
||||
}
|
||||
|
@ -572,12 +577,19 @@ public class DwarfKing extends Mob {
|
|||
}
|
||||
}
|
||||
|
||||
public static class DKGolem extends Golem {
|
||||
public static class DKGolem extends IceGolem {
|
||||
{
|
||||
state = HUNTING;
|
||||
}
|
||||
}
|
||||
|
||||
public static class DKBrute extends BruteBot {
|
||||
{
|
||||
HP = HT = 75;
|
||||
state = HUNTING;
|
||||
}
|
||||
}
|
||||
|
||||
public static class Summoning extends Buff {
|
||||
|
||||
private int delay;
|
||||
|
@ -595,9 +607,11 @@ public class DwarfKing extends Mob {
|
|||
delay--;
|
||||
|
||||
if (delay <= 0){
|
||||
|
||||
if (summon == DKGolem.class){
|
||||
particles.burst(SparkParticle.FACTORY, 10);
|
||||
particles.burst(SnowParticle.FACTORY, 10);
|
||||
Sample.INSTANCE.play(Assets.Sounds.CHARGEUP);
|
||||
} else if (summon == DKBrute.class){
|
||||
particles.burst(RainbowParticle.BURST, 10);
|
||||
Sample.INSTANCE.play(Assets.Sounds.CHARGEUP);
|
||||
} else if (summon == DKWarlock.class){
|
||||
particles.burst(ShadowParticle.CURSE, 10);
|
||||
|
@ -660,8 +674,10 @@ public class DwarfKing extends Mob {
|
|||
if (on && particles == null) {
|
||||
particles = CellEmitter.get(pos);
|
||||
|
||||
if (summon == DKGolem.class){
|
||||
particles.pour(SparkParticle.STATIC, 0.05f);
|
||||
if (summon == DKBrute.class) {
|
||||
particles.pour(RainbowParticle.BURST, 0.55f);
|
||||
} else if (summon == DKGolem.class){
|
||||
particles.pour(SnowParticle.FACTORY, 0.05f);
|
||||
} else if (summon == DKWarlock.class){
|
||||
particles.pour(ShadowParticle.UP, 0.1f);
|
||||
} else if (summon == DKMonk.class){
|
||||
|
|
|
@ -82,7 +82,7 @@ public class GoldenMimic extends Mimic {
|
|||
}
|
||||
|
||||
@Override
|
||||
protected void generatePrize() {
|
||||
public void generatePrize() {
|
||||
super.generatePrize();
|
||||
//all existing prize items are guaranteed uncursed, and have a 50% chance to be +1 if they were +0
|
||||
for (Item i : items){
|
||||
|
|
|
@ -28,6 +28,7 @@ import com.shatteredpixel.shatteredpixeldungeon.Statistics;
|
|||
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.hollow.HollowMimic;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.effects.Speck;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.Generator;
|
||||
|
@ -104,7 +105,9 @@ public class Mimic extends Mob {
|
|||
|
||||
@Override
|
||||
public String name() {
|
||||
if (alignment == Alignment.NEUTRAL){
|
||||
if (alignment == Alignment.NEUTRAL && properties.contains(Property.HOLLOW)){
|
||||
return Messages.get(HollowMimic.class, "minames");
|
||||
} else if(alignment == Alignment.NEUTRAL) {
|
||||
return Messages.get(Heap.class, "chest");
|
||||
} else {
|
||||
return super.name();
|
||||
|
@ -113,7 +116,9 @@ public class Mimic extends Mob {
|
|||
|
||||
@Override
|
||||
public String description() {
|
||||
if (alignment == Alignment.NEUTRAL){
|
||||
if (alignment == Alignment.NEUTRAL && properties.contains(Property.HOLLOW)) {
|
||||
return Messages.get(HollowMimic.class, "midescs");
|
||||
} else if (alignment == Alignment.NEUTRAL){
|
||||
return Messages.get(Heap.class, "chest_desc") + "\n\n" + Messages.get(this, "hidden_hint");
|
||||
} else {
|
||||
return super.description();
|
||||
|
@ -290,7 +295,7 @@ public class Mimic extends Mob {
|
|||
return m;
|
||||
}
|
||||
|
||||
protected void generatePrize(){
|
||||
public void generatePrize(){
|
||||
Item reward = null;
|
||||
do {
|
||||
switch (Random.Int(5)) {
|
||||
|
|
|
@ -21,10 +21,13 @@
|
|||
|
||||
package com.shatteredpixel.shatteredpixeldungeon.actors.mobs;
|
||||
|
||||
import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.depth;
|
||||
|
||||
import com.shatteredpixel.shatteredpixeldungeon.Assets;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.Badges;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.Challenges;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.Statistics;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
|
||||
|
@ -36,7 +39,10 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
|
|||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Burning;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Doom;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Dread;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Frost;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.HalomethaneBurning;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.LockedFloor;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.RoseShiled;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Terror;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.HeroSubClass;
|
||||
|
@ -47,6 +53,7 @@ import com.shatteredpixel.shatteredpixeldungeon.effects.Lightning;
|
|||
import com.shatteredpixel.shatteredpixeldungeon.effects.Speck;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.BlastParticle;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.FlameParticle;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.HalomethaneFlameParticle;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.SmokeParticle;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.SparkParticle;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.Heap;
|
||||
|
@ -55,6 +62,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.TengusMask;
|
|||
import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.DriedRose;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.LloydsBeacon;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.bombs.Bomb;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.keys.CrystalKey;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.levels.Level;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.levels.PrisonBossLevel;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica;
|
||||
|
@ -204,6 +212,7 @@ public class Tengu extends Mob {
|
|||
if (Dungeon.hero.subClass == HeroSubClass.NONE) {
|
||||
Dungeon.level.drop( new TengusMask(), pos ).sprite.drop();
|
||||
}
|
||||
Dungeon.level.drop( new CrystalKey(depth), pos-1 ).sprite.drop();
|
||||
Statistics.bossScores[1] += 2000;
|
||||
GameScene.bossSlain();
|
||||
super.die( cause );
|
||||
|
@ -218,8 +227,45 @@ public class Tengu extends Mob {
|
|||
yell( Messages.get(this, "defeated") );
|
||||
}
|
||||
|
||||
//7回合的开场动画
|
||||
private int timeLeft = 12;
|
||||
float incTime = 0;
|
||||
@Override
|
||||
protected boolean canAttack( Char enemy ) {
|
||||
/**Tengu Ready Animation
|
||||
天狗动画,切换地块变得河里
|
||||
*/
|
||||
if (timeLeft >= 0 && incTime >= 0){
|
||||
timeLeft -= 1;
|
||||
incTime = 0;
|
||||
|
||||
if(timeLeft == 11){
|
||||
//给予玩家玫瑰结界+冰冻,保证有7回合无敌且无法行动的时间
|
||||
Buff.affect(enemy, Frost.class, timeLeft);
|
||||
Buff.affect(enemy, RoseShiled.class, timeLeft);
|
||||
//给予天狗鬼磷燃烧buff,使它攻击玩家的同时也会布置陷阱。可以提前告知玩家天狗的一阶段行动策略
|
||||
Buff.affect(this, HalomethaneBurning.class ).reignite( this, timeLeft*1000 );
|
||||
GLog.n(Messages.get(Tengu.class, "cut_you"));
|
||||
}
|
||||
|
||||
if(timeLeft == 9){
|
||||
enemy.sprite.showStatus(CharSprite.NEGATIVE, Messages.get(Tengu.class, "rose"));
|
||||
}
|
||||
|
||||
if(timeLeft == 7){
|
||||
this.sprite.showStatus(CharSprite.NEGATIVE, Messages.get(Tengu.class, "cut_you2",enemy.name()));
|
||||
}
|
||||
|
||||
//到达0后,天狗去除磷火buff,并且血量回满
|
||||
if(timeLeft == 0){
|
||||
//TODO 乐,所以还是用到了resetScene()
|
||||
ShatteredPixelDungeon.resetScene();
|
||||
HP = HT;
|
||||
Buff.detach(this, HalomethaneBurning.class );
|
||||
GLog.n(Messages.get(Tengu.class, "ready",enemy.name()));
|
||||
}
|
||||
}
|
||||
|
||||
return new Ballistica( pos, enemy.pos, Ballistica.PROJECTILE).collisionPos == enemy.pos;
|
||||
}
|
||||
|
||||
|
@ -343,6 +389,10 @@ public class Tengu extends Mob {
|
|||
private static final String ARENA_JUMPS = "arena_jumps";
|
||||
private static final String ABILITY_COOLDOWN = "ability_cooldown";
|
||||
|
||||
private static final String ANMONTION_TIME = "an_time";
|
||||
|
||||
private static final String INCE_TIME = "ince_time";
|
||||
|
||||
@Override
|
||||
public void storeInBundle(Bundle bundle) {
|
||||
super.storeInBundle(bundle);
|
||||
|
@ -350,6 +400,10 @@ public class Tengu extends Mob {
|
|||
bundle.put( ABILITIES_USED, abilitiesUsed );
|
||||
bundle.put( ARENA_JUMPS, arenaJumps );
|
||||
bundle.put( ABILITY_COOLDOWN, abilityCooldown );
|
||||
|
||||
bundle.put(ANMONTION_TIME,timeLeft);
|
||||
|
||||
bundle.put(INCE_TIME,incTime);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -362,6 +416,9 @@ public class Tengu extends Mob {
|
|||
arenaJumps = bundle.getInt( ARENA_JUMPS );
|
||||
abilityCooldown = bundle.getInt( ABILITY_COOLDOWN );
|
||||
|
||||
timeLeft =bundle.getInt( ANMONTION_TIME);
|
||||
incTime =bundle.getInt( INCE_TIME);
|
||||
|
||||
BossHealthBar.assignBoss(this);
|
||||
if (HP <= HT/2) BossHealthBar.bleed(true);
|
||||
}
|
||||
|
@ -370,6 +427,9 @@ public class Tengu extends Mob {
|
|||
private boolean yelledCoward = false;
|
||||
|
||||
//tengu is always hunting
|
||||
|
||||
|
||||
|
||||
private class Hunting extends Mob.Hunting{
|
||||
|
||||
@Override
|
||||
|
@ -403,6 +463,7 @@ public class Tengu extends Mob {
|
|||
}
|
||||
|
||||
spend( TICK );
|
||||
|
||||
return true;
|
||||
|
||||
}
|
||||
|
@ -605,7 +666,7 @@ public class Tengu extends Mob {
|
|||
if (PathFinder.distance[cell] < Integer.MAX_VALUE) {
|
||||
Char ch = Actor.findChar(cell);
|
||||
if (ch != null && !(ch instanceof Tengu)) {
|
||||
int dmg = Random.NormalIntRange(5 + Dungeon.depth, 10 + Dungeon.depth * 2);
|
||||
int dmg = Random.NormalIntRange(5 + depth, 10 + depth * 2);
|
||||
dmg -= ch.drRoll();
|
||||
|
||||
if (dmg > 0) {
|
||||
|
@ -842,9 +903,14 @@ public class Tengu extends Mob {
|
|||
|
||||
Char ch = Actor.findChar( cell );
|
||||
if (ch != null && !ch.isImmune(Fire.class) && !(ch instanceof Tengu)) {
|
||||
if(Dungeon.isChallenged(Challenges.STRONGER_BOSSES)){
|
||||
Buff.affect( ch, HalomethaneBurning.class ).reignite( ch );
|
||||
} else {
|
||||
Buff.affect( ch, Burning.class ).reignite( ch );
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (Dungeon.level.flamable[cell]){
|
||||
Dungeon.level.destroy( cell );
|
||||
|
||||
|
@ -857,8 +923,13 @@ public class Tengu extends Mob {
|
|||
}
|
||||
|
||||
burned = true;
|
||||
if(Dungeon.isChallenged(Challenges.STRONGER_BOSSES)){
|
||||
CellEmitter.get(cell).start(HalomethaneFlameParticle.FACTORY, 0.03f, 10);
|
||||
} else {
|
||||
CellEmitter.get(cell).start(FlameParticle.FACTORY, 0.03f, 10);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1027,7 +1098,7 @@ public class Tengu extends Mob {
|
|||
|
||||
Char ch = Actor.findChar(cell);
|
||||
if (ch != null && !(ch instanceof Tengu)){
|
||||
ch.damage(2 + Dungeon.depth, new Electricity());
|
||||
ch.damage(2 + depth, new Electricity());
|
||||
|
||||
if (ch == Dungeon.hero){
|
||||
|
||||
|
|
|
@ -42,6 +42,7 @@ import com.shatteredpixel.shatteredpixeldungeon.sprites.YogSprite;
|
|||
import com.shatteredpixel.shatteredpixeldungeon.tiles.DungeonTilemap;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.ui.BossHealthBar;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
|
||||
import com.watabou.noosa.Camera;
|
||||
import com.watabou.noosa.Game;
|
||||
import com.watabou.noosa.audio.Music;
|
||||
import com.watabou.utils.Bundle;
|
||||
|
@ -386,6 +387,16 @@ public class YogDzewa extends Mob {
|
|||
|
||||
if (Dungeon.isChallenged(Challenges.STRONGER_BOSSES)){
|
||||
addFist((YogFist)Reflection.newInstance(challengeSummons.remove(0)));
|
||||
if(phase == 3){
|
||||
YogFist.FreezingFist freezingFist = new YogFist.FreezingFist();
|
||||
freezingFist.pos = pos-3;
|
||||
GameScene.add(freezingFist);
|
||||
Camera.main.shake(1,3f);
|
||||
GameScene.flash(0x808080,true);
|
||||
YogFist.HaloFist haloFist = new YogFist.HaloFist();
|
||||
haloFist.pos = pos+3;
|
||||
GameScene.add(haloFist);
|
||||
}
|
||||
}
|
||||
|
||||
CellEmitter.get(Dungeon.level.exit-1).burst(ShadowParticle.UP, 25);
|
||||
|
@ -435,6 +446,9 @@ public class YogDzewa extends Mob {
|
|||
GameScene.add(fist, 4);
|
||||
Actor.addDelayed( new Pushing( fist, Dungeon.level.exit, fist.pos ), -1 );
|
||||
Dungeon.level.occupyCell(fist);
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
public void updateVisibility( Level level ){
|
||||
|
|
|
@ -26,19 +26,28 @@ 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.Fire;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Freezing;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.HalomethaneFire;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.ToxicGas;
|
||||
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.buffs.Burning;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Chill;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Cripple;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Frost;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.FrostBurning;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.HalomethaneBurning;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Light;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.LockedFloor;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Ooze;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Roots;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Sleep;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Terror;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.effects.Beam;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.effects.Speck;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.effects.TargetedCell;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.LeafParticle;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.armor.glyphs.Viscosity;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfTeleportation;
|
||||
|
@ -49,11 +58,17 @@ import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
|
|||
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.FistSprite;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.tiles.DungeonTilemap;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.ui.Window;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
|
||||
import com.watabou.noosa.Game;
|
||||
import com.watabou.utils.Bundle;
|
||||
import com.watabou.utils.PathFinder;
|
||||
import com.watabou.utils.Random;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
|
||||
public abstract class YogFist extends Mob {
|
||||
|
||||
{
|
||||
|
@ -67,7 +82,11 @@ public abstract class YogFist extends Mob {
|
|||
maxLvl = -2;
|
||||
|
||||
state = HUNTING;
|
||||
|
||||
properties.add(Property.ICY);
|
||||
properties.add(Property.FIERY);
|
||||
immunities.add(FrostBurning.class);
|
||||
immunities.add(HalomethaneBurning.class);
|
||||
immunities.add(Terror.class);
|
||||
properties.add(Property.BOSS);
|
||||
properties.add(Property.DEMONIC);
|
||||
}
|
||||
|
@ -380,7 +399,7 @@ public abstract class YogFist extends Mob {
|
|||
b.announced = false;
|
||||
b.set(dmg*.6f);
|
||||
b.attachTo(this);
|
||||
sprite.showStatus(CharSprite.WARNING, b.toString() + " " + (int)b.level());
|
||||
sprite.showStatus(CharSprite.WARNING, b + " " + (int)b.level());
|
||||
} else{
|
||||
super.damage(dmg, src);
|
||||
}
|
||||
|
@ -583,4 +602,287 @@ public abstract class YogFist extends Mob {
|
|||
|
||||
}
|
||||
|
||||
public static class FreezingFist extends YogFist {
|
||||
|
||||
{
|
||||
spriteClass = FistSprite.Ice.class;
|
||||
HP = HT = 550;
|
||||
properties.add(Property.ICY);
|
||||
|
||||
properties.add(Property.FIERY);
|
||||
immunities.add(FrostBurning.class);
|
||||
immunities.add(HalomethaneBurning.class);
|
||||
immunities.add(Terror.class);
|
||||
|
||||
|
||||
canRangedInMelee = false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean act() {
|
||||
GameScene.add(Blob.seed(pos, 20, Freezing.class));
|
||||
return super.act();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected void incrementRangedCooldown() {
|
||||
//ranged attack has no cooldown
|
||||
}
|
||||
|
||||
//used so resistances can differentiate between melee and magical attacks
|
||||
public static class LightBeam{}
|
||||
|
||||
@Override
|
||||
protected void zap() {
|
||||
spend( 3f );
|
||||
|
||||
if (hit( this, enemy, true )) {
|
||||
|
||||
enemy.damage( Random.NormalIntRange(10, 20), new LightBeam() );
|
||||
Buff.prolong( enemy, Chill.class, Chill.DURATION/2f );
|
||||
|
||||
if (!enemy.isAlive() && enemy == Dungeon.hero) {
|
||||
Dungeon.fail( getClass() );
|
||||
GLog.n( Messages.get(Char.class, "kill", name()) );
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
enemy.sprite.showStatus( CharSprite.NEUTRAL, enemy.defenseVerb() );
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void damage(int dmg, Object src) {
|
||||
super.damage(dmg, src);
|
||||
LockedFloor buff = Dungeon.hero.buff(LockedFloor.class);
|
||||
if (buff != null) {
|
||||
buff.addTime(dmg * 0.5f);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static class HaloFist extends YogFist {
|
||||
|
||||
{
|
||||
HP = HT = 550;
|
||||
spriteClass = FistSprite.HaloFist.class;
|
||||
properties.add(Property.FIERY);
|
||||
immunities.add(FrostBurning.class);
|
||||
immunities.add(HalomethaneBurning.class);
|
||||
immunities.add(Terror.class);
|
||||
}
|
||||
|
||||
private int phase = 1;
|
||||
|
||||
private int summonsMade = 0;
|
||||
private static final int MIN_ABILITY_CD = 7;
|
||||
private int lastHeroPos;
|
||||
private static final int MAX_ABILITY_CD = 12;
|
||||
private float summonCooldown = 0;
|
||||
private float abilityCooldown = 3;
|
||||
|
||||
private static float[] chanceMap = {0f, 100f, 100f, 100f, 100f, 100f, 100f};
|
||||
private int wave=0;
|
||||
|
||||
private int lastAbility = 0;
|
||||
|
||||
private static final String PHASE = "phase";
|
||||
private static final String SUMMONS_MADE = "summons_made";
|
||||
|
||||
private static final String SUMMON_CD = "summon_cd";
|
||||
private static final String ABILITY_CD = "ability_cd";
|
||||
private static final String LAST_ABILITY = "last_ability";
|
||||
|
||||
private static final String TARGETED_CELLS = "targeted_cells";
|
||||
private ArrayList<Integer> targetedCells = new ArrayList<>();
|
||||
@Override
|
||||
public void storeInBundle(Bundle bundle) {
|
||||
super.storeInBundle(bundle);
|
||||
bundle.put( PHASE, phase );
|
||||
bundle.put( SUMMONS_MADE, summonsMade );
|
||||
bundle.put( SUMMON_CD, summonCooldown );
|
||||
bundle.put( ABILITY_CD, abilityCooldown );
|
||||
bundle.put( LAST_ABILITY, lastAbility );
|
||||
bundle.put("wavePhase2", wave);
|
||||
|
||||
//暴力Boss
|
||||
int[] bundleArr = new int[targetedCells.size()];
|
||||
for (int i = 0; i < targetedCells.size(); i++){
|
||||
bundleArr[i] = targetedCells.get(i);
|
||||
}
|
||||
bundle.put(TARGETED_CELLS, bundleArr);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void restoreFromBundle(Bundle bundle) {
|
||||
super.restoreFromBundle(bundle);
|
||||
phase = bundle.getInt( PHASE );
|
||||
summonsMade = bundle.getInt( SUMMONS_MADE );
|
||||
summonCooldown = bundle.getFloat( SUMMON_CD );
|
||||
abilityCooldown = bundle.getFloat( ABILITY_CD );
|
||||
lastAbility = bundle.getInt( LAST_ABILITY );
|
||||
wave = bundle.getInt("wavePhase2");
|
||||
|
||||
if (phase == 2) properties.add(Property.IMMOVABLE);
|
||||
|
||||
//暴力Boss
|
||||
int[] bundleArr = new int[targetedCells.size()];
|
||||
for (int i = 0; i < targetedCells.size(); i++){
|
||||
bundleArr[i] = targetedCells.get(i);
|
||||
}
|
||||
bundle.put(TARGETED_CELLS, bundleArr);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void die( Object cause ) {
|
||||
GLog.n(Messages.get(YogFist.class,"HaloFist"));
|
||||
for (Mob boss : Dungeon.level.mobs.toArray(new Mob[0])) {
|
||||
if (boss instanceof FreezingFist) {
|
||||
boss.properties.remove(Property.FIERY);
|
||||
boss.remove(FrostBurning.class);
|
||||
boss.remove(HalomethaneBurning.class);
|
||||
}
|
||||
}
|
||||
super.die( cause );
|
||||
}
|
||||
public static class DarkBolt{}
|
||||
public void doDiedLasers(){
|
||||
boolean terrainAffected = false;
|
||||
HashSet<Char> affected = new HashSet<>();
|
||||
//delay fire on a rooted hero
|
||||
if(enemy != null) {
|
||||
if (!enemy.rooted) {
|
||||
for (int i : targetedCells) {
|
||||
Ballistica b = new Ballistica(i, lastHeroPos, Ballistica.WONT_STOP);
|
||||
//shoot beams
|
||||
sprite.parent.add(new Beam.DeathRay(DungeonTilemap.raisedTileCenterToWorld(i),
|
||||
DungeonTilemap.raisedTileCenterToWorld(b.collisionPos)));
|
||||
for (int p : b.path) {
|
||||
Char ch = Actor.findChar(p);
|
||||
if (ch != null && (ch.alignment != alignment || ch instanceof Bee)) {
|
||||
affected.add(ch);
|
||||
}
|
||||
if (Dungeon.level.flamable[p]) {
|
||||
Dungeon.level.destroy(p);
|
||||
GameScene.updateMap(p);
|
||||
terrainAffected = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (terrainAffected) {
|
||||
Dungeon.observe();
|
||||
}
|
||||
for (Char ch : affected) {
|
||||
ch.damage(Random.NormalIntRange(28, 42),new DarkBolt());
|
||||
|
||||
if (Dungeon.level.heroFOV[pos]) {
|
||||
ch.sprite.flash();
|
||||
CellEmitter.center(pos).burst(Speck.factory(Speck.COIN), Random.IntRange(6,12));
|
||||
}
|
||||
if (!ch.isAlive() && ch == Dungeon.hero) {
|
||||
Dungeon.fail(getClass());
|
||||
GLog.n(Messages.get(Char.class, "kill", name()));
|
||||
}
|
||||
}
|
||||
targetedCells.clear();
|
||||
}
|
||||
}
|
||||
if(enemy != null) {
|
||||
if (abilityCooldown <= 0 && HP < HT * 0.8f) {
|
||||
lastHeroPos = enemy.pos;
|
||||
|
||||
int beams = (int) (4 + (HP * 1.0f / HT) * 2);
|
||||
for (int i = 0; i < beams; i++) {
|
||||
int randompos = Random.Int(Dungeon.level.width()) + Dungeon.level.width() * 2;
|
||||
targetedCells.add(randompos);
|
||||
}
|
||||
|
||||
for (int i : targetedCells) {
|
||||
Ballistica b = new Ballistica(i, enemy.pos, Ballistica.WONT_STOP);
|
||||
|
||||
for (int p : b.path) {
|
||||
Game.scene().addToFront(new TargetedCell(p, Window.GDX_COLOR));
|
||||
}
|
||||
}
|
||||
|
||||
spend(TICK * 1.5f);
|
||||
Dungeon.hero.interrupt();
|
||||
abilityCooldown += Random.NormalFloat(MIN_ABILITY_CD - 2 * (1 - (HP * 1f / HT)),
|
||||
MAX_ABILITY_CD - 5 * (1 - (HP * 1f / HT)));
|
||||
} else {
|
||||
spend(TICK);
|
||||
}
|
||||
}
|
||||
if (abilityCooldown > 0) abilityCooldown-= 5;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean act() {
|
||||
GameScene.add(Blob.seed(pos, 20, HalomethaneFire.class));
|
||||
doDiedLasers();
|
||||
boolean result = super.act();
|
||||
|
||||
if (Dungeon.level.map[pos] == Terrain.WATER){
|
||||
Level.set( pos, Terrain.EMPTY);
|
||||
GameScene.updateMap( pos );
|
||||
CellEmitter.get( pos ).burst( Speck.factory( Speck.STEAM ), 10 );
|
||||
}
|
||||
|
||||
//1.67 evaporated tiles on average
|
||||
int evaporatedTiles = Random.chances(new float[]{0, 1, 2});
|
||||
|
||||
for (int i = 0; i < evaporatedTiles; i++) {
|
||||
int cell = pos + PathFinder.NEIGHBOURS8[Random.Int(8)];
|
||||
if (Dungeon.level.map[cell] == Terrain.WATER){
|
||||
Level.set( cell, Terrain.EMPTY);
|
||||
GameScene.updateMap( cell );
|
||||
CellEmitter.get( cell ).burst( Speck.factory( Speck.STEAM ), 10 );
|
||||
}
|
||||
}
|
||||
|
||||
for (int i : PathFinder.NEIGHBOURS9) {
|
||||
int vol = HalomethaneFire.volumeAt(pos+i, HalomethaneFire.class);
|
||||
if (vol < 4 && !Dungeon.level.water[pos + i] && !Dungeon.level.solid[pos + i]){
|
||||
GameScene.add( Blob.seed( pos + i, 4 - vol, HalomethaneFire.class ) );
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void zap() {
|
||||
spend( 1f );
|
||||
|
||||
if (Dungeon.level.map[enemy.pos] == Terrain.WATER){
|
||||
Level.set( enemy.pos, Terrain.EMPTY);
|
||||
GameScene.updateMap( enemy.pos );
|
||||
CellEmitter.get( enemy.pos ).burst( Speck.factory( Speck.STEAM ), 10 );
|
||||
} else {
|
||||
Buff.affect( enemy, HalomethaneBurning.class ).reignite( enemy );
|
||||
}
|
||||
|
||||
for (int i : PathFinder.NEIGHBOURS9){
|
||||
if (!Dungeon.level.water[enemy.pos+i] && !Dungeon.level.solid[enemy.pos+i]){
|
||||
int vol = HalomethaneFire.volumeAt(enemy.pos+i, HalomethaneFire.class);
|
||||
if (vol < 4){
|
||||
GameScene.add( Blob.seed( enemy.pos + i, 4 - vol, HalomethaneFire.class ) );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
{
|
||||
immunities.add(Frost.class);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -0,0 +1,110 @@
|
|||
package com.shatteredpixel.shatteredpixeldungeon.actors.mobs.bosses;
|
||||
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.Boss;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Roots;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.effects.SpellSprite;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.CerberusSprite;
|
||||
import com.watabou.utils.Bundle;
|
||||
import com.watabou.utils.Random;
|
||||
|
||||
public class Cerberus extends Boss {
|
||||
|
||||
{
|
||||
initProperty();
|
||||
initBaseStatus(20, 40, 30, 8, 800, 14, 9);
|
||||
initStatus(100);
|
||||
spriteClass = CerberusSprite.class;
|
||||
}
|
||||
|
||||
//技能条
|
||||
public float skillLevel;
|
||||
|
||||
//攻击次数
|
||||
public int attackKills;
|
||||
|
||||
//阶段转换
|
||||
public int phase;
|
||||
|
||||
@Override
|
||||
public void storeInBundle(Bundle bundle) {
|
||||
super.storeInBundle(bundle);
|
||||
bundle.put("phaseCR", phase);
|
||||
bundle.put("skillLevelCR", skillLevel);
|
||||
bundle.put("attackKillsCR",attackKills);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void restoreFromBundle(Bundle bundle) {
|
||||
super.restoreFromBundle(bundle);
|
||||
phase = bundle.getInt("phaseCR");
|
||||
skillLevel = bundle.getFloat("skillLevelCR");
|
||||
attackKills = bundle.getInt("attackKillsCR");
|
||||
}
|
||||
|
||||
//ACT暂时注释
|
||||
// @Override
|
||||
// public boolean act(){
|
||||
// return super.act();
|
||||
// }
|
||||
|
||||
@Override
|
||||
protected boolean doAttack( Char enemy ) {
|
||||
switch (phase){
|
||||
default:
|
||||
case 0:
|
||||
NightmareRoot();
|
||||
break;
|
||||
// case 1:
|
||||
// SoulReCharges(enemy);
|
||||
// break;
|
||||
// case 2:
|
||||
// HellDogBack(enemy);
|
||||
// break;
|
||||
// case 3:
|
||||
// CrystalActive(enemy);
|
||||
// break;
|
||||
// case 4:
|
||||
// TrueOrFalse(enemy);
|
||||
// break;
|
||||
// case 5:
|
||||
// DiedGlyphs(enemy);
|
||||
// break;
|
||||
// case 6:
|
||||
// NoWorldMaster(enemy);
|
||||
// break;
|
||||
}
|
||||
return super.doAttack( enemy );
|
||||
}
|
||||
|
||||
@Override
|
||||
public int attackProc( Char enemy, int damage ) {
|
||||
damage = super.attackProc( enemy, damage );
|
||||
if(attackKills>=3){
|
||||
((CerberusSprite)sprite).Skills(pos);
|
||||
}
|
||||
|
||||
return damage;
|
||||
}
|
||||
|
||||
//技能1:噩梦缠绕
|
||||
private void NightmareRoot(){
|
||||
attackKills++;
|
||||
if(attackKills>=3){
|
||||
SpellSprite.show(this, SpellSprite.CHARGE);
|
||||
}
|
||||
}
|
||||
|
||||
private void NightmareRootAtive(Char enmey){
|
||||
enmey.damage(Random.NormalIntRange((int)(baseMin*1.15), (int)(baseMax*1.15)),damageRoll());
|
||||
Buff.prolong( enemy, Roots.class, 3f );
|
||||
spend(attackDelay()*3f);
|
||||
clearReset();
|
||||
}
|
||||
|
||||
private void clearReset(){
|
||||
attackKills = 0;
|
||||
}
|
||||
|
||||
}
|
|
@ -219,6 +219,10 @@ public class DiamondKnight extends Boss {
|
|||
Dungeon.level.seal();
|
||||
}
|
||||
|
||||
int hpBracket = HT / 6;
|
||||
|
||||
dmg = Math.min(hpBracket, dmg);
|
||||
|
||||
super.damage(dmg, src);
|
||||
LockedFloor lock = hero.buff(LockedFloor.class);
|
||||
if (lock != null) lock.addTime(dmg*2);
|
||||
|
@ -226,6 +230,7 @@ public class DiamondKnight extends Boss {
|
|||
ColdChestBossLevel.State level = ((ColdChestBossLevel)Dungeon.level).pro();
|
||||
//血量低于360后追加phase并加载楼层的进度方法,加载迷宫
|
||||
if (level == ColdChestBossLevel.State.START && this.HP <= 360 && phase == 0) {
|
||||
HP = 360;
|
||||
Actor.add(new Actor() {
|
||||
|
||||
{
|
||||
|
@ -243,10 +248,12 @@ public class DiamondKnight extends Boss {
|
|||
}
|
||||
});
|
||||
} else if (level == ColdChestBossLevel.State.VSBOSS_START && this.HP <= 240 && phase == 2) {
|
||||
HP = 240;
|
||||
((ColdChestBossLevel)Dungeon.level).progress();
|
||||
phase++;
|
||||
//血量低于200后变成玩家的样子,伤害和防御数值与玩家一致
|
||||
} else if (level == ColdChestBossLevel.State.VSLINK_START && this.HP <= 200 && phase == 3) {
|
||||
HP = 200;
|
||||
Actor.add(new Actor() {
|
||||
|
||||
{
|
||||
|
@ -262,13 +269,14 @@ public class DiamondKnight extends Boss {
|
|||
GameScene.flash(0x808080);
|
||||
((ColdChestBossLevel)Dungeon.level).progress();
|
||||
spriteClass=DimandKingSprite.PrismaticSprite.class;
|
||||
ShatteredPixelDungeon.switchNoFade(GameScene.class);
|
||||
ShatteredPixelDungeon.resetScene();
|
||||
GameScene.flash(0x888888);
|
||||
return true;
|
||||
}
|
||||
});
|
||||
//最终决斗
|
||||
} else if (level == ColdChestBossLevel.State.VSYOU_START && this.HP <= 100 && phase == 4) {
|
||||
HP = 100;
|
||||
Actor.add(new Actor() {
|
||||
|
||||
{
|
||||
|
@ -282,7 +290,7 @@ public class DiamondKnight extends Boss {
|
|||
GLog.n(Messages.get(DiamondKnight.class,"ok_go"));
|
||||
GameScene.flash(0x808080);
|
||||
spriteClass=DimandKingSprite.class;
|
||||
ShatteredPixelDungeon.switchNoFade(GameScene.class);
|
||||
ShatteredPixelDungeon.resetScene();
|
||||
GameScene.flash(0x888888);
|
||||
((ColdChestBossLevel)Dungeon.level).progress();
|
||||
phase++;
|
||||
|
@ -372,11 +380,11 @@ public class DiamondKnight extends Boss {
|
|||
bundle.put( HEALINC, healInc );
|
||||
bundle.put(COMBO, combo);
|
||||
|
||||
if(phase == 5) {
|
||||
spriteClass=DimandKingSprite.PrismaticSprite.class;
|
||||
} else {
|
||||
spriteClass=DimandKingSprite.class;
|
||||
}
|
||||
// if(phase == 5) {
|
||||
// spriteClass=DimandKingSprite.PrismaticSprite.class;
|
||||
// } else {
|
||||
// spriteClass=DimandKingSprite.class;
|
||||
// }
|
||||
|
||||
}
|
||||
|
||||
|
@ -391,7 +399,7 @@ public class DiamondKnight extends Boss {
|
|||
//if check is for pre-0.9.3 saves
|
||||
healInc = bundle.getInt(HEALINC);
|
||||
|
||||
if(phase == 5) {
|
||||
if(phase == 5 || phase == 6) {
|
||||
spriteClass=DimandKingSprite.PrismaticSprite.class;
|
||||
} else {
|
||||
spriteClass=DimandKingSprite.class;
|
||||
|
|
|
@ -457,7 +457,7 @@ public class SakaFishBoss extends Boss {
|
|||
endPos = leapPos;
|
||||
}
|
||||
|
||||
//do leap
|
||||
//do leap 泥头车
|
||||
sprite.visible = Dungeon.level.heroFOV[pos] || Dungeon.level.heroFOV[leapPos] || Dungeon.level.heroFOV[endPos];
|
||||
sprite.dirtcar(pos, leapPos, new Callback() {
|
||||
@Override
|
||||
|
|
|
@ -17,11 +17,6 @@ public class Frankenstein extends Mob {
|
|||
properties.add(Char.Property.HOLLOW);
|
||||
}
|
||||
|
||||
// @Override
|
||||
// protected boolean act() {
|
||||
// return super.act();
|
||||
// }
|
||||
|
||||
@Override
|
||||
public int damageRoll() {
|
||||
return Random.NormalIntRange( 15, 27 );
|
||||
|
|
|
@ -0,0 +1,50 @@
|
|||
package com.shatteredpixel.shatteredpixeldungeon.actors.mobs.hollow;
|
||||
|
||||
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mimic;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.Item;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.MimicSprite;
|
||||
import com.watabou.utils.Random;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
public class HollowMimic extends Mimic {
|
||||
|
||||
{
|
||||
spriteClass = MimicSprite.HollowWall.class;
|
||||
properties.add( Property.HOLLOW );
|
||||
HP = HT= Random.Int(35,60);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int damageRoll() {
|
||||
return Random.NormalIntRange( 30, 50 );
|
||||
}
|
||||
|
||||
@Override
|
||||
public int drRoll() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
public static HollowMimic spawnAt(int pos, Item item, Class mimicType ){
|
||||
return spawnAt( pos, Arrays.asList(item), mimicType);
|
||||
}
|
||||
|
||||
public static HollowMimic spawnAt(int pos, List<Item> items, Class mimicType ) {
|
||||
|
||||
HollowMimic m;
|
||||
m = new HollowMimic();
|
||||
|
||||
|
||||
m.items = new ArrayList<>( items );
|
||||
m.setLevel( Dungeon.depth );
|
||||
m.pos = pos;
|
||||
|
||||
//generate an extra reward for killing the mimic
|
||||
m.generatePrize();
|
||||
|
||||
return m;
|
||||
}
|
||||
}
|
|
@ -37,6 +37,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.BrokenSeal;
|
|||
import com.shatteredpixel.shatteredpixeldungeon.items.EquipableItem;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.Item;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.armor.Armor;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.lightblack.OilPotion;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.quest.DarkGold;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.quest.Pickaxe;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfUpgrade;
|
||||
|
@ -223,6 +224,10 @@ public class Blacksmith extends NPC {
|
|||
return Messages.get(Blacksmith.class, "un_ided");
|
||||
}
|
||||
|
||||
if (item1 instanceof OilPotion || item2 instanceof OilPotion) {
|
||||
return Messages.get(Blacksmith.class, "oil");
|
||||
}
|
||||
|
||||
if (item1.cursed || item2.cursed ||
|
||||
(item1 instanceof Armor && ((Armor) item1).hasCurseGlyph()) ||
|
||||
(item2 instanceof Armor && ((Armor) item2).hasCurseGlyph()) ||
|
||||
|
|
|
@ -4,17 +4,11 @@ import static com.shatteredpixel.shatteredpixeldungeon.BGMPlayer.playBGM;
|
|||
import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.hero;
|
||||
|
||||
import com.shatteredpixel.shatteredpixeldungeon.Assets;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.BGMPlayer;
|
||||
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.buffs.Buff;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.ElmoParticle;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.Heap;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.journal.Notes;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.NxhySprite;
|
||||
|
||||
public class Nxhy extends Shopkeeper {
|
||||
|
@ -32,7 +26,12 @@ public class Nxhy extends Shopkeeper {
|
|||
yell(Messages.get(this, "greetings", Dungeon.hero.name()));
|
||||
seenBefore = true;
|
||||
playBGM(Assets.SHOP, true);
|
||||
} else if(seenBefore && !Dungeon.level.heroFOV[pos]) {
|
||||
seenBefore = false;
|
||||
yell(Messages.get(this, "goodbye", hero.name()));
|
||||
BGMPlayer.playBGMWithDepth();
|
||||
}
|
||||
|
||||
if (Dungeon.level.heroFOV[pos]){
|
||||
Notes.add(Notes.Landmark.SHOP);
|
||||
}
|
||||
|
@ -43,49 +42,10 @@ public class Nxhy extends Shopkeeper {
|
|||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void damage( int dmg, Object src ) {
|
||||
flee();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int defenseSkill( Char enemy ) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void add( Buff buff ) {
|
||||
flee();
|
||||
}
|
||||
|
||||
|
||||
public void flee() {
|
||||
destroy();
|
||||
Notes.remove(Notes.Landmark.SHOP);
|
||||
CellEmitter.get(pos).burst(ElmoParticle.FACTORY, 6);
|
||||
hero.sprite.burst(15597568, 9);
|
||||
sprite.killAndErase();
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public void destroy() {
|
||||
Actor.remove( this );
|
||||
HP = 0;
|
||||
for (Heap heap: Dungeon.level.heaps.valueList()) {
|
||||
if (heap.type == Heap.Type.FOR_SALE) {
|
||||
if (ShatteredPixelDungeon.scene() instanceof GameScene) {
|
||||
CellEmitter.get(heap.pos).burst(ElmoParticle.FACTORY, 4);
|
||||
}
|
||||
if (heap.size() == 1) {
|
||||
heap.destroy();
|
||||
} else {
|
||||
heap.items.remove(heap.size()-1);
|
||||
heap.type = Heap.Type.HEAP;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -47,7 +47,6 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.OGPDLLS;
|
|||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.OGPDNQHZ;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.OGPDZSLS;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Piranha;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Rat;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.RedMurderer;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.RedSwarm;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.RipperDemon;
|
||||
|
@ -73,6 +72,7 @@ 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.bosses.Cerberus;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.spical.SlimeKingMob;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.custom.dict.DictSpriteSheet;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.custom.messages.M;
|
||||
|
@ -450,7 +450,7 @@ public class MobPlacer extends TestItem{
|
|||
}
|
||||
|
||||
private enum DataPack{
|
||||
RAT(Rat.class, DictSpriteSheet.RAT),
|
||||
RAT(Cerberus.class, DictSpriteSheet.RAT),
|
||||
FLWW(FlowerSlime.class, DictSpriteSheet.FLOWER),
|
||||
//TESTRAT(TestRat.class, DictSpriteSheet.RAT),
|
||||
GNOLL(Gnoll.class, DictSpriteSheet.GNOLL),
|
||||
|
|
|
@ -21,6 +21,10 @@
|
|||
|
||||
package com.shatteredpixel.shatteredpixeldungeon.items.keys;
|
||||
|
||||
import com.shatteredpixel.shatteredpixeldungeon.Conducts;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
|
||||
|
||||
public class CrystalKey extends Key {
|
||||
|
@ -38,5 +42,13 @@ public class CrystalKey extends Key {
|
|||
this.depth = depth;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean doPickUp(Hero hero, int pos) {
|
||||
if(depth == 10 || (Dungeon.isDLC(Conducts.Conduct.BOSSRUSH) && (depth == 8))){
|
||||
ShatteredPixelDungeon.resetScene();
|
||||
}
|
||||
return super.doPickUp(hero, pos);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -12,7 +12,7 @@ public class OilPotion extends Item {
|
|||
|
||||
public OilPotion() {
|
||||
image = ItemSpriteSheet.SKPOTION;
|
||||
stackable = true;
|
||||
stackable = false;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -21,15 +21,19 @@
|
|||
|
||||
package com.shatteredpixel.shatteredpixeldungeon.items.wands;
|
||||
|
||||
import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.hero;
|
||||
|
||||
import com.shatteredpixel.shatteredpixeldungeon.Assets;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.Challenges;
|
||||
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.buffs.Blindness;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Cripple;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Light;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.effects.Beam;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.effects.Speck;
|
||||
|
@ -69,9 +73,12 @@ public class WandOfPrismaticLight extends DamageWand {
|
|||
affectMap(beam);
|
||||
|
||||
if (Dungeon.level.viewDistance < 6 ){
|
||||
if (Dungeon.isChallenged(Challenges.DARKNESS)){
|
||||
if(Dungeon.isChallenged(Challenges.DHXD) && hero.buff(Talent.LanterCooldown.class) == null || Statistics.lanterfireactive && hero.buff(Talent.LanterCooldown.class) == null){
|
||||
hero.healLantern(5f);
|
||||
Buff.affect(curUser, Talent.LanterCooldown.class, 200f);
|
||||
} else if (Dungeon.isChallenged(Challenges.DARKNESS) && !Dungeon.isChallenged(Challenges.DHXD)){
|
||||
Buff.prolong( curUser, Light.class, 2f + buffedLvl());
|
||||
} else {
|
||||
} else if(!Dungeon.isChallenged(Challenges.DHXD)) {
|
||||
Buff.prolong( curUser, Light.class, 10f+buffedLvl()*5);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -195,6 +195,7 @@ public class BloodthirstyThorn extends MeleeWeapon {
|
|||
if(chaliceOfBlood!=null){
|
||||
bloodthirstyThorn.level=chaliceOfBlood.level();
|
||||
} else {
|
||||
//如果圣杯物品为空,则读取本局全局玩家献祭圣杯的次数
|
||||
bloodthirstyThorn.level=Statistics.ChaicBlood;
|
||||
}
|
||||
|
||||
|
|
|
@ -521,6 +521,8 @@ public class ColdChestBossLevel extends Level {
|
|||
if(boss instanceof DiamondKnight) {
|
||||
//如果楼层为开始且boss血量小于200 4阶段
|
||||
if (pro == VSLINK_START && boss.HP <= 200) {
|
||||
Buff.detach(boss, ChampionEnemy.Halo.class);
|
||||
((DiamondKnight) boss).baseSpeed *= 2;
|
||||
pro = VSYOU_START;
|
||||
}
|
||||
}
|
||||
|
@ -533,7 +535,7 @@ public class ColdChestBossLevel extends Level {
|
|||
//如果楼层为开始且boss血量小于100 判定WIN
|
||||
if (pro == VSYOU_START && boss.HP <= 100) {
|
||||
pro = WIN;
|
||||
Buff.detach(boss, ChampionEnemy.Halo.class);
|
||||
//Buff.detach(boss, ChampionEnemy.Halo.class);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,6 +2,7 @@ package com.shatteredpixel.shatteredpixeldungeon.levels;
|
|||
|
||||
import com.shatteredpixel.shatteredpixeldungeon.Assets;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.hollow.HollowMimic;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.Wandmaker;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.levels.painters.Painter;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.levels.painters.PrisonPainter;
|
||||
|
@ -104,6 +105,8 @@ public class HollowLevel extends RegularLevel {
|
|||
switch (tile) {
|
||||
case Terrain.WATER:
|
||||
return Messages.get(PrisonLevel.class, "water_name");
|
||||
case Terrain.WALL_DECO:
|
||||
return Messages.get(HollowMimic.class, "minames");
|
||||
default:
|
||||
return super.tileName( tile );
|
||||
}
|
||||
|
@ -112,6 +115,8 @@ public class HollowLevel extends RegularLevel {
|
|||
@Override
|
||||
public String tileDesc(int tile) {
|
||||
switch (tile) {
|
||||
case Terrain.WALL_DECO:
|
||||
return Messages.get(HollowMimic.class, "midescs");
|
||||
case Terrain.EMPTY_DECO:
|
||||
return Messages.get(PrisonLevel.class, "empty_deco_desc");
|
||||
case Terrain.BOOKSHELF:
|
||||
|
|
|
@ -107,7 +107,7 @@ public class PrisonBossLevel extends Level {
|
|||
|
||||
@Override
|
||||
public String tilesTex() {
|
||||
return Assets.Environment.TILES_PRISON;
|
||||
return locked ? Assets.Environment.TILES_TENGUS : Assets.Environment.TILES_PRISON;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -300,7 +300,7 @@ public class PrisonBossLevel extends Level {
|
|||
customWalls.add(vis);
|
||||
GameScene.add(vis, true);
|
||||
|
||||
Painter.set(this, tenguCell.left+4, tenguCell.top, Terrain.DOOR);
|
||||
Painter.set(this, tenguCell.left+4, tenguCell.top, Terrain.CRYSTAL_DOOR);
|
||||
|
||||
int cell = pointToCell(endStart);
|
||||
int i = 0;
|
||||
|
@ -398,7 +398,12 @@ public class PrisonBossLevel extends Level {
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
seal();
|
||||
GameScene.flash(0x80aaaaaa);
|
||||
Camera.main.shake(1f,2f);
|
||||
GameScene.bossReady();
|
||||
|
||||
set(pointToCell(tenguCellDoor), Terrain.LOCKED_DOOR);
|
||||
GameScene.updateMap(pointToCell(tenguCellDoor));
|
||||
|
||||
|
@ -510,6 +515,8 @@ public class PrisonBossLevel extends Level {
|
|||
Sample.INSTANCE.play(Assets.Sounds.BLAST);
|
||||
|
||||
state = State.WON;
|
||||
GameScene.updateMap();
|
||||
GameScene.flash(0x80FFFFFF);
|
||||
Game.runOnRenderThread(new Callback() {
|
||||
@Override
|
||||
public void call() {
|
||||
|
@ -525,7 +532,6 @@ public class PrisonBossLevel extends Level {
|
|||
@Override
|
||||
public void occupyCell(Char ch) {
|
||||
super.occupyCell(ch);
|
||||
|
||||
if (ch == Dungeon.hero){
|
||||
switch (state){
|
||||
case START:
|
||||
|
@ -534,7 +540,6 @@ public class PrisonBossLevel extends Level {
|
|||
}
|
||||
break;
|
||||
case FIGHT_PAUSE:
|
||||
|
||||
if (cellToPoint(ch.pos).y <= startHallway.top+1){
|
||||
progress();
|
||||
}
|
||||
|
|
|
@ -73,19 +73,26 @@ public class PrisonPainter extends RegularPainter {
|
|||
if (map[i] == Terrain.WALL &&
|
||||
(map[i + w] == Terrain.EMPTY || map[i + w] == Terrain.EMPTY_SP) &&
|
||||
Random.Int( 6 ) == 0) {
|
||||
|
||||
map[i] = Terrain.WALL_DECO;
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = w; i < l - w; i++) {
|
||||
if (map[i] == Terrain.WALL &&
|
||||
map[i - w] == Terrain.WALL &&
|
||||
(map[i + w] == Terrain.EMPTY || map[i + w] == Terrain.EMPTY_SP) &&
|
||||
Random.Int( 3 ) == 0) {
|
||||
|
||||
if (map[i] == Terrain.WALL && map[i - w] == Terrain.WALL && map[i + w] == Terrain.WATER && Random.Int(2) == 0) {
|
||||
map[i] = Terrain.WALL_DECO;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
// for (int i=w; i < l - w; i++) {
|
||||
// if (map[i] == Terrain.WALL &&
|
||||
// map[i - w] == Terrain.WALL &&
|
||||
// (map[i + w] == Terrain.EMPTY || map[i + w] == Terrain.EMPTY_SP) &&
|
||||
// Random.Int( 3 ) == 0) {
|
||||
// level.mobs.add(HollowMimic.spawnAt(i,( Generator.randomUsingDefaults( Generator.Category.ARMOR ) ),
|
||||
// HollowMimic.class));
|
||||
// map[i] = Terrain.WALL;
|
||||
// }
|
||||
// }
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1528,6 +1528,11 @@ public class GameScene extends PixelScene {
|
|||
bossSlain.show( Window.CYELLOW, 0.3f, 5f);
|
||||
scene.showBanner(bossSlain);
|
||||
break;
|
||||
case 10:
|
||||
bossSlain.texture(Assets.Interfaces.Tengu_Title);
|
||||
bossSlain.show( Window.R_COLOR, 0.3f, 4f);
|
||||
scene.showBanner(bossSlain);
|
||||
break;
|
||||
case 14:
|
||||
bossSlain.texture(Assets.Interfaces.DMOR_Title);
|
||||
bossSlain.show( Window.CBLACK, 0.3f, 5f);
|
||||
|
@ -1570,6 +1575,11 @@ public class GameScene extends PixelScene {
|
|||
bossSlain.show( Window.CYELLOW, 0.3f, 5f);
|
||||
scene.showBanner(bossSlain);
|
||||
break;
|
||||
case 10:
|
||||
bossSlain.texture(Assets.Interfaces.Tengu_Clear);
|
||||
bossSlain.show( Window.R_COLOR, 0.2f, 5f);
|
||||
scene.showBanner(bossSlain);
|
||||
break;
|
||||
case 14:
|
||||
bossSlain.texture(Assets.Interfaces.DMOR_Clear);
|
||||
bossSlain.show( Window.GDX_COLOR, 0.3f, 5f);
|
||||
|
|
|
@ -1,6 +1,10 @@
|
|||
package com.shatteredpixel.shatteredpixeldungeon.scenes;
|
||||
|
||||
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.ui.Archs;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.ui.ExitButton;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.ui.RenderedTextBlock;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.ui.Window;
|
||||
import com.watabou.noosa.Camera;
|
||||
|
||||
//怪物图鉴 尚未完成
|
||||
|
@ -17,6 +21,19 @@ public class MobCatLogScene extends PixelScene {
|
|||
Archs archs = new Archs();
|
||||
archs.setSize(w,h);
|
||||
addToBack(archs);
|
||||
|
||||
ExitButton btnExit = new ExitButton();
|
||||
btnExit.setPos( w - btnExit.width(), 0 );
|
||||
add( btnExit );
|
||||
|
||||
RenderedTextBlock title = PixelScene.renderTextBlock( Messages.get(this, "title"), 9);
|
||||
title.hardlight(Window.TITLE_COLOR);
|
||||
title.setPos(
|
||||
(w - title.width()) / 2f,
|
||||
(20 - title.height()) / 2f
|
||||
);
|
||||
align(title);
|
||||
add(title);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -78,22 +78,40 @@ public class ThanksScene extends PixelScene {
|
|||
content.add(ptr);
|
||||
//*** Special Thanks ***
|
||||
|
||||
CreditsBlock specialThanks = new CreditsBlock(true, 0xffffff,
|
||||
"Original Music By Prohonor",
|
||||
CreditsBlock specialThanksX = new CreditsBlock(true, 0x808080,
|
||||
"Original Music One By Prohonor",
|
||||
new Image("ptr.png", 0, 0, 32, 32),
|
||||
null,
|
||||
null,
|
||||
null);
|
||||
specialThanks.setRect((Camera.main.width - colWidth)/2f-10, ptr.bottom()+6, colWidth+20, 0);
|
||||
content.add(specialThanks);
|
||||
specialThanksX.setRect((Camera.main.width - colWidth)/2f-10, ptr.bottom()+6, colWidth+20, 0);
|
||||
content.add(specialThanksX);
|
||||
|
||||
CreditsBlock specialThanksB = new CreditsBlock(true, 0xbe8e6e,
|
||||
"Part Music Used Terraria",
|
||||
new Image("tra.png", 0, 0, 17, 28),
|
||||
CreditsBlock specialThanks = new CreditsBlock(true, 0x00899C,
|
||||
"Original Music Two By 犬羅",
|
||||
new Image("dog.png", 0, 0, 22, 24),
|
||||
null,
|
||||
null,
|
||||
null);
|
||||
specialThanksB.setRect((Camera.main.width - colWidth)/2f-10, specialThanks.bottom()+6, colWidth+20, 0);
|
||||
specialThanks.setRect((Camera.main.width - colWidth)/2f-10, specialThanksX.bottom()+6, colWidth+20, 0);
|
||||
content.add(specialThanks);
|
||||
|
||||
CreditsBlock specialThanks2 = new CreditsBlock(true, 0xC62BFF,
|
||||
"Map Made 迪泠",
|
||||
new Image("DiLing.png", 0, 0, 32, 32),
|
||||
null,
|
||||
null,
|
||||
null);
|
||||
specialThanks2.setRect((Camera.main.width - colWidth)/2f-10, specialThanks.bottom()+6, colWidth+20, 0);
|
||||
content.add(specialThanks2);
|
||||
|
||||
CreditsBlock specialThanksB = new CreditsBlock(true, Window.TITLE_COLOR,
|
||||
"Third Party Music Used:\n\nTerraria--Arknight--TitanSoul",
|
||||
new Image("tra.png", 0, 0, 73, 28),
|
||||
null,
|
||||
null,
|
||||
null);
|
||||
specialThanksB.setRect((Camera.main.width - colWidth)/2f-10, specialThanks2.bottom()+6, colWidth+20, 0);
|
||||
content.add(specialThanksB);
|
||||
|
||||
//*** Shattered Pixel Dungeon Credits ***
|
||||
|
|
|
@ -0,0 +1,43 @@
|
|||
package com.shatteredpixel.shatteredpixeldungeon.sprites;
|
||||
|
||||
import com.shatteredpixel.shatteredpixeldungeon.Assets;
|
||||
import com.watabou.noosa.MovieClip;
|
||||
import com.watabou.noosa.TextureFilm;
|
||||
|
||||
public class CerberusSprite extends MobSprite {
|
||||
|
||||
private Animation skills;
|
||||
|
||||
public CerberusSprite() {
|
||||
super();
|
||||
|
||||
texture( Assets.Sprites.CSBR );
|
||||
|
||||
TextureFilm frames = new TextureFilm( texture, 32, 32);
|
||||
|
||||
idle = new MovieClip.Animation( 6, true );
|
||||
idle.frames( frames, 0, 1, 2, 3, 4 ,6, 7,8 );
|
||||
|
||||
run = new MovieClip.Animation( 6, true );
|
||||
run.frames( frames, 9,10,11,12,13,14,15,16,17 );
|
||||
|
||||
attack = new MovieClip.Animation( 6, false );
|
||||
attack.frames( frames, 18,19,20,21 );
|
||||
|
||||
skills = new MovieClip.Animation( 18, true );
|
||||
skills.frames( frames, 22, 23, 24, 25, 26 );
|
||||
|
||||
die = new MovieClip.Animation( 18, false );
|
||||
die.frames( frames, 27, 28, 29, 30, 31, 32, 33, 34, 35 );
|
||||
|
||||
play( idle );
|
||||
}
|
||||
|
||||
//Skills Animation
|
||||
public void Skills( int cell ){
|
||||
turnTo( ch.pos, cell );
|
||||
play( skills );
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -157,7 +157,7 @@ public class DimandKingSprite extends MobSprite {
|
|||
}
|
||||
|
||||
public void updateArmor( int tier ) {
|
||||
TextureFilm film = new TextureFilm( HeroSprite.tiers(), 6, FRAME_WIDTH, FRAME_HEIGHT );
|
||||
TextureFilm film = new TextureFilm( HeroSprite.tiers(), 7, FRAME_WIDTH, FRAME_HEIGHT );
|
||||
|
||||
idle = new Animation( 1, true );
|
||||
idle.frames( film, 0, 0, 0, 1, 0, 0, 1, 1 );
|
||||
|
|
|
@ -29,6 +29,7 @@ import com.shatteredpixel.shatteredpixeldungeon.effects.MagicMissile;
|
|||
import com.shatteredpixel.shatteredpixeldungeon.effects.Speck;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.CorrosionParticle;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.FlameParticle;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.HalomethaneFlameParticle;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.LeafParticle;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.ShadowParticle;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.SparkParticle;
|
||||
|
@ -304,4 +305,54 @@ public abstract class FistSprite extends MobSprite {
|
|||
|
||||
}
|
||||
|
||||
public static class Ice extends FistSprite {
|
||||
|
||||
{
|
||||
boltType = MagicMissile.FROST;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int texOffset() {
|
||||
return 60;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Emitter createEmitter() {
|
||||
Emitter emitter = emitter();
|
||||
emitter.pour(MagicMissile.MagicParticle.FACTORY, 0.06f );
|
||||
return emitter;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int blood() {
|
||||
return 0xFF26CCC2;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static class HaloFist extends FistSprite {
|
||||
|
||||
{
|
||||
boltType = MagicMissile.HALOFIRE;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int texOffset() {
|
||||
return 70;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Emitter createEmitter() {
|
||||
Emitter emitter = emitter();
|
||||
emitter.pour(HalomethaneFlameParticle.FACTORY, 0.06f );
|
||||
return emitter;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int blood() {
|
||||
return 0xFF34C9C9;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -905,6 +905,13 @@ public class ItemSpriteSheet {
|
|||
|
||||
public static final int CHALLANEESICON_16= CHALLANEESICONINDEX+15;
|
||||
|
||||
|
||||
private static final int SCROLL_GOLD = xy(1, 46); //16 slots
|
||||
public static final int SCROLL_MORETR = SCROLL_GOLD;
|
||||
static {
|
||||
assignItemRect(SCROLL_GOLD, 15, 14);
|
||||
}
|
||||
|
||||
//for smaller 8x8 icons that often accompany an item sprite
|
||||
public static class Icons {
|
||||
|
||||
|
|
|
@ -0,0 +1,32 @@
|
|||
package com.shatteredpixel.shatteredpixeldungeon.sprites;
|
||||
|
||||
import com.shatteredpixel.shatteredpixeldungeon.Assets;
|
||||
import com.watabou.noosa.MovieClip;
|
||||
import com.watabou.noosa.TextureFilm;
|
||||
|
||||
public class MiMiCRYSprites extends MimicSprite {
|
||||
|
||||
public MiMiCRYSprites() {
|
||||
super();
|
||||
|
||||
texture( Assets.Sprites.MIMICRY );
|
||||
|
||||
TextureFilm frames = new TextureFilm( texture, 16, 16 );
|
||||
|
||||
idle = new MovieClip.Animation( 5, true );
|
||||
idle.frames( frames, 0, 1, 2 );
|
||||
|
||||
run = new MovieClip.Animation( 9, true );
|
||||
run.frames( frames, 2,3,4,5 );
|
||||
|
||||
attack = new MovieClip.Animation( 6, false );
|
||||
attack.frames( frames,4,5,6);
|
||||
|
||||
die = new MovieClip.Animation( 6, false );
|
||||
die.frames( frames, 7,8,9,10,11,12 );
|
||||
|
||||
play( idle );
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -27,7 +27,7 @@ import com.watabou.noosa.TextureFilm;
|
|||
|
||||
public class MimicSprite extends MobSprite {
|
||||
|
||||
private Animation hiding;
|
||||
private static Animation hiding;
|
||||
|
||||
{
|
||||
//adjust shadow slightly to account for 1 empty bottom pixel (used for border while hiding)
|
||||
|
@ -116,5 +116,48 @@ public class MimicSprite extends MobSprite {
|
|||
}
|
||||
}
|
||||
|
||||
public static class HollowWall extends MimicSprite{
|
||||
@Override
|
||||
protected int texOffset() {
|
||||
return 80;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void link(Char ch) {
|
||||
super.link(ch);
|
||||
ch.sprite.add(CharSprite.State.ILLUMINATED);
|
||||
}
|
||||
|
||||
public HollowWall() {
|
||||
super();
|
||||
|
||||
int c = texOffset();
|
||||
|
||||
texture( Assets.Sprites.MIMIC );
|
||||
|
||||
TextureFilm frames = new TextureFilm( texture, 16, 16 );
|
||||
|
||||
hiding = new Animation( 1, true );
|
||||
hiding.frames( frames, 0+c, 1+c, 2+c, 3+c);
|
||||
|
||||
idle = new Animation( 5, true );
|
||||
idle.frames( frames, 0+c,1+c,2+c,3+c );
|
||||
|
||||
run = new Animation( 10, true );
|
||||
run.frames( frames, 0+c,1+c,2+c,3+c );
|
||||
|
||||
attack = new Animation( 10, false );
|
||||
attack.frames( frames, 4+c, 5+c, 6+c );
|
||||
|
||||
die = new Animation( 5, false );
|
||||
die.frames( frames, 7+c,8+c, 9+c,10+c,11+c,12+c );
|
||||
|
||||
play( idle );
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -0,0 +1,33 @@
|
|||
package com.shatteredpixel.shatteredpixeldungeon.sprites;
|
||||
|
||||
import com.shatteredpixel.shatteredpixeldungeon.Assets;
|
||||
import com.watabou.noosa.MovieClip;
|
||||
import com.watabou.noosa.TextureFilm;
|
||||
|
||||
public class MorpheusSprite extends MobSprite {
|
||||
|
||||
public MorpheusSprite() {
|
||||
super();
|
||||
|
||||
texture( Assets.Sprites.MPHON );
|
||||
|
||||
TextureFilm frames = new TextureFilm( texture, 32, 32 );
|
||||
|
||||
idle = new MovieClip.Animation( 6, true );
|
||||
idle.frames( frames, 0, 1, 2, 3 );
|
||||
|
||||
run = new MovieClip.Animation( 12, true );
|
||||
run.frames( frames, 14,15,16,17 );
|
||||
|
||||
attack = new MovieClip.Animation( 18, false );
|
||||
attack.frames( frames, 4,5,6,7,8,9,0 );
|
||||
|
||||
die = new MovieClip.Animation( 18, false );
|
||||
die.frames( frames, 10, 12, 13 );
|
||||
|
||||
play( idle );
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,31 @@
|
|||
package com.shatteredpixel.shatteredpixeldungeon.sprites;
|
||||
|
||||
import com.shatteredpixel.shatteredpixeldungeon.Assets;
|
||||
import com.watabou.noosa.TextureFilm;
|
||||
|
||||
public class TyphonSprite extends MobSprite {
|
||||
|
||||
public TyphonSprite() {
|
||||
super();
|
||||
|
||||
texture( Assets.Sprites.TYPHON );
|
||||
|
||||
TextureFilm frames = new TextureFilm( texture, 16, 21 );
|
||||
|
||||
idle = new Animation( 6, true );
|
||||
idle.frames( frames, 0, 1, 2, 3, 4 );
|
||||
|
||||
run = new Animation( 12, true );
|
||||
run.frames( frames, 14,15,16,17 );
|
||||
|
||||
attack = new Animation( 18, false );
|
||||
attack.frames( frames, 4,5,6,7,8,9,0 );
|
||||
|
||||
die = new Animation( 18, false );
|
||||
die.frames( frames, 10, 12, 13 );
|
||||
|
||||
play( idle );
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -396,7 +396,7 @@ public class StatusPane extends Component {
|
|||
}
|
||||
|
||||
int maxHunger = (int) Hunger.STARVING;
|
||||
int maxPureSole = Dungeon.hero.lanterfire;
|
||||
float maxPureSole = Dungeon.hero.lanterfire;
|
||||
int mtPureSole = 100;
|
||||
|
||||
//冰血聪明 x
|
||||
|
|
|
@ -10,6 +10,7 @@ import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
|
|||
import com.shatteredpixel.shatteredpixeldungeon.scenes.ChangesScene;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.scenes.PixelScene;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.ApprenticeWitchSprite;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.CerberusSprite;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.CrivusFruitsSprite;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.DM300AttackSprite;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.FireDragonSprite;
|
||||
|
@ -19,11 +20,13 @@ import com.shatteredpixel.shatteredpixeldungeon.sprites.GhostSprite;
|
|||
import com.shatteredpixel.shatteredpixeldungeon.sprites.IceSlowGirlSprites;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSprite;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.MorpheusSprite;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.RedNecromancerSprite;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.SakaFishBossSprites;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.SalamanderSprites;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.ShopkeeperSprite;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.SlimeKingSprite;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.TyphonSprite;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.ui.Icons;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.ui.Window;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.ui.changelist.ChangeButton;
|
||||
|
@ -92,6 +95,48 @@ public class vM0_6_4_P_Changes {
|
|||
changes.addButton(new ChangeButton(c, ("冰雪魔女重做"),
|
||||
("石碑上记录了有关于她的一切,她的过去,她的现在,她的未来。而当你与她对峙时,你是否能够看清她的真实面目?")));
|
||||
|
||||
changes = new ChangeInfo("v0.6.5.0-Alpha6-Patch7", true, "");
|
||||
changes.hardlight(Window.TITLE_COLOR);
|
||||
changeInfos.add(changes);
|
||||
|
||||
changes = new ChangeInfo("预载", false, null);
|
||||
changes.hardlight(Window.CBLACK);
|
||||
changeInfos.add(changes);
|
||||
|
||||
changes.addButton(new ChangeButton(new TyphonSprite(), ("万妖之祖"),
|
||||
("虽然这个世界不在我的管理范围之内,但古堡的一切都不应该存在于这里。\n\n该数据已预载,将在万圣节活动启用")));
|
||||
|
||||
Image mp = new MorpheusSprite();
|
||||
mp.scale.set(PixelScene.align(0.7f));
|
||||
changes.addButton(new ChangeButton(mp, ("影境之主"),
|
||||
("那么,盛大的剧目即将开演。\n\n该数据已预载,将在万圣节活动启用")));
|
||||
|
||||
Image cr = new CerberusSprite();
|
||||
cr.scale.set(PixelScene.align(0.7f));
|
||||
changes.addButton(new ChangeButton(cr, ("地狱噩梦"),
|
||||
("……\n\n该数据已预载,将在万圣节活动启用")));
|
||||
|
||||
changes = new ChangeInfo("新内容", false, null);
|
||||
changes.hardlight(Window.GREEN_COLOR);
|
||||
changeInfos.add(changes);
|
||||
|
||||
changes.addButton(new ChangeButton(new ItemSprite(ItemSpriteSheet.CHALLANEESICON_13), ("绝命头目大整改"),
|
||||
( "1.古神二阶段将额外召唤两个拳头,分别是寒冰和鬼磷之拳。\n\n" +
|
||||
"2.矮人国王在绝命头目中魔像替换为冰魔像,额外追加重甲豺狼。\n\n" +
|
||||
"3.天狗在二阶段额外获得护盾且火焰墙替换为鬼磷墙,战斗也更加频繁致命。")));
|
||||
|
||||
changes = new ChangeInfo("改动", false, null);
|
||||
changes.hardlight(Window.CYELLOW);
|
||||
changeInfos.add(changes);
|
||||
|
||||
changes.addButton(new ChangeButton(Icons.get(Icons.PREFS), ("杂项改动"),
|
||||
("1.优化了油瓶可以被巨魔铁匠合成从而无限使用的问题\n" +
|
||||
"2.开发者模式v0.8:修复了一些问题\n" +
|
||||
"3.致谢名单优化,新增迪泠,Yinura-犬羅,秦月,设寄师,罐装狐腻(部分人没有给我图标,所以里面直接是文字)\n" +
|
||||
"4.灯火已支持小数扣减。" )));
|
||||
|
||||
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_06X89")));
|
||||
|
||||
|
||||
changes = new ChangeInfo("v0.6.5.0-Alpha6-Patch6", true, "");
|
||||
|
@ -121,6 +166,17 @@ public class vM0_6_4_P_Changes {
|
|||
changes.hardlight(Window.CYELLOW);
|
||||
changeInfos.add(changes);
|
||||
|
||||
changes.addButton(new ChangeButton(Icons.get(Icons.INFO), ("分数对照表"),
|
||||
("以下告诉你分数在何时会变蓝,在变蓝即为获得最高评价标准乃至以上:\n\n" +
|
||||
"游戏得分:50000分以上\n\n" +
|
||||
"寻宝得分:20000分以上\n\n" +
|
||||
"探索得分:20000分以上\n\n" +
|
||||
"Boss得分:18000分以上\n\n" +
|
||||
"任务得分:14000分以上。\n\n" +
|
||||
"SSS+评价:240000*挑战倍率*(通关 ? 1 : 5)\n\n" +
|
||||
"如果通关是1倍,没通关是5倍--(也就是基本无法获得)。" )));
|
||||
|
||||
|
||||
changes.addButton(new ChangeButton(new ItemSprite(ItemSpriteSheet.DG25), ("开发者模式v0.7"),
|
||||
("在开发模式中,支离破碎第1层是测试怪组。")));
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@ import com.shatteredpixel.shatteredpixeldungeon.Statistics;
|
|||
|
||||
public class LevelChecker {
|
||||
|
||||
public static final int SSSP_SCORE = 250000;
|
||||
public static final int SSSP_SCORE = 240000;
|
||||
public static final int SSS_SCORE = 200000;
|
||||
public static final int SS_SCORE = 100000;
|
||||
private static final int S_SCORE = 50000;
|
||||
|
@ -20,7 +20,7 @@ public class LevelChecker {
|
|||
boolean amuletObtained = Statistics.amuletObtained;
|
||||
|
||||
String level;
|
||||
if (totalScore >= SSSP_SCORE * chalMultiplier * (amuletObtained ? 1.5 : 5)) {
|
||||
if (totalScore >= SSSP_SCORE * chalMultiplier * (amuletObtained ? 1 : 5)) {
|
||||
level = "_SSS+_";
|
||||
} else if (totalScore >= SSS_SCORE * chalMultiplier/2 * (amuletObtained ? 1 : 4)) {
|
||||
level = "SSS";
|
||||
|
|
|
@ -221,7 +221,7 @@ public class WndHero extends WndTabbed {
|
|||
|
||||
|
||||
if(lanterfireactive){
|
||||
RestatSlot( Messages.get(this, "lanterfire"), (hero.lanterfire) + "/" + 100 );
|
||||
RestatSlot( Messages.get(this, "lanterfire"), (double)(hero.lanterfire) + "/" + 100 );
|
||||
}
|
||||
|
||||
IcestatSlot( Messages.get(this, "icehp"), (hero.icehp) + "/" + 100 );
|
||||
|
|
|
@ -39,7 +39,7 @@ import com.watabou.noosa.Image;
|
|||
import com.watabou.noosa.ui.Component;
|
||||
|
||||
public class WndInfoMob extends WndTitledMessage {
|
||||
|
||||
public static boolean reload = false;
|
||||
public WndInfoMob( Mob mob ) {
|
||||
|
||||
super( new MobTitle( mob ), mob.info() );
|
||||
|
@ -185,6 +185,8 @@ public class WndInfoMob extends WndTitledMessage {
|
|||
return level;
|
||||
}
|
||||
|
||||
|
||||
|
||||
public MobTitle( Mob mob ) {
|
||||
|
||||
name = PixelScene.renderTextBlock( Messages.titleCase( mob.name() ), 9 );
|
||||
|
@ -227,6 +229,12 @@ public class WndInfoMob extends WndTitledMessage {
|
|||
add(mobSixInfo.info6);
|
||||
add(mobSixInfo.info7);
|
||||
add(mobSixInfo.info8);
|
||||
|
||||
if ((mob.alignment == Char.Alignment.NEUTRAL) && mob.properties.contains(Char.Property.HOLLOW)) {
|
||||
reload = true;
|
||||
} else {
|
||||
reload = false;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -248,12 +256,36 @@ public class WndInfoMob extends WndTitledMessage {
|
|||
name.bottom() - BuffIndicator.SIZE_SMALL-2
|
||||
);
|
||||
|
||||
height = health.bottom();
|
||||
|
||||
|
||||
if(reload){
|
||||
height = health.bottom();
|
||||
mobSixInfo.info1.visible = false; mobSixInfo.info2.visible = false;
|
||||
mobSixInfo.info3.visible = false; mobSixInfo.info4.visible = false;
|
||||
mobSixInfo.info5.visible = false; mobSixInfo.info6.visible = false;
|
||||
mobSixInfo.info7.visible = false; mobSixInfo.info8.visible = false;
|
||||
mobSixInfo.image1.visible = false; mobSixInfo.image2.visible = false;
|
||||
mobSixInfo.image3.visible = false; mobSixInfo.image4.visible = false;
|
||||
mobSixInfo.image5.visible = false; mobSixInfo.image6.visible = false;
|
||||
mobSixInfo.image7.visible = false; mobSixInfo.image8.visible = false;
|
||||
health.visible = false;
|
||||
} else {
|
||||
mobSixInfo.setPos(-5,Math.max(health.bottom(),image.height()+5));
|
||||
mobSixInfo.layout();
|
||||
|
||||
height = mobSixInfo.bottom();
|
||||
mobSixInfo.info1.visible = true; mobSixInfo.info2.visible = true;
|
||||
mobSixInfo.info3.visible = true; mobSixInfo.info4.visible = true;
|
||||
mobSixInfo.info5.visible = true; mobSixInfo.info6.visible = true;
|
||||
mobSixInfo.info7.visible = true; mobSixInfo.info8.visible = true;
|
||||
mobSixInfo.image1.visible = true; mobSixInfo.image2.visible = true;
|
||||
mobSixInfo.image3.visible = true; mobSixInfo.image4.visible = true;
|
||||
mobSixInfo.image5.visible = true; mobSixInfo.image6.visible = true;
|
||||
mobSixInfo.image7.visible = true; mobSixInfo.image8.visible = true;
|
||||
health.visible = true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|