Initial commit

This commit is contained in:
Sylvain PILLOT 2023-04-21 20:27:02 +02:00
commit 2829e7c6a7
38 changed files with 1426 additions and 0 deletions

14
.gitignore vendored Executable file
View File

@ -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

83
CMakeLists.txt Normal file
View File

@ -0,0 +1,83 @@
# 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(Npp VERSION 1.0 LANGUAGES CXX C ASM)
include(GenerateG3A)
include(Fxconv)
find_package(Azur 0.1 REQUIRED)
find_package(Gint 2.9 REQUIRED)
find_package(LibProf 2.4 REQUIRED)
fxconv_declare_converters(assets-cg/converters.py)
add_custom_command(
OUTPUT "${CMAKE_CURRENT_LIST_DIR}/assets-cg/levels/level1.json"
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-cg/levels/
DEPENDS assets-cg/levels/level1.tmx
OUTPUT "${CMAKE_CURRENT_LIST_DIR}/assets-cg/levels/level2.json"
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-cg/levels/
DEPENDS assets-cg/levels/level2.tmx
OUTPUT "${CMAKE_CURRENT_LIST_DIR}/assets-cg/levels/level3.json"
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-cg/levels/
DEPENDS assets-cg/levels/level3.tmx
assets-cg/converters.py
assets-cg/levels/tileset.png
assets-cg/levels/tilesetnpp.tsx)
set(SOURCES
src/main.cpp
src/extrakeyboard.cpp
src/utilities.cpp
src/player.cpp
src/background.cpp
# ...
)
# Shared assets, fx-9860G-only assets and fx-CG-50-only assets
set(ASSETS
# ...
)
set(ASSETS_cg
assets-cg/font.png
#assets-cg/sprites/walking.png
#assets-cg/sprites/running.png
#assets-cg/sprites/static.png
assets-cg/sprites/rectangle.png
assets-cg/levels/tileset.png
assets-cg/levels/level1.json
assets-cg/levels/level2.json
assets-cg/levels/level3.json
# ...
)
fxconv_declare_assets(${ASSETS} ${ASSETS_cg} WITH_METADATA)
add_executable(myaddin ${SOURCES} ${ASSETS} ${ASSETS_${FXSDK_PLATFORM}})
target_compile_options(myaddin PRIVATE -Wall -Wextra -O3 -std=c++20)
target_link_options(myaddin PRIVATE -Wl,-Map=Build_Addin.map -Wl,--print-memory-usage)
target_link_libraries(myaddin Azur::Azur -lnum LibProf::LibProf Gint::Gint -lstdc++)
if("${FXSDK_PLATFORM_LONG}" STREQUAL fxCG50)
generate_g3a(TARGET myaddin OUTPUT "NppClone.g3a"
NAME "cgN++" ICONS assets-cg/icon-uns.png assets-cg/icon-sel.png)
endif()

0
README.md Normal file
View File

56
assets-cg/converters.py Normal file
View File

@ -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)
structMap += fxconv.ptr(layer_data)
#generate !
fxconv.elf(structMap, output, "_" + params["name"], **target)

BIN
assets-cg/example.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

BIN
assets-cg/font.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

View File

@ -0,0 +1,4 @@
*.png:
type: bopti-image
name_regex: (.*)\.png img_\1
profile: p8_rgb565a

BIN
assets-cg/icon-cg.xcf Normal file

Binary file not shown.

BIN
assets-cg/icon-sel.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

BIN
assets-cg/icon-uns.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

View File

@ -0,0 +1,8 @@
*.json:
custom-type: map
name_regex: (.*)\.json map_\1
tileset.png:
type: bopti-image
name: img_tilesetnpp
profile: p8_rgb565a

View File

@ -0,0 +1,44 @@
{ "compressionlevel":-1,
"height":14,
"infinite":false,
"layers":[
{
"data":[2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2],
"height":14,
"id":1,
"name":"Background",
"opacity":1,
"type":"tilelayer",
"visible":true,
"width":25,
"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, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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":14,
"id":2,
"name":"Foreground",
"opacity":1,
"type":"tilelayer",
"visible":true,
"width":25,
"x":0,
"y":0
}],
"nextlayerid":3,
"nextobjectid":1,
"orientation":"orthogonal",
"renderorder":"right-down",
"tiledversion":"1.8.0",
"tileheight":16,
"tilesets":[
{
"firstgid":1,
"source":"tilesetnpp.tsx"
}],
"tilewidth":16,
"type":"map",
"version":"1.8",
"width":25
}

View File

@ -0,0 +1,40 @@
<?xml version="1.0" encoding="UTF-8"?>
<map version="1.8" tiledversion="1.8.0" orientation="orthogonal" renderorder="right-down" width="25" height="14" tilewidth="16" tileheight="16" infinite="0" nextlayerid="3" nextobjectid="1">
<tileset firstgid="1" source="tilesetnpp.tsx"/>
<layer id="1" name="Background" width="25" height="14">
<data encoding="csv">
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,
2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,
2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,
2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,
2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,
2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,
2,0,0,0,0,0,0,0,0,0,2,2,2,2,2,0,0,0,0,0,0,0,0,0,2,
2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,
2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,
2,0,0,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,0,0,2,
2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,
2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2
</data>
</layer>
<layer id="2" name="Foreground" width="25" height="14">
<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,11,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,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>
</map>

View File

