From faf0fd99c21f18c2c2b214553bab5058cd237347 Mon Sep 17 00:00:00 2001 From: Thomas von Dein Date: Sun, 31 Mar 2024 20:16:15 +0200 Subject: [PATCH] Changes: - use toggle tile for all toggling entities (transient, switch, door) - get rod of hard coded sprites (exception: particle class, to be fixed later) - changed switch sprite (rect instead of elipse) --- assets/levels/00-deadly-obstacles.lvl | 18 --- assets/levels/01-friendly-obstacles.lvl | 18 --- assets/levels/02-start.lvl | 18 --- assets/levels/03-own.lvl | 18 --- assets/levels/04-mayhem.lvl | 18 --- assets/levels/05-space.lvl | 18 --- assets/levels/gen.sh | 30 ---- assets/levels/openquell.ldtk | 197 +++++++++++++++++++----- assets/loader-levels.go | 176 +++++++++------------ assets/sprites/entitymap.png | Bin 32319 -> 33594 bytes assets/sprites/switch.ase | Bin 1303 -> 1566 bytes assets/sprites/switch1.png | Bin 508 -> 503 bytes assets/sprites/switch2.png | Bin 532 -> 543 bytes assets/sprites/woddendoor.ase | Bin 0 -> 1534 bytes components/components.go | 1 + components/transient.go | 18 +-- config/static.go | 19 ++- game/levels.go | 32 ++-- grid/grid.go | 27 +--- src/entitymap.xcf | Bin 63842 -> 67494 bytes systems/grid_system.go | 4 + systems/pair_system.go | 1 + systems/transient_system.go | 12 +- util/ldtkhelpers.go | 48 ++++++ 24 files changed, 334 insertions(+), 339 deletions(-) delete mode 100644 assets/levels/00-deadly-obstacles.lvl delete mode 100644 assets/levels/01-friendly-obstacles.lvl delete mode 100644 assets/levels/02-start.lvl delete mode 100644 assets/levels/03-own.lvl delete mode 100644 assets/levels/04-mayhem.lvl delete mode 100644 assets/levels/05-space.lvl delete mode 100755 assets/levels/gen.sh create mode 100644 assets/sprites/woddendoor.ase create mode 100644 util/ldtkhelpers.go diff --git a/assets/levels/00-deadly-obstacles.lvl b/assets/levels/00-deadly-obstacles.lvl deleted file mode 100644 index 48de769..0000000 --- a/assets/levels/00-deadly-obstacles.lvl +++ /dev/null @@ -1,18 +0,0 @@ -Description: open the door -MinMoves: 2 -Background: background-lila - - - - ####### - #o # - # t # - #> S <# - # # - # ^ # - ####### - - - - - diff --git a/assets/levels/01-friendly-obstacles.lvl b/assets/levels/01-friendly-obstacles.lvl deleted file mode 100644 index 3e0322e..0000000 --- a/assets/levels/01-friendly-obstacles.lvl +++ /dev/null @@ -1,18 +0,0 @@ -Description: test obstacles -MinMoves: 14 -Background: background-lila - - - - ############# - # t # - #> S # # - # ># ^# - #< #W##### - # o v# o# - ############# - - - - - diff --git a/assets/levels/02-start.lvl b/assets/levels/02-start.lvl deleted file mode 100644 index 25a86ae..0000000 --- a/assets/levels/02-start.lvl +++ /dev/null @@ -1,18 +0,0 @@ -Description: collect all yellow dots -MinMoves: 7 -Background: background-lila - - - # ############ - # # - ############ # - # o S # - # ######## ### - + # - ############ # - # o # # - # # ######## # - # # o - # ############ - - diff --git a/assets/levels/03-own.lvl b/assets/levels/03-own.lvl deleted file mode 100644 index 5803282..0000000 --- a/assets/levels/03-own.lvl +++ /dev/null @@ -1,18 +0,0 @@ -Description: some enemies can be moved -MinMoves: 5 -Background: background-lila - - - - - ######## - # o +>o~+pTJprk1bh#F?}CcY=Ep4AYDPHVj?o#`zfJ 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 delta 68 zcmbQoGo6b`oOL2o9j`Sr1H-S6>0Wbdi1NQ@vF@Ld1L_t(oh3!{8Yr;Sne%i*5As{%}MG6hLm4Z-^Zut!z`wRL< zT-&|wPP%j}h+s>nw85>AU~%ySS`iIWL$QNR@RHo+axr!Bfxunv&HFs>z3+Vl*ki{y z@V>Y_DXo$weg1fNc_lCT)9ZC2q|=uc0O0X{0-&^VL`bZUwtoe^S_c3$I$5-a3u5e0 z)Tt8@ubp9}&>GHtb4L>MNb*B-m%G=vJ^jZ_rEDcBacQjn`%2su9opr1ateYGI_ z>L9Th&`b$8-Oo@vrU23WYo-LC31-Xh!h|o;FMWfpmwB;QA?=Roj zzoj4uLHj^r0)NVBIov2o0RT|U&h#=RYQU>>R&g5wY^q3nK~u0000v8U_<3#DthM!41*@L!-e28XU~k(%!$GG%P$xm%HBmp7-v(w^v}J zHES!_aI{xg#0`CXfAhGBApGI^Bo^qT(*ywAU4H;5EQpB&Z-3CL)UBETfO=a)b2MG* z+g6>FL?rv3WhK!ZeTMp_SAYf-nHaQe56+U%fNZ3yQr?19NjV9#uTH3KvY+9ODdy6l zJcw+71|Bwc0RVY8Qbwc=1oz($Cs3LZG`^84YhJsq&%8tot^zj)vWG=!xL+MRjr((Y zY)V_egLmvSbAQ~espGh0G2zk%XmB3*X`BK8^x+EUls<-Wz=Z}#68f`R1n4yIMGe*O92GKT>Nm#3M~K1Ts78z4HXg)5?p zV!MzGTK3XsxHsI1W`Nvc{v&@0W{GNmbqAnLrt34IiB8|EShxyO4Ros}EGvoLP@}!S zq=UT6jgYnMTm$vC7)*5aGDR`>R~uMSMluj}5*4UlYyUCXXzls|TTRI|iDwC`00000 LNkvXXu0mjfic8aO diff --git a/assets/sprites/switch2.png b/assets/sprites/switch2.png index af512af0b51f7f83d5b906a78406367324de576f..a445ebe7ff38e438c2f1ec1dad6428c746e0a4aa 100644 GIT binary patch delta 504 zcmV#iVzOkl;^x#3(KTP8 zb2q0#hmQRKPJV%c2)2|uwBl9?wSrWUmMRFgm|_RbHGeOcL~-#4l3f10&vWm+cNc*z z8)nCPp>UL)uUqu~?S<$@tm1c1XKN81KU4t#w>Mt^vUA-;gn#zZs%VzV0Dww8hU#Ey zy0;rNsNN&i=TtR{>R@8K&zu1#K`#@X+K`C5;c0-ir$Grk1gnB+2u?17&CKK}kLz!h zw2LXuRtLUj!Txa)0PyqrNo@lFCuk7m5zwH=q#AG=e_e)rgJO$ZgCjeKoB~$p=ld#_4oW4(7$5B zU|fRTa5Uhy2RH@e`I)DQ#iy8k6?8PvER~_EQMCFoYG4464}YmWbW1zcK&9?2taJ4| uMKQ&Zwp%ZK8Son5R9lz;0000QeQ?sAEWiw^{j+~xf}?|XO2 z1=wlJ+OyxdJWVe*4SoK2H@HDN{Hb}p5$M-T1px4P{|O+yB!4D?yoc7MR-ps{DAyyX z45pU8fZw1bBhhiX9ztdC?dTV-01fD7qEj6jaF$#Rh-T_nzNcVa^1TQz^3L7b$UAnm zMOs2~tOL&mXkc?+I2lJRI}(n^odWy(+u`A4+;IWGRpY=iPL^jzTT4jd24WeF3OB>- zl2UUh>KM7nf`8iYYYOaeDK%$~Rn)Q3{<%3v_@T*!10Ht)D{C73_Uu?Frmz75=Vk8| z?rMN6LbAOGTv5lyMMTcV1`UFr7Fam8~C#4?)0L@^pbZnAJK zvC{1cpj`~GRE!3IZVzuKM=ODS8(0OlRs(M8REL(&aAv!|@67-?#jGM(o^j6tOarVl z04B)fC jAby}`ZT-h&r>*M`4~VZX|M%uE00000NkvXXu0mjf+M(yO diff --git a/assets/sprites/woddendoor.ase b/assets/sprites/woddendoor.ase new file mode 100644 index 0000000000000000000000000000000000000000..3628e5684e6832bc5e336c84442fe8ef432446ee GIT binary patch literal 1534 zcmcJPdrT8|9Kf$AmH=b80D@WyV;KXwR_IWm(!(%DoV>&d4wW}P07pleg$=x!jz`UA zRTQV;F@l6;9aLeIZH;9p^F@^cLPc>!0kJ3)ij>mU-o96tj3wKj`(5tSM5~9RJ5quS5{ToQ-8xVg?sD$sU#|mrdsa7u-C2 z|GMI{><)r>x~{_!gyrE4ED2%)McX$3dq497&bDs>;xl~Ujk|k+86p(ODv1R$5_bUK z2@C_Sqk01U{33uMXfiPBKq)Zx!q31{Pk#e0;7@_7QGyLkSAYld&H=-=a)GqKXrPlT z9k`7W4?Or*Ca~I<1C%qq0OIjHf>-JZ3JBXL5y8M_1~G3Tg|LdHL;-y$gny{dMqoUX za27@<0xxH$1MwCPUIFW{5`m@hg*AW$fO<%WZX$Yy54q3^p->5l&@J6fgsUKQgoxrqkGC?(-zC zyS!4d!EF##tD3RbQ>Nu9dr@^=&a^(zeWGbzycqkKWsEA>fh&!%ZeDEDP8RcJ*F$u1 zyiOOXNo1$^6<@C%q;lKMG5oDqg=(R;douY{cF+L6I=nyf7&^%5rq-ys$peEIpX}Ew zuv>lVN=>CRd$Lwr*Voi0)bBy>N!KSB8vdA%!IL%(wbg27%skVef!~Eov%iVQlxERJ zCBDA%!R{Ap7UfaqESyy$F>nn^W25Nk0C{N0v^reL>R*a7#bC1oX0gU*_B!|Bx4+;u zd5h+T9J#FRSHssPoRpCB(N~XPbFD4!JsDZP)6THd(^Z#VyAoy};r7_JEUe(gPfo*L z6zhSwrW@`wt1L-SdbdzUd*JCPxK<@A;F)E0qU2kLQ>5kujqs7*O@ml$W( literal 0 HcmV?d00001 diff --git a/components/components.go b/components/components.go index 18b8744..f101b13 100644 --- a/components/components.go +++ b/components/components.go @@ -7,6 +7,7 @@ import ( // virtual location, aka tile address type Renderable struct { + Pos *Position // just for debugging, will not used as positiion! Image *ebiten.Image DamageImage *ebiten.Image Damaged int diff --git a/components/transient.go b/components/transient.go index dfb7e1e..2754384 100644 --- a/components/transient.go +++ b/components/transient.go @@ -1,24 +1,10 @@ package components import ( - "log" + "github.com/hajimehoshi/ebiten/v2" ) type Transient struct { Activated bool - Sprites []string - Current int // sprite index -} - -func (trans *Transient) GetNext() string { - if len(trans.Sprites) > trans.Current { - trans.Current++ - return trans.Sprites[trans.Current] - } - - log.Fatalf("not enough sprites in transient tile, have %d sprites, index requested: %d", - len(trans.Sprites), trans.Current+1, - ) - - return "" + Wall *ebiten.Image } diff --git a/config/static.go b/config/static.go index de1dc20..4517b06 100644 --- a/config/static.go +++ b/config/static.go @@ -13,13 +13,18 @@ const ( All ) -const PLAYERSPEED int = 5 -const PARTICLE_LOOPWAIT time.Duration = 250 * time.Millisecond -const LEVEL_END_WAIT time.Duration = 500 * time.Millisecond -const version string = "1.2.2" +const ( + PLAYERSPEED int = 5 + PARTICLE_LOOPWAIT time.Duration = 250 * time.Millisecond + LEVEL_END_WAIT time.Duration = 500 * time.Millisecond + version string = "1.2.3" -const MenuRectX int = 600 -const MenuRectY int = 0 -const MenuRectCellsize int = 32 + MenuRectX int = 600 + MenuRectY int = 0 + MenuRectCellsize int = 32 + + LDTK_Entity_Ref string = "Entity_ref" + LDTK_Toggle_Tile string = "Toggle" +) var VERSION string // maintained by -x diff --git a/game/levels.go b/game/levels.go index df53fe7..c698755 100644 --- a/game/levels.go +++ b/game/levels.go @@ -8,6 +8,7 @@ import ( "openquell/grid" "openquell/observers" "openquell/systems" + "openquell/util" "strings" "github.com/hajimehoshi/ebiten/v2" @@ -173,20 +174,27 @@ func LevelToSlice(game *Game, level *ldtkgo.Level, tilesize int) (Map, Map) { tile := assets.Tiles[entity.Identifier] tile.Id = entity.IID - ref := entity.PropertyByIdentifier("Entity_ref") - if ref != nil { - if ref.Value != nil { - refid := ref.Value.(map[string]interface{}) - tile.Ref = refid["entityIid"].(string) - slog.Debug("LOAD TILE", "tileref", - tile.Ref, "tileid", tile.Id, - "name", entity.Identifier, - "isswitch", tile.Switch, - "isdoor", tile.Door, - ) - } + toggleRect := util.GetPropertyToggleTile(entity) + if toggleRect != nil { + tile.ToggleSprite = tileset.SubImage( + image.Rect(toggleRect.X, toggleRect.Y, + toggleRect.X+toggleRect.W, + toggleRect.Y+toggleRect.H)).(*ebiten.Image) + } + tile.Ref = util.GetPropertyRef(entity) + if tile.Transient { + slog.Debug("LOAD TILE", "tileref", + tile.Ref, "tileid", tile.Id, + "name", entity.Identifier, + "isswitch", tile.Switch, + "isdoor", tile.Door, + "togglerect", toggleRect, + "tilerect", entity.TileRect, + ) + + } tileRect := entity.TileRect tile.Sprite = tileset.SubImage( diff --git a/grid/grid.go b/grid/grid.go index 0626f6f..6992252 100644 --- a/grid/grid.go +++ b/grid/grid.go @@ -126,7 +126,7 @@ func NewGrid(world *ecs.World, case tile.Transient: entity := transmapper.New() pos, render, transient = transmapper.Get(entity) - transient.Sprites = tile.TileNames + transient.Wall = tile.ToggleSprite case tile.Destroyable: entity := destructiblemapper.New() @@ -139,16 +139,16 @@ func NewGrid(world *ecs.World, case tile.Switch: entity := switchmapper.New() pos, render, _, switcher = switchmapper.Get(entity) - switcher.CloseSprite = tile.Tiles[0] - switcher.OpenSprite = tile.Tiles[1] + switcher.CloseSprite = tile.Sprite + switcher.OpenSprite = tile.ToggleSprite switcher.Ref = tile.Ref switches = append(switches, entity) case tile.Door: entity := doormapper.New() pos, render, _, door = doormapper.Get(entity) - door.CloseSprite = tile.Tiles[0] - door.OpenSprite = tile.Tiles[1] + door.CloseSprite = tile.Sprite + door.OpenSprite = tile.ToggleSprite door.Id = tile.Id doors = append(doors, entity) @@ -156,11 +156,8 @@ func NewGrid(world *ecs.World, log.Fatalln("unsupported tile type encountered") } - // FIXME: this image is never being used because it is - // being overwritten in game/levels.go:LevelToSlice(). The - // image is taken from the LDTK map, not from the Tile{} - // definition anymore render.Image = tile.Sprite + render.Pos = pos default: // empty cell, this is where the player[s] move. No @@ -227,17 +224,5 @@ func (grid *Grid) SetFloorTile(point image.Point) { } func (grid *Grid) SetSolidTile(tile *assets.Tile, point image.Point) { - solidmapper := generic.NewMap4[ - components.Position, - components.Renderable, - components.Tilish, - components.Solid](grid.World) - grid.Map[point] = tile - - entity := solidmapper.New() - pos, render, _, _ := solidmapper.Get(entity) - - render.Image = tile.Sprite - pos.Update(point.X*grid.Tilesize, point.Y*grid.Tilesize, grid.Tilesize) } diff --git a/src/entitymap.xcf b/src/entitymap.xcf index 1cd10950600ffd68583a5a7e220708e0d28d90a1..779d134e1db9df07a21467d2ae15702f332c18fc 100644 GIT binary patch delta 5844 zcmZu#e{5UT752UFJv&X4{(uKO2ptZ~<}Arx44$bsqt&6bl__a(3hOrdgVAg_qr!nK zD^MP0i`EUPViY5UQMNL9)PERJ4UjXEndj5RB@7(*&z31L@kMr?G>F6)z=kFjlAKrK_ew~B;TfLs+jqM!266JW?F^(J0 za=hy$j{Tz?xBr*p?&ml@{0hg%f6MV_8#zAzJC47qaD2_+_~0Ag;a}bs9Z!6lw@>Cc zPKy_wImFxl8{>HXn;hp{9IG{kgmm$?_#}!q@%KBgPFzLji5tG%K&9Ig|M}!vD&3pC zT{_o7LX2FqlaXtFl-;@J_bsHG^?4xTqU*LWVcnkWmUUOPlE)T>uIHH0bu{~2*VV1$ zkBh?k51FujCi~&~Yg)*yi3jePNIY|=Oim<7B)InG2KO9ye#+jzsg-rw^reKdX>Z(~ zZS7nLPGvGiFep3hpk&X_c6Rpm@`v`8gL{`mYLi*gDfK#o<-I4TrZR>h`qXASdz*o@ zk*p5{WM^}*%19~)n?MY{YuzHq)Sz_1bV{v=3)xThjMIr&W8+y5=nfXb- zf5#5~&>dwXvn0|PGD-Z>4yRGhOplF40s+ydHtFBd4CD-w^?`u&Hyc$(QekM~;7ta} zm}pAfxCZb}L02-hhj*X%JfX5vE?^t#yJiB#%vh6J_fit zJp;DW&IV!iBn7j?&)Cvo9(kI5qtIi2PJPMO$BH=V$9%cz)trPu2Oj)aP)j_TreV4@AJi)KI@3(&|# zPy+$B{Tt*saVwEaIBX;U+nsA}jd`Ji7vfQL%b_b?;<0_Qch1x1^WrY@wfVXwFVQUq zph;fS=V|i*=QGiU)JFT=!rzVCQ^Pp|7 zI8~Y$-rAT5k*#pHo(XHSNRkN?O|KyDpD=OQr5r}Uln&SPnn;88spg3)d()C(_0;gh z@B|%}mnr7(#Ma^Ftt4^x<`a`a7Aya zt7Bbbl0&w_*?N|%O(IFUOfn%9xU*)1@?zE%4xOZiF~xBFW5mk$grQJ7U$?k^n}8EVX5`}eOnP#PH; zY)oLtRybSFV6{FZ$%u)jSCIFQm^kcG?jc}GhwAxAq_6!4nn$YaO-qK=14AQ2BXme! zrkFz`gG0@OB=Kzc->t1fvDjm`=p&CjEUH3=3f9n^X^^?f zJpCA|x5HBKFtiun%O0Oy&UnSzvbe#lWX6;<;zI+uz9Mpd;Zluv<_Ptkak zgch(F>gl1OQa;s#YAC9N?5G^FdO}X1Ne|@a%#^HJL6|irZQnYB?Y6iT9|{kh(nIQ?-4ZU4WMi^OuV~(GZIBMx3dbd)@W2$9qRMhJp~L2{;Q(NtbZmE%z$F)A!l zP8P1vWf7$)1Sm>FYzZq6pnM8i^HGQvMhU`1dlU$e9cqFAm5f=uN`viqmEyH&pikgC z&6Esq#h9ASz+B*tMOTGB6UViK|FD(dp2c-&cd8}4IN80dsKnudt=|L>oDU7ohvs$% zG|e3dMBI4&Q8&LGH8>v{4b*^x3)5|BaJ5$09jL+i(BSTL*U+44aHp2}#TXB0a6s^? zWTQ!us<P^#z=SpTVcPShD(LC zAH{G?3EMF_Z27}Zpot%fhRB$#S#Fp#RuwP}D09(=Dy&sRqXm*?D>4Uu^I`*32|SF$ zOQe_;)|M3_R4W%^e!mtAYs(7}s+H0)@CC%rD@33#P9+AiysQ#g6#XE^FM&r;rC|BP z9OkM&7DjcRi@a#Z>IbF*(}h5S^Hu;XY}f!eU$Fu;HZ7)9-2vDnumWya0j!+@mNq6s zFDQ;A;9;j|N+B+#l>&tjk@NzF2%>{ga;9ssbU{g%W58ihAR1c1i63(KvItTP<3q!2 z1uGDsLK<50F^CpM3BpAE3IxawH$i|(fk~|K+#1$+SkDE}CwCks5Ger-Q<{vxWT5&( zUxfkgLR=iGEdXmuD=F{P9=up71(IjtGRB;P{-Q7MN&W4Wl zAv6KbGu7J-C8QUxXx*WEp_CMAy)QJehBVuBJ=a>4;yGurk}DQ-y6()8WDUNq%@Lg> zExoAVhnzHXNxevubGam7QrG)Oi#d>rIhrJ+3)mX%@28`sVy+*>(WEkJC*@JAf7A&y z>4#d@+b!#s2WE}MF3bad|DY39pB~q}IxUhMOazKx@SGRHAWL4V!%L*3HL5SGkEvcR zCj0yKcVr1XdvK(IH9@c%RkQEkiet;*~(C z0k0ILoKmC^A(C6b2tjZ#NX}d>nJX%}auPTU3Ja8zMQil32vQQ`Lr2*PRv z5G{-ngo*Ym5TLj{+5{0Q`TFp;ho=pHd*JU3ANmB&Q*X%!uK2q9yf7K~QG%`teFiri z{D-Xsze{i(+MId`e`v7ZF^Uf71Gat>Ja9hjCdYNQ({a5mJKAgs9_mES;tDu+K{%Hea_BjZ{t zJ)$fsN7|Wkfv*cZF7TAVGXl>GG&#yG0&f)9Bk*>_oem=3 zEr^{0_X&JT;30t%0$&$+T;M5zX9S)XXudh0roBX&aX1K2UgTOBctoQ%2X!Ad#5|=L8w+g&X;5P*FKf@B&9iqKi;9UZ@A;O}# l1_kjgf!`IlTi}BNe<1LO0v{3hn7|(kd{W@kiNBO5{tpurijn{T delta 3389 zcmai$e{54#6vyAa@2y>Q(*YC8uw-cB*hXO5ST^Tei)%t@@zr9-W#6OZJKbAc8q2%ca zN%eE`Pjl;rdFBoB@`m z1ErqURx}eKk`+Q!6~Hs32OKL(?ty_GicUK{G(1&yt6x?zS{nj>wvVN|njHM~8);nDr1nY7rRh6Z?h4f>!C8fhaQ za+Xd(ryge;^V8;1i^qdzB194pqN)HMkKX18l)}x;Efk%$-{YYml5nY8$@f9K89&OT zn=~`D(?RMdU}j<3O;NQQ1_uql)c6$tdksGe7~q6qW~mN83+vr5wRt4?v-$R>7tNL( zhS{~@`Z?~iKjmxIiBI{ONBO5b0l78LDZ@gIW)^AxX5QH7%PiE+aQc>ITs(rH7Ncdg zwV4Ill#gY65Ow(GYqpP#(G2Ne5YPC=Xp){A+P*Q6Nh5b)9N}?7*h`TlFEiyEOO7QY zjg6uVqsfwtL1)QiBqBYGjq!sl1SVVPSXA@{Keu#X>YjA3X`t3=i0V-wb2O1~9c9 z!5dg|tULsm%JJ;sM6+^(2uz`xfxW}GKy&ys4fdRcJ!f}5oCs!N(GUcK*JfeS*_{x$ zFuK;|%EF?9scaCU#vrUNnChchSR=$U!9E(I=Z1E$4`kxz4valzcgYjtRi=V{p}vsE z?GDaQK$#Q`mBfK3QlXH?BTcDPA3w-KV6ugdMMYomb4w!@Juij^ye8LqGZkZft|wp) z*#M@tJ!ndW`pQFqs~pcBPBbeQ^}rOW0oWUZu;`#zbPg7sJM?la2Ycp>g>tax+#v{- z=UfR9hL$hS!J=dRxfn#=7_2VV-%E4E%OIYK_0lLkH?(8DAj99VaErLJ>@Iaid6lVH zZ?res+1xCu^wVfb#-R5{qn(}JSc04S`+NCG76O+I2|j`-D*D0=+~UQe=f%7MdPFmf zMI9N#80DIFC;I!NiC#X17y>$!W1LRvym7ffCmd8WuzO>$=$KeETcjCmq2^#NycTGc zZ2ko<_?=zYbRiFnz%=vO^$n)c^@8c!5T-r1if{d%N7OfY&yaO^!&g;w{q5qP-}=W? zVtvy3?1AsA$R_jdgSBSOHYeS*MddcVYW?u|{Z%yX6xHHaszkiqdTfjLVmcTTiNT~w z4DPgk-s-BR!v{rT_=HLf7p<$e-Rz{J0g)KJTO~#xx6(VdRnqNsBC*}865DUKo_VXP znx^g$6Q|-Tks7u>|L6sST33mLwMr$db=FGR=OnA%ze^`il98$kl1XS&yJziyF9TjvKT4jt z0eKS=AK&?D_THwyl=4VJKw`b=pYV)N@6*5Y#|3yz=aHw8lSq90pPrHDGZg7S lUWB{^ITtw}S%+MVyaIU@a!C^g%aPY0y~yiEE^?Ar{sWm768-=H diff --git a/systems/grid_system.go b/systems/grid_system.go index fd9fa96..8586b0d 100644 --- a/systems/grid_system.go +++ b/systems/grid_system.go @@ -1,6 +1,7 @@ package systems import ( + "log/slog" . "openquell/components" "github.com/hajimehoshi/ebiten/v2" @@ -53,10 +54,13 @@ func (system *GridSystem) Draw(screen *ebiten.Image) { counter := 0 for query.Next() { sprite, pos, _ := query.Get() + counter++ op.GeoM.Reset() op.GeoM.Translate(float64(pos.X), float64(pos.Y)) + slog.Debug("rendering tile", "sprite", sprite) system.Cache.DrawImage(sprite.Image, op) + } op.GeoM.Reset() diff --git a/systems/pair_system.go b/systems/pair_system.go index c1735f0..9687bb6 100644 --- a/systems/pair_system.go +++ b/systems/pair_system.go @@ -72,6 +72,7 @@ func (system *PairSystem) Update() error { if ok { // player moved on top of the switch switcher.Toggle() + // open door door := system.World.Relations().Get(query.Entity(), relID) EntitiesToSwitch = append(EntitiesToSwitch, diff --git a/systems/transient_system.go b/systems/transient_system.go index 7569771..7c49266 100644 --- a/systems/transient_system.go +++ b/systems/transient_system.go @@ -26,7 +26,7 @@ type TransientSystem struct { type TransientToWall struct { Entity ecs.Entity - NewSprite string + NewSprite *ebiten.Image Position components.Position } @@ -77,7 +77,7 @@ func (system *TransientSystem) Update() error { EntitiestoMakeSolid = append(EntitiestoMakeSolid, TransientToWall{ Entity: query.Entity(), Position: *transientposition, - NewSprite: transient.GetNext(), + NewSprite: transient.Wall, }) slog.Debug("transient added to make solid") } @@ -91,18 +91,20 @@ func (system *TransientSystem) Update() error { system.World.RemoveEntity(convertible.Entity) // replace with solid entity - slog.Debug("transient add solid") + slog.Debug("transient add solid", "wall", convertible.NewSprite.Bounds()) entity := system.SolidMapper.New() pos, render, _, _ := system.SolidMapper.Get(entity) // set it up apropriately pos.Set(&convertible.Position) - render.Image = assets.Assets[convertible.NewSprite] + render.Image = convertible.NewSprite + render.Pos = pos + slog.Debug("new render", "render", render) // also setup the grid tile with a new solid, so that // collision detection works system.GridContainer.Grid.SetSolidTile( - assets.NewTileBlock(convertible.NewSprite), + assets.NewTileBlock(), convertible.Position.Point(), ) } diff --git a/util/ldtkhelpers.go b/util/ldtkhelpers.go new file mode 100644 index 0000000..ee409f1 --- /dev/null +++ b/util/ldtkhelpers.go @@ -0,0 +1,48 @@ +package util + +import ( + "openquell/config" + + "github.com/solarlune/ldtkgo" +) + +type TileSetSubRect struct { + X, Y, W, H int +} + +func Map2Subrect(raw map[string]any) *TileSetSubRect { + + // we need to translate this map for less typing + return &TileSetSubRect{ + W: int(raw["w"].(float64)), + H: int(raw["h"].(float64)), + X: int(raw["x"].(float64)), + Y: int(raw["y"].(float64)), + } +} + +func GetPropertyRef(entity *ldtkgo.Entity) string { + ref := entity.PropertyByIdentifier(config.LDTK_Entity_Ref) + if ref != nil { + if ref.Value != nil { + refid := ref.Value.(map[string]interface{}) + ref := refid["entityIid"].(string) + + if ref != "" { + return ref + } + } + } + + return "" +} + +func GetPropertyToggleTile(entity *ldtkgo.Entity) *TileSetSubRect { + + ref := entity.PropertyByIdentifier(config.LDTK_Toggle_Tile) + if ref != nil { + return Map2Subrect(ref.AsMap()) + } + + return nil +}