From 5b6aea306f4c71181774bbdd92d978b277b0afd2 Mon Sep 17 00:00:00 2001 From: LingASDJ <2735951230@qq.com> Date: Mon, 25 Sep 2023 02:01:13 +0800 Subject: [PATCH] update 0.6.5.0-Alpha4.5 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit -1.新附魔:爆破 -2.修复一些错误 -3.预载一些资源 详情查看游戏更新记录 --- build.gradle | 4 +- .../main/assets/interfaces/passwordbadges.png | Bin 6228 -> 7001 bytes .../assets/messages/actors/actors.properties | 2 +- .../assets/messages/items/items.properties | 11 +- .../main/assets/messages/misc/misc.properties | 10 +- .../shatteredpixeldungeon/PaswordBadges.java | 14 +- .../actors/hero/HeroClass.java | 4 +- .../actors/hero/Talent.java | 9 +- .../actors/mobs/bosses/CrivusFruits.java | 154 ++++++++++++++++++ .../items/bombs/Bomb.java | 78 ++++++++- .../items/food/MeatPie.java | 5 +- .../items/weapon/Weapon.java | 7 +- .../items/weapon/enchantments/Crushing.java | 52 ++++++ .../items/weapon/melee/Greatsword.java | 3 +- .../messages/Messages.java | 4 +- .../scenes/PassWordBadgesScene.java | 2 +- .../sprites/SlimeKingSprite.java | 16 +- .../ui/changelist/S_Changes.java | 2 +- .../ui/changelist/mlpd/vM0_6_7_X_Changes.java | 42 ++++- .../windows/WndInfoArmorAbility.java | 30 ++-- .../windows/WndInfoSubclass.java | 15 +- 21 files changed, 410 insertions(+), 54 deletions(-) create mode 100644 core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/enchantments/Crushing.java diff --git a/build.gradle b/build.gradle index 356d3f4c8..438ce0268 100644 --- a/build.gradle +++ b/build.gradle @@ -18,8 +18,8 @@ allprojects { appName = 'Magic Ling Pixel Dungeon' appPackageName = 'com.ansdomagiclingpixeldungeon.ling' - appVersionCode =907500 - appVersionName = '0.6.5.0-Alpha4' + appVersionCode =907550 + appVersionName = '0.6.5.0-Alpha4.5' appJavaCompatibility = JavaVersion.VERSION_11 diff --git a/core/src/main/assets/interfaces/passwordbadges.png b/core/src/main/assets/interfaces/passwordbadges.png index 196ece7deec26b5d6d570ce5c11db1859c173bd5..c9a2b1e9fbf47745f5334546a68f7cefcf7e6e3a 100644 GIT binary patch literal 7001 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 delta 5937 zcmV-17tZL}HqfuyUeHqaCU6X!v$TM zljVQbii+p7<;AXsX8nH4D@=6&TeC8l+9UWkm%Z54;L!ii z&$)F~wYQqg=83w03gQe(O-3dg9Yi0?!Qr4t$!^Cw7p14Wyr5OKEU?5-5B@C z!#uz66~=9!L92{*>WUR z+qP}eYk$f@CHUPy2j8EXF_&sbI9)H76@q4(veTLoiON(|>Sy@Td0UyqO z_#sY_xnyn_!Sku96nD*`>ge)jmksb;;s#C{4|CFZnC}udG?~7Ch(EqwZWyzR0kpq? zeqG7Q|Alc6J-|bM2(_744Zh#qMEve1lHFn?9wYW)Dn|RL!B^AR(|P$ZvJY>hz*MaJ zu#`H z3Dm%=K~^h)`mx-uE;qE=+n1W0IQ|0EsP1 zYhxB`e|H+%Xu)TgkG9X2+S*zY{XLoE<;IxOpNUHP7bQ0;`K9s}zf|7h$JL+k(SPL0 z+bYphwbhUXW)!p5)@JiqW2vNDbA=q=n#?ZByZD}24& zIFx+aZY9WWF_IHMt=EFAZc{(%x_=sYb(`wD@KL-zVFu%XRA3y?qHI5okpT>UFr4$3 za~S?$IJ+nQk@qbsfg_D*EZ~*~Tu`0_QhJqW+g?7E&Y)ZqwF$dOnKQpx$5Den(zgcy z!ynm%{@RpE{vCgT@7cv;Kbx;)Q(hhhZ*T5>P3f1UU(ny@!>$Jq@qgqc-X7c2 zZrM3GIT#Ge6+Cyr3_kyGlP>Uc7tGM5wdLxKDhBlK1zgbG0@MoO>*Yq(%`*JD8z^j$ z_ry=@@$mL$+wL4Zyc6&Zi?Tk))C6*X!aOA{5&912ve-?$G+_pP8|1rGTmis^lq4qa z{Z_ZH(F&lmzv=t;+G*1;M1Kq;uTy7yj~?eL;21TQ(HmX31GsdwfAz0(ci<2AjMi;y zkzPYB;5eWywJDXfNUvd}Zx7BEgt7zhDlq?yro21=65k(BK$IhT}w=iqYEWEpRf?ejal6UPQ*v$<*Jh*pIZ?^7RuRE90(tlD)OG}lst5@6n z4s#c;0pRr)$7@$Vpe--^cqag#FaJNQy!VfrUB6^I_yE3PQCdau4T~ZT>x%f^rd7N; zBU)Q;T~W@36y+(WSA*b#jS3L?!gvmRveV`XM7}VdR~cY)pQR5bOk!z5oVI>-E>oU)YHJld~>h*muo$7>v)NxtJO;ITYkZ;gGw`- z86C}>&`>HzE0ycm!c}beas#vG%;LWK{4**J@WtuYl+2t7CFWMlQb|b(q^Cpg-V~LW z^K8WdE;voq_E+63!)P=T7#N7Zr@P(nV>BA6x>;s-zZ(4fbAS8E&B_A6r$-OG`Y2Bx z=89rpJGYTst5Lqk#9;9B=t?^mXJYqSr`1(}`@012YKiSi5VvLvuU;R({apg=7W~Cu z5_$G5D6KAI!O#bAcj^Ry;l4fq1bKBMZ)=j>{HnASljy(b2Oj%o5db@$T%j$$nR}Ve z00EJ@JTGkqaDU>(*{un>^&))yF|9Ui&;nnu!hF?v=RA&Qs<|)G9+eC-nmWisHWn`cJ3BP{hbY-Z)zk00_?phBR&RgG&b^&()D9>!k z8~1P3?O$|Q->R&5u#|>oJ@Gescmz;jGXKWyT%0M)QTjyw!C~<3%V1FnZ1w@vN)We3 z8KG)U@B!SNIx%|5o1A|9X$<%E!QIo3@~~RkwSRQv=FJAjJTOf zH!lN4`6h~ATg~c!yu-};e0Dp5_jd{4L~^FK+*~=O*8y<4c|+S)ey0|v`hEQecD30G zJYQPJI^wjBpc-gf4qcAp`O-R)8=Sp*^?zSJw}pIJK}y?IJBmXYg=wrRkQ8$7+N_(b)#Y6PHsmj~N@L5*c{xm8wt%k|$MDSZCE9iq{UHA|CZ~SH{^K1$8GlN? zefJIyV1Eu^sAq4$_ONe4-DN&4J>mcm>om14*-`0{2T$ro>Zx-KcyufPS-Hw^sxc{v z?nOabCvZ@$2NSBdYWdaUu5)jCK1B(BA@5ck(3KyP_769csyucLtjM6H(=aW+y?;3Xb&P-d)6;G4J2P*IHkorYAxsz8SzX@6sa-n& zs>{pyzT+Zozj~_}5|yf(5ZbuuD*%>sA8hkG$Na4HznuPXAJvCWk}>}c2kqB>&OM^8 zVTLFN<$jn@XFay824AKAh*gFX4EOaRG3^KewH3k1Rtj7B`>u_#`u)_vs};f0nR!dJ{C(HP z)Y+;ewzO!`N?TsP;Y%{+zv1v}kFjynS6aSCFE_PPGz_*qmRE9P8vc0yEBPBzD}`mS zn@Zapx9=(~fEvVKdko9-aeq*!6ydkcXCLqSL36U$lpmYGw(0io^-bBDmBDT|&)=LM zpmVE5+H#w23C;TcHAPW%pqzi3G5`5p<^Nt@KKD8R9NaLl*%j#G$s7Ff6QcvvcLIOc zeD*~6YH>odPxxBz_vx7a3M0cI@fa}Ob`#l@mJwk}`Qyg0YL(Kl@qe!}aK+iA{cTEg zv@#~Ho`2S-)Ok&?Jqp)Qery7X$6(ADwDK)goqb5R?i^}83Zs^9E59urN|p1x?jEJf zuUh|Y({mm}de(6CQX6eu>qqw;{|IMx#_Q&&?dd!I5klK{(xp9}*Q${m3crV9*c%rI z4C9&Qt>Kut;#7aIQGb{A;zjd#eo#=5)v@M0JzZD+sH;QS*ZCmt8{g!Wz_;mtaxC9m zPbIHRd6F6VgiE96HhS48;$GjUJEx}1-H1c}-_TuoYTyF{8q5sVZ?{zunxY0ipw~bE zGA|@(mB8}KFDtL6m1ijK?(X_QEnv;4P}+OH#kSNChET)oX@3LjE}pz$t^gTH=jl8C z5i*j_0}wnoglq4maMM_X_xjPg?HNhu34J(1{{?H6^+3lXHot@#{C)fPJB%7OtkLF5 z4Sr!^g|=?15~%#E4D9QCkWp8M0?_~DSay4F!lNXFy!tfi)smlghOOV(9_k*wY*b^X zrMb0hpVE3YP=9syA*;Zv)a}Nz5B;i2(4jOz3w&-)HUJg1?dvOr@}1UyTSHlSHNB2y z5;^!6D1?IIQZ8PCbHJpY@X_6!6y9)UXuoQ9rnLlaaP(3e{Ww5I(s?bw*WOEE!Mk(V zvh_OIv;P6l`f2-YNlQxu;N@$#ahL`Shr5w*vJ}=VPk-UQxP_#prQzPOW8KLPD}g0e z#~9MLFGtUu0nEWym(@yPt0G)+Hu1jkO>Of0g8n#)k?iAhu&T($Op_MuLBm5BG|5NXm;6I6 z#?0pTd4D>TCh*|Iw{dgp$i8pi*6ll)33DvgJwu0a*)tTjZwKJ=#EH-soPi&k9YrX<;G*T>Z7+-<)?ZE^Gh8=m%cqpZ((@;BlMh|K0~-yd3EVfLEY(W%KG4 z#Qx7dW5^3py4yuYq8EWZYVh+8)V8U?UsC_H9aC4wcVE|#k?2M6$b6gStJEw1)E;Gq zaevgbH`({?+mzg}|IVhnyE}zXKh4dXH*s-s;f)br^JQ#Hf};J|6L*EBA-(x4`tPK@ z5E48%gy6v;cpj>P@#ebK&rf;eaOxRO`!BM!bhdbVdfNOv*rpBlxVuwaSctc${a(AR z-~(3MhV<3XcwccgG3x42e#}=oH|N~iv43vpQu+>mlv$51U`X&|xUBsTDXGVaJN_Qm zmws*c9DWaDRwmhbMzZsa0HmDQtlQsk-BOOpJlLjQ`N2cX!^M^@Kt|RL0>jOn)i!?N z7>!Dq&d$yNgoTB%`Df_H^bH9>U$-Jg=bZ19%>)V!^vg@JH0Yhkwz- zrzOnn%IWNu`1PDm_UwOf<5@qeK7i_}*~)a~=Jo4&YW8e;eDe){bLKE-#|~}Z@@31c z@&)_*Gkfx6Ui!;=t9_Q1yfoS7_I;fX(z~sJ7cW78Lwk}tROp)Eg1j>f2z!8(lRG$g z_?%UK-GGc!4%zQk<2z<Yk$AD`(tcg zZw_G6%9U)rdKKUNeCX6kx38g2uC5eazs}O=N$mb%A7dsd9kPbYMb}5stwRT!$Jl-J zHi12AaPU@MJQ*~}hl01>()Q2Yu1>>RH^G4su0&JHs;@ROf3y;eOTfeP=CNn(t6I8; z=e@_WX%8?2^Evn$dSgt!iGMLGlfWM4d6VosBiS*QrCigNEU$Q9LvM0S>4duEYWMuy z93|)tgRfrwmiaA%Us_s9z}=k$`5W-){u0MN{S)EOeZb+vhv{RHUU_lMq5_1rxdkWw zNbLQe;pA}-rrXNh;moPlB;2VZy;ceSnDlRervG;U;Pp9k$c~Taoqy`;Ces#OS0<5m z?|zywV`y}_==yc+U6;lz<+0DtJCKwUn|byNWdg>#Qvhw89JrFNG?kWDASf+BQf!?T zeAT60Yq|8ZNw=PJ@(^I2)6X%bGxCYvByKZTfZ;Q*l3#d>0b#+Uq-JP;*DgyVa8R~( z#jE*!4ZWc>m%{Tua(^l(+vb&@k#z$nFCSft0p=DUH8qtHK4}E`8`u+fh1!tA5Hb;f zd$w;UaOQhbwncTznY+&zEZH z>`|L}|FSZcefcF>Pd=$_dusMnh5BnNjwnu&D2Y==2+Y)olDvft1`!kz^ zCpeID=zzA~v%7)sw&?#Cq2anpy&_Eo%H-F-H+Cj7(?~)7W$o|5gU77WtJJ1nebloT zd|UYqt*>f*05$kmTnAECRz_J_8C$lP2ioqbe@akUJp}|04k6>?XQ^Ir1d}0{^x7QjYe{WU`Fm%Tk+GwPukx#g2 zSD|_Z?ysN5&nwHs-z!j8Nt$EI^clLKPnkZWz6G!rI4B!qGF-_w;_np*1>Rga@(bWi z;6~vI+M!^yaJyxNwS! zTJv!;vXpl!Yz5yk|B#+FJlORP+2?(5b#=8$3s4mq$zLiecz$dp0S5D%){V|*Z`-4c z>OEnj$FI(3*Azw7<;Nzl^7~fgpHXU_SKp@Jd4F5Ac{pD!PGIgvbkm}M_J3}k(aJxS zsDZyzKlE!ko3$|d@w({fH>}3f6Sv*etv4JBR`aY}^}U0=Ie?@CN&p5&TE79Pp1WH9 zf|sXSrLo7?&>PEhw#;9hZ+;V~v8(>W)mvG$>Ky{B&v5io8*Pl=bgOftWxq9}LN{k% z^?&1AYVLft`UC#;;bQ)}r>j+3TN(!6l4V7hYVpsL_NGTHdV+cVcr@PBLh z3!@)z_H-zq`|<2iE5+Pqoa^r`|M%wq>> talents ){ - if (abil == null) return; + public static ArrayList> initArmorTalents(ArmorAbility abil){ + return initArmorTalents(abil, new ArrayList()); + } + public static ArrayList> initArmorTalents(ArmorAbility abil, ArrayList> talents ){ + if (abil == null) return talents; while (talents.size() < MAX_TALENT_TIERS){ talents.add(new LinkedHashMap<>()); @@ -618,6 +620,7 @@ public enum Talent { for (Talent t : abil.talents()){ talents.get(3).put(t, 0); } + return talents; } private static final String TALENT_TIER = "talents_tier_"; 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 90b82508b..433ca065b 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 @@ -29,9 +29,13 @@ 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.hero.Hero; +import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Bee; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob; +import com.shatteredpixel.shatteredpixeldungeon.effects.Beam; import com.shatteredpixel.shatteredpixeldungeon.effects.BlobEmitter; +import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter; import com.shatteredpixel.shatteredpixeldungeon.effects.Speck; +import com.shatteredpixel.shatteredpixeldungeon.effects.TargetedCell; import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.DriedRose; import com.shatteredpixel.shatteredpixeldungeon.items.food.CrivusFruitsFood; import com.shatteredpixel.shatteredpixeldungeon.items.food.Food; @@ -40,23 +44,33 @@ import com.shatteredpixel.shatteredpixeldungeon.items.keys.IronKey; import com.shatteredpixel.shatteredpixeldungeon.items.quest.CrivusFruitsFlake; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.LifeTreeSword; import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain; +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.CrivusFruitsSprite; +import com.shatteredpixel.shatteredpixeldungeon.tiles.DungeonTilemap; import com.shatteredpixel.shatteredpixeldungeon.ui.BossHealthBar; +import com.shatteredpixel.shatteredpixeldungeon.ui.Window; import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; import com.watabou.noosa.Camera; +import com.watabou.noosa.Game; import com.watabou.noosa.audio.Sample; +import com.watabou.utils.Bundle; import com.watabou.utils.PathFinder; import com.watabou.utils.Random; +import java.util.ArrayList; import java.util.HashSet; //克里弗斯之果 本体 public class CrivusFruits extends Mob { //the actual affected cells private HashSet affectedCells; + private static final int MIN_ABILITY_CD = 7; + private int lastHeroPos; + private static final int MAX_ABILITY_CD = 12; + private ArrayList targetedCells = new ArrayList<>(); //the cells to trace fire shots to, for visual effects. private HashSet visualCells; //基本属性 @@ -74,6 +88,74 @@ public class CrivusFruits extends Mob { properties.add(Property.BOSS); } + private int phase = 1; + private int drop = Random.Int(5); + private int summonsMade = 0; + + private float summonCooldown = 0; + private float abilityCooldown = 3; + private static final int MIN_COOLDOWN = 7; + private static final int MAX_COOLDOWN = 11; + + private static float[] chanceMap = {0f, 100f, 100f, 100f, 100f, 100f, 100f}; + private int wave=0; + + private int lastAbility = 0; + private static final int NONE = 0; + private static final int LINK = 1; + private static final int TELE = 2; + private static final int ENRAGE = 3; + private static final int DEATHRATTLE = 4; + private static final int SACRIFICE = 5; + private static final int SUMMON = 6; + + private static final String PHASE = "phase"; + private static final String SUMMONS_MADE = "summons_made"; + + private static final String SUMMON_CD = "summon_cd"; + private static final String ABILITY_CD = "ability_cd"; + private static final String LAST_ABILITY = "last_ability"; + + private static final String TARGETED_CELLS = "targeted_cells"; + + @Override + public void storeInBundle(Bundle bundle) { + super.storeInBundle(bundle); + bundle.put( PHASE, phase ); + bundle.put( SUMMONS_MADE, summonsMade ); + bundle.put( SUMMON_CD, summonCooldown ); + bundle.put( ABILITY_CD, abilityCooldown ); + bundle.put( LAST_ABILITY, lastAbility ); + bundle.put("wavePhase2", wave); + + //暴力Boss + int[] bundleArr = new int[targetedCells.size()]; + for (int i = 0; i < targetedCells.size(); i++){ + bundleArr[i] = targetedCells.get(i); + } + bundle.put(TARGETED_CELLS, bundleArr); + } + + @Override + public void restoreFromBundle(Bundle bundle) { + super.restoreFromBundle(bundle); + phase = bundle.getInt( PHASE ); + summonsMade = bundle.getInt( SUMMONS_MADE ); + summonCooldown = bundle.getFloat( SUMMON_CD ); + abilityCooldown = bundle.getFloat( ABILITY_CD ); + lastAbility = bundle.getInt( LAST_ABILITY ); + wave = bundle.getInt("wavePhase2"); + + if (phase == 2) properties.add(Property.IMMOVABLE); + + //暴力Boss + int[] bundleArr = new int[targetedCells.size()]; + for (int i = 0; i < targetedCells.size(); i++){ + bundleArr[i] = targetedCells.get(i); + } + bundle.put(TARGETED_CELLS, bundleArr); + } + //无敌也要扣减! public static class DiedDamager extends Buff { @@ -146,6 +228,7 @@ public class CrivusFruits extends Mob { GameScene.add(Blob.seed(pos, HP<65 ? 50 : 30, DiedBlobs.class)); } else { GameScene.add(Blob.seed(pos, HP<36 ? 150 : 50, DiedBlobs.class)); + //doYogLasers(); } @@ -161,6 +244,7 @@ public class CrivusFruits extends Mob { GLog.n(Messages.get(this,"anargy")); crivusfruitslevel2 = true; GameScene.flash(0x808c8c8c); + //doYogLasers(); for (int i : ForestBossLasherTWOPos) { CrivusFruitsLasher csp = new CrivusFruitsLasher(); csp.pos = i; @@ -322,4 +406,74 @@ public class CrivusFruits extends Mob { immunities.add( Vertigo.class ); } + public void doYogLasers(){ + boolean terrainAffected = false; + HashSet affected = new HashSet<>(); + //delay fire on a rooted hero + if(enemy != null) { + if (!enemy.rooted) { + for (int i : targetedCells) { + Ballistica b = new Ballistica(i, lastHeroPos, Ballistica.WONT_STOP); + //shoot beams + sprite.parent.add(new Beam.DeathRayS(DungeonTilemap.raisedTileCenterToWorld(i), + DungeonTilemap.raisedTileCenterToWorld(b.collisionPos))); + for (int p : b.path) { + Char ch = Actor.findChar(p); + if (ch != null && (ch.alignment != alignment || ch instanceof Bee)) { + affected.add(ch); + } + if (Dungeon.level.flamable[p]) { + Dungeon.level.destroy(p); + GameScene.updateMap(p); + terrainAffected = true; + } + } + } + if (terrainAffected) { + Dungeon.observe(); + } + for (Char ch : affected) { + ch.damage(Random.NormalIntRange(8, 12),this); + + if (Dungeon.level.heroFOV[pos]) { + ch.sprite.flash(); + CellEmitter.center(pos).burst(Speck.factory(Speck.COIN), Random.IntRange(2, 3)); + } + if (!ch.isAlive() && ch == Dungeon.hero) { + Dungeon.fail(getClass()); + GLog.n(Messages.get(Char.class, "kill", name())); + } + } + targetedCells.clear(); + } + } + if(enemy != null) { + if (abilityCooldown <= 0 && HP < HT * 0.8f) { + lastHeroPos = enemy.pos; + + int beams = (int) (4 + (HP * 1.0f / HT) * 4); + for (int i = 0; i < beams; i++) { + int randompos = Random.Int(Dungeon.level.width()) + Dungeon.level.width() * 2; + targetedCells.add(randompos); + } + + for (int i : targetedCells) { + Ballistica b = new Ballistica(i, enemy.pos, Ballistica.WONT_STOP); + + for (int p : b.path) { + Game.scene().addToFront(new TargetedCell(p, Window.DeepPK_COLOR)); + } + } + + spend(TICK * 1.5f); + Dungeon.hero.interrupt(); + abilityCooldown += Random.NormalFloat(MIN_ABILITY_CD - 2 * (1 - (HP * 1f / HT)), + MAX_ABILITY_CD - 5 * (1 - (HP * 1f / HT))); + } else { + spend(TICK); + } + } + if (abilityCooldown > 0) abilityCooldown-= 5; + } + } \ No newline at end of file diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/bombs/Bomb.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/bombs/Bomb.java index 1fbe15ca1..edffdb16d 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/bombs/Bomb.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/bombs/Bomb.java @@ -21,6 +21,8 @@ package com.shatteredpixel.shatteredpixeldungeon.items.bombs; +import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.hero; + import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.SPDSettings; @@ -191,7 +193,7 @@ public class Bomb extends Item { ch.damage(dmg, this); } - if (ch == Dungeon.hero && !ch.isAlive()) { + if (ch == hero && !ch.isAlive()) { Dungeon.fail(Bomb.class); } } @@ -202,6 +204,78 @@ public class Bomb extends Item { } } + public void explodeHeros(int cell){ + //We're blowing up, so no need for a fuse anymore. + this.fuse = null; + + Sample.INSTANCE.play( Assets.Sounds.BLAST ); + + if (explodesDestructively()) { + + ArrayList affected = new ArrayList<>(); + + if (Dungeon.level.heroFOV[cell]) { + CellEmitter.center(cell).burst(BlastParticle.FACTORY, 30); + } + + boolean terrainAffected = false; + for (int n : PathFinder.NEIGHBOURS9) { + int c = cell + n; + if (c >= 0 && c < Dungeon.level.length()) { + if (Dungeon.level.heroFOV[c]) { + CellEmitter.get(c).burst(SmokeParticle.FACTORY, 4); + } + + if (Dungeon.level.flamable[c]) { + Dungeon.level.destroy(c); + GameScene.updateMap(c); + terrainAffected = true; + } + + //destroys items / triggers bombs caught in the blast. +// Heap heap = Dungeon.level.heaps.get(c); +// if (heap != null) +// heap.explode(); + + Char ch = Actor.findChar(c); + if (ch != null) { + affected.add(ch); + } + } + } + + for (Char ch : affected){ + + //if they have already been killed by another bomb + if(!ch.isAlive()){ + continue; + } + + int dmg = Random.NormalIntRange(2 + Dungeon.depth, 4 + Dungeon.depth*2); + + //those not at the center of the blast take less damage + + + if (ch.pos != cell){ + dmg = Math.round(dmg*0.67f); + } + + dmg -= ch.drRoll(); + + if (dmg > 0) { + if(ch == hero){ + return; + } + ch.damage(dmg, this); + } + } + + if (terrainAffected) { + Dungeon.observe(); + } + } + } + public void explodeMobs(int cell){ //We're blowing up, so no need for a fuse anymore. this.fuse = null; @@ -262,7 +336,7 @@ public class Bomb extends Item { ch.damage(dmg, this); } - if (ch == Dungeon.hero && !ch.isAlive()) { + if (ch == hero && !ch.isAlive()) { Dungeon.fail(Bomb.class); } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/food/MeatPie.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/food/MeatPie.java index 4bce4eeb5..98ddcbff2 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/food/MeatPie.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/food/MeatPie.java @@ -50,7 +50,10 @@ public class MeatPie extends Food { protected void satisfy(Hero hero) { if (Dungeon.isChallenged(Challenges.EXSG)){ Buff.prolong( hero, Haste.class, 8f); - if(Random.Float() > (0.2f + (hero.STR/5f)/10f)){ + + if(hero.STR<12){ + hero.STR++; + } else if(Random.Float() > (0.35f + (hero.STR/5f)/10f)){ hero.STR++; hero.sprite.showStatus(CharSprite.POSITIVE, Messages.get(this, "eat_msg_1")); GLog.p(Messages.get(this, "eat_msg_2")); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/Weapon.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/Weapon.java index 9e4907b7e..18f3c4e5a 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/Weapon.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/Weapon.java @@ -44,6 +44,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.weapon.enchantments.Blocki import com.shatteredpixel.shatteredpixeldungeon.items.weapon.enchantments.Blooming; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.enchantments.Chilling; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.enchantments.Corrupting; +import com.shatteredpixel.shatteredpixeldungeon.items.weapon.enchantments.Crushing; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.enchantments.Elastic; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.enchantments.Grim; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.enchantments.HaloBlazing; @@ -341,10 +342,12 @@ abstract public class Weapon extends KindOfWeapon { private static final Class[] uncommon = new Class[]{ Blocking.class, Blooming.class, Elastic.class, - Lucky.class, Projecting.class, Unstable.class,HaloBlazing.class}; + Lucky.class, Projecting.class, Unstable.class}; private static final Class[] rare = new Class[]{ - Corrupting.class, Grim.class, Vampiric.class}; + Corrupting.class, Grim.class, Vampiric.class, + HaloBlazing.class, + Crushing.class}; private static final float[] typeChances = new float[]{ 50, //12.5% each diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/enchantments/Crushing.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/enchantments/Crushing.java new file mode 100644 index 000000000..08eb30299 --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/enchantments/Crushing.java @@ -0,0 +1,52 @@ +package com.shatteredpixel.shatteredpixeldungeon.items.weapon.enchantments; + +import com.shatteredpixel.shatteredpixeldungeon.actors.Char; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Cripple; +import com.shatteredpixel.shatteredpixeldungeon.effects.particles.BlastParticle; +import com.shatteredpixel.shatteredpixeldungeon.effects.particles.SmokeParticle; +import com.shatteredpixel.shatteredpixeldungeon.items.bombs.Bomb; +import com.shatteredpixel.shatteredpixeldungeon.items.weapon.Weapon; +import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; +import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSprite; +import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; +import com.watabou.utils.Random; + +public class Crushing extends Weapon.Enchantment { + + private static ItemSprite.Glowing ORANGE = new ItemSprite.Glowing( 0xcc7770 ); + + @Override + public int proc(Weapon weapon, Char attacker, Char defender, int damage ) { + // lvl 0 - 33% + // lvl 1 - 50% + // lvl 2 - 60% + int level = Math.max( 0, weapon.level() ); + + if (Random.Int( level + 12 ) >= 5) { + + if (Random.Int( 2 ) == 0) { + Buff.prolong( defender, Cripple.class, Random.Float( 1f, 1f + level/2f ) ); + } + defender.damage( Random.Int( 1, level + 2 ), this ); + + defender.sprite.emitter().burst(BlastParticle.FACTORY, 30 ); + defender.sprite.emitter().burst(SmokeParticle.FACTORY, 4 ); + if (Random.Int( 2 ) == 0) { + damage += level; + GLog.n(Messages.get(Crushing.class,"kill"),attacker.name()); + new Bomb().explodeHeros(defender.pos); + } + } + + + + return damage; + + } + + @Override + public ItemSprite.Glowing glowing() { + return ORANGE; + } +} \ No newline at end of file diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Greatsword.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Greatsword.java index dababe1ec..021ddb9f7 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Greatsword.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Greatsword.java @@ -22,6 +22,7 @@ package com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee; import com.shatteredpixel.shatteredpixeldungeon.Assets; +import com.shatteredpixel.shatteredpixeldungeon.items.weapon.enchantments.Crushing; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; public class Greatsword extends MeleeWeapon { @@ -30,7 +31,7 @@ public class Greatsword extends MeleeWeapon { image = ItemSpriteSheet.GREATSWORD; hitSound = Assets.Sounds.HIT_SLASH; hitSoundPitch = 1f; - + enchantment = new Crushing(); tier=5; } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/messages/Messages.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/messages/Messages.java index 489ebc46f..5a48c658b 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/messages/Messages.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/messages/Messages.java @@ -45,7 +45,8 @@ import java.util.Locale; This means that an object can just ask for "name" rather than, say, "items.weapon.enchantments.death.name" */ public class Messages { - + private static String baseNameX; + public static final String NO_TEXT_FOUND = baseNameX; private static ArrayList bundles; private static Languages lang; @@ -121,6 +122,7 @@ public class Messages { //Use baseName so the missing string is clear what exactly needs replacing. Otherwise, it just says java.lang.Object.[key] if (baseName == null) { baseName = key; + baseNameX = baseName; } //this is so child classes can inherit properties from their parents. //in cases where text is commonly grabbed as a utility from classes that aren't mean to be instantiated diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/PassWordBadgesScene.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/PassWordBadgesScene.java index c44228e89..000cc3590 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/PassWordBadgesScene.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/PassWordBadgesScene.java @@ -56,7 +56,7 @@ public class PassWordBadgesScene extends PixelScene { List badges = PaswordBadges.filtered( true ); - int blankBadges = 8; + int blankBadges = 9; blankBadges -= badges.size(); if (badges.contains(Badges.Badge.ALL_ITEMS_IDENTIFIED)) blankBadges -= 6; if (badges.contains(Badges.Badge.YASD)) blankBadges -= 5; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/SlimeKingSprite.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/SlimeKingSprite.java index 71573d58f..ab007c3d8 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/SlimeKingSprite.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/SlimeKingSprite.java @@ -6,7 +6,7 @@ package com.shatteredpixel.shatteredpixeldungeon.sprites; import com.shatteredpixel.shatteredpixeldungeon.Assets; -import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.ColdMagicRat; +import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.SlimeKing; import com.shatteredpixel.shatteredpixeldungeon.effects.MagicMissile; import com.watabou.noosa.TextureFilm; import com.watabou.noosa.audio.Sample; @@ -22,24 +22,24 @@ public class SlimeKingSprite extends GolemSprite { this.idle = new Animation(2, true); Animation var4 = this.idle; Integer var5 = 0; - var4.frames(var1, new Object[]{var5, var5, var5, var3, var5, var5, var3, var3}); + var4.frames(var1, var5, var5, var5, var3, var5, var5, var3, var3); this.run = new Animation(12, true); - this.run.frames(var1, new Object[]{var2, 1, 2, 3, var2}); + this.run.frames(var1, var2, 1, 2, 3, var2); this.attack = new Animation(12, false); - this.attack.frames(var1, new Object[]{3, 4, 5}); + this.attack.frames(var1, 3, 4, 5); this.die = new Animation(12, false); - this.die.frames(var1, new Object[]{6, 7,}); + this.die.frames(var1, 6, 7); this.play(this.idle); } - private static int[] tierFrames = {0, 21, 32, 43, 54, 65}; + private static final int[] tierFrames = {0, 21, 32, 43, 54, 65}; public void setArmor( int tier ){ int c = tierFrames[(int) GameMath.gate(0, tier, 5)]; TextureFilm frames = new TextureFilm( texture, 12, 15 ); - idle.frames( frames, 0+c, 0+c, 0+c, 0+c, 0+c, 1+c, 1+c ); + idle.frames( frames, c, c, c, c, c, 1+c, 1+c ); run.frames( frames, 2+c, 3+c, 4+c, 5+c, 6+c, 7+c ); attack.frames( frames, 8+c, 9+c, 10+c ); //death animation is always armorless @@ -60,7 +60,7 @@ public class SlimeKingSprite extends GolemSprite { new Callback() { @Override public void call() { - ((ColdMagicRat)ch).onZapComplete(); + ((SlimeKing)ch).onZapComplete(); } } ); Sample.INSTANCE.play( Assets.Sounds.ZAP ); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/changelist/S_Changes.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/changelist/S_Changes.java index e62ce5190..1e7c2a69e 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/changelist/S_Changes.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/changelist/S_Changes.java @@ -335,7 +335,7 @@ public class S_Changes { "史莱姆守卫者 10层BOSS用!")); Image a = new SlimeKingSprite(); - a.scale.set(PixelScene.align(0.42f)); + a.scale.set(PixelScene.align(0.82f)); changes.addButton(new ChangeButton(a, "史莱姆王", "10层BOSS!")); 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 252b90a2e..c8fb2b758 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 @@ -1,8 +1,12 @@ package com.shatteredpixel.shatteredpixeldungeon.ui.changelist.mlpd; import com.shatteredpixel.shatteredpixeldungeon.Assets; +import com.shatteredpixel.shatteredpixeldungeon.Badges; +import com.shatteredpixel.shatteredpixeldungeon.PaswordBadges; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.NewDM300; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.PinkLingSprite; +import com.shatteredpixel.shatteredpixeldungeon.effects.BadgeBanner; +import com.shatteredpixel.shatteredpixeldungeon.effects.PasswordBadgeBanner; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.scenes.ChangesScene; import com.shatteredpixel.shatteredpixeldungeon.scenes.PixelScene; @@ -142,6 +146,42 @@ public class vM0_6_7_X_Changes { changes.addButton(new ChangeButton(i, ("熔岩火龙"), ("丛林暴乱的真相"))); + + changes = new ChangeInfo("v0.6.5.0-Alpha4.5", 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.GREATSWORD, + new ItemSprite.Glowing( 0xcc7770 )), "新附魔:爆破", + "这个附魔会让使用者陷入癫狂,能使爆炸的能量从武器中喷薄而出,能够使敌人目标处受到一次范围伤害亦或者给造成敌人短暂的残废效果。(PS:爆炸效果不会摧毁物品)\n")); + + changes.addButton(new ChangeButton(PasswordBadgeBanner.image(PaswordBadges.Badge.ZQJ_GHOST.image), ("两个隐藏徽章资源预载"), + ("两个隐藏徽章资源预载,将在后续版本更新。"))); + + changes = new ChangeInfo("改动", false, null); + changes.hardlight(Window.CYELLOW); + changeInfos.add(changes); + + Image isa = new SlimeKingSprite(); + isa.scale.set(PixelScene.align(0.89f)); + changes.addButton( new ChangeButton(isa, "史莱姆王子", + "修复错误的继承类导致的Cast Exception错误")); + + changes.addButton(new ChangeButton(Icons.get(Icons.DISPLAY), ("界面修复"), + ("修复部分界面在新版的异常布局"))); + + changes.addButton(new ChangeButton(Icons.get(Icons.CHALLENGE_ON), ("药水癔症v0.2"), + ("现在全肉大饼在英雄低于12力量前必定加力量,且整体加力量的幸运度提升。"))); + + changes.addButton(new ChangeButton(Icons.get(Icons.PREFS), ("其他改动"), + ("1.鬼磷和爆破现在是稀有附魔\n\n" + + "2.修复了吸血鬼刀的异常吸血-贡献者:\nzxcPandora\n\n"+ + "3.修复了药水癔症描述问题,纯洁的祝福-守护护盾描述异常,以及开发者升降器追加探查功能-\n贡献者:zxcPandora"))); + changes = new ChangeInfo("v0.6.5.0-Alpha4", true, ""); changes.hardlight(Window.TITLE_COLOR); changeInfos.add(changes); @@ -156,7 +196,7 @@ public class vM0_6_7_X_Changes { changes.addButton(new ChangeButton(Icons.get(Icons.DISPLAY), ("信息栏滚动"), ("在游戏缩放较大或者拥有较多词条时,该项会很有用。"))); - changes.addButton(new ChangeButton(Icons.get(Icons.BADGES), ("新徽章:碎片飞溅"), + changes.addButton(new ChangeButton(BadgeBanner.image(Badges.Badge.BOMBBOW_DIED.image), ("新徽章:碎片飞溅"), ("又是一个死亡徽章,新人:悲鸣 因为意味着另类死亡爱好者多了一个新徽章(未解锁该徽章的就更麻烦了)"))); changes = new ChangeInfo("改动", false, null); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndInfoArmorAbility.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndInfoArmorAbility.java index 70b363064..f2e9a3646 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndInfoArmorAbility.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndInfoArmorAbility.java @@ -25,33 +25,35 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.hero.HeroClass; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.ArmorAbility; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.Ratmogrify; -import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Rat; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; -import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSprite; -import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; import com.shatteredpixel.shatteredpixeldungeon.ui.HeroIcon; import com.shatteredpixel.shatteredpixeldungeon.ui.TalentButton; import com.shatteredpixel.shatteredpixeldungeon.ui.TalentsPane; -import com.watabou.noosa.Image; import java.util.ArrayList; import java.util.LinkedHashMap; +import java.util.function.Function; public class WndInfoArmorAbility extends WndTitledMessage { - public WndInfoArmorAbility(HeroClass cls, ArmorAbility ability){ + public WndInfoArmorAbility(HeroClass cls, ArmorAbility ability, Function> initializeArmorTalents){ super( new HeroIcon(ability), Messages.titleCase(ability.name()), ability.desc()); - ArrayList> talentList = new ArrayList<>(); - Talent.initArmorTalents(ability, talentList); - + @SuppressWarnings("NewApi") + LinkedHashMap talents = initializeArmorTalents.apply(ability); + if(talents.isEmpty()) return; Ratmogrify.useRatroicEnergy = ability instanceof Ratmogrify; - TalentsPane.TalentTierPane talentPane = new TalentsPane.TalentTierPane(talentList.get(3), 4, TalentButton.Mode.INFO); - talentPane.title.text( Messages.titleCase(Messages.get(WndHeroInfo.class, "talents"))); - talentPane.setRect(0, height + 5, width, talentPane.height()); - add(talentPane); - resize(width, (int) talentPane.bottom()); + TalentsPane.TalentTierPane talentPane = new TalentsPane.TalentTierPane(talents, 4, TalentButton.Mode.INFO); + talentPane.title.text( Messages.titleCase(Messages.get(WndHeroInfo.class, "talents"))); + addToBottom(talentPane, 5, 0); + } + public WndInfoArmorAbility(HeroClass cls,ArmorAbility ability) { + this(cls,ability, WndInfoArmorAbility::initializeTalents); } -} + public static LinkedHashMap initializeTalents(ArmorAbility ability) { + ArrayList> talentList = Talent.initArmorTalents(ability); + return talentList.size() < 4 ? new LinkedHashMap<>() : talentList.get(3); + } +} \ No newline at end of file diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndInfoSubclass.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndInfoSubclass.java index ce30275cd..7774f8b1c 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndInfoSubclass.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndInfoSubclass.java @@ -21,15 +21,14 @@ package com.shatteredpixel.shatteredpixeldungeon.windows; +import static com.shatteredpixel.shatteredpixeldungeon.ui.TalentButton.Mode.INFO; + import com.shatteredpixel.shatteredpixeldungeon.actors.hero.HeroClass; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.HeroSubClass; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.ui.HeroIcon; -import com.shatteredpixel.shatteredpixeldungeon.ui.TalentButton; import com.shatteredpixel.shatteredpixeldungeon.ui.TalentsPane; -import com.shatteredpixel.shatteredpixeldungeon.windows.WndHeroInfo; -import com.shatteredpixel.shatteredpixeldungeon.windows.WndTitledMessage; import java.util.ArrayList; import java.util.LinkedHashMap; @@ -37,18 +36,16 @@ import java.util.LinkedHashMap; public class WndInfoSubclass extends WndTitledMessage { public WndInfoSubclass(HeroClass cls, HeroSubClass subCls){ - super( new HeroIcon(subCls), Messages.titleCase(subCls.title()), subCls.desc()); + super( new HeroIcon(subCls), Messages.titleCase(subCls.title()), subCls.desc(), WIDTH_MIN); ArrayList> talentList = new ArrayList<>(); Talent.initClassTalents(cls, talentList); Talent.initSubclassTalents(subCls, talentList); - TalentsPane.TalentTierPane talentPane = new TalentsPane.TalentTierPane(talentList.get(2), 3, TalentButton.Mode.INFO); + TalentsPane.TalentTierPane talentPane = new TalentsPane.TalentTierPane(talentList.get(2), 3, INFO); talentPane.title.text( Messages.titleCase(Messages.get(WndHeroInfo.class, "talents"))); - talentPane.setRect(0, height + 5, width, talentPane.height()); - add(talentPane); - resize(width, (int) talentPane.bottom()); + addToBottom(talentPane, 5, 0); } -} +} \ No newline at end of file