@ -0,0 +1,44 @@
{ "compressionlevel":-1,
"height":14,
"infinite":false,
"layers":[
{
"data":[2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 0, 0, 0, 0, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 0, 0, 0, 0, 4, 2, 2, 2, 3, 0, 0, 0, 0, 0, 0, 4, 2, 5, 6, 0, 7, 8, 2, 3, 0, 0, 0, 0, 0, 0, 4, 2, 2, 0, 0, 20, 2, 2, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 2, 2, 19, 0, 0, 2, 2, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 2, 2, 0, 0, 0, 23, 24, 2, 21, 22, 0, 0, 0, 2, 2, 2, 2, 0, 0, 2, 2, 1, 0, 2, 2, 2, 2, 0, 0, 0, 2, 2, 2, 2, 2, 0, 0, 0, 2, 2, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 2, 2, 0, 0, 0, 2, 3, 1, 4, 2, 0, 0, 0, 2, 2, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 2, 2, 19, 0, 20, 2, 1, 0, 1, 2, 19, 0, 20, 2, 2, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2, 2, 0, 0, 4, 2, 2, 2, 2, 2, 5, 6, 1, 2, 1, 7, 8, 2, 2, 2, 2, 2, 3, 0, 0, 2, 2, 19, 0, 0, 33, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 20, 2, 2, 2, 19, 0, 33, 0, 0, 1, 0, 0, 23, 24, 2, 21, 22, 1, 0, 0, 0, 0, 33, 0, 20, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2],
"height":14,
"id":1,
"name":"Background",
"opacity":1,
"type":"tilelayer",
"visible":true,
"width":25,
"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, 36, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 35, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 51, 0, 0, 0, 11, 0, 0, 0, 51, 0, 0, 0, 0, 0, 66, 0, 0, 0, 35, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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":14,
"id":2,
"name":"Foreground",
"opacity":1,
"type":"tilelayer",
"visible":true,
"width":25,
"x":0,
"y":0
}],
"nextlayerid":4,
"nextobjectid":3,
"orientation":"orthogonal",
"renderorder":"right-down",
"tiledversion":"1.8.0",
"tileheight":16,
"tilesets":[
{
"firstgid":1,
"source":"tilesetnpp.tsx"
}],
"tilewidth":16,
"type":"map",
"version":"1.8",
"width":25
}

View File

@ -0,0 +1,40 @@
<?xml version="1.0" encoding="UTF-8"?>
<map version="1.10" tiledversion="1.10.1" orientation="orthogonal" renderorder="right-down" width="25" height="14" tilewidth="16" tileheight="16" infinite="0" nextlayerid="4" nextobjectid="3">
<tileset firstgid="1" source="tilesetnpp.tsx"/>
<layer id="1" name="Background" width="25" height="14">
<data encoding="csv">
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
2,2,3,0,0,0,0,4,2,2,2,2,2,2,2,2,2,3,0,0,0,0,4,2,2,
2,3,0,0,0,0,0,0,4,2,5,6,0,7,8,2,3,0,0,0,0,0,0,4,2,
2,0,0,20,2,2,19,0,0,0,0,0,0,0,0,0,0,0,20,2,2,19,0,0,2,
2,0,0,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,0,0,2,
2,0,0,2,2,2,2,0,0,0,23,24,2,21,22,0,0,0,2,2,2,2,0,0,2,
2,1,0,2,2,2,2,0,0,0,2,2,2,2,2,0,0,0,2,2,2,2,0,0,2,
2,0,0,2,2,2,2,0,0,0,2,3,1,4,2,0,0,0,2,2,2,2,0,0,2,
2,0,0,2,2,2,2,19,0,20,2,1,0,1,2,19,0,20,2,2,2,2,0,0,2,
2,0,0,2,2,2,2,2,2,2,2,1,2,1,2,2,2,2,2,2,2,2,0,0,2,
2,0,0,4,2,2,2,2,2,5,6,1,2,1,7,8,2,2,2,2,2,3,0,0,2,
2,19,0,0,33,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,33,0,0,20,2,
2,2,19,0,33,0,0,1,0,0,23,24,2,21,22,1,0,0,0,0,33,0,20,2,2,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2
</data>
</layer>
<layer id="2" name="Foreground" width="25" height="14">
<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,36,36,0,0,0,0,0,0,0,0,0,0,0,0,0,36,36,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,36,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,67,0,0,0,0,0,67,0,0,0,0,0,0,0,0,0,
0,0,66,0,0,0,0,0,0,0,0,0,49,0,0,0,0,0,0,0,0,0,66,0,0,
0,35,66,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66,0,0,
0,0,66,0,0,0,0,0,0,52,0,0,0,0,0,35,0,0,0,0,0,0,66,0,0,
0,0,66,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66,0,0,
0,0,66,0,0,0,0,0,51,0,0,0,11,0,0,0,51,0,0,0,0,0,66,0,0,
0,35,66,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,65,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,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>
</map>

View File

