Update V0.6.1 Beta4.975

This commit is contained in:
LingASDJ 2023-04-02 01:15:38 +08:00
parent aedf39e30c
commit e4ecfc6d33
101 changed files with 2117 additions and 1041 deletions

View File

@ -17,8 +17,8 @@ allprojects {
appName = 'Magic Ling Pixel Dungeon'
appPackageName = 'com.ansdomagiclingpixeldungeon.ling'
appVersionCode =800011
appVersionName = '0.6.1.0-Beta4.9(P3)'
appVersionCode =800088
appVersionName = '0.6.1.0-Beta4.95(P3)'
appJavaCompatibility = JavaVersion.VERSION_1_8

Binary file not shown.

After

Width:  |  Height:  |  Size: 282 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 132 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 127 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.6 KiB

After

Width:  |  Height:  |  Size: 4.5 KiB

View File

@ -21,6 +21,7 @@ actors.mobs.bosses.crivusfruits.dead=养分……汲取……失败……,果
actors.mobs.bosses.crivusfruits$diedblobs.desc=一团红色的毒雾从克里弗斯之果周围散发而出,你的潜意识告诉你这种东西会对你造成极大的伤害。
actors.mobs.bosses.crivusfruits$diedblobs.csed=果实爆开后迸射出一些气味清新的红色气体,用来做空气清新剂似乎挺不错的。
actors.mobs.bosses.crivusfruitslasher.name=魔化藤
actors.mobs.bosses.crivusfruitslasher.desc=藤蔓没有智慧,它们的存在价值就是保护果实。不论是不小心靠近果实的“小动物”,还是企图清理枯藤更进一步的冒险者,都被这些藤蔓绞死成孕育果实的肥料了。
@ -179,6 +180,28 @@ actors.mobs.npcs.nulldiedto.talk_x=不错,现在,是你尽情挑选商品的
actors.mobs.npcs.nulldiedto.name=商人领主
actors.mobs.npcs.nulldiedto.desc=雪凛峡谷的商人领主,正是他建立了商人这个势力。
actors.mobs.npcs.nulldiedto.namex=水晶意志
actors.mobs.npcs.nulldiedto.descx=衪并不是商人领主,而是水晶之心的意志。衪正在等待你!
actors.mobs.npcs.nulldiedto.talk_a=这里居然还有活人?哦,是你!
actors.mobs.npcs.nulldiedto.talk_b=冒险家,有一股邪恶,阴冷却强大的力量正在向外溢出,看起来似乎只有你能改变这个局面了。
actors.mobs.npcs.nulldiedto.talk_c=下面没什么生物,也许是那股力量做的。幸存下来的只有那些拥有一定实力的家伙。
actors.mobs.npcs.nulldiedto.talk_d=水晶之心正在抗拒这股力量,入口因为这股抗拒之力变成了这种样子。
actors.mobs.npcs.nulldiedto.talk_e=下面的地形也许会有所不同,这些都是抗拒之力的具体表现。
actors.mobs.npcs.nulldiedto.talk_f=祝你好运,冒险家。我这里也提供一点帮助你压制不明力量的东西——当然,是得花钱的。
actors.mobs.npcs.nulldiedto.talk_g=冒险家,我们又见面了。我担心你接下来的路程,所以又来帮助你了。
actors.mobs.npcs.nulldiedto.talk_h=祝你好运,冒险家。我这里也提供一点帮助你压制不明力量的东西——当然,是得花钱的。
actors.mobs.npcs.nulldiedto.talk_i=冒险家,正如我之前所说。有一股邪恶,阴冷却强大的力量正在向外溢出,而能量点就在这扭曲裂缝的下方。而其实水晶之心一直在你的背包里面
actors.mobs.npcs.nulldiedto.talk_j=现在的选择权在你,冒险家。继续还是妥协这一切,通过水晶离开这里,还是斩草除根,一切选择权已经交给你了!
actors.mobs.npcs.nulldiedto.talk_k=DMZERO已经彻底被摧毁了冒险家干的不错。
actors.mobs.npcs.nulldiedto.talk_l=冒险家,或许你真的是衪的救世主。
actors.mobs.npcs.nulldiedto.talk_m=感谢你这次的地牢调查行动,我会很快将这里给恢复到最初的样子。
actors.mobs.npcs.nulldiedto.talk_n=冒险家,这只是一个开始。你未来的艰辛坎坷之路,就要来了!
actors.mobs.npcs.nulldiedto.talk_o=冒险家,现在你可以通过水晶之心离开这里了。谢谢你这次帮忙,我会在衪回来后告诉你的丰功伟绩的。
actors.mobs.coldgurad.name=雪凛守卫
actors.mobs.coldgurad.scorpion=给我过来!
actors.mobs.coldgurad.def_verb=魔盾
@ -325,25 +348,29 @@ actors.mobs.bosses.dwarfmaster.no_inst=矮人将军:直面我,不要躲在暗处
actors.mobs.dimandmimic.name=钻石宝箱怪
actors.mobs.dimandmimic.desc=长得几乎和钻石宝箱王一模一样,但是远比宝箱王弱的多!
actors.mobs.bosses.dm920.name=DM920
actors.mobs.bosses.dm920.desc=DM920是曾经死灵巫师为了夺取前矮人国王的政权而用黑暗魔法结合起来的恐怖产物时至今日DM920仍然是地牢中的一个巨大的威胁。\n\n但由于她魔力的影响DM920在另一个异次元空间内如果没有她的允许DM920将无法出现在地牢之中。\n\n有人曾经说过DM920是死灵巫师夺取矮人政权的导火索和转折点\n\nΓ战斗回合过长将会释放湮灭审判直接秒杀玩家
actors.mobs.bosses.dm920.notice=侦查到未授权单位……
actors.mobs.bosses.dm920.defeated=哦,我开始享受这场战斗了!!!
actors.mobs.bosses.dmzero$diedblobs.desc=黑色的毒雾盘旋在这里
actors.mobs.bosses.dmzero$diedblobs.rankings_desc=死于黑渊
actors.mobs.bosses.dmzero$diedblobs.ondeath=你被黑雾毒死了
actors.mobs.bosses.dm920$dm300attackmode.name=DM920-突袭者形态
actors.mobs.bosses.dm920$dm300attackmode.desc=DM920是曾经死灵巫师为了夺取前矮人国王的政权而用黑暗魔法结合起来的恐怖产物时至今日DM920仍然是地牢中的一个巨大的威胁。\n\n但由于她魔力的影响DM920在另一个异次元空间内如果没有她的允许DM920将无法出现在地牢之中。\n\n_攻击形态_下DM920拥有更加强大的_腐蚀毒雾_效果并且能发射超级冲击波震飞敌人打人也会更加的痛。\n\n_突袭者形态下DM920将更加危险同时会投掷炸弹,并主动远离玩家若玩家靠得太近将可能会被麻痹。_\n\n有人曾经说过DM920是死灵巫师夺取矮人政权的导火索和转折点\n\nΓ战斗回合过长将会释放湮灭审判直接秒杀玩家
actors.mobs.bosses.dm920$dm300attackmode.notice=侦查到未授权单位……
actors.mobs.bosses.dm920$dm300attackmode.defeated=那么,你在被诅咒缠绕的世界里能活下来吗?
actors.mobs.bosses.dmzero.name=DMZERO
actors.mobs.bosses.dmzero.desc=DMZERO是死灵巫师为夺取前矮人国王的政权而用黑暗魔法仿造矮人科技所制造的试作型魔法机械。\n\n由于水晶之心的影响DMZERO被禁锢在另一个异次元空间内无法影响地牢所在的时间线。\n\nΓ战斗回合过长将会释放_湮灭审判_对玩家造成致死伤害。半血后伤害大幅度提升。\n\n根据商人给出的情报它的高智能辐射电波影响了这个地牢。封印摧毁抑或是遣返。让这里恢复原状吧。
actors.mobs.bosses.dmzero.notice=侦查到未授权单位……
actors.mobs.bosses.dmzero.defeated=能量负载6%……
actors.mobs.bosses.dm920$dm300spidermode.name=DM920-猩蛛的诅咒
actors.mobs.bosses.dm920$dm300spidermode.desc=DM920是曾经死灵巫师为了夺取前矮人国王的政权而用黑暗魔法结合起来的恐怖产物时至今日DM920仍然是地牢中的一个巨大的威胁。\n\n但由于她魔力的影响DM920在另一个异次元空间内如果没有她的允许DM920将无法出现在地牢之中。\n\n_大猩猩蜘蛛形态_下DM920拥有更加强大的_酸蚀毒雾_效果并且能发射蜘蛛丝困住敌人主动离开玩家打人也会更加的痛同时DM920的普通攻击造成极大的伤害。猩蛛状态下DM920将完全免疫魔法伤害\n\n有人曾经说过DM920是死灵巫师夺取矮人政权的导火索和转折点\n\nΓ战斗回合过长将会释放湮灭审判直接秒杀玩家
actors.mobs.bosses.dm920$dm300spidermode.notice=侦查到未授权单位……
actors.mobs.bosses.dm920$dm300spidermode.defeated=无论你是谁,都不能打败我!现在,游戏才刚刚开始!!!
actors.mobs.bosses.dmzero$dm300attackmode.name=DMZERO-黯色
actors.mobs.bosses.dmzero$dm300attackmode.desc= DMZERO内部的黑暗能量逐渐充盈将机体染成暗黑色。\n\n黯色只是对颜色的描述。\n\n黯色状态下的DMZERO会使用_腐蚀毒雾_攻击并且能发射震波击飞敌人。\n\n黯色形态下DMZERO会投掷暗黑能量炸弹,并主动远离任何生物。靠得太近可能会被溢出的黑暗能量麻痹。\n\nΓ战斗回合过长将会释放_湮灭审判_对玩家造成致死伤害。
actors.mobs.bosses.dmzero$dm300attackmode.notice=侦查到未授权单位……
actors.mobs.bosses.dmzero$dm300attackmode.defeated=燃料填充66%……
actors.mobs.bosses.dm920$dm300deathball.name=DM920-利刃突刺
actors.mobs.bosses.dm920$dm300deathball.desc=DM920是曾经死灵巫师为了夺取前矮人国王的政权而用黑暗魔法结合起来的恐怖产物时至今日DM920仍然是地牢中的一个巨大的威胁。\n\n但由于她魔力的影响DM920在另一个异次元空间内如果没有她的允许DM920将无法出现在地牢之中。\n\n_最终形态下的_下DM920拥有更加强大的_酸蚀毒雾+中毒毒雾_效果并且本身完全免疫酸和毒。它还会在每次血量低于一定的情况下释放_死亡黑雾_来使敌人残废和流血,同时也会召唤_DM275_和_DM100精英组长形态前来支援_。\n\n-并且周期性发射_魔法球_对敌人造成随机负面Buff影响。\n\n_DM920最终形态将会缓慢的自我修复,并且在经过水的敌方额外召唤DM275进行作战_并且免疫魔法伤害和拥有更高的精准度以及自身会不断成长如果不迅速击败将会无法阻挡。\n\n有人曾经说过DM920是死灵巫师夺取矮人政权的导火索和转折点
actors.mobs.bosses.dm920$dm300deathball.notice=侦查到未授权单位……
actors.mobs.bosses.dm920$dm300deathball.defeated=杀 戮 任 务 失 败 …… 系 统 关 闭
actors.mobs.bosses.dmzero$dm300spidermode.name=DMZERO-赤色
actors.mobs.bosses.dmzero$dm300spidermode.desc=DMZERO将所有燃料转化为猩红能量覆盖体表实体化的猩红能量有着极强的魔法吸收性与驱动性。\n\n赤色如血。\n\n赤色状态下dmzero会使用_酸蚀毒雾_攻击并且能发射蜘蛛丝困住敌人。\n\n赤色状态下dmzero将完全免疫魔法伤害且普通攻击的伤害提升。\n\nΓ战斗回合过长将会释放_湮灭审判_对玩家造成致死伤害。
actors.mobs.bosses.dmzero$dm300spidermode.notice=侦查到未授权单位……
actors.mobs.bosses.dmzero$dm300spidermode.defeated=猩红缚茧已完成……
actors.mobs.bosses.dmzero$dm300deathball.name=DMZERO-钢色
actors.mobs.bosses.dmzero$dm300deathball.desc=DMZERO破除血茧将猩红碎片与储存的暗金熔铸成新的甲壳。\n\n钢色中带着一抹黯淡一抹赤红。\n\n钢色状态下DMZERO会使用_酸蚀毒雾与中毒毒雾_攻击并且本体完全免疫酸蚀和毒\n\n钢色状态下DMZERO会缓慢修复损伤,并且在经过水时额外回复。此时DMZERO完全免疫魔法伤害且拥有更高的精准度。\n\n此时DMZERO会不断自我强化战斗回合过长将彻底失控。
actors.mobs.bosses.dmzero$dm300deathball.notice=侦查到未授权单位……
actors.mobs.bosses.dmzero$dm300deathball.defeated=蜕变失败……系统关闭
#觉醒天赋
actors.hero.talent.died_god.title=狂暴战神
actors.hero.talent.died_god.desc=-_+1_伤害提升5伤害\n\n-_+2_有护甲的时候自带奥术护盾和树肤\n\n-_+3_满血的时候行动更加迅速\n\n-_+4_血量低于50的时候自带10回合荆棘和一个弱型治疗效果\n\n-_+5_短暂拒绝死亡后 将获得25的奥术护盾 并且力竭恢复速度减半
@ -351,7 +378,10 @@ actors.hero.talent.died_god.desc=-_+1_伤害提升5伤害\n\n-_+2_有护甲的
actors.buffs.randombuff$diedbuff.name=湮灭审判
actors.buffs.randombuff$diedbuff.desc=DM920会在过程中渐渐对你失去耐心如果战斗时间过长。DM920将进入第五形态-该形态几乎不可能被打败……\n\nDM920对你失去耐心的时间还有%s回合。
actors.buffs.randombuff$diedbuff.desc=DMZERO会在过程中渐渐对你失去耐心如果战斗时间过长。DMZERO将进入第五形态-该形态几乎不可能被打败……\n\nDMZERO对你失去耐心的时间还有%s回合。
actors.mobs.npcs.whitenpc.name=???

View File

@ -95,6 +95,8 @@ badges$badge.firegirl=击败圣火魔女-莲娜\n\n雪凛峡谷的守护者
badges$badge.slimepr=击败史莱姆公主\n\n妥协的结果
badges$badge.drawf_head=击败矮人将军\n\n矮人王国的正规军残党
badges$badge.brcler=起始归一\n\n你已经粉碎了DM-ZERO的阴谋现在是时候回归正常生活了。\n[完成首领对决]
badges$badge.kill_apple=击败克里弗斯之果\n\n盘踞在森林底部的幕后“主谋"
badges$badge.spicealboss=累计击败全部特殊BOSS\n\n风暴正在降临
@ -130,19 +132,28 @@ challenges.traditional = 现实之声-T1挑战
challenges.hard = 梦境之声-T2挑战
challenges.warning = 寻觅之声-T3挑战
challenges.test = 测试时间-DEBUG
challenges.rlpt = Π支离破碎Π
challenges.rlpt_desc=地下涌动的神秘力量正在渐渐腐蚀这里,这里不过是而言是另一场噩梦。\n\n从第六层开始怪物必定有几个不是本大层的怪物但不会超过两级。一般来说在监狱遇到矮人层的怪物几率很小。通常遇到矿洞层的怪物。
challenges.sbsg = Π基因突变Π
challenges.sbsg_desc=地牢中的神秘魔力让一些生物发生了重大的变化\n-所有生物都会因为突变激素变得各不相同,给探索地牢的脚步带来更大的困难。\n-敌人有5种突变类型\n突变失败体_(30%概率)_:近战伤害减少35%,移速提高到1.3。\n突变爆炸体_(25%概率)_:移速减少50%,攻击力降低30%,但死亡时拥有爆炸伤害。\n突变完全体_(20%概率)_:移速和攻击力各提高25%,且拥有30%伤害减免。\n突变危险体_(15%概率)_:攻击力提升20%,攻击有10%概率造成流血。死亡时有5%概率立刻向本层发出警报。\n突变烟雾体_(10%概率)_:攻击力减少10%,攻击范围+2攻击敌人10%概率造成眩晕……\n\n_特别说明如果开启精英强敌词条会和精英词条共存_
challenges.exsg = Π药水癔症Π
challenges.exsg_desc=药水癔症详细规则:\n力量药水--20%概率力量-1\n灵视药剂--50%概率喝后失明5回合\n隐形药剂--30%概率喝后立刻怒吼\n经验药剂--40%概率喝后立刻流血6回合\n极速药剂--50%概率喝后立刻残废8回合\n==========================\n小型口粮 吃后立刻获得极速8回合\n炖肉 吃后立刻升级\n冷冻生肉片 吃后获得奥术护盾\n全肉大饼 吃后立刻获得8回合极速 且+1力量\n不知道何种原因大部分正面药水你都感觉有毒\n部分药水完全处于DeBuff,但食物却会很有用!而且地牢里面还会追加自动售货机,会售卖一些更加高级的东西。
challenges.icedied = Π雪虐风饕Π
challenges.icedied_desc=很显然,地牢的雪越下越大了,在这严寒里面,生存的法则将进一步让我们活得更久。\n-地牢的寒冷值从6层开始将提升20%的寒冷且篝火房间一旦被激活不再无限变成40回合的燃烧商人会贩卖更多特殊物品。
challenges.dhxd =灯火前路
challenges.dhxd_desc= 灯火指引着前进的道路,提灯引路,灯火前行![此为三挑以上的特殊机制,但你也可以直接开启它!]
dlc.bossrush=首领对决
dlc.bossrush_desc=被你击败过多次的首领们熟识了英雄的技能,并掌握了一定的对策。它们盘踞在地牢中,等待复仇的时机。\n你不知道这次又会有怎样的危机需要应对。\n但你感觉到这次的冒险绝对与其他时期有所不同。\n开启本挑战时支离破碎和缩餐节食将无法生成与使用。
challenges.cs=挑战(占位符)
challenges.cs_desc=这并不是挑战,请忽略不计。
kill=\n_冰雪魔女:_\n_-_生命+25%\n_-_ 水中召唤的仆从更多\n-击败时必定掉落紫金宝石护符\n_矮人大师:_\n_-_ 致命技能更加频繁\n_-_ 生命值+50%\n-击败时必定掉落自然神圣护符\n_史莱姆王:_\n_-_ 生命值+100%\n_-_ 伤害更高,速度更快\n_-_ 在开局额外召唤豺狼诡术师,巨钳螃蟹,腐臭老鼠,蚀化史莱姆\n_-_ 击败时必定掉落凝胶手套\n_DM720:_\n_-_ 获得全新技能\n_-_ 击败时必定掉落DM150控制终端[尚未完成]

View File

@ -3,6 +3,7 @@ windows.wndsettings$extendtab.disable=关闭
windows.wndsettings$extendtab.full=开启
windows.wndkeybindings.prev=
windows.wndkeybindings.next=
windows.wndkingshop.nomoney=看起来你并不是很有钱……,我这人不给穷人卖东西,你自求多福吧。
windows.newwndchallenges$1$1.title=挑战模式-Page1
windows.newwndchallenges$2$1.title=挑战模式-Page2
@ -23,17 +24,10 @@ windows.wndstory.good=灯火光彩夺目,提灯中的信仰诞生出一种纯
windows.wndstory.start=灯火冒险正式开始!你获得了一次免费的增益Roll!
windows.wndstory.letxz=灯火冒险欢迎您已赠送你免费的增益Roll!
windows.wndsettings$datatab.firebase=FireBase数据提交
windows.wndsettings$displaytab.firebase_active=FireBase数据提交
windows.wndsettings$displaytab.firebase_desc=FireBase是一款由_Google_推出的一种开发者服务。Ling在魔绫这边添加了_FireBase崩溃日志收集报告_。\n当你尚未开启此功能时你的_所有崩溃报告都会保存在本地Data数据区域(使用Root才能访问)_\n\n当你开启本功能后你在魔绫游玩的所有崩溃报告将会在下次启动魔绫一并提交到程序后台以便JDSALing我维护。\n-开启此功能代表你同意提交你的崩溃数据和Δ手机的基本公开信息Δ_(手机型号,ROOT权限检测,安卓版本,运存检测,屏幕方向,手机内存)_,同时非常感谢你开启此功能以供Ling后续维护魔绫。\nΔ感谢你的支持与理解同时感谢你的游玩Δ\n\nΞ开启此功能后重启游戏后本地崩溃数据将自动提交到魔绫控制终端Ξ
windows.wndtextinput.enter_key=输入你的QQ号
windows.wndgame.dialog_user=为了更好的在后续崩溃维护检查遇到一些问题请在这里Ξ输入你的QQ号Ξ如果开发者遇到问题将可能通过你的ID联系你询问详细崩溃情况。\n\n输入后将跳转到主界面然后请尽情游玩:)
windows.wndtextinput.yes=确认
windows.wndtextinput.no=稍后
windows.wndhero$statstab.lanterfire=灯火
windows.wndhero$statstab.icehp=寒冷
windows.wndsettings$helptab.reset=重设你的用户ID
windows.wndsettings$helptab.title=辅助功能
@ -57,7 +51,7 @@ windows.wndshopking.notbad=当你准备好后,我会带你前往雪凛峡谷
windows.wndsettings$extendtab.quickslots=快捷栏设置
windows.wndsettings$extendtab.wxts=温馨提示:进入游戏后才能调整快捷栏\n\n这是因为技术问题但是这里已经提醒你了。\n\n当你进入游戏后,这里就会变成快捷栏设置区!
windows.wnddlc.mode=额外玩法请最多只选择一个
windows.wnddlc.mode=娱乐模式
windows.wndstartgame.bossrushdonot=地牢的魔力现在过于紊乱,你现在无法使用染血金币控制终端。
@ -179,6 +173,8 @@ windows.wndgameinprogress.gameinfo=信息
windows.wndgameinprogress.exp=经验
windows.wndgameinprogress.str=力量
windows.wndgameinprogress.health=生命
windows.wndgameinprogress.icehp=寒冷
windows.wndgameinprogress.lanterfire=灯火
windows.wndgameinprogress.gold=金币收集数
windows.wndgameinprogress.depth=最高层数
windows.wndgameinprogress.continue=继续
@ -389,8 +385,6 @@ windows.wndstory.cavesboss=起源,发展,盛世,腐朽,危机,暴乱
windows.wndstory.icedead=死亡不是我们的终点,而是我们的起点。\n\n-在堕落的那一瞬间,我就已经与世隔绝。现在,谁还能帮助我?
windows.wndstory.gamehappy=BR模式
windows.wndstory.city=矮人都市曾经是最宏伟的矮人城邦。在其鼎盛时期矮人的机械化部队曾成功击退过古神及其恶魔军队的入侵。但是也有传闻说,凯旋而归的战士同时带来了腐坏的种子,矮人王国的胜利正是其毁灭的开端。\n\n这里的魔力越来越强烈谁才是幕后主谋
windows.wndstory.cityboss=一路杀出重围\n\n一路直逼矮人国王议事厅\n\n你的心中一直明白“这里已经不是矮人王国这里是恶魔的乐园”\n\n矮人国度的幕后主谋应该知道你来了\n\n而你也知道这将是你第一次同时也是最后一次见到矮人国王\n\n你已经准备好了那么就请杀出一条血路吧
@ -436,3 +430,21 @@ windows.wndwandmaker.dust=哦,我注意到你已经获得了灰尘!别担心
windows.wndwandmaker.ember=哦,我注意到你已经获得了余烬!希望那个火元素没有造成太多麻烦。就像我承诺的,你可以选择我制作的一把高品质法杖。
windows.wndwandmaker.berry=哦,我注意到你已经获得了莓果!希望那株植物没有对你造成太多困扰。就像我承诺的,你可以选择我制作的一把高品质法杖。
windows.wndwandmaker.farewell=祝你在试炼中好运,%s
windows.wndstory.bossrushstart=当你再一次回到了地牢时,你发觉气氛变得有些不寻常。\n\n入口似乎产生了异变而衪和奈亚正在焦急等待着谁。
windows.wndstory.nomobs=在衪的要求下,你再次进入地牢。映入眼帘的并不是熟悉的森林,而是一片冰天雪地。\n\n这里感受不到任何生命的气息但是不远处堆放着的补给品证明不久前有人来过这里。
windows.wndstory.calaboss=冰雪止步于再次出现的林木。\n\n熟悉的感觉再次涌上心头你明白这茂密的树木代表着什么。不远处散发着醉人香气的鲜红果实也证明了你的猜测。
windows.wndstory.sewsboss=一个黑乎乎的家伙出现在你的面前,如果没有猜错,这应该是存在于其他地牢的奇特生物——粘咕。\n\n粘咕似乎比以前更加危险请谨慎行事。
windows.wndstory.skingboss=粘咕死亡后,爆炸的声响惊动了沉睡的史莱姆王。它巨大的身形挡在你面前。
windows.wndstory.tenguboss=沉寂于此的刺客,如今挣断枷锁。\n\n邪恶的力量并没有对它造成伤害反而强化了它的肉体。\n\n天狗比以前更加危险请谨慎行事。
windows.wndstory.dimandkingboss=拟形者的残破躯壳被重铸,塑造成一架没有情感的战斗机械。\n\n你感觉到它并不是曾经与你战斗的那位王只是徒有其表的仿制品罢了。
windows.wndstory.dm300boss=被矮人淘汰的矿用机器,身上遍布锈迹与机油。\n\n这台机器为什么现在还能动起来
windows.wndstory.dm720boss=矮人所制作的矿用机器——DM700的量产型同时配备了攻击型防御装置用以击碎时不时掉下来的落石。\n\n搭载最新科技的DM720是矮人城邦陨落前的绝唱。
windows.wndstory.icegirlboss=被封印的魔女不知为何破开了封印,而她正双眼血红地看着你。
windows.wndstory.kawboss=昔日的矮人国王早已不再,在你面前的只是一个行尸走肉。消灭掉它,让这个多灾多难的矮人国度能回归平静。
windows.wndstory.lkxboss=矮人国王的死讯传遍了这个国度的每一个角落,而一位不速之客也正在前往这里。
windows.wndstory.fireboss=浊焰魔女并没有像往常那样递给你一块饼干。
windows.wndstory.zotboss=万千地牢的邪恶力量汇聚一起造就了这个恐怖的怪物。Yog-Zot是世间邪恶的真实映射。
windows.wndstory.dmzero=你所经历的一切不过是地牢曾经记忆的投影。打乱的时间被揉成一团,重新展开成这条弯弯曲曲的线。这只打乱时间的手,出现在你的面前。
windows.wndstory.end=时间在此停滞。\n\n在这个极度扭曲的空间中DM-ZERO,被未知生物侵占后的极具威胁的机器,伫立在你的前方。\n\n那是一座铁城镇压着无法流淌的时间。

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 76 KiB

