From 3d18643be057ed1fe1a5a0e6b4d8da918488b229 Mon Sep 17 00:00:00 2001 From: Elizabeth Hunt Date: Tue, 12 Mar 2024 19:10:55 -0600 Subject: [PATCH] add grass --- public/assets/sign.png | Bin 2015 -> 2240 bytes src/engine/TheAbstractionEngine.ts | 2 +- src/engine/config/sounds.ts | 8 +++++--- src/engine/entities/Grass.ts | 21 ++++++++++++++----- src/engine/levels/Tutorial.ts | 32 +++++++++++++++++++++++++++-- src/engine/systems/Grid.ts | 7 +++++++ 6 files changed, 59 insertions(+), 11 deletions(-) diff --git a/public/assets/sign.png b/public/assets/sign.png index 006badd03725354053d106879ecb738880ffb949..f9e0c6f1ec4e6a9dffd85b2229b7cee2ecbb0ebc 100644 GIT binary patch delta 2195 zcmV;E2yFM?55N(SBYy~ONklOFhtNb1AoH+U59^w9|jm2=$e6H zfUd(ozz+iq4Rp=GFhJMgAK(|x04LYi{>u%^>CLT$yZ+p3ANwr^1Jwk?5w?_?7KX6K z)dGW*Z_aTXo@#PnVgL@f6lo`(eLA?yKUaP~uartZAUf^ zaPakqujF!4WWQ1Zp!gx6_Z~Yn$I%))Tu2EHeE1g)yMM$4Yy-H=M@9d}OOKn2`L8Q~ z2haKN1NQ{Cl?XoWc^!Ty{!s9LxcIY*i#reBqB`CkT!I5I0F6JGUW(fSFD8tOU2Fgc z96-m!s*Yyh1R)b}3COuV9DFQ(obg+5QHukg_^I$qXdss8VsYbWAj<$g0$kQF0UCgv z-rSm2SASQh-QC>-e{MW-c#hpi5C?pY_-Xcs>Q_SmIoDUi1T_AwlOOP6fn98X7dP&k z$0sCKDqgGKV$l=hLN2KTU@Y-G4eAz5hYBXn-6_fNMoSl$_Oo5WzkH zKnBF(=Olsm-hFF^+u?uenHRG73RS|I27u~^4Zy(-6&>T3@(_wYcLov}02APx&k?^5 zyo7{M1}td+p8z29o!B@&^Uy~he-<@!2)|_#;EEu(0swxf{#5)<2QmCO=|S?te{zyR ztbYP>x&XBS90@M?Ihj9{`6L+;G61Z~KoDyffVO`U@k6jRmC#BAoa#rDA5^BCB0$igD~cjX3l=JSCBa&j{v1iz#KQvEM(|5BOXm465}#V<8MC<$0q zfK=>p1xO{qSdx?Ax9R}c1|S)Bmi=>r?|(8yOypb=YE*!f0C4-0s(>kcA#=nA=ui@< zWdKh5m%^9Y9-4u)2~ceS-%_Py)q~pxwWt8J`f&!pRE0}zk1YvP5qPdM8E0P`lu7{H z3K-HwDmnO$vx^TjHF#eXc6 zGJw_6rv$%M2cR+lX8_I-KW9nQDg$T?pv{2N0T41`YzEL8z$gAt1x&5}#5w|r_}%$@ z@t0s$89=#pUW0PM_Ul>syc;LHHl_d!A;DB1qdb8GP9nNV^+#25eS2H^C-v;s(- zpDOz!3UGDNEIN}ysQf9Ww+aZOzdY_}4Bb_;|J;QlWCvN8skdiP6=4BtCuN*N%>{51rC-@SyN zOLEsozL{nwej0aa>@~6W>43&x6MGg}_}wrTCdhTXZ$J7P4$H4W(tpp($$~K~76PE6 zr^2_+{2>nTzqix?j=v`MECX0&1WK;toid>}QdoQs*e7PK33AMy!-EfZDaY05Ats1H%AI*8XS=K!e{h14?jcj(>qF@aF5UO}F21_w@ex zwwaAJ8x^3l3IGBa!QU(Y zy%-?W{)M<-er>H2pmHSTF#zfDr$d_=f?wQB>@YGoWjM@Ep`?2vopf zA36-MeWm`pp$2T@Ji64JPM$8G~)z#2=3kh_(o8#L$KqZ zr={Sr3bfw>;q2!U$XDCnb@4Q)?_L1h4eucdj8z~s1AjmT7zWsT9Hd7BINYr(V3QkR z^jVl5g73Qz&|@1IssgPvFbu#L;w*Nh0)Q;o`vZa98o&wQoy`yC+FGWsL`n=X46ygL z*hT3AnpA+0aISUn;~{u(5KbR8bx_p+F#*&BEy>(g$3O+3=j#Q3Dhbr)p}GOAgfz}G V7_eaAe+a+vgHOU|ea(}(2PT)s1(E;& delta 1968 zcmV;h2T%CG5#JAxBYy{sNklw{79kIi5H3VTND9+fTmq?t$b7gj`%dO(|IJUBeVd!) zn=_fU_Fil6nRC8#V)GwoU||MMER5ZuI|G{wz>{EU23!D3hkxI}y8t`~mS(^Ouyptx zybHi{U}*+i085A8!MgxF2bN}FIssh2cIhcKB3G_{Gu`^BYxi+;FwiZ5sEPgdJ8x#0 z`S;1=W1k)T@%OR6j}QbE7d6}?Fi_W~8OPzNCkG}1pnxkSHYPSsat`T15WUC)%v4-d z9Cz>Brw&by>wk@(x>ycR5)P!eMFNNuo&rvj*i@3kxE>-1_yMyuu9GjkScF^q|9a!6 z#-_GzJdcC}DQ>m^aPY&T_g;GC7zh76`isg*lW|fasEYyo5YU%jedFlT(b!=jEjhsW zXTvVR%@P2B?~(Lze~%M%|MY9we3g(ON&eY_k1@33Ab%DASwt@tzgPemcqv(_$rX?L z;;Wyw!^6XEZ*T9J-(P);3Hhve@ae9Uui6Nr<)H+D`QadLnxfD{1`kW#Yd zk~sW3{G^h+bX^#q69ET2hg50;v@io$C+4|i0xkAJ7=J4HTi`B(=dX z;*xaeT7U9deV$4J4tS{mN(mq}1Fi{Nzji5G1+4`T_x-8r-vW1tZ|TRP3s4CFgZ}8l z4|Z$)_PZZQqWJCRjqTvz-nPI0)^_&2_p|LzNi4Y}uoeL&0XSyxx!qJh z|MF{5%sKoL6X>-U%C*0-=tCZq@MF^h^TWTnW?<0avJ>F4nQP;xc#Y>ec0fY zl3YSUj|z|yKO`8Z0@m>5#8KM=r3|2#05}z}hOhQ{iU*7Miv?i4>zA}ay(>V;0c)o? zwF+1JJa<1NCjcuElnj7d0dr!mnM3J*kbkxV5DUNxe62l@I3VW~ptcFNssJS%67h%m zN_&7F0Z+y9J4<_?@It7Z8KyvDndK^M~3L+7|MFjv8w2prl0mSFv z5(ki!O{xQONsuH#d?(Zb50^)abANCN_L<|)jlHM>SU5n-9+*plBnhMsg2gulr4Pil zZhwH2un{iYZDl_QN4Y6VF%v8ClLQdRh>6fT;4D3$<``7l25Q=%9_?Q$?wXr{xWZ}U zZ?OR;AA{xupxp>llwN8JtVkG90l4iBW$$Bk`h)q%RR9>Ht%On@QWZc_`G3U~0LZR6 zDE?gQm_SwlAAVYH04YhJ{YD%o`1s2qt)Ks)V2>*S{Jn=MTD3o{3Q#MD6d_oBZ7%mp z5{Uy))=hCi$~>Ae_|-G1SB$j6&W*cOj7wZu8Xvg=)HX%j;MU&#QkpOKj+t4K0Iywx z6VFq6uTD$cIPT%klJDtSaen}7u`~d-0Jx686^3+t>m;aE0qMFm*MZwwe)*@i9{f@? zi5P10OFq}cUL*hzfz%NsAmeM|Qrja5W)K0!-2-zeR#*%$u9qmRcn}L9E{zsR&6#6V z@LM_{rGFlUn;M&xD5%$R##!;87650_VeG{V=bpZP>eMrrJ$U#qe1D~``+B(R$K$Po zZ531vrXJVMlmp!pE`Wdc?3o?UzyJB*i0|i70Fq>xDfp80TU;|!4h$6l7QspaSlIxe z3;68Hr@Qwejn07~0+r+uT%wRF@Yf!09t@m z1(3q;0vKZeLj(ZoUw?HIoN_-Gz~TZ}B>`4%fo8)$qynT)L0kZ19MEE4!3b4)| zU?v0f3czk)^cSq&0?l+E#08+wXZ8$uBe?P=7-JvR0k{Cz>3^%gAh!`*;ZX=b1&W>p zTFn9Dhrw368}6q-(I(ghu-11X{1nJffp*`Do8@UpeM85eVWt+)_W=C(sjkS~30|T9 z2jXTjfFT0F$6%|qK=BC>;9p4qxqZ+G4!R2fz=z-Xp|}y?RaUOJIEVo7!zOqo{J0We z8b`boVTb@y1SO0BugGEbr62;BXf^z50*xjZDgYx4K8-UVX5c@7F6KbB@pCnkng}K! Ch=9)k diff --git a/src/engine/TheAbstractionEngine.ts b/src/engine/TheAbstractionEngine.ts index 0dc75aa..d130a6f 100644 --- a/src/engine/TheAbstractionEngine.ts +++ b/src/engine/TheAbstractionEngine.ts @@ -46,7 +46,7 @@ export class TheAbstractionEngine { new GridSpawner(), new Collision(), new Life(), - new Music(), + // new Music(), new Render(this.ctx), ].forEach((system) => this.game.addSystem(system)); } diff --git a/src/engine/config/sounds.ts b/src/engine/config/sounds.ts index d6c564f..5900ef0 100644 --- a/src/engine/config/sounds.ts +++ b/src/engine/config/sounds.ts @@ -22,29 +22,31 @@ export const LambdaTransformSound: SoundSpec = { export const LambdaSave: SoundSpec = { name: "lambdaSave", url: "/assets/sound/lambda_save.wav", + volume: 0.3, }; export const Failure: SoundSpec = { name: "failure", url: "/assets/sound/failure.wav", - volume: 0.5, + volume: 0.3, }; export const ModalOpen: SoundSpec = { name: "modalOpen", url: "/assets/sound/modal_open.wav", - volume: 0.5, + volume: 0.3, }; export const ModalClose: SoundSpec = { name: "modalClose", url: "/assets/sound/modal_close.wav", - volume: 0.5, + volume: 0.3, }; export const KeyOpen: SoundSpec = { name: "keyOpen", url: "/assets/sound/keyopen.wav", + volume: 0.5, }; export const Music: SoundSpec = { diff --git a/src/engine/entities/Grass.ts b/src/engine/entities/Grass.ts index 70fd601..75c03f7 100644 --- a/src/engine/entities/Grass.ts +++ b/src/engine/entities/Grass.ts @@ -1,5 +1,5 @@ import { Entity, EntityNames } from "."; -import { Grid, Sprite } from "../components"; +import { BoundingBox, Grid, Sprite } from "../components"; import { IMAGES, SPRITE_SPECS, SpriteSpec, Sprites } from "../config"; import { Coord2D } from "../interfaces"; @@ -11,17 +11,28 @@ export class Grass extends Entity { this.addComponent(new Grid(gridPosition)); + const dimensions = { + width: Grass.spriteSpec.width, + height: Grass.spriteSpec.height, + }; this.addComponent( new Sprite( IMAGES.get(Grass.spriteSpec.sheet)!, { x: 0, y: 0 }, - { - width: Grass.spriteSpec.width, - height: Grass.spriteSpec.height, - }, + dimensions, Grass.spriteSpec.msPerFrame, Grass.spriteSpec.frames, ), ); + + this.addComponent( + new BoundingBox( + { + x: 0, + y: 0, + }, + dimensions, + ), + ); } } diff --git a/src/engine/levels/Tutorial.ts b/src/engine/levels/Tutorial.ts index b720346..a8ba8d0 100644 --- a/src/engine/levels/Tutorial.ts +++ b/src/engine/levels/Tutorial.ts @@ -3,21 +3,49 @@ import { Game } from ".."; import { Curry, FunctionApplication, + Grass, LambdaFactory, LockedDoor, Player, Sign, Wall, } from "../entities"; +import { Grid, SystemNames } from "../systems"; +import { normalRandom } from "../utils"; export class Tutorial extends Level { constructor() { super(LevelNames.Tutorial); } - public init(game: Game): void { + public init(game: Game) { + const grid = game.getSystem(SystemNames.Grid); + const dimensions = grid.getGridDimensions(); + + const grasses = Array.from({ length: dimensions.width }) + .fill(0) + .map(() => { + // random grass + return new Grass({ + x: Math.floor( + normalRandom(dimensions.width / 2, dimensions.width / 4, 1.5), + ), + y: Math.floor( + normalRandom(dimensions.height / 2, dimensions.height / 4, 1.5), + ), + }); + }); + const entities = [ - new Sign("TODO: Explain entities", { x: 4, y: 3 }), + ...grasses, + new Sign( + "this is a Lambda Factory

modify the produced term by interacting from the top or bottom ↕️

then produce the term by pressing the button on the left or right ↔️

", + { x: 4, y: 3 }, + ), + new Sign( + "this is a Term Application; interact to view its code

push the term ➡️ created by the factory any direction into the Application to produce a new one 💭

. _INPUT is the term replaced by the pushed term

. in this case _KEY is applied to the function to make a new KEY! 🔑", + { x: 4, y: 6 }, + ), new Wall({ x: 10, y: 9 }), new Wall({ x: 10, y: 11 }), new Wall({ x: 11, y: 10 }), diff --git a/src/engine/systems/Grid.ts b/src/engine/systems/Grid.ts index c504bfe..3c0e995 100644 --- a/src/engine/systems/Grid.ts +++ b/src/engine/systems/Grid.ts @@ -28,6 +28,13 @@ export class Grid extends System { .map(() => new Array(columns).fill(null).map(() => new Set())); } + public getGridDimensions() { + return { + width: this.grid[0].length, + height: this.grid.length, + }; + } + public update(dt: number, game: Game) { this.putUninitializedEntitiesInGrid(game); this.rebuildGrid(game);