Compare commits

...

290 Commits
v0.4.0 ... main

Author SHA1 Message Date
Kazhnuz Klappsthul 7fd8db592d Merge pull request 'feat/rebrand' (#77) from feat/rebrand into master
Reviewed-on: birb/birb-engine#77
2022-08-13 16:37:22 +02:00
Kazhnuz Klappsthul a5f075d5d2 chore: rename modules/ to scenes/ 2022-08-13 12:43:49 +02:00
Kazhnuz Klappsthul c64b9a42b7 vscode: update globals 2022-08-12 10:59:14 +02:00
Kazhnuz Klappsthul 5ab63a145a chore: update readme and changelog 2022-08-12 10:59:03 +02:00
Kazhnuz Klappsthul 6d3c8de013 chore: rename the birb/ folder to framework/ 2022-08-12 10:50:42 +02:00
Kazhnuz Klappsthul d5f446f4ed improvement: use the framework namespace 2022-08-12 10:46:22 +02:00
Kazhnuz Klappsthul 69a567e4c2 Merge pull request 'Rebase on Radiance' (#71) from wip/radiance-rebase into master
Reviewed-on: birb/birb-engine#71
2022-08-12 10:37:34 +02:00
Kazhnuz Klappsthul f3d175266b wip: basic fix for plateform
The real fix will be done when exemples will be reworked from scratch
2022-08-12 10:36:24 +02:00
Kazhnuz Klappsthul f9b936a726 fix(world): fix hitbox type 2022-08-10 19:19:22 +02:00
Kazhnuz Klappsthul 3cb6c61cac fix(plateform): us right function for hitboxes 2022-08-10 19:18:04 +02:00
Kazhnuz Klappsthul eec43a522e fix(tiled): use the sti in the wrapper 2022-08-10 19:17:40 +02:00
Kazhnuz Klappsthul f892b1ce4e fix: add gamesystem as a top-level element 2022-08-10 19:17:24 +02:00
Kazhnuz Klappsthul de08fbd56b fix(textmenu): better scene loading 2022-08-10 19:16:22 +02:00
Kazhnuz Klappsthul 4722b734ed fix: do not load datapack if there isn't any 2022-08-10 19:15:38 +02:00
Kazhnuz Klappsthul a315fcebb5 fix: remove stuff removed from Radiance's birb 2022-07-28 17:31:33 +02:00
Kazhnuz Klappsthul 5178ee0020 wip: other radiance stuff 2022-07-27 21:57:34 +02:00
Kazhnuz Klappsthul c3179dcf9d fix: fix main menu 2021-12-05 12:26:58 +01:00
Kazhnuz Klappsthul 8c4bcc70d5 improvement: add a function to get current scene 2021-12-05 12:23:49 +01:00
Kazhnuz Klappsthul 2974d94df4 fix: load right menus from gui package 2021-12-04 14:12:17 +01:00
Kazhnuz Klappsthul fff87e8ebb fix: fix gametime 2021-12-04 14:12:01 +01:00
Kazhnuz Klappsthul b8ac8e7d51 fix: do not load databack if there isn't a list 2021-12-04 14:09:51 +01:00
Kazhnuz Klappsthul b670e456e4 fix: add data index 2021-12-04 13:52:59 +01:00
Kazhnuz Klappsthul 43f7277dab feat: re-add gamesystem 2021-12-04 13:46:28 +01:00
Kazhnuz Klappsthul a4045ba456 chore: use Radiance launchers 2021-12-04 13:46:20 +01:00
Kazhnuz Klappsthul c5c8897aa6 improvement: use Radiance's birb 2021-12-04 13:18:54 +01:00
Kazhnuz Klappsthul 8ade1a1f93 improvement: replace with Birb version of Radiance 2021-12-04 13:18:32 +01:00
Kazhnuz Klappsthul f347f47aab fix: port the option menu to the new menusystem 2021-01-30 09:19:37 +01:00
Kazhnuz Klappsthul e8b796f978 fix: port to the new menusystem the pause menu 2021-01-30 09:19:22 +01:00
Kazhnuz Klappsthul 150aad86f1 fix: port mainMenu to the new Scene:start() API 2021-01-30 09:18:59 +01:00
Kazhnuz Klappsthul baa5a24ce6 fix: initial ports of the basic scenes 2021-01-30 09:18:07 +01:00
Kazhnuz Klappsthul 8f1c326e6a fix: reset view on page change 2021-01-29 21:54:34 +01:00
Kazhnuz Klappsthul f8910aefa4 feat(textwidget): label replacement 2021-01-24 15:44:24 +01:00
Kazhnuz Klappsthul af6ceef38d improvement: add a way to start a scene after init 2021-01-24 15:44:07 +01:00
Kazhnuz Klappsthul d3350e3938 feat: add a way to apply volume 2021-01-24 15:43:46 +01:00
Kazhnuz Klappsthul 99952487a9 fix: port main menu to textmenu 2021-01-23 18:31:40 +01:00
Kazhnuz Klappsthul 870a4f7118 feat: add a basic text menu 2021-01-23 18:30:45 +01:00
Kazhnuz Klappsthul 772becc1a8 feat(textwidget): extend API 2021-01-23 18:30:30 +01:00
Kazhnuz Klappsthul 92c10440a1 fix: search global asset only if there is no local 2021-01-23 11:28:40 +01:00
Kazhnuz Klappsthul e5d8e699bc feat(asset): fail when an asset doesn't exist 2021-01-17 12:44:40 +01:00
Kazhnuz Klappsthul b22cc2159f feat: add a fail log function 2021-01-17 12:44:25 +01:00
Kazhnuz Klappsthul 0f4b6daf73 feat: add padding to text widgets 2020-12-05 21:20:20 +01:00
Kazhnuz Klappsthul 72829eb02a feat: add multi-label support in text widget 2020-12-05 09:27:40 +01:00
Kazhnuz Klappsthul 49509001ab feat: add asset access to widgets 2020-12-05 09:23:46 +01:00
Kazhnuz Klappsthul 93bbf56047 chore: port the main menu to the new system 2020-12-05 09:02:42 +01:00
Kazhnuz Klappsthul abfda56b14 feat: give the menu name to widgets 2020-12-05 09:02:22 +01:00
Kazhnuz Klappsthul 3ae96e4cfc feat: add a page system to menus 2020-12-05 09:01:41 +01:00
Kazhnuz Klappsthul e2d029ab0f feat: add a function to get a menu 2020-12-04 20:55:01 +01:00
Kazhnuz Klappsthul bb6cf14437 chore:move around menus sub-objects 2020-12-04 13:16:32 +01:00
Kazhnuz Klappsthul a72dfc0711 feat: refactor most menus 2020-12-04 12:57:24 +01:00
Kazhnuz Klappsthul 7e697c3628 feat: add drawWidget
Let the widget handle if its selected or not
2020-12-04 12:55:48 +01:00
Kazhnuz Klappsthul 37fc1fc9be feat: add a selected color for text widgets 2020-12-04 12:54:57 +01:00
Kazhnuz Klappsthul 4ff85e2cc1 feat: add views for 1D and 2D menus 2020-12-04 12:00:43 +01:00
Kazhnuz Klappsthul 89bbf5fff2 feat: add a getter for selected widget 2020-12-04 12:00:28 +01:00
Kazhnuz Klappsthul 876d30671d feat(math): add a basic wrap and limit function 2020-12-04 11:59:32 +01:00
Kazhnuz Klappsthul 12b4b3fbc1 feat(menumodel): add a widget limit 2020-11-29 12:50:07 +01:00
Kazhnuz Klappsthul a3e2da3972 fix(menumodel): fix for loop 2020-11-29 12:43:52 +01:00
Kazhnuz Klappsthul b1cd9a6683 chore: refactor widget list in a menumodel class 2020-11-28 18:32:49 +01:00
Kazhnuz Klappsthul d9b8b71672 chore: separate widgets into three files 2020-11-28 15:27:25 +01:00
Kazhnuz Klappsthul 7e7cfe3763 chore: create a generic guiElement 2020-11-28 14:17:48 +01:00
Kazhnuz Klappsthul dca462803f chore: make the code more readable in menumanager 2020-11-27 19:35:00 +01:00
Kazhnuz Klappsthul 74d8e904b2 chore: put all menus in their own subfolder 2020-11-27 17:00:39 +01:00
Kazhnuz Klappsthul 4b66d15014 chore: port actors to rect and box 2020-11-27 16:03:07 +01:00
Kazhnuz Klappsthul 82cf59588a chore: port menu to rect 2020-11-27 16:02:54 +01:00
Kazhnuz Klappsthul e58f197049 feat: initial version of physical entities for 3D 2020-11-27 16:02:39 +01:00
Kazhnuz Klappsthul cf1928444f fix: remove some problems in point and rects 2020-11-27 16:02:21 +01:00
Kazhnuz Klappsthul fb55c9e706 chore: extract shapes from actor3D 2020-11-27 11:15:57 +01:00
Kazhnuz Klappsthul c3ee812d1a chore: put automove in physics mixin
Fixes #54
2020-11-26 21:08:29 +01:00
Kazhnuz Klappsthul dcc2965431 chore: simplify hitbox applciation 2020-11-26 20:54:16 +01:00
Kazhnuz Klappsthul 9eb0d321c8 chore: improve semantics
- Use "apply" when you apply collision, and not check
- Use "AtPoint" when you check at a point
2020-11-26 20:41:02 +01:00
Kazhnuz Klappsthul b2623cdb6a chore: refactor hitbox adding 2020-11-26 20:29:59 +01:00
Kazhnuz Klappsthul f30fc6346d chore: initialize the hitbox with the physics 2020-11-26 20:18:26 +01:00
Kazhnuz Klappsthul 9993221e0d improvement: use directly a table for box attr 2020-11-26 20:16:19 +01:00
Kazhnuz Klappsthul b071547630 chore: let the hitbox handle the scaling 2020-11-26 20:12:05 +01:00
Kazhnuz Klappsthul 92c08e30ee chore: pack and unpack the coordinates
It'll allow us to unify the hitbox loading system
2020-11-26 19:41:13 +01:00
Kazhnuz Klappsthul 79902a097f chore: extract physics as a mixins
Fixes #52
2020-11-26 19:16:15 +01:00
Kazhnuz Klappsthul 5393d16007 chore: divide simple target into mixins 2020-11-26 18:40:25 +01:00
Kazhnuz Klappsthul b97d320dc7 chore: prepare for division in mixins 2020-11-25 13:30:10 +01:00
Kazhnuz Klappsthul 730d89a76c feat: add basic reusable 2D objects
Fixes #51
2020-11-25 13:29:27 +01:00
Kazhnuz Klappsthul 124a228d3b feat: add a 3D middle point function 2020-11-25 13:02:11 +01:00
Kazhnuz Klappsthul 5837fd8b51 feat: add a global asset system 2020-11-13 19:11:09 +01:00
Kazhnuz Klappsthul c5c9f040bc chore: add asset types to their own folders 2020-11-13 17:51:12 +01:00
Kazhnuz Klappsthul 3b1097c917 chore: make SFX a soundObject too 2020-11-13 17:43:28 +01:00
Kazhnuz Klappsthul fed8ab4662 fix: make unintented local variables globals 2020-11-09 16:01:08 +01:00
Kazhnuz Klappsthul 6a66cff503 fix: fix missing vars 2020-11-09 15:59:57 +01:00
Kazhnuz Klappsthul 77311a803b fix: fix function getActorsInRect 2020-11-09 15:59:05 +01:00
Kazhnuz Klappsthul 982be45f1a fix: add globals 2020-11-09 15:58:30 +01:00
Kazhnuz Klappsthul 6bac6704f5 fix: use the right dimensions for fading 2020-08-09 15:06:25 +02:00
Kazhnuz Klappsthul e8e75ac4db improvement: manage music via core.music
Fix #43
2020-08-09 14:51:52 +02:00
Kazhnuz c946e582bd improvement(options): have default options in conf.lua 2020-05-10 14:21:45 +02:00
Kazhnuz 9a0db953ba feat(debug): add basic loggin framework 2020-05-10 14:06:20 +02:00
Kazhnuz 92cbda69a1 fix(actors): replace deprecated functions after the sprite transition 2020-05-10 11:38:50 +02:00
Kazhnuz 8b3a5f1f0c chore: extract the sprite of the actor 2020-05-10 11:14:51 +02:00
Kazhnuz b12108a260 Merge branch 'birb-refactor' of game-projects/gamecore into master 2020-04-05 18:54:33 +02:00
Kazhnuz f843d4f550 fix: use right names on conf file 2020-04-05 18:49:40 +02:00
Kazhnuz 5575b90271 meta: adapt readme 2020-04-05 18:48:57 +02:00
Kazhnuz ccbff45f21 meta: add the big changes to new version 2020-04-05 18:43:20 +02:00
Kazhnuz 9f4c057a27 chore: place the birb core in a separate folder 2020-04-05 18:39:08 +02:00
Kazhnuz b98e8dd291 fix: use the right option music name in exemples 2020-04-05 18:21:36 +02:00
Kazhnuz 4cedf30bfd chore: separate the exemple project 2020-04-05 18:18:13 +02:00
Kazhnuz d59fe10927 meta: rename as birb 2020-04-05 15:46:56 +02:00
Kazhnuz a83dceee80 feat(utils): add drawBorder function to utils 2019-11-14 19:50:26 +01:00
Kazhnuz ad295bf9c9 feat(fonts): add filter info functions 2019-09-23 13:51:53 +02:00
Kazhnuz 84919719f8 feat(exemple): add a transition when a scene is selected 2019-09-08 16:23:42 +02:00
Kazhnuz 4b24579070 feat(scenes): handle scene transitions 2019-09-08 16:23:30 +02:00
Kazhnuz 8385a69636 feat(screen): add screen transitions 2019-09-08 16:23:12 +02:00
Kazhnuz a1afa0821c feat(timer): add variable interpolation support via tween.lua 2019-09-08 16:18:32 +02:00
Kazhnuz 02bc52a49b feat(timer): add a switch system 2019-09-08 14:21:21 +02:00
Kazhnuz 8290fbb8d2 improvement(actors): use the new timers modules 2019-09-08 12:57:13 +02:00
Kazhnuz ab3d9abf9f feat(modules): new Timers modules 2019-09-08 12:56:59 +02:00
Kazhnuz eccaf77687 feat(example): add a respawn timer 2019-09-08 12:34:16 +02:00
Kazhnuz e40ea3cfab feat(modules): make modules loadable directly from core object 2019-09-08 12:24:57 +02:00
Kazhnuz c339129566 feat(screen): add scissoring functions 2019-09-07 21:53:14 +02:00
Kazhnuz 8e000dbc44 fix(input): improve key flushing 2019-09-07 21:51:20 +02:00
Kazhnuz 47c6bab698 fix(world): link the player to the right input source 2019-09-07 21:34:52 +02:00
Kazhnuz 8d524fb4db fix(input): fix a missing mention of "source" 2019-09-07 21:06:08 +02:00
Kazhnuz 077b1151f1 feat(world/cam): add a way to lock the camera 2019-09-07 21:04:35 +02:00
Kazhnuz 0fecc3a431 chore(actors/gfx): rework the gfx system to use animationEnded callback 2019-09-07 21:00:35 +02:00
Kazhnuz 60390ed1a7 feat(assets/animator): send the callback when the animation end 2019-09-07 20:59:44 +02:00
Kazhnuz e6f0315a8c feat(actors): listen to animationEnded callback from sprite clones
Fixes #38
2019-09-07 20:53:22 +02:00
Kazhnuz 76fb15f862 feat(assets/animator): handle sending callbacks when animation end 2019-09-07 20:52:20 +02:00
Kazhnuz f61f529302 fix(assets/animator): make sure that pauseAtEnd works as intended
Fixes #37
2019-09-07 20:46:00 +02:00
Kazhnuz 3a696ee58c fix(boxes/textured): use the right texture name
Fixes #40
2019-09-07 20:40:03 +02:00
Kazhnuz 77670d8ec0 fix(boxes): make sure that invisible f3D boxes are really invisibles 2019-09-07 20:38:41 +02:00
Kazhnuz b5059e848a fix(world): propagate maptype variables to the parent
Fixes #39
2019-09-07 20:36:06 +02:00
Kazhnuz b167c45530 fix(world3D): use the right variable name for creationID
Fixes #36
2019-09-07 20:32:21 +02:00
Kazhnuz ca721ec8ac feat(camera+map): add a way to add padding to map limits 2019-07-26 11:53:10 +02:00
Kazhnuz 9ea2d2ca40 feat(world): add a wrapper for maps new "getBox()" function 2019-07-26 11:43:54 +02:00
Kazhnuz 2da2ffd538 fix(game): replace love.filesystem.exists by utils.filesystem.exists 2019-07-24 15:24:06 +02:00
Kazhnuz 3e907b69d7 feat(core/input): extract virtualpads from the input controller 2019-07-24 15:22:04 +02:00
Kazhnuz 2e3fd587c0 chore: port every print to new debug mode 2019-07-24 11:21:32 +02:00
Kazhnuz 70d5fdfd8c chore: activate debug mode by default 2019-07-24 11:21:22 +02:00
Kazhnuz 4e9923b2ea feat(core): add a way to activate easily debug mode directly 2019-07-24 11:21:12 +02:00
Kazhnuz 543247e721 feat(core/debug): add log functions 2019-07-24 11:19:10 +02:00
Kazhnuz 88526282ea feat: add default gamesystem uses inside mainmenu 2019-07-24 10:44:03 +02:00
Kazhnuz df274f9dd0 feat: add default gamesystem 2019-07-24 10:43:41 +02:00
Kazhnuz e068acbc7b feat: add a basic gamesystem modules 2019-07-24 10:43:22 +02:00
Kazhnuz d8c0e62190 chore(world): extract map module from the world module
Fix #35
2019-07-22 22:38:19 +02:00
Kazhnuz 303b6a7184 meta: release 0.6.0 2019-07-20 18:08:58 +02:00
Kazhnuz 25e1257cf2 fix(meta): some changelog minor fixes 2019-07-20 18:07:31 +02:00
Kazhnuz 91d7284775 improvement(action3D): remove hitbox drawing) 2019-07-20 17:58:15 +02:00
Kazhnuz 215aed8684 feat(action3D): add player multiple hitboxes 2019-07-20 17:57:46 +02:00
Kazhnuz dd15c329c8 fix(action3D): fix coin position 2019-07-20 17:47:21 +02:00
Kazhnuz eb88c017ea feat(action3D): add collision between coin and player actors 2019-07-20 17:46:56 +02:00
Kazhnuz 54167f8a77 feat(action3D): add coin actor 2019-07-20 17:46:40 +02:00
Kazhnuz 1a5abfeaac feat(world): add a 3D gfx object 2019-07-20 17:45:51 +02:00
Kazhnuz 1d74beb263 improvement(action3D): make action3D wall objects consumes mapped-boxes 2019-07-20 17:11:28 +02:00
Kazhnuz 2ef5c01f47 feat(boxes): add sti-mapped boxes 2019-07-20 17:10:58 +02:00
Kazhnuz 7d65359230 feat(boxes): add a way to make basic boxes invisible 2019-07-20 17:10:40 +02:00
Kazhnuz 3e26d9a769 fix(boxes): make sure that the textured boxes doesn't have lines 2019-07-20 17:09:57 +02:00
Kazhnuz cbebb16c46 feat(action3D): add box objects 2019-07-20 16:55:06 +02:00
Kazhnuz 107b75c3ed feat(assets): add box assets 2019-07-20 16:54:48 +02:00
Kazhnuz 56c64baba5 fix(boxes): make textured boxes available 2019-07-20 16:54:14 +02:00
Kazhnuz eb751807f4 fix(boxes): correctly load textured boxes' textures 2019-07-20 16:53:58 +02:00
Kazhnuz c53e91a564 feat(world3D): add a way to adapt y position from tiled 2019-07-20 16:53:20 +02:00
Kazhnuz 27773ad8d6 fix(world): don't draw unused objectlayers 2019-07-20 10:25:25 +02:00
Kazhnuz b5be7e58a3 fix(plateformer): use the right path for plateformer example 2019-07-20 10:24:09 +02:00
Kazhnuz 93c4f5251d feat: add better credits 2019-07-20 10:20:26 +02:00
Kazhnuz 79f38a2585 improvement: update assets credits 2019-07-20 10:12:05 +02:00
Kazhnuz 7e91bf406d chore(examples): put together all assets. 2019-07-20 09:57:00 +02:00
Kazhnuz 90d0892b7e feat(boxes): add a textured box 2019-07-19 18:48:42 +02:00
Kazhnuz 4e366051c4 improvement(boxes): only use one texture for boxes instead of two 2019-07-19 18:48:15 +02:00
Kazhnuz afbbf50539 improvement(action3D): add boxes 2019-07-16 16:37:32 +02:00
Kazhnuz c04d9f3ba1 feat(world3D): allow creating collision from their top side 2019-07-16 10:53:36 +02:00
Kazhnuz 22c8617717 feat(examples): add a big fake3D map example 2019-07-16 10:53:02 +02:00
Kazhnuz 542f9c6bac improvement(core): activate vsync by default.
Fix #28
2019-07-15 10:27:55 +02:00
Kazhnuz 26ff29b8aa Merge branch 'fix-cameras' of game-projects/gamecore into master 2019-07-15 10:17:21 +02:00
Kazhnuz a48308ae40 meta: update CHANGELOG 2019-07-15 10:13:51 +02:00
Kazhnuz 932ec26283 improvement(boxes): don't export as a texture the shadow canvas
As now the canvas drawing isn't affected by the transform, it should be 
safe to not export it as a texture anymore.
2019-07-15 10:11:11 +02:00
Kazhnuz 79aff589b9 fix(camera): remove test reticule 2019-07-15 10:09:54 +02:00
Kazhnuz 2f7d313ab9 fix(camera): fix tearing and heavy pixelisation in zoom mode
Currently, the canvas was created at render size and elements where 
resized inside. Work a bit differenlty, by creating a canvas that have 
the view "true" size (meaning the scaled size), and draw everything at 
1:1 size inside. Then, when drawing the view canvas, resize the whole 
canvas at the multiplication of both scaling.
2019-07-15 10:04:06 +02:00
Kazhnuz f2cabff81c chore(camera): improve comments 2019-07-14 23:15:30 +02:00
Kazhnuz f9a268a51a improvement(camera): make getViewsDimensions a wrapper around a camutil 2019-07-14 23:12:22 +02:00
Kazhnuz 7376d75aeb chore(camera): simplify view system
Remove view.cam and view.pos
2019-07-14 22:59:58 +02:00
Kazhnuz 7ec715850c chore(camera): remove unused functions 2019-07-14 22:53:55 +02:00
Kazhnuz 81dd584e11 improvement(camera): use a new canvas-based view system 2019-07-14 22:49:27 +02:00
Kazhnuz 35433b273d chore(camera): remove hump.camera 2019-07-14 18:57:50 +02:00
Kazhnuz c7e2f2daca fix(baseworld): draw all map layer instead of using map:draw()
It allow us to use the exact same transform for map and actors
2019-07-14 18:51:00 +02:00
Kazhnuz f48de0e9bd improvement(camera): manually attach the view instead of using hump func 2019-07-14 18:48:25 +02:00
Kazhnuz 6947d2f3f2 fix(camera): fix onscreen coordinates by using new core.screen func 2019-07-14 18:41:13 +02:00
Kazhnuz fb428b45c3 chore(camera): put the view algorithm in a "utils" file 2019-07-14 18:35:33 +02:00
Kazhnuz e4b89ddd31 chore(camera): split camera into a specific folder 2019-07-14 18:28:29 +02:00
Kazhnuz 1c8c2d6937 feat(screen): add a way to get coordinate and scale 2019-07-14 15:51:58 +02:00
Kazhnuz 208c523248 fix(camera): fix map not being clipped in split mode
Fixes #29
2019-07-13 00:29:43 +02:00
Kazhnuz fafaa3fe49 fix(camera): remove scissoring from the hump camera library used 2019-07-13 00:26:16 +02:00
Kazhnuz 443b8c0e1c improvement(examples): put menu examples after gameplay examples 2019-07-12 23:52:49 +02:00
Kazhnuz fbe5d56b4d fix(examples): add missing translations 2019-07-12 23:51:51 +02:00
Kazhnuz 98103a8d48 improvement(example): rename topdown example 2019-07-12 23:48:57 +02:00
Kazhnuz 6ee3a910f6 feat(examples): Add tests for all player number and camera mode 2019-07-12 23:42:25 +02:00
Kazhnuz f9ba042089 feat(examples): add a way to add argument to examples scenes in mainmenu 2019-07-12 23:35:04 +02:00
Kazhnuz a7821e8f48 improvement(examples): remove basic examples
They weren't a good demonstration of actual use of the engine, as they 
were just some quick test created at the beggining. So long, basic 
examples.
2019-07-12 23:30:32 +02:00
Kazhnuz ee6ac56eea feat(examples): make player number and camera mode customizable 2019-07-12 23:28:06 +02:00
Kazhnuz 342d073572 fix(world3D): dont attribute the getVisibleActor() function to baseworld 2019-07-12 23:22:03 +02:00
Kazhnuz 242e916d4b fix(actor2D): remove an erroneous call to Actor3D 2019-07-12 23:18:01 +02:00
Kazhnuz 696360ac30 Merge branch 'world-fake3D' of game-projects/gamecore into master 2019-07-06 18:13:51 +02:00
Kazhnuz 0993f1e8bb fix(boxes): remove some test print. 2019-07-06 18:02:53 +02:00
Kazhnuz a3b0f47127 feat(actor3D): cast shadow below the actor. 2019-07-06 18:00:00 +02:00
Kazhnuz c043bb8ecf feat(actor3D): add zSorting support 2019-07-01 18:06:25 +02:00
Kazhnuz 5bdb275b8a feat(actor3D): add a basic 3D box drawing system for 3D actors 2019-07-01 17:00:55 +02:00
Kazhnuz cdddc79973 feat(moveplayer3D): add sprite direction 2019-07-01 14:18:04 +02:00
Kazhnuz 940cb1b41f improvement(camera): use the shape system to control the camera. 2019-07-01 14:15:10 +02:00
Kazhnuz c06f1c49aa feat(world3D): add a visible shape system to handle better visiblity
Actor2D also have a shape, in order to use them in other functions.
2019-07-01 14:13:26 +02:00
Kazhnuz ddebdba2e8 fix(moveplayer3D): use ground speed instead of xsp for animations 2019-07-01 10:50:21 +02:00
Kazhnuz cf04a16c84 fix(actor3D): improve sprite drawing in fake3D worlds 2019-07-01 09:57:45 +02:00
Kazhnuz 9639524abe Merge branch 'world-fake3D' of https://git.chlore.net/game-projects/gamecore into world-fake3D 2019-06-30 22:05:08 +02:00
Kazhnuz 1ee0b77b50 feat(examples): add sprite support in moveplayer3D 2019-06-30 22:05:02 +02:00
Kazhnuz 5f5b4da9c5 fix(actor3D): fix checkGround not trying the right coordinate 2019-06-30 22:04:30 +02:00
Kazhnuz fc32ce43f5 fix(actor3D): fix checkGround not trying the right coordinate 2019-06-30 22:04:01 +02:00
Kazhnuz 30a0d59a41 improvement(examples): register the fake3D example 2019-06-30 17:10:29 +02:00
Kazhnuz 0687bc4cfe feat(examples): add an initial fake3D example based on moveplayer 2019-06-30 17:10:16 +02:00
Kazhnuz 2004efa558 feat(world): add initial fake3D world implementation 2019-06-30 17:07:58 +02:00
Kazhnuz a60058522b chore(baseworld): make drawing reordering part of getVisibleActors(id) 2019-06-30 17:07:03 +02:00
Kazhnuz ce48e451c1 Merge branch 'new-cameras' of game-projects/gamecore into master 2019-06-29 21:53:57 +02:00
Kazhnuz b558650d00 feat(camera): add more camera types 2019-06-29 18:42:38 +02:00
Kazhnuz 57446b89a3 fix(utils): fix some glitch in utils.table.sum 2019-06-29 14:02:03 +02:00
Kazhnuz 49558ac6e4 Merge branch 'new-cameras' of https://git.chlore.net/game-projects/gamecore into new-cameras 2019-06-29 11:49:57 +02:00
Kazhnuz 4cb3a7a105 feat(loveutils): add basic table functions 2019-06-29 11:49:48 +02:00
Kazhnuz 91fc55555f feat(camera): make the camera support multiple "mode" 2019-06-29 11:32:42 +02:00
Kazhnuz 392fa80986 feat(camera): make the camera support multiple "mode" 2019-06-29 11:25:40 +02:00
Kazhnuz a31eae5c24 Merge branch 'world-cleanup' of game-projects/gamecore into master 2019-06-29 10:52:17 +02:00
Kazhnuz e7c7aa1f79 fix(world): rename some instance of BaseWorld in world2D 2019-06-28 11:54:34 +02:00
Kazhnuz e6c2af5429 feat(world): make object creation more customizable by worlds 2019-06-28 10:06:38 +02:00
Kazhnuz 369e0ceec0 improvement(actor): put hitbox functions that make sense in baseactor 2019-06-28 08:43:01 +02:00
Kazhnuz b4f3008552 improvement(actor): put physics functions that make sense in baseactor 2019-06-27 22:14:12 +02:00
Kazhnuz ff78a6ecfe improvement(actor): put gravity that make sense functions in baseactor 2019-06-27 22:02:47 +02:00
Kazhnuz 10bbd5fd84 improvement(actor): merge most physics initialisation 2019-06-27 21:56:02 +02:00
Kazhnuz 049213000a improvement(world): separate future position and friction from autoMove 2019-06-27 21:29:49 +02:00
Kazhnuz c57f372648 chore(world): improve separation between bodies and actors in code 2019-06-27 21:22:33 +02:00
Kazhnuz 7cce6ea99f improvement(world): separate queryRect into 2 functions 2019-06-27 21:20:54 +02:00
Kazhnuz f68e300019 feat(hitbox): add a way to advertise an hitbox as main hitbox 2019-06-27 21:15:57 +02:00
Kazhnuz 81c7dc7cd4 Merge branch 'simpler-gravity' of game-projects/gamecore into master 2019-06-27 21:06:05 +02:00
Kazhnuz 0a66082e99 chore(actor2D): group gravity functions together 2019-06-27 21:05:23 +02:00
Kazhnuz e916c28630 fix(actor2D): simplify gravity system by not handling x by default 2019-06-27 21:03:34 +02:00
Kazhnuz 9f66df8537 fix(actor2D): let hitboxes handle themselves 2019-06-27 20:46:21 +02:00
Kazhnuz b7344a8973 fix(actor2D): fix a function being put in the wrong object 2019-06-27 20:38:15 +02:00
Kazhnuz 961c7816c1 Merge branch 'new-hitbox-system' of game-projects/gamecore into master 2019-06-23 15:54:18 +02:00
Kazhnuz cace01cf3a feat(world): add a way to check every hitbox collisions 2019-06-23 15:53:51 +02:00
Kazhnuz 89b2ffe483 feat(world): add a way to automatically load hitbox from a file 2019-06-23 15:45:34 +02:00
Kazhnuz 3fd8d2fecc fix(hitboxes): reset colors after the hitbox is drawn. 2019-06-23 15:44:46 +02:00
Kazhnuz 41cbf40890 fix(examples): call the right function in movable player example 2019-06-23 15:41:30 +02:00
Kazhnuz eafc266544 fix(baseworld): make baseworld not crash when a body is loaded 2019-06-23 15:39:57 +02:00
Kazhnuz 3314f1e3f9 improvement(actor): ignore by default collision with actor own hitboxes 2019-06-23 15:32:25 +02:00
Kazhnuz 5c5b3eed34 fix(assets): add "return" call that were forgotten 2019-06-23 15:29:08 +02:00
Kazhnuz dca4ece7fe feat(assets): add a new getCurrentAnimation function 2019-06-23 15:25:56 +02:00
Kazhnuz 6fb3fecc95 feat(assets): add more wrapper around sprite functions in BaseActor 2019-06-23 14:27:07 +02:00
Kazhnuz 531f3c5803 feat(assets): add more wrapper around animator functions in Sprite 2019-06-23 14:25:02 +02:00
Kazhnuz 8a5692c1a1 feat(assets): add a way to get current relative frame
This function return the current frame relative to the first frame of 
the current animation
2019-06-23 14:23:51 +02:00
Kazhnuz a3b6bcd499 feat(world): add a frame hitbox data structure to process
It'll allow us to create a way to process everyframe of an animation and 
change hitbox according to the animation.

It should especially simplify the creation of battle system.
2019-06-23 10:19:01 +02:00
Kazhnuz f88c7f49e4 feat(world): add multiple hitbox support on actor2D 2019-06-22 22:11:22 +02:00
Kazhnuz c553dfafa3 feat(examples): add ducking in plateforming example
Show how we can now modify in action an hitbox without glitching it
2019-06-22 20:17:36 +02:00
Kazhnuz b770253cb5 fix(examples): adapt to the new hitbox system 2019-06-22 19:28:28 +02:00
Kazhnuz 8c1e9d8e05 feat(world): initial support for external hitbox
For the moment it doesn't add any real feature, but it allow the 
mainHitbox to be an external object to the actor, giving to it more 
power.
2019-06-22 19:27:31 +02:00
Kazhnuz cb97c2ceee chore(world): prepate using an external hitbox object 2019-06-22 17:27:36 +02:00
Kazhnuz 2b1bdd0be5 improvement(world): separate bodies from actor management 2019-06-22 17:19:54 +02:00
Kazhnuz 241baad935 fix(world): remove a forgotten debug function 2019-06-21 20:06:58 +02:00
Kazhnuz 4547628ba5 Merge branch '0.5.1' 2019-06-21 18:57:43 +02:00
Kazhnuz ff38f7fe87 Merge branch '0.5.x' of https://git.chlore.net/game-projects/gamecore into 0.5.1 2019-06-21 18:55:31 +02:00
Kazhnuz 0b6101a398 meta: fix changelog 2019-06-21 18:53:53 +02:00
Kazhnuz 79c79d9613 Merge branch '0.5.1' of game-projects/gamecore into 0.5.x 2019-06-21 18:52:33 +02:00
Kazhnuz 664a2c7309 meta: publish 0.5.1 2019-06-21 18:51:41 +02:00
Kazhnuz 91019b2074 fix(world): use right camera internal coordinate
Fixes #15 and #17
2019-06-21 18:51:14 +02:00
Kazhnuz 408a71434f fix(world): use right camera internal coordinate
Fixes #15 and #17
2019-06-21 18:50:45 +02:00
Kazhnuz 3ced2dbef4 fix(world): separate getting data from the internal and advertised view
Use two functions instead of just one, one showing the actual dimensions 
of the internal "cam" (basically, the whole screen), and one showing the 
advertised displaced camera.

Fixes #16
2019-06-21 18:27:02 +02:00
Kazhnuz 80072d285a fix(examples): add missing HUD in one-player example 2019-06-21 17:11:32 +02:00
Kazhnuz fd1a05a9a8 meta: publish 0.5.0 2019-06-16 16:41:06 +02:00
Kazhnuz 9bc70a601f meta: update changelog 2019-06-16 16:37:47 +02:00
Kazhnuz 81015b011b feat(examples): add a pause menu in plateformer example 2019-06-16 16:37:22 +02:00
Kazhnuz b47e158126 feat(menusystem): add a function to deactivate assets when menu is active 2019-06-16 16:36:39 +02:00
Kazhnuz a227bbb033 feat(world): add a function to reset world 2019-06-16 16:33:29 +02:00
Kazhnuz fb35eca0fa feat(menusystem): add a way to deactivate world when activating the menu 2019-06-16 16:21:26 +02:00
Kazhnuz f7040d1854 feat(world): draw actors according to their depth
It allow us to draw some sprites always over some others.

Fixes #8
2019-06-16 10:24:30 +02:00
Kazhnuz 54b01b0d94 feat(world): add a creationID variable to keep track of actors ID 2019-06-16 10:08:59 +02:00
Kazhnuz e9f5731a34 meta: update CHANGELOG 2019-06-16 10:01:21 +02:00
Kazhnuz 61b3c29f6b improvement(world): only draw visible actors when a camera is active
It'll make the game less laggy. For the moment, no need to only update 
visible actors.

Fixes #14
2019-06-16 10:00:05 +02:00
Kazhnuz 65b0c74a06 feat(world): add a batchActor function activated by a bool in tiled
This way, you can add multiple actors with just one tiled object. It 
also bring better feature parity with Imperium Porcorum.

Fixes #10
2019-06-15 11:50:53 +02:00
Kazhnuz 4c2427bfd6 feat(world): add a drawHUD function to draw the current HUD
It is able to draw everything a player object want directly where it 
should go.

Fixes #3
2019-06-13 22:23:23 +02:00
Kazhnuz 6f59f1e732 refactor(examples): use updateStart(dt) and updateEnd(dt)
Allow to drop easily some instance of calling the parent's same function
2019-06-13 18:44:13 +02:00
Kazhnuz 1c879b2090 meta: update changelog 2019-06-13 18:40:10 +02:00
Kazhnuz 58b8c95d62 feat(actor): add *Start() and *End() functions 2019-06-13 18:39:09 +02:00
Kazhnuz 055ae92eb9 feat(scene): add *Start() and *End() functions.
Make the scene children able to add functions before or after 
everything.
2019-06-13 18:33:29 +02:00
Kazhnuz 5f5faddbd5 meta: add a changelog 2019-06-13 17:47:48 +02:00
Kazhnuz d8c0ce8f00 meta: add a code of conduct
Use the Contributor Covenant Code of Conduct
2019-06-11 19:48:56 +02:00
Kazhnuz 236184ce0c example/plateformer: also pause asset animation 2019-05-30 13:56:14 +02:00
Kazhnuz e475604c57 gamecore/assets: add activity handling functions 2019-05-30 13:54:39 +02:00
Kazhnuz 67cb930ae7 example/plateformer: add a basic pause button 2019-05-30 13:49:46 +02:00
Kazhnuz af96232d53 gamecore/input: fix two glitches in the key flushing system 2019-05-30 13:49:19 +02:00
Kazhnuz 80ef8b1a65 gamecore/world: add an activity system for the world 2019-05-30 13:37:55 +02:00
Kazhnuz e73d6804f5 gamecore/scenemanager: draw the world before drawing the scene 2019-05-30 13:37:30 +02:00
Kazhnuz 48aa0a3eab gamecore/scene: put world wrapper inside the scene 2019-05-30 13:27:41 +02:00
Kazhnuz df4d264c21 gamecore/scenemanager: let the scene manager handle directly the world 2019-05-28 19:31:42 +02:00
Kazhnuz 23f17491ad gamecore/world: make the world registerable directly by itself 2019-05-28 19:28:05 +02:00
265 changed files with 13342 additions and 3632 deletions

15
.vscode/settings.json vendored Normal file
View File

@ -0,0 +1,15 @@
{
"Lua.diagnostics.globals": [
"love",
"loadstring",
"unpack",
"framework",
"utils",
"core",
"scenes",
"game"
],
"Lua.diagnostics.disable": [
"redundant-parameter"
]
}

354
CHANGELOG.md Normal file
View File

@ -0,0 +1,354 @@
# CHANGELOG
All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## Unreleased
- Project renamed to Epervier Framework and rebased entirely on Sonic Radiance codebase
- New loading system
### Added
- Add a gamesystem module
- **core/debug:** new logging framework
- **camera+maps:** add a way to add padding to map limits
### Changed
- **world:** extract map module from the world module
- **core/input:** extract virtualpads from the input controller
- **core:** The core is now separated from the rest of the framework
- **core+assets:** Music are now managed directly by the core
## [0.6.0] - 2019-07-20
- Meta: Add proper crediting
### Added
- **actor2D:** Make hitbox modifiable.
- **actor2D:** Add multiple hitbox support.
- **assets:** Add a way to get current relative frame
- **assets:** Add more wrapper around animator functions in Sprite
- **world:** Add more wrapper around sprite functions in BaseActor
- **assets:** Add a new getCurrentAnimation function
- **world:** Add a way to automatically load hitbox from a file
- **utils:** Add basic table functions
- **camera:** Add two new camera types: "middle" and "zoom".
- **world:** Add a fake 3D world, à la Zelda or BeatThemAll, complete with shadow support
- **examples:** Test all player number and camera types
- **core.screen:** Add a way to get coordinate and scale
### Changed
- **world2D:** Use a list for bodies (hitboxes, etc) and one other for actors
- **world2D:** Make the hitbox an object, owned by the actor
- **actor:** Rename all function related to YGravity to just \*Gravity
- **world:** Separate "queryRect()" into two functions
- **world:** Make object creation more customizable by worlds
- **camera:** Make mode configuration configurable
- **examples:** Rename "movable" to "topdown"
- **camera:** Brand new camera system based on canvases instead of just transforms
- **core:** Activate vsync by default.
- **examples:** Put together all assets.
### Fixed
- **world:** Remove a forgotten camera debug function
- **examples:** Add missing translations
- **camera:** Fix onscreen coordinates by using new core.screen func
- **camera:** Fix camera's drawing in other resolution mode
- **world:** Don't draw unused sti objectlayer
### Removed
- **actor:** Remove all function related to XGravity
- **examples:** Remove basic examples
- **libs:** Remove hump.camera
## [0.5.1] - 2019-06-21
### Fixed
- **examples:** Add missing HUD example for one-player plateformer
- **world:** Separate getting dimensions of the internal and advertised view.
- **world:** use right camera internal coordinate
## [0.5.0] - 2019-06-16
- Meta: Add a Code of Conduct
- Meta: Add a Changelog
### Added
- **world:** Add an activity system
- **assets:** Add an activity system
- **example/plateformer:** add a basic pause button
- **scene**: Add functions to add stuf before and after `update` and `draw()`
- **actor**: Add functions to add stuf before and after `update` and `draw()`
- **world/camera:** Add support for Head-Up-Display
- **world:** Support batching actor loading
- **world:** Add `Actor.creationID` to keep the order in which actors have been created
- **world:** Add `Actor.depth` to keep the order in which actors are drawn
- **menusystem;** Add a way to deactivate assets and the world when activating the menu
- **world:** Add a reset function
- **examples/plateform:** Add a pause menu
### Changed
- **world:** automatize world integration in a scene
- **world:** only visible actors are drawn
### Fixed
- **core.input:** use the right argument in `core.input:flushKeys()`'s loop
- **scene:** use `core.input:flushKeys()` in `Scene:flushKeys()` instead of `core.input:flushSourceKeys()`
## [0.4.0] - 2019-05-06
- Add Bump2D-handled world system
### Added
- **world:** Add a `World2D` world object using Bump2D as a backend
- **world/actor:** Support bump2D filter
- **loveutils:** `love.math.toZero` substract a variable to another to zero
- **assets:** Add batch loading of assets
- **examples:** Add batch asset files
- **examples/plateformer:** Add a plateformer example
- **world:** Add a splitscreen-compatible camera system powered by hump.camera
- **examples:** Add cameras
- **world:** Support object loading from Tiled
- **world/actor:** Add sprite support in Actor2D
- **assets:** Add support for sprites origins in tileset and animations
- **world:** Add `World:initActors()` to init Actors
- **world:** automatize multiple character handling
- **loveutils:** `utils.math.between(num, min, max)` make sure that a number is between two value
- **world:** Add a gravity system
- **world/actors:** `Actor:destroy()` destroy the actor
- **world/actors:** Add a basic timer system to actors
- **world/actors:** Create a parent `BaseActor` that'll serve as a parent for Actor2D and other future actors
- **assets:** add getDimensions() to tileset, sprite and animators
- **world:** add a generic gfx actor
### Changed
- **examples/moveplayer:** move to World2D
- **world:** separate map loading from level initialization
- **examples/moveplayer:** use a different map
- **examples/moveplayer:** Use this example to show multiplayer capabilities
## [0.3.0] - 2019-04-20
- General cleanups and reorganisation of the base code to be more legible
- Add translation
- Some internal improvement to how gamecore works
### Added
- **examples:** Basic Inventory menu
- **menusystem:** Horizontal listbox menu
- **menusystem:** Lock/visiblity management functions
- **examples/mainmenu:** Add a back and exit widget
- **world:** Embed librairies
- **world:** Add actors managing functions
- **world:** Map loading system using STI
- **examples:** Add a movable multi-player example
- **world:** Add a basic player system directly inside world system
- **menusystem:** `Widget.creationID` contain the creation order of every menu widget
- **menusystem:** `Widget.order` handle the order of the widget in the menu
- **world:** add `xsp` and `ysp` variable to handle speed to the actor object
- **examples:** add an option menu
- **menusystem:** `Widget:invalidateCanvas()` to make a canvas need a redraw
- **core.lang:** Get the translation data instead of directly putting them in core.lang.datas
- **core.options:** Add controller variable
- **core.options:** `core.options:setInputKey(sourceid, padkey, key)`
- **scenes:** `Scene:keypressed( key, scancode, isrepeat )` and `Scene:keyreleased( key )` callbacks added
- **menusystem:** Add a global activity flag
- **examples/options:** Key customization handling
- **examples:** Add music and SFX
- **menusystem:** Add `Menu:resetSound()` to entirely reset the sound values of a menu
- **menusystem:** Add `Menu:setSoundFromSceneAssets(name)` to simplify sound managin
- **menusystem:** Add sound batch management function
### Changed
- **menusystem:** Separate activity and visiblity lock
- **menusystem:** Add as an argument to widgets actions if the widget have been interacted by a pointer or a key
- **examples:** Reorganize folder
- **world:** Make world system need an actorlist
- **core.inputs:** /!\BREAKING: Use a multi-source system for the input system, and adapt different module to use it
- **core.lang:** /!\BREAKING: New language metadata format and complete rework of the translation system
- **core:** directly handle love2D's callbacks inside gamecore
- **menusystem:** rename `Menu:playSelectSound()` to `Menu:self:playSelectSound()`
- **menusystem:** Internally link the whole menusystem to a scene
### Removed
- `MenuSystem.TextMenu` wasn't used since a long time, and was a menu that modified the widgets.
- `MenuSystem:keyreleased(key, code)` was just dead code
- `core.lang:getStringList(library, file)` is replaced in the new translation system
### Fixed
- core: load core.lang
## [0.2.0] - 2019-06-04
### Added
- **examples:** Use some text menus in the example menu
- **examples:** Test entity system
- **examples:** Add a main menu to the examples
- **menusystem:** Add functions to menusystem to set visibility to menus
- **menusystem:** Add functions to menusystem to switch current menu
- **menusystem:** Add depth system to menus
- **world:** Add world and actor system
### Changed
- **scene:** rework input locking system to add a timeout
### Fixed
- **loveutils:** Fix a crash in `utils.math.pointDistance`
## [0.1.0] - 2019-18-03
### Added
- **examples:** First two basic examples to show the capability of gamecore
- **scenes:** Start using a wrapper around `core.scenemanager.currentScene` to set the new Scene
- **scenes:** Add a storage system inside `core.scenemanager` to be able to keep previous scene
- **menusystem:** Basic menu examples to test menu capabilities
- **assets:** Add a mask system to `Texture`, `Tileset` and `Animation`
### Changed
- **scene:** `Scene` now registerd themselves
- **assets:** `Texture` assets are now a custom object instead of directly using love's texture.
### Fixed
## [0.0.1] - 2019-16-03
- Initial release based on a standalone version of Imperium Porcorum's Core.

21
CREDITS.md Normal file
View File

@ -0,0 +1,21 @@
# gamecore credits
## Library used
- [Binser](https://github.com/bakpakin/binser) under MIT Licence
- [Classic](https://github.com/rxi/classic) under MIT Licence
- An altered version of [CScreen](https://github.com/CodeNMore/CScreen) under a custom licence.
- [LoveBird](https://github.com/rxi/lovebird) under MIT Licence
- [Bump.lua](https://github.com/kikito/bump.lua), under MIT Licence
- [Bump.3DPD](https://github.com/oniietzschan/bump-3dpd), under MIT Licence
- [Tsort](https://github.com/bungle/lua-resty-tsort), under BSD-2 Clause
- [Simple Tiled Implementation](https://github.com/karai17/Simple-Tiled-Implementation), under MIT Licence
- [tween.lua](https://github.com/kikito/tween.lua), under MIT Licence

View File

@ -1,44 +1,40 @@
# gamecore
# Épervier Framework
Gamecore aim to be an integrated, simple core system for love2D. It aim to make work in a integrated way several managers to automatically handle inputs, screen, and several utilities to make game developpement easier and less repetitive.
The Épervier Framework is an RPG-oriented framework for Love2D. It aim to work as a set of managers to automatically handle inputs, screen, and several utilities to make game developpement easier and less repetitive. It's also specialized in game with RPG mechanics, with functions to serialize/deserialize easily datas.
Gamecore use [Classic](https://github.com/rxi/classic/) as its base Object
Épervier use [Classic](https://github.com/rxi/classic/) as its base Object.
## How to load GameCore
## Core features
To load gamecore, you basically need the following code.
Épervier provide a lot of feature that can be usefull to create an RPG. This is a non-exhaustive list of what the framework can do :
````
Core = require "gamecore"
- Scene system to be able to change your gameplay easily, with transitions
- Easy data loading and parsing via the core.data module
- A save system using data serialization
- Tweening and time support via tween.lua
- A world system with support for camera, multiple hitbox per actor, and two type of physics (bump2D and bump3D) and tiled map loading (via sti.lua)
- A GUI system to make your game more easily have HUD and menus
- Several utilities functions
function love.load()
core = Core()
## How to load Épervier
The framework must be located in the `framework/` folder to work. After that, all you have to do is to load a gamecore based engine and then.
Note : the `framework`, `core`, `game` and `utils` global namespaces will be used by the framework.
```lua
require "framework"
function love.load(args)
framework.start("game", args)
end
````
```
Then you have to create some scene object,
### Launch in debug mode
## Gamecore managers
To launch in debug mode, the love2D game must be launched with a DEBUGLEVEL bigger than 1, for instance :
- Debug
- Input
- Lang
- Options
- Screen
- Scene Manager
## GameCore modules
Modules are utilies that you can load everywhere in your code and that aren't loaded specifically inside the core.
- Scene Object
- Assets
- Menu System
```sh
love ./examples DEBUGLEVEL=4
```

46
code-of-conduct.md Normal file
View File

@ -0,0 +1,46 @@
# Contributor Covenant Code of Conduct
## Our Pledge
In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.
## Our Standards
Examples of behavior that contributes to creating a positive environment include:
* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members
Examples of unacceptable behavior by participants include:
* The use of sexualized language or imagery and unwelcome sexual attention or advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a professional setting
## Our Responsibilities
Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.
Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
## Scope
This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at kazhnuz@chlore.net. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]
[homepage]: http://contributor-covenant.org
[version]: http://contributor-covenant.org/version/1/4/

View File

@ -1,41 +0,0 @@
function love.conf(t)
t.identity = "space.kazhnuz.GameCore" -- The name of the save directory (string)
t.version = "11.1" -- The LÖVE version this game was made for (string)
t.console = false -- Attach a console (boolean, Windows only)
t.accelerometerjoystick = false -- Enable the accelerometer on iOS and Android by exposing it as a Joystick (boolean)
t.gammacorrect = false -- Enable gamma-correct rendering, when supported by the system (boolean)
t.window.title = "GameCore Example" -- The window title (string)
t.window.icon = nil -- Filepath to an image to use as the window's icon (string)
t.window.width = 424 -- The window width (number)
t.window.height = 240 -- The window height (number)
t.window.borderless = false -- Remove all border visuals from the window (boolean)
t.window.resizable = false -- Let the window be user-resizable (boolean)
t.window.minwidth = 1 -- Minimum window width if the window is resizable (number)
t.window.minheight = 1 -- Minimum window height if the window is resizable (number)
t.window.fullscreen = false -- Enable fullscreen (boolean)
t.window.fullscreentype = "exclusive" -- Choose between "desktop" fullscreen or "exclusive" fullscreen mode (string)
t.window.vsync = true -- Enable vertical sync (boolean)
t.window.msaa = 0 -- The number of samples to use with multi-sampled antialiasing (number)
t.window.display = 1 -- Index of the monitor to show the window in (number)
t.window.highdpi = false -- Enable high-dpi mode for the window on a Retina display (boolean)
t.window.x = nil -- The x-coordinate of the window's position in the specified display (number)
t.window.y = nil -- The y-coordinate of the window's position in the specified display (number)
t.modules.audio = true -- Enable the audio module (boolean)
t.modules.event = true -- Enable the event module (boolean)
t.modules.graphics = true -- Enable the graphics module (boolean)
t.modules.image = true -- Enable the image module (boolean)
t.modules.joystick = true -- Enable the joystick module (boolean)
t.modules.keyboard = true -- Enable the keyboard module (boolean)
t.modules.math = true -- Enable the math module (boolean)
t.modules.mouse = true -- Enable the mouse module (boolean)
t.modules.physics = true -- Enable the physics module (boolean)
t.modules.sound = true -- Enable the sound module (boolean)
t.modules.system = true -- Enable the system module (boolean)
t.modules.timer = true -- Enable the timer module (boolean), Disabling it will result 0 delta time in love.update
t.modules.touch = true -- Enable the touch module (boolean)
t.modules.video = true -- Enable the video module (boolean)
t.modules.window = true -- Enable the window module (boolean)
t.modules.thread = true -- Enable the thread module (boolean)
end

View File

@ -1,11 +0,0 @@
return {
["basic"] = "Basic Examples",
["menu"] = "Menus Examples",
["gameplay"] = "Gameplay Examples",
["test1"] = "Basic Test 1",
["test2"] = "Basic Test 2",
["testmenu"] = "Basic Test Menu",
["movable"] = "Movable Player",
["options"] = "Options",
["inventory"] = "Inventory",
}

View File

@ -1,11 +0,0 @@
return {
["basic"] = "Exemples basiques",
["menu"] = "Exemples de menus",
["gameplay"] = "Examples de jeux",
["test1"] = "Test basique 1",
["test2"] = "Test basique 2",
["testmenu"] = "Test basique menu",
["movable"] = "Deplacement Joueur",
["options"] = "Paramètres",
["inventory"] = "Inventaire",
}

1
debug.sh Executable file
View File

@ -0,0 +1 @@
love ./examples DEBUGLEVEL=4

View File

@ -0,0 +1,17 @@
## Assets credits
- SFX by [Joth](http://opengameart.org/users/joth)
- Option Music from [OpenSonic](http://opensnc.sourceforge.net/home/index.php) by Di Rodrigues
- Fonts from [SuperPowers](https://opengameart.org/content/superpowers-assets-bitmap-fonts)
### Sprites
- [Monkey Lad in Magical Planet](https://opengameart.org/content/monkey-lad-in-magical-planet) by [surt](https://opengameart.org/users/surt)
- [Tux Bros](https://opengameart.org/content/tux-bros) by [surt](https://opengameart.org/users/surt)
- [16x16 Fantasy Tileset](https://opengameart.org/content/16x16-fantasy-tileset) by [Jerom](https://opengameart.org/users/jerom)
- [Arcade Plateformer Assets](https://opengameart.org/content/arcade-platformer-assets) by [GrafxKid](https://opengameart.org/users/grafxkid)

View File

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

Before

Width:  |  Height:  |  Size: 5.8 KiB

After

Width:  |  Height:  |  Size: 5.8 KiB

View File

Before

Width:  |  Height:  |  Size: 280 B

After

Width:  |  Height:  |  Size: 280 B

View File

Before

Width:  |  Height:  |  Size: 580 B

After

Width:  |  Height:  |  Size: 580 B

View File

Before

Width:  |  Height:  |  Size: 520 B

After

Width:  |  Height:  |  Size: 520 B

View File

@ -43,8 +43,8 @@ return {
pauseAtEnd = false,
},
["punch"] = {
startAt = 10,
endAt = 10,
startAt = 11,
endAt = 11,
loop = 1,
speed = 0,
pauseAtEnd = false,

View File

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

View File

@ -1,13 +0,0 @@
local folder = "examples/basic/test_scene2/"
return {
["images"] = {
{"debris", folder .. "assets/debris.png"}
},
["tilesets"] = {
{"weapon", folder .. "assets/weapon"}
},
["sprites"] = {
{"poof", folder .. "assets/poof"}
}
}

47
examples/conf.lua Normal file
View File

@ -0,0 +1,47 @@
function love.conf(t)
t.identity = "city.kobold.Birb" -- The name of the save directory (string)
t.version = "11.1" -- The LÖVE version this game was made for (string)
t.console = false -- Attach a console (boolean, Windows only)
t.accelerometerjoystick = false -- Enable the accelerometer on iOS and Android by exposing it as a Joystick (boolean)
t.gammacorrect = false -- Enable gamma-correct rendering, when supported by the system (boolean)
t.gameversion = "0.7.0" -- The game version (different than love2D version)
t.window.title = "Birb Examples" -- The window title (string)
t.window.icon = nil -- Filepath to an image to use as the window's icon (string)
t.window.width = 424 -- The window internal width (number)
t.window.height = 240 -- The window internal height (number)
t.window.borderless = false -- Remove all border visuals from the window (boolean)
t.window.resizable = false -- Let the window be user-resizable (boolean)
t.window.minwidth = 1 -- Minimum window width if the window is resizable (number)
t.window.minheight = 1 -- Minimum window height if the window is resizable (number)
t.window.fullscreen = false -- Enable fullscreen (boolean)
t.window.fullscreentype = "exclusive" -- Choose between "desktop" fullscreen or "exclusive" fullscreen mode (string)
t.window.vsync = true -- Enable vertical sync (boolean)
t.window.msaa = 0 -- The number of samples to use with multi-sampled antialiasing (number)
t.window.display = 1 -- Index of the monitor to show the window in (number)
t.window.highdpi = false -- Enable high-dpi mode for the window on a Retina display (boolean)
t.window.x = nil -- The x-coordinate of the window's position in the specified display (number)
t.window.y = nil -- The y-coordinate of the window's position in the specified display (number)
t.window.resolution = 2 -- The default resolution
t.volume = {}
t.volume.music = 100 -- music audio volume
t.volume.sfx = 100 -- sfx audio volume
t.modules.audio = true -- Enable the audio module (boolean)
t.modules.event = true -- Enable the event module (boolean)
t.modules.graphics = true -- Enable the graphics module (boolean)
t.modules.image = true -- Enable the image module (boolean)
t.modules.joystick = true -- Enable the joystick module (boolean)
t.modules.keyboard = true -- Enable the keyboard module (boolean)
t.modules.math = true -- Enable the math module (boolean)
t.modules.mouse = true -- Enable the mouse module (boolean)
t.modules.physics = true -- Enable the physics module (boolean)
t.modules.sound = true -- Enable the sound module (boolean)
t.modules.system = true -- Enable the system module (boolean)
t.modules.timer = true -- Enable the timer module (boolean), Disabling it will result 0 delta time in love.update
t.modules.touch = true -- Enable the touch module (boolean)
t.modules.video = true -- Enable the video module (boolean)
t.modules.window = true -- Enable the window module (boolean)
t.modules.thread = true -- Enable the thread module (boolean)
end

View File

@ -0,0 +1 @@
return {}

View File

@ -0,0 +1,19 @@
return {
["basic"] = "Basic Examples",
["menu"] = "Menus Examples",
["gameplay"] = "Gameplay Examples",
["test1"] = "Basic Test 1",
["test2"] = "Basic Test 2",
["testmenu"] = "Basic Test Menu",
["topdown"] = "Top Down",
["topdown3D"] = "Top Down (3D)",
["topdown (zoom)"] = "Top Down (zoom)",
["topdown3D (zoom)"]= "Top Down (3D, zoom)",
["plateform"] = "Plateformer",
["options"] = "Options",
["inventory"] = "Inventory",
["1player"] = "1 Player",
["2player"] = "2 Players",
["3player"] = "3 Players",
["4player"] = "4 Players",
}

View File

@ -0,0 +1,19 @@
return {
["basic"] = "Exemples basiques",
["menu"] = "Exemples de menus",
["gameplay"] = "Examples de jeux",
["test1"] = "Test basique 1",
["test2"] = "Test basique 2",
["testmenu"] = "Test basique menu",
["topdown"] = "Vue du dessus",
["topdown3D"] = "Vue du dessus (3D)",
["topdown (zoom)"] = "Vue du dessus (zoom)",
["topdown3D (zoom)"]= "Vue du dessus (3D, zoom)",
["plateform"] = "Plateformer",
["options"] = "Paramètres",
["inventory"] = "Inventaire",
["1player"] = "Un joueur",
["2player"] = "Deux joueurs",
["3player"] = "Trois joueurs",
["4player"] = "Quatre joueurs",
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,502 @@
<?xml version="1.0" encoding="UTF-8"?>
<map version="1.2" tiledversion="1.2.4" orientation="orthogonal" renderorder="right-down" width="65" height="65" tilewidth="16" tileheight="16" infinite="0" nextlayerid="9" nextobjectid="85">
<tileset firstgid="1" source="tileset_basic_terrain.tsx"/>
<tileset firstgid="529" source="tileset_mountains.tsx"/>
<tileset firstgid="1145" source="tileset_other.tsx"/>
<layer id="1" name="base" width="65" height="65">
<data encoding="csv">
50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,
50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,
50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,
50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,
50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,
50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,
50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,
50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,
50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,
50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,
50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,
50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,
50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,
50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,
50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,
50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,
50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,
50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,
50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,
50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,
50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,
50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,
50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,
50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,
50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,
50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,
50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,
50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,
50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,
50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,
50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,
50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,
50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,
50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,
50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,
50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,
50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,
50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,
50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,
50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,
50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,
50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,
50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,
50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,
50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,
50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,
50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,
50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,
50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,
50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,
50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,
50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,
50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,
50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,
50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,
50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,
50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,
50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,
50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,
50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,
50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,
50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,
50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,
50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,
50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50
</data>
</layer>
<layer id="2" name="stuff" width="65" height="65">
<data encoding="csv">
59,59,59,59,59,59,59,59,59,10,72,0,0,0,575,576,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,573,574,58,59,59,59,59,59,59,
59,59,59,59,59,59,59,59,59,60,0,0,0,0,597,598,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,595,596,70,12,59,59,59,59,59,
59,59,59,59,59,10,11,11,71,72,0,0,0,0,619,620,622,622,622,622,622,622,622,622,622,622,622,622,622,622,622,622,622,622,622,622,622,622,622,622,622,622,622,622,622,622,622,622,622,622,622,622,622,622,622,622,617,618,0,24,59,59,59,59,59,
59,59,59,59,59,60,0,0,0,0,0,0,0,0,557,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,555,0,24,59,59,59,59,59,
59,10,11,11,71,72,0,0,0,0,0,0,0,0,557,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,555,0,24,59,59,59,59,59,
59,60,0,0,0,0,0,0,0,0,0,0,0,0,557,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,555,0,58,59,59,59,59,59,
71,72,0,0,0,0,0,0,0,0,0,0,0,0,557,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,555,0,70,71,11,11,12,59,
0,575,576,578,578,578,578,578,578,578,578,578,578,578,579,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,555,0,0,0,0,0,58,59,
0,597,598,600,600,600,600,600,600,600,600,600,600,600,601,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,555,0,0,0,0,0,70,71,
0,619,620,622,622,622,622,622,622,622,622,622,622,622,623,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,555,0,0,0,0,0,0,0,
0,619,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,148,149,149,149,149,149,149,149,149,149,149,149,149,149,150,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,555,0,0,0,0,0,0,0,
0,619,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,160,161,161,161,161,161,161,161,161,161,161,161,161,161,162,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,555,0,0,0,0,0,0,0,
0,619,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,160,161,161,161,161,161,161,161,161,161,161,161,161,161,162,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,555,0,0,0,0,0,0,0,
0,619,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,160,161,161,161,161,161,161,161,161,161,161,161,161,161,162,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,555,0,0,0,0,0,0,0,
0,619,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,160,161,161,161,161,161,161,161,161,161,161,161,161,161,162,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,555,0,0,0,0,0,0,0,
0,619,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,160,161,161,161,161,161,161,161,161,161,112,113,173,173,174,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,555,0,0,0,0,0,0,0,
0,619,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,160,161,161,161,161,161,161,161,161,161,124,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,555,0,0,0,0,0,0,0,
0,619,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,160,161,161,161,161,161,161,161,161,161,162,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,555,0,0,0,0,0,0,0,
0,619,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,160,161,161,112,113,173,173,173,173,173,174,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,577,578,578,573,574,0,0,0,
0,619,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,160,161,161,124,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,599,600,600,595,596,0,0,0,
0,619,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,172,173,173,174,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,621,622,622,617,618,0,0,0,
0,619,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,555,0,0,0,
0,619,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,555,0,0,0,
0,619,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,555,0,0,0,
0,619,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,555,0,0,0,
0,619,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,575,576,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,573,574,0,0,0,0,0,0,0,0,0,0,0,0,0,0,555,0,0,0,
0,619,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,597,598,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,595,596,0,0,0,0,0,0,0,0,0,0,0,0,0,0,555,0,0,0,
0,619,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,619,620,622,622,622,622,622,622,622,622,622,622,622,622,622,622,622,622,622,622,617,618,0,0,0,0,0,0,0,0,0,0,0,0,0,0,555,0,0,0,
0,619,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,557,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,555,0,0,0,0,0,0,0,0,0,0,0,0,0,0,555,0,0,0,
0,619,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,557,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,555,0,0,0,0,0,0,0,0,0,0,0,0,0,0,555,0,0,0,
0,619,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,557,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,555,0,0,0,0,0,0,0,0,0,0,0,0,0,0,555,0,0,0,
0,619,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,557,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,555,0,0,0,0,0,0,0,0,0,0,0,0,0,0,555,0,0,0,
0,619,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,557,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,555,0,0,0,0,0,0,0,0,0,0,0,0,0,0,555,0,0,0,
0,619,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,557,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,555,0,0,0,0,0,0,0,0,0,0,0,0,0,0,555,0,0,0,
0,619,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,557,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,555,0,0,0,0,0,0,0,0,0,0,0,0,0,0,555,0,0,0,
0,619,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,557,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,555,0,0,0,0,0,0,0,0,0,0,0,0,0,0,555,0,0,0,
0,619,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,557,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,555,0,0,0,0,0,0,0,0,0,0,0,0,0,0,555,0,0,0,
0,619,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,557,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,555,0,0,0,0,0,0,0,0,0,0,0,0,0,0,555,0,0,0,
0,619,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,557,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,555,0,0,0,0,0,0,0,0,0,0,0,0,0,0,555,0,0,0,
0,619,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,557,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,555,0,0,0,0,0,0,0,0,0,0,0,0,0,0,555,0,0,0,
0,619,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,557,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,555,0,0,0,0,0,0,0,0,0,0,0,0,0,0,555,0,0,0,
0,619,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,531,532,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,529,530,0,0,0,0,0,0,0,0,0,0,0,0,0,0,555,0,0,0,
0,0,534,535,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,553,554,534,534,534,534,534,534,534,534,534,534,534,534,534,534,534,534,534,534,551,552,0,0,0,0,0,0,0,0,0,0,0,0,0,0,555,0,0,0,
0,0,556,557,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,555,0,0,0,
0,0,0,531,532,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,555,0,0,0,
0,0,0,553,554,534,534,534,534,534,534,534,535,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,555,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,557,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,555,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,557,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,555,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,557,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,555,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,557,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,555,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,557,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,555,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,557,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,555,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,557,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,555,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,557,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,555,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,557,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,555,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,557,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,555,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,557,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,555,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,531,532,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,529,530,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,553,554,534,534,534,534,534,534,534,534,534,534,534,534,534,534,534,534,534,534,534,534,534,534,534,534,534,534,534,534,534,534,534,534,534,534,534,534,534,534,534,534,534,534,534,534,534,534,551,552,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
</data>
</layer>
<layer id="3" name="decoration" width="65" height="65">
<data encoding="csv">
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1145,1146,1147,1148,1149,1150,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1168,1169,1170,1171,1172,1173,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1363,0,0,0,0,0,0,1191,1192,1193,1194,1195,1196,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1214,1215,1216,1217,1218,1219,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1237,1238,1239,1240,1241,1242,0,0,0,1145,1146,1147,1148,1149,1150,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1260,1261,1262,1263,1264,1265,0,0,0,1168,1169,1170,1171,1172,1173,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,1145,1146,1147,1148,1149,1150,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1191,1192,1193,1194,1195,1196,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,1168,1169,1170,1171,1172,1173,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1214,1215,1216,1217,1218,1219,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,1191,1192,1193,1194,1195,1196,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1237,1238,1239,1240,1241,1242,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,1214,1215,1216,1217,1218,1219,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1260,1261,1262,1263,1264,1265,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,1237,1238,1239,1240,1241,1242,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,1260,1261,1262,1263,1264,1265,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1363,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1179,1180,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1202,1203,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1283,1284,1285,1286,1287,1288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1306,1307,1308,1309,1310,1311,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1294,0,0,0,0,0,1329,1330,1331,1332,1333,1334,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1352,1353,1354,1355,1356,1357,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1375,1376,1377,1378,1379,1380,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
</data>
</layer>
<objectgroup id="8" name="box">
<object id="80" x="64" y="160" width="16" height="16">
<properties>
<property name="adaptPosition" type="bool" value="true"/>
<property name="z" type="int" value="32"/>
</properties>
</object>
<object id="81" x="96" y="160" width="16" height="16">
<properties>
<property name="adaptPosition" type="bool" value="true"/>
<property name="z" type="int" value="32"/>
</properties>
</object>
<object id="82" x="128" y="160" width="16" height="16">
<properties>
<property name="adaptPosition" type="bool" value="true"/>
<property name="z" type="int" value="32"/>
</properties>
</object>
<object id="83" x="112" y="176" width="16" height="16">
<properties>
<property name="adaptPosition" type="bool" value="true"/>
<property name="z" type="int" value="32"/>
</properties>
</object>
<object id="84" x="80" y="176" width="16" height="16">
<properties>
<property name="adaptPosition" type="bool" value="true"/>
<property name="z" type="int" value="32"/>
</properties>
</object>
</objectgroup>
<objectgroup id="4" name="wall">
<object id="1" x="544" y="144" width="96" height="64">
<properties>
<property name="d" type="int" value="16"/>
<property name="fromTop" type="bool" value="true"/>
<property name="z" type="int" value="48"/>
</properties>
</object>
<object id="2" x="400" y="80" width="96" height="64">
<properties>
<property name="d" type="int" value="16"/>
<property name="fromTop" type="bool" value="true"/>
<property name="z" type="int" value="48"/>
</properties>
</object>
<object id="3" x="176" y="176" width="96" height="64">
<properties>
<property name="d" type="int" value="16"/>
<property name="fromTop" type="bool" value="true"/>
<property name="z" type="int" value="48"/>
</properties>
</object>
<object id="4" x="0" y="0" width="240" height="128">
<properties>
<property name="d" type="int" value="32"/>
<property name="fromTop" type="bool" value="true"/>
<property name="z" type="int" value="64"/>
</properties>
</object>
<object id="5" x="0" y="128" width="32" height="544">
<properties>
<property name="d" type="int" value="32"/>
<property name="fromTop" type="bool" value="true"/>
<property name="z" type="int" value="64"/>
</properties>
</object>
<object id="6" x="0" y="928" width="1040" height="112">
<properties>
<property name="d" type="int" value="32"/>
<property name="fromTop" type="bool" value="true"/>
<property name="z" type="int" value="64"/>
</properties>
</object>
<object id="7" x="0" y="720" width="208" height="208">
<properties>
<property name="d" type="int" value="32"/>
<property name="fromTop" type="bool" value="true"/>
<property name="z" type="int" value="64"/>
</properties>
</object>
<object id="8" x="0" y="672" width="64" height="48">
<properties>
<property name="d" type="int" value="32"/>
<property name="fromTop" type="bool" value="true"/>
<property name="z" type="int" value="64"/>
</properties>
</object>
<object id="9" x="976" y="304" width="64" height="624">
<properties>
<property name="d" type="int" value="32"/>
<property name="fromTop" type="bool" value="true"/>
<property name="z" type="int" value="64"/>
</properties>
</object>
<object id="10" x="912" y="0" width="128" height="304">
<properties>
<property name="d" type="int" value="32"/>
<property name="fromTop" type="bool" value="true"/>
<property name="z" type="int" value="64"/>
</properties>
</object>
<object id="11" x="240" y="0" width="672" height="16">
<properties>
<property name="d" type="int" value="32"/>
<property name="fromTop" type="bool" value="true"/>
<property name="z" type="int" value="64"/>
</properties>
</object>
<object id="16" x="0" y="0" width="416" height="1040">
<properties>
<property name="d" type="int" value="32"/>
<property name="fromTop" type="bool" value="true"/>
<property name="z" type="int" value="32"/>
</properties>
</object>
<object id="17" x="416" y="0" width="624" height="416">
<properties>
<property name="d" type="int" value="32"/>
<property name="fromTop" type="bool" value="true"/>
<property name="z" type="int" value="32"/>
</properties>
</object>
<object id="18" x="736" y="416" width="304" height="624">
<properties>
<property name="d" type="int" value="32"/>
<property name="fromTop" type="bool" value="true"/>
<property name="z" type="int" value="32"/>
</properties>
</object>
<object id="19" x="416" y="672" width="320" height="368">
<properties>
<property name="d" type="int" value="32"/>
<property name="fromTop" type="bool" value="true"/>
<property name="z" type="int" value="32"/>
</properties>
</object>
<object id="20" x="400" y="400" width="352" height="320">
<properties>
<property name="d" type="int" value="16"/>
<property name="fromTop" type="bool" value="true"/>
<property name="z" type="int" value="0"/>
</properties>
</object>
<object id="27" x="576" y="496" width="96" height="48">
<properties>
<property name="d" type="int" value="16"/>
<property name="fromTop" type="bool" value="true"/>
<property name="z" type="int" value="16"/>
</properties>
</object>
</objectgroup>
<objectgroup id="5" name="tree">
<object id="21" x="656" y="96" width="32" height="32">
<properties>
<property name="z" type="int" value="32"/>
</properties>
</object>
<object id="22" x="688" y="288" width="32" height="32">
<properties>
<property name="z" type="int" value="32"/>
</properties>
</object>
<object id="23" x="480" y="352" width="32" height="32">
<properties>
<property name="z" type="int" value="32"/>
</properties>
</object>
<object id="24" x="496" y="560" width="32" height="32">
<properties>
<property name="z" type="int" value="0"/>
</properties>
</object>
<object id="25" x="192" y="320" width="32" height="32">
<properties>
<property name="z" type="int" value="32"/>
</properties>
</object>
<object id="26" x="304" y="96" width="32" height="32">
<properties>
<property name="z" type="int" value="32"/>
</properties>
</object>
</objectgroup>
<objectgroup id="6" name="player">
<object id="29" x="592" y="592" width="16" height="16">
<properties>
<property name="z" type="int" value="0"/>
</properties>
</object>
<object id="77" x="624" y="592" width="16" height="16">
<properties>
<property name="z" type="int" value="0"/>
</properties>
</object>
<object id="78" x="624" y="624" width="16" height="16">
<properties>
<property name="z" type="int" value="0"/>
</properties>
</object>
<object id="79" x="592" y="624" width="16" height="16">
<properties>
<property name="z" type="int" value="0"/>
</properties>
</object>
</objectgroup>
<objectgroup id="7" name="coin">
<object id="33" x="464" y="480" width="16" height="16">
<properties>
<property name="z" type="int" value="0"/>
</properties>
</object>
<object id="52" x="464" y="512" width="16" height="16">
<properties>
<property name="z" type="int" value="0"/>
</properties>
</object>
<object id="53" x="464" y="544" width="16" height="16">
<properties>
<property name="z" type="int" value="0"/>
</properties>
</object>
<object id="54" x="464" y="576" width="16" height="16">
<properties>
<property name="z" type="int" value="0"/>
</properties>
</object>
<object id="55" x="112" y="384" width="16" height="16">
<properties>
<property name="adaptPosition" type="bool" value="true"/>
<property name="z" type="int" value="32"/>
</properties>
</object>
<object id="68" x="144" y="384" width="16" height="16">
<properties>
<property name="adaptPosition" type="bool" value="true"/>
<property name="z" type="int" value="32"/>
</properties>
</object>
<object id="69" x="128" y="416" width="16" height="16">
<properties>
<property name="adaptPosition" type="bool" value="true"/>
<property name="z" type="int" value="32"/>
</properties>
</object>
<object id="70" x="176" y="384" width="16" height="16">
<properties>
<property name="adaptPosition" type="bool" value="true"/>
<property name="z" type="int" value="32"/>
</properties>
</object>
<object id="71" x="160" y="416" width="16" height="16">
<properties>
<property name="adaptPosition" type="bool" value="true"/>
<property name="z" type="int" value="32"/>
</properties>
</object>
<object id="72" x="768" y="176" width="16" height="16">
<properties>
<property name="adaptPosition" type="bool" value="true"/>
<property name="z" type="int" value="32"/>
</properties>
</object>
<object id="73" x="768" y="208" width="16" height="16">
<properties>
<property name="adaptPosition" type="bool" value="true"/>
<property name="z" type="int" value="32"/>
</properties>
</object>
<object id="74" x="736" y="208" width="16" height="16">
<properties>
<property name="adaptPosition" type="bool" value="true"/>
<property name="z" type="int" value="32"/>
</properties>
</object>
<object id="75" x="768" y="240" width="16" height="16">
<properties>
<property name="adaptPosition" type="bool" value="true"/>
<property name="z" type="int" value="32"/>
</properties>
</object>
<object id="76" x="800" y="208" width="16" height="16">
<properties>
<property name="adaptPosition" type="bool" value="true"/>
<property name="z" type="int" value="32"/>
</properties>
</object>
</objectgroup>
</map>

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<tileset version="1.2" tiledversion="1.2.4" name="tileset_basic_terrain" tilewidth="16" tileheight="16" tilecount="528" columns="12">
<image source="tileset_basic_terrain.png" width="192" height="704"/>
</tileset>

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<tileset version="1.2" tiledversion="1.2.4" name="tileset_mountains" tilewidth="16" tileheight="16" tilecount="616" columns="22">
<image source="tileset_mountains.png" width="352" height="448"/>
</tileset>

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<tileset version="1.2" tiledversion="1.2.4" name="tileset_other" tilewidth="16" tileheight="16" tilecount="736" columns="23">
<image source="tileset_other.png" width="368" height="512"/>
</tileset>

Binary file not shown.

After

Width:  |  Height:  |  Size: 114 KiB

View File

Before

Width:  |  Height:  |  Size: 103 KiB

After

Width:  |  Height:  |  Size: 103 KiB

View File

@ -1,7 +1,7 @@
return {
version = "1.2",
luaversion = "5.1",
tiledversion = "1.2.2",
tiledversion = "1.2.4",
orientation = "orthogonal",
renderorder = "right-down",
width = 150,
@ -9,7 +9,7 @@ return {
tilewidth = 16,
tileheight = 16,
nextlayerid = 6,
nextobjectid = 24,
nextobjectid = 25,
backgroundcolor = { 0, 170, 255 },
properties = {},
tilesets = {
@ -271,83 +271,20 @@ return {
draworder = "topdown",
properties = {},
objects = {
{
id = 9,
name = "",
type = "",
shape = "rectangle",
x = 512,
y = 2160,
width = 16,
height = 16,
rotation = 0,
visible = true,
properties = {}
},
{
id = 11,
name = "",
type = "",
shape = "rectangle",
x = 480,
x = 464,
y = 2160,
width = 16,
width = 128,
height = 16,
rotation = 0,
visible = true,
properties = {}
},
{
id = 12,
name = "",
type = "",
shape = "rectangle",
x = 544,
y = 2160,
width = 16,
height = 16,
rotation = 0,
visible = true,
properties = {}
},
{
id = 13,
name = "",
type = "",
shape = "rectangle",
x = 576,
y = 2160,
width = 16,
height = 16,
rotation = 0,
visible = true,
properties = {}
},
{
id = 14,
name = "",
type = "",
shape = "rectangle",
x = 368,
y = 2208,
width = 16,
height = 16,
rotation = 0,
visible = true,
properties = {}
},
{
id = 15,
name = "",
type = "",
shape = "rectangle",
x = 400,
y = 2208,
width = 16,
height = 16,
rotation = 0,
visible = true,
properties = {}
properties = {
["batchActor"] = true
}
},
{
id = 16,
@ -356,76 +293,15 @@ return {
shape = "rectangle",
x = 336,
y = 2208,
width = 16,
width = 80,
height = 16,
rotation = 0,
visible = true,
properties = {}
},
{
id = 17,
name = "",
type = "",
shape = "rectangle",
x = 112,
y = 2224,
width = 16,
height = 16,
rotation = 0,
visible = true,
properties = {}
},
{
id = 18,
name = "",
type = "",
shape = "rectangle",
x = 144,
y = 2224,
width = 16,
height = 16,
rotation = 0,
visible = true,
properties = {}
},
{
id = 19,
name = "",
type = "",
shape = "rectangle",
x = 176,
y = 2224,
width = 16,
height = 16,
rotation = 0,
visible = true,
properties = {}
},
{
id = 20,
name = "",
type = "",
shape = "rectangle",
x = 256,
y = 2272,
width = 16,
height = 16,
rotation = 0,
visible = true,
properties = {}
},
{
id = 21,
name = "",
type = "",
shape = "rectangle",
x = 256,
y = 2240,
width = 16,
height = 16,
rotation = 0,
visible = true,
properties = {}
properties = {
["batchActor"] = true,
["gheight"] = 32,
["gwidth"] = 32
}
},
{
id = 22,
@ -435,10 +311,31 @@ return {
x = 256,
y = 2208,
width = 16,
height = 80,
rotation = 0,
visible = true,
properties = {
["batchActor"] = true,
["gheight"] = 32,
["gwidth"] = 32
}
},
{
id = 24,
name = "",
type = "",
shape = "rectangle",
x = 112,
y = 2224,
width = 80,
height = 16,
rotation = 0,
visible = true,
properties = {}
properties = {
["batchActor"] = true,
["gheight"] = 32,
["gwidth"] = 32
}
}
}
},

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<map version="1.2" tiledversion="1.2.2" orientation="orthogonal" renderorder="right-down" width="150" height="150" tilewidth="16" tileheight="16" infinite="0" backgroundcolor="#00aaff" nextlayerid="6" nextobjectid="24">
<map version="1.2" tiledversion="1.2.4" orientation="orthogonal" renderorder="right-down" width="150" height="150" tilewidth="16" tileheight="16" infinite="0" backgroundcolor="#00aaff" nextlayerid="6" nextobjectid="25">
<tileset firstgid="1" source="monkeylad_further.tsx"/>
<layer id="1" name="Calque de Tile 1" width="150" height="150">
<data encoding="csv">
@ -161,19 +161,32 @@
<object id="8" x="464" y="2192" width="128" height="16"/>
</objectgroup>
<objectgroup id="4" name="coin">
<object id="9" x="512" y="2160" width="16" height="16"/>
<object id="11" x="480" y="2160" width="16" height="16"/>
<object id="12" x="544" y="2160" width="16" height="16"/>
<object id="13" x="576" y="2160" width="16" height="16"/>
<object id="14" x="368" y="2208" width="16" height="16"/>
<object id="15" x="400" y="2208" width="16" height="16"/>
<object id="16" x="336" y="2208" width="16" height="16"/>
<object id="17" x="112" y="2224" width="16" height="16"/>
<object id="18" x="144" y="2224" width="16" height="16"/>
<object id="19" x="176" y="2224" width="16" height="16"/>
<object id="20" x="256" y="2272" width="16" height="16"/>
<object id="21" x="256" y="2240" width="16" height="16"/>
<object id="22" x="256" y="2208" width="16" height="16"/>
<object id="11" x="464" y="2160" width="128" height="16">
<properties>
<property name="batchActor" type="bool" value="true"/>
</properties>
</object>
<object id="16" x="336" y="2208" width="80" height="16">
<properties>
<property name="batchActor" type="bool" value="true"/>
<property name="gheight" type="int" value="32"/>
<property name="gwidth" type="int" value="32"/>
</properties>
</object>
<object id="22" x="256" y="2208" width="16" height="80">
<properties>
<property name="batchActor" type="bool" value="true"/>
<property name="gheight" type="int" value="32"/>
<property name="gwidth" type="int" value="32"/>
</properties>
</object>
<object id="24" x="112" y="2224" width="80" height="16">
<properties>
<property name="batchActor" type="bool" value="true"/>
<property name="gheight" type="int" value="32"/>
<property name="gwidth" type="int" value="32"/>
</properties>
</object>
</objectgroup>
<objectgroup id="5" name="player">
<object id="23" x="80" y="2272" width="16" height="32"/>

View File

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

1
examples/framework Symbolic link
View File

@ -0,0 +1 @@
../framework/

9
examples/game/init.lua Normal file
View File

@ -0,0 +1,9 @@
local GameSystem = require "framework.gamesystem"
local Game = GameSystem:extend()
function Game:new()
Game.super.new(self)
self.currentSlot = 1
end
return Game

View File

@ -1,61 +0,0 @@
local Base = require "gamecore.modules.world.actors.actor2D"
local Player = Base:extend()
function Player:new(world, x, y, id)
Player.super.new(self, world, "player", x, y, 16, 24, true)
self:setSprite("player", 8, 12)
self:cloneSprite()
self:setYGravity(480)
end
function Player:update(dt)
self.xfrc = 480*3
if self.keys["up"].isPressed and (self.onGround) then
self.ysp = -280
end
if self.keys["down"].isDown then
--self.ysp = 120
end
if self.keys["left"].isDown then
self.xsp = -120
end
if self.keys["right"].isDown then
self.xsp = 120
end
self:setDirection(self.xsp)
Player.super.update(self, dt)
self:setAnimation()
end
function Player:setAnimation()
self:setCustomSpeed(math.abs(self.xsp) / 12)
if (self.onGround) then
if math.abs(self.xsp) > 0 then
self:changeAnimation("walk", false)
else
self:changeAnimation("idle", true)
end
else
self:changeAnimation("jump", true)
end
end
function Player:setDirection(direction)
direction = direction or 0
if direction ~= 0 then
direction = utils.math.sign(direction)
self:setSpriteScallingX(direction)
end
end
function Player:collisionResponse(collision)
if collision.other.type == "coin" then
collision.other:takeCoin(self)
end
end
return Player

View File

@ -1,5 +0,0 @@
## PLATFORM EXEMPLE ASSET CREDITS
### Sprites
- [Monkey Lad in Magical Planet](https://opengameart.org/content/monkey-lad-in-magical-planet) by [surt](https://opengameart.org/users/surt)

View File

@ -1,7 +0,0 @@
return {
["sprites"] = {
{"player", "examples/gameplay/plateform/assets/monkey_lad"},
{"coin", "examples/gameplay/plateform/assets/coin5"},
{"sparkle", "examples/gameplay/plateform/assets/sparkle"}
}
}

View File

@ -1,10 +0,0 @@
return {
MainMenu = require "examples.mainmenu",
Test = require "examples.basic.test_scene",
Test2 = require "examples.basic.test_scene2",
TestMenu = require "examples.basic.test_menus",
Inventory = require "examples.menus.inventory",
Options = require "examples.menus.options",
MovePlayer = require "examples.gameplay.moveplayer",
Plateformer = require "examples.gameplay.plateform"
}

View File

@ -21,11 +21,12 @@
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
]]
Core = require "gamecore"
examples = require "examples"
require "framework"
function love.load()
core = Core()
scenes = require "scenes"
examples.MainMenu()
function love.load(args)
print(utils.table.toString(args))
framework.start("game", args)
scenes.MainMenu()
end

View File

@ -1,3 +0,0 @@
## Assets credits
- SFX by [Joth](http://opengameart.org/users/joth)

View File

@ -1,10 +0,0 @@
return {
["imagefonts"] = {
{"medium", "examples/mainmenu/assets/medium"}
},
["sfx"] = {
{"navigate", "examples/mainmenu/assets/menu_move.mp3"},
{"confirm", "examples/mainmenu/assets/menu_confirm.mp3"},
{"cancel", "examples/mainmenu/assets/menu_error.mp3"},
}
}

View File

@ -1,5 +0,0 @@
return {
filename = "medium.png",
glyphs = "!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|} ",
extraspacing = 1,
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

View File

@ -1,139 +0,0 @@
-- scenes/mainmenu :: the main menu of the different gamecore examples
--[[
Copyright © 2019 Kazhnuz
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
]]
local Scene = require "gamecore.modules.scenes"
local MainMenu = Scene:extend()
local ListBox = require "gamecore.modules.menusystem.listbox"
local Widget = require "gamecore.modules.menusystem.widgets"
local SubMenuWidget = Widget.Text:extend()
local SceneWidget = Widget.Text:extend()
local ExitWidget = Widget.Text:extend()
function MainMenu:new()
MainMenu.super.new(self)
self.assets:batchImport("examples.mainmenu.assets")
self:addMenu("main", true)
self:addSubMenu("basic", "basic")
self:addScene("basic", examples.Test, "test1")
self:addScene("basic", examples.Test2, "test2")
self:addScene("basic", examples.TestMenu, "testmenu")
self:addSubMenu("menus", "menu")
self:addScene("menus", examples.Inventory, "inventory")
self:addScene("menus", examples.Options, "options")
self:addSubMenu("gameplay", "gameplay")
self:addScene("gameplay", examples.MovePlayer, "movable")
self:addScene("gameplay", examples.Plateformer, "plateform")
self.menusystem:setSoundFromSceneAssets("navigate")
ExitWidget(self, "main")
self.menusystem:switchMenu("main")
end
-- MENU FUNCTION
-- Functions that serve the handling of menus
function MainMenu:addMenu(name, nobackbutton)
local screenHeight, screenWidth = core.screen:getDimensions()
local w, h = 424/2, 240 - 48
local x, y = w / 2, 24
ListBox(self.menusystem, name, x, y, w, h, 8)
end
function MainMenu:addSubMenu(name, fullname)
self:addMenu(name)
SubMenuWidget(self, "main", name, fullname)
SubMenuWidget(self, name, "main", "back", 1)
end
function MainMenu:addScene(submenu, scene, fullname)
SceneWidget(self, submenu, scene, fullname)
end
function MainMenu:draw()
love.graphics.setColor(.3, .1, .4, 1)
love.graphics.rectangle("fill", 0, 0, 424, 240)
end
-- WIDGETS
-- Widgets used by menus
-- Submenu widget :: go to a submenu
function SubMenuWidget:new(scene, menu, newmenu, fullname, order)
self.scene = scene
local widgetmenu = self.scene.menusystem.menus[menu]
local font = self.scene.assets.fonts["medium"]
self.newmenu = newmenu
local label = ""
if fullname == "back" then
label = core.lang:translate("commons", fullname)
self.sfx = "cancel"
else
label = core.lang:translate("mainmenu", fullname)
self.sfx = "confirm"
end
SubMenuWidget.super.new(self, widgetmenu, font, label)
self.order = order or 0
end
function SubMenuWidget:action()
self.scene.assets:playSFX(self.sfx)
self.scene.menusystem:switchMenu(self.newmenu)
end
-- Scene widget :: switch scene
function SceneWidget:new(scene, menu, newscene, fullname)
self.scene = scene
local widgetmenu = self.scene.menusystem.menus[menu]
local font = self.scene.assets.fonts["medium"]
self.newscene = newscene
local label = core.lang:translate("mainmenu", fullname)
SceneWidget.super.new(self, widgetmenu, font, label)
end
function SceneWidget:action()
core.scenemanager:storeCurrentScene("mainmenu")
self.newscene()
end
-- Exit Widget : exit the examples
function ExitWidget:new(scene, menu)
self.scene = scene
local widgetmenu = self.scene.menusystem.menus[menu]
local font = self.scene.assets.fonts["medium"]
local label = core.lang:translate("commons", "exit")
SceneWidget.super.new(self, widgetmenu, font, label)
end
function ExitWidget:action()
love.event.quit()
end
return MainMenu

View File

@ -1,5 +0,0 @@
return {
filename = "medium.png",
glyphs = "!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|} ",
extraspacing = 1,
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

View File

@ -21,55 +21,55 @@
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
]]
local Scene = require "gamecore.modules.scenes"
local Scene = require "framework.scenes"
local TestScene = Scene:extend()
local MenuType = require "gamecore.modules.menusystem.listbox"
local MenuType2 = require "gamecore.modules.menusystem.flowbox"
local MenuType3 = require "gamecore.modules.menusystem.grid"
local Widget = require "gamecore.modules.menusystem.widgets"
local MenuType = require "framework.scenes.gui.menus.listbox"
local MenuType2 = require "framework.scenes.gui.menus.flowbox"
local MenuType3 = require "framework.scenes.gui.menus.grid"
local Widget = require "framework.scenes.gui.menus.widgets"
local MenuWidget = Widget.Text:extend()
function TestScene:new()
TestScene.super.new(self)
self.assets:addImageFont("medium", "examples/basic/test_menus/assets/medium")
self.assets:addImageFont("medium", "assets/fonts/medium")
MenuType(self.menusystem, "testMenu1", 32, 32, 100, 24*8, 4)
MenuWidget(self, "testMenu1", "text_menu1")
Widget.Base(self.menusystem.menus["testMenu1"])
Widget.Base(self.menusystem.menus["testMenu1"])
Widget.Base(self.menusystem.menus["testMenu1"])
Widget.Base(self.menusystem.menus["testMenu1"])
Widget.Base(self.menusystem.menus["testMenu1"])
Widget.Base("testMenu1")
Widget.Base("testMenu1")
Widget.Base("testMenu1")
Widget.Base("testMenu1")
Widget.Base("testMenu1")
MenuType2(self.menusystem, "testMenu2", 164, 32, 24*8, 24*2, 8, 2)
Widget.Base(self.menusystem.menus["testMenu2"])
Widget.Base(self.menusystem.menus["testMenu2"])
Widget.Base(self.menusystem.menus["testMenu2"])
Widget.Base(self.menusystem.menus["testMenu2"])
Widget.Base(self.menusystem.menus["testMenu2"])
Widget.Base(self.menusystem.menus["testMenu2"])
Widget.Base(self.menusystem.menus["testMenu2"])
Widget.Base(self.menusystem.menus["testMenu2"])
Widget.Base(self.menusystem.menus["testMenu2"])
Widget.Base(self.menusystem.menus["testMenu2"])
Widget.Base(self.menusystem.menus["testMenu2"])
Widget.Base(self.menusystem.menus["testMenu2"])
Widget.Base(self.menusystem.menus["testMenu2"])
Widget.Base(self.menusystem.menus["testMenu2"])
Widget.Base(self.menusystem.menus["testMenu2"])
Widget.Base(self.menusystem.menus["testMenu2"])
Widget.Base(self.menusystem.menus["testMenu2"])
Widget.Base(self.menusystem.menus["testMenu2"])
Widget.Base(self.menusystem.menus["testMenu2"])
Widget.Base(self.menusystem.menus["testMenu2"])
Widget.Base("testMenu2")
Widget.Base("testMenu2")
Widget.Base("testMenu2")
Widget.Base("testMenu2")
Widget.Base("testMenu2")
Widget.Base("testMenu2")
Widget.Base("testMenu2")
Widget.Base("testMenu2")
Widget.Base("testMenu2")
Widget.Base("testMenu2")
Widget.Base("testMenu2")
Widget.Base("testMenu2")
Widget.Base("testMenu2")
Widget.Base("testMenu2")
Widget.Base("testMenu2")
Widget.Base("testMenu2")
Widget.Base("testMenu2")
Widget.Base("testMenu2")
Widget.Base("testMenu2")
Widget.Base("testMenu2")
MenuType3(self.menusystem, "testMenu3", 164, 32 + 72, 24*8, 24*5, 8, 5)
Widget.Base(self.menusystem.menus["testMenu3"])
Widget.Base(self.menusystem.menus["testMenu3"])
Widget.Base(self.menusystem.menus["testMenu3"])
Widget.Base(self.menusystem.menus["testMenu3"])
Widget.Base("testMenu3")
Widget.Base("testMenu3")
Widget.Base("testMenu3")
Widget.Base("testMenu3")
self.menusystem.menus["testMenu3"]:addSlot(1, 0, 0, 4, 3)
self.menusystem.menus["testMenu3"]:addSlot(2, 0, 3, 5, 2)
self.menusystem.menus["testMenu3"]:addSlot(3, 5, 0, 3, 1)
@ -120,7 +120,7 @@ end
function TestScene:addTextWidget(menu, number)
for i=1, number do
Widget.Text(self.menusystem.menus[menu], self.assets.fonts["medium"], "lorem ipsum " .. i)
Widget.Text(menu, "medium", "lorem ipsum " .. i)
end
end
@ -131,10 +131,8 @@ end
function MenuWidget:new(scene, menu, newmenu)
self.scene = scene
local widgetmenu = self.scene.menusystem.menus[menu]
local font = self.scene.assets.fonts["medium"]
self.newmenu = newmenu
MenuWidget.super.new(self, widgetmenu, font, newmenu)
MenuWidget.super.new(self, menu, "menu", newmenu)
end
function MenuWidget:action()

View File

@ -21,7 +21,7 @@
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
]]
local Scene = require "gamecore.modules.scenes"
local Scene = require "framework.scenes"
local TestScene = Scene:extend()
function TestScene:new()
@ -37,9 +37,9 @@ end
function TestScene:mousepressed(x, y)
if (x > 424/2) then
core.scenemanager:storeCurrentScene("pausedScene")
examples.Test2()
scenes.Test2()
else
examples.TestMenu()
scenes.TestMenu()
end
end

View File

@ -1,4 +1,4 @@
local Parent = require "examples.basic.test_scene2.actors.parent"
local Parent = require "scenes.basic.test_scene2.actors.parent"
local Explosion = Parent:extend()
function Explosion:new(world, x, y)

View File

@ -1,4 +1,4 @@
local Base = require "gamecore.modules.world.actors.actor2D"
local Base = require "framework.scenes.world.actors.actor2D"
local Parent = Base:extend()
function Parent:new(world, type, x, y, w, h)

View File

@ -0,0 +1,13 @@
local folder = "scenes/basic/test_scene2/"
return {
["images"] = {
{"debris", "assets/sprites/debris.png"}
},
["tilesets"] = {
{"weapon", "assets/sprites/weapon"}
},
["sprites"] = {
{"poof", "assets/sprites/gfx/poof"}
}
}

View File

@ -21,22 +21,23 @@
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
]]
local Scene = require "gamecore.modules.scenes"
local Scene = require "framework.scenes"
local TestScene = Scene:extend()
local folder = "examples/basic/test_scene2/"
local folder = "scenes/basic/test_scene2/"
local World = require "gamecore.modules.world.baseworld"
local World = require "framework.scenes.world.baseworld"
function TestScene:new()
TestScene.super.new(self)
self.assets:batchImport("examples.basic.test_scene2.assets")
self.assets:batchImport("scenes.basic.test_scene2.assets")
self.i = 0
self.estImpair = false
self.world = World(self, "examples.basic.test_scene2.actors")
World(self, "scenes.basic.test_scene2.actors")
self.world:newActor("explosion", 12, 12)
self.world:newActor("explosion", 1, 78)
self.world:newActor("explosion", 40, 200)
@ -50,8 +51,6 @@ function TestScene:update(dt)
local i = math.floor(self.i)
self.estImpair = (math.floor(i / 2) ~= (i / 2))
self.world:update(dt)
end
function TestScene:mousepressed(x, y)
@ -59,10 +58,13 @@ function TestScene:mousepressed(x, y)
end
function TestScene:draw()
function TestScene:drawStart()
love.graphics.setColor(.4, 0, 0, 1)
love.graphics.rectangle("fill", 0, 0, 424, 240)
utils.graphics.resetColor()
end
function TestScene:drawEnd()
love.graphics.setColor(1, 1, 1, 1)
love.graphics.print(math.floor(self.i) .. " ; " .. self.mouse.x .. ":" .. self.mouse.y .. ":" .. self.world:countActors(), 16, 16)
@ -78,8 +80,6 @@ function TestScene:draw()
utils.graphics.resetColor()
end
self.world:draw()
end
return TestScene

View File

@ -0,0 +1,10 @@
local Base = require "framework.scenes.world.actors.actor3D"
local Box = Base:extend()
function Box:new(world, x, y, z)
Box.super.new(self, world, "box", x, y, z, 16, 16, 16, true)
self:setDebugColor(0,0,0)
self.boxes.Textured(self, 16, 16, 16, "boxtop", "box")
end
return Box

View File

@ -0,0 +1,14 @@
local Base = require "framework.scenes.world.actors.actor3D"
local Coin = Base:extend()
function Coin:new(world, x, y, z)
Coin.super.new(self, world, "coin", x, y, z + 16, 16, 16, 16, false)
self:setSprite("coin")
end
function Coin:takeCoin(other)
self.obj.GFX(self.world, self.x + 8, self.y + 8, self.z + 8, "sparkle")
self:destroy( )
end
return Coin

View File

@ -0,0 +1,13 @@
return {
["idle"] = {
{
{"main", {0, 0, 0, 16, 16, 24}, true}
}
},
["punch"] = {
{
{"main", {0, 0, 0, 16, 16, 24}, true},
{"punch", {16, 2, 6, 12, 12, 12}, false}
}
}
}

View File

@ -0,0 +1,18 @@
local Obj = {}
-- On charge toutes les différentes types d'acteurs
local cwd = (...):gsub('%.init$', '') .. "."
Obj.Player = require(cwd .. "player")
Obj.Box = require(cwd .. "box")
Obj.Coin = require(cwd .. "coin")
Obj.GFX = require("framework.scenes.world.actors.gfx3D")
Obj.index = {}
Obj.index["player"] = Obj.Player
Obj.index["box"] = Obj.Box
Obj.index["coin"] = Obj.Coin
Obj.collisions = {}
Obj.collisions["wall"] = require(cwd .. "wall")
return Obj

View File

@ -0,0 +1,13 @@
local Base = require "framework.scenes.world.actors.actor3D"
local Parent = Base:extend()
function Parent:new(world, type, x, y, z, w, h, d, isSolid)
self.scene = world.scene
Parent.super.new(self, world, type, x, y, z, w, h, d, isSolid)
end
function Parent:draw()
Parent.super.draw(self)
end
return Parent

View File

@ -0,0 +1,97 @@
local cwd = (...):gsub('%.player$', '') .. "."
local Parent = require(cwd .. "parent")
local Player = Parent:extend()
function Player:new(world, x, y, z, id)
Player.super.new(self, world, "player", x, y, 0, 16, 16, 24, true)
self:setGravity(480)
self:setSprite("player", true, 8, 12)
self:setHitboxFile("scenes.gameplay.action3D.actors.hitboxes.player")
end
function Player:updateStart(dt)
self.xfrc, self.yfrc = 480*3, 480*3
if self.keys["up"].isDown then
self.ysp = -120
end
if self.keys["down"].isDown then
self.ysp = 120
end
if self.keys["left"].isDown then
self.xsp = -120
end
if self.keys["right"].isDown then
self.xsp = 120
end
if self.keys["A"].isDown and (self.onGround) then
self.zsp = 280
end
if self.keys["B"].isDown then
self.isPunching = true
else
self.isPunching = false
end
if (self.isPunching) then
self:checkHitboxesCollisions()
end
end
function Player:updateEnd(dt)
self:setAnimation()
end
function Player:setAnimation()
local gsp = utils.math.pointDistance(0, 0, self.xsp, self.ysp)
self.sprite:setCustomSpeed(math.abs(gsp) / 12)
self:setDirection(self.xsp)
if (self.isPunching) then
self.sprite:changeAnimation("punch", false)
else
if (self.onGround) then
if (math.abs(self.xsp) > 0) or (math.abs(self.ysp) > 0) then
self.sprite:changeAnimation("walk", false)
else
self.sprite:changeAnimation("idle", true)
end
else
self.sprite:changeAnimation("jump", true)
end
end
end
function Player:setDirection(direction)
direction = direction or 0
if direction ~= 0 then
direction = utils.math.sign(direction)
self.direction = direction
self.sprite:setScalling(direction, nil)
end
end
function Player:collisionResponse(collision)
if collision.other.type == "coin" then
collision.other.owner:takeCoin(self)
end
end
function Player:hitboxResponse(name, type, collision)
if (collision.other.type == "coin") and (type == "punch") then
collision.other.owner:takeCoin(self)
end
end
function Player:draw()
Player.super.draw(self)
end
function Player:drawHUD(id)
love.graphics.print(id .. " test", 4, 4)
end
return Player

View File

@ -0,0 +1,10 @@
local Base = require "framework.scenes.world.actors.actor3D"
local Wall = Base:extend()
function Wall:new(world, x, y, z, w, h, d)
Wall.super.new(self, world, "wall", x, y, z, w, h, d, true)
self:setDebugColor(0,0,0)
self.boxes.Mapped(self, x, y, z, w, h, d)
end
return Wall

View File

@ -0,0 +1,45 @@
-- scenes/moveplayer3D :: a basic player movement example in fake3D
--[[
Copyright © 2019 Kazhnuz
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
]]
local Scene = require "framework.scenes"
local MovePlayer = Scene:extend()
local World = require "framework.scenes.world.world3D"
function MovePlayer:new(playerNumber, cameraMode)
local playerNumber = playerNumber or 1
local cameraMode = cameraMode or "split"
MovePlayer.super.new(self)
self.assets:batchImport("scenes.gameplay.plateform.assets")
World(self, "scenes.gameplay.action3D.actors", "datas/maps/action3D/map.lua")
self.world:setPlayerNumber(playerNumber)
self.world.cameras:setMode(cameraMode)
self.world:loadMap()
--self.world.obj.collisions["wall"](self.world, 0,0,-16,1000, 1000, 16)
end
return MovePlayer

View File

@ -1,4 +1,4 @@
local Base = require "gamecore.modules.world.actors.actor2D"
local Base = require "framework.scenes.world.actors.actor2D"
local Parent = Base:extend()
function Parent:new(world, type, x, y, w, h, isSolid)
@ -7,7 +7,7 @@ function Parent:new(world, type, x, y, w, h, isSolid)
end
function Parent:draw()
self:drawHitbox()
self:drawMainHitbox()
end
return Parent

View File

@ -7,7 +7,7 @@ function Player:new(world, x, y, id)
end
function Player:update(dt)
function Player:updateStart(dt)
self.xfrc, self.yfrc = 480*3, 480*3
if self.keys["up"].isDown then
@ -22,12 +22,14 @@ function Player:update(dt)
if self.keys["right"].isDown then
self.xsp = 120
end
Player.super.update(self, dt)
end
function Player:draw()
Player.super.draw(self)
end
function Player:drawHUD(id)
love.graphics.print(id .. " test", 4, 4)
end
return Player

View File

@ -1,4 +1,4 @@
local Base = require "gamecore.modules.world.actors.actor2D"
local Base = require "framework.scenes.world.actors.actor2D"
local Wall = Base:extend()
function Wall:new(world, x, y, w, h)
@ -7,7 +7,7 @@ function Wall:new(world, x, y, w, h)
end
function Wall:draw()
self:drawHitbox()
self:drawMainHitbox()
utils.graphics.resetColor( )
end

View File

@ -21,27 +21,31 @@
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
]]
local Scene = require "gamecore.modules.scenes"
local Scene = require "framework.scenes"
local MovePlayer = Scene:extend()
local World = require "gamecore.modules.world.world2D"
local World = require "framework.scenes.world.world2D"
function MovePlayer:new(playerNumber, cameraMode)
local playerNumber = playerNumber or 1
local cameraMode = cameraMode or "split"
function MovePlayer:new()
MovePlayer.super.new(self)
self.world = World(self, "examples.gameplay.moveplayer.actors", "examples/gameplay/moveplayer/assets/arena.lua")
World(self, "scenes.gameplay.moveplayer.actors", "datas/maps/topdown/arena.lua")
self.world:setPlayerNumber(4)
self.world:setPlayerNumber(playerNumber)
self.world.cameras:setMode(cameraMode)
self.world:loadMap()
end
function MovePlayer:update(dt)
self.world:update(dt)
end
function MovePlayer:draw()
self.world:draw()
end
return MovePlayer

View File

@ -0,0 +1,13 @@
local Obj = {}
-- On charge toutes les différentes types d'acteurs
local cwd = (...):gsub('%.init$', '') .. "."
Obj.Player = require(cwd .. "player")
Obj.index = {}
Obj.index["player"] = Obj.Player
Obj.collisions = {}
Obj.collisions["wall"] = require(cwd .. "wall")
return Obj

View File

@ -0,0 +1,14 @@
local Base = require "framework.scenes.world.actors.actor3D"
local Parent = Base:extend()
function Parent:new(world, type, x, y, z, w, h, d, isSolid)
self.scene = world.scene
Parent.super.new(self, world, type, x, y, z, w, h, d, isSolid)
end
function Parent:draw()
Parent.super.draw(self)
self:drawMainHitbox()
end
return Parent

View File

@ -0,0 +1,73 @@
local cwd = (...):gsub('%.player$', '') .. "."
local Parent = require(cwd .. "parent")
local Player = Parent:extend()
function Player:new(world, x, y, z, id)
Player.super.new(self, world, "player", x, y, 0, 16, 16, 24, true)
self:setGravity(480)
self:setSprite("player", true, 8, 12)
end
function Player:updateStart(dt)
self.xfrc, self.yfrc = 480*3, 480*3
if self.keys["up"].isDown then
self.ysp = -120
end
if self.keys["down"].isDown then
self.ysp = 120
end
if self.keys["left"].isDown then
self.xsp = -120
end
if self.keys["right"].isDown then
self.xsp = 120
end
if self.keys["A"].isDown and (self.onGround) then
self.zsp = 280
end
end
function Player:updateEnd(dt)
self:setAnimation()
end
function Player:setAnimation()
local gsp = utils.math.pointDistance(0, 0, self.xsp, self.ysp)
self.sprite:setCustomSpeed(math.abs(gsp) / 12)
self:setDirection(self.xsp)
if (self.isPunching) then
self.sprite:changeAnimation("punch", false)
else
if (self.onGround) then
if (math.abs(self.xsp) > 0) or (math.abs(self.ysp) > 0) then
self.sprite:changeAnimation("walk", false)
else
self.sprite:changeAnimation("idle", true)
end
else
self.sprite:changeAnimation("jump", true)
end
end
end
function Player:setDirection(direction)
direction = direction or 0
if direction ~= 0 then
direction = utils.math.sign(direction)
self.direction = direction
self.sprite:setScalling(direction, nil)
end
end
function Player:draw()
Player.super.draw(self)
end
function Player:drawHUD(id)
love.graphics.print(id .. " test", 4, 4)
end
return Player

View File

@ -0,0 +1,10 @@
local Base = require "framework.scenes.world.actors.actor3D"
local Wall = Base:extend()
function Wall:new(world, x, y, z, w, h, d)
Wall.super.new(self, world, "wall", x, y, z, w, h, d, true)
self:setDebugColor(0,0,0)
self.boxes.Base(self, w, h, d)
end
return Wall

Some files were not shown because too many files have changed in this diff Show More