After

Width:  |  Height:  |  Size: 78 KiB

View File

@ -1,5 +1,8 @@
package com.shatteredpixel.shatteredpixeldungeon;
import static com.shatteredpixel.shatteredpixeldungeon.DLC.BOSSRUSH;
import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.depth;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.LockedFloor;
import com.watabou.noosa.audio.Music;
@ -11,65 +14,137 @@ public class BGMPlayer {
return;
}
}
int d = Dungeon.depth;
int d = depth;
if(Dungeon.isDLC(BOSSRUSH)){
switch (d) {
case -1:case 0:
Music.INSTANCE.play(Assets.SNOWCYON, true);
break;
case 1:case 3: case 5:case 7:case 9:case 11:case 14:case 15:
Music.INSTANCE.play(Assets.BGM_3, true);
break;
}
} else {
if (d == -1) {
Music.INSTANCE.play(Assets.TOWN, true);
}else if (d == 0) {
Music.INSTANCE.play(Assets.TOWN, true);
} else if (d > 0 && d <= 5) {
Music.INSTANCE.play(Assets.BGM_1, true);
} else if (d > 5 && d <= 10) {
Music.INSTANCE.play(Assets.BGM_2, true);
} else if (d > 10 && d <= 15) {
Music.INSTANCE.play(Assets.BGM_3, true);
} else if (d > 15 && d <= 20) {
Music.INSTANCE.play(Assets.BGM_4, true);
} else if (d > 20 && d <= 26) {
Music.INSTANCE.play(Assets.BGM_5, true);
} else if (d ==-5||d ==-15) {
Music.INSTANCE.play(Assets.SNOWCYON, true);
} else
//default
Music.INSTANCE.play(Assets.Music.THEME, true);
}
if (d == -1) {
Music.INSTANCE.play(Assets.TOWN, true);
}else if (d == 0) {
Music.INSTANCE.play(Assets.TOWN, true);
} else if (d > 0 && d <= 5) {
Music.INSTANCE.play(Assets.BGM_1, true);
} else if (d > 5 && d <= 10) {
Music.INSTANCE.play(Assets.BGM_2, true);
} else if (d > 10 && d <= 15) {
Music.INSTANCE.play(Assets.BGM_3, true);
} else if (d > 15 && d <= 20) {
Music.INSTANCE.play(Assets.BGM_4, true);
} else if (d > 20 && d <= 26) {
Music.INSTANCE.play(Assets.BGM_5, true);
} else if (d ==-5||d ==-15) {
Music.INSTANCE.play(Assets.SNOWCYON, true);
} else
//default
Music.INSTANCE.play(Assets.Music.THEME, true);
}
/*
第1层 补给层
第2层 粘咕
第3层 史莱姆王
第4层 补给层
第5层 天狗
第6层 宝箱王
第7层 补给层
第8层 DM720
第9层 冰雪魔女
第10层 DM300
第11层 补给层
第12层 EX古神
**第13层** DM920
*/
第1层 补给层 T1
第2层 毒苹果
第3层 补给层 T1
第4层 粘咕
第5层 史莱姆王
第6层 补给层 T1
第7层 补给层 T1
第8层 天狗
第9层 补给层 T2
第10层 钻石宝箱王
第11层 补给层T2
第12层 DM300
第13层 补给层T2
第14层 DM720
第15层 补给层T2
第16层 冰雪魔女
第17层 初始层
第18层 补给层T3
第19层 矮人国王
第20层 补给层T3
第21层 矮人将军
第22层 恶魔层
第23层 补给层T3
第24层 浊焰魔女
第25层 补给层T3
第26层 Yog-Zot
第27层 初始层
第28层 DM-ZERO
*/
public static void playBoss() {
int t = Dungeon.depth;
if (Dungeon.bossLevel() && t == 5) {
Music.INSTANCE.play(Assets.BGM_BOSSA, true);
} else if (Dungeon.bossLevel() && t == 10) {
Music.INSTANCE.play(Assets.BGM_BOSSB, true);
} else if (Dungeon.bossLevel() && t == 15 && Statistics.spawnersIce > 0) {
Music.INSTANCE.play(Assets.BGM_BOSSC3, true);
} else if (Dungeon.bossLevel() && t == 15) {
if(SPDSettings.level3boss()==3) Music.INSTANCE.play(Assets.BGM_BOSSC3, true);
else Music.INSTANCE.play(Assets.BGM_BOSSC, true);
} else if (Dungeon.bossLevel() && t == 20) {
if((Statistics.boss_enhance & 0x8) != 0) Music.INSTANCE.play(Assets.BGM_BOSSD2, true);
else Music.INSTANCE.play(Assets.BGM_BOSSD, true);
} else if (Dungeon.bossLevel() && t == 25 && (Statistics.spawnersAlive > 0)) {
Music.INSTANCE.play(Assets.BGM_BOSSE3, true);
}else if (Dungeon.bossLevel() && t == 25){
Music.INSTANCE.play(Assets.BGM_BOSSE, true);
} else if (Dungeon.bossLevel() && t == -15) {
Music.INSTANCE.play(Assets.BGM_FRBOSS, true);
int t = depth;
if(Dungeon.isDLC(BOSSRUSH)){
switch (depth){
case 2:
Music.INSTANCE.play(Assets.BGM_BOSSA, true);
break;
case 4:case 5:
Music.INSTANCE.play(Assets.BGM_BOSSB, true);
break;
case 8: case 10:
Music.INSTANCE.play(Assets.BGM_BOSSC, true);
break;
case 12: case 14:
Music.INSTANCE.play(Assets.BGM_BOSSD, true);
break;
case 16:
Music.INSTANCE.play(Assets.BGM_BOSSC3, true);
break;
case 19: case 21:
Music.INSTANCE.play(Assets.BGM_BOSSD2, true);
break;
case 25:
Music.INSTANCE.play(Assets.BGM_FRBOSS, true);
break;
case 26:
Music.INSTANCE.play(Assets.BGM_BOSSE3, true);
break;
case 28:
Music.INSTANCE.play( Assets.BGM_0, true );
break;
}
} else {
if (Dungeon.bossLevel() && t == 5) {
Music.INSTANCE.play(Assets.BGM_BOSSA, true);
} else if (Dungeon.bossLevel() && t == 10) {
Music.INSTANCE.play(Assets.BGM_BOSSB, true);
} else if (Dungeon.bossLevel() && t == 15 && Statistics.spawnersIce > 0) {
Music.INSTANCE.play(Assets.BGM_BOSSC3, true);
} else if (Dungeon.bossLevel() && t == 15) {
if(SPDSettings.level3boss()==3) Music.INSTANCE.play(Assets.BGM_BOSSC3, true);
else Music.INSTANCE.play(Assets.BGM_BOSSC, true);
} else if (Dungeon.bossLevel() && t == 20) {
if((Statistics.boss_enhance & 0x8) != 0) Music.INSTANCE.play(Assets.BGM_BOSSD2, true);
else Music.INSTANCE.play(Assets.BGM_BOSSD, true);
} else if (Dungeon.bossLevel() && t == 25 && (Statistics.spawnersAlive > 0)) {
Music.INSTANCE.play(Assets.BGM_BOSSE3, true);
}else if (Dungeon.bossLevel() && t == 25){
Music.INSTANCE.play(Assets.BGM_BOSSE, true);
} else if (Dungeon.bossLevel() && t == -15) {
Music.INSTANCE.play(Assets.BGM_FRBOSS, true);
}
}
}
}

View File