@ -0,0 +1,44 @@
{ "compressionlevel":-1,
"height":14,
"infinite":false,
"layers":[
{
"data":[1, 1, 1, 1, 23, 24, 2, 2, 21, 22, 1, 1, 1, 1, 1, 23, 24, 2, 2, 21, 22, 1, 1, 1, 1, 1, 1, 1, 20, 5, 6, 0, 34, 7, 8, 21, 22, 1, 23, 24, 5, 6, 34, 0, 7, 8, 19, 1, 1, 1, 1, 1, 20, 3, 0, 0, 0, 34, 0, 0, 4, 2, 2, 2, 3, 0, 0, 34, 0, 0, 0, 4, 19, 1, 1, 1, 20, 3, 0, 0, 0, 0, 34, 0, 0, 0, 10, 2, 9, 0, 0, 0, 34, 0, 0, 0, 0, 4, 19, 1, 42, 9, 0, 0, 0, 0, 2, 2, 0, 0, 0, 26, 2, 25, 0, 0, 0, 2, 2, 1, 1, 1, 1, 10, 41, 58, 25, 0, 0, 23, 24, 2, 2, 41, 0, 0, 0, 2, 0, 0, 0, 42, 2, 2, 21, 22, 0, 0, 26, 57, 2, 0, 0, 20, 2, 2, 2, 2, 57, 0, 0, 0, 0, 0, 0, 0, 58, 2, 2, 2, 2, 19, 0, 0, 2, 2, 0, 0, 4, 2, 2, 2, 2, 2, 21, 22, 0, 0, 0, 23, 24, 2, 2, 2, 2, 2, 3, 0, 0, 2, 10, 41, 0, 0, 7, 8, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 6, 0, 0, 42, 9, 26, 57, 0, 0, 0, 0, 4, 2, 5, 6, 0, 0, 0, 0, 0, 7, 8, 2, 3, 0, 0, 0, 0, 58, 25, 1, 4, 19, 0, 0, 0, 0, 33, 0, 0, 0, 20, 2, 19, 0, 0, 0, 33, 0, 0, 0, 0, 20, 3, 1, 1, 1, 4, 19, 0, 0, 0, 33, 0, 0, 20, 2, 2, 2, 19, 0, 0, 33, 0, 0, 0, 20, 3, 1, 1, 1, 1, 1, 4, 21, 22, 0, 33, 23, 24, 5, 6, 1, 7, 8, 21, 22, 33, 0, 23, 24, 3, 1, 1, 1, 1, 1, 1, 1, 7, 8, 2, 2, 5, 6, 1, 1, 1, 1, 1, 7, 8, 2, 2, 5, 6, 1, 1, 1, 1],
"height":14,
"id":1,
"name":"Background",
"opacity":1,
"type":"tilelayer",
"visible":true,
"width":25,
"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, 66, 0, 0, 0, 0, 66, 0, 0, 0, 66, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 66, 0, 0, 0, 66, 0, 0, 0, 0, 0, 66, 49, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0],
"height":14,
"id":2,
"name":"Foreground",
"opacity":1,
"type":"tilelayer",
"visible":true,
"width":25,
"x":0,
"y":0
}],
"nextlayerid":3,
"nextobjectid":1,
"orientation":"orthogonal",
"renderorder":"right-down",
"tiledversion":"1.8.0",
"tileheight":16,
"tilesets":[
{
"firstgid":1,
"source":"tilesetnpp.tsx"
}],
"tilewidth":16,
"type":"map",
"version":"1.8",
"width":25
}

View File

@ -0,0 +1,40 @@
<?xml version="1.0" encoding="UTF-8"?>
<map version="1.10" tiledversion="1.10.1" orientation="orthogonal" renderorder="right-down" width="25" height="14" tilewidth="16" tileheight="16" infinite="0" nextlayerid="3" nextobjectid="1">
<tileset firstgid="1" source="tilesetnpp.tsx"/>
<layer id="1" name="Background" width="25" height="14">
<data encoding="csv">
1,1,1,1,23,24,2,2,21,22,1,1,1,1,1,23,24,2,2,21,22,1,1,1,1,
1,1,1,20,5,6,0,34,7,8,21,22,1,23,24,5,6,34,0,7,8,19,1,1,1,
1,1,20,3,0,0,0,34,0,0,4,2,2,2,3,0,0,34,0,0,0,4,19,1,1,
1,20,3,0,0,0,0,34,0,0,0,10,2,9,0,0,0,34,0,0,0,0,4,19,1,
42,9,0,0,0,0,2,2,0,0,0,26,2,25,0,0,0,2,2,1,1,1,1,10,41,
58,25,0,0,23,24,2,2,41,0,0,0,2,0,0,0,42,2,2,21,22,0,0,26,57,
2,0,0,20,2,2,2,2,57,0,0,0,0,0,0,0,58,2,2,2,2,19,0,0,2,
2,0,0,4,2,2,2,2,2,21,22,0,0,0,23,24,2,2,2,2,2,3,0,0,2,
10,41,0,0,7,8,2,2,2,2,2,2,2,2,2,2,2,2,2,5,6,0,0,42,9,
26,57,0,0,0,0,4,2,5,6,0,0,0,0,0,7,8,2,3,0,0,0,0,58,25,
1,4,19,0,0,0,0,33,0,0,0,20,2,19,0,0,0,33,0,0,0,0,20,3,1,
1,1,4,19,0,0,0,33,0,0,20,2,2,2,19,0,0,33,0,0,0,20,3,1,1,
1,1,1,4,21,22,0,33,23,24,5,6,1,7,8,21,22,33,0,23,24,3,1,1,1,
1,1,1,1,7,8,2,2,5,6,1,1,1,1,1,7,8,2,2,5,6,1,1,1,1
</data>
</layer>
<layer id="2" name="Foreground" width="25" height="14">
<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,66,0,0,0,0,66,0,0,0,66,0,0,0,0,66,0,0,0,0,0,
0,0,0,0,66,0,0,0,0,0,66,0,0,0,66,0,0,0,0,0,66,49,0,0,0,
0,0,0,66,0,0,0,0,0,0,66,0,0,0,66,0,0,0,0,0,0,66,0,0,0,
0,0,66,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66,0,0,
0,0,66,0,0,0,0,0,0,0,0,0,65,0,0,0,0,0,0,0,0,0,66,0,0,
0,0,0,66,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66,0,0,0,
0,0,0,0,66,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,66,0,0,0,0,
0,0,0,0,0,66,0,0,0,0,1,1,1,1,1,0,0,0,0,66,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0
</data>
</layer>
</map>

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

View File

@ -0,0 +1,14 @@
{ "columns":16,
"image":"tileset.png",
"imageheight":256,
"imagewidth":256,
"margin":0,
"name":"tileset",
"spacing":0,
"tilecount":256,
"tiledversion":"1.8.0",
"tileheight":16,
"tilewidth":16,
"type":"tileset",
"version":"1.8"
}

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<tileset version="1.10" tiledversion="1.10.1" name="tileset" tilewidth="16" tileheight="16" tilecount="256" columns="16">
<image source="tileset.png" width="256" height="256"/>
</tileset>

