From 50980caebb673506626bdbead52f4a679463f94c Mon Sep 17 00:00:00 2001 From: Noah Petherbridge Date: Sun, 1 May 2022 15:18:23 -0700 Subject: [PATCH] Doodads: Gems, Snake and Crusher Adds several new doodads to the game and 5 new wallpapers (parchment paper in blue, green, red, white and yellow). New doodads: * Crusher: A purple block-headed mob wearing an iron helmet. It tries to crush the player when you get underneath. Its flat helmet can be ridden on like an elevator back up. * Snake: A green stationary mob that always faces toward the player. If the player is nearby and jumps, the Snake will jump too and hope to catch the player in mid-air. * Gems and Totems: A new key & lock collectible. Gems have quantity so you can collect multiple, and place them into matching Totems. A Totem gives off a power signal when its gem is placed and all other Totems it is linked to have also been activated. A single Totem may link to an Electric Door and require only one gem to open it, or it can link to other Totems and they all require gems before the power signal is sent out. --- dev-assets/doodads/box/box.js | 10 +- dev-assets/doodads/build.sh | 15 ++ dev-assets/doodads/crusher/Makefile | 14 ++ dev-assets/doodads/crusher/angry.png | Bin 0 -> 2405 bytes dev-assets/doodads/crusher/crusher.js | 200 ++++++++++++++++++++ dev-assets/doodads/crusher/ouch.png | Bin 0 -> 2253 bytes dev-assets/doodads/crusher/peek-left.png | Bin 0 -> 2219 bytes dev-assets/doodads/crusher/peek-right.png | Bin 0 -> 2212 bytes dev-assets/doodads/crusher/sleep.png | Bin 0 -> 2106 bytes dev-assets/doodads/gems/Makefile | 58 ++++++ dev-assets/doodads/gems/blue-1.png | Bin 0 -> 891 bytes dev-assets/doodads/gems/blue-2.png | Bin 0 -> 927 bytes dev-assets/doodads/gems/blue-3.png | Bin 0 -> 903 bytes dev-assets/doodads/gems/blue-4.png | Bin 0 -> 835 bytes dev-assets/doodads/gems/gemstone.js | 24 +++ dev-assets/doodads/gems/green-1.png | Bin 0 -> 785 bytes dev-assets/doodads/gems/green-2.png | Bin 0 -> 807 bytes dev-assets/doodads/gems/green-3.png | Bin 0 -> 864 bytes dev-assets/doodads/gems/green-4.png | Bin 0 -> 835 bytes dev-assets/doodads/gems/red-1.png | Bin 0 -> 711 bytes dev-assets/doodads/gems/red-2.png | Bin 0 -> 702 bytes dev-assets/doodads/gems/red-3.png | Bin 0 -> 712 bytes dev-assets/doodads/gems/red-4.png | Bin 0 -> 724 bytes dev-assets/doodads/gems/totem-blue-0.png | Bin 0 -> 798 bytes dev-assets/doodads/gems/totem-blue-1.png | Bin 0 -> 958 bytes dev-assets/doodads/gems/totem-blue-2.png | Bin 0 -> 1005 bytes dev-assets/doodads/gems/totem-blue-3.png | Bin 0 -> 987 bytes dev-assets/doodads/gems/totem-blue-4.png | Bin 0 -> 921 bytes dev-assets/doodads/gems/totem-green-0.png | Bin 0 -> 711 bytes dev-assets/doodads/gems/totem-green-1.png | Bin 0 -> 887 bytes dev-assets/doodads/gems/totem-green-2.png | Bin 0 -> 938 bytes dev-assets/doodads/gems/totem-green-3.png | Bin 0 -> 978 bytes dev-assets/doodads/gems/totem-green-4.png | Bin 0 -> 956 bytes dev-assets/doodads/gems/totem-red-0.png | Bin 0 -> 752 bytes dev-assets/doodads/gems/totem-red-1.png | Bin 0 -> 811 bytes dev-assets/doodads/gems/totem-red-2.png | Bin 0 -> 805 bytes dev-assets/doodads/gems/totem-red-3.png | Bin 0 -> 790 bytes dev-assets/doodads/gems/totem-red-4.png | Bin 0 -> 817 bytes dev-assets/doodads/gems/totem-yellow-0.png | Bin 0 -> 837 bytes dev-assets/doodads/gems/totem-yellow-1.png | Bin 0 -> 1097 bytes dev-assets/doodads/gems/totem-yellow-2.png | Bin 0 -> 1082 bytes dev-assets/doodads/gems/totem-yellow-3.png | Bin 0 -> 1054 bytes dev-assets/doodads/gems/totem-yellow-4.png | Bin 0 -> 1062 bytes dev-assets/doodads/gems/totem.js | 108 +++++++++++ dev-assets/doodads/gems/yellow-1.png | Bin 0 -> 971 bytes dev-assets/doodads/gems/yellow-2.png | Bin 0 -> 921 bytes dev-assets/doodads/gems/yellow-3.png | Bin 0 -> 898 bytes dev-assets/doodads/gems/yellow-4.png | Bin 0 -> 879 bytes dev-assets/doodads/snake/Makefile | 15 ++ dev-assets/doodads/snake/attack-left-1.png | Bin 0 -> 1202 bytes dev-assets/doodads/snake/attack-left-2.png | Bin 0 -> 1139 bytes dev-assets/doodads/snake/attack-left-3.png | Bin 0 -> 935 bytes dev-assets/doodads/snake/attack-right-1.png | Bin 0 -> 1201 bytes dev-assets/doodads/snake/attack-right-2.png | Bin 0 -> 1127 bytes dev-assets/doodads/snake/attack-right-3.png | Bin 0 -> 916 bytes dev-assets/doodads/snake/left-1.png | Bin 0 -> 1161 bytes dev-assets/doodads/snake/left-2.png | Bin 0 -> 1180 bytes dev-assets/doodads/snake/left-3.png | Bin 0 -> 1152 bytes dev-assets/doodads/snake/right-1.png | Bin 0 -> 1203 bytes dev-assets/doodads/snake/right-2.png | Bin 0 -> 1172 bytes dev-assets/doodads/snake/right-3.png | Bin 0 -> 1145 bytes dev-assets/doodads/snake/snake.js | 135 +++++++++++++ 62 files changed, 578 insertions(+), 1 deletion(-) create mode 100644 dev-assets/doodads/crusher/Makefile create mode 100644 dev-assets/doodads/crusher/angry.png create mode 100644 dev-assets/doodads/crusher/crusher.js create mode 100644 dev-assets/doodads/crusher/ouch.png create mode 100644 dev-assets/doodads/crusher/peek-left.png create mode 100644 dev-assets/doodads/crusher/peek-right.png create mode 100644 dev-assets/doodads/crusher/sleep.png create mode 100644 dev-assets/doodads/gems/Makefile create mode 100644 dev-assets/doodads/gems/blue-1.png create mode 100644 dev-assets/doodads/gems/blue-2.png create mode 100644 dev-assets/doodads/gems/blue-3.png create mode 100644 dev-assets/doodads/gems/blue-4.png create mode 100644 dev-assets/doodads/gems/gemstone.js create mode 100644 dev-assets/doodads/gems/green-1.png create mode 100644 dev-assets/doodads/gems/green-2.png create mode 100644 dev-assets/doodads/gems/green-3.png create mode 100644 dev-assets/doodads/gems/green-4.png create mode 100644 dev-assets/doodads/gems/red-1.png create mode 100644 dev-assets/doodads/gems/red-2.png create mode 100644 dev-assets/doodads/gems/red-3.png create mode 100644 dev-assets/doodads/gems/red-4.png create mode 100644 dev-assets/doodads/gems/totem-blue-0.png create mode 100644 dev-assets/doodads/gems/totem-blue-1.png create mode 100644 dev-assets/doodads/gems/totem-blue-2.png create mode 100644 dev-assets/doodads/gems/totem-blue-3.png create mode 100644 dev-assets/doodads/gems/totem-blue-4.png create mode 100644 dev-assets/doodads/gems/totem-green-0.png create mode 100644 dev-assets/doodads/gems/totem-green-1.png create mode 100644 dev-assets/doodads/gems/totem-green-2.png create mode 100644 dev-assets/doodads/gems/totem-green-3.png create mode 100644 dev-assets/doodads/gems/totem-green-4.png create mode 100644 dev-assets/doodads/gems/totem-red-0.png create mode 100644 dev-assets/doodads/gems/totem-red-1.png create mode 100644 dev-assets/doodads/gems/totem-red-2.png create mode 100644 dev-assets/doodads/gems/totem-red-3.png create mode 100644 dev-assets/doodads/gems/totem-red-4.png create mode 100644 dev-assets/doodads/gems/totem-yellow-0.png create mode 100644 dev-assets/doodads/gems/totem-yellow-1.png create mode 100644 dev-assets/doodads/gems/totem-yellow-2.png create mode 100644 dev-assets/doodads/gems/totem-yellow-3.png create mode 100644 dev-assets/doodads/gems/totem-yellow-4.png create mode 100644 dev-assets/doodads/gems/totem.js create mode 100644 dev-assets/doodads/gems/yellow-1.png create mode 100644 dev-assets/doodads/gems/yellow-2.png create mode 100644 dev-assets/doodads/gems/yellow-3.png create mode 100644 dev-assets/doodads/gems/yellow-4.png create mode 100644 dev-assets/doodads/snake/Makefile create mode 100644 dev-assets/doodads/snake/attack-left-1.png create mode 100644 dev-assets/doodads/snake/attack-left-2.png create mode 100644 dev-assets/doodads/snake/attack-left-3.png create mode 100644 dev-assets/doodads/snake/attack-right-1.png create mode 100644 dev-assets/doodads/snake/attack-right-2.png create mode 100644 dev-assets/doodads/snake/attack-right-3.png create mode 100644 dev-assets/doodads/snake/left-1.png create mode 100644 dev-assets/doodads/snake/left-2.png create mode 100644 dev-assets/doodads/snake/left-3.png create mode 100644 dev-assets/doodads/snake/right-1.png create mode 100644 dev-assets/doodads/snake/right-2.png create mode 100644 dev-assets/doodads/snake/right-3.png create mode 100644 dev-assets/doodads/snake/snake.js diff --git a/dev-assets/doodads/box/box.js b/dev-assets/doodads/box/box.js index cd96a6e..b78c83d 100644 --- a/dev-assets/doodads/box/box.js +++ b/dev-assets/doodads/box/box.js @@ -19,7 +19,15 @@ function main() { let overlap = e.Overlap; if (overlap.Y === 0 && !(overlap.X === 0 && overlap.W < 5) && !(overlap.X === size)) { - // Standing on top, ignore. + // Be sure to position them snug on top. + // TODO: this might be a nice general solution in the + // collision detector... + console.log("new box code"); + e.Actor.MoveTo(Point( + e.Actor.Position().X, + Self.Position().Y - e.Actor.Hitbox().Y - e.Actor.Hitbox().H - 2, + )) + e.Actor.SetGrounded(true); return false; } else if (overlap.Y === size) { // From the bottom, boop it up. diff --git a/dev-assets/doodads/build.sh b/dev-assets/doodads/build.sh index 6bc41eb..a668a3e 100755 --- a/dev-assets/doodads/build.sh +++ b/dev-assets/doodads/build.sh @@ -34,6 +34,10 @@ doors() { cd doors/ make cd .. + + cd gems/ + make + cd .. } trapdoors() { @@ -84,6 +88,16 @@ warpdoor() { cd .. } +creatures() { + cd snake/ + make + cd .. + + cd crusher/ + make + cd .. +} + boy buttons switches @@ -94,6 +108,7 @@ mobs objects onoff warpdoor +creatures doodad edit-doodad -quiet -lock -author "Noah" ../../assets/doodads/*.doodad doodad edit-doodad ../../assets/doodads/azu-blu.doodad doodad edit-doodad -hide ../../assets/doodads/boy.doodad diff --git a/dev-assets/doodads/crusher/Makefile b/dev-assets/doodads/crusher/Makefile new file mode 100644 index 0000000..abbac86 --- /dev/null +++ b/dev-assets/doodads/crusher/Makefile @@ -0,0 +1,14 @@ +ALL: build + +.PHONY: build +build: + doodad convert -t "Crusher" sleep.png peek-left.png peek-right.png \ + angry.png ouch.png crusher.doodad + doodad install-script crusher.js crusher.doodad + + # Tag the category for these doodads + for i in *.doodad; do\ + doodad edit-doodad --tag "category=creatures" $${i};\ + done + + cp *.doodad ../../../assets/doodads/ \ No newline at end of file diff --git a/dev-assets/doodads/crusher/angry.png b/dev-assets/doodads/crusher/angry.png new file mode 100644 index 0000000000000000000000000000000000000000..6fdc1598a8a4da58d2a8844e60a2bd168c0de973 GIT binary patch literal 2405 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 { + // The bottom is deadly if falling. + if (state === states.falling || state === states.hit && e.Settled) { + if (e.Actor.IsMobile() && e.InHitbox && !e.Actor.Invulnerable()) { + if (e.Overlap.H > 72) { + if (e.Actor.IsPlayer()) { + FailLevel("Don't get crushed!"); + return; + } else { + e.Actor.Destroy(); + } + } + } + } + + // Our top edge is always solid. + if (e.Actor.IsPlayer() && e.InHitbox) { + if (e.Overlap.Y < helmetThickness) { + // Be sure to position them snug on top. + // TODO: this might be a nice general solution in the + // collision detector... + e.Actor.MoveTo(Point( + e.Actor.Position().X, + Self.Position().Y - e.Actor.Hitbox().Y - e.Actor.Hitbox().H, + )) + e.Actor.SetGrounded(true); + } + } + + // The whole hitbox is ordinarily solid. + if (state !== state.falling) { + if (e.Actor.IsMobile() && e.InHitbox) { + return false; + } + } + }); + + setInterval(() => { + // Find the player. + let player = Actors.FindPlayer(), + playerPoint = player.Position(), + point = Self.Position(), + delta = 0, + nearby = false, + below = false; + + // Face the player. + if (playerPoint.X < point.X + (size.W / 2)) { + direction = "left"; + delta = Math.abs(playerPoint.X - (point.X + (size.W/2))); + } + else if (playerPoint.X > point.X + (size.W / 2)) { + direction = "right"; + delta = Math.abs(playerPoint.X - (point.X + (size.W/2))); + } + + if (delta < watchRadius) { + nearby = true; + } + if (delta < fallRadius) { + // Check if the player is below us. + if (playerPoint.Y > point.Y + size.H) { + below = true; + } + } + + switch (state) { + case states.idle: + if (nearby) { + Self.ShowLayerNamed("peek-"+direction); + } else { + Self.ShowLayerNamed("sleep"); + } + + if (below) { + state = states.falling; + } else if (nearby) { + state = states.peeking; + } + + break; + case states.peeking: + if (nearby) { + Self.ShowLayerNamed("peek-"+direction); + } else { + state = states.idle; + break; + } + + if (below) { + state = states.falling; + } + + break; + case states.falling: + Self.ShowLayerNamed("angry"); + Self.SetVelocity(Vector(0.0, dropSpeed)); + + // Landed? + if (point.Y === lastAltitude) { + Sound.Play("crumbly-break.wav") + state = states.hit; + Self.PlayAnimation("hit", () => { + state = states.rising; + }); + } + break; + case states.hit: + // A transitory state while the hit animation + // plays out. + break; + case states.rising: + Self.ShowLayerNamed("sleep"); + Self.SetVelocity(Vector(0, -riseSpeed)); + + point = Self.Position(); + if (point.Y <= targetAltitude.Y+4 || point.Y === lastAltitude.Y) { + Self.MoveTo(targetAltitude); + Self.SetVelocity(Vector(0, 0)) + state = states.idle; + } + } + + lastAltitude = point.Y; + }, 100); +} + +// If under control of the player character. +function player() { + Events.OnKeypress((ev) => { + if (ev.Right) { + direction = "right"; + } else if (ev.Left) { + direction = "left"; + } + + // Jump! + if (ev.Down) { + Self.ShowLayerNamed("angry"); + return; + } else if (ev.Right && ev.Left) { + Self.ShowLayerNamed("ouch"); + } else if (ev.Right || ev.Left) { + Self.ShowLayerNamed("peek-"+direction); + } else { + Self.ShowLayerNamed("sleep"); + } + }); +} diff --git a/dev-assets/doodads/crusher/ouch.png b/dev-assets/doodads/crusher/ouch.png new file mode 100644 index 0000000000000000000000000000000000000000..c982e6e66bddf89ccade54e9637e7b9d168de1ef GIT binary patch literal 2253 zcmV;;2r~DHP)EX>4Tx04R}tkv&MmKpe$iKSYs=gB3(YGE^rEqN0vkg(6f4wL+^7CYOFelZGV4 z#ZhoAIQX$xb#QUk)xlK|1V2C=otzY1q{ROvg%&X$9QWhhy~o`kex4aNQptJZFtLztVY!7_!BB}Oi6e@tQNBOz zvch?bvs$XK#y$B9Ls@NQnd>wM5yv8yAVPqQ3W_MfLX=jG6cb6>k9qj}9luB}nOsFM zax9<>6_Voz|AXJ%nz@N_Hz^bY+Foq?V;E@P1?pAX{yw(t`Uwzt2ClTGzgz=mK1r`O zwa5|By$xJkH#K<=xZDByo^;8O94SE4pUVO7XY@@Opyw9oTyuMC?BnzSNKsdb8{ps& z7|B!iy2raaT6_EVOryUa#c*=S+P_|M00006VoOIv0RI600RN!9r;`8x010qNS#tmY z3ljhU3ljkVnw%H_000McNliru<^=%+05vTy*3|$202y>eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{00yN=L_t(|+U;DwYa2@t9$l_`wOp7KuP|x?!Ij{e`~@}v zW0x*mIFMH0O1KKD%oFJXagoBLk}(9o`W0yes*J#mIIs)j!mgDr=v60H>;1hmduL}p z2t?<**>C5Ynf-Aq0WcU0JzA=ZMNuq54UWg-7KSa+P7EJPUf8|@0LXPW_j*0=28P2S ziY=9$5I!k*Vf!k_NVCVsN5G2a%9hHG*bV?dS(flmp2N@6)8(~?uU}X0E6b9cSB$^B z1u;FW!v6mL%ICAQvmjfd9npp?1^~dj!^0I(Qt^thqeJHVz?*&_Z2(i*sv_D1Q49cB z5o7Jc2WYq3weZ65mzN+PZ*Sq<;US7BZ~A={Tei%oiUM;j9Zf)1r!!KEp>w<|j}*d1WeC>Hr70O>QLW%pH0cKbx8bss?Li+Fn$;rOITgwN}kFIDyOH6!ph06nC46eu=xk_(dR zHEa_XZ?-BB;~VsnMKPVNY+S&9@Y0b}i1CufkjAY;d~2~N#?fRGjwYMvq-~t2#*f(k zxbPwy)J5V{!lZ)CpRz9*ma;CTDn=OjIUOg}^_VuXobT#GvW4ME_e$#w`C4_as~D!) zjIQHHlg;3Ee7MG#MX3bEqR!$_S)X5&vtjAbAGNBK_#fkA*P9iE<40F zMRCOJaNS0cIfP_Kt%9hW5}FC32&!mx8O$plE?MI{yF{P%VnHldThr;%2`AkvrPD$N zW0$G7s+?8rcRHPAnUXonS!sI7wfFiHbl0~RwFzP(r>o04AxvV}91%0Xi+n^;OyXm| zT|}Q{=>|BTwTErYh#g2>?3?(i+E!f)8An=}V(5s8ox@yMr8p=db2kM7hA8N}y*e={ zR=6%vin-%(G}(lmzx$+vdrlpp)LRXzDJVsz*s=o)Ic9`50hFA?0h}s3|MO%2 zd$CWngo;73FvMQOr2ytPsT!9dzG8@3QPeifPk1Lrha%Q)H-)(ol~TRc2y}q3Z{>_!(tM zP^|^(9>6izK;rw5*mpF^N>KkjedJOEr}}6`NyywaA$9uOpZuIyO>G z(J$N89ddJR-{;;&9F&W3BGmv}=erJHQ8G#*wz{h-Bev&4R@1i4#*j8gcgIm&lP(N} zs8|31n6gUllt@8QEmIG-ZZ00000NkvXXu0mjf!a*@p literal 0 HcmV?d00001 diff --git a/dev-assets/doodads/crusher/peek-left.png b/dev-assets/doodads/crusher/peek-left.png new file mode 100644 index 0000000000000000000000000000000000000000..b2327baf8156aa4567b25cb001323b3a578e8a6e GIT binary patch literal 2219 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 mKp+qZ1OkCTAP@)yM*Ih)gr{Mj;@Bzx0000 literal 0 HcmV?d00001 diff --git a/dev-assets/doodads/crusher/sleep.png b/dev-assets/doodads/crusher/sleep.png new file mode 100644 index 0000000000000000000000000000000000000000..796f656c8c522c8918bb8ef5eb32648f0567a40a GIT binary patch literal 2106 zcmV-A2*vk_P)EX>4Tx04R}tkv&MmKpe$iKSYs=gB3(YGE^rEqN0vkg(6f4wL+^7CYOFelZGV4 z#ZhoAIQX$xb#QUk)xlK|1V2C=otzY1q{ROvg%&X$9QWhhy~o`kex4aNQptJZFtLztVY!7_!BB}Oi6e@tQNBOz zvch?bvs$XK#y$B9Ls@NQnd>wM5yv8yAVPqQ3W_MfLX=jG6cb6>k9qj}9luB}nOsFM zax9<>6_Voz|AXJ%nz@N_Hz^bY+Foq?V;E@P1?pAX{yw(t`Uwzt2ClTGzgz=mK1r`O zwa5|By$xJkH#K<=xZDByo^;8O94SE4pUVO7XY@@Opyw9oTyuMC?BnzSNKsdb8{ps& z7|B!iy2raaT6_EVOryUa#c*=S+P_|M00006VoOIv0RI600RN!9r;`8x010qNS#tmY z3ljhU3ljkVnw%H_000McNliru<^=%*H3Bm1r|AFy02y>eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{00t6CL_t(|+U;DwYg9oHo;$a*ekp=wIvcBlYy1y_Af!x@ zB7*IKRY)aQ1rIyH6c)kiKoENin}bwo(mjYput@5&le6(1o6Y{3-I?8YaXtu`yZ2_l zoo{A$_D2K|2n22nY#)xt<5jA`#bPm_u%+9{;ls&`+E)Mo%JuMMGC?;mo6SgU+3ck7 zDZz`{SBfIdZf|daDw;c6HamJd003>yJGEjzCqf1w5Oy==q& z{{Efc&(6-0Z0UA%8>Scl0M8E(?}$>0SB@PQhS(RL9vzWQU^ZJ_MEjtN0RVTz*n0H} znx?73i^5+hL0n`TXS*cZgNGa{#6h4rl&2JtY@|Qsj`o zvIV)EPS?h-mP@#tPO}JKPNyVxs6oXm)n7wwBLD!u-@hjrU#aYLxLPjZYPrl7rQ_AM z?fNHG6tkZpTMAoYnM%i!wUwfM02MD+g{Au|#y)x-l0w?G2uj7y&JKJ%IDi+QKCLsO z!{g7NqsvcfUKGKmxXGGzJC`U}F(`Ra3aeauEaUNbHJMCE7CW5L_x0dFCtjQrR@kO# zU^bgs_p!*fPD+4dc!&xAxZm27vYNDcst&&CZmKnbg@L zJ5z{_nbc#PP}>n^cJu+mn$9RKhRgA>JW2?cl_6A>OJ6c3#4(0j?mVJ6Bhl4?@z&nG zXyX(6cS}icjuUpxn$UE=Z|k*gh`aLZd*A zZ^(x%j&ioM@dduaLxUiec-Z>-*S_hd5#9 z4-Ss0yi}=Z^L3x$ z$=jk850w)+MDZ;U=hw$@{_7jc$GtwnrH*EiuqSU&N`ImH+11Rkb;!)ODIZoxgJ&S`8`5#T+KHNu2V?7bOT)$(t*R zIhp#-$GOGuiL&?PEsVBzQR_MK-QH02c3TiWQDVzevn}k<5ef`!nM{$nDp!CMLR{+s z>`5M$M~Mnf#Hg(CIDh5EI?f06Om$Ce)b{u+>Ay_f= ztf+PO%5{&o23S|>F%B-#`B)w~nM|=tM+uTLRAJ^5u3-&hH@AI?4DZD{gj$Fi!;ikV zmeXc*hWJWeY-DiH6Vmr0Nmw{Q4O5 z$vw7Y#FFM-WydTUb?27~qF&w0sk5>69<}O}n;i!nBWhmUU96uCh2*?!Jk=)-C~7lp!aP&}3*EMndm}Y+~BVX>)#k zoW-^1!cdEf6##%QtISS?-qW8qzqdIkWJ7P$XHWmmi27h3*#t3(cZAK~JF+Hek4@KS ztHATCkgW(C_W~i*mi~E6AK5Y5-d*X(ljiRNfj}S-2m}IwKp+qZ1OkCTAP@)y0)apv k5C{YUfj}S-2n1IA1wrNm81poj5 literal 0 HcmV?d00001 diff --git a/dev-assets/doodads/gems/Makefile b/dev-assets/doodads/gems/Makefile new file mode 100644 index 0000000..f9e5d87 --- /dev/null +++ b/dev-assets/doodads/gems/Makefile @@ -0,0 +1,58 @@ +ALL: build + +.PHONY: build +build: + ### + # Gemstones + ### + + doodad convert -t "Gemstone (Green)" green-1.png green-2.png green-3.png green-4.png \ + gem-green.doodad + doodad install-script gemstone.js gem-green.doodad + doodad edit-doodad --tag "color=green" gem-green.doodad + + doodad convert -t "Gemstone (Red)" red-1.png red-2.png red-3.png red-4.png \ + gem-red.doodad + doodad install-script gemstone.js gem-red.doodad + doodad edit-doodad --tag "color=red" gem-red.doodad + + doodad convert -t "Gemstone (Blue)" blue-1.png blue-2.png blue-3.png blue-4.png \ + gem-blue.doodad + doodad install-script gemstone.js gem-blue.doodad + doodad edit-doodad --tag "color=blue" gem-blue.doodad + + doodad convert -t "Gemstone (Yellow)" yellow-1.png yellow-2.png yellow-3.png yellow-4.png \ + gem-yellow.doodad + doodad install-script gemstone.js gem-yellow.doodad + doodad edit-doodad --tag "color=yellow" gem-yellow.doodad + + ### + # Totems + ### + + doodad convert -t "Gemstone Totem (Green)" totem-green-1.png totem-green-2.png totem-green-3.png \ + totem-green-4.png totem-green-0.png gem-totem-green.doodad + doodad install-script totem.js gem-totem-green.doodad + doodad edit-doodad --tag "color=green" gem-totem-green.doodad + + doodad convert -t "Gemstone Totem (Yellow)" totem-yellow-1.png totem-yellow-2.png totem-yellow-3.png \ + totem-yellow-4.png totem-yellow-0.png gem-totem-yellow.doodad + doodad install-script totem.js gem-totem-yellow.doodad + doodad edit-doodad --tag "color=yellow" gem-totem-yellow.doodad + + doodad convert -t "Gemstone Totem (Blue)" totem-blue-1.png totem-blue-2.png totem-blue-3.png \ + totem-blue-4.png totem-blue-0.png gem-totem-blue.doodad + doodad install-script totem.js gem-totem-blue.doodad + doodad edit-doodad --tag "color=blue" gem-totem-blue.doodad + + doodad convert -t "Gemstone Totem (Red)" totem-red-1.png totem-red-2.png totem-red-3.png \ + totem-red-4.png totem-red-0.png gem-totem-red.doodad + doodad install-script totem.js gem-totem-red.doodad + doodad edit-doodad --tag "color=red" gem-totem-red.doodad + + # Tag the category for these doodads + for i in *.doodad; do\ + doodad edit-doodad --tag "category=doors" $${i};\ + done + + cp *.doodad ../../../assets/doodads/ \ No newline at end of file diff --git a/dev-assets/doodads/gems/blue-1.png b/dev-assets/doodads/gems/blue-1.png new file mode 100644 index 0000000000000000000000000000000000000000..c74d062370aa0836bf0357c5c1c1480712fc5131 GIT binary patch literal 891 zcmV->1BCpEP)EX>4Tx04R}tkv&MmKpe$iKSYs=gB3(YGE^rEqN0vkg(6f4wL+^7CYOFelZGV4 z#ZhoAIQX$xb#QUk)xlK|1V2C=otzY1q{ROvg%&X$9QWhhy~o`kex4aNQptJZFtLztVY!7_!BB}Oi6e@tQNBOz zvch?bvs$XK#y$B9Ls@NQnd>wM5yv8yAVPqQ3W_MfLX=jG6cb6>k9qj}9luB}nOsFM zax9<>6_Voz|AXJ%nz@N_Hz^bY+Foq?V;E@P1?pAX{yw(t`Uwzt2ClTGzgz=mK1r`O zwa5|By$xJkH#K<=xZDByo^;8O94SE4pUVO7XY@@Opyw9oTyuMC?BnzSNKsdb8{ps& z7|B!iy2raaT6_EVOryUa#c*=S+P_|M00006VoOIv0RI600RN!9r;`8x010qNS#tmY z3ljhU3ljkVnw%H_000McNliru<^=&0Hz>zPugw4e02y>eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{00C1;L_t(I%Z=2(OT$1E!0~Uc1)&)%#kzIwk5OHuP!5-_ zrMPz}63Axz7r2Ovb}L8``~&h2xCOyMq>j~qLqKpWT^x!?Tuh1aF1feeare1*?;QsQ zv324`ChLR=WbN0DK#>Pk+8rOD((d?qpfG{r$ODBAstq0AZZsM6djJgjJ?uu4+R)L0 zLI(jHx9R{y^MK@72Z}ssG9Jm(%PW5}9?3jVsA`mk090VQh9VDgS7qt0%F?rpJThi{QZtGdHsw;N8zBe}hI5Sl;$h4@q*cz1CwizPeEg8(eu%U4}F z3j!#nvGr_fEg=GY@3(7lv9lm0rUFeMEtUq84bVZ#n(6+tXdaLS8Hedl`vYo=2F?## R!$JT6002ovPDHLkV1iF7eXali literal 0 HcmV?d00001 diff --git a/dev-assets/doodads/gems/blue-2.png b/dev-assets/doodads/gems/blue-2.png new file mode 100644 index 0000000000000000000000000000000000000000..2760b457e60ead1238b460be8b7dd2dbbf434077 GIT binary patch literal 927 zcmV;Q17Q4#P)EX>4Tx04R}tkv&MmKpe$iKSYs=gB3(YGE^rEqN0vkg(6f4wL+^7CYOFelZGV4 z#ZhoAIQX$xb#QUk)xlK|1V2C=otzY1q{ROvg%&X$9QWhhy~o`kex4aNQptJZFtLztVY!7_!BB}Oi6e@tQNBOz zvch?bvs$XK#y$B9Ls@NQnd>wM5yv8yAVPqQ3W_MfLX=jG6cb6>k9qj}9luB}nOsFM zax9<>6_Voz|AXJ%nz@N_Hz^bY+Foq?V;E@P1?pAX{yw(t`Uwzt2ClTGzgz=mK1r`O zwa5|By$xJkH#K<=xZDByo^;8O94SE4pUVO7XY@@Opyw9oTyuMC?BnzSNKsdb8{ps& z7|B!iy2raaT6_EVOryUa#c*=S+P_|M00006VoOIv0RI600RN!9r;`8x010qNS#tmY z3ljhU3ljkVnw%H_000McNliru<^=&0H!oQuI&J^}02y>eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{00DPNL_t(I%Z-#VYr;SnhTlsAN?pXUAap3Cb?s1!Ah-Dk zoVtn#*`kYUe?a0E2qDlP;BRPyAQZ$x7u#%-(5(a!3T7zRpx zc70O{R79ZXi#uwVmLD(Xl-KoI8Vu7q0xD&o$a7MFVOoCVIkeZ(kj)(_tPFHE+3jDh zUf3Br>N4TPF&1@Z{AOJYy6TffE$K`kYbl>f6 zc4u5rP0f&BGGcCQ~5w5CFK@d5`jI)uLmOxHgFZ)@XMQ z)NtR5K&1ygacz?AdJ(A5vs3pOTLmZsNr&uB`v=4~9qP1GT9^O;002ovPDHLkV1fZa BlVJb= literal 0 HcmV?d00001 diff --git a/dev-assets/doodads/gems/blue-3.png b/dev-assets/doodads/gems/blue-3.png new file mode 100644 index 0000000000000000000000000000000000000000..b40177c9c839ab166e279cbad46c6a7885111fc7 GIT binary patch literal 903 zcmV;219<$2P)EX>4Tx04R}tkv&MmKpe$iKSYs=gB3(YGE^rEqN0vkg(6f4wL+^7CYOFelZGV4 z#ZhoAIQX$xb#QUk)xlK|1V2C=otzY1q{ROvg%&X$9QWhhy~o`kex4aNQptJZFtLztVY!7_!BB}Oi6e@tQNBOz zvch?bvs$XK#y$B9Ls@NQnd>wM5yv8yAVPqQ3W_MfLX=jG6cb6>k9qj}9luB}nOsFM zax9<>6_Voz|AXJ%nz@N_Hz^bY+Foq?V;E@P1?pAX{yw(t`Uwzt2ClTGzgz=mK1r`O zwa5|By$xJkH#K<=xZDByo^;8O94SE4pUVO7XY@@Opyw9oTyuMC?BnzSNKsdb8{ps& z7|B!iy2raaT6_EVOryUa#c*=S+P_|M00006VoOIv0RI600RN!9r;`8x010qNS#tmY z3ljhU3ljkVnw%H_000McNliru<^=&0H#1ElW+4Co02y>eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{00Cb~L_t(I%Z=1MOT$1I2k`%$gNRG%C`7wR)wP32p&Ty# z0)7I61iG1i0&&)Cfl>;(m!e-ljz9*HI<^fifvVsVx&#a;ak_9dFL%#)x%~3HTn^BP z&5K^DvybXPq}9{{sR}YoivxgRT3iKE9Y}-bO{mX zNRD(Gps3vOEI_=NBl0~~^iGypz1`seuzhd{09cL&%rGtfv~$ed+KP{7!P>g`$o=FY z%Zvg*GIUAgd$|USrt3gi&;AcVF3suNtlsYM$oDEC0N9YR-`AI`n9#eEZZ{NbA4Vhm zdYmYs!b6)3T_TQvD37$7P(h`?lMIUStDsz&MI~?T?uFk!aU*zp538Wu0IKe@bQ+)v d(hl95_798m_{+Sgn}+}Z002ovPDHLkV1lHqiiQ9H literal 0 HcmV?d00001 diff --git a/dev-assets/doodads/gems/blue-4.png b/dev-assets/doodads/gems/blue-4.png new file mode 100644 index 0000000000000000000000000000000000000000..63f8480eb5ef9446bc405743753925267d7fd656 GIT binary patch literal 835 zcmV-J1HAl+P)EX>4Tx04R}tkv&MmKpe$iKSYs=gB3(YGE^rEqN0vkg(6f4wL+^7CYOFelZGV4 z#ZhoAIQX$xb#QUk)xlK|1V2C=otzY1q{ROvg%&X$9QWhhy~o`kex4aNQptJZFtLztVY!7_!BB}Oi6e@tQNBOz zvch?bvs$XK#y$B9Ls@NQnd>wM5yv8yAVPqQ3W_MfLX=jG6cb6>k9qj}9luB}nOsFM zax9<>6_Voz|AXJ%nz@N_Hz^bY+Foq?V;E@P1?pAX{yw(t`Uwzt2ClTGzgz=mK1r`O zwa5|By$xJkH#K<=xZDByo^;8O94SE4pUVO7XY@@Opyw9oTyuMC?BnzSNKsdb8{ps& z7|B!iy2raaT6_EVOryUa#c*=S+P_|M00006VoOIv0RI600RN!9r;`8x010qNS#tmY z3ljhU3ljkVnw%H_000McNliru<^=&0H#bU8qBsBm02y>eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{00A3GL_t(I%bnD*io-Ar08q&s^q^bz%xSyc7zqA|{y{hb zw>4S%6K%M~G?;u#O`&5xAanK`I@OaqIk-J17S$;17hx#^AjIPP$575O3WQ$?31lHC zN;3rj5T%(4fh+_qSL-ns0$B*!Zjv#-T&*F_i%F1CAk+2WRyYN+5L8zskJ3yHZNu%k z?IwZU;rI_k3S_Gq+J^5AN96)_RdOu_ju-{9F$bcZBR5RfgAZ~)9_Pi_#Srw=O}9edr4R%F@bQXiDR2NVZpZ9n z&q0&Fla>POs^n9h^g*OOw!huapQm55zunKFt%1~iX1X5Us_5NK`vCqw#K-`)`<(y) N002ovPDHLkV1lxoW0n8_ literal 0 HcmV?d00001 diff --git a/dev-assets/doodads/gems/gemstone.js b/dev-assets/doodads/gems/gemstone.js new file mode 100644 index 0000000..efb9361 --- /dev/null +++ b/dev-assets/doodads/gems/gemstone.js @@ -0,0 +1,24 @@ +// Gem stone collectibles/keys. + +const color = Self.GetTag("color"), + shimmerFreq = 1000; + +function main() { + Self.SetMobile(true); + Self.SetGravity(true); + + Self.AddAnimation("shimmer", 100, [0, 1, 2, 3, 0]); + Events.OnCollide((e) => { + if (e.Settled) { + if (e.Actor.HasInventory()) { + Sound.Play("item-get.wav") + e.Actor.AddItem(Self.Filename, 1); + Self.Destroy(); + } + } + }); + + setInterval(() => { + Self.PlayAnimation("shimmer", null); + }, shimmerFreq); +} \ No newline at end of file diff --git a/dev-assets/doodads/gems/green-1.png b/dev-assets/doodads/gems/green-1.png new file mode 100644 index 0000000000000000000000000000000000000000..ff76d09267ed6f95dd83d3db8518f317eea65e9c GIT binary patch literal 785 zcmV+s1Md8ZP)EX>4Tx04R}tkv&MmKpe$iKSYs=gB3(YGE^rEqN0vkg(6f4wL+^7CYOFelZGV4 z#ZhoAIQX$xb#QUk)xlK|1V2C=otzY1q{ROvg%&X$9QWhhy~o`kex4aNQptJZFtLztVY!7_!BB}Oi6e@tQNBOz zvch?bvs$XK#y$B9Ls@NQnd>wM5yv8yAVPqQ3W_MfLX=jG6cb6>k9qj}9luB}nOsFM zax9<>6_Voz|AXJ%nz@N_Hz^bY+Foq?V;E@P1?pAX{yw(t`Uwzt2ClTGzgz=mK1r`O zwa5|By$xJkH#K<=xZDByo^;8O94SE4pUVO7XY@@Opyw9oTyuMC?BnzSNKsdb8{ps& z7|B!iy2raaT6_EVOryUa#c*=S+P_|M00006VoOIv0RI600RN!9r;`8x010qNS#tmY z3ljhU3ljkVnw%H_000McNliru<^=&0Hvxt9H=zIk02y>eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{008MpL_t(I%dM0x4#GeXMqisAf*-%CCqUsUk-bC}fm1+G zy#Ru6090KS23xh&1#VFU86ewb%aVR(vzgtO`DQW`kkT@cA^^satuyWWxjd8rRM$#z zgAksee3PqRA@!xEzSJ*}BofJkWS;1J`8!aQ?cRDm$pS1~a z!NYGLIX~;uCo4=cTAcP?9S*+*d_hiFpBmi^2eUOM?0evC^WV>d*fi@U_ed^NHSJim z71;&uOn^Be{woM5%0jv3(yXgwR9!0-Pht%akkXp_%+(N^b=haZkel`atzdKSNn9M= P00000NkvXXu0mjf$x2Ac literal 0 HcmV?d00001 diff --git a/dev-assets/doodads/gems/green-2.png b/dev-assets/doodads/gems/green-2.png new file mode 100644 index 0000000000000000000000000000000000000000..996d565ad208a4be8ca1c89fe38adb3fa405f42c GIT binary patch literal 807 zcmV+?1K9kDP)EX>4Tx04R}tkv&MmKpe$iKSYs=gB3(YGE^rEqN0vkg(6f4wL+^7CYOFelZGV4 z#ZhoAIQX$xb#QUk)xlK|1V2C=otzY1q{ROvg%&X$9QWhhy~o`kex4aNQptJZFtLztVY!7_!BB}Oi6e@tQNBOz zvch?bvs$XK#y$B9Ls@NQnd>wM5yv8yAVPqQ3W_MfLX=jG6cb6>k9qj}9luB}nOsFM zax9<>6_Voz|AXJ%nz@N_Hz^bY+Foq?V;E@P1?pAX{yw(t`Uwzt2ClTGzgz=mK1r`O zwa5|By$xJkH#K<=xZDByo^;8O94SE4pUVO7XY@@Opyw9oTyuMC?BnzSNKsdb8{ps& z7|B!iy2raaT6_EVOryUa#c*=S+P_|M00006VoOIv0RI600RN!9r;`8x010qNS#tmY z3ljhU3ljkVnw%H_000McNliru<^=&0HwSE%l9T`d02y>eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{0093zF~|;zJ22b= zWG{fKW>D*@Fj!QoOSuIYQkKx9?M%PQB%8PYr%eK+cwr<(0Dvi=5~Y2G@gjDvWrvJV ze_$$6nhPcy=mM0tvKgCwoHIpc(oD!roO5S1wfP!|T#M(`me!Y(_Qu;~WD;=B2z_yU zAom9lI>aTA6m_t%YM&n lfIMUw%jo{N6KVq+NpC0MeLTo?H%tHk002ovPDHLkV1iyeRK@@R literal 0 HcmV?d00001 diff --git a/dev-assets/doodads/gems/green-3.png b/dev-assets/doodads/gems/green-3.png new file mode 100644 index 0000000000000000000000000000000000000000..8449974524299c5dd7e63556fb7bbdccab51a963 GIT binary patch literal 864 zcmV-m1E2hfP)EX>4Tx04R}tkv&MmKpe$iKSYs=gB3(YGE^rEqN0vkg(6f4wL+^7CYOFelZGV4 z#ZhoAIQX$xb#QUk)xlK|1V2C=otzY1q{ROvg%&X$9QWhhy~o`kex4aNQptJZFtLztVY!7_!BB}Oi6e@tQNBOz zvch?bvs$XK#y$B9Ls@NQnd>wM5yv8yAVPqQ3W_MfLX=jG6cb6>k9qj}9luB}nOsFM zax9<>6_Voz|AXJ%nz@N_Hz^bY+Foq?V;E@P1?pAX{yw(t`Uwzt2ClTGzgz=mK1r`O zwa5|By$xJkH#K<=xZDByo^;8O94SE4pUVO7XY@@Opyw9oTyuMC?BnzSNKsdb8{ps& z7|B!iy2raaT6_EVOryUa#c*=S+P_|M00006VoOIv0RI600RN!9r;`8x010qNS#tmY z3ljhU3ljkVnw%H_000McNliru<^=&0Hw$GT-oF3<02y>eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{00B5jL_t(I%dM2LYQj(yhCf3F7k6vum^0l?dFrYvt;>7H5ko3{l9Zr}tNTjc>pK=1W^mX5!~olbQIr zbC7=@`wzNV=F6n_*yH8v&ARKl0R%fc?+Bp!u1;t3u?d12VWFr4IjK>|i>3jDB5Ir1 z&hAd9t<$(^Lj8W9N~-^N=7U2#}(0000EX>4Tx04R}tkv&MmKpe$iKSYs=gB3(YGE^rEqN0vkg(6f4wL+^7CYOFelZGV4 z#ZhoAIQX$xb#QUk)xlK|1V2C=otzY1q{ROvg%&X$9QWhhy~o`kex4aNQptJZFtLztVY!7_!BB}Oi6e@tQNBOz zvch?bvs$XK#y$B9Ls@NQnd>wM5yv8yAVPqQ3W_MfLX=jG6cb6>k9qj}9luB}nOsFM zax9<>6_Voz|AXJ%nz@N_Hz^bY+Foq?V;E@P1?pAX{yw(t`Uwzt2ClTGzgz=mK1r`O zwa5|By$xJkH#K<=xZDByo^;8O94SE4pUVO7XY@@Opyw9oTyuMC?BnzSNKsdb8{ps& z7|B!iy2raaT6_EVOryUa#c*=S+P_|M00006VoOIv0RI600RN!9r;`8x010qNS#tmY z3ljhU3ljkVnw%H_000McNliru<^=&0HxTbd7gGQL02y>eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{00A3GL_t(I%dM2ZZiFxl#y=24U!i2ilQ(*gQQe4iOW)=e z)GaS?3(VC`*}7M3o^t!~3b)bW8kDvPe_AXd5gY&T=Qv4FVZcU~0RSEW&e;NhA~l&% z?22DLU28)B1>>BpT!kDE0N$QoXn#K0P%;2qJ}v+N^KOW9w$ckFs4#GOhe#*nKE5># z9u9|DX?||zoQf2rlQH=8dIXm|DciJ$TwFRq8tRiGH9l*4m-;=rH4Xf=|L(72&{5|8 ze6prB#3hewKel8v(w~mG(TGV5!a_2a!qd6Gt+8ljOZ()8cZ6+G)wkVT)96*OzgC)s zj)-Z^|6sb-#3kF+VQ}}E51Nwd@1VPe&^y>h_6Y=9W*s_F!8`x} N002ovPDHLkV1gQ?W*`6n literal 0 HcmV?d00001 diff --git a/dev-assets/doodads/gems/red-1.png b/dev-assets/doodads/gems/red-1.png new file mode 100644 index 0000000000000000000000000000000000000000..9a14ea0a730df2b4bada4beb8807a2377cfd0f49 GIT binary patch literal 711 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 literal 0 HcmV?d00001 diff --git a/dev-assets/doodads/gems/totem-blue-1.png b/dev-assets/doodads/gems/totem-blue-1.png new file mode 100644 index 0000000000000000000000000000000000000000..0f561a3593390c7147d7a9e9a4a074665270d6bc GIT binary patch literal 958 zcmV;v13~EX>4Tx04R}tkv&MmKpe$iKSYs=gB3(YGE^rEqN0vkg(6f4wL+^7CYOFelZGV4 z#ZhoAIQX$xb#QUk)xlK|1V2C=otzY1q{ROvg%&X$9QWhhy~o`kex4aNQptJZFtLztVY!7_!BB}Oi6e@tQNBOz zvch?bvs$XK#y$B9Ls@NQnd>wM5yv8yAVPqQ3W_MfLX=jG6cb6>k9qj}9luB}nOsFM zax9<>6_Voz|AXJ%nz@N_Hz^bY+Foq?V;E@P1?pAX{yw(t`Uwzt2ClTGzgz=mK1r`O zwa5|By$xJkH#K<=xZDByo^;8O94SE4pUVO7XY@@Opyw9oTyuMC?BnzSNKsdb8{ps& z7|B!iy2raaT6_EVOryUa#c*=S+P_|M00006VoOIv0RI600RN!9r;`8x010qNS#tmY z3ljhU3ljkVnw%H_000McNliru<^=&1BsIX{lmh?&02y>eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{00EXsL_t(Y$K}_*O9EjS!11qV4TAm=is7J<+7LCgWZ6=f z|3LqM;GhUC4vwNhL;V?Pv^F~!;;$hDJ6kfc9|+o(T!R^!C*8f0AwApOaeVH%_j#Z9 zeGR*74uu(q#2CTHHT8{wmgddf~O*`I}7V3ypWovqj?_Glo@%Ff56H z%PtoHK95@nmPElph`^E_(7PXC(Pn4UzXO1G+lSF=!ygRlf+am5!1|I60Hsg^V8!0Q z)&ol-;A#4pa5O?PnG%8}tz-Bd1XN)yV=Re)A(NAk$;owHW+QN*8&>VTgLya{N}=|Z zVaVj1~pBYNw6rW zxjCr8gQC$30_ue{vABvQd_ej0o(QPB;SXmF2!TRN+W-cHK;cC^Vd;)d{F!W5M8Wyn gm`%0W{x`>p4+s7lU4F}h%>V!Z07*qoM6N<$f}&ZUeEEX>4Tx04R}tkv&MmKpe$iKSYs=gB3(YGE^rEqN0vkg(6f4wL+^7CYOFelZGV4 z#ZhoAIQX$xb#QUk)xlK|1V2C=otzY1q{ROvg%&X$9QWhhy~o`kex4aNQptJZFtLztVY!7_!BB}Oi6e@tQNBOz zvch?bvs$XK#y$B9Ls@NQnd>wM5yv8yAVPqQ3W_MfLX=jG6cb6>k9qj}9luB}nOsFM zax9<>6_Voz|AXJ%nz@N_Hz^bY+Foq?V;E@P1?pAX{yw(t`Uwzt2ClTGzgz=mK1r`O zwa5|By$xJkH#K<=xZDByo^;8O94SE4pUVO7XY@@Opyw9oTyuMC?BnzSNKsdb8{ps& z7|B!iy2raaT6_EVOryUa#c*=S+P_|M00006VoOIv0RI600RN!9r;`8x010qNS#tmY z3ljhU3ljkVnw%H_000McNliru<^=&1BsjiM=)M2|02y>eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{00G5GL_t(Y$K}^gOTu6r2k@_}i_l&~B6#p%(V-Vmur77j z8|Vcj4B8Mnw8M^Khd?@ZFF~zNL1zPF{ZT|j-MnOEe-K=FN$gO2m^pIK6DiW~_-qfK z{hmL+=b3M9In>9PgTn;ES2#K7Keyk|Y_)Lz@c5@#^XUbz?apK}oi0@E%#9aSJ9F?Y zg_vQE1>BOi0RXFu3rsM_0$x@P(#8UFEE#?eK@_QAjuy1D?CTW(z|4Gr8s=EQqsRs% zMaIR=EqN~z3?LR$Ji#0-czv2B&m~31c{+_qFhJV8z?_#w zD-cAH%okSH5sxPbY=Z!hFBGBf!~g*0x(NVC9j69BPs6M6mg{`&C-$&eJR=$AvKa!} z@e??5A!)odG+%-!BA3mOA$5Y~x;YZ`v}K&|-Pe!`qR0$-E)H%P+l!`LH>p6XGHB0n z&ot084FdKW1{FwM@HO5Vs6xGlfplJ{0-26BC(HseAL1Hs4Q>3fTvu4Z>ARTy>azWB bek(ozRr(FvKt?H-00000NkvXXu0mjf@gA|M literal 0 HcmV?d00001 diff --git a/dev-assets/doodads/gems/totem-blue-3.png b/dev-assets/doodads/gems/totem-blue-3.png new file mode 100644 index 0000000000000000000000000000000000000000..8373a3c0adbd3b0e17fb3ae06920ce8212068c7c GIT binary patch literal 987 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 literal 0 HcmV?d00001 diff --git a/dev-assets/doodads/gems/totem-green-1.png b/dev-assets/doodads/gems/totem-green-1.png new file mode 100644 index 0000000000000000000000000000000000000000..4a2e33fb48665af5dab5a3256cebf6c4c09ac640 GIT binary patch literal 887 zcmV--1Bm>IP)EX>4Tx04R}tkv&MmKpe$iKSYs=gB3(YGE^rEqN0vkg(6f4wL+^7CYOFelZGV4 z#ZhoAIQX$xb#QUk)xlK|1V2C=otzY1q{ROvg%&X$9QWhhy~o`kex4aNQptJZFtLztVY!7_!BB}Oi6e@tQNBOz zvch?bvs$XK#y$B9Ls@NQnd>wM5yv8yAVPqQ3W_MfLX=jG6cb6>k9qj}9luB}nOsFM zax9<>6_Voz|AXJ%nz@N_Hz^bY+Foq?V;E@P1?pAX{yw(t`Uwzt2ClTGzgz=mK1r`O zwa5|By$xJkH#K<=xZDByo^;8O94SE4pUVO7XY@@Opyw9oTyuMC?BnzSNKsdb8{ps& z7|B!iy2raaT6_EVOryUa#c*=S+P_|M00006VoOIv0RI600RN!9r;`8x010qNS#tmY z3ljhU3ljkVnw%H_000McNliru<^=&1Boh+s5&i%G02y>eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{00B=)L_t(Y$7A#`SO3pIXTZcT0D$q*#%cfGeE7=n?A0rV zr_W!~%%acVe=&Ui@|oe?htC7!(*d!R1)E^`(?wLXpi?@II7=BA7#J8N85pwC(@D1E z?3xn{3=9kmC*NLVV0cbq@Mfi_GfbN~lW5Bxp1;rV@cezah2`0~qy;Ywc$>K~Olz1) zvTw^V zPCvfz0I!8q%cn3OhOb&g-@<_!7E--L`gs4{z!ih|5)nz3Qj&0pwiH&n4C-3u?cG;I z$1l#p;mzHb3?j`1p1 zy?Vlz4bX$rPs)yA)3ZZl`1CmgLubuo`ZZUuH8F;K!)#z0+aso10RZMngou|jQ!fAj N002ovPDHLkV1g{7f{6eC literal 0 HcmV?d00001 diff --git a/dev-assets/doodads/gems/totem-green-2.png b/dev-assets/doodads/gems/totem-green-2.png new file mode 100644 index 0000000000000000000000000000000000000000..ae892e6d49c21d7aa6e478192053a1a4a65f413e GIT binary patch literal 938 zcmV;b16BNqP)EX>4Tx04R}tkv&MmKpe$iKSYs=gB3(YGE^rEqN0vkg(6f4wL+^7CYOFelZGV4 z#ZhoAIQX$xb#QUk)xlK|1V2C=otzY1q{ROvg%&X$9QWhhy~o`kex4aNQptJZFtLztVY!7_!BB}Oi6e@tQNBOz zvch?bvs$XK#y$B9Ls@NQnd>wM5yv8yAVPqQ3W_MfLX=jG6cb6>k9qj}9luB}nOsFM zax9<>6_Voz|AXJ%nz@N_Hz^bY+Foq?V;E@P1?pAX{yw(t`Uwzt2ClTGzgz=mK1r`O zwa5|By$xJkH#K<=xZDByo^;8O94SE4pUVO7XY@@Opyw9oTyuMC?BnzSNKsdb8{ps& z7|B!iy2raaT6_EVOryUa#c*=S+P_|M00006VoOIv0RI600RN!9r;`8x010qNS#tmY z3ljhU3ljkVnw%H_000McNliru<^=&1Bo<eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{00DwYL_t(Y$7A#`SO3pIXTZcT0D$q*#%cfGeE7=n?A0rV zr_W!~%%acVe=&Ui@|oe?htC7!(*d!R1)E^`(?wLXpi?@II7=BA7#J8N85q3H-0&JG zZ>WeQq zBjF&84GADUPSJsXfCmEu0|Ud#usDYBRf`y84HU4d<7Q!H=&YH{z`(%3AY~xSz_5nI z)Qc+^aal-l>O}`D!yqZJ^6gjg~8iy45l#qoV@4q7$pMx)W zNda%~zG8TL_Z5bZ$;vXYc%9NPgJg%`vly?XTTku6T6p6sabR(|_~-@(KPfxXErnH2 zxGX|WEa<-Sld@yj^z0BBK7G!BS|6^VadQP*6Jy9X%m${hJz}~Q0Fujw=3l2{ApigX M07*qoM6N<$f^`y@zW@LL literal 0 HcmV?d00001 diff --git a/dev-assets/doodads/gems/totem-green-3.png b/dev-assets/doodads/gems/totem-green-3.png new file mode 100644 index 0000000000000000000000000000000000000000..b850991fd6a063f135a5cf12d7b535480f99e376 GIT binary patch literal 978 zcmV;@11EX>4Tx04R}tkv&MmKpe$iKSYs=gB3(YGE^rEqN0vkg(6f4wL+^7CYOFelZGV4 z#ZhoAIQX$xb#QUk)xlK|1V2C=otzY1q{ROvg%&X$9QWhhy~o`kex4aNQptJZFtLztVY!7_!BB}Oi6e@tQNBOz zvch?bvs$XK#y$B9Ls@NQnd>wM5yv8yAVPqQ3W_MfLX=jG6cb6>k9qj}9luB}nOsFM zax9<>6_Voz|AXJ%nz@N_Hz^bY+Foq?V;E@P1?pAX{yw(t`Uwzt2ClTGzgz=mK1r`O zwa5|By$xJkH#K<=xZDByo^;8O94SE4pUVO7XY@@Opyw9oTyuMC?BnzSNKsdb8{ps& z7|B!iy2raaT6_EVOryUa#c*=S+P_|M00006VoOIv0RI600RN!9r;`8x010qNS#tmY z3ljhU3ljkVnw%H_000McNliru<^=&1BpPclsagO402y>eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{00F8=L_t(Y$K{u?O9F8e$G?h$)DWa4T}X*UZ5aj*fwR-) zWN?tsAJFX5(0a2e-P&+q)L_u!SSRb%cM)%G(V0jcfqL|unfj4s z0CqlY4hjI617f~a0DwOnF#PetTIh!_&vAf25Gf!5uUi!bJPZN=&v%aifb*LYXey2~ z;ergRfU6atDt-5O9$tn4ipD9WqjB;xmCYXx099Z!nNWP{{h+O^FM-|5Vk$H(Ic^En zt9OoD$G;0K7+JKgWO_W0LQ1Q^LMpBC4Fai1aP;&7fR|x3DV?Auv2%5*?A6vN*Q{?2 za&+BBM_IK?NwKx^(|9|Q9?&SoZjz!m5|VAbR~Ag`p{XoA8+NuHvr)=G-|P&!;g0>0 zs!M`IFqWj(3ZSVv1%QM7L;L5cdOXq5_;)WgSr%+Ai%evf9Gd4i(3BQvRC{X0Zf_*P z=CUJ1DnOct>Pc~8V|w+j7=Qj^=FDaL-#jb608V#>>`x#2^8f$<07*qoM6N<$f*w<= AJOBUy literal 0 HcmV?d00001 diff --git a/dev-assets/doodads/gems/totem-green-4.png b/dev-assets/doodads/gems/totem-green-4.png new file mode 100644 index 0000000000000000000000000000000000000000..4aa4c7d6be64d3c061241962560f33c1bf019c5f GIT binary patch literal 956 zcmV;t14I0YP)EX>4Tx04R}tkv&MmKpe$iKSYs=gB3(YGE^rEqN0vkg(6f4wL+^7CYOFelZGV4 z#ZhoAIQX$xb#QUk)xlK|1V2C=otzY1q{ROvg%&X$9QWhhy~o`kex4aNQptJZFtLztVY!7_!BB}Oi6e@tQNBOz zvch?bvs$XK#y$B9Ls@NQnd>wM5yv8yAVPqQ3W_MfLX=jG6cb6>k9qj}9luB}nOsFM zax9<>6_Voz|AXJ%nz@N_Hz^bY+Foq?V;E@P1?pAX{yw(t`Uwzt2ClTGzgz=mK1r`O zwa5|By$xJkH#K<=xZDByo^;8O94SE4pUVO7XY@@Opyw9oTyuMC?BnzSNKsdb8{ps& z7|B!iy2raaT6_EVOryUa#c*=S+P_|M00006VoOIv0RI600RN!9r;`8x010qNS#tmY z3ljhU3ljkVnw%H_000McNliru<^=&1BpvlsJox|s02y>eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{00ERqL_t(Y$K{tlOF~f?habhEsURiEkP?R`$#if?oEn-W z5OPZV0?mGe5ZXlHZc-o^3f@2n$F_nf!#yHYk_y41XtBY%Uh`^R^(xUjo%3?J5AW~& zbI#Fic~+ZD*z`=nbT?w6`B;CYQmav}K4=DNynWDkY4BWcOefN*Kn+UHNcnJVfap?a zFem_v;4!WNV6vP0{&;!a*5ykG0#sE*3N7IIQ&9o~WP@P>>7*hA;O^=cfc!-Pzs1K% z^-LX90+)(V`f>!r=JO5k<40NC6=!0T{fv@a-rKWmubD3fE( zHs5kws)YW`V=s{0EKVzAMr@gEFwA=@CGFEYp^mkD-vu95-atA@UMxuR29MjVBwuSX z90rlr>Ri!gBK49}t;Bk@O+WG3J7^v&*Z0FgwTklB>K(OUMuv_9rV1+NP9ZlTc@u(w z-|cJ9(gE8d8jlfi?x}|+1OdOL6WFi!LpE^P+Rr9sO80000EX>4Tx04R}tkv&MmKpe$iKSYs=gB3(YGE^rEqN0vkg(6f4wL+^7CYOFelZGV4 z#ZhoAIQX$xb#QUk)xlK|1V2C=otzY1q{ROvg%&X$9QWhhy~o`kex4aNQptJZFtLztVY!7_!BB}Oi6e@tQNBOz zvch?bvs$XK#y$B9Ls@NQnd>wM5yv8yAVPqQ3W_MfLX=jG6cb6>k9qj}9luB}nOsFM zax9<>6_Voz|AXJ%nz@N_Hz^bY+Foq?V;E@P1?pAX{yw(t`Uwzt2ClTGzgz=mK1r`O zwa5|By$xJkH#K<=xZDByo^;8O94SE4pUVO7XY@@Opyw9oTyuMC?BnzSNKsdb8{ps& z7|B!iy2raaT6_EVOryUa#c*=S+P_|M00006VoOIv0RI600RN!9r;`8x010qNS#tmY z3ljhU3ljkVnw%H_000McNliru<^=&1Bnj`1=!5_O02y>eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{0078IL_t(Y$7A#`SO3pIXTZcT0D$q*#%cfGeE7=n?A0rV zr_W!~%%acVe=&Ui@|oe?htC7!(@{%DEge`(_a8k;UrYBNJ;@*{CQi1+OypX~z`(%Z zXl+iG#Z2T{C?vp3w#7`8SorMqTe2)>BG*C~Aje`RN-QMTVkSy0M7CI3Qk)?s#E+oG zEW}vIz`(#@s;5PCoW+FrF)UfLiNVp@oOnxNE`9w9QNJ!(vx%(yjLl-Kmf~{ZXn{X! i>8Pax)7Ty{-3kC&oL%~Z{1@E-0000EX>4Tx04R}tkv&MmKpe$iKSYs=gB3(YGE^rEqN0vkg(6f4wL+^7CYOFelZGV4 z#ZhoAIQX$xb#QUk)xlK|1V2C=otzY1q{ROvg%&X$9QWhhy~o`kex4aNQptJZFtLztVY!7_!BB}Oi6e@tQNBOz zvch?bvs$XK#y$B9Ls@NQnd>wM5yv8yAVPqQ3W_MfLX=jG6cb6>k9qj}9luB}nOsFM zax9<>6_Voz|AXJ%nz@N_Hz^bY+Foq?V;E@P1?pAX{yw(t`Uwzt2ClTGzgz=mK1r`O zwa5|By$xJkH#K<=xZDByo^;8O94SE4pUVO7XY@@Opyw9oTyuMC?BnzSNKsdb8{ps& z7|B!iy2raaT6_EVOryUa#c*=S+P_|M00006VoOIv0RI600RN!9r;`8x010qNS#tmY z3ljhU3ljkVnw%H_000McNliru<^=&1B@Z9=eDDAO02y>eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{009F@L_t(Y$7A#`SO3pIXTZcT0D$q*#%cfGeE7=n?A0rV zr_W!~%%acVe=&Ui@|oe?htC7!(@{%DEge`()%zCF*HZPqMGWtxMaZ_8i5v@Mq(vAQ z7#J9w+?~j>n28(gr2@(xcBrSSr#*qW8r~=M;IKO>=+(gxl5MCOvGBKsUU@7 zAp-*ggPf8SSr#)9YoWNj5{iW|0JHejizh@|%tDHV3=9km2lgGps`kpoTMYVKTnsLL z9t;e9ix_Se#gT3)vW4sJ++Z*<*M-aRGBIP-bNt_52Fuqk2wIG_KBXk%qXU@5$n_}; pK82%Y@2I7tmJW`__K4|L002huf^we>VE_OC002ovPDHLkV1j&lS;GJT literal 0 HcmV?d00001 diff --git a/dev-assets/doodads/gems/totem-red-2.png b/dev-assets/doodads/gems/totem-red-2.png new file mode 100644 index 0000000000000000000000000000000000000000..d08ce2186913a3b4e0550029cc4036a7ff0ea0e1 GIT binary patch literal 805 zcmeAS@N?(olHy`uVBq!ia0vp^vLMXC1|-8Kr}Hx~Ft%hmI|q0=J1Z0v<)>xlq%tsQ zOst(~>v7mY=4iaV%fzl`Q5RRE5OwZFi~6Ekl|neSI<4kYn_lNQxlQHh(ZB*-iys>! zN(&0FT|F2oz+&$pGk1K+5S6sdPQ8n>qHlfmj~`XyPb2R=|0fgcbuFdAUtwPAu0+9n0sq`6tLL?k z475GCK3aZU;V7aYCqTXw&P-pm+R zgCd;;Jff2xv;S|te|Of-&O&od5$0QQIlq%7GVZg!3cdZ$Zrj^moB|bW>$WW0AH$qx z=egc&>j}XNdwFAG%uOr#cidt8HLv941Q|_-%kxh&zEA(+E4kpg*o&Cr>g+d|H(?D8gCb z5n0T@z%2~Ij105pNB{-dOFVsD*`Kj8il_?Jd=StC3Q3l@MwB?`=jNv7l`uFLr6!i7 zrYMwWmSiZnd-?{1H}Z)C75(*eaSZV|p8Uli{Qr4}^aDo>7#coaI+pqWe$9_lAKqNm zZd-mn{?eI6=kM1W*8KZ4^Wok0^URMg2YS2f%0_r!{VjI!deGN>t~~FTxSrTHqf>@k z_D!w?2+X-N_rxZUK)l_a;|gEC@E%?*?hg@JZ(nij!Go0J1y3L8Zqi9py6(gV1iGe` zV9ud%f4NDyhTNKBMg|53GB?UOR^QSV&o_KgTxh5<^RCks|K9mYxuk`}?Cm9&=|m=$`mGSgeN2{q#Ms%Vm1s e3SM5zz;K{r*5O{Er$2xJ!QkoY=d#Wzp$P!S996{t literal 0 HcmV?d00001 diff --git a/dev-assets/doodads/gems/totem-red-3.png b/dev-assets/doodads/gems/totem-red-3.png new file mode 100644 index 0000000000000000000000000000000000000000..bd5614243b50ec1638276965800956d96c7d57c8 GIT binary patch literal 790 zcmV+x1L^#UP)EX>4Tx04R}tkv&MmKpe$iKSYs=gB3(YGE^rEqN0vkg(6f4wL+^7CYOFelZGV4 z#ZhoAIQX$xb#QUk)xlK|1V2C=otzY1q{ROvg%&X$9QWhhy~o`kex4aNQptJZFtLztVY!7_!BB}Oi6e@tQNBOz zvch?bvs$XK#y$B9Ls@NQnd>wM5yv8yAVPqQ3W_MfLX=jG6cb6>k9qj}9luB}nOsFM zax9<>6_Voz|AXJ%nz@N_Hz^bY+Foq?V;E@P1?pAX{yw(t`Uwzt2ClTGzgz=mK1r`O zwa5|By$xJkH#K<=xZDByo^;8O94SE4pUVO7XY@@Opyw9oTyuMC?BnzSNKsdb8{ps& z7|B!iy2raaT6_EVOryUa#c*=S+P_|M00006VoOIv0RI600RN!9r;`8x010qNS#tmY z3ljhU3ljkVnw%H_000McNliru<^=&1B^Bb7g^BeSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{008buL_t(Y$7A#`SO3pIXTZcT0D$q*#%cfGeE7=n?A0rV zr_W!~%%acVe=&Ui@|oe?htC7!(@{%DEge`()%zCF*HZPqMGWtxMaZ_8i5v?x6{Hv# z7#J9I^wr3+n28(<#pRV4gr2@(5R;H0%VH*SEIe@V2!n%@9mBqz`^d7GiChaA7#PU5 zn2B5qVSpTqSxB*vfq{YHz`jFR)$ZH5kHN*ygMpcgi-DnU5yQ=*IMOXePNnPa++Yav z^C0MhO)sA^STZp)=vx}#wHRxCN=e2?2QZ6~>r)nd3P;P{QA literal 0 HcmV?d00001 diff --git a/dev-assets/doodads/gems/totem-red-4.png b/dev-assets/doodads/gems/totem-red-4.png new file mode 100644 index 0000000000000000000000000000000000000000..98ddcc98c3e9cb6403424bfb6aac4cb9f3c7175c GIT binary patch literal 817 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 AkN^Mx literal 0 HcmV?d00001 diff --git a/dev-assets/doodads/gems/totem-yellow-3.png b/dev-assets/doodads/gems/totem-yellow-3.png new file mode 100644 index 0000000000000000000000000000000000000000..da774b79766c2fdb601e2d107781107a2a9feb83 GIT binary patch literal 1054 zcmV+(1mXLMP)EX>4Tx04R}tkv&MmKpe$iKSYs=gB3(YGE^rEqN0vkg(6f4wL+^7CYOFelZGV4 z#ZhoAIQX$xb#QUk)xlK|1V2C=otzY1q{ROvg%&X$9QWhhy~o`kex4aNQptJZFtLztVY!7_!BB}Oi6e@tQNBOz zvch?bvs$XK#y$B9Ls@NQnd>wM5yv8yAVPqQ3W_MfLX=jG6cb6>k9qj}9luB}nOsFM zax9<>6_Voz|AXJ%nz@N_Hz^bY+Foq?V;E@P1?pAX{yw(t`Uwzt2ClTGzgz=mK1r`O zwa5|By$xJkH#K<=xZDByo^;8O94SE4pUVO7XY@@Opyw9oTyuMC?BnzSNKsdb8{ps& z7|B!iy2raaT6_EVOryUa#c*=S+P_|M00006VoOIv0RI600RN!9r;`8x010qNS#tmY z3ljhU3ljkVnw%H_000McNliru<^=&1Br7`ZsbByA02y>eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{00H(%L_t(Y$K{vLOTu6n$G`r%h~Bz%2on#&unr1#j>5t} zVj~)K^c>8P9C+>$1Vy<2pi2i$Jb4M~P!cKxic}O8f=UpH9mc!fP3Pva40>Sf-QFJ` zzR&wU&z{-Vmx6u#ve_{Ovt6C+_n%u`+&?|x?&0yrK<&48v^#CQw%XHCIu)pMoWZvp zNw+WHVJ8bEuuV3oyvr4gPEI z;?AN1b~xPDLPoof-kCi1_8wGY7QzKAgbQD8rNBmNon}-f60_hrM%70Y&->I%)Em9; zCkNtIS|NdHfjr0H;P}FN$mEJu-AP)Qtnfo=pPpSi+s&ab8WC+6U)kq*wS#R`E zt94N1ljwEP)EX>4Tx04R}tkv&MmKpe$iKSYs=gB3(YGE^rEqN0vkg(6f4wL+^7CYOFelZGV4 z#ZhoAIQX$xb#QUk)xlK|1V2C=otzY1q{ROvg%&X$9QWhhy~o`kex4aNQptJZFtLztVY!7_!BB}Oi6e@tQNBOz zvch?bvs$XK#y$B9Ls@NQnd>wM5yv8yAVPqQ3W_MfLX=jG6cb6>k9qj}9luB}nOsFM zax9<>6_Voz|AXJ%nz@N_Hz^bY+Foq?V;E@P1?pAX{yw(t`Uwzt2ClTGzgz=mK1r`O zwa5|By$xJkH#K<=xZDByo^;8O94SE4pUVO7XY@@Opyw9oTyuMC?BnzSNKsdb8{ps& z7|B!iy2raaT6_EVOryUa#c*=S+P_|M00006VoOIv0RI600RN!9r;`8x010qNS#tmY z3ljhU3ljkVnw%H_000McNliru<^=&1BrvdxV2l6&02y>eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{00I6A9PMm`11AmkAb?UXLNgAzI)yA zC>;ybh!T9*a|3<3RQdNp6>PpZ1%MD~-q$3HB>{kx9`&Xh8g7IE&KIW;A{`jx_tl&3 zP_PjN_%JgGKxN|qfY+|Xv8{e|c(4%#s9=vD-Pa1$nPXcVwa)=4&E=^zg2A^cy$Mt> zzi(xETB~<#3nTFWfLbGB%N+Jxo|VNwpb+VS`CVC_rm}HBHj~h5gQ`8SPo?x?_29?$ z1pua*j5i#l^nOu!n>lMUynNG&-!kn^{5ia}-HJB`7fV7ne;CVVuHS!Yp}^8YAv#p$ z)Uhpgb~~YfmGyl}bNT*RV)WTND4%|HBi}N)RGE777%4rD+UGd7#jCd;G)O&uQz}g} zNj8&UwYnE?I4Jw{`7WE)Syroix=Q^pfagyOqu(-DYF#Fcdzj``|7})h0W^FNY?#WS zN^_|)wT27i`zJ{a+S+dE3iTJwFkq<9dksdz)wH<@3wxhNTFge-9Q=z}q?(VilKgXv g*?5-i|K_*iC*yX@Q+WDSpa1{>07*qoM6N<$f{G;6eE -1) { + totems[link.ID()] = false; + } else { + linkedReceiver = true; + } + } + + console.log("Totem %s is linked to %d neighbors", Self.ID(), Object.keys(totems).length); + + // Shimmer animation is just like the gemstones: first 4 frames + // are the filled socket sprites. + Self.AddAnimation("shimmer", 100, [0, 1, 2, 3, 0]); + + Events.OnCollide((e) => { + if (activated) return; + + if (e.Actor.IsMobile() && e.Settled) { + // Do they have our gemstone? + let hasKey = e.Actor.HasItem(keyname) >= 0; + if (!hasKey) { + return; + } + + // Take the gemstone. + e.Actor.RemoveItem(keyname, 1); + Self.ShowLayer(0); + + // Emit to our linked totem neighbors. + activated = true; + Message.Publish("gem-totem:activated", Self.ID()); + tryPower(); + } + }); + + Message.Subscribe("gem-totem:activated", (totemId) => { + totems[totemId] = true; + tryPower(); + }) + + setInterval(() => { + if (activated) { + Self.PlayAnimation("shimmer", null); + } + }, shimmerFreq); +} + +// Try to send a power signal for an activated totem. +function tryPower() { + // Only emit power if we are linked to something other than a totem. + if (!linkedReceiver) { + return; + } + + console.log("Totem %s (%s) tries power", Self.ID(), Self.Filename); + + // Can't if any of our linked totems aren't activated. + try { + for (let totemId of Object.keys(totems)) { + console.log("Totem %s (%s) sees linked totem %s", Self.ID(), Self.Filename, totemId); + if (totems[totemId] === false) { + console.log("Can't, a linked totem not active!"); + return; + } + } + } catch(e) { + console.error("Caught: %s", e); + } + + // Can't if we aren't powered. + if (activated === false) { + console.log("Can't, we are not active!"); + return; + } + + // Emit power! + console.log("POWER!"); + Message.Publish("power", true); +} \ No newline at end of file diff --git a/dev-assets/doodads/gems/yellow-1.png b/dev-assets/doodads/gems/yellow-1.png new file mode 100644 index 0000000000000000000000000000000000000000..016d42ae867b62360eb04e6dbc8fe341f3015021 GIT binary patch literal 971 zcmV;+12p`JP)EX>4Tx04R}tkv&MmKpe$iKSYs=gB3(YGE^rEqN0vkg(6f4wL+^7CYOFelZGV4 z#ZhoAIQX$xb#QUk)xlK|1V2C=otzY1q{ROvg%&X$9QWhhy~o`kex4aNQptJZFtLztVY!7_!BB}Oi6e@tQNBOz zvch?bvs$XK#y$B9Ls@NQnd>wM5yv8yAVPqQ3W_MfLX=jG6cb6>k9qj}9luB}nOsFM zax9<>6_Voz|AXJ%nz@N_Hz^bY+Foq?V;E@P1?pAX{yw(t`Uwzt2ClTGzgz=mK1r`O zwa5|By$xJkH#K<=xZDByo^;8O94SE4pUVO7XY@@Opyw9oTyuMC?BnzSNKsdb8{ps& z7|B!iy2raaT6_EVOryUa#c*=S+P_|M00006VoOIv0RI600RN!9r;`8x010qNS#tmY z3ljhU3ljkVnw%H_000McNliru<^=&0Hx-{ReSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{00E;(L_t(I%dM25Z^A$n#=mxl7#U{E($o!tY0U)590DAM zKLY`V1cjW!42kKVu@L4~(JWI~Y8pV0+?d#wlpqFKCz^M=-rCOWQ@wY+-+k}y-P4ev zP6tueoZ~=Ci?b}qcw}(^n9eo`)}h(&#^YFilm=xgh#&y4TpeIr27+~%*zo5cKazo3 z9tZ#?PGJ6qB7rVJEms;*=Z zD?S1Mj{BzAh(y4JzXbreUTEt0L&tqHciy%P@vW01awXd*km`!gO1>O%0rwBdVA|p= z$!m20=yxriEXsV*IRQYsRpsqgoQPRe+mu1%3II+hIG^M8;_~zEta#Wlc8d3pF95(z?R@w0`c|r4mpEgmczWikpoBBE tpULS3>(H!T#bettgj=EX>4Tx04R}tkv&MmKpe$iKSYs=gB3(YGE^rEqN0vkg(6f4wL+^7CYOFelZGV4 z#ZhoAIQX$xb#QUk)xlK|1V2C=otzY1q{ROvg%&X$9QWhhy~o`kex4aNQptJZFtLztVY!7_!BB}Oi6e@tQNBOz zvch?bvs$XK#y$B9Ls@NQnd>wM5yv8yAVPqQ3W_MfLX=jG6cb6>k9qj}9luB}nOsFM zax9<>6_Voz|AXJ%nz@N_Hz^bY+Foq?V;E@P1?pAX{yw(t`Uwzt2ClTGzgz=mK1r`O zwa5|By$xJkH#K<=xZDByo^;8O94SE4pUVO7XY@@Opyw9oTyuMC?BnzSNKsdb8{ps& z7|B!iy2raaT6_EVOryUa#c*=S+P_|M00006VoOIv0RI600RN!9r;`8x010qNS#tmY z3ljhU3ljkVnw%H_000McNliru<^=&0HyRI+{!IV?02y>eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{00D7HL_t(I%dM2XZo)7S$Ip>jkeDlvpe*S-WPpu@$M8TF zq)d4NCZsZ?gCC=++6@Mtp;)S{grSnf9El}J>Cie{9J}q%n<6{+^Zz~xc#Lyse0M?s zah+2iB;lbpXHTz+t(K9#{UsY0l-eKznT!WMVK9wH-{7jjK=KAJk@ci-t z`$NSHkoZ7pCfRnY;d+^A8*HFOSpxt-E))|2NPu6$AX|ljY}S#+YOxW{p_#@beIMPy zWISjU0RUVtGfjs(X1=jwnn{L>lnceEtqMER;f}q(#XW_-;so|Rc$+ zYYla(*u$gjIk{9BJIZt0gB@k7Wu&`J`FC5)!`3&jtA#7&%gs@qVSlJP1?a(C_R}QT z_ifYS#JdVnly#dYtje^L5J0HwH5_ijLyaMLHf`0N*~DXF12DuixQU`Oo33HU$yTR| vE#|j#7pS*_zAjW_hv(ZQ_C6#3xoJNER8iSj9CAby00000NkvXXu0mjf6@ia; literal 0 HcmV?d00001 diff --git a/dev-assets/doodads/gems/yellow-3.png b/dev-assets/doodads/gems/yellow-3.png new file mode 100644 index 0000000000000000000000000000000000000000..fb9ac0f6907c7e9c4482832409979a2b5a2a170c GIT binary patch literal 898 zcmV-|1AY97P)EX>4Tx04R}tkv&MmKpe$iKSYs=gB3(YGE^rEqN0vkg(6f4wL+^7CYOFelZGV4 z#ZhoAIQX$xb#QUk)xlK|1V2C=otzY1q{ROvg%&X$9QWhhy~o`kex4aNQptJZFtLztVY!7_!BB}Oi6e@tQNBOz zvch?bvs$XK#y$B9Ls@NQnd>wM5yv8yAVPqQ3W_MfLX=jG6cb6>k9qj}9luB}nOsFM zax9<>6_Voz|AXJ%nz@N_Hz^bY+Foq?V;E@P1?pAX{yw(t`Uwzt2ClTGzgz=mK1r`O zwa5|By$xJkH#K<=xZDByo^;8O94SE4pUVO7XY@@Opyw9oTyuMC?BnzSNKsdb8{ps& z7|B!iy2raaT6_EVOryUa#c*=S+P_|M00006VoOIv0RI600RN!9r;`8x010qNS#tmY z3ljhU3ljkVnw%H_000McNliru<^=&0Hy#N6I#d7v02y>eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{00CM_L_t(I%dM2ZZo)7S#y>}4;SFvCMU_yWp-VRw9wSSJ z44Lu-ObiSxc?=dd7_6urFeA2$9VS6J1S zQmLveDaa%T^CSSk>3j?JiS(U=yrS`F&;u2D=6no;(pYa=iWR7YNJac^0symV=E9=9 zudmN{Cn3@`em8J)F`qo7{}!KB(~>NakO5$~zmhi3%zsYW YZ@4q%HUkq)!TEX>4Tx04R}tkv&MmKpe$iKSYs=gB3(YGE^rEqN0vkg(6f4wL+^7CYOFelZGV4 z#ZhoAIQX$xb#QUk)xlK|1V2C=otzY1q{ROvg%&X$9QWhhy~o`kex4aNQptJZFtLztVY!7_!BB}Oi6e@tQNBOz zvch?bvs$XK#y$B9Ls@NQnd>wM5yv8yAVPqQ3W_MfLX=jG6cb6>k9qj}9luB}nOsFM zax9<>6_Voz|AXJ%nz@N_Hz^bY+Foq?V;E@P1?pAX{yw(t`Uwzt2ClTGzgz=mK1r`O zwa5|By$xJkH#K<=xZDByo^;8O94SE4pUVO7XY@@Opyw9oTyuMC?BnzSNKsdb8{ps& z7|B!iy2raaT6_EVOryUa#c*=S+P_|M00006VoOIv0RI600RN!9r;`8x010qNS#tmY z3ljhU3ljkVnw%H_000McNliru<^=&0HzB^87ijeSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{00BoyL_t(I%dM25l7lc1hW{`*S>1`e8%+8R6_qu8jF`%* zJ^>0@!(-G`B6tTdOnWYaj;!DWY*|vma5uM(-SFk#&7TMa!WgunT9!dfY1(iN%w_VwdUWY`Xui5U)wHzozps&vl0Kn;7DFC=+wMrA+ zLtdL%4wNAfL3q2AOA~GHk0*wD2b7-t7lR9bxZVa}1OSJ9Y{`^Mf^6ge zJDORVXqy-FD!Kn?B$SggE)S{+h44*F_Bfi@h5)3BuOFF~A9tE)%iYc)+`N;@mfX!L z2v;?NaiBjp{si&XIq2;Gx`Jzm7h!y7{dWELO#J6d`vZ1dzXY%aYNh}H002ovPDHLk FV1jf8d5-`9 literal 0 HcmV?d00001 diff --git a/dev-assets/doodads/snake/Makefile b/dev-assets/doodads/snake/Makefile new file mode 100644 index 0000000..6fa8016 --- /dev/null +++ b/dev-assets/doodads/snake/Makefile @@ -0,0 +1,15 @@ +ALL: build + +.PHONY: build +build: + doodad convert -t "Snake" left-1.png left-2.png left-3.png right-1.png right-2.png right-3.png \ + attack-left-1.png attack-left-2.png attack-left-3.png attack-right-1.png attack-right-2.png \ + attack-right-3.png snake.doodad + doodad install-script snake.js snake.doodad + + # Tag the category for these doodads + for i in *.doodad; do\ + doodad edit-doodad --tag "category=creatures" $${i};\ + done + + cp *.doodad ../../../assets/doodads/ \ No newline at end of file diff --git a/dev-assets/doodads/snake/attack-left-1.png b/dev-assets/doodads/snake/attack-left-1.png new file mode 100644 index 0000000000000000000000000000000000000000..d7e3cdfe44bcea1f52e642db598df59e328165a7 GIT binary patch literal 1202 zcmV;j1Wo&iP)EX>4Tx04R}tkv&MmKpe$iKSYs=gB3(YGE^rEqN0vkg(6f4wL+^7CYOFelZGV4 z#ZhoAIQX$xb#QUk)xlK|1V2C=otzY1q{ROvg%&X$9QWhhy~o`kex4aNQptJZFtLztVY!7_!BB}Oi6e@tQNBOz zvch?bvs$XK#y$B9Ls@NQnd>wM5yv8yAVPqQ3W_MfLX=jG6cb6>k9qj}9luB}nOsFM zax9<>6_Voz|AXJ%nz@N_Hz^bY+Foq?V;E@P1?pAX{yw(t`Uwzt2ClTGzgz=mK1r`O zwa5|By$xJkH#K<=xZDByo^;8O94SE4pUVO7XY@@Opyw9oTyuMC?BnzSNKsdb8{ps& z7|B!iy2raaT6_EVOryUa#c*=S+P_|M00006VoOIv0RI600RN!9r;`8x010qNS#tmY z3ljhU3ljkVnw%H_000McNliru<^=%)ATBmTM=1aR02y>eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{00N3hL_t(|+U=UVPQx%1hL0;R3?R}qLa2x#3p@lPBSXfD zxf|-rQi&BYkq2Pp0eFo{EOg)^RJxW5kXVq+0B((O(l*#WCON+psZpgS{&Ft=aSA{p zkw_#Gi9{liNF)-8L?V#_5W~7~(usw7KFCH46GQ`J(Ne8$6I$J75E0S9iU1u*(f5@C zp+kvMz7(v=fQV9_yU?qxYq&XoLWSWqB8p%Dz!XL;QX@(^{7MVPW=EAl46+e>zWm7j ze*bOJedrF&VzhVBGK4qkS$E8Hg~v*NAyAYULwBgwepfct|kNKwuA9K}7_C zP^`4tLes)3`J;n5~Up0H`XXMbO@MffdaxbeM$(J?G(Lh=n$~lY6CkOLVy6^ zaTi-cP&aEQ!Lj zs4>pNuI$LILr`mqi>Pp3BjimdV1DtN=O=vsUBHW>nrEOEUG%?9jk4`DuXebeNtn-? zuxRHnS#j5Gl-W)JQ-xoqP|lk_f{qA13e+dB=XI3w!o?P)lS>zB)ncnp-joLFLTq(~ zR&Vy3*+qFE%yxay)4=6Ub*ndqlcUw?`SICnX&6@9r|K^CJqQz!MR%@EskHY7QwX<@ z@8S6f)j+9r;V+vqdJT{@Ndnm3Tmb-plOq6tSd@thXNF3>dD9H?mjXA)Mr^Mg3kkqR zRCpP~U9`Nfryh&L1O6i_0A8V%>a=4q?k8g0Pei9({y&PtvzO0k8l{-fJ=} QVE_OC07*qoM6N<$f?FB`mH+?% literal 0 HcmV?d00001 diff --git a/dev-assets/doodads/snake/attack-left-2.png b/dev-assets/doodads/snake/attack-left-2.png new file mode 100644 index 0000000000000000000000000000000000000000..8fec20b4eb488affaf1c5bb592110c99e06cd6ff GIT binary patch literal 1139 zcmV-(1dRKMP)EX>4Tx04R}tkv&MmKpe$iKSYs=gB3(YGE^rEqN0vkg(6f4wL+^7CYOFelZGV4 z#ZhoAIQX$xb#QUk)xlK|1V2C=otzY1q{ROvg%&X$9QWhhy~o`kex4aNQptJZFtLztVY!7_!BB}Oi6e@tQNBOz zvch?bvs$XK#y$B9Ls@NQnd>wM5yv8yAVPqQ3W_MfLX=jG6cb6>k9qj}9luB}nOsFM zax9<>6_Voz|AXJ%nz@N_Hz^bY+Foq?V;E@P1?pAX{yw(t`Uwzt2ClTGzgz=mK1r`O zwa5|By$xJkH#K<=xZDByo^;8O94SE4pUVO7XY@@Opyw9oTyuMC?BnzSNKsdb8{ps& z7|B!iy2raaT6_EVOryUa#c*=S+P_|M00006VoOIv0RI600RN!9r;`8x010qNS#tmY z3ljhU3ljkVnw%H_000McNliru<^=%)ATlCC8)g6i02y>eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{00K)%L_t(|+U=UZOT$1E$KRDK4vKY+A{B=?DEKcpIyz)5 z&T%UK1%<91+tIa`*YO)Qo~+}#`6gYN7PKOd=iYbcS_@k@I)QYmSHzw z!Y~G+?plcxeY<#vQE!F{!!r4?x@&<0{}Zjd(NB+hGq`#>twyk{yH*r}5ZkBBTVvdx zi^X7_IDY?m4It(JQ}!4U2V*&1ZDD-fl>hk5>yvQ=CIsUk zlH35Wzqwnv7=Z}`Ek^7+H6~quQ=yg?L|h(`2E+suwBV$+Ko%e-Tq3aJ0u>6RU8j7VzaCV?tlj0gtHwEm@1qrC;wf7K5JEk>x-RacV1ji${CPNVHZr*#+@v88Sp z=)p1qB;bkWjD@89yD8sTP4a7+QXJU;*cfKE%lE68`K?wYn#0P=JN+3IsQ zFxv9*!P;>Jz)v+BCtlN*{?L*B(2-tKe~uxF1R~Gl^AE}zA~vP|!{Gn`002ovPDHLk FV1kr;@rnQd literal 0 HcmV?d00001 diff --git a/dev-assets/doodads/snake/attack-left-3.png b/dev-assets/doodads/snake/attack-left-3.png new file mode 100644 index 0000000000000000000000000000000000000000..00948cdd5915c8481d94627abaff20f8b87e39bc GIT binary patch literal 935 zcmeAS@N?(olHy`uVBq!ia0vp^P9V&|1|%PcFuY)3U~I{Bb`J1#c2+1T%1_J8No8Qr zm{>c}*5j~)%+Yvzmx*1?qAspRA?n>>sm^KzrwuKU5SGE0{*#CR?ll6 z8EAWOeYE_z!cknM?#Zq*xwniQd=v41i?phVN&;ISE zLzUf|qgHJ=X8V)dIWjkO=4%sn!Q)EP6r37*xVkhBI!y`d6%qEl)nEDJx9oloy_qqt z21Pmxctj^XX8+%O|L&}vorUI_BFwkqa(*XEWZY+c6?*%h-L|*CI0Y)$)@@m~KZZHY z&U3xl))Rsk_VUKWn44De@3_PGYhKC82{M`vm*<~me4qZsS8~B~u@^DL)!Ai(P=vF< zBeIx*fm;}a85w5HkpK#^mw5WRvOi;GWKyu)I^obeppayVYeb22er|4RUI~M9QEFmI zYKlU6W=V#EyQgnJcq5-UFuLnKT^vIyZoR#|(d)2-1p9~jL%OWSM@*dpt(G)5t$*-> zIpqxVoZy1eGw-hS*){NAxGoSgYoXTBvbBqx#2?Cd-QHq)Mf3j5-}MCnlN^fn|9k(M zcP0D5uF{lg^Sl3DnOq|#f2g#kmP7i~`rotHAG%TQn=G`^_F{y4nlQ4FWqh&d8YY=3do}*$b*mpSW%25#HMUpz`&_CrbmrEWdaAZ~4=o zrEX>4Tx04R}tkv&MmKpe$iKSYs=gB3(YGE^rEqN0vkg(6f4wL+^7CYOFelZGV4 z#ZhoAIQX$xb#QUk)xlK|1V2C=otzY1q{ROvg%&X$9QWhhy~o`kex4aNQptJZFtLztVY!7_!BB}Oi6e@tQNBOz zvch?bvs$XK#y$B9Ls@NQnd>wM5yv8yAVPqQ3W_MfLX=jG6cb6>k9qj}9luB}nOsFM zax9<>6_Voz|AXJ%nz@N_Hz^bY+Foq?V;E@P1?pAX{yw(t`Uwzt2ClTGzgz=mK1r`O zwa5|By$xJkH#K<=xZDByo^;8O94SE4pUVO7XY@@Opyw9oTyuMC?BnzSNKsdb8{ps& z7|B!iy2raaT6_EVOryUa#c*=S+P_|M00006VoOIv0RI600RN!9r;`8x010qNS#tmY z3ljhU3ljkVnw%H_000McNliru<^=%)At1=$TWeSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{00N0gL_t(|+U=P?PXaL*#@{ntNQ7{#gcyy(E&4(H0E~VB zHo|IROk9Z*%*N5d(b2C!;sS$uG0J)v7+grs0js5HFZZX{x4`>MVvf-M?(OqFZ2?Fm z5{X12kw_#Gi9{liNFw{h5Oz+tbE3e;AD2s+JJ2f!u- zR1m63`fX-)^5`J=WXFR~cszR6KI6C9_It#5@RUV*)|Ll`@Ib^X zD>!>Q)jl%2Us`LYs9i&Z@bxiAgMbRcl}d0bP+>!G4g?kir$Ef^m#Dw*R7GG_gOeVy zb0EZa$^XXMXE;?6JW=k{rb|}6RfBq~h8C~ULC9&c-m2{$2;MGb7+A{#1q5%CNicS% zB4ilYRpHDjw%=xJ9uf8On81P(wr z@{h{`;sglY4phGLC=-Z>wG3n>UG(S__9J63m~8-gCTv5@)|<}@z*g8QwIcZB!+r!| zKhkyu-5x`PpbB2jdxYw8muG^kJ4_p`)2c^^)uB6!P(j$}WSP|%RdAB_CmWS4RcW#4 zd4tJzX+1}%Zno0`QFV;6Ji|)+lpTKtQ6|$Azb~gtQ&5=cNvF*YNxtB>Sz_G&`j{)9 zL0cM~^M3&0rJ2Mi0#bpLvxTW8;uV2#-L3w8zPMQ!gOSEBOt;oTOXKDJ8vp=~4=Qlo zt-{4s1W)^rIwzz_m?{9yn5A3|9Ei@m0!VlMs54Q~3(9Jr%tSRDA5?z-yHE}^%ivYe zY^2NFAo%1tklTkP4DX5$81qIvw^>G`AdW^sEOw7gRql#dz5UGxK$7$W?vPAH5y3AP P00000NkvXXu0mjfKPL@u literal 0 HcmV?d00001 diff --git a/dev-assets/doodads/snake/attack-right-2.png b/dev-assets/doodads/snake/attack-right-2.png new file mode 100644 index 0000000000000000000000000000000000000000..6bbef9cf1cd34d8eabf194f4ac6da4291150b009 GIT binary patch literal 1127 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 literal 0 HcmV?d00001 diff --git a/dev-assets/doodads/snake/left-3.png b/dev-assets/doodads/snake/left-3.png new file mode 100644 index 0000000000000000000000000000000000000000..9c8eedb4e2655668f1dbb3fc4e09168972d7c36a GIT binary patch literal 1152 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 R{MP^g002ovPDHLkV1kMO7z6+S literal 0 HcmV?d00001 diff --git a/dev-assets/doodads/snake/right-2.png b/dev-assets/doodads/snake/right-2.png new file mode 100644 index 0000000000000000000000000000000000000000..37828ced4eeecc62d2a719165f37765c480a69fa GIT binary patch literal 1172 zcmV;F1Z(?=P)EX>4Tx04R}tkv&MmKpe$iKSYs=gB3(YGE^rEqN0vkg(6f4wL+^7CYOFelZGV4 z#ZhoAIQX$xb#QUk)xlK|1V2C=otzY1q{ROvg%&X$9QWhhy~o`kex4aNQptJZFtLztVY!7_!BB}Oi6e@tQNBOz zvch?bvs$XK#y$B9Ls@NQnd>wM5yv8yAVPqQ3W_MfLX=jG6cb6>k9qj}9luB}nOsFM zax9<>6_Voz|AXJ%nz@N_Hz^bY+Foq?V;E@P1?pAX{yw(t`Uwzt2ClTGzgz=mK1r`O zwa5|By$xJkH#K<=xZDByo^;8O94SE4pUVO7XY@@Opyw9oTyuMC?BnzSNKsdb8{ps& z7|B!iy2raaT6_EVOryUa#c*=S+P_|M00006VoOIv0RI600RN!9r;`8x010qNS#tmY z3ljhU3ljkVnw%H_000McNliru<^=%)Ar+oepG*J%02y>eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{00L}DL_t(|+U=RWPQp+ahTodAFhGPAiNQGF;)OUmbTrO5 z8CDY)*2b+D;OGT#AxsR$#t_y@>fmBh2RzMb=`TIyJL30jKm+yZ_j?2whG7_nVHk#C z7=~dOhG7_nVHk$_!&oNV#Aw_P^FCj=E9;;|NCCr1FM4lwHvhdd3kXA8+@0)2hD9ks z6`(RZn@1u5>_vt!O#%R1y!%44j zygpbF>tzt@3Z}>)8K`8NRBMIj_@o7s)(z1M&KxiqgG}){cnt(-vOezcTY*hO!RS z!kO}&VV$VZvVF>k*zmda6lKny4@rMN!c-I%H_A5pr&T9i&D^+F+GcAF340t}SY}=tkCXb+@QmD0dmAj7yCoDMe5e mNn;LXsz{^!PZ+~6|C=8VeNwA`kv-M`0000EX>4Tx04R}tkv&MmKpe$iKSYs=gB3(YGE^rEqN0vkg(6f4wL+^7CYOFelZGV4 z#ZhoAIQX$xb#QUk)xlK|1V2C=otzY1q{ROvg%&X$9QWhhy~o`kex4aNQptJZFtLztVY!7_!BB}Oi6e@tQNBOz zvch?bvs$XK#y$B9Ls@NQnd>wM5yv8yAVPqQ3W_MfLX=jG6cb6>k9qj}9luB}nOsFM zax9<>6_Voz|AXJ%nz@N_Hz^bY+Foq?V;E@P1?pAX{yw(t`Uwzt2ClTGzgz=mK1r`O zwa5|By$xJkH#K<=xZDByo^;8O94SE4pUVO7XY@@Opyw9oTyuMC?BnzSNKsdb8{ps& z7|B!iy2raaT6_EVOryUa#c*=S+P_|M00006VoOIv0RI600RN!9r;`8x010qNS#tmY z3ljhU3ljkVnw%H_000McNliru<^=%)AsLtD(`Ntx02y>eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{00L1-L_t(|+U=OVPQx%1g-?(dBtW!lL5PYWEIbG!Lr271 zCd7)=rEA322Vmp@`XHScDk6kf3!(!Hk{Q6kb@S6Uc5PMX+X8`_5BuDE4G=;IA%qY@ z2qA2p_MXGtc{ndu#oC5yEcx zc>Tot<2L}H(Gj^~0A%lMR7RK*)K-sCTt;114eug!3G3(=ir8XL8HkAE+h%1~xshS1 z2cfDAf8i;89u04OgsKi^sZ5iJm#pyCVwcJAA;kNvQ6@td;<}6mF@09aD3W7SND%iC zri?{|n2nfs5#7uG(l>ZmeNlB}*w`JSu7v*0E&$-}ep-3?vPhRX^NiVi&_&svJA@4h zG=_tvze#yW;MCinP~6 zyaTBp4coU(X)?)>vptWEFk@2Ub5b>*#&H00000 LNkvXXu0mjf&>`_Y literal 0 HcmV?d00001 diff --git a/dev-assets/doodads/snake/snake.js b/dev-assets/doodads/snake/snake.js new file mode 100644 index 0000000..e8b2aaf --- /dev/null +++ b/dev-assets/doodads/snake/snake.js @@ -0,0 +1,135 @@ +// Snake + +/* +A.I. Behaviors: + +- Always turns to face the nearest player character +- Jumps up when the player tries to jump over them, + aiming to attack the player. +*/ + +let direction = "left", + jumpSpeed = 12, + watchRadius = 300, // player nearby distance for snake to jump + jumpCooldownStart = time.Now(), + size = Self.Size(); + +const states = { + idle: 0, + attacking: 1, +}; +let state = states.idle; + +function main() { + Self.SetMobile(true); + Self.SetGravity(true); + Self.SetHitbox(20, 0, 28, 58); + Self.AddAnimation("idle-left", 100, ["left-1", "left-2", "left-3", "left-2"]); + Self.AddAnimation("idle-right", 100, ["right-1", "right-2", "right-3", "right-2"]); + Self.AddAnimation("attack-left", 100, ["attack-left-1", "attack-left-2", "attack-left-3"]) + Self.AddAnimation("attack-right", 100, ["attack-right-1", "attack-right-2", "attack-right-3"]) + + // Player Character controls? + if (Self.IsPlayer()) { + return player(); + } + + Events.OnCollide((e) => { + // The snake is deadly to the touch. + if (e.Settled && e.Actor.IsPlayer() && e.InHitbox) { + // Friendly to fellow snakes. + if (e.Actor.Doodad().Filename.indexOf("snake") > -1) { + return; + } + + FailLevel("Watch out for snakes!"); + return; + } + }); + + setInterval(() => { + // Find the player. + let player = Actors.FindPlayer(), + playerPoint = player.Position(), + point = Self.Position(), + delta = 0, + nearby = false; + + // Face the player. + if (playerPoint.X < point.X + (size.W / 2)) { + direction = "left"; + delta = Math.abs(playerPoint.X - (point.X + (size.W/2))); + } + else if (playerPoint.X > point.X + (size.W / 2)) { + direction = "right"; + delta = Math.abs(playerPoint.X - (point.X + (size.W/2))); + } + + if (delta < watchRadius) { + console.log("Player is nearby snake! %d", delta); + nearby = true; + } + + // If we are idle and the player is jumping nearby... + if (state == states.idle && nearby && Self.Grounded()) { + if (playerPoint.Y - point.Y+(size.H/2) < 20) { + console.warn("Player is jumping near us!") + + // Enter attack state. + if (time.Since(jumpCooldownStart) > 500 * time.Millisecond) { + state = states.attacking; + Self.SetVelocity(Vector(0, -jumpSpeed)); + Self.StopAnimation(); + Self.PlayAnimation("attack-"+direction, null); + return; + } + } + } + + // If we are attacking and gravity has claimed us back. + if (state === states.attacking && Self.Grounded()) { + console.log("Landed again after jump!"); + state = states.idle; + jumpCooldownStart = time.Now(); + Self.StopAnimation(); + } + + // Ensure that the animations are always rolling. + if (state === states.idle && !Self.IsAnimating()) { + Self.PlayAnimation("idle-"+direction, null); + } + }, 100); +} + +// If under control of the player character. +function player() { + let jumping = false; + + Events.OnKeypress((ev) => { + Vx = 0; + Vy = 0; + + if (ev.Right) { + direction = "right"; + } else if (ev.Left) { + direction = "left"; + } + + // Jump! + if (ev.Up && !jumping) { + Self.StopAnimation(); + Self.PlayAnimation("attack-"+direction, null); + jumping = true; + return; + } + + if (jumping && Self.Grounded()) { + Self.StopAnimation(); + jumping = false; + } + + if (!jumping && !Self.IsAnimating()) { + Self.PlayAnimation("idle-"+direction, null); + } + }); +}