From 2ee3b2a8c08533a76123de6ac448f224497bf1a3 Mon Sep 17 00:00:00 2001 From: Within Date: Fri, 6 Sep 2019 15:50:17 -0400 Subject: [PATCH] code --- .DS_Store | Bin 0 -> 6148 bytes assets/character_block.png | Bin 0 -> 457 bytes assets/levels/level_1.lua | 449 ++++++++++++++++++++++++++++++++++ assets/levels/level_1.tmx | 338 +++++++++++++++++++++++++ assets/tile_cave_platform.png | Bin 0 -> 28624 bytes entities/Entities.lua | 55 +++++ entities/Entity.lua | 26 ++ entities/ground.lua | 18 ++ entities/player.lua | 91 +++++++ gamestates/LevelBase.lua | 46 ++++ gamestates/gameLevel1.lua | 51 ++++ gamestates/mainMenu.lua | 3 + gamestates/pause.lua | 25 ++ libs/camera.lua | 24 ++ main.lua | 18 ++ run.sh | 3 + 16 files changed, 1147 insertions(+) create mode 100644 .DS_Store create mode 100644 assets/character_block.png create mode 100644 assets/levels/level_1.lua create mode 100644 assets/levels/level_1.tmx create mode 100644 assets/tile_cave_platform.png create mode 100644 entities/Entities.lua create mode 100644 entities/Entity.lua create mode 100644 entities/ground.lua create mode 100644 entities/player.lua create mode 100644 gamestates/LevelBase.lua create mode 100644 gamestates/gameLevel1.lua create mode 100644 gamestates/mainMenu.lua create mode 100644 gamestates/pause.lua create mode 100644 libs/camera.lua create mode 100644 main.lua create mode 100755 run.sh diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..0ce70f6dc8a2339d12b8124cd0060bce6a748b9d GIT binary patch literal 6148 zcmeHK%}&BV5Z(pUEyl>fM2>s$#(^J^lSzYk@Mcn@2Q|5XV_$^fXkokFr9VizrM;6dh+RJzOjNSpA3(^>l^^uOq#aI!ex&Ac^nehS zu)3vknl>BtimW#qvx-bxt!hOcHjZX9OY9%ij?a4ck5B3I?B!K6%i$wbvTJY-Z(uBK z^1+z|qcFGw|2$_NOGpe51H`}@Fkp^8vAqU+r7aQz#K6xO!1FVZ2_@xSG z+}21fF+dC~GmzKa64w9I@9+Q1Nz@|-h=G5_055c$P8+slYU|48u+~b@9w-XNWf~VL jV5m|Iu~>@Bpi00m(Ezj!W*Wf*LO%kE25N|bUuEDEQEpP3 literal 0 HcmV?d00001 diff --git a/assets/character_block.png b/assets/character_block.png new file mode 100644 index 0000000000000000000000000000000000000000..2b7bddf115c489889826a3bca26bebd1d8bf9717 GIT binary patch literal 457 zcmX|7KTpCy96h28V%UjsxSXr)wMEoks8T5^krIL=G8s#IVuQ3zdxpwrT%26|93;*T zeghXjgE0=qFW}&>O1$L$y!*Ypm-p^E?So=rrGOABHV>^X+!%H(w*aSEd;dfzcjWi_ zqHnjD8;)hi3kO_I#}UjCs_v$djc#@wDA@ zrz2PQ$nH*|nlca=bK&50d>JGxHOQ|ngLn2#3I3&skwMJN5clm4u7@$l6?s!~)$%sp z(q*-xZ)+RtSX0zZs_0bRkQ9|EI#X0UUu36%tFd>^y4L>O43I%CgoqfWlgUJ$l;toU zQdQS=s%TWxBw$F%bs(Hn3X-)<;!nfki5vTo@WTLSn$94+5(XhOGof=Ah)4hP0r+o- z2T)54`Ehf`pu5GPX`2W=-YWF~M literal 0 HcmV?d00001 diff --git a/assets/levels/level_1.lua b/assets/levels/level_1.lua new file mode 100644 index 0000000..d4e535c --- /dev/null +++ b/assets/levels/level_1.lua @@ -0,0 +1,449 @@ +return { + version = "1.2", + luaversion = "5.1", + tiledversion = "1.2.4", + orientation = "orthogonal", + renderorder = "right-down", + width = 200, + height = 20, + tilewidth = 32, + tileheight = 32, + nextlayerid = 2, + nextobjectid = 1, + properties = {}, + tilesets = { + { + name = "tile_cave_platform", + firstgid = 1, + tilewidth = 32, + tileheight = 32, + spacing = 0, + margin = 0, + columns = 11, + image = "../tile_cave_platform.png", + imagewidth = 352, + imageheight = 384, + tileoffset = { + x = 0, + y = 0 + }, + grid = { + orientation = "orthogonal", + width = 32, + height = 32 + }, + properties = { + ["collidable"] = "" + }, + terrains = {}, + tilecount = 132, + tiles = { + { + id = 0, + properties = { + ["collidable"] = "true" + } + }, + { + id = 1, + properties = { + ["collidable"] = "true" + } + }, + { + id = 2, + properties = { + ["collidable"] = "true" + } + }, + { + id = 3, + properties = { + ["collidable"] = "true" + } + }, + { + id = 5, + properties = { + ["collidable"] = "true" + } + }, + { + id = 6, + properties = { + ["collidable"] = "true" + } + }, + { + id = 11, + properties = { + ["collidable"] = "true" + } + }, + { + id = 12, + properties = { + ["collidable"] = "true" + } + }, + { + id = 13, + properties = { + ["collidable"] = "true" + } + }, + { + id = 14, + properties = { + ["collidable"] = "true" + } + }, + { + id = 15, + properties = { + ["collidable"] = "true" + } + }, + { + id = 22, + properties = { + ["collidable"] = "true" + } + }, + { + id = 23, + properties = { + ["collidable"] = "true" + } + }, + { + id = 24, + properties = { + ["collidable"] = "true" + } + }, + { + id = 25, + properties = { + ["collidable"] = "true" + } + }, + { + id = 26, + properties = { + ["collidable"] = "true" + } + }, + { + id = 27, + properties = { + ["collidable"] = "true" + } + }, + { + id = 28, + properties = { + ["collidable"] = "true" + } + }, + { + id = 34, + properties = { + ["collidable"] = "true" + } + }, + { + id = 35, + properties = { + ["collidable"] = "true" + } + }, + { + id = 36, + properties = { + ["collidable"] = "true" + } + }, + { + id = 49, + properties = { + ["collidable"] = "true" + } + }, + { + id = 59, + properties = { + ["collidable"] = "true" + } + }, + { + id = 61, + properties = { + ["collidable"] = "true" + } + }, + { + id = 62, + properties = { + ["collidable"] = "true" + } + }, + { + id = 66, + properties = { + ["collidable"] = "true" + } + }, + { + id = 67, + properties = { + ["collidable"] = "true" + } + }, + { + id = 68, + properties = { + ["collidable"] = "true" + } + }, + { + id = 69, + properties = { + ["collidable"] = "true" + } + }, + { + id = 70, + properties = { + ["collidable"] = "true" + } + }, + { + id = 72, + properties = { + ["collidable"] = "true" + } + }, + { + id = 73, + properties = { + ["collidable"] = "true" + } + }, + { + id = 74, + properties = { + ["collidable"] = "true" + } + }, + { + id = 75, + properties = { + ["collidable"] = "true" + } + }, + { + id = 76, + properties = { + ["collidable"] = "true" + } + }, + { + id = 77, + properties = { + ["collidable"] = "true" + } + }, + { + id = 78, + properties = { + ["collidable"] = "true" + } + }, + { + id = 86, + properties = { + ["collidable"] = "true" + } + }, + { + id = 87, + properties = { + ["collidable"] = "true" + } + }, + { + id = 88, + properties = { + ["collidable"] = "true" + } + }, + { + id = 89, + properties = { + ["collidable"] = "true" + } + }, + { + id = 90, + properties = { + ["collidable"] = "true" + } + }, + { + id = 91, + properties = { + ["collidable"] = "true" + } + }, + { + id = 92, + properties = { + ["collidable"] = "true" + } + }, + { + id = 93, + properties = { + ["collidable"] = "true" + } + }, + { + id = 94, + properties = { + ["collidable"] = "true" + } + }, + { + id = 95, + properties = { + ["collidable"] = "true" + } + }, + { + id = 97, + properties = { + ["collidable"] = "true" + } + }, + { + id = 98, + properties = { + ["collidable"] = "true" + } + }, + { + id = 100, + properties = { + ["collidable"] = "true" + } + }, + { + id = 101, + properties = { + ["collidable"] = "true" + } + }, + { + id = 102, + properties = { + ["collidable"] = "true" + } + }, + { + id = 103, + properties = { + ["collidable"] = "true" + } + }, + { + id = 104, + properties = { + ["collidable"] = "true" + } + }, + { + id = 105, + properties = { + ["collidable"] = "true" + } + }, + { + id = 106, + properties = { + ["collidable"] = "true" + } + }, + { + id = 107, + properties = { + ["collidable"] = "true" + } + }, + { + id = 108, + properties = { + ["collidable"] = "true" + } + }, + { + id = 114, + properties = { + ["collidable"] = "true" + } + }, + { + id = 115, + properties = { + ["collidable"] = "true" + } + }, + { + id = 116, + properties = { + ["collidable"] = "true" + } + } + } + } + }, + layers = { + { + type = "tilelayer", + id = 1, + name = "Tile Layer 1", + x = 0, + y = 0, + width = 200, + height = 20, + visible = true, + opacity = 1, + offsetx = 0, + offsety = 0, + properties = {}, + encoding = "lua", + data = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 46, 46, 46, 46, 46, 46, 46, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 46, 46, 46, 46, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 46, 46, 46, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 46, 46, 46, 46, 46, 46, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 45, 0, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + } + } + } +} diff --git a/assets/levels/level_1.tmx b/assets/levels/level_1.tmx new file mode 100644 index 0000000..f6b8819 --- /dev/null +++ b/assets/levels/level_1.tmx @@ -0,0 +1,338 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +46,46,46,46,46,46,46,46,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,46,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,46,46,46,46,46,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,46,46,46,46,46,46,46,46,46,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,46,46,46,46,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,46,46,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,46,46,46,46,46,46,46,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +45,0,46,46,46,46,46,46,46,46,46,46,46,46,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + diff --git a/assets/tile_cave_platform.png b/assets/tile_cave_platform.png new file mode 100644 index 0000000000000000000000000000000000000000..f38d1bdf74936379fde083ef7291406eaa9ccd06 GIT binary patch literal 28624 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 literal 0 HcmV?d00001 diff --git a/entities/Entities.lua b/entities/Entities.lua new file mode 100644 index 0000000..6068e22 --- /dev/null +++ b/entities/Entities.lua @@ -0,0 +1,55 @@ +-- Represents a collection of drawable entities. Each gamestate holds one of these. + +local Entities = { + active = true, + world = nil, + entityList = {} +} + +function Entities:enter(world) + self:clear() + + self.world = world +end + +function Entities:add(entity) + table.insert(self.entityList, entity) +end + +function Entities:addMany(entities) + for k, entity in pairs(entities) do + table.insert(self.entityList, entity) + end +end + +function Entities:remove(entity) + for i, e in ipairs(self.entityList) do + if e == entity then + table.remove(self.entityList, i) + return + end + end +end + +function Entities:removeAt(index) + table.remove(self.entityList, index) +end + +function Entities:clear() + self.world = nil + self.entityList = {} +end + +function Entities:draw() + for i, e in ipairs(self.entityList) do + e:draw(i) + end +end + +function Entities:update(dt) + for i, e in ipairs(self.entityList) do + e:update(dt, i) + end +end + +return Entities \ No newline at end of file diff --git a/entities/Entity.lua b/entities/Entity.lua new file mode 100644 index 0000000..86ea775 --- /dev/null +++ b/entities/Entity.lua @@ -0,0 +1,26 @@ +-- Represents a single drawable object +local Class = require 'libs.hump.class' + +local Entity = Class{} + +function Entity:init(world, x, y, w, h) + self.world = world + self.x = x + self.y = y + self.w = w + self.h = h +end + +function Entity:getRect() + return self.x, self.y, self.w, self.h +end + +function Entity:draw() + -- Do nothing by default, but we still have to have something to call +end + +function Entity:update(dt) + -- Do nothing by default, but we still have to have something to call +end + +return Entity \ No newline at end of file diff --git a/entities/ground.lua b/entities/ground.lua new file mode 100644 index 0000000..fb35235 --- /dev/null +++ b/entities/ground.lua @@ -0,0 +1,18 @@ +local Class = require 'libs.hump.class' +local Entity = require 'entities.Entity' + +local Ground = Class{ + __includes = Entity -- Ground class inherits our Entity class +} + +function Ground:init(world, x, y, w, h) + Entity.init(self, world, x, y, w, h) + + self.world:add(self, self:getRect()) +end + +function Ground:draw() + love.graphics.rectangle('fill', self:getRect()) +end + +return Ground \ No newline at end of file diff --git a/entities/player.lua b/entities/player.lua new file mode 100644 index 0000000..8e2641f --- /dev/null +++ b/entities/player.lua @@ -0,0 +1,91 @@ +local Class = require 'libs.hump.class' +local Entity = require 'entities.Entity' + +local player = Class{ + __includes = Entity -- Player class inherits our Entity class +} + +function player:init(world, x, y) + self.img = love.graphics.newImage('/assets/character_block.png') + + Entity.init(self, world, x, y, self.img:getWidth(), self.img:getHeight()) + + -- Add our unique player values + self.xVelocity = 0 -- current velocity on x, y axes + self.yVelocity = 0 + self.acc = 100 -- the acceleration of our player + self.maxSpeed = 600 -- the top speed + self.friction = 20 -- slow our player down - we could toggle this situationally to create icy or slick platforms + self.gravity = 80 -- we will accelerate towards the bottom + + -- These are values applying specifically to jumping + self.isJumping = false -- are we in the process of jumping? + self.isGrounded = false -- are we on the ground? + self.hasReachedMax = false -- is this as high as we can go? + self.jumpAcc = 500 -- how fast do we accelerate towards the top + self.jumpMaxSpeed = 11 -- our speed limit while jumping + + self.world:add(self, self:getRect()) +end + +function player:collisionFilter(other) + local x, y, w, h = self.world:getRect(other) + local playerBottom = self.y + self.h + local otherBottom = y + h + + if playerBottom <= y then -- bottom of player collides with top of platform. + return 'slide' + end +end + +function player:update(dt) + local prevX, prevY = self.x, self.y + + -- Apply Friction + self.xVelocity = self.xVelocity * (1 - math.min(dt * self.friction, 1)) + self.yVelocity = self.yVelocity * (1 - math.min(dt * self.friction, 1)) + + -- Apply gravity + self.yVelocity = self.yVelocity + self.gravity * dt + + if love.keyboard.isDown("left", "a") and self.xVelocity > -self.maxSpeed then + self.xVelocity = self.xVelocity - self.acc * dt + elseif love.keyboard.isDown("right", "d") and self.xVelocity < self.maxSpeed then + self.xVelocity = self.xVelocity + self.acc * dt + end + + -- The Jump code gets a lttle bit crazy. Bare with me. + if love.keyboard.isDown("up", "w") then + if -self.yVelocity < self.jumpMaxSpeed and not self.hasReachedMax then + self.yVelocity = self.yVelocity - self.jumpAcc * dt + elseif math.abs(self.yVelocity) > self.jumpMaxSpeed then + self.hasReachedMax = true + end + + self.isGrounded = false -- we are no longer in contact with the ground + end + + -- these store the location the player will arrive at should + local goalX = self.x + self.xVelocity + local goalY = self.y + self.yVelocity + + -- Move the player while testing for collisions + self.x, self.y, collisions, len = self.world:move(self, goalX, goalY, self.collisionFilter) + + -- Loop through those collisions to see if anything important is happening + for i, coll in ipairs(collisions) do + if coll.touch.y > goalY then -- We touched below (remember that higher locations have lower y values) our intended target. + self.hasReachedMax = true -- this scenario does not occur in this demo + self.isGrounded = false + elseif coll.normal.y < 0 then + self.hasReachedMax = false + self.isGrounded = true + end + end +end + +function player:draw() + love.graphics.draw(self.img, self.x, self.y) +end + +return player \ No newline at end of file diff --git a/gamestates/LevelBase.lua b/gamestates/LevelBase.lua new file mode 100644 index 0000000..76d1548 --- /dev/null +++ b/gamestates/LevelBase.lua @@ -0,0 +1,46 @@ +-- Each level will inherit from this class which itself inherits from Gamestate. +-- This class is Gamestate but with function for loading up Tiled maps. + +local bump = require 'libs.bump.bump' +local Gamestate = require 'libs.hump.gamestate' +local Class = require 'libs.hump.class' +local sti = require 'libs.sti.sti' -- New addition here +local Entities = require 'entities.Entities' +local camera = require 'libs.camera' -- New addition here + +local LevelBase = Class{ + __includes = Gamestate, + init = function(self, mapFile) + self.map = sti(mapFile, { 'bump' }) + self.world = bump.newWorld(32) + self.map:resize(love.graphics.getWidth(), love.graphics.getHeight()) + + self.map:bump_init(self.world) + + Entities:enter() + end; + Entities = Entities; + camera = camera +} + +function LevelBase:keypressed(key) + -- All levels will have a pause menu + if Gamestate.current() ~= pause and key == 'p' then + Gamestate.push(pause) + end +end + +function LevelBase:positionCamera(player, camera) + local mapWidth = self.map.width * self.map.tilewidth -- get width in pixels + local halfScreen = love.graphics.getWidth() / 2 + + if player.x < (mapWidth - halfScreen) then -- use this value until we're approaching the end. + boundX = math.max(0, player.x - halfScreen) -- lock camera at the left side of the screen. + else + boundX = math.min(player.x - halfScreen, mapWidth - love.graphics.getWidth()) -- lock camera at the right side of the screen + end + + camera:setPosition(boundX, 0) +end + +return LevelBase \ No newline at end of file diff --git a/gamestates/gameLevel1.lua b/gamestates/gameLevel1.lua new file mode 100644 index 0000000..eb8ba77 --- /dev/null +++ b/gamestates/gameLevel1.lua @@ -0,0 +1,51 @@ +-- Import our libraries. +local Gamestate = require 'libs.hump.gamestate' +local Class = require 'libs.hump.class' + +-- Grab our base class +local LevelBase = require 'gamestates.LevelBase' + +-- Import the Entities we will build. +local Player = require 'entities.player' +local camera = require 'libs.camera' + +-- Declare a couple immportant variables +player = nil + +local gameLevel1 = Class{ + __includes = LevelBase +} + +function gameLevel1:init() + LevelBase.init(self, 'assets/levels/level_1.lua') +end + +function gameLevel1:enter() + player = Player(self.world, 32, 64) + LevelBase.Entities:add(player) +end + +function gameLevel1:update(dt) + self.map:update(dt) -- remember, we inherited map from LevelBase + LevelBase.Entities:update(dt) -- this executes the update function for each individual Entity + + LevelBase.positionCamera(self, player, camera) +end + +function gameLevel1:draw() + -- Attach the camera before drawing the entities + camera:set() + + self.map:draw(-camera.x, -camera.y) -- Remember that we inherited map from LevelBase + LevelBase.Entities:draw() -- this executes the draw function for each individual Entity + + camera:unset() + -- Be sure to detach after running to avoid weirdness +end + +-- All levels will have a pause menu +function gameLevel1:keypressed(key) + LevelBase:keypressed(key) +end + +return gameLevel1 \ No newline at end of file diff --git a/gamestates/mainMenu.lua b/gamestates/mainMenu.lua new file mode 100644 index 0000000..36decad --- /dev/null +++ b/gamestates/mainMenu.lua @@ -0,0 +1,3 @@ +local mainMenu = {} + +return mainMenu \ No newline at end of file diff --git a/gamestates/pause.lua b/gamestates/pause.lua new file mode 100644 index 0000000..ae23051 --- /dev/null +++ b/gamestates/pause.lua @@ -0,0 +1,25 @@ +pause = Gamestate.new() + +function pause:enter(from) + self.from = from -- record previous state +end + +function pause:draw() + local w, h = love.graphics.getWidth(), love.graphics.getHeight() + -- draw previous screen + self.from:draw() + + -- overlay with pause message + love.graphics.setColor(0,0,0, 100) + love.graphics.rectangle('fill', 0,0, w, h) + love.graphics.setColor(255,255,255) + love.graphics.printf('PAUSE', 0, h/2, w, 'center') +end + +function pause:keypressed(key) + if key == 'p' then + return Gamestate.pop() -- return to previous state + end +end + +return pause \ No newline at end of file diff --git a/libs/camera.lua b/libs/camera.lua new file mode 100644 index 0000000..1f19522 --- /dev/null +++ b/libs/camera.lua @@ -0,0 +1,24 @@ +camera = {} +camera.x = 0 +camera.y = 0 + +function camera:set() + love.graphics.push() + love.graphics.translate(-self.x, -self.y) +end + +function camera:unset() + love.graphics.pop() +end + +function camera:move(dx, dy) + self.x = self.x + (dx or 0) + self.y = self.y + (dy or 0) +end + +function camera:setPosition(x, y) + self.x = x or self.x + self.y = y or self.y +end + +return camera \ No newline at end of file diff --git a/main.lua b/main.lua new file mode 100644 index 0000000..02fed19 --- /dev/null +++ b/main.lua @@ -0,0 +1,18 @@ +-- Pull in Gamestate from the HUMP library +Gamestate = require 'libs.hump.gamestate' + +-- Pull in each of our game states +local mainMenu = require 'gamestates.mainmenu' +local gameLevel1 = require 'gamestates.gameLevel1' +local pause = require 'gamestates.pause' + +function love.load() + Gamestate.registerEvents() + Gamestate.switch(gameLevel1) +end + +function love.keypressed(key) + if key == "escape" then + love.event.push("quit") + end +end \ No newline at end of file diff --git a/run.sh b/run.sh new file mode 100755 index 0000000..059fbba --- /dev/null +++ b/run.sh @@ -0,0 +1,3 @@ +#!/bin/sh + +open -a love . \ No newline at end of file