From 204021b9ae08a12d01cb6052f8f1546859425c46 Mon Sep 17 00:00:00 2001
From: Patrick Schwarzer <patrickschwarzer2000@gmail.com>
Date: Wed, 16 Apr 2025 00:20:32 +0200
Subject: [PATCH] stuff

---
 classes.lua                |   8 ++---
 games/test.lua             |  19 ++++++++++--
 games/test/main.lua        |  59 +++++++++++++++++++++++++++++++++++++
 games/test/test.lua        |   2 ++
 games/test/testSound.mp3   | Bin 0 -> 5504 bytes
 games/test/testSprites.png | Bin 0 -> 961 bytes
 games/test/tileset.json    |  22 ++++++++++++++
 games/test/tileset.png     | Bin 0 -> 2375 bytes
 games/testSprites.json     |  18 -----------
 games/tileset.json         |  22 ++++++++++++++
 main.lua                   |  19 +++++++++++-
 11 files changed, 143 insertions(+), 26 deletions(-)
 create mode 100644 games/test/main.lua
 create mode 100644 games/test/test.lua
 create mode 100644 games/test/testSound.mp3
 create mode 100644 games/test/testSprites.png
 create mode 100644 games/test/tileset.json
 create mode 100644 games/test/tileset.png
 delete mode 100644 games/testSprites.json
 create mode 100644 games/tileset.json

diff --git a/classes.lua b/classes.lua
index 01721ec..c995787 100644
--- a/classes.lua
+++ b/classes.lua
@@ -22,6 +22,7 @@ local function newImage(path, alphaColor)
     return image
 end
 