View File

@ -0,0 +1,4 @@
*.png:
type: bopti-image
name_regex: (.*)\.png img_\1
profile: p8_rgb565a

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 651 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 260 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 372 B

3
build Executable file
View File

@ -0,0 +1,3 @@
rm -r build-cg
rm *.g3a
fxsdk build-cg -B VERBOSE=1

1
capture Executable file
View File

@ -0,0 +1 @@
fxlink -iw

2
clean Executable file
View File

@ -0,0 +1,2 @@
rm -r build-cg/
rm *.g3a

1
send Executable file
View File

@ -0,0 +1 @@
fxlink -sw *.g3a -u

97
src/background.cpp Normal file
View File

@ -0,0 +1,97 @@
#include "background.h"
#include "player.h"
#include <azur/azur.h>
#include <azur/gint/render.h>
#include <cstdint>
#include <stdlib.h>
extern struct Map map_level1;
extern struct Map map_level2;
extern struct Map map_level3;
extern bool drawbackground;
struct Map *map_level;
Background::Background( )
{
map_level = &map_level2;
}
Background::~Background( )
{
}
void Background::ChangeMap( int level, Player *MyPlayer )
{
if(level==1) map_level = &map_level1;
else if(level==2) map_level = &map_level2;
else if(level==3) map_level = &map_level3;
else map_level = &map_level1;
UpdateDataMap( MyPlayer );
}
void Background::UpdateDataMap( Player *MyPlayer )
{
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) % map_level->w;
uint16_t currentTile = map_level->layers[1][ index ];
if (currentTile==11)
{
MyPlayer->x = libnum::num( i*16 - 4 + 8 );
MyPlayer->y = libnum::num( j*16 + 8 );
MyPlayer->vx = 0;
MyPlayer->vy = 0;
MyPlayer->Update( 0.0f, 0.0f, 0.0f );
}
}
}
}
void Background::Render( void )
{
for(int u=!drawbackground; 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) % map_level->w;
uint16_t currentTile = map_level->layers[u][ index ];
if (currentTile!=0 && currentTile!=11)
{
uint16_t xtile = ((currentTile % map_level->tileset_size)-1) * 16;
uint16_t ytile = (currentTile / map_level->tileset_size) * 16;
azrp_subimage_p8( i*16-4, j*16, map_level->tileset, xtile, ytile, 16, 16, DIMAGE_NONE );
}
}
}
}
}
void Background::Update( float dt )
{
}
bool Background::CanGo( Player *MyPlayer )
{
int tileX = ((int) MyPlayer->x+4) >> 4 ;
int tileY = ((int) MyPlayer->y+8) >> 4;
int tileIndex = tileY*map_level->w + tileX;
int tileValue = map_level->layers[0][ tileIndex ];
if (tileValue==0 || tileValue==1) return true;
else return false;
}

45
src/background.h Normal file
View File

@ -0,0 +1,45 @@
#ifndef BACKGROUND_H
#define BACKGROUND_H
#include <cstdint>
#include <stdlib.h>
#include <azur/gint/render.h>
#include <vector>
#include "num/num.h"
#include "player.h"
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[];
};
class Background
{
public:
Background( );
~Background( );
void Update( float dt );
void Render( );
void ChangeMap( int level, Player *MyPlayer );
void UpdateDataMap( Player *MyPlayer );
bool CanGo( Player *MyPlayer );
};
#endif

160
src/extrakeyboard.cpp Normal file
View File

