main: add connection drawing
This commit is contained in:
parent
da49dbeb2b
commit
9645b4b414
60
main.cpp
60
main.cpp
@ -147,10 +147,10 @@ void load_vram()
|
|||||||
for (uint32_t i = 0; i < tileset_t::count; i++)
|
for (uint32_t i = 0; i < tileset_t::count; i++)
|
||||||
vdp2_top = load_tileset(vdp2_top, static_cast<enum tileset_t::tileset>(i));
|
vdp2_top = load_tileset(vdp2_top, static_cast<enum tileset_t::tileset>(i));
|
||||||
|
|
||||||
vdp2.reg.CYCA0 = 0x0121'ffff;
|
vdp2.reg.CYCA0 = 0x0fff'ffff;
|
||||||
vdp2.reg.CYCA1 = 0x0121'ffff;
|
vdp2.reg.CYCA1 = 0x0fff'ffff;
|
||||||
vdp2.reg.CYCB0 = 0x4565'ffff;
|
vdp2.reg.CYCB0 = 0x4fff'ffff;
|
||||||
vdp2.reg.CYCB1 = 0x4565'ffff;
|
vdp2.reg.CYCB1 = 0x4fff'ffff;
|
||||||
|
|
||||||
uint32_t vdp1_top = (sizeof (union vdp1_vram));
|
uint32_t vdp1_top = (sizeof (union vdp1_vram));
|
||||||
for (uint32_t i = 0; i < spritesheet_t::count; i++)
|
for (uint32_t i = 0; i < spritesheet_t::count; i++)
|
||||||
@ -244,12 +244,48 @@ static uint16_t scroll = 0;
|
|||||||
|
|
||||||
// there are 16 pixels per block
|
// there are 16 pixels per block
|
||||||
|
|
||||||
|
static inline uint8_t get_block(const map_t& map, int32_t block_x, int32_t block_y)
|
||||||
|
{
|
||||||
|
const uint8_t border_block = map_objects[state.map].border_block;
|
||||||
|
|
||||||
|
const bool x_lt = block_x < static_cast<int32_t>(map.width);
|
||||||
|
const bool y_lt = block_y < static_cast<int32_t>(map.height);
|
||||||
|
const bool x_gt = block_x >= 0;
|
||||||
|
const bool y_gt = block_y >= 0;
|
||||||
|
|
||||||
|
const bool inside_map = x_lt && y_lt && x_gt && y_gt;
|
||||||
|
const bool north = x_lt && x_gt && !(y_gt);
|
||||||
|
const bool south = x_lt && x_gt && !(y_lt);
|
||||||
|
const bool west = y_lt && y_gt && !(x_gt);
|
||||||
|
const bool east = y_lt && y_gt && !(x_lt);
|
||||||
|
|
||||||
|
#define _has(dir) (map.connections[map_t::connection_t::dir].map != map_t::unconnected)
|
||||||
|
#define _get(dir) (maps[map.connections[map_t::connection_t::dir].map])
|
||||||
|
#define _offset(dir) (map.connections[map_t::connection_t::dir].offset)
|
||||||
|
|
||||||
|
if (inside_map) {
|
||||||
|
return map.blocks.start[map.width * block_y + block_x];
|
||||||
|
} else if (north && _has(north)) {
|
||||||
|
const map_t& north_map = _get(north);
|
||||||
|
const uint32_t north_y = north_map.height + block_y;
|
||||||
|
const uint32_t north_x = block_x - _offset(north);
|
||||||
|
return get_block(north_map, north_x, north_y);
|
||||||
|
} else {
|
||||||
|
return border_block;
|
||||||
|
}
|
||||||
|
|
||||||
|
#undef _offset
|
||||||
|
#undef _get
|
||||||
|
#undef _has
|
||||||
|
}
|
||||||
|
|
||||||
void render_map()
|
void render_map()
|
||||||
{
|
{
|
||||||
if (++scroll > 4) {
|
state.player.x = 8 * 16;
|
||||||
|
if (++scroll > 1) {
|
||||||
scroll = 0;
|
scroll = 0;
|
||||||
state.player.x += 1;
|
//state.player.x += 1;
|
||||||
state.player.y += 1;
|
state.player.y -= 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
vdp2.reg.SCXIN0 = state.player.x - 16;
|
vdp2.reg.SCXIN0 = state.player.x - 16;
|
||||||
@ -263,7 +299,6 @@ void render_map()
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
const map_t& map = maps[state.map];
|
const map_t& map = maps[state.map];
|
||||||
const uint8_t border_block = map_objects[state.map].border_block;
|
|
||||||
const uint32_t base_pattern = state.draw.base_pattern.tilesets[map.tileset];
|
const uint32_t base_pattern = state.draw.base_pattern.tilesets[map.tileset];
|
||||||
vdp2.reg.PNCN0 = PNCN0__N0PNB__1WORD | PNCN0__N0CNSM | PNCN0__N0SCN((base_pattern >> 10) & 0x1f);
|
vdp2.reg.PNCN0 = PNCN0__N0PNB__1WORD | PNCN0__N0CNSM | PNCN0__N0SCN((base_pattern >> 10) & 0x1f);
|
||||||
|
|
||||||
@ -274,13 +309,7 @@ void render_map()
|
|||||||
|
|
||||||
for (int32_t y = origin_y - 3; y <= (origin_y + 3); y++) {
|
for (int32_t y = origin_y - 3; y <= (origin_y + 3); y++) {
|
||||||
for (int32_t x = origin_x - 3; x <= (origin_x + 3); x++) {
|
for (int32_t x = origin_x - 3; x <= (origin_x + 3); x++) {
|
||||||
const uint8_t block = ( (x < static_cast<int32_t>(map.width))
|
const uint8_t block = get_block(map, x, y);
|
||||||
&& (y < static_cast<int32_t>(map.height))
|
|
||||||
&& (x >= 0)
|
|
||||||
&& (y >= 0))
|
|
||||||
? map.blocks.start[map.width * y + x]
|
|
||||||
: border_block;
|
|
||||||
//const uint8_t block = map.blocks.start[map.width * 0 + 0];
|
|
||||||
|
|
||||||
render_block(base_pattern,
|
render_block(base_pattern,
|
||||||
tilesets[map.tileset],
|
tilesets[map.tileset],
|
||||||
@ -447,6 +476,7 @@ void init_vdp2()
|
|||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
state.map = map_t::pallet_town;
|
state.map = map_t::pallet_town;
|
||||||
|
state.player.y = 16 * 8;
|
||||||
|
|
||||||
load_vram();
|
load_vram();
|
||||||
|
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
|
|
||||||
#include "gen/maps.hpp"
|
#include "gen/maps.hpp"
|
||||||
|
#include "gen/sprites.hpp"
|
||||||
|
|
||||||
struct position_t {
|
struct position_t {
|
||||||
uint8_t x;
|
uint8_t x;
|
||||||
@ -44,12 +45,12 @@ struct object_event_t {
|
|||||||
left,
|
left,
|
||||||
right,
|
right,
|
||||||
none,
|
none,
|
||||||
boulder_movement_byte_2,
|
boulder_movement_byte_2, // fixme
|
||||||
};
|
};
|
||||||
|
|
||||||
enum type type;
|
enum type type;
|
||||||
position_t position;
|
position_t position;
|
||||||
uint8_t sprite_id; // fixme
|
enum spritesheet_t::spritesheet sprite_id; // fixme
|
||||||
enum movement movement;
|
enum movement movement;
|
||||||
enum range_or_direction range_or_direction;
|
enum range_or_direction range_or_direction;
|
||||||
uint8_t text_id; // fixme
|
uint8_t text_id; // fixme
|
||||||
|
@ -1,32 +0,0 @@
|
|||||||
from itertools import chain
|
|
||||||
|
|
||||||
from generate.maps import sorted_map_headers
|
|
||||||
|
|
||||||
def includes_header():
|
|
||||||
yield "#pragma once"
|
|
||||||
yield ""
|
|
||||||
yield '#include "maps.hpp"'
|
|
||||||
yield ""
|
|
||||||
|
|
||||||
def directions():
|
|
||||||
return set(
|
|
||||||
# fixme: improve the connection parser
|
|
||||||
# add dataclass fields
|
|
||||||
connection[0]
|
|
||||||
for map_header in sorted_map_headers()
|
|
||||||
for connection in map_header.connections
|
|
||||||
)
|
|
||||||
|
|
||||||
def struct_connection_t():
|
|
||||||
struct connection_t {
|
|
||||||
enum direction {
|
|
||||||
# directions for lulz
|
|
||||||
};
|
|
||||||
|
|
||||||
enum direction direction;
|
|
||||||
map_t::map map;
|
|
||||||
uint8_t offset;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
def ():
|
|
@ -2,6 +2,7 @@ from parse import parse
|
|||||||
|
|
||||||
from generate.generate import renderer
|
from generate.generate import renderer
|
||||||
from generate.maps import sorted_map_headers
|
from generate.maps import sorted_map_headers
|
||||||
|
from generate.sprites import sprite_name
|
||||||
|
|
||||||
def warp_event(ev):
|
def warp_event(ev):
|
||||||
x, y = ev.position
|
x, y = ev.position
|
||||||
@ -36,7 +37,7 @@ def object_event(ev):
|
|||||||
"{",
|
"{",
|
||||||
f".type = object_event_t::type::{ev.type},",
|
f".type = object_event_t::type::{ev.type},",
|
||||||
f".position = {{ {x}, {y} }},",
|
f".position = {{ {x}, {y} }},",
|
||||||
".sprite_id = 0,", # fixme
|
f".sprite_id = spritesheet_t::{sprite_name(ev.sprite_id)},",
|
||||||
f".movement = object_event_t::movement::{ev.movement.lower()},",
|
f".movement = object_event_t::movement::{ev.movement.lower()},",
|
||||||
*(range_or_direction(ev)),
|
*(range_or_direction(ev)),
|
||||||
".text_id = 0,", # fixme
|
".text_id = 0,", # fixme
|
||||||
|
@ -19,6 +19,10 @@ from generate.sort import default_sort
|
|||||||
from generate.binary import binary_res, start_size_value
|
from generate.binary import binary_res, start_size_value
|
||||||
from generate.generate import renderer
|
from generate.generate import renderer
|
||||||
|
|
||||||
|
from parse.map_header import Connection
|
||||||
|
|
||||||
|
directions = sorted(['north', 'south', 'east', 'west'])
|
||||||
|
|
||||||
def sorted_map_constants_list():
|
def sorted_map_constants_list():
|
||||||
return sorted(parse.map_constants_list.items(), key=default_sort)
|
return sorted(parse.map_constants_list.items(), key=default_sort)
|
||||||
|
|
||||||
@ -71,7 +75,7 @@ def struct_tileset_t():
|
|||||||
*tileset_names,
|
*tileset_names,
|
||||||
"};",
|
"};",
|
||||||
"",
|
"",
|
||||||
f"static constexpr int32_t count = {len(_sorted_tilesets_constants_list)};"
|
f"static constexpr int32_t count = {len(_sorted_tilesets_constants_list)};",
|
||||||
"};",
|
"};",
|
||||||
]
|
]
|
||||||
|
|
||||||
@ -83,21 +87,37 @@ def struct_map_t():
|
|||||||
)
|
)
|
||||||
return [
|
return [
|
||||||
"struct map_t {",
|
"struct map_t {",
|
||||||
|
"enum map {",
|
||||||
|
*map_names,
|
||||||
|
"last_map, // special map name",
|
||||||
|
"unused_map_ed, // special silph co elevator map name",
|
||||||
|
"unconnected, // special unconnected map",
|
||||||
|
"};",
|
||||||
|
"",
|
||||||
|
*struct_connection_t(),
|
||||||
|
"",
|
||||||
"start_size_t blocks;",
|
"start_size_t blocks;",
|
||||||
"enum tileset_t::tileset tileset;",
|
"enum tileset_t::tileset tileset;",
|
||||||
"uint32_t width;",
|
"uint32_t width;",
|
||||||
"uint32_t height;",
|
"uint32_t height;",
|
||||||
"",
|
"connection_t connections[4];",
|
||||||
"enum map {",
|
|
||||||
*map_names,
|
|
||||||
"last_map,", # special map name
|
|
||||||
"unused_map_ed,", # special silph co elevator map name
|
|
||||||
"};",
|
|
||||||
"",
|
"",
|
||||||
f"static constexpr int32_t count = {len(_sorted_map_headers)};",
|
f"static constexpr int32_t count = {len(_sorted_map_headers)};",
|
||||||
"};",
|
"};",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
def struct_connection_t():
|
||||||
|
return [
|
||||||
|
"struct connection_t {",
|
||||||
|
"enum map_t::map map;",
|
||||||
|
"int8_t offset;",
|
||||||
|
"",
|
||||||
|
"enum direction {",
|
||||||
|
*(f"{d}," for d in directions),
|
||||||
|
"};",
|
||||||
|
"};",
|
||||||
|
]
|
||||||
|
|
||||||
def blockset_tileset(name: str):
|
def blockset_tileset(name: str):
|
||||||
tileset_index = parse.tileset_constants_list[name]
|
tileset_index = parse.tileset_constants_list[name]
|
||||||
tileset_header = parse.tileset_headers_list[tileset_index]
|
tileset_header = parse.tileset_headers_list[tileset_index]
|
||||||
@ -125,6 +145,25 @@ def tilesets():
|
|||||||
yield from blockset_tileset(name)
|
yield from blockset_tileset(name)
|
||||||
yield "};"
|
yield "};"
|
||||||
|
|
||||||
|
def connections(map_header):
|
||||||
|
cs = dict((c.name, c) for c in map_header.connections)
|
||||||
|
assert len(cs) == len(map_header.connections), map_header.connections
|
||||||
|
|
||||||
|
unconnected = Connection(
|
||||||
|
name = "__invalid",
|
||||||
|
map_name1 = "Unconnected",
|
||||||
|
map_name2 = "unconnected",
|
||||||
|
offset = 0,
|
||||||
|
)
|
||||||
|
|
||||||
|
for direction in directions: # already sorted
|
||||||
|
connection = cs.get(direction, unconnected)
|
||||||
|
|
||||||
|
yield f"[map_t::connection_t::{direction}] = {{"
|
||||||
|
yield f".map = map_t::{connection.map_name2.lower()},"
|
||||||
|
yield f".offset = {connection.offset},"
|
||||||
|
yield "},"
|
||||||
|
|
||||||
def map(map_header):
|
def map(map_header):
|
||||||
block_path = parse.maps_blocks_list[map_header.blocks()]
|
block_path = parse.maps_blocks_list[map_header.blocks()]
|
||||||
map_constant = parse.map_constants_list[map_header.name2]
|
map_constant = parse.map_constants_list[map_header.name2]
|
||||||
@ -136,6 +175,9 @@ def map(map_header):
|
|||||||
f".tileset = tileset_t::{map_header.tileset.lower()},",
|
f".tileset = tileset_t::{map_header.tileset.lower()},",
|
||||||
f".width = {map_constant.width},",
|
f".width = {map_constant.width},",
|
||||||
f".height = {map_constant.height},",
|
f".height = {map_constant.height},",
|
||||||
|
".connections = {",
|
||||||
|
*connections(map_header),
|
||||||
|
"},",
|
||||||
"},",
|
"},",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
from pprint import pprint
|
from pprint import pprint
|
||||||
from parse import parse
|
from parse import parse
|
||||||
|
|
||||||
for i in parse.map_headers:
|
for i in parse.map_objects_list.items():
|
||||||
pprint(i)
|
pprint(i)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user