diff --git a/core/src/main/assets/messages/actors/actors.properties b/core/src/main/assets/messages/actors/actors.properties index d6d592753..cad1b9ff9 100644 --- a/core/src/main/assets/messages/actors/actors.properties +++ b/core/src/main/assets/messages/actors/actors.properties @@ -2,18 +2,38 @@ actors.mobs.bosses.firemagicdied.name=浊焰魔女 actors.mobs.bosses.firemagicdied.desc=曾经是翼绫的护法之一,因为大火事件被地表三巨头怀疑,逃亡到了雪凛峡谷……\n\n被当时的商人领主给收养,现在,她是雪凛峡谷的守护之神…… actors.mobs.bosses.firemagicdied.go=%s,吾乃浊焰的化身,你必将受到正义的审判…… +actors.mobs.bosses.firemagicdied.notice=你的行为,必将受到惩罚! actors.mobs.bosses.firemagicdied.died=%s,你究竟是谁…… actors.mobs.bosses.firemagicdied.!!!=审判,降临! actors.mobs.bosses.firemagicdied.active=你自认为能拯救一切吗? actors.mobs.bosses.firemagicdied.died_kill=%s,你想逃去哪里呢? actors.mobs.bosses.firemagicdied.buff_all=…… -actors.mobs.bosses.firemagicdied.wave_1==打败%s,为雪凛峡谷铲除邪恶 -actors.mobs.bosses.firemagicdied.wave_2==%s,你还有两下子嘛 -actors.mobs.bosses.firemagicdied.wave_3==%s,我现在可要认真了! +actors.mobs.bosses.firemagicdied.wave_1=打败%s,为雪凛峡谷铲除邪恶 +actors.mobs.bosses.firemagicdied.wave_2=%s,你还有两下子嘛 +actors.mobs.bosses.firemagicdied.wave_3=%s,我现在可要认真了! actors.mobs.bosses.firemagicdied.defeated=%s,你确实是被她选中的人,现在,我已经接受你了! actors.mobs.bosses.firemagicdied.life=命运轮回! actors.mobs.bosses.firemagicdied.dead=死驱影熵! actors.mobs.bosses.firemagicdied.losing=…… +actors.mobs.bosses.firemagicdied.enraged=现在,你的试炼才刚刚开始! +actors.mobs.bosses.firemagicdied.rankings_desc=在莲娜的试炼中不幸消逝…… +actors.mobs.bosses.firemagicdied$yogscanhalf.name=??? +actors.mobs.bosses.firemagicdied$yogscanhalf.rankings_desc=在莲娜的试炼中不幸消逝…… + + +items.quest.backgokey.name=回溯之书 +items.quest.backgokey.desc=当你做好准备后,便要与雪凛峡谷告别了…… +items.quest.backgokey.ac_interlevel_tp=回到地牢 +items.quest.backgokey.dead=你放弃了挑战,本局你不能继续抢劫…… +items.quest.backgokey.not=回溯之书已经彻底失去了能量,尽管雪凛峡谷还有很多秘密。但现在你已经无法回头了……,这是你在那里的唯一的纪念品。 + +actors.mobs.npcs.firemagicdiednpc.name=浊焰魔女-莲娜 +actors.mobs.npcs.firemagicdiednpc.desc=曾经是翼绫的护法之一,因为大火事件被地表三巨头怀疑,逃亡到了雪凛峡谷……\n\n被当时的商人领主给收养,现在,她是雪凛峡谷的守护之神…… +actors.mobs.npcs.firemagicdiednpc.talk_1=%s,你的战斗技巧确实让我刮目相看。 +actors.mobs.npcs.firemagicdiednpc.talk_2=不过,抢劫商店这种事情,希望你下次不要再做了。 +actors.mobs.npcs.firemagicdiednpc.talk_3=对了,我记得我的姐姐冬铃在地牢里面。如果你见到了她,务必救救她…… +actors.mobs.npcs.firemagicdiednpc.talk_4=我的话已经说完了……,拿下这些礼品吧,它会让你在旅程上更加轻松的…… +actors.mobs.npcs.firemagicdiednpc.talk_5=%s,和你刚刚决斗过后,我有一点累了…… 接下来,商人领主会告诉你后续事宜…… actors.mobs.npcs.null.name=??? actors.mobs.npcs.null.desc=??? @@ -34,6 +54,10 @@ actors.mobs.npcs.nulldied.talk_r=商人领主:%s,接下来,就靠你自己了! actors.mobs.npcs.nulldied.name=商人领主 actors.mobs.npcs.nulldied.desc=雪凛峡谷的商人领主,正是他建立了商人这个势力。 +actors.mobs.npcs.nulldiedto.talk_x=不错,现在,是你尽情挑选商品的时间,全场200金币! +actors.mobs.npcs.nulldiedto.name=商人领主 +actors.mobs.npcs.nulldiedto.desc=雪凛峡谷的商人领主,正是他建立了商人这个势力。 + actors.mobs.coldgurad.name=雪凛守卫 actors.mobs.coldgurad.scorpion=给我过来! actors.mobs.coldgurad.def_verb=魔盾 @@ -52,8 +76,8 @@ actors.buffs.watersoulx.desc=水灵的祝福已经在你身上,现在你可以 actors.mobs.lb.blacksoul.name=暗影 actors.mobs.lb.blacksoul.desc=由于重生十字架的缘故,因此你再次重生了。但你先前的东西都被自己的暗影亡魂夺走了,杀死它,夺回自己的一切! -actors.mobs.bosses.crystaldiedtower.name=神秘结晶-寒冰形态 -actors.mobs.bosses.crystaldiedtower.desc_inactive=来自于雪凛峡谷商人总部的神秘结晶,据说拥有_冰_与Γ火Γ的两个形态。它会让不是属于这里的入侵者感受Γ冰火两重天的滋味Γ。\n\n当前神秘结晶尚未被激活,若激活后将持续攻击目标并施加✦寒冷✦损伤,寒冷阈值达到一定程度,目标将受到一定的✦百分比真实伤害✦ +actors.mobs.bosses.crystaldiedtower.name=神秘结晶 +actors.mobs.bosses.crystaldiedtower.desc=来自于雪凛峡谷商人总部的神秘结晶……,据说激活后十分危险! text.herostat.hunger = 饥饿 diff --git a/core/src/main/assets/messages/items/items.properties b/core/src/main/assets/messages/items/items.properties index 23f8e900e..03bb57c46 100644 --- a/core/src/main/assets/messages/items/items.properties +++ b/core/src/main/assets/messages/items/items.properties @@ -5,6 +5,7 @@ items.artifacts.wraithamulet.ac_ghost=遁入虚无 items.artifacts.wraithamulet.ac_darkkill=暗夜袭击 items.food.pasty.moon=月饼 +items.food.pasty.moonling=月饼的味道让你回味无穷,你感到十分畅快。 items.food.pasty.moon_desc=月饼象征着团圆美满,吃下这佳节诞生的产物,危险的地牢也在中秋节洋溢着快乐的气氛。中秋节快乐,%s! items.scrolls.exotic.scrollofpolymorph.name=羊化秘卷 @@ -608,6 +609,7 @@ items.artifacts.etherealchains.desc=这些巨大但轻盈的锁链散发着灵 items.artifacts.etherealchains.desc_cursed=被诅咒的锁链将自己锁在了你的身边,不断地在周围晃动,试图绊倒或绑住你。 items.artifacts.etherealchains.desc_equipped=锁链围绕在你的身边,缓慢地收集被你击败者的精神能量。每一发充能都是锁链中的一环,每一个环节都能正好延长一格。 items.artifacts.etherealchains$chainsrecharge.levelup=你的锁链变得更强大了! +items.artifacts.etherealchains.strmagic=这里奇异的魔力流抑制了锁链的能力…… items.artifacts.hornofplenty.name=丰饶之角 items.artifacts.hornofplenty.ac_snack=小吃一口 diff --git a/core/src/main/assets/messages/levels/levels.properties b/core/src/main/assets/messages/levels/levels.properties index a41e316bf..20562bce8 100644 --- a/core/src/main/assets/messages/levels/levels.properties +++ b/core/src/main/assets/messages/levels/levels.properties @@ -1,5 +1,5 @@ ###features -levels.features.chasm.chasm=深渊 +levels.features.chasm.name=深渊 levels.features.chasm.yes=是的,我知道我在做什么 levels.features.chasm.no=不,我改主意了 levels.features.chasm.jump=你确定要跳入洞口中?从这么高的地方摔下去一定很疼。 diff --git a/core/src/main/assets/messages/misc/misc.properties b/core/src/main/assets/messages/misc/misc.properties index 9fe1e36d7..b7163a1d8 100644 --- a/core/src/main/assets/messages/misc/misc.properties +++ b/core/src/main/assets/messages/misc/misc.properties @@ -112,7 +112,7 @@ challenges.champion_enemies_desc=会升级的不止你一个!\n\n・普通敌 的机率拥有特殊的精英属性。\n・精英敌人刷出时会立即醒来。\n・精英敌人免疫腐化效果。\n\n精英敌人有七种:\n_烈焰(橙色):_ 近战伤害 \ +25% 且带有点燃效果,免疫火焰,死亡时引燃周围。\n_索敌(紫色):_ 近战伤害 +25%,近战范围 +8。\n_敌法(绿色):_ 受到伤害 -25%,拥有魔法免疫。\n_巨型(蓝色):_ 受到伤害 -75%,近战范围 +1,无法进入门与过道。\n_祝福(黄色):_ 精准与躲避 +200%。\n_成长(红色):_ 精准、躲避、攻击伤害与有效生命值 +20%。每过 3 回合会再增长 1%。\n_鬼磷(天蓝色):_ 近战伤害 +65% 且带有磷火效果,免疫火焰与磷火,死亡时引燃周围。 challenges.stronger_bosses=Π梦魇Boss -challenges.stronger_bosses_desc=这项挑战让挑战 Boss 变得更有挑战性了!\n\n_粘咕:_生命值 +20%\n_-_ 水中恢复量增长,每回合恢复 6 点生命\n_-_ 爆发攻击蓄力时间由 2 回合缩短至 1 回合\n_天狗:_生命 +25%\n_-_ 第一阶段:陷阱更加致命\n_-_ 第二阶段:技能频率更高\n_DM-300:_生命 +60%\n_-_ 能量塔更坚固。\n_-_ 技能频率更高,威力也更强大\n_-_ 超载时移动速度更高\n_-_ 击败时必掉落荆棘斗篷\n_矮人国王:_生命 +50%\n_-_ 整场战斗内召唤的随从都更强大\n_-_ 第一阶段:技能与召唤频率都更高\n_-_ 第二阶段:每轮额外召唤两个随从\n_-_ 第三阶段:生命值 +100%,召唤频率更高\n_Yog-Dzewa:_\n_-_ 同时召唤两个古神之拳!\n_-_ 激光攻击伤害 +60%\n_-_ 召唤更强大的随从\n_冰雪魔女:_\n_-_生命+25%\n_-_ 水中召唤的仆从更多\n-击败时必定掉落紫金宝石护符\n_矮人大师:_\n_-_ 致命技能更加频繁\n_-_ 生命值+50%\n-击败时必定掉落自然神圣护符\n_史莱姆王:_\n_-_ 生命值+100%\n_-_ 伤害更高,速度更快\n_-_ 在开局额外召唤豺狼诡术师,巨钳螃蟹,腐臭老鼠,蚀化史莱姆\n_-_ 击败时必定掉落凝胶手套\n_DM720:_\n_-_ 获得全新技能\n_-_ 击败时必定掉落DM150控制终端[尚未完成] +challenges.stronger_bosses_desc=这项挑战让挑战 Boss 变得更有挑战性了!\n\n_粘咕:_生命值 +20%\n_-_ 水中恢复量增长,每回合恢复 6 点生命\n_-_ 爆发攻击蓄力时间由 2 回合缩短至 1 回合\n_天狗:_生命 +25%\n_-_ 第一阶段:陷阱更加致命\n_-_ 第二阶段:技能频率更高\n_DM-300:_生命 +60%\n_-_ 能量塔更坚固。\n_-_ 技能频率更高,威力也更强大\n_-_ 超载时移动速度更高\n_-_ 击败时必掉落荆棘斗篷\n_矮人国王:_生命 +50%\n_-_ 整场战斗内召唤的随从都更强大\n_-_ 第一阶段:技能与召唤频率都更高\n_-_ 第二阶段:每轮额外召唤两个随从\n_-_ 第三阶段:生命值 +100%,召唤频率更高\n_Yog-Dzewa:_\n_-_ 同时召唤两个古神之拳!\n_-_ 激光攻击伤害 +60%\n_-_ 召唤更强大的随从 actors.char.aquaphobia=你受到了来自水的伤害! challenges.pro=Δ开发者模式Δ challenges.pro_desc=注解版?\n开局_几乎是全物品_!同时,你将无法通关! @@ -139,3 +139,5 @@ dlc.bossrush_desc=被你击败过多次的首领们熟识了英雄的技能, dlc.back_go=逆流而上 dlc.back_go_desc=颠倒的一次的冒险,你能顺利离开这里吗?5大固定Boss则是在最终楼层出现。 +ld=\n_冰雪魔女:_\n_-_生命+25%\n_-_ 水中召唤的仆从更多\n-击败时必定掉落紫金宝石护符\n_矮人大师:_\n_-_ 致命技能更加频繁\n_-_ 生命值+50%\n-击败时必定掉落自然神圣护符\n_史莱姆王:_\n_-_ 生命值+100%\n_-_ 伤害更高,速度更快\n_-_ 在开局额外召唤豺狼诡术师,巨钳螃蟹,腐臭老鼠,蚀化史莱姆\n_-_ 击败时必定掉落凝胶手套\n_DM720:_\n_-_ 获得全新技能\n_-_ 击败时必定掉落DM150控制终端[尚未完成] + diff --git a/core/src/main/assets/messages/ui/ui.properties b/core/src/main/assets/messages/ui/ui.properties index 38fbc5970..a80997662 100644 --- a/core/src/main/assets/messages/ui/ui.properties +++ b/core/src/main/assets/messages/ui/ui.properties @@ -461,4 +461,6 @@ ui.changelist.mlpd.vm0_6_7_x_changes.bug_06x24=-1.修复了DM300闪退的问题\ ui.changelist.mlpd.vm0_6_7_x_changes.bug_06x25=-1.修复了DM720闪退的问题\n-2.修复了盗贼蝙蝠无限召唤的问题\n-3.修复了矮人大师召唤异常的问题\n-4.修复开发者模式降级变玩家的问题 ui.changelist.mlpd.vm0_6_7_x_changes.bug_06x26=-1.修复了影子盗贼的崩溃问题\n-2.修复了矮人大师楼层生成的问题 + +ui.changelist.mlpd.vm0_6_7_x_changes.bug_06x28=-1.修复了矮人大师的问题\n-2.修复了部分楼层的错误生成 //ui.changelist.mlpd.vm0_5_x_changes.xxx// \ No newline at end of file diff --git a/core/src/main/assets/messages/windows/windows.properties b/core/src/main/assets/messages/windows/windows.properties index 397ef76de..f19fdfff2 100644 --- a/core/src/main/assets/messages/windows/windows.properties +++ b/core/src/main/assets/messages/windows/windows.properties @@ -2,6 +2,12 @@ windows.textchallenges.seed_custom_title = 种子 windows.textchallenges.hint = 不输入即为随机种子 windows.textchallenges.delete_seed_input = 清除 +windows.wndkingshop.buy=购买 +windows.wndkingshop.cancel=取消 +windows.wndkingshop.king=商人领主 +windows.wndkingshop.select=干得漂亮,你已经让莲娜对你刮目相看。作为报答,全场200金币售价!(如果没有物品请随处走走,我补个货) +windows.wndkingshop.sellmod=出售物品 + windows.wndshopking.szo=商人领主 windows.wndshopking.ary=你已经准备好直面我们的守护神了吗? windows.wndshopking.yes=是的 @@ -354,6 +360,7 @@ windows.wndstory.new=在击败了Yog古神后,似乎一切变得平静下来 windows.wndstory.forest=300年前,一场大火让这个地牢不复存在。地牢的创始人:翼绫也不见踪影。\n\n300年后,随着地牢原住民对地牢的维修和重建,地牢渐渐的有了生机。\n特别是和矮人他们共同从300年的灾难逃出来的古神YOG,是让地牢重新振兴的核心人员。\n随着时间的推移,YOG他们有了一个疯狂的想法,并将这个想法交给了地表三巨头。\n霜落女帝当即批准该建议,并发布猎杀的悬赏令。\n然而,人人都知道亵渎她的后果,可仍然顶风作案。\n你也是参与的一员,你现在来到了地牢的入口,现在,开始你的旅途了。 windows.wndtradeitem.stole=抢劫商店 +windows.wndtradeitem.oks=进行对话 windows.wndstory.dm920=Yog-Dzewa的陨落,其实背后有太多的秘密。\nYog的后面,是一个连Yog都害怕的一个DM终极实验品,\n它是造成矮人国度堕落的元凶,它是灾难的象征!!!\n它是曾经的死灵军团的杀手锏,它是死亡的代言词!!!\n它是连Yog-Dzewa都要敬畏它三分的DM920,\n你需直面,你不可逃避,你的路途就是为此而来。\n已经没有退路,唯有放手一搏,无论它是真是假!!!\n但你明白,不击败他,死的就只能是自己!!! windows.wndgoshop.szo=地牢商人 @@ -361,6 +368,9 @@ windows.wndgoshop.ary=哦,我注意到你对我的东西蠢蠢欲动。如果 windows.wndgoshop.yes=抢劫 windows.wndgoshop.no=放弃 windows.wndgoshop.notbad=好吧,我以为你想抢劫商店的…… +windows.wndgoshop.bad=商人:%s,你选择了逃离雪凛峡谷,因此你是失败者! +windows.wndgoshop.ots=莲娜已经通过心灵感应告诉我一切了,现在这里的东西全部是你的了。\n\n不过,我要回雪凛峡谷一趟,后面的路程,我不会再次出现! +windows.wndgoshop.ok=索取 windows.wndstory.drawfmaster=庄严的大厅,死寂的环境。\n\n这里曾经是矮人王国的最大议事厅,而如今的死寂恐怖气氛却令这里显得十分诡异。\n\n并且这里似乎机关重重……\n有一个破旧不堪的石碑依稀的写着不要踏入这里,裂缝会变为地板,大将将会醒来……\n这在预示着什么? diff --git a/core/src/main/assets/music/SnowLing.ogg b/core/src/main/assets/music/SnowLing.ogg index 980cb1e60..e2afc8653 100644 Binary files a/core/src/main/assets/music/SnowLing.ogg and b/core/src/main/assets/music/SnowLing.ogg differ diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Statistics.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Statistics.java index c5184f5e5..054ed1750 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Statistics.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Statistics.java @@ -49,6 +49,10 @@ public class Statistics { public static boolean completedWithNoKilling = false; public static boolean amuletObtained = false; + + public static boolean fireGirlnoshopping = false; + + public static boolean deadshoppingdied = false; public static void reset() { @@ -71,6 +75,10 @@ public class Statistics { qualifiedForNoKilling = false; amuletObtained = false; + + fireGirlnoshopping = false; + + deadshoppingdied = false; } @@ -94,6 +102,11 @@ public class Statistics { private static final String AMULET = "amuletObtained"; + //浊焰契约 + private static final String NOSHOPPING = "fireGirlnoshopping"; + + private static final String SHOPPINGDIED = "deadshoppingdied"; + private static final String EXLEVEL = "Exlevel"; public static void storeInBundle( Bundle bundle ) { @@ -116,6 +129,10 @@ public class Statistics { bundle.put(NO_KILLING_QUALIFIED, qualifiedForNoKilling); bundle.put( AMULET, amuletObtained ); + + bundle.put( NOSHOPPING, fireGirlnoshopping ); + + bundle.put( SHOPPINGDIED, deadshoppingdied ); } public static void restoreFromBundle( Bundle bundle ) { @@ -138,6 +155,9 @@ public class Statistics { qualifiedForNoKilling = bundle.getBoolean( NO_KILLING_QUALIFIED ); amuletObtained = bundle.getBoolean( AMULET ); + + fireGirlnoshopping = bundle.getBoolean( NOSHOPPING ); + deadshoppingdied = bundle.getBoolean( SHOPPINGDIED ); } public static void preview( GamesInProgress.Info info, Bundle bundle ){ diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/ShopLimitLock.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/ShopLimitLock.java new file mode 100644 index 000000000..d6eb883cf --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/ShopLimitLock.java @@ -0,0 +1,80 @@ +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 ShopLimitLock 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 ); + } + +} + 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 6ff4c80df..024d35c15 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 @@ -1748,7 +1748,8 @@ public class Hero extends Char { ankh = i; } } - if(Dungeon.isChallenged(LIGHTBLACK)){ + + if(Dungeon.isChallenged(LIGHTBLACK)) { BlackSoul s = new BlackSoul(); s.pos = Dungeon.hero.pos; s.gold = Dungeon.gold; @@ -1759,7 +1760,9 @@ public class Hero extends Char { Buff.affect(s, DeadSoul.class); GameScene.flash(0x80FF0000); } - if (ankh != null) { + if(Statistics.fireGirlnoshopping){ + reallyDie( cause ); + } else if (ankh != null) { interrupt(); resting = false; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/HeroClass.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/HeroClass.java index e9dfa7a52..8604ac525 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/HeroClass.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/HeroClass.java @@ -56,6 +56,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.Waterskin; import com.shatteredpixel.shatteredpixeldungeon.items.armor.ClothArmor; import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.CloakOfShadows; import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.DriedRose; +import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.EtherealChains; import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.MasterThievesArmband; import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.TalismanOfForesight; import com.shatteredpixel.shatteredpixeldungeon.items.bags.BookBag; @@ -180,7 +181,7 @@ public enum HeroClass { new PotionOfPurity().quantity(45).identify().collect(); Buff.affect(hero, ChampionHero.AntiMagic.class, 1234567890f); new AlchemicalCatalyst().quantity(45).identify().collect(); - + new EtherealChains().quantity(1).identify().collect(); new ScrollOfIdentify().quantity(45).identify().collect(); new ScrollOfTransmutation().quantity(45).identify().collect(); new BeaconOfReturning().quantity(11).identify().collect(); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/MagicGirlDead.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/MagicGirlDead.java index 8a42887f6..d9d551f37 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/MagicGirlDead.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/MagicGirlDead.java @@ -155,7 +155,7 @@ public class MagicGirlDead extends Boss { for (Buff buff : hero.buffs()) { if (buff instanceof RoseShiled) { buff.detach(); - GLog.b("玫瑰结界的创始人是翼绫,你怎么敢用她的技能?/kill @e[type=RoseShiled] enemy!"); + GLog.b("玫瑰结界的创始人是翼绫,你怎么敢用她的技能?"); } if (buff instanceof HaloFireImBlue ||buff instanceof FireImbue) { buff.detach(); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/bosses/CrystalDiedTower.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/bosses/CrystalDiedTower.java index dd98922dc..7bac9d441 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/bosses/CrystalDiedTower.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/bosses/CrystalDiedTower.java @@ -20,7 +20,7 @@ public class CrystalDiedTower extends Mob { { spriteClass = IceStalSprites.class; - HP = HT = 150; + HP = HT = 1; properties.add(Property.MINIBOSS); properties.add(Property.INORGANIC); @@ -30,6 +30,14 @@ public class CrystalDiedTower extends Mob { state = HUNTING; } + @Override + public void damage( int dmg, Object src ) { + } + + @Override + public void add( Buff buff ) { + } + protected enum State{ PREPARING, AIMING, SHOOTING } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/bosses/FireMagicDied.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/bosses/FireMagicDied.java index cf191aa27..00c63a06b 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/bosses/FireMagicDied.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/bosses/FireMagicDied.java @@ -9,22 +9,18 @@ import com.shatteredpixel.shatteredpixeldungeon.Dungeon; 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.ArcaneArmor; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.BeamTowerAdbility; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Corruption; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Degrade; -import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.FireImbue; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.FlavourBuff; -import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.HaloFireImBlue; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.HalomethaneBurning; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Haste; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Healing; -import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Invisibility; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.LifeLink; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.LockedFloor; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.MagicImmune; -import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Ooze; -import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.RoseShiled; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ShopLimitLock; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.ColdGurad; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.DM100; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.FireGhost; @@ -49,7 +45,7 @@ import com.shatteredpixel.shatteredpixeldungeon.effects.particles.EnergyParticle import com.shatteredpixel.shatteredpixeldungeon.effects.particles.PurpleParticle; import com.shatteredpixel.shatteredpixeldungeon.effects.particles.ScanningBeam; import com.shatteredpixel.shatteredpixeldungeon.effects.particles.ShadowParticle; -import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.DriedRose; +import com.shatteredpixel.shatteredpixeldungeon.items.quest.BackGoKey; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfTeleportation; import com.shatteredpixel.shatteredpixeldungeon.levels.ShopBossLevel; import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica; @@ -61,6 +57,7 @@ import com.shatteredpixel.shatteredpixeldungeon.tiles.DungeonTilemap; import com.shatteredpixel.shatteredpixeldungeon.ui.BossHealthBar; import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; import com.watabou.noosa.Camera; +import com.watabou.noosa.audio.Music; import com.watabou.noosa.audio.Sample; import com.watabou.noosa.particles.Emitter; import com.watabou.utils.Bundle; @@ -88,6 +85,8 @@ public class FireMagicDied extends Mob implements Callback { properties.add(Property.ACIDIC); } + + private int pumpedUp = 0; private int healInc = 1; @@ -408,10 +407,10 @@ public class FireMagicDied extends Mob implements Callback { } } else if (phase == 2){ + if (summonSubject(2)) summonsMade++; + } else if (phase == 3 && buffs(DwarfMaster.Summoning.class).size() < 4){ actPhaseTwoSummon(); return true; - } else if (phase == 3 && buffs(DwarfMaster.Summoning.class).size() < 4){ - if (summonSubject(2)) summonsMade++; } actScanning(); if (Dungeon.level.water[pos] && HP < HT) { @@ -468,7 +467,7 @@ public class FireMagicDied extends Mob implements Callback { lastAbility = bundle.getInt( LAST_ABILITY ); wave = bundle.getInt("wavePhase2"); - if (phase == 2) properties.add(Property.IMMOVABLE); + if (phase == 3) properties.add(Property.IMMOVABLE); } @Override @@ -557,7 +556,7 @@ public class FireMagicDied extends Mob implements Callback { damage = super.attackProc( enemy, damage ); if(HP > 400){ if (Random.Int( 3 ) == 0) { - Buff.affect( enemy, Ooze.class ).set( Ooze.DURATION ); + Buff.affect( hero, HalomethaneBurning.class ).reignite( hero, 7f ); enemy.sprite.burst( 0x000000, 5 ); } } else { @@ -618,10 +617,6 @@ public class FireMagicDied extends Mob implements Callback { sprite.showStatus( CharSprite.NEGATIVE, Messages.get(this, "!!!") ); } - if(HP > 520 && pumpedUp >= 3){ - sprite.showStatus( CharSprite.NEGATIVE, Messages.get(this, "active") ); - } - spend( attackDelay() ); return true; @@ -648,10 +643,9 @@ public class FireMagicDied extends Mob implements Callback { public void damage(int dmg, Object src) { if (!BossHealthBar.isAssigned()){ BossHealthBar.assignBoss( this ); - Dungeon.level.seal(); } boolean bleeding = (HP*2 <= HT); - super.damage(dmg, src); + if ((HP*2 <= HT) && !bleeding){ BossHealthBar.bleed(true); ///sprite.showStatus(CharSprite.NEGATIVE, Messages.get(this, "enraged")); @@ -661,21 +655,20 @@ public class FireMagicDied extends Mob implements Callback { LockedFloor lock = Dungeon.hero.buff(LockedFloor.class); if (lock != null) lock.addTime(dmg*2); - if (phase == 1) { + super.damage(dmg, src); + if (phase == 1) { int dmgTaken = preHP - HP; abilityCooldown -= dmgTaken/8f; summonCooldown -= dmgTaken/8f; if (HP <= 400 && phase == 1) { - actPhaseTwoSummon(); - actScanning(); - sprite.showStatus(CharSprite.POSITIVE, Messages.get(this, "invulnerable")); + for (int i : CryStalPosition) { + Buff.append(hero, BeamTowerAdbility.class).towerPos = i; + } ScrollOfTeleportation.appear(this, ShopBossLevel.thronex); - properties.add(Property.IMMOVABLE); + sprite.centerEmitter().start( Speck.factory( Speck.SCREAM ), 0.4f, 2 ); + Sample.INSTANCE.play( Assets.Sounds.CHALLENGE ); phase = 2; - summonsMade = 0; - sprite.idle(); - Buff.affect(this, DwarfMaster.DKBarrior.class).setShield(12*25); Char enemy = (this.enemy == null ? Dungeon.hero : this.enemy); int w = Dungeon.level.width(); int dx = enemy.pos % w - pos % w; @@ -687,16 +680,23 @@ public class FireMagicDied extends Mob implements Callback { sprite.showStatus(0xff0000, Messages.get(this, "dead")); } } else if (phase == 2 && shielding() == 0 && HP <= 300) { - for (int i : CryStalPosition) { - Buff.append(hero, BeamTowerAdbility.class).towerPos = i; - } - ScrollOfTeleportation.appear(this, ShopBossLevel.throneling); - properties.remove(Property.IMMOVABLE); - sprite.centerEmitter().start( Speck.factory( Speck.SCREAM ), 0.4f, 2 ); - Sample.INSTANCE.play( Assets.Sounds.CHALLENGE ); - phase = 3; + actPhaseTwoSummon(); yell( Messages.get(this, "enraged", Dungeon.hero.name()) ); Buff.detach(this, DwarfMaster.SacrificeSubjectListener.class); + for (Buff buff : hero.buffs()) { + if (buff instanceof FireMagicDied.KingDamager) { + buff.detach(); + } + } + properties.remove(Property.IMMOVABLE); + actScanning(); + sprite.showStatus(CharSprite.POSITIVE, Messages.get(this, "invulnerable")); + ScrollOfTeleportation.appear(this, ShopBossLevel.throneling); + properties.add(Property.IMMOVABLE); + phase = 3; + summonsMade = 0; + sprite.idle(); + Buff.affect(this, DwarfMaster.DKBarrior.class).setShield(12*25); Char enemy = (this.enemy == null ? Dungeon.hero : this.enemy); int w = Dungeon.level.width(); int dx = enemy.pos % w - pos % w; @@ -706,6 +706,7 @@ public class FireMagicDied extends Mob implements Callback { Buff.affect(this, FireMagicDied.YogScanHalf.class).setPos(pos, direction); beamCD = 40 + 8 - (phase == 10 ? 38 : 0); sprite.showStatus(0xff0000, Messages.get(this, "dead")); + } else if (phase == 3 && preHP > 50 && HP <= 50){ yell( Messages.get(this, "losing") ); } @@ -721,11 +722,11 @@ public class FireMagicDied extends Mob implements Callback { public void die( Object cause ) { super.die( cause ); - + Dungeon.level.drop(new BackGoKey().quantity(1).identify(), pos).sprite.drop(); Dungeon.level.unseal(); - + Buff.affect(hero, ShopLimitLock.class).set((1), 1); for (Mob mob : (Iterable)Dungeon.level.mobs.clone()) { - if (mob != null) { + if (mob instanceof FireMagicDied.ColdGuradA || mob instanceof MolotovHuntsman ||mob instanceof Skeleton||mob instanceof CrystalDiedTower||mob instanceof DM100) { mob.die( cause ); } } @@ -746,14 +747,10 @@ public class FireMagicDied extends Mob implements Callback { @Override public void notice() { super.notice(); - if (!BossHealthBar.isAssigned()) { - BossHealthBar.assignBoss(this); - for (Char ch : Actor.chars()){ - if (ch instanceof DriedRose.GhostHero){ - ((DriedRose.GhostHero) ch).sayBoss(); - } - } - } + BossHealthBar.assignBoss(this); + Music.INSTANCE.play(Assets.BGM_FRBOSS, true); + yell( Messages.get(this, "notice") ); + //summon(); } private final String PUMPEDUP = "pumpedup"; @@ -870,7 +867,8 @@ public class FireMagicDied extends Mob implements Callback { @Override public int onHitProc(Char ch) { if(ch.alignment == Alignment.ENEMY) return 0; - ch.damage( Random.Int(10, 20), YogReal.class ); + ch.damage( Random.Int(15, 30), YogReal.class ); + Buff.affect( hero, HalomethaneBurning.class ).reignite( hero, 7f ); if(ch == Dungeon.hero){ Sample.INSTANCE.play(Assets.Sounds.BLAST, Random.Float(1.1f, 1.5f)); if(!ch.isAlive()) Dungeon.fail(getClass()); @@ -889,7 +887,7 @@ public class FireMagicDied extends Mob implements Callback { } } - public static class Summoning extends Buff { + public class Summoning extends Buff { private int delay; private int pos; @@ -905,20 +903,6 @@ public class FireMagicDied extends Mob implements Callback { public boolean act() { delay--; if (delay <= 0){ - for (Buff buff : hero.buffs()) { - if (buff instanceof RoseShiled) { - buff.detach(); - GLog.b(Messages.get(FireMagicDied.class,"no_rose")); - } - if (buff instanceof HaloFireImBlue ||buff instanceof FireImbue) { - buff.detach(); - GLog.w(Messages.get(FireMagicDied.class,"no_fire")); - } - if (buff instanceof Invisibility) { - buff.detach(); - GLog.p(Messages.get(FireMagicDied.class,"no_inst")); - } - } if (summon == FireMagicDied.ColdGuradA.class){ particles.burst(ShadowParticle.CURSE, 10); Sample.INSTANCE.play(Assets.Sounds.CURSED); @@ -953,9 +937,7 @@ public class FireMagicDied extends Mob implements Callback { Buff.affect(m, FireMagicDied.KingDamager.class); } } else { - Char ch = Actor.findChar(pos); - ch.damage(Random.NormalIntRange(20, 40), summon); - if (((FireMagicDied)target).phase == 2){ + if (((FireMagicDied)target).phase == 2 && HP > 300){ target.damage(20, new FireMagicDied.KingDamager()); } } @@ -1021,11 +1003,11 @@ public class FireMagicDied extends Mob implements Callback { //4th summon is always a monk or warlock, otherwise ghoul //4 1n 13 are monks/warlocks if (summonsMade % 13 == 7 || summonsMade % 13 == 11) { - return summonSubject(delay, DwarfMaster.DKMonk.class ); + return summonSubject(delay, FireMagicDied.ColdGuradA.class ); } else if(summonsMade % 13 == 5 || summonsMade % 13 == 12) { - return summonSubject(delay, DwarfMaster.DKWarlock.class); + return summonSubject(delay, FireMagicDied.ColdGuradB.class); }else{ - return summonSubject(delay, DwarfMaster.DKGhoul.class); + return summonSubject(delay, FireMagicDied.ColdGuradC.class); } } @@ -1050,16 +1032,21 @@ public class FireMagicDied extends Mob implements Callback { Buff.affect(this, FireMagicDied.YogScanHalf.class).setPos(pos, direction); beamCD = 20 + 8 - (phase == 5 ? 19 : 0); ScrollOfTeleportation.appear(hero, ShopBossLevel.throne); + GLog.n(Messages.get(this, "active") ); spend(TICK*12); }else if(wave == 2){ summonSubject(1, FireMagicDied.ColdGuradA.class); summonSubject(2, FireMagicDied.ColdGuradC.class); summonSubject(6, FireMagicDied.ColdGuradA.class); summonSubject(6, FireMagicDied.ColdGuradA.class); + ScrollOfTeleportation.appear(hero, ShopBossLevel.throne); + GLog.n(Messages.get(this, "active") ); ++wave; spend(TICK*15); }else if(wave == 3){ yell(Messages.get(this, "wave_2",Dungeon.hero.name())); + ScrollOfTeleportation.appear(hero, ShopBossLevel.throne); + GLog.n(Messages.get(this, "active") ); //Eye.spawnAround(pos); summonSubject(1, FireMagicDied.ColdGuradA.class); summonSubject(2, FireMagicDied.ColdGuradC.class); @@ -1085,11 +1072,12 @@ public class FireMagicDied extends Mob implements Callback { spend(TICK*14); }else if(wave == 5){ yell(Messages.get(this,"wave_3",Dungeon.hero.name())); + ScrollOfTeleportation.appear(hero, ShopBossLevel.throne); + GLog.n(Messages.get(this, "active") ); summonSubject(2, FireMagicDied.ColdGuradA.class); summonSubject(2, FireMagicDied.ColdGuradB.class); summonSubject(2, FireMagicDied.ColdGuradC.class); Buff.affect(this, Haste.class, 5f); - Buff.affect(this, Healing.class).setHeal(20, 0f, 6); Char enemy = (this.enemy == null ? Dungeon.hero : this.enemy); int w = Dungeon.level.width(); int dx = enemy.pos % w - pos % w; @@ -1106,10 +1094,6 @@ public class FireMagicDied extends Mob implements Callback { summonSubject(3, FireMagicDied.ColdGuradB.class); summonSubject(3, FireMagicDied.ColdGuradB.class); summonSubject(2, FireMagicDied.ColdGuradC.class); - Buff.affect(this, RoseShiled.class, 20f); - Buff.affect(this, Haste.class, 5f); - Buff.affect(this, ArcaneArmor.class).set(Dungeon.hero.lvl + 10, 10); - Buff.affect(this, Healing.class).setHeal(20, 0f, 6); ++wave; spend(TICK*12); }else{ @@ -1182,7 +1166,7 @@ public class FireMagicDied extends Mob implements Callback { } } - public static class ColdGuradC extends MolotovHuntsman { + public static class ColdGuradC extends SRPDICLRPRO { { state = HUNTING; immunities.add(Corruption.class); @@ -1219,11 +1203,11 @@ public class FireMagicDied extends Mob implements Callback { public void detach() { super.detach(); for (Mob m : Dungeon.level.mobs.toArray(new Mob[0])){ - if (m instanceof FireMagicDied){ - m.damage(20, this); - } + if (m instanceof FireMagicDied ){ + m.damage(20, this); + } + } } - } } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/FireMagicDiedNPC.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/FireMagicDiedNPC.java new file mode 100644 index 000000000..386adce99 --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/FireMagicDiedNPC.java @@ -0,0 +1,58 @@ +package com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs; + +import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.hero; + +import com.shatteredpixel.shatteredpixeldungeon.Dungeon; +import com.shatteredpixel.shatteredpixeldungeon.actors.Char; +import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; +import com.shatteredpixel.shatteredpixeldungeon.sprites.FireMagicGirlSprite; +import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; +import com.shatteredpixel.shatteredpixeldungeon.windows.WndQuest; +import com.watabou.utils.Bundle; + +import java.util.ArrayList; + +public class FireMagicDiedNPC extends NTNPC { + + private static final String FIRST = "first"; + private boolean xfirst=true; + + @Override + public void storeInBundle(Bundle bundle) { + super.storeInBundle(bundle); + bundle.put(FIRST, xfirst); + } + + @Override + public void restoreFromBundle(Bundle bundle) { + super.restoreFromBundle(bundle); + xfirst = bundle.getBoolean(FIRST); + } + + @Override + public boolean interact(Char c) { + sprite.turnTo( pos, hero.pos ); + if(xfirst){ + WndQuest.chating(this,chat); + xfirst=false; + }else { + GLog.n( Messages.get(FireMagicDiedNPC.class, "talk_5", Dungeon.hero.name()) ); + //Buff.affect(hero, TestDwarfMasterLock.class).set((1), 1); + } + return true; + } + + { + spriteClass = FireMagicGirlSprite.class; + + chat = new ArrayList() { + { + add(Messages.get(FireMagicDiedNPC.class, "talk_1", Dungeon.hero.name())); + add(Messages.get(FireMagicDiedNPC.class, "talk_2")); + add(Messages.get(FireMagicDiedNPC.class, "talk_3")); + add(Messages.get(FireMagicDiedNPC.class, "talk_4")); + } + }; + + } +} diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/NullDiedTO.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/NullDiedTO.java new file mode 100644 index 000000000..a76d3fa77 --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/NullDiedTO.java @@ -0,0 +1,125 @@ +package com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs; + +import com.shatteredpixel.shatteredpixeldungeon.Assets; +import com.shatteredpixel.shatteredpixeldungeon.Dungeon; +import com.shatteredpixel.shatteredpixeldungeon.actors.Char; +import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter; +import com.shatteredpixel.shatteredpixeldungeon.effects.particles.EnergyParticle; +import com.shatteredpixel.shatteredpixeldungeon.effects.particles.SnowParticle; +import com.shatteredpixel.shatteredpixeldungeon.items.Generator; +import com.shatteredpixel.shatteredpixeldungeon.items.Item; +import com.shatteredpixel.shatteredpixeldungeon.items.bombs.Bomb; +import com.shatteredpixel.shatteredpixeldungeon.items.bombs.Firebomb; +import com.shatteredpixel.shatteredpixeldungeon.items.bombs.FrostBomb; +import com.shatteredpixel.shatteredpixeldungeon.items.food.Food; +import com.shatteredpixel.shatteredpixeldungeon.items.food.MeatPie; +import com.shatteredpixel.shatteredpixeldungeon.items.food.Pasty; +import com.shatteredpixel.shatteredpixeldungeon.items.potions.Potion; +import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfHaste; +import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfHealing; +import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.Scroll; +import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfIdentify; +import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfRemoveCurse; +import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; +import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; +import com.shatteredpixel.shatteredpixeldungeon.sprites.ShopkKingSprite; +import com.shatteredpixel.shatteredpixeldungeon.windows.WndKingShop; +import com.shatteredpixel.shatteredpixeldungeon.windows.WndQuest; +import com.watabou.noosa.Game; +import com.watabou.noosa.audio.Music; +import com.watabou.utils.Bundle; +import com.watabou.utils.Callback; + +import java.util.ArrayList; + +public class NullDiedTO extends NTNPC { + + private static final String FIRST = "first"; + private boolean first=true; + @Override + public void storeInBundle(Bundle bundle) { + super.storeInBundle(bundle); + bundle.put(FIRST, first); + } + + @Override + public void restoreFromBundle(Bundle bundle) { + super.restoreFromBundle(bundle); + first = bundle.getBoolean(FIRST); + } + + public void flee() { + destroy(); + Dungeon.level.seal(); + Music.INSTANCE.play(Assets.BGM_FRBOSS, true); + GameScene.flash(0x8000FFFF); + sprite.killAndErase(); + CellEmitter.get( pos ).burst(SnowParticle.FACTORY, 6 ); + CellEmitter.get( pos ).burst(EnergyParticle.FACTORY, 6 ); + } + + + protected boolean act() { + sprite.turnTo( pos, Dungeon.hero.pos ); + spend( TICK ); + + shop6 = Generator.randomUsingDefaults( Generator.Category.ARMOR ); + shop5 = Generator.randomUsingDefaults( Generator.Category.RING ); + shop4 = new MeatPie(); + shop3 = new Pasty(); + shop2 = new ScrollOfIdentify(); + shop1 = new PotionOfHealing(); + + shop7 = new PotionOfHaste(); + shop8 = new ScrollOfRemoveCurse(); + shop9 = Generator.randomUsingDefaults( Generator.Category.WEP_T5 ); + shop10 = Generator.randomUsingDefaults( Generator.Category.WEP_T3 ); + shop11 = (Bomb) new Firebomb().quantity(1); + shop12 = (Bomb) new FrostBomb().quantity(1); + throwItem(); + return NullDiedTO.super.act(); + } + + public static Potion shop1; + public static Scroll shop2; + public static Food shop3; + public static Food shop4; + public static Item shop5; + public static Item shop6; + + public static Potion shop7; + public static Scroll shop8; + public static Item shop9; + public static Item shop10; + public static Bomb shop11; + public static Bomb shop12; + + @Override + public boolean interact(Char c) { + sprite.turnTo( pos, Dungeon.hero.pos ); + if(first){ + WndQuest.chating(this,chat); + first=false; + }else { + Game.runOnRenderThread(new Callback() { + @Override + public void call() { + GameScene.show(new WndKingShop()); + } + }); + + } + return true; + } + + { + spriteClass = ShopkKingSprite.class; + + chat = new ArrayList() { + { + add(Messages.get(NullDiedTO.class, "talk_x")); + } + }; + + } +} diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Shopkeeper.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Shopkeeper.java index 87e3409de..289d0a0da 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Shopkeeper.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Shopkeeper.java @@ -23,17 +23,8 @@ package com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs; import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.hero; -import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; -import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Blindness; -import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; -import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Burning; -import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ChampionEnemy; -import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob; -import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.MoloHR; -import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.ShopGuard; -import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.ShopGuardEye; import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter; import com.shatteredpixel.shatteredpixeldungeon.effects.particles.ElmoParticle; import com.shatteredpixel.shatteredpixeldungeon.items.Heap; @@ -46,11 +37,8 @@ import com.shatteredpixel.shatteredpixeldungeon.sprites.ShopkeeperSprite; import com.shatteredpixel.shatteredpixeldungeon.windows.WndBag; import com.shatteredpixel.shatteredpixeldungeon.windows.WndTradeItem; import com.watabou.noosa.Game; -import com.watabou.noosa.audio.Music; -import com.watabou.noosa.audio.Sample; import com.watabou.utils.Bundle; import com.watabou.utils.Callback; -import com.watabou.utils.Random; public class Shopkeeper extends NPC { @@ -155,53 +143,8 @@ public class Shopkeeper extends NPC { public void flee() { destroy(); CellEmitter.get(pos).burst(ElmoParticle.FACTORY, 6); - Sample.INSTANCE.play(Assets.Sounds.ALERT); - Music.INSTANCE.play(Assets.RUN, true); hero.sprite.burst(15597568, 9); sprite.killAndErase(); - Buff.prolong(Dungeon.hero, Blindness.class, Blindness.DURATION * 4f); - GameScene.flash(0x80FFFFFF); - Buff.affect(hero, Burning.class).reignite(hero, 15f); - Dungeon.level.seal(); - Mob moa = new MoloHR(); - moa.pos = pos; - GameScene.add(moa); - yell(Messages.get(this, "arise")); - new ShopGuardEye().spawnAround(pos); - new ShopGuard().spawnAround(pos); - Buff.affect(moa, ChampionEnemy.Growing.class); - Buff.affect(moa, ChampionEnemy.Projecting.class); - Buff.affect(moa, ChampionEnemy.AntiMagic.class); - Buff.affect(moa, ChampionEnemy.Giant.class); - Buff.affect(moa, ChampionEnemy.Blessed.class); - Buff.affect(moa, ChampionEnemy.Halo.class); - for (Mob mob : Dungeon.level.mobs) { - switch (Random.Int(7)) { - case 0: - default: - Buff.affect(mob, ChampionEnemy.Blazing.class); - break; - case 1: - Buff.affect(mob, ChampionEnemy.Projecting.class); - break; - case 2: - Buff.affect(mob, ChampionEnemy.AntiMagic.class); - break; - case 3: - Buff.affect(mob, ChampionEnemy.Giant.class); - break; - case 4: - Buff.affect(mob, ChampionEnemy.Blessed.class); - break; - case 5: - Buff.affect(mob, ChampionEnemy.Growing.class); - break; - case 6: - Buff.affect(mob, ChampionEnemy.Halo.class); - break; - } - } - yell(Messages.get(this, "dead")); } private DriedRose.GhostHero ghost = null; public void destroy() { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/custom/testmode/LevelTeleporter.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/custom/testmode/LevelTeleporter.java index 06b6775f8..a2f33000f 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/custom/testmode/LevelTeleporter.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/custom/testmode/LevelTeleporter.java @@ -145,7 +145,7 @@ public class LevelTeleporter extends TestItem { float xpos = (WIDTH - 5*BTN_SIZE - GAP*8)/2f; float ypos = 0; float each = GAP*2 + BTN_SIZE; - for(int i=1; i< Constants.MAX_DEPTH; ++i){ + for(int i=0; i< Constants.MAX_DEPTH; ++i){ int column = i % 5; int row = i / 5; final int j = i+1; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/EtherealChains.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/EtherealChains.java index 56b838218..724a09144 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/EtherealChains.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/EtherealChains.java @@ -39,7 +39,6 @@ import com.shatteredpixel.shatteredpixeldungeon.scenes.CellSelector; import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; import com.shatteredpixel.shatteredpixeldungeon.tiles.DungeonTilemap; -import com.shatteredpixel.shatteredpixeldungeon.ui.QuickSlotButton; import com.shatteredpixel.shatteredpixeldungeon.utils.BArray; import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; import com.watabou.noosa.audio.Sample; @@ -97,7 +96,9 @@ public class EtherealChains extends Artifact { } else if (cursed) { GLog.w( Messages.get(this, "cursed") ); usesTargeting = false; - + } else if (Dungeon.depth < 0) { + GLog.w( Messages.get(this, "strmagic") ); + usesTargeting = false; } else { usesTargeting = true; GameScene.selectCell(caster); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/food/Pasty.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/food/Pasty.java index f4d7208f8..0b4f2ade6 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/food/Pasty.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/food/Pasty.java @@ -23,6 +23,7 @@ package com.shatteredpixel.shatteredpixeldungeon.items.food; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Haste; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Healing; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Hunger; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Recharging; @@ -31,6 +32,7 @@ import com.shatteredpixel.shatteredpixeldungeon.effects.Speck; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfRecharging; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; +import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; import java.util.Calendar; @@ -123,8 +125,10 @@ public class Pasty extends Food { ScrollOfRecharging.charge( hero ); break; case ZQJ: - Buff.affect(hero, Healing.class).setHeal(10, 0f, 6); + Buff.affect(hero, Healing.class).setHeal((int) (0.2f * hero.HT + 14), 0.25f, 0); + Buff.affect(hero, Haste.class, 10f); ScrollOfRecharging.charge( hero ); + GLog.p(Messages.get(this, "moonling")); break; } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/quest/BackGoKey.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/quest/BackGoKey.java new file mode 100644 index 000000000..90c3c66c1 --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/quest/BackGoKey.java @@ -0,0 +1,269 @@ +package com.shatteredpixel.shatteredpixeldungeon.items.quest; + +import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.hero; + +import com.shatteredpixel.shatteredpixeldungeon.Assets; +import com.shatteredpixel.shatteredpixeldungeon.Chrome; +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.Buff; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.LockedFloor; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ShopLimitLock; +import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; +import com.shatteredpixel.shatteredpixeldungeon.custom.messages.M; +import com.shatteredpixel.shatteredpixeldungeon.custom.testmode.LevelTeleporter; +import com.shatteredpixel.shatteredpixeldungeon.custom.testmode.TestItem; +import com.shatteredpixel.shatteredpixeldungeon.custom.utils.Constants; +import com.shatteredpixel.shatteredpixeldungeon.effects.Speck; +import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.TimekeepersHourglass; +import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfTeleportation; +import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; +import com.shatteredpixel.shatteredpixeldungeon.plants.Swiftthistle; +import com.shatteredpixel.shatteredpixeldungeon.scenes.CellSelector; +import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; +import com.shatteredpixel.shatteredpixeldungeon.scenes.InterlevelScene; +import com.shatteredpixel.shatteredpixeldungeon.scenes.PixelScene; +import com.shatteredpixel.shatteredpixeldungeon.sprites.HeroSprite; +import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; +import com.shatteredpixel.shatteredpixeldungeon.ui.Icons; +import com.shatteredpixel.shatteredpixeldungeon.ui.RenderedTextBlock; +import com.shatteredpixel.shatteredpixeldungeon.ui.ScrollPane; +import com.shatteredpixel.shatteredpixeldungeon.ui.StyledButton; +import com.shatteredpixel.shatteredpixeldungeon.ui.Window; +import com.shatteredpixel.shatteredpixeldungeon.utils.BArray; +import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; +import com.watabou.noosa.Game; +import com.watabou.noosa.audio.Sample; +import com.watabou.noosa.tweeners.AlphaTweener; +import com.watabou.noosa.ui.Component; +import com.watabou.utils.PathFinder; + +import java.util.ArrayList; + +public class BackGoKey extends TestItem { + { + image = ItemSpriteSheet.DG20; + defaultAction = AC_INTER_TP; + changeDefAct = true; + } + + private static final String AC_INTER_TP = "interlevel_tp"; + + @Override + public ArrayList actions(Hero hero ) { + ArrayList actions = super.actions( hero ); + actions.add(AC_INTER_TP); + return actions; + } + + @Override + public void execute( Hero hero, String action ) { + super.execute( hero, action ); + if(action.equals(AC_INTER_TP)){ + if(Dungeon.hero.buff(LockedFloor.class) != null) { + GLog.w(Messages.get(this,"cannot_send")); + return; + } else if (Statistics.deadshoppingdied) { + GLog.w(Messages.get(this,"not")); + return; + } + GameScene.show(new WndSelectLevel()); + } + } + + public static class WndSelectLevel extends Window { + private static final int WIDTH = 120; + private static final int GAP = 2; + private static final int BTN_SIZE = 16; + private static final int PANE_MAX_HEIGHT = 96; + + private int selectedLevel = 0; + private ArrayList btns = new ArrayList<>(); + private StyledButton icb; + + public WndSelectLevel(){ + super(); + resize(WIDTH, 0); + RenderedTextBlock ttl = PixelScene.renderTextBlock(8); + ttl.text(M.L(LevelTeleporter.class, "interlevel_teleport_title")); + add(ttl); + ttl.setPos(WIDTH/2f-ttl.width()/2f, GAP); + PixelScene.align(ttl); + ScrollPane sp = new ScrollPane(new Component()){ + @Override + public void onClick(float x, float y) { + super.onClick(x, y); + for(LevelTeleporter.DepthButton db: btns){ + if(db.click(x, y)){ + break; + } + } + } + }; + add(sp); + //sp.setRect(0, ttl.bottom() + GAP * 2, WIDTH, PANE_MAX_HEIGHT); + //GLog.i("%f", ttl.bottom() + GAP * 2); + Component content = sp.content(); + float xpos = (WIDTH - 5*BTN_SIZE - GAP*8)/2f; + float ypos = 0; + float each = GAP*2 + BTN_SIZE; + for(int i = 0; i< Constants.MAX_DEPTH; ++i){ + int column = i % 5; + int row = i / 5; + final int j = i+1; + LevelTeleporter.DepthButton db = new LevelTeleporter.DepthButton(j){ + @Override + protected void onClick() { + super.onClick(); + setSelectedLevel(j); + } + }; + db.enable(!(j > Statistics.deepestFloor)); + db.setRect(xpos + column * each, ypos + row * each, BTN_SIZE, BTN_SIZE); + PixelScene.align(db); + content.add(db); + btns.add(db); + } + + content.setSize(WIDTH, btns.get(btns.size() - 1).bottom()); + sp.setRect(0, ttl.bottom() + GAP * 2, WIDTH, Math.min(btns.get(btns.size()-1).bottom(), PANE_MAX_HEIGHT)); + + icb = new StyledButton(Chrome.Type.RED_BUTTON, M.L(LevelTeleporter.class, "interlevel_teleport_go", selectedLevel)){ + @Override + protected void onClick() { + super.onClick(); + Buff buff = hero.buff(TimekeepersHourglass.timeFreeze.class); + if (buff != null) buff.detach(); + buff = hero.buff(Swiftthistle.TimeBubble.class); + if (buff != null) buff.detach(); + InterlevelScene.mode = InterlevelScene.Mode.RETURN; + InterlevelScene.returnDepth = selectedLevel; + InterlevelScene.returnPos = -1; + Game.switchScene( InterlevelScene.class ); + //detach( hero.belongings.backpack ); + if(Dungeon.hero.buff(ShopLimitLock.class) != null) { + for (Buff buffx : hero.buffs()) { + if (buffx instanceof ShopLimitLock) { + buffx.detach(); + } + } + } else { + GLog.n(Messages.get(BackGoKey.class,"dead")); + Statistics.deadshoppingdied = true; + } + } + }; + add(icb); + icb.icon(Icons.get(Icons.DEPTH)); + icb.setRect(0, sp.bottom() + GAP * 2, WIDTH, BTN_SIZE); + setSelectedLevel(0); + + sp.scrollTo(0, 0); + + resize(WIDTH, (int) (icb.bottom())); + + sp.setPos(0, ttl.bottom() + GAP * 2); + } + + private void setSelectedLevel(int lvl){ + this.selectedLevel = lvl; + icb.text(M.L(LevelTeleporter.class, "interlevel_teleport_go", selectedLevel)); + icb.enable(selectedLevel > 0 && selectedLevel <= Constants.MAX_DEPTH); + } + } + + public static class DepthButton extends StyledButton{ + private int depth; + public DepthButton(int depth){ + super(Chrome.Type.GEM, String.valueOf(depth), 8); + this.depth = depth; + } + + @Override + protected void layout() { + super.layout(); + hotArea.width = 0; + hotArea.height = 0; + } + + public int getDepth() { + return depth; + } + + public boolean click(float x, float y){ + if(active && x > left() && x < right() && y > top() && y < bottom()){ + onClick(); + return true; + } + return false; + } + + } + + + + + + + + + + public void empoweredRead() { + + GameScene.selectCell(new CellSelector.Listener() { + @Override + public void onSelect(Integer target) { + if (target != null) { + //time isn't spent + ((HeroSprite)curUser.sprite).read(); + teleportToLocation(curUser, target); + + } + } + + @Override + public String prompt() { + return Messages.get(ScrollOfTeleportation.class, "prompt"); + } + }); + } + + public static void teleportToLocation(Hero hero, int pos){ + PathFinder.buildDistanceMap(pos, BArray.or(Dungeon.level.passable, Dungeon.level.avoid, null)); + if (Dungeon.level.avoid[pos] || !Dungeon.level.passable[pos] + || Actor.findChar(pos) != null){ + GLog.w( Messages.get(ScrollOfTeleportation.class, "cant_reach") ); + return; + } + + appear( hero, pos ); + Dungeon.level.occupyCell(hero ); + Dungeon.observe(); + GameScene.updateFog(); + + } + + public static void appear(Char ch, int pos ) { + + ch.sprite.interruptMotion(); + + if (Dungeon.level.heroFOV[pos] || Dungeon.level.heroFOV[ch.pos]){ + Sample.INSTANCE.play(Assets.Sounds.TELEPORT); + } + + ch.move( pos ); + if (ch.pos == pos) ch.sprite.place( pos ); + + if (ch.invisible == 0) { + ch.sprite.alpha( 0 ); + ch.sprite.parent.add( new AlphaTweener( ch.sprite, 1, 0.4f ) ); + } + + if (Dungeon.level.heroFOV[pos] || ch == hero ) { + ch.sprite.emitter().start(Speck.factory(Speck.LIGHT), 0.2f, 3); + } + } +} + diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/scrolls/ScrollOfTeleportation.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/scrolls/ScrollOfTeleportation.java index 9d775bbfe..067b68b23 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/scrolls/ScrollOfTeleportation.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/scrolls/ScrollOfTeleportation.java @@ -95,7 +95,7 @@ public class ScrollOfTeleportation extends Scroll { return teleportInNonRegularLevel( ch, false ); } - if (Char.hasProp(ch, Char.Property.IMMOVABLE)){ + if (Char.hasProp(ch, Char.Property.IMMOVABLE)|| Dungeon.depth < 0){ GLog.w( Messages.get(ScrollOfTeleportation.class, "no_tele") ); return false; } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/LinkLevel.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/LinkLevel.java index b5f77673f..aff51e95f 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/LinkLevel.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/LinkLevel.java @@ -1,6 +1,5 @@ package com.shatteredpixel.shatteredpixeldungeon.levels; -import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.depth; import static com.shatteredpixel.shatteredpixeldungeon.levels.Terrain.EMPTY; import static com.shatteredpixel.shatteredpixeldungeon.levels.Terrain.WALL; import static com.shatteredpixel.shatteredpixeldungeon.levels.Terrain.WATER; @@ -13,6 +12,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.Null; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.ShopKing; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.ShopKing_Two; import com.shatteredpixel.shatteredpixeldungeon.items.keys.IronKey; +import com.shatteredpixel.shatteredpixeldungeon.items.quest.BackGoKey; public class LinkLevel extends Level { @@ -78,14 +78,15 @@ public class LinkLevel extends Level { setSize(WIDTH, HEIGHT); map = code_map.clone(); - this.entrance = WIDTH*22 + 17; + this.entrance = WIDTH*28 + 22; exit = 0; return true; } @Override protected void createItems() { - drop( new IronKey(depth), this.width + 22 ); + drop( new BackGoKey(), this.width + 1 ); + drop( new IronKey(-5), this.width + 22 ); } @Override diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/RegularLevel.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/RegularLevel.java index 4a2357998..baf1aa308 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/RegularLevel.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/RegularLevel.java @@ -26,6 +26,7 @@ import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.hero; import com.shatteredpixel.shatteredpixeldungeon.Bones; 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.Buff; @@ -122,7 +123,7 @@ public abstract class RegularLevel extends Level { initRooms.add(s); } - if (Dungeon.shopOnLevel()) + if (Dungeon.shopOnLevel() && !Statistics.fireGirlnoshopping) initRooms.add(new ShopRoom()); if (Dungeon.aqiLevel() && (Dungeon.isChallenged(AQUAPHOBIA))) diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/ShopBossLevel.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/ShopBossLevel.java index 37350ae26..fb5407ce8 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/ShopBossLevel.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/ShopBossLevel.java @@ -11,7 +11,9 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.bosses.CrystalDiedTower; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.bosses.FireMagicDied; +import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.FireMagicDiedNPC; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.NullDied; +import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.NullDiedTO; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfTeleportation; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; @@ -60,11 +62,12 @@ public class ShopBossLevel extends Level { GameScene.add(csp); } - //activateAll(); FireMagicDied boss = new FireMagicDied(); boss.pos = WIDTH*17 + 17; GameScene.add(boss); + //activateAll(); + GLog.p(Messages.get(FireMagicDied.class,"go", hero.name())); Sample.INSTANCE.play(Assets.Sounds.DEATH); } @@ -76,6 +79,18 @@ public class ShopBossLevel extends Level { WIDTH*17 + 22, }; + @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); + } + @Override public void occupyCell( Char ch ) { super.occupyCell( ch ); @@ -151,20 +166,32 @@ public class ShopBossLevel extends Level { private static final HashMap MAIN_PORTAL = new HashMap<>(4); { - MAIN_PORTAL.put(10+10*WIDTH, 3+5*WIDTH); - MAIN_PORTAL.put(3+5*WIDTH, throne); + MAIN_PORTAL.put(10+10*WIDTH, 2+2*WIDTH); + MAIN_PORTAL.put(1+WIDTH, throne); + + MAIN_PORTAL.put(24+10*WIDTH, 32+2*WIDTH); + MAIN_PORTAL.put(33+WIDTH, throne); MAIN_PORTAL.put(10+24*WIDTH, 2+32*WIDTH); MAIN_PORTAL.put(1+33*WIDTH, throne); + + MAIN_PORTAL.put(24+24*WIDTH, 32+32*WIDTH); + MAIN_PORTAL.put(33+33*WIDTH, throne); } private static final HashMap IF_MAIN_PORTAL = new HashMap<>(4); { - IF_MAIN_PORTAL.put(10+10*WIDTH, 3+5*WIDTH); - MAIN_PORTAL.put(3+5*WIDTH, throne); + IF_MAIN_PORTAL.put(10+10*WIDTH, 2+2*WIDTH); + IF_MAIN_PORTAL.put(1+WIDTH, throne); + + IF_MAIN_PORTAL.put(24+10*WIDTH, 32+2*WIDTH); + IF_MAIN_PORTAL.put(33+WIDTH, throne); IF_MAIN_PORTAL.put(10+24*WIDTH, 2+32*WIDTH); IF_MAIN_PORTAL.put(1+33*WIDTH, throne); + + IF_MAIN_PORTAL.put(24+24*WIDTH, 32+32*WIDTH); + IF_MAIN_PORTAL.put(33+33*WIDTH, throne); } @@ -181,17 +208,17 @@ public class ShopBossLevel extends Level { W,P,P,P,R,P,R,P,P,W,W,P,P,R,P,P,P,R,P,P,P,R,P,P,W,W,P,P,R,P,R,P,P,P,W, W,W,W,W,W,W,W,W,W,W,J,P,R,P,P,P,P,R,P,P,P,P,R,P,J,W,W,W,W,W,W,W,W,W,W, W,W,P,P,P,P,P,P,P,P,P,R,R,R,R,R,R,R,R,R,R,R,R,R,P,P,P,P,P,P,P,P,P,W,W, - S,W,W,P,P,P,P,P,P,P,R,R,R,D,G,G,G,H,X,X,X,X,R,R,R,P,P,P,P,P,P,P,W,W,S, - S,S,W,W,P,P,P,P,P,R,P,R,X,R,G,G,G,R,X,X,X,R,D,R,P,R,P,P,P,P,P,W,W,S,S, - S,S,S,W,W,P,P,P,R,P,P,R,X,X,R,G,G,R,X,X,R,G,G,R,P,P,R,P,P,P,W,W,S,S,S, - S,S,S,S,W,W,P,R,P,P,P,R,X,X,X,R,D,R,X,R,G,G,G,R,P,P,P,R,P,W,W,S,S,S,S, - S,S,S,S,S,W,W,P,P,P,P,R,X,X,X,X,R,R,R,D,G,G,G,R,P,P,P,P,W,W,S,S,S,S,S, - S,S,S,S,S,S,W,W,R,R,R,R,H,R,R,R,R,R,R,R,R,R,H,R,R,R,R,W,W,S,S,S,S,S,S, - S,S,S,S,S,W,W,P,P,P,P,R,G,G,G,D,R,R,R,X,X,X,X,R,P,P,P,P,W,W,S,S,S,S,S, - S,S,S,S,W,W,P,R,P,P,P,R,G,G,G,R,X,R,D,R,X,X,X,R,P,P,P,R,P,W,W,S,S,S,S, - S,S,S,W,W,P,P,P,R,P,P,R,G,G,R,X,X,R,G,G,R,X,X,R,P,P,R,P,P,P,W,W,S,S,S, - S,S,W,W,P,P,P,P,P,R,P,R,D,R,X,X,X,R,G,G,G,R,X,R,P,R,P,P,P,P,P,W,W,S,S, - S,W,W,P,P,P,P,P,P,P,R,R,R,X,X,X,X,H,G,G,G,D,R,R,R,P,P,P,P,P,P,P,W,W,S, + S,W,W,P,P,P,P,P,P,P,R,R,G,D,G,G,G,H,X,X,X,X,G,R,R,P,P,P,P,P,P,P,W,W,S, + S,S,W,W,P,P,P,P,P,R,P,R,X,G,G,G,G,R,X,X,X,G,D,R,P,R,P,P,P,P,P,W,W,S,S, + S,S,S,W,W,P,P,P,R,P,P,R,X,X,G,G,G,R,X,X,G,G,G,R,P,P,R,P,P,P,W,W,S,S,S, + S,S,S,S,W,W,P,R,P,P,P,R,X,X,X,G,D,R,X,G,G,G,G,R,P,P,P,R,P,W,W,S,S,S,S, + S,S,S,S,S,W,W,P,P,P,P,R,X,X,X,X,G,R,G,D,G,G,G,R,P,P,P,P,W,W,S,S,S,S,S, + S,S,S,S,S,S,W,W,R,R,R,R,H,R,R,R,R,G,R,R,R,R,H,R,R,R,R,W,W,S,S,S,S,S,S, + S,S,S,S,S,W,W,P,P,P,P,R,G,G,G,D,G,R,G,X,X,X,X,R,P,P,P,P,W,W,S,S,S,S,S, + S,S,S,S,W,W,P,R,P,P,P,R,G,G,G,G,X,R,D,G,X,X,X,R,P,P,P,R,P,W,W,S,S,S,S, + S,S,S,W,W,P,P,P,R,P,P,R,G,G,G,X,X,R,G,G,G,X,X,R,P,P,R,P,P,P,W,W,S,S,S, + S,S,W,W,P,P,P,P,P,R,P,R,D,G,X,X,X,R,G,G,G,G,X,R,P,R,P,P,P,P,P,W,W,S,S, + S,W,W,P,P,P,P,P,P,P,R,R,G,X,X,X,X,H,G,G,G,D,G,R,R,P,P,P,P,P,P,P,W,W,S, W,W,P,P,P,P,P,P,P,P,P,R,R,R,R,R,R,R,R,R,R,R,R,R,P,P,P,P,P,P,P,P,P,W,W, W,W,W,W,W,W,W,W,W,W,J,P,R,P,P,P,P,R,P,P,P,P,R,P,J,W,W,W,W,W,W,W,W,W,W, W,P,R,P,P,P,P,P,R,W,W,P,P,R,P,P,P,R,P,P,P,R,P,P,W,W,R,P,P,P,P,P,R,P,W, @@ -226,15 +253,13 @@ public class ShopBossLevel extends Level { static { pedestals[0] = 10 + WIDTH * 10; - pedestals[1] = 14 + WIDTH * 14; + pedestals[1] = 24 + WIDTH * 10; - pedestals[2] = 14 + WIDTH * 22; - - pedestals[3] = 23 + WIDTH * 22; + pedestals[2] = 10 + WIDTH * 24; + pedestals[3] = 32 + WIDTH * 32; } - public Mob createMob() { return null; } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/InterlevelScene.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/InterlevelScene.java index 51c31fa1a..85788cb55 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/InterlevelScene.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/InterlevelScene.java @@ -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 = 0.9f; } SkinnedBlock bg = new SkinnedBlock(Camera.main.width, Camera.main.height, loadingAsset ){ diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/StartScene.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/StartScene.java index 849d03528..04a8cb1b0 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/StartScene.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/StartScene.java @@ -23,7 +23,6 @@ package com.shatteredpixel.shatteredpixeldungeon.scenes; import com.shatteredpixel.shatteredpixeldungeon.Badges; import com.shatteredpixel.shatteredpixeldungeon.Chrome; -import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.GamesInProgress; import com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.HeroSubClass; @@ -197,11 +196,8 @@ public class StartScene extends PixelScene { classIcon.copy(Icons.get(info.heroClass)); } - if(Dungeon.depth < 0) { - depth.text("S"); - } else { - depth.text(Integer.toString(info.depth)); - } + + depth.text(Integer.toString(info.depth)); depth.measure(); level.text(Integer.toString(info.level)); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/changelist/mlpd/vM0_6_7_X_Changes.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/changelist/mlpd/vM0_6_7_X_Changes.java index 265b0be93..3dc96fa27 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/changelist/mlpd/vM0_6_7_X_Changes.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/changelist/mlpd/vM0_6_7_X_Changes.java @@ -4,6 +4,7 @@ import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.scenes.ChangesScene; import com.shatteredpixel.shatteredpixeldungeon.sprites.BlueBatSprite; +import com.shatteredpixel.shatteredpixeldungeon.sprites.ColdGuardSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.DiedMonkLoaderSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.FlameBoiSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSprite; @@ -22,6 +23,7 @@ import java.util.ArrayList; public class vM0_6_7_X_Changes { public static void addAllChanges(ArrayList changeInfos) { + add_v0_6_7_Changes(changeInfos); add_v0_6_6_Changes(changeInfos); add_v0_6_5_Changes(changeInfos); add_v0_6_4_Changes(changeInfos); @@ -31,6 +33,32 @@ public class vM0_6_7_X_Changes { add_v0_6_0_Changes(changeInfos); } + public static void add_v0_6_7_Changes( ArrayList changeInfos ) { + ChangeInfo changes = new ChangeInfo("v0.6.0.0-Beta20.785", 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 ColdGuardSprite(), ("全新区域:雪凛峡谷"), + ("在雪凛峡谷中寻找300年前的支离破碎的线索……\n\n全新商店抢劫系统:V6.0"))); + + changes.addButton(new ChangeButton(new ItemSprite(ItemSpriteSheet.DG1), ("月饼"), + ("限时食物:9-10到10.1,中秋节特供"))); + + changes = new ChangeInfo("改动", false, null); + changes.hardlight(Window.GREEN_COLOR); + changeInfos.add(changes); + + changes.addButton(new ChangeButton(Icons.get(Icons.INFO), ("杂项改动"), + ("-NPC对话文本改变\n-部分BGM升级更新"))); + + changes.addButton(new ChangeButton(new Image("sprites/spinner.png", 144, 0, 16, 16), (Messages.get(ChangesScene.class, "bugfixes")), + Messages.get(vM0_6_7_X_Changes.class, "bug_06X28"))); + } + public static void add_v0_6_6_Changes( ArrayList changeInfos ) { ChangeInfo changes = new ChangeInfo("v0.6.0.0-Beta20.75", true, ""); changes.hardlight(Window.TITLE_COLOR); @@ -277,9 +305,6 @@ public class vM0_6_7_X_Changes { changes.addButton(new ChangeButton(new FlameBoiSprite(), ("火焰机器人"), ("移除火焰机器人在常规局的出现,仅出现在支离破碎的精英怪概率里面"))); - changes.addButton(new ChangeButton(new ItemSprite(ItemSpriteSheet.DG1), ("炸弹匕首"), - ("移除炸弹匕首,它实在没有太大的用处。"))); - changes.addButton(new ChangeButton(new ItemSprite(ItemSpriteSheet.BlackDog), ("黑狗爪"), ("移除黑狗爪,它已不再有当年的威风"))); 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 e2d913c84..c00397d7d 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndChallenges.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndChallenges.java @@ -132,13 +132,12 @@ public class WndChallenges extends Window { cb.checked((checked & Challenges.MASKS[i]) != 0); cb.active = editable; - //if(Challenges.NAME_IDS[i].equals("no_food") && cb.active == editable){ - // if(boxes.get( 12 ).checked()){ - // cb.active = false; - // cb.checked(false); - // cb.alpha(0.5f); - // } - //} + //Disable + if(Challenges.NAME_IDS[i].equals("light&black")||Challenges.NAME_IDS[i].equals("exsg")||Challenges.NAME_IDS[i].equals("boss")){ + cb.active = false; + cb.checked(false); + cb.alpha(0.5f); + } if (i > 0) { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndGoShop.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndGoShop.java index 8f62bacb7..1d5625987 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndGoShop.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndGoShop.java @@ -2,8 +2,12 @@ package com.shatteredpixel.shatteredpixeldungeon.windows; import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.hero; +import com.shatteredpixel.shatteredpixeldungeon.Dungeon; +import com.shatteredpixel.shatteredpixeldungeon.Statistics; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Cost; +import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob; +import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.Shopkeeper; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.scenes.InterlevelScene; import com.shatteredpixel.shatteredpixeldungeon.scenes.PixelScene; @@ -26,19 +30,37 @@ public class WndGoShop extends Window { titlebar.icon(new ShopkeeperSprite()); titlebar.label(Messages.get(this, "szo")); add(titlebar); - RenderedTextBlock message = PixelScene.renderTextBlock((Messages.get(this, "ary")), 6); + RenderedTextBlock message = PixelScene.renderTextBlock(Statistics.fireGirlnoshopping ? Messages.get(this, + "ots"):(Messages.get(this, "ary")), 6); message.maxWidth(WIDTH); message.setPos(0, titlebar.bottom() + GAP); add(message); - RedButton btnBuy = new RedButton( Messages.get(this, "yes") ) { + RedButton btnBuy = new RedButton( Statistics.fireGirlnoshopping ? Messages.get(this, "ok"):Messages.get(this + , "yes") ) { @Override protected void onClick() { hide(); - InterlevelScene.mode = InterlevelScene.Mode.EXBOSS; - Buff.affect(hero, Cost.class).set( (6), 1 ); - Game.switchScene(InterlevelScene.class); + if(Statistics.fireGirlnoshopping){ + //GLog.n(Messages.get(WndGoShop.class, "bad", Dungeon.hero.name())); + for (Mob mob : Dungeon.level.mobs) { + if (mob instanceof Shopkeeper) { + ((Shopkeeper) mob).flee(); + break; + } + } + } + + if(Statistics.deadshoppingdied){ + //GLog.n(Messages.get(WndGoShop.class, "bad", Dungeon.hero.name())); + } else { + InterlevelScene.mode = InterlevelScene.Mode.EXBOSS; + Buff.affect(hero, Cost.class).set((6), 1); + Game.switchScene(InterlevelScene.class); + //商店抢劫 + Statistics.fireGirlnoshopping = true; + } } }; btnBuy.setRect( (WIDTH - BTN_GAP) / 2 - BTN_SIZE, message.top() + message.height() + BTN_GAP, BTN_SIZE, BTN_SIZE ); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndKingShop.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndKingShop.java new file mode 100644 index 000000000..a4edf5a26 --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndKingShop.java @@ -0,0 +1,329 @@ +package com.shatteredpixel.shatteredpixeldungeon.windows; + +import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.hero; + +import com.shatteredpixel.shatteredpixeldungeon.Assets; +import com.shatteredpixel.shatteredpixeldungeon.Chrome; +import com.shatteredpixel.shatteredpixeldungeon.Dungeon; +import com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.RandomBuff; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ReloadShop; +import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.NullDiedTO; +import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.Shopkeeper; +import com.shatteredpixel.shatteredpixeldungeon.items.Item; +import com.shatteredpixel.shatteredpixeldungeon.items.armor.Armor; +import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; +import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; +import com.shatteredpixel.shatteredpixeldungeon.scenes.PixelScene; +import com.shatteredpixel.shatteredpixeldungeon.sprites.ShopkKingSprite; +import com.shatteredpixel.shatteredpixeldungeon.ui.Icons; +import com.shatteredpixel.shatteredpixeldungeon.ui.ItemSlot; +import com.shatteredpixel.shatteredpixeldungeon.ui.RedButton; +import com.shatteredpixel.shatteredpixeldungeon.ui.RenderedTextBlock; +import com.shatteredpixel.shatteredpixeldungeon.ui.StyledButton; +import com.shatteredpixel.shatteredpixeldungeon.ui.Window; +import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; +import com.watabou.noosa.Game; +import com.watabou.noosa.NinePatch; +import com.watabou.noosa.audio.Sample; +import com.watabou.noosa.ui.Component; +import com.watabou.utils.Callback; + +public class WndKingShop extends Window { + private static final int WIDTH = 120; + private static final int BTN_SIZE = 16; + private static final int BTN_GAP = 3; + private static final int GAP = 3; + public WndKingShop() { + IconTitle titlebar = new IconTitle(); + titlebar.setRect(0, 0, WIDTH, 0); + titlebar.icon(new ShopkKingSprite()); + titlebar.label(Messages.get(WndKingShop.class,"king")); + add( titlebar ); + RenderedTextBlock message = PixelScene.renderTextBlock( (Messages.get(WndKingShop.class,"select")), 6 ); + message.maxWidth(WIDTH); + message.setPos(0, titlebar.bottom() + GAP); + add( message ); + + WndKingShop.RewardButton shop1 = new WndKingShop.RewardButton( NullDiedTO.shop1 ); + shop1.setRect( (WIDTH - BTN_GAP) / 6 - BTN_SIZE, message.top() + message.height() + BTN_GAP, BTN_SIZE, + BTN_SIZE ); + add( shop1 ); + + WndKingShop.RewardButton shop2 = new WndKingShop.RewardButton( NullDiedTO.shop2 ); + shop2.setRect( shop1.right() + BTN_GAP, shop1.top(), BTN_SIZE, BTN_SIZE ); + add(shop2); + + WndKingShop.RewardButton shop3 = new WndKingShop.RewardButton( NullDiedTO.shop3 ); + shop3.setRect( shop2.right() + BTN_GAP, shop2.top(), BTN_SIZE, BTN_SIZE ); + add(shop3); + + WndKingShop.RewardButton shop4 = new WndKingShop.RewardButton( NullDiedTO.shop4 ); + shop4.setRect( shop3.right() + BTN_GAP, shop3.top(), BTN_SIZE, BTN_SIZE ); + add(shop4); + + WndKingShop.RewardButton shop5 = new WndKingShop.RewardButton( NullDiedTO.shop5 ); + shop5.setRect( shop4.right() + BTN_GAP, shop4.top(), BTN_SIZE, BTN_SIZE ); + add(shop5); + + WndKingShop.RewardButton shop6 = new WndKingShop.RewardButton( NullDiedTO.shop6 ); + shop6.setRect( shop5.right() + BTN_GAP, shop5.top(), BTN_SIZE, BTN_SIZE ); + add(shop6); + + WndKingShop.RewardButton2 bomb1 = new WndKingShop.RewardButton2( NullDiedTO.shop7 ); + bomb1.setRect( shop1.left() , shop1.bottom(), BTN_SIZE, BTN_SIZE ); + add(bomb1); + + WndKingShop.RewardButton2 bomb2 = new WndKingShop.RewardButton2( NullDiedTO.shop8 ); + bomb2.setRect( bomb1.right()+ BTN_GAP , bomb1.top(), BTN_SIZE, BTN_SIZE ); + add(bomb2); + + WndKingShop.RewardButton2 bomb3 = new WndKingShop.RewardButton2( NullDiedTO.shop9 ); + bomb3.setRect( bomb2.right()+ BTN_GAP , bomb2.top(), BTN_SIZE, BTN_SIZE ); + add(bomb3); + + WndKingShop.RewardButton2 bomb4 = new WndKingShop.RewardButton2( NullDiedTO.shop10); + bomb4.setRect( bomb3.right()+ BTN_GAP , bomb3.top(), BTN_SIZE, BTN_SIZE ); + add(bomb4); + + WndKingShop.RewardButton2 bomb5 = new WndKingShop.RewardButton2( NullDiedTO.shop11 ); + bomb5.setRect( bomb4.right()+ BTN_GAP , bomb4.top(), BTN_SIZE, BTN_SIZE ); + add(bomb5); + + WndKingShop.RewardButton2 bomb6 = new WndKingShop.RewardButton2( NullDiedTO.shop12 ); + bomb6.setRect( bomb5.right() + BTN_GAP, bomb5.top(), BTN_SIZE, BTN_SIZE ); + add(bomb6); + + StyledButton btnSite = new StyledButton(Chrome.Type.WINDOW, Messages.get(this,"sellmod")){ + @Override + protected void onClick() { + super.onClick(); + Game.runOnRenderThread(new Callback() { + @Override + public void call() { + sell(); + } + }); + } + }; + btnSite.icon(Icons.get(Icons.GOLD)); + btnSite.textColor(Window.CYELLOW); + btnSite.setRect(56,-2, 65, 20 ); + add(btnSite); + + resize(WIDTH, (int) bomb6.bottom()); + } + + public static WndBag sell() { + return GameScene.selectItem( itemSelector ); + } + + public static boolean canSell(Item item){ + if (item.value() <= 0) return false; + if (item.unique && !item.stackable) return false; + if (item instanceof Armor && ((Armor) item).checkSeal() != null) return false; + if (item.isEquipped(Dungeon.hero) && item.cursed) return false; + return true; + } + + private static WndBag.ItemSelector itemSelector = new WndBag.ItemSelector() { + @Override + public String textPrompt() { + return Messages.get(Shopkeeper.class, "sell"); + } + + @Override + public boolean itemSelectable(Item item) { + return Shopkeeper.canSell(item); + } + + @Override + public void onSelect( Item item ) { + if (item != null) { + WndBag parentWnd = sell(); + GameScene.show( new WndTradeItem( item, parentWnd ) ); + } + } + }; + + private void tell(String text) { + Game.runOnRenderThread(new Callback() { + @Override + public void call() { + GameScene.show(new WndQuest(new NullDiedTO(), text)); + } + } + ); + } + + private void selectReward( Item reward ) { + + hide(); + + reward.identify(); + if (reward.doPickUp( hero )) { + GLog.i( Messages.get(hero, "you_now_have", reward.name()) ); + } + + //Ghost.Quest.complete(); + } + + private class RewardWindow extends WndInfoItem { + + public RewardWindow( Item item ) { + super(item); + + RedButton btnConfirm = new RedButton(Messages.get(WndKingShop.class, "buy")){ + @Override + protected void onClick() { + if(Dungeon.gold > 200) { + Dungeon.gold-=200; + WndKingShop.this.selectReward( item ); + if (RandomBuff.level-- >= 0) { + } + Buff.prolong( hero, ReloadShop.class, 1f); + //Statistics.naiyaziCollected += 1; + WndKingShop.RewardWindow.this.hide(); + //Badges.nyzvalidateGoldCollected(); + } else { + tell(Messages.get(WndKingShop.class,"nomoney")); + WndKingShop.RewardWindow.this.hide(); + } + } + }; + btnConfirm.setRect(0, height+2, width/2-1, 16); + add(btnConfirm); + + RedButton btnCancel = new RedButton(Messages.get(WndKingShop.class, "cancel")){ + @Override + protected void onClick() { + hide(); + } + }; + btnCancel.setRect(btnConfirm.right()+2, height+2, btnConfirm.width(), 16); + add(btnCancel); + + resize(width, (int)btnCancel.bottom()); + } + } + + private class RewardWindow2 extends WndInfoItem { + + public RewardWindow2( Item item ) { + super(item); + + RedButton btnConfirm = new RedButton(Messages.get(WndKingShop.class, "buy")){ + @Override + protected void onClick() { + if(Dungeon.gold > 200) { + Dungeon.gold-=200; + Buff.prolong( hero, ReloadShop.class, 1f); + WndKingShop.this.selectReward( item ); + if (RandomBuff.level-- >= 0) { + } + //Badges.nyzvalidateGoldCollected(); + //Statistics.naiyaziCollected += 1; + WndKingShop.RewardWindow2.this.hide(); + } else { + tell(Messages.get(WndKingShop.class,"nomoney")); + } + } + }; + btnConfirm.setRect(0, height+2, width/2-1, 16); + add(btnConfirm); + + RedButton btnCancel = new RedButton(Messages.get(WndKingShop.class, "cancel")){ + @Override + protected void onClick() { + hide(); + } + }; + btnCancel.setRect(btnConfirm.right()+2, height+2, btnConfirm.width(), 16); + add(btnCancel); + + resize(width, (int)btnCancel.bottom()); + } + } + + public class RewardButton2 extends Component { + + protected NinePatch bg; + protected ItemSlot slot; + + public RewardButton2(Item item) { + bg = Chrome.get(Chrome.Type.RED_BUTTON); + add(bg); + + slot = new ItemSlot(item) { + @Override + protected void onPointerDown() { + bg.brightness(1.2f); + Sample.INSTANCE.play(Assets.Sounds.CLICK); + } + + @Override + protected void onPointerUp() { + bg.resetColor(); + } + + @Override + protected void onClick() { + ShatteredPixelDungeon.scene().addToFront(new WndKingShop.RewardWindow2(item)); + } + }; + add(slot); + } + + @Override + protected void layout() { + super.layout(); + + bg.x = x; + bg.y = y; + bg.size(width, height); + + slot.setRect(x + 2, y + 2, width - 4, height - 4); + } + } + + public class RewardButton extends Component { + + protected NinePatch bg; + protected ItemSlot slot; + + public RewardButton( Item item ){ + bg = Chrome.get( Chrome.Type.RED_BUTTON); + add( bg ); + + slot = new ItemSlot( item ){ + @Override + protected void onPointerDown() { + bg.brightness( 1.2f ); + Sample.INSTANCE.play( Assets.Sounds.CLICK ); + } + @Override + protected void onPointerUp() { + bg.resetColor(); + } + @Override + protected void onClick() { + ShatteredPixelDungeon.scene().addToFront(new WndKingShop.RewardWindow(item)); + } + }; + add(slot); + } + + @Override + protected void layout() { + super.layout(); + + bg.x = x; + bg.y = y; + bg.size( width, height ); + + slot.setRect( x + 2, y + 2, width - 4, height - 4 ); + } + } +} + diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndTradeItem.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndTradeItem.java index 93b23dd66..a7cb35957 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndTradeItem.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndTradeItem.java @@ -24,6 +24,7 @@ package com.shatteredpixel.shatteredpixeldungeon.windows; import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.shopOnLevel; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; +import com.shatteredpixel.shatteredpixeldungeon.Statistics; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.ShopGuardDead; @@ -35,6 +36,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.Item; import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.MasterThievesArmband; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; +import com.shatteredpixel.shatteredpixeldungeon.sprites.FireMagicGirlSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; import com.shatteredpixel.shatteredpixeldungeon.ui.RedButton; @@ -132,7 +134,8 @@ public class WndTradeItem extends WndInfoItem { pos = btnBuy.bottom(); - RedButton btnStole = new RedButton( Messages.get(this, "stole", price) ) { + RedButton btnStole = new RedButton( Statistics.fireGirlnoshopping ? Messages.get(this, + "oks"):Messages.get(this, "stole", price) ) { @Override protected void onClick() { hide(); @@ -145,7 +148,7 @@ public class WndTradeItem extends WndInfoItem { } }; btnStole.setRect( 0, pos + GAP, width, BTN_HEIGHT ); - btnStole.icon(new ShopGuardDead.ShopGuardianRedSprite()); + btnStole.icon(Statistics.fireGirlnoshopping ? new FireMagicGirlSprite() :new ShopGuardDead.ShopGuardianRedSprite()); add( btnStole ); if(shopOnLevel()){ pos = btnStole.bottom();