From 40c0d61dfa73362f2e19a7315a939b297ffb8003 Mon Sep 17 00:00:00 2001 From: Evan Debenham Date: Tue, 2 Jun 2015 00:35:46 -0400 Subject: [PATCH] v0.3.0c: trap refactor pt1, moved all traps to be instance based (not properly tied into level logic yet) --- assets/traps.png | Bin 0 -> 7341 bytes .../shatteredpixeldungeon/Assets.java | 1 + .../items/wands/CursedWand.java | 4 +- .../shatteredpixeldungeon/levels/Level.java | 32 ++++---- .../levels/traps/AlarmTrap.java | 19 +++-- .../levels/traps/FireTrap.java | 15 ++-- .../levels/traps/GrippingTrap.java | 19 +++-- .../levels/traps/LightningTrap.java | 31 ++++---- .../levels/traps/ParalyticTrap.java | 15 ++-- .../levels/traps/PoisonTrap.java | 20 +++-- .../levels/traps/SummoningTrap.java | 40 ++++++---- .../levels/traps/ToxicTrap.java | 15 ++-- .../levels/traps/Trap.java | 70 ++++++++++++++++++ .../sprites/TrapSprite.java | 49 ++++++++++++ .../windows/WndInfoTrap.java | 14 ++++ 15 files changed, 263 insertions(+), 81 deletions(-) create mode 100644 assets/traps.png create mode 100644 src/com/shatteredpixel/shatteredpixeldungeon/levels/traps/Trap.java create mode 100644 src/com/shatteredpixel/shatteredpixeldungeon/sprites/TrapSprite.java create mode 100644 src/com/shatteredpixel/shatteredpixeldungeon/windows/WndInfoTrap.java diff --git a/assets/traps.png b/assets/traps.png new file mode 100644 index 0000000000000000000000000000000000000000..8bef3d1298a4f34bd3c4396d21f4e8b7ba07742b GIT binary patch literal 7341 zcmd6Mi8s_=`2X87#=eB?OO&;;FEN%-_FYjv88syp$x>z*#uf${dn8+lK_w9>j9o|w z*}^cSP_vO4X3S6D-#NeYJHNl+_de(Ke%|-F=bn4t_jz8=^PGFpZZ5V0ywbb?00`LI z*?1hvxPRd0I(+w-UmZRaJooG_g#!Se=s&OlPo7F1D!~!<&gZ~OTCVaCLC1j;Xu|sO=FmsMX$?AkoU*Vq^$n}`1kP@DcaAE_`I+A9VFxLun~ik~ z(cVAxmL9K?VtN+-&NoJnZaqDt7w%n(wkJTces+kIUbO~C_h-oev6nS+;BAJ*SpH`L zlhJ}Hn4|56EgIlHY-0_=YV3R=p1UN|zZ+VGB`Y{GE$8-TNGixXSkX;To|q zg={)&!X2IxrfHXH-Vudqxm=NNF`De!_j6p_8Y!_WP1!e0pSu_ zD_3A*R$mzb9TD@_hkVVx;$<%0oLDpviRr|b+24Mls#h!! zJ2Dw?*!PAu!T} z;M0oPdT8is`k&D%@Z&EAG_V3P%P;EJiNvM%p~}J0{-w&SmC$Ea4c!nE$> zO;Z_ItdEcO{n<$j1cQ{3w*PiZk(Nv7Tge%fVSMz2^cM=17Q|$KaiQ2P9{L1dWPm3# zS)B_?UDr2hGM~lsL7kts--m-Q(9lColAmYd0?6}E2$jVY#y z)>x(Y>0Kdc{ugZ|zw`Sy&R)U3cQvw&wK=%@q=T5#rJDb4tSMMkAh!RGcVI+lyE2PG z9d*2VAcUfEv_D`W6YGl<>`{INTc1LVUA>m&2wlYY=bJWRy6~+f)xULZUchHopQm$V zo9t=1vxOoJ&L(jrp0)sVRB(EAJ#NhQiHLSBdtCLyvg}Mn>OEjtRNK|!K$;m`Fz_uS ze(9rGc3Lw=pO##bi>0lhxu6}P$JcO%`JYzv=eUqtENvX6Vgxnuc4bE-@vfqlY;cKOd6cmoWo<~^=4E% z3oA11A^jvW%}cBM?q~ObLNG$* zul0x_{M6}=9}D}yK?kY^*z)IW)5+>!L>R$7cjgJj0`;iy3yLv2v+`m54H|I}vMcT^ z(RBx@`y*XlfdTm8%m=K!tLOIt{BR%5Z+}CLK${cj!AALhRfUmEbj0TiRz8JDPupnf zWy-(~>R{BLA@;ev zi#nNQjqM3JX~h{k+Y6`iJnk)KrwlHUJ7o#9l@r#z?^%O8{tmRydZWe^%*E`d`&4qB zFZv*2JNG_6&)P)=fEWLWmAhV1KfYe}^Y}>8jLHD&GqXLwz8{3=?r!oS0C?ZNjWs7s z7mP9Ry$sQNs7`2E1ZXk!mF}~3JpvtJ6K*2hL)x^xS5jUbCl<0<_rLN)ousFB)w|SG z8RR+&92B8XZF^j9R4$W%6x2p>$}kRQj(N#S1(Gf-wI>SpCL2?F9zZL3qFrSelQFh| zm;DmEs@v~p{uwkQe5$|HcwPgb8tCo0{rQ^B#oC^5bqrk*N&`ihP_JcwD?OfwB4}if zfki{om~}AWeNJP^{qp17YFMfV${e7!eQBH5aiW%)*MDK>hsKrNl}{fVZ!5_^dy|6& z%01imS?=W@Pw}|j8tb?Mlm}=Gns5;~b(zih=}ghy_Mh`+y*KMiuVABhT_!(zdvDA> z*Sk;rW`7s+2>sS9+y4r=lucg2)Izy9JPJ!gYmqzg4X^^<fM@MX>Gc`e6pKDIT3zqoFSEGaN=RX=_kt9n+c#)f@yE`Xa(K(Q?Y+x zYOH&g*imUk3(;%J>aS6fI}*d%%H!E*^B`A~f_oC~_w9dx|I4;bUtevOL`=t{!z3lA zvQDKWu$?2U32S3dUW&CU-jbGhxyowZ*4xfZrCm946&giCy`Wbsq&rkVW3Qx%j{cTd zt@gO#tdyTxQI3V=rfnXnDLy*8})m4EF@=~@b1OkJiy*~@8R@I|Hki zZNE5q$m6BzMT2=o*-oB~6Wqg6zjAwT@;bW|t9`bsr8$MQ0inngIPr`=iVqf4({;e}mLR7l4__WEBwK3z4O zZtf7(qsFbN2x^QLoUC+5T;eql%ODSjlpT2A`rG1iM%~#Qg5n4JB-03+E7yMd+o4Ph zEKlw}suWdHhC3lk)A*k6b-Ljokb|NZM7u_d7Rp=3Q_s*rNiGI?)8>YD8_QN6kt83p z?S6(c2<3k|_=+Lgu>KQyxQBouY+ah0{A!hdP1)T2MBe_v{_&iL!SD&5WP#Sb?E|nVoa~*kZKc$dc6}XHR&Z%5m&tex)Q{QC&rq z?<9@=^PKKq-&ZsXq%&W`p%V3U-%($7o|5Y%upUsz%-*>aCfON=`#!GUX6SjlAV&CE z?&{SaI(+5O?+*x`oDcmE*4~iji6)fqv3~E=_{GnbQ--{1)t@+>xZsIZG=f^g&ocMh>w}m+kLCUx%HHu`ILu7aP95ordq^hg80jOM0B8zIDtym%@XV7?d>d4L2QWAj^Ux-0lkNQ2;)~}$BXRpBFF~Y% zmehy3$6laVrX?a}(MvJj-$3Ppc&(dri@0B$%E^M;orzCPqoup@82$+Ph?u|3HGO?MYeL@~2nMB;Gh>Qv@|-AP4eIt(%YEmw8TbpTQPiXCs6dGJUQ zVs{w`6gYCWkSkNcET=n><3;lFL=?wcDvE|EVz|>a&lufi_gehJ2aN6j8i%+Ge+_m+ zyawOvQIM5&cx9&S%ozL$Xkc9L^@W?o4IM(Jbd$~N5J>X(@zlS+QN(^GOa^}ZA;tWC zC@bjLoEqRCp(_^mjvuUaI!;wVTVdc^*PJnP>G9fk=-Lf6A0N(q+lynF^>xnAHYoa{ zPRe4+GId_EMln)-B;YEBAC2XRN5XZlXh z1j@oPq;%-88w}`_Zeh$S=$>}-*b+JRoxK!g$ngO|*BV~ddZ|#h{ z)oJ-bAM!x}Q!N|dx0cP@pIc9HMgL>ENsiU2su_wKkiQ-U&cxdRu|KP}MB)I>1LHSRpoPq_b`RUITc$XnbKWUo|w!=i%lc@^A z#c;ZUw0|RqF{g}qJuXOfhTh|EK%lu|{;f2UmcBi&aeEvuA$vCy4+RWqIhUAnL6VLE5e{V=B zvJjqcJD@CqPhL`76zUXIpcaY*`4+6^u9M|z@Q*@p!P3-h8O!`E6U{&Z=i3&HPU*n0 zAnR+~vA`X9|BJ%!Lg}k~xuYeckkTl_{r z=lZn{)gzNQW}t5L?|U{Hnz|Ni;sP*i*Ct5^>aJ5ndFXMOKHcc*I8jgWSr7i)Bi(7` zLw8(Wz?z$U?p1j2%dj$Pu0w}p2%l40W($U&rnw;^Aa4^iFiIk7afjZIYgQWQt!E6f z5BZvW?}Y`z|IXf=C#mfPdi5iTo~IpqrH>|9;lGO&hz%UNm5+7AF^SpWWz`C@$S6 ztOdQk%P~W~jR!+yJ9ba<#z%6ztgX`{Q!MmrqlzWDv_W15LcH;G3saSghjHVDfpACM z(C{2k0eqf6qtm}V>MP_QMQQ)P!(mGV=0yR`T;(7lLP+D+*D3M;Ct#BL8hdv4eoa(K z0krT%|EyP{spn^S;!n6K$8T{8);tLcY8(b>YnfiAv1w=}o*gp$=%zw_(Yi8id7((< zz;awnLu>F}AA!eqy$&Lg@_yNMSHTG!6{$mh7nAIHW&6r&_-Cq!um{42onPoKtwd?{ zBWhMn6hrF_A2nOgU9XnCv3xVHrnKqqwX3^*>A@zrN9=e}aE+%~P-0K#+|NqjygT}_ zcZ&{DCHt_#9Nx^sx_~#e&T1ak@FAd78AzAtcw|=I%*XzyKU?2ZqCkDZ&8qxGtL_$b zAE@e$g8(fDYD?y0Rz>(RCc)ORkk9G^*k)L?#v$&@z}p=gjZx4sm$rq6SO`u5AAo=} zQ~$QEz1oF}O{6@5Jq!83Y%)8gI}_e`*j;YcHb>VoGRTH&zU=z=7C33lRuy0P_ZWXh zr%+jHS*$6@4N-}7XDSoel;nceexJ5kyVHxr)t*L64}HCEW*JSN{)!p4981o7t}D5U zX<1~A`;on5rXOYY_IWsy;vTe=HQ@49fdK6h2z23#;L$hn?kq7B{oh?p--)XDZMiD+LzD@o@^B!zT#) zaQ-MM1-9ysTCfkkvdcZBxL4YY&8-V*ng>&>0Y$>>m?PS1Y!r^Q-E8IhMHDPTtVD=E zi_w6UtWB3ZnPVL~DRy+VmZ^YFir(uWQjcC^TKky50KZ2--Z65GXahI z4h3Mi10HJ;H&jOiTbjjb$xoR}vU`KsiLF;&v?1nl+;qRN|z23!NxwDn~?uNBfH`^OpbQG)`tg=p7gOr zpN19`S>+quQZSJ?3e5Eol=z&4B$Av8_4Bu+ZLyE#Y0b+2Tmk79%6mZ~!1P}}Q6GA+ z+A2SWPB{U;v9fFkSwhA5NXlhw{QiE>sb;dE)zuJ_m$-Z@az#Y2U&jT)Y6n#1mzPhi z5JARdZZ^WL$KR&kLP@$jNvl~y#Z5xIfV&p(Lj=Yxkz^UYg#>BP?@ysBp<>Ka+Fx$&b91;ZMt?3S zYoeyg9zl|6bfXQnE%+n{o(Q6?WQ*8bDZjwh$*QSMyEr}FvMeB(S$2|xYNEUW^0&Yl za;d)A17@_AcvaHOpZ?qX1p&JO*CtF9pnAB2_}=G|VuEF&P&zE9Cr)%pSKCU>GF2HW zB5|(IEKv>-p}oR%f#}9##qX`Si>CgcL5V_xoNwC0@cBBlZ0vLPPBI}u81kDWU2*1~ zbe5vkdfk)RAHP^rMi~jh8B`6SM$9ZgeIW5^2SBV{^16}}xRM^O>S;YCSq3S+TgY<0 zb?WO8EF^&QClZQ$0gpcKiBr5SuW)>*Gx`aw|Ex9EP^nv0C`6&gFM~BK1T`Xm;&-4D z6Aw#=Nx)yy4N(|toX`P>?_)W7(-qxzt0`*SXH~}T24=CY9-vFc1R=k)cNjTpPi2SS z2pT6FOhzgFu<-er{SJWJi+E=r*3ro=VW?k(<37aAPJmX2|o64@HN~R zk;>+;X8eZnVKrMm*~6H;!SojT?O5HD?BRJ&u_P@c8+nIO;w3Bot2PF{U&zzB3>#&s zUh_Y%gO!oD0A^bu<5)1jTKUR9N9}a-hP1^}Opt0Exl1@&%Vsy|Cdh3>AUgA##QC>> z8xU`c`>}01hg>1*3wR(l_u1x#t$FZFiBqjA`P~vBk*vpDAhdU1>f>|C0?(pE#BPV| z|74sQ7V_+(qDi>YGe zFTtegjthmh+T2rCE?=Gp6By_ku#5hgJ8Yq^%grRZB-jrE2y;(Z5r`6ziCIhLi9pcU zGjYpdTn&5ggFiu^dRL`sWEJ5(HXWLp-UC2t44K}rC5ote9lvFCV0y;4N z4kN71ZY7NRJx|VG&R#JflfBBucB)=03@Tg)6GcOAZAUU6Kw`zxx`iv_Lz1=VG+2?G zjeI9MG%QC)o0T3hQ96i&v!8aQ*sA`G}Y7rEjt zHJQC>dn2oOGjb)HMdZc|DMH(7s3PRXOtP`@w=n7_aUXF@!_$l0E6KJipY}ir^{=G^ zrW=A!cj!l+oLzvF!i|0_hX+m{kgt+o!^Ki&$aZ`0TVs>Z3s0g=<>5u)NZYx3|9^F`e zlOR?^Tpt9pY;yuSt_QzCt>hAqAbW` z08Z!hK_-oZtEB_n4Jy<)@Ao{{?!D_&TZ2p4(*G9qU;G;{!+;S&%v)wN=6jqRD%P@6 zQ~t))2h*6m`r^%j(f(kfh3Z%Fe|^w^33~HV8J7RrB8+^`ekb`w0F-v@Qgz&S`bE$i zg1g#E@4lY*SKY~grdGC(#gVraTtEEto$DaeFy@1vgk0-@0Ro!H&1x7qX}Kmx03aum zi1HdE9do}PgaW3ehALwV5C=I@sllfoU4~rPTfu8%ib|{|9Y)${0V(I^LwE6#4qs8NZjd!r-^Or&6FaK^6 N?a#T`yteXB_+R_?IPm}g literal 0 HcmV?d00001 diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/Assets.java b/src/com/shatteredpixel/shatteredpixeldungeon/Assets.java index 24469b926..35bcea4fc 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/Assets.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/Assets.java @@ -89,6 +89,7 @@ public class Assets { public static final String ITEMS = "items.png"; public static final String PLANTS = "plants.png"; + public static final String TRAPS = "traps.png"; public static final String TILES_SEWERS = "tiles0.png"; public static final String TILES_PRISON = "tiles1.png"; diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/items/wands/CursedWand.java b/src/com/shatteredpixel/shatteredpixeldungeon/items/wands/CursedWand.java index 810a8f1fe..7718c578c 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/items/wands/CursedWand.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/items/wands/CursedWand.java @@ -247,7 +247,7 @@ public class CursedWand { //shock and recharge case 3: - LightningTrap.trigger(user.pos, user); + new LightningTrap().set( user.pos ).activate(); Buff.prolong(user, ScrollOfRecharging.Recharging.class, 20f); ScrollOfRecharging.charge(user); SpellSprite.show(user, SpellSprite.CHARGE); @@ -322,7 +322,7 @@ public class CursedWand { //summon monsters case 3: - SummoningTrap.trigger( user.pos, user ); + new SummoningTrap().set( user.pos ).activate(); wand.wandUsed(); break; } diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/levels/Level.java b/src/com/shatteredpixel/shatteredpixeldungeon/levels/Level.java index c6dd3dd11..f35f20d3b 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/levels/Level.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/levels/Level.java @@ -731,56 +731,56 @@ public abstract class Level implements Bundlable { GLog.i( TXT_HIDDEN_PLATE_CLICKS ); case Terrain.TOXIC_TRAP: trap = true; - if (!frozen) ToxicTrap.trigger( cell, ch ); + if (!frozen) new ToxicTrap().set(cell).activate(); break; case Terrain.SECRET_FIRE_TRAP: GLog.i( TXT_HIDDEN_PLATE_CLICKS ); case Terrain.FIRE_TRAP: trap = true; - if (!frozen) FireTrap.trigger( cell, ch ); + if (!frozen) new FireTrap().set( cell ).activate(); break; case Terrain.SECRET_PARALYTIC_TRAP: GLog.i( TXT_HIDDEN_PLATE_CLICKS ); case Terrain.PARALYTIC_TRAP: trap = true; - if (!frozen) ParalyticTrap.trigger( cell, ch ); + if (!frozen) new ParalyticTrap().set( cell ).activate(); break; case Terrain.SECRET_POISON_TRAP: GLog.i( TXT_HIDDEN_PLATE_CLICKS ); case Terrain.POISON_TRAP: trap = true; - if (!frozen) PoisonTrap.trigger( cell, ch ); + if (!frozen) new PoisonTrap().set( cell ).activate(); break; case Terrain.SECRET_ALARM_TRAP: GLog.i( TXT_HIDDEN_PLATE_CLICKS ); case Terrain.ALARM_TRAP: trap = true; - if (!frozen) AlarmTrap.trigger( cell, ch ); + if (!frozen) new AlarmTrap().set( cell ).activate(); break; case Terrain.SECRET_LIGHTNING_TRAP: GLog.i( TXT_HIDDEN_PLATE_CLICKS ); case Terrain.LIGHTNING_TRAP: trap = true; - if (!frozen) LightningTrap.trigger( cell, ch ); + if (!frozen) new LightningTrap().set( cell ).activate(); break; case Terrain.SECRET_GRIPPING_TRAP: GLog.i( TXT_HIDDEN_PLATE_CLICKS ); case Terrain.GRIPPING_TRAP: trap = true; - if (!frozen) GrippingTrap.trigger( cell, ch ); + if (!frozen) new GrippingTrap().set( cell ).activate(); break; case Terrain.SECRET_SUMMONING_TRAP: GLog.i( TXT_HIDDEN_PLATE_CLICKS ); case Terrain.SUMMONING_TRAP: trap = true; - if (!frozen) SummoningTrap.trigger( cell, ch ); + if (!frozen) new SummoningTrap().set( cell ).activate(); break; case Terrain.HIGH_GRASS: @@ -843,35 +843,35 @@ public abstract class Level implements Bundlable { switch (map[cell]) { case Terrain.TOXIC_TRAP: - ToxicTrap.trigger( cell, mob ); + new ToxicTrap().set( cell ).activate(); break; case Terrain.FIRE_TRAP: - FireTrap.trigger( cell, mob ); + new FireTrap().set( cell ).activate(); break; case Terrain.PARALYTIC_TRAP: - ParalyticTrap.trigger( cell, mob ); + new ParalyticTrap().set( cell ).activate(); break; case Terrain.POISON_TRAP: - PoisonTrap.trigger( cell, mob ); + new PoisonTrap().set( cell ).activate(); break; case Terrain.ALARM_TRAP: - AlarmTrap.trigger( cell, mob ); + new AlarmTrap().set( cell ).activate(); break; case Terrain.LIGHTNING_TRAP: - LightningTrap.trigger( cell, mob ); + new LightningTrap().set( cell ).activate(); break; case Terrain.GRIPPING_TRAP: - GrippingTrap.trigger( cell, mob ); + new GrippingTrap().set( cell ).activate(); break; case Terrain.SUMMONING_TRAP: - SummoningTrap.trigger( cell, mob ); + new SummoningTrap().set( cell ).activate(); break; case Terrain.DOOR: diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/levels/traps/AlarmTrap.java b/src/com/shatteredpixel/shatteredpixeldungeon/levels/traps/AlarmTrap.java index e5401caa7..7d21cb774 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/levels/traps/AlarmTrap.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/levels/traps/AlarmTrap.java @@ -26,23 +26,26 @@ import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter; import com.shatteredpixel.shatteredpixeldungeon.effects.Speck; import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; -public class AlarmTrap { +public class AlarmTrap extends Trap { // 0xDD3333 - - public static void trigger( int pos, Char ch ) { - + { + name = "alarm trap"; + image = 4; + } + + @Override + public void activate() { + for (Mob mob : Dungeon.level.mobs) { - if (mob != ch) { mob.beckon( pos ); - } } - + if (Dungeon.visible[pos]) { GLog.w( "The trap emits a piercing sound that echoes throughout the dungeon!" ); CellEmitter.center( pos ).start( Speck.factory( Speck.SCREAM ), 0.3f, 3 ); } - + Sample.INSTANCE.play( Assets.SND_ALERT ); } } diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/levels/traps/FireTrap.java b/src/com/shatteredpixel/shatteredpixeldungeon/levels/traps/FireTrap.java index 153ecd16a..dbedd7ccb 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/levels/traps/FireTrap.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/levels/traps/FireTrap.java @@ -24,14 +24,19 @@ import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter; import com.shatteredpixel.shatteredpixeldungeon.effects.particles.FlameParticle; import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; -public class FireTrap { +public class FireTrap extends Trap { // 0xFF7708 - - public static void trigger( int pos, Char ch ) { - + { + name = "fire trap"; + image = 1; + } + + @Override + public void activate() { + GameScene.add( Blob.seed( pos, 2, Fire.class ) ); CellEmitter.get( pos ).burst( FlameParticle.FACTORY, 5 ); - + } } diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/levels/traps/GrippingTrap.java b/src/com/shatteredpixel/shatteredpixeldungeon/levels/traps/GrippingTrap.java index f71d5c749..aa71a0646 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/levels/traps/GrippingTrap.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/levels/traps/GrippingTrap.java @@ -18,6 +18,7 @@ package com.shatteredpixel.shatteredpixeldungeon.levels.traps; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; +import com.shatteredpixel.shatteredpixeldungeon.actors.Actor; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Bleeding; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; @@ -25,10 +26,18 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Cripple; import com.shatteredpixel.shatteredpixeldungeon.effects.Wound; import com.watabou.utils.Random; -public class GrippingTrap { - - public static void trigger( int pos, Char c ) { - +public class GrippingTrap extends Trap { + + { + name = "gripping trap"; + image = 6; + } + + @Override + public void activate() { + + Char c = Actor.findChar( pos ); + if (c != null) { int damage = Math.max( 0, (Dungeon.depth + 3) - Random.IntRange( 0, c.dr() / 2 ) ); Buff.affect( c, Bleeding.class ).set( damage ); @@ -37,6 +46,6 @@ public class GrippingTrap { } else { Wound.hit( pos ); } - + } } diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/levels/traps/LightningTrap.java b/src/com/shatteredpixel/shatteredpixeldungeon/levels/traps/LightningTrap.java index f35b44540..8c6c3dbd7 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/levels/traps/LightningTrap.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/levels/traps/LightningTrap.java @@ -17,6 +17,7 @@ */ package com.shatteredpixel.shatteredpixeldungeon.levels.traps; +import com.shatteredpixel.shatteredpixeldungeon.actors.Actor; import com.watabou.noosa.Camera; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.ResultDescriptions; @@ -31,20 +32,24 @@ import com.watabou.utils.Random; import java.util.ArrayList; -public class LightningTrap { +public class LightningTrap extends Trap { + + { + name = "lightning trap"; + image = 5; + } + + @Override + public void activate() { + + Char ch = Actor.findChar( pos ); - private static final String name = "lightning trap"; - - // 00x66CCEE - - public static void trigger( int pos, Char ch ) { - if (ch != null) { ch.damage( Math.max( 1, Random.Int( ch.HP / 3, 2 * ch.HP / 3 ) ), LIGHTNING ); if (ch == Dungeon.hero) { - + Camera.main.shake( 2, 0.3f ); - + if (!ch.isAlive()) { Dungeon.fail( Utils.format( ResultDescriptions.TRAP, name ) ); GLog.n( "You were killed by a discharge of a lightning trap..." ); @@ -57,12 +62,12 @@ public class LightningTrap { ch.sprite.parent.add( new Lightning( arcs, null ) ); } - + CellEmitter.center( pos ).burst( SparkParticle.FACTORY, Random.IntRange( 3, 4 ) ); - } - + + //FIXME: this is bad, handle when you rework resistances, make into a category public static final Electricity LIGHTNING = new Electricity(); - public static class Electricity { + public static class Electricity { } } diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/levels/traps/ParalyticTrap.java b/src/com/shatteredpixel/shatteredpixeldungeon/levels/traps/ParalyticTrap.java index e0d1c19fc..c7032a423 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/levels/traps/ParalyticTrap.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/levels/traps/ParalyticTrap.java @@ -23,13 +23,18 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Blob; import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.ParalyticGas; import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; -public class ParalyticTrap { +public class ParalyticTrap extends Trap{ // 0xCCCC55 - - public static void trigger( int pos, Char ch ) { - + { + name = "paralytic gas trap"; + image = 2; + } + + @Override + public void activate() { + GameScene.add( Blob.seed( pos, 80 + 5 * Dungeon.depth, ParalyticGas.class ) ); - + } } diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/levels/traps/PoisonTrap.java b/src/com/shatteredpixel/shatteredpixeldungeon/levels/traps/PoisonTrap.java index 36a2ec365..72cac092a 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/levels/traps/PoisonTrap.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/levels/traps/PoisonTrap.java @@ -18,23 +18,31 @@ package com.shatteredpixel.shatteredpixeldungeon.levels.traps; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; +import com.shatteredpixel.shatteredpixeldungeon.actors.Actor; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Poison; import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter; import com.shatteredpixel.shatteredpixeldungeon.effects.particles.PoisonParticle; -public class PoisonTrap { +public class PoisonTrap extends Trap{ // 0xBB66EE - - public static void trigger( int pos, Char ch ) { - + { + name = "poison trap"; + image = 3; + } + + @Override + public void activate() { + + Char ch = Actor.findChar( pos ); + if (ch != null) { Buff.affect( ch, Poison.class ).set( Poison.durationFactor( ch ) * (4 + Dungeon.depth / 2) ); } - + CellEmitter.center( pos ).burst( PoisonParticle.SPLASH, 3 ); - + } } diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/levels/traps/SummoningTrap.java b/src/com/shatteredpixel/shatteredpixeldungeon/levels/traps/SummoningTrap.java index 95b970992..cce32964d 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/levels/traps/SummoningTrap.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/levels/traps/SummoningTrap.java @@ -29,24 +29,31 @@ import com.shatteredpixel.shatteredpixeldungeon.levels.Level; import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; import com.watabou.utils.Random; -public class SummoningTrap { +public class SummoningTrap extends Trap { private static final float DELAY = 2f; private static final Mob DUMMY = new Mob() {}; // 0x770088 - - public static void trigger( int pos, Char c ) { - + { + name = "summoning trap"; + image = 7; + } + + @Override + public void activate() { + if (Dungeon.bossLevel()) { return; } - + + Char c = Actor.findChar( pos ); + if (c != null) { Actor.occupyCell( c ); } - + int nMobs = 1; if (Random.Int( 2 ) == 0) { nMobs++; @@ -54,35 +61,36 @@ public class SummoningTrap { nMobs++; } } - + // It's complicated here, because these traps can be activated in chain - - ArrayList candidates = new ArrayList(); - + + ArrayList candidates = new ArrayList<>(); + for (int i=0; i < Level.NEIGHBOURS8.length; i++) { int p = pos + Level.NEIGHBOURS8[i]; if (Actor.findChar( p ) == null && (Level.passable[p] || Level.avoid[p])) { candidates.add( p ); } } - - ArrayList respawnPoints = new ArrayList(); - + + ArrayList respawnPoints = new ArrayList<>(); + while (nMobs > 0 && candidates.size() > 0) { int index = Random.index( candidates ); - + DUMMY.pos = candidates.get( index ); Actor.occupyCell( DUMMY ); - + respawnPoints.add( candidates.remove( index ) ); nMobs--; } - + for (Integer point : respawnPoints) { Mob mob = Bestiary.mob( Dungeon.depth ); mob.state = mob.WANDERING; GameScene.add( mob, DELAY ); ScrollOfTeleportation.appear( mob, point ); } + } } diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/levels/traps/ToxicTrap.java b/src/com/shatteredpixel/shatteredpixeldungeon/levels/traps/ToxicTrap.java index cd3aa6100..ba5502413 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/levels/traps/ToxicTrap.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/levels/traps/ToxicTrap.java @@ -23,13 +23,18 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Blob; import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.ToxicGas; import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; -public class ToxicTrap { +public class ToxicTrap extends Trap{ // 0x40CC55 - - public static void trigger( int pos, Char ch ) { - + { + name = "toxic gas trap"; + image = 0; + } + + @Override + public void activate() { + GameScene.add( Blob.seed( pos, 300 + 20 * Dungeon.depth, ToxicGas.class ) ); - + } } diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/levels/traps/Trap.java b/src/com/shatteredpixel/shatteredpixeldungeon/levels/traps/Trap.java new file mode 100644 index 000000000..466017f7b --- /dev/null +++ b/src/com/shatteredpixel/shatteredpixeldungeon/levels/traps/Trap.java @@ -0,0 +1,70 @@ +package com.shatteredpixel.shatteredpixeldungeon.levels.traps; + +import com.shatteredpixel.shatteredpixeldungeon.Assets; +import com.shatteredpixel.shatteredpixeldungeon.Dungeon; +import com.shatteredpixel.shatteredpixeldungeon.levels.Level; +import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain; +import com.shatteredpixel.shatteredpixeldungeon.sprites.TrapSprite; +import com.watabou.noosa.audio.Sample; +import com.watabou.utils.Bundlable; +import com.watabou.utils.Bundle; + +public abstract class Trap implements Bundlable { + + public String name; + + public int image; + public int pos; + + public TrapSprite sprite; + public boolean visible; + + private static final String POS = "pos"; + + public Trap set(int pos){ + this.pos = pos; + return this; + } + + public void reveal() { + visible = true; + if (sprite != null) + sprite.visible = true; + } + + public void hide() { + visible = false; + if (sprite != null) + sprite.visible = false; + } + + public void trigger() { + if (Dungeon.visible[pos]){ + Sample.INSTANCE.play(Assets.SND_TRAP); + } + activate(); + disarm(); + } + + public abstract void activate(); + + protected void disarm(){ + //Dungeon.level.traps.delete( pos ); + Level.set(pos, Terrain.INACTIVE_TRAP); + sprite.kill(); + } + + @Override + public void restoreFromBundle( Bundle bundle ) { + pos = bundle.getInt( POS ); + } + + @Override + public void storeInBundle( Bundle bundle ) { + bundle.put( POS, pos ); + } + + public String desc() { + return ""; + } +} diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/sprites/TrapSprite.java b/src/com/shatteredpixel/shatteredpixeldungeon/sprites/TrapSprite.java new file mode 100644 index 000000000..5ed8170cb --- /dev/null +++ b/src/com/shatteredpixel/shatteredpixeldungeon/sprites/TrapSprite.java @@ -0,0 +1,49 @@ +package com.shatteredpixel.shatteredpixeldungeon.sprites; + +import com.shatteredpixel.shatteredpixeldungeon.Assets; +import com.shatteredpixel.shatteredpixeldungeon.Dungeon; +import com.shatteredpixel.shatteredpixeldungeon.DungeonTilemap; +import com.shatteredpixel.shatteredpixeldungeon.levels.Level; +import com.shatteredpixel.shatteredpixeldungeon.levels.traps.Trap; +import com.watabou.noosa.Image; +import com.watabou.noosa.TextureFilm; + +public class TrapSprite extends Image { + + private static TextureFilm frames; + + private int pos = -1; + + public TrapSprite() { + super( Assets.TRAPS ); + + if (frames == null) { + frames = new TextureFilm( texture, 16, 16 ); + } + + origin.set( 8, 12 ); + } + + public TrapSprite( int image ) { + this(); + reset( image ); + } + + public void reset( Trap trap ) { + + revive(); + + reset( trap.image + (((Dungeon.depth-1) / 5) * 8) ); + alpha( 1f ); + + pos = trap.pos; + x = (pos % Level.WIDTH) * DungeonTilemap.SIZE; + y = (pos / Level.WIDTH) * DungeonTilemap.SIZE; + + } + + public void reset( int image ) { + frame( frames.get( image ) ); + } + +} diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/windows/WndInfoTrap.java b/src/com/shatteredpixel/shatteredpixeldungeon/windows/WndInfoTrap.java new file mode 100644 index 000000000..75fd8f064 --- /dev/null +++ b/src/com/shatteredpixel/shatteredpixeldungeon/windows/WndInfoTrap.java @@ -0,0 +1,14 @@ +package com.shatteredpixel.shatteredpixeldungeon.windows; + +import com.shatteredpixel.shatteredpixeldungeon.levels.traps.Trap; +import com.shatteredpixel.shatteredpixeldungeon.sprites.TrapSprite; + +public class WndInfoTrap extends WndTitledMessage { + + public WndInfoTrap(Trap trap) { + + super(new TrapSprite( trap.image ), trap.name, trap.desc()); + + } + +}