From 82c67551aa5c42acc1dba34a011c379b2fe8fcce Mon Sep 17 00:00:00 2001 From: Thomas von Dein Date: Fri, 29 Mar 2024 11:51:05 +0100 Subject: [PATCH] changes: - exchanged switch+door sprites - added asesprite cheat sheet - implemented door toggle on switch toggle --- asesprite.org | 23 ++++++ assets/levels/openquell.ldtk | 10 ++- assets/loader-levels.go | 4 +- assets/sprites/door-closed.png | Bin 280 -> 0 bytes assets/sprites/door-open.png | Bin 250 -> 0 bytes assets/sprites/door.ase | Bin 1056 -> 1224 bytes assets/sprites/door1.png | Bin 0 -> 477 bytes assets/sprites/door2.png | Bin 0 -> 446 bytes assets/sprites/entitymap.png | Bin 32219 -> 32319 bytes assets/sprites/switch-closed.png | Bin 464 -> 0 bytes assets/sprites/switch-open.png | Bin 463 -> 0 bytes assets/sprites/switch.ase | Bin 1210 -> 1303 bytes assets/sprites/switch1.png | Bin 0 -> 508 bytes assets/sprites/switch2.png | Bin 0 -> 532 bytes components/pairs.go | 22 +++++- game/levels.go | 10 ++- grid/grid.go | 12 ++-- src/entitymap.xcf | Bin 63094 -> 63842 bytes systems/pair_system.go | 117 +++++++++++++++++++++++++++++++ 19 files changed, 184 insertions(+), 14 deletions(-) create mode 100644 asesprite.org delete mode 100644 assets/sprites/door-closed.png delete mode 100644 assets/sprites/door-open.png create mode 100644 assets/sprites/door1.png create mode 100644 assets/sprites/door2.png delete mode 100644 assets/sprites/switch-closed.png delete mode 100644 assets/sprites/switch-open.png create mode 100644 assets/sprites/switch1.png create mode 100644 assets/sprites/switch2.png create mode 100644 systems/pair_system.go diff --git a/asesprite.org b/asesprite.org new file mode 100644 index 0000000..cf478af --- /dev/null +++ b/asesprite.org @@ -0,0 +1,23 @@ +| key | sub key | function | hint | +|--------------+------------+-----------------------+----------------------------------| +| b | | brush | | +| | d | draw | | +| | s | shape | select color range before | +| | x | switch color order | | +| | a | alpha shape | | +| | ctrl+wheel | brush size | | +| c | | pick color | | +| e | | erase | | +| z | | zoom | click and drag, left+right click | +| middle mouse | | move canvas | | +| f | | fill | inside selection | +| ctrl-d | | no selection | | +| m | | marquee | rect selection | +| w | | select by color | contiguous: all or only region | +| q | | lasso select | | +| tab | | hide/show layers | | +| v | | switch layer | by click on region | +| alt-n | | new frame | | +| shift-n | | new layer | | +| ctrl-f | | hide/show ui elements | | +| shift-o | | outline tool | | diff --git a/assets/levels/openquell.ldtk b/assets/levels/openquell.ldtk index fdb99a6..ad85207 100644 --- a/assets/levels/openquell.ldtk +++ b/assets/levels/openquell.ldtk @@ -6096,7 +6096,15 @@ "height": 32, "defUid": 65, "px": [224,224], - "fieldInstances": [{ "__identifier": "Entity_ref", "__type": "EntityRef", "__value": null, "__tile": null, "defUid": 68, "realEditorValues": [] }], + "fieldInstances": [{ "__identifier": "Entity_ref", "__type": "EntityRef", "__value": { + "entityIid": "7d975370-d7b0-11ee-9add-971995295000", + "layerIid": "50624190-d7b0-11ee-968e-3dbcbdc42f40", + "levelIid": "50621a80-d7b0-11ee-968e-a98c2d35fbdb", + "worldIid": "267ee1a0-d7b0-11ee-a97e-53f0a359eae1" + }, "__tile": null, "defUid": 68, "realEditorValues": [{ + "id": "V_String", + "params": ["7d975370-d7b0-11ee-9add-971995295000"] + }] }], "__worldX": 0, "__worldY": 2976 }, diff --git a/assets/loader-levels.go b/assets/loader-levels.go index e44b982..2dc1893 100644 --- a/assets/loader-levels.go +++ b/assets/loader-levels.go @@ -240,8 +240,8 @@ func InitTiles() TileRegistry { "HiddenDoor11": NewTileHiddenDoor("block-greycolored", "damage"), "HiddenDoor12": NewTileHiddenDoor("block-greycolored", "damage"), "HiddenDoor13": NewTileHiddenDoor("block-greycolored", "damage"), - "Switch": NewTileSwitch([]string{"switch-open.png", "switch-closed.png"}), - "Door": NewTileDoor([]string{"door-open.png", "door-closed.png"}), + "Switch": NewTileSwitch([]string{"switch1", "switch2"}), + "Door": NewTileDoor([]string{"door1", "door2"}), } } diff --git a/assets/sprites/door-closed.png b/assets/sprites/door-closed.png deleted file mode 100644 index a2eb837c23dcb96fd874fc364497724629c30618..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 280 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}mpok@Ln2y} zWA^;HP~XPLqQe6O?*1|I0;luu>^geDM8QnCk+GbCo0(ZfLxc5X;XfX;X;~meJe@P| zip+L5iU8{T|C>MV&;I`pj@GlEf7IxCW7eiy|4mc3dTyGNmAT-)xlG>1MJ*;5`y@WN zc$l)^*>%oackv1K#hDE<1~oDUvpC#^A2wJgmnsKk)m3Cy->5ex=Rm~UINis8w?oNBc#4vSF W+##XW?IA$lF?hQAxvX|!l!__eoIL&$vUoD)L3S3Yssq%2{Yx^<-#>o>5WT<5^HgJ+58 zfmhm9RtX|KO@RhnZU;3aSQjUV1g!nJwc_W({~P$u^+s>+$eXh1!m4byH9LDw=q)$j uQTSSn`EtXJ9u~Gcj6ksKd5NBX!_|F7W!O0-YP%$Stp@D(@{G z6N=z#$u&KDKw=qtq?`-8)ok%G54hxW{vAsfFPbCJ zRUT8w=)L;JBc_`=H6L9y{5(13BczTzFHfmX$V#Xb6=yri%&>b8cXbTdAB+qVKpO6k zdIokN1bd|6H-Frp_Cz)nhDZ8wbua4O{+;>HH}7acWl5pHHN&s1vl%Bji-}LXaCky< z=iw&_&zhcGI4b#JhcLr&jZ_|WMh1poADI|ZfQEy@XgAn0AOQq$%YZ?~3AQUCq2Png zKY#u+4E3xE-|nqZG5EKC9YbGYQj39)uAQxcapE_n+n#GAZ``@@UYhT?L1l{Fro9S1 zYvh)(#qx-|nM=>NN~vd)yxnZL^PA9Xy%KB3B!k@(?=l4S>-D{}iz(VRD=mRX*m;|< z8sFlJUz;<0BXf61o=7`r;33!Yab^2W?#;q27q2${FxXyj;LMRU{arSC))zl>+kRGO M;AzJZQd9~k01hedtN;K2 delta 464 zcmX@XxqyRFVIpHa({ZMaO@|m6WhW;xiE^+qL?srbr^`}*6!ASDXDM4i~qaou`!&!V-OSu zw1%}_fssLofep!0HU<%(rO62i2^XeZ{l|ZZ$78{L^FQ`JF@a9M>=i%yOch!4h$qCT ze#cGj%gtwN1bV$?X74qSx*Ipag28@v@#C97V}E^QVn_kfAfHr$tWf|GK!EABdNjX< zeY;=(p-JbrqsdZPx$mq|oHR9J=Oma$6$aTLct7cFWushA)rMd0EZL4rif4LJm@LPJwTfwc4oLX=g)1=z32@1 zNdzF5in#IGTn4LeWA$x7$cToOjYk3aK&S$ZuI!|B7L+k(IW zmRF_$Zxsd=I6$@1V|Qc5bC!)qiB3gi08|B33-ZYX0I_gL2B2E$0Y6(HI)n;hIJp?W zplXKcdHx?(>?biF7?m8xxC_LsSZQlvmV7cH=L5rPbZu&eN%PH;0~mBe^%;sPx$cu7P-R9J=Wl(9l$NunMp_q?nb2)dLiojxDoOkjbw(~`i16R*Whpd o1Awo&LZMJ76bgkxq4*bk0hF}1rNE4lng9R*07*qoM6N<$g0u0?F8}}l literal 0 HcmV?d00001 diff --git a/assets/sprites/entitymap.png b/assets/sprites/entitymap.png index aa7aa952af0aaef4720184dd769fff4c181a2a9b..13559587f78c4784ca315f5b2b54e1aeaa674562 100644 GIT binary patch delta 16495 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 FV1nfGw>tm; diff --git a/assets/sprites/switch.ase b/assets/sprites/switch.ase index 6a42ed606ef7fe83507c8eaaf01316da8f8f7ce3..bec786b0b6350de06613681d5b135d48a45d5f8c 100644 GIT binary patch delta 687 zcmdnRIh~71oOL2o9i#Qe#=ng9rx_R+SQQu;n1S#=6OaQ2(hO1z6?2jk5)w9q1^oBV zKEtr}`TyN%vmWqA%O0#KUBGz9FX~3|z7Xl2Y~7x~Kki-DouTZT*l*gmylHA>)RcH8 zKf(6M4c9(d<+FNDnay!!fl2(EVhw&flqueJ=dM@0?fTk4#jKv!y?*zKxn>17U02#R zUyWZ}_HY|}m|5cK<0r}#cXtZ;oX{)zzxcKDu_HIy&&mn7>8pQC%qd&kE?rgG-P5^| zInrM7GaGZ-g5+oshC5p?_Y?u$&Z@x3z{$Xc7~~{l7R_=M=}Q%4b=e z$9|kSu&iEATrK>5RBgC{+7kX{eA4SCd_BIZe}bIAx9MLMqvbi8@A$5ELo5>N6{4=rf9th> z^z#c}@SC#px%bwMNkwmzj>XiJ2_~CqK2v(UH_|h~hkNtHw=1?9{PXADoG6iEw@LPj ziS$jrsu})oH#qVuN6qNXIlkiO;%C8GcDk4U2k6Vc2&`*jSd+J)_2!AP`i3VNiDo

_=c&3(SLeHA{5qnRhO-MH1C4J&zch0dDb*B!^ zzw~3d+b?Fu`iNa>?)p3jo;XNMw~MJNoayW#&v4}04^1^j28LfBnHW-l_Je|jM&VRX zY(P;OPEyPG{%=gw@hW_^dEHm{gDqzcF6Ebf-R{8NY-m}PXi>ShOD9kEdXYq=Oh3C diff --git a/assets/sprites/switch1.png b/assets/sprites/switch1.png new file mode 100644 index 0000000000000000000000000000000000000000..588e78600dad3886af13001b90dc1875b17dccbf GIT binary patch literal 508 zcmVPx$wn;=mR9J=Wmp@O!Kp4g!6-+}2tgtyWVKMH;jeZCj`~Z%O#>ojB9T{BQ>cSTg z2?-ho6D7oim^8r+(g8!G!2}u{%+=D~zn(NKJV}?k-u<5U?!C8HV52o_E7)+fS6IXi zeSClOxQQVA;rS#M=%mvG0Nh=F04OYoi3D%Zs?@ET0DyX1Lvu7;>f2VGltd)^o@FJ` z9DRoRrB{Fk6qy*bY!A+o(12{Ds#4y9RY^Gsv#(C5ZL*)?jw$BSp*)CefCe5mb^!o+ zI8sKW4Fvb!4<}HX5j4J$Dr;W5uFt$g46Xt<2eOAnX}Dh4yIMGe* zO92GKT>Nm#3M~K1Ts78z4HXg)5?pV!MzGTK3XsxHsI1 zW`Nvc{v&@0W{GNmbqAnLrt34IiQlVOxC&AYbgL#TD~aAvqrJbRgS^X)khSbw1NF8T yOmy`!MKSkR8(2|BG7xnV6{ufp|1sHU?fL;*P02NhX9=qS0000Px$&PhZ;R9J=Wmp^O5Kp4iKT1Ami2Nw&aEfO?cGIXkR%i6C{?9@--7jSbD`T@Fh zbMgxmM6sn#R-9T0SV2%6tc9W!t#&9E^5^byiHeI41diP0{XOq{cgY3VY0KKP-?%(Y zFE;rBV0wMAM&a;yW-254Y& zUpN^@Ejtp9$DIQE{M+H-WZZE9z*XbGGESCfMq5ir;s#cV1`UFr7Fam8~C#4?)0L@^pbZnAJKvC{1cpj`~GRE!3I zZVzuKM=ODS8(0OlRs(M8REL(&aJ#?n%>X&YtRh*SanAxw1FSOuEtvT|&oc3U6mz}> zsRmkw5_CO;c0a-m3;^okFE>M0*|`SFb$2k)-Rsoybz^1e$$-}&exPP;{l{ddt?LgD Wh_5gI_vSAE0000door references for _, switchentity := range switches { _, _, bond, switcher = switchmapper.Get(switchentity) if switcher.Ref != "" { + // this switch has a reference for _, doorentity := range doors { _, _, _, door = doormapper.Get(doorentity) if door.Id == switcher.Ref { + // the switch reference matches the door id, relate the two bond.Ref = switcher.Ref relID := ecs.ComponentID[components.Bond](world) - world.Relations().Set(doorentity, relID, switchentity) - slog.Debug("setup switch/door reference") + world.Relations().Set(switchentity, relID, doorentity) } } } diff --git a/src/entitymap.xcf b/src/entitymap.xcf index 71f4f6810545f228d44e9d78cb9190696c1c9cee..1cd10950600ffd68583a5a7e220708e0d28d90a1 100644 GIT binary patch delta 3931 zcmcIne{5S<6@K@==O4||bQx*udP-%OG%xd%W;`u&@Jj5i*6OuRuq8;9v5IAg1y`&F z+5L+Lyu^6uup&O6+b8jnFGx&%N#c`C z;`hELvG8k&&yPubX}iQTcvP1Z5~VRNb|SC-s!t|clm7V4Q}Av)Is6)#+lCp4qL zHTmG0eA^qO+)nu5ntTHdlC^?95pQX*vb$lGvk5A4N29k)vIH}=(btt3n^U#nC~Nbo z5ZLY1h6)^sl6kU;r@+&BSCo}$wv`A5#Vi#pagyv2q%@?0Av&){oqJk?S=*Hg4(I0$ z3M?HYS=O=FF3)pP?ILM|mWkjf3N2rwp_RFckGBs~;MgA5Ab9BFoMmkgtadTmI+?+I z6c)m=G{J&=UA%EWEUS~1wXBwKXIW4c)oj8YbS0?Bn6D=Y=Yu^^@xqOGeBy5Wa5w(# zc@k-l_~CB+19=j#biatVw<3WNDssb-?~RZE!BoxneN5(vXu2xub~`n%0!PM( zPB!rrc&fX`ScC>zBf2hTsbGndBq~T@$ndM+i0bN?GuoOA*tS%#sOuC+GTA!RMYki! zl0ziG&^67|2mvjdq=zW7mOr1@B9h}SKGJFt7S%urW&+IUv~Wh)q$cc|W2dBkz`rwoH zbNb-3c5#fsRt0~p;iFi_p8tcO`O4AI{34#f(yWm+YB z8N}`IGA+>SLo2)tG#TOwjFUVzguIn3@HXq=<-&3yIW#2NFj{EI7UhIIxc!G%2x z097aMHYbL4n(E-f z9su&87%Vy_7F~x$*I)lprVe}Nn2Fb6&-K?K7_NH^5yppy>#*odx}Je(Gy|*4q-SWI zj53JZnHf4ouMe%v4AAhf5^52Tchs%%Dc)s0Gcz?aH693vE@?W|k}>eGTZGWFt^nP~a9sQ!y6~aLFh(y&>iUP$Pz6Ec(b8Y;<~BaM7mmJY zzB2oGFU`3`A$Nye$c4-Yv!l1rd`1-V1-p)io(MCc41-FB+pK`=weh9 z79X_>i{CQ8fAS}8dde#br$+6!=b_c_Uvtq)QkSI#=kxCPte*0#J3S^68XRUj~sc8M~brQM#OWgcVQkx#P^+5e7{xGA>N62 Uw-1A1#7`rRB7Ua$-s%hg1Dyc8`v3p{ delta 3092 zcmb`Jdu&rx9LLW&x3g>4&TR;6-6KO6bt{f&BQ}JXf`As-82dvbBZQ0z-B@U~G&6y6 zK{1#(lu$5^l!uuKMo2}jQ4+wAiJIuNJ}|_%gqJJ?5Mi$%Y(0MOIcKFK1Y*LHdq4O0 zIOqJn-|V(M+oug(*0#)~C7(U#qWbf_MEun(kzCXwxni~C>T#0#2FdpCCAZZ`?yQvj zM6LVuaT$NPRr2fQl0Ph#{B5@6pSgmMkh3Rc;^L2z|J;xqy$_JsFSEuO1?<-uj=ZK| z@U8avZFL7!bTS}pG^4WxV-w>;lS=c!Y6 zUp^TIeI7pGxY|j{3C@2f-WDn0L8pmX~G+sP!|&_1>I24EENca%}|J# znu?D?ezOJ74gw3{Ni>(RC_IYhgYYc+5V1ye(oW!G0zM|PB3c4IChQTKfR71hgtoxP zge8(yZ;7N@yx29NYY|qjRpE+IFUClK_0}pnMT>9|GsLzkTEP&*$OKrQQ^gTeFMLBx z5zD%adA(EAxvJka*2RW*Uyymg*a2Xq7+`cjC145!R7e37f>;FvBBrL|7Rax#;2A!) zc%3?)V5Ao&d10g%rg>qcR~Z?Ck)bTN7J`u>yPJk!WXS2JjW9A~ac8wz+^I$nwhd`+ z)~1DUxv2+ZAf|2B5M86WxriBJTZlF>#PBf$w&jGljs*3p|A-G5mQrfBjh((@C+jxJ@CW>A3gBM10Ox`%mW`i z%16A|4!qP4;)TxV4l<70$#`zVHP5_dlZo7Vk1Ja(F#GM;z=4f&v0*+o#z7nh#b(q! z7IU-q*l^tfR@-cTb;p)2w6fZ_%ugCtyVKaP@Mi~W2#U|2hId4^q0`v3 z?=7`fw*BRFWqU+awr@6G{a|-C+f|*e?3yboyBdu-A3B_DUkDW!+t)6#`#v(>PHeNV z1JgwIz>6Y#V3kpCRAsY6J4E)-7b1J;C*$DZJvr>S+~K&~;W&2q?wFNzFBiStZ;0OR z9mcxk=T>&2PGnECitLGvM&M-3%6f`Kw&!V)?Wr-IJhj!z&Ycn2b0Z@A*LdUK-fyhz zQjf@9x-PPp^NfKjy%u)$daS44<+?Ume&F}_C|*z;h~*7T(EHR+sy@}$H(i$d<|{5% zY*k#V*sd5?+^={|jd9 zLrn1jMZ2Q>6-;cvP`Uv0Cvd#i@$Z6rWX`sW?Y*u3~NM+w1ZF E0FvpY9smFU diff --git a/systems/pair_system.go b/systems/pair_system.go new file mode 100644 index 0000000..37d8276 --- /dev/null +++ b/systems/pair_system.go @@ -0,0 +1,117 @@ +package systems + +import ( + "openquell/components" + . "openquell/components" + . "openquell/config" + "openquell/grid" + "openquell/observers" + + "github.com/hajimehoshi/ebiten/v2" + "github.com/mlange-42/arche/ecs" + "github.com/mlange-42/arche/generic" +) + +type PairSystem struct { + World *ecs.World + DoorSelector *generic.Filter4[Position, Renderable, Bond, Door] + SwitchSelector *generic.Filter4[Position, Renderable, Bond, Switch] + GridContainer *grid.GridContainer + DoorMapper generic.Map4[ + components.Position, + components.Renderable, + components.Bond, + components.Door] +} + +type ToggleDoor struct { + Entity ecs.Entity + Open bool +} + +func NewPairSystem(world *ecs.World, gridcontainer *grid.GridContainer) System { + doormapper := generic.NewMap4[ + components.Position, + components.Renderable, + components.Bond, + components.Door](world) + + system := &PairSystem{ + DoorSelector: generic.NewFilter4[Position, Renderable, Bond, Door](), + SwitchSelector: generic.NewFilter4[Position, Renderable, Bond, Switch](), + World: world, + GridContainer: gridcontainer, + DoorMapper: doormapper, + } + + return system +} + +func (system *PairSystem) Update() error { + observer := observers.GetGameObserver(system.World) + posID := ecs.ComponentID[components.Position](system.World) + veloID := ecs.ComponentID[components.Velocity](system.World) + + query := system.SwitchSelector.Query(system.World) + relID := ecs.ComponentID[Bond](system.World) + + EntitiesToSwitch := []*ToggleDoor{} + + for query.Next() { + swpos, _, _, switcher := query.Get() + + for _, player := range observer.GetPlayers() { + if !system.World.Alive(player) { + continue + } + + playerposition := (*Position)(system.World.Get(player, posID)) + playervelocity := (*Velocity)(system.World.Get(player, veloID)) + + ok, newpos := swpos.Intersects(playerposition, playervelocity) + if ok { + // player moved on top of the switch + switcher.Toggle() + // open door + door := system.World.Relations().Get(query.Entity(), relID) + EntitiesToSwitch = append(EntitiesToSwitch, + &ToggleDoor{Entity: door, Open: true}) + + playervelocity.Change(Stop) + playerposition.Set(newpos) + + } + } + } + + for _, toggle := range EntitiesToSwitch { + _, _, _, door := system.DoorMapper.Get(toggle.Entity) + door.Toggle() + } + + return nil +} + +func (system *PairSystem) Draw(screen *ebiten.Image) { + op := &ebiten.DrawImageOptions{} + query := system.SwitchSelector.Query(system.World) + + for query.Next() { + pos, _, _, switcher := query.Get() + + op.GeoM.Reset() + op.GeoM.Translate(float64(pos.X), float64(pos.Y)) + screen.DrawImage(switcher.Sprite(), op) + } + + doorquery := system.DoorSelector.Query(system.World) + + for doorquery.Next() { + pos, _, _, door := doorquery.Get() + + op.GeoM.Reset() + op.GeoM.Translate(float64(pos.X), float64(pos.Y)) + screen.DrawImage(door.Sprite(), op) + } + +}