@ -0,0 +1,160 @@
#include "extrakeyboard.h"
#include <gint/keyboard.h>
#include <gint/rtc.h>
#include <cstdint>
typedef struct
{
bool pressed;
uint32_t since = 0;
} keyinfo;
keyinfo MyKeyMapper[MYKEY_LASTENUM+1];
KeyboardExtra::KeyboardExtra()
{
uint32_t timer = rtc_ticks();
now = timer;
for(int i=0; i<=MYKEY_LASTENUM; i++) MyKeyMapper[i] = { .pressed = false, .since = timer };
}
KeyboardExtra::~KeyboardExtra()
{
}
void KeyboardExtra::Update( float dt )
{
uint32_t timer = rtc_ticks();
now = timer;
key_event_t ev;
int keycode = -1;
while((ev = pollevent()).type != KEYEV_NONE)
{
if (ev.key == KEY_F1) keycode = MYKEY_F1;
else if(ev.key == KEY_F2) keycode = MYKEY_F2;
else if(ev.key == KEY_F3) keycode = MYKEY_F3;
else if(ev.key == KEY_F4) keycode = MYKEY_F4;
else if(ev.key == KEY_F5) keycode = MYKEY_F5;
else if(ev.key == KEY_F6) keycode = MYKEY_F6;
else if(ev.key == KEY_SHIFT) keycode = MYKEY_SHIFT;
else if(ev.key == KEY_OPTN) keycode = MYKEY_OPTN;
else if(ev.key == KEY_VARS) keycode = MYKEY_VARS;
else if(ev.key == KEY_MENU) keycode = MYKEY_MENU;
else if(ev.key == KEY_LEFT) keycode = MYKEY_LEFT;
else if(ev.key == KEY_UP) keycode = MYKEY_UP;
else if(ev.key == KEY_ALPHA) keycode = MYKEY_ALPHA;
else if(ev.key == KEY_SQUARE) keycode = MYKEY_SQUARE;
else if(ev.key == KEY_POWER) keycode = MYKEY_POWER;
else if(ev.key == KEY_EXIT) keycode = MYKEY_EXIT;
else if(ev.key == KEY_DOWN) keycode = MYKEY_DOWN;
else if(ev.key == KEY_RIGHT) keycode = MYKEY_RIGHT;
else if(ev.key == KEY_XOT) keycode = MYKEY_XOT;
else if(ev.key == KEY_LOG) keycode = MYKEY_LOG;
else if(ev.key == KEY_LN) keycode = MYKEY_LN;
else if(ev.key == KEY_SIN) keycode = MYKEY_SIN;
else if(ev.key == KEY_COS) keycode = MYKEY_COS;
else if(ev.key == KEY_TAN) keycode = MYKEY_TAN;
else if(ev.key == KEY_FRAC) keycode = MYKEY_FRAC;
else if(ev.key == KEY_FD) keycode = MYKEY_FD;
else if(ev.key == KEY_LEFTP) keycode = MYKEY_LEFTP;
else if(ev.key == KEY_RIGHTP) keycode = MYKEY_RIGHTP;
else if(ev.key == KEY_COMMA) keycode = MYKEY_COMMA;
else if(ev.key == KEY_ARROW) keycode = MYKEY_ARROW;
else if(ev.key == KEY_7) keycode = MYKEY_7;
else if(ev.key == KEY_8) keycode = MYKEY_8;
else if(ev.key == KEY_9) keycode = MYKEY_9;
else if(ev.key == KEY_DEL) keycode = MYKEY_DEL;
else if(ev.key == KEY_4) keycode = MYKEY_4;
else if(ev.key == KEY_5) keycode = MYKEY_5;
else if(ev.key == KEY_6) keycode = MYKEY_6;
else if(ev.key == KEY_MUL) keycode = MYKEY_MUL;
else if(ev.key == KEY_DIV) keycode = MYKEY_DIV;
else if(ev.key == KEY_1) keycode = MYKEY_1;
else if(ev.key == KEY_2) keycode = MYKEY_2;
else if(ev.key == KEY_3) keycode = MYKEY_3;
else if(ev.key == KEY_ADD) keycode = MYKEY_ADD;
else if(ev.key == KEY_SUB) keycode = MYKEY_SUB;
else if(ev.key == KEY_0) keycode = MYKEY_0;
else if(ev.key == KEY_DOT) keycode = MYKEY_DOT;
else if(ev.key == KEY_EXP) keycode = MYKEY_EXP;
else if(ev.key == KEY_NEG) keycode = MYKEY_NEG;
else if(ev.key == KEY_EXE) keycode = MYKEY_EXE;
else if(ev.key == KEY_ACON) keycode = MYKEY_ACON;
if(keycode!=-1)
{
if (ev.type == KEYEV_DOWN) MyKeyMapper[keycode] = { .pressed = true, .since = timer };
else if (ev.type == KEYEV_UP) MyKeyMapper[keycode] = { .pressed = false, .since = timer };
else if (ev.type == KEYEV_HOLD) {}
}
else
{
// do nothing, just unstack the event from the events queue
};
}
}
bool KeyboardExtra::IsKeyPressedEvent( int key )
{
return (MyKeyMapper[key].pressed && MyKeyMapper[key].since == now);
}
bool KeyboardExtra::IsKeyReleasedEvent( int key )
{
return (!MyKeyMapper[key].pressed && MyKeyMapper[key].since == now);
}
bool KeyboardExtra::IsKeyPressed( int key )
{
return MyKeyMapper[key].pressed;
}
bool KeyboardExtra::IsKeyReleased( int key )
{
return (!MyKeyMapper[key].pressed);
}
uint32_t KeyboardExtra::IsKeyHoldPressed( int key )
{
if (MyKeyMapper[key].pressed && MyKeyMapper[key].since < now)
return (uint32_t) (now-MyKeyMapper[key].since);
else return 0;
}
uint32_t KeyboardExtra::IsKeyHoldReleased( int key )
{
if (!MyKeyMapper[key].pressed && MyKeyMapper[key].since < now)
return (uint32_t) (now-MyKeyMapper[key].since);
else return 0;
}
uint32_t KeyboardExtra::GetLastTickKeyEvent( int key )
{
return (uint32_t) MyKeyMapper[key].since;
}

94
src/extrakeyboard.h Normal file
View File

@ -0,0 +1,94 @@
#ifndef EXTRAKEYBOARD_H
#define EXTRAKEYBOARD_H
#include <cstdint>
enum
{
MYKEY_F1=0,
MYKEY_F2,
MYKEY_F3,
MYKEY_F4,
MYKEY_F5,
MYKEY_F6,
MYKEY_SHIFT,
MYKEY_OPTN,
MYKEY_VARS,
MYKEY_MENU,
MYKEY_LEFT,
MYKEY_UP,
MYKEY_ALPHA,
MYKEY_SQUARE,
MYKEY_POWER,
MYKEY_EXIT,
MYKEY_DOWN,
MYKEY_RIGHT,
MYKEY_XOT,
MYKEY_LOG,
MYKEY_LN,
MYKEY_SIN,
MYKEY_COS,
MYKEY_TAN,
MYKEY_FRAC,
MYKEY_FD,
MYKEY_LEFTP,
MYKEY_RIGHTP,
MYKEY_COMMA,
MYKEY_ARROW,
MYKEY_7,
MYKEY_8,
MYKEY_9,
MYKEY_DEL,
MYKEY_4,
MYKEY_5,
MYKEY_6,
MYKEY_MUL,
MYKEY_DIV,
MYKEY_1,
MYKEY_2,
MYKEY_3,
MYKEY_ADD,
MYKEY_SUB,
MYKEY_0,
MYKEY_DOT,
MYKEY_EXP,
MYKEY_NEG,
MYKEY_EXE,
MYKEY_ACON,
MYKEY_LASTENUM,
};
class KeyboardExtra
{
public:
KeyboardExtra();
~KeyboardExtra();
void Update( float dt );
bool IsKeyPressedEvent( int key );
bool IsKeyReleasedEvent( int key );
bool IsKeyPressed( int key );
bool IsKeyReleased( int key );
uint32_t IsKeyHoldPressed( int key );
uint32_t IsKeyHoldReleased( int key );
uint32_t GetLastTickKeyEvent( int key );
private:
uint32_t now;
};
#endif

