diff --git a/README.md b/README.md index 3946a35..1ed44c5 100644 --- a/README.md +++ b/README.md @@ -1,38 +1,5 @@ -<<<<<<< HEAD -# ShatteredPixelDungeon-DetailedDescVersion # - -A private mod of ShatteredPixelDungeon (Evan) working as a dictionary and a tester. - -Aim to help dungeon players know the data and mechanics of game, and have a platform to test game data and mechanics. - -*****************NOTE THAT***************** - -- All the description are ONLY available in CHINESE. - -- Currently this version is ONLY distributed in Tencent PD groups in China. - -*****************Main Features***************** - -- Detailed descrption for most items, creatures, plants etc. and important mechanics of game. - -- TestMode that has convinet access to most items and can travel between floors. - -- A few interesting and hard challenges or expansions to distinguish with original Shattered and improve play experience. Content might be somewhat limited because I can't make too many changes to original ShPD code, or it would be a disaster when transfering between versions. - -- And other parts of the game is TOTALLY UNCHANGED to keep inline with the original ShatterdPD. - -*****************More***************** - -- This project is built with Android Studio. - -- v091 is not where this mod started. It started from Shattered ~v072, but it was very messy and much less functional until Shattered ~v081. - -- Update (usually) each time when ShatteredPD releases a major version. - -- Since the gameplay is almost the same to original ShPD, you can just regard it as a dictionary. -======= -# ShatteredPD-DetailedDescVer # +# ShatteredPixelDungeon-DetailedDescVersion # A private mod of ShatteredPixelDungeon (Evan) working as a dictionary and a tester. @@ -62,6 +29,4 @@ Aim to help dungeon players know the data and mechanics of game, and have a plat - Update (usually) each time when ShatteredPD releases a major version. -- Since the gameplay is almost the same to original ShPD, you can just regard it as a dictionary. - ->>>>>>> ca8b4b0c6e57f321e00c437eaa5067dcca0a0d10 +- Since the gameplay is almost the same to original ShPD, you can just regard it as a dictionary. \ No newline at end of file diff --git a/core/src/main/assets/messages/custom/custom_zh.properties b/core/src/main/assets/messages/custom/custom_zh.properties index 5d28d55..9505974 100644 --- a/core/src/main/assets/messages/custom/custom_zh.properties +++ b/core/src/main/assets/messages/custom/custom_zh.properties @@ -198,13 +198,13 @@ custom.dict.dict.artifact_chalice =蓄血圣杯 custom.dict.dict.artifact_chalice_d =这个闪闪发光的银质酒杯在边沿突兀地装饰着几颗造型尖锐的宝石。\n蓄血圣杯作用是缩短被动回复间隔,每隔_10-0.9*圣杯等级_回合回复1生命值。\n圣杯通过血祭升级,每次伤害为_3*圣杯等级平方_,可以受到护甲等各种形式的防御的减免。如果伤害超过你当前生命值的_75%_,血祭之前会有警告。\n神器充能效果为_额外获得5倍生命回复,结果向上取整_。\n诅咒的圣杯无法血祭且会让你的被动回复减慢至_2/3_。 custom.dict.dict.artifact_cloak =暗影斗篷 -custom.dict.dict.artifact_cloak_d =这是盗贼多年前从皇家军械库窃取的一件无价的魔法斗篷。穿上时,能够使你在短时间内完全隐身。\n被使用得越频繁,斗篷就会变得越强,使盗贼更频繁地隐身,持续时间也更长。\n每点充能可以_隐身4回合_。斗篷每隔_45-斗篷等级_回合恢复1点充能,在高于7级时恢复时间还会降低_(等级-7)*5/3_回合。\n斗篷的神器充能效果为_每回合获得0.25充能_。\n诅咒的斗篷无法使用。\n\n斗篷的升级算法为:每级需要的经验为50+50*等级。每消耗1点充能获得10经验。\n斗篷每级对应的标准人物等级为1,3,5,7,9;11,13,16,19,22。人物等级每高于标准等级1级,斗篷获取经验增加10%,每低1级则会减少25%。 +custom.dict.dict.artifact_cloak_d =这是盗贼多年前从皇家军械库窃取的一件无价的魔法斗篷。穿上时,能够使你在短时间内完全隐身。\n被使用得越频繁,斗篷就会变得越强,使盗贼更频繁地隐身,持续时间也更长。\n每点充能可以_隐身4回合_。斗篷每隔_45-损失充能数_回合恢复1点充能,在高于7级时恢复时间还会降低_(等级-7)*5/3_回合。\n斗篷的神器充能效果为_每回合获得0.25充能_。\n诅咒的斗篷无法使用。\n\n斗篷的升级算法为:每级需要的经验为50+50*等级。每消耗1点充能获得10经验。\n斗篷每级对应的标准人物等级为1,3,5,7,9;11,13,16,19,22。人物等级每高于标准等级1级,斗篷获取经验*110%,每低1级则会*75%。 custom.dict.dict.artifact_rose =干枯玫瑰 custom.dict.dict.artifact_rose_d =这就是那朵在幽灵消失前被提及的玫瑰吗?它似乎拥有某种精神力量,也许能以此为媒介触及这位陨落战士的能量。\n召唤的白幽的血量上限为_神器等级*8+20_,命中为_英雄等级+9_,闪避为_英雄等级+4_。它的力量为_神器等级/2+13_。它的伤害与防御均为装备的面板数值。未装备时,它的伤害为_0~5_,防御为_0_。\n白幽每回合可以恢复千分之一的生命。\n玫瑰需要500回合充能完毕。\n如果玫瑰被诅咒,每回合周围都有0.01概率生成一只幽灵。\n玫瑰的神器充能效果是_每回合回复4充能_,或是为白幽每回合_恢复1+等级/3点生命_。 custom.dict.dict.artifact_chain =虚空锁链 -custom.dict.dict.artifact_chain_d =这些巨大但轻盈的锁链散发着灵魂能量。它们可以用来把你拉向一些地形,或将敌人拉向你。无实体的天然特质甚至可以允许其穿透墙壁!\n它的最高等级为_5_(显示等级等于实际等级*2)。\n它的充能阀值为_5+神器等级*2_。获取经验或是经过时间都可以增加充能。\n时间充能为为每_40-(阀值-充能)*2_回合1点,但不能超过阈值。\n对于经验充能,充能低于阀值时,每1级经验可以为锁链提供10充能,充能高于阈值时,经验充能的数值减少到(阈值/当前充能)倍。\n它的升级所需经验为100+神器等级*100。玩家每升1级,它就获得100经验。\n诅咒的锁链每回合有_1%_的几率使你_残废10回合_。\n锁链的神器充能效果是:充能小于10+神器等级*4时_每回合获得0.5充能_。 +custom.dict.dict.artifact_chain_d =这些巨大但轻盈的锁链散发着灵魂能量。它们可以用来把你拉向一些地形,或将敌人拉向你。无实体的天然特质甚至可以允许其穿透墙壁!\n它的最高等级为_5_(显示等级等于实际等级*2)。\n它的充能阈值为_5+神器等级*2_。获取经验或是经过时间都可以增加充能。\n时间充能为为每_40-(阈值-充能)*2_回合1点,但不能超过阈值。\n对于经验充能,充能低于阈值时,每1级经验可以为锁链提供10充能,充能高于阈值时,经验充能的数值减少到(阈值/当前充能)倍。\n它的升级所需经验为100+神器等级*100。玩家每升1级,它就获得100经验。\n诅咒的锁链每回合有_1%_的几率使你_残废10回合_。\n锁链的神器充能效果是:充能小于10+神器等级*4时_每回合获得0.5充能_。 custom.dict.dict.artifact_horn =丰饶之角 custom.dict.dict.artifact_horn_d =这个号角不能被用来吹奏,不过会随着你深入地牢获得经验而逐渐填充食物。\n角色获得经验充能,储存其他食物升级。\n最大充能为_10+神器等级_。\n每1级经验可以给号角提供_2.5+神器等级*1.25_点充能。\n每个充能回复_45_饥饿(吃饱_450_)。\n往其中储存食物获得的升级收益取决于食物能够回复的饥饿值,每达到300即升一级,最高10级。\n诅咒号角无法获得充能,还会让你吃东西回复饥饿减少_1/3_。\n号角的神器充能效果是_每回合获得0.25充能_。 @@ -219,10 +219,10 @@ custom.dict.dict.artifact_talisman =先见护符 custom.dict.dict.artifact_talisman_d =一块奇怪的有着光滑雕刻的石头。你觉得它在关注着你周围的一切,留意任何不寻常的东西。\n\n附近有隐藏地形时,护符会进行提示_(最远3格)_。\n充能回复速度为_0.05+(神器等级*0.005)_。\n每次搜索到隐藏陷阱会为护符恢复点充能2点,搜索到隐藏门则恢复10点。\n护符可以消耗(3+距离*1.08)点充能探查一个锥形区域,但探查最大距离不超过(5+等级*2)。探查的区域内,隐藏地形会被揭露,使用者获得5+等级*2回合的对范围内敌人与物品的视野。\n\n护符探查到不同目标会获得不同的经验。新的地格:1;视野外的敌人或一格物品:10;隐藏陷阱:10;隐藏门:100。\n诅咒护符会让角色无法自动探测隐藏陷阱。每级需要的经验是50+50*等级。\n\n神器充能效果是_每回合回复2点充能_。 custom.dict.dict.artifact_hourglass =时光沙漏 -custom.dict.dict.artifact_hourglass_d =这只大型的华贵沙漏看起来却并不怎么起眼,但你仍觉得它精雕细刻的框架内蕴含着某种强大的力量。在翻转沙漏、在看着沙子流下的同时,你能感受到一种魔法正在拉扯着你,使用这种魔法肯定能给你一些控制时间的方法。\n它的最高等级为_5_(显示等级为实际等级*2)。\n使用它能使自己遁入时间裂隙或使周围时间静止。\n遁入时间裂隙的回合数为_剩余充能数*5_,此时相当于原地不动隐身,怪物仍然会自由行动,饥饿值消耗和自然恢复效果依然存在。静止周围时间最多为_剩余充能数*2_。\n拥有沙漏后,新生成的商店会刷出魔法砂袋,购买即可升级。\n诅咒的沙漏每回合有_1/10_的几率跳过1回合。\n神器充能效果是_每回合回复0.25充能。_ +custom.dict.dict.artifact_hourglass_d =这只大型的华贵沙漏看起来却并不怎么起眼,但你仍觉得它精雕细刻的框架内蕴含着某种强大的力量。在翻转沙漏、在看着沙子流下的同时,你能感受到一种魔法正在拉扯着你,使用这种魔法肯定能给你一些控制时间的方法。\n它的最高等级为_5_(显示等级为实际等级*2)。\n使用它能使自己遁入时间裂隙或使周围时间静止。\n遁入时间裂隙的回合数为_剩余充能数*5_,此时相当于原地不动隐身,怪物仍然会自由行动,饥饿值消耗和自然恢复效果依然存在。静止周围时间最多为_剩余充能数*2_。\n每_90-损失充能数*3_回合恢复一点充能。\n拥有沙漏后,新生成的商店会刷出魔法砂袋,购买即可升级。\n诅咒的沙漏每回合有_1/10_的几率跳过1回合。\n神器充能效果是_每回合回复0.25充能。_ custom.dict.dict.artifact_book =无序魔典 -custom.dict.dict.artifact_book_d =这本魔典就其年岁而言被保养得异常好。当你翻动页面时它不断地噼啪作响并发出嘶嘶声,涌动着不稳定的能量。一旦诵读这本书,没人能笃定你会释放出什么咒语。\n它的充能上限为_(神器等级*0.6)+2_向下取整。\n使用它会消耗_1_充能随机触发一张卷轴效果(不包括升级)。\n添加在魔典介绍中指出的卷轴能够使它升级,并允许你使用对应的秘卷效果(消耗2点充能)。\n魔典每过_120-已使用充能数*5_回合就会回复1点充能。\n被诅咒的魔典会让你只能使用驱邪卷轴(或其对应秘卷)。\n神器充能效果为_每回合回复0.1充能_。 +custom.dict.dict.artifact_book_d =这本魔典就其年岁而言被保养得异常好。当你翻动页面时它不断地噼啪作响并发出嘶嘶声,涌动着不稳定的能量。一旦诵读这本书,没人能笃定你会释放出什么咒语。\n它的充能上限为_(神器等级*0.6)+2_向下取整。\n使用它会消耗_1_充能随机触发一张卷轴效果(不包括升级与嬗变)。\n添加在魔典介绍中指出的卷轴能够使它升级,并允许你使用对应的秘卷效果(消耗2点充能)。\n魔典每过_120-已使用充能数*5_回合就会回复1点充能。\n被诅咒的魔典会让你只能使用驱邪卷轴(或其对应秘卷)。\n神器充能效果为_每回合回复0.1充能_。 @@ -621,7 +621,7 @@ custom.dict.dict.missile_trident =三叉戟 custom.dict.dict.missile_trident_d =一把尖端有着三根致命尖叉的特大号投掷用长枪。威力极大,但也很重。\n\n这是一件_5_阶武器,力量需求为_17_,基础伤害为_10~25_,每件的耐久度为_10_。\n伤害成长为_+2/+5_。 custom.dict.dict.missile_spiritbow =灵能短弓 -custom.dict.dict.missile_spiritbow_d =一把由远古灵木制成的弓,弓弦和刻纹散发着幽蓝色的光。当拉开弓弦时,弓会向敌人发射一只魔法箭矢。\n\n这是一件_1_阶武器,力量需求为_10_,基础伤害为_1~6_。\n人物每5级弓升1级(但伤害连续变化),对于每一级而言弓的伤害获得+1/+2。\n\n追击技能:\n弓不改造:0耗时,的67%弓伤害的一次追击\n改造攻速:1回合,耗时50%弓伤害的3次追击\n改造伤害:2回合,基础倍率1.2倍的一次追击,每距目标1格距离伤害增加10%,倍率至多3倍。 +custom.dict.dict.missile_spiritbow_d =一把由远古灵木制成的弓,弓弦和刻纹散发着幽蓝色的光。当拉开弓弦时,弓会向敌人发射一只魔法箭矢。\n\n这是一件_1_阶武器,力量需求为_10_,基础伤害为_1~6_。\n人物每5级弓升1级(但伤害连续变化),对于每一级而言弓的伤害获得+1/+2。\n\n追击技能:\n弓不改造:0耗时,的67%弓伤害的一次追击\n改造攻速:1回合,耗时50%弓伤害的3次追击\n改造伤害:2回合,基础倍率1.2倍的一次追击,每距目标1格距离伤害*112.5%,倍率至多3倍。 ##******************************** wands custom.dict.dict.wand_blastwave =冲击波法杖 @@ -637,7 +637,7 @@ custom.dict.dict.wand_fireblast =焰浪法杖 custom.dict.dict.wand_fireblast_d =这根法杖由红漆木制成,饰以金叶,这使它看起来相当庄严。它的顶端噼啪作响嘶嘶而鸣,渴望着释放其强大的魔法。\n\n这根法杖的伤害为_(1+法杖等级)*消耗充能~(6+2*法杖等级)*消耗充能_。\n一次使用2充能会给目标造成_4回合残废_效果,一次使用3充能会给目标造成_4回合麻痹_效果。\n使用它会消耗30%的当前充能,向上取整,最少1充能。\n当每次使用1/2/3充能时,火焰会波及5/7/9格远的范围。\n战法效果是_使敌人起火_(等同于烈焰附魔)。 custom.dict.dict.wand_frost =冰霜法杖 -custom.dict.dict.wand_frost_d =这根法杖似乎由某种魔法冰块制成。它的圆顶闪着亮光。握起来很冰,但不知为何你的手仍保持着温暖。该法杖能向你的敌人射击冰霜能量,造成伤害并冷冻目标,降低其行动速度。\n\n这根法杖的伤害为_2+法杖等级~8+5*法杖等级_。\n使用它能给目标叠加_2+法杖等级_回合的冻伤,当目标在水上时上升到_4+法杖等级_回合。\n目标如果冻伤,它的伤害减少至_0.933^冻伤回合数_倍,最多计算10回合的衰减。它对已冻结目标不会造成伤害,同时也不会打破冻结。\n战法效果是概率冻结已经处于冻伤的目标(10回合以上则必定),不能连续冻结。 +custom.dict.dict.wand_frost_d =这根法杖似乎由某种魔法冰块制成。它的圆顶闪着亮光。握起来很冰,但不知为何你的手仍保持着温暖。该法杖能向你的敌人射击冰霜能量,造成伤害并冷冻目标,降低其行动速度。\n\n这根法杖的伤害为_2+法杖等级~8+5*法杖等级_。\n使用它能给目标叠加_2+法杖等级_回合的冻伤,当目标在水上时上升到_4+法杖等级_回合。\n目标如果冻伤,它的伤害减少至_0.933^冻伤回合数_倍,最多计算10回合的衰减(~50%)。它对已冻结目标不会造成伤害,同时也不会打破冻结。\n战法效果是概率冻结已经处于冻伤的目标(10回合以上则必定),不能连续冻结。 custom.dict.dict.wand_lightning =雷霆法杖 custom.dict.dict.wand_lightning_d =这根法杖由实心金属制成,这使它惊人地沉重。电弧在顶端两个内弯的叉齿间跳跃。这根法杖能向任何目标放出强大的电弧,造成大量伤害。这种电能在附近多个敌人间跳跃,在水里会更强力。\n\n这根法杖的伤害为_5+法杖等级~10+5*法杖等级_。\n通常情况下,电弧的伤害会随着跳跃目标的增多而衰减(衰减至 0.4+0.6/目标数量 倍),但在水中跳跃时它不会降低伤害。\n战法效果_同电击附魔_。 @@ -679,7 +679,7 @@ custom.dict.dict.ring_evasion =闪避之戒 custom.dict.dict.ring_evasion_d =这枚戒指会加快配戴者的反应速度,令其更难被敌人击中。被诅咒的戒指反而会让配戴者更容易被击中。\n你的闪避属性变为_1.15^效果等级_倍。 custom.dict.dict.ring_force =武力之戒 -custom.dict.dict.ring_force_d =这枚戒指能够增强配戴者的打击力度。这份额外的力量在挥舞武器时相当有限,而徒手攻击则会被大幅增强。负等级的戒指会导致配戴者的攻击变得软弱无力。\n武力戒指在空手时相当于一把等级等同于效果等级的武器,其阶数为:不超过18力量,_(力量-8)/2_ 阶,超过18力量,_(力量-18)/4+5_ 阶。\n武器基础伤害为 _阶数~5*阶数+5_, 成长为 _+1/+(阶数+1)_。\n装备武器时每一效果等级增加1点近战伤害。 +custom.dict.dict.ring_force_d =这枚戒指能够增强配戴者的打击力度。这份额外的力量在挥舞武器时相当有限,而徒手攻击则会被大幅增强。负等级的戒指会导致配戴者的攻击变得软弱无力。\n武力戒指在空手时相当于一把等级等同于效果等级的武器,其阶数为:不超过18力量,_(力量-8)/2_ 阶,超过18力量,_(力量-18)/4+5_ 阶。\n武器基础伤害为 _阶数~5*阶数+5_, 成长为 _+1/+(阶数+1)_。\n装备武器时每一效果等级增加1点近战伤害。 custom.dict.dict.ring_furor =狂怒之戒 custom.dict.dict.ring_furor_d =这枚戒指会激发配戴者内心的怒火,使其能够更迅猛地攻击。被诅咒的戒指则会导致穿戴者攻击迟缓。\n 你的攻击速度变为_1.105^效果等级_倍。 @@ -759,7 +759,7 @@ custom.dict.dict.buff_pos3 =正面效果-3 custom.dict.dict.buff_pos3_d =魔法睡眠:生物进入无法被脚步声唤醒的睡眠,受到伤害时打断,若是玩家或友方生物则每回合恢复1点生命值。\n\n火焰之力:攻击50%点燃目标4回合,免疫燃烧\n\n晶触之力:攻击使目标叠加2回合霜冻,免疫霜冻与冻结\n\n危险预知(秘卷):立即发现视野内隐藏地形。\n\n极速(药剂):3倍的移动速度\n\n治疗:每回合恢复剩余总量的一定比例(通常是25%)的生命,优先级非常高。\n\n隐身:不解释\n\n漂浮:无视陷阱、裂缝、草等地形并降低被发现的概率,立即解除生根\n\n系命(玩家目前无法获得):两角色平分伤害直到至少一方死亡 custom.dict.dict.buff_pos4 =正面效果-4 -custom.dict.dict.buff_pos4_d =发光:将视野扩大至6格\n\n魔法免疫:免疫所有魔法伤害、部分负面效果以及一些特殊能力(如魔像),禁止卷轴结晶法杖使用,触发类附魔暂时无效。\n\n灵视:看到本层所有生物及周围一格\n\n动能(疾行者):移动时每步积蓄1点动能,最多10点。每点动量可提供2回合疾跑(速度*2)。结束后获得_50-疾跑时长_的休息。休息完成后方可重新累积动能。疾跑状态下,获得人物等级/2点闪避。\n\n准备阶段(刺客):隐身达到1/3/5/9回合时:造成额外的0.15/0.3/0.45/0.6倍伤害,伤害在1/1/2/3次roll中取最大值,具有额外的1/2/3/4格攻击范围,能够处决生命值不超过3%/10%/20%/40%的普通敌人,与生命值不高于上述比例*0.2的boss。 +custom.dict.dict.buff_pos4_d =发光:将视野扩大至6格\n\n魔法免疫:免疫所有魔法伤害、部分负面效果以及一些特殊能力(如魔像),禁止卷轴结晶法杖使用,触发类附魔暂时无效。\n\n灵视:看到本层所有生物及周围一格\n\n动能(疾行者):移动时每步积蓄1点动能,最多10点。每点动量可提供2回合疾跑(速度*2)。结束后获得_10+4*初动能-疾跑时长_的休息。休息完成后方可重新累积动能。疾跑状态下,获得人物等级/2点闪避。\n\n准备阶段(刺客):隐身达到1/3/5/9回合时:造成额外的0.15/0.3/0.45/0.6倍伤害,伤害在1/1/2/3次roll中取最大值,具有额外的1/2/3/4格攻击范围,能够处决生命值不超过3%/10%/20%/40%的普通敌人,与生命值不高于上述比例*0.2的boss。 custom.dict.dict.buff_pos5 =正面效果-5 custom.dict.dict.buff_pos5_d =虹卫替身:有敌人时产生虹卫镜像攻击敌人,没有时收回分身并缓慢恢复生命。\n\n充能:为所有法杖恢复每回合0.25点充能\n\n暗影重合(花圃内):隐身,视野降为1,饥饿速度减少到2/3\n\n体力充沛:移速提升50%\n\n毒性之力:自身不断释放毒气,免疫毒气与中毒\n\n饱腹(全肉大饼):每18回合回复1点生命,饱腹存在时不扣除饥饿度 @@ -798,8 +798,7 @@ custom.dict.dict.misc_dust =尸尘 custom.dict.dict.misc_dust_d =任务道具。在背包里时,每_(本层幽灵数量+1)^2_回合召唤一只幽灵,但召唤间隔不超过25回合。 custom.dict.dict.misc_soon =coming s∞n -#reverse, move '=', decode -custom.dict.dict.misc_soon_d =0TPRZFcJJGSwhWYY\nFkeZ1WNXJ1ROlVTW\nZ1TUVlW1RlaGZVZs\nZFdW5GcpNWRadFVt\nVEeN1WS5AVU= +custom.dict.dict.misc_soon_d = More Expansions coming s∞n @@ -820,7 +819,7 @@ custom.dict.dict.info_ranged =投掷武器 custom.dict.dict.info_ranged_d =投掷武器具有一定的耐久度。每次升级都会使投掷武器耐久度*3,每级神射增加20%耐久度,购买魔法筒袋同样会增加20%耐久度。\n投掷武器在耐久超过100后可以无限使用。\n投掷武器远程使用会增加50%精准,但贴身使用会减少50%精准。\n投掷武器自然生成的时候是2~4个。\n\n腐梅飞镖是特例,只能使用一次。 custom.dict.dict.info_armor =护甲 -custom.dict.dict.info_armor_d =护甲力量需求为8+2*阶数,力量需求会在1,3,6,10,15,21...等级分别减少1点。\n如果你的力量不足,每一点超重的力量都会使你的移速下降至5/6,闪避下降至2/3,防御减少2点。\n额外力量可以使疾行者获得 (8+2*额外力量)*动能(最大100%)点闪避。\n\n护甲刻印分为三档:常见(12.5%):晦暗,迅捷,粘稠,电势\n稀有(6.67%):磐岩,狱火,缠绕,反斥,迷彩,涌流\n罕见(3.33%):敌法,魅惑,荆棘\n护甲自然生成时,有5%概率+2,20%概率+1,75%概率+0。些场合的装备可能具有额外升级(如金箱子,鱼房,迷宫房等),上锁的墓碑房最为明显(正等级概率高达77.5%)\n自然生成的武器有30%概率自带诅咒,15%概率自带刻印。\n鉴定护甲需要10次使用与半级经验。\n在信念护体挑战下,护甲防御变为0~阶数+等级 +custom.dict.dict.info_armor_d =护甲力量需求为8+2*阶数,力量需求会在1,3,6,10,15,21...等级分别减少1点。\n如果你的力量不足,每一点超重的力量都会使你的移速下降至5/6,闪避下降至2/3,防御减少2点。\n\n护甲刻印分为三档:常见(12.5%):晦暗,迅捷,粘稠,电势\n稀有(6.67%):磐岩,狱火,缠绕,反斥,迷彩,涌流\n罕见(3.33%):敌法,魅惑,荆棘\n护甲自然生成时,有5%概率+2,20%概率+1,75%概率+0。些场合的装备可能具有额外升级(如金箱子,鱼房,迷宫房等),上锁的墓碑房最为明显(正等级概率高达77.5%)\n自然生成的武器有30%概率自带诅咒,15%概率自带刻印。\n鉴定护甲需要10次使用与半级经验。\n在信念护体挑战下,护甲防御变为0~阶数+等级 custom.dict.dict.info_wand =法杖 custom.dict.dict.info_wand_d =法杖灌注入魔杖可以使充能上限+1。法杖与魔杖最大充能数为10。\n法杖充能耗时为 10+40*充能因数^(最大充能数-当前充能数)。充能因数对于普通法杖是0.875,对法杖套内的的法杖为0.85,对魔杖是0.75。由此可见,(1)魔杖充能远远快于普通法杖。(2)维持法杖的充能数在中等水平能提高法杖的效率。\n\n法杖自然生成的等级为:2/3概率+0,4/15概率+1,1/15概率+2。老杖匠的法杖有额外的1级。\n自然生成的法杖有30%概率诅咒。\n鉴定法杖需要10次使用与半级经验。\n\n在电火花中,法杖每回合额外获得1/3点充能。 @@ -1224,7 +1223,7 @@ custom.ch.mimic.mimicforchallenge.attack_7= \n冰寒之击+%d custom.ch.mimic.mimicforchallenge.attack_8= \n烈焰之击+%d custom.ch.mimic.mimicforchallenge.defend_1= \n最高限伤+%d custom.ch.mimic.mimicforchallenge.defend_2= \n最低限伤+%d -custom.ch.mimic.mimicforchallenge.defend_3= \n镜像防御+%d +custom.ch.mimic.mimicforchallenge.defend_3= \n防御复制+%d custom.ch.mimic.mimicforchallenge.defend_4= \n历战坚韧+%d custom.ch.mimic.mimicforchallenge.defend_5= \n吸血+%d custom.ch.mimic.mimicforchallenge.defend_6= \n反斥+%d @@ -1235,7 +1234,7 @@ custom.ch.mimic.mimicforchallenge.trick_2= \n随机传送+%d custom.ch.mimic.mimicforchallenge.trick_3= \n降级诅咒+%d custom.ch.mimic.mimicforchallenge.trick_4= \n高度戒备+%d custom.ch.mimic.mimicforchallenge.trick_5= \n怪物召唤+%d -custom.ch.mimic.mimicforchallenge.trick_6= \n隐身扫描+%d +custom.ch.mimic.mimicforchallenge.trick_6= \n隐身探测+%d custom.ch.mimic.mimicforchallenge.trick_7= \n充能吞噬+%d custom.ch.mimic.mimicforchallenge.trick_8= \n大力击退+%d @@ -1370,7 +1369,99 @@ custom.ch.boss.yogrealfist$darkfist.desc=暗影之拳是由纯粹的暗能量形 custom.ch.boss.yogreallevel.well_name = 空间之井 custom.ch.boss.yogreallevel.well_desc = 井中涌动着空间的魔力。也许它指向某个地方? - + + + +custom.ch.mob.sewer.rath.desc=虽说啮齿小鼠们具有攻击性,可它们依旧是下水道居民里的弱者。它们的啮咬非常烦人,但只有数量巨大时才会有生命威胁。\n\n死亡时召唤一只白鼠复仇。 + +custom.ch.mob.sewer.gnollh.desc=豺狼是鬣狗状的类人生物。它们在下水道和地牢里游荡,不时向上行动试图向地表发起进攻。豺狼巡查是它们种群里最普通的一员,它们既没有豺狼暴徒强壮,也赶不上萨满聪明。\n\n带有两枚飞镖。 + +custom.ch.mob.sewer.crabh.desc=这些巨型的螃蟹位居下水道食物链的顶端。它们行动极其迅速且其厚重的甲壳能承受沉重的打击。\n\n扣除玩家饥饿值,并使其虚弱。 + +custom.ch.mob.sewer.slimeh.desc=史莱姆是一种具有胶质外形与液态内核的奇特魔法生物。城市的下水道为它们提供了充分的水源和富足的养分。\n\n弹性极强,每次最多受到5点伤害,攻击附带击退效果。 + +custom.ch.mob.sewer.swarmh.desc=致命的飞蝇群愤怒地发出嗡嗡声。每次非魔法攻击都会把它分割成两群更小但同样危险的飞蝇群。\n\n死亡时,治疗周围敌人。 + +custom.ch.mob.prison.skeletonh.desc=骷髅是从那些悲惨的冒险者及地牢原住民尸骨的聚合物产生的,来自下层地牢的邪恶力量将它们从死亡中唤起。在吸收了足够的伤害之后,它们就会在骨头的爆炸中消解。\n死亡后会在楼层某处重构。 + +custom.ch.mob.prison.thiefh.desc=这些囚犯逃出了他们的牢房,却没能逃出这座监牢。随着时间流逝,这座监牢彻底摧毁了他们仅存的心智,以及对自由的向往。这些疯狂的小偷和强盗很久以前就已经彻底忘记它们是谁,以及它们为何偷窃。\n\n这些敌人比起面对面地战斗,更倾向于偷走你的财物随后逃之夭夭。一定要看紧它们,否则你以后可能再也不会见到自己的被盗财物了。\n\n偷窃距离+1,团伙左岸。 + +custom.ch.mob.prison.bandith.desc=这些囚犯逃出了他们的牢房,却没能逃出这座监牢。随着时间流逝,这座监牢彻底摧毁了他们仅存的心智,以及对自由的向往。这些疯狂的小偷和强盗很久以前就已经彻底忘记它们是谁,以及它们为何偷窃。\n\n这些敌人比起面对面地战斗,更倾向于偷走你的财物随后逃之夭夭。一定要看紧它们,否则你以后可能再也不会见到自己的被盗财物了。\n\n原速逃逸、失明攻击。 + +custom.ch.mob.prison.guardh.name=监狱守卫 +custom.ch.mob.prison.guardh.scorpion=给我过来! +custom.ch.mob.prison.guardh.def_verb=格挡 +custom.ch.mob.prison.guardh.desc=作为曾经监狱的管理者,这些守卫和那些罪犯已经没什么区别了。它们蹒跚的步伐如同僵尸一般,毫无思绪地四处寻找不属于这片区域的生物,比如你!\n\n它的铁链缠在自己的胯部,也许可以用来将敌人拉扯到非常近的距离。\n\n无限使用的锁链,别想跑! + +custom.ch.mob.prison.dm100h.desc=DM-100是一种矮人“防卫机械”的早期机型,用来保护下层矿洞中的矮人矿工。然而由于电击威力不足,它们之后被送给上层的人类监狱。典狱长起初认为DM-100太过残忍而没有启用,但随着时间推移,囚犯变得越来越难以控制,这使得DM-100成为了监狱的必备品。\n\n闪电预言。 custom.ch.mob.prison.dm100h$skylightning.ondeath = 当心闪电! custom.ch.mob.prison.dm100h$skylightning.rankings_desc = 五雷轰顶 +custom.ch.mob.cave.bath.desc=这些敏捷且坚韧的洞穴穹顶生物比看上去可怕地多。它们会通过每次成功的攻击来恢复生命,从而击败比它们大得多的对手。\n额外闪避、距离维持。 + +custom.ch.mob.cave.bruteh.name=豺狼暴徒 +custom.ch.mob.cave.bruteh.enraged=激怒 +custom.ch.mob.cave.bruteh.def_verb=格挡 +custom.ch.mob.cave.bruteh.desc=暴徒是豺狼人中体型最庞大,力量最强壮且生命力最顽强的精英。受到致命伤时,他们会陷入疯狂之中,获得暂时的护盾和极高的伤害加成。\n复活一次、少量投掷武器。 +custom.ch.mob.cave.bruteh$bruterage.name=豺狼狂暴 +custom.ch.mob.cave.brute$bruterage.desc=这个豺狼暴徒的死亡已经不可避免,但它想拉你作为陪葬品!\n\n时间的推移或是外界的伤害都会消磨护盾。在护盾消散殆尽之际,暴徒会彻底消亡。然而,一定要小心,在这一阶段暴徒会造成巨额伤害!\n\n剩余的护盾:%d。 + +custom.ch.mob.cave.shamanh.name=豺狼萨满 +custom.ch.mob.cave.shamanh.bolt_kill=魔力的冲击粉碎了你... +custom.ch.mob.cave.shamanh.desc=那些最具有智慧的豺狼可以掌握萨满魔法,豺狼萨满由于缺少力量所以更喜欢使用战斗法术。它们在部落中享有很高的地位,即使它们的身形相对薄弱。 +custom.ch.mob.cave.shamanh$elementalshaman.spell_desc=佩戴红色面具的萨满会利用冰与电元素对敌人造成可观的伤害。 +custom.ch.mob.cave.shamanh$trickshaman.spell_desc=佩戴蓝色面具的萨满会利用剧毒与空间魔法逐渐瓦解敌人。 +custom.ch.mob.cave.shamanh$controlshaman.spell_desc=佩戴紫色面具的萨满会对敌人施加大量负面效果,并能蒸发负面效果以造成高额伤害。 +custom.ch.mob.cave.shamanh$shamanmagic.rankings_desc=元素之力会毁灭你 + +custom.ch.mob.cave.spinnerh.desc=绿色而多毛的洞穴蜘蛛们会试着去躲避直接的战斗,它们更喜欢在远处等待其猎物卷入蜘网,在剧毒中慢慢死去。它们也能向远处喷吐蛛网,阻挡敌人的行动路线。\n\n高速移动、结网。 + +custom.ch.mob.city.warlockh.desc=当矮人的兴趣从工程建设转向奥秘学术时,术士们开始在城市中掌权。它们从元素魔法起步,但很快就开始研究恶魔学和死灵术。最强大的术士掌握了矮人王国的王权,其他术士如果想继续练习黑暗魔法,就必须放弃精神的自由,将意志交给他控制。\n\n这些术士拥有具有强大的干扰性魔法,能暂时抑制装备的升级魔力。装备的等级越高,受降级魔法的影响就越严重。\n\n充能吞噬。 + +custom.ch.mob.city.monkh.desc=这些僧侣皆是狂热的信徒,倾其所能从一切异族手中保护国王的安全。狂热的信仰使得他们将自己的意志交给了国王,只剩下没有思想的躯壳在城市中游荡。\n\n矮人武僧既不披甲亦不执械,仅仅依靠自己的徒手格斗技巧退敌。精神集中的武僧会必定格挡住一次进攻,哪怕是必中的攻击。武僧在移动时会更快地集中精神,在战斗中就相对慢些。\n\n击飞武器。 +custom.ch.mob.city.monkh.disarm=矮人武僧击飞了你的%s! + +custom.ch.mob.city.seniormonkh.desc=这些僧侣皆是狂热的信徒,倾其所能从一切异族手中保护国王的安全。狂热的信仰使得他们将自己的意志交给了国王,只剩下没有思想的躯壳在城市中游荡。\n\n这只武僧掌握了精深的格斗技巧,相较于普通的武僧,他能在移动时更迅速恢复集中。精神集中的武僧会必定格挡住一次进攻,哪怕是必中的攻击。武僧在移动时会更快地集中精神,在战斗中就相对慢些。\n\n击飞玩家。 +custom.ch.mob.city.seniormonkh.hard_strike = 你被武僧大师击飞了! + +custom.ch.mob.city.elementalh$blazingelemental.name=烈焰元素 +custom.ch.mob.city.elementalh$blazingelemental.desc=元素生物是一种由于施放强大魔法时的失误产生的混沌生物。元素生物缺乏最基础的智力,它们通常与一种特定的魔法密切相关。\n\n烈焰元素是一种常见的借助火焰之力攻击的元素生物。在近战时它能使得目标燃起大火,对付远处的敌人也能偶尔向目标发射火球。\n\n蒸发、范围引燃、火焰回复。 +custom.ch.mob.city.elementalh$freezingelemental.name=极寒元素 +custom.ch.mob.city.elementalh$freezingelemental.desc=元素生物是一种由于施放强大魔法时的失误产生的混沌生物。元素生物缺乏最基础的智力,它们通常与一种特定的魔法密切相关。\n\n极寒元素是一种常见的借助冰霜之力弱化敌人的元素生物。它们近战会使敌人陷入冻伤,也能偶尔远程攻击,在水面上冰霜之力的效果会显著加强。\n\n化水、冻结、冰爆、霜冻回复。 +custom.ch.mob.city.elementalh$freezingelemental.ice_break_die=你与冰一并碎成了渣... +custom.ch.mob.city.elementalh$lightningelemental.name=闪击元素 +custom.ch.mob.city.elementalh$lightningelemental.desc=元素生物是一种由于施放强大魔法时的失误产生的混沌生物。元素生物缺乏最基础的智力,它们通常与一种特定的魔法密切相关。\n\n闪击元素是一种利用电击与闪光攻击敌人,较为少见的元素生物。近战时它会向周遭敌人释放电弧,若主要攻击目标在水中将遭受额外伤害。对付远处的敌人时它们会偶尔释放致盲的强烈闪光。\n\n致盲、绝对致盲、电击防御。 +custom.ch.mob.city.elementalh$uncertaintyelemental.name=混乱元素 +custom.ch.mob.city.elementalh$uncertaintyelemental.desc=元素生物是一种由于施放强大魔法时的失误产生的混沌生物。元素生物缺乏最基础的智力,它们通常与一种特定的魔法密切相关。\n\n混乱元素是一种极其稀有的元素生物。它们不仅仅局限于一种特定的魔法,而是借助随机的魔法进行强力的攻击,并能制造大范围的混乱。\n\nN倍随机N倍快乐。 + +custom.ch.mob.city.absoluteblindness.name = 绝对失明 +custom.ch.mob.city.absoluteblindness.heromsg= 绝对失明 +custom.ch.mob.city.absoluteblindness.desc = 伸手不见五指,你暂时失去了视觉能力! + +custom.ch.mob.city.golemh.desc=魔像是矮人们试图利用魔法的新应用弥补机械设备长久以来的缺陷的产物。它们虽不似DM-300那样庞大笨重,但仍具有不可小觑的破坏力。\n\n魔像因体型过大无法进入过道,但矮人们赋予了魔像魔力来弥补这一点——魔像能在各个房间之间传送,并能将无法触及的敌人从远处拉回来。\n\n召唤元素。 + +custom.ch.mob.hall.eyeh.name=毁灭之眼 +custom.ch.mob.hall.eyeh.deathgaze_kill=死亡凝视夺取了你的生命… +custom.ch.mob.hall.eyeh.desc=毁灭之眼是一种将恶魔能量压抑在自己体内的漂浮球形生物。它们拥有近战能力,但其真正的力量蕴藏在它们的魔法之中。\n\n在短暂的蓄能过后邪眼将会释放一种名为_死亡凝视_的毁灭性能量射线。任何受到邪眼的这种凝视的生物都会受到极大的伤害,明智的冒险者都会及时寻求掩护。\n\n解离物品,召唤镜像。 +custom.ch.mob.hall.eyeh.one=毁灭之眼解离了你的%s! +custom.ch.mob.hall.eyeh.some=毁灭之眼解离了你的一些%s! +custom.ch.mob.hall.eyeimage.name=毁灭之眼镜像 +custom.ch.mob.hall.eyeimage.desc=同毁灭之眼,但缺乏近战能力,一次死亡凝视后便会消散。 + +custom.ch.mob.hall.ripperh.name=恶魔开膛手 +custom.ch.mob.hall.ripperh.leap=恶魔开膛手正准备扑杀! +custom.ch.mob.hall.ripperh.desc=这种恐怖的生物是恶魔利用这里残留的众多矮人尸骸而组成的。恶魔撕裂者外观类似苍白瘦弱的矮人,具有残缺不全的躯干与尖利修长的骨爪。\n\n恶魔撕裂者难以承受沉重的打击,但它们行动迅捷并十分危险。它们能够瞬间扑过极远的距离,再用自己的骨爪刺穿目标。\n\n与一般撕裂者不同的是,开膛手近战也能对目标造成一定的流血,在直面敌人时能造成更持久的流血。这种流血本身虽不甚严重,但可以一直叠加,叠加到一定程度会导致致命的爆发! +custom.ch.mob.hall.ripperh$consistbleeding.name=持续流血 +custom.ch.mob.hall.ripperh$consistbleeding.desc=持续流血比起普通的流血更为致命,因为这种流血在结束之前不会衰减,而且叠加到一定程度会引发致命的血爆!务必小心!\n\n当前流血层数:%d\n\n每回合伤害:%.2f +custom.ch.mob.hall.ripperh$consistbleeding.heromsg=你正在流血! +custom.ch.mob.hall.ripperh$consistbleeding.rankings_desc=过度失血 +custom.ch.mob.hall.ripperh$consistbleeding.burst=大出血! +custom.ch.mob.hall.ripperh$consistbleeding.bleed_die=你的最后一滴血也流干了... +custom.ch.mob.hall.ripperh$consistbleeding.burst_die=突然恶化的流血夺走了你的生命... + +custom.ch.mob.hall.scorpioh.desc=这些巨大的节肢类恶魔生物会尽可能避免一切近距离接触,并且会在远处射出能够致残的尖刺。\n\n持续站定的射击会使得蝎子瞄准目标的要害,有效突破目标的防御并使其失明,且能够对无法看到自身的目标打出_致命一击_。 +custom.ch.mob.hall.scorpioh.head_shot=HEAD SHOT!!! + +custom.ch.mob.hall.succubush.desc=魅魔是一种善于操纵敌人的精神的变形恶魔。这一只化为了哥特风的苍白人形,或许是为了吸引矮人术士?\n\n在攻击时,魅魔能够暂时魅惑目标,使其无法直接攻击魅魔本身。魅魔在攻击被魅惑的目标时能吸取其生命精华。\n\n破甲、范围治疗。 + + diff --git a/core/src/main/assets/messages/misc/misc_zh.properties b/core/src/main/assets/messages/misc/misc_zh.properties index 5a5da76..b0a62d8 100644 --- a/core/src/main/assets/messages/misc/misc_zh.properties +++ b/core/src/main/assets/messages/misc/misc_zh.properties @@ -92,25 +92,25 @@ challenges.add = 追加挑战 challenges.expansion = 扩展包 challenges.elite_bosses_1 = 极端措施-I -challenges.elite_bosses_1_desc = 强化粘咕。\n\n咕,咕——咕! +challenges.elite_bosses_1_desc = 强化粘咕。\n\n咕,咕——咕!\n\n开启任一“极端措施”挑战将禁用元素之戒。强化Boss层移速增加效果减少75%,且移速不超过1.5。 challenges.elite_bosses_2 = 极端措施-II -challenges.elite_bosses_2_desc = 强化天狗。\n\n抓到你了! +challenges.elite_bosses_2_desc = 强化天狗。\n\n抓到你了!\n\n开启任一“极端措施”挑战将禁用元素之戒。强化Boss层移速增加效果减少75%,且移速不超过1.5。 challenges.elite_bosses_3 = 极端措施-III -challenges.elite_bosses_3_desc = 强化DM-300。\n\n检 测 到 未 授 权 人 员 +challenges.elite_bosses_3_desc = 强化DM-300。\n\n检 测 到 未 授 权 人 员\n\n开启任一“极端措施”挑战将禁用元素之戒。强化Boss层移速增加效果减少75%,且移速不超过1.5。 challenges.elite_bosses_4 = 极端措施-IV -challenges.elite_bosses_4_desc = 强化矮人国王。\n\n我-是-不-朽-哒! +challenges.elite_bosses_4_desc = 强化矮人国王。\n\n我-是-不-朽-哒!\n\n开启任一“极端措施”挑战将禁用元素之戒。强化Boss层移速增加效果减少75%,且移速不超过1.5。 challenges.elite_bosses_5 = 极端措施-V -challenges.elite_bosses_5_desc = 强化古神。\n\n希-望-皆-为-虚-妄-... -challenges.elite_enemies_1 = 福利待遇-I -challenges.elite_enemies_1_desc = 强化下水道区域敌人。 -challenges.elite_enemies_2 = 福利待遇-II -challenges.elite_enemies_2_desc = 强化监狱区域敌人。 -challenges.elite_enemies_3 = 福利待遇-III -challenges.elite_enemies_3_desc = 强化废弃矿洞区域敌人。 -challenges.elite_enemies_4 = 福利待遇-IV -challenges.elite_enemies_4_desc = 强化矮人城邦区域敌人。 -challenges.elite_enemies_5 = 福利待遇-V -challenges.elite_enemies_5_desc = 强化恶魔巢穴区域敌人。 +challenges.elite_bosses_5_desc = 强化古神。\n\n希-望-皆-为-虚-妄-...\n\n开启任一“极端措施”挑战将禁用元素之戒。强化Boss层移速增加效果减少75%,且移速不超过1.5。 +challenges.elite_enemies_1 = 全副武装-I +challenges.elite_enemies_1_desc = 强化下水道区域敌人。\n\n开启任一“全副武装”挑战将禁用冲击波法杖。 +challenges.elite_enemies_2 = 全副武装-II +challenges.elite_enemies_2_desc = 强化监狱区域敌人。\n\n开启任一“全副武装”挑战将禁用冲击波法杖。 +challenges.elite_enemies_3 = 全副武装-III +challenges.elite_enemies_3_desc = 强化废弃矿洞区域敌人。\n\n开启任一“全副武装”挑战将禁用冲击波法杖。 +challenges.elite_enemies_4 = 全副武装-IV +challenges.elite_enemies_4_desc = 强化矮人城邦区域敌人。\n\n开启任一“全副武装”挑战将禁用冲击波法杖。 +challenges.elite_enemies_5 = 全副武装-V +challenges.elite_enemies_5_desc = 强化恶魔巢穴区域敌人。\n\n开启任一“全副武装”挑战将禁用冲击波法杖。 challenges.test_mode=测试时间 challenges.test_mode_desc= 追加选项\n\n测试时间!\n\n你可以自由生成物品,并可以自由地在地牢内移动。\n\n在测试模式下,右上角的版本号会发生变化以指示测试模式。\n\n注意,测试模式不计入排行榜。 challenges.mimic_dungeon = 拟形地牢 diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Challenges.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Challenges.java index 770cfec..a55239b 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Challenges.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Challenges.java @@ -25,7 +25,6 @@ import com.shatteredpixel.shatteredpixeldungeon.items.Item; import com.shatteredpixel.shatteredpixeldungeon.items.rings.RingOfElements; import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfBlastWave; -import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfCorruption; public class Challenges { @@ -115,7 +114,7 @@ public static boolean isItemBlocked( Item item ){ } if(Dungeon.isChallenged(ELITE_ENEMIES)){ - if(item instanceof WandOfBlastWave || item instanceof WandOfCorruption){ + if(item instanceof WandOfBlastWave ){ return true; } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Hero.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Hero.java index a7b0671..e427a52 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Hero.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Hero.java @@ -526,10 +526,15 @@ public float speed() { } if(Dungeon.isChallenged(Challenges.ELITE_BOSSES)){ - if(Dungeon.bossLevel(Dungeon.depth)) { + //judge if boss is reinforced + long id = Dungeon.challenges / Challenges.ELITE_ENEMIES_1; + boolean slow = (id & (1<<(Dungeon.depth/5-1)))>0; + if(Dungeon.bossLevel(Dungeon.depth) && slow) { if (buff(LockedFloor.class) != null) { - // 1/3 effect for extra speed - speed = 1f + (speed - 1f) * 0.33f; + // 1/4 effect for extra speed, capped at 1.5 + if(speed>1f) { + speed = Math.min(1f + (speed - 1f) * 0.25f, 1.5f); + } } } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Bestiary.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Bestiary.java index 9bc418c..7424a38 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Bestiary.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Bestiary.java @@ -43,7 +43,6 @@ public static ArrayList> getMobRotation( int depth ){ swapMobAlts(mobs); }else{ mobs = MobList.HardMobList(depth); - MobList.swapMobAlts(mobs); } Random.shuffle(mobs); return mobs; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/custom/ch/boss/YogHard.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/custom/ch/boss/YogHard.java deleted file mode 100644 index 392c449..0000000 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/custom/ch/boss/YogHard.java +++ /dev/null @@ -1,571 +0,0 @@ -package com.shatteredpixel.shatteredpixeldungeon.custom.ch.boss; - -import com.shatteredpixel.shatteredpixeldungeon.Dungeon; -import com.shatteredpixel.shatteredpixeldungeon.Statistics; -import com.shatteredpixel.shatteredpixeldungeon.actors.Actor; -import com.shatteredpixel.shatteredpixeldungeon.actors.Char; -import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Amok; -import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; -import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Charm; -import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Degrade; -import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Frost; -import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Light; -import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.LockedFloor; -import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Paralysis; -import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Sleep; -import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Terror; -import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Vertigo; -import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Bee; -import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Eye; -import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob; -import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.RipperDemon; -import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.YogFist; -import com.shatteredpixel.shatteredpixeldungeon.effects.Beam; -import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter; -import com.shatteredpixel.shatteredpixeldungeon.effects.Pushing; -import com.shatteredpixel.shatteredpixeldungeon.effects.TargetedCell; -import com.shatteredpixel.shatteredpixeldungeon.effects.particles.PurpleParticle; -import com.shatteredpixel.shatteredpixeldungeon.effects.particles.ShadowParticle; -import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.DriedRose; -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.LarvaSprite; -import com.shatteredpixel.shatteredpixeldungeon.sprites.YogSprite; -import com.shatteredpixel.shatteredpixeldungeon.tiles.DungeonTilemap; -import com.shatteredpixel.shatteredpixeldungeon.ui.BossHealthBar; -import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; -import com.watabou.utils.Bundle; -import com.watabou.utils.GameMath; -import com.watabou.utils.PathFinder; -import com.watabou.utils.Random; -import com.watabou.utils.Reflection; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashSet; - -public class YogHard extends Boss{ - { - spriteClass= YogSprite.class; - state=HUNTING; - initProperty(); - initBaseStatus(1, 2, 1, 0, 1200, 0, 0); - initStatus(180); - properties.add(Property.IMMOVABLE); - properties.add(Property.DEMONIC); - viewDistance = 12; - } - - private int phase = 0; - - private float abilityCooldown; - private static final int MIN_ABILITY_CD = 10; - private static final int MAX_ABILITY_CD = 15; - - private float summonCooldown; - private static final int MIN_SUMMON_CD = 10; - private static final int MAX_SUMMON_CD = 15; - - private ArrayList fistSummons = new ArrayList<>(); - - { - Random.pushGenerator(Dungeon.seedCurDepth()); - - fistSummons.add(YogFist.BurningFist.class); - fistSummons.add(YogFist.SoiledFist.class); - fistSummons.add(YogFist.RottingFist.class); - fistSummons.add(YogFist.RustedFist.class); - fistSummons.add(YogFist.BrightFist.class); - fistSummons.add(YogFist.DarkFist.class); - - Random.shuffle(fistSummons); - - Random.popGenerator(); - } - - private static final int SUMMON_DECK_SIZE = 4; - private ArrayList regularSummons = new ArrayList<>(); - { - for (int i = 0; i < SUMMON_DECK_SIZE; i++){ - if (i >= Statistics.spawnersAlive){ - regularSummons.add(Larva.class); - } else { - regularSummons.add(YogRipper.class); - } - } - Random.shuffle(regularSummons); - } - - private ArrayList targetedCells = new ArrayList<>(); - - @Override - protected boolean act() { - //char logic - if (fieldOfView == null || fieldOfView.length != Dungeon.level.length()){ - fieldOfView = new boolean[Dungeon.level.length()]; - } - Dungeon.level.updateFieldOfView( this, fieldOfView ); - - throwItems(); - - //mob logic - enemy = chooseEnemy(); - - enemySeen = enemy != null && enemy.isAlive() && fieldOfView[enemy.pos] && enemy.invisible <= 0; - //end of char/mob logic - - if (phase == 0){ - if (Dungeon.hero.viewDistance >= Dungeon.level.distance(pos, Dungeon.hero.pos)) { - Dungeon.observe(); - } - if (Dungeon.level.heroFOV[pos]) { - notice(); - } - } - - if (phase == 4 && findFist() == null){ - yell(Messages.get(this, "hope")); - phase = 5; - setBackBeam(5, 5, 3, 2); - } - - if (phase == 0){ - spend(TICK); - return true; - } else { - - boolean terrainAffected = false; - HashSet affected = new HashSet<>(); - //delay fire on a rooted hero - if (!Dungeon.hero.rooted) { - for (int i : targetedCells) { - Ballistica b = new Ballistica(pos, i, Ballistica.WONT_STOP); - //shoot beams - sprite.parent.add(new Beam.DeathRay(sprite.center(), DungeonTilemap.raisedTileCenterToWorld(b.collisionPos))); - for (int p : b.path) { - Char ch = Actor.findChar(p); - if (ch != null && (ch.alignment != alignment || ch instanceof Bee)) { - affected.add(ch); - } - if (Dungeon.level.flamable[p]) { - Dungeon.level.destroy(p); - GameScene.updateMap(p); - terrainAffected = true; - } - } - } - if (terrainAffected) { - Dungeon.observe(); - } - for (Char ch : affected) { - ch.damage(Random.NormalIntRange(20, 30), new Eye.DeathGaze()); - - if (Dungeon.level.heroFOV[pos]) { - ch.sprite.flash(); - CellEmitter.center(pos).burst(PurpleParticle.BURST, Random.IntRange(1, 2)); - } - if (!ch.isAlive() && ch == Dungeon.hero) { - Dungeon.fail(getClass()); - GLog.n(Messages.get(Char.class, "kill", name())); - } - } - targetedCells.clear(); - } - - if (abilityCooldown <= 0){ - - int beams = 1; - HashSet affectedCells = new HashSet<>(); - for (int i = 0; i < beams; i++){ - - int targetPos = Dungeon.hero.pos; - if (i != 0){ - do { - targetPos = Dungeon.hero.pos + PathFinder.NEIGHBOURS8[Random.Int(8)]; - } while (Dungeon.level.trueDistance(pos, Dungeon.hero.pos) - > Dungeon.level.trueDistance(pos, targetPos)); - } - targetedCells.add(targetPos); - Ballistica b = new Ballistica(pos, targetPos, Ballistica.WONT_STOP); - affectedCells.addAll(b.path); - } - - //remove one beam if multiple shots would cause every cell next to the hero to be targeted - boolean allAdjTargeted = true; - for (int i : PathFinder.NEIGHBOURS9){ - if (!affectedCells.contains(Dungeon.hero.pos + i) && Dungeon.level.passable[Dungeon.hero.pos + i]){ - allAdjTargeted = false; - break; - } - } - if (allAdjTargeted){ - targetedCells.remove(targetedCells.size()-1); - } - for (int i : targetedCells){ - Ballistica b = new Ballistica(pos, i, Ballistica.WONT_STOP); - for (int p : b.path){ - sprite.parent.add(new TargetedCell(p, 0xFF0000)); - affectedCells.add(p); - } - } - - //don't want to overly punish players with slow move or attack speed - spend(GameMath.gate(TICK, Dungeon.hero.cooldown(), 3*TICK)); - Dungeon.hero.interrupt(); - - abilityCooldown += Random.NormalFloat(MIN_ABILITY_CD, MAX_ABILITY_CD); - abilityCooldown -= (phase - 1); - - } else { - spend(TICK); - } - - while (summonCooldown <= 0){ - - Class cls = regularSummons.remove(0); - Mob summon = Reflection.newInstance(cls); - regularSummons.add(cls); - - int spawnPos = -1; - for (int i : PathFinder.NEIGHBOURS8){ - if (Actor.findChar(pos+i) == null){ - if (spawnPos == -1 || Dungeon.level.trueDistance(Dungeon.hero.pos, spawnPos) > Dungeon.level.trueDistance(Dungeon.hero.pos, pos+i)){ - spawnPos = pos + i; - } - } - } - - if (spawnPos != -1) { - summon.pos = spawnPos; - GameScene.add( summon ); - Actor.addDelayed( new Pushing( summon, pos, summon.pos ), -1 ); - summon.beckon(Dungeon.hero.pos); - - summonCooldown += Random.NormalFloat(MIN_SUMMON_CD, MAX_SUMMON_CD); - summonCooldown -= (phase - 1); - if (findFist() != null){ - summonCooldown += MIN_SUMMON_CD - (phase - 1); - } - } else { - break; - } - } - - } - - if (summonCooldown > 0) summonCooldown-=1f; - if (abilityCooldown > 0) abilityCooldown-=1f; - - //extra fast abilities and summons at the final 100 HP - if (phase == 5 && abilityCooldown > 2){ - abilityCooldown = 2; - } - if (phase == 5 && summonCooldown > 3){ - summonCooldown = 3; - } - - return true; - } - - @Override - public boolean isAlive() { - return super.isAlive() || phase != 5; - } - - @Override - public boolean isInvulnerable(Class effect) { - return phase == 0 || findFist() != null; - } - - private void setBackBeam(int dx, int dy, int vx, int vy){ - YogBackgroundBeam b = buff(YogBackgroundBeam.class); - if(b!=null){ - b.setDensity(dx, dy, vx, vy); - }else{ - Buff.affect(this, YogBackgroundBeam.class).setDensity(dx, dy, vx, vy); - } - } - - @Override - public void damage( int dmg, Object src ) { - - int preHP = HP; - super.damage( dmg, src ); - - if (phase == 0 || findFist() != null) return; - - if (phase < 4) { - HP = Math.max(HP, HT - 350 * phase); - } else if (phase == 4) { - HP = Math.max(HP, 150); - } - int dmgTaken = preHP - HP; - - if (dmgTaken > 0) { - abilityCooldown -= dmgTaken / 6f; - summonCooldown -= dmgTaken / 6f; - } - - if (phase < 4 && HP <= HT - 350*phase){ - - Dungeon.level.viewDistance = Math.max(1, Dungeon.level.viewDistance-1); - if (Dungeon.hero.buff(Light.class) == null){ - Dungeon.hero.viewDistance = Dungeon.level.viewDistance; - } - Dungeon.observe(); - GLog.n(Messages.get(this, "darkness")); - sprite.showStatus(CharSprite.POSITIVE, Messages.get(this, "invulnerable")); - - YogFist fist = (YogFist) Reflection.newInstance(fistSummons.remove(0)); - fist.pos = Dungeon.level.exit; - - CellEmitter.get(Dungeon.level.exit-1).burst(ShadowParticle.UP, 25); - CellEmitter.get(Dungeon.level.exit).burst(ShadowParticle.UP, 100); - CellEmitter.get(Dungeon.level.exit+1).burst(ShadowParticle.UP, 25); - - if (abilityCooldown < 5) abilityCooldown = 5; - if (summonCooldown < 5) summonCooldown = 5; - - int targetPos = Dungeon.level.exit + Dungeon.level.width(); - if (Actor.findChar(targetPos) == null){ - fist.pos = targetPos; - } else if (Actor.findChar(targetPos-1) == null){ - fist.pos = targetPos-1; - } else if (Actor.findChar(targetPos+1) == null){ - fist.pos = targetPos+1; - } - - //1, 2, 3 FISTS !!! - GameScene.add(fist, 4); - Actor.addDelayed( new Pushing( fist, Dungeon.level.exit, fist.pos ), -1 ); - - if(phase>1) { - YogFist fist_1 = (YogFist) Reflection.newInstance(fistSummons.remove(0)); - fist_1.pos = this.pos + 1; - GameScene.add(fist_1, 4); - } - - if(phase>2) { - YogFist fist_2 = (YogFist) Reflection.newInstance(fistSummons.remove(0)); - fist_2.pos = this.pos - 1; - GameScene.add(fist_2, 4); - } - - phase++; - - if(phase == 2){ - setBackBeam(9, 9, 1, 1); - }else if(phase == 3){ - setBackBeam(9, 7, 2, 1); - }else if(phase == 4){ - setBackBeam(7, 7, 3, 2); - } - } - - LockedFloor lock = Dungeon.hero.buff(LockedFloor.class); - if (lock != null) lock.addTime(dmgTaken); - - } - - private YogFist findFist(){ - for ( Char c : Actor.chars() ){ - if (c instanceof YogFist){ - return (YogFist) c; - } - } - return null; - } - - @Override - public void beckon( int cell ) { - } - - @Override - public void aggro(Char ch) { - for (Mob mob : (Iterable)Dungeon.level.mobs.clone()) { - if (Dungeon.level.distance(pos, mob.pos) <= 8 && - (mob instanceof Larva || mob instanceof RipperDemon)) { - mob.aggro(ch); - } - } - } - - @SuppressWarnings("unchecked") - @Override - public void die( Object cause ) { - - for (Mob mob : (Iterable)Dungeon.level.mobs.clone()) { - if (mob instanceof Larva || mob instanceof RipperDemon) { - mob.die( cause ); - } - } - - Dungeon.level.viewDistance = 4; - if (Dungeon.hero.buff(Light.class) == null){ - Dungeon.hero.viewDistance = Dungeon.level.viewDistance; - } - - GameScene.bossSlain(); - Dungeon.level.unseal(); - super.die( cause ); - - yell( Messages.get(this, "defeated") ); - } - - @Override - public void notice() { - if (!BossHealthBar.isAssigned()) { - BossHealthBar.assignBoss(this); - yell(Messages.get(this, "notice")); - for (Char ch : Actor.chars()){ - if (ch instanceof DriedRose.GhostHero){ - ((DriedRose.GhostHero) ch).sayBoss(); - } - } - if (phase == 0) { - phase = 1; - summonCooldown = Random.NormalFloat(MIN_SUMMON_CD, MAX_SUMMON_CD); - abilityCooldown = Random.NormalFloat(MIN_ABILITY_CD, MAX_ABILITY_CD); - } - } - } - - @Override - public String description() { - String desc = super.description(); - - if (Statistics.spawnersAlive > 0){ - desc += "\n\n" + Messages.get(this, "desc_spawners"); - } - - return desc; - } - - { - immunities.add( Terror.class ); - immunities.add( Amok.class ); - immunities.add( Charm.class ); - immunities.add( Sleep.class ); - immunities.add( Vertigo.class ); - immunities.add( Frost.class ); - immunities.add( Paralysis.class ); - } - - private static final String PHASE = "phase"; - - private static final String ABILITY_CD = "ability_cd"; - private static final String SUMMON_CD = "summon_cd"; - - private static final String FIST_SUMMONS = "fist_summons"; - private static final String REGULAR_SUMMONS = "regular_summons"; - - private static final String TARGETED_CELLS = "targeted_cells"; - - @Override - public void storeInBundle(Bundle bundle) { - super.storeInBundle(bundle); - bundle.put(PHASE, phase); - - bundle.put(ABILITY_CD, abilityCooldown); - bundle.put(SUMMON_CD, summonCooldown); - - bundle.put(FIST_SUMMONS, fistSummons.toArray(new Class[0])); - bundle.put(REGULAR_SUMMONS, regularSummons.toArray(new Class[0])); - - int[] bundleArr = new int[targetedCells.size()]; - for (int i = 0; i < targetedCells.size(); i++){ - bundleArr[i] = targetedCells.get(i); - } - bundle.put(TARGETED_CELLS, bundleArr); - } - - @Override - public void restoreFromBundle(Bundle bundle) { - super.restoreFromBundle(bundle); - phase = bundle.getInt(PHASE); - if (phase != 0) BossHealthBar.assignBoss(this); - - abilityCooldown = bundle.getFloat(ABILITY_CD); - summonCooldown = bundle.getFloat(SUMMON_CD); - - fistSummons.clear(); - Collections.addAll(fistSummons, bundle.getClassArray(FIST_SUMMONS)); - regularSummons.clear(); - Collections.addAll(regularSummons, bundle.getClassArray(REGULAR_SUMMONS)); - - for (int i : bundle.getIntArray(TARGETED_CELLS)){ - targetedCells.add(i); - } - } - - public static class Larva extends Mob { - - { - spriteClass = LarvaSprite.class; - - HP = HT = 25; - defenseSkill = 12; - viewDistance = Light.DISTANCE; - - EXP = 5; - maxLvl = -2; - - properties.add(Property.DEMONIC); - - } - - @Override - public int attackSkill( Char target ) { - return 30; - } - - @Override - public int damageRoll(){ - return Random.NormalIntRange(15, 25); - } - - @Override - public int drRoll() { - return Random.NormalIntRange(0, 4); - } - - @Override - public void damage(int dmg, Object src){ - if(Dungeon.level.distance(pos, Dungeon.level.exit + Dungeon.level.width()*3)<=4){ - dmg = dmg/10; - } - super.damage(dmg, src); - } - - } - - //used so death to yog's ripper demons have their own rankings description and are more aggro - public static class YogRipper extends RipperDemon { - } - - public static class YogBackgroundBeam extends BackgroundBeamCounter{ - @Override - protected void beamHit(Ballistica beam){ - - for (int p : beam.path) { - if (Dungeon.level.flamable[p]) { - Dungeon.level.destroy( p ); - GameScene.updateMap( p ); - } - Char ch = findChar(p); - if (ch != null) { - if (ch.alignment != Char.Alignment.ENEMY) { - Buff.affect(ch, Degrade.class, 4f); - ch.damage(Random.IntRange(10, 13), YogHard.class); - if (ch == Dungeon.hero && !ch.isAlive()) { - Dungeon.fail(getClass()); - } - } - } - } - } - } - -} diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/custom/ch/boss/YogReal.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/custom/ch/boss/YogReal.java index 00a3c17..5e22170 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/custom/ch/boss/YogReal.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/custom/ch/boss/YogReal.java @@ -297,7 +297,7 @@ private void actDestroy(){ } GLog.w(M.L(this, "destroy_tile")); Camera.main.shake(2f, 1f); - ++destroyed; + destroyed = Math.min(3, ++destroyed); } } @@ -371,6 +371,10 @@ public void damage(int damage, Object src){ summonCD -= dmgTaken / 8f + 1f; } + if(HP<=600){ + BossHealthBar.bleed(true); + } + LockedFloor lock = Dungeon.hero.buff(LockedFloor.class); if (lock != null) lock.addTime(dmgTaken); @@ -474,6 +478,7 @@ public void restoreFromBundle(Bundle b){ Collections.addAll(regularSummons, b.getClassArray("REGULAR_SUMMONS")); if (!BossHealthBar.isAssigned()) { BossHealthBar.assignBoss(this); + if (HP < 600) BossHealthBar.bleed(true); } } @@ -665,7 +670,7 @@ public int onHitProc(Char ch) { if(ch == Dungeon.hero){ if(!ch.isAlive()) Dungeon.fail(getClass()); } - return 0; + return 1; } @Override @@ -753,15 +758,15 @@ public void call() { @Override public int onHitProc(Char ch) { - if(ch.alignment == Alignment.ENEMY) return 0; - ch.damage( Random.Int(40, 70), YogReal.class ); - ch.sprite.centerEmitter().burst( RainbowParticle.BURST, Random.Int(20, 35) ); + if (ch.alignment == Alignment.ENEMY) return 0; + ch.damage(Random.Int(40, 70), YogReal.class); + ch.sprite.centerEmitter().burst(RainbowParticle.BURST, Random.Int(20, 35)); ch.sprite.flash(); Buff.affect(ch, Blindness.class, 50f); - if(ch == Dungeon.hero){ - if(!ch.isAlive()) Dungeon.fail(getClass()); + if (ch == Dungeon.hero) { + if (!ch.isAlive()) Dungeon.fail(getClass()); } - return 0; + return 1; } @Override diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/custom/ch/mob/cave/BatH.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/custom/ch/mob/cave/BatH.java index c98fd8a..f057819 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/custom/ch/mob/cave/BatH.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/custom/ch/mob/cave/BatH.java @@ -4,11 +4,17 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.Actor; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Amok; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Corruption; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Bat; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob; import com.shatteredpixel.shatteredpixeldungeon.custom.utils.RangeMap; import com.shatteredpixel.shatteredpixeldungeon.custom.visuals.DelayerEffect; +import com.shatteredpixel.shatteredpixeldungeon.effects.Speck; +import com.shatteredpixel.shatteredpixeldungeon.items.rings.Ring; +import com.shatteredpixel.shatteredpixeldungeon.items.rings.RingOfEvasion; +import com.shatteredpixel.shatteredpixeldungeon.items.rings.RingOfHaste; +import com.shatteredpixel.shatteredpixeldungeon.items.rings.RingOfWealth; import com.shatteredpixel.shatteredpixeldungeon.items.wands.Wand; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.MeleeWeapon; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.MissileWeapon; @@ -27,6 +33,9 @@ public class BatH extends Bat { HT=HP=32; HUNTING = new Hunting(); } + { + immunities.add(Corruption.class); + } @Override public float attackDelay(){ @@ -75,6 +84,19 @@ public int defenseSkill(Char enemy){ return Math.round(super.defenseSkill(enemy) * availableCells / 3f); } + @Override + public int attackProc(Char enemy, int damage){ + //compensate + int reg = Math.min( 4, HT - HP ); + + if (reg > 0) { + HP += reg; + sprite.emitter().burst( Speck.factory( Speck.HEALING ), 1 ); + } + + return super.attackProc( enemy, damage ); + } + protected boolean avoidDamage(int threshold){ ArrayList toEvade = new ArrayList<>(); for(int i: PathFinder.NEIGHBOURS8){ @@ -156,6 +178,24 @@ protected void updateFOV(){ } + @Override + public void rollToDropLoot(){ + if (Dungeon.hero.lvl <= maxLvl + 2){ + float chance = 0.02f; + chance *= RingOfWealth.dropChanceMultiplier( Dungeon.hero ); + chance = Math.min(0.06f, chance); + if(Random.Float()0?1.2f:1f)); } @Override @@ -191,12 +191,29 @@ public int attackProc(Char enemy, int damage){ if(thrownLeft >=1){ Buff.affect(enemy, Cripple.class, Cripple.DURATION); }else if(thrownLeft == 0){ - Buff.affect(enemy, Bleeding.class).set(damage*0.6f); + Buff.affect(enemy, Bleeding.class).set(damage*0.8f); } } return super.attackProc(enemy, damage); } + @Override + public void rollToDropLoot(){ + if (Dungeon.hero.lvl <= maxLvl + 2){ + float chance = 0.02f; + chance *= RingOfWealth.dropChanceMultiplier( Dungeon.hero ); + chance = Math.min(0.04f, chance); + if(Random.Float() 24){ice = 0; lightning = 0;} return zap; } + + @Override + public void rollToDropLoot(){ + if (Dungeon.hero.lvl <= maxLvl + 2){ + float chance = 0.02f; + chance *= RingOfWealth.dropChanceMultiplier( Dungeon.hero ); + chance = Math.min(0.05f, chance); + if(Random.Float()6){ hitsForSkill = 0; Hero hero = Dungeon.hero; - BallisticaFloat ba = new BallisticaFloat(enemy.pos, GME.angle(pos, enemy.pos)+ Random.Float(-22.5f, 22.5f), 8, BallisticaFloat.PROJECTILE); - Actor.add(new Pushing(hero, hero.pos, ba.collisionPosI, new Callback() { - @Override - public void call() { - Camera.main.shake(3f, 0.5f); - Buff.affect(hero, Blindness.class, 6f); - Buff.affect(hero, Vertigo.class, 8f); - Buff.affect(hero, Cripple.class, 8f); - hero.sprite.centerEmitter().burst(Speck.factory(Speck.STAR), 10); - hero.pos = ba.collisionPosI; - Dungeon.level.occupyCell(hero); + //cannot hitback rooted enemy! + if(hero.buff(Roots.class)==null) { + BallisticaFloat ba = new BallisticaFloat(enemy.pos, GME.angle(pos, enemy.pos) + Random.Float(-22.5f, 22.5f), 8, BallisticaFloat.PROJECTILE); + Actor.add(new Pushing(hero, hero.pos, ba.collisionPosI, new Callback() { + @Override + public void call() { + Camera.main.shake(3f, 0.5f); + Buff.affect(hero, Blindness.class, 6f); + Buff.affect(hero, Vertigo.class, 8f); + Buff.affect(hero, Cripple.class, 8f); + hero.spendAndNext(TICK); + + hero.sprite.centerEmitter().burst(Speck.factory(Speck.STAR), 10); + hero.pos = ba.collisionPosI; + Dungeon.level.occupyCell(hero); + + } + })); + KindOfWeapon wep = hero.belongings.weapon; + if (wep != null && !wep.cursed && !(wep instanceof Gloves || wep instanceof Gauntlet)) { + Dungeon.level.drop(wep, hero.pos).sprite.drop(); + hero.belongings.weapon = null; + Dungeon.quickslot.convertToPlaceholder(wep); + Item.updateQuickslot(); } - })); - KindOfWeapon wep = hero.belongings.weapon; - if(wep != null && !wep.cursed && !(wep instanceof Gloves || wep instanceof Gauntlet)){ - Dungeon.level.drop(wep, hero.pos).sprite.drop(); - hero.belongings.weapon = null; - Dungeon.quickslot.convertToPlaceholder(wep); - Item.updateQuickslot(); - } - GLog.n(M.L(this, "hard_strike")); - spend(attackDelay()); + + GLog.n(M.L(this, "hard_strike")); + spend(attackDelay()); + } } return super.attackProc(enemy, damage); } @@ -91,4 +107,22 @@ public void restoreFromBundle(Bundle b){ super.restoreFromBundle(b); hitsForSkill = b.getInt("hitsForSkill"); } + + @Override + public void rollToDropLoot(){ + if (Dungeon.hero.lvl <= maxLvl + 2){ + float chance = 0.2f; + chance *= RingOfWealth.dropChanceMultiplier( Dungeon.hero ); + chance = Math.min(0.4f, chance); + if(Random.Float()= 0; --i) { + if (Generator.Category.ARTIFACT.classes[i] == EtherealChains.class) { + index = i; + break; + } + } + if (Generator.Category.ARTIFACT.probs[index] > 0.01f) { + Dungeon.level.drop(new EtherealChains(), pos).sprite.drop(); + Generator.removeArtifact(EtherealChains.class); + } + } + } + //each drop makes future drops 1/2 as likely // so loot chance looks like: 1/5, 1/10, 1/20, 1/40, etc. lootChance *= Math.pow(1/2f, Dungeon.LimitedDrops.GUARD_ARM.count); @@ -181,14 +206,4 @@ && chain(enemy.pos)){ } } - - @Override - public String name(){ - return M.L(Guard.class,"name"); - } - - @Override - public String description(){ - return M.L(Guard.class, "desc"); - } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/custom/ch/mob/prison/SkeletonH.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/custom/ch/mob/prison/SkeletonH.java index 1746b16..67426c8 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/custom/ch/mob/prison/SkeletonH.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/custom/ch/mob/prison/SkeletonH.java @@ -1,6 +1,7 @@ package com.shatteredpixel.shatteredpixeldungeon.custom.ch.mob.prison; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Corruption; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Skeleton; import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter; import com.shatteredpixel.shatteredpixeldungeon.effects.MagicMissile; @@ -15,6 +16,10 @@ public class SkeletonH extends Skeleton { EXP = 7; } + { + immunities.add(Corruption.class); + } + protected int revived = 0; @Override public void die(Object cause){ diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/custom/ch/mob/prison/ThiefH.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/custom/ch/mob/prison/ThiefH.java index 4339d7a..14741e2 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/custom/ch/mob/prison/ThiefH.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/custom/ch/mob/prison/ThiefH.java @@ -3,10 +3,14 @@ import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Corruption; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Haste; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Thief; +import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfHaste; +import com.shatteredpixel.shatteredpixeldungeon.items.rings.RingOfWealth; +import com.watabou.utils.Random; public class ThiefH extends Thief { { @@ -14,6 +18,10 @@ public class ThiefH extends Thief { HT = HP = 21; } + { + immunities.add(Corruption.class); + } + @Override protected boolean canAttack(Char enemy){ if(enemy!=null && enemySeen && Dungeon.level.distance(pos, enemy.pos) < 3){ @@ -44,4 +52,18 @@ protected boolean steal( Hero hero ){ return stole; } + @Override + public void rollToDropLoot(){ + if (Dungeon.hero.lvl <= maxLvl + 2){ + float chance = 0.15f; + chance *= RingOfWealth.dropChanceMultiplier( Dungeon.hero ); + if(Random.Float() 0) { Albino white = new Albino(); white.pos = Dungeon.level.randomRespawnCell(white); - GameScene.add(white); + GameScene.add(white, 1f); white.beckon(pos); MagicMissile.boltFromChar(sprite.parent, diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/custom/ch/mob/sewer/SlimeH.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/custom/ch/mob/sewer/SlimeH.java index c467246..9072e22 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/custom/ch/mob/sewer/SlimeH.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/custom/ch/mob/sewer/SlimeH.java @@ -1,11 +1,15 @@ package com.shatteredpixel.shatteredpixeldungeon.custom.ch.mob.sewer; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Corruption; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Slime; import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfBlastWave; import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica; public class SlimeH extends Slime { + { + immunities.add(Corruption.class); + } @Override public int attackProc(Char enemy, int damage){ Ballistica trajectory = new Ballistica(pos, enemy.pos, Ballistica.STOP_TARGET); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/custom/ch/mob/sewer/SnakeH.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/custom/ch/mob/sewer/SnakeH.java index 0e4d7ae..0e2ace2 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/custom/ch/mob/sewer/SnakeH.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/custom/ch/mob/sewer/SnakeH.java @@ -4,10 +4,12 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Snake; public class SnakeH extends Snake { + { + immunities.add(Corruption.class); + } { HT = HP = 6; EXP = 1; - immunities.add(Corruption.class); defenseSkill = 1000; } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/custom/ch/mob/sewer/SwarmH.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/custom/ch/mob/sewer/SwarmH.java index dbce40a..5b8b098 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/custom/ch/mob/sewer/SwarmH.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/custom/ch/mob/sewer/SwarmH.java @@ -10,13 +10,12 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Healing; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Poison; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob; -import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Swarm; -import com.shatteredpixel.shatteredpixeldungeon.custom.messages.M; import com.shatteredpixel.shatteredpixeldungeon.custom.utils.RangeMap; import com.shatteredpixel.shatteredpixeldungeon.effects.Pushing; import com.shatteredpixel.shatteredpixeldungeon.items.Item; import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfHealing; import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; +import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.SwarmSprite; import com.watabou.utils.Bundle; import com.watabou.utils.Random; @@ -39,6 +38,10 @@ public class SwarmH extends Mob { lootChance = 0.1667f; //by default, see rollToDropLoot() } + { + immunities.add(Corruption.class); + } + @Override public void die(Object cause){ for(int i=1;i<4;++i) { @@ -47,7 +50,8 @@ public void die(Object cause){ Char ch = findChar(j); if(ch!=null){ if(ch.alignment == Alignment.ENEMY){ - Buff.affect(ch, Healing.class).setHeal(12-3*i, 0, 4-i); + Buff.affect(ch, Healing.class).setHeal(13-3*i, 1, 0); + ch.sprite.showStatus(CharSprite.POSITIVE, "%d",13-3*i); } } } @@ -151,14 +155,4 @@ protected Item createLoot(){ return super.createLoot(); } - @Override - public String name(){ - return M.L(Swarm.class,"name"); - } - - @Override - public String description(){ - return M.L(Swarm.class, "desc"); - } - } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/custom/ch/mob/spawner/MobList.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/custom/ch/mob/spawner/MobList.java index 22c76ac..e3da2ec 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/custom/ch/mob/spawner/MobList.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/custom/ch/mob/spawner/MobList.java @@ -1,12 +1,32 @@ package com.shatteredpixel.shatteredpixeldungeon.custom.ch.mob.spawner; +import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.DM200; +import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Ghoul; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob; +import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Necromancer; import com.shatteredpixel.shatteredpixeldungeon.custom.ch.mob.cave.BatH; +import com.shatteredpixel.shatteredpixeldungeon.custom.ch.mob.cave.BruteH; +import com.shatteredpixel.shatteredpixeldungeon.custom.ch.mob.cave.ShamanH; +import com.shatteredpixel.shatteredpixeldungeon.custom.ch.mob.cave.SpinnerH; +import com.shatteredpixel.shatteredpixeldungeon.custom.ch.mob.city.ElementalH; +import com.shatteredpixel.shatteredpixeldungeon.custom.ch.mob.city.GolemH; +import com.shatteredpixel.shatteredpixeldungeon.custom.ch.mob.city.MonkH; +import com.shatteredpixel.shatteredpixeldungeon.custom.ch.mob.city.SeniorMonkH; +import com.shatteredpixel.shatteredpixeldungeon.custom.ch.mob.city.WarlockH; +import com.shatteredpixel.shatteredpixeldungeon.custom.ch.mob.hall.EyeH; +import com.shatteredpixel.shatteredpixeldungeon.custom.ch.mob.hall.RipperH; import com.shatteredpixel.shatteredpixeldungeon.custom.ch.mob.hall.ScorpioH; +import com.shatteredpixel.shatteredpixeldungeon.custom.ch.mob.hall.SuccubusH; +import com.shatteredpixel.shatteredpixeldungeon.custom.ch.mob.prison.BanditH; +import com.shatteredpixel.shatteredpixeldungeon.custom.ch.mob.prison.DM100H; +import com.shatteredpixel.shatteredpixeldungeon.custom.ch.mob.prison.GuardH; +import com.shatteredpixel.shatteredpixeldungeon.custom.ch.mob.prison.SkeletonH; +import com.shatteredpixel.shatteredpixeldungeon.custom.ch.mob.prison.ThiefH; import com.shatteredpixel.shatteredpixeldungeon.custom.ch.mob.sewer.CrabH; import com.shatteredpixel.shatteredpixeldungeon.custom.ch.mob.sewer.GnollH; import com.shatteredpixel.shatteredpixeldungeon.custom.ch.mob.sewer.RatH; import com.shatteredpixel.shatteredpixeldungeon.custom.ch.mob.sewer.SlimeH; +import com.shatteredpixel.shatteredpixeldungeon.custom.ch.mob.sewer.SnakeH; import com.shatteredpixel.shatteredpixeldungeon.custom.ch.mob.sewer.SwarmH; import java.util.ArrayList; @@ -17,38 +37,52 @@ public class MobList { public static ArrayList> HardMobList(int depth){ switch (depth){ case 1: default: - //3x rat, 1x snake - return new ArrayList<>(Arrays.asList( - BatH.class)); + return new ArrayList<>(Arrays.asList(RatH.class, RatH.class, RatH.class, SnakeH.class)); case 2: - //2x rat, 1x snake, 2x gnoll - return new ArrayList<>(Arrays.asList(ScorpioH.class)); + return new ArrayList<>(Arrays.asList(RatH.class, RatH.class, SnakeH.class, GnollH.class, GnollH.class)); case 3: - //1x rat, 3x gnoll, 1x swarm, 1x crab - return new ArrayList<>(Arrays.asList(RatH.class, - GnollH.class, GnollH.class, GnollH.class, - SwarmH.class, - CrabH.class)); + return new ArrayList<>(Arrays.asList(RatH.class, GnollH.class, GnollH.class, GnollH.class, GnollH.class, CrabH.class, SnakeH.class)); case 4: case 5: - //1x gnoll, 1x swarm, 2x crab, 2x slime - return new ArrayList<>(Arrays.asList(GnollH.class, - SwarmH.class, - CrabH.class, CrabH.class, - SlimeH.class, SlimeH.class)); - } - } - public static void swapMobAlts(ArrayList> rotation){ - for (int i = 0; i < rotation.size(); i++) { - /* - if(Random.Int(8)==0){ - Class cl = rotation.get(i); - if(cl == RatH.class){ - cl = Albino.class; - } - rotation.set(i, cl); - } + return new ArrayList<>(Arrays.asList(CrabH.class, CrabH.class, SwarmH.class, SwarmH.class, SlimeH.class, SlimeH.class, GnollH.class)); + case 6: + return new ArrayList<>(Arrays.asList(SkeletonH.class, SkeletonH.class, SkeletonH.class, ThiefH.class, SwarmH.class)); + case 7: + return new ArrayList<>(Arrays.asList(SkeletonH.class, SkeletonH.class, ThiefH.class, ThiefH.class, GuardH.class, DM100H.class)); + case 8: + //lightning! + return new ArrayList<>(Arrays.asList(SkeletonH.class, DM100H.class, DM100H.class, DM100H.class, GuardH.class, GuardH.class, Necromancer.class)); + case 9: case 10: + //Heaven of crime!!! + return new ArrayList<>(Arrays.asList(ThiefH.class, ThiefH.class, BanditH.class, BanditH.class, GuardH.class, GuardH.class, DM100H.class, DM100H.class)); + case 11: + return new ArrayList<>(Arrays.asList(BatH.class, BatH.class, BatH.class, BruteH.class, ShamanH.random())); + case 12: + return new ArrayList<>(Arrays.asList(BatH.class, BruteH.class, BruteH.class, ShamanH.random(), ShamanH.random())); + case 13: + return new ArrayList<>(Arrays.asList(BatH.class, BruteH.class, BruteH.class, ShamanH.random(), ShamanH.random(), SpinnerH.class, DM200.class)); + case 14: case 15: + return new ArrayList<>(Arrays.asList(BatH.class, BruteH.class, ShamanH.random(), SpinnerH.class, SpinnerH.class, DM200.class)); + case 16: + //element! + return new ArrayList<>(Arrays.asList(Ghoul.class, ElementalH.random(), ElementalH.random(), ElementalH.random(), WarlockH.class)); + case 17: + //darkness! + return new ArrayList<>(Arrays.asList(Ghoul.class, ElementalH.random(), WarlockH.class, WarlockH.class, WarlockH.class)); + case 18: + return new ArrayList<>(Arrays.asList(ElementalH.random(), WarlockH.class, MonkH.class, MonkH.class, GolemH.class)); + case 19: case 20: + //face senior directly! + return new ArrayList<>(Arrays.asList(WarlockH.class, WarlockH.class, MonkH.class, MonkH.class, GolemH.class, GolemH.class, SeniorMonkH.class)); + case 21: + return new ArrayList<>(Arrays.asList(SuccubusH.class, SuccubusH.class, SuccubusH.class, EyeH.class, RipperH.class)); + case 22: + return new ArrayList<>(Arrays.asList(SuccubusH.class, EyeH.class, EyeH.class, RipperH.class)); + case 23: + return new ArrayList<>(Arrays.asList(SuccubusH.class, EyeH.class, EyeH.class, ScorpioH.class)); + case 24: case 25: + //HEAD SHOT!!! + return new ArrayList<>(Arrays.asList(SuccubusH.class, EyeH.class, EyeH.class, ScorpioH.class, ScorpioH.class, ScorpioH.class)); - */ } } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/custom/testmode/WandOfScanningBeam.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/custom/testmode/WandOfScanningBeam.java index c07fbf8..2979ca6 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/custom/testmode/WandOfScanningBeam.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/custom/testmode/WandOfScanningBeam.java @@ -64,7 +64,7 @@ public int onHitProc(Char ch) { ch.damage( damageRoll(buffedLvl()), this ); ch.sprite.centerEmitter().burst( PurpleParticle.BURST, Random.IntRange( 1, 2 ) ); ch.sprite.flash(); - return 0; + return 1; } @Override diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/custom/testmode/generator/LazyTest.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/custom/testmode/generator/LazyTest.java index e10c522..e67d772 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/custom/testmode/generator/LazyTest.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/custom/testmode/generator/LazyTest.java @@ -22,8 +22,11 @@ import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfPurity; import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfStrength; import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfToxicGas; +import com.shatteredpixel.shatteredpixeldungeon.items.potions.exotic.PotionOfCleansing; import com.shatteredpixel.shatteredpixeldungeon.items.potions.exotic.PotionOfMagicalSight; +import com.shatteredpixel.shatteredpixeldungeon.items.rings.RingOfAccuracy; import com.shatteredpixel.shatteredpixeldungeon.items.rings.RingOfElements; +import com.shatteredpixel.shatteredpixeldungeon.items.rings.RingOfWealth; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfIdentify; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfLullaby; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfMagicMapping; @@ -36,6 +39,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfTerror; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfTransmutation; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfUpgrade; +import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.exotic.ScrollOfPsionicBlast; import com.shatteredpixel.shatteredpixeldungeon.items.spells.ArcaneCatalyst; import com.shatteredpixel.shatteredpixeldungeon.items.stones.StoneOfBlast; import com.shatteredpixel.shatteredpixeldungeon.items.stones.StoneOfBlink; @@ -100,7 +104,7 @@ public void execute(Hero hero, String action){ greatsword.level(15); greatsword.identify().collect(); - new Gold().quantity(36888).doPickUp(hero); + new Gold().quantity(16777216).doPickUp(hero); new Pasty().quantity(100).collect(); @@ -114,7 +118,7 @@ public void execute(Hero hero, String action){ new Honeypot().quantity(777).collect(); - new StoneOfFlock().quantity(4444).collect(); + new StoneOfFlock().quantity(777).collect(); new Torch().quantity(777).identify().collect(); @@ -122,9 +126,9 @@ public void execute(Hero hero, String action){ new ArcaneCatalyst().quantity(100).collect(); - new StoneOfBlast().quantity(4444).collect(); + new StoneOfBlast().quantity(777).collect(); - new StoneOfBlink().quantity(4444).collect(); + new StoneOfBlink().quantity(777).collect(); new Blindweed.Seed().quantity(100).identify().collect(); new Dreamfoil.Seed().quantity(100).identify().collect(); @@ -147,6 +151,16 @@ public void execute(Hero hero, String action){ roe.level(22); roe.identify().collect(); + RingOfAccuracy roa = new RingOfAccuracy(); + roa.level(22); + roa.identify().collect(); + + RingOfWealth row = new RingOfWealth(); + row.level(22); + row.identify().collect(); + + new ScrollOfPsionicBlast().quantity(666).identify().collect(); + new PotionOfCleansing().quantity(777).identify().collect(); detach(hero.belongings.backpack); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/custom/utils/BallisticaFloat.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/custom/utils/BallisticaFloat.java index f17ec31..6a87543 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/custom/utils/BallisticaFloat.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/custom/utils/BallisticaFloat.java @@ -262,9 +262,8 @@ private PointF getCollisionPointWithBoundary(PointF from, PointF to){ //library methods, static private static final float A2P = 0.0174533f; - //We assume up is positive y but in game it is opposite. private static PointF poleToPointF(float angle, float range){ - return new PointF((float)(range*Math.cos(angle*A2P)), (float)(-range*Math.sin(angle*A2P))); + return new PointF((float)(range*Math.cos(angle*A2P)), (float)(range*Math.sin(angle*A2P))); } private static boolean isInsideMap(PointF posF){ diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/custom/visuals/effects/ScanningBeam.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/custom/visuals/effects/ScanningBeam.java index 4e38c1c..2565726 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/custom/visuals/effects/ScanningBeam.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/custom/visuals/effects/ScanningBeam.java @@ -94,8 +94,9 @@ private void judgeHit(BallisticaReal ba){ Char ch = Actor.findChar(i); if(ch != null){ if(!hasCollided.containsKey(ch.id())){ - collide.onHitProc(ch); - hasCollided.put(ch.id(), angle); + if(collide.onHitProc(ch) > 0) { + hasCollided.put(ch.id(), angle); + } } } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndChallenges.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndChallenges.java index d73531b..3a15173 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndChallenges.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndChallenges.java @@ -145,7 +145,7 @@ protected void onClick() { pos = cb.bottom(); } - content.setSize(WIDTH, (int) pos); + content.setSize(WIDTH, (int) pos + GAP*2); pane.scrollTo(0, 0);