diff --git a/Makefile b/Makefile index 531e1472..f836c6ee 100755 --- a/Makefile +++ b/Makefile @@ -12,6 +12,16 @@ VERSION := us_1.0 NON_MATCHING ?= 0 $(eval $(call validate-option,NON_MATCHING,0 1)) +COMPILE_ASSETS ?= 0 +$(eval $(call validate-option,COMPILE_ASSETS,0 1)) + +ifeq ($(COMPILE_ASSETS),1) + DUMMY != ./tools/dkr_assets_tool -c $(VERSION) ./assets >&2 || echo FAIL + ifeq ($(DUMMY),FAIL) + $(error Failed to compile assets) + endif +endif + ifeq ($(VERSION),us_1.0) DEFINES += VERSION_US_1_0=1 endif @@ -37,6 +47,7 @@ COLOR ?= 1 ifneq ($(MAKECMDGOALS),clean) ifneq ($(MAKECMDGOALS),clean_lib) ifneq ($(MAKECMDGOALS),clean_src) +ifneq ($(MAKECMDGOALS),distclean) ifneq ($(MAKECMDGOALS),reset) ################ Check if a baserom exists ################ @@ -75,7 +86,11 @@ RECOMP_PROJECT := ./tools/ido-static-recomp/ DUMMY != ls $(RECOMP_PROJECT)ido >/dev/null || echo FAIL ifeq ($(DUMMY),FAIL) - $(error Missing submodule ido-static-recomp. Please run 'git submodule update --init') +DUMMY != git submodule update --init +DUMMY != ls $(RECOMP_PROJECT)ido >/dev/null || echo FAIL +ifeq ($(DUMMY),FAIL) +$(error Missing submodule ido-static-recomp. Please run 'git submodule update --init') +endif endif # List of IDO tools required for the repo. @@ -110,6 +125,12 @@ endif endif endif endif +endif + +################################ + +# Removes the enums_cache if it exists in the build folde, incase someone modified the include/enums.h file. +DUMMY != rm -Rf build/enums_cache ################ Target Executable and Sources ############### @@ -175,8 +196,8 @@ FixPath = $(subst /,,$1) N64CRC = $(TOOLS_DIR)/n64crc FIXCHECKSUMS = python3 $(TOOLS_DIR)/python/calc_func_checksums.py $(VERSION) -TEXBUILDER = $(TOOLS_DIR)/dkr_texbuilder -COMPRESS = $(TOOLS_DIR)/dkr_decompressor -c +COMPRESS = $(TOOLS_DIR)/dkr_assets_tool -fc +BUILDER = $(TOOLS_DIR)/dkr_assets_tool -b $(VERSION) ./assets LIB_DIRS := lib/ ASM_DIRS := asm/ asm/boot/ asm/assets/ lib/asm/ lib/asm/non_decompilable @@ -208,8 +229,6 @@ CC_CHECK_CFLAGS += -Wno-builtin-declaration-mismatch -Wno-pointer-to-int-cast -W ####################### ASSETS ######################### -# TODO: Clean this up if possible - # All the asset subfolders to create in the build folder. ASSETS_DIRS := audio bin fonts ids levels levels/headers levels/models levels/names levels/objectMaps misc objects objects/animations objects/headers objects/models particles particles/behaviors particles/particles sprites text text/game text/menu textures textures/2d textures/3d tt_ghosts unknown_0 ucode @@ -218,100 +237,67 @@ UCODE_DIR = ucode/$(VERSION) ASSETS_COPY = cp -AUDIO_IN_DIR = $(ASSETS_DIR)/audio -AUDIO_OUT_DIR = $(BUILD_DIR)/audio -ALL_ASSETS_BUILT += $(patsubst $(AUDIO_IN_DIR)/%.bin,$(AUDIO_OUT_DIR)/%.bin,$(wildcard $(AUDIO_IN_DIR)/*.bin)) +# Makes name uppercase, and also replaces '/' with '_' for subfolders. +# Doing all those subst calls *should* be faster than `$(shell echo '$1' | tr '[:lower:]' '[:upper:]') +GET_VAR_NAME = $(subst /,_,$(subst a,A,$(subst b,B,$(subst c,C,$(subst d,D,$(subst e,E,$(subst f,F,$(subst g,G,$(subst h,H,$(subst i,I,$(subst j,J,$(subst k,K,$(subst l,L,$(subst m,M,$(subst n,N,$(subst o,O,$(subst p,P,$(subst q,Q,$(subst r,R,$(subst s,S,$(subst t,T,$(subst u,U,$(subst v,V,$(subst w,W,$(subst x,X,$(subst y,Y,$(subst z,Z,$1))))))))))))))))))))))))))) -BIN_IN_DIR = $(ASSETS_DIR)/bin -BIN_OUT_DIR = $(BUILD_DIR)/bin -ALL_ASSETS_BUILT += $(patsubst $(BIN_IN_DIR)/%.bin,$(BIN_OUT_DIR)/%.bin,$(wildcard $(BIN_IN_DIR)/*.bin)) +# $1 = Input/Output directories name +define DEFINE_BINARY_FILES +ALL_ASSETS_BUILT += $(patsubst $($1_IN_DIR)/%.bin,$($1_OUT_DIR)/%.bin,$(wildcard $($1_IN_DIR)/*.bin)) +endef +# $1 = Input/Output directories name +define DEFINE_COMPRESSED_BINARY_FILES +ALL_ASSETS_BUILT += $(patsubst $($1_IN_DIR)/%.cbin,$($1_OUT_DIR)/%.bin,$(wildcard $($1_IN_DIR)/*.cbin)) +endef +# $1 = Input/Output directories name +define DEFINE_JSON_FILES +ALL_ASSETS_BUILT += $(patsubst $($1_IN_DIR)/%.json,$($1_OUT_DIR)/%.bin,$(wildcard $($1_IN_DIR)/*.json)) +endef +# $1 = Input/Output directories name +define DEFINE_JSON_AND_BINARY_FILES +$(eval $(call DEFINE_JSON_FILES,$1)) +$(eval $(call DEFINE_BINARY_FILES,$1)) +endef -FONTS_IN_DIR = $(ASSETS_DIR)/fonts -FONTS_OUT_DIR = $(BUILD_DIR)/fonts -ALL_ASSETS_BUILT += $(patsubst $(FONTS_IN_DIR)/%.bin,$(FONTS_OUT_DIR)/%.bin,$(wildcard $(FONTS_IN_DIR)/*.bin)) +# $1 = folder name, $2 = define function +define DEFINE_SECTION_FILES +$(eval VAR_NAME := $(call GET_VAR_NAME,$1)) +$(eval $(VAR_NAME)_IN_DIR = $(ASSETS_DIR)/$1) +$(eval $(VAR_NAME)_OUT_DIR = $(BUILD_DIR)/$1) +$(eval $(call $2,$(VAR_NAME))) +endef -IDS_IN_DIR = $(ASSETS_DIR)/ids -IDS_OUT_DIR = $(BUILD_DIR)/ids -ALL_ASSETS_BUILT += $(patsubst $(IDS_IN_DIR)/%.bin,$(IDS_OUT_DIR)/%.bin,$(wildcard $(IDS_IN_DIR)/*.bin)) +###### Define section files into the ALL_ASSETS_BUILT variable ###### -LEVELS_IN_DIR = $(ASSETS_DIR)/levels -LEVELS_OUT_DIR = $(BUILD_DIR)/levels -LEVEL_HEADERS_IN_DIR = $(LEVELS_IN_DIR)/headers -LEVEL_HEADERS_OUT_DIR = $(LEVELS_OUT_DIR)/headers -LEVEL_MODELS_IN_DIR = $(LEVELS_IN_DIR)/models -LEVEL_MODELS_OUT_DIR = $(LEVELS_OUT_DIR)/models -LEVEL_NAMES_IN_DIR = $(LEVELS_IN_DIR)/names -LEVEL_NAMES_OUT_DIR = $(LEVELS_OUT_DIR)/names -LEVEL_OBJMAPS_IN_DIR = $(LEVELS_IN_DIR)/objectMaps -LEVEL_OBJMAPS_OUT_DIR = $(LEVELS_OUT_DIR)/objectMaps -ALL_ASSETS_BUILT += $(patsubst $(LEVEL_HEADERS_IN_DIR)/%.bin,$(LEVEL_HEADERS_OUT_DIR)/%.bin,$(wildcard $(LEVEL_HEADERS_IN_DIR)/*.bin)) -ALL_ASSETS_BUILT += $(patsubst $(LEVEL_MODELS_IN_DIR)/%.cbin,$(LEVEL_MODELS_OUT_DIR)/%.bin,$(wildcard $(LEVEL_MODELS_IN_DIR)/*.cbin)) -ALL_ASSETS_BUILT += $(patsubst $(LEVEL_NAMES_IN_DIR)/%.bin,$(LEVEL_NAMES_OUT_DIR)/%.bin,$(wildcard $(LEVEL_NAMES_IN_DIR)/*.bin)) -ALL_ASSETS_BUILT += $(patsubst $(LEVEL_OBJMAPS_IN_DIR)/%.cbin,$(LEVEL_OBJMAPS_OUT_DIR)/%.bin,$(wildcard $(LEVEL_OBJMAPS_IN_DIR)/*.cbin)) - -MISC_IN_DIR = $(ASSETS_DIR)/misc -MISC_OUT_DIR = $(BUILD_DIR)/misc -ALL_ASSETS_BUILT += $(patsubst $(MISC_IN_DIR)/%.bin,$(MISC_OUT_DIR)/%.bin,$(wildcard $(MISC_IN_DIR)/*.bin)) - -OBJECTS_IN_DIR = $(ASSETS_DIR)/objects -OBJECTS_OUT_DIR = $(BUILD_DIR)/objects -OBJECT_ANIMS_IN_DIR = $(OBJECTS_IN_DIR)/animations -OBJECT_ANIMS_OUT_DIR = $(OBJECTS_OUT_DIR)/animations -OBJECT_HEADERS_IN_DIR = $(OBJECTS_IN_DIR)/headers -OBJECT_HEADERS_OUT_DIR = $(OBJECTS_OUT_DIR)/headers -OBJECT_MODELS_IN_DIR = $(OBJECTS_IN_DIR)/models -OBJECT_MODELS_OUT_DIR = $(OBJECTS_OUT_DIR)/models -ALL_ASSETS_BUILT += $(patsubst $(OBJECTS_IN_DIR)/%.bin,$(OBJECTS_OUT_DIR)/%.bin,$(wildcard $(OBJECTS_IN_DIR)/*.bin)) -ALL_ASSETS_BUILT += $(patsubst $(OBJECT_ANIMS_IN_DIR)/%.cbin,$(OBJECT_ANIMS_OUT_DIR)/%.bin,$(wildcard $(OBJECT_ANIMS_IN_DIR)/*.cbin)) -ALL_ASSETS_BUILT += $(patsubst $(OBJECT_HEADERS_IN_DIR)/%.bin,$(OBJECT_HEADERS_OUT_DIR)/%.bin,$(wildcard $(OBJECT_HEADERS_IN_DIR)/*.bin)) -ALL_ASSETS_BUILT += $(patsubst $(OBJECT_MODELS_IN_DIR)/%.cbin,$(OBJECT_MODELS_OUT_DIR)/%.bin,$(wildcard $(OBJECT_MODELS_IN_DIR)/*.cbin)) - -PARTICLES_IN_DIR = $(ASSETS_DIR)/particles -PARTICLES_OUT_DIR = $(BUILD_DIR)/particles -PART_BEHAVIORS_IN_DIR = $(PARTICLES_IN_DIR)/behaviors -PART_BEHAVIORS_OUT_DIR = $(PARTICLES_OUT_DIR)/behaviors -PART_PARTICLES_IN_DIR = $(PARTICLES_IN_DIR)/particles -PART_PARTICLES_OUT_DIR = $(PARTICLES_OUT_DIR)/particles -ALL_ASSETS_BUILT += $(patsubst $(PART_BEHAVIORS_IN_DIR)/%.bin,$(PART_BEHAVIORS_OUT_DIR)/%.bin,$(wildcard $(PART_BEHAVIORS_IN_DIR)/*.bin)) -ALL_ASSETS_BUILT += $(patsubst $(PART_PARTICLES_IN_DIR)/%.bin,$(PART_PARTICLES_OUT_DIR)/%.bin,$(wildcard $(PART_PARTICLES_IN_DIR)/*.bin)) - -SPRITES_IN_DIR = $(ASSETS_DIR)/sprites -SPRITES_OUT_DIR = $(BUILD_DIR)/sprites -ALL_ASSETS_BUILT += $(patsubst $(SPRITES_IN_DIR)/%.bin,$(SPRITES_OUT_DIR)/%.bin,$(wildcard $(SPRITES_IN_DIR)/*.bin)) - -TEXT_IN_DIR = $(ASSETS_DIR)/text -TEXT_OUT_DIR = $(BUILD_DIR)/text -TEXT_GAME_IN_DIR = $(TEXT_IN_DIR)/game -TEXT_GAME_OUT_DIR = $(TEXT_OUT_DIR)/game -TEXT_MENU_IN_DIR = $(TEXT_IN_DIR)/menu -TEXT_MENU_OUT_DIR = $(TEXT_OUT_DIR)/menu -ALL_ASSETS_BUILT += $(patsubst $(TEXT_GAME_IN_DIR)/%.bin,$(TEXT_GAME_OUT_DIR)/%.bin,$(wildcard $(TEXT_GAME_IN_DIR)/*.bin)) -ALL_ASSETS_BUILT += $(patsubst $(TEXT_MENU_IN_DIR)/%.bin,$(TEXT_MENU_OUT_DIR)/%.bin,$(wildcard $(TEXT_MENU_IN_DIR)/*.bin)) - -TEXTURES_IN_DIR = $(ASSETS_DIR)/textures -TEXTURES_OUT_DIR = $(BUILD_DIR)/textures -TEXTURES_2D_IN_DIR = $(TEXTURES_IN_DIR)/2d -TEXTURES_2D_OUT_DIR = $(TEXTURES_OUT_DIR)/2d -TEXTURES_3D_IN_DIR = $(TEXTURES_IN_DIR)/3d -TEXTURES_3D_OUT_DIR = $(TEXTURES_OUT_DIR)/3d -ALL_ASSETS_BUILT += $(patsubst $(TEXTURES_2D_IN_DIR)/%.png,$(TEXTURES_2D_OUT_DIR)/%.bin,$(wildcard $(TEXTURES_2D_IN_DIR)/*.png)) -ALL_ASSETS_BUILT += $(patsubst $(TEXTURES_3D_IN_DIR)/%.png,$(TEXTURES_3D_OUT_DIR)/%.bin,$(wildcard $(TEXTURES_3D_IN_DIR)/*.png)) - -TT_GHOSTS_IN_DIR = $(ASSETS_DIR)/tt_ghosts -TT_GHOSTS_OUT_DIR = $(BUILD_DIR)/tt_ghosts -ALL_ASSETS_BUILT += $(patsubst $(TT_GHOSTS_IN_DIR)/%.bin,$(TT_GHOSTS_OUT_DIR)/%.bin,$(wildcard $(TT_GHOSTS_IN_DIR)/*.bin)) - -UNKNOWN_0_IN_DIR = $(ASSETS_DIR)/unknown_0 -UNKNOWN_0_OUT_DIR = $(BUILD_DIR)/unknown_0 -ALL_ASSETS_BUILT += $(patsubst $(UNKNOWN_0_IN_DIR)/%.bin,$(UNKNOWN_0_OUT_DIR)/%.bin,$(wildcard $(UNKNOWN_0_IN_DIR)/*.bin)) +$(call DEFINE_SECTION_FILES,audio,DEFINE_BINARY_FILES) +$(call DEFINE_SECTION_FILES,bin,DEFINE_BINARY_FILES) +$(call DEFINE_SECTION_FILES,fonts,DEFINE_JSON_AND_BINARY_FILES) +$(call DEFINE_SECTION_FILES,ids,DEFINE_BINARY_FILES) +$(call DEFINE_SECTION_FILES,levels/headers,DEFINE_JSON_FILES) +$(call DEFINE_SECTION_FILES,levels/models,DEFINE_COMPRESSED_BINARY_FILES) +$(call DEFINE_SECTION_FILES,levels/names,DEFINE_JSON_FILES) +$(call DEFINE_SECTION_FILES,levels/objectMaps,DEFINE_COMPRESSED_BINARY_FILES) +$(call DEFINE_SECTION_FILES,misc,DEFINE_BINARY_FILES) +$(call DEFINE_SECTION_FILES,objects,DEFINE_BINARY_FILES) +$(call DEFINE_SECTION_FILES,objects/animations,DEFINE_COMPRESSED_BINARY_FILES) +$(call DEFINE_SECTION_FILES,objects/headers,DEFINE_BINARY_FILES) +$(call DEFINE_SECTION_FILES,objects/models,DEFINE_COMPRESSED_BINARY_FILES) +$(call DEFINE_SECTION_FILES,particles/behaviors,DEFINE_BINARY_FILES) +$(call DEFINE_SECTION_FILES,particles/particles,DEFINE_BINARY_FILES) +$(call DEFINE_SECTION_FILES,sprites,DEFINE_JSON_FILES) +$(call DEFINE_SECTION_FILES,text/game,DEFINE_JSON_FILES) +$(call DEFINE_SECTION_FILES,text/menu,DEFINE_JSON_FILES) +$(call DEFINE_SECTION_FILES,textures/2d,DEFINE_JSON_FILES) +$(call DEFINE_SECTION_FILES,textures/3d,DEFINE_JSON_FILES) +$(call DEFINE_SECTION_FILES,tt_ghosts,DEFINE_JSON_FILES) +$(call DEFINE_SECTION_FILES,unknown_0,DEFINE_BINARY_FILES) +# Microcode UCODE_IN_DIR = $(UCODE_DIR) UCODE_OUT_DIR = $(BUILD_DIR)/ucode UCODE = $(wildcard $(UCODE_IN_DIR)/*.bin) ALL_ASSETS_BUILT += $(patsubst $(UCODE_IN_DIR)/%.bin,$(UCODE_OUT_DIR)/%.bin,$(UCODE)) -#ALL_ASSETS_BUILT := $(ANIMATIONS_BUILT) $(AUDIO_BUILT) $(BILLBOARDS_BUILT) $(BINS_BUILT) $(CHEATS_BUILT) $(FONTS_BUILT) $(LEVELS_BUILT) $(OBJECTS_BUILT) $(TEXTURES_BUILT) $(PARTICLES_BUILT) $(TEXT_BUILT) $(TT_GHOSTS_BUILT) $(UCODE_BUILT) $(LUT_BUILT) - ####################### LIBULTRA ######################### $(BUILD_DIR)/lib/%.o: OPT_FLAGS := -O2 -Xfullwarn @@ -358,7 +344,15 @@ ifneq ($(wildcard ./build/.*),) rm -r build else @echo "/build/ directory has already been deleted." -endif +endif + +distclean: + rm -rf build + rm -rf assets + rm -rf ucode + rm -rf dkr.ld + rm -rf tools/ido-static-recomp/{,.[!.],..?}* # Deletes all files, including hidden ones. + $(MAKE) -C tools distclean clean_lib: ifneq ($(wildcard $(BUILD_DIR)/lib/.*),) @@ -388,98 +382,55 @@ dont_remove_asset_files: $(ALL_ASSETS_BUILT) # All assets should output a .bin file -$(AUDIO_OUT_DIR)/%.bin: $(AUDIO_IN_DIR)/%.bin - $(call print,Copying:,$<,$@) - $(V)$(ASSETS_COPY) $^ $@ +# $1 = folder name, $2 = Print Message +define CREATE_BINARY_ASSET_TARGET +$(eval VAR_NAME := $(call GET_VAR_NAME,$1)) +$$($$(VAR_NAME)_OUT_DIR)/%.bin: $$($$(VAR_NAME)_IN_DIR)/%.bin + $$(call print,$2:,$$<,$$@) + $$(V)$$(ASSETS_COPY) $$^ $$@ +endef -$(BIN_OUT_DIR)/%.bin: $(BIN_IN_DIR)/%.bin - $(call print,Copying:,$<,$@) - $(V)$(ASSETS_COPY) $^ $@ - -$(FONTS_OUT_DIR)/%.bin: $(FONTS_IN_DIR)/%.bin - $(call print,Copying:,$<,$@) - $(V)$(ASSETS_COPY) $^ $@ - -$(IDS_OUT_DIR)/%.bin: $(IDS_IN_DIR)/%.bin - $(call print,Copying:,$<,$@) - $(V)$(ASSETS_COPY) $^ $@ - -$(LEVEL_HEADERS_OUT_DIR)/%.bin: $(LEVEL_HEADERS_IN_DIR)/%.bin - $(call print,Copying:,$<,$@) - $(V)$(ASSETS_COPY) $^ $@ +# $1 = folder name, $2 = Print Message +define CREATE_COMPRESSED_ASSET_TARGET +$(eval VAR_NAME := $(call GET_VAR_NAME,$1)) +$$($$(VAR_NAME)_OUT_DIR)/%.bin: $$($$(VAR_NAME)_IN_DIR)/%.cbin + $$(call print,$2:,$$<,$$@) + $$(V)$$(COMPRESS) $$^ $$@ +endef -$(LEVEL_MODELS_OUT_DIR)/%.bin: $(LEVEL_MODELS_IN_DIR)/%.cbin - $(call print,Compressing:,$<,$@) - $(V)$(COMPRESS) $^ $@ - -$(LEVEL_NAMES_OUT_DIR)/%.bin: $(LEVEL_NAMES_IN_DIR)/%.bin - $(call print,Copying:,$<,$@) - $(V)$(ASSETS_COPY) $^ $@ +# $1 = folder name, $2 = Print Message +define CREATE_JSON_ASSET_TARGET +$(eval VAR_NAME := $(call GET_VAR_NAME,$1)) +$$($$(VAR_NAME)_OUT_DIR)/%.bin: $$($$(VAR_NAME)_IN_DIR)/%.json + $$(call print,$2:,$$<,$$@) + $$(V)$$(BUILDER) $$^ $$@ +endef -$(LEVEL_OBJMAPS_OUT_DIR)/%.bin: $(LEVEL_OBJMAPS_IN_DIR)/%.cbin - $(call print,Compressing:,$<,$@) - $(V)$(COMPRESS) $^ $@ - -$(MISC_OUT_DIR)/%.bin: $(MISC_IN_DIR)/%.bin - $(call print,Copying:,$<,$@) - $(V)$(ASSETS_COPY) $^ $@ - -$(OBJECTS_OUT_DIR)/%.bin: $(OBJECTS_IN_DIR)/%.bin - $(call print,Copying:,$<,$@) - $(V)$(ASSETS_COPY) $^ $@ - -$(OBJECT_ANIMS_OUT_DIR)/%.bin: $(OBJECT_ANIMS_IN_DIR)/%.cbin - $(call print,Compressing:,$<,$@) - $(V)$(COMPRESS) $^ $@ - -$(OBJECT_HEADERS_OUT_DIR)/%.bin: $(OBJECT_HEADERS_IN_DIR)/%.bin - $(call print,Copying:,$<,$@) - $(V)$(ASSETS_COPY) $^ $@ - -$(OBJECT_MODELS_OUT_DIR)/%.bin: $(OBJECT_MODELS_IN_DIR)/%.cbin - $(call print,Compressing:,$<,$@) - $(V)$(COMPRESS) $^ $@ - -$(PART_BEHAVIORS_OUT_DIR)/%.bin: $(PART_BEHAVIORS_IN_DIR)/%.bin - $(call print,Copying:,$<,$@) - $(V)$(ASSETS_COPY) $^ $@ - -$(PART_PARTICLES_OUT_DIR)/%.bin: $(PART_PARTICLES_IN_DIR)/%.bin - $(call print,Copying:,$<,$@) - $(V)$(ASSETS_COPY) $^ $@ - -$(SPRITES_OUT_DIR)/%.bin: $(SPRITES_IN_DIR)/%.bin - $(call print,Copying:,$<,$@) - $(V)$(ASSETS_COPY) $^ $@ - -$(TEXT_GAME_OUT_DIR)/%.bin: $(TEXT_GAME_IN_DIR)/%.bin - $(call print,Copying:,$<,$@) - $(V)$(ASSETS_COPY) $^ $@ - -$(TEXT_MENU_OUT_DIR)/%.bin: $(TEXT_MENU_IN_DIR)/%.bin - $(call print,Copying:,$<,$@) - $(V)$(ASSETS_COPY) $^ $@ - -$(TEXTURES_2D_OUT_DIR)/%.bin: $(TEXTURES_2D_IN_DIR)/%.png - $(call print,Building Texture:,$<,$@) - $(V)$(TEXBUILDER) $^ $@ - -$(TEXTURES_3D_OUT_DIR)/%.bin: $(TEXTURES_3D_IN_DIR)/%.png - $(call print,Building Texture:,$<,$@) - $(V)$(TEXBUILDER) $^ $@ - -$(TEXT_MENU_OUT_DIR)/%.bin: $(TEXT_MENU_IN_DIR)/%.bin - $(call print,Copying:,$<,$@) - $(V)$(ASSETS_COPY) $^ $@ - -$(TT_GHOSTS_OUT_DIR)/%.bin: $(TT_GHOSTS_IN_DIR)/%.bin - $(call print,Copying:,$<,$@) - $(V)$(ASSETS_COPY) $^ $@ - -$(UNKNOWN_0_OUT_DIR)/%.bin: $(UNKNOWN_0_IN_DIR)/%.bin - $(call print,Copying:,$<,$@) - $(V)$(ASSETS_COPY) $^ $@ +$(eval $(call CREATE_BINARY_ASSET_TARGET,audio,Copying Audio Binary)) +$(eval $(call CREATE_BINARY_ASSET_TARGET,bin,Copying Bin Binary)) +$(eval $(call CREATE_BINARY_ASSET_TARGET,fonts,Copying Fonts Binary)) +$(eval $(call CREATE_JSON_ASSET_TARGET,fonts,Building Fonts)) +$(eval $(call CREATE_BINARY_ASSET_TARGET,ids,Copying IDs Binary)) +$(eval $(call CREATE_JSON_ASSET_TARGET,levels/headers,Building Level Header)) +$(eval $(call CREATE_COMPRESSED_ASSET_TARGET,levels/models,Compressing Level Model Binary)) +$(eval $(call CREATE_JSON_ASSET_TARGET,levels/names,Building Level Name)) +$(eval $(call CREATE_COMPRESSED_ASSET_TARGET,levels/objectMaps,Compressing Level Object Map Binary)) +$(eval $(call CREATE_BINARY_ASSET_TARGET,misc,Copying Misc Binary)) +$(eval $(call CREATE_BINARY_ASSET_TARGET,objects,Copying Object Binary)) +$(eval $(call CREATE_COMPRESSED_ASSET_TARGET,objects/animations,Compressing Object Animation Binary)) +$(eval $(call CREATE_BINARY_ASSET_TARGET,objects/headers,Copying Object Header Binary)) +$(eval $(call CREATE_COMPRESSED_ASSET_TARGET,objects/models,Compressing Object Model Binary)) +$(eval $(call CREATE_BINARY_ASSET_TARGET,particles/behaviors,Copying Particle Behavior Binary)) +$(eval $(call CREATE_BINARY_ASSET_TARGET,particles/particles,Copying Particle Binary)) +$(eval $(call CREATE_JSON_ASSET_TARGET,sprites,Building Sprite)) +$(eval $(call CREATE_JSON_ASSET_TARGET,text/game,Building Game Text)) +$(eval $(call CREATE_JSON_ASSET_TARGET,text/menu,Building Menu Text)) +$(eval $(call CREATE_JSON_ASSET_TARGET,textures/2d,Building Texture (2D))) +$(eval $(call CREATE_JSON_ASSET_TARGET,textures/3d,Building Texture (3D))) +$(eval $(call CREATE_JSON_ASSET_TARGET,tt_ghosts,Building T.T. Ghost)) +$(eval $(call CREATE_BINARY_ASSET_TARGET,unknown_0,Copying Unknown_0 Binary)) +# Microcode target $(UCODE_OUT_DIR)/%.bin: $(UCODE_IN_DIR)/%.bin $(call print,Copying:,$<,$@) $(V)$(ASSETS_COPY) $^ $@ @@ -540,7 +491,7 @@ test: $(BUILD_DIR)/$(TARGET).z64 load: $(BUILD_DIR)/$(TARGET).z64 $(LOADER) $(LOADER_FLAGS) $< -.PHONY: all clean default diff test +.PHONY: all clean distclean default diff test # Remove built-in rules, to improve performance MAKEFLAGS += --no-builtin-rules diff --git a/asm/assets/assets.s b/asm/assets/assets.s index 35d8412d..c85bfcc1 100755 --- a/asm/assets/assets.s +++ b/asm/assets/assets.s @@ -1,13834 +1,13907 @@ -# This file was generated by generate_ld.py +# This file is automatically generated. Any changes you make to this file will get overwritten. .include "macros.inc" -.word 50 # Number of asset sections -.word ASSET_SECTION_0 - ASSETS_START -.word ASSET_SECTION_1 - ASSETS_START -.word ASSET_SECTION_2 - ASSETS_START -.word ASSET_SECTION_3 - ASSETS_START -.word ASSET_SECTION_4 - ASSETS_START -.word ASSET_SECTION_5 - ASSETS_START -.word ASSET_SECTION_6 - ASSETS_START -.word ASSET_SECTION_7 - ASSETS_START -.word ASSET_SECTION_8 - ASSETS_START -.word ASSET_SECTION_9 - ASSETS_START -.word ASSET_SECTION_10 - ASSETS_START -.word ASSET_SECTION_11 - ASSETS_START -.word ASSET_SECTION_12 - ASSETS_START -.word ASSET_SECTION_13 - ASSETS_START -.word ASSET_SECTION_14 - ASSETS_START -.word ASSET_SECTION_15 - ASSETS_START -.word ASSET_SECTION_16 - ASSETS_START -.word ASSET_SECTION_17 - ASSETS_START -.word ASSET_SECTION_18 - ASSETS_START -.word ASSET_SECTION_19 - ASSETS_START -.word ASSET_SECTION_20 - ASSETS_START -.word ASSET_SECTION_21 - ASSETS_START -.word ASSET_SECTION_22 - ASSETS_START -.word ASSET_SECTION_23 - ASSETS_START -.word ASSET_SECTION_24 - ASSETS_START -.word ASSET_SECTION_25 - ASSETS_START -.word ASSET_SECTION_26 - ASSETS_START -.word ASSET_SECTION_27 - ASSETS_START -.word ASSET_SECTION_28 - ASSETS_START -.word ASSET_SECTION_29 - ASSETS_START -.word ASSET_SECTION_30 - ASSETS_START -.word ASSET_SECTION_31 - ASSETS_START -.word ASSET_SECTION_32 - ASSETS_START -.word ASSET_SECTION_33 - ASSETS_START -.word ASSET_SECTION_34 - ASSETS_START -.word ASSET_SECTION_35 - ASSETS_START -.word ASSET_SECTION_36 - ASSETS_START -.word ASSET_SECTION_37 - ASSETS_START -.word ASSET_SECTION_38 - ASSETS_START -.word ASSET_SECTION_39 - ASSETS_START -.word ASSET_SECTION_40 - ASSETS_START -.word ASSET_SECTION_41 - ASSETS_START -.word ASSET_SECTION_42 - ASSETS_START -.word ASSET_SECTION_43 - ASSETS_START -.word ASSET_SECTION_44 - ASSETS_START -.word ASSET_SECTION_45 - ASSETS_START -.word ASSET_SECTION_46 - ASSETS_START -.word ASSET_SECTION_47 - ASSETS_START -.word ASSET_SECTION_48 - ASSETS_START -.word ASSET_SECTION_49 - ASSETS_START +/********** Asset Sections Table **********/ + +.word 50 # Number of entries in the table +.word ASSET_UNKNOWN_0 - ASSETS_START +.word ASSET_UNKNOWN_0_TABLE - ASSETS_START +.word ASSET_TEXTURES_3D - ASSETS_START +.word ASSET_TEXTURES_3D_TABLE - ASSETS_START +.word ASSET_TEXTURES_2D - ASSETS_START +.word ASSET_TEXTURES_2D_TABLE - ASSETS_START +.word ASSET_GAME_TEXT - ASSETS_START +.word ASSET_GAME_TEXT_TABLE - ASSETS_START +.word ASSET_MENU_TEXT - ASSETS_START +.word ASSET_MENU_TEXT_TABLE - ASSETS_START +.word ASSET_SCREENS - ASSETS_START +.word ASSET_SCREENS_TABLE - ASSETS_START +.word ASSET_SPRITES - ASSETS_START +.word ASSET_SPRITES_TABLE - ASSETS_START +.word ASSET_EMPTY_14 - ASSETS_START +.word ASSET_MISC - ASSETS_START +.word ASSET_MISC_TABLE - ASSETS_START +.word ASSET_HUD_ELEMENT_IDS - ASSETS_START +.word ASSET_MENU_ELEMENT_IDS - ASSETS_START +.word ASSET_UNKNOWN_19 - ASSETS_START +.word ASSET_LEVEL_OBJECT_MAPS_TABLE - ASSETS_START +.word ASSET_LEVEL_OBJECT_MAPS - ASSETS_START +.word ASSET_LEVEL_HEADERS_TABLE - ASSETS_START +.word ASSET_LEVEL_HEADERS - ASSETS_START +.word ASSET_LEVEL_NAMES_TABLE - ASSETS_START +.word ASSET_LEVEL_NAMES - ASSETS_START +.word ASSET_LEVEL_MODELS_TABLE - ASSETS_START +.word ASSET_LEVEL_MODELS - ASSETS_START +.word ASSET_OBJECT_MODELS_TABLE - ASSETS_START +.word ASSET_OBJECT_MODELS - ASSETS_START +.word ASSET_ANIMATION_IDS - ASSETS_START +.word ASSET_OBJECT_ANIMATIONS_TABLE - ASSETS_START +.word ASSET_OBJECT_ANIMATIONS - ASSETS_START +.word ASSET_OBJECT_HEADERS_TABLE - ASSETS_START +.word ASSET_OBJECT_HEADERS - ASSETS_START +.word ASSET_LEVEL_OBJECT_TRANSLATION_TABLE - ASSETS_START +.word ASSET_EMPTY_37_TABLE - ASSETS_START +.word ASSET_EMPTY_37 - ASSETS_START +.word ASSET_AUDIO_TABLE - ASSETS_START +.word ASSET_AUDIO - ASSETS_START +.word ASSET_PARTICLES_TABLE - ASSETS_START +.word ASSET_PARTICLES - ASSETS_START +.word ASSET_PARTICLE_BEHAVIORS_TABLE - ASSETS_START +.word ASSET_PARTICLE_BEHAVIORS - ASSETS_START +.word ASSET_FONTS - ASSETS_START +.word ASSET_BINARY_45 - ASSETS_START +.word ASSET_BINARY_46 - ASSETS_START +.word ASSET_BINARY_47 - ASSETS_START +.word ASSET_TTGHOSTS_TABLE - ASSETS_START +.word ASSET_TTGHOSTS - ASSETS_START .word ASSETS_END - ASSETS_START +/********** Asset Sections **********/ + +.balign 16 glabel ASSETS_START +/********** ASSET_UNKNOWN_0 **********/ + .balign 16 -glabel ASSET_SECTION_0 -glabel ASSET_0_0 +glabel ASSET_UNKNOWN_0 +glabel ASSET_UNKNOWN_0_0 .incbin "./build/us_1.0/unknown_0/unknown_0_0.bin" -glabel ASSET_0_1 +glabel ASSET_UNKNOWN_0_1 .incbin "./build/us_1.0/unknown_0/unknown_0_1.bin" -glabel ASSET_0_2 +glabel ASSET_UNKNOWN_0_2 .incbin "./build/us_1.0/unknown_0/unknown_0_2.bin" -glabel ASSET_0_3 +glabel ASSET_UNKNOWN_0_3 .incbin "./build/us_1.0/unknown_0/unknown_0_3.bin" -glabel ASSET_0_4 +glabel ASSET_UNKNOWN_0_4 .incbin "./build/us_1.0/unknown_0/unknown_0_4.bin" -glabel ASSET_0_5 +glabel ASSET_UNKNOWN_0_5 .incbin "./build/us_1.0/unknown_0/unknown_0_5.bin" -glabel ASSET_0_6 +glabel ASSET_UNKNOWN_0_6 .incbin "./build/us_1.0/unknown_0/unknown_0_6.bin" -glabel ASSET_0_7 +glabel ASSET_UNKNOWN_0_7 .incbin "./build/us_1.0/unknown_0/unknown_0_7.bin" -glabel ASSET_0_8 +glabel ASSET_UNKNOWN_0_8 .incbin "./build/us_1.0/unknown_0/unknown_0_8.bin" -glabel ASSET_0_9 +glabel ASSET_UNKNOWN_0_9 .incbin "./build/us_1.0/unknown_0/unknown_0_9.bin" -glabel ASSET_SECTION_0_END +glabel ASSET_UNKNOWN_0_END + +/********** ASSET_UNKNOWN_0_TABLE **********/ .balign 16 -glabel ASSET_SECTION_1 -.word ASSET_0_0 - ASSET_SECTION_0 -.word ASSET_0_1 - ASSET_SECTION_0 -.word ASSET_0_2 - ASSET_SECTION_0 -.word ASSET_0_3 - ASSET_SECTION_0 -.word ASSET_0_4 - ASSET_SECTION_0 -.word ASSET_0_5 - ASSET_SECTION_0 -.word ASSET_0_6 - ASSET_SECTION_0 -.word ASSET_0_7 - ASSET_SECTION_0 -.word ASSET_0_8 - ASSET_SECTION_0 -.word ASSET_0_9 - ASSET_SECTION_0 -.word ASSET_SECTION_0_END - ASSET_SECTION_0 +glabel ASSET_UNKNOWN_0_TABLE +.word ASSET_UNKNOWN_0_0 - ASSET_UNKNOWN_0 +.word ASSET_UNKNOWN_0_1 - ASSET_UNKNOWN_0 +.word ASSET_UNKNOWN_0_2 - ASSET_UNKNOWN_0 +.word ASSET_UNKNOWN_0_3 - ASSET_UNKNOWN_0 +.word ASSET_UNKNOWN_0_4 - ASSET_UNKNOWN_0 +.word ASSET_UNKNOWN_0_5 - ASSET_UNKNOWN_0 +.word ASSET_UNKNOWN_0_6 - ASSET_UNKNOWN_0 +.word ASSET_UNKNOWN_0_7 - ASSET_UNKNOWN_0 +.word ASSET_UNKNOWN_0_8 - ASSET_UNKNOWN_0 +.word ASSET_UNKNOWN_0_9 - ASSET_UNKNOWN_0 +.word ASSET_UNKNOWN_0_END - ASSET_UNKNOWN_0 .word 0xFFFFFFFF -glabel ASSET_SECTION_1_END + +/********** ASSET_TEXTURES_3D **********/ .balign 16 -glabel ASSET_SECTION_2 -glabel ASSET_2_0 +glabel ASSET_TEXTURES_3D +glabel ASSET_TEX3D_0 .incbin "./build/us_1.0/textures/3d/unknown_2_0.bin" -glabel ASSET_2_1 +glabel ASSET_TEX3D_1 .incbin "./build/us_1.0/textures/3d/unknown_2_1.bin" -glabel ASSET_2_2 +glabel ASSET_TEX3D_2 .incbin "./build/us_1.0/textures/3d/unknown_2_2.bin" -glabel ASSET_2_3 +glabel ASSET_TEX3D_3 .incbin "./build/us_1.0/textures/3d/unknown_2_3.bin" -glabel ASSET_2_4 +glabel ASSET_TEX3D_4 .incbin "./build/us_1.0/textures/3d/unknown_2_4.bin" -glabel ASSET_2_5 +glabel ASSET_TEX3D_5 .incbin "./build/us_1.0/textures/3d/unknown_2_5.bin" -glabel ASSET_2_6 +glabel ASSET_TEX3D_6 .incbin "./build/us_1.0/textures/3d/unknown_2_6.bin" -glabel ASSET_2_7 +glabel ASSET_TEX3D_7 .incbin "./build/us_1.0/textures/3d/unknown_2_7.bin" -glabel ASSET_2_8 +glabel ASSET_TEX3D_8 .incbin "./build/us_1.0/textures/3d/unknown_2_8.bin" -glabel ASSET_2_9 +glabel ASSET_TEX3D_9 .incbin "./build/us_1.0/textures/3d/unknown_2_9.bin" -glabel ASSET_2_10 +glabel ASSET_TEX3D_10 .incbin "./build/us_1.0/textures/3d/unknown_2_10.bin" -glabel ASSET_2_11 +glabel ASSET_TEX3D_11 .incbin "./build/us_1.0/textures/3d/unknown_2_11.bin" -glabel ASSET_2_12 +glabel ASSET_TEX3D_12 .incbin "./build/us_1.0/textures/3d/unknown_2_12.bin" -glabel ASSET_2_13 +glabel ASSET_TEX3D_13 .incbin "./build/us_1.0/textures/3d/unknown_2_13.bin" -glabel ASSET_2_14 +glabel ASSET_TEX3D_14 .incbin "./build/us_1.0/textures/3d/unknown_2_14.bin" -glabel ASSET_2_15 +glabel ASSET_TEX3D_15 .incbin "./build/us_1.0/textures/3d/unknown_2_15.bin" -glabel ASSET_2_16 +glabel ASSET_TEX3D_16 .incbin "./build/us_1.0/textures/3d/unknown_2_16.bin" -glabel ASSET_2_17 +glabel ASSET_TEX3D_17 .incbin "./build/us_1.0/textures/3d/unknown_2_17.bin" -glabel ASSET_2_18 +glabel ASSET_TEX3D_18 .incbin "./build/us_1.0/textures/3d/unknown_2_18.bin" -glabel ASSET_2_19 +glabel ASSET_TEX3D_19 .incbin "./build/us_1.0/textures/3d/unknown_2_19.bin" -glabel ASSET_2_20 +glabel ASSET_TEX3D_20 .incbin "./build/us_1.0/textures/3d/unknown_2_20.bin" -glabel ASSET_2_21 +glabel ASSET_TEX3D_21 .incbin "./build/us_1.0/textures/3d/unknown_2_21.bin" -glabel ASSET_2_22 +glabel ASSET_TEX3D_22 .incbin "./build/us_1.0/textures/3d/unknown_2_22.bin" -glabel ASSET_2_23 +glabel ASSET_TEX3D_23 .incbin "./build/us_1.0/textures/3d/unknown_2_23.bin" -glabel ASSET_2_24 +glabel ASSET_TEX3D_24 .incbin "./build/us_1.0/textures/3d/unknown_2_24.bin" -glabel ASSET_2_25 +glabel ASSET_TEX3D_25 .incbin "./build/us_1.0/textures/3d/unknown_2_25.bin" -glabel ASSET_2_26 +glabel ASSET_TEX3D_26 .incbin "./build/us_1.0/textures/3d/unknown_2_26.bin" -glabel ASSET_2_27 +glabel ASSET_TEX3D_27 .incbin "./build/us_1.0/textures/3d/unknown_2_27.bin" -glabel ASSET_2_28 +glabel ASSET_TEX3D_28 .incbin "./build/us_1.0/textures/3d/unknown_2_28.bin" -glabel ASSET_2_29 +glabel ASSET_TEX3D_29 .incbin "./build/us_1.0/textures/3d/unknown_2_29.bin" -glabel ASSET_2_30 +glabel ASSET_TEX3D_30 .incbin "./build/us_1.0/textures/3d/unknown_2_30.bin" -glabel ASSET_2_31 +glabel ASSET_TEX3D_31 .incbin "./build/us_1.0/textures/3d/unknown_2_31.bin" -glabel ASSET_2_32 +glabel ASSET_TEX3D_32 .incbin "./build/us_1.0/textures/3d/unknown_2_32.bin" -glabel ASSET_2_33 +glabel ASSET_TEX3D_33 .incbin "./build/us_1.0/textures/3d/unknown_2_33.bin" -glabel ASSET_2_34 +glabel ASSET_TEX3D_34 .incbin "./build/us_1.0/textures/3d/unknown_2_34.bin" -glabel ASSET_2_35 +glabel ASSET_TEX3D_35 .incbin "./build/us_1.0/textures/3d/unknown_2_35.bin" -glabel ASSET_2_36 +glabel ASSET_TEX3D_36 .incbin "./build/us_1.0/textures/3d/unknown_2_36.bin" -glabel ASSET_2_37 +glabel ASSET_TEX3D_37 .incbin "./build/us_1.0/textures/3d/unknown_2_37.bin" -glabel ASSET_2_38 +glabel ASSET_TEX3D_38 .incbin "./build/us_1.0/textures/3d/unknown_2_38.bin" -glabel ASSET_2_39 +glabel ASSET_TEX3D_39 .incbin "./build/us_1.0/textures/3d/unknown_2_39.bin" -glabel ASSET_2_40 +glabel ASSET_TEX3D_40 .incbin "./build/us_1.0/textures/3d/unknown_2_40.bin" -glabel ASSET_2_41 +glabel ASSET_TEX3D_41 .incbin "./build/us_1.0/textures/3d/unknown_2_41.bin" -glabel ASSET_2_42 +glabel ASSET_TEX3D_42 .incbin "./build/us_1.0/textures/3d/unknown_2_42.bin" -glabel ASSET_2_43 +glabel ASSET_TEX3D_43 .incbin "./build/us_1.0/textures/3d/unknown_2_43.bin" -glabel ASSET_2_44 +glabel ASSET_TEX3D_44 .incbin "./build/us_1.0/textures/3d/unknown_2_44.bin" -glabel ASSET_2_45 +glabel ASSET_TEX3D_45 .incbin "./build/us_1.0/textures/3d/unknown_2_45.bin" -glabel ASSET_2_46 +glabel ASSET_TEX3D_46 .incbin "./build/us_1.0/textures/3d/unknown_2_46.bin" -glabel ASSET_2_47 +glabel ASSET_TEX3D_47 .incbin "./build/us_1.0/textures/3d/unknown_2_47.bin" -glabel ASSET_2_48 +glabel ASSET_TEX3D_48 .incbin "./build/us_1.0/textures/3d/unknown_2_48.bin" -glabel ASSET_2_49 +glabel ASSET_TEX3D_49 .incbin "./build/us_1.0/textures/3d/unknown_2_49.bin" -glabel ASSET_2_50 +glabel ASSET_TEX3D_50 .incbin "./build/us_1.0/textures/3d/unknown_2_50.bin" -glabel ASSET_2_51 +glabel ASSET_TEX3D_51 .incbin "./build/us_1.0/textures/3d/unknown_2_51.bin" -glabel ASSET_2_52 +glabel ASSET_TEX3D_52 .incbin "./build/us_1.0/textures/3d/unknown_2_52.bin" -glabel ASSET_2_53 +glabel ASSET_TEX3D_53 .incbin "./build/us_1.0/textures/3d/unknown_2_53.bin" -glabel ASSET_2_54 +glabel ASSET_TEX3D_54 .incbin "./build/us_1.0/textures/3d/unknown_2_54.bin" -glabel ASSET_2_55 +glabel ASSET_TEX3D_55 .incbin "./build/us_1.0/textures/3d/unknown_2_55.bin" -glabel ASSET_2_56 +glabel ASSET_TEX3D_56 .incbin "./build/us_1.0/textures/3d/unknown_2_56.bin" -glabel ASSET_2_57 +glabel ASSET_TEX3D_57 .incbin "./build/us_1.0/textures/3d/unknown_2_57.bin" -glabel ASSET_2_58 +glabel ASSET_TEX3D_58 .incbin "./build/us_1.0/textures/3d/unknown_2_58.bin" -glabel ASSET_2_59 +glabel ASSET_TEX3D_59 .incbin "./build/us_1.0/textures/3d/unknown_2_59.bin" -glabel ASSET_2_60 +glabel ASSET_TEX3D_60 .incbin "./build/us_1.0/textures/3d/unknown_2_60.bin" -glabel ASSET_2_61 +glabel ASSET_TEX3D_61 .incbin "./build/us_1.0/textures/3d/unknown_2_61.bin" -glabel ASSET_2_62 +glabel ASSET_TEX3D_62 .incbin "./build/us_1.0/textures/3d/unknown_2_62.bin" -glabel ASSET_2_63 +glabel ASSET_TEX3D_63 .incbin "./build/us_1.0/textures/3d/unknown_2_63.bin" -glabel ASSET_2_64 +glabel ASSET_TEX3D_64 .incbin "./build/us_1.0/textures/3d/unknown_2_64.bin" -glabel ASSET_2_65 +glabel ASSET_TEX3D_65 .incbin "./build/us_1.0/textures/3d/unknown_2_65.bin" -glabel ASSET_2_66 +glabel ASSET_TEX3D_66 .incbin "./build/us_1.0/textures/3d/unknown_2_66.bin" -glabel ASSET_2_67 +glabel ASSET_TEX3D_67 .incbin "./build/us_1.0/textures/3d/unknown_2_67.bin" -glabel ASSET_2_68 +glabel ASSET_TEX3D_68 .incbin "./build/us_1.0/textures/3d/unknown_2_68.bin" -glabel ASSET_2_69 +glabel ASSET_TEX3D_69 .incbin "./build/us_1.0/textures/3d/unknown_2_69.bin" -glabel ASSET_2_70 +glabel ASSET_TEX3D_70 .incbin "./build/us_1.0/textures/3d/unknown_2_70.bin" -glabel ASSET_2_71 +glabel ASSET_TEX3D_71 .incbin "./build/us_1.0/textures/3d/unknown_2_71.bin" -glabel ASSET_2_72 +glabel ASSET_TEX3D_72 .incbin "./build/us_1.0/textures/3d/unknown_2_72.bin" -glabel ASSET_2_73 +glabel ASSET_TEX3D_73 .incbin "./build/us_1.0/textures/3d/unknown_2_73.bin" -glabel ASSET_2_74 +glabel ASSET_TEX3D_74 .incbin "./build/us_1.0/textures/3d/unknown_2_74.bin" -glabel ASSET_2_75 +glabel ASSET_TEX3D_75 .incbin "./build/us_1.0/textures/3d/unknown_2_75.bin" -glabel ASSET_2_76 +glabel ASSET_TEX3D_76 .incbin "./build/us_1.0/textures/3d/unknown_2_76.bin" -glabel ASSET_2_77 +glabel ASSET_TEX3D_77 .incbin "./build/us_1.0/textures/3d/unknown_2_77.bin" -glabel ASSET_2_78 +glabel ASSET_TEX3D_78 .incbin "./build/us_1.0/textures/3d/unknown_2_78.bin" -glabel ASSET_2_79 +glabel ASSET_TEX3D_79 .incbin "./build/us_1.0/textures/3d/unknown_2_79.bin" -glabel ASSET_2_80 +glabel ASSET_TEX3D_80 .incbin "./build/us_1.0/textures/3d/unknown_2_80.bin" -glabel ASSET_2_81 +glabel ASSET_TEX3D_81 .incbin "./build/us_1.0/textures/3d/unknown_2_81.bin" -glabel ASSET_2_82 +glabel ASSET_TEX3D_82 .incbin "./build/us_1.0/textures/3d/unknown_2_82.bin" -glabel ASSET_2_83 +glabel ASSET_TEX3D_83 .incbin "./build/us_1.0/textures/3d/unknown_2_83.bin" -glabel ASSET_2_84 +glabel ASSET_TEX3D_84 .incbin "./build/us_1.0/textures/3d/unknown_2_84.bin" -glabel ASSET_2_85 +glabel ASSET_TEX3D_85 .incbin "./build/us_1.0/textures/3d/unknown_2_85.bin" -glabel ASSET_2_86 +glabel ASSET_TEX3D_86 .incbin "./build/us_1.0/textures/3d/unknown_2_86.bin" -glabel ASSET_2_87 +glabel ASSET_TEX3D_87 .incbin "./build/us_1.0/textures/3d/unknown_2_87.bin" -glabel ASSET_2_88 +glabel ASSET_TEX3D_88 .incbin "./build/us_1.0/textures/3d/unknown_2_88.bin" -glabel ASSET_2_89 +glabel ASSET_TEX3D_89 .incbin "./build/us_1.0/textures/3d/unknown_2_89.bin" -glabel ASSET_2_90 +glabel ASSET_TEX3D_90 .incbin "./build/us_1.0/textures/3d/unknown_2_90.bin" -glabel ASSET_2_91 +glabel ASSET_TEX3D_91 .incbin "./build/us_1.0/textures/3d/unknown_2_91.bin" -glabel ASSET_2_92 +glabel ASSET_TEX3D_92 .incbin "./build/us_1.0/textures/3d/unknown_2_92.bin" -glabel ASSET_2_93 +glabel ASSET_TEX3D_93 .incbin "./build/us_1.0/textures/3d/unknown_2_93.bin" -glabel ASSET_2_94 +glabel ASSET_TEX3D_94 .incbin "./build/us_1.0/textures/3d/unknown_2_94.bin" -glabel ASSET_2_95 +glabel ASSET_TEX3D_95 .incbin "./build/us_1.0/textures/3d/unknown_2_95.bin" -glabel ASSET_2_96 +glabel ASSET_TEX3D_96 .incbin "./build/us_1.0/textures/3d/unknown_2_96.bin" -glabel ASSET_2_97 +glabel ASSET_TEX3D_97 .incbin "./build/us_1.0/textures/3d/unknown_2_97.bin" -glabel ASSET_2_98 +glabel ASSET_TEX3D_98 .incbin "./build/us_1.0/textures/3d/unknown_2_98.bin" -glabel ASSET_2_99 +glabel ASSET_TEX3D_99 .incbin "./build/us_1.0/textures/3d/unknown_2_99.bin" -glabel ASSET_2_100 +glabel ASSET_TEX3D_100 .incbin "./build/us_1.0/textures/3d/unknown_2_100.bin" -glabel ASSET_2_101 +glabel ASSET_TEX3D_101 .incbin "./build/us_1.0/textures/3d/unknown_2_101.bin" -glabel ASSET_2_102 +glabel ASSET_TEX3D_102 .incbin "./build/us_1.0/textures/3d/unknown_2_102.bin" -glabel ASSET_2_103 +glabel ASSET_TEX3D_103 .incbin "./build/us_1.0/textures/3d/unknown_2_103.bin" -glabel ASSET_2_104 +glabel ASSET_TEX3D_104 .incbin "./build/us_1.0/textures/3d/unknown_2_104.bin" -glabel ASSET_2_105 +glabel ASSET_TEX3D_105 .incbin "./build/us_1.0/textures/3d/unknown_2_105.bin" -glabel ASSET_2_106 +glabel ASSET_TEX3D_106 .incbin "./build/us_1.0/textures/3d/unknown_2_106.bin" -glabel ASSET_2_107 +glabel ASSET_TEX3D_107 .incbin "./build/us_1.0/textures/3d/unknown_2_107.bin" -glabel ASSET_2_108 +glabel ASSET_TEX3D_108 .incbin "./build/us_1.0/textures/3d/unknown_2_108.bin" -glabel ASSET_2_109 +glabel ASSET_TEX3D_109 .incbin "./build/us_1.0/textures/3d/unknown_2_109.bin" -glabel ASSET_2_110 +glabel ASSET_TEX3D_110 .incbin "./build/us_1.0/textures/3d/unknown_2_110.bin" -glabel ASSET_2_111 +glabel ASSET_TEX3D_111 .incbin "./build/us_1.0/textures/3d/unknown_2_111.bin" -glabel ASSET_2_112 +glabel ASSET_TEX3D_112 .incbin "./build/us_1.0/textures/3d/unknown_2_112.bin" -glabel ASSET_2_113 +glabel ASSET_TEX3D_113 .incbin "./build/us_1.0/textures/3d/unknown_2_113.bin" -glabel ASSET_2_114 +glabel ASSET_TEX3D_114 .incbin "./build/us_1.0/textures/3d/unknown_2_114.bin" -glabel ASSET_2_115 +glabel ASSET_TEX3D_115 .incbin "./build/us_1.0/textures/3d/unknown_2_115.bin" -glabel ASSET_2_116 +glabel ASSET_TEX3D_116 .incbin "./build/us_1.0/textures/3d/unknown_2_116.bin" -glabel ASSET_2_117 +glabel ASSET_TEX3D_117 .incbin "./build/us_1.0/textures/3d/unknown_2_117.bin" -glabel ASSET_2_118 +glabel ASSET_TEX3D_118 .incbin "./build/us_1.0/textures/3d/unknown_2_118.bin" -glabel ASSET_2_119 +glabel ASSET_TEX3D_119 .incbin "./build/us_1.0/textures/3d/unknown_2_119.bin" -glabel ASSET_2_120 +glabel ASSET_TEX3D_120 .incbin "./build/us_1.0/textures/3d/unknown_2_120.bin" -glabel ASSET_2_121 +glabel ASSET_TEX3D_121 .incbin "./build/us_1.0/textures/3d/unknown_2_121.bin" -glabel ASSET_2_122 +glabel ASSET_TEX3D_122 .incbin "./build/us_1.0/textures/3d/unknown_2_122.bin" -glabel ASSET_2_123 +glabel ASSET_TEX3D_123 .incbin "./build/us_1.0/textures/3d/unknown_2_123.bin" -glabel ASSET_2_124 +glabel ASSET_TEX3D_124 .incbin "./build/us_1.0/textures/3d/unknown_2_124.bin" -glabel ASSET_2_125 +glabel ASSET_TEX3D_125 .incbin "./build/us_1.0/textures/3d/unknown_2_125.bin" -glabel ASSET_2_126 +glabel ASSET_TEX3D_126 .incbin "./build/us_1.0/textures/3d/unknown_2_126.bin" -glabel ASSET_2_127 +glabel ASSET_TEX3D_127 .incbin "./build/us_1.0/textures/3d/unknown_2_127.bin" -glabel ASSET_2_128 +glabel ASSET_TEX3D_128 .incbin "./build/us_1.0/textures/3d/unknown_2_128.bin" -glabel ASSET_2_129 +glabel ASSET_TEX3D_129 .incbin "./build/us_1.0/textures/3d/unknown_2_129.bin" -glabel ASSET_2_130 +glabel ASSET_TEX3D_130 .incbin "./build/us_1.0/textures/3d/unknown_2_130.bin" -glabel ASSET_2_131 +glabel ASSET_TEX3D_131 .incbin "./build/us_1.0/textures/3d/unknown_2_131.bin" -glabel ASSET_2_132 +glabel ASSET_TEX3D_132 .incbin "./build/us_1.0/textures/3d/unknown_2_132.bin" -glabel ASSET_2_133 +glabel ASSET_TEX3D_133 .incbin "./build/us_1.0/textures/3d/unknown_2_133.bin" -glabel ASSET_2_134 +glabel ASSET_TEX3D_134 .incbin "./build/us_1.0/textures/3d/unknown_2_134.bin" -glabel ASSET_2_135 +glabel ASSET_TEX3D_135 .incbin "./build/us_1.0/textures/3d/unknown_2_135.bin" -glabel ASSET_2_136 +glabel ASSET_TEX3D_136 .incbin "./build/us_1.0/textures/3d/unknown_2_136.bin" -glabel ASSET_2_137 +glabel ASSET_TEX3D_137 .incbin "./build/us_1.0/textures/3d/unknown_2_137.bin" -glabel ASSET_2_138 +glabel ASSET_TEX3D_138 .incbin "./build/us_1.0/textures/3d/unknown_2_138.bin" -glabel ASSET_2_139 +glabel ASSET_TEX3D_139 .incbin "./build/us_1.0/textures/3d/unknown_2_139.bin" -glabel ASSET_2_140 +glabel ASSET_TEX3D_140 .incbin "./build/us_1.0/textures/3d/unknown_2_140.bin" -glabel ASSET_2_141 +glabel ASSET_TEX3D_141 .incbin "./build/us_1.0/textures/3d/unknown_2_141.bin" -glabel ASSET_2_142 +glabel ASSET_TEX3D_142 .incbin "./build/us_1.0/textures/3d/unknown_2_142.bin" -glabel ASSET_2_143 +glabel ASSET_TEX3D_143 .incbin "./build/us_1.0/textures/3d/unknown_2_143.bin" -glabel ASSET_2_144 +glabel ASSET_TEX3D_144 .incbin "./build/us_1.0/textures/3d/unknown_2_144.bin" -glabel ASSET_2_145 +glabel ASSET_TEX3D_145 .incbin "./build/us_1.0/textures/3d/unknown_2_145.bin" -glabel ASSET_2_146 +glabel ASSET_TEX3D_146 .incbin "./build/us_1.0/textures/3d/unknown_2_146.bin" -glabel ASSET_2_147 +glabel ASSET_TEX3D_147 .incbin "./build/us_1.0/textures/3d/unknown_2_147.bin" -glabel ASSET_2_148 +glabel ASSET_TEX3D_148 .incbin "./build/us_1.0/textures/3d/unknown_2_148.bin" -glabel ASSET_2_149 +glabel ASSET_TEX3D_149 .incbin "./build/us_1.0/textures/3d/unknown_2_149.bin" -glabel ASSET_2_150 +glabel ASSET_TEX3D_150 .incbin "./build/us_1.0/textures/3d/unknown_2_150.bin" -glabel ASSET_2_151 +glabel ASSET_TEX3D_151 .incbin "./build/us_1.0/textures/3d/unknown_2_151.bin" -glabel ASSET_2_152 +glabel ASSET_TEX3D_152 .incbin "./build/us_1.0/textures/3d/unknown_2_152.bin" -glabel ASSET_2_153 +glabel ASSET_TEX3D_153 .incbin "./build/us_1.0/textures/3d/unknown_2_153.bin" -glabel ASSET_2_154 +glabel ASSET_TEX3D_154 .incbin "./build/us_1.0/textures/3d/unknown_2_154.bin" -glabel ASSET_2_155 +glabel ASSET_TEX3D_155 .incbin "./build/us_1.0/textures/3d/unknown_2_155.bin" -glabel ASSET_2_156 +glabel ASSET_TEX3D_156 .incbin "./build/us_1.0/textures/3d/unknown_2_156.bin" -glabel ASSET_2_157 +glabel ASSET_TEX3D_157 .incbin "./build/us_1.0/textures/3d/unknown_2_157.bin" -glabel ASSET_2_158 +glabel ASSET_TEX3D_158 .incbin "./build/us_1.0/textures/3d/unknown_2_158.bin" -glabel ASSET_2_159 +glabel ASSET_TEX3D_159 .incbin "./build/us_1.0/textures/3d/unknown_2_159.bin" -glabel ASSET_2_160 +glabel ASSET_TEX3D_160 .incbin "./build/us_1.0/textures/3d/unknown_2_160.bin" -glabel ASSET_2_161 +glabel ASSET_TEX3D_161 .incbin "./build/us_1.0/textures/3d/unknown_2_161.bin" -glabel ASSET_2_162 +glabel ASSET_TEX3D_162 .incbin "./build/us_1.0/textures/3d/unknown_2_162.bin" -glabel ASSET_2_163 +glabel ASSET_TEX3D_163 .incbin "./build/us_1.0/textures/3d/unknown_2_163.bin" -glabel ASSET_2_164 +glabel ASSET_TEX3D_164 .incbin "./build/us_1.0/textures/3d/unknown_2_164.bin" -glabel ASSET_2_165 +glabel ASSET_TEX3D_165 .incbin "./build/us_1.0/textures/3d/unknown_2_165.bin" -glabel ASSET_2_166 +glabel ASSET_TEX3D_166 .incbin "./build/us_1.0/textures/3d/unknown_2_166.bin" -glabel ASSET_2_167 +glabel ASSET_TEX3D_167 .incbin "./build/us_1.0/textures/3d/unknown_2_167.bin" -glabel ASSET_2_168 +glabel ASSET_TEX3D_168 .incbin "./build/us_1.0/textures/3d/unknown_2_168.bin" -glabel ASSET_2_169 +glabel ASSET_TEX3D_169 .incbin "./build/us_1.0/textures/3d/unknown_2_169.bin" -glabel ASSET_2_170 +glabel ASSET_TEX3D_170 .incbin "./build/us_1.0/textures/3d/unknown_2_170.bin" -glabel ASSET_2_171 +glabel ASSET_TEX3D_171 .incbin "./build/us_1.0/textures/3d/unknown_2_171.bin" -glabel ASSET_2_172 +glabel ASSET_TEX3D_172 .incbin "./build/us_1.0/textures/3d/unknown_2_172.bin" -glabel ASSET_2_173 +glabel ASSET_TEX3D_173 .incbin "./build/us_1.0/textures/3d/unknown_2_173.bin" -glabel ASSET_2_174 +glabel ASSET_TEX3D_174 .incbin "./build/us_1.0/textures/3d/unknown_2_174.bin" -glabel ASSET_2_175 +glabel ASSET_TEX3D_175 .incbin "./build/us_1.0/textures/3d/unknown_2_175.bin" -glabel ASSET_2_176 +glabel ASSET_TEX3D_176 .incbin "./build/us_1.0/textures/3d/unknown_2_176.bin" -glabel ASSET_2_177 +glabel ASSET_TEX3D_177 .incbin "./build/us_1.0/textures/3d/unknown_2_177.bin" -glabel ASSET_2_178 +glabel ASSET_TEX3D_178 .incbin "./build/us_1.0/textures/3d/unknown_2_178.bin" -glabel ASSET_2_179 +glabel ASSET_TEX3D_179 .incbin "./build/us_1.0/textures/3d/unknown_2_179.bin" -glabel ASSET_2_180 +glabel ASSET_TEX3D_180 .incbin "./build/us_1.0/textures/3d/unknown_2_180.bin" -glabel ASSET_2_181 +glabel ASSET_TEX3D_181 .incbin "./build/us_1.0/textures/3d/unknown_2_181.bin" -glabel ASSET_2_182 +glabel ASSET_TEX3D_182 .incbin "./build/us_1.0/textures/3d/unknown_2_182.bin" -glabel ASSET_2_183 +glabel ASSET_TEX3D_183 .incbin "./build/us_1.0/textures/3d/unknown_2_183.bin" -glabel ASSET_2_184 +glabel ASSET_TEX3D_184 .incbin "./build/us_1.0/textures/3d/unknown_2_184.bin" -glabel ASSET_2_185 +glabel ASSET_TEX3D_185 .incbin "./build/us_1.0/textures/3d/unknown_2_185.bin" -glabel ASSET_2_186 +glabel ASSET_TEX3D_186 .incbin "./build/us_1.0/textures/3d/unknown_2_186.bin" -glabel ASSET_2_187 +glabel ASSET_TEX3D_187 .incbin "./build/us_1.0/textures/3d/unknown_2_187.bin" -glabel ASSET_2_188 +glabel ASSET_TEX3D_188 .incbin "./build/us_1.0/textures/3d/unknown_2_188.bin" -glabel ASSET_2_189 +glabel ASSET_TEX3D_189 .incbin "./build/us_1.0/textures/3d/unknown_2_189.bin" -glabel ASSET_2_190 +glabel ASSET_TEX3D_190 .incbin "./build/us_1.0/textures/3d/unknown_2_190.bin" -glabel ASSET_2_191 +glabel ASSET_TEX3D_191 .incbin "./build/us_1.0/textures/3d/unknown_2_191.bin" -glabel ASSET_2_192 +glabel ASSET_TEX3D_192 .incbin "./build/us_1.0/textures/3d/unknown_2_192.bin" -glabel ASSET_2_193 +glabel ASSET_TEX3D_193 .incbin "./build/us_1.0/textures/3d/unknown_2_193.bin" -glabel ASSET_2_194 +glabel ASSET_TEX3D_194 .incbin "./build/us_1.0/textures/3d/unknown_2_194.bin" -glabel ASSET_2_195 +glabel ASSET_TEX3D_195 .incbin "./build/us_1.0/textures/3d/unknown_2_195.bin" -glabel ASSET_2_196 +glabel ASSET_TEX3D_196 .incbin "./build/us_1.0/textures/3d/unknown_2_196.bin" -glabel ASSET_2_197 +glabel ASSET_TEX3D_197 .incbin "./build/us_1.0/textures/3d/unknown_2_197.bin" -glabel ASSET_2_198 +glabel ASSET_TEX3D_198 .incbin "./build/us_1.0/textures/3d/unknown_2_198.bin" -glabel ASSET_2_199 +glabel ASSET_TEX3D_199 .incbin "./build/us_1.0/textures/3d/unknown_2_199.bin" -glabel ASSET_2_200 +glabel ASSET_TEX3D_200 .incbin "./build/us_1.0/textures/3d/unknown_2_200.bin" -glabel ASSET_2_201 +glabel ASSET_TEX3D_201 .incbin "./build/us_1.0/textures/3d/unknown_2_201.bin" -glabel ASSET_2_202 +glabel ASSET_TEX3D_202 .incbin "./build/us_1.0/textures/3d/unknown_2_202.bin" -glabel ASSET_2_203 +glabel ASSET_TEX3D_203 .incbin "./build/us_1.0/textures/3d/unknown_2_203.bin" -glabel ASSET_2_204 +glabel ASSET_TEX3D_204 .incbin "./build/us_1.0/textures/3d/unknown_2_204.bin" -glabel ASSET_2_205 +glabel ASSET_TEX3D_205 .incbin "./build/us_1.0/textures/3d/unknown_2_205.bin" -glabel ASSET_2_206 +glabel ASSET_TEX3D_206 .incbin "./build/us_1.0/textures/3d/unknown_2_206.bin" -glabel ASSET_2_207 +glabel ASSET_TEX3D_207 .incbin "./build/us_1.0/textures/3d/unknown_2_207.bin" -glabel ASSET_2_208 +glabel ASSET_TEX3D_208 .incbin "./build/us_1.0/textures/3d/unknown_2_208.bin" -glabel ASSET_2_209 +glabel ASSET_TEX3D_209 .incbin "./build/us_1.0/textures/3d/unknown_2_209.bin" -glabel ASSET_2_210 +glabel ASSET_TEX3D_210 .incbin "./build/us_1.0/textures/3d/unknown_2_210.bin" -glabel ASSET_2_211 +glabel ASSET_TEX3D_211 .incbin "./build/us_1.0/textures/3d/unknown_2_211.bin" -glabel ASSET_2_212 +glabel ASSET_TEX3D_212 .incbin "./build/us_1.0/textures/3d/unknown_2_212.bin" -glabel ASSET_2_213 +glabel ASSET_TEX3D_213 .incbin "./build/us_1.0/textures/3d/unknown_2_213.bin" -glabel ASSET_2_214 +glabel ASSET_TEX3D_214 .incbin "./build/us_1.0/textures/3d/unknown_2_214.bin" -glabel ASSET_2_215 +glabel ASSET_TEX3D_215 .incbin "./build/us_1.0/textures/3d/unknown_2_215.bin" -glabel ASSET_2_216 +glabel ASSET_TEX3D_216 .incbin "./build/us_1.0/textures/3d/unknown_2_216.bin" -glabel ASSET_2_217 +glabel ASSET_TEX3D_217 .incbin "./build/us_1.0/textures/3d/unknown_2_217.bin" -glabel ASSET_2_218 +glabel ASSET_TEX3D_218 .incbin "./build/us_1.0/textures/3d/unknown_2_218.bin" -glabel ASSET_2_219 +glabel ASSET_TEX3D_219 .incbin "./build/us_1.0/textures/3d/unknown_2_219.bin" -glabel ASSET_2_220 +glabel ASSET_TEX3D_220 .incbin "./build/us_1.0/textures/3d/unknown_2_220.bin" -glabel ASSET_2_221 +glabel ASSET_TEX3D_221 .incbin "./build/us_1.0/textures/3d/unknown_2_221.bin" -glabel ASSET_2_222 +glabel ASSET_TEX3D_222 .incbin "./build/us_1.0/textures/3d/unknown_2_222.bin" -glabel ASSET_2_223 +glabel ASSET_TEX3D_223 .incbin "./build/us_1.0/textures/3d/unknown_2_223.bin" -glabel ASSET_2_224 +glabel ASSET_TEX3D_224 .incbin "./build/us_1.0/textures/3d/unknown_2_224.bin" -glabel ASSET_2_225 +glabel ASSET_TEX3D_225 .incbin "./build/us_1.0/textures/3d/unknown_2_225.bin" -glabel ASSET_2_226 +glabel ASSET_TEX3D_226 .incbin "./build/us_1.0/textures/3d/unknown_2_226.bin" -glabel ASSET_2_227 +glabel ASSET_TEX3D_227 .incbin "./build/us_1.0/textures/3d/unknown_2_227.bin" -glabel ASSET_2_228 +glabel ASSET_TEX3D_228 .incbin "./build/us_1.0/textures/3d/unknown_2_228.bin" -glabel ASSET_2_229 +glabel ASSET_TEX3D_229 .incbin "./build/us_1.0/textures/3d/unknown_2_229.bin" -glabel ASSET_2_230 +glabel ASSET_TEX3D_230 .incbin "./build/us_1.0/textures/3d/unknown_2_230.bin" -glabel ASSET_2_231 +glabel ASSET_TEX3D_231 .incbin "./build/us_1.0/textures/3d/unknown_2_231.bin" -glabel ASSET_2_232 +glabel ASSET_TEX3D_232 .incbin "./build/us_1.0/textures/3d/unknown_2_232.bin" -glabel ASSET_2_233 +glabel ASSET_TEX3D_233 .incbin "./build/us_1.0/textures/3d/unknown_2_233.bin" -glabel ASSET_2_234 +glabel ASSET_TEX3D_234 .incbin "./build/us_1.0/textures/3d/unknown_2_234.bin" -glabel ASSET_2_235 +glabel ASSET_TEX3D_235 .incbin "./build/us_1.0/textures/3d/unknown_2_235.bin" -glabel ASSET_2_236 +glabel ASSET_TEX3D_236 .incbin "./build/us_1.0/textures/3d/unknown_2_236.bin" -glabel ASSET_2_237 +glabel ASSET_TEX3D_237 .incbin "./build/us_1.0/textures/3d/unknown_2_237.bin" -glabel ASSET_2_238 +glabel ASSET_TEX3D_238 .incbin "./build/us_1.0/textures/3d/unknown_2_238.bin" -glabel ASSET_2_239 +glabel ASSET_TEX3D_239 .incbin "./build/us_1.0/textures/3d/unknown_2_239.bin" -glabel ASSET_2_240 +glabel ASSET_TEX3D_240 .incbin "./build/us_1.0/textures/3d/unknown_2_240.bin" -glabel ASSET_2_241 +glabel ASSET_TEX3D_241 .incbin "./build/us_1.0/textures/3d/unknown_2_241.bin" -glabel ASSET_2_242 +glabel ASSET_TEX3D_242 .incbin "./build/us_1.0/textures/3d/unknown_2_242.bin" -glabel ASSET_2_243 +glabel ASSET_TEX3D_243 .incbin "./build/us_1.0/textures/3d/unknown_2_243.bin" -glabel ASSET_2_244 +glabel ASSET_TEX3D_244 .incbin "./build/us_1.0/textures/3d/unknown_2_244.bin" -glabel ASSET_2_245 +glabel ASSET_TEX3D_245 .incbin "./build/us_1.0/textures/3d/unknown_2_245.bin" -glabel ASSET_2_246 +glabel ASSET_TEX3D_246 .incbin "./build/us_1.0/textures/3d/unknown_2_246.bin" -glabel ASSET_2_247 +glabel ASSET_TEX3D_247 .incbin "./build/us_1.0/textures/3d/unknown_2_247.bin" -glabel ASSET_2_248 +glabel ASSET_TEX3D_248 .incbin "./build/us_1.0/textures/3d/unknown_2_248.bin" -glabel ASSET_2_249 +glabel ASSET_TEX3D_249 .incbin "./build/us_1.0/textures/3d/unknown_2_249.bin" -glabel ASSET_2_250 +glabel ASSET_TEX3D_250 .incbin "./build/us_1.0/textures/3d/unknown_2_250.bin" -glabel ASSET_2_251 +glabel ASSET_TEX3D_251 .incbin "./build/us_1.0/textures/3d/unknown_2_251.bin" -glabel ASSET_2_252 +glabel ASSET_TEX3D_252 .incbin "./build/us_1.0/textures/3d/unknown_2_252.bin" -glabel ASSET_2_253 +glabel ASSET_TEX3D_253 .incbin "./build/us_1.0/textures/3d/unknown_2_253.bin" -glabel ASSET_2_254 +glabel ASSET_TEX3D_254 .incbin "./build/us_1.0/textures/3d/unknown_2_254.bin" -glabel ASSET_2_255 +glabel ASSET_TEX3D_255 .incbin "./build/us_1.0/textures/3d/unknown_2_255.bin" -glabel ASSET_2_256 +glabel ASSET_TEX3D_256 .incbin "./build/us_1.0/textures/3d/unknown_2_256.bin" -glabel ASSET_2_257 +glabel ASSET_TEX3D_257 .incbin "./build/us_1.0/textures/3d/unknown_2_257.bin" -glabel ASSET_2_258 +glabel ASSET_TEX3D_258 .incbin "./build/us_1.0/textures/3d/unknown_2_258.bin" -glabel ASSET_2_259 +glabel ASSET_TEX3D_259 .incbin "./build/us_1.0/textures/3d/unknown_2_259.bin" -glabel ASSET_2_260 +glabel ASSET_TEX3D_260 .incbin "./build/us_1.0/textures/3d/unknown_2_260.bin" -glabel ASSET_2_261 +glabel ASSET_TEX3D_261 .incbin "./build/us_1.0/textures/3d/unknown_2_261.bin" -glabel ASSET_2_262 +glabel ASSET_TEX3D_262 .incbin "./build/us_1.0/textures/3d/unknown_2_262.bin" -glabel ASSET_2_263 +glabel ASSET_TEX3D_263 .incbin "./build/us_1.0/textures/3d/unknown_2_263.bin" -glabel ASSET_2_264 +glabel ASSET_TEX3D_264 .incbin "./build/us_1.0/textures/3d/unknown_2_264.bin" -glabel ASSET_2_265 +glabel ASSET_TEX3D_265 .incbin "./build/us_1.0/textures/3d/unknown_2_265.bin" -glabel ASSET_2_266 +glabel ASSET_TEX3D_266 .incbin "./build/us_1.0/textures/3d/unknown_2_266.bin" -glabel ASSET_2_267 +glabel ASSET_TEX3D_267 .incbin "./build/us_1.0/textures/3d/unknown_2_267.bin" -glabel ASSET_2_268 +glabel ASSET_TEX3D_268 .incbin "./build/us_1.0/textures/3d/unknown_2_268.bin" -glabel ASSET_2_269 +glabel ASSET_TEX3D_269 .incbin "./build/us_1.0/textures/3d/unknown_2_269.bin" -glabel ASSET_2_270 +glabel ASSET_TEX3D_270 .incbin "./build/us_1.0/textures/3d/unknown_2_270.bin" -glabel ASSET_2_271 +glabel ASSET_TEX3D_271 .incbin "./build/us_1.0/textures/3d/unknown_2_271.bin" -glabel ASSET_2_272 +glabel ASSET_TEX3D_272 .incbin "./build/us_1.0/textures/3d/unknown_2_272.bin" -glabel ASSET_2_273 +glabel ASSET_TEX3D_273 .incbin "./build/us_1.0/textures/3d/unknown_2_273.bin" -glabel ASSET_2_274 +glabel ASSET_TEX3D_274 .incbin "./build/us_1.0/textures/3d/unknown_2_274.bin" -glabel ASSET_2_275 +glabel ASSET_TEX3D_275 .incbin "./build/us_1.0/textures/3d/unknown_2_275.bin" -glabel ASSET_2_276 +glabel ASSET_TEX3D_276 .incbin "./build/us_1.0/textures/3d/unknown_2_276.bin" -glabel ASSET_2_277 +glabel ASSET_TEX3D_277 .incbin "./build/us_1.0/textures/3d/unknown_2_277.bin" -glabel ASSET_2_278 +glabel ASSET_TEX3D_278 .incbin "./build/us_1.0/textures/3d/unknown_2_278.bin" -glabel ASSET_2_279 +glabel ASSET_TEX3D_279 .incbin "./build/us_1.0/textures/3d/unknown_2_279.bin" -glabel ASSET_2_280 +glabel ASSET_TEX3D_280 .incbin "./build/us_1.0/textures/3d/unknown_2_280.bin" -glabel ASSET_2_281 +glabel ASSET_TEX3D_281 .incbin "./build/us_1.0/textures/3d/unknown_2_281.bin" -glabel ASSET_2_282 +glabel ASSET_TEX3D_282 .incbin "./build/us_1.0/textures/3d/unknown_2_282.bin" -glabel ASSET_2_283 +glabel ASSET_TEX3D_283 .incbin "./build/us_1.0/textures/3d/unknown_2_283.bin" -glabel ASSET_2_284 +glabel ASSET_TEX3D_284 .incbin "./build/us_1.0/textures/3d/unknown_2_284.bin" -glabel ASSET_2_285 +glabel ASSET_TEX3D_285 .incbin "./build/us_1.0/textures/3d/unknown_2_285.bin" -glabel ASSET_2_286 +glabel ASSET_TEX3D_286 .incbin "./build/us_1.0/textures/3d/unknown_2_286.bin" -glabel ASSET_2_287 +glabel ASSET_TEX3D_287 .incbin "./build/us_1.0/textures/3d/unknown_2_287.bin" -glabel ASSET_2_288 +glabel ASSET_TEX3D_288 .incbin "./build/us_1.0/textures/3d/unknown_2_288.bin" -glabel ASSET_2_289 +glabel ASSET_TEX3D_289 .incbin "./build/us_1.0/textures/3d/unknown_2_289.bin" -glabel ASSET_2_290 +glabel ASSET_TEX3D_290 .incbin "./build/us_1.0/textures/3d/unknown_2_290.bin" -glabel ASSET_2_291 +glabel ASSET_TEX3D_291 .incbin "./build/us_1.0/textures/3d/unknown_2_291.bin" -glabel ASSET_2_292 +glabel ASSET_TEX3D_292 .incbin "./build/us_1.0/textures/3d/unknown_2_292.bin" -glabel ASSET_2_293 +glabel ASSET_TEX3D_293 .incbin "./build/us_1.0/textures/3d/unknown_2_293.bin" -glabel ASSET_2_294 +glabel ASSET_TEX3D_294 .incbin "./build/us_1.0/textures/3d/unknown_2_294.bin" -glabel ASSET_2_295 +glabel ASSET_TEX3D_295 .incbin "./build/us_1.0/textures/3d/unknown_2_295.bin" -glabel ASSET_2_296 +glabel ASSET_TEX3D_296 .incbin "./build/us_1.0/textures/3d/unknown_2_296.bin" -glabel ASSET_2_297 +glabel ASSET_TEX3D_297 .incbin "./build/us_1.0/textures/3d/unknown_2_297.bin" -glabel ASSET_2_298 +glabel ASSET_TEX3D_298 .incbin "./build/us_1.0/textures/3d/unknown_2_298.bin" -glabel ASSET_2_299 +glabel ASSET_TEX3D_299 .incbin "./build/us_1.0/textures/3d/unknown_2_299.bin" -glabel ASSET_2_300 +glabel ASSET_TEX3D_300 .incbin "./build/us_1.0/textures/3d/unknown_2_300.bin" -glabel ASSET_2_301 +glabel ASSET_TEX3D_301 .incbin "./build/us_1.0/textures/3d/unknown_2_301.bin" -glabel ASSET_2_302 +glabel ASSET_TEX3D_302 .incbin "./build/us_1.0/textures/3d/unknown_2_302.bin" -glabel ASSET_2_303 +glabel ASSET_TEX3D_303 .incbin "./build/us_1.0/textures/3d/unknown_2_303.bin" -glabel ASSET_2_304 +glabel ASSET_TEX3D_304 .incbin "./build/us_1.0/textures/3d/unknown_2_304.bin" -glabel ASSET_2_305 +glabel ASSET_TEX3D_305 .incbin "./build/us_1.0/textures/3d/unknown_2_305.bin" -glabel ASSET_2_306 +glabel ASSET_TEX3D_306 .incbin "./build/us_1.0/textures/3d/unknown_2_306.bin" -glabel ASSET_2_307 +glabel ASSET_TEX3D_307 .incbin "./build/us_1.0/textures/3d/unknown_2_307.bin" -glabel ASSET_2_308 +glabel ASSET_TEX3D_308 .incbin "./build/us_1.0/textures/3d/unknown_2_308.bin" -glabel ASSET_2_309 +glabel ASSET_TEX3D_309 .incbin "./build/us_1.0/textures/3d/unknown_2_309.bin" -glabel ASSET_2_310 +glabel ASSET_TEX3D_310 .incbin "./build/us_1.0/textures/3d/unknown_2_310.bin" -glabel ASSET_2_311 +glabel ASSET_TEX3D_311 .incbin "./build/us_1.0/textures/3d/unknown_2_311.bin" -glabel ASSET_2_312 +glabel ASSET_TEX3D_312 .incbin "./build/us_1.0/textures/3d/unknown_2_312.bin" -glabel ASSET_2_313 +glabel ASSET_TEX3D_313 .incbin "./build/us_1.0/textures/3d/unknown_2_313.bin" -glabel ASSET_2_314 +glabel ASSET_TEX3D_314 .incbin "./build/us_1.0/textures/3d/unknown_2_314.bin" -glabel ASSET_2_315 +glabel ASSET_TEX3D_315 .incbin "./build/us_1.0/textures/3d/unknown_2_315.bin" -glabel ASSET_2_316 +glabel ASSET_TEX3D_316 .incbin "./build/us_1.0/textures/3d/unknown_2_316.bin" -glabel ASSET_2_317 +glabel ASSET_TEX3D_317 .incbin "./build/us_1.0/textures/3d/unknown_2_317.bin" -glabel ASSET_2_318 +glabel ASSET_TEX3D_318 .incbin "./build/us_1.0/textures/3d/unknown_2_318.bin" -glabel ASSET_2_319 +glabel ASSET_TEX3D_319 .incbin "./build/us_1.0/textures/3d/unknown_2_319.bin" -glabel ASSET_2_320 +glabel ASSET_TEX3D_320 .incbin "./build/us_1.0/textures/3d/unknown_2_320.bin" -glabel ASSET_2_321 +glabel ASSET_TEX3D_321 .incbin "./build/us_1.0/textures/3d/unknown_2_321.bin" -glabel ASSET_2_322 +glabel ASSET_TEX3D_322 .incbin "./build/us_1.0/textures/3d/unknown_2_322.bin" -glabel ASSET_2_323 +glabel ASSET_TEX3D_323 .incbin "./build/us_1.0/textures/3d/unknown_2_323.bin" -glabel ASSET_2_324 +glabel ASSET_TEX3D_324 .incbin "./build/us_1.0/textures/3d/unknown_2_324.bin" -glabel ASSET_2_325 +glabel ASSET_TEX3D_325 .incbin "./build/us_1.0/textures/3d/unknown_2_325.bin" -glabel ASSET_2_326 +glabel ASSET_TEX3D_326 .incbin "./build/us_1.0/textures/3d/unknown_2_326.bin" -glabel ASSET_2_327 +glabel ASSET_TEX3D_327 .incbin "./build/us_1.0/textures/3d/unknown_2_327.bin" -glabel ASSET_2_328 +glabel ASSET_TEX3D_328 .incbin "./build/us_1.0/textures/3d/unknown_2_328.bin" -glabel ASSET_2_329 +glabel ASSET_TEX3D_329 .incbin "./build/us_1.0/textures/3d/unknown_2_329.bin" -glabel ASSET_2_330 +glabel ASSET_TEX3D_330 .incbin "./build/us_1.0/textures/3d/unknown_2_330.bin" -glabel ASSET_2_331 +glabel ASSET_TEX3D_331 .incbin "./build/us_1.0/textures/3d/unknown_2_331.bin" -glabel ASSET_2_332 +glabel ASSET_TEX3D_332 .incbin "./build/us_1.0/textures/3d/unknown_2_332.bin" -glabel ASSET_2_333 +glabel ASSET_TEX3D_333 .incbin "./build/us_1.0/textures/3d/unknown_2_333.bin" -glabel ASSET_2_334 +glabel ASSET_TEX3D_334 .incbin "./build/us_1.0/textures/3d/unknown_2_334.bin" -glabel ASSET_2_335 +glabel ASSET_TEX3D_335 .incbin "./build/us_1.0/textures/3d/unknown_2_335.bin" -glabel ASSET_2_336 +glabel ASSET_TEX3D_336 .incbin "./build/us_1.0/textures/3d/unknown_2_336.bin" -glabel ASSET_2_337 +glabel ASSET_TEX3D_337 .incbin "./build/us_1.0/textures/3d/unknown_2_337.bin" -glabel ASSET_2_338 +glabel ASSET_TEX3D_338 .incbin "./build/us_1.0/textures/3d/unknown_2_338.bin" -glabel ASSET_2_339 +glabel ASSET_TEX3D_339 .incbin "./build/us_1.0/textures/3d/unknown_2_339.bin" -glabel ASSET_2_340 +glabel ASSET_TEX3D_340 .incbin "./build/us_1.0/textures/3d/unknown_2_340.bin" -glabel ASSET_2_341 +glabel ASSET_TEX3D_341 .incbin "./build/us_1.0/textures/3d/unknown_2_341.bin" -glabel ASSET_2_342 +glabel ASSET_TEX3D_342 .incbin "./build/us_1.0/textures/3d/unknown_2_342.bin" -glabel ASSET_2_343 +glabel ASSET_TEX3D_343 .incbin "./build/us_1.0/textures/3d/unknown_2_343.bin" -glabel ASSET_2_344 +glabel ASSET_TEX3D_344 .incbin "./build/us_1.0/textures/3d/unknown_2_344.bin" -glabel ASSET_2_345 +glabel ASSET_TEX3D_345 .incbin "./build/us_1.0/textures/3d/unknown_2_345.bin" -glabel ASSET_2_346 +glabel ASSET_TEX3D_346 .incbin "./build/us_1.0/textures/3d/unknown_2_346.bin" -glabel ASSET_2_347 +glabel ASSET_TEX3D_347 .incbin "./build/us_1.0/textures/3d/unknown_2_347.bin" -glabel ASSET_2_348 +glabel ASSET_TEX3D_348 .incbin "./build/us_1.0/textures/3d/unknown_2_348.bin" -glabel ASSET_2_349 +glabel ASSET_TEX3D_349 .incbin "./build/us_1.0/textures/3d/unknown_2_349.bin" -glabel ASSET_2_350 +glabel ASSET_TEX3D_350 .incbin "./build/us_1.0/textures/3d/unknown_2_350.bin" -glabel ASSET_2_351 +glabel ASSET_TEX3D_351 .incbin "./build/us_1.0/textures/3d/unknown_2_351.bin" -glabel ASSET_2_352 +glabel ASSET_TEX3D_352 .incbin "./build/us_1.0/textures/3d/unknown_2_352.bin" -glabel ASSET_2_353 +glabel ASSET_TEX3D_353 .incbin "./build/us_1.0/textures/3d/unknown_2_353.bin" -glabel ASSET_2_354 +glabel ASSET_TEX3D_354 .incbin "./build/us_1.0/textures/3d/unknown_2_354.bin" -glabel ASSET_2_355 +glabel ASSET_TEX3D_355 .incbin "./build/us_1.0/textures/3d/unknown_2_355.bin" -glabel ASSET_2_356 +glabel ASSET_TEX3D_356 .incbin "./build/us_1.0/textures/3d/unknown_2_356.bin" -glabel ASSET_2_357 +glabel ASSET_TEX3D_357 .incbin "./build/us_1.0/textures/3d/unknown_2_357.bin" -glabel ASSET_2_358 +glabel ASSET_TEX3D_358 .incbin "./build/us_1.0/textures/3d/unknown_2_358.bin" -glabel ASSET_2_359 +glabel ASSET_TEX3D_359 .incbin "./build/us_1.0/textures/3d/unknown_2_359.bin" -glabel ASSET_2_360 +glabel ASSET_TEX3D_360 .incbin "./build/us_1.0/textures/3d/unknown_2_360.bin" -glabel ASSET_2_361 +glabel ASSET_TEX3D_361 .incbin "./build/us_1.0/textures/3d/unknown_2_361.bin" -glabel ASSET_2_362 +glabel ASSET_TEX3D_362 .incbin "./build/us_1.0/textures/3d/unknown_2_362.bin" -glabel ASSET_2_363 +glabel ASSET_TEX3D_363 .incbin "./build/us_1.0/textures/3d/unknown_2_363.bin" -glabel ASSET_2_364 +glabel ASSET_TEX3D_364 .incbin "./build/us_1.0/textures/3d/unknown_2_364.bin" -glabel ASSET_2_365 +glabel ASSET_TEX3D_365 .incbin "./build/us_1.0/textures/3d/unknown_2_365.bin" -glabel ASSET_2_366 +glabel ASSET_TEX3D_366 .incbin "./build/us_1.0/textures/3d/unknown_2_366.bin" -glabel ASSET_2_367 +glabel ASSET_TEX3D_367 .incbin "./build/us_1.0/textures/3d/unknown_2_367.bin" -glabel ASSET_2_368 +glabel ASSET_TEX3D_368 .incbin "./build/us_1.0/textures/3d/unknown_2_368.bin" -glabel ASSET_2_369 +glabel ASSET_TEX3D_369 .incbin "./build/us_1.0/textures/3d/unknown_2_369.bin" -glabel ASSET_2_370 +glabel ASSET_TEX3D_370 .incbin "./build/us_1.0/textures/3d/unknown_2_370.bin" -glabel ASSET_2_371 +glabel ASSET_TEX3D_371 .incbin "./build/us_1.0/textures/3d/unknown_2_371.bin" -glabel ASSET_2_372 +glabel ASSET_TEX3D_372 .incbin "./build/us_1.0/textures/3d/unknown_2_372.bin" -glabel ASSET_2_373 +glabel ASSET_TEX3D_373 .incbin "./build/us_1.0/textures/3d/unknown_2_373.bin" -glabel ASSET_2_374 +glabel ASSET_TEX3D_374 .incbin "./build/us_1.0/textures/3d/unknown_2_374.bin" -glabel ASSET_2_375 +glabel ASSET_TEX3D_375 .incbin "./build/us_1.0/textures/3d/unknown_2_375.bin" -glabel ASSET_2_376 +glabel ASSET_TEX3D_376 .incbin "./build/us_1.0/textures/3d/unknown_2_376.bin" -glabel ASSET_2_377 +glabel ASSET_TEX3D_377 .incbin "./build/us_1.0/textures/3d/unknown_2_377.bin" -glabel ASSET_2_378 +glabel ASSET_TEX3D_378 .incbin "./build/us_1.0/textures/3d/unknown_2_378.bin" -glabel ASSET_2_379 +glabel ASSET_TEX3D_379 .incbin "./build/us_1.0/textures/3d/unknown_2_379.bin" -glabel ASSET_2_380 +glabel ASSET_TEX3D_380 .incbin "./build/us_1.0/textures/3d/unknown_2_380.bin" -glabel ASSET_2_381 +glabel ASSET_TEX3D_381 .incbin "./build/us_1.0/textures/3d/unknown_2_381.bin" -glabel ASSET_2_382 +glabel ASSET_TEX3D_382 .incbin "./build/us_1.0/textures/3d/unknown_2_382.bin" -glabel ASSET_2_383 +glabel ASSET_TEX3D_383 .incbin "./build/us_1.0/textures/3d/unknown_2_383.bin" -glabel ASSET_2_384 +glabel ASSET_TEX3D_384 .incbin "./build/us_1.0/textures/3d/unknown_2_384.bin" -glabel ASSET_2_385 +glabel ASSET_TEX3D_385 .incbin "./build/us_1.0/textures/3d/unknown_2_385.bin" -glabel ASSET_2_386 +glabel ASSET_TEX3D_386 .incbin "./build/us_1.0/textures/3d/unknown_2_386.bin" -glabel ASSET_2_387 +glabel ASSET_TEX3D_387 .incbin "./build/us_1.0/textures/3d/unknown_2_387.bin" -glabel ASSET_2_388 +glabel ASSET_TEX3D_388 .incbin "./build/us_1.0/textures/3d/unknown_2_388.bin" -glabel ASSET_2_389 +glabel ASSET_TEX3D_389 .incbin "./build/us_1.0/textures/3d/unknown_2_389.bin" -glabel ASSET_2_390 +glabel ASSET_TEX3D_390 .incbin "./build/us_1.0/textures/3d/unknown_2_390.bin" -glabel ASSET_2_391 +glabel ASSET_TEX3D_391 .incbin "./build/us_1.0/textures/3d/unknown_2_391.bin" -glabel ASSET_2_392 +glabel ASSET_TEX3D_392 .incbin "./build/us_1.0/textures/3d/unknown_2_392.bin" -glabel ASSET_2_393 +glabel ASSET_TEX3D_393 .incbin "./build/us_1.0/textures/3d/unknown_2_393.bin" -glabel ASSET_2_394 +glabel ASSET_TEX3D_394 .incbin "./build/us_1.0/textures/3d/unknown_2_394.bin" -glabel ASSET_2_395 +glabel ASSET_TEX3D_395 .incbin "./build/us_1.0/textures/3d/unknown_2_395.bin" -glabel ASSET_2_396 +glabel ASSET_TEX3D_396 .incbin "./build/us_1.0/textures/3d/unknown_2_396.bin" -glabel ASSET_2_397 +glabel ASSET_TEX3D_397 .incbin "./build/us_1.0/textures/3d/unknown_2_397.bin" -glabel ASSET_2_398 +glabel ASSET_TEX3D_398 .incbin "./build/us_1.0/textures/3d/unknown_2_398.bin" -glabel ASSET_2_399 +glabel ASSET_TEX3D_399 .incbin "./build/us_1.0/textures/3d/unknown_2_399.bin" -glabel ASSET_2_400 +glabel ASSET_TEX3D_400 .incbin "./build/us_1.0/textures/3d/unknown_2_400.bin" -glabel ASSET_2_401 +glabel ASSET_TEX3D_401 .incbin "./build/us_1.0/textures/3d/unknown_2_401.bin" -glabel ASSET_2_402 +glabel ASSET_TEX3D_402 .incbin "./build/us_1.0/textures/3d/unknown_2_402.bin" -glabel ASSET_2_403 +glabel ASSET_TEX3D_403 .incbin "./build/us_1.0/textures/3d/unknown_2_403.bin" -glabel ASSET_2_404 +glabel ASSET_TEX3D_404 .incbin "./build/us_1.0/textures/3d/unknown_2_404.bin" -glabel ASSET_2_405 +glabel ASSET_TEX3D_405 .incbin "./build/us_1.0/textures/3d/unknown_2_405.bin" -glabel ASSET_2_406 +glabel ASSET_TEX3D_406 .incbin "./build/us_1.0/textures/3d/unknown_2_406.bin" -glabel ASSET_2_407 +glabel ASSET_TEX3D_407 .incbin "./build/us_1.0/textures/3d/unknown_2_407.bin" -glabel ASSET_2_408 +glabel ASSET_TEX3D_408 .incbin "./build/us_1.0/textures/3d/unknown_2_408.bin" -glabel ASSET_2_409 +glabel ASSET_TEX3D_409 .incbin "./build/us_1.0/textures/3d/unknown_2_409.bin" -glabel ASSET_2_410 +glabel ASSET_TEX3D_410 .incbin "./build/us_1.0/textures/3d/unknown_2_410.bin" -glabel ASSET_2_411 +glabel ASSET_TEX3D_411 .incbin "./build/us_1.0/textures/3d/unknown_2_411.bin" -glabel ASSET_2_412 +glabel ASSET_TEX3D_412 .incbin "./build/us_1.0/textures/3d/unknown_2_412.bin" -glabel ASSET_2_413 +glabel ASSET_TEX3D_413 .incbin "./build/us_1.0/textures/3d/unknown_2_413.bin" -glabel ASSET_2_414 +glabel ASSET_TEX3D_414 .incbin "./build/us_1.0/textures/3d/unknown_2_414.bin" -glabel ASSET_2_415 +glabel ASSET_TEX3D_415 .incbin "./build/us_1.0/textures/3d/unknown_2_415.bin" -glabel ASSET_2_416 +glabel ASSET_TEX3D_416 .incbin "./build/us_1.0/textures/3d/unknown_2_416.bin" -glabel ASSET_2_417 +glabel ASSET_TEX3D_417 .incbin "./build/us_1.0/textures/3d/unknown_2_417.bin" -glabel ASSET_2_418 +glabel ASSET_TEX3D_418 .incbin "./build/us_1.0/textures/3d/unknown_2_418.bin" -glabel ASSET_2_419 +glabel ASSET_TEX3D_419 .incbin "./build/us_1.0/textures/3d/unknown_2_419.bin" -glabel ASSET_2_420 +glabel ASSET_TEX3D_420 .incbin "./build/us_1.0/textures/3d/unknown_2_420.bin" -glabel ASSET_2_421 +glabel ASSET_TEX3D_421 .incbin "./build/us_1.0/textures/3d/unknown_2_421.bin" -glabel ASSET_2_422 +glabel ASSET_TEX3D_422 .incbin "./build/us_1.0/textures/3d/unknown_2_422.bin" -glabel ASSET_2_423 +glabel ASSET_TEX3D_423 .incbin "./build/us_1.0/textures/3d/unknown_2_423.bin" -glabel ASSET_2_424 +glabel ASSET_TEX3D_424 .incbin "./build/us_1.0/textures/3d/unknown_2_424.bin" -glabel ASSET_2_425 +glabel ASSET_TEX3D_425 .incbin "./build/us_1.0/textures/3d/unknown_2_425.bin" -glabel ASSET_2_426 +glabel ASSET_TEX3D_426 .incbin "./build/us_1.0/textures/3d/unknown_2_426.bin" -glabel ASSET_2_427 +glabel ASSET_TEX3D_427 .incbin "./build/us_1.0/textures/3d/unknown_2_427.bin" -glabel ASSET_2_428 +glabel ASSET_TEX3D_428 .incbin "./build/us_1.0/textures/3d/unknown_2_428.bin" -glabel ASSET_2_429 +glabel ASSET_TEX3D_429 .incbin "./build/us_1.0/textures/3d/unknown_2_429.bin" -glabel ASSET_2_430 +glabel ASSET_TEX3D_430 .incbin "./build/us_1.0/textures/3d/unknown_2_430.bin" -glabel ASSET_2_431 +glabel ASSET_TEX3D_431 .incbin "./build/us_1.0/textures/3d/unknown_2_431.bin" -glabel ASSET_2_432 +glabel ASSET_TEX3D_432 .incbin "./build/us_1.0/textures/3d/unknown_2_432.bin" -glabel ASSET_2_433 +glabel ASSET_TEX3D_433 .incbin "./build/us_1.0/textures/3d/unknown_2_433.bin" -glabel ASSET_2_434 +glabel ASSET_TEX3D_434 .incbin "./build/us_1.0/textures/3d/unknown_2_434.bin" -glabel ASSET_2_435 +glabel ASSET_TEX3D_435 .incbin "./build/us_1.0/textures/3d/unknown_2_435.bin" -glabel ASSET_2_436 +glabel ASSET_TEX3D_436 .incbin "./build/us_1.0/textures/3d/unknown_2_436.bin" -glabel ASSET_2_437 +glabel ASSET_TEX3D_437 .incbin "./build/us_1.0/textures/3d/unknown_2_437.bin" -glabel ASSET_2_438 +glabel ASSET_TEX3D_438 .incbin "./build/us_1.0/textures/3d/unknown_2_438.bin" -glabel ASSET_2_439 +glabel ASSET_TEX3D_439 .incbin "./build/us_1.0/textures/3d/unknown_2_439.bin" -glabel ASSET_2_440 +glabel ASSET_TEX3D_440 .incbin "./build/us_1.0/textures/3d/unknown_2_440.bin" -glabel ASSET_2_441 +glabel ASSET_TEX3D_441 .incbin "./build/us_1.0/textures/3d/unknown_2_441.bin" -glabel ASSET_2_442 +glabel ASSET_TEX3D_442 .incbin "./build/us_1.0/textures/3d/unknown_2_442.bin" -glabel ASSET_2_443 +glabel ASSET_TEX3D_443 .incbin "./build/us_1.0/textures/3d/unknown_2_443.bin" -glabel ASSET_2_444 +glabel ASSET_TEX3D_444 .incbin "./build/us_1.0/textures/3d/unknown_2_444.bin" -glabel ASSET_2_445 +glabel ASSET_TEX3D_445 .incbin "./build/us_1.0/textures/3d/unknown_2_445.bin" -glabel ASSET_2_446 +glabel ASSET_TEX3D_446 .incbin "./build/us_1.0/textures/3d/unknown_2_446.bin" -glabel ASSET_2_447 +glabel ASSET_TEX3D_447 .incbin "./build/us_1.0/textures/3d/unknown_2_447.bin" -glabel ASSET_2_448 +glabel ASSET_TEX3D_448 .incbin "./build/us_1.0/textures/3d/unknown_2_448.bin" -glabel ASSET_2_449 +glabel ASSET_TEX3D_449 .incbin "./build/us_1.0/textures/3d/unknown_2_449.bin" -glabel ASSET_2_450 +glabel ASSET_TEX3D_450 .incbin "./build/us_1.0/textures/3d/unknown_2_450.bin" -glabel ASSET_2_451 +glabel ASSET_TEX3D_451 .incbin "./build/us_1.0/textures/3d/unknown_2_451.bin" -glabel ASSET_2_452 +glabel ASSET_TEX3D_452 .incbin "./build/us_1.0/textures/3d/unknown_2_452.bin" -glabel ASSET_2_453 +glabel ASSET_TEX3D_453 .incbin "./build/us_1.0/textures/3d/unknown_2_453.bin" -glabel ASSET_2_454 +glabel ASSET_TEX3D_454 .incbin "./build/us_1.0/textures/3d/unknown_2_454.bin" -glabel ASSET_2_455 +glabel ASSET_TEX3D_455 .incbin "./build/us_1.0/textures/3d/unknown_2_455.bin" -glabel ASSET_2_456 +glabel ASSET_TEX3D_456 .incbin "./build/us_1.0/textures/3d/unknown_2_456.bin" -glabel ASSET_2_457 +glabel ASSET_TEX3D_457 .incbin "./build/us_1.0/textures/3d/unknown_2_457.bin" -glabel ASSET_2_458 +glabel ASSET_TEX3D_458 .incbin "./build/us_1.0/textures/3d/unknown_2_458.bin" -glabel ASSET_2_459 +glabel ASSET_TEX3D_459 .incbin "./build/us_1.0/textures/3d/unknown_2_459.bin" -glabel ASSET_2_460 +glabel ASSET_TEX3D_460 .incbin "./build/us_1.0/textures/3d/unknown_2_460.bin" -glabel ASSET_2_461 +glabel ASSET_TEX3D_461 .incbin "./build/us_1.0/textures/3d/unknown_2_461.bin" -glabel ASSET_2_462 +glabel ASSET_TEX3D_462 .incbin "./build/us_1.0/textures/3d/unknown_2_462.bin" -glabel ASSET_2_463 +glabel ASSET_TEX3D_463 .incbin "./build/us_1.0/textures/3d/unknown_2_463.bin" -glabel ASSET_2_464 +glabel ASSET_TEX3D_464 .incbin "./build/us_1.0/textures/3d/unknown_2_464.bin" -glabel ASSET_2_465 +glabel ASSET_TEX3D_465 .incbin "./build/us_1.0/textures/3d/unknown_2_465.bin" -glabel ASSET_2_466 +glabel ASSET_TEX3D_466 .incbin "./build/us_1.0/textures/3d/unknown_2_466.bin" -glabel ASSET_2_467 +glabel ASSET_TEX3D_467 .incbin "./build/us_1.0/textures/3d/unknown_2_467.bin" -glabel ASSET_2_468 +glabel ASSET_TEX3D_468 .incbin "./build/us_1.0/textures/3d/unknown_2_468.bin" -glabel ASSET_2_469 +glabel ASSET_TEX3D_469 .incbin "./build/us_1.0/textures/3d/unknown_2_469.bin" -glabel ASSET_2_470 +glabel ASSET_TEX3D_470 .incbin "./build/us_1.0/textures/3d/unknown_2_470.bin" -glabel ASSET_2_471 +glabel ASSET_TEX3D_471 .incbin "./build/us_1.0/textures/3d/unknown_2_471.bin" -glabel ASSET_2_472 +glabel ASSET_TEX3D_472 .incbin "./build/us_1.0/textures/3d/unknown_2_472.bin" -glabel ASSET_2_473 +glabel ASSET_TEX3D_473 .incbin "./build/us_1.0/textures/3d/unknown_2_473.bin" -glabel ASSET_2_474 +glabel ASSET_TEX3D_474 .incbin "./build/us_1.0/textures/3d/unknown_2_474.bin" -glabel ASSET_2_475 +glabel ASSET_TEX3D_475 .incbin "./build/us_1.0/textures/3d/unknown_2_475.bin" -glabel ASSET_2_476 +glabel ASSET_TEX3D_476 .incbin "./build/us_1.0/textures/3d/unknown_2_476.bin" -glabel ASSET_2_477 +glabel ASSET_TEX3D_477 .incbin "./build/us_1.0/textures/3d/unknown_2_477.bin" -glabel ASSET_2_478 +glabel ASSET_TEX3D_478 .incbin "./build/us_1.0/textures/3d/unknown_2_478.bin" -glabel ASSET_2_479 +glabel ASSET_TEX3D_479 .incbin "./build/us_1.0/textures/3d/unknown_2_479.bin" -glabel ASSET_2_480 +glabel ASSET_TEX3D_480 .incbin "./build/us_1.0/textures/3d/unknown_2_480.bin" -glabel ASSET_2_481 +glabel ASSET_TEX3D_481 .incbin "./build/us_1.0/textures/3d/unknown_2_481.bin" -glabel ASSET_2_482 +glabel ASSET_TEX3D_482 .incbin "./build/us_1.0/textures/3d/unknown_2_482.bin" -glabel ASSET_2_483 +glabel ASSET_TEX3D_483 .incbin "./build/us_1.0/textures/3d/unknown_2_483.bin" -glabel ASSET_2_484 +glabel ASSET_TEX3D_484 .incbin "./build/us_1.0/textures/3d/unknown_2_484.bin" -glabel ASSET_2_485 +glabel ASSET_TEX3D_485 .incbin "./build/us_1.0/textures/3d/unknown_2_485.bin" -glabel ASSET_2_486 +glabel ASSET_TEX3D_486 .incbin "./build/us_1.0/textures/3d/unknown_2_486.bin" -glabel ASSET_2_487 +glabel ASSET_TEX3D_487 .incbin "./build/us_1.0/textures/3d/unknown_2_487.bin" -glabel ASSET_2_488 +glabel ASSET_TEX3D_488 .incbin "./build/us_1.0/textures/3d/unknown_2_488.bin" -glabel ASSET_2_489 +glabel ASSET_TEX3D_489 .incbin "./build/us_1.0/textures/3d/unknown_2_489.bin" -glabel ASSET_2_490 +glabel ASSET_TEX3D_490 .incbin "./build/us_1.0/textures/3d/unknown_2_490.bin" -glabel ASSET_2_491 +glabel ASSET_TEX3D_491 .incbin "./build/us_1.0/textures/3d/unknown_2_491.bin" -glabel ASSET_2_492 +glabel ASSET_TEX3D_492 .incbin "./build/us_1.0/textures/3d/unknown_2_492.bin" -glabel ASSET_2_493 +glabel ASSET_TEX3D_493 .incbin "./build/us_1.0/textures/3d/unknown_2_493.bin" -glabel ASSET_2_494 +glabel ASSET_TEX3D_494 .incbin "./build/us_1.0/textures/3d/unknown_2_494.bin" -glabel ASSET_2_495 +glabel ASSET_TEX3D_495 .incbin "./build/us_1.0/textures/3d/unknown_2_495.bin" -glabel ASSET_2_496 +glabel ASSET_TEX3D_496 .incbin "./build/us_1.0/textures/3d/unknown_2_496.bin" -glabel ASSET_2_497 +glabel ASSET_TEX3D_497 .incbin "./build/us_1.0/textures/3d/unknown_2_497.bin" -glabel ASSET_2_498 +glabel ASSET_TEX3D_498 .incbin "./build/us_1.0/textures/3d/unknown_2_498.bin" -glabel ASSET_2_499 +glabel ASSET_TEX3D_499 .incbin "./build/us_1.0/textures/3d/unknown_2_499.bin" -glabel ASSET_2_500 +glabel ASSET_TEX3D_500 .incbin "./build/us_1.0/textures/3d/unknown_2_500.bin" -glabel ASSET_2_501 +glabel ASSET_TEX3D_501 .incbin "./build/us_1.0/textures/3d/unknown_2_501.bin" -glabel ASSET_2_502 +glabel ASSET_TEX3D_502 .incbin "./build/us_1.0/textures/3d/unknown_2_502.bin" -glabel ASSET_2_503 +glabel ASSET_TEX3D_503 .incbin "./build/us_1.0/textures/3d/unknown_2_503.bin" -glabel ASSET_2_504 +glabel ASSET_TEX3D_504 .incbin "./build/us_1.0/textures/3d/unknown_2_504.bin" -glabel ASSET_2_505 +glabel ASSET_TEX3D_505 .incbin "./build/us_1.0/textures/3d/unknown_2_505.bin" -glabel ASSET_2_506 +glabel ASSET_TEX3D_506 .incbin "./build/us_1.0/textures/3d/unknown_2_506.bin" -glabel ASSET_2_507 +glabel ASSET_TEX3D_507 .incbin "./build/us_1.0/textures/3d/unknown_2_507.bin" -glabel ASSET_2_508 +glabel ASSET_TEX3D_508 .incbin "./build/us_1.0/textures/3d/unknown_2_508.bin" -glabel ASSET_2_509 +glabel ASSET_TEX3D_509 .incbin "./build/us_1.0/textures/3d/unknown_2_509.bin" -glabel ASSET_2_510 +glabel ASSET_TEX3D_510 .incbin "./build/us_1.0/textures/3d/unknown_2_510.bin" -glabel ASSET_2_511 +glabel ASSET_TEX3D_511 .incbin "./build/us_1.0/textures/3d/unknown_2_511.bin" -glabel ASSET_2_512 +glabel ASSET_TEX3D_512 .incbin "./build/us_1.0/textures/3d/unknown_2_512.bin" -glabel ASSET_2_513 +glabel ASSET_TEX3D_513 .incbin "./build/us_1.0/textures/3d/unknown_2_513.bin" -glabel ASSET_2_514 +glabel ASSET_TEX3D_514 .incbin "./build/us_1.0/textures/3d/unknown_2_514.bin" -glabel ASSET_2_515 +glabel ASSET_TEX3D_515 .incbin "./build/us_1.0/textures/3d/unknown_2_515.bin" -glabel ASSET_2_516 +glabel ASSET_TEX3D_516 .incbin "./build/us_1.0/textures/3d/unknown_2_516.bin" -glabel ASSET_2_517 +glabel ASSET_TEX3D_517 .incbin "./build/us_1.0/textures/3d/unknown_2_517.bin" -glabel ASSET_2_518 +glabel ASSET_TEX3D_518 .incbin "./build/us_1.0/textures/3d/unknown_2_518.bin" -glabel ASSET_2_519 +glabel ASSET_TEX3D_519 .incbin "./build/us_1.0/textures/3d/unknown_2_519.bin" -glabel ASSET_2_520 +glabel ASSET_TEX3D_520 .incbin "./build/us_1.0/textures/3d/unknown_2_520.bin" -glabel ASSET_2_521 +glabel ASSET_TEX3D_521 .incbin "./build/us_1.0/textures/3d/unknown_2_521.bin" -glabel ASSET_2_522 +glabel ASSET_TEX3D_522 .incbin "./build/us_1.0/textures/3d/unknown_2_522.bin" -glabel ASSET_2_523 +glabel ASSET_TEX3D_523 .incbin "./build/us_1.0/textures/3d/unknown_2_523.bin" -glabel ASSET_2_524 +glabel ASSET_TEX3D_524 .incbin "./build/us_1.0/textures/3d/unknown_2_524.bin" -glabel ASSET_2_525 +glabel ASSET_TEX3D_525 .incbin "./build/us_1.0/textures/3d/unknown_2_525.bin" -glabel ASSET_2_526 +glabel ASSET_TEX3D_526 .incbin "./build/us_1.0/textures/3d/unknown_2_526.bin" -glabel ASSET_2_527 +glabel ASSET_TEX3D_527 .incbin "./build/us_1.0/textures/3d/unknown_2_527.bin" -glabel ASSET_2_528 +glabel ASSET_TEX3D_528 .incbin "./build/us_1.0/textures/3d/unknown_2_528.bin" -glabel ASSET_2_529 +glabel ASSET_TEX3D_529 .incbin "./build/us_1.0/textures/3d/unknown_2_529.bin" -glabel ASSET_2_530 +glabel ASSET_TEX3D_530 .incbin "./build/us_1.0/textures/3d/unknown_2_530.bin" -glabel ASSET_2_531 +glabel ASSET_TEX3D_531 .incbin "./build/us_1.0/textures/3d/unknown_2_531.bin" -glabel ASSET_2_532 +glabel ASSET_TEX3D_532 .incbin "./build/us_1.0/textures/3d/unknown_2_532.bin" -glabel ASSET_2_533 +glabel ASSET_TEX3D_533 .incbin "./build/us_1.0/textures/3d/unknown_2_533.bin" -glabel ASSET_2_534 +glabel ASSET_TEX3D_534 .incbin "./build/us_1.0/textures/3d/unknown_2_534.bin" -glabel ASSET_2_535 +glabel ASSET_TEX3D_535 .incbin "./build/us_1.0/textures/3d/unknown_2_535.bin" -glabel ASSET_2_536 +glabel ASSET_TEX3D_536 .incbin "./build/us_1.0/textures/3d/unknown_2_536.bin" -glabel ASSET_2_537 +glabel ASSET_TEX3D_537 .incbin "./build/us_1.0/textures/3d/unknown_2_537.bin" -glabel ASSET_2_538 +glabel ASSET_TEX3D_538 .incbin "./build/us_1.0/textures/3d/unknown_2_538.bin" -glabel ASSET_2_539 +glabel ASSET_TEX3D_539 .incbin "./build/us_1.0/textures/3d/unknown_2_539.bin" -glabel ASSET_2_540 +glabel ASSET_TEX3D_540 .incbin "./build/us_1.0/textures/3d/unknown_2_540.bin" -glabel ASSET_2_541 +glabel ASSET_TEX3D_541 .incbin "./build/us_1.0/textures/3d/unknown_2_541.bin" -glabel ASSET_2_542 +glabel ASSET_TEX3D_542 .incbin "./build/us_1.0/textures/3d/unknown_2_542.bin" -glabel ASSET_2_543 +glabel ASSET_TEX3D_543 .incbin "./build/us_1.0/textures/3d/unknown_2_543.bin" -glabel ASSET_2_544 +glabel ASSET_TEX3D_544 .incbin "./build/us_1.0/textures/3d/unknown_2_544.bin" -glabel ASSET_2_545 +glabel ASSET_TEX3D_545 .incbin "./build/us_1.0/textures/3d/unknown_2_545.bin" -glabel ASSET_2_546 +glabel ASSET_TEX3D_546 .incbin "./build/us_1.0/textures/3d/unknown_2_546.bin" -glabel ASSET_2_547 +glabel ASSET_TEX3D_547 .incbin "./build/us_1.0/textures/3d/unknown_2_547.bin" -glabel ASSET_2_548 +glabel ASSET_TEX3D_548 .incbin "./build/us_1.0/textures/3d/unknown_2_548.bin" -glabel ASSET_2_549 +glabel ASSET_TEX3D_549 .incbin "./build/us_1.0/textures/3d/unknown_2_549.bin" -glabel ASSET_2_550 +glabel ASSET_TEX3D_550 .incbin "./build/us_1.0/textures/3d/unknown_2_550.bin" -glabel ASSET_2_551 +glabel ASSET_TEX3D_551 .incbin "./build/us_1.0/textures/3d/unknown_2_551.bin" -glabel ASSET_2_552 +glabel ASSET_TEX3D_552 .incbin "./build/us_1.0/textures/3d/unknown_2_552.bin" -glabel ASSET_2_553 +glabel ASSET_TEX3D_553 .incbin "./build/us_1.0/textures/3d/unknown_2_553.bin" -glabel ASSET_2_554 +glabel ASSET_TEX3D_554 .incbin "./build/us_1.0/textures/3d/unknown_2_554.bin" -glabel ASSET_2_555 +glabel ASSET_TEX3D_555 .incbin "./build/us_1.0/textures/3d/unknown_2_555.bin" -glabel ASSET_2_556 +glabel ASSET_TEX3D_556 .incbin "./build/us_1.0/textures/3d/unknown_2_556.bin" -glabel ASSET_2_557 +glabel ASSET_TEX3D_557 .incbin "./build/us_1.0/textures/3d/unknown_2_557.bin" -glabel ASSET_2_558 +glabel ASSET_TEX3D_558 .incbin "./build/us_1.0/textures/3d/unknown_2_558.bin" -glabel ASSET_2_559 +glabel ASSET_TEX3D_559 .incbin "./build/us_1.0/textures/3d/unknown_2_559.bin" -glabel ASSET_2_560 +glabel ASSET_TEX3D_560 .incbin "./build/us_1.0/textures/3d/unknown_2_560.bin" -glabel ASSET_2_561 +glabel ASSET_TEX3D_561 .incbin "./build/us_1.0/textures/3d/unknown_2_561.bin" -glabel ASSET_2_562 +glabel ASSET_TEX3D_562 .incbin "./build/us_1.0/textures/3d/unknown_2_562.bin" -glabel ASSET_2_563 +glabel ASSET_TEX3D_563 .incbin "./build/us_1.0/textures/3d/unknown_2_563.bin" -glabel ASSET_2_564 +glabel ASSET_TEX3D_564 .incbin "./build/us_1.0/textures/3d/unknown_2_564.bin" -glabel ASSET_2_565 +glabel ASSET_TEX3D_565 .incbin "./build/us_1.0/textures/3d/unknown_2_565.bin" -glabel ASSET_2_566 +glabel ASSET_TEX3D_566 .incbin "./build/us_1.0/textures/3d/unknown_2_566.bin" -glabel ASSET_2_567 +glabel ASSET_TEX3D_567 .incbin "./build/us_1.0/textures/3d/unknown_2_567.bin" -glabel ASSET_2_568 +glabel ASSET_TEX3D_568 .incbin "./build/us_1.0/textures/3d/unknown_2_568.bin" -glabel ASSET_2_569 +glabel ASSET_TEX3D_569 .incbin "./build/us_1.0/textures/3d/unknown_2_569.bin" -glabel ASSET_2_570 +glabel ASSET_TEX3D_570 .incbin "./build/us_1.0/textures/3d/unknown_2_570.bin" -glabel ASSET_2_571 +glabel ASSET_TEX3D_571 .incbin "./build/us_1.0/textures/3d/unknown_2_571.bin" -glabel ASSET_2_572 +glabel ASSET_TEX3D_572 .incbin "./build/us_1.0/textures/3d/unknown_2_572.bin" -glabel ASSET_2_573 +glabel ASSET_TEX3D_573 .incbin "./build/us_1.0/textures/3d/unknown_2_573.bin" -glabel ASSET_2_574 +glabel ASSET_TEX3D_574 .incbin "./build/us_1.0/textures/3d/unknown_2_574.bin" -glabel ASSET_2_575 +glabel ASSET_TEX3D_575 .incbin "./build/us_1.0/textures/3d/unknown_2_575.bin" -glabel ASSET_2_576 +glabel ASSET_TEX3D_576 .incbin "./build/us_1.0/textures/3d/unknown_2_576.bin" -glabel ASSET_2_577 +glabel ASSET_TEX3D_577 .incbin "./build/us_1.0/textures/3d/unknown_2_577.bin" -glabel ASSET_2_578 +glabel ASSET_TEX3D_578 .incbin "./build/us_1.0/textures/3d/unknown_2_578.bin" -glabel ASSET_2_579 +glabel ASSET_TEX3D_579 .incbin "./build/us_1.0/textures/3d/unknown_2_579.bin" -glabel ASSET_2_580 +glabel ASSET_TEX3D_580 .incbin "./build/us_1.0/textures/3d/unknown_2_580.bin" -glabel ASSET_2_581 +glabel ASSET_TEX3D_581 .incbin "./build/us_1.0/textures/3d/unknown_2_581.bin" -glabel ASSET_2_582 +glabel ASSET_TEX3D_582 .incbin "./build/us_1.0/textures/3d/unknown_2_582.bin" -glabel ASSET_2_583 +glabel ASSET_TEX3D_583 .incbin "./build/us_1.0/textures/3d/unknown_2_583.bin" -glabel ASSET_2_584 +glabel ASSET_TEX3D_584 .incbin "./build/us_1.0/textures/3d/unknown_2_584.bin" -glabel ASSET_2_585 +glabel ASSET_TEX3D_585 .incbin "./build/us_1.0/textures/3d/unknown_2_585.bin" -glabel ASSET_2_586 +glabel ASSET_TEX3D_586 .incbin "./build/us_1.0/textures/3d/unknown_2_586.bin" -glabel ASSET_2_587 +glabel ASSET_TEX3D_587 .incbin "./build/us_1.0/textures/3d/unknown_2_587.bin" -glabel ASSET_2_588 +glabel ASSET_TEX3D_588 .incbin "./build/us_1.0/textures/3d/unknown_2_588.bin" -glabel ASSET_2_589 +glabel ASSET_TEX3D_589 .incbin "./build/us_1.0/textures/3d/unknown_2_589.bin" -glabel ASSET_2_590 +glabel ASSET_TEX3D_590 .incbin "./build/us_1.0/textures/3d/unknown_2_590.bin" -glabel ASSET_2_591 +glabel ASSET_TEX3D_591 .incbin "./build/us_1.0/textures/3d/unknown_2_591.bin" -glabel ASSET_2_592 +glabel ASSET_TEX3D_592 .incbin "./build/us_1.0/textures/3d/unknown_2_592.bin" -glabel ASSET_2_593 +glabel ASSET_TEX3D_593 .incbin "./build/us_1.0/textures/3d/unknown_2_593.bin" -glabel ASSET_2_594 +glabel ASSET_TEX3D_594 .incbin "./build/us_1.0/textures/3d/unknown_2_594.bin" -glabel ASSET_2_595 +glabel ASSET_TEX3D_595 .incbin "./build/us_1.0/textures/3d/unknown_2_595.bin" -glabel ASSET_2_596 +glabel ASSET_TEX3D_596 .incbin "./build/us_1.0/textures/3d/unknown_2_596.bin" -glabel ASSET_2_597 +glabel ASSET_TEX3D_597 .incbin "./build/us_1.0/textures/3d/unknown_2_597.bin" -glabel ASSET_2_598 +glabel ASSET_TEX3D_598 .incbin "./build/us_1.0/textures/3d/unknown_2_598.bin" -glabel ASSET_2_599 +glabel ASSET_TEX3D_599 .incbin "./build/us_1.0/textures/3d/unknown_2_599.bin" -glabel ASSET_2_600 +glabel ASSET_TEX3D_600 .incbin "./build/us_1.0/textures/3d/unknown_2_600.bin" -glabel ASSET_2_601 +glabel ASSET_TEX3D_601 .incbin "./build/us_1.0/textures/3d/unknown_2_601.bin" -glabel ASSET_2_602 +glabel ASSET_TEX3D_602 .incbin "./build/us_1.0/textures/3d/unknown_2_602.bin" -glabel ASSET_2_603 +glabel ASSET_TEX3D_603 .incbin "./build/us_1.0/textures/3d/unknown_2_603.bin" -glabel ASSET_2_604 +glabel ASSET_TEX3D_604 .incbin "./build/us_1.0/textures/3d/unknown_2_604.bin" -glabel ASSET_2_605 +glabel ASSET_TEX3D_605 .incbin "./build/us_1.0/textures/3d/unknown_2_605.bin" -glabel ASSET_2_606 +glabel ASSET_TEX3D_606 .incbin "./build/us_1.0/textures/3d/unknown_2_606.bin" -glabel ASSET_2_607 +glabel ASSET_TEX3D_607 .incbin "./build/us_1.0/textures/3d/unknown_2_607.bin" -glabel ASSET_2_608 +glabel ASSET_TEX3D_608 .incbin "./build/us_1.0/textures/3d/unknown_2_608.bin" -glabel ASSET_2_609 +glabel ASSET_TEX3D_609 .incbin "./build/us_1.0/textures/3d/unknown_2_609.bin" -glabel ASSET_2_610 +glabel ASSET_TEX3D_610 .incbin "./build/us_1.0/textures/3d/unknown_2_610.bin" -glabel ASSET_2_611 +glabel ASSET_TEX3D_611 .incbin "./build/us_1.0/textures/3d/unknown_2_611.bin" -glabel ASSET_2_612 +glabel ASSET_TEX3D_612 .incbin "./build/us_1.0/textures/3d/unknown_2_612.bin" -glabel ASSET_2_613 +glabel ASSET_TEX3D_613 .incbin "./build/us_1.0/textures/3d/unknown_2_613.bin" -glabel ASSET_2_614 +glabel ASSET_TEX3D_614 .incbin "./build/us_1.0/textures/3d/unknown_2_614.bin" -glabel ASSET_2_615 +glabel ASSET_TEX3D_615 .incbin "./build/us_1.0/textures/3d/unknown_2_615.bin" -glabel ASSET_2_616 +glabel ASSET_TEX3D_616 .incbin "./build/us_1.0/textures/3d/unknown_2_616.bin" -glabel ASSET_2_617 +glabel ASSET_TEX3D_617 .incbin "./build/us_1.0/textures/3d/unknown_2_617.bin" -glabel ASSET_2_618 +glabel ASSET_TEX3D_618 .incbin "./build/us_1.0/textures/3d/unknown_2_618.bin" -glabel ASSET_2_619 +glabel ASSET_TEX3D_619 .incbin "./build/us_1.0/textures/3d/unknown_2_619.bin" -glabel ASSET_2_620 +glabel ASSET_TEX3D_620 .incbin "./build/us_1.0/textures/3d/unknown_2_620.bin" -glabel ASSET_2_621 +glabel ASSET_TEX3D_621 .incbin "./build/us_1.0/textures/3d/unknown_2_621.bin" -glabel ASSET_2_622 +glabel ASSET_TEX3D_622 .incbin "./build/us_1.0/textures/3d/unknown_2_622.bin" -glabel ASSET_2_623 +glabel ASSET_TEX3D_623 .incbin "./build/us_1.0/textures/3d/unknown_2_623.bin" -glabel ASSET_2_624 +glabel ASSET_TEX3D_624 .incbin "./build/us_1.0/textures/3d/unknown_2_624.bin" -glabel ASSET_2_625 +glabel ASSET_TEX3D_625 .incbin "./build/us_1.0/textures/3d/unknown_2_625.bin" -glabel ASSET_2_626 +glabel ASSET_TEX3D_626 .incbin "./build/us_1.0/textures/3d/unknown_2_626.bin" -glabel ASSET_2_627 +glabel ASSET_TEX3D_627 .incbin "./build/us_1.0/textures/3d/unknown_2_627.bin" -glabel ASSET_2_628 +glabel ASSET_TEX3D_628 .incbin "./build/us_1.0/textures/3d/unknown_2_628.bin" -glabel ASSET_2_629 +glabel ASSET_TEX3D_629 .incbin "./build/us_1.0/textures/3d/unknown_2_629.bin" -glabel ASSET_2_630 +glabel ASSET_TEX3D_630 .incbin "./build/us_1.0/textures/3d/unknown_2_630.bin" -glabel ASSET_2_631 +glabel ASSET_TEX3D_631 .incbin "./build/us_1.0/textures/3d/unknown_2_631.bin" -glabel ASSET_2_632 +glabel ASSET_TEX3D_632 .incbin "./build/us_1.0/textures/3d/unknown_2_632.bin" -glabel ASSET_2_633 +glabel ASSET_TEX3D_633 .incbin "./build/us_1.0/textures/3d/unknown_2_633.bin" -glabel ASSET_2_634 +glabel ASSET_TEX3D_634 .incbin "./build/us_1.0/textures/3d/unknown_2_634.bin" -glabel ASSET_2_635 +glabel ASSET_TEX3D_635 .incbin "./build/us_1.0/textures/3d/unknown_2_635.bin" -glabel ASSET_2_636 +glabel ASSET_TEX3D_636 .incbin "./build/us_1.0/textures/3d/unknown_2_636.bin" -glabel ASSET_2_637 +glabel ASSET_TEX3D_637 .incbin "./build/us_1.0/textures/3d/unknown_2_637.bin" -glabel ASSET_2_638 +glabel ASSET_TEX3D_638 .incbin "./build/us_1.0/textures/3d/unknown_2_638.bin" -glabel ASSET_2_639 +glabel ASSET_TEX3D_639 .incbin "./build/us_1.0/textures/3d/unknown_2_639.bin" -glabel ASSET_2_640 +glabel ASSET_TEX3D_640 .incbin "./build/us_1.0/textures/3d/unknown_2_640.bin" -glabel ASSET_2_641 +glabel ASSET_TEX3D_641 .incbin "./build/us_1.0/textures/3d/unknown_2_641.bin" -glabel ASSET_2_642 +glabel ASSET_TEX3D_642 .incbin "./build/us_1.0/textures/3d/unknown_2_642.bin" -glabel ASSET_2_643 +glabel ASSET_TEX3D_643 .incbin "./build/us_1.0/textures/3d/unknown_2_643.bin" -glabel ASSET_2_644 +glabel ASSET_TEX3D_644 .incbin "./build/us_1.0/textures/3d/unknown_2_644.bin" -glabel ASSET_2_645 +glabel ASSET_TEX3D_645 .incbin "./build/us_1.0/textures/3d/unknown_2_645.bin" -glabel ASSET_2_646 +glabel ASSET_TEX3D_646 .incbin "./build/us_1.0/textures/3d/unknown_2_646.bin" -glabel ASSET_2_647 +glabel ASSET_TEX3D_647 .incbin "./build/us_1.0/textures/3d/unknown_2_647.bin" -glabel ASSET_2_648 +glabel ASSET_TEX3D_648 .incbin "./build/us_1.0/textures/3d/unknown_2_648.bin" -glabel ASSET_2_649 +glabel ASSET_TEX3D_649 .incbin "./build/us_1.0/textures/3d/unknown_2_649.bin" -glabel ASSET_2_650 +glabel ASSET_TEX3D_650 .incbin "./build/us_1.0/textures/3d/unknown_2_650.bin" -glabel ASSET_2_651 +glabel ASSET_TEX3D_651 .incbin "./build/us_1.0/textures/3d/unknown_2_651.bin" -glabel ASSET_2_652 +glabel ASSET_TEX3D_652 .incbin "./build/us_1.0/textures/3d/unknown_2_652.bin" -glabel ASSET_2_653 +glabel ASSET_TEX3D_653 .incbin "./build/us_1.0/textures/3d/unknown_2_653.bin" -glabel ASSET_2_654 +glabel ASSET_TEX3D_654 .incbin "./build/us_1.0/textures/3d/unknown_2_654.bin" -glabel ASSET_2_655 +glabel ASSET_TEX3D_655 .incbin "./build/us_1.0/textures/3d/unknown_2_655.bin" -glabel ASSET_2_656 +glabel ASSET_TEX3D_656 .incbin "./build/us_1.0/textures/3d/unknown_2_656.bin" -glabel ASSET_2_657 +glabel ASSET_TEX3D_657 .incbin "./build/us_1.0/textures/3d/unknown_2_657.bin" -glabel ASSET_2_658 +glabel ASSET_TEX3D_658 .incbin "./build/us_1.0/textures/3d/unknown_2_658.bin" -glabel ASSET_2_659 +glabel ASSET_TEX3D_659 .incbin "./build/us_1.0/textures/3d/unknown_2_659.bin" -glabel ASSET_2_660 +glabel ASSET_TEX3D_660 .incbin "./build/us_1.0/textures/3d/unknown_2_660.bin" -glabel ASSET_2_661 +glabel ASSET_TEX3D_661 .incbin "./build/us_1.0/textures/3d/unknown_2_661.bin" -glabel ASSET_2_662 +glabel ASSET_TEX3D_662 .incbin "./build/us_1.0/textures/3d/unknown_2_662.bin" -glabel ASSET_2_663 +glabel ASSET_TEX3D_663 .incbin "./build/us_1.0/textures/3d/unknown_2_663.bin" -glabel ASSET_2_664 +glabel ASSET_TEX3D_664 .incbin "./build/us_1.0/textures/3d/unknown_2_664.bin" -glabel ASSET_2_665 +glabel ASSET_TEX3D_665 .incbin "./build/us_1.0/textures/3d/unknown_2_665.bin" -glabel ASSET_2_666 +glabel ASSET_TEX3D_666 .incbin "./build/us_1.0/textures/3d/unknown_2_666.bin" -glabel ASSET_2_667 +glabel ASSET_TEX3D_667 .incbin "./build/us_1.0/textures/3d/unknown_2_667.bin" -glabel ASSET_2_668 +glabel ASSET_TEX3D_668 .incbin "./build/us_1.0/textures/3d/unknown_2_668.bin" -glabel ASSET_2_669 +glabel ASSET_TEX3D_669 .incbin "./build/us_1.0/textures/3d/unknown_2_669.bin" -glabel ASSET_2_670 +glabel ASSET_TEX3D_670 .incbin "./build/us_1.0/textures/3d/unknown_2_670.bin" -glabel ASSET_2_671 +glabel ASSET_TEX3D_671 .incbin "./build/us_1.0/textures/3d/unknown_2_671.bin" -glabel ASSET_2_672 +glabel ASSET_TEX3D_672 .incbin "./build/us_1.0/textures/3d/unknown_2_672.bin" -glabel ASSET_2_673 +glabel ASSET_TEX3D_673 .incbin "./build/us_1.0/textures/3d/unknown_2_673.bin" -glabel ASSET_2_674 +glabel ASSET_TEX3D_674 .incbin "./build/us_1.0/textures/3d/unknown_2_674.bin" -glabel ASSET_2_675 +glabel ASSET_TEX3D_675 .incbin "./build/us_1.0/textures/3d/unknown_2_675.bin" -glabel ASSET_2_676 +glabel ASSET_TEX3D_676 .incbin "./build/us_1.0/textures/3d/unknown_2_676.bin" -glabel ASSET_2_677 +glabel ASSET_TEX3D_677 .incbin "./build/us_1.0/textures/3d/unknown_2_677.bin" -glabel ASSET_2_678 +glabel ASSET_TEX3D_678 .incbin "./build/us_1.0/textures/3d/unknown_2_678.bin" -glabel ASSET_2_679 +glabel ASSET_TEX3D_679 .incbin "./build/us_1.0/textures/3d/unknown_2_679.bin" -glabel ASSET_2_680 +glabel ASSET_TEX3D_680 .incbin "./build/us_1.0/textures/3d/unknown_2_680.bin" -glabel ASSET_2_681 +glabel ASSET_TEX3D_681 .incbin "./build/us_1.0/textures/3d/unknown_2_681.bin" -glabel ASSET_2_682 +glabel ASSET_TEX3D_682 .incbin "./build/us_1.0/textures/3d/unknown_2_682.bin" -glabel ASSET_2_683 +glabel ASSET_TEX3D_683 .incbin "./build/us_1.0/textures/3d/unknown_2_683.bin" -glabel ASSET_2_684 +glabel ASSET_TEX3D_684 .incbin "./build/us_1.0/textures/3d/unknown_2_684.bin" -glabel ASSET_2_685 +glabel ASSET_TEX3D_685 .incbin "./build/us_1.0/textures/3d/unknown_2_685.bin" -glabel ASSET_2_686 +glabel ASSET_TEX3D_686 .incbin "./build/us_1.0/textures/3d/unknown_2_686.bin" -glabel ASSET_2_687 +glabel ASSET_TEX3D_687 .incbin "./build/us_1.0/textures/3d/unknown_2_687.bin" -glabel ASSET_2_688 +glabel ASSET_TEX3D_688 .incbin "./build/us_1.0/textures/3d/unknown_2_688.bin" -glabel ASSET_2_689 +glabel ASSET_TEX3D_689 .incbin "./build/us_1.0/textures/3d/unknown_2_689.bin" -glabel ASSET_2_690 +glabel ASSET_TEX3D_690 .incbin "./build/us_1.0/textures/3d/unknown_2_690.bin" -glabel ASSET_2_691 +glabel ASSET_TEX3D_691 .incbin "./build/us_1.0/textures/3d/unknown_2_691.bin" -glabel ASSET_2_692 +glabel ASSET_TEX3D_692 .incbin "./build/us_1.0/textures/3d/unknown_2_692.bin" -glabel ASSET_2_693 +glabel ASSET_TEX3D_693 .incbin "./build/us_1.0/textures/3d/unknown_2_693.bin" -glabel ASSET_2_694 +glabel ASSET_TEX3D_694 .incbin "./build/us_1.0/textures/3d/unknown_2_694.bin" -glabel ASSET_2_695 +glabel ASSET_TEX3D_695 .incbin "./build/us_1.0/textures/3d/unknown_2_695.bin" -glabel ASSET_2_696 +glabel ASSET_TEX3D_696 .incbin "./build/us_1.0/textures/3d/unknown_2_696.bin" -glabel ASSET_2_697 +glabel ASSET_TEX3D_697 .incbin "./build/us_1.0/textures/3d/unknown_2_697.bin" -glabel ASSET_2_698 +glabel ASSET_TEX3D_698 .incbin "./build/us_1.0/textures/3d/unknown_2_698.bin" -glabel ASSET_2_699 +glabel ASSET_TEX3D_699 .incbin "./build/us_1.0/textures/3d/unknown_2_699.bin" -glabel ASSET_2_700 +glabel ASSET_TEX3D_700 .incbin "./build/us_1.0/textures/3d/unknown_2_700.bin" -glabel ASSET_2_701 +glabel ASSET_TEX3D_701 .incbin "./build/us_1.0/textures/3d/unknown_2_701.bin" -glabel ASSET_2_702 +glabel ASSET_TEX3D_702 .incbin "./build/us_1.0/textures/3d/unknown_2_702.bin" -glabel ASSET_2_703 +glabel ASSET_TEX3D_703 .incbin "./build/us_1.0/textures/3d/unknown_2_703.bin" -glabel ASSET_2_704 +glabel ASSET_TEX3D_704 .incbin "./build/us_1.0/textures/3d/unknown_2_704.bin" -glabel ASSET_2_705 +glabel ASSET_TEX3D_705 .incbin "./build/us_1.0/textures/3d/unknown_2_705.bin" -glabel ASSET_2_706 +glabel ASSET_TEX3D_706 .incbin "./build/us_1.0/textures/3d/unknown_2_706.bin" -glabel ASSET_2_707 +glabel ASSET_TEX3D_707 .incbin "./build/us_1.0/textures/3d/unknown_2_707.bin" -glabel ASSET_2_708 +glabel ASSET_TEX3D_708 .incbin "./build/us_1.0/textures/3d/unknown_2_708.bin" -glabel ASSET_2_709 +glabel ASSET_TEX3D_709 .incbin "./build/us_1.0/textures/3d/unknown_2_709.bin" -glabel ASSET_2_710 +glabel ASSET_TEX3D_710 .incbin "./build/us_1.0/textures/3d/unknown_2_710.bin" -glabel ASSET_2_711 +glabel ASSET_TEX3D_711 .incbin "./build/us_1.0/textures/3d/unknown_2_711.bin" -glabel ASSET_2_712 +glabel ASSET_TEX3D_712 .incbin "./build/us_1.0/textures/3d/unknown_2_712.bin" -glabel ASSET_2_713 +glabel ASSET_TEX3D_713 .incbin "./build/us_1.0/textures/3d/unknown_2_713.bin" -glabel ASSET_2_714 +glabel ASSET_TEX3D_714 .incbin "./build/us_1.0/textures/3d/unknown_2_714.bin" -glabel ASSET_2_715 +glabel ASSET_TEX3D_715 .incbin "./build/us_1.0/textures/3d/unknown_2_715.bin" -glabel ASSET_2_716 +glabel ASSET_TEX3D_716 .incbin "./build/us_1.0/textures/3d/unknown_2_716.bin" -glabel ASSET_2_717 +glabel ASSET_TEX3D_717 .incbin "./build/us_1.0/textures/3d/unknown_2_717.bin" -glabel ASSET_2_718 +glabel ASSET_TEX3D_718 .incbin "./build/us_1.0/textures/3d/unknown_2_718.bin" -glabel ASSET_2_719 +glabel ASSET_TEX3D_719 .incbin "./build/us_1.0/textures/3d/unknown_2_719.bin" -glabel ASSET_2_720 +glabel ASSET_TEX3D_720 .incbin "./build/us_1.0/textures/3d/unknown_2_720.bin" -glabel ASSET_2_721 +glabel ASSET_TEX3D_721 .incbin "./build/us_1.0/textures/3d/unknown_2_721.bin" -glabel ASSET_2_722 +glabel ASSET_TEX3D_722 .incbin "./build/us_1.0/textures/3d/unknown_2_722.bin" -glabel ASSET_2_723 +glabel ASSET_TEX3D_723 .incbin "./build/us_1.0/textures/3d/unknown_2_723.bin" -glabel ASSET_2_724 +glabel ASSET_TEX3D_724 .incbin "./build/us_1.0/textures/3d/unknown_2_724.bin" -glabel ASSET_2_725 +glabel ASSET_TEX3D_725 .incbin "./build/us_1.0/textures/3d/unknown_2_725.bin" -glabel ASSET_2_726 +glabel ASSET_TEX3D_726 .incbin "./build/us_1.0/textures/3d/unknown_2_726.bin" -glabel ASSET_2_727 +glabel ASSET_TEX3D_727 .incbin "./build/us_1.0/textures/3d/unknown_2_727.bin" -glabel ASSET_2_728 +glabel ASSET_TEX3D_728 .incbin "./build/us_1.0/textures/3d/unknown_2_728.bin" -glabel ASSET_2_729 +glabel ASSET_TEX3D_729 .incbin "./build/us_1.0/textures/3d/unknown_2_729.bin" -glabel ASSET_2_730 +glabel ASSET_TEX3D_730 .incbin "./build/us_1.0/textures/3d/unknown_2_730.bin" -glabel ASSET_2_731 +glabel ASSET_TEX3D_731 .incbin "./build/us_1.0/textures/3d/unknown_2_731.bin" -glabel ASSET_2_732 +glabel ASSET_TEX3D_732 .incbin "./build/us_1.0/textures/3d/unknown_2_732.bin" -glabel ASSET_2_733 +glabel ASSET_TEX3D_733 .incbin "./build/us_1.0/textures/3d/unknown_2_733.bin" -glabel ASSET_2_734 +glabel ASSET_TEX3D_734 .incbin "./build/us_1.0/textures/3d/unknown_2_734.bin" -glabel ASSET_2_735 +glabel ASSET_TEX3D_735 .incbin "./build/us_1.0/textures/3d/unknown_2_735.bin" -glabel ASSET_2_736 +glabel ASSET_TEX3D_736 .incbin "./build/us_1.0/textures/3d/unknown_2_736.bin" -glabel ASSET_2_737 +glabel ASSET_TEX3D_737 .incbin "./build/us_1.0/textures/3d/unknown_2_737.bin" -glabel ASSET_2_738 +glabel ASSET_TEX3D_738 .incbin "./build/us_1.0/textures/3d/unknown_2_738.bin" -glabel ASSET_2_739 +glabel ASSET_TEX3D_739 .incbin "./build/us_1.0/textures/3d/unknown_2_739.bin" -glabel ASSET_2_740 +glabel ASSET_TEX3D_740 .incbin "./build/us_1.0/textures/3d/unknown_2_740.bin" -glabel ASSET_2_741 +glabel ASSET_TEX3D_741 .incbin "./build/us_1.0/textures/3d/unknown_2_741.bin" -glabel ASSET_2_742 +glabel ASSET_TEX3D_742 .incbin "./build/us_1.0/textures/3d/unknown_2_742.bin" -glabel ASSET_2_743 +glabel ASSET_TEX3D_743 .incbin "./build/us_1.0/textures/3d/unknown_2_743.bin" -glabel ASSET_2_744 +glabel ASSET_TEX3D_744 .incbin "./build/us_1.0/textures/3d/unknown_2_744.bin" -glabel ASSET_2_745 +glabel ASSET_TEX3D_745 .incbin "./build/us_1.0/textures/3d/unknown_2_745.bin" -glabel ASSET_2_746 +glabel ASSET_TEX3D_746 .incbin "./build/us_1.0/textures/3d/unknown_2_746.bin" -glabel ASSET_2_747 +glabel ASSET_TEX3D_747 .incbin "./build/us_1.0/textures/3d/unknown_2_747.bin" -glabel ASSET_2_748 +glabel ASSET_TEX3D_748 .incbin "./build/us_1.0/textures/3d/unknown_2_748.bin" -glabel ASSET_2_749 +glabel ASSET_TEX3D_749 .incbin "./build/us_1.0/textures/3d/unknown_2_749.bin" -glabel ASSET_2_750 +glabel ASSET_TEX3D_750 .incbin "./build/us_1.0/textures/3d/unknown_2_750.bin" -glabel ASSET_2_751 +glabel ASSET_TEX3D_751 .incbin "./build/us_1.0/textures/3d/unknown_2_751.bin" -glabel ASSET_2_752 +glabel ASSET_TEX3D_752 .incbin "./build/us_1.0/textures/3d/unknown_2_752.bin" -glabel ASSET_2_753 +glabel ASSET_TEX3D_753 .incbin "./build/us_1.0/textures/3d/unknown_2_753.bin" -glabel ASSET_2_754 +glabel ASSET_TEX3D_754 .incbin "./build/us_1.0/textures/3d/unknown_2_754.bin" -glabel ASSET_2_755 +glabel ASSET_TEX3D_755 .incbin "./build/us_1.0/textures/3d/unknown_2_755.bin" -glabel ASSET_2_756 +glabel ASSET_TEX3D_756 .incbin "./build/us_1.0/textures/3d/unknown_2_756.bin" -glabel ASSET_2_757 +glabel ASSET_TEX3D_757 .incbin "./build/us_1.0/textures/3d/unknown_2_757.bin" -glabel ASSET_2_758 +glabel ASSET_TEX3D_758 .incbin "./build/us_1.0/textures/3d/unknown_2_758.bin" -glabel ASSET_2_759 +glabel ASSET_TEX3D_759 .incbin "./build/us_1.0/textures/3d/unknown_2_759.bin" -glabel ASSET_2_760 +glabel ASSET_TEX3D_760 .incbin "./build/us_1.0/textures/3d/unknown_2_760.bin" -glabel ASSET_2_761 +glabel ASSET_TEX3D_761 .incbin "./build/us_1.0/textures/3d/unknown_2_761.bin" -glabel ASSET_2_762 +glabel ASSET_TEX3D_762 .incbin "./build/us_1.0/textures/3d/unknown_2_762.bin" -glabel ASSET_2_763 +glabel ASSET_TEX3D_763 .incbin "./build/us_1.0/textures/3d/unknown_2_763.bin" -glabel ASSET_2_764 +glabel ASSET_TEX3D_764 .incbin "./build/us_1.0/textures/3d/unknown_2_764.bin" -glabel ASSET_2_765 +glabel ASSET_TEX3D_765 .incbin "./build/us_1.0/textures/3d/unknown_2_765.bin" -glabel ASSET_2_766 +glabel ASSET_TEX3D_766 .incbin "./build/us_1.0/textures/3d/unknown_2_766.bin" -glabel ASSET_2_767 +glabel ASSET_TEX3D_767 .incbin "./build/us_1.0/textures/3d/unknown_2_767.bin" -glabel ASSET_2_768 +glabel ASSET_TEX3D_768 .incbin "./build/us_1.0/textures/3d/unknown_2_768.bin" -glabel ASSET_2_769 +glabel ASSET_TEX3D_769 .incbin "./build/us_1.0/textures/3d/unknown_2_769.bin" -glabel ASSET_2_770 +glabel ASSET_TEX3D_770 .incbin "./build/us_1.0/textures/3d/unknown_2_770.bin" -glabel ASSET_2_771 +glabel ASSET_TEX3D_771 .incbin "./build/us_1.0/textures/3d/unknown_2_771.bin" -glabel ASSET_2_772 +glabel ASSET_TEX3D_772 .incbin "./build/us_1.0/textures/3d/unknown_2_772.bin" -glabel ASSET_2_773 +glabel ASSET_TEX3D_773 .incbin "./build/us_1.0/textures/3d/unknown_2_773.bin" -glabel ASSET_2_774 +glabel ASSET_TEX3D_774 .incbin "./build/us_1.0/textures/3d/unknown_2_774.bin" -glabel ASSET_2_775 +glabel ASSET_TEX3D_775 .incbin "./build/us_1.0/textures/3d/unknown_2_775.bin" -glabel ASSET_2_776 +glabel ASSET_TEX3D_776 .incbin "./build/us_1.0/textures/3d/unknown_2_776.bin" -glabel ASSET_2_777 +glabel ASSET_TEX3D_777 .incbin "./build/us_1.0/textures/3d/unknown_2_777.bin" -glabel ASSET_2_778 +glabel ASSET_TEX3D_778 .incbin "./build/us_1.0/textures/3d/unknown_2_778.bin" -glabel ASSET_2_779 +glabel ASSET_TEX3D_779 .incbin "./build/us_1.0/textures/3d/unknown_2_779.bin" -glabel ASSET_2_780 +glabel ASSET_TEX3D_780 .incbin "./build/us_1.0/textures/3d/unknown_2_780.bin" -glabel ASSET_2_781 +glabel ASSET_TEX3D_781 .incbin "./build/us_1.0/textures/3d/unknown_2_781.bin" -glabel ASSET_2_782 +glabel ASSET_TEX3D_782 .incbin "./build/us_1.0/textures/3d/unknown_2_782.bin" -glabel ASSET_2_783 +glabel ASSET_TEX3D_783 .incbin "./build/us_1.0/textures/3d/unknown_2_783.bin" -glabel ASSET_2_784 +glabel ASSET_TEX3D_784 .incbin "./build/us_1.0/textures/3d/unknown_2_784.bin" -glabel ASSET_2_785 +glabel ASSET_TEX3D_785 .incbin "./build/us_1.0/textures/3d/unknown_2_785.bin" -glabel ASSET_2_786 +glabel ASSET_TEX3D_786 .incbin "./build/us_1.0/textures/3d/unknown_2_786.bin" -glabel ASSET_2_787 +glabel ASSET_TEX3D_787 .incbin "./build/us_1.0/textures/3d/unknown_2_787.bin" -glabel ASSET_2_788 +glabel ASSET_TEX3D_788 .incbin "./build/us_1.0/textures/3d/unknown_2_788.bin" -glabel ASSET_2_789 +glabel ASSET_TEX3D_789 .incbin "./build/us_1.0/textures/3d/unknown_2_789.bin" -glabel ASSET_2_790 +glabel ASSET_TEX3D_790 .incbin "./build/us_1.0/textures/3d/unknown_2_790.bin" -glabel ASSET_2_791 +glabel ASSET_TEX3D_791 .incbin "./build/us_1.0/textures/3d/unknown_2_791.bin" -glabel ASSET_2_792 +glabel ASSET_TEX3D_792 .incbin "./build/us_1.0/textures/3d/unknown_2_792.bin" -glabel ASSET_2_793 +glabel ASSET_TEX3D_793 .incbin "./build/us_1.0/textures/3d/unknown_2_793.bin" -glabel ASSET_2_794 +glabel ASSET_TEX3D_794 .incbin "./build/us_1.0/textures/3d/unknown_2_794.bin" -glabel ASSET_2_795 +glabel ASSET_TEX3D_795 .incbin "./build/us_1.0/textures/3d/unknown_2_795.bin" -glabel ASSET_2_796 +glabel ASSET_TEX3D_796 .incbin "./build/us_1.0/textures/3d/unknown_2_796.bin" -glabel ASSET_2_797 +glabel ASSET_TEX3D_797 .incbin "./build/us_1.0/textures/3d/unknown_2_797.bin" -glabel ASSET_2_798 +glabel ASSET_TEX3D_798 .incbin "./build/us_1.0/textures/3d/unknown_2_798.bin" -glabel ASSET_2_799 +glabel ASSET_TEX3D_799 .incbin "./build/us_1.0/textures/3d/unknown_2_799.bin" -glabel ASSET_2_800 +glabel ASSET_TEX3D_800 .incbin "./build/us_1.0/textures/3d/unknown_2_800.bin" -glabel ASSET_2_801 +glabel ASSET_TEX3D_801 .incbin "./build/us_1.0/textures/3d/unknown_2_801.bin" -glabel ASSET_2_802 +glabel ASSET_TEX3D_802 .incbin "./build/us_1.0/textures/3d/unknown_2_802.bin" -glabel ASSET_2_803 +glabel ASSET_TEX3D_803 .incbin "./build/us_1.0/textures/3d/unknown_2_803.bin" -glabel ASSET_2_804 +glabel ASSET_TEX3D_804 .incbin "./build/us_1.0/textures/3d/unknown_2_804.bin" -glabel ASSET_2_805 +glabel ASSET_TEX3D_805 .incbin "./build/us_1.0/textures/3d/unknown_2_805.bin" -glabel ASSET_2_806 +glabel ASSET_TEX3D_806 .incbin "./build/us_1.0/textures/3d/unknown_2_806.bin" -glabel ASSET_2_807 +glabel ASSET_TEX3D_807 .incbin "./build/us_1.0/textures/3d/unknown_2_807.bin" -glabel ASSET_2_808 +glabel ASSET_TEX3D_808 .incbin "./build/us_1.0/textures/3d/unknown_2_808.bin" -glabel ASSET_2_809 +glabel ASSET_TEX3D_809 .incbin "./build/us_1.0/textures/3d/unknown_2_809.bin" -glabel ASSET_2_810 +glabel ASSET_TEX3D_810 .incbin "./build/us_1.0/textures/3d/unknown_2_810.bin" -glabel ASSET_2_811 +glabel ASSET_TEX3D_811 .incbin "./build/us_1.0/textures/3d/unknown_2_811.bin" -glabel ASSET_2_812 +glabel ASSET_TEX3D_812 .incbin "./build/us_1.0/textures/3d/unknown_2_812.bin" -glabel ASSET_2_813 +glabel ASSET_TEX3D_813 .incbin "./build/us_1.0/textures/3d/unknown_2_813.bin" -glabel ASSET_2_814 +glabel ASSET_TEX3D_814 .incbin "./build/us_1.0/textures/3d/unknown_2_814.bin" -glabel ASSET_2_815 +glabel ASSET_TEX3D_815 .incbin "./build/us_1.0/textures/3d/unknown_2_815.bin" -glabel ASSET_2_816 +glabel ASSET_TEX3D_816 .incbin "./build/us_1.0/textures/3d/unknown_2_816.bin" -glabel ASSET_2_817 +glabel ASSET_TEX3D_817 .incbin "./build/us_1.0/textures/3d/unknown_2_817.bin" -glabel ASSET_2_818 +glabel ASSET_TEX3D_818 .incbin "./build/us_1.0/textures/3d/unknown_2_818.bin" -glabel ASSET_2_819 +glabel ASSET_TEX3D_819 .incbin "./build/us_1.0/textures/3d/unknown_2_819.bin" -glabel ASSET_2_820 +glabel ASSET_TEX3D_820 .incbin "./build/us_1.0/textures/3d/unknown_2_820.bin" -glabel ASSET_2_821 +glabel ASSET_TEX3D_821 .incbin "./build/us_1.0/textures/3d/unknown_2_821.bin" -glabel ASSET_2_822 +glabel ASSET_TEX3D_822 .incbin "./build/us_1.0/textures/3d/unknown_2_822.bin" -glabel ASSET_2_823 +glabel ASSET_TEX3D_823 .incbin "./build/us_1.0/textures/3d/unknown_2_823.bin" -glabel ASSET_2_824 +glabel ASSET_TEX3D_824 .incbin "./build/us_1.0/textures/3d/unknown_2_824.bin" -glabel ASSET_2_825 +glabel ASSET_TEX3D_825 .incbin "./build/us_1.0/textures/3d/unknown_2_825.bin" -glabel ASSET_2_826 +glabel ASSET_TEX3D_826 .incbin "./build/us_1.0/textures/3d/unknown_2_826.bin" -glabel ASSET_2_827 +glabel ASSET_TEX3D_827 .incbin "./build/us_1.0/textures/3d/unknown_2_827.bin" -glabel ASSET_2_828 +glabel ASSET_TEX3D_828 .incbin "./build/us_1.0/textures/3d/unknown_2_828.bin" -glabel ASSET_2_829 +glabel ASSET_TEX3D_829 .incbin "./build/us_1.0/textures/3d/unknown_2_829.bin" -glabel ASSET_2_830 +glabel ASSET_TEX3D_830 .incbin "./build/us_1.0/textures/3d/unknown_2_830.bin" -glabel ASSET_2_831 +glabel ASSET_TEX3D_831 .incbin "./build/us_1.0/textures/3d/unknown_2_831.bin" -glabel ASSET_2_832 +glabel ASSET_TEX3D_832 .incbin "./build/us_1.0/textures/3d/unknown_2_832.bin" -glabel ASSET_2_833 +glabel ASSET_TEX3D_833 .incbin "./build/us_1.0/textures/3d/unknown_2_833.bin" -glabel ASSET_2_834 +glabel ASSET_TEX3D_834 .incbin "./build/us_1.0/textures/3d/unknown_2_834.bin" -glabel ASSET_2_835 +glabel ASSET_TEX3D_835 .incbin "./build/us_1.0/textures/3d/unknown_2_835.bin" -glabel ASSET_2_836 +glabel ASSET_TEX3D_836 .incbin "./build/us_1.0/textures/3d/unknown_2_836.bin" -glabel ASSET_2_837 +glabel ASSET_TEX3D_837 .incbin "./build/us_1.0/textures/3d/unknown_2_837.bin" -glabel ASSET_2_838 +glabel ASSET_TEX3D_838 .incbin "./build/us_1.0/textures/3d/unknown_2_838.bin" -glabel ASSET_2_839 +glabel ASSET_TEX3D_839 .incbin "./build/us_1.0/textures/3d/unknown_2_839.bin" -glabel ASSET_2_840 +glabel ASSET_TEX3D_840 .incbin "./build/us_1.0/textures/3d/unknown_2_840.bin" -glabel ASSET_2_841 +glabel ASSET_TEX3D_841 .incbin "./build/us_1.0/textures/3d/unknown_2_841.bin" -glabel ASSET_2_842 +glabel ASSET_TEX3D_842 .incbin "./build/us_1.0/textures/3d/unknown_2_842.bin" -glabel ASSET_2_843 +glabel ASSET_TEX3D_843 .incbin "./build/us_1.0/textures/3d/unknown_2_843.bin" -glabel ASSET_2_844 +glabel ASSET_TEX3D_844 .incbin "./build/us_1.0/textures/3d/unknown_2_844.bin" -glabel ASSET_2_845 +glabel ASSET_TEX3D_845 .incbin "./build/us_1.0/textures/3d/unknown_2_845.bin" -glabel ASSET_2_846 +glabel ASSET_TEX3D_846 .incbin "./build/us_1.0/textures/3d/unknown_2_846.bin" -glabel ASSET_2_847 +glabel ASSET_TEX3D_847 .incbin "./build/us_1.0/textures/3d/unknown_2_847.bin" -glabel ASSET_2_848 +glabel ASSET_TEX3D_848 .incbin "./build/us_1.0/textures/3d/unknown_2_848.bin" -glabel ASSET_2_849 +glabel ASSET_TEX3D_849 .incbin "./build/us_1.0/textures/3d/unknown_2_849.bin" -glabel ASSET_2_850 +glabel ASSET_TEX3D_850 .incbin "./build/us_1.0/textures/3d/unknown_2_850.bin" -glabel ASSET_2_851 +glabel ASSET_TEX3D_851 .incbin "./build/us_1.0/textures/3d/unknown_2_851.bin" -glabel ASSET_2_852 +glabel ASSET_TEX3D_852 .incbin "./build/us_1.0/textures/3d/unknown_2_852.bin" -glabel ASSET_2_853 +glabel ASSET_TEX3D_853 .incbin "./build/us_1.0/textures/3d/unknown_2_853.bin" -glabel ASSET_2_854 +glabel ASSET_TEX3D_854 .incbin "./build/us_1.0/textures/3d/unknown_2_854.bin" -glabel ASSET_2_855 +glabel ASSET_TEX3D_855 .incbin "./build/us_1.0/textures/3d/unknown_2_855.bin" -glabel ASSET_2_856 +glabel ASSET_TEX3D_856 .incbin "./build/us_1.0/textures/3d/unknown_2_856.bin" -glabel ASSET_2_857 +glabel ASSET_TEX3D_857 .incbin "./build/us_1.0/textures/3d/unknown_2_857.bin" -glabel ASSET_2_858 +glabel ASSET_TEX3D_858 .incbin "./build/us_1.0/textures/3d/unknown_2_858.bin" -glabel ASSET_2_859 +glabel ASSET_TEX3D_859 .incbin "./build/us_1.0/textures/3d/unknown_2_859.bin" -glabel ASSET_2_860 +glabel ASSET_TEX3D_860 .incbin "./build/us_1.0/textures/3d/unknown_2_860.bin" -glabel ASSET_2_861 +glabel ASSET_TEX3D_861 .incbin "./build/us_1.0/textures/3d/unknown_2_861.bin" -glabel ASSET_2_862 +glabel ASSET_TEX3D_862 .incbin "./build/us_1.0/textures/3d/unknown_2_862.bin" -glabel ASSET_2_863 +glabel ASSET_TEX3D_863 .incbin "./build/us_1.0/textures/3d/unknown_2_863.bin" -glabel ASSET_2_864 +glabel ASSET_TEX3D_864 .incbin "./build/us_1.0/textures/3d/unknown_2_864.bin" -glabel ASSET_2_865 +glabel ASSET_TEX3D_865 .incbin "./build/us_1.0/textures/3d/unknown_2_865.bin" -glabel ASSET_2_866 +glabel ASSET_TEX3D_866 .incbin "./build/us_1.0/textures/3d/unknown_2_866.bin" -glabel ASSET_2_867 +glabel ASSET_TEX3D_867 .incbin "./build/us_1.0/textures/3d/unknown_2_867.bin" -glabel ASSET_2_868 +glabel ASSET_TEX3D_868 .incbin "./build/us_1.0/textures/3d/unknown_2_868.bin" -glabel ASSET_2_869 +glabel ASSET_TEX3D_869 .incbin "./build/us_1.0/textures/3d/unknown_2_869.bin" -glabel ASSET_2_870 +glabel ASSET_TEX3D_870 .incbin "./build/us_1.0/textures/3d/unknown_2_870.bin" -glabel ASSET_2_871 +glabel ASSET_TEX3D_871 .incbin "./build/us_1.0/textures/3d/unknown_2_871.bin" -glabel ASSET_2_872 +glabel ASSET_TEX3D_872 .incbin "./build/us_1.0/textures/3d/unknown_2_872.bin" -glabel ASSET_2_873 +glabel ASSET_TEX3D_873 .incbin "./build/us_1.0/textures/3d/unknown_2_873.bin" -glabel ASSET_2_874 +glabel ASSET_TEX3D_874 .incbin "./build/us_1.0/textures/3d/unknown_2_874.bin" -glabel ASSET_2_875 +glabel ASSET_TEX3D_875 .incbin "./build/us_1.0/textures/3d/unknown_2_875.bin" -glabel ASSET_2_876 +glabel ASSET_TEX3D_876 .incbin "./build/us_1.0/textures/3d/unknown_2_876.bin" -glabel ASSET_2_877 +glabel ASSET_TEX3D_877 .incbin "./build/us_1.0/textures/3d/unknown_2_877.bin" -glabel ASSET_2_878 +glabel ASSET_TEX3D_878 .incbin "./build/us_1.0/textures/3d/unknown_2_878.bin" -glabel ASSET_2_879 +glabel ASSET_TEX3D_879 .incbin "./build/us_1.0/textures/3d/unknown_2_879.bin" -glabel ASSET_2_880 +glabel ASSET_TEX3D_880 .incbin "./build/us_1.0/textures/3d/unknown_2_880.bin" -glabel ASSET_2_881 +glabel ASSET_TEX3D_881 .incbin "./build/us_1.0/textures/3d/unknown_2_881.bin" -glabel ASSET_2_882 +glabel ASSET_TEX3D_882 .incbin "./build/us_1.0/textures/3d/unknown_2_882.bin" -glabel ASSET_2_883 +glabel ASSET_TEX3D_883 .incbin "./build/us_1.0/textures/3d/unknown_2_883.bin" -glabel ASSET_2_884 +glabel ASSET_TEX3D_884 .incbin "./build/us_1.0/textures/3d/unknown_2_884.bin" -glabel ASSET_2_885 +glabel ASSET_TEX3D_885 .incbin "./build/us_1.0/textures/3d/unknown_2_885.bin" -glabel ASSET_2_886 +glabel ASSET_TEX3D_886 .incbin "./build/us_1.0/textures/3d/unknown_2_886.bin" -glabel ASSET_2_887 +glabel ASSET_TEX3D_887 .incbin "./build/us_1.0/textures/3d/unknown_2_887.bin" -glabel ASSET_2_888 +glabel ASSET_TEX3D_888 .incbin "./build/us_1.0/textures/3d/unknown_2_888.bin" -glabel ASSET_2_889 +glabel ASSET_TEX3D_889 .incbin "./build/us_1.0/textures/3d/unknown_2_889.bin" -glabel ASSET_2_890 +glabel ASSET_TEX3D_890 .incbin "./build/us_1.0/textures/3d/unknown_2_890.bin" -glabel ASSET_2_891 +glabel ASSET_TEX3D_891 .incbin "./build/us_1.0/textures/3d/unknown_2_891.bin" -glabel ASSET_2_892 +glabel ASSET_TEX3D_892 .incbin "./build/us_1.0/textures/3d/unknown_2_892.bin" -glabel ASSET_2_893 +glabel ASSET_TEX3D_893 .incbin "./build/us_1.0/textures/3d/unknown_2_893.bin" -glabel ASSET_2_894 +glabel ASSET_TEX3D_894 .incbin "./build/us_1.0/textures/3d/unknown_2_894.bin" -glabel ASSET_2_895 +glabel ASSET_TEX3D_895 .incbin "./build/us_1.0/textures/3d/unknown_2_895.bin" -glabel ASSET_2_896 +glabel ASSET_TEX3D_896 .incbin "./build/us_1.0/textures/3d/unknown_2_896.bin" -glabel ASSET_2_897 +glabel ASSET_TEX3D_897 .incbin "./build/us_1.0/textures/3d/unknown_2_897.bin" -glabel ASSET_2_898 +glabel ASSET_TEX3D_898 .incbin "./build/us_1.0/textures/3d/unknown_2_898.bin" -glabel ASSET_2_899 +glabel ASSET_TEX3D_899 .incbin "./build/us_1.0/textures/3d/unknown_2_899.bin" -glabel ASSET_2_900 +glabel ASSET_TEX3D_900 .incbin "./build/us_1.0/textures/3d/unknown_2_900.bin" -glabel ASSET_2_901 +glabel ASSET_TEX3D_901 .incbin "./build/us_1.0/textures/3d/unknown_2_901.bin" -glabel ASSET_2_902 +glabel ASSET_TEX3D_902 .incbin "./build/us_1.0/textures/3d/unknown_2_902.bin" -glabel ASSET_2_903 +glabel ASSET_TEX3D_903 .incbin "./build/us_1.0/textures/3d/unknown_2_903.bin" -glabel ASSET_2_904 +glabel ASSET_TEX3D_904 .incbin "./build/us_1.0/textures/3d/unknown_2_904.bin" -glabel ASSET_2_905 +glabel ASSET_TEX3D_905 .incbin "./build/us_1.0/textures/3d/unknown_2_905.bin" -glabel ASSET_2_906 +glabel ASSET_TEX3D_906 .incbin "./build/us_1.0/textures/3d/unknown_2_906.bin" -glabel ASSET_2_907 +glabel ASSET_TEX3D_907 .incbin "./build/us_1.0/textures/3d/unknown_2_907.bin" -glabel ASSET_2_908 +glabel ASSET_TEX3D_908 .incbin "./build/us_1.0/textures/3d/unknown_2_908.bin" -glabel ASSET_2_909 +glabel ASSET_TEX3D_909 .incbin "./build/us_1.0/textures/3d/unknown_2_909.bin" -glabel ASSET_2_910 +glabel ASSET_TEX3D_910 .incbin "./build/us_1.0/textures/3d/unknown_2_910.bin" -glabel ASSET_2_911 +glabel ASSET_TEX3D_911 .incbin "./build/us_1.0/textures/3d/unknown_2_911.bin" -glabel ASSET_2_912 +glabel ASSET_TEX3D_912 .incbin "./build/us_1.0/textures/3d/unknown_2_912.bin" -glabel ASSET_2_913 +glabel ASSET_TEX3D_913 .incbin "./build/us_1.0/textures/3d/unknown_2_913.bin" -glabel ASSET_2_914 +glabel ASSET_TEX3D_914 .incbin "./build/us_1.0/textures/3d/unknown_2_914.bin" -glabel ASSET_2_915 +glabel ASSET_TEX3D_915 .incbin "./build/us_1.0/textures/3d/unknown_2_915.bin" -glabel ASSET_2_916 +glabel ASSET_TEX3D_916 .incbin "./build/us_1.0/textures/3d/unknown_2_916.bin" -glabel ASSET_2_917 +glabel ASSET_TEX3D_917 .incbin "./build/us_1.0/textures/3d/unknown_2_917.bin" -glabel ASSET_2_918 +glabel ASSET_TEX3D_918 .incbin "./build/us_1.0/textures/3d/unknown_2_918.bin" -glabel ASSET_2_919 +glabel ASSET_TEX3D_919 .incbin "./build/us_1.0/textures/3d/unknown_2_919.bin" -glabel ASSET_2_920 +glabel ASSET_TEX3D_920 .incbin "./build/us_1.0/textures/3d/unknown_2_920.bin" -glabel ASSET_2_921 +glabel ASSET_TEX3D_921 .incbin "./build/us_1.0/textures/3d/unknown_2_921.bin" -glabel ASSET_2_922 +glabel ASSET_TEX3D_922 .incbin "./build/us_1.0/textures/3d/unknown_2_922.bin" -glabel ASSET_2_923 +glabel ASSET_TEX3D_923 .incbin "./build/us_1.0/textures/3d/unknown_2_923.bin" -glabel ASSET_2_924 +glabel ASSET_TEX3D_924 .incbin "./build/us_1.0/textures/3d/unknown_2_924.bin" -glabel ASSET_2_925 +glabel ASSET_TEX3D_925 .incbin "./build/us_1.0/textures/3d/unknown_2_925.bin" -glabel ASSET_2_926 +glabel ASSET_TEX3D_926 .incbin "./build/us_1.0/textures/3d/unknown_2_926.bin" -glabel ASSET_2_927 +glabel ASSET_TEX3D_927 .incbin "./build/us_1.0/textures/3d/unknown_2_927.bin" -glabel ASSET_2_928 +glabel ASSET_TEX3D_928 .incbin "./build/us_1.0/textures/3d/unknown_2_928.bin" -glabel ASSET_2_929 +glabel ASSET_TEX3D_929 .incbin "./build/us_1.0/textures/3d/unknown_2_929.bin" -glabel ASSET_2_930 +glabel ASSET_TEX3D_930 .incbin "./build/us_1.0/textures/3d/unknown_2_930.bin" -glabel ASSET_2_931 +glabel ASSET_TEX3D_931 .incbin "./build/us_1.0/textures/3d/unknown_2_931.bin" -glabel ASSET_2_932 +glabel ASSET_TEX3D_932 .incbin "./build/us_1.0/textures/3d/unknown_2_932.bin" -glabel ASSET_2_933 +glabel ASSET_TEX3D_933 .incbin "./build/us_1.0/textures/3d/unknown_2_933.bin" -glabel ASSET_2_934 +glabel ASSET_TEX3D_934 .incbin "./build/us_1.0/textures/3d/unknown_2_934.bin" -glabel ASSET_2_935 +glabel ASSET_TEX3D_935 .incbin "./build/us_1.0/textures/3d/unknown_2_935.bin" -glabel ASSET_2_936 +glabel ASSET_TEX3D_936 .incbin "./build/us_1.0/textures/3d/unknown_2_936.bin" -glabel ASSET_2_937 +glabel ASSET_TEX3D_937 .incbin "./build/us_1.0/textures/3d/unknown_2_937.bin" -glabel ASSET_2_938 +glabel ASSET_TEX3D_938 .incbin "./build/us_1.0/textures/3d/unknown_2_938.bin" -glabel ASSET_2_939 +glabel ASSET_TEX3D_939 .incbin "./build/us_1.0/textures/3d/unknown_2_939.bin" -glabel ASSET_2_940 +glabel ASSET_TEX3D_940 .incbin "./build/us_1.0/textures/3d/unknown_2_940.bin" -glabel ASSET_2_941 +glabel ASSET_TEX3D_941 .incbin "./build/us_1.0/textures/3d/unknown_2_941.bin" -glabel ASSET_2_942 +glabel ASSET_TEX3D_942 .incbin "./build/us_1.0/textures/3d/unknown_2_942.bin" -glabel ASSET_2_943 +glabel ASSET_TEX3D_943 .incbin "./build/us_1.0/textures/3d/unknown_2_943.bin" -glabel ASSET_2_944 +glabel ASSET_TEX3D_944 .incbin "./build/us_1.0/textures/3d/unknown_2_944.bin" -glabel ASSET_2_945 +glabel ASSET_TEX3D_945 .incbin "./build/us_1.0/textures/3d/unknown_2_945.bin" -glabel ASSET_2_946 +glabel ASSET_TEX3D_946 .incbin "./build/us_1.0/textures/3d/unknown_2_946.bin" -glabel ASSET_2_947 +glabel ASSET_TEX3D_947 .incbin "./build/us_1.0/textures/3d/unknown_2_947.bin" -glabel ASSET_2_948 +glabel ASSET_TEX3D_948 .incbin "./build/us_1.0/textures/3d/unknown_2_948.bin" -glabel ASSET_2_949 +glabel ASSET_TEX3D_949 .incbin "./build/us_1.0/textures/3d/unknown_2_949.bin" -glabel ASSET_2_950 +glabel ASSET_TEX3D_950 .incbin "./build/us_1.0/textures/3d/unknown_2_950.bin" -glabel ASSET_2_951 +glabel ASSET_TEX3D_951 .incbin "./build/us_1.0/textures/3d/unknown_2_951.bin" -glabel ASSET_2_952 +glabel ASSET_TEX3D_952 .incbin "./build/us_1.0/textures/3d/unknown_2_952.bin" -glabel ASSET_2_953 +glabel ASSET_TEX3D_953 .incbin "./build/us_1.0/textures/3d/unknown_2_953.bin" -glabel ASSET_2_954 +glabel ASSET_TEX3D_954 .incbin "./build/us_1.0/textures/3d/unknown_2_954.bin" -glabel ASSET_2_955 +glabel ASSET_TEX3D_955 .incbin "./build/us_1.0/textures/3d/unknown_2_955.bin" -glabel ASSET_2_956 +glabel ASSET_TEX3D_956 .incbin "./build/us_1.0/textures/3d/unknown_2_956.bin" -glabel ASSET_2_957 +glabel ASSET_TEX3D_957 .incbin "./build/us_1.0/textures/3d/unknown_2_957.bin" -glabel ASSET_2_958 +glabel ASSET_TEX3D_958 .incbin "./build/us_1.0/textures/3d/unknown_2_958.bin" -glabel ASSET_2_959 +glabel ASSET_TEX3D_959 .incbin "./build/us_1.0/textures/3d/unknown_2_959.bin" -glabel ASSET_2_960 +glabel ASSET_TEX3D_960 .incbin "./build/us_1.0/textures/3d/unknown_2_960.bin" -glabel ASSET_2_961 +glabel ASSET_TEX3D_961 .incbin "./build/us_1.0/textures/3d/unknown_2_961.bin" -glabel ASSET_2_962 +glabel ASSET_TEX3D_962 .incbin "./build/us_1.0/textures/3d/unknown_2_962.bin" -glabel ASSET_2_963 +glabel ASSET_TEX3D_963 .incbin "./build/us_1.0/textures/3d/unknown_2_963.bin" -glabel ASSET_2_964 +glabel ASSET_TEX3D_964 .incbin "./build/us_1.0/textures/3d/unknown_2_964.bin" -glabel ASSET_2_965 +glabel ASSET_TEX3D_965 .incbin "./build/us_1.0/textures/3d/unknown_2_965.bin" -glabel ASSET_2_966 +glabel ASSET_TEX3D_966 .incbin "./build/us_1.0/textures/3d/unknown_2_966.bin" -glabel ASSET_2_967 +glabel ASSET_TEX3D_967 .incbin "./build/us_1.0/textures/3d/unknown_2_967.bin" -glabel ASSET_2_968 +glabel ASSET_TEX3D_968 .incbin "./build/us_1.0/textures/3d/unknown_2_968.bin" -glabel ASSET_2_969 +glabel ASSET_TEX3D_969 .incbin "./build/us_1.0/textures/3d/unknown_2_969.bin" -glabel ASSET_2_970 +glabel ASSET_TEX3D_970 .incbin "./build/us_1.0/textures/3d/unknown_2_970.bin" -glabel ASSET_2_971 +glabel ASSET_TEX3D_971 .incbin "./build/us_1.0/textures/3d/unknown_2_971.bin" -glabel ASSET_2_972 +glabel ASSET_TEX3D_972 .incbin "./build/us_1.0/textures/3d/unknown_2_972.bin" -glabel ASSET_2_973 +glabel ASSET_TEX3D_973 .incbin "./build/us_1.0/textures/3d/unknown_2_973.bin" -glabel ASSET_2_974 +glabel ASSET_TEX3D_974 .incbin "./build/us_1.0/textures/3d/unknown_2_974.bin" -glabel ASSET_2_975 +glabel ASSET_TEX3D_975 .incbin "./build/us_1.0/textures/3d/unknown_2_975.bin" -glabel ASSET_2_976 +glabel ASSET_TEX3D_976 .incbin "./build/us_1.0/textures/3d/unknown_2_976.bin" -glabel ASSET_2_977 +glabel ASSET_TEX3D_977 .incbin "./build/us_1.0/textures/3d/unknown_2_977.bin" -glabel ASSET_2_978 +glabel ASSET_TEX3D_978 .incbin "./build/us_1.0/textures/3d/unknown_2_978.bin" -glabel ASSET_2_979 +glabel ASSET_TEX3D_979 .incbin "./build/us_1.0/textures/3d/unknown_2_979.bin" -glabel ASSET_2_980 +glabel ASSET_TEX3D_980 .incbin "./build/us_1.0/textures/3d/unknown_2_980.bin" -glabel ASSET_2_981 +glabel ASSET_TEX3D_981 .incbin "./build/us_1.0/textures/3d/unknown_2_981.bin" -glabel ASSET_2_982 +glabel ASSET_TEX3D_982 .incbin "./build/us_1.0/textures/3d/unknown_2_982.bin" -glabel ASSET_2_983 +glabel ASSET_TEX3D_983 .incbin "./build/us_1.0/textures/3d/unknown_2_983.bin" -glabel ASSET_2_984 +glabel ASSET_TEX3D_984 .incbin "./build/us_1.0/textures/3d/unknown_2_984.bin" -glabel ASSET_2_985 +glabel ASSET_TEX3D_985 .incbin "./build/us_1.0/textures/3d/unknown_2_985.bin" -glabel ASSET_2_986 +glabel ASSET_TEX3D_986 .incbin "./build/us_1.0/textures/3d/unknown_2_986.bin" -glabel ASSET_2_987 +glabel ASSET_TEX3D_987 .incbin "./build/us_1.0/textures/3d/unknown_2_987.bin" -glabel ASSET_2_988 +glabel ASSET_TEX3D_988 .incbin "./build/us_1.0/textures/3d/unknown_2_988.bin" -glabel ASSET_2_989 +glabel ASSET_TEX3D_989 .incbin "./build/us_1.0/textures/3d/unknown_2_989.bin" -glabel ASSET_2_990 +glabel ASSET_TEX3D_990 .incbin "./build/us_1.0/textures/3d/unknown_2_990.bin" -glabel ASSET_2_991 +glabel ASSET_TEX3D_991 .incbin "./build/us_1.0/textures/3d/unknown_2_991.bin" -glabel ASSET_2_992 +glabel ASSET_TEX3D_992 .incbin "./build/us_1.0/textures/3d/unknown_2_992.bin" -glabel ASSET_2_993 +glabel ASSET_TEX3D_993 .incbin "./build/us_1.0/textures/3d/unknown_2_993.bin" -glabel ASSET_2_994 +glabel ASSET_TEX3D_994 .incbin "./build/us_1.0/textures/3d/unknown_2_994.bin" -glabel ASSET_2_995 +glabel ASSET_TEX3D_995 .incbin "./build/us_1.0/textures/3d/unknown_2_995.bin" -glabel ASSET_2_996 +glabel ASSET_TEX3D_996 .incbin "./build/us_1.0/textures/3d/unknown_2_996.bin" -glabel ASSET_2_997 +glabel ASSET_TEX3D_997 .incbin "./build/us_1.0/textures/3d/unknown_2_997.bin" -glabel ASSET_2_998 +glabel ASSET_TEX3D_998 .incbin "./build/us_1.0/textures/3d/unknown_2_998.bin" -glabel ASSET_2_999 +glabel ASSET_TEX3D_999 .incbin "./build/us_1.0/textures/3d/unknown_2_999.bin" -glabel ASSET_2_1000 +glabel ASSET_TEX3D_1000 .incbin "./build/us_1.0/textures/3d/unknown_2_1000.bin" -glabel ASSET_2_1001 +glabel ASSET_TEX3D_1001 .incbin "./build/us_1.0/textures/3d/unknown_2_1001.bin" -glabel ASSET_2_1002 +glabel ASSET_TEX3D_1002 .incbin "./build/us_1.0/textures/3d/unknown_2_1002.bin" -glabel ASSET_2_1003 +glabel ASSET_TEX3D_1003 .incbin "./build/us_1.0/textures/3d/unknown_2_1003.bin" -glabel ASSET_2_1004 +glabel ASSET_TEX3D_1004 .incbin "./build/us_1.0/textures/3d/unknown_2_1004.bin" -glabel ASSET_2_1005 +glabel ASSET_TEX3D_1005 .incbin "./build/us_1.0/textures/3d/unknown_2_1005.bin" -glabel ASSET_2_1006 +glabel ASSET_TEX3D_1006 .incbin "./build/us_1.0/textures/3d/unknown_2_1006.bin" -glabel ASSET_2_1007 +glabel ASSET_TEX3D_1007 .incbin "./build/us_1.0/textures/3d/unknown_2_1007.bin" -glabel ASSET_2_1008 +glabel ASSET_TEX3D_1008 .incbin "./build/us_1.0/textures/3d/unknown_2_1008.bin" -glabel ASSET_2_1009 +glabel ASSET_TEX3D_1009 .incbin "./build/us_1.0/textures/3d/unknown_2_1009.bin" -glabel ASSET_2_1010 +glabel ASSET_TEX3D_1010 .incbin "./build/us_1.0/textures/3d/unknown_2_1010.bin" -glabel ASSET_2_1011 +glabel ASSET_TEX3D_1011 .incbin "./build/us_1.0/textures/3d/unknown_2_1011.bin" -glabel ASSET_2_1012 +glabel ASSET_TEX3D_1012 .incbin "./build/us_1.0/textures/3d/unknown_2_1012.bin" -glabel ASSET_2_1013 +glabel ASSET_TEX3D_1013 .incbin "./build/us_1.0/textures/3d/unknown_2_1013.bin" -glabel ASSET_2_1014 +glabel ASSET_TEX3D_1014 .incbin "./build/us_1.0/textures/3d/unknown_2_1014.bin" -glabel ASSET_2_1015 +glabel ASSET_TEX3D_1015 .incbin "./build/us_1.0/textures/3d/unknown_2_1015.bin" -glabel ASSET_2_1016 +glabel ASSET_TEX3D_1016 .incbin "./build/us_1.0/textures/3d/unknown_2_1016.bin" -glabel ASSET_2_1017 +glabel ASSET_TEX3D_1017 .incbin "./build/us_1.0/textures/3d/unknown_2_1017.bin" -glabel ASSET_2_1018 +glabel ASSET_TEX3D_1018 .incbin "./build/us_1.0/textures/3d/unknown_2_1018.bin" -glabel ASSET_2_1019 +glabel ASSET_TEX3D_1019 .incbin "./build/us_1.0/textures/3d/unknown_2_1019.bin" -glabel ASSET_2_1020 +glabel ASSET_TEX3D_1020 .incbin "./build/us_1.0/textures/3d/unknown_2_1020.bin" -glabel ASSET_2_1021 +glabel ASSET_TEX3D_1021 .incbin "./build/us_1.0/textures/3d/unknown_2_1021.bin" -glabel ASSET_2_1022 +glabel ASSET_TEX3D_1022 .incbin "./build/us_1.0/textures/3d/unknown_2_1022.bin" -glabel ASSET_2_1023 +glabel ASSET_TEX3D_1023 .incbin "./build/us_1.0/textures/3d/unknown_2_1023.bin" -glabel ASSET_2_1024 +glabel ASSET_TEX3D_1024 .incbin "./build/us_1.0/textures/3d/unknown_2_1024.bin" -glabel ASSET_2_1025 +glabel ASSET_TEX3D_1025 .incbin "./build/us_1.0/textures/3d/unknown_2_1025.bin" -glabel ASSET_2_1026 +glabel ASSET_TEX3D_1026 .incbin "./build/us_1.0/textures/3d/unknown_2_1026.bin" -glabel ASSET_2_1027 +glabel ASSET_TEX3D_1027 .incbin "./build/us_1.0/textures/3d/unknown_2_1027.bin" -glabel ASSET_2_1028 +glabel ASSET_TEX3D_1028 .incbin "./build/us_1.0/textures/3d/unknown_2_1028.bin" -glabel ASSET_2_1029 +glabel ASSET_TEX3D_1029 .incbin "./build/us_1.0/textures/3d/unknown_2_1029.bin" -glabel ASSET_2_1030 +glabel ASSET_TEX3D_1030 .incbin "./build/us_1.0/textures/3d/unknown_2_1030.bin" -glabel ASSET_2_1031 +glabel ASSET_TEX3D_1031 .incbin "./build/us_1.0/textures/3d/unknown_2_1031.bin" -glabel ASSET_2_1032 +glabel ASSET_TEX3D_1032 .incbin "./build/us_1.0/textures/3d/unknown_2_1032.bin" -glabel ASSET_2_1033 +glabel ASSET_TEX3D_1033 .incbin "./build/us_1.0/textures/3d/unknown_2_1033.bin" -glabel ASSET_2_1034 +glabel ASSET_TEX3D_1034 .incbin "./build/us_1.0/textures/3d/unknown_2_1034.bin" -glabel ASSET_2_1035 +glabel ASSET_TEX3D_1035 .incbin "./build/us_1.0/textures/3d/unknown_2_1035.bin" -glabel ASSET_2_1036 +glabel ASSET_TEX3D_1036 .incbin "./build/us_1.0/textures/3d/unknown_2_1036.bin" -glabel ASSET_2_1037 +glabel ASSET_TEX3D_1037 .incbin "./build/us_1.0/textures/3d/unknown_2_1037.bin" -glabel ASSET_2_1038 +glabel ASSET_TEX3D_1038 .incbin "./build/us_1.0/textures/3d/unknown_2_1038.bin" -glabel ASSET_2_1039 +glabel ASSET_TEX3D_1039 .incbin "./build/us_1.0/textures/3d/unknown_2_1039.bin" -glabel ASSET_2_1040 +glabel ASSET_TEX3D_1040 .incbin "./build/us_1.0/textures/3d/unknown_2_1040.bin" -glabel ASSET_2_1041 +glabel ASSET_TEX3D_1041 .incbin "./build/us_1.0/textures/3d/unknown_2_1041.bin" -glabel ASSET_2_1042 +glabel ASSET_TEX3D_1042 .incbin "./build/us_1.0/textures/3d/unknown_2_1042.bin" -glabel ASSET_2_1043 +glabel ASSET_TEX3D_1043 .incbin "./build/us_1.0/textures/3d/unknown_2_1043.bin" -glabel ASSET_2_1044 +glabel ASSET_TEX3D_1044 .incbin "./build/us_1.0/textures/3d/unknown_2_1044.bin" -glabel ASSET_2_1045 +glabel ASSET_TEX3D_1045 .incbin "./build/us_1.0/textures/3d/unknown_2_1045.bin" -glabel ASSET_2_1046 +glabel ASSET_TEX3D_1046 .incbin "./build/us_1.0/textures/3d/unknown_2_1046.bin" -glabel ASSET_2_1047 +glabel ASSET_TEX3D_1047 .incbin "./build/us_1.0/textures/3d/unknown_2_1047.bin" -glabel ASSET_2_1048 +glabel ASSET_TEX3D_1048 .incbin "./build/us_1.0/textures/3d/unknown_2_1048.bin" -glabel ASSET_2_1049 +glabel ASSET_TEX3D_1049 .incbin "./build/us_1.0/textures/3d/unknown_2_1049.bin" -glabel ASSET_2_1050 +glabel ASSET_TEX3D_1050 .incbin "./build/us_1.0/textures/3d/unknown_2_1050.bin" -glabel ASSET_2_1051 +glabel ASSET_TEX3D_1051 .incbin "./build/us_1.0/textures/3d/unknown_2_1051.bin" -glabel ASSET_2_1052 +glabel ASSET_TEX3D_1052 .incbin "./build/us_1.0/textures/3d/unknown_2_1052.bin" -glabel ASSET_2_1053 +glabel ASSET_TEX3D_1053 .incbin "./build/us_1.0/textures/3d/unknown_2_1053.bin" -glabel ASSET_2_1054 +glabel ASSET_TEX3D_1054 .incbin "./build/us_1.0/textures/3d/unknown_2_1054.bin" -glabel ASSET_2_1055 +glabel ASSET_TEX3D_1055 .incbin "./build/us_1.0/textures/3d/unknown_2_1055.bin" -glabel ASSET_2_1056 +glabel ASSET_TEX3D_1056 .incbin "./build/us_1.0/textures/3d/unknown_2_1056.bin" -glabel ASSET_2_1057 +glabel ASSET_TEX3D_1057 .incbin "./build/us_1.0/textures/3d/unknown_2_1057.bin" -glabel ASSET_2_1058 +glabel ASSET_TEX3D_1058 .incbin "./build/us_1.0/textures/3d/unknown_2_1058.bin" -glabel ASSET_2_1059 +glabel ASSET_TEX3D_1059 .incbin "./build/us_1.0/textures/3d/unknown_2_1059.bin" -glabel ASSET_2_1060 +glabel ASSET_TEX3D_1060 .incbin "./build/us_1.0/textures/3d/unknown_2_1060.bin" -glabel ASSET_2_1061 +glabel ASSET_TEX3D_1061 .incbin "./build/us_1.0/textures/3d/unknown_2_1061.bin" -glabel ASSET_2_1062 +glabel ASSET_TEX3D_1062 .incbin "./build/us_1.0/textures/3d/unknown_2_1062.bin" -glabel ASSET_2_1063 +glabel ASSET_TEX3D_1063 .incbin "./build/us_1.0/textures/3d/unknown_2_1063.bin" -glabel ASSET_2_1064 +glabel ASSET_TEX3D_1064 .incbin "./build/us_1.0/textures/3d/unknown_2_1064.bin" -glabel ASSET_2_1065 +glabel ASSET_TEX3D_1065 .incbin "./build/us_1.0/textures/3d/unknown_2_1065.bin" -glabel ASSET_2_1066 +glabel ASSET_TEX3D_1066 .incbin "./build/us_1.0/textures/3d/unknown_2_1066.bin" -glabel ASSET_2_1067 +glabel ASSET_TEX3D_1067 .incbin "./build/us_1.0/textures/3d/unknown_2_1067.bin" -glabel ASSET_2_1068 +glabel ASSET_TEX3D_1068 .incbin "./build/us_1.0/textures/3d/unknown_2_1068.bin" -glabel ASSET_2_1069 +glabel ASSET_TEX3D_1069 .incbin "./build/us_1.0/textures/3d/unknown_2_1069.bin" -glabel ASSET_2_1070 +glabel ASSET_TEX3D_1070 .incbin "./build/us_1.0/textures/3d/unknown_2_1070.bin" -glabel ASSET_2_1071 +glabel ASSET_TEX3D_1071 .incbin "./build/us_1.0/textures/3d/unknown_2_1071.bin" -glabel ASSET_2_1072 +glabel ASSET_TEX3D_1072 .incbin "./build/us_1.0/textures/3d/unknown_2_1072.bin" -glabel ASSET_2_1073 +glabel ASSET_TEX3D_1073 .incbin "./build/us_1.0/textures/3d/unknown_2_1073.bin" -glabel ASSET_2_1074 +glabel ASSET_TEX3D_1074 .incbin "./build/us_1.0/textures/3d/unknown_2_1074.bin" -glabel ASSET_2_1075 +glabel ASSET_TEX3D_1075 .incbin "./build/us_1.0/textures/3d/unknown_2_1075.bin" -glabel ASSET_2_1076 +glabel ASSET_TEX3D_1076 .incbin "./build/us_1.0/textures/3d/unknown_2_1076.bin" -glabel ASSET_2_1077 +glabel ASSET_TEX3D_1077 .incbin "./build/us_1.0/textures/3d/unknown_2_1077.bin" -glabel ASSET_2_1078 +glabel ASSET_TEX3D_1078 .incbin "./build/us_1.0/textures/3d/unknown_2_1078.bin" -glabel ASSET_2_1079 +glabel ASSET_TEX3D_1079 .incbin "./build/us_1.0/textures/3d/unknown_2_1079.bin" -glabel ASSET_2_1080 +glabel ASSET_TEX3D_1080 .incbin "./build/us_1.0/textures/3d/unknown_2_1080.bin" -glabel ASSET_2_1081 +glabel ASSET_TEX3D_1081 .incbin "./build/us_1.0/textures/3d/unknown_2_1081.bin" -glabel ASSET_2_1082 +glabel ASSET_TEX3D_1082 .incbin "./build/us_1.0/textures/3d/unknown_2_1082.bin" -glabel ASSET_2_1083 +glabel ASSET_TEX3D_1083 .incbin "./build/us_1.0/textures/3d/unknown_2_1083.bin" -glabel ASSET_2_1084 +glabel ASSET_TEX3D_1084 .incbin "./build/us_1.0/textures/3d/unknown_2_1084.bin" -glabel ASSET_2_1085 +glabel ASSET_TEX3D_1085 .incbin "./build/us_1.0/textures/3d/unknown_2_1085.bin" -glabel ASSET_2_1086 +glabel ASSET_TEX3D_1086 .incbin "./build/us_1.0/textures/3d/unknown_2_1086.bin" -glabel ASSET_2_1087 +glabel ASSET_TEX3D_1087 .incbin "./build/us_1.0/textures/3d/unknown_2_1087.bin" -glabel ASSET_2_1088 +glabel ASSET_TEX3D_1088 .incbin "./build/us_1.0/textures/3d/unknown_2_1088.bin" -glabel ASSET_2_1089 +glabel ASSET_TEX3D_1089 .incbin "./build/us_1.0/textures/3d/unknown_2_1089.bin" -glabel ASSET_2_1090 +glabel ASSET_TEX3D_1090 .incbin "./build/us_1.0/textures/3d/unknown_2_1090.bin" -glabel ASSET_2_1091 +glabel ASSET_TEX3D_1091 .incbin "./build/us_1.0/textures/3d/unknown_2_1091.bin" -glabel ASSET_2_1092 +glabel ASSET_TEX3D_1092 .incbin "./build/us_1.0/textures/3d/unknown_2_1092.bin" -glabel ASSET_2_1093 +glabel ASSET_TEX3D_1093 .incbin "./build/us_1.0/textures/3d/unknown_2_1093.bin" -glabel ASSET_2_1094 +glabel ASSET_TEX3D_1094 .incbin "./build/us_1.0/textures/3d/unknown_2_1094.bin" -glabel ASSET_2_1095 +glabel ASSET_TEX3D_1095 .incbin "./build/us_1.0/textures/3d/unknown_2_1095.bin" -glabel ASSET_2_1096 +glabel ASSET_TEX3D_1096 .incbin "./build/us_1.0/textures/3d/unknown_2_1096.bin" -glabel ASSET_2_1097 +glabel ASSET_TEX3D_1097 .incbin "./build/us_1.0/textures/3d/unknown_2_1097.bin" -glabel ASSET_2_1098 +glabel ASSET_TEX3D_1098 .incbin "./build/us_1.0/textures/3d/unknown_2_1098.bin" -glabel ASSET_2_1099 +glabel ASSET_TEX3D_1099 .incbin "./build/us_1.0/textures/3d/unknown_2_1099.bin" -glabel ASSET_2_1100 +glabel ASSET_TEX3D_1100 .incbin "./build/us_1.0/textures/3d/unknown_2_1100.bin" -glabel ASSET_2_1101 +glabel ASSET_TEX3D_1101 .incbin "./build/us_1.0/textures/3d/unknown_2_1101.bin" -glabel ASSET_2_1102 +glabel ASSET_TEX3D_1102 .incbin "./build/us_1.0/textures/3d/unknown_2_1102.bin" -glabel ASSET_2_1103 +glabel ASSET_TEX3D_1103 .incbin "./build/us_1.0/textures/3d/unknown_2_1103.bin" -glabel ASSET_2_1104 +glabel ASSET_TEX3D_1104 .incbin "./build/us_1.0/textures/3d/unknown_2_1104.bin" -glabel ASSET_2_1105 +glabel ASSET_TEX3D_1105 .incbin "./build/us_1.0/textures/3d/unknown_2_1105.bin" -glabel ASSET_2_1106 +glabel ASSET_TEX3D_1106 .incbin "./build/us_1.0/textures/3d/unknown_2_1106.bin" -glabel ASSET_2_1107 +glabel ASSET_TEX3D_1107 .incbin "./build/us_1.0/textures/3d/unknown_2_1107.bin" -glabel ASSET_2_1108 +glabel ASSET_TEX3D_1108 .incbin "./build/us_1.0/textures/3d/unknown_2_1108.bin" -glabel ASSET_2_1109 +glabel ASSET_TEX3D_1109 .incbin "./build/us_1.0/textures/3d/unknown_2_1109.bin" -glabel ASSET_2_1110 +glabel ASSET_TEX3D_1110 .incbin "./build/us_1.0/textures/3d/unknown_2_1110.bin" -glabel ASSET_2_1111 +glabel ASSET_TEX3D_1111 .incbin "./build/us_1.0/textures/3d/unknown_2_1111.bin" -glabel ASSET_2_1112 +glabel ASSET_TEX3D_1112 .incbin "./build/us_1.0/textures/3d/unknown_2_1112.bin" -glabel ASSET_2_1113 +glabel ASSET_TEX3D_1113 .incbin "./build/us_1.0/textures/3d/unknown_2_1113.bin" -glabel ASSET_2_1114 +glabel ASSET_TEX3D_1114 .incbin "./build/us_1.0/textures/3d/unknown_2_1114.bin" -glabel ASSET_2_1115 +glabel ASSET_TEX3D_1115 .incbin "./build/us_1.0/textures/3d/unknown_2_1115.bin" -glabel ASSET_2_1116 +glabel ASSET_TEX3D_1116 .incbin "./build/us_1.0/textures/3d/unknown_2_1116.bin" -glabel ASSET_2_1117 +glabel ASSET_TEX3D_1117 .incbin "./build/us_1.0/textures/3d/unknown_2_1117.bin" -glabel ASSET_2_1118 +glabel ASSET_TEX3D_1118 .incbin "./build/us_1.0/textures/3d/unknown_2_1118.bin" -glabel ASSET_2_1119 +glabel ASSET_TEX3D_1119 .incbin "./build/us_1.0/textures/3d/unknown_2_1119.bin" -glabel ASSET_2_1120 +glabel ASSET_TEX3D_1120 .incbin "./build/us_1.0/textures/3d/unknown_2_1120.bin" -glabel ASSET_2_1121 +glabel ASSET_TEX3D_1121 .incbin "./build/us_1.0/textures/3d/unknown_2_1121.bin" -glabel ASSET_2_1122 +glabel ASSET_TEX3D_1122 .incbin "./build/us_1.0/textures/3d/unknown_2_1122.bin" -glabel ASSET_2_1123 +glabel ASSET_TEX3D_1123 .incbin "./build/us_1.0/textures/3d/unknown_2_1123.bin" -glabel ASSET_2_1124 +glabel ASSET_TEX3D_1124 .incbin "./build/us_1.0/textures/3d/unknown_2_1124.bin" -glabel ASSET_2_1125 +glabel ASSET_TEX3D_1125 .incbin "./build/us_1.0/textures/3d/unknown_2_1125.bin" -glabel ASSET_2_1126 +glabel ASSET_TEX3D_1126 .incbin "./build/us_1.0/textures/3d/unknown_2_1126.bin" -glabel ASSET_2_1127 +glabel ASSET_TEX3D_1127 .incbin "./build/us_1.0/textures/3d/unknown_2_1127.bin" -glabel ASSET_2_1128 +glabel ASSET_TEX3D_1128 .incbin "./build/us_1.0/textures/3d/unknown_2_1128.bin" -glabel ASSET_2_1129 +glabel ASSET_TEX3D_1129 .incbin "./build/us_1.0/textures/3d/unknown_2_1129.bin" -glabel ASSET_2_1130 +glabel ASSET_TEX3D_1130 .incbin "./build/us_1.0/textures/3d/unknown_2_1130.bin" -glabel ASSET_2_1131 +glabel ASSET_TEX3D_1131 .incbin "./build/us_1.0/textures/3d/unknown_2_1131.bin" -glabel ASSET_2_1132 +glabel ASSET_TEX3D_1132 .incbin "./build/us_1.0/textures/3d/unknown_2_1132.bin" -glabel ASSET_2_1133 +glabel ASSET_TEX3D_1133 .incbin "./build/us_1.0/textures/3d/unknown_2_1133.bin" -glabel ASSET_2_1134 +glabel ASSET_TEX3D_1134 .incbin "./build/us_1.0/textures/3d/unknown_2_1134.bin" -glabel ASSET_2_1135 +glabel ASSET_TEX3D_1135 .incbin "./build/us_1.0/textures/3d/unknown_2_1135.bin" -glabel ASSET_2_1136 +glabel ASSET_TEX3D_1136 .incbin "./build/us_1.0/textures/3d/unknown_2_1136.bin" -glabel ASSET_2_1137 +glabel ASSET_TEX3D_1137 .incbin "./build/us_1.0/textures/3d/unknown_2_1137.bin" -glabel ASSET_2_1138 +glabel ASSET_TEX3D_1138 .incbin "./build/us_1.0/textures/3d/unknown_2_1138.bin" -glabel ASSET_2_1139 +glabel ASSET_TEX3D_1139 .incbin "./build/us_1.0/textures/3d/unknown_2_1139.bin" -glabel ASSET_2_1140 +glabel ASSET_TEX3D_1140 .incbin "./build/us_1.0/textures/3d/unknown_2_1140.bin" -glabel ASSET_2_1141 +glabel ASSET_TEX3D_1141 .incbin "./build/us_1.0/textures/3d/unknown_2_1141.bin" -glabel ASSET_2_1142 +glabel ASSET_TEX3D_1142 .incbin "./build/us_1.0/textures/3d/unknown_2_1142.bin" -glabel ASSET_2_1143 +glabel ASSET_TEX3D_1143 .incbin "./build/us_1.0/textures/3d/unknown_2_1143.bin" -glabel ASSET_2_1144 +glabel ASSET_TEX3D_1144 .incbin "./build/us_1.0/textures/3d/unknown_2_1144.bin" -glabel ASSET_2_1145 +glabel ASSET_TEX3D_1145 .incbin "./build/us_1.0/textures/3d/unknown_2_1145.bin" -glabel ASSET_2_1146 +glabel ASSET_TEX3D_1146 .incbin "./build/us_1.0/textures/3d/unknown_2_1146.bin" -glabel ASSET_2_1147 +glabel ASSET_TEX3D_1147 .incbin "./build/us_1.0/textures/3d/unknown_2_1147.bin" -glabel ASSET_2_1148 +glabel ASSET_TEX3D_1148 .incbin "./build/us_1.0/textures/3d/unknown_2_1148.bin" -glabel ASSET_2_1149 +glabel ASSET_TEX3D_1149 .incbin "./build/us_1.0/textures/3d/unknown_2_1149.bin" -glabel ASSET_2_1150 +glabel ASSET_TEX3D_1150 .incbin "./build/us_1.0/textures/3d/unknown_2_1150.bin" -glabel ASSET_2_1151 +glabel ASSET_TEX3D_1151 .incbin "./build/us_1.0/textures/3d/unknown_2_1151.bin" -glabel ASSET_2_1152 +glabel ASSET_TEX3D_1152 .incbin "./build/us_1.0/textures/3d/unknown_2_1152.bin" -glabel ASSET_2_1153 +glabel ASSET_TEX3D_1153 .incbin "./build/us_1.0/textures/3d/unknown_2_1153.bin" -glabel ASSET_2_1154 +glabel ASSET_TEX3D_1154 .incbin "./build/us_1.0/textures/3d/unknown_2_1154.bin" -glabel ASSET_2_1155 +glabel ASSET_TEX3D_1155 .incbin "./build/us_1.0/textures/3d/unknown_2_1155.bin" -glabel ASSET_2_1156 +glabel ASSET_TEX3D_1156 .incbin "./build/us_1.0/textures/3d/unknown_2_1156.bin" -glabel ASSET_2_1157 +glabel ASSET_TEX3D_1157 .incbin "./build/us_1.0/textures/3d/unknown_2_1157.bin" -glabel ASSET_2_1158 +glabel ASSET_TEX3D_1158 .incbin "./build/us_1.0/textures/3d/unknown_2_1158.bin" -glabel ASSET_2_1159 +glabel ASSET_TEX3D_1159 .incbin "./build/us_1.0/textures/3d/unknown_2_1159.bin" -glabel ASSET_2_1160 +glabel ASSET_TEX3D_1160 .incbin "./build/us_1.0/textures/3d/unknown_2_1160.bin" -glabel ASSET_2_1161 +glabel ASSET_TEX3D_1161 .incbin "./build/us_1.0/textures/3d/unknown_2_1161.bin" -glabel ASSET_2_1162 +glabel ASSET_TEX3D_1162 .incbin "./build/us_1.0/textures/3d/unknown_2_1162.bin" -glabel ASSET_2_1163 +glabel ASSET_TEX3D_1163 .incbin "./build/us_1.0/textures/3d/unknown_2_1163.bin" -glabel ASSET_2_1164 +glabel ASSET_TEX3D_1164 .incbin "./build/us_1.0/textures/3d/unknown_2_1164.bin" -glabel ASSET_2_1165 +glabel ASSET_TEX3D_1165 .incbin "./build/us_1.0/textures/3d/unknown_2_1165.bin" -glabel ASSET_2_1166 +glabel ASSET_TEX3D_1166 .incbin "./build/us_1.0/textures/3d/unknown_2_1166.bin" -glabel ASSET_2_1167 +glabel ASSET_TEX3D_1167 .incbin "./build/us_1.0/textures/3d/unknown_2_1167.bin" -glabel ASSET_2_1168 +glabel ASSET_TEX3D_1168 .incbin "./build/us_1.0/textures/3d/unknown_2_1168.bin" -glabel ASSET_2_1169 +glabel ASSET_TEX3D_1169 .incbin "./build/us_1.0/textures/3d/unknown_2_1169.bin" -glabel ASSET_2_1170 +glabel ASSET_TEX3D_1170 .incbin "./build/us_1.0/textures/3d/unknown_2_1170.bin" -glabel ASSET_2_1171 +glabel ASSET_TEX3D_1171 .incbin "./build/us_1.0/textures/3d/unknown_2_1171.bin" -glabel ASSET_2_1172 +glabel ASSET_TEX3D_1172 .incbin "./build/us_1.0/textures/3d/unknown_2_1172.bin" -glabel ASSET_2_1173 +glabel ASSET_TEX3D_1173 .incbin "./build/us_1.0/textures/3d/unknown_2_1173.bin" -glabel ASSET_2_1174 +glabel ASSET_TEX3D_1174 .incbin "./build/us_1.0/textures/3d/unknown_2_1174.bin" -glabel ASSET_2_1175 +glabel ASSET_TEX3D_1175 .incbin "./build/us_1.0/textures/3d/unknown_2_1175.bin" -glabel ASSET_2_1176 +glabel ASSET_TEX3D_1176 .incbin "./build/us_1.0/textures/3d/unknown_2_1176.bin" -glabel ASSET_2_1177 +glabel ASSET_TEX3D_1177 .incbin "./build/us_1.0/textures/3d/unknown_2_1177.bin" -glabel ASSET_2_1178 +glabel ASSET_TEX3D_1178 .incbin "./build/us_1.0/textures/3d/unknown_2_1178.bin" -glabel ASSET_2_1179 +glabel ASSET_TEX3D_1179 .incbin "./build/us_1.0/textures/3d/unknown_2_1179.bin" -glabel ASSET_2_1180 +glabel ASSET_TEX3D_1180 .incbin "./build/us_1.0/textures/3d/unknown_2_1180.bin" -glabel ASSET_2_1181 +glabel ASSET_TEX3D_1181 .incbin "./build/us_1.0/textures/3d/unknown_2_1181.bin" -glabel ASSET_2_1182 +glabel ASSET_TEX3D_1182 .incbin "./build/us_1.0/textures/3d/unknown_2_1182.bin" -glabel ASSET_2_1183 +glabel ASSET_TEX3D_1183 .incbin "./build/us_1.0/textures/3d/unknown_2_1183.bin" -glabel ASSET_2_1184 +glabel ASSET_TEX3D_1184 .incbin "./build/us_1.0/textures/3d/unknown_2_1184.bin" -glabel ASSET_2_1185 +glabel ASSET_TEX3D_1185 .incbin "./build/us_1.0/textures/3d/unknown_2_1185.bin" -glabel ASSET_2_1186 +glabel ASSET_TEX3D_1186 .incbin "./build/us_1.0/textures/3d/unknown_2_1186.bin" -glabel ASSET_2_1187 +glabel ASSET_TEX3D_1187 .incbin "./build/us_1.0/textures/3d/unknown_2_1187.bin" -glabel ASSET_2_1188 +glabel ASSET_TEX3D_1188 .incbin "./build/us_1.0/textures/3d/unknown_2_1188.bin" -glabel ASSET_2_1189 +glabel ASSET_TEX3D_1189 .incbin "./build/us_1.0/textures/3d/unknown_2_1189.bin" -glabel ASSET_2_1190 +glabel ASSET_TEX3D_1190 .incbin "./build/us_1.0/textures/3d/unknown_2_1190.bin" -glabel ASSET_2_1191 +glabel ASSET_TEX3D_1191 .incbin "./build/us_1.0/textures/3d/unknown_2_1191.bin" -glabel ASSET_2_1192 +glabel ASSET_TEX3D_1192 .incbin "./build/us_1.0/textures/3d/unknown_2_1192.bin" -glabel ASSET_2_1193 +glabel ASSET_TEX3D_1193 .incbin "./build/us_1.0/textures/3d/unknown_2_1193.bin" -glabel ASSET_2_1194 +glabel ASSET_TEX3D_1194 .incbin "./build/us_1.0/textures/3d/unknown_2_1194.bin" -glabel ASSET_2_1195 +glabel ASSET_TEX3D_1195 .incbin "./build/us_1.0/textures/3d/unknown_2_1195.bin" -glabel ASSET_2_1196 +glabel ASSET_TEX3D_1196 .incbin "./build/us_1.0/textures/3d/unknown_2_1196.bin" -glabel ASSET_2_1197 +glabel ASSET_TEX3D_1197 .incbin "./build/us_1.0/textures/3d/unknown_2_1197.bin" -glabel ASSET_2_1198 +glabel ASSET_TEX3D_1198 .incbin "./build/us_1.0/textures/3d/unknown_2_1198.bin" -glabel ASSET_2_1199 +glabel ASSET_TEX3D_1199 .incbin "./build/us_1.0/textures/3d/unknown_2_1199.bin" -glabel ASSET_2_1200 +glabel ASSET_TEX3D_1200 .incbin "./build/us_1.0/textures/3d/unknown_2_1200.bin" -glabel ASSET_2_1201 +glabel ASSET_TEX3D_1201 .incbin "./build/us_1.0/textures/3d/unknown_2_1201.bin" -glabel ASSET_2_1202 +glabel ASSET_TEX3D_1202 .incbin "./build/us_1.0/textures/3d/unknown_2_1202.bin" -glabel ASSET_2_1203 +glabel ASSET_TEX3D_1203 .incbin "./build/us_1.0/textures/3d/unknown_2_1203.bin" -glabel ASSET_2_1204 +glabel ASSET_TEX3D_1204 .incbin "./build/us_1.0/textures/3d/unknown_2_1204.bin" -glabel ASSET_2_1205 +glabel ASSET_TEX3D_1205 .incbin "./build/us_1.0/textures/3d/unknown_2_1205.bin" -glabel ASSET_2_1206 +glabel ASSET_TEX3D_1206 .incbin "./build/us_1.0/textures/3d/unknown_2_1206.bin" -glabel ASSET_2_1207 +glabel ASSET_TEX3D_1207 .incbin "./build/us_1.0/textures/3d/unknown_2_1207.bin" -glabel ASSET_2_1208 +glabel ASSET_TEX3D_1208 .incbin "./build/us_1.0/textures/3d/unknown_2_1208.bin" -glabel ASSET_2_1209 +glabel ASSET_TEX3D_1209 .incbin "./build/us_1.0/textures/3d/unknown_2_1209.bin" -glabel ASSET_2_1210 +glabel ASSET_TEX3D_1210 .incbin "./build/us_1.0/textures/3d/unknown_2_1210.bin" -glabel ASSET_2_1211 +glabel ASSET_TEX3D_1211 .incbin "./build/us_1.0/textures/3d/unknown_2_1211.bin" -glabel ASSET_2_1212 +glabel ASSET_TEX3D_1212 .incbin "./build/us_1.0/textures/3d/unknown_2_1212.bin" -glabel ASSET_2_1213 +glabel ASSET_TEX3D_1213 .incbin "./build/us_1.0/textures/3d/unknown_2_1213.bin" -glabel ASSET_2_1214 +glabel ASSET_TEX3D_1214 .incbin "./build/us_1.0/textures/3d/unknown_2_1214.bin" -glabel ASSET_2_1215 +glabel ASSET_TEX3D_1215 .incbin "./build/us_1.0/textures/3d/unknown_2_1215.bin" -glabel ASSET_2_1216 +glabel ASSET_TEX3D_1216 .incbin "./build/us_1.0/textures/3d/unknown_2_1216.bin" -glabel ASSET_2_1217 +glabel ASSET_TEX3D_1217 .incbin "./build/us_1.0/textures/3d/unknown_2_1217.bin" -glabel ASSET_2_1218 +glabel ASSET_TEX3D_1218 .incbin "./build/us_1.0/textures/3d/unknown_2_1218.bin" -glabel ASSET_2_1219 +glabel ASSET_TEX3D_1219 .incbin "./build/us_1.0/textures/3d/unknown_2_1219.bin" -glabel ASSET_2_1220 +glabel ASSET_TEX3D_1220 .incbin "./build/us_1.0/textures/3d/unknown_2_1220.bin" -glabel ASSET_2_1221 +glabel ASSET_TEX3D_1221 .incbin "./build/us_1.0/textures/3d/unknown_2_1221.bin" -glabel ASSET_2_1222 +glabel ASSET_TEX3D_1222 .incbin "./build/us_1.0/textures/3d/unknown_2_1222.bin" -glabel ASSET_2_1223 +glabel ASSET_TEX3D_1223 .incbin "./build/us_1.0/textures/3d/unknown_2_1223.bin" -glabel ASSET_2_1224 +glabel ASSET_TEX3D_1224 .incbin "./build/us_1.0/textures/3d/unknown_2_1224.bin" -glabel ASSET_2_1225 +glabel ASSET_TEX3D_1225 .incbin "./build/us_1.0/textures/3d/unknown_2_1225.bin" -glabel ASSET_2_1226 +glabel ASSET_TEX3D_1226 .incbin "./build/us_1.0/textures/3d/unknown_2_1226.bin" -glabel ASSET_2_1227 +glabel ASSET_TEX3D_1227 .incbin "./build/us_1.0/textures/3d/unknown_2_1227.bin" -glabel ASSET_2_1228 +glabel ASSET_TEX3D_1228 .incbin "./build/us_1.0/textures/3d/unknown_2_1228.bin" -glabel ASSET_2_1229 +glabel ASSET_TEX3D_1229 .incbin "./build/us_1.0/textures/3d/unknown_2_1229.bin" -glabel ASSET_2_1230 +glabel ASSET_TEX3D_1230 .incbin "./build/us_1.0/textures/3d/unknown_2_1230.bin" -glabel ASSET_2_1231 +glabel ASSET_TEX3D_1231 .incbin "./build/us_1.0/textures/3d/unknown_2_1231.bin" -glabel ASSET_2_1232 +glabel ASSET_TEX3D_1232 .incbin "./build/us_1.0/textures/3d/unknown_2_1232.bin" -glabel ASSET_2_1233 +glabel ASSET_TEX3D_1233 .incbin "./build/us_1.0/textures/3d/unknown_2_1233.bin" -glabel ASSET_2_1234 +glabel ASSET_TEX3D_1234 .incbin "./build/us_1.0/textures/3d/unknown_2_1234.bin" -glabel ASSET_2_1235 +glabel ASSET_TEX3D_1235 .incbin "./build/us_1.0/textures/3d/unknown_2_1235.bin" -glabel ASSET_2_1236 +glabel ASSET_TEX3D_1236 .incbin "./build/us_1.0/textures/3d/unknown_2_1236.bin" -glabel ASSET_2_1237 +glabel ASSET_TEX3D_1237 .incbin "./build/us_1.0/textures/3d/unknown_2_1237.bin" -glabel ASSET_2_1238 +glabel ASSET_TEX3D_1238 .incbin "./build/us_1.0/textures/3d/unknown_2_1238.bin" -glabel ASSET_2_1239 +glabel ASSET_TEX3D_1239 .incbin "./build/us_1.0/textures/3d/unknown_2_1239.bin" -glabel ASSET_2_1240 +glabel ASSET_TEX3D_1240 .incbin "./build/us_1.0/textures/3d/unknown_2_1240.bin" -glabel ASSET_2_1241 +glabel ASSET_TEX3D_1241 .incbin "./build/us_1.0/textures/3d/unknown_2_1241.bin" -glabel ASSET_2_1242 +glabel ASSET_TEX3D_1242 .incbin "./build/us_1.0/textures/3d/unknown_2_1242.bin" -glabel ASSET_2_1243 +glabel ASSET_TEX3D_1243 .incbin "./build/us_1.0/textures/3d/unknown_2_1243.bin" -glabel ASSET_2_1244 +glabel ASSET_TEX3D_1244 .incbin "./build/us_1.0/textures/3d/unknown_2_1244.bin" -glabel ASSET_2_1245 +glabel ASSET_TEX3D_1245 .incbin "./build/us_1.0/textures/3d/unknown_2_1245.bin" -glabel ASSET_2_1246 +glabel ASSET_TEX3D_1246 .incbin "./build/us_1.0/textures/3d/unknown_2_1246.bin" -glabel ASSET_2_1247 +glabel ASSET_TEX3D_1247 .incbin "./build/us_1.0/textures/3d/unknown_2_1247.bin" -glabel ASSET_2_1248 +glabel ASSET_TEX3D_1248 .incbin "./build/us_1.0/textures/3d/unknown_2_1248.bin" -glabel ASSET_2_1249 +glabel ASSET_TEX3D_1249 .incbin "./build/us_1.0/textures/3d/unknown_2_1249.bin" -glabel ASSET_2_1250 +glabel ASSET_TEX3D_1250 .incbin "./build/us_1.0/textures/3d/unknown_2_1250.bin" -glabel ASSET_2_1251 +glabel ASSET_TEX3D_1251 .incbin "./build/us_1.0/textures/3d/unknown_2_1251.bin" -glabel ASSET_2_1252 +glabel ASSET_TEX3D_1252 .incbin "./build/us_1.0/textures/3d/unknown_2_1252.bin" -glabel ASSET_2_1253 +glabel ASSET_TEX3D_1253 .incbin "./build/us_1.0/textures/3d/unknown_2_1253.bin" -glabel ASSET_2_1254 +glabel ASSET_TEX3D_1254 .incbin "./build/us_1.0/textures/3d/unknown_2_1254.bin" -glabel ASSET_2_1255 +glabel ASSET_TEX3D_1255 .incbin "./build/us_1.0/textures/3d/unknown_2_1255.bin" -glabel ASSET_2_1256 +glabel ASSET_TEX3D_1256 .incbin "./build/us_1.0/textures/3d/unknown_2_1256.bin" -glabel ASSET_2_1257 +glabel ASSET_TEX3D_1257 .incbin "./build/us_1.0/textures/3d/unknown_2_1257.bin" -glabel ASSET_2_1258 +glabel ASSET_TEX3D_1258 .incbin "./build/us_1.0/textures/3d/unknown_2_1258.bin" -glabel ASSET_2_1259 +glabel ASSET_TEX3D_1259 .incbin "./build/us_1.0/textures/3d/unknown_2_1259.bin" -glabel ASSET_2_1260 +glabel ASSET_TEX3D_1260 .incbin "./build/us_1.0/textures/3d/unknown_2_1260.bin" -glabel ASSET_2_1261 +glabel ASSET_TEX3D_1261 .incbin "./build/us_1.0/textures/3d/unknown_2_1261.bin" -glabel ASSET_2_1262 +glabel ASSET_TEX3D_1262 .incbin "./build/us_1.0/textures/3d/unknown_2_1262.bin" -glabel ASSET_2_1263 +glabel ASSET_TEX3D_1263 .incbin "./build/us_1.0/textures/3d/unknown_2_1263.bin" -glabel ASSET_2_1264 +glabel ASSET_TEX3D_1264 .incbin "./build/us_1.0/textures/3d/unknown_2_1264.bin" -glabel ASSET_2_1265 +glabel ASSET_TEX3D_1265 .incbin "./build/us_1.0/textures/3d/unknown_2_1265.bin" -glabel ASSET_2_1266 +glabel ASSET_TEX3D_1266 .incbin "./build/us_1.0/textures/3d/unknown_2_1266.bin" -glabel ASSET_2_1267 +glabel ASSET_TEX3D_1267 .incbin "./build/us_1.0/textures/3d/unknown_2_1267.bin" -glabel ASSET_2_1268 +glabel ASSET_TEX3D_1268 .incbin "./build/us_1.0/textures/3d/unknown_2_1268.bin" -glabel ASSET_2_1269 +glabel ASSET_TEX3D_1269 .incbin "./build/us_1.0/textures/3d/unknown_2_1269.bin" -glabel ASSET_2_1270 +glabel ASSET_TEX3D_1270 .incbin "./build/us_1.0/textures/3d/unknown_2_1270.bin" -glabel ASSET_2_1271 +glabel ASSET_TEX3D_1271 .incbin "./build/us_1.0/textures/3d/unknown_2_1271.bin" -glabel ASSET_2_1272 +glabel ASSET_TEX3D_1272 .incbin "./build/us_1.0/textures/3d/unknown_2_1272.bin" -glabel ASSET_2_1273 +glabel ASSET_TEX3D_1273 .incbin "./build/us_1.0/textures/3d/unknown_2_1273.bin" -glabel ASSET_2_1274 +glabel ASSET_TEX3D_1274 .incbin "./build/us_1.0/textures/3d/unknown_2_1274.bin" -glabel ASSET_2_1275 +glabel ASSET_TEX3D_1275 .incbin "./build/us_1.0/textures/3d/unknown_2_1275.bin" -glabel ASSET_2_1276 +glabel ASSET_TEX3D_1276 .incbin "./build/us_1.0/textures/3d/unknown_2_1276.bin" -glabel ASSET_2_1277 +glabel ASSET_TEX3D_1277 .incbin "./build/us_1.0/textures/3d/unknown_2_1277.bin" -glabel ASSET_2_1278 +glabel ASSET_TEX3D_1278 .incbin "./build/us_1.0/textures/3d/unknown_2_1278.bin" -glabel ASSET_2_1279 +glabel ASSET_TEX3D_1279 .incbin "./build/us_1.0/textures/3d/unknown_2_1279.bin" -glabel ASSET_2_1280 +glabel ASSET_TEX3D_1280 .incbin "./build/us_1.0/textures/3d/unknown_2_1280.bin" -glabel ASSET_2_1281 +glabel ASSET_TEX3D_1281 .incbin "./build/us_1.0/textures/3d/unknown_2_1281.bin" -glabel ASSET_2_1282 +glabel ASSET_TEX3D_1282 .incbin "./build/us_1.0/textures/3d/unknown_2_1282.bin" -glabel ASSET_2_1283 +glabel ASSET_TEX3D_1283 .incbin "./build/us_1.0/textures/3d/unknown_2_1283.bin" -glabel ASSET_2_1284 +glabel ASSET_TEX3D_1284 .incbin "./build/us_1.0/textures/3d/unknown_2_1284.bin" -glabel ASSET_2_1285 +glabel ASSET_TEX3D_1285 .incbin "./build/us_1.0/textures/3d/unknown_2_1285.bin" -glabel ASSET_2_1286 +glabel ASSET_TEX3D_1286 .incbin "./build/us_1.0/textures/3d/unknown_2_1286.bin" -glabel ASSET_2_1287 +glabel ASSET_TEX3D_1287 .incbin "./build/us_1.0/textures/3d/unknown_2_1287.bin" -glabel ASSET_2_1288 +glabel ASSET_TEX3D_1288 .incbin "./build/us_1.0/textures/3d/unknown_2_1288.bin" -glabel ASSET_2_1289 +glabel ASSET_TEX3D_1289 .incbin "./build/us_1.0/textures/3d/unknown_2_1289.bin" -glabel ASSET_2_1290 +glabel ASSET_TEX3D_1290 .incbin "./build/us_1.0/textures/3d/unknown_2_1290.bin" -glabel ASSET_2_1291 +glabel ASSET_TEX3D_1291 .incbin "./build/us_1.0/textures/3d/unknown_2_1291.bin" -glabel ASSET_2_1292 +glabel ASSET_TEX3D_1292 .incbin "./build/us_1.0/textures/3d/unknown_2_1292.bin" -glabel ASSET_2_1293 +glabel ASSET_TEX3D_1293 .incbin "./build/us_1.0/textures/3d/unknown_2_1293.bin" -glabel ASSET_2_1294 +glabel ASSET_TEX3D_1294 .incbin "./build/us_1.0/textures/3d/unknown_2_1294.bin" -glabel ASSET_2_1295 +glabel ASSET_TEX3D_1295 .incbin "./build/us_1.0/textures/3d/unknown_2_1295.bin" -glabel ASSET_2_1296 +glabel ASSET_TEX3D_1296 .incbin "./build/us_1.0/textures/3d/unknown_2_1296.bin" -glabel ASSET_2_1297 +glabel ASSET_TEX3D_1297 .incbin "./build/us_1.0/textures/3d/unknown_2_1297.bin" -glabel ASSET_2_1298 +glabel ASSET_TEX3D_1298 .incbin "./build/us_1.0/textures/3d/unknown_2_1298.bin" -glabel ASSET_2_1299 +glabel ASSET_TEX3D_1299 .incbin "./build/us_1.0/textures/3d/unknown_2_1299.bin" -glabel ASSET_2_1300 +glabel ASSET_TEX3D_1300 .incbin "./build/us_1.0/textures/3d/unknown_2_1300.bin" -glabel ASSET_2_1301 +glabel ASSET_TEX3D_1301 .incbin "./build/us_1.0/textures/3d/unknown_2_1301.bin" -glabel ASSET_2_1302 +glabel ASSET_TEX3D_1302 .incbin "./build/us_1.0/textures/3d/unknown_2_1302.bin" -glabel ASSET_2_1303 +glabel ASSET_TEX3D_1303 .incbin "./build/us_1.0/textures/3d/unknown_2_1303.bin" -glabel ASSET_2_1304 +glabel ASSET_TEX3D_1304 .incbin "./build/us_1.0/textures/3d/unknown_2_1304.bin" -glabel ASSET_2_1305 +glabel ASSET_TEX3D_1305 .incbin "./build/us_1.0/textures/3d/unknown_2_1305.bin" -glabel ASSET_2_1306 +glabel ASSET_TEX3D_1306 .incbin "./build/us_1.0/textures/3d/unknown_2_1306.bin" -glabel ASSET_2_1307 +glabel ASSET_TEX3D_1307 .incbin "./build/us_1.0/textures/3d/unknown_2_1307.bin" -glabel ASSET_2_1308 +glabel ASSET_TEX3D_1308 .incbin "./build/us_1.0/textures/3d/unknown_2_1308.bin" -glabel ASSET_2_1309 +glabel ASSET_TEX3D_1309 .incbin "./build/us_1.0/textures/3d/unknown_2_1309.bin" -glabel ASSET_2_1310 +glabel ASSET_TEX3D_1310 .incbin "./build/us_1.0/textures/3d/unknown_2_1310.bin" -glabel ASSET_2_1311 +glabel ASSET_TEX3D_1311 .incbin "./build/us_1.0/textures/3d/unknown_2_1311.bin" -glabel ASSET_2_1312 +glabel ASSET_TEX3D_1312 .incbin "./build/us_1.0/textures/3d/unknown_2_1312.bin" -glabel ASSET_2_1313 +glabel ASSET_TEX3D_1313 .incbin "./build/us_1.0/textures/3d/unknown_2_1313.bin" -glabel ASSET_2_1314 +glabel ASSET_TEX3D_1314 .incbin "./build/us_1.0/textures/3d/unknown_2_1314.bin" -glabel ASSET_2_1315 +glabel ASSET_TEX3D_1315 .incbin "./build/us_1.0/textures/3d/unknown_2_1315.bin" -glabel ASSET_2_1316 +glabel ASSET_TEX3D_1316 .incbin "./build/us_1.0/textures/3d/unknown_2_1316.bin" -glabel ASSET_2_1317 +glabel ASSET_TEX3D_1317 .incbin "./build/us_1.0/textures/3d/unknown_2_1317.bin" -glabel ASSET_2_1318 +glabel ASSET_TEX3D_1318 .incbin "./build/us_1.0/textures/3d/unknown_2_1318.bin" -glabel ASSET_2_1319 +glabel ASSET_TEX3D_1319 .incbin "./build/us_1.0/textures/3d/unknown_2_1319.bin" -glabel ASSET_2_1320 +glabel ASSET_TEX3D_1320 .incbin "./build/us_1.0/textures/3d/unknown_2_1320.bin" -glabel ASSET_2_1321 +glabel ASSET_TEX3D_1321 .incbin "./build/us_1.0/textures/3d/unknown_2_1321.bin" -glabel ASSET_2_1322 +glabel ASSET_TEX3D_1322 .incbin "./build/us_1.0/textures/3d/unknown_2_1322.bin" -glabel ASSET_2_1323 +glabel ASSET_TEX3D_1323 .incbin "./build/us_1.0/textures/3d/unknown_2_1323.bin" -glabel ASSET_2_1324 +glabel ASSET_TEX3D_1324 .incbin "./build/us_1.0/textures/3d/unknown_2_1324.bin" -glabel ASSET_2_1325 +glabel ASSET_TEX3D_1325 .incbin "./build/us_1.0/textures/3d/unknown_2_1325.bin" -glabel ASSET_2_1326 +glabel ASSET_TEX3D_1326 .incbin "./build/us_1.0/textures/3d/unknown_2_1326.bin" -glabel ASSET_2_1327 +glabel ASSET_TEX3D_1327 .incbin "./build/us_1.0/textures/3d/unknown_2_1327.bin" -glabel ASSET_2_1328 +glabel ASSET_TEX3D_1328 .incbin "./build/us_1.0/textures/3d/unknown_2_1328.bin" -glabel ASSET_2_1329 +glabel ASSET_TEX3D_1329 .incbin "./build/us_1.0/textures/3d/unknown_2_1329.bin" -glabel ASSET_2_1330 +glabel ASSET_TEX3D_1330 .incbin "./build/us_1.0/textures/3d/unknown_2_1330.bin" -glabel ASSET_2_1331 +glabel ASSET_TEX3D_1331 .incbin "./build/us_1.0/textures/3d/unknown_2_1331.bin" -glabel ASSET_2_1332 +glabel ASSET_TEX3D_1332 .incbin "./build/us_1.0/textures/3d/unknown_2_1332.bin" -glabel ASSET_2_1333 +glabel ASSET_TEX3D_1333 .incbin "./build/us_1.0/textures/3d/unknown_2_1333.bin" -glabel ASSET_2_1334 +glabel ASSET_TEX3D_1334 .incbin "./build/us_1.0/textures/3d/unknown_2_1334.bin" -glabel ASSET_2_1335 +glabel ASSET_TEX3D_1335 .incbin "./build/us_1.0/textures/3d/unknown_2_1335.bin" -glabel ASSET_2_1336 +glabel ASSET_TEX3D_1336 .incbin "./build/us_1.0/textures/3d/unknown_2_1336.bin" -glabel ASSET_2_1337 +glabel ASSET_TEX3D_1337 .incbin "./build/us_1.0/textures/3d/unknown_2_1337.bin" -glabel ASSET_2_1338 +glabel ASSET_TEX3D_1338 .incbin "./build/us_1.0/textures/3d/unknown_2_1338.bin" -glabel ASSET_2_1339 +glabel ASSET_TEX3D_1339 .incbin "./build/us_1.0/textures/3d/unknown_2_1339.bin" -glabel ASSET_2_1340 +glabel ASSET_TEX3D_1340 .incbin "./build/us_1.0/textures/3d/unknown_2_1340.bin" -glabel ASSET_2_1341 +glabel ASSET_TEX3D_1341 .incbin "./build/us_1.0/textures/3d/unknown_2_1341.bin" -glabel ASSET_2_1342 +glabel ASSET_TEX3D_1342 .incbin "./build/us_1.0/textures/3d/unknown_2_1342.bin" -glabel ASSET_2_1343 +glabel ASSET_TEX3D_1343 .incbin "./build/us_1.0/textures/3d/unknown_2_1343.bin" -glabel ASSET_2_1344 +glabel ASSET_TEX3D_1344 .incbin "./build/us_1.0/textures/3d/unknown_2_1344.bin" -glabel ASSET_2_1345 +glabel ASSET_TEX3D_1345 .incbin "./build/us_1.0/textures/3d/unknown_2_1345.bin" -glabel ASSET_2_1346 +glabel ASSET_TEX3D_1346 .incbin "./build/us_1.0/textures/3d/unknown_2_1346.bin" -glabel ASSET_2_1347 +glabel ASSET_TEX3D_1347 .incbin "./build/us_1.0/textures/3d/unknown_2_1347.bin" -glabel ASSET_2_1348 +glabel ASSET_TEX3D_1348 .incbin "./build/us_1.0/textures/3d/unknown_2_1348.bin" -glabel ASSET_2_1349 +glabel ASSET_TEX3D_1349 .incbin "./build/us_1.0/textures/3d/unknown_2_1349.bin" -glabel ASSET_2_1350 +glabel ASSET_TEX3D_1350 .incbin "./build/us_1.0/textures/3d/unknown_2_1350.bin" -glabel ASSET_2_1351 +glabel ASSET_TEX3D_1351 .incbin "./build/us_1.0/textures/3d/unknown_2_1351.bin" -glabel ASSET_2_1352 +glabel ASSET_TEX3D_1352 .incbin "./build/us_1.0/textures/3d/unknown_2_1352.bin" -glabel ASSET_2_1353 +glabel ASSET_TEX3D_1353 .incbin "./build/us_1.0/textures/3d/unknown_2_1353.bin" -glabel ASSET_2_1354 +glabel ASSET_TEX3D_1354 .incbin "./build/us_1.0/textures/3d/unknown_2_1354.bin" -glabel ASSET_2_1355 +glabel ASSET_TEX3D_1355 .incbin "./build/us_1.0/textures/3d/unknown_2_1355.bin" -glabel ASSET_2_1356 +glabel ASSET_TEX3D_1356 .incbin "./build/us_1.0/textures/3d/unknown_2_1356.bin" -glabel ASSET_2_1357 +glabel ASSET_TEX3D_1357 .incbin "./build/us_1.0/textures/3d/unknown_2_1357.bin" -glabel ASSET_2_1358 +glabel ASSET_TEX3D_1358 .incbin "./build/us_1.0/textures/3d/unknown_2_1358.bin" -glabel ASSET_2_1359 +glabel ASSET_TEX3D_1359 .incbin "./build/us_1.0/textures/3d/unknown_2_1359.bin" -glabel ASSET_2_1360 +glabel ASSET_TEX3D_1360 .incbin "./build/us_1.0/textures/3d/unknown_2_1360.bin" -glabel ASSET_2_1361 +glabel ASSET_TEX3D_1361 .incbin "./build/us_1.0/textures/3d/unknown_2_1361.bin" -glabel ASSET_2_1362 +glabel ASSET_TEX3D_1362 .incbin "./build/us_1.0/textures/3d/unknown_2_1362.bin" -glabel ASSET_2_1363 +glabel ASSET_TEX3D_1363 .incbin "./build/us_1.0/textures/3d/unknown_2_1363.bin" -glabel ASSET_2_1364 +glabel ASSET_TEX3D_1364 .incbin "./build/us_1.0/textures/3d/unknown_2_1364.bin" -glabel ASSET_2_1365 +glabel ASSET_TEX3D_1365 .incbin "./build/us_1.0/textures/3d/unknown_2_1365.bin" -glabel ASSET_2_1366 +glabel ASSET_TEX3D_1366 .incbin "./build/us_1.0/textures/3d/unknown_2_1366.bin" -glabel ASSET_2_1367 +glabel ASSET_TEX3D_1367 .incbin "./build/us_1.0/textures/3d/unknown_2_1367.bin" -glabel ASSET_2_1368 +glabel ASSET_TEX3D_1368 .incbin "./build/us_1.0/textures/3d/unknown_2_1368.bin" -glabel ASSET_2_1369 +glabel ASSET_TEX3D_1369 .incbin "./build/us_1.0/textures/3d/unknown_2_1369.bin" -glabel ASSET_2_1370 +glabel ASSET_TEX3D_1370 .incbin "./build/us_1.0/textures/3d/unknown_2_1370.bin" -glabel ASSET_2_1371 +glabel ASSET_TEX3D_1371 .incbin "./build/us_1.0/textures/3d/unknown_2_1371.bin" -glabel ASSET_2_1372 +glabel ASSET_TEX3D_1372 .incbin "./build/us_1.0/textures/3d/unknown_2_1372.bin" -glabel ASSET_2_1373 +glabel ASSET_TEX3D_1373 .incbin "./build/us_1.0/textures/3d/unknown_2_1373.bin" -glabel ASSET_2_1374 +glabel ASSET_TEX3D_1374 .incbin "./build/us_1.0/textures/3d/unknown_2_1374.bin" -glabel ASSET_2_1375 +glabel ASSET_TEX3D_1375 .incbin "./build/us_1.0/textures/3d/unknown_2_1375.bin" -glabel ASSET_2_1376 +glabel ASSET_TEX3D_1376 .incbin "./build/us_1.0/textures/3d/unknown_2_1376.bin" -glabel ASSET_2_1377 +glabel ASSET_TEX3D_1377 .incbin "./build/us_1.0/textures/3d/unknown_2_1377.bin" -glabel ASSET_2_1378 +glabel ASSET_TEX3D_1378 .incbin "./build/us_1.0/textures/3d/unknown_2_1378.bin" -glabel ASSET_2_1379 +glabel ASSET_TEX3D_1379 .incbin "./build/us_1.0/textures/3d/unknown_2_1379.bin" -glabel ASSET_2_1380 +glabel ASSET_TEX3D_1380 .incbin "./build/us_1.0/textures/3d/unknown_2_1380.bin" -glabel ASSET_2_1381 +glabel ASSET_TEX3D_1381 .incbin "./build/us_1.0/textures/3d/unknown_2_1381.bin" -glabel ASSET_2_1382 +glabel ASSET_TEX3D_1382 .incbin "./build/us_1.0/textures/3d/unknown_2_1382.bin" -glabel ASSET_2_1383 +glabel ASSET_TEX3D_1383 .incbin "./build/us_1.0/textures/3d/unknown_2_1383.bin" -glabel ASSET_2_1384 +glabel ASSET_TEX3D_1384 .incbin "./build/us_1.0/textures/3d/unknown_2_1384.bin" -glabel ASSET_2_1385 +glabel ASSET_TEX3D_1385 .incbin "./build/us_1.0/textures/3d/unknown_2_1385.bin" -glabel ASSET_2_1386 +glabel ASSET_TEX3D_1386 .incbin "./build/us_1.0/textures/3d/unknown_2_1386.bin" -glabel ASSET_2_1387 +glabel ASSET_TEX3D_1387 .incbin "./build/us_1.0/textures/3d/unknown_2_1387.bin" -glabel ASSET_2_1388 +glabel ASSET_TEX3D_1388 .incbin "./build/us_1.0/textures/3d/unknown_2_1388.bin" -glabel ASSET_2_1389 +glabel ASSET_TEX3D_1389 .incbin "./build/us_1.0/textures/3d/unknown_2_1389.bin" -glabel ASSET_2_1390 +glabel ASSET_TEX3D_1390 .incbin "./build/us_1.0/textures/3d/unknown_2_1390.bin" -glabel ASSET_2_1391 +glabel ASSET_TEX3D_1391 .incbin "./build/us_1.0/textures/3d/unknown_2_1391.bin" -glabel ASSET_2_1392 +glabel ASSET_TEX3D_1392 .incbin "./build/us_1.0/textures/3d/unknown_2_1392.bin" -glabel ASSET_2_1393 +glabel ASSET_TEX3D_1393 .incbin "./build/us_1.0/textures/3d/unknown_2_1393.bin" -glabel ASSET_2_1394 +glabel ASSET_TEX3D_1394 .incbin "./build/us_1.0/textures/3d/unknown_2_1394.bin" -glabel ASSET_2_1395 +glabel ASSET_TEX3D_1395 .incbin "./build/us_1.0/textures/3d/unknown_2_1395.bin" -glabel ASSET_2_1396 +glabel ASSET_TEX3D_1396 .incbin "./build/us_1.0/textures/3d/unknown_2_1396.bin" -glabel ASSET_2_1397 +glabel ASSET_TEX3D_1397 .incbin "./build/us_1.0/textures/3d/unknown_2_1397.bin" -glabel ASSET_2_1398 +glabel ASSET_TEX3D_1398 .incbin "./build/us_1.0/textures/3d/unknown_2_1398.bin" -glabel ASSET_2_1399 +glabel ASSET_TEX3D_1399 .incbin "./build/us_1.0/textures/3d/unknown_2_1399.bin" -glabel ASSET_2_1400 +glabel ASSET_TEX3D_1400 .incbin "./build/us_1.0/textures/3d/unknown_2_1400.bin" -glabel ASSET_SECTION_2_END +glabel ASSET_TEXTURES_3D_END + +/********** ASSET_TEXTURES_3D_TABLE **********/ .balign 16 -glabel ASSET_SECTION_3 -.word ASSET_2_0 - ASSET_SECTION_2 -.word ASSET_2_1 - ASSET_SECTION_2 -.word ASSET_2_2 - ASSET_SECTION_2 -.word ASSET_2_3 - ASSET_SECTION_2 -.word ASSET_2_4 - ASSET_SECTION_2 -.word ASSET_2_5 - ASSET_SECTION_2 -.word ASSET_2_6 - ASSET_SECTION_2 -.word ASSET_2_7 - ASSET_SECTION_2 -.word ASSET_2_8 - ASSET_SECTION_2 -.word ASSET_2_9 - ASSET_SECTION_2 -.word ASSET_2_10 - ASSET_SECTION_2 -.word ASSET_2_11 - ASSET_SECTION_2 -.word ASSET_2_12 - ASSET_SECTION_2 -.word ASSET_2_13 - ASSET_SECTION_2 -.word ASSET_2_14 - ASSET_SECTION_2 -.word ASSET_2_15 - ASSET_SECTION_2 -.word ASSET_2_16 - ASSET_SECTION_2 -.word ASSET_2_17 - ASSET_SECTION_2 -.word ASSET_2_18 - ASSET_SECTION_2 -.word ASSET_2_19 - ASSET_SECTION_2 -.word ASSET_2_20 - ASSET_SECTION_2 -.word ASSET_2_21 - ASSET_SECTION_2 -.word ASSET_2_22 - ASSET_SECTION_2 -.word ASSET_2_23 - ASSET_SECTION_2 -.word ASSET_2_24 - ASSET_SECTION_2 -.word ASSET_2_25 - ASSET_SECTION_2 -.word ASSET_2_26 - ASSET_SECTION_2 -.word ASSET_2_27 - ASSET_SECTION_2 -.word ASSET_2_28 - ASSET_SECTION_2 -.word ASSET_2_29 - ASSET_SECTION_2 -.word ASSET_2_30 - ASSET_SECTION_2 -.word ASSET_2_31 - ASSET_SECTION_2 -.word ASSET_2_32 - ASSET_SECTION_2 -.word ASSET_2_33 - ASSET_SECTION_2 -.word ASSET_2_34 - ASSET_SECTION_2 -.word ASSET_2_35 - ASSET_SECTION_2 -.word ASSET_2_36 - ASSET_SECTION_2 -.word ASSET_2_37 - ASSET_SECTION_2 -.word ASSET_2_38 - ASSET_SECTION_2 -.word ASSET_2_39 - ASSET_SECTION_2 -.word ASSET_2_40 - ASSET_SECTION_2 -.word ASSET_2_41 - ASSET_SECTION_2 -.word ASSET_2_42 - ASSET_SECTION_2 -.word ASSET_2_43 - ASSET_SECTION_2 -.word ASSET_2_44 - ASSET_SECTION_2 -.word ASSET_2_45 - ASSET_SECTION_2 -.word ASSET_2_46 - ASSET_SECTION_2 -.word ASSET_2_47 - ASSET_SECTION_2 -.word ASSET_2_48 - ASSET_SECTION_2 -.word ASSET_2_49 - ASSET_SECTION_2 -.word ASSET_2_50 - ASSET_SECTION_2 -.word ASSET_2_51 - ASSET_SECTION_2 -.word ASSET_2_52 - ASSET_SECTION_2 -.word ASSET_2_53 - ASSET_SECTION_2 -.word ASSET_2_54 - ASSET_SECTION_2 -.word ASSET_2_55 - ASSET_SECTION_2 -.word ASSET_2_56 - ASSET_SECTION_2 -.word ASSET_2_57 - ASSET_SECTION_2 -.word ASSET_2_58 - ASSET_SECTION_2 -.word ASSET_2_59 - ASSET_SECTION_2 -.word ASSET_2_60 - ASSET_SECTION_2 -.word ASSET_2_61 - ASSET_SECTION_2 -.word ASSET_2_62 - ASSET_SECTION_2 -.word ASSET_2_63 - ASSET_SECTION_2 -.word ASSET_2_64 - ASSET_SECTION_2 -.word ASSET_2_65 - ASSET_SECTION_2 -.word ASSET_2_66 - ASSET_SECTION_2 -.word ASSET_2_67 - ASSET_SECTION_2 -.word ASSET_2_68 - ASSET_SECTION_2 -.word ASSET_2_69 - ASSET_SECTION_2 -.word ASSET_2_70 - ASSET_SECTION_2 -.word ASSET_2_71 - ASSET_SECTION_2 -.word ASSET_2_72 - ASSET_SECTION_2 -.word ASSET_2_73 - ASSET_SECTION_2 -.word ASSET_2_74 - ASSET_SECTION_2 -.word ASSET_2_75 - ASSET_SECTION_2 -.word ASSET_2_76 - ASSET_SECTION_2 -.word ASSET_2_77 - ASSET_SECTION_2 -.word ASSET_2_78 - ASSET_SECTION_2 -.word ASSET_2_79 - ASSET_SECTION_2 -.word ASSET_2_80 - ASSET_SECTION_2 -.word ASSET_2_81 - ASSET_SECTION_2 -.word ASSET_2_82 - ASSET_SECTION_2 -.word ASSET_2_83 - ASSET_SECTION_2 -.word ASSET_2_84 - ASSET_SECTION_2 -.word ASSET_2_85 - ASSET_SECTION_2 -.word ASSET_2_86 - ASSET_SECTION_2 -.word ASSET_2_87 - ASSET_SECTION_2 -.word ASSET_2_88 - ASSET_SECTION_2 -.word ASSET_2_89 - ASSET_SECTION_2 -.word ASSET_2_90 - ASSET_SECTION_2 -.word ASSET_2_91 - ASSET_SECTION_2 -.word ASSET_2_92 - ASSET_SECTION_2 -.word ASSET_2_93 - ASSET_SECTION_2 -.word ASSET_2_94 - ASSET_SECTION_2 -.word ASSET_2_95 - ASSET_SECTION_2 -.word ASSET_2_96 - ASSET_SECTION_2 -.word ASSET_2_97 - ASSET_SECTION_2 -.word ASSET_2_98 - ASSET_SECTION_2 -.word ASSET_2_99 - ASSET_SECTION_2 -.word ASSET_2_100 - ASSET_SECTION_2 -.word ASSET_2_101 - ASSET_SECTION_2 -.word ASSET_2_102 - ASSET_SECTION_2 -.word ASSET_2_103 - ASSET_SECTION_2 -.word ASSET_2_104 - ASSET_SECTION_2 -.word ASSET_2_105 - ASSET_SECTION_2 -.word ASSET_2_106 - ASSET_SECTION_2 -.word ASSET_2_107 - ASSET_SECTION_2 -.word ASSET_2_108 - ASSET_SECTION_2 -.word ASSET_2_109 - ASSET_SECTION_2 -.word ASSET_2_110 - ASSET_SECTION_2 -.word ASSET_2_111 - ASSET_SECTION_2 -.word ASSET_2_112 - ASSET_SECTION_2 -.word ASSET_2_113 - ASSET_SECTION_2 -.word ASSET_2_114 - ASSET_SECTION_2 -.word ASSET_2_115 - ASSET_SECTION_2 -.word ASSET_2_116 - ASSET_SECTION_2 -.word ASSET_2_117 - ASSET_SECTION_2 -.word ASSET_2_118 - ASSET_SECTION_2 -.word ASSET_2_119 - ASSET_SECTION_2 -.word ASSET_2_120 - ASSET_SECTION_2 -.word ASSET_2_121 - ASSET_SECTION_2 -.word ASSET_2_122 - ASSET_SECTION_2 -.word ASSET_2_123 - ASSET_SECTION_2 -.word ASSET_2_124 - ASSET_SECTION_2 -.word ASSET_2_125 - ASSET_SECTION_2 -.word ASSET_2_126 - ASSET_SECTION_2 -.word ASSET_2_127 - ASSET_SECTION_2 -.word ASSET_2_128 - ASSET_SECTION_2 -.word ASSET_2_129 - ASSET_SECTION_2 -.word ASSET_2_130 - ASSET_SECTION_2 -.word ASSET_2_131 - ASSET_SECTION_2 -.word ASSET_2_132 - ASSET_SECTION_2 -.word ASSET_2_133 - ASSET_SECTION_2 -.word ASSET_2_134 - ASSET_SECTION_2 -.word ASSET_2_135 - ASSET_SECTION_2 -.word ASSET_2_136 - ASSET_SECTION_2 -.word ASSET_2_137 - ASSET_SECTION_2 -.word ASSET_2_138 - ASSET_SECTION_2 -.word ASSET_2_139 - ASSET_SECTION_2 -.word ASSET_2_140 - ASSET_SECTION_2 -.word ASSET_2_141 - ASSET_SECTION_2 -.word ASSET_2_142 - ASSET_SECTION_2 -.word ASSET_2_143 - ASSET_SECTION_2 -.word ASSET_2_144 - ASSET_SECTION_2 -.word ASSET_2_145 - ASSET_SECTION_2 -.word ASSET_2_146 - ASSET_SECTION_2 -.word ASSET_2_147 - ASSET_SECTION_2 -.word ASSET_2_148 - ASSET_SECTION_2 -.word ASSET_2_149 - ASSET_SECTION_2 -.word ASSET_2_150 - ASSET_SECTION_2 -.word ASSET_2_151 - ASSET_SECTION_2 -.word ASSET_2_152 - ASSET_SECTION_2 -.word ASSET_2_153 - ASSET_SECTION_2 -.word ASSET_2_154 - ASSET_SECTION_2 -.word ASSET_2_155 - ASSET_SECTION_2 -.word ASSET_2_156 - ASSET_SECTION_2 -.word ASSET_2_157 - ASSET_SECTION_2 -.word ASSET_2_158 - ASSET_SECTION_2 -.word ASSET_2_159 - ASSET_SECTION_2 -.word ASSET_2_160 - ASSET_SECTION_2 -.word ASSET_2_161 - ASSET_SECTION_2 -.word ASSET_2_162 - ASSET_SECTION_2 -.word ASSET_2_163 - ASSET_SECTION_2 -.word ASSET_2_164 - ASSET_SECTION_2 -.word ASSET_2_165 - ASSET_SECTION_2 -.word ASSET_2_166 - ASSET_SECTION_2 -.word ASSET_2_167 - ASSET_SECTION_2 -.word ASSET_2_168 - ASSET_SECTION_2 -.word ASSET_2_169 - ASSET_SECTION_2 -.word ASSET_2_170 - ASSET_SECTION_2 -.word ASSET_2_171 - ASSET_SECTION_2 -.word ASSET_2_172 - ASSET_SECTION_2 -.word ASSET_2_173 - ASSET_SECTION_2 -.word ASSET_2_174 - ASSET_SECTION_2 -.word ASSET_2_175 - ASSET_SECTION_2 -.word ASSET_2_176 - ASSET_SECTION_2 -.word ASSET_2_177 - ASSET_SECTION_2 -.word ASSET_2_178 - ASSET_SECTION_2 -.word ASSET_2_179 - ASSET_SECTION_2 -.word ASSET_2_180 - ASSET_SECTION_2 -.word ASSET_2_181 - ASSET_SECTION_2 -.word ASSET_2_182 - ASSET_SECTION_2 -.word ASSET_2_183 - ASSET_SECTION_2 -.word ASSET_2_184 - ASSET_SECTION_2 -.word ASSET_2_185 - ASSET_SECTION_2 -.word ASSET_2_186 - ASSET_SECTION_2 -.word ASSET_2_187 - ASSET_SECTION_2 -.word ASSET_2_188 - ASSET_SECTION_2 -.word ASSET_2_189 - ASSET_SECTION_2 -.word ASSET_2_190 - ASSET_SECTION_2 -.word ASSET_2_191 - ASSET_SECTION_2 -.word ASSET_2_192 - ASSET_SECTION_2 -.word ASSET_2_193 - ASSET_SECTION_2 -.word ASSET_2_194 - ASSET_SECTION_2 -.word ASSET_2_195 - ASSET_SECTION_2 -.word ASSET_2_196 - ASSET_SECTION_2 -.word ASSET_2_197 - ASSET_SECTION_2 -.word ASSET_2_198 - ASSET_SECTION_2 -.word ASSET_2_199 - ASSET_SECTION_2 -.word ASSET_2_200 - ASSET_SECTION_2 -.word ASSET_2_201 - ASSET_SECTION_2 -.word ASSET_2_202 - ASSET_SECTION_2 -.word ASSET_2_203 - ASSET_SECTION_2 -.word ASSET_2_204 - ASSET_SECTION_2 -.word ASSET_2_205 - ASSET_SECTION_2 -.word ASSET_2_206 - ASSET_SECTION_2 -.word ASSET_2_207 - ASSET_SECTION_2 -.word ASSET_2_208 - ASSET_SECTION_2 -.word ASSET_2_209 - ASSET_SECTION_2 -.word ASSET_2_210 - ASSET_SECTION_2 -.word ASSET_2_211 - ASSET_SECTION_2 -.word ASSET_2_212 - ASSET_SECTION_2 -.word ASSET_2_213 - ASSET_SECTION_2 -.word ASSET_2_214 - ASSET_SECTION_2 -.word ASSET_2_215 - ASSET_SECTION_2 -.word ASSET_2_216 - ASSET_SECTION_2 -.word ASSET_2_217 - ASSET_SECTION_2 -.word ASSET_2_218 - ASSET_SECTION_2 -.word ASSET_2_219 - ASSET_SECTION_2 -.word ASSET_2_220 - ASSET_SECTION_2 -.word ASSET_2_221 - ASSET_SECTION_2 -.word ASSET_2_222 - ASSET_SECTION_2 -.word ASSET_2_223 - ASSET_SECTION_2 -.word ASSET_2_224 - ASSET_SECTION_2 -.word ASSET_2_225 - ASSET_SECTION_2 -.word ASSET_2_226 - ASSET_SECTION_2 -.word ASSET_2_227 - ASSET_SECTION_2 -.word ASSET_2_228 - ASSET_SECTION_2 -.word ASSET_2_229 - ASSET_SECTION_2 -.word ASSET_2_230 - ASSET_SECTION_2 -.word ASSET_2_231 - ASSET_SECTION_2 -.word ASSET_2_232 - ASSET_SECTION_2 -.word ASSET_2_233 - ASSET_SECTION_2 -.word ASSET_2_234 - ASSET_SECTION_2 -.word ASSET_2_235 - ASSET_SECTION_2 -.word ASSET_2_236 - ASSET_SECTION_2 -.word ASSET_2_237 - ASSET_SECTION_2 -.word ASSET_2_238 - ASSET_SECTION_2 -.word ASSET_2_239 - ASSET_SECTION_2 -.word ASSET_2_240 - ASSET_SECTION_2 -.word ASSET_2_241 - ASSET_SECTION_2 -.word ASSET_2_242 - ASSET_SECTION_2 -.word ASSET_2_243 - ASSET_SECTION_2 -.word ASSET_2_244 - ASSET_SECTION_2 -.word ASSET_2_245 - ASSET_SECTION_2 -.word ASSET_2_246 - ASSET_SECTION_2 -.word ASSET_2_247 - ASSET_SECTION_2 -.word ASSET_2_248 - ASSET_SECTION_2 -.word ASSET_2_249 - ASSET_SECTION_2 -.word ASSET_2_250 - ASSET_SECTION_2 -.word ASSET_2_251 - ASSET_SECTION_2 -.word ASSET_2_252 - ASSET_SECTION_2 -.word ASSET_2_253 - ASSET_SECTION_2 -.word ASSET_2_254 - ASSET_SECTION_2 -.word ASSET_2_255 - ASSET_SECTION_2 -.word ASSET_2_256 - ASSET_SECTION_2 -.word ASSET_2_257 - ASSET_SECTION_2 -.word ASSET_2_258 - ASSET_SECTION_2 -.word ASSET_2_259 - ASSET_SECTION_2 -.word ASSET_2_260 - ASSET_SECTION_2 -.word ASSET_2_261 - ASSET_SECTION_2 -.word ASSET_2_262 - ASSET_SECTION_2 -.word ASSET_2_263 - ASSET_SECTION_2 -.word ASSET_2_264 - ASSET_SECTION_2 -.word ASSET_2_265 - ASSET_SECTION_2 -.word ASSET_2_266 - ASSET_SECTION_2 -.word ASSET_2_267 - ASSET_SECTION_2 -.word ASSET_2_268 - ASSET_SECTION_2 -.word ASSET_2_269 - ASSET_SECTION_2 -.word ASSET_2_270 - ASSET_SECTION_2 -.word ASSET_2_271 - ASSET_SECTION_2 -.word ASSET_2_272 - ASSET_SECTION_2 -.word ASSET_2_273 - ASSET_SECTION_2 -.word ASSET_2_274 - ASSET_SECTION_2 -.word ASSET_2_275 - ASSET_SECTION_2 -.word ASSET_2_276 - ASSET_SECTION_2 -.word ASSET_2_277 - ASSET_SECTION_2 -.word ASSET_2_278 - ASSET_SECTION_2 -.word ASSET_2_279 - ASSET_SECTION_2 -.word ASSET_2_280 - ASSET_SECTION_2 -.word ASSET_2_281 - ASSET_SECTION_2 -.word ASSET_2_282 - ASSET_SECTION_2 -.word ASSET_2_283 - ASSET_SECTION_2 -.word ASSET_2_284 - ASSET_SECTION_2 -.word ASSET_2_285 - ASSET_SECTION_2 -.word ASSET_2_286 - ASSET_SECTION_2 -.word ASSET_2_287 - ASSET_SECTION_2 -.word ASSET_2_288 - ASSET_SECTION_2 -.word ASSET_2_289 - ASSET_SECTION_2 -.word ASSET_2_290 - ASSET_SECTION_2 -.word ASSET_2_291 - ASSET_SECTION_2 -.word ASSET_2_292 - ASSET_SECTION_2 -.word ASSET_2_293 - ASSET_SECTION_2 -.word ASSET_2_294 - ASSET_SECTION_2 -.word ASSET_2_295 - ASSET_SECTION_2 -.word ASSET_2_296 - ASSET_SECTION_2 -.word ASSET_2_297 - ASSET_SECTION_2 -.word ASSET_2_298 - ASSET_SECTION_2 -.word ASSET_2_299 - ASSET_SECTION_2 -.word ASSET_2_300 - ASSET_SECTION_2 -.word ASSET_2_301 - ASSET_SECTION_2 -.word ASSET_2_302 - ASSET_SECTION_2 -.word ASSET_2_303 - ASSET_SECTION_2 -.word ASSET_2_304 - ASSET_SECTION_2 -.word ASSET_2_305 - ASSET_SECTION_2 -.word ASSET_2_306 - ASSET_SECTION_2 -.word ASSET_2_307 - ASSET_SECTION_2 -.word ASSET_2_308 - ASSET_SECTION_2 -.word ASSET_2_309 - ASSET_SECTION_2 -.word ASSET_2_310 - ASSET_SECTION_2 -.word ASSET_2_311 - ASSET_SECTION_2 -.word ASSET_2_312 - ASSET_SECTION_2 -.word ASSET_2_313 - ASSET_SECTION_2 -.word ASSET_2_314 - ASSET_SECTION_2 -.word ASSET_2_315 - ASSET_SECTION_2 -.word ASSET_2_316 - ASSET_SECTION_2 -.word ASSET_2_317 - ASSET_SECTION_2 -.word ASSET_2_318 - ASSET_SECTION_2 -.word ASSET_2_319 - ASSET_SECTION_2 -.word ASSET_2_320 - ASSET_SECTION_2 -.word ASSET_2_321 - ASSET_SECTION_2 -.word ASSET_2_322 - ASSET_SECTION_2 -.word ASSET_2_323 - ASSET_SECTION_2 -.word ASSET_2_324 - ASSET_SECTION_2 -.word ASSET_2_325 - ASSET_SECTION_2 -.word ASSET_2_326 - ASSET_SECTION_2 -.word ASSET_2_327 - ASSET_SECTION_2 -.word ASSET_2_328 - ASSET_SECTION_2 -.word ASSET_2_329 - ASSET_SECTION_2 -.word ASSET_2_330 - ASSET_SECTION_2 -.word ASSET_2_331 - ASSET_SECTION_2 -.word ASSET_2_332 - ASSET_SECTION_2 -.word ASSET_2_333 - ASSET_SECTION_2 -.word ASSET_2_334 - ASSET_SECTION_2 -.word ASSET_2_335 - ASSET_SECTION_2 -.word ASSET_2_336 - ASSET_SECTION_2 -.word ASSET_2_337 - ASSET_SECTION_2 -.word ASSET_2_338 - ASSET_SECTION_2 -.word ASSET_2_339 - ASSET_SECTION_2 -.word ASSET_2_340 - ASSET_SECTION_2 -.word ASSET_2_341 - ASSET_SECTION_2 -.word ASSET_2_342 - ASSET_SECTION_2 -.word ASSET_2_343 - ASSET_SECTION_2 -.word ASSET_2_344 - ASSET_SECTION_2 -.word ASSET_2_345 - ASSET_SECTION_2 -.word ASSET_2_346 - ASSET_SECTION_2 -.word ASSET_2_347 - ASSET_SECTION_2 -.word ASSET_2_348 - ASSET_SECTION_2 -.word ASSET_2_349 - ASSET_SECTION_2 -.word ASSET_2_350 - ASSET_SECTION_2 -.word ASSET_2_351 - ASSET_SECTION_2 -.word ASSET_2_352 - ASSET_SECTION_2 -.word ASSET_2_353 - ASSET_SECTION_2 -.word ASSET_2_354 - ASSET_SECTION_2 -.word ASSET_2_355 - ASSET_SECTION_2 -.word ASSET_2_356 - ASSET_SECTION_2 -.word ASSET_2_357 - ASSET_SECTION_2 -.word ASSET_2_358 - ASSET_SECTION_2 -.word ASSET_2_359 - ASSET_SECTION_2 -.word ASSET_2_360 - ASSET_SECTION_2 -.word ASSET_2_361 - ASSET_SECTION_2 -.word ASSET_2_362 - ASSET_SECTION_2 -.word ASSET_2_363 - ASSET_SECTION_2 -.word ASSET_2_364 - ASSET_SECTION_2 -.word ASSET_2_365 - ASSET_SECTION_2 -.word ASSET_2_366 - ASSET_SECTION_2 -.word ASSET_2_367 - ASSET_SECTION_2 -.word ASSET_2_368 - ASSET_SECTION_2 -.word ASSET_2_369 - ASSET_SECTION_2 -.word ASSET_2_370 - ASSET_SECTION_2 -.word ASSET_2_371 - ASSET_SECTION_2 -.word ASSET_2_372 - ASSET_SECTION_2 -.word ASSET_2_373 - ASSET_SECTION_2 -.word ASSET_2_374 - ASSET_SECTION_2 -.word ASSET_2_375 - ASSET_SECTION_2 -.word ASSET_2_376 - ASSET_SECTION_2 -.word ASSET_2_377 - ASSET_SECTION_2 -.word ASSET_2_378 - ASSET_SECTION_2 -.word ASSET_2_379 - ASSET_SECTION_2 -.word ASSET_2_380 - ASSET_SECTION_2 -.word ASSET_2_381 - ASSET_SECTION_2 -.word ASSET_2_382 - ASSET_SECTION_2 -.word ASSET_2_383 - ASSET_SECTION_2 -.word ASSET_2_384 - ASSET_SECTION_2 -.word ASSET_2_385 - ASSET_SECTION_2 -.word ASSET_2_386 - ASSET_SECTION_2 -.word ASSET_2_387 - ASSET_SECTION_2 -.word ASSET_2_388 - ASSET_SECTION_2 -.word ASSET_2_389 - ASSET_SECTION_2 -.word ASSET_2_390 - ASSET_SECTION_2 -.word ASSET_2_391 - ASSET_SECTION_2 -.word ASSET_2_392 - ASSET_SECTION_2 -.word ASSET_2_393 - ASSET_SECTION_2 -.word ASSET_2_394 - ASSET_SECTION_2 -.word ASSET_2_395 - ASSET_SECTION_2 -.word ASSET_2_396 - ASSET_SECTION_2 -.word ASSET_2_397 - ASSET_SECTION_2 -.word ASSET_2_398 - ASSET_SECTION_2 -.word ASSET_2_399 - ASSET_SECTION_2 -.word ASSET_2_400 - ASSET_SECTION_2 -.word ASSET_2_401 - ASSET_SECTION_2 -.word ASSET_2_402 - ASSET_SECTION_2 -.word ASSET_2_403 - ASSET_SECTION_2 -.word ASSET_2_404 - ASSET_SECTION_2 -.word ASSET_2_405 - ASSET_SECTION_2 -.word ASSET_2_406 - ASSET_SECTION_2 -.word ASSET_2_407 - ASSET_SECTION_2 -.word ASSET_2_408 - ASSET_SECTION_2 -.word ASSET_2_409 - ASSET_SECTION_2 -.word ASSET_2_410 - ASSET_SECTION_2 -.word ASSET_2_411 - ASSET_SECTION_2 -.word ASSET_2_412 - ASSET_SECTION_2 -.word ASSET_2_413 - ASSET_SECTION_2 -.word ASSET_2_414 - ASSET_SECTION_2 -.word ASSET_2_415 - ASSET_SECTION_2 -.word ASSET_2_416 - ASSET_SECTION_2 -.word ASSET_2_417 - ASSET_SECTION_2 -.word ASSET_2_418 - ASSET_SECTION_2 -.word ASSET_2_419 - ASSET_SECTION_2 -.word ASSET_2_420 - ASSET_SECTION_2 -.word ASSET_2_421 - ASSET_SECTION_2 -.word ASSET_2_422 - ASSET_SECTION_2 -.word ASSET_2_423 - ASSET_SECTION_2 -.word ASSET_2_424 - ASSET_SECTION_2 -.word ASSET_2_425 - ASSET_SECTION_2 -.word ASSET_2_426 - ASSET_SECTION_2 -.word ASSET_2_427 - ASSET_SECTION_2 -.word ASSET_2_428 - ASSET_SECTION_2 -.word ASSET_2_429 - ASSET_SECTION_2 -.word ASSET_2_430 - ASSET_SECTION_2 -.word ASSET_2_431 - ASSET_SECTION_2 -.word ASSET_2_432 - ASSET_SECTION_2 -.word ASSET_2_433 - ASSET_SECTION_2 -.word ASSET_2_434 - ASSET_SECTION_2 -.word ASSET_2_435 - ASSET_SECTION_2 -.word ASSET_2_436 - ASSET_SECTION_2 -.word ASSET_2_437 - ASSET_SECTION_2 -.word ASSET_2_438 - ASSET_SECTION_2 -.word ASSET_2_439 - ASSET_SECTION_2 -.word ASSET_2_440 - ASSET_SECTION_2 -.word ASSET_2_441 - ASSET_SECTION_2 -.word ASSET_2_442 - ASSET_SECTION_2 -.word ASSET_2_443 - ASSET_SECTION_2 -.word ASSET_2_444 - ASSET_SECTION_2 -.word ASSET_2_445 - ASSET_SECTION_2 -.word ASSET_2_446 - ASSET_SECTION_2 -.word ASSET_2_447 - ASSET_SECTION_2 -.word ASSET_2_448 - ASSET_SECTION_2 -.word ASSET_2_449 - ASSET_SECTION_2 -.word ASSET_2_450 - ASSET_SECTION_2 -.word ASSET_2_451 - ASSET_SECTION_2 -.word ASSET_2_452 - ASSET_SECTION_2 -.word ASSET_2_453 - ASSET_SECTION_2 -.word ASSET_2_454 - ASSET_SECTION_2 -.word ASSET_2_455 - ASSET_SECTION_2 -.word ASSET_2_456 - ASSET_SECTION_2 -.word ASSET_2_457 - ASSET_SECTION_2 -.word ASSET_2_458 - ASSET_SECTION_2 -.word ASSET_2_459 - ASSET_SECTION_2 -.word ASSET_2_460 - ASSET_SECTION_2 -.word ASSET_2_461 - ASSET_SECTION_2 -.word ASSET_2_462 - ASSET_SECTION_2 -.word ASSET_2_463 - ASSET_SECTION_2 -.word ASSET_2_464 - ASSET_SECTION_2 -.word ASSET_2_465 - ASSET_SECTION_2 -.word ASSET_2_466 - ASSET_SECTION_2 -.word ASSET_2_467 - ASSET_SECTION_2 -.word ASSET_2_468 - ASSET_SECTION_2 -.word ASSET_2_469 - ASSET_SECTION_2 -.word ASSET_2_470 - ASSET_SECTION_2 -.word ASSET_2_471 - ASSET_SECTION_2 -.word ASSET_2_472 - ASSET_SECTION_2 -.word ASSET_2_473 - ASSET_SECTION_2 -.word ASSET_2_474 - ASSET_SECTION_2 -.word ASSET_2_475 - ASSET_SECTION_2 -.word ASSET_2_476 - ASSET_SECTION_2 -.word ASSET_2_477 - ASSET_SECTION_2 -.word ASSET_2_478 - ASSET_SECTION_2 -.word ASSET_2_479 - ASSET_SECTION_2 -.word ASSET_2_480 - ASSET_SECTION_2 -.word ASSET_2_481 - ASSET_SECTION_2 -.word ASSET_2_482 - ASSET_SECTION_2 -.word ASSET_2_483 - ASSET_SECTION_2 -.word ASSET_2_484 - ASSET_SECTION_2 -.word ASSET_2_485 - ASSET_SECTION_2 -.word ASSET_2_486 - ASSET_SECTION_2 -.word ASSET_2_487 - ASSET_SECTION_2 -.word ASSET_2_488 - ASSET_SECTION_2 -.word ASSET_2_489 - ASSET_SECTION_2 -.word ASSET_2_490 - ASSET_SECTION_2 -.word ASSET_2_491 - ASSET_SECTION_2 -.word ASSET_2_492 - ASSET_SECTION_2 -.word ASSET_2_493 - ASSET_SECTION_2 -.word ASSET_2_494 - ASSET_SECTION_2 -.word ASSET_2_495 - ASSET_SECTION_2 -.word ASSET_2_496 - ASSET_SECTION_2 -.word ASSET_2_497 - ASSET_SECTION_2 -.word ASSET_2_498 - ASSET_SECTION_2 -.word ASSET_2_499 - ASSET_SECTION_2 -.word ASSET_2_500 - ASSET_SECTION_2 -.word ASSET_2_501 - ASSET_SECTION_2 -.word ASSET_2_502 - ASSET_SECTION_2 -.word ASSET_2_503 - ASSET_SECTION_2 -.word ASSET_2_504 - ASSET_SECTION_2 -.word ASSET_2_505 - ASSET_SECTION_2 -.word ASSET_2_506 - ASSET_SECTION_2 -.word ASSET_2_507 - ASSET_SECTION_2 -.word ASSET_2_508 - ASSET_SECTION_2 -.word ASSET_2_509 - ASSET_SECTION_2 -.word ASSET_2_510 - ASSET_SECTION_2 -.word ASSET_2_511 - ASSET_SECTION_2 -.word ASSET_2_512 - ASSET_SECTION_2 -.word ASSET_2_513 - ASSET_SECTION_2 -.word ASSET_2_514 - ASSET_SECTION_2 -.word ASSET_2_515 - ASSET_SECTION_2 -.word ASSET_2_516 - ASSET_SECTION_2 -.word ASSET_2_517 - ASSET_SECTION_2 -.word ASSET_2_518 - ASSET_SECTION_2 -.word ASSET_2_519 - ASSET_SECTION_2 -.word ASSET_2_520 - ASSET_SECTION_2 -.word ASSET_2_521 - ASSET_SECTION_2 -.word ASSET_2_522 - ASSET_SECTION_2 -.word ASSET_2_523 - ASSET_SECTION_2 -.word ASSET_2_524 - ASSET_SECTION_2 -.word ASSET_2_525 - ASSET_SECTION_2 -.word ASSET_2_526 - ASSET_SECTION_2 -.word ASSET_2_527 - ASSET_SECTION_2 -.word ASSET_2_528 - ASSET_SECTION_2 -.word ASSET_2_529 - ASSET_SECTION_2 -.word ASSET_2_530 - ASSET_SECTION_2 -.word ASSET_2_531 - ASSET_SECTION_2 -.word ASSET_2_532 - ASSET_SECTION_2 -.word ASSET_2_533 - ASSET_SECTION_2 -.word ASSET_2_534 - ASSET_SECTION_2 -.word ASSET_2_535 - ASSET_SECTION_2 -.word ASSET_2_536 - ASSET_SECTION_2 -.word ASSET_2_537 - ASSET_SECTION_2 -.word ASSET_2_538 - ASSET_SECTION_2 -.word ASSET_2_539 - ASSET_SECTION_2 -.word ASSET_2_540 - ASSET_SECTION_2 -.word ASSET_2_541 - ASSET_SECTION_2 -.word ASSET_2_542 - ASSET_SECTION_2 -.word ASSET_2_543 - ASSET_SECTION_2 -.word ASSET_2_544 - ASSET_SECTION_2 -.word ASSET_2_545 - ASSET_SECTION_2 -.word ASSET_2_546 - ASSET_SECTION_2 -.word ASSET_2_547 - ASSET_SECTION_2 -.word ASSET_2_548 - ASSET_SECTION_2 -.word ASSET_2_549 - ASSET_SECTION_2 -.word ASSET_2_550 - ASSET_SECTION_2 -.word ASSET_2_551 - ASSET_SECTION_2 -.word ASSET_2_552 - ASSET_SECTION_2 -.word ASSET_2_553 - ASSET_SECTION_2 -.word ASSET_2_554 - ASSET_SECTION_2 -.word ASSET_2_555 - ASSET_SECTION_2 -.word ASSET_2_556 - ASSET_SECTION_2 -.word ASSET_2_557 - ASSET_SECTION_2 -.word ASSET_2_558 - ASSET_SECTION_2 -.word ASSET_2_559 - ASSET_SECTION_2 -.word ASSET_2_560 - ASSET_SECTION_2 -.word ASSET_2_561 - ASSET_SECTION_2 -.word ASSET_2_562 - ASSET_SECTION_2 -.word ASSET_2_563 - ASSET_SECTION_2 -.word ASSET_2_564 - ASSET_SECTION_2 -.word ASSET_2_565 - ASSET_SECTION_2 -.word ASSET_2_566 - ASSET_SECTION_2 -.word ASSET_2_567 - ASSET_SECTION_2 -.word ASSET_2_568 - ASSET_SECTION_2 -.word ASSET_2_569 - ASSET_SECTION_2 -.word ASSET_2_570 - ASSET_SECTION_2 -.word ASSET_2_571 - ASSET_SECTION_2 -.word ASSET_2_572 - ASSET_SECTION_2 -.word ASSET_2_573 - ASSET_SECTION_2 -.word ASSET_2_574 - ASSET_SECTION_2 -.word ASSET_2_575 - ASSET_SECTION_2 -.word ASSET_2_576 - ASSET_SECTION_2 -.word ASSET_2_577 - ASSET_SECTION_2 -.word ASSET_2_578 - ASSET_SECTION_2 -.word ASSET_2_579 - ASSET_SECTION_2 -.word ASSET_2_580 - ASSET_SECTION_2 -.word ASSET_2_581 - ASSET_SECTION_2 -.word ASSET_2_582 - ASSET_SECTION_2 -.word ASSET_2_583 - ASSET_SECTION_2 -.word ASSET_2_584 - ASSET_SECTION_2 -.word ASSET_2_585 - ASSET_SECTION_2 -.word ASSET_2_586 - ASSET_SECTION_2 -.word ASSET_2_587 - ASSET_SECTION_2 -.word ASSET_2_588 - ASSET_SECTION_2 -.word ASSET_2_589 - ASSET_SECTION_2 -.word ASSET_2_590 - ASSET_SECTION_2 -.word ASSET_2_591 - ASSET_SECTION_2 -.word ASSET_2_592 - ASSET_SECTION_2 -.word ASSET_2_593 - ASSET_SECTION_2 -.word ASSET_2_594 - ASSET_SECTION_2 -.word ASSET_2_595 - ASSET_SECTION_2 -.word ASSET_2_596 - ASSET_SECTION_2 -.word ASSET_2_597 - ASSET_SECTION_2 -.word ASSET_2_598 - ASSET_SECTION_2 -.word ASSET_2_599 - ASSET_SECTION_2 -.word ASSET_2_600 - ASSET_SECTION_2 -.word ASSET_2_601 - ASSET_SECTION_2 -.word ASSET_2_602 - ASSET_SECTION_2 -.word ASSET_2_603 - ASSET_SECTION_2 -.word ASSET_2_604 - ASSET_SECTION_2 -.word ASSET_2_605 - ASSET_SECTION_2 -.word ASSET_2_606 - ASSET_SECTION_2 -.word ASSET_2_607 - ASSET_SECTION_2 -.word ASSET_2_608 - ASSET_SECTION_2 -.word ASSET_2_609 - ASSET_SECTION_2 -.word ASSET_2_610 - ASSET_SECTION_2 -.word ASSET_2_611 - ASSET_SECTION_2 -.word ASSET_2_612 - ASSET_SECTION_2 -.word ASSET_2_613 - ASSET_SECTION_2 -.word ASSET_2_614 - ASSET_SECTION_2 -.word ASSET_2_615 - ASSET_SECTION_2 -.word ASSET_2_616 - ASSET_SECTION_2 -.word ASSET_2_617 - ASSET_SECTION_2 -.word ASSET_2_618 - ASSET_SECTION_2 -.word ASSET_2_619 - ASSET_SECTION_2 -.word ASSET_2_620 - ASSET_SECTION_2 -.word ASSET_2_621 - ASSET_SECTION_2 -.word ASSET_2_622 - ASSET_SECTION_2 -.word ASSET_2_623 - ASSET_SECTION_2 -.word ASSET_2_624 - ASSET_SECTION_2 -.word ASSET_2_625 - ASSET_SECTION_2 -.word ASSET_2_626 - ASSET_SECTION_2 -.word ASSET_2_627 - ASSET_SECTION_2 -.word ASSET_2_628 - ASSET_SECTION_2 -.word ASSET_2_629 - ASSET_SECTION_2 -.word ASSET_2_630 - ASSET_SECTION_2 -.word ASSET_2_631 - ASSET_SECTION_2 -.word ASSET_2_632 - ASSET_SECTION_2 -.word ASSET_2_633 - ASSET_SECTION_2 -.word ASSET_2_634 - ASSET_SECTION_2 -.word ASSET_2_635 - ASSET_SECTION_2 -.word ASSET_2_636 - ASSET_SECTION_2 -.word ASSET_2_637 - ASSET_SECTION_2 -.word ASSET_2_638 - ASSET_SECTION_2 -.word ASSET_2_639 - ASSET_SECTION_2 -.word ASSET_2_640 - ASSET_SECTION_2 -.word ASSET_2_641 - ASSET_SECTION_2 -.word ASSET_2_642 - ASSET_SECTION_2 -.word ASSET_2_643 - ASSET_SECTION_2 -.word ASSET_2_644 - ASSET_SECTION_2 -.word ASSET_2_645 - ASSET_SECTION_2 -.word ASSET_2_646 - ASSET_SECTION_2 -.word ASSET_2_647 - ASSET_SECTION_2 -.word ASSET_2_648 - ASSET_SECTION_2 -.word ASSET_2_649 - ASSET_SECTION_2 -.word ASSET_2_650 - ASSET_SECTION_2 -.word ASSET_2_651 - ASSET_SECTION_2 -.word ASSET_2_652 - ASSET_SECTION_2 -.word ASSET_2_653 - ASSET_SECTION_2 -.word ASSET_2_654 - ASSET_SECTION_2 -.word ASSET_2_655 - ASSET_SECTION_2 -.word ASSET_2_656 - ASSET_SECTION_2 -.word ASSET_2_657 - ASSET_SECTION_2 -.word ASSET_2_658 - ASSET_SECTION_2 -.word ASSET_2_659 - ASSET_SECTION_2 -.word ASSET_2_660 - ASSET_SECTION_2 -.word ASSET_2_661 - ASSET_SECTION_2 -.word ASSET_2_662 - ASSET_SECTION_2 -.word ASSET_2_663 - ASSET_SECTION_2 -.word ASSET_2_664 - ASSET_SECTION_2 -.word ASSET_2_665 - ASSET_SECTION_2 -.word ASSET_2_666 - ASSET_SECTION_2 -.word ASSET_2_667 - ASSET_SECTION_2 -.word ASSET_2_668 - ASSET_SECTION_2 -.word ASSET_2_669 - ASSET_SECTION_2 -.word ASSET_2_670 - ASSET_SECTION_2 -.word ASSET_2_671 - ASSET_SECTION_2 -.word ASSET_2_672 - ASSET_SECTION_2 -.word ASSET_2_673 - ASSET_SECTION_2 -.word ASSET_2_674 - ASSET_SECTION_2 -.word ASSET_2_675 - ASSET_SECTION_2 -.word ASSET_2_676 - ASSET_SECTION_2 -.word ASSET_2_677 - ASSET_SECTION_2 -.word ASSET_2_678 - ASSET_SECTION_2 -.word ASSET_2_679 - ASSET_SECTION_2 -.word ASSET_2_680 - ASSET_SECTION_2 -.word ASSET_2_681 - ASSET_SECTION_2 -.word ASSET_2_682 - ASSET_SECTION_2 -.word ASSET_2_683 - ASSET_SECTION_2 -.word ASSET_2_684 - ASSET_SECTION_2 -.word ASSET_2_685 - ASSET_SECTION_2 -.word ASSET_2_686 - ASSET_SECTION_2 -.word ASSET_2_687 - ASSET_SECTION_2 -.word ASSET_2_688 - ASSET_SECTION_2 -.word ASSET_2_689 - ASSET_SECTION_2 -.word ASSET_2_690 - ASSET_SECTION_2 -.word ASSET_2_691 - ASSET_SECTION_2 -.word ASSET_2_692 - ASSET_SECTION_2 -.word ASSET_2_693 - ASSET_SECTION_2 -.word ASSET_2_694 - ASSET_SECTION_2 -.word ASSET_2_695 - ASSET_SECTION_2 -.word ASSET_2_696 - ASSET_SECTION_2 -.word ASSET_2_697 - ASSET_SECTION_2 -.word ASSET_2_698 - ASSET_SECTION_2 -.word ASSET_2_699 - ASSET_SECTION_2 -.word ASSET_2_700 - ASSET_SECTION_2 -.word ASSET_2_701 - ASSET_SECTION_2 -.word ASSET_2_702 - ASSET_SECTION_2 -.word ASSET_2_703 - ASSET_SECTION_2 -.word ASSET_2_704 - ASSET_SECTION_2 -.word ASSET_2_705 - ASSET_SECTION_2 -.word ASSET_2_706 - ASSET_SECTION_2 -.word ASSET_2_707 - ASSET_SECTION_2 -.word ASSET_2_708 - ASSET_SECTION_2 -.word ASSET_2_709 - ASSET_SECTION_2 -.word ASSET_2_710 - ASSET_SECTION_2 -.word ASSET_2_711 - ASSET_SECTION_2 -.word ASSET_2_712 - ASSET_SECTION_2 -.word ASSET_2_713 - ASSET_SECTION_2 -.word ASSET_2_714 - ASSET_SECTION_2 -.word ASSET_2_715 - ASSET_SECTION_2 -.word ASSET_2_716 - ASSET_SECTION_2 -.word ASSET_2_717 - ASSET_SECTION_2 -.word ASSET_2_718 - ASSET_SECTION_2 -.word ASSET_2_719 - ASSET_SECTION_2 -.word ASSET_2_720 - ASSET_SECTION_2 -.word ASSET_2_721 - ASSET_SECTION_2 -.word ASSET_2_722 - ASSET_SECTION_2 -.word ASSET_2_723 - ASSET_SECTION_2 -.word ASSET_2_724 - ASSET_SECTION_2 -.word ASSET_2_725 - ASSET_SECTION_2 -.word ASSET_2_726 - ASSET_SECTION_2 -.word ASSET_2_727 - ASSET_SECTION_2 -.word ASSET_2_728 - ASSET_SECTION_2 -.word ASSET_2_729 - ASSET_SECTION_2 -.word ASSET_2_730 - ASSET_SECTION_2 -.word ASSET_2_731 - ASSET_SECTION_2 -.word ASSET_2_732 - ASSET_SECTION_2 -.word ASSET_2_733 - ASSET_SECTION_2 -.word ASSET_2_734 - ASSET_SECTION_2 -.word ASSET_2_735 - ASSET_SECTION_2 -.word ASSET_2_736 - ASSET_SECTION_2 -.word ASSET_2_737 - ASSET_SECTION_2 -.word ASSET_2_738 - ASSET_SECTION_2 -.word ASSET_2_739 - ASSET_SECTION_2 -.word ASSET_2_740 - ASSET_SECTION_2 -.word ASSET_2_741 - ASSET_SECTION_2 -.word ASSET_2_742 - ASSET_SECTION_2 -.word ASSET_2_743 - ASSET_SECTION_2 -.word ASSET_2_744 - ASSET_SECTION_2 -.word ASSET_2_745 - ASSET_SECTION_2 -.word ASSET_2_746 - ASSET_SECTION_2 -.word ASSET_2_747 - ASSET_SECTION_2 -.word ASSET_2_748 - ASSET_SECTION_2 -.word ASSET_2_749 - ASSET_SECTION_2 -.word ASSET_2_750 - ASSET_SECTION_2 -.word ASSET_2_751 - ASSET_SECTION_2 -.word ASSET_2_752 - ASSET_SECTION_2 -.word ASSET_2_753 - ASSET_SECTION_2 -.word ASSET_2_754 - ASSET_SECTION_2 -.word ASSET_2_755 - ASSET_SECTION_2 -.word ASSET_2_756 - ASSET_SECTION_2 -.word ASSET_2_757 - ASSET_SECTION_2 -.word ASSET_2_758 - ASSET_SECTION_2 -.word ASSET_2_759 - ASSET_SECTION_2 -.word ASSET_2_760 - ASSET_SECTION_2 -.word ASSET_2_761 - ASSET_SECTION_2 -.word ASSET_2_762 - ASSET_SECTION_2 -.word ASSET_2_763 - ASSET_SECTION_2 -.word ASSET_2_764 - ASSET_SECTION_2 -.word ASSET_2_765 - ASSET_SECTION_2 -.word ASSET_2_766 - ASSET_SECTION_2 -.word ASSET_2_767 - ASSET_SECTION_2 -.word ASSET_2_768 - ASSET_SECTION_2 -.word ASSET_2_769 - ASSET_SECTION_2 -.word ASSET_2_770 - ASSET_SECTION_2 -.word ASSET_2_771 - ASSET_SECTION_2 -.word ASSET_2_772 - ASSET_SECTION_2 -.word ASSET_2_773 - ASSET_SECTION_2 -.word ASSET_2_774 - ASSET_SECTION_2 -.word ASSET_2_775 - ASSET_SECTION_2 -.word ASSET_2_776 - ASSET_SECTION_2 -.word ASSET_2_777 - ASSET_SECTION_2 -.word ASSET_2_778 - ASSET_SECTION_2 -.word ASSET_2_779 - ASSET_SECTION_2 -.word ASSET_2_780 - ASSET_SECTION_2 -.word ASSET_2_781 - ASSET_SECTION_2 -.word ASSET_2_782 - ASSET_SECTION_2 -.word ASSET_2_783 - ASSET_SECTION_2 -.word ASSET_2_784 - ASSET_SECTION_2 -.word ASSET_2_785 - ASSET_SECTION_2 -.word ASSET_2_786 - ASSET_SECTION_2 -.word ASSET_2_787 - ASSET_SECTION_2 -.word ASSET_2_788 - ASSET_SECTION_2 -.word ASSET_2_789 - ASSET_SECTION_2 -.word ASSET_2_790 - ASSET_SECTION_2 -.word ASSET_2_791 - ASSET_SECTION_2 -.word ASSET_2_792 - ASSET_SECTION_2 -.word ASSET_2_793 - ASSET_SECTION_2 -.word ASSET_2_794 - ASSET_SECTION_2 -.word ASSET_2_795 - ASSET_SECTION_2 -.word ASSET_2_796 - ASSET_SECTION_2 -.word ASSET_2_797 - ASSET_SECTION_2 -.word ASSET_2_798 - ASSET_SECTION_2 -.word ASSET_2_799 - ASSET_SECTION_2 -.word ASSET_2_800 - ASSET_SECTION_2 -.word ASSET_2_801 - ASSET_SECTION_2 -.word ASSET_2_802 - ASSET_SECTION_2 -.word ASSET_2_803 - ASSET_SECTION_2 -.word ASSET_2_804 - ASSET_SECTION_2 -.word ASSET_2_805 - ASSET_SECTION_2 -.word ASSET_2_806 - ASSET_SECTION_2 -.word ASSET_2_807 - ASSET_SECTION_2 -.word ASSET_2_808 - ASSET_SECTION_2 -.word ASSET_2_809 - ASSET_SECTION_2 -.word ASSET_2_810 - ASSET_SECTION_2 -.word ASSET_2_811 - ASSET_SECTION_2 -.word ASSET_2_812 - ASSET_SECTION_2 -.word ASSET_2_813 - ASSET_SECTION_2 -.word ASSET_2_814 - ASSET_SECTION_2 -.word ASSET_2_815 - ASSET_SECTION_2 -.word ASSET_2_816 - ASSET_SECTION_2 -.word ASSET_2_817 - ASSET_SECTION_2 -.word ASSET_2_818 - ASSET_SECTION_2 -.word ASSET_2_819 - ASSET_SECTION_2 -.word ASSET_2_820 - ASSET_SECTION_2 -.word ASSET_2_821 - ASSET_SECTION_2 -.word ASSET_2_822 - ASSET_SECTION_2 -.word ASSET_2_823 - ASSET_SECTION_2 -.word ASSET_2_824 - ASSET_SECTION_2 -.word ASSET_2_825 - ASSET_SECTION_2 -.word ASSET_2_826 - ASSET_SECTION_2 -.word ASSET_2_827 - ASSET_SECTION_2 -.word ASSET_2_828 - ASSET_SECTION_2 -.word ASSET_2_829 - ASSET_SECTION_2 -.word ASSET_2_830 - ASSET_SECTION_2 -.word ASSET_2_831 - ASSET_SECTION_2 -.word ASSET_2_832 - ASSET_SECTION_2 -.word ASSET_2_833 - ASSET_SECTION_2 -.word ASSET_2_834 - ASSET_SECTION_2 -.word ASSET_2_835 - ASSET_SECTION_2 -.word ASSET_2_836 - ASSET_SECTION_2 -.word ASSET_2_837 - ASSET_SECTION_2 -.word ASSET_2_838 - ASSET_SECTION_2 -.word ASSET_2_839 - ASSET_SECTION_2 -.word ASSET_2_840 - ASSET_SECTION_2 -.word ASSET_2_841 - ASSET_SECTION_2 -.word ASSET_2_842 - ASSET_SECTION_2 -.word ASSET_2_843 - ASSET_SECTION_2 -.word ASSET_2_844 - ASSET_SECTION_2 -.word ASSET_2_845 - ASSET_SECTION_2 -.word ASSET_2_846 - ASSET_SECTION_2 -.word ASSET_2_847 - ASSET_SECTION_2 -.word ASSET_2_848 - ASSET_SECTION_2 -.word ASSET_2_849 - ASSET_SECTION_2 -.word ASSET_2_850 - ASSET_SECTION_2 -.word ASSET_2_851 - ASSET_SECTION_2 -.word ASSET_2_852 - ASSET_SECTION_2 -.word ASSET_2_853 - ASSET_SECTION_2 -.word ASSET_2_854 - ASSET_SECTION_2 -.word ASSET_2_855 - ASSET_SECTION_2 -.word ASSET_2_856 - ASSET_SECTION_2 -.word ASSET_2_857 - ASSET_SECTION_2 -.word ASSET_2_858 - ASSET_SECTION_2 -.word ASSET_2_859 - ASSET_SECTION_2 -.word ASSET_2_860 - ASSET_SECTION_2 -.word ASSET_2_861 - ASSET_SECTION_2 -.word ASSET_2_862 - ASSET_SECTION_2 -.word ASSET_2_863 - ASSET_SECTION_2 -.word ASSET_2_864 - ASSET_SECTION_2 -.word ASSET_2_865 - ASSET_SECTION_2 -.word ASSET_2_866 - ASSET_SECTION_2 -.word ASSET_2_867 - ASSET_SECTION_2 -.word ASSET_2_868 - ASSET_SECTION_2 -.word ASSET_2_869 - ASSET_SECTION_2 -.word ASSET_2_870 - ASSET_SECTION_2 -.word ASSET_2_871 - ASSET_SECTION_2 -.word ASSET_2_872 - ASSET_SECTION_2 -.word ASSET_2_873 - ASSET_SECTION_2 -.word ASSET_2_874 - ASSET_SECTION_2 -.word ASSET_2_875 - ASSET_SECTION_2 -.word ASSET_2_876 - ASSET_SECTION_2 -.word ASSET_2_877 - ASSET_SECTION_2 -.word ASSET_2_878 - ASSET_SECTION_2 -.word ASSET_2_879 - ASSET_SECTION_2 -.word ASSET_2_880 - ASSET_SECTION_2 -.word ASSET_2_881 - ASSET_SECTION_2 -.word ASSET_2_882 - ASSET_SECTION_2 -.word ASSET_2_883 - ASSET_SECTION_2 -.word ASSET_2_884 - ASSET_SECTION_2 -.word ASSET_2_885 - ASSET_SECTION_2 -.word ASSET_2_886 - ASSET_SECTION_2 -.word ASSET_2_887 - ASSET_SECTION_2 -.word ASSET_2_888 - ASSET_SECTION_2 -.word ASSET_2_889 - ASSET_SECTION_2 -.word ASSET_2_890 - ASSET_SECTION_2 -.word ASSET_2_891 - ASSET_SECTION_2 -.word ASSET_2_892 - ASSET_SECTION_2 -.word ASSET_2_893 - ASSET_SECTION_2 -.word ASSET_2_894 - ASSET_SECTION_2 -.word ASSET_2_895 - ASSET_SECTION_2 -.word ASSET_2_896 - ASSET_SECTION_2 -.word ASSET_2_897 - ASSET_SECTION_2 -.word ASSET_2_898 - ASSET_SECTION_2 -.word ASSET_2_899 - ASSET_SECTION_2 -.word ASSET_2_900 - ASSET_SECTION_2 -.word ASSET_2_901 - ASSET_SECTION_2 -.word ASSET_2_902 - ASSET_SECTION_2 -.word ASSET_2_903 - ASSET_SECTION_2 -.word ASSET_2_904 - ASSET_SECTION_2 -.word ASSET_2_905 - ASSET_SECTION_2 -.word ASSET_2_906 - ASSET_SECTION_2 -.word ASSET_2_907 - ASSET_SECTION_2 -.word ASSET_2_908 - ASSET_SECTION_2 -.word ASSET_2_909 - ASSET_SECTION_2 -.word ASSET_2_910 - ASSET_SECTION_2 -.word ASSET_2_911 - ASSET_SECTION_2 -.word ASSET_2_912 - ASSET_SECTION_2 -.word ASSET_2_913 - ASSET_SECTION_2 -.word ASSET_2_914 - ASSET_SECTION_2 -.word ASSET_2_915 - ASSET_SECTION_2 -.word ASSET_2_916 - ASSET_SECTION_2 -.word ASSET_2_917 - ASSET_SECTION_2 -.word ASSET_2_918 - ASSET_SECTION_2 -.word ASSET_2_919 - ASSET_SECTION_2 -.word ASSET_2_920 - ASSET_SECTION_2 -.word ASSET_2_921 - ASSET_SECTION_2 -.word ASSET_2_922 - ASSET_SECTION_2 -.word ASSET_2_923 - ASSET_SECTION_2 -.word ASSET_2_924 - ASSET_SECTION_2 -.word ASSET_2_925 - ASSET_SECTION_2 -.word ASSET_2_926 - ASSET_SECTION_2 -.word ASSET_2_927 - ASSET_SECTION_2 -.word ASSET_2_928 - ASSET_SECTION_2 -.word ASSET_2_929 - ASSET_SECTION_2 -.word ASSET_2_930 - ASSET_SECTION_2 -.word ASSET_2_931 - ASSET_SECTION_2 -.word ASSET_2_932 - ASSET_SECTION_2 -.word ASSET_2_933 - ASSET_SECTION_2 -.word ASSET_2_934 - ASSET_SECTION_2 -.word ASSET_2_935 - ASSET_SECTION_2 -.word ASSET_2_936 - ASSET_SECTION_2 -.word ASSET_2_937 - ASSET_SECTION_2 -.word ASSET_2_938 - ASSET_SECTION_2 -.word ASSET_2_939 - ASSET_SECTION_2 -.word ASSET_2_940 - ASSET_SECTION_2 -.word ASSET_2_941 - ASSET_SECTION_2 -.word ASSET_2_942 - ASSET_SECTION_2 -.word ASSET_2_943 - ASSET_SECTION_2 -.word ASSET_2_944 - ASSET_SECTION_2 -.word ASSET_2_945 - ASSET_SECTION_2 -.word ASSET_2_946 - ASSET_SECTION_2 -.word ASSET_2_947 - ASSET_SECTION_2 -.word ASSET_2_948 - ASSET_SECTION_2 -.word ASSET_2_949 - ASSET_SECTION_2 -.word ASSET_2_950 - ASSET_SECTION_2 -.word ASSET_2_951 - ASSET_SECTION_2 -.word ASSET_2_952 - ASSET_SECTION_2 -.word ASSET_2_953 - ASSET_SECTION_2 -.word ASSET_2_954 - ASSET_SECTION_2 -.word ASSET_2_955 - ASSET_SECTION_2 -.word ASSET_2_956 - ASSET_SECTION_2 -.word ASSET_2_957 - ASSET_SECTION_2 -.word ASSET_2_958 - ASSET_SECTION_2 -.word ASSET_2_959 - ASSET_SECTION_2 -.word ASSET_2_960 - ASSET_SECTION_2 -.word ASSET_2_961 - ASSET_SECTION_2 -.word ASSET_2_962 - ASSET_SECTION_2 -.word ASSET_2_963 - ASSET_SECTION_2 -.word ASSET_2_964 - ASSET_SECTION_2 -.word ASSET_2_965 - ASSET_SECTION_2 -.word ASSET_2_966 - ASSET_SECTION_2 -.word ASSET_2_967 - ASSET_SECTION_2 -.word ASSET_2_968 - ASSET_SECTION_2 -.word ASSET_2_969 - ASSET_SECTION_2 -.word ASSET_2_970 - ASSET_SECTION_2 -.word ASSET_2_971 - ASSET_SECTION_2 -.word ASSET_2_972 - ASSET_SECTION_2 -.word ASSET_2_973 - ASSET_SECTION_2 -.word ASSET_2_974 - ASSET_SECTION_2 -.word ASSET_2_975 - ASSET_SECTION_2 -.word ASSET_2_976 - ASSET_SECTION_2 -.word ASSET_2_977 - ASSET_SECTION_2 -.word ASSET_2_978 - ASSET_SECTION_2 -.word ASSET_2_979 - ASSET_SECTION_2 -.word ASSET_2_980 - ASSET_SECTION_2 -.word ASSET_2_981 - ASSET_SECTION_2 -.word ASSET_2_982 - ASSET_SECTION_2 -.word ASSET_2_983 - ASSET_SECTION_2 -.word ASSET_2_984 - ASSET_SECTION_2 -.word ASSET_2_985 - ASSET_SECTION_2 -.word ASSET_2_986 - ASSET_SECTION_2 -.word ASSET_2_987 - ASSET_SECTION_2 -.word ASSET_2_988 - ASSET_SECTION_2 -.word ASSET_2_989 - ASSET_SECTION_2 -.word ASSET_2_990 - ASSET_SECTION_2 -.word ASSET_2_991 - ASSET_SECTION_2 -.word ASSET_2_992 - ASSET_SECTION_2 -.word ASSET_2_993 - ASSET_SECTION_2 -.word ASSET_2_994 - ASSET_SECTION_2 -.word ASSET_2_995 - ASSET_SECTION_2 -.word ASSET_2_996 - ASSET_SECTION_2 -.word ASSET_2_997 - ASSET_SECTION_2 -.word ASSET_2_998 - ASSET_SECTION_2 -.word ASSET_2_999 - ASSET_SECTION_2 -.word ASSET_2_1000 - ASSET_SECTION_2 -.word ASSET_2_1001 - ASSET_SECTION_2 -.word ASSET_2_1002 - ASSET_SECTION_2 -.word ASSET_2_1003 - ASSET_SECTION_2 -.word ASSET_2_1004 - ASSET_SECTION_2 -.word ASSET_2_1005 - ASSET_SECTION_2 -.word ASSET_2_1006 - ASSET_SECTION_2 -.word ASSET_2_1007 - ASSET_SECTION_2 -.word ASSET_2_1008 - ASSET_SECTION_2 -.word ASSET_2_1009 - ASSET_SECTION_2 -.word ASSET_2_1010 - ASSET_SECTION_2 -.word ASSET_2_1011 - ASSET_SECTION_2 -.word ASSET_2_1012 - ASSET_SECTION_2 -.word ASSET_2_1013 - ASSET_SECTION_2 -.word ASSET_2_1014 - ASSET_SECTION_2 -.word ASSET_2_1015 - ASSET_SECTION_2 -.word ASSET_2_1016 - ASSET_SECTION_2 -.word ASSET_2_1017 - ASSET_SECTION_2 -.word ASSET_2_1018 - ASSET_SECTION_2 -.word ASSET_2_1019 - ASSET_SECTION_2 -.word ASSET_2_1020 - ASSET_SECTION_2 -.word ASSET_2_1021 - ASSET_SECTION_2 -.word ASSET_2_1022 - ASSET_SECTION_2 -.word ASSET_2_1023 - ASSET_SECTION_2 -.word ASSET_2_1024 - ASSET_SECTION_2 -.word ASSET_2_1025 - ASSET_SECTION_2 -.word ASSET_2_1026 - ASSET_SECTION_2 -.word ASSET_2_1027 - ASSET_SECTION_2 -.word ASSET_2_1028 - ASSET_SECTION_2 -.word ASSET_2_1029 - ASSET_SECTION_2 -.word ASSET_2_1030 - ASSET_SECTION_2 -.word ASSET_2_1031 - ASSET_SECTION_2 -.word ASSET_2_1032 - ASSET_SECTION_2 -.word ASSET_2_1033 - ASSET_SECTION_2 -.word ASSET_2_1034 - ASSET_SECTION_2 -.word ASSET_2_1035 - ASSET_SECTION_2 -.word ASSET_2_1036 - ASSET_SECTION_2 -.word ASSET_2_1037 - ASSET_SECTION_2 -.word ASSET_2_1038 - ASSET_SECTION_2 -.word ASSET_2_1039 - ASSET_SECTION_2 -.word ASSET_2_1040 - ASSET_SECTION_2 -.word ASSET_2_1041 - ASSET_SECTION_2 -.word ASSET_2_1042 - ASSET_SECTION_2 -.word ASSET_2_1043 - ASSET_SECTION_2 -.word ASSET_2_1044 - ASSET_SECTION_2 -.word ASSET_2_1045 - ASSET_SECTION_2 -.word ASSET_2_1046 - ASSET_SECTION_2 -.word ASSET_2_1047 - ASSET_SECTION_2 -.word ASSET_2_1048 - ASSET_SECTION_2 -.word ASSET_2_1049 - ASSET_SECTION_2 -.word ASSET_2_1050 - ASSET_SECTION_2 -.word ASSET_2_1051 - ASSET_SECTION_2 -.word ASSET_2_1052 - ASSET_SECTION_2 -.word ASSET_2_1053 - ASSET_SECTION_2 -.word ASSET_2_1054 - ASSET_SECTION_2 -.word ASSET_2_1055 - ASSET_SECTION_2 -.word ASSET_2_1056 - ASSET_SECTION_2 -.word ASSET_2_1057 - ASSET_SECTION_2 -.word ASSET_2_1058 - ASSET_SECTION_2 -.word ASSET_2_1059 - ASSET_SECTION_2 -.word ASSET_2_1060 - ASSET_SECTION_2 -.word ASSET_2_1061 - ASSET_SECTION_2 -.word ASSET_2_1062 - ASSET_SECTION_2 -.word ASSET_2_1063 - ASSET_SECTION_2 -.word ASSET_2_1064 - ASSET_SECTION_2 -.word ASSET_2_1065 - ASSET_SECTION_2 -.word ASSET_2_1066 - ASSET_SECTION_2 -.word ASSET_2_1067 - ASSET_SECTION_2 -.word ASSET_2_1068 - ASSET_SECTION_2 -.word ASSET_2_1069 - ASSET_SECTION_2 -.word ASSET_2_1070 - ASSET_SECTION_2 -.word ASSET_2_1071 - ASSET_SECTION_2 -.word ASSET_2_1072 - ASSET_SECTION_2 -.word ASSET_2_1073 - ASSET_SECTION_2 -.word ASSET_2_1074 - ASSET_SECTION_2 -.word ASSET_2_1075 - ASSET_SECTION_2 -.word ASSET_2_1076 - ASSET_SECTION_2 -.word ASSET_2_1077 - ASSET_SECTION_2 -.word ASSET_2_1078 - ASSET_SECTION_2 -.word ASSET_2_1079 - ASSET_SECTION_2 -.word ASSET_2_1080 - ASSET_SECTION_2 -.word ASSET_2_1081 - ASSET_SECTION_2 -.word ASSET_2_1082 - ASSET_SECTION_2 -.word ASSET_2_1083 - ASSET_SECTION_2 -.word ASSET_2_1084 - ASSET_SECTION_2 -.word ASSET_2_1085 - ASSET_SECTION_2 -.word ASSET_2_1086 - ASSET_SECTION_2 -.word ASSET_2_1087 - ASSET_SECTION_2 -.word ASSET_2_1088 - ASSET_SECTION_2 -.word ASSET_2_1089 - ASSET_SECTION_2 -.word ASSET_2_1090 - ASSET_SECTION_2 -.word ASSET_2_1091 - ASSET_SECTION_2 -.word ASSET_2_1092 - ASSET_SECTION_2 -.word ASSET_2_1093 - ASSET_SECTION_2 -.word ASSET_2_1094 - ASSET_SECTION_2 -.word ASSET_2_1095 - ASSET_SECTION_2 -.word ASSET_2_1096 - ASSET_SECTION_2 -.word ASSET_2_1097 - ASSET_SECTION_2 -.word ASSET_2_1098 - ASSET_SECTION_2 -.word ASSET_2_1099 - ASSET_SECTION_2 -.word ASSET_2_1100 - ASSET_SECTION_2 -.word ASSET_2_1101 - ASSET_SECTION_2 -.word ASSET_2_1102 - ASSET_SECTION_2 -.word ASSET_2_1103 - ASSET_SECTION_2 -.word ASSET_2_1104 - ASSET_SECTION_2 -.word ASSET_2_1105 - ASSET_SECTION_2 -.word ASSET_2_1106 - ASSET_SECTION_2 -.word ASSET_2_1107 - ASSET_SECTION_2 -.word ASSET_2_1108 - ASSET_SECTION_2 -.word ASSET_2_1109 - ASSET_SECTION_2 -.word ASSET_2_1110 - ASSET_SECTION_2 -.word ASSET_2_1111 - ASSET_SECTION_2 -.word ASSET_2_1112 - ASSET_SECTION_2 -.word ASSET_2_1113 - ASSET_SECTION_2 -.word ASSET_2_1114 - ASSET_SECTION_2 -.word ASSET_2_1115 - ASSET_SECTION_2 -.word ASSET_2_1116 - ASSET_SECTION_2 -.word ASSET_2_1117 - ASSET_SECTION_2 -.word ASSET_2_1118 - ASSET_SECTION_2 -.word ASSET_2_1119 - ASSET_SECTION_2 -.word ASSET_2_1120 - ASSET_SECTION_2 -.word ASSET_2_1121 - ASSET_SECTION_2 -.word ASSET_2_1122 - ASSET_SECTION_2 -.word ASSET_2_1123 - ASSET_SECTION_2 -.word ASSET_2_1124 - ASSET_SECTION_2 -.word ASSET_2_1125 - ASSET_SECTION_2 -.word ASSET_2_1126 - ASSET_SECTION_2 -.word ASSET_2_1127 - ASSET_SECTION_2 -.word ASSET_2_1128 - ASSET_SECTION_2 -.word ASSET_2_1129 - ASSET_SECTION_2 -.word ASSET_2_1130 - ASSET_SECTION_2 -.word ASSET_2_1131 - ASSET_SECTION_2 -.word ASSET_2_1132 - ASSET_SECTION_2 -.word ASSET_2_1133 - ASSET_SECTION_2 -.word ASSET_2_1134 - ASSET_SECTION_2 -.word ASSET_2_1135 - ASSET_SECTION_2 -.word ASSET_2_1136 - ASSET_SECTION_2 -.word ASSET_2_1137 - ASSET_SECTION_2 -.word ASSET_2_1138 - ASSET_SECTION_2 -.word ASSET_2_1139 - ASSET_SECTION_2 -.word ASSET_2_1140 - ASSET_SECTION_2 -.word ASSET_2_1141 - ASSET_SECTION_2 -.word ASSET_2_1142 - ASSET_SECTION_2 -.word ASSET_2_1143 - ASSET_SECTION_2 -.word ASSET_2_1144 - ASSET_SECTION_2 -.word ASSET_2_1145 - ASSET_SECTION_2 -.word ASSET_2_1146 - ASSET_SECTION_2 -.word ASSET_2_1147 - ASSET_SECTION_2 -.word ASSET_2_1148 - ASSET_SECTION_2 -.word ASSET_2_1149 - ASSET_SECTION_2 -.word ASSET_2_1150 - ASSET_SECTION_2 -.word ASSET_2_1151 - ASSET_SECTION_2 -.word ASSET_2_1152 - ASSET_SECTION_2 -.word ASSET_2_1153 - ASSET_SECTION_2 -.word ASSET_2_1154 - ASSET_SECTION_2 -.word ASSET_2_1155 - ASSET_SECTION_2 -.word ASSET_2_1156 - ASSET_SECTION_2 -.word ASSET_2_1157 - ASSET_SECTION_2 -.word ASSET_2_1158 - ASSET_SECTION_2 -.word ASSET_2_1159 - ASSET_SECTION_2 -.word ASSET_2_1160 - ASSET_SECTION_2 -.word ASSET_2_1161 - ASSET_SECTION_2 -.word ASSET_2_1162 - ASSET_SECTION_2 -.word ASSET_2_1163 - ASSET_SECTION_2 -.word ASSET_2_1164 - ASSET_SECTION_2 -.word ASSET_2_1165 - ASSET_SECTION_2 -.word ASSET_2_1166 - ASSET_SECTION_2 -.word ASSET_2_1167 - ASSET_SECTION_2 -.word ASSET_2_1168 - ASSET_SECTION_2 -.word ASSET_2_1169 - ASSET_SECTION_2 -.word ASSET_2_1170 - ASSET_SECTION_2 -.word ASSET_2_1171 - ASSET_SECTION_2 -.word ASSET_2_1172 - ASSET_SECTION_2 -.word ASSET_2_1173 - ASSET_SECTION_2 -.word ASSET_2_1174 - ASSET_SECTION_2 -.word ASSET_2_1175 - ASSET_SECTION_2 -.word ASSET_2_1176 - ASSET_SECTION_2 -.word ASSET_2_1177 - ASSET_SECTION_2 -.word ASSET_2_1178 - ASSET_SECTION_2 -.word ASSET_2_1179 - ASSET_SECTION_2 -.word ASSET_2_1180 - ASSET_SECTION_2 -.word ASSET_2_1181 - ASSET_SECTION_2 -.word ASSET_2_1182 - ASSET_SECTION_2 -.word ASSET_2_1183 - ASSET_SECTION_2 -.word ASSET_2_1184 - ASSET_SECTION_2 -.word ASSET_2_1185 - ASSET_SECTION_2 -.word ASSET_2_1186 - ASSET_SECTION_2 -.word ASSET_2_1187 - ASSET_SECTION_2 -.word ASSET_2_1188 - ASSET_SECTION_2 -.word ASSET_2_1189 - ASSET_SECTION_2 -.word ASSET_2_1190 - ASSET_SECTION_2 -.word ASSET_2_1191 - ASSET_SECTION_2 -.word ASSET_2_1192 - ASSET_SECTION_2 -.word ASSET_2_1193 - ASSET_SECTION_2 -.word ASSET_2_1194 - ASSET_SECTION_2 -.word ASSET_2_1195 - ASSET_SECTION_2 -.word ASSET_2_1196 - ASSET_SECTION_2 -.word ASSET_2_1197 - ASSET_SECTION_2 -.word ASSET_2_1198 - ASSET_SECTION_2 -.word ASSET_2_1199 - ASSET_SECTION_2 -.word ASSET_2_1200 - ASSET_SECTION_2 -.word ASSET_2_1201 - ASSET_SECTION_2 -.word ASSET_2_1202 - ASSET_SECTION_2 -.word ASSET_2_1203 - ASSET_SECTION_2 -.word ASSET_2_1204 - ASSET_SECTION_2 -.word ASSET_2_1205 - ASSET_SECTION_2 -.word ASSET_2_1206 - ASSET_SECTION_2 -.word ASSET_2_1207 - ASSET_SECTION_2 -.word ASSET_2_1208 - ASSET_SECTION_2 -.word ASSET_2_1209 - ASSET_SECTION_2 -.word ASSET_2_1210 - ASSET_SECTION_2 -.word ASSET_2_1211 - ASSET_SECTION_2 -.word ASSET_2_1212 - ASSET_SECTION_2 -.word ASSET_2_1213 - ASSET_SECTION_2 -.word ASSET_2_1214 - ASSET_SECTION_2 -.word ASSET_2_1215 - ASSET_SECTION_2 -.word ASSET_2_1216 - ASSET_SECTION_2 -.word ASSET_2_1217 - ASSET_SECTION_2 -.word ASSET_2_1218 - ASSET_SECTION_2 -.word ASSET_2_1219 - ASSET_SECTION_2 -.word ASSET_2_1220 - ASSET_SECTION_2 -.word ASSET_2_1221 - ASSET_SECTION_2 -.word ASSET_2_1222 - ASSET_SECTION_2 -.word ASSET_2_1223 - ASSET_SECTION_2 -.word ASSET_2_1224 - ASSET_SECTION_2 -.word ASSET_2_1225 - ASSET_SECTION_2 -.word ASSET_2_1226 - ASSET_SECTION_2 -.word ASSET_2_1227 - ASSET_SECTION_2 -.word ASSET_2_1228 - ASSET_SECTION_2 -.word ASSET_2_1229 - ASSET_SECTION_2 -.word ASSET_2_1230 - ASSET_SECTION_2 -.word ASSET_2_1231 - ASSET_SECTION_2 -.word ASSET_2_1232 - ASSET_SECTION_2 -.word ASSET_2_1233 - ASSET_SECTION_2 -.word ASSET_2_1234 - ASSET_SECTION_2 -.word ASSET_2_1235 - ASSET_SECTION_2 -.word ASSET_2_1236 - ASSET_SECTION_2 -.word ASSET_2_1237 - ASSET_SECTION_2 -.word ASSET_2_1238 - ASSET_SECTION_2 -.word ASSET_2_1239 - ASSET_SECTION_2 -.word ASSET_2_1240 - ASSET_SECTION_2 -.word ASSET_2_1241 - ASSET_SECTION_2 -.word ASSET_2_1242 - ASSET_SECTION_2 -.word ASSET_2_1243 - ASSET_SECTION_2 -.word ASSET_2_1244 - ASSET_SECTION_2 -.word ASSET_2_1245 - ASSET_SECTION_2 -.word ASSET_2_1246 - ASSET_SECTION_2 -.word ASSET_2_1247 - ASSET_SECTION_2 -.word ASSET_2_1248 - ASSET_SECTION_2 -.word ASSET_2_1249 - ASSET_SECTION_2 -.word ASSET_2_1250 - ASSET_SECTION_2 -.word ASSET_2_1251 - ASSET_SECTION_2 -.word ASSET_2_1252 - ASSET_SECTION_2 -.word ASSET_2_1253 - ASSET_SECTION_2 -.word ASSET_2_1254 - ASSET_SECTION_2 -.word ASSET_2_1255 - ASSET_SECTION_2 -.word ASSET_2_1256 - ASSET_SECTION_2 -.word ASSET_2_1257 - ASSET_SECTION_2 -.word ASSET_2_1258 - ASSET_SECTION_2 -.word ASSET_2_1259 - ASSET_SECTION_2 -.word ASSET_2_1260 - ASSET_SECTION_2 -.word ASSET_2_1261 - ASSET_SECTION_2 -.word ASSET_2_1262 - ASSET_SECTION_2 -.word ASSET_2_1263 - ASSET_SECTION_2 -.word ASSET_2_1264 - ASSET_SECTION_2 -.word ASSET_2_1265 - ASSET_SECTION_2 -.word ASSET_2_1266 - ASSET_SECTION_2 -.word ASSET_2_1267 - ASSET_SECTION_2 -.word ASSET_2_1268 - ASSET_SECTION_2 -.word ASSET_2_1269 - ASSET_SECTION_2 -.word ASSET_2_1270 - ASSET_SECTION_2 -.word ASSET_2_1271 - ASSET_SECTION_2 -.word ASSET_2_1272 - ASSET_SECTION_2 -.word ASSET_2_1273 - ASSET_SECTION_2 -.word ASSET_2_1274 - ASSET_SECTION_2 -.word ASSET_2_1275 - ASSET_SECTION_2 -.word ASSET_2_1276 - ASSET_SECTION_2 -.word ASSET_2_1277 - ASSET_SECTION_2 -.word ASSET_2_1278 - ASSET_SECTION_2 -.word ASSET_2_1279 - ASSET_SECTION_2 -.word ASSET_2_1280 - ASSET_SECTION_2 -.word ASSET_2_1281 - ASSET_SECTION_2 -.word ASSET_2_1282 - ASSET_SECTION_2 -.word ASSET_2_1283 - ASSET_SECTION_2 -.word ASSET_2_1284 - ASSET_SECTION_2 -.word ASSET_2_1285 - ASSET_SECTION_2 -.word ASSET_2_1286 - ASSET_SECTION_2 -.word ASSET_2_1287 - ASSET_SECTION_2 -.word ASSET_2_1288 - ASSET_SECTION_2 -.word ASSET_2_1289 - ASSET_SECTION_2 -.word ASSET_2_1290 - ASSET_SECTION_2 -.word ASSET_2_1291 - ASSET_SECTION_2 -.word ASSET_2_1292 - ASSET_SECTION_2 -.word ASSET_2_1293 - ASSET_SECTION_2 -.word ASSET_2_1294 - ASSET_SECTION_2 -.word ASSET_2_1295 - ASSET_SECTION_2 -.word ASSET_2_1296 - ASSET_SECTION_2 -.word ASSET_2_1297 - ASSET_SECTION_2 -.word ASSET_2_1298 - ASSET_SECTION_2 -.word ASSET_2_1299 - ASSET_SECTION_2 -.word ASSET_2_1300 - ASSET_SECTION_2 -.word ASSET_2_1301 - ASSET_SECTION_2 -.word ASSET_2_1302 - ASSET_SECTION_2 -.word ASSET_2_1303 - ASSET_SECTION_2 -.word ASSET_2_1304 - ASSET_SECTION_2 -.word ASSET_2_1305 - ASSET_SECTION_2 -.word ASSET_2_1306 - ASSET_SECTION_2 -.word ASSET_2_1307 - ASSET_SECTION_2 -.word ASSET_2_1308 - ASSET_SECTION_2 -.word ASSET_2_1309 - ASSET_SECTION_2 -.word ASSET_2_1310 - ASSET_SECTION_2 -.word ASSET_2_1311 - ASSET_SECTION_2 -.word ASSET_2_1312 - ASSET_SECTION_2 -.word ASSET_2_1313 - ASSET_SECTION_2 -.word ASSET_2_1314 - ASSET_SECTION_2 -.word ASSET_2_1315 - ASSET_SECTION_2 -.word ASSET_2_1316 - ASSET_SECTION_2 -.word ASSET_2_1317 - ASSET_SECTION_2 -.word ASSET_2_1318 - ASSET_SECTION_2 -.word ASSET_2_1319 - ASSET_SECTION_2 -.word ASSET_2_1320 - ASSET_SECTION_2 -.word ASSET_2_1321 - ASSET_SECTION_2 -.word ASSET_2_1322 - ASSET_SECTION_2 -.word ASSET_2_1323 - ASSET_SECTION_2 -.word ASSET_2_1324 - ASSET_SECTION_2 -.word ASSET_2_1325 - ASSET_SECTION_2 -.word ASSET_2_1326 - ASSET_SECTION_2 -.word ASSET_2_1327 - ASSET_SECTION_2 -.word ASSET_2_1328 - ASSET_SECTION_2 -.word ASSET_2_1329 - ASSET_SECTION_2 -.word ASSET_2_1330 - ASSET_SECTION_2 -.word ASSET_2_1331 - ASSET_SECTION_2 -.word ASSET_2_1332 - ASSET_SECTION_2 -.word ASSET_2_1333 - ASSET_SECTION_2 -.word ASSET_2_1334 - ASSET_SECTION_2 -.word ASSET_2_1335 - ASSET_SECTION_2 -.word ASSET_2_1336 - ASSET_SECTION_2 -.word ASSET_2_1337 - ASSET_SECTION_2 -.word ASSET_2_1338 - ASSET_SECTION_2 -.word ASSET_2_1339 - ASSET_SECTION_2 -.word ASSET_2_1340 - ASSET_SECTION_2 -.word ASSET_2_1341 - ASSET_SECTION_2 -.word ASSET_2_1342 - ASSET_SECTION_2 -.word ASSET_2_1343 - ASSET_SECTION_2 -.word ASSET_2_1344 - ASSET_SECTION_2 -.word ASSET_2_1345 - ASSET_SECTION_2 -.word ASSET_2_1346 - ASSET_SECTION_2 -.word ASSET_2_1347 - ASSET_SECTION_2 -.word ASSET_2_1348 - ASSET_SECTION_2 -.word ASSET_2_1349 - ASSET_SECTION_2 -.word ASSET_2_1350 - ASSET_SECTION_2 -.word ASSET_2_1351 - ASSET_SECTION_2 -.word ASSET_2_1352 - ASSET_SECTION_2 -.word ASSET_2_1353 - ASSET_SECTION_2 -.word ASSET_2_1354 - ASSET_SECTION_2 -.word ASSET_2_1355 - ASSET_SECTION_2 -.word ASSET_2_1356 - ASSET_SECTION_2 -.word ASSET_2_1357 - ASSET_SECTION_2 -.word ASSET_2_1358 - ASSET_SECTION_2 -.word ASSET_2_1359 - ASSET_SECTION_2 -.word ASSET_2_1360 - ASSET_SECTION_2 -.word ASSET_2_1361 - ASSET_SECTION_2 -.word ASSET_2_1362 - ASSET_SECTION_2 -.word ASSET_2_1363 - ASSET_SECTION_2 -.word ASSET_2_1364 - ASSET_SECTION_2 -.word ASSET_2_1365 - ASSET_SECTION_2 -.word ASSET_2_1366 - ASSET_SECTION_2 -.word ASSET_2_1367 - ASSET_SECTION_2 -.word ASSET_2_1368 - ASSET_SECTION_2 -.word ASSET_2_1369 - ASSET_SECTION_2 -.word ASSET_2_1370 - ASSET_SECTION_2 -.word ASSET_2_1371 - ASSET_SECTION_2 -.word ASSET_2_1372 - ASSET_SECTION_2 -.word ASSET_2_1373 - ASSET_SECTION_2 -.word ASSET_2_1374 - ASSET_SECTION_2 -.word ASSET_2_1375 - ASSET_SECTION_2 -.word ASSET_2_1376 - ASSET_SECTION_2 -.word ASSET_2_1377 - ASSET_SECTION_2 -.word ASSET_2_1378 - ASSET_SECTION_2 -.word ASSET_2_1379 - ASSET_SECTION_2 -.word ASSET_2_1380 - ASSET_SECTION_2 -.word ASSET_2_1381 - ASSET_SECTION_2 -.word ASSET_2_1382 - ASSET_SECTION_2 -.word ASSET_2_1383 - ASSET_SECTION_2 -.word ASSET_2_1384 - ASSET_SECTION_2 -.word ASSET_2_1385 - ASSET_SECTION_2 -.word ASSET_2_1386 - ASSET_SECTION_2 -.word ASSET_2_1387 - ASSET_SECTION_2 -.word ASSET_2_1388 - ASSET_SECTION_2 -.word ASSET_2_1389 - ASSET_SECTION_2 -.word ASSET_2_1390 - ASSET_SECTION_2 -.word ASSET_2_1391 - ASSET_SECTION_2 -.word ASSET_2_1392 - ASSET_SECTION_2 -.word ASSET_2_1393 - ASSET_SECTION_2 -.word ASSET_2_1394 - ASSET_SECTION_2 -.word ASSET_2_1395 - ASSET_SECTION_2 -.word ASSET_2_1396 - ASSET_SECTION_2 -.word ASSET_2_1397 - ASSET_SECTION_2 -.word ASSET_2_1398 - ASSET_SECTION_2 -.word ASSET_2_1399 - ASSET_SECTION_2 -.word ASSET_2_1400 - ASSET_SECTION_2 -.word ASSET_SECTION_2_END - ASSET_SECTION_2 +glabel ASSET_TEXTURES_3D_TABLE +.word ASSET_TEX3D_0 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_2 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_3 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_4 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_5 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_6 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_7 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_8 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_9 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_10 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_11 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_12 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_13 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_14 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_15 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_16 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_17 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_18 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_19 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_20 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_21 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_22 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_23 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_24 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_25 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_26 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_27 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_28 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_29 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_30 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_31 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_32 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_33 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_34 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_35 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_36 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_37 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_38 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_39 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_40 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_41 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_42 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_43 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_44 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_45 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_46 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_47 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_48 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_49 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_50 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_51 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_52 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_53 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_54 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_55 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_56 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_57 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_58 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_59 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_60 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_61 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_62 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_63 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_64 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_65 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_66 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_67 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_68 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_69 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_70 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_71 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_72 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_73 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_74 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_75 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_76 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_77 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_78 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_79 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_80 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_81 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_82 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_83 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_84 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_85 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_86 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_87 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_88 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_89 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_90 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_91 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_92 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_93 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_94 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_95 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_96 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_97 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_98 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_99 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_100 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_101 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_102 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_103 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_104 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_105 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_106 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_107 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_108 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_109 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_110 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_111 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_112 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_113 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_114 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_115 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_116 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_117 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_118 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_119 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_120 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_121 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_122 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_123 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_124 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_125 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_126 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_127 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_128 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_129 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_130 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_131 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_132 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_133 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_134 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_135 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_136 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_137 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_138 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_139 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_140 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_141 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_142 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_143 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_144 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_145 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_146 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_147 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_148 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_149 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_150 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_151 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_152 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_153 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_154 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_155 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_156 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_157 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_158 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_159 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_160 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_161 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_162 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_163 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_164 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_165 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_166 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_167 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_168 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_169 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_170 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_171 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_172 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_173 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_174 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_175 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_176 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_177 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_178 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_179 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_180 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_181 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_182 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_183 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_184 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_185 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_186 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_187 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_188 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_189 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_190 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_191 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_192 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_193 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_194 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_195 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_196 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_197 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_198 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_199 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_200 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_201 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_202 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_203 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_204 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_205 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_206 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_207 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_208 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_209 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_210 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_211 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_212 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_213 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_214 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_215 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_216 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_217 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_218 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_219 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_220 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_221 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_222 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_223 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_224 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_225 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_226 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_227 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_228 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_229 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_230 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_231 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_232 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_233 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_234 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_235 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_236 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_237 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_238 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_239 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_240 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_241 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_242 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_243 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_244 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_245 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_246 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_247 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_248 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_249 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_250 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_251 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_252 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_253 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_254 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_255 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_256 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_257 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_258 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_259 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_260 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_261 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_262 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_263 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_264 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_265 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_266 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_267 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_268 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_269 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_270 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_271 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_272 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_273 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_274 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_275 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_276 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_277 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_278 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_279 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_280 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_281 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_282 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_283 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_284 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_285 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_286 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_287 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_288 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_289 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_290 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_291 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_292 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_293 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_294 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_295 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_296 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_297 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_298 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_299 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_300 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_301 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_302 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_303 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_304 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_305 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_306 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_307 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_308 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_309 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_310 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_311 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_312 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_313 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_314 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_315 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_316 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_317 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_318 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_319 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_320 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_321 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_322 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_323 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_324 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_325 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_326 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_327 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_328 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_329 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_330 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_331 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_332 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_333 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_334 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_335 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_336 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_337 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_338 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_339 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_340 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_341 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_342 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_343 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_344 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_345 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_346 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_347 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_348 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_349 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_350 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_351 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_352 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_353 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_354 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_355 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_356 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_357 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_358 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_359 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_360 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_361 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_362 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_363 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_364 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_365 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_366 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_367 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_368 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_369 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_370 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_371 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_372 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_373 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_374 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_375 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_376 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_377 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_378 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_379 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_380 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_381 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_382 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_383 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_384 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_385 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_386 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_387 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_388 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_389 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_390 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_391 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_392 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_393 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_394 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_395 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_396 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_397 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_398 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_399 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_400 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_401 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_402 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_403 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_404 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_405 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_406 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_407 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_408 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_409 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_410 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_411 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_412 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_413 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_414 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_415 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_416 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_417 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_418 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_419 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_420 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_421 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_422 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_423 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_424 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_425 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_426 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_427 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_428 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_429 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_430 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_431 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_432 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_433 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_434 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_435 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_436 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_437 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_438 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_439 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_440 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_441 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_442 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_443 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_444 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_445 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_446 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_447 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_448 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_449 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_450 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_451 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_452 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_453 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_454 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_455 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_456 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_457 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_458 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_459 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_460 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_461 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_462 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_463 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_464 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_465 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_466 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_467 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_468 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_469 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_470 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_471 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_472 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_473 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_474 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_475 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_476 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_477 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_478 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_479 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_480 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_481 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_482 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_483 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_484 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_485 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_486 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_487 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_488 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_489 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_490 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_491 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_492 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_493 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_494 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_495 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_496 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_497 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_498 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_499 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_500 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_501 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_502 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_503 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_504 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_505 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_506 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_507 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_508 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_509 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_510 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_511 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_512 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_513 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_514 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_515 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_516 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_517 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_518 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_519 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_520 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_521 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_522 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_523 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_524 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_525 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_526 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_527 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_528 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_529 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_530 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_531 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_532 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_533 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_534 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_535 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_536 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_537 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_538 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_539 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_540 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_541 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_542 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_543 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_544 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_545 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_546 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_547 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_548 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_549 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_550 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_551 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_552 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_553 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_554 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_555 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_556 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_557 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_558 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_559 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_560 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_561 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_562 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_563 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_564 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_565 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_566 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_567 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_568 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_569 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_570 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_571 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_572 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_573 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_574 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_575 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_576 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_577 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_578 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_579 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_580 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_581 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_582 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_583 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_584 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_585 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_586 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_587 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_588 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_589 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_590 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_591 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_592 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_593 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_594 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_595 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_596 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_597 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_598 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_599 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_600 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_601 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_602 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_603 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_604 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_605 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_606 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_607 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_608 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_609 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_610 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_611 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_612 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_613 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_614 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_615 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_616 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_617 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_618 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_619 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_620 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_621 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_622 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_623 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_624 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_625 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_626 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_627 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_628 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_629 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_630 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_631 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_632 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_633 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_634 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_635 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_636 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_637 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_638 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_639 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_640 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_641 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_642 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_643 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_644 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_645 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_646 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_647 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_648 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_649 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_650 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_651 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_652 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_653 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_654 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_655 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_656 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_657 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_658 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_659 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_660 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_661 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_662 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_663 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_664 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_665 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_666 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_667 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_668 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_669 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_670 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_671 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_672 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_673 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_674 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_675 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_676 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_677 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_678 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_679 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_680 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_681 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_682 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_683 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_684 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_685 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_686 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_687 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_688 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_689 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_690 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_691 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_692 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_693 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_694 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_695 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_696 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_697 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_698 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_699 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_700 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_701 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_702 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_703 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_704 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_705 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_706 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_707 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_708 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_709 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_710 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_711 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_712 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_713 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_714 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_715 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_716 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_717 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_718 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_719 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_720 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_721 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_722 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_723 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_724 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_725 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_726 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_727 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_728 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_729 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_730 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_731 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_732 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_733 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_734 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_735 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_736 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_737 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_738 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_739 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_740 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_741 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_742 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_743 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_744 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_745 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_746 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_747 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_748 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_749 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_750 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_751 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_752 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_753 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_754 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_755 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_756 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_757 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_758 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_759 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_760 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_761 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_762 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_763 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_764 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_765 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_766 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_767 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_768 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_769 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_770 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_771 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_772 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_773 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_774 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_775 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_776 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_777 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_778 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_779 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_780 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_781 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_782 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_783 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_784 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_785 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_786 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_787 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_788 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_789 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_790 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_791 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_792 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_793 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_794 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_795 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_796 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_797 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_798 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_799 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_800 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_801 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_802 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_803 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_804 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_805 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_806 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_807 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_808 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_809 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_810 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_811 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_812 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_813 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_814 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_815 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_816 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_817 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_818 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_819 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_820 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_821 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_822 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_823 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_824 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_825 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_826 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_827 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_828 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_829 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_830 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_831 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_832 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_833 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_834 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_835 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_836 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_837 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_838 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_839 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_840 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_841 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_842 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_843 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_844 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_845 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_846 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_847 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_848 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_849 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_850 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_851 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_852 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_853 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_854 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_855 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_856 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_857 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_858 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_859 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_860 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_861 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_862 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_863 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_864 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_865 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_866 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_867 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_868 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_869 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_870 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_871 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_872 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_873 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_874 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_875 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_876 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_877 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_878 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_879 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_880 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_881 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_882 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_883 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_884 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_885 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_886 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_887 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_888 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_889 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_890 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_891 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_892 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_893 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_894 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_895 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_896 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_897 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_898 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_899 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_900 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_901 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_902 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_903 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_904 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_905 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_906 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_907 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_908 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_909 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_910 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_911 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_912 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_913 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_914 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_915 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_916 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_917 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_918 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_919 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_920 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_921 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_922 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_923 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_924 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_925 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_926 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_927 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_928 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_929 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_930 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_931 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_932 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_933 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_934 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_935 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_936 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_937 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_938 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_939 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_940 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_941 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_942 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_943 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_944 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_945 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_946 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_947 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_948 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_949 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_950 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_951 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_952 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_953 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_954 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_955 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_956 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_957 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_958 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_959 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_960 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_961 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_962 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_963 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_964 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_965 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_966 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_967 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_968 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_969 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_970 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_971 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_972 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_973 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_974 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_975 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_976 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_977 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_978 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_979 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_980 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_981 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_982 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_983 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_984 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_985 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_986 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_987 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_988 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_989 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_990 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_991 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_992 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_993 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_994 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_995 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_996 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_997 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_998 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_999 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1000 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1001 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1002 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1003 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1004 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1005 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1006 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1007 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1008 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1009 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1010 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1011 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1012 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1013 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1014 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1015 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1016 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1017 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1018 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1019 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1020 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1021 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1022 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1023 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1024 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1025 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1026 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1027 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1028 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1029 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1030 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1031 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1032 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1033 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1034 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1035 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1036 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1037 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1038 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1039 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1040 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1041 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1042 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1043 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1044 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1045 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1046 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1047 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1048 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1049 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1050 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1051 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1052 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1053 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1054 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1055 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1056 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1057 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1058 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1059 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1060 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1061 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1062 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1063 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1064 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1065 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1066 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1067 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1068 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1069 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1070 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1071 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1072 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1073 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1074 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1075 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1076 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1077 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1078 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1079 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1080 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1081 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1082 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1083 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1084 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1085 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1086 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1087 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1088 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1089 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1090 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1091 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1092 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1093 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1094 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1095 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1096 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1097 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1098 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1099 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1100 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1101 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1102 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1103 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1104 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1105 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1106 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1107 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1108 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1109 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1110 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1111 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1112 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1113 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1114 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1115 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1116 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1117 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1118 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1119 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1120 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1121 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1122 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1123 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1124 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1125 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1126 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1127 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1128 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1129 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1130 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1131 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1132 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1133 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1134 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1135 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1136 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1137 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1138 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1139 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1140 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1141 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1142 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1143 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1144 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1145 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1146 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1147 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1148 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1149 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1150 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1151 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1152 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1153 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1154 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1155 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1156 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1157 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1158 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1159 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1160 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1161 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1162 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1163 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1164 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1165 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1166 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1167 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1168 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1169 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1170 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1171 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1172 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1173 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1174 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1175 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1176 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1177 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1178 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1179 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1180 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1181 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1182 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1183 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1184 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1185 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1186 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1187 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1188 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1189 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1190 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1191 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1192 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1193 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1194 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1195 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1196 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1197 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1198 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1199 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1200 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1201 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1202 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1203 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1204 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1205 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1206 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1207 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1208 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1209 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1210 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1211 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1212 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1213 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1214 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1215 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1216 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1217 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1218 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1219 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1220 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1221 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1222 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1223 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1224 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1225 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1226 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1227 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1228 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1229 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1230 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1231 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1232 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1233 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1234 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1235 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1236 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1237 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1238 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1239 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1240 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1241 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1242 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1243 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1244 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1245 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1246 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1247 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1248 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1249 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1250 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1251 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1252 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1253 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1254 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1255 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1256 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1257 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1258 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1259 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1260 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1261 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1262 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1263 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1264 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1265 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1266 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1267 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1268 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1269 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1270 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1271 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1272 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1273 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1274 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1275 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1276 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1277 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1278 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1279 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1280 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1281 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1282 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1283 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1284 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1285 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1286 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1287 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1288 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1289 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1290 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1291 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1292 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1293 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1294 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1295 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1296 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1297 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1298 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1299 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1300 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1301 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1302 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1303 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1304 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1305 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1306 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1307 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1308 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1309 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1310 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1311 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1312 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1313 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1314 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1315 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1316 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1317 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1318 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1319 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1320 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1321 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1322 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1323 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1324 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1325 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1326 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1327 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1328 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1329 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1330 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1331 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1332 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1333 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1334 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1335 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1336 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1337 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1338 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1339 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1340 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1341 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1342 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1343 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1344 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1345 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1346 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1347 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1348 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1349 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1350 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1351 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1352 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1353 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1354 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1355 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1356 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1357 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1358 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1359 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1360 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1361 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1362 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1363 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1364 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1365 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1366 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1367 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1368 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1369 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1370 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1371 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1372 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1373 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1374 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1375 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1376 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1377 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1378 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1379 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1380 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1381 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1382 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1383 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1384 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1385 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1386 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1387 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1388 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1389 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1390 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1391 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1392 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1393 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1394 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1395 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1396 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1397 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1398 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1399 - ASSET_TEXTURES_3D +.word ASSET_TEX3D_1400 - ASSET_TEXTURES_3D +.word ASSET_TEXTURES_3D_END - ASSET_TEXTURES_3D .word 0xFFFFFFFF -glabel ASSET_SECTION_3_END + +/********** ASSET_TEXTURES_2D **********/ .balign 16 -glabel ASSET_SECTION_4 -glabel ASSET_4_0 -.incbin "./build/us_1.0/textures/2d/unknown_4_0.bin" -glabel ASSET_4_1 -.incbin "./build/us_1.0/textures/2d/unknown_4_1.bin" -glabel ASSET_4_2 -.incbin "./build/us_1.0/textures/2d/unknown_4_2.bin" -glabel ASSET_4_3 +glabel ASSET_TEXTURES_2D +glabel ASSET_TEX2D_SMALLFONT_0 +.incbin "./build/us_1.0/textures/2d/smallfont_0.bin" +glabel ASSET_TEX2D_SMALLFONT_1 +.incbin "./build/us_1.0/textures/2d/smallfont_1.bin" +glabel ASSET_TEX2D_SMALLFONT_2 +.incbin "./build/us_1.0/textures/2d/smallfont_2.bin" +glabel ASSET_TEX2D_3 .incbin "./build/us_1.0/textures/2d/unknown_4_3.bin" -glabel ASSET_4_4 +glabel ASSET_TEX2D_4 .incbin "./build/us_1.0/textures/2d/unknown_4_4.bin" -glabel ASSET_4_5 +glabel ASSET_TEX2D_5 .incbin "./build/us_1.0/textures/2d/unknown_4_5.bin" -glabel ASSET_4_6 +glabel ASSET_TEX2D_6 .incbin "./build/us_1.0/textures/2d/unknown_4_6.bin" -glabel ASSET_4_7 +glabel ASSET_TEX2D_7 .incbin "./build/us_1.0/textures/2d/unknown_4_7.bin" -glabel ASSET_4_8 +glabel ASSET_TEX2D_8 .incbin "./build/us_1.0/textures/2d/unknown_4_8.bin" -glabel ASSET_4_9 +glabel ASSET_TEX2D_9 .incbin "./build/us_1.0/textures/2d/unknown_4_9.bin" -glabel ASSET_4_10 +glabel ASSET_TEX2D_10 .incbin "./build/us_1.0/textures/2d/unknown_4_10.bin" -glabel ASSET_4_11 +glabel ASSET_TEX2D_11 .incbin "./build/us_1.0/textures/2d/unknown_4_11.bin" -glabel ASSET_4_12 +glabel ASSET_TEX2D_12 .incbin "./build/us_1.0/textures/2d/unknown_4_12.bin" -glabel ASSET_4_13 +glabel ASSET_TEX2D_13 .incbin "./build/us_1.0/textures/2d/unknown_4_13.bin" -glabel ASSET_4_14 +glabel ASSET_TEX2D_14 .incbin "./build/us_1.0/textures/2d/unknown_4_14.bin" -glabel ASSET_4_15 +glabel ASSET_TEX2D_15 .incbin "./build/us_1.0/textures/2d/unknown_4_15.bin" -glabel ASSET_4_16 +glabel ASSET_TEX2D_16 .incbin "./build/us_1.0/textures/2d/unknown_4_16.bin" -glabel ASSET_4_17 +glabel ASSET_TEX2D_17 .incbin "./build/us_1.0/textures/2d/unknown_4_17.bin" -glabel ASSET_4_18 +glabel ASSET_TEX2D_18 .incbin "./build/us_1.0/textures/2d/unknown_4_18.bin" -glabel ASSET_4_19 +glabel ASSET_TEX2D_19 .incbin "./build/us_1.0/textures/2d/unknown_4_19.bin" -glabel ASSET_4_20 +glabel ASSET_TEX2D_20 .incbin "./build/us_1.0/textures/2d/unknown_4_20.bin" -glabel ASSET_4_21 +glabel ASSET_TEX2D_21 .incbin "./build/us_1.0/textures/2d/unknown_4_21.bin" -glabel ASSET_4_22 +glabel ASSET_TEX2D_22 .incbin "./build/us_1.0/textures/2d/unknown_4_22.bin" -glabel ASSET_4_23 +glabel ASSET_TEX2D_23 .incbin "./build/us_1.0/textures/2d/unknown_4_23.bin" -glabel ASSET_4_24 +glabel ASSET_TEX2D_24 .incbin "./build/us_1.0/textures/2d/unknown_4_24.bin" -glabel ASSET_4_25 +glabel ASSET_TEX2D_25 .incbin "./build/us_1.0/textures/2d/unknown_4_25.bin" -glabel ASSET_4_26 +glabel ASSET_TEX2D_26 .incbin "./build/us_1.0/textures/2d/unknown_4_26.bin" -glabel ASSET_4_27 +glabel ASSET_TEX2D_27 .incbin "./build/us_1.0/textures/2d/unknown_4_27.bin" -glabel ASSET_4_28 +glabel ASSET_TEX2D_28 .incbin "./build/us_1.0/textures/2d/unknown_4_28.bin" -glabel ASSET_4_29 +glabel ASSET_TEX2D_29 .incbin "./build/us_1.0/textures/2d/unknown_4_29.bin" -glabel ASSET_4_30 +glabel ASSET_TEX2D_30 .incbin "./build/us_1.0/textures/2d/unknown_4_30.bin" -glabel ASSET_4_31 +glabel ASSET_TEX2D_31 .incbin "./build/us_1.0/textures/2d/unknown_4_31.bin" -glabel ASSET_4_32 +glabel ASSET_TEX2D_32 .incbin "./build/us_1.0/textures/2d/unknown_4_32.bin" -glabel ASSET_4_33 +glabel ASSET_TEX2D_33 .incbin "./build/us_1.0/textures/2d/unknown_4_33.bin" -glabel ASSET_4_34 +glabel ASSET_TEX2D_34 .incbin "./build/us_1.0/textures/2d/unknown_4_34.bin" -glabel ASSET_4_35 +glabel ASSET_TEX2D_35 .incbin "./build/us_1.0/textures/2d/unknown_4_35.bin" -glabel ASSET_4_36 +glabel ASSET_TEX2D_36 .incbin "./build/us_1.0/textures/2d/unknown_4_36.bin" -glabel ASSET_4_37 +glabel ASSET_TEX2D_37 .incbin "./build/us_1.0/textures/2d/unknown_4_37.bin" -glabel ASSET_4_38 +glabel ASSET_TEX2D_38 .incbin "./build/us_1.0/textures/2d/unknown_4_38.bin" -glabel ASSET_4_39 +glabel ASSET_TEX2D_39 .incbin "./build/us_1.0/textures/2d/unknown_4_39.bin" -glabel ASSET_4_40 +glabel ASSET_TEX2D_40 .incbin "./build/us_1.0/textures/2d/unknown_4_40.bin" -glabel ASSET_4_41 +glabel ASSET_TEX2D_41 .incbin "./build/us_1.0/textures/2d/unknown_4_41.bin" -glabel ASSET_4_42 +glabel ASSET_TEX2D_42 .incbin "./build/us_1.0/textures/2d/unknown_4_42.bin" -glabel ASSET_4_43 +glabel ASSET_TEX2D_43 .incbin "./build/us_1.0/textures/2d/unknown_4_43.bin" -glabel ASSET_4_44 +glabel ASSET_TEX2D_44 .incbin "./build/us_1.0/textures/2d/unknown_4_44.bin" -glabel ASSET_4_45 +glabel ASSET_TEX2D_45 .incbin "./build/us_1.0/textures/2d/unknown_4_45.bin" -glabel ASSET_4_46 +glabel ASSET_TEX2D_46 .incbin "./build/us_1.0/textures/2d/unknown_4_46.bin" -glabel ASSET_4_47 +glabel ASSET_TEX2D_47 .incbin "./build/us_1.0/textures/2d/unknown_4_47.bin" -glabel ASSET_4_48 +glabel ASSET_TEX2D_48 .incbin "./build/us_1.0/textures/2d/unknown_4_48.bin" -glabel ASSET_4_49 +glabel ASSET_TEX2D_49 .incbin "./build/us_1.0/textures/2d/unknown_4_49.bin" -glabel ASSET_4_50 +glabel ASSET_TEX2D_50 .incbin "./build/us_1.0/textures/2d/unknown_4_50.bin" -glabel ASSET_4_51 +glabel ASSET_TEX2D_51 .incbin "./build/us_1.0/textures/2d/unknown_4_51.bin" -glabel ASSET_4_52 +glabel ASSET_TEX2D_52 .incbin "./build/us_1.0/textures/2d/unknown_4_52.bin" -glabel ASSET_4_53 +glabel ASSET_TEX2D_53 .incbin "./build/us_1.0/textures/2d/unknown_4_53.bin" -glabel ASSET_4_54 +glabel ASSET_TEX2D_54 .incbin "./build/us_1.0/textures/2d/unknown_4_54.bin" -glabel ASSET_4_55 +glabel ASSET_TEX2D_55 .incbin "./build/us_1.0/textures/2d/unknown_4_55.bin" -glabel ASSET_4_56 +glabel ASSET_TEX2D_56 .incbin "./build/us_1.0/textures/2d/unknown_4_56.bin" -glabel ASSET_4_57 +glabel ASSET_TEX2D_57 .incbin "./build/us_1.0/textures/2d/unknown_4_57.bin" -glabel ASSET_4_58 +glabel ASSET_TEX2D_58 .incbin "./build/us_1.0/textures/2d/unknown_4_58.bin" -glabel ASSET_4_59 +glabel ASSET_TEX2D_59 .incbin "./build/us_1.0/textures/2d/unknown_4_59.bin" -glabel ASSET_4_60 +glabel ASSET_TEX2D_60 .incbin "./build/us_1.0/textures/2d/unknown_4_60.bin" -glabel ASSET_4_61 +glabel ASSET_TEX2D_61 .incbin "./build/us_1.0/textures/2d/unknown_4_61.bin" -glabel ASSET_4_62 +glabel ASSET_TEX2D_62 .incbin "./build/us_1.0/textures/2d/unknown_4_62.bin" -glabel ASSET_4_63 +glabel ASSET_TEX2D_63 .incbin "./build/us_1.0/textures/2d/unknown_4_63.bin" -glabel ASSET_4_64 +glabel ASSET_TEX2D_64 .incbin "./build/us_1.0/textures/2d/unknown_4_64.bin" -glabel ASSET_4_65 +glabel ASSET_TEX2D_65 .incbin "./build/us_1.0/textures/2d/unknown_4_65.bin" -glabel ASSET_4_66 +glabel ASSET_TEX2D_66 .incbin "./build/us_1.0/textures/2d/unknown_4_66.bin" -glabel ASSET_4_67 +glabel ASSET_TEX2D_67 .incbin "./build/us_1.0/textures/2d/unknown_4_67.bin" -glabel ASSET_4_68 +glabel ASSET_TEX2D_68 .incbin "./build/us_1.0/textures/2d/unknown_4_68.bin" -glabel ASSET_4_69 +glabel ASSET_TEX2D_69 .incbin "./build/us_1.0/textures/2d/unknown_4_69.bin" -glabel ASSET_4_70 +glabel ASSET_TEX2D_70 .incbin "./build/us_1.0/textures/2d/unknown_4_70.bin" -glabel ASSET_4_71 +glabel ASSET_TEX2D_71 .incbin "./build/us_1.0/textures/2d/unknown_4_71.bin" -glabel ASSET_4_72 +glabel ASSET_TEX2D_72 .incbin "./build/us_1.0/textures/2d/unknown_4_72.bin" -glabel ASSET_4_73 +glabel ASSET_TEX2D_73 .incbin "./build/us_1.0/textures/2d/unknown_4_73.bin" -glabel ASSET_4_74 +glabel ASSET_TEX2D_74 .incbin "./build/us_1.0/textures/2d/unknown_4_74.bin" -glabel ASSET_4_75 +glabel ASSET_TEX2D_75 .incbin "./build/us_1.0/textures/2d/unknown_4_75.bin" -glabel ASSET_4_76 +glabel ASSET_TEX2D_76 .incbin "./build/us_1.0/textures/2d/unknown_4_76.bin" -glabel ASSET_4_77 +glabel ASSET_TEX2D_77 .incbin "./build/us_1.0/textures/2d/unknown_4_77.bin" -glabel ASSET_4_78 +glabel ASSET_TEX2D_78 .incbin "./build/us_1.0/textures/2d/unknown_4_78.bin" -glabel ASSET_4_79 +glabel ASSET_TEX2D_79 .incbin "./build/us_1.0/textures/2d/unknown_4_79.bin" -glabel ASSET_4_80 +glabel ASSET_TEX2D_80 .incbin "./build/us_1.0/textures/2d/unknown_4_80.bin" -glabel ASSET_4_81 +glabel ASSET_TEX2D_81 .incbin "./build/us_1.0/textures/2d/unknown_4_81.bin" -glabel ASSET_4_82 +glabel ASSET_TEX2D_82 .incbin "./build/us_1.0/textures/2d/unknown_4_82.bin" -glabel ASSET_4_83 +glabel ASSET_TEX2D_83 .incbin "./build/us_1.0/textures/2d/unknown_4_83.bin" -glabel ASSET_4_84 +glabel ASSET_TEX2D_84 .incbin "./build/us_1.0/textures/2d/unknown_4_84.bin" -glabel ASSET_4_85 +glabel ASSET_TEX2D_85 .incbin "./build/us_1.0/textures/2d/unknown_4_85.bin" -glabel ASSET_4_86 +glabel ASSET_TEX2D_86 .incbin "./build/us_1.0/textures/2d/unknown_4_86.bin" -glabel ASSET_4_87 +glabel ASSET_TEX2D_87 .incbin "./build/us_1.0/textures/2d/unknown_4_87.bin" -glabel ASSET_4_88 +glabel ASSET_TEX2D_88 .incbin "./build/us_1.0/textures/2d/unknown_4_88.bin" -glabel ASSET_4_89 -.incbin "./build/us_1.0/textures/2d/unknown_4_89.bin" -glabel ASSET_4_90 -.incbin "./build/us_1.0/textures/2d/unknown_4_90.bin" -glabel ASSET_4_91 -.incbin "./build/us_1.0/textures/2d/unknown_4_91.bin" -glabel ASSET_4_92 -.incbin "./build/us_1.0/textures/2d/unknown_4_92.bin" -glabel ASSET_4_93 -.incbin "./build/us_1.0/textures/2d/unknown_4_93.bin" -glabel ASSET_4_94 -.incbin "./build/us_1.0/textures/2d/unknown_4_94.bin" -glabel ASSET_4_95 +glabel ASSET_TEX2D_FUNFONT_0 +.incbin "./build/us_1.0/textures/2d/funfont_0.bin" +glabel ASSET_TEX2D_FUNFONT_1 +.incbin "./build/us_1.0/textures/2d/funfont_1.bin" +glabel ASSET_TEX2D_FUNFONT_2 +.incbin "./build/us_1.0/textures/2d/funfont_2.bin" +glabel ASSET_TEX2D_FUNFONT_3 +.incbin "./build/us_1.0/textures/2d/funfont_3.bin" +glabel ASSET_TEX2D_FUNFONT_4 +.incbin "./build/us_1.0/textures/2d/funfont_4.bin" +glabel ASSET_TEX2D_FUNFONT_5 +.incbin "./build/us_1.0/textures/2d/funfont_5.bin" +glabel ASSET_TEX2D_95 .incbin "./build/us_1.0/textures/2d/unknown_4_95.bin" -glabel ASSET_4_96 +glabel ASSET_TEX2D_96 .incbin "./build/us_1.0/textures/2d/unknown_4_96.bin" -glabel ASSET_4_97 +glabel ASSET_TEX2D_97 .incbin "./build/us_1.0/textures/2d/unknown_4_97.bin" -glabel ASSET_4_98 +glabel ASSET_TEX2D_98 .incbin "./build/us_1.0/textures/2d/unknown_4_98.bin" -glabel ASSET_4_99 +glabel ASSET_TEX2D_99 .incbin "./build/us_1.0/textures/2d/unknown_4_99.bin" -glabel ASSET_4_100 +glabel ASSET_TEX2D_100 .incbin "./build/us_1.0/textures/2d/unknown_4_100.bin" -glabel ASSET_4_101 +glabel ASSET_TEX2D_101 .incbin "./build/us_1.0/textures/2d/unknown_4_101.bin" -glabel ASSET_4_102 +glabel ASSET_TEX2D_102 .incbin "./build/us_1.0/textures/2d/unknown_4_102.bin" -glabel ASSET_4_103 +glabel ASSET_TEX2D_103 .incbin "./build/us_1.0/textures/2d/unknown_4_103.bin" -glabel ASSET_4_104 +glabel ASSET_TEX2D_104 .incbin "./build/us_1.0/textures/2d/unknown_4_104.bin" -glabel ASSET_4_105 +glabel ASSET_TEX2D_105 .incbin "./build/us_1.0/textures/2d/unknown_4_105.bin" -glabel ASSET_4_106 +glabel ASSET_TEX2D_106 .incbin "./build/us_1.0/textures/2d/unknown_4_106.bin" -glabel ASSET_4_107 +glabel ASSET_TEX2D_107 .incbin "./build/us_1.0/textures/2d/unknown_4_107.bin" -glabel ASSET_4_108 +glabel ASSET_TEX2D_108 .incbin "./build/us_1.0/textures/2d/unknown_4_108.bin" -glabel ASSET_4_109 +glabel ASSET_TEX2D_109 .incbin "./build/us_1.0/textures/2d/unknown_4_109.bin" -glabel ASSET_4_110 +glabel ASSET_TEX2D_110 .incbin "./build/us_1.0/textures/2d/unknown_4_110.bin" -glabel ASSET_4_111 +glabel ASSET_TEX2D_111 .incbin "./build/us_1.0/textures/2d/unknown_4_111.bin" -glabel ASSET_4_112 +glabel ASSET_TEX2D_112 .incbin "./build/us_1.0/textures/2d/unknown_4_112.bin" -glabel ASSET_4_113 +glabel ASSET_TEX2D_113 .incbin "./build/us_1.0/textures/2d/unknown_4_113.bin" -glabel ASSET_4_114 +glabel ASSET_TEX2D_114 .incbin "./build/us_1.0/textures/2d/unknown_4_114.bin" -glabel ASSET_4_115 +glabel ASSET_TEX2D_115 .incbin "./build/us_1.0/textures/2d/unknown_4_115.bin" -glabel ASSET_4_116 +glabel ASSET_TEX2D_116 .incbin "./build/us_1.0/textures/2d/unknown_4_116.bin" -glabel ASSET_4_117 +glabel ASSET_TEX2D_117 .incbin "./build/us_1.0/textures/2d/unknown_4_117.bin" -glabel ASSET_4_118 +glabel ASSET_TEX2D_118 .incbin "./build/us_1.0/textures/2d/unknown_4_118.bin" -glabel ASSET_4_119 +glabel ASSET_TEX2D_119 .incbin "./build/us_1.0/textures/2d/unknown_4_119.bin" -glabel ASSET_4_120 +glabel ASSET_TEX2D_120 .incbin "./build/us_1.0/textures/2d/unknown_4_120.bin" -glabel ASSET_4_121 +glabel ASSET_TEX2D_121 .incbin "./build/us_1.0/textures/2d/unknown_4_121.bin" -glabel ASSET_4_122 +glabel ASSET_TEX2D_122 .incbin "./build/us_1.0/textures/2d/unknown_4_122.bin" -glabel ASSET_4_123 +glabel ASSET_TEX2D_123 .incbin "./build/us_1.0/textures/2d/unknown_4_123.bin" -glabel ASSET_4_124 +glabel ASSET_TEX2D_124 .incbin "./build/us_1.0/textures/2d/unknown_4_124.bin" -glabel ASSET_4_125 +glabel ASSET_TEX2D_125 .incbin "./build/us_1.0/textures/2d/unknown_4_125.bin" -glabel ASSET_4_126 +glabel ASSET_TEX2D_126 .incbin "./build/us_1.0/textures/2d/unknown_4_126.bin" -glabel ASSET_4_127 +glabel ASSET_TEX2D_127 .incbin "./build/us_1.0/textures/2d/unknown_4_127.bin" -glabel ASSET_4_128 +glabel ASSET_TEX2D_128 .incbin "./build/us_1.0/textures/2d/unknown_4_128.bin" -glabel ASSET_4_129 +glabel ASSET_TEX2D_129 .incbin "./build/us_1.0/textures/2d/unknown_4_129.bin" -glabel ASSET_4_130 +glabel ASSET_TEX2D_130 .incbin "./build/us_1.0/textures/2d/unknown_4_130.bin" -glabel ASSET_4_131 +glabel ASSET_TEX2D_131 .incbin "./build/us_1.0/textures/2d/unknown_4_131.bin" -glabel ASSET_4_132 +glabel ASSET_TEX2D_132 .incbin "./build/us_1.0/textures/2d/unknown_4_132.bin" -glabel ASSET_4_133 +glabel ASSET_TEX2D_133 .incbin "./build/us_1.0/textures/2d/unknown_4_133.bin" -glabel ASSET_4_134 +glabel ASSET_TEX2D_134 .incbin "./build/us_1.0/textures/2d/unknown_4_134.bin" -glabel ASSET_4_135 +glabel ASSET_TEX2D_135 .incbin "./build/us_1.0/textures/2d/unknown_4_135.bin" -glabel ASSET_4_136 +glabel ASSET_TEX2D_136 .incbin "./build/us_1.0/textures/2d/unknown_4_136.bin" -glabel ASSET_4_137 +glabel ASSET_TEX2D_137 .incbin "./build/us_1.0/textures/2d/unknown_4_137.bin" -glabel ASSET_4_138 +glabel ASSET_TEX2D_138 .incbin "./build/us_1.0/textures/2d/unknown_4_138.bin" -glabel ASSET_4_139 +glabel ASSET_TEX2D_139 .incbin "./build/us_1.0/textures/2d/unknown_4_139.bin" -glabel ASSET_4_140 +glabel ASSET_TEX2D_140 .incbin "./build/us_1.0/textures/2d/unknown_4_140.bin" -glabel ASSET_4_141 +glabel ASSET_TEX2D_141 .incbin "./build/us_1.0/textures/2d/unknown_4_141.bin" -glabel ASSET_4_142 +glabel ASSET_TEX2D_142 .incbin "./build/us_1.0/textures/2d/unknown_4_142.bin" -glabel ASSET_4_143 +glabel ASSET_TEX2D_143 .incbin "./build/us_1.0/textures/2d/unknown_4_143.bin" -glabel ASSET_4_144 +glabel ASSET_TEX2D_144 .incbin "./build/us_1.0/textures/2d/unknown_4_144.bin" -glabel ASSET_4_145 +glabel ASSET_TEX2D_145 .incbin "./build/us_1.0/textures/2d/unknown_4_145.bin" -glabel ASSET_4_146 +glabel ASSET_TEX2D_146 .incbin "./build/us_1.0/textures/2d/unknown_4_146.bin" -glabel ASSET_4_147 +glabel ASSET_TEX2D_147 .incbin "./build/us_1.0/textures/2d/unknown_4_147.bin" -glabel ASSET_4_148 +glabel ASSET_TEX2D_148 .incbin "./build/us_1.0/textures/2d/unknown_4_148.bin" -glabel ASSET_4_149 +glabel ASSET_TEX2D_149 .incbin "./build/us_1.0/textures/2d/unknown_4_149.bin" -glabel ASSET_4_150 +glabel ASSET_TEX2D_150 .incbin "./build/us_1.0/textures/2d/unknown_4_150.bin" -glabel ASSET_4_151 +glabel ASSET_TEX2D_151 .incbin "./build/us_1.0/textures/2d/unknown_4_151.bin" -glabel ASSET_4_152 +glabel ASSET_TEX2D_152 .incbin "./build/us_1.0/textures/2d/unknown_4_152.bin" -glabel ASSET_4_153 +glabel ASSET_TEX2D_153 .incbin "./build/us_1.0/textures/2d/unknown_4_153.bin" -glabel ASSET_4_154 +glabel ASSET_TEX2D_154 .incbin "./build/us_1.0/textures/2d/unknown_4_154.bin" -glabel ASSET_4_155 +glabel ASSET_TEX2D_155 .incbin "./build/us_1.0/textures/2d/unknown_4_155.bin" -glabel ASSET_4_156 +glabel ASSET_TEX2D_156 .incbin "./build/us_1.0/textures/2d/unknown_4_156.bin" -glabel ASSET_4_157 +glabel ASSET_TEX2D_157 .incbin "./build/us_1.0/textures/2d/unknown_4_157.bin" -glabel ASSET_4_158 +glabel ASSET_TEX2D_158 .incbin "./build/us_1.0/textures/2d/unknown_4_158.bin" -glabel ASSET_4_159 -.incbin "./build/us_1.0/textures/2d/unknown_4_159.bin" -glabel ASSET_4_160 -.incbin "./build/us_1.0/textures/2d/unknown_4_160.bin" -glabel ASSET_4_161 -.incbin "./build/us_1.0/textures/2d/unknown_4_161.bin" -glabel ASSET_4_162 -.incbin "./build/us_1.0/textures/2d/unknown_4_162.bin" -glabel ASSET_4_163 -.incbin "./build/us_1.0/textures/2d/unknown_4_163.bin" -glabel ASSET_4_164 -.incbin "./build/us_1.0/textures/2d/unknown_4_164.bin" -glabel ASSET_4_165 -.incbin "./build/us_1.0/textures/2d/unknown_4_165.bin" -glabel ASSET_4_166 -.incbin "./build/us_1.0/textures/2d/unknown_4_166.bin" -glabel ASSET_4_167 -.incbin "./build/us_1.0/textures/2d/unknown_4_167.bin" -glabel ASSET_4_168 -.incbin "./build/us_1.0/textures/2d/unknown_4_168.bin" -glabel ASSET_4_169 -.incbin "./build/us_1.0/textures/2d/unknown_4_169.bin" -glabel ASSET_4_170 -.incbin "./build/us_1.0/textures/2d/unknown_4_170.bin" -glabel ASSET_4_171 -.incbin "./build/us_1.0/textures/2d/unknown_4_171.bin" -glabel ASSET_4_172 -.incbin "./build/us_1.0/textures/2d/unknown_4_172.bin" -glabel ASSET_4_173 -.incbin "./build/us_1.0/textures/2d/unknown_4_173.bin" -glabel ASSET_4_174 -.incbin "./build/us_1.0/textures/2d/unknown_4_174.bin" -glabel ASSET_4_175 -.incbin "./build/us_1.0/textures/2d/unknown_4_175.bin" -glabel ASSET_4_176 -.incbin "./build/us_1.0/textures/2d/unknown_4_176.bin" -glabel ASSET_4_177 -.incbin "./build/us_1.0/textures/2d/unknown_4_177.bin" -glabel ASSET_4_178 -.incbin "./build/us_1.0/textures/2d/unknown_4_178.bin" -glabel ASSET_4_179 -.incbin "./build/us_1.0/textures/2d/unknown_4_179.bin" -glabel ASSET_4_180 -.incbin "./build/us_1.0/textures/2d/unknown_4_180.bin" -glabel ASSET_4_181 -.incbin "./build/us_1.0/textures/2d/unknown_4_181.bin" -glabel ASSET_4_182 -.incbin "./build/us_1.0/textures/2d/unknown_4_182.bin" -glabel ASSET_4_183 -.incbin "./build/us_1.0/textures/2d/unknown_4_183.bin" -glabel ASSET_4_184 -.incbin "./build/us_1.0/textures/2d/unknown_4_184.bin" -glabel ASSET_4_185 -.incbin "./build/us_1.0/textures/2d/unknown_4_185.bin" -glabel ASSET_4_186 -.incbin "./build/us_1.0/textures/2d/unknown_4_186.bin" -glabel ASSET_4_187 -.incbin "./build/us_1.0/textures/2d/unknown_4_187.bin" -glabel ASSET_4_188 -.incbin "./build/us_1.0/textures/2d/unknown_4_188.bin" -glabel ASSET_4_189 -.incbin "./build/us_1.0/textures/2d/unknown_4_189.bin" -glabel ASSET_4_190 +glabel ASSET_TEX2D_SUBTITLEFONT_0 +.incbin "./build/us_1.0/textures/2d/subtitlefont_0.bin" +glabel ASSET_TEX2D_SUBTITLEFONT_1 +.incbin "./build/us_1.0/textures/2d/subtitlefont_1.bin" +glabel ASSET_TEX2D_SUBTITLEFONT_2 +.incbin "./build/us_1.0/textures/2d/subtitlefont_2.bin" +glabel ASSET_TEX2D_BIGFONT_A +.incbin "./build/us_1.0/textures/2d/bigfont_a.bin" +glabel ASSET_TEX2D_BIGFONT_B +.incbin "./build/us_1.0/textures/2d/bigfont_b.bin" +glabel ASSET_TEX2D_BIGFONT_C +.incbin "./build/us_1.0/textures/2d/bigfont_c.bin" +glabel ASSET_TEX2D_BIGFONT_D +.incbin "./build/us_1.0/textures/2d/bigfont_d.bin" +glabel ASSET_TEX2D_BIGFONT_E +.incbin "./build/us_1.0/textures/2d/bigfont_e.bin" +glabel ASSET_TEX2D_BIGFONT_F +.incbin "./build/us_1.0/textures/2d/bigfont_f.bin" +glabel ASSET_TEX2D_BIGFONT_G +.incbin "./build/us_1.0/textures/2d/bigfont_g.bin" +glabel ASSET_TEX2D_BIGFONT_H +.incbin "./build/us_1.0/textures/2d/bigfont_h.bin" +glabel ASSET_TEX2D_BIGFONT_I +.incbin "./build/us_1.0/textures/2d/bigfont_i.bin" +glabel ASSET_TEX2D_BIGFONT_J +.incbin "./build/us_1.0/textures/2d/bigfont_j.bin" +glabel ASSET_TEX2D_BIGFONT_K +.incbin "./build/us_1.0/textures/2d/bigfont_k.bin" +glabel ASSET_TEX2D_BIGFONT_L +.incbin "./build/us_1.0/textures/2d/bigfont_l.bin" +glabel ASSET_TEX2D_BIGFONT_M +.incbin "./build/us_1.0/textures/2d/bigfont_m.bin" +glabel ASSET_TEX2D_BIGFONT_N +.incbin "./build/us_1.0/textures/2d/bigfont_n.bin" +glabel ASSET_TEX2D_BIGFONT_O +.incbin "./build/us_1.0/textures/2d/bigfont_o.bin" +glabel ASSET_TEX2D_BIGFONT_P +.incbin "./build/us_1.0/textures/2d/bigfont_p.bin" +glabel ASSET_TEX2D_BIGFONT_Q +.incbin "./build/us_1.0/textures/2d/bigfont_q.bin" +glabel ASSET_TEX2D_BIGFONT_R +.incbin "./build/us_1.0/textures/2d/bigfont_r.bin" +glabel ASSET_TEX2D_BIGFONT_S +.incbin "./build/us_1.0/textures/2d/bigfont_s.bin" +glabel ASSET_TEX2D_BIGFONT_T +.incbin "./build/us_1.0/textures/2d/bigfont_t.bin" +glabel ASSET_TEX2D_BIGFONT_U +.incbin "./build/us_1.0/textures/2d/bigfont_u.bin" +glabel ASSET_TEX2D_BIGFONT_V +.incbin "./build/us_1.0/textures/2d/bigfont_v.bin" +glabel ASSET_TEX2D_BIGFONT_W +.incbin "./build/us_1.0/textures/2d/bigfont_w.bin" +glabel ASSET_TEX2D_BIGFONT_X +.incbin "./build/us_1.0/textures/2d/bigfont_x.bin" +glabel ASSET_TEX2D_BIGFONT_Y +.incbin "./build/us_1.0/textures/2d/bigfont_y.bin" +glabel ASSET_TEX2D_BIGFONT_Z +.incbin "./build/us_1.0/textures/2d/bigfont_z.bin" +glabel ASSET_TEX2D_BIGFONT_QUESTIONMARK +.incbin "./build/us_1.0/textures/2d/bigfont_questionmark.bin" +glabel ASSET_TEX2D_BIGFONT_PERIOD +.incbin "./build/us_1.0/textures/2d/bigfont_period.bin" +glabel ASSET_TEX2D_190 .incbin "./build/us_1.0/textures/2d/unknown_4_190.bin" -glabel ASSET_4_191 +glabel ASSET_TEX2D_191 .incbin "./build/us_1.0/textures/2d/unknown_4_191.bin" -glabel ASSET_4_192 +glabel ASSET_TEX2D_192 .incbin "./build/us_1.0/textures/2d/unknown_4_192.bin" -glabel ASSET_4_193 +glabel ASSET_TEX2D_193 .incbin "./build/us_1.0/textures/2d/unknown_4_193.bin" -glabel ASSET_4_194 +glabel ASSET_TEX2D_194 .incbin "./build/us_1.0/textures/2d/unknown_4_194.bin" -glabel ASSET_4_195 +glabel ASSET_TEX2D_195 .incbin "./build/us_1.0/textures/2d/unknown_4_195.bin" -glabel ASSET_4_196 +glabel ASSET_TEX2D_196 .incbin "./build/us_1.0/textures/2d/unknown_4_196.bin" -glabel ASSET_4_197 +glabel ASSET_TEX2D_197 .incbin "./build/us_1.0/textures/2d/unknown_4_197.bin" -glabel ASSET_4_198 +glabel ASSET_TEX2D_198 .incbin "./build/us_1.0/textures/2d/unknown_4_198.bin" -glabel ASSET_4_199 +glabel ASSET_TEX2D_199 .incbin "./build/us_1.0/textures/2d/unknown_4_199.bin" -glabel ASSET_4_200 +glabel ASSET_TEX2D_200 .incbin "./build/us_1.0/textures/2d/unknown_4_200.bin" -glabel ASSET_4_201 +glabel ASSET_TEX2D_201 .incbin "./build/us_1.0/textures/2d/unknown_4_201.bin" -glabel ASSET_4_202 +glabel ASSET_TEX2D_202 .incbin "./build/us_1.0/textures/2d/unknown_4_202.bin" -glabel ASSET_4_203 +glabel ASSET_TEX2D_203 .incbin "./build/us_1.0/textures/2d/unknown_4_203.bin" -glabel ASSET_4_204 +glabel ASSET_TEX2D_204 .incbin "./build/us_1.0/textures/2d/unknown_4_204.bin" -glabel ASSET_4_205 +glabel ASSET_TEX2D_205 .incbin "./build/us_1.0/textures/2d/unknown_4_205.bin" -glabel ASSET_4_206 +glabel ASSET_TEX2D_206 .incbin "./build/us_1.0/textures/2d/unknown_4_206.bin" -glabel ASSET_4_207 +glabel ASSET_TEX2D_207 .incbin "./build/us_1.0/textures/2d/unknown_4_207.bin" -glabel ASSET_4_208 +glabel ASSET_TEX2D_208 .incbin "./build/us_1.0/textures/2d/unknown_4_208.bin" -glabel ASSET_4_209 +glabel ASSET_TEX2D_209 .incbin "./build/us_1.0/textures/2d/unknown_4_209.bin" -glabel ASSET_4_210 +glabel ASSET_TEX2D_210 .incbin "./build/us_1.0/textures/2d/unknown_4_210.bin" -glabel ASSET_4_211 +glabel ASSET_TEX2D_211 .incbin "./build/us_1.0/textures/2d/unknown_4_211.bin" -glabel ASSET_4_212 +glabel ASSET_TEX2D_212 .incbin "./build/us_1.0/textures/2d/unknown_4_212.bin" -glabel ASSET_4_213 +glabel ASSET_TEX2D_213 .incbin "./build/us_1.0/textures/2d/unknown_4_213.bin" -glabel ASSET_4_214 +glabel ASSET_TEX2D_214 .incbin "./build/us_1.0/textures/2d/unknown_4_214.bin" -glabel ASSET_4_215 +glabel ASSET_TEX2D_215 .incbin "./build/us_1.0/textures/2d/unknown_4_215.bin" -glabel ASSET_4_216 +glabel ASSET_TEX2D_216 .incbin "./build/us_1.0/textures/2d/unknown_4_216.bin" -glabel ASSET_4_217 +glabel ASSET_TEX2D_217 .incbin "./build/us_1.0/textures/2d/unknown_4_217.bin" -glabel ASSET_4_218 +glabel ASSET_TEX2D_218 .incbin "./build/us_1.0/textures/2d/unknown_4_218.bin" -glabel ASSET_4_219 +glabel ASSET_TEX2D_219 .incbin "./build/us_1.0/textures/2d/unknown_4_219.bin" -glabel ASSET_4_220 +glabel ASSET_TEX2D_220 .incbin "./build/us_1.0/textures/2d/unknown_4_220.bin" -glabel ASSET_4_221 +glabel ASSET_TEX2D_221 .incbin "./build/us_1.0/textures/2d/unknown_4_221.bin" -glabel ASSET_4_222 +glabel ASSET_TEX2D_222 .incbin "./build/us_1.0/textures/2d/unknown_4_222.bin" -glabel ASSET_4_223 +glabel ASSET_TEX2D_223 .incbin "./build/us_1.0/textures/2d/unknown_4_223.bin" -glabel ASSET_4_224 +glabel ASSET_TEX2D_224 .incbin "./build/us_1.0/textures/2d/unknown_4_224.bin" -glabel ASSET_4_225 +glabel ASSET_TEX2D_225 .incbin "./build/us_1.0/textures/2d/unknown_4_225.bin" -glabel ASSET_4_226 +glabel ASSET_TEX2D_226 .incbin "./build/us_1.0/textures/2d/unknown_4_226.bin" -glabel ASSET_4_227 +glabel ASSET_TEX2D_227 .incbin "./build/us_1.0/textures/2d/unknown_4_227.bin" -glabel ASSET_4_228 +glabel ASSET_TEX2D_228 .incbin "./build/us_1.0/textures/2d/unknown_4_228.bin" -glabel ASSET_4_229 +glabel ASSET_TEX2D_229 .incbin "./build/us_1.0/textures/2d/unknown_4_229.bin" -glabel ASSET_4_230 +glabel ASSET_TEX2D_230 .incbin "./build/us_1.0/textures/2d/unknown_4_230.bin" -glabel ASSET_4_231 +glabel ASSET_TEX2D_231 .incbin "./build/us_1.0/textures/2d/unknown_4_231.bin" -glabel ASSET_4_232 +glabel ASSET_TEX2D_232 .incbin "./build/us_1.0/textures/2d/unknown_4_232.bin" -glabel ASSET_4_233 +glabel ASSET_TEX2D_233 .incbin "./build/us_1.0/textures/2d/unknown_4_233.bin" -glabel ASSET_4_234 +glabel ASSET_TEX2D_234 .incbin "./build/us_1.0/textures/2d/unknown_4_234.bin" -glabel ASSET_4_235 +glabel ASSET_TEX2D_235 .incbin "./build/us_1.0/textures/2d/unknown_4_235.bin" -glabel ASSET_4_236 +glabel ASSET_TEX2D_236 .incbin "./build/us_1.0/textures/2d/unknown_4_236.bin" -glabel ASSET_4_237 +glabel ASSET_TEX2D_237 .incbin "./build/us_1.0/textures/2d/unknown_4_237.bin" -glabel ASSET_4_238 +glabel ASSET_TEX2D_238 .incbin "./build/us_1.0/textures/2d/unknown_4_238.bin" -glabel ASSET_4_239 +glabel ASSET_TEX2D_239 .incbin "./build/us_1.0/textures/2d/unknown_4_239.bin" -glabel ASSET_4_240 +glabel ASSET_TEX2D_240 .incbin "./build/us_1.0/textures/2d/unknown_4_240.bin" -glabel ASSET_4_241 +glabel ASSET_TEX2D_241 .incbin "./build/us_1.0/textures/2d/unknown_4_241.bin" -glabel ASSET_4_242 +glabel ASSET_TEX2D_242 .incbin "./build/us_1.0/textures/2d/unknown_4_242.bin" -glabel ASSET_4_243 +glabel ASSET_TEX2D_243 .incbin "./build/us_1.0/textures/2d/unknown_4_243.bin" -glabel ASSET_4_244 +glabel ASSET_TEX2D_244 .incbin "./build/us_1.0/textures/2d/unknown_4_244.bin" -glabel ASSET_4_245 +glabel ASSET_TEX2D_245 .incbin "./build/us_1.0/textures/2d/unknown_4_245.bin" -glabel ASSET_4_246 +glabel ASSET_TEX2D_246 .incbin "./build/us_1.0/textures/2d/unknown_4_246.bin" -glabel ASSET_4_247 +glabel ASSET_TEX2D_247 .incbin "./build/us_1.0/textures/2d/unknown_4_247.bin" -glabel ASSET_4_248 +glabel ASSET_TEX2D_248 .incbin "./build/us_1.0/textures/2d/unknown_4_248.bin" -glabel ASSET_4_249 +glabel ASSET_TEX2D_249 .incbin "./build/us_1.0/textures/2d/unknown_4_249.bin" -glabel ASSET_4_250 +glabel ASSET_TEX2D_250 .incbin "./build/us_1.0/textures/2d/unknown_4_250.bin" -glabel ASSET_4_251 +glabel ASSET_TEX2D_251 .incbin "./build/us_1.0/textures/2d/unknown_4_251.bin" -glabel ASSET_4_252 +glabel ASSET_TEX2D_252 .incbin "./build/us_1.0/textures/2d/unknown_4_252.bin" -glabel ASSET_4_253 +glabel ASSET_TEX2D_253 .incbin "./build/us_1.0/textures/2d/unknown_4_253.bin" -glabel ASSET_4_254 +glabel ASSET_TEX2D_254 .incbin "./build/us_1.0/textures/2d/unknown_4_254.bin" -glabel ASSET_4_255 +glabel ASSET_TEX2D_255 .incbin "./build/us_1.0/textures/2d/unknown_4_255.bin" -glabel ASSET_4_256 +glabel ASSET_TEX2D_256 .incbin "./build/us_1.0/textures/2d/unknown_4_256.bin" -glabel ASSET_4_257 +glabel ASSET_TEX2D_257 .incbin "./build/us_1.0/textures/2d/unknown_4_257.bin" -glabel ASSET_4_258 +glabel ASSET_TEX2D_258 .incbin "./build/us_1.0/textures/2d/unknown_4_258.bin" -glabel ASSET_4_259 +glabel ASSET_TEX2D_259 .incbin "./build/us_1.0/textures/2d/unknown_4_259.bin" -glabel ASSET_4_260 +glabel ASSET_TEX2D_260 .incbin "./build/us_1.0/textures/2d/unknown_4_260.bin" -glabel ASSET_4_261 +glabel ASSET_TEX2D_261 .incbin "./build/us_1.0/textures/2d/unknown_4_261.bin" -glabel ASSET_4_262 +glabel ASSET_TEX2D_262 .incbin "./build/us_1.0/textures/2d/unknown_4_262.bin" -glabel ASSET_4_263 +glabel ASSET_TEX2D_263 .incbin "./build/us_1.0/textures/2d/unknown_4_263.bin" -glabel ASSET_4_264 +glabel ASSET_TEX2D_264 .incbin "./build/us_1.0/textures/2d/unknown_4_264.bin" -glabel ASSET_4_265 +glabel ASSET_TEX2D_265 .incbin "./build/us_1.0/textures/2d/unknown_4_265.bin" -glabel ASSET_4_266 +glabel ASSET_TEX2D_266 .incbin "./build/us_1.0/textures/2d/unknown_4_266.bin" -glabel ASSET_4_267 +glabel ASSET_TEX2D_267 .incbin "./build/us_1.0/textures/2d/unknown_4_267.bin" -glabel ASSET_4_268 +glabel ASSET_TEX2D_268 .incbin "./build/us_1.0/textures/2d/unknown_4_268.bin" -glabel ASSET_4_269 +glabel ASSET_TEX2D_269 .incbin "./build/us_1.0/textures/2d/unknown_4_269.bin" -glabel ASSET_4_270 +glabel ASSET_TEX2D_270 .incbin "./build/us_1.0/textures/2d/unknown_4_270.bin" -glabel ASSET_4_271 +glabel ASSET_TEX2D_271 .incbin "./build/us_1.0/textures/2d/unknown_4_271.bin" -glabel ASSET_4_272 +glabel ASSET_TEX2D_272 .incbin "./build/us_1.0/textures/2d/unknown_4_272.bin" -glabel ASSET_4_273 +glabel ASSET_TEX2D_273 .incbin "./build/us_1.0/textures/2d/unknown_4_273.bin" -glabel ASSET_4_274 +glabel ASSET_TEX2D_274 .incbin "./build/us_1.0/textures/2d/unknown_4_274.bin" -glabel ASSET_4_275 +glabel ASSET_TEX2D_275 .incbin "./build/us_1.0/textures/2d/unknown_4_275.bin" -glabel ASSET_4_276 +glabel ASSET_TEX2D_276 .incbin "./build/us_1.0/textures/2d/unknown_4_276.bin" -glabel ASSET_4_277 +glabel ASSET_TEX2D_277 .incbin "./build/us_1.0/textures/2d/unknown_4_277.bin" -glabel ASSET_4_278 +glabel ASSET_TEX2D_278 .incbin "./build/us_1.0/textures/2d/unknown_4_278.bin" -glabel ASSET_4_279 +glabel ASSET_TEX2D_279 .incbin "./build/us_1.0/textures/2d/unknown_4_279.bin" -glabel ASSET_4_280 +glabel ASSET_TEX2D_280 .incbin "./build/us_1.0/textures/2d/unknown_4_280.bin" -glabel ASSET_4_281 +glabel ASSET_TEX2D_281 .incbin "./build/us_1.0/textures/2d/unknown_4_281.bin" -glabel ASSET_4_282 +glabel ASSET_TEX2D_282 .incbin "./build/us_1.0/textures/2d/unknown_4_282.bin" -glabel ASSET_4_283 +glabel ASSET_TEX2D_283 .incbin "./build/us_1.0/textures/2d/unknown_4_283.bin" -glabel ASSET_4_284 +glabel ASSET_TEX2D_284 .incbin "./build/us_1.0/textures/2d/unknown_4_284.bin" -glabel ASSET_4_285 +glabel ASSET_TEX2D_285 .incbin "./build/us_1.0/textures/2d/unknown_4_285.bin" -glabel ASSET_4_286 +glabel ASSET_TEX2D_286 .incbin "./build/us_1.0/textures/2d/unknown_4_286.bin" -glabel ASSET_4_287 +glabel ASSET_TEX2D_287 .incbin "./build/us_1.0/textures/2d/unknown_4_287.bin" -glabel ASSET_4_288 +glabel ASSET_TEX2D_288 .incbin "./build/us_1.0/textures/2d/unknown_4_288.bin" -glabel ASSET_4_289 +glabel ASSET_TEX2D_289 .incbin "./build/us_1.0/textures/2d/unknown_4_289.bin" -glabel ASSET_4_290 +glabel ASSET_TEX2D_290 .incbin "./build/us_1.0/textures/2d/unknown_4_290.bin" -glabel ASSET_4_291 +glabel ASSET_TEX2D_291 .incbin "./build/us_1.0/textures/2d/unknown_4_291.bin" -glabel ASSET_4_292 +glabel ASSET_TEX2D_292 .incbin "./build/us_1.0/textures/2d/unknown_4_292.bin" -glabel ASSET_4_293 +glabel ASSET_TEX2D_293 .incbin "./build/us_1.0/textures/2d/unknown_4_293.bin" -glabel ASSET_4_294 +glabel ASSET_TEX2D_294 .incbin "./build/us_1.0/textures/2d/unknown_4_294.bin" -glabel ASSET_4_295 +glabel ASSET_TEX2D_295 .incbin "./build/us_1.0/textures/2d/unknown_4_295.bin" -glabel ASSET_4_296 +glabel ASSET_TEX2D_296 .incbin "./build/us_1.0/textures/2d/unknown_4_296.bin" -glabel ASSET_4_297 +glabel ASSET_TEX2D_297 .incbin "./build/us_1.0/textures/2d/unknown_4_297.bin" -glabel ASSET_4_298 +glabel ASSET_TEX2D_298 .incbin "./build/us_1.0/textures/2d/unknown_4_298.bin" -glabel ASSET_4_299 +glabel ASSET_TEX2D_299 .incbin "./build/us_1.0/textures/2d/unknown_4_299.bin" -glabel ASSET_4_300 +glabel ASSET_TEX2D_300 .incbin "./build/us_1.0/textures/2d/unknown_4_300.bin" -glabel ASSET_4_301 +glabel ASSET_TEX2D_301 .incbin "./build/us_1.0/textures/2d/unknown_4_301.bin" -glabel ASSET_4_302 +glabel ASSET_TEX2D_302 .incbin "./build/us_1.0/textures/2d/unknown_4_302.bin" -glabel ASSET_4_303 +glabel ASSET_TEX2D_303 .incbin "./build/us_1.0/textures/2d/unknown_4_303.bin" -glabel ASSET_4_304 +glabel ASSET_TEX2D_304 .incbin "./build/us_1.0/textures/2d/unknown_4_304.bin" -glabel ASSET_4_305 +glabel ASSET_TEX2D_305 .incbin "./build/us_1.0/textures/2d/unknown_4_305.bin" -glabel ASSET_4_306 +glabel ASSET_TEX2D_306 .incbin "./build/us_1.0/textures/2d/unknown_4_306.bin" -glabel ASSET_4_307 +glabel ASSET_TEX2D_307 .incbin "./build/us_1.0/textures/2d/unknown_4_307.bin" -glabel ASSET_4_308 +glabel ASSET_TEX2D_308 .incbin "./build/us_1.0/textures/2d/unknown_4_308.bin" -glabel ASSET_4_309 +glabel ASSET_TEX2D_309 .incbin "./build/us_1.0/textures/2d/unknown_4_309.bin" -glabel ASSET_4_310 +glabel ASSET_TEX2D_310 .incbin "./build/us_1.0/textures/2d/unknown_4_310.bin" -glabel ASSET_4_311 +glabel ASSET_TEX2D_311 .incbin "./build/us_1.0/textures/2d/unknown_4_311.bin" -glabel ASSET_4_312 +glabel ASSET_TEX2D_312 .incbin "./build/us_1.0/textures/2d/unknown_4_312.bin" -glabel ASSET_4_313 +glabel ASSET_TEX2D_313 .incbin "./build/us_1.0/textures/2d/unknown_4_313.bin" -glabel ASSET_4_314 +glabel ASSET_TEX2D_314 .incbin "./build/us_1.0/textures/2d/unknown_4_314.bin" -glabel ASSET_4_315 +glabel ASSET_TEX2D_315 .incbin "./build/us_1.0/textures/2d/unknown_4_315.bin" -glabel ASSET_4_316 +glabel ASSET_TEX2D_316 .incbin "./build/us_1.0/textures/2d/unknown_4_316.bin" -glabel ASSET_4_317 +glabel ASSET_TEX2D_317 .incbin "./build/us_1.0/textures/2d/unknown_4_317.bin" -glabel ASSET_4_318 +glabel ASSET_TEX2D_318 .incbin "./build/us_1.0/textures/2d/unknown_4_318.bin" -glabel ASSET_4_319 +glabel ASSET_TEX2D_319 .incbin "./build/us_1.0/textures/2d/unknown_4_319.bin" -glabel ASSET_4_320 +glabel ASSET_TEX2D_320 .incbin "./build/us_1.0/textures/2d/unknown_4_320.bin" -glabel ASSET_4_321 +glabel ASSET_TEX2D_321 .incbin "./build/us_1.0/textures/2d/unknown_4_321.bin" -glabel ASSET_4_322 +glabel ASSET_TEX2D_322 .incbin "./build/us_1.0/textures/2d/unknown_4_322.bin" -glabel ASSET_4_323 +glabel ASSET_TEX2D_323 .incbin "./build/us_1.0/textures/2d/unknown_4_323.bin" -glabel ASSET_4_324 +glabel ASSET_TEX2D_324 .incbin "./build/us_1.0/textures/2d/unknown_4_324.bin" -glabel ASSET_4_325 +glabel ASSET_TEX2D_325 .incbin "./build/us_1.0/textures/2d/unknown_4_325.bin" -glabel ASSET_4_326 +glabel ASSET_TEX2D_326 .incbin "./build/us_1.0/textures/2d/unknown_4_326.bin" -glabel ASSET_4_327 +glabel ASSET_TEX2D_327 .incbin "./build/us_1.0/textures/2d/unknown_4_327.bin" -glabel ASSET_4_328 +glabel ASSET_TEX2D_328 .incbin "./build/us_1.0/textures/2d/unknown_4_328.bin" -glabel ASSET_4_329 +glabel ASSET_TEX2D_329 .incbin "./build/us_1.0/textures/2d/unknown_4_329.bin" -glabel ASSET_4_330 +glabel ASSET_TEX2D_330 .incbin "./build/us_1.0/textures/2d/unknown_4_330.bin" -glabel ASSET_4_331 +glabel ASSET_TEX2D_331 .incbin "./build/us_1.0/textures/2d/unknown_4_331.bin" -glabel ASSET_4_332 +glabel ASSET_TEX2D_332 .incbin "./build/us_1.0/textures/2d/unknown_4_332.bin" -glabel ASSET_4_333 +glabel ASSET_TEX2D_333 .incbin "./build/us_1.0/textures/2d/unknown_4_333.bin" -glabel ASSET_4_334 +glabel ASSET_TEX2D_334 .incbin "./build/us_1.0/textures/2d/unknown_4_334.bin" -glabel ASSET_4_335 +glabel ASSET_TEX2D_335 .incbin "./build/us_1.0/textures/2d/unknown_4_335.bin" -glabel ASSET_4_336 +glabel ASSET_TEX2D_336 .incbin "./build/us_1.0/textures/2d/unknown_4_336.bin" -glabel ASSET_4_337 +glabel ASSET_TEX2D_337 .incbin "./build/us_1.0/textures/2d/unknown_4_337.bin" -glabel ASSET_4_338 +glabel ASSET_TEX2D_338 .incbin "./build/us_1.0/textures/2d/unknown_4_338.bin" -glabel ASSET_4_339 +glabel ASSET_TEX2D_339 .incbin "./build/us_1.0/textures/2d/unknown_4_339.bin" -glabel ASSET_4_340 +glabel ASSET_TEX2D_340 .incbin "./build/us_1.0/textures/2d/unknown_4_340.bin" -glabel ASSET_4_341 +glabel ASSET_TEX2D_341 .incbin "./build/us_1.0/textures/2d/unknown_4_341.bin" -glabel ASSET_4_342 +glabel ASSET_TEX2D_342 .incbin "./build/us_1.0/textures/2d/unknown_4_342.bin" -glabel ASSET_4_343 +glabel ASSET_TEX2D_343 .incbin "./build/us_1.0/textures/2d/unknown_4_343.bin" -glabel ASSET_4_344 +glabel ASSET_TEX2D_344 .incbin "./build/us_1.0/textures/2d/unknown_4_344.bin" -glabel ASSET_4_345 +glabel ASSET_TEX2D_345 .incbin "./build/us_1.0/textures/2d/unknown_4_345.bin" -glabel ASSET_4_346 +glabel ASSET_TEX2D_346 .incbin "./build/us_1.0/textures/2d/unknown_4_346.bin" -glabel ASSET_4_347 +glabel ASSET_TEX2D_347 .incbin "./build/us_1.0/textures/2d/unknown_4_347.bin" -glabel ASSET_4_348 +glabel ASSET_TEX2D_348 .incbin "./build/us_1.0/textures/2d/unknown_4_348.bin" -glabel ASSET_4_349 +glabel ASSET_TEX2D_349 .incbin "./build/us_1.0/textures/2d/unknown_4_349.bin" -glabel ASSET_4_350 +glabel ASSET_TEX2D_350 .incbin "./build/us_1.0/textures/2d/unknown_4_350.bin" -glabel ASSET_4_351 +glabel ASSET_TEX2D_351 .incbin "./build/us_1.0/textures/2d/unknown_4_351.bin" -glabel ASSET_4_352 +glabel ASSET_TEX2D_352 .incbin "./build/us_1.0/textures/2d/unknown_4_352.bin" -glabel ASSET_4_353 +glabel ASSET_TEX2D_353 .incbin "./build/us_1.0/textures/2d/unknown_4_353.bin" -glabel ASSET_4_354 +glabel ASSET_TEX2D_354 .incbin "./build/us_1.0/textures/2d/unknown_4_354.bin" -glabel ASSET_4_355 +glabel ASSET_TEX2D_355 .incbin "./build/us_1.0/textures/2d/unknown_4_355.bin" -glabel ASSET_4_356 +glabel ASSET_TEX2D_356 .incbin "./build/us_1.0/textures/2d/unknown_4_356.bin" -glabel ASSET_4_357 +glabel ASSET_TEX2D_357 .incbin "./build/us_1.0/textures/2d/unknown_4_357.bin" -glabel ASSET_4_358 +glabel ASSET_TEX2D_358 .incbin "./build/us_1.0/textures/2d/unknown_4_358.bin" -glabel ASSET_4_359 +glabel ASSET_TEX2D_359 .incbin "./build/us_1.0/textures/2d/unknown_4_359.bin" -glabel ASSET_4_360 +glabel ASSET_TEX2D_360 .incbin "./build/us_1.0/textures/2d/unknown_4_360.bin" -glabel ASSET_4_361 +glabel ASSET_TEX2D_361 .incbin "./build/us_1.0/textures/2d/unknown_4_361.bin" -glabel ASSET_4_362 +glabel ASSET_TEX2D_362 .incbin "./build/us_1.0/textures/2d/unknown_4_362.bin" -glabel ASSET_4_363 +glabel ASSET_TEX2D_363 .incbin "./build/us_1.0/textures/2d/unknown_4_363.bin" -glabel ASSET_4_364 +glabel ASSET_TEX2D_364 .incbin "./build/us_1.0/textures/2d/unknown_4_364.bin" -glabel ASSET_4_365 +glabel ASSET_TEX2D_365 .incbin "./build/us_1.0/textures/2d/unknown_4_365.bin" -glabel ASSET_4_366 +glabel ASSET_TEX2D_366 .incbin "./build/us_1.0/textures/2d/unknown_4_366.bin" -glabel ASSET_4_367 +glabel ASSET_TEX2D_367 .incbin "./build/us_1.0/textures/2d/unknown_4_367.bin" -glabel ASSET_4_368 +glabel ASSET_TEX2D_368 .incbin "./build/us_1.0/textures/2d/unknown_4_368.bin" -glabel ASSET_4_369 +glabel ASSET_TEX2D_369 .incbin "./build/us_1.0/textures/2d/unknown_4_369.bin" -glabel ASSET_4_370 +glabel ASSET_TEX2D_370 .incbin "./build/us_1.0/textures/2d/unknown_4_370.bin" -glabel ASSET_4_371 +glabel ASSET_TEX2D_371 .incbin "./build/us_1.0/textures/2d/unknown_4_371.bin" -glabel ASSET_4_372 +glabel ASSET_TEX2D_372 .incbin "./build/us_1.0/textures/2d/unknown_4_372.bin" -glabel ASSET_4_373 +glabel ASSET_TEX2D_373 .incbin "./build/us_1.0/textures/2d/unknown_4_373.bin" -glabel ASSET_4_374 +glabel ASSET_TEX2D_374 .incbin "./build/us_1.0/textures/2d/unknown_4_374.bin" -glabel ASSET_4_375 +glabel ASSET_TEX2D_375 .incbin "./build/us_1.0/textures/2d/unknown_4_375.bin" -glabel ASSET_4_376 +glabel ASSET_TEX2D_376 .incbin "./build/us_1.0/textures/2d/unknown_4_376.bin" -glabel ASSET_4_377 +glabel ASSET_TEX2D_377 .incbin "./build/us_1.0/textures/2d/unknown_4_377.bin" -glabel ASSET_4_378 +glabel ASSET_TEX2D_378 .incbin "./build/us_1.0/textures/2d/unknown_4_378.bin" -glabel ASSET_4_379 +glabel ASSET_TEX2D_379 .incbin "./build/us_1.0/textures/2d/unknown_4_379.bin" -glabel ASSET_4_380 +glabel ASSET_TEX2D_380 .incbin "./build/us_1.0/textures/2d/unknown_4_380.bin" -glabel ASSET_4_381 +glabel ASSET_TEX2D_381 .incbin "./build/us_1.0/textures/2d/unknown_4_381.bin" -glabel ASSET_4_382 +glabel ASSET_TEX2D_382 .incbin "./build/us_1.0/textures/2d/unknown_4_382.bin" -glabel ASSET_4_383 +glabel ASSET_TEX2D_383 .incbin "./build/us_1.0/textures/2d/unknown_4_383.bin" -glabel ASSET_4_384 +glabel ASSET_TEX2D_384 .incbin "./build/us_1.0/textures/2d/unknown_4_384.bin" -glabel ASSET_4_385 +glabel ASSET_TEX2D_385 .incbin "./build/us_1.0/textures/2d/unknown_4_385.bin" -glabel ASSET_4_386 +glabel ASSET_TEX2D_386 .incbin "./build/us_1.0/textures/2d/unknown_4_386.bin" -glabel ASSET_4_387 +glabel ASSET_TEX2D_387 .incbin "./build/us_1.0/textures/2d/unknown_4_387.bin" -glabel ASSET_4_388 +glabel ASSET_TEX2D_388 .incbin "./build/us_1.0/textures/2d/unknown_4_388.bin" -glabel ASSET_4_389 +glabel ASSET_TEX2D_389 .incbin "./build/us_1.0/textures/2d/unknown_4_389.bin" -glabel ASSET_4_390 +glabel ASSET_TEX2D_390 .incbin "./build/us_1.0/textures/2d/unknown_4_390.bin" -glabel ASSET_4_391 +glabel ASSET_TEX2D_391 .incbin "./build/us_1.0/textures/2d/unknown_4_391.bin" -glabel ASSET_4_392 +glabel ASSET_TEX2D_392 .incbin "./build/us_1.0/textures/2d/unknown_4_392.bin" -glabel ASSET_4_393 +glabel ASSET_TEX2D_393 .incbin "./build/us_1.0/textures/2d/unknown_4_393.bin" -glabel ASSET_4_394 +glabel ASSET_TEX2D_394 .incbin "./build/us_1.0/textures/2d/unknown_4_394.bin" -glabel ASSET_4_395 +glabel ASSET_TEX2D_395 .incbin "./build/us_1.0/textures/2d/unknown_4_395.bin" -glabel ASSET_4_396 +glabel ASSET_TEX2D_396 .incbin "./build/us_1.0/textures/2d/unknown_4_396.bin" -glabel ASSET_4_397 +glabel ASSET_TEX2D_397 .incbin "./build/us_1.0/textures/2d/unknown_4_397.bin" -glabel ASSET_4_398 +glabel ASSET_TEX2D_398 .incbin "./build/us_1.0/textures/2d/unknown_4_398.bin" -glabel ASSET_4_399 +glabel ASSET_TEX2D_399 .incbin "./build/us_1.0/textures/2d/unknown_4_399.bin" -glabel ASSET_4_400 +glabel ASSET_TEX2D_400 .incbin "./build/us_1.0/textures/2d/unknown_4_400.bin" -glabel ASSET_4_401 +glabel ASSET_TEX2D_401 .incbin "./build/us_1.0/textures/2d/unknown_4_401.bin" -glabel ASSET_4_402 +glabel ASSET_TEX2D_402 .incbin "./build/us_1.0/textures/2d/unknown_4_402.bin" -glabel ASSET_4_403 +glabel ASSET_TEX2D_403 .incbin "./build/us_1.0/textures/2d/unknown_4_403.bin" -glabel ASSET_4_404 +glabel ASSET_TEX2D_404 .incbin "./build/us_1.0/textures/2d/unknown_4_404.bin" -glabel ASSET_4_405 +glabel ASSET_TEX2D_405 .incbin "./build/us_1.0/textures/2d/unknown_4_405.bin" -glabel ASSET_4_406 +glabel ASSET_TEX2D_406 .incbin "./build/us_1.0/textures/2d/unknown_4_406.bin" -glabel ASSET_4_407 +glabel ASSET_TEX2D_407 .incbin "./build/us_1.0/textures/2d/unknown_4_407.bin" -glabel ASSET_4_408 +glabel ASSET_TEX2D_408 .incbin "./build/us_1.0/textures/2d/unknown_4_408.bin" -glabel ASSET_4_409 +glabel ASSET_TEX2D_409 .incbin "./build/us_1.0/textures/2d/unknown_4_409.bin" -glabel ASSET_4_410 +glabel ASSET_TEX2D_410 .incbin "./build/us_1.0/textures/2d/unknown_4_410.bin" -glabel ASSET_4_411 +glabel ASSET_TEX2D_411 .incbin "./build/us_1.0/textures/2d/unknown_4_411.bin" -glabel ASSET_4_412 +glabel ASSET_TEX2D_412 .incbin "./build/us_1.0/textures/2d/unknown_4_412.bin" -glabel ASSET_4_413 +glabel ASSET_TEX2D_413 .incbin "./build/us_1.0/textures/2d/unknown_4_413.bin" -glabel ASSET_4_414 +glabel ASSET_TEX2D_414 .incbin "./build/us_1.0/textures/2d/unknown_4_414.bin" -glabel ASSET_4_415 +glabel ASSET_TEX2D_415 .incbin "./build/us_1.0/textures/2d/unknown_4_415.bin" -glabel ASSET_4_416 +glabel ASSET_TEX2D_416 .incbin "./build/us_1.0/textures/2d/unknown_4_416.bin" -glabel ASSET_4_417 +glabel ASSET_TEX2D_417 .incbin "./build/us_1.0/textures/2d/unknown_4_417.bin" -glabel ASSET_4_418 +glabel ASSET_TEX2D_418 .incbin "./build/us_1.0/textures/2d/unknown_4_418.bin" -glabel ASSET_4_419 +glabel ASSET_TEX2D_419 .incbin "./build/us_1.0/textures/2d/unknown_4_419.bin" -glabel ASSET_4_420 +glabel ASSET_TEX2D_420 .incbin "./build/us_1.0/textures/2d/unknown_4_420.bin" -glabel ASSET_4_421 +glabel ASSET_TEX2D_421 .incbin "./build/us_1.0/textures/2d/unknown_4_421.bin" -glabel ASSET_4_422 +glabel ASSET_TEX2D_422 .incbin "./build/us_1.0/textures/2d/unknown_4_422.bin" -glabel ASSET_4_423 +glabel ASSET_TEX2D_423 .incbin "./build/us_1.0/textures/2d/unknown_4_423.bin" -glabel ASSET_4_424 +glabel ASSET_TEX2D_424 .incbin "./build/us_1.0/textures/2d/unknown_4_424.bin" -glabel ASSET_4_425 +glabel ASSET_TEX2D_425 .incbin "./build/us_1.0/textures/2d/unknown_4_425.bin" -glabel ASSET_4_426 +glabel ASSET_TEX2D_426 .incbin "./build/us_1.0/textures/2d/unknown_4_426.bin" -glabel ASSET_4_427 +glabel ASSET_TEX2D_427 .incbin "./build/us_1.0/textures/2d/unknown_4_427.bin" -glabel ASSET_4_428 +glabel ASSET_TEX2D_428 .incbin "./build/us_1.0/textures/2d/unknown_4_428.bin" -glabel ASSET_4_429 +glabel ASSET_TEX2D_429 .incbin "./build/us_1.0/textures/2d/unknown_4_429.bin" -glabel ASSET_4_430 +glabel ASSET_TEX2D_430 .incbin "./build/us_1.0/textures/2d/unknown_4_430.bin" -glabel ASSET_4_431 +glabel ASSET_TEX2D_431 .incbin "./build/us_1.0/textures/2d/unknown_4_431.bin" -glabel ASSET_4_432 +glabel ASSET_TEX2D_432 .incbin "./build/us_1.0/textures/2d/unknown_4_432.bin" -glabel ASSET_4_433 +glabel ASSET_TEX2D_433 .incbin "./build/us_1.0/textures/2d/unknown_4_433.bin" -glabel ASSET_4_434 +glabel ASSET_TEX2D_434 .incbin "./build/us_1.0/textures/2d/unknown_4_434.bin" -glabel ASSET_4_435 +glabel ASSET_TEX2D_435 .incbin "./build/us_1.0/textures/2d/unknown_4_435.bin" -glabel ASSET_4_436 +glabel ASSET_TEX2D_436 .incbin "./build/us_1.0/textures/2d/unknown_4_436.bin" -glabel ASSET_4_437 +glabel ASSET_TEX2D_437 .incbin "./build/us_1.0/textures/2d/unknown_4_437.bin" -glabel ASSET_4_438 +glabel ASSET_TEX2D_438 .incbin "./build/us_1.0/textures/2d/unknown_4_438.bin" -glabel ASSET_4_439 +glabel ASSET_TEX2D_439 .incbin "./build/us_1.0/textures/2d/unknown_4_439.bin" -glabel ASSET_4_440 +glabel ASSET_TEX2D_440 .incbin "./build/us_1.0/textures/2d/unknown_4_440.bin" -glabel ASSET_4_441 +glabel ASSET_TEX2D_441 .incbin "./build/us_1.0/textures/2d/unknown_4_441.bin" -glabel ASSET_4_442 +glabel ASSET_TEX2D_442 .incbin "./build/us_1.0/textures/2d/unknown_4_442.bin" -glabel ASSET_4_443 +glabel ASSET_TEX2D_443 .incbin "./build/us_1.0/textures/2d/unknown_4_443.bin" -glabel ASSET_4_444 +glabel ASSET_TEX2D_444 .incbin "./build/us_1.0/textures/2d/unknown_4_444.bin" -glabel ASSET_4_445 +glabel ASSET_TEX2D_445 .incbin "./build/us_1.0/textures/2d/unknown_4_445.bin" -glabel ASSET_4_446 +glabel ASSET_TEX2D_446 .incbin "./build/us_1.0/textures/2d/unknown_4_446.bin" -glabel ASSET_4_447 +glabel ASSET_TEX2D_447 .incbin "./build/us_1.0/textures/2d/unknown_4_447.bin" -glabel ASSET_4_448 +glabel ASSET_TEX2D_448 .incbin "./build/us_1.0/textures/2d/unknown_4_448.bin" -glabel ASSET_4_449 +glabel ASSET_TEX2D_449 .incbin "./build/us_1.0/textures/2d/unknown_4_449.bin" -glabel ASSET_4_450 +glabel ASSET_TEX2D_450 .incbin "./build/us_1.0/textures/2d/unknown_4_450.bin" -glabel ASSET_4_451 +glabel ASSET_TEX2D_451 .incbin "./build/us_1.0/textures/2d/unknown_4_451.bin" -glabel ASSET_4_452 +glabel ASSET_TEX2D_452 .incbin "./build/us_1.0/textures/2d/unknown_4_452.bin" -glabel ASSET_4_453 +glabel ASSET_TEX2D_453 .incbin "./build/us_1.0/textures/2d/unknown_4_453.bin" -glabel ASSET_4_454 +glabel ASSET_TEX2D_454 .incbin "./build/us_1.0/textures/2d/unknown_4_454.bin" -glabel ASSET_4_455 +glabel ASSET_TEX2D_455 .incbin "./build/us_1.0/textures/2d/unknown_4_455.bin" -glabel ASSET_4_456 +glabel ASSET_TEX2D_456 .incbin "./build/us_1.0/textures/2d/unknown_4_456.bin" -glabel ASSET_4_457 +glabel ASSET_TEX2D_457 .incbin "./build/us_1.0/textures/2d/unknown_4_457.bin" -glabel ASSET_4_458 +glabel ASSET_TEX2D_458 .incbin "./build/us_1.0/textures/2d/unknown_4_458.bin" -glabel ASSET_4_459 +glabel ASSET_TEX2D_459 .incbin "./build/us_1.0/textures/2d/unknown_4_459.bin" -glabel ASSET_4_460 +glabel ASSET_TEX2D_460 .incbin "./build/us_1.0/textures/2d/unknown_4_460.bin" -glabel ASSET_4_461 +glabel ASSET_TEX2D_461 .incbin "./build/us_1.0/textures/2d/unknown_4_461.bin" -glabel ASSET_4_462 +glabel ASSET_TEX2D_462 .incbin "./build/us_1.0/textures/2d/unknown_4_462.bin" -glabel ASSET_4_463 +glabel ASSET_TEX2D_463 .incbin "./build/us_1.0/textures/2d/unknown_4_463.bin" -glabel ASSET_4_464 +glabel ASSET_TEX2D_464 .incbin "./build/us_1.0/textures/2d/unknown_4_464.bin" -glabel ASSET_4_465 +glabel ASSET_TEX2D_465 .incbin "./build/us_1.0/textures/2d/unknown_4_465.bin" -glabel ASSET_4_466 +glabel ASSET_TEX2D_466 .incbin "./build/us_1.0/textures/2d/unknown_4_466.bin" -glabel ASSET_4_467 +glabel ASSET_TEX2D_467 .incbin "./build/us_1.0/textures/2d/unknown_4_467.bin" -glabel ASSET_4_468 +glabel ASSET_TEX2D_468 .incbin "./build/us_1.0/textures/2d/unknown_4_468.bin" -glabel ASSET_4_469 +glabel ASSET_TEX2D_469 .incbin "./build/us_1.0/textures/2d/unknown_4_469.bin" -glabel ASSET_4_470 +glabel ASSET_TEX2D_470 .incbin "./build/us_1.0/textures/2d/unknown_4_470.bin" -glabel ASSET_4_471 +glabel ASSET_TEX2D_471 .incbin "./build/us_1.0/textures/2d/unknown_4_471.bin" -glabel ASSET_4_472 +glabel ASSET_TEX2D_472 .incbin "./build/us_1.0/textures/2d/unknown_4_472.bin" -glabel ASSET_4_473 +glabel ASSET_TEX2D_473 .incbin "./build/us_1.0/textures/2d/unknown_4_473.bin" -glabel ASSET_4_474 +glabel ASSET_TEX2D_474 .incbin "./build/us_1.0/textures/2d/unknown_4_474.bin" -glabel ASSET_4_475 +glabel ASSET_TEX2D_475 .incbin "./build/us_1.0/textures/2d/unknown_4_475.bin" -glabel ASSET_4_476 +glabel ASSET_TEX2D_476 .incbin "./build/us_1.0/textures/2d/unknown_4_476.bin" -glabel ASSET_4_477 +glabel ASSET_TEX2D_477 .incbin "./build/us_1.0/textures/2d/unknown_4_477.bin" -glabel ASSET_4_478 +glabel ASSET_TEX2D_478 .incbin "./build/us_1.0/textures/2d/unknown_4_478.bin" -glabel ASSET_4_479 +glabel ASSET_TEX2D_479 .incbin "./build/us_1.0/textures/2d/unknown_4_479.bin" -glabel ASSET_4_480 +glabel ASSET_TEX2D_480 .incbin "./build/us_1.0/textures/2d/unknown_4_480.bin" -glabel ASSET_4_481 +glabel ASSET_TEX2D_481 .incbin "./build/us_1.0/textures/2d/unknown_4_481.bin" -glabel ASSET_4_482 +glabel ASSET_TEX2D_482 .incbin "./build/us_1.0/textures/2d/unknown_4_482.bin" -glabel ASSET_4_483 +glabel ASSET_TEX2D_483 .incbin "./build/us_1.0/textures/2d/unknown_4_483.bin" -glabel ASSET_4_484 +glabel ASSET_TEX2D_484 .incbin "./build/us_1.0/textures/2d/unknown_4_484.bin" -glabel ASSET_4_485 +glabel ASSET_TEX2D_485 .incbin "./build/us_1.0/textures/2d/unknown_4_485.bin" -glabel ASSET_4_486 +glabel ASSET_TEX2D_486 .incbin "./build/us_1.0/textures/2d/unknown_4_486.bin" -glabel ASSET_4_487 +glabel ASSET_TEX2D_487 .incbin "./build/us_1.0/textures/2d/unknown_4_487.bin" -glabel ASSET_4_488 +glabel ASSET_TEX2D_488 .incbin "./build/us_1.0/textures/2d/unknown_4_488.bin" -glabel ASSET_4_489 +glabel ASSET_TEX2D_489 .incbin "./build/us_1.0/textures/2d/unknown_4_489.bin" -glabel ASSET_4_490 +glabel ASSET_TEX2D_490 .incbin "./build/us_1.0/textures/2d/unknown_4_490.bin" -glabel ASSET_4_491 +glabel ASSET_TEX2D_491 .incbin "./build/us_1.0/textures/2d/unknown_4_491.bin" -glabel ASSET_4_492 +glabel ASSET_TEX2D_492 .incbin "./build/us_1.0/textures/2d/unknown_4_492.bin" -glabel ASSET_4_493 +glabel ASSET_TEX2D_493 .incbin "./build/us_1.0/textures/2d/unknown_4_493.bin" -glabel ASSET_4_494 +glabel ASSET_TEX2D_494 .incbin "./build/us_1.0/textures/2d/unknown_4_494.bin" -glabel ASSET_4_495 +glabel ASSET_TEX2D_495 .incbin "./build/us_1.0/textures/2d/unknown_4_495.bin" -glabel ASSET_4_496 +glabel ASSET_TEX2D_496 .incbin "./build/us_1.0/textures/2d/unknown_4_496.bin" -glabel ASSET_4_497 +glabel ASSET_TEX2D_497 .incbin "./build/us_1.0/textures/2d/unknown_4_497.bin" -glabel ASSET_4_498 +glabel ASSET_TEX2D_498 .incbin "./build/us_1.0/textures/2d/unknown_4_498.bin" -glabel ASSET_4_499 +glabel ASSET_TEX2D_499 .incbin "./build/us_1.0/textures/2d/unknown_4_499.bin" -glabel ASSET_4_500 +glabel ASSET_TEX2D_500 .incbin "./build/us_1.0/textures/2d/unknown_4_500.bin" -glabel ASSET_4_501 +glabel ASSET_TEX2D_501 .incbin "./build/us_1.0/textures/2d/unknown_4_501.bin" -glabel ASSET_4_502 +glabel ASSET_TEX2D_502 .incbin "./build/us_1.0/textures/2d/unknown_4_502.bin" -glabel ASSET_4_503 +glabel ASSET_TEX2D_503 .incbin "./build/us_1.0/textures/2d/unknown_4_503.bin" -glabel ASSET_4_504 +glabel ASSET_TEX2D_504 .incbin "./build/us_1.0/textures/2d/unknown_4_504.bin" -glabel ASSET_4_505 +glabel ASSET_TEX2D_505 .incbin "./build/us_1.0/textures/2d/unknown_4_505.bin" -glabel ASSET_4_506 +glabel ASSET_TEX2D_506 .incbin "./build/us_1.0/textures/2d/unknown_4_506.bin" -glabel ASSET_4_507 +glabel ASSET_TEX2D_507 .incbin "./build/us_1.0/textures/2d/unknown_4_507.bin" -glabel ASSET_4_508 +glabel ASSET_TEX2D_508 .incbin "./build/us_1.0/textures/2d/unknown_4_508.bin" -glabel ASSET_4_509 +glabel ASSET_TEX2D_509 .incbin "./build/us_1.0/textures/2d/unknown_4_509.bin" -glabel ASSET_4_510 +glabel ASSET_TEX2D_510 .incbin "./build/us_1.0/textures/2d/unknown_4_510.bin" -glabel ASSET_4_511 +glabel ASSET_TEX2D_511 .incbin "./build/us_1.0/textures/2d/unknown_4_511.bin" -glabel ASSET_4_512 +glabel ASSET_TEX2D_512 .incbin "./build/us_1.0/textures/2d/unknown_4_512.bin" -glabel ASSET_4_513 +glabel ASSET_TEX2D_513 .incbin "./build/us_1.0/textures/2d/unknown_4_513.bin" -glabel ASSET_4_514 +glabel ASSET_TEX2D_514 .incbin "./build/us_1.0/textures/2d/unknown_4_514.bin" -glabel ASSET_4_515 +glabel ASSET_TEX2D_515 .incbin "./build/us_1.0/textures/2d/unknown_4_515.bin" -glabel ASSET_4_516 +glabel ASSET_TEX2D_516 .incbin "./build/us_1.0/textures/2d/unknown_4_516.bin" -glabel ASSET_4_517 +glabel ASSET_TEX2D_517 .incbin "./build/us_1.0/textures/2d/unknown_4_517.bin" -glabel ASSET_4_518 +glabel ASSET_TEX2D_518 .incbin "./build/us_1.0/textures/2d/unknown_4_518.bin" -glabel ASSET_4_519 +glabel ASSET_TEX2D_519 .incbin "./build/us_1.0/textures/2d/unknown_4_519.bin" -glabel ASSET_4_520 +glabel ASSET_TEX2D_520 .incbin "./build/us_1.0/textures/2d/unknown_4_520.bin" -glabel ASSET_4_521 +glabel ASSET_TEX2D_521 .incbin "./build/us_1.0/textures/2d/unknown_4_521.bin" -glabel ASSET_4_522 +glabel ASSET_TEX2D_522 .incbin "./build/us_1.0/textures/2d/unknown_4_522.bin" -glabel ASSET_4_523 +glabel ASSET_TEX2D_523 .incbin "./build/us_1.0/textures/2d/unknown_4_523.bin" -glabel ASSET_4_524 +glabel ASSET_TEX2D_524 .incbin "./build/us_1.0/textures/2d/unknown_4_524.bin" -glabel ASSET_4_525 +glabel ASSET_TEX2D_525 .incbin "./build/us_1.0/textures/2d/unknown_4_525.bin" -glabel ASSET_4_526 +glabel ASSET_TEX2D_526 .incbin "./build/us_1.0/textures/2d/unknown_4_526.bin" -glabel ASSET_4_527 +glabel ASSET_TEX2D_527 .incbin "./build/us_1.0/textures/2d/unknown_4_527.bin" -glabel ASSET_4_528 +glabel ASSET_TEX2D_528 .incbin "./build/us_1.0/textures/2d/unknown_4_528.bin" -glabel ASSET_4_529 +glabel ASSET_TEX2D_529 .incbin "./build/us_1.0/textures/2d/unknown_4_529.bin" -glabel ASSET_4_530 +glabel ASSET_TEX2D_530 .incbin "./build/us_1.0/textures/2d/unknown_4_530.bin" -glabel ASSET_4_531 +glabel ASSET_TEX2D_531 .incbin "./build/us_1.0/textures/2d/unknown_4_531.bin" -glabel ASSET_4_532 +glabel ASSET_TEX2D_532 .incbin "./build/us_1.0/textures/2d/unknown_4_532.bin" -glabel ASSET_4_533 +glabel ASSET_TEX2D_533 .incbin "./build/us_1.0/textures/2d/unknown_4_533.bin" -glabel ASSET_4_534 +glabel ASSET_TEX2D_534 .incbin "./build/us_1.0/textures/2d/unknown_4_534.bin" -glabel ASSET_4_535 +glabel ASSET_TEX2D_535 .incbin "./build/us_1.0/textures/2d/unknown_4_535.bin" -glabel ASSET_4_536 +glabel ASSET_TEX2D_536 .incbin "./build/us_1.0/textures/2d/unknown_4_536.bin" -glabel ASSET_4_537 +glabel ASSET_TEX2D_537 .incbin "./build/us_1.0/textures/2d/unknown_4_537.bin" -glabel ASSET_4_538 +glabel ASSET_TEX2D_538 .incbin "./build/us_1.0/textures/2d/unknown_4_538.bin" -glabel ASSET_4_539 +glabel ASSET_TEX2D_539 .incbin "./build/us_1.0/textures/2d/unknown_4_539.bin" -glabel ASSET_4_540 +glabel ASSET_TEX2D_540 .incbin "./build/us_1.0/textures/2d/unknown_4_540.bin" -glabel ASSET_4_541 +glabel ASSET_TEX2D_541 .incbin "./build/us_1.0/textures/2d/unknown_4_541.bin" -glabel ASSET_4_542 +glabel ASSET_TEX2D_542 .incbin "./build/us_1.0/textures/2d/unknown_4_542.bin" -glabel ASSET_4_543 +glabel ASSET_TEX2D_543 .incbin "./build/us_1.0/textures/2d/unknown_4_543.bin" -glabel ASSET_4_544 +glabel ASSET_TEX2D_544 .incbin "./build/us_1.0/textures/2d/unknown_4_544.bin" -glabel ASSET_4_545 +glabel ASSET_TEX2D_545 .incbin "./build/us_1.0/textures/2d/unknown_4_545.bin" -glabel ASSET_4_546 +glabel ASSET_TEX2D_546 .incbin "./build/us_1.0/textures/2d/unknown_4_546.bin" -glabel ASSET_4_547 +glabel ASSET_TEX2D_547 .incbin "./build/us_1.0/textures/2d/unknown_4_547.bin" -glabel ASSET_4_548 +glabel ASSET_TEX2D_548 .incbin "./build/us_1.0/textures/2d/unknown_4_548.bin" -glabel ASSET_4_549 +glabel ASSET_TEX2D_549 .incbin "./build/us_1.0/textures/2d/unknown_4_549.bin" -glabel ASSET_4_550 +glabel ASSET_TEX2D_550 .incbin "./build/us_1.0/textures/2d/unknown_4_550.bin" -glabel ASSET_4_551 +glabel ASSET_TEX2D_551 .incbin "./build/us_1.0/textures/2d/unknown_4_551.bin" -glabel ASSET_4_552 +glabel ASSET_TEX2D_552 .incbin "./build/us_1.0/textures/2d/unknown_4_552.bin" -glabel ASSET_4_553 +glabel ASSET_TEX2D_553 .incbin "./build/us_1.0/textures/2d/unknown_4_553.bin" -glabel ASSET_4_554 +glabel ASSET_TEX2D_554 .incbin "./build/us_1.0/textures/2d/unknown_4_554.bin" -glabel ASSET_4_555 +glabel ASSET_TEX2D_555 .incbin "./build/us_1.0/textures/2d/unknown_4_555.bin" -glabel ASSET_4_556 +glabel ASSET_TEX2D_556 .incbin "./build/us_1.0/textures/2d/unknown_4_556.bin" -glabel ASSET_4_557 +glabel ASSET_TEX2D_557 .incbin "./build/us_1.0/textures/2d/unknown_4_557.bin" -glabel ASSET_4_558 +glabel ASSET_TEX2D_558 .incbin "./build/us_1.0/textures/2d/unknown_4_558.bin" -glabel ASSET_4_559 +glabel ASSET_TEX2D_559 .incbin "./build/us_1.0/textures/2d/unknown_4_559.bin" -glabel ASSET_4_560 +glabel ASSET_TEX2D_560 .incbin "./build/us_1.0/textures/2d/unknown_4_560.bin" -glabel ASSET_4_561 +glabel ASSET_TEX2D_561 .incbin "./build/us_1.0/textures/2d/unknown_4_561.bin" -glabel ASSET_4_562 +glabel ASSET_TEX2D_562 .incbin "./build/us_1.0/textures/2d/unknown_4_562.bin" -glabel ASSET_4_563 +glabel ASSET_TEX2D_563 .incbin "./build/us_1.0/textures/2d/unknown_4_563.bin" -glabel ASSET_4_564 +glabel ASSET_TEX2D_564 .incbin "./build/us_1.0/textures/2d/unknown_4_564.bin" -glabel ASSET_4_565 +glabel ASSET_TEX2D_565 .incbin "./build/us_1.0/textures/2d/unknown_4_565.bin" -glabel ASSET_4_566 +glabel ASSET_TEX2D_566 .incbin "./build/us_1.0/textures/2d/unknown_4_566.bin" -glabel ASSET_4_567 +glabel ASSET_TEX2D_567 .incbin "./build/us_1.0/textures/2d/unknown_4_567.bin" -glabel ASSET_4_568 +glabel ASSET_TEX2D_568 .incbin "./build/us_1.0/textures/2d/unknown_4_568.bin" -glabel ASSET_4_569 +glabel ASSET_TEX2D_569 .incbin "./build/us_1.0/textures/2d/unknown_4_569.bin" -glabel ASSET_4_570 +glabel ASSET_TEX2D_570 .incbin "./build/us_1.0/textures/2d/unknown_4_570.bin" -glabel ASSET_4_571 +glabel ASSET_TEX2D_571 .incbin "./build/us_1.0/textures/2d/unknown_4_571.bin" -glabel ASSET_4_572 +glabel ASSET_TEX2D_572 .incbin "./build/us_1.0/textures/2d/unknown_4_572.bin" -glabel ASSET_4_573 +glabel ASSET_TEX2D_573 .incbin "./build/us_1.0/textures/2d/unknown_4_573.bin" -glabel ASSET_4_574 +glabel ASSET_TEX2D_574 .incbin "./build/us_1.0/textures/2d/unknown_4_574.bin" -glabel ASSET_4_575 +glabel ASSET_TEX2D_575 .incbin "./build/us_1.0/textures/2d/unknown_4_575.bin" -glabel ASSET_4_576 +glabel ASSET_TEX2D_576 .incbin "./build/us_1.0/textures/2d/unknown_4_576.bin" -glabel ASSET_4_577 +glabel ASSET_TEX2D_577 .incbin "./build/us_1.0/textures/2d/unknown_4_577.bin" -glabel ASSET_4_578 +glabel ASSET_TEX2D_578 .incbin "./build/us_1.0/textures/2d/unknown_4_578.bin" -glabel ASSET_4_579 +glabel ASSET_TEX2D_579 .incbin "./build/us_1.0/textures/2d/unknown_4_579.bin" -glabel ASSET_4_580 +glabel ASSET_TEX2D_580 .incbin "./build/us_1.0/textures/2d/unknown_4_580.bin" -glabel ASSET_4_581 +glabel ASSET_TEX2D_581 .incbin "./build/us_1.0/textures/2d/unknown_4_581.bin" -glabel ASSET_4_582 +glabel ASSET_TEX2D_582 .incbin "./build/us_1.0/textures/2d/unknown_4_582.bin" -glabel ASSET_4_583 +glabel ASSET_TEX2D_583 .incbin "./build/us_1.0/textures/2d/unknown_4_583.bin" -glabel ASSET_4_584 +glabel ASSET_TEX2D_584 .incbin "./build/us_1.0/textures/2d/unknown_4_584.bin" -glabel ASSET_4_585 +glabel ASSET_TEX2D_585 .incbin "./build/us_1.0/textures/2d/unknown_4_585.bin" -glabel ASSET_4_586 +glabel ASSET_TEX2D_586 .incbin "./build/us_1.0/textures/2d/unknown_4_586.bin" -glabel ASSET_4_587 +glabel ASSET_TEX2D_587 .incbin "./build/us_1.0/textures/2d/unknown_4_587.bin" -glabel ASSET_4_588 +glabel ASSET_TEX2D_588 .incbin "./build/us_1.0/textures/2d/unknown_4_588.bin" -glabel ASSET_4_589 +glabel ASSET_TEX2D_589 .incbin "./build/us_1.0/textures/2d/unknown_4_589.bin" -glabel ASSET_4_590 +glabel ASSET_TEX2D_590 .incbin "./build/us_1.0/textures/2d/unknown_4_590.bin" -glabel ASSET_4_591 +glabel ASSET_TEX2D_591 .incbin "./build/us_1.0/textures/2d/unknown_4_591.bin" -glabel ASSET_4_592 +glabel ASSET_TEX2D_592 .incbin "./build/us_1.0/textures/2d/unknown_4_592.bin" -glabel ASSET_4_593 +glabel ASSET_TEX2D_593 .incbin "./build/us_1.0/textures/2d/unknown_4_593.bin" -glabel ASSET_4_594 +glabel ASSET_TEX2D_594 .incbin "./build/us_1.0/textures/2d/unknown_4_594.bin" -glabel ASSET_4_595 +glabel ASSET_TEX2D_595 .incbin "./build/us_1.0/textures/2d/unknown_4_595.bin" -glabel ASSET_4_596 +glabel ASSET_TEX2D_596 .incbin "./build/us_1.0/textures/2d/unknown_4_596.bin" -glabel ASSET_4_597 +glabel ASSET_TEX2D_597 .incbin "./build/us_1.0/textures/2d/unknown_4_597.bin" -glabel ASSET_4_598 +glabel ASSET_TEX2D_598 .incbin "./build/us_1.0/textures/2d/unknown_4_598.bin" -glabel ASSET_4_599 +glabel ASSET_TEX2D_599 .incbin "./build/us_1.0/textures/2d/unknown_4_599.bin" -glabel ASSET_4_600 +glabel ASSET_TEX2D_600 .incbin "./build/us_1.0/textures/2d/unknown_4_600.bin" -glabel ASSET_4_601 +glabel ASSET_TEX2D_601 .incbin "./build/us_1.0/textures/2d/unknown_4_601.bin" -glabel ASSET_4_602 +glabel ASSET_TEX2D_602 .incbin "./build/us_1.0/textures/2d/unknown_4_602.bin" -glabel ASSET_4_603 +glabel ASSET_TEX2D_603 .incbin "./build/us_1.0/textures/2d/unknown_4_603.bin" -glabel ASSET_4_604 +glabel ASSET_TEX2D_604 .incbin "./build/us_1.0/textures/2d/unknown_4_604.bin" -glabel ASSET_4_605 +glabel ASSET_TEX2D_605 .incbin "./build/us_1.0/textures/2d/unknown_4_605.bin" -glabel ASSET_4_606 +glabel ASSET_TEX2D_606 .incbin "./build/us_1.0/textures/2d/unknown_4_606.bin" -glabel ASSET_4_607 +glabel ASSET_TEX2D_607 .incbin "./build/us_1.0/textures/2d/unknown_4_607.bin" -glabel ASSET_4_608 +glabel ASSET_TEX2D_608 .incbin "./build/us_1.0/textures/2d/unknown_4_608.bin" -glabel ASSET_4_609 +glabel ASSET_TEX2D_609 .incbin "./build/us_1.0/textures/2d/unknown_4_609.bin" -glabel ASSET_4_610 +glabel ASSET_TEX2D_610 .incbin "./build/us_1.0/textures/2d/unknown_4_610.bin" -glabel ASSET_4_611 +glabel ASSET_TEX2D_611 .incbin "./build/us_1.0/textures/2d/unknown_4_611.bin" -glabel ASSET_4_612 +glabel ASSET_TEX2D_612 .incbin "./build/us_1.0/textures/2d/unknown_4_612.bin" -glabel ASSET_4_613 +glabel ASSET_TEX2D_613 .incbin "./build/us_1.0/textures/2d/unknown_4_613.bin" -glabel ASSET_4_614 +glabel ASSET_TEX2D_614 .incbin "./build/us_1.0/textures/2d/unknown_4_614.bin" -glabel ASSET_4_615 +glabel ASSET_TEX2D_615 .incbin "./build/us_1.0/textures/2d/unknown_4_615.bin" -glabel ASSET_4_616 +glabel ASSET_TEX2D_616 .incbin "./build/us_1.0/textures/2d/unknown_4_616.bin" -glabel ASSET_4_617 +glabel ASSET_TEX2D_617 .incbin "./build/us_1.0/textures/2d/unknown_4_617.bin" -glabel ASSET_4_618 +glabel ASSET_TEX2D_618 .incbin "./build/us_1.0/textures/2d/unknown_4_618.bin" -glabel ASSET_4_619 +glabel ASSET_TEX2D_619 .incbin "./build/us_1.0/textures/2d/unknown_4_619.bin" -glabel ASSET_4_620 +glabel ASSET_TEX2D_620 .incbin "./build/us_1.0/textures/2d/unknown_4_620.bin" -glabel ASSET_4_621 +glabel ASSET_TEX2D_621 .incbin "./build/us_1.0/textures/2d/unknown_4_621.bin" -glabel ASSET_4_622 +glabel ASSET_TEX2D_622 .incbin "./build/us_1.0/textures/2d/unknown_4_622.bin" -glabel ASSET_4_623 +glabel ASSET_TEX2D_623 .incbin "./build/us_1.0/textures/2d/unknown_4_623.bin" -glabel ASSET_4_624 +glabel ASSET_TEX2D_624 .incbin "./build/us_1.0/textures/2d/unknown_4_624.bin" -glabel ASSET_4_625 +glabel ASSET_TEX2D_625 .incbin "./build/us_1.0/textures/2d/unknown_4_625.bin" -glabel ASSET_4_626 +glabel ASSET_TEX2D_626 .incbin "./build/us_1.0/textures/2d/unknown_4_626.bin" -glabel ASSET_4_627 +glabel ASSET_TEX2D_627 .incbin "./build/us_1.0/textures/2d/unknown_4_627.bin" -glabel ASSET_4_628 +glabel ASSET_TEX2D_628 .incbin "./build/us_1.0/textures/2d/unknown_4_628.bin" -glabel ASSET_4_629 +glabel ASSET_TEX2D_629 .incbin "./build/us_1.0/textures/2d/unknown_4_629.bin" -glabel ASSET_4_630 +glabel ASSET_TEX2D_630 .incbin "./build/us_1.0/textures/2d/unknown_4_630.bin" -glabel ASSET_4_631 +glabel ASSET_TEX2D_631 .incbin "./build/us_1.0/textures/2d/unknown_4_631.bin" -glabel ASSET_4_632 +glabel ASSET_TEX2D_632 .incbin "./build/us_1.0/textures/2d/unknown_4_632.bin" -glabel ASSET_4_633 +glabel ASSET_TEX2D_633 .incbin "./build/us_1.0/textures/2d/unknown_4_633.bin" -glabel ASSET_4_634 +glabel ASSET_TEX2D_634 .incbin "./build/us_1.0/textures/2d/unknown_4_634.bin" -glabel ASSET_4_635 +glabel ASSET_TEX2D_635 .incbin "./build/us_1.0/textures/2d/unknown_4_635.bin" -glabel ASSET_4_636 +glabel ASSET_TEX2D_636 .incbin "./build/us_1.0/textures/2d/unknown_4_636.bin" -glabel ASSET_4_637 +glabel ASSET_TEX2D_637 .incbin "./build/us_1.0/textures/2d/unknown_4_637.bin" -glabel ASSET_4_638 +glabel ASSET_TEX2D_638 .incbin "./build/us_1.0/textures/2d/unknown_4_638.bin" -glabel ASSET_4_639 +glabel ASSET_TEX2D_639 .incbin "./build/us_1.0/textures/2d/unknown_4_639.bin" -glabel ASSET_4_640 +glabel ASSET_TEX2D_640 .incbin "./build/us_1.0/textures/2d/unknown_4_640.bin" -glabel ASSET_4_641 +glabel ASSET_TEX2D_641 .incbin "./build/us_1.0/textures/2d/unknown_4_641.bin" -glabel ASSET_4_642 +glabel ASSET_TEX2D_642 .incbin "./build/us_1.0/textures/2d/unknown_4_642.bin" -glabel ASSET_4_643 +glabel ASSET_TEX2D_643 .incbin "./build/us_1.0/textures/2d/unknown_4_643.bin" -glabel ASSET_4_644 +glabel ASSET_TEX2D_644 .incbin "./build/us_1.0/textures/2d/unknown_4_644.bin" -glabel ASSET_4_645 +glabel ASSET_TEX2D_645 .incbin "./build/us_1.0/textures/2d/unknown_4_645.bin" -glabel ASSET_4_646 +glabel ASSET_TEX2D_646 .incbin "./build/us_1.0/textures/2d/unknown_4_646.bin" -glabel ASSET_4_647 +glabel ASSET_TEX2D_647 .incbin "./build/us_1.0/textures/2d/unknown_4_647.bin" -glabel ASSET_4_648 +glabel ASSET_TEX2D_648 .incbin "./build/us_1.0/textures/2d/unknown_4_648.bin" -glabel ASSET_4_649 +glabel ASSET_TEX2D_649 .incbin "./build/us_1.0/textures/2d/unknown_4_649.bin" -glabel ASSET_4_650 +glabel ASSET_TEX2D_650 .incbin "./build/us_1.0/textures/2d/unknown_4_650.bin" -glabel ASSET_4_651 +glabel ASSET_TEX2D_651 .incbin "./build/us_1.0/textures/2d/unknown_4_651.bin" -glabel ASSET_4_652 +glabel ASSET_TEX2D_652 .incbin "./build/us_1.0/textures/2d/unknown_4_652.bin" -glabel ASSET_4_653 +glabel ASSET_TEX2D_653 .incbin "./build/us_1.0/textures/2d/unknown_4_653.bin" -glabel ASSET_4_654 +glabel ASSET_TEX2D_654 .incbin "./build/us_1.0/textures/2d/unknown_4_654.bin" -glabel ASSET_4_655 +glabel ASSET_TEX2D_655 .incbin "./build/us_1.0/textures/2d/unknown_4_655.bin" -glabel ASSET_4_656 +glabel ASSET_TEX2D_656 .incbin "./build/us_1.0/textures/2d/unknown_4_656.bin" -glabel ASSET_4_657 +glabel ASSET_TEX2D_657 .incbin "./build/us_1.0/textures/2d/unknown_4_657.bin" -glabel ASSET_4_658 +glabel ASSET_TEX2D_658 .incbin "./build/us_1.0/textures/2d/unknown_4_658.bin" -glabel ASSET_4_659 +glabel ASSET_TEX2D_659 .incbin "./build/us_1.0/textures/2d/unknown_4_659.bin" -glabel ASSET_4_660 +glabel ASSET_TEX2D_660 .incbin "./build/us_1.0/textures/2d/unknown_4_660.bin" -glabel ASSET_4_661 +glabel ASSET_TEX2D_661 .incbin "./build/us_1.0/textures/2d/unknown_4_661.bin" -glabel ASSET_4_662 +glabel ASSET_TEX2D_662 .incbin "./build/us_1.0/textures/2d/unknown_4_662.bin" -glabel ASSET_4_663 +glabel ASSET_TEX2D_663 .incbin "./build/us_1.0/textures/2d/unknown_4_663.bin" -glabel ASSET_4_664 +glabel ASSET_TEX2D_664 .incbin "./build/us_1.0/textures/2d/unknown_4_664.bin" -glabel ASSET_4_665 +glabel ASSET_TEX2D_665 .incbin "./build/us_1.0/textures/2d/unknown_4_665.bin" -glabel ASSET_4_666 +glabel ASSET_TEX2D_666 .incbin "./build/us_1.0/textures/2d/unknown_4_666.bin" -glabel ASSET_4_667 +glabel ASSET_TEX2D_667 .incbin "./build/us_1.0/textures/2d/unknown_4_667.bin" -glabel ASSET_4_668 +glabel ASSET_TEX2D_668 .incbin "./build/us_1.0/textures/2d/unknown_4_668.bin" -glabel ASSET_4_669 +glabel ASSET_TEX2D_669 .incbin "./build/us_1.0/textures/2d/unknown_4_669.bin" -glabel ASSET_4_670 +glabel ASSET_TEX2D_670 .incbin "./build/us_1.0/textures/2d/unknown_4_670.bin" -glabel ASSET_4_671 +glabel ASSET_TEX2D_671 .incbin "./build/us_1.0/textures/2d/unknown_4_671.bin" -glabel ASSET_4_672 +glabel ASSET_TEX2D_672 .incbin "./build/us_1.0/textures/2d/unknown_4_672.bin" -glabel ASSET_4_673 +glabel ASSET_TEX2D_673 .incbin "./build/us_1.0/textures/2d/unknown_4_673.bin" -glabel ASSET_4_674 +glabel ASSET_TEX2D_674 .incbin "./build/us_1.0/textures/2d/unknown_4_674.bin" -glabel ASSET_4_675 +glabel ASSET_TEX2D_675 .incbin "./build/us_1.0/textures/2d/unknown_4_675.bin" -glabel ASSET_4_676 +glabel ASSET_TEX2D_676 .incbin "./build/us_1.0/textures/2d/unknown_4_676.bin" -glabel ASSET_4_677 +glabel ASSET_TEX2D_677 .incbin "./build/us_1.0/textures/2d/unknown_4_677.bin" -glabel ASSET_4_678 +glabel ASSET_TEX2D_678 .incbin "./build/us_1.0/textures/2d/unknown_4_678.bin" -glabel ASSET_4_679 +glabel ASSET_TEX2D_679 .incbin "./build/us_1.0/textures/2d/unknown_4_679.bin" -glabel ASSET_4_680 +glabel ASSET_TEX2D_680 .incbin "./build/us_1.0/textures/2d/unknown_4_680.bin" -glabel ASSET_4_681 +glabel ASSET_TEX2D_681 .incbin "./build/us_1.0/textures/2d/unknown_4_681.bin" -glabel ASSET_4_682 +glabel ASSET_TEX2D_682 .incbin "./build/us_1.0/textures/2d/unknown_4_682.bin" -glabel ASSET_4_683 +glabel ASSET_TEX2D_683 .incbin "./build/us_1.0/textures/2d/unknown_4_683.bin" -glabel ASSET_4_684 +glabel ASSET_TEX2D_684 .incbin "./build/us_1.0/textures/2d/unknown_4_684.bin" -glabel ASSET_4_685 +glabel ASSET_TEX2D_685 .incbin "./build/us_1.0/textures/2d/unknown_4_685.bin" -glabel ASSET_4_686 +glabel ASSET_TEX2D_686 .incbin "./build/us_1.0/textures/2d/unknown_4_686.bin" -glabel ASSET_4_687 +glabel ASSET_TEX2D_687 .incbin "./build/us_1.0/textures/2d/unknown_4_687.bin" -glabel ASSET_4_688 +glabel ASSET_TEX2D_688 .incbin "./build/us_1.0/textures/2d/unknown_4_688.bin" -glabel ASSET_4_689 +glabel ASSET_TEX2D_689 .incbin "./build/us_1.0/textures/2d/unknown_4_689.bin" -glabel ASSET_4_690 +glabel ASSET_TEX2D_690 .incbin "./build/us_1.0/textures/2d/unknown_4_690.bin" -glabel ASSET_4_691 +glabel ASSET_TEX2D_691 .incbin "./build/us_1.0/textures/2d/unknown_4_691.bin" -glabel ASSET_4_692 +glabel ASSET_TEX2D_692 .incbin "./build/us_1.0/textures/2d/unknown_4_692.bin" -glabel ASSET_4_693 +glabel ASSET_TEX2D_693 .incbin "./build/us_1.0/textures/2d/unknown_4_693.bin" -glabel ASSET_4_694 +glabel ASSET_TEX2D_694 .incbin "./build/us_1.0/textures/2d/unknown_4_694.bin" -glabel ASSET_4_695 +glabel ASSET_TEX2D_695 .incbin "./build/us_1.0/textures/2d/unknown_4_695.bin" -glabel ASSET_4_696 +glabel ASSET_TEX2D_696 .incbin "./build/us_1.0/textures/2d/unknown_4_696.bin" -glabel ASSET_4_697 +glabel ASSET_TEX2D_697 .incbin "./build/us_1.0/textures/2d/unknown_4_697.bin" -glabel ASSET_4_698 +glabel ASSET_TEX2D_698 .incbin "./build/us_1.0/textures/2d/unknown_4_698.bin" -glabel ASSET_4_699 +glabel ASSET_TEX2D_699 .incbin "./build/us_1.0/textures/2d/unknown_4_699.bin" -glabel ASSET_4_700 +glabel ASSET_TEX2D_700 .incbin "./build/us_1.0/textures/2d/unknown_4_700.bin" -glabel ASSET_4_701 +glabel ASSET_TEX2D_701 .incbin "./build/us_1.0/textures/2d/unknown_4_701.bin" -glabel ASSET_4_702 +glabel ASSET_TEX2D_702 .incbin "./build/us_1.0/textures/2d/unknown_4_702.bin" -glabel ASSET_4_703 +glabel ASSET_TEX2D_703 .incbin "./build/us_1.0/textures/2d/unknown_4_703.bin" -glabel ASSET_4_704 +glabel ASSET_TEX2D_704 .incbin "./build/us_1.0/textures/2d/unknown_4_704.bin" -glabel ASSET_4_705 +glabel ASSET_TEX2D_705 .incbin "./build/us_1.0/textures/2d/unknown_4_705.bin" -glabel ASSET_4_706 +glabel ASSET_TEX2D_706 .incbin "./build/us_1.0/textures/2d/unknown_4_706.bin" -glabel ASSET_4_707 +glabel ASSET_TEX2D_707 .incbin "./build/us_1.0/textures/2d/unknown_4_707.bin" -glabel ASSET_4_708 +glabel ASSET_TEX2D_708 .incbin "./build/us_1.0/textures/2d/unknown_4_708.bin" -glabel ASSET_4_709 +glabel ASSET_TEX2D_709 .incbin "./build/us_1.0/textures/2d/unknown_4_709.bin" -glabel ASSET_4_710 +glabel ASSET_TEX2D_710 .incbin "./build/us_1.0/textures/2d/unknown_4_710.bin" -glabel ASSET_4_711 +glabel ASSET_TEX2D_711 .incbin "./build/us_1.0/textures/2d/unknown_4_711.bin" -glabel ASSET_4_712 +glabel ASSET_TEX2D_712 .incbin "./build/us_1.0/textures/2d/unknown_4_712.bin" -glabel ASSET_4_713 +glabel ASSET_TEX2D_713 .incbin "./build/us_1.0/textures/2d/unknown_4_713.bin" -glabel ASSET_4_714 +glabel ASSET_TEX2D_714 .incbin "./build/us_1.0/textures/2d/unknown_4_714.bin" -glabel ASSET_4_715 +glabel ASSET_TEX2D_715 .incbin "./build/us_1.0/textures/2d/unknown_4_715.bin" -glabel ASSET_4_716 +glabel ASSET_TEX2D_716 .incbin "./build/us_1.0/textures/2d/unknown_4_716.bin" -glabel ASSET_4_717 +glabel ASSET_TEX2D_717 .incbin "./build/us_1.0/textures/2d/unknown_4_717.bin" -glabel ASSET_4_718 +glabel ASSET_TEX2D_718 .incbin "./build/us_1.0/textures/2d/unknown_4_718.bin" -glabel ASSET_4_719 +glabel ASSET_TEX2D_719 .incbin "./build/us_1.0/textures/2d/unknown_4_719.bin" -glabel ASSET_4_720 +glabel ASSET_TEX2D_720 .incbin "./build/us_1.0/textures/2d/unknown_4_720.bin" -glabel ASSET_4_721 +glabel ASSET_TEX2D_721 .incbin "./build/us_1.0/textures/2d/unknown_4_721.bin" -glabel ASSET_4_722 +glabel ASSET_TEX2D_722 .incbin "./build/us_1.0/textures/2d/unknown_4_722.bin" -glabel ASSET_4_723 +glabel ASSET_TEX2D_723 .incbin "./build/us_1.0/textures/2d/unknown_4_723.bin" -glabel ASSET_4_724 +glabel ASSET_TEX2D_724 .incbin "./build/us_1.0/textures/2d/unknown_4_724.bin" -glabel ASSET_4_725 +glabel ASSET_TEX2D_725 .incbin "./build/us_1.0/textures/2d/unknown_4_725.bin" -glabel ASSET_4_726 +glabel ASSET_TEX2D_726 .incbin "./build/us_1.0/textures/2d/unknown_4_726.bin" -glabel ASSET_4_727 +glabel ASSET_TEX2D_727 .incbin "./build/us_1.0/textures/2d/unknown_4_727.bin" -glabel ASSET_4_728 +glabel ASSET_TEX2D_728 .incbin "./build/us_1.0/textures/2d/unknown_4_728.bin" -glabel ASSET_4_729 +glabel ASSET_TEX2D_729 .incbin "./build/us_1.0/textures/2d/unknown_4_729.bin" -glabel ASSET_4_730 +glabel ASSET_TEX2D_730 .incbin "./build/us_1.0/textures/2d/unknown_4_730.bin" -glabel ASSET_4_731 +glabel ASSET_TEX2D_731 .incbin "./build/us_1.0/textures/2d/unknown_4_731.bin" -glabel ASSET_4_732 +glabel ASSET_TEX2D_732 .incbin "./build/us_1.0/textures/2d/unknown_4_732.bin" -glabel ASSET_4_733 +glabel ASSET_TEX2D_733 .incbin "./build/us_1.0/textures/2d/unknown_4_733.bin" -glabel ASSET_4_734 +glabel ASSET_TEX2D_734 .incbin "./build/us_1.0/textures/2d/unknown_4_734.bin" -glabel ASSET_4_735 +glabel ASSET_TEX2D_735 .incbin "./build/us_1.0/textures/2d/unknown_4_735.bin" -glabel ASSET_4_736 +glabel ASSET_TEX2D_736 .incbin "./build/us_1.0/textures/2d/unknown_4_736.bin" -glabel ASSET_4_737 +glabel ASSET_TEX2D_737 .incbin "./build/us_1.0/textures/2d/unknown_4_737.bin" -glabel ASSET_4_738 +glabel ASSET_TEX2D_738 .incbin "./build/us_1.0/textures/2d/unknown_4_738.bin" -glabel ASSET_4_739 +glabel ASSET_TEX2D_739 .incbin "./build/us_1.0/textures/2d/unknown_4_739.bin" -glabel ASSET_4_740 +glabel ASSET_TEX2D_740 .incbin "./build/us_1.0/textures/2d/unknown_4_740.bin" -glabel ASSET_4_741 +glabel ASSET_TEX2D_741 .incbin "./build/us_1.0/textures/2d/unknown_4_741.bin" -glabel ASSET_4_742 +glabel ASSET_TEX2D_742 .incbin "./build/us_1.0/textures/2d/unknown_4_742.bin" -glabel ASSET_4_743 +glabel ASSET_TEX2D_743 .incbin "./build/us_1.0/textures/2d/unknown_4_743.bin" -glabel ASSET_4_744 +glabel ASSET_TEX2D_744 .incbin "./build/us_1.0/textures/2d/unknown_4_744.bin" -glabel ASSET_4_745 +glabel ASSET_TEX2D_745 .incbin "./build/us_1.0/textures/2d/unknown_4_745.bin" -glabel ASSET_4_746 +glabel ASSET_TEX2D_746 .incbin "./build/us_1.0/textures/2d/unknown_4_746.bin" -glabel ASSET_4_747 +glabel ASSET_TEX2D_747 .incbin "./build/us_1.0/textures/2d/unknown_4_747.bin" -glabel ASSET_4_748 +glabel ASSET_TEX2D_748 .incbin "./build/us_1.0/textures/2d/unknown_4_748.bin" -glabel ASSET_4_749 +glabel ASSET_TEX2D_749 .incbin "./build/us_1.0/textures/2d/unknown_4_749.bin" -glabel ASSET_4_750 +glabel ASSET_TEX2D_750 .incbin "./build/us_1.0/textures/2d/unknown_4_750.bin" -glabel ASSET_4_751 +glabel ASSET_TEX2D_751 .incbin "./build/us_1.0/textures/2d/unknown_4_751.bin" -glabel ASSET_4_752 +glabel ASSET_TEX2D_752 .incbin "./build/us_1.0/textures/2d/unknown_4_752.bin" -glabel ASSET_4_753 +glabel ASSET_TEX2D_753 .incbin "./build/us_1.0/textures/2d/unknown_4_753.bin" -glabel ASSET_4_754 +glabel ASSET_TEX2D_754 .incbin "./build/us_1.0/textures/2d/unknown_4_754.bin" -glabel ASSET_4_755 +glabel ASSET_TEX2D_755 .incbin "./build/us_1.0/textures/2d/unknown_4_755.bin" -glabel ASSET_4_756 +glabel ASSET_TEX2D_756 .incbin "./build/us_1.0/textures/2d/unknown_4_756.bin" -glabel ASSET_4_757 +glabel ASSET_TEX2D_757 .incbin "./build/us_1.0/textures/2d/unknown_4_757.bin" -glabel ASSET_4_758 +glabel ASSET_TEX2D_758 .incbin "./build/us_1.0/textures/2d/unknown_4_758.bin" -glabel ASSET_4_759 +glabel ASSET_TEX2D_759 .incbin "./build/us_1.0/textures/2d/unknown_4_759.bin" -glabel ASSET_4_760 +glabel ASSET_TEX2D_760 .incbin "./build/us_1.0/textures/2d/unknown_4_760.bin" -glabel ASSET_4_761 +glabel ASSET_TEX2D_761 .incbin "./build/us_1.0/textures/2d/unknown_4_761.bin" -glabel ASSET_4_762 +glabel ASSET_TEX2D_762 .incbin "./build/us_1.0/textures/2d/unknown_4_762.bin" -glabel ASSET_4_763 +glabel ASSET_TEX2D_763 .incbin "./build/us_1.0/textures/2d/unknown_4_763.bin" -glabel ASSET_4_764 +glabel ASSET_TEX2D_764 .incbin "./build/us_1.0/textures/2d/unknown_4_764.bin" -glabel ASSET_4_765 +glabel ASSET_TEX2D_765 .incbin "./build/us_1.0/textures/2d/unknown_4_765.bin" -glabel ASSET_4_766 +glabel ASSET_TEX2D_766 .incbin "./build/us_1.0/textures/2d/unknown_4_766.bin" -glabel ASSET_4_767 +glabel ASSET_TEX2D_767 .incbin "./build/us_1.0/textures/2d/unknown_4_767.bin" -glabel ASSET_4_768 +glabel ASSET_TEX2D_768 .incbin "./build/us_1.0/textures/2d/unknown_4_768.bin" -glabel ASSET_4_769 +glabel ASSET_TEX2D_769 .incbin "./build/us_1.0/textures/2d/unknown_4_769.bin" -glabel ASSET_4_770 +glabel ASSET_TEX2D_770 .incbin "./build/us_1.0/textures/2d/unknown_4_770.bin" -glabel ASSET_4_771 +glabel ASSET_TEX2D_771 .incbin "./build/us_1.0/textures/2d/unknown_4_771.bin" -glabel ASSET_4_772 +glabel ASSET_TEX2D_772 .incbin "./build/us_1.0/textures/2d/unknown_4_772.bin" -glabel ASSET_4_773 +glabel ASSET_TEX2D_773 .incbin "./build/us_1.0/textures/2d/unknown_4_773.bin" -glabel ASSET_4_774 +glabel ASSET_TEX2D_774 .incbin "./build/us_1.0/textures/2d/unknown_4_774.bin" -glabel ASSET_4_775 +glabel ASSET_TEX2D_775 .incbin "./build/us_1.0/textures/2d/unknown_4_775.bin" -glabel ASSET_4_776 +glabel ASSET_TEX2D_776 .incbin "./build/us_1.0/textures/2d/unknown_4_776.bin" -glabel ASSET_4_777 +glabel ASSET_TEX2D_777 .incbin "./build/us_1.0/textures/2d/unknown_4_777.bin" -glabel ASSET_4_778 +glabel ASSET_TEX2D_778 .incbin "./build/us_1.0/textures/2d/unknown_4_778.bin" -glabel ASSET_4_779 +glabel ASSET_TEX2D_779 .incbin "./build/us_1.0/textures/2d/unknown_4_779.bin" -glabel ASSET_4_780 +glabel ASSET_TEX2D_780 .incbin "./build/us_1.0/textures/2d/unknown_4_780.bin" -glabel ASSET_4_781 +glabel ASSET_TEX2D_781 .incbin "./build/us_1.0/textures/2d/unknown_4_781.bin" -glabel ASSET_4_782 +glabel ASSET_TEX2D_782 .incbin "./build/us_1.0/textures/2d/unknown_4_782.bin" -glabel ASSET_4_783 +glabel ASSET_TEX2D_783 .incbin "./build/us_1.0/textures/2d/unknown_4_783.bin" -glabel ASSET_4_784 +glabel ASSET_TEX2D_784 .incbin "./build/us_1.0/textures/2d/unknown_4_784.bin" -glabel ASSET_4_785 +glabel ASSET_TEX2D_785 .incbin "./build/us_1.0/textures/2d/unknown_4_785.bin" -glabel ASSET_4_786 +glabel ASSET_TEX2D_786 .incbin "./build/us_1.0/textures/2d/unknown_4_786.bin" -glabel ASSET_4_787 +glabel ASSET_TEX2D_787 .incbin "./build/us_1.0/textures/2d/unknown_4_787.bin" -glabel ASSET_4_788 +glabel ASSET_TEX2D_788 .incbin "./build/us_1.0/textures/2d/unknown_4_788.bin" -glabel ASSET_4_789 +glabel ASSET_TEX2D_789 .incbin "./build/us_1.0/textures/2d/unknown_4_789.bin" -glabel ASSET_4_790 +glabel ASSET_TEX2D_790 .incbin "./build/us_1.0/textures/2d/unknown_4_790.bin" -glabel ASSET_4_791 +glabel ASSET_TEX2D_791 .incbin "./build/us_1.0/textures/2d/unknown_4_791.bin" -glabel ASSET_4_792 +glabel ASSET_TEX2D_792 .incbin "./build/us_1.0/textures/2d/unknown_4_792.bin" -glabel ASSET_4_793 +glabel ASSET_TEX2D_793 .incbin "./build/us_1.0/textures/2d/unknown_4_793.bin" -glabel ASSET_4_794 +glabel ASSET_TEX2D_794 .incbin "./build/us_1.0/textures/2d/unknown_4_794.bin" -glabel ASSET_4_795 +glabel ASSET_TEX2D_795 .incbin "./build/us_1.0/textures/2d/unknown_4_795.bin" -glabel ASSET_4_796 +glabel ASSET_TEX2D_796 .incbin "./build/us_1.0/textures/2d/unknown_4_796.bin" -glabel ASSET_4_797 +glabel ASSET_TEX2D_797 .incbin "./build/us_1.0/textures/2d/unknown_4_797.bin" -glabel ASSET_4_798 +glabel ASSET_TEX2D_798 .incbin "./build/us_1.0/textures/2d/unknown_4_798.bin" -glabel ASSET_4_799 +glabel ASSET_TEX2D_799 .incbin "./build/us_1.0/textures/2d/unknown_4_799.bin" -glabel ASSET_4_800 +glabel ASSET_TEX2D_800 .incbin "./build/us_1.0/textures/2d/unknown_4_800.bin" -glabel ASSET_4_801 +glabel ASSET_TEX2D_801 .incbin "./build/us_1.0/textures/2d/unknown_4_801.bin" -glabel ASSET_4_802 +glabel ASSET_TEX2D_802 .incbin "./build/us_1.0/textures/2d/unknown_4_802.bin" -glabel ASSET_4_803 +glabel ASSET_TEX2D_803 .incbin "./build/us_1.0/textures/2d/unknown_4_803.bin" -glabel ASSET_4_804 +glabel ASSET_TEX2D_804 .incbin "./build/us_1.0/textures/2d/unknown_4_804.bin" -glabel ASSET_4_805 +glabel ASSET_TEX2D_805 .incbin "./build/us_1.0/textures/2d/unknown_4_805.bin" -glabel ASSET_4_806 +glabel ASSET_TEX2D_806 .incbin "./build/us_1.0/textures/2d/unknown_4_806.bin" -glabel ASSET_4_807 +glabel ASSET_TEX2D_807 .incbin "./build/us_1.0/textures/2d/unknown_4_807.bin" -glabel ASSET_4_808 +glabel ASSET_TEX2D_808 .incbin "./build/us_1.0/textures/2d/unknown_4_808.bin" -glabel ASSET_4_809 +glabel ASSET_TEX2D_809 .incbin "./build/us_1.0/textures/2d/unknown_4_809.bin" -glabel ASSET_4_810 +glabel ASSET_TEX2D_810 .incbin "./build/us_1.0/textures/2d/unknown_4_810.bin" -glabel ASSET_4_811 +glabel ASSET_TEX2D_811 .incbin "./build/us_1.0/textures/2d/unknown_4_811.bin" -glabel ASSET_4_812 +glabel ASSET_TEX2D_812 .incbin "./build/us_1.0/textures/2d/unknown_4_812.bin" -glabel ASSET_4_813 +glabel ASSET_TEX2D_813 .incbin "./build/us_1.0/textures/2d/unknown_4_813.bin" -glabel ASSET_4_814 +glabel ASSET_TEX2D_814 .incbin "./build/us_1.0/textures/2d/unknown_4_814.bin" -glabel ASSET_4_815 +glabel ASSET_TEX2D_815 .incbin "./build/us_1.0/textures/2d/unknown_4_815.bin" -glabel ASSET_4_816 +glabel ASSET_TEX2D_816 .incbin "./build/us_1.0/textures/2d/unknown_4_816.bin" -glabel ASSET_4_817 +glabel ASSET_TEX2D_817 .incbin "./build/us_1.0/textures/2d/unknown_4_817.bin" -glabel ASSET_4_818 +glabel ASSET_TEX2D_818 .incbin "./build/us_1.0/textures/2d/unknown_4_818.bin" -glabel ASSET_4_819 +glabel ASSET_TEX2D_819 .incbin "./build/us_1.0/textures/2d/unknown_4_819.bin" -glabel ASSET_4_820 +glabel ASSET_TEX2D_820 .incbin "./build/us_1.0/textures/2d/unknown_4_820.bin" -glabel ASSET_4_821 +glabel ASSET_TEX2D_821 .incbin "./build/us_1.0/textures/2d/unknown_4_821.bin" -glabel ASSET_4_822 +glabel ASSET_TEX2D_822 .incbin "./build/us_1.0/textures/2d/unknown_4_822.bin" -glabel ASSET_4_823 +glabel ASSET_TEX2D_823 .incbin "./build/us_1.0/textures/2d/unknown_4_823.bin" -glabel ASSET_4_824 +glabel ASSET_TEX2D_824 .incbin "./build/us_1.0/textures/2d/unknown_4_824.bin" -glabel ASSET_4_825 +glabel ASSET_TEX2D_825 .incbin "./build/us_1.0/textures/2d/unknown_4_825.bin" -glabel ASSET_4_826 +glabel ASSET_TEX2D_826 .incbin "./build/us_1.0/textures/2d/unknown_4_826.bin" -glabel ASSET_4_827 +glabel ASSET_TEX2D_827 .incbin "./build/us_1.0/textures/2d/unknown_4_827.bin" -glabel ASSET_4_828 +glabel ASSET_TEX2D_828 .incbin "./build/us_1.0/textures/2d/unknown_4_828.bin" -glabel ASSET_4_829 +glabel ASSET_TEX2D_829 .incbin "./build/us_1.0/textures/2d/unknown_4_829.bin" -glabel ASSET_4_830 +glabel ASSET_TEX2D_830 .incbin "./build/us_1.0/textures/2d/unknown_4_830.bin" -glabel ASSET_4_831 +glabel ASSET_TEX2D_831 .incbin "./build/us_1.0/textures/2d/unknown_4_831.bin" -glabel ASSET_4_832 +glabel ASSET_TEX2D_832 .incbin "./build/us_1.0/textures/2d/unknown_4_832.bin" -glabel ASSET_4_833 +glabel ASSET_TEX2D_833 .incbin "./build/us_1.0/textures/2d/unknown_4_833.bin" -glabel ASSET_4_834 +glabel ASSET_TEX2D_834 .incbin "./build/us_1.0/textures/2d/unknown_4_834.bin" -glabel ASSET_4_835 +glabel ASSET_TEX2D_835 .incbin "./build/us_1.0/textures/2d/unknown_4_835.bin" -glabel ASSET_4_836 +glabel ASSET_TEX2D_836 .incbin "./build/us_1.0/textures/2d/unknown_4_836.bin" -glabel ASSET_4_837 +glabel ASSET_TEX2D_837 .incbin "./build/us_1.0/textures/2d/unknown_4_837.bin" -glabel ASSET_4_838 +glabel ASSET_TEX2D_838 .incbin "./build/us_1.0/textures/2d/unknown_4_838.bin" -glabel ASSET_4_839 +glabel ASSET_TEX2D_839 .incbin "./build/us_1.0/textures/2d/unknown_4_839.bin" -glabel ASSET_4_840 +glabel ASSET_TEX2D_840 .incbin "./build/us_1.0/textures/2d/unknown_4_840.bin" -glabel ASSET_4_841 +glabel ASSET_TEX2D_841 .incbin "./build/us_1.0/textures/2d/unknown_4_841.bin" -glabel ASSET_4_842 +glabel ASSET_TEX2D_842 .incbin "./build/us_1.0/textures/2d/unknown_4_842.bin" -glabel ASSET_4_843 +glabel ASSET_TEX2D_843 .incbin "./build/us_1.0/textures/2d/unknown_4_843.bin" -glabel ASSET_4_844 +glabel ASSET_TEX2D_844 .incbin "./build/us_1.0/textures/2d/unknown_4_844.bin" -glabel ASSET_4_845 +glabel ASSET_TEX2D_845 .incbin "./build/us_1.0/textures/2d/unknown_4_845.bin" -glabel ASSET_4_846 +glabel ASSET_TEX2D_846 .incbin "./build/us_1.0/textures/2d/unknown_4_846.bin" -glabel ASSET_4_847 +glabel ASSET_TEX2D_847 .incbin "./build/us_1.0/textures/2d/unknown_4_847.bin" -glabel ASSET_4_848 +glabel ASSET_TEX2D_848 .incbin "./build/us_1.0/textures/2d/unknown_4_848.bin" -glabel ASSET_4_849 +glabel ASSET_TEX2D_849 .incbin "./build/us_1.0/textures/2d/unknown_4_849.bin" -glabel ASSET_4_850 +glabel ASSET_TEX2D_850 .incbin "./build/us_1.0/textures/2d/unknown_4_850.bin" -glabel ASSET_4_851 +glabel ASSET_TEX2D_851 .incbin "./build/us_1.0/textures/2d/unknown_4_851.bin" -glabel ASSET_4_852 +glabel ASSET_TEX2D_852 .incbin "./build/us_1.0/textures/2d/unknown_4_852.bin" -glabel ASSET_4_853 +glabel ASSET_TEX2D_853 .incbin "./build/us_1.0/textures/2d/unknown_4_853.bin" -glabel ASSET_4_854 +glabel ASSET_TEX2D_854 .incbin "./build/us_1.0/textures/2d/unknown_4_854.bin" -glabel ASSET_4_855 +glabel ASSET_TEX2D_855 .incbin "./build/us_1.0/textures/2d/unknown_4_855.bin" -glabel ASSET_4_856 +glabel ASSET_TEX2D_856 .incbin "./build/us_1.0/textures/2d/unknown_4_856.bin" -glabel ASSET_4_857 +glabel ASSET_TEX2D_857 .incbin "./build/us_1.0/textures/2d/unknown_4_857.bin" -glabel ASSET_4_858 +glabel ASSET_TEX2D_858 .incbin "./build/us_1.0/textures/2d/unknown_4_858.bin" -glabel ASSET_4_859 +glabel ASSET_TEX2D_859 .incbin "./build/us_1.0/textures/2d/unknown_4_859.bin" -glabel ASSET_4_860 +glabel ASSET_TEX2D_860 .incbin "./build/us_1.0/textures/2d/unknown_4_860.bin" -glabel ASSET_4_861 +glabel ASSET_TEX2D_861 .incbin "./build/us_1.0/textures/2d/unknown_4_861.bin" -glabel ASSET_4_862 +glabel ASSET_TEX2D_862 .incbin "./build/us_1.0/textures/2d/unknown_4_862.bin" -glabel ASSET_4_863 +glabel ASSET_TEX2D_863 .incbin "./build/us_1.0/textures/2d/unknown_4_863.bin" -glabel ASSET_4_864 +glabel ASSET_TEX2D_864 .incbin "./build/us_1.0/textures/2d/unknown_4_864.bin" -glabel ASSET_4_865 +glabel ASSET_TEX2D_865 .incbin "./build/us_1.0/textures/2d/unknown_4_865.bin" -glabel ASSET_4_866 +glabel ASSET_TEX2D_866 .incbin "./build/us_1.0/textures/2d/unknown_4_866.bin" -glabel ASSET_4_867 +glabel ASSET_TEX2D_867 .incbin "./build/us_1.0/textures/2d/unknown_4_867.bin" -glabel ASSET_4_868 +glabel ASSET_TEX2D_868 .incbin "./build/us_1.0/textures/2d/unknown_4_868.bin" -glabel ASSET_4_869 +glabel ASSET_TEX2D_869 .incbin "./build/us_1.0/textures/2d/unknown_4_869.bin" -glabel ASSET_4_870 +glabel ASSET_TEX2D_870 .incbin "./build/us_1.0/textures/2d/unknown_4_870.bin" -glabel ASSET_4_871 +glabel ASSET_TEX2D_871 .incbin "./build/us_1.0/textures/2d/unknown_4_871.bin" -glabel ASSET_4_872 +glabel ASSET_TEX2D_872 .incbin "./build/us_1.0/textures/2d/unknown_4_872.bin" -glabel ASSET_4_873 +glabel ASSET_TEX2D_873 .incbin "./build/us_1.0/textures/2d/unknown_4_873.bin" -glabel ASSET_4_874 +glabel ASSET_TEX2D_874 .incbin "./build/us_1.0/textures/2d/unknown_4_874.bin" -glabel ASSET_4_875 +glabel ASSET_TEX2D_875 .incbin "./build/us_1.0/textures/2d/unknown_4_875.bin" -glabel ASSET_4_876 +glabel ASSET_TEX2D_876 .incbin "./build/us_1.0/textures/2d/unknown_4_876.bin" -glabel ASSET_4_877 +glabel ASSET_TEX2D_877 .incbin "./build/us_1.0/textures/2d/unknown_4_877.bin" -glabel ASSET_4_878 +glabel ASSET_TEX2D_878 .incbin "./build/us_1.0/textures/2d/unknown_4_878.bin" -glabel ASSET_4_879 +glabel ASSET_TEX2D_879 .incbin "./build/us_1.0/textures/2d/unknown_4_879.bin" -glabel ASSET_4_880 +glabel ASSET_TEX2D_880 .incbin "./build/us_1.0/textures/2d/unknown_4_880.bin" -glabel ASSET_4_881 +glabel ASSET_TEX2D_881 .incbin "./build/us_1.0/textures/2d/unknown_4_881.bin" -glabel ASSET_4_882 +glabel ASSET_TEX2D_882 .incbin "./build/us_1.0/textures/2d/unknown_4_882.bin" -glabel ASSET_4_883 +glabel ASSET_TEX2D_883 .incbin "./build/us_1.0/textures/2d/unknown_4_883.bin" -glabel ASSET_4_884 +glabel ASSET_TEX2D_884 .incbin "./build/us_1.0/textures/2d/unknown_4_884.bin" -glabel ASSET_4_885 +glabel ASSET_TEX2D_885 .incbin "./build/us_1.0/textures/2d/unknown_4_885.bin" -glabel ASSET_4_886 +glabel ASSET_TEX2D_886 .incbin "./build/us_1.0/textures/2d/unknown_4_886.bin" -glabel ASSET_4_887 +glabel ASSET_TEX2D_887 .incbin "./build/us_1.0/textures/2d/unknown_4_887.bin" -glabel ASSET_4_888 +glabel ASSET_TEX2D_888 .incbin "./build/us_1.0/textures/2d/unknown_4_888.bin" -glabel ASSET_4_889 +glabel ASSET_TEX2D_889 .incbin "./build/us_1.0/textures/2d/unknown_4_889.bin" -glabel ASSET_4_890 +glabel ASSET_TEX2D_890 .incbin "./build/us_1.0/textures/2d/unknown_4_890.bin" -glabel ASSET_4_891 +glabel ASSET_TEX2D_891 .incbin "./build/us_1.0/textures/2d/unknown_4_891.bin" -glabel ASSET_4_892 +glabel ASSET_TEX2D_892 .incbin "./build/us_1.0/textures/2d/unknown_4_892.bin" -glabel ASSET_4_893 +glabel ASSET_TEX2D_893 .incbin "./build/us_1.0/textures/2d/unknown_4_893.bin" -glabel ASSET_4_894 +glabel ASSET_TEX2D_894 .incbin "./build/us_1.0/textures/2d/unknown_4_894.bin" -glabel ASSET_4_895 +glabel ASSET_TEX2D_895 .incbin "./build/us_1.0/textures/2d/unknown_4_895.bin" -glabel ASSET_4_896 +glabel ASSET_TEX2D_896 .incbin "./build/us_1.0/textures/2d/unknown_4_896.bin" -glabel ASSET_4_897 +glabel ASSET_TEX2D_897 .incbin "./build/us_1.0/textures/2d/unknown_4_897.bin" -glabel ASSET_4_898 +glabel ASSET_TEX2D_898 .incbin "./build/us_1.0/textures/2d/unknown_4_898.bin" -glabel ASSET_4_899 +glabel ASSET_TEX2D_899 .incbin "./build/us_1.0/textures/2d/unknown_4_899.bin" -glabel ASSET_4_900 +glabel ASSET_TEX2D_900 .incbin "./build/us_1.0/textures/2d/unknown_4_900.bin" -glabel ASSET_4_901 +glabel ASSET_TEX2D_901 .incbin "./build/us_1.0/textures/2d/unknown_4_901.bin" -glabel ASSET_4_902 +glabel ASSET_TEX2D_902 .incbin "./build/us_1.0/textures/2d/unknown_4_902.bin" -glabel ASSET_4_903 +glabel ASSET_TEX2D_903 .incbin "./build/us_1.0/textures/2d/unknown_4_903.bin" -glabel ASSET_4_904 +glabel ASSET_TEX2D_904 .incbin "./build/us_1.0/textures/2d/unknown_4_904.bin" -glabel ASSET_4_905 +glabel ASSET_TEX2D_905 .incbin "./build/us_1.0/textures/2d/unknown_4_905.bin" -glabel ASSET_SECTION_4_END +glabel ASSET_TEXTURES_2D_END + +/********** ASSET_TEXTURES_2D_TABLE **********/ .balign 16 -glabel ASSET_SECTION_5 -.word ASSET_4_0 - ASSET_SECTION_4 -.word ASSET_4_1 - ASSET_SECTION_4 -.word ASSET_4_2 - ASSET_SECTION_4 -.word ASSET_4_3 - ASSET_SECTION_4 -.word ASSET_4_4 - ASSET_SECTION_4 -.word ASSET_4_5 - ASSET_SECTION_4 -.word ASSET_4_6 - ASSET_SECTION_4 -.word ASSET_4_7 - ASSET_SECTION_4 -.word ASSET_4_8 - ASSET_SECTION_4 -.word ASSET_4_9 - ASSET_SECTION_4 -.word ASSET_4_10 - ASSET_SECTION_4 -.word ASSET_4_11 - ASSET_SECTION_4 -.word ASSET_4_12 - ASSET_SECTION_4 -.word ASSET_4_13 - ASSET_SECTION_4 -.word ASSET_4_14 - ASSET_SECTION_4 -.word ASSET_4_15 - ASSET_SECTION_4 -.word ASSET_4_16 - ASSET_SECTION_4 -.word ASSET_4_17 - ASSET_SECTION_4 -.word ASSET_4_18 - ASSET_SECTION_4 -.word ASSET_4_19 - ASSET_SECTION_4 -.word ASSET_4_20 - ASSET_SECTION_4 -.word ASSET_4_21 - ASSET_SECTION_4 -.word ASSET_4_22 - ASSET_SECTION_4 -.word ASSET_4_23 - ASSET_SECTION_4 -.word ASSET_4_24 - ASSET_SECTION_4 -.word ASSET_4_25 - ASSET_SECTION_4 -.word ASSET_4_26 - ASSET_SECTION_4 -.word ASSET_4_27 - ASSET_SECTION_4 -.word ASSET_4_28 - ASSET_SECTION_4 -.word ASSET_4_29 - ASSET_SECTION_4 -.word ASSET_4_30 - ASSET_SECTION_4 -.word ASSET_4_31 - ASSET_SECTION_4 -.word ASSET_4_32 - ASSET_SECTION_4 -.word ASSET_4_33 - ASSET_SECTION_4 -.word ASSET_4_34 - ASSET_SECTION_4 -.word ASSET_4_35 - ASSET_SECTION_4 -.word ASSET_4_36 - ASSET_SECTION_4 -.word ASSET_4_37 - ASSET_SECTION_4 -.word ASSET_4_38 - ASSET_SECTION_4 -.word ASSET_4_39 - ASSET_SECTION_4 -.word ASSET_4_40 - ASSET_SECTION_4 -.word ASSET_4_41 - ASSET_SECTION_4 -.word ASSET_4_42 - ASSET_SECTION_4 -.word ASSET_4_43 - ASSET_SECTION_4 -.word ASSET_4_44 - ASSET_SECTION_4 -.word ASSET_4_45 - ASSET_SECTION_4 -.word ASSET_4_46 - ASSET_SECTION_4 -.word ASSET_4_47 - ASSET_SECTION_4 -.word ASSET_4_48 - ASSET_SECTION_4 -.word ASSET_4_49 - ASSET_SECTION_4 -.word ASSET_4_50 - ASSET_SECTION_4 -.word ASSET_4_51 - ASSET_SECTION_4 -.word ASSET_4_52 - ASSET_SECTION_4 -.word ASSET_4_53 - ASSET_SECTION_4 -.word ASSET_4_54 - ASSET_SECTION_4 -.word ASSET_4_55 - ASSET_SECTION_4 -.word ASSET_4_56 - ASSET_SECTION_4 -.word ASSET_4_57 - ASSET_SECTION_4 -.word ASSET_4_58 - ASSET_SECTION_4 -.word ASSET_4_59 - ASSET_SECTION_4 -.word ASSET_4_60 - ASSET_SECTION_4 -.word ASSET_4_61 - ASSET_SECTION_4 -.word ASSET_4_62 - ASSET_SECTION_4 -.word ASSET_4_63 - ASSET_SECTION_4 -.word ASSET_4_64 - ASSET_SECTION_4 -.word ASSET_4_65 - ASSET_SECTION_4 -.word ASSET_4_66 - ASSET_SECTION_4 -.word ASSET_4_67 - ASSET_SECTION_4 -.word ASSET_4_68 - ASSET_SECTION_4 -.word ASSET_4_69 - ASSET_SECTION_4 -.word ASSET_4_70 - ASSET_SECTION_4 -.word ASSET_4_71 - ASSET_SECTION_4 -.word ASSET_4_72 - ASSET_SECTION_4 -.word ASSET_4_73 - ASSET_SECTION_4 -.word ASSET_4_74 - ASSET_SECTION_4 -.word ASSET_4_75 - ASSET_SECTION_4 -.word ASSET_4_76 - ASSET_SECTION_4 -.word ASSET_4_77 - ASSET_SECTION_4 -.word ASSET_4_78 - ASSET_SECTION_4 -.word ASSET_4_79 - ASSET_SECTION_4 -.word ASSET_4_80 - ASSET_SECTION_4 -.word ASSET_4_81 - ASSET_SECTION_4 -.word ASSET_4_82 - ASSET_SECTION_4 -.word ASSET_4_83 - ASSET_SECTION_4 -.word ASSET_4_84 - ASSET_SECTION_4 -.word ASSET_4_85 - ASSET_SECTION_4 -.word ASSET_4_86 - ASSET_SECTION_4 -.word ASSET_4_87 - ASSET_SECTION_4 -.word ASSET_4_88 - ASSET_SECTION_4 -.word ASSET_4_89 - ASSET_SECTION_4 -.word ASSET_4_90 - ASSET_SECTION_4 -.word ASSET_4_91 - ASSET_SECTION_4 -.word ASSET_4_92 - ASSET_SECTION_4 -.word ASSET_4_93 - ASSET_SECTION_4 -.word ASSET_4_94 - ASSET_SECTION_4 -.word ASSET_4_95 - ASSET_SECTION_4 -.word ASSET_4_96 - ASSET_SECTION_4 -.word ASSET_4_97 - ASSET_SECTION_4 -.word ASSET_4_98 - ASSET_SECTION_4 -.word ASSET_4_99 - ASSET_SECTION_4 -.word ASSET_4_100 - ASSET_SECTION_4 -.word ASSET_4_101 - ASSET_SECTION_4 -.word ASSET_4_102 - ASSET_SECTION_4 -.word ASSET_4_103 - ASSET_SECTION_4 -.word ASSET_4_104 - ASSET_SECTION_4 -.word ASSET_4_105 - ASSET_SECTION_4 -.word ASSET_4_106 - ASSET_SECTION_4 -.word ASSET_4_107 - ASSET_SECTION_4 -.word ASSET_4_108 - ASSET_SECTION_4 -.word ASSET_4_109 - ASSET_SECTION_4 -.word ASSET_4_110 - ASSET_SECTION_4 -.word ASSET_4_111 - ASSET_SECTION_4 -.word ASSET_4_112 - ASSET_SECTION_4 -.word ASSET_4_113 - ASSET_SECTION_4 -.word ASSET_4_114 - ASSET_SECTION_4 -.word ASSET_4_115 - ASSET_SECTION_4 -.word ASSET_4_116 - ASSET_SECTION_4 -.word ASSET_4_117 - ASSET_SECTION_4 -.word ASSET_4_118 - ASSET_SECTION_4 -.word ASSET_4_119 - ASSET_SECTION_4 -.word ASSET_4_120 - ASSET_SECTION_4 -.word ASSET_4_121 - ASSET_SECTION_4 -.word ASSET_4_122 - ASSET_SECTION_4 -.word ASSET_4_123 - ASSET_SECTION_4 -.word ASSET_4_124 - ASSET_SECTION_4 -.word ASSET_4_125 - ASSET_SECTION_4 -.word ASSET_4_126 - ASSET_SECTION_4 -.word ASSET_4_127 - ASSET_SECTION_4 -.word ASSET_4_128 - ASSET_SECTION_4 -.word ASSET_4_129 - ASSET_SECTION_4 -.word ASSET_4_130 - ASSET_SECTION_4 -.word ASSET_4_131 - ASSET_SECTION_4 -.word ASSET_4_132 - ASSET_SECTION_4 -.word ASSET_4_133 - ASSET_SECTION_4 -.word ASSET_4_134 - ASSET_SECTION_4 -.word ASSET_4_135 - ASSET_SECTION_4 -.word ASSET_4_136 - ASSET_SECTION_4 -.word ASSET_4_137 - ASSET_SECTION_4 -.word ASSET_4_138 - ASSET_SECTION_4 -.word ASSET_4_139 - ASSET_SECTION_4 -.word ASSET_4_140 - ASSET_SECTION_4 -.word ASSET_4_141 - ASSET_SECTION_4 -.word ASSET_4_142 - ASSET_SECTION_4 -.word ASSET_4_143 - ASSET_SECTION_4 -.word ASSET_4_144 - ASSET_SECTION_4 -.word ASSET_4_145 - ASSET_SECTION_4 -.word ASSET_4_146 - ASSET_SECTION_4 -.word ASSET_4_147 - ASSET_SECTION_4 -.word ASSET_4_148 - ASSET_SECTION_4 -.word ASSET_4_149 - ASSET_SECTION_4 -.word ASSET_4_150 - ASSET_SECTION_4 -.word ASSET_4_151 - ASSET_SECTION_4 -.word ASSET_4_152 - ASSET_SECTION_4 -.word ASSET_4_153 - ASSET_SECTION_4 -.word ASSET_4_154 - ASSET_SECTION_4 -.word ASSET_4_155 - ASSET_SECTION_4 -.word ASSET_4_156 - ASSET_SECTION_4 -.word ASSET_4_157 - ASSET_SECTION_4 -.word ASSET_4_158 - ASSET_SECTION_4 -.word ASSET_4_159 - ASSET_SECTION_4 -.word ASSET_4_160 - ASSET_SECTION_4 -.word ASSET_4_161 - ASSET_SECTION_4 -.word ASSET_4_162 - ASSET_SECTION_4 -.word ASSET_4_163 - ASSET_SECTION_4 -.word ASSET_4_164 - ASSET_SECTION_4 -.word ASSET_4_165 - ASSET_SECTION_4 -.word ASSET_4_166 - ASSET_SECTION_4 -.word ASSET_4_167 - ASSET_SECTION_4 -.word ASSET_4_168 - ASSET_SECTION_4 -.word ASSET_4_169 - ASSET_SECTION_4 -.word ASSET_4_170 - ASSET_SECTION_4 -.word ASSET_4_171 - ASSET_SECTION_4 -.word ASSET_4_172 - ASSET_SECTION_4 -.word ASSET_4_173 - ASSET_SECTION_4 -.word ASSET_4_174 - ASSET_SECTION_4 -.word ASSET_4_175 - ASSET_SECTION_4 -.word ASSET_4_176 - ASSET_SECTION_4 -.word ASSET_4_177 - ASSET_SECTION_4 -.word ASSET_4_178 - ASSET_SECTION_4 -.word ASSET_4_179 - ASSET_SECTION_4 -.word ASSET_4_180 - ASSET_SECTION_4 -.word ASSET_4_181 - ASSET_SECTION_4 -.word ASSET_4_182 - ASSET_SECTION_4 -.word ASSET_4_183 - ASSET_SECTION_4 -.word ASSET_4_184 - ASSET_SECTION_4 -.word ASSET_4_185 - ASSET_SECTION_4 -.word ASSET_4_186 - ASSET_SECTION_4 -.word ASSET_4_187 - ASSET_SECTION_4 -.word ASSET_4_188 - ASSET_SECTION_4 -.word ASSET_4_189 - ASSET_SECTION_4 -.word ASSET_4_190 - ASSET_SECTION_4 -.word ASSET_4_191 - ASSET_SECTION_4 -.word ASSET_4_192 - ASSET_SECTION_4 -.word ASSET_4_193 - ASSET_SECTION_4 -.word ASSET_4_194 - ASSET_SECTION_4 -.word ASSET_4_195 - ASSET_SECTION_4 -.word ASSET_4_196 - ASSET_SECTION_4 -.word ASSET_4_197 - ASSET_SECTION_4 -.word ASSET_4_198 - ASSET_SECTION_4 -.word ASSET_4_199 - ASSET_SECTION_4 -.word ASSET_4_200 - ASSET_SECTION_4 -.word ASSET_4_201 - ASSET_SECTION_4 -.word ASSET_4_202 - ASSET_SECTION_4 -.word ASSET_4_203 - ASSET_SECTION_4 -.word ASSET_4_204 - ASSET_SECTION_4 -.word ASSET_4_205 - ASSET_SECTION_4 -.word ASSET_4_206 - ASSET_SECTION_4 -.word ASSET_4_207 - ASSET_SECTION_4 -.word ASSET_4_208 - ASSET_SECTION_4 -.word ASSET_4_209 - ASSET_SECTION_4 -.word ASSET_4_210 - ASSET_SECTION_4 -.word ASSET_4_211 - ASSET_SECTION_4 -.word ASSET_4_212 - ASSET_SECTION_4 -.word ASSET_4_213 - ASSET_SECTION_4 -.word ASSET_4_214 - ASSET_SECTION_4 -.word ASSET_4_215 - ASSET_SECTION_4 -.word ASSET_4_216 - ASSET_SECTION_4 -.word ASSET_4_217 - ASSET_SECTION_4 -.word ASSET_4_218 - ASSET_SECTION_4 -.word ASSET_4_219 - ASSET_SECTION_4 -.word ASSET_4_220 - ASSET_SECTION_4 -.word ASSET_4_221 - ASSET_SECTION_4 -.word ASSET_4_222 - ASSET_SECTION_4 -.word ASSET_4_223 - ASSET_SECTION_4 -.word ASSET_4_224 - ASSET_SECTION_4 -.word ASSET_4_225 - ASSET_SECTION_4 -.word ASSET_4_226 - ASSET_SECTION_4 -.word ASSET_4_227 - ASSET_SECTION_4 -.word ASSET_4_228 - ASSET_SECTION_4 -.word ASSET_4_229 - ASSET_SECTION_4 -.word ASSET_4_230 - ASSET_SECTION_4 -.word ASSET_4_231 - ASSET_SECTION_4 -.word ASSET_4_232 - ASSET_SECTION_4 -.word ASSET_4_233 - ASSET_SECTION_4 -.word ASSET_4_234 - ASSET_SECTION_4 -.word ASSET_4_235 - ASSET_SECTION_4 -.word ASSET_4_236 - ASSET_SECTION_4 -.word ASSET_4_237 - ASSET_SECTION_4 -.word ASSET_4_238 - ASSET_SECTION_4 -.word ASSET_4_239 - ASSET_SECTION_4 -.word ASSET_4_240 - ASSET_SECTION_4 -.word ASSET_4_241 - ASSET_SECTION_4 -.word ASSET_4_242 - ASSET_SECTION_4 -.word ASSET_4_243 - ASSET_SECTION_4 -.word ASSET_4_244 - ASSET_SECTION_4 -.word ASSET_4_245 - ASSET_SECTION_4 -.word ASSET_4_246 - ASSET_SECTION_4 -.word ASSET_4_247 - ASSET_SECTION_4 -.word ASSET_4_248 - ASSET_SECTION_4 -.word ASSET_4_249 - ASSET_SECTION_4 -.word ASSET_4_250 - ASSET_SECTION_4 -.word ASSET_4_251 - ASSET_SECTION_4 -.word ASSET_4_252 - ASSET_SECTION_4 -.word ASSET_4_253 - ASSET_SECTION_4 -.word ASSET_4_254 - ASSET_SECTION_4 -.word ASSET_4_255 - ASSET_SECTION_4 -.word ASSET_4_256 - ASSET_SECTION_4 -.word ASSET_4_257 - ASSET_SECTION_4 -.word ASSET_4_258 - ASSET_SECTION_4 -.word ASSET_4_259 - ASSET_SECTION_4 -.word ASSET_4_260 - ASSET_SECTION_4 -.word ASSET_4_261 - ASSET_SECTION_4 -.word ASSET_4_262 - ASSET_SECTION_4 -.word ASSET_4_263 - ASSET_SECTION_4 -.word ASSET_4_264 - ASSET_SECTION_4 -.word ASSET_4_265 - ASSET_SECTION_4 -.word ASSET_4_266 - ASSET_SECTION_4 -.word ASSET_4_267 - ASSET_SECTION_4 -.word ASSET_4_268 - ASSET_SECTION_4 -.word ASSET_4_269 - ASSET_SECTION_4 -.word ASSET_4_270 - ASSET_SECTION_4 -.word ASSET_4_271 - ASSET_SECTION_4 -.word ASSET_4_272 - ASSET_SECTION_4 -.word ASSET_4_273 - ASSET_SECTION_4 -.word ASSET_4_274 - ASSET_SECTION_4 -.word ASSET_4_275 - ASSET_SECTION_4 -.word ASSET_4_276 - ASSET_SECTION_4 -.word ASSET_4_277 - ASSET_SECTION_4 -.word ASSET_4_278 - ASSET_SECTION_4 -.word ASSET_4_279 - ASSET_SECTION_4 -.word ASSET_4_280 - ASSET_SECTION_4 -.word ASSET_4_281 - ASSET_SECTION_4 -.word ASSET_4_282 - ASSET_SECTION_4 -.word ASSET_4_283 - ASSET_SECTION_4 -.word ASSET_4_284 - ASSET_SECTION_4 -.word ASSET_4_285 - ASSET_SECTION_4 -.word ASSET_4_286 - ASSET_SECTION_4 -.word ASSET_4_287 - ASSET_SECTION_4 -.word ASSET_4_288 - ASSET_SECTION_4 -.word ASSET_4_289 - ASSET_SECTION_4 -.word ASSET_4_290 - ASSET_SECTION_4 -.word ASSET_4_291 - ASSET_SECTION_4 -.word ASSET_4_292 - ASSET_SECTION_4 -.word ASSET_4_293 - ASSET_SECTION_4 -.word ASSET_4_294 - ASSET_SECTION_4 -.word ASSET_4_295 - ASSET_SECTION_4 -.word ASSET_4_296 - ASSET_SECTION_4 -.word ASSET_4_297 - ASSET_SECTION_4 -.word ASSET_4_298 - ASSET_SECTION_4 -.word ASSET_4_299 - ASSET_SECTION_4 -.word ASSET_4_300 - ASSET_SECTION_4 -.word ASSET_4_301 - ASSET_SECTION_4 -.word ASSET_4_302 - ASSET_SECTION_4 -.word ASSET_4_303 - ASSET_SECTION_4 -.word ASSET_4_304 - ASSET_SECTION_4 -.word ASSET_4_305 - ASSET_SECTION_4 -.word ASSET_4_306 - ASSET_SECTION_4 -.word ASSET_4_307 - ASSET_SECTION_4 -.word ASSET_4_308 - ASSET_SECTION_4 -.word ASSET_4_309 - ASSET_SECTION_4 -.word ASSET_4_310 - ASSET_SECTION_4 -.word ASSET_4_311 - ASSET_SECTION_4 -.word ASSET_4_312 - ASSET_SECTION_4 -.word ASSET_4_313 - ASSET_SECTION_4 -.word ASSET_4_314 - ASSET_SECTION_4 -.word ASSET_4_315 - ASSET_SECTION_4 -.word ASSET_4_316 - ASSET_SECTION_4 -.word ASSET_4_317 - ASSET_SECTION_4 -.word ASSET_4_318 - ASSET_SECTION_4 -.word ASSET_4_319 - ASSET_SECTION_4 -.word ASSET_4_320 - ASSET_SECTION_4 -.word ASSET_4_321 - ASSET_SECTION_4 -.word ASSET_4_322 - ASSET_SECTION_4 -.word ASSET_4_323 - ASSET_SECTION_4 -.word ASSET_4_324 - ASSET_SECTION_4 -.word ASSET_4_325 - ASSET_SECTION_4 -.word ASSET_4_326 - ASSET_SECTION_4 -.word ASSET_4_327 - ASSET_SECTION_4 -.word ASSET_4_328 - ASSET_SECTION_4 -.word ASSET_4_329 - ASSET_SECTION_4 -.word ASSET_4_330 - ASSET_SECTION_4 -.word ASSET_4_331 - ASSET_SECTION_4 -.word ASSET_4_332 - ASSET_SECTION_4 -.word ASSET_4_333 - ASSET_SECTION_4 -.word ASSET_4_334 - ASSET_SECTION_4 -.word ASSET_4_335 - ASSET_SECTION_4 -.word ASSET_4_336 - ASSET_SECTION_4 -.word ASSET_4_337 - ASSET_SECTION_4 -.word ASSET_4_338 - ASSET_SECTION_4 -.word ASSET_4_339 - ASSET_SECTION_4 -.word ASSET_4_340 - ASSET_SECTION_4 -.word ASSET_4_341 - ASSET_SECTION_4 -.word ASSET_4_342 - ASSET_SECTION_4 -.word ASSET_4_343 - ASSET_SECTION_4 -.word ASSET_4_344 - ASSET_SECTION_4 -.word ASSET_4_345 - ASSET_SECTION_4 -.word ASSET_4_346 - ASSET_SECTION_4 -.word ASSET_4_347 - ASSET_SECTION_4 -.word ASSET_4_348 - ASSET_SECTION_4 -.word ASSET_4_349 - ASSET_SECTION_4 -.word ASSET_4_350 - ASSET_SECTION_4 -.word ASSET_4_351 - ASSET_SECTION_4 -.word ASSET_4_352 - ASSET_SECTION_4 -.word ASSET_4_353 - ASSET_SECTION_4 -.word ASSET_4_354 - ASSET_SECTION_4 -.word ASSET_4_355 - ASSET_SECTION_4 -.word ASSET_4_356 - ASSET_SECTION_4 -.word ASSET_4_357 - ASSET_SECTION_4 -.word ASSET_4_358 - ASSET_SECTION_4 -.word ASSET_4_359 - ASSET_SECTION_4 -.word ASSET_4_360 - ASSET_SECTION_4 -.word ASSET_4_361 - ASSET_SECTION_4 -.word ASSET_4_362 - ASSET_SECTION_4 -.word ASSET_4_363 - ASSET_SECTION_4 -.word ASSET_4_364 - ASSET_SECTION_4 -.word ASSET_4_365 - ASSET_SECTION_4 -.word ASSET_4_366 - ASSET_SECTION_4 -.word ASSET_4_367 - ASSET_SECTION_4 -.word ASSET_4_368 - ASSET_SECTION_4 -.word ASSET_4_369 - ASSET_SECTION_4 -.word ASSET_4_370 - ASSET_SECTION_4 -.word ASSET_4_371 - ASSET_SECTION_4 -.word ASSET_4_372 - ASSET_SECTION_4 -.word ASSET_4_373 - ASSET_SECTION_4 -.word ASSET_4_374 - ASSET_SECTION_4 -.word ASSET_4_375 - ASSET_SECTION_4 -.word ASSET_4_376 - ASSET_SECTION_4 -.word ASSET_4_377 - ASSET_SECTION_4 -.word ASSET_4_378 - ASSET_SECTION_4 -.word ASSET_4_379 - ASSET_SECTION_4 -.word ASSET_4_380 - ASSET_SECTION_4 -.word ASSET_4_381 - ASSET_SECTION_4 -.word ASSET_4_382 - ASSET_SECTION_4 -.word ASSET_4_383 - ASSET_SECTION_4 -.word ASSET_4_384 - ASSET_SECTION_4 -.word ASSET_4_385 - ASSET_SECTION_4 -.word ASSET_4_386 - ASSET_SECTION_4 -.word ASSET_4_387 - ASSET_SECTION_4 -.word ASSET_4_388 - ASSET_SECTION_4 -.word ASSET_4_389 - ASSET_SECTION_4 -.word ASSET_4_390 - ASSET_SECTION_4 -.word ASSET_4_391 - ASSET_SECTION_4 -.word ASSET_4_392 - ASSET_SECTION_4 -.word ASSET_4_393 - ASSET_SECTION_4 -.word ASSET_4_394 - ASSET_SECTION_4 -.word ASSET_4_395 - ASSET_SECTION_4 -.word ASSET_4_396 - ASSET_SECTION_4 -.word ASSET_4_397 - ASSET_SECTION_4 -.word ASSET_4_398 - ASSET_SECTION_4 -.word ASSET_4_399 - ASSET_SECTION_4 -.word ASSET_4_400 - ASSET_SECTION_4 -.word ASSET_4_401 - ASSET_SECTION_4 -.word ASSET_4_402 - ASSET_SECTION_4 -.word ASSET_4_403 - ASSET_SECTION_4 -.word ASSET_4_404 - ASSET_SECTION_4 -.word ASSET_4_405 - ASSET_SECTION_4 -.word ASSET_4_406 - ASSET_SECTION_4 -.word ASSET_4_407 - ASSET_SECTION_4 -.word ASSET_4_408 - ASSET_SECTION_4 -.word ASSET_4_409 - ASSET_SECTION_4 -.word ASSET_4_410 - ASSET_SECTION_4 -.word ASSET_4_411 - ASSET_SECTION_4 -.word ASSET_4_412 - ASSET_SECTION_4 -.word ASSET_4_413 - ASSET_SECTION_4 -.word ASSET_4_414 - ASSET_SECTION_4 -.word ASSET_4_415 - ASSET_SECTION_4 -.word ASSET_4_416 - ASSET_SECTION_4 -.word ASSET_4_417 - ASSET_SECTION_4 -.word ASSET_4_418 - ASSET_SECTION_4 -.word ASSET_4_419 - ASSET_SECTION_4 -.word ASSET_4_420 - ASSET_SECTION_4 -.word ASSET_4_421 - ASSET_SECTION_4 -.word ASSET_4_422 - ASSET_SECTION_4 -.word ASSET_4_423 - ASSET_SECTION_4 -.word ASSET_4_424 - ASSET_SECTION_4 -.word ASSET_4_425 - ASSET_SECTION_4 -.word ASSET_4_426 - ASSET_SECTION_4 -.word ASSET_4_427 - ASSET_SECTION_4 -.word ASSET_4_428 - ASSET_SECTION_4 -.word ASSET_4_429 - ASSET_SECTION_4 -.word ASSET_4_430 - ASSET_SECTION_4 -.word ASSET_4_431 - ASSET_SECTION_4 -.word ASSET_4_432 - ASSET_SECTION_4 -.word ASSET_4_433 - ASSET_SECTION_4 -.word ASSET_4_434 - ASSET_SECTION_4 -.word ASSET_4_435 - ASSET_SECTION_4 -.word ASSET_4_436 - ASSET_SECTION_4 -.word ASSET_4_437 - ASSET_SECTION_4 -.word ASSET_4_438 - ASSET_SECTION_4 -.word ASSET_4_439 - ASSET_SECTION_4 -.word ASSET_4_440 - ASSET_SECTION_4 -.word ASSET_4_441 - ASSET_SECTION_4 -.word ASSET_4_442 - ASSET_SECTION_4 -.word ASSET_4_443 - ASSET_SECTION_4 -.word ASSET_4_444 - ASSET_SECTION_4 -.word ASSET_4_445 - ASSET_SECTION_4 -.word ASSET_4_446 - ASSET_SECTION_4 -.word ASSET_4_447 - ASSET_SECTION_4 -.word ASSET_4_448 - ASSET_SECTION_4 -.word ASSET_4_449 - ASSET_SECTION_4 -.word ASSET_4_450 - ASSET_SECTION_4 -.word ASSET_4_451 - ASSET_SECTION_4 -.word ASSET_4_452 - ASSET_SECTION_4 -.word ASSET_4_453 - ASSET_SECTION_4 -.word ASSET_4_454 - ASSET_SECTION_4 -.word ASSET_4_455 - ASSET_SECTION_4 -.word ASSET_4_456 - ASSET_SECTION_4 -.word ASSET_4_457 - ASSET_SECTION_4 -.word ASSET_4_458 - ASSET_SECTION_4 -.word ASSET_4_459 - ASSET_SECTION_4 -.word ASSET_4_460 - ASSET_SECTION_4 -.word ASSET_4_461 - ASSET_SECTION_4 -.word ASSET_4_462 - ASSET_SECTION_4 -.word ASSET_4_463 - ASSET_SECTION_4 -.word ASSET_4_464 - ASSET_SECTION_4 -.word ASSET_4_465 - ASSET_SECTION_4 -.word ASSET_4_466 - ASSET_SECTION_4 -.word ASSET_4_467 - ASSET_SECTION_4 -.word ASSET_4_468 - ASSET_SECTION_4 -.word ASSET_4_469 - ASSET_SECTION_4 -.word ASSET_4_470 - ASSET_SECTION_4 -.word ASSET_4_471 - ASSET_SECTION_4 -.word ASSET_4_472 - ASSET_SECTION_4 -.word ASSET_4_473 - ASSET_SECTION_4 -.word ASSET_4_474 - ASSET_SECTION_4 -.word ASSET_4_475 - ASSET_SECTION_4 -.word ASSET_4_476 - ASSET_SECTION_4 -.word ASSET_4_477 - ASSET_SECTION_4 -.word ASSET_4_478 - ASSET_SECTION_4 -.word ASSET_4_479 - ASSET_SECTION_4 -.word ASSET_4_480 - ASSET_SECTION_4 -.word ASSET_4_481 - ASSET_SECTION_4 -.word ASSET_4_482 - ASSET_SECTION_4 -.word ASSET_4_483 - ASSET_SECTION_4 -.word ASSET_4_484 - ASSET_SECTION_4 -.word ASSET_4_485 - ASSET_SECTION_4 -.word ASSET_4_486 - ASSET_SECTION_4 -.word ASSET_4_487 - ASSET_SECTION_4 -.word ASSET_4_488 - ASSET_SECTION_4 -.word ASSET_4_489 - ASSET_SECTION_4 -.word ASSET_4_490 - ASSET_SECTION_4 -.word ASSET_4_491 - ASSET_SECTION_4 -.word ASSET_4_492 - ASSET_SECTION_4 -.word ASSET_4_493 - ASSET_SECTION_4 -.word ASSET_4_494 - ASSET_SECTION_4 -.word ASSET_4_495 - ASSET_SECTION_4 -.word ASSET_4_496 - ASSET_SECTION_4 -.word ASSET_4_497 - ASSET_SECTION_4 -.word ASSET_4_498 - ASSET_SECTION_4 -.word ASSET_4_499 - ASSET_SECTION_4 -.word ASSET_4_500 - ASSET_SECTION_4 -.word ASSET_4_501 - ASSET_SECTION_4 -.word ASSET_4_502 - ASSET_SECTION_4 -.word ASSET_4_503 - ASSET_SECTION_4 -.word ASSET_4_504 - ASSET_SECTION_4 -.word ASSET_4_505 - ASSET_SECTION_4 -.word ASSET_4_506 - ASSET_SECTION_4 -.word ASSET_4_507 - ASSET_SECTION_4 -.word ASSET_4_508 - ASSET_SECTION_4 -.word ASSET_4_509 - ASSET_SECTION_4 -.word ASSET_4_510 - ASSET_SECTION_4 -.word ASSET_4_511 - ASSET_SECTION_4 -.word ASSET_4_512 - ASSET_SECTION_4 -.word ASSET_4_513 - ASSET_SECTION_4 -.word ASSET_4_514 - ASSET_SECTION_4 -.word ASSET_4_515 - ASSET_SECTION_4 -.word ASSET_4_516 - ASSET_SECTION_4 -.word ASSET_4_517 - ASSET_SECTION_4 -.word ASSET_4_518 - ASSET_SECTION_4 -.word ASSET_4_519 - ASSET_SECTION_4 -.word ASSET_4_520 - ASSET_SECTION_4 -.word ASSET_4_521 - ASSET_SECTION_4 -.word ASSET_4_522 - ASSET_SECTION_4 -.word ASSET_4_523 - ASSET_SECTION_4 -.word ASSET_4_524 - ASSET_SECTION_4 -.word ASSET_4_525 - ASSET_SECTION_4 -.word ASSET_4_526 - ASSET_SECTION_4 -.word ASSET_4_527 - ASSET_SECTION_4 -.word ASSET_4_528 - ASSET_SECTION_4 -.word ASSET_4_529 - ASSET_SECTION_4 -.word ASSET_4_530 - ASSET_SECTION_4 -.word ASSET_4_531 - ASSET_SECTION_4 -.word ASSET_4_532 - ASSET_SECTION_4 -.word ASSET_4_533 - ASSET_SECTION_4 -.word ASSET_4_534 - ASSET_SECTION_4 -.word ASSET_4_535 - ASSET_SECTION_4 -.word ASSET_4_536 - ASSET_SECTION_4 -.word ASSET_4_537 - ASSET_SECTION_4 -.word ASSET_4_538 - ASSET_SECTION_4 -.word ASSET_4_539 - ASSET_SECTION_4 -.word ASSET_4_540 - ASSET_SECTION_4 -.word ASSET_4_541 - ASSET_SECTION_4 -.word ASSET_4_542 - ASSET_SECTION_4 -.word ASSET_4_543 - ASSET_SECTION_4 -.word ASSET_4_544 - ASSET_SECTION_4 -.word ASSET_4_545 - ASSET_SECTION_4 -.word ASSET_4_546 - ASSET_SECTION_4 -.word ASSET_4_547 - ASSET_SECTION_4 -.word ASSET_4_548 - ASSET_SECTION_4 -.word ASSET_4_549 - ASSET_SECTION_4 -.word ASSET_4_550 - ASSET_SECTION_4 -.word ASSET_4_551 - ASSET_SECTION_4 -.word ASSET_4_552 - ASSET_SECTION_4 -.word ASSET_4_553 - ASSET_SECTION_4 -.word ASSET_4_554 - ASSET_SECTION_4 -.word ASSET_4_555 - ASSET_SECTION_4 -.word ASSET_4_556 - ASSET_SECTION_4 -.word ASSET_4_557 - ASSET_SECTION_4 -.word ASSET_4_558 - ASSET_SECTION_4 -.word ASSET_4_559 - ASSET_SECTION_4 -.word ASSET_4_560 - ASSET_SECTION_4 -.word ASSET_4_561 - ASSET_SECTION_4 -.word ASSET_4_562 - ASSET_SECTION_4 -.word ASSET_4_563 - ASSET_SECTION_4 -.word ASSET_4_564 - ASSET_SECTION_4 -.word ASSET_4_565 - ASSET_SECTION_4 -.word ASSET_4_566 - ASSET_SECTION_4 -.word ASSET_4_567 - ASSET_SECTION_4 -.word ASSET_4_568 - ASSET_SECTION_4 -.word ASSET_4_569 - ASSET_SECTION_4 -.word ASSET_4_570 - ASSET_SECTION_4 -.word ASSET_4_571 - ASSET_SECTION_4 -.word ASSET_4_572 - ASSET_SECTION_4 -.word ASSET_4_573 - ASSET_SECTION_4 -.word ASSET_4_574 - ASSET_SECTION_4 -.word ASSET_4_575 - ASSET_SECTION_4 -.word ASSET_4_576 - ASSET_SECTION_4 -.word ASSET_4_577 - ASSET_SECTION_4 -.word ASSET_4_578 - ASSET_SECTION_4 -.word ASSET_4_579 - ASSET_SECTION_4 -.word ASSET_4_580 - ASSET_SECTION_4 -.word ASSET_4_581 - ASSET_SECTION_4 -.word ASSET_4_582 - ASSET_SECTION_4 -.word ASSET_4_583 - ASSET_SECTION_4 -.word ASSET_4_584 - ASSET_SECTION_4 -.word ASSET_4_585 - ASSET_SECTION_4 -.word ASSET_4_586 - ASSET_SECTION_4 -.word ASSET_4_587 - ASSET_SECTION_4 -.word ASSET_4_588 - ASSET_SECTION_4 -.word ASSET_4_589 - ASSET_SECTION_4 -.word ASSET_4_590 - ASSET_SECTION_4 -.word ASSET_4_591 - ASSET_SECTION_4 -.word ASSET_4_592 - ASSET_SECTION_4 -.word ASSET_4_593 - ASSET_SECTION_4 -.word ASSET_4_594 - ASSET_SECTION_4 -.word ASSET_4_595 - ASSET_SECTION_4 -.word ASSET_4_596 - ASSET_SECTION_4 -.word ASSET_4_597 - ASSET_SECTION_4 -.word ASSET_4_598 - ASSET_SECTION_4 -.word ASSET_4_599 - ASSET_SECTION_4 -.word ASSET_4_600 - ASSET_SECTION_4 -.word ASSET_4_601 - ASSET_SECTION_4 -.word ASSET_4_602 - ASSET_SECTION_4 -.word ASSET_4_603 - ASSET_SECTION_4 -.word ASSET_4_604 - ASSET_SECTION_4 -.word ASSET_4_605 - ASSET_SECTION_4 -.word ASSET_4_606 - ASSET_SECTION_4 -.word ASSET_4_607 - ASSET_SECTION_4 -.word ASSET_4_608 - ASSET_SECTION_4 -.word ASSET_4_609 - ASSET_SECTION_4 -.word ASSET_4_610 - ASSET_SECTION_4 -.word ASSET_4_611 - ASSET_SECTION_4 -.word ASSET_4_612 - ASSET_SECTION_4 -.word ASSET_4_613 - ASSET_SECTION_4 -.word ASSET_4_614 - ASSET_SECTION_4 -.word ASSET_4_615 - ASSET_SECTION_4 -.word ASSET_4_616 - ASSET_SECTION_4 -.word ASSET_4_617 - ASSET_SECTION_4 -.word ASSET_4_618 - ASSET_SECTION_4 -.word ASSET_4_619 - ASSET_SECTION_4 -.word ASSET_4_620 - ASSET_SECTION_4 -.word ASSET_4_621 - ASSET_SECTION_4 -.word ASSET_4_622 - ASSET_SECTION_4 -.word ASSET_4_623 - ASSET_SECTION_4 -.word ASSET_4_624 - ASSET_SECTION_4 -.word ASSET_4_625 - ASSET_SECTION_4 -.word ASSET_4_626 - ASSET_SECTION_4 -.word ASSET_4_627 - ASSET_SECTION_4 -.word ASSET_4_628 - ASSET_SECTION_4 -.word ASSET_4_629 - ASSET_SECTION_4 -.word ASSET_4_630 - ASSET_SECTION_4 -.word ASSET_4_631 - ASSET_SECTION_4 -.word ASSET_4_632 - ASSET_SECTION_4 -.word ASSET_4_633 - ASSET_SECTION_4 -.word ASSET_4_634 - ASSET_SECTION_4 -.word ASSET_4_635 - ASSET_SECTION_4 -.word ASSET_4_636 - ASSET_SECTION_4 -.word ASSET_4_637 - ASSET_SECTION_4 -.word ASSET_4_638 - ASSET_SECTION_4 -.word ASSET_4_639 - ASSET_SECTION_4 -.word ASSET_4_640 - ASSET_SECTION_4 -.word ASSET_4_641 - ASSET_SECTION_4 -.word ASSET_4_642 - ASSET_SECTION_4 -.word ASSET_4_643 - ASSET_SECTION_4 -.word ASSET_4_644 - ASSET_SECTION_4 -.word ASSET_4_645 - ASSET_SECTION_4 -.word ASSET_4_646 - ASSET_SECTION_4 -.word ASSET_4_647 - ASSET_SECTION_4 -.word ASSET_4_648 - ASSET_SECTION_4 -.word ASSET_4_649 - ASSET_SECTION_4 -.word ASSET_4_650 - ASSET_SECTION_4 -.word ASSET_4_651 - ASSET_SECTION_4 -.word ASSET_4_652 - ASSET_SECTION_4 -.word ASSET_4_653 - ASSET_SECTION_4 -.word ASSET_4_654 - ASSET_SECTION_4 -.word ASSET_4_655 - ASSET_SECTION_4 -.word ASSET_4_656 - ASSET_SECTION_4 -.word ASSET_4_657 - ASSET_SECTION_4 -.word ASSET_4_658 - ASSET_SECTION_4 -.word ASSET_4_659 - ASSET_SECTION_4 -.word ASSET_4_660 - ASSET_SECTION_4 -.word ASSET_4_661 - ASSET_SECTION_4 -.word ASSET_4_662 - ASSET_SECTION_4 -.word ASSET_4_663 - ASSET_SECTION_4 -.word ASSET_4_664 - ASSET_SECTION_4 -.word ASSET_4_665 - ASSET_SECTION_4 -.word ASSET_4_666 - ASSET_SECTION_4 -.word ASSET_4_667 - ASSET_SECTION_4 -.word ASSET_4_668 - ASSET_SECTION_4 -.word ASSET_4_669 - ASSET_SECTION_4 -.word ASSET_4_670 - ASSET_SECTION_4 -.word ASSET_4_671 - ASSET_SECTION_4 -.word ASSET_4_672 - ASSET_SECTION_4 -.word ASSET_4_673 - ASSET_SECTION_4 -.word ASSET_4_674 - ASSET_SECTION_4 -.word ASSET_4_675 - ASSET_SECTION_4 -.word ASSET_4_676 - ASSET_SECTION_4 -.word ASSET_4_677 - ASSET_SECTION_4 -.word ASSET_4_678 - ASSET_SECTION_4 -.word ASSET_4_679 - ASSET_SECTION_4 -.word ASSET_4_680 - ASSET_SECTION_4 -.word ASSET_4_681 - ASSET_SECTION_4 -.word ASSET_4_682 - ASSET_SECTION_4 -.word ASSET_4_683 - ASSET_SECTION_4 -.word ASSET_4_684 - ASSET_SECTION_4 -.word ASSET_4_685 - ASSET_SECTION_4 -.word ASSET_4_686 - ASSET_SECTION_4 -.word ASSET_4_687 - ASSET_SECTION_4 -.word ASSET_4_688 - ASSET_SECTION_4 -.word ASSET_4_689 - ASSET_SECTION_4 -.word ASSET_4_690 - ASSET_SECTION_4 -.word ASSET_4_691 - ASSET_SECTION_4 -.word ASSET_4_692 - ASSET_SECTION_4 -.word ASSET_4_693 - ASSET_SECTION_4 -.word ASSET_4_694 - ASSET_SECTION_4 -.word ASSET_4_695 - ASSET_SECTION_4 -.word ASSET_4_696 - ASSET_SECTION_4 -.word ASSET_4_697 - ASSET_SECTION_4 -.word ASSET_4_698 - ASSET_SECTION_4 -.word ASSET_4_699 - ASSET_SECTION_4 -.word ASSET_4_700 - ASSET_SECTION_4 -.word ASSET_4_701 - ASSET_SECTION_4 -.word ASSET_4_702 - ASSET_SECTION_4 -.word ASSET_4_703 - ASSET_SECTION_4 -.word ASSET_4_704 - ASSET_SECTION_4 -.word ASSET_4_705 - ASSET_SECTION_4 -.word ASSET_4_706 - ASSET_SECTION_4 -.word ASSET_4_707 - ASSET_SECTION_4 -.word ASSET_4_708 - ASSET_SECTION_4 -.word ASSET_4_709 - ASSET_SECTION_4 -.word ASSET_4_710 - ASSET_SECTION_4 -.word ASSET_4_711 - ASSET_SECTION_4 -.word ASSET_4_712 - ASSET_SECTION_4 -.word ASSET_4_713 - ASSET_SECTION_4 -.word ASSET_4_714 - ASSET_SECTION_4 -.word ASSET_4_715 - ASSET_SECTION_4 -.word ASSET_4_716 - ASSET_SECTION_4 -.word ASSET_4_717 - ASSET_SECTION_4 -.word ASSET_4_718 - ASSET_SECTION_4 -.word ASSET_4_719 - ASSET_SECTION_4 -.word ASSET_4_720 - ASSET_SECTION_4 -.word ASSET_4_721 - ASSET_SECTION_4 -.word ASSET_4_722 - ASSET_SECTION_4 -.word ASSET_4_723 - ASSET_SECTION_4 -.word ASSET_4_724 - ASSET_SECTION_4 -.word ASSET_4_725 - ASSET_SECTION_4 -.word ASSET_4_726 - ASSET_SECTION_4 -.word ASSET_4_727 - ASSET_SECTION_4 -.word ASSET_4_728 - ASSET_SECTION_4 -.word ASSET_4_729 - ASSET_SECTION_4 -.word ASSET_4_730 - ASSET_SECTION_4 -.word ASSET_4_731 - ASSET_SECTION_4 -.word ASSET_4_732 - ASSET_SECTION_4 -.word ASSET_4_733 - ASSET_SECTION_4 -.word ASSET_4_734 - ASSET_SECTION_4 -.word ASSET_4_735 - ASSET_SECTION_4 -.word ASSET_4_736 - ASSET_SECTION_4 -.word ASSET_4_737 - ASSET_SECTION_4 -.word ASSET_4_738 - ASSET_SECTION_4 -.word ASSET_4_739 - ASSET_SECTION_4 -.word ASSET_4_740 - ASSET_SECTION_4 -.word ASSET_4_741 - ASSET_SECTION_4 -.word ASSET_4_742 - ASSET_SECTION_4 -.word ASSET_4_743 - ASSET_SECTION_4 -.word ASSET_4_744 - ASSET_SECTION_4 -.word ASSET_4_745 - ASSET_SECTION_4 -.word ASSET_4_746 - ASSET_SECTION_4 -.word ASSET_4_747 - ASSET_SECTION_4 -.word ASSET_4_748 - ASSET_SECTION_4 -.word ASSET_4_749 - ASSET_SECTION_4 -.word ASSET_4_750 - ASSET_SECTION_4 -.word ASSET_4_751 - ASSET_SECTION_4 -.word ASSET_4_752 - ASSET_SECTION_4 -.word ASSET_4_753 - ASSET_SECTION_4 -.word ASSET_4_754 - ASSET_SECTION_4 -.word ASSET_4_755 - ASSET_SECTION_4 -.word ASSET_4_756 - ASSET_SECTION_4 -.word ASSET_4_757 - ASSET_SECTION_4 -.word ASSET_4_758 - ASSET_SECTION_4 -.word ASSET_4_759 - ASSET_SECTION_4 -.word ASSET_4_760 - ASSET_SECTION_4 -.word ASSET_4_761 - ASSET_SECTION_4 -.word ASSET_4_762 - ASSET_SECTION_4 -.word ASSET_4_763 - ASSET_SECTION_4 -.word ASSET_4_764 - ASSET_SECTION_4 -.word ASSET_4_765 - ASSET_SECTION_4 -.word ASSET_4_766 - ASSET_SECTION_4 -.word ASSET_4_767 - ASSET_SECTION_4 -.word ASSET_4_768 - ASSET_SECTION_4 -.word ASSET_4_769 - ASSET_SECTION_4 -.word ASSET_4_770 - ASSET_SECTION_4 -.word ASSET_4_771 - ASSET_SECTION_4 -.word ASSET_4_772 - ASSET_SECTION_4 -.word ASSET_4_773 - ASSET_SECTION_4 -.word ASSET_4_774 - ASSET_SECTION_4 -.word ASSET_4_775 - ASSET_SECTION_4 -.word ASSET_4_776 - ASSET_SECTION_4 -.word ASSET_4_777 - ASSET_SECTION_4 -.word ASSET_4_778 - ASSET_SECTION_4 -.word ASSET_4_779 - ASSET_SECTION_4 -.word ASSET_4_780 - ASSET_SECTION_4 -.word ASSET_4_781 - ASSET_SECTION_4 -.word ASSET_4_782 - ASSET_SECTION_4 -.word ASSET_4_783 - ASSET_SECTION_4 -.word ASSET_4_784 - ASSET_SECTION_4 -.word ASSET_4_785 - ASSET_SECTION_4 -.word ASSET_4_786 - ASSET_SECTION_4 -.word ASSET_4_787 - ASSET_SECTION_4 -.word ASSET_4_788 - ASSET_SECTION_4 -.word ASSET_4_789 - ASSET_SECTION_4 -.word ASSET_4_790 - ASSET_SECTION_4 -.word ASSET_4_791 - ASSET_SECTION_4 -.word ASSET_4_792 - ASSET_SECTION_4 -.word ASSET_4_793 - ASSET_SECTION_4 -.word ASSET_4_794 - ASSET_SECTION_4 -.word ASSET_4_795 - ASSET_SECTION_4 -.word ASSET_4_796 - ASSET_SECTION_4 -.word ASSET_4_797 - ASSET_SECTION_4 -.word ASSET_4_798 - ASSET_SECTION_4 -.word ASSET_4_799 - ASSET_SECTION_4 -.word ASSET_4_800 - ASSET_SECTION_4 -.word ASSET_4_801 - ASSET_SECTION_4 -.word ASSET_4_802 - ASSET_SECTION_4 -.word ASSET_4_803 - ASSET_SECTION_4 -.word ASSET_4_804 - ASSET_SECTION_4 -.word ASSET_4_805 - ASSET_SECTION_4 -.word ASSET_4_806 - ASSET_SECTION_4 -.word ASSET_4_807 - ASSET_SECTION_4 -.word ASSET_4_808 - ASSET_SECTION_4 -.word ASSET_4_809 - ASSET_SECTION_4 -.word ASSET_4_810 - ASSET_SECTION_4 -.word ASSET_4_811 - ASSET_SECTION_4 -.word ASSET_4_812 - ASSET_SECTION_4 -.word ASSET_4_813 - ASSET_SECTION_4 -.word ASSET_4_814 - ASSET_SECTION_4 -.word ASSET_4_815 - ASSET_SECTION_4 -.word ASSET_4_816 - ASSET_SECTION_4 -.word ASSET_4_817 - ASSET_SECTION_4 -.word ASSET_4_818 - ASSET_SECTION_4 -.word ASSET_4_819 - ASSET_SECTION_4 -.word ASSET_4_820 - ASSET_SECTION_4 -.word ASSET_4_821 - ASSET_SECTION_4 -.word ASSET_4_822 - ASSET_SECTION_4 -.word ASSET_4_823 - ASSET_SECTION_4 -.word ASSET_4_824 - ASSET_SECTION_4 -.word ASSET_4_825 - ASSET_SECTION_4 -.word ASSET_4_826 - ASSET_SECTION_4 -.word ASSET_4_827 - ASSET_SECTION_4 -.word ASSET_4_828 - ASSET_SECTION_4 -.word ASSET_4_829 - ASSET_SECTION_4 -.word ASSET_4_830 - ASSET_SECTION_4 -.word ASSET_4_831 - ASSET_SECTION_4 -.word ASSET_4_832 - ASSET_SECTION_4 -.word ASSET_4_833 - ASSET_SECTION_4 -.word ASSET_4_834 - ASSET_SECTION_4 -.word ASSET_4_835 - ASSET_SECTION_4 -.word ASSET_4_836 - ASSET_SECTION_4 -.word ASSET_4_837 - ASSET_SECTION_4 -.word ASSET_4_838 - ASSET_SECTION_4 -.word ASSET_4_839 - ASSET_SECTION_4 -.word ASSET_4_840 - ASSET_SECTION_4 -.word ASSET_4_841 - ASSET_SECTION_4 -.word ASSET_4_842 - ASSET_SECTION_4 -.word ASSET_4_843 - ASSET_SECTION_4 -.word ASSET_4_844 - ASSET_SECTION_4 -.word ASSET_4_845 - ASSET_SECTION_4 -.word ASSET_4_846 - ASSET_SECTION_4 -.word ASSET_4_847 - ASSET_SECTION_4 -.word ASSET_4_848 - ASSET_SECTION_4 -.word ASSET_4_849 - ASSET_SECTION_4 -.word ASSET_4_850 - ASSET_SECTION_4 -.word ASSET_4_851 - ASSET_SECTION_4 -.word ASSET_4_852 - ASSET_SECTION_4 -.word ASSET_4_853 - ASSET_SECTION_4 -.word ASSET_4_854 - ASSET_SECTION_4 -.word ASSET_4_855 - ASSET_SECTION_4 -.word ASSET_4_856 - ASSET_SECTION_4 -.word ASSET_4_857 - ASSET_SECTION_4 -.word ASSET_4_858 - ASSET_SECTION_4 -.word ASSET_4_859 - ASSET_SECTION_4 -.word ASSET_4_860 - ASSET_SECTION_4 -.word ASSET_4_861 - ASSET_SECTION_4 -.word ASSET_4_862 - ASSET_SECTION_4 -.word ASSET_4_863 - ASSET_SECTION_4 -.word ASSET_4_864 - ASSET_SECTION_4 -.word ASSET_4_865 - ASSET_SECTION_4 -.word ASSET_4_866 - ASSET_SECTION_4 -.word ASSET_4_867 - ASSET_SECTION_4 -.word ASSET_4_868 - ASSET_SECTION_4 -.word ASSET_4_869 - ASSET_SECTION_4 -.word ASSET_4_870 - ASSET_SECTION_4 -.word ASSET_4_871 - ASSET_SECTION_4 -.word ASSET_4_872 - ASSET_SECTION_4 -.word ASSET_4_873 - ASSET_SECTION_4 -.word ASSET_4_874 - ASSET_SECTION_4 -.word ASSET_4_875 - ASSET_SECTION_4 -.word ASSET_4_876 - ASSET_SECTION_4 -.word ASSET_4_877 - ASSET_SECTION_4 -.word ASSET_4_878 - ASSET_SECTION_4 -.word ASSET_4_879 - ASSET_SECTION_4 -.word ASSET_4_880 - ASSET_SECTION_4 -.word ASSET_4_881 - ASSET_SECTION_4 -.word ASSET_4_882 - ASSET_SECTION_4 -.word ASSET_4_883 - ASSET_SECTION_4 -.word ASSET_4_884 - ASSET_SECTION_4 -.word ASSET_4_885 - ASSET_SECTION_4 -.word ASSET_4_886 - ASSET_SECTION_4 -.word ASSET_4_887 - ASSET_SECTION_4 -.word ASSET_4_888 - ASSET_SECTION_4 -.word ASSET_4_889 - ASSET_SECTION_4 -.word ASSET_4_890 - ASSET_SECTION_4 -.word ASSET_4_891 - ASSET_SECTION_4 -.word ASSET_4_892 - ASSET_SECTION_4 -.word ASSET_4_893 - ASSET_SECTION_4 -.word ASSET_4_894 - ASSET_SECTION_4 -.word ASSET_4_895 - ASSET_SECTION_4 -.word ASSET_4_896 - ASSET_SECTION_4 -.word ASSET_4_897 - ASSET_SECTION_4 -.word ASSET_4_898 - ASSET_SECTION_4 -.word ASSET_4_899 - ASSET_SECTION_4 -.word ASSET_4_900 - ASSET_SECTION_4 -.word ASSET_4_901 - ASSET_SECTION_4 -.word ASSET_4_902 - ASSET_SECTION_4 -.word ASSET_4_903 - ASSET_SECTION_4 -.word ASSET_4_904 - ASSET_SECTION_4 -.word ASSET_4_905 - ASSET_SECTION_4 -.word ASSET_SECTION_4_END - ASSET_SECTION_4 +glabel ASSET_TEXTURES_2D_TABLE +.word ASSET_TEX2D_SMALLFONT_0 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_SMALLFONT_1 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_SMALLFONT_2 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_3 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_4 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_5 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_6 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_7 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_8 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_9 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_10 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_11 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_12 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_13 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_14 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_15 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_16 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_17 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_18 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_19 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_20 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_21 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_22 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_23 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_24 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_25 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_26 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_27 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_28 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_29 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_30 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_31 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_32 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_33 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_34 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_35 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_36 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_37 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_38 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_39 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_40 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_41 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_42 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_43 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_44 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_45 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_46 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_47 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_48 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_49 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_50 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_51 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_52 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_53 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_54 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_55 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_56 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_57 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_58 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_59 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_60 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_61 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_62 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_63 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_64 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_65 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_66 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_67 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_68 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_69 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_70 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_71 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_72 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_73 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_74 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_75 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_76 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_77 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_78 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_79 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_80 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_81 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_82 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_83 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_84 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_85 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_86 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_87 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_88 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_FUNFONT_0 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_FUNFONT_1 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_FUNFONT_2 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_FUNFONT_3 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_FUNFONT_4 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_FUNFONT_5 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_95 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_96 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_97 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_98 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_99 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_100 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_101 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_102 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_103 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_104 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_105 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_106 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_107 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_108 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_109 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_110 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_111 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_112 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_113 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_114 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_115 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_116 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_117 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_118 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_119 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_120 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_121 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_122 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_123 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_124 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_125 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_126 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_127 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_128 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_129 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_130 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_131 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_132 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_133 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_134 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_135 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_136 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_137 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_138 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_139 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_140 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_141 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_142 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_143 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_144 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_145 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_146 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_147 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_148 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_149 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_150 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_151 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_152 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_153 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_154 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_155 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_156 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_157 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_158 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_SUBTITLEFONT_0 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_SUBTITLEFONT_1 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_SUBTITLEFONT_2 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_BIGFONT_A - ASSET_TEXTURES_2D +.word ASSET_TEX2D_BIGFONT_B - ASSET_TEXTURES_2D +.word ASSET_TEX2D_BIGFONT_C - ASSET_TEXTURES_2D +.word ASSET_TEX2D_BIGFONT_D - ASSET_TEXTURES_2D +.word ASSET_TEX2D_BIGFONT_E - ASSET_TEXTURES_2D +.word ASSET_TEX2D_BIGFONT_F - ASSET_TEXTURES_2D +.word ASSET_TEX2D_BIGFONT_G - ASSET_TEXTURES_2D +.word ASSET_TEX2D_BIGFONT_H - ASSET_TEXTURES_2D +.word ASSET_TEX2D_BIGFONT_I - ASSET_TEXTURES_2D +.word ASSET_TEX2D_BIGFONT_J - ASSET_TEXTURES_2D +.word ASSET_TEX2D_BIGFONT_K - ASSET_TEXTURES_2D +.word ASSET_TEX2D_BIGFONT_L - ASSET_TEXTURES_2D +.word ASSET_TEX2D_BIGFONT_M - ASSET_TEXTURES_2D +.word ASSET_TEX2D_BIGFONT_N - ASSET_TEXTURES_2D +.word ASSET_TEX2D_BIGFONT_O - ASSET_TEXTURES_2D +.word ASSET_TEX2D_BIGFONT_P - ASSET_TEXTURES_2D +.word ASSET_TEX2D_BIGFONT_Q - ASSET_TEXTURES_2D +.word ASSET_TEX2D_BIGFONT_R - ASSET_TEXTURES_2D +.word ASSET_TEX2D_BIGFONT_S - ASSET_TEXTURES_2D +.word ASSET_TEX2D_BIGFONT_T - ASSET_TEXTURES_2D +.word ASSET_TEX2D_BIGFONT_U - ASSET_TEXTURES_2D +.word ASSET_TEX2D_BIGFONT_V - ASSET_TEXTURES_2D +.word ASSET_TEX2D_BIGFONT_W - ASSET_TEXTURES_2D +.word ASSET_TEX2D_BIGFONT_X - ASSET_TEXTURES_2D +.word ASSET_TEX2D_BIGFONT_Y - ASSET_TEXTURES_2D +.word ASSET_TEX2D_BIGFONT_Z - ASSET_TEXTURES_2D +.word ASSET_TEX2D_BIGFONT_QUESTIONMARK - ASSET_TEXTURES_2D +.word ASSET_TEX2D_BIGFONT_PERIOD - ASSET_TEXTURES_2D +.word ASSET_TEX2D_190 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_191 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_192 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_193 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_194 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_195 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_196 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_197 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_198 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_199 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_200 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_201 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_202 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_203 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_204 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_205 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_206 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_207 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_208 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_209 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_210 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_211 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_212 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_213 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_214 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_215 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_216 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_217 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_218 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_219 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_220 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_221 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_222 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_223 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_224 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_225 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_226 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_227 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_228 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_229 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_230 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_231 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_232 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_233 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_234 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_235 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_236 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_237 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_238 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_239 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_240 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_241 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_242 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_243 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_244 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_245 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_246 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_247 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_248 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_249 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_250 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_251 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_252 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_253 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_254 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_255 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_256 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_257 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_258 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_259 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_260 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_261 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_262 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_263 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_264 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_265 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_266 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_267 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_268 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_269 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_270 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_271 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_272 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_273 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_274 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_275 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_276 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_277 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_278 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_279 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_280 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_281 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_282 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_283 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_284 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_285 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_286 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_287 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_288 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_289 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_290 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_291 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_292 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_293 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_294 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_295 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_296 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_297 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_298 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_299 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_300 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_301 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_302 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_303 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_304 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_305 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_306 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_307 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_308 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_309 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_310 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_311 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_312 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_313 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_314 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_315 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_316 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_317 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_318 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_319 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_320 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_321 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_322 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_323 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_324 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_325 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_326 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_327 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_328 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_329 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_330 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_331 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_332 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_333 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_334 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_335 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_336 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_337 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_338 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_339 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_340 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_341 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_342 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_343 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_344 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_345 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_346 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_347 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_348 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_349 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_350 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_351 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_352 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_353 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_354 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_355 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_356 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_357 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_358 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_359 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_360 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_361 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_362 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_363 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_364 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_365 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_366 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_367 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_368 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_369 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_370 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_371 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_372 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_373 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_374 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_375 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_376 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_377 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_378 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_379 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_380 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_381 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_382 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_383 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_384 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_385 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_386 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_387 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_388 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_389 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_390 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_391 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_392 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_393 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_394 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_395 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_396 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_397 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_398 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_399 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_400 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_401 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_402 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_403 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_404 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_405 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_406 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_407 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_408 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_409 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_410 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_411 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_412 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_413 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_414 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_415 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_416 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_417 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_418 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_419 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_420 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_421 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_422 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_423 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_424 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_425 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_426 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_427 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_428 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_429 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_430 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_431 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_432 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_433 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_434 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_435 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_436 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_437 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_438 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_439 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_440 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_441 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_442 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_443 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_444 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_445 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_446 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_447 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_448 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_449 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_450 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_451 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_452 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_453 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_454 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_455 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_456 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_457 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_458 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_459 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_460 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_461 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_462 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_463 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_464 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_465 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_466 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_467 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_468 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_469 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_470 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_471 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_472 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_473 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_474 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_475 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_476 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_477 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_478 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_479 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_480 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_481 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_482 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_483 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_484 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_485 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_486 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_487 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_488 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_489 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_490 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_491 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_492 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_493 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_494 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_495 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_496 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_497 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_498 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_499 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_500 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_501 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_502 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_503 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_504 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_505 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_506 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_507 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_508 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_509 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_510 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_511 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_512 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_513 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_514 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_515 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_516 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_517 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_518 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_519 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_520 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_521 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_522 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_523 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_524 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_525 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_526 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_527 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_528 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_529 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_530 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_531 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_532 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_533 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_534 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_535 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_536 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_537 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_538 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_539 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_540 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_541 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_542 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_543 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_544 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_545 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_546 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_547 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_548 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_549 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_550 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_551 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_552 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_553 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_554 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_555 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_556 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_557 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_558 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_559 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_560 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_561 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_562 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_563 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_564 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_565 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_566 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_567 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_568 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_569 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_570 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_571 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_572 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_573 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_574 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_575 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_576 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_577 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_578 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_579 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_580 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_581 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_582 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_583 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_584 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_585 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_586 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_587 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_588 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_589 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_590 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_591 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_592 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_593 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_594 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_595 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_596 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_597 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_598 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_599 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_600 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_601 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_602 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_603 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_604 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_605 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_606 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_607 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_608 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_609 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_610 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_611 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_612 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_613 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_614 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_615 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_616 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_617 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_618 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_619 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_620 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_621 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_622 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_623 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_624 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_625 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_626 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_627 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_628 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_629 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_630 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_631 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_632 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_633 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_634 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_635 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_636 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_637 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_638 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_639 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_640 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_641 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_642 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_643 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_644 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_645 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_646 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_647 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_648 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_649 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_650 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_651 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_652 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_653 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_654 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_655 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_656 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_657 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_658 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_659 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_660 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_661 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_662 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_663 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_664 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_665 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_666 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_667 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_668 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_669 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_670 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_671 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_672 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_673 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_674 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_675 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_676 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_677 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_678 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_679 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_680 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_681 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_682 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_683 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_684 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_685 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_686 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_687 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_688 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_689 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_690 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_691 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_692 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_693 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_694 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_695 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_696 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_697 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_698 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_699 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_700 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_701 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_702 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_703 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_704 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_705 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_706 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_707 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_708 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_709 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_710 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_711 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_712 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_713 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_714 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_715 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_716 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_717 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_718 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_719 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_720 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_721 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_722 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_723 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_724 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_725 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_726 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_727 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_728 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_729 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_730 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_731 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_732 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_733 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_734 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_735 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_736 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_737 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_738 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_739 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_740 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_741 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_742 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_743 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_744 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_745 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_746 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_747 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_748 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_749 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_750 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_751 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_752 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_753 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_754 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_755 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_756 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_757 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_758 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_759 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_760 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_761 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_762 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_763 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_764 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_765 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_766 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_767 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_768 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_769 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_770 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_771 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_772 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_773 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_774 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_775 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_776 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_777 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_778 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_779 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_780 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_781 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_782 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_783 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_784 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_785 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_786 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_787 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_788 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_789 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_790 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_791 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_792 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_793 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_794 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_795 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_796 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_797 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_798 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_799 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_800 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_801 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_802 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_803 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_804 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_805 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_806 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_807 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_808 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_809 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_810 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_811 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_812 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_813 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_814 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_815 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_816 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_817 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_818 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_819 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_820 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_821 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_822 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_823 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_824 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_825 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_826 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_827 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_828 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_829 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_830 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_831 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_832 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_833 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_834 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_835 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_836 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_837 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_838 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_839 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_840 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_841 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_842 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_843 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_844 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_845 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_846 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_847 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_848 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_849 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_850 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_851 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_852 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_853 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_854 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_855 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_856 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_857 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_858 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_859 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_860 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_861 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_862 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_863 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_864 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_865 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_866 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_867 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_868 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_869 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_870 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_871 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_872 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_873 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_874 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_875 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_876 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_877 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_878 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_879 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_880 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_881 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_882 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_883 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_884 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_885 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_886 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_887 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_888 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_889 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_890 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_891 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_892 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_893 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_894 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_895 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_896 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_897 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_898 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_899 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_900 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_901 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_902 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_903 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_904 - ASSET_TEXTURES_2D +.word ASSET_TEX2D_905 - ASSET_TEXTURES_2D +.word ASSET_TEXTURES_2D_END - ASSET_TEXTURES_2D .word 0xFFFFFFFF -glabel ASSET_SECTION_5_END + +/********** ASSET_GAME_TEXT **********/ .balign 16 -glabel ASSET_SECTION_6 -glabel ASSET_6_0 +glabel ASSET_GAME_TEXT +glabel ASSET_GAME_TEXT_0 .incbin "./build/us_1.0/text/game/unknown_6_0.bin" -glabel ASSET_6_1 +glabel ASSET_GAME_TEXT_1 .incbin "./build/us_1.0/text/game/unknown_6_1.bin" -glabel ASSET_6_2 +glabel ASSET_GAME_TEXT_2 .incbin "./build/us_1.0/text/game/unknown_6_2.bin" -glabel ASSET_6_3 +glabel ASSET_GAME_TEXT_3 .incbin "./build/us_1.0/text/game/unknown_6_3.bin" -glabel ASSET_6_4 +glabel ASSET_GAME_TEXT_4 .incbin "./build/us_1.0/text/game/unknown_6_4.bin" -glabel ASSET_6_5 +glabel ASSET_GAME_TEXT_5 .incbin "./build/us_1.0/text/game/unknown_6_5.bin" -glabel ASSET_6_6 +glabel ASSET_GAME_TEXT_6 .incbin "./build/us_1.0/text/game/unknown_6_6.bin" -glabel ASSET_6_7 +glabel ASSET_GAME_TEXT_7 .incbin "./build/us_1.0/text/game/unknown_6_7.bin" -glabel ASSET_6_8 +glabel ASSET_GAME_TEXT_8 .incbin "./build/us_1.0/text/game/unknown_6_8.bin" -glabel ASSET_6_9 +glabel ASSET_GAME_TEXT_9 .incbin "./build/us_1.0/text/game/unknown_6_9.bin" -glabel ASSET_6_10 +glabel ASSET_GAME_TEXT_10 .incbin "./build/us_1.0/text/game/unknown_6_10.bin" -glabel ASSET_6_11 +glabel ASSET_GAME_TEXT_11 .incbin "./build/us_1.0/text/game/unknown_6_11.bin" -glabel ASSET_6_12 +glabel ASSET_GAME_TEXT_12 .incbin "./build/us_1.0/text/game/unknown_6_12.bin" -glabel ASSET_6_13 +glabel ASSET_GAME_TEXT_13 .incbin "./build/us_1.0/text/game/unknown_6_13.bin" -glabel ASSET_6_14 +glabel ASSET_GAME_TEXT_14 .incbin "./build/us_1.0/text/game/unknown_6_14.bin" -glabel ASSET_6_15 +glabel ASSET_GAME_TEXT_15 .incbin "./build/us_1.0/text/game/unknown_6_15.bin" -glabel ASSET_6_16 +glabel ASSET_GAME_TEXT_16 .incbin "./build/us_1.0/text/game/unknown_6_16.bin" -glabel ASSET_6_17 +glabel ASSET_GAME_TEXT_17 .incbin "./build/us_1.0/text/game/unknown_6_17.bin" -glabel ASSET_6_18 +glabel ASSET_GAME_TEXT_18 .incbin "./build/us_1.0/text/game/unknown_6_18.bin" -glabel ASSET_6_19 +glabel ASSET_GAME_TEXT_19 .incbin "./build/us_1.0/text/game/unknown_6_19.bin" -glabel ASSET_6_20 +glabel ASSET_GAME_TEXT_20 .incbin "./build/us_1.0/text/game/unknown_6_20.bin" -glabel ASSET_6_21 +glabel ASSET_GAME_TEXT_21 .incbin "./build/us_1.0/text/game/unknown_6_21.bin" -glabel ASSET_6_22 +glabel ASSET_GAME_TEXT_22 .incbin "./build/us_1.0/text/game/unknown_6_22.bin" -glabel ASSET_6_23 +glabel ASSET_GAME_TEXT_23 .incbin "./build/us_1.0/text/game/unknown_6_23.bin" -glabel ASSET_6_24 +glabel ASSET_GAME_TEXT_24 .incbin "./build/us_1.0/text/game/unknown_6_24.bin" -glabel ASSET_6_25 +glabel ASSET_GAME_TEXT_25 .incbin "./build/us_1.0/text/game/unknown_6_25.bin" -glabel ASSET_6_26 +glabel ASSET_GAME_TEXT_26 .incbin "./build/us_1.0/text/game/unknown_6_26.bin" -glabel ASSET_6_27 +glabel ASSET_GAME_TEXT_27 .incbin "./build/us_1.0/text/game/unknown_6_27.bin" -glabel ASSET_6_28 +glabel ASSET_GAME_TEXT_28 .incbin "./build/us_1.0/text/game/unknown_6_28.bin" -glabel ASSET_6_29 +glabel ASSET_GAME_TEXT_29 .incbin "./build/us_1.0/text/game/unknown_6_29.bin" -glabel ASSET_6_30 +glabel ASSET_GAME_TEXT_30 .incbin "./build/us_1.0/text/game/unknown_6_30.bin" -glabel ASSET_6_31 +glabel ASSET_GAME_TEXT_31 .incbin "./build/us_1.0/text/game/unknown_6_31.bin" -glabel ASSET_6_32 +glabel ASSET_GAME_TEXT_32 .incbin "./build/us_1.0/text/game/unknown_6_32.bin" -glabel ASSET_6_33 +glabel ASSET_GAME_TEXT_33 .incbin "./build/us_1.0/text/game/unknown_6_33.bin" -glabel ASSET_6_34 +glabel ASSET_GAME_TEXT_34 .incbin "./build/us_1.0/text/game/unknown_6_34.bin" -glabel ASSET_6_35 +glabel ASSET_GAME_TEXT_35 .incbin "./build/us_1.0/text/game/unknown_6_35.bin" -glabel ASSET_6_36 +glabel ASSET_GAME_TEXT_36 .incbin "./build/us_1.0/text/game/unknown_6_36.bin" -glabel ASSET_6_37 +glabel ASSET_GAME_TEXT_37 .incbin "./build/us_1.0/text/game/unknown_6_37.bin" -glabel ASSET_6_38 +glabel ASSET_GAME_TEXT_38 .incbin "./build/us_1.0/text/game/unknown_6_38.bin" -glabel ASSET_6_39 +glabel ASSET_GAME_TEXT_39 .incbin "./build/us_1.0/text/game/unknown_6_39.bin" -glabel ASSET_6_40 +glabel ASSET_GAME_TEXT_40 .incbin "./build/us_1.0/text/game/unknown_6_40.bin" -glabel ASSET_6_41 +glabel ASSET_GAME_TEXT_41 .incbin "./build/us_1.0/text/game/unknown_6_41.bin" -glabel ASSET_6_42 +glabel ASSET_GAME_TEXT_42 .incbin "./build/us_1.0/text/game/unknown_6_42.bin" -glabel ASSET_6_43 +glabel ASSET_GAME_TEXT_43 .incbin "./build/us_1.0/text/game/unknown_6_43.bin" -glabel ASSET_6_44 +glabel ASSET_GAME_TEXT_44 .incbin "./build/us_1.0/text/game/unknown_6_44.bin" -glabel ASSET_6_45 +glabel ASSET_GAME_TEXT_45 .incbin "./build/us_1.0/text/game/unknown_6_45.bin" -glabel ASSET_6_46 +glabel ASSET_GAME_TEXT_46 .incbin "./build/us_1.0/text/game/unknown_6_46.bin" -glabel ASSET_6_47 +glabel ASSET_GAME_TEXT_47 .incbin "./build/us_1.0/text/game/unknown_6_47.bin" -glabel ASSET_6_48 +glabel ASSET_GAME_TEXT_48 .incbin "./build/us_1.0/text/game/unknown_6_48.bin" -glabel ASSET_6_49 +glabel ASSET_GAME_TEXT_49 .incbin "./build/us_1.0/text/game/unknown_6_49.bin" -glabel ASSET_6_50 +glabel ASSET_GAME_TEXT_50 .incbin "./build/us_1.0/text/game/unknown_6_50.bin" -glabel ASSET_6_51 +glabel ASSET_GAME_TEXT_51 .incbin "./build/us_1.0/text/game/unknown_6_51.bin" -glabel ASSET_6_52 +glabel ASSET_GAME_TEXT_52 .incbin "./build/us_1.0/text/game/unknown_6_52.bin" -glabel ASSET_6_53 +glabel ASSET_GAME_TEXT_53 .incbin "./build/us_1.0/text/game/unknown_6_53.bin" -glabel ASSET_6_54 +glabel ASSET_GAME_TEXT_54 .incbin "./build/us_1.0/text/game/unknown_6_54.bin" -glabel ASSET_6_55 +glabel ASSET_GAME_TEXT_55 .incbin "./build/us_1.0/text/game/unknown_6_55.bin" -glabel ASSET_6_56 +glabel ASSET_GAME_TEXT_56 .incbin "./build/us_1.0/text/game/unknown_6_56.bin" -glabel ASSET_6_57 +glabel ASSET_GAME_TEXT_57 .incbin "./build/us_1.0/text/game/unknown_6_57.bin" -glabel ASSET_6_58 +glabel ASSET_GAME_TEXT_58 .incbin "./build/us_1.0/text/game/unknown_6_58.bin" -glabel ASSET_6_59 +glabel ASSET_GAME_TEXT_59 .incbin "./build/us_1.0/text/game/unknown_6_59.bin" -glabel ASSET_6_60 +glabel ASSET_GAME_TEXT_60 .incbin "./build/us_1.0/text/game/unknown_6_60.bin" -glabel ASSET_6_61 +glabel ASSET_GAME_TEXT_61 .incbin "./build/us_1.0/text/game/unknown_6_61.bin" -glabel ASSET_6_62 +glabel ASSET_GAME_TEXT_62 .incbin "./build/us_1.0/text/game/unknown_6_62.bin" -glabel ASSET_6_63 +glabel ASSET_GAME_TEXT_63 .incbin "./build/us_1.0/text/game/unknown_6_63.bin" -glabel ASSET_6_64 +glabel ASSET_GAME_TEXT_64 .incbin "./build/us_1.0/text/game/unknown_6_64.bin" -glabel ASSET_6_65 +glabel ASSET_GAME_TEXT_65 .incbin "./build/us_1.0/text/game/unknown_6_65.bin" -glabel ASSET_6_66 +glabel ASSET_GAME_TEXT_66 .incbin "./build/us_1.0/text/game/unknown_6_66.bin" -glabel ASSET_6_67 +glabel ASSET_GAME_TEXT_67 .incbin "./build/us_1.0/text/game/unknown_6_67.bin" -glabel ASSET_6_68 +glabel ASSET_GAME_TEXT_68 .incbin "./build/us_1.0/text/game/unknown_6_68.bin" -glabel ASSET_6_69 +glabel ASSET_GAME_TEXT_69 .incbin "./build/us_1.0/text/game/unknown_6_69.bin" -glabel ASSET_6_70 +glabel ASSET_GAME_TEXT_70 .incbin "./build/us_1.0/text/game/unknown_6_70.bin" -glabel ASSET_6_71 +glabel ASSET_GAME_TEXT_71 .incbin "./build/us_1.0/text/game/unknown_6_71.bin" -glabel ASSET_6_72 +glabel ASSET_GAME_TEXT_72 .incbin "./build/us_1.0/text/game/unknown_6_72.bin" -glabel ASSET_6_73 +glabel ASSET_GAME_TEXT_73 .incbin "./build/us_1.0/text/game/unknown_6_73.bin" -glabel ASSET_6_74 +glabel ASSET_GAME_TEXT_74 .incbin "./build/us_1.0/text/game/unknown_6_74.bin" -glabel ASSET_6_75 +glabel ASSET_GAME_TEXT_75 .incbin "./build/us_1.0/text/game/unknown_6_75.bin" -glabel ASSET_6_76 +glabel ASSET_GAME_TEXT_76 .incbin "./build/us_1.0/text/game/unknown_6_76.bin" -glabel ASSET_6_77 +glabel ASSET_GAME_TEXT_77 .incbin "./build/us_1.0/text/game/unknown_6_77.bin" -glabel ASSET_6_78 +glabel ASSET_GAME_TEXT_78 .incbin "./build/us_1.0/text/game/unknown_6_78.bin" -glabel ASSET_6_79 +glabel ASSET_GAME_TEXT_79 .incbin "./build/us_1.0/text/game/unknown_6_79.bin" -glabel ASSET_6_80 +glabel ASSET_GAME_TEXT_80 .incbin "./build/us_1.0/text/game/unknown_6_80.bin" -glabel ASSET_6_81 +glabel ASSET_GAME_TEXT_81 .incbin "./build/us_1.0/text/game/unknown_6_81.bin" -glabel ASSET_6_82 +glabel ASSET_GAME_TEXT_82 .incbin "./build/us_1.0/text/game/unknown_6_82.bin" -glabel ASSET_6_83 +glabel ASSET_GAME_TEXT_83 .incbin "./build/us_1.0/text/game/unknown_6_83.bin" -glabel ASSET_6_84 +glabel ASSET_GAME_TEXT_84 .incbin "./build/us_1.0/text/game/unknown_6_84.bin" -glabel ASSET_6_85 +glabel ASSET_GAME_TEXT_85 .incbin "./build/us_1.0/text/game/unknown_6_85.bin" -glabel ASSET_6_86 +glabel ASSET_GAME_TEXT_86 .incbin "./build/us_1.0/text/game/unknown_6_86.bin" -glabel ASSET_6_87 +glabel ASSET_GAME_TEXT_87 .incbin "./build/us_1.0/text/game/unknown_6_87.bin" -glabel ASSET_6_88 +glabel ASSET_GAME_TEXT_88 .incbin "./build/us_1.0/text/game/unknown_6_88.bin" -glabel ASSET_6_89 +glabel ASSET_GAME_TEXT_89 .incbin "./build/us_1.0/text/game/unknown_6_89.bin" -glabel ASSET_6_90 +glabel ASSET_GAME_TEXT_90 .incbin "./build/us_1.0/text/game/unknown_6_90.bin" -glabel ASSET_6_91 +glabel ASSET_GAME_TEXT_91 .incbin "./build/us_1.0/text/game/unknown_6_91.bin" -glabel ASSET_6_92 +glabel ASSET_GAME_TEXT_92 .incbin "./build/us_1.0/text/game/unknown_6_92.bin" -glabel ASSET_6_93 +glabel ASSET_GAME_TEXT_93 .incbin "./build/us_1.0/text/game/unknown_6_93.bin" -glabel ASSET_6_94 +glabel ASSET_GAME_TEXT_94 .incbin "./build/us_1.0/text/game/unknown_6_94.bin" -glabel ASSET_6_95 +glabel ASSET_GAME_TEXT_95 .incbin "./build/us_1.0/text/game/unknown_6_95.bin" -glabel ASSET_6_96 +glabel ASSET_GAME_TEXT_96 .incbin "./build/us_1.0/text/game/unknown_6_96.bin" -glabel ASSET_6_97 +glabel ASSET_GAME_TEXT_97 .incbin "./build/us_1.0/text/game/unknown_6_97.bin" -glabel ASSET_6_98 +glabel ASSET_GAME_TEXT_98 .incbin "./build/us_1.0/text/game/unknown_6_98.bin" -glabel ASSET_6_99 +glabel ASSET_GAME_TEXT_99 .incbin "./build/us_1.0/text/game/unknown_6_99.bin" -glabel ASSET_6_100 +glabel ASSET_GAME_TEXT_100 .incbin "./build/us_1.0/text/game/unknown_6_100.bin" -glabel ASSET_6_101 +glabel ASSET_GAME_TEXT_101 .incbin "./build/us_1.0/text/game/unknown_6_101.bin" -glabel ASSET_6_102 +glabel ASSET_GAME_TEXT_102 .incbin "./build/us_1.0/text/game/unknown_6_102.bin" -glabel ASSET_6_103 +glabel ASSET_GAME_TEXT_103 .incbin "./build/us_1.0/text/game/unknown_6_103.bin" -glabel ASSET_6_104 +glabel ASSET_GAME_TEXT_104 .incbin "./build/us_1.0/text/game/unknown_6_104.bin" -glabel ASSET_6_105 +glabel ASSET_GAME_TEXT_105 .incbin "./build/us_1.0/text/game/unknown_6_105.bin" -glabel ASSET_6_106 +glabel ASSET_GAME_TEXT_106 .incbin "./build/us_1.0/text/game/unknown_6_106.bin" -glabel ASSET_6_107 +glabel ASSET_GAME_TEXT_107 .incbin "./build/us_1.0/text/game/unknown_6_107.bin" -glabel ASSET_6_108 +glabel ASSET_GAME_TEXT_108 .incbin "./build/us_1.0/text/game/unknown_6_108.bin" -glabel ASSET_6_109 +glabel ASSET_GAME_TEXT_109 .incbin "./build/us_1.0/text/game/unknown_6_109.bin" -glabel ASSET_6_110 +glabel ASSET_GAME_TEXT_110 .incbin "./build/us_1.0/text/game/unknown_6_110.bin" -glabel ASSET_6_111 +glabel ASSET_GAME_TEXT_111 .incbin "./build/us_1.0/text/game/unknown_6_111.bin" -glabel ASSET_6_112 +glabel ASSET_GAME_TEXT_112 .incbin "./build/us_1.0/text/game/unknown_6_112.bin" -glabel ASSET_6_113 +glabel ASSET_GAME_TEXT_113 .incbin "./build/us_1.0/text/game/unknown_6_113.bin" -glabel ASSET_6_114 +glabel ASSET_GAME_TEXT_114 .incbin "./build/us_1.0/text/game/unknown_6_114.bin" -glabel ASSET_6_115 +glabel ASSET_GAME_TEXT_115 .incbin "./build/us_1.0/text/game/unknown_6_115.bin" -glabel ASSET_6_116 +glabel ASSET_GAME_TEXT_116 .incbin "./build/us_1.0/text/game/unknown_6_116.bin" -glabel ASSET_6_117 +glabel ASSET_GAME_TEXT_117 .incbin "./build/us_1.0/text/game/unknown_6_117.bin" -glabel ASSET_6_118 +glabel ASSET_GAME_TEXT_118 .incbin "./build/us_1.0/text/game/unknown_6_118.bin" -glabel ASSET_6_119 +glabel ASSET_GAME_TEXT_119 .incbin "./build/us_1.0/text/game/unknown_6_119.bin" -glabel ASSET_6_120 +glabel ASSET_GAME_TEXT_120 .incbin "./build/us_1.0/text/game/unknown_6_120.bin" -glabel ASSET_6_121 +glabel ASSET_GAME_TEXT_121 .incbin "./build/us_1.0/text/game/unknown_6_121.bin" -glabel ASSET_6_122 +glabel ASSET_GAME_TEXT_122 .incbin "./build/us_1.0/text/game/unknown_6_122.bin" -glabel ASSET_6_123 +glabel ASSET_GAME_TEXT_123 .incbin "./build/us_1.0/text/game/unknown_6_123.bin" -glabel ASSET_6_124 +glabel ASSET_GAME_TEXT_124 .incbin "./build/us_1.0/text/game/unknown_6_124.bin" -glabel ASSET_6_125 +glabel ASSET_GAME_TEXT_125 .incbin "./build/us_1.0/text/game/unknown_6_125.bin" -glabel ASSET_6_126 +glabel ASSET_GAME_TEXT_126 .incbin "./build/us_1.0/text/game/unknown_6_126.bin" -glabel ASSET_6_127 +glabel ASSET_GAME_TEXT_127 .incbin "./build/us_1.0/text/game/unknown_6_127.bin" -glabel ASSET_6_128 +glabel ASSET_GAME_TEXT_128 .incbin "./build/us_1.0/text/game/unknown_6_128.bin" -glabel ASSET_6_129 +glabel ASSET_GAME_TEXT_129 .incbin "./build/us_1.0/text/game/unknown_6_129.bin" -glabel ASSET_6_130 +glabel ASSET_GAME_TEXT_130 .incbin "./build/us_1.0/text/game/unknown_6_130.bin" -glabel ASSET_6_131 +glabel ASSET_GAME_TEXT_131 .incbin "./build/us_1.0/text/game/unknown_6_131.bin" -glabel ASSET_6_132 +glabel ASSET_GAME_TEXT_132 .incbin "./build/us_1.0/text/game/unknown_6_132.bin" -glabel ASSET_6_133 +glabel ASSET_GAME_TEXT_133 .incbin "./build/us_1.0/text/game/unknown_6_133.bin" -glabel ASSET_6_134 +glabel ASSET_GAME_TEXT_134 .incbin "./build/us_1.0/text/game/unknown_6_134.bin" -glabel ASSET_6_135 +glabel ASSET_GAME_TEXT_135 .incbin "./build/us_1.0/text/game/unknown_6_135.bin" -glabel ASSET_6_136 +glabel ASSET_GAME_TEXT_136 .incbin "./build/us_1.0/text/game/unknown_6_136.bin" -glabel ASSET_6_137 +glabel ASSET_GAME_TEXT_137 .incbin "./build/us_1.0/text/game/unknown_6_137.bin" -glabel ASSET_6_138 +glabel ASSET_GAME_TEXT_138 .incbin "./build/us_1.0/text/game/unknown_6_138.bin" -glabel ASSET_6_139 +glabel ASSET_GAME_TEXT_139 .incbin "./build/us_1.0/text/game/unknown_6_139.bin" -glabel ASSET_6_140 +glabel ASSET_GAME_TEXT_140 .incbin "./build/us_1.0/text/game/unknown_6_140.bin" -glabel ASSET_6_141 +glabel ASSET_GAME_TEXT_141 .incbin "./build/us_1.0/text/game/unknown_6_141.bin" -glabel ASSET_6_142 +glabel ASSET_GAME_TEXT_142 .incbin "./build/us_1.0/text/game/unknown_6_142.bin" -glabel ASSET_6_143 +glabel ASSET_GAME_TEXT_143 .incbin "./build/us_1.0/text/game/unknown_6_143.bin" -glabel ASSET_6_144 +glabel ASSET_GAME_TEXT_144 .incbin "./build/us_1.0/text/game/unknown_6_144.bin" -glabel ASSET_6_145 +glabel ASSET_GAME_TEXT_145 .incbin "./build/us_1.0/text/game/unknown_6_145.bin" -glabel ASSET_6_146 +glabel ASSET_GAME_TEXT_146 .incbin "./build/us_1.0/text/game/unknown_6_146.bin" -glabel ASSET_6_147 +glabel ASSET_GAME_TEXT_147 .incbin "./build/us_1.0/text/game/unknown_6_147.bin" -glabel ASSET_6_148 +glabel ASSET_GAME_TEXT_148 .incbin "./build/us_1.0/text/game/unknown_6_148.bin" -glabel ASSET_6_149 +glabel ASSET_GAME_TEXT_149 .incbin "./build/us_1.0/text/game/unknown_6_149.bin" -glabel ASSET_6_150 +glabel ASSET_GAME_TEXT_150 .incbin "./build/us_1.0/text/game/unknown_6_150.bin" -glabel ASSET_6_151 +glabel ASSET_GAME_TEXT_151 .incbin "./build/us_1.0/text/game/unknown_6_151.bin" -glabel ASSET_6_152 +glabel ASSET_GAME_TEXT_152 .incbin "./build/us_1.0/text/game/unknown_6_152.bin" -glabel ASSET_6_153 +glabel ASSET_GAME_TEXT_153 .incbin "./build/us_1.0/text/game/unknown_6_153.bin" -glabel ASSET_6_154 +glabel ASSET_GAME_TEXT_154 .incbin "./build/us_1.0/text/game/unknown_6_154.bin" -glabel ASSET_6_155 +glabel ASSET_GAME_TEXT_155 .incbin "./build/us_1.0/text/game/unknown_6_155.bin" -glabel ASSET_6_156 +glabel ASSET_GAME_TEXT_156 .incbin "./build/us_1.0/text/game/unknown_6_156.bin" -glabel ASSET_6_157 +glabel ASSET_GAME_TEXT_157 .incbin "./build/us_1.0/text/game/unknown_6_157.bin" -glabel ASSET_6_158 +glabel ASSET_GAME_TEXT_158 .incbin "./build/us_1.0/text/game/unknown_6_158.bin" -glabel ASSET_6_159 +glabel ASSET_GAME_TEXT_159 .incbin "./build/us_1.0/text/game/unknown_6_159.bin" -glabel ASSET_6_160 +glabel ASSET_GAME_TEXT_160 .incbin "./build/us_1.0/text/game/unknown_6_160.bin" -glabel ASSET_6_161 +glabel ASSET_GAME_TEXT_161 .incbin "./build/us_1.0/text/game/unknown_6_161.bin" -glabel ASSET_6_162 +glabel ASSET_GAME_TEXT_162 .incbin "./build/us_1.0/text/game/unknown_6_162.bin" -glabel ASSET_6_163 +glabel ASSET_GAME_TEXT_163 .incbin "./build/us_1.0/text/game/unknown_6_163.bin" -glabel ASSET_6_164 +glabel ASSET_GAME_TEXT_164 .incbin "./build/us_1.0/text/game/unknown_6_164.bin" -glabel ASSET_6_165 +glabel ASSET_GAME_TEXT_165 .incbin "./build/us_1.0/text/game/unknown_6_165.bin" -glabel ASSET_6_166 +glabel ASSET_GAME_TEXT_166 .incbin "./build/us_1.0/text/game/unknown_6_166.bin" -glabel ASSET_6_167 +glabel ASSET_GAME_TEXT_167 .incbin "./build/us_1.0/text/game/unknown_6_167.bin" -glabel ASSET_6_168 +glabel ASSET_GAME_TEXT_168 .incbin "./build/us_1.0/text/game/unknown_6_168.bin" -glabel ASSET_6_169 +glabel ASSET_GAME_TEXT_169 .incbin "./build/us_1.0/text/game/unknown_6_169.bin" -glabel ASSET_6_170 +glabel ASSET_GAME_TEXT_170 .incbin "./build/us_1.0/text/game/unknown_6_170.bin" -glabel ASSET_6_171 +glabel ASSET_GAME_TEXT_171 .incbin "./build/us_1.0/text/game/unknown_6_171.bin" -glabel ASSET_6_172 +glabel ASSET_GAME_TEXT_172 .incbin "./build/us_1.0/text/game/unknown_6_172.bin" -glabel ASSET_6_173 +glabel ASSET_GAME_TEXT_173 .incbin "./build/us_1.0/text/game/unknown_6_173.bin" -glabel ASSET_6_174 +glabel ASSET_GAME_TEXT_174 .incbin "./build/us_1.0/text/game/unknown_6_174.bin" -glabel ASSET_6_175 +glabel ASSET_GAME_TEXT_175 .incbin "./build/us_1.0/text/game/unknown_6_175.bin" -glabel ASSET_6_176 +glabel ASSET_GAME_TEXT_176 .incbin "./build/us_1.0/text/game/unknown_6_176.bin" -glabel ASSET_6_177 +glabel ASSET_GAME_TEXT_177 .incbin "./build/us_1.0/text/game/unknown_6_177.bin" -glabel ASSET_6_178 +glabel ASSET_GAME_TEXT_178 .incbin "./build/us_1.0/text/game/unknown_6_178.bin" -glabel ASSET_6_179 +glabel ASSET_GAME_TEXT_179 .incbin "./build/us_1.0/text/game/unknown_6_179.bin" -glabel ASSET_6_180 +glabel ASSET_GAME_TEXT_180 .incbin "./build/us_1.0/text/game/unknown_6_180.bin" -glabel ASSET_6_181 +glabel ASSET_GAME_TEXT_181 .incbin "./build/us_1.0/text/game/unknown_6_181.bin" -glabel ASSET_6_182 +glabel ASSET_GAME_TEXT_182 .incbin "./build/us_1.0/text/game/unknown_6_182.bin" -glabel ASSET_6_183 +glabel ASSET_GAME_TEXT_183 .incbin "./build/us_1.0/text/game/unknown_6_183.bin" -glabel ASSET_6_184 +glabel ASSET_GAME_TEXT_184 .incbin "./build/us_1.0/text/game/unknown_6_184.bin" -glabel ASSET_6_185 +glabel ASSET_GAME_TEXT_185 .incbin "./build/us_1.0/text/game/unknown_6_185.bin" -glabel ASSET_6_186 +glabel ASSET_GAME_TEXT_186 .incbin "./build/us_1.0/text/game/unknown_6_186.bin" -glabel ASSET_6_187 +glabel ASSET_GAME_TEXT_187 .incbin "./build/us_1.0/text/game/unknown_6_187.bin" -glabel ASSET_6_188 +glabel ASSET_GAME_TEXT_188 .incbin "./build/us_1.0/text/game/unknown_6_188.bin" -glabel ASSET_6_189 +glabel ASSET_GAME_TEXT_189 .incbin "./build/us_1.0/text/game/unknown_6_189.bin" -glabel ASSET_6_190 +glabel ASSET_GAME_TEXT_190 .incbin "./build/us_1.0/text/game/unknown_6_190.bin" -glabel ASSET_6_191 +glabel ASSET_GAME_TEXT_191 .incbin "./build/us_1.0/text/game/unknown_6_191.bin" -glabel ASSET_6_192 +glabel ASSET_GAME_TEXT_192 .incbin "./build/us_1.0/text/game/unknown_6_192.bin" -glabel ASSET_6_193 +glabel ASSET_GAME_TEXT_193 .incbin "./build/us_1.0/text/game/unknown_6_193.bin" -glabel ASSET_6_194 +glabel ASSET_GAME_TEXT_194 .incbin "./build/us_1.0/text/game/unknown_6_194.bin" -glabel ASSET_6_195 +glabel ASSET_GAME_TEXT_195 .incbin "./build/us_1.0/text/game/unknown_6_195.bin" -glabel ASSET_6_196 +glabel ASSET_GAME_TEXT_196 .incbin "./build/us_1.0/text/game/unknown_6_196.bin" -glabel ASSET_6_197 +glabel ASSET_GAME_TEXT_197 .incbin "./build/us_1.0/text/game/unknown_6_197.bin" -glabel ASSET_6_198 +glabel ASSET_GAME_TEXT_198 .incbin "./build/us_1.0/text/game/unknown_6_198.bin" -glabel ASSET_6_199 +glabel ASSET_GAME_TEXT_199 .incbin "./build/us_1.0/text/game/unknown_6_199.bin" -glabel ASSET_6_200 +glabel ASSET_GAME_TEXT_200 .incbin "./build/us_1.0/text/game/unknown_6_200.bin" -glabel ASSET_6_201 +glabel ASSET_GAME_TEXT_201 .incbin "./build/us_1.0/text/game/unknown_6_201.bin" -glabel ASSET_6_202 +glabel ASSET_GAME_TEXT_202 .incbin "./build/us_1.0/text/game/unknown_6_202.bin" -glabel ASSET_6_203 +glabel ASSET_GAME_TEXT_203 .incbin "./build/us_1.0/text/game/unknown_6_203.bin" -glabel ASSET_6_204 +glabel ASSET_GAME_TEXT_204 .incbin "./build/us_1.0/text/game/unknown_6_204.bin" -glabel ASSET_6_205 +glabel ASSET_GAME_TEXT_205 .incbin "./build/us_1.0/text/game/unknown_6_205.bin" -glabel ASSET_6_206 +glabel ASSET_GAME_TEXT_206 .incbin "./build/us_1.0/text/game/unknown_6_206.bin" -glabel ASSET_6_207 +glabel ASSET_GAME_TEXT_207 .incbin "./build/us_1.0/text/game/unknown_6_207.bin" -glabel ASSET_6_208 +glabel ASSET_GAME_TEXT_208 .incbin "./build/us_1.0/text/game/unknown_6_208.bin" -glabel ASSET_6_209 +glabel ASSET_GAME_TEXT_209 .incbin "./build/us_1.0/text/game/unknown_6_209.bin" -glabel ASSET_6_210 +glabel ASSET_GAME_TEXT_210 .incbin "./build/us_1.0/text/game/unknown_6_210.bin" -glabel ASSET_6_211 +glabel ASSET_GAME_TEXT_211 .incbin "./build/us_1.0/text/game/unknown_6_211.bin" -glabel ASSET_6_212 +glabel ASSET_GAME_TEXT_212 .incbin "./build/us_1.0/text/game/unknown_6_212.bin" -glabel ASSET_6_213 +glabel ASSET_GAME_TEXT_213 .incbin "./build/us_1.0/text/game/unknown_6_213.bin" -glabel ASSET_6_214 +glabel ASSET_GAME_TEXT_214 .incbin "./build/us_1.0/text/game/unknown_6_214.bin" -glabel ASSET_6_215 +glabel ASSET_GAME_TEXT_215 .incbin "./build/us_1.0/text/game/unknown_6_215.bin" -glabel ASSET_6_216 +glabel ASSET_GAME_TEXT_216 .incbin "./build/us_1.0/text/game/unknown_6_216.bin" -glabel ASSET_6_217 +glabel ASSET_GAME_TEXT_217 .incbin "./build/us_1.0/text/game/unknown_6_217.bin" -glabel ASSET_6_218 +glabel ASSET_GAME_TEXT_218 .incbin "./build/us_1.0/text/game/unknown_6_218.bin" -glabel ASSET_6_219 +glabel ASSET_GAME_TEXT_219 .incbin "./build/us_1.0/text/game/unknown_6_219.bin" -glabel ASSET_6_220 +glabel ASSET_GAME_TEXT_220 .incbin "./build/us_1.0/text/game/unknown_6_220.bin" -glabel ASSET_6_221 +glabel ASSET_GAME_TEXT_221 .incbin "./build/us_1.0/text/game/unknown_6_221.bin" -glabel ASSET_6_222 +glabel ASSET_GAME_TEXT_222 .incbin "./build/us_1.0/text/game/unknown_6_222.bin" -glabel ASSET_6_223 +glabel ASSET_GAME_TEXT_223 .incbin "./build/us_1.0/text/game/unknown_6_223.bin" -glabel ASSET_6_224 +glabel ASSET_GAME_TEXT_224 .incbin "./build/us_1.0/text/game/unknown_6_224.bin" -glabel ASSET_6_225 +glabel ASSET_GAME_TEXT_225 .incbin "./build/us_1.0/text/game/unknown_6_225.bin" -glabel ASSET_6_226 +glabel ASSET_GAME_TEXT_226 .incbin "./build/us_1.0/text/game/unknown_6_226.bin" -glabel ASSET_6_227 +glabel ASSET_GAME_TEXT_227 .incbin "./build/us_1.0/text/game/unknown_6_227.bin" -glabel ASSET_6_228 +glabel ASSET_GAME_TEXT_228 .incbin "./build/us_1.0/text/game/unknown_6_228.bin" -glabel ASSET_6_229 +glabel ASSET_GAME_TEXT_229 .incbin "./build/us_1.0/text/game/unknown_6_229.bin" -glabel ASSET_6_230 +glabel ASSET_GAME_TEXT_230 .incbin "./build/us_1.0/text/game/unknown_6_230.bin" -glabel ASSET_6_231 +glabel ASSET_GAME_TEXT_231 .incbin "./build/us_1.0/text/game/unknown_6_231.bin" -glabel ASSET_6_232 +glabel ASSET_GAME_TEXT_232 .incbin "./build/us_1.0/text/game/unknown_6_232.bin" -glabel ASSET_6_233 +glabel ASSET_GAME_TEXT_233 .incbin "./build/us_1.0/text/game/unknown_6_233.bin" -glabel ASSET_6_234 +glabel ASSET_GAME_TEXT_234 .incbin "./build/us_1.0/text/game/unknown_6_234.bin" -glabel ASSET_6_235 +glabel ASSET_GAME_TEXT_235 .incbin "./build/us_1.0/text/game/unknown_6_235.bin" -glabel ASSET_6_236 +glabel ASSET_GAME_TEXT_236 .incbin "./build/us_1.0/text/game/unknown_6_236.bin" -glabel ASSET_6_237 +glabel ASSET_GAME_TEXT_237 .incbin "./build/us_1.0/text/game/unknown_6_237.bin" -glabel ASSET_6_238 +glabel ASSET_GAME_TEXT_238 .incbin "./build/us_1.0/text/game/unknown_6_238.bin" -glabel ASSET_6_239 +glabel ASSET_GAME_TEXT_239 .incbin "./build/us_1.0/text/game/unknown_6_239.bin" -glabel ASSET_6_240 +glabel ASSET_GAME_TEXT_240 .incbin "./build/us_1.0/text/game/unknown_6_240.bin" -glabel ASSET_6_241 +glabel ASSET_GAME_TEXT_241 .incbin "./build/us_1.0/text/game/unknown_6_241.bin" -glabel ASSET_6_242 +glabel ASSET_GAME_TEXT_242 .incbin "./build/us_1.0/text/game/unknown_6_242.bin" -glabel ASSET_6_243 +glabel ASSET_GAME_TEXT_243 .incbin "./build/us_1.0/text/game/unknown_6_243.bin" -glabel ASSET_6_244 +glabel ASSET_GAME_TEXT_244 .incbin "./build/us_1.0/text/game/unknown_6_244.bin" -glabel ASSET_6_245 +glabel ASSET_GAME_TEXT_245 .incbin "./build/us_1.0/text/game/unknown_6_245.bin" -glabel ASSET_6_246 +glabel ASSET_GAME_TEXT_246 .incbin "./build/us_1.0/text/game/unknown_6_246.bin" -glabel ASSET_6_247 +glabel ASSET_GAME_TEXT_247 .incbin "./build/us_1.0/text/game/unknown_6_247.bin" -glabel ASSET_6_248 +glabel ASSET_GAME_TEXT_248 .incbin "./build/us_1.0/text/game/unknown_6_248.bin" -glabel ASSET_6_249 +glabel ASSET_GAME_TEXT_249 .incbin "./build/us_1.0/text/game/unknown_6_249.bin" -glabel ASSET_6_250 +glabel ASSET_GAME_TEXT_250 .incbin "./build/us_1.0/text/game/unknown_6_250.bin" -glabel ASSET_6_251 +glabel ASSET_GAME_TEXT_251 .incbin "./build/us_1.0/text/game/unknown_6_251.bin" -glabel ASSET_6_252 +glabel ASSET_GAME_TEXT_252 .incbin "./build/us_1.0/text/game/unknown_6_252.bin" -glabel ASSET_6_253 +glabel ASSET_GAME_TEXT_253 .incbin "./build/us_1.0/text/game/unknown_6_253.bin" -glabel ASSET_6_254 +glabel ASSET_GAME_TEXT_254 .incbin "./build/us_1.0/text/game/unknown_6_254.bin" -glabel ASSET_SECTION_6_END +glabel ASSET_GAME_TEXT_END + +/********** ASSET_GAME_TEXT_TABLE **********/ .balign 16 -glabel ASSET_SECTION_7 -.word (ASSET_6_0 - ASSET_SECTION_6) | 0x80000000 -.word ASSET_6_1 - ASSET_SECTION_6 -.word ASSET_6_2 - ASSET_SECTION_6 -.word ASSET_6_3 - ASSET_SECTION_6 -.word ASSET_6_4 - ASSET_SECTION_6 -.word ASSET_6_5 - ASSET_SECTION_6 -.word ASSET_6_6 - ASSET_SECTION_6 -.word ASSET_6_7 - ASSET_SECTION_6 -.word ASSET_6_8 - ASSET_SECTION_6 -.word ASSET_6_9 - ASSET_SECTION_6 -.word ASSET_6_10 - ASSET_SECTION_6 -.word ASSET_6_11 - ASSET_SECTION_6 -.word ASSET_6_12 - ASSET_SECTION_6 -.word ASSET_6_13 - ASSET_SECTION_6 -.word ASSET_6_14 - ASSET_SECTION_6 -.word ASSET_6_15 - ASSET_SECTION_6 -.word ASSET_6_16 - ASSET_SECTION_6 -.word ASSET_6_17 - ASSET_SECTION_6 -.word ASSET_6_18 - ASSET_SECTION_6 -.word ASSET_6_19 - ASSET_SECTION_6 -.word ASSET_6_20 - ASSET_SECTION_6 -.word ASSET_6_21 - ASSET_SECTION_6 -.word ASSET_6_22 - ASSET_SECTION_6 -.word ASSET_6_23 - ASSET_SECTION_6 -.word ASSET_6_24 - ASSET_SECTION_6 -.word ASSET_6_25 - ASSET_SECTION_6 -.word ASSET_6_26 - ASSET_SECTION_6 -.word ASSET_6_27 - ASSET_SECTION_6 -.word ASSET_6_28 - ASSET_SECTION_6 -.word ASSET_6_29 - ASSET_SECTION_6 -.word ASSET_6_30 - ASSET_SECTION_6 -.word ASSET_6_31 - ASSET_SECTION_6 -.word ASSET_6_32 - ASSET_SECTION_6 -.word ASSET_6_33 - ASSET_SECTION_6 -.word ASSET_6_34 - ASSET_SECTION_6 -.word ASSET_6_35 - ASSET_SECTION_6 -.word ASSET_6_36 - ASSET_SECTION_6 -.word ASSET_6_37 - ASSET_SECTION_6 -.word ASSET_6_38 - ASSET_SECTION_6 -.word ASSET_6_39 - ASSET_SECTION_6 -.word ASSET_6_40 - ASSET_SECTION_6 -.word ASSET_6_41 - ASSET_SECTION_6 -.word ASSET_6_42 - ASSET_SECTION_6 -.word ASSET_6_43 - ASSET_SECTION_6 -.word ASSET_6_44 - ASSET_SECTION_6 -.word ASSET_6_45 - ASSET_SECTION_6 -.word ASSET_6_46 - ASSET_SECTION_6 -.word ASSET_6_47 - ASSET_SECTION_6 -.word ASSET_6_48 - ASSET_SECTION_6 -.word ASSET_6_49 - ASSET_SECTION_6 -.word (ASSET_6_50 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_51 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_52 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_53 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_54 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_55 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_56 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_57 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_58 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_59 - ASSET_SECTION_6) | 0x80000000 -.word ASSET_6_60 - ASSET_SECTION_6 -.word ASSET_6_61 - ASSET_SECTION_6 -.word ASSET_6_62 - ASSET_SECTION_6 -.word ASSET_6_63 - ASSET_SECTION_6 -.word (ASSET_6_64 - ASSET_SECTION_6) | 0x80000000 -.word ASSET_6_65 - ASSET_SECTION_6 -.word (ASSET_6_66 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_67 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_68 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_69 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_70 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_71 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_72 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_73 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_74 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_75 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_76 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_77 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_78 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_79 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_80 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_81 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_82 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_83 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_84 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_85 - ASSET_SECTION_6) | 0x80000000 -.word ASSET_6_86 - ASSET_SECTION_6 -.word ASSET_6_87 - ASSET_SECTION_6 -.word ASSET_6_88 - ASSET_SECTION_6 -.word ASSET_6_89 - ASSET_SECTION_6 -.word ASSET_6_90 - ASSET_SECTION_6 -.word ASSET_6_91 - ASSET_SECTION_6 -.word ASSET_6_92 - ASSET_SECTION_6 -.word ASSET_6_93 - ASSET_SECTION_6 -.word ASSET_6_94 - ASSET_SECTION_6 -.word ASSET_6_95 - ASSET_SECTION_6 -.word ASSET_6_96 - ASSET_SECTION_6 -.word ASSET_6_97 - ASSET_SECTION_6 -.word ASSET_6_98 - ASSET_SECTION_6 -.word ASSET_6_99 - ASSET_SECTION_6 -.word ASSET_6_100 - ASSET_SECTION_6 -.word ASSET_6_101 - ASSET_SECTION_6 -.word ASSET_6_102 - ASSET_SECTION_6 -.word ASSET_6_103 - ASSET_SECTION_6 -.word ASSET_6_104 - ASSET_SECTION_6 -.word ASSET_6_105 - ASSET_SECTION_6 -.word ASSET_6_106 - ASSET_SECTION_6 -.word ASSET_6_107 - ASSET_SECTION_6 -.word ASSET_6_108 - ASSET_SECTION_6 -.word ASSET_6_109 - ASSET_SECTION_6 -.word ASSET_6_110 - ASSET_SECTION_6 -.word ASSET_6_111 - ASSET_SECTION_6 -.word ASSET_6_112 - ASSET_SECTION_6 -.word ASSET_6_113 - ASSET_SECTION_6 -.word ASSET_6_114 - ASSET_SECTION_6 -.word ASSET_6_115 - ASSET_SECTION_6 -.word ASSET_6_116 - ASSET_SECTION_6 -.word ASSET_6_117 - ASSET_SECTION_6 -.word ASSET_6_118 - ASSET_SECTION_6 -.word ASSET_6_119 - ASSET_SECTION_6 -.word ASSET_6_120 - ASSET_SECTION_6 -.word ASSET_6_121 - ASSET_SECTION_6 -.word ASSET_6_122 - ASSET_SECTION_6 -.word ASSET_6_123 - ASSET_SECTION_6 -.word ASSET_6_124 - ASSET_SECTION_6 -.word ASSET_6_125 - ASSET_SECTION_6 -.word ASSET_6_126 - ASSET_SECTION_6 -.word ASSET_6_127 - ASSET_SECTION_6 -.word ASSET_6_128 - ASSET_SECTION_6 -.word ASSET_6_129 - ASSET_SECTION_6 -.word ASSET_6_130 - ASSET_SECTION_6 -.word ASSET_6_131 - ASSET_SECTION_6 -.word ASSET_6_132 - ASSET_SECTION_6 -.word ASSET_6_133 - ASSET_SECTION_6 -.word ASSET_6_134 - ASSET_SECTION_6 -.word (ASSET_6_135 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_136 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_137 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_138 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_139 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_140 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_141 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_142 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_143 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_144 - ASSET_SECTION_6) | 0x80000000 -.word ASSET_6_145 - ASSET_SECTION_6 -.word ASSET_6_146 - ASSET_SECTION_6 -.word ASSET_6_147 - ASSET_SECTION_6 -.word ASSET_6_148 - ASSET_SECTION_6 -.word (ASSET_6_149 - ASSET_SECTION_6) | 0x80000000 -.word ASSET_6_150 - ASSET_SECTION_6 -.word (ASSET_6_151 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_152 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_153 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_154 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_155 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_156 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_157 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_158 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_159 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_160 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_161 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_162 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_163 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_164 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_165 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_166 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_167 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_168 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_169 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_170 - ASSET_SECTION_6) | 0x80000000 -.word ASSET_6_171 - ASSET_SECTION_6 -.word ASSET_6_172 - ASSET_SECTION_6 -.word ASSET_6_173 - ASSET_SECTION_6 -.word ASSET_6_174 - ASSET_SECTION_6 -.word ASSET_6_175 - ASSET_SECTION_6 -.word ASSET_6_176 - ASSET_SECTION_6 -.word ASSET_6_177 - ASSET_SECTION_6 -.word ASSET_6_178 - ASSET_SECTION_6 -.word ASSET_6_179 - ASSET_SECTION_6 -.word ASSET_6_180 - ASSET_SECTION_6 -.word ASSET_6_181 - ASSET_SECTION_6 -.word ASSET_6_182 - ASSET_SECTION_6 -.word ASSET_6_183 - ASSET_SECTION_6 -.word ASSET_6_184 - ASSET_SECTION_6 -.word ASSET_6_185 - ASSET_SECTION_6 -.word ASSET_6_186 - ASSET_SECTION_6 -.word ASSET_6_187 - ASSET_SECTION_6 -.word ASSET_6_188 - ASSET_SECTION_6 -.word ASSET_6_189 - ASSET_SECTION_6 -.word ASSET_6_190 - ASSET_SECTION_6 -.word ASSET_6_191 - ASSET_SECTION_6 -.word ASSET_6_192 - ASSET_SECTION_6 -.word ASSET_6_193 - ASSET_SECTION_6 -.word ASSET_6_194 - ASSET_SECTION_6 -.word ASSET_6_195 - ASSET_SECTION_6 -.word ASSET_6_196 - ASSET_SECTION_6 -.word ASSET_6_197 - ASSET_SECTION_6 -.word ASSET_6_198 - ASSET_SECTION_6 -.word ASSET_6_199 - ASSET_SECTION_6 -.word ASSET_6_200 - ASSET_SECTION_6 -.word ASSET_6_201 - ASSET_SECTION_6 -.word ASSET_6_202 - ASSET_SECTION_6 -.word ASSET_6_203 - ASSET_SECTION_6 -.word ASSET_6_204 - ASSET_SECTION_6 -.word ASSET_6_205 - ASSET_SECTION_6 -.word ASSET_6_206 - ASSET_SECTION_6 -.word ASSET_6_207 - ASSET_SECTION_6 -.word ASSET_6_208 - ASSET_SECTION_6 -.word ASSET_6_209 - ASSET_SECTION_6 -.word ASSET_6_210 - ASSET_SECTION_6 -.word ASSET_6_211 - ASSET_SECTION_6 -.word ASSET_6_212 - ASSET_SECTION_6 -.word ASSET_6_213 - ASSET_SECTION_6 -.word ASSET_6_214 - ASSET_SECTION_6 -.word ASSET_6_215 - ASSET_SECTION_6 -.word ASSET_6_216 - ASSET_SECTION_6 -.word ASSET_6_217 - ASSET_SECTION_6 -.word ASSET_6_218 - ASSET_SECTION_6 -.word ASSET_6_219 - ASSET_SECTION_6 -.word (ASSET_6_220 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_221 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_222 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_223 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_224 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_225 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_226 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_227 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_228 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_229 - ASSET_SECTION_6) | 0x80000000 -.word ASSET_6_230 - ASSET_SECTION_6 -.word ASSET_6_231 - ASSET_SECTION_6 -.word ASSET_6_232 - ASSET_SECTION_6 -.word ASSET_6_233 - ASSET_SECTION_6 -.word (ASSET_6_234 - ASSET_SECTION_6) | 0x80000000 -.word ASSET_6_235 - ASSET_SECTION_6 -.word (ASSET_6_236 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_237 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_238 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_239 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_240 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_241 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_242 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_243 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_244 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_245 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_246 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_247 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_248 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_249 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_250 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_251 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_252 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_253 - ASSET_SECTION_6) | 0x80000000 -.word (ASSET_6_254 - ASSET_SECTION_6) | 0x80000000 -.word ASSET_SECTION_6_END - ASSET_SECTION_6 +glabel ASSET_GAME_TEXT_TABLE +.word (ASSET_GAME_TEXT_0 - ASSET_GAME_TEXT) | 0x80000000 +.word ASSET_GAME_TEXT_1 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_2 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_3 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_4 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_5 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_6 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_7 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_8 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_9 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_10 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_11 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_12 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_13 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_14 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_15 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_16 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_17 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_18 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_19 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_20 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_21 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_22 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_23 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_24 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_25 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_26 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_27 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_28 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_29 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_30 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_31 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_32 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_33 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_34 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_35 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_36 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_37 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_38 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_39 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_40 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_41 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_42 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_43 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_44 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_45 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_46 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_47 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_48 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_49 - ASSET_GAME_TEXT +.word (ASSET_GAME_TEXT_50 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_51 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_52 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_53 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_54 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_55 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_56 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_57 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_58 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_59 - ASSET_GAME_TEXT) | 0x80000000 +.word ASSET_GAME_TEXT_60 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_61 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_62 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_63 - ASSET_GAME_TEXT +.word (ASSET_GAME_TEXT_64 - ASSET_GAME_TEXT) | 0x80000000 +.word ASSET_GAME_TEXT_65 - ASSET_GAME_TEXT +.word (ASSET_GAME_TEXT_66 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_67 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_68 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_69 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_70 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_71 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_72 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_73 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_74 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_75 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_76 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_77 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_78 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_79 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_80 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_81 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_82 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_83 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_84 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_85 - ASSET_GAME_TEXT) | 0x80000000 +.word ASSET_GAME_TEXT_86 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_87 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_88 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_89 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_90 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_91 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_92 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_93 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_94 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_95 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_96 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_97 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_98 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_99 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_100 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_101 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_102 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_103 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_104 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_105 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_106 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_107 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_108 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_109 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_110 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_111 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_112 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_113 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_114 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_115 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_116 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_117 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_118 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_119 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_120 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_121 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_122 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_123 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_124 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_125 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_126 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_127 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_128 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_129 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_130 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_131 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_132 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_133 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_134 - ASSET_GAME_TEXT +.word (ASSET_GAME_TEXT_135 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_136 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_137 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_138 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_139 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_140 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_141 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_142 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_143 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_144 - ASSET_GAME_TEXT) | 0x80000000 +.word ASSET_GAME_TEXT_145 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_146 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_147 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_148 - ASSET_GAME_TEXT +.word (ASSET_GAME_TEXT_149 - ASSET_GAME_TEXT) | 0x80000000 +.word ASSET_GAME_TEXT_150 - ASSET_GAME_TEXT +.word (ASSET_GAME_TEXT_151 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_152 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_153 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_154 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_155 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_156 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_157 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_158 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_159 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_160 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_161 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_162 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_163 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_164 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_165 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_166 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_167 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_168 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_169 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_170 - ASSET_GAME_TEXT) | 0x80000000 +.word ASSET_GAME_TEXT_171 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_172 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_173 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_174 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_175 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_176 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_177 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_178 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_179 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_180 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_181 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_182 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_183 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_184 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_185 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_186 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_187 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_188 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_189 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_190 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_191 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_192 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_193 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_194 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_195 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_196 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_197 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_198 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_199 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_200 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_201 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_202 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_203 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_204 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_205 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_206 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_207 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_208 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_209 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_210 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_211 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_212 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_213 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_214 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_215 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_216 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_217 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_218 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_219 - ASSET_GAME_TEXT +.word (ASSET_GAME_TEXT_220 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_221 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_222 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_223 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_224 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_225 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_226 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_227 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_228 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_229 - ASSET_GAME_TEXT) | 0x80000000 +.word ASSET_GAME_TEXT_230 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_231 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_232 - ASSET_GAME_TEXT +.word ASSET_GAME_TEXT_233 - ASSET_GAME_TEXT +.word (ASSET_GAME_TEXT_234 - ASSET_GAME_TEXT) | 0x80000000 +.word ASSET_GAME_TEXT_235 - ASSET_GAME_TEXT +.word (ASSET_GAME_TEXT_236 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_237 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_238 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_239 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_240 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_241 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_242 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_243 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_244 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_245 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_246 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_247 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_248 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_249 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_250 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_251 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_252 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_253 - ASSET_GAME_TEXT) | 0x80000000 +.word (ASSET_GAME_TEXT_254 - ASSET_GAME_TEXT) | 0x80000000 +.word ASSET_GAME_TEXT_END - ASSET_GAME_TEXT .word 0xFFFFFFFF -glabel ASSET_SECTION_7_END + +/********** ASSET_MENU_TEXT **********/ .balign 16 -glabel ASSET_SECTION_8 -glabel ASSET_8_0 +glabel ASSET_MENU_TEXT +glabel ASSET_MENU_TEXT_ENGLISH .incbin "./build/us_1.0/text/menu/english_menu_text.bin" -glabel ASSET_8_1 -.incbin "./build/us_1.0/text/menu/german_menu_text.bin" -glabel ASSET_8_2 +glabel ASSET_MENU_TEXT_FRENCH .incbin "./build/us_1.0/text/menu/french_menu_text.bin" -glabel ASSET_8_3 +glabel ASSET_MENU_TEXT_GERMAN +.incbin "./build/us_1.0/text/menu/german_menu_text.bin" +glabel ASSET_MENU_TEXT_JAPANESE .incbin "./build/us_1.0/text/menu/japanese_menu_text.bin" -glabel ASSET_SECTION_8_END +glabel ASSET_MENU_TEXT_END + +/********** ASSET_MENU_TEXT_TABLE **********/ .balign 16 -glabel ASSET_SECTION_9 -.word 186# Number of text entries for each language -.word ASSET_8_0 - ASSET_SECTION_8 -.word ASSET_8_1 - ASSET_SECTION_8 -.word ASSET_8_2 - ASSET_SECTION_8 -.word ASSET_8_3 - ASSET_SECTION_8 -.word ASSET_SECTION_8_END - ASSET_SECTION_8 +glabel ASSET_MENU_TEXT_TABLE +.word 186 # Number of text entries for the languages +.word ASSET_MENU_TEXT_ENGLISH - ASSET_MENU_TEXT +.word ASSET_MENU_TEXT_FRENCH - ASSET_MENU_TEXT +.word ASSET_MENU_TEXT_GERMAN - ASSET_MENU_TEXT +.word ASSET_MENU_TEXT_JAPANESE - ASSET_MENU_TEXT +.word ASSET_MENU_TEXT_END - ASSET_MENU_TEXT .word 0xFFFFFFFF -glabel ASSET_SECTION_9_END + +/********** ASSET_SCREENS **********/ .balign 16 -glabel ASSET_SECTION_10 -glabel ASSET_SECTION_10_END +glabel ASSET_SCREENS +glabel ASSET_SCREENS_END + +/********** ASSET_SCREENS_TABLE **********/ .balign 16 -glabel ASSET_SECTION_11 -.word ASSET_SECTION_10_END - ASSET_SECTION_10 +glabel ASSET_SCREENS_TABLE +.word ASSET_SCREENS_END - ASSET_SCREENS .word 0xFFFFFFFF -glabel ASSET_SECTION_11_END + +/********** ASSET_SPRITES **********/ .balign 16 -glabel ASSET_SECTION_12 -glabel ASSET_12_0 +glabel ASSET_SPRITES +glabel ASSET_SPRITES_0 .incbin "./build/us_1.0/sprites/unknown_12_0.bin" -glabel ASSET_12_1 +glabel ASSET_SPRITES_1 .incbin "./build/us_1.0/sprites/unknown_12_1.bin" -glabel ASSET_12_2 +glabel ASSET_SPRITES_2 .incbin "./build/us_1.0/sprites/unknown_12_2.bin" -glabel ASSET_12_3 +glabel ASSET_SPRITES_3 .incbin "./build/us_1.0/sprites/unknown_12_3.bin" -glabel ASSET_12_4 +glabel ASSET_SPRITES_4 .incbin "./build/us_1.0/sprites/unknown_12_4.bin" -glabel ASSET_12_5 +glabel ASSET_SPRITES_5 .incbin "./build/us_1.0/sprites/unknown_12_5.bin" -glabel ASSET_12_6 +glabel ASSET_SPRITES_6 .incbin "./build/us_1.0/sprites/unknown_12_6.bin" -glabel ASSET_12_7 +glabel ASSET_SPRITES_7 .incbin "./build/us_1.0/sprites/unknown_12_7.bin" -glabel ASSET_12_8 +glabel ASSET_SPRITES_8 .incbin "./build/us_1.0/sprites/unknown_12_8.bin" -glabel ASSET_12_9 +glabel ASSET_SPRITES_9 .incbin "./build/us_1.0/sprites/unknown_12_9.bin" -glabel ASSET_12_10 +glabel ASSET_SPRITES_10 .incbin "./build/us_1.0/sprites/unknown_12_10.bin" -glabel ASSET_12_11 +glabel ASSET_SPRITES_11 .incbin "./build/us_1.0/sprites/unknown_12_11.bin" -glabel ASSET_12_12 +glabel ASSET_SPRITES_12 .incbin "./build/us_1.0/sprites/unknown_12_12.bin" -glabel ASSET_12_13 +glabel ASSET_SPRITES_13 .incbin "./build/us_1.0/sprites/unknown_12_13.bin" -glabel ASSET_12_14 +glabel ASSET_SPRITES_14 .incbin "./build/us_1.0/sprites/unknown_12_14.bin" -glabel ASSET_12_15 +glabel ASSET_SPRITES_15 .incbin "./build/us_1.0/sprites/unknown_12_15.bin" -glabel ASSET_12_16 +glabel ASSET_SPRITES_16 .incbin "./build/us_1.0/sprites/unknown_12_16.bin" -glabel ASSET_12_17 +glabel ASSET_SPRITES_17 .incbin "./build/us_1.0/sprites/unknown_12_17.bin" -glabel ASSET_12_18 +glabel ASSET_SPRITES_18 .incbin "./build/us_1.0/sprites/unknown_12_18.bin" -glabel ASSET_12_19 +glabel ASSET_SPRITES_19 .incbin "./build/us_1.0/sprites/unknown_12_19.bin" -glabel ASSET_12_20 +glabel ASSET_SPRITES_20 .incbin "./build/us_1.0/sprites/unknown_12_20.bin" -glabel ASSET_12_21 +glabel ASSET_SPRITES_21 .incbin "./build/us_1.0/sprites/unknown_12_21.bin" -glabel ASSET_12_22 +glabel ASSET_SPRITES_22 .incbin "./build/us_1.0/sprites/unknown_12_22.bin" -glabel ASSET_12_23 +glabel ASSET_SPRITES_23 .incbin "./build/us_1.0/sprites/unknown_12_23.bin" -glabel ASSET_12_24 +glabel ASSET_SPRITES_24 .incbin "./build/us_1.0/sprites/unknown_12_24.bin" -glabel ASSET_12_25 +glabel ASSET_SPRITES_25 .incbin "./build/us_1.0/sprites/unknown_12_25.bin" -glabel ASSET_12_26 +glabel ASSET_SPRITES_26 .incbin "./build/us_1.0/sprites/unknown_12_26.bin" -glabel ASSET_12_27 +glabel ASSET_SPRITES_27 .incbin "./build/us_1.0/sprites/unknown_12_27.bin" -glabel ASSET_12_28 +glabel ASSET_SPRITES_28 .incbin "./build/us_1.0/sprites/unknown_12_28.bin" -glabel ASSET_12_29 +glabel ASSET_SPRITES_29 .incbin "./build/us_1.0/sprites/unknown_12_29.bin" -glabel ASSET_12_30 +glabel ASSET_SPRITES_30 .incbin "./build/us_1.0/sprites/unknown_12_30.bin" -glabel ASSET_12_31 +glabel ASSET_SPRITES_31 .incbin "./build/us_1.0/sprites/unknown_12_31.bin" -glabel ASSET_12_32 +glabel ASSET_SPRITES_32 .incbin "./build/us_1.0/sprites/unknown_12_32.bin" -glabel ASSET_12_33 +glabel ASSET_SPRITES_33 .incbin "./build/us_1.0/sprites/unknown_12_33.bin" -glabel ASSET_12_34 +glabel ASSET_SPRITES_34 .incbin "./build/us_1.0/sprites/unknown_12_34.bin" -glabel ASSET_12_35 +glabel ASSET_SPRITES_35 .incbin "./build/us_1.0/sprites/unknown_12_35.bin" -glabel ASSET_12_36 +glabel ASSET_SPRITES_36 .incbin "./build/us_1.0/sprites/unknown_12_36.bin" -glabel ASSET_12_37 +glabel ASSET_SPRITES_37 .incbin "./build/us_1.0/sprites/unknown_12_37.bin" -glabel ASSET_12_38 +glabel ASSET_SPRITES_38 .incbin "./build/us_1.0/sprites/unknown_12_38.bin" -glabel ASSET_12_39 +glabel ASSET_SPRITES_39 .incbin "./build/us_1.0/sprites/unknown_12_39.bin" -glabel ASSET_12_40 +glabel ASSET_SPRITES_40 .incbin "./build/us_1.0/sprites/unknown_12_40.bin" -glabel ASSET_12_41 +glabel ASSET_SPRITES_41 .incbin "./build/us_1.0/sprites/unknown_12_41.bin" -glabel ASSET_12_42 +glabel ASSET_SPRITES_42 .incbin "./build/us_1.0/sprites/unknown_12_42.bin" -glabel ASSET_12_43 +glabel ASSET_SPRITES_43 .incbin "./build/us_1.0/sprites/unknown_12_43.bin" -glabel ASSET_12_44 +glabel ASSET_SPRITES_44 .incbin "./build/us_1.0/sprites/unknown_12_44.bin" -glabel ASSET_12_45 +glabel ASSET_SPRITES_45 .incbin "./build/us_1.0/sprites/unknown_12_45.bin" -glabel ASSET_12_46 +glabel ASSET_SPRITES_46 .incbin "./build/us_1.0/sprites/unknown_12_46.bin" -glabel ASSET_12_47 +glabel ASSET_SPRITES_47 .incbin "./build/us_1.0/sprites/unknown_12_47.bin" -glabel ASSET_12_48 +glabel ASSET_SPRITES_48 .incbin "./build/us_1.0/sprites/unknown_12_48.bin" -glabel ASSET_12_49 +glabel ASSET_SPRITES_49 .incbin "./build/us_1.0/sprites/unknown_12_49.bin" -glabel ASSET_12_50 +glabel ASSET_SPRITES_50 .incbin "./build/us_1.0/sprites/unknown_12_50.bin" -glabel ASSET_12_51 +glabel ASSET_SPRITES_51 .incbin "./build/us_1.0/sprites/unknown_12_51.bin" -glabel ASSET_12_52 +glabel ASSET_SPRITES_52 .incbin "./build/us_1.0/sprites/unknown_12_52.bin" -glabel ASSET_12_53 +glabel ASSET_SPRITES_53 .incbin "./build/us_1.0/sprites/unknown_12_53.bin" -glabel ASSET_12_54 +glabel ASSET_SPRITES_54 .incbin "./build/us_1.0/sprites/unknown_12_54.bin" -glabel ASSET_12_55 +glabel ASSET_SPRITES_55 .incbin "./build/us_1.0/sprites/unknown_12_55.bin" -glabel ASSET_12_56 +glabel ASSET_SPRITES_56 .incbin "./build/us_1.0/sprites/unknown_12_56.bin" -glabel ASSET_12_57 +glabel ASSET_SPRITES_57 .incbin "./build/us_1.0/sprites/unknown_12_57.bin" -glabel ASSET_12_58 +glabel ASSET_SPRITES_58 .incbin "./build/us_1.0/sprites/unknown_12_58.bin" -glabel ASSET_12_59 +glabel ASSET_SPRITES_59 .incbin "./build/us_1.0/sprites/unknown_12_59.bin" -glabel ASSET_12_60 +glabel ASSET_SPRITES_60 .incbin "./build/us_1.0/sprites/unknown_12_60.bin" -glabel ASSET_12_61 +glabel ASSET_SPRITES_61 .incbin "./build/us_1.0/sprites/unknown_12_61.bin" -glabel ASSET_12_62 +glabel ASSET_SPRITES_62 .incbin "./build/us_1.0/sprites/unknown_12_62.bin" -glabel ASSET_12_63 +glabel ASSET_SPRITES_63 .incbin "./build/us_1.0/sprites/unknown_12_63.bin" -glabel ASSET_12_64 +glabel ASSET_SPRITES_64 .incbin "./build/us_1.0/sprites/unknown_12_64.bin" -glabel ASSET_12_65 +glabel ASSET_SPRITES_65 .incbin "./build/us_1.0/sprites/unknown_12_65.bin" -glabel ASSET_12_66 +glabel ASSET_SPRITES_66 .incbin "./build/us_1.0/sprites/unknown_12_66.bin" -glabel ASSET_12_67 +glabel ASSET_SPRITES_67 .incbin "./build/us_1.0/sprites/unknown_12_67.bin" -glabel ASSET_12_68 +glabel ASSET_SPRITES_68 .incbin "./build/us_1.0/sprites/unknown_12_68.bin" -glabel ASSET_12_69 +glabel ASSET_SPRITES_69 .incbin "./build/us_1.0/sprites/unknown_12_69.bin" -glabel ASSET_12_70 +glabel ASSET_SPRITES_70 .incbin "./build/us_1.0/sprites/unknown_12_70.bin" -glabel ASSET_12_71 +glabel ASSET_SPRITES_71 .incbin "./build/us_1.0/sprites/unknown_12_71.bin" -glabel ASSET_12_72 +glabel ASSET_SPRITES_72 .incbin "./build/us_1.0/sprites/unknown_12_72.bin" -glabel ASSET_12_73 +glabel ASSET_SPRITES_73 .incbin "./build/us_1.0/sprites/unknown_12_73.bin" -glabel ASSET_12_74 +glabel ASSET_SPRITES_74 .incbin "./build/us_1.0/sprites/unknown_12_74.bin" -glabel ASSET_12_75 +glabel ASSET_SPRITES_75 .incbin "./build/us_1.0/sprites/unknown_12_75.bin" -glabel ASSET_12_76 +glabel ASSET_SPRITES_76 .incbin "./build/us_1.0/sprites/unknown_12_76.bin" -glabel ASSET_12_77 +glabel ASSET_SPRITES_77 .incbin "./build/us_1.0/sprites/unknown_12_77.bin" -glabel ASSET_12_78 +glabel ASSET_SPRITES_78 .incbin "./build/us_1.0/sprites/unknown_12_78.bin" -glabel ASSET_12_79 +glabel ASSET_SPRITES_79 .incbin "./build/us_1.0/sprites/unknown_12_79.bin" -glabel ASSET_12_80 +glabel ASSET_SPRITES_80 .incbin "./build/us_1.0/sprites/unknown_12_80.bin" -glabel ASSET_12_81 +glabel ASSET_SPRITES_81 .incbin "./build/us_1.0/sprites/unknown_12_81.bin" -glabel ASSET_12_82 +glabel ASSET_SPRITES_82 .incbin "./build/us_1.0/sprites/unknown_12_82.bin" -glabel ASSET_12_83 +glabel ASSET_SPRITES_83 .incbin "./build/us_1.0/sprites/unknown_12_83.bin" -glabel ASSET_12_84 +glabel ASSET_SPRITES_84 .incbin "./build/us_1.0/sprites/unknown_12_84.bin" -glabel ASSET_12_85 +glabel ASSET_SPRITES_85 .incbin "./build/us_1.0/sprites/unknown_12_85.bin" -glabel ASSET_12_86 +glabel ASSET_SPRITES_86 .incbin "./build/us_1.0/sprites/unknown_12_86.bin" -glabel ASSET_12_87 +glabel ASSET_SPRITES_87 .incbin "./build/us_1.0/sprites/unknown_12_87.bin" -glabel ASSET_12_88 +glabel ASSET_SPRITES_88 .incbin "./build/us_1.0/sprites/unknown_12_88.bin" -glabel ASSET_12_89 +glabel ASSET_SPRITES_89 .incbin "./build/us_1.0/sprites/unknown_12_89.bin" -glabel ASSET_12_90 +glabel ASSET_SPRITES_90 .incbin "./build/us_1.0/sprites/unknown_12_90.bin" -glabel ASSET_12_91 +glabel ASSET_SPRITES_91 .incbin "./build/us_1.0/sprites/unknown_12_91.bin" -glabel ASSET_12_92 +glabel ASSET_SPRITES_92 .incbin "./build/us_1.0/sprites/unknown_12_92.bin" -glabel ASSET_12_93 +glabel ASSET_SPRITES_93 .incbin "./build/us_1.0/sprites/unknown_12_93.bin" -glabel ASSET_12_94 +glabel ASSET_SPRITES_94 .incbin "./build/us_1.0/sprites/unknown_12_94.bin" -glabel ASSET_12_95 +glabel ASSET_SPRITES_95 .incbin "./build/us_1.0/sprites/unknown_12_95.bin" -glabel ASSET_12_96 +glabel ASSET_SPRITES_96 .incbin "./build/us_1.0/sprites/unknown_12_96.bin" -glabel ASSET_12_97 +glabel ASSET_SPRITES_97 .incbin "./build/us_1.0/sprites/unknown_12_97.bin" -glabel ASSET_12_98 +glabel ASSET_SPRITES_98 .incbin "./build/us_1.0/sprites/unknown_12_98.bin" -glabel ASSET_12_99 +glabel ASSET_SPRITES_99 .incbin "./build/us_1.0/sprites/unknown_12_99.bin" -glabel ASSET_12_100 +glabel ASSET_SPRITES_100 .incbin "./build/us_1.0/sprites/unknown_12_100.bin" -glabel ASSET_12_101 +glabel ASSET_SPRITES_101 .incbin "./build/us_1.0/sprites/unknown_12_101.bin" -glabel ASSET_12_102 +glabel ASSET_SPRITES_102 .incbin "./build/us_1.0/sprites/unknown_12_102.bin" -glabel ASSET_12_103 +glabel ASSET_SPRITES_103 .incbin "./build/us_1.0/sprites/unknown_12_103.bin" -glabel ASSET_12_104 +glabel ASSET_SPRITES_104 .incbin "./build/us_1.0/sprites/unknown_12_104.bin" -glabel ASSET_12_105 +glabel ASSET_SPRITES_105 .incbin "./build/us_1.0/sprites/unknown_12_105.bin" -glabel ASSET_12_106 +glabel ASSET_SPRITES_106 .incbin "./build/us_1.0/sprites/unknown_12_106.bin" -glabel ASSET_12_107 +glabel ASSET_SPRITES_107 .incbin "./build/us_1.0/sprites/unknown_12_107.bin" -glabel ASSET_12_108 +glabel ASSET_SPRITES_108 .incbin "./build/us_1.0/sprites/unknown_12_108.bin" -glabel ASSET_12_109 +glabel ASSET_SPRITES_109 .incbin "./build/us_1.0/sprites/unknown_12_109.bin" -glabel ASSET_12_110 +glabel ASSET_SPRITES_110 .incbin "./build/us_1.0/sprites/unknown_12_110.bin" -glabel ASSET_12_111 +glabel ASSET_SPRITES_111 .incbin "./build/us_1.0/sprites/unknown_12_111.bin" -glabel ASSET_12_112 +glabel ASSET_SPRITES_112 .incbin "./build/us_1.0/sprites/unknown_12_112.bin" -glabel ASSET_12_113 +glabel ASSET_SPRITES_113 .incbin "./build/us_1.0/sprites/unknown_12_113.bin" -glabel ASSET_12_114 +glabel ASSET_SPRITES_114 .incbin "./build/us_1.0/sprites/unknown_12_114.bin" -glabel ASSET_12_115 +glabel ASSET_SPRITES_115 .incbin "./build/us_1.0/sprites/unknown_12_115.bin" -glabel ASSET_12_116 +glabel ASSET_SPRITES_116 .incbin "./build/us_1.0/sprites/unknown_12_116.bin" -glabel ASSET_12_117 +glabel ASSET_SPRITES_117 .incbin "./build/us_1.0/sprites/unknown_12_117.bin" -glabel ASSET_12_118 +glabel ASSET_SPRITES_118 .incbin "./build/us_1.0/sprites/unknown_12_118.bin" -glabel ASSET_12_119 +glabel ASSET_SPRITES_119 .incbin "./build/us_1.0/sprites/unknown_12_119.bin" -glabel ASSET_12_120 +glabel ASSET_SPRITES_120 .incbin "./build/us_1.0/sprites/unknown_12_120.bin" -glabel ASSET_12_121 +glabel ASSET_SPRITES_121 .incbin "./build/us_1.0/sprites/unknown_12_121.bin" -glabel ASSET_12_122 +glabel ASSET_SPRITES_122 .incbin "./build/us_1.0/sprites/unknown_12_122.bin" -glabel ASSET_12_123 +glabel ASSET_SPRITES_123 .incbin "./build/us_1.0/sprites/unknown_12_123.bin" -glabel ASSET_12_124 +glabel ASSET_SPRITES_124 .incbin "./build/us_1.0/sprites/unknown_12_124.bin" -glabel ASSET_12_125 +glabel ASSET_SPRITES_125 .incbin "./build/us_1.0/sprites/unknown_12_125.bin" -glabel ASSET_12_126 +glabel ASSET_SPRITES_126 .incbin "./build/us_1.0/sprites/unknown_12_126.bin" -glabel ASSET_12_127 +glabel ASSET_SPRITES_127 .incbin "./build/us_1.0/sprites/unknown_12_127.bin" -glabel ASSET_12_128 +glabel ASSET_SPRITES_128 .incbin "./build/us_1.0/sprites/unknown_12_128.bin" -glabel ASSET_12_129 +glabel ASSET_SPRITES_129 .incbin "./build/us_1.0/sprites/unknown_12_129.bin" -glabel ASSET_12_130 +glabel ASSET_SPRITES_130 .incbin "./build/us_1.0/sprites/unknown_12_130.bin" -glabel ASSET_12_131 +glabel ASSET_SPRITES_131 .incbin "./build/us_1.0/sprites/unknown_12_131.bin" -glabel ASSET_12_132 +glabel ASSET_SPRITES_132 .incbin "./build/us_1.0/sprites/unknown_12_132.bin" -glabel ASSET_12_133 +glabel ASSET_SPRITES_133 .incbin "./build/us_1.0/sprites/unknown_12_133.bin" -glabel ASSET_12_134 +glabel ASSET_SPRITES_134 .incbin "./build/us_1.0/sprites/unknown_12_134.bin" -glabel ASSET_12_135 +glabel ASSET_SPRITES_135 .incbin "./build/us_1.0/sprites/unknown_12_135.bin" -glabel ASSET_12_136 +glabel ASSET_SPRITES_136 .incbin "./build/us_1.0/sprites/unknown_12_136.bin" -glabel ASSET_12_137 +glabel ASSET_SPRITES_137 .incbin "./build/us_1.0/sprites/unknown_12_137.bin" -glabel ASSET_12_138 +glabel ASSET_SPRITES_138 .incbin "./build/us_1.0/sprites/unknown_12_138.bin" -glabel ASSET_12_139 +glabel ASSET_SPRITES_139 .incbin "./build/us_1.0/sprites/unknown_12_139.bin" -glabel ASSET_12_140 +glabel ASSET_SPRITES_140 .incbin "./build/us_1.0/sprites/unknown_12_140.bin" -glabel ASSET_12_141 +glabel ASSET_SPRITES_141 .incbin "./build/us_1.0/sprites/unknown_12_141.bin" -glabel ASSET_12_142 +glabel ASSET_SPRITES_142 .incbin "./build/us_1.0/sprites/unknown_12_142.bin" -glabel ASSET_12_143 +glabel ASSET_SPRITES_143 .incbin "./build/us_1.0/sprites/unknown_12_143.bin" -glabel ASSET_12_144 +glabel ASSET_SPRITES_144 .incbin "./build/us_1.0/sprites/unknown_12_144.bin" -glabel ASSET_12_145 +glabel ASSET_SPRITES_145 .incbin "./build/us_1.0/sprites/unknown_12_145.bin" -glabel ASSET_12_146 +glabel ASSET_SPRITES_146 .incbin "./build/us_1.0/sprites/unknown_12_146.bin" -glabel ASSET_12_147 +glabel ASSET_SPRITES_147 .incbin "./build/us_1.0/sprites/unknown_12_147.bin" -glabel ASSET_12_148 +glabel ASSET_SPRITES_148 .incbin "./build/us_1.0/sprites/unknown_12_148.bin" -glabel ASSET_12_149 +glabel ASSET_SPRITES_149 .incbin "./build/us_1.0/sprites/unknown_12_149.bin" -glabel ASSET_12_150 +glabel ASSET_SPRITES_150 .incbin "./build/us_1.0/sprites/unknown_12_150.bin" -glabel ASSET_12_151 +glabel ASSET_SPRITES_151 .incbin "./build/us_1.0/sprites/unknown_12_151.bin" -glabel ASSET_12_152 +glabel ASSET_SPRITES_152 .incbin "./build/us_1.0/sprites/unknown_12_152.bin" -glabel ASSET_12_153 +glabel ASSET_SPRITES_153 .incbin "./build/us_1.0/sprites/unknown_12_153.bin" -glabel ASSET_12_154 +glabel ASSET_SPRITES_154 .incbin "./build/us_1.0/sprites/unknown_12_154.bin" -glabel ASSET_12_155 +glabel ASSET_SPRITES_155 .incbin "./build/us_1.0/sprites/unknown_12_155.bin" -glabel ASSET_12_156 +glabel ASSET_SPRITES_156 .incbin "./build/us_1.0/sprites/unknown_12_156.bin" -glabel ASSET_12_157 +glabel ASSET_SPRITES_157 .incbin "./build/us_1.0/sprites/unknown_12_157.bin" -glabel ASSET_12_158 +glabel ASSET_SPRITES_158 .incbin "./build/us_1.0/sprites/unknown_12_158.bin" -glabel ASSET_12_159 +glabel ASSET_SPRITES_159 .incbin "./build/us_1.0/sprites/unknown_12_159.bin" -glabel ASSET_12_160 +glabel ASSET_SPRITES_160 .incbin "./build/us_1.0/sprites/unknown_12_160.bin" -glabel ASSET_12_161 +glabel ASSET_SPRITES_161 .incbin "./build/us_1.0/sprites/unknown_12_161.bin" -glabel ASSET_12_162 +glabel ASSET_SPRITES_162 .incbin "./build/us_1.0/sprites/unknown_12_162.bin" -glabel ASSET_12_163 +glabel ASSET_SPRITES_163 .incbin "./build/us_1.0/sprites/unknown_12_163.bin" -glabel ASSET_12_164 +glabel ASSET_SPRITES_164 .incbin "./build/us_1.0/sprites/unknown_12_164.bin" -glabel ASSET_12_165 +glabel ASSET_SPRITES_165 .incbin "./build/us_1.0/sprites/unknown_12_165.bin" -glabel ASSET_12_166 +glabel ASSET_SPRITES_166 .incbin "./build/us_1.0/sprites/unknown_12_166.bin" -glabel ASSET_12_167 +glabel ASSET_SPRITES_167 .incbin "./build/us_1.0/sprites/unknown_12_167.bin" -glabel ASSET_12_168 +glabel ASSET_SPRITES_168 .incbin "./build/us_1.0/sprites/unknown_12_168.bin" -glabel ASSET_12_169 +glabel ASSET_SPRITES_169 .incbin "./build/us_1.0/sprites/unknown_12_169.bin" -glabel ASSET_12_170 +glabel ASSET_SPRITES_170 .incbin "./build/us_1.0/sprites/unknown_12_170.bin" -glabel ASSET_12_171 +glabel ASSET_SPRITES_171 .incbin "./build/us_1.0/sprites/unknown_12_171.bin" -glabel ASSET_12_172 +glabel ASSET_SPRITES_172 .incbin "./build/us_1.0/sprites/unknown_12_172.bin" -glabel ASSET_12_173 +glabel ASSET_SPRITES_173 .incbin "./build/us_1.0/sprites/unknown_12_173.bin" -glabel ASSET_12_174 +glabel ASSET_SPRITES_174 .incbin "./build/us_1.0/sprites/unknown_12_174.bin" -glabel ASSET_12_175 +glabel ASSET_SPRITES_175 .incbin "./build/us_1.0/sprites/unknown_12_175.bin" -glabel ASSET_12_176 +glabel ASSET_SPRITES_176 .incbin "./build/us_1.0/sprites/unknown_12_176.bin" -glabel ASSET_12_177 +glabel ASSET_SPRITES_177 .incbin "./build/us_1.0/sprites/unknown_12_177.bin" -glabel ASSET_12_178 +glabel ASSET_SPRITES_178 .incbin "./build/us_1.0/sprites/unknown_12_178.bin" -glabel ASSET_12_179 +glabel ASSET_SPRITES_179 .incbin "./build/us_1.0/sprites/unknown_12_179.bin" -glabel ASSET_12_180 +glabel ASSET_SPRITES_180 .incbin "./build/us_1.0/sprites/unknown_12_180.bin" -glabel ASSET_12_181 +glabel ASSET_SPRITES_181 .incbin "./build/us_1.0/sprites/unknown_12_181.bin" -glabel ASSET_12_182 +glabel ASSET_SPRITES_182 .incbin "./build/us_1.0/sprites/unknown_12_182.bin" -glabel ASSET_12_183 +glabel ASSET_SPRITES_183 .incbin "./build/us_1.0/sprites/unknown_12_183.bin" -glabel ASSET_12_184 +glabel ASSET_SPRITES_184 .incbin "./build/us_1.0/sprites/unknown_12_184.bin" -glabel ASSET_12_185 +glabel ASSET_SPRITES_185 .incbin "./build/us_1.0/sprites/unknown_12_185.bin" -glabel ASSET_12_186 +glabel ASSET_SPRITES_186 .incbin "./build/us_1.0/sprites/unknown_12_186.bin" -glabel ASSET_12_187 +glabel ASSET_SPRITES_187 .incbin "./build/us_1.0/sprites/unknown_12_187.bin" -glabel ASSET_12_188 +glabel ASSET_SPRITES_188 .incbin "./build/us_1.0/sprites/unknown_12_188.bin" -glabel ASSET_12_189 +glabel ASSET_SPRITES_189 .incbin "./build/us_1.0/sprites/unknown_12_189.bin" -glabel ASSET_12_190 +glabel ASSET_SPRITES_190 .incbin "./build/us_1.0/sprites/unknown_12_190.bin" -glabel ASSET_12_191 +glabel ASSET_SPRITES_191 .incbin "./build/us_1.0/sprites/unknown_12_191.bin" -glabel ASSET_12_192 +glabel ASSET_SPRITES_192 .incbin "./build/us_1.0/sprites/unknown_12_192.bin" -glabel ASSET_SECTION_12_END +glabel ASSET_SPRITES_END + +/********** ASSET_SPRITES_TABLE **********/ .balign 16 -glabel ASSET_SECTION_13 -.word ASSET_12_0 - ASSET_SECTION_12 -.word ASSET_12_1 - ASSET_SECTION_12 -.word ASSET_12_2 - ASSET_SECTION_12 -.word ASSET_12_3 - ASSET_SECTION_12 -.word ASSET_12_4 - ASSET_SECTION_12 -.word ASSET_12_5 - ASSET_SECTION_12 -.word ASSET_12_6 - ASSET_SECTION_12 -.word ASSET_12_7 - ASSET_SECTION_12 -.word ASSET_12_8 - ASSET_SECTION_12 -.word ASSET_12_9 - ASSET_SECTION_12 -.word ASSET_12_10 - ASSET_SECTION_12 -.word ASSET_12_11 - ASSET_SECTION_12 -.word ASSET_12_12 - ASSET_SECTION_12 -.word ASSET_12_13 - ASSET_SECTION_12 -.word ASSET_12_14 - ASSET_SECTION_12 -.word ASSET_12_15 - ASSET_SECTION_12 -.word ASSET_12_16 - ASSET_SECTION_12 -.word ASSET_12_17 - ASSET_SECTION_12 -.word ASSET_12_18 - ASSET_SECTION_12 -.word ASSET_12_19 - ASSET_SECTION_12 -.word ASSET_12_20 - ASSET_SECTION_12 -.word ASSET_12_21 - ASSET_SECTION_12 -.word ASSET_12_22 - ASSET_SECTION_12 -.word ASSET_12_23 - ASSET_SECTION_12 -.word ASSET_12_24 - ASSET_SECTION_12 -.word ASSET_12_25 - ASSET_SECTION_12 -.word ASSET_12_26 - ASSET_SECTION_12 -.word ASSET_12_27 - ASSET_SECTION_12 -.word ASSET_12_28 - ASSET_SECTION_12 -.word ASSET_12_29 - ASSET_SECTION_12 -.word ASSET_12_30 - ASSET_SECTION_12 -.word ASSET_12_31 - ASSET_SECTION_12 -.word ASSET_12_32 - ASSET_SECTION_12 -.word ASSET_12_33 - ASSET_SECTION_12 -.word ASSET_12_34 - ASSET_SECTION_12 -.word ASSET_12_35 - ASSET_SECTION_12 -.word ASSET_12_36 - ASSET_SECTION_12 -.word ASSET_12_37 - ASSET_SECTION_12 -.word ASSET_12_38 - ASSET_SECTION_12 -.word ASSET_12_39 - ASSET_SECTION_12 -.word ASSET_12_40 - ASSET_SECTION_12 -.word ASSET_12_41 - ASSET_SECTION_12 -.word ASSET_12_42 - ASSET_SECTION_12 -.word ASSET_12_43 - ASSET_SECTION_12 -.word ASSET_12_44 - ASSET_SECTION_12 -.word ASSET_12_45 - ASSET_SECTION_12 -.word ASSET_12_46 - ASSET_SECTION_12 -.word ASSET_12_47 - ASSET_SECTION_12 -.word ASSET_12_48 - ASSET_SECTION_12 -.word ASSET_12_49 - ASSET_SECTION_12 -.word ASSET_12_50 - ASSET_SECTION_12 -.word ASSET_12_51 - ASSET_SECTION_12 -.word ASSET_12_52 - ASSET_SECTION_12 -.word ASSET_12_53 - ASSET_SECTION_12 -.word ASSET_12_54 - ASSET_SECTION_12 -.word ASSET_12_55 - ASSET_SECTION_12 -.word ASSET_12_56 - ASSET_SECTION_12 -.word ASSET_12_57 - ASSET_SECTION_12 -.word ASSET_12_58 - ASSET_SECTION_12 -.word ASSET_12_59 - ASSET_SECTION_12 -.word ASSET_12_60 - ASSET_SECTION_12 -.word ASSET_12_61 - ASSET_SECTION_12 -.word ASSET_12_62 - ASSET_SECTION_12 -.word ASSET_12_63 - ASSET_SECTION_12 -.word ASSET_12_64 - ASSET_SECTION_12 -.word ASSET_12_65 - ASSET_SECTION_12 -.word ASSET_12_66 - ASSET_SECTION_12 -.word ASSET_12_67 - ASSET_SECTION_12 -.word ASSET_12_68 - ASSET_SECTION_12 -.word ASSET_12_69 - ASSET_SECTION_12 -.word ASSET_12_70 - ASSET_SECTION_12 -.word ASSET_12_71 - ASSET_SECTION_12 -.word ASSET_12_72 - ASSET_SECTION_12 -.word ASSET_12_73 - ASSET_SECTION_12 -.word ASSET_12_74 - ASSET_SECTION_12 -.word ASSET_12_75 - ASSET_SECTION_12 -.word ASSET_12_76 - ASSET_SECTION_12 -.word ASSET_12_77 - ASSET_SECTION_12 -.word ASSET_12_78 - ASSET_SECTION_12 -.word ASSET_12_79 - ASSET_SECTION_12 -.word ASSET_12_80 - ASSET_SECTION_12 -.word ASSET_12_81 - ASSET_SECTION_12 -.word ASSET_12_82 - ASSET_SECTION_12 -.word ASSET_12_83 - ASSET_SECTION_12 -.word ASSET_12_84 - ASSET_SECTION_12 -.word ASSET_12_85 - ASSET_SECTION_12 -.word ASSET_12_86 - ASSET_SECTION_12 -.word ASSET_12_87 - ASSET_SECTION_12 -.word ASSET_12_88 - ASSET_SECTION_12 -.word ASSET_12_89 - ASSET_SECTION_12 -.word ASSET_12_90 - ASSET_SECTION_12 -.word ASSET_12_91 - ASSET_SECTION_12 -.word ASSET_12_92 - ASSET_SECTION_12 -.word ASSET_12_93 - ASSET_SECTION_12 -.word ASSET_12_94 - ASSET_SECTION_12 -.word ASSET_12_95 - ASSET_SECTION_12 -.word ASSET_12_96 - ASSET_SECTION_12 -.word ASSET_12_97 - ASSET_SECTION_12 -.word ASSET_12_98 - ASSET_SECTION_12 -.word ASSET_12_99 - ASSET_SECTION_12 -.word ASSET_12_100 - ASSET_SECTION_12 -.word ASSET_12_101 - ASSET_SECTION_12 -.word ASSET_12_102 - ASSET_SECTION_12 -.word ASSET_12_103 - ASSET_SECTION_12 -.word ASSET_12_104 - ASSET_SECTION_12 -.word ASSET_12_105 - ASSET_SECTION_12 -.word ASSET_12_106 - ASSET_SECTION_12 -.word ASSET_12_107 - ASSET_SECTION_12 -.word ASSET_12_108 - ASSET_SECTION_12 -.word ASSET_12_109 - ASSET_SECTION_12 -.word ASSET_12_110 - ASSET_SECTION_12 -.word ASSET_12_111 - ASSET_SECTION_12 -.word ASSET_12_112 - ASSET_SECTION_12 -.word ASSET_12_113 - ASSET_SECTION_12 -.word ASSET_12_114 - ASSET_SECTION_12 -.word ASSET_12_115 - ASSET_SECTION_12 -.word ASSET_12_116 - ASSET_SECTION_12 -.word ASSET_12_117 - ASSET_SECTION_12 -.word ASSET_12_118 - ASSET_SECTION_12 -.word ASSET_12_119 - ASSET_SECTION_12 -.word ASSET_12_120 - ASSET_SECTION_12 -.word ASSET_12_121 - ASSET_SECTION_12 -.word ASSET_12_122 - ASSET_SECTION_12 -.word ASSET_12_123 - ASSET_SECTION_12 -.word ASSET_12_124 - ASSET_SECTION_12 -.word ASSET_12_125 - ASSET_SECTION_12 -.word ASSET_12_126 - ASSET_SECTION_12 -.word ASSET_12_127 - ASSET_SECTION_12 -.word ASSET_12_128 - ASSET_SECTION_12 -.word ASSET_12_129 - ASSET_SECTION_12 -.word ASSET_12_130 - ASSET_SECTION_12 -.word ASSET_12_131 - ASSET_SECTION_12 -.word ASSET_12_132 - ASSET_SECTION_12 -.word ASSET_12_133 - ASSET_SECTION_12 -.word ASSET_12_134 - ASSET_SECTION_12 -.word ASSET_12_135 - ASSET_SECTION_12 -.word ASSET_12_136 - ASSET_SECTION_12 -.word ASSET_12_137 - ASSET_SECTION_12 -.word ASSET_12_138 - ASSET_SECTION_12 -.word ASSET_12_139 - ASSET_SECTION_12 -.word ASSET_12_140 - ASSET_SECTION_12 -.word ASSET_12_141 - ASSET_SECTION_12 -.word ASSET_12_142 - ASSET_SECTION_12 -.word ASSET_12_143 - ASSET_SECTION_12 -.word ASSET_12_144 - ASSET_SECTION_12 -.word ASSET_12_145 - ASSET_SECTION_12 -.word ASSET_12_146 - ASSET_SECTION_12 -.word ASSET_12_147 - ASSET_SECTION_12 -.word ASSET_12_148 - ASSET_SECTION_12 -.word ASSET_12_149 - ASSET_SECTION_12 -.word ASSET_12_150 - ASSET_SECTION_12 -.word ASSET_12_151 - ASSET_SECTION_12 -.word ASSET_12_152 - ASSET_SECTION_12 -.word ASSET_12_153 - ASSET_SECTION_12 -.word ASSET_12_154 - ASSET_SECTION_12 -.word ASSET_12_155 - ASSET_SECTION_12 -.word ASSET_12_156 - ASSET_SECTION_12 -.word ASSET_12_157 - ASSET_SECTION_12 -.word ASSET_12_158 - ASSET_SECTION_12 -.word ASSET_12_159 - ASSET_SECTION_12 -.word ASSET_12_160 - ASSET_SECTION_12 -.word ASSET_12_161 - ASSET_SECTION_12 -.word ASSET_12_162 - ASSET_SECTION_12 -.word ASSET_12_163 - ASSET_SECTION_12 -.word ASSET_12_164 - ASSET_SECTION_12 -.word ASSET_12_165 - ASSET_SECTION_12 -.word ASSET_12_166 - ASSET_SECTION_12 -.word ASSET_12_167 - ASSET_SECTION_12 -.word ASSET_12_168 - ASSET_SECTION_12 -.word ASSET_12_169 - ASSET_SECTION_12 -.word ASSET_12_170 - ASSET_SECTION_12 -.word ASSET_12_171 - ASSET_SECTION_12 -.word ASSET_12_172 - ASSET_SECTION_12 -.word ASSET_12_173 - ASSET_SECTION_12 -.word ASSET_12_174 - ASSET_SECTION_12 -.word ASSET_12_175 - ASSET_SECTION_12 -.word ASSET_12_176 - ASSET_SECTION_12 -.word ASSET_12_177 - ASSET_SECTION_12 -.word ASSET_12_178 - ASSET_SECTION_12 -.word ASSET_12_179 - ASSET_SECTION_12 -.word ASSET_12_180 - ASSET_SECTION_12 -.word ASSET_12_181 - ASSET_SECTION_12 -.word ASSET_12_182 - ASSET_SECTION_12 -.word ASSET_12_183 - ASSET_SECTION_12 -.word ASSET_12_184 - ASSET_SECTION_12 -.word ASSET_12_185 - ASSET_SECTION_12 -.word ASSET_12_186 - ASSET_SECTION_12 -.word ASSET_12_187 - ASSET_SECTION_12 -.word ASSET_12_188 - ASSET_SECTION_12 -.word ASSET_12_189 - ASSET_SECTION_12 -.word ASSET_12_190 - ASSET_SECTION_12 -.word ASSET_12_191 - ASSET_SECTION_12 -.word ASSET_12_192 - ASSET_SECTION_12 -.word ASSET_SECTION_12_END - ASSET_SECTION_12 +glabel ASSET_SPRITES_TABLE +.word ASSET_SPRITES_0 - ASSET_SPRITES +.word ASSET_SPRITES_1 - ASSET_SPRITES +.word ASSET_SPRITES_2 - ASSET_SPRITES +.word ASSET_SPRITES_3 - ASSET_SPRITES +.word ASSET_SPRITES_4 - ASSET_SPRITES +.word ASSET_SPRITES_5 - ASSET_SPRITES +.word ASSET_SPRITES_6 - ASSET_SPRITES +.word ASSET_SPRITES_7 - ASSET_SPRITES +.word ASSET_SPRITES_8 - ASSET_SPRITES +.word ASSET_SPRITES_9 - ASSET_SPRITES +.word ASSET_SPRITES_10 - ASSET_SPRITES +.word ASSET_SPRITES_11 - ASSET_SPRITES +.word ASSET_SPRITES_12 - ASSET_SPRITES +.word ASSET_SPRITES_13 - ASSET_SPRITES +.word ASSET_SPRITES_14 - ASSET_SPRITES +.word ASSET_SPRITES_15 - ASSET_SPRITES +.word ASSET_SPRITES_16 - ASSET_SPRITES +.word ASSET_SPRITES_17 - ASSET_SPRITES +.word ASSET_SPRITES_18 - ASSET_SPRITES +.word ASSET_SPRITES_19 - ASSET_SPRITES +.word ASSET_SPRITES_20 - ASSET_SPRITES +.word ASSET_SPRITES_21 - ASSET_SPRITES +.word ASSET_SPRITES_22 - ASSET_SPRITES +.word ASSET_SPRITES_23 - ASSET_SPRITES +.word ASSET_SPRITES_24 - ASSET_SPRITES +.word ASSET_SPRITES_25 - ASSET_SPRITES +.word ASSET_SPRITES_26 - ASSET_SPRITES +.word ASSET_SPRITES_27 - ASSET_SPRITES +.word ASSET_SPRITES_28 - ASSET_SPRITES +.word ASSET_SPRITES_29 - ASSET_SPRITES +.word ASSET_SPRITES_30 - ASSET_SPRITES +.word ASSET_SPRITES_31 - ASSET_SPRITES +.word ASSET_SPRITES_32 - ASSET_SPRITES +.word ASSET_SPRITES_33 - ASSET_SPRITES +.word ASSET_SPRITES_34 - ASSET_SPRITES +.word ASSET_SPRITES_35 - ASSET_SPRITES +.word ASSET_SPRITES_36 - ASSET_SPRITES +.word ASSET_SPRITES_37 - ASSET_SPRITES +.word ASSET_SPRITES_38 - ASSET_SPRITES +.word ASSET_SPRITES_39 - ASSET_SPRITES +.word ASSET_SPRITES_40 - ASSET_SPRITES +.word ASSET_SPRITES_41 - ASSET_SPRITES +.word ASSET_SPRITES_42 - ASSET_SPRITES +.word ASSET_SPRITES_43 - ASSET_SPRITES +.word ASSET_SPRITES_44 - ASSET_SPRITES +.word ASSET_SPRITES_45 - ASSET_SPRITES +.word ASSET_SPRITES_46 - ASSET_SPRITES +.word ASSET_SPRITES_47 - ASSET_SPRITES +.word ASSET_SPRITES_48 - ASSET_SPRITES +.word ASSET_SPRITES_49 - ASSET_SPRITES +.word ASSET_SPRITES_50 - ASSET_SPRITES +.word ASSET_SPRITES_51 - ASSET_SPRITES +.word ASSET_SPRITES_52 - ASSET_SPRITES +.word ASSET_SPRITES_53 - ASSET_SPRITES +.word ASSET_SPRITES_54 - ASSET_SPRITES +.word ASSET_SPRITES_55 - ASSET_SPRITES +.word ASSET_SPRITES_56 - ASSET_SPRITES +.word ASSET_SPRITES_57 - ASSET_SPRITES +.word ASSET_SPRITES_58 - ASSET_SPRITES +.word ASSET_SPRITES_59 - ASSET_SPRITES +.word ASSET_SPRITES_60 - ASSET_SPRITES +.word ASSET_SPRITES_61 - ASSET_SPRITES +.word ASSET_SPRITES_62 - ASSET_SPRITES +.word ASSET_SPRITES_63 - ASSET_SPRITES +.word ASSET_SPRITES_64 - ASSET_SPRITES +.word ASSET_SPRITES_65 - ASSET_SPRITES +.word ASSET_SPRITES_66 - ASSET_SPRITES +.word ASSET_SPRITES_67 - ASSET_SPRITES +.word ASSET_SPRITES_68 - ASSET_SPRITES +.word ASSET_SPRITES_69 - ASSET_SPRITES +.word ASSET_SPRITES_70 - ASSET_SPRITES +.word ASSET_SPRITES_71 - ASSET_SPRITES +.word ASSET_SPRITES_72 - ASSET_SPRITES +.word ASSET_SPRITES_73 - ASSET_SPRITES +.word ASSET_SPRITES_74 - ASSET_SPRITES +.word ASSET_SPRITES_75 - ASSET_SPRITES +.word ASSET_SPRITES_76 - ASSET_SPRITES +.word ASSET_SPRITES_77 - ASSET_SPRITES +.word ASSET_SPRITES_78 - ASSET_SPRITES +.word ASSET_SPRITES_79 - ASSET_SPRITES +.word ASSET_SPRITES_80 - ASSET_SPRITES +.word ASSET_SPRITES_81 - ASSET_SPRITES +.word ASSET_SPRITES_82 - ASSET_SPRITES +.word ASSET_SPRITES_83 - ASSET_SPRITES +.word ASSET_SPRITES_84 - ASSET_SPRITES +.word ASSET_SPRITES_85 - ASSET_SPRITES +.word ASSET_SPRITES_86 - ASSET_SPRITES +.word ASSET_SPRITES_87 - ASSET_SPRITES +.word ASSET_SPRITES_88 - ASSET_SPRITES +.word ASSET_SPRITES_89 - ASSET_SPRITES +.word ASSET_SPRITES_90 - ASSET_SPRITES +.word ASSET_SPRITES_91 - ASSET_SPRITES +.word ASSET_SPRITES_92 - ASSET_SPRITES +.word ASSET_SPRITES_93 - ASSET_SPRITES +.word ASSET_SPRITES_94 - ASSET_SPRITES +.word ASSET_SPRITES_95 - ASSET_SPRITES +.word ASSET_SPRITES_96 - ASSET_SPRITES +.word ASSET_SPRITES_97 - ASSET_SPRITES +.word ASSET_SPRITES_98 - ASSET_SPRITES +.word ASSET_SPRITES_99 - ASSET_SPRITES +.word ASSET_SPRITES_100 - ASSET_SPRITES +.word ASSET_SPRITES_101 - ASSET_SPRITES +.word ASSET_SPRITES_102 - ASSET_SPRITES +.word ASSET_SPRITES_103 - ASSET_SPRITES +.word ASSET_SPRITES_104 - ASSET_SPRITES +.word ASSET_SPRITES_105 - ASSET_SPRITES +.word ASSET_SPRITES_106 - ASSET_SPRITES +.word ASSET_SPRITES_107 - ASSET_SPRITES +.word ASSET_SPRITES_108 - ASSET_SPRITES +.word ASSET_SPRITES_109 - ASSET_SPRITES +.word ASSET_SPRITES_110 - ASSET_SPRITES +.word ASSET_SPRITES_111 - ASSET_SPRITES +.word ASSET_SPRITES_112 - ASSET_SPRITES +.word ASSET_SPRITES_113 - ASSET_SPRITES +.word ASSET_SPRITES_114 - ASSET_SPRITES +.word ASSET_SPRITES_115 - ASSET_SPRITES +.word ASSET_SPRITES_116 - ASSET_SPRITES +.word ASSET_SPRITES_117 - ASSET_SPRITES +.word ASSET_SPRITES_118 - ASSET_SPRITES +.word ASSET_SPRITES_119 - ASSET_SPRITES +.word ASSET_SPRITES_120 - ASSET_SPRITES +.word ASSET_SPRITES_121 - ASSET_SPRITES +.word ASSET_SPRITES_122 - ASSET_SPRITES +.word ASSET_SPRITES_123 - ASSET_SPRITES +.word ASSET_SPRITES_124 - ASSET_SPRITES +.word ASSET_SPRITES_125 - ASSET_SPRITES +.word ASSET_SPRITES_126 - ASSET_SPRITES +.word ASSET_SPRITES_127 - ASSET_SPRITES +.word ASSET_SPRITES_128 - ASSET_SPRITES +.word ASSET_SPRITES_129 - ASSET_SPRITES +.word ASSET_SPRITES_130 - ASSET_SPRITES +.word ASSET_SPRITES_131 - ASSET_SPRITES +.word ASSET_SPRITES_132 - ASSET_SPRITES +.word ASSET_SPRITES_133 - ASSET_SPRITES +.word ASSET_SPRITES_134 - ASSET_SPRITES +.word ASSET_SPRITES_135 - ASSET_SPRITES +.word ASSET_SPRITES_136 - ASSET_SPRITES +.word ASSET_SPRITES_137 - ASSET_SPRITES +.word ASSET_SPRITES_138 - ASSET_SPRITES +.word ASSET_SPRITES_139 - ASSET_SPRITES +.word ASSET_SPRITES_140 - ASSET_SPRITES +.word ASSET_SPRITES_141 - ASSET_SPRITES +.word ASSET_SPRITES_142 - ASSET_SPRITES +.word ASSET_SPRITES_143 - ASSET_SPRITES +.word ASSET_SPRITES_144 - ASSET_SPRITES +.word ASSET_SPRITES_145 - ASSET_SPRITES +.word ASSET_SPRITES_146 - ASSET_SPRITES +.word ASSET_SPRITES_147 - ASSET_SPRITES +.word ASSET_SPRITES_148 - ASSET_SPRITES +.word ASSET_SPRITES_149 - ASSET_SPRITES +.word ASSET_SPRITES_150 - ASSET_SPRITES +.word ASSET_SPRITES_151 - ASSET_SPRITES +.word ASSET_SPRITES_152 - ASSET_SPRITES +.word ASSET_SPRITES_153 - ASSET_SPRITES +.word ASSET_SPRITES_154 - ASSET_SPRITES +.word ASSET_SPRITES_155 - ASSET_SPRITES +.word ASSET_SPRITES_156 - ASSET_SPRITES +.word ASSET_SPRITES_157 - ASSET_SPRITES +.word ASSET_SPRITES_158 - ASSET_SPRITES +.word ASSET_SPRITES_159 - ASSET_SPRITES +.word ASSET_SPRITES_160 - ASSET_SPRITES +.word ASSET_SPRITES_161 - ASSET_SPRITES +.word ASSET_SPRITES_162 - ASSET_SPRITES +.word ASSET_SPRITES_163 - ASSET_SPRITES +.word ASSET_SPRITES_164 - ASSET_SPRITES +.word ASSET_SPRITES_165 - ASSET_SPRITES +.word ASSET_SPRITES_166 - ASSET_SPRITES +.word ASSET_SPRITES_167 - ASSET_SPRITES +.word ASSET_SPRITES_168 - ASSET_SPRITES +.word ASSET_SPRITES_169 - ASSET_SPRITES +.word ASSET_SPRITES_170 - ASSET_SPRITES +.word ASSET_SPRITES_171 - ASSET_SPRITES +.word ASSET_SPRITES_172 - ASSET_SPRITES +.word ASSET_SPRITES_173 - ASSET_SPRITES +.word ASSET_SPRITES_174 - ASSET_SPRITES +.word ASSET_SPRITES_175 - ASSET_SPRITES +.word ASSET_SPRITES_176 - ASSET_SPRITES +.word ASSET_SPRITES_177 - ASSET_SPRITES +.word ASSET_SPRITES_178 - ASSET_SPRITES +.word ASSET_SPRITES_179 - ASSET_SPRITES +.word ASSET_SPRITES_180 - ASSET_SPRITES +.word ASSET_SPRITES_181 - ASSET_SPRITES +.word ASSET_SPRITES_182 - ASSET_SPRITES +.word ASSET_SPRITES_183 - ASSET_SPRITES +.word ASSET_SPRITES_184 - ASSET_SPRITES +.word ASSET_SPRITES_185 - ASSET_SPRITES +.word ASSET_SPRITES_186 - ASSET_SPRITES +.word ASSET_SPRITES_187 - ASSET_SPRITES +.word ASSET_SPRITES_188 - ASSET_SPRITES +.word ASSET_SPRITES_189 - ASSET_SPRITES +.word ASSET_SPRITES_190 - ASSET_SPRITES +.word ASSET_SPRITES_191 - ASSET_SPRITES +.word ASSET_SPRITES_192 - ASSET_SPRITES +.word ASSET_SPRITES_END - ASSET_SPRITES .word 0xFFFFFFFF -glabel ASSET_SECTION_13_END + +/********** ASSET_EMPTY_14 **********/ .balign 16 -glabel ASSET_SECTION_14 -# Empty -glabel ASSET_SECTION_14_END +glabel ASSET_EMPTY_14 +glabel ASSET_EMPTY_14_END + +/********** ASSET_MISC **********/ .balign 16 -glabel ASSET_SECTION_15 -glabel ASSET_15_0 +glabel ASSET_MISC +glabel ASSET_MISC_0 .incbin "./build/us_1.0/misc/unknown_15_0.bin" -glabel ASSET_15_1 +glabel ASSET_MISC_1 .incbin "./build/us_1.0/misc/unknown_15_1.bin" -glabel ASSET_15_2 +glabel ASSET_MISC_2 .incbin "./build/us_1.0/misc/unknown_15_2.bin" -glabel ASSET_15_3 +glabel ASSET_MISC_3 .incbin "./build/us_1.0/misc/unknown_15_3.bin" -glabel ASSET_15_4 +glabel ASSET_MISC_4 .incbin "./build/us_1.0/misc/unknown_15_4.bin" -glabel ASSET_15_5 +glabel ASSET_MISC_5 .incbin "./build/us_1.0/misc/unknown_15_5.bin" -glabel ASSET_15_6 +glabel ASSET_MISC_6 .incbin "./build/us_1.0/misc/unknown_15_6.bin" -glabel ASSET_15_7 +glabel ASSET_MISC_7 .incbin "./build/us_1.0/misc/unknown_15_7.bin" -glabel ASSET_15_8 +glabel ASSET_MISC_8 .incbin "./build/us_1.0/misc/unknown_15_8.bin" -glabel ASSET_15_9 +glabel ASSET_MISC_9 .incbin "./build/us_1.0/misc/unknown_15_9.bin" -glabel ASSET_15_10 +glabel ASSET_MISC_10 .incbin "./build/us_1.0/misc/unknown_15_10.bin" -glabel ASSET_15_11 +glabel ASSET_MISC_11 .incbin "./build/us_1.0/misc/unknown_15_11.bin" -glabel ASSET_15_12 +glabel ASSET_MISC_12 .incbin "./build/us_1.0/misc/unknown_15_12.bin" -glabel ASSET_15_13 +glabel ASSET_MISC_13 .incbin "./build/us_1.0/misc/unknown_15_13.bin" -glabel ASSET_15_14 +glabel ASSET_MISC_14 .incbin "./build/us_1.0/misc/unknown_15_14.bin" -glabel ASSET_15_15 +glabel ASSET_MISC_15 .incbin "./build/us_1.0/misc/unknown_15_15.bin" -glabel ASSET_15_16 +glabel ASSET_MISC_16 .incbin "./build/us_1.0/misc/unknown_15_16.bin" -glabel ASSET_15_17 +glabel ASSET_MISC_17 .incbin "./build/us_1.0/misc/unknown_15_17.bin" -glabel ASSET_15_18 +glabel ASSET_MISC_18 .incbin "./build/us_1.0/misc/unknown_15_18.bin" -glabel ASSET_15_19 +glabel ASSET_MISC_19 .incbin "./build/us_1.0/misc/unknown_15_19.bin" -glabel ASSET_15_20 +glabel ASSET_MISC_20 .incbin "./build/us_1.0/misc/unknown_15_20.bin" -glabel ASSET_15_21 +glabel ASSET_MISC_21 .incbin "./build/us_1.0/misc/unknown_15_21.bin" -glabel ASSET_15_22 +glabel ASSET_MISC_22 .incbin "./build/us_1.0/misc/unknown_15_22.bin" -glabel ASSET_15_23 +glabel ASSET_MISC_23 .incbin "./build/us_1.0/misc/unknown_15_23.bin" -glabel ASSET_15_24 +glabel ASSET_MISC_24 .incbin "./build/us_1.0/misc/unknown_15_24.bin" -glabel ASSET_15_25 +glabel ASSET_MISC_25 .incbin "./build/us_1.0/misc/unknown_15_25.bin" -glabel ASSET_15_26 +glabel ASSET_MISC_TRACKS_MENU_IDS .incbin "./build/us_1.0/misc/tracks_menu_ids.bin" -glabel ASSET_15_27 +glabel ASSET_MISC_HUB_AREA_IDS .incbin "./build/us_1.0/misc/hub_area_ids.bin" -glabel ASSET_15_28 +glabel ASSET_MISC_MAIN_TRACKS_IDS .incbin "./build/us_1.0/misc/main_tracks_ids.bin" -glabel ASSET_15_29 +glabel ASSET_MISC_BATTLE_TRACKS_IDS .incbin "./build/us_1.0/misc/battle_tracks_ids.bin" -glabel ASSET_15_30 +glabel ASSET_MISC_BOSS_TRACKS_IDS .incbin "./build/us_1.0/misc/boss_tracks_ids.bin" -glabel ASSET_15_31 +glabel ASSET_MISC_31 .incbin "./build/us_1.0/misc/unknown_15_31.bin" -glabel ASSET_15_32 +glabel ASSET_MISC_32 .incbin "./build/us_1.0/misc/unknown_15_32.bin" -glabel ASSET_15_33 +glabel ASSET_MISC_RACERSTATS_UNKNOWN0 .incbin "./build/us_1.0/misc/RacerStats_Unknown0.bin" -glabel ASSET_15_34 +glabel ASSET_MISC_RACERSTATS_DIDDY .incbin "./build/us_1.0/misc/RacerStats_Diddy.bin" -glabel ASSET_15_35 +glabel ASSET_MISC_RACERSTATS_TT .incbin "./build/us_1.0/misc/RacerStats_TT.bin" -glabel ASSET_15_36 +glabel ASSET_MISC_RACERSTATS_UNKNOWN1 .incbin "./build/us_1.0/misc/RacerStats_Unknown1.bin" -glabel ASSET_15_37 +glabel ASSET_MISC_RACERSTATS_KRUNCH .incbin "./build/us_1.0/misc/RacerStats_Krunch.bin" -glabel ASSET_15_38 +glabel ASSET_MISC_RACERSTATS_BUMPER .incbin "./build/us_1.0/misc/RacerStats_Bumper.bin" -glabel ASSET_15_39 +glabel ASSET_MISC_RACERSTATS_TIPTUP .incbin "./build/us_1.0/misc/RacerStats_Tiptup.bin" -glabel ASSET_15_40 +glabel ASSET_MISC_RACERSTATS_CONKER .incbin "./build/us_1.0/misc/RacerStats_Conker.bin" -glabel ASSET_15_41 +glabel ASSET_MISC_RACERSTATS_TIMBER .incbin "./build/us_1.0/misc/RacerStats_Timber.bin" -glabel ASSET_15_42 +glabel ASSET_MISC_RACERSTATS_BANJO .incbin "./build/us_1.0/misc/RacerStats_Banjo.bin" -glabel ASSET_15_43 +glabel ASSET_MISC_RACERSTATS_DRUMSTICK .incbin "./build/us_1.0/misc/RacerStats_Drumstick.bin" -glabel ASSET_15_44 +glabel ASSET_MISC_RACERSTATS_PIPSY .incbin "./build/us_1.0/misc/RacerStats_Pipsy.bin" -glabel ASSET_15_45 +glabel ASSET_MISC_RACERSTATS_UNKNOWN2 .incbin "./build/us_1.0/misc/RacerStats_Unknown2.bin" -glabel ASSET_15_46 +glabel ASSET_MISC_46 .incbin "./build/us_1.0/misc/unknown_15_46.bin" -glabel ASSET_15_47 +glabel ASSET_MISC_47 .incbin "./build/us_1.0/misc/unknown_15_47.bin" -glabel ASSET_15_48 +glabel ASSET_MISC_48 .incbin "./build/us_1.0/misc/unknown_15_48.bin" -glabel ASSET_15_49 +glabel ASSET_MISC_49 .incbin "./build/us_1.0/misc/unknown_15_49.bin" -glabel ASSET_15_50 +glabel ASSET_MISC_50 .incbin "./build/us_1.0/misc/unknown_15_50.bin" -glabel ASSET_15_51 +glabel ASSET_MISC_51 .incbin "./build/us_1.0/misc/unknown_15_51.bin" -glabel ASSET_15_52 +glabel ASSET_MISC_52 .incbin "./build/us_1.0/misc/unknown_15_52.bin" -glabel ASSET_15_53 +glabel ASSET_MISC_53 .incbin "./build/us_1.0/misc/unknown_15_53.bin" -glabel ASSET_15_54 +glabel ASSET_MISC_54 .incbin "./build/us_1.0/misc/unknown_15_54.bin" -glabel ASSET_15_55 +glabel ASSET_MISC_55 .incbin "./build/us_1.0/misc/unknown_15_55.bin" -glabel ASSET_15_56 +glabel ASSET_MISC_56 .incbin "./build/us_1.0/misc/unknown_15_56.bin" -glabel ASSET_15_57 +glabel ASSET_MISC_57 .incbin "./build/us_1.0/misc/unknown_15_57.bin" -glabel ASSET_15_58 +glabel ASSET_MISC_58 .incbin "./build/us_1.0/misc/unknown_15_58.bin" -glabel ASSET_15_59 +glabel ASSET_MISC_59 .incbin "./build/us_1.0/misc/unknown_15_59.bin" -glabel ASSET_15_60 +glabel ASSET_MISC_60 .incbin "./build/us_1.0/misc/unknown_15_60.bin" -glabel ASSET_15_61 +glabel ASSET_MISC_61 .incbin "./build/us_1.0/misc/unknown_15_61.bin" -glabel ASSET_15_62 +glabel ASSET_MISC_62 .incbin "./build/us_1.0/misc/unknown_15_62.bin" -glabel ASSET_15_63 +glabel ASSET_MISC_63 .incbin "./build/us_1.0/misc/unknown_15_63.bin" -glabel ASSET_15_64 +glabel ASSET_MISC_64 .incbin "./build/us_1.0/misc/unknown_15_64.bin" -glabel ASSET_15_65 +glabel ASSET_MISC_MAGIC_CODES .incbin "./build/us_1.0/misc/magic_codes.bin" -glabel ASSET_15_66 +glabel ASSET_MISC_TITLE_SCREEN_DEMO_IDS .incbin "./build/us_1.0/misc/title_screen_demo_ids.bin" -glabel ASSET_15_67 +glabel ASSET_MISC_67 .incbin "./build/us_1.0/misc/unknown_15_67.bin" -glabel ASSET_15_68 +glabel ASSET_MISC_68 .incbin "./build/us_1.0/misc/unknown_15_68.bin" -glabel ASSET_15_69 +glabel ASSET_MISC_69 .incbin "./build/us_1.0/misc/unknown_15_69.bin" -glabel ASSET_SECTION_15_END +glabel ASSET_MISC_END + +/********** ASSET_MISC_TABLE **********/ .balign 16 -glabel ASSET_SECTION_16 -.word (ASSET_15_0 - ASSET_SECTION_15) / 4 -.word (ASSET_15_1 - ASSET_SECTION_15) / 4 -.word (ASSET_15_2 - ASSET_SECTION_15) / 4 -.word (ASSET_15_3 - ASSET_SECTION_15) / 4 -.word (ASSET_15_4 - ASSET_SECTION_15) / 4 -.word (ASSET_15_5 - ASSET_SECTION_15) / 4 -.word (ASSET_15_6 - ASSET_SECTION_15) / 4 -.word (ASSET_15_7 - ASSET_SECTION_15) / 4 -.word (ASSET_15_8 - ASSET_SECTION_15) / 4 -.word (ASSET_15_9 - ASSET_SECTION_15) / 4 -.word (ASSET_15_10 - ASSET_SECTION_15) / 4 -.word (ASSET_15_11 - ASSET_SECTION_15) / 4 -.word (ASSET_15_12 - ASSET_SECTION_15) / 4 -.word (ASSET_15_13 - ASSET_SECTION_15) / 4 -.word (ASSET_15_14 - ASSET_SECTION_15) / 4 -.word (ASSET_15_15 - ASSET_SECTION_15) / 4 -.word (ASSET_15_16 - ASSET_SECTION_15) / 4 -.word (ASSET_15_17 - ASSET_SECTION_15) / 4 -.word (ASSET_15_18 - ASSET_SECTION_15) / 4 -.word (ASSET_15_19 - ASSET_SECTION_15) / 4 -.word (ASSET_15_20 - ASSET_SECTION_15) / 4 -.word (ASSET_15_21 - ASSET_SECTION_15) / 4 -.word (ASSET_15_22 - ASSET_SECTION_15) / 4 -.word (ASSET_15_23 - ASSET_SECTION_15) / 4 -.word (ASSET_15_24 - ASSET_SECTION_15) / 4 -.word (ASSET_15_25 - ASSET_SECTION_15) / 4 -.word (ASSET_15_26 - ASSET_SECTION_15) / 4 -.word (ASSET_15_27 - ASSET_SECTION_15) / 4 -.word (ASSET_15_28 - ASSET_SECTION_15) / 4 -.word (ASSET_15_29 - ASSET_SECTION_15) / 4 -.word (ASSET_15_30 - ASSET_SECTION_15) / 4 -.word (ASSET_15_31 - ASSET_SECTION_15) / 4 -.word (ASSET_15_32 - ASSET_SECTION_15) / 4 -.word (ASSET_15_33 - ASSET_SECTION_15) / 4 -.word (ASSET_15_34 - ASSET_SECTION_15) / 4 -.word (ASSET_15_35 - ASSET_SECTION_15) / 4 -.word (ASSET_15_36 - ASSET_SECTION_15) / 4 -.word (ASSET_15_37 - ASSET_SECTION_15) / 4 -.word (ASSET_15_38 - ASSET_SECTION_15) / 4 -.word (ASSET_15_39 - ASSET_SECTION_15) / 4 -.word (ASSET_15_40 - ASSET_SECTION_15) / 4 -.word (ASSET_15_41 - ASSET_SECTION_15) / 4 -.word (ASSET_15_42 - ASSET_SECTION_15) / 4 -.word (ASSET_15_43 - ASSET_SECTION_15) / 4 -.word (ASSET_15_44 - ASSET_SECTION_15) / 4 -.word (ASSET_15_45 - ASSET_SECTION_15) / 4 -.word (ASSET_15_46 - ASSET_SECTION_15) / 4 -.word (ASSET_15_47 - ASSET_SECTION_15) / 4 -.word (ASSET_15_48 - ASSET_SECTION_15) / 4 -.word (ASSET_15_49 - ASSET_SECTION_15) / 4 -.word (ASSET_15_50 - ASSET_SECTION_15) / 4 -.word (ASSET_15_51 - ASSET_SECTION_15) / 4 -.word (ASSET_15_52 - ASSET_SECTION_15) / 4 -.word (ASSET_15_53 - ASSET_SECTION_15) / 4 -.word (ASSET_15_54 - ASSET_SECTION_15) / 4 -.word (ASSET_15_55 - ASSET_SECTION_15) / 4 -.word (ASSET_15_56 - ASSET_SECTION_15) / 4 -.word (ASSET_15_57 - ASSET_SECTION_15) / 4 -.word (ASSET_15_58 - ASSET_SECTION_15) / 4 -.word (ASSET_15_59 - ASSET_SECTION_15) / 4 -.word (ASSET_15_60 - ASSET_SECTION_15) / 4 -.word (ASSET_15_61 - ASSET_SECTION_15) / 4 -.word (ASSET_15_62 - ASSET_SECTION_15) / 4 -.word (ASSET_15_63 - ASSET_SECTION_15) / 4 -.word (ASSET_15_64 - ASSET_SECTION_15) / 4 -.word (ASSET_15_65 - ASSET_SECTION_15) / 4 -.word (ASSET_15_66 - ASSET_SECTION_15) / 4 -.word (ASSET_15_67 - ASSET_SECTION_15) / 4 -.word (ASSET_15_68 - ASSET_SECTION_15) / 4 -.word (ASSET_15_69 - ASSET_SECTION_15) / 4 -.word (ASSET_SECTION_15_END - ASSET_SECTION_15) / 4 +glabel ASSET_MISC_TABLE +.word (ASSET_MISC_0 - ASSET_MISC) / 4 +.word (ASSET_MISC_1 - ASSET_MISC) / 4 +.word (ASSET_MISC_2 - ASSET_MISC) / 4 +.word (ASSET_MISC_3 - ASSET_MISC) / 4 +.word (ASSET_MISC_4 - ASSET_MISC) / 4 +.word (ASSET_MISC_5 - ASSET_MISC) / 4 +.word (ASSET_MISC_6 - ASSET_MISC) / 4 +.word (ASSET_MISC_7 - ASSET_MISC) / 4 +.word (ASSET_MISC_8 - ASSET_MISC) / 4 +.word (ASSET_MISC_9 - ASSET_MISC) / 4 +.word (ASSET_MISC_10 - ASSET_MISC) / 4 +.word (ASSET_MISC_11 - ASSET_MISC) / 4 +.word (ASSET_MISC_12 - ASSET_MISC) / 4 +.word (ASSET_MISC_13 - ASSET_MISC) / 4 +.word (ASSET_MISC_14 - ASSET_MISC) / 4 +.word (ASSET_MISC_15 - ASSET_MISC) / 4 +.word (ASSET_MISC_16 - ASSET_MISC) / 4 +.word (ASSET_MISC_17 - ASSET_MISC) / 4 +.word (ASSET_MISC_18 - ASSET_MISC) / 4 +.word (ASSET_MISC_19 - ASSET_MISC) / 4 +.word (ASSET_MISC_20 - ASSET_MISC) / 4 +.word (ASSET_MISC_21 - ASSET_MISC) / 4 +.word (ASSET_MISC_22 - ASSET_MISC) / 4 +.word (ASSET_MISC_23 - ASSET_MISC) / 4 +.word (ASSET_MISC_24 - ASSET_MISC) / 4 +.word (ASSET_MISC_25 - ASSET_MISC) / 4 +.word (ASSET_MISC_TRACKS_MENU_IDS - ASSET_MISC) / 4 +.word (ASSET_MISC_HUB_AREA_IDS - ASSET_MISC) / 4 +.word (ASSET_MISC_MAIN_TRACKS_IDS - ASSET_MISC) / 4 +.word (ASSET_MISC_BATTLE_TRACKS_IDS - ASSET_MISC) / 4 +.word (ASSET_MISC_BOSS_TRACKS_IDS - ASSET_MISC) / 4 +.word (ASSET_MISC_31 - ASSET_MISC) / 4 +.word (ASSET_MISC_32 - ASSET_MISC) / 4 +.word (ASSET_MISC_RACERSTATS_UNKNOWN0 - ASSET_MISC) / 4 +.word (ASSET_MISC_RACERSTATS_DIDDY - ASSET_MISC) / 4 +.word (ASSET_MISC_RACERSTATS_TT - ASSET_MISC) / 4 +.word (ASSET_MISC_RACERSTATS_UNKNOWN1 - ASSET_MISC) / 4 +.word (ASSET_MISC_RACERSTATS_KRUNCH - ASSET_MISC) / 4 +.word (ASSET_MISC_RACERSTATS_BUMPER - ASSET_MISC) / 4 +.word (ASSET_MISC_RACERSTATS_TIPTUP - ASSET_MISC) / 4 +.word (ASSET_MISC_RACERSTATS_CONKER - ASSET_MISC) / 4 +.word (ASSET_MISC_RACERSTATS_TIMBER - ASSET_MISC) / 4 +.word (ASSET_MISC_RACERSTATS_BANJO - ASSET_MISC) / 4 +.word (ASSET_MISC_RACERSTATS_DRUMSTICK - ASSET_MISC) / 4 +.word (ASSET_MISC_RACERSTATS_PIPSY - ASSET_MISC) / 4 +.word (ASSET_MISC_RACERSTATS_UNKNOWN2 - ASSET_MISC) / 4 +.word (ASSET_MISC_46 - ASSET_MISC) / 4 +.word (ASSET_MISC_47 - ASSET_MISC) / 4 +.word (ASSET_MISC_48 - ASSET_MISC) / 4 +.word (ASSET_MISC_49 - ASSET_MISC) / 4 +.word (ASSET_MISC_50 - ASSET_MISC) / 4 +.word (ASSET_MISC_51 - ASSET_MISC) / 4 +.word (ASSET_MISC_52 - ASSET_MISC) / 4 +.word (ASSET_MISC_53 - ASSET_MISC) / 4 +.word (ASSET_MISC_54 - ASSET_MISC) / 4 +.word (ASSET_MISC_55 - ASSET_MISC) / 4 +.word (ASSET_MISC_56 - ASSET_MISC) / 4 +.word (ASSET_MISC_57 - ASSET_MISC) / 4 +.word (ASSET_MISC_58 - ASSET_MISC) / 4 +.word (ASSET_MISC_59 - ASSET_MISC) / 4 +.word (ASSET_MISC_60 - ASSET_MISC) / 4 +.word (ASSET_MISC_61 - ASSET_MISC) / 4 +.word (ASSET_MISC_62 - ASSET_MISC) / 4 +.word (ASSET_MISC_63 - ASSET_MISC) / 4 +.word (ASSET_MISC_64 - ASSET_MISC) / 4 +.word (ASSET_MISC_MAGIC_CODES - ASSET_MISC) / 4 +.word (ASSET_MISC_TITLE_SCREEN_DEMO_IDS - ASSET_MISC) / 4 +.word (ASSET_MISC_67 - ASSET_MISC) / 4 +.word (ASSET_MISC_68 - ASSET_MISC) / 4 +.word (ASSET_MISC_69 - ASSET_MISC) / 4 +.word (ASSET_MISC_END - ASSET_MISC) / 4 .word 0xFFFFFFFF -glabel ASSET_SECTION_16_END + +/********** ASSET_HUD_ELEMENT_IDS **********/ .balign 16 -glabel ASSET_SECTION_17 -glabel ASSET_17_0 +glabel ASSET_HUD_ELEMENT_IDS .incbin "./build/us_1.0/ids/hud_element_ids.bin" -glabel ASSET_SECTION_17_END +glabel ASSET_HUD_ELEMENT_IDS_END + +/********** ASSET_MENU_ELEMENT_IDS **********/ .balign 16 -glabel ASSET_SECTION_18 -glabel ASSET_18_0 +glabel ASSET_MENU_ELEMENT_IDS .incbin "./build/us_1.0/ids/menu_element_ids.bin" -glabel ASSET_SECTION_18_END +glabel ASSET_MENU_ELEMENT_IDS_END + +/********** ASSET_UNKNOWN_19 **********/ .balign 16 -glabel ASSET_SECTION_19 -glabel ASSET_19_0 +glabel ASSET_UNKNOWN_19 .incbin "./build/us_1.0/bin/unknown_table.bin" -glabel ASSET_SECTION_19_END +glabel ASSET_UNKNOWN_19_END + +/********** ASSET_LEVEL_OBJECT_MAPS_TABLE **********/ .balign 16 -glabel ASSET_SECTION_20 -.word ASSET_21_0 - ASSET_SECTION_21 -.word ASSET_21_1 - ASSET_SECTION_21 -.word ASSET_21_2 - ASSET_SECTION_21 -.word ASSET_21_3 - ASSET_SECTION_21 -.word ASSET_21_4 - ASSET_SECTION_21 -.word ASSET_21_5 - ASSET_SECTION_21 -.word ASSET_21_6 - ASSET_SECTION_21 -.word ASSET_21_7 - ASSET_SECTION_21 -.word ASSET_21_8 - ASSET_SECTION_21 -.word ASSET_21_9 - ASSET_SECTION_21 -.word ASSET_21_10 - ASSET_SECTION_21 -.word ASSET_21_11 - ASSET_SECTION_21 -.word ASSET_21_12 - ASSET_SECTION_21 -.word ASSET_21_13 - ASSET_SECTION_21 -.word ASSET_21_14 - ASSET_SECTION_21 -.word ASSET_21_15 - ASSET_SECTION_21 -.word ASSET_21_16 - ASSET_SECTION_21 -.word ASSET_21_17 - ASSET_SECTION_21 -.word ASSET_21_18 - ASSET_SECTION_21 -.word ASSET_21_19 - ASSET_SECTION_21 -.word ASSET_21_20 - ASSET_SECTION_21 -.word ASSET_21_21 - ASSET_SECTION_21 -.word ASSET_21_22 - ASSET_SECTION_21 -.word ASSET_21_23 - ASSET_SECTION_21 -.word ASSET_21_24 - ASSET_SECTION_21 -.word ASSET_21_25 - ASSET_SECTION_21 -.word ASSET_21_26 - ASSET_SECTION_21 -.word ASSET_21_27 - ASSET_SECTION_21 -.word ASSET_21_28 - ASSET_SECTION_21 -.word ASSET_21_29 - ASSET_SECTION_21 -.word ASSET_21_30 - ASSET_SECTION_21 -.word ASSET_21_31 - ASSET_SECTION_21 -.word ASSET_21_32 - ASSET_SECTION_21 -.word ASSET_21_33 - ASSET_SECTION_21 -.word ASSET_21_34 - ASSET_SECTION_21 -.word ASSET_21_35 - ASSET_SECTION_21 -.word ASSET_21_36 - ASSET_SECTION_21 -.word ASSET_21_37 - ASSET_SECTION_21 -.word ASSET_21_38 - ASSET_SECTION_21 -.word ASSET_21_39 - ASSET_SECTION_21 -.word ASSET_21_40 - ASSET_SECTION_21 -.word ASSET_21_41 - ASSET_SECTION_21 -.word ASSET_21_42 - ASSET_SECTION_21 -.word ASSET_21_43 - ASSET_SECTION_21 -.word ASSET_21_44 - ASSET_SECTION_21 -.word ASSET_21_45 - ASSET_SECTION_21 -.word ASSET_21_46 - ASSET_SECTION_21 -.word ASSET_21_47 - ASSET_SECTION_21 -.word ASSET_21_48 - ASSET_SECTION_21 -.word ASSET_21_49 - ASSET_SECTION_21 -.word ASSET_21_50 - ASSET_SECTION_21 -.word ASSET_21_51 - ASSET_SECTION_21 -.word ASSET_21_52 - ASSET_SECTION_21 -.word ASSET_21_53 - ASSET_SECTION_21 -.word ASSET_21_54 - ASSET_SECTION_21 -.word ASSET_21_55 - ASSET_SECTION_21 -.word ASSET_21_56 - ASSET_SECTION_21 -.word ASSET_21_57 - ASSET_SECTION_21 -.word ASSET_21_58 - ASSET_SECTION_21 -.word ASSET_21_59 - ASSET_SECTION_21 -.word ASSET_21_60 - ASSET_SECTION_21 -.word ASSET_21_61 - ASSET_SECTION_21 -.word ASSET_21_62 - ASSET_SECTION_21 -.word ASSET_21_63 - ASSET_SECTION_21 -.word ASSET_21_64 - ASSET_SECTION_21 -.word ASSET_21_65 - ASSET_SECTION_21 -.word ASSET_21_66 - ASSET_SECTION_21 -.word ASSET_21_67 - ASSET_SECTION_21 -.word ASSET_21_68 - ASSET_SECTION_21 -.word ASSET_21_69 - ASSET_SECTION_21 -.word ASSET_21_70 - ASSET_SECTION_21 -.word ASSET_21_71 - ASSET_SECTION_21 -.word ASSET_21_72 - ASSET_SECTION_21 -.word ASSET_21_73 - ASSET_SECTION_21 -.word ASSET_21_74 - ASSET_SECTION_21 -.word ASSET_21_75 - ASSET_SECTION_21 -.word ASSET_21_76 - ASSET_SECTION_21 -.word ASSET_21_77 - ASSET_SECTION_21 -.word ASSET_21_78 - ASSET_SECTION_21 -.word ASSET_21_79 - ASSET_SECTION_21 -.word ASSET_21_80 - ASSET_SECTION_21 -.word ASSET_21_81 - ASSET_SECTION_21 -.word ASSET_21_82 - ASSET_SECTION_21 -.word ASSET_21_83 - ASSET_SECTION_21 -.word ASSET_21_84 - ASSET_SECTION_21 -.word ASSET_21_85 - ASSET_SECTION_21 -.word ASSET_21_86 - ASSET_SECTION_21 -.word ASSET_21_87 - ASSET_SECTION_21 -.word ASSET_21_88 - ASSET_SECTION_21 -.word ASSET_21_89 - ASSET_SECTION_21 -.word ASSET_21_90 - ASSET_SECTION_21 -.word ASSET_21_91 - ASSET_SECTION_21 -.word ASSET_21_92 - ASSET_SECTION_21 -.word ASSET_21_93 - ASSET_SECTION_21 -.word ASSET_21_94 - ASSET_SECTION_21 -.word ASSET_21_95 - ASSET_SECTION_21 -.word ASSET_21_96 - ASSET_SECTION_21 -.word ASSET_21_97 - ASSET_SECTION_21 -.word ASSET_21_98 - ASSET_SECTION_21 -.word ASSET_21_99 - ASSET_SECTION_21 -.word ASSET_21_100 - ASSET_SECTION_21 -.word ASSET_21_101 - ASSET_SECTION_21 -.word ASSET_21_102 - ASSET_SECTION_21 -.word ASSET_21_103 - ASSET_SECTION_21 -.word ASSET_21_104 - ASSET_SECTION_21 -.word ASSET_21_105 - ASSET_SECTION_21 -.word ASSET_21_106 - ASSET_SECTION_21 -.word ASSET_21_107 - ASSET_SECTION_21 -.word ASSET_21_108 - ASSET_SECTION_21 -.word ASSET_21_109 - ASSET_SECTION_21 -.word ASSET_21_110 - ASSET_SECTION_21 -.word ASSET_21_111 - ASSET_SECTION_21 -.word ASSET_21_112 - ASSET_SECTION_21 -.word ASSET_21_113 - ASSET_SECTION_21 -.word ASSET_21_114 - ASSET_SECTION_21 -.word ASSET_21_115 - ASSET_SECTION_21 -.word ASSET_21_116 - ASSET_SECTION_21 -.word ASSET_21_117 - ASSET_SECTION_21 -.word ASSET_21_118 - ASSET_SECTION_21 -.word ASSET_21_119 - ASSET_SECTION_21 -.word ASSET_21_120 - ASSET_SECTION_21 -.word ASSET_21_121 - ASSET_SECTION_21 -.word ASSET_21_122 - ASSET_SECTION_21 -.word ASSET_21_123 - ASSET_SECTION_21 -.word ASSET_21_124 - ASSET_SECTION_21 -.word ASSET_21_125 - ASSET_SECTION_21 -.word ASSET_21_126 - ASSET_SECTION_21 -.word ASSET_21_127 - ASSET_SECTION_21 -.word ASSET_21_128 - ASSET_SECTION_21 -.word ASSET_21_129 - ASSET_SECTION_21 -.word ASSET_21_130 - ASSET_SECTION_21 -.word ASSET_21_131 - ASSET_SECTION_21 -.word ASSET_21_132 - ASSET_SECTION_21 -.word ASSET_21_133 - ASSET_SECTION_21 -.word ASSET_21_134 - ASSET_SECTION_21 -.word ASSET_21_135 - ASSET_SECTION_21 -.word ASSET_21_136 - ASSET_SECTION_21 -.word ASSET_21_137 - ASSET_SECTION_21 -.word ASSET_SECTION_21_END - ASSET_SECTION_21 +glabel ASSET_LEVEL_OBJECT_MAPS_TABLE +.word ASSET_LEVEL_OBJECT_MAPS_0 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_1 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_2 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_3 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_4 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_5 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_6 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_7 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_8 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_9 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_10 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_11 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_12 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_13 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_14 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_15 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_16 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_17 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_18 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_19 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_20 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_21 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_22 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_23 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_24 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_25 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_26 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_27 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_28 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_29 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_30 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_31 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_32 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_33 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_34 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_35 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_36 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_37 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_38 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_39 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_40 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_41 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_42 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_43 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_44 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_45 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_46 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_47 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_48 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_49 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_50 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_51 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_52 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_53 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_54 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_55 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_56 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_57 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_58 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_59 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_60 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_61 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_62 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_63 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_64 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_65 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_66 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_67 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_68 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_69 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_70 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_71 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_72 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_73 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_74 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_75 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_76 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_77 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_78 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_79 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_80 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_81 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_82 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_83 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_84 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_85 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_86 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_87 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_88 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_89 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_90 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_91 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_92 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_93 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_94 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_95 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_96 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_97 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_98 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_99 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_100 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_101 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_102 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_103 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_104 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_105 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_106 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_107 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_108 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_109 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_110 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_111 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_112 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_113 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_114 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_115 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_116 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_117 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_118 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_119 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_120 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_121 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_122 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_123 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_124 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_125 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_126 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_127 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_128 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_129 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_130 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_131 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_132 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_133 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_134 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_135 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_136 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_137 - ASSET_LEVEL_OBJECT_MAPS +.word ASSET_LEVEL_OBJECT_MAPS_END - ASSET_LEVEL_OBJECT_MAPS .word 0xFFFFFFFF -glabel ASSET_SECTION_20_END + +/********** ASSET_LEVEL_OBJECT_MAPS **********/ .balign 16 -glabel ASSET_SECTION_21 -glabel ASSET_21_0 +glabel ASSET_LEVEL_OBJECT_MAPS +glabel ASSET_LEVEL_OBJECT_MAPS_0 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_0.bin" -glabel ASSET_21_1 +glabel ASSET_LEVEL_OBJECT_MAPS_1 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_1.bin" -glabel ASSET_21_2 +glabel ASSET_LEVEL_OBJECT_MAPS_2 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_2.bin" -glabel ASSET_21_3 +glabel ASSET_LEVEL_OBJECT_MAPS_3 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_3.bin" -glabel ASSET_21_4 +glabel ASSET_LEVEL_OBJECT_MAPS_4 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_4.bin" -glabel ASSET_21_5 +glabel ASSET_LEVEL_OBJECT_MAPS_5 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_5.bin" -glabel ASSET_21_6 +glabel ASSET_LEVEL_OBJECT_MAPS_6 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_6.bin" -glabel ASSET_21_7 +glabel ASSET_LEVEL_OBJECT_MAPS_7 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_7.bin" -glabel ASSET_21_8 +glabel ASSET_LEVEL_OBJECT_MAPS_8 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_8.bin" -glabel ASSET_21_9 +glabel ASSET_LEVEL_OBJECT_MAPS_9 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_9.bin" -glabel ASSET_21_10 +glabel ASSET_LEVEL_OBJECT_MAPS_10 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_10.bin" -glabel ASSET_21_11 +glabel ASSET_LEVEL_OBJECT_MAPS_11 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_11.bin" -glabel ASSET_21_12 +glabel ASSET_LEVEL_OBJECT_MAPS_12 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_12.bin" -glabel ASSET_21_13 +glabel ASSET_LEVEL_OBJECT_MAPS_13 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_13.bin" -glabel ASSET_21_14 +glabel ASSET_LEVEL_OBJECT_MAPS_14 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_14.bin" -glabel ASSET_21_15 +glabel ASSET_LEVEL_OBJECT_MAPS_15 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_15.bin" -glabel ASSET_21_16 +glabel ASSET_LEVEL_OBJECT_MAPS_16 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_16.bin" -glabel ASSET_21_17 +glabel ASSET_LEVEL_OBJECT_MAPS_17 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_17.bin" -glabel ASSET_21_18 +glabel ASSET_LEVEL_OBJECT_MAPS_18 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_18.bin" -glabel ASSET_21_19 +glabel ASSET_LEVEL_OBJECT_MAPS_19 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_19.bin" -glabel ASSET_21_20 +glabel ASSET_LEVEL_OBJECT_MAPS_20 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_20.bin" -glabel ASSET_21_21 +glabel ASSET_LEVEL_OBJECT_MAPS_21 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_21.bin" -glabel ASSET_21_22 +glabel ASSET_LEVEL_OBJECT_MAPS_22 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_22.bin" -glabel ASSET_21_23 +glabel ASSET_LEVEL_OBJECT_MAPS_23 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_23.bin" -glabel ASSET_21_24 +glabel ASSET_LEVEL_OBJECT_MAPS_24 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_24.bin" -glabel ASSET_21_25 +glabel ASSET_LEVEL_OBJECT_MAPS_25 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_25.bin" -glabel ASSET_21_26 +glabel ASSET_LEVEL_OBJECT_MAPS_26 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_26.bin" -glabel ASSET_21_27 +glabel ASSET_LEVEL_OBJECT_MAPS_27 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_27.bin" -glabel ASSET_21_28 +glabel ASSET_LEVEL_OBJECT_MAPS_28 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_28.bin" -glabel ASSET_21_29 +glabel ASSET_LEVEL_OBJECT_MAPS_29 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_29.bin" -glabel ASSET_21_30 +glabel ASSET_LEVEL_OBJECT_MAPS_30 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_30.bin" -glabel ASSET_21_31 +glabel ASSET_LEVEL_OBJECT_MAPS_31 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_31.bin" -glabel ASSET_21_32 +glabel ASSET_LEVEL_OBJECT_MAPS_32 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_32.bin" -glabel ASSET_21_33 +glabel ASSET_LEVEL_OBJECT_MAPS_33 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_33.bin" -glabel ASSET_21_34 +glabel ASSET_LEVEL_OBJECT_MAPS_34 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_34.bin" -glabel ASSET_21_35 +glabel ASSET_LEVEL_OBJECT_MAPS_35 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_35.bin" -glabel ASSET_21_36 +glabel ASSET_LEVEL_OBJECT_MAPS_36 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_36.bin" -glabel ASSET_21_37 +glabel ASSET_LEVEL_OBJECT_MAPS_37 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_37.bin" -glabel ASSET_21_38 +glabel ASSET_LEVEL_OBJECT_MAPS_38 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_38.bin" -glabel ASSET_21_39 +glabel ASSET_LEVEL_OBJECT_MAPS_39 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_39.bin" -glabel ASSET_21_40 +glabel ASSET_LEVEL_OBJECT_MAPS_40 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_40.bin" -glabel ASSET_21_41 +glabel ASSET_LEVEL_OBJECT_MAPS_41 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_41.bin" -glabel ASSET_21_42 +glabel ASSET_LEVEL_OBJECT_MAPS_42 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_42.bin" -glabel ASSET_21_43 +glabel ASSET_LEVEL_OBJECT_MAPS_43 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_43.bin" -glabel ASSET_21_44 +glabel ASSET_LEVEL_OBJECT_MAPS_44 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_44.bin" -glabel ASSET_21_45 +glabel ASSET_LEVEL_OBJECT_MAPS_45 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_45.bin" -glabel ASSET_21_46 +glabel ASSET_LEVEL_OBJECT_MAPS_46 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_46.bin" -glabel ASSET_21_47 +glabel ASSET_LEVEL_OBJECT_MAPS_47 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_47.bin" -glabel ASSET_21_48 +glabel ASSET_LEVEL_OBJECT_MAPS_48 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_48.bin" -glabel ASSET_21_49 +glabel ASSET_LEVEL_OBJECT_MAPS_49 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_49.bin" -glabel ASSET_21_50 +glabel ASSET_LEVEL_OBJECT_MAPS_50 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_50.bin" -glabel ASSET_21_51 +glabel ASSET_LEVEL_OBJECT_MAPS_51 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_51.bin" -glabel ASSET_21_52 +glabel ASSET_LEVEL_OBJECT_MAPS_52 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_52.bin" -glabel ASSET_21_53 +glabel ASSET_LEVEL_OBJECT_MAPS_53 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_53.bin" -glabel ASSET_21_54 +glabel ASSET_LEVEL_OBJECT_MAPS_54 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_54.bin" -glabel ASSET_21_55 +glabel ASSET_LEVEL_OBJECT_MAPS_55 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_55.bin" -glabel ASSET_21_56 +glabel ASSET_LEVEL_OBJECT_MAPS_56 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_56.bin" -glabel ASSET_21_57 +glabel ASSET_LEVEL_OBJECT_MAPS_57 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_57.bin" -glabel ASSET_21_58 +glabel ASSET_LEVEL_OBJECT_MAPS_58 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_58.bin" -glabel ASSET_21_59 +glabel ASSET_LEVEL_OBJECT_MAPS_59 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_59.bin" -glabel ASSET_21_60 +glabel ASSET_LEVEL_OBJECT_MAPS_60 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_60.bin" -glabel ASSET_21_61 +glabel ASSET_LEVEL_OBJECT_MAPS_61 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_61.bin" -glabel ASSET_21_62 +glabel ASSET_LEVEL_OBJECT_MAPS_62 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_62.bin" -glabel ASSET_21_63 +glabel ASSET_LEVEL_OBJECT_MAPS_63 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_63.bin" -glabel ASSET_21_64 +glabel ASSET_LEVEL_OBJECT_MAPS_64 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_64.bin" -glabel ASSET_21_65 +glabel ASSET_LEVEL_OBJECT_MAPS_65 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_65.bin" -glabel ASSET_21_66 +glabel ASSET_LEVEL_OBJECT_MAPS_66 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_66.bin" -glabel ASSET_21_67 +glabel ASSET_LEVEL_OBJECT_MAPS_67 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_67.bin" -glabel ASSET_21_68 +glabel ASSET_LEVEL_OBJECT_MAPS_68 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_68.bin" -glabel ASSET_21_69 +glabel ASSET_LEVEL_OBJECT_MAPS_69 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_69.bin" -glabel ASSET_21_70 +glabel ASSET_LEVEL_OBJECT_MAPS_70 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_70.bin" -glabel ASSET_21_71 +glabel ASSET_LEVEL_OBJECT_MAPS_71 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_71.bin" -glabel ASSET_21_72 +glabel ASSET_LEVEL_OBJECT_MAPS_72 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_72.bin" -glabel ASSET_21_73 +glabel ASSET_LEVEL_OBJECT_MAPS_73 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_73.bin" -glabel ASSET_21_74 +glabel ASSET_LEVEL_OBJECT_MAPS_74 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_74.bin" -glabel ASSET_21_75 +glabel ASSET_LEVEL_OBJECT_MAPS_75 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_75.bin" -glabel ASSET_21_76 +glabel ASSET_LEVEL_OBJECT_MAPS_76 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_76.bin" -glabel ASSET_21_77 +glabel ASSET_LEVEL_OBJECT_MAPS_77 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_77.bin" -glabel ASSET_21_78 +glabel ASSET_LEVEL_OBJECT_MAPS_78 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_78.bin" -glabel ASSET_21_79 +glabel ASSET_LEVEL_OBJECT_MAPS_79 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_79.bin" -glabel ASSET_21_80 +glabel ASSET_LEVEL_OBJECT_MAPS_80 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_80.bin" -glabel ASSET_21_81 +glabel ASSET_LEVEL_OBJECT_MAPS_81 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_81.bin" -glabel ASSET_21_82 +glabel ASSET_LEVEL_OBJECT_MAPS_82 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_82.bin" -glabel ASSET_21_83 +glabel ASSET_LEVEL_OBJECT_MAPS_83 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_83.bin" -glabel ASSET_21_84 +glabel ASSET_LEVEL_OBJECT_MAPS_84 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_84.bin" -glabel ASSET_21_85 +glabel ASSET_LEVEL_OBJECT_MAPS_85 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_85.bin" -glabel ASSET_21_86 +glabel ASSET_LEVEL_OBJECT_MAPS_86 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_86.bin" -glabel ASSET_21_87 +glabel ASSET_LEVEL_OBJECT_MAPS_87 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_87.bin" -glabel ASSET_21_88 +glabel ASSET_LEVEL_OBJECT_MAPS_88 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_88.bin" -glabel ASSET_21_89 +glabel ASSET_LEVEL_OBJECT_MAPS_89 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_89.bin" -glabel ASSET_21_90 +glabel ASSET_LEVEL_OBJECT_MAPS_90 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_90.bin" -glabel ASSET_21_91 +glabel ASSET_LEVEL_OBJECT_MAPS_91 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_91.bin" -glabel ASSET_21_92 +glabel ASSET_LEVEL_OBJECT_MAPS_92 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_92.bin" -glabel ASSET_21_93 +glabel ASSET_LEVEL_OBJECT_MAPS_93 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_93.bin" -glabel ASSET_21_94 +glabel ASSET_LEVEL_OBJECT_MAPS_94 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_94.bin" -glabel ASSET_21_95 +glabel ASSET_LEVEL_OBJECT_MAPS_95 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_95.bin" -glabel ASSET_21_96 +glabel ASSET_LEVEL_OBJECT_MAPS_96 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_96.bin" -glabel ASSET_21_97 +glabel ASSET_LEVEL_OBJECT_MAPS_97 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_97.bin" -glabel ASSET_21_98 +glabel ASSET_LEVEL_OBJECT_MAPS_98 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_98.bin" -glabel ASSET_21_99 +glabel ASSET_LEVEL_OBJECT_MAPS_99 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_99.bin" -glabel ASSET_21_100 +glabel ASSET_LEVEL_OBJECT_MAPS_100 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_100.bin" -glabel ASSET_21_101 +glabel ASSET_LEVEL_OBJECT_MAPS_101 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_101.bin" -glabel ASSET_21_102 +glabel ASSET_LEVEL_OBJECT_MAPS_102 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_102.bin" -glabel ASSET_21_103 +glabel ASSET_LEVEL_OBJECT_MAPS_103 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_103.bin" -glabel ASSET_21_104 +glabel ASSET_LEVEL_OBJECT_MAPS_104 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_104.bin" -glabel ASSET_21_105 +glabel ASSET_LEVEL_OBJECT_MAPS_105 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_105.bin" -glabel ASSET_21_106 +glabel ASSET_LEVEL_OBJECT_MAPS_106 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_106.bin" -glabel ASSET_21_107 +glabel ASSET_LEVEL_OBJECT_MAPS_107 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_107.bin" -glabel ASSET_21_108 +glabel ASSET_LEVEL_OBJECT_MAPS_108 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_108.bin" -glabel ASSET_21_109 +glabel ASSET_LEVEL_OBJECT_MAPS_109 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_109.bin" -glabel ASSET_21_110 +glabel ASSET_LEVEL_OBJECT_MAPS_110 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_110.bin" -glabel ASSET_21_111 +glabel ASSET_LEVEL_OBJECT_MAPS_111 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_111.bin" -glabel ASSET_21_112 +glabel ASSET_LEVEL_OBJECT_MAPS_112 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_112.bin" -glabel ASSET_21_113 +glabel ASSET_LEVEL_OBJECT_MAPS_113 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_113.bin" -glabel ASSET_21_114 +glabel ASSET_LEVEL_OBJECT_MAPS_114 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_114.bin" -glabel ASSET_21_115 +glabel ASSET_LEVEL_OBJECT_MAPS_115 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_115.bin" -glabel ASSET_21_116 +glabel ASSET_LEVEL_OBJECT_MAPS_116 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_116.bin" -glabel ASSET_21_117 +glabel ASSET_LEVEL_OBJECT_MAPS_117 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_117.bin" -glabel ASSET_21_118 +glabel ASSET_LEVEL_OBJECT_MAPS_118 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_118.bin" -glabel ASSET_21_119 +glabel ASSET_LEVEL_OBJECT_MAPS_119 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_119.bin" -glabel ASSET_21_120 +glabel ASSET_LEVEL_OBJECT_MAPS_120 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_120.bin" -glabel ASSET_21_121 +glabel ASSET_LEVEL_OBJECT_MAPS_121 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_121.bin" -glabel ASSET_21_122 +glabel ASSET_LEVEL_OBJECT_MAPS_122 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_122.bin" -glabel ASSET_21_123 +glabel ASSET_LEVEL_OBJECT_MAPS_123 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_123.bin" -glabel ASSET_21_124 +glabel ASSET_LEVEL_OBJECT_MAPS_124 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_124.bin" -glabel ASSET_21_125 +glabel ASSET_LEVEL_OBJECT_MAPS_125 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_125.bin" -glabel ASSET_21_126 +glabel ASSET_LEVEL_OBJECT_MAPS_126 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_126.bin" -glabel ASSET_21_127 +glabel ASSET_LEVEL_OBJECT_MAPS_127 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_127.bin" -glabel ASSET_21_128 +glabel ASSET_LEVEL_OBJECT_MAPS_128 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_128.bin" -glabel ASSET_21_129 +glabel ASSET_LEVEL_OBJECT_MAPS_129 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_129.bin" -glabel ASSET_21_130 +glabel ASSET_LEVEL_OBJECT_MAPS_130 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_130.bin" -glabel ASSET_21_131 +glabel ASSET_LEVEL_OBJECT_MAPS_131 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_131.bin" -glabel ASSET_21_132 +glabel ASSET_LEVEL_OBJECT_MAPS_132 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_132.bin" -glabel ASSET_21_133 +glabel ASSET_LEVEL_OBJECT_MAPS_133 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_133.bin" -glabel ASSET_21_134 +glabel ASSET_LEVEL_OBJECT_MAPS_134 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_134.bin" -glabel ASSET_21_135 +glabel ASSET_LEVEL_OBJECT_MAPS_135 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_135.bin" -glabel ASSET_21_136 +glabel ASSET_LEVEL_OBJECT_MAPS_136 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_136.bin" -glabel ASSET_21_137 +glabel ASSET_LEVEL_OBJECT_MAPS_137 .incbin "./build/us_1.0/levels/objectMaps/unknown_21_137.bin" -glabel ASSET_SECTION_21_END +glabel ASSET_LEVEL_OBJECT_MAPS_END + +/********** ASSET_LEVEL_HEADERS_TABLE **********/ .balign 16 -glabel ASSET_SECTION_22 -.word ASSET_23_0 - ASSET_SECTION_23 -.word ASSET_23_1 - ASSET_SECTION_23 -.word ASSET_23_2 - ASSET_SECTION_23 -.word ASSET_23_3 - ASSET_SECTION_23 -.word ASSET_23_4 - ASSET_SECTION_23 -.word ASSET_23_5 - ASSET_SECTION_23 -.word ASSET_23_6 - ASSET_SECTION_23 -.word ASSET_23_7 - ASSET_SECTION_23 -.word ASSET_23_8 - ASSET_SECTION_23 -.word ASSET_23_9 - ASSET_SECTION_23 -.word ASSET_23_10 - ASSET_SECTION_23 -.word ASSET_23_11 - ASSET_SECTION_23 -.word ASSET_23_12 - ASSET_SECTION_23 -.word ASSET_23_13 - ASSET_SECTION_23 -.word ASSET_23_14 - ASSET_SECTION_23 -.word ASSET_23_15 - ASSET_SECTION_23 -.word ASSET_23_16 - ASSET_SECTION_23 -.word ASSET_23_17 - ASSET_SECTION_23 -.word ASSET_23_18 - ASSET_SECTION_23 -.word ASSET_23_19 - ASSET_SECTION_23 -.word ASSET_23_20 - ASSET_SECTION_23 -.word ASSET_23_21 - ASSET_SECTION_23 -.word ASSET_23_22 - ASSET_SECTION_23 -.word ASSET_23_23 - ASSET_SECTION_23 -.word ASSET_23_24 - ASSET_SECTION_23 -.word ASSET_23_25 - ASSET_SECTION_23 -.word ASSET_23_26 - ASSET_SECTION_23 -.word ASSET_23_27 - ASSET_SECTION_23 -.word ASSET_23_28 - ASSET_SECTION_23 -.word ASSET_23_29 - ASSET_SECTION_23 -.word ASSET_23_30 - ASSET_SECTION_23 -.word ASSET_23_31 - ASSET_SECTION_23 -.word ASSET_23_32 - ASSET_SECTION_23 -.word ASSET_23_33 - ASSET_SECTION_23 -.word ASSET_23_34 - ASSET_SECTION_23 -.word ASSET_23_35 - ASSET_SECTION_23 -.word ASSET_23_36 - ASSET_SECTION_23 -.word ASSET_23_37 - ASSET_SECTION_23 -.word ASSET_23_38 - ASSET_SECTION_23 -.word ASSET_23_39 - ASSET_SECTION_23 -.word ASSET_23_40 - ASSET_SECTION_23 -.word ASSET_23_41 - ASSET_SECTION_23 -.word ASSET_23_42 - ASSET_SECTION_23 -.word ASSET_23_43 - ASSET_SECTION_23 -.word ASSET_23_44 - ASSET_SECTION_23 -.word ASSET_23_45 - ASSET_SECTION_23 -.word ASSET_23_46 - ASSET_SECTION_23 -.word ASSET_23_47 - ASSET_SECTION_23 -.word ASSET_23_48 - ASSET_SECTION_23 -.word ASSET_23_49 - ASSET_SECTION_23 -.word ASSET_23_50 - ASSET_SECTION_23 -.word ASSET_23_51 - ASSET_SECTION_23 -.word ASSET_23_52 - ASSET_SECTION_23 -.word ASSET_23_53 - ASSET_SECTION_23 -.word ASSET_23_54 - ASSET_SECTION_23 -.word ASSET_23_55 - ASSET_SECTION_23 -.word ASSET_23_56 - ASSET_SECTION_23 -.word ASSET_23_57 - ASSET_SECTION_23 -.word ASSET_23_58 - ASSET_SECTION_23 -.word ASSET_23_59 - ASSET_SECTION_23 -.word ASSET_23_60 - ASSET_SECTION_23 -.word ASSET_23_61 - ASSET_SECTION_23 -.word ASSET_23_62 - ASSET_SECTION_23 -.word ASSET_23_63 - ASSET_SECTION_23 -.word ASSET_23_64 - ASSET_SECTION_23 -.word ASSET_SECTION_23_END - ASSET_SECTION_23 +glabel ASSET_LEVEL_HEADERS_TABLE +.word ASSET_LEVEL_CENTRALAREAHUB - ASSET_LEVEL_HEADERS +.word ASSET_LEVEL_BLUEY1 - ASSET_LEVEL_HEADERS +.word ASSET_LEVEL_DRAGONFORESTHUB - ASSET_LEVEL_HEADERS +.word ASSET_LEVEL_FOSSILCANYON - ASSET_LEVEL_HEADERS +.word ASSET_LEVEL_PIRATELAGOON - ASSET_LEVEL_HEADERS +.word ASSET_LEVEL_ANCIENTLAKE - ASSET_LEVEL_HEADERS +.word ASSET_LEVEL_WALRUSCOVE - ASSET_LEVEL_HEADERS +.word ASSET_LEVEL_HOTTOPVOLCANO - ASSET_LEVEL_HEADERS +.word ASSET_LEVEL_WHALEBAY - ASSET_LEVEL_HEADERS +.word ASSET_LEVEL_SNOWBALLVALLEY - ASSET_LEVEL_HEADERS +.word ASSET_LEVEL_CRESCENTISLAND - ASSET_LEVEL_HEADERS +.word ASSET_LEVEL_FIREMOUNTAIN - ASSET_LEVEL_HEADERS +.word ASSET_LEVEL_DINODOMAINHUB - ASSET_LEVEL_HEADERS +.word ASSET_LEVEL_EVERFROSTPEAK - ASSET_LEVEL_HEADERS +.word ASSET_LEVEL_SHERBETISLANDHUB - ASSET_LEVEL_HEADERS +.word ASSET_LEVEL_SPACEPORTALPHA - ASSET_LEVEL_HEADERS +.word ASSET_LEVEL_HORSESHOEGULCH - ASSET_LEVEL_HEADERS +.word ASSET_LEVEL_SPACEDUSTALLEY - ASSET_LEVEL_HEADERS +.word ASSET_LEVEL_GREENWOODVILLAGE - ASSET_LEVEL_HEADERS +.word ASSET_LEVEL_BOULDERCANYON - ASSET_LEVEL_HEADERS +.word ASSET_LEVEL_WINDMILLPLAINS - ASSET_LEVEL_HEADERS +.word ASSET_LEVEL_FRONTEND - ASSET_LEVEL_HEADERS +.word ASSET_LEVEL_CHARACTERSELECT - ASSET_LEVEL_HEADERS +.word ASSET_LEVEL_TITLESCREENSEQUENCE - ASSET_LEVEL_HEADERS +.word ASSET_LEVEL_SNOWFLAKEMOUNTAINHUB - ASSET_LEVEL_HEADERS +.word ASSET_LEVEL_SMOKEYCASTLE - ASSET_LEVEL_HEADERS +.word ASSET_LEVEL_DARKWATERBEACH - ASSET_LEVEL_HEADERS +.word ASSET_LEVEL_ICICLEPYRAMID - ASSET_LEVEL_HEADERS +.word ASSET_LEVEL_FROSTYVILLAGE - ASSET_LEVEL_HEADERS +.word ASSET_LEVEL_JUNGLEFALLS - ASSET_LEVEL_HEADERS +.word ASSET_LEVEL_TREASURECAVES - ASSET_LEVEL_HEADERS +.word ASSET_LEVEL_HAUNTEDWOODS - ASSET_LEVEL_HEADERS +.word ASSET_LEVEL_DARKMOONCAVERNS - ASSET_LEVEL_HEADERS +.word ASSET_LEVEL_STARCITY - ASSET_LEVEL_HEADERS +.word ASSET_LEVEL_TROPHYRACE - ASSET_LEVEL_HEADERS +.word ASSET_LEVEL_FUTUREFUNLANDHUB - ASSET_LEVEL_HEADERS +.word ASSET_LEVEL_OPENINGSEQUENCE - ASSET_LEVEL_HEADERS +.word ASSET_LEVEL_WIZPIG1 - ASSET_LEVEL_HEADERS +.word ASSET_LEVEL_TRICKYTOPS1 - ASSET_LEVEL_HEADERS +.word ASSET_LEVEL_OPTIONSBACKGROUND - ASSET_LEVEL_HEADERS +.word ASSET_LEVEL_BUBBLER1 - ASSET_LEVEL_HEADERS +.word ASSET_LEVEL_SMOKEY1 - ASSET_LEVEL_HEADERS +.word ASSET_LEVEL_WIZPIGMOUTHSEQUENCE - ASSET_LEVEL_HEADERS +.word ASSET_LEVEL_WIZPIGAMULETSEQUENCE - ASSET_LEVEL_HEADERS +.word ASSET_LEVEL_TTAMULETSEQUENCE - ASSET_LEVEL_HEADERS +.word ASSET_LEVEL_ROCKETSEQUENCE - ASSET_LEVEL_HEADERS +.word ASSET_LEVEL_TRICKYTOPS2 - ASSET_LEVEL_HEADERS +.word ASSET_LEVEL_DINODOMAINTROPHYANIM - ASSET_LEVEL_HEADERS +.word ASSET_LEVEL_SNOWFLAKEMOUNTAINTROPHYANIM - ASSET_LEVEL_HEADERS +.word ASSET_LEVEL_SHERBETISLANDTROPHYANIM - ASSET_LEVEL_HEADERS +.word ASSET_LEVEL_DRAGONFORESTTROPHYANIM - ASSET_LEVEL_HEADERS +.word ASSET_LEVEL_FUTUREFUNLANDTROPHYANIM - ASSET_LEVEL_HEADERS +.word ASSET_LEVEL_BLUEY2 - ASSET_LEVEL_HEADERS +.word ASSET_LEVEL_BUBBLER2 - ASSET_LEVEL_HEADERS +.word ASSET_LEVEL_SMOKEY2 - ASSET_LEVEL_HEADERS +.word ASSET_LEVEL_WIZPIG2 - ASSET_LEVEL_HEADERS +.word ASSET_LEVEL_PARTYSEQUENCE - ASSET_LEVEL_HEADERS +.word ASSET_LEVEL_TRICKTOPSANIM - ASSET_LEVEL_HEADERS +.word ASSET_LEVEL_SMOKEYANIM - ASSET_LEVEL_HEADERS +.word ASSET_LEVEL_BLUEYANIM - ASSET_LEVEL_HEADERS +.word ASSET_LEVEL_WIZPIG1ANIM - ASSET_LEVEL_HEADERS +.word ASSET_LEVEL_BUBBLERANIM - ASSET_LEVEL_HEADERS +.word ASSET_LEVEL_WIZPIG2ANIM - ASSET_LEVEL_HEADERS +.word ASSET_LEVEL_LASTBIT - ASSET_LEVEL_HEADERS +.word ASSET_LEVEL_LASTBITB - ASSET_LEVEL_HEADERS +.word ASSET_LEVEL_HEADERS_END - ASSET_LEVEL_HEADERS .word 0xFFFFFFFF -glabel ASSET_SECTION_22_END + +/********** ASSET_LEVEL_HEADERS **********/ .balign 16 -glabel ASSET_SECTION_23 -glabel ASSET_23_0 +glabel ASSET_LEVEL_HEADERS +glabel ASSET_LEVEL_CENTRALAREAHUB .incbin "./build/us_1.0/levels/headers/CentralAreaHub.bin" -glabel ASSET_23_1 +glabel ASSET_LEVEL_BLUEY1 .incbin "./build/us_1.0/levels/headers/Bluey1.bin" -glabel ASSET_23_2 +glabel ASSET_LEVEL_DRAGONFORESTHUB .incbin "./build/us_1.0/levels/headers/DragonForestHub.bin" -glabel ASSET_23_3 +glabel ASSET_LEVEL_FOSSILCANYON .incbin "./build/us_1.0/levels/headers/FossilCanyon.bin" -glabel ASSET_23_4 +glabel ASSET_LEVEL_PIRATELAGOON .incbin "./build/us_1.0/levels/headers/PirateLagoon.bin" -glabel ASSET_23_5 +glabel ASSET_LEVEL_ANCIENTLAKE .incbin "./build/us_1.0/levels/headers/AncientLake.bin" -glabel ASSET_23_6 +glabel ASSET_LEVEL_WALRUSCOVE .incbin "./build/us_1.0/levels/headers/WalrusCove.bin" -glabel ASSET_23_7 +glabel ASSET_LEVEL_HOTTOPVOLCANO .incbin "./build/us_1.0/levels/headers/HotTopVolcano.bin" -glabel ASSET_23_8 +glabel ASSET_LEVEL_WHALEBAY .incbin "./build/us_1.0/levels/headers/WhaleBay.bin" -glabel ASSET_23_9 +glabel ASSET_LEVEL_SNOWBALLVALLEY .incbin "./build/us_1.0/levels/headers/SnowballValley.bin" -glabel ASSET_23_10 +glabel ASSET_LEVEL_CRESCENTISLAND .incbin "./build/us_1.0/levels/headers/CrescentIsland.bin" -glabel ASSET_23_11 +glabel ASSET_LEVEL_FIREMOUNTAIN .incbin "./build/us_1.0/levels/headers/FireMountain.bin" -glabel ASSET_23_12 +glabel ASSET_LEVEL_DINODOMAINHUB .incbin "./build/us_1.0/levels/headers/DinoDomainHub.bin" -glabel ASSET_23_13 +glabel ASSET_LEVEL_EVERFROSTPEAK .incbin "./build/us_1.0/levels/headers/EverfrostPeak.bin" -glabel ASSET_23_14 +glabel ASSET_LEVEL_SHERBETISLANDHUB .incbin "./build/us_1.0/levels/headers/SherbetIslandHub.bin" -glabel ASSET_23_15 +glabel ASSET_LEVEL_SPACEPORTALPHA .incbin "./build/us_1.0/levels/headers/SpaceportAlpha.bin" -glabel ASSET_23_16 +glabel ASSET_LEVEL_HORSESHOEGULCH .incbin "./build/us_1.0/levels/headers/HorseshoeGulch.bin" -glabel ASSET_23_17 +glabel ASSET_LEVEL_SPACEDUSTALLEY .incbin "./build/us_1.0/levels/headers/SpacedustAlley.bin" -glabel ASSET_23_18 +glabel ASSET_LEVEL_GREENWOODVILLAGE .incbin "./build/us_1.0/levels/headers/GreenwoodVillage.bin" -glabel ASSET_23_19 +glabel ASSET_LEVEL_BOULDERCANYON .incbin "./build/us_1.0/levels/headers/BoulderCanyon.bin" -glabel ASSET_23_20 +glabel ASSET_LEVEL_WINDMILLPLAINS .incbin "./build/us_1.0/levels/headers/WindmillPlains.bin" -glabel ASSET_23_21 +glabel ASSET_LEVEL_FRONTEND .incbin "./build/us_1.0/levels/headers/FrontEnd.bin" -glabel ASSET_23_22 +glabel ASSET_LEVEL_CHARACTERSELECT .incbin "./build/us_1.0/levels/headers/CharacterSelect.bin" -glabel ASSET_23_23 +glabel ASSET_LEVEL_TITLESCREENSEQUENCE .incbin "./build/us_1.0/levels/headers/TitleScreenSequence.bin" -glabel ASSET_23_24 +glabel ASSET_LEVEL_SNOWFLAKEMOUNTAINHUB .incbin "./build/us_1.0/levels/headers/SnowflakeMountainHub.bin" -glabel ASSET_23_25 +glabel ASSET_LEVEL_SMOKEYCASTLE .incbin "./build/us_1.0/levels/headers/SmokeyCastle.bin" -glabel ASSET_23_26 +glabel ASSET_LEVEL_DARKWATERBEACH .incbin "./build/us_1.0/levels/headers/DarkwaterBeach.bin" -glabel ASSET_23_27 +glabel ASSET_LEVEL_ICICLEPYRAMID .incbin "./build/us_1.0/levels/headers/IciclePyramid.bin" -glabel ASSET_23_28 +glabel ASSET_LEVEL_FROSTYVILLAGE .incbin "./build/us_1.0/levels/headers/FrostyVillage.bin" -glabel ASSET_23_29 +glabel ASSET_LEVEL_JUNGLEFALLS .incbin "./build/us_1.0/levels/headers/JungleFalls.bin" -glabel ASSET_23_30 +glabel ASSET_LEVEL_TREASURECAVES .incbin "./build/us_1.0/levels/headers/TreasureCaves.bin" -glabel ASSET_23_31 +glabel ASSET_LEVEL_HAUNTEDWOODS .incbin "./build/us_1.0/levels/headers/HauntedWoods.bin" -glabel ASSET_23_32 +glabel ASSET_LEVEL_DARKMOONCAVERNS .incbin "./build/us_1.0/levels/headers/DarkmoonCaverns.bin" -glabel ASSET_23_33 +glabel ASSET_LEVEL_STARCITY .incbin "./build/us_1.0/levels/headers/StarCity.bin" -glabel ASSET_23_34 +glabel ASSET_LEVEL_TROPHYRACE .incbin "./build/us_1.0/levels/headers/TrophyRace.bin" -glabel ASSET_23_35 +glabel ASSET_LEVEL_FUTUREFUNLANDHUB .incbin "./build/us_1.0/levels/headers/FutureFunLandHub.bin" -glabel ASSET_23_36 +glabel ASSET_LEVEL_OPENINGSEQUENCE .incbin "./build/us_1.0/levels/headers/OpeningSequence.bin" -glabel ASSET_23_37 +glabel ASSET_LEVEL_WIZPIG1 .incbin "./build/us_1.0/levels/headers/Wizpig1.bin" -glabel ASSET_23_38 +glabel ASSET_LEVEL_TRICKYTOPS1 .incbin "./build/us_1.0/levels/headers/Trickytops1.bin" -glabel ASSET_23_39 +glabel ASSET_LEVEL_OPTIONSBACKGROUND .incbin "./build/us_1.0/levels/headers/OptionsBackground.bin" -glabel ASSET_23_40 +glabel ASSET_LEVEL_BUBBLER1 .incbin "./build/us_1.0/levels/headers/Bubbler1.bin" -glabel ASSET_23_41 +glabel ASSET_LEVEL_SMOKEY1 .incbin "./build/us_1.0/levels/headers/Smokey1.bin" -glabel ASSET_23_42 +glabel ASSET_LEVEL_WIZPIGMOUTHSEQUENCE .incbin "./build/us_1.0/levels/headers/WizpigMouthSequence.bin" -glabel ASSET_23_43 +glabel ASSET_LEVEL_WIZPIGAMULETSEQUENCE .incbin "./build/us_1.0/levels/headers/WizpigAmuletSequence.bin" -glabel ASSET_23_44 +glabel ASSET_LEVEL_TTAMULETSEQUENCE .incbin "./build/us_1.0/levels/headers/TTAmuletSequence.bin" -glabel ASSET_23_45 +glabel ASSET_LEVEL_ROCKETSEQUENCE .incbin "./build/us_1.0/levels/headers/RocketSequence.bin" -glabel ASSET_23_46 +glabel ASSET_LEVEL_TRICKYTOPS2 .incbin "./build/us_1.0/levels/headers/Trickytops2.bin" -glabel ASSET_23_47 +glabel ASSET_LEVEL_DINODOMAINTROPHYANIM .incbin "./build/us_1.0/levels/headers/DinoDomainTrophyAnim.bin" -glabel ASSET_23_48 +glabel ASSET_LEVEL_SNOWFLAKEMOUNTAINTROPHYANIM .incbin "./build/us_1.0/levels/headers/SnowflakeMountainTrophyAnim.bin" -glabel ASSET_23_49 +glabel ASSET_LEVEL_SHERBETISLANDTROPHYANIM .incbin "./build/us_1.0/levels/headers/SherbetIslandTrophyAnim.bin" -glabel ASSET_23_50 +glabel ASSET_LEVEL_DRAGONFORESTTROPHYANIM .incbin "./build/us_1.0/levels/headers/DragonForestTrophyAnim.bin" -glabel ASSET_23_51 +glabel ASSET_LEVEL_FUTUREFUNLANDTROPHYANIM .incbin "./build/us_1.0/levels/headers/FutureFunLandTrophyAnim.bin" -glabel ASSET_23_52 +glabel ASSET_LEVEL_BLUEY2 .incbin "./build/us_1.0/levels/headers/Bluey2.bin" -glabel ASSET_23_53 +glabel ASSET_LEVEL_BUBBLER2 .incbin "./build/us_1.0/levels/headers/Bubbler2.bin" -glabel ASSET_23_54 +glabel ASSET_LEVEL_SMOKEY2 .incbin "./build/us_1.0/levels/headers/Smokey2.bin" -glabel ASSET_23_55 +glabel ASSET_LEVEL_WIZPIG2 .incbin "./build/us_1.0/levels/headers/Wizpig2.bin" -glabel ASSET_23_56 +glabel ASSET_LEVEL_PARTYSEQUENCE .incbin "./build/us_1.0/levels/headers/PartySequence.bin" -glabel ASSET_23_57 +glabel ASSET_LEVEL_TRICKTOPSANIM .incbin "./build/us_1.0/levels/headers/TricktopsAnim.bin" -glabel ASSET_23_58 +glabel ASSET_LEVEL_SMOKEYANIM .incbin "./build/us_1.0/levels/headers/SmokeyAnim.bin" -glabel ASSET_23_59 +glabel ASSET_LEVEL_BLUEYANIM .incbin "./build/us_1.0/levels/headers/BlueyAnim.bin" -glabel ASSET_23_60 +glabel ASSET_LEVEL_WIZPIG1ANIM .incbin "./build/us_1.0/levels/headers/Wizpig1Anim.bin" -glabel ASSET_23_61 +glabel ASSET_LEVEL_BUBBLERANIM .incbin "./build/us_1.0/levels/headers/BubblerAnim.bin" -glabel ASSET_23_62 +glabel ASSET_LEVEL_WIZPIG2ANIM .incbin "./build/us_1.0/levels/headers/Wizpig2Anim.bin" -glabel ASSET_23_63 +glabel ASSET_LEVEL_LASTBIT .incbin "./build/us_1.0/levels/headers/LastBit.bin" -glabel ASSET_23_64 +glabel ASSET_LEVEL_LASTBITB .incbin "./build/us_1.0/levels/headers/LastBitB.bin" -glabel ASSET_SECTION_23_END +glabel ASSET_LEVEL_HEADERS_END + +/********** ASSET_LEVEL_NAMES_TABLE **********/ .balign 16 -glabel ASSET_SECTION_24 -.word ASSET_25_0 - ASSET_SECTION_25 -.word ASSET_25_1 - ASSET_SECTION_25 -.word ASSET_25_2 - ASSET_SECTION_25 -.word ASSET_25_3 - ASSET_SECTION_25 -.word ASSET_25_4 - ASSET_SECTION_25 -.word ASSET_25_5 - ASSET_SECTION_25 -.word ASSET_25_6 - ASSET_SECTION_25 -.word ASSET_25_7 - ASSET_SECTION_25 -.word ASSET_25_8 - ASSET_SECTION_25 -.word ASSET_25_9 - ASSET_SECTION_25 -.word ASSET_25_10 - ASSET_SECTION_25 -.word ASSET_25_11 - ASSET_SECTION_25 -.word ASSET_25_12 - ASSET_SECTION_25 -.word ASSET_25_13 - ASSET_SECTION_25 -.word ASSET_25_14 - ASSET_SECTION_25 -.word ASSET_25_15 - ASSET_SECTION_25 -.word ASSET_25_16 - ASSET_SECTION_25 -.word ASSET_25_17 - ASSET_SECTION_25 -.word ASSET_25_18 - ASSET_SECTION_25 -.word ASSET_25_19 - ASSET_SECTION_25 -.word ASSET_25_20 - ASSET_SECTION_25 -.word ASSET_25_21 - ASSET_SECTION_25 -.word ASSET_25_22 - ASSET_SECTION_25 -.word ASSET_25_23 - ASSET_SECTION_25 -.word ASSET_25_24 - ASSET_SECTION_25 -.word ASSET_25_25 - ASSET_SECTION_25 -.word ASSET_25_26 - ASSET_SECTION_25 -.word ASSET_25_27 - ASSET_SECTION_25 -.word ASSET_25_28 - ASSET_SECTION_25 -.word ASSET_25_29 - ASSET_SECTION_25 -.word ASSET_25_30 - ASSET_SECTION_25 -.word ASSET_25_31 - ASSET_SECTION_25 -.word ASSET_25_32 - ASSET_SECTION_25 -.word ASSET_25_33 - ASSET_SECTION_25 -.word ASSET_25_34 - ASSET_SECTION_25 -.word ASSET_25_35 - ASSET_SECTION_25 -.word ASSET_25_36 - ASSET_SECTION_25 -.word ASSET_25_37 - ASSET_SECTION_25 -.word ASSET_25_38 - ASSET_SECTION_25 -.word ASSET_25_39 - ASSET_SECTION_25 -.word ASSET_25_40 - ASSET_SECTION_25 -.word ASSET_25_41 - ASSET_SECTION_25 -.word ASSET_25_42 - ASSET_SECTION_25 -.word ASSET_25_43 - ASSET_SECTION_25 -.word ASSET_25_44 - ASSET_SECTION_25 -.word ASSET_25_45 - ASSET_SECTION_25 -.word ASSET_25_46 - ASSET_SECTION_25 -.word ASSET_25_47 - ASSET_SECTION_25 -.word ASSET_25_48 - ASSET_SECTION_25 -.word ASSET_25_49 - ASSET_SECTION_25 -.word ASSET_25_50 - ASSET_SECTION_25 -.word ASSET_25_51 - ASSET_SECTION_25 -.word ASSET_25_52 - ASSET_SECTION_25 -.word ASSET_25_53 - ASSET_SECTION_25 -.word ASSET_25_54 - ASSET_SECTION_25 -.word ASSET_25_55 - ASSET_SECTION_25 -.word ASSET_25_56 - ASSET_SECTION_25 -.word ASSET_25_57 - ASSET_SECTION_25 -.word ASSET_25_58 - ASSET_SECTION_25 -.word ASSET_25_59 - ASSET_SECTION_25 -.word ASSET_25_60 - ASSET_SECTION_25 -.word ASSET_25_61 - ASSET_SECTION_25 -.word ASSET_25_62 - ASSET_SECTION_25 -.word ASSET_25_63 - ASSET_SECTION_25 -.word ASSET_25_64 - ASSET_SECTION_25 -.word ASSET_SECTION_25_END - ASSET_SECTION_25 +glabel ASSET_LEVEL_NAMES_TABLE +.word ASSET_LEVELNAME_CENTRALAREAHUB - ASSET_LEVEL_NAMES +.word ASSET_LEVELNAME_BLUEY1 - ASSET_LEVEL_NAMES +.word ASSET_LEVELNAME_DRAGONFORESTHUB - ASSET_LEVEL_NAMES +.word ASSET_LEVELNAME_FOSSILCANYON - ASSET_LEVEL_NAMES +.word ASSET_LEVELNAME_PIRATELAGOON - ASSET_LEVEL_NAMES +.word ASSET_LEVELNAME_ANCIENTLAKE - ASSET_LEVEL_NAMES +.word ASSET_LEVELNAME_WALRUSCOVE - ASSET_LEVEL_NAMES +.word ASSET_LEVELNAME_HOTTOPVOLCANO - ASSET_LEVEL_NAMES +.word ASSET_LEVELNAME_WHALEBAY - ASSET_LEVEL_NAMES +.word ASSET_LEVELNAME_SNOWBALLVALLEY - ASSET_LEVEL_NAMES +.word ASSET_LEVELNAME_CRESCENTISLAND - ASSET_LEVEL_NAMES +.word ASSET_LEVELNAME_FIREMOUNTAIN - ASSET_LEVEL_NAMES +.word ASSET_LEVELNAME_DINODOMAINHUB - ASSET_LEVEL_NAMES +.word ASSET_LEVELNAME_EVERFROSTPEAK - ASSET_LEVEL_NAMES +.word ASSET_LEVELNAME_SHERBETISLANDHUB - ASSET_LEVEL_NAMES +.word ASSET_LEVELNAME_SPACEPORTALPHA - ASSET_LEVEL_NAMES +.word ASSET_LEVELNAME_HORSESHOEGULCH - ASSET_LEVEL_NAMES +.word ASSET_LEVELNAME_SPACEDUSTALLEY - ASSET_LEVEL_NAMES +.word ASSET_LEVELNAME_GREENWOODVILLAGE - ASSET_LEVEL_NAMES +.word ASSET_LEVELNAME_BOULDERCANYON - ASSET_LEVEL_NAMES +.word ASSET_LEVELNAME_WINDMILLPLAINS - ASSET_LEVEL_NAMES +.word ASSET_LEVELNAME_FRONTEND - ASSET_LEVEL_NAMES +.word ASSET_LEVELNAME_CHARACTERSELECT - ASSET_LEVEL_NAMES +.word ASSET_LEVELNAME_TITLESCREENSEQUENCE - ASSET_LEVEL_NAMES +.word ASSET_LEVELNAME_SNOWFLAKEMOUNTAINHUB - ASSET_LEVEL_NAMES +.word ASSET_LEVELNAME_SMOKEYCASTLE - ASSET_LEVEL_NAMES +.word ASSET_LEVELNAME_DARKWATERBEACH - ASSET_LEVEL_NAMES +.word ASSET_LEVELNAME_ICICLEPYRAMID - ASSET_LEVEL_NAMES +.word ASSET_LEVELNAME_FROSTYVILLAGE - ASSET_LEVEL_NAMES +.word ASSET_LEVELNAME_JUNGLEFALLS - ASSET_LEVEL_NAMES +.word ASSET_LEVELNAME_TREASURECAVES - ASSET_LEVEL_NAMES +.word ASSET_LEVELNAME_HAUNTEDWOODS - ASSET_LEVEL_NAMES +.word ASSET_LEVELNAME_DARKMOONCAVERNS - ASSET_LEVEL_NAMES +.word ASSET_LEVELNAME_STARCITY - ASSET_LEVEL_NAMES +.word ASSET_LEVELNAME_TROPHYRACE - ASSET_LEVEL_NAMES +.word ASSET_LEVELNAME_FUTUREFUNLANDHUB - ASSET_LEVEL_NAMES +.word ASSET_LEVELNAME_OPENINGSEQUENCE - ASSET_LEVEL_NAMES +.word ASSET_LEVELNAME_WIZPIG1 - ASSET_LEVEL_NAMES +.word ASSET_LEVELNAME_TRICKYTOPS1 - ASSET_LEVEL_NAMES +.word ASSET_LEVELNAME_OPTIONSBACKGROUND - ASSET_LEVEL_NAMES +.word ASSET_LEVELNAME_BUBBLER1 - ASSET_LEVEL_NAMES +.word ASSET_LEVELNAME_SMOKEY1 - ASSET_LEVEL_NAMES +.word ASSET_LEVELNAME_WIZPIGMOUTHSEQUENCE - ASSET_LEVEL_NAMES +.word ASSET_LEVELNAME_WIZPIGAMULETSEQUENCE - ASSET_LEVEL_NAMES +.word ASSET_LEVELNAME_TTAMULETSEQUENCE - ASSET_LEVEL_NAMES +.word ASSET_LEVELNAME_ROCKETSEQUENCE - ASSET_LEVEL_NAMES +.word ASSET_LEVELNAME_TRICKYTOPS2 - ASSET_LEVEL_NAMES +.word ASSET_LEVELNAME_DINODOMAINTROPHYANIM - ASSET_LEVEL_NAMES +.word ASSET_LEVELNAME_SNOWFLAKEMOUNTAINTROPHYANIM - ASSET_LEVEL_NAMES +.word ASSET_LEVELNAME_SHERBETISLANDTROPHYANIM - ASSET_LEVEL_NAMES +.word ASSET_LEVELNAME_DRAGONFORESTTROPHYANIM - ASSET_LEVEL_NAMES +.word ASSET_LEVELNAME_FUTUREFUNLANDTROPHYANIM - ASSET_LEVEL_NAMES +.word ASSET_LEVELNAME_BLUEY2 - ASSET_LEVEL_NAMES +.word ASSET_LEVELNAME_BUBBLER2 - ASSET_LEVEL_NAMES +.word ASSET_LEVELNAME_SMOKEY2 - ASSET_LEVEL_NAMES +.word ASSET_LEVELNAME_WIZPIG2 - ASSET_LEVEL_NAMES +.word ASSET_LEVELNAME_PARTYSEQUENCE - ASSET_LEVEL_NAMES +.word ASSET_LEVELNAME_TRICKTOPSANIM - ASSET_LEVEL_NAMES +.word ASSET_LEVELNAME_SMOKEYANIM - ASSET_LEVEL_NAMES +.word ASSET_LEVELNAME_BLUEYANIM - ASSET_LEVEL_NAMES +.word ASSET_LEVELNAME_WIZPIG1ANIM - ASSET_LEVEL_NAMES +.word ASSET_LEVELNAME_BUBBLERANIM - ASSET_LEVEL_NAMES +.word ASSET_LEVELNAME_WIZPIG2ANIM - ASSET_LEVEL_NAMES +.word ASSET_LEVELNAME_LASTBIT - ASSET_LEVEL_NAMES +.word ASSET_LEVELNAME_LASTBITB - ASSET_LEVEL_NAMES +.word ASSET_LEVEL_NAMES_END - ASSET_LEVEL_NAMES .word 0xFFFFFFFF -glabel ASSET_SECTION_24_END + +/********** ASSET_LEVEL_NAMES **********/ .balign 16 -glabel ASSET_SECTION_25 -glabel ASSET_25_0 -.incbin "./build/us_1.0/levels/names/CentralAreaHub.bin" -glabel ASSET_25_1 -.incbin "./build/us_1.0/levels/names/Bluey1.bin" -glabel ASSET_25_2 -.incbin "./build/us_1.0/levels/names/DragonForestHub.bin" -glabel ASSET_25_3 -.incbin "./build/us_1.0/levels/names/FossilCanyon.bin" -glabel ASSET_25_4 -.incbin "./build/us_1.0/levels/names/PirateLagoon.bin" -glabel ASSET_25_5 -.incbin "./build/us_1.0/levels/names/AncientLake.bin" -glabel ASSET_25_6 -.incbin "./build/us_1.0/levels/names/WalrusCove.bin" -glabel ASSET_25_7 -.incbin "./build/us_1.0/levels/names/HotTopVolcano.bin" -glabel ASSET_25_8 -.incbin "./build/us_1.0/levels/names/WhaleBay.bin" -glabel ASSET_25_9 -.incbin "./build/us_1.0/levels/names/SnowballValley.bin" -glabel ASSET_25_10 -.incbin "./build/us_1.0/levels/names/CrescentIsland.bin" -glabel ASSET_25_11 -.incbin "./build/us_1.0/levels/names/FireMountain.bin" -glabel ASSET_25_12 -.incbin "./build/us_1.0/levels/names/DinoDomainHub.bin" -glabel ASSET_25_13 -.incbin "./build/us_1.0/levels/names/EverfrostPeak.bin" -glabel ASSET_25_14 -.incbin "./build/us_1.0/levels/names/SherbetIslandHub.bin" -glabel ASSET_25_15 -.incbin "./build/us_1.0/levels/names/SpaceportAlpha.bin" -glabel ASSET_25_16 -.incbin "./build/us_1.0/levels/names/HorseshoeGulch.bin" -glabel ASSET_25_17 -.incbin "./build/us_1.0/levels/names/SpacedustAlley.bin" -glabel ASSET_25_18 -.incbin "./build/us_1.0/levels/names/GreenwoodVillage.bin" -glabel ASSET_25_19 -.incbin "./build/us_1.0/levels/names/BoulderCanyon.bin" -glabel ASSET_25_20 -.incbin "./build/us_1.0/levels/names/WindmillPlains.bin" -glabel ASSET_25_21 -.incbin "./build/us_1.0/levels/names/FrontEnd.bin" -glabel ASSET_25_22 -.incbin "./build/us_1.0/levels/names/CharacterSelect.bin" -glabel ASSET_25_23 -.incbin "./build/us_1.0/levels/names/TitleScreenSequence.bin" -glabel ASSET_25_24 -.incbin "./build/us_1.0/levels/names/SnowflakeMountainHub.bin" -glabel ASSET_25_25 -.incbin "./build/us_1.0/levels/names/SmokeyCastle.bin" -glabel ASSET_25_26 -.incbin "./build/us_1.0/levels/names/DarkwaterBeach.bin" -glabel ASSET_25_27 -.incbin "./build/us_1.0/levels/names/IciclePyramid.bin" -glabel ASSET_25_28 -.incbin "./build/us_1.0/levels/names/FrostyVillage.bin" -glabel ASSET_25_29 -.incbin "./build/us_1.0/levels/names/JungleFalls.bin" -glabel ASSET_25_30 -.incbin "./build/us_1.0/levels/names/TreasureCaves.bin" -glabel ASSET_25_31 -.incbin "./build/us_1.0/levels/names/HauntedWoods.bin" -glabel ASSET_25_32 -.incbin "./build/us_1.0/levels/names/DarkmoonCaverns.bin" -glabel ASSET_25_33 -.incbin "./build/us_1.0/levels/names/StarCity.bin" -glabel ASSET_25_34 -.incbin "./build/us_1.0/levels/names/TrophyRace.bin" -glabel ASSET_25_35 -.incbin "./build/us_1.0/levels/names/FutureFunLandHub.bin" -glabel ASSET_25_36 -.incbin "./build/us_1.0/levels/names/OpeningSequence.bin" -glabel ASSET_25_37 -.incbin "./build/us_1.0/levels/names/Wizpig1.bin" -glabel ASSET_25_38 -.incbin "./build/us_1.0/levels/names/Trickytops1.bin" -glabel ASSET_25_39 -.incbin "./build/us_1.0/levels/names/OptionsBackground.bin" -glabel ASSET_25_40 -.incbin "./build/us_1.0/levels/names/Bubbler1.bin" -glabel ASSET_25_41 -.incbin "./build/us_1.0/levels/names/Smokey1.bin" -glabel ASSET_25_42 -.incbin "./build/us_1.0/levels/names/WizpigMouthSequence.bin" -glabel ASSET_25_43 -.incbin "./build/us_1.0/levels/names/WizpigAmuletSequence.bin" -glabel ASSET_25_44 -.incbin "./build/us_1.0/levels/names/TTAmuletSequence.bin" -glabel ASSET_25_45 -.incbin "./build/us_1.0/levels/names/RocketSequence.bin" -glabel ASSET_25_46 -.incbin "./build/us_1.0/levels/names/Trickytops2.bin" -glabel ASSET_25_47 -.incbin "./build/us_1.0/levels/names/DinoDomainTrophyAnim.bin" -glabel ASSET_25_48 -.incbin "./build/us_1.0/levels/names/SnowflakeMountainTrophyAnim.bin" -glabel ASSET_25_49 -.incbin "./build/us_1.0/levels/names/SherbetIslandTrophyAnim.bin" -glabel ASSET_25_50 -.incbin "./build/us_1.0/levels/names/DragonForestTrophyAnim.bin" -glabel ASSET_25_51 -.incbin "./build/us_1.0/levels/names/FutureFunLandTrophyAnim.bin" -glabel ASSET_25_52 -.incbin "./build/us_1.0/levels/names/Bluey2.bin" -glabel ASSET_25_53 -.incbin "./build/us_1.0/levels/names/Bubbler2.bin" -glabel ASSET_25_54 -.incbin "./build/us_1.0/levels/names/Smokey2.bin" -glabel ASSET_25_55 -.incbin "./build/us_1.0/levels/names/Wizpig2.bin" -glabel ASSET_25_56 -.incbin "./build/us_1.0/levels/names/PartySequence.bin" -glabel ASSET_25_57 -.incbin "./build/us_1.0/levels/names/TricktopsAnim.bin" -glabel ASSET_25_58 -.incbin "./build/us_1.0/levels/names/SmokeyAnim.bin" -glabel ASSET_25_59 -.incbin "./build/us_1.0/levels/names/BlueyAnim.bin" -glabel ASSET_25_60 -.incbin "./build/us_1.0/levels/names/Wizpig1Anim.bin" -glabel ASSET_25_61 -.incbin "./build/us_1.0/levels/names/BubblerAnim.bin" -glabel ASSET_25_62 -.incbin "./build/us_1.0/levels/names/Wizpig2Anim.bin" -glabel ASSET_25_63 -.incbin "./build/us_1.0/levels/names/LastBit.bin" -glabel ASSET_25_64 -.incbin "./build/us_1.0/levels/names/LastBitB.bin" -glabel ASSET_SECTION_25_END +glabel ASSET_LEVEL_NAMES +glabel ASSET_LEVELNAME_CENTRALAREAHUB +.incbin "./build/us_1.0/levels/names/CentralAreaHubName.bin" +glabel ASSET_LEVELNAME_BLUEY1 +.incbin "./build/us_1.0/levels/names/Bluey1Name.bin" +glabel ASSET_LEVELNAME_DRAGONFORESTHUB +.incbin "./build/us_1.0/levels/names/DragonForestHubName.bin" +glabel ASSET_LEVELNAME_FOSSILCANYON +.incbin "./build/us_1.0/levels/names/FossilCanyonName.bin" +glabel ASSET_LEVELNAME_PIRATELAGOON +.incbin "./build/us_1.0/levels/names/PirateLagoonName.bin" +glabel ASSET_LEVELNAME_ANCIENTLAKE +.incbin "./build/us_1.0/levels/names/AncientLakeName.bin" +glabel ASSET_LEVELNAME_WALRUSCOVE +.incbin "./build/us_1.0/levels/names/WalrusCoveName.bin" +glabel ASSET_LEVELNAME_HOTTOPVOLCANO +.incbin "./build/us_1.0/levels/names/HotTopVolcanoName.bin" +glabel ASSET_LEVELNAME_WHALEBAY +.incbin "./build/us_1.0/levels/names/WhaleBayName.bin" +glabel ASSET_LEVELNAME_SNOWBALLVALLEY +.incbin "./build/us_1.0/levels/names/SnowballValleyName.bin" +glabel ASSET_LEVELNAME_CRESCENTISLAND +.incbin "./build/us_1.0/levels/names/CrescentIslandName.bin" +glabel ASSET_LEVELNAME_FIREMOUNTAIN +.incbin "./build/us_1.0/levels/names/FireMountainName.bin" +glabel ASSET_LEVELNAME_DINODOMAINHUB +.incbin "./build/us_1.0/levels/names/DinoDomainHubName.bin" +glabel ASSET_LEVELNAME_EVERFROSTPEAK +.incbin "./build/us_1.0/levels/names/EverfrostPeakName.bin" +glabel ASSET_LEVELNAME_SHERBETISLANDHUB +.incbin "./build/us_1.0/levels/names/SherbetIslandHubName.bin" +glabel ASSET_LEVELNAME_SPACEPORTALPHA +.incbin "./build/us_1.0/levels/names/SpaceportAlphaName.bin" +glabel ASSET_LEVELNAME_HORSESHOEGULCH +.incbin "./build/us_1.0/levels/names/HorseshoeGulchName.bin" +glabel ASSET_LEVELNAME_SPACEDUSTALLEY +.incbin "./build/us_1.0/levels/names/SpacedustAlleyName.bin" +glabel ASSET_LEVELNAME_GREENWOODVILLAGE +.incbin "./build/us_1.0/levels/names/GreenwoodVillageName.bin" +glabel ASSET_LEVELNAME_BOULDERCANYON +.incbin "./build/us_1.0/levels/names/BoulderCanyonName.bin" +glabel ASSET_LEVELNAME_WINDMILLPLAINS +.incbin "./build/us_1.0/levels/names/WindmillPlainsName.bin" +glabel ASSET_LEVELNAME_FRONTEND +.incbin "./build/us_1.0/levels/names/FrontEndName.bin" +glabel ASSET_LEVELNAME_CHARACTERSELECT +.incbin "./build/us_1.0/levels/names/CharacterSelectName.bin" +glabel ASSET_LEVELNAME_TITLESCREENSEQUENCE +.incbin "./build/us_1.0/levels/names/TitleScreenSequenceName.bin" +glabel ASSET_LEVELNAME_SNOWFLAKEMOUNTAINHUB +.incbin "./build/us_1.0/levels/names/SnowflakeMountainHubName.bin" +glabel ASSET_LEVELNAME_SMOKEYCASTLE +.incbin "./build/us_1.0/levels/names/SmokeyCastleName.bin" +glabel ASSET_LEVELNAME_DARKWATERBEACH +.incbin "./build/us_1.0/levels/names/DarkwaterBeachName.bin" +glabel ASSET_LEVELNAME_ICICLEPYRAMID +.incbin "./build/us_1.0/levels/names/IciclePyramidName.bin" +glabel ASSET_LEVELNAME_FROSTYVILLAGE +.incbin "./build/us_1.0/levels/names/FrostyVillageName.bin" +glabel ASSET_LEVELNAME_JUNGLEFALLS +.incbin "./build/us_1.0/levels/names/JungleFallsName.bin" +glabel ASSET_LEVELNAME_TREASURECAVES +.incbin "./build/us_1.0/levels/names/TreasureCavesName.bin" +glabel ASSET_LEVELNAME_HAUNTEDWOODS +.incbin "./build/us_1.0/levels/names/HauntedWoodsName.bin" +glabel ASSET_LEVELNAME_DARKMOONCAVERNS +.incbin "./build/us_1.0/levels/names/DarkmoonCavernsName.bin" +glabel ASSET_LEVELNAME_STARCITY +.incbin "./build/us_1.0/levels/names/StarCityName.bin" +glabel ASSET_LEVELNAME_TROPHYRACE +.incbin "./build/us_1.0/levels/names/TrophyRaceName.bin" +glabel ASSET_LEVELNAME_FUTUREFUNLANDHUB +.incbin "./build/us_1.0/levels/names/FutureFunLandHubName.bin" +glabel ASSET_LEVELNAME_OPENINGSEQUENCE +.incbin "./build/us_1.0/levels/names/OpeningSequenceName.bin" +glabel ASSET_LEVELNAME_WIZPIG1 +.incbin "./build/us_1.0/levels/names/Wizpig1Name.bin" +glabel ASSET_LEVELNAME_TRICKYTOPS1 +.incbin "./build/us_1.0/levels/names/Trickytops1Name.bin" +glabel ASSET_LEVELNAME_OPTIONSBACKGROUND +.incbin "./build/us_1.0/levels/names/OptionsBackgroundName.bin" +glabel ASSET_LEVELNAME_BUBBLER1 +.incbin "./build/us_1.0/levels/names/Bubbler1Name.bin" +glabel ASSET_LEVELNAME_SMOKEY1 +.incbin "./build/us_1.0/levels/names/Smokey1Name.bin" +glabel ASSET_LEVELNAME_WIZPIGMOUTHSEQUENCE +.incbin "./build/us_1.0/levels/names/WizpigMouthSequenceName.bin" +glabel ASSET_LEVELNAME_WIZPIGAMULETSEQUENCE +.incbin "./build/us_1.0/levels/names/WizpigAmuletSequenceName.bin" +glabel ASSET_LEVELNAME_TTAMULETSEQUENCE +.incbin "./build/us_1.0/levels/names/TTAmuletSequenceName.bin" +glabel ASSET_LEVELNAME_ROCKETSEQUENCE +.incbin "./build/us_1.0/levels/names/RocketSequenceName.bin" +glabel ASSET_LEVELNAME_TRICKYTOPS2 +.incbin "./build/us_1.0/levels/names/Trickytops2Name.bin" +glabel ASSET_LEVELNAME_DINODOMAINTROPHYANIM +.incbin "./build/us_1.0/levels/names/DinoDomainTrophyAnimName.bin" +glabel ASSET_LEVELNAME_SNOWFLAKEMOUNTAINTROPHYANIM +.incbin "./build/us_1.0/levels/names/SnowflakeMountainTrophyAnimName.bin" +glabel ASSET_LEVELNAME_SHERBETISLANDTROPHYANIM +.incbin "./build/us_1.0/levels/names/SherbetIslandTrophyAnimName.bin" +glabel ASSET_LEVELNAME_DRAGONFORESTTROPHYANIM +.incbin "./build/us_1.0/levels/names/DragonForestTrophyAnimName.bin" +glabel ASSET_LEVELNAME_FUTUREFUNLANDTROPHYANIM +.incbin "./build/us_1.0/levels/names/FutureFunLandTrophyAnimName.bin" +glabel ASSET_LEVELNAME_BLUEY2 +.incbin "./build/us_1.0/levels/names/Bluey2Name.bin" +glabel ASSET_LEVELNAME_BUBBLER2 +.incbin "./build/us_1.0/levels/names/Bubbler2Name.bin" +glabel ASSET_LEVELNAME_SMOKEY2 +.incbin "./build/us_1.0/levels/names/Smokey2Name.bin" +glabel ASSET_LEVELNAME_WIZPIG2 +.incbin "./build/us_1.0/levels/names/Wizpig2Name.bin" +glabel ASSET_LEVELNAME_PARTYSEQUENCE +.incbin "./build/us_1.0/levels/names/PartySequenceName.bin" +glabel ASSET_LEVELNAME_TRICKTOPSANIM +.incbin "./build/us_1.0/levels/names/TricktopsAnimName.bin" +glabel ASSET_LEVELNAME_SMOKEYANIM +.incbin "./build/us_1.0/levels/names/SmokeyAnimName.bin" +glabel ASSET_LEVELNAME_BLUEYANIM +.incbin "./build/us_1.0/levels/names/BlueyAnimName.bin" +glabel ASSET_LEVELNAME_WIZPIG1ANIM +.incbin "./build/us_1.0/levels/names/Wizpig1AnimName.bin" +glabel ASSET_LEVELNAME_BUBBLERANIM +.incbin "./build/us_1.0/levels/names/BubblerAnimName.bin" +glabel ASSET_LEVELNAME_WIZPIG2ANIM +.incbin "./build/us_1.0/levels/names/Wizpig2AnimName.bin" +glabel ASSET_LEVELNAME_LASTBIT +.incbin "./build/us_1.0/levels/names/LastBitName.bin" +glabel ASSET_LEVELNAME_LASTBITB +.incbin "./build/us_1.0/levels/names/LastBitBName.bin" +glabel ASSET_LEVEL_NAMES_END + +/********** ASSET_LEVEL_MODELS_TABLE **********/ .balign 16 -glabel ASSET_SECTION_26 -.word ASSET_27_0 - ASSET_SECTION_27 -.word ASSET_27_1 - ASSET_SECTION_27 -.word ASSET_27_2 - ASSET_SECTION_27 -.word ASSET_27_3 - ASSET_SECTION_27 -.word ASSET_27_4 - ASSET_SECTION_27 -.word ASSET_27_5 - ASSET_SECTION_27 -.word ASSET_27_6 - ASSET_SECTION_27 -.word ASSET_27_7 - ASSET_SECTION_27 -.word ASSET_27_8 - ASSET_SECTION_27 -.word ASSET_27_9 - ASSET_SECTION_27 -.word ASSET_27_10 - ASSET_SECTION_27 -.word ASSET_27_11 - ASSET_SECTION_27 -.word ASSET_27_12 - ASSET_SECTION_27 -.word ASSET_27_13 - ASSET_SECTION_27 -.word ASSET_27_14 - ASSET_SECTION_27 -.word ASSET_27_15 - ASSET_SECTION_27 -.word ASSET_27_16 - ASSET_SECTION_27 -.word ASSET_27_17 - ASSET_SECTION_27 -.word ASSET_27_18 - ASSET_SECTION_27 -.word ASSET_27_19 - ASSET_SECTION_27 -.word ASSET_27_20 - ASSET_SECTION_27 -.word ASSET_27_21 - ASSET_SECTION_27 -.word ASSET_27_22 - ASSET_SECTION_27 -.word ASSET_27_23 - ASSET_SECTION_27 -.word ASSET_27_24 - ASSET_SECTION_27 -.word ASSET_27_25 - ASSET_SECTION_27 -.word ASSET_27_26 - ASSET_SECTION_27 -.word ASSET_27_27 - ASSET_SECTION_27 -.word ASSET_27_28 - ASSET_SECTION_27 -.word ASSET_27_29 - ASSET_SECTION_27 -.word ASSET_27_30 - ASSET_SECTION_27 -.word ASSET_27_31 - ASSET_SECTION_27 -.word ASSET_27_32 - ASSET_SECTION_27 -.word ASSET_27_33 - ASSET_SECTION_27 -.word ASSET_27_34 - ASSET_SECTION_27 -.word ASSET_27_35 - ASSET_SECTION_27 -.word ASSET_27_36 - ASSET_SECTION_27 -.word ASSET_27_37 - ASSET_SECTION_27 -.word ASSET_27_38 - ASSET_SECTION_27 -.word ASSET_27_39 - ASSET_SECTION_27 -.word ASSET_27_40 - ASSET_SECTION_27 -.word ASSET_27_41 - ASSET_SECTION_27 -.word ASSET_27_42 - ASSET_SECTION_27 -.word ASSET_27_43 - ASSET_SECTION_27 -.word ASSET_27_44 - ASSET_SECTION_27 -.word ASSET_27_45 - ASSET_SECTION_27 -.word ASSET_27_46 - ASSET_SECTION_27 -.word ASSET_27_47 - ASSET_SECTION_27 -.word ASSET_27_48 - ASSET_SECTION_27 -.word ASSET_27_49 - ASSET_SECTION_27 -.word ASSET_27_50 - ASSET_SECTION_27 -.word ASSET_27_51 - ASSET_SECTION_27 -.word ASSET_27_52 - ASSET_SECTION_27 -.word ASSET_27_53 - ASSET_SECTION_27 -.word ASSET_27_54 - ASSET_SECTION_27 -.word ASSET_SECTION_27_END - ASSET_SECTION_27 +glabel ASSET_LEVEL_MODELS_TABLE +.word ASSET_LEVEL_MODELS_0 - ASSET_LEVEL_MODELS +.word ASSET_LEVEL_MODELS_1 - ASSET_LEVEL_MODELS +.word ASSET_LEVEL_MODELS_2 - ASSET_LEVEL_MODELS +.word ASSET_LEVEL_MODELS_3 - ASSET_LEVEL_MODELS +.word ASSET_LEVEL_MODELS_4 - ASSET_LEVEL_MODELS +.word ASSET_LEVEL_MODELS_5 - ASSET_LEVEL_MODELS +.word ASSET_LEVEL_MODELS_6 - ASSET_LEVEL_MODELS +.word ASSET_LEVEL_MODELS_7 - ASSET_LEVEL_MODELS +.word ASSET_LEVEL_MODELS_8 - ASSET_LEVEL_MODELS +.word ASSET_LEVEL_MODELS_9 - ASSET_LEVEL_MODELS +.word ASSET_LEVEL_MODELS_10 - ASSET_LEVEL_MODELS +.word ASSET_LEVEL_MODELS_11 - ASSET_LEVEL_MODELS +.word ASSET_LEVEL_MODELS_12 - ASSET_LEVEL_MODELS +.word ASSET_LEVEL_MODELS_13 - ASSET_LEVEL_MODELS +.word ASSET_LEVEL_MODELS_14 - ASSET_LEVEL_MODELS +.word ASSET_LEVEL_MODELS_15 - ASSET_LEVEL_MODELS +.word ASSET_LEVEL_MODELS_16 - ASSET_LEVEL_MODELS +.word ASSET_LEVEL_MODELS_17 - ASSET_LEVEL_MODELS +.word ASSET_LEVEL_MODELS_18 - ASSET_LEVEL_MODELS +.word ASSET_LEVEL_MODELS_19 - ASSET_LEVEL_MODELS +.word ASSET_LEVEL_MODELS_20 - ASSET_LEVEL_MODELS +.word ASSET_LEVEL_MODELS_21 - ASSET_LEVEL_MODELS +.word ASSET_LEVEL_MODELS_22 - ASSET_LEVEL_MODELS +.word ASSET_LEVEL_MODELS_23 - ASSET_LEVEL_MODELS +.word ASSET_LEVEL_MODELS_24 - ASSET_LEVEL_MODELS +.word ASSET_LEVEL_MODELS_25 - ASSET_LEVEL_MODELS +.word ASSET_LEVEL_MODELS_26 - ASSET_LEVEL_MODELS +.word ASSET_LEVEL_MODELS_27 - ASSET_LEVEL_MODELS +.word ASSET_LEVEL_MODELS_28 - ASSET_LEVEL_MODELS +.word ASSET_LEVEL_MODELS_29 - ASSET_LEVEL_MODELS +.word ASSET_LEVEL_MODELS_30 - ASSET_LEVEL_MODELS +.word ASSET_LEVEL_MODELS_31 - ASSET_LEVEL_MODELS +.word ASSET_LEVEL_MODELS_32 - ASSET_LEVEL_MODELS +.word ASSET_LEVEL_MODELS_33 - ASSET_LEVEL_MODELS +.word ASSET_LEVEL_MODELS_34 - ASSET_LEVEL_MODELS +.word ASSET_LEVEL_MODELS_35 - ASSET_LEVEL_MODELS +.word ASSET_LEVEL_MODELS_36 - ASSET_LEVEL_MODELS +.word ASSET_LEVEL_MODELS_37 - ASSET_LEVEL_MODELS +.word ASSET_LEVEL_MODELS_38 - ASSET_LEVEL_MODELS +.word ASSET_LEVEL_MODELS_39 - ASSET_LEVEL_MODELS +.word ASSET_LEVEL_MODELS_40 - ASSET_LEVEL_MODELS +.word ASSET_LEVEL_MODELS_41 - ASSET_LEVEL_MODELS +.word ASSET_LEVEL_MODELS_42 - ASSET_LEVEL_MODELS +.word ASSET_LEVEL_MODELS_43 - ASSET_LEVEL_MODELS +.word ASSET_LEVEL_MODELS_44 - ASSET_LEVEL_MODELS +.word ASSET_LEVEL_MODELS_45 - ASSET_LEVEL_MODELS +.word ASSET_LEVEL_MODELS_46 - ASSET_LEVEL_MODELS +.word ASSET_LEVEL_MODELS_47 - ASSET_LEVEL_MODELS +.word ASSET_LEVEL_MODELS_48 - ASSET_LEVEL_MODELS +.word ASSET_LEVEL_MODELS_49 - ASSET_LEVEL_MODELS +.word ASSET_LEVEL_MODELS_50 - ASSET_LEVEL_MODELS +.word ASSET_LEVEL_MODELS_51 - ASSET_LEVEL_MODELS +.word ASSET_LEVEL_MODELS_52 - ASSET_LEVEL_MODELS +.word ASSET_LEVEL_MODELS_53 - ASSET_LEVEL_MODELS +.word ASSET_LEVEL_MODELS_54 - ASSET_LEVEL_MODELS +.word ASSET_LEVEL_MODELS_END - ASSET_LEVEL_MODELS .word 0xFFFFFFFF -glabel ASSET_SECTION_26_END + +/********** ASSET_LEVEL_MODELS **********/ .balign 16 -glabel ASSET_SECTION_27 -glabel ASSET_27_0 +glabel ASSET_LEVEL_MODELS +glabel ASSET_LEVEL_MODELS_0 .incbin "./build/us_1.0/levels/models/unknown_27_0.bin" -glabel ASSET_27_1 +glabel ASSET_LEVEL_MODELS_1 .incbin "./build/us_1.0/levels/models/unknown_27_1.bin" -glabel ASSET_27_2 +glabel ASSET_LEVEL_MODELS_2 .incbin "./build/us_1.0/levels/models/unknown_27_2.bin" -glabel ASSET_27_3 +glabel ASSET_LEVEL_MODELS_3 .incbin "./build/us_1.0/levels/models/unknown_27_3.bin" -glabel ASSET_27_4 +glabel ASSET_LEVEL_MODELS_4 .incbin "./build/us_1.0/levels/models/unknown_27_4.bin" -glabel ASSET_27_5 +glabel ASSET_LEVEL_MODELS_5 .incbin "./build/us_1.0/levels/models/unknown_27_5.bin" -glabel ASSET_27_6 +glabel ASSET_LEVEL_MODELS_6 .incbin "./build/us_1.0/levels/models/unknown_27_6.bin" -glabel ASSET_27_7 +glabel ASSET_LEVEL_MODELS_7 .incbin "./build/us_1.0/levels/models/unknown_27_7.bin" -glabel ASSET_27_8 +glabel ASSET_LEVEL_MODELS_8 .incbin "./build/us_1.0/levels/models/unknown_27_8.bin" -glabel ASSET_27_9 +glabel ASSET_LEVEL_MODELS_9 .incbin "./build/us_1.0/levels/models/unknown_27_9.bin" -glabel ASSET_27_10 +glabel ASSET_LEVEL_MODELS_10 .incbin "./build/us_1.0/levels/models/unknown_27_10.bin" -glabel ASSET_27_11 +glabel ASSET_LEVEL_MODELS_11 .incbin "./build/us_1.0/levels/models/unknown_27_11.bin" -glabel ASSET_27_12 +glabel ASSET_LEVEL_MODELS_12 .incbin "./build/us_1.0/levels/models/unknown_27_12.bin" -glabel ASSET_27_13 +glabel ASSET_LEVEL_MODELS_13 .incbin "./build/us_1.0/levels/models/unknown_27_13.bin" -glabel ASSET_27_14 +glabel ASSET_LEVEL_MODELS_14 .incbin "./build/us_1.0/levels/models/unknown_27_14.bin" -glabel ASSET_27_15 +glabel ASSET_LEVEL_MODELS_15 .incbin "./build/us_1.0/levels/models/unknown_27_15.bin" -glabel ASSET_27_16 +glabel ASSET_LEVEL_MODELS_16 .incbin "./build/us_1.0/levels/models/unknown_27_16.bin" -glabel ASSET_27_17 +glabel ASSET_LEVEL_MODELS_17 .incbin "./build/us_1.0/levels/models/unknown_27_17.bin" -glabel ASSET_27_18 +glabel ASSET_LEVEL_MODELS_18 .incbin "./build/us_1.0/levels/models/unknown_27_18.bin" -glabel ASSET_27_19 +glabel ASSET_LEVEL_MODELS_19 .incbin "./build/us_1.0/levels/models/unknown_27_19.bin" -glabel ASSET_27_20 +glabel ASSET_LEVEL_MODELS_20 .incbin "./build/us_1.0/levels/models/unknown_27_20.bin" -glabel ASSET_27_21 +glabel ASSET_LEVEL_MODELS_21 .incbin "./build/us_1.0/levels/models/unknown_27_21.bin" -glabel ASSET_27_22 +glabel ASSET_LEVEL_MODELS_22 .incbin "./build/us_1.0/levels/models/unknown_27_22.bin" -glabel ASSET_27_23 +glabel ASSET_LEVEL_MODELS_23 .incbin "./build/us_1.0/levels/models/unknown_27_23.bin" -glabel ASSET_27_24 +glabel ASSET_LEVEL_MODELS_24 .incbin "./build/us_1.0/levels/models/unknown_27_24.bin" -glabel ASSET_27_25 +glabel ASSET_LEVEL_MODELS_25 .incbin "./build/us_1.0/levels/models/unknown_27_25.bin" -glabel ASSET_27_26 +glabel ASSET_LEVEL_MODELS_26 .incbin "./build/us_1.0/levels/models/unknown_27_26.bin" -glabel ASSET_27_27 +glabel ASSET_LEVEL_MODELS_27 .incbin "./build/us_1.0/levels/models/unknown_27_27.bin" -glabel ASSET_27_28 +glabel ASSET_LEVEL_MODELS_28 .incbin "./build/us_1.0/levels/models/unknown_27_28.bin" -glabel ASSET_27_29 +glabel ASSET_LEVEL_MODELS_29 .incbin "./build/us_1.0/levels/models/unknown_27_29.bin" -glabel ASSET_27_30 +glabel ASSET_LEVEL_MODELS_30 .incbin "./build/us_1.0/levels/models/unknown_27_30.bin" -glabel ASSET_27_31 +glabel ASSET_LEVEL_MODELS_31 .incbin "./build/us_1.0/levels/models/unknown_27_31.bin" -glabel ASSET_27_32 +glabel ASSET_LEVEL_MODELS_32 .incbin "./build/us_1.0/levels/models/unknown_27_32.bin" -glabel ASSET_27_33 +glabel ASSET_LEVEL_MODELS_33 .incbin "./build/us_1.0/levels/models/unknown_27_33.bin" -glabel ASSET_27_34 +glabel ASSET_LEVEL_MODELS_34 .incbin "./build/us_1.0/levels/models/unknown_27_34.bin" -glabel ASSET_27_35 +glabel ASSET_LEVEL_MODELS_35 .incbin "./build/us_1.0/levels/models/unknown_27_35.bin" -glabel ASSET_27_36 +glabel ASSET_LEVEL_MODELS_36 .incbin "./build/us_1.0/levels/models/unknown_27_36.bin" -glabel ASSET_27_37 +glabel ASSET_LEVEL_MODELS_37 .incbin "./build/us_1.0/levels/models/unknown_27_37.bin" -glabel ASSET_27_38 +glabel ASSET_LEVEL_MODELS_38 .incbin "./build/us_1.0/levels/models/unknown_27_38.bin" -glabel ASSET_27_39 +glabel ASSET_LEVEL_MODELS_39 .incbin "./build/us_1.0/levels/models/unknown_27_39.bin" -glabel ASSET_27_40 +glabel ASSET_LEVEL_MODELS_40 .incbin "./build/us_1.0/levels/models/unknown_27_40.bin" -glabel ASSET_27_41 +glabel ASSET_LEVEL_MODELS_41 .incbin "./build/us_1.0/levels/models/unknown_27_41.bin" -glabel ASSET_27_42 +glabel ASSET_LEVEL_MODELS_42 .incbin "./build/us_1.0/levels/models/unknown_27_42.bin" -glabel ASSET_27_43 +glabel ASSET_LEVEL_MODELS_43 .incbin "./build/us_1.0/levels/models/unknown_27_43.bin" -glabel ASSET_27_44 +glabel ASSET_LEVEL_MODELS_44 .incbin "./build/us_1.0/levels/models/unknown_27_44.bin" -glabel ASSET_27_45 +glabel ASSET_LEVEL_MODELS_45 .incbin "./build/us_1.0/levels/models/unknown_27_45.bin" -glabel ASSET_27_46 +glabel ASSET_LEVEL_MODELS_46 .incbin "./build/us_1.0/levels/models/unknown_27_46.bin" -glabel ASSET_27_47 +glabel ASSET_LEVEL_MODELS_47 .incbin "./build/us_1.0/levels/models/unknown_27_47.bin" -glabel ASSET_27_48 +glabel ASSET_LEVEL_MODELS_48 .incbin "./build/us_1.0/levels/models/unknown_27_48.bin" -glabel ASSET_27_49 +glabel ASSET_LEVEL_MODELS_49 .incbin "./build/us_1.0/levels/models/unknown_27_49.bin" -glabel ASSET_27_50 +glabel ASSET_LEVEL_MODELS_50 .incbin "./build/us_1.0/levels/models/unknown_27_50.bin" -glabel ASSET_27_51 +glabel ASSET_LEVEL_MODELS_51 .incbin "./build/us_1.0/levels/models/unknown_27_51.bin" -glabel ASSET_27_52 +glabel ASSET_LEVEL_MODELS_52 .incbin "./build/us_1.0/levels/models/unknown_27_52.bin" -glabel ASSET_27_53 +glabel ASSET_LEVEL_MODELS_53 .incbin "./build/us_1.0/levels/models/unknown_27_53.bin" -glabel ASSET_27_54 +glabel ASSET_LEVEL_MODELS_54 .incbin "./build/us_1.0/levels/models/unknown_27_54.bin" -glabel ASSET_SECTION_27_END +glabel ASSET_LEVEL_MODELS_END + +/********** ASSET_OBJECT_MODELS_TABLE **********/ .balign 16 -glabel ASSET_SECTION_28 -.word ASSET_29_0 - ASSET_SECTION_29 -.word ASSET_29_1 - ASSET_SECTION_29 -.word ASSET_29_2 - ASSET_SECTION_29 -.word ASSET_29_3 - ASSET_SECTION_29 -.word ASSET_29_4 - ASSET_SECTION_29 -.word ASSET_29_5 - ASSET_SECTION_29 -.word ASSET_29_6 - ASSET_SECTION_29 -.word ASSET_29_7 - ASSET_SECTION_29 -.word ASSET_29_8 - ASSET_SECTION_29 -.word ASSET_29_9 - ASSET_SECTION_29 -.word ASSET_29_10 - ASSET_SECTION_29 -.word ASSET_29_11 - ASSET_SECTION_29 -.word ASSET_29_12 - ASSET_SECTION_29 -.word ASSET_29_13 - ASSET_SECTION_29 -.word ASSET_29_14 - ASSET_SECTION_29 -.word ASSET_29_15 - ASSET_SECTION_29 -.word ASSET_29_16 - ASSET_SECTION_29 -.word ASSET_29_17 - ASSET_SECTION_29 -.word ASSET_29_18 - ASSET_SECTION_29 -.word ASSET_29_19 - ASSET_SECTION_29 -.word ASSET_29_20 - ASSET_SECTION_29 -.word ASSET_29_21 - ASSET_SECTION_29 -.word ASSET_29_22 - ASSET_SECTION_29 -.word ASSET_29_23 - ASSET_SECTION_29 -.word ASSET_29_24 - ASSET_SECTION_29 -.word ASSET_29_25 - ASSET_SECTION_29 -.word ASSET_29_26 - ASSET_SECTION_29 -.word ASSET_29_27 - ASSET_SECTION_29 -.word ASSET_29_28 - ASSET_SECTION_29 -.word ASSET_29_29 - ASSET_SECTION_29 -.word ASSET_29_30 - ASSET_SECTION_29 -.word ASSET_29_31 - ASSET_SECTION_29 -.word ASSET_29_32 - ASSET_SECTION_29 -.word ASSET_29_33 - ASSET_SECTION_29 -.word ASSET_29_34 - ASSET_SECTION_29 -.word ASSET_29_35 - ASSET_SECTION_29 -.word ASSET_29_36 - ASSET_SECTION_29 -.word ASSET_29_37 - ASSET_SECTION_29 -.word ASSET_29_38 - ASSET_SECTION_29 -.word ASSET_29_39 - ASSET_SECTION_29 -.word ASSET_29_40 - ASSET_SECTION_29 -.word ASSET_29_41 - ASSET_SECTION_29 -.word ASSET_29_42 - ASSET_SECTION_29 -.word ASSET_29_43 - ASSET_SECTION_29 -.word ASSET_29_44 - ASSET_SECTION_29 -.word ASSET_29_45 - ASSET_SECTION_29 -.word ASSET_29_46 - ASSET_SECTION_29 -.word ASSET_29_47 - ASSET_SECTION_29 -.word ASSET_29_48 - ASSET_SECTION_29 -.word ASSET_29_49 - ASSET_SECTION_29 -.word ASSET_29_50 - ASSET_SECTION_29 -.word ASSET_29_51 - ASSET_SECTION_29 -.word ASSET_29_52 - ASSET_SECTION_29 -.word ASSET_29_53 - ASSET_SECTION_29 -.word ASSET_29_54 - ASSET_SECTION_29 -.word ASSET_29_55 - ASSET_SECTION_29 -.word ASSET_29_56 - ASSET_SECTION_29 -.word ASSET_29_57 - ASSET_SECTION_29 -.word ASSET_29_58 - ASSET_SECTION_29 -.word ASSET_29_59 - ASSET_SECTION_29 -.word ASSET_29_60 - ASSET_SECTION_29 -.word ASSET_29_61 - ASSET_SECTION_29 -.word ASSET_29_62 - ASSET_SECTION_29 -.word ASSET_29_63 - ASSET_SECTION_29 -.word ASSET_29_64 - ASSET_SECTION_29 -.word ASSET_29_65 - ASSET_SECTION_29 -.word ASSET_29_66 - ASSET_SECTION_29 -.word ASSET_29_67 - ASSET_SECTION_29 -.word ASSET_29_68 - ASSET_SECTION_29 -.word ASSET_29_69 - ASSET_SECTION_29 -.word ASSET_29_70 - ASSET_SECTION_29 -.word ASSET_29_71 - ASSET_SECTION_29 -.word ASSET_29_72 - ASSET_SECTION_29 -.word ASSET_29_73 - ASSET_SECTION_29 -.word ASSET_29_74 - ASSET_SECTION_29 -.word ASSET_29_75 - ASSET_SECTION_29 -.word ASSET_29_76 - ASSET_SECTION_29 -.word ASSET_29_77 - ASSET_SECTION_29 -.word ASSET_29_78 - ASSET_SECTION_29 -.word ASSET_29_79 - ASSET_SECTION_29 -.word ASSET_29_80 - ASSET_SECTION_29 -.word ASSET_29_81 - ASSET_SECTION_29 -.word ASSET_29_82 - ASSET_SECTION_29 -.word ASSET_29_83 - ASSET_SECTION_29 -.word ASSET_29_84 - ASSET_SECTION_29 -.word ASSET_29_85 - ASSET_SECTION_29 -.word ASSET_29_86 - ASSET_SECTION_29 -.word ASSET_29_87 - ASSET_SECTION_29 -.word ASSET_29_88 - ASSET_SECTION_29 -.word ASSET_29_89 - ASSET_SECTION_29 -.word ASSET_29_90 - ASSET_SECTION_29 -.word ASSET_29_91 - ASSET_SECTION_29 -.word ASSET_29_92 - ASSET_SECTION_29 -.word ASSET_29_93 - ASSET_SECTION_29 -.word ASSET_29_94 - ASSET_SECTION_29 -.word ASSET_29_95 - ASSET_SECTION_29 -.word ASSET_29_96 - ASSET_SECTION_29 -.word ASSET_29_97 - ASSET_SECTION_29 -.word ASSET_29_98 - ASSET_SECTION_29 -.word ASSET_29_99 - ASSET_SECTION_29 -.word ASSET_29_100 - ASSET_SECTION_29 -.word ASSET_29_101 - ASSET_SECTION_29 -.word ASSET_29_102 - ASSET_SECTION_29 -.word ASSET_29_103 - ASSET_SECTION_29 -.word ASSET_29_104 - ASSET_SECTION_29 -.word ASSET_29_105 - ASSET_SECTION_29 -.word ASSET_29_106 - ASSET_SECTION_29 -.word ASSET_29_107 - ASSET_SECTION_29 -.word ASSET_29_108 - ASSET_SECTION_29 -.word ASSET_29_109 - ASSET_SECTION_29 -.word ASSET_29_110 - ASSET_SECTION_29 -.word ASSET_29_111 - ASSET_SECTION_29 -.word ASSET_29_112 - ASSET_SECTION_29 -.word ASSET_29_113 - ASSET_SECTION_29 -.word ASSET_29_114 - ASSET_SECTION_29 -.word ASSET_29_115 - ASSET_SECTION_29 -.word ASSET_29_116 - ASSET_SECTION_29 -.word ASSET_29_117 - ASSET_SECTION_29 -.word ASSET_29_118 - ASSET_SECTION_29 -.word ASSET_29_119 - ASSET_SECTION_29 -.word ASSET_29_120 - ASSET_SECTION_29 -.word ASSET_29_121 - ASSET_SECTION_29 -.word ASSET_29_122 - ASSET_SECTION_29 -.word ASSET_29_123 - ASSET_SECTION_29 -.word ASSET_29_124 - ASSET_SECTION_29 -.word ASSET_29_125 - ASSET_SECTION_29 -.word ASSET_29_126 - ASSET_SECTION_29 -.word ASSET_29_127 - ASSET_SECTION_29 -.word ASSET_29_128 - ASSET_SECTION_29 -.word ASSET_29_129 - ASSET_SECTION_29 -.word ASSET_29_130 - ASSET_SECTION_29 -.word ASSET_29_131 - ASSET_SECTION_29 -.word ASSET_29_132 - ASSET_SECTION_29 -.word ASSET_29_133 - ASSET_SECTION_29 -.word ASSET_29_134 - ASSET_SECTION_29 -.word ASSET_29_135 - ASSET_SECTION_29 -.word ASSET_29_136 - ASSET_SECTION_29 -.word ASSET_29_137 - ASSET_SECTION_29 -.word ASSET_29_138 - ASSET_SECTION_29 -.word ASSET_29_139 - ASSET_SECTION_29 -.word ASSET_29_140 - ASSET_SECTION_29 -.word ASSET_29_141 - ASSET_SECTION_29 -.word ASSET_29_142 - ASSET_SECTION_29 -.word ASSET_29_143 - ASSET_SECTION_29 -.word ASSET_29_144 - ASSET_SECTION_29 -.word ASSET_29_145 - ASSET_SECTION_29 -.word ASSET_29_146 - ASSET_SECTION_29 -.word ASSET_29_147 - ASSET_SECTION_29 -.word ASSET_29_148 - ASSET_SECTION_29 -.word ASSET_29_149 - ASSET_SECTION_29 -.word ASSET_29_150 - ASSET_SECTION_29 -.word ASSET_29_151 - ASSET_SECTION_29 -.word ASSET_29_152 - ASSET_SECTION_29 -.word ASSET_29_153 - ASSET_SECTION_29 -.word ASSET_29_154 - ASSET_SECTION_29 -.word ASSET_29_155 - ASSET_SECTION_29 -.word ASSET_29_156 - ASSET_SECTION_29 -.word ASSET_29_157 - ASSET_SECTION_29 -.word ASSET_29_158 - ASSET_SECTION_29 -.word ASSET_29_159 - ASSET_SECTION_29 -.word ASSET_29_160 - ASSET_SECTION_29 -.word ASSET_29_161 - ASSET_SECTION_29 -.word ASSET_29_162 - ASSET_SECTION_29 -.word ASSET_29_163 - ASSET_SECTION_29 -.word ASSET_29_164 - ASSET_SECTION_29 -.word ASSET_29_165 - ASSET_SECTION_29 -.word ASSET_29_166 - ASSET_SECTION_29 -.word ASSET_29_167 - ASSET_SECTION_29 -.word ASSET_29_168 - ASSET_SECTION_29 -.word ASSET_29_169 - ASSET_SECTION_29 -.word ASSET_29_170 - ASSET_SECTION_29 -.word ASSET_29_171 - ASSET_SECTION_29 -.word ASSET_29_172 - ASSET_SECTION_29 -.word ASSET_29_173 - ASSET_SECTION_29 -.word ASSET_29_174 - ASSET_SECTION_29 -.word ASSET_29_175 - ASSET_SECTION_29 -.word ASSET_29_176 - ASSET_SECTION_29 -.word ASSET_29_177 - ASSET_SECTION_29 -.word ASSET_29_178 - ASSET_SECTION_29 -.word ASSET_29_179 - ASSET_SECTION_29 -.word ASSET_29_180 - ASSET_SECTION_29 -.word ASSET_29_181 - ASSET_SECTION_29 -.word ASSET_29_182 - ASSET_SECTION_29 -.word ASSET_29_183 - ASSET_SECTION_29 -.word ASSET_29_184 - ASSET_SECTION_29 -.word ASSET_29_185 - ASSET_SECTION_29 -.word ASSET_29_186 - ASSET_SECTION_29 -.word ASSET_29_187 - ASSET_SECTION_29 -.word ASSET_29_188 - ASSET_SECTION_29 -.word ASSET_29_189 - ASSET_SECTION_29 -.word ASSET_29_190 - ASSET_SECTION_29 -.word ASSET_29_191 - ASSET_SECTION_29 -.word ASSET_29_192 - ASSET_SECTION_29 -.word ASSET_29_193 - ASSET_SECTION_29 -.word ASSET_29_194 - ASSET_SECTION_29 -.word ASSET_29_195 - ASSET_SECTION_29 -.word ASSET_29_196 - ASSET_SECTION_29 -.word ASSET_29_197 - ASSET_SECTION_29 -.word ASSET_29_198 - ASSET_SECTION_29 -.word ASSET_29_199 - ASSET_SECTION_29 -.word ASSET_29_200 - ASSET_SECTION_29 -.word ASSET_29_201 - ASSET_SECTION_29 -.word ASSET_29_202 - ASSET_SECTION_29 -.word ASSET_29_203 - ASSET_SECTION_29 -.word ASSET_29_204 - ASSET_SECTION_29 -.word ASSET_29_205 - ASSET_SECTION_29 -.word ASSET_29_206 - ASSET_SECTION_29 -.word ASSET_29_207 - ASSET_SECTION_29 -.word ASSET_29_208 - ASSET_SECTION_29 -.word ASSET_29_209 - ASSET_SECTION_29 -.word ASSET_29_210 - ASSET_SECTION_29 -.word ASSET_29_211 - ASSET_SECTION_29 -.word ASSET_29_212 - ASSET_SECTION_29 -.word ASSET_29_213 - ASSET_SECTION_29 -.word ASSET_29_214 - ASSET_SECTION_29 -.word ASSET_29_215 - ASSET_SECTION_29 -.word ASSET_29_216 - ASSET_SECTION_29 -.word ASSET_29_217 - ASSET_SECTION_29 -.word ASSET_29_218 - ASSET_SECTION_29 -.word ASSET_29_219 - ASSET_SECTION_29 -.word ASSET_29_220 - ASSET_SECTION_29 -.word ASSET_29_221 - ASSET_SECTION_29 -.word ASSET_29_222 - ASSET_SECTION_29 -.word ASSET_29_223 - ASSET_SECTION_29 -.word ASSET_29_224 - ASSET_SECTION_29 -.word ASSET_29_225 - ASSET_SECTION_29 -.word ASSET_29_226 - ASSET_SECTION_29 -.word ASSET_29_227 - ASSET_SECTION_29 -.word ASSET_29_228 - ASSET_SECTION_29 -.word ASSET_29_229 - ASSET_SECTION_29 -.word ASSET_29_230 - ASSET_SECTION_29 -.word ASSET_29_231 - ASSET_SECTION_29 -.word ASSET_29_232 - ASSET_SECTION_29 -.word ASSET_29_233 - ASSET_SECTION_29 -.word ASSET_29_234 - ASSET_SECTION_29 -.word ASSET_29_235 - ASSET_SECTION_29 -.word ASSET_29_236 - ASSET_SECTION_29 -.word ASSET_29_237 - ASSET_SECTION_29 -.word ASSET_29_238 - ASSET_SECTION_29 -.word ASSET_29_239 - ASSET_SECTION_29 -.word ASSET_29_240 - ASSET_SECTION_29 -.word ASSET_29_241 - ASSET_SECTION_29 -.word ASSET_29_242 - ASSET_SECTION_29 -.word ASSET_29_243 - ASSET_SECTION_29 -.word ASSET_29_244 - ASSET_SECTION_29 -.word ASSET_29_245 - ASSET_SECTION_29 -.word ASSET_29_246 - ASSET_SECTION_29 -.word ASSET_29_247 - ASSET_SECTION_29 -.word ASSET_29_248 - ASSET_SECTION_29 -.word ASSET_29_249 - ASSET_SECTION_29 -.word ASSET_29_250 - ASSET_SECTION_29 -.word ASSET_29_251 - ASSET_SECTION_29 -.word ASSET_29_252 - ASSET_SECTION_29 -.word ASSET_29_253 - ASSET_SECTION_29 -.word ASSET_29_254 - ASSET_SECTION_29 -.word ASSET_29_255 - ASSET_SECTION_29 -.word ASSET_29_256 - ASSET_SECTION_29 -.word ASSET_29_257 - ASSET_SECTION_29 -.word ASSET_29_258 - ASSET_SECTION_29 -.word ASSET_29_259 - ASSET_SECTION_29 -.word ASSET_29_260 - ASSET_SECTION_29 -.word ASSET_29_261 - ASSET_SECTION_29 -.word ASSET_29_262 - ASSET_SECTION_29 -.word ASSET_29_263 - ASSET_SECTION_29 -.word ASSET_29_264 - ASSET_SECTION_29 -.word ASSET_29_265 - ASSET_SECTION_29 -.word ASSET_29_266 - ASSET_SECTION_29 -.word ASSET_29_267 - ASSET_SECTION_29 -.word ASSET_29_268 - ASSET_SECTION_29 -.word ASSET_29_269 - ASSET_SECTION_29 -.word ASSET_29_270 - ASSET_SECTION_29 -.word ASSET_29_271 - ASSET_SECTION_29 -.word ASSET_29_272 - ASSET_SECTION_29 -.word ASSET_29_273 - ASSET_SECTION_29 -.word ASSET_29_274 - ASSET_SECTION_29 -.word ASSET_29_275 - ASSET_SECTION_29 -.word ASSET_29_276 - ASSET_SECTION_29 -.word ASSET_29_277 - ASSET_SECTION_29 -.word ASSET_29_278 - ASSET_SECTION_29 -.word ASSET_29_279 - ASSET_SECTION_29 -.word ASSET_29_280 - ASSET_SECTION_29 -.word ASSET_29_281 - ASSET_SECTION_29 -.word ASSET_29_282 - ASSET_SECTION_29 -.word ASSET_29_283 - ASSET_SECTION_29 -.word ASSET_29_284 - ASSET_SECTION_29 -.word ASSET_29_285 - ASSET_SECTION_29 -.word ASSET_29_286 - ASSET_SECTION_29 -.word ASSET_29_287 - ASSET_SECTION_29 -.word ASSET_29_288 - ASSET_SECTION_29 -.word ASSET_29_289 - ASSET_SECTION_29 -.word ASSET_29_290 - ASSET_SECTION_29 -.word ASSET_29_291 - ASSET_SECTION_29 -.word ASSET_29_292 - ASSET_SECTION_29 -.word ASSET_29_293 - ASSET_SECTION_29 -.word ASSET_29_294 - ASSET_SECTION_29 -.word ASSET_29_295 - ASSET_SECTION_29 -.word ASSET_29_296 - ASSET_SECTION_29 -.word ASSET_29_297 - ASSET_SECTION_29 -.word ASSET_29_298 - ASSET_SECTION_29 -.word ASSET_29_299 - ASSET_SECTION_29 -.word ASSET_29_300 - ASSET_SECTION_29 -.word ASSET_29_301 - ASSET_SECTION_29 -.word ASSET_29_302 - ASSET_SECTION_29 -.word ASSET_29_303 - ASSET_SECTION_29 -.word ASSET_29_304 - ASSET_SECTION_29 -.word ASSET_29_305 - ASSET_SECTION_29 -.word ASSET_29_306 - ASSET_SECTION_29 -.word ASSET_29_307 - ASSET_SECTION_29 -.word ASSET_29_308 - ASSET_SECTION_29 -.word ASSET_29_309 - ASSET_SECTION_29 -.word ASSET_29_310 - ASSET_SECTION_29 -.word ASSET_29_311 - ASSET_SECTION_29 -.word ASSET_29_312 - ASSET_SECTION_29 -.word ASSET_29_313 - ASSET_SECTION_29 -.word ASSET_29_314 - ASSET_SECTION_29 -.word ASSET_29_315 - ASSET_SECTION_29 -.word ASSET_29_316 - ASSET_SECTION_29 -.word ASSET_29_317 - ASSET_SECTION_29 -.word ASSET_29_318 - ASSET_SECTION_29 -.word ASSET_29_319 - ASSET_SECTION_29 -.word ASSET_29_320 - ASSET_SECTION_29 -.word ASSET_29_321 - ASSET_SECTION_29 -.word ASSET_29_322 - ASSET_SECTION_29 -.word ASSET_29_323 - ASSET_SECTION_29 -.word ASSET_29_324 - ASSET_SECTION_29 -.word ASSET_29_325 - ASSET_SECTION_29 -.word ASSET_29_326 - ASSET_SECTION_29 -.word ASSET_29_327 - ASSET_SECTION_29 -.word ASSET_29_328 - ASSET_SECTION_29 -.word ASSET_29_329 - ASSET_SECTION_29 -.word ASSET_29_330 - ASSET_SECTION_29 -.word ASSET_29_331 - ASSET_SECTION_29 -.word ASSET_29_332 - ASSET_SECTION_29 -.word ASSET_29_333 - ASSET_SECTION_29 -.word ASSET_29_334 - ASSET_SECTION_29 -.word ASSET_29_335 - ASSET_SECTION_29 -.word ASSET_29_336 - ASSET_SECTION_29 -.word ASSET_29_337 - ASSET_SECTION_29 -.word ASSET_29_338 - ASSET_SECTION_29 -.word ASSET_29_339 - ASSET_SECTION_29 -.word ASSET_29_340 - ASSET_SECTION_29 -.word ASSET_29_341 - ASSET_SECTION_29 -.word ASSET_29_342 - ASSET_SECTION_29 -.word ASSET_29_343 - ASSET_SECTION_29 -.word ASSET_29_344 - ASSET_SECTION_29 -.word ASSET_29_345 - ASSET_SECTION_29 -.word ASSET_29_346 - ASSET_SECTION_29 -.word ASSET_29_347 - ASSET_SECTION_29 -.word ASSET_29_348 - ASSET_SECTION_29 -.word ASSET_29_349 - ASSET_SECTION_29 -.word ASSET_29_350 - ASSET_SECTION_29 -.word ASSET_29_351 - ASSET_SECTION_29 -.word ASSET_29_352 - ASSET_SECTION_29 -.word ASSET_29_353 - ASSET_SECTION_29 -.word ASSET_29_354 - ASSET_SECTION_29 -.word ASSET_29_355 - ASSET_SECTION_29 -.word ASSET_29_356 - ASSET_SECTION_29 -.word ASSET_29_357 - ASSET_SECTION_29 -.word ASSET_29_358 - ASSET_SECTION_29 -.word ASSET_29_359 - ASSET_SECTION_29 -.word ASSET_29_360 - ASSET_SECTION_29 -.word ASSET_29_361 - ASSET_SECTION_29 -.word ASSET_29_362 - ASSET_SECTION_29 -.word ASSET_29_363 - ASSET_SECTION_29 -.word ASSET_29_364 - ASSET_SECTION_29 -.word ASSET_29_365 - ASSET_SECTION_29 -.word ASSET_29_366 - ASSET_SECTION_29 -.word ASSET_29_367 - ASSET_SECTION_29 -.word ASSET_29_368 - ASSET_SECTION_29 -.word ASSET_29_369 - ASSET_SECTION_29 -.word ASSET_29_370 - ASSET_SECTION_29 -.word ASSET_29_371 - ASSET_SECTION_29 -.word ASSET_29_372 - ASSET_SECTION_29 -.word ASSET_29_373 - ASSET_SECTION_29 -.word ASSET_29_374 - ASSET_SECTION_29 -.word ASSET_29_375 - ASSET_SECTION_29 -.word ASSET_29_376 - ASSET_SECTION_29 -.word ASSET_29_377 - ASSET_SECTION_29 -.word ASSET_29_378 - ASSET_SECTION_29 -.word ASSET_29_379 - ASSET_SECTION_29 -.word ASSET_29_380 - ASSET_SECTION_29 -.word ASSET_29_381 - ASSET_SECTION_29 -.word ASSET_29_382 - ASSET_SECTION_29 -.word ASSET_29_383 - ASSET_SECTION_29 -.word ASSET_29_384 - ASSET_SECTION_29 -.word ASSET_29_385 - ASSET_SECTION_29 -.word ASSET_29_386 - ASSET_SECTION_29 -.word ASSET_29_387 - ASSET_SECTION_29 -.word ASSET_29_388 - ASSET_SECTION_29 -.word ASSET_29_389 - ASSET_SECTION_29 -.word ASSET_SECTION_29_END - ASSET_SECTION_29 +glabel ASSET_OBJECT_MODELS_TABLE +.word ASSET_OBJECT_MODELS_0 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_1 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_2 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_3 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_4 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_5 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_6 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_7 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_8 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_9 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_10 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_11 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_12 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_13 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_14 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_15 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_16 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_17 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_18 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_19 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_20 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_21 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_22 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_23 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_24 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_25 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_26 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_27 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_28 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_29 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_30 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_31 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_32 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_33 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_34 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_35 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_36 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_37 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_38 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_39 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_40 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_41 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_42 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_43 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_44 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_45 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_46 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_47 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_48 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_49 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_50 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_51 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_52 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_53 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_54 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_55 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_56 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_57 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_58 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_59 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_60 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_61 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_62 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_63 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_64 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_65 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_66 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_67 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_68 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_69 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_70 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_71 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_72 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_73 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_74 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_75 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_76 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_77 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_78 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_79 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_80 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_81 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_82 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_83 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_84 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_85 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_86 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_87 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_88 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_89 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_90 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_91 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_92 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_93 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_94 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_95 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_96 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_97 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_98 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_99 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_100 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_101 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_102 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_103 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_104 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_105 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_106 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_107 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_108 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_109 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_110 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_111 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_112 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_113 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_114 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_115 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_116 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_117 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_118 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_119 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_120 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_121 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_122 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_123 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_124 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_125 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_126 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_127 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_128 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_129 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_130 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_131 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_132 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_133 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_134 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_135 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_136 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_137 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_138 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_139 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_140 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_141 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_142 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_143 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_144 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_145 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_146 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_147 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_148 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_149 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_150 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_151 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_152 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_153 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_154 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_155 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_156 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_157 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_158 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_159 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_160 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_161 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_162 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_163 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_164 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_165 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_166 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_167 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_168 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_169 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_170 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_171 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_172 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_173 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_174 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_175 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_176 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_177 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_178 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_179 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_180 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_181 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_182 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_183 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_184 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_185 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_186 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_187 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_188 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_189 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_190 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_191 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_192 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_193 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_194 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_195 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_196 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_197 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_198 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_199 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_200 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_201 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_202 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_203 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_204 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_205 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_206 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_207 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_208 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_209 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_210 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_211 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_212 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_213 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_214 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_215 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_216 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_217 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_218 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_219 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_220 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_221 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_222 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_223 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_224 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_225 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_226 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_227 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_228 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_229 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_230 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_231 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_232 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_233 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_234 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_235 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_236 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_237 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_238 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_239 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_240 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_241 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_242 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_243 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_244 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_245 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_246 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_247 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_248 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_249 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_250 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_251 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_252 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_253 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_254 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_255 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_256 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_257 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_258 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_259 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_260 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_261 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_262 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_263 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_264 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_265 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_266 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_267 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_268 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_269 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_270 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_271 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_272 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_273 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_274 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_275 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_276 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_277 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_278 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_279 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_280 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_281 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_282 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_283 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_284 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_285 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_286 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_287 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_288 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_289 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_290 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_291 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_292 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_293 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_294 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_295 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_296 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_297 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_298 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_299 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_300 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_301 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_302 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_303 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_304 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_305 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_306 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_307 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_308 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_309 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_310 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_311 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_312 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_313 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_314 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_315 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_316 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_317 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_318 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_319 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_320 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_321 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_322 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_323 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_324 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_325 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_326 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_327 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_328 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_329 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_330 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_331 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_332 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_333 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_334 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_335 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_336 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_337 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_338 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_339 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_340 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_341 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_342 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_343 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_344 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_345 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_346 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_347 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_348 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_349 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_350 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_351 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_352 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_353 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_354 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_355 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_356 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_357 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_358 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_359 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_360 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_361 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_362 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_363 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_364 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_365 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_366 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_367 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_368 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_369 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_370 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_371 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_372 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_373 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_374 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_375 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_376 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_377 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_378 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_379 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_380 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_381 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_382 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_383 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_384 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_385 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_386 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_387 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_388 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_389 - ASSET_OBJECT_MODELS +.word ASSET_OBJECT_MODELS_END - ASSET_OBJECT_MODELS .word 0xFFFFFFFF -glabel ASSET_SECTION_28_END + +/********** ASSET_OBJECT_MODELS **********/ .balign 16 -glabel ASSET_SECTION_29 -glabel ASSET_29_0 +glabel ASSET_OBJECT_MODELS +glabel ASSET_OBJECT_MODELS_0 .incbin "./build/us_1.0/objects/models/unknown_29_0.bin" -glabel ASSET_29_1 +glabel ASSET_OBJECT_MODELS_1 .incbin "./build/us_1.0/objects/models/unknown_29_1.bin" -glabel ASSET_29_2 +glabel ASSET_OBJECT_MODELS_2 .incbin "./build/us_1.0/objects/models/unknown_29_2.bin" -glabel ASSET_29_3 +glabel ASSET_OBJECT_MODELS_3 .incbin "./build/us_1.0/objects/models/unknown_29_3.bin" -glabel ASSET_29_4 +glabel ASSET_OBJECT_MODELS_4 .incbin "./build/us_1.0/objects/models/unknown_29_4.bin" -glabel ASSET_29_5 +glabel ASSET_OBJECT_MODELS_5 .incbin "./build/us_1.0/objects/models/unknown_29_5.bin" -glabel ASSET_29_6 +glabel ASSET_OBJECT_MODELS_6 .incbin "./build/us_1.0/objects/models/unknown_29_6.bin" -glabel ASSET_29_7 +glabel ASSET_OBJECT_MODELS_7 .incbin "./build/us_1.0/objects/models/unknown_29_7.bin" -glabel ASSET_29_8 +glabel ASSET_OBJECT_MODELS_8 .incbin "./build/us_1.0/objects/models/unknown_29_8.bin" -glabel ASSET_29_9 +glabel ASSET_OBJECT_MODELS_9 .incbin "./build/us_1.0/objects/models/unknown_29_9.bin" -glabel ASSET_29_10 +glabel ASSET_OBJECT_MODELS_10 .incbin "./build/us_1.0/objects/models/unknown_29_10.bin" -glabel ASSET_29_11 +glabel ASSET_OBJECT_MODELS_11 .incbin "./build/us_1.0/objects/models/unknown_29_11.bin" -glabel ASSET_29_12 +glabel ASSET_OBJECT_MODELS_12 .incbin "./build/us_1.0/objects/models/unknown_29_12.bin" -glabel ASSET_29_13 +glabel ASSET_OBJECT_MODELS_13 .incbin "./build/us_1.0/objects/models/unknown_29_13.bin" -glabel ASSET_29_14 +glabel ASSET_OBJECT_MODELS_14 .incbin "./build/us_1.0/objects/models/unknown_29_14.bin" -glabel ASSET_29_15 +glabel ASSET_OBJECT_MODELS_15 .incbin "./build/us_1.0/objects/models/unknown_29_15.bin" -glabel ASSET_29_16 +glabel ASSET_OBJECT_MODELS_16 .incbin "./build/us_1.0/objects/models/unknown_29_16.bin" -glabel ASSET_29_17 +glabel ASSET_OBJECT_MODELS_17 .incbin "./build/us_1.0/objects/models/unknown_29_17.bin" -glabel ASSET_29_18 +glabel ASSET_OBJECT_MODELS_18 .incbin "./build/us_1.0/objects/models/unknown_29_18.bin" -glabel ASSET_29_19 +glabel ASSET_OBJECT_MODELS_19 .incbin "./build/us_1.0/objects/models/unknown_29_19.bin" -glabel ASSET_29_20 +glabel ASSET_OBJECT_MODELS_20 .incbin "./build/us_1.0/objects/models/unknown_29_20.bin" -glabel ASSET_29_21 +glabel ASSET_OBJECT_MODELS_21 .incbin "./build/us_1.0/objects/models/unknown_29_21.bin" -glabel ASSET_29_22 +glabel ASSET_OBJECT_MODELS_22 .incbin "./build/us_1.0/objects/models/unknown_29_22.bin" -glabel ASSET_29_23 +glabel ASSET_OBJECT_MODELS_23 .incbin "./build/us_1.0/objects/models/unknown_29_23.bin" -glabel ASSET_29_24 +glabel ASSET_OBJECT_MODELS_24 .incbin "./build/us_1.0/objects/models/unknown_29_24.bin" -glabel ASSET_29_25 +glabel ASSET_OBJECT_MODELS_25 .incbin "./build/us_1.0/objects/models/unknown_29_25.bin" -glabel ASSET_29_26 +glabel ASSET_OBJECT_MODELS_26 .incbin "./build/us_1.0/objects/models/unknown_29_26.bin" -glabel ASSET_29_27 +glabel ASSET_OBJECT_MODELS_27 .incbin "./build/us_1.0/objects/models/unknown_29_27.bin" -glabel ASSET_29_28 +glabel ASSET_OBJECT_MODELS_28 .incbin "./build/us_1.0/objects/models/unknown_29_28.bin" -glabel ASSET_29_29 +glabel ASSET_OBJECT_MODELS_29 .incbin "./build/us_1.0/objects/models/unknown_29_29.bin" -glabel ASSET_29_30 +glabel ASSET_OBJECT_MODELS_30 .incbin "./build/us_1.0/objects/models/unknown_29_30.bin" -glabel ASSET_29_31 +glabel ASSET_OBJECT_MODELS_31 .incbin "./build/us_1.0/objects/models/unknown_29_31.bin" -glabel ASSET_29_32 +glabel ASSET_OBJECT_MODELS_32 .incbin "./build/us_1.0/objects/models/unknown_29_32.bin" -glabel ASSET_29_33 +glabel ASSET_OBJECT_MODELS_33 .incbin "./build/us_1.0/objects/models/unknown_29_33.bin" -glabel ASSET_29_34 +glabel ASSET_OBJECT_MODELS_34 .incbin "./build/us_1.0/objects/models/unknown_29_34.bin" -glabel ASSET_29_35 +glabel ASSET_OBJECT_MODELS_35 .incbin "./build/us_1.0/objects/models/unknown_29_35.bin" -glabel ASSET_29_36 +glabel ASSET_OBJECT_MODELS_36 .incbin "./build/us_1.0/objects/models/unknown_29_36.bin" -glabel ASSET_29_37 +glabel ASSET_OBJECT_MODELS_37 .incbin "./build/us_1.0/objects/models/unknown_29_37.bin" -glabel ASSET_29_38 +glabel ASSET_OBJECT_MODELS_38 .incbin "./build/us_1.0/objects/models/unknown_29_38.bin" -glabel ASSET_29_39 +glabel ASSET_OBJECT_MODELS_39 .incbin "./build/us_1.0/objects/models/unknown_29_39.bin" -glabel ASSET_29_40 +glabel ASSET_OBJECT_MODELS_40 .incbin "./build/us_1.0/objects/models/unknown_29_40.bin" -glabel ASSET_29_41 +glabel ASSET_OBJECT_MODELS_41 .incbin "./build/us_1.0/objects/models/unknown_29_41.bin" -glabel ASSET_29_42 +glabel ASSET_OBJECT_MODELS_42 .incbin "./build/us_1.0/objects/models/unknown_29_42.bin" -glabel ASSET_29_43 +glabel ASSET_OBJECT_MODELS_43 .incbin "./build/us_1.0/objects/models/unknown_29_43.bin" -glabel ASSET_29_44 +glabel ASSET_OBJECT_MODELS_44 .incbin "./build/us_1.0/objects/models/unknown_29_44.bin" -glabel ASSET_29_45 +glabel ASSET_OBJECT_MODELS_45 .incbin "./build/us_1.0/objects/models/unknown_29_45.bin" -glabel ASSET_29_46 +glabel ASSET_OBJECT_MODELS_46 .incbin "./build/us_1.0/objects/models/unknown_29_46.bin" -glabel ASSET_29_47 +glabel ASSET_OBJECT_MODELS_47 .incbin "./build/us_1.0/objects/models/unknown_29_47.bin" -glabel ASSET_29_48 +glabel ASSET_OBJECT_MODELS_48 .incbin "./build/us_1.0/objects/models/unknown_29_48.bin" -glabel ASSET_29_49 +glabel ASSET_OBJECT_MODELS_49 .incbin "./build/us_1.0/objects/models/unknown_29_49.bin" -glabel ASSET_29_50 +glabel ASSET_OBJECT_MODELS_50 .incbin "./build/us_1.0/objects/models/unknown_29_50.bin" -glabel ASSET_29_51 +glabel ASSET_OBJECT_MODELS_51 .incbin "./build/us_1.0/objects/models/unknown_29_51.bin" -glabel ASSET_29_52 +glabel ASSET_OBJECT_MODELS_52 .incbin "./build/us_1.0/objects/models/unknown_29_52.bin" -glabel ASSET_29_53 +glabel ASSET_OBJECT_MODELS_53 .incbin "./build/us_1.0/objects/models/unknown_29_53.bin" -glabel ASSET_29_54 +glabel ASSET_OBJECT_MODELS_54 .incbin "./build/us_1.0/objects/models/unknown_29_54.bin" -glabel ASSET_29_55 +glabel ASSET_OBJECT_MODELS_55 .incbin "./build/us_1.0/objects/models/unknown_29_55.bin" -glabel ASSET_29_56 +glabel ASSET_OBJECT_MODELS_56 .incbin "./build/us_1.0/objects/models/unknown_29_56.bin" -glabel ASSET_29_57 +glabel ASSET_OBJECT_MODELS_57 .incbin "./build/us_1.0/objects/models/unknown_29_57.bin" -glabel ASSET_29_58 +glabel ASSET_OBJECT_MODELS_58 .incbin "./build/us_1.0/objects/models/unknown_29_58.bin" -glabel ASSET_29_59 +glabel ASSET_OBJECT_MODELS_59 .incbin "./build/us_1.0/objects/models/unknown_29_59.bin" -glabel ASSET_29_60 +glabel ASSET_OBJECT_MODELS_60 .incbin "./build/us_1.0/objects/models/unknown_29_60.bin" -glabel ASSET_29_61 +glabel ASSET_OBJECT_MODELS_61 .incbin "./build/us_1.0/objects/models/unknown_29_61.bin" -glabel ASSET_29_62 +glabel ASSET_OBJECT_MODELS_62 .incbin "./build/us_1.0/objects/models/unknown_29_62.bin" -glabel ASSET_29_63 +glabel ASSET_OBJECT_MODELS_63 .incbin "./build/us_1.0/objects/models/unknown_29_63.bin" -glabel ASSET_29_64 +glabel ASSET_OBJECT_MODELS_64 .incbin "./build/us_1.0/objects/models/unknown_29_64.bin" -glabel ASSET_29_65 +glabel ASSET_OBJECT_MODELS_65 .incbin "./build/us_1.0/objects/models/unknown_29_65.bin" -glabel ASSET_29_66 +glabel ASSET_OBJECT_MODELS_66 .incbin "./build/us_1.0/objects/models/unknown_29_66.bin" -glabel ASSET_29_67 +glabel ASSET_OBJECT_MODELS_67 .incbin "./build/us_1.0/objects/models/unknown_29_67.bin" -glabel ASSET_29_68 +glabel ASSET_OBJECT_MODELS_68 .incbin "./build/us_1.0/objects/models/unknown_29_68.bin" -glabel ASSET_29_69 +glabel ASSET_OBJECT_MODELS_69 .incbin "./build/us_1.0/objects/models/unknown_29_69.bin" -glabel ASSET_29_70 +glabel ASSET_OBJECT_MODELS_70 .incbin "./build/us_1.0/objects/models/unknown_29_70.bin" -glabel ASSET_29_71 +glabel ASSET_OBJECT_MODELS_71 .incbin "./build/us_1.0/objects/models/unknown_29_71.bin" -glabel ASSET_29_72 +glabel ASSET_OBJECT_MODELS_72 .incbin "./build/us_1.0/objects/models/unknown_29_72.bin" -glabel ASSET_29_73 +glabel ASSET_OBJECT_MODELS_73 .incbin "./build/us_1.0/objects/models/unknown_29_73.bin" -glabel ASSET_29_74 +glabel ASSET_OBJECT_MODELS_74 .incbin "./build/us_1.0/objects/models/unknown_29_74.bin" -glabel ASSET_29_75 +glabel ASSET_OBJECT_MODELS_75 .incbin "./build/us_1.0/objects/models/unknown_29_75.bin" -glabel ASSET_29_76 +glabel ASSET_OBJECT_MODELS_76 .incbin "./build/us_1.0/objects/models/unknown_29_76.bin" -glabel ASSET_29_77 +glabel ASSET_OBJECT_MODELS_77 .incbin "./build/us_1.0/objects/models/unknown_29_77.bin" -glabel ASSET_29_78 +glabel ASSET_OBJECT_MODELS_78 .incbin "./build/us_1.0/objects/models/unknown_29_78.bin" -glabel ASSET_29_79 +glabel ASSET_OBJECT_MODELS_79 .incbin "./build/us_1.0/objects/models/unknown_29_79.bin" -glabel ASSET_29_80 +glabel ASSET_OBJECT_MODELS_80 .incbin "./build/us_1.0/objects/models/unknown_29_80.bin" -glabel ASSET_29_81 +glabel ASSET_OBJECT_MODELS_81 .incbin "./build/us_1.0/objects/models/unknown_29_81.bin" -glabel ASSET_29_82 +glabel ASSET_OBJECT_MODELS_82 .incbin "./build/us_1.0/objects/models/unknown_29_82.bin" -glabel ASSET_29_83 +glabel ASSET_OBJECT_MODELS_83 .incbin "./build/us_1.0/objects/models/unknown_29_83.bin" -glabel ASSET_29_84 +glabel ASSET_OBJECT_MODELS_84 .incbin "./build/us_1.0/objects/models/unknown_29_84.bin" -glabel ASSET_29_85 +glabel ASSET_OBJECT_MODELS_85 .incbin "./build/us_1.0/objects/models/unknown_29_85.bin" -glabel ASSET_29_86 +glabel ASSET_OBJECT_MODELS_86 .incbin "./build/us_1.0/objects/models/unknown_29_86.bin" -glabel ASSET_29_87 +glabel ASSET_OBJECT_MODELS_87 .incbin "./build/us_1.0/objects/models/unknown_29_87.bin" -glabel ASSET_29_88 +glabel ASSET_OBJECT_MODELS_88 .incbin "./build/us_1.0/objects/models/unknown_29_88.bin" -glabel ASSET_29_89 +glabel ASSET_OBJECT_MODELS_89 .incbin "./build/us_1.0/objects/models/unknown_29_89.bin" -glabel ASSET_29_90 +glabel ASSET_OBJECT_MODELS_90 .incbin "./build/us_1.0/objects/models/unknown_29_90.bin" -glabel ASSET_29_91 +glabel ASSET_OBJECT_MODELS_91 .incbin "./build/us_1.0/objects/models/unknown_29_91.bin" -glabel ASSET_29_92 +glabel ASSET_OBJECT_MODELS_92 .incbin "./build/us_1.0/objects/models/unknown_29_92.bin" -glabel ASSET_29_93 +glabel ASSET_OBJECT_MODELS_93 .incbin "./build/us_1.0/objects/models/unknown_29_93.bin" -glabel ASSET_29_94 +glabel ASSET_OBJECT_MODELS_94 .incbin "./build/us_1.0/objects/models/unknown_29_94.bin" -glabel ASSET_29_95 +glabel ASSET_OBJECT_MODELS_95 .incbin "./build/us_1.0/objects/models/unknown_29_95.bin" -glabel ASSET_29_96 +glabel ASSET_OBJECT_MODELS_96 .incbin "./build/us_1.0/objects/models/unknown_29_96.bin" -glabel ASSET_29_97 +glabel ASSET_OBJECT_MODELS_97 .incbin "./build/us_1.0/objects/models/unknown_29_97.bin" -glabel ASSET_29_98 +glabel ASSET_OBJECT_MODELS_98 .incbin "./build/us_1.0/objects/models/unknown_29_98.bin" -glabel ASSET_29_99 +glabel ASSET_OBJECT_MODELS_99 .incbin "./build/us_1.0/objects/models/unknown_29_99.bin" -glabel ASSET_29_100 +glabel ASSET_OBJECT_MODELS_100 .incbin "./build/us_1.0/objects/models/unknown_29_100.bin" -glabel ASSET_29_101 +glabel ASSET_OBJECT_MODELS_101 .incbin "./build/us_1.0/objects/models/unknown_29_101.bin" -glabel ASSET_29_102 +glabel ASSET_OBJECT_MODELS_102 .incbin "./build/us_1.0/objects/models/unknown_29_102.bin" -glabel ASSET_29_103 +glabel ASSET_OBJECT_MODELS_103 .incbin "./build/us_1.0/objects/models/unknown_29_103.bin" -glabel ASSET_29_104 +glabel ASSET_OBJECT_MODELS_104 .incbin "./build/us_1.0/objects/models/unknown_29_104.bin" -glabel ASSET_29_105 +glabel ASSET_OBJECT_MODELS_105 .incbin "./build/us_1.0/objects/models/unknown_29_105.bin" -glabel ASSET_29_106 +glabel ASSET_OBJECT_MODELS_106 .incbin "./build/us_1.0/objects/models/unknown_29_106.bin" -glabel ASSET_29_107 +glabel ASSET_OBJECT_MODELS_107 .incbin "./build/us_1.0/objects/models/unknown_29_107.bin" -glabel ASSET_29_108 +glabel ASSET_OBJECT_MODELS_108 .incbin "./build/us_1.0/objects/models/unknown_29_108.bin" -glabel ASSET_29_109 +glabel ASSET_OBJECT_MODELS_109 .incbin "./build/us_1.0/objects/models/unknown_29_109.bin" -glabel ASSET_29_110 +glabel ASSET_OBJECT_MODELS_110 .incbin "./build/us_1.0/objects/models/unknown_29_110.bin" -glabel ASSET_29_111 +glabel ASSET_OBJECT_MODELS_111 .incbin "./build/us_1.0/objects/models/unknown_29_111.bin" -glabel ASSET_29_112 +glabel ASSET_OBJECT_MODELS_112 .incbin "./build/us_1.0/objects/models/unknown_29_112.bin" -glabel ASSET_29_113 +glabel ASSET_OBJECT_MODELS_113 .incbin "./build/us_1.0/objects/models/unknown_29_113.bin" -glabel ASSET_29_114 +glabel ASSET_OBJECT_MODELS_114 .incbin "./build/us_1.0/objects/models/unknown_29_114.bin" -glabel ASSET_29_115 +glabel ASSET_OBJECT_MODELS_115 .incbin "./build/us_1.0/objects/models/unknown_29_115.bin" -glabel ASSET_29_116 +glabel ASSET_OBJECT_MODELS_116 .incbin "./build/us_1.0/objects/models/unknown_29_116.bin" -glabel ASSET_29_117 +glabel ASSET_OBJECT_MODELS_117 .incbin "./build/us_1.0/objects/models/unknown_29_117.bin" -glabel ASSET_29_118 +glabel ASSET_OBJECT_MODELS_118 .incbin "./build/us_1.0/objects/models/unknown_29_118.bin" -glabel ASSET_29_119 +glabel ASSET_OBJECT_MODELS_119 .incbin "./build/us_1.0/objects/models/unknown_29_119.bin" -glabel ASSET_29_120 +glabel ASSET_OBJECT_MODELS_120 .incbin "./build/us_1.0/objects/models/unknown_29_120.bin" -glabel ASSET_29_121 +glabel ASSET_OBJECT_MODELS_121 .incbin "./build/us_1.0/objects/models/unknown_29_121.bin" -glabel ASSET_29_122 +glabel ASSET_OBJECT_MODELS_122 .incbin "./build/us_1.0/objects/models/unknown_29_122.bin" -glabel ASSET_29_123 +glabel ASSET_OBJECT_MODELS_123 .incbin "./build/us_1.0/objects/models/unknown_29_123.bin" -glabel ASSET_29_124 +glabel ASSET_OBJECT_MODELS_124 .incbin "./build/us_1.0/objects/models/unknown_29_124.bin" -glabel ASSET_29_125 +glabel ASSET_OBJECT_MODELS_125 .incbin "./build/us_1.0/objects/models/unknown_29_125.bin" -glabel ASSET_29_126 +glabel ASSET_OBJECT_MODELS_126 .incbin "./build/us_1.0/objects/models/unknown_29_126.bin" -glabel ASSET_29_127 +glabel ASSET_OBJECT_MODELS_127 .incbin "./build/us_1.0/objects/models/unknown_29_127.bin" -glabel ASSET_29_128 +glabel ASSET_OBJECT_MODELS_128 .incbin "./build/us_1.0/objects/models/unknown_29_128.bin" -glabel ASSET_29_129 +glabel ASSET_OBJECT_MODELS_129 .incbin "./build/us_1.0/objects/models/unknown_29_129.bin" -glabel ASSET_29_130 +glabel ASSET_OBJECT_MODELS_130 .incbin "./build/us_1.0/objects/models/unknown_29_130.bin" -glabel ASSET_29_131 +glabel ASSET_OBJECT_MODELS_131 .incbin "./build/us_1.0/objects/models/unknown_29_131.bin" -glabel ASSET_29_132 +glabel ASSET_OBJECT_MODELS_132 .incbin "./build/us_1.0/objects/models/unknown_29_132.bin" -glabel ASSET_29_133 +glabel ASSET_OBJECT_MODELS_133 .incbin "./build/us_1.0/objects/models/unknown_29_133.bin" -glabel ASSET_29_134 +glabel ASSET_OBJECT_MODELS_134 .incbin "./build/us_1.0/objects/models/unknown_29_134.bin" -glabel ASSET_29_135 +glabel ASSET_OBJECT_MODELS_135 .incbin "./build/us_1.0/objects/models/unknown_29_135.bin" -glabel ASSET_29_136 +glabel ASSET_OBJECT_MODELS_136 .incbin "./build/us_1.0/objects/models/unknown_29_136.bin" -glabel ASSET_29_137 +glabel ASSET_OBJECT_MODELS_137 .incbin "./build/us_1.0/objects/models/unknown_29_137.bin" -glabel ASSET_29_138 +glabel ASSET_OBJECT_MODELS_138 .incbin "./build/us_1.0/objects/models/unknown_29_138.bin" -glabel ASSET_29_139 +glabel ASSET_OBJECT_MODELS_139 .incbin "./build/us_1.0/objects/models/unknown_29_139.bin" -glabel ASSET_29_140 +glabel ASSET_OBJECT_MODELS_140 .incbin "./build/us_1.0/objects/models/unknown_29_140.bin" -glabel ASSET_29_141 +glabel ASSET_OBJECT_MODELS_141 .incbin "./build/us_1.0/objects/models/unknown_29_141.bin" -glabel ASSET_29_142 +glabel ASSET_OBJECT_MODELS_142 .incbin "./build/us_1.0/objects/models/unknown_29_142.bin" -glabel ASSET_29_143 +glabel ASSET_OBJECT_MODELS_143 .incbin "./build/us_1.0/objects/models/unknown_29_143.bin" -glabel ASSET_29_144 +glabel ASSET_OBJECT_MODELS_144 .incbin "./build/us_1.0/objects/models/unknown_29_144.bin" -glabel ASSET_29_145 +glabel ASSET_OBJECT_MODELS_145 .incbin "./build/us_1.0/objects/models/unknown_29_145.bin" -glabel ASSET_29_146 +glabel ASSET_OBJECT_MODELS_146 .incbin "./build/us_1.0/objects/models/unknown_29_146.bin" -glabel ASSET_29_147 +glabel ASSET_OBJECT_MODELS_147 .incbin "./build/us_1.0/objects/models/unknown_29_147.bin" -glabel ASSET_29_148 +glabel ASSET_OBJECT_MODELS_148 .incbin "./build/us_1.0/objects/models/unknown_29_148.bin" -glabel ASSET_29_149 +glabel ASSET_OBJECT_MODELS_149 .incbin "./build/us_1.0/objects/models/unknown_29_149.bin" -glabel ASSET_29_150 +glabel ASSET_OBJECT_MODELS_150 .incbin "./build/us_1.0/objects/models/unknown_29_150.bin" -glabel ASSET_29_151 +glabel ASSET_OBJECT_MODELS_151 .incbin "./build/us_1.0/objects/models/unknown_29_151.bin" -glabel ASSET_29_152 +glabel ASSET_OBJECT_MODELS_152 .incbin "./build/us_1.0/objects/models/unknown_29_152.bin" -glabel ASSET_29_153 +glabel ASSET_OBJECT_MODELS_153 .incbin "./build/us_1.0/objects/models/unknown_29_153.bin" -glabel ASSET_29_154 +glabel ASSET_OBJECT_MODELS_154 .incbin "./build/us_1.0/objects/models/unknown_29_154.bin" -glabel ASSET_29_155 +glabel ASSET_OBJECT_MODELS_155 .incbin "./build/us_1.0/objects/models/unknown_29_155.bin" -glabel ASSET_29_156 +glabel ASSET_OBJECT_MODELS_156 .incbin "./build/us_1.0/objects/models/unknown_29_156.bin" -glabel ASSET_29_157 +glabel ASSET_OBJECT_MODELS_157 .incbin "./build/us_1.0/objects/models/unknown_29_157.bin" -glabel ASSET_29_158 +glabel ASSET_OBJECT_MODELS_158 .incbin "./build/us_1.0/objects/models/unknown_29_158.bin" -glabel ASSET_29_159 +glabel ASSET_OBJECT_MODELS_159 .incbin "./build/us_1.0/objects/models/unknown_29_159.bin" -glabel ASSET_29_160 +glabel ASSET_OBJECT_MODELS_160 .incbin "./build/us_1.0/objects/models/unknown_29_160.bin" -glabel ASSET_29_161 +glabel ASSET_OBJECT_MODELS_161 .incbin "./build/us_1.0/objects/models/unknown_29_161.bin" -glabel ASSET_29_162 +glabel ASSET_OBJECT_MODELS_162 .incbin "./build/us_1.0/objects/models/unknown_29_162.bin" -glabel ASSET_29_163 +glabel ASSET_OBJECT_MODELS_163 .incbin "./build/us_1.0/objects/models/unknown_29_163.bin" -glabel ASSET_29_164 +glabel ASSET_OBJECT_MODELS_164 .incbin "./build/us_1.0/objects/models/unknown_29_164.bin" -glabel ASSET_29_165 +glabel ASSET_OBJECT_MODELS_165 .incbin "./build/us_1.0/objects/models/unknown_29_165.bin" -glabel ASSET_29_166 +glabel ASSET_OBJECT_MODELS_166 .incbin "./build/us_1.0/objects/models/unknown_29_166.bin" -glabel ASSET_29_167 +glabel ASSET_OBJECT_MODELS_167 .incbin "./build/us_1.0/objects/models/unknown_29_167.bin" -glabel ASSET_29_168 +glabel ASSET_OBJECT_MODELS_168 .incbin "./build/us_1.0/objects/models/unknown_29_168.bin" -glabel ASSET_29_169 +glabel ASSET_OBJECT_MODELS_169 .incbin "./build/us_1.0/objects/models/unknown_29_169.bin" -glabel ASSET_29_170 +glabel ASSET_OBJECT_MODELS_170 .incbin "./build/us_1.0/objects/models/unknown_29_170.bin" -glabel ASSET_29_171 +glabel ASSET_OBJECT_MODELS_171 .incbin "./build/us_1.0/objects/models/unknown_29_171.bin" -glabel ASSET_29_172 +glabel ASSET_OBJECT_MODELS_172 .incbin "./build/us_1.0/objects/models/unknown_29_172.bin" -glabel ASSET_29_173 +glabel ASSET_OBJECT_MODELS_173 .incbin "./build/us_1.0/objects/models/unknown_29_173.bin" -glabel ASSET_29_174 +glabel ASSET_OBJECT_MODELS_174 .incbin "./build/us_1.0/objects/models/unknown_29_174.bin" -glabel ASSET_29_175 +glabel ASSET_OBJECT_MODELS_175 .incbin "./build/us_1.0/objects/models/unknown_29_175.bin" -glabel ASSET_29_176 +glabel ASSET_OBJECT_MODELS_176 .incbin "./build/us_1.0/objects/models/unknown_29_176.bin" -glabel ASSET_29_177 +glabel ASSET_OBJECT_MODELS_177 .incbin "./build/us_1.0/objects/models/unknown_29_177.bin" -glabel ASSET_29_178 +glabel ASSET_OBJECT_MODELS_178 .incbin "./build/us_1.0/objects/models/unknown_29_178.bin" -glabel ASSET_29_179 +glabel ASSET_OBJECT_MODELS_179 .incbin "./build/us_1.0/objects/models/unknown_29_179.bin" -glabel ASSET_29_180 +glabel ASSET_OBJECT_MODELS_180 .incbin "./build/us_1.0/objects/models/unknown_29_180.bin" -glabel ASSET_29_181 +glabel ASSET_OBJECT_MODELS_181 .incbin "./build/us_1.0/objects/models/unknown_29_181.bin" -glabel ASSET_29_182 +glabel ASSET_OBJECT_MODELS_182 .incbin "./build/us_1.0/objects/models/unknown_29_182.bin" -glabel ASSET_29_183 +glabel ASSET_OBJECT_MODELS_183 .incbin "./build/us_1.0/objects/models/unknown_29_183.bin" -glabel ASSET_29_184 +glabel ASSET_OBJECT_MODELS_184 .incbin "./build/us_1.0/objects/models/unknown_29_184.bin" -glabel ASSET_29_185 +glabel ASSET_OBJECT_MODELS_185 .incbin "./build/us_1.0/objects/models/unknown_29_185.bin" -glabel ASSET_29_186 +glabel ASSET_OBJECT_MODELS_186 .incbin "./build/us_1.0/objects/models/unknown_29_186.bin" -glabel ASSET_29_187 +glabel ASSET_OBJECT_MODELS_187 .incbin "./build/us_1.0/objects/models/unknown_29_187.bin" -glabel ASSET_29_188 +glabel ASSET_OBJECT_MODELS_188 .incbin "./build/us_1.0/objects/models/unknown_29_188.bin" -glabel ASSET_29_189 +glabel ASSET_OBJECT_MODELS_189 .incbin "./build/us_1.0/objects/models/unknown_29_189.bin" -glabel ASSET_29_190 +glabel ASSET_OBJECT_MODELS_190 .incbin "./build/us_1.0/objects/models/unknown_29_190.bin" -glabel ASSET_29_191 +glabel ASSET_OBJECT_MODELS_191 .incbin "./build/us_1.0/objects/models/unknown_29_191.bin" -glabel ASSET_29_192 +glabel ASSET_OBJECT_MODELS_192 .incbin "./build/us_1.0/objects/models/unknown_29_192.bin" -glabel ASSET_29_193 +glabel ASSET_OBJECT_MODELS_193 .incbin "./build/us_1.0/objects/models/unknown_29_193.bin" -glabel ASSET_29_194 +glabel ASSET_OBJECT_MODELS_194 .incbin "./build/us_1.0/objects/models/unknown_29_194.bin" -glabel ASSET_29_195 +glabel ASSET_OBJECT_MODELS_195 .incbin "./build/us_1.0/objects/models/unknown_29_195.bin" -glabel ASSET_29_196 +glabel ASSET_OBJECT_MODELS_196 .incbin "./build/us_1.0/objects/models/unknown_29_196.bin" -glabel ASSET_29_197 +glabel ASSET_OBJECT_MODELS_197 .incbin "./build/us_1.0/objects/models/unknown_29_197.bin" -glabel ASSET_29_198 +glabel ASSET_OBJECT_MODELS_198 .incbin "./build/us_1.0/objects/models/unknown_29_198.bin" -glabel ASSET_29_199 +glabel ASSET_OBJECT_MODELS_199 .incbin "./build/us_1.0/objects/models/unknown_29_199.bin" -glabel ASSET_29_200 +glabel ASSET_OBJECT_MODELS_200 .incbin "./build/us_1.0/objects/models/unknown_29_200.bin" -glabel ASSET_29_201 +glabel ASSET_OBJECT_MODELS_201 .incbin "./build/us_1.0/objects/models/unknown_29_201.bin" -glabel ASSET_29_202 +glabel ASSET_OBJECT_MODELS_202 .incbin "./build/us_1.0/objects/models/unknown_29_202.bin" -glabel ASSET_29_203 +glabel ASSET_OBJECT_MODELS_203 .incbin "./build/us_1.0/objects/models/unknown_29_203.bin" -glabel ASSET_29_204 +glabel ASSET_OBJECT_MODELS_204 .incbin "./build/us_1.0/objects/models/unknown_29_204.bin" -glabel ASSET_29_205 +glabel ASSET_OBJECT_MODELS_205 .incbin "./build/us_1.0/objects/models/unknown_29_205.bin" -glabel ASSET_29_206 +glabel ASSET_OBJECT_MODELS_206 .incbin "./build/us_1.0/objects/models/unknown_29_206.bin" -glabel ASSET_29_207 +glabel ASSET_OBJECT_MODELS_207 .incbin "./build/us_1.0/objects/models/unknown_29_207.bin" -glabel ASSET_29_208 +glabel ASSET_OBJECT_MODELS_208 .incbin "./build/us_1.0/objects/models/unknown_29_208.bin" -glabel ASSET_29_209 +glabel ASSET_OBJECT_MODELS_209 .incbin "./build/us_1.0/objects/models/unknown_29_209.bin" -glabel ASSET_29_210 +glabel ASSET_OBJECT_MODELS_210 .incbin "./build/us_1.0/objects/models/unknown_29_210.bin" -glabel ASSET_29_211 +glabel ASSET_OBJECT_MODELS_211 .incbin "./build/us_1.0/objects/models/unknown_29_211.bin" -glabel ASSET_29_212 +glabel ASSET_OBJECT_MODELS_212 .incbin "./build/us_1.0/objects/models/unknown_29_212.bin" -glabel ASSET_29_213 +glabel ASSET_OBJECT_MODELS_213 .incbin "./build/us_1.0/objects/models/unknown_29_213.bin" -glabel ASSET_29_214 +glabel ASSET_OBJECT_MODELS_214 .incbin "./build/us_1.0/objects/models/unknown_29_214.bin" -glabel ASSET_29_215 +glabel ASSET_OBJECT_MODELS_215 .incbin "./build/us_1.0/objects/models/unknown_29_215.bin" -glabel ASSET_29_216 +glabel ASSET_OBJECT_MODELS_216 .incbin "./build/us_1.0/objects/models/unknown_29_216.bin" -glabel ASSET_29_217 +glabel ASSET_OBJECT_MODELS_217 .incbin "./build/us_1.0/objects/models/unknown_29_217.bin" -glabel ASSET_29_218 +glabel ASSET_OBJECT_MODELS_218 .incbin "./build/us_1.0/objects/models/unknown_29_218.bin" -glabel ASSET_29_219 +glabel ASSET_OBJECT_MODELS_219 .incbin "./build/us_1.0/objects/models/unknown_29_219.bin" -glabel ASSET_29_220 +glabel ASSET_OBJECT_MODELS_220 .incbin "./build/us_1.0/objects/models/unknown_29_220.bin" -glabel ASSET_29_221 +glabel ASSET_OBJECT_MODELS_221 .incbin "./build/us_1.0/objects/models/unknown_29_221.bin" -glabel ASSET_29_222 +glabel ASSET_OBJECT_MODELS_222 .incbin "./build/us_1.0/objects/models/unknown_29_222.bin" -glabel ASSET_29_223 +glabel ASSET_OBJECT_MODELS_223 .incbin "./build/us_1.0/objects/models/unknown_29_223.bin" -glabel ASSET_29_224 +glabel ASSET_OBJECT_MODELS_224 .incbin "./build/us_1.0/objects/models/unknown_29_224.bin" -glabel ASSET_29_225 +glabel ASSET_OBJECT_MODELS_225 .incbin "./build/us_1.0/objects/models/unknown_29_225.bin" -glabel ASSET_29_226 +glabel ASSET_OBJECT_MODELS_226 .incbin "./build/us_1.0/objects/models/unknown_29_226.bin" -glabel ASSET_29_227 +glabel ASSET_OBJECT_MODELS_227 .incbin "./build/us_1.0/objects/models/unknown_29_227.bin" -glabel ASSET_29_228 +glabel ASSET_OBJECT_MODELS_228 .incbin "./build/us_1.0/objects/models/unknown_29_228.bin" -glabel ASSET_29_229 +glabel ASSET_OBJECT_MODELS_229 .incbin "./build/us_1.0/objects/models/unknown_29_229.bin" -glabel ASSET_29_230 +glabel ASSET_OBJECT_MODELS_230 .incbin "./build/us_1.0/objects/models/unknown_29_230.bin" -glabel ASSET_29_231 +glabel ASSET_OBJECT_MODELS_231 .incbin "./build/us_1.0/objects/models/unknown_29_231.bin" -glabel ASSET_29_232 +glabel ASSET_OBJECT_MODELS_232 .incbin "./build/us_1.0/objects/models/unknown_29_232.bin" -glabel ASSET_29_233 +glabel ASSET_OBJECT_MODELS_233 .incbin "./build/us_1.0/objects/models/unknown_29_233.bin" -glabel ASSET_29_234 +glabel ASSET_OBJECT_MODELS_234 .incbin "./build/us_1.0/objects/models/unknown_29_234.bin" -glabel ASSET_29_235 +glabel ASSET_OBJECT_MODELS_235 .incbin "./build/us_1.0/objects/models/unknown_29_235.bin" -glabel ASSET_29_236 +glabel ASSET_OBJECT_MODELS_236 .incbin "./build/us_1.0/objects/models/unknown_29_236.bin" -glabel ASSET_29_237 +glabel ASSET_OBJECT_MODELS_237 .incbin "./build/us_1.0/objects/models/unknown_29_237.bin" -glabel ASSET_29_238 +glabel ASSET_OBJECT_MODELS_238 .incbin "./build/us_1.0/objects/models/unknown_29_238.bin" -glabel ASSET_29_239 +glabel ASSET_OBJECT_MODELS_239 .incbin "./build/us_1.0/objects/models/unknown_29_239.bin" -glabel ASSET_29_240 +glabel ASSET_OBJECT_MODELS_240 .incbin "./build/us_1.0/objects/models/unknown_29_240.bin" -glabel ASSET_29_241 +glabel ASSET_OBJECT_MODELS_241 .incbin "./build/us_1.0/objects/models/unknown_29_241.bin" -glabel ASSET_29_242 +glabel ASSET_OBJECT_MODELS_242 .incbin "./build/us_1.0/objects/models/unknown_29_242.bin" -glabel ASSET_29_243 +glabel ASSET_OBJECT_MODELS_243 .incbin "./build/us_1.0/objects/models/unknown_29_243.bin" -glabel ASSET_29_244 +glabel ASSET_OBJECT_MODELS_244 .incbin "./build/us_1.0/objects/models/unknown_29_244.bin" -glabel ASSET_29_245 +glabel ASSET_OBJECT_MODELS_245 .incbin "./build/us_1.0/objects/models/unknown_29_245.bin" -glabel ASSET_29_246 +glabel ASSET_OBJECT_MODELS_246 .incbin "./build/us_1.0/objects/models/unknown_29_246.bin" -glabel ASSET_29_247 +glabel ASSET_OBJECT_MODELS_247 .incbin "./build/us_1.0/objects/models/unknown_29_247.bin" -glabel ASSET_29_248 +glabel ASSET_OBJECT_MODELS_248 .incbin "./build/us_1.0/objects/models/unknown_29_248.bin" -glabel ASSET_29_249 +glabel ASSET_OBJECT_MODELS_249 .incbin "./build/us_1.0/objects/models/unknown_29_249.bin" -glabel ASSET_29_250 +glabel ASSET_OBJECT_MODELS_250 .incbin "./build/us_1.0/objects/models/unknown_29_250.bin" -glabel ASSET_29_251 +glabel ASSET_OBJECT_MODELS_251 .incbin "./build/us_1.0/objects/models/unknown_29_251.bin" -glabel ASSET_29_252 +glabel ASSET_OBJECT_MODELS_252 .incbin "./build/us_1.0/objects/models/unknown_29_252.bin" -glabel ASSET_29_253 +glabel ASSET_OBJECT_MODELS_253 .incbin "./build/us_1.0/objects/models/unknown_29_253.bin" -glabel ASSET_29_254 +glabel ASSET_OBJECT_MODELS_254 .incbin "./build/us_1.0/objects/models/unknown_29_254.bin" -glabel ASSET_29_255 +glabel ASSET_OBJECT_MODELS_255 .incbin "./build/us_1.0/objects/models/unknown_29_255.bin" -glabel ASSET_29_256 +glabel ASSET_OBJECT_MODELS_256 .incbin "./build/us_1.0/objects/models/unknown_29_256.bin" -glabel ASSET_29_257 +glabel ASSET_OBJECT_MODELS_257 .incbin "./build/us_1.0/objects/models/unknown_29_257.bin" -glabel ASSET_29_258 +glabel ASSET_OBJECT_MODELS_258 .incbin "./build/us_1.0/objects/models/unknown_29_258.bin" -glabel ASSET_29_259 +glabel ASSET_OBJECT_MODELS_259 .incbin "./build/us_1.0/objects/models/unknown_29_259.bin" -glabel ASSET_29_260 +glabel ASSET_OBJECT_MODELS_260 .incbin "./build/us_1.0/objects/models/unknown_29_260.bin" -glabel ASSET_29_261 +glabel ASSET_OBJECT_MODELS_261 .incbin "./build/us_1.0/objects/models/unknown_29_261.bin" -glabel ASSET_29_262 +glabel ASSET_OBJECT_MODELS_262 .incbin "./build/us_1.0/objects/models/unknown_29_262.bin" -glabel ASSET_29_263 +glabel ASSET_OBJECT_MODELS_263 .incbin "./build/us_1.0/objects/models/unknown_29_263.bin" -glabel ASSET_29_264 +glabel ASSET_OBJECT_MODELS_264 .incbin "./build/us_1.0/objects/models/unknown_29_264.bin" -glabel ASSET_29_265 +glabel ASSET_OBJECT_MODELS_265 .incbin "./build/us_1.0/objects/models/unknown_29_265.bin" -glabel ASSET_29_266 +glabel ASSET_OBJECT_MODELS_266 .incbin "./build/us_1.0/objects/models/unknown_29_266.bin" -glabel ASSET_29_267 +glabel ASSET_OBJECT_MODELS_267 .incbin "./build/us_1.0/objects/models/unknown_29_267.bin" -glabel ASSET_29_268 +glabel ASSET_OBJECT_MODELS_268 .incbin "./build/us_1.0/objects/models/unknown_29_268.bin" -glabel ASSET_29_269 +glabel ASSET_OBJECT_MODELS_269 .incbin "./build/us_1.0/objects/models/unknown_29_269.bin" -glabel ASSET_29_270 +glabel ASSET_OBJECT_MODELS_270 .incbin "./build/us_1.0/objects/models/unknown_29_270.bin" -glabel ASSET_29_271 +glabel ASSET_OBJECT_MODELS_271 .incbin "./build/us_1.0/objects/models/unknown_29_271.bin" -glabel ASSET_29_272 +glabel ASSET_OBJECT_MODELS_272 .incbin "./build/us_1.0/objects/models/unknown_29_272.bin" -glabel ASSET_29_273 +glabel ASSET_OBJECT_MODELS_273 .incbin "./build/us_1.0/objects/models/unknown_29_273.bin" -glabel ASSET_29_274 +glabel ASSET_OBJECT_MODELS_274 .incbin "./build/us_1.0/objects/models/unknown_29_274.bin" -glabel ASSET_29_275 +glabel ASSET_OBJECT_MODELS_275 .incbin "./build/us_1.0/objects/models/unknown_29_275.bin" -glabel ASSET_29_276 +glabel ASSET_OBJECT_MODELS_276 .incbin "./build/us_1.0/objects/models/unknown_29_276.bin" -glabel ASSET_29_277 +glabel ASSET_OBJECT_MODELS_277 .incbin "./build/us_1.0/objects/models/unknown_29_277.bin" -glabel ASSET_29_278 +glabel ASSET_OBJECT_MODELS_278 .incbin "./build/us_1.0/objects/models/unknown_29_278.bin" -glabel ASSET_29_279 +glabel ASSET_OBJECT_MODELS_279 .incbin "./build/us_1.0/objects/models/unknown_29_279.bin" -glabel ASSET_29_280 +glabel ASSET_OBJECT_MODELS_280 .incbin "./build/us_1.0/objects/models/unknown_29_280.bin" -glabel ASSET_29_281 +glabel ASSET_OBJECT_MODELS_281 .incbin "./build/us_1.0/objects/models/unknown_29_281.bin" -glabel ASSET_29_282 +glabel ASSET_OBJECT_MODELS_282 .incbin "./build/us_1.0/objects/models/unknown_29_282.bin" -glabel ASSET_29_283 +glabel ASSET_OBJECT_MODELS_283 .incbin "./build/us_1.0/objects/models/unknown_29_283.bin" -glabel ASSET_29_284 +glabel ASSET_OBJECT_MODELS_284 .incbin "./build/us_1.0/objects/models/unknown_29_284.bin" -glabel ASSET_29_285 +glabel ASSET_OBJECT_MODELS_285 .incbin "./build/us_1.0/objects/models/unknown_29_285.bin" -glabel ASSET_29_286 +glabel ASSET_OBJECT_MODELS_286 .incbin "./build/us_1.0/objects/models/unknown_29_286.bin" -glabel ASSET_29_287 +glabel ASSET_OBJECT_MODELS_287 .incbin "./build/us_1.0/objects/models/unknown_29_287.bin" -glabel ASSET_29_288 +glabel ASSET_OBJECT_MODELS_288 .incbin "./build/us_1.0/objects/models/unknown_29_288.bin" -glabel ASSET_29_289 +glabel ASSET_OBJECT_MODELS_289 .incbin "./build/us_1.0/objects/models/unknown_29_289.bin" -glabel ASSET_29_290 +glabel ASSET_OBJECT_MODELS_290 .incbin "./build/us_1.0/objects/models/unknown_29_290.bin" -glabel ASSET_29_291 +glabel ASSET_OBJECT_MODELS_291 .incbin "./build/us_1.0/objects/models/unknown_29_291.bin" -glabel ASSET_29_292 +glabel ASSET_OBJECT_MODELS_292 .incbin "./build/us_1.0/objects/models/unknown_29_292.bin" -glabel ASSET_29_293 +glabel ASSET_OBJECT_MODELS_293 .incbin "./build/us_1.0/objects/models/unknown_29_293.bin" -glabel ASSET_29_294 +glabel ASSET_OBJECT_MODELS_294 .incbin "./build/us_1.0/objects/models/unknown_29_294.bin" -glabel ASSET_29_295 +glabel ASSET_OBJECT_MODELS_295 .incbin "./build/us_1.0/objects/models/unknown_29_295.bin" -glabel ASSET_29_296 +glabel ASSET_OBJECT_MODELS_296 .incbin "./build/us_1.0/objects/models/unknown_29_296.bin" -glabel ASSET_29_297 +glabel ASSET_OBJECT_MODELS_297 .incbin "./build/us_1.0/objects/models/unknown_29_297.bin" -glabel ASSET_29_298 +glabel ASSET_OBJECT_MODELS_298 .incbin "./build/us_1.0/objects/models/unknown_29_298.bin" -glabel ASSET_29_299 +glabel ASSET_OBJECT_MODELS_299 .incbin "./build/us_1.0/objects/models/unknown_29_299.bin" -glabel ASSET_29_300 +glabel ASSET_OBJECT_MODELS_300 .incbin "./build/us_1.0/objects/models/unknown_29_300.bin" -glabel ASSET_29_301 +glabel ASSET_OBJECT_MODELS_301 .incbin "./build/us_1.0/objects/models/unknown_29_301.bin" -glabel ASSET_29_302 +glabel ASSET_OBJECT_MODELS_302 .incbin "./build/us_1.0/objects/models/unknown_29_302.bin" -glabel ASSET_29_303 +glabel ASSET_OBJECT_MODELS_303 .incbin "./build/us_1.0/objects/models/unknown_29_303.bin" -glabel ASSET_29_304 +glabel ASSET_OBJECT_MODELS_304 .incbin "./build/us_1.0/objects/models/unknown_29_304.bin" -glabel ASSET_29_305 +glabel ASSET_OBJECT_MODELS_305 .incbin "./build/us_1.0/objects/models/unknown_29_305.bin" -glabel ASSET_29_306 +glabel ASSET_OBJECT_MODELS_306 .incbin "./build/us_1.0/objects/models/unknown_29_306.bin" -glabel ASSET_29_307 +glabel ASSET_OBJECT_MODELS_307 .incbin "./build/us_1.0/objects/models/unknown_29_307.bin" -glabel ASSET_29_308 +glabel ASSET_OBJECT_MODELS_308 .incbin "./build/us_1.0/objects/models/unknown_29_308.bin" -glabel ASSET_29_309 +glabel ASSET_OBJECT_MODELS_309 .incbin "./build/us_1.0/objects/models/unknown_29_309.bin" -glabel ASSET_29_310 +glabel ASSET_OBJECT_MODELS_310 .incbin "./build/us_1.0/objects/models/unknown_29_310.bin" -glabel ASSET_29_311 +glabel ASSET_OBJECT_MODELS_311 .incbin "./build/us_1.0/objects/models/unknown_29_311.bin" -glabel ASSET_29_312 +glabel ASSET_OBJECT_MODELS_312 .incbin "./build/us_1.0/objects/models/unknown_29_312.bin" -glabel ASSET_29_313 +glabel ASSET_OBJECT_MODELS_313 .incbin "./build/us_1.0/objects/models/unknown_29_313.bin" -glabel ASSET_29_314 +glabel ASSET_OBJECT_MODELS_314 .incbin "./build/us_1.0/objects/models/unknown_29_314.bin" -glabel ASSET_29_315 +glabel ASSET_OBJECT_MODELS_315 .incbin "./build/us_1.0/objects/models/unknown_29_315.bin" -glabel ASSET_29_316 +glabel ASSET_OBJECT_MODELS_316 .incbin "./build/us_1.0/objects/models/unknown_29_316.bin" -glabel ASSET_29_317 +glabel ASSET_OBJECT_MODELS_317 .incbin "./build/us_1.0/objects/models/unknown_29_317.bin" -glabel ASSET_29_318 +glabel ASSET_OBJECT_MODELS_318 .incbin "./build/us_1.0/objects/models/unknown_29_318.bin" -glabel ASSET_29_319 +glabel ASSET_OBJECT_MODELS_319 .incbin "./build/us_1.0/objects/models/unknown_29_319.bin" -glabel ASSET_29_320 +glabel ASSET_OBJECT_MODELS_320 .incbin "./build/us_1.0/objects/models/unknown_29_320.bin" -glabel ASSET_29_321 +glabel ASSET_OBJECT_MODELS_321 .incbin "./build/us_1.0/objects/models/unknown_29_321.bin" -glabel ASSET_29_322 +glabel ASSET_OBJECT_MODELS_322 .incbin "./build/us_1.0/objects/models/unknown_29_322.bin" -glabel ASSET_29_323 +glabel ASSET_OBJECT_MODELS_323 .incbin "./build/us_1.0/objects/models/unknown_29_323.bin" -glabel ASSET_29_324 +glabel ASSET_OBJECT_MODELS_324 .incbin "./build/us_1.0/objects/models/unknown_29_324.bin" -glabel ASSET_29_325 +glabel ASSET_OBJECT_MODELS_325 .incbin "./build/us_1.0/objects/models/unknown_29_325.bin" -glabel ASSET_29_326 +glabel ASSET_OBJECT_MODELS_326 .incbin "./build/us_1.0/objects/models/unknown_29_326.bin" -glabel ASSET_29_327 +glabel ASSET_OBJECT_MODELS_327 .incbin "./build/us_1.0/objects/models/unknown_29_327.bin" -glabel ASSET_29_328 +glabel ASSET_OBJECT_MODELS_328 .incbin "./build/us_1.0/objects/models/unknown_29_328.bin" -glabel ASSET_29_329 +glabel ASSET_OBJECT_MODELS_329 .incbin "./build/us_1.0/objects/models/unknown_29_329.bin" -glabel ASSET_29_330 +glabel ASSET_OBJECT_MODELS_330 .incbin "./build/us_1.0/objects/models/unknown_29_330.bin" -glabel ASSET_29_331 +glabel ASSET_OBJECT_MODELS_331 .incbin "./build/us_1.0/objects/models/unknown_29_331.bin" -glabel ASSET_29_332 +glabel ASSET_OBJECT_MODELS_332 .incbin "./build/us_1.0/objects/models/unknown_29_332.bin" -glabel ASSET_29_333 +glabel ASSET_OBJECT_MODELS_333 .incbin "./build/us_1.0/objects/models/unknown_29_333.bin" -glabel ASSET_29_334 +glabel ASSET_OBJECT_MODELS_334 .incbin "./build/us_1.0/objects/models/unknown_29_334.bin" -glabel ASSET_29_335 +glabel ASSET_OBJECT_MODELS_335 .incbin "./build/us_1.0/objects/models/unknown_29_335.bin" -glabel ASSET_29_336 +glabel ASSET_OBJECT_MODELS_336 .incbin "./build/us_1.0/objects/models/unknown_29_336.bin" -glabel ASSET_29_337 +glabel ASSET_OBJECT_MODELS_337 .incbin "./build/us_1.0/objects/models/unknown_29_337.bin" -glabel ASSET_29_338 +glabel ASSET_OBJECT_MODELS_338 .incbin "./build/us_1.0/objects/models/unknown_29_338.bin" -glabel ASSET_29_339 +glabel ASSET_OBJECT_MODELS_339 .incbin "./build/us_1.0/objects/models/unknown_29_339.bin" -glabel ASSET_29_340 +glabel ASSET_OBJECT_MODELS_340 .incbin "./build/us_1.0/objects/models/unknown_29_340.bin" -glabel ASSET_29_341 +glabel ASSET_OBJECT_MODELS_341 .incbin "./build/us_1.0/objects/models/unknown_29_341.bin" -glabel ASSET_29_342 +glabel ASSET_OBJECT_MODELS_342 .incbin "./build/us_1.0/objects/models/unknown_29_342.bin" -glabel ASSET_29_343 +glabel ASSET_OBJECT_MODELS_343 .incbin "./build/us_1.0/objects/models/unknown_29_343.bin" -glabel ASSET_29_344 +glabel ASSET_OBJECT_MODELS_344 .incbin "./build/us_1.0/objects/models/unknown_29_344.bin" -glabel ASSET_29_345 +glabel ASSET_OBJECT_MODELS_345 .incbin "./build/us_1.0/objects/models/unknown_29_345.bin" -glabel ASSET_29_346 +glabel ASSET_OBJECT_MODELS_346 .incbin "./build/us_1.0/objects/models/unknown_29_346.bin" -glabel ASSET_29_347 +glabel ASSET_OBJECT_MODELS_347 .incbin "./build/us_1.0/objects/models/unknown_29_347.bin" -glabel ASSET_29_348 +glabel ASSET_OBJECT_MODELS_348 .incbin "./build/us_1.0/objects/models/unknown_29_348.bin" -glabel ASSET_29_349 +glabel ASSET_OBJECT_MODELS_349 .incbin "./build/us_1.0/objects/models/unknown_29_349.bin" -glabel ASSET_29_350 +glabel ASSET_OBJECT_MODELS_350 .incbin "./build/us_1.0/objects/models/unknown_29_350.bin" -glabel ASSET_29_351 +glabel ASSET_OBJECT_MODELS_351 .incbin "./build/us_1.0/objects/models/unknown_29_351.bin" -glabel ASSET_29_352 +glabel ASSET_OBJECT_MODELS_352 .incbin "./build/us_1.0/objects/models/unknown_29_352.bin" -glabel ASSET_29_353 +glabel ASSET_OBJECT_MODELS_353 .incbin "./build/us_1.0/objects/models/unknown_29_353.bin" -glabel ASSET_29_354 +glabel ASSET_OBJECT_MODELS_354 .incbin "./build/us_1.0/objects/models/unknown_29_354.bin" -glabel ASSET_29_355 +glabel ASSET_OBJECT_MODELS_355 .incbin "./build/us_1.0/objects/models/unknown_29_355.bin" -glabel ASSET_29_356 +glabel ASSET_OBJECT_MODELS_356 .incbin "./build/us_1.0/objects/models/unknown_29_356.bin" -glabel ASSET_29_357 +glabel ASSET_OBJECT_MODELS_357 .incbin "./build/us_1.0/objects/models/unknown_29_357.bin" -glabel ASSET_29_358 +glabel ASSET_OBJECT_MODELS_358 .incbin "./build/us_1.0/objects/models/unknown_29_358.bin" -glabel ASSET_29_359 +glabel ASSET_OBJECT_MODELS_359 .incbin "./build/us_1.0/objects/models/unknown_29_359.bin" -glabel ASSET_29_360 +glabel ASSET_OBJECT_MODELS_360 .incbin "./build/us_1.0/objects/models/unknown_29_360.bin" -glabel ASSET_29_361 +glabel ASSET_OBJECT_MODELS_361 .incbin "./build/us_1.0/objects/models/unknown_29_361.bin" -glabel ASSET_29_362 +glabel ASSET_OBJECT_MODELS_362 .incbin "./build/us_1.0/objects/models/unknown_29_362.bin" -glabel ASSET_29_363 +glabel ASSET_OBJECT_MODELS_363 .incbin "./build/us_1.0/objects/models/unknown_29_363.bin" -glabel ASSET_29_364 +glabel ASSET_OBJECT_MODELS_364 .incbin "./build/us_1.0/objects/models/unknown_29_364.bin" -glabel ASSET_29_365 +glabel ASSET_OBJECT_MODELS_365 .incbin "./build/us_1.0/objects/models/unknown_29_365.bin" -glabel ASSET_29_366 +glabel ASSET_OBJECT_MODELS_366 .incbin "./build/us_1.0/objects/models/unknown_29_366.bin" -glabel ASSET_29_367 +glabel ASSET_OBJECT_MODELS_367 .incbin "./build/us_1.0/objects/models/unknown_29_367.bin" -glabel ASSET_29_368 +glabel ASSET_OBJECT_MODELS_368 .incbin "./build/us_1.0/objects/models/unknown_29_368.bin" -glabel ASSET_29_369 +glabel ASSET_OBJECT_MODELS_369 .incbin "./build/us_1.0/objects/models/unknown_29_369.bin" -glabel ASSET_29_370 +glabel ASSET_OBJECT_MODELS_370 .incbin "./build/us_1.0/objects/models/unknown_29_370.bin" -glabel ASSET_29_371 +glabel ASSET_OBJECT_MODELS_371 .incbin "./build/us_1.0/objects/models/unknown_29_371.bin" -glabel ASSET_29_372 +glabel ASSET_OBJECT_MODELS_372 .incbin "./build/us_1.0/objects/models/unknown_29_372.bin" -glabel ASSET_29_373 +glabel ASSET_OBJECT_MODELS_373 .incbin "./build/us_1.0/objects/models/unknown_29_373.bin" -glabel ASSET_29_374 +glabel ASSET_OBJECT_MODELS_374 .incbin "./build/us_1.0/objects/models/unknown_29_374.bin" -glabel ASSET_29_375 +glabel ASSET_OBJECT_MODELS_375 .incbin "./build/us_1.0/objects/models/unknown_29_375.bin" -glabel ASSET_29_376 +glabel ASSET_OBJECT_MODELS_376 .incbin "./build/us_1.0/objects/models/unknown_29_376.bin" -glabel ASSET_29_377 +glabel ASSET_OBJECT_MODELS_377 .incbin "./build/us_1.0/objects/models/unknown_29_377.bin" -glabel ASSET_29_378 +glabel ASSET_OBJECT_MODELS_378 .incbin "./build/us_1.0/objects/models/unknown_29_378.bin" -glabel ASSET_29_379 +glabel ASSET_OBJECT_MODELS_379 .incbin "./build/us_1.0/objects/models/unknown_29_379.bin" -glabel ASSET_29_380 +glabel ASSET_OBJECT_MODELS_380 .incbin "./build/us_1.0/objects/models/unknown_29_380.bin" -glabel ASSET_29_381 +glabel ASSET_OBJECT_MODELS_381 .incbin "./build/us_1.0/objects/models/unknown_29_381.bin" -glabel ASSET_29_382 +glabel ASSET_OBJECT_MODELS_382 .incbin "./build/us_1.0/objects/models/unknown_29_382.bin" -glabel ASSET_29_383 +glabel ASSET_OBJECT_MODELS_383 .incbin "./build/us_1.0/objects/models/unknown_29_383.bin" -glabel ASSET_29_384 +glabel ASSET_OBJECT_MODELS_384 .incbin "./build/us_1.0/objects/models/unknown_29_384.bin" -glabel ASSET_29_385 +glabel ASSET_OBJECT_MODELS_385 .incbin "./build/us_1.0/objects/models/unknown_29_385.bin" -glabel ASSET_29_386 +glabel ASSET_OBJECT_MODELS_386 .incbin "./build/us_1.0/objects/models/unknown_29_386.bin" -glabel ASSET_29_387 +glabel ASSET_OBJECT_MODELS_387 .incbin "./build/us_1.0/objects/models/unknown_29_387.bin" -glabel ASSET_29_388 +glabel ASSET_OBJECT_MODELS_388 .incbin "./build/us_1.0/objects/models/unknown_29_388.bin" -glabel ASSET_29_389 +glabel ASSET_OBJECT_MODELS_389 .incbin "./build/us_1.0/objects/models/unknown_29_389.bin" -glabel ASSET_SECTION_29_END +glabel ASSET_OBJECT_MODELS_END + +/********** ASSET_ANIMATION_IDS **********/ .balign 16 -glabel ASSET_SECTION_30 -glabel ASSET_30_0 +glabel ASSET_ANIMATION_IDS .incbin "./build/us_1.0/objects/animation_ids.bin" -glabel ASSET_SECTION_30_END +glabel ASSET_ANIMATION_IDS_END + +/********** ASSET_OBJECT_ANIMATIONS_TABLE **********/ .balign 16 -glabel ASSET_SECTION_31 -.word ASSET_32_0 - ASSET_SECTION_32 -.word ASSET_32_1 - ASSET_SECTION_32 -.word ASSET_32_2 - ASSET_SECTION_32 -.word ASSET_32_3 - ASSET_SECTION_32 -.word ASSET_32_4 - ASSET_SECTION_32 -.word ASSET_32_5 - ASSET_SECTION_32 -.word ASSET_32_6 - ASSET_SECTION_32 -.word ASSET_32_7 - ASSET_SECTION_32 -.word ASSET_32_8 - ASSET_SECTION_32 -.word ASSET_32_9 - ASSET_SECTION_32 -.word ASSET_32_10 - ASSET_SECTION_32 -.word ASSET_32_11 - ASSET_SECTION_32 -.word ASSET_32_12 - ASSET_SECTION_32 -.word ASSET_32_13 - ASSET_SECTION_32 -.word ASSET_32_14 - ASSET_SECTION_32 -.word ASSET_32_15 - ASSET_SECTION_32 -.word ASSET_32_16 - ASSET_SECTION_32 -.word ASSET_32_17 - ASSET_SECTION_32 -.word ASSET_32_18 - ASSET_SECTION_32 -.word ASSET_32_19 - ASSET_SECTION_32 -.word ASSET_32_20 - ASSET_SECTION_32 -.word ASSET_32_21 - ASSET_SECTION_32 -.word ASSET_32_22 - ASSET_SECTION_32 -.word ASSET_32_23 - ASSET_SECTION_32 -.word ASSET_32_24 - ASSET_SECTION_32 -.word ASSET_32_25 - ASSET_SECTION_32 -.word ASSET_32_26 - ASSET_SECTION_32 -.word ASSET_32_27 - ASSET_SECTION_32 -.word ASSET_32_28 - ASSET_SECTION_32 -.word ASSET_32_29 - ASSET_SECTION_32 -.word ASSET_32_30 - ASSET_SECTION_32 -.word ASSET_32_31 - ASSET_SECTION_32 -.word ASSET_32_32 - ASSET_SECTION_32 -.word ASSET_32_33 - ASSET_SECTION_32 -.word ASSET_32_34 - ASSET_SECTION_32 -.word ASSET_32_35 - ASSET_SECTION_32 -.word ASSET_32_36 - ASSET_SECTION_32 -.word ASSET_32_37 - ASSET_SECTION_32 -.word ASSET_32_38 - ASSET_SECTION_32 -.word ASSET_32_39 - ASSET_SECTION_32 -.word ASSET_32_40 - ASSET_SECTION_32 -.word ASSET_32_41 - ASSET_SECTION_32 -.word ASSET_32_42 - ASSET_SECTION_32 -.word ASSET_32_43 - ASSET_SECTION_32 -.word ASSET_32_44 - ASSET_SECTION_32 -.word ASSET_32_45 - ASSET_SECTION_32 -.word ASSET_32_46 - ASSET_SECTION_32 -.word ASSET_32_47 - ASSET_SECTION_32 -.word ASSET_32_48 - ASSET_SECTION_32 -.word ASSET_32_49 - ASSET_SECTION_32 -.word ASSET_32_50 - ASSET_SECTION_32 -.word ASSET_32_51 - ASSET_SECTION_32 -.word ASSET_32_52 - ASSET_SECTION_32 -.word ASSET_32_53 - ASSET_SECTION_32 -.word ASSET_32_54 - ASSET_SECTION_32 -.word ASSET_32_55 - ASSET_SECTION_32 -.word ASSET_32_56 - ASSET_SECTION_32 -.word ASSET_32_57 - ASSET_SECTION_32 -.word ASSET_32_58 - ASSET_SECTION_32 -.word ASSET_32_59 - ASSET_SECTION_32 -.word ASSET_32_60 - ASSET_SECTION_32 -.word ASSET_32_61 - ASSET_SECTION_32 -.word ASSET_32_62 - ASSET_SECTION_32 -.word ASSET_32_63 - ASSET_SECTION_32 -.word ASSET_32_64 - ASSET_SECTION_32 -.word ASSET_32_65 - ASSET_SECTION_32 -.word ASSET_32_66 - ASSET_SECTION_32 -.word ASSET_32_67 - ASSET_SECTION_32 -.word ASSET_32_68 - ASSET_SECTION_32 -.word ASSET_32_69 - ASSET_SECTION_32 -.word ASSET_32_70 - ASSET_SECTION_32 -.word ASSET_32_71 - ASSET_SECTION_32 -.word ASSET_32_72 - ASSET_SECTION_32 -.word ASSET_32_73 - ASSET_SECTION_32 -.word ASSET_32_74 - ASSET_SECTION_32 -.word ASSET_32_75 - ASSET_SECTION_32 -.word ASSET_32_76 - ASSET_SECTION_32 -.word ASSET_32_77 - ASSET_SECTION_32 -.word ASSET_32_78 - ASSET_SECTION_32 -.word ASSET_32_79 - ASSET_SECTION_32 -.word ASSET_32_80 - ASSET_SECTION_32 -.word ASSET_32_81 - ASSET_SECTION_32 -.word ASSET_32_82 - ASSET_SECTION_32 -.word ASSET_32_83 - ASSET_SECTION_32 -.word ASSET_32_84 - ASSET_SECTION_32 -.word ASSET_32_85 - ASSET_SECTION_32 -.word ASSET_32_86 - ASSET_SECTION_32 -.word ASSET_32_87 - ASSET_SECTION_32 -.word ASSET_32_88 - ASSET_SECTION_32 -.word ASSET_32_89 - ASSET_SECTION_32 -.word ASSET_32_90 - ASSET_SECTION_32 -.word ASSET_32_91 - ASSET_SECTION_32 -.word ASSET_32_92 - ASSET_SECTION_32 -.word ASSET_32_93 - ASSET_SECTION_32 -.word ASSET_32_94 - ASSET_SECTION_32 -.word ASSET_32_95 - ASSET_SECTION_32 -.word ASSET_32_96 - ASSET_SECTION_32 -.word ASSET_32_97 - ASSET_SECTION_32 -.word ASSET_32_98 - ASSET_SECTION_32 -.word ASSET_32_99 - ASSET_SECTION_32 -.word ASSET_32_100 - ASSET_SECTION_32 -.word ASSET_32_101 - ASSET_SECTION_32 -.word ASSET_32_102 - ASSET_SECTION_32 -.word ASSET_32_103 - ASSET_SECTION_32 -.word ASSET_32_104 - ASSET_SECTION_32 -.word ASSET_32_105 - ASSET_SECTION_32 -.word ASSET_32_106 - ASSET_SECTION_32 -.word ASSET_32_107 - ASSET_SECTION_32 -.word ASSET_32_108 - ASSET_SECTION_32 -.word ASSET_32_109 - ASSET_SECTION_32 -.word ASSET_32_110 - ASSET_SECTION_32 -.word ASSET_32_111 - ASSET_SECTION_32 -.word ASSET_32_112 - ASSET_SECTION_32 -.word ASSET_32_113 - ASSET_SECTION_32 -.word ASSET_32_114 - ASSET_SECTION_32 -.word ASSET_32_115 - ASSET_SECTION_32 -.word ASSET_32_116 - ASSET_SECTION_32 -.word ASSET_32_117 - ASSET_SECTION_32 -.word ASSET_32_118 - ASSET_SECTION_32 -.word ASSET_32_119 - ASSET_SECTION_32 -.word ASSET_32_120 - ASSET_SECTION_32 -.word ASSET_32_121 - ASSET_SECTION_32 -.word ASSET_32_122 - ASSET_SECTION_32 -.word ASSET_32_123 - ASSET_SECTION_32 -.word ASSET_32_124 - ASSET_SECTION_32 -.word ASSET_32_125 - ASSET_SECTION_32 -.word ASSET_32_126 - ASSET_SECTION_32 -.word ASSET_32_127 - ASSET_SECTION_32 -.word ASSET_32_128 - ASSET_SECTION_32 -.word ASSET_32_129 - ASSET_SECTION_32 -.word ASSET_32_130 - ASSET_SECTION_32 -.word ASSET_32_131 - ASSET_SECTION_32 -.word ASSET_32_132 - ASSET_SECTION_32 -.word ASSET_32_133 - ASSET_SECTION_32 -.word ASSET_32_134 - ASSET_SECTION_32 -.word ASSET_32_135 - ASSET_SECTION_32 -.word ASSET_32_136 - ASSET_SECTION_32 -.word ASSET_32_137 - ASSET_SECTION_32 -.word ASSET_32_138 - ASSET_SECTION_32 -.word ASSET_32_139 - ASSET_SECTION_32 -.word ASSET_32_140 - ASSET_SECTION_32 -.word ASSET_32_141 - ASSET_SECTION_32 -.word ASSET_32_142 - ASSET_SECTION_32 -.word ASSET_32_143 - ASSET_SECTION_32 -.word ASSET_32_144 - ASSET_SECTION_32 -.word ASSET_32_145 - ASSET_SECTION_32 -.word ASSET_32_146 - ASSET_SECTION_32 -.word ASSET_32_147 - ASSET_SECTION_32 -.word ASSET_32_148 - ASSET_SECTION_32 -.word ASSET_32_149 - ASSET_SECTION_32 -.word ASSET_32_150 - ASSET_SECTION_32 -.word ASSET_32_151 - ASSET_SECTION_32 -.word ASSET_32_152 - ASSET_SECTION_32 -.word ASSET_32_153 - ASSET_SECTION_32 -.word ASSET_32_154 - ASSET_SECTION_32 -.word ASSET_32_155 - ASSET_SECTION_32 -.word ASSET_32_156 - ASSET_SECTION_32 -.word ASSET_32_157 - ASSET_SECTION_32 -.word ASSET_32_158 - ASSET_SECTION_32 -.word ASSET_32_159 - ASSET_SECTION_32 -.word ASSET_32_160 - ASSET_SECTION_32 -.word ASSET_32_161 - ASSET_SECTION_32 -.word ASSET_32_162 - ASSET_SECTION_32 -.word ASSET_32_163 - ASSET_SECTION_32 -.word ASSET_32_164 - ASSET_SECTION_32 -.word ASSET_32_165 - ASSET_SECTION_32 -.word ASSET_32_166 - ASSET_SECTION_32 -.word ASSET_32_167 - ASSET_SECTION_32 -.word ASSET_32_168 - ASSET_SECTION_32 -.word ASSET_32_169 - ASSET_SECTION_32 -.word ASSET_32_170 - ASSET_SECTION_32 -.word ASSET_32_171 - ASSET_SECTION_32 -.word ASSET_32_172 - ASSET_SECTION_32 -.word ASSET_32_173 - ASSET_SECTION_32 -.word ASSET_32_174 - ASSET_SECTION_32 -.word ASSET_32_175 - ASSET_SECTION_32 -.word ASSET_32_176 - ASSET_SECTION_32 -.word ASSET_32_177 - ASSET_SECTION_32 -.word ASSET_32_178 - ASSET_SECTION_32 -.word ASSET_32_179 - ASSET_SECTION_32 -.word ASSET_32_180 - ASSET_SECTION_32 -.word ASSET_32_181 - ASSET_SECTION_32 -.word ASSET_32_182 - ASSET_SECTION_32 -.word ASSET_32_183 - ASSET_SECTION_32 -.word ASSET_32_184 - ASSET_SECTION_32 -.word ASSET_32_185 - ASSET_SECTION_32 -.word ASSET_32_186 - ASSET_SECTION_32 -.word ASSET_32_187 - ASSET_SECTION_32 -.word ASSET_32_188 - ASSET_SECTION_32 -.word ASSET_32_189 - ASSET_SECTION_32 -.word ASSET_32_190 - ASSET_SECTION_32 -.word ASSET_32_191 - ASSET_SECTION_32 -.word ASSET_32_192 - ASSET_SECTION_32 -.word ASSET_32_193 - ASSET_SECTION_32 -.word ASSET_32_194 - ASSET_SECTION_32 -.word ASSET_32_195 - ASSET_SECTION_32 -.word ASSET_32_196 - ASSET_SECTION_32 -.word ASSET_32_197 - ASSET_SECTION_32 -.word ASSET_32_198 - ASSET_SECTION_32 -.word ASSET_32_199 - ASSET_SECTION_32 -.word ASSET_32_200 - ASSET_SECTION_32 -.word ASSET_32_201 - ASSET_SECTION_32 -.word ASSET_32_202 - ASSET_SECTION_32 -.word ASSET_32_203 - ASSET_SECTION_32 -.word ASSET_32_204 - ASSET_SECTION_32 -.word ASSET_32_205 - ASSET_SECTION_32 -.word ASSET_32_206 - ASSET_SECTION_32 -.word ASSET_32_207 - ASSET_SECTION_32 -.word ASSET_32_208 - ASSET_SECTION_32 -.word ASSET_32_209 - ASSET_SECTION_32 -.word ASSET_32_210 - ASSET_SECTION_32 -.word ASSET_32_211 - ASSET_SECTION_32 -.word ASSET_32_212 - ASSET_SECTION_32 -.word ASSET_32_213 - ASSET_SECTION_32 -.word ASSET_32_214 - ASSET_SECTION_32 -.word ASSET_32_215 - ASSET_SECTION_32 -.word ASSET_32_216 - ASSET_SECTION_32 -.word ASSET_32_217 - ASSET_SECTION_32 -.word ASSET_32_218 - ASSET_SECTION_32 -.word ASSET_32_219 - ASSET_SECTION_32 -.word ASSET_32_220 - ASSET_SECTION_32 -.word ASSET_32_221 - ASSET_SECTION_32 -.word ASSET_32_222 - ASSET_SECTION_32 -.word ASSET_32_223 - ASSET_SECTION_32 -.word ASSET_32_224 - ASSET_SECTION_32 -.word ASSET_32_225 - ASSET_SECTION_32 -.word ASSET_32_226 - ASSET_SECTION_32 -.word ASSET_32_227 - ASSET_SECTION_32 -.word ASSET_32_228 - ASSET_SECTION_32 -.word ASSET_32_229 - ASSET_SECTION_32 -.word ASSET_32_230 - ASSET_SECTION_32 -.word ASSET_32_231 - ASSET_SECTION_32 -.word ASSET_32_232 - ASSET_SECTION_32 -.word ASSET_32_233 - ASSET_SECTION_32 -.word ASSET_32_234 - ASSET_SECTION_32 -.word ASSET_32_235 - ASSET_SECTION_32 -.word ASSET_32_236 - ASSET_SECTION_32 -.word ASSET_32_237 - ASSET_SECTION_32 -.word ASSET_32_238 - ASSET_SECTION_32 -.word ASSET_32_239 - ASSET_SECTION_32 -.word ASSET_32_240 - ASSET_SECTION_32 -.word ASSET_32_241 - ASSET_SECTION_32 -.word ASSET_32_242 - ASSET_SECTION_32 -.word ASSET_32_243 - ASSET_SECTION_32 -.word ASSET_32_244 - ASSET_SECTION_32 -.word ASSET_32_245 - ASSET_SECTION_32 -.word ASSET_32_246 - ASSET_SECTION_32 -.word ASSET_32_247 - ASSET_SECTION_32 -.word ASSET_32_248 - ASSET_SECTION_32 -.word ASSET_32_249 - ASSET_SECTION_32 -.word ASSET_32_250 - ASSET_SECTION_32 -.word ASSET_32_251 - ASSET_SECTION_32 -.word ASSET_32_252 - ASSET_SECTION_32 -.word ASSET_32_253 - ASSET_SECTION_32 -.word ASSET_32_254 - ASSET_SECTION_32 -.word ASSET_32_255 - ASSET_SECTION_32 -.word ASSET_32_256 - ASSET_SECTION_32 -.word ASSET_32_257 - ASSET_SECTION_32 -.word ASSET_32_258 - ASSET_SECTION_32 -.word ASSET_32_259 - ASSET_SECTION_32 -.word ASSET_32_260 - ASSET_SECTION_32 -.word ASSET_32_261 - ASSET_SECTION_32 -.word ASSET_32_262 - ASSET_SECTION_32 -.word ASSET_32_263 - ASSET_SECTION_32 -.word ASSET_32_264 - ASSET_SECTION_32 -.word ASSET_32_265 - ASSET_SECTION_32 -.word ASSET_32_266 - ASSET_SECTION_32 -.word ASSET_32_267 - ASSET_SECTION_32 -.word ASSET_32_268 - ASSET_SECTION_32 -.word ASSET_32_269 - ASSET_SECTION_32 -.word ASSET_32_270 - ASSET_SECTION_32 -.word ASSET_32_271 - ASSET_SECTION_32 -.word ASSET_32_272 - ASSET_SECTION_32 -.word ASSET_32_273 - ASSET_SECTION_32 -.word ASSET_32_274 - ASSET_SECTION_32 -.word ASSET_32_275 - ASSET_SECTION_32 -.word ASSET_32_276 - ASSET_SECTION_32 -.word ASSET_32_277 - ASSET_SECTION_32 -.word ASSET_32_278 - ASSET_SECTION_32 -.word ASSET_32_279 - ASSET_SECTION_32 -.word ASSET_32_280 - ASSET_SECTION_32 -.word ASSET_32_281 - ASSET_SECTION_32 -.word ASSET_32_282 - ASSET_SECTION_32 -.word ASSET_32_283 - ASSET_SECTION_32 -.word ASSET_32_284 - ASSET_SECTION_32 -.word ASSET_32_285 - ASSET_SECTION_32 -.word ASSET_32_286 - ASSET_SECTION_32 -.word ASSET_32_287 - ASSET_SECTION_32 -.word ASSET_32_288 - ASSET_SECTION_32 -.word ASSET_32_289 - ASSET_SECTION_32 -.word ASSET_32_290 - ASSET_SECTION_32 -.word ASSET_32_291 - ASSET_SECTION_32 -.word ASSET_32_292 - ASSET_SECTION_32 -.word ASSET_32_293 - ASSET_SECTION_32 -.word ASSET_32_294 - ASSET_SECTION_32 -.word ASSET_32_295 - ASSET_SECTION_32 -.word ASSET_32_296 - ASSET_SECTION_32 -.word ASSET_32_297 - ASSET_SECTION_32 -.word ASSET_32_298 - ASSET_SECTION_32 -.word ASSET_32_299 - ASSET_SECTION_32 -.word ASSET_32_300 - ASSET_SECTION_32 -.word ASSET_32_301 - ASSET_SECTION_32 -.word ASSET_32_302 - ASSET_SECTION_32 -.word ASSET_32_303 - ASSET_SECTION_32 -.word ASSET_32_304 - ASSET_SECTION_32 -.word ASSET_32_305 - ASSET_SECTION_32 -.word ASSET_32_306 - ASSET_SECTION_32 -.word ASSET_32_307 - ASSET_SECTION_32 -.word ASSET_32_308 - ASSET_SECTION_32 -.word ASSET_32_309 - ASSET_SECTION_32 -.word ASSET_32_310 - ASSET_SECTION_32 -.word ASSET_32_311 - ASSET_SECTION_32 -.word ASSET_32_312 - ASSET_SECTION_32 -.word ASSET_32_313 - ASSET_SECTION_32 -.word ASSET_32_314 - ASSET_SECTION_32 -.word ASSET_32_315 - ASSET_SECTION_32 -.word ASSET_32_316 - ASSET_SECTION_32 -.word ASSET_32_317 - ASSET_SECTION_32 -.word ASSET_32_318 - ASSET_SECTION_32 -.word ASSET_32_319 - ASSET_SECTION_32 -.word ASSET_32_320 - ASSET_SECTION_32 -.word ASSET_32_321 - ASSET_SECTION_32 -.word ASSET_32_322 - ASSET_SECTION_32 -.word ASSET_32_323 - ASSET_SECTION_32 -.word ASSET_32_324 - ASSET_SECTION_32 -.word ASSET_32_325 - ASSET_SECTION_32 -.word ASSET_32_326 - ASSET_SECTION_32 -.word ASSET_32_327 - ASSET_SECTION_32 -.word ASSET_32_328 - ASSET_SECTION_32 -.word ASSET_32_329 - ASSET_SECTION_32 -.word ASSET_32_330 - ASSET_SECTION_32 -.word ASSET_32_331 - ASSET_SECTION_32 -.word ASSET_32_332 - ASSET_SECTION_32 -.word ASSET_32_333 - ASSET_SECTION_32 -.word ASSET_32_334 - ASSET_SECTION_32 -.word ASSET_32_335 - ASSET_SECTION_32 -.word ASSET_32_336 - ASSET_SECTION_32 -.word ASSET_32_337 - ASSET_SECTION_32 -.word ASSET_32_338 - ASSET_SECTION_32 -.word ASSET_32_339 - ASSET_SECTION_32 -.word ASSET_32_340 - ASSET_SECTION_32 -.word ASSET_32_341 - ASSET_SECTION_32 -.word ASSET_32_342 - ASSET_SECTION_32 -.word ASSET_32_343 - ASSET_SECTION_32 -.word ASSET_32_344 - ASSET_SECTION_32 -.word ASSET_32_345 - ASSET_SECTION_32 -.word ASSET_32_346 - ASSET_SECTION_32 -.word ASSET_32_347 - ASSET_SECTION_32 -.word ASSET_32_348 - ASSET_SECTION_32 -.word ASSET_32_349 - ASSET_SECTION_32 -.word ASSET_32_350 - ASSET_SECTION_32 -.word ASSET_32_351 - ASSET_SECTION_32 -.word ASSET_32_352 - ASSET_SECTION_32 -.word ASSET_32_353 - ASSET_SECTION_32 -.word ASSET_32_354 - ASSET_SECTION_32 -.word ASSET_32_355 - ASSET_SECTION_32 -.word ASSET_32_356 - ASSET_SECTION_32 -.word ASSET_32_357 - ASSET_SECTION_32 -.word ASSET_32_358 - ASSET_SECTION_32 -.word ASSET_32_359 - ASSET_SECTION_32 -.word ASSET_32_360 - ASSET_SECTION_32 -.word ASSET_32_361 - ASSET_SECTION_32 -.word ASSET_32_362 - ASSET_SECTION_32 -.word ASSET_32_363 - ASSET_SECTION_32 -.word ASSET_32_364 - ASSET_SECTION_32 -.word ASSET_32_365 - ASSET_SECTION_32 -.word ASSET_32_366 - ASSET_SECTION_32 -.word ASSET_32_367 - ASSET_SECTION_32 -.word ASSET_32_368 - ASSET_SECTION_32 -.word ASSET_32_369 - ASSET_SECTION_32 -.word ASSET_32_370 - ASSET_SECTION_32 -.word ASSET_32_371 - ASSET_SECTION_32 -.word ASSET_32_372 - ASSET_SECTION_32 -.word ASSET_32_373 - ASSET_SECTION_32 -.word ASSET_32_374 - ASSET_SECTION_32 -.word ASSET_32_375 - ASSET_SECTION_32 -.word ASSET_32_376 - ASSET_SECTION_32 -.word ASSET_32_377 - ASSET_SECTION_32 -.word ASSET_32_378 - ASSET_SECTION_32 -.word ASSET_32_379 - ASSET_SECTION_32 -.word ASSET_32_380 - ASSET_SECTION_32 -.word ASSET_32_381 - ASSET_SECTION_32 -.word ASSET_32_382 - ASSET_SECTION_32 -.word ASSET_32_383 - ASSET_SECTION_32 -.word ASSET_32_384 - ASSET_SECTION_32 -.word ASSET_32_385 - ASSET_SECTION_32 -.word ASSET_32_386 - ASSET_SECTION_32 -.word ASSET_32_387 - ASSET_SECTION_32 -.word ASSET_32_388 - ASSET_SECTION_32 -.word ASSET_32_389 - ASSET_SECTION_32 -.word ASSET_32_390 - ASSET_SECTION_32 -.word ASSET_32_391 - ASSET_SECTION_32 -.word ASSET_32_392 - ASSET_SECTION_32 -.word ASSET_32_393 - ASSET_SECTION_32 -.word ASSET_32_394 - ASSET_SECTION_32 -.word ASSET_32_395 - ASSET_SECTION_32 -.word ASSET_32_396 - ASSET_SECTION_32 -.word ASSET_32_397 - ASSET_SECTION_32 -.word ASSET_32_398 - ASSET_SECTION_32 -.word ASSET_32_399 - ASSET_SECTION_32 -.word ASSET_32_400 - ASSET_SECTION_32 -.word ASSET_32_401 - ASSET_SECTION_32 -.word ASSET_32_402 - ASSET_SECTION_32 -.word ASSET_32_403 - ASSET_SECTION_32 -.word ASSET_32_404 - ASSET_SECTION_32 -.word ASSET_32_405 - ASSET_SECTION_32 -.word ASSET_32_406 - ASSET_SECTION_32 -.word ASSET_32_407 - ASSET_SECTION_32 -.word ASSET_32_408 - ASSET_SECTION_32 -.word ASSET_32_409 - ASSET_SECTION_32 -.word ASSET_32_410 - ASSET_SECTION_32 -.word ASSET_32_411 - ASSET_SECTION_32 -.word ASSET_32_412 - ASSET_SECTION_32 -.word ASSET_32_413 - ASSET_SECTION_32 -.word ASSET_32_414 - ASSET_SECTION_32 -.word ASSET_32_415 - ASSET_SECTION_32 -.word ASSET_32_416 - ASSET_SECTION_32 -.word ASSET_32_417 - ASSET_SECTION_32 -.word ASSET_32_418 - ASSET_SECTION_32 -.word ASSET_32_419 - ASSET_SECTION_32 -.word ASSET_32_420 - ASSET_SECTION_32 -.word ASSET_32_421 - ASSET_SECTION_32 -.word ASSET_32_422 - ASSET_SECTION_32 -.word ASSET_32_423 - ASSET_SECTION_32 -.word ASSET_32_424 - ASSET_SECTION_32 -.word ASSET_32_425 - ASSET_SECTION_32 -.word ASSET_32_426 - ASSET_SECTION_32 -.word ASSET_32_427 - ASSET_SECTION_32 -.word ASSET_32_428 - ASSET_SECTION_32 -.word ASSET_32_429 - ASSET_SECTION_32 -.word ASSET_32_430 - ASSET_SECTION_32 -.word ASSET_32_431 - ASSET_SECTION_32 -.word ASSET_32_432 - ASSET_SECTION_32 -.word ASSET_32_433 - ASSET_SECTION_32 -.word ASSET_32_434 - ASSET_SECTION_32 -.word ASSET_32_435 - ASSET_SECTION_32 -.word ASSET_32_436 - ASSET_SECTION_32 -.word ASSET_32_437 - ASSET_SECTION_32 -.word ASSET_32_438 - ASSET_SECTION_32 -.word ASSET_32_439 - ASSET_SECTION_32 -.word ASSET_32_440 - ASSET_SECTION_32 -.word ASSET_32_441 - ASSET_SECTION_32 -.word ASSET_32_442 - ASSET_SECTION_32 -.word ASSET_32_443 - ASSET_SECTION_32 -.word ASSET_32_444 - ASSET_SECTION_32 -.word ASSET_32_445 - ASSET_SECTION_32 -.word ASSET_32_446 - ASSET_SECTION_32 -.word ASSET_32_447 - ASSET_SECTION_32 -.word ASSET_32_448 - ASSET_SECTION_32 -.word ASSET_32_449 - ASSET_SECTION_32 -.word ASSET_32_450 - ASSET_SECTION_32 -.word ASSET_32_451 - ASSET_SECTION_32 -.word ASSET_32_452 - ASSET_SECTION_32 -.word ASSET_32_453 - ASSET_SECTION_32 -.word ASSET_32_454 - ASSET_SECTION_32 -.word ASSET_32_455 - ASSET_SECTION_32 -.word ASSET_32_456 - ASSET_SECTION_32 -.word ASSET_32_457 - ASSET_SECTION_32 -.word ASSET_32_458 - ASSET_SECTION_32 -.word ASSET_32_459 - ASSET_SECTION_32 -.word ASSET_32_460 - ASSET_SECTION_32 -.word ASSET_32_461 - ASSET_SECTION_32 -.word ASSET_32_462 - ASSET_SECTION_32 -.word ASSET_32_463 - ASSET_SECTION_32 -.word ASSET_32_464 - ASSET_SECTION_32 -.word ASSET_32_465 - ASSET_SECTION_32 -.word ASSET_32_466 - ASSET_SECTION_32 -.word ASSET_32_467 - ASSET_SECTION_32 -.word ASSET_32_468 - ASSET_SECTION_32 -.word ASSET_32_469 - ASSET_SECTION_32 -.word ASSET_SECTION_32_END - ASSET_SECTION_32 +glabel ASSET_OBJECT_ANIMATIONS_TABLE +.word ASSET_OBJECT_ANIMATIONS_0 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_1 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_2 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_3 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_4 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_5 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_6 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_7 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_8 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_9 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_10 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_11 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_12 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_13 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_14 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_15 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_16 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_17 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_18 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_19 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_20 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_21 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_22 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_23 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_24 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_25 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_26 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_27 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_28 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_29 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_30 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_31 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_32 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_33 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_34 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_35 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_36 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_37 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_38 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_39 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_40 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_41 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_42 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_43 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_44 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_45 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_46 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_47 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_48 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_49 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_50 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_51 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_52 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_53 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_54 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_55 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_56 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_57 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_58 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_59 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_60 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_61 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_62 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_63 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_64 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_65 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_66 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_67 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_68 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_69 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_70 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_71 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_72 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_73 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_74 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_75 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_76 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_77 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_78 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_79 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_80 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_81 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_82 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_83 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_84 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_85 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_86 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_87 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_88 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_89 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_90 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_91 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_92 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_93 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_94 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_95 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_96 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_97 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_98 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_99 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_100 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_101 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_102 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_103 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_104 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_105 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_106 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_107 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_108 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_109 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_110 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_111 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_112 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_113 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_114 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_115 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_116 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_117 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_118 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_119 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_120 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_121 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_122 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_123 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_124 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_125 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_126 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_127 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_128 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_129 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_130 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_131 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_132 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_133 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_134 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_135 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_136 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_137 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_138 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_139 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_140 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_141 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_142 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_143 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_144 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_145 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_146 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_147 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_148 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_149 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_150 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_151 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_152 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_153 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_154 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_155 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_156 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_157 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_158 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_159 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_160 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_161 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_162 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_163 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_164 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_165 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_166 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_167 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_168 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_169 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_170 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_171 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_172 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_173 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_174 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_175 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_176 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_177 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_178 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_179 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_180 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_181 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_182 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_183 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_184 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_185 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_186 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_187 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_188 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_189 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_190 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_191 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_192 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_193 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_194 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_195 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_196 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_197 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_198 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_199 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_200 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_201 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_202 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_203 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_204 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_205 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_206 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_207 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_208 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_209 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_210 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_211 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_212 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_213 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_214 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_215 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_216 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_217 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_218 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_219 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_220 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_221 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_222 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_223 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_224 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_225 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_226 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_227 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_228 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_229 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_230 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_231 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_232 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_233 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_234 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_235 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_236 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_237 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_238 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_239 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_240 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_241 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_242 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_243 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_244 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_245 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_246 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_247 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_248 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_249 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_250 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_251 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_252 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_253 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_254 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_255 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_256 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_257 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_258 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_259 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_260 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_261 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_262 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_263 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_264 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_265 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_266 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_267 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_268 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_269 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_270 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_271 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_272 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_273 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_274 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_275 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_276 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_277 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_278 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_279 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_280 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_281 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_282 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_283 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_284 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_285 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_286 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_287 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_288 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_289 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_290 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_291 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_292 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_293 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_294 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_295 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_296 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_297 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_298 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_299 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_300 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_301 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_302 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_303 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_304 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_305 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_306 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_307 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_308 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_309 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_310 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_311 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_312 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_313 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_314 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_315 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_316 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_317 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_318 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_319 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_320 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_321 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_322 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_323 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_324 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_325 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_326 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_327 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_328 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_329 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_330 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_331 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_332 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_333 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_334 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_335 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_336 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_337 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_338 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_339 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_340 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_341 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_342 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_343 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_344 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_345 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_346 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_347 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_348 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_349 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_350 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_351 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_352 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_353 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_354 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_355 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_356 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_357 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_358 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_359 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_360 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_361 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_362 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_363 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_364 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_365 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_366 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_367 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_368 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_369 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_370 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_371 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_372 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_373 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_374 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_375 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_376 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_377 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_378 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_379 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_380 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_381 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_382 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_383 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_384 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_385 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_386 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_387 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_388 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_389 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_390 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_391 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_392 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_393 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_394 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_395 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_396 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_397 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_398 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_399 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_400 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_401 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_402 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_403 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_404 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_405 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_406 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_407 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_408 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_409 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_410 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_411 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_412 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_413 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_414 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_415 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_416 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_417 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_418 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_419 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_420 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_421 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_422 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_423 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_424 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_425 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_426 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_427 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_428 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_429 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_430 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_431 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_432 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_433 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_434 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_435 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_436 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_437 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_438 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_439 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_440 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_441 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_442 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_443 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_444 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_445 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_446 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_447 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_448 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_449 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_450 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_451 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_452 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_453 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_454 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_455 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_456 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_457 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_458 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_459 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_460 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_461 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_462 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_463 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_464 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_465 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_466 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_467 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_468 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_469 - ASSET_OBJECT_ANIMATIONS +.word ASSET_OBJECT_ANIMATIONS_END - ASSET_OBJECT_ANIMATIONS .word 0xFFFFFFFF -glabel ASSET_SECTION_31_END + +/********** ASSET_OBJECT_ANIMATIONS **********/ .balign 16 -glabel ASSET_SECTION_32 -glabel ASSET_32_0 +glabel ASSET_OBJECT_ANIMATIONS +glabel ASSET_OBJECT_ANIMATIONS_0 .incbin "./build/us_1.0/objects/animations/unknown_32_0.bin" -glabel ASSET_32_1 +glabel ASSET_OBJECT_ANIMATIONS_1 .incbin "./build/us_1.0/objects/animations/unknown_32_1.bin" -glabel ASSET_32_2 +glabel ASSET_OBJECT_ANIMATIONS_2 .incbin "./build/us_1.0/objects/animations/unknown_32_2.bin" -glabel ASSET_32_3 +glabel ASSET_OBJECT_ANIMATIONS_3 .incbin "./build/us_1.0/objects/animations/unknown_32_3.bin" -glabel ASSET_32_4 +glabel ASSET_OBJECT_ANIMATIONS_4 .incbin "./build/us_1.0/objects/animations/unknown_32_4.bin" -glabel ASSET_32_5 +glabel ASSET_OBJECT_ANIMATIONS_5 .incbin "./build/us_1.0/objects/animations/unknown_32_5.bin" -glabel ASSET_32_6 +glabel ASSET_OBJECT_ANIMATIONS_6 .incbin "./build/us_1.0/objects/animations/unknown_32_6.bin" -glabel ASSET_32_7 +glabel ASSET_OBJECT_ANIMATIONS_7 .incbin "./build/us_1.0/objects/animations/unknown_32_7.bin" -glabel ASSET_32_8 +glabel ASSET_OBJECT_ANIMATIONS_8 .incbin "./build/us_1.0/objects/animations/unknown_32_8.bin" -glabel ASSET_32_9 +glabel ASSET_OBJECT_ANIMATIONS_9 .incbin "./build/us_1.0/objects/animations/unknown_32_9.bin" -glabel ASSET_32_10 +glabel ASSET_OBJECT_ANIMATIONS_10 .incbin "./build/us_1.0/objects/animations/unknown_32_10.bin" -glabel ASSET_32_11 +glabel ASSET_OBJECT_ANIMATIONS_11 .incbin "./build/us_1.0/objects/animations/unknown_32_11.bin" -glabel ASSET_32_12 +glabel ASSET_OBJECT_ANIMATIONS_12 .incbin "./build/us_1.0/objects/animations/unknown_32_12.bin" -glabel ASSET_32_13 +glabel ASSET_OBJECT_ANIMATIONS_13 .incbin "./build/us_1.0/objects/animations/unknown_32_13.bin" -glabel ASSET_32_14 +glabel ASSET_OBJECT_ANIMATIONS_14 .incbin "./build/us_1.0/objects/animations/unknown_32_14.bin" -glabel ASSET_32_15 +glabel ASSET_OBJECT_ANIMATIONS_15 .incbin "./build/us_1.0/objects/animations/unknown_32_15.bin" -glabel ASSET_32_16 +glabel ASSET_OBJECT_ANIMATIONS_16 .incbin "./build/us_1.0/objects/animations/unknown_32_16.bin" -glabel ASSET_32_17 +glabel ASSET_OBJECT_ANIMATIONS_17 .incbin "./build/us_1.0/objects/animations/unknown_32_17.bin" -glabel ASSET_32_18 +glabel ASSET_OBJECT_ANIMATIONS_18 .incbin "./build/us_1.0/objects/animations/unknown_32_18.bin" -glabel ASSET_32_19 +glabel ASSET_OBJECT_ANIMATIONS_19 .incbin "./build/us_1.0/objects/animations/unknown_32_19.bin" -glabel ASSET_32_20 +glabel ASSET_OBJECT_ANIMATIONS_20 .incbin "./build/us_1.0/objects/animations/unknown_32_20.bin" -glabel ASSET_32_21 +glabel ASSET_OBJECT_ANIMATIONS_21 .incbin "./build/us_1.0/objects/animations/unknown_32_21.bin" -glabel ASSET_32_22 +glabel ASSET_OBJECT_ANIMATIONS_22 .incbin "./build/us_1.0/objects/animations/unknown_32_22.bin" -glabel ASSET_32_23 +glabel ASSET_OBJECT_ANIMATIONS_23 .incbin "./build/us_1.0/objects/animations/unknown_32_23.bin" -glabel ASSET_32_24 +glabel ASSET_OBJECT_ANIMATIONS_24 .incbin "./build/us_1.0/objects/animations/unknown_32_24.bin" -glabel ASSET_32_25 +glabel ASSET_OBJECT_ANIMATIONS_25 .incbin "./build/us_1.0/objects/animations/unknown_32_25.bin" -glabel ASSET_32_26 +glabel ASSET_OBJECT_ANIMATIONS_26 .incbin "./build/us_1.0/objects/animations/unknown_32_26.bin" -glabel ASSET_32_27 +glabel ASSET_OBJECT_ANIMATIONS_27 .incbin "./build/us_1.0/objects/animations/unknown_32_27.bin" -glabel ASSET_32_28 +glabel ASSET_OBJECT_ANIMATIONS_28 .incbin "./build/us_1.0/objects/animations/unknown_32_28.bin" -glabel ASSET_32_29 +glabel ASSET_OBJECT_ANIMATIONS_29 .incbin "./build/us_1.0/objects/animations/unknown_32_29.bin" -glabel ASSET_32_30 +glabel ASSET_OBJECT_ANIMATIONS_30 .incbin "./build/us_1.0/objects/animations/unknown_32_30.bin" -glabel ASSET_32_31 +glabel ASSET_OBJECT_ANIMATIONS_31 .incbin "./build/us_1.0/objects/animations/unknown_32_31.bin" -glabel ASSET_32_32 +glabel ASSET_OBJECT_ANIMATIONS_32 .incbin "./build/us_1.0/objects/animations/unknown_32_32.bin" -glabel ASSET_32_33 +glabel ASSET_OBJECT_ANIMATIONS_33 .incbin "./build/us_1.0/objects/animations/unknown_32_33.bin" -glabel ASSET_32_34 +glabel ASSET_OBJECT_ANIMATIONS_34 .incbin "./build/us_1.0/objects/animations/unknown_32_34.bin" -glabel ASSET_32_35 +glabel ASSET_OBJECT_ANIMATIONS_35 .incbin "./build/us_1.0/objects/animations/unknown_32_35.bin" -glabel ASSET_32_36 +glabel ASSET_OBJECT_ANIMATIONS_36 .incbin "./build/us_1.0/objects/animations/unknown_32_36.bin" -glabel ASSET_32_37 +glabel ASSET_OBJECT_ANIMATIONS_37 .incbin "./build/us_1.0/objects/animations/unknown_32_37.bin" -glabel ASSET_32_38 +glabel ASSET_OBJECT_ANIMATIONS_38 .incbin "./build/us_1.0/objects/animations/unknown_32_38.bin" -glabel ASSET_32_39 +glabel ASSET_OBJECT_ANIMATIONS_39 .incbin "./build/us_1.0/objects/animations/unknown_32_39.bin" -glabel ASSET_32_40 +glabel ASSET_OBJECT_ANIMATIONS_40 .incbin "./build/us_1.0/objects/animations/unknown_32_40.bin" -glabel ASSET_32_41 +glabel ASSET_OBJECT_ANIMATIONS_41 .incbin "./build/us_1.0/objects/animations/unknown_32_41.bin" -glabel ASSET_32_42 +glabel ASSET_OBJECT_ANIMATIONS_42 .incbin "./build/us_1.0/objects/animations/unknown_32_42.bin" -glabel ASSET_32_43 +glabel ASSET_OBJECT_ANIMATIONS_43 .incbin "./build/us_1.0/objects/animations/unknown_32_43.bin" -glabel ASSET_32_44 +glabel ASSET_OBJECT_ANIMATIONS_44 .incbin "./build/us_1.0/objects/animations/unknown_32_44.bin" -glabel ASSET_32_45 +glabel ASSET_OBJECT_ANIMATIONS_45 .incbin "./build/us_1.0/objects/animations/unknown_32_45.bin" -glabel ASSET_32_46 +glabel ASSET_OBJECT_ANIMATIONS_46 .incbin "./build/us_1.0/objects/animations/unknown_32_46.bin" -glabel ASSET_32_47 +glabel ASSET_OBJECT_ANIMATIONS_47 .incbin "./build/us_1.0/objects/animations/unknown_32_47.bin" -glabel ASSET_32_48 +glabel ASSET_OBJECT_ANIMATIONS_48 .incbin "./build/us_1.0/objects/animations/unknown_32_48.bin" -glabel ASSET_32_49 +glabel ASSET_OBJECT_ANIMATIONS_49 .incbin "./build/us_1.0/objects/animations/unknown_32_49.bin" -glabel ASSET_32_50 +glabel ASSET_OBJECT_ANIMATIONS_50 .incbin "./build/us_1.0/objects/animations/unknown_32_50.bin" -glabel ASSET_32_51 +glabel ASSET_OBJECT_ANIMATIONS_51 .incbin "./build/us_1.0/objects/animations/unknown_32_51.bin" -glabel ASSET_32_52 +glabel ASSET_OBJECT_ANIMATIONS_52 .incbin "./build/us_1.0/objects/animations/unknown_32_52.bin" -glabel ASSET_32_53 +glabel ASSET_OBJECT_ANIMATIONS_53 .incbin "./build/us_1.0/objects/animations/unknown_32_53.bin" -glabel ASSET_32_54 +glabel ASSET_OBJECT_ANIMATIONS_54 .incbin "./build/us_1.0/objects/animations/unknown_32_54.bin" -glabel ASSET_32_55 +glabel ASSET_OBJECT_ANIMATIONS_55 .incbin "./build/us_1.0/objects/animations/unknown_32_55.bin" -glabel ASSET_32_56 +glabel ASSET_OBJECT_ANIMATIONS_56 .incbin "./build/us_1.0/objects/animations/unknown_32_56.bin" -glabel ASSET_32_57 +glabel ASSET_OBJECT_ANIMATIONS_57 .incbin "./build/us_1.0/objects/animations/unknown_32_57.bin" -glabel ASSET_32_58 +glabel ASSET_OBJECT_ANIMATIONS_58 .incbin "./build/us_1.0/objects/animations/unknown_32_58.bin" -glabel ASSET_32_59 +glabel ASSET_OBJECT_ANIMATIONS_59 .incbin "./build/us_1.0/objects/animations/unknown_32_59.bin" -glabel ASSET_32_60 +glabel ASSET_OBJECT_ANIMATIONS_60 .incbin "./build/us_1.0/objects/animations/unknown_32_60.bin" -glabel ASSET_32_61 +glabel ASSET_OBJECT_ANIMATIONS_61 .incbin "./build/us_1.0/objects/animations/unknown_32_61.bin" -glabel ASSET_32_62 +glabel ASSET_OBJECT_ANIMATIONS_62 .incbin "./build/us_1.0/objects/animations/unknown_32_62.bin" -glabel ASSET_32_63 +glabel ASSET_OBJECT_ANIMATIONS_63 .incbin "./build/us_1.0/objects/animations/unknown_32_63.bin" -glabel ASSET_32_64 +glabel ASSET_OBJECT_ANIMATIONS_64 .incbin "./build/us_1.0/objects/animations/unknown_32_64.bin" -glabel ASSET_32_65 +glabel ASSET_OBJECT_ANIMATIONS_65 .incbin "./build/us_1.0/objects/animations/unknown_32_65.bin" -glabel ASSET_32_66 +glabel ASSET_OBJECT_ANIMATIONS_66 .incbin "./build/us_1.0/objects/animations/unknown_32_66.bin" -glabel ASSET_32_67 +glabel ASSET_OBJECT_ANIMATIONS_67 .incbin "./build/us_1.0/objects/animations/unknown_32_67.bin" -glabel ASSET_32_68 +glabel ASSET_OBJECT_ANIMATIONS_68 .incbin "./build/us_1.0/objects/animations/unknown_32_68.bin" -glabel ASSET_32_69 +glabel ASSET_OBJECT_ANIMATIONS_69 .incbin "./build/us_1.0/objects/animations/unknown_32_69.bin" -glabel ASSET_32_70 +glabel ASSET_OBJECT_ANIMATIONS_70 .incbin "./build/us_1.0/objects/animations/unknown_32_70.bin" -glabel ASSET_32_71 +glabel ASSET_OBJECT_ANIMATIONS_71 .incbin "./build/us_1.0/objects/animations/unknown_32_71.bin" -glabel ASSET_32_72 +glabel ASSET_OBJECT_ANIMATIONS_72 .incbin "./build/us_1.0/objects/animations/unknown_32_72.bin" -glabel ASSET_32_73 +glabel ASSET_OBJECT_ANIMATIONS_73 .incbin "./build/us_1.0/objects/animations/unknown_32_73.bin" -glabel ASSET_32_74 +glabel ASSET_OBJECT_ANIMATIONS_74 .incbin "./build/us_1.0/objects/animations/unknown_32_74.bin" -glabel ASSET_32_75 +glabel ASSET_OBJECT_ANIMATIONS_75 .incbin "./build/us_1.0/objects/animations/unknown_32_75.bin" -glabel ASSET_32_76 +glabel ASSET_OBJECT_ANIMATIONS_76 .incbin "./build/us_1.0/objects/animations/unknown_32_76.bin" -glabel ASSET_32_77 +glabel ASSET_OBJECT_ANIMATIONS_77 .incbin "./build/us_1.0/objects/animations/unknown_32_77.bin" -glabel ASSET_32_78 +glabel ASSET_OBJECT_ANIMATIONS_78 .incbin "./build/us_1.0/objects/animations/unknown_32_78.bin" -glabel ASSET_32_79 +glabel ASSET_OBJECT_ANIMATIONS_79 .incbin "./build/us_1.0/objects/animations/unknown_32_79.bin" -glabel ASSET_32_80 +glabel ASSET_OBJECT_ANIMATIONS_80 .incbin "./build/us_1.0/objects/animations/unknown_32_80.bin" -glabel ASSET_32_81 +glabel ASSET_OBJECT_ANIMATIONS_81 .incbin "./build/us_1.0/objects/animations/unknown_32_81.bin" -glabel ASSET_32_82 +glabel ASSET_OBJECT_ANIMATIONS_82 .incbin "./build/us_1.0/objects/animations/unknown_32_82.bin" -glabel ASSET_32_83 +glabel ASSET_OBJECT_ANIMATIONS_83 .incbin "./build/us_1.0/objects/animations/unknown_32_83.bin" -glabel ASSET_32_84 +glabel ASSET_OBJECT_ANIMATIONS_84 .incbin "./build/us_1.0/objects/animations/unknown_32_84.bin" -glabel ASSET_32_85 +glabel ASSET_OBJECT_ANIMATIONS_85 .incbin "./build/us_1.0/objects/animations/unknown_32_85.bin" -glabel ASSET_32_86 +glabel ASSET_OBJECT_ANIMATIONS_86 .incbin "./build/us_1.0/objects/animations/unknown_32_86.bin" -glabel ASSET_32_87 +glabel ASSET_OBJECT_ANIMATIONS_87 .incbin "./build/us_1.0/objects/animations/unknown_32_87.bin" -glabel ASSET_32_88 +glabel ASSET_OBJECT_ANIMATIONS_88 .incbin "./build/us_1.0/objects/animations/unknown_32_88.bin" -glabel ASSET_32_89 +glabel ASSET_OBJECT_ANIMATIONS_89 .incbin "./build/us_1.0/objects/animations/unknown_32_89.bin" -glabel ASSET_32_90 +glabel ASSET_OBJECT_ANIMATIONS_90 .incbin "./build/us_1.0/objects/animations/unknown_32_90.bin" -glabel ASSET_32_91 +glabel ASSET_OBJECT_ANIMATIONS_91 .incbin "./build/us_1.0/objects/animations/unknown_32_91.bin" -glabel ASSET_32_92 +glabel ASSET_OBJECT_ANIMATIONS_92 .incbin "./build/us_1.0/objects/animations/unknown_32_92.bin" -glabel ASSET_32_93 +glabel ASSET_OBJECT_ANIMATIONS_93 .incbin "./build/us_1.0/objects/animations/unknown_32_93.bin" -glabel ASSET_32_94 +glabel ASSET_OBJECT_ANIMATIONS_94 .incbin "./build/us_1.0/objects/animations/unknown_32_94.bin" -glabel ASSET_32_95 +glabel ASSET_OBJECT_ANIMATIONS_95 .incbin "./build/us_1.0/objects/animations/unknown_32_95.bin" -glabel ASSET_32_96 +glabel ASSET_OBJECT_ANIMATIONS_96 .incbin "./build/us_1.0/objects/animations/unknown_32_96.bin" -glabel ASSET_32_97 +glabel ASSET_OBJECT_ANIMATIONS_97 .incbin "./build/us_1.0/objects/animations/unknown_32_97.bin" -glabel ASSET_32_98 +glabel ASSET_OBJECT_ANIMATIONS_98 .incbin "./build/us_1.0/objects/animations/unknown_32_98.bin" -glabel ASSET_32_99 +glabel ASSET_OBJECT_ANIMATIONS_99 .incbin "./build/us_1.0/objects/animations/unknown_32_99.bin" -glabel ASSET_32_100 +glabel ASSET_OBJECT_ANIMATIONS_100 .incbin "./build/us_1.0/objects/animations/unknown_32_100.bin" -glabel ASSET_32_101 +glabel ASSET_OBJECT_ANIMATIONS_101 .incbin "./build/us_1.0/objects/animations/unknown_32_101.bin" -glabel ASSET_32_102 +glabel ASSET_OBJECT_ANIMATIONS_102 .incbin "./build/us_1.0/objects/animations/unknown_32_102.bin" -glabel ASSET_32_103 +glabel ASSET_OBJECT_ANIMATIONS_103 .incbin "./build/us_1.0/objects/animations/unknown_32_103.bin" -glabel ASSET_32_104 +glabel ASSET_OBJECT_ANIMATIONS_104 .incbin "./build/us_1.0/objects/animations/unknown_32_104.bin" -glabel ASSET_32_105 +glabel ASSET_OBJECT_ANIMATIONS_105 .incbin "./build/us_1.0/objects/animations/unknown_32_105.bin" -glabel ASSET_32_106 +glabel ASSET_OBJECT_ANIMATIONS_106 .incbin "./build/us_1.0/objects/animations/unknown_32_106.bin" -glabel ASSET_32_107 +glabel ASSET_OBJECT_ANIMATIONS_107 .incbin "./build/us_1.0/objects/animations/unknown_32_107.bin" -glabel ASSET_32_108 +glabel ASSET_OBJECT_ANIMATIONS_108 .incbin "./build/us_1.0/objects/animations/unknown_32_108.bin" -glabel ASSET_32_109 +glabel ASSET_OBJECT_ANIMATIONS_109 .incbin "./build/us_1.0/objects/animations/unknown_32_109.bin" -glabel ASSET_32_110 +glabel ASSET_OBJECT_ANIMATIONS_110 .incbin "./build/us_1.0/objects/animations/unknown_32_110.bin" -glabel ASSET_32_111 +glabel ASSET_OBJECT_ANIMATIONS_111 .incbin "./build/us_1.0/objects/animations/unknown_32_111.bin" -glabel ASSET_32_112 +glabel ASSET_OBJECT_ANIMATIONS_112 .incbin "./build/us_1.0/objects/animations/unknown_32_112.bin" -glabel ASSET_32_113 +glabel ASSET_OBJECT_ANIMATIONS_113 .incbin "./build/us_1.0/objects/animations/unknown_32_113.bin" -glabel ASSET_32_114 +glabel ASSET_OBJECT_ANIMATIONS_114 .incbin "./build/us_1.0/objects/animations/unknown_32_114.bin" -glabel ASSET_32_115 +glabel ASSET_OBJECT_ANIMATIONS_115 .incbin "./build/us_1.0/objects/animations/unknown_32_115.bin" -glabel ASSET_32_116 +glabel ASSET_OBJECT_ANIMATIONS_116 .incbin "./build/us_1.0/objects/animations/unknown_32_116.bin" -glabel ASSET_32_117 +glabel ASSET_OBJECT_ANIMATIONS_117 .incbin "./build/us_1.0/objects/animations/unknown_32_117.bin" -glabel ASSET_32_118 +glabel ASSET_OBJECT_ANIMATIONS_118 .incbin "./build/us_1.0/objects/animations/unknown_32_118.bin" -glabel ASSET_32_119 +glabel ASSET_OBJECT_ANIMATIONS_119 .incbin "./build/us_1.0/objects/animations/unknown_32_119.bin" -glabel ASSET_32_120 +glabel ASSET_OBJECT_ANIMATIONS_120 .incbin "./build/us_1.0/objects/animations/unknown_32_120.bin" -glabel ASSET_32_121 +glabel ASSET_OBJECT_ANIMATIONS_121 .incbin "./build/us_1.0/objects/animations/unknown_32_121.bin" -glabel ASSET_32_122 +glabel ASSET_OBJECT_ANIMATIONS_122 .incbin "./build/us_1.0/objects/animations/unknown_32_122.bin" -glabel ASSET_32_123 +glabel ASSET_OBJECT_ANIMATIONS_123 .incbin "./build/us_1.0/objects/animations/unknown_32_123.bin" -glabel ASSET_32_124 +glabel ASSET_OBJECT_ANIMATIONS_124 .incbin "./build/us_1.0/objects/animations/unknown_32_124.bin" -glabel ASSET_32_125 +glabel ASSET_OBJECT_ANIMATIONS_125 .incbin "./build/us_1.0/objects/animations/unknown_32_125.bin" -glabel ASSET_32_126 +glabel ASSET_OBJECT_ANIMATIONS_126 .incbin "./build/us_1.0/objects/animations/unknown_32_126.bin" -glabel ASSET_32_127 +glabel ASSET_OBJECT_ANIMATIONS_127 .incbin "./build/us_1.0/objects/animations/unknown_32_127.bin" -glabel ASSET_32_128 +glabel ASSET_OBJECT_ANIMATIONS_128 .incbin "./build/us_1.0/objects/animations/unknown_32_128.bin" -glabel ASSET_32_129 +glabel ASSET_OBJECT_ANIMATIONS_129 .incbin "./build/us_1.0/objects/animations/unknown_32_129.bin" -glabel ASSET_32_130 +glabel ASSET_OBJECT_ANIMATIONS_130 .incbin "./build/us_1.0/objects/animations/unknown_32_130.bin" -glabel ASSET_32_131 +glabel ASSET_OBJECT_ANIMATIONS_131 .incbin "./build/us_1.0/objects/animations/unknown_32_131.bin" -glabel ASSET_32_132 +glabel ASSET_OBJECT_ANIMATIONS_132 .incbin "./build/us_1.0/objects/animations/unknown_32_132.bin" -glabel ASSET_32_133 +glabel ASSET_OBJECT_ANIMATIONS_133 .incbin "./build/us_1.0/objects/animations/unknown_32_133.bin" -glabel ASSET_32_134 +glabel ASSET_OBJECT_ANIMATIONS_134 .incbin "./build/us_1.0/objects/animations/unknown_32_134.bin" -glabel ASSET_32_135 +glabel ASSET_OBJECT_ANIMATIONS_135 .incbin "./build/us_1.0/objects/animations/unknown_32_135.bin" -glabel ASSET_32_136 +glabel ASSET_OBJECT_ANIMATIONS_136 .incbin "./build/us_1.0/objects/animations/unknown_32_136.bin" -glabel ASSET_32_137 +glabel ASSET_OBJECT_ANIMATIONS_137 .incbin "./build/us_1.0/objects/animations/unknown_32_137.bin" -glabel ASSET_32_138 +glabel ASSET_OBJECT_ANIMATIONS_138 .incbin "./build/us_1.0/objects/animations/unknown_32_138.bin" -glabel ASSET_32_139 +glabel ASSET_OBJECT_ANIMATIONS_139 .incbin "./build/us_1.0/objects/animations/unknown_32_139.bin" -glabel ASSET_32_140 +glabel ASSET_OBJECT_ANIMATIONS_140 .incbin "./build/us_1.0/objects/animations/unknown_32_140.bin" -glabel ASSET_32_141 +glabel ASSET_OBJECT_ANIMATIONS_141 .incbin "./build/us_1.0/objects/animations/unknown_32_141.bin" -glabel ASSET_32_142 +glabel ASSET_OBJECT_ANIMATIONS_142 .incbin "./build/us_1.0/objects/animations/unknown_32_142.bin" -glabel ASSET_32_143 +glabel ASSET_OBJECT_ANIMATIONS_143 .incbin "./build/us_1.0/objects/animations/unknown_32_143.bin" -glabel ASSET_32_144 +glabel ASSET_OBJECT_ANIMATIONS_144 .incbin "./build/us_1.0/objects/animations/unknown_32_144.bin" -glabel ASSET_32_145 +glabel ASSET_OBJECT_ANIMATIONS_145 .incbin "./build/us_1.0/objects/animations/unknown_32_145.bin" -glabel ASSET_32_146 +glabel ASSET_OBJECT_ANIMATIONS_146 .incbin "./build/us_1.0/objects/animations/unknown_32_146.bin" -glabel ASSET_32_147 +glabel ASSET_OBJECT_ANIMATIONS_147 .incbin "./build/us_1.0/objects/animations/unknown_32_147.bin" -glabel ASSET_32_148 +glabel ASSET_OBJECT_ANIMATIONS_148 .incbin "./build/us_1.0/objects/animations/unknown_32_148.bin" -glabel ASSET_32_149 +glabel ASSET_OBJECT_ANIMATIONS_149 .incbin "./build/us_1.0/objects/animations/unknown_32_149.bin" -glabel ASSET_32_150 +glabel ASSET_OBJECT_ANIMATIONS_150 .incbin "./build/us_1.0/objects/animations/unknown_32_150.bin" -glabel ASSET_32_151 +glabel ASSET_OBJECT_ANIMATIONS_151 .incbin "./build/us_1.0/objects/animations/unknown_32_151.bin" -glabel ASSET_32_152 +glabel ASSET_OBJECT_ANIMATIONS_152 .incbin "./build/us_1.0/objects/animations/unknown_32_152.bin" -glabel ASSET_32_153 +glabel ASSET_OBJECT_ANIMATIONS_153 .incbin "./build/us_1.0/objects/animations/unknown_32_153.bin" -glabel ASSET_32_154 +glabel ASSET_OBJECT_ANIMATIONS_154 .incbin "./build/us_1.0/objects/animations/unknown_32_154.bin" -glabel ASSET_32_155 +glabel ASSET_OBJECT_ANIMATIONS_155 .incbin "./build/us_1.0/objects/animations/unknown_32_155.bin" -glabel ASSET_32_156 +glabel ASSET_OBJECT_ANIMATIONS_156 .incbin "./build/us_1.0/objects/animations/unknown_32_156.bin" -glabel ASSET_32_157 +glabel ASSET_OBJECT_ANIMATIONS_157 .incbin "./build/us_1.0/objects/animations/unknown_32_157.bin" -glabel ASSET_32_158 +glabel ASSET_OBJECT_ANIMATIONS_158 .incbin "./build/us_1.0/objects/animations/unknown_32_158.bin" -glabel ASSET_32_159 +glabel ASSET_OBJECT_ANIMATIONS_159 .incbin "./build/us_1.0/objects/animations/unknown_32_159.bin" -glabel ASSET_32_160 +glabel ASSET_OBJECT_ANIMATIONS_160 .incbin "./build/us_1.0/objects/animations/unknown_32_160.bin" -glabel ASSET_32_161 +glabel ASSET_OBJECT_ANIMATIONS_161 .incbin "./build/us_1.0/objects/animations/unknown_32_161.bin" -glabel ASSET_32_162 +glabel ASSET_OBJECT_ANIMATIONS_162 .incbin "./build/us_1.0/objects/animations/unknown_32_162.bin" -glabel ASSET_32_163 +glabel ASSET_OBJECT_ANIMATIONS_163 .incbin "./build/us_1.0/objects/animations/unknown_32_163.bin" -glabel ASSET_32_164 +glabel ASSET_OBJECT_ANIMATIONS_164 .incbin "./build/us_1.0/objects/animations/unknown_32_164.bin" -glabel ASSET_32_165 +glabel ASSET_OBJECT_ANIMATIONS_165 .incbin "./build/us_1.0/objects/animations/unknown_32_165.bin" -glabel ASSET_32_166 +glabel ASSET_OBJECT_ANIMATIONS_166 .incbin "./build/us_1.0/objects/animations/unknown_32_166.bin" -glabel ASSET_32_167 +glabel ASSET_OBJECT_ANIMATIONS_167 .incbin "./build/us_1.0/objects/animations/unknown_32_167.bin" -glabel ASSET_32_168 +glabel ASSET_OBJECT_ANIMATIONS_168 .incbin "./build/us_1.0/objects/animations/unknown_32_168.bin" -glabel ASSET_32_169 +glabel ASSET_OBJECT_ANIMATIONS_169 .incbin "./build/us_1.0/objects/animations/unknown_32_169.bin" -glabel ASSET_32_170 +glabel ASSET_OBJECT_ANIMATIONS_170 .incbin "./build/us_1.0/objects/animations/unknown_32_170.bin" -glabel ASSET_32_171 +glabel ASSET_OBJECT_ANIMATIONS_171 .incbin "./build/us_1.0/objects/animations/unknown_32_171.bin" -glabel ASSET_32_172 +glabel ASSET_OBJECT_ANIMATIONS_172 .incbin "./build/us_1.0/objects/animations/unknown_32_172.bin" -glabel ASSET_32_173 +glabel ASSET_OBJECT_ANIMATIONS_173 .incbin "./build/us_1.0/objects/animations/unknown_32_173.bin" -glabel ASSET_32_174 +glabel ASSET_OBJECT_ANIMATIONS_174 .incbin "./build/us_1.0/objects/animations/unknown_32_174.bin" -glabel ASSET_32_175 +glabel ASSET_OBJECT_ANIMATIONS_175 .incbin "./build/us_1.0/objects/animations/unknown_32_175.bin" -glabel ASSET_32_176 +glabel ASSET_OBJECT_ANIMATIONS_176 .incbin "./build/us_1.0/objects/animations/unknown_32_176.bin" -glabel ASSET_32_177 +glabel ASSET_OBJECT_ANIMATIONS_177 .incbin "./build/us_1.0/objects/animations/unknown_32_177.bin" -glabel ASSET_32_178 +glabel ASSET_OBJECT_ANIMATIONS_178 .incbin "./build/us_1.0/objects/animations/unknown_32_178.bin" -glabel ASSET_32_179 +glabel ASSET_OBJECT_ANIMATIONS_179 .incbin "./build/us_1.0/objects/animations/unknown_32_179.bin" -glabel ASSET_32_180 +glabel ASSET_OBJECT_ANIMATIONS_180 .incbin "./build/us_1.0/objects/animations/unknown_32_180.bin" -glabel ASSET_32_181 +glabel ASSET_OBJECT_ANIMATIONS_181 .incbin "./build/us_1.0/objects/animations/unknown_32_181.bin" -glabel ASSET_32_182 +glabel ASSET_OBJECT_ANIMATIONS_182 .incbin "./build/us_1.0/objects/animations/unknown_32_182.bin" -glabel ASSET_32_183 +glabel ASSET_OBJECT_ANIMATIONS_183 .incbin "./build/us_1.0/objects/animations/unknown_32_183.bin" -glabel ASSET_32_184 +glabel ASSET_OBJECT_ANIMATIONS_184 .incbin "./build/us_1.0/objects/animations/unknown_32_184.bin" -glabel ASSET_32_185 +glabel ASSET_OBJECT_ANIMATIONS_185 .incbin "./build/us_1.0/objects/animations/unknown_32_185.bin" -glabel ASSET_32_186 +glabel ASSET_OBJECT_ANIMATIONS_186 .incbin "./build/us_1.0/objects/animations/unknown_32_186.bin" -glabel ASSET_32_187 +glabel ASSET_OBJECT_ANIMATIONS_187 .incbin "./build/us_1.0/objects/animations/unknown_32_187.bin" -glabel ASSET_32_188 +glabel ASSET_OBJECT_ANIMATIONS_188 .incbin "./build/us_1.0/objects/animations/unknown_32_188.bin" -glabel ASSET_32_189 +glabel ASSET_OBJECT_ANIMATIONS_189 .incbin "./build/us_1.0/objects/animations/unknown_32_189.bin" -glabel ASSET_32_190 +glabel ASSET_OBJECT_ANIMATIONS_190 .incbin "./build/us_1.0/objects/animations/unknown_32_190.bin" -glabel ASSET_32_191 +glabel ASSET_OBJECT_ANIMATIONS_191 .incbin "./build/us_1.0/objects/animations/unknown_32_191.bin" -glabel ASSET_32_192 +glabel ASSET_OBJECT_ANIMATIONS_192 .incbin "./build/us_1.0/objects/animations/unknown_32_192.bin" -glabel ASSET_32_193 +glabel ASSET_OBJECT_ANIMATIONS_193 .incbin "./build/us_1.0/objects/animations/unknown_32_193.bin" -glabel ASSET_32_194 +glabel ASSET_OBJECT_ANIMATIONS_194 .incbin "./build/us_1.0/objects/animations/unknown_32_194.bin" -glabel ASSET_32_195 +glabel ASSET_OBJECT_ANIMATIONS_195 .incbin "./build/us_1.0/objects/animations/unknown_32_195.bin" -glabel ASSET_32_196 +glabel ASSET_OBJECT_ANIMATIONS_196 .incbin "./build/us_1.0/objects/animations/unknown_32_196.bin" -glabel ASSET_32_197 +glabel ASSET_OBJECT_ANIMATIONS_197 .incbin "./build/us_1.0/objects/animations/unknown_32_197.bin" -glabel ASSET_32_198 +glabel ASSET_OBJECT_ANIMATIONS_198 .incbin "./build/us_1.0/objects/animations/unknown_32_198.bin" -glabel ASSET_32_199 +glabel ASSET_OBJECT_ANIMATIONS_199 .incbin "./build/us_1.0/objects/animations/unknown_32_199.bin" -glabel ASSET_32_200 +glabel ASSET_OBJECT_ANIMATIONS_200 .incbin "./build/us_1.0/objects/animations/unknown_32_200.bin" -glabel ASSET_32_201 +glabel ASSET_OBJECT_ANIMATIONS_201 .incbin "./build/us_1.0/objects/animations/unknown_32_201.bin" -glabel ASSET_32_202 +glabel ASSET_OBJECT_ANIMATIONS_202 .incbin "./build/us_1.0/objects/animations/unknown_32_202.bin" -glabel ASSET_32_203 +glabel ASSET_OBJECT_ANIMATIONS_203 .incbin "./build/us_1.0/objects/animations/unknown_32_203.bin" -glabel ASSET_32_204 +glabel ASSET_OBJECT_ANIMATIONS_204 .incbin "./build/us_1.0/objects/animations/unknown_32_204.bin" -glabel ASSET_32_205 +glabel ASSET_OBJECT_ANIMATIONS_205 .incbin "./build/us_1.0/objects/animations/unknown_32_205.bin" -glabel ASSET_32_206 +glabel ASSET_OBJECT_ANIMATIONS_206 .incbin "./build/us_1.0/objects/animations/unknown_32_206.bin" -glabel ASSET_32_207 +glabel ASSET_OBJECT_ANIMATIONS_207 .incbin "./build/us_1.0/objects/animations/unknown_32_207.bin" -glabel ASSET_32_208 +glabel ASSET_OBJECT_ANIMATIONS_208 .incbin "./build/us_1.0/objects/animations/unknown_32_208.bin" -glabel ASSET_32_209 +glabel ASSET_OBJECT_ANIMATIONS_209 .incbin "./build/us_1.0/objects/animations/unknown_32_209.bin" -glabel ASSET_32_210 +glabel ASSET_OBJECT_ANIMATIONS_210 .incbin "./build/us_1.0/objects/animations/unknown_32_210.bin" -glabel ASSET_32_211 +glabel ASSET_OBJECT_ANIMATIONS_211 .incbin "./build/us_1.0/objects/animations/unknown_32_211.bin" -glabel ASSET_32_212 +glabel ASSET_OBJECT_ANIMATIONS_212 .incbin "./build/us_1.0/objects/animations/unknown_32_212.bin" -glabel ASSET_32_213 +glabel ASSET_OBJECT_ANIMATIONS_213 .incbin "./build/us_1.0/objects/animations/unknown_32_213.bin" -glabel ASSET_32_214 +glabel ASSET_OBJECT_ANIMATIONS_214 .incbin "./build/us_1.0/objects/animations/unknown_32_214.bin" -glabel ASSET_32_215 +glabel ASSET_OBJECT_ANIMATIONS_215 .incbin "./build/us_1.0/objects/animations/unknown_32_215.bin" -glabel ASSET_32_216 +glabel ASSET_OBJECT_ANIMATIONS_216 .incbin "./build/us_1.0/objects/animations/unknown_32_216.bin" -glabel ASSET_32_217 +glabel ASSET_OBJECT_ANIMATIONS_217 .incbin "./build/us_1.0/objects/animations/unknown_32_217.bin" -glabel ASSET_32_218 +glabel ASSET_OBJECT_ANIMATIONS_218 .incbin "./build/us_1.0/objects/animations/unknown_32_218.bin" -glabel ASSET_32_219 +glabel ASSET_OBJECT_ANIMATIONS_219 .incbin "./build/us_1.0/objects/animations/unknown_32_219.bin" -glabel ASSET_32_220 +glabel ASSET_OBJECT_ANIMATIONS_220 .incbin "./build/us_1.0/objects/animations/unknown_32_220.bin" -glabel ASSET_32_221 +glabel ASSET_OBJECT_ANIMATIONS_221 .incbin "./build/us_1.0/objects/animations/unknown_32_221.bin" -glabel ASSET_32_222 +glabel ASSET_OBJECT_ANIMATIONS_222 .incbin "./build/us_1.0/objects/animations/unknown_32_222.bin" -glabel ASSET_32_223 +glabel ASSET_OBJECT_ANIMATIONS_223 .incbin "./build/us_1.0/objects/animations/unknown_32_223.bin" -glabel ASSET_32_224 +glabel ASSET_OBJECT_ANIMATIONS_224 .incbin "./build/us_1.0/objects/animations/unknown_32_224.bin" -glabel ASSET_32_225 +glabel ASSET_OBJECT_ANIMATIONS_225 .incbin "./build/us_1.0/objects/animations/unknown_32_225.bin" -glabel ASSET_32_226 +glabel ASSET_OBJECT_ANIMATIONS_226 .incbin "./build/us_1.0/objects/animations/unknown_32_226.bin" -glabel ASSET_32_227 +glabel ASSET_OBJECT_ANIMATIONS_227 .incbin "./build/us_1.0/objects/animations/unknown_32_227.bin" -glabel ASSET_32_228 +glabel ASSET_OBJECT_ANIMATIONS_228 .incbin "./build/us_1.0/objects/animations/unknown_32_228.bin" -glabel ASSET_32_229 +glabel ASSET_OBJECT_ANIMATIONS_229 .incbin "./build/us_1.0/objects/animations/unknown_32_229.bin" -glabel ASSET_32_230 +glabel ASSET_OBJECT_ANIMATIONS_230 .incbin "./build/us_1.0/objects/animations/unknown_32_230.bin" -glabel ASSET_32_231 +glabel ASSET_OBJECT_ANIMATIONS_231 .incbin "./build/us_1.0/objects/animations/unknown_32_231.bin" -glabel ASSET_32_232 +glabel ASSET_OBJECT_ANIMATIONS_232 .incbin "./build/us_1.0/objects/animations/unknown_32_232.bin" -glabel ASSET_32_233 +glabel ASSET_OBJECT_ANIMATIONS_233 .incbin "./build/us_1.0/objects/animations/unknown_32_233.bin" -glabel ASSET_32_234 +glabel ASSET_OBJECT_ANIMATIONS_234 .incbin "./build/us_1.0/objects/animations/unknown_32_234.bin" -glabel ASSET_32_235 +glabel ASSET_OBJECT_ANIMATIONS_235 .incbin "./build/us_1.0/objects/animations/unknown_32_235.bin" -glabel ASSET_32_236 +glabel ASSET_OBJECT_ANIMATIONS_236 .incbin "./build/us_1.0/objects/animations/unknown_32_236.bin" -glabel ASSET_32_237 +glabel ASSET_OBJECT_ANIMATIONS_237 .incbin "./build/us_1.0/objects/animations/unknown_32_237.bin" -glabel ASSET_32_238 +glabel ASSET_OBJECT_ANIMATIONS_238 .incbin "./build/us_1.0/objects/animations/unknown_32_238.bin" -glabel ASSET_32_239 +glabel ASSET_OBJECT_ANIMATIONS_239 .incbin "./build/us_1.0/objects/animations/unknown_32_239.bin" -glabel ASSET_32_240 +glabel ASSET_OBJECT_ANIMATIONS_240 .incbin "./build/us_1.0/objects/animations/unknown_32_240.bin" -glabel ASSET_32_241 +glabel ASSET_OBJECT_ANIMATIONS_241 .incbin "./build/us_1.0/objects/animations/unknown_32_241.bin" -glabel ASSET_32_242 +glabel ASSET_OBJECT_ANIMATIONS_242 .incbin "./build/us_1.0/objects/animations/unknown_32_242.bin" -glabel ASSET_32_243 +glabel ASSET_OBJECT_ANIMATIONS_243 .incbin "./build/us_1.0/objects/animations/unknown_32_243.bin" -glabel ASSET_32_244 +glabel ASSET_OBJECT_ANIMATIONS_244 .incbin "./build/us_1.0/objects/animations/unknown_32_244.bin" -glabel ASSET_32_245 +glabel ASSET_OBJECT_ANIMATIONS_245 .incbin "./build/us_1.0/objects/animations/unknown_32_245.bin" -glabel ASSET_32_246 +glabel ASSET_OBJECT_ANIMATIONS_246 .incbin "./build/us_1.0/objects/animations/unknown_32_246.bin" -glabel ASSET_32_247 +glabel ASSET_OBJECT_ANIMATIONS_247 .incbin "./build/us_1.0/objects/animations/unknown_32_247.bin" -glabel ASSET_32_248 +glabel ASSET_OBJECT_ANIMATIONS_248 .incbin "./build/us_1.0/objects/animations/unknown_32_248.bin" -glabel ASSET_32_249 +glabel ASSET_OBJECT_ANIMATIONS_249 .incbin "./build/us_1.0/objects/animations/unknown_32_249.bin" -glabel ASSET_32_250 +glabel ASSET_OBJECT_ANIMATIONS_250 .incbin "./build/us_1.0/objects/animations/unknown_32_250.bin" -glabel ASSET_32_251 +glabel ASSET_OBJECT_ANIMATIONS_251 .incbin "./build/us_1.0/objects/animations/unknown_32_251.bin" -glabel ASSET_32_252 +glabel ASSET_OBJECT_ANIMATIONS_252 .incbin "./build/us_1.0/objects/animations/unknown_32_252.bin" -glabel ASSET_32_253 +glabel ASSET_OBJECT_ANIMATIONS_253 .incbin "./build/us_1.0/objects/animations/unknown_32_253.bin" -glabel ASSET_32_254 +glabel ASSET_OBJECT_ANIMATIONS_254 .incbin "./build/us_1.0/objects/animations/unknown_32_254.bin" -glabel ASSET_32_255 +glabel ASSET_OBJECT_ANIMATIONS_255 .incbin "./build/us_1.0/objects/animations/unknown_32_255.bin" -glabel ASSET_32_256 +glabel ASSET_OBJECT_ANIMATIONS_256 .incbin "./build/us_1.0/objects/animations/unknown_32_256.bin" -glabel ASSET_32_257 +glabel ASSET_OBJECT_ANIMATIONS_257 .incbin "./build/us_1.0/objects/animations/unknown_32_257.bin" -glabel ASSET_32_258 +glabel ASSET_OBJECT_ANIMATIONS_258 .incbin "./build/us_1.0/objects/animations/unknown_32_258.bin" -glabel ASSET_32_259 +glabel ASSET_OBJECT_ANIMATIONS_259 .incbin "./build/us_1.0/objects/animations/unknown_32_259.bin" -glabel ASSET_32_260 +glabel ASSET_OBJECT_ANIMATIONS_260 .incbin "./build/us_1.0/objects/animations/unknown_32_260.bin" -glabel ASSET_32_261 +glabel ASSET_OBJECT_ANIMATIONS_261 .incbin "./build/us_1.0/objects/animations/unknown_32_261.bin" -glabel ASSET_32_262 +glabel ASSET_OBJECT_ANIMATIONS_262 .incbin "./build/us_1.0/objects/animations/unknown_32_262.bin" -glabel ASSET_32_263 +glabel ASSET_OBJECT_ANIMATIONS_263 .incbin "./build/us_1.0/objects/animations/unknown_32_263.bin" -glabel ASSET_32_264 +glabel ASSET_OBJECT_ANIMATIONS_264 .incbin "./build/us_1.0/objects/animations/unknown_32_264.bin" -glabel ASSET_32_265 +glabel ASSET_OBJECT_ANIMATIONS_265 .incbin "./build/us_1.0/objects/animations/unknown_32_265.bin" -glabel ASSET_32_266 +glabel ASSET_OBJECT_ANIMATIONS_266 .incbin "./build/us_1.0/objects/animations/unknown_32_266.bin" -glabel ASSET_32_267 +glabel ASSET_OBJECT_ANIMATIONS_267 .incbin "./build/us_1.0/objects/animations/unknown_32_267.bin" -glabel ASSET_32_268 +glabel ASSET_OBJECT_ANIMATIONS_268 .incbin "./build/us_1.0/objects/animations/unknown_32_268.bin" -glabel ASSET_32_269 +glabel ASSET_OBJECT_ANIMATIONS_269 .incbin "./build/us_1.0/objects/animations/unknown_32_269.bin" -glabel ASSET_32_270 +glabel ASSET_OBJECT_ANIMATIONS_270 .incbin "./build/us_1.0/objects/animations/unknown_32_270.bin" -glabel ASSET_32_271 +glabel ASSET_OBJECT_ANIMATIONS_271 .incbin "./build/us_1.0/objects/animations/unknown_32_271.bin" -glabel ASSET_32_272 +glabel ASSET_OBJECT_ANIMATIONS_272 .incbin "./build/us_1.0/objects/animations/unknown_32_272.bin" -glabel ASSET_32_273 +glabel ASSET_OBJECT_ANIMATIONS_273 .incbin "./build/us_1.0/objects/animations/unknown_32_273.bin" -glabel ASSET_32_274 +glabel ASSET_OBJECT_ANIMATIONS_274 .incbin "./build/us_1.0/objects/animations/unknown_32_274.bin" -glabel ASSET_32_275 +glabel ASSET_OBJECT_ANIMATIONS_275 .incbin "./build/us_1.0/objects/animations/unknown_32_275.bin" -glabel ASSET_32_276 +glabel ASSET_OBJECT_ANIMATIONS_276 .incbin "./build/us_1.0/objects/animations/unknown_32_276.bin" -glabel ASSET_32_277 +glabel ASSET_OBJECT_ANIMATIONS_277 .incbin "./build/us_1.0/objects/animations/unknown_32_277.bin" -glabel ASSET_32_278 +glabel ASSET_OBJECT_ANIMATIONS_278 .incbin "./build/us_1.0/objects/animations/unknown_32_278.bin" -glabel ASSET_32_279 +glabel ASSET_OBJECT_ANIMATIONS_279 .incbin "./build/us_1.0/objects/animations/unknown_32_279.bin" -glabel ASSET_32_280 +glabel ASSET_OBJECT_ANIMATIONS_280 .incbin "./build/us_1.0/objects/animations/unknown_32_280.bin" -glabel ASSET_32_281 +glabel ASSET_OBJECT_ANIMATIONS_281 .incbin "./build/us_1.0/objects/animations/unknown_32_281.bin" -glabel ASSET_32_282 +glabel ASSET_OBJECT_ANIMATIONS_282 .incbin "./build/us_1.0/objects/animations/unknown_32_282.bin" -glabel ASSET_32_283 +glabel ASSET_OBJECT_ANIMATIONS_283 .incbin "./build/us_1.0/objects/animations/unknown_32_283.bin" -glabel ASSET_32_284 +glabel ASSET_OBJECT_ANIMATIONS_284 .incbin "./build/us_1.0/objects/animations/unknown_32_284.bin" -glabel ASSET_32_285 +glabel ASSET_OBJECT_ANIMATIONS_285 .incbin "./build/us_1.0/objects/animations/unknown_32_285.bin" -glabel ASSET_32_286 +glabel ASSET_OBJECT_ANIMATIONS_286 .incbin "./build/us_1.0/objects/animations/unknown_32_286.bin" -glabel ASSET_32_287 +glabel ASSET_OBJECT_ANIMATIONS_287 .incbin "./build/us_1.0/objects/animations/unknown_32_287.bin" -glabel ASSET_32_288 +glabel ASSET_OBJECT_ANIMATIONS_288 .incbin "./build/us_1.0/objects/animations/unknown_32_288.bin" -glabel ASSET_32_289 +glabel ASSET_OBJECT_ANIMATIONS_289 .incbin "./build/us_1.0/objects/animations/unknown_32_289.bin" -glabel ASSET_32_290 +glabel ASSET_OBJECT_ANIMATIONS_290 .incbin "./build/us_1.0/objects/animations/unknown_32_290.bin" -glabel ASSET_32_291 +glabel ASSET_OBJECT_ANIMATIONS_291 .incbin "./build/us_1.0/objects/animations/unknown_32_291.bin" -glabel ASSET_32_292 +glabel ASSET_OBJECT_ANIMATIONS_292 .incbin "./build/us_1.0/objects/animations/unknown_32_292.bin" -glabel ASSET_32_293 +glabel ASSET_OBJECT_ANIMATIONS_293 .incbin "./build/us_1.0/objects/animations/unknown_32_293.bin" -glabel ASSET_32_294 +glabel ASSET_OBJECT_ANIMATIONS_294 .incbin "./build/us_1.0/objects/animations/unknown_32_294.bin" -glabel ASSET_32_295 +glabel ASSET_OBJECT_ANIMATIONS_295 .incbin "./build/us_1.0/objects/animations/unknown_32_295.bin" -glabel ASSET_32_296 +glabel ASSET_OBJECT_ANIMATIONS_296 .incbin "./build/us_1.0/objects/animations/unknown_32_296.bin" -glabel ASSET_32_297 +glabel ASSET_OBJECT_ANIMATIONS_297 .incbin "./build/us_1.0/objects/animations/unknown_32_297.bin" -glabel ASSET_32_298 +glabel ASSET_OBJECT_ANIMATIONS_298 .incbin "./build/us_1.0/objects/animations/unknown_32_298.bin" -glabel ASSET_32_299 +glabel ASSET_OBJECT_ANIMATIONS_299 .incbin "./build/us_1.0/objects/animations/unknown_32_299.bin" -glabel ASSET_32_300 +glabel ASSET_OBJECT_ANIMATIONS_300 .incbin "./build/us_1.0/objects/animations/unknown_32_300.bin" -glabel ASSET_32_301 +glabel ASSET_OBJECT_ANIMATIONS_301 .incbin "./build/us_1.0/objects/animations/unknown_32_301.bin" -glabel ASSET_32_302 +glabel ASSET_OBJECT_ANIMATIONS_302 .incbin "./build/us_1.0/objects/animations/unknown_32_302.bin" -glabel ASSET_32_303 +glabel ASSET_OBJECT_ANIMATIONS_303 .incbin "./build/us_1.0/objects/animations/unknown_32_303.bin" -glabel ASSET_32_304 +glabel ASSET_OBJECT_ANIMATIONS_304 .incbin "./build/us_1.0/objects/animations/unknown_32_304.bin" -glabel ASSET_32_305 +glabel ASSET_OBJECT_ANIMATIONS_305 .incbin "./build/us_1.0/objects/animations/unknown_32_305.bin" -glabel ASSET_32_306 +glabel ASSET_OBJECT_ANIMATIONS_306 .incbin "./build/us_1.0/objects/animations/unknown_32_306.bin" -glabel ASSET_32_307 +glabel ASSET_OBJECT_ANIMATIONS_307 .incbin "./build/us_1.0/objects/animations/unknown_32_307.bin" -glabel ASSET_32_308 +glabel ASSET_OBJECT_ANIMATIONS_308 .incbin "./build/us_1.0/objects/animations/unknown_32_308.bin" -glabel ASSET_32_309 +glabel ASSET_OBJECT_ANIMATIONS_309 .incbin "./build/us_1.0/objects/animations/unknown_32_309.bin" -glabel ASSET_32_310 +glabel ASSET_OBJECT_ANIMATIONS_310 .incbin "./build/us_1.0/objects/animations/unknown_32_310.bin" -glabel ASSET_32_311 +glabel ASSET_OBJECT_ANIMATIONS_311 .incbin "./build/us_1.0/objects/animations/unknown_32_311.bin" -glabel ASSET_32_312 +glabel ASSET_OBJECT_ANIMATIONS_312 .incbin "./build/us_1.0/objects/animations/unknown_32_312.bin" -glabel ASSET_32_313 +glabel ASSET_OBJECT_ANIMATIONS_313 .incbin "./build/us_1.0/objects/animations/unknown_32_313.bin" -glabel ASSET_32_314 +glabel ASSET_OBJECT_ANIMATIONS_314 .incbin "./build/us_1.0/objects/animations/unknown_32_314.bin" -glabel ASSET_32_315 +glabel ASSET_OBJECT_ANIMATIONS_315 .incbin "./build/us_1.0/objects/animations/unknown_32_315.bin" -glabel ASSET_32_316 +glabel ASSET_OBJECT_ANIMATIONS_316 .incbin "./build/us_1.0/objects/animations/unknown_32_316.bin" -glabel ASSET_32_317 +glabel ASSET_OBJECT_ANIMATIONS_317 .incbin "./build/us_1.0/objects/animations/unknown_32_317.bin" -glabel ASSET_32_318 +glabel ASSET_OBJECT_ANIMATIONS_318 .incbin "./build/us_1.0/objects/animations/unknown_32_318.bin" -glabel ASSET_32_319 +glabel ASSET_OBJECT_ANIMATIONS_319 .incbin "./build/us_1.0/objects/animations/unknown_32_319.bin" -glabel ASSET_32_320 +glabel ASSET_OBJECT_ANIMATIONS_320 .incbin "./build/us_1.0/objects/animations/unknown_32_320.bin" -glabel ASSET_32_321 +glabel ASSET_OBJECT_ANIMATIONS_321 .incbin "./build/us_1.0/objects/animations/unknown_32_321.bin" -glabel ASSET_32_322 +glabel ASSET_OBJECT_ANIMATIONS_322 .incbin "./build/us_1.0/objects/animations/unknown_32_322.bin" -glabel ASSET_32_323 +glabel ASSET_OBJECT_ANIMATIONS_323 .incbin "./build/us_1.0/objects/animations/unknown_32_323.bin" -glabel ASSET_32_324 +glabel ASSET_OBJECT_ANIMATIONS_324 .incbin "./build/us_1.0/objects/animations/unknown_32_324.bin" -glabel ASSET_32_325 +glabel ASSET_OBJECT_ANIMATIONS_325 .incbin "./build/us_1.0/objects/animations/unknown_32_325.bin" -glabel ASSET_32_326 +glabel ASSET_OBJECT_ANIMATIONS_326 .incbin "./build/us_1.0/objects/animations/unknown_32_326.bin" -glabel ASSET_32_327 +glabel ASSET_OBJECT_ANIMATIONS_327 .incbin "./build/us_1.0/objects/animations/unknown_32_327.bin" -glabel ASSET_32_328 +glabel ASSET_OBJECT_ANIMATIONS_328 .incbin "./build/us_1.0/objects/animations/unknown_32_328.bin" -glabel ASSET_32_329 +glabel ASSET_OBJECT_ANIMATIONS_329 .incbin "./build/us_1.0/objects/animations/unknown_32_329.bin" -glabel ASSET_32_330 +glabel ASSET_OBJECT_ANIMATIONS_330 .incbin "./build/us_1.0/objects/animations/unknown_32_330.bin" -glabel ASSET_32_331 +glabel ASSET_OBJECT_ANIMATIONS_331 .incbin "./build/us_1.0/objects/animations/unknown_32_331.bin" -glabel ASSET_32_332 +glabel ASSET_OBJECT_ANIMATIONS_332 .incbin "./build/us_1.0/objects/animations/unknown_32_332.bin" -glabel ASSET_32_333 +glabel ASSET_OBJECT_ANIMATIONS_333 .incbin "./build/us_1.0/objects/animations/unknown_32_333.bin" -glabel ASSET_32_334 +glabel ASSET_OBJECT_ANIMATIONS_334 .incbin "./build/us_1.0/objects/animations/unknown_32_334.bin" -glabel ASSET_32_335 +glabel ASSET_OBJECT_ANIMATIONS_335 .incbin "./build/us_1.0/objects/animations/unknown_32_335.bin" -glabel ASSET_32_336 +glabel ASSET_OBJECT_ANIMATIONS_336 .incbin "./build/us_1.0/objects/animations/unknown_32_336.bin" -glabel ASSET_32_337 +glabel ASSET_OBJECT_ANIMATIONS_337 .incbin "./build/us_1.0/objects/animations/unknown_32_337.bin" -glabel ASSET_32_338 +glabel ASSET_OBJECT_ANIMATIONS_338 .incbin "./build/us_1.0/objects/animations/unknown_32_338.bin" -glabel ASSET_32_339 +glabel ASSET_OBJECT_ANIMATIONS_339 .incbin "./build/us_1.0/objects/animations/unknown_32_339.bin" -glabel ASSET_32_340 +glabel ASSET_OBJECT_ANIMATIONS_340 .incbin "./build/us_1.0/objects/animations/unknown_32_340.bin" -glabel ASSET_32_341 +glabel ASSET_OBJECT_ANIMATIONS_341 .incbin "./build/us_1.0/objects/animations/unknown_32_341.bin" -glabel ASSET_32_342 +glabel ASSET_OBJECT_ANIMATIONS_342 .incbin "./build/us_1.0/objects/animations/unknown_32_342.bin" -glabel ASSET_32_343 +glabel ASSET_OBJECT_ANIMATIONS_343 .incbin "./build/us_1.0/objects/animations/unknown_32_343.bin" -glabel ASSET_32_344 +glabel ASSET_OBJECT_ANIMATIONS_344 .incbin "./build/us_1.0/objects/animations/unknown_32_344.bin" -glabel ASSET_32_345 +glabel ASSET_OBJECT_ANIMATIONS_345 .incbin "./build/us_1.0/objects/animations/unknown_32_345.bin" -glabel ASSET_32_346 +glabel ASSET_OBJECT_ANIMATIONS_346 .incbin "./build/us_1.0/objects/animations/unknown_32_346.bin" -glabel ASSET_32_347 +glabel ASSET_OBJECT_ANIMATIONS_347 .incbin "./build/us_1.0/objects/animations/unknown_32_347.bin" -glabel ASSET_32_348 +glabel ASSET_OBJECT_ANIMATIONS_348 .incbin "./build/us_1.0/objects/animations/unknown_32_348.bin" -glabel ASSET_32_349 +glabel ASSET_OBJECT_ANIMATIONS_349 .incbin "./build/us_1.0/objects/animations/unknown_32_349.bin" -glabel ASSET_32_350 +glabel ASSET_OBJECT_ANIMATIONS_350 .incbin "./build/us_1.0/objects/animations/unknown_32_350.bin" -glabel ASSET_32_351 +glabel ASSET_OBJECT_ANIMATIONS_351 .incbin "./build/us_1.0/objects/animations/unknown_32_351.bin" -glabel ASSET_32_352 +glabel ASSET_OBJECT_ANIMATIONS_352 .incbin "./build/us_1.0/objects/animations/unknown_32_352.bin" -glabel ASSET_32_353 +glabel ASSET_OBJECT_ANIMATIONS_353 .incbin "./build/us_1.0/objects/animations/unknown_32_353.bin" -glabel ASSET_32_354 +glabel ASSET_OBJECT_ANIMATIONS_354 .incbin "./build/us_1.0/objects/animations/unknown_32_354.bin" -glabel ASSET_32_355 +glabel ASSET_OBJECT_ANIMATIONS_355 .incbin "./build/us_1.0/objects/animations/unknown_32_355.bin" -glabel ASSET_32_356 +glabel ASSET_OBJECT_ANIMATIONS_356 .incbin "./build/us_1.0/objects/animations/unknown_32_356.bin" -glabel ASSET_32_357 +glabel ASSET_OBJECT_ANIMATIONS_357 .incbin "./build/us_1.0/objects/animations/unknown_32_357.bin" -glabel ASSET_32_358 +glabel ASSET_OBJECT_ANIMATIONS_358 .incbin "./build/us_1.0/objects/animations/unknown_32_358.bin" -glabel ASSET_32_359 +glabel ASSET_OBJECT_ANIMATIONS_359 .incbin "./build/us_1.0/objects/animations/unknown_32_359.bin" -glabel ASSET_32_360 +glabel ASSET_OBJECT_ANIMATIONS_360 .incbin "./build/us_1.0/objects/animations/unknown_32_360.bin" -glabel ASSET_32_361 +glabel ASSET_OBJECT_ANIMATIONS_361 .incbin "./build/us_1.0/objects/animations/unknown_32_361.bin" -glabel ASSET_32_362 +glabel ASSET_OBJECT_ANIMATIONS_362 .incbin "./build/us_1.0/objects/animations/unknown_32_362.bin" -glabel ASSET_32_363 +glabel ASSET_OBJECT_ANIMATIONS_363 .incbin "./build/us_1.0/objects/animations/unknown_32_363.bin" -glabel ASSET_32_364 +glabel ASSET_OBJECT_ANIMATIONS_364 .incbin "./build/us_1.0/objects/animations/unknown_32_364.bin" -glabel ASSET_32_365 +glabel ASSET_OBJECT_ANIMATIONS_365 .incbin "./build/us_1.0/objects/animations/unknown_32_365.bin" -glabel ASSET_32_366 +glabel ASSET_OBJECT_ANIMATIONS_366 .incbin "./build/us_1.0/objects/animations/unknown_32_366.bin" -glabel ASSET_32_367 +glabel ASSET_OBJECT_ANIMATIONS_367 .incbin "./build/us_1.0/objects/animations/unknown_32_367.bin" -glabel ASSET_32_368 +glabel ASSET_OBJECT_ANIMATIONS_368 .incbin "./build/us_1.0/objects/animations/unknown_32_368.bin" -glabel ASSET_32_369 +glabel ASSET_OBJECT_ANIMATIONS_369 .incbin "./build/us_1.0/objects/animations/unknown_32_369.bin" -glabel ASSET_32_370 +glabel ASSET_OBJECT_ANIMATIONS_370 .incbin "./build/us_1.0/objects/animations/unknown_32_370.bin" -glabel ASSET_32_371 +glabel ASSET_OBJECT_ANIMATIONS_371 .incbin "./build/us_1.0/objects/animations/unknown_32_371.bin" -glabel ASSET_32_372 +glabel ASSET_OBJECT_ANIMATIONS_372 .incbin "./build/us_1.0/objects/animations/unknown_32_372.bin" -glabel ASSET_32_373 +glabel ASSET_OBJECT_ANIMATIONS_373 .incbin "./build/us_1.0/objects/animations/unknown_32_373.bin" -glabel ASSET_32_374 +glabel ASSET_OBJECT_ANIMATIONS_374 .incbin "./build/us_1.0/objects/animations/unknown_32_374.bin" -glabel ASSET_32_375 +glabel ASSET_OBJECT_ANIMATIONS_375 .incbin "./build/us_1.0/objects/animations/unknown_32_375.bin" -glabel ASSET_32_376 +glabel ASSET_OBJECT_ANIMATIONS_376 .incbin "./build/us_1.0/objects/animations/unknown_32_376.bin" -glabel ASSET_32_377 +glabel ASSET_OBJECT_ANIMATIONS_377 .incbin "./build/us_1.0/objects/animations/unknown_32_377.bin" -glabel ASSET_32_378 +glabel ASSET_OBJECT_ANIMATIONS_378 .incbin "./build/us_1.0/objects/animations/unknown_32_378.bin" -glabel ASSET_32_379 +glabel ASSET_OBJECT_ANIMATIONS_379 .incbin "./build/us_1.0/objects/animations/unknown_32_379.bin" -glabel ASSET_32_380 +glabel ASSET_OBJECT_ANIMATIONS_380 .incbin "./build/us_1.0/objects/animations/unknown_32_380.bin" -glabel ASSET_32_381 +glabel ASSET_OBJECT_ANIMATIONS_381 .incbin "./build/us_1.0/objects/animations/unknown_32_381.bin" -glabel ASSET_32_382 +glabel ASSET_OBJECT_ANIMATIONS_382 .incbin "./build/us_1.0/objects/animations/unknown_32_382.bin" -glabel ASSET_32_383 +glabel ASSET_OBJECT_ANIMATIONS_383 .incbin "./build/us_1.0/objects/animations/unknown_32_383.bin" -glabel ASSET_32_384 +glabel ASSET_OBJECT_ANIMATIONS_384 .incbin "./build/us_1.0/objects/animations/unknown_32_384.bin" -glabel ASSET_32_385 +glabel ASSET_OBJECT_ANIMATIONS_385 .incbin "./build/us_1.0/objects/animations/unknown_32_385.bin" -glabel ASSET_32_386 +glabel ASSET_OBJECT_ANIMATIONS_386 .incbin "./build/us_1.0/objects/animations/unknown_32_386.bin" -glabel ASSET_32_387 +glabel ASSET_OBJECT_ANIMATIONS_387 .incbin "./build/us_1.0/objects/animations/unknown_32_387.bin" -glabel ASSET_32_388 +glabel ASSET_OBJECT_ANIMATIONS_388 .incbin "./build/us_1.0/objects/animations/unknown_32_388.bin" -glabel ASSET_32_389 +glabel ASSET_OBJECT_ANIMATIONS_389 .incbin "./build/us_1.0/objects/animations/unknown_32_389.bin" -glabel ASSET_32_390 +glabel ASSET_OBJECT_ANIMATIONS_390 .incbin "./build/us_1.0/objects/animations/unknown_32_390.bin" -glabel ASSET_32_391 +glabel ASSET_OBJECT_ANIMATIONS_391 .incbin "./build/us_1.0/objects/animations/unknown_32_391.bin" -glabel ASSET_32_392 +glabel ASSET_OBJECT_ANIMATIONS_392 .incbin "./build/us_1.0/objects/animations/unknown_32_392.bin" -glabel ASSET_32_393 +glabel ASSET_OBJECT_ANIMATIONS_393 .incbin "./build/us_1.0/objects/animations/unknown_32_393.bin" -glabel ASSET_32_394 +glabel ASSET_OBJECT_ANIMATIONS_394 .incbin "./build/us_1.0/objects/animations/unknown_32_394.bin" -glabel ASSET_32_395 +glabel ASSET_OBJECT_ANIMATIONS_395 .incbin "./build/us_1.0/objects/animations/unknown_32_395.bin" -glabel ASSET_32_396 +glabel ASSET_OBJECT_ANIMATIONS_396 .incbin "./build/us_1.0/objects/animations/unknown_32_396.bin" -glabel ASSET_32_397 +glabel ASSET_OBJECT_ANIMATIONS_397 .incbin "./build/us_1.0/objects/animations/unknown_32_397.bin" -glabel ASSET_32_398 +glabel ASSET_OBJECT_ANIMATIONS_398 .incbin "./build/us_1.0/objects/animations/unknown_32_398.bin" -glabel ASSET_32_399 +glabel ASSET_OBJECT_ANIMATIONS_399 .incbin "./build/us_1.0/objects/animations/unknown_32_399.bin" -glabel ASSET_32_400 +glabel ASSET_OBJECT_ANIMATIONS_400 .incbin "./build/us_1.0/objects/animations/unknown_32_400.bin" -glabel ASSET_32_401 +glabel ASSET_OBJECT_ANIMATIONS_401 .incbin "./build/us_1.0/objects/animations/unknown_32_401.bin" -glabel ASSET_32_402 +glabel ASSET_OBJECT_ANIMATIONS_402 .incbin "./build/us_1.0/objects/animations/unknown_32_402.bin" -glabel ASSET_32_403 +glabel ASSET_OBJECT_ANIMATIONS_403 .incbin "./build/us_1.0/objects/animations/unknown_32_403.bin" -glabel ASSET_32_404 +glabel ASSET_OBJECT_ANIMATIONS_404 .incbin "./build/us_1.0/objects/animations/unknown_32_404.bin" -glabel ASSET_32_405 +glabel ASSET_OBJECT_ANIMATIONS_405 .incbin "./build/us_1.0/objects/animations/unknown_32_405.bin" -glabel ASSET_32_406 +glabel ASSET_OBJECT_ANIMATIONS_406 .incbin "./build/us_1.0/objects/animations/unknown_32_406.bin" -glabel ASSET_32_407 +glabel ASSET_OBJECT_ANIMATIONS_407 .incbin "./build/us_1.0/objects/animations/unknown_32_407.bin" -glabel ASSET_32_408 +glabel ASSET_OBJECT_ANIMATIONS_408 .incbin "./build/us_1.0/objects/animations/unknown_32_408.bin" -glabel ASSET_32_409 +glabel ASSET_OBJECT_ANIMATIONS_409 .incbin "./build/us_1.0/objects/animations/unknown_32_409.bin" -glabel ASSET_32_410 +glabel ASSET_OBJECT_ANIMATIONS_410 .incbin "./build/us_1.0/objects/animations/unknown_32_410.bin" -glabel ASSET_32_411 +glabel ASSET_OBJECT_ANIMATIONS_411 .incbin "./build/us_1.0/objects/animations/unknown_32_411.bin" -glabel ASSET_32_412 +glabel ASSET_OBJECT_ANIMATIONS_412 .incbin "./build/us_1.0/objects/animations/unknown_32_412.bin" -glabel ASSET_32_413 +glabel ASSET_OBJECT_ANIMATIONS_413 .incbin "./build/us_1.0/objects/animations/unknown_32_413.bin" -glabel ASSET_32_414 +glabel ASSET_OBJECT_ANIMATIONS_414 .incbin "./build/us_1.0/objects/animations/unknown_32_414.bin" -glabel ASSET_32_415 +glabel ASSET_OBJECT_ANIMATIONS_415 .incbin "./build/us_1.0/objects/animations/unknown_32_415.bin" -glabel ASSET_32_416 +glabel ASSET_OBJECT_ANIMATIONS_416 .incbin "./build/us_1.0/objects/animations/unknown_32_416.bin" -glabel ASSET_32_417 +glabel ASSET_OBJECT_ANIMATIONS_417 .incbin "./build/us_1.0/objects/animations/unknown_32_417.bin" -glabel ASSET_32_418 +glabel ASSET_OBJECT_ANIMATIONS_418 .incbin "./build/us_1.0/objects/animations/unknown_32_418.bin" -glabel ASSET_32_419 +glabel ASSET_OBJECT_ANIMATIONS_419 .incbin "./build/us_1.0/objects/animations/unknown_32_419.bin" -glabel ASSET_32_420 +glabel ASSET_OBJECT_ANIMATIONS_420 .incbin "./build/us_1.0/objects/animations/unknown_32_420.bin" -glabel ASSET_32_421 +glabel ASSET_OBJECT_ANIMATIONS_421 .incbin "./build/us_1.0/objects/animations/unknown_32_421.bin" -glabel ASSET_32_422 +glabel ASSET_OBJECT_ANIMATIONS_422 .incbin "./build/us_1.0/objects/animations/unknown_32_422.bin" -glabel ASSET_32_423 +glabel ASSET_OBJECT_ANIMATIONS_423 .incbin "./build/us_1.0/objects/animations/unknown_32_423.bin" -glabel ASSET_32_424 +glabel ASSET_OBJECT_ANIMATIONS_424 .incbin "./build/us_1.0/objects/animations/unknown_32_424.bin" -glabel ASSET_32_425 +glabel ASSET_OBJECT_ANIMATIONS_425 .incbin "./build/us_1.0/objects/animations/unknown_32_425.bin" -glabel ASSET_32_426 +glabel ASSET_OBJECT_ANIMATIONS_426 .incbin "./build/us_1.0/objects/animations/unknown_32_426.bin" -glabel ASSET_32_427 +glabel ASSET_OBJECT_ANIMATIONS_427 .incbin "./build/us_1.0/objects/animations/unknown_32_427.bin" -glabel ASSET_32_428 +glabel ASSET_OBJECT_ANIMATIONS_428 .incbin "./build/us_1.0/objects/animations/unknown_32_428.bin" -glabel ASSET_32_429 +glabel ASSET_OBJECT_ANIMATIONS_429 .incbin "./build/us_1.0/objects/animations/unknown_32_429.bin" -glabel ASSET_32_430 +glabel ASSET_OBJECT_ANIMATIONS_430 .incbin "./build/us_1.0/objects/animations/unknown_32_430.bin" -glabel ASSET_32_431 +glabel ASSET_OBJECT_ANIMATIONS_431 .incbin "./build/us_1.0/objects/animations/unknown_32_431.bin" -glabel ASSET_32_432 +glabel ASSET_OBJECT_ANIMATIONS_432 .incbin "./build/us_1.0/objects/animations/unknown_32_432.bin" -glabel ASSET_32_433 +glabel ASSET_OBJECT_ANIMATIONS_433 .incbin "./build/us_1.0/objects/animations/unknown_32_433.bin" -glabel ASSET_32_434 +glabel ASSET_OBJECT_ANIMATIONS_434 .incbin "./build/us_1.0/objects/animations/unknown_32_434.bin" -glabel ASSET_32_435 +glabel ASSET_OBJECT_ANIMATIONS_435 .incbin "./build/us_1.0/objects/animations/unknown_32_435.bin" -glabel ASSET_32_436 +glabel ASSET_OBJECT_ANIMATIONS_436 .incbin "./build/us_1.0/objects/animations/unknown_32_436.bin" -glabel ASSET_32_437 +glabel ASSET_OBJECT_ANIMATIONS_437 .incbin "./build/us_1.0/objects/animations/unknown_32_437.bin" -glabel ASSET_32_438 +glabel ASSET_OBJECT_ANIMATIONS_438 .incbin "./build/us_1.0/objects/animations/unknown_32_438.bin" -glabel ASSET_32_439 +glabel ASSET_OBJECT_ANIMATIONS_439 .incbin "./build/us_1.0/objects/animations/unknown_32_439.bin" -glabel ASSET_32_440 +glabel ASSET_OBJECT_ANIMATIONS_440 .incbin "./build/us_1.0/objects/animations/unknown_32_440.bin" -glabel ASSET_32_441 +glabel ASSET_OBJECT_ANIMATIONS_441 .incbin "./build/us_1.0/objects/animations/unknown_32_441.bin" -glabel ASSET_32_442 +glabel ASSET_OBJECT_ANIMATIONS_442 .incbin "./build/us_1.0/objects/animations/unknown_32_442.bin" -glabel ASSET_32_443 +glabel ASSET_OBJECT_ANIMATIONS_443 .incbin "./build/us_1.0/objects/animations/unknown_32_443.bin" -glabel ASSET_32_444 +glabel ASSET_OBJECT_ANIMATIONS_444 .incbin "./build/us_1.0/objects/animations/unknown_32_444.bin" -glabel ASSET_32_445 +glabel ASSET_OBJECT_ANIMATIONS_445 .incbin "./build/us_1.0/objects/animations/unknown_32_445.bin" -glabel ASSET_32_446 +glabel ASSET_OBJECT_ANIMATIONS_446 .incbin "./build/us_1.0/objects/animations/unknown_32_446.bin" -glabel ASSET_32_447 +glabel ASSET_OBJECT_ANIMATIONS_447 .incbin "./build/us_1.0/objects/animations/unknown_32_447.bin" -glabel ASSET_32_448 +glabel ASSET_OBJECT_ANIMATIONS_448 .incbin "./build/us_1.0/objects/animations/unknown_32_448.bin" -glabel ASSET_32_449 +glabel ASSET_OBJECT_ANIMATIONS_449 .incbin "./build/us_1.0/objects/animations/unknown_32_449.bin" -glabel ASSET_32_450 +glabel ASSET_OBJECT_ANIMATIONS_450 .incbin "./build/us_1.0/objects/animations/unknown_32_450.bin" -glabel ASSET_32_451 +glabel ASSET_OBJECT_ANIMATIONS_451 .incbin "./build/us_1.0/objects/animations/unknown_32_451.bin" -glabel ASSET_32_452 +glabel ASSET_OBJECT_ANIMATIONS_452 .incbin "./build/us_1.0/objects/animations/unknown_32_452.bin" -glabel ASSET_32_453 +glabel ASSET_OBJECT_ANIMATIONS_453 .incbin "./build/us_1.0/objects/animations/unknown_32_453.bin" -glabel ASSET_32_454 +glabel ASSET_OBJECT_ANIMATIONS_454 .incbin "./build/us_1.0/objects/animations/unknown_32_454.bin" -glabel ASSET_32_455 +glabel ASSET_OBJECT_ANIMATIONS_455 .incbin "./build/us_1.0/objects/animations/unknown_32_455.bin" -glabel ASSET_32_456 +glabel ASSET_OBJECT_ANIMATIONS_456 .incbin "./build/us_1.0/objects/animations/unknown_32_456.bin" -glabel ASSET_32_457 +glabel ASSET_OBJECT_ANIMATIONS_457 .incbin "./build/us_1.0/objects/animations/unknown_32_457.bin" -glabel ASSET_32_458 +glabel ASSET_OBJECT_ANIMATIONS_458 .incbin "./build/us_1.0/objects/animations/unknown_32_458.bin" -glabel ASSET_32_459 +glabel ASSET_OBJECT_ANIMATIONS_459 .incbin "./build/us_1.0/objects/animations/unknown_32_459.bin" -glabel ASSET_32_460 +glabel ASSET_OBJECT_ANIMATIONS_460 .incbin "./build/us_1.0/objects/animations/unknown_32_460.bin" -glabel ASSET_32_461 +glabel ASSET_OBJECT_ANIMATIONS_461 .incbin "./build/us_1.0/objects/animations/unknown_32_461.bin" -glabel ASSET_32_462 +glabel ASSET_OBJECT_ANIMATIONS_462 .incbin "./build/us_1.0/objects/animations/unknown_32_462.bin" -glabel ASSET_32_463 +glabel ASSET_OBJECT_ANIMATIONS_463 .incbin "./build/us_1.0/objects/animations/unknown_32_463.bin" -glabel ASSET_32_464 +glabel ASSET_OBJECT_ANIMATIONS_464 .incbin "./build/us_1.0/objects/animations/unknown_32_464.bin" -glabel ASSET_32_465 +glabel ASSET_OBJECT_ANIMATIONS_465 .incbin "./build/us_1.0/objects/animations/unknown_32_465.bin" -glabel ASSET_32_466 +glabel ASSET_OBJECT_ANIMATIONS_466 .incbin "./build/us_1.0/objects/animations/unknown_32_466.bin" -glabel ASSET_32_467 +glabel ASSET_OBJECT_ANIMATIONS_467 .incbin "./build/us_1.0/objects/animations/unknown_32_467.bin" -glabel ASSET_32_468 +glabel ASSET_OBJECT_ANIMATIONS_468 .incbin "./build/us_1.0/objects/animations/unknown_32_468.bin" -glabel ASSET_32_469 +glabel ASSET_OBJECT_ANIMATIONS_469 .incbin "./build/us_1.0/objects/animations/unknown_32_469.bin" -glabel ASSET_SECTION_32_END +glabel ASSET_OBJECT_ANIMATIONS_END + +/********** ASSET_OBJECT_HEADERS_TABLE **********/ .balign 16 -glabel ASSET_SECTION_33 -.word ASSET_34_0 - ASSET_SECTION_34 -.word ASSET_34_1 - ASSET_SECTION_34 -.word ASSET_34_2 - ASSET_SECTION_34 -.word ASSET_34_3 - ASSET_SECTION_34 -.word ASSET_34_4 - ASSET_SECTION_34 -.word ASSET_34_5 - ASSET_SECTION_34 -.word ASSET_34_6 - ASSET_SECTION_34 -.word ASSET_34_7 - ASSET_SECTION_34 -.word ASSET_34_8 - ASSET_SECTION_34 -.word ASSET_34_9 - ASSET_SECTION_34 -.word ASSET_34_10 - ASSET_SECTION_34 -.word ASSET_34_11 - ASSET_SECTION_34 -.word ASSET_34_12 - ASSET_SECTION_34 -.word ASSET_34_13 - ASSET_SECTION_34 -.word ASSET_34_14 - ASSET_SECTION_34 -.word ASSET_34_15 - ASSET_SECTION_34 -.word ASSET_34_16 - ASSET_SECTION_34 -.word ASSET_34_17 - ASSET_SECTION_34 -.word ASSET_34_18 - ASSET_SECTION_34 -.word ASSET_34_19 - ASSET_SECTION_34 -.word ASSET_34_20 - ASSET_SECTION_34 -.word ASSET_34_21 - ASSET_SECTION_34 -.word ASSET_34_22 - ASSET_SECTION_34 -.word ASSET_34_23 - ASSET_SECTION_34 -.word ASSET_34_24 - ASSET_SECTION_34 -.word ASSET_34_25 - ASSET_SECTION_34 -.word ASSET_34_26 - ASSET_SECTION_34 -.word ASSET_34_27 - ASSET_SECTION_34 -.word ASSET_34_28 - ASSET_SECTION_34 -.word ASSET_34_29 - ASSET_SECTION_34 -.word ASSET_34_30 - ASSET_SECTION_34 -.word ASSET_34_31 - ASSET_SECTION_34 -.word ASSET_34_32 - ASSET_SECTION_34 -.word ASSET_34_33 - ASSET_SECTION_34 -.word ASSET_34_34 - ASSET_SECTION_34 -.word ASSET_34_35 - ASSET_SECTION_34 -.word ASSET_34_36 - ASSET_SECTION_34 -.word ASSET_34_37 - ASSET_SECTION_34 -.word ASSET_34_38 - ASSET_SECTION_34 -.word ASSET_34_39 - ASSET_SECTION_34 -.word ASSET_34_40 - ASSET_SECTION_34 -.word ASSET_34_41 - ASSET_SECTION_34 -.word ASSET_34_42 - ASSET_SECTION_34 -.word ASSET_34_43 - ASSET_SECTION_34 -.word ASSET_34_44 - ASSET_SECTION_34 -.word ASSET_34_45 - ASSET_SECTION_34 -.word ASSET_34_46 - ASSET_SECTION_34 -.word ASSET_34_47 - ASSET_SECTION_34 -.word ASSET_34_48 - ASSET_SECTION_34 -.word ASSET_34_49 - ASSET_SECTION_34 -.word ASSET_34_50 - ASSET_SECTION_34 -.word ASSET_34_51 - ASSET_SECTION_34 -.word ASSET_34_52 - ASSET_SECTION_34 -.word ASSET_34_53 - ASSET_SECTION_34 -.word ASSET_34_54 - ASSET_SECTION_34 -.word ASSET_34_55 - ASSET_SECTION_34 -.word ASSET_34_56 - ASSET_SECTION_34 -.word ASSET_34_57 - ASSET_SECTION_34 -.word ASSET_34_58 - ASSET_SECTION_34 -.word ASSET_34_59 - ASSET_SECTION_34 -.word ASSET_34_60 - ASSET_SECTION_34 -.word ASSET_34_61 - ASSET_SECTION_34 -.word ASSET_34_62 - ASSET_SECTION_34 -.word ASSET_34_63 - ASSET_SECTION_34 -.word ASSET_34_64 - ASSET_SECTION_34 -.word ASSET_34_65 - ASSET_SECTION_34 -.word ASSET_34_66 - ASSET_SECTION_34 -.word ASSET_34_67 - ASSET_SECTION_34 -.word ASSET_34_68 - ASSET_SECTION_34 -.word ASSET_34_69 - ASSET_SECTION_34 -.word ASSET_34_70 - ASSET_SECTION_34 -.word ASSET_34_71 - ASSET_SECTION_34 -.word ASSET_34_72 - ASSET_SECTION_34 -.word ASSET_34_73 - ASSET_SECTION_34 -.word ASSET_34_74 - ASSET_SECTION_34 -.word ASSET_34_75 - ASSET_SECTION_34 -.word ASSET_34_76 - ASSET_SECTION_34 -.word ASSET_34_77 - ASSET_SECTION_34 -.word ASSET_34_78 - ASSET_SECTION_34 -.word ASSET_34_79 - ASSET_SECTION_34 -.word ASSET_34_80 - ASSET_SECTION_34 -.word ASSET_34_81 - ASSET_SECTION_34 -.word ASSET_34_82 - ASSET_SECTION_34 -.word ASSET_34_83 - ASSET_SECTION_34 -.word ASSET_34_84 - ASSET_SECTION_34 -.word ASSET_34_85 - ASSET_SECTION_34 -.word ASSET_34_86 - ASSET_SECTION_34 -.word ASSET_34_87 - ASSET_SECTION_34 -.word ASSET_34_88 - ASSET_SECTION_34 -.word ASSET_34_89 - ASSET_SECTION_34 -.word ASSET_34_90 - ASSET_SECTION_34 -.word ASSET_34_91 - ASSET_SECTION_34 -.word ASSET_34_92 - ASSET_SECTION_34 -.word ASSET_34_93 - ASSET_SECTION_34 -.word ASSET_34_94 - ASSET_SECTION_34 -.word ASSET_34_95 - ASSET_SECTION_34 -.word ASSET_34_96 - ASSET_SECTION_34 -.word ASSET_34_97 - ASSET_SECTION_34 -.word ASSET_34_98 - ASSET_SECTION_34 -.word ASSET_34_99 - ASSET_SECTION_34 -.word ASSET_34_100 - ASSET_SECTION_34 -.word ASSET_34_101 - ASSET_SECTION_34 -.word ASSET_34_102 - ASSET_SECTION_34 -.word ASSET_34_103 - ASSET_SECTION_34 -.word ASSET_34_104 - ASSET_SECTION_34 -.word ASSET_34_105 - ASSET_SECTION_34 -.word ASSET_34_106 - ASSET_SECTION_34 -.word ASSET_34_107 - ASSET_SECTION_34 -.word ASSET_34_108 - ASSET_SECTION_34 -.word ASSET_34_109 - ASSET_SECTION_34 -.word ASSET_34_110 - ASSET_SECTION_34 -.word ASSET_34_111 - ASSET_SECTION_34 -.word ASSET_34_112 - ASSET_SECTION_34 -.word ASSET_34_113 - ASSET_SECTION_34 -.word ASSET_34_114 - ASSET_SECTION_34 -.word ASSET_34_115 - ASSET_SECTION_34 -.word ASSET_34_116 - ASSET_SECTION_34 -.word ASSET_34_117 - ASSET_SECTION_34 -.word ASSET_34_118 - ASSET_SECTION_34 -.word ASSET_34_119 - ASSET_SECTION_34 -.word ASSET_34_120 - ASSET_SECTION_34 -.word ASSET_34_121 - ASSET_SECTION_34 -.word ASSET_34_122 - ASSET_SECTION_34 -.word ASSET_34_123 - ASSET_SECTION_34 -.word ASSET_34_124 - ASSET_SECTION_34 -.word ASSET_34_125 - ASSET_SECTION_34 -.word ASSET_34_126 - ASSET_SECTION_34 -.word ASSET_34_127 - ASSET_SECTION_34 -.word ASSET_34_128 - ASSET_SECTION_34 -.word ASSET_34_129 - ASSET_SECTION_34 -.word ASSET_34_130 - ASSET_SECTION_34 -.word ASSET_34_131 - ASSET_SECTION_34 -.word ASSET_34_132 - ASSET_SECTION_34 -.word ASSET_34_133 - ASSET_SECTION_34 -.word ASSET_34_134 - ASSET_SECTION_34 -.word ASSET_34_135 - ASSET_SECTION_34 -.word ASSET_34_136 - ASSET_SECTION_34 -.word ASSET_34_137 - ASSET_SECTION_34 -.word ASSET_34_138 - ASSET_SECTION_34 -.word ASSET_34_139 - ASSET_SECTION_34 -.word ASSET_34_140 - ASSET_SECTION_34 -.word ASSET_34_141 - ASSET_SECTION_34 -.word ASSET_34_142 - ASSET_SECTION_34 -.word ASSET_34_143 - ASSET_SECTION_34 -.word ASSET_34_144 - ASSET_SECTION_34 -.word ASSET_34_145 - ASSET_SECTION_34 -.word ASSET_34_146 - ASSET_SECTION_34 -.word ASSET_34_147 - ASSET_SECTION_34 -.word ASSET_34_148 - ASSET_SECTION_34 -.word ASSET_34_149 - ASSET_SECTION_34 -.word ASSET_34_150 - ASSET_SECTION_34 -.word ASSET_34_151 - ASSET_SECTION_34 -.word ASSET_34_152 - ASSET_SECTION_34 -.word ASSET_34_153 - ASSET_SECTION_34 -.word ASSET_34_154 - ASSET_SECTION_34 -.word ASSET_34_155 - ASSET_SECTION_34 -.word ASSET_34_156 - ASSET_SECTION_34 -.word ASSET_34_157 - ASSET_SECTION_34 -.word ASSET_34_158 - ASSET_SECTION_34 -.word ASSET_34_159 - ASSET_SECTION_34 -.word ASSET_34_160 - ASSET_SECTION_34 -.word ASSET_34_161 - ASSET_SECTION_34 -.word ASSET_34_162 - ASSET_SECTION_34 -.word ASSET_34_163 - ASSET_SECTION_34 -.word ASSET_34_164 - ASSET_SECTION_34 -.word ASSET_34_165 - ASSET_SECTION_34 -.word ASSET_34_166 - ASSET_SECTION_34 -.word ASSET_34_167 - ASSET_SECTION_34 -.word ASSET_34_168 - ASSET_SECTION_34 -.word ASSET_34_169 - ASSET_SECTION_34 -.word ASSET_34_170 - ASSET_SECTION_34 -.word ASSET_34_171 - ASSET_SECTION_34 -.word ASSET_34_172 - ASSET_SECTION_34 -.word ASSET_34_173 - ASSET_SECTION_34 -.word ASSET_34_174 - ASSET_SECTION_34 -.word ASSET_34_175 - ASSET_SECTION_34 -.word ASSET_34_176 - ASSET_SECTION_34 -.word ASSET_34_177 - ASSET_SECTION_34 -.word ASSET_34_178 - ASSET_SECTION_34 -.word ASSET_34_179 - ASSET_SECTION_34 -.word ASSET_34_180 - ASSET_SECTION_34 -.word ASSET_34_181 - ASSET_SECTION_34 -.word ASSET_34_182 - ASSET_SECTION_34 -.word ASSET_34_183 - ASSET_SECTION_34 -.word ASSET_34_184 - ASSET_SECTION_34 -.word ASSET_34_185 - ASSET_SECTION_34 -.word ASSET_34_186 - ASSET_SECTION_34 -.word ASSET_34_187 - ASSET_SECTION_34 -.word ASSET_34_188 - ASSET_SECTION_34 -.word ASSET_34_189 - ASSET_SECTION_34 -.word ASSET_34_190 - ASSET_SECTION_34 -.word ASSET_34_191 - ASSET_SECTION_34 -.word ASSET_34_192 - ASSET_SECTION_34 -.word ASSET_34_193 - ASSET_SECTION_34 -.word ASSET_34_194 - ASSET_SECTION_34 -.word ASSET_34_195 - ASSET_SECTION_34 -.word ASSET_34_196 - ASSET_SECTION_34 -.word ASSET_34_197 - ASSET_SECTION_34 -.word ASSET_34_198 - ASSET_SECTION_34 -.word ASSET_34_199 - ASSET_SECTION_34 -.word ASSET_34_200 - ASSET_SECTION_34 -.word ASSET_34_201 - ASSET_SECTION_34 -.word ASSET_34_202 - ASSET_SECTION_34 -.word ASSET_34_203 - ASSET_SECTION_34 -.word ASSET_34_204 - ASSET_SECTION_34 -.word ASSET_34_205 - ASSET_SECTION_34 -.word ASSET_34_206 - ASSET_SECTION_34 -.word ASSET_34_207 - ASSET_SECTION_34 -.word ASSET_34_208 - ASSET_SECTION_34 -.word ASSET_34_209 - ASSET_SECTION_34 -.word ASSET_34_210 - ASSET_SECTION_34 -.word ASSET_34_211 - ASSET_SECTION_34 -.word ASSET_34_212 - ASSET_SECTION_34 -.word ASSET_34_213 - ASSET_SECTION_34 -.word ASSET_34_214 - ASSET_SECTION_34 -.word ASSET_34_215 - ASSET_SECTION_34 -.word ASSET_34_216 - ASSET_SECTION_34 -.word ASSET_34_217 - ASSET_SECTION_34 -.word ASSET_34_218 - ASSET_SECTION_34 -.word ASSET_34_219 - ASSET_SECTION_34 -.word ASSET_34_220 - ASSET_SECTION_34 -.word ASSET_34_221 - ASSET_SECTION_34 -.word ASSET_34_222 - ASSET_SECTION_34 -.word ASSET_34_223 - ASSET_SECTION_34 -.word ASSET_34_224 - ASSET_SECTION_34 -.word ASSET_34_225 - ASSET_SECTION_34 -.word ASSET_34_226 - ASSET_SECTION_34 -.word ASSET_34_227 - ASSET_SECTION_34 -.word ASSET_34_228 - ASSET_SECTION_34 -.word ASSET_34_229 - ASSET_SECTION_34 -.word ASSET_34_230 - ASSET_SECTION_34 -.word ASSET_34_231 - ASSET_SECTION_34 -.word ASSET_34_232 - ASSET_SECTION_34 -.word ASSET_34_233 - ASSET_SECTION_34 -.word ASSET_34_234 - ASSET_SECTION_34 -.word ASSET_34_235 - ASSET_SECTION_34 -.word ASSET_34_236 - ASSET_SECTION_34 -.word ASSET_34_237 - ASSET_SECTION_34 -.word ASSET_34_238 - ASSET_SECTION_34 -.word ASSET_34_239 - ASSET_SECTION_34 -.word ASSET_34_240 - ASSET_SECTION_34 -.word ASSET_34_241 - ASSET_SECTION_34 -.word ASSET_34_242 - ASSET_SECTION_34 -.word ASSET_34_243 - ASSET_SECTION_34 -.word ASSET_34_244 - ASSET_SECTION_34 -.word ASSET_34_245 - ASSET_SECTION_34 -.word ASSET_34_246 - ASSET_SECTION_34 -.word ASSET_34_247 - ASSET_SECTION_34 -.word ASSET_34_248 - ASSET_SECTION_34 -.word ASSET_34_249 - ASSET_SECTION_34 -.word ASSET_34_250 - ASSET_SECTION_34 -.word ASSET_34_251 - ASSET_SECTION_34 -.word ASSET_34_252 - ASSET_SECTION_34 -.word ASSET_34_253 - ASSET_SECTION_34 -.word ASSET_34_254 - ASSET_SECTION_34 -.word ASSET_34_255 - ASSET_SECTION_34 -.word ASSET_34_256 - ASSET_SECTION_34 -.word ASSET_34_257 - ASSET_SECTION_34 -.word ASSET_34_258 - ASSET_SECTION_34 -.word ASSET_34_259 - ASSET_SECTION_34 -.word ASSET_34_260 - ASSET_SECTION_34 -.word ASSET_34_261 - ASSET_SECTION_34 -.word ASSET_34_262 - ASSET_SECTION_34 -.word ASSET_34_263 - ASSET_SECTION_34 -.word ASSET_34_264 - ASSET_SECTION_34 -.word ASSET_34_265 - ASSET_SECTION_34 -.word ASSET_34_266 - ASSET_SECTION_34 -.word ASSET_34_267 - ASSET_SECTION_34 -.word ASSET_34_268 - ASSET_SECTION_34 -.word ASSET_34_269 - ASSET_SECTION_34 -.word ASSET_34_270 - ASSET_SECTION_34 -.word ASSET_34_271 - ASSET_SECTION_34 -.word ASSET_34_272 - ASSET_SECTION_34 -.word ASSET_34_273 - ASSET_SECTION_34 -.word ASSET_34_274 - ASSET_SECTION_34 -.word ASSET_34_275 - ASSET_SECTION_34 -.word ASSET_34_276 - ASSET_SECTION_34 -.word ASSET_34_277 - ASSET_SECTION_34 -.word ASSET_34_278 - ASSET_SECTION_34 -.word ASSET_34_279 - ASSET_SECTION_34 -.word ASSET_34_280 - ASSET_SECTION_34 -.word ASSET_34_281 - ASSET_SECTION_34 -.word ASSET_34_282 - ASSET_SECTION_34 -.word ASSET_34_283 - ASSET_SECTION_34 -.word ASSET_34_284 - ASSET_SECTION_34 -.word ASSET_34_285 - ASSET_SECTION_34 -.word ASSET_34_286 - ASSET_SECTION_34 -.word ASSET_34_287 - ASSET_SECTION_34 -.word ASSET_34_288 - ASSET_SECTION_34 -.word ASSET_34_289 - ASSET_SECTION_34 -.word ASSET_34_290 - ASSET_SECTION_34 -.word ASSET_34_291 - ASSET_SECTION_34 -.word ASSET_34_292 - ASSET_SECTION_34 -.word ASSET_34_293 - ASSET_SECTION_34 -.word ASSET_34_294 - ASSET_SECTION_34 -.word ASSET_34_295 - ASSET_SECTION_34 -.word ASSET_34_296 - ASSET_SECTION_34 -.word ASSET_34_297 - ASSET_SECTION_34 -.word ASSET_34_298 - ASSET_SECTION_34 -.word ASSET_34_299 - ASSET_SECTION_34 -.word ASSET_34_300 - ASSET_SECTION_34 -.word ASSET_34_301 - ASSET_SECTION_34 -.word ASSET_34_302 - ASSET_SECTION_34 -.word ASSET_34_303 - ASSET_SECTION_34 -.word ASSET_SECTION_34_END - ASSET_SECTION_34 +glabel ASSET_OBJECT_HEADERS_TABLE +.word ASSET_OBJECT_HEADERS_0 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_1 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_2 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_3 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_4 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_5 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_6 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_7 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_8 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_9 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_10 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_11 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_12 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_13 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_14 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_15 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_16 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_17 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_18 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_19 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_20 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_21 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_22 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_23 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_24 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_25 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_26 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_27 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_28 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_29 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_30 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_31 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_32 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_33 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_34 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_35 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_36 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_37 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_38 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_39 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_40 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_41 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_42 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_43 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_44 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_45 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_46 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_47 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_48 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_49 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_50 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_51 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_52 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_53 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_54 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_55 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_56 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_57 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_58 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_59 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_60 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_61 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_62 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_63 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_64 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_65 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_66 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_67 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_68 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_69 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_70 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_71 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_72 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_73 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_74 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_75 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_76 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_77 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_78 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_79 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_80 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_81 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_82 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_83 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_84 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_85 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_86 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_87 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_88 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_89 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_90 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_91 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_92 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_93 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_94 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_95 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_96 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_97 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_98 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_99 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_100 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_101 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_102 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_103 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_104 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_105 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_106 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_107 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_108 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_109 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_110 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_111 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_112 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_113 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_114 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_115 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_116 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_117 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_118 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_119 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_120 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_121 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_122 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_123 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_124 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_125 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_126 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_127 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_128 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_129 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_130 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_131 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_132 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_133 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_134 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_135 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_136 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_137 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_138 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_139 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_140 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_141 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_142 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_143 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_144 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_145 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_146 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_147 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_148 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_149 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_150 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_151 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_152 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_153 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_154 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_155 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_156 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_157 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_158 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_159 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_160 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_161 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_162 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_163 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_164 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_165 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_166 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_167 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_168 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_169 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_170 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_171 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_172 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_173 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_174 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_175 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_176 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_177 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_178 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_179 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_180 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_181 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_182 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_183 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_184 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_185 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_186 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_187 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_188 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_189 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_190 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_191 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_192 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_193 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_194 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_195 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_196 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_197 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_198 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_199 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_200 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_201 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_202 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_203 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_204 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_205 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_206 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_207 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_208 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_209 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_210 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_211 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_212 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_213 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_214 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_215 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_216 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_217 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_218 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_219 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_220 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_221 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_222 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_223 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_224 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_225 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_226 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_227 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_228 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_229 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_230 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_231 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_232 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_233 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_234 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_235 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_236 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_237 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_238 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_239 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_240 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_241 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_242 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_243 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_244 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_245 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_246 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_247 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_248 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_249 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_250 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_251 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_252 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_253 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_254 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_255 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_256 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_257 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_258 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_259 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_260 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_261 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_262 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_263 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_264 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_265 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_266 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_267 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_268 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_269 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_270 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_271 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_272 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_273 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_274 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_275 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_276 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_277 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_278 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_279 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_280 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_281 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_282 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_283 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_284 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_285 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_286 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_287 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_288 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_289 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_290 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_291 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_292 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_293 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_294 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_295 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_296 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_297 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_298 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_299 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_300 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_301 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_302 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_303 - ASSET_OBJECT_HEADERS +.word ASSET_OBJECT_HEADERS_END - ASSET_OBJECT_HEADERS .word 0xFFFFFFFF -glabel ASSET_SECTION_33_END + +/********** ASSET_OBJECT_HEADERS **********/ .balign 16 -glabel ASSET_SECTION_34 -glabel ASSET_34_0 +glabel ASSET_OBJECT_HEADERS +glabel ASSET_OBJECT_HEADERS_0 .incbin "./build/us_1.0/objects/headers/unknown_34_0.bin" -glabel ASSET_34_1 +glabel ASSET_OBJECT_HEADERS_1 .incbin "./build/us_1.0/objects/headers/unknown_34_1.bin" -glabel ASSET_34_2 +glabel ASSET_OBJECT_HEADERS_2 .incbin "./build/us_1.0/objects/headers/unknown_34_2.bin" -glabel ASSET_34_3 +glabel ASSET_OBJECT_HEADERS_3 .incbin "./build/us_1.0/objects/headers/unknown_34_3.bin" -glabel ASSET_34_4 +glabel ASSET_OBJECT_HEADERS_4 .incbin "./build/us_1.0/objects/headers/unknown_34_4.bin" -glabel ASSET_34_5 +glabel ASSET_OBJECT_HEADERS_5 .incbin "./build/us_1.0/objects/headers/unknown_34_5.bin" -glabel ASSET_34_6 +glabel ASSET_OBJECT_HEADERS_6 .incbin "./build/us_1.0/objects/headers/unknown_34_6.bin" -glabel ASSET_34_7 +glabel ASSET_OBJECT_HEADERS_7 .incbin "./build/us_1.0/objects/headers/unknown_34_7.bin" -glabel ASSET_34_8 +glabel ASSET_OBJECT_HEADERS_8 .incbin "./build/us_1.0/objects/headers/unknown_34_8.bin" -glabel ASSET_34_9 +glabel ASSET_OBJECT_HEADERS_9 .incbin "./build/us_1.0/objects/headers/unknown_34_9.bin" -glabel ASSET_34_10 +glabel ASSET_OBJECT_HEADERS_10 .incbin "./build/us_1.0/objects/headers/unknown_34_10.bin" -glabel ASSET_34_11 +glabel ASSET_OBJECT_HEADERS_11 .incbin "./build/us_1.0/objects/headers/unknown_34_11.bin" -glabel ASSET_34_12 +glabel ASSET_OBJECT_HEADERS_12 .incbin "./build/us_1.0/objects/headers/unknown_34_12.bin" -glabel ASSET_34_13 +glabel ASSET_OBJECT_HEADERS_13 .incbin "./build/us_1.0/objects/headers/unknown_34_13.bin" -glabel ASSET_34_14 +glabel ASSET_OBJECT_HEADERS_14 .incbin "./build/us_1.0/objects/headers/unknown_34_14.bin" -glabel ASSET_34_15 +glabel ASSET_OBJECT_HEADERS_15 .incbin "./build/us_1.0/objects/headers/unknown_34_15.bin" -glabel ASSET_34_16 +glabel ASSET_OBJECT_HEADERS_16 .incbin "./build/us_1.0/objects/headers/unknown_34_16.bin" -glabel ASSET_34_17 +glabel ASSET_OBJECT_HEADERS_17 .incbin "./build/us_1.0/objects/headers/unknown_34_17.bin" -glabel ASSET_34_18 +glabel ASSET_OBJECT_HEADERS_18 .incbin "./build/us_1.0/objects/headers/unknown_34_18.bin" -glabel ASSET_34_19 +glabel ASSET_OBJECT_HEADERS_19 .incbin "./build/us_1.0/objects/headers/unknown_34_19.bin" -glabel ASSET_34_20 +glabel ASSET_OBJECT_HEADERS_20 .incbin "./build/us_1.0/objects/headers/unknown_34_20.bin" -glabel ASSET_34_21 +glabel ASSET_OBJECT_HEADERS_21 .incbin "./build/us_1.0/objects/headers/unknown_34_21.bin" -glabel ASSET_34_22 +glabel ASSET_OBJECT_HEADERS_22 .incbin "./build/us_1.0/objects/headers/unknown_34_22.bin" -glabel ASSET_34_23 +glabel ASSET_OBJECT_HEADERS_23 .incbin "./build/us_1.0/objects/headers/unknown_34_23.bin" -glabel ASSET_34_24 +glabel ASSET_OBJECT_HEADERS_24 .incbin "./build/us_1.0/objects/headers/unknown_34_24.bin" -glabel ASSET_34_25 +glabel ASSET_OBJECT_HEADERS_25 .incbin "./build/us_1.0/objects/headers/unknown_34_25.bin" -glabel ASSET_34_26 +glabel ASSET_OBJECT_HEADERS_26 .incbin "./build/us_1.0/objects/headers/unknown_34_26.bin" -glabel ASSET_34_27 +glabel ASSET_OBJECT_HEADERS_27 .incbin "./build/us_1.0/objects/headers/unknown_34_27.bin" -glabel ASSET_34_28 +glabel ASSET_OBJECT_HEADERS_28 .incbin "./build/us_1.0/objects/headers/unknown_34_28.bin" -glabel ASSET_34_29 +glabel ASSET_OBJECT_HEADERS_29 .incbin "./build/us_1.0/objects/headers/unknown_34_29.bin" -glabel ASSET_34_30 +glabel ASSET_OBJECT_HEADERS_30 .incbin "./build/us_1.0/objects/headers/unknown_34_30.bin" -glabel ASSET_34_31 +glabel ASSET_OBJECT_HEADERS_31 .incbin "./build/us_1.0/objects/headers/unknown_34_31.bin" -glabel ASSET_34_32 +glabel ASSET_OBJECT_HEADERS_32 .incbin "./build/us_1.0/objects/headers/unknown_34_32.bin" -glabel ASSET_34_33 +glabel ASSET_OBJECT_HEADERS_33 .incbin "./build/us_1.0/objects/headers/unknown_34_33.bin" -glabel ASSET_34_34 +glabel ASSET_OBJECT_HEADERS_34 .incbin "./build/us_1.0/objects/headers/unknown_34_34.bin" -glabel ASSET_34_35 +glabel ASSET_OBJECT_HEADERS_35 .incbin "./build/us_1.0/objects/headers/unknown_34_35.bin" -glabel ASSET_34_36 +glabel ASSET_OBJECT_HEADERS_36 .incbin "./build/us_1.0/objects/headers/unknown_34_36.bin" -glabel ASSET_34_37 +glabel ASSET_OBJECT_HEADERS_37 .incbin "./build/us_1.0/objects/headers/unknown_34_37.bin" -glabel ASSET_34_38 +glabel ASSET_OBJECT_HEADERS_38 .incbin "./build/us_1.0/objects/headers/unknown_34_38.bin" -glabel ASSET_34_39 +glabel ASSET_OBJECT_HEADERS_39 .incbin "./build/us_1.0/objects/headers/unknown_34_39.bin" -glabel ASSET_34_40 +glabel ASSET_OBJECT_HEADERS_40 .incbin "./build/us_1.0/objects/headers/unknown_34_40.bin" -glabel ASSET_34_41 +glabel ASSET_OBJECT_HEADERS_41 .incbin "./build/us_1.0/objects/headers/unknown_34_41.bin" -glabel ASSET_34_42 +glabel ASSET_OBJECT_HEADERS_42 .incbin "./build/us_1.0/objects/headers/unknown_34_42.bin" -glabel ASSET_34_43 +glabel ASSET_OBJECT_HEADERS_43 .incbin "./build/us_1.0/objects/headers/unknown_34_43.bin" -glabel ASSET_34_44 +glabel ASSET_OBJECT_HEADERS_44 .incbin "./build/us_1.0/objects/headers/unknown_34_44.bin" -glabel ASSET_34_45 +glabel ASSET_OBJECT_HEADERS_45 .incbin "./build/us_1.0/objects/headers/unknown_34_45.bin" -glabel ASSET_34_46 +glabel ASSET_OBJECT_HEADERS_46 .incbin "./build/us_1.0/objects/headers/unknown_34_46.bin" -glabel ASSET_34_47 +glabel ASSET_OBJECT_HEADERS_47 .incbin "./build/us_1.0/objects/headers/unknown_34_47.bin" -glabel ASSET_34_48 +glabel ASSET_OBJECT_HEADERS_48 .incbin "./build/us_1.0/objects/headers/unknown_34_48.bin" -glabel ASSET_34_49 +glabel ASSET_OBJECT_HEADERS_49 .incbin "./build/us_1.0/objects/headers/unknown_34_49.bin" -glabel ASSET_34_50 +glabel ASSET_OBJECT_HEADERS_50 .incbin "./build/us_1.0/objects/headers/unknown_34_50.bin" -glabel ASSET_34_51 +glabel ASSET_OBJECT_HEADERS_51 .incbin "./build/us_1.0/objects/headers/unknown_34_51.bin" -glabel ASSET_34_52 +glabel ASSET_OBJECT_HEADERS_52 .incbin "./build/us_1.0/objects/headers/unknown_34_52.bin" -glabel ASSET_34_53 +glabel ASSET_OBJECT_HEADERS_53 .incbin "./build/us_1.0/objects/headers/unknown_34_53.bin" -glabel ASSET_34_54 +glabel ASSET_OBJECT_HEADERS_54 .incbin "./build/us_1.0/objects/headers/unknown_34_54.bin" -glabel ASSET_34_55 +glabel ASSET_OBJECT_HEADERS_55 .incbin "./build/us_1.0/objects/headers/unknown_34_55.bin" -glabel ASSET_34_56 +glabel ASSET_OBJECT_HEADERS_56 .incbin "./build/us_1.0/objects/headers/unknown_34_56.bin" -glabel ASSET_34_57 +glabel ASSET_OBJECT_HEADERS_57 .incbin "./build/us_1.0/objects/headers/unknown_34_57.bin" -glabel ASSET_34_58 +glabel ASSET_OBJECT_HEADERS_58 .incbin "./build/us_1.0/objects/headers/unknown_34_58.bin" -glabel ASSET_34_59 +glabel ASSET_OBJECT_HEADERS_59 .incbin "./build/us_1.0/objects/headers/unknown_34_59.bin" -glabel ASSET_34_60 +glabel ASSET_OBJECT_HEADERS_60 .incbin "./build/us_1.0/objects/headers/unknown_34_60.bin" -glabel ASSET_34_61 +glabel ASSET_OBJECT_HEADERS_61 .incbin "./build/us_1.0/objects/headers/unknown_34_61.bin" -glabel ASSET_34_62 +glabel ASSET_OBJECT_HEADERS_62 .incbin "./build/us_1.0/objects/headers/unknown_34_62.bin" -glabel ASSET_34_63 +glabel ASSET_OBJECT_HEADERS_63 .incbin "./build/us_1.0/objects/headers/unknown_34_63.bin" -glabel ASSET_34_64 +glabel ASSET_OBJECT_HEADERS_64 .incbin "./build/us_1.0/objects/headers/unknown_34_64.bin" -glabel ASSET_34_65 +glabel ASSET_OBJECT_HEADERS_65 .incbin "./build/us_1.0/objects/headers/unknown_34_65.bin" -glabel ASSET_34_66 +glabel ASSET_OBJECT_HEADERS_66 .incbin "./build/us_1.0/objects/headers/unknown_34_66.bin" -glabel ASSET_34_67 +glabel ASSET_OBJECT_HEADERS_67 .incbin "./build/us_1.0/objects/headers/unknown_34_67.bin" -glabel ASSET_34_68 +glabel ASSET_OBJECT_HEADERS_68 .incbin "./build/us_1.0/objects/headers/unknown_34_68.bin" -glabel ASSET_34_69 +glabel ASSET_OBJECT_HEADERS_69 .incbin "./build/us_1.0/objects/headers/unknown_34_69.bin" -glabel ASSET_34_70 +glabel ASSET_OBJECT_HEADERS_70 .incbin "./build/us_1.0/objects/headers/unknown_34_70.bin" -glabel ASSET_34_71 +glabel ASSET_OBJECT_HEADERS_71 .incbin "./build/us_1.0/objects/headers/unknown_34_71.bin" -glabel ASSET_34_72 +glabel ASSET_OBJECT_HEADERS_72 .incbin "./build/us_1.0/objects/headers/unknown_34_72.bin" -glabel ASSET_34_73 +glabel ASSET_OBJECT_HEADERS_73 .incbin "./build/us_1.0/objects/headers/unknown_34_73.bin" -glabel ASSET_34_74 +glabel ASSET_OBJECT_HEADERS_74 .incbin "./build/us_1.0/objects/headers/unknown_34_74.bin" -glabel ASSET_34_75 +glabel ASSET_OBJECT_HEADERS_75 .incbin "./build/us_1.0/objects/headers/unknown_34_75.bin" -glabel ASSET_34_76 +glabel ASSET_OBJECT_HEADERS_76 .incbin "./build/us_1.0/objects/headers/unknown_34_76.bin" -glabel ASSET_34_77 +glabel ASSET_OBJECT_HEADERS_77 .incbin "./build/us_1.0/objects/headers/unknown_34_77.bin" -glabel ASSET_34_78 +glabel ASSET_OBJECT_HEADERS_78 .incbin "./build/us_1.0/objects/headers/unknown_34_78.bin" -glabel ASSET_34_79 +glabel ASSET_OBJECT_HEADERS_79 .incbin "./build/us_1.0/objects/headers/unknown_34_79.bin" -glabel ASSET_34_80 +glabel ASSET_OBJECT_HEADERS_80 .incbin "./build/us_1.0/objects/headers/unknown_34_80.bin" -glabel ASSET_34_81 +glabel ASSET_OBJECT_HEADERS_81 .incbin "./build/us_1.0/objects/headers/unknown_34_81.bin" -glabel ASSET_34_82 +glabel ASSET_OBJECT_HEADERS_82 .incbin "./build/us_1.0/objects/headers/unknown_34_82.bin" -glabel ASSET_34_83 +glabel ASSET_OBJECT_HEADERS_83 .incbin "./build/us_1.0/objects/headers/unknown_34_83.bin" -glabel ASSET_34_84 +glabel ASSET_OBJECT_HEADERS_84 .incbin "./build/us_1.0/objects/headers/unknown_34_84.bin" -glabel ASSET_34_85 +glabel ASSET_OBJECT_HEADERS_85 .incbin "./build/us_1.0/objects/headers/unknown_34_85.bin" -glabel ASSET_34_86 +glabel ASSET_OBJECT_HEADERS_86 .incbin "./build/us_1.0/objects/headers/unknown_34_86.bin" -glabel ASSET_34_87 +glabel ASSET_OBJECT_HEADERS_87 .incbin "./build/us_1.0/objects/headers/unknown_34_87.bin" -glabel ASSET_34_88 +glabel ASSET_OBJECT_HEADERS_88 .incbin "./build/us_1.0/objects/headers/unknown_34_88.bin" -glabel ASSET_34_89 +glabel ASSET_OBJECT_HEADERS_89 .incbin "./build/us_1.0/objects/headers/unknown_34_89.bin" -glabel ASSET_34_90 +glabel ASSET_OBJECT_HEADERS_90 .incbin "./build/us_1.0/objects/headers/unknown_34_90.bin" -glabel ASSET_34_91 +glabel ASSET_OBJECT_HEADERS_91 .incbin "./build/us_1.0/objects/headers/unknown_34_91.bin" -glabel ASSET_34_92 +glabel ASSET_OBJECT_HEADERS_92 .incbin "./build/us_1.0/objects/headers/unknown_34_92.bin" -glabel ASSET_34_93 +glabel ASSET_OBJECT_HEADERS_93 .incbin "./build/us_1.0/objects/headers/unknown_34_93.bin" -glabel ASSET_34_94 +glabel ASSET_OBJECT_HEADERS_94 .incbin "./build/us_1.0/objects/headers/unknown_34_94.bin" -glabel ASSET_34_95 +glabel ASSET_OBJECT_HEADERS_95 .incbin "./build/us_1.0/objects/headers/unknown_34_95.bin" -glabel ASSET_34_96 +glabel ASSET_OBJECT_HEADERS_96 .incbin "./build/us_1.0/objects/headers/unknown_34_96.bin" -glabel ASSET_34_97 +glabel ASSET_OBJECT_HEADERS_97 .incbin "./build/us_1.0/objects/headers/unknown_34_97.bin" -glabel ASSET_34_98 +glabel ASSET_OBJECT_HEADERS_98 .incbin "./build/us_1.0/objects/headers/unknown_34_98.bin" -glabel ASSET_34_99 +glabel ASSET_OBJECT_HEADERS_99 .incbin "./build/us_1.0/objects/headers/unknown_34_99.bin" -glabel ASSET_34_100 +glabel ASSET_OBJECT_HEADERS_100 .incbin "./build/us_1.0/objects/headers/unknown_34_100.bin" -glabel ASSET_34_101 +glabel ASSET_OBJECT_HEADERS_101 .incbin "./build/us_1.0/objects/headers/unknown_34_101.bin" -glabel ASSET_34_102 +glabel ASSET_OBJECT_HEADERS_102 .incbin "./build/us_1.0/objects/headers/unknown_34_102.bin" -glabel ASSET_34_103 +glabel ASSET_OBJECT_HEADERS_103 .incbin "./build/us_1.0/objects/headers/unknown_34_103.bin" -glabel ASSET_34_104 +glabel ASSET_OBJECT_HEADERS_104 .incbin "./build/us_1.0/objects/headers/unknown_34_104.bin" -glabel ASSET_34_105 +glabel ASSET_OBJECT_HEADERS_105 .incbin "./build/us_1.0/objects/headers/unknown_34_105.bin" -glabel ASSET_34_106 +glabel ASSET_OBJECT_HEADERS_106 .incbin "./build/us_1.0/objects/headers/unknown_34_106.bin" -glabel ASSET_34_107 +glabel ASSET_OBJECT_HEADERS_107 .incbin "./build/us_1.0/objects/headers/unknown_34_107.bin" -glabel ASSET_34_108 +glabel ASSET_OBJECT_HEADERS_108 .incbin "./build/us_1.0/objects/headers/unknown_34_108.bin" -glabel ASSET_34_109 +glabel ASSET_OBJECT_HEADERS_109 .incbin "./build/us_1.0/objects/headers/unknown_34_109.bin" -glabel ASSET_34_110 +glabel ASSET_OBJECT_HEADERS_110 .incbin "./build/us_1.0/objects/headers/unknown_34_110.bin" -glabel ASSET_34_111 +glabel ASSET_OBJECT_HEADERS_111 .incbin "./build/us_1.0/objects/headers/unknown_34_111.bin" -glabel ASSET_34_112 +glabel ASSET_OBJECT_HEADERS_112 .incbin "./build/us_1.0/objects/headers/unknown_34_112.bin" -glabel ASSET_34_113 +glabel ASSET_OBJECT_HEADERS_113 .incbin "./build/us_1.0/objects/headers/unknown_34_113.bin" -glabel ASSET_34_114 +glabel ASSET_OBJECT_HEADERS_114 .incbin "./build/us_1.0/objects/headers/unknown_34_114.bin" -glabel ASSET_34_115 +glabel ASSET_OBJECT_HEADERS_115 .incbin "./build/us_1.0/objects/headers/unknown_34_115.bin" -glabel ASSET_34_116 +glabel ASSET_OBJECT_HEADERS_116 .incbin "./build/us_1.0/objects/headers/unknown_34_116.bin" -glabel ASSET_34_117 +glabel ASSET_OBJECT_HEADERS_117 .incbin "./build/us_1.0/objects/headers/unknown_34_117.bin" -glabel ASSET_34_118 +glabel ASSET_OBJECT_HEADERS_118 .incbin "./build/us_1.0/objects/headers/unknown_34_118.bin" -glabel ASSET_34_119 +glabel ASSET_OBJECT_HEADERS_119 .incbin "./build/us_1.0/objects/headers/unknown_34_119.bin" -glabel ASSET_34_120 +glabel ASSET_OBJECT_HEADERS_120 .incbin "./build/us_1.0/objects/headers/unknown_34_120.bin" -glabel ASSET_34_121 +glabel ASSET_OBJECT_HEADERS_121 .incbin "./build/us_1.0/objects/headers/unknown_34_121.bin" -glabel ASSET_34_122 +glabel ASSET_OBJECT_HEADERS_122 .incbin "./build/us_1.0/objects/headers/unknown_34_122.bin" -glabel ASSET_34_123 +glabel ASSET_OBJECT_HEADERS_123 .incbin "./build/us_1.0/objects/headers/unknown_34_123.bin" -glabel ASSET_34_124 +glabel ASSET_OBJECT_HEADERS_124 .incbin "./build/us_1.0/objects/headers/unknown_34_124.bin" -glabel ASSET_34_125 +glabel ASSET_OBJECT_HEADERS_125 .incbin "./build/us_1.0/objects/headers/unknown_34_125.bin" -glabel ASSET_34_126 +glabel ASSET_OBJECT_HEADERS_126 .incbin "./build/us_1.0/objects/headers/unknown_34_126.bin" -glabel ASSET_34_127 +glabel ASSET_OBJECT_HEADERS_127 .incbin "./build/us_1.0/objects/headers/unknown_34_127.bin" -glabel ASSET_34_128 +glabel ASSET_OBJECT_HEADERS_128 .incbin "./build/us_1.0/objects/headers/unknown_34_128.bin" -glabel ASSET_34_129 +glabel ASSET_OBJECT_HEADERS_129 .incbin "./build/us_1.0/objects/headers/unknown_34_129.bin" -glabel ASSET_34_130 +glabel ASSET_OBJECT_HEADERS_130 .incbin "./build/us_1.0/objects/headers/unknown_34_130.bin" -glabel ASSET_34_131 +glabel ASSET_OBJECT_HEADERS_131 .incbin "./build/us_1.0/objects/headers/unknown_34_131.bin" -glabel ASSET_34_132 +glabel ASSET_OBJECT_HEADERS_132 .incbin "./build/us_1.0/objects/headers/unknown_34_132.bin" -glabel ASSET_34_133 +glabel ASSET_OBJECT_HEADERS_133 .incbin "./build/us_1.0/objects/headers/unknown_34_133.bin" -glabel ASSET_34_134 +glabel ASSET_OBJECT_HEADERS_134 .incbin "./build/us_1.0/objects/headers/unknown_34_134.bin" -glabel ASSET_34_135 +glabel ASSET_OBJECT_HEADERS_135 .incbin "./build/us_1.0/objects/headers/unknown_34_135.bin" -glabel ASSET_34_136 +glabel ASSET_OBJECT_HEADERS_136 .incbin "./build/us_1.0/objects/headers/unknown_34_136.bin" -glabel ASSET_34_137 +glabel ASSET_OBJECT_HEADERS_137 .incbin "./build/us_1.0/objects/headers/unknown_34_137.bin" -glabel ASSET_34_138 +glabel ASSET_OBJECT_HEADERS_138 .incbin "./build/us_1.0/objects/headers/unknown_34_138.bin" -glabel ASSET_34_139 +glabel ASSET_OBJECT_HEADERS_139 .incbin "./build/us_1.0/objects/headers/unknown_34_139.bin" -glabel ASSET_34_140 +glabel ASSET_OBJECT_HEADERS_140 .incbin "./build/us_1.0/objects/headers/unknown_34_140.bin" -glabel ASSET_34_141 +glabel ASSET_OBJECT_HEADERS_141 .incbin "./build/us_1.0/objects/headers/unknown_34_141.bin" -glabel ASSET_34_142 +glabel ASSET_OBJECT_HEADERS_142 .incbin "./build/us_1.0/objects/headers/unknown_34_142.bin" -glabel ASSET_34_143 +glabel ASSET_OBJECT_HEADERS_143 .incbin "./build/us_1.0/objects/headers/unknown_34_143.bin" -glabel ASSET_34_144 +glabel ASSET_OBJECT_HEADERS_144 .incbin "./build/us_1.0/objects/headers/unknown_34_144.bin" -glabel ASSET_34_145 +glabel ASSET_OBJECT_HEADERS_145 .incbin "./build/us_1.0/objects/headers/unknown_34_145.bin" -glabel ASSET_34_146 +glabel ASSET_OBJECT_HEADERS_146 .incbin "./build/us_1.0/objects/headers/unknown_34_146.bin" -glabel ASSET_34_147 +glabel ASSET_OBJECT_HEADERS_147 .incbin "./build/us_1.0/objects/headers/unknown_34_147.bin" -glabel ASSET_34_148 +glabel ASSET_OBJECT_HEADERS_148 .incbin "./build/us_1.0/objects/headers/unknown_34_148.bin" -glabel ASSET_34_149 +glabel ASSET_OBJECT_HEADERS_149 .incbin "./build/us_1.0/objects/headers/unknown_34_149.bin" -glabel ASSET_34_150 +glabel ASSET_OBJECT_HEADERS_150 .incbin "./build/us_1.0/objects/headers/unknown_34_150.bin" -glabel ASSET_34_151 +glabel ASSET_OBJECT_HEADERS_151 .incbin "./build/us_1.0/objects/headers/unknown_34_151.bin" -glabel ASSET_34_152 +glabel ASSET_OBJECT_HEADERS_152 .incbin "./build/us_1.0/objects/headers/unknown_34_152.bin" -glabel ASSET_34_153 +glabel ASSET_OBJECT_HEADERS_153 .incbin "./build/us_1.0/objects/headers/unknown_34_153.bin" -glabel ASSET_34_154 +glabel ASSET_OBJECT_HEADERS_154 .incbin "./build/us_1.0/objects/headers/unknown_34_154.bin" -glabel ASSET_34_155 +glabel ASSET_OBJECT_HEADERS_155 .incbin "./build/us_1.0/objects/headers/unknown_34_155.bin" -glabel ASSET_34_156 +glabel ASSET_OBJECT_HEADERS_156 .incbin "./build/us_1.0/objects/headers/unknown_34_156.bin" -glabel ASSET_34_157 +glabel ASSET_OBJECT_HEADERS_157 .incbin "./build/us_1.0/objects/headers/unknown_34_157.bin" -glabel ASSET_34_158 +glabel ASSET_OBJECT_HEADERS_158 .incbin "./build/us_1.0/objects/headers/unknown_34_158.bin" -glabel ASSET_34_159 +glabel ASSET_OBJECT_HEADERS_159 .incbin "./build/us_1.0/objects/headers/unknown_34_159.bin" -glabel ASSET_34_160 +glabel ASSET_OBJECT_HEADERS_160 .incbin "./build/us_1.0/objects/headers/unknown_34_160.bin" -glabel ASSET_34_161 +glabel ASSET_OBJECT_HEADERS_161 .incbin "./build/us_1.0/objects/headers/unknown_34_161.bin" -glabel ASSET_34_162 +glabel ASSET_OBJECT_HEADERS_162 .incbin "./build/us_1.0/objects/headers/unknown_34_162.bin" -glabel ASSET_34_163 +glabel ASSET_OBJECT_HEADERS_163 .incbin "./build/us_1.0/objects/headers/unknown_34_163.bin" -glabel ASSET_34_164 +glabel ASSET_OBJECT_HEADERS_164 .incbin "./build/us_1.0/objects/headers/unknown_34_164.bin" -glabel ASSET_34_165 +glabel ASSET_OBJECT_HEADERS_165 .incbin "./build/us_1.0/objects/headers/unknown_34_165.bin" -glabel ASSET_34_166 +glabel ASSET_OBJECT_HEADERS_166 .incbin "./build/us_1.0/objects/headers/unknown_34_166.bin" -glabel ASSET_34_167 +glabel ASSET_OBJECT_HEADERS_167 .incbin "./build/us_1.0/objects/headers/unknown_34_167.bin" -glabel ASSET_34_168 +glabel ASSET_OBJECT_HEADERS_168 .incbin "./build/us_1.0/objects/headers/unknown_34_168.bin" -glabel ASSET_34_169 +glabel ASSET_OBJECT_HEADERS_169 .incbin "./build/us_1.0/objects/headers/unknown_34_169.bin" -glabel ASSET_34_170 +glabel ASSET_OBJECT_HEADERS_170 .incbin "./build/us_1.0/objects/headers/unknown_34_170.bin" -glabel ASSET_34_171 +glabel ASSET_OBJECT_HEADERS_171 .incbin "./build/us_1.0/objects/headers/unknown_34_171.bin" -glabel ASSET_34_172 +glabel ASSET_OBJECT_HEADERS_172 .incbin "./build/us_1.0/objects/headers/unknown_34_172.bin" -glabel ASSET_34_173 +glabel ASSET_OBJECT_HEADERS_173 .incbin "./build/us_1.0/objects/headers/unknown_34_173.bin" -glabel ASSET_34_174 +glabel ASSET_OBJECT_HEADERS_174 .incbin "./build/us_1.0/objects/headers/unknown_34_174.bin" -glabel ASSET_34_175 +glabel ASSET_OBJECT_HEADERS_175 .incbin "./build/us_1.0/objects/headers/unknown_34_175.bin" -glabel ASSET_34_176 +glabel ASSET_OBJECT_HEADERS_176 .incbin "./build/us_1.0/objects/headers/unknown_34_176.bin" -glabel ASSET_34_177 +glabel ASSET_OBJECT_HEADERS_177 .incbin "./build/us_1.0/objects/headers/unknown_34_177.bin" -glabel ASSET_34_178 +glabel ASSET_OBJECT_HEADERS_178 .incbin "./build/us_1.0/objects/headers/unknown_34_178.bin" -glabel ASSET_34_179 +glabel ASSET_OBJECT_HEADERS_179 .incbin "./build/us_1.0/objects/headers/unknown_34_179.bin" -glabel ASSET_34_180 +glabel ASSET_OBJECT_HEADERS_180 .incbin "./build/us_1.0/objects/headers/unknown_34_180.bin" -glabel ASSET_34_181 +glabel ASSET_OBJECT_HEADERS_181 .incbin "./build/us_1.0/objects/headers/unknown_34_181.bin" -glabel ASSET_34_182 +glabel ASSET_OBJECT_HEADERS_182 .incbin "./build/us_1.0/objects/headers/unknown_34_182.bin" -glabel ASSET_34_183 +glabel ASSET_OBJECT_HEADERS_183 .incbin "./build/us_1.0/objects/headers/unknown_34_183.bin" -glabel ASSET_34_184 +glabel ASSET_OBJECT_HEADERS_184 .incbin "./build/us_1.0/objects/headers/unknown_34_184.bin" -glabel ASSET_34_185 +glabel ASSET_OBJECT_HEADERS_185 .incbin "./build/us_1.0/objects/headers/unknown_34_185.bin" -glabel ASSET_34_186 +glabel ASSET_OBJECT_HEADERS_186 .incbin "./build/us_1.0/objects/headers/unknown_34_186.bin" -glabel ASSET_34_187 +glabel ASSET_OBJECT_HEADERS_187 .incbin "./build/us_1.0/objects/headers/unknown_34_187.bin" -glabel ASSET_34_188 +glabel ASSET_OBJECT_HEADERS_188 .incbin "./build/us_1.0/objects/headers/unknown_34_188.bin" -glabel ASSET_34_189 +glabel ASSET_OBJECT_HEADERS_189 .incbin "./build/us_1.0/objects/headers/unknown_34_189.bin" -glabel ASSET_34_190 +glabel ASSET_OBJECT_HEADERS_190 .incbin "./build/us_1.0/objects/headers/unknown_34_190.bin" -glabel ASSET_34_191 +glabel ASSET_OBJECT_HEADERS_191 .incbin "./build/us_1.0/objects/headers/unknown_34_191.bin" -glabel ASSET_34_192 +glabel ASSET_OBJECT_HEADERS_192 .incbin "./build/us_1.0/objects/headers/unknown_34_192.bin" -glabel ASSET_34_193 +glabel ASSET_OBJECT_HEADERS_193 .incbin "./build/us_1.0/objects/headers/unknown_34_193.bin" -glabel ASSET_34_194 +glabel ASSET_OBJECT_HEADERS_194 .incbin "./build/us_1.0/objects/headers/unknown_34_194.bin" -glabel ASSET_34_195 +glabel ASSET_OBJECT_HEADERS_195 .incbin "./build/us_1.0/objects/headers/unknown_34_195.bin" -glabel ASSET_34_196 +glabel ASSET_OBJECT_HEADERS_196 .incbin "./build/us_1.0/objects/headers/unknown_34_196.bin" -glabel ASSET_34_197 +glabel ASSET_OBJECT_HEADERS_197 .incbin "./build/us_1.0/objects/headers/unknown_34_197.bin" -glabel ASSET_34_198 +glabel ASSET_OBJECT_HEADERS_198 .incbin "./build/us_1.0/objects/headers/unknown_34_198.bin" -glabel ASSET_34_199 +glabel ASSET_OBJECT_HEADERS_199 .incbin "./build/us_1.0/objects/headers/unknown_34_199.bin" -glabel ASSET_34_200 +glabel ASSET_OBJECT_HEADERS_200 .incbin "./build/us_1.0/objects/headers/unknown_34_200.bin" -glabel ASSET_34_201 +glabel ASSET_OBJECT_HEADERS_201 .incbin "./build/us_1.0/objects/headers/unknown_34_201.bin" -glabel ASSET_34_202 +glabel ASSET_OBJECT_HEADERS_202 .incbin "./build/us_1.0/objects/headers/unknown_34_202.bin" -glabel ASSET_34_203 +glabel ASSET_OBJECT_HEADERS_203 .incbin "./build/us_1.0/objects/headers/unknown_34_203.bin" -glabel ASSET_34_204 +glabel ASSET_OBJECT_HEADERS_204 .incbin "./build/us_1.0/objects/headers/unknown_34_204.bin" -glabel ASSET_34_205 +glabel ASSET_OBJECT_HEADERS_205 .incbin "./build/us_1.0/objects/headers/unknown_34_205.bin" -glabel ASSET_34_206 +glabel ASSET_OBJECT_HEADERS_206 .incbin "./build/us_1.0/objects/headers/unknown_34_206.bin" -glabel ASSET_34_207 +glabel ASSET_OBJECT_HEADERS_207 .incbin "./build/us_1.0/objects/headers/unknown_34_207.bin" -glabel ASSET_34_208 +glabel ASSET_OBJECT_HEADERS_208 .incbin "./build/us_1.0/objects/headers/unknown_34_208.bin" -glabel ASSET_34_209 +glabel ASSET_OBJECT_HEADERS_209 .incbin "./build/us_1.0/objects/headers/unknown_34_209.bin" -glabel ASSET_34_210 +glabel ASSET_OBJECT_HEADERS_210 .incbin "./build/us_1.0/objects/headers/unknown_34_210.bin" -glabel ASSET_34_211 +glabel ASSET_OBJECT_HEADERS_211 .incbin "./build/us_1.0/objects/headers/unknown_34_211.bin" -glabel ASSET_34_212 +glabel ASSET_OBJECT_HEADERS_212 .incbin "./build/us_1.0/objects/headers/unknown_34_212.bin" -glabel ASSET_34_213 +glabel ASSET_OBJECT_HEADERS_213 .incbin "./build/us_1.0/objects/headers/unknown_34_213.bin" -glabel ASSET_34_214 +glabel ASSET_OBJECT_HEADERS_214 .incbin "./build/us_1.0/objects/headers/unknown_34_214.bin" -glabel ASSET_34_215 +glabel ASSET_OBJECT_HEADERS_215 .incbin "./build/us_1.0/objects/headers/unknown_34_215.bin" -glabel ASSET_34_216 +glabel ASSET_OBJECT_HEADERS_216 .incbin "./build/us_1.0/objects/headers/unknown_34_216.bin" -glabel ASSET_34_217 +glabel ASSET_OBJECT_HEADERS_217 .incbin "./build/us_1.0/objects/headers/unknown_34_217.bin" -glabel ASSET_34_218 +glabel ASSET_OBJECT_HEADERS_218 .incbin "./build/us_1.0/objects/headers/unknown_34_218.bin" -glabel ASSET_34_219 +glabel ASSET_OBJECT_HEADERS_219 .incbin "./build/us_1.0/objects/headers/unknown_34_219.bin" -glabel ASSET_34_220 +glabel ASSET_OBJECT_HEADERS_220 .incbin "./build/us_1.0/objects/headers/unknown_34_220.bin" -glabel ASSET_34_221 +glabel ASSET_OBJECT_HEADERS_221 .incbin "./build/us_1.0/objects/headers/unknown_34_221.bin" -glabel ASSET_34_222 +glabel ASSET_OBJECT_HEADERS_222 .incbin "./build/us_1.0/objects/headers/unknown_34_222.bin" -glabel ASSET_34_223 +glabel ASSET_OBJECT_HEADERS_223 .incbin "./build/us_1.0/objects/headers/unknown_34_223.bin" -glabel ASSET_34_224 +glabel ASSET_OBJECT_HEADERS_224 .incbin "./build/us_1.0/objects/headers/unknown_34_224.bin" -glabel ASSET_34_225 +glabel ASSET_OBJECT_HEADERS_225 .incbin "./build/us_1.0/objects/headers/unknown_34_225.bin" -glabel ASSET_34_226 +glabel ASSET_OBJECT_HEADERS_226 .incbin "./build/us_1.0/objects/headers/unknown_34_226.bin" -glabel ASSET_34_227 +glabel ASSET_OBJECT_HEADERS_227 .incbin "./build/us_1.0/objects/headers/unknown_34_227.bin" -glabel ASSET_34_228 +glabel ASSET_OBJECT_HEADERS_228 .incbin "./build/us_1.0/objects/headers/unknown_34_228.bin" -glabel ASSET_34_229 +glabel ASSET_OBJECT_HEADERS_229 .incbin "./build/us_1.0/objects/headers/unknown_34_229.bin" -glabel ASSET_34_230 +glabel ASSET_OBJECT_HEADERS_230 .incbin "./build/us_1.0/objects/headers/unknown_34_230.bin" -glabel ASSET_34_231 +glabel ASSET_OBJECT_HEADERS_231 .incbin "./build/us_1.0/objects/headers/unknown_34_231.bin" -glabel ASSET_34_232 +glabel ASSET_OBJECT_HEADERS_232 .incbin "./build/us_1.0/objects/headers/unknown_34_232.bin" -glabel ASSET_34_233 +glabel ASSET_OBJECT_HEADERS_233 .incbin "./build/us_1.0/objects/headers/unknown_34_233.bin" -glabel ASSET_34_234 +glabel ASSET_OBJECT_HEADERS_234 .incbin "./build/us_1.0/objects/headers/unknown_34_234.bin" -glabel ASSET_34_235 +glabel ASSET_OBJECT_HEADERS_235 .incbin "./build/us_1.0/objects/headers/unknown_34_235.bin" -glabel ASSET_34_236 +glabel ASSET_OBJECT_HEADERS_236 .incbin "./build/us_1.0/objects/headers/unknown_34_236.bin" -glabel ASSET_34_237 +glabel ASSET_OBJECT_HEADERS_237 .incbin "./build/us_1.0/objects/headers/unknown_34_237.bin" -glabel ASSET_34_238 +glabel ASSET_OBJECT_HEADERS_238 .incbin "./build/us_1.0/objects/headers/unknown_34_238.bin" -glabel ASSET_34_239 +glabel ASSET_OBJECT_HEADERS_239 .incbin "./build/us_1.0/objects/headers/unknown_34_239.bin" -glabel ASSET_34_240 +glabel ASSET_OBJECT_HEADERS_240 .incbin "./build/us_1.0/objects/headers/unknown_34_240.bin" -glabel ASSET_34_241 +glabel ASSET_OBJECT_HEADERS_241 .incbin "./build/us_1.0/objects/headers/unknown_34_241.bin" -glabel ASSET_34_242 +glabel ASSET_OBJECT_HEADERS_242 .incbin "./build/us_1.0/objects/headers/unknown_34_242.bin" -glabel ASSET_34_243 +glabel ASSET_OBJECT_HEADERS_243 .incbin "./build/us_1.0/objects/headers/unknown_34_243.bin" -glabel ASSET_34_244 +glabel ASSET_OBJECT_HEADERS_244 .incbin "./build/us_1.0/objects/headers/unknown_34_244.bin" -glabel ASSET_34_245 +glabel ASSET_OBJECT_HEADERS_245 .incbin "./build/us_1.0/objects/headers/unknown_34_245.bin" -glabel ASSET_34_246 +glabel ASSET_OBJECT_HEADERS_246 .incbin "./build/us_1.0/objects/headers/unknown_34_246.bin" -glabel ASSET_34_247 +glabel ASSET_OBJECT_HEADERS_247 .incbin "./build/us_1.0/objects/headers/unknown_34_247.bin" -glabel ASSET_34_248 +glabel ASSET_OBJECT_HEADERS_248 .incbin "./build/us_1.0/objects/headers/unknown_34_248.bin" -glabel ASSET_34_249 +glabel ASSET_OBJECT_HEADERS_249 .incbin "./build/us_1.0/objects/headers/unknown_34_249.bin" -glabel ASSET_34_250 +glabel ASSET_OBJECT_HEADERS_250 .incbin "./build/us_1.0/objects/headers/unknown_34_250.bin" -glabel ASSET_34_251 +glabel ASSET_OBJECT_HEADERS_251 .incbin "./build/us_1.0/objects/headers/unknown_34_251.bin" -glabel ASSET_34_252 +glabel ASSET_OBJECT_HEADERS_252 .incbin "./build/us_1.0/objects/headers/unknown_34_252.bin" -glabel ASSET_34_253 +glabel ASSET_OBJECT_HEADERS_253 .incbin "./build/us_1.0/objects/headers/unknown_34_253.bin" -glabel ASSET_34_254 +glabel ASSET_OBJECT_HEADERS_254 .incbin "./build/us_1.0/objects/headers/unknown_34_254.bin" -glabel ASSET_34_255 +glabel ASSET_OBJECT_HEADERS_255 .incbin "./build/us_1.0/objects/headers/unknown_34_255.bin" -glabel ASSET_34_256 +glabel ASSET_OBJECT_HEADERS_256 .incbin "./build/us_1.0/objects/headers/unknown_34_256.bin" -glabel ASSET_34_257 +glabel ASSET_OBJECT_HEADERS_257 .incbin "./build/us_1.0/objects/headers/unknown_34_257.bin" -glabel ASSET_34_258 +glabel ASSET_OBJECT_HEADERS_258 .incbin "./build/us_1.0/objects/headers/unknown_34_258.bin" -glabel ASSET_34_259 +glabel ASSET_OBJECT_HEADERS_259 .incbin "./build/us_1.0/objects/headers/unknown_34_259.bin" -glabel ASSET_34_260 +glabel ASSET_OBJECT_HEADERS_260 .incbin "./build/us_1.0/objects/headers/unknown_34_260.bin" -glabel ASSET_34_261 +glabel ASSET_OBJECT_HEADERS_261 .incbin "./build/us_1.0/objects/headers/unknown_34_261.bin" -glabel ASSET_34_262 +glabel ASSET_OBJECT_HEADERS_262 .incbin "./build/us_1.0/objects/headers/unknown_34_262.bin" -glabel ASSET_34_263 +glabel ASSET_OBJECT_HEADERS_263 .incbin "./build/us_1.0/objects/headers/unknown_34_263.bin" -glabel ASSET_34_264 +glabel ASSET_OBJECT_HEADERS_264 .incbin "./build/us_1.0/objects/headers/unknown_34_264.bin" -glabel ASSET_34_265 +glabel ASSET_OBJECT_HEADERS_265 .incbin "./build/us_1.0/objects/headers/unknown_34_265.bin" -glabel ASSET_34_266 +glabel ASSET_OBJECT_HEADERS_266 .incbin "./build/us_1.0/objects/headers/unknown_34_266.bin" -glabel ASSET_34_267 +glabel ASSET_OBJECT_HEADERS_267 .incbin "./build/us_1.0/objects/headers/unknown_34_267.bin" -glabel ASSET_34_268 +glabel ASSET_OBJECT_HEADERS_268 .incbin "./build/us_1.0/objects/headers/unknown_34_268.bin" -glabel ASSET_34_269 +glabel ASSET_OBJECT_HEADERS_269 .incbin "./build/us_1.0/objects/headers/unknown_34_269.bin" -glabel ASSET_34_270 +glabel ASSET_OBJECT_HEADERS_270 .incbin "./build/us_1.0/objects/headers/unknown_34_270.bin" -glabel ASSET_34_271 +glabel ASSET_OBJECT_HEADERS_271 .incbin "./build/us_1.0/objects/headers/unknown_34_271.bin" -glabel ASSET_34_272 +glabel ASSET_OBJECT_HEADERS_272 .incbin "./build/us_1.0/objects/headers/unknown_34_272.bin" -glabel ASSET_34_273 +glabel ASSET_OBJECT_HEADERS_273 .incbin "./build/us_1.0/objects/headers/unknown_34_273.bin" -glabel ASSET_34_274 +glabel ASSET_OBJECT_HEADERS_274 .incbin "./build/us_1.0/objects/headers/unknown_34_274.bin" -glabel ASSET_34_275 +glabel ASSET_OBJECT_HEADERS_275 .incbin "./build/us_1.0/objects/headers/unknown_34_275.bin" -glabel ASSET_34_276 +glabel ASSET_OBJECT_HEADERS_276 .incbin "./build/us_1.0/objects/headers/unknown_34_276.bin" -glabel ASSET_34_277 +glabel ASSET_OBJECT_HEADERS_277 .incbin "./build/us_1.0/objects/headers/unknown_34_277.bin" -glabel ASSET_34_278 +glabel ASSET_OBJECT_HEADERS_278 .incbin "./build/us_1.0/objects/headers/unknown_34_278.bin" -glabel ASSET_34_279 +glabel ASSET_OBJECT_HEADERS_279 .incbin "./build/us_1.0/objects/headers/unknown_34_279.bin" -glabel ASSET_34_280 +glabel ASSET_OBJECT_HEADERS_280 .incbin "./build/us_1.0/objects/headers/unknown_34_280.bin" -glabel ASSET_34_281 +glabel ASSET_OBJECT_HEADERS_281 .incbin "./build/us_1.0/objects/headers/unknown_34_281.bin" -glabel ASSET_34_282 +glabel ASSET_OBJECT_HEADERS_282 .incbin "./build/us_1.0/objects/headers/unknown_34_282.bin" -glabel ASSET_34_283 +glabel ASSET_OBJECT_HEADERS_283 .incbin "./build/us_1.0/objects/headers/unknown_34_283.bin" -glabel ASSET_34_284 +glabel ASSET_OBJECT_HEADERS_284 .incbin "./build/us_1.0/objects/headers/unknown_34_284.bin" -glabel ASSET_34_285 +glabel ASSET_OBJECT_HEADERS_285 .incbin "./build/us_1.0/objects/headers/unknown_34_285.bin" -glabel ASSET_34_286 +glabel ASSET_OBJECT_HEADERS_286 .incbin "./build/us_1.0/objects/headers/unknown_34_286.bin" -glabel ASSET_34_287 +glabel ASSET_OBJECT_HEADERS_287 .incbin "./build/us_1.0/objects/headers/unknown_34_287.bin" -glabel ASSET_34_288 +glabel ASSET_OBJECT_HEADERS_288 .incbin "./build/us_1.0/objects/headers/unknown_34_288.bin" -glabel ASSET_34_289 +glabel ASSET_OBJECT_HEADERS_289 .incbin "./build/us_1.0/objects/headers/unknown_34_289.bin" -glabel ASSET_34_290 +glabel ASSET_OBJECT_HEADERS_290 .incbin "./build/us_1.0/objects/headers/unknown_34_290.bin" -glabel ASSET_34_291 +glabel ASSET_OBJECT_HEADERS_291 .incbin "./build/us_1.0/objects/headers/unknown_34_291.bin" -glabel ASSET_34_292 +glabel ASSET_OBJECT_HEADERS_292 .incbin "./build/us_1.0/objects/headers/unknown_34_292.bin" -glabel ASSET_34_293 +glabel ASSET_OBJECT_HEADERS_293 .incbin "./build/us_1.0/objects/headers/unknown_34_293.bin" -glabel ASSET_34_294 +glabel ASSET_OBJECT_HEADERS_294 .incbin "./build/us_1.0/objects/headers/unknown_34_294.bin" -glabel ASSET_34_295 +glabel ASSET_OBJECT_HEADERS_295 .incbin "./build/us_1.0/objects/headers/unknown_34_295.bin" -glabel ASSET_34_296 +glabel ASSET_OBJECT_HEADERS_296 .incbin "./build/us_1.0/objects/headers/unknown_34_296.bin" -glabel ASSET_34_297 +glabel ASSET_OBJECT_HEADERS_297 .incbin "./build/us_1.0/objects/headers/unknown_34_297.bin" -glabel ASSET_34_298 +glabel ASSET_OBJECT_HEADERS_298 .incbin "./build/us_1.0/objects/headers/unknown_34_298.bin" -glabel ASSET_34_299 +glabel ASSET_OBJECT_HEADERS_299 .incbin "./build/us_1.0/objects/headers/unknown_34_299.bin" -glabel ASSET_34_300 +glabel ASSET_OBJECT_HEADERS_300 .incbin "./build/us_1.0/objects/headers/unknown_34_300.bin" -glabel ASSET_34_301 +glabel ASSET_OBJECT_HEADERS_301 .incbin "./build/us_1.0/objects/headers/unknown_34_301.bin" -glabel ASSET_34_302 +glabel ASSET_OBJECT_HEADERS_302 .incbin "./build/us_1.0/objects/headers/unknown_34_302.bin" -glabel ASSET_34_303 +glabel ASSET_OBJECT_HEADERS_303 .incbin "./build/us_1.0/objects/headers/unknown_34_303.bin" -glabel ASSET_SECTION_34_END +glabel ASSET_OBJECT_HEADERS_END + +/********** ASSET_LEVEL_OBJECT_TRANSLATION_TABLE **********/ .balign 16 -glabel ASSET_SECTION_35 -glabel ASSET_35_0 +glabel ASSET_LEVEL_OBJECT_TRANSLATION_TABLE .incbin "./build/us_1.0/objects/level_object_translation_table.bin" -glabel ASSET_SECTION_35_END +glabel ASSET_LEVEL_OBJECT_TRANSLATION_TABLE_END + +/********** ASSET_EMPTY_37_TABLE **********/ .balign 16 -glabel ASSET_SECTION_36 -# Empty table -.word ASSET_SECTION_37_END - ASSET_SECTION_37 +glabel ASSET_EMPTY_37_TABLE +.word ASSET_EMPTY_37_END - ASSET_EMPTY_37 .word 0xFFFFFFFF -glabel ASSET_SECTION_36_END + +/********** ASSET_EMPTY_37 **********/ .balign 16 -glabel ASSET_SECTION_37 -# Empty -glabel ASSET_SECTION_37_END +glabel ASSET_EMPTY_37 +glabel ASSET_EMPTY_37_END + +/********** ASSET_AUDIO_TABLE **********/ .balign 16 -glabel ASSET_SECTION_38 -.word ASSET_39_1 - ASSET_SECTION_39 -.word ASSET_39_2 - ASSET_SECTION_39 -.word ASSET_39_3 - ASSET_SECTION_39 -.word ASSET_39_4 - ASSET_SECTION_39 -.word ASSET_39_5 - ASSET_SECTION_39 -.word ASSET_39_6 - ASSET_SECTION_39 -.word ASSET_39_7 - ASSET_SECTION_39 -.word ASSET_39_8 - ASSET_SECTION_39 -.word ASSET_39_9 - ASSET_SECTION_39 -.word ASSET_39_10 - ASSET_SECTION_39 -.word ASSET_39_11 - ASSET_SECTION_39 -.word ASSET_39_12 - ASSET_SECTION_39 -.word ASSET_SECTION_39_END - ASSET_SECTION_39 +glabel ASSET_AUDIO_TABLE +.word ASSET_AUDIO_1 - ASSET_AUDIO +.word ASSET_AUDIO_2 - ASSET_AUDIO +.word ASSET_AUDIO_3 - ASSET_AUDIO +.word ASSET_AUDIO_4 - ASSET_AUDIO +.word ASSET_AUDIO_5 - ASSET_AUDIO +.word ASSET_AUDIO_6 - ASSET_AUDIO +.word ASSET_AUDIO_7 - ASSET_AUDIO +.word ASSET_AUDIO_8 - ASSET_AUDIO +.word ASSET_AUDIO_9 - ASSET_AUDIO +.word ASSET_AUDIO_10 - ASSET_AUDIO +.word ASSET_AUDIO_11 - ASSET_AUDIO +.word ASSET_AUDIO_12 - ASSET_AUDIO +.word ASSET_AUDIO_END - ASSET_AUDIO .word 0xFFFFFFFF -glabel ASSET_SECTION_38_END + +/********** ASSET_AUDIO **********/ .balign 16 -glabel ASSET_SECTION_39 -glabel ASSET_39_0 +glabel ASSET_AUDIO +glabel ASSET_AUDIO_0 .incbin "./build/us_1.0/audio/unknown_39_0.bin" -glabel ASSET_39_1 +glabel ASSET_AUDIO_1 .incbin "./build/us_1.0/audio/unknown_39_1.bin" -glabel ASSET_39_2 +glabel ASSET_AUDIO_2 .incbin "./build/us_1.0/audio/unknown_39_2.bin" -glabel ASSET_39_3 +glabel ASSET_AUDIO_3 .incbin "./build/us_1.0/audio/unknown_39_3.bin" -glabel ASSET_39_4 +glabel ASSET_AUDIO_4 .incbin "./build/us_1.0/audio/unknown_39_4.bin" -glabel ASSET_39_5 +glabel ASSET_AUDIO_5 .incbin "./build/us_1.0/audio/unknown_39_5.bin" -glabel ASSET_39_6 +glabel ASSET_AUDIO_6 .incbin "./build/us_1.0/audio/unknown_39_6.bin" -glabel ASSET_39_7 +glabel ASSET_AUDIO_7 .incbin "./build/us_1.0/audio/unknown_39_7.bin" -glabel ASSET_39_8 +glabel ASSET_AUDIO_8 .incbin "./build/us_1.0/audio/unknown_39_8.bin" -glabel ASSET_39_9 +glabel ASSET_AUDIO_9 .incbin "./build/us_1.0/audio/unknown_39_9.bin" -glabel ASSET_39_10 +glabel ASSET_AUDIO_10 .incbin "./build/us_1.0/audio/unknown_39_10.bin" -glabel ASSET_39_11 +glabel ASSET_AUDIO_11 .incbin "./build/us_1.0/audio/unknown_39_11.bin" -glabel ASSET_39_12 +glabel ASSET_AUDIO_12 .incbin "./build/us_1.0/audio/unknown_39_12.bin" -glabel ASSET_SECTION_39_END +glabel ASSET_AUDIO_END + +/********** ASSET_PARTICLES_TABLE **********/ .balign 16 -glabel ASSET_SECTION_40 -.word ASSET_41_0 - ASSET_SECTION_41 -.word ASSET_41_1 - ASSET_SECTION_41 -.word ASSET_41_2 - ASSET_SECTION_41 -.word ASSET_41_3 - ASSET_SECTION_41 -.word ASSET_41_4 - ASSET_SECTION_41 -.word ASSET_41_5 - ASSET_SECTION_41 -.word ASSET_41_6 - ASSET_SECTION_41 -.word ASSET_41_7 - ASSET_SECTION_41 -.word ASSET_41_8 - ASSET_SECTION_41 -.word ASSET_41_9 - ASSET_SECTION_41 -.word ASSET_41_10 - ASSET_SECTION_41 -.word ASSET_41_11 - ASSET_SECTION_41 -.word ASSET_41_12 - ASSET_SECTION_41 -.word ASSET_41_13 - ASSET_SECTION_41 -.word ASSET_41_14 - ASSET_SECTION_41 -.word ASSET_41_15 - ASSET_SECTION_41 -.word ASSET_41_16 - ASSET_SECTION_41 -.word ASSET_41_17 - ASSET_SECTION_41 -.word ASSET_41_18 - ASSET_SECTION_41 -.word ASSET_41_19 - ASSET_SECTION_41 -.word ASSET_41_20 - ASSET_SECTION_41 -.word ASSET_41_21 - ASSET_SECTION_41 -.word ASSET_41_22 - ASSET_SECTION_41 -.word ASSET_41_23 - ASSET_SECTION_41 -.word ASSET_41_24 - ASSET_SECTION_41 -.word ASSET_41_25 - ASSET_SECTION_41 -.word ASSET_41_26 - ASSET_SECTION_41 -.word ASSET_41_27 - ASSET_SECTION_41 -.word ASSET_41_28 - ASSET_SECTION_41 -.word ASSET_41_29 - ASSET_SECTION_41 -.word ASSET_41_30 - ASSET_SECTION_41 -.word ASSET_41_31 - ASSET_SECTION_41 -.word ASSET_41_32 - ASSET_SECTION_41 -.word ASSET_41_33 - ASSET_SECTION_41 -.word ASSET_41_34 - ASSET_SECTION_41 -.word ASSET_41_35 - ASSET_SECTION_41 -.word ASSET_41_36 - ASSET_SECTION_41 -.word ASSET_41_37 - ASSET_SECTION_41 -.word ASSET_41_38 - ASSET_SECTION_41 -.word ASSET_41_39 - ASSET_SECTION_41 -.word ASSET_41_40 - ASSET_SECTION_41 -.word ASSET_41_41 - ASSET_SECTION_41 -.word ASSET_41_42 - ASSET_SECTION_41 -.word ASSET_41_43 - ASSET_SECTION_41 -.word ASSET_41_44 - ASSET_SECTION_41 -.word ASSET_41_45 - ASSET_SECTION_41 -.word ASSET_41_46 - ASSET_SECTION_41 -.word ASSET_41_47 - ASSET_SECTION_41 -.word ASSET_41_48 - ASSET_SECTION_41 -.word ASSET_41_49 - ASSET_SECTION_41 -.word ASSET_41_50 - ASSET_SECTION_41 -.word ASSET_41_51 - ASSET_SECTION_41 -.word ASSET_41_52 - ASSET_SECTION_41 -.word ASSET_41_53 - ASSET_SECTION_41 -.word ASSET_41_54 - ASSET_SECTION_41 -.word ASSET_41_55 - ASSET_SECTION_41 -.word ASSET_41_56 - ASSET_SECTION_41 -.word ASSET_41_57 - ASSET_SECTION_41 -.word ASSET_41_58 - ASSET_SECTION_41 -.word ASSET_41_59 - ASSET_SECTION_41 -.word ASSET_41_60 - ASSET_SECTION_41 -.word ASSET_41_61 - ASSET_SECTION_41 -.word ASSET_41_62 - ASSET_SECTION_41 -.word ASSET_41_63 - ASSET_SECTION_41 -.word ASSET_41_64 - ASSET_SECTION_41 -.word ASSET_41_65 - ASSET_SECTION_41 -.word ASSET_41_66 - ASSET_SECTION_41 -.word ASSET_41_67 - ASSET_SECTION_41 -.word ASSET_41_68 - ASSET_SECTION_41 -.word ASSET_41_69 - ASSET_SECTION_41 -.word ASSET_SECTION_41_END - ASSET_SECTION_41 +glabel ASSET_PARTICLES_TABLE +.word ASSET_PARTICLES_0 - ASSET_PARTICLES +.word ASSET_PARTICLES_1 - ASSET_PARTICLES +.word ASSET_PARTICLES_2 - ASSET_PARTICLES +.word ASSET_PARTICLES_3 - ASSET_PARTICLES +.word ASSET_PARTICLES_4 - ASSET_PARTICLES +.word ASSET_PARTICLES_5 - ASSET_PARTICLES +.word ASSET_PARTICLES_6 - ASSET_PARTICLES +.word ASSET_PARTICLES_7 - ASSET_PARTICLES +.word ASSET_PARTICLES_8 - ASSET_PARTICLES +.word ASSET_PARTICLES_9 - ASSET_PARTICLES +.word ASSET_PARTICLES_10 - ASSET_PARTICLES +.word ASSET_PARTICLES_11 - ASSET_PARTICLES +.word ASSET_PARTICLES_12 - ASSET_PARTICLES +.word ASSET_PARTICLES_13 - ASSET_PARTICLES +.word ASSET_PARTICLES_14 - ASSET_PARTICLES +.word ASSET_PARTICLES_15 - ASSET_PARTICLES +.word ASSET_PARTICLES_16 - ASSET_PARTICLES +.word ASSET_PARTICLES_17 - ASSET_PARTICLES +.word ASSET_PARTICLES_18 - ASSET_PARTICLES +.word ASSET_PARTICLES_19 - ASSET_PARTICLES +.word ASSET_PARTICLES_20 - ASSET_PARTICLES +.word ASSET_PARTICLES_21 - ASSET_PARTICLES +.word ASSET_PARTICLES_22 - ASSET_PARTICLES +.word ASSET_PARTICLES_23 - ASSET_PARTICLES +.word ASSET_PARTICLES_24 - ASSET_PARTICLES +.word ASSET_PARTICLES_25 - ASSET_PARTICLES +.word ASSET_PARTICLES_26 - ASSET_PARTICLES +.word ASSET_PARTICLES_27 - ASSET_PARTICLES +.word ASSET_PARTICLES_28 - ASSET_PARTICLES +.word ASSET_PARTICLES_29 - ASSET_PARTICLES +.word ASSET_PARTICLES_30 - ASSET_PARTICLES +.word ASSET_PARTICLES_31 - ASSET_PARTICLES +.word ASSET_PARTICLES_32 - ASSET_PARTICLES +.word ASSET_PARTICLES_33 - ASSET_PARTICLES +.word ASSET_PARTICLES_34 - ASSET_PARTICLES +.word ASSET_PARTICLES_35 - ASSET_PARTICLES +.word ASSET_PARTICLES_36 - ASSET_PARTICLES +.word ASSET_PARTICLES_37 - ASSET_PARTICLES +.word ASSET_PARTICLES_38 - ASSET_PARTICLES +.word ASSET_PARTICLES_39 - ASSET_PARTICLES +.word ASSET_PARTICLES_40 - ASSET_PARTICLES +.word ASSET_PARTICLES_41 - ASSET_PARTICLES +.word ASSET_PARTICLES_42 - ASSET_PARTICLES +.word ASSET_PARTICLES_43 - ASSET_PARTICLES +.word ASSET_PARTICLES_44 - ASSET_PARTICLES +.word ASSET_PARTICLES_45 - ASSET_PARTICLES +.word ASSET_PARTICLES_46 - ASSET_PARTICLES +.word ASSET_PARTICLES_47 - ASSET_PARTICLES +.word ASSET_PARTICLES_48 - ASSET_PARTICLES +.word ASSET_PARTICLES_49 - ASSET_PARTICLES +.word ASSET_PARTICLES_50 - ASSET_PARTICLES +.word ASSET_PARTICLES_51 - ASSET_PARTICLES +.word ASSET_PARTICLES_52 - ASSET_PARTICLES +.word ASSET_PARTICLES_53 - ASSET_PARTICLES +.word ASSET_PARTICLES_54 - ASSET_PARTICLES +.word ASSET_PARTICLES_55 - ASSET_PARTICLES +.word ASSET_PARTICLES_56 - ASSET_PARTICLES +.word ASSET_PARTICLES_57 - ASSET_PARTICLES +.word ASSET_PARTICLES_58 - ASSET_PARTICLES +.word ASSET_PARTICLES_59 - ASSET_PARTICLES +.word ASSET_PARTICLES_60 - ASSET_PARTICLES +.word ASSET_PARTICLES_61 - ASSET_PARTICLES +.word ASSET_PARTICLES_62 - ASSET_PARTICLES +.word ASSET_PARTICLES_63 - ASSET_PARTICLES +.word ASSET_PARTICLES_64 - ASSET_PARTICLES +.word ASSET_PARTICLES_65 - ASSET_PARTICLES +.word ASSET_PARTICLES_66 - ASSET_PARTICLES +.word ASSET_PARTICLES_67 - ASSET_PARTICLES +.word ASSET_PARTICLES_68 - ASSET_PARTICLES +.word ASSET_PARTICLES_69 - ASSET_PARTICLES +.word ASSET_PARTICLES_END - ASSET_PARTICLES .word 0xFFFFFFFF -glabel ASSET_SECTION_40_END + +/********** ASSET_PARTICLES **********/ .balign 16 -glabel ASSET_SECTION_41 -glabel ASSET_41_0 +glabel ASSET_PARTICLES +glabel ASSET_PARTICLES_0 .incbin "./build/us_1.0/particles/particles/unknown_41_0.bin" -glabel ASSET_41_1 +glabel ASSET_PARTICLES_1 .incbin "./build/us_1.0/particles/particles/unknown_41_1.bin" -glabel ASSET_41_2 +glabel ASSET_PARTICLES_2 .incbin "./build/us_1.0/particles/particles/unknown_41_2.bin" -glabel ASSET_41_3 +glabel ASSET_PARTICLES_3 .incbin "./build/us_1.0/particles/particles/unknown_41_3.bin" -glabel ASSET_41_4 +glabel ASSET_PARTICLES_4 .incbin "./build/us_1.0/particles/particles/unknown_41_4.bin" -glabel ASSET_41_5 +glabel ASSET_PARTICLES_5 .incbin "./build/us_1.0/particles/particles/unknown_41_5.bin" -glabel ASSET_41_6 +glabel ASSET_PARTICLES_6 .incbin "./build/us_1.0/particles/particles/unknown_41_6.bin" -glabel ASSET_41_7 +glabel ASSET_PARTICLES_7 .incbin "./build/us_1.0/particles/particles/unknown_41_7.bin" -glabel ASSET_41_8 +glabel ASSET_PARTICLES_8 .incbin "./build/us_1.0/particles/particles/unknown_41_8.bin" -glabel ASSET_41_9 +glabel ASSET_PARTICLES_9 .incbin "./build/us_1.0/particles/particles/unknown_41_9.bin" -glabel ASSET_41_10 +glabel ASSET_PARTICLES_10 .incbin "./build/us_1.0/particles/particles/unknown_41_10.bin" -glabel ASSET_41_11 +glabel ASSET_PARTICLES_11 .incbin "./build/us_1.0/particles/particles/unknown_41_11.bin" -glabel ASSET_41_12 +glabel ASSET_PARTICLES_12 .incbin "./build/us_1.0/particles/particles/unknown_41_12.bin" -glabel ASSET_41_13 +glabel ASSET_PARTICLES_13 .incbin "./build/us_1.0/particles/particles/unknown_41_13.bin" -glabel ASSET_41_14 +glabel ASSET_PARTICLES_14 .incbin "./build/us_1.0/particles/particles/unknown_41_14.bin" -glabel ASSET_41_15 +glabel ASSET_PARTICLES_15 .incbin "./build/us_1.0/particles/particles/unknown_41_15.bin" -glabel ASSET_41_16 +glabel ASSET_PARTICLES_16 .incbin "./build/us_1.0/particles/particles/unknown_41_16.bin" -glabel ASSET_41_17 +glabel ASSET_PARTICLES_17 .incbin "./build/us_1.0/particles/particles/unknown_41_17.bin" -glabel ASSET_41_18 +glabel ASSET_PARTICLES_18 .incbin "./build/us_1.0/particles/particles/unknown_41_18.bin" -glabel ASSET_41_19 +glabel ASSET_PARTICLES_19 .incbin "./build/us_1.0/particles/particles/unknown_41_19.bin" -glabel ASSET_41_20 +glabel ASSET_PARTICLES_20 .incbin "./build/us_1.0/particles/particles/unknown_41_20.bin" -glabel ASSET_41_21 +glabel ASSET_PARTICLES_21 .incbin "./build/us_1.0/particles/particles/unknown_41_21.bin" -glabel ASSET_41_22 +glabel ASSET_PARTICLES_22 .incbin "./build/us_1.0/particles/particles/unknown_41_22.bin" -glabel ASSET_41_23 +glabel ASSET_PARTICLES_23 .incbin "./build/us_1.0/particles/particles/unknown_41_23.bin" -glabel ASSET_41_24 +glabel ASSET_PARTICLES_24 .incbin "./build/us_1.0/particles/particles/unknown_41_24.bin" -glabel ASSET_41_25 +glabel ASSET_PARTICLES_25 .incbin "./build/us_1.0/particles/particles/unknown_41_25.bin" -glabel ASSET_41_26 +glabel ASSET_PARTICLES_26 .incbin "./build/us_1.0/particles/particles/unknown_41_26.bin" -glabel ASSET_41_27 +glabel ASSET_PARTICLES_27 .incbin "./build/us_1.0/particles/particles/unknown_41_27.bin" -glabel ASSET_41_28 +glabel ASSET_PARTICLES_28 .incbin "./build/us_1.0/particles/particles/unknown_41_28.bin" -glabel ASSET_41_29 +glabel ASSET_PARTICLES_29 .incbin "./build/us_1.0/particles/particles/unknown_41_29.bin" -glabel ASSET_41_30 +glabel ASSET_PARTICLES_30 .incbin "./build/us_1.0/particles/particles/unknown_41_30.bin" -glabel ASSET_41_31 +glabel ASSET_PARTICLES_31 .incbin "./build/us_1.0/particles/particles/unknown_41_31.bin" -glabel ASSET_41_32 +glabel ASSET_PARTICLES_32 .incbin "./build/us_1.0/particles/particles/unknown_41_32.bin" -glabel ASSET_41_33 +glabel ASSET_PARTICLES_33 .incbin "./build/us_1.0/particles/particles/unknown_41_33.bin" -glabel ASSET_41_34 +glabel ASSET_PARTICLES_34 .incbin "./build/us_1.0/particles/particles/unknown_41_34.bin" -glabel ASSET_41_35 +glabel ASSET_PARTICLES_35 .incbin "./build/us_1.0/particles/particles/unknown_41_35.bin" -glabel ASSET_41_36 +glabel ASSET_PARTICLES_36 .incbin "./build/us_1.0/particles/particles/unknown_41_36.bin" -glabel ASSET_41_37 +glabel ASSET_PARTICLES_37 .incbin "./build/us_1.0/particles/particles/unknown_41_37.bin" -glabel ASSET_41_38 +glabel ASSET_PARTICLES_38 .incbin "./build/us_1.0/particles/particles/unknown_41_38.bin" -glabel ASSET_41_39 +glabel ASSET_PARTICLES_39 .incbin "./build/us_1.0/particles/particles/unknown_41_39.bin" -glabel ASSET_41_40 +glabel ASSET_PARTICLES_40 .incbin "./build/us_1.0/particles/particles/unknown_41_40.bin" -glabel ASSET_41_41 +glabel ASSET_PARTICLES_41 .incbin "./build/us_1.0/particles/particles/unknown_41_41.bin" -glabel ASSET_41_42 +glabel ASSET_PARTICLES_42 .incbin "./build/us_1.0/particles/particles/unknown_41_42.bin" -glabel ASSET_41_43 +glabel ASSET_PARTICLES_43 .incbin "./build/us_1.0/particles/particles/unknown_41_43.bin" -glabel ASSET_41_44 +glabel ASSET_PARTICLES_44 .incbin "./build/us_1.0/particles/particles/unknown_41_44.bin" -glabel ASSET_41_45 +glabel ASSET_PARTICLES_45 .incbin "./build/us_1.0/particles/particles/unknown_41_45.bin" -glabel ASSET_41_46 +glabel ASSET_PARTICLES_46 .incbin "./build/us_1.0/particles/particles/unknown_41_46.bin" -glabel ASSET_41_47 +glabel ASSET_PARTICLES_47 .incbin "./build/us_1.0/particles/particles/unknown_41_47.bin" -glabel ASSET_41_48 +glabel ASSET_PARTICLES_48 .incbin "./build/us_1.0/particles/particles/unknown_41_48.bin" -glabel ASSET_41_49 +glabel ASSET_PARTICLES_49 .incbin "./build/us_1.0/particles/particles/unknown_41_49.bin" -glabel ASSET_41_50 +glabel ASSET_PARTICLES_50 .incbin "./build/us_1.0/particles/particles/unknown_41_50.bin" -glabel ASSET_41_51 +glabel ASSET_PARTICLES_51 .incbin "./build/us_1.0/particles/particles/unknown_41_51.bin" -glabel ASSET_41_52 +glabel ASSET_PARTICLES_52 .incbin "./build/us_1.0/particles/particles/unknown_41_52.bin" -glabel ASSET_41_53 +glabel ASSET_PARTICLES_53 .incbin "./build/us_1.0/particles/particles/unknown_41_53.bin" -glabel ASSET_41_54 +glabel ASSET_PARTICLES_54 .incbin "./build/us_1.0/particles/particles/unknown_41_54.bin" -glabel ASSET_41_55 +glabel ASSET_PARTICLES_55 .incbin "./build/us_1.0/particles/particles/unknown_41_55.bin" -glabel ASSET_41_56 +glabel ASSET_PARTICLES_56 .incbin "./build/us_1.0/particles/particles/unknown_41_56.bin" -glabel ASSET_41_57 +glabel ASSET_PARTICLES_57 .incbin "./build/us_1.0/particles/particles/unknown_41_57.bin" -glabel ASSET_41_58 +glabel ASSET_PARTICLES_58 .incbin "./build/us_1.0/particles/particles/unknown_41_58.bin" -glabel ASSET_41_59 +glabel ASSET_PARTICLES_59 .incbin "./build/us_1.0/particles/particles/unknown_41_59.bin" -glabel ASSET_41_60 +glabel ASSET_PARTICLES_60 .incbin "./build/us_1.0/particles/particles/unknown_41_60.bin" -glabel ASSET_41_61 +glabel ASSET_PARTICLES_61 .incbin "./build/us_1.0/particles/particles/unknown_41_61.bin" -glabel ASSET_41_62 +glabel ASSET_PARTICLES_62 .incbin "./build/us_1.0/particles/particles/unknown_41_62.bin" -glabel ASSET_41_63 +glabel ASSET_PARTICLES_63 .incbin "./build/us_1.0/particles/particles/unknown_41_63.bin" -glabel ASSET_41_64 +glabel ASSET_PARTICLES_64 .incbin "./build/us_1.0/particles/particles/unknown_41_64.bin" -glabel ASSET_41_65 +glabel ASSET_PARTICLES_65 .incbin "./build/us_1.0/particles/particles/unknown_41_65.bin" -glabel ASSET_41_66 +glabel ASSET_PARTICLES_66 .incbin "./build/us_1.0/particles/particles/unknown_41_66.bin" -glabel ASSET_41_67 +glabel ASSET_PARTICLES_67 .incbin "./build/us_1.0/particles/particles/unknown_41_67.bin" -glabel ASSET_41_68 +glabel ASSET_PARTICLES_68 .incbin "./build/us_1.0/particles/particles/unknown_41_68.bin" -glabel ASSET_41_69 +glabel ASSET_PARTICLES_69 .incbin "./build/us_1.0/particles/particles/unknown_41_69.bin" -glabel ASSET_SECTION_41_END +glabel ASSET_PARTICLES_END + +/********** ASSET_PARTICLE_BEHAVIORS_TABLE **********/ .balign 16 -glabel ASSET_SECTION_42 -.word ASSET_43_0 - ASSET_SECTION_43 -.word ASSET_43_1 - ASSET_SECTION_43 -.word ASSET_43_2 - ASSET_SECTION_43 -.word ASSET_43_3 - ASSET_SECTION_43 -.word ASSET_43_4 - ASSET_SECTION_43 -.word ASSET_43_5 - ASSET_SECTION_43 -.word ASSET_43_6 - ASSET_SECTION_43 -.word ASSET_43_7 - ASSET_SECTION_43 -.word ASSET_43_8 - ASSET_SECTION_43 -.word ASSET_43_9 - ASSET_SECTION_43 -.word ASSET_43_10 - ASSET_SECTION_43 -.word ASSET_43_11 - ASSET_SECTION_43 -.word ASSET_43_12 - ASSET_SECTION_43 -.word ASSET_43_13 - ASSET_SECTION_43 -.word ASSET_43_14 - ASSET_SECTION_43 -.word ASSET_43_15 - ASSET_SECTION_43 -.word ASSET_43_16 - ASSET_SECTION_43 -.word ASSET_43_17 - ASSET_SECTION_43 -.word ASSET_43_18 - ASSET_SECTION_43 -.word ASSET_43_19 - ASSET_SECTION_43 -.word ASSET_43_20 - ASSET_SECTION_43 -.word ASSET_43_21 - ASSET_SECTION_43 -.word ASSET_43_22 - ASSET_SECTION_43 -.word ASSET_43_23 - ASSET_SECTION_43 -.word ASSET_43_24 - ASSET_SECTION_43 -.word ASSET_43_25 - ASSET_SECTION_43 -.word ASSET_43_26 - ASSET_SECTION_43 -.word ASSET_43_27 - ASSET_SECTION_43 -.word ASSET_43_28 - ASSET_SECTION_43 -.word ASSET_43_29 - ASSET_SECTION_43 -.word ASSET_43_30 - ASSET_SECTION_43 -.word ASSET_43_31 - ASSET_SECTION_43 -.word ASSET_43_32 - ASSET_SECTION_43 -.word ASSET_43_33 - ASSET_SECTION_43 -.word ASSET_43_34 - ASSET_SECTION_43 -.word ASSET_43_35 - ASSET_SECTION_43 -.word ASSET_43_36 - ASSET_SECTION_43 -.word ASSET_43_37 - ASSET_SECTION_43 -.word ASSET_43_38 - ASSET_SECTION_43 -.word ASSET_43_39 - ASSET_SECTION_43 -.word ASSET_43_40 - ASSET_SECTION_43 -.word ASSET_43_41 - ASSET_SECTION_43 -.word ASSET_43_42 - ASSET_SECTION_43 -.word ASSET_43_43 - ASSET_SECTION_43 -.word ASSET_43_44 - ASSET_SECTION_43 -.word ASSET_43_45 - ASSET_SECTION_43 -.word ASSET_43_46 - ASSET_SECTION_43 -.word ASSET_43_47 - ASSET_SECTION_43 -.word ASSET_43_48 - ASSET_SECTION_43 -.word ASSET_43_49 - ASSET_SECTION_43 -.word ASSET_43_50 - ASSET_SECTION_43 -.word ASSET_43_51 - ASSET_SECTION_43 -.word ASSET_43_52 - ASSET_SECTION_43 -.word ASSET_43_53 - ASSET_SECTION_43 -.word ASSET_43_54 - ASSET_SECTION_43 -.word ASSET_43_55 - ASSET_SECTION_43 -.word ASSET_43_56 - ASSET_SECTION_43 -.word ASSET_43_57 - ASSET_SECTION_43 -.word ASSET_43_58 - ASSET_SECTION_43 -.word ASSET_43_59 - ASSET_SECTION_43 -.word ASSET_43_60 - ASSET_SECTION_43 -.word ASSET_43_61 - ASSET_SECTION_43 -.word ASSET_43_62 - ASSET_SECTION_43 -.word ASSET_43_63 - ASSET_SECTION_43 -.word ASSET_43_64 - ASSET_SECTION_43 -.word ASSET_43_65 - ASSET_SECTION_43 -.word ASSET_43_66 - ASSET_SECTION_43 -.word ASSET_43_67 - ASSET_SECTION_43 -.word ASSET_43_68 - ASSET_SECTION_43 -.word ASSET_43_69 - ASSET_SECTION_43 -.word ASSET_43_70 - ASSET_SECTION_43 -.word ASSET_43_71 - ASSET_SECTION_43 -.word ASSET_43_72 - ASSET_SECTION_43 -.word ASSET_43_73 - ASSET_SECTION_43 -.word ASSET_43_74 - ASSET_SECTION_43 -.word ASSET_SECTION_43_END - ASSET_SECTION_43 +glabel ASSET_PARTICLE_BEHAVIORS_TABLE +.word ASSET_PARTICLE_BEHAVIORS_0 - ASSET_PARTICLE_BEHAVIORS +.word ASSET_PARTICLE_BEHAVIORS_1 - ASSET_PARTICLE_BEHAVIORS +.word ASSET_PARTICLE_BEHAVIORS_2 - ASSET_PARTICLE_BEHAVIORS +.word ASSET_PARTICLE_BEHAVIORS_3 - ASSET_PARTICLE_BEHAVIORS +.word ASSET_PARTICLE_BEHAVIORS_4 - ASSET_PARTICLE_BEHAVIORS +.word ASSET_PARTICLE_BEHAVIORS_5 - ASSET_PARTICLE_BEHAVIORS +.word ASSET_PARTICLE_BEHAVIORS_6 - ASSET_PARTICLE_BEHAVIORS +.word ASSET_PARTICLE_BEHAVIORS_7 - ASSET_PARTICLE_BEHAVIORS +.word ASSET_PARTICLE_BEHAVIORS_8 - ASSET_PARTICLE_BEHAVIORS +.word ASSET_PARTICLE_BEHAVIORS_9 - ASSET_PARTICLE_BEHAVIORS +.word ASSET_PARTICLE_BEHAVIORS_10 - ASSET_PARTICLE_BEHAVIORS +.word ASSET_PARTICLE_BEHAVIORS_11 - ASSET_PARTICLE_BEHAVIORS +.word ASSET_PARTICLE_BEHAVIORS_12 - ASSET_PARTICLE_BEHAVIORS +.word ASSET_PARTICLE_BEHAVIORS_13 - ASSET_PARTICLE_BEHAVIORS +.word ASSET_PARTICLE_BEHAVIORS_14 - ASSET_PARTICLE_BEHAVIORS +.word ASSET_PARTICLE_BEHAVIORS_15 - ASSET_PARTICLE_BEHAVIORS +.word ASSET_PARTICLE_BEHAVIORS_16 - ASSET_PARTICLE_BEHAVIORS +.word ASSET_PARTICLE_BEHAVIORS_17 - ASSET_PARTICLE_BEHAVIORS +.word ASSET_PARTICLE_BEHAVIORS_18 - ASSET_PARTICLE_BEHAVIORS +.word ASSET_PARTICLE_BEHAVIORS_19 - ASSET_PARTICLE_BEHAVIORS +.word ASSET_PARTICLE_BEHAVIORS_20 - ASSET_PARTICLE_BEHAVIORS +.word ASSET_PARTICLE_BEHAVIORS_21 - ASSET_PARTICLE_BEHAVIORS +.word ASSET_PARTICLE_BEHAVIORS_22 - ASSET_PARTICLE_BEHAVIORS +.word ASSET_PARTICLE_BEHAVIORS_23 - ASSET_PARTICLE_BEHAVIORS +.word ASSET_PARTICLE_BEHAVIORS_24 - ASSET_PARTICLE_BEHAVIORS +.word ASSET_PARTICLE_BEHAVIORS_25 - ASSET_PARTICLE_BEHAVIORS +.word ASSET_PARTICLE_BEHAVIORS_26 - ASSET_PARTICLE_BEHAVIORS +.word ASSET_PARTICLE_BEHAVIORS_27 - ASSET_PARTICLE_BEHAVIORS +.word ASSET_PARTICLE_BEHAVIORS_28 - ASSET_PARTICLE_BEHAVIORS +.word ASSET_PARTICLE_BEHAVIORS_29 - ASSET_PARTICLE_BEHAVIORS +.word ASSET_PARTICLE_BEHAVIORS_30 - ASSET_PARTICLE_BEHAVIORS +.word ASSET_PARTICLE_BEHAVIORS_31 - ASSET_PARTICLE_BEHAVIORS +.word ASSET_PARTICLE_BEHAVIORS_32 - ASSET_PARTICLE_BEHAVIORS +.word ASSET_PARTICLE_BEHAVIORS_33 - ASSET_PARTICLE_BEHAVIORS +.word ASSET_PARTICLE_BEHAVIORS_34 - ASSET_PARTICLE_BEHAVIORS +.word ASSET_PARTICLE_BEHAVIORS_35 - ASSET_PARTICLE_BEHAVIORS +.word ASSET_PARTICLE_BEHAVIORS_36 - ASSET_PARTICLE_BEHAVIORS +.word ASSET_PARTICLE_BEHAVIORS_37 - ASSET_PARTICLE_BEHAVIORS +.word ASSET_PARTICLE_BEHAVIORS_38 - ASSET_PARTICLE_BEHAVIORS +.word ASSET_PARTICLE_BEHAVIORS_39 - ASSET_PARTICLE_BEHAVIORS +.word ASSET_PARTICLE_BEHAVIORS_40 - ASSET_PARTICLE_BEHAVIORS +.word ASSET_PARTICLE_BEHAVIORS_41 - ASSET_PARTICLE_BEHAVIORS +.word ASSET_PARTICLE_BEHAVIORS_42 - ASSET_PARTICLE_BEHAVIORS +.word ASSET_PARTICLE_BEHAVIORS_43 - ASSET_PARTICLE_BEHAVIORS +.word ASSET_PARTICLE_BEHAVIORS_44 - ASSET_PARTICLE_BEHAVIORS +.word ASSET_PARTICLE_BEHAVIORS_45 - ASSET_PARTICLE_BEHAVIORS +.word ASSET_PARTICLE_BEHAVIORS_46 - ASSET_PARTICLE_BEHAVIORS +.word ASSET_PARTICLE_BEHAVIORS_47 - ASSET_PARTICLE_BEHAVIORS +.word ASSET_PARTICLE_BEHAVIORS_48 - ASSET_PARTICLE_BEHAVIORS +.word ASSET_PARTICLE_BEHAVIORS_49 - ASSET_PARTICLE_BEHAVIORS +.word ASSET_PARTICLE_BEHAVIORS_50 - ASSET_PARTICLE_BEHAVIORS +.word ASSET_PARTICLE_BEHAVIORS_51 - ASSET_PARTICLE_BEHAVIORS +.word ASSET_PARTICLE_BEHAVIORS_52 - ASSET_PARTICLE_BEHAVIORS +.word ASSET_PARTICLE_BEHAVIORS_53 - ASSET_PARTICLE_BEHAVIORS +.word ASSET_PARTICLE_BEHAVIORS_54 - ASSET_PARTICLE_BEHAVIORS +.word ASSET_PARTICLE_BEHAVIORS_55 - ASSET_PARTICLE_BEHAVIORS +.word ASSET_PARTICLE_BEHAVIORS_56 - ASSET_PARTICLE_BEHAVIORS +.word ASSET_PARTICLE_BEHAVIORS_57 - ASSET_PARTICLE_BEHAVIORS +.word ASSET_PARTICLE_BEHAVIORS_58 - ASSET_PARTICLE_BEHAVIORS +.word ASSET_PARTICLE_BEHAVIORS_59 - ASSET_PARTICLE_BEHAVIORS +.word ASSET_PARTICLE_BEHAVIORS_60 - ASSET_PARTICLE_BEHAVIORS +.word ASSET_PARTICLE_BEHAVIORS_61 - ASSET_PARTICLE_BEHAVIORS +.word ASSET_PARTICLE_BEHAVIORS_62 - ASSET_PARTICLE_BEHAVIORS +.word ASSET_PARTICLE_BEHAVIORS_63 - ASSET_PARTICLE_BEHAVIORS +.word ASSET_PARTICLE_BEHAVIORS_64 - ASSET_PARTICLE_BEHAVIORS +.word ASSET_PARTICLE_BEHAVIORS_65 - ASSET_PARTICLE_BEHAVIORS +.word ASSET_PARTICLE_BEHAVIORS_66 - ASSET_PARTICLE_BEHAVIORS +.word ASSET_PARTICLE_BEHAVIORS_67 - ASSET_PARTICLE_BEHAVIORS +.word ASSET_PARTICLE_BEHAVIORS_68 - ASSET_PARTICLE_BEHAVIORS +.word ASSET_PARTICLE_BEHAVIORS_69 - ASSET_PARTICLE_BEHAVIORS +.word ASSET_PARTICLE_BEHAVIORS_70 - ASSET_PARTICLE_BEHAVIORS +.word ASSET_PARTICLE_BEHAVIORS_71 - ASSET_PARTICLE_BEHAVIORS +.word ASSET_PARTICLE_BEHAVIORS_72 - ASSET_PARTICLE_BEHAVIORS +.word ASSET_PARTICLE_BEHAVIORS_73 - ASSET_PARTICLE_BEHAVIORS +.word ASSET_PARTICLE_BEHAVIORS_74 - ASSET_PARTICLE_BEHAVIORS +.word ASSET_PARTICLE_BEHAVIORS_END - ASSET_PARTICLE_BEHAVIORS .word 0xFFFFFFFF -glabel ASSET_SECTION_42_END + +/********** ASSET_PARTICLE_BEHAVIORS **********/ .balign 16 -glabel ASSET_SECTION_43 -glabel ASSET_43_0 +glabel ASSET_PARTICLE_BEHAVIORS +glabel ASSET_PARTICLE_BEHAVIORS_0 .incbin "./build/us_1.0/particles/behaviors/unknown_43_0.bin" -glabel ASSET_43_1 +glabel ASSET_PARTICLE_BEHAVIORS_1 .incbin "./build/us_1.0/particles/behaviors/unknown_43_1.bin" -glabel ASSET_43_2 +glabel ASSET_PARTICLE_BEHAVIORS_2 .incbin "./build/us_1.0/particles/behaviors/unknown_43_2.bin" -glabel ASSET_43_3 +glabel ASSET_PARTICLE_BEHAVIORS_3 .incbin "./build/us_1.0/particles/behaviors/unknown_43_3.bin" -glabel ASSET_43_4 +glabel ASSET_PARTICLE_BEHAVIORS_4 .incbin "./build/us_1.0/particles/behaviors/unknown_43_4.bin" -glabel ASSET_43_5 +glabel ASSET_PARTICLE_BEHAVIORS_5 .incbin "./build/us_1.0/particles/behaviors/unknown_43_5.bin" -glabel ASSET_43_6 +glabel ASSET_PARTICLE_BEHAVIORS_6 .incbin "./build/us_1.0/particles/behaviors/unknown_43_6.bin" -glabel ASSET_43_7 +glabel ASSET_PARTICLE_BEHAVIORS_7 .incbin "./build/us_1.0/particles/behaviors/unknown_43_7.bin" -glabel ASSET_43_8 +glabel ASSET_PARTICLE_BEHAVIORS_8 .incbin "./build/us_1.0/particles/behaviors/unknown_43_8.bin" -glabel ASSET_43_9 +glabel ASSET_PARTICLE_BEHAVIORS_9 .incbin "./build/us_1.0/particles/behaviors/unknown_43_9.bin" -glabel ASSET_43_10 +glabel ASSET_PARTICLE_BEHAVIORS_10 .incbin "./build/us_1.0/particles/behaviors/unknown_43_10.bin" -glabel ASSET_43_11 +glabel ASSET_PARTICLE_BEHAVIORS_11 .incbin "./build/us_1.0/particles/behaviors/unknown_43_11.bin" -glabel ASSET_43_12 +glabel ASSET_PARTICLE_BEHAVIORS_12 .incbin "./build/us_1.0/particles/behaviors/unknown_43_12.bin" -glabel ASSET_43_13 +glabel ASSET_PARTICLE_BEHAVIORS_13 .incbin "./build/us_1.0/particles/behaviors/unknown_43_13.bin" -glabel ASSET_43_14 +glabel ASSET_PARTICLE_BEHAVIORS_14 .incbin "./build/us_1.0/particles/behaviors/unknown_43_14.bin" -glabel ASSET_43_15 +glabel ASSET_PARTICLE_BEHAVIORS_15 .incbin "./build/us_1.0/particles/behaviors/unknown_43_15.bin" -glabel ASSET_43_16 +glabel ASSET_PARTICLE_BEHAVIORS_16 .incbin "./build/us_1.0/particles/behaviors/unknown_43_16.bin" -glabel ASSET_43_17 +glabel ASSET_PARTICLE_BEHAVIORS_17 .incbin "./build/us_1.0/particles/behaviors/unknown_43_17.bin" -glabel ASSET_43_18 +glabel ASSET_PARTICLE_BEHAVIORS_18 .incbin "./build/us_1.0/particles/behaviors/unknown_43_18.bin" -glabel ASSET_43_19 +glabel ASSET_PARTICLE_BEHAVIORS_19 .incbin "./build/us_1.0/particles/behaviors/unknown_43_19.bin" -glabel ASSET_43_20 +glabel ASSET_PARTICLE_BEHAVIORS_20 .incbin "./build/us_1.0/particles/behaviors/unknown_43_20.bin" -glabel ASSET_43_21 +glabel ASSET_PARTICLE_BEHAVIORS_21 .incbin "./build/us_1.0/particles/behaviors/unknown_43_21.bin" -glabel ASSET_43_22 +glabel ASSET_PARTICLE_BEHAVIORS_22 .incbin "./build/us_1.0/particles/behaviors/unknown_43_22.bin" -glabel ASSET_43_23 +glabel ASSET_PARTICLE_BEHAVIORS_23 .incbin "./build/us_1.0/particles/behaviors/unknown_43_23.bin" -glabel ASSET_43_24 +glabel ASSET_PARTICLE_BEHAVIORS_24 .incbin "./build/us_1.0/particles/behaviors/unknown_43_24.bin" -glabel ASSET_43_25 +glabel ASSET_PARTICLE_BEHAVIORS_25 .incbin "./build/us_1.0/particles/behaviors/unknown_43_25.bin" -glabel ASSET_43_26 +glabel ASSET_PARTICLE_BEHAVIORS_26 .incbin "./build/us_1.0/particles/behaviors/unknown_43_26.bin" -glabel ASSET_43_27 +glabel ASSET_PARTICLE_BEHAVIORS_27 .incbin "./build/us_1.0/particles/behaviors/unknown_43_27.bin" -glabel ASSET_43_28 +glabel ASSET_PARTICLE_BEHAVIORS_28 .incbin "./build/us_1.0/particles/behaviors/unknown_43_28.bin" -glabel ASSET_43_29 +glabel ASSET_PARTICLE_BEHAVIORS_29 .incbin "./build/us_1.0/particles/behaviors/unknown_43_29.bin" -glabel ASSET_43_30 +glabel ASSET_PARTICLE_BEHAVIORS_30 .incbin "./build/us_1.0/particles/behaviors/unknown_43_30.bin" -glabel ASSET_43_31 +glabel ASSET_PARTICLE_BEHAVIORS_31 .incbin "./build/us_1.0/particles/behaviors/unknown_43_31.bin" -glabel ASSET_43_32 +glabel ASSET_PARTICLE_BEHAVIORS_32 .incbin "./build/us_1.0/particles/behaviors/unknown_43_32.bin" -glabel ASSET_43_33 +glabel ASSET_PARTICLE_BEHAVIORS_33 .incbin "./build/us_1.0/particles/behaviors/unknown_43_33.bin" -glabel ASSET_43_34 +glabel ASSET_PARTICLE_BEHAVIORS_34 .incbin "./build/us_1.0/particles/behaviors/unknown_43_34.bin" -glabel ASSET_43_35 +glabel ASSET_PARTICLE_BEHAVIORS_35 .incbin "./build/us_1.0/particles/behaviors/unknown_43_35.bin" -glabel ASSET_43_36 +glabel ASSET_PARTICLE_BEHAVIORS_36 .incbin "./build/us_1.0/particles/behaviors/unknown_43_36.bin" -glabel ASSET_43_37 +glabel ASSET_PARTICLE_BEHAVIORS_37 .incbin "./build/us_1.0/particles/behaviors/unknown_43_37.bin" -glabel ASSET_43_38 +glabel ASSET_PARTICLE_BEHAVIORS_38 .incbin "./build/us_1.0/particles/behaviors/unknown_43_38.bin" -glabel ASSET_43_39 +glabel ASSET_PARTICLE_BEHAVIORS_39 .incbin "./build/us_1.0/particles/behaviors/unknown_43_39.bin" -glabel ASSET_43_40 +glabel ASSET_PARTICLE_BEHAVIORS_40 .incbin "./build/us_1.0/particles/behaviors/unknown_43_40.bin" -glabel ASSET_43_41 +glabel ASSET_PARTICLE_BEHAVIORS_41 .incbin "./build/us_1.0/particles/behaviors/unknown_43_41.bin" -glabel ASSET_43_42 +glabel ASSET_PARTICLE_BEHAVIORS_42 .incbin "./build/us_1.0/particles/behaviors/unknown_43_42.bin" -glabel ASSET_43_43 +glabel ASSET_PARTICLE_BEHAVIORS_43 .incbin "./build/us_1.0/particles/behaviors/unknown_43_43.bin" -glabel ASSET_43_44 +glabel ASSET_PARTICLE_BEHAVIORS_44 .incbin "./build/us_1.0/particles/behaviors/unknown_43_44.bin" -glabel ASSET_43_45 +glabel ASSET_PARTICLE_BEHAVIORS_45 .incbin "./build/us_1.0/particles/behaviors/unknown_43_45.bin" -glabel ASSET_43_46 +glabel ASSET_PARTICLE_BEHAVIORS_46 .incbin "./build/us_1.0/particles/behaviors/unknown_43_46.bin" -glabel ASSET_43_47 +glabel ASSET_PARTICLE_BEHAVIORS_47 .incbin "./build/us_1.0/particles/behaviors/unknown_43_47.bin" -glabel ASSET_43_48 +glabel ASSET_PARTICLE_BEHAVIORS_48 .incbin "./build/us_1.0/particles/behaviors/unknown_43_48.bin" -glabel ASSET_43_49 +glabel ASSET_PARTICLE_BEHAVIORS_49 .incbin "./build/us_1.0/particles/behaviors/unknown_43_49.bin" -glabel ASSET_43_50 +glabel ASSET_PARTICLE_BEHAVIORS_50 .incbin "./build/us_1.0/particles/behaviors/unknown_43_50.bin" -glabel ASSET_43_51 +glabel ASSET_PARTICLE_BEHAVIORS_51 .incbin "./build/us_1.0/particles/behaviors/unknown_43_51.bin" -glabel ASSET_43_52 +glabel ASSET_PARTICLE_BEHAVIORS_52 .incbin "./build/us_1.0/particles/behaviors/unknown_43_52.bin" -glabel ASSET_43_53 +glabel ASSET_PARTICLE_BEHAVIORS_53 .incbin "./build/us_1.0/particles/behaviors/unknown_43_53.bin" -glabel ASSET_43_54 +glabel ASSET_PARTICLE_BEHAVIORS_54 .incbin "./build/us_1.0/particles/behaviors/unknown_43_54.bin" -glabel ASSET_43_55 +glabel ASSET_PARTICLE_BEHAVIORS_55 .incbin "./build/us_1.0/particles/behaviors/unknown_43_55.bin" -glabel ASSET_43_56 +glabel ASSET_PARTICLE_BEHAVIORS_56 .incbin "./build/us_1.0/particles/behaviors/unknown_43_56.bin" -glabel ASSET_43_57 +glabel ASSET_PARTICLE_BEHAVIORS_57 .incbin "./build/us_1.0/particles/behaviors/unknown_43_57.bin" -glabel ASSET_43_58 +glabel ASSET_PARTICLE_BEHAVIORS_58 .incbin "./build/us_1.0/particles/behaviors/unknown_43_58.bin" -glabel ASSET_43_59 +glabel ASSET_PARTICLE_BEHAVIORS_59 .incbin "./build/us_1.0/particles/behaviors/unknown_43_59.bin" -glabel ASSET_43_60 +glabel ASSET_PARTICLE_BEHAVIORS_60 .incbin "./build/us_1.0/particles/behaviors/unknown_43_60.bin" -glabel ASSET_43_61 +glabel ASSET_PARTICLE_BEHAVIORS_61 .incbin "./build/us_1.0/particles/behaviors/unknown_43_61.bin" -glabel ASSET_43_62 +glabel ASSET_PARTICLE_BEHAVIORS_62 .incbin "./build/us_1.0/particles/behaviors/unknown_43_62.bin" -glabel ASSET_43_63 +glabel ASSET_PARTICLE_BEHAVIORS_63 .incbin "./build/us_1.0/particles/behaviors/unknown_43_63.bin" -glabel ASSET_43_64 +glabel ASSET_PARTICLE_BEHAVIORS_64 .incbin "./build/us_1.0/particles/behaviors/unknown_43_64.bin" -glabel ASSET_43_65 +glabel ASSET_PARTICLE_BEHAVIORS_65 .incbin "./build/us_1.0/particles/behaviors/unknown_43_65.bin" -glabel ASSET_43_66 +glabel ASSET_PARTICLE_BEHAVIORS_66 .incbin "./build/us_1.0/particles/behaviors/unknown_43_66.bin" -glabel ASSET_43_67 +glabel ASSET_PARTICLE_BEHAVIORS_67 .incbin "./build/us_1.0/particles/behaviors/unknown_43_67.bin" -glabel ASSET_43_68 +glabel ASSET_PARTICLE_BEHAVIORS_68 .incbin "./build/us_1.0/particles/behaviors/unknown_43_68.bin" -glabel ASSET_43_69 +glabel ASSET_PARTICLE_BEHAVIORS_69 .incbin "./build/us_1.0/particles/behaviors/unknown_43_69.bin" -glabel ASSET_43_70 +glabel ASSET_PARTICLE_BEHAVIORS_70 .incbin "./build/us_1.0/particles/behaviors/unknown_43_70.bin" -glabel ASSET_43_71 +glabel ASSET_PARTICLE_BEHAVIORS_71 .incbin "./build/us_1.0/particles/behaviors/unknown_43_71.bin" -glabel ASSET_43_72 +glabel ASSET_PARTICLE_BEHAVIORS_72 .incbin "./build/us_1.0/particles/behaviors/unknown_43_72.bin" -glabel ASSET_43_73 +glabel ASSET_PARTICLE_BEHAVIORS_73 .incbin "./build/us_1.0/particles/behaviors/unknown_43_73.bin" -glabel ASSET_43_74 +glabel ASSET_PARTICLE_BEHAVIORS_74 .incbin "./build/us_1.0/particles/behaviors/unknown_43_74.bin" -glabel ASSET_SECTION_43_END +glabel ASSET_PARTICLE_BEHAVIORS_END + +/********** ASSET_FONTS **********/ .balign 16 -glabel ASSET_SECTION_44 -glabel ASSET_44_0 -.incbin "./build/us_1.0/fonts/unknown_44.bin" -glabel ASSET_SECTION_44_END +glabel ASSET_FONTS +.incbin "./build/us_1.0/fonts/fonts.bin" +glabel ASSET_FONTS_END + +/********** ASSET_BINARY_45 **********/ .balign 16 -glabel ASSET_SECTION_45 -glabel ASSET_45_0 +glabel ASSET_BINARY_45 .incbin "./build/us_1.0/fonts/unknown_45.bin" -glabel ASSET_SECTION_45_END +glabel ASSET_BINARY_45_END + +/********** ASSET_BINARY_46 **********/ .balign 16 -glabel ASSET_SECTION_46 -glabel ASSET_46_0 +glabel ASSET_BINARY_46 .incbin "./build/us_1.0/fonts/unknown_46.bin" -glabel ASSET_SECTION_46_END +glabel ASSET_BINARY_46_END + +/********** ASSET_BINARY_47 **********/ .balign 16 -glabel ASSET_SECTION_47 -glabel ASSET_47_0 +glabel ASSET_BINARY_47 .incbin "./build/us_1.0/ids/unknown_47.bin" -glabel ASSET_SECTION_47_END +glabel ASSET_BINARY_47_END + +/********** ASSET_TTGHOSTS_TABLE **********/ .balign 16 -glabel ASSET_SECTION_48 -.word 0x03000000, ASSET_49_0 - ASSET_SECTION_49 -.word 0x04010000, ASSET_49_1 - ASSET_SECTION_49 -.word 0x05000000, ASSET_49_2 - ASSET_SECTION_49 -.word 0x06000000, ASSET_49_3 - ASSET_SECTION_49 -.word 0x07020000, ASSET_49_4 - ASSET_SECTION_49 -.word 0x08010000, ASSET_49_5 - ASSET_SECTION_49 -.word 0x09000000, ASSET_49_6 - ASSET_SECTION_49 -.word 0x0A000000, ASSET_49_7 - ASSET_SECTION_49 -.word 0x0D020000, ASSET_49_8 - ASSET_SECTION_49 -.word 0x0F020000, ASSET_49_9 - ASSET_SECTION_49 -.word 0x11020000, ASSET_49_10 - ASSET_SECTION_49 -.word 0x12000000, ASSET_49_11 - ASSET_SECTION_49 -.word 0x13010000, ASSET_49_12 - ASSET_SECTION_49 -.word 0x14020000, ASSET_49_13 - ASSET_SECTION_49 -.word 0x1C000000, ASSET_49_14 - ASSET_SECTION_49 -.word 0x1D000000, ASSET_49_15 - ASSET_SECTION_49 -.word 0x1E000000, ASSET_49_16 - ASSET_SECTION_49 -.word 0x1F000000, ASSET_49_17 - ASSET_SECTION_49 -.word 0x20000000, ASSET_49_18 - ASSET_SECTION_49 -.word 0x21000000, ASSET_49_19 - ASSET_SECTION_49 -.word 0xFFFF0000, ASSET_SECTION_49_END - ASSET_SECTION_49 +glabel ASSET_TTGHOSTS_TABLE +.word 0x3000000, ASSET_TTGHOSTS_FOSSILCANYON - ASSET_TTGHOSTS +.word 0x4010000, ASSET_TTGHOSTS_PIRATELAGOON - ASSET_TTGHOSTS +.word 0x5000000, ASSET_TTGHOSTS_ANCIENTLAKE - ASSET_TTGHOSTS +.word 0x6000000, ASSET_TTGHOSTS_WALRUSCOVE - ASSET_TTGHOSTS +.word 0x7020000, ASSET_TTGHOSTS_HOTTOPVOLCANO - ASSET_TTGHOSTS +.word 0x8010000, ASSET_TTGHOSTS_WHALEBAY - ASSET_TTGHOSTS +.word 0x9000000, ASSET_TTGHOSTS_SNOWBALLVALLEY - ASSET_TTGHOSTS +.word 0xA000000, ASSET_TTGHOSTS_CRESCENTISLAND - ASSET_TTGHOSTS +.word 0xD020000, ASSET_TTGHOSTS_EVERFROSTPEAK - ASSET_TTGHOSTS +.word 0xF020000, ASSET_TTGHOSTS_SPACEPORTALPHA - ASSET_TTGHOSTS +.word 0x11020000, ASSET_TTGHOSTS_SPACEDUSTALLEY - ASSET_TTGHOSTS +.word 0x12000000, ASSET_TTGHOSTS_GREENWOODVILLAGE - ASSET_TTGHOSTS +.word 0x13010000, ASSET_TTGHOSTS_BOULDERCANYON - ASSET_TTGHOSTS +.word 0x14020000, ASSET_TTGHOSTS_WINDMILLPLAINS - ASSET_TTGHOSTS +.word 0x1C000000, ASSET_TTGHOSTS_FROSTYVILLAGE - ASSET_TTGHOSTS +.word 0x1D000000, ASSET_TTGHOSTS_JUNGLEFALLS - ASSET_TTGHOSTS +.word 0x1E000000, ASSET_TTGHOSTS_TREASURECAVES - ASSET_TTGHOSTS +.word 0x1F000000, ASSET_TTGHOSTS_HAUNTEDWOODS - ASSET_TTGHOSTS +.word 0x20000000, ASSET_TTGHOSTS_DARKMOONCAVERNS - ASSET_TTGHOSTS +.word 0x21000000, ASSET_TTGHOSTS_STARCITY - ASSET_TTGHOSTS +.word 0xFFFF0000, ASSET_TTGHOSTS_END - ASSET_TTGHOSTS .word 0xFFFF0000, 0xFFFFFFFF -glabel ASSET_SECTION_48_END + +/********** ASSET_TTGHOSTS **********/ .balign 16 -glabel ASSET_SECTION_49 -glabel ASSET_49_0 -.incbin "./build/us_1.0/tt_ghosts/FossilCanyon.bin" -glabel ASSET_49_1 -.incbin "./build/us_1.0/tt_ghosts/PirateLagoon.bin" -glabel ASSET_49_2 -.incbin "./build/us_1.0/tt_ghosts/AncientLake.bin" -glabel ASSET_49_3 -.incbin "./build/us_1.0/tt_ghosts/WalrusCove.bin" -glabel ASSET_49_4 -.incbin "./build/us_1.0/tt_ghosts/HotTopVolcano.bin" -glabel ASSET_49_5 -.incbin "./build/us_1.0/tt_ghosts/WhaleBay.bin" -glabel ASSET_49_6 -.incbin "./build/us_1.0/tt_ghosts/SnowballValley.bin" -glabel ASSET_49_7 -.incbin "./build/us_1.0/tt_ghosts/CrescentIsland.bin" -glabel ASSET_49_8 -.incbin "./build/us_1.0/tt_ghosts/EverfrostPeak.bin" -glabel ASSET_49_9 -.incbin "./build/us_1.0/tt_ghosts/SpaceportAlpha.bin" -glabel ASSET_49_10 -.incbin "./build/us_1.0/tt_ghosts/SpacedustAlley.bin" -glabel ASSET_49_11 -.incbin "./build/us_1.0/tt_ghosts/GreenwoodVillage.bin" -glabel ASSET_49_12 -.incbin "./build/us_1.0/tt_ghosts/BoulderCanyon.bin" -glabel ASSET_49_13 -.incbin "./build/us_1.0/tt_ghosts/WindmillPlains.bin" -glabel ASSET_49_14 -.incbin "./build/us_1.0/tt_ghosts/FrostyVillage.bin" -glabel ASSET_49_15 -.incbin "./build/us_1.0/tt_ghosts/JungleFalls.bin" -glabel ASSET_49_16 -.incbin "./build/us_1.0/tt_ghosts/TreasureCaves.bin" -glabel ASSET_49_17 -.incbin "./build/us_1.0/tt_ghosts/HauntedWoods.bin" -glabel ASSET_49_18 -.incbin "./build/us_1.0/tt_ghosts/DarkmoonCaverns.bin" -glabel ASSET_49_19 -.incbin "./build/us_1.0/tt_ghosts/StarCity.bin" -glabel ASSET_SECTION_49_END +glabel ASSET_TTGHOSTS +glabel ASSET_TTGHOSTS_FOSSILCANYON +.incbin "./build/us_1.0/tt_ghosts/FossilCanyonGhost.bin" +glabel ASSET_TTGHOSTS_PIRATELAGOON +.incbin "./build/us_1.0/tt_ghosts/PirateLagoonGhost.bin" +glabel ASSET_TTGHOSTS_ANCIENTLAKE +.incbin "./build/us_1.0/tt_ghosts/AncientLakeGhost.bin" +glabel ASSET_TTGHOSTS_WALRUSCOVE +.incbin "./build/us_1.0/tt_ghosts/WalrusCoveGhost.bin" +glabel ASSET_TTGHOSTS_HOTTOPVOLCANO +.incbin "./build/us_1.0/tt_ghosts/HotTopVolcanoGhost.bin" +glabel ASSET_TTGHOSTS_WHALEBAY +.incbin "./build/us_1.0/tt_ghosts/WhaleBayGhost.bin" +glabel ASSET_TTGHOSTS_SNOWBALLVALLEY +.incbin "./build/us_1.0/tt_ghosts/SnowballValleyGhost.bin" +glabel ASSET_TTGHOSTS_CRESCENTISLAND +.incbin "./build/us_1.0/tt_ghosts/CrescentIslandGhost.bin" +glabel ASSET_TTGHOSTS_EVERFROSTPEAK +.incbin "./build/us_1.0/tt_ghosts/EverfrostPeakGhost.bin" +glabel ASSET_TTGHOSTS_SPACEPORTALPHA +.incbin "./build/us_1.0/tt_ghosts/SpaceportAlphaGhost.bin" +glabel ASSET_TTGHOSTS_SPACEDUSTALLEY +.incbin "./build/us_1.0/tt_ghosts/SpacedustAlleyGhost.bin" +glabel ASSET_TTGHOSTS_GREENWOODVILLAGE +.incbin "./build/us_1.0/tt_ghosts/GreenwoodVillageGhost.bin" +glabel ASSET_TTGHOSTS_BOULDERCANYON +.incbin "./build/us_1.0/tt_ghosts/BoulderCanyonGhost.bin" +glabel ASSET_TTGHOSTS_WINDMILLPLAINS +.incbin "./build/us_1.0/tt_ghosts/WindmillPlainsGhost.bin" +glabel ASSET_TTGHOSTS_FROSTYVILLAGE +.incbin "./build/us_1.0/tt_ghosts/FrostyVillageGhost.bin" +glabel ASSET_TTGHOSTS_JUNGLEFALLS +.incbin "./build/us_1.0/tt_ghosts/JungleFallsGhost.bin" +glabel ASSET_TTGHOSTS_TREASURECAVES +.incbin "./build/us_1.0/tt_ghosts/TreasureCavesGhost.bin" +glabel ASSET_TTGHOSTS_HAUNTEDWOODS +.incbin "./build/us_1.0/tt_ghosts/HauntedWoodsGhost.bin" +glabel ASSET_TTGHOSTS_DARKMOONCAVERNS +.incbin "./build/us_1.0/tt_ghosts/DarkmoonCavernsGhost.bin" +glabel ASSET_TTGHOSTS_STARCITY +.incbin "./build/us_1.0/tt_ghosts/StarCityGhost.bin" +glabel ASSET_TTGHOSTS_END .balign 16 glabel ASSETS_END diff --git a/doc/dkr_asset_spec.md b/doc/dkr_asset_spec.md new file mode 100644 index 00000000..3e4df4b4 --- /dev/null +++ b/doc/dkr_asset_spec.md @@ -0,0 +1,562 @@ +# DKR Assets Specification (Rev. 2.0) + +## Enums *(from include/enums.h)* + +| Vehicle | | +| -------- | -------- | +| VEHICLE_CAR | 0 | +| VEHICLE_HOVERCRAFT | 1 | +| VEHICLE_PLANE | 2 | + +| Language | | +| -------- | -------- | +| LANGUAGE_ENGLISH | 0 | +| LANGUAGE_GERMAN | 1 | +| LANGUAGE_FRENCH | 2 | +| LANGUAGE_JAPANESE | 3 | + +| World | | +| -------- | -------- | +| WORLD_NONE | -1 | +| WORLD_CENTRAL_AREA | 0 | +| WORLD_DINO_DOMAIN | 1 | +| WORLD_SHERBET_ISLAND | 2 | +| WORLD_SNOWFLAKE_MOUNTAIN | 3 | +| WORLD_DRAGON_FOREST | 4 | +| WORLD_FUTURE_FUN_LAND | 5 | + +| RaceType | | +| -------- | -------- | +| RACETYPE_DEFAULT | 0 | +| RACETYPE_HORSESHOE_GULCH | 3 | +| RACETYPE_HUBWORLD | 5 | +| RACETYPE_CUTSCENE_1 | 6 | +| RACETYPE_CUTSCENE_2 | 7 | +| RACETYPE_BOSS | 8 | +| RACETYPE_CHALLENGE_BATTLE | 64 | +| RACETYPE_CHALLENGE_BANANAS | 65 | +| RACETYPE_CHALLENGE_EGGS | 66 | + +| HorizontalAlignmentFlags | | +| -------- | -------- | +| HORZ_ALIGN_LEFT | 0 | +| HORZ_ALIGN_RIGHT | 1 | +| HORZ_ALIGN_CENTER | 4 | + +| VerticalAlignmentFlags | | +| -------- | -------- | +| VERT_ALIGN_TOP | 0 | +| VERT_ALIGN_BOTTOM | 2 | +| VERT_ALIGN_MIDDLE | 8 | + +| AlignmentFlags | | +| -------- | -------- | +| ALIGN_TOP_LEFT | VERT_ALIGN_TOP \| HORZ_ALIGN_LEFT | +| ALIGN_TOP_CENTER | VERT_ALIGN_TOP \| HORZ_ALIGN_CENTER | +| ALIGN_TOP_RIGHT | VERT_ALIGN_TOP \| HORZ_ALIGN_RIGHT | +| ALIGN_MIDDLE_LEFT | VERT_ALIGN_MIDDLE \| HORZ_ALIGN_LEFT | +| ALIGN_MIDDLE_CENTER | VERT_ALIGN_MIDDLE \| HORZ_ALIGN_CENTER | +| ALIGN_MIDDLE_RIGHT | VERT_ALIGN_MIDDLE \| HORZ_ALIGN_RIGHT | +| ALIGN_BOTTOM_LEFT | VERT_ALIGN_BOTTOM \| HORZ_ALIGN_LEFT | +| ALIGN_BOTTOM_CENTER | VERT_ALIGN_BOTTOM \| HORZ_ALIGN_CENTER | +| ALIGN_BOTTOM_RIGHT | VERT_ALIGN_BOTTOM \| HORZ_ALIGN_RIGHT | + +---- + +## meta.json + +Every package should have a meta.json file in the root directory that describes the contents of the package. + +| Property Name | Type | Required | Comments | +| -------- | -------- | -------- | -------- | +| name | String | Yes | The name of the package. | +| authors | Array | Yes | The list of authors for the package. | +| pkg-version | String | Yes | The version text for the package. | +| revision | Integer | Yes | The revision number for this package. Should match the revision number of dkr\_assets\_tool. | +| revision-minor | Integer | Yes | The minor revision number for this package. Should match the minor revision number of dkr\_assets\_tool. | +| description | String | No | Describes what the package does in detail. | +| description-brief | String | No | A short form of the description. There is no maximum length, but try to keep it under 80 characters. | +| thumbnail | String | No | A path to a PNG image or a base64 image uri. If you are using a path, put the thumbnail image in a folder called "meta" in the root directory. | + +---- + +## Package Commands + +Every single JSON file has an option to tell the asset compiler how to write the JSON file. These commands start with the string "pkg-". + +| Property Name | Type | Required | Comments | +| -------- | -------- | -------- | -------- | +| pkg-write | String | No | Either "replace" or "merge". "replace" will overwrite the existing JSON file if it exists. "merge" will combine the contents of the existing JSON file with the new one. Set to "replace" by default. | +| pkg-rebuild | String | No | Either "onchange" or "always". "onchange" will only copy the final output if the md5 hash is different. "always" will copy the final output even if the md5 hash is the same. Set to "onchange" by default. + +---- + +## Fonts + +| Property Name | Type | Required | Comments | +| -------- | -------- | -------- | -------- | +| fonts | Object | Yes | Defines the filename for each font. The order of the fonts is set by the `asset_fonts.json` file in the root version directory. | +| type | String | Yes | Should always be "Fonts" | + +```json +{ + "fonts" : { + "ASSET_FONTS_BIGFONT" : "game_fonts/BigFont.json", + "ASSET_FONTS_FUNFONT" : "game_fonts/FunFont.json", + "ASSET_FONTS_SMALLFONT" : "game_fonts/SmallFont.json", + "ASSET_FONTS_SUBTITLEFONT" : "game_fonts/SubtitleFont.json" + }, + "type" : "Fonts" +} +``` + +### Font + +| Property Name | Type | Required | Comments | +| -------- | -------- | -------- | -------- | +| characters | Object (Dictionary) | Yes | Describes each character using a node object. | +| encoding | Object | Yes | Describes the encoding used for the tool. All 4 DKR fonts just use ASCII, but the builder tool can support custom encodings (though this is has not been tested yet) | +| fixed-width | Integer | Yes | If this value is not 0, then every character will use this value instead of their `char-width` value. | +| name | String | Yes | Name of the font. | +| special-character-width | Integer | Yes | Width for every ASCII character value smaller or equal to 0x20 (including space and excluding the tab character, which uses `tab-width`). | +| tab-width | Integer | Yes | Width of the tab character `\t` | +| textures | Array | Yes | An array of Texture IDs to use for this font. DKR has a maximum of 32 textures; future rare games extended this to 64. | +| unknown-text | String | No | Leftover debug text from development? | +| upper-case-only | Boolean | No | If set to true, then all lowercase nodes ("a", "b", "c", etc.) will only use their uppercase values. This is useful for custom fonts with only a single case in it. Set to `false` by default. | +| y-offset | Integer | Yes | Offsets the y position for each character in the font. (Might just be line height?) | + +| `character` Property Name | Type | Required | Comments | +| -------- | -------- | -------- | -------- | +| char-width | Integer | Yes | Width of the character in pixels. (Excluding the space character, which uses `special-character-width`) | +| offset | Array (2 Integers) | Yes | Values added to the character's X,Y position | +| tex-index | Integer | Yes | Index in the `textures` array to use for this character, or -1 if no texture is used. | +| tex-size | Array (2 Integers) | Yes | Width and height of the character's texture. | +| uv | Array (2 Integers) | Yes | X/Y position in the texture to use. | + +| `encoding` Property Name | Type | Required | Comments | +| -------- | -------- | -------- | -------- | +| type | String | Yes | Should always be "ASCII" for the moment. Support for custom encodings might come in the future. | + +```json +{ + "characters" : { + "A" : { + "char-width" : 11, + "offset" : [0, 0], + "tex-index" : 0, + "tex-size" : [11, 12], + "uv" : [0, 0] + }, + ... There are lots of charcters! + }, + "encoding" : { + "type" : "ASCII" + }, + "fixed-width" : 0, + "name" : "FunFont", + "special-character-width" : 6, + "tab-width" : 32, + "textures" : ["ASSET_TEX2D_FUNFONT_0", "ASSET_TEX2D_FUNFONT_1", "ASSET_TEX2D_FUNFONT_2", "ASSET_TEX2D_FUNFONT_3", "ASSET_TEX2D_FUNFONT_4", "ASSET_TEX2D_FUNFONT_5"], + "unknown-text" : "DIBANK \tdwise/seq_sample", + "y-offset" : 16 +} +``` + +## Game Text + +Note: Only Textboxes are properly supported. + +| Property Name | Type | Required | Comments | +| -------- | -------- | -------- | -------- | +| text-type | String | Yes | Either "Dialog" or "Textbox" | +| type | String | Yes | Should always be "GameText" | + +### Dialog + +| Property Name | Type | Required | Comments | +| -------- | -------- | -------- | -------- | +| raw | Array | Yes | Array of bytes that represents the data. Note: This is just temporary until the dialog text format is fully figured out. | + +```json +{ + "raw" : [1, 255, 255, 255, 255, 1, 4, 20, 89, 111, 117, 32, 104, 97, 118, 101, 32, 116, 97, 107, 101, 110, 32, 116, 104, 101, 32, 119, 114, 111, 110, 103, 32, 114, 111, 117, 116, 101, 46, 0, 12, 1, 255, 255, 255, 255, 1, 4, 30, 84, 82, 89, 32, 65, 71, 65, 73, 78, 33, 33, 0, 0, 0, 34], + "text-type" : "Dialog", + "type" : "GameText" +} +``` + +### Textbox + +| Property Name | Type | Required | Comments | +| -------- | -------- | -------- | -------- | +| pages | Array | Yes | Contains arrays of commands that are used to create the textbox. | + +| Command | Value Type | Comments | +| -------- | -------- | -------- | +| AddVerticalSpacing | Integer | Moves the current Y position down by this amount. | +| AllowUserInput | Boolean | Allows the user to skip the textbox if enabled. By default this is set to `true`, and seems to be disabled only for cutscenes. | +| SetAlignment | String | Should either be "center" or "left". | +| SetBorder | Object | Sets the size of the textbox based off distance from the sides of the screen, using the "top", "left", "bottom", "right" properties. Each property is an integer between 0 and 255. | +| SetColour | Object | Sets the RGBA color of the text, using the "red", "green", "blue", "alpha" properties. Each property is an integer between 0 and 255. | +| SetFont | String | Font ID to use for the following text. | +| SetLineHeight | Integer | Sets how much a new line will move the Y position down. | +| SetTimer | Integer | Sets how many seconds to display this textbox. | +| Text | String | Line of text to display. Automatically adds a newline at the end. | +| Unknown | Integer | Currently unknown value used in 6 textbox files. | + + +```json +{ + "pages" : [[{ + "command" : "SetBorder", + "value" : { + "bottom" : 200, + "left" : 40, + "right" : 205, + "top" : 30 + } + }, { + "command" : "SetAlignment", + "value" : "center" + }, { + "command" : "SetFont", + "value" : "ASSET_FONTS_FUNFONT" + }, { + "command" : "SetTimer", + "value" : 8 + }, { + "command" : "Text", + "value" : "TROPHY RACE" + }, { + "command" : "AddVerticalSpacing", + "value" : 10 + }, { + "command" : "Text", + "value" : "TO ENTER THE TROPHY RACE," + }, { + "command" : "Text", + "value" : "YOU MUST COMPLETE" + }, { + "command" : "Text", + "value" : "ALL THE TASKS" + }, { + "command" : "Text", + "value" : "FROM THIS WORLD." + }, { + "command" : "AddVerticalSpacing", + "value" : 15 + }, { + "command" : "Text", + "value" : "KEEP RACING!" + }]], + "text-type" : "Textbox", + "type" : "GameText" +} +``` + +## Level Header + +| Property Name | Type | Required | Comments | +| -------- | -------- | -------- | -------- | +| available-vehicles | Array | Yes | List of "Vehicle" enum Ids that tell the game which vehicles can be used in this track. | +| background-colour | Object | Yes | The clear color of the background. Only visible in some circumstances, mainly when a skydome is not used. | +| ceiling-height | Float | Yes | Maximum height for planes. | +| collectables | Integer | Yes | Bitfield representing the types of collectables found in the track (Bananas, Balloons, etc.). Note: This will probably be changed to an array of enum IDs in the future. | +| default-vehicle | String | Yes | The default vehicle to use for this track. Should be one of the options in the available-vehicles array. See the "Vehicle" enum for options. | +| fog | Object | Yes | Details the colour and distance of the fog used in the level. | +| fov | Integer | Yes | Sets camera's field of view. Can only be within the range (0, 90]. Usually set to 60 for most tracks. | +| instruments | Integer | Yes | Bitfield of which instruments are active when the level loads up. This is usually set to 65535 (0xFFFF) for most tracks. Note: This will probably be changed to an array of enum IDs in the future. | +| model | String | Yes | Level Model ID to use for this track. | +| music | Integer | Yes | Music track to use for this level. Note: This will probably be replaced with a string ID in the future. | +| number-laps | Integer | Yes | Number of laps to complete the race. Up to 6 laps should work; having more than that might cause glitches. | +| race-type | String | Yes | Type of race for this track. See "RaceType" enum for options. | +| skybox | Integer | Yes | Object index for the skydome being used for this level. Note: This will probably be replaced with a string ID in the future.| +| type | String | Yes | Should always be "LevelHeaders" | +| unknown-data | Object | Yes | Contains all the data we haven't figured out yet. These will be properly categorized in the future. | +| world | String | Yes | Which world this track appears in. See "World" enum for options. | + +| `background-colour` Property Name | Type | Required | Comments | +| -------- | -------- | -------- | -------- | +| red | Integer | Yes | Red Channel value. 0-255 | +| green | Integer | Yes | Green Channel value. 0-255 | +| blue | Integer | Yes | Blue Channel value. 0-255 | + +| `fog` Property Name | Type | Required | Comments | +| -------- | -------- | -------- | -------- | +| colour | Object | Yes | RGB values of the fog. | +| range | Object | Yes | Distance of the fog, min/max values usually fall within [900, 1000]. If both values are 0, then fog is disabled. | + +| `fog` `colour` Property Name | Type | Required | Comments | +| -------- | -------- | -------- | -------- | +| red | Integer | Yes | Red Channel value. 0-255 | +| green | Integer | Yes | Green Channel value. 0-255 | +| blue | Integer | Yes | Blue Channel value. 0-255 | + +| `fog` `range` Property Name | Type | Required | Comments | +| -------- | -------- | -------- | -------- | +| min | Integer | Yes | Starting point of fog. Usually set within the range [900, 999]. | +| max | Integer | Yes | Ending point of fog. Usually set at around 1000 (camera's far plane). | + +```json +{ + "available-vehicles" : ["VEHICLE_CAR", "VEHICLE_HOVERCRAFT", "VEHICLE_PLANE"], + "background-colour" : { + "blue" : 24, + "green" : 65, + "red" : 120 + }, + "ceiling-height" : 400.000000, + "collectables" : 73, + "default-vehicle" : "VEHICLE_CAR", + "fog" : { + "colour" : { + "blue" : 0, + "green" : 0, + "red" : 0 + }, + "range" : { + "max" : 0, + "min" : 0 + } + }, + "fov" : 60, + "instruments" : 65535, + "model" : "ASSET_LEVEL_MODELS_5", + "music" : 10, + "number-laps" : 3, + "race-type" : "RACETYPE_DEFAULT", + "skybox" : 209, + "type" : "LevelHeaders", + "unknown-data" : { + "unk1" : 0, + "unk2" : 0, + "unk3" : 1, + "unk4" : [3, 4, 4, 4], + "unk44" : [0, 0, 0, 0, 12, 0, 0], + "unk4F" : [0, 0, 1], + "unk53" : 180, + "unk56" : [4, 16, 1, 0, 6, 0, 2, 0, 3, 0, 0, 120, 1, 0, 0, 153, 4, 0, 0, 62, 1, 1, 1, 1, 0, 5, 1, 1, 66, 224], + "unk74" : [-1, -1, -1, -1, -1, -1, -1], + "unkA0" : [1, 1, 0, 0], + "unkA4" : -1, + "unkA8" : 0, + "unkAA" : 5, + "unkB0" : [14, 16, 0, 18, 0, 0, 0, 1, 0, 66, 0, 5, 0, 0, 50, 130, 235, 255, 255, 255], + "unkC" : [2, 2, 1, 4, 3, 2, 3, 1, 1, 1, 0, 2, 1, 3, 4, 2, 3, 0, 1, 1, 0, 1, 2, 1, 6, 4, 5, 4, 5, 7, 80, 50, 50, 50, 20, 20, 100, 0, 0, 0], + "unkC4" : 1960, + "weather" : { + "unk90" : 0, + "unk92" : 0, + "unk94" : 0, + "unk95" : 0, + "unk96" : 0, + "unk98" : 0, + "unk9A" : 0 + } + }, + "world" : "WORLD_DINO_DOMAIN" +} +``` + +## Level Name + +| Property Name | Type | Required | Comments | +| -------- | -------- | -------- | -------- | +| languages | Object (Dictionary) | Yes | Defines the name for each language. See the "Language" enum for keys. If a language is not defined, the output text for that language will be an empty string. Note: LANGUAGE_JAPANESE is not properly implemented in the us_1.0 version of DKR. | +| type | String | Yes | Should always be "LevelNames" | + +```json +{ + "languages" : { + "LANGUAGE_ENGLISH" : "Ancient Lake", + "LANGUAGE_FRENCH" : "LAC ANCESTRAL", + "LANGUAGE_GERMAN" : "Rumpelsee", + "LANGUAGE_JAPANESE" : "Japanese" + }, + "type" : "LevelNames" +} +``` + +## Menu Text + +| Property Name | Type | Required | Comments | +| -------- | -------- | -------- | -------- | +| sections | Object (Dictionary) | Yes | Contains all the key/value pairs for the menu text. See `asset_menu_text.json` in the root version directory for the full list of ids. | +| type | String | Yes | Should always be "MenuText" | + +```json +{ + "sections" : { + "ASSET_MENU_TEXT_ABANDONCHALLENGE" : "ABANDON CHALLENGE", + "ASSET_MENU_TEXT_ADVENTURE" : "ADVENTURE", + "ASSET_MENU_TEXT_ADVENTURE2" : "ADVENTURE", + "ASSET_MENU_TEXT_ADVENTURETWO" : "ADVENTURE TWO", + "ASSET_MENU_TEXT_ADVENTURETWO2" : "ADVENTURE TWO", + "ASSET_MENU_TEXT_ADVTWOLOADERROR_0" : "SORRY, BUT YOU", + "ASSET_MENU_TEXT_ADVTWOLOADERROR_1" : "CAN'T LOAD GAMES", + "ASSET_MENU_TEXT_ADVTWOLOADERROR_2" : "FOR THE SECOND", + "ASSET_MENU_TEXT_ADVTWOLOADERROR_3" : "ADVENTURE UNTIL", + "ASSET_MENU_TEXT_ADVTWOLOADERROR_4" : "YOU HAVE COMPLETED", + "ASSET_MENU_TEXT_ADVTWOLOADERROR_5" : "THE FIRST.", + "ASSET_MENU_TEXT_ALLCODESDELETED" : "All cheats have been deleted", + "ASSET_MENU_TEXT_AUDIOOPTIONS" : "AUDIO OPTIONS", + "ASSET_MENU_TEXT_BADCODE" : "Sorry, the code was incorrect", + "ASSET_MENU_TEXT_BADCONTPAK" : "BAD CONTROLLER PAK", + "ASSET_MENU_TEXT_BESTLAP" : "BEST LAP", + "ASSET_MENU_TEXT_BESTTIME" : "BEST TIME", + "ASSET_MENU_TEXT_CANCEL" : "CANCEL", + "ASSET_MENU_TEXT_CANCELDELETE" : "CANCEL", + "ASSET_MENU_TEXT_CANNOTSAVEGHOSTDATA_0" : "Cannot save", + "ASSET_MENU_TEXT_CANNOTSAVEGHOSTDATA_1" : "Ghost Data", + "ASSET_MENU_TEXT_CANNOTSTOREANYMOREGHOSTS_0" : "CANNOT STORE ANY", + "ASSET_MENU_TEXT_CANNOTSTOREANYMOREGHOSTS_1" : "MORE GHOSTS.", + "ASSET_MENU_TEXT_CAR" : "CAR", + "ASSET_MENU_TEXT_CARCHALLENGE" : "CAR CHALLENGE", + "ASSET_MENU_TEXT_CAUTION" : "CAUTION", + "ASSET_MENU_TEXT_CAUTIONMESSAGE_0" : "Please do not change Rumble", + "ASSET_MENU_TEXT_CAUTIONMESSAGE_1" : "Pak or Controller Pak", + "ASSET_MENU_TEXT_CAUTIONMESSAGE_10" : "please do so now. ", + "ASSET_MENU_TEXT_CAUTIONMESSAGE_2" : "during gameplay. Controller", + "ASSET_MENU_TEXT_CAUTIONMESSAGE_3" : "Pak is required to save and", + "ASSET_MENU_TEXT_CAUTIONMESSAGE_4" : "load ghost data in Time Trial", + "ASSET_MENU_TEXT_CAUTIONMESSAGE_5" : "mode. If Controller Pak has", + "ASSET_MENU_TEXT_CAUTIONMESSAGE_6" : "limited capacity, you will be", + "ASSET_MENU_TEXT_CAUTIONMESSAGE_7" : "unable to save ghost data.", + "ASSET_MENU_TEXT_CAUTIONMESSAGE_8" : "If you wish to change", + "ASSET_MENU_TEXT_CAUTIONMESSAGE_9" : "Controller Pak or Rumble Pak,", + "ASSET_MENU_TEXT_CHALLENGE" : "CHALLENGE", + "ASSET_MENU_TEXT_CHALLENGES" : "CHALLENGES", + "ASSET_MENU_TEXT_CHALLENGESELECT" : "CHALLENGE SELECT", + "ASSET_MENU_TEXT_CHANGEVEHICLE" : "CHANGE VEHICLE", + "ASSET_MENU_TEXT_CLEARALLCODES" : "CLEAR ALL CODES", + "ASSET_MENU_TEXT_CLEARALLCODESCANCEL" : "CANCEL", + "ASSET_MENU_TEXT_CLEARALLCODESCONFIRM" : "OK", + "ASSET_MENU_TEXT_CLEARALLCODESTITLE" : "CLEAR ALL CODES?", + "ASSET_MENU_TEXT_CODELIST" : "CODE LIST", + "ASSET_MENU_TEXT_CONTINUE" : "CONTINUE", + ... There are lots of ids! + }, + "type" : "MenuText" +} +``` + +## Sprite + +| Property Name | Type | Required | Comments | +| -------- | -------- | -------- | -------- | +| frame-tex-count | Array | Yes | An array of integers that describes how many textures are in each frame of a sprites animation. If the length of the array is just 1, then it is just a static non-animated sprite. | +| start-texture | String | Yes | The starting texture ID. Sprite textures are sequential starting from this ID. | +| type | String | Yes | Should always be "Sprites". | +| unk4 | Integer | Yes | Unknown value | +| unk6 | Integer | Yes | Unknown value | + +```json +{ + "frame-tex-count" : [1, 1, 1, 2], + "start-texture" : "ASSET_TEX2D_54", + "type" : "Sprites", + "unk4" : 32, + "unk6" : 34 +} +``` + +## Texture Header + +| Property Name | Type | Required | Comments | +| -------- | -------- | -------- | -------- | +| compressed | Boolean | Yes | Most textures are compressed, but a small amount are not. | +| flags | Object | Yes | Rendering options for this texture. | +| flipped-image | Boolean | Yes | Most of the 3D textures have their textures upside-down. To make things easier for the programmer, I flipped the .png images back to normal and added this option. | +| format | String | Yes | Texture format for the image. Should either be "RGBA32", "RGBA16", "IA16", "IA8", "IA4", "I8", or "I4". Note: "CI4" and "CI8" are not currently supported by the build tool. | +| frame-advance-delay | Integer | No | The speed at which animated textures change their images. Number of frames per texture = (256 / frame-advance-delay) * (60 / FPS) | +| frame-count | Integer | Yes | Number of frame images in this texture. Static textures will have this set to 1. | +| height | Integer | Yes | Height of the texture image. | +| img | String | Yes | Source path of the .png image. | +| palette-offset | Integer | No | Offset to CI palette. Note: CI4/CI8 textures are not supported yet, so this is currently unused. | +| sprite-x | Integer | No | X offset of the sprite image. | +| sprite-y | Integer | No | Y offset of the sprite image. | +| tex-type | Integer | Yes | Unknown 4-bit value. | +| type | String | Yes | Should always be "Textures". | +| width | Integer | Yes | Width of the texture image. | +| write-size | Boolean | Yes | Most textures write their byte size in the header, while some others just have 0. Not sure the reason for this. | + +| `flags` Property Name | Type | Required | Comments | +| -------- | -------- | -------- | -------- | +| flag-01 | Boolean | Yes | Unknown flag | +| flag-04 | Boolean | Yes | Unknown flag | +| flag-10 | Boolean | Yes | Unknown flag | +| interlaced | Boolean | Yes | Any non-power-of-two texture that is loaded from gDPLoadBlock (basically anything that is not on the HUD) needs to be interlaced. | +| wrap-s | String | Yes | Either "Wrap" or "Clamp" | +| wrap-t | String | Yes | Either "Wrap" or "Clamp" | + + +```json +{ + "compressed" : true, + "flags" : { + "flag-01" : false, + "flag-04" : false, + "flag-10" : false, + "interlaced" : false, + "wrap-s" : "Wrap", + "wrap-t" : "Wrap" + }, + "flipped-image" : false, + "format" : "RGBA32", + "frame-count" : 1, + "height" : 28, + "img" : "img/bigfont_a.png", + "tex-type" : 0, + "type" : "Textures", + "width" : 24, + "write-size" : true +} +``` + +## T.T. Ghost + +| Property Name | Type | Required | Comments | +| -------- | -------- | -------- | -------- | +| header | Object | Yes | Contains information about this ghost. | +| nodes | Array | Yes | Array of node objects defining points of the ghost. The game will interpolate between them. Maximum of 360 nodes (3 minutes). | + +| `header` Property Name | Type | Required | Comments | +| -------- | -------- | -------- | -------- | +| level | String | Yes | Level Header ID for this ghost. | +| time | Integer | Yes | Divide this number by 60 to get seconds. | +| vehicle | String | Yes | Vehicle used for this ghost. See the "Vehicle" enum for options. | + + +| `node` Property Name | Type | Required | Comments | +| -------- | -------- | -------- | -------- | +| rx | Integer | Yes | X rotation | +| ry | Integer | Yes | Y rotation | +| rz | Integer | Yes | Z rotation | +| x | Integer | Yes | X position | +| y | Integer | Yes | Y position | +| z | Integer | Yes | Z position | + +```json +{ + "header" : { + "level" : "ASSET_LEVEL_ANCIENTLAKE", + "time" : 3677, + "vehicle" : "VEHICLE_CAR" + }, + "nodes" : [{ + "rx" : 0, + "ry" : 0, + "rz" : 0, + "x" : -1741, + "y" : 29, + "z" : -6488 + }, + ... There are lots of nodes! +] + +``` + +## Changelog + +* **2.0** - Created spec + diff --git a/extract-ver/us_1.0.config.json b/extract-ver/us_1.0.config.json old mode 100644 new mode 100755 index dd81a802..53e74fb5 --- a/extract-ver/us_1.0.config.json +++ b/extract-ver/us_1.0.config.json @@ -1,559 +1,1043 @@ { - "config-name" : "Diddy Kong Racing (USA v1.0)", - "checksum-md5" : "4f0e07f0eeac7e5d7ce3a75461888d03", - "subfolder" : "us_1.0", - "code" : { - "sections" : [ - { - "type": "NoExtract", - "folder" : "", - "files" : [ - { "filename": "rom_header", "length" : "0x40" } - ] - }, - { - "type": "Binary", - "folder" : "bin", - "files" : [ - { "filename": "boot", "length" : "0xFC0" } - ] - }, - { - "type": "NoExtract", - "folder" : "", - "files" : [ - { "filename": "game_code", "length" : "0xD7200" } - ] - }, - { - "type": "Binary", - "folder" : "../../ucode/us_1.0", - "files" : [ - { "filename": "ucode_unknown", "length" : "0xEC0" }, - { "filename": "ucode_boot", "length" : "0xD0" }, - { "filename": "ucode_f3ddkr_dram", "length" : "0x1200" }, - { "filename": "ucode_f3ddkr_fifo", "length" : "0x11E0" }, - { "filename": "ucode_f3ddkr_xbus", "length" : "0x1200" }, - { "filename": "ucode_unknown_2", "length" : "0xAC0" } - ] - }, - { - "type": "NoExtract", - "folder" : "", - "files" : [ - { "filename": "game_data", "length" : "0xD2A0" } - ] - }, - { - "type": "Binary", - "folder" : "../../ucode/us_1.0", - "files" : [ - { "filename": "data_unknown", "length" : "0x2D0" }, - { "filename": "data_f3ddkr_dram", "length" : "0x800" }, - { "filename": "data_f3ddkr_fifo", "length" : "0x800" }, - { "filename": "data_f3ddkr_xbus", "length" : "0x800" }, - { "filename": "data_unknown_2", "length" : "0xBC0" } - ] - } - ] - }, - "assets" : { - "sections": [ - { - "name": "UNKNOWN_0", - "type": "Binary", - "folder": "unknown_0", - "table": 1 - }, - { - "name": "UNKNOWN_0_TABLE", - "type": "Table" - }, - { - "name": "TEXTURES_3D", - "type": "Textures", - "folder": "textures/3d", - "table": 3, - "flip-textures": [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,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,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1] - }, - { - "name": "TEXTURES_3D_TABLE", - "type": "Table" - }, - { - "name": "TEXTURES_2D", - "type": "Textures", - "folder": "textures/2d", - "table": 5, - "flip-textures" : [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - }, - { - "name": "TEXTURES_2D_TABLE", - "type": "Table" - }, - { - "name": "GAME_TEXT", - "type": "GameText", - "folder": "text/game", - "table": 7 - }, - { - "name": "GAME_TEXT_TABLE", - "type": "Table" - }, - { - "name": "MENU_TEXT", - "type": "MenuText", - "folder": "text/menu", - "table": 9, - "filenames": [ - "english_menu_text", - "german_menu_text", - "french_menu_text", - "japanese_menu_text" - ] - }, - { - "name": "MENU_TEXT_TABLE", - "type": "Table" - }, - { - "name": "SCREENS", - "type": "Binary", - "folder": "screens", - "table": 11 - }, - { - "name": "SCREENS_TABLE", - "type": "Table" - }, - { - "name": "SPRITES", - "type": "Sprites", - "folder": "sprites", - "table": 13 - }, - { - "name": "SPRITES_TABLE", - "type": "Table" - }, - { - "name": "EMPTY_14", - "type": "Empty" - }, - { - "name": "MISC", - "type": "Miscellaneous", - "folder": "misc", - "table": 16, - "filenames": [ - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "tracks_menu_ids", - "hub_area_ids", - "main_tracks_ids", - "battle_tracks_ids", - "boss_tracks_ids", - "", - "", - "RacerStats_Unknown0", - "RacerStats_Diddy", - "RacerStats_TT", - "RacerStats_Unknown1", - "RacerStats_Krunch", - "RacerStats_Bumper", - "RacerStats_Tiptup", - "RacerStats_Conker", - "RacerStats_Timber", - "RacerStats_Banjo", - "RacerStats_Drumstick", - "RacerStats_Pipsy", - "RacerStats_Unknown2", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "magic_codes", - "title_screen_demo_ids", - "", - "", - "", - "" - ] - }, - { - "name": "MISC_TABLE", - "type": "Table" - }, - { - "name": "HUD_ELEMENT_IDS", - "type": "Binary", - "folder": "ids", - "filenames": [ "hud_element_ids" ] - }, - { - "name": "MENU_ELEMENT_IDS", - "type": "Binary", - "folder": "ids", - "filenames": [ "menu_element_ids" ] - }, - { - "name": "UNKNOWN_19", - "type": "Binary", - "folder": "bin", - "filenames": [ "unknown_table" ] - }, - { - "name": "LEVEL_OBJECT_MAPS_TABLE", - "type": "Table" - }, - { - "name": "LEVEL_OBJECT_MAPS", - "type": "LevelObjectMap", - "folder": "levels/objectMaps", - "table": 20 - }, - { - "name": "LEVEL_HEADERS_TABLE", - "type": "Table" - }, - { - "name": "LEVEL_HEADERS", - "type": "LevelHeaders", - "folder": "levels/headers", - "table": 22, - "filenames": [ - "CentralAreaHub", - "Bluey1", - "DragonForestHub", - "FossilCanyon", - "PirateLagoon", - "AncientLake", - "WalrusCove", - "HotTopVolcano", - "WhaleBay", - "SnowballValley", - "CrescentIsland", - "FireMountain", - "DinoDomainHub", - "EverfrostPeak", - "SherbetIslandHub", - "SpaceportAlpha", - "HorseshoeGulch", - "SpacedustAlley", - "GreenwoodVillage", - "BoulderCanyon", - "WindmillPlains", - "FrontEnd", - "CharacterSelect", - "TitleScreenSequence", - "SnowflakeMountainHub", - "SmokeyCastle", - "DarkwaterBeach", - "IciclePyramid", - "FrostyVillage", - "JungleFalls", - "TreasureCaves", - "HauntedWoods", - "DarkmoonCaverns", - "StarCity", - "TrophyRace", - "FutureFunLandHub", - "OpeningSequence", - "Wizpig1", - "Trickytops1", - "OptionsBackground", - "Bubbler1", - "Smokey1", - "WizpigMouthSequence", - "WizpigAmuletSequence", - "TTAmuletSequence", - "RocketSequence", - "Trickytops2", - "DinoDomainTrophyAnim", - "SnowflakeMountainTrophyAnim", - "SherbetIslandTrophyAnim", - "DragonForestTrophyAnim", - "FutureFunLandTrophyAnim", - "Bluey2", - "Bubbler2", - "Smokey2", - "Wizpig2", - "PartySequence", - "TricktopsAnim", - "SmokeyAnim", - "BlueyAnim", - "Wizpig1Anim", - "BubblerAnim", - "Wizpig2Anim", - "LastBit", - "LastBitB" - ] - }, - { - "name": "LEVEL_NAMES_TABLE", - "type": "Table" - }, - { - "name": "LEVEL_NAMES", - "type": "LevelNames", - "folder": "levels/names", - "table": 24, - "filenames": [ - "CentralAreaHub", - "Bluey1", - "DragonForestHub", - "FossilCanyon", - "PirateLagoon", - "AncientLake", - "WalrusCove", - "HotTopVolcano", - "WhaleBay", - "SnowballValley", - "CrescentIsland", - "FireMountain", - "DinoDomainHub", - "EverfrostPeak", - "SherbetIslandHub", - "SpaceportAlpha", - "HorseshoeGulch", - "SpacedustAlley", - "GreenwoodVillage", - "BoulderCanyon", - "WindmillPlains", - "FrontEnd", - "CharacterSelect", - "TitleScreenSequence", - "SnowflakeMountainHub", - "SmokeyCastle", - "DarkwaterBeach", - "IciclePyramid", - "FrostyVillage", - "JungleFalls", - "TreasureCaves", - "HauntedWoods", - "DarkmoonCaverns", - "StarCity", - "TrophyRace", - "FutureFunLandHub", - "OpeningSequence", - "Wizpig1", - "Trickytops1", - "OptionsBackground", - "Bubbler1", - "Smokey1", - "WizpigMouthSequence", - "WizpigAmuletSequence", - "TTAmuletSequence", - "RocketSequence", - "Trickytops2", - "DinoDomainTrophyAnim", - "SnowflakeMountainTrophyAnim", - "SherbetIslandTrophyAnim", - "DragonForestTrophyAnim", - "FutureFunLandTrophyAnim", - "Bluey2", - "Bubbler2", - "Smokey2", - "Wizpig2", - "PartySequence", - "TricktopsAnim", - "SmokeyAnim", - "BlueyAnim", - "Wizpig1Anim", - "BubblerAnim", - "Wizpig2Anim", - "LastBit", - "LastBitB" - ] - }, - { - "name": "LEVEL_MODELS_TABLE", - "type": "Table" - }, - { - "name": "LEVEL_MODELS", - "type": "LevelModels", - "folder": "levels/models", - "table": 26 - }, - { - "name": "OBJECT_MODELS_TABLE", - "type": "Table" - }, - { - "name": "OBJECT_MODELS", - "type": "ObjectModels", - "folder": "objects/models", - "table": 28 - }, - { - "name": "ANIMATION_IDS", - "type": "Binary", - "folder": "objects", - "filenames": [ "animation_ids" ] - }, - { - "name": "OBJECT_ANIMATIONS_TABLE", - "type": "Table" - }, - { - "name": "OBJECT_ANIMATIONS", - "type": "ObjectAnimations", - "folder": "objects/animations", - "table": 31 - }, - { - "name": "OBJECT_HEADERS_TABLE", - "type": "Table" - }, - { - "name": "OBJECT_HEADERS", - "type": "ObjectHeaders", - "folder": "objects/headers", - "table": 33 - }, - { - "name": "LEVEL_OBJECT_TRANSLATION_TABLE", - "type": "Binary", - "folder": "objects", - "filenames": [ "level_object_translation_table" ] - }, - { - "name": "EMPTY_37_TABLE", - "type": "Table" - }, - { - "name": "EMPTY_37", - "type": "Empty", - "table": 36 - }, - { - "name": "AUDIO_TABLE", - "type": "Table" - }, - { - "name": "AUDIO", - "type": "Audio", - "folder": "audio", - "table": 38 - }, - { - "name": "PARTICLES_TABLE", - "type": "Table" - }, - { - "name": "PARTICLES", - "type": "Particles", - "folder": "particles/particles", - "table": 40 - }, - { - "name": "PARTICLE_BEHAVIORS_TABLE", - "type": "Table" - }, - { - "name": "PARTICLE_BEHAVIORS", - "type": "ParticleBehaviors", - "folder": "particles/behaviors", - "table": 42 - }, - { - "name": "BINARY_44", - "type": "Binary", - "folder": "fonts" - }, - { - "name": "BINARY_45", - "type": "Binary", - "folder": "fonts" - }, - { - "name": "BINARY_46", - "type": "Binary", - "folder": "fonts" - }, - { - "name": "BINARY_47", - "type": "Binary", - "folder": "ids" - }, - { - "name": "TTGHOSTS_TABLE", - "type": "Table" - }, - { - "name": "TTGHOSTS", - "type": "TTGhosts", - "folder": "tt_ghosts", - "table": 48, - "filenames": [ - "FossilCanyon", - "PirateLagoon", - "AncientLake", - "WalrusCove", - "HotTopVolcano", - "WhaleBay", - "SnowballValley", - "CrescentIsland", - "EverfrostPeak", - "SpaceportAlpha", - "SpacedustAlley", - "GreenwoodVillage", - "BoulderCanyon", - "WindmillPlains", - "FrostyVillage", - "JungleFalls", - "TreasureCaves", - "HauntedWoods", - "DarkmoonCaverns", - "StarCity" - ] - } - ] - } + "config-name": "Diddy Kong Racing (USA v1.0)", + "checksum-md5": "4f0e07f0eeac7e5d7ce3a75461888d03", + "subfolder": "us_1.0", + "revision": 2, + "code": { + "sections": [{ + "type": "NoExtract", + "folder": "", + "files": [{ + "filename": "rom_header", + "length": "0x40" + }] + }, + { + "type": "Binary", + "folder": "bin", + "files": [{ + "filename": "boot", + "length": "0xFC0" + }] + }, + { + "type": "NoExtract", + "folder": "", + "files": [{ + "filename": "game_code", + "length": "0xD7200" + }] + }, + { + "type": "Binary", + "folder": "../../../ucode/us_1.0", + "files": [{ + "filename": "ucode_unknown", + "length": "0xEC0" + }, + { + "filename": "ucode_boot", + "length": "0xD0" + }, + { + "filename": "ucode_f3ddkr_dram", + "length": "0x1200" + }, + { + "filename": "ucode_f3ddkr_fifo", + "length": "0x11E0" + }, + { + "filename": "ucode_f3ddkr_xbus", + "length": "0x1200" + }, + { + "filename": "ucode_unknown_2", + "length": "0xAC0" + } + ] + }, + { + "type": "NoExtract", + "folder": "", + "files": [{ + "filename": "game_data", + "length": "0xD2A0" + }] + }, + { + "type": "Binary", + "folder": "../../../ucode/us_1.0", + "files": [{ + "filename": "data_unknown", + "length": "0x2D0" + }, + { + "filename": "data_f3ddkr_dram", + "length": "0x800" + }, + { + "filename": "data_f3ddkr_fifo", + "length": "0x800" + }, + { + "filename": "data_f3ddkr_xbus", + "length": "0x800" + }, + { + "filename": "data_unknown_2", + "length": "0xBC0" + } + ] + } + ] + }, + "assets": { + "sections": [{ + "build-id": "ASSET_UNKNOWN_0", + "type": "Binary", + "folder": "unknown_0", + "table": 1 + }, + { + "build-id": "ASSET_UNKNOWN_0_TABLE", + "type": "Table", + "for": "ASSET_UNKNOWN_0" + }, + { + "build-id": "ASSET_TEXTURES_3D", + "type": "Textures", + "folder": "textures/3d", + "table": 3, + "flip-textures": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + "child-build-ids": ["ASSET_TEX3D_0", "ASSET_TEX3D_1", "ASSET_TEX3D_2", "ASSET_TEX3D_3", "ASSET_TEX3D_4", "ASSET_TEX3D_5", "ASSET_TEX3D_6", "ASSET_TEX3D_7", "ASSET_TEX3D_8", "ASSET_TEX3D_9", "ASSET_TEX3D_10", "ASSET_TEX3D_11", "ASSET_TEX3D_12", "ASSET_TEX3D_13", "ASSET_TEX3D_14", "ASSET_TEX3D_15", "ASSET_TEX3D_16", "ASSET_TEX3D_17", "ASSET_TEX3D_18", "ASSET_TEX3D_19", "ASSET_TEX3D_20", "ASSET_TEX3D_21", "ASSET_TEX3D_22", "ASSET_TEX3D_23", "ASSET_TEX3D_24", "ASSET_TEX3D_25", "ASSET_TEX3D_26", "ASSET_TEX3D_27", "ASSET_TEX3D_28", "ASSET_TEX3D_29", "ASSET_TEX3D_30", "ASSET_TEX3D_31", "ASSET_TEX3D_32", "ASSET_TEX3D_33", "ASSET_TEX3D_34", "ASSET_TEX3D_35", "ASSET_TEX3D_36", "ASSET_TEX3D_37", "ASSET_TEX3D_38", "ASSET_TEX3D_39", "ASSET_TEX3D_40", "ASSET_TEX3D_41", "ASSET_TEX3D_42", "ASSET_TEX3D_43", "ASSET_TEX3D_44", "ASSET_TEX3D_45", "ASSET_TEX3D_46", "ASSET_TEX3D_47", "ASSET_TEX3D_48", "ASSET_TEX3D_49", "ASSET_TEX3D_50", "ASSET_TEX3D_51", "ASSET_TEX3D_52", "ASSET_TEX3D_53", "ASSET_TEX3D_54", "ASSET_TEX3D_55", "ASSET_TEX3D_56", "ASSET_TEX3D_57", "ASSET_TEX3D_58", "ASSET_TEX3D_59", "ASSET_TEX3D_60", "ASSET_TEX3D_61", "ASSET_TEX3D_62", "ASSET_TEX3D_63", "ASSET_TEX3D_64", "ASSET_TEX3D_65", "ASSET_TEX3D_66", "ASSET_TEX3D_67", "ASSET_TEX3D_68", "ASSET_TEX3D_69", "ASSET_TEX3D_70", "ASSET_TEX3D_71", "ASSET_TEX3D_72", "ASSET_TEX3D_73", "ASSET_TEX3D_74", "ASSET_TEX3D_75", "ASSET_TEX3D_76", "ASSET_TEX3D_77", "ASSET_TEX3D_78", "ASSET_TEX3D_79", "ASSET_TEX3D_80", "ASSET_TEX3D_81", "ASSET_TEX3D_82", "ASSET_TEX3D_83", "ASSET_TEX3D_84", "ASSET_TEX3D_85", "ASSET_TEX3D_86", "ASSET_TEX3D_87", "ASSET_TEX3D_88", "ASSET_TEX3D_89", "ASSET_TEX3D_90", "ASSET_TEX3D_91", "ASSET_TEX3D_92", "ASSET_TEX3D_93", "ASSET_TEX3D_94", "ASSET_TEX3D_95", "ASSET_TEX3D_96", "ASSET_TEX3D_97", "ASSET_TEX3D_98", "ASSET_TEX3D_99", "ASSET_TEX3D_100", "ASSET_TEX3D_101", "ASSET_TEX3D_102", "ASSET_TEX3D_103", "ASSET_TEX3D_104", "ASSET_TEX3D_105", "ASSET_TEX3D_106", "ASSET_TEX3D_107", "ASSET_TEX3D_108", "ASSET_TEX3D_109", "ASSET_TEX3D_110", "ASSET_TEX3D_111", "ASSET_TEX3D_112", "ASSET_TEX3D_113", "ASSET_TEX3D_114", "ASSET_TEX3D_115", "ASSET_TEX3D_116", "ASSET_TEX3D_117", "ASSET_TEX3D_118", "ASSET_TEX3D_119", "ASSET_TEX3D_120", "ASSET_TEX3D_121", "ASSET_TEX3D_122", "ASSET_TEX3D_123", "ASSET_TEX3D_124", "ASSET_TEX3D_125", "ASSET_TEX3D_126", "ASSET_TEX3D_127", "ASSET_TEX3D_128", "ASSET_TEX3D_129", "ASSET_TEX3D_130", "ASSET_TEX3D_131", "ASSET_TEX3D_132", "ASSET_TEX3D_133", "ASSET_TEX3D_134", "ASSET_TEX3D_135", "ASSET_TEX3D_136", "ASSET_TEX3D_137", "ASSET_TEX3D_138", "ASSET_TEX3D_139", "ASSET_TEX3D_140", "ASSET_TEX3D_141", "ASSET_TEX3D_142", "ASSET_TEX3D_143", "ASSET_TEX3D_144", "ASSET_TEX3D_145", "ASSET_TEX3D_146", "ASSET_TEX3D_147", "ASSET_TEX3D_148", "ASSET_TEX3D_149", "ASSET_TEX3D_150", "ASSET_TEX3D_151", "ASSET_TEX3D_152", "ASSET_TEX3D_153", "ASSET_TEX3D_154", "ASSET_TEX3D_155", "ASSET_TEX3D_156", "ASSET_TEX3D_157", "ASSET_TEX3D_158", "ASSET_TEX3D_159", "ASSET_TEX3D_160", "ASSET_TEX3D_161", "ASSET_TEX3D_162", "ASSET_TEX3D_163", "ASSET_TEX3D_164", "ASSET_TEX3D_165", "ASSET_TEX3D_166", "ASSET_TEX3D_167", "ASSET_TEX3D_168", "ASSET_TEX3D_169", "ASSET_TEX3D_170", "ASSET_TEX3D_171", "ASSET_TEX3D_172", "ASSET_TEX3D_173", "ASSET_TEX3D_174", "ASSET_TEX3D_175", "ASSET_TEX3D_176", "ASSET_TEX3D_177", "ASSET_TEX3D_178", "ASSET_TEX3D_179", "ASSET_TEX3D_180", "ASSET_TEX3D_181", "ASSET_TEX3D_182", "ASSET_TEX3D_183", "ASSET_TEX3D_184", "ASSET_TEX3D_185", "ASSET_TEX3D_186", "ASSET_TEX3D_187", "ASSET_TEX3D_188", "ASSET_TEX3D_189", "ASSET_TEX3D_190", "ASSET_TEX3D_191", "ASSET_TEX3D_192", "ASSET_TEX3D_193", "ASSET_TEX3D_194", "ASSET_TEX3D_195", "ASSET_TEX3D_196", "ASSET_TEX3D_197", "ASSET_TEX3D_198", "ASSET_TEX3D_199", "ASSET_TEX3D_200", "ASSET_TEX3D_201", "ASSET_TEX3D_202", "ASSET_TEX3D_203", "ASSET_TEX3D_204", "ASSET_TEX3D_205", "ASSET_TEX3D_206", "ASSET_TEX3D_207", "ASSET_TEX3D_208", "ASSET_TEX3D_209", "ASSET_TEX3D_210", "ASSET_TEX3D_211", "ASSET_TEX3D_212", "ASSET_TEX3D_213", "ASSET_TEX3D_214", "ASSET_TEX3D_215", "ASSET_TEX3D_216", "ASSET_TEX3D_217", "ASSET_TEX3D_218", "ASSET_TEX3D_219", "ASSET_TEX3D_220", "ASSET_TEX3D_221", "ASSET_TEX3D_222", "ASSET_TEX3D_223", "ASSET_TEX3D_224", "ASSET_TEX3D_225", "ASSET_TEX3D_226", "ASSET_TEX3D_227", "ASSET_TEX3D_228", "ASSET_TEX3D_229", "ASSET_TEX3D_230", "ASSET_TEX3D_231", "ASSET_TEX3D_232", "ASSET_TEX3D_233", "ASSET_TEX3D_234", "ASSET_TEX3D_235", "ASSET_TEX3D_236", "ASSET_TEX3D_237", "ASSET_TEX3D_238", "ASSET_TEX3D_239", "ASSET_TEX3D_240", "ASSET_TEX3D_241", "ASSET_TEX3D_242", "ASSET_TEX3D_243", "ASSET_TEX3D_244", "ASSET_TEX3D_245", "ASSET_TEX3D_246", "ASSET_TEX3D_247", "ASSET_TEX3D_248", "ASSET_TEX3D_249", "ASSET_TEX3D_250", "ASSET_TEX3D_251", "ASSET_TEX3D_252", "ASSET_TEX3D_253", "ASSET_TEX3D_254", "ASSET_TEX3D_255", "ASSET_TEX3D_256", "ASSET_TEX3D_257", "ASSET_TEX3D_258", "ASSET_TEX3D_259", "ASSET_TEX3D_260", "ASSET_TEX3D_261", "ASSET_TEX3D_262", "ASSET_TEX3D_263", "ASSET_TEX3D_264", "ASSET_TEX3D_265", "ASSET_TEX3D_266", "ASSET_TEX3D_267", "ASSET_TEX3D_268", "ASSET_TEX3D_269", "ASSET_TEX3D_270", "ASSET_TEX3D_271", "ASSET_TEX3D_272", "ASSET_TEX3D_273", "ASSET_TEX3D_274", "ASSET_TEX3D_275", "ASSET_TEX3D_276", "ASSET_TEX3D_277", "ASSET_TEX3D_278", "ASSET_TEX3D_279", "ASSET_TEX3D_280", "ASSET_TEX3D_281", "ASSET_TEX3D_282", "ASSET_TEX3D_283", "ASSET_TEX3D_284", "ASSET_TEX3D_285", "ASSET_TEX3D_286", "ASSET_TEX3D_287", "ASSET_TEX3D_288", "ASSET_TEX3D_289", "ASSET_TEX3D_290", "ASSET_TEX3D_291", "ASSET_TEX3D_292", "ASSET_TEX3D_293", "ASSET_TEX3D_294", "ASSET_TEX3D_295", "ASSET_TEX3D_296", "ASSET_TEX3D_297", "ASSET_TEX3D_298", "ASSET_TEX3D_299", "ASSET_TEX3D_300", "ASSET_TEX3D_301", "ASSET_TEX3D_302", "ASSET_TEX3D_303", "ASSET_TEX3D_304", "ASSET_TEX3D_305", "ASSET_TEX3D_306", "ASSET_TEX3D_307", "ASSET_TEX3D_308", "ASSET_TEX3D_309", "ASSET_TEX3D_310", "ASSET_TEX3D_311", "ASSET_TEX3D_312", "ASSET_TEX3D_313", "ASSET_TEX3D_314", "ASSET_TEX3D_315", "ASSET_TEX3D_316", "ASSET_TEX3D_317", "ASSET_TEX3D_318", "ASSET_TEX3D_319", "ASSET_TEX3D_320", "ASSET_TEX3D_321", "ASSET_TEX3D_322", "ASSET_TEX3D_323", "ASSET_TEX3D_324", "ASSET_TEX3D_325", "ASSET_TEX3D_326", "ASSET_TEX3D_327", "ASSET_TEX3D_328", "ASSET_TEX3D_329", "ASSET_TEX3D_330", "ASSET_TEX3D_331", "ASSET_TEX3D_332", "ASSET_TEX3D_333", "ASSET_TEX3D_334", "ASSET_TEX3D_335", "ASSET_TEX3D_336", "ASSET_TEX3D_337", "ASSET_TEX3D_338", "ASSET_TEX3D_339", "ASSET_TEX3D_340", "ASSET_TEX3D_341", "ASSET_TEX3D_342", "ASSET_TEX3D_343", "ASSET_TEX3D_344", "ASSET_TEX3D_345", "ASSET_TEX3D_346", "ASSET_TEX3D_347", "ASSET_TEX3D_348", "ASSET_TEX3D_349", "ASSET_TEX3D_350", "ASSET_TEX3D_351", "ASSET_TEX3D_352", "ASSET_TEX3D_353", "ASSET_TEX3D_354", "ASSET_TEX3D_355", "ASSET_TEX3D_356", "ASSET_TEX3D_357", "ASSET_TEX3D_358", "ASSET_TEX3D_359", "ASSET_TEX3D_360", "ASSET_TEX3D_361", "ASSET_TEX3D_362", "ASSET_TEX3D_363", "ASSET_TEX3D_364", "ASSET_TEX3D_365", "ASSET_TEX3D_366", "ASSET_TEX3D_367", "ASSET_TEX3D_368", "ASSET_TEX3D_369", "ASSET_TEX3D_370", "ASSET_TEX3D_371", "ASSET_TEX3D_372", "ASSET_TEX3D_373", "ASSET_TEX3D_374", "ASSET_TEX3D_375", "ASSET_TEX3D_376", "ASSET_TEX3D_377", "ASSET_TEX3D_378", "ASSET_TEX3D_379", "ASSET_TEX3D_380", "ASSET_TEX3D_381", "ASSET_TEX3D_382", "ASSET_TEX3D_383", "ASSET_TEX3D_384", "ASSET_TEX3D_385", "ASSET_TEX3D_386", "ASSET_TEX3D_387", "ASSET_TEX3D_388", "ASSET_TEX3D_389", "ASSET_TEX3D_390", "ASSET_TEX3D_391", "ASSET_TEX3D_392", "ASSET_TEX3D_393", "ASSET_TEX3D_394", "ASSET_TEX3D_395", "ASSET_TEX3D_396", "ASSET_TEX3D_397", "ASSET_TEX3D_398", "ASSET_TEX3D_399", "ASSET_TEX3D_400", "ASSET_TEX3D_401", "ASSET_TEX3D_402", "ASSET_TEX3D_403", "ASSET_TEX3D_404", "ASSET_TEX3D_405", "ASSET_TEX3D_406", "ASSET_TEX3D_407", "ASSET_TEX3D_408", "ASSET_TEX3D_409", "ASSET_TEX3D_410", "ASSET_TEX3D_411", "ASSET_TEX3D_412", "ASSET_TEX3D_413", "ASSET_TEX3D_414", "ASSET_TEX3D_415", "ASSET_TEX3D_416", "ASSET_TEX3D_417", "ASSET_TEX3D_418", "ASSET_TEX3D_419", "ASSET_TEX3D_420", "ASSET_TEX3D_421", "ASSET_TEX3D_422", "ASSET_TEX3D_423", "ASSET_TEX3D_424", "ASSET_TEX3D_425", "ASSET_TEX3D_426", "ASSET_TEX3D_427", "ASSET_TEX3D_428", "ASSET_TEX3D_429", "ASSET_TEX3D_430", "ASSET_TEX3D_431", "ASSET_TEX3D_432", "ASSET_TEX3D_433", "ASSET_TEX3D_434", "ASSET_TEX3D_435", "ASSET_TEX3D_436", "ASSET_TEX3D_437", "ASSET_TEX3D_438", "ASSET_TEX3D_439", "ASSET_TEX3D_440", "ASSET_TEX3D_441", "ASSET_TEX3D_442", "ASSET_TEX3D_443", "ASSET_TEX3D_444", "ASSET_TEX3D_445", "ASSET_TEX3D_446", "ASSET_TEX3D_447", "ASSET_TEX3D_448", "ASSET_TEX3D_449", "ASSET_TEX3D_450", "ASSET_TEX3D_451", "ASSET_TEX3D_452", "ASSET_TEX3D_453", "ASSET_TEX3D_454", "ASSET_TEX3D_455", "ASSET_TEX3D_456", "ASSET_TEX3D_457", "ASSET_TEX3D_458", "ASSET_TEX3D_459", "ASSET_TEX3D_460", "ASSET_TEX3D_461", "ASSET_TEX3D_462", "ASSET_TEX3D_463", "ASSET_TEX3D_464", "ASSET_TEX3D_465", "ASSET_TEX3D_466", "ASSET_TEX3D_467", "ASSET_TEX3D_468", "ASSET_TEX3D_469", "ASSET_TEX3D_470", "ASSET_TEX3D_471", "ASSET_TEX3D_472", "ASSET_TEX3D_473", "ASSET_TEX3D_474", "ASSET_TEX3D_475", "ASSET_TEX3D_476", "ASSET_TEX3D_477", "ASSET_TEX3D_478", "ASSET_TEX3D_479", "ASSET_TEX3D_480", "ASSET_TEX3D_481", "ASSET_TEX3D_482", "ASSET_TEX3D_483", "ASSET_TEX3D_484", "ASSET_TEX3D_485", "ASSET_TEX3D_486", "ASSET_TEX3D_487", "ASSET_TEX3D_488", "ASSET_TEX3D_489", "ASSET_TEX3D_490", "ASSET_TEX3D_491", "ASSET_TEX3D_492", "ASSET_TEX3D_493", "ASSET_TEX3D_494", "ASSET_TEX3D_495", "ASSET_TEX3D_496", "ASSET_TEX3D_497", "ASSET_TEX3D_498", "ASSET_TEX3D_499", "ASSET_TEX3D_500", "ASSET_TEX3D_501", "ASSET_TEX3D_502", "ASSET_TEX3D_503", "ASSET_TEX3D_504", "ASSET_TEX3D_505", "ASSET_TEX3D_506", "ASSET_TEX3D_507", "ASSET_TEX3D_508", "ASSET_TEX3D_509", "ASSET_TEX3D_510", "ASSET_TEX3D_511", "ASSET_TEX3D_512", "ASSET_TEX3D_513", "ASSET_TEX3D_514", "ASSET_TEX3D_515", "ASSET_TEX3D_516", "ASSET_TEX3D_517", "ASSET_TEX3D_518", "ASSET_TEX3D_519", "ASSET_TEX3D_520", "ASSET_TEX3D_521", "ASSET_TEX3D_522", "ASSET_TEX3D_523", "ASSET_TEX3D_524", "ASSET_TEX3D_525", "ASSET_TEX3D_526", "ASSET_TEX3D_527", "ASSET_TEX3D_528", "ASSET_TEX3D_529", "ASSET_TEX3D_530", "ASSET_TEX3D_531", "ASSET_TEX3D_532", "ASSET_TEX3D_533", "ASSET_TEX3D_534", "ASSET_TEX3D_535", "ASSET_TEX3D_536", "ASSET_TEX3D_537", "ASSET_TEX3D_538", "ASSET_TEX3D_539", "ASSET_TEX3D_540", "ASSET_TEX3D_541", "ASSET_TEX3D_542", "ASSET_TEX3D_543", "ASSET_TEX3D_544", "ASSET_TEX3D_545", "ASSET_TEX3D_546", "ASSET_TEX3D_547", "ASSET_TEX3D_548", "ASSET_TEX3D_549", "ASSET_TEX3D_550", "ASSET_TEX3D_551", "ASSET_TEX3D_552", "ASSET_TEX3D_553", "ASSET_TEX3D_554", "ASSET_TEX3D_555", "ASSET_TEX3D_556", "ASSET_TEX3D_557", "ASSET_TEX3D_558", "ASSET_TEX3D_559", "ASSET_TEX3D_560", "ASSET_TEX3D_561", "ASSET_TEX3D_562", "ASSET_TEX3D_563", "ASSET_TEX3D_564", "ASSET_TEX3D_565", "ASSET_TEX3D_566", "ASSET_TEX3D_567", "ASSET_TEX3D_568", "ASSET_TEX3D_569", "ASSET_TEX3D_570", "ASSET_TEX3D_571", "ASSET_TEX3D_572", "ASSET_TEX3D_573", "ASSET_TEX3D_574", "ASSET_TEX3D_575", "ASSET_TEX3D_576", "ASSET_TEX3D_577", "ASSET_TEX3D_578", "ASSET_TEX3D_579", "ASSET_TEX3D_580", "ASSET_TEX3D_581", "ASSET_TEX3D_582", "ASSET_TEX3D_583", "ASSET_TEX3D_584", "ASSET_TEX3D_585", "ASSET_TEX3D_586", "ASSET_TEX3D_587", "ASSET_TEX3D_588", "ASSET_TEX3D_589", "ASSET_TEX3D_590", "ASSET_TEX3D_591", "ASSET_TEX3D_592", "ASSET_TEX3D_593", "ASSET_TEX3D_594", "ASSET_TEX3D_595", "ASSET_TEX3D_596", "ASSET_TEX3D_597", "ASSET_TEX3D_598", "ASSET_TEX3D_599", "ASSET_TEX3D_600", "ASSET_TEX3D_601", "ASSET_TEX3D_602", "ASSET_TEX3D_603", "ASSET_TEX3D_604", "ASSET_TEX3D_605", "ASSET_TEX3D_606", "ASSET_TEX3D_607", "ASSET_TEX3D_608", "ASSET_TEX3D_609", "ASSET_TEX3D_610", "ASSET_TEX3D_611", "ASSET_TEX3D_612", "ASSET_TEX3D_613", "ASSET_TEX3D_614", "ASSET_TEX3D_615", "ASSET_TEX3D_616", "ASSET_TEX3D_617", "ASSET_TEX3D_618", "ASSET_TEX3D_619", "ASSET_TEX3D_620", "ASSET_TEX3D_621", "ASSET_TEX3D_622", "ASSET_TEX3D_623", "ASSET_TEX3D_624", "ASSET_TEX3D_625", "ASSET_TEX3D_626", "ASSET_TEX3D_627", "ASSET_TEX3D_628", "ASSET_TEX3D_629", "ASSET_TEX3D_630", "ASSET_TEX3D_631", "ASSET_TEX3D_632", "ASSET_TEX3D_633", "ASSET_TEX3D_634", "ASSET_TEX3D_635", "ASSET_TEX3D_636", "ASSET_TEX3D_637", "ASSET_TEX3D_638", "ASSET_TEX3D_639", "ASSET_TEX3D_640", "ASSET_TEX3D_641", "ASSET_TEX3D_642", "ASSET_TEX3D_643", "ASSET_TEX3D_644", "ASSET_TEX3D_645", "ASSET_TEX3D_646", "ASSET_TEX3D_647", "ASSET_TEX3D_648", "ASSET_TEX3D_649", "ASSET_TEX3D_650", "ASSET_TEX3D_651", "ASSET_TEX3D_652", "ASSET_TEX3D_653", "ASSET_TEX3D_654", "ASSET_TEX3D_655", "ASSET_TEX3D_656", "ASSET_TEX3D_657", "ASSET_TEX3D_658", "ASSET_TEX3D_659", "ASSET_TEX3D_660", "ASSET_TEX3D_661", "ASSET_TEX3D_662", "ASSET_TEX3D_663", "ASSET_TEX3D_664", "ASSET_TEX3D_665", "ASSET_TEX3D_666", "ASSET_TEX3D_667", "ASSET_TEX3D_668", "ASSET_TEX3D_669", "ASSET_TEX3D_670", "ASSET_TEX3D_671", "ASSET_TEX3D_672", "ASSET_TEX3D_673", "ASSET_TEX3D_674", "ASSET_TEX3D_675", "ASSET_TEX3D_676", "ASSET_TEX3D_677", "ASSET_TEX3D_678", "ASSET_TEX3D_679", "ASSET_TEX3D_680", "ASSET_TEX3D_681", "ASSET_TEX3D_682", "ASSET_TEX3D_683", "ASSET_TEX3D_684", "ASSET_TEX3D_685", "ASSET_TEX3D_686", "ASSET_TEX3D_687", "ASSET_TEX3D_688", "ASSET_TEX3D_689", "ASSET_TEX3D_690", "ASSET_TEX3D_691", "ASSET_TEX3D_692", "ASSET_TEX3D_693", "ASSET_TEX3D_694", "ASSET_TEX3D_695", "ASSET_TEX3D_696", "ASSET_TEX3D_697", "ASSET_TEX3D_698", "ASSET_TEX3D_699", "ASSET_TEX3D_700", "ASSET_TEX3D_701", "ASSET_TEX3D_702", "ASSET_TEX3D_703", "ASSET_TEX3D_704", "ASSET_TEX3D_705", "ASSET_TEX3D_706", "ASSET_TEX3D_707", "ASSET_TEX3D_708", "ASSET_TEX3D_709", "ASSET_TEX3D_710", "ASSET_TEX3D_711", "ASSET_TEX3D_712", "ASSET_TEX3D_713", "ASSET_TEX3D_714", "ASSET_TEX3D_715", "ASSET_TEX3D_716", "ASSET_TEX3D_717", "ASSET_TEX3D_718", "ASSET_TEX3D_719", "ASSET_TEX3D_720", "ASSET_TEX3D_721", "ASSET_TEX3D_722", "ASSET_TEX3D_723", "ASSET_TEX3D_724", "ASSET_TEX3D_725", "ASSET_TEX3D_726", "ASSET_TEX3D_727", "ASSET_TEX3D_728", "ASSET_TEX3D_729", "ASSET_TEX3D_730", "ASSET_TEX3D_731", "ASSET_TEX3D_732", "ASSET_TEX3D_733", "ASSET_TEX3D_734", "ASSET_TEX3D_735", "ASSET_TEX3D_736", "ASSET_TEX3D_737", "ASSET_TEX3D_738", "ASSET_TEX3D_739", "ASSET_TEX3D_740", "ASSET_TEX3D_741", "ASSET_TEX3D_742", "ASSET_TEX3D_743", "ASSET_TEX3D_744", "ASSET_TEX3D_745", "ASSET_TEX3D_746", "ASSET_TEX3D_747", "ASSET_TEX3D_748", "ASSET_TEX3D_749", "ASSET_TEX3D_750", "ASSET_TEX3D_751", "ASSET_TEX3D_752", "ASSET_TEX3D_753", "ASSET_TEX3D_754", "ASSET_TEX3D_755", "ASSET_TEX3D_756", "ASSET_TEX3D_757", "ASSET_TEX3D_758", "ASSET_TEX3D_759", "ASSET_TEX3D_760", "ASSET_TEX3D_761", "ASSET_TEX3D_762", "ASSET_TEX3D_763", "ASSET_TEX3D_764", "ASSET_TEX3D_765", "ASSET_TEX3D_766", "ASSET_TEX3D_767", "ASSET_TEX3D_768", "ASSET_TEX3D_769", "ASSET_TEX3D_770", "ASSET_TEX3D_771", "ASSET_TEX3D_772", "ASSET_TEX3D_773", "ASSET_TEX3D_774", "ASSET_TEX3D_775", "ASSET_TEX3D_776", "ASSET_TEX3D_777", "ASSET_TEX3D_778", "ASSET_TEX3D_779", "ASSET_TEX3D_780", "ASSET_TEX3D_781", "ASSET_TEX3D_782", "ASSET_TEX3D_783", "ASSET_TEX3D_784", "ASSET_TEX3D_785", "ASSET_TEX3D_786", "ASSET_TEX3D_787", "ASSET_TEX3D_788", "ASSET_TEX3D_789", "ASSET_TEX3D_790", "ASSET_TEX3D_791", "ASSET_TEX3D_792", "ASSET_TEX3D_793", "ASSET_TEX3D_794", "ASSET_TEX3D_795", "ASSET_TEX3D_796", "ASSET_TEX3D_797", "ASSET_TEX3D_798", "ASSET_TEX3D_799", "ASSET_TEX3D_800", "ASSET_TEX3D_801", "ASSET_TEX3D_802", "ASSET_TEX3D_803", "ASSET_TEX3D_804", "ASSET_TEX3D_805", "ASSET_TEX3D_806", "ASSET_TEX3D_807", "ASSET_TEX3D_808", "ASSET_TEX3D_809", "ASSET_TEX3D_810", "ASSET_TEX3D_811", "ASSET_TEX3D_812", "ASSET_TEX3D_813", "ASSET_TEX3D_814", "ASSET_TEX3D_815", "ASSET_TEX3D_816", "ASSET_TEX3D_817", "ASSET_TEX3D_818", "ASSET_TEX3D_819", "ASSET_TEX3D_820", "ASSET_TEX3D_821", "ASSET_TEX3D_822", "ASSET_TEX3D_823", "ASSET_TEX3D_824", "ASSET_TEX3D_825", "ASSET_TEX3D_826", "ASSET_TEX3D_827", "ASSET_TEX3D_828", "ASSET_TEX3D_829", "ASSET_TEX3D_830", "ASSET_TEX3D_831", "ASSET_TEX3D_832", "ASSET_TEX3D_833", "ASSET_TEX3D_834", "ASSET_TEX3D_835", "ASSET_TEX3D_836", "ASSET_TEX3D_837", "ASSET_TEX3D_838", "ASSET_TEX3D_839", "ASSET_TEX3D_840", "ASSET_TEX3D_841", "ASSET_TEX3D_842", "ASSET_TEX3D_843", "ASSET_TEX3D_844", "ASSET_TEX3D_845", "ASSET_TEX3D_846", "ASSET_TEX3D_847", "ASSET_TEX3D_848", "ASSET_TEX3D_849", "ASSET_TEX3D_850", "ASSET_TEX3D_851", "ASSET_TEX3D_852", "ASSET_TEX3D_853", "ASSET_TEX3D_854", "ASSET_TEX3D_855", "ASSET_TEX3D_856", "ASSET_TEX3D_857", "ASSET_TEX3D_858", "ASSET_TEX3D_859", "ASSET_TEX3D_860", "ASSET_TEX3D_861", "ASSET_TEX3D_862", "ASSET_TEX3D_863", "ASSET_TEX3D_864", "ASSET_TEX3D_865", "ASSET_TEX3D_866", "ASSET_TEX3D_867", "ASSET_TEX3D_868", "ASSET_TEX3D_869", "ASSET_TEX3D_870", "ASSET_TEX3D_871", "ASSET_TEX3D_872", "ASSET_TEX3D_873", "ASSET_TEX3D_874", "ASSET_TEX3D_875", "ASSET_TEX3D_876", "ASSET_TEX3D_877", "ASSET_TEX3D_878", "ASSET_TEX3D_879", "ASSET_TEX3D_880", "ASSET_TEX3D_881", "ASSET_TEX3D_882", "ASSET_TEX3D_883", "ASSET_TEX3D_884", "ASSET_TEX3D_885", "ASSET_TEX3D_886", "ASSET_TEX3D_887", "ASSET_TEX3D_888", "ASSET_TEX3D_889", "ASSET_TEX3D_890", "ASSET_TEX3D_891", "ASSET_TEX3D_892", "ASSET_TEX3D_893", "ASSET_TEX3D_894", "ASSET_TEX3D_895", "ASSET_TEX3D_896", "ASSET_TEX3D_897", "ASSET_TEX3D_898", "ASSET_TEX3D_899", "ASSET_TEX3D_900", "ASSET_TEX3D_901", "ASSET_TEX3D_902", "ASSET_TEX3D_903", "ASSET_TEX3D_904", "ASSET_TEX3D_905", "ASSET_TEX3D_906", "ASSET_TEX3D_907", "ASSET_TEX3D_908", "ASSET_TEX3D_909", "ASSET_TEX3D_910", "ASSET_TEX3D_911", "ASSET_TEX3D_912", "ASSET_TEX3D_913", "ASSET_TEX3D_914", "ASSET_TEX3D_915", "ASSET_TEX3D_916", "ASSET_TEX3D_917", "ASSET_TEX3D_918", "ASSET_TEX3D_919", "ASSET_TEX3D_920", "ASSET_TEX3D_921", "ASSET_TEX3D_922", "ASSET_TEX3D_923", "ASSET_TEX3D_924", "ASSET_TEX3D_925", "ASSET_TEX3D_926", "ASSET_TEX3D_927", "ASSET_TEX3D_928", "ASSET_TEX3D_929", "ASSET_TEX3D_930", "ASSET_TEX3D_931", "ASSET_TEX3D_932", "ASSET_TEX3D_933", "ASSET_TEX3D_934", "ASSET_TEX3D_935", "ASSET_TEX3D_936", "ASSET_TEX3D_937", "ASSET_TEX3D_938", "ASSET_TEX3D_939", "ASSET_TEX3D_940", "ASSET_TEX3D_941", "ASSET_TEX3D_942", "ASSET_TEX3D_943", "ASSET_TEX3D_944", "ASSET_TEX3D_945", "ASSET_TEX3D_946", "ASSET_TEX3D_947", "ASSET_TEX3D_948", "ASSET_TEX3D_949", "ASSET_TEX3D_950", "ASSET_TEX3D_951", "ASSET_TEX3D_952", "ASSET_TEX3D_953", "ASSET_TEX3D_954", "ASSET_TEX3D_955", "ASSET_TEX3D_956", "ASSET_TEX3D_957", "ASSET_TEX3D_958", "ASSET_TEX3D_959", "ASSET_TEX3D_960", "ASSET_TEX3D_961", "ASSET_TEX3D_962", "ASSET_TEX3D_963", "ASSET_TEX3D_964", "ASSET_TEX3D_965", "ASSET_TEX3D_966", "ASSET_TEX3D_967", "ASSET_TEX3D_968", "ASSET_TEX3D_969", "ASSET_TEX3D_970", "ASSET_TEX3D_971", "ASSET_TEX3D_972", "ASSET_TEX3D_973", "ASSET_TEX3D_974", "ASSET_TEX3D_975", "ASSET_TEX3D_976", "ASSET_TEX3D_977", "ASSET_TEX3D_978", "ASSET_TEX3D_979", "ASSET_TEX3D_980", "ASSET_TEX3D_981", "ASSET_TEX3D_982", "ASSET_TEX3D_983", "ASSET_TEX3D_984", "ASSET_TEX3D_985", "ASSET_TEX3D_986", "ASSET_TEX3D_987", "ASSET_TEX3D_988", "ASSET_TEX3D_989", "ASSET_TEX3D_990", "ASSET_TEX3D_991", "ASSET_TEX3D_992", "ASSET_TEX3D_993", "ASSET_TEX3D_994", "ASSET_TEX3D_995", "ASSET_TEX3D_996", "ASSET_TEX3D_997", "ASSET_TEX3D_998", "ASSET_TEX3D_999", "ASSET_TEX3D_1000", "ASSET_TEX3D_1001", "ASSET_TEX3D_1002", "ASSET_TEX3D_1003", "ASSET_TEX3D_1004", "ASSET_TEX3D_1005", "ASSET_TEX3D_1006", "ASSET_TEX3D_1007", "ASSET_TEX3D_1008", "ASSET_TEX3D_1009", "ASSET_TEX3D_1010", "ASSET_TEX3D_1011", "ASSET_TEX3D_1012", "ASSET_TEX3D_1013", "ASSET_TEX3D_1014", "ASSET_TEX3D_1015", "ASSET_TEX3D_1016", "ASSET_TEX3D_1017", "ASSET_TEX3D_1018", "ASSET_TEX3D_1019", "ASSET_TEX3D_1020", "ASSET_TEX3D_1021", "ASSET_TEX3D_1022", "ASSET_TEX3D_1023", "ASSET_TEX3D_1024", "ASSET_TEX3D_1025", "ASSET_TEX3D_1026", "ASSET_TEX3D_1027", "ASSET_TEX3D_1028", "ASSET_TEX3D_1029", "ASSET_TEX3D_1030", "ASSET_TEX3D_1031", "ASSET_TEX3D_1032", "ASSET_TEX3D_1033", "ASSET_TEX3D_1034", "ASSET_TEX3D_1035", "ASSET_TEX3D_1036", "ASSET_TEX3D_1037", "ASSET_TEX3D_1038", "ASSET_TEX3D_1039", "ASSET_TEX3D_1040", "ASSET_TEX3D_1041", "ASSET_TEX3D_1042", "ASSET_TEX3D_1043", "ASSET_TEX3D_1044", "ASSET_TEX3D_1045", "ASSET_TEX3D_1046", "ASSET_TEX3D_1047", "ASSET_TEX3D_1048", "ASSET_TEX3D_1049", "ASSET_TEX3D_1050", "ASSET_TEX3D_1051", "ASSET_TEX3D_1052", "ASSET_TEX3D_1053", "ASSET_TEX3D_1054", "ASSET_TEX3D_1055", "ASSET_TEX3D_1056", "ASSET_TEX3D_1057", "ASSET_TEX3D_1058", "ASSET_TEX3D_1059", "ASSET_TEX3D_1060", "ASSET_TEX3D_1061", "ASSET_TEX3D_1062", "ASSET_TEX3D_1063", "ASSET_TEX3D_1064", "ASSET_TEX3D_1065", "ASSET_TEX3D_1066", "ASSET_TEX3D_1067", "ASSET_TEX3D_1068", "ASSET_TEX3D_1069", "ASSET_TEX3D_1070", "ASSET_TEX3D_1071", "ASSET_TEX3D_1072", "ASSET_TEX3D_1073", "ASSET_TEX3D_1074", "ASSET_TEX3D_1075", "ASSET_TEX3D_1076", "ASSET_TEX3D_1077", "ASSET_TEX3D_1078", "ASSET_TEX3D_1079", "ASSET_TEX3D_1080", "ASSET_TEX3D_1081", "ASSET_TEX3D_1082", "ASSET_TEX3D_1083", "ASSET_TEX3D_1084", "ASSET_TEX3D_1085", "ASSET_TEX3D_1086", "ASSET_TEX3D_1087", "ASSET_TEX3D_1088", "ASSET_TEX3D_1089", "ASSET_TEX3D_1090", "ASSET_TEX3D_1091", "ASSET_TEX3D_1092", "ASSET_TEX3D_1093", "ASSET_TEX3D_1094", "ASSET_TEX3D_1095", "ASSET_TEX3D_1096", "ASSET_TEX3D_1097", "ASSET_TEX3D_1098", "ASSET_TEX3D_1099", "ASSET_TEX3D_1100", "ASSET_TEX3D_1101", "ASSET_TEX3D_1102", "ASSET_TEX3D_1103", "ASSET_TEX3D_1104", "ASSET_TEX3D_1105", "ASSET_TEX3D_1106", "ASSET_TEX3D_1107", "ASSET_TEX3D_1108", "ASSET_TEX3D_1109", "ASSET_TEX3D_1110", "ASSET_TEX3D_1111", "ASSET_TEX3D_1112", "ASSET_TEX3D_1113", "ASSET_TEX3D_1114", "ASSET_TEX3D_1115", "ASSET_TEX3D_1116", "ASSET_TEX3D_1117", "ASSET_TEX3D_1118", "ASSET_TEX3D_1119", "ASSET_TEX3D_1120", "ASSET_TEX3D_1121", "ASSET_TEX3D_1122", "ASSET_TEX3D_1123", "ASSET_TEX3D_1124", "ASSET_TEX3D_1125", "ASSET_TEX3D_1126", "ASSET_TEX3D_1127", "ASSET_TEX3D_1128", "ASSET_TEX3D_1129", "ASSET_TEX3D_1130", "ASSET_TEX3D_1131", "ASSET_TEX3D_1132", "ASSET_TEX3D_1133", "ASSET_TEX3D_1134", "ASSET_TEX3D_1135", "ASSET_TEX3D_1136", "ASSET_TEX3D_1137", "ASSET_TEX3D_1138", "ASSET_TEX3D_1139", "ASSET_TEX3D_1140", "ASSET_TEX3D_1141", "ASSET_TEX3D_1142", "ASSET_TEX3D_1143", "ASSET_TEX3D_1144", "ASSET_TEX3D_1145", "ASSET_TEX3D_1146", "ASSET_TEX3D_1147", "ASSET_TEX3D_1148", "ASSET_TEX3D_1149", "ASSET_TEX3D_1150", "ASSET_TEX3D_1151", "ASSET_TEX3D_1152", "ASSET_TEX3D_1153", "ASSET_TEX3D_1154", "ASSET_TEX3D_1155", "ASSET_TEX3D_1156", "ASSET_TEX3D_1157", "ASSET_TEX3D_1158", "ASSET_TEX3D_1159", "ASSET_TEX3D_1160", "ASSET_TEX3D_1161", "ASSET_TEX3D_1162", "ASSET_TEX3D_1163", "ASSET_TEX3D_1164", "ASSET_TEX3D_1165", "ASSET_TEX3D_1166", "ASSET_TEX3D_1167", "ASSET_TEX3D_1168", "ASSET_TEX3D_1169", "ASSET_TEX3D_1170", "ASSET_TEX3D_1171", "ASSET_TEX3D_1172", "ASSET_TEX3D_1173", "ASSET_TEX3D_1174", "ASSET_TEX3D_1175", "ASSET_TEX3D_1176", "ASSET_TEX3D_1177", "ASSET_TEX3D_1178", "ASSET_TEX3D_1179", "ASSET_TEX3D_1180", "ASSET_TEX3D_1181", "ASSET_TEX3D_1182", "ASSET_TEX3D_1183", "ASSET_TEX3D_1184", "ASSET_TEX3D_1185", "ASSET_TEX3D_1186", "ASSET_TEX3D_1187", "ASSET_TEX3D_1188", "ASSET_TEX3D_1189", "ASSET_TEX3D_1190", "ASSET_TEX3D_1191", "ASSET_TEX3D_1192", "ASSET_TEX3D_1193", "ASSET_TEX3D_1194", "ASSET_TEX3D_1195", "ASSET_TEX3D_1196", "ASSET_TEX3D_1197", "ASSET_TEX3D_1198", "ASSET_TEX3D_1199", "ASSET_TEX3D_1200", "ASSET_TEX3D_1201", "ASSET_TEX3D_1202", "ASSET_TEX3D_1203", "ASSET_TEX3D_1204", "ASSET_TEX3D_1205", "ASSET_TEX3D_1206", "ASSET_TEX3D_1207", "ASSET_TEX3D_1208", "ASSET_TEX3D_1209", "ASSET_TEX3D_1210", "ASSET_TEX3D_1211", "ASSET_TEX3D_1212", "ASSET_TEX3D_1213", "ASSET_TEX3D_1214", "ASSET_TEX3D_1215", "ASSET_TEX3D_1216", "ASSET_TEX3D_1217", "ASSET_TEX3D_1218", "ASSET_TEX3D_1219", "ASSET_TEX3D_1220", "ASSET_TEX3D_1221", "ASSET_TEX3D_1222", "ASSET_TEX3D_1223", "ASSET_TEX3D_1224", "ASSET_TEX3D_1225", "ASSET_TEX3D_1226", "ASSET_TEX3D_1227", "ASSET_TEX3D_1228", "ASSET_TEX3D_1229", "ASSET_TEX3D_1230", "ASSET_TEX3D_1231", "ASSET_TEX3D_1232", "ASSET_TEX3D_1233", "ASSET_TEX3D_1234", "ASSET_TEX3D_1235", "ASSET_TEX3D_1236", "ASSET_TEX3D_1237", "ASSET_TEX3D_1238", "ASSET_TEX3D_1239", "ASSET_TEX3D_1240", "ASSET_TEX3D_1241", "ASSET_TEX3D_1242", "ASSET_TEX3D_1243", "ASSET_TEX3D_1244", "ASSET_TEX3D_1245", "ASSET_TEX3D_1246", "ASSET_TEX3D_1247", "ASSET_TEX3D_1248", "ASSET_TEX3D_1249", "ASSET_TEX3D_1250", "ASSET_TEX3D_1251", "ASSET_TEX3D_1252", "ASSET_TEX3D_1253", "ASSET_TEX3D_1254", "ASSET_TEX3D_1255", "ASSET_TEX3D_1256", "ASSET_TEX3D_1257", "ASSET_TEX3D_1258", "ASSET_TEX3D_1259", "ASSET_TEX3D_1260", "ASSET_TEX3D_1261", "ASSET_TEX3D_1262", "ASSET_TEX3D_1263", "ASSET_TEX3D_1264", "ASSET_TEX3D_1265", "ASSET_TEX3D_1266", "ASSET_TEX3D_1267", "ASSET_TEX3D_1268", "ASSET_TEX3D_1269", "ASSET_TEX3D_1270", "ASSET_TEX3D_1271", "ASSET_TEX3D_1272", "ASSET_TEX3D_1273", "ASSET_TEX3D_1274", "ASSET_TEX3D_1275", "ASSET_TEX3D_1276", "ASSET_TEX3D_1277", "ASSET_TEX3D_1278", "ASSET_TEX3D_1279", "ASSET_TEX3D_1280", "ASSET_TEX3D_1281", "ASSET_TEX3D_1282", "ASSET_TEX3D_1283", "ASSET_TEX3D_1284", "ASSET_TEX3D_1285", "ASSET_TEX3D_1286", "ASSET_TEX3D_1287", "ASSET_TEX3D_1288", "ASSET_TEX3D_1289", "ASSET_TEX3D_1290", "ASSET_TEX3D_1291", "ASSET_TEX3D_1292", "ASSET_TEX3D_1293", "ASSET_TEX3D_1294", "ASSET_TEX3D_1295", "ASSET_TEX3D_1296", "ASSET_TEX3D_1297", "ASSET_TEX3D_1298", "ASSET_TEX3D_1299", "ASSET_TEX3D_1300", "ASSET_TEX3D_1301", "ASSET_TEX3D_1302", "ASSET_TEX3D_1303", "ASSET_TEX3D_1304", "ASSET_TEX3D_1305", "ASSET_TEX3D_1306", "ASSET_TEX3D_1307", "ASSET_TEX3D_1308", "ASSET_TEX3D_1309", "ASSET_TEX3D_1310", "ASSET_TEX3D_1311", "ASSET_TEX3D_1312", "ASSET_TEX3D_1313", "ASSET_TEX3D_1314", "ASSET_TEX3D_1315", "ASSET_TEX3D_1316", "ASSET_TEX3D_1317", "ASSET_TEX3D_1318", "ASSET_TEX3D_1319", "ASSET_TEX3D_1320", "ASSET_TEX3D_1321", "ASSET_TEX3D_1322", "ASSET_TEX3D_1323", "ASSET_TEX3D_1324", "ASSET_TEX3D_1325", "ASSET_TEX3D_1326", "ASSET_TEX3D_1327", "ASSET_TEX3D_1328", "ASSET_TEX3D_1329", "ASSET_TEX3D_1330", "ASSET_TEX3D_1331", "ASSET_TEX3D_1332", "ASSET_TEX3D_1333", "ASSET_TEX3D_1334", "ASSET_TEX3D_1335", "ASSET_TEX3D_1336", "ASSET_TEX3D_1337", "ASSET_TEX3D_1338", "ASSET_TEX3D_1339", "ASSET_TEX3D_1340", "ASSET_TEX3D_1341", "ASSET_TEX3D_1342", "ASSET_TEX3D_1343", "ASSET_TEX3D_1344", "ASSET_TEX3D_1345", "ASSET_TEX3D_1346", "ASSET_TEX3D_1347", "ASSET_TEX3D_1348", "ASSET_TEX3D_1349", "ASSET_TEX3D_1350", "ASSET_TEX3D_1351", "ASSET_TEX3D_1352", "ASSET_TEX3D_1353", "ASSET_TEX3D_1354", "ASSET_TEX3D_1355", "ASSET_TEX3D_1356", "ASSET_TEX3D_1357", "ASSET_TEX3D_1358", "ASSET_TEX3D_1359", "ASSET_TEX3D_1360", "ASSET_TEX3D_1361", "ASSET_TEX3D_1362", "ASSET_TEX3D_1363", "ASSET_TEX3D_1364", "ASSET_TEX3D_1365", "ASSET_TEX3D_1366", "ASSET_TEX3D_1367", "ASSET_TEX3D_1368", "ASSET_TEX3D_1369", "ASSET_TEX3D_1370", "ASSET_TEX3D_1371", "ASSET_TEX3D_1372", "ASSET_TEX3D_1373", "ASSET_TEX3D_1374", "ASSET_TEX3D_1375", "ASSET_TEX3D_1376", "ASSET_TEX3D_1377", "ASSET_TEX3D_1378", "ASSET_TEX3D_1379", "ASSET_TEX3D_1380", "ASSET_TEX3D_1381", "ASSET_TEX3D_1382", "ASSET_TEX3D_1383", "ASSET_TEX3D_1384", "ASSET_TEX3D_1385", "ASSET_TEX3D_1386", "ASSET_TEX3D_1387", "ASSET_TEX3D_1388", "ASSET_TEX3D_1389", "ASSET_TEX3D_1390", "ASSET_TEX3D_1391", "ASSET_TEX3D_1392", "ASSET_TEX3D_1393", "ASSET_TEX3D_1394", "ASSET_TEX3D_1395", "ASSET_TEX3D_1396", "ASSET_TEX3D_1397", "ASSET_TEX3D_1398", "ASSET_TEX3D_1399", "ASSET_TEX3D_1400"], + "filenames": ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""] + }, + { + "build-id": "ASSET_TEXTURES_3D_TABLE", + "type": "Table", + "for": "ASSET_TEXTURES_3D" + }, + { + "build-id": "ASSET_TEXTURES_2D", + "type": "Textures", + "folder": "textures/2d", + "table": 5, + "flip-textures": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "child-build-ids": ["ASSET_TEX2D_SMALLFONT_0", "ASSET_TEX2D_SMALLFONT_1", "ASSET_TEX2D_SMALLFONT_2", "ASSET_TEX2D_3", "ASSET_TEX2D_4", "ASSET_TEX2D_5", "ASSET_TEX2D_6", "ASSET_TEX2D_7", "ASSET_TEX2D_8", "ASSET_TEX2D_9", "ASSET_TEX2D_10", "ASSET_TEX2D_11", "ASSET_TEX2D_12", "ASSET_TEX2D_13", "ASSET_TEX2D_14", "ASSET_TEX2D_15", "ASSET_TEX2D_16", "ASSET_TEX2D_17", "ASSET_TEX2D_18", "ASSET_TEX2D_19", "ASSET_TEX2D_20", "ASSET_TEX2D_21", "ASSET_TEX2D_22", "ASSET_TEX2D_23", "ASSET_TEX2D_24", "ASSET_TEX2D_25", "ASSET_TEX2D_26", "ASSET_TEX2D_27", "ASSET_TEX2D_28", "ASSET_TEX2D_29", "ASSET_TEX2D_30", "ASSET_TEX2D_31", "ASSET_TEX2D_32", "ASSET_TEX2D_33", "ASSET_TEX2D_34", "ASSET_TEX2D_35", "ASSET_TEX2D_36", "ASSET_TEX2D_37", "ASSET_TEX2D_38", "ASSET_TEX2D_39", "ASSET_TEX2D_40", "ASSET_TEX2D_41", "ASSET_TEX2D_42", "ASSET_TEX2D_43", "ASSET_TEX2D_44", "ASSET_TEX2D_45", "ASSET_TEX2D_46", "ASSET_TEX2D_47", "ASSET_TEX2D_48", "ASSET_TEX2D_49", "ASSET_TEX2D_50", "ASSET_TEX2D_51", "ASSET_TEX2D_52", "ASSET_TEX2D_53", "ASSET_TEX2D_54", "ASSET_TEX2D_55", "ASSET_TEX2D_56", "ASSET_TEX2D_57", "ASSET_TEX2D_58", "ASSET_TEX2D_59", "ASSET_TEX2D_60", "ASSET_TEX2D_61", "ASSET_TEX2D_62", "ASSET_TEX2D_63", "ASSET_TEX2D_64", "ASSET_TEX2D_65", "ASSET_TEX2D_66", "ASSET_TEX2D_67", "ASSET_TEX2D_68", "ASSET_TEX2D_69", "ASSET_TEX2D_70", "ASSET_TEX2D_71", "ASSET_TEX2D_72", "ASSET_TEX2D_73", "ASSET_TEX2D_74", "ASSET_TEX2D_75", "ASSET_TEX2D_76", "ASSET_TEX2D_77", "ASSET_TEX2D_78", "ASSET_TEX2D_79", "ASSET_TEX2D_80", "ASSET_TEX2D_81", "ASSET_TEX2D_82", "ASSET_TEX2D_83", "ASSET_TEX2D_84", "ASSET_TEX2D_85", "ASSET_TEX2D_86", "ASSET_TEX2D_87", "ASSET_TEX2D_88", "ASSET_TEX2D_FUNFONT_0", "ASSET_TEX2D_FUNFONT_1", "ASSET_TEX2D_FUNFONT_2", "ASSET_TEX2D_FUNFONT_3", "ASSET_TEX2D_FUNFONT_4", "ASSET_TEX2D_FUNFONT_5", "ASSET_TEX2D_95", "ASSET_TEX2D_96", "ASSET_TEX2D_97", "ASSET_TEX2D_98", "ASSET_TEX2D_99", "ASSET_TEX2D_100", "ASSET_TEX2D_101", "ASSET_TEX2D_102", "ASSET_TEX2D_103", "ASSET_TEX2D_104", "ASSET_TEX2D_105", "ASSET_TEX2D_106", "ASSET_TEX2D_107", "ASSET_TEX2D_108", "ASSET_TEX2D_109", "ASSET_TEX2D_110", "ASSET_TEX2D_111", "ASSET_TEX2D_112", "ASSET_TEX2D_113", "ASSET_TEX2D_114", "ASSET_TEX2D_115", "ASSET_TEX2D_116", "ASSET_TEX2D_117", "ASSET_TEX2D_118", "ASSET_TEX2D_119", "ASSET_TEX2D_120", "ASSET_TEX2D_121", "ASSET_TEX2D_122", "ASSET_TEX2D_123", "ASSET_TEX2D_124", "ASSET_TEX2D_125", "ASSET_TEX2D_126", "ASSET_TEX2D_127", "ASSET_TEX2D_128", "ASSET_TEX2D_129", "ASSET_TEX2D_130", "ASSET_TEX2D_131", "ASSET_TEX2D_132", "ASSET_TEX2D_133", "ASSET_TEX2D_134", "ASSET_TEX2D_135", "ASSET_TEX2D_136", "ASSET_TEX2D_137", "ASSET_TEX2D_138", "ASSET_TEX2D_139", "ASSET_TEX2D_140", "ASSET_TEX2D_141", "ASSET_TEX2D_142", "ASSET_TEX2D_143", "ASSET_TEX2D_144", "ASSET_TEX2D_145", "ASSET_TEX2D_146", "ASSET_TEX2D_147", "ASSET_TEX2D_148", "ASSET_TEX2D_149", "ASSET_TEX2D_150", "ASSET_TEX2D_151", "ASSET_TEX2D_152", "ASSET_TEX2D_153", "ASSET_TEX2D_154", "ASSET_TEX2D_155", "ASSET_TEX2D_156", "ASSET_TEX2D_157", "ASSET_TEX2D_158", "ASSET_TEX2D_SUBTITLEFONT_0", "ASSET_TEX2D_SUBTITLEFONT_1", "ASSET_TEX2D_SUBTITLEFONT_2", "ASSET_TEX2D_BIGFONT_A", "ASSET_TEX2D_BIGFONT_B", "ASSET_TEX2D_BIGFONT_C", "ASSET_TEX2D_BIGFONT_D", "ASSET_TEX2D_BIGFONT_E", "ASSET_TEX2D_BIGFONT_F", "ASSET_TEX2D_BIGFONT_G", "ASSET_TEX2D_BIGFONT_H", "ASSET_TEX2D_BIGFONT_I", "ASSET_TEX2D_BIGFONT_J", "ASSET_TEX2D_BIGFONT_K", "ASSET_TEX2D_BIGFONT_L", "ASSET_TEX2D_BIGFONT_M", "ASSET_TEX2D_BIGFONT_N", "ASSET_TEX2D_BIGFONT_O", "ASSET_TEX2D_BIGFONT_P", "ASSET_TEX2D_BIGFONT_Q", "ASSET_TEX2D_BIGFONT_R", "ASSET_TEX2D_BIGFONT_S", "ASSET_TEX2D_BIGFONT_T", "ASSET_TEX2D_BIGFONT_U", "ASSET_TEX2D_BIGFONT_V", "ASSET_TEX2D_BIGFONT_W", "ASSET_TEX2D_BIGFONT_X", "ASSET_TEX2D_BIGFONT_Y", "ASSET_TEX2D_BIGFONT_Z", "ASSET_TEX2D_BIGFONT_QUESTIONMARK", "ASSET_TEX2D_BIGFONT_PERIOD", "ASSET_TEX2D_190", "ASSET_TEX2D_191", "ASSET_TEX2D_192", "ASSET_TEX2D_193", "ASSET_TEX2D_194", "ASSET_TEX2D_195", "ASSET_TEX2D_196", "ASSET_TEX2D_197", "ASSET_TEX2D_198", "ASSET_TEX2D_199", "ASSET_TEX2D_200", "ASSET_TEX2D_201", "ASSET_TEX2D_202", "ASSET_TEX2D_203", "ASSET_TEX2D_204", "ASSET_TEX2D_205", "ASSET_TEX2D_206", "ASSET_TEX2D_207", "ASSET_TEX2D_208", "ASSET_TEX2D_209", "ASSET_TEX2D_210", "ASSET_TEX2D_211", "ASSET_TEX2D_212", "ASSET_TEX2D_213", "ASSET_TEX2D_214", "ASSET_TEX2D_215", "ASSET_TEX2D_216", "ASSET_TEX2D_217", "ASSET_TEX2D_218", "ASSET_TEX2D_219", "ASSET_TEX2D_220", "ASSET_TEX2D_221", "ASSET_TEX2D_222", "ASSET_TEX2D_223", "ASSET_TEX2D_224", "ASSET_TEX2D_225", "ASSET_TEX2D_226", "ASSET_TEX2D_227", "ASSET_TEX2D_228", "ASSET_TEX2D_229", "ASSET_TEX2D_230", "ASSET_TEX2D_231", "ASSET_TEX2D_232", "ASSET_TEX2D_233", "ASSET_TEX2D_234", "ASSET_TEX2D_235", "ASSET_TEX2D_236", "ASSET_TEX2D_237", "ASSET_TEX2D_238", "ASSET_TEX2D_239", "ASSET_TEX2D_240", "ASSET_TEX2D_241", "ASSET_TEX2D_242", "ASSET_TEX2D_243", "ASSET_TEX2D_244", "ASSET_TEX2D_245", "ASSET_TEX2D_246", "ASSET_TEX2D_247", "ASSET_TEX2D_248", "ASSET_TEX2D_249", "ASSET_TEX2D_250", "ASSET_TEX2D_251", "ASSET_TEX2D_252", "ASSET_TEX2D_253", "ASSET_TEX2D_254", "ASSET_TEX2D_255", "ASSET_TEX2D_256", "ASSET_TEX2D_257", "ASSET_TEX2D_258", "ASSET_TEX2D_259", "ASSET_TEX2D_260", "ASSET_TEX2D_261", "ASSET_TEX2D_262", "ASSET_TEX2D_263", "ASSET_TEX2D_264", "ASSET_TEX2D_265", "ASSET_TEX2D_266", "ASSET_TEX2D_267", "ASSET_TEX2D_268", "ASSET_TEX2D_269", "ASSET_TEX2D_270", "ASSET_TEX2D_271", "ASSET_TEX2D_272", "ASSET_TEX2D_273", "ASSET_TEX2D_274", "ASSET_TEX2D_275", "ASSET_TEX2D_276", "ASSET_TEX2D_277", "ASSET_TEX2D_278", "ASSET_TEX2D_279", "ASSET_TEX2D_280", "ASSET_TEX2D_281", "ASSET_TEX2D_282", "ASSET_TEX2D_283", "ASSET_TEX2D_284", "ASSET_TEX2D_285", "ASSET_TEX2D_286", "ASSET_TEX2D_287", "ASSET_TEX2D_288", "ASSET_TEX2D_289", "ASSET_TEX2D_290", "ASSET_TEX2D_291", "ASSET_TEX2D_292", "ASSET_TEX2D_293", "ASSET_TEX2D_294", "ASSET_TEX2D_295", "ASSET_TEX2D_296", "ASSET_TEX2D_297", "ASSET_TEX2D_298", "ASSET_TEX2D_299", "ASSET_TEX2D_300", "ASSET_TEX2D_301", "ASSET_TEX2D_302", "ASSET_TEX2D_303", "ASSET_TEX2D_304", "ASSET_TEX2D_305", "ASSET_TEX2D_306", "ASSET_TEX2D_307", "ASSET_TEX2D_308", "ASSET_TEX2D_309", "ASSET_TEX2D_310", "ASSET_TEX2D_311", "ASSET_TEX2D_312", "ASSET_TEX2D_313", "ASSET_TEX2D_314", "ASSET_TEX2D_315", "ASSET_TEX2D_316", "ASSET_TEX2D_317", "ASSET_TEX2D_318", "ASSET_TEX2D_319", "ASSET_TEX2D_320", "ASSET_TEX2D_321", "ASSET_TEX2D_322", "ASSET_TEX2D_323", "ASSET_TEX2D_324", "ASSET_TEX2D_325", "ASSET_TEX2D_326", "ASSET_TEX2D_327", "ASSET_TEX2D_328", "ASSET_TEX2D_329", "ASSET_TEX2D_330", "ASSET_TEX2D_331", "ASSET_TEX2D_332", "ASSET_TEX2D_333", "ASSET_TEX2D_334", "ASSET_TEX2D_335", "ASSET_TEX2D_336", "ASSET_TEX2D_337", "ASSET_TEX2D_338", "ASSET_TEX2D_339", "ASSET_TEX2D_340", "ASSET_TEX2D_341", "ASSET_TEX2D_342", "ASSET_TEX2D_343", "ASSET_TEX2D_344", "ASSET_TEX2D_345", "ASSET_TEX2D_346", "ASSET_TEX2D_347", "ASSET_TEX2D_348", "ASSET_TEX2D_349", "ASSET_TEX2D_350", "ASSET_TEX2D_351", "ASSET_TEX2D_352", "ASSET_TEX2D_353", "ASSET_TEX2D_354", "ASSET_TEX2D_355", "ASSET_TEX2D_356", "ASSET_TEX2D_357", "ASSET_TEX2D_358", "ASSET_TEX2D_359", "ASSET_TEX2D_360", "ASSET_TEX2D_361", "ASSET_TEX2D_362", "ASSET_TEX2D_363", "ASSET_TEX2D_364", "ASSET_TEX2D_365", "ASSET_TEX2D_366", "ASSET_TEX2D_367", "ASSET_TEX2D_368", "ASSET_TEX2D_369", "ASSET_TEX2D_370", "ASSET_TEX2D_371", "ASSET_TEX2D_372", "ASSET_TEX2D_373", "ASSET_TEX2D_374", "ASSET_TEX2D_375", "ASSET_TEX2D_376", "ASSET_TEX2D_377", "ASSET_TEX2D_378", "ASSET_TEX2D_379", "ASSET_TEX2D_380", "ASSET_TEX2D_381", "ASSET_TEX2D_382", "ASSET_TEX2D_383", "ASSET_TEX2D_384", "ASSET_TEX2D_385", "ASSET_TEX2D_386", "ASSET_TEX2D_387", "ASSET_TEX2D_388", "ASSET_TEX2D_389", "ASSET_TEX2D_390", "ASSET_TEX2D_391", "ASSET_TEX2D_392", "ASSET_TEX2D_393", "ASSET_TEX2D_394", "ASSET_TEX2D_395", "ASSET_TEX2D_396", "ASSET_TEX2D_397", "ASSET_TEX2D_398", "ASSET_TEX2D_399", "ASSET_TEX2D_400", "ASSET_TEX2D_401", "ASSET_TEX2D_402", "ASSET_TEX2D_403", "ASSET_TEX2D_404", "ASSET_TEX2D_405", "ASSET_TEX2D_406", "ASSET_TEX2D_407", "ASSET_TEX2D_408", "ASSET_TEX2D_409", "ASSET_TEX2D_410", "ASSET_TEX2D_411", "ASSET_TEX2D_412", "ASSET_TEX2D_413", "ASSET_TEX2D_414", "ASSET_TEX2D_415", "ASSET_TEX2D_416", "ASSET_TEX2D_417", "ASSET_TEX2D_418", "ASSET_TEX2D_419", "ASSET_TEX2D_420", "ASSET_TEX2D_421", "ASSET_TEX2D_422", "ASSET_TEX2D_423", "ASSET_TEX2D_424", "ASSET_TEX2D_425", "ASSET_TEX2D_426", "ASSET_TEX2D_427", "ASSET_TEX2D_428", "ASSET_TEX2D_429", "ASSET_TEX2D_430", "ASSET_TEX2D_431", "ASSET_TEX2D_432", "ASSET_TEX2D_433", "ASSET_TEX2D_434", "ASSET_TEX2D_435", "ASSET_TEX2D_436", "ASSET_TEX2D_437", "ASSET_TEX2D_438", "ASSET_TEX2D_439", "ASSET_TEX2D_440", "ASSET_TEX2D_441", "ASSET_TEX2D_442", "ASSET_TEX2D_443", "ASSET_TEX2D_444", "ASSET_TEX2D_445", "ASSET_TEX2D_446", "ASSET_TEX2D_447", "ASSET_TEX2D_448", "ASSET_TEX2D_449", "ASSET_TEX2D_450", "ASSET_TEX2D_451", "ASSET_TEX2D_452", "ASSET_TEX2D_453", "ASSET_TEX2D_454", "ASSET_TEX2D_455", "ASSET_TEX2D_456", "ASSET_TEX2D_457", "ASSET_TEX2D_458", "ASSET_TEX2D_459", "ASSET_TEX2D_460", "ASSET_TEX2D_461", "ASSET_TEX2D_462", "ASSET_TEX2D_463", "ASSET_TEX2D_464", "ASSET_TEX2D_465", "ASSET_TEX2D_466", "ASSET_TEX2D_467", "ASSET_TEX2D_468", "ASSET_TEX2D_469", "ASSET_TEX2D_470", "ASSET_TEX2D_471", "ASSET_TEX2D_472", "ASSET_TEX2D_473", "ASSET_TEX2D_474", "ASSET_TEX2D_475", "ASSET_TEX2D_476", "ASSET_TEX2D_477", "ASSET_TEX2D_478", "ASSET_TEX2D_479", "ASSET_TEX2D_480", "ASSET_TEX2D_481", "ASSET_TEX2D_482", "ASSET_TEX2D_483", "ASSET_TEX2D_484", "ASSET_TEX2D_485", "ASSET_TEX2D_486", "ASSET_TEX2D_487", "ASSET_TEX2D_488", "ASSET_TEX2D_489", "ASSET_TEX2D_490", "ASSET_TEX2D_491", "ASSET_TEX2D_492", "ASSET_TEX2D_493", "ASSET_TEX2D_494", "ASSET_TEX2D_495", "ASSET_TEX2D_496", "ASSET_TEX2D_497", "ASSET_TEX2D_498", "ASSET_TEX2D_499", "ASSET_TEX2D_500", "ASSET_TEX2D_501", "ASSET_TEX2D_502", "ASSET_TEX2D_503", "ASSET_TEX2D_504", "ASSET_TEX2D_505", "ASSET_TEX2D_506", "ASSET_TEX2D_507", "ASSET_TEX2D_508", "ASSET_TEX2D_509", "ASSET_TEX2D_510", "ASSET_TEX2D_511", "ASSET_TEX2D_512", "ASSET_TEX2D_513", "ASSET_TEX2D_514", "ASSET_TEX2D_515", "ASSET_TEX2D_516", "ASSET_TEX2D_517", "ASSET_TEX2D_518", "ASSET_TEX2D_519", "ASSET_TEX2D_520", "ASSET_TEX2D_521", "ASSET_TEX2D_522", "ASSET_TEX2D_523", "ASSET_TEX2D_524", "ASSET_TEX2D_525", "ASSET_TEX2D_526", "ASSET_TEX2D_527", "ASSET_TEX2D_528", "ASSET_TEX2D_529", "ASSET_TEX2D_530", "ASSET_TEX2D_531", "ASSET_TEX2D_532", "ASSET_TEX2D_533", "ASSET_TEX2D_534", "ASSET_TEX2D_535", "ASSET_TEX2D_536", "ASSET_TEX2D_537", "ASSET_TEX2D_538", "ASSET_TEX2D_539", "ASSET_TEX2D_540", "ASSET_TEX2D_541", "ASSET_TEX2D_542", "ASSET_TEX2D_543", "ASSET_TEX2D_544", "ASSET_TEX2D_545", "ASSET_TEX2D_546", "ASSET_TEX2D_547", "ASSET_TEX2D_548", "ASSET_TEX2D_549", "ASSET_TEX2D_550", "ASSET_TEX2D_551", "ASSET_TEX2D_552", "ASSET_TEX2D_553", "ASSET_TEX2D_554", "ASSET_TEX2D_555", "ASSET_TEX2D_556", "ASSET_TEX2D_557", "ASSET_TEX2D_558", "ASSET_TEX2D_559", "ASSET_TEX2D_560", "ASSET_TEX2D_561", "ASSET_TEX2D_562", "ASSET_TEX2D_563", "ASSET_TEX2D_564", "ASSET_TEX2D_565", "ASSET_TEX2D_566", "ASSET_TEX2D_567", "ASSET_TEX2D_568", "ASSET_TEX2D_569", "ASSET_TEX2D_570", "ASSET_TEX2D_571", "ASSET_TEX2D_572", "ASSET_TEX2D_573", "ASSET_TEX2D_574", "ASSET_TEX2D_575", "ASSET_TEX2D_576", "ASSET_TEX2D_577", "ASSET_TEX2D_578", "ASSET_TEX2D_579", "ASSET_TEX2D_580", "ASSET_TEX2D_581", "ASSET_TEX2D_582", "ASSET_TEX2D_583", "ASSET_TEX2D_584", "ASSET_TEX2D_585", "ASSET_TEX2D_586", "ASSET_TEX2D_587", "ASSET_TEX2D_588", "ASSET_TEX2D_589", "ASSET_TEX2D_590", "ASSET_TEX2D_591", "ASSET_TEX2D_592", "ASSET_TEX2D_593", "ASSET_TEX2D_594", "ASSET_TEX2D_595", "ASSET_TEX2D_596", "ASSET_TEX2D_597", "ASSET_TEX2D_598", "ASSET_TEX2D_599", "ASSET_TEX2D_600", "ASSET_TEX2D_601", "ASSET_TEX2D_602", "ASSET_TEX2D_603", "ASSET_TEX2D_604", "ASSET_TEX2D_605", "ASSET_TEX2D_606", "ASSET_TEX2D_607", "ASSET_TEX2D_608", "ASSET_TEX2D_609", "ASSET_TEX2D_610", "ASSET_TEX2D_611", "ASSET_TEX2D_612", "ASSET_TEX2D_613", "ASSET_TEX2D_614", "ASSET_TEX2D_615", "ASSET_TEX2D_616", "ASSET_TEX2D_617", "ASSET_TEX2D_618", "ASSET_TEX2D_619", "ASSET_TEX2D_620", "ASSET_TEX2D_621", "ASSET_TEX2D_622", "ASSET_TEX2D_623", "ASSET_TEX2D_624", "ASSET_TEX2D_625", "ASSET_TEX2D_626", "ASSET_TEX2D_627", "ASSET_TEX2D_628", "ASSET_TEX2D_629", "ASSET_TEX2D_630", "ASSET_TEX2D_631", "ASSET_TEX2D_632", "ASSET_TEX2D_633", "ASSET_TEX2D_634", "ASSET_TEX2D_635", "ASSET_TEX2D_636", "ASSET_TEX2D_637", "ASSET_TEX2D_638", "ASSET_TEX2D_639", "ASSET_TEX2D_640", "ASSET_TEX2D_641", "ASSET_TEX2D_642", "ASSET_TEX2D_643", "ASSET_TEX2D_644", "ASSET_TEX2D_645", "ASSET_TEX2D_646", "ASSET_TEX2D_647", "ASSET_TEX2D_648", "ASSET_TEX2D_649", "ASSET_TEX2D_650", "ASSET_TEX2D_651", "ASSET_TEX2D_652", "ASSET_TEX2D_653", "ASSET_TEX2D_654", "ASSET_TEX2D_655", "ASSET_TEX2D_656", "ASSET_TEX2D_657", "ASSET_TEX2D_658", "ASSET_TEX2D_659", "ASSET_TEX2D_660", "ASSET_TEX2D_661", "ASSET_TEX2D_662", "ASSET_TEX2D_663", "ASSET_TEX2D_664", "ASSET_TEX2D_665", "ASSET_TEX2D_666", "ASSET_TEX2D_667", "ASSET_TEX2D_668", "ASSET_TEX2D_669", "ASSET_TEX2D_670", "ASSET_TEX2D_671", "ASSET_TEX2D_672", "ASSET_TEX2D_673", "ASSET_TEX2D_674", "ASSET_TEX2D_675", "ASSET_TEX2D_676", "ASSET_TEX2D_677", "ASSET_TEX2D_678", "ASSET_TEX2D_679", "ASSET_TEX2D_680", "ASSET_TEX2D_681", "ASSET_TEX2D_682", "ASSET_TEX2D_683", "ASSET_TEX2D_684", "ASSET_TEX2D_685", "ASSET_TEX2D_686", "ASSET_TEX2D_687", "ASSET_TEX2D_688", "ASSET_TEX2D_689", "ASSET_TEX2D_690", "ASSET_TEX2D_691", "ASSET_TEX2D_692", "ASSET_TEX2D_693", "ASSET_TEX2D_694", "ASSET_TEX2D_695", "ASSET_TEX2D_696", "ASSET_TEX2D_697", "ASSET_TEX2D_698", "ASSET_TEX2D_699", "ASSET_TEX2D_700", "ASSET_TEX2D_701", "ASSET_TEX2D_702", "ASSET_TEX2D_703", "ASSET_TEX2D_704", "ASSET_TEX2D_705", "ASSET_TEX2D_706", "ASSET_TEX2D_707", "ASSET_TEX2D_708", "ASSET_TEX2D_709", "ASSET_TEX2D_710", "ASSET_TEX2D_711", "ASSET_TEX2D_712", "ASSET_TEX2D_713", "ASSET_TEX2D_714", "ASSET_TEX2D_715", "ASSET_TEX2D_716", "ASSET_TEX2D_717", "ASSET_TEX2D_718", "ASSET_TEX2D_719", "ASSET_TEX2D_720", "ASSET_TEX2D_721", "ASSET_TEX2D_722", "ASSET_TEX2D_723", "ASSET_TEX2D_724", "ASSET_TEX2D_725", "ASSET_TEX2D_726", "ASSET_TEX2D_727", "ASSET_TEX2D_728", "ASSET_TEX2D_729", "ASSET_TEX2D_730", "ASSET_TEX2D_731", "ASSET_TEX2D_732", "ASSET_TEX2D_733", "ASSET_TEX2D_734", "ASSET_TEX2D_735", "ASSET_TEX2D_736", "ASSET_TEX2D_737", "ASSET_TEX2D_738", "ASSET_TEX2D_739", "ASSET_TEX2D_740", "ASSET_TEX2D_741", "ASSET_TEX2D_742", "ASSET_TEX2D_743", "ASSET_TEX2D_744", "ASSET_TEX2D_745", "ASSET_TEX2D_746", "ASSET_TEX2D_747", "ASSET_TEX2D_748", "ASSET_TEX2D_749", "ASSET_TEX2D_750", "ASSET_TEX2D_751", "ASSET_TEX2D_752", "ASSET_TEX2D_753", "ASSET_TEX2D_754", "ASSET_TEX2D_755", "ASSET_TEX2D_756", "ASSET_TEX2D_757", "ASSET_TEX2D_758", "ASSET_TEX2D_759", "ASSET_TEX2D_760", "ASSET_TEX2D_761", "ASSET_TEX2D_762", "ASSET_TEX2D_763", "ASSET_TEX2D_764", "ASSET_TEX2D_765", "ASSET_TEX2D_766", "ASSET_TEX2D_767", "ASSET_TEX2D_768", "ASSET_TEX2D_769", "ASSET_TEX2D_770", "ASSET_TEX2D_771", "ASSET_TEX2D_772", "ASSET_TEX2D_773", "ASSET_TEX2D_774", "ASSET_TEX2D_775", "ASSET_TEX2D_776", "ASSET_TEX2D_777", "ASSET_TEX2D_778", "ASSET_TEX2D_779", "ASSET_TEX2D_780", "ASSET_TEX2D_781", "ASSET_TEX2D_782", "ASSET_TEX2D_783", "ASSET_TEX2D_784", "ASSET_TEX2D_785", "ASSET_TEX2D_786", "ASSET_TEX2D_787", "ASSET_TEX2D_788", "ASSET_TEX2D_789", "ASSET_TEX2D_790", "ASSET_TEX2D_791", "ASSET_TEX2D_792", "ASSET_TEX2D_793", "ASSET_TEX2D_794", "ASSET_TEX2D_795", "ASSET_TEX2D_796", "ASSET_TEX2D_797", "ASSET_TEX2D_798", "ASSET_TEX2D_799", "ASSET_TEX2D_800", "ASSET_TEX2D_801", "ASSET_TEX2D_802", "ASSET_TEX2D_803", "ASSET_TEX2D_804", "ASSET_TEX2D_805", "ASSET_TEX2D_806", "ASSET_TEX2D_807", "ASSET_TEX2D_808", "ASSET_TEX2D_809", "ASSET_TEX2D_810", "ASSET_TEX2D_811", "ASSET_TEX2D_812", "ASSET_TEX2D_813", "ASSET_TEX2D_814", "ASSET_TEX2D_815", "ASSET_TEX2D_816", "ASSET_TEX2D_817", "ASSET_TEX2D_818", "ASSET_TEX2D_819", "ASSET_TEX2D_820", "ASSET_TEX2D_821", "ASSET_TEX2D_822", "ASSET_TEX2D_823", "ASSET_TEX2D_824", "ASSET_TEX2D_825", "ASSET_TEX2D_826", "ASSET_TEX2D_827", "ASSET_TEX2D_828", "ASSET_TEX2D_829", "ASSET_TEX2D_830", "ASSET_TEX2D_831", "ASSET_TEX2D_832", "ASSET_TEX2D_833", "ASSET_TEX2D_834", "ASSET_TEX2D_835", "ASSET_TEX2D_836", "ASSET_TEX2D_837", "ASSET_TEX2D_838", "ASSET_TEX2D_839", "ASSET_TEX2D_840", "ASSET_TEX2D_841", "ASSET_TEX2D_842", "ASSET_TEX2D_843", "ASSET_TEX2D_844", "ASSET_TEX2D_845", "ASSET_TEX2D_846", "ASSET_TEX2D_847", "ASSET_TEX2D_848", "ASSET_TEX2D_849", "ASSET_TEX2D_850", "ASSET_TEX2D_851", "ASSET_TEX2D_852", "ASSET_TEX2D_853", "ASSET_TEX2D_854", "ASSET_TEX2D_855", "ASSET_TEX2D_856", "ASSET_TEX2D_857", "ASSET_TEX2D_858", "ASSET_TEX2D_859", "ASSET_TEX2D_860", "ASSET_TEX2D_861", "ASSET_TEX2D_862", "ASSET_TEX2D_863", "ASSET_TEX2D_864", "ASSET_TEX2D_865", "ASSET_TEX2D_866", "ASSET_TEX2D_867", "ASSET_TEX2D_868", "ASSET_TEX2D_869", "ASSET_TEX2D_870", "ASSET_TEX2D_871", "ASSET_TEX2D_872", "ASSET_TEX2D_873", "ASSET_TEX2D_874", "ASSET_TEX2D_875", "ASSET_TEX2D_876", "ASSET_TEX2D_877", "ASSET_TEX2D_878", "ASSET_TEX2D_879", "ASSET_TEX2D_880", "ASSET_TEX2D_881", "ASSET_TEX2D_882", "ASSET_TEX2D_883", "ASSET_TEX2D_884", "ASSET_TEX2D_885", "ASSET_TEX2D_886", "ASSET_TEX2D_887", "ASSET_TEX2D_888", "ASSET_TEX2D_889", "ASSET_TEX2D_890", "ASSET_TEX2D_891", "ASSET_TEX2D_892", "ASSET_TEX2D_893", "ASSET_TEX2D_894", "ASSET_TEX2D_895", "ASSET_TEX2D_896", "ASSET_TEX2D_897", "ASSET_TEX2D_898", "ASSET_TEX2D_899", "ASSET_TEX2D_900", "ASSET_TEX2D_901", "ASSET_TEX2D_902", "ASSET_TEX2D_903", "ASSET_TEX2D_904", "ASSET_TEX2D_905"], + "filenames": ["smallfont_0", "smallfont_1", "smallfont_2", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "funfont_0", "funfont_1", "funfont_2", "funfont_3", "funfont_4", "funfont_5", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "subtitlefont_0", "subtitlefont_1", "subtitlefont_2", "bigfont_a", "bigfont_b", "bigfont_c", "bigfont_d", "bigfont_e", "bigfont_f", "bigfont_g", "bigfont_h", "bigfont_i", "bigfont_j", "bigfont_k", "bigfont_l", "bigfont_m", "bigfont_n", "bigfont_o", "bigfont_p", "bigfont_q", "bigfont_r", "bigfont_s", "bigfont_t", "bigfont_u", "bigfont_v", "bigfont_w", "bigfont_x", "bigfont_y", "bigfont_z", "bigfont_questionmark", "bigfont_period", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""] + }, + { + "build-id": "ASSET_TEXTURES_2D_TABLE", + "type": "Table", + "for": "ASSET_TEXTURES_2D" + }, + { + "build-id": "ASSET_GAME_TEXT", + "type": "GameText", + "folder": "text/game", + "table": 7 + }, + { + "build-id": "ASSET_GAME_TEXT_TABLE", + "type": "Table", + "for": "ASSET_GAME_TEXT" + }, + { + "build-id": "ASSET_MENU_TEXT", + "type": "MenuText", + "folder": "text/menu", + "table": 9, + "filenames": [ + "english_menu_text", + "french_menu_text", + "german_menu_text", + "japanese_menu_text" + ], + "child-build-ids": [ + "ASSET_MENU_TEXT_ENGLISH", + "ASSET_MENU_TEXT_FRENCH", + "ASSET_MENU_TEXT_GERMAN", + "ASSET_MENU_TEXT_JAPANESE" + ], + "language-order": [ + "LANGUAGE_ENGLISH", + "LANGUAGE_FRENCH", + "LANGUAGE_GERMAN", + "LANGUAGE_JAPANESE" + ], + "menu-text-build-ids": [ + "ASSET_MENU_TEXT_STEREO", + "ASSET_MENU_TEXT_MONO", + "ASSET_MENU_TEXT_HEADPHONES", + "ASSET_MENU_TEXT_SFXVOLUME", + "ASSET_MENU_TEXT_MUSICVOLUME", + "ASSET_MENU_TEXT_RETURN", + "ASSET_MENU_TEXT_AUDIOOPTIONS", + "ASSET_MENU_TEXT_MUSICTEST", + "ASSET_MENU_TEXT_ENTERINITIALS", + "ASSET_MENU_TEXT_BESTTIME", + "ASSET_MENU_TEXT_BESTLAP", + "ASSET_MENU_TEXT_SILVERCOIN", + "ASSET_MENU_TEXT_GOLDCOIN", + "ASSET_MENU_TEXT_CHALLENGE", + "ASSET_MENU_TEXT_ENTERCODE", + "ASSET_MENU_TEXT_CLEARALLCODES", + "ASSET_MENU_TEXT_CODELIST", + "ASSET_MENU_TEXT_MAGICCODES", + "ASSET_MENU_TEXT_BADCODE", + "ASSET_MENU_TEXT_ALLCODESDELETED", + "ASSET_MENU_TEXT_MAGICCODESLIST", + "ASSET_MENU_TEXT_ON", + "ASSET_MENU_TEXT_OFF", + "ASSET_MENU_TEXT_TRYAGAIN", + "ASSET_MENU_TEXT_SELECTTRACK", + "ASSET_MENU_TEXT_RETURNTOLOBBY", + "ASSET_MENU_TEXT_SELECTCHARACTER", + "ASSET_MENU_TEXT_SAVEGHOST", + "ASSET_MENU_TEXT_QUIT", + "ASSET_MENU_TEXT_LAPTIMES", + "ASSET_MENU_TEXT_OVERALLTIME", + "ASSET_MENU_TEXT_RACEORDER", + "ASSET_MENU_TEXT_RECORDTIMES", + "ASSET_MENU_TEXT_RANKINGS", + "ASSET_MENU_TEXT_LANGUAGE", + "ASSET_MENU_TEXT_CONTPAK", + "ASSET_MENU_TEXT_OPTIONS", + "ASSET_MENU_TEXT_CHANGEVEHICLE", + "ASSET_MENU_TEXT_HELP", + "ASSET_MENU_TEXT_CHALLENGES", + "ASSET_MENU_TEXT_VEHICLESELECT", + "ASSET_MENU_TEXT_CAR", + "ASSET_MENU_TEXT_HOVERCRAFT", + "ASSET_MENU_TEXT_PLANE", + "ASSET_MENU_TEXT_MAINMENU", + "ASSET_MENU_TEXT_CHALLENGESELECT", + "ASSET_MENU_TEXT_CARCHALLENGE", + "ASSET_MENU_TEXT_HOVERCHALLENGE", + "ASSET_MENU_TEXT_PLANECHALLENGE", + "ASSET_MENU_TEXT_LOSETOTAJ_0", + "ASSET_MENU_TEXT_LOSETOTAJ_1", + "ASSET_MENU_TEXT_EXIT", + "ASSET_MENU_TEXT_TTINTRO_0", + "ASSET_MENU_TEXT_TTINTRO_1", + "ASSET_MENU_TEXT_TTINTRO_2", + "ASSET_MENU_TEXT_TTINTRO_3", + "ASSET_MENU_TEXT_TTINTRO_4", + "ASSET_MENU_TEXT_TTINTRO_5", + "ASSET_MENU_TEXT_TTINTRO_6", + "ASSET_MENU_TEXT_TTINTRO_7", + "ASSET_MENU_TEXT_TTINTRO_8", + "ASSET_MENU_TEXT_TTINTRO_9", + "ASSET_MENU_TEXT_TTINTRO_10", + "ASSET_MENU_TEXT_TTINTRO_11", + "ASSET_MENU_TEXT_PAKERROR", + "ASSET_MENU_TEXT_TIMETRIALON", + "ASSET_MENU_TEXT_TIMETRIALOFF", + "ASSET_MENU_TEXT_NOCONTPAK", + "ASSET_MENU_TEXT_CONTPAKFULL", + "ASSET_MENU_TEXT_BADCONTPAK", + "ASSET_MENU_TEXT_TROPHYRACE", + "ASSET_MENU_TEXT_STATUS", + "ASSET_MENU_TEXT_GAMEA", + "ASSET_MENU_TEXT_GAMEB", + "ASSET_MENU_TEXT_GAMEC", + "ASSET_MENU_TEXT_NEW", + "ASSET_MENU_TEXT_GAMESELECT", + "ASSET_MENU_TEXT_GAMETOCOPY", + "ASSET_MENU_TEXT_GAMETOCOPYTO", + "ASSET_MENU_TEXT_GAMETOERASE", + "ASSET_MENU_TEXT_COPY", + "ASSET_MENU_TEXT_ERASE", + "ASSET_MENU_TEXT_GHOSTDATA", + "ASSET_MENU_TEXT_NOGHOSTSSAVED", + "ASSET_MENU_TEXT_ERASEGHOST", + "ASSET_MENU_TEXT_CANCEL", + "ASSET_MENU_TEXT_CONTPAK1", + "ASSET_MENU_TEXT_CONTPAK2", + "ASSET_MENU_TEXT_CONTPAK3", + "ASSET_MENU_TEXT_CONTPAK4", + "ASSET_MENU_TEXT_CONTPAKX", + "ASSET_MENU_TEXT_CONTPAKNOTPRESENT", + "ASSET_MENU_TEXT_CONTPAKTRYAGAIN", + "ASSET_MENU_TEXT_CONTPAKHASCORRUPTDATA_0", + "ASSET_MENU_TEXT_CONTPAKHASCORRUPTDATA_1", + "ASSET_MENU_TEXT_CONTPAKISDAMAGED_0", + "ASSET_MENU_TEXT_CONTPAKISDAMAGED_1", + "ASSET_MENU_TEXT_CONTPAKISFULL", + "ASSET_MENU_TEXT_CONTINUE", + "ASSET_MENU_TEXT_CONTPAKDIFFERENT_0", + "ASSET_MENU_TEXT_CONTPAKDIFFERENT_1", + "ASSET_MENU_TEXT_CONTPAKRETRY", + "ASSET_MENU_TEXT_CANNOTSTOREANYMOREGHOSTS_0", + "ASSET_MENU_TEXT_CANNOTSTOREANYMOREGHOSTS_1", + "ASSET_MENU_TEXT_ADVTWOLOADERROR_0", + "ASSET_MENU_TEXT_ADVTWOLOADERROR_1", + "ASSET_MENU_TEXT_ADVTWOLOADERROR_2", + "ASSET_MENU_TEXT_ADVTWOLOADERROR_3", + "ASSET_MENU_TEXT_ADVTWOLOADERROR_4", + "ASSET_MENU_TEXT_ADVTWOLOADERROR_5", + "ASSET_MENU_TEXT_PAKNOTES", + "ASSET_MENU_TEXT_DELETENOTEX", + "ASSET_MENU_TEXT_DELETE", + "ASSET_MENU_TEXT_CANCELDELETE", + "ASSET_MENU_TEXT_FREEPAGESX", + "ASSET_MENU_TEXT_NOTE", + "ASSET_MENU_TEXT_FILENAME", + "ASSET_MENU_TEXT_PAGES", + "ASSET_MENU_TEXT_MORE", + "ASSET_MENU_TEXT_GAMEPAK", + "ASSET_MENU_TEXT_TIMES", + "ASSET_MENU_TEXT_GHOSTS", + "ASSET_MENU_TEXT_EMPTYSLOT", + "ASSET_MENU_TEXT_VIEWGHOSTS", + "ASSET_MENU_TEXT_PLEASEWAIT", + "ASSET_MENU_TEXT_GAMEERROR", + "ASSET_MENU_TEXT_RESTARTRACE", + "ASSET_MENU_TEXT_RESTARTCHALLENGE", + "ASSET_MENU_TEXT_ABANDONCHALLENGE", + "ASSET_MENU_TEXT_QUITTROPHYRACE", + "ASSET_MENU_TEXT_QUITTROPHYRACETITLE", + "ASSET_MENU_TEXT_QUITGAME", + "ASSET_MENU_TEXT_QUITGAMETITLE", + "ASSET_MENU_TEXT_PAUSEOPTIONS", + "ASSET_MENU_TEXT_OK", + "ASSET_MENU_TEXT_PLAYERSELECT", + "ASSET_MENU_TEXT_NUMBEROFRACERS", + "ASSET_MENU_TEXT_START", + "ASSET_MENU_TEXT_ROUNDONE", + "ASSET_MENU_TEXT_ROUNDTWO", + "ASSET_MENU_TEXT_ROUNDTHREE", + "ASSET_MENU_TEXT_ROUNDFOUR", + "ASSET_MENU_TEXT_ADVENTURE", + "ASSET_MENU_TEXT_ADVENTURETWO", + "ASSET_MENU_TEXT_TRACKS", + "ASSET_MENU_TEXT_TROPHYCEREMONY", + "ASSET_MENU_TEXT_ADVENTURE2", + "ASSET_MENU_TEXT_ADVENTURETWO2", + "ASSET_MENU_TEXT_CLEARALLCODESTITLE", + "ASSET_MENU_TEXT_CLEARALLCODESCONFIRM", + "ASSET_MENU_TEXT_CLEARALLCODESCANCEL", + "ASSET_MENU_TEXT_CONTROLLERNOTCONNECTED", + "ASSET_MENU_TEXT_CAUTION", + "ASSET_MENU_TEXT_RUMBLEPAKDETECTED_0", + "ASSET_MENU_TEXT_RUMBLEPAKDETECTED_1", + "ASSET_MENU_TEXT_RUMBLEPAKDETECTED_2", + "ASSET_MENU_TEXT_INSERTDEVICE_0", + "ASSET_MENU_TEXT_INSERTDEVICE_1", + "ASSET_MENU_TEXT_INSERTDEVICE_2", + "ASSET_MENU_TEXT_INSERTDEVICE_3", + "ASSET_MENU_TEXT_INSERTDEVICE_4", + "ASSET_MENU_TEXT_INSERTDEVICE_5", + "ASSET_MENU_TEXT_INSERTDEVICE_6", + "ASSET_MENU_TEXT_TURNOFFN64_0", + "ASSET_MENU_TEXT_TURNOFFN64_1", + "ASSET_MENU_TEXT_SAVEOPTIONS", + "ASSET_MENU_TEXT_CAUTIONMESSAGE_0", + "ASSET_MENU_TEXT_CAUTIONMESSAGE_1", + "ASSET_MENU_TEXT_CAUTIONMESSAGE_2", + "ASSET_MENU_TEXT_CAUTIONMESSAGE_3", + "ASSET_MENU_TEXT_CAUTIONMESSAGE_4", + "ASSET_MENU_TEXT_CAUTIONMESSAGE_5", + "ASSET_MENU_TEXT_CAUTIONMESSAGE_6", + "ASSET_MENU_TEXT_CAUTIONMESSAGE_7", + "ASSET_MENU_TEXT_CAUTIONMESSAGE_8", + "ASSET_MENU_TEXT_CAUTIONMESSAGE_9", + "ASSET_MENU_TEXT_CAUTIONMESSAGE_10", + "ASSET_MENU_TEXT_CANNOTSAVEGHOSTDATA_0", + "ASSET_MENU_TEXT_CANNOTSAVEGHOSTDATA_1", + "ASSET_MENU_TEXT_CANNOTSAVEGHOSTDATA_2", + "ASSET_MENU_TEXT_ENTERTROPHYRACE", + "ASSET_MENU_TEXT_GAMEPAKBONUSES", + "ASSET_MENU_TEXT_SUBTITLESON", + "ASSET_MENU_TEXT_SUBTITLESOFF", + "ASSET_MENU_TEXT_CORRUPTDATA_0", + "ASSET_MENU_TEXT_CORRUPTDATA_1" + ] + }, + { + "build-id": "ASSET_MENU_TEXT_TABLE", + "type": "Table", + "for": "ASSET_MENU_TEXT" + }, + { + "build-id": "ASSET_SCREENS", + "type": "Binary", + "folder": "screens", + "table": 11 + }, + { + "build-id": "ASSET_SCREENS_TABLE", + "type": "Table", + "for": "ASSET_SCREENS" + }, + { + "build-id": "ASSET_SPRITES", + "type": "Sprites", + "folder": "sprites", + "table": 13 + }, + { + "build-id": "ASSET_SPRITES_TABLE", + "type": "Table", + "for": "ASSET_SPRITES" + }, + { + "build-id": "ASSET_EMPTY_14", + "type": "Empty" + }, + { + "build-id": "ASSET_MISC", + "type": "Miscellaneous", + "folder": "misc", + "table": 16, + "filenames": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "tracks_menu_ids", + "hub_area_ids", + "main_tracks_ids", + "battle_tracks_ids", + "boss_tracks_ids", + "", + "", + "RacerStats_Unknown0", + "RacerStats_Diddy", + "RacerStats_TT", + "RacerStats_Unknown1", + "RacerStats_Krunch", + "RacerStats_Bumper", + "RacerStats_Tiptup", + "RacerStats_Conker", + "RacerStats_Timber", + "RacerStats_Banjo", + "RacerStats_Drumstick", + "RacerStats_Pipsy", + "RacerStats_Unknown2", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "magic_codes", + "title_screen_demo_ids", + "", + "", + "", + "" + ], + "child-build-ids": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "ASSET_MISC_TRACKS_MENU_IDS", + "ASSET_MISC_HUB_AREA_IDS", + "ASSET_MISC_MAIN_TRACKS_IDS", + "ASSET_MISC_BATTLE_TRACKS_IDS", + "ASSET_MISC_BOSS_TRACKS_IDS", + "", + "", + "ASSET_MISC_RACERSTATS_UNKNOWN0", + "ASSET_MISC_RACERSTATS_DIDDY", + "ASSET_MISC_RACERSTATS_TT", + "ASSET_MISC_RACERSTATS_UNKNOWN1", + "ASSET_MISC_RACERSTATS_KRUNCH", + "ASSET_MISC_RACERSTATS_BUMPER", + "ASSET_MISC_RACERSTATS_TIPTUP", + "ASSET_MISC_RACERSTATS_CONKER", + "ASSET_MISC_RACERSTATS_TIMBER", + "ASSET_MISC_RACERSTATS_BANJO", + "ASSET_MISC_RACERSTATS_DRUMSTICK", + "ASSET_MISC_RACERSTATS_PIPSY", + "ASSET_MISC_RACERSTATS_UNKNOWN2", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "ASSET_MISC_MAGIC_CODES", + "ASSET_MISC_TITLE_SCREEN_DEMO_IDS", + "", + "", + "", + "" + ] + }, + { + "build-id": "ASSET_MISC_TABLE", + "type": "Table", + "for": "ASSET_MISC" + }, + { + "build-id": "ASSET_HUD_ELEMENT_IDS", + "type": "Binary", + "folder": "ids", + "filenames": ["hud_element_ids"] + }, + { + "build-id": "ASSET_MENU_ELEMENT_IDS", + "type": "Binary", + "folder": "ids", + "filenames": ["menu_element_ids"] + }, + { + "build-id": "ASSET_UNKNOWN_19", + "type": "Binary", + "folder": "bin", + "filenames": ["unknown_table"] + }, + { + "build-id": "ASSET_LEVEL_OBJECT_MAPS_TABLE", + "type": "Table", + "for": "ASSET_LEVEL_OBJECT_MAPS" + }, + { + "build-id": "ASSET_LEVEL_OBJECT_MAPS", + "type": "LevelObjectMap", + "folder": "levels/objectMaps", + "table": 20 + }, + { + "build-id": "ASSET_LEVEL_HEADERS_TABLE", + "type": "Table", + "for": "ASSET_LEVEL_HEADERS" + }, + { + "build-id": "ASSET_LEVEL_HEADERS", + "type": "LevelHeaders", + "folder": "levels/headers", + "table": 22, + "filenames": [ + "CentralAreaHub", + "Bluey1", + "DragonForestHub", + "FossilCanyon", + "PirateLagoon", + "AncientLake", + "WalrusCove", + "HotTopVolcano", + "WhaleBay", + "SnowballValley", + "CrescentIsland", + "FireMountain", + "DinoDomainHub", + "EverfrostPeak", + "SherbetIslandHub", + "SpaceportAlpha", + "HorseshoeGulch", + "SpacedustAlley", + "GreenwoodVillage", + "BoulderCanyon", + "WindmillPlains", + "FrontEnd", + "CharacterSelect", + "TitleScreenSequence", + "SnowflakeMountainHub", + "SmokeyCastle", + "DarkwaterBeach", + "IciclePyramid", + "FrostyVillage", + "JungleFalls", + "TreasureCaves", + "HauntedWoods", + "DarkmoonCaverns", + "StarCity", + "TrophyRace", + "FutureFunLandHub", + "OpeningSequence", + "Wizpig1", + "Trickytops1", + "OptionsBackground", + "Bubbler1", + "Smokey1", + "WizpigMouthSequence", + "WizpigAmuletSequence", + "TTAmuletSequence", + "RocketSequence", + "Trickytops2", + "DinoDomainTrophyAnim", + "SnowflakeMountainTrophyAnim", + "SherbetIslandTrophyAnim", + "DragonForestTrophyAnim", + "FutureFunLandTrophyAnim", + "Bluey2", + "Bubbler2", + "Smokey2", + "Wizpig2", + "PartySequence", + "TricktopsAnim", + "SmokeyAnim", + "BlueyAnim", + "Wizpig1Anim", + "BubblerAnim", + "Wizpig2Anim", + "LastBit", + "LastBitB" + ], + "child-build-ids": [ + "ASSET_LEVEL_CENTRALAREAHUB", + "ASSET_LEVEL_BLUEY1", + "ASSET_LEVEL_DRAGONFORESTHUB", + "ASSET_LEVEL_FOSSILCANYON", + "ASSET_LEVEL_PIRATELAGOON", + "ASSET_LEVEL_ANCIENTLAKE", + "ASSET_LEVEL_WALRUSCOVE", + "ASSET_LEVEL_HOTTOPVOLCANO", + "ASSET_LEVEL_WHALEBAY", + "ASSET_LEVEL_SNOWBALLVALLEY", + "ASSET_LEVEL_CRESCENTISLAND", + "ASSET_LEVEL_FIREMOUNTAIN", + "ASSET_LEVEL_DINODOMAINHUB", + "ASSET_LEVEL_EVERFROSTPEAK", + "ASSET_LEVEL_SHERBETISLANDHUB", + "ASSET_LEVEL_SPACEPORTALPHA", + "ASSET_LEVEL_HORSESHOEGULCH", + "ASSET_LEVEL_SPACEDUSTALLEY", + "ASSET_LEVEL_GREENWOODVILLAGE", + "ASSET_LEVEL_BOULDERCANYON", + "ASSET_LEVEL_WINDMILLPLAINS", + "ASSET_LEVEL_FRONTEND", + "ASSET_LEVEL_CHARACTERSELECT", + "ASSET_LEVEL_TITLESCREENSEQUENCE", + "ASSET_LEVEL_SNOWFLAKEMOUNTAINHUB", + "ASSET_LEVEL_SMOKEYCASTLE", + "ASSET_LEVEL_DARKWATERBEACH", + "ASSET_LEVEL_ICICLEPYRAMID", + "ASSET_LEVEL_FROSTYVILLAGE", + "ASSET_LEVEL_JUNGLEFALLS", + "ASSET_LEVEL_TREASURECAVES", + "ASSET_LEVEL_HAUNTEDWOODS", + "ASSET_LEVEL_DARKMOONCAVERNS", + "ASSET_LEVEL_STARCITY", + "ASSET_LEVEL_TROPHYRACE", + "ASSET_LEVEL_FUTUREFUNLANDHUB", + "ASSET_LEVEL_OPENINGSEQUENCE", + "ASSET_LEVEL_WIZPIG1", + "ASSET_LEVEL_TRICKYTOPS1", + "ASSET_LEVEL_OPTIONSBACKGROUND", + "ASSET_LEVEL_BUBBLER1", + "ASSET_LEVEL_SMOKEY1", + "ASSET_LEVEL_WIZPIGMOUTHSEQUENCE", + "ASSET_LEVEL_WIZPIGAMULETSEQUENCE", + "ASSET_LEVEL_TTAMULETSEQUENCE", + "ASSET_LEVEL_ROCKETSEQUENCE", + "ASSET_LEVEL_TRICKYTOPS2", + "ASSET_LEVEL_DINODOMAINTROPHYANIM", + "ASSET_LEVEL_SNOWFLAKEMOUNTAINTROPHYANIM", + "ASSET_LEVEL_SHERBETISLANDTROPHYANIM", + "ASSET_LEVEL_DRAGONFORESTTROPHYANIM", + "ASSET_LEVEL_FUTUREFUNLANDTROPHYANIM", + "ASSET_LEVEL_BLUEY2", + "ASSET_LEVEL_BUBBLER2", + "ASSET_LEVEL_SMOKEY2", + "ASSET_LEVEL_WIZPIG2", + "ASSET_LEVEL_PARTYSEQUENCE", + "ASSET_LEVEL_TRICKTOPSANIM", + "ASSET_LEVEL_SMOKEYANIM", + "ASSET_LEVEL_BLUEYANIM", + "ASSET_LEVEL_WIZPIG1ANIM", + "ASSET_LEVEL_BUBBLERANIM", + "ASSET_LEVEL_WIZPIG2ANIM", + "ASSET_LEVEL_LASTBIT", + "ASSET_LEVEL_LASTBITB" + ] + }, + { + "build-id": "ASSET_LEVEL_NAMES_TABLE", + "type": "Table", + "for": "ASSET_LEVEL_NAMES" + }, + { + "build-id": "ASSET_LEVEL_NAMES", + "type": "LevelNames", + "folder": "levels/names", + "table": 24, + "filenames": [ + "CentralAreaHubName", + "Bluey1Name", + "DragonForestHubName", + "FossilCanyonName", + "PirateLagoonName", + "AncientLakeName", + "WalrusCoveName", + "HotTopVolcanoName", + "WhaleBayName", + "SnowballValleyName", + "CrescentIslandName", + "FireMountainName", + "DinoDomainHubName", + "EverfrostPeakName", + "SherbetIslandHubName", + "SpaceportAlphaName", + "HorseshoeGulchName", + "SpacedustAlleyName", + "GreenwoodVillageName", + "BoulderCanyonName", + "WindmillPlainsName", + "FrontEndName", + "CharacterSelectName", + "TitleScreenSequenceName", + "SnowflakeMountainHubName", + "SmokeyCastleName", + "DarkwaterBeachName", + "IciclePyramidName", + "FrostyVillageName", + "JungleFallsName", + "TreasureCavesName", + "HauntedWoodsName", + "DarkmoonCavernsName", + "StarCityName", + "TrophyRaceName", + "FutureFunLandHubName", + "OpeningSequenceName", + "Wizpig1Name", + "Trickytops1Name", + "OptionsBackgroundName", + "Bubbler1Name", + "Smokey1Name", + "WizpigMouthSequenceName", + "WizpigAmuletSequenceName", + "TTAmuletSequenceName", + "RocketSequenceName", + "Trickytops2Name", + "DinoDomainTrophyAnimName", + "SnowflakeMountainTrophyAnimName", + "SherbetIslandTrophyAnimName", + "DragonForestTrophyAnimName", + "FutureFunLandTrophyAnimName", + "Bluey2Name", + "Bubbler2Name", + "Smokey2Name", + "Wizpig2Name", + "PartySequenceName", + "TricktopsAnimName", + "SmokeyAnimName", + "BlueyAnimName", + "Wizpig1AnimName", + "BubblerAnimName", + "Wizpig2AnimName", + "LastBitName", + "LastBitBName" + ], + "child-build-ids": [ + "ASSET_LEVELNAME_CENTRALAREAHUB", + "ASSET_LEVELNAME_BLUEY1", + "ASSET_LEVELNAME_DRAGONFORESTHUB", + "ASSET_LEVELNAME_FOSSILCANYON", + "ASSET_LEVELNAME_PIRATELAGOON", + "ASSET_LEVELNAME_ANCIENTLAKE", + "ASSET_LEVELNAME_WALRUSCOVE", + "ASSET_LEVELNAME_HOTTOPVOLCANO", + "ASSET_LEVELNAME_WHALEBAY", + "ASSET_LEVELNAME_SNOWBALLVALLEY", + "ASSET_LEVELNAME_CRESCENTISLAND", + "ASSET_LEVELNAME_FIREMOUNTAIN", + "ASSET_LEVELNAME_DINODOMAINHUB", + "ASSET_LEVELNAME_EVERFROSTPEAK", + "ASSET_LEVELNAME_SHERBETISLANDHUB", + "ASSET_LEVELNAME_SPACEPORTALPHA", + "ASSET_LEVELNAME_HORSESHOEGULCH", + "ASSET_LEVELNAME_SPACEDUSTALLEY", + "ASSET_LEVELNAME_GREENWOODVILLAGE", + "ASSET_LEVELNAME_BOULDERCANYON", + "ASSET_LEVELNAME_WINDMILLPLAINS", + "ASSET_LEVELNAME_FRONTEND", + "ASSET_LEVELNAME_CHARACTERSELECT", + "ASSET_LEVELNAME_TITLESCREENSEQUENCE", + "ASSET_LEVELNAME_SNOWFLAKEMOUNTAINHUB", + "ASSET_LEVELNAME_SMOKEYCASTLE", + "ASSET_LEVELNAME_DARKWATERBEACH", + "ASSET_LEVELNAME_ICICLEPYRAMID", + "ASSET_LEVELNAME_FROSTYVILLAGE", + "ASSET_LEVELNAME_JUNGLEFALLS", + "ASSET_LEVELNAME_TREASURECAVES", + "ASSET_LEVELNAME_HAUNTEDWOODS", + "ASSET_LEVELNAME_DARKMOONCAVERNS", + "ASSET_LEVELNAME_STARCITY", + "ASSET_LEVELNAME_TROPHYRACE", + "ASSET_LEVELNAME_FUTUREFUNLANDHUB", + "ASSET_LEVELNAME_OPENINGSEQUENCE", + "ASSET_LEVELNAME_WIZPIG1", + "ASSET_LEVELNAME_TRICKYTOPS1", + "ASSET_LEVELNAME_OPTIONSBACKGROUND", + "ASSET_LEVELNAME_BUBBLER1", + "ASSET_LEVELNAME_SMOKEY1", + "ASSET_LEVELNAME_WIZPIGMOUTHSEQUENCE", + "ASSET_LEVELNAME_WIZPIGAMULETSEQUENCE", + "ASSET_LEVELNAME_TTAMULETSEQUENCE", + "ASSET_LEVELNAME_ROCKETSEQUENCE", + "ASSET_LEVELNAME_TRICKYTOPS2", + "ASSET_LEVELNAME_DINODOMAINTROPHYANIM", + "ASSET_LEVELNAME_SNOWFLAKEMOUNTAINTROPHYANIM", + "ASSET_LEVELNAME_SHERBETISLANDTROPHYANIM", + "ASSET_LEVELNAME_DRAGONFORESTTROPHYANIM", + "ASSET_LEVELNAME_FUTUREFUNLANDTROPHYANIM", + "ASSET_LEVELNAME_BLUEY2", + "ASSET_LEVELNAME_BUBBLER2", + "ASSET_LEVELNAME_SMOKEY2", + "ASSET_LEVELNAME_WIZPIG2", + "ASSET_LEVELNAME_PARTYSEQUENCE", + "ASSET_LEVELNAME_TRICKTOPSANIM", + "ASSET_LEVELNAME_SMOKEYANIM", + "ASSET_LEVELNAME_BLUEYANIM", + "ASSET_LEVELNAME_WIZPIG1ANIM", + "ASSET_LEVELNAME_BUBBLERANIM", + "ASSET_LEVELNAME_WIZPIG2ANIM", + "ASSET_LEVELNAME_LASTBIT", + "ASSET_LEVELNAME_LASTBITB" + ] + }, + { + "build-id": "ASSET_LEVEL_MODELS_TABLE", + "type": "Table", + "for": "ASSET_LEVEL_MODELS" + }, + { + "build-id": "ASSET_LEVEL_MODELS", + "type": "LevelModels", + "folder": "levels/models", + "table": 26 + }, + { + "build-id": "ASSET_OBJECT_MODELS_TABLE", + "type": "Table", + "for": "ASSET_OBJECT_MODELS" + }, + { + "build-id": "ASSET_OBJECT_MODELS", + "type": "ObjectModels", + "folder": "objects/models", + "table": 28 + }, + { + "build-id": "ASSET_ANIMATION_IDS", + "type": "Binary", + "folder": "objects", + "filenames": ["animation_ids"] + }, + { + "build-id": "ASSET_OBJECT_ANIMATIONS_TABLE", + "type": "Table", + "for": "ASSET_OBJECT_ANIMATIONS" + }, + { + "build-id": "ASSET_OBJECT_ANIMATIONS", + "type": "ObjectAnimations", + "folder": "objects/animations", + "table": 31 + }, + { + "build-id": "ASSET_OBJECT_HEADERS_TABLE", + "type": "Table", + "for": "ASSET_OBJECT_HEADERS" + }, + { + "build-id": "ASSET_OBJECT_HEADERS", + "type": "ObjectHeaders", + "folder": "objects/headers", + "table": 33 + }, + { + "build-id": "ASSET_LEVEL_OBJECT_TRANSLATION_TABLE", + "type": "Binary", + "folder": "objects", + "filenames": ["level_object_translation_table"] + }, + { + "build-id": "ASSET_EMPTY_37_TABLE", + "type": "Table", + "for": "ASSET_EMPTY_37" + }, + { + "build-id": "ASSET_EMPTY_37", + "type": "Empty", + "table": 36 + }, + { + "build-id": "ASSET_AUDIO_TABLE", + "type": "Table", + "for": "ASSET_AUDIO" + }, + { + "build-id": "ASSET_AUDIO", + "type": "Audio", + "folder": "audio", + "table": 38 + }, + { + "build-id": "ASSET_PARTICLES_TABLE", + "type": "Table", + "for": "ASSET_PARTICLES" + }, + { + "build-id": "ASSET_PARTICLES", + "type": "Particles", + "folder": "particles/particles", + "table": 40 + }, + { + "build-id": "ASSET_PARTICLE_BEHAVIORS_TABLE", + "type": "Table", + "for": "ASSET_PARTICLE_BEHAVIORS" + }, + { + "build-id": "ASSET_PARTICLE_BEHAVIORS", + "type": "ParticleBehaviors", + "folder": "particles/behaviors", + "table": 42 + }, + { + "build-id": "ASSET_FONTS", + "type": "Fonts", + "folder": "fonts", + "filenames": ["fonts"], + "font-names": [ "FunFont", "SmallFont", "BigFont", "SubtitleFont" ] + }, + { + "build-id": "ASSET_BINARY_45", + "type": "Binary", + "folder": "fonts" + }, + { + "build-id": "ASSET_BINARY_46", + "type": "Binary", + "folder": "fonts" + }, + { + "build-id": "ASSET_BINARY_47", + "type": "Binary", + "folder": "ids" + }, + { + "build-id": "ASSET_TTGHOSTS_TABLE", + "type": "Table", + "for": "ASSET_TTGHOSTS" + }, + { + "build-id": "ASSET_TTGHOSTS", + "type": "TTGhosts", + "folder": "tt_ghosts", + "table": 48, + "filenames": [ + "FossilCanyonGhost", + "PirateLagoonGhost", + "AncientLakeGhost", + "WalrusCoveGhost", + "HotTopVolcanoGhost", + "WhaleBayGhost", + "SnowballValleyGhost", + "CrescentIslandGhost", + "EverfrostPeakGhost", + "SpaceportAlphaGhost", + "SpacedustAlleyGhost", + "GreenwoodVillageGhost", + "BoulderCanyonGhost", + "WindmillPlainsGhost", + "FrostyVillageGhost", + "JungleFallsGhost", + "TreasureCavesGhost", + "HauntedWoodsGhost", + "DarkmoonCavernsGhost", + "StarCityGhost" + ], + "child-build-ids": [ + "ASSET_TTGHOSTS_FOSSILCANYON", + "ASSET_TTGHOSTS_PIRATELAGOON", + "ASSET_TTGHOSTS_ANCIENTLAKE", + "ASSET_TTGHOSTS_WALRUSCOVE", + "ASSET_TTGHOSTS_HOTTOPVOLCANO", + "ASSET_TTGHOSTS_WHALEBAY", + "ASSET_TTGHOSTS_SNOWBALLVALLEY", + "ASSET_TTGHOSTS_CRESCENTISLAND", + "ASSET_TTGHOSTS_EVERFROSTPEAK", + "ASSET_TTGHOSTS_SPACEPORTALPHA", + "ASSET_TTGHOSTS_SPACEDUSTALLEY", + "ASSET_TTGHOSTS_GREENWOODVILLAGE", + "ASSET_TTGHOSTS_BOULDERCANYON", + "ASSET_TTGHOSTS_WINDMILLPLAINS", + "ASSET_TTGHOSTS_FROSTYVILLAGE", + "ASSET_TTGHOSTS_JUNGLEFALLS", + "ASSET_TTGHOSTS_TREASURECAVES", + "ASSET_TTGHOSTS_HAUNTEDWOODS", + "ASSET_TTGHOSTS_DARKMOONCAVERNS", + "ASSET_TTGHOSTS_STARCITY" + ] + } + ] + } } - - - - - diff --git a/extract.sh b/extract.sh index fb8ecc4e..811be6ce 100755 --- a/extract.sh +++ b/extract.sh @@ -1,32 +1,30 @@ #!/bin/bash if [[ $# == 0 || (($1 != "us_1.0") && ($1 != "us_1.1") && ($1 != "eu_1.0") && ($1 != "eu_1.1") && ($1 != "jp"))]]; then - echo 'Usage: ./extract.sh ' - echo 'Acceptable versions: us_1.0, us_1.1, eu_1.0, eu_1.1, jp' - exit 1 + echo 'No valid version specified, defaulting to us_1.0...' + VER="us_1.0" +else + VER=$1 fi echo 'Extracting Assets...' # Remove assets directory if it exists. -ASSETS_DIR="./assets/$1" +ASSETS_DIR="./assets/vanilla/$VER" if [ -d "$ASSETS_DIR" ]; then rm -r $ASSETS_DIR fi # Remove ucode directory if it exists. -UCODE_DIR="./ucode/$1" +UCODE_DIR="./ucode/$VER" if [ -d "$UCODE_DIR" ]; then rm -r $UCODE_DIR fi -if ! ./tools/dkr_extractor "$1" ./extract-ver ./baseroms . ; then +if ! ./tools/dkr_assets_tool -e "$VER" ./assets ./extract-ver ./baseroms . ; then exit 1 fi -# Generate the linker file (dkr.ld) -./generate_ld.sh "$1" - echo 'Done.' -exit 0 \ No newline at end of file +exit 0 diff --git a/include/asset_enums.h b/include/asset_enums.h new file mode 100644 index 00000000..5a7e746a --- /dev/null +++ b/include/asset_enums.h @@ -0,0 +1,4853 @@ +// This file is automatically generated. Any changes you make to this file will get overwritten. + +#ifndef _ASSET_ENUMS_H +#define _ASSET_ENUMS_H + +/********** Asset Sections **********/ + +typedef enum { + ASSET_UNKNOWN_0, + ASSET_UNKNOWN_0_TABLE, + ASSET_TEXTURES_3D, + ASSET_TEXTURES_3D_TABLE, + ASSET_TEXTURES_2D, + ASSET_TEXTURES_2D_TABLE, + ASSET_GAME_TEXT, + ASSET_GAME_TEXT_TABLE, + ASSET_MENU_TEXT, + ASSET_MENU_TEXT_TABLE, + ASSET_SCREENS, + ASSET_SCREENS_TABLE, + ASSET_SPRITES, + ASSET_SPRITES_TABLE, + ASSET_EMPTY_14, + ASSET_MISC, + ASSET_MISC_TABLE, + ASSET_HUD_ELEMENT_IDS, + ASSET_MENU_ELEMENT_IDS, + ASSET_UNKNOWN_19, + ASSET_LEVEL_OBJECT_MAPS_TABLE, + ASSET_LEVEL_OBJECT_MAPS, + ASSET_LEVEL_HEADERS_TABLE, + ASSET_LEVEL_HEADERS, + ASSET_LEVEL_NAMES_TABLE, + ASSET_LEVEL_NAMES, + ASSET_LEVEL_MODELS_TABLE, + ASSET_LEVEL_MODELS, + ASSET_OBJECT_MODELS_TABLE, + ASSET_OBJECT_MODELS, + ASSET_ANIMATION_IDS, + ASSET_OBJECT_ANIMATIONS_TABLE, + ASSET_OBJECT_ANIMATIONS, + ASSET_OBJECT_HEADERS_TABLE, + ASSET_OBJECT_HEADERS, + ASSET_LEVEL_OBJECT_TRANSLATION_TABLE, + ASSET_EMPTY_37_TABLE, + ASSET_EMPTY_37, + ASSET_AUDIO_TABLE, + ASSET_AUDIO, + ASSET_PARTICLES_TABLE, + ASSET_PARTICLES, + ASSET_PARTICLE_BEHAVIORS_TABLE, + ASSET_PARTICLE_BEHAVIORS, + ASSET_FONTS, + ASSET_BINARY_45, + ASSET_BINARY_46, + ASSET_BINARY_47, + ASSET_TTGHOSTS_TABLE, + ASSET_TTGHOSTS +} AssetSectionsEnum; + +/********** ASSET_UNKNOWN_0 **********/ + +typedef enum { + ASSET_UNKNOWN_0_0, + ASSET_UNKNOWN_0_1, + ASSET_UNKNOWN_0_2, + ASSET_UNKNOWN_0_3, + ASSET_UNKNOWN_0_4, + ASSET_UNKNOWN_0_5, + ASSET_UNKNOWN_0_6, + ASSET_UNKNOWN_0_7, + ASSET_UNKNOWN_0_8, + ASSET_UNKNOWN_0_9 +} AssetUnknown0Enum; + +/********** ASSET_TEXTURES_3D **********/ + +typedef enum { + ASSET_TEX3D_0, + ASSET_TEX3D_1, + ASSET_TEX3D_2, + ASSET_TEX3D_3, + ASSET_TEX3D_4, + ASSET_TEX3D_5, + ASSET_TEX3D_6, + ASSET_TEX3D_7, + ASSET_TEX3D_8, + ASSET_TEX3D_9, + ASSET_TEX3D_10, + ASSET_TEX3D_11, + ASSET_TEX3D_12, + ASSET_TEX3D_13, + ASSET_TEX3D_14, + ASSET_TEX3D_15, + ASSET_TEX3D_16, + ASSET_TEX3D_17, + ASSET_TEX3D_18, + ASSET_TEX3D_19, + ASSET_TEX3D_20, + ASSET_TEX3D_21, + ASSET_TEX3D_22, + ASSET_TEX3D_23, + ASSET_TEX3D_24, + ASSET_TEX3D_25, + ASSET_TEX3D_26, + ASSET_TEX3D_27, + ASSET_TEX3D_28, + ASSET_TEX3D_29, + ASSET_TEX3D_30, + ASSET_TEX3D_31, + ASSET_TEX3D_32, + ASSET_TEX3D_33, + ASSET_TEX3D_34, + ASSET_TEX3D_35, + ASSET_TEX3D_36, + ASSET_TEX3D_37, + ASSET_TEX3D_38, + ASSET_TEX3D_39, + ASSET_TEX3D_40, + ASSET_TEX3D_41, + ASSET_TEX3D_42, + ASSET_TEX3D_43, + ASSET_TEX3D_44, + ASSET_TEX3D_45, + ASSET_TEX3D_46, + ASSET_TEX3D_47, + ASSET_TEX3D_48, + ASSET_TEX3D_49, + ASSET_TEX3D_50, + ASSET_TEX3D_51, + ASSET_TEX3D_52, + ASSET_TEX3D_53, + ASSET_TEX3D_54, + ASSET_TEX3D_55, + ASSET_TEX3D_56, + ASSET_TEX3D_57, + ASSET_TEX3D_58, + ASSET_TEX3D_59, + ASSET_TEX3D_60, + ASSET_TEX3D_61, + ASSET_TEX3D_62, + ASSET_TEX3D_63, + ASSET_TEX3D_64, + ASSET_TEX3D_65, + ASSET_TEX3D_66, + ASSET_TEX3D_67, + ASSET_TEX3D_68, + ASSET_TEX3D_69, + ASSET_TEX3D_70, + ASSET_TEX3D_71, + ASSET_TEX3D_72, + ASSET_TEX3D_73, + ASSET_TEX3D_74, + ASSET_TEX3D_75, + ASSET_TEX3D_76, + ASSET_TEX3D_77, + ASSET_TEX3D_78, + ASSET_TEX3D_79, + ASSET_TEX3D_80, + ASSET_TEX3D_81, + ASSET_TEX3D_82, + ASSET_TEX3D_83, + ASSET_TEX3D_84, + ASSET_TEX3D_85, + ASSET_TEX3D_86, + ASSET_TEX3D_87, + ASSET_TEX3D_88, + ASSET_TEX3D_89, + ASSET_TEX3D_90, + ASSET_TEX3D_91, + ASSET_TEX3D_92, + ASSET_TEX3D_93, + ASSET_TEX3D_94, + ASSET_TEX3D_95, + ASSET_TEX3D_96, + ASSET_TEX3D_97, + ASSET_TEX3D_98, + ASSET_TEX3D_99, + ASSET_TEX3D_100, + ASSET_TEX3D_101, + ASSET_TEX3D_102, + ASSET_TEX3D_103, + ASSET_TEX3D_104, + ASSET_TEX3D_105, + ASSET_TEX3D_106, + ASSET_TEX3D_107, + ASSET_TEX3D_108, + ASSET_TEX3D_109, + ASSET_TEX3D_110, + ASSET_TEX3D_111, + ASSET_TEX3D_112, + ASSET_TEX3D_113, + ASSET_TEX3D_114, + ASSET_TEX3D_115, + ASSET_TEX3D_116, + ASSET_TEX3D_117, + ASSET_TEX3D_118, + ASSET_TEX3D_119, + ASSET_TEX3D_120, + ASSET_TEX3D_121, + ASSET_TEX3D_122, + ASSET_TEX3D_123, + ASSET_TEX3D_124, + ASSET_TEX3D_125, + ASSET_TEX3D_126, + ASSET_TEX3D_127, + ASSET_TEX3D_128, + ASSET_TEX3D_129, + ASSET_TEX3D_130, + ASSET_TEX3D_131, + ASSET_TEX3D_132, + ASSET_TEX3D_133, + ASSET_TEX3D_134, + ASSET_TEX3D_135, + ASSET_TEX3D_136, + ASSET_TEX3D_137, + ASSET_TEX3D_138, + ASSET_TEX3D_139, + ASSET_TEX3D_140, + ASSET_TEX3D_141, + ASSET_TEX3D_142, + ASSET_TEX3D_143, + ASSET_TEX3D_144, + ASSET_TEX3D_145, + ASSET_TEX3D_146, + ASSET_TEX3D_147, + ASSET_TEX3D_148, + ASSET_TEX3D_149, + ASSET_TEX3D_150, + ASSET_TEX3D_151, + ASSET_TEX3D_152, + ASSET_TEX3D_153, + ASSET_TEX3D_154, + ASSET_TEX3D_155, + ASSET_TEX3D_156, + ASSET_TEX3D_157, + ASSET_TEX3D_158, + ASSET_TEX3D_159, + ASSET_TEX3D_160, + ASSET_TEX3D_161, + ASSET_TEX3D_162, + ASSET_TEX3D_163, + ASSET_TEX3D_164, + ASSET_TEX3D_165, + ASSET_TEX3D_166, + ASSET_TEX3D_167, + ASSET_TEX3D_168, + ASSET_TEX3D_169, + ASSET_TEX3D_170, + ASSET_TEX3D_171, + ASSET_TEX3D_172, + ASSET_TEX3D_173, + ASSET_TEX3D_174, + ASSET_TEX3D_175, + ASSET_TEX3D_176, + ASSET_TEX3D_177, + ASSET_TEX3D_178, + ASSET_TEX3D_179, + ASSET_TEX3D_180, + ASSET_TEX3D_181, + ASSET_TEX3D_182, + ASSET_TEX3D_183, + ASSET_TEX3D_184, + ASSET_TEX3D_185, + ASSET_TEX3D_186, + ASSET_TEX3D_187, + ASSET_TEX3D_188, + ASSET_TEX3D_189, + ASSET_TEX3D_190, + ASSET_TEX3D_191, + ASSET_TEX3D_192, + ASSET_TEX3D_193, + ASSET_TEX3D_194, + ASSET_TEX3D_195, + ASSET_TEX3D_196, + ASSET_TEX3D_197, + ASSET_TEX3D_198, + ASSET_TEX3D_199, + ASSET_TEX3D_200, + ASSET_TEX3D_201, + ASSET_TEX3D_202, + ASSET_TEX3D_203, + ASSET_TEX3D_204, + ASSET_TEX3D_205, + ASSET_TEX3D_206, + ASSET_TEX3D_207, + ASSET_TEX3D_208, + ASSET_TEX3D_209, + ASSET_TEX3D_210, + ASSET_TEX3D_211, + ASSET_TEX3D_212, + ASSET_TEX3D_213, + ASSET_TEX3D_214, + ASSET_TEX3D_215, + ASSET_TEX3D_216, + ASSET_TEX3D_217, + ASSET_TEX3D_218, + ASSET_TEX3D_219, + ASSET_TEX3D_220, + ASSET_TEX3D_221, + ASSET_TEX3D_222, + ASSET_TEX3D_223, + ASSET_TEX3D_224, + ASSET_TEX3D_225, + ASSET_TEX3D_226, + ASSET_TEX3D_227, + ASSET_TEX3D_228, + ASSET_TEX3D_229, + ASSET_TEX3D_230, + ASSET_TEX3D_231, + ASSET_TEX3D_232, + ASSET_TEX3D_233, + ASSET_TEX3D_234, + ASSET_TEX3D_235, + ASSET_TEX3D_236, + ASSET_TEX3D_237, + ASSET_TEX3D_238, + ASSET_TEX3D_239, + ASSET_TEX3D_240, + ASSET_TEX3D_241, + ASSET_TEX3D_242, + ASSET_TEX3D_243, + ASSET_TEX3D_244, + ASSET_TEX3D_245, + ASSET_TEX3D_246, + ASSET_TEX3D_247, + ASSET_TEX3D_248, + ASSET_TEX3D_249, + ASSET_TEX3D_250, + ASSET_TEX3D_251, + ASSET_TEX3D_252, + ASSET_TEX3D_253, + ASSET_TEX3D_254, + ASSET_TEX3D_255, + ASSET_TEX3D_256, + ASSET_TEX3D_257, + ASSET_TEX3D_258, + ASSET_TEX3D_259, + ASSET_TEX3D_260, + ASSET_TEX3D_261, + ASSET_TEX3D_262, + ASSET_TEX3D_263, + ASSET_TEX3D_264, + ASSET_TEX3D_265, + ASSET_TEX3D_266, + ASSET_TEX3D_267, + ASSET_TEX3D_268, + ASSET_TEX3D_269, + ASSET_TEX3D_270, + ASSET_TEX3D_271, + ASSET_TEX3D_272, + ASSET_TEX3D_273, + ASSET_TEX3D_274, + ASSET_TEX3D_275, + ASSET_TEX3D_276, + ASSET_TEX3D_277, + ASSET_TEX3D_278, + ASSET_TEX3D_279, + ASSET_TEX3D_280, + ASSET_TEX3D_281, + ASSET_TEX3D_282, + ASSET_TEX3D_283, + ASSET_TEX3D_284, + ASSET_TEX3D_285, + ASSET_TEX3D_286, + ASSET_TEX3D_287, + ASSET_TEX3D_288, + ASSET_TEX3D_289, + ASSET_TEX3D_290, + ASSET_TEX3D_291, + ASSET_TEX3D_292, + ASSET_TEX3D_293, + ASSET_TEX3D_294, + ASSET_TEX3D_295, + ASSET_TEX3D_296, + ASSET_TEX3D_297, + ASSET_TEX3D_298, + ASSET_TEX3D_299, + ASSET_TEX3D_300, + ASSET_TEX3D_301, + ASSET_TEX3D_302, + ASSET_TEX3D_303, + ASSET_TEX3D_304, + ASSET_TEX3D_305, + ASSET_TEX3D_306, + ASSET_TEX3D_307, + ASSET_TEX3D_308, + ASSET_TEX3D_309, + ASSET_TEX3D_310, + ASSET_TEX3D_311, + ASSET_TEX3D_312, + ASSET_TEX3D_313, + ASSET_TEX3D_314, + ASSET_TEX3D_315, + ASSET_TEX3D_316, + ASSET_TEX3D_317, + ASSET_TEX3D_318, + ASSET_TEX3D_319, + ASSET_TEX3D_320, + ASSET_TEX3D_321, + ASSET_TEX3D_322, + ASSET_TEX3D_323, + ASSET_TEX3D_324, + ASSET_TEX3D_325, + ASSET_TEX3D_326, + ASSET_TEX3D_327, + ASSET_TEX3D_328, + ASSET_TEX3D_329, + ASSET_TEX3D_330, + ASSET_TEX3D_331, + ASSET_TEX3D_332, + ASSET_TEX3D_333, + ASSET_TEX3D_334, + ASSET_TEX3D_335, + ASSET_TEX3D_336, + ASSET_TEX3D_337, + ASSET_TEX3D_338, + ASSET_TEX3D_339, + ASSET_TEX3D_340, + ASSET_TEX3D_341, + ASSET_TEX3D_342, + ASSET_TEX3D_343, + ASSET_TEX3D_344, + ASSET_TEX3D_345, + ASSET_TEX3D_346, + ASSET_TEX3D_347, + ASSET_TEX3D_348, + ASSET_TEX3D_349, + ASSET_TEX3D_350, + ASSET_TEX3D_351, + ASSET_TEX3D_352, + ASSET_TEX3D_353, + ASSET_TEX3D_354, + ASSET_TEX3D_355, + ASSET_TEX3D_356, + ASSET_TEX3D_357, + ASSET_TEX3D_358, + ASSET_TEX3D_359, + ASSET_TEX3D_360, + ASSET_TEX3D_361, + ASSET_TEX3D_362, + ASSET_TEX3D_363, + ASSET_TEX3D_364, + ASSET_TEX3D_365, + ASSET_TEX3D_366, + ASSET_TEX3D_367, + ASSET_TEX3D_368, + ASSET_TEX3D_369, + ASSET_TEX3D_370, + ASSET_TEX3D_371, + ASSET_TEX3D_372, + ASSET_TEX3D_373, + ASSET_TEX3D_374, + ASSET_TEX3D_375, + ASSET_TEX3D_376, + ASSET_TEX3D_377, + ASSET_TEX3D_378, + ASSET_TEX3D_379, + ASSET_TEX3D_380, + ASSET_TEX3D_381, + ASSET_TEX3D_382, + ASSET_TEX3D_383, + ASSET_TEX3D_384, + ASSET_TEX3D_385, + ASSET_TEX3D_386, + ASSET_TEX3D_387, + ASSET_TEX3D_388, + ASSET_TEX3D_389, + ASSET_TEX3D_390, + ASSET_TEX3D_391, + ASSET_TEX3D_392, + ASSET_TEX3D_393, + ASSET_TEX3D_394, + ASSET_TEX3D_395, + ASSET_TEX3D_396, + ASSET_TEX3D_397, + ASSET_TEX3D_398, + ASSET_TEX3D_399, + ASSET_TEX3D_400, + ASSET_TEX3D_401, + ASSET_TEX3D_402, + ASSET_TEX3D_403, + ASSET_TEX3D_404, + ASSET_TEX3D_405, + ASSET_TEX3D_406, + ASSET_TEX3D_407, + ASSET_TEX3D_408, + ASSET_TEX3D_409, + ASSET_TEX3D_410, + ASSET_TEX3D_411, + ASSET_TEX3D_412, + ASSET_TEX3D_413, + ASSET_TEX3D_414, + ASSET_TEX3D_415, + ASSET_TEX3D_416, + ASSET_TEX3D_417, + ASSET_TEX3D_418, + ASSET_TEX3D_419, + ASSET_TEX3D_420, + ASSET_TEX3D_421, + ASSET_TEX3D_422, + ASSET_TEX3D_423, + ASSET_TEX3D_424, + ASSET_TEX3D_425, + ASSET_TEX3D_426, + ASSET_TEX3D_427, + ASSET_TEX3D_428, + ASSET_TEX3D_429, + ASSET_TEX3D_430, + ASSET_TEX3D_431, + ASSET_TEX3D_432, + ASSET_TEX3D_433, + ASSET_TEX3D_434, + ASSET_TEX3D_435, + ASSET_TEX3D_436, + ASSET_TEX3D_437, + ASSET_TEX3D_438, + ASSET_TEX3D_439, + ASSET_TEX3D_440, + ASSET_TEX3D_441, + ASSET_TEX3D_442, + ASSET_TEX3D_443, + ASSET_TEX3D_444, + ASSET_TEX3D_445, + ASSET_TEX3D_446, + ASSET_TEX3D_447, + ASSET_TEX3D_448, + ASSET_TEX3D_449, + ASSET_TEX3D_450, + ASSET_TEX3D_451, + ASSET_TEX3D_452, + ASSET_TEX3D_453, + ASSET_TEX3D_454, + ASSET_TEX3D_455, + ASSET_TEX3D_456, + ASSET_TEX3D_457, + ASSET_TEX3D_458, + ASSET_TEX3D_459, + ASSET_TEX3D_460, + ASSET_TEX3D_461, + ASSET_TEX3D_462, + ASSET_TEX3D_463, + ASSET_TEX3D_464, + ASSET_TEX3D_465, + ASSET_TEX3D_466, + ASSET_TEX3D_467, + ASSET_TEX3D_468, + ASSET_TEX3D_469, + ASSET_TEX3D_470, + ASSET_TEX3D_471, + ASSET_TEX3D_472, + ASSET_TEX3D_473, + ASSET_TEX3D_474, + ASSET_TEX3D_475, + ASSET_TEX3D_476, + ASSET_TEX3D_477, + ASSET_TEX3D_478, + ASSET_TEX3D_479, + ASSET_TEX3D_480, + ASSET_TEX3D_481, + ASSET_TEX3D_482, + ASSET_TEX3D_483, + ASSET_TEX3D_484, + ASSET_TEX3D_485, + ASSET_TEX3D_486, + ASSET_TEX3D_487, + ASSET_TEX3D_488, + ASSET_TEX3D_489, + ASSET_TEX3D_490, + ASSET_TEX3D_491, + ASSET_TEX3D_492, + ASSET_TEX3D_493, + ASSET_TEX3D_494, + ASSET_TEX3D_495, + ASSET_TEX3D_496, + ASSET_TEX3D_497, + ASSET_TEX3D_498, + ASSET_TEX3D_499, + ASSET_TEX3D_500, + ASSET_TEX3D_501, + ASSET_TEX3D_502, + ASSET_TEX3D_503, + ASSET_TEX3D_504, + ASSET_TEX3D_505, + ASSET_TEX3D_506, + ASSET_TEX3D_507, + ASSET_TEX3D_508, + ASSET_TEX3D_509, + ASSET_TEX3D_510, + ASSET_TEX3D_511, + ASSET_TEX3D_512, + ASSET_TEX3D_513, + ASSET_TEX3D_514, + ASSET_TEX3D_515, + ASSET_TEX3D_516, + ASSET_TEX3D_517, + ASSET_TEX3D_518, + ASSET_TEX3D_519, + ASSET_TEX3D_520, + ASSET_TEX3D_521, + ASSET_TEX3D_522, + ASSET_TEX3D_523, + ASSET_TEX3D_524, + ASSET_TEX3D_525, + ASSET_TEX3D_526, + ASSET_TEX3D_527, + ASSET_TEX3D_528, + ASSET_TEX3D_529, + ASSET_TEX3D_530, + ASSET_TEX3D_531, + ASSET_TEX3D_532, + ASSET_TEX3D_533, + ASSET_TEX3D_534, + ASSET_TEX3D_535, + ASSET_TEX3D_536, + ASSET_TEX3D_537, + ASSET_TEX3D_538, + ASSET_TEX3D_539, + ASSET_TEX3D_540, + ASSET_TEX3D_541, + ASSET_TEX3D_542, + ASSET_TEX3D_543, + ASSET_TEX3D_544, + ASSET_TEX3D_545, + ASSET_TEX3D_546, + ASSET_TEX3D_547, + ASSET_TEX3D_548, + ASSET_TEX3D_549, + ASSET_TEX3D_550, + ASSET_TEX3D_551, + ASSET_TEX3D_552, + ASSET_TEX3D_553, + ASSET_TEX3D_554, + ASSET_TEX3D_555, + ASSET_TEX3D_556, + ASSET_TEX3D_557, + ASSET_TEX3D_558, + ASSET_TEX3D_559, + ASSET_TEX3D_560, + ASSET_TEX3D_561, + ASSET_TEX3D_562, + ASSET_TEX3D_563, + ASSET_TEX3D_564, + ASSET_TEX3D_565, + ASSET_TEX3D_566, + ASSET_TEX3D_567, + ASSET_TEX3D_568, + ASSET_TEX3D_569, + ASSET_TEX3D_570, + ASSET_TEX3D_571, + ASSET_TEX3D_572, + ASSET_TEX3D_573, + ASSET_TEX3D_574, + ASSET_TEX3D_575, + ASSET_TEX3D_576, + ASSET_TEX3D_577, + ASSET_TEX3D_578, + ASSET_TEX3D_579, + ASSET_TEX3D_580, + ASSET_TEX3D_581, + ASSET_TEX3D_582, + ASSET_TEX3D_583, + ASSET_TEX3D_584, + ASSET_TEX3D_585, + ASSET_TEX3D_586, + ASSET_TEX3D_587, + ASSET_TEX3D_588, + ASSET_TEX3D_589, + ASSET_TEX3D_590, + ASSET_TEX3D_591, + ASSET_TEX3D_592, + ASSET_TEX3D_593, + ASSET_TEX3D_594, + ASSET_TEX3D_595, + ASSET_TEX3D_596, + ASSET_TEX3D_597, + ASSET_TEX3D_598, + ASSET_TEX3D_599, + ASSET_TEX3D_600, + ASSET_TEX3D_601, + ASSET_TEX3D_602, + ASSET_TEX3D_603, + ASSET_TEX3D_604, + ASSET_TEX3D_605, + ASSET_TEX3D_606, + ASSET_TEX3D_607, + ASSET_TEX3D_608, + ASSET_TEX3D_609, + ASSET_TEX3D_610, + ASSET_TEX3D_611, + ASSET_TEX3D_612, + ASSET_TEX3D_613, + ASSET_TEX3D_614, + ASSET_TEX3D_615, + ASSET_TEX3D_616, + ASSET_TEX3D_617, + ASSET_TEX3D_618, + ASSET_TEX3D_619, + ASSET_TEX3D_620, + ASSET_TEX3D_621, + ASSET_TEX3D_622, + ASSET_TEX3D_623, + ASSET_TEX3D_624, + ASSET_TEX3D_625, + ASSET_TEX3D_626, + ASSET_TEX3D_627, + ASSET_TEX3D_628, + ASSET_TEX3D_629, + ASSET_TEX3D_630, + ASSET_TEX3D_631, + ASSET_TEX3D_632, + ASSET_TEX3D_633, + ASSET_TEX3D_634, + ASSET_TEX3D_635, + ASSET_TEX3D_636, + ASSET_TEX3D_637, + ASSET_TEX3D_638, + ASSET_TEX3D_639, + ASSET_TEX3D_640, + ASSET_TEX3D_641, + ASSET_TEX3D_642, + ASSET_TEX3D_643, + ASSET_TEX3D_644, + ASSET_TEX3D_645, + ASSET_TEX3D_646, + ASSET_TEX3D_647, + ASSET_TEX3D_648, + ASSET_TEX3D_649, + ASSET_TEX3D_650, + ASSET_TEX3D_651, + ASSET_TEX3D_652, + ASSET_TEX3D_653, + ASSET_TEX3D_654, + ASSET_TEX3D_655, + ASSET_TEX3D_656, + ASSET_TEX3D_657, + ASSET_TEX3D_658, + ASSET_TEX3D_659, + ASSET_TEX3D_660, + ASSET_TEX3D_661, + ASSET_TEX3D_662, + ASSET_TEX3D_663, + ASSET_TEX3D_664, + ASSET_TEX3D_665, + ASSET_TEX3D_666, + ASSET_TEX3D_667, + ASSET_TEX3D_668, + ASSET_TEX3D_669, + ASSET_TEX3D_670, + ASSET_TEX3D_671, + ASSET_TEX3D_672, + ASSET_TEX3D_673, + ASSET_TEX3D_674, + ASSET_TEX3D_675, + ASSET_TEX3D_676, + ASSET_TEX3D_677, + ASSET_TEX3D_678, + ASSET_TEX3D_679, + ASSET_TEX3D_680, + ASSET_TEX3D_681, + ASSET_TEX3D_682, + ASSET_TEX3D_683, + ASSET_TEX3D_684, + ASSET_TEX3D_685, + ASSET_TEX3D_686, + ASSET_TEX3D_687, + ASSET_TEX3D_688, + ASSET_TEX3D_689, + ASSET_TEX3D_690, + ASSET_TEX3D_691, + ASSET_TEX3D_692, + ASSET_TEX3D_693, + ASSET_TEX3D_694, + ASSET_TEX3D_695, + ASSET_TEX3D_696, + ASSET_TEX3D_697, + ASSET_TEX3D_698, + ASSET_TEX3D_699, + ASSET_TEX3D_700, + ASSET_TEX3D_701, + ASSET_TEX3D_702, + ASSET_TEX3D_703, + ASSET_TEX3D_704, + ASSET_TEX3D_705, + ASSET_TEX3D_706, + ASSET_TEX3D_707, + ASSET_TEX3D_708, + ASSET_TEX3D_709, + ASSET_TEX3D_710, + ASSET_TEX3D_711, + ASSET_TEX3D_712, + ASSET_TEX3D_713, + ASSET_TEX3D_714, + ASSET_TEX3D_715, + ASSET_TEX3D_716, + ASSET_TEX3D_717, + ASSET_TEX3D_718, + ASSET_TEX3D_719, + ASSET_TEX3D_720, + ASSET_TEX3D_721, + ASSET_TEX3D_722, + ASSET_TEX3D_723, + ASSET_TEX3D_724, + ASSET_TEX3D_725, + ASSET_TEX3D_726, + ASSET_TEX3D_727, + ASSET_TEX3D_728, + ASSET_TEX3D_729, + ASSET_TEX3D_730, + ASSET_TEX3D_731, + ASSET_TEX3D_732, + ASSET_TEX3D_733, + ASSET_TEX3D_734, + ASSET_TEX3D_735, + ASSET_TEX3D_736, + ASSET_TEX3D_737, + ASSET_TEX3D_738, + ASSET_TEX3D_739, + ASSET_TEX3D_740, + ASSET_TEX3D_741, + ASSET_TEX3D_742, + ASSET_TEX3D_743, + ASSET_TEX3D_744, + ASSET_TEX3D_745, + ASSET_TEX3D_746, + ASSET_TEX3D_747, + ASSET_TEX3D_748, + ASSET_TEX3D_749, + ASSET_TEX3D_750, + ASSET_TEX3D_751, + ASSET_TEX3D_752, + ASSET_TEX3D_753, + ASSET_TEX3D_754, + ASSET_TEX3D_755, + ASSET_TEX3D_756, + ASSET_TEX3D_757, + ASSET_TEX3D_758, + ASSET_TEX3D_759, + ASSET_TEX3D_760, + ASSET_TEX3D_761, + ASSET_TEX3D_762, + ASSET_TEX3D_763, + ASSET_TEX3D_764, + ASSET_TEX3D_765, + ASSET_TEX3D_766, + ASSET_TEX3D_767, + ASSET_TEX3D_768, + ASSET_TEX3D_769, + ASSET_TEX3D_770, + ASSET_TEX3D_771, + ASSET_TEX3D_772, + ASSET_TEX3D_773, + ASSET_TEX3D_774, + ASSET_TEX3D_775, + ASSET_TEX3D_776, + ASSET_TEX3D_777, + ASSET_TEX3D_778, + ASSET_TEX3D_779, + ASSET_TEX3D_780, + ASSET_TEX3D_781, + ASSET_TEX3D_782, + ASSET_TEX3D_783, + ASSET_TEX3D_784, + ASSET_TEX3D_785, + ASSET_TEX3D_786, + ASSET_TEX3D_787, + ASSET_TEX3D_788, + ASSET_TEX3D_789, + ASSET_TEX3D_790, + ASSET_TEX3D_791, + ASSET_TEX3D_792, + ASSET_TEX3D_793, + ASSET_TEX3D_794, + ASSET_TEX3D_795, + ASSET_TEX3D_796, + ASSET_TEX3D_797, + ASSET_TEX3D_798, + ASSET_TEX3D_799, + ASSET_TEX3D_800, + ASSET_TEX3D_801, + ASSET_TEX3D_802, + ASSET_TEX3D_803, + ASSET_TEX3D_804, + ASSET_TEX3D_805, + ASSET_TEX3D_806, + ASSET_TEX3D_807, + ASSET_TEX3D_808, + ASSET_TEX3D_809, + ASSET_TEX3D_810, + ASSET_TEX3D_811, + ASSET_TEX3D_812, + ASSET_TEX3D_813, + ASSET_TEX3D_814, + ASSET_TEX3D_815, + ASSET_TEX3D_816, + ASSET_TEX3D_817, + ASSET_TEX3D_818, + ASSET_TEX3D_819, + ASSET_TEX3D_820, + ASSET_TEX3D_821, + ASSET_TEX3D_822, + ASSET_TEX3D_823, + ASSET_TEX3D_824, + ASSET_TEX3D_825, + ASSET_TEX3D_826, + ASSET_TEX3D_827, + ASSET_TEX3D_828, + ASSET_TEX3D_829, + ASSET_TEX3D_830, + ASSET_TEX3D_831, + ASSET_TEX3D_832, + ASSET_TEX3D_833, + ASSET_TEX3D_834, + ASSET_TEX3D_835, + ASSET_TEX3D_836, + ASSET_TEX3D_837, + ASSET_TEX3D_838, + ASSET_TEX3D_839, + ASSET_TEX3D_840, + ASSET_TEX3D_841, + ASSET_TEX3D_842, + ASSET_TEX3D_843, + ASSET_TEX3D_844, + ASSET_TEX3D_845, + ASSET_TEX3D_846, + ASSET_TEX3D_847, + ASSET_TEX3D_848, + ASSET_TEX3D_849, + ASSET_TEX3D_850, + ASSET_TEX3D_851, + ASSET_TEX3D_852, + ASSET_TEX3D_853, + ASSET_TEX3D_854, + ASSET_TEX3D_855, + ASSET_TEX3D_856, + ASSET_TEX3D_857, + ASSET_TEX3D_858, + ASSET_TEX3D_859, + ASSET_TEX3D_860, + ASSET_TEX3D_861, + ASSET_TEX3D_862, + ASSET_TEX3D_863, + ASSET_TEX3D_864, + ASSET_TEX3D_865, + ASSET_TEX3D_866, + ASSET_TEX3D_867, + ASSET_TEX3D_868, + ASSET_TEX3D_869, + ASSET_TEX3D_870, + ASSET_TEX3D_871, + ASSET_TEX3D_872, + ASSET_TEX3D_873, + ASSET_TEX3D_874, + ASSET_TEX3D_875, + ASSET_TEX3D_876, + ASSET_TEX3D_877, + ASSET_TEX3D_878, + ASSET_TEX3D_879, + ASSET_TEX3D_880, + ASSET_TEX3D_881, + ASSET_TEX3D_882, + ASSET_TEX3D_883, + ASSET_TEX3D_884, + ASSET_TEX3D_885, + ASSET_TEX3D_886, + ASSET_TEX3D_887, + ASSET_TEX3D_888, + ASSET_TEX3D_889, + ASSET_TEX3D_890, + ASSET_TEX3D_891, + ASSET_TEX3D_892, + ASSET_TEX3D_893, + ASSET_TEX3D_894, + ASSET_TEX3D_895, + ASSET_TEX3D_896, + ASSET_TEX3D_897, + ASSET_TEX3D_898, + ASSET_TEX3D_899, + ASSET_TEX3D_900, + ASSET_TEX3D_901, + ASSET_TEX3D_902, + ASSET_TEX3D_903, + ASSET_TEX3D_904, + ASSET_TEX3D_905, + ASSET_TEX3D_906, + ASSET_TEX3D_907, + ASSET_TEX3D_908, + ASSET_TEX3D_909, + ASSET_TEX3D_910, + ASSET_TEX3D_911, + ASSET_TEX3D_912, + ASSET_TEX3D_913, + ASSET_TEX3D_914, + ASSET_TEX3D_915, + ASSET_TEX3D_916, + ASSET_TEX3D_917, + ASSET_TEX3D_918, + ASSET_TEX3D_919, + ASSET_TEX3D_920, + ASSET_TEX3D_921, + ASSET_TEX3D_922, + ASSET_TEX3D_923, + ASSET_TEX3D_924, + ASSET_TEX3D_925, + ASSET_TEX3D_926, + ASSET_TEX3D_927, + ASSET_TEX3D_928, + ASSET_TEX3D_929, + ASSET_TEX3D_930, + ASSET_TEX3D_931, + ASSET_TEX3D_932, + ASSET_TEX3D_933, + ASSET_TEX3D_934, + ASSET_TEX3D_935, + ASSET_TEX3D_936, + ASSET_TEX3D_937, + ASSET_TEX3D_938, + ASSET_TEX3D_939, + ASSET_TEX3D_940, + ASSET_TEX3D_941, + ASSET_TEX3D_942, + ASSET_TEX3D_943, + ASSET_TEX3D_944, + ASSET_TEX3D_945, + ASSET_TEX3D_946, + ASSET_TEX3D_947, + ASSET_TEX3D_948, + ASSET_TEX3D_949, + ASSET_TEX3D_950, + ASSET_TEX3D_951, + ASSET_TEX3D_952, + ASSET_TEX3D_953, + ASSET_TEX3D_954, + ASSET_TEX3D_955, + ASSET_TEX3D_956, + ASSET_TEX3D_957, + ASSET_TEX3D_958, + ASSET_TEX3D_959, + ASSET_TEX3D_960, + ASSET_TEX3D_961, + ASSET_TEX3D_962, + ASSET_TEX3D_963, + ASSET_TEX3D_964, + ASSET_TEX3D_965, + ASSET_TEX3D_966, + ASSET_TEX3D_967, + ASSET_TEX3D_968, + ASSET_TEX3D_969, + ASSET_TEX3D_970, + ASSET_TEX3D_971, + ASSET_TEX3D_972, + ASSET_TEX3D_973, + ASSET_TEX3D_974, + ASSET_TEX3D_975, + ASSET_TEX3D_976, + ASSET_TEX3D_977, + ASSET_TEX3D_978, + ASSET_TEX3D_979, + ASSET_TEX3D_980, + ASSET_TEX3D_981, + ASSET_TEX3D_982, + ASSET_TEX3D_983, + ASSET_TEX3D_984, + ASSET_TEX3D_985, + ASSET_TEX3D_986, + ASSET_TEX3D_987, + ASSET_TEX3D_988, + ASSET_TEX3D_989, + ASSET_TEX3D_990, + ASSET_TEX3D_991, + ASSET_TEX3D_992, + ASSET_TEX3D_993, + ASSET_TEX3D_994, + ASSET_TEX3D_995, + ASSET_TEX3D_996, + ASSET_TEX3D_997, + ASSET_TEX3D_998, + ASSET_TEX3D_999, + ASSET_TEX3D_1000, + ASSET_TEX3D_1001, + ASSET_TEX3D_1002, + ASSET_TEX3D_1003, + ASSET_TEX3D_1004, + ASSET_TEX3D_1005, + ASSET_TEX3D_1006, + ASSET_TEX3D_1007, + ASSET_TEX3D_1008, + ASSET_TEX3D_1009, + ASSET_TEX3D_1010, + ASSET_TEX3D_1011, + ASSET_TEX3D_1012, + ASSET_TEX3D_1013, + ASSET_TEX3D_1014, + ASSET_TEX3D_1015, + ASSET_TEX3D_1016, + ASSET_TEX3D_1017, + ASSET_TEX3D_1018, + ASSET_TEX3D_1019, + ASSET_TEX3D_1020, + ASSET_TEX3D_1021, + ASSET_TEX3D_1022, + ASSET_TEX3D_1023, + ASSET_TEX3D_1024, + ASSET_TEX3D_1025, + ASSET_TEX3D_1026, + ASSET_TEX3D_1027, + ASSET_TEX3D_1028, + ASSET_TEX3D_1029, + ASSET_TEX3D_1030, + ASSET_TEX3D_1031, + ASSET_TEX3D_1032, + ASSET_TEX3D_1033, + ASSET_TEX3D_1034, + ASSET_TEX3D_1035, + ASSET_TEX3D_1036, + ASSET_TEX3D_1037, + ASSET_TEX3D_1038, + ASSET_TEX3D_1039, + ASSET_TEX3D_1040, + ASSET_TEX3D_1041, + ASSET_TEX3D_1042, + ASSET_TEX3D_1043, + ASSET_TEX3D_1044, + ASSET_TEX3D_1045, + ASSET_TEX3D_1046, + ASSET_TEX3D_1047, + ASSET_TEX3D_1048, + ASSET_TEX3D_1049, + ASSET_TEX3D_1050, + ASSET_TEX3D_1051, + ASSET_TEX3D_1052, + ASSET_TEX3D_1053, + ASSET_TEX3D_1054, + ASSET_TEX3D_1055, + ASSET_TEX3D_1056, + ASSET_TEX3D_1057, + ASSET_TEX3D_1058, + ASSET_TEX3D_1059, + ASSET_TEX3D_1060, + ASSET_TEX3D_1061, + ASSET_TEX3D_1062, + ASSET_TEX3D_1063, + ASSET_TEX3D_1064, + ASSET_TEX3D_1065, + ASSET_TEX3D_1066, + ASSET_TEX3D_1067, + ASSET_TEX3D_1068, + ASSET_TEX3D_1069, + ASSET_TEX3D_1070, + ASSET_TEX3D_1071, + ASSET_TEX3D_1072, + ASSET_TEX3D_1073, + ASSET_TEX3D_1074, + ASSET_TEX3D_1075, + ASSET_TEX3D_1076, + ASSET_TEX3D_1077, + ASSET_TEX3D_1078, + ASSET_TEX3D_1079, + ASSET_TEX3D_1080, + ASSET_TEX3D_1081, + ASSET_TEX3D_1082, + ASSET_TEX3D_1083, + ASSET_TEX3D_1084, + ASSET_TEX3D_1085, + ASSET_TEX3D_1086, + ASSET_TEX3D_1087, + ASSET_TEX3D_1088, + ASSET_TEX3D_1089, + ASSET_TEX3D_1090, + ASSET_TEX3D_1091, + ASSET_TEX3D_1092, + ASSET_TEX3D_1093, + ASSET_TEX3D_1094, + ASSET_TEX3D_1095, + ASSET_TEX3D_1096, + ASSET_TEX3D_1097, + ASSET_TEX3D_1098, + ASSET_TEX3D_1099, + ASSET_TEX3D_1100, + ASSET_TEX3D_1101, + ASSET_TEX3D_1102, + ASSET_TEX3D_1103, + ASSET_TEX3D_1104, + ASSET_TEX3D_1105, + ASSET_TEX3D_1106, + ASSET_TEX3D_1107, + ASSET_TEX3D_1108, + ASSET_TEX3D_1109, + ASSET_TEX3D_1110, + ASSET_TEX3D_1111, + ASSET_TEX3D_1112, + ASSET_TEX3D_1113, + ASSET_TEX3D_1114, + ASSET_TEX3D_1115, + ASSET_TEX3D_1116, + ASSET_TEX3D_1117, + ASSET_TEX3D_1118, + ASSET_TEX3D_1119, + ASSET_TEX3D_1120, + ASSET_TEX3D_1121, + ASSET_TEX3D_1122, + ASSET_TEX3D_1123, + ASSET_TEX3D_1124, + ASSET_TEX3D_1125, + ASSET_TEX3D_1126, + ASSET_TEX3D_1127, + ASSET_TEX3D_1128, + ASSET_TEX3D_1129, + ASSET_TEX3D_1130, + ASSET_TEX3D_1131, + ASSET_TEX3D_1132, + ASSET_TEX3D_1133, + ASSET_TEX3D_1134, + ASSET_TEX3D_1135, + ASSET_TEX3D_1136, + ASSET_TEX3D_1137, + ASSET_TEX3D_1138, + ASSET_TEX3D_1139, + ASSET_TEX3D_1140, + ASSET_TEX3D_1141, + ASSET_TEX3D_1142, + ASSET_TEX3D_1143, + ASSET_TEX3D_1144, + ASSET_TEX3D_1145, + ASSET_TEX3D_1146, + ASSET_TEX3D_1147, + ASSET_TEX3D_1148, + ASSET_TEX3D_1149, + ASSET_TEX3D_1150, + ASSET_TEX3D_1151, + ASSET_TEX3D_1152, + ASSET_TEX3D_1153, + ASSET_TEX3D_1154, + ASSET_TEX3D_1155, + ASSET_TEX3D_1156, + ASSET_TEX3D_1157, + ASSET_TEX3D_1158, + ASSET_TEX3D_1159, + ASSET_TEX3D_1160, + ASSET_TEX3D_1161, + ASSET_TEX3D_1162, + ASSET_TEX3D_1163, + ASSET_TEX3D_1164, + ASSET_TEX3D_1165, + ASSET_TEX3D_1166, + ASSET_TEX3D_1167, + ASSET_TEX3D_1168, + ASSET_TEX3D_1169, + ASSET_TEX3D_1170, + ASSET_TEX3D_1171, + ASSET_TEX3D_1172, + ASSET_TEX3D_1173, + ASSET_TEX3D_1174, + ASSET_TEX3D_1175, + ASSET_TEX3D_1176, + ASSET_TEX3D_1177, + ASSET_TEX3D_1178, + ASSET_TEX3D_1179, + ASSET_TEX3D_1180, + ASSET_TEX3D_1181, + ASSET_TEX3D_1182, + ASSET_TEX3D_1183, + ASSET_TEX3D_1184, + ASSET_TEX3D_1185, + ASSET_TEX3D_1186, + ASSET_TEX3D_1187, + ASSET_TEX3D_1188, + ASSET_TEX3D_1189, + ASSET_TEX3D_1190, + ASSET_TEX3D_1191, + ASSET_TEX3D_1192, + ASSET_TEX3D_1193, + ASSET_TEX3D_1194, + ASSET_TEX3D_1195, + ASSET_TEX3D_1196, + ASSET_TEX3D_1197, + ASSET_TEX3D_1198, + ASSET_TEX3D_1199, + ASSET_TEX3D_1200, + ASSET_TEX3D_1201, + ASSET_TEX3D_1202, + ASSET_TEX3D_1203, + ASSET_TEX3D_1204, + ASSET_TEX3D_1205, + ASSET_TEX3D_1206, + ASSET_TEX3D_1207, + ASSET_TEX3D_1208, + ASSET_TEX3D_1209, + ASSET_TEX3D_1210, + ASSET_TEX3D_1211, + ASSET_TEX3D_1212, + ASSET_TEX3D_1213, + ASSET_TEX3D_1214, + ASSET_TEX3D_1215, + ASSET_TEX3D_1216, + ASSET_TEX3D_1217, + ASSET_TEX3D_1218, + ASSET_TEX3D_1219, + ASSET_TEX3D_1220, + ASSET_TEX3D_1221, + ASSET_TEX3D_1222, + ASSET_TEX3D_1223, + ASSET_TEX3D_1224, + ASSET_TEX3D_1225, + ASSET_TEX3D_1226, + ASSET_TEX3D_1227, + ASSET_TEX3D_1228, + ASSET_TEX3D_1229, + ASSET_TEX3D_1230, + ASSET_TEX3D_1231, + ASSET_TEX3D_1232, + ASSET_TEX3D_1233, + ASSET_TEX3D_1234, + ASSET_TEX3D_1235, + ASSET_TEX3D_1236, + ASSET_TEX3D_1237, + ASSET_TEX3D_1238, + ASSET_TEX3D_1239, + ASSET_TEX3D_1240, + ASSET_TEX3D_1241, + ASSET_TEX3D_1242, + ASSET_TEX3D_1243, + ASSET_TEX3D_1244, + ASSET_TEX3D_1245, + ASSET_TEX3D_1246, + ASSET_TEX3D_1247, + ASSET_TEX3D_1248, + ASSET_TEX3D_1249, + ASSET_TEX3D_1250, + ASSET_TEX3D_1251, + ASSET_TEX3D_1252, + ASSET_TEX3D_1253, + ASSET_TEX3D_1254, + ASSET_TEX3D_1255, + ASSET_TEX3D_1256, + ASSET_TEX3D_1257, + ASSET_TEX3D_1258, + ASSET_TEX3D_1259, + ASSET_TEX3D_1260, + ASSET_TEX3D_1261, + ASSET_TEX3D_1262, + ASSET_TEX3D_1263, + ASSET_TEX3D_1264, + ASSET_TEX3D_1265, + ASSET_TEX3D_1266, + ASSET_TEX3D_1267, + ASSET_TEX3D_1268, + ASSET_TEX3D_1269, + ASSET_TEX3D_1270, + ASSET_TEX3D_1271, + ASSET_TEX3D_1272, + ASSET_TEX3D_1273, + ASSET_TEX3D_1274, + ASSET_TEX3D_1275, + ASSET_TEX3D_1276, + ASSET_TEX3D_1277, + ASSET_TEX3D_1278, + ASSET_TEX3D_1279, + ASSET_TEX3D_1280, + ASSET_TEX3D_1281, + ASSET_TEX3D_1282, + ASSET_TEX3D_1283, + ASSET_TEX3D_1284, + ASSET_TEX3D_1285, + ASSET_TEX3D_1286, + ASSET_TEX3D_1287, + ASSET_TEX3D_1288, + ASSET_TEX3D_1289, + ASSET_TEX3D_1290, + ASSET_TEX3D_1291, + ASSET_TEX3D_1292, + ASSET_TEX3D_1293, + ASSET_TEX3D_1294, + ASSET_TEX3D_1295, + ASSET_TEX3D_1296, + ASSET_TEX3D_1297, + ASSET_TEX3D_1298, + ASSET_TEX3D_1299, + ASSET_TEX3D_1300, + ASSET_TEX3D_1301, + ASSET_TEX3D_1302, + ASSET_TEX3D_1303, + ASSET_TEX3D_1304, + ASSET_TEX3D_1305, + ASSET_TEX3D_1306, + ASSET_TEX3D_1307, + ASSET_TEX3D_1308, + ASSET_TEX3D_1309, + ASSET_TEX3D_1310, + ASSET_TEX3D_1311, + ASSET_TEX3D_1312, + ASSET_TEX3D_1313, + ASSET_TEX3D_1314, + ASSET_TEX3D_1315, + ASSET_TEX3D_1316, + ASSET_TEX3D_1317, + ASSET_TEX3D_1318, + ASSET_TEX3D_1319, + ASSET_TEX3D_1320, + ASSET_TEX3D_1321, + ASSET_TEX3D_1322, + ASSET_TEX3D_1323, + ASSET_TEX3D_1324, + ASSET_TEX3D_1325, + ASSET_TEX3D_1326, + ASSET_TEX3D_1327, + ASSET_TEX3D_1328, + ASSET_TEX3D_1329, + ASSET_TEX3D_1330, + ASSET_TEX3D_1331, + ASSET_TEX3D_1332, + ASSET_TEX3D_1333, + ASSET_TEX3D_1334, + ASSET_TEX3D_1335, + ASSET_TEX3D_1336, + ASSET_TEX3D_1337, + ASSET_TEX3D_1338, + ASSET_TEX3D_1339, + ASSET_TEX3D_1340, + ASSET_TEX3D_1341, + ASSET_TEX3D_1342, + ASSET_TEX3D_1343, + ASSET_TEX3D_1344, + ASSET_TEX3D_1345, + ASSET_TEX3D_1346, + ASSET_TEX3D_1347, + ASSET_TEX3D_1348, + ASSET_TEX3D_1349, + ASSET_TEX3D_1350, + ASSET_TEX3D_1351, + ASSET_TEX3D_1352, + ASSET_TEX3D_1353, + ASSET_TEX3D_1354, + ASSET_TEX3D_1355, + ASSET_TEX3D_1356, + ASSET_TEX3D_1357, + ASSET_TEX3D_1358, + ASSET_TEX3D_1359, + ASSET_TEX3D_1360, + ASSET_TEX3D_1361, + ASSET_TEX3D_1362, + ASSET_TEX3D_1363, + ASSET_TEX3D_1364, + ASSET_TEX3D_1365, + ASSET_TEX3D_1366, + ASSET_TEX3D_1367, + ASSET_TEX3D_1368, + ASSET_TEX3D_1369, + ASSET_TEX3D_1370, + ASSET_TEX3D_1371, + ASSET_TEX3D_1372, + ASSET_TEX3D_1373, + ASSET_TEX3D_1374, + ASSET_TEX3D_1375, + ASSET_TEX3D_1376, + ASSET_TEX3D_1377, + ASSET_TEX3D_1378, + ASSET_TEX3D_1379, + ASSET_TEX3D_1380, + ASSET_TEX3D_1381, + ASSET_TEX3D_1382, + ASSET_TEX3D_1383, + ASSET_TEX3D_1384, + ASSET_TEX3D_1385, + ASSET_TEX3D_1386, + ASSET_TEX3D_1387, + ASSET_TEX3D_1388, + ASSET_TEX3D_1389, + ASSET_TEX3D_1390, + ASSET_TEX3D_1391, + ASSET_TEX3D_1392, + ASSET_TEX3D_1393, + ASSET_TEX3D_1394, + ASSET_TEX3D_1395, + ASSET_TEX3D_1396, + ASSET_TEX3D_1397, + ASSET_TEX3D_1398, + ASSET_TEX3D_1399, + ASSET_TEX3D_1400 +} AssetTextures3dEnum; + +/********** ASSET_TEXTURES_2D **********/ + +typedef enum { + ASSET_TEX2D_SMALLFONT_0, + ASSET_TEX2D_SMALLFONT_1, + ASSET_TEX2D_SMALLFONT_2, + ASSET_TEX2D_3, + ASSET_TEX2D_4, + ASSET_TEX2D_5, + ASSET_TEX2D_6, + ASSET_TEX2D_7, + ASSET_TEX2D_8, + ASSET_TEX2D_9, + ASSET_TEX2D_10, + ASSET_TEX2D_11, + ASSET_TEX2D_12, + ASSET_TEX2D_13, + ASSET_TEX2D_14, + ASSET_TEX2D_15, + ASSET_TEX2D_16, + ASSET_TEX2D_17, + ASSET_TEX2D_18, + ASSET_TEX2D_19, + ASSET_TEX2D_20, + ASSET_TEX2D_21, + ASSET_TEX2D_22, + ASSET_TEX2D_23, + ASSET_TEX2D_24, + ASSET_TEX2D_25, + ASSET_TEX2D_26, + ASSET_TEX2D_27, + ASSET_TEX2D_28, + ASSET_TEX2D_29, + ASSET_TEX2D_30, + ASSET_TEX2D_31, + ASSET_TEX2D_32, + ASSET_TEX2D_33, + ASSET_TEX2D_34, + ASSET_TEX2D_35, + ASSET_TEX2D_36, + ASSET_TEX2D_37, + ASSET_TEX2D_38, + ASSET_TEX2D_39, + ASSET_TEX2D_40, + ASSET_TEX2D_41, + ASSET_TEX2D_42, + ASSET_TEX2D_43, + ASSET_TEX2D_44, + ASSET_TEX2D_45, + ASSET_TEX2D_46, + ASSET_TEX2D_47, + ASSET_TEX2D_48, + ASSET_TEX2D_49, + ASSET_TEX2D_50, + ASSET_TEX2D_51, + ASSET_TEX2D_52, + ASSET_TEX2D_53, + ASSET_TEX2D_54, + ASSET_TEX2D_55, + ASSET_TEX2D_56, + ASSET_TEX2D_57, + ASSET_TEX2D_58, + ASSET_TEX2D_59, + ASSET_TEX2D_60, + ASSET_TEX2D_61, + ASSET_TEX2D_62, + ASSET_TEX2D_63, + ASSET_TEX2D_64, + ASSET_TEX2D_65, + ASSET_TEX2D_66, + ASSET_TEX2D_67, + ASSET_TEX2D_68, + ASSET_TEX2D_69, + ASSET_TEX2D_70, + ASSET_TEX2D_71, + ASSET_TEX2D_72, + ASSET_TEX2D_73, + ASSET_TEX2D_74, + ASSET_TEX2D_75, + ASSET_TEX2D_76, + ASSET_TEX2D_77, + ASSET_TEX2D_78, + ASSET_TEX2D_79, + ASSET_TEX2D_80, + ASSET_TEX2D_81, + ASSET_TEX2D_82, + ASSET_TEX2D_83, + ASSET_TEX2D_84, + ASSET_TEX2D_85, + ASSET_TEX2D_86, + ASSET_TEX2D_87, + ASSET_TEX2D_88, + ASSET_TEX2D_FUNFONT_0, + ASSET_TEX2D_FUNFONT_1, + ASSET_TEX2D_FUNFONT_2, + ASSET_TEX2D_FUNFONT_3, + ASSET_TEX2D_FUNFONT_4, + ASSET_TEX2D_FUNFONT_5, + ASSET_TEX2D_95, + ASSET_TEX2D_96, + ASSET_TEX2D_97, + ASSET_TEX2D_98, + ASSET_TEX2D_99, + ASSET_TEX2D_100, + ASSET_TEX2D_101, + ASSET_TEX2D_102, + ASSET_TEX2D_103, + ASSET_TEX2D_104, + ASSET_TEX2D_105, + ASSET_TEX2D_106, + ASSET_TEX2D_107, + ASSET_TEX2D_108, + ASSET_TEX2D_109, + ASSET_TEX2D_110, + ASSET_TEX2D_111, + ASSET_TEX2D_112, + ASSET_TEX2D_113, + ASSET_TEX2D_114, + ASSET_TEX2D_115, + ASSET_TEX2D_116, + ASSET_TEX2D_117, + ASSET_TEX2D_118, + ASSET_TEX2D_119, + ASSET_TEX2D_120, + ASSET_TEX2D_121, + ASSET_TEX2D_122, + ASSET_TEX2D_123, + ASSET_TEX2D_124, + ASSET_TEX2D_125, + ASSET_TEX2D_126, + ASSET_TEX2D_127, + ASSET_TEX2D_128, + ASSET_TEX2D_129, + ASSET_TEX2D_130, + ASSET_TEX2D_131, + ASSET_TEX2D_132, + ASSET_TEX2D_133, + ASSET_TEX2D_134, + ASSET_TEX2D_135, + ASSET_TEX2D_136, + ASSET_TEX2D_137, + ASSET_TEX2D_138, + ASSET_TEX2D_139, + ASSET_TEX2D_140, + ASSET_TEX2D_141, + ASSET_TEX2D_142, + ASSET_TEX2D_143, + ASSET_TEX2D_144, + ASSET_TEX2D_145, + ASSET_TEX2D_146, + ASSET_TEX2D_147, + ASSET_TEX2D_148, + ASSET_TEX2D_149, + ASSET_TEX2D_150, + ASSET_TEX2D_151, + ASSET_TEX2D_152, + ASSET_TEX2D_153, + ASSET_TEX2D_154, + ASSET_TEX2D_155, + ASSET_TEX2D_156, + ASSET_TEX2D_157, + ASSET_TEX2D_158, + ASSET_TEX2D_SUBTITLEFONT_0, + ASSET_TEX2D_SUBTITLEFONT_1, + ASSET_TEX2D_SUBTITLEFONT_2, + ASSET_TEX2D_BIGFONT_A, + ASSET_TEX2D_BIGFONT_B, + ASSET_TEX2D_BIGFONT_C, + ASSET_TEX2D_BIGFONT_D, + ASSET_TEX2D_BIGFONT_E, + ASSET_TEX2D_BIGFONT_F, + ASSET_TEX2D_BIGFONT_G, + ASSET_TEX2D_BIGFONT_H, + ASSET_TEX2D_BIGFONT_I, + ASSET_TEX2D_BIGFONT_J, + ASSET_TEX2D_BIGFONT_K, + ASSET_TEX2D_BIGFONT_L, + ASSET_TEX2D_BIGFONT_M, + ASSET_TEX2D_BIGFONT_N, + ASSET_TEX2D_BIGFONT_O, + ASSET_TEX2D_BIGFONT_P, + ASSET_TEX2D_BIGFONT_Q, + ASSET_TEX2D_BIGFONT_R, + ASSET_TEX2D_BIGFONT_S, + ASSET_TEX2D_BIGFONT_T, + ASSET_TEX2D_BIGFONT_U, + ASSET_TEX2D_BIGFONT_V, + ASSET_TEX2D_BIGFONT_W, + ASSET_TEX2D_BIGFONT_X, + ASSET_TEX2D_BIGFONT_Y, + ASSET_TEX2D_BIGFONT_Z, + ASSET_TEX2D_BIGFONT_QUESTIONMARK, + ASSET_TEX2D_BIGFONT_PERIOD, + ASSET_TEX2D_190, + ASSET_TEX2D_191, + ASSET_TEX2D_192, + ASSET_TEX2D_193, + ASSET_TEX2D_194, + ASSET_TEX2D_195, + ASSET_TEX2D_196, + ASSET_TEX2D_197, + ASSET_TEX2D_198, + ASSET_TEX2D_199, + ASSET_TEX2D_200, + ASSET_TEX2D_201, + ASSET_TEX2D_202, + ASSET_TEX2D_203, + ASSET_TEX2D_204, + ASSET_TEX2D_205, + ASSET_TEX2D_206, + ASSET_TEX2D_207, + ASSET_TEX2D_208, + ASSET_TEX2D_209, + ASSET_TEX2D_210, + ASSET_TEX2D_211, + ASSET_TEX2D_212, + ASSET_TEX2D_213, + ASSET_TEX2D_214, + ASSET_TEX2D_215, + ASSET_TEX2D_216, + ASSET_TEX2D_217, + ASSET_TEX2D_218, + ASSET_TEX2D_219, + ASSET_TEX2D_220, + ASSET_TEX2D_221, + ASSET_TEX2D_222, + ASSET_TEX2D_223, + ASSET_TEX2D_224, + ASSET_TEX2D_225, + ASSET_TEX2D_226, + ASSET_TEX2D_227, + ASSET_TEX2D_228, + ASSET_TEX2D_229, + ASSET_TEX2D_230, + ASSET_TEX2D_231, + ASSET_TEX2D_232, + ASSET_TEX2D_233, + ASSET_TEX2D_234, + ASSET_TEX2D_235, + ASSET_TEX2D_236, + ASSET_TEX2D_237, + ASSET_TEX2D_238, + ASSET_TEX2D_239, + ASSET_TEX2D_240, + ASSET_TEX2D_241, + ASSET_TEX2D_242, + ASSET_TEX2D_243, + ASSET_TEX2D_244, + ASSET_TEX2D_245, + ASSET_TEX2D_246, + ASSET_TEX2D_247, + ASSET_TEX2D_248, + ASSET_TEX2D_249, + ASSET_TEX2D_250, + ASSET_TEX2D_251, + ASSET_TEX2D_252, + ASSET_TEX2D_253, + ASSET_TEX2D_254, + ASSET_TEX2D_255, + ASSET_TEX2D_256, + ASSET_TEX2D_257, + ASSET_TEX2D_258, + ASSET_TEX2D_259, + ASSET_TEX2D_260, + ASSET_TEX2D_261, + ASSET_TEX2D_262, + ASSET_TEX2D_263, + ASSET_TEX2D_264, + ASSET_TEX2D_265, + ASSET_TEX2D_266, + ASSET_TEX2D_267, + ASSET_TEX2D_268, + ASSET_TEX2D_269, + ASSET_TEX2D_270, + ASSET_TEX2D_271, + ASSET_TEX2D_272, + ASSET_TEX2D_273, + ASSET_TEX2D_274, + ASSET_TEX2D_275, + ASSET_TEX2D_276, + ASSET_TEX2D_277, + ASSET_TEX2D_278, + ASSET_TEX2D_279, + ASSET_TEX2D_280, + ASSET_TEX2D_281, + ASSET_TEX2D_282, + ASSET_TEX2D_283, + ASSET_TEX2D_284, + ASSET_TEX2D_285, + ASSET_TEX2D_286, + ASSET_TEX2D_287, + ASSET_TEX2D_288, + ASSET_TEX2D_289, + ASSET_TEX2D_290, + ASSET_TEX2D_291, + ASSET_TEX2D_292, + ASSET_TEX2D_293, + ASSET_TEX2D_294, + ASSET_TEX2D_295, + ASSET_TEX2D_296, + ASSET_TEX2D_297, + ASSET_TEX2D_298, + ASSET_TEX2D_299, + ASSET_TEX2D_300, + ASSET_TEX2D_301, + ASSET_TEX2D_302, + ASSET_TEX2D_303, + ASSET_TEX2D_304, + ASSET_TEX2D_305, + ASSET_TEX2D_306, + ASSET_TEX2D_307, + ASSET_TEX2D_308, + ASSET_TEX2D_309, + ASSET_TEX2D_310, + ASSET_TEX2D_311, + ASSET_TEX2D_312, + ASSET_TEX2D_313, + ASSET_TEX2D_314, + ASSET_TEX2D_315, + ASSET_TEX2D_316, + ASSET_TEX2D_317, + ASSET_TEX2D_318, + ASSET_TEX2D_319, + ASSET_TEX2D_320, + ASSET_TEX2D_321, + ASSET_TEX2D_322, + ASSET_TEX2D_323, + ASSET_TEX2D_324, + ASSET_TEX2D_325, + ASSET_TEX2D_326, + ASSET_TEX2D_327, + ASSET_TEX2D_328, + ASSET_TEX2D_329, + ASSET_TEX2D_330, + ASSET_TEX2D_331, + ASSET_TEX2D_332, + ASSET_TEX2D_333, + ASSET_TEX2D_334, + ASSET_TEX2D_335, + ASSET_TEX2D_336, + ASSET_TEX2D_337, + ASSET_TEX2D_338, + ASSET_TEX2D_339, + ASSET_TEX2D_340, + ASSET_TEX2D_341, + ASSET_TEX2D_342, + ASSET_TEX2D_343, + ASSET_TEX2D_344, + ASSET_TEX2D_345, + ASSET_TEX2D_346, + ASSET_TEX2D_347, + ASSET_TEX2D_348, + ASSET_TEX2D_349, + ASSET_TEX2D_350, + ASSET_TEX2D_351, + ASSET_TEX2D_352, + ASSET_TEX2D_353, + ASSET_TEX2D_354, + ASSET_TEX2D_355, + ASSET_TEX2D_356, + ASSET_TEX2D_357, + ASSET_TEX2D_358, + ASSET_TEX2D_359, + ASSET_TEX2D_360, + ASSET_TEX2D_361, + ASSET_TEX2D_362, + ASSET_TEX2D_363, + ASSET_TEX2D_364, + ASSET_TEX2D_365, + ASSET_TEX2D_366, + ASSET_TEX2D_367, + ASSET_TEX2D_368, + ASSET_TEX2D_369, + ASSET_TEX2D_370, + ASSET_TEX2D_371, + ASSET_TEX2D_372, + ASSET_TEX2D_373, + ASSET_TEX2D_374, + ASSET_TEX2D_375, + ASSET_TEX2D_376, + ASSET_TEX2D_377, + ASSET_TEX2D_378, + ASSET_TEX2D_379, + ASSET_TEX2D_380, + ASSET_TEX2D_381, + ASSET_TEX2D_382, + ASSET_TEX2D_383, + ASSET_TEX2D_384, + ASSET_TEX2D_385, + ASSET_TEX2D_386, + ASSET_TEX2D_387, + ASSET_TEX2D_388, + ASSET_TEX2D_389, + ASSET_TEX2D_390, + ASSET_TEX2D_391, + ASSET_TEX2D_392, + ASSET_TEX2D_393, + ASSET_TEX2D_394, + ASSET_TEX2D_395, + ASSET_TEX2D_396, + ASSET_TEX2D_397, + ASSET_TEX2D_398, + ASSET_TEX2D_399, + ASSET_TEX2D_400, + ASSET_TEX2D_401, + ASSET_TEX2D_402, + ASSET_TEX2D_403, + ASSET_TEX2D_404, + ASSET_TEX2D_405, + ASSET_TEX2D_406, + ASSET_TEX2D_407, + ASSET_TEX2D_408, + ASSET_TEX2D_409, + ASSET_TEX2D_410, + ASSET_TEX2D_411, + ASSET_TEX2D_412, + ASSET_TEX2D_413, + ASSET_TEX2D_414, + ASSET_TEX2D_415, + ASSET_TEX2D_416, + ASSET_TEX2D_417, + ASSET_TEX2D_418, + ASSET_TEX2D_419, + ASSET_TEX2D_420, + ASSET_TEX2D_421, + ASSET_TEX2D_422, + ASSET_TEX2D_423, + ASSET_TEX2D_424, + ASSET_TEX2D_425, + ASSET_TEX2D_426, + ASSET_TEX2D_427, + ASSET_TEX2D_428, + ASSET_TEX2D_429, + ASSET_TEX2D_430, + ASSET_TEX2D_431, + ASSET_TEX2D_432, + ASSET_TEX2D_433, + ASSET_TEX2D_434, + ASSET_TEX2D_435, + ASSET_TEX2D_436, + ASSET_TEX2D_437, + ASSET_TEX2D_438, + ASSET_TEX2D_439, + ASSET_TEX2D_440, + ASSET_TEX2D_441, + ASSET_TEX2D_442, + ASSET_TEX2D_443, + ASSET_TEX2D_444, + ASSET_TEX2D_445, + ASSET_TEX2D_446, + ASSET_TEX2D_447, + ASSET_TEX2D_448, + ASSET_TEX2D_449, + ASSET_TEX2D_450, + ASSET_TEX2D_451, + ASSET_TEX2D_452, + ASSET_TEX2D_453, + ASSET_TEX2D_454, + ASSET_TEX2D_455, + ASSET_TEX2D_456, + ASSET_TEX2D_457, + ASSET_TEX2D_458, + ASSET_TEX2D_459, + ASSET_TEX2D_460, + ASSET_TEX2D_461, + ASSET_TEX2D_462, + ASSET_TEX2D_463, + ASSET_TEX2D_464, + ASSET_TEX2D_465, + ASSET_TEX2D_466, + ASSET_TEX2D_467, + ASSET_TEX2D_468, + ASSET_TEX2D_469, + ASSET_TEX2D_470, + ASSET_TEX2D_471, + ASSET_TEX2D_472, + ASSET_TEX2D_473, + ASSET_TEX2D_474, + ASSET_TEX2D_475, + ASSET_TEX2D_476, + ASSET_TEX2D_477, + ASSET_TEX2D_478, + ASSET_TEX2D_479, + ASSET_TEX2D_480, + ASSET_TEX2D_481, + ASSET_TEX2D_482, + ASSET_TEX2D_483, + ASSET_TEX2D_484, + ASSET_TEX2D_485, + ASSET_TEX2D_486, + ASSET_TEX2D_487, + ASSET_TEX2D_488, + ASSET_TEX2D_489, + ASSET_TEX2D_490, + ASSET_TEX2D_491, + ASSET_TEX2D_492, + ASSET_TEX2D_493, + ASSET_TEX2D_494, + ASSET_TEX2D_495, + ASSET_TEX2D_496, + ASSET_TEX2D_497, + ASSET_TEX2D_498, + ASSET_TEX2D_499, + ASSET_TEX2D_500, + ASSET_TEX2D_501, + ASSET_TEX2D_502, + ASSET_TEX2D_503, + ASSET_TEX2D_504, + ASSET_TEX2D_505, + ASSET_TEX2D_506, + ASSET_TEX2D_507, + ASSET_TEX2D_508, + ASSET_TEX2D_509, + ASSET_TEX2D_510, + ASSET_TEX2D_511, + ASSET_TEX2D_512, + ASSET_TEX2D_513, + ASSET_TEX2D_514, + ASSET_TEX2D_515, + ASSET_TEX2D_516, + ASSET_TEX2D_517, + ASSET_TEX2D_518, + ASSET_TEX2D_519, + ASSET_TEX2D_520, + ASSET_TEX2D_521, + ASSET_TEX2D_522, + ASSET_TEX2D_523, + ASSET_TEX2D_524, + ASSET_TEX2D_525, + ASSET_TEX2D_526, + ASSET_TEX2D_527, + ASSET_TEX2D_528, + ASSET_TEX2D_529, + ASSET_TEX2D_530, + ASSET_TEX2D_531, + ASSET_TEX2D_532, + ASSET_TEX2D_533, + ASSET_TEX2D_534, + ASSET_TEX2D_535, + ASSET_TEX2D_536, + ASSET_TEX2D_537, + ASSET_TEX2D_538, + ASSET_TEX2D_539, + ASSET_TEX2D_540, + ASSET_TEX2D_541, + ASSET_TEX2D_542, + ASSET_TEX2D_543, + ASSET_TEX2D_544, + ASSET_TEX2D_545, + ASSET_TEX2D_546, + ASSET_TEX2D_547, + ASSET_TEX2D_548, + ASSET_TEX2D_549, + ASSET_TEX2D_550, + ASSET_TEX2D_551, + ASSET_TEX2D_552, + ASSET_TEX2D_553, + ASSET_TEX2D_554, + ASSET_TEX2D_555, + ASSET_TEX2D_556, + ASSET_TEX2D_557, + ASSET_TEX2D_558, + ASSET_TEX2D_559, + ASSET_TEX2D_560, + ASSET_TEX2D_561, + ASSET_TEX2D_562, + ASSET_TEX2D_563, + ASSET_TEX2D_564, + ASSET_TEX2D_565, + ASSET_TEX2D_566, + ASSET_TEX2D_567, + ASSET_TEX2D_568, + ASSET_TEX2D_569, + ASSET_TEX2D_570, + ASSET_TEX2D_571, + ASSET_TEX2D_572, + ASSET_TEX2D_573, + ASSET_TEX2D_574, + ASSET_TEX2D_575, + ASSET_TEX2D_576, + ASSET_TEX2D_577, + ASSET_TEX2D_578, + ASSET_TEX2D_579, + ASSET_TEX2D_580, + ASSET_TEX2D_581, + ASSET_TEX2D_582, + ASSET_TEX2D_583, + ASSET_TEX2D_584, + ASSET_TEX2D_585, + ASSET_TEX2D_586, + ASSET_TEX2D_587, + ASSET_TEX2D_588, + ASSET_TEX2D_589, + ASSET_TEX2D_590, + ASSET_TEX2D_591, + ASSET_TEX2D_592, + ASSET_TEX2D_593, + ASSET_TEX2D_594, + ASSET_TEX2D_595, + ASSET_TEX2D_596, + ASSET_TEX2D_597, + ASSET_TEX2D_598, + ASSET_TEX2D_599, + ASSET_TEX2D_600, + ASSET_TEX2D_601, + ASSET_TEX2D_602, + ASSET_TEX2D_603, + ASSET_TEX2D_604, + ASSET_TEX2D_605, + ASSET_TEX2D_606, + ASSET_TEX2D_607, + ASSET_TEX2D_608, + ASSET_TEX2D_609, + ASSET_TEX2D_610, + ASSET_TEX2D_611, + ASSET_TEX2D_612, + ASSET_TEX2D_613, + ASSET_TEX2D_614, + ASSET_TEX2D_615, + ASSET_TEX2D_616, + ASSET_TEX2D_617, + ASSET_TEX2D_618, + ASSET_TEX2D_619, + ASSET_TEX2D_620, + ASSET_TEX2D_621, + ASSET_TEX2D_622, + ASSET_TEX2D_623, + ASSET_TEX2D_624, + ASSET_TEX2D_625, + ASSET_TEX2D_626, + ASSET_TEX2D_627, + ASSET_TEX2D_628, + ASSET_TEX2D_629, + ASSET_TEX2D_630, + ASSET_TEX2D_631, + ASSET_TEX2D_632, + ASSET_TEX2D_633, + ASSET_TEX2D_634, + ASSET_TEX2D_635, + ASSET_TEX2D_636, + ASSET_TEX2D_637, + ASSET_TEX2D_638, + ASSET_TEX2D_639, + ASSET_TEX2D_640, + ASSET_TEX2D_641, + ASSET_TEX2D_642, + ASSET_TEX2D_643, + ASSET_TEX2D_644, + ASSET_TEX2D_645, + ASSET_TEX2D_646, + ASSET_TEX2D_647, + ASSET_TEX2D_648, + ASSET_TEX2D_649, + ASSET_TEX2D_650, + ASSET_TEX2D_651, + ASSET_TEX2D_652, + ASSET_TEX2D_653, + ASSET_TEX2D_654, + ASSET_TEX2D_655, + ASSET_TEX2D_656, + ASSET_TEX2D_657, + ASSET_TEX2D_658, + ASSET_TEX2D_659, + ASSET_TEX2D_660, + ASSET_TEX2D_661, + ASSET_TEX2D_662, + ASSET_TEX2D_663, + ASSET_TEX2D_664, + ASSET_TEX2D_665, + ASSET_TEX2D_666, + ASSET_TEX2D_667, + ASSET_TEX2D_668, + ASSET_TEX2D_669, + ASSET_TEX2D_670, + ASSET_TEX2D_671, + ASSET_TEX2D_672, + ASSET_TEX2D_673, + ASSET_TEX2D_674, + ASSET_TEX2D_675, + ASSET_TEX2D_676, + ASSET_TEX2D_677, + ASSET_TEX2D_678, + ASSET_TEX2D_679, + ASSET_TEX2D_680, + ASSET_TEX2D_681, + ASSET_TEX2D_682, + ASSET_TEX2D_683, + ASSET_TEX2D_684, + ASSET_TEX2D_685, + ASSET_TEX2D_686, + ASSET_TEX2D_687, + ASSET_TEX2D_688, + ASSET_TEX2D_689, + ASSET_TEX2D_690, + ASSET_TEX2D_691, + ASSET_TEX2D_692, + ASSET_TEX2D_693, + ASSET_TEX2D_694, + ASSET_TEX2D_695, + ASSET_TEX2D_696, + ASSET_TEX2D_697, + ASSET_TEX2D_698, + ASSET_TEX2D_699, + ASSET_TEX2D_700, + ASSET_TEX2D_701, + ASSET_TEX2D_702, + ASSET_TEX2D_703, + ASSET_TEX2D_704, + ASSET_TEX2D_705, + ASSET_TEX2D_706, + ASSET_TEX2D_707, + ASSET_TEX2D_708, + ASSET_TEX2D_709, + ASSET_TEX2D_710, + ASSET_TEX2D_711, + ASSET_TEX2D_712, + ASSET_TEX2D_713, + ASSET_TEX2D_714, + ASSET_TEX2D_715, + ASSET_TEX2D_716, + ASSET_TEX2D_717, + ASSET_TEX2D_718, + ASSET_TEX2D_719, + ASSET_TEX2D_720, + ASSET_TEX2D_721, + ASSET_TEX2D_722, + ASSET_TEX2D_723, + ASSET_TEX2D_724, + ASSET_TEX2D_725, + ASSET_TEX2D_726, + ASSET_TEX2D_727, + ASSET_TEX2D_728, + ASSET_TEX2D_729, + ASSET_TEX2D_730, + ASSET_TEX2D_731, + ASSET_TEX2D_732, + ASSET_TEX2D_733, + ASSET_TEX2D_734, + ASSET_TEX2D_735, + ASSET_TEX2D_736, + ASSET_TEX2D_737, + ASSET_TEX2D_738, + ASSET_TEX2D_739, + ASSET_TEX2D_740, + ASSET_TEX2D_741, + ASSET_TEX2D_742, + ASSET_TEX2D_743, + ASSET_TEX2D_744, + ASSET_TEX2D_745, + ASSET_TEX2D_746, + ASSET_TEX2D_747, + ASSET_TEX2D_748, + ASSET_TEX2D_749, + ASSET_TEX2D_750, + ASSET_TEX2D_751, + ASSET_TEX2D_752, + ASSET_TEX2D_753, + ASSET_TEX2D_754, + ASSET_TEX2D_755, + ASSET_TEX2D_756, + ASSET_TEX2D_757, + ASSET_TEX2D_758, + ASSET_TEX2D_759, + ASSET_TEX2D_760, + ASSET_TEX2D_761, + ASSET_TEX2D_762, + ASSET_TEX2D_763, + ASSET_TEX2D_764, + ASSET_TEX2D_765, + ASSET_TEX2D_766, + ASSET_TEX2D_767, + ASSET_TEX2D_768, + ASSET_TEX2D_769, + ASSET_TEX2D_770, + ASSET_TEX2D_771, + ASSET_TEX2D_772, + ASSET_TEX2D_773, + ASSET_TEX2D_774, + ASSET_TEX2D_775, + ASSET_TEX2D_776, + ASSET_TEX2D_777, + ASSET_TEX2D_778, + ASSET_TEX2D_779, + ASSET_TEX2D_780, + ASSET_TEX2D_781, + ASSET_TEX2D_782, + ASSET_TEX2D_783, + ASSET_TEX2D_784, + ASSET_TEX2D_785, + ASSET_TEX2D_786, + ASSET_TEX2D_787, + ASSET_TEX2D_788, + ASSET_TEX2D_789, + ASSET_TEX2D_790, + ASSET_TEX2D_791, + ASSET_TEX2D_792, + ASSET_TEX2D_793, + ASSET_TEX2D_794, + ASSET_TEX2D_795, + ASSET_TEX2D_796, + ASSET_TEX2D_797, + ASSET_TEX2D_798, + ASSET_TEX2D_799, + ASSET_TEX2D_800, + ASSET_TEX2D_801, + ASSET_TEX2D_802, + ASSET_TEX2D_803, + ASSET_TEX2D_804, + ASSET_TEX2D_805, + ASSET_TEX2D_806, + ASSET_TEX2D_807, + ASSET_TEX2D_808, + ASSET_TEX2D_809, + ASSET_TEX2D_810, + ASSET_TEX2D_811, + ASSET_TEX2D_812, + ASSET_TEX2D_813, + ASSET_TEX2D_814, + ASSET_TEX2D_815, + ASSET_TEX2D_816, + ASSET_TEX2D_817, + ASSET_TEX2D_818, + ASSET_TEX2D_819, + ASSET_TEX2D_820, + ASSET_TEX2D_821, + ASSET_TEX2D_822, + ASSET_TEX2D_823, + ASSET_TEX2D_824, + ASSET_TEX2D_825, + ASSET_TEX2D_826, + ASSET_TEX2D_827, + ASSET_TEX2D_828, + ASSET_TEX2D_829, + ASSET_TEX2D_830, + ASSET_TEX2D_831, + ASSET_TEX2D_832, + ASSET_TEX2D_833, + ASSET_TEX2D_834, + ASSET_TEX2D_835, + ASSET_TEX2D_836, + ASSET_TEX2D_837, + ASSET_TEX2D_838, + ASSET_TEX2D_839, + ASSET_TEX2D_840, + ASSET_TEX2D_841, + ASSET_TEX2D_842, + ASSET_TEX2D_843, + ASSET_TEX2D_844, + ASSET_TEX2D_845, + ASSET_TEX2D_846, + ASSET_TEX2D_847, + ASSET_TEX2D_848, + ASSET_TEX2D_849, + ASSET_TEX2D_850, + ASSET_TEX2D_851, + ASSET_TEX2D_852, + ASSET_TEX2D_853, + ASSET_TEX2D_854, + ASSET_TEX2D_855, + ASSET_TEX2D_856, + ASSET_TEX2D_857, + ASSET_TEX2D_858, + ASSET_TEX2D_859, + ASSET_TEX2D_860, + ASSET_TEX2D_861, + ASSET_TEX2D_862, + ASSET_TEX2D_863, + ASSET_TEX2D_864, + ASSET_TEX2D_865, + ASSET_TEX2D_866, + ASSET_TEX2D_867, + ASSET_TEX2D_868, + ASSET_TEX2D_869, + ASSET_TEX2D_870, + ASSET_TEX2D_871, + ASSET_TEX2D_872, + ASSET_TEX2D_873, + ASSET_TEX2D_874, + ASSET_TEX2D_875, + ASSET_TEX2D_876, + ASSET_TEX2D_877, + ASSET_TEX2D_878, + ASSET_TEX2D_879, + ASSET_TEX2D_880, + ASSET_TEX2D_881, + ASSET_TEX2D_882, + ASSET_TEX2D_883, + ASSET_TEX2D_884, + ASSET_TEX2D_885, + ASSET_TEX2D_886, + ASSET_TEX2D_887, + ASSET_TEX2D_888, + ASSET_TEX2D_889, + ASSET_TEX2D_890, + ASSET_TEX2D_891, + ASSET_TEX2D_892, + ASSET_TEX2D_893, + ASSET_TEX2D_894, + ASSET_TEX2D_895, + ASSET_TEX2D_896, + ASSET_TEX2D_897, + ASSET_TEX2D_898, + ASSET_TEX2D_899, + ASSET_TEX2D_900, + ASSET_TEX2D_901, + ASSET_TEX2D_902, + ASSET_TEX2D_903, + ASSET_TEX2D_904, + ASSET_TEX2D_905 +} AssetTextures2dEnum; + +/********** ASSET_GAME_TEXT **********/ + +typedef enum { + ASSET_GAME_TEXT_0, + ASSET_GAME_TEXT_1, + ASSET_GAME_TEXT_2, + ASSET_GAME_TEXT_3, + ASSET_GAME_TEXT_4, + ASSET_GAME_TEXT_5, + ASSET_GAME_TEXT_6, + ASSET_GAME_TEXT_7, + ASSET_GAME_TEXT_8, + ASSET_GAME_TEXT_9, + ASSET_GAME_TEXT_10, + ASSET_GAME_TEXT_11, + ASSET_GAME_TEXT_12, + ASSET_GAME_TEXT_13, + ASSET_GAME_TEXT_14, + ASSET_GAME_TEXT_15, + ASSET_GAME_TEXT_16, + ASSET_GAME_TEXT_17, + ASSET_GAME_TEXT_18, + ASSET_GAME_TEXT_19, + ASSET_GAME_TEXT_20, + ASSET_GAME_TEXT_21, + ASSET_GAME_TEXT_22, + ASSET_GAME_TEXT_23, + ASSET_GAME_TEXT_24, + ASSET_GAME_TEXT_25, + ASSET_GAME_TEXT_26, + ASSET_GAME_TEXT_27, + ASSET_GAME_TEXT_28, + ASSET_GAME_TEXT_29, + ASSET_GAME_TEXT_30, + ASSET_GAME_TEXT_31, + ASSET_GAME_TEXT_32, + ASSET_GAME_TEXT_33, + ASSET_GAME_TEXT_34, + ASSET_GAME_TEXT_35, + ASSET_GAME_TEXT_36, + ASSET_GAME_TEXT_37, + ASSET_GAME_TEXT_38, + ASSET_GAME_TEXT_39, + ASSET_GAME_TEXT_40, + ASSET_GAME_TEXT_41, + ASSET_GAME_TEXT_42, + ASSET_GAME_TEXT_43, + ASSET_GAME_TEXT_44, + ASSET_GAME_TEXT_45, + ASSET_GAME_TEXT_46, + ASSET_GAME_TEXT_47, + ASSET_GAME_TEXT_48, + ASSET_GAME_TEXT_49, + ASSET_GAME_TEXT_50, + ASSET_GAME_TEXT_51, + ASSET_GAME_TEXT_52, + ASSET_GAME_TEXT_53, + ASSET_GAME_TEXT_54, + ASSET_GAME_TEXT_55, + ASSET_GAME_TEXT_56, + ASSET_GAME_TEXT_57, + ASSET_GAME_TEXT_58, + ASSET_GAME_TEXT_59, + ASSET_GAME_TEXT_60, + ASSET_GAME_TEXT_61, + ASSET_GAME_TEXT_62, + ASSET_GAME_TEXT_63, + ASSET_GAME_TEXT_64, + ASSET_GAME_TEXT_65, + ASSET_GAME_TEXT_66, + ASSET_GAME_TEXT_67, + ASSET_GAME_TEXT_68, + ASSET_GAME_TEXT_69, + ASSET_GAME_TEXT_70, + ASSET_GAME_TEXT_71, + ASSET_GAME_TEXT_72, + ASSET_GAME_TEXT_73, + ASSET_GAME_TEXT_74, + ASSET_GAME_TEXT_75, + ASSET_GAME_TEXT_76, + ASSET_GAME_TEXT_77, + ASSET_GAME_TEXT_78, + ASSET_GAME_TEXT_79, + ASSET_GAME_TEXT_80, + ASSET_GAME_TEXT_81, + ASSET_GAME_TEXT_82, + ASSET_GAME_TEXT_83, + ASSET_GAME_TEXT_84, + ASSET_GAME_TEXT_85, + ASSET_GAME_TEXT_86, + ASSET_GAME_TEXT_87, + ASSET_GAME_TEXT_88, + ASSET_GAME_TEXT_89, + ASSET_GAME_TEXT_90, + ASSET_GAME_TEXT_91, + ASSET_GAME_TEXT_92, + ASSET_GAME_TEXT_93, + ASSET_GAME_TEXT_94, + ASSET_GAME_TEXT_95, + ASSET_GAME_TEXT_96, + ASSET_GAME_TEXT_97, + ASSET_GAME_TEXT_98, + ASSET_GAME_TEXT_99, + ASSET_GAME_TEXT_100, + ASSET_GAME_TEXT_101, + ASSET_GAME_TEXT_102, + ASSET_GAME_TEXT_103, + ASSET_GAME_TEXT_104, + ASSET_GAME_TEXT_105, + ASSET_GAME_TEXT_106, + ASSET_GAME_TEXT_107, + ASSET_GAME_TEXT_108, + ASSET_GAME_TEXT_109, + ASSET_GAME_TEXT_110, + ASSET_GAME_TEXT_111, + ASSET_GAME_TEXT_112, + ASSET_GAME_TEXT_113, + ASSET_GAME_TEXT_114, + ASSET_GAME_TEXT_115, + ASSET_GAME_TEXT_116, + ASSET_GAME_TEXT_117, + ASSET_GAME_TEXT_118, + ASSET_GAME_TEXT_119, + ASSET_GAME_TEXT_120, + ASSET_GAME_TEXT_121, + ASSET_GAME_TEXT_122, + ASSET_GAME_TEXT_123, + ASSET_GAME_TEXT_124, + ASSET_GAME_TEXT_125, + ASSET_GAME_TEXT_126, + ASSET_GAME_TEXT_127, + ASSET_GAME_TEXT_128, + ASSET_GAME_TEXT_129, + ASSET_GAME_TEXT_130, + ASSET_GAME_TEXT_131, + ASSET_GAME_TEXT_132, + ASSET_GAME_TEXT_133, + ASSET_GAME_TEXT_134, + ASSET_GAME_TEXT_135, + ASSET_GAME_TEXT_136, + ASSET_GAME_TEXT_137, + ASSET_GAME_TEXT_138, + ASSET_GAME_TEXT_139, + ASSET_GAME_TEXT_140, + ASSET_GAME_TEXT_141, + ASSET_GAME_TEXT_142, + ASSET_GAME_TEXT_143, + ASSET_GAME_TEXT_144, + ASSET_GAME_TEXT_145, + ASSET_GAME_TEXT_146, + ASSET_GAME_TEXT_147, + ASSET_GAME_TEXT_148, + ASSET_GAME_TEXT_149, + ASSET_GAME_TEXT_150, + ASSET_GAME_TEXT_151, + ASSET_GAME_TEXT_152, + ASSET_GAME_TEXT_153, + ASSET_GAME_TEXT_154, + ASSET_GAME_TEXT_155, + ASSET_GAME_TEXT_156, + ASSET_GAME_TEXT_157, + ASSET_GAME_TEXT_158, + ASSET_GAME_TEXT_159, + ASSET_GAME_TEXT_160, + ASSET_GAME_TEXT_161, + ASSET_GAME_TEXT_162, + ASSET_GAME_TEXT_163, + ASSET_GAME_TEXT_164, + ASSET_GAME_TEXT_165, + ASSET_GAME_TEXT_166, + ASSET_GAME_TEXT_167, + ASSET_GAME_TEXT_168, + ASSET_GAME_TEXT_169, + ASSET_GAME_TEXT_170, + ASSET_GAME_TEXT_171, + ASSET_GAME_TEXT_172, + ASSET_GAME_TEXT_173, + ASSET_GAME_TEXT_174, + ASSET_GAME_TEXT_175, + ASSET_GAME_TEXT_176, + ASSET_GAME_TEXT_177, + ASSET_GAME_TEXT_178, + ASSET_GAME_TEXT_179, + ASSET_GAME_TEXT_180, + ASSET_GAME_TEXT_181, + ASSET_GAME_TEXT_182, + ASSET_GAME_TEXT_183, + ASSET_GAME_TEXT_184, + ASSET_GAME_TEXT_185, + ASSET_GAME_TEXT_186, + ASSET_GAME_TEXT_187, + ASSET_GAME_TEXT_188, + ASSET_GAME_TEXT_189, + ASSET_GAME_TEXT_190, + ASSET_GAME_TEXT_191, + ASSET_GAME_TEXT_192, + ASSET_GAME_TEXT_193, + ASSET_GAME_TEXT_194, + ASSET_GAME_TEXT_195, + ASSET_GAME_TEXT_196, + ASSET_GAME_TEXT_197, + ASSET_GAME_TEXT_198, + ASSET_GAME_TEXT_199, + ASSET_GAME_TEXT_200, + ASSET_GAME_TEXT_201, + ASSET_GAME_TEXT_202, + ASSET_GAME_TEXT_203, + ASSET_GAME_TEXT_204, + ASSET_GAME_TEXT_205, + ASSET_GAME_TEXT_206, + ASSET_GAME_TEXT_207, + ASSET_GAME_TEXT_208, + ASSET_GAME_TEXT_209, + ASSET_GAME_TEXT_210, + ASSET_GAME_TEXT_211, + ASSET_GAME_TEXT_212, + ASSET_GAME_TEXT_213, + ASSET_GAME_TEXT_214, + ASSET_GAME_TEXT_215, + ASSET_GAME_TEXT_216, + ASSET_GAME_TEXT_217, + ASSET_GAME_TEXT_218, + ASSET_GAME_TEXT_219, + ASSET_GAME_TEXT_220, + ASSET_GAME_TEXT_221, + ASSET_GAME_TEXT_222, + ASSET_GAME_TEXT_223, + ASSET_GAME_TEXT_224, + ASSET_GAME_TEXT_225, + ASSET_GAME_TEXT_226, + ASSET_GAME_TEXT_227, + ASSET_GAME_TEXT_228, + ASSET_GAME_TEXT_229, + ASSET_GAME_TEXT_230, + ASSET_GAME_TEXT_231, + ASSET_GAME_TEXT_232, + ASSET_GAME_TEXT_233, + ASSET_GAME_TEXT_234, + ASSET_GAME_TEXT_235, + ASSET_GAME_TEXT_236, + ASSET_GAME_TEXT_237, + ASSET_GAME_TEXT_238, + ASSET_GAME_TEXT_239, + ASSET_GAME_TEXT_240, + ASSET_GAME_TEXT_241, + ASSET_GAME_TEXT_242, + ASSET_GAME_TEXT_243, + ASSET_GAME_TEXT_244, + ASSET_GAME_TEXT_245, + ASSET_GAME_TEXT_246, + ASSET_GAME_TEXT_247, + ASSET_GAME_TEXT_248, + ASSET_GAME_TEXT_249, + ASSET_GAME_TEXT_250, + ASSET_GAME_TEXT_251, + ASSET_GAME_TEXT_252, + ASSET_GAME_TEXT_253, + ASSET_GAME_TEXT_254 +} AssetGameTextEnum; + +/********** ASSET_MENU_TEXT **********/ + +typedef enum { + ASSET_MENU_TEXT_ENGLISH, + ASSET_MENU_TEXT_FRENCH, + ASSET_MENU_TEXT_GERMAN, + ASSET_MENU_TEXT_JAPANESE +} AssetMenuTextEnum; + +typedef enum { + ASSET_MENU_TEXT_STEREO, + ASSET_MENU_TEXT_MONO, + ASSET_MENU_TEXT_HEADPHONES, + ASSET_MENU_TEXT_SFXVOLUME, + ASSET_MENU_TEXT_MUSICVOLUME, + ASSET_MENU_TEXT_RETURN, + ASSET_MENU_TEXT_AUDIOOPTIONS, + ASSET_MENU_TEXT_MUSICTEST, + ASSET_MENU_TEXT_ENTERINITIALS, + ASSET_MENU_TEXT_BESTTIME, + ASSET_MENU_TEXT_BESTLAP, + ASSET_MENU_TEXT_SILVERCOIN, + ASSET_MENU_TEXT_GOLDCOIN, + ASSET_MENU_TEXT_CHALLENGE, + ASSET_MENU_TEXT_ENTERCODE, + ASSET_MENU_TEXT_CLEARALLCODES, + ASSET_MENU_TEXT_CODELIST, + ASSET_MENU_TEXT_MAGICCODES, + ASSET_MENU_TEXT_BADCODE, + ASSET_MENU_TEXT_ALLCODESDELETED, + ASSET_MENU_TEXT_MAGICCODESLIST, + ASSET_MENU_TEXT_ON, + ASSET_MENU_TEXT_OFF, + ASSET_MENU_TEXT_TRYAGAIN, + ASSET_MENU_TEXT_SELECTTRACK, + ASSET_MENU_TEXT_RETURNTOLOBBY, + ASSET_MENU_TEXT_SELECTCHARACTER, + ASSET_MENU_TEXT_SAVEGHOST, + ASSET_MENU_TEXT_QUIT, + ASSET_MENU_TEXT_LAPTIMES, + ASSET_MENU_TEXT_OVERALLTIME, + ASSET_MENU_TEXT_RACEORDER, + ASSET_MENU_TEXT_RECORDTIMES, + ASSET_MENU_TEXT_RANKINGS, + ASSET_MENU_TEXT_LANGUAGE, + ASSET_MENU_TEXT_CONTPAK, + ASSET_MENU_TEXT_OPTIONS, + ASSET_MENU_TEXT_CHANGEVEHICLE, + ASSET_MENU_TEXT_HELP, + ASSET_MENU_TEXT_CHALLENGES, + ASSET_MENU_TEXT_VEHICLESELECT, + ASSET_MENU_TEXT_CAR, + ASSET_MENU_TEXT_HOVERCRAFT, + ASSET_MENU_TEXT_PLANE, + ASSET_MENU_TEXT_MAINMENU, + ASSET_MENU_TEXT_CHALLENGESELECT, + ASSET_MENU_TEXT_CARCHALLENGE, + ASSET_MENU_TEXT_HOVERCHALLENGE, + ASSET_MENU_TEXT_PLANECHALLENGE, + ASSET_MENU_TEXT_LOSETOTAJ_0, + ASSET_MENU_TEXT_LOSETOTAJ_1, + ASSET_MENU_TEXT_EXIT, + ASSET_MENU_TEXT_TTINTRO_0, + ASSET_MENU_TEXT_TTINTRO_1, + ASSET_MENU_TEXT_TTINTRO_2, + ASSET_MENU_TEXT_TTINTRO_3, + ASSET_MENU_TEXT_TTINTRO_4, + ASSET_MENU_TEXT_TTINTRO_5, + ASSET_MENU_TEXT_TTINTRO_6, + ASSET_MENU_TEXT_TTINTRO_7, + ASSET_MENU_TEXT_TTINTRO_8, + ASSET_MENU_TEXT_TTINTRO_9, + ASSET_MENU_TEXT_TTINTRO_10, + ASSET_MENU_TEXT_TTINTRO_11, + ASSET_MENU_TEXT_PAKERROR, + ASSET_MENU_TEXT_TIMETRIALON, + ASSET_MENU_TEXT_TIMETRIALOFF, + ASSET_MENU_TEXT_NOCONTPAK, + ASSET_MENU_TEXT_CONTPAKFULL, + ASSET_MENU_TEXT_BADCONTPAK, + ASSET_MENU_TEXT_TROPHYRACE, + ASSET_MENU_TEXT_STATUS, + ASSET_MENU_TEXT_GAMEA, + ASSET_MENU_TEXT_GAMEB, + ASSET_MENU_TEXT_GAMEC, + ASSET_MENU_TEXT_NEW, + ASSET_MENU_TEXT_GAMESELECT, + ASSET_MENU_TEXT_GAMETOCOPY, + ASSET_MENU_TEXT_GAMETOCOPYTO, + ASSET_MENU_TEXT_GAMETOERASE, + ASSET_MENU_TEXT_COPY, + ASSET_MENU_TEXT_ERASE, + ASSET_MENU_TEXT_GHOSTDATA, + ASSET_MENU_TEXT_NOGHOSTSSAVED, + ASSET_MENU_TEXT_ERASEGHOST, + ASSET_MENU_TEXT_CANCEL, + ASSET_MENU_TEXT_CONTPAK1, + ASSET_MENU_TEXT_CONTPAK2, + ASSET_MENU_TEXT_CONTPAK3, + ASSET_MENU_TEXT_CONTPAK4, + ASSET_MENU_TEXT_CONTPAKX, + ASSET_MENU_TEXT_CONTPAKNOTPRESENT, + ASSET_MENU_TEXT_CONTPAKTRYAGAIN, + ASSET_MENU_TEXT_CONTPAKHASCORRUPTDATA_0, + ASSET_MENU_TEXT_CONTPAKHASCORRUPTDATA_1, + ASSET_MENU_TEXT_CONTPAKISDAMAGED_0, + ASSET_MENU_TEXT_CONTPAKISDAMAGED_1, + ASSET_MENU_TEXT_CONTPAKISFULL, + ASSET_MENU_TEXT_CONTINUE, + ASSET_MENU_TEXT_CONTPAKDIFFERENT_0, + ASSET_MENU_TEXT_CONTPAKDIFFERENT_1, + ASSET_MENU_TEXT_CONTPAKRETRY, + ASSET_MENU_TEXT_CANNOTSTOREANYMOREGHOSTS_0, + ASSET_MENU_TEXT_CANNOTSTOREANYMOREGHOSTS_1, + ASSET_MENU_TEXT_ADVTWOLOADERROR_0, + ASSET_MENU_TEXT_ADVTWOLOADERROR_1, + ASSET_MENU_TEXT_ADVTWOLOADERROR_2, + ASSET_MENU_TEXT_ADVTWOLOADERROR_3, + ASSET_MENU_TEXT_ADVTWOLOADERROR_4, + ASSET_MENU_TEXT_ADVTWOLOADERROR_5, + ASSET_MENU_TEXT_PAKNOTES, + ASSET_MENU_TEXT_DELETENOTEX, + ASSET_MENU_TEXT_DELETE, + ASSET_MENU_TEXT_CANCELDELETE, + ASSET_MENU_TEXT_FREEPAGESX, + ASSET_MENU_TEXT_NOTE, + ASSET_MENU_TEXT_FILENAME, + ASSET_MENU_TEXT_PAGES, + ASSET_MENU_TEXT_MORE, + ASSET_MENU_TEXT_GAMEPAK, + ASSET_MENU_TEXT_TIMES, + ASSET_MENU_TEXT_GHOSTS, + ASSET_MENU_TEXT_EMPTYSLOT, + ASSET_MENU_TEXT_VIEWGHOSTS, + ASSET_MENU_TEXT_PLEASEWAIT, + ASSET_MENU_TEXT_GAMEERROR, + ASSET_MENU_TEXT_RESTARTRACE, + ASSET_MENU_TEXT_RESTARTCHALLENGE, + ASSET_MENU_TEXT_ABANDONCHALLENGE, + ASSET_MENU_TEXT_QUITTROPHYRACE, + ASSET_MENU_TEXT_QUITTROPHYRACETITLE, + ASSET_MENU_TEXT_QUITGAME, + ASSET_MENU_TEXT_QUITGAMETITLE, + ASSET_MENU_TEXT_PAUSEOPTIONS, + ASSET_MENU_TEXT_OK, + ASSET_MENU_TEXT_PLAYERSELECT, + ASSET_MENU_TEXT_NUMBEROFRACERS, + ASSET_MENU_TEXT_START, + ASSET_MENU_TEXT_ROUNDONE, + ASSET_MENU_TEXT_ROUNDTWO, + ASSET_MENU_TEXT_ROUNDTHREE, + ASSET_MENU_TEXT_ROUNDFOUR, + ASSET_MENU_TEXT_ADVENTURE, + ASSET_MENU_TEXT_ADVENTURETWO, + ASSET_MENU_TEXT_TRACKS, + ASSET_MENU_TEXT_TROPHYCEREMONY, + ASSET_MENU_TEXT_ADVENTURE2, + ASSET_MENU_TEXT_ADVENTURETWO2, + ASSET_MENU_TEXT_CLEARALLCODESTITLE, + ASSET_MENU_TEXT_CLEARALLCODESCONFIRM, + ASSET_MENU_TEXT_CLEARALLCODESCANCEL, + ASSET_MENU_TEXT_CONTROLLERNOTCONNECTED, + ASSET_MENU_TEXT_CAUTION, + ASSET_MENU_TEXT_RUMBLEPAKDETECTED_0, + ASSET_MENU_TEXT_RUMBLEPAKDETECTED_1, + ASSET_MENU_TEXT_RUMBLEPAKDETECTED_2, + ASSET_MENU_TEXT_INSERTDEVICE_0, + ASSET_MENU_TEXT_INSERTDEVICE_1, + ASSET_MENU_TEXT_INSERTDEVICE_2, + ASSET_MENU_TEXT_INSERTDEVICE_3, + ASSET_MENU_TEXT_INSERTDEVICE_4, + ASSET_MENU_TEXT_INSERTDEVICE_5, + ASSET_MENU_TEXT_INSERTDEVICE_6, + ASSET_MENU_TEXT_TURNOFFN64_0, + ASSET_MENU_TEXT_TURNOFFN64_1, + ASSET_MENU_TEXT_SAVEOPTIONS, + ASSET_MENU_TEXT_CAUTIONMESSAGE_0, + ASSET_MENU_TEXT_CAUTIONMESSAGE_1, + ASSET_MENU_TEXT_CAUTIONMESSAGE_2, + ASSET_MENU_TEXT_CAUTIONMESSAGE_3, + ASSET_MENU_TEXT_CAUTIONMESSAGE_4, + ASSET_MENU_TEXT_CAUTIONMESSAGE_5, + ASSET_MENU_TEXT_CAUTIONMESSAGE_6, + ASSET_MENU_TEXT_CAUTIONMESSAGE_7, + ASSET_MENU_TEXT_CAUTIONMESSAGE_8, + ASSET_MENU_TEXT_CAUTIONMESSAGE_9, + ASSET_MENU_TEXT_CAUTIONMESSAGE_10, + ASSET_MENU_TEXT_CANNOTSAVEGHOSTDATA_0, + ASSET_MENU_TEXT_CANNOTSAVEGHOSTDATA_1, + ASSET_MENU_TEXT_CANNOTSAVEGHOSTDATA_2, + ASSET_MENU_TEXT_ENTERTROPHYRACE, + ASSET_MENU_TEXT_GAMEPAKBONUSES, + ASSET_MENU_TEXT_SUBTITLESON, + ASSET_MENU_TEXT_SUBTITLESOFF, + ASSET_MENU_TEXT_CORRUPTDATA_0, + ASSET_MENU_TEXT_CORRUPTDATA_1 +} AssetMenuTextIdsEnum; + +/********** ASSET_SPRITES **********/ + +typedef enum { + ASSET_SPRITES_0, + ASSET_SPRITES_1, + ASSET_SPRITES_2, + ASSET_SPRITES_3, + ASSET_SPRITES_4, + ASSET_SPRITES_5, + ASSET_SPRITES_6, + ASSET_SPRITES_7, + ASSET_SPRITES_8, + ASSET_SPRITES_9, + ASSET_SPRITES_10, + ASSET_SPRITES_11, + ASSET_SPRITES_12, + ASSET_SPRITES_13, + ASSET_SPRITES_14, + ASSET_SPRITES_15, + ASSET_SPRITES_16, + ASSET_SPRITES_17, + ASSET_SPRITES_18, + ASSET_SPRITES_19, + ASSET_SPRITES_20, + ASSET_SPRITES_21, + ASSET_SPRITES_22, + ASSET_SPRITES_23, + ASSET_SPRITES_24, + ASSET_SPRITES_25, + ASSET_SPRITES_26, + ASSET_SPRITES_27, + ASSET_SPRITES_28, + ASSET_SPRITES_29, + ASSET_SPRITES_30, + ASSET_SPRITES_31, + ASSET_SPRITES_32, + ASSET_SPRITES_33, + ASSET_SPRITES_34, + ASSET_SPRITES_35, + ASSET_SPRITES_36, + ASSET_SPRITES_37, + ASSET_SPRITES_38, + ASSET_SPRITES_39, + ASSET_SPRITES_40, + ASSET_SPRITES_41, + ASSET_SPRITES_42, + ASSET_SPRITES_43, + ASSET_SPRITES_44, + ASSET_SPRITES_45, + ASSET_SPRITES_46, + ASSET_SPRITES_47, + ASSET_SPRITES_48, + ASSET_SPRITES_49, + ASSET_SPRITES_50, + ASSET_SPRITES_51, + ASSET_SPRITES_52, + ASSET_SPRITES_53, + ASSET_SPRITES_54, + ASSET_SPRITES_55, + ASSET_SPRITES_56, + ASSET_SPRITES_57, + ASSET_SPRITES_58, + ASSET_SPRITES_59, + ASSET_SPRITES_60, + ASSET_SPRITES_61, + ASSET_SPRITES_62, + ASSET_SPRITES_63, + ASSET_SPRITES_64, + ASSET_SPRITES_65, + ASSET_SPRITES_66, + ASSET_SPRITES_67, + ASSET_SPRITES_68, + ASSET_SPRITES_69, + ASSET_SPRITES_70, + ASSET_SPRITES_71, + ASSET_SPRITES_72, + ASSET_SPRITES_73, + ASSET_SPRITES_74, + ASSET_SPRITES_75, + ASSET_SPRITES_76, + ASSET_SPRITES_77, + ASSET_SPRITES_78, + ASSET_SPRITES_79, + ASSET_SPRITES_80, + ASSET_SPRITES_81, + ASSET_SPRITES_82, + ASSET_SPRITES_83, + ASSET_SPRITES_84, + ASSET_SPRITES_85, + ASSET_SPRITES_86, + ASSET_SPRITES_87, + ASSET_SPRITES_88, + ASSET_SPRITES_89, + ASSET_SPRITES_90, + ASSET_SPRITES_91, + ASSET_SPRITES_92, + ASSET_SPRITES_93, + ASSET_SPRITES_94, + ASSET_SPRITES_95, + ASSET_SPRITES_96, + ASSET_SPRITES_97, + ASSET_SPRITES_98, + ASSET_SPRITES_99, + ASSET_SPRITES_100, + ASSET_SPRITES_101, + ASSET_SPRITES_102, + ASSET_SPRITES_103, + ASSET_SPRITES_104, + ASSET_SPRITES_105, + ASSET_SPRITES_106, + ASSET_SPRITES_107, + ASSET_SPRITES_108, + ASSET_SPRITES_109, + ASSET_SPRITES_110, + ASSET_SPRITES_111, + ASSET_SPRITES_112, + ASSET_SPRITES_113, + ASSET_SPRITES_114, + ASSET_SPRITES_115, + ASSET_SPRITES_116, + ASSET_SPRITES_117, + ASSET_SPRITES_118, + ASSET_SPRITES_119, + ASSET_SPRITES_120, + ASSET_SPRITES_121, + ASSET_SPRITES_122, + ASSET_SPRITES_123, + ASSET_SPRITES_124, + ASSET_SPRITES_125, + ASSET_SPRITES_126, + ASSET_SPRITES_127, + ASSET_SPRITES_128, + ASSET_SPRITES_129, + ASSET_SPRITES_130, + ASSET_SPRITES_131, + ASSET_SPRITES_132, + ASSET_SPRITES_133, + ASSET_SPRITES_134, + ASSET_SPRITES_135, + ASSET_SPRITES_136, + ASSET_SPRITES_137, + ASSET_SPRITES_138, + ASSET_SPRITES_139, + ASSET_SPRITES_140, + ASSET_SPRITES_141, + ASSET_SPRITES_142, + ASSET_SPRITES_143, + ASSET_SPRITES_144, + ASSET_SPRITES_145, + ASSET_SPRITES_146, + ASSET_SPRITES_147, + ASSET_SPRITES_148, + ASSET_SPRITES_149, + ASSET_SPRITES_150, + ASSET_SPRITES_151, + ASSET_SPRITES_152, + ASSET_SPRITES_153, + ASSET_SPRITES_154, + ASSET_SPRITES_155, + ASSET_SPRITES_156, + ASSET_SPRITES_157, + ASSET_SPRITES_158, + ASSET_SPRITES_159, + ASSET_SPRITES_160, + ASSET_SPRITES_161, + ASSET_SPRITES_162, + ASSET_SPRITES_163, + ASSET_SPRITES_164, + ASSET_SPRITES_165, + ASSET_SPRITES_166, + ASSET_SPRITES_167, + ASSET_SPRITES_168, + ASSET_SPRITES_169, + ASSET_SPRITES_170, + ASSET_SPRITES_171, + ASSET_SPRITES_172, + ASSET_SPRITES_173, + ASSET_SPRITES_174, + ASSET_SPRITES_175, + ASSET_SPRITES_176, + ASSET_SPRITES_177, + ASSET_SPRITES_178, + ASSET_SPRITES_179, + ASSET_SPRITES_180, + ASSET_SPRITES_181, + ASSET_SPRITES_182, + ASSET_SPRITES_183, + ASSET_SPRITES_184, + ASSET_SPRITES_185, + ASSET_SPRITES_186, + ASSET_SPRITES_187, + ASSET_SPRITES_188, + ASSET_SPRITES_189, + ASSET_SPRITES_190, + ASSET_SPRITES_191, + ASSET_SPRITES_192 +} AssetSpritesEnum; + +/********** ASSET_MISC **********/ + +typedef enum { + ASSET_MISC_0, + ASSET_MISC_1, + ASSET_MISC_2, + ASSET_MISC_3, + ASSET_MISC_4, + ASSET_MISC_5, + ASSET_MISC_6, + ASSET_MISC_7, + ASSET_MISC_8, + ASSET_MISC_9, + ASSET_MISC_10, + ASSET_MISC_11, + ASSET_MISC_12, + ASSET_MISC_13, + ASSET_MISC_14, + ASSET_MISC_15, + ASSET_MISC_16, + ASSET_MISC_17, + ASSET_MISC_18, + ASSET_MISC_19, + ASSET_MISC_20, + ASSET_MISC_21, + ASSET_MISC_22, + ASSET_MISC_23, + ASSET_MISC_24, + ASSET_MISC_25, + ASSET_MISC_TRACKS_MENU_IDS, + ASSET_MISC_HUB_AREA_IDS, + ASSET_MISC_MAIN_TRACKS_IDS, + ASSET_MISC_BATTLE_TRACKS_IDS, + ASSET_MISC_BOSS_TRACKS_IDS, + ASSET_MISC_31, + ASSET_MISC_32, + ASSET_MISC_RACERSTATS_UNKNOWN0, + ASSET_MISC_RACERSTATS_DIDDY, + ASSET_MISC_RACERSTATS_TT, + ASSET_MISC_RACERSTATS_UNKNOWN1, + ASSET_MISC_RACERSTATS_KRUNCH, + ASSET_MISC_RACERSTATS_BUMPER, + ASSET_MISC_RACERSTATS_TIPTUP, + ASSET_MISC_RACERSTATS_CONKER, + ASSET_MISC_RACERSTATS_TIMBER, + ASSET_MISC_RACERSTATS_BANJO, + ASSET_MISC_RACERSTATS_DRUMSTICK, + ASSET_MISC_RACERSTATS_PIPSY, + ASSET_MISC_RACERSTATS_UNKNOWN2, + ASSET_MISC_46, + ASSET_MISC_47, + ASSET_MISC_48, + ASSET_MISC_49, + ASSET_MISC_50, + ASSET_MISC_51, + ASSET_MISC_52, + ASSET_MISC_53, + ASSET_MISC_54, + ASSET_MISC_55, + ASSET_MISC_56, + ASSET_MISC_57, + ASSET_MISC_58, + ASSET_MISC_59, + ASSET_MISC_60, + ASSET_MISC_61, + ASSET_MISC_62, + ASSET_MISC_63, + ASSET_MISC_64, + ASSET_MISC_MAGIC_CODES, + ASSET_MISC_TITLE_SCREEN_DEMO_IDS, + ASSET_MISC_67, + ASSET_MISC_68, + ASSET_MISC_69 +} AssetMiscEnum; + +/********** ASSET_LEVEL_OBJECT_MAPS **********/ + +typedef enum { + ASSET_LEVEL_OBJECT_MAPS_0, + ASSET_LEVEL_OBJECT_MAPS_1, + ASSET_LEVEL_OBJECT_MAPS_2, + ASSET_LEVEL_OBJECT_MAPS_3, + ASSET_LEVEL_OBJECT_MAPS_4, + ASSET_LEVEL_OBJECT_MAPS_5, + ASSET_LEVEL_OBJECT_MAPS_6, + ASSET_LEVEL_OBJECT_MAPS_7, + ASSET_LEVEL_OBJECT_MAPS_8, + ASSET_LEVEL_OBJECT_MAPS_9, + ASSET_LEVEL_OBJECT_MAPS_10, + ASSET_LEVEL_OBJECT_MAPS_11, + ASSET_LEVEL_OBJECT_MAPS_12, + ASSET_LEVEL_OBJECT_MAPS_13, + ASSET_LEVEL_OBJECT_MAPS_14, + ASSET_LEVEL_OBJECT_MAPS_15, + ASSET_LEVEL_OBJECT_MAPS_16, + ASSET_LEVEL_OBJECT_MAPS_17, + ASSET_LEVEL_OBJECT_MAPS_18, + ASSET_LEVEL_OBJECT_MAPS_19, + ASSET_LEVEL_OBJECT_MAPS_20, + ASSET_LEVEL_OBJECT_MAPS_21, + ASSET_LEVEL_OBJECT_MAPS_22, + ASSET_LEVEL_OBJECT_MAPS_23, + ASSET_LEVEL_OBJECT_MAPS_24, + ASSET_LEVEL_OBJECT_MAPS_25, + ASSET_LEVEL_OBJECT_MAPS_26, + ASSET_LEVEL_OBJECT_MAPS_27, + ASSET_LEVEL_OBJECT_MAPS_28, + ASSET_LEVEL_OBJECT_MAPS_29, + ASSET_LEVEL_OBJECT_MAPS_30, + ASSET_LEVEL_OBJECT_MAPS_31, + ASSET_LEVEL_OBJECT_MAPS_32, + ASSET_LEVEL_OBJECT_MAPS_33, + ASSET_LEVEL_OBJECT_MAPS_34, + ASSET_LEVEL_OBJECT_MAPS_35, + ASSET_LEVEL_OBJECT_MAPS_36, + ASSET_LEVEL_OBJECT_MAPS_37, + ASSET_LEVEL_OBJECT_MAPS_38, + ASSET_LEVEL_OBJECT_MAPS_39, + ASSET_LEVEL_OBJECT_MAPS_40, + ASSET_LEVEL_OBJECT_MAPS_41, + ASSET_LEVEL_OBJECT_MAPS_42, + ASSET_LEVEL_OBJECT_MAPS_43, + ASSET_LEVEL_OBJECT_MAPS_44, + ASSET_LEVEL_OBJECT_MAPS_45, + ASSET_LEVEL_OBJECT_MAPS_46, + ASSET_LEVEL_OBJECT_MAPS_47, + ASSET_LEVEL_OBJECT_MAPS_48, + ASSET_LEVEL_OBJECT_MAPS_49, + ASSET_LEVEL_OBJECT_MAPS_50, + ASSET_LEVEL_OBJECT_MAPS_51, + ASSET_LEVEL_OBJECT_MAPS_52, + ASSET_LEVEL_OBJECT_MAPS_53, + ASSET_LEVEL_OBJECT_MAPS_54, + ASSET_LEVEL_OBJECT_MAPS_55, + ASSET_LEVEL_OBJECT_MAPS_56, + ASSET_LEVEL_OBJECT_MAPS_57, + ASSET_LEVEL_OBJECT_MAPS_58, + ASSET_LEVEL_OBJECT_MAPS_59, + ASSET_LEVEL_OBJECT_MAPS_60, + ASSET_LEVEL_OBJECT_MAPS_61, + ASSET_LEVEL_OBJECT_MAPS_62, + ASSET_LEVEL_OBJECT_MAPS_63, + ASSET_LEVEL_OBJECT_MAPS_64, + ASSET_LEVEL_OBJECT_MAPS_65, + ASSET_LEVEL_OBJECT_MAPS_66, + ASSET_LEVEL_OBJECT_MAPS_67, + ASSET_LEVEL_OBJECT_MAPS_68, + ASSET_LEVEL_OBJECT_MAPS_69, + ASSET_LEVEL_OBJECT_MAPS_70, + ASSET_LEVEL_OBJECT_MAPS_71, + ASSET_LEVEL_OBJECT_MAPS_72, + ASSET_LEVEL_OBJECT_MAPS_73, + ASSET_LEVEL_OBJECT_MAPS_74, + ASSET_LEVEL_OBJECT_MAPS_75, + ASSET_LEVEL_OBJECT_MAPS_76, + ASSET_LEVEL_OBJECT_MAPS_77, + ASSET_LEVEL_OBJECT_MAPS_78, + ASSET_LEVEL_OBJECT_MAPS_79, + ASSET_LEVEL_OBJECT_MAPS_80, + ASSET_LEVEL_OBJECT_MAPS_81, + ASSET_LEVEL_OBJECT_MAPS_82, + ASSET_LEVEL_OBJECT_MAPS_83, + ASSET_LEVEL_OBJECT_MAPS_84, + ASSET_LEVEL_OBJECT_MAPS_85, + ASSET_LEVEL_OBJECT_MAPS_86, + ASSET_LEVEL_OBJECT_MAPS_87, + ASSET_LEVEL_OBJECT_MAPS_88, + ASSET_LEVEL_OBJECT_MAPS_89, + ASSET_LEVEL_OBJECT_MAPS_90, + ASSET_LEVEL_OBJECT_MAPS_91, + ASSET_LEVEL_OBJECT_MAPS_92, + ASSET_LEVEL_OBJECT_MAPS_93, + ASSET_LEVEL_OBJECT_MAPS_94, + ASSET_LEVEL_OBJECT_MAPS_95, + ASSET_LEVEL_OBJECT_MAPS_96, + ASSET_LEVEL_OBJECT_MAPS_97, + ASSET_LEVEL_OBJECT_MAPS_98, + ASSET_LEVEL_OBJECT_MAPS_99, + ASSET_LEVEL_OBJECT_MAPS_100, + ASSET_LEVEL_OBJECT_MAPS_101, + ASSET_LEVEL_OBJECT_MAPS_102, + ASSET_LEVEL_OBJECT_MAPS_103, + ASSET_LEVEL_OBJECT_MAPS_104, + ASSET_LEVEL_OBJECT_MAPS_105, + ASSET_LEVEL_OBJECT_MAPS_106, + ASSET_LEVEL_OBJECT_MAPS_107, + ASSET_LEVEL_OBJECT_MAPS_108, + ASSET_LEVEL_OBJECT_MAPS_109, + ASSET_LEVEL_OBJECT_MAPS_110, + ASSET_LEVEL_OBJECT_MAPS_111, + ASSET_LEVEL_OBJECT_MAPS_112, + ASSET_LEVEL_OBJECT_MAPS_113, + ASSET_LEVEL_OBJECT_MAPS_114, + ASSET_LEVEL_OBJECT_MAPS_115, + ASSET_LEVEL_OBJECT_MAPS_116, + ASSET_LEVEL_OBJECT_MAPS_117, + ASSET_LEVEL_OBJECT_MAPS_118, + ASSET_LEVEL_OBJECT_MAPS_119, + ASSET_LEVEL_OBJECT_MAPS_120, + ASSET_LEVEL_OBJECT_MAPS_121, + ASSET_LEVEL_OBJECT_MAPS_122, + ASSET_LEVEL_OBJECT_MAPS_123, + ASSET_LEVEL_OBJECT_MAPS_124, + ASSET_LEVEL_OBJECT_MAPS_125, + ASSET_LEVEL_OBJECT_MAPS_126, + ASSET_LEVEL_OBJECT_MAPS_127, + ASSET_LEVEL_OBJECT_MAPS_128, + ASSET_LEVEL_OBJECT_MAPS_129, + ASSET_LEVEL_OBJECT_MAPS_130, + ASSET_LEVEL_OBJECT_MAPS_131, + ASSET_LEVEL_OBJECT_MAPS_132, + ASSET_LEVEL_OBJECT_MAPS_133, + ASSET_LEVEL_OBJECT_MAPS_134, + ASSET_LEVEL_OBJECT_MAPS_135, + ASSET_LEVEL_OBJECT_MAPS_136, + ASSET_LEVEL_OBJECT_MAPS_137 +} AssetLevelObjectMapsEnum; + +/********** ASSET_LEVEL_HEADERS **********/ + +typedef enum { + ASSET_LEVEL_CENTRALAREAHUB, + ASSET_LEVEL_BLUEY1, + ASSET_LEVEL_DRAGONFORESTHUB, + ASSET_LEVEL_FOSSILCANYON, + ASSET_LEVEL_PIRATELAGOON, + ASSET_LEVEL_ANCIENTLAKE, + ASSET_LEVEL_WALRUSCOVE, + ASSET_LEVEL_HOTTOPVOLCANO, + ASSET_LEVEL_WHALEBAY, + ASSET_LEVEL_SNOWBALLVALLEY, + ASSET_LEVEL_CRESCENTISLAND, + ASSET_LEVEL_FIREMOUNTAIN, + ASSET_LEVEL_DINODOMAINHUB, + ASSET_LEVEL_EVERFROSTPEAK, + ASSET_LEVEL_SHERBETISLANDHUB, + ASSET_LEVEL_SPACEPORTALPHA, + ASSET_LEVEL_HORSESHOEGULCH, + ASSET_LEVEL_SPACEDUSTALLEY, + ASSET_LEVEL_GREENWOODVILLAGE, + ASSET_LEVEL_BOULDERCANYON, + ASSET_LEVEL_WINDMILLPLAINS, + ASSET_LEVEL_FRONTEND, + ASSET_LEVEL_CHARACTERSELECT, + ASSET_LEVEL_TITLESCREENSEQUENCE, + ASSET_LEVEL_SNOWFLAKEMOUNTAINHUB, + ASSET_LEVEL_SMOKEYCASTLE, + ASSET_LEVEL_DARKWATERBEACH, + ASSET_LEVEL_ICICLEPYRAMID, + ASSET_LEVEL_FROSTYVILLAGE, + ASSET_LEVEL_JUNGLEFALLS, + ASSET_LEVEL_TREASURECAVES, + ASSET_LEVEL_HAUNTEDWOODS, + ASSET_LEVEL_DARKMOONCAVERNS, + ASSET_LEVEL_STARCITY, + ASSET_LEVEL_TROPHYRACE, + ASSET_LEVEL_FUTUREFUNLANDHUB, + ASSET_LEVEL_OPENINGSEQUENCE, + ASSET_LEVEL_WIZPIG1, + ASSET_LEVEL_TRICKYTOPS1, + ASSET_LEVEL_OPTIONSBACKGROUND, + ASSET_LEVEL_BUBBLER1, + ASSET_LEVEL_SMOKEY1, + ASSET_LEVEL_WIZPIGMOUTHSEQUENCE, + ASSET_LEVEL_WIZPIGAMULETSEQUENCE, + ASSET_LEVEL_TTAMULETSEQUENCE, + ASSET_LEVEL_ROCKETSEQUENCE, + ASSET_LEVEL_TRICKYTOPS2, + ASSET_LEVEL_DINODOMAINTROPHYANIM, + ASSET_LEVEL_SNOWFLAKEMOUNTAINTROPHYANIM, + ASSET_LEVEL_SHERBETISLANDTROPHYANIM, + ASSET_LEVEL_DRAGONFORESTTROPHYANIM, + ASSET_LEVEL_FUTUREFUNLANDTROPHYANIM, + ASSET_LEVEL_BLUEY2, + ASSET_LEVEL_BUBBLER2, + ASSET_LEVEL_SMOKEY2, + ASSET_LEVEL_WIZPIG2, + ASSET_LEVEL_PARTYSEQUENCE, + ASSET_LEVEL_TRICKTOPSANIM, + ASSET_LEVEL_SMOKEYANIM, + ASSET_LEVEL_BLUEYANIM, + ASSET_LEVEL_WIZPIG1ANIM, + ASSET_LEVEL_BUBBLERANIM, + ASSET_LEVEL_WIZPIG2ANIM, + ASSET_LEVEL_LASTBIT, + ASSET_LEVEL_LASTBITB +} AssetLevelHeadersEnum; + +/********** ASSET_LEVEL_NAMES **********/ + +typedef enum { + ASSET_LEVELNAME_CENTRALAREAHUB, + ASSET_LEVELNAME_BLUEY1, + ASSET_LEVELNAME_DRAGONFORESTHUB, + ASSET_LEVELNAME_FOSSILCANYON, + ASSET_LEVELNAME_PIRATELAGOON, + ASSET_LEVELNAME_ANCIENTLAKE, + ASSET_LEVELNAME_WALRUSCOVE, + ASSET_LEVELNAME_HOTTOPVOLCANO, + ASSET_LEVELNAME_WHALEBAY, + ASSET_LEVELNAME_SNOWBALLVALLEY, + ASSET_LEVELNAME_CRESCENTISLAND, + ASSET_LEVELNAME_FIREMOUNTAIN, + ASSET_LEVELNAME_DINODOMAINHUB, + ASSET_LEVELNAME_EVERFROSTPEAK, + ASSET_LEVELNAME_SHERBETISLANDHUB, + ASSET_LEVELNAME_SPACEPORTALPHA, + ASSET_LEVELNAME_HORSESHOEGULCH, + ASSET_LEVELNAME_SPACEDUSTALLEY, + ASSET_LEVELNAME_GREENWOODVILLAGE, + ASSET_LEVELNAME_BOULDERCANYON, + ASSET_LEVELNAME_WINDMILLPLAINS, + ASSET_LEVELNAME_FRONTEND, + ASSET_LEVELNAME_CHARACTERSELECT, + ASSET_LEVELNAME_TITLESCREENSEQUENCE, + ASSET_LEVELNAME_SNOWFLAKEMOUNTAINHUB, + ASSET_LEVELNAME_SMOKEYCASTLE, + ASSET_LEVELNAME_DARKWATERBEACH, + ASSET_LEVELNAME_ICICLEPYRAMID, + ASSET_LEVELNAME_FROSTYVILLAGE, + ASSET_LEVELNAME_JUNGLEFALLS, + ASSET_LEVELNAME_TREASURECAVES, + ASSET_LEVELNAME_HAUNTEDWOODS, + ASSET_LEVELNAME_DARKMOONCAVERNS, + ASSET_LEVELNAME_STARCITY, + ASSET_LEVELNAME_TROPHYRACE, + ASSET_LEVELNAME_FUTUREFUNLANDHUB, + ASSET_LEVELNAME_OPENINGSEQUENCE, + ASSET_LEVELNAME_WIZPIG1, + ASSET_LEVELNAME_TRICKYTOPS1, + ASSET_LEVELNAME_OPTIONSBACKGROUND, + ASSET_LEVELNAME_BUBBLER1, + ASSET_LEVELNAME_SMOKEY1, + ASSET_LEVELNAME_WIZPIGMOUTHSEQUENCE, + ASSET_LEVELNAME_WIZPIGAMULETSEQUENCE, + ASSET_LEVELNAME_TTAMULETSEQUENCE, + ASSET_LEVELNAME_ROCKETSEQUENCE, + ASSET_LEVELNAME_TRICKYTOPS2, + ASSET_LEVELNAME_DINODOMAINTROPHYANIM, + ASSET_LEVELNAME_SNOWFLAKEMOUNTAINTROPHYANIM, + ASSET_LEVELNAME_SHERBETISLANDTROPHYANIM, + ASSET_LEVELNAME_DRAGONFORESTTROPHYANIM, + ASSET_LEVELNAME_FUTUREFUNLANDTROPHYANIM, + ASSET_LEVELNAME_BLUEY2, + ASSET_LEVELNAME_BUBBLER2, + ASSET_LEVELNAME_SMOKEY2, + ASSET_LEVELNAME_WIZPIG2, + ASSET_LEVELNAME_PARTYSEQUENCE, + ASSET_LEVELNAME_TRICKTOPSANIM, + ASSET_LEVELNAME_SMOKEYANIM, + ASSET_LEVELNAME_BLUEYANIM, + ASSET_LEVELNAME_WIZPIG1ANIM, + ASSET_LEVELNAME_BUBBLERANIM, + ASSET_LEVELNAME_WIZPIG2ANIM, + ASSET_LEVELNAME_LASTBIT, + ASSET_LEVELNAME_LASTBITB +} AssetLevelNamesEnum; + +/********** ASSET_LEVEL_MODELS **********/ + +typedef enum { + ASSET_LEVEL_MODELS_0, + ASSET_LEVEL_MODELS_1, + ASSET_LEVEL_MODELS_2, + ASSET_LEVEL_MODELS_3, + ASSET_LEVEL_MODELS_4, + ASSET_LEVEL_MODELS_5, + ASSET_LEVEL_MODELS_6, + ASSET_LEVEL_MODELS_7, + ASSET_LEVEL_MODELS_8, + ASSET_LEVEL_MODELS_9, + ASSET_LEVEL_MODELS_10, + ASSET_LEVEL_MODELS_11, + ASSET_LEVEL_MODELS_12, + ASSET_LEVEL_MODELS_13, + ASSET_LEVEL_MODELS_14, + ASSET_LEVEL_MODELS_15, + ASSET_LEVEL_MODELS_16, + ASSET_LEVEL_MODELS_17, + ASSET_LEVEL_MODELS_18, + ASSET_LEVEL_MODELS_19, + ASSET_LEVEL_MODELS_20, + ASSET_LEVEL_MODELS_21, + ASSET_LEVEL_MODELS_22, + ASSET_LEVEL_MODELS_23, + ASSET_LEVEL_MODELS_24, + ASSET_LEVEL_MODELS_25, + ASSET_LEVEL_MODELS_26, + ASSET_LEVEL_MODELS_27, + ASSET_LEVEL_MODELS_28, + ASSET_LEVEL_MODELS_29, + ASSET_LEVEL_MODELS_30, + ASSET_LEVEL_MODELS_31, + ASSET_LEVEL_MODELS_32, + ASSET_LEVEL_MODELS_33, + ASSET_LEVEL_MODELS_34, + ASSET_LEVEL_MODELS_35, + ASSET_LEVEL_MODELS_36, + ASSET_LEVEL_MODELS_37, + ASSET_LEVEL_MODELS_38, + ASSET_LEVEL_MODELS_39, + ASSET_LEVEL_MODELS_40, + ASSET_LEVEL_MODELS_41, + ASSET_LEVEL_MODELS_42, + ASSET_LEVEL_MODELS_43, + ASSET_LEVEL_MODELS_44, + ASSET_LEVEL_MODELS_45, + ASSET_LEVEL_MODELS_46, + ASSET_LEVEL_MODELS_47, + ASSET_LEVEL_MODELS_48, + ASSET_LEVEL_MODELS_49, + ASSET_LEVEL_MODELS_50, + ASSET_LEVEL_MODELS_51, + ASSET_LEVEL_MODELS_52, + ASSET_LEVEL_MODELS_53, + ASSET_LEVEL_MODELS_54 +} AssetLevelModelsEnum; + +/********** ASSET_OBJECT_MODELS **********/ + +typedef enum { + ASSET_OBJECT_MODELS_0, + ASSET_OBJECT_MODELS_1, + ASSET_OBJECT_MODELS_2, + ASSET_OBJECT_MODELS_3, + ASSET_OBJECT_MODELS_4, + ASSET_OBJECT_MODELS_5, + ASSET_OBJECT_MODELS_6, + ASSET_OBJECT_MODELS_7, + ASSET_OBJECT_MODELS_8, + ASSET_OBJECT_MODELS_9, + ASSET_OBJECT_MODELS_10, + ASSET_OBJECT_MODELS_11, + ASSET_OBJECT_MODELS_12, + ASSET_OBJECT_MODELS_13, + ASSET_OBJECT_MODELS_14, + ASSET_OBJECT_MODELS_15, + ASSET_OBJECT_MODELS_16, + ASSET_OBJECT_MODELS_17, + ASSET_OBJECT_MODELS_18, + ASSET_OBJECT_MODELS_19, + ASSET_OBJECT_MODELS_20, + ASSET_OBJECT_MODELS_21, + ASSET_OBJECT_MODELS_22, + ASSET_OBJECT_MODELS_23, + ASSET_OBJECT_MODELS_24, + ASSET_OBJECT_MODELS_25, + ASSET_OBJECT_MODELS_26, + ASSET_OBJECT_MODELS_27, + ASSET_OBJECT_MODELS_28, + ASSET_OBJECT_MODELS_29, + ASSET_OBJECT_MODELS_30, + ASSET_OBJECT_MODELS_31, + ASSET_OBJECT_MODELS_32, + ASSET_OBJECT_MODELS_33, + ASSET_OBJECT_MODELS_34, + ASSET_OBJECT_MODELS_35, + ASSET_OBJECT_MODELS_36, + ASSET_OBJECT_MODELS_37, + ASSET_OBJECT_MODELS_38, + ASSET_OBJECT_MODELS_39, + ASSET_OBJECT_MODELS_40, + ASSET_OBJECT_MODELS_41, + ASSET_OBJECT_MODELS_42, + ASSET_OBJECT_MODELS_43, + ASSET_OBJECT_MODELS_44, + ASSET_OBJECT_MODELS_45, + ASSET_OBJECT_MODELS_46, + ASSET_OBJECT_MODELS_47, + ASSET_OBJECT_MODELS_48, + ASSET_OBJECT_MODELS_49, + ASSET_OBJECT_MODELS_50, + ASSET_OBJECT_MODELS_51, + ASSET_OBJECT_MODELS_52, + ASSET_OBJECT_MODELS_53, + ASSET_OBJECT_MODELS_54, + ASSET_OBJECT_MODELS_55, + ASSET_OBJECT_MODELS_56, + ASSET_OBJECT_MODELS_57, + ASSET_OBJECT_MODELS_58, + ASSET_OBJECT_MODELS_59, + ASSET_OBJECT_MODELS_60, + ASSET_OBJECT_MODELS_61, + ASSET_OBJECT_MODELS_62, + ASSET_OBJECT_MODELS_63, + ASSET_OBJECT_MODELS_64, + ASSET_OBJECT_MODELS_65, + ASSET_OBJECT_MODELS_66, + ASSET_OBJECT_MODELS_67, + ASSET_OBJECT_MODELS_68, + ASSET_OBJECT_MODELS_69, + ASSET_OBJECT_MODELS_70, + ASSET_OBJECT_MODELS_71, + ASSET_OBJECT_MODELS_72, + ASSET_OBJECT_MODELS_73, + ASSET_OBJECT_MODELS_74, + ASSET_OBJECT_MODELS_75, + ASSET_OBJECT_MODELS_76, + ASSET_OBJECT_MODELS_77, + ASSET_OBJECT_MODELS_78, + ASSET_OBJECT_MODELS_79, + ASSET_OBJECT_MODELS_80, + ASSET_OBJECT_MODELS_81, + ASSET_OBJECT_MODELS_82, + ASSET_OBJECT_MODELS_83, + ASSET_OBJECT_MODELS_84, + ASSET_OBJECT_MODELS_85, + ASSET_OBJECT_MODELS_86, + ASSET_OBJECT_MODELS_87, + ASSET_OBJECT_MODELS_88, + ASSET_OBJECT_MODELS_89, + ASSET_OBJECT_MODELS_90, + ASSET_OBJECT_MODELS_91, + ASSET_OBJECT_MODELS_92, + ASSET_OBJECT_MODELS_93, + ASSET_OBJECT_MODELS_94, + ASSET_OBJECT_MODELS_95, + ASSET_OBJECT_MODELS_96, + ASSET_OBJECT_MODELS_97, + ASSET_OBJECT_MODELS_98, + ASSET_OBJECT_MODELS_99, + ASSET_OBJECT_MODELS_100, + ASSET_OBJECT_MODELS_101, + ASSET_OBJECT_MODELS_102, + ASSET_OBJECT_MODELS_103, + ASSET_OBJECT_MODELS_104, + ASSET_OBJECT_MODELS_105, + ASSET_OBJECT_MODELS_106, + ASSET_OBJECT_MODELS_107, + ASSET_OBJECT_MODELS_108, + ASSET_OBJECT_MODELS_109, + ASSET_OBJECT_MODELS_110, + ASSET_OBJECT_MODELS_111, + ASSET_OBJECT_MODELS_112, + ASSET_OBJECT_MODELS_113, + ASSET_OBJECT_MODELS_114, + ASSET_OBJECT_MODELS_115, + ASSET_OBJECT_MODELS_116, + ASSET_OBJECT_MODELS_117, + ASSET_OBJECT_MODELS_118, + ASSET_OBJECT_MODELS_119, + ASSET_OBJECT_MODELS_120, + ASSET_OBJECT_MODELS_121, + ASSET_OBJECT_MODELS_122, + ASSET_OBJECT_MODELS_123, + ASSET_OBJECT_MODELS_124, + ASSET_OBJECT_MODELS_125, + ASSET_OBJECT_MODELS_126, + ASSET_OBJECT_MODELS_127, + ASSET_OBJECT_MODELS_128, + ASSET_OBJECT_MODELS_129, + ASSET_OBJECT_MODELS_130, + ASSET_OBJECT_MODELS_131, + ASSET_OBJECT_MODELS_132, + ASSET_OBJECT_MODELS_133, + ASSET_OBJECT_MODELS_134, + ASSET_OBJECT_MODELS_135, + ASSET_OBJECT_MODELS_136, + ASSET_OBJECT_MODELS_137, + ASSET_OBJECT_MODELS_138, + ASSET_OBJECT_MODELS_139, + ASSET_OBJECT_MODELS_140, + ASSET_OBJECT_MODELS_141, + ASSET_OBJECT_MODELS_142, + ASSET_OBJECT_MODELS_143, + ASSET_OBJECT_MODELS_144, + ASSET_OBJECT_MODELS_145, + ASSET_OBJECT_MODELS_146, + ASSET_OBJECT_MODELS_147, + ASSET_OBJECT_MODELS_148, + ASSET_OBJECT_MODELS_149, + ASSET_OBJECT_MODELS_150, + ASSET_OBJECT_MODELS_151, + ASSET_OBJECT_MODELS_152, + ASSET_OBJECT_MODELS_153, + ASSET_OBJECT_MODELS_154, + ASSET_OBJECT_MODELS_155, + ASSET_OBJECT_MODELS_156, + ASSET_OBJECT_MODELS_157, + ASSET_OBJECT_MODELS_158, + ASSET_OBJECT_MODELS_159, + ASSET_OBJECT_MODELS_160, + ASSET_OBJECT_MODELS_161, + ASSET_OBJECT_MODELS_162, + ASSET_OBJECT_MODELS_163, + ASSET_OBJECT_MODELS_164, + ASSET_OBJECT_MODELS_165, + ASSET_OBJECT_MODELS_166, + ASSET_OBJECT_MODELS_167, + ASSET_OBJECT_MODELS_168, + ASSET_OBJECT_MODELS_169, + ASSET_OBJECT_MODELS_170, + ASSET_OBJECT_MODELS_171, + ASSET_OBJECT_MODELS_172, + ASSET_OBJECT_MODELS_173, + ASSET_OBJECT_MODELS_174, + ASSET_OBJECT_MODELS_175, + ASSET_OBJECT_MODELS_176, + ASSET_OBJECT_MODELS_177, + ASSET_OBJECT_MODELS_178, + ASSET_OBJECT_MODELS_179, + ASSET_OBJECT_MODELS_180, + ASSET_OBJECT_MODELS_181, + ASSET_OBJECT_MODELS_182, + ASSET_OBJECT_MODELS_183, + ASSET_OBJECT_MODELS_184, + ASSET_OBJECT_MODELS_185, + ASSET_OBJECT_MODELS_186, + ASSET_OBJECT_MODELS_187, + ASSET_OBJECT_MODELS_188, + ASSET_OBJECT_MODELS_189, + ASSET_OBJECT_MODELS_190, + ASSET_OBJECT_MODELS_191, + ASSET_OBJECT_MODELS_192, + ASSET_OBJECT_MODELS_193, + ASSET_OBJECT_MODELS_194, + ASSET_OBJECT_MODELS_195, + ASSET_OBJECT_MODELS_196, + ASSET_OBJECT_MODELS_197, + ASSET_OBJECT_MODELS_198, + ASSET_OBJECT_MODELS_199, + ASSET_OBJECT_MODELS_200, + ASSET_OBJECT_MODELS_201, + ASSET_OBJECT_MODELS_202, + ASSET_OBJECT_MODELS_203, + ASSET_OBJECT_MODELS_204, + ASSET_OBJECT_MODELS_205, + ASSET_OBJECT_MODELS_206, + ASSET_OBJECT_MODELS_207, + ASSET_OBJECT_MODELS_208, + ASSET_OBJECT_MODELS_209, + ASSET_OBJECT_MODELS_210, + ASSET_OBJECT_MODELS_211, + ASSET_OBJECT_MODELS_212, + ASSET_OBJECT_MODELS_213, + ASSET_OBJECT_MODELS_214, + ASSET_OBJECT_MODELS_215, + ASSET_OBJECT_MODELS_216, + ASSET_OBJECT_MODELS_217, + ASSET_OBJECT_MODELS_218, + ASSET_OBJECT_MODELS_219, + ASSET_OBJECT_MODELS_220, + ASSET_OBJECT_MODELS_221, + ASSET_OBJECT_MODELS_222, + ASSET_OBJECT_MODELS_223, + ASSET_OBJECT_MODELS_224, + ASSET_OBJECT_MODELS_225, + ASSET_OBJECT_MODELS_226, + ASSET_OBJECT_MODELS_227, + ASSET_OBJECT_MODELS_228, + ASSET_OBJECT_MODELS_229, + ASSET_OBJECT_MODELS_230, + ASSET_OBJECT_MODELS_231, + ASSET_OBJECT_MODELS_232, + ASSET_OBJECT_MODELS_233, + ASSET_OBJECT_MODELS_234, + ASSET_OBJECT_MODELS_235, + ASSET_OBJECT_MODELS_236, + ASSET_OBJECT_MODELS_237, + ASSET_OBJECT_MODELS_238, + ASSET_OBJECT_MODELS_239, + ASSET_OBJECT_MODELS_240, + ASSET_OBJECT_MODELS_241, + ASSET_OBJECT_MODELS_242, + ASSET_OBJECT_MODELS_243, + ASSET_OBJECT_MODELS_244, + ASSET_OBJECT_MODELS_245, + ASSET_OBJECT_MODELS_246, + ASSET_OBJECT_MODELS_247, + ASSET_OBJECT_MODELS_248, + ASSET_OBJECT_MODELS_249, + ASSET_OBJECT_MODELS_250, + ASSET_OBJECT_MODELS_251, + ASSET_OBJECT_MODELS_252, + ASSET_OBJECT_MODELS_253, + ASSET_OBJECT_MODELS_254, + ASSET_OBJECT_MODELS_255, + ASSET_OBJECT_MODELS_256, + ASSET_OBJECT_MODELS_257, + ASSET_OBJECT_MODELS_258, + ASSET_OBJECT_MODELS_259, + ASSET_OBJECT_MODELS_260, + ASSET_OBJECT_MODELS_261, + ASSET_OBJECT_MODELS_262, + ASSET_OBJECT_MODELS_263, + ASSET_OBJECT_MODELS_264, + ASSET_OBJECT_MODELS_265, + ASSET_OBJECT_MODELS_266, + ASSET_OBJECT_MODELS_267, + ASSET_OBJECT_MODELS_268, + ASSET_OBJECT_MODELS_269, + ASSET_OBJECT_MODELS_270, + ASSET_OBJECT_MODELS_271, + ASSET_OBJECT_MODELS_272, + ASSET_OBJECT_MODELS_273, + ASSET_OBJECT_MODELS_274, + ASSET_OBJECT_MODELS_275, + ASSET_OBJECT_MODELS_276, + ASSET_OBJECT_MODELS_277, + ASSET_OBJECT_MODELS_278, + ASSET_OBJECT_MODELS_279, + ASSET_OBJECT_MODELS_280, + ASSET_OBJECT_MODELS_281, + ASSET_OBJECT_MODELS_282, + ASSET_OBJECT_MODELS_283, + ASSET_OBJECT_MODELS_284, + ASSET_OBJECT_MODELS_285, + ASSET_OBJECT_MODELS_286, + ASSET_OBJECT_MODELS_287, + ASSET_OBJECT_MODELS_288, + ASSET_OBJECT_MODELS_289, + ASSET_OBJECT_MODELS_290, + ASSET_OBJECT_MODELS_291, + ASSET_OBJECT_MODELS_292, + ASSET_OBJECT_MODELS_293, + ASSET_OBJECT_MODELS_294, + ASSET_OBJECT_MODELS_295, + ASSET_OBJECT_MODELS_296, + ASSET_OBJECT_MODELS_297, + ASSET_OBJECT_MODELS_298, + ASSET_OBJECT_MODELS_299, + ASSET_OBJECT_MODELS_300, + ASSET_OBJECT_MODELS_301, + ASSET_OBJECT_MODELS_302, + ASSET_OBJECT_MODELS_303, + ASSET_OBJECT_MODELS_304, + ASSET_OBJECT_MODELS_305, + ASSET_OBJECT_MODELS_306, + ASSET_OBJECT_MODELS_307, + ASSET_OBJECT_MODELS_308, + ASSET_OBJECT_MODELS_309, + ASSET_OBJECT_MODELS_310, + ASSET_OBJECT_MODELS_311, + ASSET_OBJECT_MODELS_312, + ASSET_OBJECT_MODELS_313, + ASSET_OBJECT_MODELS_314, + ASSET_OBJECT_MODELS_315, + ASSET_OBJECT_MODELS_316, + ASSET_OBJECT_MODELS_317, + ASSET_OBJECT_MODELS_318, + ASSET_OBJECT_MODELS_319, + ASSET_OBJECT_MODELS_320, + ASSET_OBJECT_MODELS_321, + ASSET_OBJECT_MODELS_322, + ASSET_OBJECT_MODELS_323, + ASSET_OBJECT_MODELS_324, + ASSET_OBJECT_MODELS_325, + ASSET_OBJECT_MODELS_326, + ASSET_OBJECT_MODELS_327, + ASSET_OBJECT_MODELS_328, + ASSET_OBJECT_MODELS_329, + ASSET_OBJECT_MODELS_330, + ASSET_OBJECT_MODELS_331, + ASSET_OBJECT_MODELS_332, + ASSET_OBJECT_MODELS_333, + ASSET_OBJECT_MODELS_334, + ASSET_OBJECT_MODELS_335, + ASSET_OBJECT_MODELS_336, + ASSET_OBJECT_MODELS_337, + ASSET_OBJECT_MODELS_338, + ASSET_OBJECT_MODELS_339, + ASSET_OBJECT_MODELS_340, + ASSET_OBJECT_MODELS_341, + ASSET_OBJECT_MODELS_342, + ASSET_OBJECT_MODELS_343, + ASSET_OBJECT_MODELS_344, + ASSET_OBJECT_MODELS_345, + ASSET_OBJECT_MODELS_346, + ASSET_OBJECT_MODELS_347, + ASSET_OBJECT_MODELS_348, + ASSET_OBJECT_MODELS_349, + ASSET_OBJECT_MODELS_350, + ASSET_OBJECT_MODELS_351, + ASSET_OBJECT_MODELS_352, + ASSET_OBJECT_MODELS_353, + ASSET_OBJECT_MODELS_354, + ASSET_OBJECT_MODELS_355, + ASSET_OBJECT_MODELS_356, + ASSET_OBJECT_MODELS_357, + ASSET_OBJECT_MODELS_358, + ASSET_OBJECT_MODELS_359, + ASSET_OBJECT_MODELS_360, + ASSET_OBJECT_MODELS_361, + ASSET_OBJECT_MODELS_362, + ASSET_OBJECT_MODELS_363, + ASSET_OBJECT_MODELS_364, + ASSET_OBJECT_MODELS_365, + ASSET_OBJECT_MODELS_366, + ASSET_OBJECT_MODELS_367, + ASSET_OBJECT_MODELS_368, + ASSET_OBJECT_MODELS_369, + ASSET_OBJECT_MODELS_370, + ASSET_OBJECT_MODELS_371, + ASSET_OBJECT_MODELS_372, + ASSET_OBJECT_MODELS_373, + ASSET_OBJECT_MODELS_374, + ASSET_OBJECT_MODELS_375, + ASSET_OBJECT_MODELS_376, + ASSET_OBJECT_MODELS_377, + ASSET_OBJECT_MODELS_378, + ASSET_OBJECT_MODELS_379, + ASSET_OBJECT_MODELS_380, + ASSET_OBJECT_MODELS_381, + ASSET_OBJECT_MODELS_382, + ASSET_OBJECT_MODELS_383, + ASSET_OBJECT_MODELS_384, + ASSET_OBJECT_MODELS_385, + ASSET_OBJECT_MODELS_386, + ASSET_OBJECT_MODELS_387, + ASSET_OBJECT_MODELS_388, + ASSET_OBJECT_MODELS_389 +} AssetObjectModelsEnum; + +/********** ASSET_OBJECT_ANIMATIONS **********/ + +typedef enum { + ASSET_OBJECT_ANIMATIONS_0, + ASSET_OBJECT_ANIMATIONS_1, + ASSET_OBJECT_ANIMATIONS_2, + ASSET_OBJECT_ANIMATIONS_3, + ASSET_OBJECT_ANIMATIONS_4, + ASSET_OBJECT_ANIMATIONS_5, + ASSET_OBJECT_ANIMATIONS_6, + ASSET_OBJECT_ANIMATIONS_7, + ASSET_OBJECT_ANIMATIONS_8, + ASSET_OBJECT_ANIMATIONS_9, + ASSET_OBJECT_ANIMATIONS_10, + ASSET_OBJECT_ANIMATIONS_11, + ASSET_OBJECT_ANIMATIONS_12, + ASSET_OBJECT_ANIMATIONS_13, + ASSET_OBJECT_ANIMATIONS_14, + ASSET_OBJECT_ANIMATIONS_15, + ASSET_OBJECT_ANIMATIONS_16, + ASSET_OBJECT_ANIMATIONS_17, + ASSET_OBJECT_ANIMATIONS_18, + ASSET_OBJECT_ANIMATIONS_19, + ASSET_OBJECT_ANIMATIONS_20, + ASSET_OBJECT_ANIMATIONS_21, + ASSET_OBJECT_ANIMATIONS_22, + ASSET_OBJECT_ANIMATIONS_23, + ASSET_OBJECT_ANIMATIONS_24, + ASSET_OBJECT_ANIMATIONS_25, + ASSET_OBJECT_ANIMATIONS_26, + ASSET_OBJECT_ANIMATIONS_27, + ASSET_OBJECT_ANIMATIONS_28, + ASSET_OBJECT_ANIMATIONS_29, + ASSET_OBJECT_ANIMATIONS_30, + ASSET_OBJECT_ANIMATIONS_31, + ASSET_OBJECT_ANIMATIONS_32, + ASSET_OBJECT_ANIMATIONS_33, + ASSET_OBJECT_ANIMATIONS_34, + ASSET_OBJECT_ANIMATIONS_35, + ASSET_OBJECT_ANIMATIONS_36, + ASSET_OBJECT_ANIMATIONS_37, + ASSET_OBJECT_ANIMATIONS_38, + ASSET_OBJECT_ANIMATIONS_39, + ASSET_OBJECT_ANIMATIONS_40, + ASSET_OBJECT_ANIMATIONS_41, + ASSET_OBJECT_ANIMATIONS_42, + ASSET_OBJECT_ANIMATIONS_43, + ASSET_OBJECT_ANIMATIONS_44, + ASSET_OBJECT_ANIMATIONS_45, + ASSET_OBJECT_ANIMATIONS_46, + ASSET_OBJECT_ANIMATIONS_47, + ASSET_OBJECT_ANIMATIONS_48, + ASSET_OBJECT_ANIMATIONS_49, + ASSET_OBJECT_ANIMATIONS_50, + ASSET_OBJECT_ANIMATIONS_51, + ASSET_OBJECT_ANIMATIONS_52, + ASSET_OBJECT_ANIMATIONS_53, + ASSET_OBJECT_ANIMATIONS_54, + ASSET_OBJECT_ANIMATIONS_55, + ASSET_OBJECT_ANIMATIONS_56, + ASSET_OBJECT_ANIMATIONS_57, + ASSET_OBJECT_ANIMATIONS_58, + ASSET_OBJECT_ANIMATIONS_59, + ASSET_OBJECT_ANIMATIONS_60, + ASSET_OBJECT_ANIMATIONS_61, + ASSET_OBJECT_ANIMATIONS_62, + ASSET_OBJECT_ANIMATIONS_63, + ASSET_OBJECT_ANIMATIONS_64, + ASSET_OBJECT_ANIMATIONS_65, + ASSET_OBJECT_ANIMATIONS_66, + ASSET_OBJECT_ANIMATIONS_67, + ASSET_OBJECT_ANIMATIONS_68, + ASSET_OBJECT_ANIMATIONS_69, + ASSET_OBJECT_ANIMATIONS_70, + ASSET_OBJECT_ANIMATIONS_71, + ASSET_OBJECT_ANIMATIONS_72, + ASSET_OBJECT_ANIMATIONS_73, + ASSET_OBJECT_ANIMATIONS_74, + ASSET_OBJECT_ANIMATIONS_75, + ASSET_OBJECT_ANIMATIONS_76, + ASSET_OBJECT_ANIMATIONS_77, + ASSET_OBJECT_ANIMATIONS_78, + ASSET_OBJECT_ANIMATIONS_79, + ASSET_OBJECT_ANIMATIONS_80, + ASSET_OBJECT_ANIMATIONS_81, + ASSET_OBJECT_ANIMATIONS_82, + ASSET_OBJECT_ANIMATIONS_83, + ASSET_OBJECT_ANIMATIONS_84, + ASSET_OBJECT_ANIMATIONS_85, + ASSET_OBJECT_ANIMATIONS_86, + ASSET_OBJECT_ANIMATIONS_87, + ASSET_OBJECT_ANIMATIONS_88, + ASSET_OBJECT_ANIMATIONS_89, + ASSET_OBJECT_ANIMATIONS_90, + ASSET_OBJECT_ANIMATIONS_91, + ASSET_OBJECT_ANIMATIONS_92, + ASSET_OBJECT_ANIMATIONS_93, + ASSET_OBJECT_ANIMATIONS_94, + ASSET_OBJECT_ANIMATIONS_95, + ASSET_OBJECT_ANIMATIONS_96, + ASSET_OBJECT_ANIMATIONS_97, + ASSET_OBJECT_ANIMATIONS_98, + ASSET_OBJECT_ANIMATIONS_99, + ASSET_OBJECT_ANIMATIONS_100, + ASSET_OBJECT_ANIMATIONS_101, + ASSET_OBJECT_ANIMATIONS_102, + ASSET_OBJECT_ANIMATIONS_103, + ASSET_OBJECT_ANIMATIONS_104, + ASSET_OBJECT_ANIMATIONS_105, + ASSET_OBJECT_ANIMATIONS_106, + ASSET_OBJECT_ANIMATIONS_107, + ASSET_OBJECT_ANIMATIONS_108, + ASSET_OBJECT_ANIMATIONS_109, + ASSET_OBJECT_ANIMATIONS_110, + ASSET_OBJECT_ANIMATIONS_111, + ASSET_OBJECT_ANIMATIONS_112, + ASSET_OBJECT_ANIMATIONS_113, + ASSET_OBJECT_ANIMATIONS_114, + ASSET_OBJECT_ANIMATIONS_115, + ASSET_OBJECT_ANIMATIONS_116, + ASSET_OBJECT_ANIMATIONS_117, + ASSET_OBJECT_ANIMATIONS_118, + ASSET_OBJECT_ANIMATIONS_119, + ASSET_OBJECT_ANIMATIONS_120, + ASSET_OBJECT_ANIMATIONS_121, + ASSET_OBJECT_ANIMATIONS_122, + ASSET_OBJECT_ANIMATIONS_123, + ASSET_OBJECT_ANIMATIONS_124, + ASSET_OBJECT_ANIMATIONS_125, + ASSET_OBJECT_ANIMATIONS_126, + ASSET_OBJECT_ANIMATIONS_127, + ASSET_OBJECT_ANIMATIONS_128, + ASSET_OBJECT_ANIMATIONS_129, + ASSET_OBJECT_ANIMATIONS_130, + ASSET_OBJECT_ANIMATIONS_131, + ASSET_OBJECT_ANIMATIONS_132, + ASSET_OBJECT_ANIMATIONS_133, + ASSET_OBJECT_ANIMATIONS_134, + ASSET_OBJECT_ANIMATIONS_135, + ASSET_OBJECT_ANIMATIONS_136, + ASSET_OBJECT_ANIMATIONS_137, + ASSET_OBJECT_ANIMATIONS_138, + ASSET_OBJECT_ANIMATIONS_139, + ASSET_OBJECT_ANIMATIONS_140, + ASSET_OBJECT_ANIMATIONS_141, + ASSET_OBJECT_ANIMATIONS_142, + ASSET_OBJECT_ANIMATIONS_143, + ASSET_OBJECT_ANIMATIONS_144, + ASSET_OBJECT_ANIMATIONS_145, + ASSET_OBJECT_ANIMATIONS_146, + ASSET_OBJECT_ANIMATIONS_147, + ASSET_OBJECT_ANIMATIONS_148, + ASSET_OBJECT_ANIMATIONS_149, + ASSET_OBJECT_ANIMATIONS_150, + ASSET_OBJECT_ANIMATIONS_151, + ASSET_OBJECT_ANIMATIONS_152, + ASSET_OBJECT_ANIMATIONS_153, + ASSET_OBJECT_ANIMATIONS_154, + ASSET_OBJECT_ANIMATIONS_155, + ASSET_OBJECT_ANIMATIONS_156, + ASSET_OBJECT_ANIMATIONS_157, + ASSET_OBJECT_ANIMATIONS_158, + ASSET_OBJECT_ANIMATIONS_159, + ASSET_OBJECT_ANIMATIONS_160, + ASSET_OBJECT_ANIMATIONS_161, + ASSET_OBJECT_ANIMATIONS_162, + ASSET_OBJECT_ANIMATIONS_163, + ASSET_OBJECT_ANIMATIONS_164, + ASSET_OBJECT_ANIMATIONS_165, + ASSET_OBJECT_ANIMATIONS_166, + ASSET_OBJECT_ANIMATIONS_167, + ASSET_OBJECT_ANIMATIONS_168, + ASSET_OBJECT_ANIMATIONS_169, + ASSET_OBJECT_ANIMATIONS_170, + ASSET_OBJECT_ANIMATIONS_171, + ASSET_OBJECT_ANIMATIONS_172, + ASSET_OBJECT_ANIMATIONS_173, + ASSET_OBJECT_ANIMATIONS_174, + ASSET_OBJECT_ANIMATIONS_175, + ASSET_OBJECT_ANIMATIONS_176, + ASSET_OBJECT_ANIMATIONS_177, + ASSET_OBJECT_ANIMATIONS_178, + ASSET_OBJECT_ANIMATIONS_179, + ASSET_OBJECT_ANIMATIONS_180, + ASSET_OBJECT_ANIMATIONS_181, + ASSET_OBJECT_ANIMATIONS_182, + ASSET_OBJECT_ANIMATIONS_183, + ASSET_OBJECT_ANIMATIONS_184, + ASSET_OBJECT_ANIMATIONS_185, + ASSET_OBJECT_ANIMATIONS_186, + ASSET_OBJECT_ANIMATIONS_187, + ASSET_OBJECT_ANIMATIONS_188, + ASSET_OBJECT_ANIMATIONS_189, + ASSET_OBJECT_ANIMATIONS_190, + ASSET_OBJECT_ANIMATIONS_191, + ASSET_OBJECT_ANIMATIONS_192, + ASSET_OBJECT_ANIMATIONS_193, + ASSET_OBJECT_ANIMATIONS_194, + ASSET_OBJECT_ANIMATIONS_195, + ASSET_OBJECT_ANIMATIONS_196, + ASSET_OBJECT_ANIMATIONS_197, + ASSET_OBJECT_ANIMATIONS_198, + ASSET_OBJECT_ANIMATIONS_199, + ASSET_OBJECT_ANIMATIONS_200, + ASSET_OBJECT_ANIMATIONS_201, + ASSET_OBJECT_ANIMATIONS_202, + ASSET_OBJECT_ANIMATIONS_203, + ASSET_OBJECT_ANIMATIONS_204, + ASSET_OBJECT_ANIMATIONS_205, + ASSET_OBJECT_ANIMATIONS_206, + ASSET_OBJECT_ANIMATIONS_207, + ASSET_OBJECT_ANIMATIONS_208, + ASSET_OBJECT_ANIMATIONS_209, + ASSET_OBJECT_ANIMATIONS_210, + ASSET_OBJECT_ANIMATIONS_211, + ASSET_OBJECT_ANIMATIONS_212, + ASSET_OBJECT_ANIMATIONS_213, + ASSET_OBJECT_ANIMATIONS_214, + ASSET_OBJECT_ANIMATIONS_215, + ASSET_OBJECT_ANIMATIONS_216, + ASSET_OBJECT_ANIMATIONS_217, + ASSET_OBJECT_ANIMATIONS_218, + ASSET_OBJECT_ANIMATIONS_219, + ASSET_OBJECT_ANIMATIONS_220, + ASSET_OBJECT_ANIMATIONS_221, + ASSET_OBJECT_ANIMATIONS_222, + ASSET_OBJECT_ANIMATIONS_223, + ASSET_OBJECT_ANIMATIONS_224, + ASSET_OBJECT_ANIMATIONS_225, + ASSET_OBJECT_ANIMATIONS_226, + ASSET_OBJECT_ANIMATIONS_227, + ASSET_OBJECT_ANIMATIONS_228, + ASSET_OBJECT_ANIMATIONS_229, + ASSET_OBJECT_ANIMATIONS_230, + ASSET_OBJECT_ANIMATIONS_231, + ASSET_OBJECT_ANIMATIONS_232, + ASSET_OBJECT_ANIMATIONS_233, + ASSET_OBJECT_ANIMATIONS_234, + ASSET_OBJECT_ANIMATIONS_235, + ASSET_OBJECT_ANIMATIONS_236, + ASSET_OBJECT_ANIMATIONS_237, + ASSET_OBJECT_ANIMATIONS_238, + ASSET_OBJECT_ANIMATIONS_239, + ASSET_OBJECT_ANIMATIONS_240, + ASSET_OBJECT_ANIMATIONS_241, + ASSET_OBJECT_ANIMATIONS_242, + ASSET_OBJECT_ANIMATIONS_243, + ASSET_OBJECT_ANIMATIONS_244, + ASSET_OBJECT_ANIMATIONS_245, + ASSET_OBJECT_ANIMATIONS_246, + ASSET_OBJECT_ANIMATIONS_247, + ASSET_OBJECT_ANIMATIONS_248, + ASSET_OBJECT_ANIMATIONS_249, + ASSET_OBJECT_ANIMATIONS_250, + ASSET_OBJECT_ANIMATIONS_251, + ASSET_OBJECT_ANIMATIONS_252, + ASSET_OBJECT_ANIMATIONS_253, + ASSET_OBJECT_ANIMATIONS_254, + ASSET_OBJECT_ANIMATIONS_255, + ASSET_OBJECT_ANIMATIONS_256, + ASSET_OBJECT_ANIMATIONS_257, + ASSET_OBJECT_ANIMATIONS_258, + ASSET_OBJECT_ANIMATIONS_259, + ASSET_OBJECT_ANIMATIONS_260, + ASSET_OBJECT_ANIMATIONS_261, + ASSET_OBJECT_ANIMATIONS_262, + ASSET_OBJECT_ANIMATIONS_263, + ASSET_OBJECT_ANIMATIONS_264, + ASSET_OBJECT_ANIMATIONS_265, + ASSET_OBJECT_ANIMATIONS_266, + ASSET_OBJECT_ANIMATIONS_267, + ASSET_OBJECT_ANIMATIONS_268, + ASSET_OBJECT_ANIMATIONS_269, + ASSET_OBJECT_ANIMATIONS_270, + ASSET_OBJECT_ANIMATIONS_271, + ASSET_OBJECT_ANIMATIONS_272, + ASSET_OBJECT_ANIMATIONS_273, + ASSET_OBJECT_ANIMATIONS_274, + ASSET_OBJECT_ANIMATIONS_275, + ASSET_OBJECT_ANIMATIONS_276, + ASSET_OBJECT_ANIMATIONS_277, + ASSET_OBJECT_ANIMATIONS_278, + ASSET_OBJECT_ANIMATIONS_279, + ASSET_OBJECT_ANIMATIONS_280, + ASSET_OBJECT_ANIMATIONS_281, + ASSET_OBJECT_ANIMATIONS_282, + ASSET_OBJECT_ANIMATIONS_283, + ASSET_OBJECT_ANIMATIONS_284, + ASSET_OBJECT_ANIMATIONS_285, + ASSET_OBJECT_ANIMATIONS_286, + ASSET_OBJECT_ANIMATIONS_287, + ASSET_OBJECT_ANIMATIONS_288, + ASSET_OBJECT_ANIMATIONS_289, + ASSET_OBJECT_ANIMATIONS_290, + ASSET_OBJECT_ANIMATIONS_291, + ASSET_OBJECT_ANIMATIONS_292, + ASSET_OBJECT_ANIMATIONS_293, + ASSET_OBJECT_ANIMATIONS_294, + ASSET_OBJECT_ANIMATIONS_295, + ASSET_OBJECT_ANIMATIONS_296, + ASSET_OBJECT_ANIMATIONS_297, + ASSET_OBJECT_ANIMATIONS_298, + ASSET_OBJECT_ANIMATIONS_299, + ASSET_OBJECT_ANIMATIONS_300, + ASSET_OBJECT_ANIMATIONS_301, + ASSET_OBJECT_ANIMATIONS_302, + ASSET_OBJECT_ANIMATIONS_303, + ASSET_OBJECT_ANIMATIONS_304, + ASSET_OBJECT_ANIMATIONS_305, + ASSET_OBJECT_ANIMATIONS_306, + ASSET_OBJECT_ANIMATIONS_307, + ASSET_OBJECT_ANIMATIONS_308, + ASSET_OBJECT_ANIMATIONS_309, + ASSET_OBJECT_ANIMATIONS_310, + ASSET_OBJECT_ANIMATIONS_311, + ASSET_OBJECT_ANIMATIONS_312, + ASSET_OBJECT_ANIMATIONS_313, + ASSET_OBJECT_ANIMATIONS_314, + ASSET_OBJECT_ANIMATIONS_315, + ASSET_OBJECT_ANIMATIONS_316, + ASSET_OBJECT_ANIMATIONS_317, + ASSET_OBJECT_ANIMATIONS_318, + ASSET_OBJECT_ANIMATIONS_319, + ASSET_OBJECT_ANIMATIONS_320, + ASSET_OBJECT_ANIMATIONS_321, + ASSET_OBJECT_ANIMATIONS_322, + ASSET_OBJECT_ANIMATIONS_323, + ASSET_OBJECT_ANIMATIONS_324, + ASSET_OBJECT_ANIMATIONS_325, + ASSET_OBJECT_ANIMATIONS_326, + ASSET_OBJECT_ANIMATIONS_327, + ASSET_OBJECT_ANIMATIONS_328, + ASSET_OBJECT_ANIMATIONS_329, + ASSET_OBJECT_ANIMATIONS_330, + ASSET_OBJECT_ANIMATIONS_331, + ASSET_OBJECT_ANIMATIONS_332, + ASSET_OBJECT_ANIMATIONS_333, + ASSET_OBJECT_ANIMATIONS_334, + ASSET_OBJECT_ANIMATIONS_335, + ASSET_OBJECT_ANIMATIONS_336, + ASSET_OBJECT_ANIMATIONS_337, + ASSET_OBJECT_ANIMATIONS_338, + ASSET_OBJECT_ANIMATIONS_339, + ASSET_OBJECT_ANIMATIONS_340, + ASSET_OBJECT_ANIMATIONS_341, + ASSET_OBJECT_ANIMATIONS_342, + ASSET_OBJECT_ANIMATIONS_343, + ASSET_OBJECT_ANIMATIONS_344, + ASSET_OBJECT_ANIMATIONS_345, + ASSET_OBJECT_ANIMATIONS_346, + ASSET_OBJECT_ANIMATIONS_347, + ASSET_OBJECT_ANIMATIONS_348, + ASSET_OBJECT_ANIMATIONS_349, + ASSET_OBJECT_ANIMATIONS_350, + ASSET_OBJECT_ANIMATIONS_351, + ASSET_OBJECT_ANIMATIONS_352, + ASSET_OBJECT_ANIMATIONS_353, + ASSET_OBJECT_ANIMATIONS_354, + ASSET_OBJECT_ANIMATIONS_355, + ASSET_OBJECT_ANIMATIONS_356, + ASSET_OBJECT_ANIMATIONS_357, + ASSET_OBJECT_ANIMATIONS_358, + ASSET_OBJECT_ANIMATIONS_359, + ASSET_OBJECT_ANIMATIONS_360, + ASSET_OBJECT_ANIMATIONS_361, + ASSET_OBJECT_ANIMATIONS_362, + ASSET_OBJECT_ANIMATIONS_363, + ASSET_OBJECT_ANIMATIONS_364, + ASSET_OBJECT_ANIMATIONS_365, + ASSET_OBJECT_ANIMATIONS_366, + ASSET_OBJECT_ANIMATIONS_367, + ASSET_OBJECT_ANIMATIONS_368, + ASSET_OBJECT_ANIMATIONS_369, + ASSET_OBJECT_ANIMATIONS_370, + ASSET_OBJECT_ANIMATIONS_371, + ASSET_OBJECT_ANIMATIONS_372, + ASSET_OBJECT_ANIMATIONS_373, + ASSET_OBJECT_ANIMATIONS_374, + ASSET_OBJECT_ANIMATIONS_375, + ASSET_OBJECT_ANIMATIONS_376, + ASSET_OBJECT_ANIMATIONS_377, + ASSET_OBJECT_ANIMATIONS_378, + ASSET_OBJECT_ANIMATIONS_379, + ASSET_OBJECT_ANIMATIONS_380, + ASSET_OBJECT_ANIMATIONS_381, + ASSET_OBJECT_ANIMATIONS_382, + ASSET_OBJECT_ANIMATIONS_383, + ASSET_OBJECT_ANIMATIONS_384, + ASSET_OBJECT_ANIMATIONS_385, + ASSET_OBJECT_ANIMATIONS_386, + ASSET_OBJECT_ANIMATIONS_387, + ASSET_OBJECT_ANIMATIONS_388, + ASSET_OBJECT_ANIMATIONS_389, + ASSET_OBJECT_ANIMATIONS_390, + ASSET_OBJECT_ANIMATIONS_391, + ASSET_OBJECT_ANIMATIONS_392, + ASSET_OBJECT_ANIMATIONS_393, + ASSET_OBJECT_ANIMATIONS_394, + ASSET_OBJECT_ANIMATIONS_395, + ASSET_OBJECT_ANIMATIONS_396, + ASSET_OBJECT_ANIMATIONS_397, + ASSET_OBJECT_ANIMATIONS_398, + ASSET_OBJECT_ANIMATIONS_399, + ASSET_OBJECT_ANIMATIONS_400, + ASSET_OBJECT_ANIMATIONS_401, + ASSET_OBJECT_ANIMATIONS_402, + ASSET_OBJECT_ANIMATIONS_403, + ASSET_OBJECT_ANIMATIONS_404, + ASSET_OBJECT_ANIMATIONS_405, + ASSET_OBJECT_ANIMATIONS_406, + ASSET_OBJECT_ANIMATIONS_407, + ASSET_OBJECT_ANIMATIONS_408, + ASSET_OBJECT_ANIMATIONS_409, + ASSET_OBJECT_ANIMATIONS_410, + ASSET_OBJECT_ANIMATIONS_411, + ASSET_OBJECT_ANIMATIONS_412, + ASSET_OBJECT_ANIMATIONS_413, + ASSET_OBJECT_ANIMATIONS_414, + ASSET_OBJECT_ANIMATIONS_415, + ASSET_OBJECT_ANIMATIONS_416, + ASSET_OBJECT_ANIMATIONS_417, + ASSET_OBJECT_ANIMATIONS_418, + ASSET_OBJECT_ANIMATIONS_419, + ASSET_OBJECT_ANIMATIONS_420, + ASSET_OBJECT_ANIMATIONS_421, + ASSET_OBJECT_ANIMATIONS_422, + ASSET_OBJECT_ANIMATIONS_423, + ASSET_OBJECT_ANIMATIONS_424, + ASSET_OBJECT_ANIMATIONS_425, + ASSET_OBJECT_ANIMATIONS_426, + ASSET_OBJECT_ANIMATIONS_427, + ASSET_OBJECT_ANIMATIONS_428, + ASSET_OBJECT_ANIMATIONS_429, + ASSET_OBJECT_ANIMATIONS_430, + ASSET_OBJECT_ANIMATIONS_431, + ASSET_OBJECT_ANIMATIONS_432, + ASSET_OBJECT_ANIMATIONS_433, + ASSET_OBJECT_ANIMATIONS_434, + ASSET_OBJECT_ANIMATIONS_435, + ASSET_OBJECT_ANIMATIONS_436, + ASSET_OBJECT_ANIMATIONS_437, + ASSET_OBJECT_ANIMATIONS_438, + ASSET_OBJECT_ANIMATIONS_439, + ASSET_OBJECT_ANIMATIONS_440, + ASSET_OBJECT_ANIMATIONS_441, + ASSET_OBJECT_ANIMATIONS_442, + ASSET_OBJECT_ANIMATIONS_443, + ASSET_OBJECT_ANIMATIONS_444, + ASSET_OBJECT_ANIMATIONS_445, + ASSET_OBJECT_ANIMATIONS_446, + ASSET_OBJECT_ANIMATIONS_447, + ASSET_OBJECT_ANIMATIONS_448, + ASSET_OBJECT_ANIMATIONS_449, + ASSET_OBJECT_ANIMATIONS_450, + ASSET_OBJECT_ANIMATIONS_451, + ASSET_OBJECT_ANIMATIONS_452, + ASSET_OBJECT_ANIMATIONS_453, + ASSET_OBJECT_ANIMATIONS_454, + ASSET_OBJECT_ANIMATIONS_455, + ASSET_OBJECT_ANIMATIONS_456, + ASSET_OBJECT_ANIMATIONS_457, + ASSET_OBJECT_ANIMATIONS_458, + ASSET_OBJECT_ANIMATIONS_459, + ASSET_OBJECT_ANIMATIONS_460, + ASSET_OBJECT_ANIMATIONS_461, + ASSET_OBJECT_ANIMATIONS_462, + ASSET_OBJECT_ANIMATIONS_463, + ASSET_OBJECT_ANIMATIONS_464, + ASSET_OBJECT_ANIMATIONS_465, + ASSET_OBJECT_ANIMATIONS_466, + ASSET_OBJECT_ANIMATIONS_467, + ASSET_OBJECT_ANIMATIONS_468, + ASSET_OBJECT_ANIMATIONS_469 +} AssetObjectAnimationsEnum; + +/********** ASSET_OBJECT_HEADERS **********/ + +typedef enum { + ASSET_OBJECT_HEADERS_0, + ASSET_OBJECT_HEADERS_1, + ASSET_OBJECT_HEADERS_2, + ASSET_OBJECT_HEADERS_3, + ASSET_OBJECT_HEADERS_4, + ASSET_OBJECT_HEADERS_5, + ASSET_OBJECT_HEADERS_6, + ASSET_OBJECT_HEADERS_7, + ASSET_OBJECT_HEADERS_8, + ASSET_OBJECT_HEADERS_9, + ASSET_OBJECT_HEADERS_10, + ASSET_OBJECT_HEADERS_11, + ASSET_OBJECT_HEADERS_12, + ASSET_OBJECT_HEADERS_13, + ASSET_OBJECT_HEADERS_14, + ASSET_OBJECT_HEADERS_15, + ASSET_OBJECT_HEADERS_16, + ASSET_OBJECT_HEADERS_17, + ASSET_OBJECT_HEADERS_18, + ASSET_OBJECT_HEADERS_19, + ASSET_OBJECT_HEADERS_20, + ASSET_OBJECT_HEADERS_21, + ASSET_OBJECT_HEADERS_22, + ASSET_OBJECT_HEADERS_23, + ASSET_OBJECT_HEADERS_24, + ASSET_OBJECT_HEADERS_25, + ASSET_OBJECT_HEADERS_26, + ASSET_OBJECT_HEADERS_27, + ASSET_OBJECT_HEADERS_28, + ASSET_OBJECT_HEADERS_29, + ASSET_OBJECT_HEADERS_30, + ASSET_OBJECT_HEADERS_31, + ASSET_OBJECT_HEADERS_32, + ASSET_OBJECT_HEADERS_33, + ASSET_OBJECT_HEADERS_34, + ASSET_OBJECT_HEADERS_35, + ASSET_OBJECT_HEADERS_36, + ASSET_OBJECT_HEADERS_37, + ASSET_OBJECT_HEADERS_38, + ASSET_OBJECT_HEADERS_39, + ASSET_OBJECT_HEADERS_40, + ASSET_OBJECT_HEADERS_41, + ASSET_OBJECT_HEADERS_42, + ASSET_OBJECT_HEADERS_43, + ASSET_OBJECT_HEADERS_44, + ASSET_OBJECT_HEADERS_45, + ASSET_OBJECT_HEADERS_46, + ASSET_OBJECT_HEADERS_47, + ASSET_OBJECT_HEADERS_48, + ASSET_OBJECT_HEADERS_49, + ASSET_OBJECT_HEADERS_50, + ASSET_OBJECT_HEADERS_51, + ASSET_OBJECT_HEADERS_52, + ASSET_OBJECT_HEADERS_53, + ASSET_OBJECT_HEADERS_54, + ASSET_OBJECT_HEADERS_55, + ASSET_OBJECT_HEADERS_56, + ASSET_OBJECT_HEADERS_57, + ASSET_OBJECT_HEADERS_58, + ASSET_OBJECT_HEADERS_59, + ASSET_OBJECT_HEADERS_60, + ASSET_OBJECT_HEADERS_61, + ASSET_OBJECT_HEADERS_62, + ASSET_OBJECT_HEADERS_63, + ASSET_OBJECT_HEADERS_64, + ASSET_OBJECT_HEADERS_65, + ASSET_OBJECT_HEADERS_66, + ASSET_OBJECT_HEADERS_67, + ASSET_OBJECT_HEADERS_68, + ASSET_OBJECT_HEADERS_69, + ASSET_OBJECT_HEADERS_70, + ASSET_OBJECT_HEADERS_71, + ASSET_OBJECT_HEADERS_72, + ASSET_OBJECT_HEADERS_73, + ASSET_OBJECT_HEADERS_74, + ASSET_OBJECT_HEADERS_75, + ASSET_OBJECT_HEADERS_76, + ASSET_OBJECT_HEADERS_77, + ASSET_OBJECT_HEADERS_78, + ASSET_OBJECT_HEADERS_79, + ASSET_OBJECT_HEADERS_80, + ASSET_OBJECT_HEADERS_81, + ASSET_OBJECT_HEADERS_82, + ASSET_OBJECT_HEADERS_83, + ASSET_OBJECT_HEADERS_84, + ASSET_OBJECT_HEADERS_85, + ASSET_OBJECT_HEADERS_86, + ASSET_OBJECT_HEADERS_87, + ASSET_OBJECT_HEADERS_88, + ASSET_OBJECT_HEADERS_89, + ASSET_OBJECT_HEADERS_90, + ASSET_OBJECT_HEADERS_91, + ASSET_OBJECT_HEADERS_92, + ASSET_OBJECT_HEADERS_93, + ASSET_OBJECT_HEADERS_94, + ASSET_OBJECT_HEADERS_95, + ASSET_OBJECT_HEADERS_96, + ASSET_OBJECT_HEADERS_97, + ASSET_OBJECT_HEADERS_98, + ASSET_OBJECT_HEADERS_99, + ASSET_OBJECT_HEADERS_100, + ASSET_OBJECT_HEADERS_101, + ASSET_OBJECT_HEADERS_102, + ASSET_OBJECT_HEADERS_103, + ASSET_OBJECT_HEADERS_104, + ASSET_OBJECT_HEADERS_105, + ASSET_OBJECT_HEADERS_106, + ASSET_OBJECT_HEADERS_107, + ASSET_OBJECT_HEADERS_108, + ASSET_OBJECT_HEADERS_109, + ASSET_OBJECT_HEADERS_110, + ASSET_OBJECT_HEADERS_111, + ASSET_OBJECT_HEADERS_112, + ASSET_OBJECT_HEADERS_113, + ASSET_OBJECT_HEADERS_114, + ASSET_OBJECT_HEADERS_115, + ASSET_OBJECT_HEADERS_116, + ASSET_OBJECT_HEADERS_117, + ASSET_OBJECT_HEADERS_118, + ASSET_OBJECT_HEADERS_119, + ASSET_OBJECT_HEADERS_120, + ASSET_OBJECT_HEADERS_121, + ASSET_OBJECT_HEADERS_122, + ASSET_OBJECT_HEADERS_123, + ASSET_OBJECT_HEADERS_124, + ASSET_OBJECT_HEADERS_125, + ASSET_OBJECT_HEADERS_126, + ASSET_OBJECT_HEADERS_127, + ASSET_OBJECT_HEADERS_128, + ASSET_OBJECT_HEADERS_129, + ASSET_OBJECT_HEADERS_130, + ASSET_OBJECT_HEADERS_131, + ASSET_OBJECT_HEADERS_132, + ASSET_OBJECT_HEADERS_133, + ASSET_OBJECT_HEADERS_134, + ASSET_OBJECT_HEADERS_135, + ASSET_OBJECT_HEADERS_136, + ASSET_OBJECT_HEADERS_137, + ASSET_OBJECT_HEADERS_138, + ASSET_OBJECT_HEADERS_139, + ASSET_OBJECT_HEADERS_140, + ASSET_OBJECT_HEADERS_141, + ASSET_OBJECT_HEADERS_142, + ASSET_OBJECT_HEADERS_143, + ASSET_OBJECT_HEADERS_144, + ASSET_OBJECT_HEADERS_145, + ASSET_OBJECT_HEADERS_146, + ASSET_OBJECT_HEADERS_147, + ASSET_OBJECT_HEADERS_148, + ASSET_OBJECT_HEADERS_149, + ASSET_OBJECT_HEADERS_150, + ASSET_OBJECT_HEADERS_151, + ASSET_OBJECT_HEADERS_152, + ASSET_OBJECT_HEADERS_153, + ASSET_OBJECT_HEADERS_154, + ASSET_OBJECT_HEADERS_155, + ASSET_OBJECT_HEADERS_156, + ASSET_OBJECT_HEADERS_157, + ASSET_OBJECT_HEADERS_158, + ASSET_OBJECT_HEADERS_159, + ASSET_OBJECT_HEADERS_160, + ASSET_OBJECT_HEADERS_161, + ASSET_OBJECT_HEADERS_162, + ASSET_OBJECT_HEADERS_163, + ASSET_OBJECT_HEADERS_164, + ASSET_OBJECT_HEADERS_165, + ASSET_OBJECT_HEADERS_166, + ASSET_OBJECT_HEADERS_167, + ASSET_OBJECT_HEADERS_168, + ASSET_OBJECT_HEADERS_169, + ASSET_OBJECT_HEADERS_170, + ASSET_OBJECT_HEADERS_171, + ASSET_OBJECT_HEADERS_172, + ASSET_OBJECT_HEADERS_173, + ASSET_OBJECT_HEADERS_174, + ASSET_OBJECT_HEADERS_175, + ASSET_OBJECT_HEADERS_176, + ASSET_OBJECT_HEADERS_177, + ASSET_OBJECT_HEADERS_178, + ASSET_OBJECT_HEADERS_179, + ASSET_OBJECT_HEADERS_180, + ASSET_OBJECT_HEADERS_181, + ASSET_OBJECT_HEADERS_182, + ASSET_OBJECT_HEADERS_183, + ASSET_OBJECT_HEADERS_184, + ASSET_OBJECT_HEADERS_185, + ASSET_OBJECT_HEADERS_186, + ASSET_OBJECT_HEADERS_187, + ASSET_OBJECT_HEADERS_188, + ASSET_OBJECT_HEADERS_189, + ASSET_OBJECT_HEADERS_190, + ASSET_OBJECT_HEADERS_191, + ASSET_OBJECT_HEADERS_192, + ASSET_OBJECT_HEADERS_193, + ASSET_OBJECT_HEADERS_194, + ASSET_OBJECT_HEADERS_195, + ASSET_OBJECT_HEADERS_196, + ASSET_OBJECT_HEADERS_197, + ASSET_OBJECT_HEADERS_198, + ASSET_OBJECT_HEADERS_199, + ASSET_OBJECT_HEADERS_200, + ASSET_OBJECT_HEADERS_201, + ASSET_OBJECT_HEADERS_202, + ASSET_OBJECT_HEADERS_203, + ASSET_OBJECT_HEADERS_204, + ASSET_OBJECT_HEADERS_205, + ASSET_OBJECT_HEADERS_206, + ASSET_OBJECT_HEADERS_207, + ASSET_OBJECT_HEADERS_208, + ASSET_OBJECT_HEADERS_209, + ASSET_OBJECT_HEADERS_210, + ASSET_OBJECT_HEADERS_211, + ASSET_OBJECT_HEADERS_212, + ASSET_OBJECT_HEADERS_213, + ASSET_OBJECT_HEADERS_214, + ASSET_OBJECT_HEADERS_215, + ASSET_OBJECT_HEADERS_216, + ASSET_OBJECT_HEADERS_217, + ASSET_OBJECT_HEADERS_218, + ASSET_OBJECT_HEADERS_219, + ASSET_OBJECT_HEADERS_220, + ASSET_OBJECT_HEADERS_221, + ASSET_OBJECT_HEADERS_222, + ASSET_OBJECT_HEADERS_223, + ASSET_OBJECT_HEADERS_224, + ASSET_OBJECT_HEADERS_225, + ASSET_OBJECT_HEADERS_226, + ASSET_OBJECT_HEADERS_227, + ASSET_OBJECT_HEADERS_228, + ASSET_OBJECT_HEADERS_229, + ASSET_OBJECT_HEADERS_230, + ASSET_OBJECT_HEADERS_231, + ASSET_OBJECT_HEADERS_232, + ASSET_OBJECT_HEADERS_233, + ASSET_OBJECT_HEADERS_234, + ASSET_OBJECT_HEADERS_235, + ASSET_OBJECT_HEADERS_236, + ASSET_OBJECT_HEADERS_237, + ASSET_OBJECT_HEADERS_238, + ASSET_OBJECT_HEADERS_239, + ASSET_OBJECT_HEADERS_240, + ASSET_OBJECT_HEADERS_241, + ASSET_OBJECT_HEADERS_242, + ASSET_OBJECT_HEADERS_243, + ASSET_OBJECT_HEADERS_244, + ASSET_OBJECT_HEADERS_245, + ASSET_OBJECT_HEADERS_246, + ASSET_OBJECT_HEADERS_247, + ASSET_OBJECT_HEADERS_248, + ASSET_OBJECT_HEADERS_249, + ASSET_OBJECT_HEADERS_250, + ASSET_OBJECT_HEADERS_251, + ASSET_OBJECT_HEADERS_252, + ASSET_OBJECT_HEADERS_253, + ASSET_OBJECT_HEADERS_254, + ASSET_OBJECT_HEADERS_255, + ASSET_OBJECT_HEADERS_256, + ASSET_OBJECT_HEADERS_257, + ASSET_OBJECT_HEADERS_258, + ASSET_OBJECT_HEADERS_259, + ASSET_OBJECT_HEADERS_260, + ASSET_OBJECT_HEADERS_261, + ASSET_OBJECT_HEADERS_262, + ASSET_OBJECT_HEADERS_263, + ASSET_OBJECT_HEADERS_264, + ASSET_OBJECT_HEADERS_265, + ASSET_OBJECT_HEADERS_266, + ASSET_OBJECT_HEADERS_267, + ASSET_OBJECT_HEADERS_268, + ASSET_OBJECT_HEADERS_269, + ASSET_OBJECT_HEADERS_270, + ASSET_OBJECT_HEADERS_271, + ASSET_OBJECT_HEADERS_272, + ASSET_OBJECT_HEADERS_273, + ASSET_OBJECT_HEADERS_274, + ASSET_OBJECT_HEADERS_275, + ASSET_OBJECT_HEADERS_276, + ASSET_OBJECT_HEADERS_277, + ASSET_OBJECT_HEADERS_278, + ASSET_OBJECT_HEADERS_279, + ASSET_OBJECT_HEADERS_280, + ASSET_OBJECT_HEADERS_281, + ASSET_OBJECT_HEADERS_282, + ASSET_OBJECT_HEADERS_283, + ASSET_OBJECT_HEADERS_284, + ASSET_OBJECT_HEADERS_285, + ASSET_OBJECT_HEADERS_286, + ASSET_OBJECT_HEADERS_287, + ASSET_OBJECT_HEADERS_288, + ASSET_OBJECT_HEADERS_289, + ASSET_OBJECT_HEADERS_290, + ASSET_OBJECT_HEADERS_291, + ASSET_OBJECT_HEADERS_292, + ASSET_OBJECT_HEADERS_293, + ASSET_OBJECT_HEADERS_294, + ASSET_OBJECT_HEADERS_295, + ASSET_OBJECT_HEADERS_296, + ASSET_OBJECT_HEADERS_297, + ASSET_OBJECT_HEADERS_298, + ASSET_OBJECT_HEADERS_299, + ASSET_OBJECT_HEADERS_300, + ASSET_OBJECT_HEADERS_301, + ASSET_OBJECT_HEADERS_302, + ASSET_OBJECT_HEADERS_303 +} AssetObjectHeadersEnum; + +/********** ASSET_AUDIO **********/ + +typedef enum { + ASSET_AUDIO_0, + ASSET_AUDIO_1, + ASSET_AUDIO_2, + ASSET_AUDIO_3, + ASSET_AUDIO_4, + ASSET_AUDIO_5, + ASSET_AUDIO_6, + ASSET_AUDIO_7, + ASSET_AUDIO_8, + ASSET_AUDIO_9, + ASSET_AUDIO_10, + ASSET_AUDIO_11, + ASSET_AUDIO_12 +} AssetAudioEnum; + +/********** ASSET_PARTICLES **********/ + +typedef enum { + ASSET_PARTICLES_0, + ASSET_PARTICLES_1, + ASSET_PARTICLES_2, + ASSET_PARTICLES_3, + ASSET_PARTICLES_4, + ASSET_PARTICLES_5, + ASSET_PARTICLES_6, + ASSET_PARTICLES_7, + ASSET_PARTICLES_8, + ASSET_PARTICLES_9, + ASSET_PARTICLES_10, + ASSET_PARTICLES_11, + ASSET_PARTICLES_12, + ASSET_PARTICLES_13, + ASSET_PARTICLES_14, + ASSET_PARTICLES_15, + ASSET_PARTICLES_16, + ASSET_PARTICLES_17, + ASSET_PARTICLES_18, + ASSET_PARTICLES_19, + ASSET_PARTICLES_20, + ASSET_PARTICLES_21, + ASSET_PARTICLES_22, + ASSET_PARTICLES_23, + ASSET_PARTICLES_24, + ASSET_PARTICLES_25, + ASSET_PARTICLES_26, + ASSET_PARTICLES_27, + ASSET_PARTICLES_28, + ASSET_PARTICLES_29, + ASSET_PARTICLES_30, + ASSET_PARTICLES_31, + ASSET_PARTICLES_32, + ASSET_PARTICLES_33, + ASSET_PARTICLES_34, + ASSET_PARTICLES_35, + ASSET_PARTICLES_36, + ASSET_PARTICLES_37, + ASSET_PARTICLES_38, + ASSET_PARTICLES_39, + ASSET_PARTICLES_40, + ASSET_PARTICLES_41, + ASSET_PARTICLES_42, + ASSET_PARTICLES_43, + ASSET_PARTICLES_44, + ASSET_PARTICLES_45, + ASSET_PARTICLES_46, + ASSET_PARTICLES_47, + ASSET_PARTICLES_48, + ASSET_PARTICLES_49, + ASSET_PARTICLES_50, + ASSET_PARTICLES_51, + ASSET_PARTICLES_52, + ASSET_PARTICLES_53, + ASSET_PARTICLES_54, + ASSET_PARTICLES_55, + ASSET_PARTICLES_56, + ASSET_PARTICLES_57, + ASSET_PARTICLES_58, + ASSET_PARTICLES_59, + ASSET_PARTICLES_60, + ASSET_PARTICLES_61, + ASSET_PARTICLES_62, + ASSET_PARTICLES_63, + ASSET_PARTICLES_64, + ASSET_PARTICLES_65, + ASSET_PARTICLES_66, + ASSET_PARTICLES_67, + ASSET_PARTICLES_68, + ASSET_PARTICLES_69 +} AssetParticlesEnum; + +/********** ASSET_PARTICLE_BEHAVIORS **********/ + +typedef enum { + ASSET_PARTICLE_BEHAVIORS_0, + ASSET_PARTICLE_BEHAVIORS_1, + ASSET_PARTICLE_BEHAVIORS_2, + ASSET_PARTICLE_BEHAVIORS_3, + ASSET_PARTICLE_BEHAVIORS_4, + ASSET_PARTICLE_BEHAVIORS_5, + ASSET_PARTICLE_BEHAVIORS_6, + ASSET_PARTICLE_BEHAVIORS_7, + ASSET_PARTICLE_BEHAVIORS_8, + ASSET_PARTICLE_BEHAVIORS_9, + ASSET_PARTICLE_BEHAVIORS_10, + ASSET_PARTICLE_BEHAVIORS_11, + ASSET_PARTICLE_BEHAVIORS_12, + ASSET_PARTICLE_BEHAVIORS_13, + ASSET_PARTICLE_BEHAVIORS_14, + ASSET_PARTICLE_BEHAVIORS_15, + ASSET_PARTICLE_BEHAVIORS_16, + ASSET_PARTICLE_BEHAVIORS_17, + ASSET_PARTICLE_BEHAVIORS_18, + ASSET_PARTICLE_BEHAVIORS_19, + ASSET_PARTICLE_BEHAVIORS_20, + ASSET_PARTICLE_BEHAVIORS_21, + ASSET_PARTICLE_BEHAVIORS_22, + ASSET_PARTICLE_BEHAVIORS_23, + ASSET_PARTICLE_BEHAVIORS_24, + ASSET_PARTICLE_BEHAVIORS_25, + ASSET_PARTICLE_BEHAVIORS_26, + ASSET_PARTICLE_BEHAVIORS_27, + ASSET_PARTICLE_BEHAVIORS_28, + ASSET_PARTICLE_BEHAVIORS_29, + ASSET_PARTICLE_BEHAVIORS_30, + ASSET_PARTICLE_BEHAVIORS_31, + ASSET_PARTICLE_BEHAVIORS_32, + ASSET_PARTICLE_BEHAVIORS_33, + ASSET_PARTICLE_BEHAVIORS_34, + ASSET_PARTICLE_BEHAVIORS_35, + ASSET_PARTICLE_BEHAVIORS_36, + ASSET_PARTICLE_BEHAVIORS_37, + ASSET_PARTICLE_BEHAVIORS_38, + ASSET_PARTICLE_BEHAVIORS_39, + ASSET_PARTICLE_BEHAVIORS_40, + ASSET_PARTICLE_BEHAVIORS_41, + ASSET_PARTICLE_BEHAVIORS_42, + ASSET_PARTICLE_BEHAVIORS_43, + ASSET_PARTICLE_BEHAVIORS_44, + ASSET_PARTICLE_BEHAVIORS_45, + ASSET_PARTICLE_BEHAVIORS_46, + ASSET_PARTICLE_BEHAVIORS_47, + ASSET_PARTICLE_BEHAVIORS_48, + ASSET_PARTICLE_BEHAVIORS_49, + ASSET_PARTICLE_BEHAVIORS_50, + ASSET_PARTICLE_BEHAVIORS_51, + ASSET_PARTICLE_BEHAVIORS_52, + ASSET_PARTICLE_BEHAVIORS_53, + ASSET_PARTICLE_BEHAVIORS_54, + ASSET_PARTICLE_BEHAVIORS_55, + ASSET_PARTICLE_BEHAVIORS_56, + ASSET_PARTICLE_BEHAVIORS_57, + ASSET_PARTICLE_BEHAVIORS_58, + ASSET_PARTICLE_BEHAVIORS_59, + ASSET_PARTICLE_BEHAVIORS_60, + ASSET_PARTICLE_BEHAVIORS_61, + ASSET_PARTICLE_BEHAVIORS_62, + ASSET_PARTICLE_BEHAVIORS_63, + ASSET_PARTICLE_BEHAVIORS_64, + ASSET_PARTICLE_BEHAVIORS_65, + ASSET_PARTICLE_BEHAVIORS_66, + ASSET_PARTICLE_BEHAVIORS_67, + ASSET_PARTICLE_BEHAVIORS_68, + ASSET_PARTICLE_BEHAVIORS_69, + ASSET_PARTICLE_BEHAVIORS_70, + ASSET_PARTICLE_BEHAVIORS_71, + ASSET_PARTICLE_BEHAVIORS_72, + ASSET_PARTICLE_BEHAVIORS_73, + ASSET_PARTICLE_BEHAVIORS_74 +} AssetParticleBehaviorsEnum; + +/********** ASSET_FONTS **********/ + +typedef enum { + ASSET_FONTS_FUNFONT, + ASSET_FONTS_SMALLFONT, + ASSET_FONTS_BIGFONT, + ASSET_FONTS_SUBTITLEFONT +} AssetFontsEnum; + +/********** ASSET_TTGHOSTS **********/ + +typedef enum { + ASSET_TTGHOSTS_FOSSILCANYON, + ASSET_TTGHOSTS_PIRATELAGOON, + ASSET_TTGHOSTS_ANCIENTLAKE, + ASSET_TTGHOSTS_WALRUSCOVE, + ASSET_TTGHOSTS_HOTTOPVOLCANO, + ASSET_TTGHOSTS_WHALEBAY, + ASSET_TTGHOSTS_SNOWBALLVALLEY, + ASSET_TTGHOSTS_CRESCENTISLAND, + ASSET_TTGHOSTS_EVERFROSTPEAK, + ASSET_TTGHOSTS_SPACEPORTALPHA, + ASSET_TTGHOSTS_SPACEDUSTALLEY, + ASSET_TTGHOSTS_GREENWOODVILLAGE, + ASSET_TTGHOSTS_BOULDERCANYON, + ASSET_TTGHOSTS_WINDMILLPLAINS, + ASSET_TTGHOSTS_FROSTYVILLAGE, + ASSET_TTGHOSTS_JUNGLEFALLS, + ASSET_TTGHOSTS_TREASURECAVES, + ASSET_TTGHOSTS_HAUNTEDWOODS, + ASSET_TTGHOSTS_DARKMOONCAVERNS, + ASSET_TTGHOSTS_STARCITY +} AssetTtghostsEnum; + +#endif diff --git a/include/enums.h b/include/enums.h new file mode 100644 index 00000000..0eba44f8 --- /dev/null +++ b/include/enums.h @@ -0,0 +1,65 @@ +#ifndef ENUMS_H +#define ENUMS_H + +/* All the enums defined here can be used in asset files */ + +typedef enum Vehicle { + VEHICLE_CAR, + VEHICLE_HOVERCRAFT, + VEHICLE_PLANE, +} Vehicle; + +typedef enum Language { + LANGUAGE_ENGLISH, + LANGUAGE_GERMAN, + LANGUAGE_FRENCH, + LANGUAGE_JAPANESE, +} Language; + +typedef enum World { + WORLD_NONE = -1, // This enum starts at -1 instead of 0. + WORLD_CENTRAL_AREA, + WORLD_DINO_DOMAIN, + WORLD_SHERBET_ISLAND, + WORLD_SNOWFLAKE_MOUNTAIN, + WORLD_DRAGON_FOREST, + WORLD_FUTURE_FUN_LAND, +} World; + +typedef enum RaceType { + RACETYPE_DEFAULT = 0, + RACETYPE_HORSESHOE_GULCH = 3, + RACETYPE_HUBWORLD = 5, + RACETYPE_CUTSCENE_1 = 6, // Not sure what the difference between these two are. + RACETYPE_CUTSCENE_2 = 7, + RACETYPE_BOSS = 8, + RACETYPE_CHALLENGE_BATTLE = 64, + RACETYPE_CHALLENGE_BANANAS = 65, + RACETYPE_CHALLENGE_EGGS = 66, +} RaceType; + +typedef enum HorizontalAlignmentFlags { + HORZ_ALIGN_LEFT = 0, + HORZ_ALIGN_RIGHT = 1, + HORZ_ALIGN_CENTER = 4, +} HorizontalAlignmentFlags; + +typedef enum VerticalAlignmentFlags { + VERT_ALIGN_TOP = 0, + VERT_ALIGN_BOTTOM = 2, + VERT_ALIGN_MIDDLE = 8, +} VerticalAlignmentFlags; + +typedef enum AlignmentFlags { + ALIGN_TOP_LEFT = VERT_ALIGN_TOP | HORZ_ALIGN_LEFT, + ALIGN_TOP_CENTER = VERT_ALIGN_TOP | HORZ_ALIGN_CENTER, + ALIGN_TOP_RIGHT = VERT_ALIGN_TOP | HORZ_ALIGN_RIGHT, + ALIGN_MIDDLE_LEFT = VERT_ALIGN_MIDDLE | HORZ_ALIGN_LEFT, + ALIGN_MIDDLE_CENTER = VERT_ALIGN_MIDDLE | HORZ_ALIGN_CENTER, + ALIGN_MIDDLE_RIGHT = VERT_ALIGN_MIDDLE | HORZ_ALIGN_RIGHT, + ALIGN_BOTTOM_LEFT = VERT_ALIGN_BOTTOM | HORZ_ALIGN_LEFT, + ALIGN_BOTTOM_CENTER = VERT_ALIGN_BOTTOM | HORZ_ALIGN_CENTER, + ALIGN_BOTTOM_RIGHT = VERT_ALIGN_BOTTOM | HORZ_ALIGN_RIGHT, +} AlignmentFlags; + +#endif diff --git a/tools/.gitignore b/tools/.gitignore index 3f7da8e1..dc35de12 100755 --- a/tools/.gitignore +++ b/tools/.gitignore @@ -1,7 +1,5 @@ /n64crc -/dkr_decompressor -/dkr_cheats_encryptor -/dkr_extractor -/dkr_texbuilder +/dkr_assets_tool +/dkr_assets_tool_classes/_build /binutils -/ido5.3_recomp \ No newline at end of file +/ido5.3_recomp diff --git a/tools/Makefile b/tools/Makefile index 13e9d826..3bc54e2e 100755 --- a/tools/Makefile +++ b/tools/Makefile @@ -1,41 +1,49 @@ CC := gcc CXX := g++ CFLAGS := -I . -Wall -Wextra -Wno-unused-parameter -pedantic -std=c99 -O2 -s +CXXFLAGS := --std=c++17 -lstdc++fs -lcrypto -lssl -lpthread LDFLAGS := -lm PROGRAMS := n64crc -CXX_PROGRAMS := dkr_cheats_encryptor dkr_decompressor dkr_extractor dkr_texbuilder +CXX_PROGRAMS := dkr_assets_tool + +BUILD_DIR := dkr_assets_tool_classes/_build + +ENUMS_HEADER := ../include/enums.h + +# From: https://stackoverflow.com/questions/2483182/recursive-wildcards-in-gnu-make/18258352#18258352 +rwildcard=$(foreach d,$(wildcard $(1:=/*)),$(call rwildcard,$d,$2) $(filter $(subst *,%,$2),$d)) default: all n64crc_SOURCES := n64crc.c -dkr_cheats_encryptor_SOURCES := dkr_cheats_encryptor.cpp - -dkr_decompressor_SOURCES := dkr_decompressor.cpp $(wildcard dkr_decompressor_src/*.cpp dkr_decompressor_src/*.c) -dkr_decompressor_CXXFLAGS := -lstdc++fs -lcrypto -lssl - -dkr_extractor_SOURCES := dkr_extractor.cpp $(wildcard dkr_decompressor_src/*.cpp dkr_decompressor_src/*.c dkr_extractor_classes/*.cpp n64graphics/*.c) -dkr_extractor_CXXFLAGS := -lstdc++fs -lcrypto -lssl -lpthread - -dkr_texbuilder_SOURCES := dkr_texbuilder.cpp $(wildcard dkr_decompressor_src/*.cpp dkr_decompressor_src/*.c n64graphics/*.c) -dkr_texbuilder_CXXFLAGS := -lstdc++fs - all: $(PROGRAMS) $(CXX_PROGRAMS) clean: - $(RM) $(PROGRAMS) $(CXX_PROGRAMS) + rm -Rf $(PROGRAMS) $(CXX_PROGRAMS) $(BUILD_DIR) -define COMPILE -$(1): $($1_SOURCES) - $(CC) $(CFLAGS) $($1_CFLAGS) $$^ -o $$@ $(LDFLAGS) $($1_LDFLAGS) -endef +distclean: clean -define COMPILE_CXX -$(1): $($1_SOURCES) - $(CXX) $$^ -o $$@ $($1_CXXFLAGS) $(LDFLAGS) $($1_LDFLAGS) -endef +n64crc: n64crc.c + $(CC) $(CFLAGS) -o $@ $< $(LDFLAGS) -$(foreach p,$(PROGRAMS),$(eval $(call COMPILE,$(p)))) -$(foreach p,$(CXX_PROGRAMS),$(eval $(call COMPILE_CXX,$(p)))) +dkr_assets_tool_CPP_FILES := dkr_assets_tool.cpp \ + $(call rwildcard,dkr_assets_tool_classes,*.cpp) + +dkr_assets_tool_C_FILES := $(call rwildcard,dkr_assets_tool_classes,*.c) + +dkr_assets_tool_OBJ_FILES := $(foreach file,$(dkr_assets_tool_C_FILES),$(BUILD_DIR)/$(file:.c=.o)) \ + $(foreach file,$(dkr_assets_tool_CPP_FILES),$(BUILD_DIR)/$(file:.cpp=.o)) + +DUMMY != mkdir -p $(sort $(dir $(dkr_assets_tool_OBJ_FILES))) + +$(BUILD_DIR)/%.o: %.c + $(CXX) -c $^ -o $@ $(CXXFLAGS) $(LDFLAGS) +$(BUILD_DIR)/%.o: %.cpp + $(CXX) -c $< -o $@ $(CXXFLAGS) $(LDFLAGS) + +dkr_assets_tool: $(dkr_assets_tool_OBJ_FILES) + $(CXX) $^ -o $@ $(CXXFLAGS) $(LDFLAGS) + +.PHONY: all clean distclean default -.PHONY: all clean default diff --git a/tools/dkr_assets_tool.cpp b/tools/dkr_assets_tool.cpp new file mode 100644 index 00000000..10337637 --- /dev/null +++ b/tools/dkr_assets_tool.cpp @@ -0,0 +1,299 @@ +/** + * This tool handles everything assets-related including extracting and building. + */ + +#include +#include +#include + +#include "dkr_assets_tool_classes/common/util.h" +#include "dkr_assets_tool_classes/extractor/extractor.h" +#include "dkr_assets_tool_classes/builder/builder.h" +#include "dkr_assets_tool_classes/make_asset_files/asset_enums_header.h" +#include "dkr_assets_tool_classes/make_asset_files/asset_asm_data.h" +#include "dkr_assets_tool_classes/compiler/compiler.h" + +/**************************************************************************/ + +void print_usage() { + std::cout << "---- Usages -------------------------------------------------------------" << std::endl; + std::cout << "Extracting assets: ./dkr_assets_tool -e " << std::endl; + std::cout << "Building an asset: ./dkr_assets_tool -b " << std::endl; + std::cout << "Creating includes: ./dkr_assets_tool -i " << std::endl; + std::cout << "Compiling assets: ./dkr_assets_tool -c " << std::endl; + std::cout << "Compress file: ./dkr_assets_tool -fc " << std::endl; + std::cout << "Decompress file: ./dkr_assets_tool -fd " << std::endl; + std::cout << "-------------------------------------------------------------------------" << std::endl; +} + +/**************************************************************************/ + +typedef enum _ToolType { + TT_DO_NOTHING, + TT_EXTRACT, + TT_BUILD, + TT_ASSET_INCLUDES, + TT_ASSET_COMPILE, + TT_ASSET_COMPRESS_FILE, + TT_ASSET_DECOMPRESS_FILE, +} ToolType; + +typedef struct _CmdArgOptions { + ToolType type; + std::vector paths; +} CmdArgOptions; + +CmdArgOptions options; + +/**************************************************************************/ + +typedef enum _CurrentParseOption { + PO_NONE, + PO_TYPE +} CurrentParseOption; + +std::string get_cmd_from_parse_option(ToolType type) { + switch(type) { + case TT_EXTRACT: return "-e"; + case TT_BUILD: return "-b"; + case TT_ASSET_INCLUDES: return "-i"; + case TT_ASSET_COMPILE: return "-c"; + case TT_ASSET_COMPRESS_FILE: return "-fc"; + case TT_ASSET_DECOMPRESS_FILE: return "-fd"; + } + return "(Invalid option)"; +} + +bool parse_options(int argc, char *argv[]) { + std::vector args(argv, argv+argc); + + if(argc == 1) { + return false; // Display usage + } + + // Parse options from command line. + bool parsingCmd = false; + int curOptionState = 0; + int curOptionArgs = 0; + CurrentParseOption curOption = PO_NONE; + for (size_t i = 1; i < args.size(); ++i) { + if(args[i][0] == '-') { + if(parsingCmd) { + display_error("Not enough args for the current command \"", get_cmd_from_parse_option(options.type), "\""); + return false; + } + if(args[i] == "-e") { + curOption = PO_TYPE; + curOptionState = 1; + options.type = TT_EXTRACT; + parsingCmd = true; + } else if(args[i] == "-b") { + curOption = PO_TYPE; + curOptionState = 2; + options.type = TT_BUILD; + parsingCmd = true; + } else if(args[i] == "-i") { + curOption = PO_TYPE; + curOptionState = 3; + options.type = TT_ASSET_INCLUDES; + parsingCmd = true; + } else if(args[i] == "-c") { + curOption = PO_TYPE; + curOptionState = 4; + options.type = TT_ASSET_COMPILE; + parsingCmd = true; + } else if(args[i] == "-fc") { + curOption = PO_TYPE; + curOptionState = 5; + options.type = TT_ASSET_COMPRESS_FILE; + parsingCmd = true; + } else if(args[i] == "-fd") { + curOption = PO_TYPE; + curOptionState = 6; + options.type = TT_ASSET_DECOMPRESS_FILE; + parsingCmd = true; + } else if(args[i] == "-h") { + return false; + } else { + display_error("Invalid option \"", args[i], "\""); + return false; + } + curOptionArgs = 0; + } else { + if(!parsingCmd) { + display_error("Too many args for the current command \"", get_cmd_from_parse_option(options.type), "\""); + return false; + } + switch(curOption) { + case PO_TYPE: + switch(curOptionState) { + case 1: // Extractor + switch(curOptionArgs) { + case 0: // version + case 1: // assets directory + case 2: // configs directory + case 3: // baseroms directory + options.paths.push_back(args[i]); + break; + case 4: // output + options.paths.push_back(args[i]); + // End of arguments. + parsingCmd = false; + curOption = PO_NONE; + break; + } + break; + case 2: // Builder + switch(curOptionArgs) { + case 0: // version + case 1: // assets directory + case 2: // source path + options.paths.push_back(args[i]); + break; + case 3: // output + options.paths.push_back(args[i]); + // End of arguments. + parsingCmd = false; + curOption = PO_NONE; + break; + } + break; + case 3: // Asset header + switch(curOptionArgs) { + case 0: // Assets directory + case 1: // Enum file output path + case 2: // Build directory + case 3: // Asm output directory + options.paths.push_back(args[i]); + break; + case 4: // DKR version + options.paths.push_back(args[i]); + // End of arguments. + parsingCmd = false; + curOption = PO_NONE; + break; + } + break; + case 4: // Compile assets + case 5: // Compress file + case 6: // Decompress file + switch(curOptionArgs) { + case 0: // Assets directory / Input filename + options.paths.push_back(args[i]); + break; + case 1: // version / Output filename + options.paths.push_back(args[i]); + // End of arguments. + parsingCmd = false; + curOption = PO_NONE; + break; + } + break; + } + break; + default: // This should hopefully never get called + display_error_and_abort("Invalid dkr_assets_tool option. You should not be seeing this message!"); + } + curOptionArgs++; + } + } + + if(parsingCmd) { + display_error("Not enough args for the current command \"", get_cmd_from_parse_option(options.type), "\""); + return false; + } + + return true; +} + +/**************************************************************************/ + +int main(int argc, char *argv[]) { + if(!parse_options(argc, argv)) { + print_usage(); + return 1; + } + + switch(options.type) { + case TT_EXTRACT: + { + std::string version = options.paths[0]; // us_1.0 + std::string assetsDir = options.paths[1]; // /assets + std::string configsPath = options.paths[2]; // /extract-ver + std::string baseromsPath = options.paths[3]; // /baseroms + std::string outputPath = options.paths[4]; // + + set_assets_folder_path(assetsDir + "/vanilla"); + set_version(version); + + Extractor extractor(version, configsPath, baseromsPath, outputPath); + } + break; + case TT_BUILD: + { + std::string version = options.paths[0]; // us_1.0 + std::string assetsDir = options.paths[1]; // /assets + std::string sourcePath = options.paths[2]; // Input .json filepath + std::string outputPath = options.paths[3]; // Output .bin filepath + + set_assets_folder_path(assetsDir); + set_version(version); + + Builder builder(sourcePath, outputPath); + } + break; + case TT_ASSET_INCLUDES: + { + std::string version = options.paths[0]; // us_1.0 + std::string assetsDir = options.paths[1]; // /assets + std::string includeDir = options.paths[2]; // /include + std::string buildDir = options.paths[3]; // /build + std::string assetsAsmDir = options.paths[4]; // /asm/assets + + set_assets_folder_path(assetsDir); + set_version(version); + + AssetEnumsHeader assetEnumsHeader(includeDir); + AssetAsmIncludes assetAsmIncludes(assetsDir + "/" + version, buildDir + "/" + version, assetsAsmDir); + } + break; + case TT_ASSET_COMPILE: + { + std::string version = options.paths[0]; // us_1.0 + std::string assetsDir = options.paths[1]; // /assets + + set_assets_folder_path(assetsDir); + set_version(version); + + AssetCompiler compiler; + } + break; + case TT_ASSET_COMPRESS_FILE: + case TT_ASSET_DECOMPRESS_FILE: + { + DKRCompression compression; + std::string inputFilename = options.paths[0]; + std::string outputFilename = options.paths[1]; + std::vector inputBinary, outputBinary; + + if(compression.readBinaryFile(inputBinary, inputFilename)) { + if(inputBinary.size() == 0) { + compression.writeBinaryFile(inputBinary, outputFilename); + } else { + if (options.type == TT_ASSET_COMPRESS_FILE) { + outputBinary = compression.compressBuffer(inputBinary); + } else if (options.type == TT_ASSET_DECOMPRESS_FILE) { + outputBinary = compression.decompressBuffer(inputBinary); + } + compression.writeBinaryFile(outputBinary, outputFilename); + } + } else { + display_error_and_abort("Could not read file: ", inputFilename); + } + } + break; + } + + return 0; +} + diff --git a/tools/dkr_assets_tool_classes/builder/build_files/build_fonts.cpp b/tools/dkr_assets_tool_classes/builder/build_files/build_fonts.cpp new file mode 100644 index 00000000..f043a515 --- /dev/null +++ b/tools/dkr_assets_tool_classes/builder/build_files/build_fonts.cpp @@ -0,0 +1,137 @@ +#include "build_fonts.h" + +#define SIZEOF_FONTS_HEADER 4 + +// Note that these are just for DKR afaik. Other rare games have different sizes. +#define SIZEOF_FONT 0x400 // Larger in later Rare games +#define MAX_NUMBER_OF_TEXTURES 32 // Extended to 64 in later Rare games +#define CHAR_NODE_START_OFFSET 32 +#define NUMBER_OF_CHAR_NODES 96 // Extended to 224 in later Rare games +#define CHAR_NODE_END_OFFSET CHAR_NODE_START_OFFSET + NUMBER_OF_CHAR_NODES +#define SIZEOF_CHAR_NODE 8 + +BuildFonts::BuildFonts(std::string srcPath, std::string dstPath) { + + std::string fontFolderPath = get_directory_from_full_path(srcPath); + + std::vector fontIds = get_array_from_section("ASSET_FONTS", "fonts-order"); + int numberOfFonts = fontIds.size(); + + std::vector out(align16(SIZEOF_FONT * numberOfFonts + SIZEOF_FONTS_HEADER)); + + // Write header. + write_big_endian_word(out, 0, numberOfFonts); + + // Write fonts. + for(int font = 0; font < numberOfFonts; font++) { + std::string fontPath = fontFolderPath + "/" + get_string_from_json(srcPath, "fonts", fontIds[font]); + + int fontOffset = font * SIZEOF_FONT + SIZEOF_FONTS_HEADER; + + insert_ascii(out, fontOffset, get_string_from_json(fontPath, "name")); + write_big_endian_halfword(out, fontOffset + 0x20, get_int_from_json(fontPath, "fixed-width")); + write_big_endian_halfword(out, fontOffset + 0x22, get_int_from_json(fontPath, "y-offset")); + write_big_endian_halfword(out, fontOffset + 0x24, get_int_from_json(fontPath, "special-character-width")); + write_big_endian_halfword(out, fontOffset + 0x26, get_int_from_json(fontPath, "tab-width")); + insert_ascii(out, fontOffset + 0x28, get_string_from_json(fontPath, "unknown-text")); + + int numberOfTextures = get_array_length_from_json(fontPath, "textures"); + int texOffset = fontOffset + 0x40; + int texIndex = 0; + // Write texture ids. + for(; texIndex < numberOfTextures; texIndex++) { + write_big_endian_halfword(out, texOffset, get_tex_2d_index_from_build_id(get_string_from_json(fontPath, "textures", texIndex))); + texOffset += 2; + } + // Fill rest of the space with -1. + for(; texIndex < MAX_NUMBER_OF_TEXTURES; texIndex++) { + write_big_endian_halfword(out, texOffset, -1); + texOffset += 2; + } + + std::string encoding = get_string_from_json(fontPath, "encoding", "type"); + make_uppercase(encoding); + + bool uppercaseOnly = false; + + if(json_has_key(fontPath, "uppercase-only")) { + uppercaseOnly = get_bool_from_json(fontPath, "uppercase-only"); + } + + // Write character nodes + if(encoding == "ASCII") { + write_ascii_char_nodes(out, fontPath, fontOffset + 0x100, uppercaseOnly); + } else if(encoding == "CUSTOM") { + write_custom_char_nodes(out, fontPath, fontOffset + 0x100, uppercaseOnly); + } else { + display_error_and_abort("Unsupported font encoding type: \"", encoding, "\""); + } + + } + + write_binary_file(out, dstPath); +} + +BuildFonts::~BuildFonts() { + +} + +void write_char_node(std::vector &out, std::string fontPath, int nodeOffset, std::string &chr) { + if(json_has_key(fontPath, "characters", chr)) { + out[nodeOffset] = get_int_from_json(fontPath, "characters", chr, "tex-index"); + out[nodeOffset + 1] = get_int_from_json(fontPath, "characters", chr, "char-width"); + out[nodeOffset + 2] = get_int_from_json(fontPath, "characters", chr, "offset", 0); // X offset + out[nodeOffset + 3] = get_int_from_json(fontPath, "characters", chr, "offset", 1); // Y offset + out[nodeOffset + 4] = get_int_from_json(fontPath, "characters", chr, "uv", 0); // U coordinate + out[nodeOffset + 5] = get_int_from_json(fontPath, "characters", chr, "uv", 1); // V coordinate + out[nodeOffset + 6] = get_int_from_json(fontPath, "characters", chr, "tex-size", 0); // Width + out[nodeOffset + 7] = get_int_from_json(fontPath, "characters", chr, "tex-size", 1); // Height + } else { // Node doesn't exist, so just mark it as empty. + out[nodeOffset] = -1; + out[nodeOffset + 1] = 0; + out[nodeOffset + 2] = 0; + out[nodeOffset + 3] = 0; + out[nodeOffset + 4] = 0; + out[nodeOffset + 5] = 0; + out[nodeOffset + 6] = 0; + out[nodeOffset + 7] = 0; + } +} + +void BuildFonts::write_ascii_char_nodes(std::vector &out, std::string fontPath, int offset, bool uppercaseOnly) { + for(int node = CHAR_NODE_START_OFFSET; node < CHAR_NODE_END_OFFSET; node++) { + std::string chr; + if(node == 127) { + chr = "DEL"; // Special case because the delete character itself is sometimes weird. + } else if (node == 92) { + chr = "\\\\"; + } else if (node == 34) { + chr = "\\\""; + } else { + chr = (char)node; + } + int nodeOffset = offset + (node - CHAR_NODE_START_OFFSET) * SIZEOF_CHAR_NODE; + if(uppercaseOnly && node >= (int)'a' && node <= (int)'z') { + make_uppercase(chr); + } + write_char_node(out, fontPath, nodeOffset, chr); + } +} + +void BuildFonts::write_custom_char_nodes(std::vector &out, std::string fontPath, int offset, bool uppercaseOnly) { + int index = 0; + std::vector order = get_array_from_json(fontPath, "encoding", "order"); + for(std::string &chr : order) { + if(index >= NUMBER_OF_CHAR_NODES) { + std::string fontName = get_string_from_json(fontPath, "name"); + display_error_and_abort("Too many character nodes in ", fontName, ". The limit is ", NUMBER_OF_CHAR_NODES); + } + int nodeOffset = offset + (index++ * SIZEOF_CHAR_NODE); + write_char_node(out, fontPath, nodeOffset, chr); + } + // Set the rest of the nodes to show nothing. + while(index < NUMBER_OF_CHAR_NODES) { + int nodeOffset = offset + (index++ * SIZEOF_CHAR_NODE); + out[nodeOffset] = -1; + } +} diff --git a/tools/dkr_assets_tool_classes/builder/build_files/build_fonts.h b/tools/dkr_assets_tool_classes/builder/build_files/build_fonts.h new file mode 100644 index 00000000..c5a7b243 --- /dev/null +++ b/tools/dkr_assets_tool_classes/builder/build_files/build_fonts.h @@ -0,0 +1,13 @@ +#pragma once + +#include "../../common/util.h" +//#include "macros.h" + +class BuildFonts { +public: + BuildFonts(std::string srcPath, std::string dstPath); + ~BuildFonts(); +private: + void write_ascii_char_nodes(std::vector &out, std::string srcPath, int offset, bool uppercaseOnly); + void write_custom_char_nodes(std::vector &out, std::string srcPath, int offset, bool uppercaseOnly); +}; diff --git a/tools/dkr_assets_tool_classes/builder/build_files/build_gametext.cpp b/tools/dkr_assets_tool_classes/builder/build_files/build_gametext.cpp new file mode 100644 index 00000000..9a2c70c0 --- /dev/null +++ b/tools/dkr_assets_tool_classes/builder/build_files/build_gametext.cpp @@ -0,0 +1,133 @@ +#include "build_gametext.h" + +// Dialog +#define END_OF_LINES 0x00 +#define ACTIVE_LINE 0x01 +#define CONTINUE 0x0C + +// Textbox +#define NEXT_PAGE 0x01 + +BuildGameText::BuildGameText(std::string srcPath, std::string dstPath) { + std::vector out; + + + // TODO: Figure this out! + + std::string textType = get_string_from_json(srcPath, "text-type"); + if(textType == "Dialog") { + // This is temporary until the game text format is figured out + int numRawBytes = get_array_length_from_json(srcPath, "raw"); + + for(int i = 0; i < numRawBytes; i++) { + out.push_back(get_int_from_json(srcPath, "raw", i)); + } + //build_dialog(out, srcPath); + } else { + build_textbox(out, srcPath); + } + + + while(out.size() % 8 != 0) { + out.push_back(0); // Make sure the data is 8-byte aligned. + } + + + write_binary_file(out, dstPath); +} + +BuildGameText::~BuildGameText() { + +} + +/* +void BuildGameText::build_dialog(std::vector &out, std::string &srcPath) { + int numberOfLines = GET_ARRAY_LENGTH("lines"); + for(int i = 0; i < numberOfLines; i++) { + if(inputJSON["lines"][i].JSONType() == json::JSON::Class::String) { + out.push_back(CONTINUE); + continue; + } + if(HAS_KEY("unknown-data", "lines", i)) { // Check if the key "unknown-data" exists. + for(int j = 0; j < GET_ARRAY_LENGTH("lines", i, "unknown-data"); j++) { + out.push_back(get_int_from_json(srcPath, "lines", i, "unknown-data", j)); + } + break; + } + out.push_back(ACTIVE_LINE); + out.push_back(get_int_from_json(srcPath, "lines", i, "color", "red")); + out.push_back(get_int_from_json(srcPath, "lines", i, "color", "green")); + out.push_back(get_int_from_json(srcPath, "lines", i, "color", "blue")); + out.push_back(get_int_from_json(srcPath, "lines", i, "color", "alpha")); + out.push_back(get_int_from_json(srcPath, "lines", i, "font")); + out.push_back(get_int_from_json(srcPath, "lines", i, "alignment")); + out.push_back((uint8_t)(GET_FLOAT("lines", i, "time") * 5)); + write_ascii(out, get_string_from_json(srcPath, "lines", i, "text")); + //if(i < numberOfLines - 1 && !HAS_KEY("unknown-data", "lines", i + 1)) { + // out.push_back(CONTINUE); + //} + } +} +*/ + +void write_basic_command(std::vector &out, uint8_t cmdId, uint8_t value) { + out.push_back(cmdId); + out.push_back(value); +} + +void write_basic_command_4_args(std::vector &out, uint8_t cmdId, uint8_t a, uint8_t b, uint8_t c, uint8_t d) { + out.push_back(cmdId); + out.push_back(a); + out.push_back(b); + out.push_back(c); + out.push_back(d); +} + +void BuildGameText::build_textbox(std::vector &out, std::string &srcPath) { + int numberOfPages = get_array_length_from_json(srcPath, "pages"); + for(int page = 0; page < numberOfPages; page++) { + int numberOfCommandsInPage = get_array_length_from_json(srcPath, "pages", page); + for(int cmd = 0; cmd < numberOfCommandsInPage; cmd++) { + std::string cmdType = get_string_from_json(srcPath, "pages", page, cmd, "command"); + if(cmdType == "Text") { + write_ascii(out, get_string_from_json(srcPath, "pages", page, cmd, "value")); + } else if(cmdType == "SetFont") { + std::string fontId = get_string_from_json(srcPath, "pages", page, cmd, "value"); + int fontIndex = get_index_of_string_array_value_from_section("ASSET_FONTS", fontId, "fonts-order"); + if(fontIndex == -1) { + display_error_and_abort("Could not find the font \"", fontId, "\" in the \"fonts-order\" array in asset_fonts.json."); + } + write_basic_command(out, 3, fontIndex); + } else if(cmdType == "SetBorder") { + write_basic_command_4_args(out, 4, + get_int_from_json(srcPath, "pages", page, cmd, "value", "left"), + get_int_from_json(srcPath, "pages", page, cmd, "value", "top"), + get_int_from_json(srcPath, "pages", page, cmd, "value", "right"), + get_int_from_json(srcPath, "pages", page, cmd, "value", "bottom") + ); + } else if(cmdType == "SetColour") { + write_basic_command_4_args(out, 5, + get_int_from_json(srcPath, "pages", page, cmd, "value", "red"), + get_int_from_json(srcPath, "pages", page, cmd, "value", "green"), + get_int_from_json(srcPath, "pages", page, cmd, "value", "blue"), + get_int_from_json(srcPath, "pages", page, cmd, "value", "alpha") + ); + } else if(cmdType == "SetAlignment") { + write_basic_command(out, 6, get_string_from_json(srcPath, "pages", page, cmd, "value") == "center" ? 0 : 4); + } else if(cmdType == "Unknown") { + write_basic_command(out, 7, get_int_from_json(srcPath, "pages", page, cmd, "value")); + } else if(cmdType == "AddVerticalSpacing") { + write_basic_command(out, 8, get_int_from_json(srcPath, "pages", page, cmd, "value")); + } else if(cmdType == "SetLineHeight") { + write_basic_command(out, 9, get_int_from_json(srcPath, "pages", page, cmd, "value")); + } else if(cmdType == "SetTimer") { + write_basic_command(out, 10, get_int_from_json(srcPath, "pages", page, cmd, "value")); + } else if(cmdType == "AllowUserInput") { + write_basic_command(out, 11, get_bool_from_json(srcPath, "pages", page, cmd, "value") ? 1 : 0); + } + } + if(page < numberOfPages - 1) { + out.push_back(NEXT_PAGE); + } + } +} diff --git a/tools/dkr_assets_tool_classes/builder/build_files/build_gametext.h b/tools/dkr_assets_tool_classes/builder/build_files/build_gametext.h new file mode 100644 index 00000000..d8a3cbbb --- /dev/null +++ b/tools/dkr_assets_tool_classes/builder/build_files/build_gametext.h @@ -0,0 +1,14 @@ +#pragma once + +#include "../../common/util.h" + +class BuildGameText { +public: + BuildGameText(std::string srcPath, std::string dstPath); + ~BuildGameText(); +private: + /* + void build_dialog(std::vector &out, std::string &srcPath); + */ + void build_textbox(std::vector &out, std::string &srcPath); +}; diff --git a/tools/dkr_assets_tool_classes/builder/build_files/build_levelheader.cpp b/tools/dkr_assets_tool_classes/builder/build_files/build_levelheader.cpp new file mode 100644 index 00000000..d121e87a --- /dev/null +++ b/tools/dkr_assets_tool_classes/builder/build_files/build_levelheader.cpp @@ -0,0 +1,116 @@ +#include "build_levelheader.h" + +#define GET_UNKNOWN_VALUE(name, index) get_int_from_json(srcPath, "unknown-data", name, index) +#define GET_UNKNOWN_VALUES(out, start, end, name) \ + for(int i = start; i < end; i++) { \ + out[i] = GET_UNKNOWN_VALUE(name, i - start); \ + } + +int get_bitfield_from_enum_values(std::string &srcPath, std::string propertyName, std::string enumName) { + int numEntries = get_array_length_from_json(srcPath, propertyName); + int out = 0; + for(int i = 0; i < numEntries; i++) { + out |= 1 << get_enum_value_from_string(enumName, get_string_from_json(srcPath, propertyName, i)); + } + return out; +} + +BuildLevelHeader::BuildLevelHeader(std::string srcPath, std::string dstPath) { + std::vector out(SIZEOF_LEVEL_HEADER); + + // World ID + out[0] = get_enum_value_from_string("World", get_string_from_json(srcPath, "world")); + + out[1] = get_int_from_json(srcPath, "unknown-data", "unk1"); + out[2] = get_int_from_json(srcPath, "unknown-data", "unk2"); + out[3] = get_int_from_json(srcPath, "unknown-data", "unk3"); + GET_UNKNOWN_VALUES(out, 4, 8, "unk4"); + + // Ceiling height for planes + write_big_endian_float(out, 8, get_float_from_json(srcPath, "ceiling-height")); + + GET_UNKNOWN_VALUES(out, 0xC, 0x34, "unkC"); + + // Track ID to use + write_big_endian_halfword(out, 0x34, get_index_from_build_id("ASSET_LEVEL_MODELS", get_string_from_json(srcPath, "model"))); + + // Collectables bitflags (bananas, balloons, etc) + write_big_endian_halfword(out, 0x36, get_int_from_json(srcPath, "collectables")); + + // Skydome object model ID + write_big_endian_halfword(out, 0x38, get_int_from_json(srcPath, "skybox")); + + // Fog + write_big_endian_halfword(out, 0x3A, get_int_from_json(srcPath, "fog", "range", "min")); + write_big_endian_halfword(out, 0x3C, get_int_from_json(srcPath, "fog", "range", "max")); + write_big_endian_halfword(out, 0x3E, get_int_from_json(srcPath, "fog", "colour", "red")); + write_big_endian_halfword(out, 0x40, get_int_from_json(srcPath, "fog", "colour", "green")); + write_big_endian_halfword(out, 0x42, get_int_from_json(srcPath, "fog", "colour", "blue")); + + GET_UNKNOWN_VALUES(out, 0x44, 0x4B, "unk44"); + + // Number of laps to complete the race. + out[0x4B] = get_int_from_json(srcPath, "number-laps"); + + // Type of race (standard, boss race, hub world, etc. + out[0x4C] = get_enum_value_from_string("RaceType", get_string_from_json(srcPath, "race-type")); + + // Default vehicle used for this track. (Either Car, Hovercraft, or Plane) + out[0x4D] = get_enum_value_from_string("Vehicle", get_string_from_json(srcPath, "default-vehicle")); + + // Which vehicles can be used in this track (Either Car, Hovercraft, or Plane) + out[0x4E] = get_bitfield_from_enum_values(srcPath, "available-vehicles", "Vehicle"); + GET_UNKNOWN_VALUES(out, 0x4F, 0x52, "unk4F"); + + // Music ID to use for this track + out[0x52] = get_int_from_json(srcPath, "music"); + + // Unknown, but *probably* related to audio. + out[0x53] = get_int_from_json(srcPath, "unknown-data", "unk53"); + + // Instruments bitflags. Most levels have 0xFFFF, except for the central hub which is 0xB + write_big_endian_halfword(out, 0x54, get_int_from_json(srcPath, "instruments")); + + GET_UNKNOWN_VALUES(out, 0x56, 0x74, "unk56"); + for(int i = 0; i < 7; i++) { + write_big_endian_word(out, 0x74 + (i * 4), get_int_from_json(srcPath, "unknown-data", "unk74", i)); + } + + // Weather values currently unknown. + write_big_endian_halfword(out, 0x90, get_int_from_json(srcPath, "unknown-data", "weather", "unk90")); + write_big_endian_halfword(out, 0x92, get_int_from_json(srcPath, "unknown-data", "weather", "unk92")); + out[0x94] = get_int_from_json(srcPath, "unknown-data", "weather", "unk94"); + out[0x95] = get_int_from_json(srcPath, "unknown-data", "weather", "unk95"); + write_big_endian_halfword(out, 0x96, get_int_from_json(srcPath, "unknown-data", "weather", "unk96")); + write_big_endian_halfword(out, 0x98, get_int_from_json(srcPath, "unknown-data", "weather", "unk98")); + write_big_endian_halfword(out, 0x9A, get_int_from_json(srcPath, "unknown-data", "weather", "unk9A")); + + // Field of view + out[0x9C] = get_int_from_json(srcPath, "fov"); + + // Background clear color + out[0x9D] = get_int_from_json(srcPath, "background-colour", "red"); + out[0x9E] = get_int_from_json(srcPath, "background-colour", "green"); + out[0x9F] = get_int_from_json(srcPath, "background-colour", "blue"); + + GET_UNKNOWN_VALUES(out, 0xA0, 0xA4, "unkA0"); + write_big_endian_word(out, 0xA4, get_int_from_json(srcPath, "unknown-data", "unkA4")); + write_big_endian_halfword(out, 0xA8, get_int_from_json(srcPath, "unknown-data", "unkA8")); + write_big_endian_halfword(out, 0xAA, get_int_from_json(srcPath, "unknown-data", "unkAA")); + + // Pulsating lights are only used in spaceport alpha + int pulsatingLights = -1; + if(json_has_key(srcPath, "pulsating-lights")) { + pulsatingLights = get_index_from_build_id("ASSET_MISC", get_string_from_json(srcPath, "pulsating-lights")); + } + write_big_endian_word(out, 0xAC, pulsatingLights); + + GET_UNKNOWN_VALUES(out, 0xB0, 0xC4, "unkB0"); + write_big_endian_word(out, 0xC4, get_int_from_json(srcPath, "unknown-data", "unkC4")); + + write_binary_file(out, dstPath); +} + +BuildLevelHeader::~BuildLevelHeader() { + +} diff --git a/tools/dkr_assets_tool_classes/builder/build_files/build_levelheader.h b/tools/dkr_assets_tool_classes/builder/build_files/build_levelheader.h new file mode 100644 index 00000000..5e7a35e3 --- /dev/null +++ b/tools/dkr_assets_tool_classes/builder/build_files/build_levelheader.h @@ -0,0 +1,11 @@ +#pragma once + +#include "../../common/util.h" + +#define SIZEOF_LEVEL_HEADER 0xC8 + +class BuildLevelHeader { +public: + BuildLevelHeader(std::string srcPath, std::string dstPath); + ~BuildLevelHeader(); +}; diff --git a/tools/dkr_assets_tool_classes/builder/build_files/build_levelname.cpp b/tools/dkr_assets_tool_classes/builder/build_files/build_levelname.cpp new file mode 100644 index 00000000..b4c30263 --- /dev/null +++ b/tools/dkr_assets_tool_classes/builder/build_files/build_levelname.cpp @@ -0,0 +1,32 @@ +#include "build_levelname.h" + +BuildLevelName::BuildLevelName(std::string srcPath, std::string dstPath) { + std::vector out; + + std::vector languages = get_enum_keys("Language"); + + int numLangWritten = 0; + + // Search through and add all the avaliable languages. + // Note: If a language is not defined in the enum, then it won't be added to the output! + for(auto &langName : languages) { + if(json_has_key(srcPath, "languages", langName)) { // Check if the level name json has the language. + write_ascii(out, get_string_from_json(srcPath, "languages", langName)); + numLangWritten++; + } else { + // Language not found. For now, this means the text will be empty. + // TODO: Maybe have an option to default to english? + out.push_back('\0'); // Push back a null terminator + } + } + + if(numLangWritten == 0) { + std::cout << "Warning: No languages were found." << std::endl; + } + + write_binary_file(out, dstPath); +} + +BuildLevelName::~BuildLevelName() { + +} diff --git a/tools/dkr_assets_tool_classes/builder/build_files/build_levelname.h b/tools/dkr_assets_tool_classes/builder/build_files/build_levelname.h new file mode 100644 index 00000000..0bb9497f --- /dev/null +++ b/tools/dkr_assets_tool_classes/builder/build_files/build_levelname.h @@ -0,0 +1,9 @@ +#pragma once + +#include "../../common/util.h" + +class BuildLevelName { +public: + BuildLevelName(std::string srcPath, std::string dstPath); + ~BuildLevelName(); +}; diff --git a/tools/dkr_assets_tool_classes/builder/build_files/build_menutext.cpp b/tools/dkr_assets_tool_classes/builder/build_files/build_menutext.cpp new file mode 100644 index 00000000..a2d75d29 --- /dev/null +++ b/tools/dkr_assets_tool_classes/builder/build_files/build_menutext.cpp @@ -0,0 +1,46 @@ +#include "build_menutext.h" + +BuildMenuText::BuildMenuText(std::string srcPath, std::string dstPath) { + //int numberOfEntries = get_array_length_from_json(srcPath, "order"); + + std::vector ids = get_array_from_section("ASSET_MENU_TEXT", "menu-text-build-ids"); + int numberOfEntries = ids.size(); + + std::vector table(numberOfEntries * 4); + std::vector text; + + int textOffset = numberOfEntries * 4; + + for(int i = 0; i < numberOfEntries; i++) { + // Get the build id for this index. + std::string buildId = ids[i]; + + // If the build ID is not in the sections, then just write -1 to the table. + if(!json_has_key(srcPath, "sections", buildId)) { + write_big_endian_word(table, i * 4, -1); + continue; + } + // Get the text string from the inputJSON. + std::string entryText = get_string_from_json(srcPath, "sections", buildId); + // Write ascii text to vector + write_ascii(text, entryText); + // Write the offset to the text + write_big_endian_word(table, i * 4, textOffset); + // Increment the current offset by the length of the string (+1 for null terminator) + textOffset += entryText.length() + 1; + } + + // Append the text data to the table data. + table.insert(table.end(), text.begin(), text.end()); + + while(table.size() % 8 != 0) { + table.push_back(0); // Make sure the data is 8-byte aligned. + } + + write_binary_file(table, dstPath); +} + +BuildMenuText::~BuildMenuText(){ + +} + diff --git a/tools/dkr_assets_tool_classes/builder/build_files/build_menutext.h b/tools/dkr_assets_tool_classes/builder/build_files/build_menutext.h new file mode 100644 index 00000000..ef71d6bb --- /dev/null +++ b/tools/dkr_assets_tool_classes/builder/build_files/build_menutext.h @@ -0,0 +1,9 @@ +#pragma once + +#include "../../common/util.h" + +class BuildMenuText { +public: + BuildMenuText(std::string srcPath, std::string dstPath); + ~BuildMenuText(); +}; diff --git a/tools/dkr_assets_tool_classes/builder/build_files/build_sprite.cpp b/tools/dkr_assets_tool_classes/builder/build_files/build_sprite.cpp new file mode 100644 index 00000000..b157a76e --- /dev/null +++ b/tools/dkr_assets_tool_classes/builder/build_files/build_sprite.cpp @@ -0,0 +1,29 @@ +#include "build_sprite.h" + +#define SIZEOF_SPRITE_HEADER 12 + +BuildSprite::BuildSprite(std::string srcPath, std::string dstPath) { + int numberOfFrames = get_array_length_from_json(srcPath, "frame-tex-count"); + + std::vector out(align16(SIZEOF_SPRITE_HEADER + numberOfFrames + 1)); + + // Write header + write_big_endian_halfword(out, 0, get_tex_2d_index_from_build_id(get_string_from_json(srcPath, "start-texture"))); + write_big_endian_halfword(out, 2, numberOfFrames); + write_big_endian_halfword(out, 4, get_int_from_json(srcPath, "unk4")); + write_big_endian_halfword(out, 6, get_int_from_json(srcPath, "unk6")); + // The word at offset 8 is always zero in the rom. + + int texOffset = 0; + + for(int i = 0; i < numberOfFrames + 1; i++) { + out[SIZEOF_SPRITE_HEADER + i] = texOffset; + texOffset += get_int_from_json(srcPath, "frame-tex-count", i); + } + + write_binary_file(out, dstPath); +} + +BuildSprite::~BuildSprite() { + +} diff --git a/tools/dkr_assets_tool_classes/builder/build_files/build_sprite.h b/tools/dkr_assets_tool_classes/builder/build_files/build_sprite.h new file mode 100644 index 00000000..dc8ad2c4 --- /dev/null +++ b/tools/dkr_assets_tool_classes/builder/build_files/build_sprite.h @@ -0,0 +1,9 @@ +#pragma once + +#include "../../common/util.h" + +class BuildSprite { +public: + BuildSprite(std::string srcPath, std::string dstPath); + ~BuildSprite(); +}; diff --git a/tools/dkr_assets_tool_classes/builder/build_files/build_texture.cpp b/tools/dkr_assets_tool_classes/builder/build_files/build_texture.cpp new file mode 100644 index 00000000..d266a878 --- /dev/null +++ b/tools/dkr_assets_tool_classes/builder/build_files/build_texture.cpp @@ -0,0 +1,221 @@ +#include "build_texture.h" + +#define SET_BOOL_FLAG(flagName, flagVal) \ + flags |= get_bool_from_json(srcPath, "flags", flagName) ? flagVal : 0 +#define SET_STRING_FLAG(flagName, strVal, flagVal) \ + flags |= get_string_from_json(srcPath, "flags", flagName) == strVal ? flagVal : 0 + +int get_png_data_size(int width, int height, int format) { + switch(format) { + case TEX_FORMAT_I8: + case TEX_FORMAT_I4: + case TEX_FORMAT_IA16: + case TEX_FORMAT_IA8: + case TEX_FORMAT_IA4: + return (width * height * 2); + default: + return (width * height * 4); + } +} + +int get_png_offset(int i, int width, int height, int format) { + return get_png_data_size(width, height, format) * i; +} + +BuildTexture::BuildTexture(std::string srcPath, std::string dstPath) { + std::string directory = get_directory_from_full_path(srcPath); + std::string imgPath = directory + "/" + get_string_from_json(srcPath, "img"); + + bool isCompressed = get_bool_from_json(srcPath, "compressed"); + bool flipTexture = get_bool_from_json(srcPath, "flipped-image"); + bool interlaced = get_bool_from_json(srcPath, "flags", "interlaced"); + + int width = get_int_from_json(srcPath, "width"); + int height = get_int_from_json(srcPath, "height"); + std::string formatString = get_string_from_json(srcPath, "format"); + int format = get_texture_format_from_string(formatString); + int texType = get_int_from_json(srcPath, "tex-type"); + + int spriteX = json_has_key(srcPath, "sprite-x") ? get_int_from_json(srcPath, "sprite-x") : 0; + int spriteY = json_has_key(srcPath, "sprite-y") ? get_int_from_json(srcPath, "sprite-y") : 0; + + bool writeSize = get_bool_from_json(srcPath, "write-size"); + + // TODO: Figure out all the flags + int flags = 0; + SET_BOOL_FLAG("flag-01", 0x0001); + SET_BOOL_FLAG("flag-04", 0x0004); + SET_BOOL_FLAG("flag-10", 0x0010); + SET_STRING_FLAG("wrap-s", "Clamp", 0x0040); + SET_STRING_FLAG("wrap-t", "Clamp", 0x0080); + SET_BOOL_FLAG("interlaced", 0x0400); + + int textureSize = get_texture_size(width, height, format); + + int numberOfTextures = get_int_from_json(srcPath, "frame-count"); + + int frameAdvance = json_has_key(srcPath, "frame-advance-delay") ? get_int_from_json(srcPath, "frame-advance-delay") : 0; + + std::vector uncompressed(textureSize * numberOfTextures); + + int pngWidth, pngHeight; + std::vector pngData = load_texture_from_png(imgPath, format, &pngWidth, &pngHeight); + + for(int i = 0; i < numberOfTextures; i++) { + int off = i * textureSize; + int pngOff = get_png_offset(i, width, height, format); + + // Texture Header + uncompressed[off] = width; + uncompressed[off + 0x01] = height; + uncompressed[off + 0x02] = (texType << 4) | format; + uncompressed[off + 0x03] = spriteX; + uncompressed[off + 0x04] = spriteY; + uncompressed[off + 0x05] = 1; // Number of instances. Always 1 in the ROM. + write_big_endian_halfword(uncompressed, off + 0x06, flags); + uncompressed[off + 0x12] = numberOfTextures; + write_big_endian_halfword(uncompressed, off + 0x14, frameAdvance); + if(writeSize) { + write_big_endian_halfword(uncompressed, off + 0x16, align16(textureSize)); + } else { + uncompressed[off + 0x1D] = 0x01; + } + + // Subsection of pngData + std::vector rgbaData(pngData.begin() + pngOff, pngData.begin() + pngOff + get_png_data_size(width, height, format)); + + write_texture_data(uncompressed, off + TEX_HEADER_SIZE, rgbaData, width, height, format, interlaced, flipTexture); + } + + if(!writeSize) { + while(uncompressed.size() % 16 != 0) { + uncompressed.push_back(0); + } + } + + // isCompressed = false; // Uncomment to help with debugging. + + if(isCompressed) { + std::vector compressedHeader; + compressedHeader.insert(compressedHeader.end(), uncompressed.begin(), uncompressed.begin() + TEX_HEADER_SIZE); + + compressedHeader[0x1D] = 0x01; + + DKRCompression compression; + std::vector compressed = compression.compressBuffer(uncompressed); + + // Note: uncompressed is garbled at this point. + + compressed.insert(compressed.begin(), compressedHeader.begin(), compressedHeader.end()); + + write_binary_file(compressed, dstPath); + } else { + write_binary_file(uncompressed, dstPath); + } + + //write_binary_file(out, dstPath); +} + +BuildTexture::~BuildTexture() { + +} + +void BuildTexture::write_texture_data(std::vector &out, int outOffset, std::vector &rgbaData, + int width, int height, int format, bool interlace, bool flipTexture) { + if(flipTexture) { + switch(format) { + case TEX_FORMAT_I8: + case TEX_FORMAT_I4: + case TEX_FORMAT_IA16: + case TEX_FORMAT_IA8: + case TEX_FORMAT_IA4: + flip_texture_vertically(rgbaData, 0, width, height, TEX_FORMAT_IA16); + break; + default: + flip_texture_vertically(rgbaData, 0, width, height, TEX_FORMAT_RGBA32); + break; + } + } + switch(format) { + case TEX_FORMAT_RGBA32: + { + if (interlace) { + deinterlace(rgbaData, 0, width, height, 32, 8); + } + std::copy(rgbaData.begin(), rgbaData.end(), out.begin() + outOffset); + break; + } + case TEX_FORMAT_RGBA16: + { + uint8_t* rgba16Data = (uint8_t*)malloc(width * height * 2); + rgba2raw(rgba16Data, (const rgba*)&rgbaData[0], width, height, 16); + std::vector rgba16(rgba16Data, rgba16Data + (width * height * 2)); + if (interlace) { + deinterlace(rgba16, 0, width, height, 16, 4); + } + std::copy(rgba16.begin(), rgba16.end(), out.begin() + outOffset); + break; + } + case TEX_FORMAT_I8: + { + uint8_t* i8Data = (uint8_t*)malloc(width * height); + i2raw(i8Data, (const ia*)&rgbaData[0], width, height, 8); + std::vector i8(i8Data, i8Data + (width * height)); + if (interlace) { + deinterlace(i8, 0, width, height, 8, 4); + } + std::copy(i8.begin(), i8.end(), out.begin() + outOffset); + break; + } + case TEX_FORMAT_I4: + { + uint8_t* i4Data = (uint8_t*)malloc(width * height / 2); + i2raw(i4Data, (const ia*)&rgbaData[0], width, height, 4); + std::vector i4(i4Data, i4Data + (width * height / 2)); + if (interlace) { + deinterlace(i4, 0, width, height, 4, 4); + } + std::copy(i4.begin(), i4.end(), out.begin() + outOffset); + break; + } + case TEX_FORMAT_IA16: + { + uint8_t* ia16Data = (uint8_t*)malloc(width * height * 2); + ia2raw(ia16Data, (const ia*)&rgbaData[0], width, height, 16); + std::vector ia16(ia16Data, ia16Data + (width * height * 2)); + if (interlace) { + deinterlace(ia16, 0, width, height, 16, 4); + } + std::copy(ia16.begin(), ia16.end(), out.begin() + outOffset); + break; + } + case TEX_FORMAT_IA8: + { + uint8_t* ia8Data = (uint8_t*)malloc(width * height); + ia2raw(ia8Data, (const ia*)&rgbaData[0], width, height, 8); + std::vector ia8(ia8Data, ia8Data + (width * height)); + if (interlace) { + deinterlace(ia8, 0, width, height, 8, 4); + } + std::copy(ia8.begin(), ia8.end(), out.begin() + outOffset); + break; + } + case TEX_FORMAT_IA4: + { + uint8_t* ia4Data = (uint8_t*)malloc(width * height / 2); + ia2raw(ia4Data, (const ia*)&rgbaData[0], width, height, 4); + std::vector ia4(ia4Data, ia4Data + (width * height / 2)); + if (interlace) { + deinterlace(ia4, 0, width, height, 4, 4); + } + std::copy(ia4.begin(), ia4.end(), out.begin() + outOffset); + break; + } + case TEX_FORMAT_CI4: + case TEX_FORMAT_CI8: + { + display_error_and_abort("CI4/CI8 texture formats are not currently supported."); + } + } +} + diff --git a/tools/dkr_assets_tool_classes/builder/build_files/build_texture.h b/tools/dkr_assets_tool_classes/builder/build_files/build_texture.h new file mode 100644 index 00000000..e653f1da --- /dev/null +++ b/tools/dkr_assets_tool_classes/builder/build_files/build_texture.h @@ -0,0 +1,13 @@ +#pragma once + +#include "../../common/util.h" +#include "../../common/textures.h" + +class BuildTexture { +public: + BuildTexture(std::string srcPath, std::string dstPath); + ~BuildTexture(); +private: + void write_texture_data(std::vector &out, int outOffset, std::vector &rgbaData, + int width, int height, int format, bool interlace, bool flipTexture); +}; diff --git a/tools/dkr_assets_tool_classes/builder/build_files/build_ttghost.cpp b/tools/dkr_assets_tool_classes/builder/build_files/build_ttghost.cpp new file mode 100644 index 00000000..995bec87 --- /dev/null +++ b/tools/dkr_assets_tool_classes/builder/build_files/build_ttghost.cpp @@ -0,0 +1,33 @@ +#include "build_ttghost.h" + +#include + +BuildTTGhost::BuildTTGhost(std::string srcPath, std::string dstPath) { + int numberOfNodes = get_array_length_from_json(srcPath, "nodes"); + + std::vector out(align16(SIZEOF_TTGHOST_HEADER + numberOfNodes * SIZEOF_TTGHOST_NODE)); + + // Write header + out[0] = get_index_from_build_id("ASSET_LEVEL_HEADERS", get_string_from_json(srcPath, "header", "level")); // get_int_from_json(srcPath, "header", "level"); + out[1] = get_enum_value_from_string("Vehicle", get_string_from_json(srcPath, "header", "vehicle")); + out[2] = 9; // Always 9? + write_big_endian_halfword(out, 4, get_int_from_json(srcPath, "header", "time")); + write_big_endian_halfword(out, 6, numberOfNodes); + + // Write the nodes + for(int i = 0; i < numberOfNodes; i++) { + int offset = (i * SIZEOF_TTGHOST_NODE) + SIZEOF_TTGHOST_HEADER; + write_big_endian_halfword(out, offset, get_int_from_json(srcPath, "nodes", i, "x")); + write_big_endian_halfword(out, offset + 2, get_int_from_json(srcPath, "nodes", i, "y")); + write_big_endian_halfword(out, offset + 4, get_int_from_json(srcPath, "nodes", i, "z")); + // Yes, this order is correct. + write_big_endian_halfword(out, offset + 6, get_int_from_json(srcPath, "nodes", i, "rz")); + write_big_endian_halfword(out, offset + 8, get_int_from_json(srcPath, "nodes", i, "rx")); + write_big_endian_halfword(out, offset + 10, get_int_from_json(srcPath, "nodes", i, "ry")); + } + + write_binary_file(out, dstPath); +} + +BuildTTGhost::~BuildTTGhost() { +} diff --git a/tools/dkr_assets_tool_classes/builder/build_files/build_ttghost.h b/tools/dkr_assets_tool_classes/builder/build_files/build_ttghost.h new file mode 100644 index 00000000..e6e935ac --- /dev/null +++ b/tools/dkr_assets_tool_classes/builder/build_files/build_ttghost.h @@ -0,0 +1,12 @@ +#pragma once + +#include "../../common/util.h" + +#define SIZEOF_TTGHOST_HEADER 8 +#define SIZEOF_TTGHOST_NODE 12 + +class BuildTTGhost { +public: + BuildTTGhost(std::string srcPath, std::string dstPath); + ~BuildTTGhost(); +}; diff --git a/tools/dkr_assets_tool_classes/builder/builder.cpp b/tools/dkr_assets_tool_classes/builder/builder.cpp new file mode 100644 index 00000000..221432be --- /dev/null +++ b/tools/dkr_assets_tool_classes/builder/builder.cpp @@ -0,0 +1,36 @@ +#include "builder.h" + +Builder::Builder(std::string srcPath, std::string dstPath) { + if(!path_exists(srcPath)) { + display_error_and_abort("Invalid path \"", srcPath, "\""); + } + + if(ends_with(srcPath, ".json")) { + std::string type = get_string_from_json(srcPath, "type"); + if(type == "Textures") { + BuildTexture(srcPath, dstPath); + } else if (type == "TTGhosts") { + BuildTTGhost(srcPath, dstPath); + } else if (type == "Sprites") { + BuildSprite(srcPath, dstPath); + } else if (type == "LevelNames") { + BuildLevelName(srcPath, dstPath); + } else if (type == "LevelHeaders") { + BuildLevelHeader(srcPath, dstPath); + } else if (type == "GameText") { + BuildGameText(srcPath, dstPath); + } else if (type == "MenuText") { + BuildMenuText(srcPath, dstPath); + } else if (type == "Fonts") { + BuildFonts(srcPath, dstPath); + } else if (type == "") { + display_error_and_abort("No type found for \"", srcPath, "\".\nMake sure the \"type\" property is defined in the json file!"); + } else { + display_error_and_abort("Unknown type \"", type, "\" in \"", srcPath, "\""); + } + } +} + +Builder::~Builder() { + +} diff --git a/tools/dkr_assets_tool_classes/builder/builder.h b/tools/dkr_assets_tool_classes/builder/builder.h new file mode 100644 index 00000000..c90285e6 --- /dev/null +++ b/tools/dkr_assets_tool_classes/builder/builder.h @@ -0,0 +1,28 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include + +#include "../common/util.h" +#include "../common/types.h" + +#include "build_files/build_fonts.h" +#include "build_files/build_gametext.h" +#include "build_files/build_levelname.h" +#include "build_files/build_levelheader.h" +#include "build_files/build_menutext.h" +#include "build_files/build_sprite.h" +#include "build_files/build_texture.h" +#include "build_files/build_ttghost.h" + +class Builder { +public: + Builder(std::string srcPath, std::string dstPath); + ~Builder(); +private: +}; diff --git a/tools/dkr_assets_tool_classes/common/revision_number.h b/tools/dkr_assets_tool_classes/common/revision_number.h new file mode 100644 index 00000000..98fa5d17 --- /dev/null +++ b/tools/dkr_assets_tool_classes/common/revision_number.h @@ -0,0 +1,5 @@ +#pragma once + +#define REVISION_NUMBER 2 +#define REVISION_MINOR_NUMBER 0 + diff --git a/tools/dkr_assets_tool_classes/common/textures.cpp b/tools/dkr_assets_tool_classes/common/textures.cpp new file mode 100644 index 00000000..ea2a51ea --- /dev/null +++ b/tools/dkr_assets_tool_classes/common/textures.cpp @@ -0,0 +1,138 @@ +#include "textures.h" + +std::string get_texture_format_string(int format) { + switch(format) { + case TEX_FORMAT_RGBA32: return "RGBA32"; + case TEX_FORMAT_RGBA16: return "RGBA16"; + case TEX_FORMAT_I8: return "I8"; + case TEX_FORMAT_I4: return "I4"; + case TEX_FORMAT_IA16: return "IA16"; + case TEX_FORMAT_IA8: return "IA8"; + case TEX_FORMAT_IA4: return "IA4"; + case TEX_FORMAT_CI4: return "CI4"; + case TEX_FORMAT_CI8: return "CI8"; + } + display_error_and_abort("Invalid texture format ", format); +} + +int get_texture_format_from_string(std::string format) { + if(format == "RGBA32") return TEX_FORMAT_RGBA32; + if(format == "RGBA16") return TEX_FORMAT_RGBA16; + if(format == "I8") return TEX_FORMAT_I8; + if(format == "I4") return TEX_FORMAT_I4; + if(format == "IA16") return TEX_FORMAT_IA16; + if(format == "IA8") return TEX_FORMAT_IA8; + if(format == "IA4") return TEX_FORMAT_IA4; + if(format == "CI4") return TEX_FORMAT_CI4; + if(format == "CI8") return TEX_FORMAT_CI8; + display_error_and_abort("Invalid texture format ", format); +} + +void deinterlace(std::vector& texData, int texDataOffset, int width, int height, int bitDepth, int bufferSize) { + uint8_t* temp = new uint8_t[bufferSize]; + + int numPixels; + if(bitDepth == 4) { + numPixels = ((width * height) / 2); + } else { + numPixels = (width * height * (bitDepth / 8)); + } + + int stride = bufferSize * 2; + + int size = numPixels / stride; + + for(int i = 0; i < size; i++) { + int row; + if(bitDepth == 4) { + row = (i * stride) / width * 2; + } else { + row = (i * stride) / width / (bitDepth / 8); + } + if(row % 2 == 0) continue; + for(int j = 0; j < bufferSize; j++) { + temp[j] = texData[texDataOffset + (i * stride + j)]; + texData[texDataOffset + (i * stride + j)] = texData[texDataOffset + (i * stride + j + bufferSize)]; + texData[texDataOffset + (i * stride + j + bufferSize)] = temp[j]; + } + } + + delete[] temp; +} + +void flip_texture_vertically(std::vector &data, int dataOffset, int width, int height, int format) { + // Convert width into number of bytes per line. + switch(format) { + case TEX_FORMAT_I4: + case TEX_FORMAT_IA4: + case TEX_FORMAT_CI4: + width /= 2; // 2 pixels per byte + break; + case TEX_FORMAT_RGBA16: + case TEX_FORMAT_IA16: + width *= 2; // 2 bytes per pixel + break; + case TEX_FORMAT_RGBA32: + width *= 4; // 4 bytes per pixel + break; + // Don't need to do anything for the 8-bit formats. + } + + for(int y = 0; y < height / 2; y++) { + for(int x = 0; x < width; x++) { + uint8_t temp = data[dataOffset + (y * width + x)]; + data[dataOffset + (y * width + x)] = data[dataOffset + ((height - y - 1) * width + x)]; + data[dataOffset + ((height - y - 1) * width + x)] = temp; + } + } +} + +int get_texture_size(int width, int height, int format) { + switch(format) { + case TEX_FORMAT_RGBA32: + return (width * height * 4) + TEX_HEADER_SIZE; + case TEX_FORMAT_RGBA16: + case TEX_FORMAT_IA16: + return (width * height * 2) + TEX_HEADER_SIZE; + case TEX_FORMAT_I8: + case TEX_FORMAT_IA8: + return (width * height) + TEX_HEADER_SIZE; + case TEX_FORMAT_I4: + case TEX_FORMAT_IA4: + return (width * height / 2) + TEX_HEADER_SIZE; + case TEX_FORMAT_CI4: + case TEX_FORMAT_CI8: + display_error_and_abort("CI texture formats are not currently supported."); + } + + display_error_and_abort("Invalid texture format ", format); +} + +std::vector load_texture_from_png(std::string filepath, int textureFormat, int *width, int *height) { + switch(textureFormat) { + case TEX_FORMAT_RGBA32: + case TEX_FORMAT_RGBA16: + { + uint8_t* data = (uint8_t*)png2rgba(filepath.c_str(), width, height); + std::vector vec(data, data + ((*width) * (*height) * 4)); + free(data); + return vec; + } + case TEX_FORMAT_I8: + case TEX_FORMAT_I4: + case TEX_FORMAT_IA16: + case TEX_FORMAT_IA8: + case TEX_FORMAT_IA4: + { + uint8_t* data = (uint8_t*)png2ia(filepath.c_str(), width, height); + std::vector vec(data, data + ((*width) * (*height) * 2)); + free(data); + return vec; + } + case TEX_FORMAT_CI4: + case TEX_FORMAT_CI8: + display_error_and_abort("CI4/CI8 texture formats are not currently supported."); + default: + display_error_and_abort("Invalid texture format: ", textureFormat); + } +} diff --git a/tools/dkr_assets_tool_classes/common/textures.h b/tools/dkr_assets_tool_classes/common/textures.h new file mode 100644 index 00000000..e960dd8d --- /dev/null +++ b/tools/dkr_assets_tool_classes/common/textures.h @@ -0,0 +1,26 @@ +#pragma once + +#include +#include +#include +#include "../libs/n64graphics.h" +#include "util/errorHelper.h" + +#define TEX_HEADER_SIZE 0x20 + +#define TEX_FORMAT_RGBA32 0 +#define TEX_FORMAT_RGBA16 1 +#define TEX_FORMAT_I8 2 +#define TEX_FORMAT_I4 3 +#define TEX_FORMAT_IA16 4 +#define TEX_FORMAT_IA8 5 +#define TEX_FORMAT_IA4 6 +#define TEX_FORMAT_CI4 7 +#define TEX_FORMAT_CI8 8 + +std::string get_texture_format_string(int format); +int get_texture_format_from_string(std::string format); +void deinterlace(std::vector& texData, int texDataOffset, int width, int height, int bitDepth, int bufferSize); +void flip_texture_vertically(std::vector &data, int dataOffset, int width, int height, int format); +int get_texture_size(int width, int height, int format); +std::vector load_texture_from_png(std::string filepath, int textureFormat, int* width, int* height); diff --git a/tools/dkr_assets_tool_classes/common/types.cpp b/tools/dkr_assets_tool_classes/common/types.cpp new file mode 100644 index 00000000..5f9dd37b --- /dev/null +++ b/tools/dkr_assets_tool_classes/common/types.cpp @@ -0,0 +1,17 @@ +#include "types.h" + +bool is_binary_type(std::string type) { + return type == "Binary" || type == "Miscellaneous" + || type == "ObjectHeaders" || type == "Audio" + || type == "Particles" || type == "ParticleBehaviors"; +} + +bool is_compressed_type(std::string type) { + return type == "Compressed" || type == "LevelObjectMap" || type == "LevelModels" + || type == "ObjectModels" || type == "ObjectAnimations"; +} + +bool is_json_type(std::string type){ + return type == "MenuText" || type == "GameText" || type == "TTGhosts" || type == "LevelNames" || + type == "LevelHeaders" || type == "Textures" || type == "Sprites" || type == "Fonts"; +} diff --git a/tools/dkr_assets_tool_classes/common/types.h b/tools/dkr_assets_tool_classes/common/types.h new file mode 100644 index 00000000..4a41002e --- /dev/null +++ b/tools/dkr_assets_tool_classes/common/types.h @@ -0,0 +1,7 @@ +#pragma once + +#include + +bool is_binary_type(std::string type); +bool is_compressed_type(std::string type); +bool is_json_type(std::string type); diff --git a/tools/dkr_assets_tool_classes/common/util.cpp b/tools/dkr_assets_tool_classes/common/util.cpp new file mode 100644 index 00000000..1f14eb9e --- /dev/null +++ b/tools/dkr_assets_tool_classes/common/util.cpp @@ -0,0 +1,162 @@ +#include "util.h" + +uint32_t get_big_endian_word(std::vector &data, int offset) { + return (data[offset] << 24) | (data[offset + 1] << 16) | (data[offset + 2] << 8) | data[offset + 3]; +} + +void write_big_endian_word(std::vector &data, int offset, uint32_t value) { + data[offset] = (value >> 24) & 0xFF; + data[offset + 1] = (value >> 16) & 0xFF; + data[offset + 2] = (value >> 8) & 0xFF; + data[offset + 3] = value & 0xFF; +} + +uint16_t get_big_endian_halfword(std::vector &data, int offset) { + return (data[offset] << 8) | data[offset + 1]; +} + +void write_big_endian_halfword(std::vector &data, int offset, uint16_t value) { + data[offset] = (value >> 8) & 0xFF; + data[offset + 1] = value & 0xFF; +} + +float get_big_endian_float(std::vector &data, int offset) { + uint32_t word = get_big_endian_word(data, offset); + return *((float*)&word); +} + +void write_big_endian_float(std::vector &data, int offset, float value){ + write_big_endian_word(data, offset, *((uint32_t*)&value)); +} + +std::string get_ascii(std::vector &data, int offset) { + std::stringstream ss; + + while(data[offset] != '\0'){ + ss << (char)data[offset++]; + } + + return ss.str(); +} + +void write_ascii(std::vector &data, std::string value) { + for(size_t i = 0; i < value.length(); i++) { + if(value[i] == '\\') { + char nextChar = value[i+1]; + if(nextChar == 't') { + data.push_back((uint8_t)'\t'); + } else if(nextChar == 'n') { + data.push_back((uint8_t)'\n'); + } else if(nextChar == 'r') { + data.push_back((uint8_t)'\r'); + } else if(nextChar == 'v') { + data.push_back((uint8_t)'\v'); + } else if(nextChar == '0') { + data.push_back((uint8_t)'\0'); + } + i++; + } else { + data.push_back(value[i]); + } + } + data.push_back('\0'); // Write null terminator. +} + +int insert_ascii(std::vector &data, int offset, std::string value) { + for(size_t i = 0; i < value.length(); i++) { + if(value[i] == '\\') { + char nextChar = value[i+1]; + if(nextChar == 't') { + data[offset++] = (uint8_t)'\t'; + } else if(nextChar == 'n') { + data[offset++] = (uint8_t)'\n'; + } else if(nextChar == 'r') { + data[offset++] = (uint8_t)'\r'; + } else if(nextChar == 'v') { + data[offset++] = (uint8_t)'\v'; + } else if(nextChar == '0') { + data[offset++] = (uint8_t)'\0'; + } + i++; + } else { + data[offset++] = value[i]; + } + } + data[offset++] = '\0'; // Write null terminator. + return offset; +} + +std::vector get_multiple_ascii(std::vector &data, int offset, int count) { + std::vector out(count); + for(int i = 0; i < count; i++) { + std::stringstream ss; + while(data[offset] != '\0') { + ss << (char)data[offset++]; + } + out[i] = ss.str(); + offset++; // Move past the null terminator + } + return out; +} + +std::vector decompress_dkr_gzip(std::vector &compressedData) { + // Needed padding to prevent errors with decompressing. + if(compressedData[compressedData.size() - 1] != 0) { + compressedData.push_back(0); + compressedData.push_back(0); + compressedData.push_back(0); + compressedData.push_back(0); + } + DKRCompression compression; + return compression.decompressBuffer(compressedData); +} + +std::vector compress_dkr_gzip(std::vector &uncompressedData) { + DKRCompression compression; + return compression.compressBuffer(uncompressedData); +} + +int align16(int val) { + return (val + 15) & 0xFFFFFFF0; +} + +std::string to_hex(uint32_t value) { + std::stringstream sstream; + sstream << std::hex << value; + std::string out = sstream.str(); + make_uppercase(out); + return "0x" + out; +} + +// Converts `FOO_BAR` to `FooBar`. +std::string upper_snake_case_to_pascal_case(std::string input) { + std::stringstream out; + bool isFirst = true; + for(int i = 0; i < input.length(); i++) { + if(input[i] == '_') { + isFirst = true; + } else { + if(isFirst) { + out << input[i]; + isFirst = false; + } else { + out << (char)tolower(input[i]); + } + } + } + + return out.str(); +} + +void print_data(std::vector &data, int offset, int length) { + int start = offset; + int end = start + length; + + std::cout << std::hex; + for(int i = start; i < end; i++) { + std::cout << (int)data[i] << ' '; + } + std::cout << std::dec << std::endl; +} + + diff --git a/tools/dkr_assets_tool_classes/common/util.h b/tools/dkr_assets_tool_classes/common/util.h new file mode 100644 index 00000000..f0b19de1 --- /dev/null +++ b/tools/dkr_assets_tool_classes/common/util.h @@ -0,0 +1,39 @@ +#pragma once + +#include +#include +#include +#include +#include +#include + +#include "../libs/json.hpp" +#include "../libs/n64graphics.h" +#include "../libs/DKRCompression.h" + +#include "util/fileHelper.h" +#include "util/jsonHelper.h" +#include "util/enumHelper.h" +#include "util/errorHelper.h" + +uint32_t get_big_endian_word(std::vector &data, int offset); +void write_big_endian_word(std::vector &data, int offset, uint32_t value); +uint16_t get_big_endian_halfword(std::vector &data, int offset); +void write_big_endian_halfword(std::vector &data, int offset, uint16_t value); +int16_t get_big_endian_halfword_signed(std::vector &data, int offset); +float get_big_endian_float(std::vector &data, int offset); +void write_big_endian_float(std::vector &data, int offset, float value); +std::string get_ascii(std::vector &data, int offset); +void write_ascii(std::vector &data, std::string value); +int insert_ascii(std::vector &data, int offset, std::string value); +std::vector get_multiple_ascii(std::vector &data, int offset, int count); + +std::vector decompress_dkr_gzip(std::vector &compressedData); +std::vector compress_dkr_gzip(std::vector &uncompressedData); + +int align16(int val); +std::string to_hex(uint32_t value); + +std::string upper_snake_case_to_pascal_case(std::string input); + +void print_data(std::vector &data, int offset, int length); diff --git a/tools/dkr_assets_tool_classes/common/util/enumHelper.cpp b/tools/dkr_assets_tool_classes/common/util/enumHelper.cpp new file mode 100644 index 00000000..da01620c --- /dev/null +++ b/tools/dkr_assets_tool_classes/common/util/enumHelper.cpp @@ -0,0 +1,173 @@ +#include "enumHelper.h" + +bool is_string_integer(const std::string &s){ + return std::regex_match(s, std::regex("[(-|+)]?[0-9]+")); +} + +bool hasLoadedEnums = false; +std::map enums; +std::map> enumKeys; + +int evalulate_enum(std::string &enumValue) { + int attempts = 0; + std::regex enumNameRegex("([^0-9|^&~+\\-\\/*\\s]+)"); + std::smatch sm; + + // Replaces all enum strings with their defined values. E.g. "VEHICLE_PLANE" should get replaced with "2". + while (regex_search(enumValue, sm, enumNameRegex) && attempts++ < 100) { + std::string foundEnum = sm[1]; + if(enums.find(foundEnum) == enums.end()) { + std::cout << "Error: Could not find enum value \"" << foundEnum << "\". Make sure it is defined!" << std::endl; + throw 1; + } + std::string newValue = std::to_string(enums[foundEnum]); + int pos = sm.position(1); + enumValue.replace(pos, pos + foundEnum.length(), newValue); + } + + try { + return calculator::eval(enumValue); + } catch (calculator::error& e) { + std::cerr << e.what() << std::endl; + throw 1; + } +} + +void get_enum_values(std::string enumName, std::string enumValuesText) { + std::vector names; + + std::regex enumValueRegex("\\s*([_A-Za-z][_A-Za-z0-9]*)(?:\\s*=\\s*([^,]*)[,]?.*)?"); + std::smatch sm; + std::string text = enumValuesText; + int currentValue = 0; // Enums start off at 0. + while (regex_search(text, sm, enumValueRegex)) { + std::string enumValueName = sm[1]; + std::string enumValue = sm[2]; + names.push_back(enumValueName); + if(!enumValue.empty()) { + currentValue = evalulate_enum(enumValue); + } + enums[enumValueName] = currentValue++; + + //std::cout << enumValueName << " = " << enums[enumValueName] << std::endl; + text = sm.suffix(); + } + enumKeys[enumName] = names; +} + +void write_ascii_to_cache(std::vector &cache, std::string &text) { + int textLength = text.length(); + if(textLength > 255) { // Assumption: All labels are under 256 characters. + textLength = 255; + } + cache.push_back(textLength); + for(int i = 0; i < text.length(); i++) { + cache.push_back((uint8_t)text.at(i)); + } + cache.push_back(0); // Push back null terminator +} +void write_int_to_cache(std::vector &cache, int value) { + int pos = cache.size(); + for(int i = 0; i < 4; i++) cache.push_back(0); + *((int*)(&cache[pos])) = value; +} +std::string read_ascii_from_cache(std::vector &cache, int &offset) { + int pos = offset; + int strLength = cache[pos]; + offset += cache[pos] + 2; + return std::string((char*)&cache[pos + 1]); +} +int read_int_from_cache(std::vector &cache, int &offset) { + int value = *((int*)(&cache[offset])); + offset += 4; + return value; +} + +void save_enums_cache() { + std::vector cache; + + for(auto& keyValuePair : enumKeys) { + std::string enumName = keyValuePair.first; + int numberOfValues = keyValuePair.second.size(); + //std::cout << enumName << " has " << numberOfValues << " values" << std::endl; + write_ascii_to_cache(cache, enumName); + write_int_to_cache(cache, numberOfValues); + for(std::string enumValueName : keyValuePair.second) { + write_ascii_to_cache(cache, enumValueName); + write_int_to_cache(cache, enums[enumValueName]); + } + } + + write_binary_file(cache, ENUMS_CACHE_PATH); +} + +#define READ_STRING() read_ascii_from_cache(cache, offset) +#define READ_INT() read_int_from_cache(cache, offset) + +void load_enums_cache() { + std::vector cache = read_binary_file(ENUMS_CACHE_PATH); + int offset = 0; + int len = cache.size(); + + while(offset != len) { + std::string enumName = READ_STRING(); + int numberOfValues = READ_INT(); + std::vector names; + for(int i = 0; i < numberOfValues; i++) { + std::string enumValueName = READ_STRING(); + int enumValue = READ_INT(); + names.push_back(enumValueName); + enums[enumValueName] = enumValue; + } + enumKeys[enumName] = names; + } +} + +std::mutex enumsMutex; + +void make_sure_enums_are_loaded() { + enumsMutex.lock(); + if(!hasLoadedEnums) { + std::string assetsFolderPath = get_asset_folder_path(); + ensure_that_path_exists("build/"); // Make sure build folder exists + if(path_exists(ENUMS_CACHE_PATH)) { + load_enums_cache(); + } else { + // Generate enums map + path_must_exist("include/enums.h"); + std::string enumsIncludeText = read_text_file("include/enums.h"); + std::regex enumRegex("enum ([^\\s{]+)\\s*[{]((?:.*\\n)*?)[}]"); + std::smatch sm; + std::string text = enumsIncludeText; + while (regex_search(text, sm, enumRegex)) { + std::string enumName = sm[1]; + std::string enumValuesText = sm[2]; + get_enum_values(enumName, enumValuesText); + text = sm.suffix(); + } + save_enums_cache(); + } + hasLoadedEnums = true; + } + enumsMutex.unlock(); +} + +std::string get_enum_string_from_value(std::string enumName, int value) { + make_sure_enums_are_loaded(); + for (std::string &key : enumKeys[enumName]) { + if(enums[key] == value) { + return key; + } + } + return "null"; +} + +int get_enum_value_from_string(std::string enumName, std::string value) { + make_sure_enums_are_loaded(); + return enums[value]; +} + +std::vector get_enum_keys(std::string enumName) { + make_sure_enums_are_loaded(); + return enumKeys[enumName]; +} diff --git a/tools/dkr_assets_tool_classes/common/util/enumHelper.h b/tools/dkr_assets_tool_classes/common/util/enumHelper.h new file mode 100644 index 00000000..6e31cc41 --- /dev/null +++ b/tools/dkr_assets_tool_classes/common/util/enumHelper.h @@ -0,0 +1,25 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../../libs/calculator.hpp" + +#include "fileHelper.h" + +#define ENUMS_PATH "../../../../include/enums.h" +#define ENUMS_CACHE_PATH "./build/enums_cache" + +std::string get_enum_string_from_value(std::string enumName, int value); +int get_enum_value_from_string(std::string enumName, std::string value); +std::vector get_enum_keys(std::string enumName); + + diff --git a/tools/dkr_assets_tool_classes/common/util/errorHelper.cpp b/tools/dkr_assets_tool_classes/common/util/errorHelper.cpp new file mode 100644 index 00000000..d00ba0ef --- /dev/null +++ b/tools/dkr_assets_tool_classes/common/util/errorHelper.cpp @@ -0,0 +1,3 @@ +#include "errorHelper.h" + + diff --git a/tools/dkr_assets_tool_classes/common/util/errorHelper.h b/tools/dkr_assets_tool_classes/common/util/errorHelper.h new file mode 100644 index 00000000..7c0c746d --- /dev/null +++ b/tools/dkr_assets_tool_classes/common/util/errorHelper.h @@ -0,0 +1,31 @@ +#pragma once + +#include +#include + +// Terminal colors +#define RED_TEXT "\033[1;31m" +#define GREEN_TEXT "\033[1;32m" +#define YELLOW_TEXT "\033[1;33m" +#define BLUE_TEXT "\033[1;34m" +#define MAGENTA_TEXT "\033[1;35m" +#define CYAN_TEXT "\033[1;36m" + +#define RESET_TEXT "\033[0m" + +// Requires C++17 +template +inline void display_error(Args... args) { + std::cout << RED_TEXT << "Error: "; + (std::cout << ... << args); + std::cout << RESET_TEXT << std::endl; +} + +// Requires C++17 +template +inline void display_error_and_abort(Args... args) { + display_error(args...); + std::cout << RED_TEXT << "Aborting!" << RESET_TEXT << std::endl; + throw 1; +} + diff --git a/tools/dkr_assets_tool_classes/common/util/fileHelper.cpp b/tools/dkr_assets_tool_classes/common/util/fileHelper.cpp new file mode 100644 index 00000000..15369f46 --- /dev/null +++ b/tools/dkr_assets_tool_classes/common/util/fileHelper.cpp @@ -0,0 +1,250 @@ +#include "fileHelper.h" + +std::string assetsFolderPath = ""; +std::string version = ""; + +bool is_asset_folder_path_defined() { + return assetsFolderPath != ""; +} + +void set_assets_folder_path(std::string path) { + assetsFolderPath = path; +} + +std::string get_asset_folder_path() { + return assetsFolderPath; +} + +void set_version(std::string ver) { + version = ver; +} + +std::string get_version() { + return version; +} + +std::vector read_binary_file(std::string filename) { + std::ifstream is; + is.open(filename.c_str(), std::ios::binary); + is.seekg(0, std::ios::end); + size_t filesize = is.tellg(); + is.seekg(0, std::ios::beg); + std::vector bytes(filesize); + is.read((char *)bytes.data(), filesize); + is.close(); + return bytes; +} + +void write_binary_file(std::vector &data, std::string filepath) { + std::ofstream wf(filepath.c_str(), std::ios::out | std::ios::binary); + wf.write((char *)&data[0], data.size()); + wf.close(); +} + +std::string read_text_file(std::string filename) { + std::ifstream t(filename); + t.seekg(0, std::ios::end); + size_t size = t.tellg(); + std::string buffer(size, ' '); + t.seekg(0); + t.read(&buffer[0], size); + return buffer; +} + +void write_text_file(std::string text, std::string filepath) { + std::ofstream myfile; + myfile.open(filepath); + myfile << text; + myfile.close(); +} + +bool path_exists(std::string path) { + return fs::exists(path); +} + +void path_must_exist(std::string path) { + if(!fs::exists(path)) { + display_error_and_abort("Error: Path \"", path, "\" does not exist!"); + } +} + +bool path_is_directory(std::string strPath) { + fs::path path(strPath); + std::error_code ec; + return fs::is_directory(path, ec); +} + +std::vector get_filenames_from_directory(std::string dirPath) { + std::vector out; + for (const auto &file : fs::recursive_directory_iterator(dirPath)) { + out.push_back(file.path()); + } + return out; +} + +std::vector get_filenames_from_directory_only(std::string dirPath) { + std::vector out; + for (const auto &file : fs::directory_iterator(dirPath)) { + out.push_back(file.path()); + } + return out; +} + +std::vector get_filenames_from_directory_only_with_extension(std::string dirPath, std::string extension) { + std::vector out; + for (const auto &file : fs::directory_iterator(dirPath)) { + fs::path path = file.path(); + if(ends_with(path, extension)) { + out.push_back(path); + } + } + return out; +} + + +std::vector get_folders_from_directory_only(std::string dirPath) { + std::vector out; + for (const auto &file : fs::directory_iterator(dirPath)) { + if(file.is_directory()) { + out.push_back(file.path()); + } + } + return out; +} + +std::vector get_filenames_from_directory_with_extension(std::string dirPath, std::string extension) { + std::vector out; + for (const auto &file : fs::recursive_directory_iterator(dirPath)) { + std::string path = file.path(); + if(ends_with(path, extension)) { + out.push_back(path); + } + } + return out; +} + +std::vector get_filenames_from_directory_without_extension(std::string dirPath, std::string extension) { + std::vector out; + for (const auto &file : fs::recursive_directory_iterator(dirPath)) { + std::string path = file.path(); + if(!ends_with(path, extension)) { + out.push_back(path); + } + } + return out; +} + +void create_directory(std::string directory) { + if(!fs::is_directory(directory)) { + fs::create_directories(directory); + } +} + +std::string get_filename_from_full_path(std::string path, bool excludeExtension) { + size_t lastSlash = path.rfind("/"); + if (lastSlash != std::string::npos) { + path = path.substr(lastSlash + 1); + } + if(excludeExtension) { + size_t dot = path.find("."); + if (dot != std::string::npos) { + path = path.substr(0, dot); + } + } + return path; +} + +std::string get_directory_from_full_path(std::string path) { + return path.substr(0, path.rfind("/")); +} + +void ensure_that_path_exists(std::string path) { + if(path_exists(path)) { + return; + } + create_directory(get_directory_from_full_path(path)); +} + + +void copy_file(std::string srcPath, std::string dstPath) { + fs::copy(srcPath, dstPath, fs::copy_options::overwrite_existing); +} + +void recursively_copy_directory(std::string srcPath, std::string dstPath) { + fs::copy(srcPath, dstPath, fs::copy_options::recursive | fs::copy_options::overwrite_existing); +} + +void delete_directory(std::string dirPath) { + if(path_exists(dirPath)) { + fs::remove_all(dirPath); + } +} + +void delete_path(std::string path) { + if(path_exists(path)) { + if(path_is_directory(path)) { + fs::remove_all(path); + } else { + fs::remove(path); + } + } +} + +std::string replace_extension(std::string path, std::string newExtension) { + return path.substr(0, path.rfind(".")) + newExtension; +} + +bool starts_with(const std::string &a, const std::string &b) { + return a.rfind(b, 0) == 0; +} + +bool ends_with(const std::string &a, const std::string &b) { + if (b.size() > a.size()) return false; + return std::equal(a.begin() + a.size() - b.size(), a.end(), b.begin()); +} + +void make_lowercase(std::string& input) { + for(char& character : input) { + character = std::tolower(character); + } +} + +void make_uppercase(std::string& input) { + for(char& character : input) { + character = std::toupper(character); + } +} + +std::string calculate_md5(std::vector &bytes) { + uint8_t buffer[0x4000]; + uint8_t digest[MD5_DIGEST_LENGTH]; + + std::stringstream ss; + + MD5_CTX md5Context; + + MD5_Init(&md5Context); + MD5_Update(&md5Context, &bytes[0], bytes.size()); + int res = MD5_Final(digest, &md5Context); + + if(res == 0) { + return ""; + } + + // set up stringstream format + ss << std::hex << std::setfill('0'); + + + for(uint8_t uc: digest) { + ss << std::setw(2) << (int)uc; + } + + return ss.str(); +} + +std::string calculate_file_md5(std::string filepath) { + std::vector bytes = read_binary_file(filepath); + return calculate_md5(bytes); +} + + diff --git a/tools/dkr_assets_tool_classes/common/util/fileHelper.h b/tools/dkr_assets_tool_classes/common/util/fileHelper.h new file mode 100644 index 00000000..4cde0f43 --- /dev/null +++ b/tools/dkr_assets_tool_classes/common/util/fileHelper.h @@ -0,0 +1,54 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// C++17 +#include +namespace fs = std::filesystem; + +#include "errorHelper.h" + +bool is_asset_folder_path_defined(); +void set_assets_folder_path(std::string path); +std::string get_asset_folder_path(); +void set_version(std::string ver); +std::string get_version(); + +std::vector read_binary_file(std::string filename); +void write_binary_file(std::vector &data, std::string filepath); +std::string read_text_file(std::string filename); +void write_text_file(std::string text, std::string filepath); +bool path_exists(std::string path); +void path_must_exist(std::string path); +bool path_is_directory(std::string strPath); +std::vector get_filenames_from_directory(std::string dirPath); +std::vector get_filenames_from_directory_only(std::string dirPath); +std::vector get_filenames_from_directory_only_with_extension(std::string dirPath, std::string extension); +std::vector get_folders_from_directory_only(std::string dirPath); +std::vector get_filenames_from_directory_with_extension(std::string dirPath, std::string extension); +std::vector get_filenames_from_directory_without_extension(std::string dirPath, std::string extension); +void create_directory(std::string directory); +std::string get_filename_from_full_path(std::string path, bool excludeExtension); +std::string get_directory_from_full_path(std::string path); +void ensure_that_path_exists(std::string path); +void copy_file(std::string srcPath, std::string dstPath); +void recursively_copy_directory(std::string srcPath, std::string dstPath); +void delete_directory(std::string dirPath); +void delete_path(std::string dirPath); +std::string replace_extension(std::string path, std::string newExtension); +bool starts_with(const std::string &a, const std::string &b); +bool ends_with(const std::string &a, const std::string &b); +void make_lowercase(std::string &input); +void make_uppercase(std::string &input); + +std::string calculate_md5(std::vector &bytes); +std::string calculate_file_md5(std::string filepath); + diff --git a/tools/dkr_assets_tool_classes/common/util/jsonHelper.cpp b/tools/dkr_assets_tool_classes/common/util/jsonHelper.cpp new file mode 100644 index 00000000..030bd011 --- /dev/null +++ b/tools/dkr_assets_tool_classes/common/util/jsonHelper.cpp @@ -0,0 +1,201 @@ +#include "jsonHelper.h" + +bool hasLoadedAssetsJson = false; +json::JSON assetsJson; + +std::string lastSectionName = ""; +json::JSON *lastSection; +std::unordered_map sectionCache; + +std::string lastJsonFileName = ""; +json::JSON *lastJsonFile; +std::unordered_map jsonFileCache; + +#define ASSETS_FILENAME "assets.json" + +json::JSON load_assets_json(std::string assetsFolder, std::string jsonName) { + std::string jsonFilepath = assetsFolder + "/" + jsonName; + path_must_exist(jsonFilepath); + return json::JSON::Load(read_text_file(jsonFilepath)); +} + +void write_json(json::JSON &jsonData, std::string filename) { + std::ofstream myfile; + myfile.open(filename); + myfile << jsonData; + myfile.close(); +} + +std::mutex assetsJsonMutex; + +void make_sure_assets_json_is_loaded() { + assetsJsonMutex.lock(); + if(!hasLoadedAssetsJson) { + if(!is_asset_folder_path_defined()) { + display_error_and_abort("assetsFolderPath not defined! Make sure set_assets_folder_path() is called somewhere!"); + } + std::string assetsJsonPath = get_asset_folder_path() + "/" + get_version() + "/" + ASSETS_FILENAME; + path_must_exist(assetsJsonPath); + std::string assetsJsonText = read_text_file(assetsJsonPath); + assetsJson = json::JSON::Load(assetsJsonText); + hasLoadedAssetsJson = true; + } + assetsJsonMutex.unlock(); +} + + +std::mutex sectionJsonMutex; + +json::JSON *get_section_json(std::string sectionName) { + make_sure_assets_json_is_loaded(); + sectionJsonMutex.lock(); + std::string assetsFolderPath = get_asset_folder_path() + "/" + get_version(); + if(sectionName == lastSectionName) { + sectionJsonMutex.unlock(); + return lastSection; + } else if(sectionCache.find(sectionName) == sectionCache.end()) { + // section not found in cache, so it needs to be loaded/defined! + json::JSON assetSection = assetsJson["assets"]["sections"][sectionName]; + if(assetSection.JSONType() == json::JSON::Class::String) { + std::string sectionJsonLocalPath = assetsJson["assets"]["sections"][sectionName].ToString(); + make_lowercase(sectionJsonLocalPath); + std::string jsonPath = assetsFolderPath + "/" + sectionJsonLocalPath; + path_must_exist(jsonPath); + sectionCache[sectionName] = json::JSON::Load(read_text_file(jsonPath)); + } else { + sectionCache[sectionName] = assetSection; + } + } + lastSectionName = sectionName; + lastSection = §ionCache[sectionName]; + sectionJsonMutex.unlock(); + return lastSection; +} + +std::string get_build_id_from_section(std::string sectionName, int index) { + json::JSON *sectionJson = get_section_json(sectionName); + if(sectionJson->IsNull()) { + return "null"; + } + return (*sectionJson)["files"]["order"][index].ToString(); +} + +int get_index_of_string_from_json_array(json::JSON &jsonArray, std::string value) { + for(int i = 0; i < jsonArray.length(); i++) { + if(jsonArray[i].ToString() == value) { + return i; + } + } + return -1; +} + +int get_index_from_build_id(std::string sectionName, std::string buildId) { + json::JSON *sectionJson = get_section_json(sectionName); + return get_index_of_string_from_json_array((*sectionJson)["files"]["order"], buildId); +} + +int get_tex_2d_index_from_build_id(std::string texBuildId) { + return get_index_from_build_id("ASSET_TEXTURES_2D", texBuildId); +} + +std::vector get_order(json::JSON orderJson) { + std::vector out; + for(auto &entry : orderJson.ArrayRange()) { + out.push_back(entry.ToString()); + } + return out; +} + +std::vector get_section_order(std::string sectionName) { + json::JSON *sectionJson = get_section_json(sectionName); + return get_order((*sectionJson)["files"]["order"]); +} +std::vector get_assets_order() { + make_sure_assets_json_is_loaded(); + return get_order(assetsJson["assets"]["order"]); +} + +std::string get_filename_from_section_entry(std::string sectionName, std::string entryName) { + json::JSON *sectionJson = get_section_json(sectionName); + return (*sectionJson)["files"]["sections"][entryName]["filename"].ToString(); +} + + +int get_asset_count() { + make_sure_assets_json_is_loaded(); + return assetsJson["assets"]["order"].length(); +} + +#define JSON_IS_TYPE(jsonObj, type) jsonObj.JSONType() == json::JSON::Class::type +#define JSON_IS_OBJECT(jsonObj) JSON_IS_TYPE(jsonObj, Object) +#define JSON_IS_ARRAY(jsonObj) JSON_IS_TYPE(jsonObj, Array) +#define JSON_IS_STRING(jsonObj) JSON_IS_TYPE(jsonObj, String) + +bool does_json_array_contain_string(json::JSON &arrayJson, std::string value) { + for(json::JSON &childJson : arrayJson.ArrayRange()) { + if(JSON_IS_STRING(childJson)) { + if(childJson.ToString() == value) return true; + } + } + return false; +} + +void recursively_combine_json(json::JSON &mainJson, json::JSON &addJson) { + if(JSON_IS_OBJECT(mainJson) && JSON_IS_OBJECT(addJson)) { + for(auto &keyValuePair : addJson.ObjectRange()) { + std::string key = keyValuePair.first; + json::JSON newJson = keyValuePair.second; + if(!mainJson.hasKey(key)) { + mainJson[key] = newJson; + continue; + } + if(JSON_IS_OBJECT(newJson)) { + recursively_combine_json(mainJson[key], newJson); + continue; + } + if(JSON_IS_ARRAY(newJson)) { + for(json::JSON &orderEntry : newJson.ArrayRange()) { + // "order" is a special case, where the array should be a set. + if(key == "order" && does_json_array_contain_string(mainJson[key], orderEntry.ToString())) { + // Order already has the value in its array, so just ignore it. + continue; + } + mainJson[key].append(orderEntry.ToString()); + } + continue; + } + // Not an object or array, so just overwrite the value. + mainJson[key] = newJson; + } + } +} + +void combine_json_files(std::string src1Path, std::string src2Path, std::string outputPath) { + path_must_exist(src1Path); + path_must_exist(src2Path); + json::JSON mainJson = json::JSON::Load(read_text_file(src1Path)); + json::JSON addJson = json::JSON::Load(read_text_file(src2Path)); + recursively_combine_json(mainJson, addJson); + write_json(mainJson, outputPath); +} + +json::JSON *load_json_file(std::string filename) { + if(filename == lastJsonFileName) { + return lastJsonFile; + } else if(jsonFileCache.find(filename) == jsonFileCache.end()) { + // file not found in cache, so it needs to be loaded! + path_must_exist(filename); + jsonFileCache[filename] = json::JSON::Load(read_text_file(filename)); + } + lastJsonFileName = filename; + lastJsonFile = &jsonFileCache[filename]; + return lastJsonFile; +} + +std::string get_source_section_for_table(std::string tableSectionName) { + json::JSON *tableSection = get_section_json(tableSectionName); + return (*tableSection)["for"].ToString(); +} + + + diff --git a/tools/dkr_assets_tool_classes/common/util/jsonHelper.h b/tools/dkr_assets_tool_classes/common/util/jsonHelper.h new file mode 100644 index 00000000..1ca9b3b2 --- /dev/null +++ b/tools/dkr_assets_tool_classes/common/util/jsonHelper.h @@ -0,0 +1,152 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../../libs/json.hpp" + +#include "fileHelper.h" +#include "errorHelper.h" + +void write_json(json::JSON &assetsJSON, std::string filename); +json::JSON load_assets_json(std::string assetsFolder, std::string jsonName); +std::string get_build_id_from_section(std::string sectionName, int index); +int get_index_of_string_from_json_array(json::JSON &jsonArray, std::string value); +int get_index_from_build_id(std::string sectionName, std::string buildId); +int get_tex_2d_index_from_build_id(std::string texBuildId); +std::vector get_section_order(std::string sectionName); +std::vector get_assets_order(); +std::string get_filename_from_section_entry(std::string sectionName, std::string entryName); +std::string get_source_section_for_table(std::string tableSectionName); +int get_asset_count(); +void combine_json_files(std::string src1Path, std::string src2Path, std::string outputPath); + +// The variadic templates require C++17. They also need to be defined in the header, not in the cpp file. + +// Do not use these outside of this file! They are exposed in the header only for the variadic template functions. +std::vector get_order(json::JSON orderJson); +json::JSON *get_section_json(std::string sectionName); +json::JSON *load_json_file(std::string filename); + +template +inline json::JSON json_get(json::JSON &json, FirstKey const& key, RestKeys const&... rest_keys) { + if constexpr(sizeof...(RestKeys) == 0) { + return json[key]; + } else { + return json_get(json[key], rest_keys...); + } +} + +template +inline bool _json_has_key(json::JSON &json, FirstKey const& key, RestKeys const&... rest_keys) { + if constexpr(sizeof...(RestKeys) == 0) + return json.hasKey(key); + else + return _json_has_key(json[key], rest_keys...); +} + +template +inline int get_int_from_json(std::string filename, FirstKey const& key, RestKeys const&... rest_keys) { + json::JSON *json = load_json_file(filename); + return json_get(*json, key, rest_keys...).ToInt(); +} + +template +inline bool get_bool_from_json(std::string filename, FirstKey const& key, RestKeys const&... rest_keys) { + json::JSON *json = load_json_file(filename); + return json_get(*json, key, rest_keys...).ToBool(); +} + +template +inline float get_float_from_json(std::string filename, FirstKey const& key, RestKeys const&... rest_keys) { + json::JSON *json = load_json_file(filename); + return json_get(*json, key, rest_keys...).ToFloat(); +} + +template +inline std::string get_string_from_json(std::string filename, FirstKey const& key, RestKeys const&... rest_keys) { + json::JSON *json = load_json_file(filename); + return json_get(*json, key, rest_keys...).ToString(); +} + +template +inline std::vector get_array_from_json(std::string filename, FirstKey const& key, RestKeys const&... rest_keys) { + json::JSON *json = load_json_file(filename); + json::JSON arrayJson = json_get(*json, key, rest_keys...); + return get_order(arrayJson); +} + +inline std::vector get_array_from_json(std::string filename) { + return get_order(*load_json_file(filename)); +} + +template +inline int get_array_length_from_json(std::string filename, FirstKey const& key, RestKeys const&... rest_keys) { + json::JSON *json = load_json_file(filename); + return json_get(*json, key, rest_keys...).length(); +} + +template +inline bool json_has_key(std::string filename, FirstKey const& key, RestKeys const&... rest_keys) { + json::JSON *json = load_json_file(filename); + if constexpr(sizeof...(RestKeys) == 0) { + return json->hasKey(key); + } else { + return _json_has_key(*json, key, rest_keys...); + } +} + +template +inline int get_int_from_section(std::string sectionName, FirstKey const& key, RestKeys const&... rest_keys) { + json::JSON *json = get_section_json(sectionName); + return json_get(*json, key, rest_keys...).ToInt(); +} + +template +inline std::string get_string_from_section(std::string sectionName, FirstKey const& key, RestKeys const&... rest_keys) { + json::JSON *json = get_section_json(sectionName); + return json_get(*json, key, rest_keys...).ToString(); +} + +template +inline std::vector get_array_from_section(std::string sectionName, FirstKey const& key, RestKeys const&... rest_keys) { + json::JSON *json = get_section_json(sectionName); + json::JSON arrayJson = json_get(*json, key, rest_keys...); + return get_order(arrayJson); +} + +template +inline int get_array_length_from_section(std::string sectionName, FirstKey const& key, RestKeys const&... rest_keys) { + json::JSON *json = get_section_json(sectionName); + return json_get(*json, key, rest_keys...).length(); +} + +template +inline int get_index_of_string_array_value_from_section(std::string sectionName, std::string value, FirstKey const& key, RestKeys const&... rest_keys) { + json::JSON *json = get_section_json(sectionName); + + std::vector arr = get_array_from_section(sectionName, key, rest_keys...); + for(int i = 0; i < arr.size(); i++) { + if(arr[i] == value) { + return i; + } + } + return -1; // Value not found in array. +} + +template +inline bool section_has_key(std::string sectionName, FirstKey const& key, RestKeys const&... rest_keys) { + json::JSON *json = get_section_json(sectionName); + if constexpr(sizeof...(RestKeys) == 0) + return json->hasKey(key); + else + return _json_has_key(*json, key, rest_keys...); +} + + diff --git a/tools/dkr_assets_tool_classes/compiler/compiler.cpp b/tools/dkr_assets_tool_classes/compiler/compiler.cpp new file mode 100644 index 00000000..8c1a45f5 --- /dev/null +++ b/tools/dkr_assets_tool_classes/compiler/compiler.cpp @@ -0,0 +1,253 @@ +#include "compiler.h" + +// Needs to be defined here. +#include "../libs/zip_file.hpp" + + +const std::string JSON_WRITE_MODE_REPLACE = "replace"; +const std::string JSON_WRITE_MODE_MERGE = "merge"; +const std::string DEFAULT_JSON_WRITE_MODE = JSON_WRITE_MODE_REPLACE; + +const std::string BASE_DIR_NAME = "vanilla"; +const std::string EXT_DIR_NAME = "packages"; + +void print_text(std::string text) { + std::cout << text << std::endl; +} + +void print_coloured_text(std::string color, std::string text) { + std::cout << color << text << RESET_TEXT << std::endl; +} + +AssetCompiler::AssetCompiler() { + print_text("Compiling assets..."); + + std::string assetsDirectory = get_asset_folder_path(); + std::string version = get_version(); + + std::string vanillaDirPath = assetsDirectory + "/" + BASE_DIR_NAME; + std::string outDirPath = assetsDirectory + "/" + version; + std::string packagesDirPath = assetsDirectory + "/" + EXT_DIR_NAME + "/" + version; + std::string tempDirPath = assetsDirectory + "/_temp"; + + try { + // 1.) Create temporary directory for working files. + create_directory(tempDirPath); + + // 2.) Create "compiled" directory for output files + std::string compiledDir = tempDirPath + "/__compiled__"; + + // Copy vanilla folder to the compiled directory as the baseline. + print_text("Copying vanilla files..."); + recursively_copy_directory(vanillaDirPath + "/" + version, compiledDir); + + print_text("Reading package order..."); + std::string packageOrderFilepath = packagesDirPath + "/order.json"; + + bool isVanilla = true; + + if(path_exists(packageOrderFilepath)) { + std::vector packageOrder = get_array_from_json(packageOrderFilepath); + for(std::string &packageName : packageOrder) { + print_text("Applying package \"" + packageName + "\"..."); + if(packageName.length() == 0) { + display_error_and_abort("The package \"\" does not exist!"); + } + apply_package(packagesDirPath, packageName, tempDirPath, compiledDir); + isVanilla = false; + } + } + + if(isVanilla) { + print_coloured_text(CYAN_TEXT, "Assets are vanilla."); + } else { + print_coloured_text(CYAN_TEXT, "Assets are modified."); + } + + print_text("Merging modified files..."); + merge_output(compiledDir, outDirPath); + + // Remove the temp directory + print_text("Cleaning up..."); + delete_directory(tempDirPath); + } catch (int e) { + delete_directory(tempDirPath); + throw e; + } + + print_text("Done!"); +} + +AssetCompiler::~AssetCompiler() { + +} + +void ensure_meta_json_has_key(std::string &packageName, std::string &metaJsonFilepath, std::string key) { + if(!json_has_key(metaJsonFilepath, key)) { + display_error_and_abort("\"", key, "\" not defined in ", packageName, "'s meta.json file!"); + } +} + +void AssetCompiler::check_meta_json(std::string &packageName, std::string metaJsonFilepath) { + if(!path_exists(metaJsonFilepath)) { + display_error_and_abort("The package \"", packageName, "\" is missing a meta.json file!"); + } + + ensure_meta_json_has_key(packageName, metaJsonFilepath, "name"); + ensure_meta_json_has_key(packageName, metaJsonFilepath, "pkg-version"); + ensure_meta_json_has_key(packageName, metaJsonFilepath, "authors"); + ensure_meta_json_has_key(packageName, metaJsonFilepath, "revision"); + ensure_meta_json_has_key(packageName, metaJsonFilepath, "revision-minor"); + + int revision = get_int_from_json(metaJsonFilepath, "revision"); + int revisionMinor = get_int_from_json(metaJsonFilepath, "revision-minor"); + + if(revision != REVISION_NUMBER || revisionMinor != REVISION_MINOR_NUMBER) { + display_error_and_abort("The package \"", packageName, "\" is not supported. It's revision number is ", revision, ".", revisionMinor, ", when it should be ", REVISION_NUMBER, ".", REVISION_MINOR_NUMBER, "!"); + } +} + +void AssetCompiler::apply_package(std::string &packagesDirPath, std::string &packageName, std::string &tempDirPath, std::string &outDirPath) { + std::string packageDir = packagesDirPath + "/" + packageName; + + bool isZip = false; + + if(ends_with(packageName, ".zip")) { + packageName = packageName.substr(0, packageName.length() - 4); + isZip = true; + } else if(!path_exists(packageDir) && path_exists(packageDir + ".zip")) { + packageDir += ".zip"; + isZip = true; + } else if(!path_exists(packageDir)) { + display_error_and_abort("The package \"", packageName, "\" does not exist!"); + } + + if(isZip) { + miniz_cpp::zip_file file(packageDir); + packageDir = tempDirPath + "/" + packageName; + // Make sure a subdirectory with the name of the package exists in the temp directory. + if(file.has_file("meta.json")) { + create_directory(packageDir); + file.extractall(packageDir); + } else { + file.extractall(tempDirPath); + } + } + + check_meta_json(packageName, packageDir + "/meta.json"); + + std::vector jsonFiles = get_filenames_from_directory_with_extension(packageDir, ".json"); + std::vector otherFiles = get_filenames_from_directory_without_extension(packageDir, ".json"); + for(int i = 0; i < jsonFiles.size(); i++) { + std::string localPath = jsonFiles[i].substr(packageDir.length() + 1); + + if(localPath == "meta.json") { + continue; // Skip meta.json file. + } + + std::string outPath = outDirPath + "/" + localPath; + + std::string write_mode = get_string_from_json(jsonFiles[i], "pkg-write"); + make_lowercase(write_mode); + if(write_mode == "") { + write_mode = DEFAULT_JSON_WRITE_MODE; + } + + if(write_mode == JSON_WRITE_MODE_REPLACE) { + copy_file(jsonFiles[i], outPath); + } else if(write_mode == JSON_WRITE_MODE_MERGE) { + combine_json_files(outPath, jsonFiles[i], outPath); + } else { + display_error_and_abort("Unknown json write mode: \"", write_mode, "\""); + } + } + + for(int i = 0; i < otherFiles.size(); i++) { + if(path_is_directory(otherFiles[i])) { + std::string localPath = otherFiles[i].substr(packageDir.length() + 1); + if(localPath == "meta") { + continue; // Skip meta folder if it exists. + } + std::string outPath = outDirPath + "/" + localPath; + create_directory(outPath); + } else { + std::string localPath = otherFiles[i].substr(packageDir.length() + 1); + if(starts_with(localPath, "meta/")) { + continue; // Skip files within the meta folder. + } + std::string outPath = outDirPath + "/" + localPath; + copy_file(otherFiles[i], outPath); + } + } +} + +void AssetCompiler::merge_output(std::string &tempDir, std::string &outDir) { + std::vector tempFiles = get_filenames_from_directory(tempDir); + std::vector curFiles = get_filenames_from_directory(outDir); + std::vector sameFiles, filesToAdd, filesToRemove; + + for(int i = 0; i < tempFiles.size(); i++) { + std::string tempFilepath = tempFiles[i]; + std::string localPath = tempFilepath.substr(tempDir.length() + 1); + if(path_exists(outDir + "/" + localPath)) { + sameFiles.push_back(localPath); + } else { + filesToAdd.push_back(tempFilepath); + } + } + + for(int i = 0; i < curFiles.size(); i++) { + std::string curOutFilepath = curFiles[i]; + std::string localPath = curOutFilepath.substr(outDir.length() + 1); + if(!path_exists(tempDir + "/" + localPath)) { + filesToRemove.push_back(curOutFilepath); + } + } + + for(std::string &pathToRemove : filesToRemove) { + delete_path(pathToRemove); + } + + for(std::string &pathToAdd : filesToAdd) { + std::string localPath = pathToAdd.substr(tempDir.length() + 1); + std::string outAddPath = outDir + "/" + localPath; + if(path_is_directory(pathToAdd)) { + create_directory(outAddPath); + } else { + copy_file(pathToAdd, outAddPath); + } + } + + for(std::string &sameFileLocalPath : sameFiles) { + std::string tempFilePath = tempDir + "/" + sameFileLocalPath; + std::string curFilePath = outDir + "/" + sameFileLocalPath; + if(!path_is_directory(tempFilePath)) { + bool doHashCheck = true; + if(ends_with(tempFilePath, ".json")) { + std::string pkgRebuild = "onchange"; + if(json_has_key(tempFilePath, "pkg-rebuild")) { + pkgRebuild = get_string_from_json(tempFilePath, "pkg-rebuild"); + make_lowercase(pkgRebuild); + } + if(pkgRebuild == "always") { + doHashCheck = false; + } else if(pkgRebuild == "onchange") { + doHashCheck = true; + } else { + display_error_and_abort("Unknown pkg-rebuild value \"", pkgRebuild, "\"."); + } + } + if(doHashCheck) { + std::string tempFileHash = calculate_file_md5(tempFilePath); + std::string curFileHash = calculate_file_md5(curFilePath); + if(tempFileHash != curFileHash) { + copy_file(tempFilePath, curFilePath); + } + } else { + copy_file(tempFilePath, curFilePath); + } + } + } +} + + diff --git a/tools/dkr_assets_tool_classes/compiler/compiler.h b/tools/dkr_assets_tool_classes/compiler/compiler.h new file mode 100644 index 00000000..f50005e7 --- /dev/null +++ b/tools/dkr_assets_tool_classes/compiler/compiler.h @@ -0,0 +1,21 @@ +#pragma once + +#include +#include +#include +#include +#include + +#include "../common/util.h" +#include "../common/types.h" +#include "../common/revision_number.h" + +class AssetCompiler { +public: + AssetCompiler(); + ~AssetCompiler(); +private: + void apply_package(std::string &packagesDirPath, std::string &packageName, std::string &tempDirPath, std::string &outDirPath); + void check_meta_json(std::string &packageName, std::string metaJsonFilepath); + void merge_output(std::string &tempDir, std::string &outDir); +}; diff --git a/tools/dkr_assets_tool_classes/extractor/config.cpp b/tools/dkr_assets_tool_classes/extractor/config.cpp new file mode 100644 index 00000000..5970230c --- /dev/null +++ b/tools/dkr_assets_tool_classes/extractor/config.cpp @@ -0,0 +1,396 @@ +#include "config.h" + +const std::string BASE_DIR_NAME = "vanilla"; +const std::string EXT_DIR_NAME = "packages"; + +#define VANILLA_WARNING_FILENAME "PLEASE_DONT_MODIFY_ANYTHING.txt" + +ExtractConfig::ExtractConfig(std::string configFilepath, std::string outDirectory) { + std::cout << "Reading config \"" << configFilepath << "\"" << std::endl; + configJSON = json::JSON::Load(read_text_file(configFilepath)); + + this->outBaseDirectory = outDirectory + "/assets/" + BASE_DIR_NAME + "/" + configJSON["subfolder"].ToString(); + this->outDirectory = outDirectory + "/assets/" + configJSON["subfolder"].ToString(); + this->name = configJSON["config-name"].ToString(); + this->subfolder = configJSON["subfolder"].ToString(); + this->md5 = configJSON["checksum-md5"].ToString(); + this->notSupported = configJSON["not-supported"].ToString() == "true"; + + assetsJson["@version"] = this->subfolder; + assetsJson["@revision"] = REVISION_NUMBER; + assetsJson["@revision-minor"] = REVISION_MINOR_NUMBER; + + // Create package extensions folder if it doesn't exist. + if(this->subfolder == "us_1.0"){ + std::string packagesDir = outDirectory + "/assets/" + EXT_DIR_NAME + "/" + configJSON["subfolder"].ToString(); + create_directory(packagesDir); + json::JSON orderJson = json::Array(); + write_json(orderJson, packagesDir + "/order.json"); + } +} + +ExtractConfig::~ExtractConfig() { +} + +void ExtractConfig::find_rom_for_this_config_and_extract(std::vector &roms) { + if(this->subfolder != "us_1.0"){ + std::cout << "Sorry, extracting only works for us_1.0 at the moment." << std::endl; + return; + } + for (ROM* rom : roms) { + if(rom->get_md5() == this->md5) { + this->rom = rom; + std::cout << "Extracting using config: \"" << this->name << "\"" << std::endl; + extract(); + return; + } + } + std::cout << "No valid ROMs were found for the config \"" << this->name << "\"" << std::endl; +} + +bool ExtractConfig::is_correct_version(std::string version) { + return this->subfolder == version; +} + +void ExtractConfig::extract_code_sections(int &romOffset) { + json::JSON codeSections = configJSON["code"]["sections"]; + int numCodeSections = codeSections.length(); + for(int i = 0; i < numCodeSections; i++) { + json::JSON section = codeSections[i]; + std::string type = section["type"].ToString(); + + json::JSON files = section["files"]; + std::string folder = this->outBaseDirectory + "/" + section["folder"].ToString(); + + if(type != "NoExtract") { + create_directory(folder); + } + + std::string key = "CODE_" + std::to_string(i); + + int numFiles = files.length(); + for(int j = 0; j < numFiles; j++) { + json::JSON file = files[j]; + int length = std::stoul(file["length"].ToString(), nullptr, 16); + extractions.push_back(ExtractInfo(key, type, folder, file["filename"].ToString(), + rom->get_bytes_from_range(romOffset, length))); + romOffset += length; + } + + } +} + +std::string get_extension_from_type(std::string type) { + if(is_json_type(type)) { + return ".json"; + } else if(is_compressed_type(type)) { + return ".cbin"; + } else { + return ".bin"; + } +} + +std::vector> get_section_files(std::vector& section, std::vector& table, std::string tableType, json::JSON& outputAsset) { + std::vector> out; + + int currentTableIndex = 0; + int scale = 1; // Each table entry is 4-bytes long. + int offset = 0; + + if(tableType == "MenuText") { + outputAsset["_text-entry-count"] = std::to_string(get_big_endian_word(table, currentTableIndex*4)); + currentTableIndex = 1; // The first entry is the number of text entries for each language. + } else if(tableType == "TTGhosts") { + scale = 2; // Each table entry is 8-bytes long. + offset = 1; // offset by 4 bytes. + //outputAsset["meta"] = json::Array(); + } else if (tableType == "GameText") { + // Temporary + outputAsset["_textTypes"] = json::Array(); + } + + uint32_t currentTableValue = get_big_endian_word(table, (currentTableIndex * scale + offset)*4); + uint32_t nextTableValue = get_big_endian_word(table, ((currentTableIndex + 1) * scale + offset)*4); + + if (tableType == "Audio") { + // The audio table doesn't start at offset 0, so this check will extract + // the first actual part of the audio section. + std::vector file(section.begin(), section.begin() + currentTableValue); + out.push_back(file); + } + + while(nextTableValue != 0xFFFFFFFF) { + + if(tableType == "GameText") { + bool isDialog = (currentTableValue & 0x80000000) == 0x80000000; + outputAsset["_textTypes"].append(isDialog ? 1 : 0); + currentTableValue &= 0x7FFFFFFF; + nextTableValue &= 0x7FFFFFFF; + } else if(tableType == "Miscellaneous") { + currentTableValue *= 4; + nextTableValue *= 4; + } + + int length = nextTableValue - currentTableValue; + if(length < 0) { + display_error_and_abort("Invalid table length: ", length, "\ncurrentTableValue: ", currentTableValue, "\nnextTableValue: ", nextTableValue); + } + + std::vector file(section.begin() + currentTableValue, section.begin() + nextTableValue); + out.push_back(file); + + currentTableIndex++; + currentTableValue = get_big_endian_word(table, (currentTableIndex * scale + offset)*4); + nextTableValue = get_big_endian_word(table, ((currentTableIndex + 1) * scale + offset)*4); + } + + return out; +} + +void ExtractConfig::extract_asset_sections(int &romOffset) { + /* Make sure the assets section has the correct number of entries. */ + json::JSON assetSections = configJSON["assets"]["sections"]; + int numAssetSections = assetSections.length(); + int numAssetSectionsFromTable = rom->get_uint(romOffset); + + if(numAssetSections != numAssetSectionsFromTable) { + display_error_and_abort("Number of asset sections in config does not match ROM.\nNumber of asset sections in Config: ", + numAssetSections, "\nNumber of asset sections in ROM: ", numAssetSectionsFromTable); + } + + romOffset += 4; + int tableOffset = romOffset; + romOffset += (numAssetSections + 1) * 4; + int assetsStart = romOffset; + + std::vector> sectionsData; + + /* Read the main assets look-up table for section lengths */ + for(int i = 0; i < numAssetSections; i++) { + int assetSectionLength = rom->get_uint(tableOffset + ((i + 1) * 4)) - rom->get_uint(tableOffset + (i * 4)); + sectionsData.push_back(rom->get_bytes_from_range(romOffset, assetSectionLength)); + romOffset += assetSectionLength; + } + + romOffset = assetsStart; + + assetsJson["assets"] = json::Object(); + assetsJson["assets"]["order"] = json::Array(); + assetsJson["assets"]["sections"] = json::Object(); + + /* Extract the assets sections */ + + // First loop to get the order array in place. + for(int i = 0; i < numAssetSections; i++) { + json::JSON section = assetSections[i]; + std::string build_id = section["build-id"].ToString(); + assetsJson["assets"]["order"].append(build_id); + } + // Second loop for everything else + for(int i = 0; i < numAssetSections; i++) { + json::JSON section = assetSections[i]; + std::string folder = this->outBaseDirectory + "/" + section["folder"].ToString(); + std::string type = section["type"].ToString(); + std::string build_id = section["build-id"].ToString(); + + if(type != "NoExtract") { + create_directory(folder); + } + + json::JSON sectionOut = json::Object(); + + sectionOut["type"] = type; + + if(section.hasKey("folder") && !section["folder"].IsNull()) { + sectionOut["folder"] = section["folder"]; + } + + if(section.hasKey("table")) { + int tableIndex = section["table"].ToInt(); + sectionOut["table"] = assetsJson["assets"]["order"][tableIndex]; + + std::vector> sectionFiles + = get_section_files(sectionsData[i], sectionsData[tableIndex], type, sectionOut); + int numberOfSectionFiles = sectionFiles.size(); + + if(numberOfSectionFiles > 0) { + sectionOut["files"] = json::Object(); + sectionOut["files"]["order"] = json::Array(); + sectionOut["files"]["sections"] = json::Object(); + } + + for(int j = 0; j < numberOfSectionFiles; j++) { + std::unordered_map *tags = nullptr; + std::string filename = ""; + std::string key = ""; + if(section.hasKey("filenames")) { + filename = section["filenames"][j].ToString(); + } + if(section.hasKey("child-build-ids")) { + key = section["child-build-ids"][j].ToString(); + } + if(filename == "") { + std::stringstream filenameStream; + filenameStream << "unknown_" << i << "_" << j; + filename = filenameStream.str(); + } + if(key == "") { + std::stringstream keyStream; + keyStream << build_id << "_" << j; + key = keyStream.str(); + } + make_uppercase(key); + sectionOut["files"]["order"].append(key); + sectionOut["files"]["sections"][key] = json::Object(); + sectionOut["files"]["sections"][key]["filename"] = filename + get_extension_from_type(type); + + if(type == "GameText") { + if(tags == nullptr) { + tags = new std::unordered_map(); + } + (*tags)["text-type"] = (sectionOut["_textTypes"][j].ToInt() == 1) ? "Dialog" : "Textbox"; + } else if(type == "MenuText") { + if(tags == nullptr) { + tags = new std::unordered_map(); + } + (*tags)["text-entry-count"] = sectionOut["_text-entry-count"].ToString(); + int numberOfEntries = stoi((*tags)["text-entry-count"]); + for(int k = 0; k < numberOfEntries; k++) { + if(!section["menu-text-build-ids"][k].IsNull()) { + (*tags)["text-entry-build-id_" + std::to_string(k)] = section["menu-text-build-ids"][k].ToString(); + } + } + if(!sectionOut.hasKey("menu-text-build-ids")) { + sectionOut["menu-text-build-ids"] = section["menu-text-build-ids"]; + } + sectionOut["files"]["sections"][key]["language"] = section["language-order"][j]; + } else if (type == "Textures") { + if(tags == nullptr) { + tags = new std::unordered_map(); + } + (*tags)["flip-texture_" + key] = section["flip-textures"][j].ToInt() == 1 ? "true" : "false"; + } + + extractions.push_back(ExtractInfo(key, type, folder, filename, sectionFiles[j], tags)); + } + + if(type == "GameText") { + sectionOut.erase("_textTypes"); + } else if(type == "MenuText") { + sectionOut.erase("_text-entry-count"); + } + + } else { + if(type != "Table" && type != "NoExtract" && type != "Empty") { + // No lookup table associated, so the section is assumed to be 1 file. + std::string filename = ""; + if(section.hasKey("filenames")) { + filename = section["filenames"][0].ToString(); + } + if(filename == "") { + std::stringstream filenameStream; + filenameStream << "unknown_" << i; + filename = filenameStream.str(); + } + sectionOut["filename"] = filename + get_extension_from_type(type); + extractions.push_back(ExtractInfo(build_id, type, folder, filename, sectionsData[i])); + + if(type == "Fonts") { + //sectionOut["fonts"] = json::Object(); + sectionOut["fonts-order"] = json::Array(); + for(auto& fontName : section["font-names"].ArrayRange()) { + std::string fontid = "ASSET_FONTS_" + fontName.ToString(); + make_uppercase(fontid); + //sectionOut["fonts"][fontid] = fontName.ToString() + ".json"; + sectionOut["fonts-order"].append(fontid); + } + } + + } else if (type == "Table") { + sectionOut["for"] = section["for"]; + } + } + + if(type != "Table" && type != "NoExtract" && type != "Empty") { + std::string sectionFilename = build_id + ".json"; + make_lowercase(sectionFilename); + write_json(sectionOut, this->outBaseDirectory + "/" + sectionFilename); + assetsJson["assets"]["sections"][build_id] = sectionFilename; + } else { + assetsJson["assets"]["sections"][build_id] = sectionOut; + } + } +} + +void write_vanilla_warning_file(std::string baseDirectory) { + std::string warningText = ""; + warningText += "This directory contains all the non-modified assets for DKR.\n"; + warningText += "It is VERY important that you do not modify any of the assets in this directory.\n"; + warningText += "If you do, then you might create headaches for yourself later when trying to revert back to a matching build.\n"; + write_text_file(warningText, baseDirectory + "/../" + VANILLA_WARNING_FILENAME); +} + +void ExtractConfig::execute_extraction() { + // These braces are important, because I want the ThreadPool to call its destructor by going out of scope. + { + ThreadPool pool(std::thread::hardware_concurrency()); + //ThreadPool pool(1); + + for(int i = 0; i < extractions.size(); i++) { + std::string key = extractions[i].key; + std::string type = extractions[i].type; + std::string folder = extractions[i].folder; + std::string filename = extractions[i].filename; + std::vector data = extractions[i].data; + std::unordered_map *tags = extractions[i].tags; + pool.enqueue([this, key, type, folder, filename, data, tags] { + std::string outFilepath = folder + "/" + filename; + + if(type == "MenuText") { + ExtractMenuText(key, data, outFilepath + ".json", tags); + } else if(type == "GameText") { + ExtractGameText(key, data, outFilepath + ".json", tags); + } else if(type == "TTGhosts") { + ExtractTTGhost(key, data, outFilepath + ".json", configJSON); + } else if(type == "LevelNames") { + ExtractLevelName(key, data, outFilepath + ".json"); + } else if(type == "LevelHeaders") { + ExtractLevelHeader(key, data, outFilepath + ".json"); + } else if(type == "Textures") { + ExtractTextures(key, data, outFilepath + ".json", tags); + } else if(type == "Sprites") { + ExtractSprite(key, data, outFilepath + ".json", configJSON); + } else if(type == "Fonts") { + ExtractFonts(key, data, outFilepath + ".json", folder, configJSON); + } else if(is_binary_type(type)) { + ExtractBinary(key, data, outFilepath + ".bin"); + } else if(is_compressed_type(type)) { + ExtractCompressed(key, data, outFilepath + ".cbin"); + } else if(type == "Empty") { + } else if(type != "NoExtract") { + display_error_and_abort("Unknown extraction type: ", type); + } + }); + } + } +} + +void ExtractConfig::extract() { + int romOffset = 0; + extract_code_sections(romOffset); + extract_asset_sections(romOffset); + + std::string jsonFilename = outBaseDirectory + "/assets.json"; + write_json(assetsJson, jsonFilename); + + execute_extraction(); + + while(!path_exists(jsonFilename)){ + std::cout << "Not created yet!" << std::endl; + } // Wait for assets.json to be created. + + // All extractions are done at this point. + std::cout << "Finished extracting! Copying from vanilla folder..." << std::endl; + recursively_copy_directory(this->outBaseDirectory, this->outDirectory); + write_vanilla_warning_file(this->outBaseDirectory); +} diff --git a/tools/dkr_assets_tool_classes/extractor/config.h b/tools/dkr_assets_tool_classes/extractor/config.h new file mode 100644 index 00000000..dda52cf2 --- /dev/null +++ b/tools/dkr_assets_tool_classes/extractor/config.h @@ -0,0 +1,77 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// C++17 +#include +#include +namespace fs = std::filesystem; + +#include "../common/util.h" +#include "../common/types.h" +#include "../common/revision_number.h" +#include "../libs/json.hpp" +#include "../libs/ThreadPool.h" + +#include "rom.h" + +#include "extract/extract_binary.h" +#include "extract/extract_compressed.h" +#include "extract/extract_gametext.h" +#include "extract/extract_fonts.h" +#include "extract/extract_menutext.h" +#include "extract/extract_levelname.h" +#include "extract/extract_levelheader.h" +#include "extract/extract_sprite.h" +#include "extract/extract_textures.h" +#include "extract/extract_ttghost.h" + +struct ExtractInfo { + std::string key; + std::string type; + std::string folder; + std::string filename; + std::vector data; + std::unordered_map *tags; + + ExtractInfo(std::string key, std::string type, std::string folder, std::string filename, + std::vector data, std::unordered_map *tags = nullptr) + : key(key), type(type), folder(folder), filename(filename), data(data), tags(tags) + {} +}; + +class ExtractConfig { +public: + ExtractConfig(std::string configFilepath, std::string outDirectory); + ~ExtractConfig(); + void find_rom_for_this_config_and_extract(std::vector &roms); + bool is_correct_version(std::string version); +private: + + void extract_code_sections(int &romOffset); + void extract_asset_sections(int &romOffset); + void execute_extraction(); + void extract(); + + json::JSON configJSON; // Loaded from a config file. + json::JSON assetsJson; // Output assets.json + + bool notSupported; + std::string outBaseDirectory; + std::string outDirectory; + std::string name; + std::string md5; + std::string subfolder; + + ROM *rom; + std::vector extractions; +}; diff --git a/tools/dkr_assets_tool_classes/extractor/extract/extract.cpp b/tools/dkr_assets_tool_classes/extractor/extract/extract.cpp new file mode 100644 index 00000000..18ef07a4 --- /dev/null +++ b/tools/dkr_assets_tool_classes/extractor/extract/extract.cpp @@ -0,0 +1,16 @@ +#include "extract.h" + +Extract::Extract(std::string key, std::vector data, std::string outFilepath){ + this->key = key; + this->data = data; + this->outFilepath = outFilepath; +} + +Extract::~Extract(){ +} + +void Extract::print_extracted() { + std::stringstream out; + out << "Extracted " << outFilepath << std::endl; + std::cout << out.str(); +} \ No newline at end of file diff --git a/tools/dkr_assets_tool_classes/extractor/extract/extract.h b/tools/dkr_assets_tool_classes/extractor/extract/extract.h new file mode 100644 index 00000000..cc381207 --- /dev/null +++ b/tools/dkr_assets_tool_classes/extractor/extract/extract.h @@ -0,0 +1,16 @@ +#pragma once + +#include "../../common/util.h" +#include + +class Extract { +public: + Extract(std::string key, std::vector data, std::string outFilepath); + ~Extract(); +protected: + std::string key; + std::vector data; + std::string outFilepath; + + void print_extracted(); +}; diff --git a/tools/dkr_assets_tool_classes/extractor/extract/extract_binary.cpp b/tools/dkr_assets_tool_classes/extractor/extract/extract_binary.cpp new file mode 100644 index 00000000..9eb58612 --- /dev/null +++ b/tools/dkr_assets_tool_classes/extractor/extract/extract_binary.cpp @@ -0,0 +1,10 @@ +#include "extract_binary.h" + +ExtractBinary::ExtractBinary(std::string key, std::vector data, std::string outFilepath) +: Extract(key, data, outFilepath) { + write_binary_file(data, outFilepath); + print_extracted(); +} + +ExtractBinary::~ExtractBinary(){ +} diff --git a/tools/dkr_extractor_classes/extract_binary.h b/tools/dkr_assets_tool_classes/extractor/extract/extract_binary.h similarity index 53% rename from tools/dkr_extractor_classes/extract_binary.h rename to tools/dkr_assets_tool_classes/extractor/extract/extract_binary.h index 8e2dba0a..5c780cb0 100644 --- a/tools/dkr_extractor_classes/extract_binary.h +++ b/tools/dkr_assets_tool_classes/extractor/extract/extract_binary.h @@ -4,6 +4,6 @@ class ExtractBinary : Extract { public: - ExtractBinary(std::vector data, ROM& rom, std::string outFilepath); + ExtractBinary(std::string key, std::vector data, std::string outFilepath); ~ExtractBinary(); }; diff --git a/tools/dkr_assets_tool_classes/extractor/extract/extract_compressed.cpp b/tools/dkr_assets_tool_classes/extractor/extract/extract_compressed.cpp new file mode 100644 index 00000000..09b86c35 --- /dev/null +++ b/tools/dkr_assets_tool_classes/extractor/extract/extract_compressed.cpp @@ -0,0 +1,19 @@ +#include "extract_compressed.h" + +ExtractCompressed::ExtractCompressed(std::string key, std::vector data, std::string outFilepath) +: Extract(key, data, outFilepath) { + + if(data.size() == 0) { + std::cout << "Warning: \"" << outFilepath << "\" is empty." << std::endl; + write_binary_file(data, outFilepath); + print_extracted(); + return; + } + + data = decompress_dkr_gzip(data); + write_binary_file(data, outFilepath); + print_extracted(); +} + +ExtractCompressed::~ExtractCompressed(){ +} diff --git a/tools/dkr_assets_tool_classes/extractor/extract/extract_compressed.h b/tools/dkr_assets_tool_classes/extractor/extract/extract_compressed.h new file mode 100644 index 00000000..27b95961 --- /dev/null +++ b/tools/dkr_assets_tool_classes/extractor/extract/extract_compressed.h @@ -0,0 +1,9 @@ +#pragma once + +#include "extract.h" + +class ExtractCompressed : Extract { +public: + ExtractCompressed(std::string key, std::vector data, std::string outFilepath); + ~ExtractCompressed(); +}; diff --git a/tools/dkr_assets_tool_classes/extractor/extract/extract_fonts.cpp b/tools/dkr_assets_tool_classes/extractor/extract/extract_fonts.cpp new file mode 100644 index 00000000..367bdcdb --- /dev/null +++ b/tools/dkr_assets_tool_classes/extractor/extract/extract_fonts.cpp @@ -0,0 +1,89 @@ +#include "extract_fonts.h" + +#define SECTION_TEXTURE_2D_INDEX 4 +#define SECTION_FONTS_INDEX 44 + +#define GAME_FONTS_FOLDERNAME "game_fonts" + +ExtractFonts::ExtractFonts(std::string key, std::vector data, std::string outFilepath, std::string folder, json::JSON &configJSON) +: Extract(key, data, outFilepath) { + json::JSON out = json::Object(); + + //out["fonts-folder"] = GAME_FONTS_FOLDERNAME; + create_directory(folder + "/" + GAME_FONTS_FOLDERNAME); + out["fonts"] = json::Object(); + + int numberOfFonts = get_big_endian_word(data, 0); + for(int i = 0; i < numberOfFonts; i++) { + int offset = (i * 0x400) + 4; // Offset in file for this font. + + std::string fontName = get_ascii(data, offset); + std::string fontId = "ASSET_FONTS_" + fontName; + make_uppercase(fontId); + + json::JSON font = json::Object(); + + font["name"] = fontName; + font["unknown-text"] = get_ascii(data, offset + 0x28); + font["fixed-width"] = get_big_endian_halfword(data, offset + 0x20); + font["y-offset"] = get_big_endian_halfword(data, offset + 0x22); + font["special-character-width"] = get_big_endian_halfword(data, offset + 0x24); + font["tab-width"] = get_big_endian_halfword(data, offset + 0x26); + + font["textures"] = json::Array(); + + int texOffset = offset + 0x40; + int16_t texIndex = get_big_endian_halfword(data, texOffset); + while(texIndex != -1) { + json::JSON textureId = configJSON["assets"]["sections"][SECTION_TEXTURE_2D_INDEX]["child-build-ids"][texIndex]; + font["textures"].append(textureId); + texOffset += 2; + texIndex = get_big_endian_halfword(data, texOffset); + } + + font["characters"] = json::Object(); + + for(int j = 32; j < 128; j++) { + int nodeOffset = offset + 0x100 + ((j - 32) * 8); + json::JSON node = json::Object(); + + node["tex-index"] = (int8_t)data[nodeOffset]; + node["char-width"] = data[nodeOffset + 1]; + node["offset"] = json::Array(); + node["offset"].append(data[nodeOffset + 2]); // X offset + node["offset"].append(data[nodeOffset + 3]); // Y offset + node["uv"] = json::Array(); + node["uv"].append(data[nodeOffset + 4]); // U coordinate + node["uv"].append(data[nodeOffset + 5]); // V coordinate + node["tex-size"] = json::Array(); + node["tex-size"].append(data[nodeOffset + 6]); // Width + node["tex-size"].append(data[nodeOffset + 7]); // Height + + if(j == '\"') { + font["characters"]["\\\""] = node; + } else if(j == '\\') { + font["characters"]["\\\\"] = node; + } else if(j == 127) { + font["characters"]["DEL"] = node; + } else { + font["characters"][std::string(1, (char)j)] = node; + } + } + + font["encoding"] = json::Object(); + font["encoding"]["type"] = "ASCII"; + + std::string fontJsonFilename = GAME_FONTS_FOLDERNAME; + fontJsonFilename += "/" + fontName + ".json"; + + out["fonts"][fontId] = fontJsonFilename; + + write_json(font, folder + "/" + fontJsonFilename); + } + out["type"] = "Fonts"; + write_json(out, outFilepath); + print_extracted(); +} + +ExtractFonts::~ExtractFonts(){ +} diff --git a/tools/dkr_assets_tool_classes/extractor/extract/extract_fonts.h b/tools/dkr_assets_tool_classes/extractor/extract/extract_fonts.h new file mode 100644 index 00000000..f05b4e1d --- /dev/null +++ b/tools/dkr_assets_tool_classes/extractor/extract/extract_fonts.h @@ -0,0 +1,9 @@ +#pragma once + +#include "extract.h" + +class ExtractFonts : Extract { +public: + ExtractFonts(std::string key, std::vector data, std::string outFilepath, std::string folder, json::JSON &configJSON); + ~ExtractFonts(); +}; diff --git a/tools/dkr_assets_tool_classes/extractor/extract/extract_gametext.cpp b/tools/dkr_assets_tool_classes/extractor/extract/extract_gametext.cpp new file mode 100644 index 00000000..bda3a64a --- /dev/null +++ b/tools/dkr_assets_tool_classes/extractor/extract/extract_gametext.cpp @@ -0,0 +1,164 @@ +#include "extract_gametext.h" + +ExtractGameText::ExtractGameText(std::string key, std::vector data, std::string outFilepath, + std::unordered_map *tags) : Extract(key, data, outFilepath) { + json::JSON out = json::Object(); + bool isDialog = false; + + out["type"] = "GameText"; + + if(tags != nullptr) { + out["text-type"] = (*tags)["text-type"]; + isDialog = (out["text-type"].ToString() == "Dialog"); + } + + if(isDialog) { + // Uncomment this when the formats have been fully figured out. + //extract_dialog(out, data); + // Remove this raw part when dialog has been figured out. + out["raw"] = json::Array(); + size_t dataLength = data.size(); + for(int i = 0; i < dataLength; i++) { + out["raw"].append(data[i]); + } + } else { // Textbox + extract_textbox(out, data); + } + + write_json(out, outFilepath); + print_extracted(); +} + +ExtractGameText::~ExtractGameText() { +} + +void ExtractGameText::extract_dialog(json::JSON &out, std::vector &data) { + out["lines"] = json::Array(); + + size_t offset = 0; + size_t dataLength = data.size(); + + while(offset < dataLength) { + if(data[offset++] == 1) { + json::JSON line = json::Object(); + line["color"] = json::Object(); + line["color"]["red"] = data[offset++]; + line["color"]["green"] = data[offset++]; + line["color"]["blue"] = data[offset++]; + line["color"]["alpha"] = data[offset++]; + line["font"] = data[offset++]; + line["alignment"] = data[offset++]; + line["time"] = (data[offset++] * 6.0f) / 30.0f; + uint8_t c = data[offset++]; + std::stringstream rawTextStream; + while(c != 0) { + rawTextStream << (char)c; + c = data[offset++]; + } + line["text"] = rawTextStream.str(); + out["lines"].append(line); + } + if(data[offset++] != 0xC) { + break; + } else { + out["lines"].append("CONTINUE"); + } + } + if(offset < dataLength) { + offset--; + json::JSON junk = json::Object(); + json::JSON junkData = json::Array(); + while(offset < dataLength) { + junkData.append(data[offset++]); + } + junk["unknown-data"] = junkData; + out["lines"].append(junk); + } +} + +void ExtractGameText::extract_textbox(json::JSON &out, std::vector &data) { + size_t offset = 0; + size_t dataLength = data.size(); + + out["pages"] = json::Array(); + int currentPage = 0; + out["pages"].append(json::Array()); // Each page is an array of commands/text. + + bool end = false; + while((offset < dataLength) && !end) { + json::JSON cmd = json::Object(); + switch(data[offset++]){ + case 0: // End of textbox commands. + end = true; + break; + case 1: // Go to next page. + currentPage++; + out["pages"].append(json::Array()); + continue; // Move onto the next command, since there is nothing to add anyway. + case 2: + // Not used? + break; + case 3: + cmd["command"] = "SetFont"; + cmd["value"] = get_string_from_section("ASSET_FONTS", "fonts-order", data[offset++]); + break; + case 4: + cmd["command"] = "SetBorder"; + cmd["value"] = json::Object(); // 0 = Farthest left/top, 0xFF = Farthest right/bottom + cmd["value"]["left"] = data[offset++]; + cmd["value"]["top"] = data[offset++]; + cmd["value"]["right"] = data[offset++]; + cmd["value"]["bottom"] = data[offset++]; + break; + case 5: + cmd["command"] = "SetColour"; + cmd["value"] = json::Object(); + cmd["value"]["red"] = data[offset++]; + cmd["value"]["green"] = data[offset++]; + cmd["value"]["blue"] = data[offset++]; + cmd["value"]["alpha"] = data[offset++]; + break; + case 6: + cmd["command"] = "SetAlignment"; + cmd["value"] = (data[offset++] == 0) ? "center" : "left"; + break; + case 7: + cmd["command"] = "Unknown"; // Doesn't seem to do anything as far as I can tell. + cmd["value"] = data[offset++]; + break; + case 8: + cmd["command"] = "AddVerticalSpacing"; + cmd["value"] = data[offset++]; + break; + case 9: + cmd["command"] = "SetLineHeight"; + cmd["value"] = data[offset++]; + break; + case 10: + cmd["command"] = "SetTimer"; + cmd["value"] = data[offset++]; // time in seconds. + break; + case 11: + cmd["command"] = "AllowUserInput"; + cmd["value"] = data[offset++] ? true : false; + break; + default: // Just regular text. + uint8_t c = data[--offset]; + std::stringstream rawTextStream; + while(c != 0) { + rawTextStream << (char)c; + c = data[++offset]; + } + offset++; + cmd["command"] = "Text"; + cmd["value"] = rawTextStream.str(); + break; + } + if(!end) { + out["pages"][currentPage].append(cmd); + } + } +} + + + diff --git a/tools/dkr_assets_tool_classes/extractor/extract/extract_gametext.h b/tools/dkr_assets_tool_classes/extractor/extract/extract_gametext.h new file mode 100644 index 00000000..74bc1db5 --- /dev/null +++ b/tools/dkr_assets_tool_classes/extractor/extract/extract_gametext.h @@ -0,0 +1,13 @@ +#pragma once + +#include "extract.h" + +class ExtractGameText : Extract { +public: + ExtractGameText(std::string key, std::vector data, std::string outFilepath, + std::unordered_map *tags); + ~ExtractGameText(); +private: + void extract_dialog(json::JSON &out, std::vector &data); + void extract_textbox(json::JSON &out, std::vector &data); +}; diff --git a/tools/dkr_assets_tool_classes/extractor/extract/extract_levelheader.cpp b/tools/dkr_assets_tool_classes/extractor/extract/extract_levelheader.cpp new file mode 100644 index 00000000..ea0cd7b4 --- /dev/null +++ b/tools/dkr_assets_tool_classes/extractor/extract/extract_levelheader.cpp @@ -0,0 +1,132 @@ +#include "extract_levelheader.h" + +// Extracts a bitfield as an array of enum value strings. +json::JSON extract_enum_values(std::vector &data, int offset, int numBytes, std::string enumName) { + json::JSON values = json::Array(); + int bitflags = 0; + for(int i = 0; i < numBytes; i++) { + bitflags |= data[offset + i] << (8 * i); + } + for(int i = 0; bitflags != 0; i++) { + if(bitflags & 1) { + values.append(get_enum_string_from_value(enumName, i)); + } + bitflags >>= 1; + } + return values; +} + +ExtractLevelHeader::ExtractLevelHeader(std::string key, std::vector data, std::string outFilepath) +: Extract(key, data, outFilepath) { + json::JSON out = json::Object(); + + out["type"] = "LevelHeaders"; + out["unknown-data"] = json::Object(); + + // World ID + out["world"] = get_enum_string_from_value("World", (int8_t)data[0]); + + out["unknown-data"]["unk1"] = data[1]; + out["unknown-data"]["unk2"] = data[2]; + out["unknown-data"]["unk3"] = data[3]; + out["unknown-data"]["unk4"] = json::Array(); + for(int i = 4; i < 8; i++) { + out["unknown-data"]["unk4"].append(data[i]); + } + + // Ceiling height for planes + out["ceiling-height"] = get_big_endian_float(data, 8); + + out["unknown-data"]["unkC"] = json::Array(); + for(int i = 0xC; i < 0x34; i++) { + out["unknown-data"]["unkC"].append(data[i]); + } + + // Track Model ID to use + int modelId = get_big_endian_halfword(data, 0x34); + out["model"] = get_build_id_from_section("ASSET_LEVEL_MODELS", modelId); + + // Collectables bitflags (bananas, balloons, etc) + out["collectables"] = get_big_endian_halfword(data, 0x36); + + // Skydome object model ID + out["skybox"] = get_big_endian_halfword(data, 0x38); + + // Fog + out["fog"] = json::Object(); + out["fog"]["range"] = json::Object(); + out["fog"]["range"]["min"] = get_big_endian_halfword(data, 0x3A); + out["fog"]["range"]["max"] = get_big_endian_halfword(data, 0x3C); + out["fog"]["colour"] = json::Object(); + out["fog"]["colour"]["red"] = get_big_endian_halfword(data, 0x3E); + out["fog"]["colour"]["green"] = get_big_endian_halfword(data, 0x40); + out["fog"]["colour"]["blue"] = get_big_endian_halfword(data, 0x42); + + for(int i = 0x44; i < 0x4B; i++) { + out["unknown-data"]["unk44"].append(data[i]); + } + + // Number of laps to complete the race + out["number-laps"] = data[0x4B]; + + // Type of race (standard, boss race, hub world, etc. + out["race-type"] = get_enum_string_from_value("RaceType", data[0x4C]); + + // Default vehicle used for this track. (Either Car, Hovercraft, or Plane) + out["default-vehicle"] = get_enum_string_from_value("Vehicle", data[0x4D]); + + // Which vehicles can be used in this track (Either Car, Hovercraft, or Plane) + out["available-vehicles"] = extract_enum_values(data, 0x4E, 1, "Vehicle"); + + out["unknown-data"]["unk4F"] = json::Array(); + for(int i = 0x4F; i < 0x52; i++) { + out["unknown-data"]["unk4F"].append(data[i]); + } + out["music"] = data[0x52]; + out["unknown-data"]["unk53"] = data[0x53]; + out["instruments"] = get_big_endian_halfword(data, 0x54); + out["unknown-data"]["unk56"] = json::Array(); + for(int i = 0x56; i < 0x74; i++) { + out["unknown-data"]["unk56"].append(data[i]); + } + out["unknown-data"]["unk74"] = json::Array(); + for(int i = 0; i < 7; i++) { + int ptr = get_big_endian_word(data, 0x74 + (i*4)); + out["unknown-data"]["unk74"].append(ptr); + } + out["unknown-data"]["weather"] = json::Object(); + out["unknown-data"]["weather"]["unk90"] = (int)get_big_endian_halfword(data, 0x90); + out["unknown-data"]["weather"]["unk92"] = (int)get_big_endian_halfword(data, 0x92); + out["unknown-data"]["weather"]["unk94"] = data[0x94]; + out["unknown-data"]["weather"]["unk95"] = data[0x95]; + out["unknown-data"]["weather"]["unk96"] = (int)get_big_endian_halfword(data, 0x96); + out["unknown-data"]["weather"]["unk98"] = (int)get_big_endian_halfword(data, 0x98); + out["unknown-data"]["weather"]["unk9A"] = (int)get_big_endian_halfword(data, 0x9A); + out["fov"] = data[0x9C]; + out["background-colour"] = json::Object(); + out["background-colour"]["red"] = data[0x9D]; + out["background-colour"]["green"] = data[0x9E]; + out["background-colour"]["blue"] = data[0x9F]; + out["unknown-data"]["unkA0"] = json::Array(); + for(int i = 0xA0; i < 0xA4; i++) { + out["unknown-data"]["unkA0"].append(data[i]); + } + out["unknown-data"]["unkA4"] = (int)get_big_endian_word(data, 0xA4); + out["unknown-data"]["unkA8"] = (int)get_big_endian_halfword(data, 0xA8); + out["unknown-data"]["unkAA"] = (int)get_big_endian_halfword(data, 0xAA); + int pulsatingLightsOffset = (int)get_big_endian_word(data, 0xAC); + if(pulsatingLightsOffset != -1) { + out["pulsating-lights"] = get_build_id_from_section("ASSET_MISC", pulsatingLightsOffset); + } + out["unknown-data"]["unkB0"] = json::Array(); + for(int i = 0xB0; i < 0xC4; i++) { + out["unknown-data"]["unkB0"].append(data[i]); + } + out["unknown-data"]["unkC4"] = (int)get_big_endian_word(data, 0xC4); + + write_json(out, outFilepath); + print_extracted(); +} + +ExtractLevelHeader::~ExtractLevelHeader(){ +} diff --git a/tools/dkr_assets_tool_classes/extractor/extract/extract_levelheader.h b/tools/dkr_assets_tool_classes/extractor/extract/extract_levelheader.h new file mode 100644 index 00000000..0d35909e --- /dev/null +++ b/tools/dkr_assets_tool_classes/extractor/extract/extract_levelheader.h @@ -0,0 +1,9 @@ +#pragma once + +#include "extract.h" + +class ExtractLevelHeader : Extract { +public: + ExtractLevelHeader(std::string key, std::vector data, std::string outFilepath); + ~ExtractLevelHeader(); +}; diff --git a/tools/dkr_assets_tool_classes/extractor/extract/extract_levelname.cpp b/tools/dkr_assets_tool_classes/extractor/extract/extract_levelname.cpp new file mode 100644 index 00000000..c80fd36c --- /dev/null +++ b/tools/dkr_assets_tool_classes/extractor/extract/extract_levelname.cpp @@ -0,0 +1,25 @@ +#include "extract_levelname.h" + +ExtractLevelName::ExtractLevelName(std::string key, std::vector data, std::string outFilepath) +: Extract(key, data, outFilepath) { + json::JSON out = json::Object(); + + out["type"] = "LevelNames"; + out["languages"] = json::Object(); + + // Assumption: All of the values in the "Language" enum are continuous and start at 0. + std::vector languages = get_enum_keys("Language"); + + int numLanguages = languages.size(); + std::vector names = get_multiple_ascii(data, 0, numLanguages); + + for(int i = 0; i < numLanguages; i++) { + out["languages"][languages[i]] = names[i]; + } + + write_json(out, outFilepath); + print_extracted(); +} + +ExtractLevelName::~ExtractLevelName(){ +} diff --git a/tools/dkr_assets_tool_classes/extractor/extract/extract_levelname.h b/tools/dkr_assets_tool_classes/extractor/extract/extract_levelname.h new file mode 100644 index 00000000..5e922a54 --- /dev/null +++ b/tools/dkr_assets_tool_classes/extractor/extract/extract_levelname.h @@ -0,0 +1,9 @@ +#pragma once + +#include "extract.h" + +class ExtractLevelName : Extract { +public: + ExtractLevelName(std::string key, std::vector data, std::string outFilepath); + ~ExtractLevelName(); +}; diff --git a/tools/dkr_assets_tool_classes/extractor/extract/extract_menutext.cpp b/tools/dkr_assets_tool_classes/extractor/extract/extract_menutext.cpp new file mode 100644 index 00000000..7332a97c --- /dev/null +++ b/tools/dkr_assets_tool_classes/extractor/extract/extract_menutext.cpp @@ -0,0 +1,40 @@ +#include "extract_menutext.h" + +ExtractMenuText::ExtractMenuText(std::string key, std::vector data, std::string outFilepath, + std::unordered_map *tags) : Extract(key, data, outFilepath) { + json::JSON out = json::Object(); + + out["type"] = "MenuText"; + + std::cout << key << std::endl; + + uint32_t tableSize = stoi((*tags)["text-entry-count"]); + + //out["order"] = json::Array(); + out["sections"] = json::Object(); + + for(size_t i = 0; i < tableSize; i++) { + uint32_t offset = get_big_endian_word(data, i*4); + + if(offset == 0xFFFFFFFF) { + //out["order"].append(nullptr); + } else { + std::string entry_key = (*tags)["text-entry-build-id_" + std::to_string(i)]; + if(out["sections"].hasKey(entry_key)) { + std::stringstream err; + err << "The key \"" << entry_key << "\" is already defined! Aborting!" << std::endl; + std::cout << err.str(); + throw 1; + } + //out["order"].append(entry_key); + out["sections"][entry_key] = get_ascii(data, offset); + } + + } + + write_json(out, outFilepath); + print_extracted(); +} + +ExtractMenuText::~ExtractMenuText(){ +} diff --git a/tools/dkr_assets_tool_classes/extractor/extract/extract_menutext.h b/tools/dkr_assets_tool_classes/extractor/extract/extract_menutext.h new file mode 100644 index 00000000..635f452a --- /dev/null +++ b/tools/dkr_assets_tool_classes/extractor/extract/extract_menutext.h @@ -0,0 +1,10 @@ +#pragma once + +#include "extract.h" + +class ExtractMenuText : Extract { +public: + ExtractMenuText(std::string key, std::vector data, std::string outFilepath, + std::unordered_map *tags); + ~ExtractMenuText(); +}; diff --git a/tools/dkr_assets_tool_classes/extractor/extract/extract_sprite.cpp b/tools/dkr_assets_tool_classes/extractor/extract/extract_sprite.cpp new file mode 100644 index 00000000..ee171826 --- /dev/null +++ b/tools/dkr_assets_tool_classes/extractor/extract/extract_sprite.cpp @@ -0,0 +1,28 @@ +#include "extract_sprite.h" + +ExtractSprite::ExtractSprite(std::string key, std::vector data, std::string outFilepath, +json::JSON &configJSON) +: Extract(key, data, outFilepath) { + json::JSON out = json::Object(); + + out["type"] = "Sprites"; + out["start-texture"] = configJSON["assets"]["sections"][4]["child-build-ids"][get_big_endian_halfword(data, 0)]; + //out["number-of-frames"] = get_big_endian_halfword(data, 2); + out["unk4"] = get_big_endian_halfword(data, 4); + out["unk6"] = get_big_endian_halfword(data, 6); + out["frame-tex-count"] = json::Array(); + + int count = get_big_endian_halfword(data, 2); + int curOffset = 0x0D; + + for(int i = 0; i < count; i++) { + out["frame-tex-count"].append(data[curOffset] - data[curOffset - 1]); + curOffset++; + } + + write_json(out, outFilepath); + print_extracted(); +} + +ExtractSprite::~ExtractSprite(){ +} diff --git a/tools/dkr_assets_tool_classes/extractor/extract/extract_sprite.h b/tools/dkr_assets_tool_classes/extractor/extract/extract_sprite.h new file mode 100644 index 00000000..f65400fd --- /dev/null +++ b/tools/dkr_assets_tool_classes/extractor/extract/extract_sprite.h @@ -0,0 +1,9 @@ +#pragma once + +#include "extract.h" + +class ExtractSprite : Extract { +public: + ExtractSprite(std::string key, std::vector data, std::string outFilepath, json::JSON &configJSON); + ~ExtractSprite(); +}; diff --git a/tools/dkr_assets_tool_classes/extractor/extract/extract_textures.cpp b/tools/dkr_assets_tool_classes/extractor/extract/extract_textures.cpp new file mode 100644 index 00000000..b4046fd8 --- /dev/null +++ b/tools/dkr_assets_tool_classes/extractor/extract/extract_textures.cpp @@ -0,0 +1,204 @@ +#include "extract_textures.h" + +ExtractTextures::ExtractTextures(std::string key, std::vector data, std::string outFilepath, + std::unordered_map *tags) +: Extract(key, data, outFilepath) { + std::string directory = get_directory_from_full_path(outFilepath); + std::string filename = get_filename_from_full_path(outFilepath, true); + ensure_that_path_exists(directory + "/img/"); + + json::JSON out = json::Object(); + int format = data[2] & 0xF; + int numberOfTextures = data[0x12]; + + out["type"] = "Textures"; + out["width"] = data[0]; + out["height"] = data[1]; + out["format"] = get_texture_format_string(format); + out["tex-type"] = (data[2] >> 4) & 0xF; + + if(tags != nullptr) { + out["flipped-image"] = (*tags)["flip-texture_" + key] == "true"; + } + + if(data[3] != 0 || data[4] != 0) { + out["sprite-x"] = data[3]; + out["sprite-y"] = data[4]; + } + + int flags = get_big_endian_halfword(data, 6); + + out["flags"] = json::Object(); + + // TODO: Figure out all the flags + out["flags"]["flag-01"] = flags & 0x0001 ? true : false; + out["flags"]["flag-04"] = flags & 0x0004 ? true : false; + out["flags"]["flag-10"] = flags & 0x0010 ? true : false; + out["flags"]["wrap-s"] = flags & 0x0040 ? "Clamp" : "Wrap"; + out["flags"]["wrap-t"] = flags & 0x0080 ? "Clamp" : "Wrap"; + out["flags"]["interlaced"] = flags & 0x0400 ? true : false; + + if(format == TEX_FORMAT_CI4 || format == TEX_FORMAT_CI8) { + // TODO: Replace integer offset with label. + out["palette-offset"] = get_big_endian_halfword(data, 8); + } + + out["frame-count"] = numberOfTextures; + + if(numberOfTextures > 1) { + out["frame-advance-delay"] = get_big_endian_halfword(data, 0x14); + } + + out["compressed"] = data[0x1D] != 0; + + out["img"] = "img/" + filename + ".png"; + + out["write-size"] = (get_big_endian_halfword(data, 0x16) != 0); + + write_images(directory + "/" + out["img"].ToString(), data, out); + + write_json(out, outFilepath); + print_extracted(); +} + +ExtractTextures::~ExtractTextures(){ +} + +void deinterlace_texture(std::vector& texData, int width, int height, int format) { + switch(format) { + case TEX_FORMAT_RGBA32: + { + deinterlace(texData, 0, width, height, 32, 8); + return; + } + case TEX_FORMAT_RGBA16: + case TEX_FORMAT_IA16: + { + deinterlace(texData, 0, width, height, 16, 4); + return; + } + case TEX_FORMAT_I8: + case TEX_FORMAT_IA8: + { + deinterlace(texData, 0, width, height, 8, 4); + return; + } + case TEX_FORMAT_I4: + case TEX_FORMAT_IA4: + { + deinterlace(texData, 0, width, height, 4, 4); + return; + } + } +} + +void ExtractTextures::write_images(std::string outImagePath, std::vector &data, json::JSON &out) { + std::vector texData; + + if(out["compressed"].ToBool()) { + std::vector compressedData(data.begin() + TEX_HEADER_SIZE, data.end()); + texData = decompress_dkr_gzip(compressedData); + } else { + texData = data; + } + + int numberOfTextures = out["frame-count"].ToInt(); + int width = out["width"].ToInt(); + int height = out["height"].ToInt(); + int format = get_texture_format_from_string(out["format"].ToString()); + bool isInterlaced = out["flags"]["interlaced"].ToBool(); + bool shouldFlip = out["flipped-image"].ToBool(); + + std::vector combinedTexturesData; + int dataOffset = 0; + + if(numberOfTextures > 1) { + for(int i = 0; i < numberOfTextures; i++){ + int textureSize = get_texture_size(width, height, format); + + std::vector texDataPart(texData.begin() + dataOffset + TEX_HEADER_SIZE, texData.begin() + dataOffset + textureSize); + + // Deinterlacing must come before flipping the texture. + if(isInterlaced) { + deinterlace_texture(texDataPart, width, height, format); + } + if(shouldFlip) { + flip_texture_vertically(texDataPart, 0, width, height, format); + } + + combinedTexturesData.insert(combinedTexturesData.end(), texDataPart.begin(), texDataPart.end()); + + dataOffset += textureSize; + } + } else { + combinedTexturesData = std::vector(texData.begin() + TEX_HEADER_SIZE, texData.end()); + + // Deinterlacing must come before flipping the texture. + if(isInterlaced) { + deinterlace_texture(combinedTexturesData, width, height, format); + } + if(shouldFlip) { + flip_texture_vertically(combinedTexturesData, 0, width, height, format); + } + } + + int totalHeight = height * numberOfTextures; + + switch(format) { + case TEX_FORMAT_RGBA32: + { + rgba2png(outImagePath.c_str(), (const rgba*)&combinedTexturesData[0], width, totalHeight); + break; + } + case TEX_FORMAT_RGBA16: + { + rgba *outTex = raw2rgba(&combinedTexturesData[0], width, totalHeight, 16); + rgba2png(outImagePath.c_str(), outTex, width, totalHeight); + break; + } + case TEX_FORMAT_I8: + { + ia *outTex = raw2i(&combinedTexturesData[0], width, totalHeight, 8); + ia2png(outImagePath.c_str(), outTex, width, totalHeight); + break; + } + case TEX_FORMAT_I4: + { + ia *outTex = raw2i(&combinedTexturesData[0], width, totalHeight, 4); + ia2png(outImagePath.c_str(), outTex, width, totalHeight); + break; + } + case TEX_FORMAT_IA16: + { + ia *outTex = raw2ia(&combinedTexturesData[0], width, totalHeight, 16); + ia2png(outImagePath.c_str(), outTex, width, totalHeight); + break; + } + case TEX_FORMAT_IA8: + { + ia *outTex = raw2ia(&combinedTexturesData[0], width, totalHeight, 8); + ia2png(outImagePath.c_str(), outTex, width, totalHeight); + break; + } + case TEX_FORMAT_IA4: + { + ia *outTex = raw2ia(&combinedTexturesData[0], width, totalHeight, 4); + ia2png(outImagePath.c_str(), outTex, width, totalHeight); + break; + } + case TEX_FORMAT_CI4: + case TEX_FORMAT_CI8: + { + display_error_and_abort("CI texture formats are not currently supported."); + } + default: // Invalid texture format + { + display_error_and_abort("Unknown texture format ", format); + } + } +} + + + + + diff --git a/tools/dkr_assets_tool_classes/extractor/extract/extract_textures.h b/tools/dkr_assets_tool_classes/extractor/extract/extract_textures.h new file mode 100644 index 00000000..1655f94f --- /dev/null +++ b/tools/dkr_assets_tool_classes/extractor/extract/extract_textures.h @@ -0,0 +1,13 @@ +#pragma once + +#include "extract.h" +#include "../../common/textures.h" + +class ExtractTextures : Extract { +public: + ExtractTextures(std::string key, std::vector data, std::string outFilepath, + std::unordered_map *tags); + ~ExtractTextures(); +private: + void write_images(std::string outImagePath, std::vector &data, json::JSON &out); +}; diff --git a/tools/dkr_assets_tool_classes/extractor/extract/extract_ttghost.cpp b/tools/dkr_assets_tool_classes/extractor/extract/extract_ttghost.cpp new file mode 100644 index 00000000..597033e2 --- /dev/null +++ b/tools/dkr_assets_tool_classes/extractor/extract/extract_ttghost.cpp @@ -0,0 +1,42 @@ +#include "extract_ttghost.h" + +ExtractTTGhost::ExtractTTGhost(std::string key, std::vector data, std::string outFilepath, +json::JSON &configJSON) +: Extract(key, data, outFilepath) { + json::JSON out = json::Object(); + + out["type"] = "TTGhosts"; + out["header"] = json::Object(); + out["nodes"] = json::Array(); + + out["header"]["level"] = get_build_id_from_section("ASSET_LEVEL_HEADERS", data[0]); // data[0]; + + out["header"]["vehicle"] = get_enum_string_from_value("Vehicle", data[1]); + + //out["header"]["unk02"] = data[2]; // Always 0x09? + out["header"]["time"] = get_big_endian_halfword(data, 4); + + int nodeCount = get_big_endian_halfword(data, 6); + + for(int i = 0; i < nodeCount; i++) { + json::JSON node = json::Object(); + + int offset = (i * 12) + 8; + + node["x"] = (int16_t)get_big_endian_halfword(data, offset); + node["y"] = (int16_t)get_big_endian_halfword(data, offset + 2); + node["z"] = (int16_t)get_big_endian_halfword(data, offset + 4); + // Yes, this order is correct. + node["rz"] = (int16_t)get_big_endian_halfword(data, offset + 6); + node["rx"] = (int16_t)get_big_endian_halfword(data, offset + 8); + node["ry"] = (int16_t)get_big_endian_halfword(data, offset + 10); + + out["nodes"].append(node); + } + + write_json(out, outFilepath); + print_extracted(); +} + +ExtractTTGhost::~ExtractTTGhost(){ +} diff --git a/tools/dkr_assets_tool_classes/extractor/extract/extract_ttghost.h b/tools/dkr_assets_tool_classes/extractor/extract/extract_ttghost.h new file mode 100644 index 00000000..a5bbef0d --- /dev/null +++ b/tools/dkr_assets_tool_classes/extractor/extract/extract_ttghost.h @@ -0,0 +1,9 @@ +#pragma once + +#include "extract.h" + +class ExtractTTGhost : Extract { +public: + ExtractTTGhost(std::string key, std::vector data, std::string outFilepath, json::JSON &configJSON); + ~ExtractTTGhost(); +}; diff --git a/tools/dkr_assets_tool_classes/extractor/extractor.cpp b/tools/dkr_assets_tool_classes/extractor/extractor.cpp new file mode 100644 index 00000000..22ae9778 --- /dev/null +++ b/tools/dkr_assets_tool_classes/extractor/extractor.cpp @@ -0,0 +1,36 @@ +#include "extractor.h" + +Extractor::Extractor(std::string version, std::string configsDirectory, std::string baseromsDirectory, std::string outDirectory) { + std::vector baseroms = get_filenames_from_directory(baseromsDirectory); + std::vector validROMs; + for(std::string& baseromPath : baseroms) { + ROM *checkRom = new ROM(baseromPath); + if(checkRom->is_valid()) { + validROMs.push_back(checkRom); + } else { + delete checkRom; + } + } + + if(validROMs.size() == 0) { + std::cout << "No valid ROMs were found in the baseroms directory" << std::endl; + return; + } + + std::vector configPaths = get_filenames_from_directory_with_extension(configsDirectory, ".config.json"); + for(std::string& configPath : configPaths) { + ExtractConfig config(configPath, outDirectory); + if(config.is_correct_version(version)) { + config.find_rom_for_this_config_and_extract(validROMs); + } + } + + // Cleanup + for(size_t i; i < validROMs.size(); i++) { + delete validROMs[i]; + } +} + +Extractor::~Extractor() { + +} diff --git a/tools/dkr_assets_tool_classes/extractor/extractor.h b/tools/dkr_assets_tool_classes/extractor/extractor.h new file mode 100644 index 00000000..e878b6b0 --- /dev/null +++ b/tools/dkr_assets_tool_classes/extractor/extractor.h @@ -0,0 +1,21 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include + +#include "config.h" +#include "rom.h" +#include "../common/util.h" + +class Extractor { +public: + Extractor(std::string version, std::string configsDirectory, std::string baseromsDirectory, std::string outDirectory); + ~Extractor(); +private: + std::vector configs; +}; diff --git a/tools/dkr_extractor_classes/rom.cpp b/tools/dkr_assets_tool_classes/extractor/rom.cpp similarity index 81% rename from tools/dkr_extractor_classes/rom.cpp rename to tools/dkr_assets_tool_classes/extractor/rom.cpp index 6261d690..2098bd4d 100644 --- a/tools/dkr_extractor_classes/rom.cpp +++ b/tools/dkr_assets_tool_classes/extractor/rom.cpp @@ -2,13 +2,12 @@ ROM::ROM(std::string filename){ if(!readROMFile(filename)) { - // ROM failed to load. - throw 1; + display_error_and_abort("Failed to load ROM \"", filename, "\""); } romFilename = filename; test_endianness(); - calculate_md5(); + md5 = calculate_md5(bytes); } ROM::~ROM(){ @@ -36,8 +35,13 @@ int ROM::get_size(){ return bytes.size(); } +bool ROM::is_valid() { + return isValid; +} + void ROM::test_endianness(){ bool convertedToBigEndian = false; + isValid = true; if(bytes[0] == 0x80 && bytes[1] == 0x37) { // Big endian // Do nothing } else if(bytes[0] == 0x37 && bytes[1] == 0x80) { // Mixed endian (byteswapped) @@ -65,8 +69,8 @@ void ROM::test_endianness(){ } convertedToBigEndian = true; } else { - // Invalid ROM file - throw 1; + isValid = false; + return; } if(convertedToBigEndian) { // Overwrite ROM file @@ -74,39 +78,12 @@ void ROM::test_endianness(){ std::string z64Filename = romFilename.substr(0, romFilename.length() - 4) + ".z64"; if(!writeROMFile(z64Filename)) { // Save new big-endian rom. // ROM failed to save. - throw 1; + isValid = false; + return; } } } -void ROM::calculate_md5() { - uint8_t buffer[0x4000]; - uint8_t digest[MD5_DIGEST_LENGTH]; - - std::stringstream ss; - - MD5_CTX md5Context; - - MD5_Init(&md5Context); - MD5_Update(&md5Context, &bytes[0], bytes.size()); - int res = MD5_Final(digest, &md5Context); - - if(res == 0){ // hash failed or raise an exception - md5 = ""; - return; - } - - // set up stringstream format - ss << std::hex << std::setfill('0'); - - - for(uint8_t uc: digest) { - ss << std::setw(2) << (int)uc; - } - - md5 = ss.str(); -} - bool ROM::readROMFile(std::string filename) { try { @@ -139,4 +116,4 @@ bool ROM::writeROMFile(std::string filename) { return false; } return true; -} \ No newline at end of file +} diff --git a/tools/dkr_extractor_classes/rom.h b/tools/dkr_assets_tool_classes/extractor/rom.h similarity index 72% rename from tools/dkr_extractor_classes/rom.h rename to tools/dkr_assets_tool_classes/extractor/rom.h index 074c7cde..f0af9309 100644 --- a/tools/dkr_extractor_classes/rom.h +++ b/tools/dkr_assets_tool_classes/extractor/rom.h @@ -1,14 +1,7 @@ #pragma once -#include -#include -#include +#include "../common/util.h" #include -#include - -// C++17 -#include -namespace fs = std::experimental::filesystem; class ROM { public: @@ -19,16 +12,21 @@ public: uint8_t get_byte(int romOffset); uint32_t get_uint(int romOffset); - std::string get_md5(); int get_size(); + + + std::string get_md5(); + + bool is_valid(); private: void test_endianness(); - void calculate_md5(); bool readROMFile(std::string filename); bool writeROMFile(std::string filename); std::vector bytes; std::string md5; std::string romFilename; -}; \ No newline at end of file + + bool isValid = false; +}; diff --git a/tools/dkr_decompressor_src/DKRCompression.cpp b/tools/dkr_assets_tool_classes/libs/DKRCompression.cpp old mode 100755 new mode 100644 similarity index 100% rename from tools/dkr_decompressor_src/DKRCompression.cpp rename to tools/dkr_assets_tool_classes/libs/DKRCompression.cpp diff --git a/tools/dkr_decompressor_src/DKRCompression.h b/tools/dkr_assets_tool_classes/libs/DKRCompression.h old mode 100755 new mode 100644 similarity index 87% rename from tools/dkr_decompressor_src/DKRCompression.h rename to tools/dkr_assets_tool_classes/libs/DKRCompression.h index 4283f15c..b387d595 --- a/tools/dkr_decompressor_src/DKRCompression.h +++ b/tools/dkr_assets_tool_classes/libs/DKRCompression.h @@ -8,8 +8,8 @@ #include "DKRGzip.h" // C++17 -#include -namespace fs = std::experimental::filesystem; +#include +namespace fs = std::filesystem; class DKRCompression { diff --git a/tools/dkr_decompressor_src/DKRGzip.c b/tools/dkr_assets_tool_classes/libs/DKRGzip.c old mode 100755 new mode 100644 similarity index 100% rename from tools/dkr_decompressor_src/DKRGzip.c rename to tools/dkr_assets_tool_classes/libs/DKRGzip.c diff --git a/tools/dkr_decompressor_src/DKRGzip.h b/tools/dkr_assets_tool_classes/libs/DKRGzip.h old mode 100755 new mode 100644 similarity index 100% rename from tools/dkr_decompressor_src/DKRGzip.h rename to tools/dkr_assets_tool_classes/libs/DKRGzip.h diff --git a/tools/dkr_decompressor_src/GECompression.cpp b/tools/dkr_assets_tool_classes/libs/GECompression.cpp old mode 100755 new mode 100644 similarity index 100% rename from tools/dkr_decompressor_src/GECompression.cpp rename to tools/dkr_assets_tool_classes/libs/GECompression.cpp diff --git a/tools/dkr_decompressor_src/GECompression.h b/tools/dkr_assets_tool_classes/libs/GECompression.h old mode 100755 new mode 100644 similarity index 100% rename from tools/dkr_decompressor_src/GECompression.h rename to tools/dkr_assets_tool_classes/libs/GECompression.h diff --git a/tools/dkr_extractor_classes/ThreadPool.h b/tools/dkr_assets_tool_classes/libs/ThreadPool.h similarity index 99% rename from tools/dkr_extractor_classes/ThreadPool.h rename to tools/dkr_assets_tool_classes/libs/ThreadPool.h index 41832030..3c051dc3 100644 --- a/tools/dkr_extractor_classes/ThreadPool.h +++ b/tools/dkr_assets_tool_classes/libs/ThreadPool.h @@ -95,4 +95,4 @@ inline ThreadPool::~ThreadPool() worker.join(); } -#endif +#endif \ No newline at end of file diff --git a/tools/dkr_assets_tool_classes/libs/calculator.hpp b/tools/dkr_assets_tool_classes/libs/calculator.hpp new file mode 100644 index 00000000..ceb405f8 --- /dev/null +++ b/tools/dkr_assets_tool_classes/libs/calculator.hpp @@ -0,0 +1,462 @@ +/// +/// @file calculator.hpp +/// @brief calculator::eval(const std::string&) evaluates an integer +/// arithmetic expression and returns the result. If an error +/// occurs a calculator::error exception is thrown. +/// +/// @author Kim Walisch, +/// @copyright Copyright (C) 2013-2018 Kim Walisch +/// @license BSD 2-Clause, https://opensource.org/licenses/BSD-2-Clause +/// @version 1.4 +/// +/// == Supported operators == +/// +/// OPERATOR NAME ASSOCIATIVITY PRECEDENCE +/// +/// | Bitwise Inclusive OR Left 4 +/// ^ Bitwise Exclusive OR Left 5 +/// & Bitwise AND Left 6 +/// << Shift Left Left 9 +/// >> Shift Right Left 9 +/// + Addition Left 10 +/// - Subtraction Left 10 +/// * Multiplication Left 20 +/// / Division Left 20 +/// % Modulo Left 20 +/// ** Raise to power Right 30 +/// e, E Scientific notation Right 40 +/// ~ Unary complement Left 99 +/// +/// The operator precedence has been set according to (uses the C and +/// C++ operator precedence): https://en.wikipedia.org/wiki/Order_of_operations +/// Operators with higher precedence are evaluated before operators +/// with relatively lower precedence. Unary operators are set to have +/// the highest precedence, this is not strictly correct for the power +/// operator e.g. "-3**2" = 9 but a lot of software tools (Bash shell, +/// Microsoft Excel, GNU bc, ...) use the same convention. +/// +/// == Examples of valid expressions == +/// +/// "65536 >> 15" = 2 +/// "2**16" = 65536 +/// "(0 + 0xDf234 - 1000)*3/2%999" = 828 +/// "-(2**2**2**2)" = -65536 +/// "(0 + ~(0xDF234 & 1000) *3) /-2" = 817 +/// "(2**16) + (1 << 16) >> 0X5" = 4096 +/// "5*-(2**(9+7))/3+5*(1 & 0xFf123)" = -109221 +/// +/// == About the algorithm used == +/// +/// calculator::eval(std::string&) relies on the ExpressionParser +/// class which is a simple C++ operator precedence parser with infix +/// notation for integer arithmetic expressions. +/// ExpressionParser has its roots in a JavaScript parser published +/// at: http://stackoverflow.com/questions/28256/equation-expression-parser-with-precedence/114961#114961 +/// The same author has also published an article about his operator +/// precedence algorithm at PerlMonks: +/// http://www.perlmonks.org/?node_id=554516 +/// + +#ifndef CALCULATOR_HPP +#define CALCULATOR_HPP + +#include +#include +#include +#include +#include +#include + +namespace calculator +{ + +/// calculator::eval() throws a calculator::error if it fails +/// to evaluate the expression string. +/// +class error : public std::runtime_error +{ +public: + error(const std::string& expr, const std::string& message) + : std::runtime_error(message), + expr_(expr) + { } +#if __cplusplus < 201103L + ~error() throw() { } +#endif + std::string expression() const + { + return expr_; + } +private: + std::string expr_; +}; + +template +class ExpressionParser +{ +public: + /// Evaluate an integer arithmetic expression and return its result. + /// @throw error if parsing fails. + /// + T eval(const std::string& expr) + { + T result = 0; + index_ = 0; + expr_ = expr; + try + { + result = parseExpr(); + if (!isEnd()) + unexpected(); + } + catch (const calculator::error&) + { + while(!stack_.empty()) + stack_.pop(); + throw; + } + return result; + } + + /// Get the integer value of a character. + T eval(char c) + { + std::string expr(1, c); + return eval(expr); + } + +private: + enum + { + OPERATOR_NULL, + OPERATOR_BITWISE_OR, /// | + OPERATOR_BITWISE_XOR, /// ^ + OPERATOR_BITWISE_AND, /// & + OPERATOR_BITWISE_SHL, /// << + OPERATOR_BITWISE_SHR, /// >> + OPERATOR_ADDITION, /// + + OPERATOR_SUBTRACTION, /// - + OPERATOR_MULTIPLICATION, /// * + OPERATOR_DIVISION, /// / + OPERATOR_MODULO, /// % + OPERATOR_POWER, /// ** + OPERATOR_EXPONENT /// e, E + }; + + struct Operator + { + /// Operator, one of the OPERATOR_* enum definitions + int op; + int precedence; + /// 'L' = left or 'R' = right + int associativity; + Operator(int opr, int prec, int assoc) : + op(opr), + precedence(prec), + associativity(assoc) + { } + }; + + struct OperatorValue + { + Operator op; + T value; + OperatorValue(const Operator& opr, T val) : + op(opr), + value(val) + { } + int getPrecedence() const + { + return op.precedence; + } + bool isNull() const + { + return op.op == OPERATOR_NULL; + } + }; + + /// Expression string + std::string expr_; + /// Current expression index, incremented whilst parsing + std::size_t index_; + /// The current operator and its left value + /// are pushed onto the stack if the operator on + /// top of the stack has lower precedence. + std::stack stack_; + + /// Exponentiation by squaring, x^n. + static T pow(T x, T n) + { + T res = 1; + + while (n > 0) + { + if (n % 2 != 0) + { + res *= x; + n -= 1; + } + n /= 2; + + if (n > 0) + x *= x; + } + + return res; + } + + + T checkZero(T value) const + { + if (value == 0) + { + std::string divOperators("/%"); + std::size_t division = expr_.find_last_of(divOperators, index_ - 2); + std::ostringstream msg; + msg << "Parser error: division by 0"; + if (division != std::string::npos) + msg << " (error token is \"" + << expr_.substr(division, expr_.size() - division) + << "\")"; + throw calculator::error(expr_, msg.str()); + } + return value; + } + + T calculate(T v1, T v2, const Operator& op) const + { + switch (op.op) + { + case OPERATOR_BITWISE_OR: return v1 | v2; + case OPERATOR_BITWISE_XOR: return v1 ^ v2; + case OPERATOR_BITWISE_AND: return v1 & v2; + case OPERATOR_BITWISE_SHL: return v1 << v2; + case OPERATOR_BITWISE_SHR: return v1 >> v2; + case OPERATOR_ADDITION: return v1 + v2; + case OPERATOR_SUBTRACTION: return v1 - v2; + case OPERATOR_MULTIPLICATION: return v1 * v2; + case OPERATOR_DIVISION: return v1 / checkZero(v2); + case OPERATOR_MODULO: return v1 % checkZero(v2); + case OPERATOR_POWER: return pow(v1, v2); + case OPERATOR_EXPONENT: return v1 * pow(10, v2); + default: return 0; + } + } + + bool isEnd() const + { + return index_ >= expr_.size(); + } + + /// Returns the character at the current expression index or + /// 0 if the end of the expression is reached. + /// + char getCharacter() const + { + if (!isEnd()) + return expr_[index_]; + return 0; + } + + /// Parse str at the current expression index. + /// @throw error if parsing fails. + /// + void expect(const std::string& str) + { + if (expr_.compare(index_, str.size(), str) != 0) + unexpected(); + index_ += str.size(); + } + + void unexpected() const + { + std::ostringstream msg; + msg << "Syntax error: unexpected token \"" + << expr_.substr(index_, expr_.size() - index_) + << "\" at index " + << index_; + throw calculator::error(expr_, msg.str()); + } + + /// Eat all white space characters at the + /// current expression index. + /// + void eatSpaces() + { + while (std::isspace(getCharacter()) != 0) + index_++; + } + + /// Parse a binary operator at the current expression index. + /// @return Operator with precedence and associativity. + /// + Operator parseOp() + { + eatSpaces(); + switch (getCharacter()) + { + case '|': index_++; return Operator(OPERATOR_BITWISE_OR, 4, 'L'); + case '^': index_++; return Operator(OPERATOR_BITWISE_XOR, 5, 'L'); + case '&': index_++; return Operator(OPERATOR_BITWISE_AND, 6, 'L'); + case '<': expect("<<"); return Operator(OPERATOR_BITWISE_SHL, 9, 'L'); + case '>': expect(">>"); return Operator(OPERATOR_BITWISE_SHR, 9, 'L'); + case '+': index_++; return Operator(OPERATOR_ADDITION, 10, 'L'); + case '-': index_++; return Operator(OPERATOR_SUBTRACTION, 10, 'L'); + case '/': index_++; return Operator(OPERATOR_DIVISION, 20, 'L'); + case '%': index_++; return Operator(OPERATOR_MODULO, 20, 'L'); + case '*': index_++; if (getCharacter() != '*') + return Operator(OPERATOR_MULTIPLICATION, 20, 'L'); + index_++; return Operator(OPERATOR_POWER, 30, 'R'); + case 'e': index_++; return Operator(OPERATOR_EXPONENT, 40, 'R'); + case 'E': index_++; return Operator(OPERATOR_EXPONENT, 40, 'R'); + default : return Operator(OPERATOR_NULL, 0, 'L'); + } + } + + static T toInteger(char c) + { + if (c >= '0' && c <= '9') return c -'0'; + if (c >= 'a' && c <= 'f') return c -'a' + 0xa; + if (c >= 'A' && c <= 'F') return c -'A' + 0xa; + T noDigit = 0xf + 1; + return noDigit; + } + + T getInteger() const + { + return toInteger(getCharacter()); + } + + T parseDecimal() + { + T value = 0; + for (T d; (d = getInteger()) <= 9; index_++) + value = value * 10 + d; + return value; + } + + T parseHex() + { + index_ = index_ + 2; + T value = 0; + for (T h; (h = getInteger()) <= 0xf; index_++) + value = value * 0x10 + h; + return value; + } + + bool isHex() const + { + if (index_ + 2 < expr_.size()) + { + char x = expr_[index_ + 1]; + char h = expr_[index_ + 2]; + return (std::tolower(x) == 'x' && toInteger(h) <= 0xf); + } + return false; + } + + /// Parse an integer value at the current expression index. + /// The unary `+', `-' and `~' operators and opening + /// parentheses `(' cause recursion. + /// + T parseValue() + { + T val = 0; + eatSpaces(); + switch (getCharacter()) + { + case '0': if (isHex()) + val = parseHex(); + else + val = parseDecimal(); + break; + case '1': case '2': case '3': case '4': case '5': + case '6': case '7': case '8': case '9': + val = parseDecimal(); + break; + case '(': index_++; + val = parseExpr(); + eatSpaces(); + if (getCharacter() != ')') + { + if (!isEnd()) + unexpected(); + throw calculator::error(expr_, "Syntax error: `)' expected at end of expression"); + } + index_++; break; + case '~': index_++; val = ~parseValue(); break; + case '+': index_++; val = parseValue(); break; + case '-': index_++; val = parseValue() * static_cast(-1); + break; + default : if (!isEnd()) + unexpected(); + throw calculator::error(expr_, "Syntax error: value expected at end of expression"); + } + return val; + } + + /// Parse all operations of the current parenthesis + /// level and the levels above, when done + /// return the result (value). + /// + T parseExpr() + { + stack_.push(OperatorValue(Operator(OPERATOR_NULL, 0, 'L'), 0)); + // first parse value on the left + T value = parseValue(); + + while (!stack_.empty()) + { + // parse an operator (+, -, *, ...) + Operator op(parseOp()); + while (op.precedence < stack_.top().getPrecedence() || ( + op.precedence == stack_.top().getPrecedence() && + op.associativity == 'L')) + { + // end reached + if (stack_.top().isNull()) + { + stack_.pop(); + return value; + } + // do the calculation ("reduce"), producing a new value + value = calculate(stack_.top().value, value, stack_.top().op); + stack_.pop(); + } + + // store on stack_ and continue parsing ("shift") + stack_.push(OperatorValue(op, value)); + // parse value on the right + value = parseValue(); + } + return 0; + } +}; + +template +inline T eval(const std::string& expression) +{ + ExpressionParser parser; + return parser.eval(expression); +} + +template +inline T eval(char c) +{ + ExpressionParser parser; + return parser.eval(c); +} + +inline int eval(const std::string& expression) +{ + return eval(expression); +} + +inline int eval(char c) +{ + return eval(c); +} + +} // namespace calculator + +#endif diff --git a/tools/json/json.hpp b/tools/dkr_assets_tool_classes/libs/json.hpp similarity index 83% rename from tools/json/json.hpp rename to tools/dkr_assets_tool_classes/libs/json.hpp index 5d31b9fb..c5cd9a71 100644 --- a/tools/json/json.hpp +++ b/tools/dkr_assets_tool_classes/libs/json.hpp @@ -39,6 +39,19 @@ namespace { } return std::move( output ); } + + enum JsonSaveType { + SaveNull, // 0 + SaveInt, // 1 + SaveFloat, // 2 + SaveTrue, // 3 + SaveFalse, // 4 + SaveArray, // 5 + SaveArrayEnd, // 6 + SaveObject, // 7 + SaveObjectEnd, // 8 + SaveString, // 9 + }; } class JSON @@ -168,13 +181,19 @@ class JSON ~JSON() { switch( Type ) { case Class::Array: - delete Internal.List; + if(Internal.List != nullptr) { + delete Internal.List; + } break; case Class::Object: - delete Internal.Map; + if(Internal.Map != nullptr) { + delete Internal.Map; + } break; case Class::String: - delete Internal.String; + if(Internal.String != nullptr) { + delete Internal.String; + } break; default:; } @@ -201,6 +220,8 @@ class JSON static JSON Load( const string & ); + static JSON LoadFromCached(std::vector &cached, int &p); + template void append( T arg ) { SetType( Class::Array ); Internal.List->emplace_back( arg ); @@ -269,6 +290,10 @@ class JSON return Internal.Map->find( key ) != Internal.Map->end(); return false; } + + void erase( const string &key ) const { + Internal.Map->erase(key); + } int size() const { if( Type == Class::Object ) @@ -279,6 +304,49 @@ class JSON return -1; } + void save_string(std::vector &out, std::string value) const { + for(int i = 0; i < value.length(); i++) out.push_back((uint8_t)value.at(i)); + out.push_back(0); // Null terminator for strings. + } + + void save(std::vector &out) const { + switch( Type ) { + case Class::Null: + out.push_back(SaveNull); + break; + case Class::Integral: + out.push_back(SaveInt); + for(int i = 0; i < 8; i++) out.push_back((Internal.Int >> ((7 - i) * 8)) & 0xFF); + break; + case Class::Floating: + out.push_back(SaveFloat); + for(int i = 0; i < 8; i++) out.push_back((*((long*)&Internal.Float) >> ((7 - i) * 8)) & 0xFF); + break; + case Class::Boolean: + out.push_back(Internal.Bool ? SaveTrue : SaveFalse); + break; + case Class::Array: + out.push_back(SaveArray); + for(int i = 0; i < length(); i++) { + Internal.List->at(i).save(out); + } + out.push_back(SaveArrayEnd); + break; + case Class::Object: + out.push_back(SaveObject); + for(auto &entry : ObjectRange()) { + save_string(out, entry.first); + entry.second.save(out); + } + out.push_back(SaveObjectEnd); + break; + case Class::String: + out.push_back(SaveString); + save_string(out, *Internal.String); + break; + } + } + Class JSONType() const { return Type; } /// Functions for getting primitives from the JSON object. @@ -645,4 +713,61 @@ inline JSON JSON::Load( const string &str ) { return std::move( parse_next( str, offset ) ); } +inline std::string cached_read_string(std::vector &cached, int &p) { + std::string value((char*)&cached[p++]); + while(cached[p++] != 0); // Advance past the null terminator + return value; +} + +inline JSON JSON::LoadFromCached(std::vector &cached, int &p) { + JSON json; + + int saveType = cached[p++]; + + switch(saveType) { + case SaveNull: + break; + case SaveInt: + { + long val = 0; + for(int i = 0; i < 8; i++) val |= cached[p++] << (7 - i) * 8; + json = val; + } + break; + case SaveFloat: + { + double val = 0; + for(int i = 0; i < 8; i++) *((long*)&val) |= cached[p++] << (7 - i) * 8; + json = val; + } + break; + case SaveTrue: + json = true; + break; + case SaveFalse: + json = true; + break; + case SaveArray: + json = JSON::Make( JSON::Class::Array ); + while(cached[p] != SaveArrayEnd) { + json.append(LoadFromCached(cached, p)); + } + p++; + break; + case SaveObject: + json = JSON::Make( JSON::Class::Object ); + while(cached[p] != SaveObjectEnd) { + std::string key = cached_read_string(cached, p); + json[key] = LoadFromCached(cached, p); + } + p++; + break; + case SaveString: + json = cached_read_string(cached, p); + break; + } + + return json; +} + } // End Namespace json diff --git a/tools/dkr_assets_tool_classes/libs/n64graphics-utils.c b/tools/dkr_assets_tool_classes/libs/n64graphics-utils.c new file mode 100644 index 00000000..6bfb526c --- /dev/null +++ b/tools/dkr_assets_tool_classes/libs/n64graphics-utils.c @@ -0,0 +1,276 @@ +#include +#include +#include +#include +#include +#include +#include +#if defined(_MSC_VER) || defined(__MINGW32__) + #include + #include +#else + #include + #include +#endif + +#include "n64graphics-utils.h" + +// global verbosity setting +int g_verbosity = 0; + +int read_s16_be(unsigned char *buf) +{ + unsigned tmp = read_u16_be(buf); + int ret; + if (tmp > 0x7FFF) { + ret = -((int)0x10000 - (int)tmp); + } else { + ret = (int)tmp; + } + return ret; +} + +float read_f32_be(unsigned char *buf) +{ + union {uint32_t i; float f;} ret; + ret.i = read_u32_be(buf); + return ret.f; +} + +int is_power2(unsigned int val) +{ + while (((val & 1) == 0) && (val > 1)) { + val >>= 1; + } + return (val == 1); +} + +void fprint_hex(FILE *fp, const unsigned char *buf, int length) +{ + int i; + for (i = 0; i < length; i++) { + fprint_byte(fp, buf[i]); + fputc(' ', fp); + } +} + +void fprint_hex_source(FILE *fp, const unsigned char *buf, int length) +{ + int i; + for (i = 0; i < length; i++) { + if (i > 0) fputs(", ", fp); + fputs("0x", fp); + fprint_byte(fp, buf[i]); + } +} + +void print_hex(const unsigned char *buf, int length) +{ + fprint_hex(stdout, buf, length); +} + +void swap_bytes(unsigned char *data, long length) +{ + long i; + unsigned char tmp; + for (i = 0; i < length; i += 2) { + tmp = data[i]; + data[i] = data[i+1]; + data[i+1] = tmp; + } +} + +void reverse_endian(unsigned char *data, long length) +{ + long i; + unsigned char tmp; + for (i = 0; i < length; i += 4) { + tmp = data[i]; + data[i] = data[i+3]; + data[i+3] = tmp; + tmp = data[i+1]; + data[i+1] = data[i+2]; + data[i+2] = tmp; + } +} + +long filesize(const char *filename) +{ + struct stat st; + + if (stat(filename, &st) == 0) { + return st.st_size; + } + + return -1; +} + +void touch_file(const char *filename) +{ + int fd; + //fd = open(filename, O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK, 0666); + fd = open(filename, O_WRONLY|O_CREAT, 0666); + if (fd >= 0) { + utime(filename, NULL); + close(fd); + } +} + +long read_file(const char *file_name, unsigned char **data) +{ + FILE *in; + unsigned char *in_buf = NULL; + long file_size; + long bytes_read; + in = fopen(file_name, "rb"); + if (in == NULL) { + return -1; + } + + // allocate buffer to read from offset to end of file + fseek(in, 0, SEEK_END); + file_size = ftell(in); + + // sanity check + if (file_size > 256*MB) { + return -2; + } + + in_buf = (unsigned char *)malloc(file_size); + fseek(in, 0, SEEK_SET); + + // read bytes + bytes_read = fread(in_buf, 1, file_size, in); + if (bytes_read != file_size) { + return -3; + } + + fclose(in); + *data = in_buf; + return bytes_read; +} + +long write_file(const char *file_name, unsigned char *data, long length) +{ + FILE *out; + long bytes_written; + // open output file + out = fopen(file_name, "wb"); + if (out == NULL) { + perror(file_name); + return -1; + } + bytes_written = fwrite(data, 1, length, out); + fclose(out); + return bytes_written; +} + +void generate_filename(const char *in_name, char *out_name, char *extension) +{ + char tmp_name[FILENAME_MAX]; + int len; + int i; + strcpy(tmp_name, in_name); + len = strlen(tmp_name); + for (i = len - 1; i > 0; i--) { + if (tmp_name[i] == '.') { + break; + } + } + if (i <= 0) { + i = len; + } + tmp_name[i] = '\0'; + sprintf(out_name, "%s.%s", tmp_name, extension); +} + +char *basename_(const char *name) +{ + const char *base = name; + while (*name) { + if (*name++ == '/') { + base = name; + } + } + return (char *)base; +} + +void make_dir(const char *dir_name) +{ + struct stat st = {0}; + if (stat(dir_name, &st) == -1) { + mkdir(dir_name, 0755); + } +} + +long copy_file(const char *src_name, const char *dst_name) +{ + unsigned char *buf; + long bytes_written; + long bytes_read; + + bytes_read = read_file(src_name, &buf); + + if (bytes_read > 0) { + bytes_written = write_file(dst_name, buf, bytes_read); + if (bytes_written != bytes_read) { + bytes_read = -1; + } + free(buf); + } + + return bytes_read; +} + +void dir_list_ext(const char *dir, const char *extension, dir_list *list) +{ + char *pool; + char *pool_ptr; + struct dirent *entry; + DIR *dfd; + int idx; + + dfd = opendir(dir); + if (dfd == NULL) { + ERROR("Can't open '%s'\n", dir); + exit(1); + } + + pool = (char *)malloc(FILENAME_MAX * MAX_DIR_FILES); + pool_ptr = pool; + + idx = 0; + while ((entry = readdir(dfd)) != NULL && idx < MAX_DIR_FILES) { + if (!extension || str_ends_with(entry->d_name, extension)) { + sprintf(pool_ptr, "%s/%s", dir, entry->d_name); + list->files[idx] = pool_ptr; + pool_ptr += strlen(pool_ptr) + 1; + idx++; + } + } + list->count = idx; + + closedir(dfd); +} + +void dir_list_free(dir_list *list) +{ + // assume first entry in array is allocated + if (list->files[0]) { + free(list->files[0]); + list->files[0] = NULL; + } +} + +int str_ends_with(const char *str, const char *suffix) +{ + if (!str || !suffix) { + return 0; + } + size_t len_str = strlen(str); + size_t len_suffix = strlen(suffix); + if (len_suffix > len_str) { + return 0; + } + return (0 == strncmp(str + len_str - len_suffix, suffix, len_suffix)); +} diff --git a/tools/dkr_assets_tool_classes/libs/n64graphics-utils.h b/tools/dkr_assets_tool_classes/libs/n64graphics-utils.h new file mode 100644 index 00000000..b66116a5 --- /dev/null +++ b/tools/dkr_assets_tool_classes/libs/n64graphics-utils.h @@ -0,0 +1,153 @@ +#ifndef UTILS_H_ +#define UTILS_H_ + +#include + +// defines + +// printing size_t varies by compiler +#if defined(_MSC_VER) || defined(__MINGW32__) + #define SIZE_T_FORMAT "%Iu" +#else + #define SIZE_T_FORMAT "%zu" +#endif + +#define KB 1024 +#define MB (1024 * KB) + +// number of elements in statically declared array +#define DIM(S_ARR_) (sizeof(S_ARR_) / sizeof(S_ARR_[0])) + +#define MIN(A_, B_) ((A_) < (B_) ? (A_) : (B_)) +#define MAX(A_, B_) ((A_) > (B_) ? (A_) : (B_)) + +// align value to N-byte boundary +#define ALIGN(VAL_, ALIGNMENT_) (((VAL_) + ((ALIGNMENT_) - 1)) & ~((ALIGNMENT_) - 1)) + +// read/write u32/16 big/little endian +#define read_u32_be(buf) (unsigned int)(((buf)[0] << 24) + ((buf)[1] << 16) + ((buf)[2] << 8) + ((buf)[3])) +#define read_u32_le(buf) (unsigned int)(((buf)[1] << 24) + ((buf)[0] << 16) + ((buf)[3] << 8) + ((buf)[2])) +#define write_u32_be(buf, val) do { \ + (buf)[0] = ((val) >> 24) & 0xFF; \ + (buf)[1] = ((val) >> 16) & 0xFF; \ + (buf)[2] = ((val) >> 8) & 0xFF; \ + (buf)[3] = (val) & 0xFF; \ +} while(0) +#define read_u16_be(buf) (((buf)[0] << 8) + ((buf)[1])) +#define write_u16_be(buf, val) do { \ + (buf)[0] = ((val) >> 8) & 0xFF; \ + (buf)[1] = ((val)) & 0xFF; \ +} while(0) + +// print nibbles and bytes +#define fprint_nibble(FP, NIB_) fputc((NIB_) < 10 ? ('0' + (NIB_)) : ('A' + (NIB_) - 0xA), FP) +#define fprint_byte(FP, BYTE_) do { \ + fprint_nibble(FP, (BYTE_) >> 4); \ + fprint_nibble(FP, (BYTE_) & 0x0F); \ + } while(0) +#define print_nibble(NIB_) fprint_nibble(stdout, NIB_) +#define print_byte(BYTE_) fprint_byte(stdout, BYTE_) + +// Windows compatibility +#if defined(_MSC_VER) || defined(__MINGW32__) + #include + #define mkdir(DIR_, PERM_) _mkdir(DIR_) + #ifndef strcasecmp + #define strcasecmp(A, B) stricmp(A, B) + #endif +#endif + +// typedefs + +#define MAX_DIR_FILES 128 +typedef struct +{ + char *files[MAX_DIR_FILES]; + int count; +} dir_list; + +// global verbosity setting +extern int g_verbosity; + +#define ERROR(...) fprintf(stderr, __VA_ARGS__) +#define INFO(...) if (g_verbosity) printf(__VA_ARGS__) +#define INFO_HEX(...) if (g_verbosity) print_hex(__VA_ARGS__) + +// functions + +// convert two bytes in big-endian to signed int +int read_s16_be(unsigned char *buf); + +// convert four bytes in big-endian to float +float read_f32_be(unsigned char *buf); + +// determine if value is power of 2 +// returns 1 if val is power of 2, 0 otherwise +int is_power2(unsigned int val); + +// print buffer as hex bytes +// fp: file pointer +// buf: buffer to read bytes from +// length: length of buffer to print +void fprint_hex(FILE *fp, const unsigned char *buf, int length); +void fprint_hex_source(FILE *fp, const unsigned char *buf, int length); +void print_hex(const unsigned char *buf, int length); + +// perform byteswapping to convert from v64 to z64 ordering +void swap_bytes(unsigned char *data, long length); + +// reverse endian to convert from n64 to z64 ordering +void reverse_endian(unsigned char *data, long length); + +// get size of file without opening it; +// returns file size or negative on error +long filesize(const char *file_name); + +// update file timestamp to now, creating it if it doesn't exist +void touch_file(const char *filename); + +// read entire contents of file into buffer +// returns file size or negative on error +long read_file(const char *file_name, unsigned char **data); + +// write buffer to file +// returns number of bytes written out or -1 on failure +long write_file(const char *file_name, unsigned char *data, long length); + +// generate an output file name from input name by replacing file extension +// in_name: input file name +// out_name: buffer to write output name in +// extension: new file extension to use +void generate_filename(const char *in_name, char *out_name, char *extension); + +// extract base filename from file path +// name: path to file +// returns just the file name after the last '/' +char *basename_(const char *name); + +// make a directory if it doesn't exist +// dir_name: name of the directory +void make_dir(const char *dir_name); + +// copy a file from src_name to dst_name. will not make directories +// src_name: source file name +// dst_name: destination file name +long copy_file(const char *src_name, const char *dst_name); + +// list a directory, optionally filtering files by extension +// dir: directory to list files in +// extension: extension to filter files by (NULL if no filtering) +// list: output list and count +void dir_list_ext(const char *dir, const char *extension, dir_list *list); + +// free associated date from a directory list +// list: directory list filled in by dir_list_ext() call +void dir_list_free(dir_list *list); + +// determine if a string ends with another string +// str: string to check if ends with 'suffix' +// suffix: string to see if 'str' ends with +// returns 1 if 'str' ends with 'suffix' +int str_ends_with(const char *str, const char *suffix); + +#endif // UTILS_H_ diff --git a/tools/dkr_assets_tool_classes/libs/n64graphics.c b/tools/dkr_assets_tool_classes/libs/n64graphics.c new file mode 100644 index 00000000..90ea13c6 --- /dev/null +++ b/tools/dkr_assets_tool_classes/libs/n64graphics.c @@ -0,0 +1,1021 @@ +#include +#include +#include + +#define STBI_NO_LINEAR +#define STBI_NO_HDR +#define STBI_NO_TGA +#define STB_IMAGE_IMPLEMENTATION +#include "stb_image.h" +#define STB_IMAGE_WRITE_IMPLEMENTATION +#include "stb_image_write.h" + +#include "n64graphics.h" +#include "n64graphics-utils.h" + +// SCALE_M_N: upscale/downscale M-bit integer to N-bit +#define SCALE_5_8(VAL_) (((VAL_) * 0xFF) / 0x1F) +#define SCALE_8_5(VAL_) ((((VAL_) + 4) * 0x1F) / 0xFF) +#define SCALE_4_8(VAL_) ((VAL_) * 0x11) +#define SCALE_8_4(VAL_) ((VAL_) / 0x11) +#define SCALE_3_8(VAL_) ((VAL_) * 0x24) +#define SCALE_8_3(VAL_) ((VAL_) / 0x24) + + +typedef struct +{ + enum + { + IMG_FORMAT_RGBA, + IMG_FORMAT_IA, + IMG_FORMAT_I, + IMG_FORMAT_CI, + } format; + int depth; +} img_format; + +//--------------------------------------------------------- +// N64 RGBA/IA/I/CI -> internal RGBA/IA +//--------------------------------------------------------- + +rgba *raw2rgba(const uint8_t *raw, int width, int height, int depth) +{ + rgba *img; + int img_size; + + img_size = width * height * sizeof(*img); + img = (rgba *)malloc(img_size); + if (!img) { + ERROR("Error allocating %d bytes\n", img_size); + return NULL; + } + + if (depth == 16) { + for (int i = 0; i < width * height; i++) { + img[i].red = SCALE_5_8((raw[i*2] & 0xF8) >> 3); + img[i].green = SCALE_5_8(((raw[i*2] & 0x07) << 2) | ((raw[i*2+1] & 0xC0) >> 6)); + img[i].blue = SCALE_5_8((raw[i*2+1] & 0x3E) >> 1); + img[i].alpha = (raw[i*2+1] & 0x01) ? 0xFF : 0x00; + } + } else if (depth == 32) { + for (int i = 0; i < width * height; i++) { + img[i].red = raw[i*4]; + img[i].green = raw[i*4+1]; + img[i].blue = raw[i*4+2]; + img[i].alpha = raw[i*4+3]; + } + } + + return img; +} + +ia *raw2ia(const uint8_t *raw, int width, int height, int depth) +{ + ia *img; + int img_size; + + img_size = width * height * sizeof(*img); + img = (ia *)malloc(img_size); + if (!img) { + ERROR("Error allocating %u bytes\n", img_size); + return NULL; + } + + switch (depth) { + case 16: + for (int i = 0; i < width * height; i++) { + img[i].intensity = raw[i*2]; + img[i].alpha = raw[i*2+1]; + } + break; + case 8: + for (int i = 0; i < width * height; i++) { + img[i].intensity = SCALE_4_8((raw[i] & 0xF0) >> 4); + img[i].alpha = SCALE_4_8(raw[i] & 0x0F); + } + break; + case 4: + for (int i = 0; i < width * height; i++) { + uint8_t bits; + bits = raw[i/2]; + if (i % 2) { + bits &= 0xF; + } else { + bits >>= 4; + } + img[i].intensity = SCALE_3_8((bits >> 1) & 0x07); + img[i].alpha = (bits & 0x01) ? 0xFF : 0x00; + } + break; + case 1: + for (int i = 0; i < width * height; i++) { + uint8_t bits; + uint8_t mask; + bits = raw[i/8]; + mask = 1 << (7 - (i % 8)); // MSb->LSb + bits = (bits & mask) ? 0xFF : 0x00; + img[i].intensity = bits; + img[i].alpha = bits; + } + break; + default: + ERROR("Error invalid depth %d\n", depth); + break; + } + + return img; +} + +ia *raw2i(const uint8_t *raw, int width, int height, int depth) +{ + ia *img = NULL; + int img_size; + + img_size = width * height * sizeof(*img); + img = (ia *)malloc(img_size); + if (!img) { + ERROR("Error allocating %u bytes\n", img_size); + return NULL; + } + + switch (depth) { + case 8: + for (int i = 0; i < width * height; i++) { + img[i].intensity = raw[i]; + img[i].alpha = 0xFF; + } + break; + case 4: + for (int i = 0; i < width * height; i++) { + uint8_t bits; + bits = raw[i/2]; + if (i % 2) { + bits &= 0xF; + } else { + bits >>= 4; + } + img[i].intensity = SCALE_4_8(bits); + img[i].alpha = img[i].intensity; // alpha copy intensity + // TODO: modes + // img[i].alpha = 0xFF; // alpha = 1 + // img[i].alpha = img[i].intensity ? 0xFF : 0x00; // binary + } + break; + default: + ERROR("Error invalid depth %d\n", depth); + break; + } + + return img; +} + +// convert CI raw data and palette to raw data (either RGBA16 or IA16) +uint8_t *ci2raw(const uint8_t *rawci, const uint8_t *palette, int width, int height, int ci_depth) +{ + uint8_t *raw; + int raw_size; + + // first convert to raw RGBA + raw_size = sizeof(uint16_t) * width * height; + raw = (uint8_t *)malloc(raw_size); + if (!raw) { + ERROR("Error allocating %u bytes\n", raw_size); + return NULL; + } + + for (int i = 0; i < width * height; i++) { + int pal_idx = rawci[i]; + if (ci_depth == 4) { + int byte_idx = i / 2; + int nibble = 1 - (i % 2); + int shift = 4 * nibble; + pal_idx = (rawci[byte_idx] >> shift) & 0xF; + } + raw[2*i] = palette[2*pal_idx]; + raw[2*i+1] = palette[2*pal_idx+1]; + } + + return raw; +} + + +//--------------------------------------------------------- +// internal RGBA/IA -> N64 RGBA/IA/I/CI +// returns length written to 'raw' used or -1 on error +//--------------------------------------------------------- + +int rgba2raw(uint8_t *raw, const rgba *img, int width, int height, int depth) +{ + int size = (width * height * depth + 7) / 8; + INFO("Converting RGBA%d %dx%d to raw\n", depth, width, height); + + if (depth == 16) { + for (int i = 0; i < width * height; i++) { + uint8_t r, g, b, a; + r = SCALE_8_5(img[i].red); + g = SCALE_8_5(img[i].green); + b = SCALE_8_5(img[i].blue); + a = img[i].alpha ? 0x1 : 0x0; + raw[i*2] = (r << 3) | (g >> 2); + raw[i*2+1] = ((g & 0x3) << 6) | (b << 1) | a; + } + } else if (depth == 32) { + for (int i = 0; i < width * height; i++) { + raw[i*4] = img[i].red; + raw[i*4+1] = img[i].green; + raw[i*4+2] = img[i].blue; + raw[i*4+3] = img[i].alpha; + } + } else { + ERROR("Error invalid depth %d\n", depth); + size = -1; + } + + return size; +} + +int ia2raw(uint8_t *raw, const ia *img, int width, int height, int depth) +{ + int size = (width * height * depth + 7) / 8; + INFO("Converting IA%d %dx%d to raw\n", depth, width, height); + + switch (depth) { + case 16: + for (int i = 0; i < width * height; i++) { + raw[i*2] = img[i].intensity; + raw[i*2+1] = img[i].alpha; + } + break; + case 8: + for (int i = 0; i < width * height; i++) { + uint8_t val = SCALE_8_4(img[i].intensity); + uint8_t alpha = SCALE_8_4(img[i].alpha); + raw[i] = (val << 4) | alpha; + } + break; + case 4: + for (int i = 0; i < width * height; i++) { + uint8_t val = SCALE_8_3(img[i].intensity); + uint8_t alpha = img[i].alpha ? 0x01 : 0x00; + uint8_t old = raw[i/2]; + if (i % 2) { + raw[i/2] = (old & 0xF0) | (val << 1) | alpha; + } else { + raw[i/2] = (old & 0x0F) | (((val << 1) | alpha) << 4); + } + } + break; + case 1: + for (int i = 0; i < width * height; i++) { + uint8_t val = img[i].intensity; + uint8_t old = raw[i/8]; + uint8_t bit = 1 << (7 - (i % 8)); + if (val) { + raw[i/8] = old | bit; + } else { + raw[i/8] = old & (~bit); + } + } + break; + default: + ERROR("Error invalid depth %d\n", depth); + size = -1; + break; + } + + return size; +} + +int i2raw(uint8_t *raw, const ia *img, int width, int height, int depth) +{ + int size = (width * height * depth + 7) / 8; + INFO("Converting I%d %dx%d to raw\n", depth, width, height); + + switch (depth) { + case 8: + for (int i = 0; i < width * height; i++) { + raw[i] = img[i].intensity; + } + break; + case 4: + for (int i = 0; i < width * height; i++) { + uint8_t val = SCALE_8_4(img[i].intensity); + uint8_t old = raw[i/2]; + if (i % 2) { + raw[i/2] = (old & 0xF0) | val; + } else { + raw[i/2] = (old & 0x0F) | (val << 4); + } + } + break; + default: + ERROR("Error invalid depth %d\n", depth); + size = -1; + break; + } + + return size; +} + + +//--------------------------------------------------------- +// internal RGBA/IA -> PNG +//--------------------------------------------------------- + +int rgba2png(const char *png_filename, const rgba *img, int width, int height) +{ + int ret = 0; + INFO("Saving RGBA %dx%d to \"%s\"\n", width, height, png_filename); + + // convert to format stb_image_write expects + uint8_t *data = (uint8_t *)malloc(4*width*height); + if (data) { + for (int j = 0; j < height; j++) { + for (int i = 0; i < width; i++) { + int idx = j*width + i; + data[4*idx] = img[idx].red; + data[4*idx + 1] = img[idx].green; + data[4*idx + 2] = img[idx].blue; + data[4*idx + 3] = img[idx].alpha; + } + } + + ret = stbi_write_png(png_filename, width, height, 4, data, 0); + + free(data); + } + + return ret; +} + +int ia2png(const char *png_filename, const ia *img, int width, int height) +{ + int ret = 0; + INFO("Saving IA %dx%d to \"%s\"\n", width, height, png_filename); + + // convert to format stb_image_write expects + uint8_t *data = (uint8_t *)malloc(2*width*height); + if (data) { + for (int j = 0; j < height; j++) { + for (int i = 0; i < width; i++) { + int idx = j*width + i; + data[2*idx] = img[idx].intensity; + data[2*idx + 1] = img[idx].alpha; + } + } + + ret = stbi_write_png(png_filename, width, height, 2, data, 0); + + free(data); + } + + return ret; +} + +//--------------------------------------------------------- +// PNG -> internal RGBA/IA +//--------------------------------------------------------- + +rgba *png2rgba(const char *png_filename, int *width, int *height) +{ + rgba *img = NULL; + int w = 0; + int h = 0; + int channels = 0; + int img_size; + + stbi_uc *data = stbi_load(png_filename, &w, &h, &channels, STBI_default); + if (!data || w <= 0 || h <= 0) { + ERROR("Error loading \"%s\"\n", png_filename); + return NULL; + } + INFO("Read \"%s\" %dx%d channels: %d\n", png_filename, w, h, channels); + + img_size = w * h * sizeof(*img); + img = (rgba *)malloc(img_size); + if (!img) { + ERROR("Error allocating %u bytes\n", img_size); + return NULL; + } + + switch (channels) { + case 3: // red, green, blue + case 4: // red, green, blue, alpha + for (int j = 0; j < h; j++) { + for (int i = 0; i < w; i++) { + int idx = j*w + i; + img[idx].red = data[channels*idx]; + img[idx].green = data[channels*idx + 1]; + img[idx].blue = data[channels*idx + 2]; + if (channels == 4) { + img[idx].alpha = data[channels*idx + 3]; + } else { + img[idx].alpha = 0xFF; + } + } + } + break; + case 2: // grey, alpha + for (int j = 0; j < h; j++) { + for (int i = 0; i < w; i++) { + int idx = j*w + i; + img[idx].red = data[2*idx]; + img[idx].green = data[2*idx]; + img[idx].blue = data[2*idx]; + img[idx].alpha = data[2*idx + 1]; + } + } + break; + default: + ERROR("Don't know how to read channels: %d\n", channels); + free(img); + img = NULL; + } + + // cleanup + stbi_image_free(data); + + *width = w; + *height = h; + return img; +} + +ia *png2ia(const char *png_filename, int *width, int *height) +{ + ia *img = NULL; + int w = 0, h = 0; + int channels = 0; + int img_size; + + stbi_uc *data = stbi_load(png_filename, &w, &h, &channels, STBI_default); + if (!data || w <= 0 || h <= 0) { + ERROR("Error loading \"%s\"\n", png_filename); + return NULL; + } + INFO("Read \"%s\" %dx%d channels: %d\n", png_filename, w, h, channels); + + img_size = w * h * sizeof(*img); + img = (ia *)malloc(img_size); + if (!img) { + ERROR("Error allocating %d bytes\n", img_size); + return NULL; + } + + switch (channels) { + case 3: // red, green, blue + case 4: // red, green, blue, alpha + ERROR("Warning: averaging RGB PNG to create IA\n"); + for (int j = 0; j < h; j++) { + for (int i = 0; i < w; i++) { + int idx = j*w + i; + int sum = data[channels*idx] + data[channels*idx + 1] + data[channels*idx + 2]; + img[idx].intensity = (sum + 1) / 3; // add 1 to round up where appropriate + if (channels == 4) { + img[idx].alpha = data[channels*idx + 3]; + } else { + img[idx].alpha = 0xFF; + } + } + } + break; + case 2: // grey, alpha + for (int j = 0; j < h; j++) { + for (int i = 0; i < w; i++) { + int idx = j*w + i; + img[idx].intensity = data[2*idx]; + img[idx].alpha = data[2*idx + 1]; + } + } + break; + default: + ERROR("Don't know how to read channels: %d\n", channels); + free(img); + img = NULL; + } + + // cleanup + stbi_image_free(data); + + *width = w; + *height = h; + return img; +} + +// find index of palette color +// return -1 if not found +static int pal_find_color(const palette_t *pal, uint16_t val) +{ + for (int i = 0; i < pal->used; i++) { + if (pal->data[i] == val) { + return i; + } + } + return -1; +} + +// find value in palette, or add if not there +// returns palette index entered or -1 if palette full +static int pal_add_color(palette_t *pal, uint16_t val) +{ + int idx; + idx = pal_find_color(pal, val); + if (idx < 0) { + if (pal->used == pal->max) { + ERROR("Error: trying to use more than %d\n", pal->max); + } else { + idx = pal->used; + pal->data[pal->used] = val; + pal->used++; + } + } + return idx; +} + +// convert from raw (RGBA16 or IA16) format to CI + palette +// returns 1 on success +int raw2ci(uint8_t *rawci, palette_t *pal, const uint8_t *raw, int raw_len, int ci_depth) +{ + // assign colors to palette + pal->used = 0; + memset(pal->data, 0, sizeof(pal->data)); + int ci_idx = 0; + for (int i = 0; i < raw_len; i += sizeof(uint16_t)) { + uint16_t val = read_u16_be(&raw[i]); + int pal_idx = pal_add_color(pal, val); + if (pal_idx < 0) { + ERROR("Error adding color @ (%d): %d (used: %d/%d)\n", i, pal_idx, pal->used, pal->max); + return 0; + } else { + switch (ci_depth) { + case 8: + rawci[ci_idx] = (uint8_t)pal_idx; + break; + case 4: + { + int byte_idx = ci_idx / 2; + int nibble = 1 - (ci_idx % 2); + uint8_t mask = 0xF << (4 * (1 - nibble)); + rawci[byte_idx] = (rawci[byte_idx] & mask) | (pal_idx << (4 * nibble)); + break; + } + } + ci_idx++; + } + } + return 1; +} + +const char *n64graphics_get_read_version(void) +{ + return "stb_image 2.19"; +} + +const char *n64graphics_get_write_version(void) +{ + return "stb_image_write 1.09"; +} + +#ifdef N64GRAPHICS_STANDALONE +#define N64GRAPHICS_VERSION "0.4" +#include + +typedef enum +{ + MODE_EXPORT, + MODE_IMPORT, +} tool_mode; + +typedef struct +{ + char *img_filename; + char *bin_filename; + char *pal_filename; + tool_mode mode; + unsigned int bin_offset; + unsigned int pal_offset; + img_format format; + img_format pal_format; + int width; + int height; + int bin_truncate; + int pal_truncate; +} graphics_config; + +static const graphics_config default_config = +{ + .img_filename = NULL, + .bin_filename = NULL, + .pal_filename = NULL, + .mode = MODE_EXPORT, + .bin_offset = 0, + .pal_offset = 0, + .format = {IMG_FORMAT_RGBA, 16}, + .pal_format = {IMG_FORMAT_RGBA, 16}, + .width = 32, + .height = 32, + .bin_truncate = 1, + .pal_truncate = 1, +}; + +typedef struct +{ + const char *name; + img_format format; +} format_entry; + +static const format_entry format_table[] = +{ + {"rgba16", {IMG_FORMAT_RGBA, 16}}, + {"rgba32", {IMG_FORMAT_RGBA, 32}}, + {"ia1", {IMG_FORMAT_IA, 1}}, + {"ia4", {IMG_FORMAT_IA, 4}}, + {"ia8", {IMG_FORMAT_IA, 8}}, + {"ia16", {IMG_FORMAT_IA, 16}}, + {"i4", {IMG_FORMAT_I, 4}}, + {"i8", {IMG_FORMAT_I, 8}}, + {"ci8", {IMG_FORMAT_CI, 8}}, + {"ci4", {IMG_FORMAT_CI, 4}}, +}; + +static const char *format2str(const img_format *format) +{ + for (unsigned i = 0; i < DIM(format_table); i++) { + if (format->format == format_table[i].format.format && format->depth == format_table[i].format.depth) { + return format_table[i].name; + } + } + return "unknown"; +} + +static int parse_format(img_format *format, const char *str) +{ + for (unsigned i = 0; i < DIM(format_table); i++) { + if (!strcasecmp(str, format_table[i].name)) { + format->format = format_table[i].format.format; + format->depth = format_table[i].format.depth; + return 1; + } + } + return 0; +} + +static void print_usage(void) +{ + ERROR("Usage: n64graphics -e/-i BIN_FILE -g IMG_FILE [-p PAL_FILE] [-o BIN_OFFSET] [-P PAL_OFFSET] [-f FORMAT] [-c CI_FORMAT] [-w WIDTH] [-h HEIGHT] [-V]\n" + "\n" + "n64graphics v" N64GRAPHICS_VERSION ": N64 graphics manipulator\n" + "\n" + "Required arguments:\n" + " -e BIN_FILE export from BIN_FILE to PNG_FILE\n" + " -i BIN_FILE import from PNG_FILE to BIN_FILE\n" + " -g IMG_FILE graphics file to import/export (.png)\n" + "Optional arguments:\n" + " -o BIN_OFFSET starting offset in BIN_FILE (prevents truncation during import)\n" + " -f FORMAT texture format: rgba16, rgba32, ia1, ia4, ia8, ia16, i4, i8, ci4, ci8 (default: %s)\n" + " -w WIDTH export texture width (default: %d)\n" + " -h HEIGHT export texture height (default: %d)\n" + "CI arguments:\n" + " -c CI_FORMAT CI palette format: rgba16, ia16 (default: %s)\n" + " -p PAL_FILE palette binary file to import/export from/to\n" + " -P PAL_OFFSET starting offset in PAL_FILE (prevents truncation during import)\n" + "Other arguments:\n" + " -v verbose logging\n" + " -V print version information\n", + format2str(&default_config.format), + default_config.width, + default_config.height, + format2str(&default_config.pal_format)); +} + +static void print_version(void) +{ + ERROR("n64graphics v" N64GRAPHICS_VERSION ", using:\n" + " %s\n" + " %s\n", + n64graphics_get_read_version(), n64graphics_get_write_version()); +} + +// parse command line arguments +static int parse_arguments(int argc, char *argv[], graphics_config *config) +{ + for (int i = 1; i < argc; i++) { + if (argv[i][0] == '-') { + switch (argv[i][1]) { + case 'c': + if (++i >= argc) return 0; + if (!parse_format(&config->pal_format, argv[i])) { + return 0; + } + break; + case 'e': + if (++i >= argc) return 0; + config->bin_filename = argv[i]; + config->mode = MODE_EXPORT; + break; + case 'f': + if (++i >= argc) return 0; + if (!parse_format(&config->format, argv[i])) { + return 0; + } + break; + case 'g': + if (++i >= argc) return 0; + config->img_filename = argv[i]; + break; + case 'h': + if (++i >= argc) return 0; + config->height = strtoul(argv[i], NULL, 0); + break; + case 'i': + if (++i >= argc) return 0; + config->bin_filename = argv[i]; + config->mode = MODE_IMPORT; + break; + case 'o': + if (++i >= argc) return 0; + config->bin_offset = strtoul(argv[i], NULL, 0); + config->bin_truncate = 0; + break; + case 'p': + if (++i >= argc) return 0; + config->pal_filename = argv[i]; + break; + case 'P': + if (++i >= argc) return 0; + config->pal_offset = strtoul(argv[i], NULL, 0); + config->pal_truncate = 0; + break; + case 'v': + g_verbosity = 1; + break; + case 'V': + print_version(); + exit(0); + break; + case 'w': + if (++i >= argc) return 0; + config->width = strtoul(argv[i], NULL, 0); + break; + default: + return 0; + break; + } + } else { + return 0; + } + } + return 1; +} + +// returns 1 if config is valid +static int valid_config(const graphics_config *config) +{ + if (!config->bin_filename || !config->img_filename) { + return 0; + } + if (config->format.format == IMG_FORMAT_CI) { + if (!config->pal_filename || (config->pal_format.depth != 16) || + (config->pal_format.format != IMG_FORMAT_RGBA && config->pal_format.format != IMG_FORMAT_IA)) { + return 0; + } + } + return 1; +} + +int main(int argc, char *argv[]) +{ + graphics_config config = default_config; + rgba *imgr; + ia *imgi; + FILE *bin_fp; + uint8_t *raw; + int raw_size; + int length = 0; + int flength; + int res; + + int valid = parse_arguments(argc, argv, &config); + if (!valid || !valid_config(&config)) { + print_usage(); + exit(EXIT_FAILURE); + } + + if (config.mode == MODE_IMPORT) { + if (config.bin_truncate) { + bin_fp = fopen(config.bin_filename, "w"); + } else { + bin_fp = fopen(config.bin_filename, "r+"); + } + if (!bin_fp) { + ERROR("Error opening \"%s\"\n", config.bin_filename); + return -1; + } + if (!config.bin_truncate) { + fseek(bin_fp, config.bin_offset, SEEK_SET); + } + switch (config.format.format) { + case IMG_FORMAT_RGBA: + imgr = png2rgba(config.img_filename, &config.width, &config.height); + raw_size = (config.width * config.height * config.format.depth + 7) / 8; + raw = (uint8_t *)malloc(raw_size); + if (!raw) { + ERROR("Error allocating %u bytes\n", raw_size); + } + length = rgba2raw(raw, imgr, config.width, config.height, config.format.depth); + break; + case IMG_FORMAT_IA: + imgi = png2ia(config.img_filename, &config.width, &config.height); + raw_size = (config.width * config.height * config.format.depth + 7) / 8; + raw = (uint8_t *)malloc(raw_size); + if (!raw) { + ERROR("Error allocating %u bytes\n", raw_size); + } + length = ia2raw(raw, imgi, config.width, config.height, config.format.depth); + break; + case IMG_FORMAT_I: + imgi = png2ia(config.img_filename, &config.width, &config.height); + raw_size = (config.width * config.height * config.format.depth + 7) / 8; + raw = (uint8_t *)malloc(raw_size); + if (!raw) { + ERROR("Error allocating %u bytes\n", raw_size); + } + length = i2raw(raw, imgi, config.width, config.height, config.format.depth); + break; + case IMG_FORMAT_CI: + { + palette_t pal; + FILE *pal_fp; + uint8_t *raw16; + int raw16_size; + int raw16_length; + uint8_t *ci; + int ci_length; + int pal_success; + int pal_length; + + if (config.pal_truncate) { + pal_fp = fopen(config.pal_filename, "w"); + } else { + pal_fp = fopen(config.pal_filename, "r+"); + } + if (!pal_fp) { + ERROR("Error opening \"%s\"\n", config.pal_filename); + return EXIT_FAILURE; + } + if (!config.pal_truncate) { + fseek(pal_fp, config.bin_offset, SEEK_SET); + } + + raw16_size = config.width * config.height * config.pal_format.depth / 8; + raw16 = (uint8_t *)malloc(raw16_size); + if (!raw16) { + ERROR("Error allocating %d bytes\n", raw16_size); + return EXIT_FAILURE; + } + switch (config.pal_format.format) { + case IMG_FORMAT_RGBA: + imgr = png2rgba(config.img_filename, &config.width, &config.height); + raw16_length = rgba2raw(raw16, imgr, config.width, config.height, config.pal_format.depth); + break; + case IMG_FORMAT_IA: + imgi = png2ia(config.img_filename, &config.width, &config.height); + raw16_length = ia2raw(raw16, imgi, config.width, config.height, config.pal_format.depth); + break; + default: + ERROR("Unsupported palette format: %s\n", format2str(&config.pal_format)); + exit(EXIT_FAILURE); + } + + // convert raw to palette + pal.max = (1 << config.format.depth); + ci_length = config.width * config.height * config.format.depth / 8; + ci = (uint8_t *)malloc(ci_length); + pal_success = raw2ci(ci, &pal, raw16, raw16_length, config.format.depth); + if (!pal_success) { + ERROR("Error converting palette\n"); + exit(EXIT_FAILURE); + } + + pal_length = pal.max * sizeof(pal.data[0]); + INFO("Writing 0x%X bytes to offset 0x%X of \"%s\"\n", pal_length, config.pal_offset, config.pal_filename); + flength = 0; + for (int i = 0; i < pal.max; i++) { + uint8_t entry[2]; + write_u16_be(entry, pal.data[i]); + flength += fwrite(entry, 1, sizeof(entry), pal_fp); + } + if (flength != pal_length) { + ERROR("Error writing %d bytes to \"%s\"\n", pal_length, config.pal_filename); + } + + raw = ci; + length = ci_length; + + free(raw16); + fclose(pal_fp); + break; + } + default: + return EXIT_FAILURE; + } + if (length <= 0) { + ERROR("Error converting to raw format\n"); + return EXIT_FAILURE; + } + INFO("Writing 0x%X bytes to offset 0x%X of \"%s\"\n", length, config.bin_offset, config.bin_filename); + flength = fwrite(raw, 1, length, bin_fp); + if (flength != length) { + ERROR("Error writing %d bytes to \"%s\"\n", length, config.bin_filename); + } + fclose(bin_fp); + + } else { + if (config.width <= 0 || config.height <= 0 || config.format.depth <= 0) { + ERROR("Error: must set position width and height for export\n"); + return EXIT_FAILURE; + } + bin_fp = fopen(config.bin_filename, "r"); + if (!bin_fp) { + ERROR("Error opening \"%s\"\n", config.bin_filename); + return -1; + } + raw_size = (config.width * config.height * config.format.depth + 7) / 8; + raw = (uint8_t *)malloc(raw_size); + if (config.bin_offset > 0) { + fseek(bin_fp, config.bin_offset, SEEK_SET); + } + flength = fread(raw, 1, raw_size, bin_fp); + if (flength != raw_size) { + ERROR("Error reading %d bytes from \"%s\"\n", raw_size, config.bin_filename); + } + switch (config.format.format) { + case IMG_FORMAT_RGBA: + imgr = raw2rgba(raw, config.width, config.height, config.format.depth); + res = rgba2png(config.img_filename, imgr, config.width, config.height); + break; + case IMG_FORMAT_IA: + imgi = raw2ia(raw, config.width, config.height, config.format.depth); + res = ia2png(config.img_filename, imgi, config.width, config.height); + break; + case IMG_FORMAT_I: + imgi = raw2i(raw, config.width, config.height, config.format.depth); + res = ia2png(config.img_filename, imgi, config.width, config.height); + break; + case IMG_FORMAT_CI: + { + FILE *pal_fp; + uint8_t *pal; + uint8_t *raw_fmt; + int pal_size; + + INFO("Extracting %s offset 0x%X, pal.offset 0x%0X, pal.format %s\n", format2str(&config.format), + config.bin_offset, config.pal_offset, format2str(&config.pal_format)); + + pal_fp = fopen(config.pal_filename, "r"); + if (!pal_fp) { + ERROR("Error opening \"%s\"\n", config.bin_filename); + return EXIT_FAILURE; + } + if (config.pal_offset > 0) { + fseek(pal_fp, config.pal_offset, SEEK_SET); + } + + pal_size = sizeof(uint16_t) * (1 << config.format.depth); + INFO("Palette size: %d\n", pal_size); + pal = (uint8_t *)malloc(pal_size); + flength = fread(pal, 1, pal_size, pal_fp); + if (flength != pal_size) { + ERROR("Error reading %d bytes from \"%s\"\n", pal_size, config.pal_filename); + } + raw_fmt = ci2raw(raw, pal, config.width, config.height, config.format.depth); + switch (config.pal_format.format) { + case IMG_FORMAT_RGBA: + INFO("Converting raw to RGBA16\n"); + imgr = raw2rgba(raw_fmt, config.width, config.height, config.pal_format.depth); + res = rgba2png(config.img_filename, imgr, config.width, config.height); + break; + case IMG_FORMAT_IA: + INFO("Converting raw to IA16\n"); + imgi = raw2ia(raw_fmt, config.width, config.height, config.pal_format.depth); + res = ia2png(config.img_filename, imgi, config.width, config.height); + break; + default: + ERROR("Unsupported palette format: %s\n", format2str(&config.pal_format)); + return EXIT_FAILURE; + } + free(raw_fmt); + free(pal); + break; + } + default: + return EXIT_FAILURE; + } + if (!res) { + ERROR("Error writing to \"%s\"\n", config.img_filename); + return EXIT_FAILURE; + } + } + + return EXIT_SUCCESS; +} +#endif // N64GRAPHICS_STANDALONE diff --git a/tools/dkr_assets_tool_classes/libs/n64graphics.h b/tools/dkr_assets_tool_classes/libs/n64graphics.h new file mode 100644 index 00000000..9ced50e7 --- /dev/null +++ b/tools/dkr_assets_tool_classes/libs/n64graphics.h @@ -0,0 +1,100 @@ +#ifndef N64GRAPHICS_H_ +#define N64GRAPHICS_H_ + +#include + +// intermediate formats +typedef struct _rgba +{ + uint8_t red; + uint8_t green; + uint8_t blue; + uint8_t alpha; +} rgba; + +typedef struct _ia +{ + uint8_t intensity; + uint8_t alpha; +} ia; + +// CI palette +typedef struct +{ + uint16_t data[256]; + int max; // max number of entries + int used; // number of entries used +} palette_t; + +//--------------------------------------------------------- +// N64 RGBA/IA/I/CI -> intermediate RGBA/IA +//--------------------------------------------------------- + +// N64 raw RGBA16/RGBA32 -> intermediate RGBA +rgba *raw2rgba(const uint8_t *raw, int width, int height, int depth); + +// N64 raw IA1/IA4/IA8/IA16 -> intermediate IA +ia *raw2ia(const uint8_t *raw, int width, int height, int depth); + +// N64 raw I4/I8 -> intermediate IA +ia *raw2i(const uint8_t *raw, int width, int height, int depth); + +//--------------------------------------------------------- +// intermediate RGBA/IA -> N64 RGBA/IA/I/CI +// returns length written to 'raw' used or -1 on error +//--------------------------------------------------------- + +// intermediate RGBA -> N64 raw RGBA16/RGBA32 +int rgba2raw(uint8_t *raw, const rgba *img, int width, int height, int depth); + +// intermediate IA -> N64 raw IA1/IA4/IA8/IA16 +int ia2raw(uint8_t *raw, const ia *img, int width, int height, int depth); + +// intermediate IA -> N64 raw I4/I8 +int i2raw(uint8_t *raw, const ia *img, int width, int height, int depth); + + +//--------------------------------------------------------- +// N64 CI <-> N64 RGBA16/IA16 +//--------------------------------------------------------- + +// N64 CI raw data and palette to raw data (either RGBA16 or IA16) +uint8_t *ci2raw(const uint8_t *rawci, const uint8_t *palette, int width, int height, int ci_depth); + +// convert from raw (RGBA16 or IA16) format to CI + palette +int raw2ci(uint8_t *rawci, palette_t *pal, const uint8_t *raw, int raw_len, int ci_depth); + + +//--------------------------------------------------------- +// intermediate RGBA/IA -> PNG +//--------------------------------------------------------- + +// intermediate RGBA write to PNG file +int rgba2png(const char *png_filename, const rgba *img, int width, int height); + +// intermediate IA write to grayscale PNG file +int ia2png(const char *png_filename, const ia *img, int width, int height); + + +//--------------------------------------------------------- +// PNG -> intermediate RGBA/IA +//--------------------------------------------------------- + +// PNG file -> intermediate RGBA +rgba *png2rgba(const char *png_filename, int *width, int *height); + +// PNG file -> intermediate IA +ia *png2ia(const char *png_filename, int *width, int *height); + + +//--------------------------------------------------------- +// version +//--------------------------------------------------------- + +// get version of underlying graphics reading library +const char *n64graphics_get_read_version(void); + +// get version of underlying graphics writing library +const char *n64graphics_get_write_version(void); + +#endif // N64GRAPHICS_H_ diff --git a/tools/dkr_assets_tool_classes/libs/stb_image.h b/tools/dkr_assets_tool_classes/libs/stb_image.h new file mode 100644 index 00000000..1727f2e7 --- /dev/null +++ b/tools/dkr_assets_tool_classes/libs/stb_image.h @@ -0,0 +1,7462 @@ +/* stb_image - v2.19 - public domain image loader - http://nothings.org/stb + no warranty implied; use at your own risk + + Do this: + #define STB_IMAGE_IMPLEMENTATION + before you include this file in *one* C or C++ file to create the implementation. + + // i.e. it should look like this: + #include ... + #include ... + #include ... + #define STB_IMAGE_IMPLEMENTATION + #include "stb_image.h" + + You can #define STBI_ASSERT(x) before the #include to avoid using assert.h. + And #define STBI_MALLOC, STBI_REALLOC, and STBI_FREE to avoid using malloc,realloc,free + + + QUICK NOTES: + Primarily of interest to game developers and other people who can + avoid problematic images and only need the trivial interface + + JPEG baseline & progressive (12 bpc/arithmetic not supported, same as stock IJG lib) + PNG 1/2/4/8/16-bit-per-channel + + TGA (not sure what subset, if a subset) + BMP non-1bpp, non-RLE + PSD (composited view only, no extra channels, 8/16 bit-per-channel) + + GIF (*comp always reports as 4-channel) + HDR (radiance rgbE format) + PIC (Softimage PIC) + PNM (PPM and PGM binary only) + + Animated GIF still needs a proper API, but here's one way to do it: + http://gist.github.com/urraka/685d9a6340b26b830d49 + + - decode from memory or through FILE (define STBI_NO_STDIO to remove code) + - decode from arbitrary I/O callbacks + - SIMD acceleration on x86/x64 (SSE2) and ARM (NEON) + + Full documentation under "DOCUMENTATION" below. + + +LICENSE + + See end of file for license information. + +RECENT REVISION HISTORY: + + 2.19 (2018-02-11) fix warning + 2.18 (2018-01-30) fix warnings + 2.17 (2018-01-29) bugfix, 1-bit BMP, 16-bitness query, fix warnings + 2.16 (2017-07-23) all functions have 16-bit variants; optimizations; bugfixes + 2.15 (2017-03-18) fix png-1,2,4; all Imagenet JPGs; no runtime SSE detection on GCC + 2.14 (2017-03-03) remove deprecated STBI_JPEG_OLD; fixes for Imagenet JPGs + 2.13 (2016-12-04) experimental 16-bit API, only for PNG so far; fixes + 2.12 (2016-04-02) fix typo in 2.11 PSD fix that caused crashes + 2.11 (2016-04-02) 16-bit PNGS; enable SSE2 in non-gcc x64 + RGB-format JPEG; remove white matting in PSD; + allocate large structures on the stack; + correct channel count for PNG & BMP + 2.10 (2016-01-22) avoid warning introduced in 2.09 + 2.09 (2016-01-16) 16-bit TGA; comments in PNM files; STBI_REALLOC_SIZED + + See end of file for full revision history. + + + ============================ Contributors ========================= + + Image formats Extensions, features + Sean Barrett (jpeg, png, bmp) Jetro Lauha (stbi_info) + Nicolas Schulz (hdr, psd) Martin "SpartanJ" Golini (stbi_info) + Jonathan Dummer (tga) James "moose2000" Brown (iPhone PNG) + Jean-Marc Lienher (gif) Ben "Disch" Wenger (io callbacks) + Tom Seddon (pic) Omar Cornut (1/2/4-bit PNG) + Thatcher Ulrich (psd) Nicolas Guillemot (vertical flip) + Ken Miller (pgm, ppm) Richard Mitton (16-bit PSD) + github:urraka (animated gif) Junggon Kim (PNM comments) + Christopher Forseth (animated gif) Daniel Gibson (16-bit TGA) + socks-the-fox (16-bit PNG) + Jeremy Sawicki (handle all ImageNet JPGs) + Optimizations & bugfixes Mikhail Morozov (1-bit BMP) + Fabian "ryg" Giesen Anael Seghezzi (is-16-bit query) + Arseny Kapoulkine + John-Mark Allen + + Bug & warning fixes + Marc LeBlanc David Woo Guillaume George Martins Mozeiko + Christpher Lloyd Jerry Jansson Joseph Thomson Phil Jordan + Dave Moore Roy Eltham Hayaki Saito Nathan Reed + Won Chun Luke Graham Johan Duparc Nick Verigakis + the Horde3D community Thomas Ruf Ronny Chevalier github:rlyeh + Janez Zemva John Bartholomew Michal Cichon github:romigrou + Jonathan Blow Ken Hamada Tero Hanninen github:svdijk + Laurent Gomila Cort Stratton Sergio Gonzalez github:snagar + Aruelien Pocheville Thibault Reuille Cass Everitt github:Zelex + Ryamond Barbiero Paul Du Bois Engin Manap github:grim210 + Aldo Culquicondor Philipp Wiesemann Dale Weiler github:sammyhw + Oriol Ferrer Mesia Josh Tobin Matthew Gregan github:phprus + Julian Raschke Gregory Mullen Baldur Karlsson github:poppolopoppo + Christian Floisand Kevin Schmidt github:darealshinji + Blazej Dariusz Roszkowski github:Michaelangel007 +*/ + +#ifndef STBI_INCLUDE_STB_IMAGE_H +#define STBI_INCLUDE_STB_IMAGE_H + +// DOCUMENTATION +// +// Limitations: +// - no 12-bit-per-channel JPEG +// - no JPEGs with arithmetic coding +// - GIF always returns *comp=4 +// +// Basic usage (see HDR discussion below for HDR usage): +// int x,y,n; +// unsigned char *data = stbi_load(filename, &x, &y, &n, 0); +// // ... process data if not NULL ... +// // ... x = width, y = height, n = # 8-bit components per pixel ... +// // ... replace '0' with '1'..'4' to force that many components per pixel +// // ... but 'n' will always be the number that it would have been if you said 0 +// stbi_image_free(data) +// +// Standard parameters: +// int *x -- outputs image width in pixels +// int *y -- outputs image height in pixels +// int *channels_in_file -- outputs # of image components in image file +// int desired_channels -- if non-zero, # of image components requested in result +// +// The return value from an image loader is an 'unsigned char *' which points +// to the pixel data, or NULL on an allocation failure or if the image is +// corrupt or invalid. The pixel data consists of *y scanlines of *x pixels, +// with each pixel consisting of N interleaved 8-bit components; the first +// pixel pointed to is top-left-most in the image. There is no padding between +// image scanlines or between pixels, regardless of format. The number of +// components N is 'desired_channels' if desired_channels is non-zero, or +// *channels_in_file otherwise. If desired_channels is non-zero, +// *channels_in_file has the number of components that _would_ have been +// output otherwise. E.g. if you set desired_channels to 4, you will always +// get RGBA output, but you can check *channels_in_file to see if it's trivially +// opaque because e.g. there were only 3 channels in the source image. +// +// An output image with N components has the following components interleaved +// in this order in each pixel: +// +// N=#comp components +// 1 grey +// 2 grey, alpha +// 3 red, green, blue +// 4 red, green, blue, alpha +// +// If image loading fails for any reason, the return value will be NULL, +// and *x, *y, *channels_in_file will be unchanged. The function +// stbi_failure_reason() can be queried for an extremely brief, end-user +// unfriendly explanation of why the load failed. Define STBI_NO_FAILURE_STRINGS +// to avoid compiling these strings at all, and STBI_FAILURE_USERMSG to get slightly +// more user-friendly ones. +// +// Paletted PNG, BMP, GIF, and PIC images are automatically depalettized. +// +// =========================================================================== +// +// Philosophy +// +// stb libraries are designed with the following priorities: +// +// 1. easy to use +// 2. easy to maintain +// 3. good performance +// +// Sometimes I let "good performance" creep up in priority over "easy to maintain", +// and for best performance I may provide less-easy-to-use APIs that give higher +// performance, in addition to the easy to use ones. Nevertheless, it's important +// to keep in mind that from the standpoint of you, a client of this library, +// all you care about is #1 and #3, and stb libraries DO NOT emphasize #3 above all. +// +// Some secondary priorities arise directly from the first two, some of which +// make more explicit reasons why performance can't be emphasized. +// +// - Portable ("ease of use") +// - Small source code footprint ("easy to maintain") +// - No dependencies ("ease of use") +// +// =========================================================================== +// +// I/O callbacks +// +// I/O callbacks allow you to read from arbitrary sources, like packaged +// files or some other source. Data read from callbacks are processed +// through a small internal buffer (currently 128 bytes) to try to reduce +// overhead. +// +// The three functions you must define are "read" (reads some bytes of data), +// "skip" (skips some bytes of data), "eof" (reports if the stream is at the end). +// +// =========================================================================== +// +// SIMD support +// +// The JPEG decoder will try to automatically use SIMD kernels on x86 when +// supported by the compiler. For ARM Neon support, you must explicitly +// request it. +// +// (The old do-it-yourself SIMD API is no longer supported in the current +// code.) +// +// On x86, SSE2 will automatically be used when available based on a run-time +// test; if not, the generic C versions are used as a fall-back. On ARM targets, +// the typical path is to have separate builds for NEON and non-NEON devices +// (at least this is true for iOS and Android). Therefore, the NEON support is +// toggled by a build flag: define STBI_NEON to get NEON loops. +// +// If for some reason you do not want to use any of SIMD code, or if +// you have issues compiling it, you can disable it entirely by +// defining STBI_NO_SIMD. +// +// =========================================================================== +// +// HDR image support (disable by defining STBI_NO_HDR) +// +// stb_image now supports loading HDR images in general, and currently +// the Radiance .HDR file format, although the support is provided +// generically. You can still load any file through the existing interface; +// if you attempt to load an HDR file, it will be automatically remapped to +// LDR, assuming gamma 2.2 and an arbitrary scale factor defaulting to 1; +// both of these constants can be reconfigured through this interface: +// +// stbi_hdr_to_ldr_gamma(2.2f); +// stbi_hdr_to_ldr_scale(1.0f); +// +// (note, do not use _inverse_ constants; stbi_image will invert them +// appropriately). +// +// Additionally, there is a new, parallel interface for loading files as +// (linear) floats to preserve the full dynamic range: +// +// float *data = stbi_loadf(filename, &x, &y, &n, 0); +// +// If you load LDR images through this interface, those images will +// be promoted to floating point values, run through the inverse of +// constants corresponding to the above: +// +// stbi_ldr_to_hdr_scale(1.0f); +// stbi_ldr_to_hdr_gamma(2.2f); +// +// Finally, given a filename (or an open file or memory block--see header +// file for details) containing image data, you can query for the "most +// appropriate" interface to use (that is, whether the image is HDR or +// not), using: +// +// stbi_is_hdr(char *filename); +// +// =========================================================================== +// +// iPhone PNG support: +// +// By default we convert iphone-formatted PNGs back to RGB, even though +// they are internally encoded differently. You can disable this conversion +// by by calling stbi_convert_iphone_png_to_rgb(0), in which case +// you will always just get the native iphone "format" through (which +// is BGR stored in RGB). +// +// Call stbi_set_unpremultiply_on_load(1) as well to force a divide per +// pixel to remove any premultiplied alpha *only* if the image file explicitly +// says there's premultiplied data (currently only happens in iPhone images, +// and only if iPhone convert-to-rgb processing is on). +// +// =========================================================================== +// +// ADDITIONAL CONFIGURATION +// +// - You can suppress implementation of any of the decoders to reduce +// your code footprint by #defining one or more of the following +// symbols before creating the implementation. +// +// STBI_NO_JPEG +// STBI_NO_PNG +// STBI_NO_BMP +// STBI_NO_PSD +// STBI_NO_TGA +// STBI_NO_GIF +// STBI_NO_HDR +// STBI_NO_PIC +// STBI_NO_PNM (.ppm and .pgm) +// +// - You can request *only* certain decoders and suppress all other ones +// (this will be more forward-compatible, as addition of new decoders +// doesn't require you to disable them explicitly): +// +// STBI_ONLY_JPEG +// STBI_ONLY_PNG +// STBI_ONLY_BMP +// STBI_ONLY_PSD +// STBI_ONLY_TGA +// STBI_ONLY_GIF +// STBI_ONLY_HDR +// STBI_ONLY_PIC +// STBI_ONLY_PNM (.ppm and .pgm) +// +// - If you use STBI_NO_PNG (or _ONLY_ without PNG), and you still +// want the zlib decoder to be available, #define STBI_SUPPORT_ZLIB +// + + +#ifndef STBI_NO_STDIO +#include +#endif // STBI_NO_STDIO + +#define STBI_VERSION 1 + +enum +{ + STBI_default = 0, // only used for desired_channels + + STBI_grey = 1, + STBI_grey_alpha = 2, + STBI_rgb = 3, + STBI_rgb_alpha = 4 +}; + +typedef unsigned char stbi_uc; +typedef unsigned short stbi_us; + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef STB_IMAGE_STATIC +#define STBIDEF static +#else +#define STBIDEF extern +#endif + +////////////////////////////////////////////////////////////////////////////// +// +// PRIMARY API - works on images of any type +// + +// +// load image by filename, open file, or memory buffer +// + +typedef struct +{ + int (*read) (void *user,char *data,int size); // fill 'data' with 'size' bytes. return number of bytes actually read + void (*skip) (void *user,int n); // skip the next 'n' bytes, or 'unget' the last -n bytes if negative + int (*eof) (void *user); // returns nonzero if we are at end of file/data +} stbi_io_callbacks; + +//////////////////////////////////// +// +// 8-bits-per-channel interface +// + +STBIDEF stbi_uc *stbi_load_from_memory (stbi_uc const *buffer, int len , int *x, int *y, int *channels_in_file, int desired_channels); +STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk , void *user, int *x, int *y, int *channels_in_file, int desired_channels); +#ifndef STBI_NO_GIF +STBIDEF stbi_uc *stbi_load_gif_from_memory(stbi_uc const *buffer, int len, int **delays, int *x, int *y, int *z, int *comp, int req_comp); +#endif + + +#ifndef STBI_NO_STDIO +STBIDEF stbi_uc *stbi_load (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels); +STBIDEF stbi_uc *stbi_load_from_file (FILE *f, int *x, int *y, int *channels_in_file, int desired_channels); +// for stbi_load_from_file, file pointer is left pointing immediately after image +#endif + +//////////////////////////////////// +// +// 16-bits-per-channel interface +// + +STBIDEF stbi_us *stbi_load_16_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels); +STBIDEF stbi_us *stbi_load_16_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels); + +#ifndef STBI_NO_STDIO +STBIDEF stbi_us *stbi_load_16 (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels); +STBIDEF stbi_us *stbi_load_from_file_16(FILE *f, int *x, int *y, int *channels_in_file, int desired_channels); +#endif + +//////////////////////////////////// +// +// float-per-channel interface +// +#ifndef STBI_NO_LINEAR + STBIDEF float *stbi_loadf_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels); + STBIDEF float *stbi_loadf_from_callbacks (stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels); + + #ifndef STBI_NO_STDIO + STBIDEF float *stbi_loadf (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels); + STBIDEF float *stbi_loadf_from_file (FILE *f, int *x, int *y, int *channels_in_file, int desired_channels); + #endif +#endif + +#ifndef STBI_NO_HDR + STBIDEF void stbi_hdr_to_ldr_gamma(float gamma); + STBIDEF void stbi_hdr_to_ldr_scale(float scale); +#endif // STBI_NO_HDR + +#ifndef STBI_NO_LINEAR + STBIDEF void stbi_ldr_to_hdr_gamma(float gamma); + STBIDEF void stbi_ldr_to_hdr_scale(float scale); +#endif // STBI_NO_LINEAR + +// stbi_is_hdr is always defined, but always returns false if STBI_NO_HDR +STBIDEF int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user); +STBIDEF int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len); +#ifndef STBI_NO_STDIO +STBIDEF int stbi_is_hdr (char const *filename); +STBIDEF int stbi_is_hdr_from_file(FILE *f); +#endif // STBI_NO_STDIO + + +// get a VERY brief reason for failure +// NOT THREADSAFE +STBIDEF const char *stbi_failure_reason (void); + +// free the loaded image -- this is just free() +STBIDEF void stbi_image_free (void *retval_from_stbi_load); + +// get image dimensions & components without fully decoding +STBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp); +STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp); +STBIDEF int stbi_is_16_bit_from_memory(stbi_uc const *buffer, int len); +STBIDEF int stbi_is_16_bit_from_callbacks(stbi_io_callbacks const *clbk, void *user); + +#ifndef STBI_NO_STDIO +STBIDEF int stbi_info (char const *filename, int *x, int *y, int *comp); +STBIDEF int stbi_info_from_file (FILE *f, int *x, int *y, int *comp); +STBIDEF int stbi_is_16_bit (char const *filename); +STBIDEF int stbi_is_16_bit_from_file(FILE *f); +#endif + + + +// for image formats that explicitly notate that they have premultiplied alpha, +// we just return the colors as stored in the file. set this flag to force +// unpremultiplication. results are undefined if the unpremultiply overflow. +STBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply); + +// indicate whether we should process iphone images back to canonical format, +// or just pass them through "as-is" +STBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert); + +// flip the image vertically, so the first pixel in the output array is the bottom left +STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip); + +// ZLIB client - used by PNG, available for other purposes + +STBIDEF char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen); +STBIDEF char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header); +STBIDEF char *stbi_zlib_decode_malloc(const char *buffer, int len, int *outlen); +STBIDEF int stbi_zlib_decode_buffer(char *obuffer, int olen, const char *ibuffer, int ilen); + +STBIDEF char *stbi_zlib_decode_noheader_malloc(const char *buffer, int len, int *outlen); +STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen); + + +#ifdef __cplusplus +} +#endif + +// +// +//// end header file ///////////////////////////////////////////////////// +#endif // STBI_INCLUDE_STB_IMAGE_H + +#ifdef STB_IMAGE_IMPLEMENTATION + +#if defined(STBI_ONLY_JPEG) || defined(STBI_ONLY_PNG) || defined(STBI_ONLY_BMP) \ + || defined(STBI_ONLY_TGA) || defined(STBI_ONLY_GIF) || defined(STBI_ONLY_PSD) \ + || defined(STBI_ONLY_HDR) || defined(STBI_ONLY_PIC) || defined(STBI_ONLY_PNM) \ + || defined(STBI_ONLY_ZLIB) + #ifndef STBI_ONLY_JPEG + #define STBI_NO_JPEG + #endif + #ifndef STBI_ONLY_PNG + #define STBI_NO_PNG + #endif + #ifndef STBI_ONLY_BMP + #define STBI_NO_BMP + #endif + #ifndef STBI_ONLY_PSD + #define STBI_NO_PSD + #endif + #ifndef STBI_ONLY_TGA + #define STBI_NO_TGA + #endif + #ifndef STBI_ONLY_GIF + #define STBI_NO_GIF + #endif + #ifndef STBI_ONLY_HDR + #define STBI_NO_HDR + #endif + #ifndef STBI_ONLY_PIC + #define STBI_NO_PIC + #endif + #ifndef STBI_ONLY_PNM + #define STBI_NO_PNM + #endif +#endif + +#if defined(STBI_NO_PNG) && !defined(STBI_SUPPORT_ZLIB) && !defined(STBI_NO_ZLIB) +#define STBI_NO_ZLIB +#endif + + +#include +#include // ptrdiff_t on osx +#include +#include +#include + +#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) +#include // ldexp, pow +#endif + +#ifndef STBI_NO_STDIO +#include +#endif + +#ifndef STBI_ASSERT +#include +#define STBI_ASSERT(x) assert(x) +#endif + + +#ifndef _MSC_VER + #ifdef __cplusplus + #define stbi_inline inline + #else + #define stbi_inline + #endif +#else + #define stbi_inline __forceinline +#endif + + +#ifdef _MSC_VER +typedef unsigned short stbi__uint16; +typedef signed short stbi__int16; +typedef unsigned int stbi__uint32; +typedef signed int stbi__int32; +#else +#include +typedef uint16_t stbi__uint16; +typedef int16_t stbi__int16; +typedef uint32_t stbi__uint32; +typedef int32_t stbi__int32; +#endif + +// should produce compiler error if size is wrong +typedef unsigned char validate_uint32[sizeof(stbi__uint32)==4 ? 1 : -1]; + +#ifdef _MSC_VER +#define STBI_NOTUSED(v) (void)(v) +#else +#define STBI_NOTUSED(v) (void)sizeof(v) +#endif + +#ifdef _MSC_VER +#define STBI_HAS_LROTL +#endif + +#ifdef STBI_HAS_LROTL + #define stbi_lrot(x,y) _lrotl(x,y) +#else + #define stbi_lrot(x,y) (((x) << (y)) | ((x) >> (32 - (y)))) +#endif + +#if defined(STBI_MALLOC) && defined(STBI_FREE) && (defined(STBI_REALLOC) || defined(STBI_REALLOC_SIZED)) +// ok +#elif !defined(STBI_MALLOC) && !defined(STBI_FREE) && !defined(STBI_REALLOC) && !defined(STBI_REALLOC_SIZED) +// ok +#else +#error "Must define all or none of STBI_MALLOC, STBI_FREE, and STBI_REALLOC (or STBI_REALLOC_SIZED)." +#endif + +#ifndef STBI_MALLOC +#define STBI_MALLOC(sz) malloc(sz) +#define STBI_REALLOC(p,newsz) realloc(p,newsz) +#define STBI_FREE(p) free(p) +#endif + +#ifndef STBI_REALLOC_SIZED +#define STBI_REALLOC_SIZED(p,oldsz,newsz) STBI_REALLOC(p,newsz) +#endif + +// x86/x64 detection +#if defined(__x86_64__) || defined(_M_X64) +#define STBI__X64_TARGET +#elif defined(__i386) || defined(_M_IX86) +#define STBI__X86_TARGET +#endif + +#if defined(__GNUC__) && defined(STBI__X86_TARGET) && !defined(__SSE2__) && !defined(STBI_NO_SIMD) +// gcc doesn't support sse2 intrinsics unless you compile with -msse2, +// which in turn means it gets to use SSE2 everywhere. This is unfortunate, +// but previous attempts to provide the SSE2 functions with runtime +// detection caused numerous issues. The way architecture extensions are +// exposed in GCC/Clang is, sadly, not really suited for one-file libs. +// New behavior: if compiled with -msse2, we use SSE2 without any +// detection; if not, we don't use it at all. +#define STBI_NO_SIMD +#endif + +#if defined(__MINGW32__) && defined(STBI__X86_TARGET) && !defined(STBI_MINGW_ENABLE_SSE2) && !defined(STBI_NO_SIMD) +// Note that __MINGW32__ doesn't actually mean 32-bit, so we have to avoid STBI__X64_TARGET +// +// 32-bit MinGW wants ESP to be 16-byte aligned, but this is not in the +// Windows ABI and VC++ as well as Windows DLLs don't maintain that invariant. +// As a result, enabling SSE2 on 32-bit MinGW is dangerous when not +// simultaneously enabling "-mstackrealign". +// +// See https://github.com/nothings/stb/issues/81 for more information. +// +// So default to no SSE2 on 32-bit MinGW. If you've read this far and added +// -mstackrealign to your build settings, feel free to #define STBI_MINGW_ENABLE_SSE2. +#define STBI_NO_SIMD +#endif + +#if !defined(STBI_NO_SIMD) && (defined(STBI__X86_TARGET) || defined(STBI__X64_TARGET)) +#define STBI_SSE2 +#include + +#ifdef _MSC_VER + +#if _MSC_VER >= 1400 // not VC6 +#include // __cpuid +static int stbi__cpuid3(void) +{ + int info[4]; + __cpuid(info,1); + return info[3]; +} +#else +static int stbi__cpuid3(void) +{ + int res; + __asm { + mov eax,1 + cpuid + mov res,edx + } + return res; +} +#endif + +#define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name + +static int stbi__sse2_available(void) +{ + int info3 = stbi__cpuid3(); + return ((info3 >> 26) & 1) != 0; +} +#else // assume GCC-style if not VC++ +#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16))) + +static int stbi__sse2_available(void) +{ + // If we're even attempting to compile this on GCC/Clang, that means + // -msse2 is on, which means the compiler is allowed to use SSE2 + // instructions at will, and so are we. + return 1; +} +#endif +#endif + +// ARM NEON +#if defined(STBI_NO_SIMD) && defined(STBI_NEON) +#undef STBI_NEON +#endif + +#ifdef STBI_NEON +#include +// assume GCC or Clang on ARM targets +#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16))) +#endif + +#ifndef STBI_SIMD_ALIGN +#define STBI_SIMD_ALIGN(type, name) type name +#endif + +/////////////////////////////////////////////// +// +// stbi__context struct and start_xxx functions + +// stbi__context structure is our basic context used by all images, so it +// contains all the IO context, plus some basic image information +typedef struct +{ + stbi__uint32 img_x, img_y; + int img_n, img_out_n; + + stbi_io_callbacks io; + void *io_user_data; + + int read_from_callbacks; + int buflen; + stbi_uc buffer_start[128]; + + stbi_uc *img_buffer, *img_buffer_end; + stbi_uc *img_buffer_original, *img_buffer_original_end; +} stbi__context; + + +static void stbi__refill_buffer(stbi__context *s); + +// initialize a memory-decode context +static void stbi__start_mem(stbi__context *s, stbi_uc const *buffer, int len) +{ + s->io.read = NULL; + s->read_from_callbacks = 0; + s->img_buffer = s->img_buffer_original = (stbi_uc *) buffer; + s->img_buffer_end = s->img_buffer_original_end = (stbi_uc *) buffer+len; +} + +// initialize a callback-based context +static void stbi__start_callbacks(stbi__context *s, stbi_io_callbacks *c, void *user) +{ + s->io = *c; + s->io_user_data = user; + s->buflen = sizeof(s->buffer_start); + s->read_from_callbacks = 1; + s->img_buffer_original = s->buffer_start; + stbi__refill_buffer(s); + s->img_buffer_original_end = s->img_buffer_end; +} + +#ifndef STBI_NO_STDIO + +static int stbi__stdio_read(void *user, char *data, int size) +{ + return (int) fread(data,1,size,(FILE*) user); +} + +static void stbi__stdio_skip(void *user, int n) +{ + fseek((FILE*) user, n, SEEK_CUR); +} + +static int stbi__stdio_eof(void *user) +{ + return feof((FILE*) user); +} + +static stbi_io_callbacks stbi__stdio_callbacks = +{ + stbi__stdio_read, + stbi__stdio_skip, + stbi__stdio_eof, +}; + +static void stbi__start_file(stbi__context *s, FILE *f) +{ + stbi__start_callbacks(s, &stbi__stdio_callbacks, (void *) f); +} + +//static void stop_file(stbi__context *s) { } + +#endif // !STBI_NO_STDIO + +static void stbi__rewind(stbi__context *s) +{ + // conceptually rewind SHOULD rewind to the beginning of the stream, + // but we just rewind to the beginning of the initial buffer, because + // we only use it after doing 'test', which only ever looks at at most 92 bytes + s->img_buffer = s->img_buffer_original; + s->img_buffer_end = s->img_buffer_original_end; +} + +enum +{ + STBI_ORDER_RGB, + STBI_ORDER_BGR +}; + +typedef struct +{ + int bits_per_channel; + int num_channels; + int channel_order; +} stbi__result_info; + +#ifndef STBI_NO_JPEG +static int stbi__jpeg_test(stbi__context *s); +static void *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_PNG +static int stbi__png_test(stbi__context *s); +static void *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp); +static int stbi__png_is16(stbi__context *s); +#endif + +#ifndef STBI_NO_BMP +static int stbi__bmp_test(stbi__context *s); +static void *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_TGA +static int stbi__tga_test(stbi__context *s); +static void *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_PSD +static int stbi__psd_test(stbi__context *s); +static void *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc); +static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp); +static int stbi__psd_is16(stbi__context *s); +#endif + +#ifndef STBI_NO_HDR +static int stbi__hdr_test(stbi__context *s); +static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_PIC +static int stbi__pic_test(stbi__context *s); +static void *stbi__pic_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_GIF +static int stbi__gif_test(stbi__context *s); +static void *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static void *stbi__load_gif_main(stbi__context *s, int **delays, int *x, int *y, int *z, int *comp, int req_comp); +static int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_PNM +static int stbi__pnm_test(stbi__context *s); +static void *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +// this is not threadsafe +static const char *stbi__g_failure_reason; + +STBIDEF const char *stbi_failure_reason(void) +{ + return stbi__g_failure_reason; +} + +static int stbi__err(const char *str) +{ + stbi__g_failure_reason = str; + return 0; +} + +static void *stbi__malloc(size_t size) +{ + return STBI_MALLOC(size); +} + +// stb_image uses ints pervasively, including for offset calculations. +// therefore the largest decoded image size we can support with the +// current code, even on 64-bit targets, is INT_MAX. this is not a +// significant limitation for the intended use case. +// +// we do, however, need to make sure our size calculations don't +// overflow. hence a few helper functions for size calculations that +// multiply integers together, making sure that they're non-negative +// and no overflow occurs. + +// return 1 if the sum is valid, 0 on overflow. +// negative terms are considered invalid. +static int stbi__addsizes_valid(int a, int b) +{ + if (b < 0) return 0; + // now 0 <= b <= INT_MAX, hence also + // 0 <= INT_MAX - b <= INTMAX. + // And "a + b <= INT_MAX" (which might overflow) is the + // same as a <= INT_MAX - b (no overflow) + return a <= INT_MAX - b; +} + +// returns 1 if the product is valid, 0 on overflow. +// negative factors are considered invalid. +static int stbi__mul2sizes_valid(int a, int b) +{ + if (a < 0 || b < 0) return 0; + if (b == 0) return 1; // mul-by-0 is always safe + // portable way to check for no overflows in a*b + return a <= INT_MAX/b; +} + +// returns 1 if "a*b + add" has no negative terms/factors and doesn't overflow +static int stbi__mad2sizes_valid(int a, int b, int add) +{ + return stbi__mul2sizes_valid(a, b) && stbi__addsizes_valid(a*b, add); +} + +// returns 1 if "a*b*c + add" has no negative terms/factors and doesn't overflow +static int stbi__mad3sizes_valid(int a, int b, int c, int add) +{ + return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) && + stbi__addsizes_valid(a*b*c, add); +} + +// returns 1 if "a*b*c*d + add" has no negative terms/factors and doesn't overflow +#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) +static int stbi__mad4sizes_valid(int a, int b, int c, int d, int add) +{ + return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) && + stbi__mul2sizes_valid(a*b*c, d) && stbi__addsizes_valid(a*b*c*d, add); +} +#endif + +// mallocs with size overflow checking +static void *stbi__malloc_mad2(int a, int b, int add) +{ + if (!stbi__mad2sizes_valid(a, b, add)) return NULL; + return stbi__malloc(a*b + add); +} + +static void *stbi__malloc_mad3(int a, int b, int c, int add) +{ + if (!stbi__mad3sizes_valid(a, b, c, add)) return NULL; + return stbi__malloc(a*b*c + add); +} + +#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) +static void *stbi__malloc_mad4(int a, int b, int c, int d, int add) +{ + if (!stbi__mad4sizes_valid(a, b, c, d, add)) return NULL; + return stbi__malloc(a*b*c*d + add); +} +#endif + +// stbi__err - error +// stbi__errpf - error returning pointer to float +// stbi__errpuc - error returning pointer to unsigned char + +#ifdef STBI_NO_FAILURE_STRINGS + #define stbi__err(x,y) 0 +#elif defined(STBI_FAILURE_USERMSG) + #define stbi__err(x,y) stbi__err(y) +#else + #define stbi__err(x,y) stbi__err(x) +#endif + +#define stbi__errpf(x,y) ((float *)(size_t) (stbi__err(x,y)?NULL:NULL)) +#define stbi__errpuc(x,y) ((unsigned char *)(size_t) (stbi__err(x,y)?NULL:NULL)) + +STBIDEF void stbi_image_free(void *retval_from_stbi_load) +{ + STBI_FREE(retval_from_stbi_load); +} + +#ifndef STBI_NO_LINEAR +static float *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp); +#endif + +#ifndef STBI_NO_HDR +static stbi_uc *stbi__hdr_to_ldr(float *data, int x, int y, int comp); +#endif + +static int stbi__vertically_flip_on_load = 0; + +STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip) +{ + stbi__vertically_flip_on_load = flag_true_if_should_flip; +} + +static void *stbi__load_main(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc) +{ + memset(ri, 0, sizeof(*ri)); // make sure it's initialized if we add new fields + ri->bits_per_channel = 8; // default is 8 so most paths don't have to be changed + ri->channel_order = STBI_ORDER_RGB; // all current input & output are this, but this is here so we can add BGR order + ri->num_channels = 0; + + #ifndef STBI_NO_JPEG + if (stbi__jpeg_test(s)) return stbi__jpeg_load(s,x,y,comp,req_comp, ri); + #endif + #ifndef STBI_NO_PNG + if (stbi__png_test(s)) return stbi__png_load(s,x,y,comp,req_comp, ri); + #endif + #ifndef STBI_NO_BMP + if (stbi__bmp_test(s)) return stbi__bmp_load(s,x,y,comp,req_comp, ri); + #endif + #ifndef STBI_NO_GIF + if (stbi__gif_test(s)) return stbi__gif_load(s,x,y,comp,req_comp, ri); + #endif + #ifndef STBI_NO_PSD + if (stbi__psd_test(s)) return stbi__psd_load(s,x,y,comp,req_comp, ri, bpc); + #endif + #ifndef STBI_NO_PIC + if (stbi__pic_test(s)) return stbi__pic_load(s,x,y,comp,req_comp, ri); + #endif + #ifndef STBI_NO_PNM + if (stbi__pnm_test(s)) return stbi__pnm_load(s,x,y,comp,req_comp, ri); + #endif + + #ifndef STBI_NO_HDR + if (stbi__hdr_test(s)) { + float *hdr = stbi__hdr_load(s, x,y,comp,req_comp, ri); + return stbi__hdr_to_ldr(hdr, *x, *y, req_comp ? req_comp : *comp); + } + #endif + + #ifndef STBI_NO_TGA + // test tga last because it's a crappy test! + if (stbi__tga_test(s)) + return stbi__tga_load(s,x,y,comp,req_comp, ri); + #endif + + return stbi__errpuc("unknown image type", "Image not of any known type, or corrupt"); +} + +static stbi_uc *stbi__convert_16_to_8(stbi__uint16 *orig, int w, int h, int channels) +{ + int i; + int img_len = w * h * channels; + stbi_uc *reduced; + + reduced = (stbi_uc *) stbi__malloc(img_len); + if (reduced == NULL) return stbi__errpuc("outofmem", "Out of memory"); + + for (i = 0; i < img_len; ++i) + reduced[i] = (stbi_uc)((orig[i] >> 8) & 0xFF); // top half of each byte is sufficient approx of 16->8 bit scaling + + STBI_FREE(orig); + return reduced; +} + +static stbi__uint16 *stbi__convert_8_to_16(stbi_uc *orig, int w, int h, int channels) +{ + int i; + int img_len = w * h * channels; + stbi__uint16 *enlarged; + + enlarged = (stbi__uint16 *) stbi__malloc(img_len*2); + if (enlarged == NULL) return (stbi__uint16 *) stbi__errpuc("outofmem", "Out of memory"); + + for (i = 0; i < img_len; ++i) + enlarged[i] = (stbi__uint16)((orig[i] << 8) + orig[i]); // replicate to high and low byte, maps 0->0, 255->0xffff + + STBI_FREE(orig); + return enlarged; +} + +static void stbi__vertical_flip(void *image, int w, int h, int bytes_per_pixel) +{ + int row; + size_t bytes_per_row = (size_t)w * bytes_per_pixel; + stbi_uc temp[2048]; + stbi_uc *bytes = (stbi_uc *)image; + + for (row = 0; row < (h>>1); row++) { + stbi_uc *row0 = bytes + row*bytes_per_row; + stbi_uc *row1 = bytes + (h - row - 1)*bytes_per_row; + // swap row0 with row1 + size_t bytes_left = bytes_per_row; + while (bytes_left) { + size_t bytes_copy = (bytes_left < sizeof(temp)) ? bytes_left : sizeof(temp); + memcpy(temp, row0, bytes_copy); + memcpy(row0, row1, bytes_copy); + memcpy(row1, temp, bytes_copy); + row0 += bytes_copy; + row1 += bytes_copy; + bytes_left -= bytes_copy; + } + } +} + +static void stbi__vertical_flip_slices(void *image, int w, int h, int z, int bytes_per_pixel) +{ + int slice; + int slice_size = w * h * bytes_per_pixel; + + stbi_uc *bytes = (stbi_uc *)image; + for (slice = 0; slice < z; ++slice) { + stbi__vertical_flip(bytes, w, h, bytes_per_pixel); + bytes += slice_size; + } +} + +static unsigned char *stbi__load_and_postprocess_8bit(stbi__context *s, int *x, int *y, int *comp, int req_comp) +{ + stbi__result_info ri; + void *result = stbi__load_main(s, x, y, comp, req_comp, &ri, 8); + + if (result == NULL) + return NULL; + + if (ri.bits_per_channel != 8) { + STBI_ASSERT(ri.bits_per_channel == 16); + result = stbi__convert_16_to_8((stbi__uint16 *) result, *x, *y, req_comp == 0 ? *comp : req_comp); + ri.bits_per_channel = 8; + } + + // @TODO: move stbi__convert_format to here + + if (stbi__vertically_flip_on_load) { + int channels = req_comp ? req_comp : *comp; + stbi__vertical_flip(result, *x, *y, channels * sizeof(stbi_uc)); + } + + return (unsigned char *) result; +} + +static stbi__uint16 *stbi__load_and_postprocess_16bit(stbi__context *s, int *x, int *y, int *comp, int req_comp) +{ + stbi__result_info ri; + void *result = stbi__load_main(s, x, y, comp, req_comp, &ri, 16); + + if (result == NULL) + return NULL; + + if (ri.bits_per_channel != 16) { + STBI_ASSERT(ri.bits_per_channel == 8); + result = stbi__convert_8_to_16((stbi_uc *) result, *x, *y, req_comp == 0 ? *comp : req_comp); + ri.bits_per_channel = 16; + } + + // @TODO: move stbi__convert_format16 to here + // @TODO: special case RGB-to-Y (and RGBA-to-YA) for 8-bit-to-16-bit case to keep more precision + + if (stbi__vertically_flip_on_load) { + int channels = req_comp ? req_comp : *comp; + stbi__vertical_flip(result, *x, *y, channels * sizeof(stbi__uint16)); + } + + return (stbi__uint16 *) result; +} + +#if !defined(STBI_NO_HDR) || !defined(STBI_NO_LINEAR) +static void stbi__float_postprocess(float *result, int *x, int *y, int *comp, int req_comp) +{ + if (stbi__vertically_flip_on_load && result != NULL) { + int channels = req_comp ? req_comp : *comp; + stbi__vertical_flip(result, *x, *y, channels * sizeof(float)); + } +} +#endif + +#ifndef STBI_NO_STDIO + +static FILE *stbi__fopen(char const *filename, char const *mode) +{ + FILE *f; +#if defined(_MSC_VER) && _MSC_VER >= 1400 + if (0 != fopen_s(&f, filename, mode)) + f=0; +#else + f = fopen(filename, mode); +#endif + return f; +} + + +STBIDEF stbi_uc *stbi_load(char const *filename, int *x, int *y, int *comp, int req_comp) +{ + FILE *f = stbi__fopen(filename, "rb"); + unsigned char *result; + if (!f) return stbi__errpuc("can't fopen", "Unable to open file"); + result = stbi_load_from_file(f,x,y,comp,req_comp); + fclose(f); + return result; +} + +STBIDEF stbi_uc *stbi_load_from_file(FILE *f, int *x, int *y, int *comp, int req_comp) +{ + unsigned char *result; + stbi__context s; + stbi__start_file(&s,f); + result = stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp); + if (result) { + // need to 'unget' all the characters in the IO buffer + fseek(f, - (int) (s.img_buffer_end - s.img_buffer), SEEK_CUR); + } + return result; +} + +STBIDEF stbi__uint16 *stbi_load_from_file_16(FILE *f, int *x, int *y, int *comp, int req_comp) +{ + stbi__uint16 *result; + stbi__context s; + stbi__start_file(&s,f); + result = stbi__load_and_postprocess_16bit(&s,x,y,comp,req_comp); + if (result) { + // need to 'unget' all the characters in the IO buffer + fseek(f, - (int) (s.img_buffer_end - s.img_buffer), SEEK_CUR); + } + return result; +} + +STBIDEF stbi_us *stbi_load_16(char const *filename, int *x, int *y, int *comp, int req_comp) +{ + FILE *f = stbi__fopen(filename, "rb"); + stbi__uint16 *result; + if (!f) return (stbi_us *) stbi__errpuc("can't fopen", "Unable to open file"); + result = stbi_load_from_file_16(f,x,y,comp,req_comp); + fclose(f); + return result; +} + + +#endif //!STBI_NO_STDIO + +STBIDEF stbi_us *stbi_load_16_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels) +{ + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__load_and_postprocess_16bit(&s,x,y,channels_in_file,desired_channels); +} + +STBIDEF stbi_us *stbi_load_16_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels) +{ + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *)clbk, user); + return stbi__load_and_postprocess_16bit(&s,x,y,channels_in_file,desired_channels); +} + +STBIDEF stbi_uc *stbi_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp) +{ + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp); +} + +STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp) +{ + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user); + return stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp); +} + +#ifndef STBI_NO_GIF +STBIDEF stbi_uc *stbi_load_gif_from_memory(stbi_uc const *buffer, int len, int **delays, int *x, int *y, int *z, int *comp, int req_comp) +{ + unsigned char *result; + stbi__context s; + stbi__start_mem(&s,buffer,len); + + result = (unsigned char*) stbi__load_gif_main(&s, delays, x, y, z, comp, req_comp); + if (stbi__vertically_flip_on_load) { + stbi__vertical_flip_slices( result, *x, *y, *z, *comp ); + } + + return result; +} +#endif + +#ifndef STBI_NO_LINEAR +static float *stbi__loadf_main(stbi__context *s, int *x, int *y, int *comp, int req_comp) +{ + unsigned char *data; + #ifndef STBI_NO_HDR + if (stbi__hdr_test(s)) { + stbi__result_info ri; + float *hdr_data = stbi__hdr_load(s,x,y,comp,req_comp, &ri); + if (hdr_data) + stbi__float_postprocess(hdr_data,x,y,comp,req_comp); + return hdr_data; + } + #endif + data = stbi__load_and_postprocess_8bit(s, x, y, comp, req_comp); + if (data) + return stbi__ldr_to_hdr(data, *x, *y, req_comp ? req_comp : *comp); + return stbi__errpf("unknown image type", "Image not of any known type, or corrupt"); +} + +STBIDEF float *stbi_loadf_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp) +{ + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__loadf_main(&s,x,y,comp,req_comp); +} + +STBIDEF float *stbi_loadf_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp) +{ + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user); + return stbi__loadf_main(&s,x,y,comp,req_comp); +} + +#ifndef STBI_NO_STDIO +STBIDEF float *stbi_loadf(char const *filename, int *x, int *y, int *comp, int req_comp) +{ + float *result; + FILE *f = stbi__fopen(filename, "rb"); + if (!f) return stbi__errpf("can't fopen", "Unable to open file"); + result = stbi_loadf_from_file(f,x,y,comp,req_comp); + fclose(f); + return result; +} + +STBIDEF float *stbi_loadf_from_file(FILE *f, int *x, int *y, int *comp, int req_comp) +{ + stbi__context s; + stbi__start_file(&s,f); + return stbi__loadf_main(&s,x,y,comp,req_comp); +} +#endif // !STBI_NO_STDIO + +#endif // !STBI_NO_LINEAR + +// these is-hdr-or-not is defined independent of whether STBI_NO_LINEAR is +// defined, for API simplicity; if STBI_NO_LINEAR is defined, it always +// reports false! + +STBIDEF int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len) +{ + #ifndef STBI_NO_HDR + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__hdr_test(&s); + #else + STBI_NOTUSED(buffer); + STBI_NOTUSED(len); + return 0; + #endif +} + +#ifndef STBI_NO_STDIO +STBIDEF int stbi_is_hdr (char const *filename) +{ + FILE *f = stbi__fopen(filename, "rb"); + int result=0; + if (f) { + result = stbi_is_hdr_from_file(f); + fclose(f); + } + return result; +} + +STBIDEF int stbi_is_hdr_from_file(FILE *f) +{ + #ifndef STBI_NO_HDR + long pos = ftell(f); + int res; + stbi__context s; + stbi__start_file(&s,f); + res = stbi__hdr_test(&s); + fseek(f, pos, SEEK_SET); + return res; + #else + STBI_NOTUSED(f); + return 0; + #endif +} +#endif // !STBI_NO_STDIO + +STBIDEF int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user) +{ + #ifndef STBI_NO_HDR + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user); + return stbi__hdr_test(&s); + #else + STBI_NOTUSED(clbk); + STBI_NOTUSED(user); + return 0; + #endif +} + +#ifndef STBI_NO_LINEAR +static float stbi__l2h_gamma=2.2f, stbi__l2h_scale=1.0f; + +STBIDEF void stbi_ldr_to_hdr_gamma(float gamma) { stbi__l2h_gamma = gamma; } +STBIDEF void stbi_ldr_to_hdr_scale(float scale) { stbi__l2h_scale = scale; } +#endif + +static float stbi__h2l_gamma_i=1.0f/2.2f, stbi__h2l_scale_i=1.0f; + +STBIDEF void stbi_hdr_to_ldr_gamma(float gamma) { stbi__h2l_gamma_i = 1/gamma; } +STBIDEF void stbi_hdr_to_ldr_scale(float scale) { stbi__h2l_scale_i = 1/scale; } + + +////////////////////////////////////////////////////////////////////////////// +// +// Common code used by all image loaders +// + +enum +{ + STBI__SCAN_load=0, + STBI__SCAN_type, + STBI__SCAN_header +}; + +static void stbi__refill_buffer(stbi__context *s) +{ + int n = (s->io.read)(s->io_user_data,(char*)s->buffer_start,s->buflen); + if (n == 0) { + // at end of file, treat same as if from memory, but need to handle case + // where s->img_buffer isn't pointing to safe memory, e.g. 0-byte file + s->read_from_callbacks = 0; + s->img_buffer = s->buffer_start; + s->img_buffer_end = s->buffer_start+1; + *s->img_buffer = 0; + } else { + s->img_buffer = s->buffer_start; + s->img_buffer_end = s->buffer_start + n; + } +} + +stbi_inline static stbi_uc stbi__get8(stbi__context *s) +{ + if (s->img_buffer < s->img_buffer_end) + return *s->img_buffer++; + if (s->read_from_callbacks) { + stbi__refill_buffer(s); + return *s->img_buffer++; + } + return 0; +} + +stbi_inline static int stbi__at_eof(stbi__context *s) +{ + if (s->io.read) { + if (!(s->io.eof)(s->io_user_data)) return 0; + // if feof() is true, check if buffer = end + // special case: we've only got the special 0 character at the end + if (s->read_from_callbacks == 0) return 1; + } + + return s->img_buffer >= s->img_buffer_end; +} + +static void stbi__skip(stbi__context *s, int n) +{ + if (n < 0) { + s->img_buffer = s->img_buffer_end; + return; + } + if (s->io.read) { + int blen = (int) (s->img_buffer_end - s->img_buffer); + if (blen < n) { + s->img_buffer = s->img_buffer_end; + (s->io.skip)(s->io_user_data, n - blen); + return; + } + } + s->img_buffer += n; +} + +static int stbi__getn(stbi__context *s, stbi_uc *buffer, int n) +{ + if (s->io.read) { + int blen = (int) (s->img_buffer_end - s->img_buffer); + if (blen < n) { + int res, count; + + memcpy(buffer, s->img_buffer, blen); + + count = (s->io.read)(s->io_user_data, (char*) buffer + blen, n - blen); + res = (count == (n-blen)); + s->img_buffer = s->img_buffer_end; + return res; + } + } + + if (s->img_buffer+n <= s->img_buffer_end) { + memcpy(buffer, s->img_buffer, n); + s->img_buffer += n; + return 1; + } else + return 0; +} + +static int stbi__get16be(stbi__context *s) +{ + int z = stbi__get8(s); + return (z << 8) + stbi__get8(s); +} + +static stbi__uint32 stbi__get32be(stbi__context *s) +{ + stbi__uint32 z = stbi__get16be(s); + return (z << 16) + stbi__get16be(s); +} + +#if defined(STBI_NO_BMP) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) +// nothing +#else +static int stbi__get16le(stbi__context *s) +{ + int z = stbi__get8(s); + return z + (stbi__get8(s) << 8); +} +#endif + +#ifndef STBI_NO_BMP +static stbi__uint32 stbi__get32le(stbi__context *s) +{ + stbi__uint32 z = stbi__get16le(s); + return z + (stbi__get16le(s) << 16); +} +#endif + +#define STBI__BYTECAST(x) ((stbi_uc) ((x) & 255)) // truncate int to byte without warnings + + +////////////////////////////////////////////////////////////////////////////// +// +// generic converter from built-in img_n to req_comp +// individual types do this automatically as much as possible (e.g. jpeg +// does all cases internally since it needs to colorspace convert anyway, +// and it never has alpha, so very few cases ). png can automatically +// interleave an alpha=255 channel, but falls back to this for other cases +// +// assume data buffer is malloced, so malloc a new one and free that one +// only failure mode is malloc failing + +static stbi_uc stbi__compute_y(int r, int g, int b) +{ + return (stbi_uc) (((r*77) + (g*150) + (29*b)) >> 8); +} + +static unsigned char *stbi__convert_format(unsigned char *data, int img_n, int req_comp, unsigned int x, unsigned int y) +{ + int i,j; + unsigned char *good; + + if (req_comp == img_n) return data; + STBI_ASSERT(req_comp >= 1 && req_comp <= 4); + + good = (unsigned char *) stbi__malloc_mad3(req_comp, x, y, 0); + if (good == NULL) { + STBI_FREE(data); + return stbi__errpuc("outofmem", "Out of memory"); + } + + for (j=0; j < (int) y; ++j) { + unsigned char *src = data + j * x * img_n ; + unsigned char *dest = good + j * x * req_comp; + + #define STBI__COMBO(a,b) ((a)*8+(b)) + #define STBI__CASE(a,b) case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b) + // convert source image with img_n components to one with req_comp components; + // avoid switch per pixel, so use switch per scanline and massive macros + switch (STBI__COMBO(img_n, req_comp)) { + STBI__CASE(1,2) { dest[0]=src[0], dest[1]=255; } break; + STBI__CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; + STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0], dest[3]=255; } break; + STBI__CASE(2,1) { dest[0]=src[0]; } break; + STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; + STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0], dest[3]=src[1]; } break; + STBI__CASE(3,4) { dest[0]=src[0],dest[1]=src[1],dest[2]=src[2],dest[3]=255; } break; + STBI__CASE(3,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); } break; + STBI__CASE(3,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]), dest[1] = 255; } break; + STBI__CASE(4,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); } break; + STBI__CASE(4,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]), dest[1] = src[3]; } break; + STBI__CASE(4,3) { dest[0]=src[0],dest[1]=src[1],dest[2]=src[2]; } break; + default: STBI_ASSERT(0); + } + #undef STBI__CASE + } + + STBI_FREE(data); + return good; +} + +static stbi__uint16 stbi__compute_y_16(int r, int g, int b) +{ + return (stbi__uint16) (((r*77) + (g*150) + (29*b)) >> 8); +} + +static stbi__uint16 *stbi__convert_format16(stbi__uint16 *data, int img_n, int req_comp, unsigned int x, unsigned int y) +{ + int i,j; + stbi__uint16 *good; + + if (req_comp == img_n) return data; + STBI_ASSERT(req_comp >= 1 && req_comp <= 4); + + good = (stbi__uint16 *) stbi__malloc(req_comp * x * y * 2); + if (good == NULL) { + STBI_FREE(data); + return (stbi__uint16 *) stbi__errpuc("outofmem", "Out of memory"); + } + + for (j=0; j < (int) y; ++j) { + stbi__uint16 *src = data + j * x * img_n ; + stbi__uint16 *dest = good + j * x * req_comp; + + #define STBI__COMBO(a,b) ((a)*8+(b)) + #define STBI__CASE(a,b) case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b) + // convert source image with img_n components to one with req_comp components; + // avoid switch per pixel, so use switch per scanline and massive macros + switch (STBI__COMBO(img_n, req_comp)) { + STBI__CASE(1,2) { dest[0]=src[0], dest[1]=0xffff; } break; + STBI__CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; + STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0], dest[3]=0xffff; } break; + STBI__CASE(2,1) { dest[0]=src[0]; } break; + STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; + STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0], dest[3]=src[1]; } break; + STBI__CASE(3,4) { dest[0]=src[0],dest[1]=src[1],dest[2]=src[2],dest[3]=0xffff; } break; + STBI__CASE(3,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); } break; + STBI__CASE(3,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]), dest[1] = 0xffff; } break; + STBI__CASE(4,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); } break; + STBI__CASE(4,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]), dest[1] = src[3]; } break; + STBI__CASE(4,3) { dest[0]=src[0],dest[1]=src[1],dest[2]=src[2]; } break; + default: STBI_ASSERT(0); + } + #undef STBI__CASE + } + + STBI_FREE(data); + return good; +} + +#ifndef STBI_NO_LINEAR +static float *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp) +{ + int i,k,n; + float *output; + if (!data) return NULL; + output = (float *) stbi__malloc_mad4(x, y, comp, sizeof(float), 0); + if (output == NULL) { STBI_FREE(data); return stbi__errpf("outofmem", "Out of memory"); } + // compute number of non-alpha components + if (comp & 1) n = comp; else n = comp-1; + for (i=0; i < x*y; ++i) { + for (k=0; k < n; ++k) { + output[i*comp + k] = (float) (pow(data[i*comp+k]/255.0f, stbi__l2h_gamma) * stbi__l2h_scale); + } + if (k < comp) output[i*comp + k] = data[i*comp+k]/255.0f; + } + STBI_FREE(data); + return output; +} +#endif + +#ifndef STBI_NO_HDR +#define stbi__float2int(x) ((int) (x)) +static stbi_uc *stbi__hdr_to_ldr(float *data, int x, int y, int comp) +{ + int i,k,n; + stbi_uc *output; + if (!data) return NULL; + output = (stbi_uc *) stbi__malloc_mad3(x, y, comp, 0); + if (output == NULL) { STBI_FREE(data); return stbi__errpuc("outofmem", "Out of memory"); } + // compute number of non-alpha components + if (comp & 1) n = comp; else n = comp-1; + for (i=0; i < x*y; ++i) { + for (k=0; k < n; ++k) { + float z = (float) pow(data[i*comp+k]*stbi__h2l_scale_i, stbi__h2l_gamma_i) * 255 + 0.5f; + if (z < 0) z = 0; + if (z > 255) z = 255; + output[i*comp + k] = (stbi_uc) stbi__float2int(z); + } + if (k < comp) { + float z = data[i*comp+k] * 255 + 0.5f; + if (z < 0) z = 0; + if (z > 255) z = 255; + output[i*comp + k] = (stbi_uc) stbi__float2int(z); + } + } + STBI_FREE(data); + return output; +} +#endif + +////////////////////////////////////////////////////////////////////////////// +// +// "baseline" JPEG/JFIF decoder +// +// simple implementation +// - doesn't support delayed output of y-dimension +// - simple interface (only one output format: 8-bit interleaved RGB) +// - doesn't try to recover corrupt jpegs +// - doesn't allow partial loading, loading multiple at once +// - still fast on x86 (copying globals into locals doesn't help x86) +// - allocates lots of intermediate memory (full size of all components) +// - non-interleaved case requires this anyway +// - allows good upsampling (see next) +// high-quality +// - upsampled channels are bilinearly interpolated, even across blocks +// - quality integer IDCT derived from IJG's 'slow' +// performance +// - fast huffman; reasonable integer IDCT +// - some SIMD kernels for common paths on targets with SSE2/NEON +// - uses a lot of intermediate memory, could cache poorly + +#ifndef STBI_NO_JPEG + +// huffman decoding acceleration +#define FAST_BITS 9 // larger handles more cases; smaller stomps less cache + +typedef struct +{ + stbi_uc fast[1 << FAST_BITS]; + // weirdly, repacking this into AoS is a 10% speed loss, instead of a win + stbi__uint16 code[256]; + stbi_uc values[256]; + stbi_uc size[257]; + unsigned int maxcode[18]; + int delta[17]; // old 'firstsymbol' - old 'firstcode' +} stbi__huffman; + +typedef struct +{ + stbi__context *s; + stbi__huffman huff_dc[4]; + stbi__huffman huff_ac[4]; + stbi__uint16 dequant[4][64]; + stbi__int16 fast_ac[4][1 << FAST_BITS]; + +// sizes for components, interleaved MCUs + int img_h_max, img_v_max; + int img_mcu_x, img_mcu_y; + int img_mcu_w, img_mcu_h; + +// definition of jpeg image component + struct + { + int id; + int h,v; + int tq; + int hd,ha; + int dc_pred; + + int x,y,w2,h2; + stbi_uc *data; + void *raw_data, *raw_coeff; + stbi_uc *linebuf; + short *coeff; // progressive only + int coeff_w, coeff_h; // number of 8x8 coefficient blocks + } img_comp[4]; + + stbi__uint32 code_buffer; // jpeg entropy-coded buffer + int code_bits; // number of valid bits + unsigned char marker; // marker seen while filling entropy buffer + int nomore; // flag if we saw a marker so must stop + + int progressive; + int spec_start; + int spec_end; + int succ_high; + int succ_low; + int eob_run; + int jfif; + int app14_color_transform; // Adobe APP14 tag + int rgb; + + int scan_n, order[4]; + int restart_interval, todo; + +// kernels + void (*idct_block_kernel)(stbi_uc *out, int out_stride, short data[64]); + void (*YCbCr_to_RGB_kernel)(stbi_uc *out, const stbi_uc *y, const stbi_uc *pcb, const stbi_uc *pcr, int count, int step); + stbi_uc *(*resample_row_hv_2_kernel)(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs); +} stbi__jpeg; + +static int stbi__build_huffman(stbi__huffman *h, int *count) +{ + int i,j,k=0; + unsigned int code; + // build size list for each symbol (from JPEG spec) + for (i=0; i < 16; ++i) + for (j=0; j < count[i]; ++j) + h->size[k++] = (stbi_uc) (i+1); + h->size[k] = 0; + + // compute actual symbols (from jpeg spec) + code = 0; + k = 0; + for(j=1; j <= 16; ++j) { + // compute delta to add to code to compute symbol id + h->delta[j] = k - code; + if (h->size[k] == j) { + while (h->size[k] == j) + h->code[k++] = (stbi__uint16) (code++); + if (code-1 >= (1u << j)) return stbi__err("bad code lengths","Corrupt JPEG"); + } + // compute largest code + 1 for this size, preshifted as needed later + h->maxcode[j] = code << (16-j); + code <<= 1; + } + h->maxcode[j] = 0xffffffff; + + // build non-spec acceleration table; 255 is flag for not-accelerated + memset(h->fast, 255, 1 << FAST_BITS); + for (i=0; i < k; ++i) { + int s = h->size[i]; + if (s <= FAST_BITS) { + int c = h->code[i] << (FAST_BITS-s); + int m = 1 << (FAST_BITS-s); + for (j=0; j < m; ++j) { + h->fast[c+j] = (stbi_uc) i; + } + } + } + return 1; +} + +// build a table that decodes both magnitude and value of small ACs in +// one go. +static void stbi__build_fast_ac(stbi__int16 *fast_ac, stbi__huffman *h) +{ + int i; + for (i=0; i < (1 << FAST_BITS); ++i) { + stbi_uc fast = h->fast[i]; + fast_ac[i] = 0; + if (fast < 255) { + int rs = h->values[fast]; + int run = (rs >> 4) & 15; + int magbits = rs & 15; + int len = h->size[fast]; + + if (magbits && len + magbits <= FAST_BITS) { + // magnitude code followed by receive_extend code + int k = ((i << len) & ((1 << FAST_BITS) - 1)) >> (FAST_BITS - magbits); + int m = 1 << (magbits - 1); + if (k < m) k += (~0U << magbits) + 1; + // if the result is small enough, we can fit it in fast_ac table + if (k >= -128 && k <= 127) + fast_ac[i] = (stbi__int16) ((k * 256) + (run * 16) + (len + magbits)); + } + } + } +} + +static void stbi__grow_buffer_unsafe(stbi__jpeg *j) +{ + do { + unsigned int b = j->nomore ? 0 : stbi__get8(j->s); + if (b == 0xff) { + int c = stbi__get8(j->s); + while (c == 0xff) c = stbi__get8(j->s); // consume fill bytes + if (c != 0) { + j->marker = (unsigned char) c; + j->nomore = 1; + return; + } + } + j->code_buffer |= b << (24 - j->code_bits); + j->code_bits += 8; + } while (j->code_bits <= 24); +} + +// (1 << n) - 1 +static const stbi__uint32 stbi__bmask[17]={0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535}; + +// decode a jpeg huffman value from the bitstream +stbi_inline static int stbi__jpeg_huff_decode(stbi__jpeg *j, stbi__huffman *h) +{ + unsigned int temp; + int c,k; + + if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); + + // look at the top FAST_BITS and determine what symbol ID it is, + // if the code is <= FAST_BITS + c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1); + k = h->fast[c]; + if (k < 255) { + int s = h->size[k]; + if (s > j->code_bits) + return -1; + j->code_buffer <<= s; + j->code_bits -= s; + return h->values[k]; + } + + // naive test is to shift the code_buffer down so k bits are + // valid, then test against maxcode. To speed this up, we've + // preshifted maxcode left so that it has (16-k) 0s at the + // end; in other words, regardless of the number of bits, it + // wants to be compared against something shifted to have 16; + // that way we don't need to shift inside the loop. + temp = j->code_buffer >> 16; + for (k=FAST_BITS+1 ; ; ++k) + if (temp < h->maxcode[k]) + break; + if (k == 17) { + // error! code not found + j->code_bits -= 16; + return -1; + } + + if (k > j->code_bits) + return -1; + + // convert the huffman code to the symbol id + c = ((j->code_buffer >> (32 - k)) & stbi__bmask[k]) + h->delta[k]; + STBI_ASSERT((((j->code_buffer) >> (32 - h->size[c])) & stbi__bmask[h->size[c]]) == h->code[c]); + + // convert the id to a symbol + j->code_bits -= k; + j->code_buffer <<= k; + return h->values[c]; +} + +// bias[n] = (-1<code_bits < n) stbi__grow_buffer_unsafe(j); + + sgn = (stbi__int32)j->code_buffer >> 31; // sign bit is always in MSB + k = stbi_lrot(j->code_buffer, n); + STBI_ASSERT(n >= 0 && n < (int) (sizeof(stbi__bmask)/sizeof(*stbi__bmask))); + j->code_buffer = k & ~stbi__bmask[n]; + k &= stbi__bmask[n]; + j->code_bits -= n; + return k + (stbi__jbias[n] & ~sgn); +} + +// get some unsigned bits +stbi_inline static int stbi__jpeg_get_bits(stbi__jpeg *j, int n) +{ + unsigned int k; + if (j->code_bits < n) stbi__grow_buffer_unsafe(j); + k = stbi_lrot(j->code_buffer, n); + j->code_buffer = k & ~stbi__bmask[n]; + k &= stbi__bmask[n]; + j->code_bits -= n; + return k; +} + +stbi_inline static int stbi__jpeg_get_bit(stbi__jpeg *j) +{ + unsigned int k; + if (j->code_bits < 1) stbi__grow_buffer_unsafe(j); + k = j->code_buffer; + j->code_buffer <<= 1; + --j->code_bits; + return k & 0x80000000; +} + +// given a value that's at position X in the zigzag stream, +// where does it appear in the 8x8 matrix coded as row-major? +static const stbi_uc stbi__jpeg_dezigzag[64+15] = +{ + 0, 1, 8, 16, 9, 2, 3, 10, + 17, 24, 32, 25, 18, 11, 4, 5, + 12, 19, 26, 33, 40, 48, 41, 34, + 27, 20, 13, 6, 7, 14, 21, 28, + 35, 42, 49, 56, 57, 50, 43, 36, + 29, 22, 15, 23, 30, 37, 44, 51, + 58, 59, 52, 45, 38, 31, 39, 46, + 53, 60, 61, 54, 47, 55, 62, 63, + // let corrupt input sample past end + 63, 63, 63, 63, 63, 63, 63, 63, + 63, 63, 63, 63, 63, 63, 63 +}; + +// decode one 64-entry block-- +static int stbi__jpeg_decode_block(stbi__jpeg *j, short data[64], stbi__huffman *hdc, stbi__huffman *hac, stbi__int16 *fac, int b, stbi__uint16 *dequant) +{ + int diff,dc,k; + int t; + + if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); + t = stbi__jpeg_huff_decode(j, hdc); + if (t < 0) return stbi__err("bad huffman code","Corrupt JPEG"); + + // 0 all the ac values now so we can do it 32-bits at a time + memset(data,0,64*sizeof(data[0])); + + diff = t ? stbi__extend_receive(j, t) : 0; + dc = j->img_comp[b].dc_pred + diff; + j->img_comp[b].dc_pred = dc; + data[0] = (short) (dc * dequant[0]); + + // decode AC components, see JPEG spec + k = 1; + do { + unsigned int zig; + int c,r,s; + if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); + c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1); + r = fac[c]; + if (r) { // fast-AC path + k += (r >> 4) & 15; // run + s = r & 15; // combined length + j->code_buffer <<= s; + j->code_bits -= s; + // decode into unzigzag'd location + zig = stbi__jpeg_dezigzag[k++]; + data[zig] = (short) ((r >> 8) * dequant[zig]); + } else { + int rs = stbi__jpeg_huff_decode(j, hac); + if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG"); + s = rs & 15; + r = rs >> 4; + if (s == 0) { + if (rs != 0xf0) break; // end block + k += 16; + } else { + k += r; + // decode into unzigzag'd location + zig = stbi__jpeg_dezigzag[k++]; + data[zig] = (short) (stbi__extend_receive(j,s) * dequant[zig]); + } + } + } while (k < 64); + return 1; +} + +static int stbi__jpeg_decode_block_prog_dc(stbi__jpeg *j, short data[64], stbi__huffman *hdc, int b) +{ + int diff,dc; + int t; + if (j->spec_end != 0) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); + + if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); + + if (j->succ_high == 0) { + // first scan for DC coefficient, must be first + memset(data,0,64*sizeof(data[0])); // 0 all the ac values now + t = stbi__jpeg_huff_decode(j, hdc); + diff = t ? stbi__extend_receive(j, t) : 0; + + dc = j->img_comp[b].dc_pred + diff; + j->img_comp[b].dc_pred = dc; + data[0] = (short) (dc << j->succ_low); + } else { + // refinement scan for DC coefficient + if (stbi__jpeg_get_bit(j)) + data[0] += (short) (1 << j->succ_low); + } + return 1; +} + +// @OPTIMIZE: store non-zigzagged during the decode passes, +// and only de-zigzag when dequantizing +static int stbi__jpeg_decode_block_prog_ac(stbi__jpeg *j, short data[64], stbi__huffman *hac, stbi__int16 *fac) +{ + int k; + if (j->spec_start == 0) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); + + if (j->succ_high == 0) { + int shift = j->succ_low; + + if (j->eob_run) { + --j->eob_run; + return 1; + } + + k = j->spec_start; + do { + unsigned int zig; + int c,r,s; + if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); + c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1); + r = fac[c]; + if (r) { // fast-AC path + k += (r >> 4) & 15; // run + s = r & 15; // combined length + j->code_buffer <<= s; + j->code_bits -= s; + zig = stbi__jpeg_dezigzag[k++]; + data[zig] = (short) ((r >> 8) << shift); + } else { + int rs = stbi__jpeg_huff_decode(j, hac); + if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG"); + s = rs & 15; + r = rs >> 4; + if (s == 0) { + if (r < 15) { + j->eob_run = (1 << r); + if (r) + j->eob_run += stbi__jpeg_get_bits(j, r); + --j->eob_run; + break; + } + k += 16; + } else { + k += r; + zig = stbi__jpeg_dezigzag[k++]; + data[zig] = (short) (stbi__extend_receive(j,s) << shift); + } + } + } while (k <= j->spec_end); + } else { + // refinement scan for these AC coefficients + + short bit = (short) (1 << j->succ_low); + + if (j->eob_run) { + --j->eob_run; + for (k = j->spec_start; k <= j->spec_end; ++k) { + short *p = &data[stbi__jpeg_dezigzag[k]]; + if (*p != 0) + if (stbi__jpeg_get_bit(j)) + if ((*p & bit)==0) { + if (*p > 0) + *p += bit; + else + *p -= bit; + } + } + } else { + k = j->spec_start; + do { + int r,s; + int rs = stbi__jpeg_huff_decode(j, hac); // @OPTIMIZE see if we can use the fast path here, advance-by-r is so slow, eh + if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG"); + s = rs & 15; + r = rs >> 4; + if (s == 0) { + if (r < 15) { + j->eob_run = (1 << r) - 1; + if (r) + j->eob_run += stbi__jpeg_get_bits(j, r); + r = 64; // force end of block + } else { + // r=15 s=0 should write 16 0s, so we just do + // a run of 15 0s and then write s (which is 0), + // so we don't have to do anything special here + } + } else { + if (s != 1) return stbi__err("bad huffman code", "Corrupt JPEG"); + // sign bit + if (stbi__jpeg_get_bit(j)) + s = bit; + else + s = -bit; + } + + // advance by r + while (k <= j->spec_end) { + short *p = &data[stbi__jpeg_dezigzag[k++]]; + if (*p != 0) { + if (stbi__jpeg_get_bit(j)) + if ((*p & bit)==0) { + if (*p > 0) + *p += bit; + else + *p -= bit; + } + } else { + if (r == 0) { + *p = (short) s; + break; + } + --r; + } + } + } while (k <= j->spec_end); + } + } + return 1; +} + +// take a -128..127 value and stbi__clamp it and convert to 0..255 +stbi_inline static stbi_uc stbi__clamp(int x) +{ + // trick to use a single test to catch both cases + if ((unsigned int) x > 255) { + if (x < 0) return 0; + if (x > 255) return 255; + } + return (stbi_uc) x; +} + +#define stbi__f2f(x) ((int) (((x) * 4096 + 0.5))) +#define stbi__fsh(x) ((x) * 4096) + +// derived from jidctint -- DCT_ISLOW +#define STBI__IDCT_1D(s0,s1,s2,s3,s4,s5,s6,s7) \ + int t0,t1,t2,t3,p1,p2,p3,p4,p5,x0,x1,x2,x3; \ + p2 = s2; \ + p3 = s6; \ + p1 = (p2+p3) * stbi__f2f(0.5411961f); \ + t2 = p1 + p3*stbi__f2f(-1.847759065f); \ + t3 = p1 + p2*stbi__f2f( 0.765366865f); \ + p2 = s0; \ + p3 = s4; \ + t0 = stbi__fsh(p2+p3); \ + t1 = stbi__fsh(p2-p3); \ + x0 = t0+t3; \ + x3 = t0-t3; \ + x1 = t1+t2; \ + x2 = t1-t2; \ + t0 = s7; \ + t1 = s5; \ + t2 = s3; \ + t3 = s1; \ + p3 = t0+t2; \ + p4 = t1+t3; \ + p1 = t0+t3; \ + p2 = t1+t2; \ + p5 = (p3+p4)*stbi__f2f( 1.175875602f); \ + t0 = t0*stbi__f2f( 0.298631336f); \ + t1 = t1*stbi__f2f( 2.053119869f); \ + t2 = t2*stbi__f2f( 3.072711026f); \ + t3 = t3*stbi__f2f( 1.501321110f); \ + p1 = p5 + p1*stbi__f2f(-0.899976223f); \ + p2 = p5 + p2*stbi__f2f(-2.562915447f); \ + p3 = p3*stbi__f2f(-1.961570560f); \ + p4 = p4*stbi__f2f(-0.390180644f); \ + t3 += p1+p4; \ + t2 += p2+p3; \ + t1 += p2+p4; \ + t0 += p1+p3; + +static void stbi__idct_block(stbi_uc *out, int out_stride, short data[64]) +{ + int i,val[64],*v=val; + stbi_uc *o; + short *d = data; + + // columns + for (i=0; i < 8; ++i,++d, ++v) { + // if all zeroes, shortcut -- this avoids dequantizing 0s and IDCTing + if (d[ 8]==0 && d[16]==0 && d[24]==0 && d[32]==0 + && d[40]==0 && d[48]==0 && d[56]==0) { + // no shortcut 0 seconds + // (1|2|3|4|5|6|7)==0 0 seconds + // all separate -0.047 seconds + // 1 && 2|3 && 4|5 && 6|7: -0.047 seconds + int dcterm = d[0]*4; + v[0] = v[8] = v[16] = v[24] = v[32] = v[40] = v[48] = v[56] = dcterm; + } else { + STBI__IDCT_1D(d[ 0],d[ 8],d[16],d[24],d[32],d[40],d[48],d[56]) + // constants scaled things up by 1<<12; let's bring them back + // down, but keep 2 extra bits of precision + x0 += 512; x1 += 512; x2 += 512; x3 += 512; + v[ 0] = (x0+t3) >> 10; + v[56] = (x0-t3) >> 10; + v[ 8] = (x1+t2) >> 10; + v[48] = (x1-t2) >> 10; + v[16] = (x2+t1) >> 10; + v[40] = (x2-t1) >> 10; + v[24] = (x3+t0) >> 10; + v[32] = (x3-t0) >> 10; + } + } + + for (i=0, v=val, o=out; i < 8; ++i,v+=8,o+=out_stride) { + // no fast case since the first 1D IDCT spread components out + STBI__IDCT_1D(v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7]) + // constants scaled things up by 1<<12, plus we had 1<<2 from first + // loop, plus horizontal and vertical each scale by sqrt(8) so together + // we've got an extra 1<<3, so 1<<17 total we need to remove. + // so we want to round that, which means adding 0.5 * 1<<17, + // aka 65536. Also, we'll end up with -128 to 127 that we want + // to encode as 0..255 by adding 128, so we'll add that before the shift + x0 += 65536 + (128<<17); + x1 += 65536 + (128<<17); + x2 += 65536 + (128<<17); + x3 += 65536 + (128<<17); + // tried computing the shifts into temps, or'ing the temps to see + // if any were out of range, but that was slower + o[0] = stbi__clamp((x0+t3) >> 17); + o[7] = stbi__clamp((x0-t3) >> 17); + o[1] = stbi__clamp((x1+t2) >> 17); + o[6] = stbi__clamp((x1-t2) >> 17); + o[2] = stbi__clamp((x2+t1) >> 17); + o[5] = stbi__clamp((x2-t1) >> 17); + o[3] = stbi__clamp((x3+t0) >> 17); + o[4] = stbi__clamp((x3-t0) >> 17); + } +} + +#ifdef STBI_SSE2 +// sse2 integer IDCT. not the fastest possible implementation but it +// produces bit-identical results to the generic C version so it's +// fully "transparent". +static void stbi__idct_simd(stbi_uc *out, int out_stride, short data[64]) +{ + // This is constructed to match our regular (generic) integer IDCT exactly. + __m128i row0, row1, row2, row3, row4, row5, row6, row7; + __m128i tmp; + + // dot product constant: even elems=x, odd elems=y + #define dct_const(x,y) _mm_setr_epi16((x),(y),(x),(y),(x),(y),(x),(y)) + + // out(0) = c0[even]*x + c0[odd]*y (c0, x, y 16-bit, out 32-bit) + // out(1) = c1[even]*x + c1[odd]*y + #define dct_rot(out0,out1, x,y,c0,c1) \ + __m128i c0##lo = _mm_unpacklo_epi16((x),(y)); \ + __m128i c0##hi = _mm_unpackhi_epi16((x),(y)); \ + __m128i out0##_l = _mm_madd_epi16(c0##lo, c0); \ + __m128i out0##_h = _mm_madd_epi16(c0##hi, c0); \ + __m128i out1##_l = _mm_madd_epi16(c0##lo, c1); \ + __m128i out1##_h = _mm_madd_epi16(c0##hi, c1) + + // out = in << 12 (in 16-bit, out 32-bit) + #define dct_widen(out, in) \ + __m128i out##_l = _mm_srai_epi32(_mm_unpacklo_epi16(_mm_setzero_si128(), (in)), 4); \ + __m128i out##_h = _mm_srai_epi32(_mm_unpackhi_epi16(_mm_setzero_si128(), (in)), 4) + + // wide add + #define dct_wadd(out, a, b) \ + __m128i out##_l = _mm_add_epi32(a##_l, b##_l); \ + __m128i out##_h = _mm_add_epi32(a##_h, b##_h) + + // wide sub + #define dct_wsub(out, a, b) \ + __m128i out##_l = _mm_sub_epi32(a##_l, b##_l); \ + __m128i out##_h = _mm_sub_epi32(a##_h, b##_h) + + // butterfly a/b, add bias, then shift by "s" and pack + #define dct_bfly32o(out0, out1, a,b,bias,s) \ + { \ + __m128i abiased_l = _mm_add_epi32(a##_l, bias); \ + __m128i abiased_h = _mm_add_epi32(a##_h, bias); \ + dct_wadd(sum, abiased, b); \ + dct_wsub(dif, abiased, b); \ + out0 = _mm_packs_epi32(_mm_srai_epi32(sum_l, s), _mm_srai_epi32(sum_h, s)); \ + out1 = _mm_packs_epi32(_mm_srai_epi32(dif_l, s), _mm_srai_epi32(dif_h, s)); \ + } + + // 8-bit interleave step (for transposes) + #define dct_interleave8(a, b) \ + tmp = a; \ + a = _mm_unpacklo_epi8(a, b); \ + b = _mm_unpackhi_epi8(tmp, b) + + // 16-bit interleave step (for transposes) + #define dct_interleave16(a, b) \ + tmp = a; \ + a = _mm_unpacklo_epi16(a, b); \ + b = _mm_unpackhi_epi16(tmp, b) + + #define dct_pass(bias,shift) \ + { \ + /* even part */ \ + dct_rot(t2e,t3e, row2,row6, rot0_0,rot0_1); \ + __m128i sum04 = _mm_add_epi16(row0, row4); \ + __m128i dif04 = _mm_sub_epi16(row0, row4); \ + dct_widen(t0e, sum04); \ + dct_widen(t1e, dif04); \ + dct_wadd(x0, t0e, t3e); \ + dct_wsub(x3, t0e, t3e); \ + dct_wadd(x1, t1e, t2e); \ + dct_wsub(x2, t1e, t2e); \ + /* odd part */ \ + dct_rot(y0o,y2o, row7,row3, rot2_0,rot2_1); \ + dct_rot(y1o,y3o, row5,row1, rot3_0,rot3_1); \ + __m128i sum17 = _mm_add_epi16(row1, row7); \ + __m128i sum35 = _mm_add_epi16(row3, row5); \ + dct_rot(y4o,y5o, sum17,sum35, rot1_0,rot1_1); \ + dct_wadd(x4, y0o, y4o); \ + dct_wadd(x5, y1o, y5o); \ + dct_wadd(x6, y2o, y5o); \ + dct_wadd(x7, y3o, y4o); \ + dct_bfly32o(row0,row7, x0,x7,bias,shift); \ + dct_bfly32o(row1,row6, x1,x6,bias,shift); \ + dct_bfly32o(row2,row5, x2,x5,bias,shift); \ + dct_bfly32o(row3,row4, x3,x4,bias,shift); \ + } + + __m128i rot0_0 = dct_const(stbi__f2f(0.5411961f), stbi__f2f(0.5411961f) + stbi__f2f(-1.847759065f)); + __m128i rot0_1 = dct_const(stbi__f2f(0.5411961f) + stbi__f2f( 0.765366865f), stbi__f2f(0.5411961f)); + __m128i rot1_0 = dct_const(stbi__f2f(1.175875602f) + stbi__f2f(-0.899976223f), stbi__f2f(1.175875602f)); + __m128i rot1_1 = dct_const(stbi__f2f(1.175875602f), stbi__f2f(1.175875602f) + stbi__f2f(-2.562915447f)); + __m128i rot2_0 = dct_const(stbi__f2f(-1.961570560f) + stbi__f2f( 0.298631336f), stbi__f2f(-1.961570560f)); + __m128i rot2_1 = dct_const(stbi__f2f(-1.961570560f), stbi__f2f(-1.961570560f) + stbi__f2f( 3.072711026f)); + __m128i rot3_0 = dct_const(stbi__f2f(-0.390180644f) + stbi__f2f( 2.053119869f), stbi__f2f(-0.390180644f)); + __m128i rot3_1 = dct_const(stbi__f2f(-0.390180644f), stbi__f2f(-0.390180644f) + stbi__f2f( 1.501321110f)); + + // rounding biases in column/row passes, see stbi__idct_block for explanation. + __m128i bias_0 = _mm_set1_epi32(512); + __m128i bias_1 = _mm_set1_epi32(65536 + (128<<17)); + + // load + row0 = _mm_load_si128((const __m128i *) (data + 0*8)); + row1 = _mm_load_si128((const __m128i *) (data + 1*8)); + row2 = _mm_load_si128((const __m128i *) (data + 2*8)); + row3 = _mm_load_si128((const __m128i *) (data + 3*8)); + row4 = _mm_load_si128((const __m128i *) (data + 4*8)); + row5 = _mm_load_si128((const __m128i *) (data + 5*8)); + row6 = _mm_load_si128((const __m128i *) (data + 6*8)); + row7 = _mm_load_si128((const __m128i *) (data + 7*8)); + + // column pass + dct_pass(bias_0, 10); + + { + // 16bit 8x8 transpose pass 1 + dct_interleave16(row0, row4); + dct_interleave16(row1, row5); + dct_interleave16(row2, row6); + dct_interleave16(row3, row7); + + // transpose pass 2 + dct_interleave16(row0, row2); + dct_interleave16(row1, row3); + dct_interleave16(row4, row6); + dct_interleave16(row5, row7); + + // transpose pass 3 + dct_interleave16(row0, row1); + dct_interleave16(row2, row3); + dct_interleave16(row4, row5); + dct_interleave16(row6, row7); + } + + // row pass + dct_pass(bias_1, 17); + + { + // pack + __m128i p0 = _mm_packus_epi16(row0, row1); // a0a1a2a3...a7b0b1b2b3...b7 + __m128i p1 = _mm_packus_epi16(row2, row3); + __m128i p2 = _mm_packus_epi16(row4, row5); + __m128i p3 = _mm_packus_epi16(row6, row7); + + // 8bit 8x8 transpose pass 1 + dct_interleave8(p0, p2); // a0e0a1e1... + dct_interleave8(p1, p3); // c0g0c1g1... + + // transpose pass 2 + dct_interleave8(p0, p1); // a0c0e0g0... + dct_interleave8(p2, p3); // b0d0f0h0... + + // transpose pass 3 + dct_interleave8(p0, p2); // a0b0c0d0... + dct_interleave8(p1, p3); // a4b4c4d4... + + // store + _mm_storel_epi64((__m128i *) out, p0); out += out_stride; + _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p0, 0x4e)); out += out_stride; + _mm_storel_epi64((__m128i *) out, p2); out += out_stride; + _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p2, 0x4e)); out += out_stride; + _mm_storel_epi64((__m128i *) out, p1); out += out_stride; + _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p1, 0x4e)); out += out_stride; + _mm_storel_epi64((__m128i *) out, p3); out += out_stride; + _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p3, 0x4e)); + } + +#undef dct_const +#undef dct_rot +#undef dct_widen +#undef dct_wadd +#undef dct_wsub +#undef dct_bfly32o +#undef dct_interleave8 +#undef dct_interleave16 +#undef dct_pass +} + +#endif // STBI_SSE2 + +#ifdef STBI_NEON + +// NEON integer IDCT. should produce bit-identical +// results to the generic C version. +static void stbi__idct_simd(stbi_uc *out, int out_stride, short data[64]) +{ + int16x8_t row0, row1, row2, row3, row4, row5, row6, row7; + + int16x4_t rot0_0 = vdup_n_s16(stbi__f2f(0.5411961f)); + int16x4_t rot0_1 = vdup_n_s16(stbi__f2f(-1.847759065f)); + int16x4_t rot0_2 = vdup_n_s16(stbi__f2f( 0.765366865f)); + int16x4_t rot1_0 = vdup_n_s16(stbi__f2f( 1.175875602f)); + int16x4_t rot1_1 = vdup_n_s16(stbi__f2f(-0.899976223f)); + int16x4_t rot1_2 = vdup_n_s16(stbi__f2f(-2.562915447f)); + int16x4_t rot2_0 = vdup_n_s16(stbi__f2f(-1.961570560f)); + int16x4_t rot2_1 = vdup_n_s16(stbi__f2f(-0.390180644f)); + int16x4_t rot3_0 = vdup_n_s16(stbi__f2f( 0.298631336f)); + int16x4_t rot3_1 = vdup_n_s16(stbi__f2f( 2.053119869f)); + int16x4_t rot3_2 = vdup_n_s16(stbi__f2f( 3.072711026f)); + int16x4_t rot3_3 = vdup_n_s16(stbi__f2f( 1.501321110f)); + +#define dct_long_mul(out, inq, coeff) \ + int32x4_t out##_l = vmull_s16(vget_low_s16(inq), coeff); \ + int32x4_t out##_h = vmull_s16(vget_high_s16(inq), coeff) + +#define dct_long_mac(out, acc, inq, coeff) \ + int32x4_t out##_l = vmlal_s16(acc##_l, vget_low_s16(inq), coeff); \ + int32x4_t out##_h = vmlal_s16(acc##_h, vget_high_s16(inq), coeff) + +#define dct_widen(out, inq) \ + int32x4_t out##_l = vshll_n_s16(vget_low_s16(inq), 12); \ + int32x4_t out##_h = vshll_n_s16(vget_high_s16(inq), 12) + +// wide add +#define dct_wadd(out, a, b) \ + int32x4_t out##_l = vaddq_s32(a##_l, b##_l); \ + int32x4_t out##_h = vaddq_s32(a##_h, b##_h) + +// wide sub +#define dct_wsub(out, a, b) \ + int32x4_t out##_l = vsubq_s32(a##_l, b##_l); \ + int32x4_t out##_h = vsubq_s32(a##_h, b##_h) + +// butterfly a/b, then shift using "shiftop" by "s" and pack +#define dct_bfly32o(out0,out1, a,b,shiftop,s) \ + { \ + dct_wadd(sum, a, b); \ + dct_wsub(dif, a, b); \ + out0 = vcombine_s16(shiftop(sum_l, s), shiftop(sum_h, s)); \ + out1 = vcombine_s16(shiftop(dif_l, s), shiftop(dif_h, s)); \ + } + +#define dct_pass(shiftop, shift) \ + { \ + /* even part */ \ + int16x8_t sum26 = vaddq_s16(row2, row6); \ + dct_long_mul(p1e, sum26, rot0_0); \ + dct_long_mac(t2e, p1e, row6, rot0_1); \ + dct_long_mac(t3e, p1e, row2, rot0_2); \ + int16x8_t sum04 = vaddq_s16(row0, row4); \ + int16x8_t dif04 = vsubq_s16(row0, row4); \ + dct_widen(t0e, sum04); \ + dct_widen(t1e, dif04); \ + dct_wadd(x0, t0e, t3e); \ + dct_wsub(x3, t0e, t3e); \ + dct_wadd(x1, t1e, t2e); \ + dct_wsub(x2, t1e, t2e); \ + /* odd part */ \ + int16x8_t sum15 = vaddq_s16(row1, row5); \ + int16x8_t sum17 = vaddq_s16(row1, row7); \ + int16x8_t sum35 = vaddq_s16(row3, row5); \ + int16x8_t sum37 = vaddq_s16(row3, row7); \ + int16x8_t sumodd = vaddq_s16(sum17, sum35); \ + dct_long_mul(p5o, sumodd, rot1_0); \ + dct_long_mac(p1o, p5o, sum17, rot1_1); \ + dct_long_mac(p2o, p5o, sum35, rot1_2); \ + dct_long_mul(p3o, sum37, rot2_0); \ + dct_long_mul(p4o, sum15, rot2_1); \ + dct_wadd(sump13o, p1o, p3o); \ + dct_wadd(sump24o, p2o, p4o); \ + dct_wadd(sump23o, p2o, p3o); \ + dct_wadd(sump14o, p1o, p4o); \ + dct_long_mac(x4, sump13o, row7, rot3_0); \ + dct_long_mac(x5, sump24o, row5, rot3_1); \ + dct_long_mac(x6, sump23o, row3, rot3_2); \ + dct_long_mac(x7, sump14o, row1, rot3_3); \ + dct_bfly32o(row0,row7, x0,x7,shiftop,shift); \ + dct_bfly32o(row1,row6, x1,x6,shiftop,shift); \ + dct_bfly32o(row2,row5, x2,x5,shiftop,shift); \ + dct_bfly32o(row3,row4, x3,x4,shiftop,shift); \ + } + + // load + row0 = vld1q_s16(data + 0*8); + row1 = vld1q_s16(data + 1*8); + row2 = vld1q_s16(data + 2*8); + row3 = vld1q_s16(data + 3*8); + row4 = vld1q_s16(data + 4*8); + row5 = vld1q_s16(data + 5*8); + row6 = vld1q_s16(data + 6*8); + row7 = vld1q_s16(data + 7*8); + + // add DC bias + row0 = vaddq_s16(row0, vsetq_lane_s16(1024, vdupq_n_s16(0), 0)); + + // column pass + dct_pass(vrshrn_n_s32, 10); + + // 16bit 8x8 transpose + { +// these three map to a single VTRN.16, VTRN.32, and VSWP, respectively. +// whether compilers actually get this is another story, sadly. +#define dct_trn16(x, y) { int16x8x2_t t = vtrnq_s16(x, y); x = t.val[0]; y = t.val[1]; } +#define dct_trn32(x, y) { int32x4x2_t t = vtrnq_s32(vreinterpretq_s32_s16(x), vreinterpretq_s32_s16(y)); x = vreinterpretq_s16_s32(t.val[0]); y = vreinterpretq_s16_s32(t.val[1]); } +#define dct_trn64(x, y) { int16x8_t x0 = x; int16x8_t y0 = y; x = vcombine_s16(vget_low_s16(x0), vget_low_s16(y0)); y = vcombine_s16(vget_high_s16(x0), vget_high_s16(y0)); } + + // pass 1 + dct_trn16(row0, row1); // a0b0a2b2a4b4a6b6 + dct_trn16(row2, row3); + dct_trn16(row4, row5); + dct_trn16(row6, row7); + + // pass 2 + dct_trn32(row0, row2); // a0b0c0d0a4b4c4d4 + dct_trn32(row1, row3); + dct_trn32(row4, row6); + dct_trn32(row5, row7); + + // pass 3 + dct_trn64(row0, row4); // a0b0c0d0e0f0g0h0 + dct_trn64(row1, row5); + dct_trn64(row2, row6); + dct_trn64(row3, row7); + +#undef dct_trn16 +#undef dct_trn32 +#undef dct_trn64 + } + + // row pass + // vrshrn_n_s32 only supports shifts up to 16, we need + // 17. so do a non-rounding shift of 16 first then follow + // up with a rounding shift by 1. + dct_pass(vshrn_n_s32, 16); + + { + // pack and round + uint8x8_t p0 = vqrshrun_n_s16(row0, 1); + uint8x8_t p1 = vqrshrun_n_s16(row1, 1); + uint8x8_t p2 = vqrshrun_n_s16(row2, 1); + uint8x8_t p3 = vqrshrun_n_s16(row3, 1); + uint8x8_t p4 = vqrshrun_n_s16(row4, 1); + uint8x8_t p5 = vqrshrun_n_s16(row5, 1); + uint8x8_t p6 = vqrshrun_n_s16(row6, 1); + uint8x8_t p7 = vqrshrun_n_s16(row7, 1); + + // again, these can translate into one instruction, but often don't. +#define dct_trn8_8(x, y) { uint8x8x2_t t = vtrn_u8(x, y); x = t.val[0]; y = t.val[1]; } +#define dct_trn8_16(x, y) { uint16x4x2_t t = vtrn_u16(vreinterpret_u16_u8(x), vreinterpret_u16_u8(y)); x = vreinterpret_u8_u16(t.val[0]); y = vreinterpret_u8_u16(t.val[1]); } +#define dct_trn8_32(x, y) { uint32x2x2_t t = vtrn_u32(vreinterpret_u32_u8(x), vreinterpret_u32_u8(y)); x = vreinterpret_u8_u32(t.val[0]); y = vreinterpret_u8_u32(t.val[1]); } + + // sadly can't use interleaved stores here since we only write + // 8 bytes to each scan line! + + // 8x8 8-bit transpose pass 1 + dct_trn8_8(p0, p1); + dct_trn8_8(p2, p3); + dct_trn8_8(p4, p5); + dct_trn8_8(p6, p7); + + // pass 2 + dct_trn8_16(p0, p2); + dct_trn8_16(p1, p3); + dct_trn8_16(p4, p6); + dct_trn8_16(p5, p7); + + // pass 3 + dct_trn8_32(p0, p4); + dct_trn8_32(p1, p5); + dct_trn8_32(p2, p6); + dct_trn8_32(p3, p7); + + // store + vst1_u8(out, p0); out += out_stride; + vst1_u8(out, p1); out += out_stride; + vst1_u8(out, p2); out += out_stride; + vst1_u8(out, p3); out += out_stride; + vst1_u8(out, p4); out += out_stride; + vst1_u8(out, p5); out += out_stride; + vst1_u8(out, p6); out += out_stride; + vst1_u8(out, p7); + +#undef dct_trn8_8 +#undef dct_trn8_16 +#undef dct_trn8_32 + } + +#undef dct_long_mul +#undef dct_long_mac +#undef dct_widen +#undef dct_wadd +#undef dct_wsub +#undef dct_bfly32o +#undef dct_pass +} + +#endif // STBI_NEON + +#define STBI__MARKER_none 0xff +// if there's a pending marker from the entropy stream, return that +// otherwise, fetch from the stream and get a marker. if there's no +// marker, return 0xff, which is never a valid marker value +static stbi_uc stbi__get_marker(stbi__jpeg *j) +{ + stbi_uc x; + if (j->marker != STBI__MARKER_none) { x = j->marker; j->marker = STBI__MARKER_none; return x; } + x = stbi__get8(j->s); + if (x != 0xff) return STBI__MARKER_none; + while (x == 0xff) + x = stbi__get8(j->s); // consume repeated 0xff fill bytes + return x; +} + +// in each scan, we'll have scan_n components, and the order +// of the components is specified by order[] +#define STBI__RESTART(x) ((x) >= 0xd0 && (x) <= 0xd7) + +// after a restart interval, stbi__jpeg_reset the entropy decoder and +// the dc prediction +static void stbi__jpeg_reset(stbi__jpeg *j) +{ + j->code_bits = 0; + j->code_buffer = 0; + j->nomore = 0; + j->img_comp[0].dc_pred = j->img_comp[1].dc_pred = j->img_comp[2].dc_pred = j->img_comp[3].dc_pred = 0; + j->marker = STBI__MARKER_none; + j->todo = j->restart_interval ? j->restart_interval : 0x7fffffff; + j->eob_run = 0; + // no more than 1<<31 MCUs if no restart_interal? that's plenty safe, + // since we don't even allow 1<<30 pixels +} + +static int stbi__parse_entropy_coded_data(stbi__jpeg *z) +{ + stbi__jpeg_reset(z); + if (!z->progressive) { + if (z->scan_n == 1) { + int i,j; + STBI_SIMD_ALIGN(short, data[64]); + int n = z->order[0]; + // non-interleaved data, we just need to process one block at a time, + // in trivial scanline order + // number of blocks to do just depends on how many actual "pixels" this + // component has, independent of interleaved MCU blocking and such + int w = (z->img_comp[n].x+7) >> 3; + int h = (z->img_comp[n].y+7) >> 3; + for (j=0; j < h; ++j) { + for (i=0; i < w; ++i) { + int ha = z->img_comp[n].ha; + if (!stbi__jpeg_decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+ha, z->fast_ac[ha], n, z->dequant[z->img_comp[n].tq])) return 0; + z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data); + // every data block is an MCU, so countdown the restart interval + if (--z->todo <= 0) { + if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); + // if it's NOT a restart, then just bail, so we get corrupt data + // rather than no data + if (!STBI__RESTART(z->marker)) return 1; + stbi__jpeg_reset(z); + } + } + } + return 1; + } else { // interleaved + int i,j,k,x,y; + STBI_SIMD_ALIGN(short, data[64]); + for (j=0; j < z->img_mcu_y; ++j) { + for (i=0; i < z->img_mcu_x; ++i) { + // scan an interleaved mcu... process scan_n components in order + for (k=0; k < z->scan_n; ++k) { + int n = z->order[k]; + // scan out an mcu's worth of this component; that's just determined + // by the basic H and V specified for the component + for (y=0; y < z->img_comp[n].v; ++y) { + for (x=0; x < z->img_comp[n].h; ++x) { + int x2 = (i*z->img_comp[n].h + x)*8; + int y2 = (j*z->img_comp[n].v + y)*8; + int ha = z->img_comp[n].ha; + if (!stbi__jpeg_decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+ha, z->fast_ac[ha], n, z->dequant[z->img_comp[n].tq])) return 0; + z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*y2+x2, z->img_comp[n].w2, data); + } + } + } + // after all interleaved components, that's an interleaved MCU, + // so now count down the restart interval + if (--z->todo <= 0) { + if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); + if (!STBI__RESTART(z->marker)) return 1; + stbi__jpeg_reset(z); + } + } + } + return 1; + } + } else { + if (z->scan_n == 1) { + int i,j; + int n = z->order[0]; + // non-interleaved data, we just need to process one block at a time, + // in trivial scanline order + // number of blocks to do just depends on how many actual "pixels" this + // component has, independent of interleaved MCU blocking and such + int w = (z->img_comp[n].x+7) >> 3; + int h = (z->img_comp[n].y+7) >> 3; + for (j=0; j < h; ++j) { + for (i=0; i < w; ++i) { + short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w); + if (z->spec_start == 0) { + if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n)) + return 0; + } else { + int ha = z->img_comp[n].ha; + if (!stbi__jpeg_decode_block_prog_ac(z, data, &z->huff_ac[ha], z->fast_ac[ha])) + return 0; + } + // every data block is an MCU, so countdown the restart interval + if (--z->todo <= 0) { + if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); + if (!STBI__RESTART(z->marker)) return 1; + stbi__jpeg_reset(z); + } + } + } + return 1; + } else { // interleaved + int i,j,k,x,y; + for (j=0; j < z->img_mcu_y; ++j) { + for (i=0; i < z->img_mcu_x; ++i) { + // scan an interleaved mcu... process scan_n components in order + for (k=0; k < z->scan_n; ++k) { + int n = z->order[k]; + // scan out an mcu's worth of this component; that's just determined + // by the basic H and V specified for the component + for (y=0; y < z->img_comp[n].v; ++y) { + for (x=0; x < z->img_comp[n].h; ++x) { + int x2 = (i*z->img_comp[n].h + x); + int y2 = (j*z->img_comp[n].v + y); + short *data = z->img_comp[n].coeff + 64 * (x2 + y2 * z->img_comp[n].coeff_w); + if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n)) + return 0; + } + } + } + // after all interleaved components, that's an interleaved MCU, + // so now count down the restart interval + if (--z->todo <= 0) { + if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); + if (!STBI__RESTART(z->marker)) return 1; + stbi__jpeg_reset(z); + } + } + } + return 1; + } + } +} + +static void stbi__jpeg_dequantize(short *data, stbi__uint16 *dequant) +{ + int i; + for (i=0; i < 64; ++i) + data[i] *= dequant[i]; +} + +static void stbi__jpeg_finish(stbi__jpeg *z) +{ + if (z->progressive) { + // dequantize and idct the data + int i,j,n; + for (n=0; n < z->s->img_n; ++n) { + int w = (z->img_comp[n].x+7) >> 3; + int h = (z->img_comp[n].y+7) >> 3; + for (j=0; j < h; ++j) { + for (i=0; i < w; ++i) { + short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w); + stbi__jpeg_dequantize(data, z->dequant[z->img_comp[n].tq]); + z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data); + } + } + } + } +} + +static int stbi__process_marker(stbi__jpeg *z, int m) +{ + int L; + switch (m) { + case STBI__MARKER_none: // no marker found + return stbi__err("expected marker","Corrupt JPEG"); + + case 0xDD: // DRI - specify restart interval + if (stbi__get16be(z->s) != 4) return stbi__err("bad DRI len","Corrupt JPEG"); + z->restart_interval = stbi__get16be(z->s); + return 1; + + case 0xDB: // DQT - define quantization table + L = stbi__get16be(z->s)-2; + while (L > 0) { + int q = stbi__get8(z->s); + int p = q >> 4, sixteen = (p != 0); + int t = q & 15,i; + if (p != 0 && p != 1) return stbi__err("bad DQT type","Corrupt JPEG"); + if (t > 3) return stbi__err("bad DQT table","Corrupt JPEG"); + + for (i=0; i < 64; ++i) + z->dequant[t][stbi__jpeg_dezigzag[i]] = (stbi__uint16)(sixteen ? stbi__get16be(z->s) : stbi__get8(z->s)); + L -= (sixteen ? 129 : 65); + } + return L==0; + + case 0xC4: // DHT - define huffman table + L = stbi__get16be(z->s)-2; + while (L > 0) { + stbi_uc *v; + int sizes[16],i,n=0; + int q = stbi__get8(z->s); + int tc = q >> 4; + int th = q & 15; + if (tc > 1 || th > 3) return stbi__err("bad DHT header","Corrupt JPEG"); + for (i=0; i < 16; ++i) { + sizes[i] = stbi__get8(z->s); + n += sizes[i]; + } + L -= 17; + if (tc == 0) { + if (!stbi__build_huffman(z->huff_dc+th, sizes)) return 0; + v = z->huff_dc[th].values; + } else { + if (!stbi__build_huffman(z->huff_ac+th, sizes)) return 0; + v = z->huff_ac[th].values; + } + for (i=0; i < n; ++i) + v[i] = stbi__get8(z->s); + if (tc != 0) + stbi__build_fast_ac(z->fast_ac[th], z->huff_ac + th); + L -= n; + } + return L==0; + } + + // check for comment block or APP blocks + if ((m >= 0xE0 && m <= 0xEF) || m == 0xFE) { + L = stbi__get16be(z->s); + if (L < 2) { + if (m == 0xFE) + return stbi__err("bad COM len","Corrupt JPEG"); + else + return stbi__err("bad APP len","Corrupt JPEG"); + } + L -= 2; + + if (m == 0xE0 && L >= 5) { // JFIF APP0 segment + static const unsigned char tag[5] = {'J','F','I','F','\0'}; + int ok = 1; + int i; + for (i=0; i < 5; ++i) + if (stbi__get8(z->s) != tag[i]) + ok = 0; + L -= 5; + if (ok) + z->jfif = 1; + } else if (m == 0xEE && L >= 12) { // Adobe APP14 segment + static const unsigned char tag[6] = {'A','d','o','b','e','\0'}; + int ok = 1; + int i; + for (i=0; i < 6; ++i) + if (stbi__get8(z->s) != tag[i]) + ok = 0; + L -= 6; + if (ok) { + stbi__get8(z->s); // version + stbi__get16be(z->s); // flags0 + stbi__get16be(z->s); // flags1 + z->app14_color_transform = stbi__get8(z->s); // color transform + L -= 6; + } + } + + stbi__skip(z->s, L); + return 1; + } + + return stbi__err("unknown marker","Corrupt JPEG"); +} + +// after we see SOS +static int stbi__process_scan_header(stbi__jpeg *z) +{ + int i; + int Ls = stbi__get16be(z->s); + z->scan_n = stbi__get8(z->s); + if (z->scan_n < 1 || z->scan_n > 4 || z->scan_n > (int) z->s->img_n) return stbi__err("bad SOS component count","Corrupt JPEG"); + if (Ls != 6+2*z->scan_n) return stbi__err("bad SOS len","Corrupt JPEG"); + for (i=0; i < z->scan_n; ++i) { + int id = stbi__get8(z->s), which; + int q = stbi__get8(z->s); + for (which = 0; which < z->s->img_n; ++which) + if (z->img_comp[which].id == id) + break; + if (which == z->s->img_n) return 0; // no match + z->img_comp[which].hd = q >> 4; if (z->img_comp[which].hd > 3) return stbi__err("bad DC huff","Corrupt JPEG"); + z->img_comp[which].ha = q & 15; if (z->img_comp[which].ha > 3) return stbi__err("bad AC huff","Corrupt JPEG"); + z->order[i] = which; + } + + { + int aa; + z->spec_start = stbi__get8(z->s); + z->spec_end = stbi__get8(z->s); // should be 63, but might be 0 + aa = stbi__get8(z->s); + z->succ_high = (aa >> 4); + z->succ_low = (aa & 15); + if (z->progressive) { + if (z->spec_start > 63 || z->spec_end > 63 || z->spec_start > z->spec_end || z->succ_high > 13 || z->succ_low > 13) + return stbi__err("bad SOS", "Corrupt JPEG"); + } else { + if (z->spec_start != 0) return stbi__err("bad SOS","Corrupt JPEG"); + if (z->succ_high != 0 || z->succ_low != 0) return stbi__err("bad SOS","Corrupt JPEG"); + z->spec_end = 63; + } + } + + return 1; +} + +static int stbi__free_jpeg_components(stbi__jpeg *z, int ncomp, int why) +{ + int i; + for (i=0; i < ncomp; ++i) { + if (z->img_comp[i].raw_data) { + STBI_FREE(z->img_comp[i].raw_data); + z->img_comp[i].raw_data = NULL; + z->img_comp[i].data = NULL; + } + if (z->img_comp[i].raw_coeff) { + STBI_FREE(z->img_comp[i].raw_coeff); + z->img_comp[i].raw_coeff = 0; + z->img_comp[i].coeff = 0; + } + if (z->img_comp[i].linebuf) { + STBI_FREE(z->img_comp[i].linebuf); + z->img_comp[i].linebuf = NULL; + } + } + return why; +} + +static int stbi__process_frame_header(stbi__jpeg *z, int scan) +{ + stbi__context *s = z->s; + int Lf,p,i,q, h_max=1,v_max=1,c; + Lf = stbi__get16be(s); if (Lf < 11) return stbi__err("bad SOF len","Corrupt JPEG"); // JPEG + p = stbi__get8(s); if (p != 8) return stbi__err("only 8-bit","JPEG format not supported: 8-bit only"); // JPEG baseline + s->img_y = stbi__get16be(s); if (s->img_y == 0) return stbi__err("no header height", "JPEG format not supported: delayed height"); // Legal, but we don't handle it--but neither does IJG + s->img_x = stbi__get16be(s); if (s->img_x == 0) return stbi__err("0 width","Corrupt JPEG"); // JPEG requires + c = stbi__get8(s); + if (c != 3 && c != 1 && c != 4) return stbi__err("bad component count","Corrupt JPEG"); + s->img_n = c; + for (i=0; i < c; ++i) { + z->img_comp[i].data = NULL; + z->img_comp[i].linebuf = NULL; + } + + if (Lf != 8+3*s->img_n) return stbi__err("bad SOF len","Corrupt JPEG"); + + z->rgb = 0; + for (i=0; i < s->img_n; ++i) { + static const unsigned char rgb[3] = { 'R', 'G', 'B' }; + z->img_comp[i].id = stbi__get8(s); + if (s->img_n == 3 && z->img_comp[i].id == rgb[i]) + ++z->rgb; + q = stbi__get8(s); + z->img_comp[i].h = (q >> 4); if (!z->img_comp[i].h || z->img_comp[i].h > 4) return stbi__err("bad H","Corrupt JPEG"); + z->img_comp[i].v = q & 15; if (!z->img_comp[i].v || z->img_comp[i].v > 4) return stbi__err("bad V","Corrupt JPEG"); + z->img_comp[i].tq = stbi__get8(s); if (z->img_comp[i].tq > 3) return stbi__err("bad TQ","Corrupt JPEG"); + } + + if (scan != STBI__SCAN_load) return 1; + + if (!stbi__mad3sizes_valid(s->img_x, s->img_y, s->img_n, 0)) return stbi__err("too large", "Image too large to decode"); + + for (i=0; i < s->img_n; ++i) { + if (z->img_comp[i].h > h_max) h_max = z->img_comp[i].h; + if (z->img_comp[i].v > v_max) v_max = z->img_comp[i].v; + } + + // compute interleaved mcu info + z->img_h_max = h_max; + z->img_v_max = v_max; + z->img_mcu_w = h_max * 8; + z->img_mcu_h = v_max * 8; + // these sizes can't be more than 17 bits + z->img_mcu_x = (s->img_x + z->img_mcu_w-1) / z->img_mcu_w; + z->img_mcu_y = (s->img_y + z->img_mcu_h-1) / z->img_mcu_h; + + for (i=0; i < s->img_n; ++i) { + // number of effective pixels (e.g. for non-interleaved MCU) + z->img_comp[i].x = (s->img_x * z->img_comp[i].h + h_max-1) / h_max; + z->img_comp[i].y = (s->img_y * z->img_comp[i].v + v_max-1) / v_max; + // to simplify generation, we'll allocate enough memory to decode + // the bogus oversized data from using interleaved MCUs and their + // big blocks (e.g. a 16x16 iMCU on an image of width 33); we won't + // discard the extra data until colorspace conversion + // + // img_mcu_x, img_mcu_y: <=17 bits; comp[i].h and .v are <=4 (checked earlier) + // so these muls can't overflow with 32-bit ints (which we require) + z->img_comp[i].w2 = z->img_mcu_x * z->img_comp[i].h * 8; + z->img_comp[i].h2 = z->img_mcu_y * z->img_comp[i].v * 8; + z->img_comp[i].coeff = 0; + z->img_comp[i].raw_coeff = 0; + z->img_comp[i].linebuf = NULL; + z->img_comp[i].raw_data = stbi__malloc_mad2(z->img_comp[i].w2, z->img_comp[i].h2, 15); + if (z->img_comp[i].raw_data == NULL) + return stbi__free_jpeg_components(z, i+1, stbi__err("outofmem", "Out of memory")); + // align blocks for idct using mmx/sse + z->img_comp[i].data = (stbi_uc*) (((size_t) z->img_comp[i].raw_data + 15) & ~15); + if (z->progressive) { + // w2, h2 are multiples of 8 (see above) + z->img_comp[i].coeff_w = z->img_comp[i].w2 / 8; + z->img_comp[i].coeff_h = z->img_comp[i].h2 / 8; + z->img_comp[i].raw_coeff = stbi__malloc_mad3(z->img_comp[i].w2, z->img_comp[i].h2, sizeof(short), 15); + if (z->img_comp[i].raw_coeff == NULL) + return stbi__free_jpeg_components(z, i+1, stbi__err("outofmem", "Out of memory")); + z->img_comp[i].coeff = (short*) (((size_t) z->img_comp[i].raw_coeff + 15) & ~15); + } + } + + return 1; +} + +// use comparisons since in some cases we handle more than one case (e.g. SOF) +#define stbi__DNL(x) ((x) == 0xdc) +#define stbi__SOI(x) ((x) == 0xd8) +#define stbi__EOI(x) ((x) == 0xd9) +#define stbi__SOF(x) ((x) == 0xc0 || (x) == 0xc1 || (x) == 0xc2) +#define stbi__SOS(x) ((x) == 0xda) + +#define stbi__SOF_progressive(x) ((x) == 0xc2) + +static int stbi__decode_jpeg_header(stbi__jpeg *z, int scan) +{ + int m; + z->jfif = 0; + z->app14_color_transform = -1; // valid values are 0,1,2 + z->marker = STBI__MARKER_none; // initialize cached marker to empty + m = stbi__get_marker(z); + if (!stbi__SOI(m)) return stbi__err("no SOI","Corrupt JPEG"); + if (scan == STBI__SCAN_type) return 1; + m = stbi__get_marker(z); + while (!stbi__SOF(m)) { + if (!stbi__process_marker(z,m)) return 0; + m = stbi__get_marker(z); + while (m == STBI__MARKER_none) { + // some files have extra padding after their blocks, so ok, we'll scan + if (stbi__at_eof(z->s)) return stbi__err("no SOF", "Corrupt JPEG"); + m = stbi__get_marker(z); + } + } + z->progressive = stbi__SOF_progressive(m); + if (!stbi__process_frame_header(z, scan)) return 0; + return 1; +} + +// decode image to YCbCr format +static int stbi__decode_jpeg_image(stbi__jpeg *j) +{ + int m; + for (m = 0; m < 4; m++) { + j->img_comp[m].raw_data = NULL; + j->img_comp[m].raw_coeff = NULL; + } + j->restart_interval = 0; + if (!stbi__decode_jpeg_header(j, STBI__SCAN_load)) return 0; + m = stbi__get_marker(j); + while (!stbi__EOI(m)) { + if (stbi__SOS(m)) { + if (!stbi__process_scan_header(j)) return 0; + if (!stbi__parse_entropy_coded_data(j)) return 0; + if (j->marker == STBI__MARKER_none ) { + // handle 0s at the end of image data from IP Kamera 9060 + while (!stbi__at_eof(j->s)) { + int x = stbi__get8(j->s); + if (x == 255) { + j->marker = stbi__get8(j->s); + break; + } + } + // if we reach eof without hitting a marker, stbi__get_marker() below will fail and we'll eventually return 0 + } + } else if (stbi__DNL(m)) { + int Ld = stbi__get16be(j->s); + stbi__uint32 NL = stbi__get16be(j->s); + if (Ld != 4) return stbi__err("bad DNL len", "Corrupt JPEG"); + if (NL != j->s->img_y) return stbi__err("bad DNL height", "Corrupt JPEG"); + } else { + if (!stbi__process_marker(j, m)) return 0; + } + m = stbi__get_marker(j); + } + if (j->progressive) + stbi__jpeg_finish(j); + return 1; +} + +// static jfif-centered resampling (across block boundaries) + +typedef stbi_uc *(*resample_row_func)(stbi_uc *out, stbi_uc *in0, stbi_uc *in1, + int w, int hs); + +#define stbi__div4(x) ((stbi_uc) ((x) >> 2)) + +static stbi_uc *resample_row_1(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + STBI_NOTUSED(out); + STBI_NOTUSED(in_far); + STBI_NOTUSED(w); + STBI_NOTUSED(hs); + return in_near; +} + +static stbi_uc* stbi__resample_row_v_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + // need to generate two samples vertically for every one in input + int i; + STBI_NOTUSED(hs); + for (i=0; i < w; ++i) + out[i] = stbi__div4(3*in_near[i] + in_far[i] + 2); + return out; +} + +static stbi_uc *stbi__resample_row_h_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + // need to generate two samples horizontally for every one in input + int i; + stbi_uc *input = in_near; + + if (w == 1) { + // if only one sample, can't do any interpolation + out[0] = out[1] = input[0]; + return out; + } + + out[0] = input[0]; + out[1] = stbi__div4(input[0]*3 + input[1] + 2); + for (i=1; i < w-1; ++i) { + int n = 3*input[i]+2; + out[i*2+0] = stbi__div4(n+input[i-1]); + out[i*2+1] = stbi__div4(n+input[i+1]); + } + out[i*2+0] = stbi__div4(input[w-2]*3 + input[w-1] + 2); + out[i*2+1] = input[w-1]; + + STBI_NOTUSED(in_far); + STBI_NOTUSED(hs); + + return out; +} + +#define stbi__div16(x) ((stbi_uc) ((x) >> 4)) + +static stbi_uc *stbi__resample_row_hv_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + // need to generate 2x2 samples for every one in input + int i,t0,t1; + if (w == 1) { + out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2); + return out; + } + + t1 = 3*in_near[0] + in_far[0]; + out[0] = stbi__div4(t1+2); + for (i=1; i < w; ++i) { + t0 = t1; + t1 = 3*in_near[i]+in_far[i]; + out[i*2-1] = stbi__div16(3*t0 + t1 + 8); + out[i*2 ] = stbi__div16(3*t1 + t0 + 8); + } + out[w*2-1] = stbi__div4(t1+2); + + STBI_NOTUSED(hs); + + return out; +} + +#if defined(STBI_SSE2) || defined(STBI_NEON) +static stbi_uc *stbi__resample_row_hv_2_simd(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + // need to generate 2x2 samples for every one in input + int i=0,t0,t1; + + if (w == 1) { + out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2); + return out; + } + + t1 = 3*in_near[0] + in_far[0]; + // process groups of 8 pixels for as long as we can. + // note we can't handle the last pixel in a row in this loop + // because we need to handle the filter boundary conditions. + for (; i < ((w-1) & ~7); i += 8) { +#if defined(STBI_SSE2) + // load and perform the vertical filtering pass + // this uses 3*x + y = 4*x + (y - x) + __m128i zero = _mm_setzero_si128(); + __m128i farb = _mm_loadl_epi64((__m128i *) (in_far + i)); + __m128i nearb = _mm_loadl_epi64((__m128i *) (in_near + i)); + __m128i farw = _mm_unpacklo_epi8(farb, zero); + __m128i nearw = _mm_unpacklo_epi8(nearb, zero); + __m128i diff = _mm_sub_epi16(farw, nearw); + __m128i nears = _mm_slli_epi16(nearw, 2); + __m128i curr = _mm_add_epi16(nears, diff); // current row + + // horizontal filter works the same based on shifted vers of current + // row. "prev" is current row shifted right by 1 pixel; we need to + // insert the previous pixel value (from t1). + // "next" is current row shifted left by 1 pixel, with first pixel + // of next block of 8 pixels added in. + __m128i prv0 = _mm_slli_si128(curr, 2); + __m128i nxt0 = _mm_srli_si128(curr, 2); + __m128i prev = _mm_insert_epi16(prv0, t1, 0); + __m128i next = _mm_insert_epi16(nxt0, 3*in_near[i+8] + in_far[i+8], 7); + + // horizontal filter, polyphase implementation since it's convenient: + // even pixels = 3*cur + prev = cur*4 + (prev - cur) + // odd pixels = 3*cur + next = cur*4 + (next - cur) + // note the shared term. + __m128i bias = _mm_set1_epi16(8); + __m128i curs = _mm_slli_epi16(curr, 2); + __m128i prvd = _mm_sub_epi16(prev, curr); + __m128i nxtd = _mm_sub_epi16(next, curr); + __m128i curb = _mm_add_epi16(curs, bias); + __m128i even = _mm_add_epi16(prvd, curb); + __m128i odd = _mm_add_epi16(nxtd, curb); + + // interleave even and odd pixels, then undo scaling. + __m128i int0 = _mm_unpacklo_epi16(even, odd); + __m128i int1 = _mm_unpackhi_epi16(even, odd); + __m128i de0 = _mm_srli_epi16(int0, 4); + __m128i de1 = _mm_srli_epi16(int1, 4); + + // pack and write output + __m128i outv = _mm_packus_epi16(de0, de1); + _mm_storeu_si128((__m128i *) (out + i*2), outv); +#elif defined(STBI_NEON) + // load and perform the vertical filtering pass + // this uses 3*x + y = 4*x + (y - x) + uint8x8_t farb = vld1_u8(in_far + i); + uint8x8_t nearb = vld1_u8(in_near + i); + int16x8_t diff = vreinterpretq_s16_u16(vsubl_u8(farb, nearb)); + int16x8_t nears = vreinterpretq_s16_u16(vshll_n_u8(nearb, 2)); + int16x8_t curr = vaddq_s16(nears, diff); // current row + + // horizontal filter works the same based on shifted vers of current + // row. "prev" is current row shifted right by 1 pixel; we need to + // insert the previous pixel value (from t1). + // "next" is current row shifted left by 1 pixel, with first pixel + // of next block of 8 pixels added in. + int16x8_t prv0 = vextq_s16(curr, curr, 7); + int16x8_t nxt0 = vextq_s16(curr, curr, 1); + int16x8_t prev = vsetq_lane_s16(t1, prv0, 0); + int16x8_t next = vsetq_lane_s16(3*in_near[i+8] + in_far[i+8], nxt0, 7); + + // horizontal filter, polyphase implementation since it's convenient: + // even pixels = 3*cur + prev = cur*4 + (prev - cur) + // odd pixels = 3*cur + next = cur*4 + (next - cur) + // note the shared term. + int16x8_t curs = vshlq_n_s16(curr, 2); + int16x8_t prvd = vsubq_s16(prev, curr); + int16x8_t nxtd = vsubq_s16(next, curr); + int16x8_t even = vaddq_s16(curs, prvd); + int16x8_t odd = vaddq_s16(curs, nxtd); + + // undo scaling and round, then store with even/odd phases interleaved + uint8x8x2_t o; + o.val[0] = vqrshrun_n_s16(even, 4); + o.val[1] = vqrshrun_n_s16(odd, 4); + vst2_u8(out + i*2, o); +#endif + + // "previous" value for next iter + t1 = 3*in_near[i+7] + in_far[i+7]; + } + + t0 = t1; + t1 = 3*in_near[i] + in_far[i]; + out[i*2] = stbi__div16(3*t1 + t0 + 8); + + for (++i; i < w; ++i) { + t0 = t1; + t1 = 3*in_near[i]+in_far[i]; + out[i*2-1] = stbi__div16(3*t0 + t1 + 8); + out[i*2 ] = stbi__div16(3*t1 + t0 + 8); + } + out[w*2-1] = stbi__div4(t1+2); + + STBI_NOTUSED(hs); + + return out; +} +#endif + +static stbi_uc *stbi__resample_row_generic(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + // resample with nearest-neighbor + int i,j; + STBI_NOTUSED(in_far); + for (i=0; i < w; ++i) + for (j=0; j < hs; ++j) + out[i*hs+j] = in_near[i]; + return out; +} + +// this is a reduced-precision calculation of YCbCr-to-RGB introduced +// to make sure the code produces the same results in both SIMD and scalar +#define stbi__float2fixed(x) (((int) ((x) * 4096.0f + 0.5f)) << 8) +static void stbi__YCbCr_to_RGB_row(stbi_uc *out, const stbi_uc *y, const stbi_uc *pcb, const stbi_uc *pcr, int count, int step) +{ + int i; + for (i=0; i < count; ++i) { + int y_fixed = (y[i] << 20) + (1<<19); // rounding + int r,g,b; + int cr = pcr[i] - 128; + int cb = pcb[i] - 128; + r = y_fixed + cr* stbi__float2fixed(1.40200f); + g = y_fixed + (cr*-stbi__float2fixed(0.71414f)) + ((cb*-stbi__float2fixed(0.34414f)) & 0xffff0000); + b = y_fixed + cb* stbi__float2fixed(1.77200f); + r >>= 20; + g >>= 20; + b >>= 20; + if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; } + if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; } + if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; } + out[0] = (stbi_uc)r; + out[1] = (stbi_uc)g; + out[2] = (stbi_uc)b; + out[3] = 255; + out += step; + } +} + +#if defined(STBI_SSE2) || defined(STBI_NEON) +static void stbi__YCbCr_to_RGB_simd(stbi_uc *out, stbi_uc const *y, stbi_uc const *pcb, stbi_uc const *pcr, int count, int step) +{ + int i = 0; + +#ifdef STBI_SSE2 + // step == 3 is pretty ugly on the final interleave, and i'm not convinced + // it's useful in practice (you wouldn't use it for textures, for example). + // so just accelerate step == 4 case. + if (step == 4) { + // this is a fairly straightforward implementation and not super-optimized. + __m128i signflip = _mm_set1_epi8(-0x80); + __m128i cr_const0 = _mm_set1_epi16( (short) ( 1.40200f*4096.0f+0.5f)); + __m128i cr_const1 = _mm_set1_epi16( - (short) ( 0.71414f*4096.0f+0.5f)); + __m128i cb_const0 = _mm_set1_epi16( - (short) ( 0.34414f*4096.0f+0.5f)); + __m128i cb_const1 = _mm_set1_epi16( (short) ( 1.77200f*4096.0f+0.5f)); + __m128i y_bias = _mm_set1_epi8((char) (unsigned char) 128); + __m128i xw = _mm_set1_epi16(255); // alpha channel + + for (; i+7 < count; i += 8) { + // load + __m128i y_bytes = _mm_loadl_epi64((__m128i *) (y+i)); + __m128i cr_bytes = _mm_loadl_epi64((__m128i *) (pcr+i)); + __m128i cb_bytes = _mm_loadl_epi64((__m128i *) (pcb+i)); + __m128i cr_biased = _mm_xor_si128(cr_bytes, signflip); // -128 + __m128i cb_biased = _mm_xor_si128(cb_bytes, signflip); // -128 + + // unpack to short (and left-shift cr, cb by 8) + __m128i yw = _mm_unpacklo_epi8(y_bias, y_bytes); + __m128i crw = _mm_unpacklo_epi8(_mm_setzero_si128(), cr_biased); + __m128i cbw = _mm_unpacklo_epi8(_mm_setzero_si128(), cb_biased); + + // color transform + __m128i yws = _mm_srli_epi16(yw, 4); + __m128i cr0 = _mm_mulhi_epi16(cr_const0, crw); + __m128i cb0 = _mm_mulhi_epi16(cb_const0, cbw); + __m128i cb1 = _mm_mulhi_epi16(cbw, cb_const1); + __m128i cr1 = _mm_mulhi_epi16(crw, cr_const1); + __m128i rws = _mm_add_epi16(cr0, yws); + __m128i gwt = _mm_add_epi16(cb0, yws); + __m128i bws = _mm_add_epi16(yws, cb1); + __m128i gws = _mm_add_epi16(gwt, cr1); + + // descale + __m128i rw = _mm_srai_epi16(rws, 4); + __m128i bw = _mm_srai_epi16(bws, 4); + __m128i gw = _mm_srai_epi16(gws, 4); + + // back to byte, set up for transpose + __m128i brb = _mm_packus_epi16(rw, bw); + __m128i gxb = _mm_packus_epi16(gw, xw); + + // transpose to interleave channels + __m128i t0 = _mm_unpacklo_epi8(brb, gxb); + __m128i t1 = _mm_unpackhi_epi8(brb, gxb); + __m128i o0 = _mm_unpacklo_epi16(t0, t1); + __m128i o1 = _mm_unpackhi_epi16(t0, t1); + + // store + _mm_storeu_si128((__m128i *) (out + 0), o0); + _mm_storeu_si128((__m128i *) (out + 16), o1); + out += 32; + } + } +#endif + +#ifdef STBI_NEON + // in this version, step=3 support would be easy to add. but is there demand? + if (step == 4) { + // this is a fairly straightforward implementation and not super-optimized. + uint8x8_t signflip = vdup_n_u8(0x80); + int16x8_t cr_const0 = vdupq_n_s16( (short) ( 1.40200f*4096.0f+0.5f)); + int16x8_t cr_const1 = vdupq_n_s16( - (short) ( 0.71414f*4096.0f+0.5f)); + int16x8_t cb_const0 = vdupq_n_s16( - (short) ( 0.34414f*4096.0f+0.5f)); + int16x8_t cb_const1 = vdupq_n_s16( (short) ( 1.77200f*4096.0f+0.5f)); + + for (; i+7 < count; i += 8) { + // load + uint8x8_t y_bytes = vld1_u8(y + i); + uint8x8_t cr_bytes = vld1_u8(pcr + i); + uint8x8_t cb_bytes = vld1_u8(pcb + i); + int8x8_t cr_biased = vreinterpret_s8_u8(vsub_u8(cr_bytes, signflip)); + int8x8_t cb_biased = vreinterpret_s8_u8(vsub_u8(cb_bytes, signflip)); + + // expand to s16 + int16x8_t yws = vreinterpretq_s16_u16(vshll_n_u8(y_bytes, 4)); + int16x8_t crw = vshll_n_s8(cr_biased, 7); + int16x8_t cbw = vshll_n_s8(cb_biased, 7); + + // color transform + int16x8_t cr0 = vqdmulhq_s16(crw, cr_const0); + int16x8_t cb0 = vqdmulhq_s16(cbw, cb_const0); + int16x8_t cr1 = vqdmulhq_s16(crw, cr_const1); + int16x8_t cb1 = vqdmulhq_s16(cbw, cb_const1); + int16x8_t rws = vaddq_s16(yws, cr0); + int16x8_t gws = vaddq_s16(vaddq_s16(yws, cb0), cr1); + int16x8_t bws = vaddq_s16(yws, cb1); + + // undo scaling, round, convert to byte + uint8x8x4_t o; + o.val[0] = vqrshrun_n_s16(rws, 4); + o.val[1] = vqrshrun_n_s16(gws, 4); + o.val[2] = vqrshrun_n_s16(bws, 4); + o.val[3] = vdup_n_u8(255); + + // store, interleaving r/g/b/a + vst4_u8(out, o); + out += 8*4; + } + } +#endif + + for (; i < count; ++i) { + int y_fixed = (y[i] << 20) + (1<<19); // rounding + int r,g,b; + int cr = pcr[i] - 128; + int cb = pcb[i] - 128; + r = y_fixed + cr* stbi__float2fixed(1.40200f); + g = y_fixed + cr*-stbi__float2fixed(0.71414f) + ((cb*-stbi__float2fixed(0.34414f)) & 0xffff0000); + b = y_fixed + cb* stbi__float2fixed(1.77200f); + r >>= 20; + g >>= 20; + b >>= 20; + if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; } + if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; } + if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; } + out[0] = (stbi_uc)r; + out[1] = (stbi_uc)g; + out[2] = (stbi_uc)b; + out[3] = 255; + out += step; + } +} +#endif + +// set up the kernels +static void stbi__setup_jpeg(stbi__jpeg *j) +{ + j->idct_block_kernel = stbi__idct_block; + j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_row; + j->resample_row_hv_2_kernel = stbi__resample_row_hv_2; + +#ifdef STBI_SSE2 + if (stbi__sse2_available()) { + j->idct_block_kernel = stbi__idct_simd; + j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd; + j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd; + } +#endif + +#ifdef STBI_NEON + j->idct_block_kernel = stbi__idct_simd; + j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd; + j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd; +#endif +} + +// clean up the temporary component buffers +static void stbi__cleanup_jpeg(stbi__jpeg *j) +{ + stbi__free_jpeg_components(j, j->s->img_n, 0); +} + +typedef struct +{ + resample_row_func resample; + stbi_uc *line0,*line1; + int hs,vs; // expansion factor in each axis + int w_lores; // horizontal pixels pre-expansion + int ystep; // how far through vertical expansion we are + int ypos; // which pre-expansion row we're on +} stbi__resample; + +// fast 0..255 * 0..255 => 0..255 rounded multiplication +static stbi_uc stbi__blinn_8x8(stbi_uc x, stbi_uc y) +{ + unsigned int t = x*y + 128; + return (stbi_uc) ((t + (t >>8)) >> 8); +} + +static stbi_uc *load_jpeg_image(stbi__jpeg *z, int *out_x, int *out_y, int *comp, int req_comp) +{ + int n, decode_n, is_rgb; + z->s->img_n = 0; // make stbi__cleanup_jpeg safe + + // validate req_comp + if (req_comp < 0 || req_comp > 4) return stbi__errpuc("bad req_comp", "Internal error"); + + // load a jpeg image from whichever source, but leave in YCbCr format + if (!stbi__decode_jpeg_image(z)) { stbi__cleanup_jpeg(z); return NULL; } + + // determine actual number of components to generate + n = req_comp ? req_comp : z->s->img_n >= 3 ? 3 : 1; + + is_rgb = z->s->img_n == 3 && (z->rgb == 3 || (z->app14_color_transform == 0 && !z->jfif)); + + if (z->s->img_n == 3 && n < 3 && !is_rgb) + decode_n = 1; + else + decode_n = z->s->img_n; + + // resample and color-convert + { + int k; + unsigned int i,j; + stbi_uc *output; + stbi_uc *coutput[4]; + + stbi__resample res_comp[4]; + + for (k=0; k < decode_n; ++k) { + stbi__resample *r = &res_comp[k]; + + // allocate line buffer big enough for upsampling off the edges + // with upsample factor of 4 + z->img_comp[k].linebuf = (stbi_uc *) stbi__malloc(z->s->img_x + 3); + if (!z->img_comp[k].linebuf) { stbi__cleanup_jpeg(z); return stbi__errpuc("outofmem", "Out of memory"); } + + r->hs = z->img_h_max / z->img_comp[k].h; + r->vs = z->img_v_max / z->img_comp[k].v; + r->ystep = r->vs >> 1; + r->w_lores = (z->s->img_x + r->hs-1) / r->hs; + r->ypos = 0; + r->line0 = r->line1 = z->img_comp[k].data; + + if (r->hs == 1 && r->vs == 1) r->resample = resample_row_1; + else if (r->hs == 1 && r->vs == 2) r->resample = stbi__resample_row_v_2; + else if (r->hs == 2 && r->vs == 1) r->resample = stbi__resample_row_h_2; + else if (r->hs == 2 && r->vs == 2) r->resample = z->resample_row_hv_2_kernel; + else r->resample = stbi__resample_row_generic; + } + + // can't error after this so, this is safe + output = (stbi_uc *) stbi__malloc_mad3(n, z->s->img_x, z->s->img_y, 1); + if (!output) { stbi__cleanup_jpeg(z); return stbi__errpuc("outofmem", "Out of memory"); } + + // now go ahead and resample + for (j=0; j < z->s->img_y; ++j) { + stbi_uc *out = output + n * z->s->img_x * j; + for (k=0; k < decode_n; ++k) { + stbi__resample *r = &res_comp[k]; + int y_bot = r->ystep >= (r->vs >> 1); + coutput[k] = r->resample(z->img_comp[k].linebuf, + y_bot ? r->line1 : r->line0, + y_bot ? r->line0 : r->line1, + r->w_lores, r->hs); + if (++r->ystep >= r->vs) { + r->ystep = 0; + r->line0 = r->line1; + if (++r->ypos < z->img_comp[k].y) + r->line1 += z->img_comp[k].w2; + } + } + if (n >= 3) { + stbi_uc *y = coutput[0]; + if (z->s->img_n == 3) { + if (is_rgb) { + for (i=0; i < z->s->img_x; ++i) { + out[0] = y[i]; + out[1] = coutput[1][i]; + out[2] = coutput[2][i]; + out[3] = 255; + out += n; + } + } else { + z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n); + } + } else if (z->s->img_n == 4) { + if (z->app14_color_transform == 0) { // CMYK + for (i=0; i < z->s->img_x; ++i) { + stbi_uc m = coutput[3][i]; + out[0] = stbi__blinn_8x8(coutput[0][i], m); + out[1] = stbi__blinn_8x8(coutput[1][i], m); + out[2] = stbi__blinn_8x8(coutput[2][i], m); + out[3] = 255; + out += n; + } + } else if (z->app14_color_transform == 2) { // YCCK + z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n); + for (i=0; i < z->s->img_x; ++i) { + stbi_uc m = coutput[3][i]; + out[0] = stbi__blinn_8x8(255 - out[0], m); + out[1] = stbi__blinn_8x8(255 - out[1], m); + out[2] = stbi__blinn_8x8(255 - out[2], m); + out += n; + } + } else { // YCbCr + alpha? Ignore the fourth channel for now + z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n); + } + } else + for (i=0; i < z->s->img_x; ++i) { + out[0] = out[1] = out[2] = y[i]; + out[3] = 255; // not used if n==3 + out += n; + } + } else { + if (is_rgb) { + if (n == 1) + for (i=0; i < z->s->img_x; ++i) + *out++ = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]); + else { + for (i=0; i < z->s->img_x; ++i, out += 2) { + out[0] = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]); + out[1] = 255; + } + } + } else if (z->s->img_n == 4 && z->app14_color_transform == 0) { + for (i=0; i < z->s->img_x; ++i) { + stbi_uc m = coutput[3][i]; + stbi_uc r = stbi__blinn_8x8(coutput[0][i], m); + stbi_uc g = stbi__blinn_8x8(coutput[1][i], m); + stbi_uc b = stbi__blinn_8x8(coutput[2][i], m); + out[0] = stbi__compute_y(r, g, b); + out[1] = 255; + out += n; + } + } else if (z->s->img_n == 4 && z->app14_color_transform == 2) { + for (i=0; i < z->s->img_x; ++i) { + out[0] = stbi__blinn_8x8(255 - coutput[0][i], coutput[3][i]); + out[1] = 255; + out += n; + } + } else { + stbi_uc *y = coutput[0]; + if (n == 1) + for (i=0; i < z->s->img_x; ++i) out[i] = y[i]; + else + for (i=0; i < z->s->img_x; ++i) *out++ = y[i], *out++ = 255; + } + } + } + stbi__cleanup_jpeg(z); + *out_x = z->s->img_x; + *out_y = z->s->img_y; + if (comp) *comp = z->s->img_n >= 3 ? 3 : 1; // report original components, not output + return output; + } +} + +static void *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + unsigned char* result; + stbi__jpeg* j = (stbi__jpeg*) stbi__malloc(sizeof(stbi__jpeg)); + STBI_NOTUSED(ri); + j->s = s; + stbi__setup_jpeg(j); + result = load_jpeg_image(j, x,y,comp,req_comp); + STBI_FREE(j); + return result; +} + +static int stbi__jpeg_test(stbi__context *s) +{ + int r; + stbi__jpeg* j = (stbi__jpeg*)stbi__malloc(sizeof(stbi__jpeg)); + j->s = s; + stbi__setup_jpeg(j); + r = stbi__decode_jpeg_header(j, STBI__SCAN_type); + stbi__rewind(s); + STBI_FREE(j); + return r; +} + +static int stbi__jpeg_info_raw(stbi__jpeg *j, int *x, int *y, int *comp) +{ + if (!stbi__decode_jpeg_header(j, STBI__SCAN_header)) { + stbi__rewind( j->s ); + return 0; + } + if (x) *x = j->s->img_x; + if (y) *y = j->s->img_y; + if (comp) *comp = j->s->img_n >= 3 ? 3 : 1; + return 1; +} + +static int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp) +{ + int result; + stbi__jpeg* j = (stbi__jpeg*) (stbi__malloc(sizeof(stbi__jpeg))); + j->s = s; + result = stbi__jpeg_info_raw(j, x, y, comp); + STBI_FREE(j); + return result; +} +#endif + +// public domain zlib decode v0.2 Sean Barrett 2006-11-18 +// simple implementation +// - all input must be provided in an upfront buffer +// - all output is written to a single output buffer (can malloc/realloc) +// performance +// - fast huffman + +#ifndef STBI_NO_ZLIB + +// fast-way is faster to check than jpeg huffman, but slow way is slower +#define STBI__ZFAST_BITS 9 // accelerate all cases in default tables +#define STBI__ZFAST_MASK ((1 << STBI__ZFAST_BITS) - 1) + +// zlib-style huffman encoding +// (jpegs packs from left, zlib from right, so can't share code) +typedef struct +{ + stbi__uint16 fast[1 << STBI__ZFAST_BITS]; + stbi__uint16 firstcode[16]; + int maxcode[17]; + stbi__uint16 firstsymbol[16]; + stbi_uc size[288]; + stbi__uint16 value[288]; +} stbi__zhuffman; + +stbi_inline static int stbi__bitreverse16(int n) +{ + n = ((n & 0xAAAA) >> 1) | ((n & 0x5555) << 1); + n = ((n & 0xCCCC) >> 2) | ((n & 0x3333) << 2); + n = ((n & 0xF0F0) >> 4) | ((n & 0x0F0F) << 4); + n = ((n & 0xFF00) >> 8) | ((n & 0x00FF) << 8); + return n; +} + +stbi_inline static int stbi__bit_reverse(int v, int bits) +{ + STBI_ASSERT(bits <= 16); + // to bit reverse n bits, reverse 16 and shift + // e.g. 11 bits, bit reverse and shift away 5 + return stbi__bitreverse16(v) >> (16-bits); +} + +static int stbi__zbuild_huffman(stbi__zhuffman *z, const stbi_uc *sizelist, int num) +{ + int i,k=0; + int code, next_code[16], sizes[17]; + + // DEFLATE spec for generating codes + memset(sizes, 0, sizeof(sizes)); + memset(z->fast, 0, sizeof(z->fast)); + for (i=0; i < num; ++i) + ++sizes[sizelist[i]]; + sizes[0] = 0; + for (i=1; i < 16; ++i) + if (sizes[i] > (1 << i)) + return stbi__err("bad sizes", "Corrupt PNG"); + code = 0; + for (i=1; i < 16; ++i) { + next_code[i] = code; + z->firstcode[i] = (stbi__uint16) code; + z->firstsymbol[i] = (stbi__uint16) k; + code = (code + sizes[i]); + if (sizes[i]) + if (code-1 >= (1 << i)) return stbi__err("bad codelengths","Corrupt PNG"); + z->maxcode[i] = code << (16-i); // preshift for inner loop + code <<= 1; + k += sizes[i]; + } + z->maxcode[16] = 0x10000; // sentinel + for (i=0; i < num; ++i) { + int s = sizelist[i]; + if (s) { + int c = next_code[s] - z->firstcode[s] + z->firstsymbol[s]; + stbi__uint16 fastv = (stbi__uint16) ((s << 9) | i); + z->size [c] = (stbi_uc ) s; + z->value[c] = (stbi__uint16) i; + if (s <= STBI__ZFAST_BITS) { + int j = stbi__bit_reverse(next_code[s],s); + while (j < (1 << STBI__ZFAST_BITS)) { + z->fast[j] = fastv; + j += (1 << s); + } + } + ++next_code[s]; + } + } + return 1; +} + +// zlib-from-memory implementation for PNG reading +// because PNG allows splitting the zlib stream arbitrarily, +// and it's annoying structurally to have PNG call ZLIB call PNG, +// we require PNG read all the IDATs and combine them into a single +// memory buffer + +typedef struct +{ + stbi_uc *zbuffer, *zbuffer_end; + int num_bits; + stbi__uint32 code_buffer; + + char *zout; + char *zout_start; + char *zout_end; + int z_expandable; + + stbi__zhuffman z_length, z_distance; +} stbi__zbuf; + +stbi_inline static stbi_uc stbi__zget8(stbi__zbuf *z) +{ + if (z->zbuffer >= z->zbuffer_end) return 0; + return *z->zbuffer++; +} + +static void stbi__fill_bits(stbi__zbuf *z) +{ + do { + STBI_ASSERT(z->code_buffer < (1U << z->num_bits)); + z->code_buffer |= (unsigned int) stbi__zget8(z) << z->num_bits; + z->num_bits += 8; + } while (z->num_bits <= 24); +} + +stbi_inline static unsigned int stbi__zreceive(stbi__zbuf *z, int n) +{ + unsigned int k; + if (z->num_bits < n) stbi__fill_bits(z); + k = z->code_buffer & ((1 << n) - 1); + z->code_buffer >>= n; + z->num_bits -= n; + return k; +} + +static int stbi__zhuffman_decode_slowpath(stbi__zbuf *a, stbi__zhuffman *z) +{ + int b,s,k; + // not resolved by fast table, so compute it the slow way + // use jpeg approach, which requires MSbits at top + k = stbi__bit_reverse(a->code_buffer, 16); + for (s=STBI__ZFAST_BITS+1; ; ++s) + if (k < z->maxcode[s]) + break; + if (s == 16) return -1; // invalid code! + // code size is s, so: + b = (k >> (16-s)) - z->firstcode[s] + z->firstsymbol[s]; + STBI_ASSERT(z->size[b] == s); + a->code_buffer >>= s; + a->num_bits -= s; + return z->value[b]; +} + +stbi_inline static int stbi__zhuffman_decode(stbi__zbuf *a, stbi__zhuffman *z) +{ + int b,s; + if (a->num_bits < 16) stbi__fill_bits(a); + b = z->fast[a->code_buffer & STBI__ZFAST_MASK]; + if (b) { + s = b >> 9; + a->code_buffer >>= s; + a->num_bits -= s; + return b & 511; + } + return stbi__zhuffman_decode_slowpath(a, z); +} + +static int stbi__zexpand(stbi__zbuf *z, char *zout, int n) // need to make room for n bytes +{ + char *q; + int cur, limit, old_limit; + z->zout = zout; + if (!z->z_expandable) return stbi__err("output buffer limit","Corrupt PNG"); + cur = (int) (z->zout - z->zout_start); + limit = old_limit = (int) (z->zout_end - z->zout_start); + while (cur + n > limit) + limit *= 2; + q = (char *) STBI_REALLOC_SIZED(z->zout_start, old_limit, limit); + STBI_NOTUSED(old_limit); + if (q == NULL) return stbi__err("outofmem", "Out of memory"); + z->zout_start = q; + z->zout = q + cur; + z->zout_end = q + limit; + return 1; +} + +static const int stbi__zlength_base[31] = { + 3,4,5,6,7,8,9,10,11,13, + 15,17,19,23,27,31,35,43,51,59, + 67,83,99,115,131,163,195,227,258,0,0 }; + +static const int stbi__zlength_extra[31]= +{ 0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0 }; + +static const int stbi__zdist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193, +257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0}; + +static const int stbi__zdist_extra[32] = +{ 0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13}; + +static int stbi__parse_huffman_block(stbi__zbuf *a) +{ + char *zout = a->zout; + for(;;) { + int z = stbi__zhuffman_decode(a, &a->z_length); + if (z < 256) { + if (z < 0) return stbi__err("bad huffman code","Corrupt PNG"); // error in huffman codes + if (zout >= a->zout_end) { + if (!stbi__zexpand(a, zout, 1)) return 0; + zout = a->zout; + } + *zout++ = (char) z; + } else { + stbi_uc *p; + int len,dist; + if (z == 256) { + a->zout = zout; + return 1; + } + z -= 257; + len = stbi__zlength_base[z]; + if (stbi__zlength_extra[z]) len += stbi__zreceive(a, stbi__zlength_extra[z]); + z = stbi__zhuffman_decode(a, &a->z_distance); + if (z < 0) return stbi__err("bad huffman code","Corrupt PNG"); + dist = stbi__zdist_base[z]; + if (stbi__zdist_extra[z]) dist += stbi__zreceive(a, stbi__zdist_extra[z]); + if (zout - a->zout_start < dist) return stbi__err("bad dist","Corrupt PNG"); + if (zout + len > a->zout_end) { + if (!stbi__zexpand(a, zout, len)) return 0; + zout = a->zout; + } + p = (stbi_uc *) (zout - dist); + if (dist == 1) { // run of one byte; common in images. + stbi_uc v = *p; + if (len) { do *zout++ = v; while (--len); } + } else { + if (len) { do *zout++ = *p++; while (--len); } + } + } + } +} + +static int stbi__compute_huffman_codes(stbi__zbuf *a) +{ + static const stbi_uc length_dezigzag[19] = { 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15 }; + stbi__zhuffman z_codelength; + stbi_uc lencodes[286+32+137];//padding for maximum single op + stbi_uc codelength_sizes[19]; + int i,n; + + int hlit = stbi__zreceive(a,5) + 257; + int hdist = stbi__zreceive(a,5) + 1; + int hclen = stbi__zreceive(a,4) + 4; + int ntot = hlit + hdist; + + memset(codelength_sizes, 0, sizeof(codelength_sizes)); + for (i=0; i < hclen; ++i) { + int s = stbi__zreceive(a,3); + codelength_sizes[length_dezigzag[i]] = (stbi_uc) s; + } + if (!stbi__zbuild_huffman(&z_codelength, codelength_sizes, 19)) return 0; + + n = 0; + while (n < ntot) { + int c = stbi__zhuffman_decode(a, &z_codelength); + if (c < 0 || c >= 19) return stbi__err("bad codelengths", "Corrupt PNG"); + if (c < 16) + lencodes[n++] = (stbi_uc) c; + else { + stbi_uc fill = 0; + if (c == 16) { + c = stbi__zreceive(a,2)+3; + if (n == 0) return stbi__err("bad codelengths", "Corrupt PNG"); + fill = lencodes[n-1]; + } else if (c == 17) + c = stbi__zreceive(a,3)+3; + else { + STBI_ASSERT(c == 18); + c = stbi__zreceive(a,7)+11; + } + if (ntot - n < c) return stbi__err("bad codelengths", "Corrupt PNG"); + memset(lencodes+n, fill, c); + n += c; + } + } + if (n != ntot) return stbi__err("bad codelengths","Corrupt PNG"); + if (!stbi__zbuild_huffman(&a->z_length, lencodes, hlit)) return 0; + if (!stbi__zbuild_huffman(&a->z_distance, lencodes+hlit, hdist)) return 0; + return 1; +} + +static int stbi__parse_uncompressed_block(stbi__zbuf *a) +{ + stbi_uc header[4]; + int len,nlen,k; + if (a->num_bits & 7) + stbi__zreceive(a, a->num_bits & 7); // discard + // drain the bit-packed data into header + k = 0; + while (a->num_bits > 0) { + header[k++] = (stbi_uc) (a->code_buffer & 255); // suppress MSVC run-time check + a->code_buffer >>= 8; + a->num_bits -= 8; + } + STBI_ASSERT(a->num_bits == 0); + // now fill header the normal way + while (k < 4) + header[k++] = stbi__zget8(a); + len = header[1] * 256 + header[0]; + nlen = header[3] * 256 + header[2]; + if (nlen != (len ^ 0xffff)) return stbi__err("zlib corrupt","Corrupt PNG"); + if (a->zbuffer + len > a->zbuffer_end) return stbi__err("read past buffer","Corrupt PNG"); + if (a->zout + len > a->zout_end) + if (!stbi__zexpand(a, a->zout, len)) return 0; + memcpy(a->zout, a->zbuffer, len); + a->zbuffer += len; + a->zout += len; + return 1; +} + +static int stbi__parse_zlib_header(stbi__zbuf *a) +{ + int cmf = stbi__zget8(a); + int cm = cmf & 15; + /* int cinfo = cmf >> 4; */ + int flg = stbi__zget8(a); + if ((cmf*256+flg) % 31 != 0) return stbi__err("bad zlib header","Corrupt PNG"); // zlib spec + if (flg & 32) return stbi__err("no preset dict","Corrupt PNG"); // preset dictionary not allowed in png + if (cm != 8) return stbi__err("bad compression","Corrupt PNG"); // DEFLATE required for png + // window = 1 << (8 + cinfo)... but who cares, we fully buffer output + return 1; +} + +static const stbi_uc stbi__zdefault_length[288] = +{ + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, + 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, + 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, + 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8 +}; +static const stbi_uc stbi__zdefault_distance[32] = +{ + 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5 +}; +/* +Init algorithm: +{ + int i; // use <= to match clearly with spec + for (i=0; i <= 143; ++i) stbi__zdefault_length[i] = 8; + for ( ; i <= 255; ++i) stbi__zdefault_length[i] = 9; + for ( ; i <= 279; ++i) stbi__zdefault_length[i] = 7; + for ( ; i <= 287; ++i) stbi__zdefault_length[i] = 8; + + for (i=0; i <= 31; ++i) stbi__zdefault_distance[i] = 5; +} +*/ + +static int stbi__parse_zlib(stbi__zbuf *a, int parse_header) +{ + int final, type; + if (parse_header) + if (!stbi__parse_zlib_header(a)) return 0; + a->num_bits = 0; + a->code_buffer = 0; + do { + final = stbi__zreceive(a,1); + type = stbi__zreceive(a,2); + if (type == 0) { + if (!stbi__parse_uncompressed_block(a)) return 0; + } else if (type == 3) { + return 0; + } else { + if (type == 1) { + // use fixed code lengths + if (!stbi__zbuild_huffman(&a->z_length , stbi__zdefault_length , 288)) return 0; + if (!stbi__zbuild_huffman(&a->z_distance, stbi__zdefault_distance, 32)) return 0; + } else { + if (!stbi__compute_huffman_codes(a)) return 0; + } + if (!stbi__parse_huffman_block(a)) return 0; + } + } while (!final); + return 1; +} + +static int stbi__do_zlib(stbi__zbuf *a, char *obuf, int olen, int exp, int parse_header) +{ + a->zout_start = obuf; + a->zout = obuf; + a->zout_end = obuf + olen; + a->z_expandable = exp; + + return stbi__parse_zlib(a, parse_header); +} + +STBIDEF char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen) +{ + stbi__zbuf a; + char *p = (char *) stbi__malloc(initial_size); + if (p == NULL) return NULL; + a.zbuffer = (stbi_uc *) buffer; + a.zbuffer_end = (stbi_uc *) buffer + len; + if (stbi__do_zlib(&a, p, initial_size, 1, 1)) { + if (outlen) *outlen = (int) (a.zout - a.zout_start); + return a.zout_start; + } else { + STBI_FREE(a.zout_start); + return NULL; + } +} + +STBIDEF char *stbi_zlib_decode_malloc(char const *buffer, int len, int *outlen) +{ + return stbi_zlib_decode_malloc_guesssize(buffer, len, 16384, outlen); +} + +STBIDEF char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header) +{ + stbi__zbuf a; + char *p = (char *) stbi__malloc(initial_size); + if (p == NULL) return NULL; + a.zbuffer = (stbi_uc *) buffer; + a.zbuffer_end = (stbi_uc *) buffer + len; + if (stbi__do_zlib(&a, p, initial_size, 1, parse_header)) { + if (outlen) *outlen = (int) (a.zout - a.zout_start); + return a.zout_start; + } else { + STBI_FREE(a.zout_start); + return NULL; + } +} + +STBIDEF int stbi_zlib_decode_buffer(char *obuffer, int olen, char const *ibuffer, int ilen) +{ + stbi__zbuf a; + a.zbuffer = (stbi_uc *) ibuffer; + a.zbuffer_end = (stbi_uc *) ibuffer + ilen; + if (stbi__do_zlib(&a, obuffer, olen, 0, 1)) + return (int) (a.zout - a.zout_start); + else + return -1; +} + +STBIDEF char *stbi_zlib_decode_noheader_malloc(char const *buffer, int len, int *outlen) +{ + stbi__zbuf a; + char *p = (char *) stbi__malloc(16384); + if (p == NULL) return NULL; + a.zbuffer = (stbi_uc *) buffer; + a.zbuffer_end = (stbi_uc *) buffer+len; + if (stbi__do_zlib(&a, p, 16384, 1, 0)) { + if (outlen) *outlen = (int) (a.zout - a.zout_start); + return a.zout_start; + } else { + STBI_FREE(a.zout_start); + return NULL; + } +} + +STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen) +{ + stbi__zbuf a; + a.zbuffer = (stbi_uc *) ibuffer; + a.zbuffer_end = (stbi_uc *) ibuffer + ilen; + if (stbi__do_zlib(&a, obuffer, olen, 0, 0)) + return (int) (a.zout - a.zout_start); + else + return -1; +} +#endif + +// public domain "baseline" PNG decoder v0.10 Sean Barrett 2006-11-18 +// simple implementation +// - only 8-bit samples +// - no CRC checking +// - allocates lots of intermediate memory +// - avoids problem of streaming data between subsystems +// - avoids explicit window management +// performance +// - uses stb_zlib, a PD zlib implementation with fast huffman decoding + +#ifndef STBI_NO_PNG +typedef struct +{ + stbi__uint32 length; + stbi__uint32 type; +} stbi__pngchunk; + +static stbi__pngchunk stbi__get_chunk_header(stbi__context *s) +{ + stbi__pngchunk c; + c.length = stbi__get32be(s); + c.type = stbi__get32be(s); + return c; +} + +static int stbi__check_png_header(stbi__context *s) +{ + static const stbi_uc png_sig[8] = { 137,80,78,71,13,10,26,10 }; + int i; + for (i=0; i < 8; ++i) + if (stbi__get8(s) != png_sig[i]) return stbi__err("bad png sig","Not a PNG"); + return 1; +} + +typedef struct +{ + stbi__context *s; + stbi_uc *idata, *expanded, *out; + int depth; +} stbi__png; + + +enum { + STBI__F_none=0, + STBI__F_sub=1, + STBI__F_up=2, + STBI__F_avg=3, + STBI__F_paeth=4, + // synthetic filters used for first scanline to avoid needing a dummy row of 0s + STBI__F_avg_first, + STBI__F_paeth_first +}; + +static stbi_uc first_row_filter[5] = +{ + STBI__F_none, + STBI__F_sub, + STBI__F_none, + STBI__F_avg_first, + STBI__F_paeth_first +}; + +static int stbi__paeth(int a, int b, int c) +{ + int p = a + b - c; + int pa = abs(p-a); + int pb = abs(p-b); + int pc = abs(p-c); + if (pa <= pb && pa <= pc) return a; + if (pb <= pc) return b; + return c; +} + +static const stbi_uc stbi__depth_scale_table[9] = { 0, 0xff, 0x55, 0, 0x11, 0,0,0, 0x01 }; + +// create the png data from post-deflated data +static int stbi__create_png_image_raw(stbi__png *a, stbi_uc *raw, stbi__uint32 raw_len, int out_n, stbi__uint32 x, stbi__uint32 y, int depth, int color) +{ + int bytes = (depth == 16? 2 : 1); + stbi__context *s = a->s; + stbi__uint32 i,j,stride = x*out_n*bytes; + stbi__uint32 img_len, img_width_bytes; + int k; + int img_n = s->img_n; // copy it into a local for later + + int output_bytes = out_n*bytes; + int filter_bytes = img_n*bytes; + int width = x; + + STBI_ASSERT(out_n == s->img_n || out_n == s->img_n+1); + a->out = (stbi_uc *) stbi__malloc_mad3(x, y, output_bytes, 0); // extra bytes to write off the end into + if (!a->out) return stbi__err("outofmem", "Out of memory"); + + if (!stbi__mad3sizes_valid(img_n, x, depth, 7)) return stbi__err("too large", "Corrupt PNG"); + img_width_bytes = (((img_n * x * depth) + 7) >> 3); + img_len = (img_width_bytes + 1) * y; + + // we used to check for exact match between raw_len and img_len on non-interlaced PNGs, + // but issue #276 reported a PNG in the wild that had extra data at the end (all zeros), + // so just check for raw_len < img_len always. + if (raw_len < img_len) return stbi__err("not enough pixels","Corrupt PNG"); + + for (j=0; j < y; ++j) { + stbi_uc *cur = a->out + stride*j; + stbi_uc *prior; + int filter = *raw++; + + if (filter > 4) + return stbi__err("invalid filter","Corrupt PNG"); + + if (depth < 8) { + STBI_ASSERT(img_width_bytes <= x); + cur += x*out_n - img_width_bytes; // store output to the rightmost img_len bytes, so we can decode in place + filter_bytes = 1; + width = img_width_bytes; + } + prior = cur - stride; // bugfix: need to compute this after 'cur +=' computation above + + // if first row, use special filter that doesn't sample previous row + if (j == 0) filter = first_row_filter[filter]; + + // handle first byte explicitly + for (k=0; k < filter_bytes; ++k) { + switch (filter) { + case STBI__F_none : cur[k] = raw[k]; break; + case STBI__F_sub : cur[k] = raw[k]; break; + case STBI__F_up : cur[k] = STBI__BYTECAST(raw[k] + prior[k]); break; + case STBI__F_avg : cur[k] = STBI__BYTECAST(raw[k] + (prior[k]>>1)); break; + case STBI__F_paeth : cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(0,prior[k],0)); break; + case STBI__F_avg_first : cur[k] = raw[k]; break; + case STBI__F_paeth_first: cur[k] = raw[k]; break; + } + } + + if (depth == 8) { + if (img_n != out_n) + cur[img_n] = 255; // first pixel + raw += img_n; + cur += out_n; + prior += out_n; + } else if (depth == 16) { + if (img_n != out_n) { + cur[filter_bytes] = 255; // first pixel top byte + cur[filter_bytes+1] = 255; // first pixel bottom byte + } + raw += filter_bytes; + cur += output_bytes; + prior += output_bytes; + } else { + raw += 1; + cur += 1; + prior += 1; + } + + // this is a little gross, so that we don't switch per-pixel or per-component + if (depth < 8 || img_n == out_n) { + int nk = (width - 1)*filter_bytes; + #define STBI__CASE(f) \ + case f: \ + for (k=0; k < nk; ++k) + switch (filter) { + // "none" filter turns into a memcpy here; make that explicit. + case STBI__F_none: memcpy(cur, raw, nk); break; + STBI__CASE(STBI__F_sub) { cur[k] = STBI__BYTECAST(raw[k] + cur[k-filter_bytes]); } break; + STBI__CASE(STBI__F_up) { cur[k] = STBI__BYTECAST(raw[k] + prior[k]); } break; + STBI__CASE(STBI__F_avg) { cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k-filter_bytes])>>1)); } break; + STBI__CASE(STBI__F_paeth) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],prior[k],prior[k-filter_bytes])); } break; + STBI__CASE(STBI__F_avg_first) { cur[k] = STBI__BYTECAST(raw[k] + (cur[k-filter_bytes] >> 1)); } break; + STBI__CASE(STBI__F_paeth_first) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],0,0)); } break; + } + #undef STBI__CASE + raw += nk; + } else { + STBI_ASSERT(img_n+1 == out_n); + #define STBI__CASE(f) \ + case f: \ + for (i=x-1; i >= 1; --i, cur[filter_bytes]=255,raw+=filter_bytes,cur+=output_bytes,prior+=output_bytes) \ + for (k=0; k < filter_bytes; ++k) + switch (filter) { + STBI__CASE(STBI__F_none) { cur[k] = raw[k]; } break; + STBI__CASE(STBI__F_sub) { cur[k] = STBI__BYTECAST(raw[k] + cur[k- output_bytes]); } break; + STBI__CASE(STBI__F_up) { cur[k] = STBI__BYTECAST(raw[k] + prior[k]); } break; + STBI__CASE(STBI__F_avg) { cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k- output_bytes])>>1)); } break; + STBI__CASE(STBI__F_paeth) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k- output_bytes],prior[k],prior[k- output_bytes])); } break; + STBI__CASE(STBI__F_avg_first) { cur[k] = STBI__BYTECAST(raw[k] + (cur[k- output_bytes] >> 1)); } break; + STBI__CASE(STBI__F_paeth_first) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k- output_bytes],0,0)); } break; + } + #undef STBI__CASE + + // the loop above sets the high byte of the pixels' alpha, but for + // 16 bit png files we also need the low byte set. we'll do that here. + if (depth == 16) { + cur = a->out + stride*j; // start at the beginning of the row again + for (i=0; i < x; ++i,cur+=output_bytes) { + cur[filter_bytes+1] = 255; + } + } + } + } + + // we make a separate pass to expand bits to pixels; for performance, + // this could run two scanlines behind the above code, so it won't + // intefere with filtering but will still be in the cache. + if (depth < 8) { + for (j=0; j < y; ++j) { + stbi_uc *cur = a->out + stride*j; + stbi_uc *in = a->out + stride*j + x*out_n - img_width_bytes; + // unpack 1/2/4-bit into a 8-bit buffer. allows us to keep the common 8-bit path optimal at minimal cost for 1/2/4-bit + // png guarante byte alignment, if width is not multiple of 8/4/2 we'll decode dummy trailing data that will be skipped in the later loop + stbi_uc scale = (color == 0) ? stbi__depth_scale_table[depth] : 1; // scale grayscale values to 0..255 range + + // note that the final byte might overshoot and write more data than desired. + // we can allocate enough data that this never writes out of memory, but it + // could also overwrite the next scanline. can it overwrite non-empty data + // on the next scanline? yes, consider 1-pixel-wide scanlines with 1-bit-per-pixel. + // so we need to explicitly clamp the final ones + + if (depth == 4) { + for (k=x*img_n; k >= 2; k-=2, ++in) { + *cur++ = scale * ((*in >> 4) ); + *cur++ = scale * ((*in ) & 0x0f); + } + if (k > 0) *cur++ = scale * ((*in >> 4) ); + } else if (depth == 2) { + for (k=x*img_n; k >= 4; k-=4, ++in) { + *cur++ = scale * ((*in >> 6) ); + *cur++ = scale * ((*in >> 4) & 0x03); + *cur++ = scale * ((*in >> 2) & 0x03); + *cur++ = scale * ((*in ) & 0x03); + } + if (k > 0) *cur++ = scale * ((*in >> 6) ); + if (k > 1) *cur++ = scale * ((*in >> 4) & 0x03); + if (k > 2) *cur++ = scale * ((*in >> 2) & 0x03); + } else if (depth == 1) { + for (k=x*img_n; k >= 8; k-=8, ++in) { + *cur++ = scale * ((*in >> 7) ); + *cur++ = scale * ((*in >> 6) & 0x01); + *cur++ = scale * ((*in >> 5) & 0x01); + *cur++ = scale * ((*in >> 4) & 0x01); + *cur++ = scale * ((*in >> 3) & 0x01); + *cur++ = scale * ((*in >> 2) & 0x01); + *cur++ = scale * ((*in >> 1) & 0x01); + *cur++ = scale * ((*in ) & 0x01); + } + if (k > 0) *cur++ = scale * ((*in >> 7) ); + if (k > 1) *cur++ = scale * ((*in >> 6) & 0x01); + if (k > 2) *cur++ = scale * ((*in >> 5) & 0x01); + if (k > 3) *cur++ = scale * ((*in >> 4) & 0x01); + if (k > 4) *cur++ = scale * ((*in >> 3) & 0x01); + if (k > 5) *cur++ = scale * ((*in >> 2) & 0x01); + if (k > 6) *cur++ = scale * ((*in >> 1) & 0x01); + } + if (img_n != out_n) { + int q; + // insert alpha = 255 + cur = a->out + stride*j; + if (img_n == 1) { + for (q=x-1; q >= 0; --q) { + cur[q*2+1] = 255; + cur[q*2+0] = cur[q]; + } + } else { + STBI_ASSERT(img_n == 3); + for (q=x-1; q >= 0; --q) { + cur[q*4+3] = 255; + cur[q*4+2] = cur[q*3+2]; + cur[q*4+1] = cur[q*3+1]; + cur[q*4+0] = cur[q*3+0]; + } + } + } + } + } else if (depth == 16) { + // force the image data from big-endian to platform-native. + // this is done in a separate pass due to the decoding relying + // on the data being untouched, but could probably be done + // per-line during decode if care is taken. + stbi_uc *cur = a->out; + stbi__uint16 *cur16 = (stbi__uint16*)cur; + + for(i=0; i < x*y*out_n; ++i,cur16++,cur+=2) { + *cur16 = (cur[0] << 8) | cur[1]; + } + } + + return 1; +} + +static int stbi__create_png_image(stbi__png *a, stbi_uc *image_data, stbi__uint32 image_data_len, int out_n, int depth, int color, int interlaced) +{ + int bytes = (depth == 16 ? 2 : 1); + int out_bytes = out_n * bytes; + stbi_uc *final; + int p; + if (!interlaced) + return stbi__create_png_image_raw(a, image_data, image_data_len, out_n, a->s->img_x, a->s->img_y, depth, color); + + // de-interlacing + final = (stbi_uc *) stbi__malloc_mad3(a->s->img_x, a->s->img_y, out_bytes, 0); + for (p=0; p < 7; ++p) { + int xorig[] = { 0,4,0,2,0,1,0 }; + int yorig[] = { 0,0,4,0,2,0,1 }; + int xspc[] = { 8,8,4,4,2,2,1 }; + int yspc[] = { 8,8,8,4,4,2,2 }; + int i,j,x,y; + // pass1_x[4] = 0, pass1_x[5] = 1, pass1_x[12] = 1 + x = (a->s->img_x - xorig[p] + xspc[p]-1) / xspc[p]; + y = (a->s->img_y - yorig[p] + yspc[p]-1) / yspc[p]; + if (x && y) { + stbi__uint32 img_len = ((((a->s->img_n * x * depth) + 7) >> 3) + 1) * y; + if (!stbi__create_png_image_raw(a, image_data, image_data_len, out_n, x, y, depth, color)) { + STBI_FREE(final); + return 0; + } + for (j=0; j < y; ++j) { + for (i=0; i < x; ++i) { + int out_y = j*yspc[p]+yorig[p]; + int out_x = i*xspc[p]+xorig[p]; + memcpy(final + out_y*a->s->img_x*out_bytes + out_x*out_bytes, + a->out + (j*x+i)*out_bytes, out_bytes); + } + } + STBI_FREE(a->out); + image_data += img_len; + image_data_len -= img_len; + } + } + a->out = final; + + return 1; +} + +static int stbi__compute_transparency(stbi__png *z, stbi_uc tc[3], int out_n) +{ + stbi__context *s = z->s; + stbi__uint32 i, pixel_count = s->img_x * s->img_y; + stbi_uc *p = z->out; + + // compute color-based transparency, assuming we've + // already got 255 as the alpha value in the output + STBI_ASSERT(out_n == 2 || out_n == 4); + + if (out_n == 2) { + for (i=0; i < pixel_count; ++i) { + p[1] = (p[0] == tc[0] ? 0 : 255); + p += 2; + } + } else { + for (i=0; i < pixel_count; ++i) { + if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2]) + p[3] = 0; + p += 4; + } + } + return 1; +} + +static int stbi__compute_transparency16(stbi__png *z, stbi__uint16 tc[3], int out_n) +{ + stbi__context *s = z->s; + stbi__uint32 i, pixel_count = s->img_x * s->img_y; + stbi__uint16 *p = (stbi__uint16*) z->out; + + // compute color-based transparency, assuming we've + // already got 65535 as the alpha value in the output + STBI_ASSERT(out_n == 2 || out_n == 4); + + if (out_n == 2) { + for (i = 0; i < pixel_count; ++i) { + p[1] = (p[0] == tc[0] ? 0 : 65535); + p += 2; + } + } else { + for (i = 0; i < pixel_count; ++i) { + if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2]) + p[3] = 0; + p += 4; + } + } + return 1; +} + +static int stbi__expand_png_palette(stbi__png *a, stbi_uc *palette, int len, int pal_img_n) +{ + stbi__uint32 i, pixel_count = a->s->img_x * a->s->img_y; + stbi_uc *p, *temp_out, *orig = a->out; + + p = (stbi_uc *) stbi__malloc_mad2(pixel_count, pal_img_n, 0); + if (p == NULL) return stbi__err("outofmem", "Out of memory"); + + // between here and free(out) below, exitting would leak + temp_out = p; + + if (pal_img_n == 3) { + for (i=0; i < pixel_count; ++i) { + int n = orig[i]*4; + p[0] = palette[n ]; + p[1] = palette[n+1]; + p[2] = palette[n+2]; + p += 3; + } + } else { + for (i=0; i < pixel_count; ++i) { + int n = orig[i]*4; + p[0] = palette[n ]; + p[1] = palette[n+1]; + p[2] = palette[n+2]; + p[3] = palette[n+3]; + p += 4; + } + } + STBI_FREE(a->out); + a->out = temp_out; + + STBI_NOTUSED(len); + + return 1; +} + +static int stbi__unpremultiply_on_load = 0; +static int stbi__de_iphone_flag = 0; + +STBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply) +{ + stbi__unpremultiply_on_load = flag_true_if_should_unpremultiply; +} + +STBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert) +{ + stbi__de_iphone_flag = flag_true_if_should_convert; +} + +static void stbi__de_iphone(stbi__png *z) +{ + stbi__context *s = z->s; + stbi__uint32 i, pixel_count = s->img_x * s->img_y; + stbi_uc *p = z->out; + + if (s->img_out_n == 3) { // convert bgr to rgb + for (i=0; i < pixel_count; ++i) { + stbi_uc t = p[0]; + p[0] = p[2]; + p[2] = t; + p += 3; + } + } else { + STBI_ASSERT(s->img_out_n == 4); + if (stbi__unpremultiply_on_load) { + // convert bgr to rgb and unpremultiply + for (i=0; i < pixel_count; ++i) { + stbi_uc a = p[3]; + stbi_uc t = p[0]; + if (a) { + stbi_uc half = a / 2; + p[0] = (p[2] * 255 + half) / a; + p[1] = (p[1] * 255 + half) / a; + p[2] = ( t * 255 + half) / a; + } else { + p[0] = p[2]; + p[2] = t; + } + p += 4; + } + } else { + // convert bgr to rgb + for (i=0; i < pixel_count; ++i) { + stbi_uc t = p[0]; + p[0] = p[2]; + p[2] = t; + p += 4; + } + } + } +} + +#define STBI__PNG_TYPE(a,b,c,d) (((unsigned) (a) << 24) + ((unsigned) (b) << 16) + ((unsigned) (c) << 8) + (unsigned) (d)) + +static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp) +{ + stbi_uc palette[1024], pal_img_n=0; + stbi_uc has_trans=0, tc[3]; + stbi__uint16 tc16[3]; + stbi__uint32 ioff=0, idata_limit=0, i, pal_len=0; + int first=1,k,interlace=0, color=0, is_iphone=0; + stbi__context *s = z->s; + + z->expanded = NULL; + z->idata = NULL; + z->out = NULL; + + if (!stbi__check_png_header(s)) return 0; + + if (scan == STBI__SCAN_type) return 1; + + for (;;) { + stbi__pngchunk c = stbi__get_chunk_header(s); + switch (c.type) { + case STBI__PNG_TYPE('C','g','B','I'): + is_iphone = 1; + stbi__skip(s, c.length); + break; + case STBI__PNG_TYPE('I','H','D','R'): { + int comp,filter; + if (!first) return stbi__err("multiple IHDR","Corrupt PNG"); + first = 0; + if (c.length != 13) return stbi__err("bad IHDR len","Corrupt PNG"); + s->img_x = stbi__get32be(s); if (s->img_x > (1 << 24)) return stbi__err("too large","Very large image (corrupt?)"); + s->img_y = stbi__get32be(s); if (s->img_y > (1 << 24)) return stbi__err("too large","Very large image (corrupt?)"); + z->depth = stbi__get8(s); if (z->depth != 1 && z->depth != 2 && z->depth != 4 && z->depth != 8 && z->depth != 16) return stbi__err("1/2/4/8/16-bit only","PNG not supported: 1/2/4/8/16-bit only"); + color = stbi__get8(s); if (color > 6) return stbi__err("bad ctype","Corrupt PNG"); + if (color == 3 && z->depth == 16) return stbi__err("bad ctype","Corrupt PNG"); + if (color == 3) pal_img_n = 3; else if (color & 1) return stbi__err("bad ctype","Corrupt PNG"); + comp = stbi__get8(s); if (comp) return stbi__err("bad comp method","Corrupt PNG"); + filter= stbi__get8(s); if (filter) return stbi__err("bad filter method","Corrupt PNG"); + interlace = stbi__get8(s); if (interlace>1) return stbi__err("bad interlace method","Corrupt PNG"); + if (!s->img_x || !s->img_y) return stbi__err("0-pixel image","Corrupt PNG"); + if (!pal_img_n) { + s->img_n = (color & 2 ? 3 : 1) + (color & 4 ? 1 : 0); + if ((1 << 30) / s->img_x / s->img_n < s->img_y) return stbi__err("too large", "Image too large to decode"); + if (scan == STBI__SCAN_header) return 1; + } else { + // if paletted, then pal_n is our final components, and + // img_n is # components to decompress/filter. + s->img_n = 1; + if ((1 << 30) / s->img_x / 4 < s->img_y) return stbi__err("too large","Corrupt PNG"); + // if SCAN_header, have to scan to see if we have a tRNS + } + break; + } + + case STBI__PNG_TYPE('P','L','T','E'): { + if (first) return stbi__err("first not IHDR", "Corrupt PNG"); + if (c.length > 256*3) return stbi__err("invalid PLTE","Corrupt PNG"); + pal_len = c.length / 3; + if (pal_len * 3 != c.length) return stbi__err("invalid PLTE","Corrupt PNG"); + for (i=0; i < pal_len; ++i) { + palette[i*4+0] = stbi__get8(s); + palette[i*4+1] = stbi__get8(s); + palette[i*4+2] = stbi__get8(s); + palette[i*4+3] = 255; + } + break; + } + + case STBI__PNG_TYPE('t','R','N','S'): { + if (first) return stbi__err("first not IHDR", "Corrupt PNG"); + if (z->idata) return stbi__err("tRNS after IDAT","Corrupt PNG"); + if (pal_img_n) { + if (scan == STBI__SCAN_header) { s->img_n = 4; return 1; } + if (pal_len == 0) return stbi__err("tRNS before PLTE","Corrupt PNG"); + if (c.length > pal_len) return stbi__err("bad tRNS len","Corrupt PNG"); + pal_img_n = 4; + for (i=0; i < c.length; ++i) + palette[i*4+3] = stbi__get8(s); + } else { + if (!(s->img_n & 1)) return stbi__err("tRNS with alpha","Corrupt PNG"); + if (c.length != (stbi__uint32) s->img_n*2) return stbi__err("bad tRNS len","Corrupt PNG"); + has_trans = 1; + if (z->depth == 16) { + for (k = 0; k < s->img_n; ++k) tc16[k] = (stbi__uint16)stbi__get16be(s); // copy the values as-is + } else { + for (k = 0; k < s->img_n; ++k) tc[k] = (stbi_uc)(stbi__get16be(s) & 255) * stbi__depth_scale_table[z->depth]; // non 8-bit images will be larger + } + } + break; + } + + case STBI__PNG_TYPE('I','D','A','T'): { + if (first) return stbi__err("first not IHDR", "Corrupt PNG"); + if (pal_img_n && !pal_len) return stbi__err("no PLTE","Corrupt PNG"); + if (scan == STBI__SCAN_header) { s->img_n = pal_img_n; return 1; } + if ((int)(ioff + c.length) < (int)ioff) return 0; + if (ioff + c.length > idata_limit) { + stbi__uint32 idata_limit_old = idata_limit; + stbi_uc *p; + if (idata_limit == 0) idata_limit = c.length > 4096 ? c.length : 4096; + while (ioff + c.length > idata_limit) + idata_limit *= 2; + STBI_NOTUSED(idata_limit_old); + p = (stbi_uc *) STBI_REALLOC_SIZED(z->idata, idata_limit_old, idata_limit); if (p == NULL) return stbi__err("outofmem", "Out of memory"); + z->idata = p; + } + if (!stbi__getn(s, z->idata+ioff,c.length)) return stbi__err("outofdata","Corrupt PNG"); + ioff += c.length; + break; + } + + case STBI__PNG_TYPE('I','E','N','D'): { + stbi__uint32 raw_len, bpl; + if (first) return stbi__err("first not IHDR", "Corrupt PNG"); + if (scan != STBI__SCAN_load) return 1; + if (z->idata == NULL) return stbi__err("no IDAT","Corrupt PNG"); + // initial guess for decoded data size to avoid unnecessary reallocs + bpl = (s->img_x * z->depth + 7) / 8; // bytes per line, per component + raw_len = bpl * s->img_y * s->img_n /* pixels */ + s->img_y /* filter mode per row */; + z->expanded = (stbi_uc *) stbi_zlib_decode_malloc_guesssize_headerflag((char *) z->idata, ioff, raw_len, (int *) &raw_len, !is_iphone); + if (z->expanded == NULL) return 0; // zlib should set error + STBI_FREE(z->idata); z->idata = NULL; + if ((req_comp == s->img_n+1 && req_comp != 3 && !pal_img_n) || has_trans) + s->img_out_n = s->img_n+1; + else + s->img_out_n = s->img_n; + if (!stbi__create_png_image(z, z->expanded, raw_len, s->img_out_n, z->depth, color, interlace)) return 0; + if (has_trans) { + if (z->depth == 16) { + if (!stbi__compute_transparency16(z, tc16, s->img_out_n)) return 0; + } else { + if (!stbi__compute_transparency(z, tc, s->img_out_n)) return 0; + } + } + if (is_iphone && stbi__de_iphone_flag && s->img_out_n > 2) + stbi__de_iphone(z); + if (pal_img_n) { + // pal_img_n == 3 or 4 + s->img_n = pal_img_n; // record the actual colors we had + s->img_out_n = pal_img_n; + if (req_comp >= 3) s->img_out_n = req_comp; + if (!stbi__expand_png_palette(z, palette, pal_len, s->img_out_n)) + return 0; + } else if (has_trans) { + // non-paletted image with tRNS -> source image has (constant) alpha + ++s->img_n; + } + STBI_FREE(z->expanded); z->expanded = NULL; + return 1; + } + + default: + // if critical, fail + if (first) return stbi__err("first not IHDR", "Corrupt PNG"); + if ((c.type & (1 << 29)) == 0) { + #ifndef STBI_NO_FAILURE_STRINGS + // not threadsafe + static char invalid_chunk[] = "XXXX PNG chunk not known"; + invalid_chunk[0] = STBI__BYTECAST(c.type >> 24); + invalid_chunk[1] = STBI__BYTECAST(c.type >> 16); + invalid_chunk[2] = STBI__BYTECAST(c.type >> 8); + invalid_chunk[3] = STBI__BYTECAST(c.type >> 0); + #endif + return stbi__err(invalid_chunk, "PNG not supported: unknown PNG chunk type"); + } + stbi__skip(s, c.length); + break; + } + // end of PNG chunk, read and skip CRC + stbi__get32be(s); + } +} + +static void *stbi__do_png(stbi__png *p, int *x, int *y, int *n, int req_comp, stbi__result_info *ri) +{ + void *result=NULL; + if (req_comp < 0 || req_comp > 4) return stbi__errpuc("bad req_comp", "Internal error"); + if (stbi__parse_png_file(p, STBI__SCAN_load, req_comp)) { + if (p->depth < 8) + ri->bits_per_channel = 8; + else + ri->bits_per_channel = p->depth; + result = p->out; + p->out = NULL; + if (req_comp && req_comp != p->s->img_out_n) { + if (ri->bits_per_channel == 8) + result = stbi__convert_format((unsigned char *) result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y); + else + result = stbi__convert_format16((stbi__uint16 *) result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y); + p->s->img_out_n = req_comp; + if (result == NULL) return result; + } + *x = p->s->img_x; + *y = p->s->img_y; + if (n) *n = p->s->img_n; + } + STBI_FREE(p->out); p->out = NULL; + STBI_FREE(p->expanded); p->expanded = NULL; + STBI_FREE(p->idata); p->idata = NULL; + + return result; +} + +static void *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + stbi__png p; + p.s = s; + return stbi__do_png(&p, x,y,comp,req_comp, ri); +} + +static int stbi__png_test(stbi__context *s) +{ + int r; + r = stbi__check_png_header(s); + stbi__rewind(s); + return r; +} + +static int stbi__png_info_raw(stbi__png *p, int *x, int *y, int *comp) +{ + if (!stbi__parse_png_file(p, STBI__SCAN_header, 0)) { + stbi__rewind( p->s ); + return 0; + } + if (x) *x = p->s->img_x; + if (y) *y = p->s->img_y; + if (comp) *comp = p->s->img_n; + return 1; +} + +static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp) +{ + stbi__png p; + p.s = s; + return stbi__png_info_raw(&p, x, y, comp); +} + +static int stbi__png_is16(stbi__context *s) +{ + stbi__png p; + p.s = s; + if (!stbi__png_info_raw(&p, NULL, NULL, NULL)) + return 0; + if (p.depth != 16) { + stbi__rewind(p.s); + return 0; + } + return 1; +} +#endif + +// Microsoft/Windows BMP image + +#ifndef STBI_NO_BMP +static int stbi__bmp_test_raw(stbi__context *s) +{ + int r; + int sz; + if (stbi__get8(s) != 'B') return 0; + if (stbi__get8(s) != 'M') return 0; + stbi__get32le(s); // discard filesize + stbi__get16le(s); // discard reserved + stbi__get16le(s); // discard reserved + stbi__get32le(s); // discard data offset + sz = stbi__get32le(s); + r = (sz == 12 || sz == 40 || sz == 56 || sz == 108 || sz == 124); + return r; +} + +static int stbi__bmp_test(stbi__context *s) +{ + int r = stbi__bmp_test_raw(s); + stbi__rewind(s); + return r; +} + + +// returns 0..31 for the highest set bit +static int stbi__high_bit(unsigned int z) +{ + int n=0; + if (z == 0) return -1; + if (z >= 0x10000) n += 16, z >>= 16; + if (z >= 0x00100) n += 8, z >>= 8; + if (z >= 0x00010) n += 4, z >>= 4; + if (z >= 0x00004) n += 2, z >>= 2; + if (z >= 0x00002) n += 1, z >>= 1; + return n; +} + +static int stbi__bitcount(unsigned int a) +{ + a = (a & 0x55555555) + ((a >> 1) & 0x55555555); // max 2 + a = (a & 0x33333333) + ((a >> 2) & 0x33333333); // max 4 + a = (a + (a >> 4)) & 0x0f0f0f0f; // max 8 per 4, now 8 bits + a = (a + (a >> 8)); // max 16 per 8 bits + a = (a + (a >> 16)); // max 32 per 8 bits + return a & 0xff; +} + +// extract an arbitrarily-aligned N-bit value (N=bits) +// from v, and then make it 8-bits long and fractionally +// extend it to full full range. +static int stbi__shiftsigned(int v, int shift, int bits) +{ + static unsigned int mul_table[9] = { + 0, + 0xff/*0b11111111*/, 0x55/*0b01010101*/, 0x49/*0b01001001*/, 0x11/*0b00010001*/, + 0x21/*0b00100001*/, 0x41/*0b01000001*/, 0x81/*0b10000001*/, 0x01/*0b00000001*/, + }; + static unsigned int shift_table[9] = { + 0, 0,0,1,0,2,4,6,0, + }; + if (shift < 0) + v <<= -shift; + else + v >>= shift; + STBI_ASSERT(v >= 0 && v < 256); + v >>= (8-bits); + STBI_ASSERT(bits >= 0 && bits <= 8); + return (int) ((unsigned) v * mul_table[bits]) >> shift_table[bits]; +} + +typedef struct +{ + int bpp, offset, hsz; + unsigned int mr,mg,mb,ma, all_a; +} stbi__bmp_data; + +static void *stbi__bmp_parse_header(stbi__context *s, stbi__bmp_data *info) +{ + int hsz; + if (stbi__get8(s) != 'B' || stbi__get8(s) != 'M') return stbi__errpuc("not BMP", "Corrupt BMP"); + stbi__get32le(s); // discard filesize + stbi__get16le(s); // discard reserved + stbi__get16le(s); // discard reserved + info->offset = stbi__get32le(s); + info->hsz = hsz = stbi__get32le(s); + info->mr = info->mg = info->mb = info->ma = 0; + + if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124) return stbi__errpuc("unknown BMP", "BMP type not supported: unknown"); + if (hsz == 12) { + s->img_x = stbi__get16le(s); + s->img_y = stbi__get16le(s); + } else { + s->img_x = stbi__get32le(s); + s->img_y = stbi__get32le(s); + } + if (stbi__get16le(s) != 1) return stbi__errpuc("bad BMP", "bad BMP"); + info->bpp = stbi__get16le(s); + if (hsz != 12) { + int compress = stbi__get32le(s); + if (compress == 1 || compress == 2) return stbi__errpuc("BMP RLE", "BMP type not supported: RLE"); + stbi__get32le(s); // discard sizeof + stbi__get32le(s); // discard hres + stbi__get32le(s); // discard vres + stbi__get32le(s); // discard colorsused + stbi__get32le(s); // discard max important + if (hsz == 40 || hsz == 56) { + if (hsz == 56) { + stbi__get32le(s); + stbi__get32le(s); + stbi__get32le(s); + stbi__get32le(s); + } + if (info->bpp == 16 || info->bpp == 32) { + if (compress == 0) { + if (info->bpp == 32) { + info->mr = 0xffu << 16; + info->mg = 0xffu << 8; + info->mb = 0xffu << 0; + info->ma = 0xffu << 24; + info->all_a = 0; // if all_a is 0 at end, then we loaded alpha channel but it was all 0 + } else { + info->mr = 31u << 10; + info->mg = 31u << 5; + info->mb = 31u << 0; + } + } else if (compress == 3) { + info->mr = stbi__get32le(s); + info->mg = stbi__get32le(s); + info->mb = stbi__get32le(s); + // not documented, but generated by photoshop and handled by mspaint + if (info->mr == info->mg && info->mg == info->mb) { + // ?!?!? + return stbi__errpuc("bad BMP", "bad BMP"); + } + } else + return stbi__errpuc("bad BMP", "bad BMP"); + } + } else { + int i; + if (hsz != 108 && hsz != 124) + return stbi__errpuc("bad BMP", "bad BMP"); + info->mr = stbi__get32le(s); + info->mg = stbi__get32le(s); + info->mb = stbi__get32le(s); + info->ma = stbi__get32le(s); + stbi__get32le(s); // discard color space + for (i=0; i < 12; ++i) + stbi__get32le(s); // discard color space parameters + if (hsz == 124) { + stbi__get32le(s); // discard rendering intent + stbi__get32le(s); // discard offset of profile data + stbi__get32le(s); // discard size of profile data + stbi__get32le(s); // discard reserved + } + } + } + return (void *) 1; +} + + +static void *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + stbi_uc *out; + unsigned int mr=0,mg=0,mb=0,ma=0, all_a; + stbi_uc pal[256][4]; + int psize=0,i,j,width; + int flip_vertically, pad, target; + stbi__bmp_data info; + STBI_NOTUSED(ri); + + info.all_a = 255; + if (stbi__bmp_parse_header(s, &info) == NULL) + return NULL; // error code already set + + flip_vertically = ((int) s->img_y) > 0; + s->img_y = abs((int) s->img_y); + + mr = info.mr; + mg = info.mg; + mb = info.mb; + ma = info.ma; + all_a = info.all_a; + + if (info.hsz == 12) { + if (info.bpp < 24) + psize = (info.offset - 14 - 24) / 3; + } else { + if (info.bpp < 16) + psize = (info.offset - 14 - info.hsz) >> 2; + } + + s->img_n = ma ? 4 : 3; + if (req_comp && req_comp >= 3) // we can directly decode 3 or 4 + target = req_comp; + else + target = s->img_n; // if they want monochrome, we'll post-convert + + // sanity-check size + if (!stbi__mad3sizes_valid(target, s->img_x, s->img_y, 0)) + return stbi__errpuc("too large", "Corrupt BMP"); + + out = (stbi_uc *) stbi__malloc_mad3(target, s->img_x, s->img_y, 0); + if (!out) return stbi__errpuc("outofmem", "Out of memory"); + if (info.bpp < 16) { + int z=0; + if (psize == 0 || psize > 256) { STBI_FREE(out); return stbi__errpuc("invalid", "Corrupt BMP"); } + for (i=0; i < psize; ++i) { + pal[i][2] = stbi__get8(s); + pal[i][1] = stbi__get8(s); + pal[i][0] = stbi__get8(s); + if (info.hsz != 12) stbi__get8(s); + pal[i][3] = 255; + } + stbi__skip(s, info.offset - 14 - info.hsz - psize * (info.hsz == 12 ? 3 : 4)); + if (info.bpp == 1) width = (s->img_x + 7) >> 3; + else if (info.bpp == 4) width = (s->img_x + 1) >> 1; + else if (info.bpp == 8) width = s->img_x; + else { STBI_FREE(out); return stbi__errpuc("bad bpp", "Corrupt BMP"); } + pad = (-width)&3; + if (info.bpp == 1) { + for (j=0; j < (int) s->img_y; ++j) { + int bit_offset = 7, v = stbi__get8(s); + for (i=0; i < (int) s->img_x; ++i) { + int color = (v>>bit_offset)&0x1; + out[z++] = pal[color][0]; + out[z++] = pal[color][1]; + out[z++] = pal[color][2]; + if((--bit_offset) < 0) { + bit_offset = 7; + v = stbi__get8(s); + } + } + stbi__skip(s, pad); + } + } else { + for (j=0; j < (int) s->img_y; ++j) { + for (i=0; i < (int) s->img_x; i += 2) { + int v=stbi__get8(s),v2=0; + if (info.bpp == 4) { + v2 = v & 15; + v >>= 4; + } + out[z++] = pal[v][0]; + out[z++] = pal[v][1]; + out[z++] = pal[v][2]; + if (target == 4) out[z++] = 255; + if (i+1 == (int) s->img_x) break; + v = (info.bpp == 8) ? stbi__get8(s) : v2; + out[z++] = pal[v][0]; + out[z++] = pal[v][1]; + out[z++] = pal[v][2]; + if (target == 4) out[z++] = 255; + } + stbi__skip(s, pad); + } + } + } else { + int rshift=0,gshift=0,bshift=0,ashift=0,rcount=0,gcount=0,bcount=0,acount=0; + int z = 0; + int easy=0; + stbi__skip(s, info.offset - 14 - info.hsz); + if (info.bpp == 24) width = 3 * s->img_x; + else if (info.bpp == 16) width = 2*s->img_x; + else /* bpp = 32 and pad = 0 */ width=0; + pad = (-width) & 3; + if (info.bpp == 24) { + easy = 1; + } else if (info.bpp == 32) { + if (mb == 0xff && mg == 0xff00 && mr == 0x00ff0000 && ma == 0xff000000) + easy = 2; + } + if (!easy) { + if (!mr || !mg || !mb) { STBI_FREE(out); return stbi__errpuc("bad masks", "Corrupt BMP"); } + // right shift amt to put high bit in position #7 + rshift = stbi__high_bit(mr)-7; rcount = stbi__bitcount(mr); + gshift = stbi__high_bit(mg)-7; gcount = stbi__bitcount(mg); + bshift = stbi__high_bit(mb)-7; bcount = stbi__bitcount(mb); + ashift = stbi__high_bit(ma)-7; acount = stbi__bitcount(ma); + } + for (j=0; j < (int) s->img_y; ++j) { + if (easy) { + for (i=0; i < (int) s->img_x; ++i) { + unsigned char a; + out[z+2] = stbi__get8(s); + out[z+1] = stbi__get8(s); + out[z+0] = stbi__get8(s); + z += 3; + a = (easy == 2 ? stbi__get8(s) : 255); + all_a |= a; + if (target == 4) out[z++] = a; + } + } else { + int bpp = info.bpp; + for (i=0; i < (int) s->img_x; ++i) { + stbi__uint32 v = (bpp == 16 ? (stbi__uint32) stbi__get16le(s) : stbi__get32le(s)); + unsigned int a; + out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mr, rshift, rcount)); + out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mg, gshift, gcount)); + out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mb, bshift, bcount)); + a = (ma ? stbi__shiftsigned(v & ma, ashift, acount) : 255); + all_a |= a; + if (target == 4) out[z++] = STBI__BYTECAST(a); + } + } + stbi__skip(s, pad); + } + } + + // if alpha channel is all 0s, replace with all 255s + if (target == 4 && all_a == 0) + for (i=4*s->img_x*s->img_y-1; i >= 0; i -= 4) + out[i] = 255; + + if (flip_vertically) { + stbi_uc t; + for (j=0; j < (int) s->img_y>>1; ++j) { + stbi_uc *p1 = out + j *s->img_x*target; + stbi_uc *p2 = out + (s->img_y-1-j)*s->img_x*target; + for (i=0; i < (int) s->img_x*target; ++i) { + t = p1[i], p1[i] = p2[i], p2[i] = t; + } + } + } + + if (req_comp && req_comp != target) { + out = stbi__convert_format(out, target, req_comp, s->img_x, s->img_y); + if (out == NULL) return out; // stbi__convert_format frees input on failure + } + + *x = s->img_x; + *y = s->img_y; + if (comp) *comp = s->img_n; + return out; +} +#endif + +// Targa Truevision - TGA +// by Jonathan Dummer +#ifndef STBI_NO_TGA +// returns STBI_rgb or whatever, 0 on error +static int stbi__tga_get_comp(int bits_per_pixel, int is_grey, int* is_rgb16) +{ + // only RGB or RGBA (incl. 16bit) or grey allowed + if (is_rgb16) *is_rgb16 = 0; + switch(bits_per_pixel) { + case 8: return STBI_grey; + case 16: if(is_grey) return STBI_grey_alpha; + // fallthrough + case 15: if(is_rgb16) *is_rgb16 = 1; + return STBI_rgb; + case 24: // fallthrough + case 32: return bits_per_pixel/8; + default: return 0; + } +} + +static int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp) +{ + int tga_w, tga_h, tga_comp, tga_image_type, tga_bits_per_pixel, tga_colormap_bpp; + int sz, tga_colormap_type; + stbi__get8(s); // discard Offset + tga_colormap_type = stbi__get8(s); // colormap type + if( tga_colormap_type > 1 ) { + stbi__rewind(s); + return 0; // only RGB or indexed allowed + } + tga_image_type = stbi__get8(s); // image type + if ( tga_colormap_type == 1 ) { // colormapped (paletted) image + if (tga_image_type != 1 && tga_image_type != 9) { + stbi__rewind(s); + return 0; + } + stbi__skip(s,4); // skip index of first colormap entry and number of entries + sz = stbi__get8(s); // check bits per palette color entry + if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) { + stbi__rewind(s); + return 0; + } + stbi__skip(s,4); // skip image x and y origin + tga_colormap_bpp = sz; + } else { // "normal" image w/o colormap - only RGB or grey allowed, +/- RLE + if ( (tga_image_type != 2) && (tga_image_type != 3) && (tga_image_type != 10) && (tga_image_type != 11) ) { + stbi__rewind(s); + return 0; // only RGB or grey allowed, +/- RLE + } + stbi__skip(s,9); // skip colormap specification and image x/y origin + tga_colormap_bpp = 0; + } + tga_w = stbi__get16le(s); + if( tga_w < 1 ) { + stbi__rewind(s); + return 0; // test width + } + tga_h = stbi__get16le(s); + if( tga_h < 1 ) { + stbi__rewind(s); + return 0; // test height + } + tga_bits_per_pixel = stbi__get8(s); // bits per pixel + stbi__get8(s); // ignore alpha bits + if (tga_colormap_bpp != 0) { + if((tga_bits_per_pixel != 8) && (tga_bits_per_pixel != 16)) { + // when using a colormap, tga_bits_per_pixel is the size of the indexes + // I don't think anything but 8 or 16bit indexes makes sense + stbi__rewind(s); + return 0; + } + tga_comp = stbi__tga_get_comp(tga_colormap_bpp, 0, NULL); + } else { + tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3) || (tga_image_type == 11), NULL); + } + if(!tga_comp) { + stbi__rewind(s); + return 0; + } + if (x) *x = tga_w; + if (y) *y = tga_h; + if (comp) *comp = tga_comp; + return 1; // seems to have passed everything +} + +static int stbi__tga_test(stbi__context *s) +{ + int res = 0; + int sz, tga_color_type; + stbi__get8(s); // discard Offset + tga_color_type = stbi__get8(s); // color type + if ( tga_color_type > 1 ) goto errorEnd; // only RGB or indexed allowed + sz = stbi__get8(s); // image type + if ( tga_color_type == 1 ) { // colormapped (paletted) image + if (sz != 1 && sz != 9) goto errorEnd; // colortype 1 demands image type 1 or 9 + stbi__skip(s,4); // skip index of first colormap entry and number of entries + sz = stbi__get8(s); // check bits per palette color entry + if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) goto errorEnd; + stbi__skip(s,4); // skip image x and y origin + } else { // "normal" image w/o colormap + if ( (sz != 2) && (sz != 3) && (sz != 10) && (sz != 11) ) goto errorEnd; // only RGB or grey allowed, +/- RLE + stbi__skip(s,9); // skip colormap specification and image x/y origin + } + if ( stbi__get16le(s) < 1 ) goto errorEnd; // test width + if ( stbi__get16le(s) < 1 ) goto errorEnd; // test height + sz = stbi__get8(s); // bits per pixel + if ( (tga_color_type == 1) && (sz != 8) && (sz != 16) ) goto errorEnd; // for colormapped images, bpp is size of an index + if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) goto errorEnd; + + res = 1; // if we got this far, everything's good and we can return 1 instead of 0 + +errorEnd: + stbi__rewind(s); + return res; +} + +// read 16bit value and convert to 24bit RGB +static void stbi__tga_read_rgb16(stbi__context *s, stbi_uc* out) +{ + stbi__uint16 px = (stbi__uint16)stbi__get16le(s); + stbi__uint16 fiveBitMask = 31; + // we have 3 channels with 5bits each + int r = (px >> 10) & fiveBitMask; + int g = (px >> 5) & fiveBitMask; + int b = px & fiveBitMask; + // Note that this saves the data in RGB(A) order, so it doesn't need to be swapped later + out[0] = (stbi_uc)((r * 255)/31); + out[1] = (stbi_uc)((g * 255)/31); + out[2] = (stbi_uc)((b * 255)/31); + + // some people claim that the most significant bit might be used for alpha + // (possibly if an alpha-bit is set in the "image descriptor byte") + // but that only made 16bit test images completely translucent.. + // so let's treat all 15 and 16bit TGAs as RGB with no alpha. +} + +static void *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + // read in the TGA header stuff + int tga_offset = stbi__get8(s); + int tga_indexed = stbi__get8(s); + int tga_image_type = stbi__get8(s); + int tga_is_RLE = 0; + int tga_palette_start = stbi__get16le(s); + int tga_palette_len = stbi__get16le(s); + int tga_palette_bits = stbi__get8(s); + int tga_x_origin = stbi__get16le(s); + int tga_y_origin = stbi__get16le(s); + int tga_width = stbi__get16le(s); + int tga_height = stbi__get16le(s); + int tga_bits_per_pixel = stbi__get8(s); + int tga_comp, tga_rgb16=0; + int tga_inverted = stbi__get8(s); + // int tga_alpha_bits = tga_inverted & 15; // the 4 lowest bits - unused (useless?) + // image data + unsigned char *tga_data; + unsigned char *tga_palette = NULL; + int i, j; + unsigned char raw_data[4] = {0}; + int RLE_count = 0; + int RLE_repeating = 0; + int read_next_pixel = 1; + STBI_NOTUSED(ri); + + // do a tiny bit of precessing + if ( tga_image_type >= 8 ) + { + tga_image_type -= 8; + tga_is_RLE = 1; + } + tga_inverted = 1 - ((tga_inverted >> 5) & 1); + + // If I'm paletted, then I'll use the number of bits from the palette + if ( tga_indexed ) tga_comp = stbi__tga_get_comp(tga_palette_bits, 0, &tga_rgb16); + else tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3), &tga_rgb16); + + if(!tga_comp) // shouldn't really happen, stbi__tga_test() should have ensured basic consistency + return stbi__errpuc("bad format", "Can't find out TGA pixelformat"); + + // tga info + *x = tga_width; + *y = tga_height; + if (comp) *comp = tga_comp; + + if (!stbi__mad3sizes_valid(tga_width, tga_height, tga_comp, 0)) + return stbi__errpuc("too large", "Corrupt TGA"); + + tga_data = (unsigned char*)stbi__malloc_mad3(tga_width, tga_height, tga_comp, 0); + if (!tga_data) return stbi__errpuc("outofmem", "Out of memory"); + + // skip to the data's starting position (offset usually = 0) + stbi__skip(s, tga_offset ); + + if ( !tga_indexed && !tga_is_RLE && !tga_rgb16 ) { + for (i=0; i < tga_height; ++i) { + int row = tga_inverted ? tga_height -i - 1 : i; + stbi_uc *tga_row = tga_data + row*tga_width*tga_comp; + stbi__getn(s, tga_row, tga_width * tga_comp); + } + } else { + // do I need to load a palette? + if ( tga_indexed) + { + // any data to skip? (offset usually = 0) + stbi__skip(s, tga_palette_start ); + // load the palette + tga_palette = (unsigned char*)stbi__malloc_mad2(tga_palette_len, tga_comp, 0); + if (!tga_palette) { + STBI_FREE(tga_data); + return stbi__errpuc("outofmem", "Out of memory"); + } + if (tga_rgb16) { + stbi_uc *pal_entry = tga_palette; + STBI_ASSERT(tga_comp == STBI_rgb); + for (i=0; i < tga_palette_len; ++i) { + stbi__tga_read_rgb16(s, pal_entry); + pal_entry += tga_comp; + } + } else if (!stbi__getn(s, tga_palette, tga_palette_len * tga_comp)) { + STBI_FREE(tga_data); + STBI_FREE(tga_palette); + return stbi__errpuc("bad palette", "Corrupt TGA"); + } + } + // load the data + for (i=0; i < tga_width * tga_height; ++i) + { + // if I'm in RLE mode, do I need to get a RLE stbi__pngchunk? + if ( tga_is_RLE ) + { + if ( RLE_count == 0 ) + { + // yep, get the next byte as a RLE command + int RLE_cmd = stbi__get8(s); + RLE_count = 1 + (RLE_cmd & 127); + RLE_repeating = RLE_cmd >> 7; + read_next_pixel = 1; + } else if ( !RLE_repeating ) + { + read_next_pixel = 1; + } + } else + { + read_next_pixel = 1; + } + // OK, if I need to read a pixel, do it now + if ( read_next_pixel ) + { + // load however much data we did have + if ( tga_indexed ) + { + // read in index, then perform the lookup + int pal_idx = (tga_bits_per_pixel == 8) ? stbi__get8(s) : stbi__get16le(s); + if ( pal_idx >= tga_palette_len ) { + // invalid index + pal_idx = 0; + } + pal_idx *= tga_comp; + for (j = 0; j < tga_comp; ++j) { + raw_data[j] = tga_palette[pal_idx+j]; + } + } else if(tga_rgb16) { + STBI_ASSERT(tga_comp == STBI_rgb); + stbi__tga_read_rgb16(s, raw_data); + } else { + // read in the data raw + for (j = 0; j < tga_comp; ++j) { + raw_data[j] = stbi__get8(s); + } + } + // clear the reading flag for the next pixel + read_next_pixel = 0; + } // end of reading a pixel + + // copy data + for (j = 0; j < tga_comp; ++j) + tga_data[i*tga_comp+j] = raw_data[j]; + + // in case we're in RLE mode, keep counting down + --RLE_count; + } + // do I need to invert the image? + if ( tga_inverted ) + { + for (j = 0; j*2 < tga_height; ++j) + { + int index1 = j * tga_width * tga_comp; + int index2 = (tga_height - 1 - j) * tga_width * tga_comp; + for (i = tga_width * tga_comp; i > 0; --i) + { + unsigned char temp = tga_data[index1]; + tga_data[index1] = tga_data[index2]; + tga_data[index2] = temp; + ++index1; + ++index2; + } + } + } + // clear my palette, if I had one + if ( tga_palette != NULL ) + { + STBI_FREE( tga_palette ); + } + } + + // swap RGB - if the source data was RGB16, it already is in the right order + if (tga_comp >= 3 && !tga_rgb16) + { + unsigned char* tga_pixel = tga_data; + for (i=0; i < tga_width * tga_height; ++i) + { + unsigned char temp = tga_pixel[0]; + tga_pixel[0] = tga_pixel[2]; + tga_pixel[2] = temp; + tga_pixel += tga_comp; + } + } + + // convert to target component count + if (req_comp && req_comp != tga_comp) + tga_data = stbi__convert_format(tga_data, tga_comp, req_comp, tga_width, tga_height); + + // the things I do to get rid of an error message, and yet keep + // Microsoft's C compilers happy... [8^( + tga_palette_start = tga_palette_len = tga_palette_bits = + tga_x_origin = tga_y_origin = 0; + // OK, done + return tga_data; +} +#endif + +// ************************************************************************************************* +// Photoshop PSD loader -- PD by Thatcher Ulrich, integration by Nicolas Schulz, tweaked by STB + +#ifndef STBI_NO_PSD +static int stbi__psd_test(stbi__context *s) +{ + int r = (stbi__get32be(s) == 0x38425053); + stbi__rewind(s); + return r; +} + +static int stbi__psd_decode_rle(stbi__context *s, stbi_uc *p, int pixelCount) +{ + int count, nleft, len; + + count = 0; + while ((nleft = pixelCount - count) > 0) { + len = stbi__get8(s); + if (len == 128) { + // No-op. + } else if (len < 128) { + // Copy next len+1 bytes literally. + len++; + if (len > nleft) return 0; // corrupt data + count += len; + while (len) { + *p = stbi__get8(s); + p += 4; + len--; + } + } else if (len > 128) { + stbi_uc val; + // Next -len+1 bytes in the dest are replicated from next source byte. + // (Interpret len as a negative 8-bit int.) + len = 257 - len; + if (len > nleft) return 0; // corrupt data + val = stbi__get8(s); + count += len; + while (len) { + *p = val; + p += 4; + len--; + } + } + } + + return 1; +} + +static void *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc) +{ + int pixelCount; + int channelCount, compression; + int channel, i; + int bitdepth; + int w,h; + stbi_uc *out; + STBI_NOTUSED(ri); + + // Check identifier + if (stbi__get32be(s) != 0x38425053) // "8BPS" + return stbi__errpuc("not PSD", "Corrupt PSD image"); + + // Check file type version. + if (stbi__get16be(s) != 1) + return stbi__errpuc("wrong version", "Unsupported version of PSD image"); + + // Skip 6 reserved bytes. + stbi__skip(s, 6 ); + + // Read the number of channels (R, G, B, A, etc). + channelCount = stbi__get16be(s); + if (channelCount < 0 || channelCount > 16) + return stbi__errpuc("wrong channel count", "Unsupported number of channels in PSD image"); + + // Read the rows and columns of the image. + h = stbi__get32be(s); + w = stbi__get32be(s); + + // Make sure the depth is 8 bits. + bitdepth = stbi__get16be(s); + if (bitdepth != 8 && bitdepth != 16) + return stbi__errpuc("unsupported bit depth", "PSD bit depth is not 8 or 16 bit"); + + // Make sure the color mode is RGB. + // Valid options are: + // 0: Bitmap + // 1: Grayscale + // 2: Indexed color + // 3: RGB color + // 4: CMYK color + // 7: Multichannel + // 8: Duotone + // 9: Lab color + if (stbi__get16be(s) != 3) + return stbi__errpuc("wrong color format", "PSD is not in RGB color format"); + + // Skip the Mode Data. (It's the palette for indexed color; other info for other modes.) + stbi__skip(s,stbi__get32be(s) ); + + // Skip the image resources. (resolution, pen tool paths, etc) + stbi__skip(s, stbi__get32be(s) ); + + // Skip the reserved data. + stbi__skip(s, stbi__get32be(s) ); + + // Find out if the data is compressed. + // Known values: + // 0: no compression + // 1: RLE compressed + compression = stbi__get16be(s); + if (compression > 1) + return stbi__errpuc("bad compression", "PSD has an unknown compression format"); + + // Check size + if (!stbi__mad3sizes_valid(4, w, h, 0)) + return stbi__errpuc("too large", "Corrupt PSD"); + + // Create the destination image. + + if (!compression && bitdepth == 16 && bpc == 16) { + out = (stbi_uc *) stbi__malloc_mad3(8, w, h, 0); + ri->bits_per_channel = 16; + } else + out = (stbi_uc *) stbi__malloc(4 * w*h); + + if (!out) return stbi__errpuc("outofmem", "Out of memory"); + pixelCount = w*h; + + // Initialize the data to zero. + //memset( out, 0, pixelCount * 4 ); + + // Finally, the image data. + if (compression) { + // RLE as used by .PSD and .TIFF + // Loop until you get the number of unpacked bytes you are expecting: + // Read the next source byte into n. + // If n is between 0 and 127 inclusive, copy the next n+1 bytes literally. + // Else if n is between -127 and -1 inclusive, copy the next byte -n+1 times. + // Else if n is 128, noop. + // Endloop + + // The RLE-compressed data is preceeded by a 2-byte data count for each row in the data, + // which we're going to just skip. + stbi__skip(s, h * channelCount * 2 ); + + // Read the RLE data by channel. + for (channel = 0; channel < 4; channel++) { + stbi_uc *p; + + p = out+channel; + if (channel >= channelCount) { + // Fill this channel with default data. + for (i = 0; i < pixelCount; i++, p += 4) + *p = (channel == 3 ? 255 : 0); + } else { + // Read the RLE data. + if (!stbi__psd_decode_rle(s, p, pixelCount)) { + STBI_FREE(out); + return stbi__errpuc("corrupt", "bad RLE data"); + } + } + } + + } else { + // We're at the raw image data. It's each channel in order (Red, Green, Blue, Alpha, ...) + // where each channel consists of an 8-bit (or 16-bit) value for each pixel in the image. + + // Read the data by channel. + for (channel = 0; channel < 4; channel++) { + if (channel >= channelCount) { + // Fill this channel with default data. + if (bitdepth == 16 && bpc == 16) { + stbi__uint16 *q = ((stbi__uint16 *) out) + channel; + stbi__uint16 val = channel == 3 ? 65535 : 0; + for (i = 0; i < pixelCount; i++, q += 4) + *q = val; + } else { + stbi_uc *p = out+channel; + stbi_uc val = channel == 3 ? 255 : 0; + for (i = 0; i < pixelCount; i++, p += 4) + *p = val; + } + } else { + if (ri->bits_per_channel == 16) { // output bpc + stbi__uint16 *q = ((stbi__uint16 *) out) + channel; + for (i = 0; i < pixelCount; i++, q += 4) + *q = (stbi__uint16) stbi__get16be(s); + } else { + stbi_uc *p = out+channel; + if (bitdepth == 16) { // input bpc + for (i = 0; i < pixelCount; i++, p += 4) + *p = (stbi_uc) (stbi__get16be(s) >> 8); + } else { + for (i = 0; i < pixelCount; i++, p += 4) + *p = stbi__get8(s); + } + } + } + } + } + + // remove weird white matte from PSD + if (channelCount >= 4) { + if (ri->bits_per_channel == 16) { + for (i=0; i < w*h; ++i) { + stbi__uint16 *pixel = (stbi__uint16 *) out + 4*i; + if (pixel[3] != 0 && pixel[3] != 65535) { + float a = pixel[3] / 65535.0f; + float ra = 1.0f / a; + float inv_a = 65535.0f * (1 - ra); + pixel[0] = (stbi__uint16) (pixel[0]*ra + inv_a); + pixel[1] = (stbi__uint16) (pixel[1]*ra + inv_a); + pixel[2] = (stbi__uint16) (pixel[2]*ra + inv_a); + } + } + } else { + for (i=0; i < w*h; ++i) { + unsigned char *pixel = out + 4*i; + if (pixel[3] != 0 && pixel[3] != 255) { + float a = pixel[3] / 255.0f; + float ra = 1.0f / a; + float inv_a = 255.0f * (1 - ra); + pixel[0] = (unsigned char) (pixel[0]*ra + inv_a); + pixel[1] = (unsigned char) (pixel[1]*ra + inv_a); + pixel[2] = (unsigned char) (pixel[2]*ra + inv_a); + } + } + } + } + + // convert to desired output format + if (req_comp && req_comp != 4) { + if (ri->bits_per_channel == 16) + out = (stbi_uc *) stbi__convert_format16((stbi__uint16 *) out, 4, req_comp, w, h); + else + out = stbi__convert_format(out, 4, req_comp, w, h); + if (out == NULL) return out; // stbi__convert_format frees input on failure + } + + if (comp) *comp = 4; + *y = h; + *x = w; + + return out; +} +#endif + +// ************************************************************************************************* +// Softimage PIC loader +// by Tom Seddon +// +// See http://softimage.wiki.softimage.com/index.php/INFO:_PIC_file_format +// See http://ozviz.wasp.uwa.edu.au/~pbourke/dataformats/softimagepic/ + +#ifndef STBI_NO_PIC +static int stbi__pic_is4(stbi__context *s,const char *str) +{ + int i; + for (i=0; i<4; ++i) + if (stbi__get8(s) != (stbi_uc)str[i]) + return 0; + + return 1; +} + +static int stbi__pic_test_core(stbi__context *s) +{ + int i; + + if (!stbi__pic_is4(s,"\x53\x80\xF6\x34")) + return 0; + + for(i=0;i<84;++i) + stbi__get8(s); + + if (!stbi__pic_is4(s,"PICT")) + return 0; + + return 1; +} + +typedef struct +{ + stbi_uc size,type,channel; +} stbi__pic_packet; + +static stbi_uc *stbi__readval(stbi__context *s, int channel, stbi_uc *dest) +{ + int mask=0x80, i; + + for (i=0; i<4; ++i, mask>>=1) { + if (channel & mask) { + if (stbi__at_eof(s)) return stbi__errpuc("bad file","PIC file too short"); + dest[i]=stbi__get8(s); + } + } + + return dest; +} + +static void stbi__copyval(int channel,stbi_uc *dest,const stbi_uc *src) +{ + int mask=0x80,i; + + for (i=0;i<4; ++i, mask>>=1) + if (channel&mask) + dest[i]=src[i]; +} + +static stbi_uc *stbi__pic_load_core(stbi__context *s,int width,int height,int *comp, stbi_uc *result) +{ + int act_comp=0,num_packets=0,y,chained; + stbi__pic_packet packets[10]; + + // this will (should...) cater for even some bizarre stuff like having data + // for the same channel in multiple packets. + do { + stbi__pic_packet *packet; + + if (num_packets==sizeof(packets)/sizeof(packets[0])) + return stbi__errpuc("bad format","too many packets"); + + packet = &packets[num_packets++]; + + chained = stbi__get8(s); + packet->size = stbi__get8(s); + packet->type = stbi__get8(s); + packet->channel = stbi__get8(s); + + act_comp |= packet->channel; + + if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (reading packets)"); + if (packet->size != 8) return stbi__errpuc("bad format","packet isn't 8bpp"); + } while (chained); + + *comp = (act_comp & 0x10 ? 4 : 3); // has alpha channel? + + for(y=0; ytype) { + default: + return stbi__errpuc("bad format","packet has bad compression type"); + + case 0: {//uncompressed + int x; + + for(x=0;xchannel,dest)) + return 0; + break; + } + + case 1://Pure RLE + { + int left=width, i; + + while (left>0) { + stbi_uc count,value[4]; + + count=stbi__get8(s); + if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (pure read count)"); + + if (count > left) + count = (stbi_uc) left; + + if (!stbi__readval(s,packet->channel,value)) return 0; + + for(i=0; ichannel,dest,value); + left -= count; + } + } + break; + + case 2: {//Mixed RLE + int left=width; + while (left>0) { + int count = stbi__get8(s), i; + if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (mixed read count)"); + + if (count >= 128) { // Repeated + stbi_uc value[4]; + + if (count==128) + count = stbi__get16be(s); + else + count -= 127; + if (count > left) + return stbi__errpuc("bad file","scanline overrun"); + + if (!stbi__readval(s,packet->channel,value)) + return 0; + + for(i=0;ichannel,dest,value); + } else { // Raw + ++count; + if (count>left) return stbi__errpuc("bad file","scanline overrun"); + + for(i=0;ichannel,dest)) + return 0; + } + left-=count; + } + break; + } + } + } + } + + return result; +} + +static void *stbi__pic_load(stbi__context *s,int *px,int *py,int *comp,int req_comp, stbi__result_info *ri) +{ + stbi_uc *result; + int i, x,y, internal_comp; + STBI_NOTUSED(ri); + + if (!comp) comp = &internal_comp; + + for (i=0; i<92; ++i) + stbi__get8(s); + + x = stbi__get16be(s); + y = stbi__get16be(s); + if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (pic header)"); + if (!stbi__mad3sizes_valid(x, y, 4, 0)) return stbi__errpuc("too large", "PIC image too large to decode"); + + stbi__get32be(s); //skip `ratio' + stbi__get16be(s); //skip `fields' + stbi__get16be(s); //skip `pad' + + // intermediate buffer is RGBA + result = (stbi_uc *) stbi__malloc_mad3(x, y, 4, 0); + memset(result, 0xff, x*y*4); + + if (!stbi__pic_load_core(s,x,y,comp, result)) { + STBI_FREE(result); + result=0; + } + *px = x; + *py = y; + if (req_comp == 0) req_comp = *comp; + result=stbi__convert_format(result,4,req_comp,x,y); + + return result; +} + +static int stbi__pic_test(stbi__context *s) +{ + int r = stbi__pic_test_core(s); + stbi__rewind(s); + return r; +} +#endif + +// ************************************************************************************************* +// GIF loader -- public domain by Jean-Marc Lienher -- simplified/shrunk by stb + +#ifndef STBI_NO_GIF +typedef struct +{ + stbi__int16 prefix; + stbi_uc first; + stbi_uc suffix; +} stbi__gif_lzw; + +typedef struct +{ + int w,h; + stbi_uc *out; // output buffer (always 4 components) + stbi_uc *background; // The current "background" as far as a gif is concerned + stbi_uc *history; + int flags, bgindex, ratio, transparent, eflags; + stbi_uc pal[256][4]; + stbi_uc lpal[256][4]; + stbi__gif_lzw codes[8192]; + stbi_uc *color_table; + int parse, step; + int lflags; + int start_x, start_y; + int max_x, max_y; + int cur_x, cur_y; + int line_size; + int delay; +} stbi__gif; + +static int stbi__gif_test_raw(stbi__context *s) +{ + int sz; + if (stbi__get8(s) != 'G' || stbi__get8(s) != 'I' || stbi__get8(s) != 'F' || stbi__get8(s) != '8') return 0; + sz = stbi__get8(s); + if (sz != '9' && sz != '7') return 0; + if (stbi__get8(s) != 'a') return 0; + return 1; +} + +static int stbi__gif_test(stbi__context *s) +{ + int r = stbi__gif_test_raw(s); + stbi__rewind(s); + return r; +} + +static void stbi__gif_parse_colortable(stbi__context *s, stbi_uc pal[256][4], int num_entries, int transp) +{ + int i; + for (i=0; i < num_entries; ++i) { + pal[i][2] = stbi__get8(s); + pal[i][1] = stbi__get8(s); + pal[i][0] = stbi__get8(s); + pal[i][3] = transp == i ? 0 : 255; + } +} + +static int stbi__gif_header(stbi__context *s, stbi__gif *g, int *comp, int is_info) +{ + stbi_uc version; + if (stbi__get8(s) != 'G' || stbi__get8(s) != 'I' || stbi__get8(s) != 'F' || stbi__get8(s) != '8') + return stbi__err("not GIF", "Corrupt GIF"); + + version = stbi__get8(s); + if (version != '7' && version != '9') return stbi__err("not GIF", "Corrupt GIF"); + if (stbi__get8(s) != 'a') return stbi__err("not GIF", "Corrupt GIF"); + + stbi__g_failure_reason = ""; + g->w = stbi__get16le(s); + g->h = stbi__get16le(s); + g->flags = stbi__get8(s); + g->bgindex = stbi__get8(s); + g->ratio = stbi__get8(s); + g->transparent = -1; + + if (comp != 0) *comp = 4; // can't actually tell whether it's 3 or 4 until we parse the comments + + if (is_info) return 1; + + if (g->flags & 0x80) + stbi__gif_parse_colortable(s,g->pal, 2 << (g->flags & 7), -1); + + return 1; +} + +static int stbi__gif_info_raw(stbi__context *s, int *x, int *y, int *comp) +{ + stbi__gif* g = (stbi__gif*) stbi__malloc(sizeof(stbi__gif)); + if (!stbi__gif_header(s, g, comp, 1)) { + STBI_FREE(g); + stbi__rewind( s ); + return 0; + } + if (x) *x = g->w; + if (y) *y = g->h; + STBI_FREE(g); + return 1; +} + +static void stbi__out_gif_code(stbi__gif *g, stbi__uint16 code) +{ + stbi_uc *p, *c; + int idx; + + // recurse to decode the prefixes, since the linked-list is backwards, + // and working backwards through an interleaved image would be nasty + if (g->codes[code].prefix >= 0) + stbi__out_gif_code(g, g->codes[code].prefix); + + if (g->cur_y >= g->max_y) return; + + idx = g->cur_x + g->cur_y; + p = &g->out[idx]; + g->history[idx / 4] = 1; + + c = &g->color_table[g->codes[code].suffix * 4]; + if (c[3] > 128) { // don't render transparent pixels; + p[0] = c[2]; + p[1] = c[1]; + p[2] = c[0]; + p[3] = c[3]; + } + g->cur_x += 4; + + if (g->cur_x >= g->max_x) { + g->cur_x = g->start_x; + g->cur_y += g->step; + + while (g->cur_y >= g->max_y && g->parse > 0) { + g->step = (1 << g->parse) * g->line_size; + g->cur_y = g->start_y + (g->step >> 1); + --g->parse; + } + } +} + +static stbi_uc *stbi__process_gif_raster(stbi__context *s, stbi__gif *g) +{ + stbi_uc lzw_cs; + stbi__int32 len, init_code; + stbi__uint32 first; + stbi__int32 codesize, codemask, avail, oldcode, bits, valid_bits, clear; + stbi__gif_lzw *p; + + lzw_cs = stbi__get8(s); + if (lzw_cs > 12) return NULL; + clear = 1 << lzw_cs; + first = 1; + codesize = lzw_cs + 1; + codemask = (1 << codesize) - 1; + bits = 0; + valid_bits = 0; + for (init_code = 0; init_code < clear; init_code++) { + g->codes[init_code].prefix = -1; + g->codes[init_code].first = (stbi_uc) init_code; + g->codes[init_code].suffix = (stbi_uc) init_code; + } + + // support no starting clear code + avail = clear+2; + oldcode = -1; + + len = 0; + for(;;) { + if (valid_bits < codesize) { + if (len == 0) { + len = stbi__get8(s); // start new block + if (len == 0) + return g->out; + } + --len; + bits |= (stbi__int32) stbi__get8(s) << valid_bits; + valid_bits += 8; + } else { + stbi__int32 code = bits & codemask; + bits >>= codesize; + valid_bits -= codesize; + // @OPTIMIZE: is there some way we can accelerate the non-clear path? + if (code == clear) { // clear code + codesize = lzw_cs + 1; + codemask = (1 << codesize) - 1; + avail = clear + 2; + oldcode = -1; + first = 0; + } else if (code == clear + 1) { // end of stream code + stbi__skip(s, len); + while ((len = stbi__get8(s)) > 0) + stbi__skip(s,len); + return g->out; + } else if (code <= avail) { + if (first) { + return stbi__errpuc("no clear code", "Corrupt GIF"); + } + + if (oldcode >= 0) { + p = &g->codes[avail++]; + if (avail > 8192) { + return stbi__errpuc("too many codes", "Corrupt GIF"); + } + + p->prefix = (stbi__int16) oldcode; + p->first = g->codes[oldcode].first; + p->suffix = (code == avail) ? p->first : g->codes[code].first; + } else if (code == avail) + return stbi__errpuc("illegal code in raster", "Corrupt GIF"); + + stbi__out_gif_code(g, (stbi__uint16) code); + + if ((avail & codemask) == 0 && avail <= 0x0FFF) { + codesize++; + codemask = (1 << codesize) - 1; + } + + oldcode = code; + } else { + return stbi__errpuc("illegal code in raster", "Corrupt GIF"); + } + } + } +} + +// this function is designed to support animated gifs, although stb_image doesn't support it +// two back is the image from two frames ago, used for a very specific disposal format +static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, int req_comp, stbi_uc *two_back) +{ + int dispose; + int first_frame; + int pi; + int pcount; + + // on first frame, any non-written pixels get the background colour (non-transparent) + first_frame = 0; + if (g->out == 0) { + if (!stbi__gif_header(s, g, comp,0)) return 0; // stbi__g_failure_reason set by stbi__gif_header + g->out = (stbi_uc *) stbi__malloc(4 * g->w * g->h); + g->background = (stbi_uc *) stbi__malloc(4 * g->w * g->h); + g->history = (stbi_uc *) stbi__malloc(g->w * g->h); + if (g->out == 0) return stbi__errpuc("outofmem", "Out of memory"); + + // image is treated as "tranparent" at the start - ie, nothing overwrites the current background; + // background colour is only used for pixels that are not rendered first frame, after that "background" + // color refers to teh color that was there the previous frame. + memset( g->out, 0x00, 4 * g->w * g->h ); + memset( g->background, 0x00, 4 * g->w * g->h ); // state of the background (starts transparent) + memset( g->history, 0x00, g->w * g->h ); // pixels that were affected previous frame + first_frame = 1; + } else { + // second frame - how do we dispoase of the previous one? + dispose = (g->eflags & 0x1C) >> 2; + pcount = g->w * g->h; + + if ((dispose == 3) && (two_back == 0)) { + dispose = 2; // if I don't have an image to revert back to, default to the old background + } + + if (dispose == 3) { // use previous graphic + for (pi = 0; pi < pcount; ++pi) { + if (g->history[pi]) { + memcpy( &g->out[pi * 4], &two_back[pi * 4], 4 ); + } + } + } else if (dispose == 2) { + // restore what was changed last frame to background before that frame; + for (pi = 0; pi < pcount; ++pi) { + if (g->history[pi]) { + memcpy( &g->out[pi * 4], &g->background[pi * 4], 4 ); + } + } + } else { + // This is a non-disposal case eithe way, so just + // leave the pixels as is, and they will become the new background + // 1: do not dispose + // 0: not specified. + } + + // background is what out is after the undoing of the previou frame; + memcpy( g->background, g->out, 4 * g->w * g->h ); + } + + // clear my history; + memset( g->history, 0x00, g->w * g->h ); // pixels that were affected previous frame + + for (;;) { + int tag = stbi__get8(s); + switch (tag) { + case 0x2C: /* Image Descriptor */ + { + stbi__int32 x, y, w, h; + stbi_uc *o; + + x = stbi__get16le(s); + y = stbi__get16le(s); + w = stbi__get16le(s); + h = stbi__get16le(s); + if (((x + w) > (g->w)) || ((y + h) > (g->h))) + return stbi__errpuc("bad Image Descriptor", "Corrupt GIF"); + + g->line_size = g->w * 4; + g->start_x = x * 4; + g->start_y = y * g->line_size; + g->max_x = g->start_x + w * 4; + g->max_y = g->start_y + h * g->line_size; + g->cur_x = g->start_x; + g->cur_y = g->start_y; + + g->lflags = stbi__get8(s); + + if (g->lflags & 0x40) { + g->step = 8 * g->line_size; // first interlaced spacing + g->parse = 3; + } else { + g->step = g->line_size; + g->parse = 0; + } + + if (g->lflags & 0x80) { + stbi__gif_parse_colortable(s,g->lpal, 2 << (g->lflags & 7), g->eflags & 0x01 ? g->transparent : -1); + g->color_table = (stbi_uc *) g->lpal; + } else if (g->flags & 0x80) { + g->color_table = (stbi_uc *) g->pal; + } else + return stbi__errpuc("missing color table", "Corrupt GIF"); + + o = stbi__process_gif_raster(s, g); + if (o == NULL) return NULL; + + // if this was the first frame, + pcount = g->w * g->h; + if (first_frame && (g->bgindex > 0)) { + // if first frame, any pixel not drawn to gets the background color + for (pi = 0; pi < pcount; ++pi) { + if (g->history[pi] == 0) { + g->pal[g->bgindex][3] = 255; // just in case it was made transparent, undo that; It will be reset next frame if need be; + memcpy( &g->out[pi * 4], &g->pal[g->bgindex], 4 ); + } + } + } + + return o; + } + + case 0x21: // Comment Extension. + { + int len; + int ext = stbi__get8(s); + if (ext == 0xF9) { // Graphic Control Extension. + len = stbi__get8(s); + if (len == 4) { + g->eflags = stbi__get8(s); + g->delay = 10 * stbi__get16le(s); // delay - 1/100th of a second, saving as 1/1000ths. + + // unset old transparent + if (g->transparent >= 0) { + g->pal[g->transparent][3] = 255; + } + if (g->eflags & 0x01) { + g->transparent = stbi__get8(s); + if (g->transparent >= 0) { + g->pal[g->transparent][3] = 0; + } + } else { + // don't need transparent + stbi__skip(s, 1); + g->transparent = -1; + } + } else { + stbi__skip(s, len); + break; + } + } + while ((len = stbi__get8(s)) != 0) { + stbi__skip(s, len); + } + break; + } + + case 0x3B: // gif stream termination code + return (stbi_uc *) s; // using '1' causes warning on some compilers + + default: + return stbi__errpuc("unknown code", "Corrupt GIF"); + } + } +} + +static void *stbi__load_gif_main(stbi__context *s, int **delays, int *x, int *y, int *z, int *comp, int req_comp) +{ + if (stbi__gif_test(s)) { + int layers = 0; + stbi_uc *u = 0; + stbi_uc *out = 0; + stbi_uc *two_back = 0; + stbi__gif g; + int stride; + memset(&g, 0, sizeof(g)); + if (delays) { + *delays = 0; + } + + do { + u = stbi__gif_load_next(s, &g, comp, req_comp, two_back); + if (u == (stbi_uc *) s) u = 0; // end of animated gif marker + + if (u) { + *x = g.w; + *y = g.h; + ++layers; + stride = g.w * g.h * 4; + + if (out) { + out = (stbi_uc*) STBI_REALLOC( out, layers * stride ); + if (delays) { + *delays = (int*) STBI_REALLOC( *delays, sizeof(int) * layers ); + } + } else { + out = (stbi_uc*)stbi__malloc( layers * stride ); + if (delays) { + *delays = (int*) stbi__malloc( layers * sizeof(int) ); + } + } + memcpy( out + ((layers - 1) * stride), u, stride ); + if (layers >= 2) { + two_back = out - 2 * stride; + } + + if (delays) { + (*delays)[layers - 1U] = g.delay; + } + } + } while (u != 0); + + // free temp buffer; + STBI_FREE(g.out); + STBI_FREE(g.history); + STBI_FREE(g.background); + + // do the final conversion after loading everything; + if (req_comp && req_comp != 4) + out = stbi__convert_format(out, 4, req_comp, layers * g.w, g.h); + + *z = layers; + return out; + } else { + return stbi__errpuc("not GIF", "Image was not as a gif type."); + } +} + +static void *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + stbi_uc *u = 0; + stbi__gif g; + memset(&g, 0, sizeof(g)); + + u = stbi__gif_load_next(s, &g, comp, req_comp, 0); + if (u == (stbi_uc *) s) u = 0; // end of animated gif marker + if (u) { + *x = g.w; + *y = g.h; + + // moved conversion to after successful load so that the same + // can be done for multiple frames. + if (req_comp && req_comp != 4) + u = stbi__convert_format(u, 4, req_comp, g.w, g.h); + } + + // free buffers needed for multiple frame loading; + STBI_FREE(g.history); + STBI_FREE(g.background); + + return u; +} + +static int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp) +{ + return stbi__gif_info_raw(s,x,y,comp); +} +#endif + +// ************************************************************************************************* +// Radiance RGBE HDR loader +// originally by Nicolas Schulz +#ifndef STBI_NO_HDR +static int stbi__hdr_test_core(stbi__context *s, const char *signature) +{ + int i; + for (i=0; signature[i]; ++i) + if (stbi__get8(s) != signature[i]) + return 0; + stbi__rewind(s); + return 1; +} + +static int stbi__hdr_test(stbi__context* s) +{ + int r = stbi__hdr_test_core(s, "#?RADIANCE\n"); + stbi__rewind(s); + if(!r) { + r = stbi__hdr_test_core(s, "#?RGBE\n"); + stbi__rewind(s); + } + return r; +} + +#define STBI__HDR_BUFLEN 1024 +static char *stbi__hdr_gettoken(stbi__context *z, char *buffer) +{ + int len=0; + char c = '\0'; + + c = (char) stbi__get8(z); + + while (!stbi__at_eof(z) && c != '\n') { + buffer[len++] = c; + if (len == STBI__HDR_BUFLEN-1) { + // flush to end of line + while (!stbi__at_eof(z) && stbi__get8(z) != '\n') + ; + break; + } + c = (char) stbi__get8(z); + } + + buffer[len] = 0; + return buffer; +} + +static void stbi__hdr_convert(float *output, stbi_uc *input, int req_comp) +{ + if ( input[3] != 0 ) { + float f1; + // Exponent + f1 = (float) ldexp(1.0f, input[3] - (int)(128 + 8)); + if (req_comp <= 2) + output[0] = (input[0] + input[1] + input[2]) * f1 / 3; + else { + output[0] = input[0] * f1; + output[1] = input[1] * f1; + output[2] = input[2] * f1; + } + if (req_comp == 2) output[1] = 1; + if (req_comp == 4) output[3] = 1; + } else { + switch (req_comp) { + case 4: output[3] = 1; /* fallthrough */ + case 3: output[0] = output[1] = output[2] = 0; + break; + case 2: output[1] = 1; /* fallthrough */ + case 1: output[0] = 0; + break; + } + } +} + +static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + char buffer[STBI__HDR_BUFLEN]; + char *token; + int valid = 0; + int width, height; + stbi_uc *scanline; + float *hdr_data; + int len; + unsigned char count, value; + int i, j, k, c1,c2, z; + const char *headerToken; + STBI_NOTUSED(ri); + + // Check identifier + headerToken = stbi__hdr_gettoken(s,buffer); + if (strcmp(headerToken, "#?RADIANCE") != 0 && strcmp(headerToken, "#?RGBE") != 0) + return stbi__errpf("not HDR", "Corrupt HDR image"); + + // Parse header + for(;;) { + token = stbi__hdr_gettoken(s,buffer); + if (token[0] == 0) break; + if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) valid = 1; + } + + if (!valid) return stbi__errpf("unsupported format", "Unsupported HDR format"); + + // Parse width and height + // can't use sscanf() if we're not using stdio! + token = stbi__hdr_gettoken(s,buffer); + if (strncmp(token, "-Y ", 3)) return stbi__errpf("unsupported data layout", "Unsupported HDR format"); + token += 3; + height = (int) strtol(token, &token, 10); + while (*token == ' ') ++token; + if (strncmp(token, "+X ", 3)) return stbi__errpf("unsupported data layout", "Unsupported HDR format"); + token += 3; + width = (int) strtol(token, NULL, 10); + + *x = width; + *y = height; + + if (comp) *comp = 3; + if (req_comp == 0) req_comp = 3; + + if (!stbi__mad4sizes_valid(width, height, req_comp, sizeof(float), 0)) + return stbi__errpf("too large", "HDR image is too large"); + + // Read data + hdr_data = (float *) stbi__malloc_mad4(width, height, req_comp, sizeof(float), 0); + if (!hdr_data) + return stbi__errpf("outofmem", "Out of memory"); + + // Load image data + // image data is stored as some number of sca + if ( width < 8 || width >= 32768) { + // Read flat data + for (j=0; j < height; ++j) { + for (i=0; i < width; ++i) { + stbi_uc rgbe[4]; + main_decode_loop: + stbi__getn(s, rgbe, 4); + stbi__hdr_convert(hdr_data + j * width * req_comp + i * req_comp, rgbe, req_comp); + } + } + } else { + // Read RLE-encoded data + scanline = NULL; + + for (j = 0; j < height; ++j) { + c1 = stbi__get8(s); + c2 = stbi__get8(s); + len = stbi__get8(s); + if (c1 != 2 || c2 != 2 || (len & 0x80)) { + // not run-length encoded, so we have to actually use THIS data as a decoded + // pixel (note this can't be a valid pixel--one of RGB must be >= 128) + stbi_uc rgbe[4]; + rgbe[0] = (stbi_uc) c1; + rgbe[1] = (stbi_uc) c2; + rgbe[2] = (stbi_uc) len; + rgbe[3] = (stbi_uc) stbi__get8(s); + stbi__hdr_convert(hdr_data, rgbe, req_comp); + i = 1; + j = 0; + STBI_FREE(scanline); + goto main_decode_loop; // yes, this makes no sense + } + len <<= 8; + len |= stbi__get8(s); + if (len != width) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("invalid decoded scanline length", "corrupt HDR"); } + if (scanline == NULL) { + scanline = (stbi_uc *) stbi__malloc_mad2(width, 4, 0); + if (!scanline) { + STBI_FREE(hdr_data); + return stbi__errpf("outofmem", "Out of memory"); + } + } + + for (k = 0; k < 4; ++k) { + int nleft; + i = 0; + while ((nleft = width - i) > 0) { + count = stbi__get8(s); + if (count > 128) { + // Run + value = stbi__get8(s); + count -= 128; + if (count > nleft) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("corrupt", "bad RLE data in HDR"); } + for (z = 0; z < count; ++z) + scanline[i++ * 4 + k] = value; + } else { + // Dump + if (count > nleft) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("corrupt", "bad RLE data in HDR"); } + for (z = 0; z < count; ++z) + scanline[i++ * 4 + k] = stbi__get8(s); + } + } + } + for (i=0; i < width; ++i) + stbi__hdr_convert(hdr_data+(j*width + i)*req_comp, scanline + i*4, req_comp); + } + if (scanline) + STBI_FREE(scanline); + } + + return hdr_data; +} + +static int stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp) +{ + char buffer[STBI__HDR_BUFLEN]; + char *token; + int valid = 0; + int dummy; + + if (!x) x = &dummy; + if (!y) y = &dummy; + if (!comp) comp = &dummy; + + if (stbi__hdr_test(s) == 0) { + stbi__rewind( s ); + return 0; + } + + for(;;) { + token = stbi__hdr_gettoken(s,buffer); + if (token[0] == 0) break; + if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) valid = 1; + } + + if (!valid) { + stbi__rewind( s ); + return 0; + } + token = stbi__hdr_gettoken(s,buffer); + if (strncmp(token, "-Y ", 3)) { + stbi__rewind( s ); + return 0; + } + token += 3; + *y = (int) strtol(token, &token, 10); + while (*token == ' ') ++token; + if (strncmp(token, "+X ", 3)) { + stbi__rewind( s ); + return 0; + } + token += 3; + *x = (int) strtol(token, NULL, 10); + *comp = 3; + return 1; +} +#endif // STBI_NO_HDR + +#ifndef STBI_NO_BMP +static int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp) +{ + void *p; + stbi__bmp_data info; + + info.all_a = 255; + p = stbi__bmp_parse_header(s, &info); + stbi__rewind( s ); + if (p == NULL) + return 0; + if (x) *x = s->img_x; + if (y) *y = s->img_y; + if (comp) *comp = info.ma ? 4 : 3; + return 1; +} +#endif + +#ifndef STBI_NO_PSD +static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp) +{ + int channelCount, dummy, depth; + if (!x) x = &dummy; + if (!y) y = &dummy; + if (!comp) comp = &dummy; + if (stbi__get32be(s) != 0x38425053) { + stbi__rewind( s ); + return 0; + } + if (stbi__get16be(s) != 1) { + stbi__rewind( s ); + return 0; + } + stbi__skip(s, 6); + channelCount = stbi__get16be(s); + if (channelCount < 0 || channelCount > 16) { + stbi__rewind( s ); + return 0; + } + *y = stbi__get32be(s); + *x = stbi__get32be(s); + depth = stbi__get16be(s); + if (depth != 8 && depth != 16) { + stbi__rewind( s ); + return 0; + } + if (stbi__get16be(s) != 3) { + stbi__rewind( s ); + return 0; + } + *comp = 4; + return 1; +} + +static int stbi__psd_is16(stbi__context *s) +{ + int channelCount, depth; + if (stbi__get32be(s) != 0x38425053) { + stbi__rewind( s ); + return 0; + } + if (stbi__get16be(s) != 1) { + stbi__rewind( s ); + return 0; + } + stbi__skip(s, 6); + channelCount = stbi__get16be(s); + if (channelCount < 0 || channelCount > 16) { + stbi__rewind( s ); + return 0; + } + (void) stbi__get32be(s); + (void) stbi__get32be(s); + depth = stbi__get16be(s); + if (depth != 16) { + stbi__rewind( s ); + return 0; + } + return 1; +} +#endif + +#ifndef STBI_NO_PIC +static int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp) +{ + int act_comp=0,num_packets=0,chained,dummy; + stbi__pic_packet packets[10]; + + if (!x) x = &dummy; + if (!y) y = &dummy; + if (!comp) comp = &dummy; + + if (!stbi__pic_is4(s,"\x53\x80\xF6\x34")) { + stbi__rewind(s); + return 0; + } + + stbi__skip(s, 88); + + *x = stbi__get16be(s); + *y = stbi__get16be(s); + if (stbi__at_eof(s)) { + stbi__rewind( s); + return 0; + } + if ( (*x) != 0 && (1 << 28) / (*x) < (*y)) { + stbi__rewind( s ); + return 0; + } + + stbi__skip(s, 8); + + do { + stbi__pic_packet *packet; + + if (num_packets==sizeof(packets)/sizeof(packets[0])) + return 0; + + packet = &packets[num_packets++]; + chained = stbi__get8(s); + packet->size = stbi__get8(s); + packet->type = stbi__get8(s); + packet->channel = stbi__get8(s); + act_comp |= packet->channel; + + if (stbi__at_eof(s)) { + stbi__rewind( s ); + return 0; + } + if (packet->size != 8) { + stbi__rewind( s ); + return 0; + } + } while (chained); + + *comp = (act_comp & 0x10 ? 4 : 3); + + return 1; +} +#endif + +// ************************************************************************************************* +// Portable Gray Map and Portable Pixel Map loader +// by Ken Miller +// +// PGM: http://netpbm.sourceforge.net/doc/pgm.html +// PPM: http://netpbm.sourceforge.net/doc/ppm.html +// +// Known limitations: +// Does not support comments in the header section +// Does not support ASCII image data (formats P2 and P3) +// Does not support 16-bit-per-channel + +#ifndef STBI_NO_PNM + +static int stbi__pnm_test(stbi__context *s) +{ + char p, t; + p = (char) stbi__get8(s); + t = (char) stbi__get8(s); + if (p != 'P' || (t != '5' && t != '6')) { + stbi__rewind( s ); + return 0; + } + return 1; +} + +static void *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + stbi_uc *out; + STBI_NOTUSED(ri); + + if (!stbi__pnm_info(s, (int *)&s->img_x, (int *)&s->img_y, (int *)&s->img_n)) + return 0; + + *x = s->img_x; + *y = s->img_y; + if (comp) *comp = s->img_n; + + if (!stbi__mad3sizes_valid(s->img_n, s->img_x, s->img_y, 0)) + return stbi__errpuc("too large", "PNM too large"); + + out = (stbi_uc *) stbi__malloc_mad3(s->img_n, s->img_x, s->img_y, 0); + if (!out) return stbi__errpuc("outofmem", "Out of memory"); + stbi__getn(s, out, s->img_n * s->img_x * s->img_y); + + if (req_comp && req_comp != s->img_n) { + out = stbi__convert_format(out, s->img_n, req_comp, s->img_x, s->img_y); + if (out == NULL) return out; // stbi__convert_format frees input on failure + } + return out; +} + +static int stbi__pnm_isspace(char c) +{ + return c == ' ' || c == '\t' || c == '\n' || c == '\v' || c == '\f' || c == '\r'; +} + +static void stbi__pnm_skip_whitespace(stbi__context *s, char *c) +{ + for (;;) { + while (!stbi__at_eof(s) && stbi__pnm_isspace(*c)) + *c = (char) stbi__get8(s); + + if (stbi__at_eof(s) || *c != '#') + break; + + while (!stbi__at_eof(s) && *c != '\n' && *c != '\r' ) + *c = (char) stbi__get8(s); + } +} + +static int stbi__pnm_isdigit(char c) +{ + return c >= '0' && c <= '9'; +} + +static int stbi__pnm_getinteger(stbi__context *s, char *c) +{ + int value = 0; + + while (!stbi__at_eof(s) && stbi__pnm_isdigit(*c)) { + value = value*10 + (*c - '0'); + *c = (char) stbi__get8(s); + } + + return value; +} + +static int stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp) +{ + int maxv, dummy; + char c, p, t; + + if (!x) x = &dummy; + if (!y) y = &dummy; + if (!comp) comp = &dummy; + + stbi__rewind(s); + + // Get identifier + p = (char) stbi__get8(s); + t = (char) stbi__get8(s); + if (p != 'P' || (t != '5' && t != '6')) { + stbi__rewind(s); + return 0; + } + + *comp = (t == '6') ? 3 : 1; // '5' is 1-component .pgm; '6' is 3-component .ppm + + c = (char) stbi__get8(s); + stbi__pnm_skip_whitespace(s, &c); + + *x = stbi__pnm_getinteger(s, &c); // read width + stbi__pnm_skip_whitespace(s, &c); + + *y = stbi__pnm_getinteger(s, &c); // read height + stbi__pnm_skip_whitespace(s, &c); + + maxv = stbi__pnm_getinteger(s, &c); // read max value + + if (maxv > 255) + return stbi__err("max value > 255", "PPM image not 8-bit"); + else + return 1; +} +#endif + +static int stbi__info_main(stbi__context *s, int *x, int *y, int *comp) +{ + #ifndef STBI_NO_JPEG + if (stbi__jpeg_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_PNG + if (stbi__png_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_GIF + if (stbi__gif_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_BMP + if (stbi__bmp_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_PSD + if (stbi__psd_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_PIC + if (stbi__pic_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_PNM + if (stbi__pnm_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_HDR + if (stbi__hdr_info(s, x, y, comp)) return 1; + #endif + + // test tga last because it's a crappy test! + #ifndef STBI_NO_TGA + if (stbi__tga_info(s, x, y, comp)) + return 1; + #endif + return stbi__err("unknown image type", "Image not of any known type, or corrupt"); +} + +static int stbi__is_16_main(stbi__context *s) +{ + #ifndef STBI_NO_PNG + if (stbi__png_is16(s)) return 1; + #endif + + #ifndef STBI_NO_PSD + if (stbi__psd_is16(s)) return 1; + #endif + + return 0; +} + +#ifndef STBI_NO_STDIO +STBIDEF int stbi_info(char const *filename, int *x, int *y, int *comp) +{ + FILE *f = stbi__fopen(filename, "rb"); + int result; + if (!f) return stbi__err("can't fopen", "Unable to open file"); + result = stbi_info_from_file(f, x, y, comp); + fclose(f); + return result; +} + +STBIDEF int stbi_info_from_file(FILE *f, int *x, int *y, int *comp) +{ + int r; + stbi__context s; + long pos = ftell(f); + stbi__start_file(&s, f); + r = stbi__info_main(&s,x,y,comp); + fseek(f,pos,SEEK_SET); + return r; +} + +STBIDEF int stbi_is_16_bit(char const *filename) +{ + FILE *f = stbi__fopen(filename, "rb"); + int result; + if (!f) return stbi__err("can't fopen", "Unable to open file"); + result = stbi_is_16_bit_from_file(f); + fclose(f); + return result; +} + +STBIDEF int stbi_is_16_bit_from_file(FILE *f) +{ + int r; + stbi__context s; + long pos = ftell(f); + stbi__start_file(&s, f); + r = stbi__is_16_main(&s); + fseek(f,pos,SEEK_SET); + return r; +} +#endif // !STBI_NO_STDIO + +STBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp) +{ + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__info_main(&s,x,y,comp); +} + +STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *c, void *user, int *x, int *y, int *comp) +{ + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *) c, user); + return stbi__info_main(&s,x,y,comp); +} + +STBIDEF int stbi_is_16_bit_from_memory(stbi_uc const *buffer, int len) +{ + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__is_16_main(&s); +} + +STBIDEF int stbi_is_16_bit_from_callbacks(stbi_io_callbacks const *c, void *user) +{ + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *) c, user); + return stbi__is_16_main(&s); +} + +#endif // STB_IMAGE_IMPLEMENTATION + +/* + revision history: + 2.19 (2018-02-11) fix warning + 2.18 (2018-01-30) fix warnings + 2.17 (2018-01-29) change sbti__shiftsigned to avoid clang -O2 bug + 1-bit BMP + *_is_16_bit api + avoid warnings + 2.16 (2017-07-23) all functions have 16-bit variants; + STBI_NO_STDIO works again; + compilation fixes; + fix rounding in unpremultiply; + optimize vertical flip; + disable raw_len validation; + documentation fixes + 2.15 (2017-03-18) fix png-1,2,4 bug; now all Imagenet JPGs decode; + warning fixes; disable run-time SSE detection on gcc; + uniform handling of optional "return" values; + thread-safe initialization of zlib tables + 2.14 (2017-03-03) remove deprecated STBI_JPEG_OLD; fixes for Imagenet JPGs + 2.13 (2016-11-29) add 16-bit API, only supported for PNG right now + 2.12 (2016-04-02) fix typo in 2.11 PSD fix that caused crashes + 2.11 (2016-04-02) allocate large structures on the stack + remove white matting for transparent PSD + fix reported channel count for PNG & BMP + re-enable SSE2 in non-gcc 64-bit + support RGB-formatted JPEG + read 16-bit PNGs (only as 8-bit) + 2.10 (2016-01-22) avoid warning introduced in 2.09 by STBI_REALLOC_SIZED + 2.09 (2016-01-16) allow comments in PNM files + 16-bit-per-pixel TGA (not bit-per-component) + info() for TGA could break due to .hdr handling + info() for BMP to shares code instead of sloppy parse + can use STBI_REALLOC_SIZED if allocator doesn't support realloc + code cleanup + 2.08 (2015-09-13) fix to 2.07 cleanup, reading RGB PSD as RGBA + 2.07 (2015-09-13) fix compiler warnings + partial animated GIF support + limited 16-bpc PSD support + #ifdef unused functions + bug with < 92 byte PIC,PNM,HDR,TGA + 2.06 (2015-04-19) fix bug where PSD returns wrong '*comp' value + 2.05 (2015-04-19) fix bug in progressive JPEG handling, fix warning + 2.04 (2015-04-15) try to re-enable SIMD on MinGW 64-bit + 2.03 (2015-04-12) extra corruption checking (mmozeiko) + stbi_set_flip_vertically_on_load (nguillemot) + fix NEON support; fix mingw support + 2.02 (2015-01-19) fix incorrect assert, fix warning + 2.01 (2015-01-17) fix various warnings; suppress SIMD on gcc 32-bit without -msse2 + 2.00b (2014-12-25) fix STBI_MALLOC in progressive JPEG + 2.00 (2014-12-25) optimize JPG, including x86 SSE2 & NEON SIMD (ryg) + progressive JPEG (stb) + PGM/PPM support (Ken Miller) + STBI_MALLOC,STBI_REALLOC,STBI_FREE + GIF bugfix -- seemingly never worked + STBI_NO_*, STBI_ONLY_* + 1.48 (2014-12-14) fix incorrectly-named assert() + 1.47 (2014-12-14) 1/2/4-bit PNG support, both direct and paletted (Omar Cornut & stb) + optimize PNG (ryg) + fix bug in interlaced PNG with user-specified channel count (stb) + 1.46 (2014-08-26) + fix broken tRNS chunk (colorkey-style transparency) in non-paletted PNG + 1.45 (2014-08-16) + fix MSVC-ARM internal compiler error by wrapping malloc + 1.44 (2014-08-07) + various warning fixes from Ronny Chevalier + 1.43 (2014-07-15) + fix MSVC-only compiler problem in code changed in 1.42 + 1.42 (2014-07-09) + don't define _CRT_SECURE_NO_WARNINGS (affects user code) + fixes to stbi__cleanup_jpeg path + added STBI_ASSERT to avoid requiring assert.h + 1.41 (2014-06-25) + fix search&replace from 1.36 that messed up comments/error messages + 1.40 (2014-06-22) + fix gcc struct-initialization warning + 1.39 (2014-06-15) + fix to TGA optimization when req_comp != number of components in TGA; + fix to GIF loading because BMP wasn't rewinding (whoops, no GIFs in my test suite) + add support for BMP version 5 (more ignored fields) + 1.38 (2014-06-06) + suppress MSVC warnings on integer casts truncating values + fix accidental rename of 'skip' field of I/O + 1.37 (2014-06-04) + remove duplicate typedef + 1.36 (2014-06-03) + convert to header file single-file library + if de-iphone isn't set, load iphone images color-swapped instead of returning NULL + 1.35 (2014-05-27) + various warnings + fix broken STBI_SIMD path + fix bug where stbi_load_from_file no longer left file pointer in correct place + fix broken non-easy path for 32-bit BMP (possibly never used) + TGA optimization by Arseny Kapoulkine + 1.34 (unknown) + use STBI_NOTUSED in stbi__resample_row_generic(), fix one more leak in tga failure case + 1.33 (2011-07-14) + make stbi_is_hdr work in STBI_NO_HDR (as specified), minor compiler-friendly improvements + 1.32 (2011-07-13) + support for "info" function for all supported filetypes (SpartanJ) + 1.31 (2011-06-20) + a few more leak fixes, bug in PNG handling (SpartanJ) + 1.30 (2011-06-11) + added ability to load files via callbacks to accomidate custom input streams (Ben Wenger) + removed deprecated format-specific test/load functions + removed support for installable file formats (stbi_loader) -- would have been broken for IO callbacks anyway + error cases in bmp and tga give messages and don't leak (Raymond Barbiero, grisha) + fix inefficiency in decoding 32-bit BMP (David Woo) + 1.29 (2010-08-16) + various warning fixes from Aurelien Pocheville + 1.28 (2010-08-01) + fix bug in GIF palette transparency (SpartanJ) + 1.27 (2010-08-01) + cast-to-stbi_uc to fix warnings + 1.26 (2010-07-24) + fix bug in file buffering for PNG reported by SpartanJ + 1.25 (2010-07-17) + refix trans_data warning (Won Chun) + 1.24 (2010-07-12) + perf improvements reading from files on platforms with lock-heavy fgetc() + minor perf improvements for jpeg + deprecated type-specific functions so we'll get feedback if they're needed + attempt to fix trans_data warning (Won Chun) + 1.23 fixed bug in iPhone support + 1.22 (2010-07-10) + removed image *writing* support + stbi_info support from Jetro Lauha + GIF support from Jean-Marc Lienher + iPhone PNG-extensions from James Brown + warning-fixes from Nicolas Schulz and Janez Zemva (i.stbi__err. Janez (U+017D)emva) + 1.21 fix use of 'stbi_uc' in header (reported by jon blow) + 1.20 added support for Softimage PIC, by Tom Seddon + 1.19 bug in interlaced PNG corruption check (found by ryg) + 1.18 (2008-08-02) + fix a threading bug (local mutable static) + 1.17 support interlaced PNG + 1.16 major bugfix - stbi__convert_format converted one too many pixels + 1.15 initialize some fields for thread safety + 1.14 fix threadsafe conversion bug + header-file-only version (#define STBI_HEADER_FILE_ONLY before including) + 1.13 threadsafe + 1.12 const qualifiers in the API + 1.11 Support installable IDCT, colorspace conversion routines + 1.10 Fixes for 64-bit (don't use "unsigned long") + optimized upsampling by Fabian "ryg" Giesen + 1.09 Fix format-conversion for PSD code (bad global variables!) + 1.08 Thatcher Ulrich's PSD code integrated by Nicolas Schulz + 1.07 attempt to fix C++ warning/errors again + 1.06 attempt to fix C++ warning/errors again + 1.05 fix TGA loading to return correct *comp and use good luminance calc + 1.04 default float alpha is 1, not 255; use 'void *' for stbi_image_free + 1.03 bugfixes to STBI_NO_STDIO, STBI_NO_HDR + 1.02 support for (subset of) HDR files, float interface for preferred access to them + 1.01 fix bug: possible bug in handling right-side up bmps... not sure + fix bug: the stbi__bmp_load() and stbi__tga_load() functions didn't work at all + 1.00 interface to zlib that skips zlib header + 0.99 correct handling of alpha in palette + 0.98 TGA loader by lonesock; dynamically add loaders (untested) + 0.97 jpeg errors on too large a file; also catch another malloc failure + 0.96 fix detection of invalid v value - particleman@mollyrocket forum + 0.95 during header scan, seek to markers in case of padding + 0.94 STBI_NO_STDIO to disable stdio usage; rename all #defines the same + 0.93 handle jpegtran output; verbose errors + 0.92 read 4,8,16,24,32-bit BMP files of several formats + 0.91 output 24-bit Windows 3.0 BMP files + 0.90 fix a few more warnings; bump version number to approach 1.0 + 0.61 bugfixes due to Marc LeBlanc, Christopher Lloyd + 0.60 fix compiling as c++ + 0.59 fix warnings: merge Dave Moore's -Wall fixes + 0.58 fix bug: zlib uncompressed mode len/nlen was wrong endian + 0.57 fix bug: jpg last huffman symbol before marker was >9 bits but less than 16 available + 0.56 fix bug: zlib uncompressed mode len vs. nlen + 0.55 fix bug: restart_interval not initialized to 0 + 0.54 allow NULL for 'int *comp' + 0.53 fix bug in png 3->4; speedup png decoding + 0.52 png handles req_comp=3,4 directly; minor cleanup; jpeg comments + 0.51 obey req_comp requests, 1-component jpegs return as 1-component, + on 'test' only check type, not whether we support this variant + 0.50 (2006-11-19) + first released version +*/ + + +/* +------------------------------------------------------------------------------ +This software is available under 2 licenses -- choose whichever you prefer. +------------------------------------------------------------------------------ +ALTERNATIVE A - MIT License +Copyright (c) 2017 Sean Barrett +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +------------------------------------------------------------------------------ +ALTERNATIVE B - Public Domain (www.unlicense.org) +This is free and unencumbered software released into the public domain. +Anyone is free to copy, modify, publish, use, compile, sell, or distribute this +software, either in source code form or as a compiled binary, for any purpose, +commercial or non-commercial, and by any means. +In jurisdictions that recognize copyright laws, the author or authors of this +software dedicate any and all copyright interest in the software to the public +domain. We make this dedication for the benefit of the public at large and to +the detriment of our heirs and successors. We intend this dedication to be an +overt act of relinquishment in perpetuity of all present and future rights to +this software under copyright law. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +------------------------------------------------------------------------------ +*/ diff --git a/tools/dkr_assets_tool_classes/libs/stb_image_write.h b/tools/dkr_assets_tool_classes/libs/stb_image_write.h new file mode 100644 index 00000000..c05e9581 --- /dev/null +++ b/tools/dkr_assets_tool_classes/libs/stb_image_write.h @@ -0,0 +1,1568 @@ +/* stb_image_write - v1.09 - public domain - http://nothings.org/stb/stb_image_write.h + writes out PNG/BMP/TGA/JPEG/HDR images to C stdio - Sean Barrett 2010-2015 + no warranty implied; use at your own risk + + Before #including, + + #define STB_IMAGE_WRITE_IMPLEMENTATION + + in the file that you want to have the implementation. + + Will probably not work correctly with strict-aliasing optimizations. + + If using a modern Microsoft Compiler, non-safe versions of CRT calls may cause + compilation warnings or even errors. To avoid this, also before #including, + + #define STBI_MSC_SECURE_CRT + +ABOUT: + + This header file is a library for writing images to C stdio. It could be + adapted to write to memory or a general streaming interface; let me know. + + The PNG output is not optimal; it is 20-50% larger than the file + written by a decent optimizing implementation; though providing a custom + zlib compress function (see STBIW_ZLIB_COMPRESS) can mitigate that. + This library is designed for source code compactness and simplicity, + not optimal image file size or run-time performance. + +BUILDING: + + You can #define STBIW_ASSERT(x) before the #include to avoid using assert.h. + You can #define STBIW_MALLOC(), STBIW_REALLOC(), and STBIW_FREE() to replace + malloc,realloc,free. + You can #define STBIW_MEMMOVE() to replace memmove() + You can #define STBIW_ZLIB_COMPRESS to use a custom zlib-style compress function + for PNG compression (instead of the builtin one), it must have the following signature: + unsigned char * my_compress(unsigned char *data, int data_len, int *out_len, int quality); + The returned data will be freed with STBIW_FREE() (free() by default), + so it must be heap allocated with STBIW_MALLOC() (malloc() by default), + +USAGE: + + There are five functions, one for each image file format: + + int stbi_write_png(char const *filename, int w, int h, int comp, const void *data, int stride_in_bytes); + int stbi_write_bmp(char const *filename, int w, int h, int comp, const void *data); + int stbi_write_tga(char const *filename, int w, int h, int comp, const void *data); + int stbi_write_jpg(char const *filename, int w, int h, int comp, const void *data, int quality); + int stbi_write_hdr(char const *filename, int w, int h, int comp, const float *data); + + void stbi_flip_vertically_on_write(int flag); // flag is non-zero to flip data vertically + + There are also five equivalent functions that use an arbitrary write function. You are + expected to open/close your file-equivalent before and after calling these: + + int stbi_write_png_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void *data, int stride_in_bytes); + int stbi_write_bmp_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void *data); + int stbi_write_tga_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void *data); + int stbi_write_hdr_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const float *data); + int stbi_write_jpg_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data, int quality); + + where the callback is: + void stbi_write_func(void *context, void *data, int size); + + You can configure it with these global variables: + int stbi_write_tga_with_rle; // defaults to true; set to 0 to disable RLE + int stbi_write_png_compression_level; // defaults to 8; set to higher for more compression + int stbi_write_force_png_filter; // defaults to -1; set to 0..5 to force a filter mode + + + You can define STBI_WRITE_NO_STDIO to disable the file variant of these + functions, so the library will not use stdio.h at all. However, this will + also disable HDR writing, because it requires stdio for formatted output. + + Each function returns 0 on failure and non-0 on success. + + The functions create an image file defined by the parameters. The image + is a rectangle of pixels stored from left-to-right, top-to-bottom. + Each pixel contains 'comp' channels of data stored interleaved with 8-bits + per channel, in the following order: 1=Y, 2=YA, 3=RGB, 4=RGBA. (Y is + monochrome color.) The rectangle is 'w' pixels wide and 'h' pixels tall. + The *data pointer points to the first byte of the top-left-most pixel. + For PNG, "stride_in_bytes" is the distance in bytes from the first byte of + a row of pixels to the first byte of the next row of pixels. + + PNG creates output files with the same number of components as the input. + The BMP format expands Y to RGB in the file format and does not + output alpha. + + PNG supports writing rectangles of data even when the bytes storing rows of + data are not consecutive in memory (e.g. sub-rectangles of a larger image), + by supplying the stride between the beginning of adjacent rows. The other + formats do not. (Thus you cannot write a native-format BMP through the BMP + writer, both because it is in BGR order and because it may have padding + at the end of the line.) + + PNG allows you to set the deflate compression level by setting the global + variable 'stbi_write_png_compression_level' (it defaults to 8). + + HDR expects linear float data. Since the format is always 32-bit rgb(e) + data, alpha (if provided) is discarded, and for monochrome data it is + replicated across all three channels. + + TGA supports RLE or non-RLE compressed data. To use non-RLE-compressed + data, set the global variable 'stbi_write_tga_with_rle' to 0. + + JPEG does ignore alpha channels in input data; quality is between 1 and 100. + Higher quality looks better but results in a bigger image. + JPEG baseline (no JPEG progressive). + +CREDITS: + + + Sean Barrett - PNG/BMP/TGA + Baldur Karlsson - HDR + Jean-Sebastien Guay - TGA monochrome + Tim Kelsey - misc enhancements + Alan Hickman - TGA RLE + Emmanuel Julien - initial file IO callback implementation + Jon Olick - original jo_jpeg.cpp code + Daniel Gibson - integrate JPEG, allow external zlib + Aarni Koskela - allow choosing PNG filter + + bugfixes: + github:Chribba + Guillaume Chereau + github:jry2 + github:romigrou + Sergio Gonzalez + Jonas Karlsson + Filip Wasil + Thatcher Ulrich + github:poppolopoppo + Patrick Boettcher + github:xeekworx + Cap Petschulat + Simon Rodriguez + Ivan Tikhonov + github:ignotion + Adam Schackart + +LICENSE + + See end of file for license information. + +*/ + +#ifndef INCLUDE_STB_IMAGE_WRITE_H +#define INCLUDE_STB_IMAGE_WRITE_H + +// if STB_IMAGE_WRITE_STATIC causes problems, try defining STBIWDEF to 'inline' or 'static inline' +#ifndef STBIWDEF +#ifdef STB_IMAGE_WRITE_STATIC +#define STBIWDEF static +#else +#ifdef __cplusplus +#define STBIWDEF extern "C" +#else +#define STBIWDEF extern +#endif +#endif +#endif + +#ifndef STB_IMAGE_WRITE_STATIC // C++ forbids static forward declarations +extern int stbi_write_tga_with_rle; +extern int stbi_write_png_compression_level; +extern int stbi_write_force_png_filter; +#endif + +#ifndef STBI_WRITE_NO_STDIO +STBIWDEF int stbi_write_png(char const *filename, int w, int h, int comp, const void *data, int stride_in_bytes); +STBIWDEF int stbi_write_bmp(char const *filename, int w, int h, int comp, const void *data); +STBIWDEF int stbi_write_tga(char const *filename, int w, int h, int comp, const void *data); +STBIWDEF int stbi_write_hdr(char const *filename, int w, int h, int comp, const float *data); +STBIWDEF int stbi_write_jpg(char const *filename, int x, int y, int comp, const void *data, int quality); +#endif + +typedef void stbi_write_func(void *context, void *data, int size); + +STBIWDEF int stbi_write_png_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void *data, int stride_in_bytes); +STBIWDEF int stbi_write_bmp_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void *data); +STBIWDEF int stbi_write_tga_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void *data); +STBIWDEF int stbi_write_hdr_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const float *data); +STBIWDEF int stbi_write_jpg_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data, int quality); + +STBIWDEF void stbi_flip_vertically_on_write(int flip_boolean); + +#endif//INCLUDE_STB_IMAGE_WRITE_H + +#ifdef STB_IMAGE_WRITE_IMPLEMENTATION + +#ifdef _WIN32 + #ifndef _CRT_SECURE_NO_WARNINGS + #define _CRT_SECURE_NO_WARNINGS + #endif + #ifndef _CRT_NONSTDC_NO_DEPRECATE + #define _CRT_NONSTDC_NO_DEPRECATE + #endif +#endif + +#ifndef STBI_WRITE_NO_STDIO +#include +#endif // STBI_WRITE_NO_STDIO + +#include +#include +#include +#include + +#if defined(STBIW_MALLOC) && defined(STBIW_FREE) && (defined(STBIW_REALLOC) || defined(STBIW_REALLOC_SIZED)) +// ok +#elif !defined(STBIW_MALLOC) && !defined(STBIW_FREE) && !defined(STBIW_REALLOC) && !defined(STBIW_REALLOC_SIZED) +// ok +#else +#error "Must define all or none of STBIW_MALLOC, STBIW_FREE, and STBIW_REALLOC (or STBIW_REALLOC_SIZED)." +#endif + +#ifndef STBIW_MALLOC +#define STBIW_MALLOC(sz) malloc(sz) +#define STBIW_REALLOC(p,newsz) realloc(p,newsz) +#define STBIW_FREE(p) free(p) +#endif + +#ifndef STBIW_REALLOC_SIZED +#define STBIW_REALLOC_SIZED(p,oldsz,newsz) STBIW_REALLOC(p,newsz) +#endif + + +#ifndef STBIW_MEMMOVE +#define STBIW_MEMMOVE(a,b,sz) memmove(a,b,sz) +#endif + + +#ifndef STBIW_ASSERT +#include +#define STBIW_ASSERT(x) assert(x) +#endif + +#define STBIW_UCHAR(x) (unsigned char) ((x) & 0xff) + +#ifdef STB_IMAGE_WRITE_STATIC +static int stbi__flip_vertically_on_write=0; +static int stbi_write_png_compression_level = 8; +static int stbi_write_tga_with_rle = 1; +static int stbi_write_force_png_filter = -1; +#else +int stbi_write_png_compression_level = 8; +int stbi__flip_vertically_on_write=0; +int stbi_write_tga_with_rle = 1; +int stbi_write_force_png_filter = -1; +#endif + +STBIWDEF void stbi_flip_vertically_on_write(int flag) +{ + stbi__flip_vertically_on_write = flag; +} + +typedef struct +{ + stbi_write_func *func; + void *context; +} stbi__write_context; + +// initialize a callback-based context +static void stbi__start_write_callbacks(stbi__write_context *s, stbi_write_func *c, void *context) +{ + s->func = c; + s->context = context; +} + +#ifndef STBI_WRITE_NO_STDIO + +static void stbi__stdio_write(void *context, void *data, int size) +{ + fwrite(data,1,size,(FILE*) context); +} + +static int stbi__start_write_file(stbi__write_context *s, const char *filename) +{ + FILE *f; +#ifdef STBI_MSC_SECURE_CRT + if (fopen_s(&f, filename, "wb")) + f = NULL; +#else + f = fopen(filename, "wb"); +#endif + stbi__start_write_callbacks(s, stbi__stdio_write, (void *) f); + return f != NULL; +} + +static void stbi__end_write_file(stbi__write_context *s) +{ + fclose((FILE *)s->context); +} + +#endif // !STBI_WRITE_NO_STDIO + +typedef unsigned int stbiw_uint32; +typedef int stb_image_write_test[sizeof(stbiw_uint32)==4 ? 1 : -1]; + +static void stbiw__writefv(stbi__write_context *s, const char *fmt, va_list v) +{ + while (*fmt) { + switch (*fmt++) { + case ' ': break; + case '1': { unsigned char x = STBIW_UCHAR(va_arg(v, int)); + s->func(s->context,&x,1); + break; } + case '2': { int x = va_arg(v,int); + unsigned char b[2]; + b[0] = STBIW_UCHAR(x); + b[1] = STBIW_UCHAR(x>>8); + s->func(s->context,b,2); + break; } + case '4': { stbiw_uint32 x = va_arg(v,int); + unsigned char b[4]; + b[0]=STBIW_UCHAR(x); + b[1]=STBIW_UCHAR(x>>8); + b[2]=STBIW_UCHAR(x>>16); + b[3]=STBIW_UCHAR(x>>24); + s->func(s->context,b,4); + break; } + default: + STBIW_ASSERT(0); + return; + } + } +} + +static void stbiw__writef(stbi__write_context *s, const char *fmt, ...) +{ + va_list v; + va_start(v, fmt); + stbiw__writefv(s, fmt, v); + va_end(v); +} + +static void stbiw__putc(stbi__write_context *s, unsigned char c) +{ + s->func(s->context, &c, 1); +} + +static void stbiw__write3(stbi__write_context *s, unsigned char a, unsigned char b, unsigned char c) +{ + unsigned char arr[3]; + arr[0] = a, arr[1] = b, arr[2] = c; + s->func(s->context, arr, 3); +} + +static void stbiw__write_pixel(stbi__write_context *s, int rgb_dir, int comp, int write_alpha, int expand_mono, unsigned char *d) +{ + unsigned char bg[3] = { 255, 0, 255}, px[3]; + int k; + + if (write_alpha < 0) + s->func(s->context, &d[comp - 1], 1); + + switch (comp) { + case 2: // 2 pixels = mono + alpha, alpha is written separately, so same as 1-channel case + case 1: + if (expand_mono) + stbiw__write3(s, d[0], d[0], d[0]); // monochrome bmp + else + s->func(s->context, d, 1); // monochrome TGA + break; + case 4: + if (!write_alpha) { + // composite against pink background + for (k = 0; k < 3; ++k) + px[k] = bg[k] + ((d[k] - bg[k]) * d[3]) / 255; + stbiw__write3(s, px[1 - rgb_dir], px[1], px[1 + rgb_dir]); + break; + } + /* FALLTHROUGH */ + case 3: + stbiw__write3(s, d[1 - rgb_dir], d[1], d[1 + rgb_dir]); + break; + } + if (write_alpha > 0) + s->func(s->context, &d[comp - 1], 1); +} + +static void stbiw__write_pixels(stbi__write_context *s, int rgb_dir, int vdir, int x, int y, int comp, void *data, int write_alpha, int scanline_pad, int expand_mono) +{ + stbiw_uint32 zero = 0; + int i,j, j_end; + + if (y <= 0) + return; + + if (stbi__flip_vertically_on_write) + vdir *= -1; + + if (vdir < 0) + j_end = -1, j = y-1; + else + j_end = y, j = 0; + + for (; j != j_end; j += vdir) { + for (i=0; i < x; ++i) { + unsigned char *d = (unsigned char *) data + (j*x+i)*comp; + stbiw__write_pixel(s, rgb_dir, comp, write_alpha, expand_mono, d); + } + s->func(s->context, &zero, scanline_pad); + } +} + +static int stbiw__outfile(stbi__write_context *s, int rgb_dir, int vdir, int x, int y, int comp, int expand_mono, void *data, int alpha, int pad, const char *fmt, ...) +{ + if (y < 0 || x < 0) { + return 0; + } else { + va_list v; + va_start(v, fmt); + stbiw__writefv(s, fmt, v); + va_end(v); + stbiw__write_pixels(s,rgb_dir,vdir,x,y,comp,data,alpha,pad, expand_mono); + return 1; + } +} + +static int stbi_write_bmp_core(stbi__write_context *s, int x, int y, int comp, const void *data) +{ + int pad = (-x*3) & 3; + return stbiw__outfile(s,-1,-1,x,y,comp,1,(void *) data,0,pad, + "11 4 22 4" "4 44 22 444444", + 'B', 'M', 14+40+(x*3+pad)*y, 0,0, 14+40, // file header + 40, x,y, 1,24, 0,0,0,0,0,0); // bitmap header +} + +STBIWDEF int stbi_write_bmp_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data) +{ + stbi__write_context s; + stbi__start_write_callbacks(&s, func, context); + return stbi_write_bmp_core(&s, x, y, comp, data); +} + +#ifndef STBI_WRITE_NO_STDIO +STBIWDEF int stbi_write_bmp(char const *filename, int x, int y, int comp, const void *data) +{ + stbi__write_context s; + if (stbi__start_write_file(&s,filename)) { + int r = stbi_write_bmp_core(&s, x, y, comp, data); + stbi__end_write_file(&s); + return r; + } else + return 0; +} +#endif //!STBI_WRITE_NO_STDIO + +static int stbi_write_tga_core(stbi__write_context *s, int x, int y, int comp, void *data) +{ + int has_alpha = (comp == 2 || comp == 4); + int colorbytes = has_alpha ? comp-1 : comp; + int format = colorbytes < 2 ? 3 : 2; // 3 color channels (RGB/RGBA) = 2, 1 color channel (Y/YA) = 3 + + if (y < 0 || x < 0) + return 0; + + if (!stbi_write_tga_with_rle) { + return stbiw__outfile(s, -1, -1, x, y, comp, 0, (void *) data, has_alpha, 0, + "111 221 2222 11", 0, 0, format, 0, 0, 0, 0, 0, x, y, (colorbytes + has_alpha) * 8, has_alpha * 8); + } else { + int i,j,k; + int jend, jdir; + + stbiw__writef(s, "111 221 2222 11", 0,0,format+8, 0,0,0, 0,0,x,y, (colorbytes + has_alpha) * 8, has_alpha * 8); + + if (stbi__flip_vertically_on_write) { + j = 0; + jend = y; + jdir = 1; + } else { + j = y-1; + jend = -1; + jdir = -1; + } + for (; j != jend; j += jdir) { + unsigned char *row = (unsigned char *) data + j * x * comp; + int len; + + for (i = 0; i < x; i += len) { + unsigned char *begin = row + i * comp; + int diff = 1; + len = 1; + + if (i < x - 1) { + ++len; + diff = memcmp(begin, row + (i + 1) * comp, comp); + if (diff) { + const unsigned char *prev = begin; + for (k = i + 2; k < x && len < 128; ++k) { + if (memcmp(prev, row + k * comp, comp)) { + prev += comp; + ++len; + } else { + --len; + break; + } + } + } else { + for (k = i + 2; k < x && len < 128; ++k) { + if (!memcmp(begin, row + k * comp, comp)) { + ++len; + } else { + break; + } + } + } + } + + if (diff) { + unsigned char header = STBIW_UCHAR(len - 1); + s->func(s->context, &header, 1); + for (k = 0; k < len; ++k) { + stbiw__write_pixel(s, -1, comp, has_alpha, 0, begin + k * comp); + } + } else { + unsigned char header = STBIW_UCHAR(len - 129); + s->func(s->context, &header, 1); + stbiw__write_pixel(s, -1, comp, has_alpha, 0, begin); + } + } + } + } + return 1; +} + +STBIWDEF int stbi_write_tga_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data) +{ + stbi__write_context s; + stbi__start_write_callbacks(&s, func, context); + return stbi_write_tga_core(&s, x, y, comp, (void *) data); +} + +#ifndef STBI_WRITE_NO_STDIO +STBIWDEF int stbi_write_tga(char const *filename, int x, int y, int comp, const void *data) +{ + stbi__write_context s; + if (stbi__start_write_file(&s,filename)) { + int r = stbi_write_tga_core(&s, x, y, comp, (void *) data); + stbi__end_write_file(&s); + return r; + } else + return 0; +} +#endif + +// ************************************************************************************************* +// Radiance RGBE HDR writer +// by Baldur Karlsson + +#define stbiw__max(a, b) ((a) > (b) ? (a) : (b)) + +void stbiw__linear_to_rgbe(unsigned char *rgbe, float *linear) +{ + int exponent; + float maxcomp = stbiw__max(linear[0], stbiw__max(linear[1], linear[2])); + + if (maxcomp < 1e-32f) { + rgbe[0] = rgbe[1] = rgbe[2] = rgbe[3] = 0; + } else { + float normalize = (float) frexp(maxcomp, &exponent) * 256.0f/maxcomp; + + rgbe[0] = (unsigned char)(linear[0] * normalize); + rgbe[1] = (unsigned char)(linear[1] * normalize); + rgbe[2] = (unsigned char)(linear[2] * normalize); + rgbe[3] = (unsigned char)(exponent + 128); + } +} + +void stbiw__write_run_data(stbi__write_context *s, int length, unsigned char databyte) +{ + unsigned char lengthbyte = STBIW_UCHAR(length+128); + STBIW_ASSERT(length+128 <= 255); + s->func(s->context, &lengthbyte, 1); + s->func(s->context, &databyte, 1); +} + +void stbiw__write_dump_data(stbi__write_context *s, int length, unsigned char *data) +{ + unsigned char lengthbyte = STBIW_UCHAR(length); + STBIW_ASSERT(length <= 128); // inconsistent with spec but consistent with official code + s->func(s->context, &lengthbyte, 1); + s->func(s->context, data, length); +} + +void stbiw__write_hdr_scanline(stbi__write_context *s, int width, int ncomp, unsigned char *scratch, float *scanline) +{ + unsigned char scanlineheader[4] = { 2, 2, 0, 0 }; + unsigned char rgbe[4]; + float linear[3]; + int x; + + scanlineheader[2] = (width&0xff00)>>8; + scanlineheader[3] = (width&0x00ff); + + /* skip RLE for images too small or large */ + if (width < 8 || width >= 32768) { + for (x=0; x < width; x++) { + switch (ncomp) { + case 4: /* fallthrough */ + case 3: linear[2] = scanline[x*ncomp + 2]; + linear[1] = scanline[x*ncomp + 1]; + linear[0] = scanline[x*ncomp + 0]; + break; + default: + linear[0] = linear[1] = linear[2] = scanline[x*ncomp + 0]; + break; + } + stbiw__linear_to_rgbe(rgbe, linear); + s->func(s->context, rgbe, 4); + } + } else { + int c,r; + /* encode into scratch buffer */ + for (x=0; x < width; x++) { + switch(ncomp) { + case 4: /* fallthrough */ + case 3: linear[2] = scanline[x*ncomp + 2]; + linear[1] = scanline[x*ncomp + 1]; + linear[0] = scanline[x*ncomp + 0]; + break; + default: + linear[0] = linear[1] = linear[2] = scanline[x*ncomp + 0]; + break; + } + stbiw__linear_to_rgbe(rgbe, linear); + scratch[x + width*0] = rgbe[0]; + scratch[x + width*1] = rgbe[1]; + scratch[x + width*2] = rgbe[2]; + scratch[x + width*3] = rgbe[3]; + } + + s->func(s->context, scanlineheader, 4); + + /* RLE each component separately */ + for (c=0; c < 4; c++) { + unsigned char *comp = &scratch[width*c]; + + x = 0; + while (x < width) { + // find first run + r = x; + while (r+2 < width) { + if (comp[r] == comp[r+1] && comp[r] == comp[r+2]) + break; + ++r; + } + if (r+2 >= width) + r = width; + // dump up to first run + while (x < r) { + int len = r-x; + if (len > 128) len = 128; + stbiw__write_dump_data(s, len, &comp[x]); + x += len; + } + // if there's a run, output it + if (r+2 < width) { // same test as what we break out of in search loop, so only true if we break'd + // find next byte after run + while (r < width && comp[r] == comp[x]) + ++r; + // output run up to r + while (x < r) { + int len = r-x; + if (len > 127) len = 127; + stbiw__write_run_data(s, len, comp[x]); + x += len; + } + } + } + } + } +} + +static int stbi_write_hdr_core(stbi__write_context *s, int x, int y, int comp, float *data) +{ + if (y <= 0 || x <= 0 || data == NULL) + return 0; + else { + // Each component is stored separately. Allocate scratch space for full output scanline. + unsigned char *scratch = (unsigned char *) STBIW_MALLOC(x*4); + int i, len; + char buffer[128]; + char header[] = "#?RADIANCE\n# Written by stb_image_write.h\nFORMAT=32-bit_rle_rgbe\n"; + s->func(s->context, header, sizeof(header)-1); + +#ifdef STBI_MSC_SECURE_CRT + len = sprintf_s(buffer, "EXPOSURE= 1.0000000000000\n\n-Y %d +X %d\n", y, x); +#else + len = sprintf(buffer, "EXPOSURE= 1.0000000000000\n\n-Y %d +X %d\n", y, x); +#endif + s->func(s->context, buffer, len); + + for(i=0; i < y; i++) + stbiw__write_hdr_scanline(s, x, comp, scratch, data + comp*x*(stbi__flip_vertically_on_write ? y-1-i : i)*x); + STBIW_FREE(scratch); + return 1; + } +} + +STBIWDEF int stbi_write_hdr_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const float *data) +{ + stbi__write_context s; + stbi__start_write_callbacks(&s, func, context); + return stbi_write_hdr_core(&s, x, y, comp, (float *) data); +} + +#ifndef STBI_WRITE_NO_STDIO +STBIWDEF int stbi_write_hdr(char const *filename, int x, int y, int comp, const float *data) +{ + stbi__write_context s; + if (stbi__start_write_file(&s,filename)) { + int r = stbi_write_hdr_core(&s, x, y, comp, (float *) data); + stbi__end_write_file(&s); + return r; + } else + return 0; +} +#endif // STBI_WRITE_NO_STDIO + + +////////////////////////////////////////////////////////////////////////////// +// +// PNG writer +// + +#ifndef STBIW_ZLIB_COMPRESS +// stretchy buffer; stbiw__sbpush() == vector<>::push_back() -- stbiw__sbcount() == vector<>::size() +#define stbiw__sbraw(a) ((int *) (a) - 2) +#define stbiw__sbm(a) stbiw__sbraw(a)[0] +#define stbiw__sbn(a) stbiw__sbraw(a)[1] + +#define stbiw__sbneedgrow(a,n) ((a)==0 || stbiw__sbn(a)+n >= stbiw__sbm(a)) +#define stbiw__sbmaybegrow(a,n) (stbiw__sbneedgrow(a,(n)) ? stbiw__sbgrow(a,n) : 0) +#define stbiw__sbgrow(a,n) stbiw__sbgrowf((void **) &(a), (n), sizeof(*(a))) + +#define stbiw__sbpush(a, v) (stbiw__sbmaybegrow(a,1), (a)[stbiw__sbn(a)++] = (v)) +#define stbiw__sbcount(a) ((a) ? stbiw__sbn(a) : 0) +#define stbiw__sbfree(a) ((a) ? STBIW_FREE(stbiw__sbraw(a)),0 : 0) + +static void *stbiw__sbgrowf(void **arr, int increment, int itemsize) +{ + int m = *arr ? 2*stbiw__sbm(*arr)+increment : increment+1; + void *p = STBIW_REALLOC_SIZED(*arr ? stbiw__sbraw(*arr) : 0, *arr ? (stbiw__sbm(*arr)*itemsize + sizeof(int)*2) : 0, itemsize * m + sizeof(int)*2); + STBIW_ASSERT(p); + if (p) { + if (!*arr) ((int *) p)[1] = 0; + *arr = (void *) ((int *) p + 2); + stbiw__sbm(*arr) = m; + } + return *arr; +} + +static unsigned char *stbiw__zlib_flushf(unsigned char *data, unsigned int *bitbuffer, int *bitcount) +{ + while (*bitcount >= 8) { + stbiw__sbpush(data, STBIW_UCHAR(*bitbuffer)); + *bitbuffer >>= 8; + *bitcount -= 8; + } + return data; +} + +static int stbiw__zlib_bitrev(int code, int codebits) +{ + int res=0; + while (codebits--) { + res = (res << 1) | (code & 1); + code >>= 1; + } + return res; +} + +static unsigned int stbiw__zlib_countm(unsigned char *a, unsigned char *b, int limit) +{ + int i; + for (i=0; i < limit && i < 258; ++i) + if (a[i] != b[i]) break; + return i; +} + +static unsigned int stbiw__zhash(unsigned char *data) +{ + stbiw_uint32 hash = data[0] + (data[1] << 8) + (data[2] << 16); + hash ^= hash << 3; + hash += hash >> 5; + hash ^= hash << 4; + hash += hash >> 17; + hash ^= hash << 25; + hash += hash >> 6; + return hash; +} + +#define stbiw__zlib_flush() (out = stbiw__zlib_flushf(out, &bitbuf, &bitcount)) +#define stbiw__zlib_add(code,codebits) \ + (bitbuf |= (code) << bitcount, bitcount += (codebits), stbiw__zlib_flush()) +#define stbiw__zlib_huffa(b,c) stbiw__zlib_add(stbiw__zlib_bitrev(b,c),c) +// default huffman tables +#define stbiw__zlib_huff1(n) stbiw__zlib_huffa(0x30 + (n), 8) +#define stbiw__zlib_huff2(n) stbiw__zlib_huffa(0x190 + (n)-144, 9) +#define stbiw__zlib_huff3(n) stbiw__zlib_huffa(0 + (n)-256,7) +#define stbiw__zlib_huff4(n) stbiw__zlib_huffa(0xc0 + (n)-280,8) +#define stbiw__zlib_huff(n) ((n) <= 143 ? stbiw__zlib_huff1(n) : (n) <= 255 ? stbiw__zlib_huff2(n) : (n) <= 279 ? stbiw__zlib_huff3(n) : stbiw__zlib_huff4(n)) +#define stbiw__zlib_huffb(n) ((n) <= 143 ? stbiw__zlib_huff1(n) : stbiw__zlib_huff2(n)) + +#define stbiw__ZHASH 16384 + +#endif // STBIW_ZLIB_COMPRESS + +unsigned char * stbi_zlib_compress(unsigned char *data, int data_len, int *out_len, int quality) +{ +#ifdef STBIW_ZLIB_COMPRESS + // user provided a zlib compress implementation, use that + return STBIW_ZLIB_COMPRESS(data, data_len, out_len, quality); +#else // use builtin + static unsigned short lengthc[] = { 3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258, 259 }; + static unsigned char lengtheb[]= { 0,0,0,0,0,0,0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0 }; + static unsigned short distc[] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577, 32768 }; + static unsigned char disteb[] = { 0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13 }; + unsigned int bitbuf=0; + int i,j, bitcount=0; + unsigned char *out = NULL; + unsigned char ***hash_table = (unsigned char***) STBIW_MALLOC(stbiw__ZHASH * sizeof(char**)); + if (hash_table == NULL) + return NULL; + if (quality < 5) quality = 5; + + stbiw__sbpush(out, 0x78); // DEFLATE 32K window + stbiw__sbpush(out, 0x5e); // FLEVEL = 1 + stbiw__zlib_add(1,1); // BFINAL = 1 + stbiw__zlib_add(1,2); // BTYPE = 1 -- fixed huffman + + for (i=0; i < stbiw__ZHASH; ++i) + hash_table[i] = NULL; + + i=0; + while (i < data_len-3) { + // hash next 3 bytes of data to be compressed + int h = stbiw__zhash(data+i)&(stbiw__ZHASH-1), best=3; + unsigned char *bestloc = 0; + unsigned char **hlist = hash_table[h]; + int n = stbiw__sbcount(hlist); + for (j=0; j < n; ++j) { + if (hlist[j]-data > i-32768) { // if entry lies within window + int d = stbiw__zlib_countm(hlist[j], data+i, data_len-i); + if (d >= best) best=d,bestloc=hlist[j]; + } + } + // when hash table entry is too long, delete half the entries + if (hash_table[h] && stbiw__sbn(hash_table[h]) == 2*quality) { + STBIW_MEMMOVE(hash_table[h], hash_table[h]+quality, sizeof(hash_table[h][0])*quality); + stbiw__sbn(hash_table[h]) = quality; + } + stbiw__sbpush(hash_table[h],data+i); + + if (bestloc) { + // "lazy matching" - check match at *next* byte, and if it's better, do cur byte as literal + h = stbiw__zhash(data+i+1)&(stbiw__ZHASH-1); + hlist = hash_table[h]; + n = stbiw__sbcount(hlist); + for (j=0; j < n; ++j) { + if (hlist[j]-data > i-32767) { + int e = stbiw__zlib_countm(hlist[j], data+i+1, data_len-i-1); + if (e > best) { // if next match is better, bail on current match + bestloc = NULL; + break; + } + } + } + } + + if (bestloc) { + int d = (int) (data+i - bestloc); // distance back + STBIW_ASSERT(d <= 32767 && best <= 258); + for (j=0; best > lengthc[j+1]-1; ++j); + stbiw__zlib_huff(j+257); + if (lengtheb[j]) stbiw__zlib_add(best - lengthc[j], lengtheb[j]); + for (j=0; d > distc[j+1]-1; ++j); + stbiw__zlib_add(stbiw__zlib_bitrev(j,5),5); + if (disteb[j]) stbiw__zlib_add(d - distc[j], disteb[j]); + i += best; + } else { + stbiw__zlib_huffb(data[i]); + ++i; + } + } + // write out final bytes + for (;i < data_len; ++i) + stbiw__zlib_huffb(data[i]); + stbiw__zlib_huff(256); // end of block + // pad with 0 bits to byte boundary + while (bitcount) + stbiw__zlib_add(0,1); + + for (i=0; i < stbiw__ZHASH; ++i) + (void) stbiw__sbfree(hash_table[i]); + STBIW_FREE(hash_table); + + { + // compute adler32 on input + unsigned int s1=1, s2=0; + int blocklen = (int) (data_len % 5552); + j=0; + while (j < data_len) { + for (i=0; i < blocklen; ++i) s1 += data[j+i], s2 += s1; + s1 %= 65521, s2 %= 65521; + j += blocklen; + blocklen = 5552; + } + stbiw__sbpush(out, STBIW_UCHAR(s2 >> 8)); + stbiw__sbpush(out, STBIW_UCHAR(s2)); + stbiw__sbpush(out, STBIW_UCHAR(s1 >> 8)); + stbiw__sbpush(out, STBIW_UCHAR(s1)); + } + *out_len = stbiw__sbn(out); + // make returned pointer freeable + STBIW_MEMMOVE(stbiw__sbraw(out), out, *out_len); + return (unsigned char *) stbiw__sbraw(out); +#endif // STBIW_ZLIB_COMPRESS +} + +static unsigned int stbiw__crc32(unsigned char *buffer, int len) +{ + static unsigned int crc_table[256] = + { + 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3, + 0x0eDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91, + 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7, + 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5, + 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, + 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59, + 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F, + 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, + 0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433, + 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01, + 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457, + 0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65, + 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB, + 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9, + 0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F, + 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD, + 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683, + 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8, 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1, + 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7, + 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, + 0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B, + 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79, + 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, + 0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D, + 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713, + 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, + 0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777, + 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45, + 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB, + 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9, + 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF, + 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D + }; + + unsigned int crc = ~0u; + int i; + for (i=0; i < len; ++i) + crc = (crc >> 8) ^ crc_table[buffer[i] ^ (crc & 0xff)]; + return ~crc; +} + +#define stbiw__wpng4(o,a,b,c,d) ((o)[0]=STBIW_UCHAR(a),(o)[1]=STBIW_UCHAR(b),(o)[2]=STBIW_UCHAR(c),(o)[3]=STBIW_UCHAR(d),(o)+=4) +#define stbiw__wp32(data,v) stbiw__wpng4(data, (v)>>24,(v)>>16,(v)>>8,(v)); +#define stbiw__wptag(data,s) stbiw__wpng4(data, s[0],s[1],s[2],s[3]) + +static void stbiw__wpcrc(unsigned char **data, int len) +{ + unsigned int crc = stbiw__crc32(*data - len - 4, len+4); + stbiw__wp32(*data, crc); +} + +static unsigned char stbiw__paeth(int a, int b, int c) +{ + int p = a + b - c, pa = abs(p-a), pb = abs(p-b), pc = abs(p-c); + if (pa <= pb && pa <= pc) return STBIW_UCHAR(a); + if (pb <= pc) return STBIW_UCHAR(b); + return STBIW_UCHAR(c); +} + +// @OPTIMIZE: provide an option that always forces left-predict or paeth predict +static void stbiw__encode_png_line(unsigned char *pixels, int stride_bytes, int width, int height, int y, int n, int filter_type, signed char *line_buffer) +{ + static int mapping[] = { 0,1,2,3,4 }; + static int firstmap[] = { 0,1,0,5,6 }; + int *mymap = (y != 0) ? mapping : firstmap; + int i; + int type = mymap[filter_type]; + unsigned char *z = pixels + stride_bytes * (stbi__flip_vertically_on_write ? height-1-y : y); + int signed_stride = stbi__flip_vertically_on_write ? -stride_bytes : stride_bytes; + for (i = 0; i < n; ++i) { + switch (type) { + case 0: line_buffer[i] = z[i]; break; + case 1: line_buffer[i] = z[i]; break; + case 2: line_buffer[i] = z[i] - z[i-signed_stride]; break; + case 3: line_buffer[i] = z[i] - (z[i-signed_stride]>>1); break; + case 4: line_buffer[i] = (signed char) (z[i] - stbiw__paeth(0,z[i-signed_stride],0)); break; + case 5: line_buffer[i] = z[i]; break; + case 6: line_buffer[i] = z[i]; break; + } + } + for (i=n; i < width*n; ++i) { + switch (type) { + case 0: line_buffer[i] = z[i]; break; + case 1: line_buffer[i] = z[i] - z[i-n]; break; + case 2: line_buffer[i] = z[i] - z[i-signed_stride]; break; + case 3: line_buffer[i] = z[i] - ((z[i-n] + z[i-signed_stride])>>1); break; + case 4: line_buffer[i] = z[i] - stbiw__paeth(z[i-n], z[i-signed_stride], z[i-signed_stride-n]); break; + case 5: line_buffer[i] = z[i] - (z[i-n]>>1); break; + case 6: line_buffer[i] = z[i] - stbiw__paeth(z[i-n], 0,0); break; + } + } +} + +unsigned char *stbi_write_png_to_mem(unsigned char *pixels, int stride_bytes, int x, int y, int n, int *out_len) +{ + int force_filter = stbi_write_force_png_filter; + int ctype[5] = { -1, 0, 4, 2, 6 }; + unsigned char sig[8] = { 137,80,78,71,13,10,26,10 }; + unsigned char *out,*o, *filt, *zlib; + signed char *line_buffer; + int j,zlen; + + if (stride_bytes == 0) + stride_bytes = x * n; + + if (force_filter >= 5) { + force_filter = -1; + } + + filt = (unsigned char *) STBIW_MALLOC((x*n+1) * y); if (!filt) return 0; + line_buffer = (signed char *) STBIW_MALLOC(x * n); if (!line_buffer) { STBIW_FREE(filt); return 0; } + for (j=0; j < y; ++j) { + int filter_type; + if (force_filter > -1) { + filter_type = force_filter; + stbiw__encode_png_line(pixels, stride_bytes, x, y, j, n, force_filter, line_buffer); + } else { // Estimate the best filter by running through all of them: + int best_filter = 0, best_filter_val = 0x7fffffff, est, i; + for (filter_type = 0; filter_type < 5; filter_type++) { + stbiw__encode_png_line(pixels, stride_bytes, x, y, j, n, filter_type, line_buffer); + + // Estimate the entropy of the line using this filter; the less, the better. + est = 0; + for (i = 0; i < x*n; ++i) { + est += abs((signed char) line_buffer[i]); + } + if (est < best_filter_val) { + best_filter_val = est; + best_filter = filter_type; + } + } + if (filter_type != best_filter) { // If the last iteration already got us the best filter, don't redo it + stbiw__encode_png_line(pixels, stride_bytes, x, y, j, n, best_filter, line_buffer); + filter_type = best_filter; + } + } + // when we get here, filter_type contains the filter type, and line_buffer contains the data + filt[j*(x*n+1)] = (unsigned char) filter_type; + STBIW_MEMMOVE(filt+j*(x*n+1)+1, line_buffer, x*n); + } + STBIW_FREE(line_buffer); + zlib = stbi_zlib_compress(filt, y*( x*n+1), &zlen, stbi_write_png_compression_level); + STBIW_FREE(filt); + if (!zlib) return 0; + + // each tag requires 12 bytes of overhead + out = (unsigned char *) STBIW_MALLOC(8 + 12+13 + 12+zlen + 12); + if (!out) return 0; + *out_len = 8 + 12+13 + 12+zlen + 12; + + o=out; + STBIW_MEMMOVE(o,sig,8); o+= 8; + stbiw__wp32(o, 13); // header length + stbiw__wptag(o, "IHDR"); + stbiw__wp32(o, x); + stbiw__wp32(o, y); + *o++ = 8; + *o++ = STBIW_UCHAR(ctype[n]); + *o++ = 0; + *o++ = 0; + *o++ = 0; + stbiw__wpcrc(&o,13); + + stbiw__wp32(o, zlen); + stbiw__wptag(o, "IDAT"); + STBIW_MEMMOVE(o, zlib, zlen); + o += zlen; + STBIW_FREE(zlib); + stbiw__wpcrc(&o, zlen); + + stbiw__wp32(o,0); + stbiw__wptag(o, "IEND"); + stbiw__wpcrc(&o,0); + + STBIW_ASSERT(o == out + *out_len); + + return out; +} + +#ifndef STBI_WRITE_NO_STDIO +STBIWDEF int stbi_write_png(char const *filename, int x, int y, int comp, const void *data, int stride_bytes) +{ + FILE *f; + int len; + unsigned char *png = stbi_write_png_to_mem((unsigned char *) data, stride_bytes, x, y, comp, &len); + if (png == NULL) return 0; +#ifdef STBI_MSC_SECURE_CRT + if (fopen_s(&f, filename, "wb")) + f = NULL; +#else + f = fopen(filename, "wb"); +#endif + if (!f) { STBIW_FREE(png); return 0; } + fwrite(png, 1, len, f); + fclose(f); + STBIW_FREE(png); + return 1; +} +#endif + +STBIWDEF int stbi_write_png_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data, int stride_bytes) +{ + int len; + unsigned char *png = stbi_write_png_to_mem((unsigned char *) data, stride_bytes, x, y, comp, &len); + if (png == NULL) return 0; + func(context, png, len); + STBIW_FREE(png); + return 1; +} + + +/* *************************************************************************** + * + * JPEG writer + * + * This is based on Jon Olick's jo_jpeg.cpp: + * public domain Simple, Minimalistic JPEG writer - http://www.jonolick.com/code.html + */ + +static const unsigned char stbiw__jpg_ZigZag[] = { 0,1,5,6,14,15,27,28,2,4,7,13,16,26,29,42,3,8,12,17,25,30,41,43,9,11,18, + 24,31,40,44,53,10,19,23,32,39,45,52,54,20,22,33,38,46,51,55,60,21,34,37,47,50,56,59,61,35,36,48,49,57,58,62,63 }; + +static void stbiw__jpg_writeBits(stbi__write_context *s, int *bitBufP, int *bitCntP, const unsigned short *bs) { + int bitBuf = *bitBufP, bitCnt = *bitCntP; + bitCnt += bs[1]; + bitBuf |= bs[0] << (24 - bitCnt); + while(bitCnt >= 8) { + unsigned char c = (bitBuf >> 16) & 255; + stbiw__putc(s, c); + if(c == 255) { + stbiw__putc(s, 0); + } + bitBuf <<= 8; + bitCnt -= 8; + } + *bitBufP = bitBuf; + *bitCntP = bitCnt; +} + +static void stbiw__jpg_DCT(float *d0p, float *d1p, float *d2p, float *d3p, float *d4p, float *d5p, float *d6p, float *d7p) { + float d0 = *d0p, d1 = *d1p, d2 = *d2p, d3 = *d3p, d4 = *d4p, d5 = *d5p, d6 = *d6p, d7 = *d7p; + float z1, z2, z3, z4, z5, z11, z13; + + float tmp0 = d0 + d7; + float tmp7 = d0 - d7; + float tmp1 = d1 + d6; + float tmp6 = d1 - d6; + float tmp2 = d2 + d5; + float tmp5 = d2 - d5; + float tmp3 = d3 + d4; + float tmp4 = d3 - d4; + + // Even part + float tmp10 = tmp0 + tmp3; // phase 2 + float tmp13 = tmp0 - tmp3; + float tmp11 = tmp1 + tmp2; + float tmp12 = tmp1 - tmp2; + + d0 = tmp10 + tmp11; // phase 3 + d4 = tmp10 - tmp11; + + z1 = (tmp12 + tmp13) * 0.707106781f; // c4 + d2 = tmp13 + z1; // phase 5 + d6 = tmp13 - z1; + + // Odd part + tmp10 = tmp4 + tmp5; // phase 2 + tmp11 = tmp5 + tmp6; + tmp12 = tmp6 + tmp7; + + // The rotator is modified from fig 4-8 to avoid extra negations. + z5 = (tmp10 - tmp12) * 0.382683433f; // c6 + z2 = tmp10 * 0.541196100f + z5; // c2-c6 + z4 = tmp12 * 1.306562965f + z5; // c2+c6 + z3 = tmp11 * 0.707106781f; // c4 + + z11 = tmp7 + z3; // phase 5 + z13 = tmp7 - z3; + + *d5p = z13 + z2; // phase 6 + *d3p = z13 - z2; + *d1p = z11 + z4; + *d7p = z11 - z4; + + *d0p = d0; *d2p = d2; *d4p = d4; *d6p = d6; +} + +static void stbiw__jpg_calcBits(int val, unsigned short bits[2]) { + int tmp1 = val < 0 ? -val : val; + val = val < 0 ? val-1 : val; + bits[1] = 1; + while(tmp1 >>= 1) { + ++bits[1]; + } + bits[0] = val & ((1<0)&&(DU[end0pos]==0); --end0pos) { + } + // end0pos = first element in reverse order !=0 + if(end0pos == 0) { + stbiw__jpg_writeBits(s, bitBuf, bitCnt, EOB); + return DU[0]; + } + for(i = 1; i <= end0pos; ++i) { + int startpos = i; + int nrzeroes; + unsigned short bits[2]; + for (; DU[i]==0 && i<=end0pos; ++i) { + } + nrzeroes = i-startpos; + if ( nrzeroes >= 16 ) { + int lng = nrzeroes>>4; + int nrmarker; + for (nrmarker=1; nrmarker <= lng; ++nrmarker) + stbiw__jpg_writeBits(s, bitBuf, bitCnt, M16zeroes); + nrzeroes &= 15; + } + stbiw__jpg_calcBits(DU[i], bits); + stbiw__jpg_writeBits(s, bitBuf, bitCnt, HTAC[(nrzeroes<<4)+bits[1]]); + stbiw__jpg_writeBits(s, bitBuf, bitCnt, bits); + } + if(end0pos != 63) { + stbiw__jpg_writeBits(s, bitBuf, bitCnt, EOB); + } + return DU[0]; +} + +static int stbi_write_jpg_core(stbi__write_context *s, int width, int height, int comp, const void* data, int quality) { + // Constants that don't pollute global namespace + static const unsigned char std_dc_luminance_nrcodes[] = {0,0,1,5,1,1,1,1,1,1,0,0,0,0,0,0,0}; + static const unsigned char std_dc_luminance_values[] = {0,1,2,3,4,5,6,7,8,9,10,11}; + static const unsigned char std_ac_luminance_nrcodes[] = {0,0,2,1,3,3,2,4,3,5,5,4,4,0,0,1,0x7d}; + static const unsigned char std_ac_luminance_values[] = { + 0x01,0x02,0x03,0x00,0x04,0x11,0x05,0x12,0x21,0x31,0x41,0x06,0x13,0x51,0x61,0x07,0x22,0x71,0x14,0x32,0x81,0x91,0xa1,0x08, + 0x23,0x42,0xb1,0xc1,0x15,0x52,0xd1,0xf0,0x24,0x33,0x62,0x72,0x82,0x09,0x0a,0x16,0x17,0x18,0x19,0x1a,0x25,0x26,0x27,0x28, + 0x29,0x2a,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x53,0x54,0x55,0x56,0x57,0x58,0x59, + 0x5a,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x83,0x84,0x85,0x86,0x87,0x88,0x89, + 0x8a,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9a,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xb2,0xb3,0xb4,0xb5,0xb6, + 0xb7,0xb8,0xb9,0xba,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xda,0xe1,0xe2, + 0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa + }; + static const unsigned char std_dc_chrominance_nrcodes[] = {0,0,3,1,1,1,1,1,1,1,1,1,0,0,0,0,0}; + static const unsigned char std_dc_chrominance_values[] = {0,1,2,3,4,5,6,7,8,9,10,11}; + static const unsigned char std_ac_chrominance_nrcodes[] = {0,0,2,1,2,4,4,3,4,7,5,4,4,0,1,2,0x77}; + static const unsigned char std_ac_chrominance_values[] = { + 0x00,0x01,0x02,0x03,0x11,0x04,0x05,0x21,0x31,0x06,0x12,0x41,0x51,0x07,0x61,0x71,0x13,0x22,0x32,0x81,0x08,0x14,0x42,0x91, + 0xa1,0xb1,0xc1,0x09,0x23,0x33,0x52,0xf0,0x15,0x62,0x72,0xd1,0x0a,0x16,0x24,0x34,0xe1,0x25,0xf1,0x17,0x18,0x19,0x1a,0x26, + 0x27,0x28,0x29,0x2a,0x35,0x36,0x37,0x38,0x39,0x3a,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x53,0x54,0x55,0x56,0x57,0x58, + 0x59,0x5a,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x82,0x83,0x84,0x85,0x86,0x87, + 0x88,0x89,0x8a,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9a,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xb2,0xb3,0xb4, + 0xb5,0xb6,0xb7,0xb8,0xb9,0xba,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xda, + 0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa + }; + // Huffman tables + static const unsigned short YDC_HT[256][2] = { {0,2},{2,3},{3,3},{4,3},{5,3},{6,3},{14,4},{30,5},{62,6},{126,7},{254,8},{510,9}}; + static const unsigned short UVDC_HT[256][2] = { {0,2},{1,2},{2,2},{6,3},{14,4},{30,5},{62,6},{126,7},{254,8},{510,9},{1022,10},{2046,11}}; + static const unsigned short YAC_HT[256][2] = { + {10,4},{0,2},{1,2},{4,3},{11,4},{26,5},{120,7},{248,8},{1014,10},{65410,16},{65411,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {12,4},{27,5},{121,7},{502,9},{2038,11},{65412,16},{65413,16},{65414,16},{65415,16},{65416,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {28,5},{249,8},{1015,10},{4084,12},{65417,16},{65418,16},{65419,16},{65420,16},{65421,16},{65422,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {58,6},{503,9},{4085,12},{65423,16},{65424,16},{65425,16},{65426,16},{65427,16},{65428,16},{65429,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {59,6},{1016,10},{65430,16},{65431,16},{65432,16},{65433,16},{65434,16},{65435,16},{65436,16},{65437,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {122,7},{2039,11},{65438,16},{65439,16},{65440,16},{65441,16},{65442,16},{65443,16},{65444,16},{65445,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {123,7},{4086,12},{65446,16},{65447,16},{65448,16},{65449,16},{65450,16},{65451,16},{65452,16},{65453,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {250,8},{4087,12},{65454,16},{65455,16},{65456,16},{65457,16},{65458,16},{65459,16},{65460,16},{65461,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {504,9},{32704,15},{65462,16},{65463,16},{65464,16},{65465,16},{65466,16},{65467,16},{65468,16},{65469,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {505,9},{65470,16},{65471,16},{65472,16},{65473,16},{65474,16},{65475,16},{65476,16},{65477,16},{65478,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {506,9},{65479,16},{65480,16},{65481,16},{65482,16},{65483,16},{65484,16},{65485,16},{65486,16},{65487,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {1017,10},{65488,16},{65489,16},{65490,16},{65491,16},{65492,16},{65493,16},{65494,16},{65495,16},{65496,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {1018,10},{65497,16},{65498,16},{65499,16},{65500,16},{65501,16},{65502,16},{65503,16},{65504,16},{65505,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {2040,11},{65506,16},{65507,16},{65508,16},{65509,16},{65510,16},{65511,16},{65512,16},{65513,16},{65514,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {65515,16},{65516,16},{65517,16},{65518,16},{65519,16},{65520,16},{65521,16},{65522,16},{65523,16},{65524,16},{0,0},{0,0},{0,0},{0,0},{0,0}, + {2041,11},{65525,16},{65526,16},{65527,16},{65528,16},{65529,16},{65530,16},{65531,16},{65532,16},{65533,16},{65534,16},{0,0},{0,0},{0,0},{0,0},{0,0} + }; + static const unsigned short UVAC_HT[256][2] = { + {0,2},{1,2},{4,3},{10,4},{24,5},{25,5},{56,6},{120,7},{500,9},{1014,10},{4084,12},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {11,4},{57,6},{246,8},{501,9},{2038,11},{4085,12},{65416,16},{65417,16},{65418,16},{65419,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {26,5},{247,8},{1015,10},{4086,12},{32706,15},{65420,16},{65421,16},{65422,16},{65423,16},{65424,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {27,5},{248,8},{1016,10},{4087,12},{65425,16},{65426,16},{65427,16},{65428,16},{65429,16},{65430,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {58,6},{502,9},{65431,16},{65432,16},{65433,16},{65434,16},{65435,16},{65436,16},{65437,16},{65438,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {59,6},{1017,10},{65439,16},{65440,16},{65441,16},{65442,16},{65443,16},{65444,16},{65445,16},{65446,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {121,7},{2039,11},{65447,16},{65448,16},{65449,16},{65450,16},{65451,16},{65452,16},{65453,16},{65454,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {122,7},{2040,11},{65455,16},{65456,16},{65457,16},{65458,16},{65459,16},{65460,16},{65461,16},{65462,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {249,8},{65463,16},{65464,16},{65465,16},{65466,16},{65467,16},{65468,16},{65469,16},{65470,16},{65471,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {503,9},{65472,16},{65473,16},{65474,16},{65475,16},{65476,16},{65477,16},{65478,16},{65479,16},{65480,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {504,9},{65481,16},{65482,16},{65483,16},{65484,16},{65485,16},{65486,16},{65487,16},{65488,16},{65489,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {505,9},{65490,16},{65491,16},{65492,16},{65493,16},{65494,16},{65495,16},{65496,16},{65497,16},{65498,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {506,9},{65499,16},{65500,16},{65501,16},{65502,16},{65503,16},{65504,16},{65505,16},{65506,16},{65507,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {2041,11},{65508,16},{65509,16},{65510,16},{65511,16},{65512,16},{65513,16},{65514,16},{65515,16},{65516,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {16352,14},{65517,16},{65518,16},{65519,16},{65520,16},{65521,16},{65522,16},{65523,16},{65524,16},{65525,16},{0,0},{0,0},{0,0},{0,0},{0,0}, + {1018,10},{32707,15},{65526,16},{65527,16},{65528,16},{65529,16},{65530,16},{65531,16},{65532,16},{65533,16},{65534,16},{0,0},{0,0},{0,0},{0,0},{0,0} + }; + static const int YQT[] = {16,11,10,16,24,40,51,61,12,12,14,19,26,58,60,55,14,13,16,24,40,57,69,56,14,17,22,29,51,87,80,62,18,22, + 37,56,68,109,103,77,24,35,55,64,81,104,113,92,49,64,78,87,103,121,120,101,72,92,95,98,112,100,103,99}; + static const int UVQT[] = {17,18,24,47,99,99,99,99,18,21,26,66,99,99,99,99,24,26,56,99,99,99,99,99,47,66,99,99,99,99,99,99, + 99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99}; + static const float aasf[] = { 1.0f * 2.828427125f, 1.387039845f * 2.828427125f, 1.306562965f * 2.828427125f, 1.175875602f * 2.828427125f, + 1.0f * 2.828427125f, 0.785694958f * 2.828427125f, 0.541196100f * 2.828427125f, 0.275899379f * 2.828427125f }; + + int row, col, i, k; + float fdtbl_Y[64], fdtbl_UV[64]; + unsigned char YTable[64], UVTable[64]; + + if(!data || !width || !height || comp > 4 || comp < 1) { + return 0; + } + + quality = quality ? quality : 90; + quality = quality < 1 ? 1 : quality > 100 ? 100 : quality; + quality = quality < 50 ? 5000 / quality : 200 - quality * 2; + + for(i = 0; i < 64; ++i) { + int uvti, yti = (YQT[i]*quality+50)/100; + YTable[stbiw__jpg_ZigZag[i]] = (unsigned char) (yti < 1 ? 1 : yti > 255 ? 255 : yti); + uvti = (UVQT[i]*quality+50)/100; + UVTable[stbiw__jpg_ZigZag[i]] = (unsigned char) (uvti < 1 ? 1 : uvti > 255 ? 255 : uvti); + } + + for(row = 0, k = 0; row < 8; ++row) { + for(col = 0; col < 8; ++col, ++k) { + fdtbl_Y[k] = 1 / (YTable [stbiw__jpg_ZigZag[k]] * aasf[row] * aasf[col]); + fdtbl_UV[k] = 1 / (UVTable[stbiw__jpg_ZigZag[k]] * aasf[row] * aasf[col]); + } + } + + // Write Headers + { + static const unsigned char head0[] = { 0xFF,0xD8,0xFF,0xE0,0,0x10,'J','F','I','F',0,1,1,0,0,1,0,1,0,0,0xFF,0xDB,0,0x84,0 }; + static const unsigned char head2[] = { 0xFF,0xDA,0,0xC,3,1,0,2,0x11,3,0x11,0,0x3F,0 }; + const unsigned char head1[] = { 0xFF,0xC0,0,0x11,8,(unsigned char)(height>>8),STBIW_UCHAR(height),(unsigned char)(width>>8),STBIW_UCHAR(width), + 3,1,0x11,0,2,0x11,1,3,0x11,1,0xFF,0xC4,0x01,0xA2,0 }; + s->func(s->context, (void*)head0, sizeof(head0)); + s->func(s->context, (void*)YTable, sizeof(YTable)); + stbiw__putc(s, 1); + s->func(s->context, UVTable, sizeof(UVTable)); + s->func(s->context, (void*)head1, sizeof(head1)); + s->func(s->context, (void*)(std_dc_luminance_nrcodes+1), sizeof(std_dc_luminance_nrcodes)-1); + s->func(s->context, (void*)std_dc_luminance_values, sizeof(std_dc_luminance_values)); + stbiw__putc(s, 0x10); // HTYACinfo + s->func(s->context, (void*)(std_ac_luminance_nrcodes+1), sizeof(std_ac_luminance_nrcodes)-1); + s->func(s->context, (void*)std_ac_luminance_values, sizeof(std_ac_luminance_values)); + stbiw__putc(s, 1); // HTUDCinfo + s->func(s->context, (void*)(std_dc_chrominance_nrcodes+1), sizeof(std_dc_chrominance_nrcodes)-1); + s->func(s->context, (void*)std_dc_chrominance_values, sizeof(std_dc_chrominance_values)); + stbiw__putc(s, 0x11); // HTUACinfo + s->func(s->context, (void*)(std_ac_chrominance_nrcodes+1), sizeof(std_ac_chrominance_nrcodes)-1); + s->func(s->context, (void*)std_ac_chrominance_values, sizeof(std_ac_chrominance_values)); + s->func(s->context, (void*)head2, sizeof(head2)); + } + + // Encode 8x8 macroblocks + { + static const unsigned short fillBits[] = {0x7F, 7}; + const unsigned char *imageData = (const unsigned char *)data; + int DCY=0, DCU=0, DCV=0; + int bitBuf=0, bitCnt=0; + // comp == 2 is grey+alpha (alpha is ignored) + int ofsG = comp > 2 ? 1 : 0, ofsB = comp > 2 ? 2 : 0; + int x, y, pos; + for(y = 0; y < height; y += 8) { + for(x = 0; x < width; x += 8) { + float YDU[64], UDU[64], VDU[64]; + for(row = y, pos = 0; row < y+8; ++row) { + for(col = x; col < x+8; ++col, ++pos) { + int p = (stbi__flip_vertically_on_write ? height-1-row : row)*width*comp + col*comp; + float r, g, b; + if(row >= height) { + p -= width*comp*(row+1 - height); + } + if(col >= width) { + p -= comp*(col+1 - width); + } + + r = imageData[p+0]; + g = imageData[p+ofsG]; + b = imageData[p+ofsB]; + YDU[pos]=+0.29900f*r+0.58700f*g+0.11400f*b-128; + UDU[pos]=-0.16874f*r-0.33126f*g+0.50000f*b; + VDU[pos]=+0.50000f*r-0.41869f*g-0.08131f*b; + } + } + + DCY = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, YDU, fdtbl_Y, DCY, YDC_HT, YAC_HT); + DCU = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, UDU, fdtbl_UV, DCU, UVDC_HT, UVAC_HT); + DCV = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, VDU, fdtbl_UV, DCV, UVDC_HT, UVAC_HT); + } + } + + // Do the bit alignment of the EOI marker + stbiw__jpg_writeBits(s, &bitBuf, &bitCnt, fillBits); + } + + // EOI + stbiw__putc(s, 0xFF); + stbiw__putc(s, 0xD9); + + return 1; +} + +STBIWDEF int stbi_write_jpg_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data, int quality) +{ + stbi__write_context s; + stbi__start_write_callbacks(&s, func, context); + return stbi_write_jpg_core(&s, x, y, comp, (void *) data, quality); +} + + +#ifndef STBI_WRITE_NO_STDIO +STBIWDEF int stbi_write_jpg(char const *filename, int x, int y, int comp, const void *data, int quality) +{ + stbi__write_context s; + if (stbi__start_write_file(&s,filename)) { + int r = stbi_write_jpg_core(&s, x, y, comp, data, quality); + stbi__end_write_file(&s); + return r; + } else + return 0; +} +#endif + +#endif // STB_IMAGE_WRITE_IMPLEMENTATION + +/* Revision history + 1.09 (2018-02-11) + fix typo in zlib quality API, improve STB_I_W_STATIC in C++ + 1.08 (2018-01-29) + add stbi__flip_vertically_on_write, external zlib, zlib quality, choose PNG filter + 1.07 (2017-07-24) + doc fix + 1.06 (2017-07-23) + writing JPEG (using Jon Olick's code) + 1.05 ??? + 1.04 (2017-03-03) + monochrome BMP expansion + 1.03 ??? + 1.02 (2016-04-02) + avoid allocating large structures on the stack + 1.01 (2016-01-16) + STBIW_REALLOC_SIZED: support allocators with no realloc support + avoid race-condition in crc initialization + minor compile issues + 1.00 (2015-09-14) + installable file IO function + 0.99 (2015-09-13) + warning fixes; TGA rle support + 0.98 (2015-04-08) + added STBIW_MALLOC, STBIW_ASSERT etc + 0.97 (2015-01-18) + fixed HDR asserts, rewrote HDR rle logic + 0.96 (2015-01-17) + add HDR output + fix monochrome BMP + 0.95 (2014-08-17) + add monochrome TGA output + 0.94 (2014-05-31) + rename private functions to avoid conflicts with stb_image.h + 0.93 (2014-05-27) + warning fixes + 0.92 (2010-08-01) + casts to unsigned char to fix warnings + 0.91 (2010-07-17) + first public release + 0.90 first internal release +*/ + +/* +------------------------------------------------------------------------------ +This software is available under 2 licenses -- choose whichever you prefer. +------------------------------------------------------------------------------ +ALTERNATIVE A - MIT License +Copyright (c) 2017 Sean Barrett +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +------------------------------------------------------------------------------ +ALTERNATIVE B - Public Domain (www.unlicense.org) +This is free and unencumbered software released into the public domain. +Anyone is free to copy, modify, publish, use, compile, sell, or distribute this +software, either in source code form or as a compiled binary, for any purpose, +commercial or non-commercial, and by any means. +In jurisdictions that recognize copyright laws, the author or authors of this +software dedicate any and all copyright interest in the software to the public +domain. We make this dedication for the benefit of the public at large and to +the detriment of our heirs and successors. We intend this dedication to be an +overt act of relinquishment in perpetuity of all present and future rights to +this software under copyright law. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +------------------------------------------------------------------------------ +*/ diff --git a/tools/dkr_assets_tool_classes/libs/zip_file.hpp b/tools/dkr_assets_tool_classes/libs/zip_file.hpp new file mode 100755 index 00000000..e68f97f4 --- /dev/null +++ b/tools/dkr_assets_tool_classes/libs/zip_file.hpp @@ -0,0 +1,5714 @@ +// Copyright (c) 2014-2017 Thomas Fussell +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, WRISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE +// +// @license: http://www.opensource.org/licenses/mit-license.php + +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* miniz.c v1.15 - public domain deflate/inflate, zlib-subset, ZIP reading/writing/appending, PNG writing + See "unlicense" statement at the end of this file. + Rich Geldreich , last updated Oct. 13, 2013 + Implements RFC 1950: http://www.ietf.org/rfc/rfc1950.txt and RFC 1951: http://www.ietf.org/rfc/rfc1951.txt + + Most API's defined in miniz.c are optional. For example, to disable the archive related functions just define + MINIZ_NO_ARCHIVE_APIS, or to get rid of all stdio usage define MINIZ_NO_STDIO (see the list below for more macros). + + * Change History + 10/13/13 v1.15 r4 - Interim bugfix release while I work on the next major release with Zip64 support (almost there!): + - Critical fix for the MZ_ZIP_FLAG_DO_NOT_SORT_CENTRAL_DIRECTORY bug (thanks kahmyong.moon@hp.com) which could cause locate files to not find files. This bug + would only have occured in earlier versions if you explicitly used this flag, OR if you used mz_zip_extract_archive_file_to_heap() or mz_zip_add_mem_to_archive_file_in_place() + (which used this flag). If you can't switch to v1.15 but want to fix this bug, just remove the uses of this flag from both helper funcs (and of course don't use the flag). + - Bugfix in mz_zip_reader_extract_to_mem_no_alloc() from kymoon when pUser_read_buf is not NULL and compressed size is > uncompressed size + - Fixing mz_zip_reader_extract_*() funcs so they don't try to extract compressed data from directory entries, to account for weird zipfiles which contain zero-size compressed data on dir entries. + Hopefully this fix won't cause any issues on weird zip archives, because it assumes the low 16-bits of zip external attributes are DOS attributes (which I believe they always are in practice). + - Fixing mz_zip_reader_is_file_a_directory() so it doesn't check the internal attributes, just the filename and external attributes + - mz_zip_reader_init_file() - missing MZ_FCLOSE() call if the seek failed + - Added cmake support for Linux builds which builds all the examples, tested with clang v3.3 and gcc v4.6. + - Clang fix for tdefl_write_image_to_png_file_in_memory() from toffaletti + - Merged MZ_FORCEINLINE fix from hdeanclark + - Fix include before config #ifdef, thanks emil.brink + - Added tdefl_write_image_to_png_file_in_memory_ex(): supports Y flipping (super useful for OpenGL apps), and explicit control over the compression level (so you can + set it to 1 for real-time compression). + - Merged in some compiler fixes from paulharris's github repro. + - Retested this build under Windows (VS 2010, including static analysis), tcc 0.9.26, gcc v4.6 and clang v3.3. + - Added example6.c, which dumps an image of the mandelbrot set to a PNG file. + - Modified example2 to help test the MZ_ZIP_FLAG_DO_NOT_SORT_CENTRAL_DIRECTORY flag more. + - In r3: Bugfix to mz_zip_writer_add_file() found during merge: Fix possible src file fclose() leak if alignment bytes+local header file write faiiled + - In r4: Minor bugfix to mz_zip_writer_add_from_zip_reader(): Was pushing the wrong central dir header offset, appears harmless in this release, but it became a problem in the zip64 branch + 5/20/12 v1.14 - MinGW32/64 GCC 4.6.1 compiler fixes: added MZ_FORCEINLINE, #include (thanks fermtect). + 5/19/12 v1.13 - From jason@cornsyrup.org and kelwert@mtu.edu - Fix mz_crc32() so it doesn't compute the wrong CRC-32's when mz_ulong is 64-bit. + - Temporarily/locally slammed in "typedef unsigned long mz_ulong" and re-ran a randomized regression test on ~500k files. + - Eliminated a bunch of warnings when compiling with GCC 32-bit/64. + - Ran all examples, miniz.c, and tinfl.c through MSVC 2008's /analyze (static analysis) option and fixed all warnings (except for the silly + "Use of the comma-operator in a tested expression.." analysis warning, which I purposely use to work around a MSVC compiler warning). + - Created 32-bit and 64-bit Codeblocks projects/workspace. Built and tested Linux executables. The codeblocks workspace is compatible with Linux+Win32/x64. + - Added miniz_tester solution/project, which is a useful little app derived from LZHAM's tester app that I use as part of the regression test. + - Ran miniz.c and tinfl.c through another series of regression testing on ~500,000 files and archives. + - Modified example5.c so it purposely disables a bunch of high-level functionality (MINIZ_NO_STDIO, etc.). (Thanks to corysama for the MINIZ_NO_STDIO bug report.) + - Fix ftell() usage in examples so they exit with an error on files which are too large (a limitation of the examples, not miniz itself). + 4/12/12 v1.12 - More comments, added low-level example5.c, fixed a couple minor level_and_flags issues in the archive API's. + level_and_flags can now be set to MZ_DEFAULT_COMPRESSION. Thanks to Bruce Dawson for the feedback/bug report. + 5/28/11 v1.11 - Added statement from unlicense.org + 5/27/11 v1.10 - Substantial compressor optimizations: + - Level 1 is now ~4x faster than before. The L1 compressor's throughput now varies between 70-110MB/sec. on a + - Core i7 (actual throughput varies depending on the type of data, and x64 vs. x86). + - Improved baseline L2-L9 compression perf. Also, greatly improved compression perf. issues on some file types. + - Refactored the compression code for better readability and maintainability. + - Added level 10 compression level (L10 has slightly better ratio than level 9, but could have a potentially large + drop in throughput on some files). + 5/15/11 v1.09 - Initial stable release. + + * Low-level Deflate/Inflate implementation notes: + + Compression: Use the "tdefl" API's. The compressor supports raw, static, and dynamic blocks, lazy or + greedy parsing, match length filtering, RLE-only, and Huffman-only streams. It performs and compresses + approximately as well as zlib. + + Decompression: Use the "tinfl" API's. The entire decompressor is implemented as a single function + coroutine: see tinfl_decompress(). It supports decompression into a 32KB (or larger power of 2) wrapping buffer, or into a memory + block large enough to hold the entire file. + + The low-level tdefl/tinfl API's do not make any use of dynamic memory allocation. + + * zlib-style API notes: + + miniz.c implements a fairly large subset of zlib. There's enough functionality present for it to be a drop-in + zlib replacement in many apps: + The z_stream struct, optional memory allocation callbacks + deflateInit/deflateInit2/deflate/deflateReset/deflateEnd/deflateBound + inflateInit/inflateInit2/inflate/inflateEnd + compress, compress2, compressBound, uncompress + CRC-32, Adler-32 - Using modern, minimal code size, CPU cache friendly routines. + Supports raw deflate streams or standard zlib streams with adler-32 checking. + + Limitations: + The callback API's are not implemented yet. No support for gzip headers or zlib static dictionaries. + I've tried to closely emulate zlib's various flavors of stream flushing and return status codes, but + there are no guarantees that miniz.c pulls this off perfectly. + + * PNG writing: See the tdefl_write_image_to_png_file_in_memory() function, originally written by + Alex Evans. Supports 1-4 bytes/pixel images. + + * ZIP archive API notes: + + The ZIP archive API's where designed with simplicity and efficiency in mind, with just enough abstraction to + get the job done with minimal fuss. There are simple API's to retrieve file information, read files from + existing archives, create new archives, append new files to existing archives, or clone archive data from + one archive to another. It supports archives located in memory or the heap, on disk (using stdio.h), + or you can specify custom file read/write callbacks. + + - Archive reading: Just call this function to read a single file from a disk archive: + + void *mz_zip_extract_archive_file_to_heap(const char *pZip_filename, const char *pArchive_name, + size_t *pSize, mz_uint zip_flags); + + For more complex cases, use the "mz_zip_reader" functions. Upon opening an archive, the entire central + directory is located and read as-is into memory, and subsequent file access only occurs when reading individual files. + + - Archives file scanning: The simple way is to use this function to scan a loaded archive for a specific file: + + int mz_zip_reader_locate_file(mz_zip_archive *pZip, const char *pName, const char *pComment, mz_uint flags); + + The locate operation can optionally check file comments too, which (as one example) can be used to identify + multiple versions of the same file in an archive. This function uses a simple linear search through the central + directory, so it's not very fast. + + Alternately, you can iterate through all the files in an archive (using mz_zip_reader_get_num_files()) and + retrieve detailed info on each file by calling mz_zip_reader_file_stat(). + + - Archive creation: Use the "mz_zip_writer" functions. The ZIP writer immediately writes compressed file data + to disk and builds an exact image of the central directory in memory. The central directory image is written + all at once at the end of the archive file when the archive is finalized. + + The archive writer can optionally align each file's local header and file data to any power of 2 alignment, + which can be useful when the archive will be read from optical media. Also, the writer supports placing + arbitrary data blobs at the very beginning of ZIP archives. Archives written using either feature are still + readable by any ZIP tool. + + - Archive appending: The simple way to add a single file to an archive is to call this function: + + mz_bool mz_zip_add_mem_to_archive_file_in_place(const char *pZip_filename, const char *pArchive_name, + const void *pBuf, size_t buf_size, const void *pComment, mz_uint16 comment_size, mz_uint level_and_flags); + + The archive will be created if it doesn't already exist, otherwise it'll be appended to. + Note the appending is done in-place and is not an atomic operation, so if something goes wrong + during the operation it's possible the archive could be left without a central directory (although the local + file headers and file data will be fine, so the archive will be recoverable). + + For more complex archive modification scenarios: + 1. The safest way is to use a mz_zip_reader to read the existing archive, cloning only those bits you want to + preserve into a new archive using using the mz_zip_writer_add_from_zip_reader() function (which compiles the + compressed file data as-is). When you're done, delete the old archive and rename the newly written archive, and + you're done. This is safe but requires a bunch of temporary disk space or heap memory. + + 2. Or, you can convert an mz_zip_reader in-place to an mz_zip_writer using mz_zip_writer_init_from_reader(), + append new files as needed, then finalize the archive which will write an updated central directory to the + original archive. (This is basically what mz_zip_add_mem_to_archive_file_in_place() does.) There's a + possibility that the archive's central directory could be lost with this method if anything goes wrong, though. + + - ZIP archive support limitations: + No zip64 or spanning support. Extraction functions can only handle unencrypted, stored or deflated files. + Requires streams capable of seeking. + + * This is a header file library, like stb_image.c. To get only a header file, either cut and paste the + below header, or create miniz.h, #define MINIZ_HEADER_FILE_ONLY, and then include miniz.c from it. + + * Important: For best perf. be sure to customize the below macros for your target platform: + #define MINIZ_USE_UNALIGNED_LOADS_AND_STORES 1 + #define MINIZ_LITTLE_ENDIAN 1 + #define MINIZ_HAS_64BIT_REGISTERS 1 + + * On platforms using glibc, Be sure to "#define _LARGEFILE64_SOURCE 1" before including miniz.c to ensure miniz + uses the 64-bit variants: fopen64(), stat64(), etc. Otherwise you won't be able to process large files + (i.e. 32-bit stat() fails for me on files > 0x7FFFFFFF bytes). +*/ + +#ifndef MINIZ_HEADER_INCLUDED +#define MINIZ_HEADER_INCLUDED + +#include + +// Defines to completely disable specific portions of miniz.c: +// If all macros here are defined the only functionality remaining will be CRC-32, adler-32, tinfl, and tdefl. + +// Define MINIZ_NO_STDIO to disable all usage and any functions which rely on stdio for file I/O. +//#define MINIZ_NO_STDIO + +// If MINIZ_NO_TIME is specified then the ZIP archive functions will not be able to get the current time, or +// get/set file times, and the C run-time funcs that get/set times won't be called. +// The current downside is the times written to your archives will be from 1979. +//#define MINIZ_NO_TIME + +// Define MINIZ_NO_ARCHIVE_APIS to disable all ZIP archive API's. +//#define MINIZ_NO_ARCHIVE_APIS + +// Define MINIZ_NO_ARCHIVE_APIS to disable all writing related ZIP archive API's. +//#define MINIZ_NO_ARCHIVE_WRITING_APIS + +// Define MINIZ_NO_ZLIB_APIS to remove all ZLIB-style compression/decompression API's. +//#define MINIZ_NO_ZLIB_APIS + +// Define MINIZ_NO_ZLIB_COMPATIBLE_NAME to disable zlib names, to prevent conflicts against stock zlib. +//#define MINIZ_NO_ZLIB_COMPATIBLE_NAMES + +// Define MINIZ_NO_MALLOC to disable all calls to malloc, free, and realloc. +// Note if MINIZ_NO_MALLOC is defined then the user must always provide custom user alloc/free/realloc +// callbacks to the zlib and archive API's, and a few stand-alone helper API's which don't provide custom user +// functions (such as tdefl_compress_mem_to_heap() and tinfl_decompress_mem_to_heap()) won't work. +//#define MINIZ_NO_MALLOC + +#if defined(__TINYC__) && (defined(__linux) || defined(__linux__)) +// TODO: Work around "error: include file 'sys\utime.h' when compiling with tcc on Linux + #define MINIZ_NO_TIME +#endif + +#if !defined(MINIZ_NO_TIME) && !defined(MINIZ_NO_ARCHIVE_APIS) +#include +#endif + +#if defined(_M_IX86) || defined(_M_X64) || defined(__i386__) || defined(__i386) || defined(__i486__) || defined(__i486) || defined(i386) || defined(__ia64__) || defined(__x86_64__) +// MINIZ_X86_OR_X64_CPU is only used to help set the below macros. +#define MINIZ_X86_OR_X64_CPU 1 +#endif + +#if (__BYTE_ORDER__==__ORDER_LITTLE_ENDIAN__) || MINIZ_X86_OR_X64_CPU +// Set MINIZ_LITTLE_ENDIAN to 1 if the processor is little endian. +#define MINIZ_LITTLE_ENDIAN 1 +#endif + +#if MINIZ_X86_OR_X64_CPU +// Set MINIZ_USE_UNALIGNED_LOADS_AND_STORES to 1 on CPU's that permit efficient integer loads and stores from unaligned addresses. +#define MINIZ_USE_UNALIGNED_LOADS_AND_STORES 1 +#endif + +#if defined(_M_X64) || defined(_WIN64) || defined(__MINGW64__) || defined(_LP64) || defined(__LP64__) || defined(__ia64__) || defined(__x86_64__) +// Set MINIZ_HAS_64BIT_REGISTERS to 1 if operations on 64-bit integers are reasonably fast (and don't involve compiler generated calls to helper functions). +#define MINIZ_HAS_64BIT_REGISTERS 1 +#endif + +#ifdef __APPLE__ +#define ftello64 ftello +#define fseeko64 fseeko +#define fopen64 fopen +#define freopen64 freopen +//#define stat64 stat +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +// ------------------- zlib-style API Definitions. + +// For more compatibility with zlib, miniz.c uses unsigned long for some parameters/struct members. Beware: mz_ulong can be either 32 or 64-bits! +typedef unsigned long mz_ulong; + +// mz_free() internally uses the MZ_FREE() macro (which by default calls free() unless you've modified the MZ_MALLOC macro) to release a block allocated from the heap. +void mz_free(void *p); + +#define MZ_ADLER32_INIT (1) +// mz_adler32() returns the initial adler-32 value to use when called with ptr==NULL. +mz_ulong mz_adler32(mz_ulong adler, const unsigned char *ptr, size_t buf_len); + +#define MZ_CRC32_INIT (0) +// mz_crc32() returns the initial CRC-32 value to use when called with ptr==NULL. +mz_ulong mz_crc32(mz_ulong crc, const unsigned char *ptr, size_t buf_len); + +// Compression strategies. +enum { MZ_DEFAULT_STRATEGY = 0, MZ_FILTERED = 1, MZ_HUFFMAN_ONLY = 2, MZ_RLE = 3, MZ_FIXED = 4 }; + +// Method +#define MZ_DEFLATED 8 + +#ifndef MINIZ_NO_ZLIB_APIS + +// Heap allocation callbacks. +// Note that mz_alloc_func parameter types purpsosely differ from zlib's: items/size is size_t, not unsigned long. +typedef void *(*mz_alloc_func)(void *opaque, size_t items, size_t size); +typedef void (*mz_free_func)(void *opaque, void *address); +typedef void *(*mz_realloc_func)(void *opaque, void *address, size_t items, size_t size); + +#define MZ_VERSION "9.1.15" +#define MZ_VERNUM 0x91F0 +#define MZ_VER_MAJOR 9 +#define MZ_VER_MINOR 1 +#define MZ_VER_REVISION 15 +#define MZ_VER_SUBREVISION 0 + +// Flush values. For typical usage you only need MZ_NO_FLUSH and MZ_FINISH. The other values are for advanced use (refer to the zlib docs). +enum { MZ_NO_FLUSH = 0, MZ_PARTIAL_FLUSH = 1, MZ_SYNC_FLUSH = 2, MZ_FULL_FLUSH = 3, MZ_FINISH = 4, MZ_BLOCK = 5 }; + +// Return status codes. MZ_PARAM_ERROR is non-standard. +enum { MZ_OK = 0, MZ_STREAM_END = 1, MZ_NEED_DICT = 2, MZ_ERRNO = -1, MZ_STREAM_ERROR = -2, MZ_DATA_ERROR = -3, MZ_MEM_ERROR = -4, MZ_BUF_ERROR = -5, MZ_VERSION_ERROR = -6, MZ_PARAM_ERROR = -10000 }; + +// Compression levels: 0-9 are the standard zlib-style levels, 10 is best possible compression (not zlib compatible, and may be very slow), MZ_DEFAULT_COMPRESSION=MZ_DEFAULT_LEVEL. +enum { MZ_NO_COMPRESSION = 0, MZ_BEST_SPEED = 1, MZ_BEST_COMPRESSION = 9, MZ_UBER_COMPRESSION = 10, MZ_DEFAULT_LEVEL = 6, MZ_DEFAULT_COMPRESSION = -1 }; + +// Window bits +#define MZ_DEFAULT_WINDOW_BITS 15 + +struct mz_internal_state; + +// Compression/decompression stream struct. +typedef struct mz_stream_s +{ + const unsigned char *next_in; // pointer to next byte to read + unsigned int avail_in; // number of bytes available at next_in + mz_ulong total_in; // total number of bytes consumed so far + + unsigned char *next_out; // pointer to next byte to write + unsigned int avail_out; // number of bytes that can be written to next_out + mz_ulong total_out; // total number of bytes produced so far + + char *msg; // error msg (unused) + struct mz_internal_state *state; // internal state, allocated by zalloc/zfree + + mz_alloc_func zalloc; // optional heap allocation function (defaults to malloc) + mz_free_func zfree; // optional heap free function (defaults to free) + void *opaque; // heap alloc function user pointer + + int data_type; // data_type (unused) + mz_ulong adler; // adler32 of the source or uncompressed data + mz_ulong reserved; // not used +} mz_stream; + +typedef mz_stream *mz_streamp; + +// Returns the version string of miniz.c. +const char *mz_version(void); + +// mz_deflateInit() initializes a compressor with default options: +// Parameters: +// pStream must point to an initialized mz_stream struct. +// level must be between [MZ_NO_COMPRESSION, MZ_BEST_COMPRESSION]. +// level 1 enables a specially optimized compression function that's been optimized purely for performance, not ratio. +// (This special func. is currently only enabled when MINIZ_USE_UNALIGNED_LOADS_AND_STORES and MINIZ_LITTLE_ENDIAN are defined.) +// Return values: +// MZ_OK on success. +// MZ_STREAM_ERROR if the stream is bogus. +// MZ_PARAM_ERROR if the input parameters are bogus. +// MZ_MEM_ERROR on out of memory. +int mz_deflateInit(mz_streamp pStream, int level); + +// mz_deflateInit2() is like mz_deflate(), except with more control: +// Additional parameters: +// method must be MZ_DEFLATED +// window_bits must be MZ_DEFAULT_WINDOW_BITS (to wrap the deflate stream with zlib header/adler-32 footer) or -MZ_DEFAULT_WINDOW_BITS (raw deflate/no header or footer) +// mem_level must be between [1, 9] (it's checked but ignored by miniz.c) +int mz_deflateInit2(mz_streamp pStream, int level, int method, int window_bits, int mem_level, int strategy); + +// Quickly resets a compressor without having to reallocate anything. Same as calling mz_deflateEnd() followed by mz_deflateInit()/mz_deflateInit2(). +int mz_deflateReset(mz_streamp pStream); + +// mz_deflate() compresses the input to output, consuming as much of the input and producing as much output as possible. +// Parameters: +// pStream is the stream to read from and write to. You must initialize/update the next_in, avail_in, next_out, and avail_out members. +// flush may be MZ_NO_FLUSH, MZ_PARTIAL_FLUSH/MZ_SYNC_FLUSH, MZ_FULL_FLUSH, or MZ_FINISH. +// Return values: +// MZ_OK on success (when flushing, or if more input is needed but not available, and/or there's more output to be written but the output buffer is full). +// MZ_STREAM_END if all input has been consumed and all output bytes have been written. Don't call mz_deflate() on the stream anymore. +// MZ_STREAM_ERROR if the stream is bogus. +// MZ_PARAM_ERROR if one of the parameters is invalid. +// MZ_BUF_ERROR if no forward progress is possible because the input and/or output buffers are empty. (Fill up the input buffer or free up some output space and try again.) +int mz_deflate(mz_streamp pStream, int flush); + +// mz_deflateEnd() deinitializes a compressor: +// Return values: +// MZ_OK on success. +// MZ_STREAM_ERROR if the stream is bogus. +int mz_deflateEnd(mz_streamp pStream); + +// mz_deflateBound() returns a (very) conservative upper bound on the amount of data that could be generated by deflate(), assuming flush is set to only MZ_NO_FLUSH or MZ_FINISH. +mz_ulong mz_deflateBound(mz_streamp pStream, mz_ulong source_len); + +// Single-call compression functions mz_compress() and mz_compress2(): +// Returns MZ_OK on success, or one of the error codes from mz_deflate() on failure. +int mz_compress(unsigned char *pDest, mz_ulong *pDest_len, const unsigned char *pSource, mz_ulong source_len); +int mz_compress2(unsigned char *pDest, mz_ulong *pDest_len, const unsigned char *pSource, mz_ulong source_len, int level); + +// mz_compressBound() returns a (very) conservative upper bound on the amount of data that could be generated by calling mz_compress(). +mz_ulong mz_compressBound(mz_ulong source_len); + +// Initializes a decompressor. +int mz_inflateInit(mz_streamp pStream); + +// mz_inflateInit2() is like mz_inflateInit() with an additional option that controls the window size and whether or not the stream has been wrapped with a zlib header/footer: +// window_bits must be MZ_DEFAULT_WINDOW_BITS (to parse zlib header/footer) or -MZ_DEFAULT_WINDOW_BITS (raw deflate). +int mz_inflateInit2(mz_streamp pStream, int window_bits); + +// Decompresses the input stream to the output, consuming only as much of the input as needed, and writing as much to the output as possible. +// Parameters: +// pStream is the stream to read from and write to. You must initialize/update the next_in, avail_in, next_out, and avail_out members. +// flush may be MZ_NO_FLUSH, MZ_SYNC_FLUSH, or MZ_FINISH. +// On the first call, if flush is MZ_FINISH it's assumed the input and output buffers are both sized large enough to decompress the entire stream in a single call (this is slightly faster). +// MZ_FINISH implies that there are no more source bytes available beside what's already in the input buffer, and that the output buffer is large enough to hold the rest of the decompressed data. +// Return values: +// MZ_OK on success. Either more input is needed but not available, and/or there's more output to be written but the output buffer is full. +// MZ_STREAM_END if all needed input has been consumed and all output bytes have been written. For zlib streams, the adler-32 of the decompressed data has also been verified. +// MZ_STREAM_ERROR if the stream is bogus. +// MZ_DATA_ERROR if the deflate stream is invalid. +// MZ_PARAM_ERROR if one of the parameters is invalid. +// MZ_BUF_ERROR if no forward progress is possible because the input buffer is empty but the inflater needs more input to continue, or if the output buffer is not large enough. Call mz_inflate() again +// with more input data, or with more room in the output buffer (except when using single call decompression, described above). +int mz_inflate(mz_streamp pStream, int flush); + +// Deinitializes a decompressor. +int mz_inflateEnd(mz_streamp pStream); + +// Single-call decompression. +// Returns MZ_OK on success, or one of the error codes from mz_inflate() on failure. +int mz_uncompress(unsigned char *pDest, mz_ulong *pDest_len, const unsigned char *pSource, mz_ulong source_len); + +// Returns a string description of the specified error code, or NULL if the error code is invalid. +const char *mz_error(int err); + +// Redefine zlib-compatible names to miniz equivalents, so miniz.c can be used as a drop-in replacement for the subset of zlib that miniz.c supports. +// Define MINIZ_NO_ZLIB_COMPATIBLE_NAMES to disable zlib-compatibility if you use zlib in the same project. +#ifndef MINIZ_NO_ZLIB_COMPATIBLE_NAMES +typedef unsigned char Byte; +typedef unsigned int uInt; +typedef mz_ulong uLong; +typedef Byte Bytef; +typedef uInt uIntf; +typedef char charf; +typedef int intf; +typedef void *voidpf; +typedef uLong uLongf; +typedef void *voidp; +typedef void *const voidpc; +#define Z_NULL 0 +#define Z_NO_FLUSH MZ_NO_FLUSH +#define Z_PARTIAL_FLUSH MZ_PARTIAL_FLUSH +#define Z_SYNC_FLUSH MZ_SYNC_FLUSH +#define Z_FULL_FLUSH MZ_FULL_FLUSH +#define Z_FINISH MZ_FINISH +#define Z_BLOCK MZ_BLOCK +#define Z_OK MZ_OK +#define Z_STREAM_END MZ_STREAM_END +#define Z_NEED_DICT MZ_NEED_DICT +#define Z_ERRNO MZ_ERRNO +#define Z_STREAM_ERROR MZ_STREAM_ERROR +#define Z_DATA_ERROR MZ_DATA_ERROR +#define Z_MEM_ERROR MZ_MEM_ERROR +#define Z_BUF_ERROR MZ_BUF_ERROR +#define Z_VERSION_ERROR MZ_VERSION_ERROR +#define Z_PARAM_ERROR MZ_PARAM_ERROR +#define Z_NO_COMPRESSION MZ_NO_COMPRESSION +#define Z_BEST_SPEED MZ_BEST_SPEED +#define Z_BEST_COMPRESSION MZ_BEST_COMPRESSION +#define Z_DEFAULT_COMPRESSION MZ_DEFAULT_COMPRESSION +#define Z_DEFAULT_STRATEGY MZ_DEFAULT_STRATEGY +#define Z_FILTERED MZ_FILTERED +#define Z_HUFFMAN_ONLY MZ_HUFFMAN_ONLY +#define Z_RLE MZ_RLE +#define Z_FIXED MZ_FIXED +#define Z_DEFLATED MZ_DEFLATED +#define Z_DEFAULT_WINDOW_BITS MZ_DEFAULT_WINDOW_BITS +#define alloc_func mz_alloc_func +#define free_func mz_free_func +#define internal_state mz_internal_state +#define z_stream mz_stream +#define deflateInit mz_deflateInit +#define deflateInit2 mz_deflateInit2 +#define deflateReset mz_deflateReset +#define deflate mz_deflate +#define deflateEnd mz_deflateEnd +#define deflateBound mz_deflateBound +#define compress mz_compress +#define compress2 mz_compress2 +#define compressBound mz_compressBound +#define inflateInit mz_inflateInit +#define inflateInit2 mz_inflateInit2 +#define inflate mz_inflate +#define inflateEnd mz_inflateEnd +#define uncompress mz_uncompress +#define crc32 mz_crc32 +#define adler32 mz_adler32 +#define MAX_WBITS 15 +#define MAX_MEM_LEVEL 9 +#define zError mz_error +#define ZLIB_VERSION MZ_VERSION +#define ZLIB_VERNUM MZ_VERNUM +#define ZLIB_VER_MAJOR MZ_VER_MAJOR +#define ZLIB_VER_MINOR MZ_VER_MINOR +#define ZLIB_VER_REVISION MZ_VER_REVISION +#define ZLIB_VER_SUBREVISION MZ_VER_SUBREVISION +#define zlibVersion mz_version +#define zlib_version mz_version() +#endif // #ifndef MINIZ_NO_ZLIB_COMPATIBLE_NAMES + +#endif // MINIZ_NO_ZLIB_APIS + +// ------------------- Types and macros + +typedef unsigned char mz_uint8; +typedef signed short mz_int16; +typedef unsigned short mz_uint16; +typedef unsigned int mz_uint32; +typedef unsigned int mz_uint; +typedef long long mz_int64; +typedef unsigned long long mz_uint64; +typedef int mz_bool; + +#define MZ_FALSE (0) +#define MZ_TRUE (1) + +// An attempt to work around MSVC's spammy "warning C4127: conditional expression is constant" message. +#ifdef _MSC_VER +#define MZ_MACRO_END while (0, 0) +#else +#define MZ_MACRO_END while (0) +#endif + +// ------------------- ZIP archive reading/writing + +#ifndef MINIZ_NO_ARCHIVE_APIS + +enum +{ + MZ_ZIP_MAX_IO_BUF_SIZE = 64*1024, + MZ_ZIP_MAX_ARCHIVE_FILENAME_SIZE = 260, + MZ_ZIP_MAX_ARCHIVE_FILE_COMMENT_SIZE = 256 +}; + +typedef struct +{ + mz_uint32 m_file_index; + mz_uint32 m_central_dir_ofs; + mz_uint16 m_version_made_by; + mz_uint16 m_version_needed; + mz_uint16 m_bit_flag; + mz_uint16 m_method; +#ifndef MINIZ_NO_TIME + time_t m_time; +#endif + mz_uint32 m_crc32; + mz_uint64 m_comp_size; + mz_uint64 m_uncomp_size; + mz_uint16 m_internal_attr; + mz_uint32 m_external_attr; + mz_uint64 m_local_header_ofs; + mz_uint32 m_comment_size; + char m_filename[MZ_ZIP_MAX_ARCHIVE_FILENAME_SIZE]; + char m_comment[MZ_ZIP_MAX_ARCHIVE_FILE_COMMENT_SIZE]; +} mz_zip_archive_file_stat; + +typedef size_t (*mz_file_read_func)(void *pOpaque, mz_uint64 file_ofs, void *pBuf, size_t n); +typedef size_t (*mz_file_write_func)(void *pOpaque, mz_uint64 file_ofs, const void *pBuf, size_t n); + +struct mz_zip_internal_state_tag; +typedef struct mz_zip_internal_state_tag mz_zip_internal_state; + +typedef enum +{ + MZ_ZIP_MODE_INVALID = 0, + MZ_ZIP_MODE_READING = 1, + MZ_ZIP_MODE_WRITING = 2, + MZ_ZIP_MODE_WRITING_HAS_BEEN_FINALIZED = 3 +} mz_zip_mode; + +typedef struct mz_zip_archive_tag +{ + mz_uint64 m_archive_size; + mz_uint64 m_central_directory_file_ofs; + mz_uint m_total_files; + mz_zip_mode m_zip_mode; + + mz_uint m_file_offset_alignment; + + mz_alloc_func m_pAlloc; + mz_free_func m_pFree; + mz_realloc_func m_pRealloc; + void *m_pAlloc_opaque; + + mz_file_read_func m_pRead; + mz_file_write_func m_pWrite; + void *m_pIO_opaque; + + mz_zip_internal_state *m_pState; + +} mz_zip_archive; + +typedef enum +{ + MZ_ZIP_FLAG_CASE_SENSITIVE = 0x0100, + MZ_ZIP_FLAG_IGNORE_PATH = 0x0200, + MZ_ZIP_FLAG_COMPRESSED_DATA = 0x0400, + MZ_ZIP_FLAG_DO_NOT_SORT_CENTRAL_DIRECTORY = 0x0800 +} mz_zip_flags; + +// ZIP archive reading + +// Inits a ZIP archive reader. +// These functions read and validate the archive's central directory. +mz_bool mz_zip_reader_init(mz_zip_archive *pZip, mz_uint64 size, mz_uint32 flags); +mz_bool mz_zip_reader_init_mem(mz_zip_archive *pZip, const void *pMem, size_t size, mz_uint32 flags); + +#ifndef MINIZ_NO_STDIO +mz_bool mz_zip_reader_init_file(mz_zip_archive *pZip, const char *pFilename, mz_uint32 flags); +#endif + +// Returns the total number of files in the archive. +mz_uint mz_zip_reader_get_num_files(mz_zip_archive *pZip); + +// Returns detailed information about an archive file entry. +mz_bool mz_zip_reader_file_stat(mz_zip_archive *pZip, mz_uint file_index, mz_zip_archive_file_stat *pStat); + +// Determines if an archive file entry is a directory entry. +mz_bool mz_zip_reader_is_file_a_directory(mz_zip_archive *pZip, mz_uint file_index); +mz_bool mz_zip_reader_is_file_encrypted(mz_zip_archive *pZip, mz_uint file_index); + +// Retrieves the filename of an archive file entry. +// Returns the number of bytes written to pFilename, or if filename_buf_size is 0 this function returns the number of bytes needed to fully store the filename. +mz_uint mz_zip_reader_get_filename(mz_zip_archive *pZip, mz_uint file_index, char *pFilename, mz_uint filename_buf_size); + +// Attempts to locates a file in the archive's central directory. +// Valid flags: MZ_ZIP_FLAG_CASE_SENSITIVE, MZ_ZIP_FLAG_IGNORE_PATH +// Returns -1 if the file cannot be found. +int mz_zip_reader_locate_file(mz_zip_archive *pZip, const char *pName, const char *pComment, mz_uint flags); + +// Extracts a archive file to a memory buffer using no memory allocation. +mz_bool mz_zip_reader_extract_to_mem_no_alloc(mz_zip_archive *pZip, mz_uint file_index, void *pBuf, size_t buf_size, mz_uint flags, void *pUser_read_buf, size_t user_read_buf_size); +mz_bool mz_zip_reader_extract_file_to_mem_no_alloc(mz_zip_archive *pZip, const char *pFilename, void *pBuf, size_t buf_size, mz_uint flags, void *pUser_read_buf, size_t user_read_buf_size); + +// Extracts a archive file to a memory buffer. +mz_bool mz_zip_reader_extract_to_mem(mz_zip_archive *pZip, mz_uint file_index, void *pBuf, size_t buf_size, mz_uint flags); +mz_bool mz_zip_reader_extract_file_to_mem(mz_zip_archive *pZip, const char *pFilename, void *pBuf, size_t buf_size, mz_uint flags); + +// Extracts a archive file to a dynamically allocated heap buffer. +void *mz_zip_reader_extract_to_heap(mz_zip_archive *pZip, mz_uint file_index, size_t *pSize, mz_uint flags); +void *mz_zip_reader_extract_file_to_heap(mz_zip_archive *pZip, const char *pFilename, size_t *pSize, mz_uint flags); + +// Extracts a archive file using a callback function to output the file's data. +mz_bool mz_zip_reader_extract_to_callback(mz_zip_archive *pZip, mz_uint file_index, mz_file_write_func pCallback, void *pOpaque, mz_uint flags); +mz_bool mz_zip_reader_extract_file_to_callback(mz_zip_archive *pZip, const char *pFilename, mz_file_write_func pCallback, void *pOpaque, mz_uint flags); + +#ifndef MINIZ_NO_STDIO +// Extracts a archive file to a disk file and sets its last accessed and modified times. +// This function only extracts files, not archive directory records. +mz_bool mz_zip_reader_extract_to_file(mz_zip_archive *pZip, mz_uint file_index, const char *pDst_filename, mz_uint flags); +mz_bool mz_zip_reader_extract_file_to_file(mz_zip_archive *pZip, const char *pArchive_filename, const char *pDst_filename, mz_uint flags); +#endif + +// Ends archive reading, freeing all allocations, and closing the input archive file if mz_zip_reader_init_file() was used. +mz_bool mz_zip_reader_end(mz_zip_archive *pZip); + +// ZIP archive writing + +#ifndef MINIZ_NO_ARCHIVE_WRITING_APIS + +// Inits a ZIP archive writer. +mz_bool mz_zip_writer_init(mz_zip_archive *pZip, mz_uint64 existing_size); +mz_bool mz_zip_writer_init_heap(mz_zip_archive *pZip, size_t size_to_reserve_at_beginning, size_t initial_allocation_size); + +#ifndef MINIZ_NO_STDIO +mz_bool mz_zip_writer_init_file(mz_zip_archive *pZip, const char *pFilename, mz_uint64 size_to_reserve_at_beginning); +#endif + +// Converts a ZIP archive reader object into a writer object, to allow efficient in-place file appends to occur on an existing archive. +// For archives opened using mz_zip_reader_init_file, pFilename must be the archive's filename so it can be reopened for writing. If the file can't be reopened, mz_zip_reader_end() will be called. +// For archives opened using mz_zip_reader_init_mem, the memory block must be growable using the realloc callback (which defaults to realloc unless you've overridden it). +// Finally, for archives opened using mz_zip_reader_init, the mz_zip_archive's user provided m_pWrite function cannot be NULL. +// Note: In-place archive modification is not recommended unless you know what you're doing, because if execution stops or something goes wrong before +// the archive is finalized the file's central directory will be hosed. +mz_bool mz_zip_writer_init_from_reader(mz_zip_archive *pZip, const char *pFilename); + +// Adds the contents of a memory buffer to an archive. These functions record the current local time into the archive. +// To add a directory entry, call this method with an archive name ending in a forwardslash with empty buffer. +// level_and_flags - compression level (0-10, see MZ_BEST_SPEED, MZ_BEST_COMPRESSION, etc.) logically OR'd with zero or more mz_zip_flags, or just set to MZ_DEFAULT_COMPRESSION. +mz_bool mz_zip_writer_add_mem(mz_zip_archive *pZip, const char *pArchive_name, const void *pBuf, size_t buf_size, mz_uint level_and_flags); +mz_bool mz_zip_writer_add_mem_ex(mz_zip_archive *pZip, const char *pArchive_name, const void *pBuf, size_t buf_size, const void *pComment, mz_uint16 comment_size, mz_uint level_and_flags, mz_uint64 uncomp_size, mz_uint32 uncomp_crc32); + +#ifndef MINIZ_NO_STDIO +// Adds the contents of a disk file to an archive. This function also records the disk file's modified time into the archive. +// level_and_flags - compression level (0-10, see MZ_BEST_SPEED, MZ_BEST_COMPRESSION, etc.) logically OR'd with zero or more mz_zip_flags, or just set to MZ_DEFAULT_COMPRESSION. +mz_bool mz_zip_writer_add_file(mz_zip_archive *pZip, const char *pArchive_name, const char *pSrc_filename, const void *pComment, mz_uint16 comment_size, mz_uint level_and_flags); +#endif + +// Adds a file to an archive by fully cloning the data from another archive. +// This function fully clones the source file's compressed data (no recompression), along with its full filename, extra data, and comment fields. +mz_bool mz_zip_writer_add_from_zip_reader(mz_zip_archive *pZip, mz_zip_archive *pSource_zip, mz_uint file_index); + +// Finalizes the archive by writing the central directory records followed by the end of central directory record. +// After an archive is finalized, the only valid call on the mz_zip_archive struct is mz_zip_writer_end(). +// An archive must be manually finalized by calling this function for it to be valid. +mz_bool mz_zip_writer_finalize_archive(mz_zip_archive *pZip); +mz_bool mz_zip_writer_finalize_heap_archive(mz_zip_archive *pZip, void **pBuf, size_t *pSize); + +// Ends archive writing, freeing all allocations, and closing the output file if mz_zip_writer_init_file() was used. +// Note for the archive to be valid, it must have been finalized before ending. +mz_bool mz_zip_writer_end(mz_zip_archive *pZip); + +// Misc. high-level helper functions: + +// mz_zip_add_mem_to_archive_file_in_place() efficiently (but not atomically) appends a memory blob to a ZIP archive. +// level_and_flags - compression level (0-10, see MZ_BEST_SPEED, MZ_BEST_COMPRESSION, etc.) logically OR'd with zero or more mz_zip_flags, or just set to MZ_DEFAULT_COMPRESSION. +mz_bool mz_zip_add_mem_to_archive_file_in_place(const char *pZip_filename, const char *pArchive_name, const void *pBuf, size_t buf_size, const void *pComment, mz_uint16 comment_size, mz_uint level_and_flags); + +// Reads a single file from an archive into a heap block. +// Returns NULL on failure. +void *mz_zip_extract_archive_file_to_heap(const char *pZip_filename, const char *pArchive_name, size_t *pSize, mz_uint zip_flags); + +#endif // #ifndef MINIZ_NO_ARCHIVE_WRITING_APIS + +#endif // #ifndef MINIZ_NO_ARCHIVE_APIS + +// ------------------- Low-level Decompression API Definitions + +// Decompression flags used by tinfl_decompress(). +// TINFL_FLAG_PARSE_ZLIB_HEADER: If set, the input has a valid zlib header and ends with an adler32 checksum (it's a valid zlib stream). Otherwise, the input is a raw deflate stream. +// TINFL_FLAG_HAS_MORE_INPUT: If set, there are more input bytes available beyond the end of the supplied input buffer. If clear, the input buffer contains all remaining input. +// TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF: If set, the output buffer is large enough to hold the entire decompressed stream. If clear, the output buffer is at least the size of the dictionary (typically 32KB). +// TINFL_FLAG_COMPUTE_ADLER32: Force adler-32 checksum computation of the decompressed bytes. +enum +{ + TINFL_FLAG_PARSE_ZLIB_HEADER = 1, + TINFL_FLAG_HAS_MORE_INPUT = 2, + TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF = 4, + TINFL_FLAG_COMPUTE_ADLER32 = 8 +}; + +// High level decompression functions: +// tinfl_decompress_mem_to_heap() decompresses a block in memory to a heap block allocated via malloc(). +// On entry: +// pSrc_buf, src_buf_len: Pointer and size of the Deflate or zlib source data to decompress. +// On return: +// Function returns a pointer to the decompressed data, or NULL on failure. +// *pOut_len will be set to the decompressed data's size, which could be larger than src_buf_len on uncompressible data. +// The caller must call mz_free() on the returned block when it's no longer needed. +void *tinfl_decompress_mem_to_heap(const void *pSrc_buf, size_t src_buf_len, size_t *pOut_len, int flags); + +// tinfl_decompress_mem_to_mem() decompresses a block in memory to another block in memory. +// Returns TINFL_DECOMPRESS_MEM_TO_MEM_FAILED on failure, or the number of bytes written on success. +#define TINFL_DECOMPRESS_MEM_TO_MEM_FAILED ((size_t)(-1)) +size_t tinfl_decompress_mem_to_mem(void *pOut_buf, size_t out_buf_len, const void *pSrc_buf, size_t src_buf_len, int flags); + +// tinfl_decompress_mem_to_callback() decompresses a block in memory to an internal 32KB buffer, and a user provided callback function will be called to flush the buffer. +// Returns 1 on success or 0 on failure. +typedef int (*tinfl_put_buf_func_ptr)(const void* pBuf, int len, void *pUser); +int tinfl_decompress_mem_to_callback(const void *pIn_buf, size_t *pIn_buf_size, tinfl_put_buf_func_ptr pPut_buf_func, void *pPut_buf_user, int flags); + +struct tinfl_decompressor_tag; typedef struct tinfl_decompressor_tag tinfl_decompressor; + +// Max size of LZ dictionary. +#define TINFL_LZ_DICT_SIZE 32768 + +// Return status. +typedef enum +{ + TINFL_STATUS_BAD_PARAM = -3, + TINFL_STATUS_ADLER32_MISMATCH = -2, + TINFL_STATUS_FAILED = -1, + TINFL_STATUS_DONE = 0, + TINFL_STATUS_NEEDS_MORE_INPUT = 1, + TINFL_STATUS_HAS_MORE_OUTPUT = 2 +} tinfl_status; + +// Initializes the decompressor to its initial state. +#define tinfl_init(r) do { (r)->m_state = 0; } MZ_MACRO_END +#define tinfl_get_adler32(r) (r)->m_check_adler32 + +// Main low-level decompressor coroutine function. This is the only function actually needed for decompression. All the other functions are just high-level helpers for improved usability. +// This is a universal API, i.e. it can be used as a building block to build any desired higher level decompression API. In the limit case, it can be called once per every byte input or output. +tinfl_status tinfl_decompress(tinfl_decompressor *r, const mz_uint8 *pIn_buf_next, size_t *pIn_buf_size, mz_uint8 *pOut_buf_start, mz_uint8 *pOut_buf_next, size_t *pOut_buf_size, const mz_uint32 decomp_flags); + +// Internal/private bits follow. +enum +{ + TINFL_MAX_HUFF_TABLES = 3, TINFL_MAX_HUFF_SYMBOLS_0 = 288, TINFL_MAX_HUFF_SYMBOLS_1 = 32, TINFL_MAX_HUFF_SYMBOLS_2 = 19, + TINFL_FAST_LOOKUP_BITS = 10, TINFL_FAST_LOOKUP_SIZE = 1 << TINFL_FAST_LOOKUP_BITS +}; + +typedef struct +{ + mz_uint8 m_code_size[TINFL_MAX_HUFF_SYMBOLS_0]; + mz_int16 m_look_up[TINFL_FAST_LOOKUP_SIZE], m_tree[TINFL_MAX_HUFF_SYMBOLS_0 * 2]; +} tinfl_huff_table; + +#if MINIZ_HAS_64BIT_REGISTERS +#define TINFL_USE_64BIT_BITBUF 1 +#endif + +#if TINFL_USE_64BIT_BITBUF +typedef mz_uint64 tinfl_bit_buf_t; +#define TINFL_BITBUF_SIZE (64) +#else +typedef mz_uint32 tinfl_bit_buf_t; + #define TINFL_BITBUF_SIZE (32) +#endif + +struct tinfl_decompressor_tag +{ + mz_uint32 m_state, m_num_bits, m_zhdr0, m_zhdr1, m_z_adler32, m_final, m_type, m_check_adler32, m_dist, m_counter, m_num_extra, m_table_sizes[TINFL_MAX_HUFF_TABLES]; + tinfl_bit_buf_t m_bit_buf; + size_t m_dist_from_out_buf_start; + tinfl_huff_table m_tables[TINFL_MAX_HUFF_TABLES]; + mz_uint8 m_raw_header[4], m_len_codes[TINFL_MAX_HUFF_SYMBOLS_0 + TINFL_MAX_HUFF_SYMBOLS_1 + 137]; +}; + +// ------------------- Low-level Compression API Definitions + +// Set TDEFL_LESS_MEMORY to 1 to use less memory (compression will be slightly slower, and raw/dynamic blocks will be output more frequently). +#define TDEFL_LESS_MEMORY 0 + +// tdefl_init() compression flags logically OR'd together (low 12 bits contain the max. number of probes per dictionary search): +// TDEFL_DEFAULT_MAX_PROBES: The compressor defaults to 128 dictionary probes per dictionary search. 0=Huffman only, 1=Huffman+LZ (fastest/crap compression), 4095=Huffman+LZ (slowest/best compression). +enum +{ + TDEFL_HUFFMAN_ONLY = 0, TDEFL_DEFAULT_MAX_PROBES = 128, TDEFL_MAX_PROBES_MASK = 0xFFF +}; + +// TDEFL_WRITE_ZLIB_HEADER: If set, the compressor outputs a zlib header before the deflate data, and the Adler-32 of the source data at the end. Otherwise, you'll get raw deflate data. +// TDEFL_COMPUTE_ADLER32: Always compute the adler-32 of the input data (even when not writing zlib headers). +// TDEFL_GREEDY_PARSING_FLAG: Set to use faster greedy parsing, instead of more efficient lazy parsing. +// TDEFL_NONDETERMINISTIC_PARSING_FLAG: Enable to decrease the compressor's initialization time to the minimum, but the output may vary from run to run given the same input (depending on the contents of memory). +// TDEFL_RLE_MATCHES: Only look for RLE matches (matches with a distance of 1) +// TDEFL_FILTER_MATCHES: Discards matches <= 5 chars if enabled. +// TDEFL_FORCE_ALL_STATIC_BLOCKS: Disable usage of optimized Huffman tables. +// TDEFL_FORCE_ALL_RAW_BLOCKS: Only use raw (uncompressed) deflate blocks. +// The low 12 bits are reserved to control the max # of hash probes per dictionary lookup (see TDEFL_MAX_PROBES_MASK). +enum +{ + TDEFL_WRITE_ZLIB_HEADER = 0x01000, + TDEFL_COMPUTE_ADLER32 = 0x02000, + TDEFL_GREEDY_PARSING_FLAG = 0x04000, + TDEFL_NONDETERMINISTIC_PARSING_FLAG = 0x08000, + TDEFL_RLE_MATCHES = 0x10000, + TDEFL_FILTER_MATCHES = 0x20000, + TDEFL_FORCE_ALL_STATIC_BLOCKS = 0x40000, + TDEFL_FORCE_ALL_RAW_BLOCKS = 0x80000 +}; + +// High level compression functions: +// tdefl_compress_mem_to_heap() compresses a block in memory to a heap block allocated via malloc(). +// On entry: +// pSrc_buf, src_buf_len: Pointer and size of source block to compress. +// flags: The max match finder probes (default is 128) logically OR'd against the above flags. Higher probes are slower but improve compression. +// On return: +// Function returns a pointer to the compressed data, or NULL on failure. +// *pOut_len will be set to the compressed data's size, which could be larger than src_buf_len on uncompressible data. +// The caller must free() the returned block when it's no longer needed. +void *tdefl_compress_mem_to_heap(const void *pSrc_buf, size_t src_buf_len, size_t *pOut_len, int flags); + +// tdefl_compress_mem_to_mem() compresses a block in memory to another block in memory. +// Returns 0 on failure. +size_t tdefl_compress_mem_to_mem(void *pOut_buf, size_t out_buf_len, const void *pSrc_buf, size_t src_buf_len, int flags); + +// Compresses an image to a compressed PNG file in memory. +// On entry: +// pImage, w, h, and num_chans describe the image to compress. num_chans may be 1, 2, 3, or 4. +// The image pitch in bytes per scanline will be w*num_chans. The leftmost pixel on the top scanline is stored first in memory. +// level may range from [0,10], use MZ_NO_COMPRESSION, MZ_BEST_SPEED, MZ_BEST_COMPRESSION, etc. or a decent default is MZ_DEFAULT_LEVEL +// If flip is true, the image will be flipped on the Y axis (useful for OpenGL apps). +// On return: +// Function returns a pointer to the compressed data, or NULL on failure. +// *pLen_out will be set to the size of the PNG image file. +// The caller must mz_free() the returned heap block (which will typically be larger than *pLen_out) when it's no longer needed. +void *tdefl_write_image_to_png_file_in_memory_ex(const void *pImage, int w, int h, int num_chans, size_t *pLen_out, mz_uint level, mz_bool flip); +void *tdefl_write_image_to_png_file_in_memory(const void *pImage, int w, int h, int num_chans, size_t *pLen_out); + +// Output stream interface. The compressor uses this interface to write compressed data. It'll typically be called TDEFL_OUT_BUF_SIZE at a time. +typedef mz_bool (*tdefl_put_buf_func_ptr)(const void* pBuf, int len, void *pUser); + +// tdefl_compress_mem_to_output() compresses a block to an output stream. The above helpers use this function internally. +mz_bool tdefl_compress_mem_to_output(const void *pBuf, size_t buf_len, tdefl_put_buf_func_ptr pPut_buf_func, void *pPut_buf_user, int flags); + +enum { TDEFL_MAX_HUFF_TABLES = 3, TDEFL_MAX_HUFF_SYMBOLS_0 = 288, TDEFL_MAX_HUFF_SYMBOLS_1 = 32, TDEFL_MAX_HUFF_SYMBOLS_2 = 19, TDEFL_LZ_DICT_SIZE = 32768, TDEFL_LZ_DICT_SIZE_MASK = TDEFL_LZ_DICT_SIZE - 1, TDEFL_MIN_MATCH_LEN = 3, TDEFL_MAX_MATCH_LEN = 258 }; + +// TDEFL_OUT_BUF_SIZE MUST be large enough to hold a single entire compressed output block (using static/fixed Huffman codes). +#if TDEFL_LESS_MEMORY +enum { TDEFL_LZ_CODE_BUF_SIZE = 24 * 1024, TDEFL_OUT_BUF_SIZE = (TDEFL_LZ_CODE_BUF_SIZE * 13 ) / 10, TDEFL_MAX_HUFF_SYMBOLS = 288, TDEFL_LZ_HASH_BITS = 12, TDEFL_LEVEL1_HASH_SIZE_MASK = 4095, TDEFL_LZ_HASH_SHIFT = (TDEFL_LZ_HASH_BITS + 2) / 3, TDEFL_LZ_HASH_SIZE = 1 << TDEFL_LZ_HASH_BITS }; +#else +enum { TDEFL_LZ_CODE_BUF_SIZE = 64 * 1024, TDEFL_OUT_BUF_SIZE = (TDEFL_LZ_CODE_BUF_SIZE * 13 ) / 10, TDEFL_MAX_HUFF_SYMBOLS = 288, TDEFL_LZ_HASH_BITS = 15, TDEFL_LEVEL1_HASH_SIZE_MASK = 4095, TDEFL_LZ_HASH_SHIFT = (TDEFL_LZ_HASH_BITS + 2) / 3, TDEFL_LZ_HASH_SIZE = 1 << TDEFL_LZ_HASH_BITS }; +#endif + +// The low-level tdefl functions below may be used directly if the above helper functions aren't flexible enough. The low-level functions don't make any heap allocations, unlike the above helper functions. +typedef enum +{ + TDEFL_STATUS_BAD_PARAM = -2, + TDEFL_STATUS_PUT_BUF_FAILED = -1, + TDEFL_STATUS_OKAY = 0, + TDEFL_STATUS_DONE = 1, +} tdefl_status; + +// Must map to MZ_NO_FLUSH, MZ_SYNC_FLUSH, etc. enums +typedef enum +{ + TDEFL_NO_FLUSH = 0, + TDEFL_SYNC_FLUSH = 2, + TDEFL_FULL_FLUSH = 3, + TDEFL_FINISH = 4 +} tdefl_flush; + +// tdefl's compression state structure. +typedef struct +{ + tdefl_put_buf_func_ptr m_pPut_buf_func; + void *m_pPut_buf_user; + mz_uint m_flags, m_max_probes[2]; + int m_greedy_parsing; + mz_uint m_adler32, m_lookahead_pos, m_lookahead_size, m_dict_size; + mz_uint8 *m_pLZ_code_buf, *m_pLZ_flags, *m_pOutput_buf, *m_pOutput_buf_end; + mz_uint m_num_flags_left, m_total_lz_bytes, m_lz_code_buf_dict_pos, m_bits_in, m_bit_buffer; + mz_uint m_saved_match_dist, m_saved_match_len, m_saved_lit, m_output_flush_ofs, m_output_flush_remaining, m_finished, m_block_index, m_wants_to_finish; + tdefl_status m_prev_return_status; + const void *m_pIn_buf; + void *m_pOut_buf; + size_t *m_pIn_buf_size, *m_pOut_buf_size; + tdefl_flush m_flush; + const mz_uint8 *m_pSrc; + size_t m_src_buf_left, m_out_buf_ofs; + mz_uint8 m_dict[TDEFL_LZ_DICT_SIZE + TDEFL_MAX_MATCH_LEN - 1]; + mz_uint16 m_huff_count[TDEFL_MAX_HUFF_TABLES][TDEFL_MAX_HUFF_SYMBOLS]; + mz_uint16 m_huff_codes[TDEFL_MAX_HUFF_TABLES][TDEFL_MAX_HUFF_SYMBOLS]; + mz_uint8 m_huff_code_sizes[TDEFL_MAX_HUFF_TABLES][TDEFL_MAX_HUFF_SYMBOLS]; + mz_uint8 m_lz_code_buf[TDEFL_LZ_CODE_BUF_SIZE]; + mz_uint16 m_next[TDEFL_LZ_DICT_SIZE]; + mz_uint16 m_hash[TDEFL_LZ_HASH_SIZE]; + mz_uint8 m_output_buf[TDEFL_OUT_BUF_SIZE]; +} tdefl_compressor; + +// Initializes the compressor. +// There is no corresponding deinit() function because the tdefl API's do not dynamically allocate memory. +// pBut_buf_func: If NULL, output data will be supplied to the specified callback. In this case, the user should call the tdefl_compress_buffer() API for compression. +// If pBut_buf_func is NULL the user should always call the tdefl_compress() API. +// flags: See the above enums (TDEFL_HUFFMAN_ONLY, TDEFL_WRITE_ZLIB_HEADER, etc.) +tdefl_status tdefl_init(tdefl_compressor *d, tdefl_put_buf_func_ptr pPut_buf_func, void *pPut_buf_user, int flags); + +// Compresses a block of data, consuming as much of the specified input buffer as possible, and writing as much compressed data to the specified output buffer as possible. +tdefl_status tdefl_compress(tdefl_compressor *d, const void *pIn_buf, size_t *pIn_buf_size, void *pOut_buf, size_t *pOut_buf_size, tdefl_flush flush); + +// tdefl_compress_buffer() is only usable when the tdefl_init() is called with a non-NULL tdefl_put_buf_func_ptr. +// tdefl_compress_buffer() always consumes the entire input buffer. +tdefl_status tdefl_compress_buffer(tdefl_compressor *d, const void *pIn_buf, size_t in_buf_size, tdefl_flush flush); + +tdefl_status tdefl_get_prev_return_status(tdefl_compressor *d); +mz_uint32 tdefl_get_adler32(tdefl_compressor *d); + +// Can't use tdefl_create_comp_flags_from_zip_params if MINIZ_NO_ZLIB_APIS isn't defined, because it uses some of its macros. +#ifndef MINIZ_NO_ZLIB_APIS +// Create tdefl_compress() flags given zlib-style compression parameters. +// level may range from [0,10] (where 10 is absolute max compression, but may be much slower on some files) +// window_bits may be -15 (raw deflate) or 15 (zlib) +// strategy may be either MZ_DEFAULT_STRATEGY, MZ_FILTERED, MZ_HUFFMAN_ONLY, MZ_RLE, or MZ_FIXED +mz_uint tdefl_create_comp_flags_from_zip_params(int level, int window_bits, int strategy); +#endif // #ifndef MINIZ_NO_ZLIB_APIS + +#ifdef __cplusplus +} +#endif + +#endif // MINIZ_HEADER_INCLUDED + +// ------------------- End of Header: Implementation follows. (If you only want the header, define MINIZ_HEADER_FILE_ONLY.) + +#ifndef MINIZ_HEADER_FILE_ONLY + +typedef unsigned char mz_validate_uint16[sizeof(mz_uint16)==2 ? 1 : -1]; +typedef unsigned char mz_validate_uint32[sizeof(mz_uint32)==4 ? 1 : -1]; +typedef unsigned char mz_validate_uint64[sizeof(mz_uint64)==8 ? 1 : -1]; + +#include +#include + +#define MZ_ASSERT(x) assert(x) + +#ifdef MINIZ_NO_MALLOC +#define MZ_MALLOC(x) NULL + #define MZ_FREE(x) (void)x, ((void)0) + #define MZ_REALLOC(p, x) NULL +#else +#define MZ_MALLOC(x) malloc(x) +#define MZ_FREE(x) free(x) +#define MZ_REALLOC(p, x) realloc(p, x) +#endif + +#define MZ_MAX(a,b) (((a)>(b))?(a):(b)) +#define MZ_MIN(a,b) (((a)<(b))?(a):(b)) +#define MZ_CLEAR_OBJ(obj) memset(&(obj), 0, sizeof(obj)) + +#if MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN +#define MZ_READ_LE16(p) *((const mz_uint16 *)(p)) +#define MZ_READ_LE32(p) *((const mz_uint32 *)(p)) +#else +#define MZ_READ_LE16(p) ((mz_uint32)(((const mz_uint8 *)(p))[0]) | ((mz_uint32)(((const mz_uint8 *)(p))[1]) << 8U)) + #define MZ_READ_LE32(p) ((mz_uint32)(((const mz_uint8 *)(p))[0]) | ((mz_uint32)(((const mz_uint8 *)(p))[1]) << 8U) | ((mz_uint32)(((const mz_uint8 *)(p))[2]) << 16U) | ((mz_uint32)(((const mz_uint8 *)(p))[3]) << 24U)) +#endif + +#ifdef _MSC_VER +#define MZ_FORCEINLINE __forceinline +#elif defined(__GNUC__) +#define MZ_FORCEINLINE inline __attribute__((__always_inline__)) +#else +#define MZ_FORCEINLINE inline +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +// ------------------- zlib-style API's + +mz_ulong mz_adler32(mz_ulong adler, const unsigned char *ptr, size_t buf_len) +{ + mz_uint32 i, s1 = (mz_uint32)(adler & 0xffff), s2 = (mz_uint32)(adler >> 16); size_t block_len = buf_len % 5552; + if (!ptr) return MZ_ADLER32_INIT; + while (buf_len) { + for (i = 0; i + 7 < block_len; i += 8, ptr += 8) { + s1 += ptr[0], s2 += s1; s1 += ptr[1], s2 += s1; s1 += ptr[2], s2 += s1; s1 += ptr[3], s2 += s1; + s1 += ptr[4], s2 += s1; s1 += ptr[5], s2 += s1; s1 += ptr[6], s2 += s1; s1 += ptr[7], s2 += s1; + } + for ( ; i < block_len; ++i) s1 += *ptr++, s2 += s1; + s1 %= 65521U, s2 %= 65521U; buf_len -= block_len; block_len = 5552; + } + return (s2 << 16) + s1; +} + +// Karl Malbrain's compact CRC-32. See "A compact CCITT crc16 and crc32 C implementation that balances processor cache usage against speed": http://www.geocities.com/malbrain/ +mz_ulong mz_crc32(mz_ulong crc, const mz_uint8 *ptr, size_t buf_len) +{ + static const mz_uint32 s_crc32[16] = { 0, 0x1db71064, 0x3b6e20c8, 0x26d930ac, 0x76dc4190, 0x6b6b51f4, 0x4db26158, 0x5005713c, + 0xedb88320, 0xf00f9344, 0xd6d6a3e8, 0xcb61b38c, 0x9b64c2b0, 0x86d3d2d4, 0xa00ae278, 0xbdbdf21c }; + mz_uint32 crcu32 = (mz_uint32)crc; + if (!ptr) return MZ_CRC32_INIT; + crcu32 = ~crcu32; while (buf_len--) { mz_uint8 b = *ptr++; crcu32 = (crcu32 >> 4) ^ s_crc32[(crcu32 & 0xF) ^ (b & 0xF)]; crcu32 = (crcu32 >> 4) ^ s_crc32[(crcu32 & 0xF) ^ (b >> 4)]; } + return ~crcu32; +} + +void mz_free(void *p) +{ + MZ_FREE(p); +} + +#ifndef MINIZ_NO_ZLIB_APIS + +static void *def_alloc_func(void *opaque, size_t items, size_t size) { (void)opaque, (void)items, (void)size; return MZ_MALLOC(items * size); } +static void def_free_func(void *opaque, void *address) { (void)opaque, (void)address; MZ_FREE(address); } +static void *def_realloc_func(void *opaque, void *address, size_t items, size_t size) { (void)opaque, (void)address, (void)items, (void)size; return MZ_REALLOC(address, items * size); } + +const char *mz_version(void) +{ + return MZ_VERSION; +} + +int mz_deflateInit(mz_streamp pStream, int level) +{ + return mz_deflateInit2(pStream, level, MZ_DEFLATED, MZ_DEFAULT_WINDOW_BITS, 9, MZ_DEFAULT_STRATEGY); +} + +int mz_deflateInit2(mz_streamp pStream, int level, int method, int window_bits, int mem_level, int strategy) +{ + tdefl_compressor *pComp; + mz_uint comp_flags = TDEFL_COMPUTE_ADLER32 | tdefl_create_comp_flags_from_zip_params(level, window_bits, strategy); + + if (!pStream) return MZ_STREAM_ERROR; + if ((method != MZ_DEFLATED) || ((mem_level < 1) || (mem_level > 9)) || ((window_bits != MZ_DEFAULT_WINDOW_BITS) && (-window_bits != MZ_DEFAULT_WINDOW_BITS))) return MZ_PARAM_ERROR; + + pStream->data_type = 0; + pStream->adler = MZ_ADLER32_INIT; + pStream->msg = NULL; + pStream->reserved = 0; + pStream->total_in = 0; + pStream->total_out = 0; + if (!pStream->zalloc) pStream->zalloc = def_alloc_func; + if (!pStream->zfree) pStream->zfree = def_free_func; + + pComp = (tdefl_compressor *)pStream->zalloc(pStream->opaque, 1, sizeof(tdefl_compressor)); + if (!pComp) + return MZ_MEM_ERROR; + + pStream->state = (struct mz_internal_state *)pComp; + + if (tdefl_init(pComp, NULL, NULL, comp_flags) != TDEFL_STATUS_OKAY) + { + mz_deflateEnd(pStream); + return MZ_PARAM_ERROR; + } + + return MZ_OK; +} + +int mz_deflateReset(mz_streamp pStream) +{ + if ((!pStream) || (!pStream->state) || (!pStream->zalloc) || (!pStream->zfree)) return MZ_STREAM_ERROR; + pStream->total_in = pStream->total_out = 0; + tdefl_init((tdefl_compressor*)pStream->state, NULL, NULL, ((tdefl_compressor*)pStream->state)->m_flags); + return MZ_OK; +} + +int mz_deflate(mz_streamp pStream, int flush) +{ + size_t in_bytes, out_bytes; + mz_ulong orig_total_in, orig_total_out; + int mz_status = MZ_OK; + + if ((!pStream) || (!pStream->state) || (flush < 0) || (flush > MZ_FINISH) || (!pStream->next_out)) return MZ_STREAM_ERROR; + if (!pStream->avail_out) return MZ_BUF_ERROR; + + if (flush == MZ_PARTIAL_FLUSH) flush = MZ_SYNC_FLUSH; + + if (((tdefl_compressor*)pStream->state)->m_prev_return_status == TDEFL_STATUS_DONE) + return (flush == MZ_FINISH) ? MZ_STREAM_END : MZ_BUF_ERROR; + + orig_total_in = pStream->total_in; orig_total_out = pStream->total_out; + for ( ; ; ) + { + tdefl_status defl_status; + in_bytes = pStream->avail_in; out_bytes = pStream->avail_out; + + defl_status = tdefl_compress((tdefl_compressor*)pStream->state, pStream->next_in, &in_bytes, pStream->next_out, &out_bytes, (tdefl_flush)flush); + pStream->next_in += (mz_uint)in_bytes; pStream->avail_in -= (mz_uint)in_bytes; + pStream->total_in += (mz_uint)in_bytes; pStream->adler = tdefl_get_adler32((tdefl_compressor*)pStream->state); + + pStream->next_out += (mz_uint)out_bytes; pStream->avail_out -= (mz_uint)out_bytes; + pStream->total_out += (mz_uint)out_bytes; + + if (defl_status < 0) + { + mz_status = MZ_STREAM_ERROR; + break; + } + else if (defl_status == TDEFL_STATUS_DONE) + { + mz_status = MZ_STREAM_END; + break; + } + else if (!pStream->avail_out) + break; + else if ((!pStream->avail_in) && (flush != MZ_FINISH)) + { + if ((flush) || (pStream->total_in != orig_total_in) || (pStream->total_out != orig_total_out)) + break; + return MZ_BUF_ERROR; // Can't make forward progress without some input. + } + } + return mz_status; +} + +int mz_deflateEnd(mz_streamp pStream) +{ + if (!pStream) return MZ_STREAM_ERROR; + if (pStream->state) + { + pStream->zfree(pStream->opaque, pStream->state); + pStream->state = NULL; + } + return MZ_OK; +} + +mz_ulong mz_deflateBound(mz_streamp pStream, mz_ulong source_len) +{ + (void)pStream; + // This is really over conservative. (And lame, but it's actually pretty tricky to compute a true upper bound given the way tdefl's blocking works.) + return MZ_MAX(128 + (source_len * 110) / 100, 128 + source_len + ((source_len / (31 * 1024)) + 1) * 5); +} + +int mz_compress2(unsigned char *pDest, mz_ulong *pDest_len, const unsigned char *pSource, mz_ulong source_len, int level) +{ + int status; + mz_stream stream; + memset(&stream, 0, sizeof(stream)); + + // In case mz_ulong is 64-bits (argh I hate longs). + if ((source_len | *pDest_len) > 0xFFFFFFFFU) return MZ_PARAM_ERROR; + + stream.next_in = pSource; + stream.avail_in = (mz_uint32)source_len; + stream.next_out = pDest; + stream.avail_out = (mz_uint32)*pDest_len; + + status = mz_deflateInit(&stream, level); + if (status != MZ_OK) return status; + + status = mz_deflate(&stream, MZ_FINISH); + if (status != MZ_STREAM_END) + { + mz_deflateEnd(&stream); + return (status == MZ_OK) ? MZ_BUF_ERROR : status; + } + + *pDest_len = stream.total_out; + return mz_deflateEnd(&stream); +} + +int mz_compress(unsigned char *pDest, mz_ulong *pDest_len, const unsigned char *pSource, mz_ulong source_len) +{ + return mz_compress2(pDest, pDest_len, pSource, source_len, MZ_DEFAULT_COMPRESSION); +} + +mz_ulong mz_compressBound(mz_ulong source_len) +{ + return mz_deflateBound(NULL, source_len); +} + +typedef struct +{ + tinfl_decompressor m_decomp; + mz_uint m_dict_ofs, m_dict_avail, m_first_call, m_has_flushed; int m_window_bits; + mz_uint8 m_dict[TINFL_LZ_DICT_SIZE]; + tinfl_status m_last_status; +} inflate_state; + +int mz_inflateInit2(mz_streamp pStream, int window_bits) +{ + inflate_state *pDecomp; + if (!pStream) return MZ_STREAM_ERROR; + if ((window_bits != MZ_DEFAULT_WINDOW_BITS) && (-window_bits != MZ_DEFAULT_WINDOW_BITS)) return MZ_PARAM_ERROR; + + pStream->data_type = 0; + pStream->adler = 0; + pStream->msg = NULL; + pStream->total_in = 0; + pStream->total_out = 0; + pStream->reserved = 0; + if (!pStream->zalloc) pStream->zalloc = def_alloc_func; + if (!pStream->zfree) pStream->zfree = def_free_func; + + pDecomp = (inflate_state*)pStream->zalloc(pStream->opaque, 1, sizeof(inflate_state)); + if (!pDecomp) return MZ_MEM_ERROR; + + pStream->state = (struct mz_internal_state *)pDecomp; + + tinfl_init(&pDecomp->m_decomp); + pDecomp->m_dict_ofs = 0; + pDecomp->m_dict_avail = 0; + pDecomp->m_last_status = TINFL_STATUS_NEEDS_MORE_INPUT; + pDecomp->m_first_call = 1; + pDecomp->m_has_flushed = 0; + pDecomp->m_window_bits = window_bits; + + return MZ_OK; +} + +int mz_inflateInit(mz_streamp pStream) +{ + return mz_inflateInit2(pStream, MZ_DEFAULT_WINDOW_BITS); +} + +int mz_inflate(mz_streamp pStream, int flush) +{ + inflate_state* pState; + mz_uint n, first_call, decomp_flags = TINFL_FLAG_COMPUTE_ADLER32; + size_t in_bytes, out_bytes, orig_avail_in; + tinfl_status status; + + if ((!pStream) || (!pStream->state)) return MZ_STREAM_ERROR; + if (flush == MZ_PARTIAL_FLUSH) flush = MZ_SYNC_FLUSH; + if ((flush) && (flush != MZ_SYNC_FLUSH) && (flush != MZ_FINISH)) return MZ_STREAM_ERROR; + + pState = (inflate_state*)pStream->state; + if (pState->m_window_bits > 0) decomp_flags |= TINFL_FLAG_PARSE_ZLIB_HEADER; + orig_avail_in = pStream->avail_in; + + first_call = pState->m_first_call; pState->m_first_call = 0; + if (pState->m_last_status < 0) return MZ_DATA_ERROR; + + if (pState->m_has_flushed && (flush != MZ_FINISH)) return MZ_STREAM_ERROR; + pState->m_has_flushed |= (flush == MZ_FINISH); + + if ((flush == MZ_FINISH) && (first_call)) + { + // MZ_FINISH on the first call implies that the input and output buffers are large enough to hold the entire compressed/decompressed file. + decomp_flags |= TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF; + in_bytes = pStream->avail_in; out_bytes = pStream->avail_out; + status = tinfl_decompress(&pState->m_decomp, pStream->next_in, &in_bytes, pStream->next_out, pStream->next_out, &out_bytes, decomp_flags); + pState->m_last_status = status; + pStream->next_in += (mz_uint)in_bytes; pStream->avail_in -= (mz_uint)in_bytes; pStream->total_in += (mz_uint)in_bytes; + pStream->adler = tinfl_get_adler32(&pState->m_decomp); + pStream->next_out += (mz_uint)out_bytes; pStream->avail_out -= (mz_uint)out_bytes; pStream->total_out += (mz_uint)out_bytes; + + if (status < 0) + return MZ_DATA_ERROR; + else if (status != TINFL_STATUS_DONE) + { + pState->m_last_status = TINFL_STATUS_FAILED; + return MZ_BUF_ERROR; + } + return MZ_STREAM_END; + } + // flush != MZ_FINISH then we must assume there's more input. + if (flush != MZ_FINISH) decomp_flags |= TINFL_FLAG_HAS_MORE_INPUT; + + if (pState->m_dict_avail) + { + n = MZ_MIN(pState->m_dict_avail, pStream->avail_out); + memcpy(pStream->next_out, pState->m_dict + pState->m_dict_ofs, n); + pStream->next_out += n; pStream->avail_out -= n; pStream->total_out += n; + pState->m_dict_avail -= n; pState->m_dict_ofs = (pState->m_dict_ofs + n) & (TINFL_LZ_DICT_SIZE - 1); + return ((pState->m_last_status == TINFL_STATUS_DONE) && (!pState->m_dict_avail)) ? MZ_STREAM_END : MZ_OK; + } + + for ( ; ; ) + { + in_bytes = pStream->avail_in; + out_bytes = TINFL_LZ_DICT_SIZE - pState->m_dict_ofs; + + status = tinfl_decompress(&pState->m_decomp, pStream->next_in, &in_bytes, pState->m_dict, pState->m_dict + pState->m_dict_ofs, &out_bytes, decomp_flags); + pState->m_last_status = status; + + pStream->next_in += (mz_uint)in_bytes; pStream->avail_in -= (mz_uint)in_bytes; + pStream->total_in += (mz_uint)in_bytes; pStream->adler = tinfl_get_adler32(&pState->m_decomp); + + pState->m_dict_avail = (mz_uint)out_bytes; + + n = MZ_MIN(pState->m_dict_avail, pStream->avail_out); + memcpy(pStream->next_out, pState->m_dict + pState->m_dict_ofs, n); + pStream->next_out += n; pStream->avail_out -= n; pStream->total_out += n; + pState->m_dict_avail -= n; pState->m_dict_ofs = (pState->m_dict_ofs + n) & (TINFL_LZ_DICT_SIZE - 1); + + if (status < 0) + return MZ_DATA_ERROR; // Stream is corrupted (there could be some uncompressed data left in the output dictionary - oh well). + else if ((status == TINFL_STATUS_NEEDS_MORE_INPUT) && (!orig_avail_in)) + return MZ_BUF_ERROR; // Signal caller that we can't make forward progress without supplying more input or by setting flush to MZ_FINISH. + else if (flush == MZ_FINISH) + { + // The output buffer MUST be large to hold the remaining uncompressed data when flush==MZ_FINISH. + if (status == TINFL_STATUS_DONE) + return pState->m_dict_avail ? MZ_BUF_ERROR : MZ_STREAM_END; + // status here must be TINFL_STATUS_HAS_MORE_OUTPUT, which means there's at least 1 more byte on the way. If there's no more room left in the output buffer then something is wrong. + else if (!pStream->avail_out) + return MZ_BUF_ERROR; + } + else if ((status == TINFL_STATUS_DONE) || (!pStream->avail_in) || (!pStream->avail_out) || (pState->m_dict_avail)) + break; + } + + return ((status == TINFL_STATUS_DONE) && (!pState->m_dict_avail)) ? MZ_STREAM_END : MZ_OK; +} + +int mz_inflateEnd(mz_streamp pStream) +{ + if (!pStream) + return MZ_STREAM_ERROR; + if (pStream->state) + { + pStream->zfree(pStream->opaque, pStream->state); + pStream->state = NULL; + } + return MZ_OK; +} + +int mz_uncompress(unsigned char *pDest, mz_ulong *pDest_len, const unsigned char *pSource, mz_ulong source_len) +{ + mz_stream stream; + int status; + memset(&stream, 0, sizeof(stream)); + + // In case mz_ulong is 64-bits (argh I hate longs). + if ((source_len | *pDest_len) > 0xFFFFFFFFU) return MZ_PARAM_ERROR; + + stream.next_in = pSource; + stream.avail_in = (mz_uint32)source_len; + stream.next_out = pDest; + stream.avail_out = (mz_uint32)*pDest_len; + + status = mz_inflateInit(&stream); + if (status != MZ_OK) + return status; + + status = mz_inflate(&stream, MZ_FINISH); + if (status != MZ_STREAM_END) + { + mz_inflateEnd(&stream); + return ((status == MZ_BUF_ERROR) && (!stream.avail_in)) ? MZ_DATA_ERROR : status; + } + *pDest_len = stream.total_out; + + return mz_inflateEnd(&stream); +} + +const char *mz_error(int err) +{ + static struct { int m_err; const char *m_pDesc; } s_error_descs[] = + { + { MZ_OK, "" }, { MZ_STREAM_END, "stream end" }, { MZ_NEED_DICT, "need dictionary" }, { MZ_ERRNO, "file error" }, { MZ_STREAM_ERROR, "stream error" }, + { MZ_DATA_ERROR, "data error" }, { MZ_MEM_ERROR, "out of memory" }, { MZ_BUF_ERROR, "buf error" }, { MZ_VERSION_ERROR, "version error" }, { MZ_PARAM_ERROR, "parameter error" } + }; + mz_uint i; for (i = 0; i < sizeof(s_error_descs) / sizeof(s_error_descs[0]); ++i) if (s_error_descs[i].m_err == err) return s_error_descs[i].m_pDesc; + return NULL; +} + +#endif //MINIZ_NO_ZLIB_APIS + +// ------------------- Low-level Decompression (completely independent from all compression API's) + +#define TINFL_MEMCPY(d, s, l) memcpy(d, s, l) +#define TINFL_MEMSET(p, c, l) memset(p, c, l) + +#define TINFL_CR_BEGIN switch(r->m_state) { case 0: +#define TINFL_CR_RETURN(state_index, result) do { status = result; r->m_state = state_index; goto common_exit; case state_index:; } MZ_MACRO_END +#define TINFL_CR_RETURN_FOREVER(state_index, result) do { for ( ; ; ) { TINFL_CR_RETURN(state_index, result); } } MZ_MACRO_END +#define TINFL_CR_FINISH } + +// TODO: If the caller has indicated that there's no more input, and we attempt to read beyond the input buf, then something is wrong with the input because the inflator never +// reads ahead more than it needs to. Currently TINFL_GET_BYTE() pads the end of the stream with 0's in this scenario. +#define TINFL_GET_BYTE(state_index, c) do { \ + if (pIn_buf_cur >= pIn_buf_end) { \ + for ( ; ; ) { \ + if (decomp_flags & TINFL_FLAG_HAS_MORE_INPUT) { \ + TINFL_CR_RETURN(state_index, TINFL_STATUS_NEEDS_MORE_INPUT); \ + if (pIn_buf_cur < pIn_buf_end) { \ + c = *pIn_buf_cur++; \ + break; \ + } \ + } else { \ + c = 0; \ + break; \ + } \ + } \ + } else c = *pIn_buf_cur++; } MZ_MACRO_END + +#define TINFL_NEED_BITS(state_index, n) do { mz_uint c; TINFL_GET_BYTE(state_index, c); bit_buf |= (((tinfl_bit_buf_t)c) << num_bits); num_bits += 8; } while (num_bits < (mz_uint)(n)) +#define TINFL_SKIP_BITS(state_index, n) do { if (num_bits < (mz_uint)(n)) { TINFL_NEED_BITS(state_index, n); } bit_buf >>= (n); num_bits -= (n); } MZ_MACRO_END +#define TINFL_GET_BITS(state_index, b, n) do { if (num_bits < (mz_uint)(n)) { TINFL_NEED_BITS(state_index, n); } b = bit_buf & ((1 << (n)) - 1); bit_buf >>= (n); num_bits -= (n); } MZ_MACRO_END + +// TINFL_HUFF_BITBUF_FILL() is only used rarely, when the number of bytes remaining in the input buffer falls below 2. +// It reads just enough bytes from the input stream that are needed to decode the next Huffman code (and absolutely no more). It works by trying to fully decode a +// Huffman code by using whatever bits are currently present in the bit buffer. If this fails, it reads another byte, and tries again until it succeeds or until the +// bit buffer contains >=15 bits (deflate's max. Huffman code size). +#define TINFL_HUFF_BITBUF_FILL(state_index, pHuff) \ + do { \ + temp = (pHuff)->m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]; \ + if (temp >= 0) { \ + code_len = temp >> 9; \ + if ((code_len) && (num_bits >= code_len)) \ + break; \ + } else if (num_bits > TINFL_FAST_LOOKUP_BITS) { \ + code_len = TINFL_FAST_LOOKUP_BITS; \ + do { \ + temp = (pHuff)->m_tree[~temp + ((bit_buf >> code_len++) & 1)]; \ + } while ((temp < 0) && (num_bits >= (code_len + 1))); if (temp >= 0) break; \ + } TINFL_GET_BYTE(state_index, c); bit_buf |= (((tinfl_bit_buf_t)c) << num_bits); num_bits += 8; \ + } while (num_bits < 15); + +// TINFL_HUFF_DECODE() decodes the next Huffman coded symbol. It's more complex than you would initially expect because the zlib API expects the decompressor to never read +// beyond the final byte of the deflate stream. (In other words, when this macro wants to read another byte from the input, it REALLY needs another byte in order to fully +// decode the next Huffman code.) Handling this properly is particularly important on raw deflate (non-zlib) streams, which aren't followed by a byte aligned adler-32. +// The slow path is only executed at the very end of the input buffer. +#define TINFL_HUFF_DECODE(state_index, sym, pHuff) do { \ + int temp; mz_uint code_len, c; \ + if (num_bits < 15) { \ + if ((pIn_buf_end - pIn_buf_cur) < 2) { \ + TINFL_HUFF_BITBUF_FILL(state_index, pHuff); \ + } else { \ + bit_buf |= (((tinfl_bit_buf_t)pIn_buf_cur[0]) << num_bits) | (((tinfl_bit_buf_t)pIn_buf_cur[1]) << (num_bits + 8)); pIn_buf_cur += 2; num_bits += 16; \ + } \ + } \ + if ((temp = (pHuff)->m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]) >= 0) \ + code_len = temp >> 9, temp &= 511; \ + else { \ + code_len = TINFL_FAST_LOOKUP_BITS; do { temp = (pHuff)->m_tree[~temp + ((bit_buf >> code_len++) & 1)]; } while (temp < 0); \ + } sym = temp; bit_buf >>= code_len; num_bits -= code_len; } MZ_MACRO_END + +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable : 4334) +#endif + +tinfl_status tinfl_decompress(tinfl_decompressor *r, const mz_uint8 *pIn_buf_next, size_t *pIn_buf_size, mz_uint8 *pOut_buf_start, mz_uint8 *pOut_buf_next, size_t *pOut_buf_size, const mz_uint32 decomp_flags) +{ + static const int s_length_base[31] = { 3,4,5,6,7,8,9,10,11,13, 15,17,19,23,27,31,35,43,51,59, 67,83,99,115,131,163,195,227,258,0,0 }; + static const int s_length_extra[31]= { 0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0 }; + static const int s_dist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193, 257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0}; + static const int s_dist_extra[32] = { 0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13}; + static const mz_uint8 s_length_dezigzag[19] = { 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15 }; + static const int s_min_table_sizes[3] = { 257, 1, 4 }; + + tinfl_status status = TINFL_STATUS_FAILED; mz_uint32 num_bits, dist, counter, num_extra; tinfl_bit_buf_t bit_buf; + const mz_uint8 *pIn_buf_cur = pIn_buf_next, *const pIn_buf_end = pIn_buf_next + *pIn_buf_size; + mz_uint8 *pOut_buf_cur = pOut_buf_next, *const pOut_buf_end = pOut_buf_next + *pOut_buf_size; + size_t out_buf_size_mask = (decomp_flags & TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF) ? (size_t)-1 : ((pOut_buf_next - pOut_buf_start) + *pOut_buf_size) - 1, dist_from_out_buf_start; + + // Ensure the output buffer's size is a power of 2, unless the output buffer is large enough to hold the entire output file (in which case it doesn't matter). + if (((out_buf_size_mask + 1) & out_buf_size_mask) || (pOut_buf_next < pOut_buf_start)) { *pIn_buf_size = *pOut_buf_size = 0; return TINFL_STATUS_BAD_PARAM; } + + num_bits = r->m_num_bits; bit_buf = r->m_bit_buf; dist = r->m_dist; counter = r->m_counter; num_extra = r->m_num_extra; dist_from_out_buf_start = r->m_dist_from_out_buf_start; + TINFL_CR_BEGIN + + bit_buf = num_bits = dist = counter = num_extra = r->m_zhdr0 = r->m_zhdr1 = 0; r->m_z_adler32 = r->m_check_adler32 = 1; + if (decomp_flags & TINFL_FLAG_PARSE_ZLIB_HEADER) + { + TINFL_GET_BYTE(1, r->m_zhdr0); TINFL_GET_BYTE(2, r->m_zhdr1); + counter = (((r->m_zhdr0 * 256 + r->m_zhdr1) % 31 != 0) || (r->m_zhdr1 & 32) || ((r->m_zhdr0 & 15) != 8)); + if (!(decomp_flags & TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF)) counter |= (((1U << (8U + (r->m_zhdr0 >> 4))) > 32768U) || ((out_buf_size_mask + 1) < (size_t)(1U << (8U + (r->m_zhdr0 >> 4))))); + if (counter) { TINFL_CR_RETURN_FOREVER(36, TINFL_STATUS_FAILED); } + } + + do + { + TINFL_GET_BITS(3, r->m_final, 3); r->m_type = r->m_final >> 1; + if (r->m_type == 0) + { + TINFL_SKIP_BITS(5, num_bits & 7); + for (counter = 0; counter < 4; ++counter) { if (num_bits) TINFL_GET_BITS(6, r->m_raw_header[counter], 8); else TINFL_GET_BYTE(7, r->m_raw_header[counter]); } + if ((counter = (r->m_raw_header[0] | (r->m_raw_header[1] << 8))) != (mz_uint)(0xFFFF ^ (r->m_raw_header[2] | (r->m_raw_header[3] << 8)))) { TINFL_CR_RETURN_FOREVER(39, TINFL_STATUS_FAILED); } + while ((counter) && (num_bits)) + { + TINFL_GET_BITS(51, dist, 8); + while (pOut_buf_cur >= pOut_buf_end) { TINFL_CR_RETURN(52, TINFL_STATUS_HAS_MORE_OUTPUT); } + *pOut_buf_cur++ = (mz_uint8)dist; + counter--; + } + while (counter) + { + size_t n; while (pOut_buf_cur >= pOut_buf_end) { TINFL_CR_RETURN(9, TINFL_STATUS_HAS_MORE_OUTPUT); } + while (pIn_buf_cur >= pIn_buf_end) + { + if (decomp_flags & TINFL_FLAG_HAS_MORE_INPUT) + { + TINFL_CR_RETURN(38, TINFL_STATUS_NEEDS_MORE_INPUT); + } + else + { + TINFL_CR_RETURN_FOREVER(40, TINFL_STATUS_FAILED); + } + } + n = MZ_MIN(MZ_MIN((size_t)(pOut_buf_end - pOut_buf_cur), (size_t)(pIn_buf_end - pIn_buf_cur)), counter); + TINFL_MEMCPY(pOut_buf_cur, pIn_buf_cur, n); pIn_buf_cur += n; pOut_buf_cur += n; counter -= (mz_uint)n; + } + } + else if (r->m_type == 3) + { + TINFL_CR_RETURN_FOREVER(10, TINFL_STATUS_FAILED); + } + else + { + if (r->m_type == 1) + { + mz_uint8 *p = r->m_tables[0].m_code_size; mz_uint i; + r->m_table_sizes[0] = 288; r->m_table_sizes[1] = 32; TINFL_MEMSET(r->m_tables[1].m_code_size, 5, 32); + for ( i = 0; i <= 143; ++i) *p++ = 8; for ( ; i <= 255; ++i) *p++ = 9; for ( ; i <= 279; ++i) *p++ = 7; for ( ; i <= 287; ++i) *p++ = 8; + } + else + { + for (counter = 0; counter < 3; counter++) { TINFL_GET_BITS(11, r->m_table_sizes[counter], "\05\05\04"[counter]); r->m_table_sizes[counter] += s_min_table_sizes[counter]; } + MZ_CLEAR_OBJ(r->m_tables[2].m_code_size); for (counter = 0; counter < r->m_table_sizes[2]; counter++) { mz_uint s; TINFL_GET_BITS(14, s, 3); r->m_tables[2].m_code_size[s_length_dezigzag[counter]] = (mz_uint8)s; } + r->m_table_sizes[2] = 19; + } + for ( ; (int)r->m_type >= 0; r->m_type--) + { + int tree_next, tree_cur; tinfl_huff_table *pTable; + mz_uint i, j, used_syms, total, sym_index, next_code[17], total_syms[16]; pTable = &r->m_tables[r->m_type]; MZ_CLEAR_OBJ(total_syms); MZ_CLEAR_OBJ(pTable->m_look_up); MZ_CLEAR_OBJ(pTable->m_tree); + for (i = 0; i < r->m_table_sizes[r->m_type]; ++i) total_syms[pTable->m_code_size[i]]++; + used_syms = 0, total = 0; next_code[0] = next_code[1] = 0; + for (i = 1; i <= 15; ++i) { used_syms += total_syms[i]; next_code[i + 1] = (total = ((total + total_syms[i]) << 1)); } + if ((65536 != total) && (used_syms > 1)) + { + TINFL_CR_RETURN_FOREVER(35, TINFL_STATUS_FAILED); + } + for (tree_next = -1, sym_index = 0; sym_index < r->m_table_sizes[r->m_type]; ++sym_index) + { + mz_uint rev_code = 0, l, cur_code, code_size = pTable->m_code_size[sym_index]; if (!code_size) continue; + cur_code = next_code[code_size]++; for (l = code_size; l > 0; l--, cur_code >>= 1) rev_code = (rev_code << 1) | (cur_code & 1); + if (code_size <= TINFL_FAST_LOOKUP_BITS) { mz_int16 k = (mz_int16)((code_size << 9) | sym_index); while (rev_code < TINFL_FAST_LOOKUP_SIZE) { pTable->m_look_up[rev_code] = k; rev_code += (1 << code_size); } continue; } + if (0 == (tree_cur = pTable->m_look_up[rev_code & (TINFL_FAST_LOOKUP_SIZE - 1)])) { pTable->m_look_up[rev_code & (TINFL_FAST_LOOKUP_SIZE - 1)] = (mz_int16)tree_next; tree_cur = tree_next; tree_next -= 2; } + rev_code >>= (TINFL_FAST_LOOKUP_BITS - 1); + for (j = code_size; j > (TINFL_FAST_LOOKUP_BITS + 1); j--) + { + tree_cur -= ((rev_code >>= 1) & 1); + if (!pTable->m_tree[-tree_cur - 1]) { pTable->m_tree[-tree_cur - 1] = (mz_int16)tree_next; tree_cur = tree_next; tree_next -= 2; } else tree_cur = pTable->m_tree[-tree_cur - 1]; + } + tree_cur -= ((rev_code >>= 1) & 1); pTable->m_tree[-tree_cur - 1] = (mz_int16)sym_index; + } + if (r->m_type == 2) + { + for (counter = 0; counter < (r->m_table_sizes[0] + r->m_table_sizes[1]); ) + { + mz_uint s; TINFL_HUFF_DECODE(16, dist, &r->m_tables[2]); if (dist < 16) { r->m_len_codes[counter++] = (mz_uint8)dist; continue; } + if ((dist == 16) && (!counter)) + { + TINFL_CR_RETURN_FOREVER(17, TINFL_STATUS_FAILED); + } + num_extra = "\02\03\07"[dist - 16]; TINFL_GET_BITS(18, s, num_extra); s += "\03\03\013"[dist - 16]; + TINFL_MEMSET(r->m_len_codes + counter, (dist == 16) ? r->m_len_codes[counter - 1] : 0, s); counter += s; + } + if ((r->m_table_sizes[0] + r->m_table_sizes[1]) != counter) + { + TINFL_CR_RETURN_FOREVER(21, TINFL_STATUS_FAILED); + } + TINFL_MEMCPY(r->m_tables[0].m_code_size, r->m_len_codes, r->m_table_sizes[0]); TINFL_MEMCPY(r->m_tables[1].m_code_size, r->m_len_codes + r->m_table_sizes[0], r->m_table_sizes[1]); + } + } + for ( ; ; ) + { + mz_uint8 *pSrc; + for ( ; ; ) + { + if (((pIn_buf_end - pIn_buf_cur) < 4) || ((pOut_buf_end - pOut_buf_cur) < 2)) + { + TINFL_HUFF_DECODE(23, counter, &r->m_tables[0]); + if (counter >= 256) + break; + while (pOut_buf_cur >= pOut_buf_end) { TINFL_CR_RETURN(24, TINFL_STATUS_HAS_MORE_OUTPUT); } + *pOut_buf_cur++ = (mz_uint8)counter; + } + else + { + int sym2; mz_uint code_len; +#if TINFL_USE_64BIT_BITBUF + if (num_bits < 30) { bit_buf |= (((tinfl_bit_buf_t)MZ_READ_LE32(pIn_buf_cur)) << num_bits); pIn_buf_cur += 4; num_bits += 32; } +#else + if (num_bits < 15) { bit_buf |= (((tinfl_bit_buf_t)MZ_READ_LE16(pIn_buf_cur)) << num_bits); pIn_buf_cur += 2; num_bits += 16; } +#endif + if ((sym2 = r->m_tables[0].m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]) >= 0) + code_len = sym2 >> 9; + else + { + code_len = TINFL_FAST_LOOKUP_BITS; do { sym2 = r->m_tables[0].m_tree[~sym2 + ((bit_buf >> code_len++) & 1)]; } while (sym2 < 0); + } + counter = sym2; bit_buf >>= code_len; num_bits -= code_len; + if (counter & 256) + break; + +#if !TINFL_USE_64BIT_BITBUF + if (num_bits < 15) { bit_buf |= (((tinfl_bit_buf_t)MZ_READ_LE16(pIn_buf_cur)) << num_bits); pIn_buf_cur += 2; num_bits += 16; } +#endif + if ((sym2 = r->m_tables[0].m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]) >= 0) + code_len = sym2 >> 9; + else + { + code_len = TINFL_FAST_LOOKUP_BITS; do { sym2 = r->m_tables[0].m_tree[~sym2 + ((bit_buf >> code_len++) & 1)]; } while (sym2 < 0); + } + bit_buf >>= code_len; num_bits -= code_len; + + pOut_buf_cur[0] = (mz_uint8)counter; + if (sym2 & 256) + { + pOut_buf_cur++; + counter = sym2; + break; + } + pOut_buf_cur[1] = (mz_uint8)sym2; + pOut_buf_cur += 2; + } + } + if ((counter &= 511) == 256) break; + + num_extra = s_length_extra[counter - 257]; counter = s_length_base[counter - 257]; + if (num_extra) { mz_uint extra_bits; TINFL_GET_BITS(25, extra_bits, num_extra); counter += extra_bits; } + + TINFL_HUFF_DECODE(26, dist, &r->m_tables[1]); + num_extra = s_dist_extra[dist]; dist = s_dist_base[dist]; + if (num_extra) { mz_uint extra_bits; TINFL_GET_BITS(27, extra_bits, num_extra); dist += extra_bits; } + + dist_from_out_buf_start = pOut_buf_cur - pOut_buf_start; + if ((dist > dist_from_out_buf_start) && (decomp_flags & TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF)) + { + TINFL_CR_RETURN_FOREVER(37, TINFL_STATUS_FAILED); + } + + pSrc = pOut_buf_start + ((dist_from_out_buf_start - dist) & out_buf_size_mask); + + if ((MZ_MAX(pOut_buf_cur, pSrc) + counter) > pOut_buf_end) + { + while (counter--) + { + while (pOut_buf_cur >= pOut_buf_end) { TINFL_CR_RETURN(53, TINFL_STATUS_HAS_MORE_OUTPUT); } + *pOut_buf_cur++ = pOut_buf_start[(dist_from_out_buf_start++ - dist) & out_buf_size_mask]; + } + continue; + } +#if MINIZ_USE_UNALIGNED_LOADS_AND_STORES + else if ((counter >= 9) && (counter <= dist)) + { + const mz_uint8 *pSrc_end = pSrc + (counter & ~7); + do + { + ((mz_uint32 *)pOut_buf_cur)[0] = ((const mz_uint32 *)pSrc)[0]; + ((mz_uint32 *)pOut_buf_cur)[1] = ((const mz_uint32 *)pSrc)[1]; + pOut_buf_cur += 8; + } while ((pSrc += 8) < pSrc_end); + if ((counter &= 7) < 3) + { + if (counter) + { + pOut_buf_cur[0] = pSrc[0]; + if (counter > 1) + pOut_buf_cur[1] = pSrc[1]; + pOut_buf_cur += counter; + } + continue; + } + } +#endif + do + { + pOut_buf_cur[0] = pSrc[0]; + pOut_buf_cur[1] = pSrc[1]; + pOut_buf_cur[2] = pSrc[2]; + pOut_buf_cur += 3; pSrc += 3; + } while ((int)(counter -= 3) > 2); + if ((int)counter > 0) + { + pOut_buf_cur[0] = pSrc[0]; + if ((int)counter > 1) + pOut_buf_cur[1] = pSrc[1]; + pOut_buf_cur += counter; + } + } + } + } while (!(r->m_final & 1)); + if (decomp_flags & TINFL_FLAG_PARSE_ZLIB_HEADER) + { + TINFL_SKIP_BITS(32, num_bits & 7); for (counter = 0; counter < 4; ++counter) { mz_uint s; if (num_bits) TINFL_GET_BITS(41, s, 8); else TINFL_GET_BYTE(42, s); r->m_z_adler32 = (r->m_z_adler32 << 8) | s; } + } + TINFL_CR_RETURN_FOREVER(34, TINFL_STATUS_DONE); + TINFL_CR_FINISH + + common_exit: + r->m_num_bits = num_bits; r->m_bit_buf = bit_buf; r->m_dist = dist; r->m_counter = counter; r->m_num_extra = num_extra; r->m_dist_from_out_buf_start = dist_from_out_buf_start; + *pIn_buf_size = pIn_buf_cur - pIn_buf_next; *pOut_buf_size = pOut_buf_cur - pOut_buf_next; + if ((decomp_flags & (TINFL_FLAG_PARSE_ZLIB_HEADER | TINFL_FLAG_COMPUTE_ADLER32)) && (status >= 0)) + { + const mz_uint8 *ptr = pOut_buf_next; size_t buf_len = *pOut_buf_size; + mz_uint32 i, s1 = r->m_check_adler32 & 0xffff, s2 = r->m_check_adler32 >> 16; size_t block_len = buf_len % 5552; + while (buf_len) + { + for (i = 0; i + 7 < block_len; i += 8, ptr += 8) + { + s1 += ptr[0], s2 += s1; s1 += ptr[1], s2 += s1; s1 += ptr[2], s2 += s1; s1 += ptr[3], s2 += s1; + s1 += ptr[4], s2 += s1; s1 += ptr[5], s2 += s1; s1 += ptr[6], s2 += s1; s1 += ptr[7], s2 += s1; + } + for ( ; i < block_len; ++i) s1 += *ptr++, s2 += s1; + s1 %= 65521U, s2 %= 65521U; buf_len -= block_len; block_len = 5552; + } + r->m_check_adler32 = (s2 << 16) + s1; if ((status == TINFL_STATUS_DONE) && (decomp_flags & TINFL_FLAG_PARSE_ZLIB_HEADER) && (r->m_check_adler32 != r->m_z_adler32)) status = TINFL_STATUS_ADLER32_MISMATCH; + } + return status; +} + +#ifdef _MSC_VER +#pragma warning(pop) +#endif + +// Higher level helper functions. +void *tinfl_decompress_mem_to_heap(const void *pSrc_buf, size_t src_buf_len, size_t *pOut_len, int flags) +{ + tinfl_decompressor decomp; void *pBuf = NULL, *pNew_buf; size_t src_buf_ofs = 0, out_buf_capacity = 0; + *pOut_len = 0; + tinfl_init(&decomp); + for ( ; ; ) + { + size_t src_buf_size = src_buf_len - src_buf_ofs, dst_buf_size = out_buf_capacity - *pOut_len, new_out_buf_capacity; + tinfl_status status = tinfl_decompress(&decomp, (const mz_uint8*)pSrc_buf + src_buf_ofs, &src_buf_size, (mz_uint8*)pBuf, pBuf ? (mz_uint8*)pBuf + *pOut_len : NULL, &dst_buf_size, + (flags & ~TINFL_FLAG_HAS_MORE_INPUT) | TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF); + if ((status < 0) || (status == TINFL_STATUS_NEEDS_MORE_INPUT)) + { + MZ_FREE(pBuf); *pOut_len = 0; return NULL; + } + src_buf_ofs += src_buf_size; + *pOut_len += dst_buf_size; + if (status == TINFL_STATUS_DONE) break; + new_out_buf_capacity = out_buf_capacity * 2; if (new_out_buf_capacity < 128) new_out_buf_capacity = 128; + pNew_buf = MZ_REALLOC(pBuf, new_out_buf_capacity); + if (!pNew_buf) + { + MZ_FREE(pBuf); *pOut_len = 0; return NULL; + } + pBuf = pNew_buf; out_buf_capacity = new_out_buf_capacity; + } + return pBuf; +} + +size_t tinfl_decompress_mem_to_mem(void *pOut_buf, size_t out_buf_len, const void *pSrc_buf, size_t src_buf_len, int flags) +{ + tinfl_decompressor decomp; tinfl_status status; tinfl_init(&decomp); + status = tinfl_decompress(&decomp, (const mz_uint8*)pSrc_buf, &src_buf_len, (mz_uint8*)pOut_buf, (mz_uint8*)pOut_buf, &out_buf_len, (flags & ~TINFL_FLAG_HAS_MORE_INPUT) | TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF); + return (status != TINFL_STATUS_DONE) ? TINFL_DECOMPRESS_MEM_TO_MEM_FAILED : out_buf_len; +} + +int tinfl_decompress_mem_to_callback(const void *pIn_buf, size_t *pIn_buf_size, tinfl_put_buf_func_ptr pPut_buf_func, void *pPut_buf_user, int flags) +{ + int result = 0; + tinfl_decompressor decomp; + mz_uint8 *pDict = (mz_uint8*)MZ_MALLOC(TINFL_LZ_DICT_SIZE); size_t in_buf_ofs = 0, dict_ofs = 0; + if (!pDict) + return TINFL_STATUS_FAILED; + tinfl_init(&decomp); + for ( ; ; ) + { + size_t in_buf_size = *pIn_buf_size - in_buf_ofs, dst_buf_size = TINFL_LZ_DICT_SIZE - dict_ofs; + tinfl_status status = tinfl_decompress(&decomp, (const mz_uint8*)pIn_buf + in_buf_ofs, &in_buf_size, pDict, pDict + dict_ofs, &dst_buf_size, + (flags & ~(TINFL_FLAG_HAS_MORE_INPUT | TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF))); + in_buf_ofs += in_buf_size; + if ((dst_buf_size) && (!(*pPut_buf_func)(pDict + dict_ofs, (int)dst_buf_size, pPut_buf_user))) + break; + if (status != TINFL_STATUS_HAS_MORE_OUTPUT) + { + result = (status == TINFL_STATUS_DONE); + break; + } + dict_ofs = (dict_ofs + dst_buf_size) & (TINFL_LZ_DICT_SIZE - 1); + } + MZ_FREE(pDict); + *pIn_buf_size = in_buf_ofs; + return result; +} + +// ------------------- Low-level Compression (independent from all decompression API's) + +// Purposely making these tables static for faster init and thread safety. +static const mz_uint16 s_tdefl_len_sym[256] = { + 257,258,259,260,261,262,263,264,265,265,266,266,267,267,268,268,269,269,269,269,270,270,270,270,271,271,271,271,272,272,272,272, + 273,273,273,273,273,273,273,273,274,274,274,274,274,274,274,274,275,275,275,275,275,275,275,275,276,276,276,276,276,276,276,276, + 277,277,277,277,277,277,277,277,277,277,277,277,277,277,277,277,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278, + 279,279,279,279,279,279,279,279,279,279,279,279,279,279,279,279,280,280,280,280,280,280,280,280,280,280,280,280,280,280,280,280, + 281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281, + 282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282, + 283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283, + 284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,285 }; + +static const mz_uint8 s_tdefl_len_extra[256] = { + 0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, + 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, + 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, + 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0 }; + +static const mz_uint8 s_tdefl_small_dist_sym[512] = { + 0,1,2,3,4,4,5,5,6,6,6,6,7,7,7,7,8,8,8,8,8,8,8,8,9,9,9,9,9,9,9,9,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,14,14,14,14,14,14,14,14,14,14,14,14, + 14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14, + 14,14,14,14,14,14,14,14,14,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,17,17,17,17,17,17,17,17,17,17,17,17,17,17, + 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, + 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, + 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17 }; + +static const mz_uint8 s_tdefl_small_dist_extra[512] = { + 0,0,0,0,1,1,1,1,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5, + 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, + 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, + 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, + 7,7,7,7,7,7,7,7 }; + +static const mz_uint8 s_tdefl_large_dist_sym[128] = { + 0,0,18,19,20,20,21,21,22,22,22,22,23,23,23,23,24,24,24,24,24,24,24,24,25,25,25,25,25,25,25,25,26,26,26,26,26,26,26,26,26,26,26,26, + 26,26,26,26,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, + 28,28,28,28,28,28,28,28,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29 }; + +static const mz_uint8 s_tdefl_large_dist_extra[128] = { + 0,0,8,8,9,9,9,9,10,10,10,10,10,10,10,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13 }; + +// Radix sorts tdefl_sym_freq[] array by 16-bit key m_key. Returns ptr to sorted values. +typedef struct { mz_uint16 m_key, m_sym_index; } tdefl_sym_freq; +static tdefl_sym_freq* tdefl_radix_sort_syms(mz_uint num_syms, tdefl_sym_freq* pSyms0, tdefl_sym_freq* pSyms1) +{ + mz_uint32 total_passes = 2, pass_shift, pass, i, hist[256 * 2]; tdefl_sym_freq* pCur_syms = pSyms0, *pNew_syms = pSyms1; MZ_CLEAR_OBJ(hist); + for (i = 0; i < num_syms; i++) { mz_uint freq = pSyms0[i].m_key; hist[freq & 0xFF]++; hist[256 + ((freq >> 8) & 0xFF)]++; } + while ((total_passes > 1) && (num_syms == hist[(total_passes - 1) * 256])) total_passes--; + for (pass_shift = 0, pass = 0; pass < total_passes; pass++, pass_shift += 8) + { + const mz_uint32* pHist = &hist[pass << 8]; + mz_uint offsets[256], cur_ofs = 0; + for (i = 0; i < 256; i++) { offsets[i] = cur_ofs; cur_ofs += pHist[i]; } + for (i = 0; i < num_syms; i++) pNew_syms[offsets[(pCur_syms[i].m_key >> pass_shift) & 0xFF]++] = pCur_syms[i]; + { tdefl_sym_freq* t = pCur_syms; pCur_syms = pNew_syms; pNew_syms = t; } + } + return pCur_syms; +} + +// tdefl_calculate_minimum_redundancy() originally written by: Alistair Moffat, alistair@cs.mu.oz.au, Jyrki Katajainen, jyrki@diku.dk, November 1996. +static void tdefl_calculate_minimum_redundancy(tdefl_sym_freq *A, int n) +{ + int root, leaf, next, avbl, used, dpth; + if (n==0) return; else if (n==1) { A[0].m_key = 1; return; } + A[0].m_key += A[1].m_key; root = 0; leaf = 2; + for (next=1; next < n-1; next++) + { + if (leaf>=n || A[root].m_key=n || (root=0; next--) A[next].m_key = A[A[next].m_key].m_key+1; + avbl = 1; used = dpth = 0; root = n-2; next = n-1; + while (avbl>0) + { + while (root>=0 && (int)A[root].m_key==dpth) { used++; root--; } + while (avbl>used) { A[next--].m_key = (mz_uint16)(dpth); avbl--; } + avbl = 2*used; dpth++; used = 0; + } +} + +// Limits canonical Huffman code table's max code size. +enum { TDEFL_MAX_SUPPORTED_HUFF_CODESIZE = 32 }; +static void tdefl_huffman_enforce_max_code_size(int *pNum_codes, int code_list_len, int max_code_size) +{ + int i; mz_uint32 total = 0; if (code_list_len <= 1) return; + for (i = max_code_size + 1; i <= TDEFL_MAX_SUPPORTED_HUFF_CODESIZE; i++) pNum_codes[max_code_size] += pNum_codes[i]; + for (i = max_code_size; i > 0; i--) total += (((mz_uint32)pNum_codes[i]) << (max_code_size - i)); + while (total != (1UL << max_code_size)) + { + pNum_codes[max_code_size]--; + for (i = max_code_size - 1; i > 0; i--) if (pNum_codes[i]) { pNum_codes[i]--; pNum_codes[i + 1] += 2; break; } + total--; + } +} + +static void tdefl_optimize_huffman_table(tdefl_compressor *d, int table_num, int table_len, int code_size_limit, int static_table) +{ + int i, j, l, num_codes[1 + TDEFL_MAX_SUPPORTED_HUFF_CODESIZE]; mz_uint next_code[TDEFL_MAX_SUPPORTED_HUFF_CODESIZE + 1]; MZ_CLEAR_OBJ(num_codes); + if (static_table) + { + for (i = 0; i < table_len; i++) num_codes[d->m_huff_code_sizes[table_num][i]]++; + } + else + { + tdefl_sym_freq syms0[TDEFL_MAX_HUFF_SYMBOLS], syms1[TDEFL_MAX_HUFF_SYMBOLS], *pSyms; + int num_used_syms = 0; + const mz_uint16 *pSym_count = &d->m_huff_count[table_num][0]; + for (i = 0; i < table_len; i++) if (pSym_count[i]) { syms0[num_used_syms].m_key = (mz_uint16)pSym_count[i]; syms0[num_used_syms++].m_sym_index = (mz_uint16)i; } + + pSyms = tdefl_radix_sort_syms(num_used_syms, syms0, syms1); tdefl_calculate_minimum_redundancy(pSyms, num_used_syms); + + for (i = 0; i < num_used_syms; i++) num_codes[pSyms[i].m_key]++; + + tdefl_huffman_enforce_max_code_size(num_codes, num_used_syms, code_size_limit); + + MZ_CLEAR_OBJ(d->m_huff_code_sizes[table_num]); MZ_CLEAR_OBJ(d->m_huff_codes[table_num]); + for (i = 1, j = num_used_syms; i <= code_size_limit; i++) + for (l = num_codes[i]; l > 0; l--) d->m_huff_code_sizes[table_num][pSyms[--j].m_sym_index] = (mz_uint8)(i); + } + + next_code[1] = 0; for (j = 0, i = 2; i <= code_size_limit; i++) next_code[i] = j = ((j + num_codes[i - 1]) << 1); + + for (i = 0; i < table_len; i++) + { + mz_uint rev_code = 0, code, code_size; if ((code_size = d->m_huff_code_sizes[table_num][i]) == 0) continue; + code = next_code[code_size]++; for (l = code_size; l > 0; l--, code >>= 1) rev_code = (rev_code << 1) | (code & 1); + d->m_huff_codes[table_num][i] = (mz_uint16)rev_code; + } +} + +#define TDEFL_PUT_BITS(b, l) do { \ + mz_uint bits = b; mz_uint len = l; MZ_ASSERT(bits <= ((1U << len) - 1U)); \ + d->m_bit_buffer |= (bits << d->m_bits_in); d->m_bits_in += len; \ + while (d->m_bits_in >= 8) { \ + if (d->m_pOutput_buf < d->m_pOutput_buf_end) \ + *d->m_pOutput_buf++ = (mz_uint8)(d->m_bit_buffer); \ + d->m_bit_buffer >>= 8; \ + d->m_bits_in -= 8; \ + } \ +} MZ_MACRO_END + +#define TDEFL_RLE_PREV_CODE_SIZE() { if (rle_repeat_count) { \ + if (rle_repeat_count < 3) { \ + d->m_huff_count[2][prev_code_size] = (mz_uint16)(d->m_huff_count[2][prev_code_size] + rle_repeat_count); \ + while (rle_repeat_count--) packed_code_sizes[num_packed_code_sizes++] = prev_code_size; \ + } else { \ + d->m_huff_count[2][16] = (mz_uint16)(d->m_huff_count[2][16] + 1); packed_code_sizes[num_packed_code_sizes++] = 16; packed_code_sizes[num_packed_code_sizes++] = (mz_uint8)(rle_repeat_count - 3); \ +} rle_repeat_count = 0; } } + +#define TDEFL_RLE_ZERO_CODE_SIZE() { if (rle_z_count) { \ + if (rle_z_count < 3) { \ + d->m_huff_count[2][0] = (mz_uint16)(d->m_huff_count[2][0] + rle_z_count); while (rle_z_count--) packed_code_sizes[num_packed_code_sizes++] = 0; \ + } else if (rle_z_count <= 10) { \ + d->m_huff_count[2][17] = (mz_uint16)(d->m_huff_count[2][17] + 1); packed_code_sizes[num_packed_code_sizes++] = 17; packed_code_sizes[num_packed_code_sizes++] = (mz_uint8)(rle_z_count - 3); \ + } else { \ + d->m_huff_count[2][18] = (mz_uint16)(d->m_huff_count[2][18] + 1); packed_code_sizes[num_packed_code_sizes++] = 18; packed_code_sizes[num_packed_code_sizes++] = (mz_uint8)(rle_z_count - 11); \ +} rle_z_count = 0; } } + +static mz_uint8 s_tdefl_packed_code_size_syms_swizzle[] = { 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 }; + +static void tdefl_start_dynamic_block(tdefl_compressor *d) +{ + int num_lit_codes, num_dist_codes, num_bit_lengths; mz_uint i, total_code_sizes_to_pack, num_packed_code_sizes, rle_z_count, rle_repeat_count, packed_code_sizes_index; + mz_uint8 code_sizes_to_pack[TDEFL_MAX_HUFF_SYMBOLS_0 + TDEFL_MAX_HUFF_SYMBOLS_1], packed_code_sizes[TDEFL_MAX_HUFF_SYMBOLS_0 + TDEFL_MAX_HUFF_SYMBOLS_1], prev_code_size = 0xFF; + + d->m_huff_count[0][256] = 1; + + tdefl_optimize_huffman_table(d, 0, TDEFL_MAX_HUFF_SYMBOLS_0, 15, MZ_FALSE); + tdefl_optimize_huffman_table(d, 1, TDEFL_MAX_HUFF_SYMBOLS_1, 15, MZ_FALSE); + + for (num_lit_codes = 286; num_lit_codes > 257; num_lit_codes--) if (d->m_huff_code_sizes[0][num_lit_codes - 1]) break; + for (num_dist_codes = 30; num_dist_codes > 1; num_dist_codes--) if (d->m_huff_code_sizes[1][num_dist_codes - 1]) break; + + memcpy(code_sizes_to_pack, &d->m_huff_code_sizes[0][0], num_lit_codes); + memcpy(code_sizes_to_pack + num_lit_codes, &d->m_huff_code_sizes[1][0], num_dist_codes); + total_code_sizes_to_pack = num_lit_codes + num_dist_codes; num_packed_code_sizes = 0; rle_z_count = 0; rle_repeat_count = 0; + + memset(&d->m_huff_count[2][0], 0, sizeof(d->m_huff_count[2][0]) * TDEFL_MAX_HUFF_SYMBOLS_2); + for (i = 0; i < total_code_sizes_to_pack; i++) + { + mz_uint8 code_size = code_sizes_to_pack[i]; + if (!code_size) + { + TDEFL_RLE_PREV_CODE_SIZE(); + if (++rle_z_count == 138) { TDEFL_RLE_ZERO_CODE_SIZE(); } + } + else + { + TDEFL_RLE_ZERO_CODE_SIZE(); + if (code_size != prev_code_size) + { + TDEFL_RLE_PREV_CODE_SIZE(); + d->m_huff_count[2][code_size] = (mz_uint16)(d->m_huff_count[2][code_size] + 1); packed_code_sizes[num_packed_code_sizes++] = code_size; + } + else if (++rle_repeat_count == 6) + { + TDEFL_RLE_PREV_CODE_SIZE(); + } + } + prev_code_size = code_size; + } + if (rle_repeat_count) { TDEFL_RLE_PREV_CODE_SIZE(); } else { TDEFL_RLE_ZERO_CODE_SIZE(); } + + tdefl_optimize_huffman_table(d, 2, TDEFL_MAX_HUFF_SYMBOLS_2, 7, MZ_FALSE); + + TDEFL_PUT_BITS(2, 2); + + TDEFL_PUT_BITS(num_lit_codes - 257, 5); + TDEFL_PUT_BITS(num_dist_codes - 1, 5); + + for (num_bit_lengths = 18; num_bit_lengths >= 0; num_bit_lengths--) if (d->m_huff_code_sizes[2][s_tdefl_packed_code_size_syms_swizzle[num_bit_lengths]]) break; + num_bit_lengths = MZ_MAX(4, (num_bit_lengths + 1)); TDEFL_PUT_BITS(num_bit_lengths - 4, 4); + for (i = 0; (int)i < num_bit_lengths; i++) TDEFL_PUT_BITS(d->m_huff_code_sizes[2][s_tdefl_packed_code_size_syms_swizzle[i]], 3); + + for (packed_code_sizes_index = 0; packed_code_sizes_index < num_packed_code_sizes; ) + { + mz_uint code = packed_code_sizes[packed_code_sizes_index++]; MZ_ASSERT(code < TDEFL_MAX_HUFF_SYMBOLS_2); + TDEFL_PUT_BITS(d->m_huff_codes[2][code], d->m_huff_code_sizes[2][code]); + if (code >= 16) TDEFL_PUT_BITS(packed_code_sizes[packed_code_sizes_index++], "\02\03\07"[code - 16]); + } +} + +static void tdefl_start_static_block(tdefl_compressor *d) +{ + mz_uint i; + mz_uint8 *p = &d->m_huff_code_sizes[0][0]; + + for (i = 0; i <= 143; ++i) *p++ = 8; + for ( ; i <= 255; ++i) *p++ = 9; + for ( ; i <= 279; ++i) *p++ = 7; + for ( ; i <= 287; ++i) *p++ = 8; + + memset(d->m_huff_code_sizes[1], 5, 32); + + tdefl_optimize_huffman_table(d, 0, 288, 15, MZ_TRUE); + tdefl_optimize_huffman_table(d, 1, 32, 15, MZ_TRUE); + + TDEFL_PUT_BITS(1, 2); +} + +static const mz_uint mz_bitmasks[17] = { 0x0000, 0x0001, 0x0003, 0x0007, 0x000F, 0x001F, 0x003F, 0x007F, 0x00FF, 0x01FF, 0x03FF, 0x07FF, 0x0FFF, 0x1FFF, 0x3FFF, 0x7FFF, 0xFFFF }; + +#if MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN && MINIZ_HAS_64BIT_REGISTERS +static mz_bool tdefl_compress_lz_codes(tdefl_compressor *d) +{ + mz_uint flags; + mz_uint8 *pLZ_codes; + mz_uint8 *pOutput_buf = d->m_pOutput_buf; + mz_uint8 *pLZ_code_buf_end = d->m_pLZ_code_buf; + mz_uint64 bit_buffer = d->m_bit_buffer; + mz_uint bits_in = d->m_bits_in; + +#define TDEFL_PUT_BITS_FAST(b, l) { bit_buffer |= (((mz_uint64)(b)) << bits_in); bits_in += (l); } + + flags = 1; + for (pLZ_codes = d->m_lz_code_buf; pLZ_codes < pLZ_code_buf_end; flags >>= 1) + { + if (flags == 1) + flags = *pLZ_codes++ | 0x100; + + if (flags & 1) + { + mz_uint s0, s1, n0, n1, sym, num_extra_bits; + mz_uint match_len = pLZ_codes[0], match_dist = *(const mz_uint16 *)(pLZ_codes + 1); pLZ_codes += 3; + + MZ_ASSERT(d->m_huff_code_sizes[0][s_tdefl_len_sym[match_len]]); + TDEFL_PUT_BITS_FAST(d->m_huff_codes[0][s_tdefl_len_sym[match_len]], d->m_huff_code_sizes[0][s_tdefl_len_sym[match_len]]); + TDEFL_PUT_BITS_FAST(match_len & mz_bitmasks[s_tdefl_len_extra[match_len]], s_tdefl_len_extra[match_len]); + + // This sequence coaxes MSVC into using cmov's vs. jmp's. + s0 = s_tdefl_small_dist_sym[match_dist & 511]; + n0 = s_tdefl_small_dist_extra[match_dist & 511]; + s1 = s_tdefl_large_dist_sym[match_dist >> 8]; + n1 = s_tdefl_large_dist_extra[match_dist >> 8]; + sym = (match_dist < 512) ? s0 : s1; + num_extra_bits = (match_dist < 512) ? n0 : n1; + + MZ_ASSERT(d->m_huff_code_sizes[1][sym]); + TDEFL_PUT_BITS_FAST(d->m_huff_codes[1][sym], d->m_huff_code_sizes[1][sym]); + TDEFL_PUT_BITS_FAST(match_dist & mz_bitmasks[num_extra_bits], num_extra_bits); + } + else + { + mz_uint lit = *pLZ_codes++; + MZ_ASSERT(d->m_huff_code_sizes[0][lit]); + TDEFL_PUT_BITS_FAST(d->m_huff_codes[0][lit], d->m_huff_code_sizes[0][lit]); + + if (((flags & 2) == 0) && (pLZ_codes < pLZ_code_buf_end)) + { + flags >>= 1; + lit = *pLZ_codes++; + MZ_ASSERT(d->m_huff_code_sizes[0][lit]); + TDEFL_PUT_BITS_FAST(d->m_huff_codes[0][lit], d->m_huff_code_sizes[0][lit]); + + if (((flags & 2) == 0) && (pLZ_codes < pLZ_code_buf_end)) + { + flags >>= 1; + lit = *pLZ_codes++; + MZ_ASSERT(d->m_huff_code_sizes[0][lit]); + TDEFL_PUT_BITS_FAST(d->m_huff_codes[0][lit], d->m_huff_code_sizes[0][lit]); + } + } + } + + if (pOutput_buf >= d->m_pOutput_buf_end) + return MZ_FALSE; + + *(mz_uint64*)pOutput_buf = bit_buffer; + pOutput_buf += (bits_in >> 3); + bit_buffer >>= (bits_in & ~7); + bits_in &= 7; + } + +#undef TDEFL_PUT_BITS_FAST + + d->m_pOutput_buf = pOutput_buf; + d->m_bits_in = 0; + d->m_bit_buffer = 0; + + while (bits_in) + { + mz_uint32 n = MZ_MIN(bits_in, 16); + TDEFL_PUT_BITS((mz_uint)bit_buffer & mz_bitmasks[n], n); + bit_buffer >>= n; + bits_in -= n; + } + + TDEFL_PUT_BITS(d->m_huff_codes[0][256], d->m_huff_code_sizes[0][256]); + + return (d->m_pOutput_buf < d->m_pOutput_buf_end); +} +#else +static mz_bool tdefl_compress_lz_codes(tdefl_compressor *d) +{ + mz_uint flags; + mz_uint8 *pLZ_codes; + + flags = 1; + for (pLZ_codes = d->m_lz_code_buf; pLZ_codes < d->m_pLZ_code_buf; flags >>= 1) + { + if (flags == 1) + flags = *pLZ_codes++ | 0x100; + if (flags & 1) + { + mz_uint sym, num_extra_bits; + mz_uint match_len = pLZ_codes[0], match_dist = (pLZ_codes[1] | (pLZ_codes[2] << 8)); pLZ_codes += 3; + + MZ_ASSERT(d->m_huff_code_sizes[0][s_tdefl_len_sym[match_len]]); + TDEFL_PUT_BITS(d->m_huff_codes[0][s_tdefl_len_sym[match_len]], d->m_huff_code_sizes[0][s_tdefl_len_sym[match_len]]); + TDEFL_PUT_BITS(match_len & mz_bitmasks[s_tdefl_len_extra[match_len]], s_tdefl_len_extra[match_len]); + + if (match_dist < 512) + { + sym = s_tdefl_small_dist_sym[match_dist]; num_extra_bits = s_tdefl_small_dist_extra[match_dist]; + } + else + { + sym = s_tdefl_large_dist_sym[match_dist >> 8]; num_extra_bits = s_tdefl_large_dist_extra[match_dist >> 8]; + } + MZ_ASSERT(d->m_huff_code_sizes[1][sym]); + TDEFL_PUT_BITS(d->m_huff_codes[1][sym], d->m_huff_code_sizes[1][sym]); + TDEFL_PUT_BITS(match_dist & mz_bitmasks[num_extra_bits], num_extra_bits); + } + else + { + mz_uint lit = *pLZ_codes++; + MZ_ASSERT(d->m_huff_code_sizes[0][lit]); + TDEFL_PUT_BITS(d->m_huff_codes[0][lit], d->m_huff_code_sizes[0][lit]); + } + } + + TDEFL_PUT_BITS(d->m_huff_codes[0][256], d->m_huff_code_sizes[0][256]); + + return (d->m_pOutput_buf < d->m_pOutput_buf_end); +} +#endif // MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN && MINIZ_HAS_64BIT_REGISTERS + +static mz_bool tdefl_compress_block(tdefl_compressor *d, mz_bool static_block) +{ + if (static_block) + tdefl_start_static_block(d); + else + tdefl_start_dynamic_block(d); + return tdefl_compress_lz_codes(d); +} + +static int tdefl_flush_block(tdefl_compressor *d, int flush) +{ + mz_uint saved_bit_buf, saved_bits_in; + mz_uint8 *pSaved_output_buf; + mz_bool comp_block_succeeded = MZ_FALSE; + int n, use_raw_block = ((d->m_flags & TDEFL_FORCE_ALL_RAW_BLOCKS) != 0) && (d->m_lookahead_pos - d->m_lz_code_buf_dict_pos) <= d->m_dict_size; + mz_uint8 *pOutput_buf_start = ((d->m_pPut_buf_func == NULL) && ((*d->m_pOut_buf_size - d->m_out_buf_ofs) >= TDEFL_OUT_BUF_SIZE)) ? ((mz_uint8 *)d->m_pOut_buf + d->m_out_buf_ofs) : d->m_output_buf; + + d->m_pOutput_buf = pOutput_buf_start; + d->m_pOutput_buf_end = d->m_pOutput_buf + TDEFL_OUT_BUF_SIZE - 16; + + MZ_ASSERT(!d->m_output_flush_remaining); + d->m_output_flush_ofs = 0; + d->m_output_flush_remaining = 0; + + *d->m_pLZ_flags = (mz_uint8)(*d->m_pLZ_flags >> d->m_num_flags_left); + d->m_pLZ_code_buf -= (d->m_num_flags_left == 8); + + if ((d->m_flags & TDEFL_WRITE_ZLIB_HEADER) && (!d->m_block_index)) + { + TDEFL_PUT_BITS(0x78, 8); TDEFL_PUT_BITS(0x01, 8); + } + + TDEFL_PUT_BITS(flush == TDEFL_FINISH, 1); + + pSaved_output_buf = d->m_pOutput_buf; saved_bit_buf = d->m_bit_buffer; saved_bits_in = d->m_bits_in; + + if (!use_raw_block) + comp_block_succeeded = tdefl_compress_block(d, (d->m_flags & TDEFL_FORCE_ALL_STATIC_BLOCKS) || (d->m_total_lz_bytes < 48)); + + // If the block gets expanded, forget the current contents of the output buffer and send a raw block instead. + if ( ((use_raw_block) || ((d->m_total_lz_bytes) && ((d->m_pOutput_buf - pSaved_output_buf + 1U) >= d->m_total_lz_bytes))) && + ((d->m_lookahead_pos - d->m_lz_code_buf_dict_pos) <= d->m_dict_size) ) + { + mz_uint i; d->m_pOutput_buf = pSaved_output_buf; d->m_bit_buffer = saved_bit_buf, d->m_bits_in = saved_bits_in; + TDEFL_PUT_BITS(0, 2); + if (d->m_bits_in) { TDEFL_PUT_BITS(0, 8 - d->m_bits_in); } + for (i = 2; i; --i, d->m_total_lz_bytes ^= 0xFFFF) + { + TDEFL_PUT_BITS(d->m_total_lz_bytes & 0xFFFF, 16); + } + for (i = 0; i < d->m_total_lz_bytes; ++i) + { + TDEFL_PUT_BITS(d->m_dict[(d->m_lz_code_buf_dict_pos + i) & TDEFL_LZ_DICT_SIZE_MASK], 8); + } + } + // Check for the extremely unlikely (if not impossible) case of the compressed block not fitting into the output buffer when using dynamic codes. + else if (!comp_block_succeeded) + { + d->m_pOutput_buf = pSaved_output_buf; d->m_bit_buffer = saved_bit_buf, d->m_bits_in = saved_bits_in; + tdefl_compress_block(d, MZ_TRUE); + } + + if (flush) + { + if (flush == TDEFL_FINISH) + { + if (d->m_bits_in) { TDEFL_PUT_BITS(0, 8 - d->m_bits_in); } + if (d->m_flags & TDEFL_WRITE_ZLIB_HEADER) { mz_uint i, a = d->m_adler32; for (i = 0; i < 4; i++) { TDEFL_PUT_BITS((a >> 24) & 0xFF, 8); a <<= 8; } } + } + else + { + mz_uint i, z = 0; TDEFL_PUT_BITS(0, 3); if (d->m_bits_in) { TDEFL_PUT_BITS(0, 8 - d->m_bits_in); } for (i = 2; i; --i, z ^= 0xFFFF) { TDEFL_PUT_BITS(z & 0xFFFF, 16); } + } + } + + MZ_ASSERT(d->m_pOutput_buf < d->m_pOutput_buf_end); + + memset(&d->m_huff_count[0][0], 0, sizeof(d->m_huff_count[0][0]) * TDEFL_MAX_HUFF_SYMBOLS_0); + memset(&d->m_huff_count[1][0], 0, sizeof(d->m_huff_count[1][0]) * TDEFL_MAX_HUFF_SYMBOLS_1); + + d->m_pLZ_code_buf = d->m_lz_code_buf + 1; d->m_pLZ_flags = d->m_lz_code_buf; d->m_num_flags_left = 8; d->m_lz_code_buf_dict_pos += d->m_total_lz_bytes; d->m_total_lz_bytes = 0; d->m_block_index++; + + if ((n = (int)(d->m_pOutput_buf - pOutput_buf_start)) != 0) + { + if (d->m_pPut_buf_func) + { + *d->m_pIn_buf_size = d->m_pSrc - (const mz_uint8 *)d->m_pIn_buf; + if (!(*d->m_pPut_buf_func)(d->m_output_buf, n, d->m_pPut_buf_user)) + return (d->m_prev_return_status = TDEFL_STATUS_PUT_BUF_FAILED); + } + else if (pOutput_buf_start == d->m_output_buf) + { + int bytes_to_copy = (int)MZ_MIN((size_t)n, (size_t)(*d->m_pOut_buf_size - d->m_out_buf_ofs)); + memcpy((mz_uint8 *)d->m_pOut_buf + d->m_out_buf_ofs, d->m_output_buf, bytes_to_copy); + d->m_out_buf_ofs += bytes_to_copy; + if ((n -= bytes_to_copy) != 0) + { + d->m_output_flush_ofs = bytes_to_copy; + d->m_output_flush_remaining = n; + } + } + else + { + d->m_out_buf_ofs += n; + } + } + + return d->m_output_flush_remaining; +} + +#if MINIZ_USE_UNALIGNED_LOADS_AND_STORES +#define TDEFL_READ_UNALIGNED_WORD(p) *(const mz_uint16*)(p) +static MZ_FORCEINLINE void tdefl_find_match(tdefl_compressor *d, mz_uint lookahead_pos, mz_uint max_dist, mz_uint max_match_len, mz_uint *pMatch_dist, mz_uint *pMatch_len) +{ + mz_uint dist, pos = lookahead_pos & TDEFL_LZ_DICT_SIZE_MASK, match_len = *pMatch_len, probe_pos = pos, next_probe_pos, probe_len; + mz_uint num_probes_left = d->m_max_probes[match_len >= 32]; + const mz_uint16 *s = (const mz_uint16*)(d->m_dict + pos), *p, *q; + mz_uint16 c01 = TDEFL_READ_UNALIGNED_WORD(&d->m_dict[pos + match_len - 1]), s01 = TDEFL_READ_UNALIGNED_WORD(s); + MZ_ASSERT(max_match_len <= TDEFL_MAX_MATCH_LEN); if (max_match_len <= match_len) return; + for ( ; ; ) + { + for ( ; ; ) + { + if (--num_probes_left == 0) return; +#define TDEFL_PROBE \ + next_probe_pos = d->m_next[probe_pos]; \ + if ((!next_probe_pos) || ((dist = (mz_uint16)(lookahead_pos - next_probe_pos)) > max_dist)) return; \ + probe_pos = next_probe_pos & TDEFL_LZ_DICT_SIZE_MASK; \ + if (TDEFL_READ_UNALIGNED_WORD(&d->m_dict[probe_pos + match_len - 1]) == c01) break; + TDEFL_PROBE; TDEFL_PROBE; TDEFL_PROBE; + } + if (!dist) break; q = (const mz_uint16*)(d->m_dict + probe_pos); if (TDEFL_READ_UNALIGNED_WORD(q) != s01) continue; p = s; probe_len = 32; + do { } while ( (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && + (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && (--probe_len > 0) ); + if (!probe_len) + { + *pMatch_dist = dist; *pMatch_len = MZ_MIN(max_match_len, TDEFL_MAX_MATCH_LEN); break; + } + else if ((probe_len = ((mz_uint)(p - s) * 2) + (mz_uint)(*(const mz_uint8*)p == *(const mz_uint8*)q)) > match_len) + { + *pMatch_dist = dist; if ((*pMatch_len = match_len = MZ_MIN(max_match_len, probe_len)) == max_match_len) break; + c01 = TDEFL_READ_UNALIGNED_WORD(&d->m_dict[pos + match_len - 1]); + } + } +} +#else +static MZ_FORCEINLINE void tdefl_find_match(tdefl_compressor *d, mz_uint lookahead_pos, mz_uint max_dist, mz_uint max_match_len, mz_uint *pMatch_dist, mz_uint *pMatch_len) +{ + mz_uint dist, pos = lookahead_pos & TDEFL_LZ_DICT_SIZE_MASK, match_len = *pMatch_len, probe_pos = pos, next_probe_pos, probe_len; + mz_uint num_probes_left = d->m_max_probes[match_len >= 32]; + const mz_uint8 *s = d->m_dict + pos, *p, *q; + mz_uint8 c0 = d->m_dict[pos + match_len], c1 = d->m_dict[pos + match_len - 1]; + MZ_ASSERT(max_match_len <= TDEFL_MAX_MATCH_LEN); if (max_match_len <= match_len) return; + for ( ; ; ) + { + for ( ; ; ) + { + if (--num_probes_left == 0) return; + #define TDEFL_PROBE \ + next_probe_pos = d->m_next[probe_pos]; \ + if ((!next_probe_pos) || ((dist = (mz_uint16)(lookahead_pos - next_probe_pos)) > max_dist)) return; \ + probe_pos = next_probe_pos & TDEFL_LZ_DICT_SIZE_MASK; \ + if ((d->m_dict[probe_pos + match_len] == c0) && (d->m_dict[probe_pos + match_len - 1] == c1)) break; + TDEFL_PROBE; TDEFL_PROBE; TDEFL_PROBE; + } + if (!dist) break; p = s; q = d->m_dict + probe_pos; for (probe_len = 0; probe_len < max_match_len; probe_len++) if (*p++ != *q++) break; + if (probe_len > match_len) + { + *pMatch_dist = dist; if ((*pMatch_len = match_len = probe_len) == max_match_len) return; + c0 = d->m_dict[pos + match_len]; c1 = d->m_dict[pos + match_len - 1]; + } + } +} +#endif // #if MINIZ_USE_UNALIGNED_LOADS_AND_STORES + +#if MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN +static mz_bool tdefl_compress_fast(tdefl_compressor *d) +{ + // Faster, minimally featured LZRW1-style match+parse loop with better register utilization. Intended for applications where raw throughput is valued more highly than ratio. + mz_uint lookahead_pos = d->m_lookahead_pos, lookahead_size = d->m_lookahead_size, dict_size = d->m_dict_size, total_lz_bytes = d->m_total_lz_bytes, num_flags_left = d->m_num_flags_left; + mz_uint8 *pLZ_code_buf = d->m_pLZ_code_buf, *pLZ_flags = d->m_pLZ_flags; + mz_uint cur_pos = lookahead_pos & TDEFL_LZ_DICT_SIZE_MASK; + + while ((d->m_src_buf_left) || ((d->m_flush) && (lookahead_size))) + { + const mz_uint TDEFL_COMP_FAST_LOOKAHEAD_SIZE = 4096; + mz_uint dst_pos = (lookahead_pos + lookahead_size) & TDEFL_LZ_DICT_SIZE_MASK; + mz_uint num_bytes_to_process = (mz_uint)MZ_MIN(d->m_src_buf_left, TDEFL_COMP_FAST_LOOKAHEAD_SIZE - lookahead_size); + d->m_src_buf_left -= num_bytes_to_process; + lookahead_size += num_bytes_to_process; + + while (num_bytes_to_process) + { + mz_uint32 n = MZ_MIN(TDEFL_LZ_DICT_SIZE - dst_pos, num_bytes_to_process); + memcpy(d->m_dict + dst_pos, d->m_pSrc, n); + if (dst_pos < (TDEFL_MAX_MATCH_LEN - 1)) + memcpy(d->m_dict + TDEFL_LZ_DICT_SIZE + dst_pos, d->m_pSrc, MZ_MIN(n, (TDEFL_MAX_MATCH_LEN - 1) - dst_pos)); + d->m_pSrc += n; + dst_pos = (dst_pos + n) & TDEFL_LZ_DICT_SIZE_MASK; + num_bytes_to_process -= n; + } + + dict_size = MZ_MIN(TDEFL_LZ_DICT_SIZE - lookahead_size, dict_size); + if ((!d->m_flush) && (lookahead_size < TDEFL_COMP_FAST_LOOKAHEAD_SIZE)) break; + + while (lookahead_size >= 4) + { + mz_uint cur_match_dist, cur_match_len = 1; + mz_uint8 *pCur_dict = d->m_dict + cur_pos; + mz_uint first_trigram = (*(const mz_uint32 *)pCur_dict) & 0xFFFFFF; + mz_uint hash = (first_trigram ^ (first_trigram >> (24 - (TDEFL_LZ_HASH_BITS - 8)))) & TDEFL_LEVEL1_HASH_SIZE_MASK; + mz_uint probe_pos = d->m_hash[hash]; + d->m_hash[hash] = (mz_uint16)lookahead_pos; + + if (((cur_match_dist = (mz_uint16)(lookahead_pos - probe_pos)) <= dict_size) && ((*(const mz_uint32 *)(d->m_dict + (probe_pos &= TDEFL_LZ_DICT_SIZE_MASK)) & 0xFFFFFF) == first_trigram)) + { + const mz_uint16 *p = (const mz_uint16 *)pCur_dict; + const mz_uint16 *q = (const mz_uint16 *)(d->m_dict + probe_pos); + mz_uint32 probe_len = 32; + do { } while ( (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && + (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && (--probe_len > 0) ); + cur_match_len = ((mz_uint)(p - (const mz_uint16 *)pCur_dict) * 2) + (mz_uint)(*(const mz_uint8 *)p == *(const mz_uint8 *)q); + if (!probe_len) + cur_match_len = cur_match_dist ? TDEFL_MAX_MATCH_LEN : 0; + + if ((cur_match_len < TDEFL_MIN_MATCH_LEN) || ((cur_match_len == TDEFL_MIN_MATCH_LEN) && (cur_match_dist >= 8U*1024U))) + { + cur_match_len = 1; + *pLZ_code_buf++ = (mz_uint8)first_trigram; + *pLZ_flags = (mz_uint8)(*pLZ_flags >> 1); + d->m_huff_count[0][(mz_uint8)first_trigram]++; + } + else + { + mz_uint32 s0, s1; + cur_match_len = MZ_MIN(cur_match_len, lookahead_size); + + MZ_ASSERT((cur_match_len >= TDEFL_MIN_MATCH_LEN) && (cur_match_dist >= 1) && (cur_match_dist <= TDEFL_LZ_DICT_SIZE)); + + cur_match_dist--; + + pLZ_code_buf[0] = (mz_uint8)(cur_match_len - TDEFL_MIN_MATCH_LEN); + *(mz_uint16 *)(&pLZ_code_buf[1]) = (mz_uint16)cur_match_dist; + pLZ_code_buf += 3; + *pLZ_flags = (mz_uint8)((*pLZ_flags >> 1) | 0x80); + + s0 = s_tdefl_small_dist_sym[cur_match_dist & 511]; + s1 = s_tdefl_large_dist_sym[cur_match_dist >> 8]; + d->m_huff_count[1][(cur_match_dist < 512) ? s0 : s1]++; + + d->m_huff_count[0][s_tdefl_len_sym[cur_match_len - TDEFL_MIN_MATCH_LEN]]++; + } + } + else + { + *pLZ_code_buf++ = (mz_uint8)first_trigram; + *pLZ_flags = (mz_uint8)(*pLZ_flags >> 1); + d->m_huff_count[0][(mz_uint8)first_trigram]++; + } + + if (--num_flags_left == 0) { num_flags_left = 8; pLZ_flags = pLZ_code_buf++; } + + total_lz_bytes += cur_match_len; + lookahead_pos += cur_match_len; + dict_size = MZ_MIN(dict_size + cur_match_len, TDEFL_LZ_DICT_SIZE); + cur_pos = (cur_pos + cur_match_len) & TDEFL_LZ_DICT_SIZE_MASK; + MZ_ASSERT(lookahead_size >= cur_match_len); + lookahead_size -= cur_match_len; + + if (pLZ_code_buf > &d->m_lz_code_buf[TDEFL_LZ_CODE_BUF_SIZE - 8]) + { + int n; + d->m_lookahead_pos = lookahead_pos; d->m_lookahead_size = lookahead_size; d->m_dict_size = dict_size; + d->m_total_lz_bytes = total_lz_bytes; d->m_pLZ_code_buf = pLZ_code_buf; d->m_pLZ_flags = pLZ_flags; d->m_num_flags_left = num_flags_left; + if ((n = tdefl_flush_block(d, 0)) != 0) + return (n < 0) ? MZ_FALSE : MZ_TRUE; + total_lz_bytes = d->m_total_lz_bytes; pLZ_code_buf = d->m_pLZ_code_buf; pLZ_flags = d->m_pLZ_flags; num_flags_left = d->m_num_flags_left; + } + } + + while (lookahead_size) + { + mz_uint8 lit = d->m_dict[cur_pos]; + + total_lz_bytes++; + *pLZ_code_buf++ = lit; + *pLZ_flags = (mz_uint8)(*pLZ_flags >> 1); + if (--num_flags_left == 0) { num_flags_left = 8; pLZ_flags = pLZ_code_buf++; } + + d->m_huff_count[0][lit]++; + + lookahead_pos++; + dict_size = MZ_MIN(dict_size + 1, TDEFL_LZ_DICT_SIZE); + cur_pos = (cur_pos + 1) & TDEFL_LZ_DICT_SIZE_MASK; + lookahead_size--; + + if (pLZ_code_buf > &d->m_lz_code_buf[TDEFL_LZ_CODE_BUF_SIZE - 8]) + { + int n; + d->m_lookahead_pos = lookahead_pos; d->m_lookahead_size = lookahead_size; d->m_dict_size = dict_size; + d->m_total_lz_bytes = total_lz_bytes; d->m_pLZ_code_buf = pLZ_code_buf; d->m_pLZ_flags = pLZ_flags; d->m_num_flags_left = num_flags_left; + if ((n = tdefl_flush_block(d, 0)) != 0) + return (n < 0) ? MZ_FALSE : MZ_TRUE; + total_lz_bytes = d->m_total_lz_bytes; pLZ_code_buf = d->m_pLZ_code_buf; pLZ_flags = d->m_pLZ_flags; num_flags_left = d->m_num_flags_left; + } + } + } + + d->m_lookahead_pos = lookahead_pos; d->m_lookahead_size = lookahead_size; d->m_dict_size = dict_size; + d->m_total_lz_bytes = total_lz_bytes; d->m_pLZ_code_buf = pLZ_code_buf; d->m_pLZ_flags = pLZ_flags; d->m_num_flags_left = num_flags_left; + return MZ_TRUE; +} +#endif // MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN + +static MZ_FORCEINLINE void tdefl_record_literal(tdefl_compressor *d, mz_uint8 lit) +{ + d->m_total_lz_bytes++; + *d->m_pLZ_code_buf++ = lit; + *d->m_pLZ_flags = (mz_uint8)(*d->m_pLZ_flags >> 1); if (--d->m_num_flags_left == 0) { d->m_num_flags_left = 8; d->m_pLZ_flags = d->m_pLZ_code_buf++; } + d->m_huff_count[0][lit]++; +} + +static MZ_FORCEINLINE void tdefl_record_match(tdefl_compressor *d, mz_uint match_len, mz_uint match_dist) +{ + mz_uint32 s0, s1; + + MZ_ASSERT((match_len >= TDEFL_MIN_MATCH_LEN) && (match_dist >= 1) && (match_dist <= TDEFL_LZ_DICT_SIZE)); + + d->m_total_lz_bytes += match_len; + + d->m_pLZ_code_buf[0] = (mz_uint8)(match_len - TDEFL_MIN_MATCH_LEN); + + match_dist -= 1; + d->m_pLZ_code_buf[1] = (mz_uint8)(match_dist & 0xFF); + d->m_pLZ_code_buf[2] = (mz_uint8)(match_dist >> 8); d->m_pLZ_code_buf += 3; + + *d->m_pLZ_flags = (mz_uint8)((*d->m_pLZ_flags >> 1) | 0x80); if (--d->m_num_flags_left == 0) { d->m_num_flags_left = 8; d->m_pLZ_flags = d->m_pLZ_code_buf++; } + + s0 = s_tdefl_small_dist_sym[match_dist & 511]; s1 = s_tdefl_large_dist_sym[(match_dist >> 8) & 127]; + d->m_huff_count[1][(match_dist < 512) ? s0 : s1]++; + + if (match_len >= TDEFL_MIN_MATCH_LEN) d->m_huff_count[0][s_tdefl_len_sym[match_len - TDEFL_MIN_MATCH_LEN]]++; +} + +static mz_bool tdefl_compress_normal(tdefl_compressor *d) +{ + const mz_uint8 *pSrc = d->m_pSrc; size_t src_buf_left = d->m_src_buf_left; + tdefl_flush flush = d->m_flush; + + while ((src_buf_left) || ((flush) && (d->m_lookahead_size))) + { + mz_uint len_to_move, cur_match_dist, cur_match_len, cur_pos; + // Update dictionary and hash chains. Keeps the lookahead size equal to TDEFL_MAX_MATCH_LEN. + if ((d->m_lookahead_size + d->m_dict_size) >= (TDEFL_MIN_MATCH_LEN - 1)) + { + mz_uint dst_pos = (d->m_lookahead_pos + d->m_lookahead_size) & TDEFL_LZ_DICT_SIZE_MASK, ins_pos = d->m_lookahead_pos + d->m_lookahead_size - 2; + mz_uint hash = (d->m_dict[ins_pos & TDEFL_LZ_DICT_SIZE_MASK] << TDEFL_LZ_HASH_SHIFT) ^ d->m_dict[(ins_pos + 1) & TDEFL_LZ_DICT_SIZE_MASK]; + mz_uint num_bytes_to_process = (mz_uint)MZ_MIN(src_buf_left, TDEFL_MAX_MATCH_LEN - d->m_lookahead_size); + const mz_uint8 *pSrc_end = pSrc + num_bytes_to_process; + src_buf_left -= num_bytes_to_process; + d->m_lookahead_size += num_bytes_to_process; + while (pSrc != pSrc_end) + { + mz_uint8 c = *pSrc++; d->m_dict[dst_pos] = c; if (dst_pos < (TDEFL_MAX_MATCH_LEN - 1)) d->m_dict[TDEFL_LZ_DICT_SIZE + dst_pos] = c; + hash = ((hash << TDEFL_LZ_HASH_SHIFT) ^ c) & (TDEFL_LZ_HASH_SIZE - 1); + d->m_next[ins_pos & TDEFL_LZ_DICT_SIZE_MASK] = d->m_hash[hash]; d->m_hash[hash] = (mz_uint16)(ins_pos); + dst_pos = (dst_pos + 1) & TDEFL_LZ_DICT_SIZE_MASK; ins_pos++; + } + } + else + { + while ((src_buf_left) && (d->m_lookahead_size < TDEFL_MAX_MATCH_LEN)) + { + mz_uint8 c = *pSrc++; + mz_uint dst_pos = (d->m_lookahead_pos + d->m_lookahead_size) & TDEFL_LZ_DICT_SIZE_MASK; + src_buf_left--; + d->m_dict[dst_pos] = c; + if (dst_pos < (TDEFL_MAX_MATCH_LEN - 1)) + d->m_dict[TDEFL_LZ_DICT_SIZE + dst_pos] = c; + if ((++d->m_lookahead_size + d->m_dict_size) >= TDEFL_MIN_MATCH_LEN) + { + mz_uint ins_pos = d->m_lookahead_pos + (d->m_lookahead_size - 1) - 2; + mz_uint hash = ((d->m_dict[ins_pos & TDEFL_LZ_DICT_SIZE_MASK] << (TDEFL_LZ_HASH_SHIFT * 2)) ^ (d->m_dict[(ins_pos + 1) & TDEFL_LZ_DICT_SIZE_MASK] << TDEFL_LZ_HASH_SHIFT) ^ c) & (TDEFL_LZ_HASH_SIZE - 1); + d->m_next[ins_pos & TDEFL_LZ_DICT_SIZE_MASK] = d->m_hash[hash]; d->m_hash[hash] = (mz_uint16)(ins_pos); + } + } + } + d->m_dict_size = MZ_MIN(TDEFL_LZ_DICT_SIZE - d->m_lookahead_size, d->m_dict_size); + if ((!flush) && (d->m_lookahead_size < TDEFL_MAX_MATCH_LEN)) + break; + + // Simple lazy/greedy parsing state machine. + len_to_move = 1; cur_match_dist = 0; cur_match_len = d->m_saved_match_len ? d->m_saved_match_len : (TDEFL_MIN_MATCH_LEN - 1); cur_pos = d->m_lookahead_pos & TDEFL_LZ_DICT_SIZE_MASK; + if (d->m_flags & (TDEFL_RLE_MATCHES | TDEFL_FORCE_ALL_RAW_BLOCKS)) + { + if ((d->m_dict_size) && (!(d->m_flags & TDEFL_FORCE_ALL_RAW_BLOCKS))) + { + mz_uint8 c = d->m_dict[(cur_pos - 1) & TDEFL_LZ_DICT_SIZE_MASK]; + cur_match_len = 0; while (cur_match_len < d->m_lookahead_size) { if (d->m_dict[cur_pos + cur_match_len] != c) break; cur_match_len++; } + if (cur_match_len < TDEFL_MIN_MATCH_LEN) cur_match_len = 0; else cur_match_dist = 1; + } + } + else + { + tdefl_find_match(d, d->m_lookahead_pos, d->m_dict_size, d->m_lookahead_size, &cur_match_dist, &cur_match_len); + } + if (((cur_match_len == TDEFL_MIN_MATCH_LEN) && (cur_match_dist >= 8U*1024U)) || (cur_pos == cur_match_dist) || ((d->m_flags & TDEFL_FILTER_MATCHES) && (cur_match_len <= 5))) + { + cur_match_dist = cur_match_len = 0; + } + if (d->m_saved_match_len) + { + if (cur_match_len > d->m_saved_match_len) + { + tdefl_record_literal(d, (mz_uint8)d->m_saved_lit); + if (cur_match_len >= 128) + { + tdefl_record_match(d, cur_match_len, cur_match_dist); + d->m_saved_match_len = 0; len_to_move = cur_match_len; + } + else + { + d->m_saved_lit = d->m_dict[cur_pos]; d->m_saved_match_dist = cur_match_dist; d->m_saved_match_len = cur_match_len; + } + } + else + { + tdefl_record_match(d, d->m_saved_match_len, d->m_saved_match_dist); + len_to_move = d->m_saved_match_len - 1; d->m_saved_match_len = 0; + } + } + else if (!cur_match_dist) + tdefl_record_literal(d, d->m_dict[MZ_MIN(cur_pos, sizeof(d->m_dict) - 1)]); + else if ((d->m_greedy_parsing) || (d->m_flags & TDEFL_RLE_MATCHES) || (cur_match_len >= 128)) + { + tdefl_record_match(d, cur_match_len, cur_match_dist); + len_to_move = cur_match_len; + } + else + { + d->m_saved_lit = d->m_dict[MZ_MIN(cur_pos, sizeof(d->m_dict) - 1)]; d->m_saved_match_dist = cur_match_dist; d->m_saved_match_len = cur_match_len; + } + // Move the lookahead forward by len_to_move bytes. + d->m_lookahead_pos += len_to_move; + MZ_ASSERT(d->m_lookahead_size >= len_to_move); + d->m_lookahead_size -= len_to_move; + d->m_dict_size = MZ_MIN(d->m_dict_size + len_to_move, TDEFL_LZ_DICT_SIZE); + // Check if it's time to flush the current LZ codes to the internal output buffer. + if ( (d->m_pLZ_code_buf > &d->m_lz_code_buf[TDEFL_LZ_CODE_BUF_SIZE - 8]) || + ( (d->m_total_lz_bytes > 31*1024) && (((((mz_uint)(d->m_pLZ_code_buf - d->m_lz_code_buf) * 115) >> 7) >= d->m_total_lz_bytes) || (d->m_flags & TDEFL_FORCE_ALL_RAW_BLOCKS))) ) + { + int n; + d->m_pSrc = pSrc; d->m_src_buf_left = src_buf_left; + if ((n = tdefl_flush_block(d, 0)) != 0) + return (n < 0) ? MZ_FALSE : MZ_TRUE; + } + } + + d->m_pSrc = pSrc; d->m_src_buf_left = src_buf_left; + return MZ_TRUE; +} + +static tdefl_status tdefl_flush_output_buffer(tdefl_compressor *d) +{ + if (d->m_pIn_buf_size) + { + *d->m_pIn_buf_size = d->m_pSrc - (const mz_uint8 *)d->m_pIn_buf; + } + + if (d->m_pOut_buf_size) + { + size_t n = MZ_MIN(*d->m_pOut_buf_size - d->m_out_buf_ofs, d->m_output_flush_remaining); + memcpy((mz_uint8 *)d->m_pOut_buf + d->m_out_buf_ofs, d->m_output_buf + d->m_output_flush_ofs, n); + d->m_output_flush_ofs += (mz_uint)n; + d->m_output_flush_remaining -= (mz_uint)n; + d->m_out_buf_ofs += n; + + *d->m_pOut_buf_size = d->m_out_buf_ofs; + } + + return (d->m_finished && !d->m_output_flush_remaining) ? TDEFL_STATUS_DONE : TDEFL_STATUS_OKAY; +} + +tdefl_status tdefl_compress(tdefl_compressor *d, const void *pIn_buf, size_t *pIn_buf_size, void *pOut_buf, size_t *pOut_buf_size, tdefl_flush flush) +{ + if (!d) + { + if (pIn_buf_size) *pIn_buf_size = 0; + if (pOut_buf_size) *pOut_buf_size = 0; + return TDEFL_STATUS_BAD_PARAM; + } + + d->m_pIn_buf = pIn_buf; d->m_pIn_buf_size = pIn_buf_size; + d->m_pOut_buf = pOut_buf; d->m_pOut_buf_size = pOut_buf_size; + d->m_pSrc = (const mz_uint8 *)(pIn_buf); d->m_src_buf_left = pIn_buf_size ? *pIn_buf_size : 0; + d->m_out_buf_ofs = 0; + d->m_flush = flush; + + if ( ((d->m_pPut_buf_func != NULL) == ((pOut_buf != NULL) || (pOut_buf_size != NULL))) || (d->m_prev_return_status != TDEFL_STATUS_OKAY) || + (d->m_wants_to_finish && (flush != TDEFL_FINISH)) || (pIn_buf_size && *pIn_buf_size && !pIn_buf) || (pOut_buf_size && *pOut_buf_size && !pOut_buf) ) + { + if (pIn_buf_size) *pIn_buf_size = 0; + if (pOut_buf_size) *pOut_buf_size = 0; + return (d->m_prev_return_status = TDEFL_STATUS_BAD_PARAM); + } + d->m_wants_to_finish |= (flush == TDEFL_FINISH); + + if ((d->m_output_flush_remaining) || (d->m_finished)) + return (d->m_prev_return_status = tdefl_flush_output_buffer(d)); + +#if MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN + if (((d->m_flags & TDEFL_MAX_PROBES_MASK) == 1) && + ((d->m_flags & TDEFL_GREEDY_PARSING_FLAG) != 0) && + ((d->m_flags & (TDEFL_FILTER_MATCHES | TDEFL_FORCE_ALL_RAW_BLOCKS | TDEFL_RLE_MATCHES)) == 0)) + { + if (!tdefl_compress_fast(d)) + return d->m_prev_return_status; + } + else +#endif // #if MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN + { + if (!tdefl_compress_normal(d)) + return d->m_prev_return_status; + } + + if ((d->m_flags & (TDEFL_WRITE_ZLIB_HEADER | TDEFL_COMPUTE_ADLER32)) && (pIn_buf)) + d->m_adler32 = (mz_uint32)mz_adler32(d->m_adler32, (const mz_uint8 *)pIn_buf, d->m_pSrc - (const mz_uint8 *)pIn_buf); + + if ((flush) && (!d->m_lookahead_size) && (!d->m_src_buf_left) && (!d->m_output_flush_remaining)) + { + if (tdefl_flush_block(d, flush) < 0) + return d->m_prev_return_status; + d->m_finished = (flush == TDEFL_FINISH); + if (flush == TDEFL_FULL_FLUSH) { MZ_CLEAR_OBJ(d->m_hash); MZ_CLEAR_OBJ(d->m_next); d->m_dict_size = 0; } + } + + return (d->m_prev_return_status = tdefl_flush_output_buffer(d)); +} + +tdefl_status tdefl_compress_buffer(tdefl_compressor *d, const void *pIn_buf, size_t in_buf_size, tdefl_flush flush) +{ + MZ_ASSERT(d->m_pPut_buf_func); return tdefl_compress(d, pIn_buf, &in_buf_size, NULL, NULL, flush); +} + +tdefl_status tdefl_init(tdefl_compressor *d, tdefl_put_buf_func_ptr pPut_buf_func, void *pPut_buf_user, int flags) +{ + d->m_pPut_buf_func = pPut_buf_func; d->m_pPut_buf_user = pPut_buf_user; + d->m_flags = (mz_uint)(flags); d->m_max_probes[0] = 1 + ((flags & 0xFFF) + 2) / 3; d->m_greedy_parsing = (flags & TDEFL_GREEDY_PARSING_FLAG) != 0; + d->m_max_probes[1] = 1 + (((flags & 0xFFF) >> 2) + 2) / 3; + if (!(flags & TDEFL_NONDETERMINISTIC_PARSING_FLAG)) MZ_CLEAR_OBJ(d->m_hash); + d->m_lookahead_pos = d->m_lookahead_size = d->m_dict_size = d->m_total_lz_bytes = d->m_lz_code_buf_dict_pos = d->m_bits_in = 0; + d->m_output_flush_ofs = d->m_output_flush_remaining = d->m_finished = d->m_block_index = d->m_bit_buffer = d->m_wants_to_finish = 0; + d->m_pLZ_code_buf = d->m_lz_code_buf + 1; d->m_pLZ_flags = d->m_lz_code_buf; d->m_num_flags_left = 8; + d->m_pOutput_buf = d->m_output_buf; d->m_pOutput_buf_end = d->m_output_buf; d->m_prev_return_status = TDEFL_STATUS_OKAY; + d->m_saved_match_dist = d->m_saved_match_len = d->m_saved_lit = 0; d->m_adler32 = 1; + d->m_pIn_buf = NULL; d->m_pOut_buf = NULL; + d->m_pIn_buf_size = NULL; d->m_pOut_buf_size = NULL; + d->m_flush = TDEFL_NO_FLUSH; d->m_pSrc = NULL; d->m_src_buf_left = 0; d->m_out_buf_ofs = 0; + memset(&d->m_huff_count[0][0], 0, sizeof(d->m_huff_count[0][0]) * TDEFL_MAX_HUFF_SYMBOLS_0); + memset(&d->m_huff_count[1][0], 0, sizeof(d->m_huff_count[1][0]) * TDEFL_MAX_HUFF_SYMBOLS_1); + return TDEFL_STATUS_OKAY; +} + +tdefl_status tdefl_get_prev_return_status(tdefl_compressor *d) +{ + return d->m_prev_return_status; +} + +mz_uint32 tdefl_get_adler32(tdefl_compressor *d) +{ + return d->m_adler32; +} + +mz_bool tdefl_compress_mem_to_output(const void *pBuf, size_t buf_len, tdefl_put_buf_func_ptr pPut_buf_func, void *pPut_buf_user, int flags) +{ + tdefl_compressor *pComp; mz_bool succeeded; if (((buf_len) && (!pBuf)) || (!pPut_buf_func)) return MZ_FALSE; + pComp = (tdefl_compressor*)MZ_MALLOC(sizeof(tdefl_compressor)); if (!pComp) return MZ_FALSE; + succeeded = (tdefl_init(pComp, pPut_buf_func, pPut_buf_user, flags) == TDEFL_STATUS_OKAY); + succeeded = succeeded && (tdefl_compress_buffer(pComp, pBuf, buf_len, TDEFL_FINISH) == TDEFL_STATUS_DONE); + MZ_FREE(pComp); return succeeded; +} + +typedef struct +{ + size_t m_size, m_capacity; + mz_uint8 *m_pBuf; + mz_bool m_expandable; +} tdefl_output_buffer; + +static mz_bool tdefl_output_buffer_putter(const void *pBuf, int len, void *pUser) +{ + tdefl_output_buffer *p = (tdefl_output_buffer *)pUser; + size_t new_size = p->m_size + len; + if (new_size > p->m_capacity) + { + size_t new_capacity = p->m_capacity; mz_uint8 *pNew_buf; if (!p->m_expandable) return MZ_FALSE; + do { new_capacity = MZ_MAX(128U, new_capacity << 1U); } while (new_size > new_capacity); + pNew_buf = (mz_uint8*)MZ_REALLOC(p->m_pBuf, new_capacity); if (!pNew_buf) return MZ_FALSE; + p->m_pBuf = pNew_buf; p->m_capacity = new_capacity; + } + memcpy((mz_uint8*)p->m_pBuf + p->m_size, pBuf, len); p->m_size = new_size; + return MZ_TRUE; +} + +void *tdefl_compress_mem_to_heap(const void *pSrc_buf, size_t src_buf_len, size_t *pOut_len, int flags) +{ + tdefl_output_buffer out_buf; MZ_CLEAR_OBJ(out_buf); + if (!pOut_len) return MZ_FALSE; else *pOut_len = 0; + out_buf.m_expandable = MZ_TRUE; + if (!tdefl_compress_mem_to_output(pSrc_buf, src_buf_len, tdefl_output_buffer_putter, &out_buf, flags)) return NULL; + *pOut_len = out_buf.m_size; return out_buf.m_pBuf; +} + +size_t tdefl_compress_mem_to_mem(void *pOut_buf, size_t out_buf_len, const void *pSrc_buf, size_t src_buf_len, int flags) +{ + tdefl_output_buffer out_buf; MZ_CLEAR_OBJ(out_buf); + if (!pOut_buf) return 0; + out_buf.m_pBuf = (mz_uint8*)pOut_buf; out_buf.m_capacity = out_buf_len; + if (!tdefl_compress_mem_to_output(pSrc_buf, src_buf_len, tdefl_output_buffer_putter, &out_buf, flags)) return 0; + return out_buf.m_size; +} + +#ifndef MINIZ_NO_ZLIB_APIS +static const mz_uint s_tdefl_num_probes[11] = { 0, 1, 6, 32, 16, 32, 128, 256, 512, 768, 1500 }; + +// level may actually range from [0,10] (10 is a "hidden" max level, where we want a bit more compression and it's fine if throughput to fall off a cliff on some files). +mz_uint tdefl_create_comp_flags_from_zip_params(int level, int window_bits, int strategy) +{ + mz_uint comp_flags = s_tdefl_num_probes[(level >= 0) ? MZ_MIN(10, level) : MZ_DEFAULT_LEVEL] | ((level <= 3) ? TDEFL_GREEDY_PARSING_FLAG : 0); + if (window_bits > 0) comp_flags |= TDEFL_WRITE_ZLIB_HEADER; + + if (!level) comp_flags |= TDEFL_FORCE_ALL_RAW_BLOCKS; + else if (strategy == MZ_FILTERED) comp_flags |= TDEFL_FILTER_MATCHES; + else if (strategy == MZ_HUFFMAN_ONLY) comp_flags &= ~TDEFL_MAX_PROBES_MASK; + else if (strategy == MZ_FIXED) comp_flags |= TDEFL_FORCE_ALL_STATIC_BLOCKS; + else if (strategy == MZ_RLE) comp_flags |= TDEFL_RLE_MATCHES; + + return comp_flags; +} +#endif //MINIZ_NO_ZLIB_APIS + +#ifdef _MSC_VER +#pragma warning (push) +#pragma warning (disable:4204) // nonstandard extension used : non-constant aggregate initializer (also supported by GNU C and C99, so no big deal) +#endif + +// Simple PNG writer function by Alex Evans, 2011. Released into the public domain: https://gist.github.com/908299, more context at +// http://altdevblogaday.org/2011/04/06/a-smaller-jpg-encoder/. +// This is actually a modification of Alex's original code so PNG files generated by this function pass pngcheck. +void *tdefl_write_image_to_png_file_in_memory_ex(const void *pImage, int w, int h, int num_chans, size_t *pLen_out, mz_uint level, mz_bool flip) +{ + // Using a local copy of this array here in case MINIZ_NO_ZLIB_APIS was defined. + static const mz_uint s_tdefl_png_num_probes[11] = { 0, 1, 6, 32, 16, 32, 128, 256, 512, 768, 1500 }; + tdefl_compressor *pComp = (tdefl_compressor *)MZ_MALLOC(sizeof(tdefl_compressor)); tdefl_output_buffer out_buf; int i, bpl = w * num_chans, y, z; mz_uint32 c; *pLen_out = 0; + if (!pComp) return NULL; + MZ_CLEAR_OBJ(out_buf); out_buf.m_expandable = MZ_TRUE; out_buf.m_capacity = 57+MZ_MAX(64, (1+bpl)*h); if (NULL == (out_buf.m_pBuf = (mz_uint8*)MZ_MALLOC(out_buf.m_capacity))) { MZ_FREE(pComp); return NULL; } + // write dummy header + for (z = 41; z; --z) tdefl_output_buffer_putter(&z, 1, &out_buf); + // compress image data + tdefl_init(pComp, tdefl_output_buffer_putter, &out_buf, s_tdefl_png_num_probes[MZ_MIN(10, level)] | TDEFL_WRITE_ZLIB_HEADER); + for (y = 0; y < h; ++y) { tdefl_compress_buffer(pComp, &z, 1, TDEFL_NO_FLUSH); tdefl_compress_buffer(pComp, (mz_uint8*)pImage + (flip ? (h - 1 - y) : y) * bpl, bpl, TDEFL_NO_FLUSH); } + if (tdefl_compress_buffer(pComp, NULL, 0, TDEFL_FINISH) != TDEFL_STATUS_DONE) { MZ_FREE(pComp); MZ_FREE(out_buf.m_pBuf); return NULL; } + // write real header + *pLen_out = out_buf.m_size-41; + { + static const mz_uint8 chans[] = {0x00, 0x00, 0x04, 0x02, 0x06}; + mz_uint8 pnghdr[41]={0x89,0x50,0x4e,0x47,0x0d,0x0a,0x1a,0x0a,0x00,0x00,0x00,0x0d,0x49,0x48,0x44,0x52, + 0,0,(mz_uint8)(w>>8),(mz_uint8)w,0,0,(mz_uint8)(h>>8),(mz_uint8)h,8,chans[num_chans],0,0,0,0,0,0,0, + (mz_uint8)(*pLen_out>>24),(mz_uint8)(*pLen_out>>16),(mz_uint8)(*pLen_out>>8),(mz_uint8)*pLen_out,0x49,0x44,0x41,0x54}; + c=(mz_uint32)mz_crc32(MZ_CRC32_INIT,pnghdr+12,17); for (i=0; i<4; ++i, c<<=8) ((mz_uint8*)(pnghdr+29))[i]=(mz_uint8)(c>>24); + memcpy(out_buf.m_pBuf, pnghdr, 41); + } + // write footer (IDAT CRC-32, followed by IEND chunk) + if (!tdefl_output_buffer_putter("\0\0\0\0\0\0\0\0\x49\x45\x4e\x44\xae\x42\x60\x82", 16, &out_buf)) { *pLen_out = 0; MZ_FREE(pComp); MZ_FREE(out_buf.m_pBuf); return NULL; } + c = (mz_uint32)mz_crc32(MZ_CRC32_INIT,out_buf.m_pBuf+41-4, *pLen_out+4); for (i=0; i<4; ++i, c<<=8) (out_buf.m_pBuf+out_buf.m_size-16)[i] = (mz_uint8)(c >> 24); + // compute final size of file, grab compressed data buffer and return + *pLen_out += 57; MZ_FREE(pComp); return out_buf.m_pBuf; +} +void *tdefl_write_image_to_png_file_in_memory(const void *pImage, int w, int h, int num_chans, size_t *pLen_out) +{ + // Level 6 corresponds to TDEFL_DEFAULT_MAX_PROBES or MZ_DEFAULT_LEVEL (but we can't depend on MZ_DEFAULT_LEVEL being available in case the zlib API's where #defined out) + return tdefl_write_image_to_png_file_in_memory_ex(pImage, w, h, num_chans, pLen_out, 6, MZ_FALSE); +} + +#ifdef _MSC_VER +#pragma warning (pop) +#endif + +// ------------------- .ZIP archive reading + +#ifndef MINIZ_NO_ARCHIVE_APIS + +#ifdef MINIZ_NO_STDIO +#define MZ_FILE void * +#else +#include +#include + +#if defined(_MSC_VER) || defined(__MINGW64__) +static FILE *mz_fopen(const char *pFilename, const char *pMode) + { + FILE* pFile = NULL; + fopen_s(&pFile, pFilename, pMode); + return pFile; + } + static FILE *mz_freopen(const char *pPath, const char *pMode, FILE *pStream) + { + FILE* pFile = NULL; + if (freopen_s(&pFile, pPath, pMode, pStream)) + return NULL; + return pFile; + } + #ifndef MINIZ_NO_TIME + #include + #endif + #define MZ_FILE FILE + #define MZ_FOPEN mz_fopen + #define MZ_FCLOSE fclose + #define MZ_FREAD fread + #define MZ_FWRITE fwrite + #define MZ_FTELL64 _ftelli64 + #define MZ_FSEEK64 _fseeki64 + #define MZ_FILE_STAT_STRUCT _stat + #define MZ_FILE_STAT _stat + #define MZ_FFLUSH fflush + #define MZ_FREOPEN mz_freopen + #define MZ_DELETE_FILE remove +#elif defined(__MINGW32__) +#ifndef MINIZ_NO_TIME + #include + #endif + #define MZ_FILE FILE + #define MZ_FOPEN(f, m) fopen(f, m) + #define MZ_FCLOSE fclose + #define MZ_FREAD fread + #define MZ_FWRITE fwrite + #define MZ_FTELL64 ftello64 + #define MZ_FSEEK64 fseeko64 + #define MZ_FILE_STAT_STRUCT _stat + #define MZ_FILE_STAT _stat + #define MZ_FFLUSH fflush + #define MZ_FREOPEN(f, m, s) freopen(f, m, s) + #define MZ_DELETE_FILE remove +#elif defined(__TINYC__) +#ifndef MINIZ_NO_TIME + #include + #endif + #define MZ_FILE FILE + #define MZ_FOPEN(f, m) fopen(f, m) + #define MZ_FCLOSE fclose + #define MZ_FREAD fread + #define MZ_FWRITE fwrite + #define MZ_FTELL64 ftell + #define MZ_FSEEK64 fseek + #define MZ_FILE_STAT_STRUCT stat + #define MZ_FILE_STAT stat + #define MZ_FFLUSH fflush + #define MZ_FREOPEN(f, m, s) freopen(f, m, s) + #define MZ_DELETE_FILE remove +#elif defined(__GNUC__) && _LARGEFILE64_SOURCE +#ifndef MINIZ_NO_TIME +#include +#endif +#define MZ_FILE FILE +#define MZ_FOPEN(f, m) fopen64(f, m) +#define MZ_FCLOSE fclose +#define MZ_FREAD fread +#define MZ_FWRITE fwrite +#define MZ_FTELL64 ftello64 +#define MZ_FSEEK64 fseeko64 +#define MZ_FILE_STAT_STRUCT stat64 +#define MZ_FILE_STAT stat64 +#define MZ_FFLUSH fflush +#define MZ_FREOPEN(p, m, s) freopen64(p, m, s) +#define MZ_DELETE_FILE remove +#else +#ifndef MINIZ_NO_TIME + #include + #endif + #define MZ_FILE FILE + #define MZ_FOPEN(f, m) fopen(f, m) + #define MZ_FCLOSE fclose + #define MZ_FREAD fread + #define MZ_FWRITE fwrite + #define MZ_FTELL64 ftello + #define MZ_FSEEK64 fseeko + #define MZ_FILE_STAT_STRUCT stat + #define MZ_FILE_STAT stat + #define MZ_FFLUSH fflush + #define MZ_FREOPEN(f, m, s) freopen(f, m, s) + #define MZ_DELETE_FILE remove +#endif // #ifdef _MSC_VER +#endif // #ifdef MINIZ_NO_STDIO + +#define MZ_TOLOWER(c) ((((c) >= 'A') && ((c) <= 'Z')) ? ((c) - 'A' + 'a') : (c)) + +// Various ZIP archive enums. To completely avoid cross platform compiler alignment and platform endian issues, miniz.c doesn't use structs for any of this stuff. +enum +{ + // ZIP archive identifiers and record sizes + MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIG = 0x06054b50, MZ_ZIP_CENTRAL_DIR_HEADER_SIG = 0x02014b50, MZ_ZIP_LOCAL_DIR_HEADER_SIG = 0x04034b50, + MZ_ZIP_LOCAL_DIR_HEADER_SIZE = 30, MZ_ZIP_CENTRAL_DIR_HEADER_SIZE = 46, MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE = 22, + // Central directory header record offsets + MZ_ZIP_CDH_SIG_OFS = 0, MZ_ZIP_CDH_VERSION_MADE_BY_OFS = 4, MZ_ZIP_CDH_VERSION_NEEDED_OFS = 6, MZ_ZIP_CDH_BIT_FLAG_OFS = 8, + MZ_ZIP_CDH_METHOD_OFS = 10, MZ_ZIP_CDH_FILE_TIME_OFS = 12, MZ_ZIP_CDH_FILE_DATE_OFS = 14, MZ_ZIP_CDH_CRC32_OFS = 16, + MZ_ZIP_CDH_COMPRESSED_SIZE_OFS = 20, MZ_ZIP_CDH_DECOMPRESSED_SIZE_OFS = 24, MZ_ZIP_CDH_FILENAME_LEN_OFS = 28, MZ_ZIP_CDH_EXTRA_LEN_OFS = 30, + MZ_ZIP_CDH_COMMENT_LEN_OFS = 32, MZ_ZIP_CDH_DISK_START_OFS = 34, MZ_ZIP_CDH_INTERNAL_ATTR_OFS = 36, MZ_ZIP_CDH_EXTERNAL_ATTR_OFS = 38, MZ_ZIP_CDH_LOCAL_HEADER_OFS = 42, + // Local directory header offsets + MZ_ZIP_LDH_SIG_OFS = 0, MZ_ZIP_LDH_VERSION_NEEDED_OFS = 4, MZ_ZIP_LDH_BIT_FLAG_OFS = 6, MZ_ZIP_LDH_METHOD_OFS = 8, MZ_ZIP_LDH_FILE_TIME_OFS = 10, + MZ_ZIP_LDH_FILE_DATE_OFS = 12, MZ_ZIP_LDH_CRC32_OFS = 14, MZ_ZIP_LDH_COMPRESSED_SIZE_OFS = 18, MZ_ZIP_LDH_DECOMPRESSED_SIZE_OFS = 22, + MZ_ZIP_LDH_FILENAME_LEN_OFS = 26, MZ_ZIP_LDH_EXTRA_LEN_OFS = 28, + // End of central directory offsets + MZ_ZIP_ECDH_SIG_OFS = 0, MZ_ZIP_ECDH_NUM_THIS_DISK_OFS = 4, MZ_ZIP_ECDH_NUM_DISK_CDIR_OFS = 6, MZ_ZIP_ECDH_CDIR_NUM_ENTRIES_ON_DISK_OFS = 8, + MZ_ZIP_ECDH_CDIR_TOTAL_ENTRIES_OFS = 10, MZ_ZIP_ECDH_CDIR_SIZE_OFS = 12, MZ_ZIP_ECDH_CDIR_OFS_OFS = 16, MZ_ZIP_ECDH_COMMENT_SIZE_OFS = 20, +}; + +typedef struct +{ + void *m_p; + size_t m_size, m_capacity; + mz_uint m_element_size; +} mz_zip_array; + +struct mz_zip_internal_state_tag +{ + mz_zip_array m_central_dir; + mz_zip_array m_central_dir_offsets; + mz_zip_array m_sorted_central_dir_offsets; + MZ_FILE *m_pFile; + void *m_pMem; + size_t m_mem_size; + size_t m_mem_capacity; +}; + +#define MZ_ZIP_ARRAY_SET_ELEMENT_SIZE(array_ptr, element_size) (array_ptr)->m_element_size = element_size +#define MZ_ZIP_ARRAY_ELEMENT(array_ptr, element_type, index) ((element_type *)((array_ptr)->m_p))[index] + +static MZ_FORCEINLINE void mz_zip_array_clear(mz_zip_archive *pZip, mz_zip_array *pArray) +{ + pZip->m_pFree(pZip->m_pAlloc_opaque, pArray->m_p); + memset(pArray, 0, sizeof(mz_zip_array)); +} + +static mz_bool mz_zip_array_ensure_capacity(mz_zip_archive *pZip, mz_zip_array *pArray, size_t min_new_capacity, mz_uint growing) +{ + void *pNew_p; size_t new_capacity = min_new_capacity; MZ_ASSERT(pArray->m_element_size); if (pArray->m_capacity >= min_new_capacity) return MZ_TRUE; + if (growing) { new_capacity = MZ_MAX(1, pArray->m_capacity); while (new_capacity < min_new_capacity) new_capacity *= 2; } + if (NULL == (pNew_p = pZip->m_pRealloc(pZip->m_pAlloc_opaque, pArray->m_p, pArray->m_element_size, new_capacity))) return MZ_FALSE; + pArray->m_p = pNew_p; pArray->m_capacity = new_capacity; + return MZ_TRUE; +} + +static MZ_FORCEINLINE mz_bool mz_zip_array_reserve(mz_zip_archive *pZip, mz_zip_array *pArray, size_t new_capacity, mz_uint growing) +{ + if (new_capacity > pArray->m_capacity) { if (!mz_zip_array_ensure_capacity(pZip, pArray, new_capacity, growing)) return MZ_FALSE; } + return MZ_TRUE; +} + +static MZ_FORCEINLINE mz_bool mz_zip_array_resize(mz_zip_archive *pZip, mz_zip_array *pArray, size_t new_size, mz_uint growing) +{ + if (new_size > pArray->m_capacity) { if (!mz_zip_array_ensure_capacity(pZip, pArray, new_size, growing)) return MZ_FALSE; } + pArray->m_size = new_size; + return MZ_TRUE; +} + +static MZ_FORCEINLINE mz_bool mz_zip_array_ensure_room(mz_zip_archive *pZip, mz_zip_array *pArray, size_t n) +{ + return mz_zip_array_reserve(pZip, pArray, pArray->m_size + n, MZ_TRUE); +} + +static MZ_FORCEINLINE mz_bool mz_zip_array_push_back(mz_zip_archive *pZip, mz_zip_array *pArray, const void *pElements, size_t n) +{ + size_t orig_size = pArray->m_size; if (!mz_zip_array_resize(pZip, pArray, orig_size + n, MZ_TRUE)) return MZ_FALSE; + memcpy((mz_uint8*)pArray->m_p + orig_size * pArray->m_element_size, pElements, n * pArray->m_element_size); + return MZ_TRUE; +} + +#ifndef MINIZ_NO_TIME +static time_t mz_zip_dos_to_time_t(int dos_time, int dos_date) +{ + struct tm tm; + memset(&tm, 0, sizeof(tm)); tm.tm_isdst = -1; + tm.tm_year = ((dos_date >> 9) & 127) + 1980 - 1900; tm.tm_mon = ((dos_date >> 5) & 15) - 1; tm.tm_mday = dos_date & 31; + tm.tm_hour = (dos_time >> 11) & 31; tm.tm_min = (dos_time >> 5) & 63; tm.tm_sec = (dos_time << 1) & 62; + return mktime(&tm); +} + +static void mz_zip_time_to_dos_time(time_t time, mz_uint16 *pDOS_time, mz_uint16 *pDOS_date) +{ +#ifdef _MSC_VER + struct tm tm_struct; + struct tm *tm = &tm_struct; + errno_t err = localtime_s(tm, &time); + if (err) + { + *pDOS_date = 0; *pDOS_time = 0; + return; + } +#else + struct tm *tm = localtime(&time); +#endif + *pDOS_time = (mz_uint16)(((tm->tm_hour) << 11) + ((tm->tm_min) << 5) + ((tm->tm_sec) >> 1)); + *pDOS_date = (mz_uint16)(((tm->tm_year + 1900 - 1980) << 9) + ((tm->tm_mon + 1) << 5) + tm->tm_mday); +} +#endif + +#ifndef MINIZ_NO_STDIO +static mz_bool mz_zip_get_file_modified_time(const char *pFilename, mz_uint16 *pDOS_time, mz_uint16 *pDOS_date) +{ +#ifdef MINIZ_NO_TIME + (void)pFilename; *pDOS_date = *pDOS_time = 0; +#else + struct MZ_FILE_STAT_STRUCT file_stat; + // On Linux with x86 glibc, this call will fail on large files (>= 0x80000000 bytes) unless you compiled with _LARGEFILE64_SOURCE. Argh. + if (MZ_FILE_STAT(pFilename, &file_stat) != 0) + return MZ_FALSE; + mz_zip_time_to_dos_time(file_stat.st_mtime, pDOS_time, pDOS_date); +#endif // #ifdef MINIZ_NO_TIME + return MZ_TRUE; +} + +#ifndef MINIZ_NO_TIME +static mz_bool mz_zip_set_file_times(const char *pFilename, time_t access_time, time_t modified_time) +{ + struct utimbuf t; t.actime = access_time; t.modtime = modified_time; + return !utime(pFilename, &t); +} +#endif // #ifndef MINIZ_NO_TIME +#endif // #ifndef MINIZ_NO_STDIO + +static mz_bool mz_zip_reader_init_internal(mz_zip_archive *pZip, mz_uint32 flags) +{ + (void)flags; + if ((!pZip) || (pZip->m_pState) || (pZip->m_zip_mode != MZ_ZIP_MODE_INVALID)) + return MZ_FALSE; + + if (!pZip->m_pAlloc) pZip->m_pAlloc = def_alloc_func; + if (!pZip->m_pFree) pZip->m_pFree = def_free_func; + if (!pZip->m_pRealloc) pZip->m_pRealloc = def_realloc_func; + + pZip->m_zip_mode = MZ_ZIP_MODE_READING; + pZip->m_archive_size = 0; + pZip->m_central_directory_file_ofs = 0; + pZip->m_total_files = 0; + + if (NULL == (pZip->m_pState = (mz_zip_internal_state *)pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, sizeof(mz_zip_internal_state)))) + return MZ_FALSE; + memset(pZip->m_pState, 0, sizeof(mz_zip_internal_state)); + MZ_ZIP_ARRAY_SET_ELEMENT_SIZE(&pZip->m_pState->m_central_dir, sizeof(mz_uint8)); + MZ_ZIP_ARRAY_SET_ELEMENT_SIZE(&pZip->m_pState->m_central_dir_offsets, sizeof(mz_uint32)); + MZ_ZIP_ARRAY_SET_ELEMENT_SIZE(&pZip->m_pState->m_sorted_central_dir_offsets, sizeof(mz_uint32)); + return MZ_TRUE; +} + +static MZ_FORCEINLINE mz_bool mz_zip_reader_filename_less(const mz_zip_array *pCentral_dir_array, const mz_zip_array *pCentral_dir_offsets, mz_uint l_index, mz_uint r_index) +{ + const mz_uint8 *pL = &MZ_ZIP_ARRAY_ELEMENT(pCentral_dir_array, mz_uint8, MZ_ZIP_ARRAY_ELEMENT(pCentral_dir_offsets, mz_uint32, l_index)), *pE; + const mz_uint8 *pR = &MZ_ZIP_ARRAY_ELEMENT(pCentral_dir_array, mz_uint8, MZ_ZIP_ARRAY_ELEMENT(pCentral_dir_offsets, mz_uint32, r_index)); + mz_uint l_len = MZ_READ_LE16(pL + MZ_ZIP_CDH_FILENAME_LEN_OFS), r_len = MZ_READ_LE16(pR + MZ_ZIP_CDH_FILENAME_LEN_OFS); + mz_uint8 l = 0, r = 0; + pL += MZ_ZIP_CENTRAL_DIR_HEADER_SIZE; pR += MZ_ZIP_CENTRAL_DIR_HEADER_SIZE; + pE = pL + MZ_MIN(l_len, r_len); + while (pL < pE) + { + if ((l = MZ_TOLOWER(*pL)) != (r = MZ_TOLOWER(*pR))) + break; + pL++; pR++; + } + return (pL == pE) ? (l_len < r_len) : (l < r); +} + +#define MZ_SWAP_UINT32(a, b) do { mz_uint32 t = a; a = b; b = t; } MZ_MACRO_END + +// Heap sort of lowercased filenames, used to help accelerate plain central directory searches by mz_zip_reader_locate_file(). (Could also use qsort(), but it could allocate memory.) +static void mz_zip_reader_sort_central_dir_offsets_by_filename(mz_zip_archive *pZip) +{ + mz_zip_internal_state *pState = pZip->m_pState; + const mz_zip_array *pCentral_dir_offsets = &pState->m_central_dir_offsets; + const mz_zip_array *pCentral_dir = &pState->m_central_dir; + mz_uint32 *pIndices = &MZ_ZIP_ARRAY_ELEMENT(&pState->m_sorted_central_dir_offsets, mz_uint32, 0); + const int size = pZip->m_total_files; + int start = (size - 2) >> 1, end; + while (start >= 0) + { + int child, root = start; + for ( ; ; ) + { + if ((child = (root << 1) + 1) >= size) + break; + child += (((child + 1) < size) && (mz_zip_reader_filename_less(pCentral_dir, pCentral_dir_offsets, pIndices[child], pIndices[child + 1]))); + if (!mz_zip_reader_filename_less(pCentral_dir, pCentral_dir_offsets, pIndices[root], pIndices[child])) + break; + MZ_SWAP_UINT32(pIndices[root], pIndices[child]); root = child; + } + start--; + } + + end = size - 1; + while (end > 0) + { + int child, root = 0; + MZ_SWAP_UINT32(pIndices[end], pIndices[0]); + for ( ; ; ) + { + if ((child = (root << 1) + 1) >= end) + break; + child += (((child + 1) < end) && mz_zip_reader_filename_less(pCentral_dir, pCentral_dir_offsets, pIndices[child], pIndices[child + 1])); + if (!mz_zip_reader_filename_less(pCentral_dir, pCentral_dir_offsets, pIndices[root], pIndices[child])) + break; + MZ_SWAP_UINT32(pIndices[root], pIndices[child]); root = child; + } + end--; + } +} + +static mz_bool mz_zip_reader_read_central_dir(mz_zip_archive *pZip, mz_uint32 flags) +{ + mz_uint cdir_size, num_this_disk, cdir_disk_index; + mz_uint64 cdir_ofs; + mz_int64 cur_file_ofs; + const mz_uint8 *p; + mz_uint32 buf_u32[4096 / sizeof(mz_uint32)]; mz_uint8 *pBuf = (mz_uint8 *)buf_u32; + mz_bool sort_central_dir = ((flags & MZ_ZIP_FLAG_DO_NOT_SORT_CENTRAL_DIRECTORY) == 0); + // Basic sanity checks - reject files which are too small, and check the first 4 bytes of the file to make sure a local header is there. + if (pZip->m_archive_size < MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE) + return MZ_FALSE; + // Find the end of central directory record by scanning the file from the end towards the beginning. + cur_file_ofs = MZ_MAX((mz_int64)pZip->m_archive_size - (mz_int64)sizeof(buf_u32), 0); + for ( ; ; ) + { + int i, n = (int)MZ_MIN(sizeof(buf_u32), pZip->m_archive_size - cur_file_ofs); + if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pBuf, n) != (mz_uint)n) + return MZ_FALSE; + for (i = n - 4; i >= 0; --i) + if (MZ_READ_LE32(pBuf + i) == MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIG) + break; + if (i >= 0) + { + cur_file_ofs += i; + break; + } + if ((!cur_file_ofs) || ((pZip->m_archive_size - cur_file_ofs) >= (0xFFFF + MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE))) + return MZ_FALSE; + cur_file_ofs = MZ_MAX(cur_file_ofs - (sizeof(buf_u32) - 3), 0); + } + // Read and verify the end of central directory record. + if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pBuf, MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE) != MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE) + return MZ_FALSE; + if ((MZ_READ_LE32(pBuf + MZ_ZIP_ECDH_SIG_OFS) != MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIG) || + ((pZip->m_total_files = MZ_READ_LE16(pBuf + MZ_ZIP_ECDH_CDIR_TOTAL_ENTRIES_OFS)) != MZ_READ_LE16(pBuf + MZ_ZIP_ECDH_CDIR_NUM_ENTRIES_ON_DISK_OFS))) + return MZ_FALSE; + + num_this_disk = MZ_READ_LE16(pBuf + MZ_ZIP_ECDH_NUM_THIS_DISK_OFS); + cdir_disk_index = MZ_READ_LE16(pBuf + MZ_ZIP_ECDH_NUM_DISK_CDIR_OFS); + if (((num_this_disk | cdir_disk_index) != 0) && ((num_this_disk != 1) || (cdir_disk_index != 1))) + return MZ_FALSE; + + if ((cdir_size = MZ_READ_LE32(pBuf + MZ_ZIP_ECDH_CDIR_SIZE_OFS)) < pZip->m_total_files * MZ_ZIP_CENTRAL_DIR_HEADER_SIZE) + return MZ_FALSE; + + cdir_ofs = MZ_READ_LE32(pBuf + MZ_ZIP_ECDH_CDIR_OFS_OFS); + if ((cdir_ofs + (mz_uint64)cdir_size) > pZip->m_archive_size) + return MZ_FALSE; + + pZip->m_central_directory_file_ofs = cdir_ofs; + + if (pZip->m_total_files) + { + mz_uint i, n; + + // Read the entire central directory into a heap block, and allocate another heap block to hold the unsorted central dir file record offsets, and another to hold the sorted indices. + if ((!mz_zip_array_resize(pZip, &pZip->m_pState->m_central_dir, cdir_size, MZ_FALSE)) || + (!mz_zip_array_resize(pZip, &pZip->m_pState->m_central_dir_offsets, pZip->m_total_files, MZ_FALSE))) + return MZ_FALSE; + + if (sort_central_dir) + { + if (!mz_zip_array_resize(pZip, &pZip->m_pState->m_sorted_central_dir_offsets, pZip->m_total_files, MZ_FALSE)) + return MZ_FALSE; + } + + if (pZip->m_pRead(pZip->m_pIO_opaque, cdir_ofs, pZip->m_pState->m_central_dir.m_p, cdir_size) != cdir_size) + return MZ_FALSE; + + // Now create an index into the central directory file records, do some basic sanity checking on each record, and check for zip64 entries (which are not yet supported). + p = (const mz_uint8 *)pZip->m_pState->m_central_dir.m_p; + for (n = cdir_size, i = 0; i < pZip->m_total_files; ++i) + { + mz_uint total_header_size, comp_size, decomp_size, disk_index; + if ((n < MZ_ZIP_CENTRAL_DIR_HEADER_SIZE) || (MZ_READ_LE32(p) != MZ_ZIP_CENTRAL_DIR_HEADER_SIG)) + return MZ_FALSE; + MZ_ZIP_ARRAY_ELEMENT(&pZip->m_pState->m_central_dir_offsets, mz_uint32, i) = (mz_uint32)(p - (const mz_uint8 *)pZip->m_pState->m_central_dir.m_p); + if (sort_central_dir) + MZ_ZIP_ARRAY_ELEMENT(&pZip->m_pState->m_sorted_central_dir_offsets, mz_uint32, i) = i; + comp_size = MZ_READ_LE32(p + MZ_ZIP_CDH_COMPRESSED_SIZE_OFS); + decomp_size = MZ_READ_LE32(p + MZ_ZIP_CDH_DECOMPRESSED_SIZE_OFS); + if (((!MZ_READ_LE32(p + MZ_ZIP_CDH_METHOD_OFS)) && (decomp_size != comp_size)) || (decomp_size && !comp_size) || (decomp_size == 0xFFFFFFFF) || (comp_size == 0xFFFFFFFF)) + return MZ_FALSE; + disk_index = MZ_READ_LE16(p + MZ_ZIP_CDH_DISK_START_OFS); + if ((disk_index != num_this_disk) && (disk_index != 1)) + return MZ_FALSE; + if (((mz_uint64)MZ_READ_LE32(p + MZ_ZIP_CDH_LOCAL_HEADER_OFS) + MZ_ZIP_LOCAL_DIR_HEADER_SIZE + comp_size) > pZip->m_archive_size) + return MZ_FALSE; + if ((total_header_size = MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + MZ_READ_LE16(p + MZ_ZIP_CDH_FILENAME_LEN_OFS) + MZ_READ_LE16(p + MZ_ZIP_CDH_EXTRA_LEN_OFS) + MZ_READ_LE16(p + MZ_ZIP_CDH_COMMENT_LEN_OFS)) > n) + return MZ_FALSE; + n -= total_header_size; p += total_header_size; + } + } + + if (sort_central_dir) + mz_zip_reader_sort_central_dir_offsets_by_filename(pZip); + + return MZ_TRUE; +} + +mz_bool mz_zip_reader_init(mz_zip_archive *pZip, mz_uint64 size, mz_uint32 flags) +{ + if ((!pZip) || (!pZip->m_pRead)) + return MZ_FALSE; + if (!mz_zip_reader_init_internal(pZip, flags)) + return MZ_FALSE; + pZip->m_archive_size = size; + if (!mz_zip_reader_read_central_dir(pZip, flags)) + { + mz_zip_reader_end(pZip); + return MZ_FALSE; + } + return MZ_TRUE; +} + +static size_t mz_zip_mem_read_func(void *pOpaque, mz_uint64 file_ofs, void *pBuf, size_t n) +{ + mz_zip_archive *pZip = (mz_zip_archive *)pOpaque; + size_t s = (file_ofs >= pZip->m_archive_size) ? 0 : (size_t)MZ_MIN(pZip->m_archive_size - file_ofs, n); + memcpy(pBuf, (const mz_uint8 *)pZip->m_pState->m_pMem + file_ofs, s); + return s; +} + +mz_bool mz_zip_reader_init_mem(mz_zip_archive *pZip, const void *pMem, size_t size, mz_uint32 flags) +{ + if (!mz_zip_reader_init_internal(pZip, flags)) + return MZ_FALSE; + pZip->m_archive_size = size; + pZip->m_pRead = mz_zip_mem_read_func; + pZip->m_pIO_opaque = pZip; +#ifdef __cplusplus + pZip->m_pState->m_pMem = const_cast(pMem); +#else + pZip->m_pState->m_pMem = (void *)pMem; +#endif + pZip->m_pState->m_mem_size = size; + if (!mz_zip_reader_read_central_dir(pZip, flags)) + { + mz_zip_reader_end(pZip); + return MZ_FALSE; + } + return MZ_TRUE; +} + +#ifndef MINIZ_NO_STDIO +static size_t mz_zip_file_read_func(void *pOpaque, mz_uint64 file_ofs, void *pBuf, size_t n) +{ + mz_zip_archive *pZip = (mz_zip_archive *)pOpaque; + mz_int64 cur_ofs = MZ_FTELL64(pZip->m_pState->m_pFile); + if (((mz_int64)file_ofs < 0) || (((cur_ofs != (mz_int64)file_ofs)) && (MZ_FSEEK64(pZip->m_pState->m_pFile, (mz_int64)file_ofs, SEEK_SET)))) + return 0; + return MZ_FREAD(pBuf, 1, n, pZip->m_pState->m_pFile); +} + +mz_bool mz_zip_reader_init_file(mz_zip_archive *pZip, const char *pFilename, mz_uint32 flags) +{ + mz_uint64 file_size; + MZ_FILE *pFile = MZ_FOPEN(pFilename, "rb"); + if (!pFile) + return MZ_FALSE; + if (MZ_FSEEK64(pFile, 0, SEEK_END)) + { + MZ_FCLOSE(pFile); + return MZ_FALSE; + } + file_size = MZ_FTELL64(pFile); + if (!mz_zip_reader_init_internal(pZip, flags)) + { + MZ_FCLOSE(pFile); + return MZ_FALSE; + } + pZip->m_pRead = mz_zip_file_read_func; + pZip->m_pIO_opaque = pZip; + pZip->m_pState->m_pFile = pFile; + pZip->m_archive_size = file_size; + if (!mz_zip_reader_read_central_dir(pZip, flags)) + { + mz_zip_reader_end(pZip); + return MZ_FALSE; + } + return MZ_TRUE; +} +#endif // #ifndef MINIZ_NO_STDIO + +mz_uint mz_zip_reader_get_num_files(mz_zip_archive *pZip) +{ + return pZip ? pZip->m_total_files : 0; +} + +static MZ_FORCEINLINE const mz_uint8 *mz_zip_reader_get_cdh(mz_zip_archive *pZip, mz_uint file_index) +{ + if ((!pZip) || (!pZip->m_pState) || (file_index >= pZip->m_total_files) || (pZip->m_zip_mode != MZ_ZIP_MODE_READING)) + return NULL; + return &MZ_ZIP_ARRAY_ELEMENT(&pZip->m_pState->m_central_dir, mz_uint8, MZ_ZIP_ARRAY_ELEMENT(&pZip->m_pState->m_central_dir_offsets, mz_uint32, file_index)); +} + +mz_bool mz_zip_reader_is_file_encrypted(mz_zip_archive *pZip, mz_uint file_index) +{ + mz_uint m_bit_flag; + const mz_uint8 *p = mz_zip_reader_get_cdh(pZip, file_index); + if (!p) + return MZ_FALSE; + m_bit_flag = MZ_READ_LE16(p + MZ_ZIP_CDH_BIT_FLAG_OFS); + return (m_bit_flag & 1); +} + +mz_bool mz_zip_reader_is_file_a_directory(mz_zip_archive *pZip, mz_uint file_index) +{ + mz_uint filename_len, external_attr; + const mz_uint8 *p = mz_zip_reader_get_cdh(pZip, file_index); + if (!p) + return MZ_FALSE; + + // First see if the filename ends with a '/' character. + filename_len = MZ_READ_LE16(p + MZ_ZIP_CDH_FILENAME_LEN_OFS); + if (filename_len) + { + if (*(p + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + filename_len - 1) == '/') + return MZ_TRUE; + } + + // Bugfix: This code was also checking if the internal attribute was non-zero, which wasn't correct. + // Most/all zip writers (hopefully) set DOS file/directory attributes in the low 16-bits, so check for the DOS directory flag and ignore the source OS ID in the created by field. + // FIXME: Remove this check? Is it necessary - we already check the filename. + external_attr = MZ_READ_LE32(p + MZ_ZIP_CDH_EXTERNAL_ATTR_OFS); + if ((external_attr & 0x10) != 0) + return MZ_TRUE; + + return MZ_FALSE; +} + +mz_bool mz_zip_reader_file_stat(mz_zip_archive *pZip, mz_uint file_index, mz_zip_archive_file_stat *pStat) +{ + mz_uint n; + const mz_uint8 *p = mz_zip_reader_get_cdh(pZip, file_index); + if ((!p) || (!pStat)) + return MZ_FALSE; + + // Unpack the central directory record. + pStat->m_file_index = file_index; + pStat->m_central_dir_ofs = MZ_ZIP_ARRAY_ELEMENT(&pZip->m_pState->m_central_dir_offsets, mz_uint32, file_index); + pStat->m_version_made_by = MZ_READ_LE16(p + MZ_ZIP_CDH_VERSION_MADE_BY_OFS); + pStat->m_version_needed = MZ_READ_LE16(p + MZ_ZIP_CDH_VERSION_NEEDED_OFS); + pStat->m_bit_flag = MZ_READ_LE16(p + MZ_ZIP_CDH_BIT_FLAG_OFS); + pStat->m_method = MZ_READ_LE16(p + MZ_ZIP_CDH_METHOD_OFS); +#ifndef MINIZ_NO_TIME + pStat->m_time = mz_zip_dos_to_time_t(MZ_READ_LE16(p + MZ_ZIP_CDH_FILE_TIME_OFS), MZ_READ_LE16(p + MZ_ZIP_CDH_FILE_DATE_OFS)); +#endif + pStat->m_crc32 = MZ_READ_LE32(p + MZ_ZIP_CDH_CRC32_OFS); + pStat->m_comp_size = MZ_READ_LE32(p + MZ_ZIP_CDH_COMPRESSED_SIZE_OFS); + pStat->m_uncomp_size = MZ_READ_LE32(p + MZ_ZIP_CDH_DECOMPRESSED_SIZE_OFS); + pStat->m_internal_attr = MZ_READ_LE16(p + MZ_ZIP_CDH_INTERNAL_ATTR_OFS); + pStat->m_external_attr = MZ_READ_LE32(p + MZ_ZIP_CDH_EXTERNAL_ATTR_OFS); + pStat->m_local_header_ofs = MZ_READ_LE32(p + MZ_ZIP_CDH_LOCAL_HEADER_OFS); + + // Copy as much of the filename and comment as possible. + n = MZ_READ_LE16(p + MZ_ZIP_CDH_FILENAME_LEN_OFS); n = MZ_MIN(n, MZ_ZIP_MAX_ARCHIVE_FILENAME_SIZE - 1); + memcpy(pStat->m_filename, p + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE, n); pStat->m_filename[n] = '\0'; + + n = MZ_READ_LE16(p + MZ_ZIP_CDH_COMMENT_LEN_OFS); n = MZ_MIN(n, MZ_ZIP_MAX_ARCHIVE_FILE_COMMENT_SIZE - 1); + pStat->m_comment_size = n; + memcpy(pStat->m_comment, p + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + MZ_READ_LE16(p + MZ_ZIP_CDH_FILENAME_LEN_OFS) + MZ_READ_LE16(p + MZ_ZIP_CDH_EXTRA_LEN_OFS), n); pStat->m_comment[n] = '\0'; + + return MZ_TRUE; +} + +mz_uint mz_zip_reader_get_filename(mz_zip_archive *pZip, mz_uint file_index, char *pFilename, mz_uint filename_buf_size) +{ + mz_uint n; + const mz_uint8 *p = mz_zip_reader_get_cdh(pZip, file_index); + if (!p) { if (filename_buf_size) pFilename[0] = '\0'; return 0; } + n = MZ_READ_LE16(p + MZ_ZIP_CDH_FILENAME_LEN_OFS); + if (filename_buf_size) + { + n = MZ_MIN(n, filename_buf_size - 1); + memcpy(pFilename, p + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE, n); + pFilename[n] = '\0'; + } + return n + 1; +} + +static MZ_FORCEINLINE mz_bool mz_zip_reader_string_equal(const char *pA, const char *pB, mz_uint len, mz_uint flags) +{ + mz_uint i; + if (flags & MZ_ZIP_FLAG_CASE_SENSITIVE) + return 0 == memcmp(pA, pB, len); + for (i = 0; i < len; ++i) + if (MZ_TOLOWER(pA[i]) != MZ_TOLOWER(pB[i])) + return MZ_FALSE; + return MZ_TRUE; +} + +static MZ_FORCEINLINE int mz_zip_reader_filename_compare(const mz_zip_array *pCentral_dir_array, const mz_zip_array *pCentral_dir_offsets, mz_uint l_index, const char *pR, mz_uint r_len) +{ + const mz_uint8 *pL = &MZ_ZIP_ARRAY_ELEMENT(pCentral_dir_array, mz_uint8, MZ_ZIP_ARRAY_ELEMENT(pCentral_dir_offsets, mz_uint32, l_index)), *pE; + mz_uint l_len = MZ_READ_LE16(pL + MZ_ZIP_CDH_FILENAME_LEN_OFS); + mz_uint8 l = 0, r = 0; + pL += MZ_ZIP_CENTRAL_DIR_HEADER_SIZE; + pE = pL + MZ_MIN(l_len, r_len); + while (pL < pE) + { + if ((l = MZ_TOLOWER(*pL)) != (r = MZ_TOLOWER(*pR))) + break; + pL++; pR++; + } + return (pL == pE) ? (int)(l_len - r_len) : (l - r); +} + +static int mz_zip_reader_locate_file_binary_search(mz_zip_archive *pZip, const char *pFilename) +{ + mz_zip_internal_state *pState = pZip->m_pState; + const mz_zip_array *pCentral_dir_offsets = &pState->m_central_dir_offsets; + const mz_zip_array *pCentral_dir = &pState->m_central_dir; + mz_uint32 *pIndices = &MZ_ZIP_ARRAY_ELEMENT(&pState->m_sorted_central_dir_offsets, mz_uint32, 0); + const int size = pZip->m_total_files; + const mz_uint filename_len = (mz_uint)strlen(pFilename); + int l = 0, h = size - 1; + while (l <= h) + { + int m = (l + h) >> 1, file_index = pIndices[m], comp = mz_zip_reader_filename_compare(pCentral_dir, pCentral_dir_offsets, file_index, pFilename, filename_len); + if (!comp) + return file_index; + else if (comp < 0) + l = m + 1; + else + h = m - 1; + } + return -1; +} + +int mz_zip_reader_locate_file(mz_zip_archive *pZip, const char *pName, const char *pComment, mz_uint flags) +{ + mz_uint file_index; size_t name_len, comment_len; + if ((!pZip) || (!pZip->m_pState) || (!pName) || (pZip->m_zip_mode != MZ_ZIP_MODE_READING)) + return -1; + if (((flags & (MZ_ZIP_FLAG_IGNORE_PATH | MZ_ZIP_FLAG_CASE_SENSITIVE)) == 0) && (!pComment) && (pZip->m_pState->m_sorted_central_dir_offsets.m_size)) + return mz_zip_reader_locate_file_binary_search(pZip, pName); + name_len = strlen(pName); if (name_len > 0xFFFF) return -1; + comment_len = pComment ? strlen(pComment) : 0; if (comment_len > 0xFFFF) return -1; + for (file_index = 0; file_index < pZip->m_total_files; file_index++) + { + const mz_uint8 *pHeader = &MZ_ZIP_ARRAY_ELEMENT(&pZip->m_pState->m_central_dir, mz_uint8, MZ_ZIP_ARRAY_ELEMENT(&pZip->m_pState->m_central_dir_offsets, mz_uint32, file_index)); + mz_uint filename_len = MZ_READ_LE16(pHeader + MZ_ZIP_CDH_FILENAME_LEN_OFS); + const char *pFilename = (const char *)pHeader + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE; + if (filename_len < name_len) + continue; + if (comment_len) + { + mz_uint file_extra_len = MZ_READ_LE16(pHeader + MZ_ZIP_CDH_EXTRA_LEN_OFS), file_comment_len = MZ_READ_LE16(pHeader + MZ_ZIP_CDH_COMMENT_LEN_OFS); + const char *pFile_comment = pFilename + filename_len + file_extra_len; + if ((file_comment_len != comment_len) || (!mz_zip_reader_string_equal(pComment, pFile_comment, file_comment_len, flags))) + continue; + } + if ((flags & MZ_ZIP_FLAG_IGNORE_PATH) && (filename_len)) + { + int ofs = filename_len - 1; + do + { + if ((pFilename[ofs] == '/') || (pFilename[ofs] == '\\') || (pFilename[ofs] == ':')) + break; + } while (--ofs >= 0); + ofs++; + pFilename += ofs; filename_len -= ofs; + } + if ((filename_len == name_len) && (mz_zip_reader_string_equal(pName, pFilename, filename_len, flags))) + return file_index; + } + return -1; +} + +mz_bool mz_zip_reader_extract_to_mem_no_alloc(mz_zip_archive *pZip, mz_uint file_index, void *pBuf, size_t buf_size, mz_uint flags, void *pUser_read_buf, size_t user_read_buf_size) +{ + int status = TINFL_STATUS_DONE; + mz_uint64 needed_size, cur_file_ofs, comp_remaining, out_buf_ofs = 0, read_buf_size, read_buf_ofs = 0, read_buf_avail; + mz_zip_archive_file_stat file_stat; + void *pRead_buf; + mz_uint32 local_header_u32[(MZ_ZIP_LOCAL_DIR_HEADER_SIZE + sizeof(mz_uint32) - 1) / sizeof(mz_uint32)]; mz_uint8 *pLocal_header = (mz_uint8 *)local_header_u32; + tinfl_decompressor inflator; + + if ((buf_size) && (!pBuf)) + return MZ_FALSE; + + if (!mz_zip_reader_file_stat(pZip, file_index, &file_stat)) + return MZ_FALSE; + + // Empty file, or a directory (but not always a directory - I've seen odd zips with directories that have compressed data which inflates to 0 bytes) + if (!file_stat.m_comp_size) + return MZ_TRUE; + + // Entry is a subdirectory (I've seen old zips with dir entries which have compressed deflate data which inflates to 0 bytes, but these entries claim to uncompress to 512 bytes in the headers). + // I'm torn how to handle this case - should it fail instead? + if (mz_zip_reader_is_file_a_directory(pZip, file_index)) + return MZ_TRUE; + + // Encryption and patch files are not supported. + if (file_stat.m_bit_flag & (1 | 32)) + return MZ_FALSE; + + // This function only supports stored and deflate. + if ((!(flags & MZ_ZIP_FLAG_COMPRESSED_DATA)) && (file_stat.m_method != 0) && (file_stat.m_method != MZ_DEFLATED)) + return MZ_FALSE; + + // Ensure supplied output buffer is large enough. + needed_size = (flags & MZ_ZIP_FLAG_COMPRESSED_DATA) ? file_stat.m_comp_size : file_stat.m_uncomp_size; + if (buf_size < needed_size) + return MZ_FALSE; + + // Read and parse the local directory entry. + cur_file_ofs = file_stat.m_local_header_ofs; + if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pLocal_header, MZ_ZIP_LOCAL_DIR_HEADER_SIZE) != MZ_ZIP_LOCAL_DIR_HEADER_SIZE) + return MZ_FALSE; + if (MZ_READ_LE32(pLocal_header) != MZ_ZIP_LOCAL_DIR_HEADER_SIG) + return MZ_FALSE; + + cur_file_ofs += MZ_ZIP_LOCAL_DIR_HEADER_SIZE + MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_FILENAME_LEN_OFS) + MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_EXTRA_LEN_OFS); + if ((cur_file_ofs + file_stat.m_comp_size) > pZip->m_archive_size) + return MZ_FALSE; + + if ((flags & MZ_ZIP_FLAG_COMPRESSED_DATA) || (!file_stat.m_method)) + { + // The file is stored or the caller has requested the compressed data. + if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pBuf, (size_t)needed_size) != needed_size) + return MZ_FALSE; + return ((flags & MZ_ZIP_FLAG_COMPRESSED_DATA) != 0) || (mz_crc32(MZ_CRC32_INIT, (const mz_uint8 *)pBuf, (size_t)file_stat.m_uncomp_size) == file_stat.m_crc32); + } + + // Decompress the file either directly from memory or from a file input buffer. + tinfl_init(&inflator); + + if (pZip->m_pState->m_pMem) + { + // Read directly from the archive in memory. + pRead_buf = (mz_uint8 *)pZip->m_pState->m_pMem + cur_file_ofs; + read_buf_size = read_buf_avail = file_stat.m_comp_size; + comp_remaining = 0; + } + else if (pUser_read_buf) + { + // Use a user provided read buffer. + if (!user_read_buf_size) + return MZ_FALSE; + pRead_buf = (mz_uint8 *)pUser_read_buf; + read_buf_size = user_read_buf_size; + read_buf_avail = 0; + comp_remaining = file_stat.m_comp_size; + } + else + { + // Temporarily allocate a read buffer. + read_buf_size = MZ_MIN(file_stat.m_comp_size, MZ_ZIP_MAX_IO_BUF_SIZE); +#ifdef _MSC_VER + if (((0, sizeof(size_t) == sizeof(mz_uint32))) && (read_buf_size > 0x7FFFFFFF)) +#else + if (((sizeof(size_t) == sizeof(mz_uint32))) && (read_buf_size > 0x7FFFFFFF)) +#endif + return MZ_FALSE; + if (NULL == (pRead_buf = pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, (size_t)read_buf_size))) + return MZ_FALSE; + read_buf_avail = 0; + comp_remaining = file_stat.m_comp_size; + } + + do + { + size_t in_buf_size, out_buf_size = (size_t)(file_stat.m_uncomp_size - out_buf_ofs); + if ((!read_buf_avail) && (!pZip->m_pState->m_pMem)) + { + read_buf_avail = MZ_MIN(read_buf_size, comp_remaining); + if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pRead_buf, (size_t)read_buf_avail) != read_buf_avail) + { + status = TINFL_STATUS_FAILED; + break; + } + cur_file_ofs += read_buf_avail; + comp_remaining -= read_buf_avail; + read_buf_ofs = 0; + } + in_buf_size = (size_t)read_buf_avail; + status = tinfl_decompress(&inflator, (mz_uint8 *)pRead_buf + read_buf_ofs, &in_buf_size, (mz_uint8 *)pBuf, (mz_uint8 *)pBuf + out_buf_ofs, &out_buf_size, TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF | (comp_remaining ? TINFL_FLAG_HAS_MORE_INPUT : 0)); + read_buf_avail -= in_buf_size; + read_buf_ofs += in_buf_size; + out_buf_ofs += out_buf_size; + } while (status == TINFL_STATUS_NEEDS_MORE_INPUT); + + if (status == TINFL_STATUS_DONE) + { + // Make sure the entire file was decompressed, and check its CRC. + if ((out_buf_ofs != file_stat.m_uncomp_size) || (mz_crc32(MZ_CRC32_INIT, (const mz_uint8 *)pBuf, (size_t)file_stat.m_uncomp_size) != file_stat.m_crc32)) + status = TINFL_STATUS_FAILED; + } + + if ((!pZip->m_pState->m_pMem) && (!pUser_read_buf)) + pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf); + + return status == TINFL_STATUS_DONE; +} + +mz_bool mz_zip_reader_extract_file_to_mem_no_alloc(mz_zip_archive *pZip, const char *pFilename, void *pBuf, size_t buf_size, mz_uint flags, void *pUser_read_buf, size_t user_read_buf_size) +{ + int file_index = mz_zip_reader_locate_file(pZip, pFilename, NULL, flags); + if (file_index < 0) + return MZ_FALSE; + return mz_zip_reader_extract_to_mem_no_alloc(pZip, file_index, pBuf, buf_size, flags, pUser_read_buf, user_read_buf_size); +} + +mz_bool mz_zip_reader_extract_to_mem(mz_zip_archive *pZip, mz_uint file_index, void *pBuf, size_t buf_size, mz_uint flags) +{ + return mz_zip_reader_extract_to_mem_no_alloc(pZip, file_index, pBuf, buf_size, flags, NULL, 0); +} + +mz_bool mz_zip_reader_extract_file_to_mem(mz_zip_archive *pZip, const char *pFilename, void *pBuf, size_t buf_size, mz_uint flags) +{ + return mz_zip_reader_extract_file_to_mem_no_alloc(pZip, pFilename, pBuf, buf_size, flags, NULL, 0); +} + +void *mz_zip_reader_extract_to_heap(mz_zip_archive *pZip, mz_uint file_index, size_t *pSize, mz_uint flags) +{ + mz_uint64 comp_size, uncomp_size, alloc_size; + const mz_uint8 *p = mz_zip_reader_get_cdh(pZip, file_index); + void *pBuf; + + if (pSize) + *pSize = 0; + if (!p) + return NULL; + + comp_size = MZ_READ_LE32(p + MZ_ZIP_CDH_COMPRESSED_SIZE_OFS); + uncomp_size = MZ_READ_LE32(p + MZ_ZIP_CDH_DECOMPRESSED_SIZE_OFS); + + alloc_size = (flags & MZ_ZIP_FLAG_COMPRESSED_DATA) ? comp_size : uncomp_size; +#ifdef _MSC_VER + if (((0, sizeof(size_t) == sizeof(mz_uint32))) && (alloc_size > 0x7FFFFFFF)) +#else + if (((sizeof(size_t) == sizeof(mz_uint32))) && (alloc_size > 0x7FFFFFFF)) +#endif + return NULL; + if (NULL == (pBuf = pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, (size_t)alloc_size))) + return NULL; + + if (!mz_zip_reader_extract_to_mem(pZip, file_index, pBuf, (size_t)alloc_size, flags)) + { + pZip->m_pFree(pZip->m_pAlloc_opaque, pBuf); + return NULL; + } + + if (pSize) *pSize = (size_t)alloc_size; + return pBuf; +} + +void *mz_zip_reader_extract_file_to_heap(mz_zip_archive *pZip, const char *pFilename, size_t *pSize, mz_uint flags) +{ + int file_index = mz_zip_reader_locate_file(pZip, pFilename, NULL, flags); + if (file_index < 0) + { + if (pSize) *pSize = 0; + return MZ_FALSE; + } + return mz_zip_reader_extract_to_heap(pZip, file_index, pSize, flags); +} + +mz_bool mz_zip_reader_extract_to_callback(mz_zip_archive *pZip, mz_uint file_index, mz_file_write_func pCallback, void *pOpaque, mz_uint flags) +{ + int status = TINFL_STATUS_DONE; mz_uint file_crc32 = MZ_CRC32_INIT; + mz_uint64 read_buf_size, read_buf_ofs = 0, read_buf_avail, comp_remaining, out_buf_ofs = 0, cur_file_ofs; + mz_zip_archive_file_stat file_stat; + void *pRead_buf = NULL; void *pWrite_buf = NULL; + mz_uint32 local_header_u32[(MZ_ZIP_LOCAL_DIR_HEADER_SIZE + sizeof(mz_uint32) - 1) / sizeof(mz_uint32)]; mz_uint8 *pLocal_header = (mz_uint8 *)local_header_u32; + + if (!mz_zip_reader_file_stat(pZip, file_index, &file_stat)) + return MZ_FALSE; + + // Empty file, or a directory (but not always a directory - I've seen odd zips with directories that have compressed data which inflates to 0 bytes) + if (!file_stat.m_comp_size) + return MZ_TRUE; + + // Entry is a subdirectory (I've seen old zips with dir entries which have compressed deflate data which inflates to 0 bytes, but these entries claim to uncompress to 512 bytes in the headers). + // I'm torn how to handle this case - should it fail instead? + if (mz_zip_reader_is_file_a_directory(pZip, file_index)) + return MZ_TRUE; + + // Encryption and patch files are not supported. + if (file_stat.m_bit_flag & (1 | 32)) + return MZ_FALSE; + + // This function only supports stored and deflate. + if ((!(flags & MZ_ZIP_FLAG_COMPRESSED_DATA)) && (file_stat.m_method != 0) && (file_stat.m_method != MZ_DEFLATED)) + return MZ_FALSE; + + // Read and parse the local directory entry. + cur_file_ofs = file_stat.m_local_header_ofs; + if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pLocal_header, MZ_ZIP_LOCAL_DIR_HEADER_SIZE) != MZ_ZIP_LOCAL_DIR_HEADER_SIZE) + return MZ_FALSE; + if (MZ_READ_LE32(pLocal_header) != MZ_ZIP_LOCAL_DIR_HEADER_SIG) + return MZ_FALSE; + + cur_file_ofs += MZ_ZIP_LOCAL_DIR_HEADER_SIZE + MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_FILENAME_LEN_OFS) + MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_EXTRA_LEN_OFS); + if ((cur_file_ofs + file_stat.m_comp_size) > pZip->m_archive_size) + return MZ_FALSE; + + // Decompress the file either directly from memory or from a file input buffer. + if (pZip->m_pState->m_pMem) + { + pRead_buf = (mz_uint8 *)pZip->m_pState->m_pMem + cur_file_ofs; + read_buf_size = read_buf_avail = file_stat.m_comp_size; + comp_remaining = 0; + } + else + { + read_buf_size = MZ_MIN(file_stat.m_comp_size, MZ_ZIP_MAX_IO_BUF_SIZE); + if (NULL == (pRead_buf = pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, (size_t)read_buf_size))) + return MZ_FALSE; + read_buf_avail = 0; + comp_remaining = file_stat.m_comp_size; + } + + if ((flags & MZ_ZIP_FLAG_COMPRESSED_DATA) || (!file_stat.m_method)) + { + // The file is stored or the caller has requested the compressed data. + if (pZip->m_pState->m_pMem) + { +#ifdef _MSC_VER + if (((0, sizeof(size_t) == sizeof(mz_uint32))) && (file_stat.m_comp_size > 0xFFFFFFFF)) +#else + if (((sizeof(size_t) == sizeof(mz_uint32))) && (file_stat.m_comp_size > 0xFFFFFFFF)) +#endif + return MZ_FALSE; + if (pCallback(pOpaque, out_buf_ofs, pRead_buf, (size_t)file_stat.m_comp_size) != file_stat.m_comp_size) + status = TINFL_STATUS_FAILED; + else if (!(flags & MZ_ZIP_FLAG_COMPRESSED_DATA)) + file_crc32 = (mz_uint32)mz_crc32(file_crc32, (const mz_uint8 *)pRead_buf, (size_t)file_stat.m_comp_size); + cur_file_ofs += file_stat.m_comp_size; + out_buf_ofs += file_stat.m_comp_size; + comp_remaining = 0; + } + else + { + while (comp_remaining) + { + read_buf_avail = MZ_MIN(read_buf_size, comp_remaining); + if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pRead_buf, (size_t)read_buf_avail) != read_buf_avail) + { + status = TINFL_STATUS_FAILED; + break; + } + + if (!(flags & MZ_ZIP_FLAG_COMPRESSED_DATA)) + file_crc32 = (mz_uint32)mz_crc32(file_crc32, (const mz_uint8 *)pRead_buf, (size_t)read_buf_avail); + + if (pCallback(pOpaque, out_buf_ofs, pRead_buf, (size_t)read_buf_avail) != read_buf_avail) + { + status = TINFL_STATUS_FAILED; + break; + } + cur_file_ofs += read_buf_avail; + out_buf_ofs += read_buf_avail; + comp_remaining -= read_buf_avail; + } + } + } + else + { + tinfl_decompressor inflator; + tinfl_init(&inflator); + + if (NULL == (pWrite_buf = pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, TINFL_LZ_DICT_SIZE))) + status = TINFL_STATUS_FAILED; + else + { + do + { + mz_uint8 *pWrite_buf_cur = (mz_uint8 *)pWrite_buf + (out_buf_ofs & (TINFL_LZ_DICT_SIZE - 1)); + size_t in_buf_size, out_buf_size = TINFL_LZ_DICT_SIZE - (out_buf_ofs & (TINFL_LZ_DICT_SIZE - 1)); + if ((!read_buf_avail) && (!pZip->m_pState->m_pMem)) + { + read_buf_avail = MZ_MIN(read_buf_size, comp_remaining); + if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pRead_buf, (size_t)read_buf_avail) != read_buf_avail) + { + status = TINFL_STATUS_FAILED; + break; + } + cur_file_ofs += read_buf_avail; + comp_remaining -= read_buf_avail; + read_buf_ofs = 0; + } + + in_buf_size = (size_t)read_buf_avail; + status = tinfl_decompress(&inflator, (const mz_uint8 *)pRead_buf + read_buf_ofs, &in_buf_size, (mz_uint8 *)pWrite_buf, pWrite_buf_cur, &out_buf_size, comp_remaining ? TINFL_FLAG_HAS_MORE_INPUT : 0); + read_buf_avail -= in_buf_size; + read_buf_ofs += in_buf_size; + + if (out_buf_size) + { + if (pCallback(pOpaque, out_buf_ofs, pWrite_buf_cur, out_buf_size) != out_buf_size) + { + status = TINFL_STATUS_FAILED; + break; + } + file_crc32 = (mz_uint32)mz_crc32(file_crc32, pWrite_buf_cur, out_buf_size); + if ((out_buf_ofs += out_buf_size) > file_stat.m_uncomp_size) + { + status = TINFL_STATUS_FAILED; + break; + } + } + } while ((status == TINFL_STATUS_NEEDS_MORE_INPUT) || (status == TINFL_STATUS_HAS_MORE_OUTPUT)); + } + } + + if ((status == TINFL_STATUS_DONE) && (!(flags & MZ_ZIP_FLAG_COMPRESSED_DATA))) + { + // Make sure the entire file was decompressed, and check its CRC. + if ((out_buf_ofs != file_stat.m_uncomp_size) || (file_crc32 != file_stat.m_crc32)) + status = TINFL_STATUS_FAILED; + } + + if (!pZip->m_pState->m_pMem) + pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf); + if (pWrite_buf) + pZip->m_pFree(pZip->m_pAlloc_opaque, pWrite_buf); + + return status == TINFL_STATUS_DONE; +} + +mz_bool mz_zip_reader_extract_file_to_callback(mz_zip_archive *pZip, const char *pFilename, mz_file_write_func pCallback, void *pOpaque, mz_uint flags) +{ + int file_index = mz_zip_reader_locate_file(pZip, pFilename, NULL, flags); + if (file_index < 0) + return MZ_FALSE; + return mz_zip_reader_extract_to_callback(pZip, file_index, pCallback, pOpaque, flags); +} + +#ifndef MINIZ_NO_STDIO +static size_t mz_zip_file_write_callback(void *pOpaque, mz_uint64 ofs, const void *pBuf, size_t n) +{ + (void)ofs; return MZ_FWRITE(pBuf, 1, n, (MZ_FILE*)pOpaque); +} + +mz_bool mz_zip_reader_extract_to_file(mz_zip_archive *pZip, mz_uint file_index, const char *pDst_filename, mz_uint flags) +{ + mz_bool status; + mz_zip_archive_file_stat file_stat; + MZ_FILE *pFile; + if (!mz_zip_reader_file_stat(pZip, file_index, &file_stat)) + return MZ_FALSE; + pFile = MZ_FOPEN(pDst_filename, "wb"); + if (!pFile) + return MZ_FALSE; + status = mz_zip_reader_extract_to_callback(pZip, file_index, mz_zip_file_write_callback, pFile, flags); + if (MZ_FCLOSE(pFile) == EOF) + return MZ_FALSE; +#ifndef MINIZ_NO_TIME + if (status) + mz_zip_set_file_times(pDst_filename, file_stat.m_time, file_stat.m_time); +#endif + return status; +} +#endif // #ifndef MINIZ_NO_STDIO + +mz_bool mz_zip_reader_end(mz_zip_archive *pZip) +{ + if ((!pZip) || (!pZip->m_pState) || (!pZip->m_pAlloc) || (!pZip->m_pFree) || (pZip->m_zip_mode != MZ_ZIP_MODE_READING)) + return MZ_FALSE; + + if (pZip->m_pState) + { + mz_zip_internal_state *pState = pZip->m_pState; pZip->m_pState = NULL; + mz_zip_array_clear(pZip, &pState->m_central_dir); + mz_zip_array_clear(pZip, &pState->m_central_dir_offsets); + mz_zip_array_clear(pZip, &pState->m_sorted_central_dir_offsets); + +#ifndef MINIZ_NO_STDIO + if (pState->m_pFile) + { + MZ_FCLOSE(pState->m_pFile); + pState->m_pFile = NULL; + } +#endif // #ifndef MINIZ_NO_STDIO + + pZip->m_pFree(pZip->m_pAlloc_opaque, pState); + } + pZip->m_zip_mode = MZ_ZIP_MODE_INVALID; + + return MZ_TRUE; +} + +#ifndef MINIZ_NO_STDIO +mz_bool mz_zip_reader_extract_file_to_file(mz_zip_archive *pZip, const char *pArchive_filename, const char *pDst_filename, mz_uint flags) +{ + int file_index = mz_zip_reader_locate_file(pZip, pArchive_filename, NULL, flags); + if (file_index < 0) + return MZ_FALSE; + return mz_zip_reader_extract_to_file(pZip, file_index, pDst_filename, flags); +} +#endif + +// ------------------- .ZIP archive writing + +#ifndef MINIZ_NO_ARCHIVE_WRITING_APIS + +static void mz_write_le16(mz_uint8 *p, mz_uint16 v) { p[0] = (mz_uint8)v; p[1] = (mz_uint8)(v >> 8); } +static void mz_write_le32(mz_uint8 *p, mz_uint32 v) { p[0] = (mz_uint8)v; p[1] = (mz_uint8)(v >> 8); p[2] = (mz_uint8)(v >> 16); p[3] = (mz_uint8)(v >> 24); } +#define MZ_WRITE_LE16(p, v) mz_write_le16((mz_uint8 *)(p), (mz_uint16)(v)) +#define MZ_WRITE_LE32(p, v) mz_write_le32((mz_uint8 *)(p), (mz_uint32)(v)) + +mz_bool mz_zip_writer_init(mz_zip_archive *pZip, mz_uint64 existing_size) +{ + if ((!pZip) || (pZip->m_pState) || (!pZip->m_pWrite) || (pZip->m_zip_mode != MZ_ZIP_MODE_INVALID)) + return MZ_FALSE; + + if (pZip->m_file_offset_alignment) + { + // Ensure user specified file offset alignment is a power of 2. + if (pZip->m_file_offset_alignment & (pZip->m_file_offset_alignment - 1)) + return MZ_FALSE; + } + + if (!pZip->m_pAlloc) pZip->m_pAlloc = def_alloc_func; + if (!pZip->m_pFree) pZip->m_pFree = def_free_func; + if (!pZip->m_pRealloc) pZip->m_pRealloc = def_realloc_func; + + pZip->m_zip_mode = MZ_ZIP_MODE_WRITING; + pZip->m_archive_size = existing_size; + pZip->m_central_directory_file_ofs = 0; + pZip->m_total_files = 0; + + if (NULL == (pZip->m_pState = (mz_zip_internal_state *)pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, sizeof(mz_zip_internal_state)))) + return MZ_FALSE; + memset(pZip->m_pState, 0, sizeof(mz_zip_internal_state)); + MZ_ZIP_ARRAY_SET_ELEMENT_SIZE(&pZip->m_pState->m_central_dir, sizeof(mz_uint8)); + MZ_ZIP_ARRAY_SET_ELEMENT_SIZE(&pZip->m_pState->m_central_dir_offsets, sizeof(mz_uint32)); + MZ_ZIP_ARRAY_SET_ELEMENT_SIZE(&pZip->m_pState->m_sorted_central_dir_offsets, sizeof(mz_uint32)); + return MZ_TRUE; +} + +static size_t mz_zip_heap_write_func(void *pOpaque, mz_uint64 file_ofs, const void *pBuf, size_t n) +{ + mz_zip_archive *pZip = (mz_zip_archive *)pOpaque; + mz_zip_internal_state *pState = pZip->m_pState; + mz_uint64 new_size = MZ_MAX(file_ofs + n, pState->m_mem_size); +#ifdef _MSC_VER + if ((!n) || ((0, sizeof(size_t) == sizeof(mz_uint32)) && (new_size > 0x7FFFFFFF))) +#else + if ((!n) || ((sizeof(size_t) == sizeof(mz_uint32)) && (new_size > 0x7FFFFFFF))) +#endif + return 0; + if (new_size > pState->m_mem_capacity) + { + void *pNew_block; + size_t new_capacity = MZ_MAX(64, pState->m_mem_capacity); while (new_capacity < new_size) new_capacity *= 2; + if (NULL == (pNew_block = pZip->m_pRealloc(pZip->m_pAlloc_opaque, pState->m_pMem, 1, new_capacity))) + return 0; + pState->m_pMem = pNew_block; pState->m_mem_capacity = new_capacity; + } + memcpy((mz_uint8 *)pState->m_pMem + file_ofs, pBuf, n); + pState->m_mem_size = (size_t)new_size; + return n; +} + +mz_bool mz_zip_writer_init_heap(mz_zip_archive *pZip, size_t size_to_reserve_at_beginning, size_t initial_allocation_size) +{ + pZip->m_pWrite = mz_zip_heap_write_func; + pZip->m_pIO_opaque = pZip; + if (!mz_zip_writer_init(pZip, size_to_reserve_at_beginning)) + return MZ_FALSE; + if (0 != (initial_allocation_size = MZ_MAX(initial_allocation_size, size_to_reserve_at_beginning))) + { + if (NULL == (pZip->m_pState->m_pMem = pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, initial_allocation_size))) + { + mz_zip_writer_end(pZip); + return MZ_FALSE; + } + pZip->m_pState->m_mem_capacity = initial_allocation_size; + } + return MZ_TRUE; +} + +#ifndef MINIZ_NO_STDIO +static size_t mz_zip_file_write_func(void *pOpaque, mz_uint64 file_ofs, const void *pBuf, size_t n) +{ + mz_zip_archive *pZip = (mz_zip_archive *)pOpaque; + mz_int64 cur_ofs = MZ_FTELL64(pZip->m_pState->m_pFile); + if (((mz_int64)file_ofs < 0) || (((cur_ofs != (mz_int64)file_ofs)) && (MZ_FSEEK64(pZip->m_pState->m_pFile, (mz_int64)file_ofs, SEEK_SET)))) + return 0; + return MZ_FWRITE(pBuf, 1, n, pZip->m_pState->m_pFile); +} + +mz_bool mz_zip_writer_init_file(mz_zip_archive *pZip, const char *pFilename, mz_uint64 size_to_reserve_at_beginning) +{ + MZ_FILE *pFile; + pZip->m_pWrite = mz_zip_file_write_func; + pZip->m_pIO_opaque = pZip; + if (!mz_zip_writer_init(pZip, size_to_reserve_at_beginning)) + return MZ_FALSE; + if (NULL == (pFile = MZ_FOPEN(pFilename, "wb"))) + { + mz_zip_writer_end(pZip); + return MZ_FALSE; + } + pZip->m_pState->m_pFile = pFile; + if (size_to_reserve_at_beginning) + { + mz_uint64 cur_ofs = 0; char buf[4096]; MZ_CLEAR_OBJ(buf); + do + { + size_t n = (size_t)MZ_MIN(sizeof(buf), size_to_reserve_at_beginning); + if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_ofs, buf, n) != n) + { + mz_zip_writer_end(pZip); + return MZ_FALSE; + } + cur_ofs += n; size_to_reserve_at_beginning -= n; + } while (size_to_reserve_at_beginning); + } + return MZ_TRUE; +} +#endif // #ifndef MINIZ_NO_STDIO + +mz_bool mz_zip_writer_init_from_reader(mz_zip_archive *pZip, const char *pFilename) +{ + mz_zip_internal_state *pState; + if ((!pZip) || (!pZip->m_pState) || (pZip->m_zip_mode != MZ_ZIP_MODE_READING)) + return MZ_FALSE; + // No sense in trying to write to an archive that's already at the support max size + if ((pZip->m_total_files == 0xFFFF) || ((pZip->m_archive_size + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + MZ_ZIP_LOCAL_DIR_HEADER_SIZE) > 0xFFFFFFFF)) + return MZ_FALSE; + + pState = pZip->m_pState; + + if (pState->m_pFile) + { +#ifdef MINIZ_NO_STDIO + pFilename; return MZ_FALSE; +#else + // Archive is being read from stdio - try to reopen as writable. + if (pZip->m_pIO_opaque != pZip) + return MZ_FALSE; + if (!pFilename) + return MZ_FALSE; + pZip->m_pWrite = mz_zip_file_write_func; + if (NULL == (pState->m_pFile = MZ_FREOPEN(pFilename, "r+b", pState->m_pFile))) + { + // The mz_zip_archive is now in a bogus state because pState->m_pFile is NULL, so just close it. + mz_zip_reader_end(pZip); + return MZ_FALSE; + } +#endif // #ifdef MINIZ_NO_STDIO + } + else if (pState->m_pMem) + { + // Archive lives in a memory block. Assume it's from the heap that we can resize using the realloc callback. + if (pZip->m_pIO_opaque != pZip) + return MZ_FALSE; + pState->m_mem_capacity = pState->m_mem_size; + pZip->m_pWrite = mz_zip_heap_write_func; + } + // Archive is being read via a user provided read function - make sure the user has specified a write function too. + else if (!pZip->m_pWrite) + return MZ_FALSE; + + // Start writing new files at the archive's current central directory location. + pZip->m_archive_size = pZip->m_central_directory_file_ofs; + pZip->m_zip_mode = MZ_ZIP_MODE_WRITING; + pZip->m_central_directory_file_ofs = 0; + + return MZ_TRUE; +} + +mz_bool mz_zip_writer_add_mem(mz_zip_archive *pZip, const char *pArchive_name, const void *pBuf, size_t buf_size, mz_uint level_and_flags) +{ + return mz_zip_writer_add_mem_ex(pZip, pArchive_name, pBuf, buf_size, NULL, 0, level_and_flags, 0, 0); +} + +typedef struct +{ + mz_zip_archive *m_pZip; + mz_uint64 m_cur_archive_file_ofs; + mz_uint64 m_comp_size; +} mz_zip_writer_add_state; + +static mz_bool mz_zip_writer_add_put_buf_callback(const void* pBuf, int len, void *pUser) +{ + mz_zip_writer_add_state *pState = (mz_zip_writer_add_state *)pUser; + if ((int)pState->m_pZip->m_pWrite(pState->m_pZip->m_pIO_opaque, pState->m_cur_archive_file_ofs, pBuf, len) != len) + return MZ_FALSE; + pState->m_cur_archive_file_ofs += len; + pState->m_comp_size += len; + return MZ_TRUE; +} + +static mz_bool mz_zip_writer_create_local_dir_header(mz_zip_archive *pZip, mz_uint8 *pDst, mz_uint16 filename_size, mz_uint16 extra_size, mz_uint64 uncomp_size, mz_uint64 comp_size, mz_uint32 uncomp_crc32, mz_uint16 method, mz_uint16 bit_flags, mz_uint16 dos_time, mz_uint16 dos_date) +{ + (void)pZip; + memset(pDst, 0, MZ_ZIP_LOCAL_DIR_HEADER_SIZE); + MZ_WRITE_LE32(pDst + MZ_ZIP_LDH_SIG_OFS, MZ_ZIP_LOCAL_DIR_HEADER_SIG); + MZ_WRITE_LE16(pDst + MZ_ZIP_LDH_VERSION_NEEDED_OFS, method ? 20 : 0); + MZ_WRITE_LE16(pDst + MZ_ZIP_LDH_BIT_FLAG_OFS, bit_flags); + MZ_WRITE_LE16(pDst + MZ_ZIP_LDH_METHOD_OFS, method); + MZ_WRITE_LE16(pDst + MZ_ZIP_LDH_FILE_TIME_OFS, dos_time); + MZ_WRITE_LE16(pDst + MZ_ZIP_LDH_FILE_DATE_OFS, dos_date); + MZ_WRITE_LE32(pDst + MZ_ZIP_LDH_CRC32_OFS, uncomp_crc32); + MZ_WRITE_LE32(pDst + MZ_ZIP_LDH_COMPRESSED_SIZE_OFS, comp_size); + MZ_WRITE_LE32(pDst + MZ_ZIP_LDH_DECOMPRESSED_SIZE_OFS, uncomp_size); + MZ_WRITE_LE16(pDst + MZ_ZIP_LDH_FILENAME_LEN_OFS, filename_size); + MZ_WRITE_LE16(pDst + MZ_ZIP_LDH_EXTRA_LEN_OFS, extra_size); + return MZ_TRUE; +} + +static mz_bool mz_zip_writer_create_central_dir_header(mz_zip_archive *pZip, mz_uint8 *pDst, mz_uint16 filename_size, mz_uint16 extra_size, mz_uint16 comment_size, mz_uint64 uncomp_size, mz_uint64 comp_size, mz_uint32 uncomp_crc32, mz_uint16 method, mz_uint16 bit_flags, mz_uint16 dos_time, mz_uint16 dos_date, mz_uint64 local_header_ofs, mz_uint32 ext_attributes) +{ + (void)pZip; + memset(pDst, 0, MZ_ZIP_CENTRAL_DIR_HEADER_SIZE); + MZ_WRITE_LE32(pDst + MZ_ZIP_CDH_SIG_OFS, MZ_ZIP_CENTRAL_DIR_HEADER_SIG); + MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_VERSION_NEEDED_OFS, method ? 20 : 0); + MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_BIT_FLAG_OFS, bit_flags); + MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_METHOD_OFS, method); + MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_FILE_TIME_OFS, dos_time); + MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_FILE_DATE_OFS, dos_date); + MZ_WRITE_LE32(pDst + MZ_ZIP_CDH_CRC32_OFS, uncomp_crc32); + MZ_WRITE_LE32(pDst + MZ_ZIP_CDH_COMPRESSED_SIZE_OFS, comp_size); + MZ_WRITE_LE32(pDst + MZ_ZIP_CDH_DECOMPRESSED_SIZE_OFS, uncomp_size); + MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_FILENAME_LEN_OFS, filename_size); + MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_EXTRA_LEN_OFS, extra_size); + MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_COMMENT_LEN_OFS, comment_size); + MZ_WRITE_LE32(pDst + MZ_ZIP_CDH_EXTERNAL_ATTR_OFS, ext_attributes); + MZ_WRITE_LE32(pDst + MZ_ZIP_CDH_LOCAL_HEADER_OFS, local_header_ofs); + return MZ_TRUE; +} + +static mz_bool mz_zip_writer_add_to_central_dir(mz_zip_archive *pZip, const char *pFilename, mz_uint16 filename_size, const void *pExtra, mz_uint16 extra_size, const void *pComment, mz_uint16 comment_size, mz_uint64 uncomp_size, mz_uint64 comp_size, mz_uint32 uncomp_crc32, mz_uint16 method, mz_uint16 bit_flags, mz_uint16 dos_time, mz_uint16 dos_date, mz_uint64 local_header_ofs, mz_uint32 ext_attributes) +{ + mz_zip_internal_state *pState = pZip->m_pState; + mz_uint32 central_dir_ofs = (mz_uint32)pState->m_central_dir.m_size; + size_t orig_central_dir_size = pState->m_central_dir.m_size; + mz_uint8 central_dir_header[MZ_ZIP_CENTRAL_DIR_HEADER_SIZE]; + + // No zip64 support yet + if ((local_header_ofs > 0xFFFFFFFF) || (((mz_uint64)pState->m_central_dir.m_size + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + filename_size + extra_size + comment_size) > 0xFFFFFFFF)) + return MZ_FALSE; + + if (!mz_zip_writer_create_central_dir_header(pZip, central_dir_header, filename_size, extra_size, comment_size, uncomp_size, comp_size, uncomp_crc32, method, bit_flags, dos_time, dos_date, local_header_ofs, ext_attributes)) + return MZ_FALSE; + + if ((!mz_zip_array_push_back(pZip, &pState->m_central_dir, central_dir_header, MZ_ZIP_CENTRAL_DIR_HEADER_SIZE)) || + (!mz_zip_array_push_back(pZip, &pState->m_central_dir, pFilename, filename_size)) || + (!mz_zip_array_push_back(pZip, &pState->m_central_dir, pExtra, extra_size)) || + (!mz_zip_array_push_back(pZip, &pState->m_central_dir, pComment, comment_size)) || + (!mz_zip_array_push_back(pZip, &pState->m_central_dir_offsets, ¢ral_dir_ofs, 1))) + { + // Try to push the central directory array back into its original state. + mz_zip_array_resize(pZip, &pState->m_central_dir, orig_central_dir_size, MZ_FALSE); + return MZ_FALSE; + } + + return MZ_TRUE; +} + +static mz_bool mz_zip_writer_validate_archive_name(const char *pArchive_name) +{ + // Basic ZIP archive filename validity checks: Valid filenames cannot start with a forward slash, cannot contain a drive letter, and cannot use DOS-style backward slashes. + if (*pArchive_name == '/') + return MZ_FALSE; + while (*pArchive_name) + { + if ((*pArchive_name == '\\') || (*pArchive_name == ':')) + return MZ_FALSE; + pArchive_name++; + } + return MZ_TRUE; +} + +static mz_uint mz_zip_writer_compute_padding_needed_for_file_alignment(mz_zip_archive *pZip) +{ + mz_uint32 n; + if (!pZip->m_file_offset_alignment) + return 0; + n = (mz_uint32)(pZip->m_archive_size & (pZip->m_file_offset_alignment - 1)); + return (pZip->m_file_offset_alignment - n) & (pZip->m_file_offset_alignment - 1); +} + +static mz_bool mz_zip_writer_write_zeros(mz_zip_archive *pZip, mz_uint64 cur_file_ofs, mz_uint32 n) +{ + char buf[4096]; + memset(buf, 0, MZ_MIN(sizeof(buf), n)); + while (n) + { + mz_uint32 s = MZ_MIN(sizeof(buf), n); + if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_file_ofs, buf, s) != s) + return MZ_FALSE; + cur_file_ofs += s; n -= s; + } + return MZ_TRUE; +} + +mz_bool mz_zip_writer_add_mem_ex(mz_zip_archive *pZip, const char *pArchive_name, const void *pBuf, size_t buf_size, const void *pComment, mz_uint16 comment_size, mz_uint level_and_flags, mz_uint64 uncomp_size, mz_uint32 uncomp_crc32) +{ + mz_uint16 method = 0, dos_time = 0, dos_date = 0; + mz_uint level, ext_attributes = 0, num_alignment_padding_bytes; + mz_uint64 local_dir_header_ofs = pZip->m_archive_size, cur_archive_file_ofs = pZip->m_archive_size, comp_size = 0; + size_t archive_name_size; + mz_uint8 local_dir_header[MZ_ZIP_LOCAL_DIR_HEADER_SIZE]; + tdefl_compressor *pComp = NULL; + mz_bool store_data_uncompressed; + mz_zip_internal_state *pState; + + if ((int)level_and_flags < 0) + level_and_flags = MZ_DEFAULT_LEVEL; + level = level_and_flags & 0xF; + store_data_uncompressed = ((!level) || (level_and_flags & MZ_ZIP_FLAG_COMPRESSED_DATA)); + + if ((!pZip) || (!pZip->m_pState) || (pZip->m_zip_mode != MZ_ZIP_MODE_WRITING) || ((buf_size) && (!pBuf)) || (!pArchive_name) || ((comment_size) && (!pComment)) || (pZip->m_total_files == 0xFFFF) || (level > MZ_UBER_COMPRESSION)) + return MZ_FALSE; + + pState = pZip->m_pState; + + if ((!(level_and_flags & MZ_ZIP_FLAG_COMPRESSED_DATA)) && (uncomp_size)) + return MZ_FALSE; + // No zip64 support yet + if ((buf_size > 0xFFFFFFFF) || (uncomp_size > 0xFFFFFFFF)) + return MZ_FALSE; + if (!mz_zip_writer_validate_archive_name(pArchive_name)) + return MZ_FALSE; + +#ifndef MINIZ_NO_TIME + { + time_t cur_time; time(&cur_time); + mz_zip_time_to_dos_time(cur_time, &dos_time, &dos_date); + } +#endif // #ifndef MINIZ_NO_TIME + + archive_name_size = strlen(pArchive_name); + if (archive_name_size > 0xFFFF) + return MZ_FALSE; + + num_alignment_padding_bytes = mz_zip_writer_compute_padding_needed_for_file_alignment(pZip); + + // no zip64 support yet + if ((pZip->m_total_files == 0xFFFF) || ((pZip->m_archive_size + num_alignment_padding_bytes + MZ_ZIP_LOCAL_DIR_HEADER_SIZE + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + comment_size + archive_name_size) > 0xFFFFFFFF)) + return MZ_FALSE; + + if ((archive_name_size) && (pArchive_name[archive_name_size - 1] == '/')) + { + // Set DOS Subdirectory attribute bit. + ext_attributes |= 0x10; + // Subdirectories cannot contain data. + if ((buf_size) || (uncomp_size)) + return MZ_FALSE; + } + + // Try to do any allocations before writing to the archive, so if an allocation fails the file remains unmodified. (A good idea if we're doing an in-place modification.) + if ((!mz_zip_array_ensure_room(pZip, &pState->m_central_dir, MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + archive_name_size + comment_size)) || (!mz_zip_array_ensure_room(pZip, &pState->m_central_dir_offsets, 1))) + return MZ_FALSE; + + if ((!store_data_uncompressed) && (buf_size)) + { + if (NULL == (pComp = (tdefl_compressor *)pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, sizeof(tdefl_compressor)))) + return MZ_FALSE; + } + + if (!mz_zip_writer_write_zeros(pZip, cur_archive_file_ofs, num_alignment_padding_bytes + sizeof(local_dir_header))) + { + pZip->m_pFree(pZip->m_pAlloc_opaque, pComp); + return MZ_FALSE; + } + local_dir_header_ofs += num_alignment_padding_bytes; + if (pZip->m_file_offset_alignment) { MZ_ASSERT((local_dir_header_ofs & (pZip->m_file_offset_alignment - 1)) == 0); } + cur_archive_file_ofs += num_alignment_padding_bytes + sizeof(local_dir_header); + + MZ_CLEAR_OBJ(local_dir_header); + if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_archive_file_ofs, pArchive_name, archive_name_size) != archive_name_size) + { + pZip->m_pFree(pZip->m_pAlloc_opaque, pComp); + return MZ_FALSE; + } + cur_archive_file_ofs += archive_name_size; + + if (!(level_and_flags & MZ_ZIP_FLAG_COMPRESSED_DATA)) + { + uncomp_crc32 = (mz_uint32)mz_crc32(MZ_CRC32_INIT, (const mz_uint8*)pBuf, buf_size); + uncomp_size = buf_size; + if (uncomp_size <= 3) + { + level = 0; + store_data_uncompressed = MZ_TRUE; + } + } + + if (store_data_uncompressed) + { + if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_archive_file_ofs, pBuf, buf_size) != buf_size) + { + pZip->m_pFree(pZip->m_pAlloc_opaque, pComp); + return MZ_FALSE; + } + + cur_archive_file_ofs += buf_size; + comp_size = buf_size; + + if (level_and_flags & MZ_ZIP_FLAG_COMPRESSED_DATA) + method = MZ_DEFLATED; + } + else if (buf_size) + { + mz_zip_writer_add_state state; + + state.m_pZip = pZip; + state.m_cur_archive_file_ofs = cur_archive_file_ofs; + state.m_comp_size = 0; + + if ((tdefl_init(pComp, mz_zip_writer_add_put_buf_callback, &state, tdefl_create_comp_flags_from_zip_params(level, -15, MZ_DEFAULT_STRATEGY)) != TDEFL_STATUS_OKAY) || + (tdefl_compress_buffer(pComp, pBuf, buf_size, TDEFL_FINISH) != TDEFL_STATUS_DONE)) + { + pZip->m_pFree(pZip->m_pAlloc_opaque, pComp); + return MZ_FALSE; + } + + comp_size = state.m_comp_size; + cur_archive_file_ofs = state.m_cur_archive_file_ofs; + + method = MZ_DEFLATED; + } + + pZip->m_pFree(pZip->m_pAlloc_opaque, pComp); + pComp = NULL; + + // no zip64 support yet + if ((comp_size > 0xFFFFFFFF) || (cur_archive_file_ofs > 0xFFFFFFFF)) + return MZ_FALSE; + + if (!mz_zip_writer_create_local_dir_header(pZip, local_dir_header, (mz_uint16)archive_name_size, 0, uncomp_size, comp_size, uncomp_crc32, method, 0, dos_time, dos_date)) + return MZ_FALSE; + + if (pZip->m_pWrite(pZip->m_pIO_opaque, local_dir_header_ofs, local_dir_header, sizeof(local_dir_header)) != sizeof(local_dir_header)) + return MZ_FALSE; + + if (!mz_zip_writer_add_to_central_dir(pZip, pArchive_name, (mz_uint16)archive_name_size, NULL, 0, pComment, comment_size, uncomp_size, comp_size, uncomp_crc32, method, 0, dos_time, dos_date, local_dir_header_ofs, ext_attributes)) + return MZ_FALSE; + + pZip->m_total_files++; + pZip->m_archive_size = cur_archive_file_ofs; + + return MZ_TRUE; +} + +#ifndef MINIZ_NO_STDIO +mz_bool mz_zip_writer_add_file(mz_zip_archive *pZip, const char *pArchive_name, const char *pSrc_filename, const void *pComment, mz_uint16 comment_size, mz_uint level_and_flags) +{ + mz_uint uncomp_crc32 = MZ_CRC32_INIT, level, num_alignment_padding_bytes; + mz_uint16 method = 0, dos_time = 0, dos_date = 0, ext_attributes = 0; + mz_uint64 local_dir_header_ofs = pZip->m_archive_size, cur_archive_file_ofs = pZip->m_archive_size, uncomp_size = 0, comp_size = 0; + size_t archive_name_size; + mz_uint8 local_dir_header[MZ_ZIP_LOCAL_DIR_HEADER_SIZE]; + MZ_FILE *pSrc_file = NULL; + + if ((int)level_and_flags < 0) + level_and_flags = MZ_DEFAULT_LEVEL; + level = level_and_flags & 0xF; + + if ((!pZip) || (!pZip->m_pState) || (pZip->m_zip_mode != MZ_ZIP_MODE_WRITING) || (!pArchive_name) || ((comment_size) && (!pComment)) || (level > MZ_UBER_COMPRESSION)) + return MZ_FALSE; + if (level_and_flags & MZ_ZIP_FLAG_COMPRESSED_DATA) + return MZ_FALSE; + if (!mz_zip_writer_validate_archive_name(pArchive_name)) + return MZ_FALSE; + + archive_name_size = strlen(pArchive_name); + if (archive_name_size > 0xFFFF) + return MZ_FALSE; + + num_alignment_padding_bytes = mz_zip_writer_compute_padding_needed_for_file_alignment(pZip); + + // no zip64 support yet + if ((pZip->m_total_files == 0xFFFF) || ((pZip->m_archive_size + num_alignment_padding_bytes + MZ_ZIP_LOCAL_DIR_HEADER_SIZE + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + comment_size + archive_name_size) > 0xFFFFFFFF)) + return MZ_FALSE; + + if (!mz_zip_get_file_modified_time(pSrc_filename, &dos_time, &dos_date)) + return MZ_FALSE; + + pSrc_file = MZ_FOPEN(pSrc_filename, "rb"); + if (!pSrc_file) + return MZ_FALSE; + MZ_FSEEK64(pSrc_file, 0, SEEK_END); + uncomp_size = MZ_FTELL64(pSrc_file); + MZ_FSEEK64(pSrc_file, 0, SEEK_SET); + + if (uncomp_size > 0xFFFFFFFF) + { + // No zip64 support yet + MZ_FCLOSE(pSrc_file); + return MZ_FALSE; + } + if (uncomp_size <= 3) + level = 0; + + if (!mz_zip_writer_write_zeros(pZip, cur_archive_file_ofs, num_alignment_padding_bytes + sizeof(local_dir_header))) + { + MZ_FCLOSE(pSrc_file); + return MZ_FALSE; + } + local_dir_header_ofs += num_alignment_padding_bytes; + if (pZip->m_file_offset_alignment) { MZ_ASSERT((local_dir_header_ofs & (pZip->m_file_offset_alignment - 1)) == 0); } + cur_archive_file_ofs += num_alignment_padding_bytes + sizeof(local_dir_header); + + MZ_CLEAR_OBJ(local_dir_header); + if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_archive_file_ofs, pArchive_name, archive_name_size) != archive_name_size) + { + MZ_FCLOSE(pSrc_file); + return MZ_FALSE; + } + cur_archive_file_ofs += archive_name_size; + + if (uncomp_size) + { + mz_uint64 uncomp_remaining = uncomp_size; + void *pRead_buf = pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, MZ_ZIP_MAX_IO_BUF_SIZE); + if (!pRead_buf) + { + MZ_FCLOSE(pSrc_file); + return MZ_FALSE; + } + + if (!level) + { + while (uncomp_remaining) + { + mz_uint n = (mz_uint)MZ_MIN(MZ_ZIP_MAX_IO_BUF_SIZE, uncomp_remaining); + if ((MZ_FREAD(pRead_buf, 1, n, pSrc_file) != n) || (pZip->m_pWrite(pZip->m_pIO_opaque, cur_archive_file_ofs, pRead_buf, n) != n)) + { + pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf); + MZ_FCLOSE(pSrc_file); + return MZ_FALSE; + } + uncomp_crc32 = (mz_uint32)mz_crc32(uncomp_crc32, (const mz_uint8 *)pRead_buf, n); + uncomp_remaining -= n; + cur_archive_file_ofs += n; + } + comp_size = uncomp_size; + } + else + { + mz_bool result = MZ_FALSE; + mz_zip_writer_add_state state; + tdefl_compressor *pComp = (tdefl_compressor *)pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, sizeof(tdefl_compressor)); + if (!pComp) + { + pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf); + MZ_FCLOSE(pSrc_file); + return MZ_FALSE; + } + + state.m_pZip = pZip; + state.m_cur_archive_file_ofs = cur_archive_file_ofs; + state.m_comp_size = 0; + + if (tdefl_init(pComp, mz_zip_writer_add_put_buf_callback, &state, tdefl_create_comp_flags_from_zip_params(level, -15, MZ_DEFAULT_STRATEGY)) != TDEFL_STATUS_OKAY) + { + pZip->m_pFree(pZip->m_pAlloc_opaque, pComp); + pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf); + MZ_FCLOSE(pSrc_file); + return MZ_FALSE; + } + + for ( ; ; ) + { + size_t in_buf_size = (mz_uint32)MZ_MIN(uncomp_remaining, MZ_ZIP_MAX_IO_BUF_SIZE); + tdefl_status status; + + if (MZ_FREAD(pRead_buf, 1, in_buf_size, pSrc_file) != in_buf_size) + break; + + uncomp_crc32 = (mz_uint32)mz_crc32(uncomp_crc32, (const mz_uint8 *)pRead_buf, in_buf_size); + uncomp_remaining -= in_buf_size; + + status = tdefl_compress_buffer(pComp, pRead_buf, in_buf_size, uncomp_remaining ? TDEFL_NO_FLUSH : TDEFL_FINISH); + if (status == TDEFL_STATUS_DONE) + { + result = MZ_TRUE; + break; + } + else if (status != TDEFL_STATUS_OKAY) + break; + } + + pZip->m_pFree(pZip->m_pAlloc_opaque, pComp); + + if (!result) + { + pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf); + MZ_FCLOSE(pSrc_file); + return MZ_FALSE; + } + + comp_size = state.m_comp_size; + cur_archive_file_ofs = state.m_cur_archive_file_ofs; + + method = MZ_DEFLATED; + } + + pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf); + } + + MZ_FCLOSE(pSrc_file); pSrc_file = NULL; + + // no zip64 support yet + if ((comp_size > 0xFFFFFFFF) || (cur_archive_file_ofs > 0xFFFFFFFF)) + return MZ_FALSE; + + if (!mz_zip_writer_create_local_dir_header(pZip, local_dir_header, (mz_uint16)archive_name_size, 0, uncomp_size, comp_size, uncomp_crc32, method, 0, dos_time, dos_date)) + return MZ_FALSE; + + if (pZip->m_pWrite(pZip->m_pIO_opaque, local_dir_header_ofs, local_dir_header, sizeof(local_dir_header)) != sizeof(local_dir_header)) + return MZ_FALSE; + + if (!mz_zip_writer_add_to_central_dir(pZip, pArchive_name, (mz_uint16)archive_name_size, NULL, 0, pComment, comment_size, uncomp_size, comp_size, uncomp_crc32, method, 0, dos_time, dos_date, local_dir_header_ofs, ext_attributes)) + return MZ_FALSE; + + pZip->m_total_files++; + pZip->m_archive_size = cur_archive_file_ofs; + + return MZ_TRUE; +} +#endif // #ifndef MINIZ_NO_STDIO + +mz_bool mz_zip_writer_add_from_zip_reader(mz_zip_archive *pZip, mz_zip_archive *pSource_zip, mz_uint file_index) +{ + mz_uint n, bit_flags, num_alignment_padding_bytes; + mz_uint64 comp_bytes_remaining, local_dir_header_ofs; + mz_uint64 cur_src_file_ofs, cur_dst_file_ofs; + mz_uint32 local_header_u32[(MZ_ZIP_LOCAL_DIR_HEADER_SIZE + sizeof(mz_uint32) - 1) / sizeof(mz_uint32)]; mz_uint8 *pLocal_header = (mz_uint8 *)local_header_u32; + mz_uint8 central_header[MZ_ZIP_CENTRAL_DIR_HEADER_SIZE]; + size_t orig_central_dir_size; + mz_zip_internal_state *pState; + void *pBuf; const mz_uint8 *pSrc_central_header; + + if ((!pZip) || (!pZip->m_pState) || (pZip->m_zip_mode != MZ_ZIP_MODE_WRITING)) + return MZ_FALSE; + if (NULL == (pSrc_central_header = mz_zip_reader_get_cdh(pSource_zip, file_index))) + return MZ_FALSE; + pState = pZip->m_pState; + + num_alignment_padding_bytes = mz_zip_writer_compute_padding_needed_for_file_alignment(pZip); + + // no zip64 support yet + if ((pZip->m_total_files == 0xFFFF) || ((pZip->m_archive_size + num_alignment_padding_bytes + MZ_ZIP_LOCAL_DIR_HEADER_SIZE + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE) > 0xFFFFFFFF)) + return MZ_FALSE; + + cur_src_file_ofs = MZ_READ_LE32(pSrc_central_header + MZ_ZIP_CDH_LOCAL_HEADER_OFS); + cur_dst_file_ofs = pZip->m_archive_size; + + if (pSource_zip->m_pRead(pSource_zip->m_pIO_opaque, cur_src_file_ofs, pLocal_header, MZ_ZIP_LOCAL_DIR_HEADER_SIZE) != MZ_ZIP_LOCAL_DIR_HEADER_SIZE) + return MZ_FALSE; + if (MZ_READ_LE32(pLocal_header) != MZ_ZIP_LOCAL_DIR_HEADER_SIG) + return MZ_FALSE; + cur_src_file_ofs += MZ_ZIP_LOCAL_DIR_HEADER_SIZE; + + if (!mz_zip_writer_write_zeros(pZip, cur_dst_file_ofs, num_alignment_padding_bytes)) + return MZ_FALSE; + cur_dst_file_ofs += num_alignment_padding_bytes; + local_dir_header_ofs = cur_dst_file_ofs; + if (pZip->m_file_offset_alignment) { MZ_ASSERT((local_dir_header_ofs & (pZip->m_file_offset_alignment - 1)) == 0); } + + if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_dst_file_ofs, pLocal_header, MZ_ZIP_LOCAL_DIR_HEADER_SIZE) != MZ_ZIP_LOCAL_DIR_HEADER_SIZE) + return MZ_FALSE; + cur_dst_file_ofs += MZ_ZIP_LOCAL_DIR_HEADER_SIZE; + + n = MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_FILENAME_LEN_OFS) + MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_EXTRA_LEN_OFS); + comp_bytes_remaining = n + MZ_READ_LE32(pSrc_central_header + MZ_ZIP_CDH_COMPRESSED_SIZE_OFS); + + if (NULL == (pBuf = pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, (size_t)MZ_MAX(sizeof(mz_uint32) * 4, MZ_MIN(MZ_ZIP_MAX_IO_BUF_SIZE, comp_bytes_remaining))))) + return MZ_FALSE; + + while (comp_bytes_remaining) + { + n = (mz_uint)MZ_MIN(MZ_ZIP_MAX_IO_BUF_SIZE, comp_bytes_remaining); + if (pSource_zip->m_pRead(pSource_zip->m_pIO_opaque, cur_src_file_ofs, pBuf, n) != n) + { + pZip->m_pFree(pZip->m_pAlloc_opaque, pBuf); + return MZ_FALSE; + } + cur_src_file_ofs += n; + + if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_dst_file_ofs, pBuf, n) != n) + { + pZip->m_pFree(pZip->m_pAlloc_opaque, pBuf); + return MZ_FALSE; + } + cur_dst_file_ofs += n; + + comp_bytes_remaining -= n; + } + + bit_flags = MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_BIT_FLAG_OFS); + if (bit_flags & 8) + { + // Copy data descriptor + if (pSource_zip->m_pRead(pSource_zip->m_pIO_opaque, cur_src_file_ofs, pBuf, sizeof(mz_uint32) * 4) != sizeof(mz_uint32) * 4) + { + pZip->m_pFree(pZip->m_pAlloc_opaque, pBuf); + return MZ_FALSE; + } + + n = sizeof(mz_uint32) * ((MZ_READ_LE32(pBuf) == 0x08074b50) ? 4 : 3); + if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_dst_file_ofs, pBuf, n) != n) + { + pZip->m_pFree(pZip->m_pAlloc_opaque, pBuf); + return MZ_FALSE; + } + + cur_src_file_ofs += n; + cur_dst_file_ofs += n; + } + pZip->m_pFree(pZip->m_pAlloc_opaque, pBuf); + + // no zip64 support yet + if (cur_dst_file_ofs > 0xFFFFFFFF) + return MZ_FALSE; + + orig_central_dir_size = pState->m_central_dir.m_size; + + memcpy(central_header, pSrc_central_header, MZ_ZIP_CENTRAL_DIR_HEADER_SIZE); + MZ_WRITE_LE32(central_header + MZ_ZIP_CDH_LOCAL_HEADER_OFS, local_dir_header_ofs); + if (!mz_zip_array_push_back(pZip, &pState->m_central_dir, central_header, MZ_ZIP_CENTRAL_DIR_HEADER_SIZE)) + return MZ_FALSE; + + n = MZ_READ_LE16(pSrc_central_header + MZ_ZIP_CDH_FILENAME_LEN_OFS) + MZ_READ_LE16(pSrc_central_header + MZ_ZIP_CDH_EXTRA_LEN_OFS) + MZ_READ_LE16(pSrc_central_header + MZ_ZIP_CDH_COMMENT_LEN_OFS); + if (!mz_zip_array_push_back(pZip, &pState->m_central_dir, pSrc_central_header + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE, n)) + { + mz_zip_array_resize(pZip, &pState->m_central_dir, orig_central_dir_size, MZ_FALSE); + return MZ_FALSE; + } + + if (pState->m_central_dir.m_size > 0xFFFFFFFF) + return MZ_FALSE; + n = (mz_uint32)orig_central_dir_size; + if (!mz_zip_array_push_back(pZip, &pState->m_central_dir_offsets, &n, 1)) + { + mz_zip_array_resize(pZip, &pState->m_central_dir, orig_central_dir_size, MZ_FALSE); + return MZ_FALSE; + } + + pZip->m_total_files++; + pZip->m_archive_size = cur_dst_file_ofs; + + return MZ_TRUE; +} + +mz_bool mz_zip_writer_finalize_archive(mz_zip_archive *pZip) +{ + mz_zip_internal_state *pState; + mz_uint64 central_dir_ofs, central_dir_size; + mz_uint8 hdr[MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE]; + + if ((!pZip) || (!pZip->m_pState) || (pZip->m_zip_mode != MZ_ZIP_MODE_WRITING)) + return MZ_FALSE; + + pState = pZip->m_pState; + + // no zip64 support yet + if ((pZip->m_total_files > 0xFFFF) || ((pZip->m_archive_size + pState->m_central_dir.m_size + MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE) > 0xFFFFFFFF)) + return MZ_FALSE; + + central_dir_ofs = 0; + central_dir_size = 0; + if (pZip->m_total_files) + { + // Write central directory + central_dir_ofs = pZip->m_archive_size; + central_dir_size = pState->m_central_dir.m_size; + pZip->m_central_directory_file_ofs = central_dir_ofs; + if (pZip->m_pWrite(pZip->m_pIO_opaque, central_dir_ofs, pState->m_central_dir.m_p, (size_t)central_dir_size) != central_dir_size) + return MZ_FALSE; + pZip->m_archive_size += central_dir_size; + } + + // Write end of central directory record + MZ_CLEAR_OBJ(hdr); + MZ_WRITE_LE32(hdr + MZ_ZIP_ECDH_SIG_OFS, MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIG); + MZ_WRITE_LE16(hdr + MZ_ZIP_ECDH_CDIR_NUM_ENTRIES_ON_DISK_OFS, pZip->m_total_files); + MZ_WRITE_LE16(hdr + MZ_ZIP_ECDH_CDIR_TOTAL_ENTRIES_OFS, pZip->m_total_files); + MZ_WRITE_LE32(hdr + MZ_ZIP_ECDH_CDIR_SIZE_OFS, central_dir_size); + MZ_WRITE_LE32(hdr + MZ_ZIP_ECDH_CDIR_OFS_OFS, central_dir_ofs); + + if (pZip->m_pWrite(pZip->m_pIO_opaque, pZip->m_archive_size, hdr, sizeof(hdr)) != sizeof(hdr)) + return MZ_FALSE; +#ifndef MINIZ_NO_STDIO + if ((pState->m_pFile) && (MZ_FFLUSH(pState->m_pFile) == EOF)) + return MZ_FALSE; +#endif // #ifndef MINIZ_NO_STDIO + + pZip->m_archive_size += sizeof(hdr); + + pZip->m_zip_mode = MZ_ZIP_MODE_WRITING_HAS_BEEN_FINALIZED; + return MZ_TRUE; +} + +mz_bool mz_zip_writer_finalize_heap_archive(mz_zip_archive *pZip, void **pBuf, size_t *pSize) +{ + if ((!pZip) || (!pZip->m_pState) || (!pBuf) || (!pSize)) + return MZ_FALSE; + if (pZip->m_pWrite != mz_zip_heap_write_func) + return MZ_FALSE; + if (!mz_zip_writer_finalize_archive(pZip)) + return MZ_FALSE; + + *pBuf = pZip->m_pState->m_pMem; + *pSize = pZip->m_pState->m_mem_size; + pZip->m_pState->m_pMem = NULL; + pZip->m_pState->m_mem_size = pZip->m_pState->m_mem_capacity = 0; + return MZ_TRUE; +} + +mz_bool mz_zip_writer_end(mz_zip_archive *pZip) +{ + mz_zip_internal_state *pState; + mz_bool status = MZ_TRUE; + if ((!pZip) || (!pZip->m_pState) || (!pZip->m_pAlloc) || (!pZip->m_pFree) || ((pZip->m_zip_mode != MZ_ZIP_MODE_WRITING) && (pZip->m_zip_mode != MZ_ZIP_MODE_WRITING_HAS_BEEN_FINALIZED))) + return MZ_FALSE; + + pState = pZip->m_pState; + pZip->m_pState = NULL; + mz_zip_array_clear(pZip, &pState->m_central_dir); + mz_zip_array_clear(pZip, &pState->m_central_dir_offsets); + mz_zip_array_clear(pZip, &pState->m_sorted_central_dir_offsets); + +#ifndef MINIZ_NO_STDIO + if (pState->m_pFile) + { + MZ_FCLOSE(pState->m_pFile); + pState->m_pFile = NULL; + } +#endif // #ifndef MINIZ_NO_STDIO + + if ((pZip->m_pWrite == mz_zip_heap_write_func) && (pState->m_pMem)) + { + pZip->m_pFree(pZip->m_pAlloc_opaque, pState->m_pMem); + pState->m_pMem = NULL; + } + + pZip->m_pFree(pZip->m_pAlloc_opaque, pState); + pZip->m_zip_mode = MZ_ZIP_MODE_INVALID; + return status; +} + +#ifndef MINIZ_NO_STDIO +mz_bool mz_zip_add_mem_to_archive_file_in_place(const char *pZip_filename, const char *pArchive_name, const void *pBuf, size_t buf_size, const void *pComment, mz_uint16 comment_size, mz_uint level_and_flags) +{ + mz_bool status, created_new_archive = MZ_FALSE; + mz_zip_archive zip_archive; + struct MZ_FILE_STAT_STRUCT file_stat; + MZ_CLEAR_OBJ(zip_archive); + if ((int)level_and_flags < 0) + level_and_flags = MZ_DEFAULT_LEVEL; + if ((!pZip_filename) || (!pArchive_name) || ((buf_size) && (!pBuf)) || ((comment_size) && (!pComment)) || ((level_and_flags & 0xF) > MZ_UBER_COMPRESSION)) + return MZ_FALSE; + if (!mz_zip_writer_validate_archive_name(pArchive_name)) + return MZ_FALSE; + if (MZ_FILE_STAT(pZip_filename, &file_stat) != 0) + { + // Create a new archive. + if (!mz_zip_writer_init_file(&zip_archive, pZip_filename, 0)) + return MZ_FALSE; + created_new_archive = MZ_TRUE; + } + else + { + // Append to an existing archive. + if (!mz_zip_reader_init_file(&zip_archive, pZip_filename, level_and_flags | MZ_ZIP_FLAG_DO_NOT_SORT_CENTRAL_DIRECTORY)) + return MZ_FALSE; + if (!mz_zip_writer_init_from_reader(&zip_archive, pZip_filename)) + { + mz_zip_reader_end(&zip_archive); + return MZ_FALSE; + } + } + status = mz_zip_writer_add_mem_ex(&zip_archive, pArchive_name, pBuf, buf_size, pComment, comment_size, level_and_flags, 0, 0); + // Always finalize, even if adding failed for some reason, so we have a valid central directory. (This may not always succeed, but we can try.) + if (!mz_zip_writer_finalize_archive(&zip_archive)) + status = MZ_FALSE; + if (!mz_zip_writer_end(&zip_archive)) + status = MZ_FALSE; + if ((!status) && (created_new_archive)) + { + // It's a new archive and something went wrong, so just delete it. + int ignoredStatus = MZ_DELETE_FILE(pZip_filename); + (void)ignoredStatus; + } + return status; +} + +void *mz_zip_extract_archive_file_to_heap(const char *pZip_filename, const char *pArchive_name, size_t *pSize, mz_uint flags) +{ + int file_index; + mz_zip_archive zip_archive; + void *p = NULL; + + if (pSize) + *pSize = 0; + + if ((!pZip_filename) || (!pArchive_name)) + return NULL; + + MZ_CLEAR_OBJ(zip_archive); + if (!mz_zip_reader_init_file(&zip_archive, pZip_filename, flags | MZ_ZIP_FLAG_DO_NOT_SORT_CENTRAL_DIRECTORY)) + return NULL; + + if ((file_index = mz_zip_reader_locate_file(&zip_archive, pArchive_name, NULL, flags)) >= 0) + p = mz_zip_reader_extract_to_heap(&zip_archive, file_index, pSize, flags); + + mz_zip_reader_end(&zip_archive); + return p; +} + +#endif // #ifndef MINIZ_NO_STDIO + +#endif // #ifndef MINIZ_NO_ARCHIVE_WRITING_APIS + +#endif // #ifndef MINIZ_NO_ARCHIVE_APIS + +#ifdef __cplusplus +} +#endif + +#endif // MINIZ_HEADER_FILE_ONLY + +/* + This is free and unencumbered software released into the public domain. + + Anyone is free to copy, modify, publish, use, compile, sell, or + distribute this software, either in source code form or as a compiled + binary, for any purpose, commercial or non-commercial, and by any + means. + + In jurisdictions that recognize copyright laws, the author or authors + of this software dedicate any and all copyright interest in the + software to the public domain. We make this dedication for the benefit + of the public at large and to the detriment of our heirs and + successors. We intend this dedication to be an overt act of + relinquishment in perpetuity of all present and future rights to this + software under copyright law. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + For more information, please refer to +*/ + +namespace miniz_cpp { +namespace detail { + +#ifdef _WIN32 +char directory_separator = '\\'; +char alt_directory_separator = '/'; +#else +char directory_separator = '/'; +char alt_directory_separator = '\\'; +#endif + +std::string join_path(const std::vector &parts) +{ + std::string joined; + std::size_t i = 0; + for(auto part : parts) + { + joined.append(part); + + if(i++ != parts.size() - 1) + { + joined.append(1, '/'); + } + } + return joined; +} + +std::vector split_path(const std::string &path, char delim = directory_separator) +{ + std::vector split; + std::string::size_type previous_index = 0; + auto separator_index = path.find(delim); + + while(separator_index != std::string::npos) + { + auto part = path.substr(previous_index, separator_index - previous_index); + if(part != "..") + { + split.push_back(part); + } + else + { + split.pop_back(); + } + previous_index = separator_index + 1; + separator_index = path.find(delim, previous_index); + } + + split.push_back(path.substr(previous_index)); + + if(split.size() == 1 && delim == directory_separator) + { + auto alternative = split_path(path, alt_directory_separator); + if(alternative.size() > 1) + { + return alternative; + } + } + + return split; +} + +uint32_t crc32buf(const char *buf, std::size_t len) +{ + uint32_t oldcrc32 = 0xFFFFFFFF; + + uint32_t crc_32_tab[] = { /* CRC polynomial 0xedb88320 */ + 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, + 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, + 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2, + 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, + 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, + 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, + 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c, + 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, + 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, + 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, + 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106, + 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, + 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, + 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, + 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, + 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, + 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, + 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, + 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, + 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, + 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, + 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, + 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84, + 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, + 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, + 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, + 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e, + 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, + 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, + 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, + 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28, + 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, + 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, + 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, + 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, + 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, + 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, + 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, + 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, + 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, + 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, + 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, + 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d + }; + +#define UPDC32(octet,crc) (crc_32_tab[((crc)\ +^ static_cast(octet)) & 0xff] ^ ((crc) >> 8)) + + for ( ; len; --len, ++buf) + { + oldcrc32 = UPDC32(*buf, oldcrc32); + } + + return ~oldcrc32; +} + +tm safe_localtime(const time_t &t) +{ +#ifdef _WIN32 + tm time; + localtime_s(&time, &t); + return time; +#else + tm *time = localtime(&t); + assert(time != nullptr); + return *time; +#endif +} + +std::size_t write_callback(void *opaque, std::uint64_t file_ofs, const void *pBuf, std::size_t n) +{ + auto buffer = static_cast *>(opaque); + + if(file_ofs + n > buffer->size()) + { + auto new_size = static_cast::size_type>(file_ofs + n); + buffer->resize(new_size); + } + + for(std::size_t i = 0; i < n; i++) + { + (*buffer)[static_cast(file_ofs + i)] = (static_cast(pBuf))[i]; + } + + return n; +} + +} // namespace detail + +struct zip_info +{ + std::string filename; + + struct + { + int year = 1980; + int month = 0; + int day = 0; + int hours = 0; + int minutes = 0; + int seconds = 0; + } date_time; + + std::string comment; + std::string extra; + uint16_t create_system = 0; + uint16_t create_version = 0; + uint16_t extract_version = 0; + uint16_t flag_bits = 0; + std::size_t volume = 0; + uint32_t internal_attr = 0; + uint32_t external_attr = 0; + std::size_t header_offset = 0; + uint32_t crc = 0; + std::size_t compress_size = 0; + std::size_t file_size = 0; +}; + +class zip_file +{ + public: + zip_file() : archive_(new mz_zip_archive()) + { + reset(); + } + + zip_file(const std::string &filename) : zip_file() + { + load(filename); + } + + zip_file(std::istream &stream) : zip_file() + { + load(stream); + } + + zip_file(const std::vector &bytes) : zip_file() + { + load(bytes); + } + + ~zip_file() + { + reset(); + } + + void load(std::istream &stream) + { + reset(); + buffer_.assign(std::istreambuf_iterator(stream), std::istreambuf_iterator()); + remove_comment(); + start_read(); + } + + void load(const std::string &filename) + { + filename_ = filename; + std::ifstream stream(filename, std::ios::binary); + load(stream); + } + + void load(const std::vector &bytes) + { + reset(); + buffer_.assign(bytes.begin(), bytes.end()); + remove_comment(); + start_read(); + } + + void save(const std::string &filename) + { + filename_ = filename; + std::ofstream stream(filename, std::ios::binary); + save(stream); + } + + void save(std::ostream &stream) + { + if(archive_->m_zip_mode == MZ_ZIP_MODE_WRITING) + { + mz_zip_writer_finalize_archive(archive_.get()); + } + + if(archive_->m_zip_mode == MZ_ZIP_MODE_WRITING_HAS_BEEN_FINALIZED) + { + mz_zip_writer_end(archive_.get()); + } + + if(archive_->m_zip_mode == MZ_ZIP_MODE_INVALID) + { + start_read(); + } + + append_comment(); + stream.write(buffer_.data(), static_cast(buffer_.size())); + } + + void save(std::vector &bytes) + { + if(archive_->m_zip_mode == MZ_ZIP_MODE_WRITING) + { + mz_zip_writer_finalize_archive(archive_.get()); + } + + if(archive_->m_zip_mode == MZ_ZIP_MODE_WRITING_HAS_BEEN_FINALIZED) + { + mz_zip_writer_end(archive_.get()); + } + + if(archive_->m_zip_mode == MZ_ZIP_MODE_INVALID) + { + start_read(); + } + + append_comment(); + bytes.assign(buffer_.begin(), buffer_.end()); + } + + void reset() + { + switch(archive_->m_zip_mode) + { + case MZ_ZIP_MODE_READING: + mz_zip_reader_end(archive_.get()); + break; + case MZ_ZIP_MODE_WRITING: + mz_zip_writer_finalize_archive(archive_.get()); + mz_zip_writer_end(archive_.get()); + break; + case MZ_ZIP_MODE_WRITING_HAS_BEEN_FINALIZED: + mz_zip_writer_end(archive_.get()); + break; + case MZ_ZIP_MODE_INVALID: + break; + } + + if(archive_->m_zip_mode != MZ_ZIP_MODE_INVALID) + { + throw std::runtime_error(""); + } + + buffer_.clear(); + comment.clear(); + + start_write(); + mz_zip_writer_finalize_archive(archive_.get()); + mz_zip_writer_end(archive_.get()); + } + + bool has_file(const std::string &name) + { + if(archive_->m_zip_mode != MZ_ZIP_MODE_READING) + { + start_read(); + } + + int index = mz_zip_reader_locate_file(archive_.get(), name.c_str(), nullptr, 0); + + return index != -1; + } + + bool has_file(const zip_info &name) + { + return has_file(name.filename); + } + + zip_info getinfo(const std::string &name) + { + if(archive_->m_zip_mode != MZ_ZIP_MODE_READING) + { + start_read(); + } + + int index = mz_zip_reader_locate_file(archive_.get(), name.c_str(), nullptr, 0); + + if(index == -1) + { + throw std::runtime_error("not found"); + } + + return getinfo(index); + } + + std::vector infolist() + { + if(archive_->m_zip_mode != MZ_ZIP_MODE_READING) + { + start_read(); + } + + std::vector info; + + for(std::size_t i = 0; i < mz_zip_reader_get_num_files(archive_.get()); i++) + { + info.push_back(getinfo(static_cast(i))); + } + + return info; + } + + std::vector namelist() + { + std::vector names; + + for(auto &info : infolist()) + { + names.push_back(info.filename); + } + + return names; + } + + std::ostream &open(const std::string &name) + { + return open(getinfo(name)); + } + + std::ostream &open(const zip_info &name) + { + auto data = read(name); + std::string data_string(data.begin(), data.end()); + open_stream_ << data_string; + return open_stream_; + } + + void extract(const std::string &member, const std::string &path) + { + std::fstream stream(detail::join_path({path, member}), std::ios::binary | std::ios::out); + stream << open(member).rdbuf(); + } + + void extract(const zip_info &member, const std::string &path) + { + auto file=detail::join_path({path, member.filename}); + auto target=std::filesystem::path(file).parent_path(); + if (!std::filesystem::exists(target)) + std::filesystem::create_directories(target); + std::fstream stream(file, std::ios::binary | std::ios::out); + stream << open(member).rdbuf(); + } + + void extractall(const std::string &path) + { + extractall(path, infolist()); + } + + void extractall(const std::string &path, const std::vector &members) + { + for(auto &member : members) + { + extract(member, path); + } + } + + void extractall(const std::string &path, const std::vector &members) + { + for(auto &member : members) + { + extract(member, path); + } + } + + void printdir() + { + printdir(std::cout); + } + + void printdir(std::ostream &stream) + { + stream << " Length " << " " << " " << "Date" << " " << " " << "Time " << " " << "Name" << std::endl; + stream << "--------- ---------- ----- ----" << std::endl; + + std::size_t sum_length = 0; + std::size_t file_count = 0; + + for(auto &member : infolist()) + { + sum_length += member.file_size; + file_count++; + + std::string length_string = std::to_string(member.file_size); + while(length_string.length() < 9) + { + length_string = " " + length_string; + } + stream << length_string; + + stream << " "; + stream << (member.date_time.month < 10 ? "0" : "") << member.date_time.month; + stream << "/"; + stream << (member.date_time.day < 10 ? "0" : "") << member.date_time.day; + stream << "/"; + stream << member.date_time.year; + stream << " "; + stream << (member.date_time.hours < 10 ? "0" : "") << member.date_time.hours; + stream << ":"; + stream << (member.date_time.minutes < 10 ? "0" : "") << member.date_time.minutes; + stream << " "; + stream << member.filename; + stream << std::endl; + } + + stream << "--------- -------" << std::endl; + + std::string length_string = std::to_string(sum_length); + while(length_string.length() < 9) + { + length_string = " " + length_string; + } + stream << length_string << " " << file_count << " " << (file_count == 1 ? "file" : "files"); + stream << std::endl; + } + + std::string read(const zip_info &info) + { + std::size_t size; + char *data = static_cast(mz_zip_reader_extract_file_to_heap(archive_.get(), info.filename.c_str(), &size, 0)); + if(data == nullptr) + { + throw std::runtime_error("file couldn't be read"); + } + std::string extracted(data, data + size); + mz_free(data); + return extracted; + } + + std::string read(const std::string &name) + { + return read(getinfo(name)); + } + + std::pair testzip() + { + if(archive_->m_zip_mode == MZ_ZIP_MODE_INVALID) + { + throw std::runtime_error("not open"); + } + + for(auto &file : infolist()) + { + auto content = read(file); + auto crc = detail::crc32buf(content.c_str(), content.size()); + + if(crc != file.crc) + { + return {false, file.filename}; + } + } + + return {true, ""}; + } + + void write(const std::string &filename) + { + auto split = detail::split_path(filename); + if(split.size() > 1) + { + split.erase(split.begin()); + } + auto arcname = detail::join_path(split); + write(filename, arcname); + } + + void write(const std::string &filename, const std::string &arcname) + { + std::fstream file(filename, std::ios::binary | std::ios::in); + std::stringstream ss; + ss << file.rdbuf(); + std::string bytes = ss.str(); + + writestr(arcname, bytes); + } + + void writestr(const std::string &arcname, const std::string &bytes) + { + if(archive_->m_zip_mode != MZ_ZIP_MODE_WRITING) + { + start_write(); + } + + if(!mz_zip_writer_add_mem(archive_.get(), arcname.c_str(), bytes.data(), bytes.size(), MZ_BEST_COMPRESSION)) + { + throw std::runtime_error("write error"); + } + } + + void writestr(const zip_info &info, const std::string &bytes) + { + if(info.filename.empty() || info.date_time.year < 1980) + { + throw std::runtime_error("must specify a filename and valid date (year >= 1980"); + } + + if(archive_->m_zip_mode != MZ_ZIP_MODE_WRITING) + { + start_write(); + } + + auto crc = detail::crc32buf(bytes.c_str(), bytes.size()); + + if(!mz_zip_writer_add_mem_ex(archive_.get(), info.filename.c_str(), bytes.data(), bytes.size(), info.comment.c_str(), static_cast(info.comment.size()), MZ_BEST_COMPRESSION, 0, crc)) + { + throw std::runtime_error("write error"); + } + } + + std::string get_filename() const { return filename_; } + + std::string comment; + + private: + void start_read() + { + if(archive_->m_zip_mode == MZ_ZIP_MODE_READING) return; + + if(archive_->m_zip_mode == MZ_ZIP_MODE_WRITING) + { + mz_zip_writer_finalize_archive(archive_.get()); + } + + if(archive_->m_zip_mode == MZ_ZIP_MODE_WRITING_HAS_BEEN_FINALIZED) + { + mz_zip_writer_end(archive_.get()); + } + + if(!mz_zip_reader_init_mem(archive_.get(), buffer_.data(), buffer_.size(), 0)) + { + throw std::runtime_error("bad zip"); + } + } + + void start_write() + { + if(archive_->m_zip_mode == MZ_ZIP_MODE_WRITING) return; + + switch(archive_->m_zip_mode) + { + case MZ_ZIP_MODE_READING: + { + mz_zip_archive archive_copy; + std::memset(&archive_copy, 0, sizeof(mz_zip_archive)); + std::vector buffer_copy(buffer_.begin(), buffer_.end()); + + if(!mz_zip_reader_init_mem(&archive_copy, buffer_copy.data(), buffer_copy.size(), 0)) + { + throw std::runtime_error("bad zip"); + } + + mz_zip_reader_end(archive_.get()); + + archive_->m_pWrite = reinterpret_cast(&detail::write_callback); + archive_->m_pIO_opaque = &buffer_; + buffer_ = std::vector(); + + if(!mz_zip_writer_init(archive_.get(), 0)) + { + throw std::runtime_error("bad zip"); + } + + for(unsigned int i = 0; i < static_cast(archive_copy.m_total_files); i++) + { + if(!mz_zip_writer_add_from_zip_reader(archive_.get(), &archive_copy, i)) + { + throw std::runtime_error("fail"); + } + } + + mz_zip_reader_end(&archive_copy); + return; + } + case MZ_ZIP_MODE_WRITING_HAS_BEEN_FINALIZED: + mz_zip_writer_end(archive_.get()); + break; + case MZ_ZIP_MODE_INVALID: + case MZ_ZIP_MODE_WRITING: + break; + } + + archive_->m_pWrite = reinterpret_cast(&detail::write_callback); + archive_->m_pIO_opaque = &buffer_; + + if(!mz_zip_writer_init(archive_.get(), 0)) + { + throw std::runtime_error("bad zip"); + } + } + + void append_comment() + { + if(!comment.empty()) + { + auto comment_length = std::min(static_cast(comment.length()), std::numeric_limits::max()); + buffer_[buffer_.size() - 2] = static_cast(comment_length); + buffer_[buffer_.size() - 1] = static_cast(comment_length >> 8); + std::copy(comment.begin(), comment.end(), std::back_inserter(buffer_)); + } + } + + void remove_comment() + { + if(buffer_.empty()) return; + + std::size_t position = buffer_.size() - 1; + + for(; position >= 3; position--) + { + if(buffer_[position - 3] == 'P' + && buffer_[position - 2] == 'K' + && buffer_[position - 1] == '\x05' + && buffer_[position] == '\x06') + { + position = position + 17; + break; + } + } + + if(position == 3) + { + throw std::runtime_error("didn't find end of central directory signature"); + } + + uint16_t length = static_cast(buffer_[position + 1]); + length = static_cast(length << 8) + static_cast(buffer_[position]); + position += 2; + + if(length != 0) + { + comment = std::string(buffer_.data() + position, buffer_.data() + position + length); + buffer_.resize(buffer_.size() - length); + buffer_[buffer_.size() - 1] = 0; + buffer_[buffer_.size() - 2] = 0; + } + } + + zip_info getinfo(int index) + { + if(archive_->m_zip_mode != MZ_ZIP_MODE_READING) + { + start_read(); + } + + mz_zip_archive_file_stat stat; + mz_zip_reader_file_stat(archive_.get(), static_cast(index), &stat); + + zip_info result; + + result.filename = std::string(stat.m_filename, stat.m_filename + std::strlen(stat.m_filename)); + result.comment = std::string(stat.m_comment, stat.m_comment + stat.m_comment_size); + result.compress_size = static_cast(stat.m_comp_size); + result.file_size = static_cast(stat.m_uncomp_size); + result.header_offset = static_cast(stat.m_local_header_ofs); + result.crc = stat.m_crc32; + auto time = detail::safe_localtime(stat.m_time); + result.date_time.year = 1900 + time.tm_year; + result.date_time.month = 1 + time.tm_mon; + result.date_time.day = time.tm_mday; + result.date_time.hours = time.tm_hour; + result.date_time.minutes = time.tm_min; + result.date_time.seconds = time.tm_sec; + result.flag_bits = stat.m_bit_flag; + result.internal_attr = stat.m_internal_attr; + result.external_attr = stat.m_external_attr; + result.extract_version = stat.m_version_needed; + result.create_version = stat.m_version_made_by; + result.volume = stat.m_file_index; + result.create_system = stat.m_method; + + return result; + } + + std::unique_ptr archive_; + std::vector buffer_; + std::stringstream open_stream_; + std::string filename_; +}; + +} // namespace miniz_cpp diff --git a/tools/dkr_assets_tool_classes/make_asset_files/asset_asm_data.cpp b/tools/dkr_assets_tool_classes/make_asset_files/asset_asm_data.cpp new file mode 100644 index 00000000..14f62211 --- /dev/null +++ b/tools/dkr_assets_tool_classes/make_asset_files/asset_asm_data.cpp @@ -0,0 +1,177 @@ +#include "asset_asm_data.h" + +#define ASSETS_START_LABEL "ASSETS_START" +#define ASSETS_END_LABEL "ASSETS_END" +#define ASSETS_SIZE_LABEL "ASSETS_END - ASSETS_START" + +AssetAsmIncludes::AssetAsmIncludes(std::string assetsDirectory, std::string buildDirectory, std::string dstPath) { + std::stringstream out; + + write_comment(out, "This file is automatically generated. Any changes you make to this file will get overwritten."); + out << std::endl; + out << ".include \"macros.inc\"" << std::endl; + out << std::endl; + + std::vector sections = get_assets_order(); + write_main_table(out, sections); + + out << std::endl; + write_header_comment(out, "Asset Sections"); + write_global_label(out, ASSETS_START_LABEL, true); + out << std::endl; + + for(std::string §ionName : sections) { + write_section(out, assetsDirectory, buildDirectory, sectionName); + } + + write_global_label(out, ASSETS_END_LABEL, true); + + write_text_file(out.str(), dstPath + "/assets.s"); +} + +AssetAsmIncludes::~AssetAsmIncludes() { + +} + +void AssetAsmIncludes::write_comment(std::stringstream &out, std::string text) { + out << "# " << text << std::endl; +} + +void AssetAsmIncludes::write_header_comment(std::stringstream &out, std::string text) { + out << "/********** " << text << " **********/" << std::endl << std::endl; +} + +void AssetAsmIncludes::write_word(std::stringstream &out, std::string value) { + out << ".word " << value << std::endl; +} + +void AssetAsmIncludes::write_two_words(std::stringstream &out, std::string value, std::string value2) { + out << ".word " << value << ", " << value2 << std::endl; +} + +void AssetAsmIncludes::write_word_with_comment(std::stringstream &out, std::string value, std::string comment) { + out << ".word " << value << " # " << comment << std::endl; +} + +void AssetAsmIncludes::write_binary_include(std::stringstream &out, std::string path) { + out << ".incbin \"" << replace_extension(path, ".bin") << "\"" << std::endl; +} + +void AssetAsmIncludes::write_global_label(std::stringstream &out, std::string label, bool align) { + if(align) { + out << ".balign 16" << std::endl; + } + out << "glabel " << label << std::endl; +} + +void AssetAsmIncludes::write_main_table(std::stringstream &out, std::vector §ionNames) { + write_header_comment(out, "Asset Sections Table"); + write_word_with_comment(out, std::to_string(get_asset_count()), "Number of entries in the table"); + for(std::string §ionName : sectionNames) { + write_word(out, sectionName + " - " + ASSETS_START_LABEL); + } + write_word(out, ASSETS_SIZE_LABEL); +} + +std::string formatGameTextWordEntry(std::string sourceSectionFirst, std::string entryName, std::string gameTextJsonPath) { + bool isDialog = get_string_from_json(gameTextJsonPath, "text-type") == "Dialog"; + + if(isDialog) { + return "(" + entryName + " - " + sourceSectionFirst + ") | 0x80000000"; + } else { + return entryName + " - " + sourceSectionFirst; + } +} + +void AssetAsmIncludes::write_ttghost_table_entry(std::stringstream &out, std::string entryWord, std::string ttGhostJsonPath) { + int levelId = get_index_from_build_id("ASSET_LEVEL_HEADERS", get_string_from_json(ttGhostJsonPath, "header", "level")); + std::string vehicle = get_string_from_json(ttGhostJsonPath, "header", "vehicle"); + int vehicleId = get_enum_value_from_string("Vehicle", vehicle); + write_two_words(out, to_hex((levelId << 24) | (vehicleId << 16)), entryWord); +} + +void AssetAsmIncludes::write_section(std::stringstream &out, std::string assetsDirectory, std::string buildDirectory, std::string sectionName) { + write_header_comment(out, sectionName); + write_global_label(out, sectionName, true); + + if(get_string_from_section(sectionName, "type") == "Table") { + std::string sourceSectionName = get_source_section_for_table(sectionName); + + if(sectionName == "ASSET_MENU_TEXT_TABLE") { + int numTextEntries = get_array_length_from_section(sourceSectionName, "menu-text-build-ids"); + write_word_with_comment(out, std::to_string(numTextEntries), "Number of text entries for the languages"); + } + + std::vector sectionFilenames = get_section_order(sourceSectionName); + + bool first = true; + for(std::string &entryName : sectionFilenames) { + if(first) { + if(sectionName == "ASSET_AUDIO_TABLE") { + // For some reason, the first entry in the audio table is skipped. + first = false; + continue; + } + first = false; + } + + std::string entryWord = entryName + " - " + sourceSectionName; + + if(sectionName == "ASSET_GAME_TEXT_TABLE") { + std::string filename = get_filename_from_section_entry(sourceSectionName, entryName); + std::string folder = get_string_from_section(sourceSectionName, "folder"); + std::string gameTextJsonPath = assetsDirectory + "/" + folder + "/" + filename; + entryWord = formatGameTextWordEntry(sourceSectionName, entryName, gameTextJsonPath); + } + + if(sectionName == "ASSET_TTGHOSTS_TABLE") { + std::string filename = get_filename_from_section_entry(sourceSectionName, entryName); + std::string folder = get_string_from_section(sourceSectionName, "folder"); + std::string ttGhostJsonPath = assetsDirectory + "/" + folder + "/" + filename; + write_ttghost_table_entry(out, entryWord, ttGhostJsonPath); + } else { + if(sectionName == "ASSET_MISC_TABLE") { + entryWord = "(" + entryWord + ") / 4"; + } + write_word(out, entryWord); + } + } + + if(sectionName == "ASSET_TTGHOSTS_TABLE") { + write_two_words(out, "0xFFFF0000", sourceSectionName + "_END - " + sourceSectionName); + write_two_words(out, "0xFFFF0000", "0xFFFFFFFF"); + } else { + if(sectionName == "ASSET_MISC_TABLE") { + write_word(out, "(" + sourceSectionName + "_END - " + sourceSectionName + ") / 4"); + } else { + write_word(out, sourceSectionName + "_END - " + sourceSectionName); + } + write_word(out, "0xFFFFFFFF"); + } + } else { + std::string folder = get_string_from_section(sectionName, "folder"); + if(section_has_key(sectionName, "files")) { + std::vector sectionFilenames = get_section_order(sectionName); + for(std::string &subSectionName : sectionFilenames) { + write_global_label(out, subSectionName); + std::string filename = get_filename_from_section_entry(sectionName, subSectionName); + write_binary_include(out, buildDirectory + "/" + folder + "/" + filename); + } + } else if(section_has_key(sectionName, "filename")) { + std::string filename = get_string_from_section(sectionName, "filename"); + write_binary_include(out, buildDirectory + "/" + folder + "/" + filename); + } + write_global_label(out, sectionName + "_END"); + } + + out << std::endl; +} + + + + + + + + + diff --git a/tools/dkr_assets_tool_classes/make_asset_files/asset_asm_data.h b/tools/dkr_assets_tool_classes/make_asset_files/asset_asm_data.h new file mode 100644 index 00000000..33c13b05 --- /dev/null +++ b/tools/dkr_assets_tool_classes/make_asset_files/asset_asm_data.h @@ -0,0 +1,28 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include + +#include "../common/util.h" + +class AssetAsmIncludes { +public: + AssetAsmIncludes(std::string assetsDirectory, std::string buildDirectory, std::string dstPath); + ~AssetAsmIncludes(); +private: + void write_comment(std::stringstream &out, std::string text); + void write_header_comment(std::stringstream &out, std::string text); + void write_word(std::stringstream &out, std::string value); + void write_two_words(std::stringstream &out, std::string value, std::string value2); + void write_word_with_comment(std::stringstream &out, std::string value, std::string comment); + void write_binary_include(std::stringstream &out, std::string path); + void write_global_label(std::stringstream &out, std::string label, bool align = false); + void write_main_table(std::stringstream &out, std::vector §ionNames); + void write_section(std::stringstream &out, std::string assetsDirectory, std::string buildDirectory, std::string sectionName); + void write_ttghost_table_entry(std::stringstream &out, std::string entryWord, std::string ttGhostJsonPath); +}; diff --git a/tools/dkr_assets_tool_classes/make_asset_files/asset_enums_header.cpp b/tools/dkr_assets_tool_classes/make_asset_files/asset_enums_header.cpp new file mode 100644 index 00000000..0c1b8f00 --- /dev/null +++ b/tools/dkr_assets_tool_classes/make_asset_files/asset_enums_header.cpp @@ -0,0 +1,75 @@ +#include "asset_enums_header.h" + +#define INDENT " " +#define FILENAME "asset_enums.h" +#define HEADER_GUARD "_ASSET_ENUMS_H" + +#define ASSETS_START_LABEL "ASSETS_START" +#define ASSETS_END_LABEL "ASSETS_END" + +AssetEnumsHeader::AssetEnumsHeader(std::string dstFolder) { + std::stringstream out; + write_comment(out, "This file is automatically generated. Any changes you make to this file will get overwritten."); + out << std::endl; + out << "#ifndef " << HEADER_GUARD << std::endl; + out << "#define " << HEADER_GUARD << std::endl; + out << std::endl; + write_header_comment(out, "Asset Sections"); + std::vector assetsOrder = get_assets_order(); + write_order_section(out, "ASSET_SECTIONS", assetsOrder); + for(std::string §ionName : assetsOrder) { + if(section_has_key(sectionName, "files")) { + write_header_comment(out, sectionName); + std::vector sectionOrder = get_section_order(sectionName); + write_order_section(out, sectionName, sectionOrder); + } + std::string sectionType = get_string_from_section(sectionName, "type"); + if(sectionType == "MenuText") { + std::vector menuTextBuildIds = get_array_from_section(sectionName, "menu-text-build-ids"); + write_order_section(out, sectionName + "_IDS", menuTextBuildIds); + } else if (sectionType == "Fonts") { + std::vector fonts = get_array_from_section(sectionName, "fonts-order"); + write_header_comment(out, sectionName); + write_order_section(out, sectionName, fonts); + } + } + out << "#endif " << std::endl; + write_text_file(out.str(), dstFolder + "/" + FILENAME); +} + +AssetEnumsHeader::~AssetEnumsHeader() { + +} + +void AssetEnumsHeader::write_comment(std::stringstream &out, std::string text) { + out << "// " << text << std::endl; +} + +void AssetEnumsHeader::write_header_comment(std::stringstream &out, std::string text) { + out << "/********** " << text << " **********/" << std::endl << std::endl; +} + +void AssetEnumsHeader::write_order_section(std::stringstream &out, std::string name, std::vector &order) { + out << "typedef enum {" << std::endl; + int numberOfEntries = order.size(); + for(int i = 0; i < numberOfEntries; i++) { + std::string enumEntryName = order[i]; + + if(enumEntryName.length() == 0) { + enumEntryName = name + "_NULL_" + std::to_string(i); + } + + out << INDENT << enumEntryName; + if(i < numberOfEntries - 1) { + out << ","; + } + out << std::endl; + } + out << "} " << upper_snake_case_to_pascal_case(name) << "Enum;" << std::endl << std::endl; +} + + + + + + diff --git a/tools/dkr_assets_tool_classes/make_asset_files/asset_enums_header.h b/tools/dkr_assets_tool_classes/make_asset_files/asset_enums_header.h new file mode 100644 index 00000000..1c7af6c8 --- /dev/null +++ b/tools/dkr_assets_tool_classes/make_asset_files/asset_enums_header.h @@ -0,0 +1,21 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include + +#include "../common/util.h" + +class AssetEnumsHeader { +public: + AssetEnumsHeader(std::string dstPath); + ~AssetEnumsHeader(); +private: + void write_comment(std::stringstream &out, std::string text); + void write_header_comment(std::stringstream &out, std::string text); + void write_order_section(std::stringstream &out, std::string name, std::vector &order); +}; diff --git a/tools/dkr_cheats_encryptor.cpp b/tools/dkr_cheats_encryptor.cpp deleted file mode 100755 index 71b04caf..00000000 --- a/tools/dkr_cheats_encryptor.cpp +++ /dev/null @@ -1,155 +0,0 @@ -#include -#include -#include -#include -#include -#include - -void show_help() { - std::cout << "Usage: ./dkr_encryptor " << std::endl; -} - -void encrypt_data(std::vector& data) { - int numWords = data.size() / 4; - int a, b, c, d, sp0, sp1, sp2, sp3; - for(int i = 0; i < numWords; i++) { - a = (data[(i * 4) + 3] & 0xC0) >> 6; - b = (data[(i * 4) + 0] & 0xC0); - c = (data[(i * 4) + 1] & 0xC0) >> 2; - d = (data[(i * 4) + 2] & 0xC0) >> 4; - sp0 = a | b | c | d; - a = (data[(i * 4) + 3] & 0x30) >> 4; - b = (data[(i * 4) + 0] & 0x30) << 2; - c = (data[(i * 4) + 1] & 0x30); - d = (data[(i * 4) + 2] & 0x30) >> 2; - sp1 = a | b | c | d; - a = (data[(i * 4) + 3] & 0x0C) >> 2; - b = (data[(i * 4) + 0] & 0x0C) << 4; - c = (data[(i * 4) + 1] & 0x0C) << 2; - d = (data[(i * 4) + 2] & 0x0C); - sp2 = a | b | c | d; - a = (data[(i * 4) + 3] & 0x03); - b = (data[(i * 4) + 0] ) << 6; - c = (data[(i * 4) + 1] & 0x03) << 4; - d = (data[(i * 4) + 2] & 0x03) << 2; - sp3 = a | b | c | d; - a = (sp0 & 0xAA) >> 1; - b = (sp0 & 0x55) << 1; - data[(i * 4) + 0] = a | b; - a = (sp1 & 0xAA) >> 1; - b = (sp1 & 0x55) << 1; - data[(i * 4) + 1] = a | b; - a = (sp2 & 0xAA) >> 1; - b = (sp2 & 0x55) << 1; - data[(i * 4) + 2] = a | b; - a = (sp3 & 0xAA) >> 1; - b = (sp3 & 0x55) << 1; - data[(i * 4) + 3] = a | b; - } -} - -std::string read_text_file(std::string& filename) { - std::ifstream t(filename); - t.seekg(0, std::ios::end); - size_t size = t.tellg(); - std::string buffer(size, ' '); - t.seekg(0); - t.read(&buffer[0], size); - return buffer; -} - -void write_binary_file(std::vector& data, std::string& filename) { - std::ofstream wf(filename.c_str(), std::ios::out | std::ios::binary); - for(int i = 0; i < data.size(); i++) - wf.write((char *)&data[i], 1); - wf.close(); -} - -std::string trim(std::string input) { - size_t b = input.find_first_not_of(' '); - if (b == std::string::npos) b = 0; - return input.substr(b, input.find_last_not_of(' ') + 1 - b); -} - -std::vector split_string(std::string s, char delim) { - std::stringstream ss(s); - std::string item; - std::vector elems; - while (std::getline(ss, item, delim)) { - if(item.length() > 0) { - elems.push_back(trim(item)); - } - } - return elems; -} - -#define push_back_u16(data, offset, value) \ - data.push_back((value >> 8) & 0xFF); \ - data.push_back(value & 0xFF) - -int main(int argc, char* argv[]) { - - if(argc != 3) { - show_help(); - return 1; - } - - std::string inputFile = argv[1]; - std::string outputFile = argv[2]; - - std::vector lines = split_string(read_text_file(inputFile), '\n'); - - int numCheats = lines.size(); - - std::vector data; - - push_back_u16(data, 0, numCheats); - - std::regex regex_cheat("^[\"]([^\"]+)[\"]\\s*[,]\\s*[\"]([^\"]+)[\"]$"); - std::smatch match; - - // Create look-up table - uint16_t offset = 2 + (numCheats * 4); - for(auto& line : lines) { - if (std::regex_search(line, match, regex_cheat)) { - push_back_u16(data, 0, offset); - offset += match[1].length() + 1; // +1 for the null terminator - push_back_u16(data, 0, offset); - offset += match[2].length() + 1; - } else { - std::cout << "Invalid line: " << line << std::endl; - throw 1; - } - } - - // Now insert the strings - for(auto& line : lines) { - if (std::regex_search(line, match, regex_cheat)) { - std::string codeWord = match[1]; - std::string codeDescription = match[2]; - for(int ch = 0; ch < codeWord.length(); ch++) { - data.push_back(codeWord[ch]); - } - data.push_back(0); - for(int ch = 0; ch < codeDescription.length(); ch++) { - data.push_back(codeDescription[ch]); - } - data.push_back(0); - } else { - std::cout << "Invalid line: " << line << std::endl; - throw 1; - } - } - - // Make sure the data is 16-byte aligned. - while(data.size() % 16 != 0) { - data.push_back(0); - } - - encrypt_data(data); - write_binary_file(data, outputFile); - - return 0; -} - - diff --git a/tools/dkr_decompressor.cpp b/tools/dkr_decompressor.cpp deleted file mode 100755 index 7f720b9c..00000000 --- a/tools/dkr_decompressor.cpp +++ /dev/null @@ -1,72 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include "dkr_decompressor_src/DKRCompression.h" - -void printHelp() -{ - std::cout - << "---- Usage ----" << std::endl - << " Compress file: ./dkr_decompressor -c " << std::endl - << " Decompress file: ./dkr_decompressor -d " << std::endl; -} - -int main(int argc, char *argv[]) -{ - if(argc == 1) - { - printHelp(); - return 1; - } - - - std::string option = std::string(argv[1]); - - bool fileOptionCheck = ((option == "-d" || option == "-c") && argc != 4); - bool invalidOptionCheck = (option != "-d" && option != "-c"); - - if(fileOptionCheck || invalidOptionCheck) - { - printHelp(); - return 1; - } - - - DKRCompression compression; - - std::string inputFilename = std::string(argv[2]); - std::string outputFilename = std::string(argv[3]); - std::vector inputBinary, outputBinary; - - if(compression.readBinaryFile(inputBinary, inputFilename)) - { - if(inputBinary.size() == 0) { - compression.writeBinaryFile(inputBinary, outputFilename); - } else { - if (option == "-c") - { - outputBinary = compression.compressBuffer(inputBinary); - } - else if (option == "-d") - { - outputBinary = compression.decompressBuffer(inputBinary); - } - compression.writeBinaryFile(outputBinary, outputFilename); - } - } - else - { - std::cout << "Could not read file: " << inputFilename << std::endl; - return 1; - } - - return 0; -} - - - - diff --git a/tools/dkr_extractor.cpp b/tools/dkr_extractor.cpp deleted file mode 100755 index d9ea1618..00000000 --- a/tools/dkr_extractor.cpp +++ /dev/null @@ -1,129 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include "dkr_extractor_classes/config.h" -#include "dkr_extractor_classes/rom.h" -#include "dkr_decompressor_src/DKRCompression.h" -#include "n64graphics/n64graphics.h" - -// C++17 -#include -namespace fs = std::experimental::filesystem; - -#define REVISION_NUMBER 1 - -const std::string CONFIG_EXTENSION = ".config.json"; - -const std::string ROM_EXTENSIONS[] = { ".z64", ".v64", ".n64", ".rom" }; - -std::string outDirectory; -std::string currentCategory; - -/*********************************************/ - -void show_help() { - std::cout << "Usage: ./dkr_extractor " << std::endl; -} - -bool ends_with_extension(std::string filename, std::string extension) { - return std::equal(extension.rbegin(), extension.rend(), filename.rbegin()); -} - -bool ends_with_config_extension(std::string filename) { - return ends_with_extension(filename, CONFIG_EXTENSION); -} - -bool ends_with_rom_extension(std::string filename) { - for (const std::string romExtension : ROM_EXTENSIONS) { - if(ends_with_extension(filename, romExtension)) { - return true; - } - } - return false; -} - -/*********************************************/ - -void add_to_JSON(json::JSON& assetsJson, std::string filename) { - if(currentCategory != "none") { - json::JSON obj = json::Object(); - obj["filename"] = filename; - obj["category"] = currentCategory; - assetsJson["assets"].append(obj); - } -} - -void write_json(json::JSON& assetsJson) { - std::string filename = outDirectory + "/assets/" + assetsJson["@version"].ToString() + "/assets.json"; - std::ofstream myfile; - myfile.open(filename); - myfile << assetsJson; - myfile.close(); -} - -void extract_assets_from_rom(ExtractConfig& config, ROM& rom) { - json::JSON assetsJson; - - assetsJson["@version"] = config.get_subfolder(); - assetsJson["@revision"] = REVISION_NUMBER; - - config.extract(rom, assetsJson); - - write_json(assetsJson); -} - -/*********************************************/ - -int main(int argc, char* argv[]) { - - if(argc != 5) { - show_help(); - return 1; - } - - std::string version = argv[1]; - std::string configsDirectory = argv[2]; - std::string baseromsDirectory = argv[3]; - outDirectory = argv[4]; - - std::vector configs; - std::vector roms; - - for (const auto & entry : fs::directory_iterator(configsDirectory)){ - std::string filename = entry.path().filename(); - if(ends_with_config_extension(filename)) { - configs.push_back(ExtractConfig(configsDirectory, filename, outDirectory)); - } - } - - for (const auto & entry : fs::directory_iterator(baseromsDirectory)){ - std::string filename = entry.path().string(); - if(ends_with_rom_extension(filename)) { - roms.push_back(ROM(filename)); - } - } - - bool completedAnExtraction = false; - - for(auto& config : configs) { - if(config.is_supported() && config.get_subfolder() == version) { - for(auto& rom : roms) { - if(rom.get_md5() == config.get_md5()) { - extract_assets_from_rom(config, rom); - completedAnExtraction = true; - break; - } - } - } - } - - if(!completedAnExtraction) { - std::cout << "No compatible ROMs were found within the /baseroms/ directory" << std::endl; - return 1; - } - - return 0; -} diff --git a/tools/dkr_extractor_classes/config.cpp b/tools/dkr_extractor_classes/config.cpp deleted file mode 100644 index c2211bd7..00000000 --- a/tools/dkr_extractor_classes/config.cpp +++ /dev/null @@ -1,308 +0,0 @@ -#include "config.h" - -ExtractConfig::ExtractConfig(std::string configsDirectory, std::string filename, std::string outDirectory){ - std::cout << "Reading config \"" << filename << "\"" << std::endl; - configJSON = json::JSON::Load(read_file(configsDirectory + '/' + filename)); - - this->outDirectory = outDirectory + "/assets/" + configJSON["subfolder"].ToString(); - - this->name = configJSON["config-name"].ToString(); - this->subfolder = configJSON["subfolder"].ToString(); - this->md5 = configJSON["checksum-md5"].ToString(); - this->notSupported = configJSON["not-supported"].ToString() == "true"; -} - -ExtractConfig::~ExtractConfig(){ -} - -bool is_binary_type(std::string type) { - return type == "Binary" || type == "GameText" || type == "MenuText" || type == "Sprites" || type == "Miscellaneous" - || type == "LevelHeaders" || type == "LevelNames" || type == "ObjectHeaders" - || type == "Audio" || type == "Particles" || type == "ParticleBehaviors" || type == "TTGhosts"; -} - -bool is_compressed_type(std::string type) { - return type == "Compressed" || type == "LevelObjectMap" || type == "LevelModels" - || type == "ObjectModels" || type == "ObjectAnimations"; -} - -std::string get_extension_from_type(std::string type) { - if(is_compressed_type(type)) { - return ".cbin"; - } else if(type == "Textures") { - return ".png"; - } else { - return ".bin"; - } -} - -void ExtractConfig::extract_file(ROM& rom, std::string type, std::string folder, std::string filename, std::vector data) { - -} - -uint32_t get_uint_from_table(std::vector& table, int index) { - return (table[index * 4] << 24) | (table[index * 4 + 1] << 16) | (table[index * 4 + 2] << 8) | table[index * 4 + 3]; -} - -std::vector> get_section_files(std::vector& section, std::vector& table, std::string tableType, json::JSON& outputAsset) { - std::vector> out; - - int currentTableIndex = 0; - int scale = 1; // Each table entry is 4-bytes long. - int offset = 0; - - if(tableType == "MenuText") { - outputAsset["text-entry-count"] = get_uint_from_table(table, currentTableIndex); - currentTableIndex = 1; // The first entry is the number of text entries for each language. - } else if(tableType == "TTGhosts") { - scale = 2; // Each table entry is 8-bytes long. - offset = 1; // offset by 4 bytes. - outputAsset["meta"] = json::Array(); - } else if (tableType == "GameText") { - outputAsset["textTypes"] = json::Array(); - } - - uint32_t currentTableValue = get_uint_from_table(table, currentTableIndex * scale + offset); - uint32_t nextTableValue = get_uint_from_table(table, (currentTableIndex + 1) * scale + offset); - - if (tableType == "Audio") { - // The audio table doesn't start at offset 0, so this check will extract - // the first actual part of the audio section. - std::vector file(section.begin(), section.begin() + currentTableValue); - out.push_back(file); - } - - while(nextTableValue != 0xFFFFFFFF) { - - if(tableType == "GameText") { - bool isDialog = (currentTableValue & 0x80000000) == 0x80000000; - outputAsset["textTypes"].append(isDialog ? 1 : 0); - currentTableValue &= 0x7FFFFFFF; - nextTableValue &= 0x7FFFFFFF; - } else if(tableType == "Miscellaneous") { - currentTableValue *= 4; - nextTableValue *= 4; - } else if (tableType == "TTGhosts") { - json::JSON metaObj = json::Object(); - metaObj["levelID"] = table[currentTableIndex * 8 + 0]; - metaObj["vehicleID"] = table[currentTableIndex * 8 + 1]; - outputAsset["meta"].append(metaObj); - } - - int length = nextTableValue - currentTableValue; - if(length < 0) { - std::cout << "Error: Invalid table length: " << length << std::endl; - std::cout << std::hex << "currentTableValue: " << currentTableValue << std::dec << std::endl; - std::cout << std::hex << "nextTableValue: " << nextTableValue << std::dec << std::endl; - throw 1; - } - - std::vector file(section.begin() + currentTableValue, section.begin() + nextTableValue); - out.push_back(file); - - currentTableIndex++; - currentTableValue = get_uint_from_table(table, currentTableIndex * scale + offset); - nextTableValue = get_uint_from_table(table, (currentTableIndex + 1) * scale + offset); - } - - return out; -} - -void ExtractConfig::extract(ROM& rom, json::JSON& assetsJson) { - currentROMOffset = 0; - - /* Extract the code sections */ - json::JSON codeSections = configJSON["code"]["sections"]; - int numCodeSections = codeSections.length(); - for(int i = 0; i < numCodeSections; i++) { - json::JSON section = codeSections[i]; - json::JSON files = section["files"]; - std::string folder = this->outDirectory + "/" + section["folder"].ToString(); - if(!fs::is_directory(folder)) { - fs::create_directories(folder); - } - - std::string type = section["type"].ToString(); - - int numFiles = files.length(); - for(int j = 0; j < numFiles; j++) { - json::JSON file = files[j]; - int length = std::stoul(file["length"].ToString(), nullptr, 16); - extractions.push_back(ExtractInfo(type, folder, file["filename"].ToString(), - rom.get_bytes_from_range(currentROMOffset, length))); - currentROMOffset += length; - } - } - - /* Make sure the assets section has the correct number of entries. */ - json::JSON assetSections = configJSON["assets"]["sections"]; - int numAssetSections = assetSections.length(); - int numAssetSectionsFromTable = rom.get_uint(currentROMOffset); - - if(numAssetSections != numAssetSectionsFromTable) { - std::cout << "Error: Number of asset sections in config does not match ROM." << std::endl; - std::cout << "Number of asset sections in Config: " << numAssetSections << std::endl; - std::cout << "Number of asset sections in ROM: " << numAssetSectionsFromTable << std::endl; - throw 1; - } - - currentROMOffset += 4; - int tableOffset = currentROMOffset; - currentROMOffset += (numAssetSections + 1) * 4; - int assetsStart = currentROMOffset; - - std::vector> sectionsData; - - /* Read the main assets look-up table for section lengths */ - for(int i = 0; i < numAssetSections; i++) { - int assetSectionLength = rom.get_uint(tableOffset + ((i + 1) * 4)) - rom.get_uint(tableOffset + (i * 4)); - sectionsData.push_back(rom.get_bytes_from_range(currentROMOffset, assetSectionLength)); - currentROMOffset += assetSectionLength; - } - - currentROMOffset = assetsStart; - - assetsJson["assets"] = json::Array(); - - /* Extract the assets sections */ - for(int i = 0; i < numAssetSections; i++) { - json::JSON section = assetSections[i]; - std::string folder = this->outDirectory + "/" + section["folder"].ToString(); - std::string type = section["type"].ToString(); - - if(!fs::is_directory(folder)) { - fs::create_directories(folder); - } - - json::JSON outputAsset = json::Object(); - outputAsset["type"] = type; - - if(section.hasKey("name")) { - outputAsset["name"] = section["name"].ToString(); - } - - if(type == "Table") { - assetsJson["assets"].append(outputAsset); - continue; - } else if(type == "Textures") { - outputAsset["flip-textures"] = section["flip-textures"]; - } - - outputAsset["folder"] = section["folder"].ToString(); - outputAsset["filenames"] = json::Array(); - - if(section.hasKey("table")) { - int tableIndex = section["table"].ToInt(); - std::vector> sectionFiles - = get_section_files(sectionsData[i], sectionsData[tableIndex], type, outputAsset); - int numberOfSectionFiles = sectionFiles.size(); - - outputAsset["table"] = tableIndex; - - for(int j = 0; j < numberOfSectionFiles; j++) { - std::string filename = ""; - if(section.hasKey("filenames")) { - filename = section["filenames"][j].ToString(); - } - if(filename == "") { - std::stringstream filenameStream; - filenameStream << "unknown_" << i << "_" << j; - filename = filenameStream.str(); - } - outputAsset["filenames"].append(filename + get_extension_from_type(type)); - extractions.push_back(ExtractInfo(type, folder, filename, sectionFiles[j])); - } - } else { - // No lookup table associated, so the section is assumed to be 1 file. - std::string filename = ""; - if(section.hasKey("filenames")) { - filename = section["filenames"][0].ToString(); - } - if(filename == "") { - std::stringstream filenameStream; - filenameStream << "unknown_" << i; - filename = filenameStream.str(); - } - outputAsset["filenames"].append(filename + get_extension_from_type(type)); - extractions.push_back(ExtractInfo(type, folder, filename, sectionsData[i])); - } - currentROMOffset += sectionsData[i].size(); - assetsJson["assets"].append(outputAsset); - } - - ThreadPool pool(std::thread::hardware_concurrency()); - - for(int i = 0; i < extractions.size(); i++) { - std::string type = extractions[i].type; - std::string folder = extractions[i].folder; - std::string filename = extractions[i].filename; - std::vector data = extractions[i].data; - pool.enqueue([&rom, type, folder, filename, data] { - std::string outFilepath = folder + "/" + filename; - - if(is_binary_type(type)) { - ExtractBinary(data, rom, outFilepath + ".bin"); - } else if(is_compressed_type(type)) { - ExtractCompressed(data, rom, outFilepath + ".cbin"); - } else if(type == "Textures") { - ExtractTextures(data, rom, outFilepath + ".png"); - } else if(type == "Empty") { - } else if(type != "NoExtract") { - std::cout << "Unknown extraction type: " << type << std::endl; - throw 1; - } - }); - } - -} - -bool ExtractConfig::is_supported(){ - return !notSupported; -} - -std::string ExtractConfig::get_name(){ - return name; -} - -std::string ExtractConfig::get_md5(){ - return md5; -} - -std::string ExtractConfig::get_subfolder(){ - return subfolder; -} - -std::string ExtractConfig::read_file(std::string filename) { - std::ifstream t(filename); - t.seekg(0, std::ios::end); - size_t size = t.tellg(); - std::string buffer(size, ' '); - t.seekg(0); - t.read(&buffer[0], size); - return buffer; -} - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/dkr_extractor_classes/config.h b/tools/dkr_extractor_classes/config.h deleted file mode 100644 index c30df4e5..00000000 --- a/tools/dkr_extractor_classes/config.h +++ /dev/null @@ -1,60 +0,0 @@ -#pragma once - -#include -#include -#include -#include -#include -#include -#include - -// C++17 -#include -namespace fs = std::experimental::filesystem; - -#include "../json/json.hpp" - -#include "rom.h" -#include "extract_binary.h" -#include "extract_compressed.h" -#include "extract_textures.h" -#include "ThreadPool.h" - -struct ExtractInfo { - std::string type; - std::string folder; - std::string filename; - std::vector data; - ExtractInfo(std::string type, std::string folder, std::string filename, std::vector data) - : type(type), folder(folder), filename(filename), data(data) {} -}; - -class ExtractConfig { -public: - ExtractConfig(std::string configsDirectory, std::string filename, std::string outDirectory); - ~ExtractConfig(); - - void extract(ROM& rom, json::JSON& assetsJson); - void extract_file(ROM& rom, std::string type, std::string folder, std::string filename, std::vector data); - - bool is_supported(); - std::string get_name(); - std::string get_md5(); - std::string get_subfolder(); - - -private: - json::JSON configJSON; // Loaded from a config file. - - int currentROMOffset; - - bool notSupported; - std::string outDirectory; - std::string name; - std::string md5; - std::string subfolder; - - std::vector extractions; - - std::string read_file(std::string filename); -}; diff --git a/tools/dkr_extractor_classes/extract.cpp b/tools/dkr_extractor_classes/extract.cpp deleted file mode 100644 index 7b647214..00000000 --- a/tools/dkr_extractor_classes/extract.cpp +++ /dev/null @@ -1,33 +0,0 @@ -#include "extract.h" - -Extract::Extract(std::vector data, ROM& rom, std::string outFilepath){ -} - -Extract::~Extract(){ -} - -void Extract::write_binary_file(std::vector data, std::string filepath){ - std::ofstream wf(filepath.c_str(), std::ios::out | std::ios::binary); - for(int i = 0; i < data.size(); i++) - wf.write((char *)&data[i], 1); - wf.close(); -} - -void Extract::write_text_file(std::string text, std::string filepath){ - std::ofstream myfile; - myfile.open(filepath); - myfile << text; - myfile.close(); -} - -void Extract::print_extracted(std::string outFilepath) { - std::stringstream out; - out << "Extracted " << outFilepath << std::endl; - std::cout << out.str(); -} - -void Extract::to_lowercase(std::string& input) { - for(char& character : input) { - character = std::tolower(character); - } -} diff --git a/tools/dkr_extractor_classes/extract.h b/tools/dkr_extractor_classes/extract.h deleted file mode 100644 index 021728e9..00000000 --- a/tools/dkr_extractor_classes/extract.h +++ /dev/null @@ -1,29 +0,0 @@ -#pragma once - -#include -#include -#include -#include -#include -#include - -#include "rom.h" - -#include "../json/json.hpp" - -// C++17 -#include -namespace fs = std::experimental::filesystem; - -class Extract { -public: - Extract(std::vector data, ROM& rom, std::string outFilepath); - ~Extract(); - - void write_binary_file(std::vector data, std::string filepath); - void write_text_file(std::string data, std::string filepath); - void print_extracted(std::string outFilepath); - -protected: - void to_lowercase(std::string& input); -}; diff --git a/tools/dkr_extractor_classes/extract_binary.cpp b/tools/dkr_extractor_classes/extract_binary.cpp deleted file mode 100644 index 3e3a2fa1..00000000 --- a/tools/dkr_extractor_classes/extract_binary.cpp +++ /dev/null @@ -1,10 +0,0 @@ -#include "extract_binary.h" - -ExtractBinary::ExtractBinary(std::vector data, ROM& rom, std::string outFilepath) -: Extract(data, rom, outFilepath) { - write_binary_file(data, outFilepath); - print_extracted(outFilepath); -} - -ExtractBinary::~ExtractBinary(){ -} diff --git a/tools/dkr_extractor_classes/extract_compressed.cpp b/tools/dkr_extractor_classes/extract_compressed.cpp deleted file mode 100644 index d405af40..00000000 --- a/tools/dkr_extractor_classes/extract_compressed.cpp +++ /dev/null @@ -1,29 +0,0 @@ -#include "extract_compressed.h" - -ExtractCompressed::ExtractCompressed(std::vector data, ROM& rom, std::string outFilepath) -: Extract(data, rom, outFilepath) { - - if(data.size() == 0) { - std::cout << "Warning: \"" << outFilepath << "\" is empty." << std::endl; - write_binary_file(data, outFilepath); - print_extracted(outFilepath); - return; - } - - // Needed padding to prevent errors with decompressing. - if(data[data.size() - 1] != 0) { - data.push_back(0); - data.push_back(0); - data.push_back(0); - data.push_back(0); - } - - DKRCompression compression; - data = compression.decompressBuffer(data); - - write_binary_file(data, outFilepath); - print_extracted(outFilepath); -} - -ExtractCompressed::~ExtractCompressed(){ -} diff --git a/tools/dkr_extractor_classes/extract_compressed.h b/tools/dkr_extractor_classes/extract_compressed.h deleted file mode 100644 index 54a8818d..00000000 --- a/tools/dkr_extractor_classes/extract_compressed.h +++ /dev/null @@ -1,10 +0,0 @@ -#pragma once - -#include "extract.h" -#include "../dkr_decompressor_src/DKRCompression.h" - -class ExtractCompressed : Extract { -public: - ExtractCompressed(std::vector data, ROM& rom, std::string outFilepath); - ~ExtractCompressed(); -}; diff --git a/tools/dkr_extractor_classes/extract_textures.cpp b/tools/dkr_extractor_classes/extract_textures.cpp deleted file mode 100644 index 9b63ba6c..00000000 --- a/tools/dkr_extractor_classes/extract_textures.cpp +++ /dev/null @@ -1,198 +0,0 @@ -#include "extract_textures.h" - -ExtractTextures::ExtractTextures(std::vector data, ROM& rom, std::string outFilepath) -: Extract(data, rom, outFilepath) { - std::vector header(data.begin(), data.begin() + TEX_HEADER_SIZE); - std::vector texData; - - bool isCompressed = (header[0x1D] == 0x01); - - if(isCompressed) { - std::vector compressedData(data.begin() + TEX_HEADER_SIZE, data.end()); - // Needed padding to prevent errors with decompressing. - if(compressedData[compressedData.size() - 1] != 0) { - compressedData.push_back(0); - compressedData.push_back(0); - compressedData.push_back(0); - compressedData.push_back(0); - } - DKRCompression compression; - texData = compression.decompressBuffer(compressedData); - } else { - texData = data; - } - - int numTextures = header[0x12]; - int dataOffset = 0; - - std::vector combinedTexturesData; - - int totalHeight = 0; - for(int i = 0; i < numTextures; i++){ - int width = texData[dataOffset + 0x00]; - int height = texData[dataOffset + 0x01]; - int textureFormat = texData[dataOffset + 0x02] & 0xF; - int textureSize = get_texture_size(width, height, textureFormat); - - std::vector texHeader(texData.begin() + dataOffset, texData.begin() + dataOffset + TEX_HEADER_SIZE); - std::vector texData2(texData.begin() + dataOffset + TEX_HEADER_SIZE, texData.begin() + dataOffset + textureSize); - - process_texture(texHeader, texData2); - combinedTexturesData.insert(combinedTexturesData.end(), texData2.begin(), texData2.end()); - - dataOffset += textureSize; - totalHeight += texHeader[1]; - } - - int width = header[0]; - int height = totalHeight; - int textureFormat = header[0x02] & 0xF; - - switch(textureFormat) { - case TEX_FORMAT_RGBA32: - { - rgba2png(outFilepath.c_str(), (const rgba*)&combinedTexturesData[0], width, height); - break; - } - case TEX_FORMAT_RGBA16: - { - rgba* outTex = raw2rgba(&combinedTexturesData[0], width, height, 16); - rgba2png(outFilepath.c_str(), outTex, width, height); - break; - } - case TEX_FORMAT_I8: - { - ia* outTex = raw2i(&combinedTexturesData[0], width, height, 8); - ia2png(outFilepath.c_str(), outTex, width, height); - break; - } - case TEX_FORMAT_I4: - { - ia* outTex = raw2i(&combinedTexturesData[0], width, height, 4); - ia2png(outFilepath.c_str(), outTex, width, height); - break; - } - case TEX_FORMAT_IA16: - { - ia* outTex = raw2ia(&combinedTexturesData[0], width, height, 16); - ia2png(outFilepath.c_str(), outTex, width, height); - break; - } - case TEX_FORMAT_IA8: - { - ia* outTex = raw2ia(&combinedTexturesData[0], width, height, 8); - ia2png(outFilepath.c_str(), outTex, width, height); - break; - } - case TEX_FORMAT_IA4: - { - ia* outTex = raw2ia(&combinedTexturesData[0], width, height, 4); - ia2png(outFilepath.c_str(), outTex, width, height); - break; - } - case TEX_FORMAT_CI4: - { - std::cout << "Error: CI4 texture format is not currently supported." << std::endl; - throw 1; - } - default: // Invalid texture format - { - std::cout << "Error: Unknown texture format " << textureFormat << std::endl; - throw 1; - } - } - - write_binary_file(header, outFilepath + ".header"); - - print_extracted(outFilepath); -} - -ExtractTextures::~ExtractTextures(){ -} - -void ExtractTextures::deinterlace(std::vector& data, int width, int height, int bitDepth, int bufferSize) { - uint8_t* temp = new uint8_t[bufferSize]; - - int numPixels; - if(bitDepth == 4) { - numPixels = ((width * height) / 2); - } else { - numPixels = (width * height * (bitDepth / 8)); - } - - int stride = bufferSize * 2; - - int size = numPixels / stride; - - for(int i = 0; i < size; i++) { - int row; - if(bitDepth == 4) { - row = (i * stride) / width * 2; - } else { - row = (i * stride) / width / (bitDepth / 8); - } - if(row % 2 == 0) continue; - for(int j = 0; j < bufferSize; j++) { - temp[j] = data[i * stride + j]; - data[i * stride + j] = data[i * stride + j + bufferSize]; - data[i * stride + j + bufferSize] = temp[j]; - } - } - - delete[] temp; -} - -void ExtractTextures::process_texture(std::vector& header, std::vector& data) { - int width = header[0]; - int height = header[1]; - int textureFormat = header[0x02] & 0xF; - bool isInterlaced = ((header[0x06] & 0x04) == 0x04); - - switch(textureFormat) { - case TEX_FORMAT_RGBA32: - { - if(isInterlaced) deinterlace(data, width, height, 32, 8); - break; - } - case TEX_FORMAT_RGBA16: - case TEX_FORMAT_IA16: - { - if(isInterlaced) deinterlace(data, width, height, 16, 4); - break; - } - case TEX_FORMAT_I8: - case TEX_FORMAT_IA8: - { - if(isInterlaced) deinterlace(data, width, height, 8, 4); - break; - } - case TEX_FORMAT_I4: - case TEX_FORMAT_IA4: - { - if(isInterlaced) deinterlace(data, width, height, 4, 4); - break; - } - } -} - -int ExtractTextures::get_texture_size(int width, int height, int textureFormat) { - switch(textureFormat) { - case TEX_FORMAT_RGBA32: - return (width * height * 4) + TEX_HEADER_SIZE; - case TEX_FORMAT_RGBA16: - case TEX_FORMAT_IA16: - return (width * height * 2) + TEX_HEADER_SIZE; - case TEX_FORMAT_I8: - case TEX_FORMAT_IA8: - return (width * height) + TEX_HEADER_SIZE; - case TEX_FORMAT_I4: - case TEX_FORMAT_IA4: - return (width * height / 2) + TEX_HEADER_SIZE; - case TEX_FORMAT_CI4: - std::cout << "Error: CI4 texture format is not currently supported." << std::endl; - throw 1; - } - - std::cout << "Error: Invalid texture format " << textureFormat << std::endl; - throw 1; -} diff --git a/tools/dkr_extractor_classes/extract_textures.h b/tools/dkr_extractor_classes/extract_textures.h deleted file mode 100644 index 4cd3b6a1..00000000 --- a/tools/dkr_extractor_classes/extract_textures.h +++ /dev/null @@ -1,28 +0,0 @@ -#pragma once - -#include "extract.h" -#include "../dkr_decompressor_src/DKRCompression.h" -#include "../n64graphics/n64graphics.h" - -#define TEX_FORMAT_RGBA32 0 -#define TEX_FORMAT_RGBA16 1 -#define TEX_FORMAT_I8 2 -#define TEX_FORMAT_I4 3 -#define TEX_FORMAT_IA16 4 -#define TEX_FORMAT_IA8 5 -#define TEX_FORMAT_IA4 6 -#define TEX_FORMAT_CI4 7 - -#define TEX_HEADER_SIZE 0x20 - -class ExtractTextures : Extract { -public: - ExtractTextures(std::vector data, ROM& rom, std::string outFilepath); - ~ExtractTextures(); - -private: - void deinterlace(std::vector& data, int width, int height, int bitDepth, int bufferSize); - void process_texture(std::vector& header, std::vector& data); - int get_texture_size(int width, int height, int textureFormat); - -}; diff --git a/tools/dkr_texbuilder.cpp b/tools/dkr_texbuilder.cpp deleted file mode 100755 index e6c930bb..00000000 --- a/tools/dkr_texbuilder.cpp +++ /dev/null @@ -1,363 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include "dkr_decompressor_src/DKRCompression.h" -#include "n64graphics/n64graphics.h" - -#define TEX_FORMAT_RGBA32 0 -#define TEX_FORMAT_RGBA16 1 -#define TEX_FORMAT_I8 2 -#define TEX_FORMAT_I4 3 -#define TEX_FORMAT_IA16 4 -#define TEX_FORMAT_IA8 5 -#define TEX_FORMAT_IA4 6 -#define TEX_FORMAT_CI4 7 - -#define TEX_HEADER_SIZE 0x20 - -const std::string PNG_EXTENSION = ".png"; - -/*********************************************/ - -void show_help() { - std::cout << "Usage: ./dkr_texbuilder " << std::endl; -} - -bool starts_with(std::string filename, std::string pattern) { - return std::equal(pattern.begin(), pattern.end(), filename.begin()); -} - -void write_binary_file(std::vector& data, std::string& filename) { - std::ofstream wf(filename.c_str(), std::ios::out | std::ios::binary); - for(int i = 0; i < data.size(); i++) - wf.write((char *)&data[i], 1); - wf.close(); -} - -void to_lowercase(std::string& input) { - for(char& character : input) { - character = std::tolower(character); - } -} - -std::vector split(const std::string &s, char delim) { - std::stringstream ss(s); - std::string item; - std::vector elems; - while (std::getline(ss, item, delim)) { - elems.push_back(std::move(item)); - } - return elems; -} - -std::vector read_binary(std::string filename) { - std::vector bytes; - std::ifstream is; - is.open(filename.c_str(), std::ios::binary); - is.seekg(0, std::ios::end); - size_t filesize = is.tellg(); - is.seekg(0, std::ios::beg); - bytes.resize(filesize); - is.read((char *)bytes.data(), filesize); - is.close(); - return bytes; -} - -/*********************************************/ - - -void deinterlace(std::vector& data, int width, int height, int bitDepth, int bufferSize) { - uint8_t* temp = new uint8_t[bufferSize]; - - int numPixels; - if(bitDepth == 4) { - numPixels = ((width * height) / 2); - } else { - numPixels = (width * height * (bitDepth / 8)); - } - - int stride = bufferSize * 2; - - int size = numPixels / stride; - - for(int i = 0; i < size; i++) { - int row; - if(bitDepth == 4) { - row = (i * stride) / width * 2; - } else { - row = (i * stride) / width / (bitDepth / 8); - } - if(row % 2 == 0) continue; - for(int j = 0; j < bufferSize; j++) { - temp[j] = data[i * stride + j]; - data[i * stride + j] = data[i * stride + j + bufferSize]; - data[i * stride + j + bufferSize] = temp[j]; - } - } - - delete[] temp; -} - -std::vector load_texture_from_png(std::string filepath, int textureFormat, int* width, int* height) { - switch(textureFormat) { - case TEX_FORMAT_RGBA32: - case TEX_FORMAT_RGBA16: - { - uint8_t* data = (uint8_t*)png2rgba(filepath.c_str(), width, height); - std::vector vec(data, data + ((*width) * (*height) * 4)); - free(data); - return vec; - } - case TEX_FORMAT_I8: - case TEX_FORMAT_I4: - case TEX_FORMAT_IA16: - case TEX_FORMAT_IA8: - case TEX_FORMAT_IA4: - { - uint8_t* data = (uint8_t*)png2ia(filepath.c_str(), width, height); - std::vector vec(data, data + ((*width) * (*height) * 2)); - free(data); - return vec; - } - case TEX_FORMAT_CI4: - std::cout << "Error: CI4 is currently not supported." << std::endl; - throw 1; - default: - std::cout << "Error: Invalid texture type: " << textureFormat << std::endl; - throw 1; - } -} - -#define ALIGN16(val) ((val) + 15) & 0xFFFFFFF0 - -int get_texture_size(int width, int height, int textureFormat) { - switch(textureFormat) { - case TEX_FORMAT_RGBA32: - return ALIGN16((width * height * 4) + TEX_HEADER_SIZE); - case TEX_FORMAT_RGBA16: - case TEX_FORMAT_IA16: - return ALIGN16((width * height * 2) + TEX_HEADER_SIZE); - case TEX_FORMAT_I8: - case TEX_FORMAT_IA8: - return ALIGN16((width * height) + TEX_HEADER_SIZE); - case TEX_FORMAT_I4: - case TEX_FORMAT_IA4: - return ALIGN16((width * height / 2) + TEX_HEADER_SIZE); - case TEX_FORMAT_CI4: - std::cout << "Error: CI4 texture format is not currently supported." << std::endl; - throw 1; - } - - std::cout << "Error: Invalid texture format " << textureFormat << std::endl; - throw 1; -} - -int get_bitdepth_from_format(int textureFormat){ - switch(textureFormat) { - case TEX_FORMAT_RGBA32: - return 32; - case TEX_FORMAT_RGBA16: - case TEX_FORMAT_IA16: - return 16; - case TEX_FORMAT_I8: - case TEX_FORMAT_IA8: - return 8; - case TEX_FORMAT_I4: - case TEX_FORMAT_IA4: - case TEX_FORMAT_CI4: - return 4; - } - std::cout << "Error: Invalid texture format " << textureFormat << std::endl; - throw 1; -} - -std::vector get_texture_data(std::vector pngData, std::vector &header, bool forceAlignment) { - std::vector outData; - - outData.insert(outData.end(), header.begin(), header.begin() + TEX_HEADER_SIZE); - bool interlace = ((outData[0x06] & 0x4) == 0x04); - - int width = outData[0x00]; - int height = outData[0x01]; - int textureFormat = outData[0x02] & 0x0F; - - switch(textureFormat) { - case TEX_FORMAT_RGBA32: - { - if (interlace) { - deinterlace(pngData, width, height, 32, 8); - } - outData.insert(outData.end(), pngData.begin(), pngData.end()); - break; - } - case TEX_FORMAT_RGBA16: - { - uint8_t* rgba16Data = (uint8_t*)malloc(width * height * 2); - rgba2raw(rgba16Data, (const rgba*)&pngData[0], width, height, 16); - std::vector rgba16(rgba16Data, rgba16Data + (width * height * 2)); - free(rgba16Data); - if (interlace) { - deinterlace(rgba16, width, height, 16, 4); - } - outData.insert(outData.end(), rgba16.begin(), rgba16.end()); - break; - } - case TEX_FORMAT_I8: - { - uint8_t* i8Data = (uint8_t*)malloc(width * height); - i2raw(i8Data, (const ia*)&pngData[0], width, height, 8); - std::vector i8(i8Data, i8Data + (width * height)); - free(i8Data); - if (interlace) { - deinterlace(i8, width, height, 8, 4); - } - outData.insert(outData.end(), i8.begin(), i8.end()); - break; - } - case TEX_FORMAT_I4: - { - uint8_t* i4Data = (uint8_t*)malloc(width * height / 2); - i2raw(i4Data, (const ia*)&pngData[0], width, height, 4); - std::vector i4(i4Data, i4Data + (width * height / 2)); - free(i4Data); - if (interlace) { - deinterlace(i4, width, height, 4, 4); - } - outData.insert(outData.end(), i4.begin(), i4.end()); - break; - } - case TEX_FORMAT_IA16: - { - uint8_t* ia16Data = (uint8_t*)malloc(width * height * 2); - ia2raw(ia16Data, (const ia*)&pngData[0], width, height, 16); - std::vector ia16(ia16Data, ia16Data + (width * height * 2)); - free(ia16Data); - if (interlace) { - deinterlace(ia16, width, height, 16, 4); - } - outData.insert(outData.end(), ia16.begin(), ia16.end()); - break; - } - case TEX_FORMAT_IA8: - { - uint8_t* ia8Data = (uint8_t*)malloc(width * height); - ia2raw(ia8Data, (const ia*)&pngData[0], width, height, 8); - std::vector ia8(ia8Data, ia8Data + (width * height)); - free(ia8Data); - if (interlace) { - deinterlace(ia8, width, height, 8, 4); - } - outData.insert(outData.end(), ia8.begin(), ia8.end()); - break; - } - case TEX_FORMAT_IA4: - { - uint8_t* ia4Data = (uint8_t*)malloc(width * height / 2); - ia2raw(ia4Data, (const ia*)&pngData[0], width, height, 4); - std::vector ia4(ia4Data, ia4Data + (width * height / 2)); - free(ia4Data); - if (interlace) { - deinterlace(ia4, width, height, 4, 4); - } - outData.insert(outData.end(), ia4.begin(), ia4.end()); - break; - } - } - - if(forceAlignment) { - while(outData.size() % 16 != 0) { - outData.push_back(0); - } - } - - return outData; -} - -std::vector get_texture_binary(std::string inputFilepath, std::string inputHeaderFilepath, bool& isCompressed) { - std::vector out; - - std::vector header = read_binary(inputHeaderFilepath); - - isCompressed = (header[0x1D] != 0x00); - bool dontComputeSizeInHeader = (header[0x16] == 0x00 && header[0x17] == 0x00); - - if (!dontComputeSizeInHeader) { - header[0x1D] = 0x00; - } - - int textureFormat = header[0x02] & 0xF; - int numTextures = header[0x12]; - - int width, totalHeight; - - std::vector combinedPngData = load_texture_from_png(inputFilepath, textureFormat, &width, &totalHeight); - - int height = totalHeight / numTextures; - int pngSize; - - if(textureFormat == TEX_FORMAT_RGBA32 || textureFormat == TEX_FORMAT_RGBA16) { - pngSize = width * height * 4; - } else { - pngSize = width * height * 2; - } - - for(int i = 0; i < numTextures; i++) { - int pngSectionStart = i * pngSize; - int pngSectionEnd = (i + 1) * pngSize; - std::vector pngData(combinedPngData.begin() + pngSectionStart, combinedPngData.begin() + pngSectionEnd); - std::vector textureData = get_texture_data(pngData, header, dontComputeSizeInHeader); - out.insert(out.end(), textureData.begin(), textureData.end()); - } - - return out; -} - -/*********************************************/ - -int main(int argc, char* argv[]) { - if(argc != 3) { - show_help(); - return 1; - } - - std::string inputFilepath = argv[1]; - std::string inputHeaderFilepath = inputFilepath + ".header"; - std::string outputFilename = argv[2]; - - bool isCompressed; - std::vector uncompressed = get_texture_binary(inputFilepath, inputHeaderFilepath, isCompressed); - - // DEBUG - // std::string outFilename = outputFilename + ".uncmp.bin"; - // write_binary_file(uncompressed, outFilename); - - if(isCompressed) { - std::vector compressedHeader; - compressedHeader.insert(compressedHeader.end(), uncompressed.begin(), uncompressed.begin() + TEX_HEADER_SIZE); - - compressedHeader[0x1D] = 0x01; - - DKRCompression compression; - std::vector compressed = compression.compressBuffer(uncompressed); - - // Note: uncompressed is garbled at this point. - - compressed.insert(compressed.begin(), compressedHeader.begin(), compressedHeader.end()); - - write_binary_file(compressed, outputFilename); - } else { - write_binary_file(uncompressed, outputFilename); - } - - return 0; -} - - - - - - diff --git a/tools/python/generate_assets.py b/tools/python/generate_assets.py index 299b4816..11034d26 100644 --- a/tools/python/generate_assets.py +++ b/tools/python/generate_assets.py @@ -3,6 +3,8 @@ import json import re import os import hashlib +import time +import subprocess from file_util import FileUtil @@ -11,111 +13,28 @@ ASSETS_INCLUDE = INCLUDE_DIRECTORY + '/asset_sections.h' class GenerateAssets: def __init__(self, rootDir, version): - self.ASSETS_FILENAME = rootDir + '/asm/assets/assets.s' - self.ASSETS_DIR = rootDir + '/assets/' + version + self.ASSETS_ASM_DIR = rootDir + '/asm/assets' + self.ASSETS_FILENAME = self.ASSETS_ASM_DIR + '/assets.s' + self.ASSETS_DIR = rootDir + '/assets' self.UCODE_DIR = rootDir + '/ucode/' + version - self.UCODE_TEXT_FILENAME = rootDir + '/asm/assets/ucode_text.s' - self.UCODE_DATA_FILENAME = rootDir + '/asm/assets/ucode_data.s' - self.BUILD_DIR = rootDir + '/build/' + version - + self.UCODE_TEXT_FILENAME = self.ASSETS_ASM_DIR + '/ucode_text.s' + self.UCODE_DATA_FILENAME = self.ASSETS_ASM_DIR + '/ucode_data.s' + self.BUILD_DIR = rootDir + '/build' + self.VERSION = version + self.generate_assets_file() self.generate_ucode_files() def generate_assets_file(self): - with open(self.ASSETS_DIR + '/assets.json') as jsonFile: - - with open(self.ASSETS_DIR + '/md5.txt', 'w') as a_file: - with open(self.ASSETS_DIR + '/assets.json',"rb") as f: - bytes = f.read() # read file as bytes - readable_hash = hashlib.md5(bytes).hexdigest(); - a_file.write(readable_hash) - + args = ["tools/dkr_assets_tool", "-i", self.VERSION, self.ASSETS_DIR, INCLUDE_DIRECTORY, self.BUILD_DIR, self.ASSETS_ASM_DIR] + createAssets = subprocess.Popen(args, stdout=subprocess.PIPE) + createAssets.wait() + streamdata = createAssets.communicate()[0] + if createAssets.returncode != 0: + raise SystemExit("An error occured while generating /asm/assets files. Error code " + str(createAssets.returncode) + ". Aborting!") + with open(self.ASSETS_DIR + '/' + self.VERSION + '/assets.json') as jsonFile: assetsJSON = json.load(jsonFile) - assets = assetsJSON['assets'] - - self.generate_asset_sections_header_file(assets) - - assetsTextFinal = '# This file was generated by generate_ld.py\n\n' - assetsTextFinal += '.include "macros.inc"\n\n' - - assetsText = 'glabel ASSETS_START\n\n' - - assetSectionTexts = [''] * len(assets) - - numAssets = len(assets) - self.numAssets = numAssets - - for i in range(0, numAssets): - assetSectionTexts[i] = 'glabel ASSET_SECTION_' + str(i) + '\n' - for i in range(0, numAssets): - assetType = assets[i]['type'] - if assetType == 'Table': - continue - if assetType == 'Empty': - assetSectionTexts[i] += '# Empty\n' - if 'table' in assets[i]: - tableIndex = assets[i]['table'] - assetSectionTexts[tableIndex] += '# Empty table\n' - assetSectionTexts[tableIndex] += '.word ASSET_SECTION_' + str(i) + '_END - ASSET_SECTION_' + str(i) + '\n' - assetSectionTexts[tableIndex] += '.word 0xFFFFFFFF\n' - continue - - folder = self.BUILD_DIR + '/' + assets[i]['folder'] - - numFiles = len(assets[i]['filenames']) - for j in range(0, numFiles): - assetSectionTexts[i] += 'glabel ASSET_' + str(i) + '_' + str(j) + '\n' - filename = folder + '/' + assets[i]['filenames'][j] - if not filename.endswith('.bin'): - filename = os.path.splitext(filename)[0] + '.bin' - assetSectionTexts[i] += '.incbin "' + filename + '"\n' - - if 'table' in assets[i]: - assetSectionTexts[assets[i]['table']] += self.generate_asset_table(i, assets[i], assetType, numFiles) - for i in range(0, numAssets): - assetSectionTexts[i] += 'glabel ASSET_SECTION_' + str(i) + '_END\n' - - for assetSectionText in assetSectionTexts: - assetsText += '.balign 16\n' + assetSectionText + '\n' - - assetsText += '.balign 16\nglabel ASSETS_END\n' - - assetsTextFinal += '.word ' + str(numAssets) + ' # Number of asset sections \n' - for i in range(0, numAssets): - assetsTextFinal += '.word ASSET_SECTION_' + str(i) + ' - ASSETS_START\n' - assetsTextFinal += '.word ASSETS_END - ASSETS_START\n\n' - assetsTextFinal += assetsText - - with open(self.ASSETS_FILENAME, "w") as assetsFile: - assetsFile.write(assetsTextFinal) - - def generate_asset_table(self, i, asset, assetType, numFiles): - outText = '' - if assetType == 'TTGhosts': - for j in range(0, numFiles): - outText += '.word 0x{:02X}{:02X}0000, '.format(asset['meta'][j]['levelID'], asset['meta'][j]['vehicleID']) - outText += 'ASSET_' + str(i) + '_' + str(j) + ' - ASSET_SECTION_' + str(i) + '\n' - outText += '.word 0xFFFF0000, ASSET_SECTION_' + str(i) + '_END - ASSET_SECTION_' + str(i) + '\n' - outText += '.word 0xFFFF0000, 0xFFFFFFFF\n' - else: - if assetType == 'MenuText': - outText += '.word ' + str(asset['text-entry-count']) + '# Number of text entries for each language\n' - for j in range(0, numFiles): - if j == 0 and assetType == 'Audio': - continue # The audio table skips the first entry (for some odd reason) - difference = 'ASSET_' + str(i) + '_' + str(j) + ' - ASSET_SECTION_' + str(i) - if assetType == 'GameText' and asset['textTypes'][j] == 1: - outText += '.word (' + difference + ') | 0x80000000\n' - elif assetType == 'Miscellaneous': - outText += '.word (' + difference + ') / 4\n' - else: - outText += '.word ' + difference + '\n' - if assetType == 'Miscellaneous': - outText += '.word (ASSET_SECTION_' + str(i) + '_END - ASSET_SECTION_' + str(i) + ') / 4\n' - else: - outText += '.word ASSET_SECTION_' + str(i) + '_END - ASSET_SECTION_' + str(i) + '\n' - outText += '.word 0xFFFFFFFF\n' - return outText + self.numAssets = len(assetsJSON['assets']['order']) # Note: I am assuming that the order of microcodes did not change between versions. # TODO: Will probably need to refactor this later. @@ -130,7 +49,7 @@ class GenerateAssets: assetsUCodeText += self.generate_ucode_file('rspUnknown2Start', 'ucode/ucode_unknown_2.bin') with open(self.UCODE_TEXT_FILENAME, "w") as assetsFile: assetsFile.write(assetsUCodeText) - + assetsUCodeData = '# This file was generated by generate_ld.py\n\n' assetsUCodeData += '.include "macros.inc"\n\n' assetsUCodeData += self.generate_ucode_file('rspUnknownDataStart', 'ucode/data_unknown.bin') @@ -138,21 +57,9 @@ class GenerateAssets: assetsUCodeData += self.generate_ucode_file('rspF3DDKRDataFifoStart', 'ucode/data_f3ddkr_fifo.bin') assetsUCodeData += self.generate_ucode_file('rspF3DDKRDataXbusStart', 'ucode/data_f3ddkr_xbus.bin') assetsUCodeData += self.generate_ucode_file('rspUnknown2DataStart', 'ucode/data_unknown_2.bin') - + with open(self.UCODE_DATA_FILENAME, "w") as assetsFile: assetsFile.write(assetsUCodeData) - + def generate_ucode_file(self, label, path): - return 'glabel ' + label + '\n.incbin "' + self.BUILD_DIR + '/' + path + '"\n' - - def generate_asset_sections_header_file(self, assets): - out = '/* This file was generated by generate_ld.py */\n' - out += '\n#ifndef _ASSET_SECTIONS_H_\n#define _ASSET_SECTIONS_H_\n\n' - - for i in range(0, len(assets)): - asset = assets[i] - out += '#define ASSET_' + asset['name'] + ' ' + str(i) + '\n' - - out += '\n#endif\n' - with open(ASSETS_INCLUDE, "w") as assetSectionsFile: - assetSectionsFile.write(out) + return 'glabel ' + label + '\n.incbin "' + self.BUILD_DIR + '/' + self.VERSION + '/' + path + '"\n'