308
src/main.cpp Normal file
View File

@ -0,0 +1,308 @@
#define DEBUG_MODE 1
#define BIAS 1
#define NOBIAS (1-BIAS)
#include <azur/azur.h>
#include <azur/gint/render.h>
#include <gint/drivers/r61524.h>
#include <gint/rtc.h>
#include <gint/clock.h>
#include <gint/kmalloc.h>
#include <libprof.h>
#include <gint/usb.h>
#include <gint/usb-ff-bulk.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <fxlibc/printf.h>
#include <cstdint>
#include <num/num.h>
#include "extrakeyboard.h"
#include "utilities.h"
#include "player.h"
#include "background.h"
bool screenshot = false;
bool record = false;
bool textoutput = false;
bool exitToOS = false;
uint8_t texttodraw=1;
#define SCALE_PIXEL 1
#define X_RESOL (DWIDTH / SCALE_PIXEL)
#define Y_RESOL (DHEIGHT / SCALE_PIXEL)
float elapsedTime = 0.0f;
uint32_t time_update=0, time_render=0;
prof_t perf_update, perf_render;
static kmalloc_arena_t extended_ram = { 0 };
static kmalloc_arena_t *_uram;
kmalloc_gint_stats_t *_uram_stats;
kmalloc_gint_stats_t *extram_stats;
KeyboardExtra MyKeyboard;
Background MyBackground;
Player MyPlayer( 198, 180 );
bool drawbackground = true;
static void hook_prefrag(int id, void *fragment, int size)
{
if(!screenshot && !record)
return;
/* Screenshot takes precedence */
char const *type = screenshot ? "image" : "video";
int pipe = usb_ff_bulk_output();
if(id == 0) {
usb_fxlink_header_t h;
usb_fxlink_image_t sh;
int size = azrp_width * azrp_height * 2;
usb_fxlink_fill_header(&h, "fxlink", type, size + sizeof sh);
sh.width = htole32(azrp_width);
sh.height = htole32(azrp_height);
sh.pixel_format = htole32(USB_FXLINK_IMAGE_RGB565);
usb_write_sync(pipe, &h, sizeof h, false);
usb_write_sync(pipe, &sh, sizeof sh, false);
}
usb_write_sync(pipe, fragment, size, false);
if(id == azrp_frag_count - 1) {
usb_commit_sync(pipe);
screenshot = false;
}
}
static void update( float dt )
{
MyPlayer.Update( dt, 0.0f, 1.0f );
}
static void render( void )
{
MyBackground.Render();
MyPlayer.Render();
#if(BIAS)
if (texttodraw>=1) Azur_draw_text(1,01, "FPS = %.0f", (float) (1000000.0f / elapsedTime) );
//if (texttodraw>=1) Azur_draw_text(1,11, "Part.= %d - Bull.= %d", MyParticles.size(), MyPlayerBullets.size() );
//if (texttodraw>=1 && !MyEnemies.empty()) Azur_draw_text(1,21, "Ennmy Life= %d", MyEnemies[0]->life );
if (texttodraw>=2) Azur_draw_text(1,31, "Update = %.3f ms", (float) time_update / 1000.0f );
if (texttodraw>=2) Azur_draw_text(1,41, "Render = %.3f ms", (float) time_render / 1000.0f );
if (texttodraw>=2) Azur_draw_text(1,51, ">Total = %.0f ms", (float) elapsedTime / 1000.0f );
if (texttodraw>=3) Azur_draw_text(1,81, "Mem Used : %d", _uram_stats->used_memory + extram_stats->used_memory);
if (texttodraw>=3) Azur_draw_text(1,91, "Mem Free : %d", _uram_stats->free_memory + extram_stats->free_memory);
if (texttodraw>=3) Azur_draw_text(1,101, "Mem Peak Used : %d", _uram_stats->peak_used_memory + extram_stats->peak_used_memory );
#endif
}
static void get_inputs( float dt )
{
if (MyKeyboard.IsKeyPressed(MYKEY_SHIFT) && MyKeyboard.IsKeyHoldPressed(MYKEY_EXIT)) {exitToOS = true; };
#if(DEBUG_MODE)
if(MyKeyboard.IsKeyPressed(MYKEY_SHIFT) && MyKeyboard.IsKeyPressedEvent(MYKEY_7) && usb_is_open() ) {screenshot = true;};
if(MyKeyboard.IsKeyPressed(MYKEY_SHIFT) && MyKeyboard.IsKeyPressedEvent(MYKEY_8) && usb_is_open()) {record = true; };
if(MyKeyboard.IsKeyPressed(MYKEY_SHIFT) && MyKeyboard.IsKeyPressedEvent(MYKEY_9) && usb_is_open()) {record = false; };
if(MyKeyboard.IsKeyPressedEvent(MYKEY_VARS)) { drawbackground = !drawbackground; }
if(MyKeyboard.IsKeyPressed(MYKEY_SHIFT) && MyKeyboard.IsKeyPressedEvent(MYKEY_F1)) { texttodraw = 0; }
if(MyKeyboard.IsKeyPressed(MYKEY_SHIFT) && MyKeyboard.IsKeyPressedEvent(MYKEY_F2)) { texttodraw = 1; }
if(MyKeyboard.IsKeyPressed(MYKEY_SHIFT) && MyKeyboard.IsKeyPressedEvent(MYKEY_F3)) { texttodraw = 2; }
if(MyKeyboard.IsKeyPressed(MYKEY_SHIFT) && MyKeyboard.IsKeyPressedEvent(MYKEY_F4)) { texttodraw = 3; }
if(MyKeyboard.IsKeyPressedEvent(MYKEY_F1)) { MyBackground.ChangeMap(1, &MyPlayer); }
if(MyKeyboard.IsKeyPressedEvent(MYKEY_F2)) { MyBackground.ChangeMap(2, &MyPlayer); }
if(MyKeyboard.IsKeyPressedEvent(MYKEY_F3)) { MyBackground.ChangeMap(3, &MyPlayer); }
if(MyKeyboard.IsKeyPressedEvent(MYKEY_F4)) { MyBackground.ChangeMap(4, &MyPlayer); }
if(MyKeyboard.IsKeyPressedEvent(MYKEY_F5)) { MyBackground.ChangeMap(5, &MyPlayer); }
if(MyKeyboard.IsKeyPressedEvent(MYKEY_F6)) { MyBackground.ChangeMap(6, &MyPlayer); }
#endif
if(MyKeyboard.IsKeyPressed(MYKEY_ALPHA) && MyKeyboard.IsKeyPressed(MYKEY_LEFT))
{
MyPlayer.Walk_Left( dt );
}
else if(MyKeyboard.IsKeyPressed(MYKEY_ALPHA) && MyKeyboard.IsKeyPressed(MYKEY_RIGHT))
{
MyPlayer.Walk_Right( dt );
}
else if(MyKeyboard.IsKeyPressed(MYKEY_LEFT))
{
MyPlayer.Run_Left( dt );
}
else if(MyKeyboard.IsKeyPressed(MYKEY_RIGHT))
{
MyPlayer.Run_Right( dt );
}
else
{
MyPlayer.No_Order( dt );
}
if(MyKeyboard.IsKeyPressed(MYKEY_SHIFT))
{
MyPlayer.Jump( dt );
}
}
bool AddMoreRAM( void )
{
/* allow more RAM */
char const *osv = (char*) 0x80020020;
if((!strncmp(osv, "03.", 3) && osv[3] <= '6') && gint[HWCALC] == HWCALC_FXCG50) // CG-50
{
extended_ram.name = "extram";
extended_ram.is_default = true;
extended_ram.start = (void *)0x8c200000;
extended_ram.end = (void *)0x8c4e0000 ;
kmalloc_init_arena(&extended_ram, true);
kmalloc_add_arena(&extended_ram );
return true;
}
else if (gint[HWCALC] == HWCALC_PRIZM) // CG-10/20
{
extended_ram.name = "extram";
extended_ram.is_default = true;
uint16_t *vram1, *vram2;
dgetvram(&vram1, &vram2);
dsetvram(vram1, vram1);
extended_ram.start = vram2;
extended_ram.end = (char *)vram2 + 396*224*2;
kmalloc_init_arena(&extended_ram, true);
kmalloc_add_arena(&extended_ram );
return false;
}
else if (gint[HWCALC] == HWCALC_FXCG_MANAGER) // CG-50 EMULATOR
{
extended_ram.name = "extram";
extended_ram.is_default = true;
extended_ram.start = (void *)0x88200000;
extended_ram.end = (void *)0x884e0000 ;
kmalloc_init_arena(&extended_ram, true);
kmalloc_add_arena(&extended_ram );
return true;
}
}
void FreeMoreRAM( void )
{
memset(extended_ram.start, 0, (char *)extended_ram.end - (char *)extended_ram.start);
}
int main(void)
{
exitToOS = false;
_uram = kmalloc_get_arena("_uram");
bool canWeAllocate3Mb = AddMoreRAM();
__printf_enable_fp();
__printf_enable_fixed();
azrp_config_scale(SCALE_PIXEL);
azrp_shader_clear_configure();
azrp_shader_image_rgb16_configure();
azrp_shader_image_p8_configure();
azrp_shader_image_p4_configure();
azrp_shader_triangle_configure();
azrp_hook_set_prefrag(hook_prefrag);
usb_interface_t const *interfaces[] = { &usb_ff_bulk, NULL };
usb_open(interfaces, GINT_CALL_NULL);
prof_init();
do
{
perf_update = prof_make();
prof_enter(perf_update);
{
// all the stuff to be update should be put here
MyKeyboard.Update( elapsedTime );
get_inputs( elapsedTime );
update( elapsedTime );
// update the RAM consumption status
_uram_stats = kmalloc_get_gint_stats(_uram);
extram_stats = kmalloc_get_gint_stats(&extended_ram);
}
prof_leave(perf_update);
time_update = prof_time(perf_update);
perf_render = prof_make();
prof_enter(perf_render);
{
// all the stuff to be rendered should be put here
azrp_clear( C_WHITE );
render();
azrp_update();
}
prof_leave(perf_render);
time_render = prof_time(perf_render);
elapsedTime = ((float) (time_update+time_render));
}
while (exitToOS==false);
prof_quit();
usb_close();
FreeMoreRAM( );
return 1;
}

