summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGriffinR <griffin.g.richards@gmail.com>2021-01-19 02:17:21 -0500
committerGitHub <noreply@github.com>2021-01-19 02:17:21 -0500
commit419c897292dbfbc4f6d43880eb94597987e09e2c (patch)
tree36094eda149165d0e4dad545924b95f582d83838
parentac62e8e563f9e74493a394a21c1bd8fa1570b184 (diff)
parenta52d6e43794e0fa773f10dcebb820bd2bca8fc40 (diff)
Merge pull request #380 from GriffinRichards/sync-scaninc
Sync tools with pokeemerald
-rw-r--r--.gitignore1
-rw-r--r--Makefile39
-rw-r--r--include/constants/layouts.h4
-rw-r--r--include/constants/map_groups.h4
-rw-r--r--ld_script.txt8
-rw-r--r--ld_script_modern.txt2
-rw-r--r--src/crt0.s (renamed from asm/crt0.s)0
-rw-r--r--src/libagbsyscall.s (renamed from asm/libagbsyscall.s)0
-rw-r--r--src/libgcnmultiboot.s (renamed from asm/libgcnmultiboot.s)0
-rw-r--r--src/m4a_1.s (renamed from asm/m4a_1.s)0
-rw-r--r--sym_bss.txt2
-rw-r--r--tools/gbagfx/Makefile2
-rw-r--r--tools/gbagfx/convert_png.c2
-rw-r--r--tools/gbagfx/gfx.c163
-rw-r--r--tools/gbagfx/gfx.h17
-rw-r--r--tools/gbagfx/main.c36
-rw-r--r--tools/gbagfx/options.h4
-rw-r--r--tools/mapjson/mapjson.cpp28
-rw-r--r--tools/preproc/asm_file.cpp6
-rw-r--r--tools/scaninc/scaninc.cpp19
-rw-r--r--tools/scaninc/source_file.cpp5
-rw-r--r--tools/scaninc/source_file.h1
22 files changed, 319 insertions, 24 deletions
diff --git a/.gitignore b/.gitignore
index 50910379c..af2644ade 100644
--- a/.gitignore
+++ b/.gitignore
@@ -44,7 +44,6 @@ ld_script_ruby.txt
ld_script_sapphire.txt
sound/**/*.bin
sound/songs/midi/*.s
-src/*.s
src/data/items.h
src/data/wild_encounters.h
tags
diff --git a/Makefile b/Makefile
index e7a918189..37241192a 100644
--- a/Makefile
+++ b/Makefile
@@ -117,9 +117,15 @@ endif
C_SRCS := $(wildcard $(C_SUBDIR)/*.c)
C_OBJS := $(patsubst $(C_SUBDIR)/%.c,$(C_BUILDDIR)/%.o,$(C_SRCS))
+C_ASM_SRCS += $(wildcard $(C_SUBDIR)/*.s $(C_SUBDIR)/*/*.s $(C_SUBDIR)/*/*/*.s)
+C_ASM_OBJS := $(patsubst $(C_SUBDIR)/%.s,$(C_BUILDDIR)/%.o,$(C_ASM_SRCS))
+
ASM_SRCS := $(wildcard $(ASM_SUBDIR)/*.s)
ASM_OBJS := $(patsubst $(ASM_SUBDIR)/%.s,$(ASM_BUILDDIR)/%.o,$(ASM_SRCS))
+# get all the data/*.s files EXCEPT the ones with specific rules
+REGULAR_DATA_ASM_SRCS := $(filter-out $(DATA_ASM_SUBDIR)/maps.s $(DATA_ASM_SUBDIR)/map_events.s, $(wildcard $(DATA_ASM_SUBDIR)/*.s))
+
DATA_ASM_SRCS := $(wildcard $(DATA_ASM_SUBDIR)/*.s)
DATA_ASM_OBJS := $(patsubst $(DATA_ASM_SUBDIR)/%.s,$(DATA_ASM_BUILDDIR)/%.o,$(DATA_ASM_SRCS))
@@ -129,7 +135,7 @@ SONG_OBJS := $(patsubst $(SONG_SUBDIR)/%.s,$(SONG_BUILDDIR)/%.o,$(SONG_SRCS))
MID_SRCS := $(wildcard $(MID_SUBDIR)/*.mid)
MID_OBJS := $(patsubst $(MID_SUBDIR)/%.mid,$(MID_BUILDDIR)/%.o,$(MID_SRCS))
-OBJS := $(C_OBJS) $(ASM_OBJS) $(DATA_ASM_OBJS) $(SONG_OBJS) $(MID_OBJS)
+OBJS := $(C_OBJS) $(C_ASM_OBJS) $(ASM_OBJS) $(DATA_ASM_OBJS) $(SONG_OBJS) $(MID_OBJS)
OBJS_REL := $(patsubst $(OBJ_DIR)/%,%,$(OBJS))
TOOLDIRS := $(filter-out tools/agbcc tools/binutils tools/analyze_source,$(wildcard tools/*))
@@ -231,7 +237,7 @@ endif
ifeq ($(NODEP),1)
$(C_BUILDDIR)/%.o: c_dep :=
else
-$(C_BUILDDIR)/%.o: c_dep = $(shell $(SCANINC) -I include $(C_SUBDIR)/$*.c)
+$(C_BUILDDIR)/%.o: c_dep = $(shell [[ -f $(C_SUBDIR)/$*.c ]] && $(SCANINC) -I include -I tools/agbcc/include $(C_SUBDIR)/$*.c)
endif
$(C_BUILDDIR)/%.o : $(C_SUBDIR)/%.c $$(c_dep)
@@ -241,12 +247,12 @@ $(C_BUILDDIR)/%.o : $(C_SUBDIR)/%.c $$(c_dep)
$(AS) $(ASFLAGS) -o $@ $(C_BUILDDIR)/$*.s
ifeq ($(NODEP),1)
-$(ASM_BUILDDIR)/%.o: asm_dep :=
+$(C_BUILDDIR)/%.o: c_asm_dep :=
else
-$(ASM_BUILDDIR)/%.o: asm_dep = $(shell $(SCANINC) -I . $(ASM_SUBDIR)/$*.s)
+$(C_BUILDDIR)/%.o: c_asm_dep = $(shell [[ -f $(C_SUBDIR)/$*.s ]] && $(SCANINC) -I "" $(C_SUBDIR)/$*.s)
endif
-$(ASM_BUILDDIR)/%.o: $(ASM_SUBDIR)/%.s $$(asm_dep)
+$(C_BUILDDIR)/%.o: $(C_SUBDIR)/%.s $$(c_asm_dep)
$(AS) $(ASFLAGS) -o $@ $<
ifeq ($(NODEP),1)
@@ -260,8 +266,27 @@ berry_fix:
berry_fix/berry_fix.gba: berry_fix
-$(DATA_ASM_BUILDDIR)/%.o: $(DATA_ASM_SUBDIR)/%.s $$(data_dep)
- $(PREPROC) $< charmap.txt | $(CPP) -I include -nostdinc -undef -Wno-unicode - | $(AS) $(ASFLAGS) -o $@
+ifeq ($(NODEP),1)
+$(ASM_BUILDDIR)/%.o: $(ASM_SUBDIR)/%.s
+ $(AS) $(ASFLAGS) -o $@ $<
+else
+define ASM_DEP
+$1: $2 $$(shell $(SCANINC) -I include -I "" $2)
+ $$(AS) $$(ASFLAGS) -o $$@ $$<
+endef
+$(foreach src, $(ASM_SRCS), $(eval $(call ASM_DEP,$(patsubst $(ASM_SUBDIR)/%.s,$(ASM_BUILDDIR)/%.o, $(src)),$(src))))
+endif
+
+ifeq ($(NODEP),1)
+$(DATA_ASM_BUILDDIR)/%.o: $(DATA_ASM_SUBDIR)/%.s
+ $(PREPROC) $< charmap.txt | $(CPP) -I include | $(AS) $(ASFLAGS) -o $@
+else
+define DATA_ASM_DEP
+$1: $2 $$(shell $(SCANINC) -I include -I "" $2)
+ $$(PREPROC) $$< charmap.txt | $$(CPP) -I include | $$(AS) $$(ASFLAGS) -o $$@
+endef
+$(foreach src, $(REGULAR_DATA_ASM_SRCS), $(eval $(call DATA_ASM_DEP,$(patsubst $(DATA_ASM_SUBDIR)/%.s,$(DATA_ASM_BUILDDIR)/%.o, $(src)),$(src))))
+endif
$(SONG_BUILDDIR)/%.o: $(SONG_SUBDIR)/%.s
$(AS) $(ASFLAGS) -I sound -o $@ $<
diff --git a/include/constants/layouts.h b/include/constants/layouts.h
index 431ca198a..01a452970 100644
--- a/include/constants/layouts.h
+++ b/include/constants/layouts.h
@@ -1,6 +1,10 @@
#ifndef GUARD_CONSTANTS_LAYOUTS_H
#define GUARD_CONSTANTS_LAYOUTS_H
+//
+// DO NOT MODIFY THIS FILE! It is auto-generated from data/layouts/layouts.json
+//
+
#define LAYOUT_PALLET_TOWN_PLAYERS_HOUSE_1F 1
#define LAYOUT_PALLET_TOWN_PLAYERS_HOUSE_2F 2
#define LAYOUT_PALLET_TOWN_GARYS_HOUSE 3
diff --git a/include/constants/map_groups.h b/include/constants/map_groups.h
index 27e74b337..b087b2c33 100644
--- a/include/constants/map_groups.h
+++ b/include/constants/map_groups.h
@@ -1,6 +1,10 @@
#ifndef GUARD_CONSTANTS_MAP_GROUPS_H
#define GUARD_CONSTANTS_MAP_GROUPS_H
+//
+// DO NOT MODIFY THIS FILE! It is auto-generated from data/maps/map_groups.json
+//
+
// Map Group 0
#define MAP_BATTLE_COLOSSEUM_2P (0 | (0 << 8))
#define MAP_TRADE_CENTER (1 | (0 << 8))
diff --git a/ld_script.txt b/ld_script.txt
index d22e7459a..2c599535d 100644
--- a/ld_script.txt
+++ b/ld_script.txt
@@ -44,7 +44,7 @@ SECTIONS {
.text :
ALIGN(4)
{
- asm/crt0.o(.text);
+ src/crt0.o(.text);
src/main.o(.text);
src/gpu_regs.o(.text);
src/dma3_manager.o(.text);
@@ -331,8 +331,8 @@ SECTIONS {
lib_text :
ALIGN(4)
{
- asm/libgcnmultiboot.o(.text);
- asm/m4a_1.o(.text);
+ src/libgcnmultiboot.o(.text);
+ src/m4a_1.o(.text);
src/m4a.o(.text);
src/agb_flash.o(.text);
src/agb_flash_1m.o(.text);
@@ -343,7 +343,7 @@ SECTIONS {
src/librfu_rfu.o(.text);
src/librfu_sio32id.o(.text);
src/isagbprn.o(.text);
- asm/libagbsyscall.o(.text);
+ src/libagbsyscall.o(.text);
*libgcc.a:_call_via_rX.o(.text);
*libgcc.a:_divdi3.o(.text);
*libgcc.a:_divsi3.o(.text);
diff --git a/ld_script_modern.txt b/ld_script_modern.txt
index 992706e1b..588685112 100644
--- a/ld_script_modern.txt
+++ b/ld_script_modern.txt
@@ -37,7 +37,7 @@ SECTIONS {
.text :
ALIGN(4)
{
- asm/crt0.o(.text);
+ src/crt0.o(.text);
*(.text*);
} =0
diff --git a/asm/crt0.s b/src/crt0.s
index 0d891141e..0d891141e 100644
--- a/asm/crt0.s
+++ b/src/crt0.s
diff --git a/asm/libagbsyscall.s b/src/libagbsyscall.s
index 360a43e67..360a43e67 100644
--- a/asm/libagbsyscall.s
+++ b/src/libagbsyscall.s
diff --git a/asm/libgcnmultiboot.s b/src/libgcnmultiboot.s
index 91bc1890c..91bc1890c 100644
--- a/asm/libgcnmultiboot.s
+++ b/src/libgcnmultiboot.s
diff --git a/asm/m4a_1.s b/src/m4a_1.s
index 7cb36580f..7cb36580f 100644
--- a/asm/m4a_1.s
+++ b/src/m4a_1.s
diff --git a/sym_bss.txt b/sym_bss.txt
index 3c3e98c58..6fdd7d3fd 100644
--- a/sym_bss.txt
+++ b/sym_bss.txt
@@ -57,7 +57,7 @@
.align 3
.include "src/digit_obj_util.o"
.align 3
- .include "asm/m4a_1.o"
+ .include "src/m4a_1.o"
.align 3
.include "src/agb_flash.o"
.align 3
diff --git a/tools/gbagfx/Makefile b/tools/gbagfx/Makefile
index 885d5f18a..0edb1579f 100644
--- a/tools/gbagfx/Makefile
+++ b/tools/gbagfx/Makefile
@@ -1,6 +1,6 @@
CC = gcc
-CFLAGS = -Wall -Wextra -Wno-sign-compare -std=gnu11 -O3 -flto -DPNG_SKIP_SETJMP_CHECK
+CFLAGS = -Wall -Wextra -Werror -Wno-sign-compare -std=c11 -O3 -flto -DPNG_SKIP_SETJMP_CHECK
LIBS = -lpng -lz
diff --git a/tools/gbagfx/convert_png.c b/tools/gbagfx/convert_png.c
index cdfa39a7a..4f1b39e6d 100644
--- a/tools/gbagfx/convert_png.c
+++ b/tools/gbagfx/convert_png.c
@@ -125,7 +125,7 @@ void ReadPng(char *path, struct Image *image)
free(row_pointers);
fclose(fp);
- if (bit_depth != image->bitDepth)
+ if (bit_depth != image->bitDepth && image->tilemap.data.affine == NULL)
{
unsigned char *src = image->pixels;
diff --git a/tools/gbagfx/gfx.c b/tools/gbagfx/gfx.c
index f927deed9..b28bb4021 100644
--- a/tools/gbagfx/gfx.c
+++ b/tools/gbagfx/gfx.c
@@ -4,6 +4,7 @@
#include <stdlib.h>
#include <stdint.h>
#include <stdbool.h>
+#include <string.h>
#include "global.h"
#include "gfx.h"
#include "util.h"
@@ -203,6 +204,147 @@ static void ConvertToTiles8Bpp(unsigned char *src, unsigned char *dest, int numT
}
}
+static void DecodeAffineTilemap(unsigned char *input, unsigned char *output, unsigned char *tilemap, int tileSize, int numTiles)
+{
+ for (int i = 0; i < numTiles; i++)
+ {
+ memcpy(&output[i * tileSize], &input[tilemap[i] * tileSize], tileSize);
+ }
+}
+
+#define REVERSE_BIT_ORDER(x) ({ \
+ ((((x) >> 7) & 1) << 0) \
+ | ((((x) >> 6) & 1) << 1) \
+ | ((((x) >> 5) & 1) << 2) \
+ | ((((x) >> 4) & 1) << 3) \
+ | ((((x) >> 3) & 1) << 4) \
+ | ((((x) >> 2) & 1) << 5) \
+ | ((((x) >> 1) & 1) << 6) \
+ | ((((x) >> 0) & 1) << 7); \
+})
+
+#define SWAP_BYTES(a, b) ({ \
+ unsigned char tmp = *(a); \
+ *(a) = *(b); \
+ *(b) = tmp; \
+})
+
+#define NSWAP(x) ({ (((x) >> 4) & 0xF) | (((x) << 4) & 0xF0); })
+
+#define SWAP_NYBBLES(a, b) ({ \
+ unsigned char tmp = NSWAP(*(a)); \
+ *(a) = NSWAP(*(b)); \
+ *(b) = tmp; \
+})
+
+static void VflipTile(unsigned char * tile, int bitDepth)
+{
+ int i;
+ switch (bitDepth)
+ {
+ case 1:
+ SWAP_BYTES(&tile[0], &tile[7]);
+ SWAP_BYTES(&tile[1], &tile[6]);
+ SWAP_BYTES(&tile[2], &tile[5]);
+ SWAP_BYTES(&tile[3], &tile[4]);
+ break;
+ case 4:
+ for (i = 0; i < 4; i++)
+ {
+ SWAP_BYTES(&tile[i + 0], &tile[i + 28]);
+ SWAP_BYTES(&tile[i + 4], &tile[i + 24]);
+ SWAP_BYTES(&tile[i + 8], &tile[i + 20]);
+ SWAP_BYTES(&tile[i + 12], &tile[i + 16]);
+ }
+ break;
+ case 8:
+ for (i = 0; i < 8; i++)
+ {
+ SWAP_BYTES(&tile[i + 0], &tile[i + 56]);
+ SWAP_BYTES(&tile[i + 8], &tile[i + 48]);
+ SWAP_BYTES(&tile[i + 16], &tile[i + 40]);
+ SWAP_BYTES(&tile[i + 24], &tile[i + 32]);
+ }
+ break;
+ }
+}
+
+static void HflipTile(unsigned char * tile, int bitDepth)
+{
+ int i;
+ switch (bitDepth)
+ {
+ case 1:
+ for (i = 0; i < 8; i++)
+ tile[i] = REVERSE_BIT_ORDER(tile[i]);
+ break;
+ case 4:
+ for (i = 0; i < 8; i++)
+ {
+ SWAP_NYBBLES(&tile[4 * i + 0], &tile[4 * i + 3]);
+ SWAP_NYBBLES(&tile[4 * i + 1], &tile[4 * i + 2]);
+ }
+ break;
+ case 8:
+ for (i = 0; i < 8; i++)
+ {
+ SWAP_BYTES(&tile[8 * i + 0], &tile[8 * i + 7]);
+ SWAP_BYTES(&tile[8 * i + 1], &tile[8 * i + 6]);
+ SWAP_BYTES(&tile[8 * i + 2], &tile[8 * i + 5]);
+ SWAP_BYTES(&tile[8 * i + 3], &tile[8 * i + 4]);
+ }
+ break;
+ }
+}
+
+static void DecodeNonAffineTilemap(unsigned char *input, unsigned char *output, struct NonAffineTile *tilemap, int tileSize, int outTileSize, int bitDepth, int numTiles)
+{
+ unsigned char * in_tile;
+ unsigned char * out_tile = output;
+ int effectiveBitDepth = tileSize == outTileSize ? bitDepth : 8;
+ for (int i = 0; i < numTiles; i++)
+ {
+ in_tile = &input[tilemap[i].index * tileSize];
+ if (tileSize == outTileSize)
+ memcpy(out_tile, in_tile, tileSize);
+ else
+ {
+ for (int j = 0; j < 64; j++)
+ {
+ int shift = (j & 1) * 4;
+ out_tile[j] = (in_tile[j / 2] & (0xF << shift)) >> shift;
+ }
+ }
+ if (tilemap[i].hflip)
+ HflipTile(out_tile, effectiveBitDepth);
+ if (tilemap[i].vflip)
+ VflipTile(out_tile, effectiveBitDepth);
+ if (bitDepth == 4 && effectiveBitDepth == 8)
+ {
+ for (int j = 0; j < 64; j++)
+ {
+ out_tile[j] &= 0xF;
+ out_tile[j] |= (15 - tilemap[i].palno) << 4;
+ }
+ }
+ out_tile += outTileSize;
+ }
+}
+
+static unsigned char *DecodeTilemap(unsigned char *tiles, struct Tilemap *tilemap, int *numTiles_p, bool isAffine, int tileSize, int outTileSize, int bitDepth)
+{
+ int mapTileSize = isAffine ? 1 : 2;
+ int numTiles = tilemap->size / mapTileSize;
+ unsigned char *decoded = calloc(numTiles, outTileSize);
+ if (isAffine)
+ DecodeAffineTilemap(tiles, decoded, tilemap->data.affine, tileSize, numTiles);
+ else
+ DecodeNonAffineTilemap(tiles, decoded, tilemap->data.non_affine, tileSize, outTileSize, bitDepth, numTiles);
+ free(tiles);
+ *numTiles_p = numTiles;
+ return decoded;
+}
+
void ReadImage(char *path, int tilesWidth, int bitDepth, int metatileWidth, int metatileHeight, struct Image *image, bool invertColors)
{
int tileSize = bitDepth * 8;
@@ -211,6 +353,16 @@ void ReadImage(char *path, int tilesWidth, int bitDepth, int metatileWidth, int
unsigned char *buffer = ReadWholeFile(path, &fileSize);
int numTiles = fileSize / tileSize;
+ if (image->tilemap.data.affine != NULL)
+ {
+ int outTileSize = (bitDepth == 4 && image->palette.numColors > 16) ? 64 : tileSize;
+ buffer = DecodeTilemap(buffer, &image->tilemap, &numTiles, image->isAffine, tileSize, outTileSize, bitDepth);
+ if (outTileSize == 64)
+ {
+ tileSize = 64;
+ image->bitDepth = bitDepth = 8;
+ }
+ }
int tilesHeight = (numTiles + tilesWidth - 1) / tilesWidth;
@@ -298,6 +450,11 @@ void WriteImage(char *path, int numTiles, int bitDepth, int metatileWidth, int m
void FreeImage(struct Image *image)
{
+ if (image->tilemap.data.affine != NULL)
+ {
+ free(image->tilemap.data.affine);
+ image->tilemap.data.affine = NULL;
+ }
free(image->pixels);
image->pixels = NULL;
}
@@ -318,6 +475,12 @@ void ReadGbaPalette(char *path, struct Palette *palette)
palette->colors[i].green = UPCONVERT_BIT_DEPTH(GET_GBA_PAL_GREEN(paletteEntry));
palette->colors[i].blue = UPCONVERT_BIT_DEPTH(GET_GBA_PAL_BLUE(paletteEntry));
}
+ // png can only accept 16 or 256 colors, so fill the remainder with black
+ if (palette->numColors > 16)
+ {
+ memset(&palette->colors[palette->numColors], 0, (256 - palette->numColors) * sizeof(struct Color));
+ palette->numColors = 256;
+ }
free(data);
}
diff --git a/tools/gbagfx/gfx.h b/tools/gbagfx/gfx.h
index 5355ced85..edb9e62c4 100644
--- a/tools/gbagfx/gfx.h
+++ b/tools/gbagfx/gfx.h
@@ -17,6 +17,21 @@ struct Palette {
int numColors;
};
+struct NonAffineTile {
+ unsigned short index:10;
+ unsigned short hflip:1;
+ unsigned short vflip:1;
+ unsigned short palno:4;
+} __attribute__((packed));
+
+struct Tilemap {
+ union {
+ struct NonAffineTile *non_affine;
+ unsigned char *affine;
+ } data;
+ int size;
+};
+
struct Image {
int width;
int height;
@@ -25,6 +40,8 @@ struct Image {
bool hasPalette;
struct Palette palette;
bool hasTransparency;
+ struct Tilemap tilemap;
+ bool isAffine;
};
void ReadImage(char *path, int tilesWidth, int bitDepth, int metatileWidth, int metatileHeight, struct Image *image, bool invertColors);
diff --git a/tools/gbagfx/main.c b/tools/gbagfx/main.c
index 957918505..cf3031696 100644
--- a/tools/gbagfx/main.c
+++ b/tools/gbagfx/main.c
@@ -45,6 +45,20 @@ void ConvertGbaToPng(char *inputPath, char *outputPath, struct GbaToPngOptions *
image.hasPalette = false;
}
+ if (options->tilemapFilePath != NULL)
+ {
+ int fileSize;
+ image.tilemap.data.affine = ReadWholeFile(options->tilemapFilePath, &fileSize);
+ if (options->isAffineMap && options->bitDepth != 8)
+ FATAL_ERROR("affine maps are necessarily 8bpp\n");
+ image.isAffine = options->isAffineMap;
+ image.tilemap.size = fileSize;
+ }
+ else
+ {
+ image.tilemap.data.affine = NULL;
+ }
+
ReadImage(inputPath, options->width, options->bitDepth, options->metatileWidth, options->metatileHeight, &image, !image.hasPalette);
image.hasTransparency = options->hasTransparency;
@@ -59,6 +73,7 @@ void ConvertPngToGba(char *inputPath, char *outputPath, struct PngToGbaOptions *
struct Image image;
image.bitDepth = options->bitDepth;
+ image.tilemap.data.affine = NULL; // initialize to NULL to avoid issues in FreeImage
ReadPng(inputPath, &image);
@@ -77,6 +92,8 @@ void HandleGbaToPngCommand(char *inputPath, char *outputPath, int argc, char **a
options.width = 1;
options.metatileWidth = 1;
options.metatileHeight = 1;
+ options.tilemapFilePath = NULL;
+ options.isAffineMap = false;
for (int i = 3; i < argc; i++)
{
@@ -134,6 +151,17 @@ void HandleGbaToPngCommand(char *inputPath, char *outputPath, int argc, char **a
if (options.metatileHeight < 1)
FATAL_ERROR("metatile height must be positive.\n");
}
+ else if (strcmp(option, "-tilemap") == 0)
+ {
+ if (i + 1 >= argc)
+ FATAL_ERROR("No tilemap value following \"-tilemap\".\n");
+ i++;
+ options.tilemapFilePath = argv[i];
+ }
+ else if (strcmp(option, "-affine") == 0)
+ {
+ options.isAffineMap = true;
+ }
else
{
FATAL_ERROR("Unrecognized option \"%s\".\n", option);
@@ -155,6 +183,8 @@ void HandlePngToGbaCommand(char *inputPath, char *outputPath, int argc, char **a
options.bitDepth = bitDepth;
options.metatileWidth = 1;
options.metatileHeight = 1;
+ options.tilemapFilePath = NULL;
+ options.isAffineMap = false;
for (int i = 3; i < argc; i++)
{
@@ -272,6 +302,7 @@ void HandleJascToGbaPaletteCommand(char *inputPath, char *outputPath, int argc,
void HandleLatinFontToPngCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED)
{
struct Image image;
+ image.tilemap.data.affine = NULL; // initialize to NULL to avoid issues in FreeImage
ReadLatinFont(inputPath, &image);
WritePng(outputPath, &image);
@@ -282,6 +313,7 @@ void HandleLatinFontToPngCommand(char *inputPath, char *outputPath, int argc UNU
void HandlePngToLatinFontCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED)
{
struct Image image;
+ image.tilemap.data.affine = NULL; // initialize to NULL to avoid issues in FreeImage
image.bitDepth = 2;
@@ -294,6 +326,7 @@ void HandlePngToLatinFontCommand(char *inputPath, char *outputPath, int argc UNU
void HandleHalfwidthJapaneseFontToPngCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED)
{
struct Image image;
+ image.tilemap.data.affine = NULL; // initialize to NULL to avoid issues in FreeImage
ReadHalfwidthJapaneseFont(inputPath, &image);
WritePng(outputPath, &image);
@@ -304,6 +337,7 @@ void HandleHalfwidthJapaneseFontToPngCommand(char *inputPath, char *outputPath,
void HandlePngToHalfwidthJapaneseFontCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED)
{
struct Image image;
+ image.tilemap.data.affine = NULL; // initialize to NULL to avoid issues in FreeImage
image.bitDepth = 2;
@@ -316,6 +350,7 @@ void HandlePngToHalfwidthJapaneseFontCommand(char *inputPath, char *outputPath,
void HandleFullwidthJapaneseFontToPngCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED)
{
struct Image image;
+ image.tilemap.data.affine = NULL; // initialize to NULL to avoid issues in FreeImage
ReadFullwidthJapaneseFont(inputPath, &image);
WritePng(outputPath, &image);
@@ -326,6 +361,7 @@ void HandleFullwidthJapaneseFontToPngCommand(char *inputPath, char *outputPath,
void HandlePngToFullwidthJapaneseFontCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED)
{
struct Image image;
+ image.tilemap.data.affine = NULL; // initialize to NULL to avoid issues in FreeImage
image.bitDepth = 2;
diff --git a/tools/gbagfx/options.h b/tools/gbagfx/options.h
index 2ff3967a4..3b038f572 100644
--- a/tools/gbagfx/options.h
+++ b/tools/gbagfx/options.h
@@ -12,6 +12,8 @@ struct GbaToPngOptions {
int width;
int metatileWidth;
int metatileHeight;
+ char *tilemapFilePath;
+ bool isAffineMap;
};
struct PngToGbaOptions {
@@ -19,6 +21,8 @@ struct PngToGbaOptions {
int bitDepth;
int metatileWidth;
int metatileHeight;
+ char *tilemapFilePath;
+ bool isAffineMap;
};
#endif // OPTIONS_H
diff --git a/tools/mapjson/mapjson.cpp b/tools/mapjson/mapjson.cpp
index 0302ee61a..44afcaf22 100644
--- a/tools/mapjson/mapjson.cpp
+++ b/tools/mapjson/mapjson.cpp
@@ -133,6 +133,10 @@ string generate_map_connections_text(Json map_data) {
ostringstream text;
+ text << "@\n@ DO NOT MODIFY THIS FILE! It is auto-generated from data/maps/"
+ << map_data["name"].string_value()
+ << "/map.json\n@\n\n";
+
text << map_data["name"].string_value() << "_MapConnectionsList::\n";
for (auto &connection : map_data["connections"].array_items()) {
@@ -155,6 +159,10 @@ string generate_map_events_text(Json map_data) {
ostringstream text;
+ text << "@\n@ DO NOT MODIFY THIS FILE! It is auto-generated from data/maps/"
+ << map_data["name"].string_value()
+ << "/map.json\n@\n\n";
+
string objects_label, warps_label, coords_label, bgs_label;
if (map_data["object_events"].array_items().size() > 0) {
@@ -265,6 +273,10 @@ string generate_map_events_text(Json map_data) {
string generate_firered_map_events_text(Json map_data) {
ostringstream text;
+ text << "@\n@ DO NOT MODIFY THIS FILE! It is auto-generated from data/maps/"
+ << map_data["name"].string_value()
+ << "/map.json\n@\n\n";
+
string objects_label, warps_label, coords_label, bgs_label;
if (map_data["object_events"].array_items().size() > 0) {
@@ -402,6 +414,8 @@ void process_map(string map_filepath, string layouts_filepath) {
string generate_groups_text(Json groups_data) {
ostringstream text;
+ text << "@\n@ DO NOT MODIFY THIS FILE! It is auto-generated from data/maps/map_groups.json\n@\n\n";
+
for (auto &key : groups_data["group_order"].array_items()) {
string group = key.string_value();
text << group << "::\n";
@@ -444,6 +458,8 @@ string generate_connections_text(Json groups_data) {
ostringstream text;
+ text << "@\n@ DO NOT MODIFY THIS FILE! It is auto-generated from data/maps/map_groups.json\n@\n\n";
+
for (Json map_name : map_names)
text << "\t.include \"data/maps/" << map_name.string_value() << "/connections.inc\"\n";
@@ -459,6 +475,8 @@ string generate_headers_text(Json groups_data) {
ostringstream text;
+ text << "@\n@ DO NOT MODIFY THIS FILE! It is auto-generated from data/maps/map_groups.json\n@\n\n";
+
for (string map_name : map_names)
text << "\t.include \"data/maps/" << map_name << "/header.inc\"\n";
@@ -474,6 +492,8 @@ string generate_events_text(Json groups_data) {
ostringstream text;
+ text << "@\n@ DO NOT MODIFY THIS FILE! It is auto-generated from data/maps/map_groups.json\n@\n\n";
+
for (string map_name : map_names)
text << "\t.include \"data/maps/" << map_name << "/events.inc\"\n";
@@ -489,6 +509,8 @@ string generate_map_constants_text(string groups_filepath, Json groups_data) {
text << "#ifndef GUARD_CONSTANTS_MAP_GROUPS_H\n"
<< "#define GUARD_CONSTANTS_MAP_GROUPS_H\n\n";
+ text << "//\n// DO NOT MODIFY THIS FILE! It is auto-generated from data/maps/map_groups.json\n//\n\n";
+
int group_num = 0;
for (auto &group : groups_data["group_order"].array_items()) {
@@ -547,6 +569,8 @@ void process_groups(string groups_filepath) {
string generate_layout_headers_text(Json layouts_data) {
ostringstream text;
+ text << "@\n@ DO NOT MODIFY THIS FILE! It is auto-generated from data/layouts/layouts.json\n@\n\n";
+
for (auto &layout : layouts_data["layouts"].array_items()) {
if (layout == Json::object()) continue;
string border_label = layout["name"].string_value() + "_Border";
@@ -579,6 +603,8 @@ string generate_layout_headers_text(Json layouts_data) {
string generate_layouts_table_text(Json layouts_data) {
ostringstream text;
+ text << "@\n@ DO NOT MODIFY THIS FILE! It is auto-generated from data/layouts/layouts.json\n@\n\n";
+
text << "\t.align 2\n"
<< layouts_data["layouts_table_label"].string_value() << "::\n";
@@ -597,6 +623,8 @@ string generate_layouts_constants_text(Json layouts_data) {
text << "#ifndef GUARD_CONSTANTS_LAYOUTS_H\n"
<< "#define GUARD_CONSTANTS_LAYOUTS_H\n\n";
+ text << "//\n// DO NOT MODIFY THIS FILE! It is auto-generated from data/layouts/layouts.json\n//\n\n";
+
int i = 1;
for (auto &layout : layouts_data["layouts"].array_items()) {
if (layout != Json::object())
diff --git a/tools/preproc/asm_file.cpp b/tools/preproc/asm_file.cpp
index 07921321d..7756cadc5 100644
--- a/tools/preproc/asm_file.cpp
+++ b/tools/preproc/asm_file.cpp
@@ -476,9 +476,11 @@ void AsmFile::ExpectEmptyRestOfLine()
m_lineStart = m_pos;
m_lineNum++;
}
- else if (m_buffer[m_pos] == '\r')
+ else if (m_buffer[m_pos] == '\r' && m_buffer[m_pos + 1] == '\n')
{
- RaiseError("only Unix-style LF newlines are supported");
+ m_pos += 2;
+ m_lineStart = m_pos;
+ m_lineNum++;
}
else
{
diff --git a/tools/scaninc/scaninc.cpp b/tools/scaninc/scaninc.cpp
index b95cbd033..dcb16c0e7 100644
--- a/tools/scaninc/scaninc.cpp
+++ b/tools/scaninc/scaninc.cpp
@@ -97,19 +97,26 @@ int main(int argc, char **argv)
}
for (auto include : file.GetIncludes())
{
+ bool exists = false;
+ std::string path("");
for (auto includeDir : includeDirs)
{
- std::string path(includeDir + include);
+ path = includeDir + include;
if (CanOpenFile(path))
{
- bool inserted = dependencies.insert(path).second;
- if (inserted)
- {
- filesToProcess.push(path);
- }
+ exists = true;
break;
}
}
+ if (!exists && (file.FileType() == SourceFileType::Asm || file.FileType() == SourceFileType::Inc))
+ {
+ path = include;
+ }
+ bool inserted = dependencies.insert(path).second;
+ if (inserted && exists)
+ {
+ filesToProcess.push(path);
+ }
}
includeDirs.pop_back();
}
diff --git a/tools/scaninc/source_file.cpp b/tools/scaninc/source_file.cpp
index f23ff6db6..df31282f8 100644
--- a/tools/scaninc/source_file.cpp
+++ b/tools/scaninc/source_file.cpp
@@ -89,6 +89,11 @@ SourceFile::SourceFile(std::string path)
}
}
+SourceFileType SourceFile::FileType()
+{
+ return m_file_type;
+}
+
SourceFile::~SourceFile()
{
if (m_file_type == SourceFileType::Cpp || m_file_type == SourceFileType::Header)
diff --git a/tools/scaninc/source_file.h b/tools/scaninc/source_file.h
index f7b6412bd..854b3f116 100644
--- a/tools/scaninc/source_file.h
+++ b/tools/scaninc/source_file.h
@@ -50,6 +50,7 @@ public:
const std::set<std::string>& GetIncbins();
const std::set<std::string>& GetIncludes();
std::string& GetSrcDir();
+ SourceFileType FileType();
private:
union InnerUnion {