+
 --[[
     Sprite Class
     This is essentially just a Wrapper for LĂ–VEs Image
@@ -58,16 +59,15 @@ function Spritesheet.new(path, width, height, alphaColor)
 
     if (string.find(path, ".json")) then
         local contents, size = love.filesystem.read(path)
-        local sliceData = json.decode(contents)
+        local metadata = json.decode(contents)
 
-        print("games/" .. sliceData.image)
-        self.image = newImage("games/" .. sliceData.image, alphaColor)
+        self.image = newImage("games/" .. metadata.image, alphaColor)
 
         -- Create the slices according to the sliceData
         local imageWidth, imageHeight = self.image:getWidth(), self.image:getHeight()
 
         local counter = 0
-        for _, data in pairs(sliceData) do
+        for _, data in pairs(metadata.tiles) do
             table.insert(self.sprites, love.graphics.newQuad(
                 data.x,
                 data.y,
diff --git a/games/test.lua b/games/test.lua
index ea70599..d1f68ee 100644
--- a/games/test.lua
+++ b/games/test.lua
@@ -11,28 +11,41 @@ end
 function Update(dt, curTime)
 end
 
-local sprite = Spritesheet("testSprites.json", 16, 16, Color(48, 104, 80, 255))
+local sprite = Spritesheet("testSprites.png", 16, 16, Color(48, 104, 80, 255))
+local tileset = Spritesheet("tileset.json", 16, 16, Color(48, 104, 80, 255))
 local testSound = Sound("testSound.mp3", "static")
+
 local test = 1
+local test2 = 1
 function KeyPressed(key)
     if (key == "f3") then
         test = test - 1
+        test2 = test2 - 1
 
         if (test == 0) then
             test = sprite.Count
         end
+        if (test2 == 0) then
+            test2 = tileset.Count
+        end
     elseif (key == "f4") then
         test = test + 1
+        test2 = test2 + 1
 
         if (test == sprite.Count + 1) then
             test = 1
         end
+        if (test2 == tileset.Count + 1) then
+            test2 = 1
+        end
     elseif (key == "f2") then
         testSound:Play()
     end
 end
 
 function Draw()
-    DrawText(test .. "/" .. sprite.Count, 25, 25)
-    sprite:Draw(test, 50, 0)
+    DrawText(test .. "/" .. sprite.Count, 50, 25)
+
+    sprite:Draw(test, 5, 25)
+    tileset:Draw(test2, 25, 0)
 end
diff --git a/games/test/main.lua b/games/test/main.lua
new file mode 100644
index 0000000..f48e51a
--- /dev/null
+++ b/games/test/main.lua
@@ -0,0 +1,59 @@
+
+NAME = "Test"
+AUTHOR = "Tarion"
+VERSION = 0
+
+local backgroundColor = Color(48, 104, 80, 255)
+local colo3r = Color(48, 104, 80, 255)
+function Load()
+    SetBackgroundColor(backgroundColor)
+    color = Color(48, 104, 80, 255)
+end
+
+function Update(dt, curTime)
+end
+
+local sprite = Spritesheet("testSprites.png", 16, 16, Color(48, 104, 80, 255))
+local tileset = Spritesheet("tileset.json", 16, 16, Color(48, 104, 80, 255))
+local testSound = Sound("testSound.mp3", "static")
+
+local test = 1
+local test2 = 1
+function KeyPressed(key)
+    if (key == "f3") then
+        test = test - 1
+        test2 = test2 - 1
+
+        if (test == 0) then
+            test = sprite.Count
+        end
+        if (test2 == 0) then
+            test2 = tileset.Count
+        end
+    elseif (key == "f4") then
+        test = test + 1
+        test2 = test2 + 1
+
+        if (test == sprite.Count + 1) then
+            test = 1
+        end
+        if (test2 == tileset.Count + 1) then
+            test2 = 1
+        end
+    elseif (key == "f2") then
+        testSound:Play()
+        testSound = nil
+        collectgarbage()
+    end
+end
+
+function Draw()
+    DrawText(test .. "/" .. sprite.Count, 50, 25)
+
+    sprite:Draw(test, 5, 25)
+    tileset:Draw(test2, 30, 0)
+end
+
+
+-- TODO:
+-- 1. Implement memory limits for code, track how many variables are loaded, based on the size, like int64 and stuff
diff --git a/games/test/test.lua b/games/test/test.lua
new file mode 100644
index 0000000..89dbfe7
--- /dev/null
+++ b/games/test/test.lua
@@ -0,0 +1,2 @@
+
+return "test"
\ No newline at end of file
diff --git a/games/test/testSound.mp3 b/games/test/testSound.mp3
new file mode 100644
index 0000000000000000000000000000000000000000..8e64435ac5c63491e4cb272974d1a366c50bdb50
GIT binary patch
literal 5504
zcmeHLX;4$yw%+GtAV7dHhe0_Yvxo_Uf}#Wv1PK}eX%Lho5G2SfB2I9^JZU4X5XWW^
zM8O6e0ksW-fIurEle8eHprQ;djff2Ag<H4k)~oyH{<-!3yj8WTcCA`#ee10At+V&p
zF5Ap;KrHYEPZv)!@xolJJGOZQ^P;)D=on-j!s5sALXkZ#h=-Fm!r}xR6x%#_p}c??
z#0)X?h&s%P<{5di9O>df>Hih%>Eq}wHW0*WMl&<_blA1?pFSQDhr<IAhfsc`!!9>B
zv2njxdEo~DlOMnfKg0_}f+C{-9obaIb|n$=ulh_8nd|>%vI`AGqWK4cV-6wFyhFU`
zSYDv%Pu||%Vhrtn;snRUL>}6-etjrE{9sJ9DUY}QUpYM;cRGmOl*P)lb8|%a;fNCx
z@rXGb$d5qG=$`hhm5T9VrJK>PA9p%3PKnn5x~c@gn&*vc=ge8qpJDg@46Eu7yQd+O
zQvdixUdD}VJ|*&@lwWPBePN_o)xowSrOAvWH(9}%4D<j#hpL%F{G6$At`oPN0-own
zOeAn&l8zrY{H!C$Yf>ck=ciY;UQ{9>HBT>Ox60jCbU=tWydcd931FpDy_MGPCOF2B
z$vz}Es2u|Z;F9FXUNSlrwM~^C7^CEcePw4VCe{EHl_dk3X1vYYdvq0)_Gz0`^5g0G
zW@aqqtE@TktO|0*M&L~^TpiOCrHB39Um9*lvDoO2_Z#f!(oY(I1d;>;&y2v`r+&r6
z@^^Pqj4ifw+@x-;q~2BA#4(w=bYM$AKX5Rj@ub^^-r`+Z<CFcq`Z^a<tss2@ql;su
zIHp)X#wEw4@tg;EO;$k$P%nps8v{r%JC)c>C}6VnfwOE>d7Dq=&^apygig6K=~?;2
za^uM=6gA4Qy`{0PCw@nWMM;G}7c;6wMOs2boLaIdRH%F7RSFvw`Vowh3~5wd)Gj#d
zMrqahu6CvJx|8`dB{*A7q`aI^a_8o$LJtoI=EodKYUsT`ym|6I_YWJTTUy}O97Q{+
zLIb>7D#h#k9YT~K7*+taC<{hWJ?{Gco>ksm@unt4I|3y^F^=LSOH{hYVb)n(JX2A|
zV;M0_9jY&Qw~F9`^UbN;s?Sl(z7e~0MjS~>U-n%;Hxhm)l48T)Nmp1hTdJLR>l*)u
z0vPWb$zS2m1^NZ_u=RxQ<(~oJ>Z8DQ6S3?-Q~@q{4Z}R{+4cxzS6%uwLvQJ)sCw_F
zQW(_7`FY27xI7^MIvOk?11QM^vSLGAW49|)3Jq1ln>mN5t3dh2$M(o5pk@=M!Nd3x
zJ_!iT;E`mZ0+opBDDQrozWeE)G^zbUS#Wz(bWRA}`P=jcT@<9XV@IR`l#i{|AFbrA
z<4YoJm?i_^AjE)XK)?|SUedStHQwAaNcSZ-7A!WPjvgwM1{^uOvv%Ut*V>L^eUl8D
z+85iQ_=Im}Zm^xl@rNvxCr7hxwH|hbfjI#UP-;@VSf$wfWJU#cz{6{B%`X_2t+eJd
zXARqnkMDU4)0j;xyOyhsmS5)%RJ?^LRdK5AbDGKoJ+&E)Op}l6=?q}6AW#V~2%LfI
ztK^xw#PU(kpl`wRMFmPv?t0l2l}i4i4YdbG7Cmy<%Eess&!i&RGC#jRuhW3PD0OcC
znPI}mU0+3K*@jj@^L61Y9g2o-*3LAKL{)5dd!qWSw80%@88~~9&<2F+&)l+wL~PUw
zU86&p3VHBR9K^!Kt96@HM^NaKyBeYG<{mu(1jgaygijQswb8%Kl%V!*5=OHX#zaCd
zFf@4)&=+e@c(t&{S6-mK&(iZlXlJ0DbLRCs02+r-Wa`84mDV%6etTOmF)>|(tC7B3
zv7?`@3z&E`r@q6-O}d3z-!0Wq#im)bcxSsE>&FVms;}~cxam1Z1BV`UEUoY-RaFnw
zIro`9buhQ7(#Bxv3g2gZe1NX=bzvzH@gEHFanp6|+QkY++lSV8W+<ts6TvIj{kPvN
zH9W@j6?E~pv6(H{v!Zc*=>TjG6lv<85^Im$ZEB%WNcBaEg%@BvIWc^+RXpssj$o4B
zl+`&=n>4o?y?NB8On!s4s7`9Vshf|@$X6K_O}?Z;1KmLvPpjHu1HUHRm9W#7AvX3#
zzmGqTEo>{Y!3H+JJcLD*_c`o68mTT)&sI1-m}|2zwcvSM6TNT6p01Wx*nYh3<mQEi
zvWbPbLxUQlZ;l9o9D@XYqjIhmR#czeodZ>Hgq**2e^C2v#|;54b%T*wz0G?X!GwRX
z;`d?XXws_#PL68m!`RF6l(=(mr_x4hUWfm*6D8oeGHixXL}SEaIGqx$-e`5ixWr3s
zYIcz0p1W~v?BHFTgLzuNjE?4kh-3v$+j&aJ#N`Lmi`FhKsmhvuGmWyI4Y|3wlKe?O
z+g}4VPB&c9$f^yUV7~A(JuxE7n+gkVqW!Q;W(K5)m=e)+7j9Ai@h{%jxug12&eU&5
zm#Ma2m*ZpRcrlY29QxCzDMLMay6?GkxyO^frT%~S<?h^>zhk$Hi_5Xx+~$*~?Pr!a
zo3n3XS>3fE{%g~S06N#(P@<<7a!f4N`)XeQ&N@?MzpAx~n_Hr{_2{Qpf2;{{xqmMS
z07Fe+@=kV$?{Z>-_AX4O&+`V%HOd)FzMHrAOYhJ3iXlaHxehC$*@?0r`W-9$*;J^8
z>Kc96^5sxyw!x<2hY3Cftz>&L%hZBA>UjMYws@=Uu4TogYu{Goy`9yr<R3n5_0B6#
zEPe4hKa$`MhEf$^4?A8qNe4>Vpsk)t&&^b+)w=oz|E7t#>7D=xkHaBq?iF5jlS9jM
z;|(0&7EL}sy8UtN-c|-`+*RwL%)Ol#-RGCzYMM*kZtdpgcF@RU$yE%4Rn*S%`F!8Z
zn&)fJADPQ4%D)lX@7XhWB!DjLxNq9kyp2&RyA5;by2cwUxqaGpKH%p`abeFaZyqIC
z-0B;x$!%nOu^h~97voL6b9Lp-NA9Vi8PZCgWWQ?BYSE1Pap%sRV!JacWE9vniO(Rj
z{JZa}_1ZF@X8U&<LR36BkABynt|RcXG@Mu6xKx||U7wuzD%HwF$P<j9B3wQ{=0Vr%
zOx?fA$0N8^WWrnJ^z$bQf`ao>WZ8<qzFmd!&5$7j6|i$QLl3Ql#C0%2RRqIqp&W!x
zs}KQ7*^3-|hrU^Uw$GrImW>v~KnzXhd7Vn^x;Z=#WSL}=#k3ON;Y1IHb#62uhLQmg
z(PQuqcxjr?wtWQbv-@-977#YfX3Ig>bn>A3s&!v{@Zh3$QUYd`>2$Sq6b4d6*_Q88
zko+^#5^S=$>Eqt%4X6a5&;Uu)U_FIXMk_P|4dtKdGs|RpoB==(FdvW2&o5U^E%hf|
zqlC44vq`7|TNyCe#%L~k9~8>jnz5R{C4<IU;m^GeDylu(qgwgr{SMzvMYEp|jo=bt
z_HMy5b~;qb-T^w<5~%S$$7jP1QHdiD;veW5<j_vQ5+U2mcaPnl)Zq+MhW}(R2zaE5
zbedu@KgU4qk{C9UXy+psmz5o=@ZoW9G5wNa)CnG_r|yRehArAoKgT}m`yt#rP$W#0
zS|e1q1#n16J~r;t(E44TmV-jtCaxruZ})bcEr#{%4SxCcWmXZ#JMyQ#G!;kS8UfYk
z?DStb$NV+W!!O?XDKdLtBR*y9pw6Q!vn%HLk+re#Fdr4w-GS|H)2^CtX=JgGy1~{#
zJuCKw--Upl3?$nB8k@_vz5E8_82v2;Jn71SBU07F!Qdb<eIyZIaejJzbs{A~XoMPN
zPLqT}5X_)UgUs9rj>j3PRfohdvxiSnN$6tv;f-51;|~6{9DvPw@2K;<u0#N907Hvr
zB=v6fSOsl@Pz<5+I07Oh<3N;T8tLcMZ57YQueiu}n<p#TvS>O~2HWDa&bTx7qmx;~
zcoM8aCM(&}EMS1|?$J%a4%m2UB5WmP@S<J%VL<bVL)q@w3p3L*yYu8*<;3rmwpDOF
zK#3@g26MSF4;`JW>LakPuJ<<{b1F&wBqgn=u9-MQjSv?+cXPY~Pm?!Jb+uqm*WWbS
zZYM<~?aAoL@|oD9^7$7)vO*!rg-46Csd4=umYUlxw{q*;Nd@>FqR_Zi%ry+}mi|AV
zw+h}j$0=tkCg!a0NBg}Rs$D4NPizk}YE$9p=h%6Xi7r_Y@-&vvE00El%AdUNKGBCI
zV4F|9R*>}=#@asUMwsqx-!p|RHBcmTZt1n5iZBBwm#jE>?6wQ&9I?{edM<H91mD=;
zExl@Varw}RKj80U=Nv7_ummmqC@rYuAANFsB3$XyhEDUul|ErBLl^oJu+SEy<*?N&
zc#S10jT2a%epBbXGAbnCp^s$ludEPUa*#ECMBi2N7p&b-zr|TR83?zGjYi68HvEt*
zee;dk`74Dj1CZ)rV-i|FU;<cyRGa+@B}rwHn>zssXucVGys!8EBGw(&9dXv%2?_!X
z2HTVrM64&Xe;Ac+bpH~^oCz|pzr^uYCR!B=xtWAvcBBdvGaNM4wAG*HKNs-MkSGUP
zb#Amt4AyetN0gnzqpgA9?UT-<B2fX1BXgK?W~!0q3i6@`Km@~1Du(J6UhjndSZ}1)
zHm-F;B0#ESmF<hXY$mW?wp$M5o3e-lY$n-cXQZVu0YdTV7j<T_S!#ZIaJ&d0qGp69
zJzz`f-10IoEC|EM^N0WTnr4tWM#RW{HJp!TQb1`{`w^{K$qyK2i%t4Ja+5LdDx(ET
zD?!j|>g;RlH)8tq&c+I=b8yX2it_+f>4JKo1{o+4$B|dVpBC_Y)D!%Gtkp2&*bzOo
zIU%3E6#s@7W;(OU+tUjMl4u;6s)2J!Gmg|4IQ=xWMjE!mukhz4Py<@~UZ_@v43Y2G
z74%@Sb@j<GQ=5U3p|xs*r`$)?;!Di?Pj)0=%fVLC*J}3<Rks{_uHloge9mP-fCPOp
z1EoMz#oOzjD#3`91m-@pj_YOwV2=}2IzJxG5099C)Uhi+HBLR5p$lcZ`(q!~@=4U2
zaJ?WgIhW|h02eNlV9SX?$$r)h+DF{BVFoey_sZqFIvJsP$~0Xf;}6;l-VQjurwEPC
zO0HjWzM7F?p@t_DGbttn=QHKl@>t;liM63q1xDDK#e#H(zIx3emtw^`6hLx(5XZ^8
z`*`W#93^rjP4hMpq(fs63*QWvNd*z6sZL7idSmCPBdKzR`uc=)%~CQ;CkQ7ZJK@;+
zzK*B+w7x&ld$@UVDI)K8z7a$8m+a`HfT8#Y*ieE|?m1Ide@!W1tY*tf5b<{34*1}M
zjGzr{C%gzqxR-6%rF>=VF@{aI{IoyCtQ@AQB@VMqY-TQxVe^$sQ?upKX-gG)-zgB8
z$mnh;wCt!B4GX0QeGZ$}F7{!g*pGJgZkl~YE+rMpD8Il=*->}oAvS3}gB>vn*y-Wp
zI*h1uT;fi?O6JyRYQm3R(q7&Uc>EmuFjGD7(z4`vh@Dz;pp3%!EmiA?EfEjfvAKoo
zYa{W9OJe<I3QbAI!py;}Vj}_0ocNyA<=XhiO+xJ&AQ_B8*K$8^coufUw`Kfgx}TG$
zJ@U$~j^VjVkW}SK#0^`iYuYimt&#$C`XB%Az8Y#koA*NI&H}()-ZWxs&W4B@cq<9n
z&aj-Q;`GZ~TgYygntEQhK0I&e0kJiSI6LPPiTAZLG%eN^_`2vkO)XaFyen<tRbP%$
zAVCt#glPD3+T^sTY8`}LmBk78Z&lS(4R&hn4GFmJe)d$BLkxmLs`ShPFD?)88orN_
z{L&#o<PIYBbd4GvhguNZ_3G}g?9>cWB7=4XPI-7y*R>rxd09~*=ds*0oH|XfAPLGO
zRFiF9m-(9BUu;X!?$r{}t`G(HNcoBm3$gC{^<}AgvYnQYh;8Kn>G)}rx=iy=SNB|i
zkxfYj0B?27LLP+ycy;Bx=iGvW$Hra=qegx&{DMEVOr*F_)bb|T{S-X7ME;88(BkCl
z8TKRwXi;1wtHT8}X9y}&#RJ5a18P`M%54bA0jT$gW^Uk}{fkGWSg!CQltKw2Dl;rv
ztF{o*bF@T_>?9lxRIvzWN`2Pnk!Ey`#w7d#eay+Kt{puYj3u$FXy0ua^;WCpKS}tO
zwFaDZaOUsEu#_&u&>(uaL%@)dh7=gN_LVMrmpriLFFCTHfQ)xex^=0Hf>LP4(hx=8
z_}48M*7w6vQNeiS=EmIA+S=6e#(z~-zCU}%0Zt^o|Irj5odB>v#g{|>IsAX_`ComG
L|4;sZ(}Dj1SBJz)

literal 0
HcmV?d00001

diff --git a/games/test/testSprites.png b/games/test/testSprites.png
new file mode 100644
index 0000000000000000000000000000000000000000..c843ce3cabe583f88dd46a5f5fae844c6d58b468
GIT binary patch
literal 961
zcmV;y13vtTP)<h;3K|Lk000e1NJLTq002M$004jj0{{R3#_xyu0000CP)t-s2N)qR
zXi$d0Y~c9M)nPJ&000AUNkl<ZNXMm=!D<{w5Qa+&17aNHQ{NZ+GK>~0#21ka(kjOh
z$iqz6`)mviW*w4Om|b0#Nr<HQ5`yq;zzE~Kg5;Ah0b9vM$bwD%)!p_Ua*`M3|Msud
zbXB#wix{8r8b^|ve8G_fv0Y~(31Xi<HIW2qc24_9f;2DQ^pOOyFW#6)g7DTgN0OS!
zz(f+HKDu#{1Zg(kI<S6z*;BcBIkSU92i9j3L;LySf{WIGHZ7Q{e35Xr#>#OfS+YzT
zOITT<+oJHT2a?x>BMD-=8AlSN?iL(LkZQQ#NP;x)w@f5Kn#b==B&m7)HwPvJW0x}q
zt7SVQ7^Za%mXuylErxe91`l=@3DvvuKN(3{VYQLTqK~GAvvXFCQR#!9jQz02AU|<v
zzh&DR2Dvn7U$UTCutNLet8f&qzGy${)b9sKYW}(ANP;vw*BnWZX6KS431V+%?Ac0|
z8>C#*przDk9sG5u<FC#U?>OdE8Ur^DCGd@7yYbwBOs%}~Py*)<4anafN+6TH*p?o_
z16h(&`LZXSg1R5~jc+~h&gY{G=K}#q^U@oTAghlC>OZ{!2~u^fnon5{1``9?!4Fc$
z;2D?Q+=1aQ=B7#yopL^rHKuc8=Mw`qqhAcwXG1AlG6-#UPwreMeb|DPdzCD@e!;pS
zO0>TnS`VbV&X1Kx15MZUkpx+NX!X}mudFWYv&j63)S*;&or@$$lg}MkPZu&j@`axt
z!q4*~i}NE3^P`CKqxir1fiL(3`u(UpKvGjmm4T!t?_4CQ$-5+yym{G2k~g295cthS
zk{Vr5m|_i>?<WSdgUJc;gNd(0SWi2dFjFyuX#&<~Z6blWv+uTh<zOn6uFL5;m%Ab4
z9KDoc5;+cFf%&mN^qqoxXuleT)<<8sAFYcdHCsQsNK&(P+DDR_O$0niO?qUM<q@(R
z8QYQpc^vAfyMIF+UrC@om78$PAm)e!eq@`<ui)EbS)+c%_Uu<yzLNVQ7e!h;Vb77g
zVrBkdpepwe_~2U)y!(EvCy@lP*B|>xg4mC*`$&RR-@R7DLV}d(G6A_<BFob3w=@HJ
zh&qPks{Hl@<m?vn<JQ^iH~~4|mcaZEc~?d-cu%f}{r#EY`ihm~`?9E98n!Y!lo--w
j;rBy{f$}7biopK>!*~(8X{wN!00000NkvXXu0mjfdXUKR

literal 0
HcmV?d00001

diff --git a/games/test/tileset.json b/games/test/tileset.json
new file mode 100644
index 0000000..20d6dff
--- /dev/null
+++ b/games/test/tileset.json
@@ -0,0 +1,22 @@
+{
+    "image": "tileset.png",
+    "tiles": [
+        {"x":0,"y":0,"width":64,"height":24},
+        {"x":64,"y":0,"width":16,"height":24},
+        {"x":64,"y":0,"width":16,"height":24},
+        {"x":0,"y":24,"width":64,"height":24},
+        {"x":80,"y":52,"width":8,"height":12},
+        {"x":80,"y":68,"width":8,"height":12},
+        {"x":0,"y":72,"width":80,"height":24},
+        {"x":90,"y":48,"width":14,"height":48},
+        {"x":72,"y":96,"width":32,"height":15},
+        {"x":32,"y":96,"width":40,"height":15},
+        {"x":24,"y":96,"width":8,"height":8},
+        {"x":16,"y":96,"width":8,"height":8},
+        {"x":16,"y":104,"width":8,"height":8},
+        {"x":0,"y":96,"width":16,"height":16},
+        {"x":0,"y":112,"width":32,"height":24},
+        {"x":32,"y":111,"width":32,"height":24},
+        {"x":72,"y":136,"width":32,"height":24}
+    ]
+}
\ No newline at end of file
diff --git a/games/test/tileset.png b/games/test/tileset.png
new file mode 100644
index 0000000000000000000000000000000000000000..5b21c11a8e151c4b29a85acb53e14d5c5b1cab8a
GIT binary patch
literal 2375
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

literal 0
HcmV?d00001

diff --git a/games/testSprites.json b/games/testSprites.json
deleted file mode 100644
index e806425..0000000
--- a/games/testSprites.json
+++ /dev/null
@@ -1,18 +0,0 @@
-[
-    {
-        "image": "testSprites.png"
-    },
-    {"x":0,"y":0,"width":64,"height":24},
-    {"x":64,"y":0,"width":16,"height":24},
-    {"x":64,"y":0,"width":16,"height":24},
-    {"x":0,"y":24,"width":64,"height":24},
-    {"x":80,"y":52,"width":8,"height":12},
-    {"x":80,"y":68,"width":8,"height":12},
-    {"x":0,"y":72,"width":80,"height":24},
-    {"x":90,"y":48,"width":14,"height":48},
-    {"x":72,"y":96,"width":32,"height":15},
-    {"x":32,"y":96,"width":40,"height":15},
-    {"x":24,"y":96,"width":8,"height":8},
-    {"x":16,"y":96,"width":8,"height":8},
-    {"x":16,"y":104,"width":8,"height":8},
-    {"x":0,"y":96,"width":16,"height":16},{"x":0,"y":112,"width":32,"height":24},{"x":32,"y":111,"width":32,"height":24},{"x":72,"y":136,"width":32,"height":24}]
\ No newline at end of file
diff --git a/games/tileset.json b/games/tileset.json
new file mode 100644
index 0000000..20d6dff
--- /dev/null
+++ b/games/tileset.json
@@ -0,0 +1,22 @@
+{
+    "image": "tileset.png",
+    "tiles": [
+        {"x":0,"y":0,"width":64,"height":24},
+        {"x":64,"y":0,"width":16,"height":24},
+        {"x":64,"y":0,"width":16,"height":24},
+        {"x":0,"y":24,"width":64,"height":24},
+        {"x":80,"y":52,"width":8,"height":12},
+        {"x":80,"y":68,"width":8,"height":12},
+        {"x":0,"y":72,"width":80,"height":24},
+        {"x":90,"y":48,"width":14,"height":48},
+        {"x":72,"y":96,"width":32,"height":15},
+        {"x":32,"y":96,"width":40,"height":15},
+        {"x":24,"y":96,"width":8,"height":8},
+        {"x":16,"y":96,"width":8,"height":8},
+        {"x":16,"y":104,"width":8,"height":8},
+        {"x":0,"y":96,"width":16,"height":16},
+        {"x":0,"y":112,"width":32,"height":24},
+        {"x":32,"y":111,"width":32,"height":24},
+        {"x":72,"y":136,"width":32,"height":24}
+    ]
+}
\ No newline at end of file
diff --git a/main.lua b/main.lua
index 08a522b..c8f8528 100644
--- a/main.lua
+++ b/main.lua
@@ -95,6 +95,7 @@ local consoleEnv = {
     NAME = "NULL",
     AUTHOR = "NULL",
     VERSION = 0,
+    path = "",
 
     Load,
     Update,
@@ -111,11 +112,17 @@ local consoleEnv = {
     DrawText = love.graphics.print,
 
     print = print,
+    collectgarbage = collectgarbage,
+    require = function(name)
+        require(virtual.path .. name)
+    end,
 }
 consoleEnv._G = consoleEnv
 
 function loadGame(gameName)
-    local fn, err = loadfile("games/" .. gameName .. ".lua", "t", consoleEnv)
+    local fn, err = loadfile("games/" .. gameName .. "/main.lua", "t", consoleEnv)
+    virtual.path = "games/" .. gameName .. "/"
+
     if not fn then
         error("Failed to load sandbox file (1): " .. err)
     end
@@ -145,6 +152,8 @@ function love.load()
 
     -- Create Virtual Console
     virtual = {
+        path = "",
+
         maxMemory = 16000,
         currentMemory = 0,
 
@@ -191,9 +200,17 @@ function love.update(dt)
 end
 
 function love.draw()
+    local count = 0
+    for k, v in pairs(consoleEnv) do
+        if (type(v) ~= "function" and v ~= nil) then
+            count = count + 1
+        end
+    end
+
     love.graphics.scale(scaling*0.5, scaling*0.5)
     love.graphics.print(virtual.currentMemory/1000 .. "/" .. virtual.maxMemory/1000 .. " KB", 2, 2)
     love.graphics.print("Loaded Objects: " .. virtual.loadedCount, 2, 10)
+    love.graphics.print("Loaded Variables: " .. count, 2, 18)
     love.graphics.scale(scaling, scaling)
 
     love.graphics.setFont(font)