174
src/player.cpp Normal file
View File

@ -0,0 +1,174 @@
#include "player.h"
#include <num/num.h>
#include <gint/rtc.h>
#include "background.h"
/*
extern bopti_image_t img_walking;
extern bopti_image_t img_running;
extern bopti_image_t img_static;
*/
extern bopti_image_t img_rectangle;
static uint32_t framecounter = 0;
extern Background MyBackground;
Player::Player( int16_t _x, int16_t _y )
{
x = libnum::num(_x);
y = libnum::num(_y);
width = 8;
height = 8;
speed = 10;
xmin = (int) x - width;
xmax = (int) x + width;
ymin = (int) y - height;
ymax = (int) y + height;
last_tick = rtc_ticks();
}
Player::~Player()
{
}
void Player::Update( float dt, libnum::num ax, libnum::num ay )
{
libnum::num DeltaTime = libnum::num( dt / 60000.0f );
vx += ax * DeltaTime;
vy += ay * DeltaTime;
libnum::num xtemp = x + vx * DeltaTime;
libnum::num ytemp = y + vy * DeltaTime;
if (MyBackground.CanGo( this ))
{
x = xtemp;
y = ytemp;
}
xmin = (int) x - width;
xmax = (int) x + width;
ymin = (int) y - height;
ymax = (int) y + height;
}
void Player::Render( void )
{
uint32_t temptick = rtc_ticks();
if (temptick-last_tick>=10)
{
last_tick = temptick;
framecounter++;
}
/*
if (action==RUN)
{
uint8_t frameinternal = framecounter % 8;
azrp_subimage_p8_effect(xmin, ymin, &img_running, frameinternal*16, 0, 16, 16, direction==RIGHT ? DIMAGE_NONE : IMAGE_HFLIP );
}
else if (action==WALK)
{
uint8_t frameinternal = framecounter % 7;
azrp_subimage_p8_effect(xmin, ymin, &img_walking, frameinternal*16, 0, 16, 16, direction==RIGHT ? DIMAGE_NONE : IMAGE_HFLIP );
}
else if (action==STATIC)
{
uint8_t frameinternal = framecounter % 8;
azrp_subimage_p8_effect(xmin, ymin, &img_static, frameinternal*16, 0, 16, 16, DIMAGE_NONE);
}
*/
azrp_image_p8_effect(xmin, ymin, &img_rectangle, DIMAGE_NONE);
}
void Player::Set_Speed( uint8_t _sp )
{
speed = _sp;
}
void Player::Walk_Left( float dt )
{
libnum::num a = libnum::num( dt / 60000.0f );
x -= a * libnum::num( speed/3 );
this->direction = LEFT;
this->action = WALK;
}
void Player::Walk_Right( float dt )
{
libnum::num a = libnum::num( dt / 60000.0f );
x += a * libnum::num( speed/3 );
this->direction = RIGHT;
this->action = WALK;
}
void Player::Run_Left( float dt )
{
libnum::num a = libnum::num( dt / 60000.0f );
x -= a * libnum::num( speed );
this->direction = LEFT;
this->action = RUN;
}
void Player::Run_Right( float dt )
{
libnum::num a = libnum::num( dt / 60000.0f );
x += a * libnum::num( speed );
this->direction = RIGHT;
this->action = RUN;
}
void Player::Jump( float dt )
{
if (this->action==WALK)
{
//this->vx = speed / 3;
this->vy = -speed / 2;
}
else if (this->action==RUN)
{
//this->vx = speed;
this->vy = -speed;
}
else
{
//this->vx = 0;
this->vy = -speed /2;
}
this->direction = LEFT;
this->action = JUMP;
if (this->direction==LEFT)
{
this->vx = -this->vx;
}
}
void Player::No_Order( float dt )
{
if (this->action == RUN || this->action == WALK)
{
this->action == BREAK;
}
}

