From c980f30602e9470c9f0eacab11c420f7c322a2a7 Mon Sep 17 00:00:00 2001 From: LingASDJ <2735951230@qq.com> Date: Tue, 1 Aug 2023 00:21:16 +0800 Subject: [PATCH] Update 0.6.4.0-Beta3 Add New Boss Fixed More Bug Balance Game --- .gitignore | 2 + .../java/com/watabou/noosa/ui/Component.java | 13 +- build.gradle | 4 +- .../main/assets/environment/tiles_ancient.png | Bin 42029 -> 42271 bytes core/src/main/assets/interfaces/happymode.png | Bin 990 -> 1456 bytes .../assets/messages/actors/actors.properties | 43 +- .../assets/messages/items/items.properties | 17 +- .../assets/messages/scenes/scenes.properties | 2 + .../src/main/assets/messages/ui/ui.properties | 2 + .../messages/windows/windows.properties | 15 +- .../main/assets/sprites/boss/IceSlowGirl.png | Bin 0 -> 3569 bytes .../main/assets/sprites/boss/RoomStone.png | Bin 1934 -> 1334 bytes .../main/assets/sprites/boss/SeaVastGirl.png | Bin 4344 -> 4207 bytes core/src/main/assets/sprites/items/items.png | Bin 85293 -> 85791 bytes .../shatteredpixeldungeon/Assets.java | 2 + .../shatteredpixeldungeon/BGMPlayer.java | 4 +- .../shatteredpixeldungeon/Badges.java | 29 +- .../shatteredpixeldungeon/Conducts.java | 3 +- .../shatteredpixeldungeon/Dungeon.java | 28 +- .../shatteredpixeldungeon/Statistics.java | 25 +- .../shatteredpixeldungeon/actors/Actor.java | 4 +- .../shatteredpixeldungeon/actors/Boss.java | 1 - .../actors/buffs/Cost.java | 2 - .../actors/hero/Belongings.java | 2 +- .../actors/hero/Hero.java | 17 +- .../actors/hero/HeroClass.java | 4 +- .../actors/mobs/Bestiary.java | 15 +- .../actors/mobs/Mob.java | 8 + .../actors/mobs/SlimeKing.java | 7 +- .../actors/mobs/YogDzewa.java | 260 +++++++--- .../actors/mobs/bosses/CrivusFruits.java | 9 + .../actors/mobs/bosses/DMZERO.java | 1 - .../actors/mobs/bosses/DictFish.java | 92 ++++ .../actors/mobs/bosses/RoomStone.java | 358 +++++++++++++ .../actors/mobs/bosses/SakaFishBoss.java | 179 ++++--- .../actors/mobs/bosses/v.java | 476 ------------------ .../actors/mobs/npcs/ImpShopkeeper.java | 20 + .../actors/mobs/npcs/Shopkeeper.java | 91 ++-- .../custom/testmode/MobPlacer.java | 103 ++-- .../items/Generator.java | 2 +- .../shatteredpixeldungeon/items/Gold.java | 2 +- .../shatteredpixeldungeon/items/Heap.java | 6 +- .../items/food/SakaMeat.java | 28 ++ .../items/quest/SakaFishSketon.java | 61 +++ .../items/weapon/melee/LockSword.java | 57 ++- .../items/weapon/melee/SkyShield.java | 1 + .../items/weapon/melee/WornShortsword.java | 4 +- .../levels/AncientMysteryCityBossLevel.java | 106 +++- .../levels/AncientMysteryCityLevel.java | 220 ++++++++ .../levels/ColdChestBossLevel.java | 2 +- .../levels/ForestBossLevel.java | 2 +- .../levels/LevelRules.java | 4 +- .../levels/RegularLevel.java | 9 +- .../levels/SokobanLayouts.java | 245 +++++++++ .../levels/rooms/special/TreasuryRoom.java | 3 +- .../scenes/GameScene.java | 54 +- .../scenes/InterlevelScene.java | 5 +- .../sprites/CharSprite.java | 2 +- .../sprites/IceSlowGirlSprites.java | 31 ++ .../sprites/ItemSpriteSheet.java | 5 + .../sprites/RoomStoneSprites.java | 49 +- .../sprites/SakaFishBossSprites.java | 2 +- .../sprites/SeaVastGirlSprites.java | 4 +- .../sprites/YogSprite.java | 39 +- .../ui/changelist/mlpd/vM0_6_7_X_Changes.java | 34 ++ .../windows/WndGame.java | 16 + .../windows/WndGoShop.java | 3 +- 67 files changed, 1995 insertions(+), 839 deletions(-) create mode 100644 core/src/main/assets/sprites/boss/IceSlowGirl.png create mode 100644 core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/bosses/DictFish.java create mode 100644 core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/bosses/RoomStone.java delete mode 100644 core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/bosses/v.java create mode 100644 core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/food/SakaMeat.java create mode 100644 core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/quest/SakaFishSketon.java create mode 100644 core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/AncientMysteryCityLevel.java create mode 100644 core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/SokobanLayouts.java create mode 100644 core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/IceSlowGirlSprites.java diff --git a/.gitignore b/.gitignore index efecd5748..cbdd88943 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,8 @@ *.apk *.smali +*.hprof + # Files for the Dalvik VM *.dex diff --git a/SPD-classes/src/main/java/com/watabou/noosa/ui/Component.java b/SPD-classes/src/main/java/com/watabou/noosa/ui/Component.java index 4b26b7685..8381fe109 100644 --- a/SPD-classes/src/main/java/com/watabou/noosa/ui/Component.java +++ b/SPD-classes/src/main/java/com/watabou/noosa/ui/Component.java @@ -42,6 +42,8 @@ public class Component extends Group { return this; } + public final Component setX( float x ) { return setPos(x, y); } + public final Component setY( float y ) { return setPos(x, y); } public Component setSize( float width, float height ) { this.width = width; @@ -51,14 +53,13 @@ public class Component extends Group { return this; } + public final Component setHeight( float height ) { return setSize(width, height); } + public final Component setWidth( float width ) { return setSize(width, height); } + public Component setRect( float x, float y, float width, float height ) { this.x = x; this.y = y; - this.width = width; - this.height = height; - layout(); - - return this; + return setSize(width, height); } public boolean inside( float x, float y ) { @@ -106,4 +107,4 @@ public class Component extends Group { protected void layout() { } -} +} \ No newline at end of file diff --git a/build.gradle b/build.gradle index 77ec22b24..0d651c746 100644 --- a/build.gradle +++ b/build.gradle @@ -18,8 +18,8 @@ allprojects { appName = 'Magic Ling Pixel Dungeon' appPackageName = 'com.ansdomagiclingpixeldungeon.ling' - appVersionCode =901000 - appVersionName = '0.6.4.0-Beta1' + appVersionCode =901200 + appVersionName = '0.6.4.0-Beta3' appJavaCompatibility = JavaVersion.VERSION_11 diff --git a/core/src/main/assets/environment/tiles_ancient.png b/core/src/main/assets/environment/tiles_ancient.png index 42db7a6d8f0470a5a5101be3353d42e6f3df996a..8977b16b95296913fa3f29e1934a8fa465295508 100644 GIT binary patch literal 42271 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%0A@3rn#?(h0+ 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 diff --git a/core/src/main/assets/interfaces/happymode.png b/core/src/main/assets/interfaces/happymode.png index fa985ca5d98f2d369864338d11d33bc015120581..5b9f98858021894e33d703b81eb3c618cda42920 100644 GIT binary patch delta 1439 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 diff --git a/core/src/main/assets/sprites/boss/SeaVastGirl.png b/core/src/main/assets/sprites/boss/SeaVastGirl.png index 00991bca04dee2b31aa70ab8ea1e6d9bdbd23974..c53c9e8fa27a5bc94afb49a5ee87b2c1a9550691 100644 GIT binary patch literal 4207 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 FV1nmVTIm1) literal 4344 zcmVA|_AcRV!BtT=LfvA7b0RNz3 zYhn`!sRU3&6eD15frzDqhxSEDSfD_8Y~Q7|OCQ4ZeCF);?(fc?bMCpXwyRF|-kEb| z=KK52Z+^e;nK|d&ZF2ul1I_}^ZzvR|jA&|Vl;YrnU5yO&eRG?0mrZD#j*S|-#eHB^ zYzLjI=XfGJT`ydlM>b#h<-1-hOdQ+c#H;U^d6ymYWOa0YgUAOnV)MKlU{+7TE8DUn zoiW*oLEUsAR`W$HX?0eL}f;kF~P7=l1!&OX&Y&C${?Y z5En9a;mETR#Woj?-sSf9Y;i}l9OrSCy*8vowKV%kFXkHZ`s%64Boh)<^GDlD@S6v> zxRJ*0e_jsGfJh2d+a|8b_syj3Sb47-JZzNj z5IV%6jF0ZM+DE~rKnsZgLZePsaLDQ#w>(!gZkj{?;4g(jh*j(q6v8v$-7F${0xa^{|gtM%YDLJ`sUz@$md}i&yTiT`@mbz>DaF zW$m6+9y0!#LZzfqjudOP5B`C!cJ*gB^R%zr=DOc|Q&p+> zmFh3zV(VCLYZ%Rszh7m^3WYT1Mdf-6R(~xXsQS@kn+p4yTm8z&u85MziuNL`j<#dn zDWBy`|1{7@t4L7cgyGZ-568AnVYd$&el-s9zlu-LkwU`a9CKh-2$eWAWLPe6kYQ6L z__kl3a;5Xj%G(BKC_}5OpFG^u|N;9|-*kz9ho3j$A z$4tDs*i;wN&_B!J76DA568(u0$u4Ir;Yw7V_!7RbA+3mH7C zKj+1yt*oSj2#aHpmR-H6-Jz0~5S9#T4T+*m$k^er$`eON^d6;^uf;cl@0;8ASG-r8_tWOMhhNA*^s53W_iwN1k(y-}0nwrI44DAgeq9FMMHS z$*ITuN{-ECFZoj_C$E26%%pONt2SBqk1V>???Sj>W6w1Eob|&G3U=;?iZ*G4Xvr$Xm+th>!cWq_9`-@5Qr118B(h4oVEp-a z@s@{irv-~-DIleTY?T!-!q*B~eZ#!o_ObX{U2)HfWcB7auYb}uEj3bq$wUTa5m)G+ z)X7If|I`I0y2m-!ZVR~$pa&!NsbEN0V3TZo#%KDzwZh`ep}NW{Sz*bbC~TczRP;1= zee@s(BffFMOkbXL%(L#n9p^dfF8O@?m=(vOFDcyeSZwO6#kU5xgeZqga)L_qxA^E8 z%HSNS8vWy*>E9xhY64OYokUtV^s;BVi-95yl5CY0FzS<)+c~bMeekQFK2)mzg=e2! zyolzV-z?p!Yn1+>T;$YZpG7Yg3c8Q=Nsn`S=W1wSZ&B2VpK2~yVHGP(K{0Ah9rD}4 z!>qC_IrU)`b?wNto}_34S#|!V%}v?=tnYH>f>a#&)TxsefZ(7VwcxnU!SOd8op$t;n!*(oEV}KSrL%mp5E?1GpEMeaAc_5+8V#h zqhoGZCy|u~{EP3k`>h8y;!`QUaL6GLyV}(iUbay%*290ay3+hg|1|%p);}4S^e1lw zJ~BwP+9&dVR#|?v6eGspJDZyQdse(_WzVOTi6ec|+8k=p(5$L0j4ZnRtdX;Tk;D@)}h|HYtU%KD4P-|L~Or$=$MjZ|A=U>8P??tF_8{9k|y02ulWKYq0M5$GlNdr=_*sT|9D2 zaT`ea3pe~eQ&YR0q9NF|;FlxBa`=ov+gQq#>aQ^nkoB-nXgr8StEzehd?-Wq=X|vR z!vhbIpzt9^>>{#ybb0Om1Ge6|k{soYus_(cPb2V!&D_?C&rX085)5QDw58eY?CIMc z#x4IlzDo$p8dSrBv`EwDJ?_49-*$iH#2M3q9a7<{m_%0Aq4VHhHhYemmE_ucTN%<_ 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%0AIo+%_ZN2itjP+deEvAIMpuv^HQjwtO6J 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 diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Assets.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Assets.java index 96b9b47bf..f9e43c431 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Assets.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Assets.java @@ -319,6 +319,8 @@ public class Assets { public static final String ROOMSTONE = "sprites/boss/RoomStone.png"; public static final String VSGR = "sprites/boss/SeaVastGirl.png"; + public static final String SXGR = "sprites/boss/IceSlowGirl.png"; + public static final String SKFS = "sprites/boss/SakaFishBoss.png"; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/BGMPlayer.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/BGMPlayer.java index 3bf86a1cf..0dd3cc2ac 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/BGMPlayer.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/BGMPlayer.java @@ -34,7 +34,7 @@ public class BGMPlayer { if (d == -1) { playBGM(Assets.SNOWCYON, true); }else if (d == 0||d==27) { - playBGM(Assets.SKBJY, true); + playBGM(Assets.SNOWCYON, true); } else if (d > 0 && d <= 5) { playBGM(Assets.BGM_1, true); } else if (d > 5 && d <= 10) { @@ -163,6 +163,8 @@ public class BGMPlayer { playBGM(Assets.BGM_BOSSE, true); } else if (Dungeon.bossLevel() && t == -15) { playBGM(Assets.BGM_FRBOSS, true); + } else if (Dungeon.bossLevel() && t == -31) { + playBGM(Assets.SKBJY, true); } } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Badges.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Badges.java index 466387fe5..fd86d88e8 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Badges.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Badges.java @@ -765,7 +765,7 @@ public class Badges { private static void validateAMZ() { if (global.contains( Badge.KILL_APPLE ) &&global.contains( Badge.KILL_DM720 ) && - global.contains( Badge.KILL_MG) && global.contains( Badge.FIREGIRL) && global.contains( Badge.DRAWF_HEAD)) { + global.contains( Badge.KILL_MG) && global.contains( Badge.FIREGIRL) && global.contains( Badge.DRAWF_HEAD) && global.contains( Badge.SAKA_DIED)) { Badge badge = Badge.SPICEALBOSS; displayBadge( badge ); @@ -945,6 +945,14 @@ public class Badges { } } + public void Test(){ + + } + + public int Tests(){ + return 4; + } + public static void validateVictory() { Badge badge = Badge.VICTORY; @@ -1030,6 +1038,15 @@ public class Badges { validateAMZ(); } + public static void KILLSAKA() { + displayBadge( Badge.SAKA_DIED); + validateAMZ(); + } + + public static void REHOMESKY() { + displayBadge( Badge.RESET_DAY ); + } + public static void STORM() { displayBadge( Badge.STORM); } @@ -1091,22 +1108,22 @@ public class Badges { public static void validateChampion( int challenges ) { if (challenges == 0) return; Badge badge = null; - if (challenges >= 1 && !(Dungeon.isChallenged(PRO))) { + if (challenges >= 1 && !(Dungeon.isChallenged(PRO)) || !Statistics.happyMode) { badge = Badge.CHAMPION_1X; } - if (challenges >= 3 && !(Dungeon.isChallenged(PRO))){ + if (challenges >= 3 && !(Dungeon.isChallenged(PRO))|| !Statistics.happyMode){ addGlobal(badge); badge = Badge.CHAMPION_2X; } - if (challenges >= 6 && !(Dungeon.isChallenged(PRO))){ + if (challenges >= 6 && !(Dungeon.isChallenged(PRO))|| !Statistics.happyMode){ addGlobal(badge); badge = Badge.CHAMPION_3X; } - if (challenges >= 8 && !(Dungeon.isChallenged(PRO))){ + if (challenges >= 8 && !(Dungeon.isChallenged(PRO))||!Statistics.happyMode){ addGlobal(badge); badge = Badge.CHAMPION_4X; } - if (challenges >= 10 && !(Dungeon.isChallenged(PRO))){ + if (challenges >= 10 && !(Dungeon.isChallenged(PRO))||!Statistics.happyMode){ addGlobal(badge); badge = Badge.CHAMPION_5X; } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Conducts.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Conducts.java index 3ef248416..c70d933e4 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Conducts.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Conducts.java @@ -10,7 +10,8 @@ import java.util.Arrays; public class Conducts { public enum Conduct { NULL, - BOSSRUSH(1.2f); + BOSSRUSH(1.2f), + MONEYLETGO(1.5f); public float scoreMod; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Dungeon.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Dungeon.java index 5705513fe..64f288cfe 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Dungeon.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Dungeon.java @@ -58,6 +58,8 @@ import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfRegrowth; import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfWarding; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.MagicTorch; import com.shatteredpixel.shatteredpixeldungeon.journal.Notes; +import com.shatteredpixel.shatteredpixeldungeon.levels.AncientMysteryCityBossLevel; +import com.shatteredpixel.shatteredpixeldungeon.levels.AncientMysteryCityLevel; import com.shatteredpixel.shatteredpixeldungeon.levels.DeadEndLevel; import com.shatteredpixel.shatteredpixeldungeon.levels.Level; import com.shatteredpixel.shatteredpixeldungeon.levels.LinkLevel; @@ -126,16 +128,36 @@ public class Dungeon { Dungeon.level = null; Actor.clear(); - depth = -20; + depth = -30; if (depth > Statistics.realdeepestFloor) { Statistics.realdeepestFloor = depth;} Level level; - level = new ShopBossLevel(); + level = new AncientMysteryCityLevel(); level.create(); + Statistics.qualifiedForNoKilling = !bossLevel(); + return level; + } + + //远古领袖 + public static Level AncityBossWaterLevel(){ + + + Dungeon.level = null; + Actor.clear(); + + depth = -31; + + if (depth > Statistics.realdeepestFloor) { + Statistics.realdeepestFloor = depth;} + + Level level; + level = new AncientMysteryCityBossLevel(); + + level.create(); Statistics.qualifiedForNoKilling = !bossLevel(); return level; @@ -491,7 +513,7 @@ public class Dungeon { } public static boolean bossLevel( int depth ) { - return depth == 5 || depth == 10 || depth == 15 || depth == 20 || depth == 25|| depth == -15; + return depth == 5 || depth == 10 || depth == 15 || depth == 20 || depth == 25|| depth == -15| depth == -31; } public static void switchLevel( final Level level, int pos ) { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Statistics.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Statistics.java index 6ce02ebce..dbf249387 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Statistics.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Statistics.java @@ -29,6 +29,10 @@ public class Statistics { //统计分数 public static int progressScore; + public static boolean happyMode = false; + + //萨卡班甲鱼二阶段 + public static int sakaBackStage; public static int readBooks; public static int treasureScore; public static SparseArray floorsExplored = new SparseArray<>(); @@ -118,13 +122,16 @@ public class Statistics { public static boolean TryUsedAnmy= false; public static void reset() { - - boss_enhance = 0; ChaicBlood = 0; readBooks = 0; HealingIsDied = 0; + happyMode = false; + + //萨卡班甲鱼二阶段 + sakaBackStage = 0; + goldCollected = 0; deepestFloor = -1; enemiesSlain = 0; @@ -159,8 +166,10 @@ public class Statistics { lanterfireactive = false; bugsyncfixed = false; + crivusfruitslevel2 = false; TPDoorDieds = false; + TryUsedAnmy = false; second_elapsed = 0f; @@ -184,6 +193,7 @@ public class Statistics { } private static final String GOLD = "score"; + private static final String HAPPY = "happy"; private static final String DEEPEST = "maxDepth"; private static final String SLAIN = "enemiesSlain"; private static final String FOOD = "foodEaten"; @@ -265,6 +275,8 @@ public class Statistics { private static final String READBOOKS = "readbooks"; + private static final String SAKATWO = "sakatwo"; + public static void storeInBundle( Bundle bundle ) { @@ -282,6 +294,9 @@ public class Statistics { bundle.put( READBOOKS, readBooks); bundle.put( EXPL_SCORE, exploreScore ); + + bundle.put( HAPPY, happyMode ); + bundle.put( BOSS_SCORES, bossScores ); bundle.put( TOT_BOSS, totalBossScore ); bundle.put( QUEST_SCORES,questScores ); @@ -343,6 +358,8 @@ public class Statistics { bundle.put( ENBR, endingbald ); + bundle.put( SAKATWO, sakaBackStage ); + //SPD bundle.put("real_time_passed", second_elapsed); bundle.put("real_seconds_passed", real_seconds); @@ -358,6 +375,8 @@ public class Statistics { readBooks = bundle.getInt( READBOOKS ); + sakaBackStage = bundle.getInt( SAKATWO ); + //分数 progressScore = bundle.getInt( PROG_SCORE ); heldItemValue = bundle.getInt( ITEM_VAL ); @@ -382,7 +401,7 @@ public class Statistics { highestAscent = bundle.getInt( HIGHEST ); gameWon = bundle.getBoolean( WON ); ascended = bundle.getBoolean( ASCENDED ); - + happyMode = bundle.getBoolean(HAPPY); dimandchestmazeCollected = bundle.getInt(DDK); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/Actor.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/Actor.java index 496be1df9..1273b04c0 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/Actor.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/Actor.java @@ -33,7 +33,9 @@ import com.watabou.utils.SparseArray; import java.util.HashSet; public abstract class Actor implements Bundlable { - + public static synchronized Class getCurrentActorClass(){ + return current == null ? null:current.getClass(); + } public static final float TICK = 1f; protected Bundle upgrades; protected Bundle crafted; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/Boss.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/Boss.java index 423c12838..6f8d76e38 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/Boss.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/Boss.java @@ -8,7 +8,6 @@ import com.shatteredpixel.shatteredpixeldungeon.items.weapon.enchantments.Grim; import com.watabou.utils.Random; public class Boss extends Mob { - protected static float baseMin; //最小伤害 protected static float baseMax; //最大伤害 protected static float baseAcc; //命中率 diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Cost.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Cost.java index 89e30f06c..498391739 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Cost.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Cost.java @@ -6,8 +6,6 @@ import com.watabou.utils.Bundle; public class Cost extends Buff { - - { type = buffType.POSITIVE; } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Belongings.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Belongings.java index 47c22882a..a2c27d679 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Belongings.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Belongings.java @@ -171,7 +171,7 @@ public class Belongings implements Iterable { if (bundle.contains( ARMOR )){ Armor armor = ((Armor)bundle.get( ARMOR )); if (armor instanceof ClassArmor){ - info.armorTier = 6; + info.armorTier = 7; } else { info.armorTier = armor.tier; } 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 e1ab2f940..39eb82d76 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 @@ -27,6 +27,7 @@ import static com.shatteredpixel.shatteredpixeldungeon.Challenges.PRO; import static com.shatteredpixel.shatteredpixeldungeon.Difficulty.DifficultyConduct.HARD; import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.hero; import static com.shatteredpixel.shatteredpixeldungeon.SPDSettings.HelpSettings; +import static com.shatteredpixel.shatteredpixeldungeon.Statistics.happyMode; import static com.shatteredpixel.shatteredpixeldungeon.Statistics.lanterfireactive; import static com.shatteredpixel.shatteredpixeldungeon.Statistics.tipsgodungeon; import static com.shatteredpixel.shatteredpixeldungeon.levels.Level.set; @@ -145,6 +146,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfHealing; import com.shatteredpixel.shatteredpixeldungeon.items.potions.elixirs.ElixirOfMight; import com.shatteredpixel.shatteredpixeldungeon.items.potions.exotic.PotionOfDivineInspiration; import com.shatteredpixel.shatteredpixeldungeon.items.quest.MIME; +import com.shatteredpixel.shatteredpixeldungeon.items.quest.SakaFishSketon; import com.shatteredpixel.shatteredpixeldungeon.items.rings.RingOfAccuracy; import com.shatteredpixel.shatteredpixeldungeon.items.rings.RingOfEvasion; import com.shatteredpixel.shatteredpixeldungeon.items.rings.RingOfForce; @@ -955,7 +957,7 @@ public class Hero extends Char { } ///测试坐标用 - GLog.w(String.valueOf(hero.pos)); +// GLog.w(String.valueOf(hero.pos)); //携带该物品时,玩家血量低于一半后自动隐身一段回合。 //actMove实现 @@ -971,7 +973,13 @@ public class Hero extends Char { if ((Dungeon.challenges & ch) != 0) chCount++; } - //icehp++; + + // 深度调查 + if ((Dungeon.isDLC(Conducts.Conduct.BOSSRUSH) || Dungeon.isDLC(Conducts.Conduct.MONEYLETGO)) && !happyMode) { + happyMode = true; + GLog.n(Messages.get(WndStory.class, "letsplay")); + } + if(chCount >= 3 && !lanterfireactive && !Dungeon.isChallenged(PRO) || Dungeon.isChallenged(DHXD) && !lanterfireactive){ //TODO 灯火前行 @@ -1312,6 +1320,10 @@ public class Hero extends Char { if (Dungeon.depth == 0) { + if (belongings.getItem(SakaFishSketon.class) != null) { + Badges.REHOMESKY(); + } + if (belongings.getItem(Amulet.class) == null) { Game.runOnRenderThread(new Callback() { @Override @@ -1960,7 +1972,6 @@ public class Hero extends Char { for (Mob mob : Dungeon.level.mobs.toArray(new Mob[0])){ if (mob instanceof BlackSoul) { Buff.affect( mob, Dread.class ); - Buff.prolong(mob, AnkhInvulnerability.class, 200f); } } 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 9a883764b..ca5ca051e 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 @@ -65,6 +65,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.bags.KingBag; import com.shatteredpixel.shatteredpixeldungeon.items.bags.VelvetPouch; import com.shatteredpixel.shatteredpixeldungeon.items.books.bookslist.BrokenBooks; import com.shatteredpixel.shatteredpixeldungeon.items.books.bookslist.DimandBook; +import com.shatteredpixel.shatteredpixeldungeon.items.books.bookslist.IceCityBooks; import com.shatteredpixel.shatteredpixeldungeon.items.books.bookslist.TestBooks; import com.shatteredpixel.shatteredpixeldungeon.items.books.bookslist.YellowSunBooks; import com.shatteredpixel.shatteredpixeldungeon.items.food.Food; @@ -205,7 +206,8 @@ public enum HeroClass { new KingBag().quantity(1).identify().collect(); new PotionOfLiquidFlameX().quantity(100).identify().collect(); new YellowSunBooks().quantity(1).identify().collect(); - new BrokenBooks().quantity(44).identify().collect(); + new BrokenBooks().quantity(12).identify().collect(); + new IceCityBooks().quantity(12).identify().collect(); new ScrollOfFlameCursed().quantity(44).identify().collect(); new LeatherArmor().quantity(1).identify().collect(); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Bestiary.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Bestiary.java index ff4bce87d..993edca9d 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Bestiary.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Bestiary.java @@ -102,9 +102,8 @@ public class Bestiary { DM100.class, BlackHost.class)); case 2: return new ArrayList<>(Arrays.asList( - Elemental.random(), - Monk.class,FireGhost.class, - Warlock.class,Random.NormalFloat(1,6)>=3 ? BruteBot.class : Warlock.class)); + Monk.class, + Warlock.class)); case 3: return new ArrayList<>(Arrays.asList( Elemental.random(), @@ -135,19 +134,15 @@ public class Bestiary { case 2: return new ArrayList<>(Arrays.asList( Succubus.class, - Eye.class,ShieldHuntsman.class,Scorpio.class,Monk.class, + Scorpio.class,Monk.class, Golem.class)); case 3: return new ArrayList<>(Arrays.asList( - Succubus.class, Succubus.class, Succubus.class, - Succubus.class, Succubus.class, - Eye.class,ShieldHuntsman.class,Albino.class,Monk.class, + Fire_Scorpio.class,Albino.class,Monk.class, Golem.class)); case 4: return new ArrayList<>(Arrays.asList( - Succubus.class, - Succubus.class, - Eye.class,ShieldHuntsman.class, + ShieldHuntsman.class, Monk.class, Golem.class)); case 5: diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Mob.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Mob.java index a0cddb8ff..f2738bec0 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Mob.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Mob.java @@ -31,6 +31,7 @@ import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.BGMPlayer; import com.shatteredpixel.shatteredpixeldungeon.Badges; import com.shatteredpixel.shatteredpixeldungeon.Challenges; +import com.shatteredpixel.shatteredpixeldungeon.Conducts; import com.shatteredpixel.shatteredpixeldungeon.Difficulty; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.Statistics; @@ -869,6 +870,13 @@ public abstract class Mob extends Char { EXP /= 2; } + //黄金时代所有怪物都可能会掉落金币 + if(Dungeon.isDLC(Conducts.Conduct.MONEYLETGO) && Dungeon.hero.lvl <= maxLvl && alignment == Alignment.ENEMY){ + if(Random.Int(100) == 50-Dungeon.depth/5){ + Dungeon.level.drop( ( new Gold().random() ), pos ).sprite.drop(); + } + } + if (alignment == Alignment.ENEMY){ rollToDropLoot(); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/SlimeKing.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/SlimeKing.java index 9a1202ef7..b6ce006fb 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/SlimeKing.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/SlimeKing.java @@ -61,8 +61,7 @@ public class SlimeKing extends Mob { private boolean PartCold = false; - private static final String partcold = "partcold"; - private static final String chainsused = "chainsused"; + @Override @@ -94,6 +93,10 @@ public class SlimeKing extends Mob { return super.defenseProc(enemy, damage); } + + private static final String partcold = "partcold"; + private static final String chainsused = "chainsused"; + @Override public void storeInBundle(Bundle bundle) { super.storeInBundle(bundle); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/YogDzewa.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/YogDzewa.java index 41c94336a..228c21f5e 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/YogDzewa.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/YogDzewa.java @@ -1,33 +1,6 @@ -/* - * Pixel Dungeon - * Copyright (C) 2012-2015 Oleg Dolya - * - * Shattered Pixel Dungeon - * Copyright (C) 2014-2022 Evan Debenham - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see - */ - package com.shatteredpixel.shatteredpixeldungeon.actors.mobs; -import static com.shatteredpixel.shatteredpixeldungeon.Challenges.AQUAPHOBIA; -import static com.shatteredpixel.shatteredpixeldungeon.Challenges.EXSG; -import static com.shatteredpixel.shatteredpixeldungeon.Challenges.RLPT; -import static com.shatteredpixel.shatteredpixeldungeon.Challenges.SBSG; - import com.shatteredpixel.shatteredpixeldungeon.Assets; -import com.shatteredpixel.shatteredpixeldungeon.Badges; import com.shatteredpixel.shatteredpixeldungeon.Challenges; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.Statistics; @@ -37,34 +10,43 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Amok; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Charm; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Dread; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Frost; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Invisibility; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Light; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.LockedFloor; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Paralysis; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Sleep; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Terror; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Vertigo; +import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.Sheep; +import com.shatteredpixel.shatteredpixeldungeon.effects.Beam; import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter; import com.shatteredpixel.shatteredpixeldungeon.effects.Pushing; +import com.shatteredpixel.shatteredpixeldungeon.effects.TargetedCell; +import com.shatteredpixel.shatteredpixeldungeon.effects.particles.PurpleParticle; import com.shatteredpixel.shatteredpixeldungeon.effects.particles.ShadowParticle; import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.DriedRose; import com.shatteredpixel.shatteredpixeldungeon.levels.Level; +import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.LarvaSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.YogSprite; +import com.shatteredpixel.shatteredpixeldungeon.tiles.DungeonTilemap; import com.shatteredpixel.shatteredpixeldungeon.ui.BossHealthBar; import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; import com.watabou.noosa.Game; import com.watabou.noosa.audio.Music; import com.watabou.utils.Bundle; import com.watabou.utils.Callback; +import com.watabou.utils.GameMath; import com.watabou.utils.PathFinder; import com.watabou.utils.Random; import com.watabou.utils.Reflection; import java.util.ArrayList; import java.util.Collections; +import java.util.HashSet; public class YogDzewa extends Mob { @@ -108,21 +90,22 @@ public class YogDzewa extends Mob { private ArrayList fistSummons = new ArrayList<>(); private ArrayList challengeSummons = new ArrayList<>(); { - Random.pushGenerator(Dungeon.seedCurDepth()); - fistSummons.add(Random.Int(2) == 0 ? YogFist.BurningFist.class : YogFist.SoiledFist.class); - fistSummons.add(Random.Int(2) == 0 ? YogFist.RottingFist.class : YogFist.RustedFist.class); - fistSummons.add(Random.Int(2) == 0 ? YogFist.BrightFist.class : YogFist.DarkFist.class); - Random.shuffle(fistSummons); - //randomly place challenge summons so that two fists of a pair can never spawn together - if (Random.Int(2) == 0){ - challengeSummons.add(getPairedFist(fistSummons.get(1))); - challengeSummons.add(getPairedFist(fistSummons.get(2))); - challengeSummons.add(getPairedFist(fistSummons.get(0))); - } else { - challengeSummons.add(getPairedFist(fistSummons.get(2))); - challengeSummons.add(getPairedFist(fistSummons.get(0))); - challengeSummons.add(getPairedFist(fistSummons.get(1))); - } + //offset seed slightly to avoid output patterns + Random.pushGenerator(Dungeon.seedCurDepth()+1); + fistSummons.add(Random.Int(2) == 0 ? YogFist.BurningFist.class : YogFist.SoiledFist.class); + fistSummons.add(Random.Int(2) == 0 ? YogFist.RottingFist.class : YogFist.RustedFist.class); + fistSummons.add(Random.Int(2) == 0 ? YogFist.BrightFist.class : YogFist.DarkFist.class); + Random.shuffle(fistSummons); + //randomly place challenge summons so that two fists of a pair can never spawn together + if (Random.Int(2) == 0){ + challengeSummons.add(getPairedFist(fistSummons.get(1))); + challengeSummons.add(getPairedFist(fistSummons.get(2))); + challengeSummons.add(getPairedFist(fistSummons.get(0))); + } else { + challengeSummons.add(getPairedFist(fistSummons.get(2))); + challengeSummons.add(getPairedFist(fistSummons.get(0))); + challengeSummons.add(getPairedFist(fistSummons.get(1))); + } Random.popGenerator(); } @@ -132,15 +115,14 @@ public class YogDzewa extends Mob { for (int i = 0; i < 6; i++){ if (i >= 4){ regularSummons.add(YogRipper.class); - } - if (i >= Statistics.spawnersAlive){ + } else if (i >= Statistics.spawnersAlive){ regularSummons.add(Larva.class); } else { regularSummons.add( i % 2 == 0 ? YogEye.class : YogScorpio.class); } } } else { - for (int i = 0; i < 6; i++){ + for (int i = 0; i < 4; i++){ if (i >= Statistics.spawnersAlive){ regularSummons.add(Larva.class); } else { @@ -153,6 +135,11 @@ public class YogDzewa extends Mob { private ArrayList targetedCells = new ArrayList<>(); + @Override + public int attackSkill(Char target) { + return INFINITE_ACCURACY; + } + @Override protected boolean act() { //char logic @@ -163,6 +150,9 @@ public class YogDzewa extends Mob { throwItems(); + sprite.hideAlert(); + sprite.hideLost(); + //mob logic enemy = chooseEnemy(); @@ -182,6 +172,7 @@ public class YogDzewa extends Mob { yell(Messages.get(this, "hope")); summonCooldown = -15; //summon a burst of minions! phase = 5; + BossHealthBar.bleed(true); } if (phase == 0){ @@ -189,7 +180,100 @@ public class YogDzewa extends Mob { return true; } else { + boolean terrainAffected = false; + HashSet affected = new HashSet<>(); + //delay fire on a rooted hero + if (!Dungeon.hero.rooted) { + for (int i : targetedCells) { + Ballistica b = new Ballistica(pos, i, Ballistica.WONT_STOP); + //shoot beams + sprite.parent.add(new Beam.DeathRay(sprite.center(), DungeonTilemap.raisedTileCenterToWorld(b.collisionPos))); + for (int p : b.path) { + Char ch = Actor.findChar(p); + if (ch != null && (ch.alignment != alignment || ch instanceof Bee)) { + affected.add(ch); + } + if (Dungeon.level.flamable[p]) { + Dungeon.level.destroy(p); + GameScene.updateMap(p); + terrainAffected = true; + } + } + } + if (terrainAffected) { + Dungeon.observe(); + } + Invisibility.dispel(this); + for (Char ch : affected) { + if (ch == Dungeon.hero) { + Statistics.bossScores[4] -= 500; + } + + if (hit( this, ch, true )) { + if (Dungeon.isChallenged(Challenges.STRONGER_BOSSES)) { + ch.damage(Random.NormalIntRange(30, 50), new Eye.DeathGaze()); + } else { + ch.damage(Random.NormalIntRange(20, 30), new Eye.DeathGaze()); + } + if (Dungeon.level.heroFOV[pos]) { + ch.sprite.flash(); + CellEmitter.center(pos).burst(PurpleParticle.BURST, Random.IntRange(1, 2)); + } + } else { + ch.sprite.showStatus( CharSprite.NEUTRAL, ch.defenseVerb() ); + } + } + targetedCells.clear(); + } + + if (abilityCooldown <= 0){ + + int beams = 1 + (HT - HP)/400; + HashSet affectedCells = new HashSet<>(); + for (int i = 0; i < beams; i++){ + + int targetPos = Dungeon.hero.pos; + if (i != 0){ + do { + targetPos = Dungeon.hero.pos + PathFinder.NEIGHBOURS8[Random.Int(8)]; + } while (Dungeon.level.trueDistance(pos, Dungeon.hero.pos) + > Dungeon.level.trueDistance(pos, targetPos)); + } + targetedCells.add(targetPos); + Ballistica b = new Ballistica(pos, targetPos, Ballistica.WONT_STOP); + affectedCells.addAll(b.path); + } + + //remove one beam if multiple shots would cause every cell next to the hero to be targeted + boolean allAdjTargeted = true; + for (int i : PathFinder.NEIGHBOURS9){ + if (!affectedCells.contains(Dungeon.hero.pos + i) && Dungeon.level.passable[Dungeon.hero.pos + i]){ + allAdjTargeted = false; + break; + } + } + if (allAdjTargeted){ + targetedCells.remove(targetedCells.size()-1); + } + for (int i : targetedCells){ + Ballistica b = new Ballistica(pos, i, Ballistica.WONT_STOP); + for (int p : b.path){ + sprite.parent.add(new TargetedCell(p, 0xFF0000)); + affectedCells.add(p); + } + } + + //don't want to overly punish players with slow move or attack speed + spend(GameMath.gate(TICK, Dungeon.hero.cooldown(), 3*TICK)); + Dungeon.hero.interrupt(); + + abilityCooldown += Random.NormalFloat(MIN_ABILITY_CD, MAX_ABILITY_CD); + abilityCooldown -= (phase - 1); + + } else { + spend(TICK); + } while (summonCooldown <= 0){ @@ -206,11 +290,26 @@ public class YogDzewa extends Mob { } } + //if no other valid spawn spots exist, try to kill an adjacent sheep to spawn anyway + if (spawnPos == -1){ + for (int i : PathFinder.NEIGHBOURS8){ + if (Actor.findChar(pos+i) instanceof Sheep){ + if (spawnPos == -1 || Dungeon.level.trueDistance(Dungeon.hero.pos, spawnPos) > Dungeon.level.trueDistance(Dungeon.hero.pos, pos+i)){ + spawnPos = pos + i; + } + } + } + if (spawnPos != -1){ + Actor.findChar(spawnPos).die(null); + } + } + if (spawnPos != -1) { summon.pos = spawnPos; GameScene.add( summon ); Actor.addDelayed( new Pushing( summon, pos, summon.pos ), -1 ); summon.beckon(Dungeon.hero.pos); + Dungeon.level.occupyCell(summon); summonCooldown += Random.NormalFloat(MIN_SUMMON_CD, MAX_SUMMON_CD); summonCooldown -= (phase - 1); @@ -245,7 +344,7 @@ public class YogDzewa extends Mob { @Override public boolean isInvulnerable(Class effect) { - return phase == 0 || findFist() != null; + return phase == 0 || findFist() != null || super.isInvulnerable(effect); } @Override @@ -292,7 +391,10 @@ public class YogDzewa extends Mob { } LockedFloor lock = Dungeon.hero.buff(LockedFloor.class); - if (lock != null) lock.addTime(dmgTaken); + if (lock != null){ + if (Dungeon.isChallenged(Challenges.STRONGER_BOSSES)) lock.addTime(dmgTaken/3f); + else lock.addTime(dmgTaken/2f); + } } @@ -309,18 +411,23 @@ public class YogDzewa extends Mob { int targetPos = Dungeon.level.exit + Dungeon.level.width(); if (!Dungeon.isChallenged(Challenges.STRONGER_BOSSES) - && Actor.findChar(targetPos) == null){ + && (Actor.findChar(targetPos) == null || Actor.findChar(targetPos) instanceof Sheep)){ fist.pos = targetPos; - } else if (Actor.findChar(targetPos-1) == null){ + } else if (Actor.findChar(targetPos-1) == null || Actor.findChar(targetPos-1) instanceof Sheep){ fist.pos = targetPos-1; - } else if (Actor.findChar(targetPos+1) == null){ + } else if (Actor.findChar(targetPos+1) == null || Actor.findChar(targetPos+1) instanceof Sheep){ fist.pos = targetPos+1; - } else if (Actor.findChar(targetPos) == null){ + } else if (Actor.findChar(targetPos) == null || Actor.findChar(targetPos) instanceof Sheep){ fist.pos = targetPos; } + if (Actor.findChar(fist.pos) instanceof Sheep){ + Actor.findChar(fist.pos).die(null); + } + GameScene.add(fist, 4); Actor.addDelayed( new Pushing( fist, Dungeon.level.exit, fist.pos ), -1 ); + Dungeon.level.occupyCell(fist); } public void updateVisibility( Level level ){ @@ -355,7 +462,7 @@ public class YogDzewa extends Mob { public void aggro(Char ch) { for (Mob mob : (Iterable)Dungeon.level.mobs.clone()) { if (Dungeon.level.distance(pos, mob.pos) <= 4 && - (mob instanceof Larva || mob instanceof RipperDemon)) { + (mob instanceof Larva || mob instanceof YogRipper || mob instanceof YogEye || mob instanceof YogScorpio)) { mob.aggro(ch); } } @@ -366,35 +473,20 @@ public class YogDzewa extends Mob { public void die( Object cause ) { for (Mob mob : (Iterable)Dungeon.level.mobs.clone()) { - if (mob instanceof Larva || mob instanceof RipperDemon) { + if (mob instanceof Larva || mob instanceof YogRipper || mob instanceof YogEye || mob instanceof YogScorpio) { mob.die( cause ); } } - if(Dungeon.isChallenged(RLPT)){ - Badges.GOODRLPT(); - } - - if(Dungeon.isChallenged(AQUAPHOBIA)){ - Badges.CLEARWATER(); - } - - if(Dungeon.isChallenged(SBSG)){ - Badges.BIGX(); - } - - if(Dungeon.isChallenged(EXSG)){ - Badges.EXSG(); - } - - - updateVisibility(Dungeon.level); GameScene.bossSlain(); + + Statistics.bossScores[4] += 5000 + 1250*Statistics.spawnersAlive; + Dungeon.level.unseal(); super.die( cause ); - Statistics.bossScores[4] += 10000 + 1250*Statistics.spawnersAlive; + yell( Messages.get(this, "defeated") ); } @@ -478,18 +570,18 @@ public class YogDzewa extends Mob { public void restoreFromBundle(Bundle bundle) { super.restoreFromBundle(bundle); phase = bundle.getInt(PHASE); - if (phase != 0) BossHealthBar.assignBoss(this); + if (phase != 0) { + BossHealthBar.assignBoss(this); + if (phase == 5) BossHealthBar.bleed(true); + } abilityCooldown = bundle.getFloat(ABILITY_CD); summonCooldown = bundle.getFloat(SUMMON_CD); fistSummons.clear(); Collections.addAll(fistSummons, bundle.getClassArray(FIST_SUMMONS)); - //pre-0.9.3 saves - if (bundle.contains(CHALLENGE_SUMMONS)) { - challengeSummons.clear(); - Collections.addAll(challengeSummons, bundle.getClassArray(CHALLENGE_SUMMONS)); - } + challengeSummons.clear(); + Collections.addAll(challengeSummons, bundle.getClassArray(CHALLENGE_SUMMONS)); regularSummons.clear(); Collections.addAll(regularSummons, bundle.getClassArray(REGULAR_SUMMONS)); @@ -525,13 +617,17 @@ public class YogDzewa extends Mob { @Override public int drRoll() { - return Random.NormalIntRange(0, 4); + return super.drRoll() + Random.NormalIntRange(0, 4); } } //used so death to yog's ripper demons have their own rankings description - public static class YogRipper extends RipperDemon {} + public static class YogRipper extends RipperDemon { + { + maxLvl = -2; + } + } public static class YogEye extends Eye { { maxLvl = -2; @@ -542,6 +638,4 @@ public class YogDzewa extends Mob { maxLvl = -2; } } - - -} +} \ No newline at end of file diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/bosses/CrivusFruits.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/bosses/CrivusFruits.java index 49f157947..519223cfd 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/bosses/CrivusFruits.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/bosses/CrivusFruits.java @@ -136,6 +136,14 @@ public class CrivusFruits extends Mob { @Override protected boolean act() { + + alerted = false; + super.act(); + + if (alignment == Alignment.NEUTRAL){ + return true; + } + //毒雾扩散 if(!crivusfruitslevel2){ GameScene.add(Blob.seed(pos, HP<65 ? 50 : 30, DiedBlobs.class)); @@ -200,6 +208,7 @@ public class CrivusFruits extends Mob { //三阶段 if(HP==36){ + alignment = Alignment.ENEMY; GameScene.flash(0x80009c9c); HP=HT=35; if(Dungeon.isChallenged(Challenges.STRONGER_BOSSES)){ diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/bosses/DMZERO.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/bosses/DMZERO.java index 9cebeb267..b2eea127b 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/bosses/DMZERO.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/bosses/DMZERO.java @@ -728,7 +728,6 @@ public class DMZERO extends Mob cell = i + j*Dungeon.level.width(); if (cur[cell] > 0 && (ch = Actor.findChar( cell )) != null) { if (!ch.isImmune(this.getClass())) { - ch.damage(damage, this); } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/bosses/DictFish.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/bosses/DictFish.java new file mode 100644 index 000000000..76829b825 --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/bosses/DictFish.java @@ -0,0 +1,92 @@ +package com.shatteredpixel.shatteredpixeldungeon.actors.mobs.bosses; + +import com.shatteredpixel.shatteredpixeldungeon.Dungeon; +import com.shatteredpixel.shatteredpixeldungeon.Statistics; +import com.shatteredpixel.shatteredpixeldungeon.actors.Char; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Corruption; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Cripple; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.LockedFloor; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Vulnerable; +import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob; +import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfRetribution; +import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.exotic.ScrollOfPsionicBlast; +import com.shatteredpixel.shatteredpixeldungeon.items.weapon.enchantments.Grim; +import com.shatteredpixel.shatteredpixeldungeon.levels.AncientMysteryCityBossLevel; +import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; +import com.shatteredpixel.shatteredpixeldungeon.sprites.DictFishSprites; +import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; +import com.watabou.utils.Random; + +public class DictFish extends Mob { + + { + spriteClass = DictFishSprites.class; + + HP = HT = 100; + defenseSkill = 4; + + EXP = 2; + maxLvl = -8; + baseSpeed = 0.5f; + properties.add(Property.BOSS); //添加BOSS属性 + immunities.add(Grim.class); //添加Grim类 + immunities.add(ScrollOfPsionicBlast.class); //添加ScrollOfPsionicBlast类 + immunities.add(ScrollOfRetribution.class); //添加ScrollOfRetribution类 + immunities.add(Corruption.class); + } + + @Override + protected boolean act() { + + if (Statistics.sakaBackStage >= 2) { + ((AncientMysteryCityBossLevel) Dungeon.level).progress(); + } + return super.act(); + } + + @Override + public void damage(int dmg, Object src) { + LockedFloor lock = Dungeon.hero.buff(LockedFloor.class); + if (lock != null) lock.addTime(dmg*0.4f); + super.damage(dmg, src); + } + + @Override + public int attackProc( Char enemy, int damage ) { + damage = super.attackProc( enemy, damage ); + + if (Random.Int(10)==4 || Statistics.sakaBackStage >= 1) { + Buff.affect(enemy, Vulnerable.class, 6f); + } else { + Buff.affect( enemy, Cripple.class, 4f); + } + return damage; + } + + @Override + public void die( Object cause ) { + Statistics.sakaBackStage++; + GLog.n(Messages.get( RoomStone.class, "angry" )); + if (Statistics.sakaBackStage >= 2) { + ((AncientMysteryCityBossLevel) Dungeon.level).progress(); + } + super.die( cause ); + } + + @Override + public int damageRoll() { + return Random.NormalIntRange( 10, 20 ); + } + + @Override + public int attackSkill( Char target ) { + return 10; + } + + @Override + public int drRoll() { + return 8; + } +} + diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/bosses/RoomStone.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/bosses/RoomStone.java new file mode 100644 index 000000000..a5f8bc08e --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/bosses/RoomStone.java @@ -0,0 +1,358 @@ +package com.shatteredpixel.shatteredpixeldungeon.actors.mobs.bosses; + +import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.hero; + +import com.shatteredpixel.shatteredpixeldungeon.Assets; +import com.shatteredpixel.shatteredpixeldungeon.Dungeon; +import com.shatteredpixel.shatteredpixeldungeon.Statistics; +import com.shatteredpixel.shatteredpixeldungeon.actors.Actor; +import com.shatteredpixel.shatteredpixeldungeon.actors.Char; +import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Blob; +import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Fire; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Adrenaline; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Bleeding; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Corruption; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.LockedFloor; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.RoseShiled; +import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob; +import com.shatteredpixel.shatteredpixeldungeon.effects.Pushing; +import com.shatteredpixel.shatteredpixeldungeon.effects.TargetedCell; +import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfRetribution; +import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.exotic.ScrollOfPsionicBlast; +import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfBlastWave; +import com.shatteredpixel.shatteredpixeldungeon.items.weapon.enchantments.Grim; +import com.shatteredpixel.shatteredpixeldungeon.levels.AncientMysteryCityBossLevel; +import com.shatteredpixel.shatteredpixeldungeon.levels.CaveTwoBossLevel; +import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica; +import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; +import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; +import com.shatteredpixel.shatteredpixeldungeon.sprites.RoomStoneSprites; +import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; +import com.watabou.noosa.audio.Sample; +import com.watabou.utils.Bundle; +import com.watabou.utils.Callback; +import com.watabou.utils.GameMath; +import com.watabou.utils.PathFinder; +import com.watabou.utils.Random; + +public class RoomStone extends Mob { + + { + spriteClass = RoomStoneSprites.class; + + HP = HT = 100; + defenseSkill = 16; + + EXP = 9; //for corrupting + maxLvl = -2; + + HUNTING = new Hunting(); + + baseSpeed = 1.5f; + + properties.add(Property.BOSS); //添加BOSS属性 + immunities.add(Grim.class); //添加Grim类 + immunities.add(ScrollOfPsionicBlast.class); //添加ScrollOfPsionicBlast类 + immunities.add(ScrollOfRetribution.class); //添加ScrollOfRetribution类 + immunities.add(Corruption.class); + } + + @Override + public void damage(int dmg, Object src) { + LockedFloor lock = Dungeon.hero.buff(LockedFloor.class); + if (lock != null) lock.addTime(dmg*0.8f); + super.damage(dmg, src); + } + + @Override + public int damageRoll() { + return Random.NormalIntRange( 5, 12 ); + } + + @Override + public int attackSkill( Char target ) { + return 5; + } + + @Override + public int drRoll() { + return 3; + } + + private static final String LAST_ENEMY_POS = "last_enemy_pos"; + private static final String LEAP_POS = "leap_pos"; + private static final String LEAP_CD = "leap_cd"; + + @Override + public void storeInBundle(Bundle bundle) { + super.storeInBundle(bundle); + bundle.put(LAST_ENEMY_POS, lastEnemyPos); + bundle.put(LEAP_POS, leapPos); + bundle.put(LEAP_CD, leapCooldown); + } + + @Override + public void restoreFromBundle(Bundle bundle) { + super.restoreFromBundle(bundle); + lastEnemyPos = bundle.getInt(LAST_ENEMY_POS); + leapPos = bundle.getInt(LEAP_POS); + leapCooldown = bundle.getFloat(LEAP_CD); + } + + private int lastEnemyPos = -1; + + @Override + protected boolean act() { + + if(Statistics.sakaBackStage >= 2){ + ((AncientMysteryCityBossLevel)Dungeon.level).progress(); + } + + AiState lastState = state; + boolean result = super.act(); + if (paralysed <= 0) leapCooldown --; + + //if state changed from wandering to hunting, we haven't acted yet, don't update. + if (!(lastState == WANDERING && state == HUNTING)) { + if (enemy != null) { + lastEnemyPos = enemy.pos; + } else { + lastEnemyPos = hero.pos; + } + } + + return result; + } + + private int leapPos = -1; + private float leapCooldown = 0; + + @Override + public void die( Object cause ) { + Statistics.sakaBackStage++; + GLog.n(Messages.get( DictFish.class, "angry" )); + if (Statistics.sakaBackStage >= 2) { + ((AncientMysteryCityBossLevel) Dungeon.level).progress(); + } + + for (Mob boss : Dungeon.level.mobs.toArray(new Mob[0])) { + if (boss instanceof DictFish) { + Buff.affect(boss, Adrenaline.class, 35f); + Buff.affect(boss, RoseShiled.class, 10f); + } + } + super.die( cause ); + } + + public class Hunting extends Mob.Hunting { + + + public void dropRocks( Char target ) { + + hero.interrupt(); + final int rockCenter; + if (Dungeon.level.adjacent(pos, target.pos)){ + int oppositeAdjacent = target.pos + (target.pos - pos); + Ballistica trajectory = new Ballistica(target.pos, oppositeAdjacent, Ballistica.MAGIC_BOLT); + WandOfBlastWave.throwChar(target, trajectory, 20, false, false, getClass()); + if (target == hero){ + hero.interrupt(); + } + rockCenter = trajectory.path.get(Math.min(trajectory.dist, 200)); + } else { + rockCenter = target.pos; + } + + Actor a = new Actor() { + + { + actPriority = HERO_PRIO+1; + } + private static final float TIME_TO_ZAP = 1f; + + @Override + protected boolean act() { + + //pick an adjacent cell to the hero as a safe cell. This cell is less likely to be in a wall or containing hazards + int safeCell; + do { + safeCell = rockCenter + PathFinder.NEIGHBOURS8[Random.Int(8)]; + } while (safeCell == pos + || (Dungeon.level.solid[safeCell] && Random.Int(2) == 0) + || (Blob.volumeAt(safeCell, CaveTwoBossLevel.PylonEnergy.class) > 0 && Random.Int(2) == 0)); + + int start = rockCenter - Dungeon.level.width() * 3 - 3; + int pos; + for (int y = 0; y < 7; y++) { + pos = start + Dungeon.level.width() * y; + for (int x = 0; x < 7; x++) { + if (!Dungeon.level.insideMap(pos)) { + pos++; + continue; + } + //add rock cell to pos, if it is not solid, and isn't the safecell + if (!Dungeon.level.solid[pos] && pos != safeCell && Random.Int(Dungeon.level.distance(rockCenter, pos)) == 0) { + //don't want to overly punish players with slow move or attack speed + GameScene.add(Blob.seed(pos, 4, Fire.class)); + } + pos++; + } + } + Actor.remove(this); + return true; + } + }; + Actor.addDelayed(a, Math.min(target.cooldown(), 3*TICK)); + + } + + @Override + public boolean act( boolean enemyInFOV, boolean justAlerted ) { + + if (leapPos != -1){ + + leapCooldown = Random.NormalIntRange(2, 4); + Ballistica b = new Ballistica(pos, leapPos, Ballistica.STOP_TARGET | Ballistica.STOP_SOLID); + + //check if leap pos is not obstructed by terrain + if (rooted || b.collisionPos != leapPos){ + leapPos = -1; + return true; + } + + final Char leapVictim = Actor.findChar(leapPos); + final int endPos; + + //ensure there is somewhere to land after leaping + if (leapVictim != null){ + int bouncepos = -1; + for (int i : PathFinder.NEIGHBOURS8){ + if ((bouncepos == -1 || Dungeon.level.trueDistance(pos, leapPos+i) < Dungeon.level.trueDistance(pos, bouncepos)) + && Actor.findChar(leapPos+i) == null && Dungeon.level.passable[leapPos+i]){ + bouncepos = leapPos+i; + } + } + if (bouncepos == -1) { + leapPos = -1; + return true; + } else { + endPos = bouncepos; + } + } else { + endPos = leapPos; + } + + //do leap + sprite.visible = Dungeon.level.heroFOV[pos] || Dungeon.level.heroFOV[leapPos] || Dungeon.level.heroFOV[endPos]; + Ballistica route = new Ballistica(leapPos, target, Ballistica.STOP_TARGET | Ballistica.STOP_SOLID); + int cell = route.collisionPos; + + //can't occupy the same cell as another char, so move back one. + int backTrace = route.dist-1; + while (Actor.findChar( cell ) != null && cell != leapPos) { + cell = route.path.get(backTrace); + backTrace--; + } + sprite.jump(pos, leapPos, new Callback() { + @Override + public void call() { + + if (leapVictim != null && alignment != leapVictim.alignment){ + Buff.affect(leapVictim, Bleeding.class).set(0.75f*damageRoll()); + leapVictim.sprite.flash(); + dropRocks(enemy); + Sample.INSTANCE.play(Assets.Sounds.HIT); + } + + if (endPos != leapPos){ + Actor.addDelayed(new Pushing(RoomStone.this, leapPos, endPos), -1); + } + + pos = endPos; + leapPos = -1; + sprite.idle(); + Dungeon.level.occupyCell(RoomStone.this); + next(); + } + }); + return false; + } + + enemySeen = enemyInFOV; + if (enemyInFOV && !isCharmedBy( enemy ) && canAttack( enemy )) { + + return doAttack( enemy ); + + } else { + + if (enemyInFOV) { + target = enemy.pos; + } else if (enemy == null) { + state = WANDERING; + target = Dungeon.level.randomDestination( RoomStone.this ); + return true; + } + + + if (leapCooldown <= 0 && enemyInFOV && !rooted + && Dungeon.level.distance(pos, enemy.pos) >= 3 && Statistics.sakaBackStage>=1) { + + int targetPos = enemy.pos; + if (lastEnemyPos != enemy.pos) { + int closestIdx = 0; + for (int i = 1; i < PathFinder.CIRCLE8.length; i++) { + if (Dungeon.level.trueDistance(lastEnemyPos, enemy.pos + PathFinder.CIRCLE8[i]) + < Dungeon.level.trueDistance(lastEnemyPos, enemy.pos + PathFinder.CIRCLE8[closestIdx])) { + closestIdx = i; + } + } + targetPos = enemy.pos + PathFinder.CIRCLE8[(closestIdx + 4) % 8]; + } + + Ballistica b = new Ballistica(pos, targetPos, Ballistica.STOP_TARGET | Ballistica.STOP_SOLID); + //try aiming directly at hero if aiming near them doesn't work + if (b.collisionPos != targetPos && targetPos != enemy.pos) { + targetPos = enemy.pos; + b = new Ballistica(pos, targetPos, Ballistica.STOP_TARGET | Ballistica.STOP_SOLID); + } + if (b.collisionPos == targetPos) { + //get ready to leap + leapPos = targetPos; + //don't want to overly punish players with slow move or attack speed + spend(GameMath.gate(TICK, enemy.cooldown(), 3 * TICK)); + if (Dungeon.level.heroFOV[pos] || Dungeon.level.heroFOV[leapPos]) { + GLog.w(Messages.get(RoomStone.this, "leap")); + sprite.parent.addToBack(new TargetedCell(leapPos, 0xFF0000)); + ((RoomStoneSprites) sprite).leapPrep(leapPos); + hero.interrupt(); + } + return true; + } + } + + + + + int oldPos = pos; + if (target != -1 && getCloser( target )) { + + spend( 1 / speed() ); + return moveSprite( oldPos, pos ); + + } else { + spend( TICK ); + if (!enemyInFOV) { + sprite.showLost(); + state = WANDERING; + target = Dungeon.level.randomDestination( RoomStone.this ); + } + return true; + } + } + } + + } + +} + diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/bosses/SakaFishBoss.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/bosses/SakaFishBoss.java index 3873f2844..dc09556a0 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/bosses/SakaFishBoss.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/bosses/SakaFishBoss.java @@ -10,9 +10,8 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.Boss; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Blob; import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.HalomethaneFire; -import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Bleeding; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; -import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Frost; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Cripple; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.LockedFloor; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.NewDM720; @@ -21,9 +20,12 @@ import com.shatteredpixel.shatteredpixeldungeon.effects.MagicMissile; import com.shatteredpixel.shatteredpixeldungeon.effects.Pushing; import com.shatteredpixel.shatteredpixeldungeon.effects.TargetedCell; import com.shatteredpixel.shatteredpixeldungeon.effects.particles.RainbowParticle; -import com.shatteredpixel.shatteredpixeldungeon.items.keys.SkeletonKey; -import com.shatteredpixel.shatteredpixeldungeon.items.quest.GooBlob; +import com.shatteredpixel.shatteredpixeldungeon.items.food.SakaMeat; +import com.shatteredpixel.shatteredpixeldungeon.items.keys.CrystalKey; +import com.shatteredpixel.shatteredpixeldungeon.items.potions.elixirs.WaterSoul; +import com.shatteredpixel.shatteredpixeldungeon.items.quest.SakaFishSketon; import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfBlastWave; +import com.shatteredpixel.shatteredpixeldungeon.levels.AncientMysteryCityBossLevel; import com.shatteredpixel.shatteredpixeldungeon.levels.CaveTwoBossLevel; import com.shatteredpixel.shatteredpixeldungeon.levels.Level; import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain; @@ -43,6 +45,7 @@ import com.watabou.utils.GameMath; import com.watabou.utils.PathFinder; import com.watabou.utils.Random; +/**萨卡班甲鱼 Boss 难度:3.5级 */ public class SakaFishBoss extends Boss { private int leapPos = -1; private float leapCooldown = 0; @@ -68,6 +71,8 @@ public class SakaFishBoss extends Boss { HT=480; properties.add(Property.ICY); + properties.add(Property.ELECTRIC); + properties.add(Property.FIERY); viewDistance = 30; } @@ -80,6 +85,11 @@ public class SakaFishBoss extends Boss { return; } + if (dmg >= 25){ + //takes 5/6/7/8/9/10 dmg at 5/7/10/14/19/25 incoming dmg + dmg = 14 + (int)(Math.sqrt(8*(dmg - 4) + 1) - 1)/2; + } + int hpBracket = HT / 8; int beforeHitHP = HP; @@ -96,15 +106,22 @@ public class SakaFishBoss extends Boss { lock.addTime(dmg*3f); } + AncientMysteryCityBossLevel.State level = ((AncientMysteryCityBossLevel)Dungeon.level).pro(); //phase 1 of the fight is over - if (HP <= HT/2){ + if (HP <= HT/2 && level==AncientMysteryCityBossLevel.State.TWO_BOSS){ HP = (HT/2); yell(Messages.get(this, "interesting")); -// ((PrisonBossLevel)Dungeon.level).progress(); + ((AncientMysteryCityBossLevel)Dungeon.level).progress(); BossHealthBar.bleed(true); } } + @Override + public boolean isInvulnerable(Class effect) { + AncientMysteryCityBossLevel.State level = ((AncientMysteryCityBossLevel)Dungeon.level).pro(); + return level==AncientMysteryCityBossLevel.State.END_BOSS; + } + @Override protected boolean canAttack( Char enemy ) { @@ -149,7 +166,8 @@ public class SakaFishBoss extends Boss { @Override public int drRoll() { - return Random.NormalIntRange(0, 2); + AncientMysteryCityBossLevel.State level = ((AncientMysteryCityBossLevel)Dungeon.level).pro(); + return level == AncientMysteryCityBossLevel.State.FALL_BOSS ? 5 : 15; } @@ -157,6 +175,15 @@ public class SakaFishBoss extends Boss { ((SakaFishBossSprites) sprite).activate(); } + @Override + protected boolean getCloser( int target ) { + if (state == HUNTING) { + return enemySeen && getFurther( target ); + } else { + return super.getCloser( target ); + } + } + @Override protected boolean act() { AiState lastState = state; @@ -187,96 +214,75 @@ public class SakaFishBoss extends Boss { @Override protected boolean doAttack( Char enemy ) { - + AncientMysteryCityBossLevel.State level = ((AncientMysteryCityBossLevel)Dungeon.level).pro(); if (beamCooldown > 0) { return super.doAttack(enemy); } else if (!beamCharged){ ((SakaFishBossSprites)sprite).charge( enemy.pos ); - spend( attackDelay()*2f ); + + spend( level == AncientMysteryCityBossLevel.State.FALL_BOSS ? attackDelay() : attackDelay()*2f ); beamCharged = true; return true; } else if(HP*2>=HT) { - spend( attackDelay()*3f ); + spend( level == AncientMysteryCityBossLevel.State.FALL_BOSS ? attackDelay() : attackDelay()*3f ); beam = new Ballistica(pos, beamTarget, Ballistica.STOP_SOLID); if (Dungeon.level.heroFOV[pos] || Dungeon.level.heroFOV[beam.collisionPos] ) { sprite.zap( beam.collisionPos ); return false; } else { - sprite.operate(this.pos); + sprite.idle(); deathGaze(); - return true; } } else { + spend( level == AncientMysteryCityBossLevel.State.FALL_BOSS ? attackDelay() : attackDelay()*3f ); - return true; + beam = new Ballistica(pos, beamTarget, Ballistica.STOP_SOLID); + if (Dungeon.level.heroFOV[pos] || Dungeon.level.heroFOV[beam.collisionPos] ) { + sprite.zap( beam.collisionPos ); + return false; + } else { + sprite.idle(); + deathGaze(); + return true; + } } } -// @Override -// public boolean attack( Char enemy, float dmgMulti, float dmgBonus, float accMulti ) { -// boolean result = super.attack( enemy, dmgMulti, dmgBonus, accMulti ); -// pumpedUp = 0; -// return result; -// } -// -// @Override -// protected boolean getCloser( int target ) { -// if (pumpedUp != 0) { -// pumpedUp = 0; -// sprite.idle(); -// } -// return super.getCloser( target ); -// } -// -// @Override -// 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")); -// ((GooSprite)sprite).spray(true); -// yell(Messages.get(this, "gluuurp")); -// } -// LockedFloor lock = Dungeon.hero.buff(LockedFloor.class); -// if (lock != null) lock.addTime(dmg*2); -// } - @Override public void die( Object cause ) { super.die( cause ); - if(Dungeon.depth!=28){ + Dungeon.level.unseal(); GetBossLoot(); GameScene.bossSlain(); - Dungeon.level.drop( new SkeletonKey( Dungeon.depth ), pos ).sprite.drop(); + Dungeon.level.drop( new CrystalKey( Dungeon.depth ), pos ).sprite.drop(); //60% chance of 2 blobs, 30% chance of 3, 10% chance for 4. Average of 2.5 - int blobs = Random.chances(new float[]{0, 0, 6, 3, 1}); - for (int i = 0; i < blobs; i++){ + int meets = Random.chances(new float[]{0, 0, 6, 3, 1}); + for (int i = 0; i < meets; i++){ int ofs; do { ofs = PathFinder.NEIGHBOURS8[Random.Int(8)]; } while (!Dungeon.level.passable[pos + ofs]); - Dungeon.level.drop( new GooBlob(), pos + ofs ).sprite.drop( pos ); + Dungeon.level.drop( new SakaMeat(), pos + ofs ).sprite.drop( pos ); } - Badges.validateBossSlain(); + Dungeon.level.drop( new WaterSoul(), pos-1 ).sprite.drop(); + Dungeon.level.drop( new SakaFishSketon(), pos ).sprite.drop(); + Dungeon.level.drop( new WaterSoul(), pos+1 ).sprite.drop(); + + Badges.KILLSAKA(); yell( Messages.get(this, "defeated") ); - } + } @@ -304,6 +310,9 @@ public class SakaFishBoss extends Boss { private static final String BEAM_COOLDOWN = "beamCooldown"; private static final String BEAM_CHARGED = "beamCharged"; + //二阶段 + private static final String TO_ATTACK = "toattack"; + @Override public void storeInBundle( Bundle bundle ) { @@ -338,7 +347,6 @@ public class SakaFishBoss extends Boss { lastEnemyPos = bundle.getInt(LAST_ENEMY_POS); leapPos = bundle.getInt(LEAP_POS); leapCooldown = bundle.getFloat(LEAP_CD); - } public void dropRocks( Char target ) { @@ -357,8 +365,6 @@ public class SakaFishBoss extends Boss { rockCenter = target.pos; } - //we handle this through an actor as it gives us fine-grainted control over when the blog acts vs. when the hero acts - //FIXME this is really messy to just get some fine-grained control. would be nice to build this into blob functionality, or just not use blobs for this at all Actor a = new Actor() { { @@ -444,39 +450,21 @@ public class SakaFishBoss extends Boss { sprite.dirtcar(pos, leapPos, new Callback() { @Override public void call() { - + AncientMysteryCityBossLevel.State level = ((AncientMysteryCityBossLevel)Dungeon.level).pro(); if (leapVictim != null && alignment != leapVictim.alignment){ - Buff.affect(leapVictim, Bleeding.class).set(0.75f*damageRoll()); - dropRocks(enemy); + enemy.damage( Random.NormalIntRange( 20, 40 ), this ); + if(level == AncientMysteryCityBossLevel.State.FALL_BOSS){ + //三阶段 魔法风暴 + FishStorm(sprite.ch); + } Sample.INSTANCE.play(Assets.Sounds.ROCKS); leapVictim.sprite.flash(); Sample.INSTANCE.play(Assets.Sounds.HIT); } - if (endPos != leapPos){ - Actor.addDelayed(new Pushing(SakaFishBoss.this, leapPos, endPos), -1); - } - - pos = endPos; - leapPos = -1; - sprite.operate(pos); - Dungeon.level.occupyCell(SakaFishBoss.this); - next(); - } - }); - sprite.visible = Dungeon.level.heroFOV[pos] || Dungeon.level.heroFOV[leapPos] || Dungeon.level.heroFOV[endPos]; - sprite.dirtcar(pos, leapPos, new Callback() { - @Override - public void call() { - - if (leapVictim != null && alignment != leapVictim.alignment){ - Buff.affect(leapVictim, Bleeding.class).set(0.75f*damageRoll()); - //TODO 魔法风暴 - FishStorm(enemy); - enemy.damage( Random.NormalIntRange( 10, 20 ), this ); - Sample.INSTANCE.play(Assets.Sounds.ROCKS); - leapVictim.sprite.flash(); - Sample.INSTANCE.play(Assets.Sounds.HIT); + if (!enemy.isAlive() && enemy == hero) { + Dungeon.fail( getClass() ); + GLog.n( Messages.get(SakaFishBoss.class, "dictcar_kill"),Dungeon.hero.name() ); } if (endPos != leapPos){ @@ -569,7 +557,7 @@ public class SakaFishBoss extends Boss { public void deathGaze(){ if (!beamCharged || beamCooldown > 0 || beam == null) return; - + AncientMysteryCityBossLevel.State level = ((AncientMysteryCityBossLevel)Dungeon.level).pro(); beamCharged = false; beamCooldown = Random.IntRange(4, 6); @@ -592,6 +580,9 @@ public class SakaFishBoss extends Boss { if (hit( this, ch, true )) { ch.damage( Random.NormalIntRange( 20, 40 ), new DeathGaze() ); + if(level == AncientMysteryCityBossLevel.State.FALL_BOSS){ + dropRocks(enemy); + } if (Dungeon.level.heroFOV[pos]) { ch.sprite.flash(); @@ -600,7 +591,7 @@ public class SakaFishBoss extends Boss { if (!ch.isAlive() && ch == hero) { Dungeon.fail( getClass() ); - GLog.n( Messages.get(this, "deathgaze_kill") ); + GLog.n( Messages.get(this, "deathgaze_kill"),Dungeon.hero.name() ); } } else { ch.sprite.showStatus( CharSprite.NEUTRAL, ch.defenseVerb() ); @@ -615,28 +606,30 @@ public class SakaFishBoss extends Boss { beamTarget = -1; } + + + //萨卡班甲鱼魔法风暴 public void FishStorm(Char ch){ Ballistica aim; aim = new Ballistica(ch.pos, ch.pos - 1, Ballistica.WONT_STOP); int projectileProps = Ballistica.STOP_SOLID | Ballistica.STOP_TARGET; - int aoeSize = 4; + int aoeSize = 8; ConeAOE aoe = new ConeAOE(aim, aoeSize, 360, projectileProps); for (Ballistica ray : aoe.outerRays){ ((MagicMissile)ch.sprite.parent.recycle( MagicMissile.class )).reset( - MagicMissile.FROST, + MagicMissile.HALOFIRE, ch.sprite, ray.path.get(ray.dist), null ); - if( ray.collisionPos == hero.pos){ - Buff.prolong(enemy, Frost.class, Frost.DURATION); - } else { - GameScene.add(Blob.seed(ray.path.get(ray.dist),5, HalomethaneFire.class)); + if( Dungeon.level.water[ray.path.get(ray.dist)] && Random.Int(10) == 2){ + GameScene.add(Blob.seed(ray.path.get(ray.dist), 30, HalomethaneFire.class)); Level.set(ray.path.get(ray.dist), Terrain.EMPTY); GameScene.updateMap( ray.path.get(ray.dist) ); + } else { + Buff.prolong(enemy, Cripple.class, Cripple.DURATION); } - } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/bosses/v.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/bosses/v.java deleted file mode 100644 index d9e0bef08..000000000 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/bosses/v.java +++ /dev/null @@ -1,476 +0,0 @@ -//package com.shatteredpixel.shatteredpixeldungeon.actors.mobs.bosses; -// -//import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.hero; -// -//import com.shatteredpixel.shatteredpixeldungeon.Dungeon; -//import com.shatteredpixel.shatteredpixeldungeon.actors.Actor; -//import com.shatteredpixel.shatteredpixeldungeon.actors.Char; -//import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Adrenaline; -//import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Amok; -//import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Blindness; -//import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; -//import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ChaosTime; -//import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Charm; -//import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.FireImbue; -//import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.MaxGuard; -//import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Paralysis; -//import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Sleep; -//import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.SoulMark; -//import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Terror; -//import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Vertigo; -//import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Weakness; -//import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob; -//import com.shatteredpixel.shatteredpixeldungeon.effects.Beam; -//import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter; -//import com.shatteredpixel.shatteredpixeldungeon.effects.Speck; -//import com.shatteredpixel.shatteredpixeldungeon.effects.TargetedCell; -//import com.shatteredpixel.shatteredpixeldungeon.effects.particles.PurpleParticle; -//import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica; -//import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; -//import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; -//import com.shatteredpixel.shatteredpixeldungeon.sprites.PillarSprite; -//import com.shatteredpixel.shatteredpixeldungeon.tiles.DungeonTilemap; -//import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; -//import com.watabou.utils.Bundle; -//import com.watabou.utils.GameMath; -//import com.watabou.utils.PathFinder; -//import com.watabou.utils.Random; -// -//import java.util.ArrayList; -//import java.util.HashSet; -// -//public abstract class SeptiumPillar extends Mob { -// -// private boolean firstactive = false; -// private boolean secondactive = false; -// private boolean thirdactive = false; -// -// { -// HP = HT = 100; -// -// viewDistance = 99; -// -// //for doomed resistance -// EXP = 25; -// maxLvl = -2; -// baseSpeed = 0; -// -// state = PASSIVE; -// alignment = Alignment.NEUTRAL; -// -// properties.add(Property.BOSS); -// properties.add(Property.KISEKI); -// properties.add(Property.IMMOVABLE); -// properties.add(Property.INORGANIC); -// immunities.add( Terror.class ); -// immunities.add( Amok.class ); -// immunities.add( Charm.class ); -// immunities.add( Sleep.class ); -// immunities.add( Vertigo.class ); -// immunities.add( Paralysis.class ); -// immunities.add( SoulMark.class ); -// immunities.add( Weakness.class ); -// immunities.add( Blindness.class ); -// } -// -// @Override -// protected boolean act() -// -// { -// if (alignment == Alignment.NEUTRAL){ -// next(); -// } -// else -// { -// onZapComplete(); -// state = PASSIVE; -// } -// return super.act(); -// } -// -// @Override -// public void notice() { -// //do nothing -// } -// -// -// -// @Override -// public void add(Buff buff) { -// //immune to all buffs/debuffs when inactive -// if (alignment != Alignment.NEUTRAL) { -// super.add(buff); -// } -// } -// -// private static final String ALIGNMENT = "alignment"; -// -// @Override -// public void storeInBundle(Bundle bundle) { -// super.storeInBundle(bundle); -// bundle.put(ALIGNMENT, alignment); -// -// } -// -// @Override -// public void restoreFromBundle(Bundle bundle) { -// super.restoreFromBundle(bundle); -// alignment = bundle.getEnum(ALIGNMENT, Alignment.class); -// -// } -// -// @Override -// public boolean interact(Char c) { -// return true; -// } -// -// protected abstract void zap(); -// -// -// -// public void onZapComplete(){ -// zap(); -// next(); -// } -// -// -// -// public void activate(){ -// alignment = Alignment.ENEMY; -// ((PillarSprite) sprite).activate(); -// } -// -// @Override -// public String description() { -// return Messages.get(SeptiumPillar.class, "desc") + "\n\n" + Messages.get(this, "desc"); -// } -// -// { -// immunities.add( Terror.class ); -// immunities.add( Amok.class ); -// immunities.add( Charm.class ); -// immunities.add( Sleep.class ); -// immunities.add( Vertigo.class ); -// immunities.add( Paralysis.class ); -// immunities.add( SoulMark.class ); -// immunities.add( Weakness.class ); -// immunities.add( Blindness.class ); -// } -// -// public static class FlamePillar extends SeptiumPillar { -// -// { -// spriteClass = PillarSprite.Flame.class; -// } -// -// @Override -// protected boolean act() { -// { -// state = PASSIVE; -// } -// return super.act(); -// } -// -// @Override -// protected void zap() { -// for (Mob mob : Dungeon.level.mobs.toArray(new Mob[0])) { -// if(!mob.properties().contains(Property.KISEKI)) { -// Buff.affect(mob, FireImbue.class).set( 10f); -// } -// next(); -// } -// GLog.w(Messages.get( this, "message") ); -// spend(15f); -// } -// -// } -// -// public static class GroundPillar extends SeptiumPillar { -// -// { -// spriteClass = PillarSprite.Ground.class; -// } -// -// @Override -// protected boolean act() { -// { -// state = PASSIVE; -// } -// return super.act(); -// } -// -// -// @Override -// protected void zap() { -// for (Mob mob : Dungeon.level.mobs.toArray(new Mob[0])) { -// if(!mob.properties().contains(Property.KISEKI)) { -// Buff.affect(mob, MaxGuard.class); -// } -// next(); -// } -// GLog.w(Messages.get( this, "message") ); -// spend(15f); -// }; -// -// -// -// -// -// } -// -// public static class WaterPillar extends SeptiumPillar { -// -// { -// spriteClass = PillarSprite.Water.class; -// -// } -// -// @Override -// protected boolean act() { -// { -// state = PASSIVE; -// } -// return super.act(); -// } -// -// @Override -// protected void zap() { -// for (Mob mob : Dungeon.level.mobs.toArray(new Mob[0])) { -// if(!mob.properties().contains(Property.KISEKI)) { -// if (mob.HP < mob.HT/3){ -// -// mob.HP = mob.HP+20; -// -// } -// -// -// } -// -// } -// GLog.w(Messages.get( this, "message") ); -// spend(15f); -// }; -// -// -// -// } -// -// public static class WindPillar extends SeptiumPillar { -// -// { -// spriteClass = PillarSprite.Wind.class; -// -// } -// -// @Override -// protected boolean act() { -// { -// state = PASSIVE; -// } -// return super.act(); -// } -// -// @Override -// protected void zap() { -// for (Mob mob : Dungeon.level.mobs.toArray(new Mob[0])) { -// if(!mob.properties().contains(Property.KISEKI)) { -// Buff.affect(mob, Adrenaline.class,3f); -// } -// next(); -// } -// GLog.w(Messages.get( this, "message") ); -// spend(15f); -// } -// } -// -// public static class ChronosPillar extends SeptiumPillar { -// -// { -// spriteClass = PillarSprite.Chronos.class; -// -// } -// -// @Override -// protected boolean act() { -// { -// state = PASSIVE; -// } -// return super.act(); -// } -// -// @Override -// protected void zap() { -// -// spend(15f); -// Buff.affect( hero, ChaosTime.class, 15f); -// GLog.w(Messages.get( this, "message") ); -// -// } -// -// -// } -// -// -// public static class HeavenPillar extends SeptiumPillar { -// -// { -// spriteClass = PillarSprite.Heaven.class; -// } -// -// private ArrayList targetedCells = new ArrayList<>(); -// -// private float abilityCooldown; -// private static final int MIN_ABILITY_CD = 10; -// private static final int MAX_ABILITY_CD = 15; -// -// // 添加一个计数器,用来记录回合数 -// private int turnCount = 0; -// -// @Override -// protected boolean act() { -// boolean terrainAffected = false; -// HashSet affected = new HashSet<>(); -// //delay fire on a rooted hero -// if (!hero.rooted && alignment == Alignment.ENEMY && firstActive) { -// for (int i : targetedCells) { -// Ballistica b = new Ballistica(pos, i, Ballistica.WONT_STOP); -// //shoot beams -// sprite.parent.add(new Beam.DeathRay(sprite.center(), DungeonTilemap.raisedTileCenterToWorld(b.collisionPos))); -// for (int p : b.path) { -// Char ch = Actor.findChar(p); -// if (ch != null && (ch.alignment != alignment || ch instanceof Bee)) { -// affected.add(ch); -// } -// if (Dungeon.level.flamable[p]) { -// Dungeon.level.destroy(p); -// GameScene.updateMap(p); -// terrainAffected = true; -// } -// } -// } -// if (terrainAffected) { -// Dungeon.observe(); -// } -// for (Char ch : affected) { -// ch.damage(Random.NormalIntRange(20, 30), new Eye.DeathGaze()); -// -// if (Dungeon.level.heroFOV[pos]) { -// ch.sprite.flash(); -// CellEmitter.center(pos).burst(PurpleParticle.BURST, Random.IntRange(1, 2)); -// } -// if (!ch.isAlive() && ch == hero) { -// Dungeon.fail(getClass()); -// GLog.n(Messages.get(Char.class, "kill", name())); -// } -// } -// targetedCells.clear(); -// } -// -// if (abilityCooldown <= 0 && alignment == Alignment.ENEMY && firstActive) { -// int beams = 1; -// GLog.w(Messages.get(this, "message")); -// HashSet affectedCells = new HashSet<>(); -// for (int i = 0; i < beams; i++) { -// -// int targetPos = hero.pos; -// if (i != 0) { -// do { -// targetPos = hero.pos + PathFinder.NEIGHBOURS8[Random.Int(8)]; -// } while (Dungeon.level.trueDistance(pos, hero.pos) -// > Dungeon.level.trueDistance(pos, targetPos)); -// } -// targetedCells.add(targetPos); -// Ballistica b = new Ballistica(pos, targetPos, Ballistica.WONT_STOP); -// affectedCells.addAll(b.path); -// } -// -// //remove one beam if multiple shots would cause every cell next to the hero to be targeted -// boolean allAdjTargeted = true; -// for (int i : PathFinder.NEIGHBOURS9) { -// if (!affectedCells.contains(hero.pos + i) && Dungeon.level.passable[hero.pos + i]) { -// allAdjTargeted = false; -// break; -// } -// } -// if (allAdjTargeted) { -// targetedCells.remove(targetedCells.size() - 1); -// } -// for (int i : targetedCells) { -// Ballistica b = new Ballistica(pos, i, Ballistica.WONT_STOP); -// for (int p : b.path) { -// sprite.parent.add(new TargetedCell(p, 0xFF0000)); -// affectedCells.add(p); -// } -// } -// -// // 在14回合时发出警告 -// if (turnCount == 14) { -// for (int i : affectedCells) { -// sprite.parent.add(new TargetedCell(i, 0xFF0000)); -// } -// } -// -// // don't want to overly punish players with slow move or attack speed -// spend(GameMath.gate(TICK, hero.cooldown(), 3 * TICK)); -// hero.interrupt(); -// -// abilityCooldown += Random.NormalFloat(MIN_ABILITY_CD, MAX_ABILITY_CD); -// -// } else { -// spend(TICK); -// if (abilityCooldown > 0) abilityCooldown--; -// } -// -// turnCount++; // 回合数自增 -// -// -// return true; -// } -// -// @Override -// protected void zap() { -// next(); -// } -// } -// -// -// -// -// -// -// public static class PhantomPillar extends SeptiumPillar { -// -// { -// spriteClass = PillarSprite.Phantom.class; -// -// } -// -// @Override -// protected boolean act() { -// { -// state = PASSIVE; -// } -// return super.act(); -// } -// -// @Override -// protected void zap() { -// -// Buff.affect( hero, Vertigo.class, 3f); -// for (Mob mob : Dungeon.level.mobs.toArray( new Mob[0] )) { -// mob.beckon( hero.pos ); -// } -// hero.sprite.centerEmitter().start( Speck.factory( Speck.SCREAM ), 0.3f, 3 ); -// GLog.w(Messages.get( this, "message") ); -// spend(15f); -// } -// -// -// -// -// } -// -// -// -//} -// diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/ImpShopkeeper.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/ImpShopkeeper.java index 2c5896f2a..5660e8fdd 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/ImpShopkeeper.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/ImpShopkeeper.java @@ -22,12 +22,14 @@ package com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; +import com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter; import com.shatteredpixel.shatteredpixeldungeon.effects.Speck; import com.shatteredpixel.shatteredpixeldungeon.effects.particles.ElmoParticle; import com.shatteredpixel.shatteredpixeldungeon.items.Heap; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; +import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; import com.shatteredpixel.shatteredpixeldungeon.sprites.ImpSprite; public class ImpShopkeeper extends Shopkeeper { @@ -73,4 +75,22 @@ public class ImpShopkeeper extends Shopkeeper { sprite.emitter().burst( Speck.factory( Speck.WOOL ), 15 ); sprite.killAndErase(); } + + @Override + public void destroy() { + super.destroy(); + for (Heap heap: Dungeon.level.heaps.valueList()) { + if (heap.type == Heap.Type.FOR_SALE) { + if (ShatteredPixelDungeon.scene() instanceof GameScene) { + CellEmitter.get(heap.pos).burst(ElmoParticle.FACTORY, 4); + } + if (heap.size() == 1) { + heap.destroy(); + } else { + heap.items.remove(heap.size()-1); + heap.type = Heap.Type.HEAP; + } + } + } + } } 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 3aca34f54..ce87ecede 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 @@ -21,16 +21,23 @@ package com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs; +import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.hero; + +import com.shatteredpixel.shatteredpixeldungeon.Conducts; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; -import com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon; import com.shatteredpixel.shatteredpixeldungeon.Statistics; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ClearBleesdGoodBuff.BlessNoMoney; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.MagicGirlDebuff.MagicGirlSayMoneyMore; import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter; import com.shatteredpixel.shatteredpixeldungeon.effects.particles.ElmoParticle; +import com.shatteredpixel.shatteredpixeldungeon.items.Ankh; import com.shatteredpixel.shatteredpixeldungeon.items.Heap; import com.shatteredpixel.shatteredpixeldungeon.items.Item; import com.shatteredpixel.shatteredpixeldungeon.items.armor.Armor; +import com.shatteredpixel.shatteredpixeldungeon.items.food.Food; +import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfHealing; import com.shatteredpixel.shatteredpixeldungeon.journal.Notes; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; @@ -59,23 +66,34 @@ public class Shopkeeper extends NPC { public static int MAX_BUYBACK_HISTORY = 4; public ArrayList buybackItems = new ArrayList<>(); - + public static boolean seenBefore = false; @Override protected boolean act() { + if (!seenBefore && Dungeon.level.heroFOV[pos]) { + yell(Messages.get(this, "greetings", hero.name())); + seenBefore = true; + } else if(seenBefore && !Dungeon.level.heroFOV[pos]) { + seenBefore = false; + yell(Messages.get(this, "goodbye", hero.name())); + } if (Dungeon.level.visited[pos]){ Notes.add(Notes.Landmark.SHOP); } - sprite.turnTo( pos, Dungeon.hero.pos ); + sprite.turnTo( pos, hero.pos ); spend( TICK ); return super.act(); } @Override public void damage( int dmg, Object src ) { - flee(); + } + + @Override + public int defenseSkill( Char enemy ) { + return INFINITE_EVASION; } @Override @@ -84,31 +102,10 @@ public class Shopkeeper extends NPC { public void flee() { destroy(); - Notes.remove(Notes.Landmark.SHOP); - - if (sprite != null) { - sprite.killAndErase(); - CellEmitter.get(pos).burst(ElmoParticle.FACTORY, 6); - } - } - - @Override - public void destroy() { - super.destroy(); - for (Heap heap: Dungeon.level.heaps.valueList()) { - if (heap.type == Heap.Type.FOR_SALE) { - if (ShatteredPixelDungeon.scene() instanceof GameScene) { - CellEmitter.get(heap.pos).burst(ElmoParticle.FACTORY, 4); - } - if (heap.size() == 1) { - heap.destroy(); - } else { - heap.items.remove(heap.size()-1); - heap.type = Heap.Type.HEAP; - } - } - } + CellEmitter.get(pos).burst(ElmoParticle.FACTORY, 6); + hero.sprite.burst(15597568, 9); + sprite.killAndErase(); } @Override @@ -116,9 +113,35 @@ public class Shopkeeper extends NPC { return true; } + @Override + public void destroy() { + super.destroy(); + for (Heap heap: Dungeon.level.heaps.valueList()) { + if (heap.type == Heap.Type.FOR_SALE) { + CellEmitter.get( heap.pos ).burst( ElmoParticle.FACTORY, 4 ); + heap.type = Heap.Type.HEAP; + } + } + } + //shopkeepers are greedy! public static int sellPrice(Item item){ - return item.value() * 5 * (Dungeon.depth / 5 + 1); + int price = item.value() * 5 * (Dungeon.depth / 5 + 1); + + if(hero.buff(MagicGirlSayMoneyMore.class) != null){ + if(item instanceof Ankh ||item instanceof Food || item instanceof PotionOfHealing){ + price *= 2.5; + } + price *= 0.5; + //todo 3折 + } else if (hero.buff(BlessNoMoney.class) != null) { + price *= 0.3; + } + + if(Dungeon.isDLC(Conducts.Conduct.MONEYLETGO)){ + price *= 0.5; + } + return price; } public static WndBag sell() { @@ -129,7 +152,7 @@ public class Shopkeeper extends NPC { 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; + if (item.isEquipped(hero) && item.cursed) return false; return true; } @@ -155,7 +178,7 @@ public class Shopkeeper extends NPC { @Override public boolean interact(Char c) { - if (c != Dungeon.hero) { + if (c != hero) { return true; } Game.runOnRenderThread(new Callback() { @@ -184,8 +207,8 @@ public class Shopkeeper extends NPC { Item returned = buybackItems.remove(index-2); Dungeon.gold -= returned.value(); Statistics.goldCollected -= returned.value(); - if (!returned.doPickUp(Dungeon.hero)){ - Dungeon.level.drop(returned, Dungeon.hero.pos); + if (!returned.doPickUp(hero)){ + Dungeon.level.drop(returned, hero.pos); } } } @@ -220,7 +243,7 @@ public class Shopkeeper extends NPC { public String chatText(){ switch (Dungeon.depth){ case 6: default: - return Messages.get(this, "talk_prison_intro") + "\n\n" + Messages.get(this, "talk_prison_" + Dungeon.hero.heroClass.name()); + return Messages.get(this, "talk_prison_intro") + "\n\n" + Messages.get(this, "talk_prison_" + hero.heroClass.name()); case 11:case 13: return Messages.get(this, "talk_caves"); case 16: case 18: diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/custom/testmode/MobPlacer.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/custom/testmode/MobPlacer.java index 9205abcd6..a25b02d0e 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/custom/testmode/MobPlacer.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/custom/testmode/MobPlacer.java @@ -14,6 +14,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Bandit; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Bat; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.BlackHost; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Brute; +import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.CausticSlime; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.ColdMagicRat; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Crab; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.DM100; @@ -74,8 +75,8 @@ import com.shatteredpixel.shatteredpixeldungeon.scenes.CellSelector; import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; import com.shatteredpixel.shatteredpixeldungeon.scenes.PixelScene; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; +import com.shatteredpixel.shatteredpixeldungeon.ui.CheckBox; import com.shatteredpixel.shatteredpixeldungeon.ui.IconButton; -import com.shatteredpixel.shatteredpixeldungeon.ui.OptionSlider; import com.shatteredpixel.shatteredpixeldungeon.ui.RedButton; import com.shatteredpixel.shatteredpixeldungeon.ui.RenderedTextBlock; import com.shatteredpixel.shatteredpixeldungeon.ui.Window; @@ -85,12 +86,11 @@ import com.watabou.utils.PointF; import com.watabou.utils.Reflection; import java.util.ArrayList; -import java.util.Collections; import java.util.LinkedHashMap; -public class MobPlacer extends TestItem { +public class MobPlacer extends TestItem{ { - image = ItemSpriteSheet.CANDY_CANE; + image = ItemSpriteSheet.CANDLE; defaultAction = AC_PLACE; } @@ -100,7 +100,7 @@ public class MobPlacer extends TestItem { private int mobTier = 1; private int mobIndex = 0; private int elite = 0; - private static final int MAX_ELITE = 7; + private int elite_op = 0; private final ArrayList> eliteBuffs = new ArrayList<>(); { @@ -111,7 +111,16 @@ public class MobPlacer extends TestItem { eliteBuffs.add(ChampionEnemy.Growing.class); eliteBuffs.add(ChampionEnemy.Projecting.class); eliteBuffs.add(ChampionEnemy.Halo.class); - }; + eliteBuffs.add(ChampionEnemy.King.class); + eliteBuffs.add(ChampionEnemy.DelayMob.class); + + eliteBuffs.add(ChampionEnemy.Small.class); + eliteBuffs.add(ChampionEnemy.Bomber.class); + eliteBuffs.add(ChampionEnemy.Middle.class); + eliteBuffs.add(ChampionEnemy.Big.class); + eliteBuffs.add(ChampionEnemy.Sider.class); + eliteBuffs.add(ChampionEnemy.LongSider.class); + } @Override public ArrayList actions(Hero hero) { @@ -134,10 +143,11 @@ public class MobPlacer extends TestItem { Mob m = Reflection.newInstance(allData.get(dataThreshold(mobTier) + mobIndex).mobClass); m.pos = cell; GameScene.add(m); - if(elite>0){ - Collections.shuffle(eliteBuffs); - for(int i=0;i0){ + for(int i=0;i<15;++i){ + if((elite_op & (1<0){ + Buff.affect(m, eliteBuffs.get(i)); + } } } ScrollOfTeleportation.appear(m, cell); @@ -174,9 +184,7 @@ public class MobPlacer extends TestItem { case 3: return DataPack.DM201.ordinal() - DataPack.NEW_FIRE_ELE.ordinal() - 1; case 4: return DataPack.ELE_CHAOS.ordinal() - DataPack.DM201.ordinal() - 1; case 5: return DataPack.ACIDIC.ordinal() - DataPack.ELE_CHAOS.ordinal() - 1; - case 6: return DataPack.PIRANHA.ordinal() - DataPack.ACIDIC.ordinal() - 1; - case 7: return DataPack.NQHZ.ordinal() - DataPack.PIRANHA.ordinal() - 1; - case 8: default: return DataPack.IAS.ordinal() - DataPack.NQHZ.ordinal() - 1; + case 6: default: return DataPack.PIRANHA.ordinal() - DataPack.ACIDIC.ordinal() - 1; } } private int dataThreshold(int tier){ @@ -193,10 +201,6 @@ public class MobPlacer extends TestItem { return DataPack.ELE_CHAOS.ordinal()+1; case 6: return DataPack.ACIDIC.ordinal()+1; - case 7: - return DataPack.PIRANHA.ordinal()+1; - case 8: - return DataPack.NQHZ.ordinal()+1; } } @@ -206,6 +210,7 @@ public class MobPlacer extends TestItem { b.put("mobTier", mobTier); b.put("mobIndex", mobIndex); b.put("eliteTags", elite); + b.put("elite_ops", elite_op); } @Override @@ -214,31 +219,33 @@ public class MobPlacer extends TestItem { mobTier = b.getInt("mobTier"); mobIndex = b.getInt("mobIndex"); elite = b.getInt("eliteTags"); + elite_op = b.getInt("elite_ops"); } private class WndSetMob extends Window{ - private static final int WIDTH = 120; - private static final int HEIGHT = 118; + private static final int WIDTH = 150; + private static final int HEIGHT = 150; private static final int BTN_SIZE = 18; private static final int GAP = 2; private RenderedTextBlock selectedPage; private ArrayList mobButtons = new ArrayList<>(); private RenderedTextBlock selectedMob; + private ArrayList eliteOptions = new ArrayList<>(15); public WndSetMob(){ super(); resize(WIDTH, HEIGHT); - RedButton lhs = new RedButton("上一页", 6){ + RedButton lhs = new RedButton("<<<", 8){ @Override public void onClick(){ mobTier--; - if(mobTier < 1 || mobTier>8){ - mobTier = 8; + if(mobTier < 1 || mobTier>6){ + mobTier = 6; } mobIndex = Math.min(mobIndex, maxMobIndex(mobTier)); refreshImage(); @@ -248,11 +255,11 @@ public class MobPlacer extends TestItem { lhs.setRect(GAP, GAP, 24, 18); add(lhs); - RedButton rhs = new RedButton("下一页", 6){ + RedButton rhs = new RedButton(">>>", 8){ @Override public void onClick(){ mobTier++; - if(mobTier < 1 || mobTier > 8){ + if(mobTier < 1 || mobTier > 6){ mobTier = 1; } mobIndex = Math.min(mobIndex, maxMobIndex(mobTier)); @@ -271,7 +278,7 @@ public class MobPlacer extends TestItem { selectedMob.hardlight(0xFFFF44); PixelScene.align(selectedMob); add(selectedMob); - +/* OptionSlider op = new OptionSlider (M.L(MobPlacer.class, "elite"), "0", String.valueOf(MAX_ELITE), 0, MAX_ELITE) { @Override @@ -283,17 +290,47 @@ public class MobPlacer extends TestItem { op.setSelectedValue(elite); add(op); + */ + float pos = 92; + for (int i = 0; i < 15; ++i) { + CheckBox cb = new CheckBox(M.L(MobPlacer.class, "elite_name" + Integer.toString(i))); + cb.active = true; + cb.checked((elite & (1 << i)) > 0); + add(cb); + eliteOptions.add(cb); + + int row = i / 3; // 计算当前复选框所在的行数 + int column = i % 3; // 计算当前复选框所在的列数 + + float columnWidth = WIDTH / 3f - GAP * 4f / 3f; + float rowHeight = 16 + GAP; + + float columnOffset = (WIDTH - columnWidth * 3f - GAP * 2f) / 2f; + float rowOffset = pos + row * rowHeight; // 根据行数计算当前行的垂直偏移量 + + cb.setRect(columnOffset + column * (columnWidth + GAP), rowOffset, columnWidth, 16); + } + + createMobImage(); updateSelectedMob(); layout(); } + private void updateEliteSettings(){ + int el = 0; + for(int i=0;i<15;++i){ + el += eliteOptions.get(i).checked() ? (1< mobClass; private int imageId; @@ -448,4 +495,4 @@ public class MobPlacer extends TestItem { public int getImageId(){return imageId;} public Class getMobClass(){return mobClass;} } -} +} \ No newline at end of file diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Generator.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Generator.java index a89d15de4..c3b8e9d30 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Generator.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Generator.java @@ -407,7 +407,7 @@ public class Generator { WashCrime.class }; - WEP_T5.probs = new float[]{ 1, 3, 2, 3, 2, 3,2}; + WEP_T5.probs = new float[]{ 3, 3, 3, 3, 3, 3,3}; WEP_T6.classes = new Class[]{ IceFishSword.class, diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Gold.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Gold.java index 163966aea..f743ea6f7 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Gold.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Gold.java @@ -86,7 +86,7 @@ public class Gold extends Item { @Override public Item random() { - quantity = Dungeon.isDLC(Conducts.Conduct.BOSSRUSH) ? Random.Int( 130 + Dungeon.depth * 3, 160 + Dungeon.depth * 5 ) : + quantity = Dungeon.isDLC(Conducts.Conduct.BOSSRUSH) ? Random.Int( 130 + Dungeon.depth * 3, 160 + Dungeon.depth * 5 ) : Random.Int( 30 + Dungeon.depth * 10, 60 + Dungeon.depth * 20 ); return this; } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Heap.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Heap.java index e68b42268..9b7413205 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Heap.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Heap.java @@ -24,6 +24,8 @@ package com.shatteredpixel.shatteredpixeldungeon.items; import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.level; import com.shatteredpixel.shatteredpixeldungeon.Assets; +import com.shatteredpixel.shatteredpixeldungeon.Conducts; +import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Wraith; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.Shopkeeper; @@ -72,7 +74,9 @@ public class Heap implements Bundlable { REMAINS, BLACK } - public Type type = Type.HEAP; + + //好好好 + public Type type = Dungeon.isDLC(Conducts.Conduct.MONEYLETGO) ? Type.FOR_SALE : Type.HEAP; public int pos = 0; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/food/SakaMeat.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/food/SakaMeat.java new file mode 100644 index 000000000..07046e07b --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/food/SakaMeat.java @@ -0,0 +1,28 @@ +package com.shatteredpixel.shatteredpixeldungeon.items.food; + +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Bless; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; +import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; +import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; +import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; +import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; + +public class SakaMeat extends Food { + + { + image = ItemSpriteSheet.FISHBONE; + energy = 200f; + } + + @Override + protected void satisfy(Hero hero) { + super.satisfy(hero); + Buff.affect(hero, Bless.class, 50f); + GLog.w( Messages.get(SakaMeat.class, "oks") ); + } + + public int value() { + return 25 * quantity; + } +} + diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/quest/SakaFishSketon.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/quest/SakaFishSketon.java new file mode 100644 index 000000000..b65243faa --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/quest/SakaFishSketon.java @@ -0,0 +1,61 @@ +package com.shatteredpixel.shatteredpixeldungeon.items.quest; + +import com.shatteredpixel.shatteredpixeldungeon.Dungeon; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.LockedFloor; +import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; +import com.shatteredpixel.shatteredpixeldungeon.items.Item; +import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; +import com.shatteredpixel.shatteredpixeldungeon.scenes.InterlevelScene; +import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; +import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; +import com.watabou.noosa.Game; + +import java.util.ArrayList; + +public class SakaFishSketon extends Item { + + { + image = ItemSpriteSheet.FISHSKELETON; + stackable = true; + } + + private static final String AC_INTER_TP = "interlevel_tp"; + + @Override + public ArrayList actions(Hero hero ) { + ArrayList actions = super.actions( hero ); + if(Dungeon.depth < 0) { + 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; + } + InterlevelScene.mode = InterlevelScene.Mode.RETURN; + Game.switchScene(InterlevelScene.class); + } + } + + @Override + public boolean isUpgradable() { + return false; + } + + @Override + public boolean isIdentified() { + return true; + } + + @Override + public int value() { + return quantity * 1250; + } +} + 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 56a69eb11..236b282b2 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 @@ -5,7 +5,13 @@ package com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee; +import com.shatteredpixel.shatteredpixeldungeon.Dungeon; +import com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon; +import com.shatteredpixel.shatteredpixeldungeon.Statistics; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.LockedFloor; +import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; +import com.shatteredpixel.shatteredpixeldungeon.items.quest.BackGoKey; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.enchantments.Blazing; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.enchantments.Grim; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.enchantments.HaloBlazing; @@ -13,24 +19,65 @@ import com.shatteredpixel.shatteredpixeldungeon.items.weapon.enchantments.Kineti import com.shatteredpixel.shatteredpixeldungeon.items.weapon.enchantments.Shocking; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.enchantments.Unstable; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; +import com.shatteredpixel.shatteredpixeldungeon.scenes.InterlevelScene; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; +import com.shatteredpixel.shatteredpixeldungeon.ui.Icons; +import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; +import com.shatteredpixel.shatteredpixeldungeon.windows.WndOptions; +import com.watabou.noosa.Game; import com.watabou.utils.Bundle; import com.watabou.utils.Random; +import java.util.ArrayList; + public class LockSword extends MeleeWeapon { - - - private int lvl = 0; public LockSword() { super.image = ItemSpriteSheet.DG3; super.tier = 5; -// InterlevelScene.mode = InterlevelScene.Mode.ANCITYBOSS; -// Game.switchScene(InterlevelScene.class); } + private static final String AC_INTER_TP = "interlevel_tp"; + + @Override + public ArrayList actions(Hero hero ) { + ArrayList actions = super.actions( hero ); + if(Dungeon.depth >= 0 && Statistics.sakaBackStage == 0) { + 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(BackGoKey.class,"cannot_send")); + } else { + ShatteredPixelDungeon.scene().add(new WndOptions(Icons.get(Icons.WARNING), + Messages.get(this, "go_interlevel"), + Messages.get(this, "go_desc"), + Messages.get(this, "okay"), + Messages.get(this, "cancel")) { + @Override + protected void onSelect(int index) { + if (index == 0) { + InterlevelScene.mode = InterlevelScene.Mode.ANCITYBOSS; + Game.switchScene(InterlevelScene.class); + lvl -= 500; + } + } + }); + + } + } + } + + + @Override public int level() { if(lvl <=1000){ diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/SkyShield.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/SkyShield.java index 08a342b99..a2edc0d98 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/SkyShield.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/SkyShield.java @@ -44,6 +44,7 @@ public class SkyShield extends MeleeWeapon { return 6+3*buffedLvl(); //6 extra defence, plus 3 per level; } + @Override public String statsInfo(){ if (isIdentified()){ return Messages.get(this, "stats_desc", 12+3*buffedLvl()); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/WornShortsword.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/WornShortsword.java index f920bb041..6ab50f847 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/WornShortsword.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/WornShortsword.java @@ -24,8 +24,8 @@ package com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee; import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; -import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Golem; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob; +import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.bosses.SakaFishBoss; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; public class WornShortsword extends MeleeWeapon { @@ -57,7 +57,7 @@ public class WornShortsword extends MeleeWeapon { * 当是魔像的时候,返回的伤害还会追加5上去 * 如果希望最大值能给予5,你也可以使用Math.max(damage, 5); **/ - if(mob instanceof Golem) { + if(mob instanceof SakaFishBoss) { damage+=5; } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/AncientMysteryCityBossLevel.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/AncientMysteryCityBossLevel.java index 077c6a547..fc8282951 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/AncientMysteryCityBossLevel.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/AncientMysteryCityBossLevel.java @@ -1,16 +1,107 @@ package com.shatteredpixel.shatteredpixeldungeon.levels; +import static com.shatteredpixel.shatteredpixeldungeon.levels.AncientMysteryCityBossLevel.State.END_BOSS; +import static com.shatteredpixel.shatteredpixeldungeon.levels.AncientMysteryCityBossLevel.State.FALL_BOSS; +import static com.shatteredpixel.shatteredpixeldungeon.levels.AncientMysteryCityBossLevel.State.ONE_BOSS; +import static com.shatteredpixel.shatteredpixeldungeon.levels.AncientMysteryCityBossLevel.State.TWO_BOSS; + 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.mobs.Mob; +import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.bosses.DictFish; +import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.bosses.RoomStone; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.bosses.SakaFishBoss; +import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfTeleportation; +import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; +import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; +import com.watabou.utils.Bundle; import com.watabou.utils.PathFinder; import com.watabou.utils.Random; public class AncientMysteryCityBossLevel extends Level{ + public State pro; + + public State pro(){ + return pro; + } + + //地图状态 + public enum State { + ONE_BOSS, + TWO_BOSS, + END_BOSS, + FALL_BOSS + } + + public void progress() { + switch (pro) { + case ONE_BOSS: + //触发seal将枚举变为TWO_BOSS + seal(); + pro = TWO_BOSS; + break; + case TWO_BOSS: + //血量低于240后且在TWO_BOSS枚举中 + for (Mob boss : Dungeon.level.mobs.toArray(new Mob[0])) { + if(boss instanceof SakaFishBoss) { + //如果楼层为开始且boss血量小于240 2阶段 + if (pro == TWO_BOSS && boss.HP <= boss.HT/2) { + ScrollOfTeleportation.appear(boss, 175); + boss.HP= boss.HT/2; + boss.properties.add(Char.Property.IMMOVABLE); + boss.sprite.idle(); + pro = END_BOSS; + RoomStone roomStone = new RoomStone(); + roomStone.pos = 468; + GameScene.add(roomStone); + DictFish dictFish = new DictFish(); + GameScene.add(dictFish); + dictFish.pos = 476; + ScrollOfTeleportation.appear(dictFish, 476); + ScrollOfTeleportation.appear(roomStone, 468); + GLog.i(Messages.get(dictFish, "notice"),dictFish.name()); + GLog.n(Messages.get(roomStone, "notice"),roomStone.name()); + GLog.b(Messages.get(roomStone, "allget"),roomStone.name()); + } + } + } + break; + case END_BOSS: + for (Mob boss : Dungeon.level.mobs.toArray(new Mob[0])) { + if (boss instanceof SakaFishBoss) { + if (pro == END_BOSS) { + ScrollOfTeleportation.appear(boss, 337); + GLog.b(Messages.get(boss, "angry"),boss.name()); + boss.properties.remove(Char.Property.IMMOVABLE); + pro = FALL_BOSS; + } + } + } + break; + case FALL_BOSS: + break; + } + } + + private static final String PRO = "pro"; + + @Override + public void restoreFromBundle( Bundle bundle ) { + super.restoreFromBundle(bundle); + pro = bundle.getEnum(PRO, State.class); + } + + public void storeInBundle( Bundle bundle ) { + super.storeInBundle(bundle); + bundle.put(PRO, pro); + } + + + @Override public String tilesTex() { @@ -79,6 +170,8 @@ public class AncientMysteryCityBossLevel extends Level{ setSize(WIDTH, HEIGHT); map = WorldRoomShort.clone(); entrance = WIDTH*28+13; + //首次构建地图 + pro = ONE_BOSS; return true; } @@ -103,11 +196,11 @@ public class AncientMysteryCityBossLevel extends Level{ super.occupyCell( ch ); - boolean isTrue = ch.pos == LDBossDoor && ch == Dungeon.hero; + boolean isTrue = ch.pos == LDBossDoor && ch == Dungeon.hero && Dungeon.level.distance(ch.pos, entrance) >= 2; - //如果有生物来到BossDoor的下一个坐标,且生物是玩家,那么触发seal(). + //如果有生物来到BossDoor的下一个坐标,且生物是玩家,那么触发seal() . if (map[getBossDoor] == Terrain.DOOR && isTrue || map[getBossDoor] == Terrain.EMBERS && isTrue) { - seal(); + progress(); } } @@ -120,6 +213,11 @@ public class AncientMysteryCityBossLevel extends Level{ set( 688, Terrain.LOCKED_DOOR ); GameScene.updateMap( 688 ); Dungeon.observe(); + for (Mob mob : Dungeon.level.mobs.toArray(new Mob[0])){ + if (mob instanceof SakaFishBoss){ + ScrollOfTeleportation.appear(mob, 337); + } + } } /** @@ -128,7 +226,7 @@ public class AncientMysteryCityBossLevel extends Level{ @Override protected void createMobs() { SakaFishBoss boss = new SakaFishBoss(); - boss.pos = 337; + boss.pos = 175; mobs.add(boss); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/AncientMysteryCityLevel.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/AncientMysteryCityLevel.java new file mode 100644 index 000000000..e3756570b --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/AncientMysteryCityLevel.java @@ -0,0 +1,220 @@ +package com.shatteredpixel.shatteredpixeldungeon.levels; + +import com.shatteredpixel.shatteredpixeldungeon.Assets; +import com.shatteredpixel.shatteredpixeldungeon.items.Item; +import com.watabou.utils.Bundlable; +import com.watabou.utils.Bundle; +import com.watabou.utils.Random; + +import java.util.Collection; +import java.util.HashSet; + +public class AncientMysteryCityLevel extends Level { + + private static int WIDTH = 48; + private static int HEIGHT = 48; + { + color1 = 0x534f3e; + color2 = 0xb9d661; + } + + + public HashSet heapstogen; + public int[] heapgenspots; + public int[] teleportspots; + public int[] portswitchspots; + public int[] teleportassign; + public int[] destinationspots; + public int[] destinationassign; + public int prizeNo; + + private static final String HEAPSTOGEN = "heapstogen"; + private static final String HEAPGENSPOTS = "heapgenspots"; + private static final String TELEPORTSPOTS = "teleportspots"; + private static final String PORTSWITCHSPOTS = "portswitchspots"; + private static final String DESTINATIONSPOTS = "destinationspots"; + private static final String TELEPORTASSIGN = "teleportassign"; + private static final String DESTINATIONASSIGN= "destinationassign"; + private static final String PRIZENO = "prizeNo"; + + + @Override + public void storeInBundle(Bundle bundle) { + super.storeInBundle(bundle); + bundle.put(HEAPSTOGEN, heapstogen); + bundle.put(HEAPGENSPOTS, heapgenspots); + bundle.put(TELEPORTSPOTS, teleportspots); + bundle.put(PORTSWITCHSPOTS, portswitchspots); + bundle.put(DESTINATIONSPOTS, destinationspots); + bundle.put(DESTINATIONASSIGN, destinationassign); + bundle.put(TELEPORTASSIGN, teleportassign); + bundle.put(PRIZENO, prizeNo); + } + + + @Override + public String tileName(int tile) { + switch (tile) { + case Terrain.WATER: + return "Dark cold water."; + default: + return super.tileName(tile); + } + } + + + @Override + public String tileDesc(int tile) { + switch (tile) { + case Terrain.EMPTY_DECO: + return "There are old blood stains on the floor."; + case Terrain.BOOKSHELF: + return "This is probably a vestige of a prison library. Might it burn?"; + default: + return super.tileDesc(tile); + } + } + + + @Override + public void restoreFromBundle(Bundle bundle) { + + super.restoreFromBundle(bundle); + + heapgenspots = bundle.getIntArray(HEAPGENSPOTS); + teleportspots = bundle.getIntArray(TELEPORTSPOTS); + portswitchspots = bundle.getIntArray(PORTSWITCHSPOTS); + destinationspots = bundle.getIntArray(DESTINATIONSPOTS); + destinationassign = bundle.getIntArray(DESTINATIONASSIGN); + teleportassign = bundle.getIntArray(TELEPORTASSIGN); + prizeNo = bundle.getInt(PRIZENO); + + heapstogen = new HashSet(); + + Collection collectionheap = bundle.getCollection(HEAPSTOGEN); + for (Bundlable i : collectionheap) { + Item item = (Item) i; + if (item != null) { + heapstogen.add(item); + } + } + } + + @Override + public void create() { + heapstogen = new HashSet(); + heapgenspots = new int[20]; + teleportspots = new int[10]; + portswitchspots = new int[10]; + destinationspots = new int[10]; + destinationassign = new int[10]; + teleportassign = new int[10]; + super.create(); + } + + + public Item genPrizeItem(Class match) { + + if (heapstogen.size() == 0) + return null; + + for (Item item : heapstogen) { + if (match.isInstance(item)) { + heapstogen.remove(item); + return item; + } + } + + Item item = Random.element(heapstogen); + heapstogen.remove(item); + return item; + + } + + @Override + public String tilesTex() { + return Assets.Environment.TILES_ANCIENT; + } + + @Override + public String waterTex() { + return Assets.Environment.WATER_ANCIENT; + } + + @Override + protected boolean build() { + setSize(WIDTH, HEIGHT); + map = SokobanLayouts.SOKOBAN_CASTLE.clone(); + + buildFlagMaps(); + cleanWalls(); + createSwitches(); + + entrance = 15 + WIDTH * 11; + exit = 0; + + + return true; + } + + @Override + protected void createMobs() { + } + + + + protected void createSwitches(){ + + //spots where your portals are + teleportspots[0] = 11 + WIDTH * 10; + teleportspots[1] = 32 + WIDTH * 15; + teleportspots[2] = 25 + WIDTH * 40; + teleportspots[3] = 37 + WIDTH * 18; + teleportspots[4] = 45 + WIDTH * 33; + teleportspots[5] = 37 + WIDTH * 3; + teleportspots[6] = 43 + WIDTH * 2; + + //spots where your portal switches are + portswitchspots[0] = 19 + WIDTH * 10; + portswitchspots[1] = 19 + WIDTH * 6; + portswitchspots[2] = 9 + WIDTH * 8; + portswitchspots[3] = 16 + WIDTH * 37; + + + + //assign each switch to a portal + teleportassign[0] = 11 + WIDTH * 10; + teleportassign[1] = 11 + WIDTH * 10; + teleportassign[2] = 15 + WIDTH * 32; + teleportassign[3] = 37 + WIDTH * 3; + + //assign each switch to a destination spot + destinationassign[0] = 30 + WIDTH * 16; + destinationassign[1] = 23 + WIDTH * 40; + destinationassign[2] = 37 + WIDTH * 16; + destinationassign[3] = 42 + WIDTH * 2; + + + + //set the original destination of portals + destinationspots[0] = 0; + destinationspots[1] = 23 + WIDTH * 8; + destinationspots[2] = 23 + WIDTH * 8; + destinationspots[3] = 23 + WIDTH * 8; + destinationspots[4] = 34 + WIDTH * 6; + destinationspots[5] = 23 + WIDTH * 8; + destinationspots[6] = 23 + WIDTH * 8; + + + + + } + + + @Override + protected void createItems() { + + } + + +} \ No newline at end of file diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/ColdChestBossLevel.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/ColdChestBossLevel.java index 2a712d027..d81d9c388 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/ColdChestBossLevel.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/ColdChestBossLevel.java @@ -271,7 +271,7 @@ public class ColdChestBossLevel extends Level { @Override public void occupyCell(Char ch) { super.occupyCell(ch); - boolean isTrue = ch.pos == LDBossDoor && ch == Dungeon.hero; + boolean isTrue = ch.pos == LDBossDoor && ch == Dungeon.hero && Dungeon.level.distance(ch.pos, entrance) >= 2; if (map[getBossDoor] == Terrain.DOOR && isTrue || map[getBossDoor] == Terrain.EMBERS && isTrue) { progress(); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/ForestBossLevel.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/ForestBossLevel.java index e04b03cf4..94488159d 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/ForestBossLevel.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/ForestBossLevel.java @@ -168,7 +168,7 @@ public class ForestBossLevel extends Level { super.occupyCell( ch ); - boolean isTrue = ch.pos == LDBossDoor && ch == Dungeon.hero; + boolean isTrue = ch.pos == LDBossDoor && ch == Dungeon.hero && Dungeon.level.distance(ch.pos, entrance) >= 2; //如果有生物来到BossDoor的下一个坐标,且生物是玩家,那么触发seal(). if (map[getBossDoor] == Terrain.DOOR && isTrue || map[getBossDoor] == Terrain.EMBERS && isTrue) { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/LevelRules.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/LevelRules.java index a1233eeb1..0243b5fdb 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/LevelRules.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/LevelRules.java @@ -38,7 +38,7 @@ public class LevelRules { case 17: case 27: Buff.affect(hero, RandomBuff.class).set(5, 1); - return new AncientMysteryCityBossLevel(); + return new AncityLevel(); case 1: case 3: case 6: case 7: case 9: case 11: case 13: case 15: case 18: case 20: case 24: return new ItemLevel(); @@ -109,7 +109,7 @@ public class LevelRules { if ((Statistics.boss_enhance & 0x4) != 0) { return new CavesGirlDeadLevel(); } else { - return Random.Float() <= 0.4f ? new CaveTwoBossLevel() : new NewCavesBossLevel(); + return Random.Float() <= 0.4f ? new CaveTwoBossLevel() : new CaveTwoBossLevel(); } case 16: case 17: 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 0cecd1f2c..172f36128 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/RegularLevel.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/RegularLevel.java @@ -523,7 +523,10 @@ public abstract class RegularLevel extends Level { type = Heap.Type.CHEST; break; default: - type = Heap.Type.HEAP; + + type = Dungeon.isDLC(Conducts.Conduct.MONEYLETGO) ? Heap.Type.FOR_SALE : Heap.Type.HEAP; + + break; } @@ -551,7 +554,7 @@ public abstract class RegularLevel extends Level { for (Item item : itemsToSpawn) { int cell = randomDropCell(); - drop( item, cell ).type = Heap.Type.HEAP; + drop( item, cell ).type = Dungeon.isDLC(Conducts.Conduct.MONEYLETGO) ? Heap.Type.FOR_SALE : Heap.Type.HEAP; if (map[cell] == Terrain.HIGH_GRASS || map[cell] == Terrain.FURROWED_GRASS) { map[cell] = Terrain.GRASS; losBlocking[cell] = false; @@ -581,7 +584,7 @@ public abstract class RegularLevel extends Level { if (rose.droppedPetals < 11) { item = new DriedRose.Petal(); int cell = randomDropCell(); - drop( item, cell ).type = Heap.Type.HEAP; + drop( item, cell ).type = Dungeon.isDLC(Conducts.Conduct.MONEYLETGO) ? Heap.Type.FOR_SALE : Heap.Type.HEAP; if (map[cell] == Terrain.HIGH_GRASS || map[cell] == Terrain.FURROWED_GRASS) { map[cell] = Terrain.GRASS; losBlocking[cell] = false; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/SokobanLayouts.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/SokobanLayouts.java new file mode 100644 index 000000000..eebf77f6e --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/SokobanLayouts.java @@ -0,0 +1,245 @@ +package com.shatteredpixel.shatteredpixeldungeon.levels; + +public class SokobanLayouts { + + //32X32 + private static final int W = Terrain.WALL; + private static final int T = Terrain.WATER; + private static final int Z = Terrain.HIGH_GRASS; + private static final int D = Terrain.DOOR; + private static final int L = Terrain.DOOR; + private static final int Q = Terrain.WATER; //for readability + + //private static final int T = Terrain.INACTIVE_TRAP; + + private static final int E = Terrain.EMPTY; + //private static final int X = Terrain.EXIT; + + private static final int M = Terrain.WALL_DECO; + //private static final int P = Terrain.PEDESTAL; + + private static final int A = Terrain.EMPTY; + private static final int X = Terrain.EMPTY; + private static final int C = Terrain.EMPTY; + private static final int B = Terrain.EMPTY; + private static final int H = Terrain.EMPTY; + private static final int I = Terrain.EMPTY; + private static final int F = Terrain.EMPTY; + private static final int U = Terrain.STATUE; + private static final int G = Terrain.EMPTY; + private static final int S = Terrain.SECRET_DOOR; + private static final int R = Terrain.EMPTY; + private static final int V = Terrain.EMPTY; + + public static final int[] SOKOBAN_INTRO_LEVEL = { + W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, + W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, + W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, + W, W, W, W, W, W, W, E, Q, Q, Q, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, + W, W, W, W, W, W, W, Q, Q, Q, Q, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, Q, Q, Q, Q, Q, Q, Q, W, W, W, W, W, W, W, + W, W, W, W, W, W, W, Q, U, A, U, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, S, W, W, W, W, W, Q, W, W, W, W, W, W, W, + W, W, W, W, W, W, W, Q, U, F, U, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, C, Q, W, Q, C, W, W, W, Q, W, W, W, W, W, W, W, + W, W, W, W, W, W, W, Q, U, U, Q, D, Q, Q, Q, Q, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, Q, G, Q, Q, Q, G, Q, W, W, Q, W, W, W, W, W, W, W, + W, W, W, W, W, W, W, W, W, W, W, W, Q, Q, Q, Q, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, Q, Q, Q, Q, Q, W, W, W, Q, W, W, W, W, W, W, W, + W, W, W, W, Q, Q, W, W, W, W, W, W, U, U, A, U, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, Q, Q, Q, Q, Q, W, W, W, Q, W, W, W, W, W, W, W, + W, W, W, W, Q, Q, S, Q, Q, Q, Q, D, F, Q, Q, Q, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, Q, Q, Q, Q, Q, W, W, W, Q, W, W, W, W, W, W, W, + W, W, W, W, H, W, W, U, U, Q, Q, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, Q, U, F, U, Q, W, W, W, Q, W, W, W, W, W, W, W, + W, W, W, W, W, W, W, U, F, A, Q, W, Q, Q, Q, Q, W, Q, Q, Q, Q, Q, W, W, W, W, W, W, W, W, W, W, Q, U, F, U, Q, W, W, W, Q, W, W, W, W, W, W, W, + W, W, W, W, W, W, W, U, U, X, U, W, Q, Q, Q, Q, W, Q, C, Q, Q, U, W, W, W, W, W, W, W, W, W, W, Q, U, F, U, Q, W, W, W, Q, W, W, W, W, W, W, W, + W, W, W, W, W, W, W, H, U, U, F, D, Q, Q, C, Q, W, Q, G, Q, Q, F, D, Q, Q, Q, Q, W, W, W, W, W, G, U, F, U, G, W, W, W, Q, W, W, W, W, W, W, W, + W, W, W, W, W, W, W, S, W, W, W, W, Q, Q, Q, Q, W, Q, Q, Q, Q, U, W, C, G, G, Q, W, W, W, W, W, C, U, H, U, C, W, W, W, Q, W, W, W, W, W, W, W, + W, W, W, W, W, W, W, F, W, W, W, W, Q, Q, Q, Q, D, Q, Q, Q, Q, Q, W, Q, Q, Q, Q, W, W, W, W, W, W, W, S, W, W, W, W, W, Q, W, W, W, W, W, W, W, + W, W, W, W, W, W, W, Q, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, Q, Q, Q, U, W, W, W, W, W, W, W, Q, W, W, W, W, W, Q, W, W, W, W, W, W, W, + W, W, W, W, W, W, W, S, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, Q, Q, U, F, W, W, W, W, W, W, W, Q, W, W, W, W, W, Q, W, W, W, W, W, W, W, + W, W, W, W, W, Q, B, Q, Q, Q, D, F, Q, Q, Q, D, Q, Q, Q, Q, W, W, W, W, W, W, D, W, W, W, W, W, W, W, Q, W, W, W, W, W, Q, W, W, W, W, W, W, W, + W, W, W, W, W, Q, Q, Q, Q, Q, W, U, U, U, Q, W, Q, Q, Q, Q, W, W, W, W, W, W, Q, W, W, W, W, W, W, Q, Q, Q, W, W, W, W, Q, W, W, W, W, W, W, W, + W, W, W, W, W, Q, Q, R, Q, Q, W, B, B, Q, Q, W, Q, G, Q, Q, W, Q, Q, Q, Q, W, Q, H, W, W, W, W, W, Q, Q, B, W, Q, F, Q, A, I, W, W, W, W, W, W, + W, W, W, W, W, Q, Q, Q, Q, Q, W, U, U, U, Q, W, Q, G, Q, Q, W, Q, Q, Q, Q, D, Q, W, W, W, W, W, W, Q, Q, Q, W, W, W, W, W, W, W, W, W, W, W, W, + W, W, W, W, W, Q, Q, Q, Q, Q, W, H, F, Q, Q, W, Q, G, Q, Q, W, Q, I, A, Q, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, + W, W, W, W, W, D, W, W, W, W, W, W, W, W, W, W, Q, C, Q, Q, W, Q, Q, Q, Q, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, + W, W, W, W, W, Q, Q, Q, Q, Q, W, W, W, W, W, W, Q, Q, Q, Q, L, Q, Q, Q, Q, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, + W, W, W, W, W, Q, Q, X, Q, Q, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, + W, W, W, W, W, Q, Q, I, V, Q, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, + W, W, W, W, W, Q, Q, Q, Q, Q, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, + W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, + W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, + W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, + W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, + W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, + W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, + W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, + W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, + W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, + W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, + W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, + W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, + W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, + W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, + W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, + W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, + W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, + W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, + W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W + + }; + + public static final int[] SOKOBAN_CASTLE = { + W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W, + W,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,I,T,I,T,I,T,I,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,W, + W,T,T,W,S,W,W,W,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,W,W,W,W,W,T,T,W, + W,T,T,W,R,U,Q,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,Q,F,H,W,T,T,W, + W,T,T,W,U,U,Q,Q,Q,Q,Q,Q,Q,Q,Q,Q,Q,Q,Q,Q,Q,Q,Q,Q,Q,Q,Q,Q,Q,Q,Q,Q,Q,Q,Q,Q,Q,Q,Q,Q,Q,Q,F,F,W,T,T,W, + W,T,T,W,Q,Q,Q,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,Q,Q,Q,W,T,T,W, + W,T,T,W,W,Q,W,W,W,W,W,W,W,W,W,W,W,W,W,W,M,W,W,H,W,H,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,Q,W,W,T,T,W, + W,T,T,W,W,Q,W,W,W,W,G,Q,W,F,G,C,F,Q,Q,F,Q,B,W,F,W,F,W,F,F,H,F,H,F,F,F,F,W,Q,Q,W,W,W,Q,W,T,T,W,W, + W,T,T,W,W,Q,W,W,W,W,H,Q,S,F,F,X,F,Q,C,U,Q,Q,W,Q,W,Q,W,F,F,F,F,F,F,F,F,F,S,Q,X,W,W,W,Q,W,T,T,W,W, + W,T,T,W,W,Q,W,W,W,W,Q,Q,W,F,F,X,F,G,C,U,Q,Q,W,Q,W,Q,W,F,F,F,F,F,F,F,F,F,W,Q,Q,W,W,W,Q,W,T,T,W,W, + W,T,T,W,W,Q,W,W,W,W,F,F,W,H,F,Q,F,G,H,U,Q,Q,W,Q,W,Q,W,Q,X,X,X,X,X,Q,Q,Q,W,F,F,W,W,W,Q,W,T,T,W,W, + W,T,T,W,W,Q,W,W,W,W,W,W,W,W,W,W,W,W,L,W,W,W,W,Q,B,Q,M,W,W,W,D,W,W,W,W,S,W,W,S,W,W,W,Q,W,T,T,W,W, + W,T,T,W,W,Q,W,W,W,W,W,W,W,W,W,W,Q,F,F,F,Q,W,W,Q,M,Q,M,W,H,F,U,F,H,W,W,W,W,W,Q,Q,Q,W,Q,W,T,T,W,W, + W,T,T,W,W,Q,W,W,W,W,W,W,W,W,W,W,U,F,U,F,U,W,W,Q,M,Q,M,W,U,U,Q,U,U,W,W,W,W,W,U,Q,H,W,Q,W,T,T,W,W, + W,T,T,W,W,Q,W,W,W,W,W,W,W,W,W,W,Q,X,G,X,Q,W,W,Q,M,Q,M,W,Q,G,Q,G,Q,W,W,W,W,W,S,W,W,W,Q,W,T,T,W,W, + W,T,T,W,W,Q,W,W,W,W,W,W,W,W,W,W,Q,C,G,C,Q,W,W,Q,M,Q,M,W,C,G,Q,G,C,W,W,H,H,Q,Q,M,W,W,Q,W,T,T,W,W, + W,T,T,W,W,Q,W,W,W,W,W,W,W,W,W,W,W,W,D,W,W,W,W,Q,M,Q,M,W,W,W,S,W,W,W,W,Q,Q,X,Q,M,W,W,Q,W,T,T,W,W, + W,T,T,W,W,Q,W,W,W,U,U,U,C,L,Q,W,W,W,F,W,W,W,W,Q,M,Q,W,W,W,W,F,W,W,W,W,U,Q,U,U,M,W,W,Q,W,T,T,W,W, + W,T,T,W,W,Q,W,W,W,H,F,G,Q,W,Q,W,W,W,F,W,W,W,W,Q,W,Q,W,W,W,W,F,W,W,W,W,Q,Q,Q,Q,M,W,W,Q,W,T,T,W,W, + W,T,T,W,W,Q,W,W,W,U,U,U,B,W,Q,W,W,W,G,G,I,W,W,Q,W,Q,W,W,Q,G,F,W,W,W,W,Q,Q,Q,Q,M,W,W,Q,W,T,T,W,W, + W,T,T,W,W,Q,W,W,W,W,W,W,W,W,Q,W,W,W,X,Q,C,W,W,G,W,G,W,W,C,A,G,W,W,W,W,Q,Q,Q,Q,W,W,W,Q,W,T,T,W,W, + W,T,T,W,W,Q,W,W,W,Q,U,U,F,D,Q,W,W,W,Q,Q,C,Q,G,X,C,X,G,Q,Q,C,Q,W,W,W,W,Q,Q,Q,Q,W,W,W,Q,W,T,T,W,W, + W,T,T,W,W,Q,W,W,W,I,C,Q,F,W,Q,W,W,W,W,W,W,W,W,C,E,C,W,W,W,W,W,W,Q,W,W,W,W,Q,W,W,W,W,Q,W,T,T,W,W, + W,T,T,W,W,Q,W,W,W,G,X,Q,Q,W,X,Q,Q,Q,Q,Q,Q,Q,G,X,C,X,G,Q,Q,Q,Q,Q,X,Q,W,W,W,L,W,W,W,W,Q,W,T,T,W,W, + W,T,T,W,W,Q,W,W,W,Q,U,U,Q,W,Q,W,W,M,W,W,M,W,W,G,W,G,W,W,W,W,W,W,W,Q,W,Q,Q,Q,Q,Q,W,W,Q,W,T,T,W,W, + W,T,T,W,W,Q,W,W,W,W,W,W,W,W,Q,W,F,F,F,F,F,U,W,Q,W,Q,W,W,W,W,W,W,W,Q,W,U,U,Q,U,U,W,W,Q,W,T,T,W,W, + W,T,T,W,W,Q,W,W,W,U,U,Q,Q,W,Q,W,F,F,F,F,F,U,W,Q,W,Q,W,W,W,W,W,W,W,Q,W,Q,G,X,G,I,S,S,Q,W,T,T,W,W, + W,Q,T,W,W,Q,W,R,L,F,F,X,Q,W,Q,W,F,F,H,F,F,U,W,Q,W,Q,W,W,W,W,W,Q,Q,Q,W,U,F,Q,F,U,W,W,Q,W,T,T,W,W, + W,T,T,W,W,Q,W,W,W,H,U,G,G,D,Q,W,F,F,F,F,F,U,W,Q,W,Q,W,W,W,W,W,Q,Q,Q,Q,Q,Q,X,Q,Q,W,W,Q,W,T,T,W,M, + W,T,T,W,W,Q,W,W,W,F,U,Q,C,W,Q,W,F,F,F,F,F,U,W,Q,W,Q,W,W,W,W,W,Q,Q,W,W,U,Q,X,Q,U,W,W,Q,W,T,T,W,W, + W,T,T,W,W,Q,W,W,W,S,W,W,W,W,Q,W,Q,X,X,Q,Q,Q,W,Q,W,Q,W,W,W,W,W,Q,W,W,W,Q,Q,Q,Q,Q,W,W,Q,W,T,T,W,W, + W,T,T,W,W,Q,W,W,W,A,W,W,W,W,D,W,W,W,W,L,W,W,W,Q,W,Q,W,W,H,S,I,Q,Q,W,W,W,W,W,W,W,W,W,Q,W,T,T,W,W, + W,T,T,W,W,Q,W,W,W,G,W,W,W,W,Q,Q,Q,Q,Q,Q,Q,G,W,Q,W,Q,W,W,W,W,W,L,W,W,W,W,W,W,W,W,W,W,Q,W,T,T,W,W, + W,T,T,W,W,Q,W,W,Q,Q,Q,W,W,W,Q,U,Q,U,Q,F,X,U,W,Q,W,Q,W,W,W,W,U,Q,U,S,Q,W,W,W,W,W,W,W,Q,W,T,T,W,W, + W,T,T,W,W,Q,W,W,U,F,U,W,W,W,Q,Q,Q,Q,Q,Q,X,G,W,Q,W,Q,W,W,W,W,Q,X,Q,W,Q,Q,Q,Q,Q,W,W,W,Q,W,T,T,W,W, + W,T,T,W,W,Q,W,W,I,H,C,W,W,W,Q,U,Q,U,Q,U,Q,U,W,Q,W,Q,W,W,W,W,Q,Q,Q,W,W,W,Q,R,Q,W,W,W,Q,W,T,T,W,W, + W,T,T,W,W,Q,W,W,W,W,W,W,W,W,Q,U,Q,U,Q,U,Q,U,W,Q,B,Q,W,W,W,W,X,X,X,W,W,W,Q,Q,Q,W,W,W,Q,W,T,T,W,M, + W,T,T,W,W,Q,W,W,Q,Q,Q,W,W,W,Q,Q,X,Q,Q,Q,Q,B,W,Q,W,Q,W,W,W,W,Q,Q,Q,W,W,W,W,W,W,W,W,W,Q,W,T,T,W,W, + W,T,T,W,W,Q,W,W,Q,Q,Q,W,W,W,Q,U,Q,U,Q,U,F,U,W,Q,W,Q,W,W,W,W,Q,X,Q,Q,Q,Q,Q,Q,Q,Q,W,W,Q,W,T,T,W,W, + W,T,T,W,W,Q,W,W,X,X,X,W,W,W,Q,U,Q,U,F,U,F,U,W,Q,W,Q,W,W,W,W,Q,Q,Q,W,W,W,W,W,W,W,W,W,Q,W,T,T,W,W, + W,T,T,W,W,Q,W,W,I,H,I,W,W,W,Q,Q,C,G,F,F,H,I,W,F,W,F,W,W,W,W,Q,H,V,W,W,W,W,W,W,W,W,W,Q,W,T,T,W,W, + W,T,T,W,W,Q,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,H,W,H,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,Q,W,W,T,W,W, + W,T,T,W,Q,Q,Q,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,Q,Q,Q,W,T,W,M, + W,T,Q,W,F,F,Q,Q,Q,Q,Q,Q,Q,Q,Q,Q,Q,Q,Q,Q,Q,Q,Q,Q,Q,Q,Q,Q,Q,Q,Q,Q,Q,Q,Q,Q,Q,Q,Q,Q,Q,Q,F,F,W,T,W,W, + W,T,T,W,H,F,Q,W,M,W,W,W,W,M,W,W,W,W,W,W,W,W,W,W,M,W,W,W,W,W,W,W,W,M,W,W,W,W,W,W,W,Q,F,H,S,T,W,W, + W,T,T,W,W,W,W,W,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,W,W,W,W,W,T,W,W, + W,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,W,W, + W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W + }; + + + + + public static final int[] SOKOBAN_TELEPORT_LEVEL = { + W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, + W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, + W, W, W, W, R, Q, Q, W, W, W, W, W, W, W, W, H, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, Q, F, H, H, F, Q, W, W, W, W, W, W, W, W, W, W, W, + W, W, W, W, Q, X, H, W, W, W, W, W, W, W, W, F, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, Q, F, F, F, F, Q, W, W, W, W, W, W, W, W, W, W, W, + W, W, W, W, B, F, Q, W, W, W, W, W, W, W, W, G, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, Q, X, Q, Q, Q, W, W, W, W, W, W, W, W, W, W, W, W, + W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, C, R, S, Q, L, B, W, F, R, W, W, W, W, W, W, W, Q, R, W, W, W, W, W, W, W, Q, Q, Q, W, W, W, W, W, + W, W, I, F, R, W, W, W, W, F, H, F, W, W, W, W, W, W, W, W, W, W, F, F, F, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, A, X, Q, W, W, W, W, W, + W, W, Q, F, F, W, W, W, W, F, F, F, W, W, W, W, W, W, W, W, W, W, Q, Q, Q, Q, W, W, W, W, W, W, W, W, W, W, W, W, W, F, F, F, Q, W, W, W, W, W, + W, W, Q, Q, Q, W, W, W, W, Q, X, Q, W, W, W, W, W, W, W, W, W, W, Q, Q, Q, R, W, W, W, W, W, W, W, W, W, W, W, W, W, F, F, F, R, W, W, W, W, W, + W, W, Q, Q, H, W, W, W, W, Q, R, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, H, F, W, W, W, W, W, W, W, + W, W, R, Q, Q, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, + W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, + W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, Q, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, + W, W, W, W, W, W, W, C, G, G, G, G, F, F, F, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, + W, W, W, W, W, W, W, Q, Q, X, A, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, V, Q, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, + W, W, W, W, W, W, W, Q, X, Q, Q, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, F, W, W, Q, Q, Q, Q, W, W, Q, Q, Q, I, W, W, W, W, + W, W, W, W, W, W, W, Q, E, Q, Q, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, Q, C, W, Q, V, X, Q, W, W, Q, X, V, Q, W, W, W, W, + W, W, Q, R, W, W, W, Q, R, X, Q, W, W, W, W, W, Q, R, Q, W, W, W, W, W, W, W, W, W, W, W, W, G, W, W, Q, Q, Q, R, W, W, R, Q, Q, Q, W, W, W, W, + W, W, Q, X, W, W, W, Q, Q, I, Q, W, W, W, W, W, Q, X, Q, W, W, W, W, W, W, W, W, W, W, W, W, Q, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, + W, W, C, G, W, W, W, Q, Q, Q, Q, W, W, W, W, W, F, F, F, W, W, W, W, H, W, W, W, W, W, W, W, Q, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, + W, W, C, G, W, W, W, W, W, W, W, W, W, W, W, W, Q, H, Q, W, W, W, W, S, W, W, W, W, W, W, W, Q, W, W, Q, Q, Q, R, W, W, R, Q, Q, Q, W, W, W, W, + W, W, C, G, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, R, Q, U, F, W, W, W, W, W, W, Q, W, W, Q, V, X, Q, W, W, Q, X, V, Q, W, W, W, W, + W, W, U, F, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, U, A, R, W, W, W, W, W, Q, W, W, I, Q, Q, Q, W, W, Q, Q, Q, H, W, W, W, W, + W, W, U, F, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, Q, Q, Q, W, W, W, W, W, W, Q, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, + W, W, U, F, W, W, W, W, W, W, W, W, W, Q, C, R, W, W, W, W, W, Q, Q, Q, W, W, W, W, W, W, W, Q, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, + W, W, U, Q, Q, Q, Q, Q, W, Q, Q, W, W, Q, X, Q, W, W, W, W, W, Q, Q, W, W, W, W, W, W, W, W, Q, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, + W, W, U, Q, U, Q, Q, Q, L, Q, H, W, W, G, G, G, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, Q, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, + W, W, U, I, U, I, Q, Q, W, Q, Q, W, W, Q, Q, I, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, L, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, + W, W, W, W, W, W, W, W, W, W, W, W, W, W, L, W, W, W, W, W, W, W, W, W, W, H, Q, Q, Q, Q, F, F, F, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, R, H, W, W, + W, W, W, W, W, W, W, W, W, W, W, W, W, W, I, W, W, W, W, W, W, W, W, W, W, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, W, W, + W, W, W, W, W, W, W, W, W, W, W, W, W, W, Q, W, W, W, W, W, W, W, W, W, W, Q, U, Q, Q, Q, U, Q, U, Q, Q, U, Q, U, Q, Q, Q, Q, Q, Q, U, Q, W, W, + W, W, W, W, W, W, W, W, W, W, W, W, W, W, Q, W, W, W, W, W, W, W, W, W, W, Q, Q, Q, Q, Q, U, Q, U, Q, Q, U, Q, U, Q, Q, Q, Q, Q, Q, Q, Q, W, W, + W, W, W, W, W, W, W, W, W, W, W, W, W, W, Q, W, W, W, W, W, W, W, W, W, W, Q, U, Q, U, U, U, Q, U, F, F, U, Q, U, U, U, Q, Q, Q, Q, U, Q, W, W, + W, W, W, W, W, W, W, W, W, W, W, W, W, W, Q, W, W, W, W, W, W, W, W, W, W, Q, Q, Q, F, F, F, F, F, F, F, F, F, F, F, F, Q, Q, Q, Q, Q, Q, W, W, + W, W, W, W, W, W, W, W, W, W, W, W, W, W, L, W, W, W, W, W, W, W, W, W, W, Q, U, G, U, F, Q, Q, Q, Q, Q, Q, Q, Q, F, U, G, Q, Q, Q, U, I, W, W, + W, W, W, W, W, W, W, W, W, W, W, W, Q, F, F, F, Q, W, W, W, W, W, W, W, W, Q, Q, G, F, Q, Q, X, Q, X, X, Q, X, Q, Q, F, G, Q, Q, Q, Q, Q, W, W, + W, W, W, W, W, W, W, W, W, W, W, W, Q, Q, Q, Q, Q, W, W, W, W, W, W, W, W, Q, U, G, U, F, V, Q, V, Q, Q, V, Q, V, F, U, G, Q, Q, Q, U, Q, W, W, + W, W, W, W, W, W, W, W, W, W, W, W, Q, Q, H, Q, Q, W, W, W, W, W, W, W, W, Q, Q, Q, F, F, Q, Q, Q, Q, Q, Q, Q, Q, F, F, Q, Q, Q, Q, Q, Q, W, W, + W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, Q, U, Q, U, U, U, U, U, U, U, U, U, U, U, U, Q, Q, Q, Q, U, Q, W, W, + W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, Q, Q, Q, Q, Q, Q, Q, X, Q, Q, X, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, W, W, + W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, I, U, Q, Q, Q, Q, Q, X, Q, Q, X, Q, Q, Q, Q, Q, Q, Q, Q, U, I, W, W, + W, W, W, Q, Q, H, I, H, Q, Q, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, Q, Q, V, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, W, W, + W, W, W, F, F, F, F, F, F, F, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, Q, U, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, U, Q, W, W, + W, W, W, F, F, F, F, F, F, F, W, W, W, W, W, W, W, W, W, H, Q, W, W, W, W, U, U, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, W, W, + W, W, W, Q, X, X, R, C, Q, Q, W, W, W, W, W, W, W, W, W, H, Q, Q, Q, R, S, Q, U, Q, U, Q, U, Q, U, Q, U, Q, U, Q, U, Q, U, Q, U, Q, U, Q, W, W, + W, W, W, Q, Q, G, G, G, I, W, W, W, W, W, W, W, W, W, W, H, Q, W, W, W, W, H, U, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, H, W, W, + W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, + W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W + + + }; + + public static final int[] SOKOBAN_PUZZLE_LEVEL = { + W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, + W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, + W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, Q, Q, R, W, W, W, W, + W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, U, Q, Q, Q, Q, U, S, R, W, W, W, Q, A, Q, W, W, W, W, + W, W, W, W, W, W, W, W, W, W, W, W, C, C, U, H, U, C, C, W, W, W, W, W, W, W, W, W, W, W, Q, Q, H, H, Q, Q, W, W, W, W, W, U, I, U, W, W, W, W, + W, W, W, W, W, W, W, W, W, W, W, W, G, G, U, F, U, G, G, W, W, W, W, W, W, W, W, W, W, W, Q, Q, H, H, Q, Q, W, W, W, W, W, U, I, U, W, W, W, W, + W, W, W, W, W, W, W, W, Q, Q, S, Q, G, G, U, F, U, G, G, V, S, Q, Q, U, W, W, W, W, W, W, U, Q, Q, Q, Q, U, W, W, W, W, W, U, I, U, W, W, W, W, + W, W, W, W, W, W, W, W, G, U, W, W, C, I, U, F, U, I, C, W, W, W, W, G, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, U, I, U, W, W, W, W, + W, W, W, W, W, W, W, W, W, V, W, W, G, G, U, F, U, G, G, W, W, W, W, Q, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, U, I, U, W, W, W, W, + W, W, W, W, W, W, W, W, W, Q, W, W, C, Q, U, F, U, Q, C, W, W, W, W, G, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, U, I, U, W, W, W, W, + W, W, W, W, W, W, W, W, W, Q, S, R, G, G, U, F, U, G, G, V, S, Q, Q, U, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, U, I, U, W, W, W, W, + W, W, W, W, W, W, W, W, W, W, W, W, Q, Q, A, E, A, Q, I, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, U, I, U, W, W, W, W, + W, W, W, W, W, W, W, W, W, W, W, W, U, G, C, U, C, G, U, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, U, H, U, W, W, W, W, + W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, L, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, + W, W, W, W, W, W, W, W, H, Q, Q, Q, W, B, Q, Q, Q, B, W, Q, Q, Q, Q, W, W, W, W, W, W, W, W, W, W, W, W, W, W, Q, Q, Q, W, W, W, W, W, W, W, W, + W, W, W, W, W, W, W, W, F, F, F, F, W, G, G, Q, G, G, W, Q, Q, F, F, W, W, W, W, W, W, W, Q, Q, R, W, W, W, Q, Q, U, Q, H, W, W, W, W, W, W, W, + W, W, W, W, W, W, W, W, H, Q, Q, Q, S, Q, Q, G, Q, Q, S, Q, G, F, H, W, W, W, W, W, W, W, Q, H, Q, W, W, W, Q, Q, Q, Q, H, W, W, W, W, W, W, W, + W, W, W, W, W, W, W, W, F, F, F, F, W, Q, F, F, F, Q, W, Q, Q, F, F, W, W, W, W, W, W, W, Q, Q, Q, W, W, W, Q, Q, U, Q, H, W, W, W, W, W, W, W, + W, W, W, W, W, W, W, W, H, Q, Q, Q, W, Q, F, H, F, Q, W, Q, Q, Q, Q, W, W, W, W, W, W, W, W, W, W, W, W, W, W, R, Q, Q, W, W, W, W, W, W, W, W, + W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, L, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, + W, W, W, W, W, W, W, W, W, W, W, W, W, Q, C, G, C, Q, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, + W, W, W, W, W, W, W, W, W, W, W, W, W, W, X, G, X, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, + W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, F, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, + W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, F, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, Q, Q, Q, Q, Q, Q, W, W, W, + W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, F, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, Q, W, W, W, W, Q, W, W, W, + W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, F, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, Q, W, W, W, W, Q, W, W, W, + W, W, W, W, W, W, W, W, W, W, W, W, W, C, C, C, C, C, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, Q, W, W, W, W, Q, W, W, W, + W, W, W, W, W, W, W, W, W, W, W, I, Q, G, G, G, G, G, Q, I, W, W, W, W, W, W, W, W, W, W, W, W, W, F, F, H, H, Q, L, Q, W, W, W, W, Q, W, W, W, + W, W, W, W, W, W, W, W, W, W, W, Q, Q, U, U, U, U, U, Q, Q, W, W, W, W, W, W, W, W, W, Q, H, Q, W, F, U, U, U, U, W, T, W, W, W, W, Q, W, W, W, + W, W, W, W, W, W, W, W, W, W, C, G, U, F, Q, Q, Q, F, U, G, C, W, W, W, W, W, W, W, W, Q, Q, Q, W, A, X, B, I, Q, W, T, W, W, W, Q, Q, W, W, W, + W, W, W, W, W, W, W, W, W, W, C, G, U, Q, F, F, F, Q, U, G, C, W, W, W, W, W, W, W, W, Q, Q, Q, W, Q, Q, Q, Q, Q, W, T, W, W, W, U, A, W, W, W, + W, W, W, W, W, W, W, W, W, W, C, G, U, Q, U, F, U, Q, U, G, C, W, W, W, W, W, W, W, W, W, Q, W, W, Q, Q, Q, Q, Q, W, T, W, W, W, T, T, W, W, W, + W, W, W, W, W, W, W, W, W, W, C, G, U, Q, U, F, U, Q, U, G, C, W, W, W, W, W, W, W, W, W, Q, W, W, L, W, W, W, W, W, T, W, W, W, T, F, W, W, W, + W, W, W, W, W, W, W, W, W, W, C, G, U, F, U, H, U, F, U, G, C, W, W, W, W, W, W, W, Q, Q, Q, Q, A, F, F, Q, W, W, W, T, W, W, W, T, F, R, W, W, + W, W, W, W, W, W, W, W, W, W, W, W, F, U, U, U, U, U, F, W, W, W, W, W, W, W, W, W, G, W, W, W, W, W, W, Q, W, W, W, T, W, W, W, T, F, W, W, W, + W, W, W, W, W, W, W, W, W, H, F, S, Q, B, Q, B, Q, B, Q, S, F, H, W, W, W, W, W, Q, Q, W, W, W, W, W, W, Q, W, W, W, T, W, W, W, T, T, W, W, W, + W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, L, W, W, W, W, W, W, W, W, W, W, W, W, Q, W, W, W, W, W, W, Q, W, W, W, T, W, W, W, T, T, W, W, W, + W, W, W, W, W, W, W, W, W, W, W, W, W, W, Q, G, V, W, W, W, W, W, W, W, W, W, W, W, Q, W, W, W, W, W, W, Q, W, W, W, T, T, T, T, T, T, W, W, W, + W, W, W, W, W, W, W, W, W, W, W, W, B, G, G, G, G, G, F, F, Q, W, W, W, W, W, W, W, Q, W, W, W, W, W, W, Q, W, W, W, W, W, W, W, W, W, W, W, W, + W, W, W, W, W, W, W, W, W, W, W, W, W, C, C, G, C, C, W, W, W, W, W, W, W, W, W, W, Q, Q, Q, Q, Q, Q, Q, Q, W, W, W, W, W, W, W, W, W, W, W, W, + W, W, W, W, W, W, W, W, W, W, W, W, W, U, U, G, U, U, W, W, W, W, W, Q, Q, R, W, W, Q, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, + W, W, W, W, W, W, W, W, W, W, W, W, W, C, C, Q, C, C, W, W, W, W, W, X, Q, Q, W, W, Q, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, + W, W, W, W, W, W, W, W, W, W, W, W, W, U, G, Q, G, U, W, W, W, W, W, F, Q, Q, W, W, I, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, + W, W, W, W, W, W, W, W, W, W, W, W, W, B, C, Q, C, Q, W, W, W, W, W, W, W, W, W, W, Q, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, + W, W, W, W, W, W, W, W, W, W, W, W, W, U, U, Q, U, U, W, W, W, W, Q, Q, Q, W, W, W, G, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, + W, W, W, W, W, W, W, W, W, W, W, W, W, B, F, F, F, F, F, F, F, L, Q, B, Q, F, H, D, C, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, + W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, Q, Q, Q, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, + W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, + }; + + +} \ No newline at end of file diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/special/TreasuryRoom.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/special/TreasuryRoom.java index 2a5543c56..8686be527 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/special/TreasuryRoom.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/special/TreasuryRoom.java @@ -21,6 +21,7 @@ package com.shatteredpixel.shatteredpixeldungeon.levels.rooms.special; +import com.shatteredpixel.shatteredpixeldungeon.Conducts; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mimic; import com.shatteredpixel.shatteredpixeldungeon.items.Gold; @@ -40,7 +41,7 @@ public class TreasuryRoom extends SpecialRoom { Painter.set( level, center(), Terrain.STATUE ); - Heap.Type heapType = Random.Int( 2 ) == 0 ? Heap.Type.CHEST : Heap.Type.HEAP; + Heap.Type heapType = Random.Int( 2 ) == 0 ? Heap.Type.CHEST : Dungeon.isDLC(Conducts.Conduct.MONEYLETGO) ? Heap.Type.FOR_SALE : Heap.Type.HEAP; int n = Random.IntRange( 2, 3 ); for (int i=0; i < n; i++) { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/GameScene.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/GameScene.java index 848de8301..7d875efeb 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/GameScene.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/GameScene.java @@ -24,6 +24,7 @@ package com.shatteredpixel.shatteredpixeldungeon.scenes; import static com.shatteredpixel.shatteredpixeldungeon.Challenges.SBSG; import static com.shatteredpixel.shatteredpixeldungeon.Statistics.lanterfireactive; +import com.badlogic.gdx.Gdx; import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.BGMPlayer; import com.shatteredpixel.shatteredpixeldungeon.Badges; @@ -162,7 +163,7 @@ import java.util.ArrayList; import java.util.Locale; public class GameScene extends PixelScene { - + public static boolean logActorThread; private void tell(String text) { Game.runOnRenderThread(new Callback() { @Override @@ -592,7 +593,9 @@ public class GameScene extends PixelScene { if (InterlevelScene.mode != InterlevelScene.Mode.NONE) { if (Dungeon.depth == Statistics.deepestFloor && (InterlevelScene.mode == InterlevelScene.Mode.DESCEND || InterlevelScene.mode == InterlevelScene.Mode.FALL)) { - if(Dungeon.depth < 0) { + if(Dungeon.depth == -30) { + GLog.h(Messages.get(this, "ancity"), Dungeon.depth); + } else if (Dungeon.depth == -15) { GLog.h(Messages.get(this, "snowcynon"), Dungeon.depth); } else { GLog.h(Messages.get(this, "descend"), Dungeon.depth); @@ -641,7 +644,9 @@ public class GameScene extends PixelScene { } else if (InterlevelScene.mode == InterlevelScene.Mode.RESURRECT) { GLog.h(Messages.get(this, "resurrect"), Dungeon.depth); } else { - if(Dungeon.depth < 0) { + if(Dungeon.depth == -31) { + GLog.h(Messages.get(this, "ancity"), Dungeon.depth); + } else if (Dungeon.depth == -15) { GLog.h(Messages.get(this, "snowcynon"), Dungeon.depth); } else { GLog.h(Messages.get(this, "return"), Dungeon.depth); @@ -795,6 +800,27 @@ public class GameScene extends PixelScene { public synchronized void update() { lastOffset = null; + if (logActorThread){ + if (actorThread != null){ + logActorThread = false; + String s = ""; + for (StackTraceElement t: + actorThread.getStackTrace()){ + s += "\n"; + s += t.toString(); + } + Class cl = + Actor.getCurrentActorClass(); + String msg = "Actor therad dump was requested." + "Seed:" + Dungeon.seed + + "depth:" + Dungeon.depth + "challenges:" + "current actor:" + cl + + "\ntrace:" + s; + Gdx.app.getClipboard().setContents(msg); + ShatteredPixelDungeon.reportException(new RuntimeException(msg) + ); + add(new WndMessage(Messages.get(this,"copied"))); + } + } + if (updateItemDisplays){ updateItemDisplays = false; QuickSlotButton.refresh(); @@ -1438,12 +1464,15 @@ public class GameScene extends PixelScene { scene.showBanner( bossSlain ); } break; - case 0: - if(Dungeon.isDLC(Conducts.Conduct.BOSSRUSH) ) { - bossSlain.texture(Assets.Interfaces.SakaBJY_Title); + case 5: + bossSlain.texture(Assets.Interfaces.QliPhoth_Title); bossSlain.show( Window.CYELLOW, 0.3f, 5f); scene.showBanner(bossSlain); - } + break; + case -31: + bossSlain.texture(Assets.Interfaces.SakaBJY_Title); + bossSlain.show( Window.CYELLOW, 0.3f, 5f); + scene.showBanner(bossSlain); break; } @@ -1472,12 +1501,15 @@ public class GameScene extends PixelScene { scene.showBanner( bossSlain ); } break; - case 0: - if(Dungeon.isDLC(Conducts.Conduct.BOSSRUSH) ) { - bossSlain.texture(Assets.Interfaces.SakaBJY_Clear); + case 5: + bossSlain.texture(Assets.Interfaces.QliPhoth_Clear); bossSlain.show( Window.CYELLOW, 0.3f, 5f); scene.showBanner(bossSlain); - } + break; + case -31: + bossSlain.texture(Assets.Interfaces.SakaBJY_Clear); + bossSlain.show( Window.CYELLOW, 0.3f, 5f); + scene.showBanner(bossSlain); break; } 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 19f50b1e8..557072f48 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/InterlevelScene.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/InterlevelScene.java @@ -286,7 +286,7 @@ public class InterlevelScene extends PixelScene { exboss(2); break; case ANCITYBOSS: - exboss(3); + exboss(4); break; } @@ -569,6 +569,9 @@ public class InterlevelScene extends PixelScene { case 3: level=Dungeon.AncityWaterLevel(); break; + case 4: + level=Dungeon.AncityBossWaterLevel(); + break; default: level = Dungeon.newLevel(); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/CharSprite.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/CharSprite.java index 7da7f8dd5..6e62efb43 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/CharSprite.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/CharSprite.java @@ -181,7 +181,7 @@ public class CharSprite extends MovieClip implements Tweener.Listener, MovieClip turnTo( ch.pos, Random.Int( Dungeon.level.length() ) ); renderShadow = true; - //突变激素 粒子效果 + //TODO: this is a hack to get the hero to show up in the right place if (ch != Dungeon.hero) { if (health == null) { health = new CharHealthIndicator(ch); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/IceSlowGirlSprites.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/IceSlowGirlSprites.java new file mode 100644 index 000000000..8725dcd2d --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/IceSlowGirlSprites.java @@ -0,0 +1,31 @@ +package com.shatteredpixel.shatteredpixeldungeon.sprites; + +import com.shatteredpixel.shatteredpixeldungeon.Assets; +import com.watabou.noosa.TextureFilm; + +public class IceSlowGirlSprites extends MobSprite { + + public IceSlowGirlSprites() { + super(); + + texture( Assets.Sprites.SXGR ); + + TextureFilm frames = new TextureFilm( texture, 24, 24 ); + + idle = new Animation( 2, true ); + idle.frames( frames, 0, 1, 0, 1,0,1 ); + + run = new Animation( 8, true ); + run.frames( frames, 2, 3, 4, 5 ); + + attack = new Animation( 15, false ); + attack.frames( frames, 6, 7, 8, 0 ); + + die = new Animation( 7, false ); + die.frames( frames, 9,10,11 ); + + play( idle ); + } + +} + 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 9a17d28e8..b6d370722 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/ItemSpriteSheet.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/ItemSpriteSheet.java @@ -822,6 +822,11 @@ public class ItemSpriteSheet { public static final int SOYBOOKS= MAINBOOKINDEX+14; + + private static final int EXFOODINDEX = xy(1, 38); //16 slots + public static final int FISHSKELETON= EXFOODINDEX+0; + public static final int FISHBONE= EXFOODINDEX+1; + private static final int MAINPALYBOOKS = xy(1, 40); public static final int MONEYBOOKS= MAINPALYBOOKS+1; public static final int PINKBOOKS= MAINPALYBOOKS+2; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/RoomStoneSprites.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/RoomStoneSprites.java index 9b6619228..a2f8f2da3 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/RoomStoneSprites.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/RoomStoneSprites.java @@ -3,30 +3,69 @@ package com.shatteredpixel.shatteredpixeldungeon.sprites; import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.watabou.noosa.MovieClip; import com.watabou.noosa.TextureFilm; +import com.watabou.utils.Callback; +import com.watabou.utils.Random; public class RoomStoneSprites extends MobSprite { - + private Animation leap; + private boolean alt = Random.Int(2) == 0; + private Animation stab; + private Animation prep; public RoomStoneSprites() { super(); texture( Assets.Sprites.ROOMSTONE); - TextureFilm frames = new TextureFilm( texture, 18, 20 ); + TextureFilm frames = new TextureFilm( texture, 20, 18 ); idle = new MovieClip.Animation( 2, true ); idle.frames( frames, 0, 0, 0, 1 ); run = new MovieClip.Animation( 10, true ); - run.frames( frames, 6, 7, 8, 9, 10 ); + run.frames( frames, 2,3 ); attack = new MovieClip.Animation( 15, false ); - attack.frames( frames, 2, 3, 4, 5, 0 ); + attack.frames( frames, 2, 3 ); die = new MovieClip.Animation( 10, false ); - die.frames( frames, 11, 12, 13, 14 ); + die.frames( frames, 4,5,6); + + leap = new Animation( 1, true ); + leap.frames( frames, 7 ); + + stab = new Animation( 12, false ); + stab.frames( frames, 0, 9, 8, 9 ); + + prep = new Animation( 1, true ); + prep.frames( frames, 9 ); play( idle ); } + public void leapPrep( int cell ){ + turnTo( ch.pos, cell ); + play( prep ); + } + + @Override + public void jump(int from, int to, Callback callback) { + super.jump(from, to, callback); + play( leap ); + } + + @Override + public void attack( int cell ) { + super.attack( cell ); + if (alt) { + play( stab ); + } + alt = !alt; + } + + @Override + public void onComplete( Animation anim ) { + super.onComplete( anim == stab ? attack : anim ); + } + } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/SakaFishBossSprites.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/SakaFishBossSprites.java index c8aa73f12..45f510ded 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/SakaFishBossSprites.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/SakaFishBossSprites.java @@ -40,7 +40,7 @@ public class SakaFishBossSprites extends MobSprite { zap = attack.clone(); die = new Animation( 10, false ); - die.frames( frames, 1 ); + die.frames( frames, 23,24,25,26 ); leap = new Animation( 2, true ); leap.frames( frames, 52,53,54,55 ); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/SeaVastGirlSprites.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/SeaVastGirlSprites.java index 13f8c910d..5fdee30f4 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/SeaVastGirlSprites.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/SeaVastGirlSprites.java @@ -21,8 +21,8 @@ public class SeaVastGirlSprites extends MobSprite { attack = new Animation( 15, false ); attack.frames( frames, 7, 8, 9, 0 ); - die = new Animation( 10, false ); - die.frames( frames, 0 ); + die = new Animation( 7, false ); + die.frames( frames, 10,11,12); play( idle ); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/YogSprite.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/YogSprite.java index e1adee548..00f9b961d 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/YogSprite.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/YogSprite.java @@ -1,24 +1,3 @@ -/* - * Pixel Dungeon - * Copyright (C) 2012-2015 Oleg Dolya - * - * Shattered Pixel Dungeon - * Copyright (C) 2014-2022 Evan Debenham - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see - */ - package com.shatteredpixel.shatteredpixeldungeon.sprites; import com.shatteredpixel.shatteredpixeldungeon.Assets; @@ -27,28 +6,28 @@ import com.shatteredpixel.shatteredpixeldungeon.effects.Splash; import com.watabou.noosa.TextureFilm; public class YogSprite extends MobSprite { - + public YogSprite() { super(); perspectiveRaise = 5 / 16f; texture( Assets.Sprites.YOG ); - + TextureFilm frames = new TextureFilm( texture, 20, 19 ); - + idle = new Animation( 10, true ); idle.frames( frames, 0, 1, 2, 2, 1, 0, 3, 4, 4, 3, 0, 5, 6, 6, 5 ); - + run = new Animation( 12, true ); run.frames( frames, 0 ); - + attack = new Animation( 12, false ); attack.frames( frames, 0 ); - + die = new Animation( 10, false ); die.frames( frames, 0, 7, 8, 9 ); - + play( idle ); } @@ -61,7 +40,7 @@ public class YogSprite extends MobSprite { @Override public void die() { super.die(); - + Splash.at( center(), blood(), 12 ); } -} +} \ No newline at end of file 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 5a9894a6a..5c8ad11c1 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 @@ -36,6 +36,7 @@ import com.shatteredpixel.shatteredpixeldungeon.sprites.NyzSprites; import com.shatteredpixel.shatteredpixeldungeon.sprites.OGPDNQHZTT; import com.shatteredpixel.shatteredpixeldungeon.sprites.RedSwarmSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.SRPDHBLRTT; +import com.shatteredpixel.shatteredpixeldungeon.sprites.SakaFishBossSprites; import com.shatteredpixel.shatteredpixeldungeon.sprites.SalamanderSprites; import com.shatteredpixel.shatteredpixeldungeon.sprites.ShopkKingSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.ShopkeeperSprite; @@ -55,6 +56,7 @@ import java.util.ArrayList; public class vM0_6_7_X_Changes { public static void addAllChanges(ArrayList changeInfos) { + add_v0_6_55_Changes(changeInfos); add_v0_6_54_Changes(changeInfos); add_v0_6_53_Changes(changeInfos); add_v0_6_52_Changes(changeInfos); @@ -112,6 +114,38 @@ public class vM0_6_7_X_Changes { add_v0_6_0_Changes(changeInfos); } + public static void add_v0_6_55_Changes( ArrayList changeInfos ) { + ChangeInfo changes = new ChangeInfo("v0.6.4.0-Beta2-3", true, ""); + changes.hardlight(Window.TITLE_COLOR); + changeInfos.add(changes); + + changes = new ChangeInfo("新内容", false, null); + changes.hardlight(Window.GREEN_COLOR); + changeInfos.add(changes); + + changes.addButton(new ChangeButton(new ItemSprite(ItemSpriteSheet.LANTERNB), ("深度调查"), + ("娱乐模式改名为深度调查,并且追加黄金时代新娱乐模式。"))); + + Image a = new SakaFishBossSprites(); + a.scale.set(PixelScene.align(0.72f)); + changes.addButton(new ChangeButton(a, "新Boss:萨卡班甲鱼", + "远古遗迹的领袖级Boss")); + + changes = new ChangeInfo("改动", false, null); + changes.hardlight(Window.CYELLOW); + changeInfos.add(changes); + + changes.addButton(new ChangeButton(Icons.get(Icons.CHALLENGE_ON), ("支离破碎"), + ("支离破碎进行了一些怪组优化"))); + + changes.addButton(new ChangeButton(new ItemSprite(ItemSpriteSheet.GREATSHIELD), ("5阶武器"), + ("现在5阶武器生成平均化"))); + + 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_06X82"))); + + } + public static void add_v0_6_54_Changes( ArrayList changeInfos ) { ChangeInfo changes = new ChangeInfo("v0.6.4.0-Beta1", true, ""); changes.hardlight(Window.TITLE_COLOR); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndGame.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndGame.java index 8aacca2fb..5e677b5fb 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndGame.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndGame.java @@ -21,6 +21,7 @@ package com.shatteredpixel.shatteredpixeldungeon.windows; +import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.GamesInProgress; import com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon; @@ -34,6 +35,8 @@ import com.shatteredpixel.shatteredpixeldungeon.ui.Icons; import com.shatteredpixel.shatteredpixeldungeon.ui.RedButton; import com.shatteredpixel.shatteredpixeldungeon.ui.Window; import com.watabou.noosa.Game; +import com.watabou.noosa.Image; +import com.watabou.utils.DeviceCompat; import java.io.IOException; @@ -96,6 +99,19 @@ public class WndGame extends Window { curBtn.icon(Icons.get(Icons.RANKINGS)); } + //玩家未准备好以及为DEBUG模式 + if(!Dungeon.hero.ready && DeviceCompat.isDebug()){ + addButton(curBtn = new + RedButton("DEBUG"){ + @Override + protected void onClick() { + GameScene.logActorThread = true; + } + }); + curBtn.icon(new + Image(Assets.Sprites.SPINNER,144,0,16,16)); + } + // Main menu addButton(curBtn = new RedButton( Messages.get(this, "menu") ) { @Override 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 07c476d80..595a9bae4 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndGoShop.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndGoShop.java @@ -62,7 +62,8 @@ public class WndGoShop extends Window { } } }; - btnBuy.setRect( (WIDTH - BTN_GAP) / 2 - BTN_SIZE, message.top() + message.height() + BTN_GAP, BTN_SIZE, BTN_SIZE ); + btnBuy.setRect( (WIDTH - BTN_GAP) / 2f - BTN_SIZE, message.top() + message.height() + BTN_GAP, BTN_SIZE, + BTN_SIZE ); btnBuy.textColor(Window.ANSDO_COLOR); add( btnBuy );