Update V0.6.1 Beta4.975
|
@ -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
|
||||
|
||||
|
|
BIN
core/src/main/assets/Boss/swordling.png
Normal file
After Width: | Height: | Size: 282 B |
Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 3.1 KiB |
Before Width: | Height: | Size: 132 B |
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 20 KiB |
BIN
core/src/main/assets/interfaces/ice_bar.png
Normal file
After Width: | Height: | Size: 127 B |
Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 2.5 KiB |
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 4.6 KiB After Width: | Height: | Size: 4.5 KiB |
|
@ -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=???
|
||||
|
||||
|
|
|
@ -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控制终端[尚未完成]
|
||||
|
||||
|
|
|
@ -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那是一座铁城,镇压着无法流淌的时间。
|
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 1.5 KiB |
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 2.7 KiB |
Before Width: | Height: | Size: 2.6 KiB After Width: | Height: | Size: 2.7 KiB |
Before Width: | Height: | Size: 2.4 KiB After Width: | Height: | Size: 1.9 KiB |
Before Width: | Height: | Size: 76 KiB After Width: | Height: | Size: 78 KiB |
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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 );
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 );
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -60,6 +60,7 @@ public class Statistics {
|
|||
//灯火前行
|
||||
public static boolean lanterfireactive = false;
|
||||
|
||||
|
||||
//克里弗斯之果
|
||||
public static boolean crivusfruitslevel2 = false;
|
||||
|
||||
|
|
|
@ -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 );
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -259,7 +259,7 @@ public abstract class ChampionHero extends FlavourBuff {
|
|||
|
||||
@Override
|
||||
public boolean act() {
|
||||
detach();
|
||||
//detach();
|
||||
multiplier += 0.1f;
|
||||
spend(3*TICK);
|
||||
return true;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -53,6 +53,8 @@ public abstract class ArmorAbility implements Bundlable {
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
//leave null for no targeting
|
||||
public String targetingPrompt(){
|
||||
return null;
|
||||
|
|
|
@ -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};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 );
|
||||
|
|
|
@ -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 );
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 ) {
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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 );
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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||
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -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;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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"));
|
||||
}
|
||||
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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 );
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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 );
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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);
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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("完成_一局游戏_后解锁娱乐模式。--暂未实装"));
|
||||
}
|
||||
|
|
|
@ -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 ){
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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 );
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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 );
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
|
@ -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());
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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"));
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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 ) );
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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) {
|
||||
|
|