diff --git a/build.gradle b/build.gradle index e488772dc..4efcf8421 100644 --- a/build.gradle +++ b/build.gradle @@ -17,7 +17,7 @@ allprojects { appPackageName = 'com.ansdomagiclingpixeldungeon.ling' appVersionCode =700720 - appVersionName = '0.6.0.0-Beta20.75' + appVersionName = '0.6.0.0-Beta21-p1' appJavaCompatibility = JavaVersion.VERSION_1_8 diff --git a/core/src/main/assets/messages/actors/actors.properties b/core/src/main/assets/messages/actors/actors.properties index df28595ad..588501069 100644 --- a/core/src/main/assets/messages/actors/actors.properties +++ b/core/src/main/assets/messages/actors/actors.properties @@ -1,4 +1,8 @@ ###MLPD +actors.mobs.bosses.crossdiedtower.dead=控制目标已丢失,已自动摧毁…… +actors.mobs.bosses.crossdiedtower.name=激光十字晶柱 +actors.mobs.bosses.crossdiedtower.desc=发射神秘的激光,对敌人造成伤害…… + actors.mobs.bosses.firemagicdied.name=浊焰魔女 actors.mobs.bosses.firemagicdied.desc=曾经是翼绫的护法之一,因为大火事件被地表三巨头怀疑,逃亡到了雪凛峡谷……\n\n被当时的商人领主给收养,现在,她是雪凛峡谷的守护之神…… actors.mobs.bosses.firemagicdied.go=%s,吾乃浊焰的化身,你必将受到正义的审判…… diff --git a/core/src/main/assets/messages/items/items.properties b/core/src/main/assets/messages/items/items.properties index 03bb57c46..e2261ac4d 100644 --- a/core/src/main/assets/messages/items/items.properties +++ b/core/src/main/assets/messages/items/items.properties @@ -1,4 +1,15 @@ ###MLPD +items.artifacts.goldiron.name=镀金铁砧 +items.artifacts.goldiron.desc=待补充 + +items.bombs.laserpython.name=激光十字晶柱召唤器 +items.bombs.laserpython.desc=这枚召唤器会在爆炸后立刻生成一个十字晶柱。 +items.bombs.laserpython.didnot_pick=你无法拾取该物品…… + +items.weapon.melee.endingblade.ac_lastcrystal=Γ激光晶柱Γ +items.weapon.melee.endingblade.ac_diedghost=✦死亡宣告✦ +items.weapon.melee.endingblade.ac_healreset=_亡者归来_ + items.artifacts.wraithamulet.name=暗金宝石护符 items.artifacts.wraithamulet.desc=来自于异世界的产物,能使自己进入虚无化。当护符能量足够多的时候,你还可以对敌人实行一次暗夜袭击,护符能量将会随着时间自动恢复。\n\n这个护符是证明给强者之人用的,冰雪魔女已经输的心服口服,现在她将此护身符给予给你。 items.artifacts.wraithamulet.ac_ghost=遁入虚无 @@ -84,6 +95,8 @@ items.quest.skeletongold.wow=染血金币发出诡异的光芒,你感到下层 items.weapon.melee.endingblade.name=终焉 items.weapon.melee.endingblade.desc=不知道从哪来的一个拆开的场记板,貌似沾染了焰之诅咒,有着强大的侵蚀能力。\n\n这个武器在攻击敌人的时候有概率造成_即死_效果,在汲取一定魔力后会产生新的能力。 +items.weapon.melee.endingblade.cursed=当你装备上这个武器后,一股无形的力量将你束缚住…… +items.weapon.melee.endingblade.donot_eqip=终焉的诅咒已经浸染你的身体,你无力脱下它。 #MLPDSTOREYBOOKS @@ -1245,6 +1258,8 @@ items.scrolls.scrollofremovecurse.inv_title=选择一件要净化的物品 items.scrolls.scrollofremovecurse.cleansed=你的道具闪耀着净化的光芒,一股恶毒的能量从中消散。 items.scrolls.scrollofremovecurse.not_cleansed=你的道具闪耀着净化的光芒,不过什么也没发生。 items.scrolls.scrollofremovecurse.desc=卷轴上的咒语能够瞬间清除指定的一件武器、护甲、法杖、戒指或神器上的诅咒。 +items.scrolls.scrollofremovecurse.=卷轴上的咒语能够瞬间清除指定的一件武器、护甲、法杖、戒指或神器上的诅咒。 +items.scrolls.scrollofremovecurse.strmagic=你的终焉散发出血红的光束,你的净化卷轴灰飞烟灭了…… items.scrolls.scrollofteleportation.name=传送卷轴 items.scrolls.scrollofteleportation.tele=眨眼之间你就被传送到本层的另外一个位置。 @@ -1970,6 +1985,7 @@ items.weapon.weapon.identify=你对手中的武器已经足够熟悉并将其完 items.weapon.weapon.too_heavy=因为你的力量不足,该武器会降低你的攻速和精准,并让你无法偷袭。 items.weapon.weapon.excess_str=你的额外力量让你在使用这件武器时最多能够造成_%d点额外伤害_。 items.weapon.weapon.incompatible=不同属性的魔法相冲突,消除了武器上的附魔! +items.weapon.weapon.nxt_cursed=净化的光芒闪过,但终焉上面的诅咒仍然没有被解除…… items.weapon.weapon.cursed_worn=由于这件武器被诅咒,你无法将其放下。 items.weapon.weapon.cursed=你能感觉到这件武器里潜伏着一股充满恶意的魔力。 items.weapon.weapon.not_cursed=这件武器没有被诅咒。 diff --git a/core/src/main/assets/sprites/items/died.png b/core/src/main/assets/sprites/items/died.png new file mode 100644 index 000000000..224b24bd2 Binary files /dev/null and b/core/src/main/assets/sprites/items/died.png differ diff --git a/core/src/main/assets/sprites/items/items.png b/core/src/main/assets/sprites/items/items.png index be46cde39..21d91cd48 100644 Binary files a/core/src/main/assets/sprites/items/items.png and b/core/src/main/assets/sprites/items/items.png differ diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Assets.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Assets.java index 176e3babf..50c2e0b6b 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Assets.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Assets.java @@ -278,7 +278,10 @@ public class Assets { public static final String KEEPERKING = "sprites/npc/ShopKing.png"; //BOSS + public static final String DIED = "sprites/items/died.png"; + public static final String CRID = "sprites/boss/ColdGuard.png"; + public static final String FRAS = "sprites/boss/FireMagicGirl.png"; public static final String NECROREDEX = "sprites/boss/rednecromancer_ex.png"; public static final String SLIMEPRINCESS = "sprites/boss/SlimePrincess.png"; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Challenges.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Challenges.java index 2faefec6b..aab83a35f 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Challenges.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Challenges.java @@ -71,13 +71,13 @@ public class Challenges { "sbsg", "exsg", "stronger_bosses", - "light&black", + //"light&black", "pro", }; public static final int[] MASKS = { NO_FOOD, NO_ARMOR, NO_HEALING, NO_HERBALISM, SWARM_INTELLIGENCE, DARKNESS, NO_SCROLLS - , AQUAPHOBIA, CHAMPION_ENEMIES,RLPT,SBSG,EXSG,STRONGER_BOSSES,LIGHTBLACK,PRO, + , AQUAPHOBIA, CHAMPION_ENEMIES,RLPT,SBSG,EXSG,STRONGER_BOSSES,PRO, }; public String name; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Dungeon.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Dungeon.java index c3b6aba61..7b098f326 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Dungeon.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Dungeon.java @@ -387,7 +387,7 @@ public class Dungeon { if (Dungeon.isChallenged(RLPT)) { switch (depth) { case 0: - level = new ShopBossLevel(); + level = new ZeroLevel(); break; case 1: case 2: diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/CrossTownProc.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/CrossTownProc.java new file mode 100644 index 000000000..f78d6b0b8 --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/CrossTownProc.java @@ -0,0 +1,125 @@ +package com.shatteredpixel.shatteredpixeldungeon.actors.buffs; + +import com.shatteredpixel.shatteredpixeldungeon.Dungeon; +import com.shatteredpixel.shatteredpixeldungeon.actors.Char; +import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.bosses.CrossDiedTower; +import com.shatteredpixel.shatteredpixeldungeon.effects.Beam; +import com.shatteredpixel.shatteredpixeldungeon.effects.FloatingText; +import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica; +import com.shatteredpixel.shatteredpixeldungeon.tiles.DungeonTilemap; +import com.watabou.utils.Bundle; +import com.watabou.utils.PointF; +import com.watabou.utils.Random; + +public class CrossTownProc extends Buff { + + public int towerPosLing; + private int stateLoop = 0; + + private void beamProc(Ballistica b) { + for (int j : b.path) { + if (j == b.sourcePos) continue; + Char ch = findChar(j); + if (ch != null) { + if (ch.alignment == Char.Alignment.ENEMY) { + ch.damage(Random.IntRange(5, 19), CrossDiedTower.class); + Buff.affect(ch, Cripple.class, 2f); + if (ch == Dungeon.hero && !ch.isAlive()) { + Dungeon.fail(getClass()); + } + } + } + } + } + + @Override + public boolean act() { + PointF p = DungeonTilemap.raisedTileCenterToWorld(towerPosLing); + if (stateLoop == 1) { + stateLoop++; + FloatingText.show(p.x, p.y, "+", 0x5580FF); + } else if (stateLoop == 2) { + int w = Dungeon.level.width(); + int[] tile = {w, -w, 1, -1}; + for (int i = 0; i < 4; ++i) { + Ballistica b = new Ballistica(towerPosLing, towerPosLing + tile[i], Ballistica.STOP_SOLID); + target.sprite.parent.add(new Beam.DeathRay(DungeonTilemap.raisedTileCenterToWorld(b.sourcePos), DungeonTilemap.raisedTileCenterToWorld(b.collisionPos))); + beamProc(b); + } + stateLoop++; + } else if (stateLoop == 4) { + stateLoop++; + FloatingText.show(p.x, p.y, "x", 0xFF8055); + } else if (stateLoop == 5) { + int w = Dungeon.level.width(); + int[] tile = {w + 1, w - 1, -w + 1, -w - 1}; + for (int i = 0; i < 4; ++i) { + Ballistica b = new Ballistica(towerPosLing, towerPosLing + tile[i], Ballistica.STOP_SOLID); + target.sprite.parent.add(new Beam.LightRay(DungeonTilemap.raisedTileCenterToWorld(b.sourcePos), DungeonTilemap.raisedTileCenterToWorld(b.collisionPos))); + beamProc(b); + } + stateLoop++; + } else if (stateLoop == 6) { + stateLoop++; + FloatingText.show(p.x, p.y, "S", 0x00ffff); + } else if (stateLoop == 7) { + int w = Dungeon.level.width(); + int[] tile = {w, w - 5, -w + 5, -w}; + for (int i = 0; i < 4; ++i) { + Ballistica b = new Ballistica(towerPosLing, towerPosLing + tile[i], Ballistica.IGNORE_SOFT_SOLID); + target.sprite.parent.add(new Beam.DeathRayS(DungeonTilemap.raisedTileCenterToWorld(b.sourcePos), + DungeonTilemap.raisedTileCenterToWorld(b.collisionPos))); + beamProc(b); + } + stateLoop++; + } else if (stateLoop == 10) { + stateLoop++; + FloatingText.show(p.x, p.y, "※", 0x00ffff); + } else if (stateLoop == 11) { + int w = Dungeon.level.width(); + int[] tile = {w + 1, w - 1, -w + 1, -w - 1}; + for (int i = 0; i < 4; ++i) { + Ballistica b = new Ballistica(towerPosLing, towerPosLing + tile[i], Ballistica.STOP_SOLID); + target.sprite.parent.add(new Beam.DeathRay(DungeonTilemap.raisedTileCenterToWorld(b.sourcePos), DungeonTilemap.raisedTileCenterToWorld(b.collisionPos))); + beamProc(b); + } + if (stateLoop == 11) { + int wx = Dungeon.level.width(); + int[] tilex = {w, -wx, 1, -1}; + for (int i = 0; i < 4; ++i) { + Ballistica b = new Ballistica(towerPosLing, towerPosLing + tilex[i], Ballistica.STOP_SOLID); + target.sprite.parent.add(new Beam.DeathRayS(DungeonTilemap.raisedTileCenterToWorld(b.sourcePos), + DungeonTilemap.raisedTileCenterToWorld(b.collisionPos))); + beamProc(b); + } + } + stateLoop = 0; + } else if (stateLoop == 0 || stateLoop == 3|| stateLoop == 8|| stateLoop == 9) { + stateLoop++; + } else { + stateLoop = 0; + } + // } + + spend(TICK); + return true; + } + + private static final String SHOCKER_POS = "shocker_pos"; + private static final String SHOCKING_ORDINALS = "shocking_ordinals"; + + @Override + public void storeInBundle(Bundle bundle) { + super.storeInBundle(bundle); + bundle.put(SHOCKER_POS, towerPosLing); + bundle.put(SHOCKING_ORDINALS, stateLoop); + } + + @Override + public void restoreFromBundle(Bundle bundle) { + super.restoreFromBundle(bundle); + towerPosLing = bundle.getInt(SHOCKER_POS); + stateLoop = bundle.getInt(SHOCKING_ORDINALS); + } +} + 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 8604ac525..a6835523d 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 @@ -63,6 +63,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.bags.BookBag; import com.shatteredpixel.shatteredpixeldungeon.items.bags.HerbBag; import com.shatteredpixel.shatteredpixeldungeon.items.bags.KingBag; import com.shatteredpixel.shatteredpixeldungeon.items.bags.VelvetPouch; +import com.shatteredpixel.shatteredpixeldungeon.items.bombs.LaserPython; import com.shatteredpixel.shatteredpixeldungeon.items.books.bookslist.BrokenBooks; import com.shatteredpixel.shatteredpixeldungeon.items.books.bookslist.DeepBloodBooks; import com.shatteredpixel.shatteredpixeldungeon.items.books.bookslist.GrassKingBooks; @@ -78,7 +79,6 @@ import com.shatteredpixel.shatteredpixeldungeon.items.lightblack.OilLantern; import com.shatteredpixel.shatteredpixeldungeon.items.lightblack.OilPotion; import com.shatteredpixel.shatteredpixeldungeon.items.potions.AlchemicalCatalyst; import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfExperience; -import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfFrost; import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfHealing; import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfInvisibility; import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfLightningShiledX; @@ -95,6 +95,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfIdentify; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfLullaby; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfMagicMapping; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfRage; +import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfRemoveCurse; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfTerror; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfTransmutation; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfUpgrade; @@ -177,9 +178,10 @@ public enum HeroClass { if (Dungeon.isChallenged(Challenges.PRO)){ new FrozenCarpaccio().quantity(11).identify().collect(); new FireFishSword().quantity(1).identify().collect(); + new LaserPython().quantity(100).identify().collect(); new PotionOfInvisibility().quantity(45).identify().collect(); new PotionOfPurity().quantity(45).identify().collect(); - Buff.affect(hero, ChampionHero.AntiMagic.class, 1234567890f); + Buff.affect(hero, ChampionHero.AntiMagic.class, 50000f); new AlchemicalCatalyst().quantity(45).identify().collect(); new EtherealChains().quantity(1).identify().collect(); new ScrollOfIdentify().quantity(45).identify().collect(); @@ -238,7 +240,7 @@ public enum HeroClass { new FireFishSword().quantity(1).identify().collect(); new EndingBlade().quantity(1).identify().collect(); new PotionOfDragonKingBreath().quantity(1).identify().collect(); - new PotionOfFrost().quantity(100).identify().collect(); + new ScrollOfRemoveCurse().quantity(100).identify().collect(); new WandOfBlueFuck().quantity(1).identify().collect(); new ScrollOfFlameCursed().quantity(10).identify().collect(); new PotionOfLightningShiled().quantity(42).collect(); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/bosses/CrossDiedTower.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/bosses/CrossDiedTower.java new file mode 100644 index 000000000..f639280c2 --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/bosses/CrossDiedTower.java @@ -0,0 +1,59 @@ +package com.shatteredpixel.shatteredpixeldungeon.actors.mobs.bosses; + +import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.hero; + +import com.shatteredpixel.shatteredpixeldungeon.Dungeon; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.CrossTownProc; +import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob; +import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; +import com.shatteredpixel.shatteredpixeldungeon.sprites.CrossDiedSprites; +import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; + +public class CrossDiedTower extends Mob { + + { + spriteClass = CrossDiedSprites.class; + + HP = HT = 1; + maxLvl = -1; + + properties.add(Property.MINIBOSS); + properties.add(Property.INORGANIC); + properties.add(Property.ELECTRIC); + properties.add(Property.IMMOVABLE); + + state = HUNTING; + } + + @Override + public void damage( int dmg, Object src ) { + } + + @Override + public void add( Buff buff ) { + } + + @Override + public boolean act() { + + if (Dungeon.level.heroFOV[pos]) { + spend(TICK); + } else { + //失去范围 + for (Mob mob : (Iterable)Dungeon.level.mobs.clone()) { + if (mob instanceof CrossDiedTower) { + mob.die( true ); + } + } + for (Buff buff : hero.buffs()) { + if (buff instanceof CrossTownProc) { + buff.detach(); + } + } + GLog.n(Messages.get(this,"dead")); + } + return true; + } + +} 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 e7d082cc9..71343c490 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 @@ -6,6 +6,7 @@ import static com.shatteredpixel.shatteredpixeldungeon.levels.ShopBossLevel.CryS import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Badges; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; +import com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon; import com.shatteredpixel.shatteredpixeldungeon.actors.Actor; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Amok; @@ -21,9 +22,11 @@ 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.ShopLimitLock; +import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Bee; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.BlackHost; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.ColdGurad; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.DM100; +import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Eye; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Monk; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.SRPDICLRPRO; @@ -40,6 +43,7 @@ import com.shatteredpixel.shatteredpixeldungeon.effects.Flare; import com.shatteredpixel.shatteredpixeldungeon.effects.MagicMissile; import com.shatteredpixel.shatteredpixeldungeon.effects.Pushing; import com.shatteredpixel.shatteredpixeldungeon.effects.Speck; +import com.shatteredpixel.shatteredpixeldungeon.effects.TargetedCell; import com.shatteredpixel.shatteredpixeldungeon.effects.particles.ElmoParticle; import com.shatteredpixel.shatteredpixeldungeon.effects.particles.EnergyParticle; import com.shatteredpixel.shatteredpixeldungeon.effects.particles.PurpleParticle; @@ -62,6 +66,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.Game; import com.watabou.noosa.audio.Music; import com.watabou.noosa.audio.Sample; import com.watabou.noosa.particles.Emitter; @@ -217,6 +222,12 @@ public class FireMagicDied extends Mob implements Callback { private int beamCD = 23; private float summonCooldown = 0; private float abilityCooldown = 6; + + private static final int MIN_ABILITY_CD = 7; + private static final int MAX_ABILITY_CD = 12; + private ArrayList targetedCells = new ArrayList<>(); + private int lastHeroPos; + private static final int MIN_COOLDOWN = 7; private static final int MAX_COOLDOWN = 11; private int summonsMade = 0; @@ -345,7 +356,22 @@ public class FireMagicDied extends Mob implements Callback { @Override public boolean act() { - if (phase == 1 && HP <= 400) { + if (phase == 1 && HP <= 350) { + doYogLasers(); + actScanning(); + if (Dungeon.level.water[pos] && HP < HT) { + HP += healInc; + + if (Dungeon.level.heroFOV[pos]) { + sprite.emitter().burst(Speck.factory(Speck.HEALING), healInc); + } + if (HP * 2 > HT) { + BossHealthBar.bleed(false); + ((FireMagicGirlSprite) sprite).spray(false); + HP = Math.min(HP, HT); + } + } + }else if (phase == 2 && HP <= 300) { if (summonCooldown <= 0 && summonSubject(3)){ summonsMade++; @@ -411,9 +437,9 @@ public class FireMagicDied extends Mob implements Callback { abilityCooldown--; } - } else if (phase == 2){ + } else if (phase == 3){ if (summonSubject(2)) summonsMade++; - } else if (phase == 3 && buffs(FireMagicDied.Summoning.class).size() < 4){ + } else if (phase == 4 && buffs(FireMagicDied.Summoning.class).size() < 4){ actPhaseTwoSummon(); return true; } @@ -437,40 +463,39 @@ public class FireMagicDied extends Mob implements Callback { return super.act(); } 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 SUMMONS_MADE = "summons_made"; private int wave=0; + private static final String TARGETED_CELLS = "targeted_cells"; - private static final String SUMMON_CD = "summon_cd"; - private static final String ABILITY_CD = "ability_cd"; - private static final String LAST_ABILITY = "last_ability"; @Override public void storeInBundle(Bundle bundle) { super.storeInBundle(bundle); - bundle.put( PHASE, phase ); - bundle.put( SUMMONS_MADE, summonsMade ); - bundle.put( SUMMON_CD, summonCooldown ); - bundle.put( ABILITY_CD, abilityCooldown ); - bundle.put( LAST_ABILITY, lastAbility ); - bundle.put("wavePhase2", wave); - pumpedUp = bundle.getInt( PUMPEDUP ); - if (state != SLEEPING) BossHealthBar.assignBoss(this); - if ((HP*2 <= HT)) BossHealthBar.bleed(true); + bundle.put(PHASE, phase); - //if check is for pre-0.9.3 saves - healInc = bundle.getInt(HEALINC); - bundle.put( PUMPEDUP , pumpedUp ); - bundle.put( HEALINC, healInc ); + bundle.put(ABILITY_CD, abilityCooldown); + bundle.put(SUMMON_CD, summonCooldown); + + int[] bundleArr = new int[targetedCells.size()]; + for (int i = 0; i < targetedCells.size(); i++){ + bundleArr[i] = targetedCells.get(i); + } + bundle.put(TARGETED_CELLS, bundleArr); } @Override public void restoreFromBundle(Bundle bundle) { super.restoreFromBundle(bundle); - phase = bundle.getInt( PHASE ); - summonsMade = bundle.getInt( SUMMONS_MADE ); - summonCooldown = bundle.getFloat( SUMMON_CD ); - abilityCooldown = bundle.getFloat( ABILITY_CD ); - lastAbility = bundle.getInt( LAST_ABILITY ); - wave = bundle.getInt("wavePhase2"); + phase = bundle.getInt(PHASE); + if (phase != 0) BossHealthBar.assignBoss(this); + + abilityCooldown = bundle.getFloat(ABILITY_CD); + summonCooldown = bundle.getFloat(SUMMON_CD); + + for (int i : bundle.getIntArray(TARGETED_CELLS)){ + targetedCells.add(i); + } } @Override @@ -677,6 +702,7 @@ public class FireMagicDied extends Mob implements Callback { } //properties.add(Property.IMMOVABLE); ScrollOfTeleportation.appear(this, ShopBossLevel.throneling); + doYogLasers(); sprite.centerEmitter().start( Speck.factory( Speck.SCREAM ), 0.4f, 2 ); Sample.INSTANCE.play( Assets.Sounds.CHALLENGE ); phase = 2; @@ -715,7 +741,8 @@ public class FireMagicDied extends Mob implements Callback { beamCD = 40 + 8 - (phase == 10 ? 38 : 0); sprite.showStatus(0xff0000, Messages.get(this, "dead")); - } else if (phase == 3 && preHP > 50 && HP <= 50){ + } else if (phase == 3 && preHP > 80 && HP <= 80){ + doYogLasers(); yell( Messages.get(this, "losing") ); } @@ -766,6 +793,7 @@ public class FireMagicDied extends Mob implements Callback { public void notice() { super.notice(); BossHealthBar.assignBoss(this); + ShatteredPixelDungeon.seamlessResetScene(); Music.INSTANCE.play(Assets.BGM_FRBOSS, true); yell( Messages.get(this, "notice") ); //summon(); @@ -1111,7 +1139,73 @@ public class FireMagicDied extends Mob implements Callback { } } - //第四阶段 + //Next Level 4 + public void doYogLasers(){ + boolean terrainAffected = false; + HashSet affected = new HashSet<>(); + //delay fire on a rooted hero + if (!enemy.rooted) { + for (int i : targetedCells) { + Ballistica b = new Ballistica(i, lastHeroPos, Ballistica.WONT_STOP); + //shoot beams + sprite.parent.add(new Beam.DeathRayS(DungeonTilemap.raisedTileCenterToWorld(i), + DungeonTilemap.raisedTileCenterToWorld(b.collisionPos))); + for (int p : b.path) { + Char ch = Actor.findChar(p); + if (ch != null && (ch.alignment != alignment || ch instanceof Bee)) { + affected.add(ch); + } + if (Dungeon.level.flamable[p]) { + Dungeon.level.destroy(p); + GameScene.updateMap(p); + terrainAffected = true; + } + } + } + if (terrainAffected) { + Dungeon.observe(); + } + for (Char ch : affected) { + ch.damage(Random.NormalIntRange(60, 121), new Eye.DeathGaze()); + + if (Dungeon.level.heroFOV[pos]) { + ch.sprite.flash(); + CellEmitter.center(pos).burst(Speck.factory(Speck.COIN), Random.IntRange(2, 3)); + } + if (!ch.isAlive() && ch == Dungeon.hero) { + Dungeon.fail(getClass()); + GLog.n(Messages.get(Char.class, "kill", name())); + } + } + targetedCells.clear(); + } + + if (abilityCooldown <= 0 && HP < HT*0.8f){ + lastHeroPos = enemy.pos; + + int beams = (int) (4 + (HP * 1.0f / HT)*4); + for (int i = 0; i < beams; i++){ + int randompos = Random.Int(Dungeon.level.width()) + Dungeon.level.width()*2; + targetedCells.add(randompos); + } + + for (int i : targetedCells){ + Ballistica b = new Ballistica(i, Dungeon.hero.pos, Ballistica.WONT_STOP); + for (int p : b.path){ + Game.scene().addToFront(new TargetedCell(p, 0xFF0000)); + } + } + + spend(TICK*1.5f); + Dungeon.hero.interrupt(); + + abilityCooldown += Random.NormalFloat(MIN_ABILITY_CD - 2*(1 - (HP * 1f / HT)), MAX_ABILITY_CD - 5*(1 - (HP * 1f / HT))); + } else { + spend(TICK); + } + if (abilityCooldown > 0) abilityCooldown--; + } + @Override public void move(int step) { @@ -1237,11 +1331,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(10, this); - } - } + if (m instanceof FireMagicDied ){ + m.damage(10, this); + } } + } } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/NullDied.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/NullDied.java index ad07380c5..33637b6b7 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/NullDied.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/NullDied.java @@ -33,7 +33,7 @@ public class NullDied extends NTNPC { public void flee() { destroy(); Dungeon.level.seal(); - GameScene.flash(0x8000FFFF); + GameScene.flash(0x80FF0000); sprite.killAndErase(); CellEmitter.get( pos ).burst(SnowParticle.FACTORY, 6 ); CellEmitter.get( pos ).burst(EnergyParticle.FACTORY, 6 ); 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 index 7fc00ac04..7f3e11e57 100644 --- 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 @@ -2,6 +2,7 @@ package com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs; import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; +import com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter; import com.shatteredpixel.shatteredpixeldungeon.effects.particles.EnergyParticle; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/CloakOfShadows.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/CloakOfShadows.java index 2246a938f..b4407d658 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/CloakOfShadows.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/CloakOfShadows.java @@ -146,7 +146,7 @@ public class CloakOfShadows extends Artifact { BloodBat bat = new BloodBat(); bat.pos = respawnPoints.get(Random.index( respawnPoints )); bat.HP = bat.HT = 18 + BloodBat.level * 2; - ((BloodBat) bat).defenseSkill = 4 + BloodBat.level*2; + bat.defenseSkill = 4 + BloodBat.level*2; bat.state = bat.WANDERING; GameScene.add(bat); bat.sprite.emitter().burst(Speck.factory(Speck.STAR), 10); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/GoldIron.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/GoldIron.java new file mode 100644 index 000000000..cb32e15de --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/GoldIron.java @@ -0,0 +1,435 @@ +package com.shatteredpixel.shatteredpixeldungeon.items.artifacts; + +import com.shatteredpixel.shatteredpixeldungeon.Assets; +import com.shatteredpixel.shatteredpixeldungeon.Dungeon; +import com.shatteredpixel.shatteredpixeldungeon.actors.Char; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Hunger; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Invisibility; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.LockedFloor; +import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; +import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent; +import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob; +import com.shatteredpixel.shatteredpixeldungeon.items.Item; +import com.shatteredpixel.shatteredpixeldungeon.items.rings.RingOfEnergy; +import com.shatteredpixel.shatteredpixeldungeon.levels.traps.Trap; +import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; +import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; +import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite; +import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSprite; +import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; +import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; +import com.shatteredpixel.shatteredpixeldungeon.windows.WndOptions; +import com.watabou.noosa.audio.Sample; +import com.watabou.noosa.particles.Emitter; +import com.watabou.utils.Bundle; +import com.watabou.utils.Random; + +import java.util.ArrayList; + +public class GoldIron extends Artifact { + + { + image = ItemSpriteSheet.Gold_Iron; + + levelCap = 5; + + charge = 5+level(); + partialCharge = 0; + chargeCap = 5+level(); + + defaultAction = AC_ACTIVATE; + } + + public static final String AC_ACTIVATE = "ACTIVATE"; + + //keeps track of generated sandbags. + public int sandBags = 0; + + @Override + public ArrayList actions(Hero hero ) { + ArrayList actions = super.actions( hero ); + if (isEquipped( hero ) && !cursed && (charge > 0 || activeBuff != null)) { + actions.add(AC_ACTIVATE); + } + return actions; + } + + @Override + public void execute( Hero hero, String action ) { + + super.execute(hero, action); + + if (action.equals(AC_ACTIVATE)){ + + if (!isEquipped( hero )) GLog.i( Messages.get(Artifact.class, "need_to_equip") ); + else if (activeBuff != null) { + if (activeBuff instanceof GoldIron.timeStasis) { //do nothing + } else { + activeBuff.detach(); + GLog.i( Messages.get(this, "deactivate") ); + } + } else if (charge <= 0) GLog.i( Messages.get(this, "no_charge") ); + else if (cursed) GLog.i( Messages.get(this, "cursed") ); + else GameScene.show( + new WndOptions(new ItemSprite(this), + Messages.titleCase(name()), + Messages.get(this, "prompt"), + Messages.get(this, "stasis"), + Messages.get(this, "freeze")) { + @Override + protected void onSelect(int index) { + if (index == 0) { + GLog.i( Messages.get(GoldIron.class, "onstasis") ); + GameScene.flash(0x80FFFFFF); + Sample.INSTANCE.play(Assets.Sounds.TELEPORT); + + activeBuff = new GoldIron.timeStasis(); + Talent.onArtifactUsed(Dungeon.hero); + activeBuff.attachTo(Dungeon.hero); + } else if (index == 1) { + GLog.i( Messages.get(GoldIron.class, "onfreeze") ); + GameScene.flash(0x80FFFFFF); + Sample.INSTANCE.play(Assets.Sounds.TELEPORT); + + activeBuff = new GoldIron.timeFreeze(); + Talent.onArtifactUsed(Dungeon.hero); + activeBuff.attachTo(Dungeon.hero); + ((GoldIron.timeFreeze)activeBuff).processTime(0f); + } + } + } + ); + } + } + + @Override + public void activate(Char ch) { + super.activate(ch); + if (activeBuff != null) + activeBuff.attachTo(ch); + } + + @Override + public boolean doUnequip(Hero hero, boolean collect, boolean single) { + if (super.doUnequip(hero, collect, single)){ + if (activeBuff != null){ + activeBuff.detach(); + activeBuff = null; + } + return true; + } else + return false; + } + + @Override + protected ArtifactBuff passiveBuff() { + return new GoldIron.hourglassRecharge(); + } + + @Override + public void charge(Hero target, float amount) { + if (charge < chargeCap){ + partialCharge += 0.25f*amount; + if (partialCharge >= 1){ + partialCharge--; + charge++; + updateQuickslot(); + } + } + } + + @Override + public Item upgrade() { + chargeCap+= 1; + + //for artifact transmutation. + while (level()+1 > sandBags) + sandBags ++; + + return super.upgrade(); + } + + @Override + public String desc() { + String desc = super.desc(); + + if (isEquipped( Dungeon.hero )){ + if (!cursed) { + if (level() < levelCap ) + desc += "\n\n" + Messages.get(this, "desc_hint"); + + } else + desc += "\n\n" + Messages.get(this, "desc_cursed"); + } + return desc; + } + + + private static final String SANDBAGS = "sandbags"; + private static final String BUFF = "buff"; + + @Override + public void storeInBundle( Bundle bundle ) { + super.storeInBundle(bundle); + bundle.put( SANDBAGS, sandBags ); + + if (activeBuff != null) + bundle.put( BUFF , activeBuff ); + } + + @Override + public void restoreFromBundle( Bundle bundle ) { + super.restoreFromBundle(bundle); + sandBags = bundle.getInt( SANDBAGS ); + + //these buffs belong to hourglass, need to handle unbundling within the hourglass class. + if (bundle.contains( BUFF )){ + Bundle buffBundle = bundle.getBundle( BUFF ); + + if (buffBundle.contains( GoldIron.timeFreeze.PRESSES )) + activeBuff = new GoldIron.timeFreeze(); + else + activeBuff = new GoldIron.timeStasis(); + + activeBuff.restoreFromBundle(buffBundle); + } + } + + public class hourglassRecharge extends ArtifactBuff { + @Override + public boolean act() { + + LockedFloor lock = target.buff(LockedFloor.class); + if (charge < chargeCap && !cursed && (lock == null || lock.regenOn())) { + //90 turns to charge at full, 60 turns to charge at 0/10 + float chargeGain = 1 / (90f - (chargeCap - charge)*3f); + chargeGain *= RingOfEnergy.artifactChargeMultiplier(target); + partialCharge += chargeGain; + + if (partialCharge >= 1) { + partialCharge --; + charge ++; + + if (charge == chargeCap){ + partialCharge = 0; + } + } + } else if (cursed && Random.Int(10) == 0) + ((Hero) target).spend( TICK ); + + updateQuickslot(); + + spend( TICK ); + + return true; + } + } + + public class timeStasis extends ArtifactBuff { + + { + type = buffType.POSITIVE; + actPriority = BUFF_PRIO-3; //acts after all other buffs, so they are prevented + } + + @Override + public boolean attachTo(Char target) { + + if (super.attachTo(target)) { + + Invisibility.dispel(); + + int usedCharge = Math.min(charge, 2); + //buffs always act last, so the stasis buff should end a turn early. + spend(5*usedCharge); + + //shouldn't punish the player for going into stasis frequently + Hunger hunger = Buff.affect(target, Hunger.class); + if (hunger != null && !hunger.isStarving()) { + hunger.satisfy(5 * usedCharge); + } + + charge -= usedCharge; + + target.invisible++; + target.paralysed++; + target.next(); + + updateQuickslot(); + + if (Dungeon.hero != null) { + Dungeon.observe(); + } + + return true; + } else { + return false; + } + } + + @Override + public boolean act() { + detach(); + return true; + } + + @Override + public void detach() { + if (target.invisible > 0) target.invisible--; + if (target.paralysed > 0) target.paralysed--; + super.detach(); + activeBuff = null; + Dungeon.observe(); + } + + @Override + public void fx(boolean on) { + if (on) target.sprite.add( CharSprite.State.INVISIBLE ); + else if (target.invisible == 0) target.sprite.remove( CharSprite.State.INVISIBLE ); + } + } + + public class timeFreeze extends ArtifactBuff { + + { + type = buffType.POSITIVE; + } + + float turnsToCost = 0f; + + ArrayList presses = new ArrayList<>(); + + public void processTime(float time){ + turnsToCost -= time; + + //use 1/1,000 to account for rounding errors + while (turnsToCost < -0.001f){ + turnsToCost += 2f; + charge --; + } + + updateQuickslot(); + + if (charge < 0){ + charge = 0; + detach(); + } + + } + + public void setDelayedPress(int cell){ + if (!presses.contains(cell)) + presses.add(cell); + } + + public void triggerPresses(){ + for (int cell : presses) + Dungeon.level.pressCell(cell); + + presses = new ArrayList<>(); + } + + public void disarmPressedTraps(){ + for (int cell : presses){ + Trap t = Dungeon.level.traps.get(cell); + if (t != null && t.disarmedByActivation) t.disarm(); + } + + presses = new ArrayList<>(); + } + + @Override + public void detach(){ + updateQuickslot(); + super.detach(); + activeBuff = null; + triggerPresses(); + target.next(); + } + + @Override + public void fx(boolean on) { + Emitter.freezeEmitters = on; + if (on){ + for (Mob mob : Dungeon.level.mobs.toArray(new Mob[0])) { + if (mob.sprite != null) mob.sprite.add(CharSprite.State.PARALYSED); + } + } else { + for (Mob mob : Dungeon.level.mobs.toArray(new Mob[0])) { + if (mob.paralysed <= 0) mob.sprite.remove(CharSprite.State.PARALYSED); + } + } + } + + private static final String PRESSES = "presses"; + private static final String TURNSTOCOST = "turnsToCost"; + + @Override + public void storeInBundle(Bundle bundle) { + super.storeInBundle(bundle); + + int[] values = new int[presses.size()]; + for (int i = 0; i < values.length; i ++) + values[i] = presses.get(i); + bundle.put( PRESSES , values ); + + bundle.put( TURNSTOCOST , turnsToCost); + } + + @Override + public void restoreFromBundle(Bundle bundle) { + super.restoreFromBundle(bundle); + + int[] values = bundle.getIntArray( PRESSES ); + for (int value : values) + presses.add(value); + + turnsToCost = bundle.getFloat( TURNSTOCOST ); + } + } + + public static class sandBag extends Item { + + { + image = ItemSpriteSheet.SANDBAG; + } + + @Override + public boolean doPickUp(Hero hero, int pos) { + GoldIron hourglass = hero.belongings.getItem( GoldIron.class ); + if (hourglass != null && !hourglass.cursed) { + hourglass.upgrade(); + Sample.INSTANCE.play( Assets.Sounds.DEWDROP ); + if (hourglass.level() == hourglass.levelCap) + GLog.p( Messages.get(this, "maxlevel") ); + else + GLog.i( Messages.get(this, "levelup") ); + GameScene.pickUp(this, pos); + hero.spendAndNext(TIME_TO_PICK_UP); + return true; + } else { + GLog.w( Messages.get(this, "no_hourglass") ); + return false; + } + } + + @Override + public int value() { + return 20; + } + + @Override + public boolean isUpgradable() { + return false; + } + + @Override + public boolean isIdentified() { + return true; + } + } + + +} + diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/bombs/Bomb.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/bombs/Bomb.java index c0dfccc76..dea3fbc3b 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/bombs/Bomb.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/bombs/Bomb.java @@ -61,7 +61,7 @@ import java.util.HashMap; import java.util.LinkedHashMap; public class Bomb extends Item { - + { image = ItemSpriteSheet.BOMB; @@ -74,7 +74,7 @@ public class Bomb extends Item { public Fuse fuse; //FIXME using a static variable for this is kinda gross, should be a better way - private static boolean lightingFuse = false; + protected static boolean lightingFuse = false; private static final String AC_LIGHTTHROW = "LIGHTTHROW"; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/bombs/LaserPython.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/bombs/LaserPython.java new file mode 100644 index 000000000..46186c1d5 --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/bombs/LaserPython.java @@ -0,0 +1,51 @@ +package com.shatteredpixel.shatteredpixeldungeon.items.bombs; + +import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.hero; + +import com.shatteredpixel.shatteredpixeldungeon.Assets; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.CrossTownProc; +import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; +import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.bosses.CrossDiedTower; +import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; +import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; +import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSprite; +import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; +import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; +import com.watabou.noosa.audio.Sample; + +public class LaserPython extends Bomb { + + { + image = ItemSpriteSheet.LASERPYTHON; + } + + @Override + public void explode(int cell) { + super.explode(cell); + CrossDiedTower csp = new CrossDiedTower(); + csp.pos = cell; + GameScene.add(csp); + Buff.append(hero, CrossTownProc.class).towerPosLing = cell; + + Sample.INSTANCE.play(Assets.Sounds.BURNING); + } + + @Override + public boolean doPickUp(Hero hero, int pos) { + GLog.w( Messages.get(this, "didnot_pick") ); + return false; + } + + @Override + public ItemSprite.Glowing glowing() { + return fuse != null ? new ItemSprite.Glowing( 0x268065, 0.6f) : null; + } + + @Override + public int value() { + //prices of ingredients + return quantity * (20 + 30); + } +} + diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/quest/GoldBAo.smali b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/quest/GoldBAo.smali new file mode 100644 index 000000000..8ebb69a4e --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/quest/GoldBAo.smali @@ -0,0 +1,63 @@ +.class public Lcom/shatteredpixel/shatteredpixeldungeon/items/quest/GoldBAo; +.super Lcom/shatteredpixel/shatteredpixeldungeon/items/Item; +.source "GoldBAo.java" + + +# direct methods +.method public constructor ()V + .registers 2 + + .prologue + .line 28 + invoke-direct {p0}, Lcom/shatteredpixel/shatteredpixeldungeon/items/Item;->()V + + .line 31 + sget v0, Lcom/shatteredpixel/shatteredpixeldungeon/sprites/ItemSpriteSheet;->DG21:I + + iput v0, p0, Lcom/shatteredpixel/shatteredpixeldungeon/items/quest/GoldBAo;->image:I + + .line 32 + return-void +.end method + + +# virtual methods +.method public isIdentified()Z + .registers 2 + + .prologue + .line 41 + const/4 v0, 0x1 + + return v0 +.end method + +.method public isUpgradable()Z + .registers 2 + + .prologue + .line 36 + const/4 v0, 0x0 + + return v0 +.end method + +.method public value()I + .registers 4 + + .prologue + .line 45 + iget v0, p0, Lcom/shatteredpixel/shatteredpixeldungeon/items/quest/GoldBAo;->quantity:I + + const/16 v1, 0x9c4 + + const/16 v2, 0x157c + + invoke-static {v1, v2}, Lcom/watabou/utils/Random;->Int(II)I + + move-result v1 + + mul-int/2addr v0, v1 + + return v0 +.end method diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/scrolls/ScrollOfRemoveCurse.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/scrolls/ScrollOfRemoveCurse.java index aa68fef38..afe45ca09 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/scrolls/ScrollOfRemoveCurse.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/scrolls/ScrollOfRemoveCurse.java @@ -21,7 +21,8 @@ package com.shatteredpixel.shatteredpixeldungeon.items.scrolls; -import com.shatteredpixel.shatteredpixeldungeon.Dungeon; +import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.hero; + import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Degrade; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Belongings; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; @@ -32,6 +33,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.Item; import com.shatteredpixel.shatteredpixeldungeon.items.armor.Armor; import com.shatteredpixel.shatteredpixeldungeon.items.wands.Wand; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.Weapon; +import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.EndingBlade; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; @@ -49,7 +51,7 @@ public class ScrollOfRemoveCurse extends InventoryScroll { } public static boolean uncursable( Item item ){ - if (item.isEquipped(Dungeon.hero) && Dungeon.hero.buff(Degrade.class) != null) { + if (item.isEquipped(hero) && hero.buff(Degrade.class) != null) { return true; } if ((item instanceof EquipableItem || item instanceof Wand) && ((!item.isIdentified() && !item.cursedKnown) || item.cursed)){ return true; @@ -64,7 +66,12 @@ public class ScrollOfRemoveCurse extends InventoryScroll { @Override protected void onItemSelected(Item item) { - new Flare( 6, 32 ).show( curUser.sprite, 2f ) ; + + if(item instanceof EndingBlade) { + new Flare( 6, 32 ).color( 0xff0000, true ).show( curUser.sprite, 2f ); + } else { + new Flare(6, 32).show(curUser.sprite, 2f); + } boolean procced = uncurse( curUser, item ); @@ -75,6 +82,8 @@ public class ScrollOfRemoveCurse extends InventoryScroll { if (procced) { GLog.p( Messages.get(this, "cleansed") ); + } else if(item instanceof EndingBlade) { + GLog.n(Messages.get(ScrollOfRemoveCurse.class, "strmagic")); } else { GLog.i( Messages.get(this, "not_cleansed") ); } @@ -86,9 +95,13 @@ public class ScrollOfRemoveCurse extends InventoryScroll { for (Item item : items) { if (item != null) { item.cursedKnown = true; - if (item.cursed) { - procced = true; - item.cursed = false; + if (item instanceof EndingBlade) { + item.cursed = true; + } else { + if (item.cursed) { + procced = true; + item.cursed = false; + } } } if (item instanceof Weapon){ @@ -109,7 +122,7 @@ public class ScrollOfRemoveCurse extends InventoryScroll { ((Wand) item).updateLevel(); } } - + if (procced && hero != null) { hero.sprite.emitter().start( ShadowParticle.UP, 0.05f, 10 ); hero.updateHT( false ); //for ring of might diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/gun/coming soon b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/gun/coming soon new file mode 100644 index 000000000..e69de29bb diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/EndingBlade.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/EndingBlade.java index 1ed1a85de..31729db21 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/EndingBlade.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/EndingBlade.java @@ -1,54 +1,185 @@ package com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee; -import com.shatteredpixel.shatteredpixeldungeon.Badges; +import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; -import com.shatteredpixel.shatteredpixeldungeon.effects.particles.ShadowParticle; +import com.shatteredpixel.shatteredpixeldungeon.items.bombs.LaserPython; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.Weapon; -import com.shatteredpixel.shatteredpixeldungeon.items.weapon.enchantments.Grim; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; -import com.watabou.utils.Random; +import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; +import com.watabou.utils.Bundle; -public class EndingBlade extends MeleeWeapon{ +import java.util.ArrayList; + +public class EndingBlade extends Weapon { { image = ItemSpriteSheet.ENDDIED; tier = 4; - DLY = 2f; + cursed = true; } + //三大基础静态固定字节 + public static final String AC_LASERCRYSTAL = "lastcrystal"; + public static final String AC_DIEDGHOST = "diedghost"; + public static final String AC_HEALRESET = "healreset"; + + @Override + public ArrayList actions(Hero hero ) { + ArrayList actions = super.actions( hero ); + if(isEquipped( hero )) { + //激光晶柱 + actions.add(AC_LASERCRYSTAL); + //亡灵宣告 + actions.add(AC_DIEDGHOST); + //再生之力 + actions.add(AC_HEALRESET); + + } + return actions; + } + + public int fireenergy; + + private boolean firstx=true; + + private static final String FIRST = "first"; + + @Override + public void storeInBundle(Bundle bundle) { + super.storeInBundle(bundle); + bundle.put(FIRST, firstx); + } + + @Override + public void restoreFromBundle(Bundle bundle) { + super.restoreFromBundle(bundle); + firstx = bundle.getBoolean(FIRST); + } + + public String desc() { + return Messages.get(this, "desc")+"\n\n"+fireenergy; + } + + //每100点浊焰能量自动升级 + @Override + public int level() { + return fireenergy/100; + } + + public void execute( Hero hero, String action ) { + super.execute( hero, action ); + + switch (action) { + case AC_LASERCRYSTAL: + if(level >= 4 && firstx){ + firstx = false; + new LaserPython().quantity(1).identify().collect(); + GLog.n("你突然感觉你的背包鼓鼓的……"); + } else if(!firstx) { + GLog.n("你尚未使用激光晶柱,无法继续使用"); + } else { + GLog.n("等级不足"); + } + break; + case AC_DIEDGHOST: + GLog.p("2"); + break; + case AC_HEALRESET: + GLog.w("3"); + break; + } + } + + + + @Override public int STRReq(int C) { - return 25; - }//力量需求 - - public int proc(Weapon weapon, Char attacker, Char defender, int damage ) { - - int enemyHealth = defender.HP - damage; - if (enemyHealth <= 0) return damage; - - float maxChance = 0.5f; - float chance = maxChance; - - if (Random.Float() < chance) { - - defender.damage( defender.HP, this ); - defender.sprite.emitter().burst( ShadowParticle.UP, 5 ); - - if (!defender.isAlive() && attacker instanceof Hero - //this prevents unstable from triggering grim achievement - && weapon.hasEnchant(Grim.class, attacker)) { - Badges.validateGrimWeapon(); - } + return 15+level; + } + public int proc(Char attacker, Char defender, int damage ) { + //常规加+1浊焰能量 + ++this.fireenergy; + if(level >= 10){ + fireenergy += 0; + //武器最高级 + } else if(defender.properties().contains(Char.Property.BOSS) && defender.HP <= damage){ + //目标Boss血量小于实际伤害判定为死亡,+20浊焰能量 + this.fireenergy+=20; + } else if(defender.properties().contains(Char.Property.MINIBOSS) && defender.HP <= damage){ + //目标迷你Boss血量小于实际伤害判定为死亡,+10浊焰能量 + this.fireenergy+=10; + } else if (defender.HP <= damage){ + //目标血量小于实际伤害判定为死亡,+5浊焰能量 + this.fireenergy+=5; } - return damage; + return super.proc(attacker, defender, damage); + + } @Override - public String statsInfo(){ - return Messages.get(EndingBlade.class,"stats_desc"); - }//添加新文本 + public boolean isUpgradable() { + return false; + } + public int tier; + + @Override + public String info() { + + String info = desc(); + + if (levelKnown) { + info += "\n\n" + Messages.get(MeleeWeapon.class, "stats_known", tier, augment.damageFactor(min()), augment.damageFactor(max()), STRReq()); + if (STRReq() > Dungeon.hero.STR()) { + info += " " + Messages.get(Weapon.class, "too_heavy"); + } else if (Dungeon.hero.STR() > STRReq()){ + info += " " + Messages.get(Weapon.class, "excess_str", Dungeon.hero.STR() - STRReq()); + } + } else { + info += "\n\n" + Messages.get(MeleeWeapon.class, "stats_unknown", tier, min(0), max(0), STRReq(0)); + if (STRReq(0) > Dungeon.hero.STR()) { + info += " " + Messages.get(MeleeWeapon.class, "probably_too_heavy"); + } + } + + switch (augment) { + case SPEED: + info += " " + Messages.get(Weapon.class, "faster"); + break; + case DAMAGE: + info += " " + Messages.get(Weapon.class, "stronger"); + break; + case NONE: + } + + if (enchantment != null && (cursedKnown || !enchantment.curse())){ + info += "\n\n" + Messages.get(Weapon.class, "enchanted", enchantment.name()); + info += " " + Messages.get(enchantment, "desc"); + } + + if (cursed && isEquipped( Dungeon.hero )) { + info += "\n\n" + Messages.get(Weapon.class, "cursed_worn"); + } else if (cursedKnown && cursed) { + info += "\n\n" + Messages.get(Weapon.class, "cursed"); + } else if (!isIdentified() && cursedKnown){ + info += "\n\n" + Messages.get(Weapon.class, "not_cursed"); + } + + return info; + } + + @Override + public int min(int lvl) { + return 10; + } + + @Override + public int max(int lvl) { + return 15; + } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/LockSword.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/LockSword.java index 6d0e29b63..eccfd8bcb 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/LockSword.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/LockSword.java @@ -13,7 +13,6 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.RandomBuff; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.enchantments.Unstable; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; -import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; import com.watabou.utils.Bundle; public class LockSword extends MeleeWeapon { @@ -34,7 +33,7 @@ public class LockSword extends MeleeWeapon { public int image() { if (this.level() == 3 && Dungeon.hero.buff(RandomBuff.class) != null){ - GLog.n("谢谢你为我升级……"); + //GLog.n("谢谢你为我升级……"); for (Buff buff : hero.buffs()) { if (buff instanceof RandomBuff) { buff.detach(); 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 fb5407ce8..557c5f3c2 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/ShopBossLevel.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/ShopBossLevel.java @@ -8,6 +8,7 @@ import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.actors.Actor; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.LockedFloor; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.bosses.CrystalDiedTower; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.bosses.FireMagicDied; @@ -273,11 +274,19 @@ public class ShopBossLevel extends Level { } public String tilesTex() { - return Assets.Environment.TILES_COLD; + if (Dungeon.hero.buff(LockedFloor.class)!=null) { + return Assets.Environment.TILES_DIED; + } else { + return Assets.Environment.TILES_COLD; + } } public String waterTex() { - return Assets.Environment.WATER_COLD; + if (Dungeon.hero.buff(LockedFloor.class)!=null) { + return Assets.Environment.WATER_HALLS; + } else { + return Assets.Environment.WATER_COLD; + } } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/features/Chasm.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/features/Chasm.java index 0b8a1222d..3da47cded 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/features/Chasm.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/features/Chasm.java @@ -27,8 +27,10 @@ import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Bleeding; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Cripple; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.CrossTownProc; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob; +import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.bosses.CrossDiedTower; import com.shatteredpixel.shatteredpixeldungeon.effects.Speck; import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.TimekeepersHourglass; import com.shatteredpixel.shatteredpixeldungeon.items.spells.FeatherFall; @@ -70,6 +72,16 @@ public class Chasm implements Hero.Doom { if (index == 0) { if (Dungeon.hero.pos == heroPos) { jumpConfirmed = true; + for (Buff buff : hero.buffs()) { + if (buff instanceof CrossTownProc) { + buff.detach(); + } + } + for (Mob mob : (Iterable)Dungeon.level.mobs.clone()) { + if (mob instanceof CrossDiedTower) { + mob.die( true ); + } + } hero.resume(); } } 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 85788cb55..51c31fa1a 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.9f; + fadeTime = 0.1f; } SkinnedBlock bg = new SkinnedBlock(Camera.main.width, Camera.main.height, loadingAsset ){ diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/CrossDiedSprites.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/CrossDiedSprites.java new file mode 100644 index 000000000..8e4fdfb45 --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/CrossDiedSprites.java @@ -0,0 +1,29 @@ +package com.shatteredpixel.shatteredpixeldungeon.sprites; + +import com.shatteredpixel.shatteredpixeldungeon.Assets; +import com.watabou.noosa.TextureFilm; + +public class CrossDiedSprites extends MobSprite { + + public CrossDiedSprites() { + super(); + + texture(Assets.Sprites.DIED); + + TextureFilm frames = new TextureFilm(texture, 16, 16); + + idle = new Animation(2, true); + idle.frames(frames, 0, 0, 0, 0); + + run = new Animation(10, true); + run.frames(frames, 0, 0, 0, 0); + + attack = new Animation(15, false); + attack.frames(frames, 0, 0, 0, 0); + + die = new Animation(10, false); + die.frames(frames, 0, 0, 0, 0); + + play(idle); + } +} \ No newline at end of file diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/ItemSpriteSheet.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/ItemSpriteSheet.java index 9bc301a2a..5335f8beb 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/ItemSpriteSheet.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/ItemSpriteSheet.java @@ -433,6 +433,7 @@ public class ItemSpriteSheet { public static final int ARTIFACT_ROSE1 = ARTIFACTS+20; public static final int ARTIFACT_ROSE2 = ARTIFACTS+21; public static final int ARTIFACT_ROSE3 = ARTIFACTS+22; + public static final int Gold_Iron = ARTIFACTS+23; static{ assignItemRect(ARTIFACT_CLOAK, 9, 15); assignItemRect(ARTIFACT_ARMBAND, 16, 13); @@ -457,6 +458,7 @@ public class ItemSpriteSheet { assignItemRect(ARTIFACT_ROSE1, 14, 14); assignItemRect(ARTIFACT_ROSE2, 14, 14); assignItemRect(ARTIFACT_ROSE3, 14, 14); + assignItemRect(Gold_Iron, 16, 16); } //16 free slots @@ -768,6 +770,7 @@ public class ItemSpriteSheet { public static final int NOKING= MAINBOOKINDEX+7; public static final int FIRELIYD= MAINBOOKINDEX+8; public static final int FBK= MAINBOOKINDEX+9; + public static final int LASERPYTHON= MAINBOOKINDEX+10; private static final int MAINPALYBOOKS = xy(1, 40); public static final int MONEYBOOKS= MAINPALYBOOKS+1; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/RenderedTextBlock.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/RenderedTextBlock.java index 2c5868613..fe867275c 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/RenderedTextBlock.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/RenderedTextBlock.java @@ -129,7 +129,7 @@ public class RenderedTextBlock extends Component { Θ = 蓝色 Ξ = 粉色 Π = 紫色 - Σ = 黑色 + ✦ = 黑色 _ = 青色 */ if (str.equals("_") && highlightingEnabled){ diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/StatusPane.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/StatusPane.java index fe1888329..14a0ecade 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/StatusPane.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/StatusPane.java @@ -267,6 +267,9 @@ public class StatusPane extends Component { //buffs.setPos( x + 31, y ); + //下半段 + puresoul.visible = false; + busy.x = x + bg.width + 1; busy.y = y + bg.height - 9; } else {