From 5d868c6089b7621ac202e4575fbfd111e8b505e1 Mon Sep 17 00:00:00 2001 From: SlyVTT Date: Wed, 5 Jul 2023 23:22:15 +0200 Subject: [PATCH] Very first commit to prepare the template of the project - Tileset Ok + Importation Map + Basic Rendering of map in grayscale --- .gitignore | 14 +++++++ CMakeLists.txt | 55 ++++++++++++++++++++++++ README.md | 32 ++++++++++++++ assets-fx/converters.py | 56 +++++++++++++++++++++++++ assets-fx/fxconv-metadata.txt | 3 ++ assets-fx/icon.png | Bin 0 -> 10901 bytes assets-fx/levels/fxconv-metadata.txt | 7 ++++ assets-fx/levels/level0.json | 44 ++++++++++++++++++++ assets-fx/levels/level0.tmx | 60 +++++++++++++++++++++++++++ assets-fx/levels/tileset.png | Bin 0 -> 31686 bytes assets-fx/levels/tilesetnpp.json | 14 +++++++ assets-fx/levels/tilesetnpp.tsx | 4 ++ src/main.c | 25 +++++++++++ src/map.c | 27 ++++++++++++ src/map.h | 25 +++++++++++ 15 files changed, 366 insertions(+) create mode 100644 .gitignore create mode 100644 CMakeLists.txt create mode 100644 README.md create mode 100644 assets-fx/converters.py create mode 100644 assets-fx/fxconv-metadata.txt create mode 100644 assets-fx/icon.png create mode 100644 assets-fx/levels/fxconv-metadata.txt create mode 100644 assets-fx/levels/level0.json create mode 100644 assets-fx/levels/level0.tmx create mode 100644 assets-fx/levels/tileset.png create mode 100644 assets-fx/levels/tilesetnpp.json create mode 100644 assets-fx/levels/tilesetnpp.tsx create mode 100644 src/main.c create mode 100644 src/map.c create mode 100644 src/map.h diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..baadade --- /dev/null +++ b/.gitignore @@ -0,0 +1,14 @@ +# Build files +/build-fx +/build-cg +/build-cg-push +/*.g1a +/*.g3a + +# Python bytecode +__pycache__/ + +# Common IDE files +*.sublime-project +*.sublime-workspace +.vscode diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..546de15 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,55 @@ +# Configure with [fxsdk build-fx] or [fxsdk build-cg], which provide the +# toolchain file and module path of the fxSDK + +cmake_minimum_required(VERSION 3.15) +project(MyAddin) + +include(GenerateG1A) +include(Fxconv) +find_package(Gint 2.9 REQUIRED) +find_package(LibProf 2.4 REQUIRED) + +fxconv_declare_converters(assets-fx/converters.py) + +add_custom_command( + COMMENT "Convert Tiled TMX map to usable JSON file" + COMMAND tiled --export-tileset json tilesetnpp.tsx tilesetnpp.json + COMMAND find | grep .*.tmx | sed 's/.tmx//g' | xargs -l bash -c 'tiled --export-map json $$0.tmx $$0.json' + WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/assets-fx/levels/ + + OUTPUT "${CMAKE_CURRENT_LIST_DIR}/assets-fx/levels/level0.json" +# if several levels/maps are created, just copy the previous line and change the .json name with the new level/map + DEPENDS assets-fx/converters.py + assets-fx/levels/tileset.png + assets-fx/levels/tilesetnpp.tsx + assets-fx/levels/level0.tmx +# if several levels/maps are created, just copy the previous line and change the .json name with the new level/map + ) + + +set(SOURCES + src/main.c + src/map.c + # ... +) +# Shared assets, fx-9860G-only assets and fx-CG-50-only assets +set(ASSETS + # ... +) +set(ASSETS_fx + assets-fx/levels/tileset.png + assets-fx/levels/level0.json + # ... +) + +fxconv_declare_assets(${ASSETS} ${ASSETS_fx} ${ASSETS_cg} WITH_METADATA) + +add_executable(myaddin ${SOURCES} ${ASSETS} ${ASSETS_${FXSDK_PLATFORM}}) +target_compile_options(myaddin PRIVATE -Wall -Wextra -Os) +target_link_options(myaddin PRIVATE -Wl,-Map=Build_Addin.map -Wl,--print-memory-usage) +target_link_libraries(myaddin LibProf::LibProf Gint::Gint) + +if("${FXSDK_PLATFORM_LONG}" STREQUAL fx9860G) + generate_g1a(TARGET myaddin OUTPUT "Prj_PC.g1a" + NAME "Collab RPG" ICON assets-fx/icon.png) +endif() diff --git a/README.md b/README.md new file mode 100644 index 0000000..f29a45d --- /dev/null +++ b/README.md @@ -0,0 +1,32 @@ +# Projet Collaboratif Planete Casio + +## Template + +Voici un premier jet de template pour le projet collaboratif de Planete Casio. + +PLus d'infos sur ce projet ici : [Le projet Collaboratif de PC](https://www.planet-casio.com/Fr/forums/topic17343-last-projet-collaboratif-avec-toute-la-commu.html) + +## Dispo / Pas Dispo + +Le template initialise un projet avec moteur de gris pour les calculatrices fx9860G toute version. + +Importation d'un tileset via un convertisseur tiled/fxconv +Importation d'une carte de tiles (map) via un convertisseur +Dessin de la Map en niveau de gris + + +A ce stade, rien de plus : + +Pas de gestion des touches +Pas de personnage +Pas d'interraction + +Bref, c'est juste le minimum pour offrir qq fonctions de base et ne pas partir de zéro. + +## Crédits + +Les tiles sont issues de Game Boy Top-down RPG Fantasy Tileset (FREE) +"Background Assets by Gumpy Function (gumpyfunction.itch.io)" +[Tiles Background Assets by Gumpy Function](https://gumpyfunction.itch.io/game-boy-rpg-fantasy-tileset-free) + +Converties en niveau de gris avec Gimp diff --git a/assets-fx/converters.py b/assets-fx/converters.py new file mode 100644 index 0000000..53bea37 --- /dev/null +++ b/assets-fx/converters.py @@ -0,0 +1,56 @@ +from random import randint +import fxconv +import json +import pathlib +import csv + +def convert(input, output, params, target): + if params["custom-type"] == "map": + convert_map(input, output, params, target) + return 0 + else: + return 1 + +def convert_map(input, output, params, target): + data = json.load(open(input, "r")) + + #find the tileset in use. it's a relative path (like ../tileset.tsx) + nameTileset = data["tilesets"][0]["source"].replace(".tsx","") + print(nameTileset) + #the name of the tileset without the .something + nameTilesetFree = nameTileset.split("/")[-1] + #count the number of "back" (cd ..) to locate the tileset on the computer + nbRetour = nameTileset.count("..")+1 + #create the tileset absolute path + tilesetPath = "/".join(input.split("/")[:-nbRetour]) + "/" + nameTileset + ".json" + + tileset = open(tilesetPath, "r") + data_tileset = json.load(tileset) + tileset_size = data_tileset.get("columns") + tileset.close() + + + #Extract from the json the width, height + w, h = data["width"], data["height"] + + #nbTileLayer is the number of "true" layers (without ObjectsLayer) + nbTilelayer = ["data" in i for i in data["layers"]].count(True) + + structMap = fxconv.Structure() + + structMap += fxconv.u32(w) + fxconv.u32(h) + fxconv.u32(nbTilelayer) + structMap += fxconv.ref(f"img_{nameTilesetFree}") + structMap += fxconv.u32(tileset_size) + + #generate the array of tiles from the layer + for i in range(nbTilelayer): + layer_data = bytes() + layer = data["layers"][i] + for tile in layer["data"]: + layer_data += fxconv.u16(tile-1) + + structMap += fxconv.ptr(layer_data) + + #generate ! + fxconv.elf(structMap, output, "_" + params["name"], **target) + diff --git a/assets-fx/fxconv-metadata.txt b/assets-fx/fxconv-metadata.txt new file mode 100644 index 0000000..d435d5f --- /dev/null +++ b/assets-fx/fxconv-metadata.txt @@ -0,0 +1,3 @@ +example.png: + type: bopti-image + name: img_example diff --git a/assets-fx/icon.png b/assets-fx/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..7f0162d43577c5deaa6e78936bd6abba1c9e6461 GIT binary patch literal 10901 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 UM;NMt%?C$GPF=Q4+C1=o03umD*8l(j literal 0 HcmV?d00001 diff --git a/assets-fx/levels/fxconv-metadata.txt b/assets-fx/levels/fxconv-metadata.txt new file mode 100644 index 0000000..156bf1a --- /dev/null +++ b/assets-fx/levels/fxconv-metadata.txt @@ -0,0 +1,7 @@ +*.json: + custom-type: map + name_regex: (.*)\.json map_\1 + +tileset.png: + type: bopti-image + name: img_tilesetnpp diff --git a/assets-fx/levels/level0.json b/assets-fx/levels/level0.json new file mode 100644 index 0000000..ab940ec --- /dev/null +++ b/assets-fx/levels/level0.json @@ -0,0 +1,44 @@ +{ "compressionlevel":-1, + "height":24, + "infinite":false, + "layers":[ + { + "data":[257, 297, 298, 299, 300, 257, 386, 297, 298, 299, 300, 0, 0, 0, 0, 0, 257, 0, 0, 225, 226, 227, 228, 201, 202, 203, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 253, 205, 229, 205, 229, 280, 179, 180, 179, 156, 156, 156, 158, 157, 179, 180, 253, 0, 0, 249, 250, 251, 252, 225, 226, 227, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 301, 125, 126, 127, 128, 0, 385, 303, 350, 351, 303, 0, 0, 0, 350, 351, 301, 0, 0, 273, 274, 275, 276, 249, 250, 251, 252, 201, 202, 203, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 325, 149, 150, 151, 152, 0, 0, 327, 374, 375, 327, 0, 184, 185, 374, 375, 325, 0, 279, 297, 298, 299, 300, 273, 274, 275, 276, 225, 226, 227, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 257, 0, 0, 385, 0, 0, 385, 0, 265, 266, 0, 0, 208, 209, 352, 353, 257, 0, 302, 0, 130, 129, 166, 297, 298, 299, 300, 249, 250, 251, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 281, 176, 0, 0, 278, 0, 0, 385, 289, 290, 0, 0, 232, 233, 376, 377, 281, 0, 326, 0, 154, 153, 190, 201, 202, 203, 204, 273, 274, 275, 276, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 201, 202, 203, 204, 302, 385, 0, 0, 265, 266, 0, 385, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 166, 225, 226, 227, 228, 297, 298, 299, 300, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 225, 226, 227, 228, 326, 0, 385, 0, 265, 266, 0, 0, 0, 0, 214, 215, 0, 0, 0, 0, 0, 0, 190, 249, 250, 251, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 249, 250, 251, 252, 201, 202, 203, 204, 289, 290, 0, 258, 259, 260, 238, 239, 260, 260, 261, 262, 262, 263, 264, 273, 274, 275, 276, 0, 93, 94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 273, 274, 275, 276, 225, 226, 227, 228, 265, 266, 0, 282, 283, 284, 285, 285, 285, 285, 285, 285, 286, 287, 288, 297, 298, 299, 300, 0, 117, 118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 297, 298, 299, 300, 249, 250, 251, 252, 290, 0, 0, 306, 307, 308, 309, 308, 309, 308, 309, 310, 310, 311, 312, 131, 0, 339, 340, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 202, 203, 204, 386, 273, 274, 275, 276, 0, 0, 0, 330, 331, 332, 333, 332, 333, 332, 333, 334, 334, 335, 336, 132, 0, 363, 364, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 226, 227, 228, 386, 297, 298, 299, 300, 0, 290, 0, 162, 163, 164, 165, 162, 163, 164, 165, 162, 163, 164, 165, 132, 0, 201, 202, 203, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 250, 251, 252, 0, 0, 0, 0, 0, 0, 0, 0, 86, 87, 88, 89, 186, 187, 188, 189, 86, 87, 88, 89, 132, 0, 225, 226, 227, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 274, 275, 276, 0, 270, 271, 271, 271, 272, 0, 0, 110, 111, 112, 113, 210, 211, 212, 213, 110, 111, 112, 113, 133, 0, 249, 250, 251, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 298, 299, 300, 0, 294, 1, 1, 1, 296, 0, 0, 136, 137, 0, 0, 234, 290, 265, 237, 0, 0, 339, 340, 0, 0, 273, 274, 275, 276, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 202, 203, 204, 0, 294, 1, 1, 1, 296, 0, 0, 160, 161, 265, 266, 266, 265, 266, 0, 0, 0, 363, 364, 0, 0, 297, 298, 299, 300, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 226, 227, 228, 0, 318, 319, 319, 319, 320, 0, 0, 0, 0, 289, 290, 265, 266, 290, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 250, 251, 252, 0, 0, 0, 0, 0, 0, 385, 386, 0, 0, 265, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 274, 275, 276, 201, 202, 203, 204, 257, 0, 0, 0, 257, 0, 265, 265, 0, 257, 0, 0, 0, 257, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 298, 299, 300, 225, 226, 227, 228, 253, 205, 229, 205, 253, 0, 290, 265, 0, 253, 205, 229, 205, 253, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 386, 249, 250, 251, 252, 345, 346, 347, 348, 277, 0, 265, 266, 0, 301, 386, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 202, 203, 204, 273, 274, 275, 276, 369, 370, 371, 372, 301, 0, 289, 290, 0, 325, 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 226, 227, 228, 297, 298, 299, 300, 393, 394, 395, 396, 325, 0, 265, 266, 0, 301, 386, 0, 0, 0, 0, 257, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "height":24, + "id":1, + "name":"Background", + "opacity":1, + "type":"tilelayer", + "visible":true, + "width":48, + "x":0, + "y":0 + }, + { + "data":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "height":24, + "id":2, + "name":"Foreground", + "opacity":1, + "type":"tilelayer", + "visible":true, + "width":48, + "x":0, + "y":0 + }], + "nextlayerid":3, + "nextobjectid":1, + "orientation":"orthogonal", + "renderorder":"right-down", + "tiledversion":"1.8.0", + "tileheight":8, + "tilesets":[ + { + "firstgid":1, + "source":"tilesetnpp.tsx" + }], + "tilewidth":8, + "type":"map", + "version":"1.8", + "width":48 +} \ No newline at end of file diff --git a/assets-fx/levels/level0.tmx b/assets-fx/levels/level0.tmx new file mode 100644 index 0000000..e559458 --- /dev/null +++ b/assets-fx/levels/level0.tmx @@ -0,0 +1,60 @@ + + + + + +257,297,298,299,300,257,386,297,298,299,300,0,0,0,0,0,257,0,0,225,226,227,228,201,202,203,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +253,205,229,205,229,280,179,180,179,156,156,156,158,157,179,180,253,0,0,249,250,251,252,225,226,227,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +301,125,126,127,128,0,385,303,350,351,303,0,0,0,350,351,301,0,0,273,274,275,276,249,250,251,252,201,202,203,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +325,149,150,151,152,0,0,327,374,375,327,0,184,185,374,375,325,0,279,297,298,299,300,273,274,275,276,225,226,227,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +257,0,0,385,0,0,385,0,265,266,0,0,208,209,352,353,257,0,302,0,130,129,166,297,298,299,300,249,250,251,252,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +281,176,0,0,278,0,0,385,289,290,0,0,232,233,376,377,281,0,326,0,154,153,190,201,202,203,204,273,274,275,276,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +201,202,203,204,302,385,0,0,265,266,0,385,0,0,0,0,0,0,0,0,0,0,166,225,226,227,228,297,298,299,300,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +225,226,227,228,326,0,385,0,265,266,0,0,0,0,214,215,0,0,0,0,0,0,190,249,250,251,252,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +249,250,251,252,201,202,203,204,289,290,0,258,259,260,238,239,260,260,261,262,262,263,264,273,274,275,276,0,93,94,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +273,274,275,276,225,226,227,228,265,266,0,282,283,284,285,285,285,285,285,285,286,287,288,297,298,299,300,0,117,118,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +297,298,299,300,249,250,251,252,290,0,0,306,307,308,309,308,309,308,309,310,310,311,312,131,0,339,340,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +202,203,204,386,273,274,275,276,0,0,0,330,331,332,333,332,333,332,333,334,334,335,336,132,0,363,364,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +226,227,228,386,297,298,299,300,0,290,0,162,163,164,165,162,163,164,165,162,163,164,165,132,0,201,202,203,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +250,251,252,0,0,0,0,0,0,0,0,86,87,88,89,186,187,188,189,86,87,88,89,132,0,225,226,227,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +274,275,276,0,270,271,271,271,272,0,0,110,111,112,113,210,211,212,213,110,111,112,113,133,0,249,250,251,252,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +298,299,300,0,294,1,1,1,296,0,0,136,137,0,0,234,290,265,237,0,0,339,340,0,0,273,274,275,276,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +202,203,204,0,294,1,1,1,296,0,0,160,161,265,266,266,265,266,0,0,0,363,364,0,0,297,298,299,300,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +226,227,228,0,318,319,319,319,320,0,0,0,0,289,290,265,266,290,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +250,251,252,0,0,0,0,0,0,385,386,0,0,265,265,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +274,275,276,201,202,203,204,257,0,0,0,257,0,265,265,0,257,0,0,0,257,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +298,299,300,225,226,227,228,253,205,229,205,253,0,290,265,0,253,205,229,205,253,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,386,249,250,251,252,345,346,347,348,277,0,265,266,0,301,386,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +202,203,204,273,274,275,276,369,370,371,372,301,0,289,290,0,325,387,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +226,227,228,297,298,299,300,393,394,395,396,325,0,265,266,0,301,386,0,0,0,0,257,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + diff --git a/assets-fx/levels/tileset.png b/assets-fx/levels/tileset.png new file mode 100644 index 0000000000000000000000000000000000000000..2c2ad045f49993f52a9f300d6e321148ea9d49e9 GIT binary patch literal 31686 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 + + + diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..9c286a9 --- /dev/null +++ b/src/main.c @@ -0,0 +1,25 @@ +#include +#include +#include +#include "map.h" + + + + + + + + +int main(void) +{ + dclear(C_WHITE); + + dgray( DGRAY_ON ); + + RenderMap(); + + dupdate(); + + getkey(); + return 1; +} diff --git a/src/map.c b/src/map.c new file mode 100644 index 0000000..8b9ee72 --- /dev/null +++ b/src/map.c @@ -0,0 +1,27 @@ +#include "map.h" +#include + +extern struct Map map_level0; + +struct Map *map_level = &map_level0; + +void RenderMap(void) +{ + for (int u = 0; u < map_level->nblayers; u++) + { + for (int i = 0; i < map_level->w; i++) + { + for (int j = 0; j < map_level->h; j++) + { + uint16_t index = j * map_level->w + i; + int16_t currentTile = map_level->layers[u][index]; + if (currentTile != -1) + { + uint16_t xtile = (currentTile % map_level->tileset_size) * 8; + uint16_t ytile = (currentTile / map_level->tileset_size) * 8; + dsubimage(i * 8, j * 8, map_level->tileset, xtile, ytile, 8, 8, DIMAGE_NONE ); + } + } + } + } +} diff --git a/src/map.h b/src/map.h new file mode 100644 index 0000000..0667bc2 --- /dev/null +++ b/src/map.h @@ -0,0 +1,25 @@ +#ifndef MAP_H +#define MAP_H + + +#include + + +void RenderMap(void); + + +struct Map { + /*width, height and the number of layer of the map*/ + int w, h, nblayers; + + /*the tileset to use*/ + bopti_image_t *tileset; + int tileset_size; + + /*list of all the tiles*/ + short *layers[]; +}; + + + +#endif