pokemon/tools/generate/map_objects.py

115 lines
3.8 KiB
Python

from parse import parse
from generate.generate import renderer
from generate.maps import sorted_map_headers
from generate.sprites import sprite_name
from generate.text_pointers import sorted_text_pointers
def warp_event(ev):
x, y = ev.position
return [
"{",
f".position = {{ {x}, {y} }},",
".destination = {",
f".map = map_t::{ev.destination_map.lower()},",
f".warp_index = {ev.destination_warp_index},",
"}",
"},",
]
def bg_event(ev, sorted_text_constants):
x, y = ev.position
sign_id = '0xff' if ev.sign_id not in sorted_text_constants else ev.sign_id
return [
"{",
f".position = {{ {x}, {y} }},",
f".sign_id = {sign_id},",
"},",
]
def range_or_direction(ev):
direction = ev.range_or_direction.lower()
if direction == '0':
direction = 'any_dir' # hack?
yield f".range_or_direction = object_event_t::range_or_direction::{direction},"
def object_event(ev, sorted_text_constants):
x, y = ev.position
text_id = '0xff' if ev.text_id not in sorted_text_constants else ev.text_id
return [
"{",
f".type = object_event_t::type::{ev.type},",
f".position = {{ {x}, {y} }},",
f".sprite_id = spritesheet_t::{sprite_name(ev.sprite_id)},",
f".movement = object_event_t::movement::{ev.movement.lower()},",
*(range_or_direction(ev)),
f".text_id = {text_id},",
".trainer = { 0 },", # fixme
"},",
]
def warp_events(map_name, obj):
yield f"const warp_event_t {map_name}_warp_events[] = {{"
for ev in obj.warp_events:
yield from warp_event(ev)
yield "};"
def bg_events(map_name, obj, sorted_text_constants):
yield f"const bg_event_t {map_name}_bg_events[] = {{"
for ev in obj.bg_events:
yield from bg_event(ev, sorted_text_constants)
yield "};"
def object_events(map_name, obj, sorted_text_constants):
yield f"const object_event_t {map_name}_object_events[] = {{"
for ev in obj.object_events:
yield from object_event(ev, sorted_text_constants)
yield "};"
def object(map_name, obj):
return [
f"[map_t::{map_name}] = {{",
f".border_block = {obj.border_block},",
f".warp_length = {len(obj.warp_events)},",
f".bg_length = {len(obj.bg_events)},",
f".object_length = {len(obj.object_events)},",
f".warp_events = &{map_name}_warp_events[0],",
f".bg_events = &{map_name}_bg_events[0],",
f".object_events = &{map_name}_object_events[0],",
"},",
]
def includes_source():
yield '#include <cstdint>'
yield ""
yield '#include "../map_objects.hpp"'
yield '#include "text_pointers.hpp"'
yield '#include "maps.hpp"'
yield ""
def map_objects():
map_headers = list(sorted_map_headers())
scripts_list = parse.scripts_list()
for map_header in map_headers:
map_name = map_header.name2.lower()
map_objects = parse.map_objects_list()[map_header.object()]
# fixme: hack due to viridanmart
text_pointers = scripts_list.get(map_header.text_pointers(), ({}, {}))
sorted_text_constants = {k for k, _ in sorted_text_pointers(*text_pointers)}
yield from warp_events(map_name, map_objects)
yield from bg_events(map_name, map_objects, sorted_text_constants)
yield from object_events(map_name, map_objects, sorted_text_constants)
yield "const object_t map_objects[] = {"
for map_header in map_headers:
map_name = map_header.name2.lower()
map_objects = parse.map_objects_list()[map_header.object()]
yield from object(map_name, map_objects)
yield "};"
def generate_source():
render, out = renderer()
render(includes_source())
render(map_objects())
return out