@ -177,7 +177,8 @@ public class Badges {
KILL_MG (133),
BIG_X (134),
EXSG (135);
EXSG (135),
BRCLER (136);
public boolean meta;
@ -973,6 +974,10 @@ public class Badges {
displayBadge( Badge.EXSG );
}
public static void BOSSRUSH() {
displayBadge( Badge.BRCLER );
}
public static void GOODRLPT() {
displayBadge( Badge.RLPT );
}

View File

@ -35,9 +35,6 @@ import com.shatteredpixel.shatteredpixeldungeon.scenes.InterlevelScene;
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
public class Challenges {
//Some of these internal IDs are outdated and don't represent what these challenges do
public static final int NO_FOOD = 1;
public static final int NO_ARMOR = 2;
public static final int NO_HEALING = 4;
@ -48,20 +45,16 @@ public class Challenges {
public static final int AQUAPHOBIA = 128;
public static final int CHAMPION_ENEMIES = 256;
public static final int RLPT = 512;
//public static final int BOSS = 8192;
public static final int SBSG = 1024;
public static final int EXSG = 2048;
public static final int STRONGER_BOSSES = 4096;
public static final int STRONGER_BOSSES = 4096;
public static final int DHXD = 8192;
public static final int ICEDIED = 16384;
public static final int PRO = 32768;
public static final int CS = 65536;
public static final int DHXD = 8192;
public static final int PRO = 16384;
// public static final int BUG = 32768;
public static final int MAX_VALUE = 32768;
public static final int MAX_VALUE = 131072;
public static final String[] NAME_IDS = {
"no_food",
"no_armor",
@ -77,12 +70,15 @@ public class Challenges {
"exsg",
"stronger_bosses",
"dhxd",
"icedied",
"pro",
"cs",
"cs",
};
public static final int[] MASKS = {
NO_FOOD, NO_ARMOR, NO_HEALING, NO_HERBALISM, SWARM_INTELLIGENCE, DARKNESS, NO_SCROLLS
, AQUAPHOBIA, CHAMPION_ENEMIES,RLPT,SBSG,EXSG,STRONGER_BOSSES,DHXD,PRO,
, AQUAPHOBIA, CHAMPION_ENEMIES,RLPT,SBSG,EXSG,STRONGER_BOSSES,DHXD,ICEDIED,PRO,CS,CS,
};
public String name;

View File

@ -5,15 +5,14 @@ public class DLC {
public static final int BOSSRUSH = 1;
public static final int BACKGO = 2;
public static final int MAX_VALUE = 65536;
public static final int MAX_VALUE = 4;
public static final String[] NAME_IDS = {
"bossrush",
"back_go"
};
public static final int[] MASKS = {
BOSSRUSH, BACKGO
BOSSRUSH
};
public String name;

View File

@ -21,6 +21,7 @@
package com.shatteredpixel.shatteredpixeldungeon;
import static com.shatteredpixel.shatteredpixeldungeon.DLC.BOSSRUSH;
import static com.shatteredpixel.shatteredpixeldungeon.actors.hero.HeroClass.ROGUE;
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
@ -53,15 +54,18 @@ import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.Scroll;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfRegrowth;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfWarding;
import com.shatteredpixel.shatteredpixeldungeon.journal.Notes;
import com.shatteredpixel.shatteredpixeldungeon.levels.AncityLevel;
import com.shatteredpixel.shatteredpixeldungeon.levels.CaveTwoBossLevel;
import com.shatteredpixel.shatteredpixeldungeon.levels.CavesGirlDeadLevel;
import com.shatteredpixel.shatteredpixeldungeon.levels.CavesLevel;
import com.shatteredpixel.shatteredpixeldungeon.levels.CityLevel;
import com.shatteredpixel.shatteredpixeldungeon.levels.DM920BossLevel;
import com.shatteredpixel.shatteredpixeldungeon.levels.DeadEndLevel;
import com.shatteredpixel.shatteredpixeldungeon.levels.DimandKingLevel;
import com.shatteredpixel.shatteredpixeldungeon.levels.DwarfMasterBossLevel;
import com.shatteredpixel.shatteredpixeldungeon.levels.ForestBossLevel;
import com.shatteredpixel.shatteredpixeldungeon.levels.HallsLevel;
import com.shatteredpixel.shatteredpixeldungeon.levels.ItemLevel;
import com.shatteredpixel.shatteredpixeldungeon.levels.LastLevel;
import com.shatteredpixel.shatteredpixeldungeon.levels.Level;
import com.shatteredpixel.shatteredpixeldungeon.levels.LinkLevel;
@ -70,6 +74,8 @@ import com.shatteredpixel.shatteredpixeldungeon.levels.NewCityBossLevel;
import com.shatteredpixel.shatteredpixeldungeon.levels.NewHallsBossLevel;
import com.shatteredpixel.shatteredpixeldungeon.levels.PrisonBossLevel;
import com.shatteredpixel.shatteredpixeldungeon.levels.PrisonLevel;
import com.shatteredpixel.shatteredpixeldungeon.levels.SLMKingLevel;
import com.shatteredpixel.shatteredpixeldungeon.levels.SewerBossLevel;
import com.shatteredpixel.shatteredpixeldungeon.levels.SewerLevel;
import com.shatteredpixel.shatteredpixeldungeon.levels.ShopBossLevel;
import com.shatteredpixel.shatteredpixeldungeon.levels.YogGodHardBossLevel;
@ -232,6 +238,8 @@ public class Dungeon {
}
public static int challenges;
public static int dlcs;
public static int mobsToChampion;
public static int mobsToStateLing;
@ -256,6 +264,9 @@ public class Dungeon {
version = Game.versionCode;
challenges = SPDSettings.challenges();
dlcs = SPDSettings.dlc();
mobsToChampion = -1;
mobsToStateLing = -1;
@ -321,6 +332,10 @@ public class Dungeon {
return (challenges & mask) != 0;
}
public static boolean isDLC( int mask ) {
return (dlcs & mask) != 0;
}
public static Level newLevel() {
Dungeon.level = null;
@ -338,58 +353,63 @@ public class Dungeon {
}
Level level;
//if (SPDSettings.BossRush()) {
// switch (depth) {
// case 0:
// level = new ZeroLevel();
// break;
// case 1: case 3: case 5:case 7:case 9:case 11:case 14:case 15:
// level = new ItemLevel();
// break;
// case 2:
// level = new SewerBossLevel();
// break;
// case 4:
// level = new SLMKingLevel();
// break;
// case 6:
// level = new PrisonBossLevel();
// break;
// case 8:
// level = new DimandKingLevel();
// break;
// case 10:
// level = new NewCavesBossLevel();
// break;
// case 12:
// level = new CaveTwoBossLevel();
// break;
// case 13:
// level = new CavesGirlDeadLevel();
// break;
// case 16:
// level = new NewCityBossLevel();
// break;
// case 17:
// level = new DwarfMasterBossLevel();
// break;
// case 18:case 19:case 20:case 21:
// level = new HallsLevel();
// break;
// case 22:
// level = new HallsBossLevel();
// break;
// case 23:
// level = new YogGodHardBossLevel();
// break;
// case 24:
// level = new LastLevel();
// break;
// default:
// level = new DeadEndLevel();
// Statistics.deepestFloor--;
// }
//} else
if (Dungeon.isDLC(BOSSRUSH)) {
switch (depth) {
case 17: case 27:case 0:
level = new AncityLevel();
break;
case 1: case 3: case 6:case 7:case 9: case 11: case 13: case 15:case 18: case 20: case 24:
level = new ItemLevel();
break;
case 2:
level = new ForestBossLevel();
break;
case 4:
level = new SewerBossLevel();
break;
case 5:
level = new SLMKingLevel();
break;
case 8:
level = new PrisonBossLevel();
break;
case 10:
level = new DimandKingLevel();
break;
case 12:
level = new NewCavesBossLevel();
break;
case 14:
level = new CaveTwoBossLevel();
break;
case 16:
level = new CavesGirlDeadLevel();
break;
case 19:
level = new NewCityBossLevel();
break;
case 21:
level = new DwarfMasterBossLevel();
Buff.affect(hero, TestDwarfMasterLock.class).set((1), 1);
break;
case 22:case 23:
level = new HallsLevel();
break;
case 25:
level = new ShopBossLevel();
break;
case 26:
level = new YogGodHardBossLevel();
break;
case 28:
level = new DM920BossLevel();
Buff.affect(hero, TestDwarfMasterLock.class).set((1), 1);
break;
default:
level = new DeadEndLevel();
Statistics.deepestFloor--;
}
} else
switch (depth) {
case 0:
level = new ZeroLevel();
@ -669,6 +689,7 @@ public class Dungeon {
private static final String VERSION = "version";
private static final String SEED = "seed";
private static final String CHALLENGES = "challenges";
private static final String DLCS = "dlcs";
private static final String MOBS_TO_CHAMPION = "mobs_to_champion";
private static final String HERO = "hero";
private static final String DEPTH = "depth";
@ -692,6 +713,7 @@ public class Dungeon {
bundle.put( VERSION, version );
bundle.put( SEED, seed );
bundle.put( CHALLENGES, challenges );
bundle.put( DLCS,dlcs);
bundle.put( MOBS_TO_CHAMPION, mobsToChampion );
bundle.put( MOBS_TO_STATELING, mobsToStateLing );
@ -794,6 +816,7 @@ public class Dungeon {
QuickSlotButton.reset();
Dungeon.challenges = bundle.getInt( CHALLENGES );
Dungeon.dlcs = bundle.getInt( DLCS);
Dungeon.mobsToChampion = bundle.getInt( MOBS_TO_CHAMPION );
Dungeon.mobsToStateLing = bundle.getInt( MOBS_TO_STATELING );

View File

@ -148,6 +148,8 @@ public class GamesInProgress {
info.name = hero.name().equals(hero.className()) ? "" : hero.name();
info.icehp = hero.icehp;
slotStates.put( slot, info );
}
@ -169,6 +171,7 @@ public class GamesInProgress {
public int depth;
public int version;
public int challenges;
public int icehp;
public String name;
public int level;
public int str;

View File

@ -372,10 +372,6 @@ public class SPDSettings extends GameSettings {
}
}
public static void systemFont(boolean value){
put(KEY_SYSTEMFONT, false);
}
public static boolean systemFont(){
return getBoolean(KEY_SYSTEMFONT,
(language() == Languages.CHINESE || language() == Languages.JAPANESE));

View File

@ -60,6 +60,7 @@ public class Statistics {
//灯火前行
public static boolean lanterfireactive = false;
//克里弗斯之果
public static boolean crivusfruitslevel2 = false;

View File

@ -1,81 +0,0 @@
package com.shatteredpixel.shatteredpixeldungeon.actors.buffs;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.watabou.utils.Bundle;
public class BugFixed extends Buff {
{
type = buffType.POSITIVE;
}
public static int level = 0;
private int interval = 1;
@Override
public boolean act() {
if (target.isAlive()) {
spend(interval);
if (level == 0) {
detach();
}
}
return true;
}
public int level() {
return level;
}
public void set( int value, int time ) {
//decide whether to override, preferring high value + low interval
if (Math.sqrt(interval)*level <= Math.sqrt(time)*value) {
level = value;
interval = time;
spend(time - cooldown() - 1);
}
}
@Override
public float iconFadePercent() {
if (target instanceof Hero){
float max = ((Hero) target).lvl;
return Math.max(0, (max-level)/max);
}
return 0;
}
@Override
public String toString() {
return Messages.get(this, "name");
}
@Override
public String desc() {
return Messages.get(this, "desc", level, dispTurns(visualcooldown()));
}
private static final String LEVEL = "level";
private static final String INTERVAL = "interval";
@Override
public void storeInBundle( Bundle bundle ) {
super.storeInBundle( bundle );
bundle.put( INTERVAL, interval );
bundle.put( LEVEL, level );
}
@Override
public void restoreFromBundle( Bundle bundle ) {
super.restoreFromBundle( bundle );
interval = bundle.getInt( INTERVAL );
level = bundle.getInt( LEVEL );
}
}

View File

@ -259,7 +259,7 @@ public abstract class ChampionHero extends FlavourBuff {
@Override
public boolean act() {
detach();
//detach();
multiplier += 0.1f;
spend(3*TICK);
return true;

View File

@ -35,7 +35,6 @@ import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.scenes.CellSelector;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
import com.shatteredpixel.shatteredpixeldungeon.ui.ActionIndicator;
@ -49,7 +48,6 @@ import com.watabou.noosa.audio.Sample;
import com.watabou.utils.Bundle;
import com.watabou.utils.Callback;
import com.watabou.utils.PathFinder;
import com.watabou.utils.Random;
public class Combo extends Buff implements ActionIndicator.Action {
@ -341,7 +339,7 @@ public class Combo extends Buff implements ActionIndicator.Action {
dist--;
}
}
WandOfBlastWave.throwChar(enemy, trajectory, dist, true, false);
WandOfBlastWave.throwChar(enemy, trajectory, dist, true, false, hero.getClass());
break;
case PARRY:
hit(enemy);

View File

@ -0,0 +1,117 @@
package com.shatteredpixel.shatteredpixeldungeon.actors.buffs;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.ui.BuffIndicator;
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
import com.watabou.utils.Bundle;
public class IceHpBuff extends Buff implements Hero.Doom {
private static final String LEVEL = "level";
private static final String PARTIALDAMAGE = "partialDamage";
private static final float STEP = 100.0f;
private float level;
private float partialDamage;
@Override
public boolean act() {
if (Dungeon.depth <= 5) {
spend(STEP);
return true;
} else if (Dungeon.level.locked || this.target.buff(LighS.class) != null) {
spend(STEP);
return true;
} else {
Hero hero = (Hero) this.target;
if (!this.target.isAlive()) {
diactivate();
return true;
}
if (hero.lanterfire > 30) {
hero.damageLantern(1);
spend(17f-(float) Dungeon.depth/5);
} else {
spend(STEP);
}
return true;
}
}
@Override
public String desc() {
// if (hero.icehp >= 90 && hero.icehp <= 100) {
// return Messages.get(this, "desc");
// } else if (hero.lanterfire >= 80 && hero.lanterfire <= 89) {
// return Messages.get(this, "desc2");
// } else if (hero.lanterfire >= 60 && hero.lanterfire <= 79) {
// return Messages.get(this, "desc3");
// } else if (hero.lanterfire >= 35 && hero.lanterfire <= 59) {
// return Messages.get(this, "desc4");
// } else if (hero.lanterfire >= 1 && hero.lanterfire <= 34) {
// return Messages.get(this, "desc5");
// } else {
// return Messages.get(this, "desc6");
// }
return Messages.get(this, "desc");
}
@Override
public int icon() {
// if (hero.lanterfire >= 90 && hero.lanterfire <= 100) {
// return BuffIndicator.LANTERFIRE_ONE;
// } else if (hero.lanterfire >= 80 && hero.lanterfire <= 89) {
// return BuffIndicator.LANTERFIRE_TWO;
// } else if (hero.lanterfire >= 60 && hero.lanterfire <= 79) {
// return BuffIndicator.LANTERFIRE_THREE;
// } else if (hero.lanterfire >= 35 && hero.lanterfire <= 59) {
// return BuffIndicator.LANTERFIRE_FOUR;
// } else if (hero.lanterfire >= 1 && hero.lanterfire <= 34) {
// return BuffIndicator.LANTERFIRE_FIVE;
// } else {
// return BuffIndicator.LANTERFIRE_SIX;
// }
return BuffIndicator.NONE;
}
@Override
public void onDeath() {
GLog.n("无尽的黑暗涌入了你的意识,你最终被黑暗拖入了深渊...");
}
@Override
public void restoreFromBundle(Bundle bundle) {
super.restoreFromBundle(bundle);
this.level = bundle.getFloat(LEVEL);
this.partialDamage = bundle.getFloat(PARTIALDAMAGE);
}
@Override
public void storeInBundle(Bundle bundle) {
super.storeInBundle(bundle);
bundle.put(LEVEL, this.level);
bundle.put(PARTIALDAMAGE, this.partialDamage);
}
public String toString() {
// if (hero.lanterfire >= 90 && hero.lanterfire <= 100) {
// return Messages.get(this, "name");
// } else if (hero.lanterfire >= 80 && hero.lanterfire <= 89) {
// return Messages.get(this, "name2");
// } else if (hero.lanterfire >= 60 && hero.lanterfire <= 79) {
// return Messages.get(this, "name3");
// } else if (hero.lanterfire >= 35 && hero.lanterfire <= 59) {
// return Messages.get(this, "name4");
// } else if (hero.lanterfire >= 1 && hero.lanterfire <= 34) {
// return Messages.get(this, "name5");
// } else {
// return Messages.get(this, "name6");
// }
return Messages.get(this, "name6");
}
}

View File

@ -16,8 +16,6 @@ public class Nyctophobia extends Buff implements Hero.Doom {
private static final float STEP = 100.0f;
public String[] hopelessTxt = {"你觉得自己注定失败。", "你感到无能为力。", "你感到生命在逐渐离你而去。"};
private float level;
private float partialDamage;

View File

@ -21,9 +21,13 @@
package com.shatteredpixel.shatteredpixeldungeon.actors.buffs;
import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.hero;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
import com.shatteredpixel.shatteredpixeldungeon.ui.BuffIndicator;
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
import com.watabou.noosa.Image;
import com.watabou.utils.Bundle;
@ -114,6 +118,15 @@ public class RandomBuff extends Buff {
spend( interval );
if (--level <= 0) {
detach();
GameScene.flash(0xff0000);
GLog.n("Now! You Time is Out Over!Go Died!!!");
for (Buff buff : hero.buffs()) {
if (buff instanceof RoseShiled) {
buff.detach();
}
}
Buff.affect( hero, Poison.class ).set(hero.HT);
Buff.affect( hero, LostInventory.class);
}
} else {

View File

@ -24,6 +24,7 @@ package com.shatteredpixel.shatteredpixeldungeon.actors.hero;
import static com.shatteredpixel.shatteredpixeldungeon.Challenges.AQUAPHOBIA;
import static com.shatteredpixel.shatteredpixeldungeon.Challenges.DHXD;
import static com.shatteredpixel.shatteredpixeldungeon.Challenges.PRO;
import static com.shatteredpixel.shatteredpixeldungeon.DLC.BOSSRUSH;
import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.hero;
import static com.shatteredpixel.shatteredpixeldungeon.SPDSettings.HelpSettings;
import static com.shatteredpixel.shatteredpixeldungeon.Statistics.lanterfireactive;
@ -72,6 +73,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.HasteLing;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Hex;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.HoldFast;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Hunger;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.IceHpBuff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Invisibility;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.InvisibilityRing;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.LostInventory;
@ -259,6 +261,8 @@ public class Hero extends Char {
//TODO 灯火前行
public int lanterfire;
public int icehp;
//蛋糕
public int CakeUsed;
@ -336,6 +340,8 @@ public class Hero extends Char {
private static final String LANTERFTR = "lanterfire";
private static final String ICEHP = "icehp";
private static final String CAKEUSED = "cakeused";
@Override
@ -343,6 +349,8 @@ public class Hero extends Char {
super.storeInBundle( bundle );
bundle.put( ICEHP, icehp );
bundle.put( LANTERFTR, lanterfire );
bundle.put( CLASS, heroClass );
@ -375,6 +383,8 @@ public class Hero extends Char {
lanterfire = bundle.getInt(LANTERFTR);
icehp = bundle.getInt(ICEHP);
HTBoost = bundle.getInt(HTBOOST);
super.restoreFromBundle( bundle );
@ -442,6 +452,7 @@ public class Hero extends Char {
info.str = bundle.getInt( STRENGTH );
info.exp = bundle.getInt( EXPERIENCE );
info.hp = bundle.getInt( Char.TAG_HP );
info.icehp = bundle.getInt( Hero.ICEHP );
info.ht = bundle.getInt( Char.TAG_HT );
info.shld = bundle.getInt( Char.TAG_SHLD );
info.heroClass = bundle.getEnum( CLASS, HeroClass.class );
@ -549,18 +560,8 @@ public class Hero extends Char {
Buff.affect( this, Nyctophobia.class );
}
// Buff.affect(hero, BlessMixShiled.class).set( (20), 1 );
// Buff.affect(hero, BlessMobDied.class).set( (20), 1 );
// Buff.affect(hero, BlessGoodSTR.class).set( (20), 1 );
// Buff.affect(hero, BlessNoMoney.class).set( (20), 1 );
// Buff.affect(hero, BlessGoRead.class).set( (20), 1 );
// Buff.affect(hero, BlessImmune.class).set( (20), 1 );
// Buff.affect(hero, MagicGirlSayMoneyMore.class).set( (20), 1 );
// Buff.affect(hero, MagicGirlSayNoSTR.class).set( (20), 1 );
// Buff.affect(hero, MagicGirlSaySlowy.class).set( (20), 1 );
// Buff.affect(hero, MagicGirlSaySoftDied.class).set( (20), 1 );
// Buff.affect(hero, MagicGirlSayCursed.class).set( (20), 1 );
// Buff.affect(hero, MagicGirlSayKill.class).set( (20), 1 );
//寒冷buff初始化
Buff.affect( this, IceHpBuff.class );
if(HelpSettings()) {
Buff.affect(this, GameTracker.class);
@ -934,6 +935,8 @@ public class Hero extends Char {
if ((Dungeon.challenges & ch) != 0) chCount++;
}
//icehp++;
if(chCount >= 3 && !lanterfireactive && !Dungeon.isChallenged(PRO) || Dungeon.isChallenged(DHXD) && !lanterfireactive){
//TODO 灯火前行
lanterfire = 100;
@ -1224,7 +1227,7 @@ public class Hero extends Char {
//TODO this is slightly brittle, it assumes there are no disjointed sets of exit tiles
} else if ((Dungeon.level.map[pos] == Terrain.EXIT || Dungeon.level.map[pos] == Terrain.UNLOCKED_EXIT)) {
if (Dungeon.depth == 0 && !tipsgodungeon) {
if (Dungeon.depth == 0 && !tipsgodungeon && !Dungeon.isDLC(BOSSRUSH)) {
if (!tipsgodungeon) {
Game.runOnRenderThread(new Callback() {
@ -1723,6 +1726,11 @@ public class Hero extends Char {
} else if (Dungeon.level.map[cell] == Terrain.LOCKED_DOOR || Dungeon.level.map[cell] == Terrain.CRYSTAL_DOOR || Dungeon.level.map[cell] == Terrain.LOCKED_EXIT) {
curAction = new HeroAction.Unlock( cell );
} else if ((cell == Dungeon.level.exit || Dungeon.level.map[cell] == Terrain.EXIT || Dungeon.level.map[cell] == Terrain.UNLOCKED_EXIT && Dungeon.isDLC(BOSSRUSH))
&& Dungeon.depth < 30) {
curAction = new HeroAction.Descend( cell );
} else if ((cell == Dungeon.level.exit || Dungeon.level.map[cell] == Terrain.EXIT || Dungeon.level.map[cell] == Terrain.UNLOCKED_EXIT)
&& Dungeon.depth < 26) {
@ -2697,4 +2705,15 @@ public class Hero extends Char {
hero.sprite.showStatus(0x00ff00, String.valueOf(value));
}
//TODO 寒冰值系统
public void damageIcehp(int value){
icehp -= value;
hero.sprite.showStatus(0x009999, String.valueOf(value));
}
public void healIcehp(int value){
icehp = Math.min(lanterfire+value,100);
hero.sprite.showStatus(0x00ffff, String.valueOf(value));
}
}

View File

@ -21,6 +21,8 @@
package com.shatteredpixel.shatteredpixeldungeon.actors.hero;
import static com.shatteredpixel.shatteredpixeldungeon.DLC.BOSSRUSH;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Badges;
import com.shatteredpixel.shatteredpixeldungeon.Challenges;
@ -44,6 +46,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.warrior.He
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.warrior.Shockwave;
import com.shatteredpixel.shatteredpixeldungeon.custom.testmode.LevelTeleporter;
import com.shatteredpixel.shatteredpixeldungeon.custom.testmode.MobPlacer;
import com.shatteredpixel.shatteredpixeldungeon.items.Amulet;
import com.shatteredpixel.shatteredpixeldungeon.items.Ankh;
import com.shatteredpixel.shatteredpixeldungeon.items.BrokenSeal;
import com.shatteredpixel.shatteredpixeldungeon.items.Item;
@ -168,6 +171,14 @@ public enum HeroClass {
new PotionOfExperience().quantity(2).identify().collect();
}
if ( Dungeon.isDLC(BOSSRUSH)){
Dungeon.gold += 3000;
}
if (Dungeon.isDLC(BOSSRUSH)){
new Amulet().quantity(1).identify().collect();
}
if (Dungeon.isChallenged(Challenges.PRO)){
new WandOfHightHunderStorm().quantity(11).identify().collect();
new LockSword().quantity(1).identify().collect();
@ -224,7 +235,7 @@ public enum HeroClass {
new KingBag().quantity(1).identify().collect();
new PotionOfLiquidFlameX().quantity(100).identify().collect();
new YellowSunBooks().quantity(1).identify().collect();
new BrokenBooks().quantity(1).identify().collect();
new BrokenBooks().quantity(44).identify().collect();
new DeepBloodBooks().quantity(1).identify().collect();
new BookBag().quantity(1).identify().collect();
new IceCityBooks().quantity(1).identify().collect();

View File

@ -53,6 +53,8 @@ public abstract class ArmorAbility implements Bundlable {
}
}
//leave null for no targeting
public String targetingPrompt(){
return null;

View File

@ -108,9 +108,12 @@ public class ElementalBlast extends ArmorAbility {
effectTypes.put(WandOfRegrowth.class, MagicMissile.FOLIAGE_CONE);
//TODO FIXED 将要修复的
effectTypes.put(WandOfScale.class, MagicMissile.FOLIAGE_CONE);
effectTypes.put(WandOfBlueFuck.class, MagicMissile.HALOFIRE);
effectTypes.put(WandOfScale.class, MagicMissile.SHAMAN_BLUE);
effectTypes.put(WandOfGodIce.class, MagicMissile.FOLIAGE_CONE);
effectTypes.put(WandOfBlueFuck.class, MagicMissile.FOLIAGE_CONE);
effectTypes.put(WandOfHightHunderStorm.class, MagicMissile.FOLIAGE_CONE);
}
@ -172,8 +175,6 @@ public class ElementalBlast extends ArmorAbility {
//*** Wand of Fireblast ***
} else if (wandCls == WandOfFireblast.class){
projectileProps = projectileProps | Ballistica.IGNORE_SOFT_SOLID;
} else if (wandCls == WandOfBlueFuck.class){
projectileProps = projectileProps | Ballistica.IGNORE_SOFT_SOLID;
//*** Wand of Warding ***
} else if (wandCls == WandOfWarding.class){
@ -294,11 +295,6 @@ public class ElementalBlast extends ArmorAbility {
Buff.affect( mob, Burning.class ).reignite( mob );
}
} else if (finalWandCls == WandOfBlueFuck.class){
if (mob.isAlive() && mob.alignment != Char.Alignment.ALLY) {
Buff.affect( mob, HalomethaneBurning.class ).reignite( mob );
}
//*** Wand of Corrosion ***
} else if (finalWandCls == WandOfCorrosion.class){
if (mob.isAlive() && mob.alignment != Char.Alignment.ALLY) {
@ -314,8 +310,10 @@ public class ElementalBlast extends ArmorAbility {
knockback *= effectMulti;
WandOfBlastWave.throwChar(mob,
new Ballistica(mob.pos, aim.collisionPos, Ballistica.MAGIC_BOLT),
knockback
);
knockback,
true,
true,
ElementalBlast.this.getClass());
}
//*** Wand of Frost ***
@ -380,8 +378,13 @@ public class ElementalBlast extends ArmorAbility {
Buff.prolong( mob, Roots.class, effectMulti*Roots.DURATION );
charsHit++;
}
} else if (finalWandCls == WandOfBlueFuck.class){
if (mob.alignment != Char.Alignment.ALLY) {
Buff.affect( mob, HalomethaneBurning.class ).reignite( mob, 7f );
charsHit++;
}
}
}
}
@ -461,4 +464,4 @@ public class ElementalBlast extends ArmorAbility {
public Talent[] talents() {
return new Talent[]{Talent.BLAST_RADIUS, Talent.ELEMENTAL_POWER, Talent.REACTIVE_BARRIER, Talent.HEROIC_ENERGY};
}
}
}

View File

@ -28,7 +28,6 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.FlavourBuff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Invisibility;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Vulnerable;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Weakness;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.ArmorAbility;
@ -102,7 +101,7 @@ public class HeroicLeap extends ArmorAbility {
if (mob.pos == hero.pos + i && hero.hasTalent(Talent.IMPACT_WAVE)){
Ballistica trajectory = new Ballistica(mob.pos, mob.pos + i, Ballistica.MAGIC_BOLT);
int strength = 1+hero.pointsInTalent(Talent.IMPACT_WAVE);
WandOfBlastWave.throwChar(mob, trajectory, strength, true);
WandOfBlastWave.throwChar(mob, trajectory, strength, true, true, HeroicLeap.this.getClass());
if (Random.Int(4) < hero.pointsInTalent(Talent.IMPACT_WAVE)){
Buff.prolong(mob, Vulnerable.class, 3f);
}

View File

@ -22,6 +22,7 @@
package com.shatteredpixel.shatteredpixeldungeon.actors.mobs;
import static com.shatteredpixel.shatteredpixeldungeon.Challenges.RLPT;
import static com.shatteredpixel.shatteredpixeldungeon.DLC.BOSSRUSH;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.watabou.utils.Random;
@ -41,33 +42,26 @@ public class Bestiary {
//支离破碎
private static ArrayList<Class<? extends Mob>> standardMobRotation(int i) {
if (Dungeon.isChallenged(RLPT)){
if (Dungeon.isChallenged(RLPT) && !Dungeon.isDLC(BOSSRUSH)){
switch (i) {
case 1:
//3x rat, 1x snake
return new ArrayList<>(Arrays.asList(
Rat.class, Rat.class,
Rat.class, OGPDZSLS.class, Snake.class,
Snake.class,Snake.class,Snake.class));
Rat.class));
case 2:
return new ArrayList<>(Arrays.asList(Rat.class,
Rat.class, Rat.class, Gnoll.class, Gnoll.class,
Gnoll.class, OGPDLLS.class, OGPDNQHZ.class, Crab.class));
Gnoll.class, Gnoll.class, Albino.class));
case 3:
return new ArrayList<>(Arrays.asList(Rat.class,
Rat.class, Rat.class, Gnoll.class, Gnoll.class,
Gnoll.class, OGPDLLS.class, OGPDNQHZ.class,
OGPDZSLS.class, Rat.class, Rat.class,
Snake.class,
Crab.class));
Rat.class, Salamander.class,
Salamander.class, Rat.class, Rat.class,
ClearElemental.class,Crab.class,Swarm.class));
case 4:
return new ArrayList<>(Arrays.asList(Rat.class,
Gnoll.class, Gnoll.class
, OGPDLLS.class,
Snake.class,
OGPDNQHZ.class, OGPDZSLS.class,
OGPDLLS.class, Snake.class,
Slime_Orange.class, Swarm.class, Crab.class));
return new ArrayList<>(Arrays.asList(Salamander.class,
ClearElemental.class, Slime_Red.class,
Slime_Orange.class, Swarm.class,Crab.class));
case 6:
case 7:
case 8:
@ -188,8 +182,7 @@ public class Bestiary {
return new ArrayList<>(Arrays.asList(Rat.class, Rat.class,Slime.class,Slime.class,Swarm.class,Crab.class));
case 6:
return new ArrayList<>(Arrays.asList(Skeleton.class,
BlackHost.class,Guard.class, DM100.class, DM100.class, DM100.class,
Snake.class));
BlackHost.class,Guard.class, DM100.class, DM100.class, DM100.class));
case 7:
return new ArrayList<>(Arrays.asList(Skeleton.class, BlackHost.class,
@ -265,16 +258,23 @@ public class Bestiary {
Monk.class, IceGolem.class,
Golem.class, IceGolem.class, Golem.class,Ice_Scorpio.class));
case 21:case 22:
case 21:
//3x succubus, 3x evil eye
return new ArrayList<>(Arrays.asList(
Eye.class,ShieldHuntsman.class,Ice_Scorpio.class));
case 22:
//3x succubus, 3x evil eye
return Dungeon.isDLC(BOSSRUSH) ? new ArrayList<>(Arrays.asList(
Eye.class,ShieldHuntsman.class,Ice_Scorpio.class,RedMurderer.class,MolotovHuntsman.class)) :
new ArrayList<>(Arrays.asList(
Eye.class,ShieldHuntsman.class,Ice_Scorpio.class));
case 23:
//1x: succubus, 2x evil eye, 3x scorpio
return new ArrayList<>(Arrays.asList(
Succubus.class,
Eye.class,
Scorpio.class, Succubus.class,ShieldHuntsman.class));
return Dungeon.isDLC(BOSSRUSH) ? new ArrayList<>(Arrays.asList(
Eye.class,ShieldHuntsman.class,Fire_Scorpio.class,Ice_Scorpio.class,RedMurderer.class,
MolotovHuntsman.class)) :
new ArrayList<>(Arrays.asList(
Eye.class,ShieldHuntsman.class,Ice_Scorpio.class));
//前半段决战
case 24:
//1x succubus, 2x evil eye, 3x scorpio

View File

@ -1,6 +1,7 @@
package com.shatteredpixel.shatteredpixeldungeon.actors.mobs;
import static com.shatteredpixel.shatteredpixeldungeon.Challenges.STRONGER_BOSSES;
import static com.shatteredpixel.shatteredpixeldungeon.DLC.BOSSRUSH;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Badges;
@ -506,7 +507,10 @@ public class DimandKing extends Boss {
@Override
public void die(Object cause) {
if(Dungeon.isDLC(BOSSRUSH)){
GetBossLoot();
}
GameScene.bossSlain();
super.die( cause );

View File

@ -22,6 +22,8 @@
package com.shatteredpixel.shatteredpixeldungeon.actors.mobs;
import static com.shatteredpixel.shatteredpixeldungeon.DLC.BOSSRUSH;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Badges;
import com.shatteredpixel.shatteredpixeldungeon.Challenges;
@ -493,7 +495,10 @@ public class DwarfKing extends Mob {
@Override
public void die(Object cause) {
if(Dungeon.isDLC(BOSSRUSH)){
GetBossLoot();
}
GameScene.bossSlain();
super.die( cause );

View File

@ -32,6 +32,8 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Freezing;
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.Frost;
import com.shatteredpixel.shatteredpixeldungeon.effects.Lightning;
import com.shatteredpixel.shatteredpixeldungeon.effects.Splash;
import com.shatteredpixel.shatteredpixeldungeon.items.Gold;
@ -277,11 +279,18 @@ public abstract class Elemental extends Mob {
super.die(cause);
if (alignment == Alignment.ENEMY) Dungeon.level.drop( new Embers(), pos ).sprite.drop();
//机会
Badges.KILL_COLDELE();
}
@Override
protected boolean act() {
if(buff(Frost.class) != null || buff(Chill.class) != null) {
this.die(Frost.class);
return true;
}
return super.act();
}
@Override
public boolean reset() {
return true;

View File

@ -275,7 +275,7 @@ public class FlameC01 extends Mob {
affectedCells = new HashSet<>();
visualCells = new HashSet<>();
int maxDist = 4 + 4*4;
int maxDist = 2 + 4*4;
int dist = Math.min(bolt.dist, maxDist);
for (int i = 0; i < PathFinder.CIRCLE8.length; i++){
@ -341,7 +341,7 @@ public class FlameC01 extends Mob {
}
private int right(int direction){
return direction == 7 ? 0 : direction+1;
return direction == 3 ? 0 : direction+1;
}
protected void onZap( Ballistica bolt ) {

View File

@ -21,6 +21,8 @@
package com.shatteredpixel.shatteredpixeldungeon.actors.mobs;
import static com.shatteredpixel.shatteredpixeldungeon.DLC.BOSSRUSH;
import com.shatteredpixel.shatteredpixeldungeon.Badges;
import com.shatteredpixel.shatteredpixeldungeon.Challenges;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
@ -48,7 +50,12 @@ import com.watabou.utils.Random;
public class Goo extends Mob {
{
HP = HT = Dungeon.isChallenged(Challenges.STRONGER_BOSSES) ? 120 : 100;
if(Dungeon.isDLC(BOSSRUSH)){
HP = HT = 180;
} else {
HP = HT = Dungeon.isChallenged(Challenges.STRONGER_BOSSES) ? 120 : 100;
}
EXP = 10;
defenseSkill = 8;
spriteClass = GooSprite.class;
@ -246,25 +253,30 @@ public class Goo extends Mob {
public void die( Object cause ) {
super.die( cause );
Dungeon.level.unseal();
GameScene.bossSlain();
Dungeon.level.drop( new SkeletonKey( Dungeon.depth ), pos ).sprite.drop();
//60% chance of 2 blobs, 30% chance of 3, 10% chance for 4. Average of 2.5
int blobs = Random.chances(new float[]{0, 0, 6, 3, 1});
for (int i = 0; i < blobs; i++){
int ofs;
do {
ofs = PathFinder.NEIGHBOURS8[Random.Int(8)];
} while (!Dungeon.level.passable[pos + ofs]);
Dungeon.level.drop( new GooBlob(), pos + ofs ).sprite.drop( pos );
if(Dungeon.depth!=28){
Dungeon.level.unseal();
GetBossLoot();
GameScene.bossSlain();
Dungeon.level.drop( new SkeletonKey( Dungeon.depth ), pos ).sprite.drop();
//60% chance of 2 blobs, 30% chance of 3, 10% chance for 4. Average of 2.5
int blobs = Random.chances(new float[]{0, 0, 6, 3, 1});
for (int i = 0; i < blobs; i++){
int ofs;
do {
ofs = PathFinder.NEIGHBOURS8[Random.Int(8)];
} while (!Dungeon.level.passable[pos + ofs]);
Dungeon.level.drop( new GooBlob(), pos + ofs ).sprite.drop( pos );
}
Badges.validateBossSlain();
yell( Messages.get(this, "defeated") );
}
Badges.validateBossSlain();
yell( Messages.get(this, "defeated") );
}
@Override

View File

@ -1,5 +1,6 @@
package com.shatteredpixel.shatteredpixeldungeon.actors.mobs;
import static com.shatteredpixel.shatteredpixeldungeon.DLC.BOSSRUSH;
import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.hero;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
@ -371,7 +372,10 @@ public class MagicGirlDead extends Boss {
public void die(Object src){
super.die(src);
if(Dungeon.isDLC(BOSSRUSH)){
GetBossLoot();
}
yell(Messages.get(this, "die"));
for(Mob m: Dungeon.level.mobs.toArray(new Mob[0])){
@ -584,7 +588,7 @@ public class MagicGirlDead extends Boss {
if (Dungeon.level.adjacent(pos, target.pos)){
int oppositeAdjacent = target.pos + (target.pos - pos);
Ballistica trajectory = new Ballistica(target.pos, oppositeAdjacent, Ballistica.MAGIC_BOLT);
WandOfBlastWave.throwChar(target, trajectory, 2, false, false);
WandOfBlastWave.throwChar(target, trajectory, 2, false, false, getClass());
if (target == hero){
hero.interrupt();
}

View File

@ -60,6 +60,8 @@ import com.shatteredpixel.shatteredpixeldungeon.items.Gold;
import com.shatteredpixel.shatteredpixeldungeon.items.Item;
import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.MasterThievesArmband;
import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.TimekeepersHourglass;
import com.shatteredpixel.shatteredpixeldungeon.items.food.Food;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfExperience;
import com.shatteredpixel.shatteredpixeldungeon.items.rings.Ring;
import com.shatteredpixel.shatteredpixeldungeon.items.rings.RingOfWealth;
import com.shatteredpixel.shatteredpixeldungeon.items.stones.StoneOfAggression;
@ -92,12 +94,38 @@ public abstract class Mob extends Char {
alignment = Alignment.ENEMY;
}
private static final String TXT_DIED = "You hear something died in the distance";
protected static final String TXT_NOTICE1 = "?!";
protected static final String TXT_RAGE = "#$%^";
protected static final String TXT_EXP = "%+dEXP";
public ArrayList<Item> items;
//Boss Rush 掉落规则
public void GetBossLoot(){
int flakes = Random.chances(new float[]{0, 0, 6, 3, 1});
for (int i = 0; i < flakes; i++){
int ofs;
do {
ofs = PathFinder.NEIGHBOURS8[Random.Int(4)];
} while (!Dungeon.level.passable[pos + ofs]);
switch (Random.Int(5)) {
case 0:
Dungeon.level.drop( ( Generator.random(Generator.Category.POTION)), pos+ofs );
break;
case 1:
Dungeon.level.drop( ( Generator.randomMissile() ), pos+ofs );
break;
case 2:
Dungeon.level.drop( ( Generator.randomArmor() ), pos+ofs );
break;
case 3:
Dungeon.level.drop( ( Generator.randomWeapon() ), pos+ofs );
break;
case 4:
Dungeon.level.drop( ( Generator.random(Generator.Category.RING) ), pos+ofs );
break;
}
}
Dungeon.level.drop( new Food(), pos ).sprite.drop();
Dungeon.level.drop( new PotionOfExperience(), pos ).sprite.drop();
Dungeon.level.drop( ( new Gold().random() ), pos );
}
public AiState SLEEPING = new Sleeping();
public AiState HUNTING = new Hunting();

View File

@ -21,6 +21,7 @@
package com.shatteredpixel.shatteredpixeldungeon.actors.mobs;
import static com.shatteredpixel.shatteredpixeldungeon.DLC.BOSSRUSH;
import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.hero;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
@ -401,7 +402,7 @@ public class NewDM300 extends Mob {
if (Dungeon.level.adjacent(pos, target.pos)){
int oppositeAdjacent = target.pos + (target.pos - pos);
Ballistica trajectory = new Ballistica(target.pos, oppositeAdjacent, Ballistica.MAGIC_BOLT);
WandOfBlastWave.throwChar(target, trajectory, 2, false, false);
WandOfBlastWave.throwChar(target, trajectory, 2, false, false, getClass());
if (target == Dungeon.hero){
Dungeon.hero.interrupt();
}
@ -515,7 +516,10 @@ public class NewDM300 extends Mob {
public void die( Object cause ) {
super.die( cause );
if(Dungeon.isDLC(BOSSRUSH)){
GetBossLoot();
}
GameScene.bossSlain();
Dungeon.level.unseal();

View File

@ -21,6 +21,8 @@
package com.shatteredpixel.shatteredpixeldungeon.actors.mobs;
import static com.shatteredpixel.shatteredpixeldungeon.DLC.BOSSRUSH;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Badges;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
@ -407,7 +409,7 @@ public class NewDM720 extends MolotovHuntsman {
if (Dungeon.level.adjacent(pos, target.pos)){
int oppositeAdjacent = target.pos + (target.pos - pos);
Ballistica trajectory = new Ballistica(target.pos, oppositeAdjacent, Ballistica.MAGIC_BOLT);
WandOfBlastWave.throwChar(target, trajectory, 10, false, false);
WandOfBlastWave.throwChar(target, trajectory, 8, false, false, getClass());
if (target == Dungeon.hero){
Dungeon.hero.interrupt();
}
@ -527,7 +529,10 @@ public class NewDM720 extends MolotovHuntsman {
@Override
public void die( Object cause ) {
if(Dungeon.isDLC(BOSSRUSH)){
GetBossLoot();
}
super.die(cause);
Badges.validateBossSlain();
Badges.KILLSDM720();

View File

@ -22,11 +22,9 @@
package com.shatteredpixel.shatteredpixeldungeon.actors.mobs;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Badges;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Blob;
import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.ToxicGas;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.LockedFloor;
@ -35,9 +33,6 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Terror;
import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter;
import com.shatteredpixel.shatteredpixeldungeon.effects.Speck;
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.ElmoParticle;
import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.LloydsBeacon;
import com.shatteredpixel.shatteredpixeldungeon.items.keys.SkeletonKey;
import com.shatteredpixel.shatteredpixeldungeon.items.quest.MetalShard;
import com.shatteredpixel.shatteredpixeldungeon.levels.Level;
import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
@ -48,7 +43,6 @@ import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
import com.watabou.noosa.Camera;
import com.watabou.noosa.audio.Sample;
import com.watabou.utils.Bundle;
import com.watabou.utils.PathFinder;
import com.watabou.utils.Random;
public class OldDM300 extends Mob {
@ -84,7 +78,7 @@ public class OldDM300 extends Mob {
@Override
public boolean act() {
GameScene.add( Blob.seed( pos, 30, ToxicGas.class ) );
//GameScene.add( Blob.seed( pos, 30, ToxicGas.class ) );
return super.act();
}
@ -93,7 +87,7 @@ public class OldDM300 extends Mob {
public void move( int step ) {
super.move( step );
if (Dungeon.level.map[step] == Terrain.INACTIVE_TRAP && HP < HT) {
if (Dungeon.level.map[step] == Terrain.WATER && HP < HT) {
HP += Random.Int( 1, HT - HP );
sprite.emitter().burst( ElmoParticle.FACTORY, 5 );
@ -137,34 +131,6 @@ public class OldDM300 extends Mob {
LockedFloor lock = Dungeon.hero.buff(LockedFloor.class);
if (lock != null && !isImmune(src.getClass())) lock.addTime(dmg*1.5f);
}
@Override
public void die( Object cause ) {
super.die( cause );
GameScene.bossSlain();
Dungeon.level.drop( new SkeletonKey( Dungeon.depth ), pos ).sprite.drop();
//60% chance of 2 shards, 30% chance of 3, 10% chance for 4. Average of 2.5
int shards = Random.chances(new float[]{0, 0, 6, 3, 1});
for (int i = 0; i < shards; i++){
int ofs;
do {
ofs = PathFinder.NEIGHBOURS8[Random.Int(8)];
} while (!Dungeon.level.passable[pos + ofs]);
Dungeon.level.drop( new MetalShard(), pos + ofs ).sprite.drop( pos );
}
Badges.validateBossSlain();
LloydsBeacon beacon = Dungeon.hero.belongings.getItem(LloydsBeacon.class);
if (beacon != null) {
beacon.upgrade();
}
yell( Messages.get(this, "defeated") );
}
{
immunities.add( ToxicGas.class );

View File

@ -73,6 +73,7 @@ public class Rat extends Mob {
if (alignment == Alignment.ALLY) bundle.put(RAT_ALLY, true);
}
@Override
public void restoreFromBundle(Bundle bundle) {
super.restoreFromBundle(bundle);

View File

@ -23,6 +23,8 @@ package com.shatteredpixel.shatteredpixeldungeon.actors.mobs;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Bleeding;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Corruption;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Terror;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
@ -163,7 +165,7 @@ public class RedMurderer extends Mob {
} else if (item instanceof Honeypot.ShatteredPot) {
((Honeypot.ShatteredPot)item).pickupPot(this);
}
Buff.affect(this, Bleeding.class).set(10f);
return true;
} else {
return false;

View File

@ -7,7 +7,6 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Fire;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Burning;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Poison;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.Ghost;
import com.shatteredpixel.shatteredpixeldungeon.items.Generator;
import com.shatteredpixel.shatteredpixeldungeon.items.Item;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.MissileWeapon;
@ -111,13 +110,6 @@ public class Salamander extends Mob {
return drop;
}
@Override
public void die( Object cause ) {
super.die( cause );
Ghost.Quest.process();
}
private static final String COMBO = "combo";
@Override

View File

@ -21,6 +21,7 @@
package com.shatteredpixel.shatteredpixeldungeon.actors.mobs;
import static com.shatteredpixel.shatteredpixeldungeon.DLC.BOSSRUSH;
import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.hero;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
@ -45,7 +46,6 @@ import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.SlimeKingSprite;
import com.shatteredpixel.shatteredpixeldungeon.ui.BossHealthBar;
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
import com.watabou.noosa.audio.Music;
import com.watabou.noosa.audio.Sample;
import com.watabou.utils.Bundle;
import com.watabou.utils.Callback;
@ -111,8 +111,15 @@ public class SlimeKing extends Mob {
}
{
HP =140;
HT= 140;
if(Dungeon.isDLC(BOSSRUSH)){
HP =190;
HT= 190;
} else {
HP =140;
HT= 140;
}
EXP = 20;
defenseSkill = 12;
spriteClass = SlimeKingSprite.class;
@ -298,7 +305,6 @@ public class SlimeKing extends Mob {
public void notice() {
super.notice();
BossHealthBar.assignBoss(this);
Music.INSTANCE.play(Assets.BGM_BOSSA, true);
yell( Messages.get(this, "notice") );
chainsUsed = false;
//summon();
@ -325,9 +331,12 @@ public class SlimeKing extends Mob {
} while (!Dungeon.level.passable[pos + ofs]);
Dungeon.level.drop( new GooBlob(), pos + ofs ).sprite.drop( pos );
}
if(Dungeon.isDLC(BOSSRUSH)){
GetBossLoot();
}
Badges.validateBossSlain();
// Badges.KILLSLIMKING();
yell( Messages.get(this, "defeated") );
for (Mob mob : Dungeon.level.mobs.toArray(new Mob[0])){
if ( mob instanceof Swarm||

View File

@ -21,6 +21,8 @@
package com.shatteredpixel.shatteredpixeldungeon.actors.mobs;
import static com.shatteredpixel.shatteredpixeldungeon.DLC.BOSSRUSH;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Badges;
import com.shatteredpixel.shatteredpixeldungeon.Challenges;
@ -200,7 +202,10 @@ public class Tengu extends Mob {
@Override
public void die( Object cause ) {
if(Dungeon.isDLC(BOSSRUSH)){
GetBossLoot();
}
if (Dungeon.hero.subClass == HeroSubClass.NONE) {
Dungeon.level.drop( new TengusMask(), pos ).sprite.drop();
}

View File

@ -4,6 +4,7 @@ import static com.shatteredpixel.shatteredpixeldungeon.Challenges.AQUAPHOBIA;
import static com.shatteredpixel.shatteredpixeldungeon.Challenges.EXSG;
import static com.shatteredpixel.shatteredpixeldungeon.Challenges.RLPT;
import static com.shatteredpixel.shatteredpixeldungeon.Challenges.SBSG;
import static com.shatteredpixel.shatteredpixeldungeon.DLC.BOSSRUSH;
import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.hero;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
@ -255,7 +256,7 @@ public class YogReal extends Boss {
int dist = Dungeon.level.distance(pos, ch.pos);
if(dist <= 4 && dist > 0){
Ballistica ba = HitBack.bounceBack(ch, this);
WandOfBlastWave.throwChar(ch, ba, 10 - 2 * dist);
WandOfBlastWave.throwChar(ch, ba, 10 - 2 * dist, false, false, getClass());
}
}
@ -478,6 +479,10 @@ public class YogReal extends Boss {
actScanning();
actSummon();
actDestroy();
if(Dungeon.isDLC(BOSSRUSH)){
GetBossLoot();
}
for (Mob mob : (Iterable<Mob>)Dungeon.level.mobs.clone()) {
if (mob instanceof Larva
|| mob instanceof RipperDemon

View File

@ -1,5 +1,6 @@
package com.shatteredpixel.shatteredpixeldungeon.actors.mobs.bosses;
import static com.shatteredpixel.shatteredpixeldungeon.DLC.BOSSRUSH;
import static com.shatteredpixel.shatteredpixeldungeon.Statistics.crivusfruitslevel2;
import static com.shatteredpixel.shatteredpixeldungeon.levels.ForestBossLevel.BRatKingRoom;
import static com.shatteredpixel.shatteredpixeldungeon.levels.ForestBossLevel.ForestBossLasherTWOPos;
@ -252,7 +253,7 @@ public class CrivusFruits extends Mob {
for (int i = 0; i < blobs; i++){
int ofs;
do {
ofs = PathFinder.NEIGHBOURS8[Random.Int(6)];
ofs = PathFinder.NEIGHBOURS8[Random.Int(3)];
} while (!Dungeon.level.passable[pos + ofs]);
Dungeon.level.drop( new CrivusFruitsFood(), pos + ofs ).sprite.drop( pos );
}
@ -261,11 +262,17 @@ public class CrivusFruits extends Mob {
for (int i = 0; i < flakes; i++){
int ofs;
do {
ofs = PathFinder.NEIGHBOURS8[Random.Int(8)];
ofs = PathFinder.NEIGHBOURS8[Random.Int(4)];
} while (!Dungeon.level.passable[pos + ofs]);
Dungeon.level.drop( new CrivusFruitsFlake(), pos + ofs ).sprite.drop( pos );
}
if(Dungeon.isDLC(BOSSRUSH)){
GetBossLoot();
}
}

View File

@ -5,34 +5,40 @@ import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.hero;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Badges;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.Statistics;
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.ToxicGas;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Blindness;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Chill;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Degrade;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Burning;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ChampionEnemy;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Corrosion;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.LockedFloor;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Paralysis;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.RandomBuff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Terror;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.TestDwarfMasterLock;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.FlameB01;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.NewDM300;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Spinner;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.NullDiedTO;
import com.shatteredpixel.shatteredpixeldungeon.effects.BlobEmitter;
import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter;
import com.shatteredpixel.shatteredpixeldungeon.effects.Pushing;
import com.shatteredpixel.shatteredpixeldungeon.effects.Speck;
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.BlastParticle;
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.ElmoParticle;
import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.LloydsBeacon;
import com.shatteredpixel.shatteredpixeldungeon.items.keys.SkeletonKey;
import com.shatteredpixel.shatteredpixeldungeon.items.stones.StoneOfEnchantment;
import com.shatteredpixel.shatteredpixeldungeon.items.keys.IronKey;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfBlastWave;
import com.shatteredpixel.shatteredpixeldungeon.levels.Level;
import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain;
import com.shatteredpixel.shatteredpixeldungeon.levels.NewCavesBossLevel;
import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.DM150Sprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.DM275Sprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.DM300AttackSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.DM300SpiderSprite;
@ -47,78 +53,90 @@ import com.watabou.utils.PathFinder;
import com.watabou.utils.Random;
import java.util.ArrayList;
import java.util.Iterator;
/*
* DM920 隐藏Boss
* DMZERO 隐藏Boss
* 总共四个形态
* This is DM920 Boss
* Total 4 Read
*/
public class DM920 extends Mob
public class DMZERO extends Mob
{
public static class DM150 extends Mob
public static class DM300AttackMode extends FlameB01 implements Callback
{
public int attackSkill(Char char1)
{
return 14;
}
public int attackProc(Char var1, int var2) {
byte var3 = 0;
int var4;
@Override
public void damage(int dmg, Object src) {
super.damage(dmg, src);
LockedFloor lock = Dungeon.hero.buff(LockedFloor.class);
if (lock != null && !isImmune(src.getClass())) lock.addTime(dmg*1.5f);
}
public int damageRoll()
{
return Random.NormalIntRange(10, 13);
}
int var5 = super.attackProc(var1, var2);
var4 = var1.pos;
CellEmitter.center(var4).burst(BlastParticle.FACTORY, 30);
GameScene.add(Blob.seed(var4, 2, Fire.class));
int[] var7 = PathFinder.NEIGHBOURS9;
int var6 = var7.length;
public int drRoll() {
return Random.NormalIntRange(0, 10);
}
public void move(int i)
{
super.move(i);
if(Dungeon.level.map[i] == 19 && HP < HT)
{
HP = HP + Random.Int(1, HT - HP);
sprite.emitter().burst(ElmoParticle.FACTORY, 3);
if(Dungeon.level.heroFOV[i] && Dungeon.hero.isAlive())
GLog.n(Messages.get(this, "repair"));
for(var2 = var3; var2 < var6; ++var2) {
int var8 = var7[var2];
if (!Dungeon.level.solid[var4 + var8]) {
GameScene.add(Blob.seed(var4 + var8, 2, Fire.class));
}
}
return var5;
}
public void notice()
{
super.notice();
yell(Messages.get(this, "notice"));
}
public DM150()
{
spriteClass = DM150Sprite.class;
HT = 50;
HP = 50;
EXP = 15;
defenseSkill = 9;
loot = new StoneOfEnchantment();
lootChance = 0.333F;
}
}
public static class DM300AttackMode extends Mob implements Callback
{
public int attackSkill(Char char1)
{
return 28;
}
public void dropRocks( Char target ) {
Dungeon.hero.interrupt();
final int rockCenter;
if (Dungeon.level.adjacent(pos, target.pos)){
int oppositeAdjacent = target.pos + (target.pos - pos);
Ballistica trajectory = new Ballistica(target.pos, oppositeAdjacent, Ballistica.MAGIC_BOLT);
WandOfBlastWave.throwChar(target, trajectory, 2, false, false, getClass());
if (target == Dungeon.hero){
Dungeon.hero.interrupt();
}
rockCenter = trajectory.path.get(Math.min(trajectory.dist, 2));
} else {
rockCenter = target.pos;
}
int safeCell;
do {
safeCell = rockCenter + PathFinder.NEIGHBOURS8[Random.Int(8)];
} while (safeCell == pos
|| (Dungeon.level.solid[safeCell] && Random.Int(2) == 0)
|| (Blob.volumeAt(safeCell, NewCavesBossLevel.PylonEnergy.class) > 0 && Random.Int(2) == 0));
ArrayList<Integer> rockCells = new ArrayList<>();
int start = rockCenter - Dungeon.level.width() * 3 - 3;
int pos;
for (int y = 0; y < 7; y++) {
pos = start + Dungeon.level.width() * y;
for (int x = 0; x < 7; x++) {
if (!Dungeon.level.insideMap(pos)) {
pos++;
continue;
}
//add rock cell to pos, if it is not solid, and isn't the safecell
if (!Dungeon.level.solid[pos] && pos != safeCell && Random.Int(Dungeon.level.distance(rockCenter, pos)) == 0) {
//don't want to overly punish players with slow move or attack speed
rockCells.add(pos);
}
pos++;
}
}
Buff.append(this, NewDM300.FallingRockBuff.class, Math.min(target.cooldown(), 3*TICK)).setRockPositions(rockCells);
}
@Override
public void damage(int dmg, Object src) {
super.damage(dmg, src);
@ -131,26 +149,10 @@ public class DM920 extends Mob
return Random.NormalIntRange(20, 25);
}
@Override
public int attackProc(Char enemy, int damage ) {
damage = super.attackProc( enemy, damage );
if (Random.Int( 2 ) == 0) {
Buff.prolong( enemy, Chill.class, Chill.DURATION );
}
return damage;
}
@Override
protected boolean canAttack( Char enemy ) {
Ballistica attack = new Ballistica( pos, enemy.pos, Ballistica.PROJECTILE);
return !Dungeon.level.adjacent( pos, enemy.pos ) && attack.collisionPos == enemy.pos;
}
public void die(Object obj)
{
super.die(obj);
Dungeon.level.drop(new IronKey(Dungeon.depth), pos).sprite.drop();
obj = new DM300SpiderMode();
((DM300SpiderMode) obj).pos = pos;
GameScene.add(((Mob) (obj)));
@ -172,6 +174,11 @@ public class DM920 extends Mob
GameScene.add(Blob.seed(trajectory.collisionPos, 100, ToxicGas.class));
if(Random.Float()>=0.4f){
dropRocks(enemy);
}
if (gasVented < 250){
int toVentAround = (int)Math.ceil((250 - gasVented)/8f);
for (int i : PathFinder.NEIGHBOURS8){
@ -229,9 +236,10 @@ public class DM920 extends Mob
public DM300AttackMode()
{
spriteClass = DM300AttackSprite.class;
HT = 350;
HP = 350;
HT = 140;
HP = 140;
EXP = 30;
Buff.affect(this, ChampionEnemy.Blazing.class);
defenseSkill = 18;
}
@ -264,7 +272,7 @@ public class DM920 extends Mob
if (hit( this, enemy, true )) {
//TODO would be nice for this to work on ghost/statues too
if (enemy == Dungeon.hero && Random.Int( 2 ) == 0) {
Buff.prolong( enemy, Blindness.class, Degrade.DURATION );
Buff.affect( hero, Burning.class ).reignite( hero, 12f );
Sample.INSTANCE.play( Assets.Sounds.DEBUFF );
}
@ -273,7 +281,7 @@ public class DM920 extends Mob
if (enemy == Dungeon.hero && !enemy.isAlive()) {
Dungeon.fail( getClass() );
GLog.n( Messages.get(this, "frost_kill") );
//GLog.n( Messages.get(this, "frost_kill") );
}
} else {
enemy.sprite.showStatus( CharSprite.NEUTRAL, enemy.defenseVerb() );
@ -303,13 +311,73 @@ public class DM920 extends Mob
{
return Random.NormalIntRange(20, 25);
}
private int pumpedUp = 0;
private int healInc = 1;
@Override
public boolean act() {
if (HP < HT) {
HP += Dungeon.level.water[pos] ? healInc+3 : healInc;
LockedFloor lock = Dungeon.hero.buff(LockedFloor.class);
if (lock != null) lock.removeTime(healInc*2);
if (Dungeon.level.heroFOV[pos] ){
sprite.emitter().burst( Speck.factory( Speck.HEALING ), healInc );
}
if (healInc < 1) {
healInc++;
}
if (HP*2 > HT) {
BossHealthBar.bleed(false);
HP = Math.min(HP, HT);
}
} else {
healInc = 1;
}
if (state != SLEEPING){
Dungeon.level.seal();
}
return super.act();
}
{
immunities.add( ToxicGas.class );
immunities.add( Corrosion.class );
immunities.add( Terror.class );
}
private final String PUMPEDUP = "pumpedup";
private final String HEALINC = "healinc";
@Override
public void storeInBundle( Bundle bundle ) {
super.storeInBundle( bundle );
bundle.put( PUMPEDUP , pumpedUp );
bundle.put( HEALINC, healInc );
}
public void die(Object obj)
{
super.die(obj);
GameScene.bossSlain();
Dungeon.level.drop(new SkeletonKey(Dungeon.depth), pos).sprite.drop();
Badges.validateBossSlain();
for (Buff buff : hero.buffs()) {
if (buff instanceof TestDwarfMasterLock) {
buff.detach();
}
}
Statistics.amuletObtained = true;
obj = new NullDiedTO();
((NullDiedTO) obj).pos = pos;
GameScene.add(((Mob) (obj)));
Actor.addDelayed(new Pushing(((Char) (obj)), pos, ((NullDiedTO) (obj)).pos), -1F);
Badges.BOSSRUSH();
yell( Messages.get(this, "defeated") );
}
@ -375,16 +443,22 @@ public class DM920 extends Mob
public DM300DeathBall()
{
spriteClass = DM275Sprite.class;
HT = 1000;
HP = 1000;
EXP = 10;
HT = 400;
HP = 400;
EXP = 400;
defenseSkill = 25;
Buff.affect(this, ChampionEnemy.AntiMagic.class);
Buff.affect(this, ChampionEnemy.Growing.class);
}
}
public static class DM300SpiderMode extends Spinner
{
{
immunities.add( ToxicGas.class );
immunities.add( Terror.class );
immunities.add( DiedBlobs.class );
}
public int attackSkill(Char char1)
{
return 26;
@ -396,6 +470,35 @@ public class DM920 extends Mob
return super.act();
}
@Override
public int attackProc(Char var1, int var2) {
byte var3 = 0;
int var4;
int var5 = super.attackProc(var1, var2);
var4 = var1.pos;
CellEmitter.center(var4).burst(BlastParticle.FACTORY, 30);
GameScene.add(Blob.seed(var4, 2, Fire.class));
int[] var7 = PathFinder.NEIGHBOURS9;
int var6 = var7.length;
for(var2 = var3; var2 < var6; ++var2) {
int var8 = var7[var2];
if (!Dungeon.level.solid[var4 + var8]) {
GameScene.add(Blob.seed(var4 + var8, 2, Fire.class));
}
}
return var5;
}
@Override
public void restoreFromBundle(Bundle b){
super.restoreFromBundle(b);
BossHealthBar.assignBoss(this);
if (HP < 200) BossHealthBar.bleed(true);
}
@Override
public void damage(int dmg, Object src) {
super.damage(dmg, src);
@ -405,13 +508,16 @@ public class DM920 extends Mob
public int damageRoll()
{
return Random.NormalIntRange(18, 23);
return Random.NormalIntRange(30, 50);
}
public void die(Object obj)
{
super.die(obj);
obj = new DM300DeathBall();
Dungeon.level.drop(new IronKey(Dungeon.depth), pos).sprite.drop();
((DM300DeathBall) obj).pos = pos;
GameScene.add(((Mob) (obj)));
Actor.addDelayed(new Pushing(((Char) (obj)), pos, ((DM300DeathBall) (obj)).pos), -1F);
@ -431,9 +537,9 @@ public class DM920 extends Mob
HP = HP + Random.Int(1, HT - HP);
sprite.emitter().burst(ElmoParticle.FACTORY, 5);
if(Dungeon.level.heroFOV[i] && Dungeon.hero.isAlive())
GLog.n(Messages.get(this, "repair", new Object[0]), new Object[0]);
GLog.n(Messages.get(this, "repair"));
}
int ai[] = new int[8];
int[] ai = new int[8];
int j = i - 1;
ai[0] = j;
int k = i + 1;
@ -471,118 +577,24 @@ public class DM920 extends Mob
yell(Messages.get(this, "notice"));
}
public void restoreFromBundle(Bundle bundle)
{
super.restoreFromBundle(bundle);
BossHealthBar.assignBoss(this);
}
public DM300SpiderMode ()
{
spriteClass = DM300SpiderSprite.class;
HT = 600;
HP = 600;
HT = 240;
HP = 240;
EXP = 10;
defenseSkill = 23;
defenseSkill = 4;
Buff.affect(this, ChampionEnemy.Halo.class);
Buff.affect(this, ChampionEnemy.AntiMagic.class);
maxLvl = -1;
}
}
public static class DM75 extends Mob
{
public int attackSkill(Char char1)
{
return 7;
}
@Override
public void damage(int dmg, Object src) {
super.damage(dmg, src);
LockedFloor lock = Dungeon.hero.buff(LockedFloor.class);
if (lock != null && !isImmune(src.getClass())) lock.addTime(dmg*1.5f);
}
public int damageRoll()
{
return Random.NormalIntRange(5, 6);
}
public void die(Object obj)
{
super.die(obj);
obj = new ArrayList();
for(int i = 0; i < PathFinder.NEIGHBOURS8.length; i++)
((ArrayList) (obj)).add(Integer.valueOf(pos + PathFinder.NEIGHBOURS8[i]));
if(!Dungeon.level.mobs.isEmpty())
{
for(obj = ((ArrayList) (obj)).iterator(); ((Iterator) (obj)).hasNext();)
{
int j = ((Integer)((Iterator) (obj)).next()).intValue();
if(Actor.findChar(j) instanceof DM300SpiderMode)
{
Actor.findChar(j).die(this);
obj = new DM300SpiderMode();
((DM300SpiderMode) obj).pos = pos;
GameScene.add(((Mob) (obj)));
Actor.addDelayed(new Pushing(((Char) (obj)), pos, ((DM300SpiderMode) (obj)).pos), -1F);
return;
}
}
for(obj = Dungeon.level.mobs.iterator(); ((Iterator) (obj)).hasNext(); Actor.findChar(((Mob)((Iterator) (obj)).next()).pos).die(this));
GameScene.bossSlain();
Dungeon.level.drop(new SkeletonKey(Dungeon.depth), pos).sprite.drop();
Badges.validateBossSlain();
LloydsBeacon beacon = Dungeon.hero.belongings.getItem(LloydsBeacon.class);
if(obj != null)
((LloydsBeacon) (obj)).upgrade();
yell( Messages.get(this, "defeated") );
}
}
public int drRoll()
{
return Random.NormalIntRange(0, 3);
}
public void move(int i)
{
super.move(i);
if (Dungeon.level.map[i] == Terrain.INACTIVE_TRAP && HP < HT) {
HP += Random.Int( 1, HT - HP );
sprite.emitter().burst( ElmoParticle.FACTORY, 5 );
if (Dungeon.level.heroFOV[i] && Dungeon.hero.isAlive()) {
GLog.n( Messages.get(this, "repair") );
}
}
if(Dungeon.level.map[i] == 19 && HP < HT)
{
HP = HP + Random.Int(1, HT - HP);
sprite.emitter().burst(ElmoParticle.FACTORY, 1);
if(Dungeon.level.heroFOV[i] && Dungeon.hero.isAlive())
GLog.n(Messages.get(this, "repair"));
}
}
public void notice()
{
super.notice();
yell(Messages.get(this, "notice"));
}
}
public DM920()
public DMZERO()
{
spriteClass = DM300Sprite.class;
HP = HT = 280;
HP = HT = 200;
EXP = 30;
defenseSkill = 18;
@ -611,13 +623,19 @@ public class DM920 extends Mob
public int damageRoll()
{
return Random.NormalIntRange(15, 20);
return (HT/2 >= HP) ? Random.NormalIntRange(25, 35) : Random.NormalIntRange(15, 20);
}
public void die(Object obj)
{
super.die(obj);
split(pos, enemy);
Dungeon.level.drop(new IronKey(Dungeon.depth), pos).sprite.drop();
obj = new DM300AttackMode();
((DM300AttackMode) obj).pos = pos;
GameScene.add(((Mob) (obj)));
Actor.addDelayed(new Pushing(((Char) (obj)), pos, ((DM300AttackMode) (obj)).pos), -1F);
yell( Messages.get(this, "defeated") );
}
@ -636,7 +654,7 @@ public class DM920 extends Mob
if(Dungeon.level.heroFOV[i] && Dungeon.hero.isAlive())
GLog.n(Messages.get(this, "repair"));
}
int ai[] = new int[8];
int[] ai = new int[8];
int j = i - 1;
ai[0] = j;
int k = i + 1;
@ -672,7 +690,7 @@ public class DM920 extends Mob
super.notice();
BossHealthBar.assignBoss(this);
yell(Messages.get(this, "notice"));
Buff.affect(hero, RandomBuff.DiedBuff.class).set( (1000), 1 );
Buff.affect(hero, RandomBuff.DiedBuff.class).set( (500), 1 );
}
public void restoreFromBundle(Bundle bundle)
@ -681,34 +699,6 @@ public class DM920 extends Mob
BossHealthBar.assignBoss(this);
}
public void split(int i, Char char1)
{
ArrayList arraylist = new ArrayList();
for(int j = 0; j < PathFinder.NEIGHBOURS8.length; j++)
{
int k = PathFinder.NEIGHBOURS8[j] + i;
if(Actor.findChar(k) == null && (Dungeon.level.passable[k] || Dungeon.level.avoid[k]))
arraylist.add(k);
}
if(arraylist.size() > 0)
{
DM300AttackMode dm75 = new DM300AttackMode();
dm75.pos = ((Integer)Random.element(arraylist)).intValue();
GameScene.add(dm75);
Actor.addDelayed(new Pushing(dm75, i, dm75.pos), -1F);
}
Iterator iterator = Dungeon.level.mobs.iterator();
do
{
if(!iterator.hasNext())
break;
Mob mob = (Mob)iterator.next();
if(mob instanceof DM150)
mob.aggro(char1);
} while(true);
}
//死亡国度
public static class DiedBlobs extends ToxicGas{
@Override
@ -717,5 +707,29 @@ public class DM920 extends Mob
emitter.pour( Speck.factory( Speck.DIED ), 0.4f );
}
@Override
protected void evolve() {
super.evolve();
int damage = 9 + Dungeon.depth/5;
Char ch;
int cell;
for (int i = area.left; i < area.right; i++){
for (int j = area.top; j < area.bottom; j++){
cell = i + j*Dungeon.level.width();
if (cur[cell] > 0 && (ch = Actor.findChar( cell )) != null) {
if (!ch.isImmune(this.getClass())) {
ch.damage(damage, this);
}
}
}
}
}
}
}
}

View File

@ -1,34 +1,50 @@
package com.shatteredpixel.shatteredpixeldungeon.actors.mobs.bosses;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Challenges;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
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.LockedFloor;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.MagicImmune;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter;
import com.shatteredpixel.shatteredpixeldungeon.effects.FloatingText;
import com.shatteredpixel.shatteredpixeldungeon.effects.MagicMissile;
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.BlastParticle;
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.SmokeParticle;
import com.shatteredpixel.shatteredpixeldungeon.items.Item;
import com.shatteredpixel.shatteredpixeldungeon.levels.ColdChestBossLevel;
import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.DimandKingSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
import com.shatteredpixel.shatteredpixeldungeon.sprites.MissileSprite;
import com.shatteredpixel.shatteredpixeldungeon.tiles.DungeonTilemap;
import com.shatteredpixel.shatteredpixeldungeon.ui.BossHealthBar;
import com.shatteredpixel.shatteredpixeldungeon.utils.BArray;
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
import com.watabou.noosa.audio.Sample;
import com.watabou.noosa.particles.Emitter;
import com.watabou.utils.Bundle;
import com.watabou.utils.Callback;
import com.watabou.utils.PathFinder;
import com.watabou.utils.PointF;
import com.watabou.utils.Random;
import java.util.ArrayList;
import java.util.HashSet;
public class DiamondKnight extends Boss {
private int ventCooldown = 0;
private int phase = 1;
private int abilitiesUsed = 0;
private final int OneHP = 179;
private final int TwoHP = 99;
private final int ThreeHP = 49;
private static final float TIME_TO_ZAP = 5f;
private static Char throwingChar;
{
spriteClass = DimandKingSprite.class;
@ -36,53 +52,144 @@ public class DiamondKnight extends Boss {
initProperty();
initBaseStatus(14, 23, 33, 22, 420, 5, 12);
initStatus(80);
maxLvl = 30;
maxLvl = 30;
HUNTING = new Hunting();
flying = true; //doesn't literally fly, but he is fleet-of-foot enough to avoid hazards
properties.add(Property.IMMOVABLE);
properties.add(Property.BOSS);
properties.add(Property.INORGANIC);
properties.add(Property.LARGE);
}
private int ventCooldown = 0;
private int phase = 1;
private static final float TIME_TO_ZAP = 5f;
private static final String PHASE = "phase";
private boolean teleporting = false;
private int selfTeleCooldown = 0;
private int enemyTeleCooldown = 0;
private static final String TELEPORTING = "teleporting";
private static final String ABILITIES_USED = "abilities_used";
private static final String SELF_COOLDOWN = "self_cooldown";
private static final String ENEMY_COOLDOWN = "enemy_cooldown";
@Override
public void storeInBundle(Bundle bundle) {
private static final String LAST_ABILITY = "last_ability";
@Override
public void storeInBundle(Bundle bundle) {
super.storeInBundle(bundle);
bundle.put(PHASE, phase);
bundle.put(VENT_COOLDOWN, ventCooldown);
}
bundle.put( ABILITIES_USED, abilitiesUsed );
bundle.put(TELEPORTING, teleporting);
bundle.put(SELF_COOLDOWN, selfTeleCooldown);
bundle.put(ENEMY_COOLDOWN, enemyTeleCooldown);
bundle.put( LAST_ABILITY, lastAbility );
bundle.put( ABILITIES_USED, abilitiesUsed );
}
@Override
public void restoreFromBundle(Bundle bundle) {
super.restoreFromBundle(bundle);
phase = bundle.getInt(PHASE);
ventCooldown = bundle.getInt( VENT_COOLDOWN );
abilitiesUsed = bundle.getInt( ABILITIES_USED );
lastAbility = bundle.getInt( LAST_ABILITY );
abilitiesUsed = bundle.getInt( ABILITIES_USED );
BossHealthBar.assignBoss(this);
if (HP <= HT/2) BossHealthBar.bleed(true);
}
private static final float ATTACSWORD_DELAY = 5f;
private static final String VENT_COOLDOWN = "vent_cooldown";
@Override
protected boolean act() {
switch (phase){
case 1:
if(Random.Float()>0.64f){
} else {
super.act();
}
break;
case 2:
break;
case 3:
break;
case 4:
break;
}
switch (phase){
case 1:
break;
case 2:
break;
case 3:
break;
case 4:
break;
}
return super.act();
}
//*****************************************************************************************
//***** Boss abilities. These are expressed in game logic as buffs, blobs, and items *****
//*****************************************************************************************
//so that mobs can also use this
private int lastAbility = -1;
//starts at 2, so one turn and then first ability
private static final int BOMB_ABILITY = 0;
private static final int FIRE_ABILITY = 1;
private static final int SHOCKER_ABILITY = 2;
public boolean useAbility(){
boolean abilityUsed = false;
int abilityToUse = -1;
while (!abilityUsed){
if (abilitiesUsed == 0){
abilityToUse = BOMB_ABILITY;
} else if (abilitiesUsed == 1){
abilityToUse = SHOCKER_ABILITY;
} else if (Dungeon.isChallenged(Challenges.STRONGER_BOSSES)) {
abilityToUse = Random.Int(2)*2; //0 or 2, can't roll fire ability with challenge
} else {
abilityToUse = Random.Int(3);
}
//If we roll the same ability as last time, 9/10 chance to reroll
if (abilityToUse != lastAbility || Random.Int(10) == 0){
switch (abilityToUse){
case BOMB_ABILITY : default:
abilityUsed = throwBomb(this, enemy);
//if Tengu cannot use his bomb ability first, use fire instead.
if (abilitiesUsed == 0 && !abilityUsed){
abilityToUse = FIRE_ABILITY;
abilityUsed = throwBomb(this, enemy);
}
break;
case FIRE_ABILITY:
abilityUsed =throwBomb(this, enemy);
break;
case SHOCKER_ABILITY:
abilityUsed = throwBomb(this, enemy);
//if Tengu cannot use his shocker ability second, use fire instead.
if (abilitiesUsed == 1 && !abilityUsed){
abilityToUse = FIRE_ABILITY;
abilityUsed =throwBomb(this, enemy);
}
break;
}
//always use the fire ability with the bosses challenge
if (abilityUsed && abilityToUse != FIRE_ABILITY && Dungeon.isChallenged(Challenges.STRONGER_BOSSES)){
throwBomb(this, enemy);
}
}
}
lastAbility = abilityToUse;
abilitiesUsed++;
return lastAbility == FIRE_ABILITY;
}
private static final float ATTACSWORD_DELAY = 2f;
public static class DarkBolt{}
//the actual affected cells
@ -90,16 +197,13 @@ public class DiamondKnight extends Boss {
//the cells to trace fire shots to, for visual effects.
private HashSet<Integer> visualCells;
private int direction = 0;
private int left(int direction){
return direction == 0 ? 2 : direction-1;
}
protected void fx(Ballistica bolt, Callback callback, Char ch ) {
protected void fx(Ballistica bolt, Char ch ) {
//need to perform flame spread logic here so we can determine what cells to put flames in.
affectedCells = new HashSet<>();
visualCells = new HashSet<>();
int maxDist = 4 + 4*4;
int maxDist = 30;
int dist = Math.min(bolt.dist, maxDist);
for (int i = 0; i < PathFinder.CIRCLE8.length; i++){
@ -126,25 +230,17 @@ public class DiamondKnight extends Boss {
for (int cell : visualCells){
//this way we only get the cells at the tip, much better performance.
((MagicMissile)ch.sprite.parent.recycle( MagicMissile.class )).reset(
MagicMissile.FIRE,
MagicMissile.SWORDLING,
ch.sprite,
cell,
null
);
}
MagicMissile.boltFromChar( ch.sprite.parent,
MagicMissile.FIRE,
ch.sprite,
bolt.path.get(dist/2),
callback );
if(Dungeon.level.heroFOV[bolt.sourcePos] || Dungeon.level.heroFOV[bolt.collisionPos]){
Sample.INSTANCE.play( Assets.Sounds.ZAP );
}
}
private int right(int direction){
return direction == 2 ? 0 : direction+1;
}
private void spreadFlames(int cell, float strength){
if (strength >= 0 && (Dungeon.level.passable[cell] || Dungeon.level.flamable[cell])){
affectedCells.add(cell);
@ -179,7 +275,7 @@ public class DiamondKnight extends Boss {
boolean visible = fieldOfView[pos] || fieldOfView[enemy.pos];
if (visible) {
sprite.attack(enemy.pos);
spend(TIME_TO_ZAP);
spend(ATTACSWORD_DELAY);
shoot(this, enemy.pos);
}
@ -187,6 +283,37 @@ public class DiamondKnight extends Boss {
}
}
public void teleportEnemy(){
spend(3f);
int bestPos = enemy.pos;
for (int i : PathFinder.NEIGHBOURS8){
if (Dungeon.level.passable[pos + i]
&& Actor.findChar(pos+i) == null
&& Dungeon.level.trueDistance(pos+i, enemy.pos) > Dungeon.level.trueDistance(bestPos, enemy.pos)){
bestPos = pos+i;
}
}
if (enemy.buff(MagicImmune.class) != null){
bestPos = enemy.pos;
}
if (bestPos != enemy.pos){
//ScrollOfTeleportation.appear(enemy, bestPos);
if (enemy instanceof Hero){
((Hero) enemy).interrupt();
Dungeon.observe();
}
}
enemyTeleCooldown = 20;
}
public void onZapComplete(){
teleportEnemy();
next();
}
public void damage(int dmg, Object src) {
if (!Dungeon.level.mobs.contains(this)){
return;
@ -254,12 +381,173 @@ public class DiamondKnight extends Boss {
public void shoot(Char ch, int pos){
final Ballistica shot = new Ballistica( ch.pos, pos, Ballistica.PROJECTILE);
fx(shot, new Callback() {
@Override
public void call() {
onZap(shot);
fx(shot, ch);
}
public static boolean throwBomb(final Char thrower, final Char target){
int targetCell = -1;
//Targets closest cell which is adjacent to target
for (int i : PathFinder.NEIGHBOURS8){
int cell = target.pos + i;
if (targetCell == -1 ||
Dungeon.level.trueDistance(cell, thrower.pos) < Dungeon.level.trueDistance(targetCell, thrower.pos)){
targetCell = cell;
}
}, ch);
}
if (targetCell == -1){
return false;
}
final int finalTargetCell = targetCell;
throwingChar = thrower;
final BombAbility.BombItem item = new BombAbility.BombItem();
thrower.sprite.zap(finalTargetCell);
((MissileSprite) thrower.sprite.parent.recycle(MissileSprite.class)).
reset(thrower.sprite,
finalTargetCell,
item,
new Callback() {
@Override
public void call() {
//item.onThrow(finalTargetCell);
thrower.next();
}
});
return true;
}
public static class BombAbility extends Buff {
public int bombPos = -1;
private int timer = 3;
private ArrayList<Emitter> smokeEmitters = new ArrayList<>();
@Override
public boolean act() {
if (smokeEmitters.isEmpty()){
fx(true);
}
PointF p = DungeonTilemap.raisedTileCenterToWorld(bombPos);
if (timer == 3) {
FloatingText.show(p.x, p.y, bombPos, "3...", CharSprite.NEUTRAL);
} else if (timer == 2){
FloatingText.show(p.x, p.y, bombPos, "2...", CharSprite.WARNING);
} else if (timer == 1){
FloatingText.show(p.x, p.y, bombPos, "1...", CharSprite.NEGATIVE);
} else {
PathFinder.buildDistanceMap( bombPos, BArray.not( Dungeon.level.solid, null ), 2 );
Sample.INSTANCE.play(Assets.Sounds.BLAST);
detach();
return true;
}
timer--;
spend(TICK);
return true;
}
@Override
public void fx(boolean on) {
if (on && bombPos != -1){
PathFinder.buildDistanceMap( bombPos, BArray.not( Dungeon.level.solid, null ), 2 );
for (int i = 0; i < PathFinder.distance.length; i++) {
if (PathFinder.distance[i] < Integer.MAX_VALUE) {
Emitter e = CellEmitter.get(i);
e.pour( SmokeParticle.FACTORY, 0.25f );
smokeEmitters.add(e);
}
}
} else if (!on) {
for (Emitter e : smokeEmitters){
e.burst(BlastParticle.FACTORY, 2);
}
}
}
private static final String BOMB_POS = "bomb_pos";
private static final String TIMER = "timer";
@Override
public void storeInBundle(Bundle bundle) {
super.storeInBundle(bundle);
bundle.put( BOMB_POS, bombPos );
bundle.put( TIMER, timer );
}
@Override
public void restoreFromBundle(Bundle bundle) {
super.restoreFromBundle(bundle);
bombPos = bundle.getInt( BOMB_POS );
timer = bundle.getInt( TIMER );
}
public static class BombItem extends Item {
{
dropsDownHeap = true;
unique = true;
image = ItemSpriteSheet.TENGU_BOMB;
}
@Override
public boolean doPickUp( Hero hero ) {
GLog.w( Messages.get(this, "cant_pickup") );
return false;
}
@Override
protected void onThrow(int cell) {
super.onThrow(cell);
if (throwingChar != null){
Buff.append(throwingChar, BombAbility.class).bombPos = cell;
throwingChar = null;
} else {
Buff.append(curUser, BombAbility.class).bombPos = cell;
}
}
@Override
public Emitter emitter() {
Emitter emitter = new Emitter();
emitter.pos(7.5f, 3.5f);
emitter.fillTarget = false;
emitter.pour(SmokeParticle.SPEW, 0.05f);
return emitter;
}
}
}
private class Hunting extends Mob.Hunting{
@Override
public boolean act(boolean enemyInFOV, boolean justAlerted) {
enemySeen = enemyInFOV;
if (enemyInFOV && !isCharmedBy( enemy ) && canAttack( enemy )) {
return useAbility();
} else {
if (!enemyInFOV) {
chooseEnemy();
if (enemy == null) {
//if nothing else can be targeted, target hero
enemy = Dungeon.hero;
}
}
target = enemy.pos;
spend( 6f );
return true;
}
}
}
}

View File

@ -1,5 +1,6 @@
package com.shatteredpixel.shatteredpixeldungeon.actors.mobs.bosses;
import static com.shatteredpixel.shatteredpixeldungeon.DLC.BOSSRUSH;
import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.hero;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
@ -1611,7 +1612,10 @@ public class DwarfMaster extends Boss {
mob.die( cause );
}
}
if(Dungeon.isDLC(BOSSRUSH)){
GetBossLoot();
}
for (Buff buff : hero.buffs()) {
if (buff instanceof TestDwarfMasterLock) {
buff.detach();

View File

@ -1,5 +1,6 @@
package com.shatteredpixel.shatteredpixeldungeon.actors.mobs.bosses;
import static com.shatteredpixel.shatteredpixeldungeon.DLC.BOSSRUSH;
import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.hero;
import static com.shatteredpixel.shatteredpixeldungeon.levels.ShopBossLevel.CryStalPosition;
import static com.shatteredpixel.shatteredpixeldungeon.levels.ShopBossLevel.FALSEPosition;
@ -737,7 +738,10 @@ public class FireMagicDied extends Mob implements Callback {
@Override
public void die( Object cause ) {
if(Dungeon.isDLC(BOSSRUSH)){
GetBossLoot();
}
super.die( cause );
Dungeon.level.drop(new BackGoKey().quantity(1).identify(), pos).sprite.drop();

View File

@ -1,5 +1,7 @@
package com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs;
import static com.shatteredpixel.shatteredpixeldungeon.DLC.BOSSRUSH;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
@ -22,6 +24,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfRemoveCurs
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ShopkKingSprite;
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
import com.shatteredpixel.shatteredpixeldungeon.windows.WndKingShop;
import com.shatteredpixel.shatteredpixeldungeon.windows.WndQuest;
import com.watabou.noosa.Game;
@ -40,6 +43,25 @@ public class NullDiedTO extends NTNPC {
super.storeInBundle(bundle);
bundle.put(FIRST, first);
}
@Override
public String name(){
if(Dungeon.isDLC(BOSSRUSH)){
return Messages.get(this, "namex");
} else {
return Messages.get(this, "name");
}
}
@Override
public String description(){
if(Dungeon.isDLC(BOSSRUSH)){
return Messages.get(this, "descx");
} else {
return Messages.get(this, "desc");
}
}
@Override
public void restoreFromBundle(Bundle bundle) {
@ -130,12 +152,17 @@ public class NullDiedTO extends NTNPC {
WndQuest.chating(this,chat);
first=false;
}else {
Game.runOnRenderThread(new Callback() {
@Override
public void call() {
GameScene.show(new WndKingShop());
}
});
if(Dungeon.isDLC(BOSSRUSH) && Dungeon.depth == 28){
GLog.n("冒险家,快通过水晶之心离开这里吧……");
} else {
Game.runOnRenderThread(new Callback() {
@Override
public void call() {
GameScene.show(new WndKingShop());
}
});
}
}
return true;
@ -146,7 +173,29 @@ public class NullDiedTO extends NTNPC {
chat = new ArrayList<String>() {
{
add(Messages.get(NullDiedTO.class, "talk_x"));
if(Dungeon.isDLC(BOSSRUSH) && Dungeon.depth==0) {
add(Messages.get(NullDiedTO.class, "talk_a"));
add(Messages.get(NullDiedTO.class, "talk_b"));
add(Messages.get(NullDiedTO.class, "talk_c"));
add(Messages.get(NullDiedTO.class, "talk_d"));
add(Messages.get(NullDiedTO.class, "talk_e"));
add(Messages.get(NullDiedTO.class, "talk_f"));
} else if(Dungeon.isDLC(BOSSRUSH) && Dungeon.depth==17) {
add(Messages.get(NullDiedTO.class, "talk_g"));
add(Messages.get(NullDiedTO.class, "talk_h"));
} else if(Dungeon.isDLC(BOSSRUSH) && Dungeon.depth==27) {
add(Messages.get(NullDiedTO.class, "talk_i"));
add(Messages.get(NullDiedTO.class, "talk_j"));
} else if(Dungeon.isDLC(BOSSRUSH) && Dungeon.depth==28) {
add(Messages.get(NullDiedTO.class, "talk_k"));
add(Messages.get(NullDiedTO.class, "talk_l"));
add(Messages.get(NullDiedTO.class, "talk_m"));
add(Messages.get(NullDiedTO.class, "talk_n"));
add(Messages.get(NullDiedTO.class, "talk_o"));
} else {
add(Messages.get(NullDiedTO.class, "talk_x"));
}
}
};

View File

@ -1,5 +1,7 @@
package com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs;
import static com.shatteredpixel.shatteredpixeldungeon.DLC.BOSSRUSH;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
@ -41,7 +43,9 @@ public class Nyz extends NPC {
if (!seenBefore && Dungeon.level.heroFOV[pos]) {
GLog.p(Messages.get(this, "greetings", Dungeon.hero.name()));
//TODO 诡异奈亚子 早上好 中午好 晚上好
Music.INSTANCE.play(Assets.NYZSHOP, true);
if(!Dungeon.isDLC(BOSSRUSH)){
Music.INSTANCE.play(Assets.NYZSHOP, true);
}
seenBefore = true;
} else if (seenBefore && !Dungeon.level.heroFOV[pos] && Dungeon.depth == 0) {
Music.INSTANCE.play(Assets.TOWN, true);

View File

@ -26,11 +26,13 @@ import com.shatteredpixel.shatteredpixeldungeon.effects.particles.BloodParticle;
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.CorrosionParticle;
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.ElmoParticle;
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.PurpleParticle;
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.SwordParticle;
import com.shatteredpixel.shatteredpixeldungeon.tiles.DungeonTilemap;
import com.watabou.noosa.Game;
import com.watabou.noosa.Group;
@ -58,6 +60,7 @@ public class MagicMissile extends Emitter {
public static final int MAGIC_MISSILE = 0;
public static final int FROST = 1;
public static final int FIRE = 2;
public static final int HALOFIRE = 300;
public static final int CORROSION = 3;
public static final int FOLIAGE = 4;
public static final int FORCE = 5;
@ -86,6 +89,8 @@ public class MagicMissile extends Emitter {
public static final int PURPLE_CONE = 111;
public static final int SPARK_CONE = 112;
public static final int BLOOD_CONE = 113;
public static final int SWORDLING = 114;
public void reset( int type, int from, int to, Callback callback ) {
reset( type,
@ -136,6 +141,10 @@ public class MagicMissile extends Emitter {
size( 4 );
pour( FlameParticle.FACTORY, 0.01f );
break;
case HALOFIRE:
size( 4 );
pour( HalomethaneFlameParticle.FACTORY, 0.01f );
break;
case CORROSION:
size( 3 );
pour( CorrosionParticle.MISSILE, 0.01f );
@ -166,6 +175,10 @@ public class MagicMissile extends Emitter {
size( 4 );
pour( WardParticle.FACTORY, 0.01f );
break;
case SWORDLING:
size( 4 );
pour( SwordParticle.FACTORY, 0.01f );
break;
case SHAMAN_RED:
size( 2 );

View File

@ -312,7 +312,7 @@ public class Speck extends Image {
break;
case DIED:
hardlight(0xff5060);
hardlight(0x0);
angularSpeed = 30;
angle =Random.Float( 360 );
lifespan = Random.Float( 1f,3f);

View File

@ -0,0 +1,46 @@
package com.shatteredpixel.shatteredpixeldungeon.effects.particles;
import com.shatteredpixel.shatteredpixeldungeon.ui.Window;
import com.watabou.noosa.particles.Emitter;
import com.watabou.noosa.particles.PixelParticle;
public class SwordParticle extends PixelParticle.Shrinking {
public static final Emitter.Factory FACTORY = new Emitter.Factory() {
@Override
public void emit( Emitter emitter, int index, float x, float y ) {
((SwordParticle)emitter.recycle( SwordParticle.class )).reset( x, y );
}
@Override
public boolean lightMode() {
return true;
}
};
public SwordParticle() {
super();
lifespan = 0.3f;
color(Window.Pink_COLOR);
}
public void reset( float x, float y ) {
revive();
this.x = x;
this.y = y;
left = lifespan;
size = 4;
speed.set( 2 );
}
@Override
public void update() {
super.update();
float p = left / lifespan;
am = p > 0.8f ? (1 - p) * 5 : 1;
}
}

View File

@ -21,6 +21,8 @@
package com.shatteredpixel.shatteredpixeldungeon.items;
import static com.shatteredpixel.shatteredpixeldungeon.DLC.BOSSRUSH;
import com.shatteredpixel.shatteredpixeldungeon.Badges;
import com.shatteredpixel.shatteredpixeldungeon.Challenges;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
@ -47,11 +49,20 @@ public class Amulet extends Item {
@Override
public ArrayList<String> actions( Hero hero ) {
ArrayList<String> actions = super.actions( hero );
actions.add( AC_END );
return actions;
if(Statistics.amuletObtained){
ArrayList<String> actions = super.actions( hero );
actions.add( AC_END );
return actions;
} else if(Dungeon.isDLC(BOSSRUSH) && Dungeon.depth !=27 ){
return new ArrayList<>(); //yup, no dropping this one
} else {
ArrayList<String> actions = super.actions( hero );
actions.add( AC_END );
return actions;
}
}
@Override
public void execute( Hero hero, String action ) {
@ -64,7 +75,7 @@ public class Amulet extends Item {
@Override
public boolean doPickUp(Hero hero, int pos) {
if (super.doPickUp( hero, pos )) {
if (super.doPickUp( hero, pos ) && !Dungeon.isDLC(BOSSRUSH) ) {
if (!Statistics.amuletObtained) {
Statistics.amuletObtained = true;

View File

@ -21,12 +21,13 @@
package com.shatteredpixel.shatteredpixeldungeon.items;
import static com.shatteredpixel.shatteredpixeldungeon.DLC.BOSSRUSH;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Badges;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.Statistics;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.MasterThievesArmband;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
@ -86,7 +87,8 @@ public class Gold extends Item {
@Override
public Item random() {
quantity = Random.Int( 30 + Dungeon.depth * 10, 60 + Dungeon.depth * 20 );
quantity = Dungeon.isDLC(BOSSRUSH) ? Random.Int( 130 + Dungeon.depth * 3, 160 + Dungeon.depth * 5 ) :
Random.Int( 30 + Dungeon.depth * 10, 60 + Dungeon.depth * 20 );
return this;
}

View File

@ -34,17 +34,27 @@ public class Repulsion extends Armor.Glyph {
@Override
public int proc( Armor armor, Char attacker, Char defender, int damage) {
int level = Math.max( 0, armor.buffedLvl() );
// lvl 0 - 20%
// lvl 1 - 33%
// lvl 2 - 43%
int level = Math.max( 0, armor.buffedLvl() );
float procChance = (level+1f)/(level+5f);
if (Random.Float() < procChance){
float powerMulti = Math.max(1f, procChance);
if (Random.Int( level + 5 ) >= 4){
int oppositeHero = attacker.pos + (attacker.pos - defender.pos);
Ballistica trajectory = new Ballistica(attacker.pos, oppositeHero, Ballistica.MAGIC_BOLT);
WandOfBlastWave.throwChar(attacker, trajectory, 2, true);
WandOfBlastWave.throwChar(attacker,
trajectory,
Math.round(2 * powerMulti),
true,
true,
getClass());
}
return damage;
}

View File

@ -75,7 +75,9 @@ public class PotionOfHealing extends Potion {
}
public static void cure( Char ch ) {
Buff.detach( ch, Poison.class );
if(Dungeon.depth!=28){
Buff.detach( ch, Poison.class );
}
Buff.detach( ch, Cripple.class );
Buff.detach( ch, Weakness.class );
Buff.detach( ch, Vulnerable.class );

View File

@ -0,0 +1,34 @@
package com.shatteredpixel.shatteredpixeldungeon.items.quest;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.items.Item;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
import java.util.ArrayList;
public class BossRushBloodGold extends Item {
{
image = ItemSpriteSheet.SKELETONGOLD;
stackable = true;
unique = true;
}
@Override
public ArrayList<String> actions(Hero hero) {
return new ArrayList<>(); //yup, no dropping this one
}
@Override
public boolean isUpgradable() {
return false;
}
@Override
public boolean isIdentified() {
return true;
}
}

View File

@ -35,6 +35,7 @@ import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain;
import com.shatteredpixel.shatteredpixeldungeon.levels.features.Door;
import com.shatteredpixel.shatteredpixeldungeon.levels.traps.TenguDartTrap;
import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
import com.shatteredpixel.shatteredpixeldungeon.tiles.DungeonTilemap;
import com.watabou.noosa.Game;
@ -85,7 +86,7 @@ public class WandOfBlastWave extends DamageWand {
if (ch.pos == bolt.collisionPos + i) {
Ballistica trajectory = new Ballistica(ch.pos, ch.pos + i, Ballistica.MAGIC_BOLT);
int strength = 1 + Math.round(buffedLvl() / 2f);
throwChar(ch, trajectory, strength, false);
throwChar(ch, trajectory, strength, false, true, getClass());
}
}
@ -100,23 +101,14 @@ public class WandOfBlastWave extends DamageWand {
if (bolt.path.size() > bolt.dist+1 && ch.pos == bolt.collisionPos) {
Ballistica trajectory = new Ballistica(ch.pos, bolt.path.get(bolt.dist + 1), Ballistica.MAGIC_BOLT);
int strength = buffedLvl() + 3;
throwChar(ch, trajectory, strength, false);
throwChar(ch, trajectory, strength, false, true, getClass());
}
}
}
public static void throwChar(final Char ch, final Ballistica trajectory, int power){
throwChar(ch, trajectory, power, true);
}
public static void throwChar(final Char ch, final Ballistica trajectory, int power,
boolean closeDoors) {
throwChar(ch, trajectory, power, closeDoors, true);
}
public static void throwChar(final Char ch, final Ballistica trajectory, int power,
boolean closeDoors, boolean collideDmg){
boolean closeDoors, boolean collideDmg, Class cause){
if (ch.properties().contains(Char.Property.BOSS)) {
power /= 2;
}
@ -125,7 +117,7 @@ public class WandOfBlastWave extends DamageWand {
boolean collided = dist == trajectory.dist;
if (dist == 0
if (dist <= 0
|| ch.rooted
|| ch.properties().contains(Char.Property.IMMOVABLE)) return;
@ -157,8 +149,8 @@ public class WandOfBlastWave extends DamageWand {
Actor.addDelayed(new Pushing(ch, ch.pos, newPos, new Callback() {
public void call() {
if (initialpos != ch.pos) {
//something caused movement before pushing resolved, cancel to be safe.
if (initialpos != ch.pos || Actor.findChar(newPos) != null) {
//something caused movement or added chars before pushing resolved, cancel to be safe.
ch.sprite.place(ch.pos);
return;
}
@ -166,15 +158,19 @@ public class WandOfBlastWave extends DamageWand {
ch.pos = newPos;
if (finalCollided && ch.isAlive()) {
ch.damage(Random.NormalIntRange(finalDist, 2*finalDist), this);
Paralysis.prolong(ch, Paralysis.class, 1 + finalDist/2f);
if (ch.isAlive()) {
Paralysis.prolong(ch, Paralysis.class, 1 + finalDist/2f);
} else if (ch == Dungeon.hero){
Dungeon.fail(cause);
}
}
if (closeDoors && Dungeon.level.map[oldPos] == Terrain.OPEN_DOOR){
Door.leave(oldPos);
}
Dungeon.level.occupyCell(ch);
if (ch == Dungeon.hero){
//FIXME currently no logic here if the throw effect kills the hero
Dungeon.observe();
GameScene.updateFog();
}
}
}), -1);

View File

@ -102,11 +102,12 @@ public class WandOfScale extends DamageWand {
int maxDist = 2 + 2*chargesPerCast();
int dist = Math.min(bolt.dist, maxDist);
cone = new ConeAOE( bolt.sourcePos, bolt.path.get(dist),
cone = new ConeAOE( bolt,
maxDist,
30 + 20*chargesPerCast(),
30 + 40*chargesPerCast(),
collisionProperties | Ballistica.STOP_TARGET);
//cast to cells at the tip, rather than all cells, better performance.
for (Ballistica ray : cone.rays){
((MagicMissile)curUser.sprite.parent.recycle( MagicMissile.class )).reset(

View File

@ -168,10 +168,11 @@ public class WandOfHightHunderStorm extends DamageWand {
int maxDist = (1 + 2*chargesPerCast())*level/5+2;
int dist = Math.min(bolt.dist, maxDist);
cone = new ConeAOE( bolt.sourcePos, bolt.path.get(dist),
cone = new ConeAOE( bolt,
maxDist,
5 + 10*chargesPerCast(),
collisionProperties | Ballistica.MAGIC_BOLT);
30 + 40*chargesPerCast(),
collisionProperties | Ballistica.STOP_TARGET);
int cell = bolt.collisionPos;

View File

@ -43,14 +43,22 @@ public class Elastic extends Weapon.Enchantment {
// lvl 2 - 43%
float procChance = (level+1f)/(level+5f) * procChanceMultiplier(attacker);
if (Random.Float() < procChance) {
float powerMulti = Math.max(1f, procChance);
//trace a ballistica to our target (which will also extend past them
Ballistica trajectory = new Ballistica(attacker.pos, defender.pos, Ballistica.STOP_TARGET);
//trim it to just be the part that goes past them
trajectory = new Ballistica(trajectory.collisionPos, trajectory.path.get(trajectory.path.size()-1), Ballistica.PROJECTILE);
//knock them back along that ballistica
WandOfBlastWave.throwChar(defender, trajectory, 2, !(weapon instanceof MissileWeapon || weapon instanceof SpiritBow));
WandOfBlastWave.throwChar(defender,
trajectory,
Math.round(2 * powerMulti),
!(weapon instanceof MissileWeapon || weapon instanceof SpiritBow),
true,
getClass());
}
return damage;
}

View File

@ -0,0 +1,110 @@
package com.shatteredpixel.shatteredpixeldungeon.levels;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.NullDiedTO;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.Nyz;
public class AncityLevel extends Level {
private static final int[] pre_map = {
64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,
64,4,0,0,0,0,0,0,4,0,0,0,0,0,0,4,64,
64,0,4,0,0,0,0,0,4,0,0,0,0,0,4,0,64,
64,0,0,4,0,4,4,4,4,4,4,4,0,4,0,0,64,
64,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,64,
64,0,0,4,0,4,0,0,4,0,0,4,0,4,0,0,64,
64,0,0,4,0,0,4,0,4,0,4,0,0,4,0,0,64,
64,0,0,4,0,0,0,4,4,4,0,0,0,4,0,0,64,
64,4,4,4,4,4,4,4,17,4,4,4,4,4,4,4,64,
64,0,0,4,0,0,0,4,4,4,0,0,0,4,0,0,64,
64,0,0,4,0,0,4,0,4,0,4,0,0,4,0,0,64,
64,0,0,4,0,4,0,0,4,0,0,4,0,4,0,0,64,
64,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,64,
64,0,0,4,0,4,4,4,4,4,4,4,0,4,0,0,64,
64,0,4,0,0,0,0,0,4,0,0,0,0,0,4,0,64,
64,4,0,0,0,0,0,0,4,0,0,0,0,0,0,4,64,
64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,
};
{
color1 = 5459774;
color2 = 12179041;
}
public AncityLevel() {
this.viewDistance = 34;
}
private int mapToTerrain(int code) {
switch (code){
case 1:
default:
return Terrain.EMPTY;
case 64:
return Terrain.WALL;
case 4: case 11:
return Terrain.EMPTY_SP;
case 2:
return Terrain.EMPTY_DECO;
case 21:
return Terrain.PEDESTAL;
case 0:
return Terrain.WATER;
case 66:
return Terrain.WALL_DECO;
case 85:
return Terrain.LOCKED_EXIT;
case 17:
return Dungeon.depth == 27 ? Terrain.CHASM : Terrain.EXIT;
case 98:
return Terrain.STATUE;
case 99:
return Terrain.STATUE_SP;
case 20:
return Terrain.EMPTY_WELL;
}
}
protected boolean build() {
setSize(17, 17);
this.exit = (this.width * 8 + 8);
this.entrance = (this.width * 14) + 8;
for (int var1 = 0; var1 < this.map.length; var1++) {
this.map[var1] = mapToTerrain(pre_map[var1]);
}
return true;
}
public Mob createMob() {
return null;
}
protected void createMobs() {
Nyz n = new Nyz();
n.pos = (this.width * 8 + 3);
mobs.add(n);
NullDiedTO npc1 = new NullDiedTO();
npc1.pos = (this.width * 8 + 13);
mobs.add(npc1);
}
@Override
protected void createItems() {
// TODO Auto-generated method stub
}
public int randomRespawnCell() {
return this.entrance - width();
}
public String tilesTex() {
return Assets.Environment.TILES_COLD;
}
public String waterTex() {
return Assets.Environment.WATER_PRISON;
}
}

View File

@ -31,7 +31,6 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Electricity;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ChampionHero;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.NewDM720;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.OldDM300;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.PylonCS;
import com.shatteredpixel.shatteredpixeldungeon.effects.BlobEmitter;
import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter;
@ -802,7 +801,7 @@ public class CaveTwoBossLevel extends Level {
if (c instanceof PylonCS && c.alignment != Char.Alignment.NEUTRAL){
energySourceSprite = c.sprite;
break;
} else if (c instanceof OldDM300){
} else if (c instanceof NewDM720){
energySourceSprite = c.sprite;
}
}

View File

@ -1,5 +1,7 @@
package com.shatteredpixel.shatteredpixeldungeon.levels;
import static com.shatteredpixel.shatteredpixeldungeon.levels.ColdChestBossLevel.State.MAZECOMPLE;
import static com.shatteredpixel.shatteredpixeldungeon.levels.ColdChestBossLevel.State.MAZE_START;
import static com.shatteredpixel.shatteredpixeldungeon.levels.ColdChestBossLevel.State.START;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
@ -37,6 +39,7 @@ public class ColdChestBossLevel extends Level {
public enum State {
START,
MAZE_START,
MAZECOMPLE,
VSBOSS_START,
FIND_START,
WIN
@ -169,7 +172,14 @@ public class ColdChestBossLevel extends Level {
}
break;
case MAZE_START:
changeMap(MazeRoom);
for (Mob mob : Dungeon.level.mobs.toArray(new Mob[0])) {
if (pro != MAZECOMPLE && mob instanceof DiamondKnight && mob.HP > 350) {
changeMap(MazeRoom);
pro = MAZECOMPLE;
}
}
break;
case MAZECOMPLE:
break;
}
}
@ -178,6 +188,10 @@ public class ColdChestBossLevel extends Level {
for (Mob mob : Dungeon.level.mobs.toArray(new Mob[0])){
if(mob instanceof DiamondKnight && mob.HP >400){
GLog.n("ColdChestBoss");
} else if (pro != MAZE_START && mob instanceof DiamondKnight && mob.HP >350) {
GLog.n("让这场游戏变得更加有趣吧");
GameScene.flash(0x808080);
pro = MAZE_START;
}
}

View File

@ -26,7 +26,8 @@ import com.shatteredpixel.shatteredpixeldungeon.Bones;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.bosses.DM920;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.TestDwarfMasterLock;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.bosses.DMZERO;
import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter;
import com.shatteredpixel.shatteredpixeldungeon.effects.Speck;
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.FlameParticle;
@ -36,8 +37,8 @@ import com.shatteredpixel.shatteredpixeldungeon.items.keys.SkeletonKey;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
import com.watabou.noosa.Group;
import com.watabou.noosa.audio.Music;
import com.watabou.utils.Bundle;
import com.watabou.utils.PathFinder;
import com.watabou.utils.Random;
public class DM920BossLevel extends Level {
@ -171,7 +172,7 @@ public class DM920BossLevel extends Level {
@Override
protected void createMobs() {
DM920 Boss= new DM920();
DMZERO Boss= new DMZERO();
Boss.pos = (this.width * 21 + 21);
mobs.add(Boss);
}
@ -197,11 +198,23 @@ public class DM920BossLevel extends Level {
super.occupyCell(ch);
if (map[entrance] == Terrain.ENTRANCE && map[exit] != Terrain.EXIT
&& ch == Dungeon.hero && Dungeon.level.distance(ch.pos, entrance) >= 0) {
&& ch == Dungeon.hero && Dungeon.level.distance(ch.pos, entrance) >= 0 &&Dungeon.hero.buff(TestDwarfMasterLock.class) != null) {
seal();
}
}
@Override
public int randomRespawnCell( Char ch ) {
int pos = (this.width * 35) + 21;
int cell;
do {
cell = pos + PathFinder.NEIGHBOURS8[Random.Int(8)];
} while (!passable[cell]
|| (Char.hasProp(ch, Char.Property.LARGE) && !openSpace[cell])
|| Actor.findChar(cell) != null);
return cell;
}
@Override
public void seal() {
super.seal();
@ -209,7 +222,6 @@ public class DM920BossLevel extends Level {
set( entrance, Terrain.WALL );
GameScene.updateMap( entrance );
CellEmitter.get( entrance ).start( FlameParticle.FACTORY, 0.1f, 10 );
Music.INSTANCE.play( Assets.BGM_0, true );
Dungeon.observe();
}

View File

@ -21,10 +21,15 @@
package com.shatteredpixel.shatteredpixeldungeon.levels;
import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.depth;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
import com.shatteredpixel.shatteredpixeldungeon.items.Generator;
import com.shatteredpixel.shatteredpixeldungeon.items.Gold;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfExperience;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfHealing;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfStrength;
import com.shatteredpixel.shatteredpixeldungeon.levels.painters.CavesPainter;
import com.shatteredpixel.shatteredpixeldungeon.levels.painters.Painter;
@ -47,29 +52,48 @@ public class ItemLevel extends RegularLevel {
protected int standardRooms(boolean forceMax) {
if (forceMax) return 1;
//5 to 7, average 5.57
return 1+Random.chances(new float[]{1,1,1});
return 1+ Dungeon.depth/5+ Random.chances(new float[]{1,1,1});
}
@Override
protected int specialRooms(boolean forceMax) {
if (forceMax) return 1;
//1 to 3, average 2.2
return 1+Random.chances(new float[]{1,1,1});
return 1+ Dungeon.depth/5+ Random.chances(new float[]{1,1,1});
}
@Override
protected void createItems() {
if (Dungeon.depth == 1) {
addItemToSpawn(new Gold(100));
super.createItems();
}
if (Dungeon.depth == 3) {
addItemToSpawn(new PotionOfStrength());
addItemToSpawn(new PotionOfStrength());
addItemToSpawn(new PotionOfStrength());
super.createItems();
}
switch (depth){
//T1 补给层
case 1: case 3: case 6: case 7:
addItemToSpawn(new Gold().random());
addItemToSpawn(new PotionOfStrength());
addItemToSpawn(new PotionOfHealing());
addItemToSpawn(new PotionOfHealing());
addItemToSpawn(new PotionOfExperience());
addItemToSpawn(Generator.random(Generator.Category.FOOD));
addItemToSpawn(Generator.random(Generator.Category.FOOD));
break;
//T2 补给层
case 9: case 11: case 13:
addItemToSpawn(new PotionOfStrength());
addItemToSpawn(new PotionOfExperience());
addItemToSpawn(new PotionOfHealing());
addItemToSpawn(Generator.random(Generator.Category.FOOD));
addItemToSpawn(Generator.randomWeapon());
addItemToSpawn(Generator.randomArmor());
break;
//T3 补给层
case 18: case 20: case 23:case 25:
addItemToSpawn(new PotionOfStrength());
addItemToSpawn(new PotionOfHealing());
addItemToSpawn(Generator.random(Generator.Category.FOOD));
addItemToSpawn(Generator.randomWeapon());
addItemToSpawn(Generator.randomArmor());
break;
}
super.createItems();
}
@Override

View File

@ -21,6 +21,8 @@
package com.shatteredpixel.shatteredpixeldungeon.levels;
import static com.shatteredpixel.shatteredpixeldungeon.DLC.BOSSRUSH;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Bones;
import com.shatteredpixel.shatteredpixeldungeon.Challenges;
@ -558,7 +560,12 @@ public class PrisonBossLevel extends Level {
drop( item, randomRespawnCell( null ) ).setHauntedIfCursed().type = Heap.Type.REMAINS;
}
drop(new IronKey(10), randomPrisonCellPos());
if(Dungeon.isDLC(BOSSRUSH)){
drop(new IronKey(8), randomPrisonCellPos());
} else {
drop(new IronKey(10), randomPrisonCellPos());
}
}

View File

@ -84,13 +84,21 @@ public class ShopBossLevel extends Level {
@Override
public void unseal() {
super.unseal();
FireMagicDiedNPC boss = new FireMagicDiedNPC();
boss.pos = WIDTH*17 + 17;
GameScene.add(boss);
NullDiedTO bossx = new NullDiedTO();
bossx.pos = WIDTH*15 + 17;
GameScene.add(bossx);
if(Dungeon.depth == 25){
set( this.entrance = WIDTH*17 + 17, Terrain.EXIT );
GameScene.updateMap( this.entrance = WIDTH*17 + 17 );
} else {
FireMagicDiedNPC boss = new FireMagicDiedNPC();
boss.pos = WIDTH*17 + 17;
GameScene.add(boss);
NullDiedTO bossx = new NullDiedTO();
bossx.pos = WIDTH*15 + 17;
GameScene.add(bossx);
}
}
@Override

View File

@ -73,9 +73,8 @@ public class ZeroLevel extends Level {
case 124:
case 140:
return 27;
case 4:
return 14;
case 69:
case 161:
return 12;
case 80:
return 5;
@ -87,8 +86,6 @@ public class ZeroLevel extends Level {
return 20;
case 123:
return 29;
case 161:
return 12;
default:
return 1;
}

View File

@ -46,6 +46,7 @@ public class GeyserTrap extends Trap {
}
public int centerKnockBackDirection = -1;
public Class source = getClass();
@Override
public void activate() {
@ -76,7 +77,7 @@ public class GeyserTrap extends Trap {
//trim it to just be the part that goes past them
trajectory = new Ballistica(trajectory.collisionPos, trajectory.path.get(trajectory.path.size()-1), Ballistica.PROJECTILE);
//knock them back along that ballistica
WandOfBlastWave.throwChar(ch, trajectory, 2, true);
WandOfBlastWave.throwChar(ch, trajectory, 2, true, true, source);
}
}
@ -105,7 +106,7 @@ public class GeyserTrap extends Trap {
//trace a ballistica in the direction of our target
Ballistica trajectory = new Ballistica(pos, targetpos, Ballistica.MAGIC_BOLT);
//knock them back along that ballistica
WandOfBlastWave.throwChar(ch, trajectory, 2, true);
WandOfBlastWave.throwChar(ch, trajectory, 2, true, true, source);
}
}
}

View File

@ -35,6 +35,7 @@ public class ConeAOE {
public Ballistica coreRay;
public ArrayList<Ballistica> outerRays = new ArrayList<>();
public ArrayList<Ballistica> rays = new ArrayList<>();
public HashSet<Integer> cells = new HashSet<>();
@ -42,8 +43,6 @@ public class ConeAOE {
this( core, Float.POSITIVE_INFINITY, degrees, core.collisionProperties );
}
public ArrayList<Ballistica> outerRays = new ArrayList<>();
public ConeAOE( Ballistica core, float maxDist, float degrees, int ballisticaParams ){
coreRay = core;
@ -74,6 +73,7 @@ public class ConeAOE {
float initalAngle = PointF.angle(fromP, toP)/PointF.G2R;
//want to preserve order so that our collection of rays is going clockwise
LinkedHashSet<Integer> targetCells = new LinkedHashSet<>();
LinkedHashSet<Integer> outerCells = new LinkedHashSet<>();
//cast a ray every 0.5 degrees in a clockwise arc, to find cells along the cone's outer arc
for (float a = initalAngle+degrees/2f; a >= initalAngle-degrees/2f; a-=0.5f){
@ -85,6 +85,7 @@ public class ConeAOE {
(int)GameMath.gate(0, (int)Math.floor(scan.x), Dungeon.level.width()-1),
(int)GameMath.gate(0, (int)Math.floor(scan.y), Dungeon.level.height()-1));
targetCells.add(Dungeon.level.pointToCell(scanInt));
outerCells.add(Dungeon.level.pointToCell(scanInt));
//if the cone is large enough, also cast rays to cells just inside of the outer arc
// this helps fill in any holes when casting rays
if (circleRadius >= 4) {
@ -100,79 +101,16 @@ public class ConeAOE {
}
//cast a ray to each found cell, these make up the cone
//we don't add the core ray as its collision properties may differ from the cone
for( int c : targetCells ){
Ballistica ray = new Ballistica(core.sourcePos, c, ballisticaParams);
cells.addAll(ray.subPath(1, ray.dist));
rays.add(ray);
}
//lastly add any cells in the core
for ( int c : core.subPath(1, core.dist)){
if (Dungeon.level.trueDistance(core.sourcePos, c) <= maxDist){
cells.add(c);
if (outerCells.contains(c)){
outerRays.add(ray);
}
}
}
public ConeAOE( int from, int to, float maxDist, float degrees, int ballisticaParams ){
//we want to use true coordinates for our trig functions, not game cells
// so get the center of from and to as points
PointF fromP = new PointF(Dungeon.level.cellToPoint(from));
fromP.x += 0.5f;
fromP.y += 0.5f;
PointF toP = new PointF(Dungeon.level.cellToPoint(to));
toP.x += 0.5f;
toP.y += 0.5f;
//clamp distance of cone to maxDist (in true distance, not game distance)
if (PointF.distance(fromP, toP) > maxDist){
toP = PointF.inter(fromP, toP, maxDist/PointF.distance(fromP, toP) );
}
//now we can get the circle's radius. We bump it by 0.5 as we want the cone to reach
// The edge of the target cell, not the center.
float circleRadius = PointF.distance(fromP, toP);
circleRadius += 0.5f;
//Now we find every unique cell along the outer arc of our cone.
PointF scan = new PointF();
Point scanInt = new Point();
float initalAngle = PointF.angle(fromP, toP)/PointF.G2R;
//want to preserve order so that our collection of rays is going clockwise
LinkedHashSet<Integer> targetCells = new LinkedHashSet<>();
//cast a ray every 0.5 degrees in a clockwise arc, to find cells along the cone's outer arc
for (float a = initalAngle+degrees/2f; a >= initalAngle-degrees/2f; a-=0.5f){
scan.polar(a * PointF.G2R, circleRadius);
scan.offset(fromP);
scan.x += (fromP.x > scan.x ? +0.5f : -0.5f);
scan.y += (fromP.y > scan.y ? +0.5f : -0.5f);
scanInt.set(
(int)GameMath.gate(0, (int)Math.floor(scan.x), Dungeon.level.width()-1),
(int)GameMath.gate(0, (int)Math.floor(scan.y), Dungeon.level.height()-1));
targetCells.add(Dungeon.level.pointToCell(scanInt));
//if the cone is large enough, also cast rays to cells just inside of the outer arc
// this helps fill in any holes when casting rays
if (circleRadius >= 7) {
scan.polar(a * PointF.G2R, circleRadius - 1);
scan.offset(fromP);
scan.x += (fromP.x > scan.x ? +0.5f : -0.5f);
scan.y += (fromP.y > scan.y ? +0.5f : -0.5f);
scanInt.set(
(int)GameMath.gate(0, (int)Math.floor(scan.x), Dungeon.level.width()-1),
(int)GameMath.gate(0, (int)Math.floor(scan.y), Dungeon.level.height()-1));
targetCells.add(Dungeon.level.pointToCell(scanInt));
}
}
//cast a ray to each found cell, these make up the cone
for( int c : targetCells ){
Ballistica ray = new Ballistica(from, c, ballisticaParams);
cells.addAll(ray.subPath(1, ray.dist));
rays.add(ray);
}
}
}

View File

@ -22,6 +22,7 @@
package com.shatteredpixel.shatteredpixeldungeon.scenes;
import static com.shatteredpixel.shatteredpixeldungeon.Challenges.SBSG;
import static com.shatteredpixel.shatteredpixeldungeon.DLC.BOSSRUSH;
import static com.shatteredpixel.shatteredpixeldungeon.Statistics.lanterfireactive;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
@ -439,6 +440,58 @@ public class GameScene extends PixelScene {
break;
case FALL:
case DESCEND:
if(Dungeon.isDLC(BOSSRUSH)){
switch (Dungeon.depth) {
case 0:
WndStory.showChapter(WndStory.ID_GAME);
break;
case 1:
WndStory.showChapter(WndStory.ID_NOMOBS);
break;
case 2:
WndStory.showChapter(WndStory.ID_CALA);
break;
case 4:
WndStory.showChapter(WndStory.ID_SEWS);
break;
case 5:
WndStory.showChapter(WndStory.ID_SKBS);
break;
case 8:
WndStory.showChapter(WndStory.ID_TGKS);
break;
case 10:
WndStory.showChapter(WndStory.ID_DKBS);
break;
case 12:
WndStory.showChapter(WndStory.ID_DMBS);
break;
case 14:
WndStory.showChapter(WndStory.ID_DKVS);
break;
case 16:
WndStory.showChapter(WndStory.ID_ICES);
break;
case 19:
WndStory.showChapter(WndStory.ID_DKKX);
break;
case 21:
WndStory.showChapter(WndStory.ID_LXKS);
break;
case 25:
WndStory.showChapter(WndStory.ID_FBXA);
break;
case 26:
WndStory.showChapter(WndStory.ID_ZTBS);
break;
case 27:
WndStory.showChapter(WndStory.ID_DMZR);
break;
case 28:
WndStory.showChapter(WndStory.ID_ENDS);
break;
}
} else {
switch (Dungeon.depth) {
case 0:
WndStory.showChapter( WndStory.ID_FOREST );
@ -458,20 +511,15 @@ public class GameScene extends PixelScene {
case 16:
WndStory.showChapter( WndStory.ID_CITY );
break;
//// case 20:
//// if((Statistics.boss_enhance & 0x8) != 0) WndStory.showChapter( WndStory.ID_DWADA );
//// else WndStory.showChapter( WndStory.ID_CITYSBOSS );
// break;
case 21:
WndStory.showChapter( WndStory.ID_HALLS );
break;
// case 25:
// WndStory.showChapter( WndStory.ID_HALLSBOOS );
// break;
case 26:
WndStory.showChapter( WndStory.ID_CHAPTONEEND );
break;
}
}
if (Dungeon.hero.isAlive() && Dungeon.depth > 0 ) {
Badges.validateNoKilling();
}

View File

@ -46,6 +46,7 @@ import com.shatteredpixel.shatteredpixeldungeon.ui.RedButton;
import com.shatteredpixel.shatteredpixeldungeon.ui.Window;
import com.shatteredpixel.shatteredpixeldungeon.utils.DungeonSeed;
import com.shatteredpixel.shatteredpixeldungeon.windows.WndChallenges;
import com.shatteredpixel.shatteredpixeldungeon.windows.WndDLC;
import com.shatteredpixel.shatteredpixeldungeon.windows.WndHeroInfo;
import com.shatteredpixel.shatteredpixeldungeon.windows.WndKeyBindings;
import com.shatteredpixel.shatteredpixeldungeon.windows.WndMessage;
@ -472,22 +473,8 @@ public class HeroSelectScene extends PixelScene {
IconButton DungeonHappyMode = new IconButton(new ItemSprite(ItemSpriteSheet.LANTERNB)) {
@Override
protected void onClick() {
if(1==2){
Game.runOnRenderThread(() -> ShatteredPixelDungeon.scene().add(new WndTextInput(Messages.get(WndStartGame.class,"custom_name"),
Messages.get(WndStartGame.class, "custom_name_desc")+SPDSettings.heroName(),
SPDSettings.heroName(), 20,
false, Messages.get(WndStartGame.class,"custom_name_set"),
Messages.get(WndStartGame.class,"custom_name_clear")){
@Override
public void onSelect(boolean name, String str) {
if (name) {
SPDSettings.heroName(str);
} else {
SPDSettings.heroName("");
}
icon(Icons.get(SPDSettings.heroName().equals("") ? RENAME_OFF : Icons.RENAME_ON));
}
}));
if(1==1){
ShatteredPixelDungeon.scene().addToFront(new WndDLC(SPDSettings.dlc(), true));
} else {
ShatteredPixelDungeon.scene().addToFront(new WndMessage("完成_一局游戏_后解锁娱乐模式。--暂未实装"));
}

View File

@ -182,7 +182,7 @@ public class InterlevelScene extends PixelScene {
fadeTime += 0.9f; //adds 1 second total
//speed up transition when debugging
} else if (DeviceCompat.isDebug()){
fadeTime = 0.1f;
fadeTime = 0f;
}
SkinnedBlock bg = new SkinnedBlock(Camera.main.width, Camera.main.height, loadingAsset ){

View File

@ -7,26 +7,16 @@ public class DM275Sprite extends MobSprite {
public DM275Sprite() {
super();
texture( Assets.Sprites.DM275 );
TextureFilm frames = new TextureFilm( texture, 22, 20 );
idle = new Animation( 10, true );
idle.frames( frames, 0,1, 2 );
run = new Animation( 12, true );
run.frames( frames, 3, 4, 5, 6 );
attack = new Animation( 12, false );
attack.frames( frames, 6,7 );
zap = new Animation( 8, false );
zap.frames( frames, 6,7 );
die = new Animation( 12, false );
die.frames( frames, 8,9 );
play( idle );
TextureFilm texturefilm = new TextureFilm(texture, 22, 20);
idle = new Animation(10, true);
idle.frames(texturefilm,0,1);
run = new Animation(10, true);
run.frames(texturefilm, 2,3);
attack = new Animation(15, false);
attack.frames(texturefilm,4,5,6);
die = new Animation(20, false);
die.frames(texturefilm, 0,7,0,7,0,7,0,7,0,7,0,7,8);
play(idle);
}
}

View File

@ -6,7 +6,7 @@ package com.shatteredpixel.shatteredpixeldungeon.sprites;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.bosses.DM920;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.bosses.DMZERO;
import com.shatteredpixel.shatteredpixeldungeon.effects.MagicMissile;
import com.shatteredpixel.shatteredpixeldungeon.items.Item;
import com.watabou.noosa.TextureFilm;
@ -88,7 +88,7 @@ public class DM300AttackSprite extends MobSprite
new Callback() {
@Override
public void call() {
((DM920.DM300AttackMode)ch).onZapComplete();
((DMZERO.DM300AttackMode)ch).onZapComplete();
}
} );
Sample.INSTANCE.play( Assets.Sounds.ZAP );

View File

@ -5,10 +5,12 @@
package com.shatteredpixel.shatteredpixeldungeon.sprites;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Spinner;
import com.shatteredpixel.shatteredpixeldungeon.effects.MagicMissile;
import com.shatteredpixel.shatteredpixeldungeon.effects.Speck;
import com.shatteredpixel.shatteredpixeldungeon.items.bombs.Bomb;
import com.watabou.noosa.TextureFilm;
import com.watabou.noosa.audio.Sample;
import com.watabou.utils.Callback;
@ -21,22 +23,13 @@ public class DM300SpiderSprite extends MobSprite
texture("mobs/dm300spidermode.png");
TextureFilm texturefilm = new TextureFilm(texture, 22, 20);
idle = new Animation(10, true);
idle.frames(texturefilm, new Object[] {
Integer.valueOf(0), Integer.valueOf(1)
});
idle.frames(texturefilm,0,1);
run = new Animation(10, true);
run.frames(texturefilm, new Object[] {
Integer.valueOf(2), Integer.valueOf(3)
});
run.frames(texturefilm, 2,3);
attack = new Animation(15, false);
attack.frames(texturefilm, new Object[] {
Integer.valueOf(4), Integer.valueOf(5), Integer.valueOf(6)
});
die = new com.watabou.noosa.MovieClip.Animation(20, false);
die.frames(texturefilm, new Object[] {
Integer.valueOf(0), Integer.valueOf(7), Integer.valueOf(0), Integer.valueOf(7), Integer.valueOf(0), Integer.valueOf(7), Integer.valueOf(0), Integer.valueOf(7), Integer.valueOf(0), Integer.valueOf(7),
Integer.valueOf(0), Integer.valueOf(7), Integer.valueOf(8)
});
attack.frames(texturefilm,4,5,6);
die = new Animation(20, false);
die.frames(texturefilm, 0,7,0,7,0,7,0,7,0,7,0,7,8);
play(idle);
}
@ -84,4 +77,20 @@ public class DM300SpiderSprite extends MobSprite
} );
Sample.INSTANCE.play( Assets.Sounds.MISS );
}
public void attack(int var1) {
if (!Dungeon.level.adjacent(var1, this.ch.pos)) {
((MissileSprite)this.parent.recycle(MissileSprite.class)).reset(this.ch.pos, var1, new Bomb(),
new Callback() {
public void call() {
DM300SpiderSprite.this.ch.onAttackComplete();
}
});
this.play(this.attack);
this.turnTo(this.ch.pos, var1);
} else {
super.attack(var1);
}
}
}

View File

@ -1,10 +1,17 @@
package com.shatteredpixel.shatteredpixeldungeon.sprites;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.bosses.DiamondKnight;
import com.shatteredpixel.shatteredpixeldungeon.effects.MagicMissile;
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.ElmoParticle;
import com.watabou.noosa.TextureFilm;
import com.watabou.noosa.audio.Sample;
import com.watabou.noosa.particles.Emitter;
import com.watabou.utils.Callback;
public class DimandKingSprite extends MobSprite {
private Emitter teleParticles;
public DimandKingSprite() {
super();
@ -26,5 +33,80 @@ public class DimandKingSprite extends MobSprite {
play( idle );
}
@Override
public void link(Char ch) {
super.link(ch);
teleParticles = emitter();
teleParticles.autoKill = false;
teleParticles.pour(ElmoParticle.FACTORY, 0.05f);
teleParticles.on = false;
}
@Override
public void update() {
super.update();
if (teleParticles != null){
teleParticles.pos( this );
teleParticles.visible = visible;
}
}
@Override
public void kill() {
super.kill();
if (teleParticles != null) {
teleParticles.on = false;
}
}
public void teleParticles(boolean value){
if (teleParticles != null) teleParticles.on = value;
}
@Override
public synchronized void play(Animation anim, boolean force) {
if (teleParticles != null) teleParticles.on = false;
super.play(anim, force);
}
@Override
public int blood() {
return 0xFF80706c;
}
public void zap( int cell ) {
turnTo( ch.pos , cell );
play( zap );
MagicMissile.boltFromChar( parent,
MagicMissile.ELMO,
this,
cell,
new Callback() {
@Override
public void call() {
((DiamondKnight)ch).onZapComplete();
}
} );
Sample.INSTANCE.play( Assets.Sounds.ZAP );
}
private boolean died = false;
@Override
public void onComplete( Animation anim ) {
if (anim == die && !died) {
died = true;
emitter().burst( ElmoParticle.FACTORY, 4 );
}
if (anim == zap) {
idle();
}
super.onComplete( anim );
}
}

View File

@ -814,6 +814,8 @@ public class ItemSpriteSheet {
public static final int CHALLANEESICON_12= CHALLANEESICONINDEX+11;
public static final int CHALLANEESICON_13= CHALLANEESICONINDEX+12;
public static final int CHALLANEESICON_14= CHALLANEESICONINDEX+13;
//for smaller 8x8 icons that often accompany an item sprite
public static class Icons {

View File

@ -1,73 +0,0 @@
/*
* Pixel Dungeon
* Copyright (C) 2012-2015 Oleg Dolya
*
* Shattered Pixel Dungeon
* Copyright (C) 2014-2022 Evan Debenham
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*/
package com.shatteredpixel.shatteredpixeldungeon.sprites;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.watabou.noosa.MovieClip;
import com.watabou.noosa.TextureFilm;
public class NewbornElementalSprite extends MobSprite{
public NewbornElementalSprite() {
super();
texture( Assets.Sprites.ELEMENTAL );
int ofs = 21;
TextureFilm frames = new TextureFilm( texture, 12, 14 );
idle = new MovieClip.Animation( 10, true );
idle.frames( frames, ofs+0, ofs+1, ofs+2 );
run = new MovieClip.Animation( 12, true );
run.frames( frames, ofs+0, ofs+1, ofs+3 );
attack = new MovieClip.Animation( 15, false );
attack.frames( frames, ofs+4, ofs+5, ofs+6 );
die = new MovieClip.Animation( 15, false );
die.frames( frames, ofs+7, ofs+8, ofs+9, ofs+10, ofs+11, ofs+12, ofs+13, ofs+12 );
play( idle );
}
@Override
public void link( Char ch ) {
super.link( ch );
add( CharSprite.State.BURNING );
}
@Override
public void die() {
super.die();
remove( CharSprite.State.BURNING );
}
@Override
public int blood() {
return 0xFFFF7D13;
}
}

View File

@ -75,7 +75,11 @@ public class StatusPane extends Component {
private Button heroInfoOnBar;
private Image hg;
private Image puresoul;
private Image icehp;
private BitmapText icehpText;
private Image lanterfirevae;
private BitmapText hgText;
private Image exp;
@ -159,8 +163,12 @@ public class StatusPane extends Component {
else hg = new Image(asset, 0, 45, 49, 4);
add( hg );
puresoul = new Image(Assets.Interfaces.LANTERLING);
add( puresoul );
if (large) icehp = new Image(asset, 0, 128, 128, 7);
else icehp = new Image(asset, 0, 49, 52, 4);
add( icehp );
lanterfirevae = new Image(Assets.Interfaces.LANTERLING);
add(lanterfirevae);
hpText = new BitmapText(PixelScene.pixelFont);
hpText.alpha(0.6f);
@ -171,7 +179,11 @@ public class StatusPane extends Component {
hgText.alpha(0.6f);
add(hgText);
//FPS TEXT
icehpText = new BitmapText(PixelScene.pixelFont);
icehpText.alpha(0.6f);
add(icehpText);
//TIME TEXT
timeText = PixelScene.renderTextBlock(5);
timeText.alpha(0.6f);
add(timeText);
@ -273,6 +285,9 @@ public class StatusPane extends Component {
hgText.y = hg.y;
PixelScene.align(hgText);
icehp.x = x+ 30;
icehp.y = y + 4;
expText.x = exp.x + (128 - expText.width())/2f;
expText.y = exp.y;
PixelScene.align(expText);
@ -280,9 +295,6 @@ public class StatusPane extends Component {
heroInfoOnBar.setRect(heroInfo.right(), y + 19, 130, 20);
if(SPDSettings.TimeLimit()) {
// fpsText.scale.set(PixelScene.align(0.8f));
// timeText.x = MenuPane.version.x;
// timeText.y = MenuPane.version.y+6;
PixelScene.align(timeText);
timeStatusText.x = MenuPane.version.x;
timeStatusText.y = MenuPane.version.y+10;
@ -293,18 +305,12 @@ public class StatusPane extends Component {
timeStatusText.active=false;
timeStatusText.visible=false;
}
// buffs.setPos( x + 31, y +15 );
// //下半段
// puresoul.visible = true;
lanter.setPos(0, 500);
busy.x = x + bg.width + 1;
busy.y = y + bg.height - 9;
} else {
exp.x = x;
exp.y = y;
//
hp.x = shieldedHP.x = rawShielding.x = x + 30;
hp.y = shieldedHP.y = rawShielding.y = y + 3;
@ -323,19 +329,22 @@ public class StatusPane extends Component {
hgText.y -= 0.001f; //prefer to be slightly higher
PixelScene.align(hgText);
// puresoulText.scale.set(PixelScene.align(0.5f));
// puresoulText.x = 31f;
// puresoulText.y = 13f + (hg.height - (puresoulText.baseLine()+puresoulText.scale.y))/2f;
// puresoulText.y -= 0.001f; //prefer to be slightly higher
// PixelScene.align(puresoulText);
icehp.x = 30.0f;
icehp.y = 13.0f;
icehpText.scale.set(PixelScene.align(0.5f));
icehpText.x = icehp.x + 1;
icehpText.y = icehp.y + (icehp.height - (icehpText.baseLine()+icehpText.scale.y))/2f;
icehpText.y -= 0.001f; //prefer to be slightly higher
PixelScene.align(icehpText);
heroInfoOnBar.setRect(heroInfo.right(), y, 50, 9);
puresoul.x= 1.0f;
puresoul.y= 142.0f;
puresoul.visible = false; //
lanterfirevae.x= 1.0f;
lanterfirevae.y= 142.0f;
lanterfirevae.visible = false; //
buffs.setPos( x + 31, y + 12 );
buffs.setPos( x + 34, y + 20 );
busy.x = x + 1;
busy.y = y + 33;
@ -370,24 +379,16 @@ public class StatusPane extends Component {
int maxHunger = (int) Hunger.STARVING;
int maxPureSole = Dungeon.hero.lanterfire;
int mtPureSole = 100;
//冰血聪明 x
int maxIceHp = Dungeon.hero.icehp;
int mtIceHp = 100;
int health = Dungeon.hero.HP;
int shield = Dungeon.hero.shielding();
int max = Dungeon.hero.HT;
int mtPureSole = 100;
//检查为光与影使用黑色模块
// int chCount = 0;
// for (int ch : Challenges.MASKS){
// if ((Dungeon.challenges & ch) != 0) chCount++;
// }
//
// if(chCount >= 3 && !Dungeon.isChallenged(PRO) && lanterfireactive){
// if (SPDSettings.ClassUI()) {
// bg.texture = TextureCache.get(Assets.Interfaces.STATUSSOUL_DARK);
// } else {
// bg.texture = TextureCache.get(Assets.Interfaces.STATUSSOUL);
// }
// } else
if (SPDSettings.ClassUI()) {
bg.texture = TextureCache.get(Assets.Interfaces.STATUS_DARK);
} else {
@ -411,7 +412,7 @@ public class StatusPane extends Component {
if(lanterfireactive){
lanter.setPos(0, 500);
puresoul.visible = false;
lanterfirevae.visible = false;
}
} else {
@ -421,17 +422,15 @@ public class StatusPane extends Component {
joinxxx.setPos(0, 500);
bossselect.setPos(0, 500);
//TODO 灯火前行
if(lanterfireactive){
lanter.setPos(0, 75);
lanter.visible = true;
lanter.active = true;
puresoul.visible =true;
puresoul.x= 1.0f;
puresoul.y= 142.0f;
lanterfirevae.visible =true;
lanterfirevae.x= 1.0f;
lanterfirevae.y= 142.0f;
}
}
if(Dungeon.hero.isAlive()){
@ -449,7 +448,7 @@ public class StatusPane extends Component {
}
timeText.text(sdf.format(date));
} else {
timeText.text("满目疮痍!游戏结束!");
timeText.text("GAME OVER");
}
@ -470,11 +469,13 @@ public class StatusPane extends Component {
shieldedHP.scale.x = health/(float)max;
if(lanterfireactive) {
puresoul.scale.y = -Math.max( 0, (maxPureSole)/(float)mtPureSole);
lanterfirevae.scale.y = -Math.max( 0, (maxPureSole)/(float)mtPureSole);
} else {
puresoul.scale.y = -1.0f;
lanterfirevae.scale.y = -1.0f;
}
icehp.scale.x = Math.max( 0, (maxIceHp)/(float)mtIceHp);
if (shield > health) {
rawShielding.scale.x = shield / (float) max;
} else {
@ -487,6 +488,8 @@ public class StatusPane extends Component {
hpText.text(health + "+" + shield + "/" + max);
}
icehpText.text(maxIceHp + "/" + mtIceHp);
Hunger hungerBuff = Dungeon.hero.buff(Hunger.class);
if (hungerBuff != null) {
int hunger = Math.max(0, maxHunger - hungerBuff.hunger());

View File

@ -263,7 +263,7 @@ public class Toolbar extends Component {
if (i == 0 && !SPDSettings.flipToolbar() ||
i == Math.min(SPDSettings.quickslots(), maxHorizontalQuickslots)-1 && SPDSettings.flipToolbar()) {
btnQuick[i].border(0, 2);
btnQuick[i].frame(106, 0, 19, 24);
btnQuick[i].frame(86, 0, 20, 24);
} else if (i == 0 && SPDSettings.flipToolbar() ||
i == Math.min(SPDSettings.quickslots(), maxHorizontalQuickslots)-1 && !SPDSettings.flipToolbar()) {
btnQuick[i].border(2, 1);
@ -287,7 +287,16 @@ public class Toolbar extends Component {
startX = btnInventory.left() - btnQuick[0].width();
for (int i = 0; i < maxHorizontalQuickslots; i++) {
QuickslotTool tool = btnQuick[i];
tool.setPos(startX, y+2);
//修复反向工具栏的错误
if (!SPDSettings.flipToolbar()) {
tool.setPos(startX, y + 2);
} else if (i >= 1) {
tool.setPos(startX, y + 2);
} else {
tool.setPos(startX-16, y + 2);
}
if (i + 1 < btnQuick.length) {
startX = btnQuick[i].left() - btnQuick[i+1].width();
}
@ -336,9 +345,6 @@ public class Toolbar extends Component {
btnSearch.setPos( (right - btnSearch.right()), y);
btnInventory.setPos( (right - btnInventory.right()), y);
for (QuickslotTool tool : btnQuick) {
tool.setPos( right - tool.right(), y+2);
}
}
}

View File

@ -11,6 +11,7 @@ import com.shatteredpixel.shatteredpixeldungeon.sprites.ClearElementalSprites;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ColdGuardSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ColdRatSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.CrivusFruitsSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.DM300SpiderSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.DM300Sprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.DiedMonkLoaderSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.FlameBoiSprite;
@ -44,6 +45,8 @@ import java.util.ArrayList;
public class vM0_6_7_X_Changes {
public static void addAllChanges(ArrayList<ChangeInfo> changeInfos) {
add_v0_6_28_Changes(changeInfos);
add_v0_6_27_Changes(changeInfos);
add_v0_6_26_Changes(changeInfos);
add_v0_6_25_Changes(changeInfos);
add_v0_6_24_Changes(changeInfos);
@ -73,6 +76,68 @@ public class vM0_6_7_X_Changes {
add_v0_6_0_Changes(changeInfos);
}
public static void add_v0_6_28_Changes( ArrayList<ChangeInfo> changeInfos ) {
ChangeInfo changes = new ChangeInfo("v0.6.1.0-Beta4.975(P3)", true, "");
changes.hardlight(Window.TITLE_COLOR);
changeInfos.add(changes);
changes = new ChangeInfo("新内容", false, null);
changes.hardlight(Window.GREEN_COLOR);
changeInfos.add(changes);
changes.addButton(new ChangeButton(new ItemSprite(ItemSpriteSheet.LANTERNB), ("娱乐模式"),
("娱乐模式正式开启测试\n\n第一个娱乐模式为首领对决(BOSSRUSH)")));
Image a = new DM300SpiderSprite();
a.scale.set(PixelScene.align(0.72f));
changes.addButton(new ChangeButton(a, ("新BOSS:DMZERO"),
("DMZERO是死灵巫师为夺取前矮人国王的政权而用黑暗魔法仿造矮人科技所制造的试作型魔法机械。\n" +
"由于水晶之心的影响DMZERO被禁锢在另一个异次元空间内无法影响地牢所在的时间线。\n" +
"Γ战斗回合过长将会释放_湮灭审判_对玩家造成致死伤害。半血后伤害大幅度提升。\n\n" +
"根据商人给出的情报,它的高智能辐射电波影响了这个地牢。封印,摧毁,抑或是遣返。让这里恢复原状吧。")));
changes = new ChangeInfo("改动", false, null);
changes.hardlight(Window.CYELLOW);
changeInfos.add(changes);
changes.addButton(new ChangeButton(new Image("sprites/spinner.png", 144, 0, 16, 16),
Messages.get(ChangesScene.class,
"bugfixes"),
("修复了很多Bug,我忘了我修了什么了(")));
}
public static void add_v0_6_27_Changes( ArrayList<ChangeInfo> changeInfos ) {
ChangeInfo changes = new ChangeInfo("v0.6.1.0-Beta4.95(P3)", true, "");
changes.hardlight(Window.TITLE_COLOR);
changeInfos.add(changes);
changes = new ChangeInfo("新内容", false, null);
changes.hardlight(Window.GREEN_COLOR);
changeInfos.add(changes);
changes.addButton(new ChangeButton((new Image("Ling.png", 0, 0, 16, 16)), ("开发者的话"),
("不知不觉中魔绫已经走过2年路程。从最初的几十人测试群到现在的1000人以上\n" +
"你们的支持和喜爱是我继续开发的动力。\n" +
"近期,我的课程很多,所以更新有所减缓。希望各位能够理解\n" +
"此版本是重大更新前的最后一个版本宝箱王我经过了多次重新设计希望能在Beta5版本为大家带来不一样的体验。\n" +
"如果各位还有什么建议,欢迎到群里面艾特我并告诉我你的建议。")));
changes.addButton(new ChangeButton(Icons.get(Icons.CHALLENGE_ON), ("(预载)全新挑战:雪虐风饕"),
("为即将到来的寒冷系统做准备")));
changes.addButton(new ChangeButton(Icons.get(Icons.INFO), ("(预载)寒冷系统"),
("为即将到来的全新旅程做准备")));
changes = new ChangeInfo("改动", false, null);
changes.hardlight(Window.CYELLOW);
changeInfos.add(changes);
changes.addButton(new ChangeButton(new Image("sprites/spinner.png", 144, 0, 16, 16),
Messages.get(ChangesScene.class,
"bugfixes"),
("1.快捷栏翻转修复\n2.修复新生火元素无法被冰冻类buff秒杀的问题\n3.修复深蓝蝾螈会让幽灵任务错误完成的问题\n4.修复元素风暴特效错误问题")));
}
public static void add_v0_6_26_Changes( ArrayList<ChangeInfo> changeInfos ) {
ChangeInfo changes = new ChangeInfo("v0.6.1.0-Beta4.9(P3)", true, "");
changes.hardlight(Window.TITLE_COLOR);

View File

@ -108,12 +108,12 @@ public class WndChallenges extends Window {
cb.checked((checked & Challenges.MASKS[i]) != 0);
cb.active = editable;
// //Disable
// if(Challenges.NAME_IDS[i].equals("stronger_bosses")){
// cb.active = false;
// cb.checked(false);
// cb.visible=false;
// }
//Disable
if(Challenges.NAME_IDS[i].equals("cs")){
cb.active = false;
cb.checked(false);
cb.visible=false;
}
boxes.add( cb );
info.setRect((i % 3) * 40, pos, 40, 0);
@ -292,6 +292,7 @@ public class WndChallenges extends Window {
conflict.setRect(check.right(), check.top(), 16, BTN_HEIGHT);
PixelScene.align( conflict );
}
height = BTN_HEIGHT * 2;
}
@ -325,8 +326,12 @@ public class WndChallenges extends Window {
return new ItemSprite(ItemSpriteSheet.CHALLANEESICON_12, new ItemSprite.Glowing(0xd1ce9f));
case "stronger_bosses":
return new ItemSprite(ItemSpriteSheet.CHALLANEESICON_13, new ItemSprite.Glowing(0xff0000));
case "icedied":
return new ItemSprite(ItemSpriteSheet.CHALLANEESICON_14, new ItemSprite.Glowing(0x009999));
case "dhxd":
return new ItemSprite(ItemSpriteSheet.LANTERNB, new ItemSprite.Glowing(0x384976));
case "cs":
return Icons.get(Icons.WARNING);
default:
return Icons.get(Icons.PREFS);
}

View File

@ -19,7 +19,7 @@ import java.util.ArrayList;
public class WndDLC extends Window {
private static final int WIDTH = 120;
private static final int HEIGHT = 162;
private static final int HEIGHT = 40;
private static final int BTN_HEIGHT = 16;
private static final int GAP = 1;
@ -66,7 +66,7 @@ public class WndDLC extends Window {
final String dlc = DLC.NAME_IDS[i];
if(i==normal_mode || i==hard_mode){
RenderedTextBlock block = PixelScene.renderTextBlock(6);
RenderedTextBlock block = PixelScene.renderTextBlock(9);
switch (i){
case normal_mode:
block.text(Messages.get(WndDLC.class, "mode"));

View File

@ -21,6 +21,8 @@
package com.shatteredpixel.shatteredpixeldungeon.windows;
import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.hero;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.GamesInProgress;
import com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon;
@ -135,12 +137,13 @@ public class WndGameInProgress extends Window {
try {
Bundle bundle = FileUtils.bundleFromFile(GamesInProgress.gameFile(slot));
String ing =
"游戏版本:" + Game.version+"\n\n"+
"地牢种子:" + DungeonSeed.convertToCode(bundle.getLong("seed"))+"\n\n"+
"现有金币:" + bundle.getInt("gold") +"\n\n"+
"奈亚大亨:" + bundle.getInt("naiyaziCollected")+"\n一场游戏累计在终端购买7次奈亚即可永久入驻0层" +"\n\n"+
"拟态猎杀:" + bundle.getInt("goldchest") +"\n\n"+
"注:类型不同的种子所生成的地牢物品规则将有所不同。\n-_B类_为开启_独当一面_挑战后的种子";
Messages.get(WndGameInProgress.class,"gameversion") + Game.version+"\n\n"+
Messages.get(WndGameInProgress.class,"gameseed")+ DungeonSeed.convertToCode(bundle.getLong("seed"))+"\n\n"+
Messages.get(WndGameInProgress.class,"gamegold") + bundle.getInt("gold") +"\n\n"+
Messages.get(WndGameInProgress.class,"gamenayzi") + bundle.getInt("naiyaziCollected")+
Messages.get(WndGameInProgress.class,"gamenayzis") +"\n\n"+
Messages.get(WndGameInProgress.class,"gamemimic") + bundle.getInt("goldchest") +"\n\n"+
Messages.get(WndGameInProgress.class,"gameinof");
ShatteredPixelDungeon.scene().addToFront(new WndMessage(ing));
} catch (IOException ignored) {
}
@ -162,6 +165,8 @@ public class WndGameInProgress extends Window {
if (info.shld > 0) statSlot( Messages.get(this, "health"), info.hp + "+" + info.shld + "/" + info.ht );
else statSlot( Messages.get(this, "health"), (info.hp) + "/" + info.ht );
statSlot( Messages.get(this, "exp"), info.exp + "/" + Hero.maxExp(info.level) );
statSlot( Messages.get(this, "icehp"), (info.icehp) + "/" + 100 );
pos += GAP;
statSlot( Messages.get(this, "gold"), info.goldCollected );
@ -176,7 +181,7 @@ public class WndGameInProgress extends Window {
GamesInProgress.curSlot = slot;
Dungeon.hero = null;
hero = null;
ActionIndicator.action = null;
InterlevelScene.mode = InterlevelScene.Mode.CONTINUE;
ShatteredPixelDungeon.switchScene(InterlevelScene.class);

View File

@ -201,6 +201,8 @@ public class WndHero extends WndTabbed {
RestatSlot( Messages.get(this, "lanterfire"), (hero.lanterfire) + "/" + 100 );
}
IcestatSlot( Messages.get(this, "icehp"), (hero.icehp) + "/" + 100 );
pos += GAP;
Hunger hunger = Dungeon.hero.buff(Hunger.class);
@ -261,6 +263,23 @@ public class WndHero extends WndTabbed {
pos += GAP + txt.height();
}
private void IcestatSlot( String label, String value ) {
RenderedTextBlock txt = PixelScene.renderTextBlock( label, 7 );
txt.setPos(0, pos);
add( txt );
txt = PixelScene.renderTextBlock( value, 7 );
txt.setPos(WIDTH * 0.5f, pos);
PixelScene.align(txt);
txt.hardlight(Window.TITLE_COLOR);
add( txt );
pos += GAP + txt.height();
}
private void statSlot( String label, int value ) {
statSlot( label, Integer.toString( value ) );
}

View File

@ -1,5 +1,6 @@
package com.shatteredpixel.shatteredpixeldungeon.windows;
import static com.shatteredpixel.shatteredpixeldungeon.DLC.BOSSRUSH;
import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.hero;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
@ -41,9 +42,16 @@ public class WndKingShop extends Window {
IconTitle titlebar = new IconTitle();
titlebar.setRect(0, 0, WIDTH, 0);
titlebar.icon(new ShopkKingSprite());
titlebar.label(Messages.get(WndKingShop.class,"king"));
if(Dungeon.isDLC(BOSSRUSH)){
titlebar.label("水晶意志");
} else {
titlebar.label(Messages.get(WndKingShop.class,"king"));
}
add( titlebar );
RenderedTextBlock message = PixelScene.renderTextBlock( (Messages.get(WndKingShop.class,"select")), 6 );
RenderedTextBlock message = PixelScene.renderTextBlock( Dungeon.isDLC(BOSSRUSH) ? "喜欢什么随便拿但一次500金币的费用还是要交的哦" :
(Messages.get(WndKingShop.class,"select")), 6 );
message.maxWidth(WIDTH);
message.setPos(0, titlebar.bottom() + GAP);
add( message );
@ -195,6 +203,12 @@ public class WndKingShop extends Window {
};
btnGoBack.textColor(Window.CYELLOW);
btnGoBack.icon(Icons.get(Icons.DEPTH));
if(Dungeon.isDLC(BOSSRUSH)){
btnGoBack.active=false;
btnGoBack.alpha(0.3f);
}
btnGoBack.setRect(s1.left(), s6.bottom()+5,111,BTN_SIZE );
add(btnGoBack);

View File

@ -412,7 +412,6 @@ public class WndSettings extends WndTabbed {
CheckBox chkFlipToolbar;
CheckBox chkFlipTags;
ColorBlock sep2;
CheckBox chkFont;
ColorBlock sep3;
RedButton btnKeyBindings;
@ -488,25 +487,25 @@ public class WndSettings extends WndTabbed {
sep2 = new ColorBlock(1, 1, 0xFF000000);
add(sep2);
chkFont = new CheckBox(Messages.get(this, "system_font")){
@Override
protected void onClick() {
super.onClick();
ShatteredPixelDungeon.seamlessResetScene(new Game.SceneChangeCallback() {
@Override
public void beforeCreate() {
SPDSettings.systemFont(false);
}
@Override
public void afterCreate() {
//do nothing
}
});
}
};
chkFont.checked(SPDSettings.systemFont());
add(chkFont);
// chkFont = new CheckBox(Messages.get(this, "system_font")){
// @Override
// protected void onClick() {
// super.onClick();
// ShatteredPixelDungeon.seamlessResetScene(new Game.SceneChangeCallback() {
// @Override
// public void beforeCreate() {
// SPDSettings.systemFont();
// }
//
// @Override
// public void afterCreate() {
// //do nothing
// }
// });
// }
// };
// chkFont.checked(SPDSettings.systemFont());
// add(chkFont);
if (DeviceCompat.hasHardKeyboard()){
@ -561,24 +560,22 @@ public class WndSettings extends WndTabbed {
sep2.size(width, 1);
sep2.y = chkFlipTags.bottom() + 2;
chkFont.setRect(0, sep2.y + 1 + GAP, width, BTN_HEIGHT);
if (btnKeyBindings != null){
if (width > 200){
chkFont.setSize(width/2-1, BTN_HEIGHT);
chkFlipTags.setSize(width/2-1, BTN_HEIGHT);
sep3.size(1, BTN_HEIGHT + 2*GAP);
sep3.x = chkFont.right() + 0.5f;
sep3.x = chkFlipTags.right() + 0.5f;
sep3.y = sep2.y+1;
PixelScene.align(sep3);
btnKeyBindings.setRect(chkFont.right()+2, chkFont.top(), width/2 - 1, BTN_HEIGHT);
btnKeyBindings.setRect(chkFlipTags.right()+2, chkFlipTags.top(), width/2 - 1, BTN_HEIGHT);
} else {
sep3.size(width, 1);
sep3.y = chkFont.bottom() + 2;
sep3.y = chkFlipTags.bottom() + 2;
btnKeyBindings.setRect(0, sep3.y + 1 + GAP, width, BTN_HEIGHT);
}
height = btnKeyBindings.bottom();
} else {
height = chkFont.bottom();
height = chkFlipTags.bottom();
}
}
@ -799,17 +796,16 @@ public class WndSettings extends WndTabbed {
add(chkWifi);
}
chkFireBase = new CheckBox(Messages.get(this, "firebase")) {
chkFireBase = new CheckBox("firebase") {
@Override
protected void onClick() {
super.onClick();
if (checked()) {
checked(!checked());
ShatteredPixelDungeon.scene().add(new WndOptions(Icons.get(Icons.DATA),
Messages.get(DisplayTab.class, "firebase_active"),
Messages.get(DisplayTab.class, "firebase_desc"),
Messages.get(DisplayTab.class, "okay"),
Messages.get(DisplayTab.class, "cancel")) {
"firebase_active",
"firebase_desc",
"cancel") {
@Override
protected void onSelect(int index) {
if (index == 0) {

Some files were not shown because too many files have changed in this diff Show More