mirror of
https://git.planet-casio.com/Slyvtt/Collab_RPG.git
synced 2025-05-28 22:45:20 +02:00
Got map rendering back working
This commit is contained in:
parent
537e4d5e96
commit
efde68f9c7
8 changed files with 77 additions and 31 deletions
|
@ -37,8 +37,11 @@ set(SOURCES
|
||||||
)
|
)
|
||||||
# Shared assets, fx-9860G-only assets and fx-CG-50-only assets
|
# Shared assets, fx-9860G-only assets and fx-CG-50-only assets
|
||||||
set(ASSETS
|
set(ASSETS
|
||||||
#assets/WorldRPG.world
|
|
||||||
assets/level0.tmx
|
assets/level0.tmx
|
||||||
|
assets/level1.tmx
|
||||||
|
assets/level2.tmx
|
||||||
|
assets/level3.tmx
|
||||||
|
assets/level4.tmx
|
||||||
# ...
|
# ...
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,7 @@ import xml.etree.ElementTree as ET
|
||||||
import json
|
import json
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
|
import fxconv
|
||||||
|
|
||||||
VERBOSE = 1
|
VERBOSE = 1
|
||||||
SIGN_TYPES = ["INFO", "SGN"]
|
SIGN_TYPES = ["INFO", "SGN"]
|
||||||
|
@ -24,6 +25,9 @@ class Tileset:
|
||||||
tilecount_str = self.root.get("tilecount")
|
tilecount_str = self.root.get("tilecount")
|
||||||
if tilecount_str == None: raise Exception("tilecount not found!")
|
if tilecount_str == None: raise Exception("tilecount not found!")
|
||||||
self.tilecount = int(tilecount_str)
|
self.tilecount = int(tilecount_str)
|
||||||
|
columns_str = self.root.get("columns")
|
||||||
|
if columns_str == None: raise Exception("columns not found!")
|
||||||
|
self.columns = int(columns_str)
|
||||||
|
|
||||||
def is_raw_in_tileset(self, raw: int) -> bool:
|
def is_raw_in_tileset(self, raw: int) -> bool:
|
||||||
if raw >= self.firstgid and raw < self.firstgid+self.tilecount:
|
if raw >= self.firstgid and raw < self.firstgid+self.tilecount:
|
||||||
|
@ -84,7 +88,9 @@ class Object:
|
||||||
self.name = element.get("name")
|
self.name = element.get("name")
|
||||||
if self.name == None: raise Exception("Name attribute missing!")
|
if self.name == None: raise Exception("Name attribute missing!")
|
||||||
self.type = element.get("type")
|
self.type = element.get("type")
|
||||||
if self.type == None: raise Exception("Type attribute missing!")
|
if self.type == None:
|
||||||
|
self.type = ""
|
||||||
|
if VERBOSE: print("WARNING: Type attribute missing!")
|
||||||
x_str = element.get("x")
|
x_str = element.get("x")
|
||||||
if x_str == None: raise Exception("X attribute missing!")
|
if x_str == None: raise Exception("X attribute missing!")
|
||||||
self.x = int(float(x_str))
|
self.x = int(float(x_str))
|
||||||
|
@ -254,6 +260,8 @@ def convert_map(input, output, params, target):
|
||||||
npcs = {}
|
npcs = {}
|
||||||
signs = {}
|
signs = {}
|
||||||
|
|
||||||
|
map_struct = fxconv.Structure()
|
||||||
|
|
||||||
# Get the dialog file
|
# Get the dialog file
|
||||||
try:
|
try:
|
||||||
if VERBOSE: print("INFO: Getting the dialog file")
|
if VERBOSE: print("INFO: Getting the dialog file")
|
||||||
|
@ -369,7 +377,45 @@ def convert_map(input, output, params, target):
|
||||||
+ f" Error message: {e}\n")
|
+ f" Error message: {e}\n")
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
# Generate the structs
|
# Generate the structs
|
||||||
#
|
map_struct += fxconv.u32(width)
|
||||||
|
map_struct += fxconv.u32(height)
|
||||||
|
map_struct += fxconv.u32(3)
|
||||||
|
map_struct += fxconv.u32(outdoor_tileset.columns)
|
||||||
|
map_struct += fxconv.u32(0)
|
||||||
|
map_struct += fxconv.u32(0)
|
||||||
|
map_struct += fxconv.u32(0)
|
||||||
|
map_struct += fxconv.u32(0)
|
||||||
|
tileset_name = os.path.splitext(os.path.basename(outdoor_tileset.source))[0]
|
||||||
|
map_struct += fxconv.ref(f"img_{tileset_name}")
|
||||||
|
|
||||||
|
walkable_data = bytes()
|
||||||
|
for i in walkable_layer:
|
||||||
|
if i < 0: i = 0
|
||||||
|
walkable_data += fxconv.u8(i)
|
||||||
|
map_struct += fxconv.ptr(walkable_data)
|
||||||
|
|
||||||
|
map_struct += fxconv.u32(0) # TODO: NPC support in-game
|
||||||
|
map_struct += fxconv.ptr(bytes())
|
||||||
|
map_struct += fxconv.u32(0) # TODO: Sign support in-game
|
||||||
|
map_struct += fxconv.ptr(bytes())
|
||||||
|
map_struct += fxconv.u32(0) # TODO: Portal support in-game
|
||||||
|
map_struct += fxconv.ptr(bytes())
|
||||||
|
map_struct += fxconv.u32(0) # TODO: Dialog support
|
||||||
|
map_struct += fxconv.ptr(bytes())
|
||||||
|
|
||||||
|
background_data = bytes()
|
||||||
|
for i in background_layer:
|
||||||
|
background_data += fxconv.u16(i)
|
||||||
|
map_struct += fxconv.ptr(background_data)
|
||||||
|
|
||||||
|
foreground_data = bytes()
|
||||||
|
for i in foreground_layer:
|
||||||
|
foreground_data += fxconv.u16(i)
|
||||||
|
map_struct += fxconv.ptr(foreground_data)
|
||||||
|
|
||||||
|
# Create the fxconv object
|
||||||
|
name = os.path.splitext(os.path.basename(input))[0]
|
||||||
|
fxconv.elf(map_struct, output, f"_{name}", **target)
|
||||||
|
|
||||||
def convert_dialog(input, output, params, target):
|
def convert_dialog(input, output, params, target):
|
||||||
if VERBOSE: print(f"INFO: Converting dialog file {input} -> {output}")
|
if VERBOSE: print(f"INFO: Converting dialog file {input} -> {output}")
|
||||||
|
|
|
@ -107,7 +107,7 @@
|
||||||
</properties>
|
</properties>
|
||||||
<point/>
|
<point/>
|
||||||
</object>
|
</object>
|
||||||
<object id="3" name="Chemin Gardien" x="303.818" y="117.455">
|
<object id="3" name="Chemin Gardien" type="TRJ" x="303.818" y="117.455">
|
||||||
<properties>
|
<properties>
|
||||||
<property name="dialogID" type="int" value="0"/>
|
<property name="dialogID" type="int" value="0"/>
|
||||||
<property name="needAction" type="int" value="1"/>
|
<property name="needAction" type="int" value="1"/>
|
||||||
|
|
|
@ -117,7 +117,7 @@
|
||||||
</properties>
|
</properties>
|
||||||
<point/>
|
<point/>
|
||||||
</object>
|
</object>
|
||||||
<object id="8" name="CHEMIN_FERMIER" x="147.952" y="63.0743">
|
<object id="8" name="CHEMIN_FERMIER" type="TRJ" x="147.952" y="63.0743">
|
||||||
<polyline points="0,0 13.6272,31.1478 50.6152,79.4269 13.6272,74.7547 -7.3976,102.009 -15.5739,71.6399 -17.91,116.804 47.8897,112.132 71.6399,87.2138 131.21,112.132 176.374,91.1073 218.424,89.9393 131.599,59.1808 74.3654,64.2423 50.2258,44.775 29.9798,42.4389 3.50413,3.50413"/>
|
<polyline points="0,0 13.6272,31.1478 50.6152,79.4269 13.6272,74.7547 -7.3976,102.009 -15.5739,71.6399 -17.91,116.804 47.8897,112.132 71.6399,87.2138 131.21,112.132 176.374,91.1073 218.424,89.9393 131.599,59.1808 74.3654,64.2423 50.2258,44.775 29.9798,42.4389 3.50413,3.50413"/>
|
||||||
</object>
|
</object>
|
||||||
</objectgroup>
|
</objectgroup>
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
#define CONFIG_H
|
#define CONFIG_H
|
||||||
|
|
||||||
#define USB_FEATURE 0
|
#define USB_FEATURE 0
|
||||||
#define DEBUGMODE 1
|
#define DEBUGMODE 0
|
||||||
|
|
||||||
#include <gint/display.h>
|
#include <gint/display.h>
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
#include <gint/display.h>
|
#include <gint/display.h>
|
||||||
#include <gint/keyboard.h>
|
#include <gint/keyboard.h>
|
||||||
#include <gint/timer.h>
|
#include <gint/timer.h>
|
||||||
|
#include <fxlibc/printf.h>
|
||||||
|
|
||||||
#if USB_FEATURE
|
#if USB_FEATURE
|
||||||
#include <gint/usb-ff-bulk.h>
|
#include <gint/usb-ff-bulk.h>
|
||||||
|
@ -33,15 +34,14 @@ extern Map *worldRPG[];
|
||||||
/* Game data (defined in "game.h")*/
|
/* Game data (defined in "game.h")*/
|
||||||
Game game = {NULL,
|
Game game = {NULL,
|
||||||
{12 * PXSIZE, 36 * PXSIZE, 0, 0, 12 * PXSIZE, 36 * PXSIZE, 100,
|
{12 * PXSIZE, 36 * PXSIZE, 0, 0, 12 * PXSIZE, 36 * PXSIZE, 100,
|
||||||
SPEED, false, 0, false, false, true, true},
|
SPEED, false, 0, false, false, true},
|
||||||
{{}, {}, 0},
|
{{}, {}, 0},
|
||||||
false,
|
false,
|
||||||
false,
|
false,
|
||||||
false,
|
false,
|
||||||
0
|
0,
|
||||||
|
|
||||||
/* debug variables*/
|
/* debug variables*/
|
||||||
,
|
|
||||||
false,
|
false,
|
||||||
false,
|
false,
|
||||||
false,
|
false,
|
||||||
|
@ -97,7 +97,7 @@ int main(void) {
|
||||||
gdb_start_on_exception();
|
gdb_start_on_exception();
|
||||||
#endif /*DEBUGMODE*/
|
#endif /*DEBUGMODE*/
|
||||||
|
|
||||||
//__printf_enable_fp();
|
__printf_enable_fp();
|
||||||
|
|
||||||
int timer;
|
int timer;
|
||||||
timer = timer_configure(TIMER_TMU, 1000, GINT_CALL(update_time));
|
timer = timer_configure(TIMER_TMU, 1000, GINT_CALL(update_time));
|
||||||
|
|
35
src/map.c
35
src/map.c
|
@ -6,7 +6,20 @@
|
||||||
#include <gint/display.h>
|
#include <gint/display.h>
|
||||||
#include <gint/keyboard.h>
|
#include <gint/keyboard.h>
|
||||||
|
|
||||||
extern Map *worldRPG[];
|
extern Map level0;
|
||||||
|
extern Map level1;
|
||||||
|
extern Map level2;
|
||||||
|
extern Map level3;
|
||||||
|
extern Map level4;
|
||||||
|
|
||||||
|
Map *worldRPG[] = {
|
||||||
|
&level0,
|
||||||
|
&level1,
|
||||||
|
&level2,
|
||||||
|
&level3,
|
||||||
|
&level4
|
||||||
|
};
|
||||||
|
|
||||||
// extern ExtraData *extraRPG[];
|
// extern ExtraData *extraRPG[];
|
||||||
|
|
||||||
void map_render(Game *game) {
|
void map_render(Game *game) {
|
||||||
|
@ -220,23 +233,5 @@ short int map_get_walkable(Game *game, int x, int y) {
|
||||||
|
|
||||||
/* return the pointer to the map containing the given position */
|
/* return the pointer to the map containing the given position */
|
||||||
Map *map_get_for_coordinates(Game *game, int x, int y) {
|
Map *map_get_for_coordinates(Game *game, int x, int y) {
|
||||||
/* check if the current map contains the point */
|
return game->map_level;
|
||||||
if(x >= (int)game->map_level->xmin && x < (int)game->map_level->xmax &&
|
|
||||||
y >= (int)game->map_level->ymin && y < (int)game->map_level->ymax) {
|
|
||||||
return game->map_level;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* else we check in worldRPG if there is a mal containing that point */
|
|
||||||
int i = 0;
|
|
||||||
Map *current = worldRPG[i];
|
|
||||||
do {
|
|
||||||
if(x >= (int)current->xmin && x < (int)current->xmax &&
|
|
||||||
y >= (int)current->ymin && y < (int)current->ymax)
|
|
||||||
return current;
|
|
||||||
i++;
|
|
||||||
current = worldRPG[i];
|
|
||||||
} while(current != NULL);
|
|
||||||
|
|
||||||
/* else we return NULL cause the point is a not within a map */
|
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -171,7 +171,8 @@ bool player_collision(Game *game, Direction direction,
|
||||||
/* check where the player is expected to go on the next move */
|
/* check where the player is expected to go on the next move */
|
||||||
/* if outside the map, we check if there is a map on the other */
|
/* if outside the map, we check if there is a map on the other */
|
||||||
/* side of the current map*/
|
/* side of the current map*/
|
||||||
if(map_get_walkable(game, player_tile_x, player_tile_y) == MAP_OUTSIDE) {
|
if(0){
|
||||||
|
//if(map_get_walkable(game, player_tile_x, player_tile_y) == MAP_OUTSIDE) {
|
||||||
// we compute the expected world coordinates accordingly
|
// we compute the expected world coordinates accordingly
|
||||||
// while taking care of the scaling between fx and cg models (PXSIZE)
|
// while taking care of the scaling between fx and cg models (PXSIZE)
|
||||||
int worldX = (player->wx + dx) / PXSIZE;
|
int worldX = (player->wx + dx) / PXSIZE;
|
||||||
|
@ -235,6 +236,7 @@ bool player_collision(Game *game, Direction direction,
|
||||||
int speed = (on_walkable >= 0 && on_walkable < WALKABLE_TILE_MAX)
|
int speed = (on_walkable >= 0 && on_walkable < WALKABLE_TILE_MAX)
|
||||||
? walkable_speed[on_walkable]
|
? walkable_speed[on_walkable]
|
||||||
: 0;
|
: 0;
|
||||||
|
//speed = SPEED;
|
||||||
|
|
||||||
/* if he's on a hard tile */
|
/* if he's on a hard tile */
|
||||||
if(!speed) {
|
if(!speed) {
|
||||||
|
|
Loading…
Add table
Reference in a new issue