From 386e086130a435a13b55839b38f0f69a88673ac1 Mon Sep 17 00:00:00 2001 From: Evan Debenham Date: Mon, 16 Oct 2023 14:22:30 -0400 Subject: [PATCH] v2.2.0: substantially improved crystal wisp visuals --- .../src/main/java/com/watabou/noosa/Halo.java | 10 +- core/src/main/assets/sprites/crystal_wisp.png | Bin 1016 -> 872 bytes .../sprites/CrystalWispSprite.java | 120 ++++++++++++++++-- 3 files changed, 115 insertions(+), 15 deletions(-) diff --git a/SPD-classes/src/main/java/com/watabou/noosa/Halo.java b/SPD-classes/src/main/java/com/watabou/noosa/Halo.java index 0befa49e0..ac66a0ca2 100644 --- a/SPD-classes/src/main/java/com/watabou/noosa/Halo.java +++ b/SPD-classes/src/main/java/com/watabou/noosa/Halo.java @@ -67,8 +67,14 @@ public class Halo extends Image { this.y = y - (height()/2f); return this; } - - public void radius( float value ) { + + @Override + public void alpha( float value) { + brightness = value; + super.alpha(value); + } + + public void radius(float value ) { scale.set( (this.radius = value) / RADIUS ); } } diff --git a/core/src/main/assets/sprites/crystal_wisp.png b/core/src/main/assets/sprites/crystal_wisp.png index d276e7557652d18abe33b043479b261e76232674..8bc3241b99b5807da97fbaffbac3879c30fa9160 100644 GIT binary patch literal 872 zcmeAS@N?(olHy`uVBq!ia0y~yU;;831UQ(1WcYjYDj<~^;1l8sr28KKZ~cGb|8CPvTATnA1_W%F?46hsihcayX^gnI$f1u)~O?y0>_sslnqW4S>s4;(! zviwT<|A&45*E0YO+0$>fCx#&+@3x))LWa%O49%LG?tE|0}OI&J16< ze7dBLm8MIuRoWCHKJoA7qhPusc5 zUB8((#S7LykcsvCXWo&`py6T=`$1a0$nvN7#dVAe1P+!Q%%5}P>63Vu-E0j`ESFj9 zdsJSA{*RoLc6{+K{>dgKyb*^jE$*z*y)5@=568SYn|8h0ueaK&>q>n@*uv}sV&@J% z%*&qnO~5?&!;_M~q5qw)^B1o9cX%CtEc3SlK0f~H(_7jr=G;3`KWW)Miy!_$CJY+? z4rVkgFk(Bs=XlXP@uR_~1Ez&O?QX8GiF0@O$nVC?GSx8RneDXM%W~&OwXJ(y9WV3e z@n=Q0u6hG0g%v#qjoxpx>AU{X}rtLIS+sk#kDOQN?`cNA+nIHp!?s6VmF zrf_22I@W+|Od8I+Qg^rSn8>sxq>cS|`g;;)glxN9Cbl3LNb#Pio_{lkWn&!5+C zC|JQ7a4g~GyF|TDkIEfVD_&#=OuZ_|?lcJ})j4lNXOkZcCpSShvqKjYMgrE$zVlnSeu5B#rTKJdAQ+2VONFhC^! zt>h`+!xqAWCKruI4jho*>M!?6CNMA@F?jQTzny~sPkPpt1O}B;T|8SFKWVZ(DBI8Q zV>PdvA;b31tOxGr8gw%5n5)n5FORvqFqyqTI-=(a-vhG^5-Vj7}8p9EbD_<9;L>z08=r8r>mdKI;Vst0JF}d A@Bjb+ literal 1016 zcmXw&drXs87{=dTfWivJjA6MbWNhldiWEdv7y`DiZlfTA7}#tXQY5m?rKnQ~{h&g? zW?Yg6WD{0!f1n9+b9kYAE#gE&=bFk`kzuQn4#%ZV!$3aTvk$r@zwv!wix{z;~Q)VgP=3f)74kx|_XGYFBuT*W+E zCP7(%kd%bXI6-JV?1Zd1AuH=)B<*{Nr2WYB8VygQ%07)yp=m);yR5s$5stsYztV&R zT@FGcsYniJ<~Gu6H1*M%PvP*FQ~15b__TKDkJU_TLGfPyR+t{rDBgq{IgeM#75z&x zLuHKOmq*Ek-xMDQ_&u;Azk=sOmYdlIo~uJV z;+wE!F(%h4?Q#VNL)(uH4f<^1-b~r6*((6 zLG-Bc_?ToZW)!h{fRI=HT-w!Zaxg=h5_9{giqYP?rI z$Jm{ZCN@d#I=VtE$_jgK3JABmt;Sr+e>t%yHr4vs_0%l{D+TlWf9N*TNV^d_Lx!Gw z*ShUhc{yUKRXHx0FYqXg{ZvahT!Wosw>&^jshMz0;lEOkb)BZDT`&>cZh)0HfCHmn zw^4Os==cepH21^Z6PqCiX6eC9cT5Wg>WesA7_7Mj=Mbnd!;KA<5$tLfcj^11e~G&e zE$_=^AHj_7@nzkG3wA9$Wdzs3)04aimD7$?JN1jg(qc2+kN}=^L+8WVcBj4I^`E8< zn2RuIVn}MCX`{Sh$EuuHb}3Ob>h%jS+S#r)?b3a*rLM-KFNttDG8yck?byHSCQ;0? z)Xe8Wm}kd6jQgV;qC2~xVD>8Z&~-T*-AWSJ01%rb&zuP-3Ct`Q$E^J?tYZEHt4Tv7gHxeQk{410aM9n_4D1ti`*GfB0bEX q)%VmGTJi$g)41MeUj)W&tsiycNn|thVObUVKR_rD@vkOHD*pvF)#fMw diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/CrystalWispSprite.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/CrystalWispSprite.java index a5ea96294..c45045e64 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/CrystalWispSprite.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/CrystalWispSprite.java @@ -22,13 +22,21 @@ package com.shatteredpixel.shatteredpixeldungeon.sprites; import com.shatteredpixel.shatteredpixeldungeon.Assets; +import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.CrystalWisp; import com.shatteredpixel.shatteredpixeldungeon.effects.Beam; +import com.shatteredpixel.shatteredpixeldungeon.effects.TorchHalo; +import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; import com.shatteredpixel.shatteredpixeldungeon.tiles.DungeonTilemap; +import com.watabou.noosa.Game; import com.watabou.noosa.TextureFilm; +import com.watabou.noosa.tweeners.AlphaTweener; +import com.watabou.utils.PointF; public abstract class CrystalWispSprite extends MobSprite { + private TorchHalo light; + public CrystalWispSprite() { super(); @@ -38,19 +46,19 @@ public abstract class CrystalWispSprite extends MobSprite { TextureFilm frames = new TextureFilm( texture, 12, 14 ); - idle = new Animation( 4, true ); - idle.frames( frames, c+0, c+1, c+0, c+2 ); + idle = new Animation( 1, true ); + idle.frames( frames, c+0 ); run = new Animation( 12, true ); - run.frames( frames, c+0, c+1, c+0, c+3 ); + run.frames( frames, c+0, c+0, c+0, c+1 ); - attack = new Animation( 15, false ); - attack.frames( frames, c+4, c+5, c+6 ); + attack = new Animation( 16, false ); + attack.frames( frames, c+2, c+3, c+4, c+5 ); zap = attack.clone(); die = new Animation( 15, false ); - die.frames( frames, c+7, c+8, c+9, c+10, c+11, c+12, c+13, c+12 ); + die.frames( frames, c+6, c+7, c+8, c+9, c+10, c+11, c+12, c+11 ); play( idle ); } @@ -59,11 +67,55 @@ public abstract class CrystalWispSprite extends MobSprite { super.zap( cell ); - ((CrystalWisp)ch).onZapComplete(); - parent.add( new Beam.LightRay(center(), DungeonTilemap.raisedTileCenterToWorld(cell))); + parent.add(new AlphaTweener(light, 1f, 0.2f) { + @Override + public void onComplete() { + light.alpha(0.3f); + ((CrystalWisp)ch).onZapComplete(); + parent.add( new Beam.LightRay(center(), DungeonTilemap.raisedTileCenterToWorld(cell))); + } + }); } + @Override + public synchronized void attack(int cell) { + super.attack(cell); + parent.add(new AlphaTweener(light, 1f, 0.2f) { + @Override + public void onComplete() { + light.alpha(0.3f); + } + }); + } + + @Override + public void link(Char ch) { + super.link(ch); + light = new TorchHalo( this ); + light.hardlight(blood() & 0x00FFFFFF); + light.alpha(0.3f); + light.radius(10); + + GameScene.effect(light); + } + + @Override + public void die() { + super.die(); + if (light != null){ + light.putOut(); + } + } + + @Override + public void destroy() { + super.destroy(); + if (light != null){ + light.killAndErase(); + } + } + @Override public void onComplete( Animation anim ) { if (anim == zap) { @@ -72,6 +124,48 @@ public abstract class CrystalWispSprite extends MobSprite { super.onComplete( anim ); } + private float baseY = Float.NaN; + + @Override + public void place(int cell) { + super.place(cell); + baseY = y; + } + + @Override + public PointF point(PointF p) { + super.point(p); + baseY = y; + return p; + } + + @Override + public void move(int from, int to) { + super.move(from, to); + } + + @Override + public void update() { + super.update(); + + if (!paused && curAnim != die){ + if (Float.isNaN(baseY)) baseY = y; + y = baseY + Math.abs((float)Math.sin(Game.timeTotal)); + shadowOffset = 0.25f - 0.8f*Math.abs((float)Math.sin(Game.timeTotal)); + } + + if (light != null){ + light.visible = visible; + light.point(center()); + + } + } + + @Override + public void turnTo(int from, int to) { + //do nothing + } + protected abstract int texOffset(); public static class Blue extends CrystalWispSprite { @@ -81,29 +175,29 @@ public abstract class CrystalWispSprite extends MobSprite { } @Override public int blood() { - return 0xFF8EE3FF; + return 0xFF66B3FF; } } public static class Green extends CrystalWispSprite { @Override protected int texOffset() { - return 14; + return 13; } @Override public int blood() { - return 0xFF85FFC8; + return 0xFF2EE62E; } } public static class Red extends CrystalWispSprite { @Override protected int texOffset() { - return 28; + return 26; } @Override public int blood() { - return 0xFFFFBB33; + return 0xFFFF7F00; } }