69
src/player.h Normal file
View File

@ -0,0 +1,69 @@
#ifndef PLAYER_H
#define PLAYER_H
#include <azur/azur.h>
#include <azur/gint/render.h>
#include <cstdint>
#include <stdlib.h>
#include <num/num.h>
enum
{
LEFT = -2,
RIGHT = -1,
STATIC = 0,
BREAK = 1,
WALK = 2,
RUN = 3,
JUMP = 4,
FALL = 5,
};
class Player
{
public:
Player( int16_t _x, int16_t _y );
~Player();
void Update( float dt, libnum::num ax, libnum::num ay );
void Render( );
void Walk_Left( float dt );
void Walk_Right( float dt );
void Run_Left( float dt );
void Run_Right( float dt );
void No_Order( float dt );
void Jump( float dt );
void Go_Up( int action, float dt );
void Go_Down( int action, float dt );
void Set_Speed( uint8_t _sp );
libnum::num x, y; // center position of the player
libnum::num vx, vy; // speed of the player as per x and y coordinates
uint8_t width, height; // width and height - for the hitbox
int16_t xmin, xmax, ymin, ymax; // square hitbox (to speed up the impact calculations)
int16_t life;
uint8_t speed; // speed of the player
uint32_t last_tick;
int8_t direction = STATIC;
int8_t action = STATIC;
};
#endif

27
src/utilities.cpp Normal file
View File

@ -0,0 +1,27 @@
#include <azur/azur.h>
#include <azur/gint/render.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <fxlibc/printf.h>
/* Render text with Azur images - quite bad, but I don't have time lol. */
void Azur_draw_text(int x, int y, char const *fmt, ...)
{
char str[128];
va_list args;
va_start(args, fmt);
vsnprintf(str, 128, fmt, args);
va_end(args);
extern bopti_image_t img_font;
for(int i = 0; str[i]; i++) {
if(str[i] < 32 || str[i] >= 0x7f) continue;
int row = (str[i] - 32) >> 4;
int col = (str[i] - 32) & 15;
azrp_subimage(x + 5 * i, y, &img_font, 7 * col + 1, 9 * row + 1, 6, 8, DIMAGE_NONE);
}
}

6
src/utilities.h Normal file
View File

@ -0,0 +1,6 @@
#ifndef UTILITIES_H
#define UTILITIES_H
void Azur_draw_text(int x, int y, char const *fmt, ...);
#endif