Weapon assets and statically linked (#1470)

Allow to compile weapon overlays as a single C files. The benefit is to
disallow symbols to be exported by statically compile them all but the
header. We would no longer need to use `OVL_EXPORT` as long as the
symbols are marked as `static`. The frames data is also generated as an
array of data that can be just included into their respective C files,
generated by JSON files on the fly.

I changed `animset` to `frameset` as the data does not represent a set
of animations but rather a set of frames, where every frame has multiple
sprites. The information on how the frames are played (e.g. animation)
is found elsewhere.

Following the full list of changes to achieve this project:
* The `animset` from splat is now dummied out
* The `frameset` JSON is now generated by the asset manager
* The `frameset` JSON is now compiled into `src/weapon/w_0xx_y.h`
* The `header.c` has been moved into `shared.h`
* For simplicity I added a `#define g_Animset w_000_1`. I did not want
to hack the asset manager too much to force the name to be `g_Animset`
and I did not want to change all the symbols yet.
* Simplified `weapon_pc.c` as we now only need the exported header
* Always try to build the most up-to-date asset manager: this should
avoid weird errors whenever people pull new changes

As the asset manager now can accept those `config` files, now the CLI
supports the following commands:
* `stage extract`
* `stage build`
* `config extract` (NEW)
* `config build` (NEW)

The config structure is heavily inspired to Splat to maintain
consistency and continuity.
This commit is contained in:
Luciano Ciccariello 2024-08-09 00:57:26 +01:00 committed by GitHub
parent b5429e0ae8
commit f1faef333a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
86 changed files with 2239 additions and 2053 deletions

View File

@ -130,6 +130,7 @@ clean:
git clean -fdx assets/
git clean -fdx asm/$(VERSION)/
git clean -fdx build/$(VERSION)/
git clean -fdx $(SRC_DIR)/weapon
git clean -fdx config/
git clean -fdx function_calls/
git clean -fdx sotn_calltree.txt
@ -328,7 +329,7 @@ $(ASM_DIR)/weapon/data/w_%.data.s: # create a fake empty file if all the data ha
touch $@
$(ASM_DIR)/weapon/data/w_%.sbss.s: # create a fake empty file if all the bss section has been imported
touch $@
$(BUILD_DIR)/weapon/w0_%.elf: $(BUILD_DIR)/$(SRC_DIR)/weapon/header.c.o $(BUILD_DIR)/$(ASSETS_DIR)/weapon/w_%_1.animset.o $(BUILD_DIR)/$(ASSETS_DIR)/weapon/w_%_2.animset.o $(BUILD_DIR)/$(SRC_DIR)/weapon/w_%.c.o $(BUILD_DIR)/$(ASM_DIR)/weapon/data/w_%.data.s.o $(BUILD_DIR)/$(ASM_DIR)/weapon/data/w_%.sbss.s.o
$(BUILD_DIR)/weapon/w0_%.elf: $(BUILD_DIR)/$(SRC_DIR)/weapon/w_%.c.o $(BUILD_DIR)/$(ASM_DIR)/weapon/data/w_%.data.s.o $(BUILD_DIR)/$(ASM_DIR)/weapon/data/w_%.sbss.s.o
$(LD) $(LD_FLAGS) --no-check-sections -o $@ \
-Map $(BUILD_DIR)/weapon/w0_$*.map \
-T weapon0.ld \
@ -336,7 +337,7 @@ $(BUILD_DIR)/weapon/w0_%.elf: $(BUILD_DIR)/$(SRC_DIR)/weapon/header.c.o $(BUILD_
-T $(CONFIG_DIR)/undefined_syms_auto.$(VERSION).weapon.txt \
-T $(CONFIG_DIR)/undefined_funcs_auto.$(VERSION).weapon.txt \
$^
$(BUILD_DIR)/weapon/w1_%.elf: $(BUILD_DIR)/$(SRC_DIR)/weapon/header.c.o $(BUILD_DIR)/$(ASSETS_DIR)/weapon/w_%_1.animset.o $(BUILD_DIR)/$(ASSETS_DIR)/weapon/w_%_2.animset.o $(BUILD_DIR)/$(SRC_DIR)/weapon/w_%.c.o $(BUILD_DIR)/$(ASM_DIR)/weapon/data/w_%.data.s.o $(BUILD_DIR)/$(ASM_DIR)/weapon/data/w_%.sbss.s.o
$(BUILD_DIR)/weapon/w1_%.elf: $(BUILD_DIR)/$(SRC_DIR)/weapon/w_%.c.o $(BUILD_DIR)/$(ASM_DIR)/weapon/data/w_%.data.s.o $(BUILD_DIR)/$(ASM_DIR)/weapon/data/w_%.sbss.s.o
$(LD) $(LD_FLAGS) --no-check-sections -o $@ \
-Map $(BUILD_DIR)/weapon/w1_$*.map \
-T weapon1.ld \
@ -471,9 +472,6 @@ $(SOTNASSETS): $(GO) $(SOTNASSETS_SOURCES)
$(BUILD_DIR)/$(ASSETS_DIR)/%.spritesheet.json.o: $(ASSETS_DIR)/%.spritesheet.json
./tools/splat_ext/spritesheet.py encode $< $(BUILD_DIR)/$(ASSETS_DIR)/$*.s
$(AS) $(AS_FLAGS) -o $(BUILD_DIR)/$(ASSETS_DIR)/$*.o $(BUILD_DIR)/$(ASSETS_DIR)/$*.s
$(BUILD_DIR)/$(ASSETS_DIR)/%.animset.json.o: $(ASSETS_DIR)/%.animset.json
./tools/splat_ext/animset.py gen-asm $< $(BUILD_DIR)/$(ASSETS_DIR)/$*.s
$(AS) $(AS_FLAGS) -o $(BUILD_DIR)/$(ASSETS_DIR)/$*.o $(BUILD_DIR)/$(ASSETS_DIR)/$*.s
$(BUILD_DIR)/$(ASSETS_DIR)/dra/%.json.o: $(ASSETS_DIR)/dra/%.json
./tools/splat_ext/assets.py $< $(BUILD_DIR)/$(ASSETS_DIR)/dra/$*.s
$(AS) $(AS_FLAGS) -o $(BUILD_DIR)/$(ASSETS_DIR)/dra/$*.o $(BUILD_DIR)/$(ASSETS_DIR)/dra/$*.s

View File

@ -20,7 +20,7 @@ extract_us: $(addprefix $(BUILD_DIR)/,$(addsuffix .ld,$(PSX_US_TARGETS)))
make build_assets
extract_hd: $(addprefix $(BUILD_DIR)/,$(addsuffix .ld,$(PSX_HD_TARGETS)))
make extract_assets_hd
make build_assets
make build_assets_hd
extract_disk_us: extract_disk_psxus
extract_disk_hd: extract_disk_pspeu
@ -80,25 +80,31 @@ $(BUILD_DIR)/$(SRC_DIR)/main/psxsdk/libgpu/sys.c.o: $(SRC_DIR)/main/psxsdk/libgp
$(CPP) $(CPP_FLAGS) -lang-c $< | $(SOTNSTR) | $(ICONV) | $(CC) $(CC_FLAGS) $(PSXCC_FLAGS) | $(MASPSX_21) | $(AS) $(AS_FLAGS) -o $@
extract_assets: $(SOTNASSETS)
$(SOTNASSETS) extract -stage_ovl disks/$(VERSION)/ST/CEN/CEN.BIN -o assets/st/cen
$(SOTNASSETS) extract -stage_ovl disks/$(VERSION)/ST/DRE/DRE.BIN -o assets/st/dre
$(SOTNASSETS) extract -stage_ovl disks/$(VERSION)/ST/NO3/NO3.BIN -o assets/st/no3
$(SOTNASSETS) extract -stage_ovl disks/$(VERSION)/ST/NP3/NP3.BIN -o assets/st/np3
$(SOTNASSETS) extract -stage_ovl disks/$(VERSION)/ST/NZ0/NZ0.BIN -o assets/st/nz0
$(SOTNASSETS) extract -stage_ovl disks/$(VERSION)/ST/ST0/ST0.BIN -o assets/st/st0
$(SOTNASSETS) extract -stage_ovl disks/$(VERSION)/ST/WRP/WRP.BIN -o assets/st/wrp
$(SOTNASSETS) extract -stage_ovl disks/$(VERSION)/ST/RWRP/RWRP.BIN -o assets/st/rwrp
cd tools/sotn-assets; $(GO) install
$(SOTNASSETS) stage extract -stage_ovl disks/$(VERSION)/ST/CEN/CEN.BIN -o assets/st/cen
$(SOTNASSETS) stage extract -stage_ovl disks/$(VERSION)/ST/DRE/DRE.BIN -o assets/st/dre
$(SOTNASSETS) stage extract -stage_ovl disks/$(VERSION)/ST/NO3/NO3.BIN -o assets/st/no3
$(SOTNASSETS) stage extract -stage_ovl disks/$(VERSION)/ST/NP3/NP3.BIN -o assets/st/np3
$(SOTNASSETS) stage extract -stage_ovl disks/$(VERSION)/ST/NZ0/NZ0.BIN -o assets/st/nz0
$(SOTNASSETS) stage extract -stage_ovl disks/$(VERSION)/ST/ST0/ST0.BIN -o assets/st/st0
$(SOTNASSETS) stage extract -stage_ovl disks/$(VERSION)/ST/WRP/WRP.BIN -o assets/st/wrp
$(SOTNASSETS) stage extract -stage_ovl disks/$(VERSION)/ST/RWRP/RWRP.BIN -o assets/st/rwrp
$(SOTNASSETS) config extract config/assets.us.weapon.yaml
extract_assets_hd: $(SOTNASSETS)
$(SOTNASSETS) extract -stage_ovl disks/pspeu/PSP_GAME/USRDIR/res/ps/hdbin/wrp.bin -o assets/st/wrp
cd tools/sotn-assets; $(GO) install
$(SOTNASSETS) stage extract -stage_ovl disks/pspeu/PSP_GAME/USRDIR/res/ps/hdbin/wrp.bin -o assets/st/wrp
build_assets: $(SOTNASSETS)
$(SOTNASSETS) build_all -i assets/st/cen -o src/st/cen/
$(SOTNASSETS) build_all -i assets/st/dre -o src/st/dre/
$(SOTNASSETS) build_all -i assets/st/no3 -o src/st/no3/
$(SOTNASSETS) build_all -i assets/st/np3 -o src/st/np3/
$(SOTNASSETS) build_all -i assets/st/nz0 -o src/st/nz0/
$(SOTNASSETS) build_all -i assets/st/st0 -o src/st/st0/
$(SOTNASSETS) build_all -i assets/st/wrp -o src/st/wrp/
$(SOTNASSETS) build_all -i assets/st/rwrp -o src/st/rwrp/
$(SOTNASSETS) stage build_all -i assets/st/cen -o src/st/cen/
$(SOTNASSETS) stage build_all -i assets/st/dre -o src/st/dre/
$(SOTNASSETS) stage build_all -i assets/st/no3 -o src/st/no3/
$(SOTNASSETS) stage build_all -i assets/st/np3 -o src/st/np3/
$(SOTNASSETS) stage build_all -i assets/st/nz0 -o src/st/nz0/
$(SOTNASSETS) stage build_all -i assets/st/st0 -o src/st/st0/
$(SOTNASSETS) stage build_all -i assets/st/wrp -o src/st/wrp/
$(SOTNASSETS) stage build_all -i assets/st/rwrp -o src/st/rwrp/
$(SOTNASSETS) config build config/assets.$(VERSION).weapon.yaml
build_assets_hd: $(SOTNASSETS)
$(SOTNASSETS) stage build_all -i assets/st/wrp -o src/st/wrp/
$(BUILD_DIR)/assets/dra/memcard_%.png.o: assets/dra/memcard_%.png
mkdir -p $(dir $@)

View File

@ -0,0 +1,359 @@
files:
- target: disks/us/BIN/WEAPON0.BIN
asset_path: assets/weapon
src_path: src/weapon
segments:
- start: 0x04000
vram: 0x8017A000
assets:
- [0x04040, frameset, w_000_1]
- [0x04A44, frameset, w_000_2]
- [0x04A44, skip]
- start: 0x0B000
vram: 0x8017A000
assets:
- [0x0B040, frameset, w_001_1]
- [0x0BA44, frameset, w_001_2]
- [0x0BA44, skip]
- start: 0x12000
vram: 0x8017A000
assets:
- [0x12040, frameset, w_002_1]
- [0x12884, frameset, w_002_2]
- [0x12884, skip]
- start: 0x19000
vram: 0x8017A000
assets:
- [0x19040, frameset, w_003_1]
- [0x19884, frameset, w_003_2]
- [0x19884, skip]
- start: 0x20000
vram: 0x8017A000
assets:
- [0x20040, frameset, w_004_1]
- [0x20EAC, frameset, w_004_2]
- [0x20EAC, skip]
- start: 0x27000
vram: 0x8017A000
assets:
- [0x27040, frameset, w_005_1]
- [0x27EAC, frameset, w_005_2]
- [0x27EAC, skip]
- start: 0x2E000
vram: 0x8017A000
assets:
- [0x2E040, frameset, w_006_1]
- [0x2E884, frameset, w_006_2]
- [0x2E884, skip]
- start: 0x35000
vram: 0x8017A000
assets:
- [0x35040, frameset, w_007_1]
- [0x35884, frameset, w_007_2]
- [0x35884, skip]
- start: 0x3C000
vram: 0x8017A000
assets:
- [0x3C040, frameset, w_008_1]
- [0x3C804, frameset, w_008_2]
- [0x3C804, skip]
- start: 0x43000
vram: 0x8017A000
assets:
- [0x43040, frameset, w_009_1]
- [0x43804, frameset, w_009_2]
- [0x43804, skip]
- start: 0x4A000
vram: 0x8017A000
assets:
- [0x4A040, frameset, w_010_1]
- [0x4A8EC, frameset, w_010_2]
- [0x4A8EC, skip]
- start: 0x51000
vram: 0x8017A000
assets:
- [0x51040, frameset, w_011_1]
- [0x51958, frameset, w_011_2]
- [0x51958, skip]
- start: 0x58000
vram: 0x8017A000
assets:
- [0x58040, frameset, w_012_1]
- [0x582B0, frameset, w_012_2]
- [0x582B0, skip]
- start: 0x5F000
vram: 0x8017A000
assets:
- [0x5F040, frameset, w_013_1]
- [0x5F2B0, frameset, w_013_2]
- [0x5F2B0, skip]
- start: 0x66000
vram: 0x8017A000
assets:
- [0x66040, frameset, w_014_1]
- [0x662B0, frameset, w_014_2]
- [0x662B0, skip]
- start: 0x6D000
vram: 0x8017A000
assets:
- [0x6D040, frameset, w_015_1]
- [0x6D2B0, frameset, w_015_2]
- [0x6D478, skip]
- start: 0x74000
vram: 0x8017A000
assets:
- [0x74040, frameset, w_016_1]
- [0x742B0, frameset, w_016_2]
- [0x742B0, skip]
- start: 0x7B000
vram: 0x8017A000
assets:
- [0x7B040, frameset, w_017_1]
- [0x7B040, frameset, w_017_2]
- [0x7B040, skip]
- start: 0x82000
vram: 0x8017A000
assets:
- [0x82040, frameset, w_018_1]
- [0x82488, frameset, w_018_2]
- [0x82488, skip]
- start: 0x89000
vram: 0x8017A000
assets:
- [0x89040, frameset, w_019_1]
- [0x8930C, frameset, w_019_2]
- [0x8930C, skip]
- start: 0x90000
vram: 0x8017A000
assets:
- [0x90040, frameset, w_020_1]
- [0x90630, frameset, w_020_2]
- [0x90630, skip]
- start: 0x97000
vram: 0x8017A000
assets:
- [0x97040, frameset, w_021_1]
- [0x97564, frameset, w_021_2]
- [0x97564, skip]
- start: 0x9E000
vram: 0x8017A000
assets:
- [0x9E040, frameset, w_022_1]
- [0x9E540, frameset, w_022_2]
- [0x9E540, skip]
- start: 0xA5000
vram: 0x8017A000
assets:
- [0xA5040, frameset, w_023_1]
- [0xA58A4, frameset, w_023_2]
- [0xA58A4, skip]
- start: 0xAC000
vram: 0x8017A000
assets:
- [0xAC040, frameset, w_024_1]
- [0xAC804, frameset, w_024_2]
- [0xAC804, skip]
- start: 0xB3000
vram: 0x8017A000
assets:
- [0xB3040, frameset, w_025_1]
- [0xB3804, frameset, w_025_2]
- [0xB3804, skip]
- start: 0xBA000
vram: 0x8017A000
assets:
- [0xBA040, frameset, w_026_1]
- [0xBA804, frameset, w_026_2]
- [0xBA804, skip]
- start: 0xC1000
vram: 0x8017A000
assets:
- [0xC1040, frameset, w_027_1]
- [0xC1A18, frameset, w_027_2]
- [0xC1A18, skip]
- start: 0xC8000
vram: 0x8017A000
assets:
- [0xC8040, frameset, w_028_1]
- [0xC8804, frameset, w_028_2]
- [0xC8804, skip]
- start: 0xCF000
vram: 0x8017A000
assets:
- [0xCF040, frameset, w_029_1]
- [0xCF884, frameset, w_029_2]
- [0xCF884, skip]
- start: 0xD6000
vram: 0x8017A000
assets:
- [0xD6040, frameset, w_030_1]
- [0xD6040, frameset, w_030_2]
- [0xD6040, skip]
- start: 0xDD000
vram: 0x8017A000
assets:
- [0xDD040, frameset, w_031_1]
- [0xDD704, frameset, w_031_2]
- [0xDD704, skip]
- start: 0xE4000
vram: 0x8017A000
assets:
- [0xE4040, frameset, w_032_1]
- [0xE4704, frameset, w_032_2]
- [0xE4704, skip]
- start: 0xEB000
vram: 0x8017A000
assets:
- [0xEB040, frameset, w_033_1]
- [0xEBA9C, frameset, w_033_2]
- [0xEBA9C, skip]
- start: 0xF2000
vram: 0x8017A000
assets:
- [0xF2040, frameset, w_034_1]
- [0xF2784, frameset, w_034_2]
- [0xF2784, skip]
- start: 0xF9000
vram: 0x8017A000
assets:
- [0xF9040, frameset, w_035_1]
- [0xF9404, frameset, w_035_2]
- [0xF9404, skip]
- start: 0x100000
vram: 0x8017A000
assets:
- [0x100040, frameset, w_036_1]
- [0x100404, frameset, w_036_2]
- [0x100404, skip]
- start: 0x107000
vram: 0x8017A000
assets:
- [0x107040, frameset, w_037_1]
- [0x107504, frameset, w_037_2]
- [0x107504, skip]
- start: 0x10E000
vram: 0x8017A000
assets:
- [0x10E040, frameset, w_038_1]
- [0x10EC08, frameset, w_038_2]
- [0x10EC08, skip]
- start: 0x115000
vram: 0x8017A000
assets:
- [0x115040, frameset, w_039_1]
- [0x115C08, frameset, w_039_2]
- [0x115C08, skip]
- start: 0x11C000
vram: 0x8017A000
assets:
- [0x11C040, frameset, w_040_1]
- [0x11C504, frameset, w_040_2]
- [0x11C504, skip]
- start: 0x123000
vram: 0x8017A000
assets:
- [0x123040, frameset, w_041_1]
- [0x123284, frameset, w_041_2]
- [0x123284, skip]
- start: 0x12A000
vram: 0x8017A000
assets:
- [0x12A040, frameset, w_042_1]
- [0x12A3E4, frameset, w_042_2]
- [0x12A3E4, skip]
- start: 0x131000
vram: 0x8017A000
assets:
- [0x131040, frameset, w_043_1]
- [0x131A44, frameset, w_043_2]
- [0x131A44, skip]
- start: 0x138000
vram: 0x8017A000
assets:
- [0x138040, frameset, w_044_1]
- [0x138040, frameset, w_044_2]
- [0x138040, skip]
- start: 0x13F000
vram: 0x8017A000
assets:
- [0x13F040, frameset, w_045_1]
- [0x13F330, frameset, w_045_2]
- [0x13F330, skip]
- start: 0x146000
vram: 0x8017A000
assets:
- [0x146040, frameset, w_046_1]
- [0x1462B0, frameset, w_046_2]
- [0x1462B0, skip]
- start: 0x14D000
vram: 0x8017A000
assets:
- [0x14D040, frameset, w_047_1]
- [0x14D0D4, frameset, w_047_2]
- [0x14D228, skip]
- start: 0x154000
vram: 0x8017A000
assets:
- [0x154040, frameset, w_048_1]
- [0x154A44, frameset, w_048_2]
- [0x154A44, skip]
- start: 0x15B000
vram: 0x8017A000
assets:
- [0x15B040, frameset, w_049_1]
- [0x15BA44, frameset, w_049_2]
- [0x15BC00, skip]
- start: 0x162000
vram: 0x8017A000
assets:
- [0x162040, frameset, w_050_1]
- [0x162A44, frameset, w_050_2]
- [0x162A44, skip]
- start: 0x169000
vram: 0x8017A000
assets:
- [0x169040, frameset, w_051_1]
- [0x169950, frameset, w_051_2]
- [0x169950, skip]
- start: 0x170000
vram: 0x8017A000
assets:
- [0x170040, frameset, w_052_1]
- [0x170808, frameset, w_052_2]
- [0x170808, skip]
- start: 0x177000
vram: 0x8017A000
assets:
- [0x177040, frameset, w_053_1]
- [0x177A44, frameset, w_053_2]
- [0x177A44, skip]
- start: 0x17E000
vram: 0x8017A000
assets:
- [0x17E040, frameset, w_054_1]
- [0x17EA44, frameset, w_054_2]
- [0x17EA44, skip]
- start: 0x185000
vram: 0x8017A000
assets:
- [0x185040, frameset, w_055_1]
- [0x185A44, frameset, w_055_2]
- [0x185A44, skip]
- start: 0x18C000
vram: 0x8017A000
assets:
- [0x18C040, frameset, w_056_1]
- [0x18CA44, frameset, w_056_2]
- [0x18CA44, skip]
- start: 0x193000
vram: 0x8017A000
assets:
- [0x193040, frameset, w_057_1]
- [0x193A44, frameset, w_057_2]
- [0x193A44, skip]
- start: 0x19A000
vram: 0x8017A000
assets:
- [0x19A040, frameset, w_058_1]
- [0x19A808, frameset, w_058_2]
- [0x19A808, skip]

1
go.work.sum Normal file
View File

@ -0,0 +1 @@
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=

View File

@ -46,787 +46,35 @@ Weapon D_8017D000 = {
func_ptr_80170024Dummy,
func_ptr_80170028Dummy,
};
static Weapon dummy_header = {
EntityWeaponAttackDummy,
func_ptr_80170004Dummy,
func_ptr_80170008Dummy,
func_ptr_8017000CDummy,
func_ptr_80170010Dummy,
func_ptr_80170014Dummy,
GetWeaponIdDummy,
LoadWeaponPaletteDummy,
EntityWeaponShieldSpellDummy,
func_ptr_80170024Dummy,
func_ptr_80170028Dummy,
};
void w_000_EntityWeaponAttack(Entity* self);
s32 w_000_func_ptr_80170004(Entity* self);
void w_000_func_ptr_80170008(Entity* self);
void w_000_func_ptr_8017000C(Entity* self);
s32 w_000_func_ptr_80170010(Entity* self);
s32 w_000_func_ptr_80170014(Entity* self);
int w_000_GetWeaponId(void);
void w_000_LoadWeaponPalette(s32 clutIndex);
void w_000_EntityWeaponShieldSpell(Entity* self);
void w_000_func_ptr_80170024(Entity* self);
void w_000_func_ptr_80170028(Entity* self);
Weapon g_Weapons[] = {
{
w_000_EntityWeaponAttack,
w_000_func_ptr_80170004,
w_000_func_ptr_80170008,
w_000_func_ptr_8017000C,
w_000_func_ptr_80170010,
w_000_func_ptr_80170014,
w_000_GetWeaponId,
w_000_LoadWeaponPalette,
w_000_EntityWeaponShieldSpell,
w_000_func_ptr_80170024,
w_000_func_ptr_80170028,
},
{
EntityWeaponAttackDummy,
func_ptr_80170004Dummy,
func_ptr_80170008Dummy,
func_ptr_8017000CDummy,
func_ptr_80170010Dummy,
func_ptr_80170014Dummy,
GetWeaponIdDummy,
LoadWeaponPaletteDummy,
EntityWeaponShieldSpellDummy,
func_ptr_80170024Dummy,
func_ptr_80170028Dummy,
},
{
EntityWeaponAttackDummy,
func_ptr_80170004Dummy,
func_ptr_80170008Dummy,
func_ptr_8017000CDummy,
func_ptr_80170010Dummy,
func_ptr_80170014Dummy,
GetWeaponIdDummy,
LoadWeaponPaletteDummy,
EntityWeaponShieldSpellDummy,
func_ptr_80170024Dummy,
func_ptr_80170028Dummy,
},
{
EntityWeaponAttackDummy,
func_ptr_80170004Dummy,
func_ptr_80170008Dummy,
func_ptr_8017000CDummy,
func_ptr_80170010Dummy,
func_ptr_80170014Dummy,
GetWeaponIdDummy,
LoadWeaponPaletteDummy,
EntityWeaponShieldSpellDummy,
func_ptr_80170024Dummy,
func_ptr_80170028Dummy,
},
{
EntityWeaponAttackDummy,
func_ptr_80170004Dummy,
func_ptr_80170008Dummy,
func_ptr_8017000CDummy,
func_ptr_80170010Dummy,
func_ptr_80170014Dummy,
GetWeaponIdDummy,
LoadWeaponPaletteDummy,
EntityWeaponShieldSpellDummy,
func_ptr_80170024Dummy,
func_ptr_80170028Dummy,
},
{
EntityWeaponAttackDummy,
func_ptr_80170004Dummy,
func_ptr_80170008Dummy,
func_ptr_8017000CDummy,
func_ptr_80170010Dummy,
func_ptr_80170014Dummy,
GetWeaponIdDummy,
LoadWeaponPaletteDummy,
EntityWeaponShieldSpellDummy,
func_ptr_80170024Dummy,
func_ptr_80170028Dummy,
},
{
EntityWeaponAttackDummy,
func_ptr_80170004Dummy,
func_ptr_80170008Dummy,
func_ptr_8017000CDummy,
func_ptr_80170010Dummy,
func_ptr_80170014Dummy,
GetWeaponIdDummy,
LoadWeaponPaletteDummy,
EntityWeaponShieldSpellDummy,
func_ptr_80170024Dummy,
func_ptr_80170028Dummy,
},
{
EntityWeaponAttackDummy,
func_ptr_80170004Dummy,
func_ptr_80170008Dummy,
func_ptr_8017000CDummy,
func_ptr_80170010Dummy,
func_ptr_80170014Dummy,
GetWeaponIdDummy,
LoadWeaponPaletteDummy,
EntityWeaponShieldSpellDummy,
func_ptr_80170024Dummy,
func_ptr_80170028Dummy,
},
{
EntityWeaponAttackDummy,
func_ptr_80170004Dummy,
func_ptr_80170008Dummy,
func_ptr_8017000CDummy,
func_ptr_80170010Dummy,
func_ptr_80170014Dummy,
GetWeaponIdDummy,
LoadWeaponPaletteDummy,
EntityWeaponShieldSpellDummy,
func_ptr_80170024Dummy,
func_ptr_80170028Dummy,
},
{
EntityWeaponAttackDummy,
func_ptr_80170004Dummy,
func_ptr_80170008Dummy,
func_ptr_8017000CDummy,
func_ptr_80170010Dummy,
func_ptr_80170014Dummy,
GetWeaponIdDummy,
LoadWeaponPaletteDummy,
EntityWeaponShieldSpellDummy,
func_ptr_80170024Dummy,
func_ptr_80170028Dummy,
},
{
EntityWeaponAttackDummy,
func_ptr_80170004Dummy,
func_ptr_80170008Dummy,
func_ptr_8017000CDummy,
func_ptr_80170010Dummy,
func_ptr_80170014Dummy,
GetWeaponIdDummy,
LoadWeaponPaletteDummy,
EntityWeaponShieldSpellDummy,
func_ptr_80170024Dummy,
func_ptr_80170028Dummy,
},
{
EntityWeaponAttackDummy,
func_ptr_80170004Dummy,
func_ptr_80170008Dummy,
func_ptr_8017000CDummy,
func_ptr_80170010Dummy,
func_ptr_80170014Dummy,
GetWeaponIdDummy,
LoadWeaponPaletteDummy,
EntityWeaponShieldSpellDummy,
func_ptr_80170024Dummy,
func_ptr_80170028Dummy,
},
{
EntityWeaponAttackDummy,
func_ptr_80170004Dummy,
func_ptr_80170008Dummy,
func_ptr_8017000CDummy,
func_ptr_80170010Dummy,
func_ptr_80170014Dummy,
GetWeaponIdDummy,
LoadWeaponPaletteDummy,
EntityWeaponShieldSpellDummy,
func_ptr_80170024Dummy,
func_ptr_80170028Dummy,
},
{
EntityWeaponAttackDummy,
func_ptr_80170004Dummy,
func_ptr_80170008Dummy,
func_ptr_8017000CDummy,
func_ptr_80170010Dummy,
func_ptr_80170014Dummy,
GetWeaponIdDummy,
LoadWeaponPaletteDummy,
EntityWeaponShieldSpellDummy,
func_ptr_80170024Dummy,
func_ptr_80170028Dummy,
},
{
EntityWeaponAttackDummy,
func_ptr_80170004Dummy,
func_ptr_80170008Dummy,
func_ptr_8017000CDummy,
func_ptr_80170010Dummy,
func_ptr_80170014Dummy,
GetWeaponIdDummy,
LoadWeaponPaletteDummy,
EntityWeaponShieldSpellDummy,
func_ptr_80170024Dummy,
func_ptr_80170028Dummy,
},
{
EntityWeaponAttackDummy,
func_ptr_80170004Dummy,
func_ptr_80170008Dummy,
func_ptr_8017000CDummy,
func_ptr_80170010Dummy,
func_ptr_80170014Dummy,
GetWeaponIdDummy,
LoadWeaponPaletteDummy,
EntityWeaponShieldSpellDummy,
func_ptr_80170024Dummy,
func_ptr_80170028Dummy,
},
{
EntityWeaponAttackDummy,
func_ptr_80170004Dummy,
func_ptr_80170008Dummy,
func_ptr_8017000CDummy,
func_ptr_80170010Dummy,
func_ptr_80170014Dummy,
GetWeaponIdDummy,
LoadWeaponPaletteDummy,
EntityWeaponShieldSpellDummy,
func_ptr_80170024Dummy,
func_ptr_80170028Dummy,
},
{
EntityWeaponAttackDummy,
func_ptr_80170004Dummy,
func_ptr_80170008Dummy,
func_ptr_8017000CDummy,
func_ptr_80170010Dummy,
func_ptr_80170014Dummy,
GetWeaponIdDummy,
LoadWeaponPaletteDummy,
EntityWeaponShieldSpellDummy,
func_ptr_80170024Dummy,
func_ptr_80170028Dummy,
},
{
EntityWeaponAttackDummy,
func_ptr_80170004Dummy,
func_ptr_80170008Dummy,
func_ptr_8017000CDummy,
func_ptr_80170010Dummy,
func_ptr_80170014Dummy,
GetWeaponIdDummy,
LoadWeaponPaletteDummy,
EntityWeaponShieldSpellDummy,
func_ptr_80170024Dummy,
func_ptr_80170028Dummy,
},
{
EntityWeaponAttackDummy,
func_ptr_80170004Dummy,
func_ptr_80170008Dummy,
func_ptr_8017000CDummy,
func_ptr_80170010Dummy,
func_ptr_80170014Dummy,
GetWeaponIdDummy,
LoadWeaponPaletteDummy,
EntityWeaponShieldSpellDummy,
func_ptr_80170024Dummy,
func_ptr_80170028Dummy,
},
{
EntityWeaponAttackDummy,
func_ptr_80170004Dummy,
func_ptr_80170008Dummy,
func_ptr_8017000CDummy,
func_ptr_80170010Dummy,
func_ptr_80170014Dummy,
GetWeaponIdDummy,
LoadWeaponPaletteDummy,
EntityWeaponShieldSpellDummy,
func_ptr_80170024Dummy,
func_ptr_80170028Dummy,
},
{
EntityWeaponAttackDummy,
func_ptr_80170004Dummy,
func_ptr_80170008Dummy,
func_ptr_8017000CDummy,
func_ptr_80170010Dummy,
func_ptr_80170014Dummy,
GetWeaponIdDummy,
LoadWeaponPaletteDummy,
EntityWeaponShieldSpellDummy,
func_ptr_80170024Dummy,
func_ptr_80170028Dummy,
},
{
EntityWeaponAttackDummy,
func_ptr_80170004Dummy,
func_ptr_80170008Dummy,
func_ptr_8017000CDummy,
func_ptr_80170010Dummy,
func_ptr_80170014Dummy,
GetWeaponIdDummy,
LoadWeaponPaletteDummy,
EntityWeaponShieldSpellDummy,
func_ptr_80170024Dummy,
func_ptr_80170028Dummy,
},
{
EntityWeaponAttackDummy,
func_ptr_80170004Dummy,
func_ptr_80170008Dummy,
func_ptr_8017000CDummy,
func_ptr_80170010Dummy,
func_ptr_80170014Dummy,
GetWeaponIdDummy,
LoadWeaponPaletteDummy,
EntityWeaponShieldSpellDummy,
func_ptr_80170024Dummy,
func_ptr_80170028Dummy,
},
{
EntityWeaponAttackDummy,
func_ptr_80170004Dummy,
func_ptr_80170008Dummy,
func_ptr_8017000CDummy,
func_ptr_80170010Dummy,
func_ptr_80170014Dummy,
GetWeaponIdDummy,
LoadWeaponPaletteDummy,
EntityWeaponShieldSpellDummy,
func_ptr_80170024Dummy,
func_ptr_80170028Dummy,
},
{
EntityWeaponAttackDummy,
func_ptr_80170004Dummy,
func_ptr_80170008Dummy,
func_ptr_8017000CDummy,
func_ptr_80170010Dummy,
func_ptr_80170014Dummy,
GetWeaponIdDummy,
LoadWeaponPaletteDummy,
EntityWeaponShieldSpellDummy,
func_ptr_80170024Dummy,
func_ptr_80170028Dummy,
},
{
EntityWeaponAttackDummy,
func_ptr_80170004Dummy,
func_ptr_80170008Dummy,
func_ptr_8017000CDummy,
func_ptr_80170010Dummy,
func_ptr_80170014Dummy,
GetWeaponIdDummy,
LoadWeaponPaletteDummy,
EntityWeaponShieldSpellDummy,
func_ptr_80170024Dummy,
func_ptr_80170028Dummy,
},
{
EntityWeaponAttackDummy,
func_ptr_80170004Dummy,
func_ptr_80170008Dummy,
func_ptr_8017000CDummy,
func_ptr_80170010Dummy,
func_ptr_80170014Dummy,
GetWeaponIdDummy,
LoadWeaponPaletteDummy,
EntityWeaponShieldSpellDummy,
func_ptr_80170024Dummy,
func_ptr_80170028Dummy,
},
{
EntityWeaponAttackDummy,
func_ptr_80170004Dummy,
func_ptr_80170008Dummy,
func_ptr_8017000CDummy,
func_ptr_80170010Dummy,
func_ptr_80170014Dummy,
GetWeaponIdDummy,
LoadWeaponPaletteDummy,
EntityWeaponShieldSpellDummy,
func_ptr_80170024Dummy,
func_ptr_80170028Dummy,
},
{
EntityWeaponAttackDummy,
func_ptr_80170004Dummy,
func_ptr_80170008Dummy,
func_ptr_8017000CDummy,
func_ptr_80170010Dummy,
func_ptr_80170014Dummy,
GetWeaponIdDummy,
LoadWeaponPaletteDummy,
EntityWeaponShieldSpellDummy,
func_ptr_80170024Dummy,
func_ptr_80170028Dummy,
},
{
EntityWeaponAttackDummy,
func_ptr_80170004Dummy,
func_ptr_80170008Dummy,
func_ptr_8017000CDummy,
func_ptr_80170010Dummy,
func_ptr_80170014Dummy,
GetWeaponIdDummy,
LoadWeaponPaletteDummy,
EntityWeaponShieldSpellDummy,
func_ptr_80170024Dummy,
func_ptr_80170028Dummy,
},
{
EntityWeaponAttackDummy,
func_ptr_80170004Dummy,
func_ptr_80170008Dummy,
func_ptr_8017000CDummy,
func_ptr_80170010Dummy,
func_ptr_80170014Dummy,
GetWeaponIdDummy,
LoadWeaponPaletteDummy,
EntityWeaponShieldSpellDummy,
func_ptr_80170024Dummy,
func_ptr_80170028Dummy,
},
{
EntityWeaponAttackDummy,
func_ptr_80170004Dummy,
func_ptr_80170008Dummy,
func_ptr_8017000CDummy,
func_ptr_80170010Dummy,
func_ptr_80170014Dummy,
GetWeaponIdDummy,
LoadWeaponPaletteDummy,
EntityWeaponShieldSpellDummy,
func_ptr_80170024Dummy,
func_ptr_80170028Dummy,
},
{
EntityWeaponAttackDummy,
func_ptr_80170004Dummy,
func_ptr_80170008Dummy,
func_ptr_8017000CDummy,
func_ptr_80170010Dummy,
func_ptr_80170014Dummy,
GetWeaponIdDummy,
LoadWeaponPaletteDummy,
EntityWeaponShieldSpellDummy,
func_ptr_80170024Dummy,
func_ptr_80170028Dummy,
},
{
EntityWeaponAttackDummy,
func_ptr_80170004Dummy,
func_ptr_80170008Dummy,
func_ptr_8017000CDummy,
func_ptr_80170010Dummy,
func_ptr_80170014Dummy,
GetWeaponIdDummy,
LoadWeaponPaletteDummy,
EntityWeaponShieldSpellDummy,
func_ptr_80170024Dummy,
func_ptr_80170028Dummy,
},
{
EntityWeaponAttackDummy,
func_ptr_80170004Dummy,
func_ptr_80170008Dummy,
func_ptr_8017000CDummy,
func_ptr_80170010Dummy,
func_ptr_80170014Dummy,
GetWeaponIdDummy,
LoadWeaponPaletteDummy,
EntityWeaponShieldSpellDummy,
func_ptr_80170024Dummy,
func_ptr_80170028Dummy,
},
{
EntityWeaponAttackDummy,
func_ptr_80170004Dummy,
func_ptr_80170008Dummy,
func_ptr_8017000CDummy,
func_ptr_80170010Dummy,
func_ptr_80170014Dummy,
GetWeaponIdDummy,
LoadWeaponPaletteDummy,
EntityWeaponShieldSpellDummy,
func_ptr_80170024Dummy,
func_ptr_80170028Dummy,
},
{
EntityWeaponAttackDummy,
func_ptr_80170004Dummy,
func_ptr_80170008Dummy,
func_ptr_8017000CDummy,
func_ptr_80170010Dummy,
func_ptr_80170014Dummy,
GetWeaponIdDummy,
LoadWeaponPaletteDummy,
EntityWeaponShieldSpellDummy,
func_ptr_80170024Dummy,
func_ptr_80170028Dummy,
},
{
EntityWeaponAttackDummy,
func_ptr_80170004Dummy,
func_ptr_80170008Dummy,
func_ptr_8017000CDummy,
func_ptr_80170010Dummy,
func_ptr_80170014Dummy,
GetWeaponIdDummy,
LoadWeaponPaletteDummy,
EntityWeaponShieldSpellDummy,
func_ptr_80170024Dummy,
func_ptr_80170028Dummy,
},
{
EntityWeaponAttackDummy,
func_ptr_80170004Dummy,
func_ptr_80170008Dummy,
func_ptr_8017000CDummy,
func_ptr_80170010Dummy,
func_ptr_80170014Dummy,
GetWeaponIdDummy,
LoadWeaponPaletteDummy,
EntityWeaponShieldSpellDummy,
func_ptr_80170024Dummy,
func_ptr_80170028Dummy,
},
{
EntityWeaponAttackDummy,
func_ptr_80170004Dummy,
func_ptr_80170008Dummy,
func_ptr_8017000CDummy,
func_ptr_80170010Dummy,
func_ptr_80170014Dummy,
GetWeaponIdDummy,
LoadWeaponPaletteDummy,
EntityWeaponShieldSpellDummy,
func_ptr_80170024Dummy,
func_ptr_80170028Dummy,
},
{
EntityWeaponAttackDummy,
func_ptr_80170004Dummy,
func_ptr_80170008Dummy,
func_ptr_8017000CDummy,
func_ptr_80170010Dummy,
func_ptr_80170014Dummy,
GetWeaponIdDummy,
LoadWeaponPaletteDummy,
EntityWeaponShieldSpellDummy,
func_ptr_80170024Dummy,
func_ptr_80170028Dummy,
},
{
EntityWeaponAttackDummy,
func_ptr_80170004Dummy,
func_ptr_80170008Dummy,
func_ptr_8017000CDummy,
func_ptr_80170010Dummy,
func_ptr_80170014Dummy,
GetWeaponIdDummy,
LoadWeaponPaletteDummy,
EntityWeaponShieldSpellDummy,
func_ptr_80170024Dummy,
func_ptr_80170028Dummy,
},
{
EntityWeaponAttackDummy,
func_ptr_80170004Dummy,
func_ptr_80170008Dummy,
func_ptr_8017000CDummy,
func_ptr_80170010Dummy,
func_ptr_80170014Dummy,
GetWeaponIdDummy,
LoadWeaponPaletteDummy,
EntityWeaponShieldSpellDummy,
func_ptr_80170024Dummy,
func_ptr_80170028Dummy,
},
{
EntityWeaponAttackDummy,
func_ptr_80170004Dummy,
func_ptr_80170008Dummy,
func_ptr_8017000CDummy,
func_ptr_80170010Dummy,
func_ptr_80170014Dummy,
GetWeaponIdDummy,
LoadWeaponPaletteDummy,
EntityWeaponShieldSpellDummy,
func_ptr_80170024Dummy,
func_ptr_80170028Dummy,
},
{
EntityWeaponAttackDummy,
func_ptr_80170004Dummy,
func_ptr_80170008Dummy,
func_ptr_8017000CDummy,
func_ptr_80170010Dummy,
func_ptr_80170014Dummy,
GetWeaponIdDummy,
LoadWeaponPaletteDummy,
EntityWeaponShieldSpellDummy,
func_ptr_80170024Dummy,
func_ptr_80170028Dummy,
},
{
EntityWeaponAttackDummy,
func_ptr_80170004Dummy,
func_ptr_80170008Dummy,
func_ptr_8017000CDummy,
func_ptr_80170010Dummy,
func_ptr_80170014Dummy,
GetWeaponIdDummy,
LoadWeaponPaletteDummy,
EntityWeaponShieldSpellDummy,
func_ptr_80170024Dummy,
func_ptr_80170028Dummy,
},
{
EntityWeaponAttackDummy,
func_ptr_80170004Dummy,
func_ptr_80170008Dummy,
func_ptr_8017000CDummy,
func_ptr_80170010Dummy,
func_ptr_80170014Dummy,
GetWeaponIdDummy,
LoadWeaponPaletteDummy,
EntityWeaponShieldSpellDummy,
func_ptr_80170024Dummy,
func_ptr_80170028Dummy,
},
{
EntityWeaponAttackDummy,
func_ptr_80170004Dummy,
func_ptr_80170008Dummy,
func_ptr_8017000CDummy,
func_ptr_80170010Dummy,
func_ptr_80170014Dummy,
GetWeaponIdDummy,
LoadWeaponPaletteDummy,
EntityWeaponShieldSpellDummy,
func_ptr_80170024Dummy,
func_ptr_80170028Dummy,
},
{
EntityWeaponAttackDummy,
func_ptr_80170004Dummy,
func_ptr_80170008Dummy,
func_ptr_8017000CDummy,
func_ptr_80170010Dummy,
func_ptr_80170014Dummy,
GetWeaponIdDummy,
LoadWeaponPaletteDummy,
EntityWeaponShieldSpellDummy,
func_ptr_80170024Dummy,
func_ptr_80170028Dummy,
},
{
EntityWeaponAttackDummy,
func_ptr_80170004Dummy,
func_ptr_80170008Dummy,
func_ptr_8017000CDummy,
func_ptr_80170010Dummy,
func_ptr_80170014Dummy,
GetWeaponIdDummy,
LoadWeaponPaletteDummy,
EntityWeaponShieldSpellDummy,
func_ptr_80170024Dummy,
func_ptr_80170028Dummy,
},
{
EntityWeaponAttackDummy,
func_ptr_80170004Dummy,
func_ptr_80170008Dummy,
func_ptr_8017000CDummy,
func_ptr_80170010Dummy,
func_ptr_80170014Dummy,
GetWeaponIdDummy,
LoadWeaponPaletteDummy,
EntityWeaponShieldSpellDummy,
func_ptr_80170024Dummy,
func_ptr_80170028Dummy,
},
{
EntityWeaponAttackDummy,
func_ptr_80170004Dummy,
func_ptr_80170008Dummy,
func_ptr_8017000CDummy,
func_ptr_80170010Dummy,
func_ptr_80170014Dummy,
GetWeaponIdDummy,
LoadWeaponPaletteDummy,
EntityWeaponShieldSpellDummy,
func_ptr_80170024Dummy,
func_ptr_80170028Dummy,
},
{
EntityWeaponAttackDummy,
func_ptr_80170004Dummy,
func_ptr_80170008Dummy,
func_ptr_8017000CDummy,
func_ptr_80170010Dummy,
func_ptr_80170014Dummy,
GetWeaponIdDummy,
LoadWeaponPaletteDummy,
EntityWeaponShieldSpellDummy,
func_ptr_80170024Dummy,
func_ptr_80170028Dummy,
},
{
EntityWeaponAttackDummy,
func_ptr_80170004Dummy,
func_ptr_80170008Dummy,
func_ptr_8017000CDummy,
func_ptr_80170010Dummy,
func_ptr_80170014Dummy,
GetWeaponIdDummy,
LoadWeaponPaletteDummy,
EntityWeaponShieldSpellDummy,
func_ptr_80170024Dummy,
func_ptr_80170028Dummy,
},
{
EntityWeaponAttackDummy,
func_ptr_80170004Dummy,
func_ptr_80170008Dummy,
func_ptr_8017000CDummy,
func_ptr_80170010Dummy,
func_ptr_80170014Dummy,
GetWeaponIdDummy,
LoadWeaponPaletteDummy,
EntityWeaponShieldSpellDummy,
func_ptr_80170024Dummy,
func_ptr_80170028Dummy,
},
{
EntityWeaponAttackDummy,
func_ptr_80170004Dummy,
func_ptr_80170008Dummy,
func_ptr_8017000CDummy,
func_ptr_80170010Dummy,
func_ptr_80170014Dummy,
GetWeaponIdDummy,
LoadWeaponPaletteDummy,
EntityWeaponShieldSpellDummy,
func_ptr_80170024Dummy,
func_ptr_80170028Dummy,
},
{
EntityWeaponAttackDummy,
func_ptr_80170004Dummy,
func_ptr_80170008Dummy,
func_ptr_8017000CDummy,
func_ptr_80170010Dummy,
func_ptr_80170014Dummy,
GetWeaponIdDummy,
LoadWeaponPaletteDummy,
EntityWeaponShieldSpellDummy,
func_ptr_80170024Dummy,
func_ptr_80170028Dummy,
},
{
EntityWeaponAttackDummy,
func_ptr_80170004Dummy,
func_ptr_80170008Dummy,
func_ptr_8017000CDummy,
func_ptr_80170010Dummy,
func_ptr_80170014Dummy,
GetWeaponIdDummy,
LoadWeaponPaletteDummy,
EntityWeaponShieldSpellDummy,
func_ptr_80170024Dummy,
func_ptr_80170028Dummy,
}};
extern Weapon w_000_header;
Weapon* g_Weapons[] = {
&w_000_header, &dummy_header, &dummy_header, &dummy_header, &dummy_header,
&dummy_header, &dummy_header, &dummy_header, &dummy_header, &dummy_header,
&dummy_header, &dummy_header, &dummy_header, &dummy_header, &dummy_header,
&dummy_header, &dummy_header, &dummy_header, &dummy_header, &dummy_header,
&dummy_header, &dummy_header, &dummy_header, &dummy_header, &dummy_header,
&dummy_header, &dummy_header, &dummy_header, &dummy_header, &dummy_header,
&dummy_header, &dummy_header, &dummy_header, &dummy_header, &dummy_header,
&dummy_header, &dummy_header, &dummy_header, &dummy_header, &dummy_header,
&dummy_header, &dummy_header, &dummy_header, &dummy_header, &dummy_header,
&dummy_header, &dummy_header, &dummy_header, &dummy_header, &dummy_header,
&dummy_header, &dummy_header, &dummy_header, &dummy_header, &dummy_header,
&dummy_header, &dummy_header, &dummy_header, &dummy_header,
};
SpriteParts* g_Animset[1];
@ -863,7 +111,7 @@ int readSubsetToBuf(char* filename, char* dest, size_t start, size_t size) {
}
void HandleWeapon0Prg(int fileId) {
memcpy(&D_8017A000, &g_Weapons[fileId], sizeof(Weapon));
memcpy(&D_8017A000, g_Weapons[fileId], sizeof(Weapon));
// todo animsets
}

2
src/weapon/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
w_*_1.h
w_*_2.h

View File

@ -1,11 +0,0 @@
#include <weapon.h>
#include "weapon_private.h"
Weapon g_Weapon = {
EntityWeaponAttack, func_ptr_80170004, func_ptr_80170008,
func_ptr_8017000C, func_ptr_80170010, func_ptr_80170014,
GetWeaponId, LoadWeaponPalette, EntityWeaponShieldSpell,
func_ptr_80170024, func_ptr_80170028, WeaponUnused2C,
WeaponUnused30, WeaponUnused34, WeaponUnused38,
WeaponUnused3C,
};

View File

@ -2,7 +2,7 @@
#include "../destroy_entity.h"
void OVL_EXPORT(LoadWeaponPalette)(s32 clutIndex) {
static void LoadWeaponPalette(s32 clutIndex) {
RECT dstRect;
u16* src;
u16* dst;
@ -42,7 +42,7 @@ void OVL_EXPORT(LoadWeaponPalette)(s32 clutIndex) {
LoadImage(&dstRect, &D_8006EDCC);
}
void SetSpriteBank1(SpriteParts* animset) {
static void SetSpriteBank1(SpriteParts* animset) {
SpritePart** spriteBankDst = g_api.o.spriteBanks;
spriteBankDst += 0x10;
@ -52,7 +52,7 @@ void SetSpriteBank1(SpriteParts* animset) {
*spriteBankDst = animset;
}
void SetSpriteBank2(SpriteParts* animset) {
static void SetSpriteBank2(SpriteParts* animset) {
SpritePart** spriteBankDst = g_api.o.spriteBanks;
spriteBankDst += 0x11;
@ -63,7 +63,7 @@ void SetSpriteBank2(SpriteParts* animset) {
}
#if !defined(W_029) && !defined(W_030) && !defined(W_044) && !defined(W_051)
void SetWeaponAnimation(u8 anim) {
static void SetWeaponAnimation(u8 anim) {
g_CurrentEntity->ext.weapon.anim = anim;
g_CurrentEntity->animFrameDuration = 0;
g_CurrentEntity->animFrameIdx = 0;
@ -108,7 +108,7 @@ static void SetSpeedX(s32 speed) {
#endif
#if !defined(W_030) && !defined(W_051)
void DestroyEntityWeapon(bool arg0) {
static void DestroyEntityWeapon(bool arg0) {
if (arg0 == false) {
DestroyEntity(&g_Entities[E_WEAPON]);
}
@ -119,7 +119,7 @@ void DestroyEntityWeapon(bool arg0) {
}
#endif
void SetWeaponProperties(Entity* self, s32 kind) {
static void SetWeaponProperties(Entity* self, s32 kind) {
Equipment equip;
g_api.GetEquipProperties(g_HandId, &equip, self->ext.weapon.equipId);

View File

@ -5,10 +5,13 @@
// Mourneblade, Badelaire, Unknown#169
#include "weapon_private.h"
#include "shared.h"
#include "w_000_1.h"
#include "w_000_2.h"
#define g_Animset w_000_1
#define g_Animset2 w_000_2
#include "sfx.h"
u16 g_Clut0[] = {
static u16 g_Clut0[] = {
0x0000, 0x8000, 0xA821, 0x9DC0, 0xA821, 0xA821, 0xA821, 0xA821, // 0
0x843F, 0xB0E4, 0x9CA4, 0x0000, 0x0000, 0x0000, 0xD294, 0xF2F3,
0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0xED8C, 0xED8C, 0xED8C, // 1
@ -25,7 +28,7 @@ u16 g_Clut0[] = {
0x843F, 0xB9C0, 0x801F, 0x0000, 0x0000, 0x0000, 0xD294, 0xEA90,
};
u16 g_Clut1[] = {
static u16 g_Clut1[] = {
0x0000, 0x8007, 0xAD6B, 0xAD6B, 0xAD6B, 0xAD6B, 0xAD6B, 0xAD6B, // 0
0x843F, 0xB148, 0xA928, 0x0000, 0x0000, 0x0000, 0xD294, 0xF39C,
0x0000, 0x8007, 0x0000, 0x0000, 0x0000, 0xE717, 0xE717, 0xE717, // 1
@ -42,7 +45,7 @@ u16 g_Clut1[] = {
0x843F, 0xB9C0, 0x801F, 0x0000, 0x0000, 0x0000, 0xD294, 0xEB5A,
};
u16 g_Clut2[] = {
static u16 g_Clut2[] = {
0x0000, 0x8000, 0x800F, 0x800F, 0x800F, 0x800F, 0x800F, 0x800F, // 0
0x83E0, 0x800F, 0x8CB4, 0x0000, 0x0000, 0x0000, 0xD294, 0xCF1C,
0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0xA818, 0xB0B8, 0xAC38, // 1
@ -59,7 +62,7 @@ u16 g_Clut2[] = {
0x83E0, 0xB9C0, 0x801F, 0x0000, 0x0000, 0x0000, 0xD294, 0x9E1C,
};
u16 g_Clut3[] = {
static u16 g_Clut3[] = {
0x0000, 0x8000, 0x8900, 0x8900, 0x8900, 0x8900, 0x8902, 0x8904, // 0
0x843F, 0x9541, 0x95E1, 0x0000, 0x0000, 0x0000, 0xD294, 0xF2D1,
0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0xA208, 0xA208, 0xA208, // 1
@ -76,7 +79,7 @@ u16 g_Clut3[] = {
0x843F, 0xB9C0, 0x801F, 0x0000, 0x0000, 0x0000, 0xD294, 0xB792,
};
u16 g_Clut4[] = {
static u16 g_Clut4[] = {
0x0000, 0x8000, 0x817F, 0x81B6, 0x81DF, 0x827F, 0xA2FE, 0xD77F, // 0
0x843F, 0x819E, 0x9A1F, 0x0000, 0x0000, 0x0000, 0xD294, 0xF39C,
0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0xB77D, 0xB77D, 0xB77D, // 1
@ -93,69 +96,69 @@ u16 g_Clut4[] = {
0x843F, 0xB9C0, 0x801F, 0x0000, 0x0000, 0x0000, 0xD294, 0xF39C,
};
u8 g_Anim0Frame0[] = {
static u8 g_Anim0Frame0[] = {
0x01, 0x02, 0x02, 0x04, 0x03, 0x04, 0x04, 0x04, 0x05, 0x04,
0x06, 0x06, 0x07, 0x06, 0x08, 0x06, 0x09, 0x06, 0x0A, 0x08,
0x0B, 0x08, 0x0C, 0x08, 0x0D, 0x08, 0xFF, 0xFF,
};
u8 g_Anim0Frame1[] = {
static u8 g_Anim0Frame1[] = {
0x0E, 0x0A, 0x0F, 0x0C, 0x10, 0x0C, 0x11, 0x0C, 0x12, 0x0C,
0x13, 0x0E, 0x14, 0x0E, 0x15, 0x0E, 0x16, 0x0E, 0x1F, 0x08,
0x20, 0x08, 0x21, 0x08, 0x22, 0x08, 0xFF, 0xFF,
};
u8 g_Anim0Frame2[] = {
static u8 g_Anim0Frame2[] = {
0x0E, 0x0A, 0x17, 0x10, 0x18, 0x12, 0x19, 0x10, 0x1A, 0x12,
0x1B, 0x14, 0x1C, 0x14, 0x1D, 0x14, 0x1E, 0x14, 0x1F, 0x08,
0x20, 0x08, 0x21, 0x08, 0x22, 0x08, 0xFF, 0xFF};
u8 g_Anim0Frame3[] = {
static u8 g_Anim0Frame3[] = {
0x23, 0x16, 0x24, 0x18, 0x25, 0x18, 0x26, 0x18, 0x27, 0x18, 0x28, 0x1A,
0x29, 0x1A, 0x2A, 0x1A, 0x2B, 0x1A, 0x2C, 0x08, 0xFF, 0xFF, 0x00, 0x00};
u8 g_Anim0Frame4[] = {
static u8 g_Anim0Frame4[] = {
0x2D, 0x1C, 0x2E, 0x1E, 0x2F, 0x1E, 0x30, 0x1E, 0x31, 0x1E, 0x32, 0x20,
0x33, 0x20, 0x34, 0x20, 0x35, 0x20, 0x3E, 0x08, 0xFF, 0xFF, 0x00, 0x00};
u8 g_Anim0Frame5[] = {
static u8 g_Anim0Frame5[] = {
0x2D, 0x1C, 0x36, 0x22, 0x37, 0x22, 0x38, 0x22, 0x39, 0x22, 0x3A, 0x24,
0x3B, 0x24, 0x3C, 0x24, 0x3D, 0x24, 0x3E, 0x08, 0xFF, 0xFF, 0x00, 0x00};
u8 g_Anim1Frame0[] = {
static u8 g_Anim1Frame0[] = {
0x01, 0x02, 0x3F, 0x26, 0x40, 0x26, 0x41, 0x26, 0x06, 0x06,
0x07, 0x06, 0x08, 0x06, 0x09, 0x06, 0x0A, 0x08, 0x0B, 0x08,
0x0C, 0x08, 0x0D, 0x08, 0xFF, 0xFF, 0x00, 0x00,
};
u8 g_Anim1Frame1[] = {
static u8 g_Anim1Frame1[] = {
0x0E, 0x0A, 0x42, 0x28, 0x43, 0x28, 0x44, 0x28, 0x13, 0x0E,
0x14, 0x0E, 0x15, 0x0E, 0x16, 0x0E, 0x1F, 0x08, 0x20, 0x08,
0x21, 0x08, 0x22, 0x08, 0xFF, 0xFF, 0x00, 0x00,
};
u8 g_Anim1Frame2[] = {
static u8 g_Anim1Frame2[] = {
0x0E, 0x0A, 0x45, 0x2A, 0x46, 0x2A, 0x47, 0x2A, 0x1B, 0x14,
0x1C, 0x14, 0x1D, 0x14, 0x1E, 0x14, 0x1F, 0x08, 0x20, 0x08,
0x21, 0x08, 0x22, 0x08, 0xFF, 0xFF, 0x00, 0x00,
};
u8 g_Anim1Frame3[] = {
static u8 g_Anim1Frame3[] = {
0x23, 0x16, 0x48, 0x2C, 0x49, 0x2C, 0x4A, 0x2C, 0x28, 0x1A,
0x29, 0x1A, 0x2A, 0x1A, 0x2B, 0x1A, 0x2C, 0x08, 0xFF, 0xFF,
};
u8 g_Anim1Frame4[] = {
static u8 g_Anim1Frame4[] = {
0x2D, 0x1C, 0x4B, 0x2E, 0x4C, 0x2E, 0x4D, 0x2E, 0x32, 0x20,
0x33, 0x20, 0x34, 0x20, 0x35, 0x20, 0x3E, 0x08, 0xFF, 0xFF,
};
u8 g_Anim1Frame5[] = {
static u8 g_Anim1Frame5[] = {
0x2D, 0x1C, 0x4E, 0x30, 0x4F, 0x30, 0x50, 0x30, 0x3A, 0x24,
0x3B, 0x24, 0x3C, 0x24, 0x3D, 0x24, 0x3E, 0x08, 0xFF, 0xFF,
};
s8 g_Hitboxes[][4] = {
static s8 g_Hitboxes[][4] = {
{0, 0, 0, 0}, {4, -23, 8, 5}, {30, -17, 35, 8}, {30, -14, 18, 4},
{-32, -31, 0, 0}, {-4, -6, 8, 5}, {22, 0, 35, 8}, {22, 3, 18, 4},
{29, 22, 13, 11}, {12, 7, 19, 12}, {14, 14, 18, 4}, {1, -25, 8, 5},
@ -165,17 +168,17 @@ s8 g_Hitboxes[][4] = {
{22, 3, 26, 10},
};
u8* g_Anim0[] = {
static u8* g_Anim0[] = {
g_Anim0Frame0, g_Anim0Frame0, g_Anim0Frame1, g_Anim0Frame2,
g_Anim0Frame3, g_Anim0Frame4, g_Anim0Frame5,
};
u8* g_Anim1[] = {
static u8* g_Anim1[] = {
g_Anim1Frame0, g_Anim1Frame0, g_Anim1Frame1, g_Anim1Frame2,
g_Anim1Frame3, g_Anim1Frame4, g_Anim1Frame5,
};
WeaponAnimation g_SoundEvents[] = {
static WeaponAnimation g_SoundEvents[] = {
{g_Anim1, g_Hitboxes, 0, SFX_WEAPON_SWISH_B, 0x41, 4},
{g_Anim0, g_Hitboxes, 0, SFX_WEAPON_SWISH_B, 0x41, 4},
{g_Anim0, g_Hitboxes, 0, SFX_WEAPON_SWISH_C, 0x41, 4},
@ -183,13 +186,15 @@ WeaponAnimation g_SoundEvents[] = {
{g_Anim0, g_Hitboxes, 0, SFX_WEAPON_SWISH_C, 0x41, 4},
};
u16* g_WeaponCluts[] = {
static u16* g_WeaponCluts[] = {
g_Clut1, g_Clut0, g_Clut2, g_Clut3, g_Clut4,
};
s32 g_HandId = HAND_ID;
static s32 g_HandId = HAND_ID;
void OVL_EXPORT(EntityWeaponAttack)(Entity* self) {
#include "shared.h"
static void EntityWeaponAttack(Entity* self) {
WeaponAnimation* anim;
s32 mask;
s16 subType;
@ -242,30 +247,30 @@ void OVL_EXPORT(EntityWeaponAttack)(Entity* self) {
self->rotPivotY = PLAYER.rotPivotY;
}
s32 OVL_EXPORT(func_ptr_80170004)(Entity* self) {}
static s32 func_ptr_80170004(Entity* self) {}
void OVL_EXPORT(func_ptr_80170008)(Entity* self) {}
static void func_ptr_80170008(Entity* self) {}
void OVL_EXPORT(func_ptr_8017000C)(Entity* self) {}
static void func_ptr_8017000C(Entity* self) {}
s32 OVL_EXPORT(func_ptr_80170010)(Entity* self) {}
static s32 func_ptr_80170010(Entity* self) {}
s32 OVL_EXPORT(func_ptr_80170014)(Entity* self) {}
static s32 func_ptr_80170014(Entity* self) {}
int OVL_EXPORT(GetWeaponId)(void) { return 0; }
static int GetWeaponId(void) { return 0; }
void OVL_EXPORT(EntityWeaponShieldSpell)(Entity* self) {}
static void EntityWeaponShieldSpell(Entity* self) {}
void OVL_EXPORT(func_ptr_80170024)(Entity* self) {}
static void func_ptr_80170024(Entity* self) {}
void OVL_EXPORT(func_ptr_80170028)(Entity* self) {}
static void func_ptr_80170028(Entity* self) {}
void WeaponUnused2C(void) {}
static void WeaponUnused2C(void) {}
void WeaponUnused30(void) {}
static void WeaponUnused30(void) {}
void WeaponUnused34(void) {}
static void WeaponUnused34(void) {}
void WeaponUnused38(void) {}
static void WeaponUnused38(void) {}
void WeaponUnused3C(void) {}
static void WeaponUnused3C(void) {}

View File

@ -2,7 +2,13 @@
// Knuckle duster, Jewel knuckles, Iron Fist, Fist of Tulkas, Unknown#186,
// Unknown#187, Unknown#188
#include "weapon_private.h"
extern u16* g_WeaponCluts[];
extern s32 g_HandId;
#include "shared.h"
#include "w_001_1.h"
#include "w_001_2.h"
#define g_Animset w_001_1
#define g_Animset2 w_001_2
#include "sfx.h"
INCLUDE_ASM("weapon/nonmatchings/w_001", EntityWeaponAttack);
@ -11,7 +17,7 @@ INCLUDE_ASM("weapon/nonmatchings/w_001", func_ptr_80170004);
extern AnimationFrame D_B000_8017AFC8[];
void func_ptr_80170008(Entity* self) {
static void func_ptr_80170008(Entity* self) {
switch (self->step) {
case 0:
self->flags = FLAG_UNK_08000000 | FLAG_UNK_100000;
@ -57,26 +63,26 @@ void func_ptr_80170008(Entity* self) {
}
}
void func_ptr_8017000C(Entity* self) {}
static void func_ptr_8017000C(Entity* self) {}
s32 func_ptr_80170010(Entity* self) {}
static s32 func_ptr_80170010(Entity* self) {}
s32 func_ptr_80170014(Entity* self) {}
static s32 func_ptr_80170014(Entity* self) {}
int GetWeaponId(void) { return 1; }
static int GetWeaponId(void) { return 1; }
void EntityWeaponShieldSpell(Entity* self) {}
static void EntityWeaponShieldSpell(Entity* self) {}
void func_ptr_80170024(Entity* self) {}
static void func_ptr_80170024(Entity* self) {}
void func_ptr_80170028(Entity* self) {}
static void func_ptr_80170028(Entity* self) {}
void WeaponUnused2C(void) {}
static void WeaponUnused2C(void) {}
void WeaponUnused30(void) {}
static void WeaponUnused30(void) {}
void WeaponUnused34(void) {}
static void WeaponUnused34(void) {}
void WeaponUnused38(void) {}
static void WeaponUnused38(void) {}
void WeaponUnused3C(void) {}
static void WeaponUnused3C(void) {}

View File

@ -1,11 +1,17 @@
// Weapon ID #2. Used by weapons:
// Mace
#include "weapon_private.h"
extern u16* g_WeaponCluts[];
extern s32 g_HandId;
#include "shared.h"
#include "w_002_1.h"
#include "w_002_2.h"
#define g_Animset w_002_1
#define g_Animset2 w_002_2
extern WeaponAnimation D_12000_8017ABC4[];
void EntityWeaponAttack(Entity* self) {
static void EntityWeaponAttack(Entity* self) {
WeaponAnimation* anim;
s8 animIndex;
@ -57,28 +63,28 @@ void EntityWeaponAttack(Entity* self) {
s32 func_ptr_80170004(Entity* self) {}
void func_ptr_80170008(Entity* self) {}
static void func_ptr_80170008(Entity* self) {}
void func_ptr_8017000C(Entity* self) {}
static void func_ptr_8017000C(Entity* self) {}
s32 func_ptr_80170010(Entity* self) {}
static s32 func_ptr_80170010(Entity* self) {}
s32 func_ptr_80170014(Entity* self) {}
static s32 func_ptr_80170014(Entity* self) {}
int GetWeaponId(void) { return 2; }
static int GetWeaponId(void) { return 2; }
void EntityWeaponShieldSpell(Entity* self) {}
static void EntityWeaponShieldSpell(Entity* self) {}
void func_ptr_80170024(Entity* self) {}
static void func_ptr_80170024(Entity* self) {}
void func_ptr_80170028(Entity* self) {}
static void func_ptr_80170028(Entity* self) {}
void WeaponUnused2C(void) {}
static void WeaponUnused2C(void) {}
void WeaponUnused30(void) {}
static void WeaponUnused30(void) {}
void WeaponUnused34(void) {}
static void WeaponUnused34(void) {}
void WeaponUnused38(void) {}
static void WeaponUnused38(void) {}
void WeaponUnused3C(void) {}
static void WeaponUnused3C(void) {}

View File

@ -1,11 +1,17 @@
// Weapon ID #3. Used by weapons:
// Morningstar
#include "weapon_private.h"
extern u16* g_WeaponCluts[];
extern s32 g_HandId;
#include "shared.h"
#include "w_003_1.h"
#include "w_003_2.h"
#define g_Animset w_003_1
#define g_Animset2 w_003_2
extern WeaponAnimation D_19000_8017AC28[];
void EntityWeaponAttack(Entity* self) {
static void EntityWeaponAttack(Entity* self) {
WeaponAnimation* anim;
s8 animIndex;
@ -59,28 +65,28 @@ void EntityWeaponAttack(Entity* self) {
s32 func_ptr_80170004(Entity* self) {}
void func_ptr_80170008(Entity* self) {}
static void func_ptr_80170008(Entity* self) {}
void func_ptr_8017000C(Entity* self) {}
static void func_ptr_8017000C(Entity* self) {}
s32 func_ptr_80170010(Entity* self) {}
static s32 func_ptr_80170010(Entity* self) {}
s32 func_ptr_80170014(Entity* self) {}
static s32 func_ptr_80170014(Entity* self) {}
int GetWeaponId(void) { return 3; }
static int GetWeaponId(void) { return 3; }
void EntityWeaponShieldSpell(Entity* self) {}
static void EntityWeaponShieldSpell(Entity* self) {}
void func_ptr_80170024(Entity* self) {}
static void func_ptr_80170024(Entity* self) {}
void func_ptr_80170028(Entity* self) {}
static void func_ptr_80170028(Entity* self) {}
void WeaponUnused2C(void) {}
static void WeaponUnused2C(void) {}
void WeaponUnused30(void) {}
static void WeaponUnused30(void) {}
void WeaponUnused34(void) {}
static void WeaponUnused34(void) {}
void WeaponUnused38(void) {}
static void WeaponUnused38(void) {}
void WeaponUnused3C(void) {}
static void WeaponUnused3C(void) {}

View File

@ -1,12 +1,18 @@
// Weapon ID #4. Used by weapons:
// Holy rod, Unknown#170
#include "weapon_private.h"
extern u16* g_WeaponCluts[];
extern s32 g_HandId;
#include "shared.h"
#include "w_004_1.h"
#include "w_004_2.h"
#define g_Animset w_004_1
#define g_Animset2 w_004_2
#include "sfx.h"
extern WeaponAnimation D_20000_8017B2F4[]; // g_SoundEvents
void EntityWeaponAttack(Entity* self) {
static void EntityWeaponAttack(Entity* self) {
WeaponAnimation* anim;
s16 subType;
@ -60,28 +66,28 @@ void EntityWeaponAttack(Entity* self) {
s32 func_ptr_80170004(Entity* self) {}
void func_ptr_80170008(Entity* self) {}
static void func_ptr_80170008(Entity* self) {}
void func_ptr_8017000C(Entity* self) {}
static void func_ptr_8017000C(Entity* self) {}
s32 func_ptr_80170010(Entity* self) {}
static s32 func_ptr_80170010(Entity* self) {}
s32 func_ptr_80170014(Entity* self) {}
static s32 func_ptr_80170014(Entity* self) {}
int GetWeaponId(void) { return 4; }
static int GetWeaponId(void) { return 4; }
void EntityWeaponShieldSpell(Entity* self) {}
static void EntityWeaponShieldSpell(Entity* self) {}
void func_ptr_80170024(Entity* self) {}
static void func_ptr_80170024(Entity* self) {}
void func_ptr_80170028(Entity* self) {}
static void func_ptr_80170028(Entity* self) {}
void WeaponUnused2C(void) {}
static void WeaponUnused2C(void) {}
void WeaponUnused30(void) {}
static void WeaponUnused30(void) {}
void WeaponUnused34(void) {}
static void WeaponUnused34(void) {}
void WeaponUnused38(void) {}
static void WeaponUnused38(void) {}
void WeaponUnused3C(void) {}
static void WeaponUnused3C(void) {}

View File

@ -1,34 +1,40 @@
// Weapon ID #5. Used by weapons:
// Star flail, Unknown#171
#include "weapon_private.h"
extern u16* g_WeaponCluts[];
extern s32 g_HandId;
#include "shared.h"
#include "w_005_1.h"
#include "w_005_2.h"
#define g_Animset w_005_1
#define g_Animset2 w_005_2
INCLUDE_ASM("weapon/nonmatchings/w_005", EntityWeaponAttack);
s32 func_ptr_80170004(Entity* self) {}
void func_ptr_80170008(Entity* self) {}
static void func_ptr_80170008(Entity* self) {}
void func_ptr_8017000C(Entity* self) {}
static void func_ptr_8017000C(Entity* self) {}
s32 func_ptr_80170010(Entity* self) {}
static s32 func_ptr_80170010(Entity* self) {}
s32 func_ptr_80170014(Entity* self) {}
static s32 func_ptr_80170014(Entity* self) {}
int GetWeaponId(void) { return 5; }
static int GetWeaponId(void) { return 5; }
void EntityWeaponShieldSpell(Entity* self) {}
static void EntityWeaponShieldSpell(Entity* self) {}
void func_ptr_80170024(Entity* self) {}
static void func_ptr_80170024(Entity* self) {}
void func_ptr_80170028(Entity* self) {}
static void func_ptr_80170028(Entity* self) {}
void WeaponUnused2C(void) {}
static void WeaponUnused2C(void) {}
void WeaponUnused30(void) {}
static void WeaponUnused30(void) {}
void WeaponUnused34(void) {}
static void WeaponUnused34(void) {}
void WeaponUnused38(void) {}
static void WeaponUnused38(void) {}
void WeaponUnused3C(void) {}
static void WeaponUnused3C(void) {}

View File

@ -1,10 +1,16 @@
// Weapon ID #6. Used by weapons:
// Moon rod, Unknown#172
#include "weapon_private.h"
extern u16* g_WeaponCluts[];
extern s32 g_HandId;
#include "shared.h"
#include "w_006_1.h"
#include "w_006_2.h"
#define g_Animset w_006_1
#define g_Animset2 w_006_2
extern WeaponAnimation D_2E000_8017ABC4[];
void EntityWeaponAttack(Entity* self) {
static void EntityWeaponAttack(Entity* self) {
WeaponAnimation* anim;
s8 animIndex;
@ -148,26 +154,26 @@ void func_ptr_80170008(Entity* self) {
}
}
void func_ptr_8017000C(Entity* self) {}
static void func_ptr_8017000C(Entity* self) {}
s32 func_ptr_80170010(Entity* self) {}
static s32 func_ptr_80170010(Entity* self) {}
s32 func_ptr_80170014(Entity* self) {}
static s32 func_ptr_80170014(Entity* self) {}
int GetWeaponId(void) { return 6; }
static int GetWeaponId(void) { return 6; }
void EntityWeaponShieldSpell(Entity* self) {}
static void EntityWeaponShieldSpell(Entity* self) {}
void func_ptr_80170024(Entity* self) {}
static void func_ptr_80170024(Entity* self) {}
void func_ptr_80170028(Entity* self) {}
static void func_ptr_80170028(Entity* self) {}
void WeaponUnused2C(void) {}
static void WeaponUnused2C(void) {}
void WeaponUnused30(void) {}
static void WeaponUnused30(void) {}
void WeaponUnused34(void) {}
static void WeaponUnused34(void) {}
void WeaponUnused38(void) {}
static void WeaponUnused38(void) {}
void WeaponUnused3C(void) {}
static void WeaponUnused3C(void) {}

View File

@ -1,7 +1,13 @@
// Weapon ID #7. Used by weapons:
// Shield rod, Unknown#173
#include "weapon_private.h"
extern u16* g_WeaponCluts[];
extern s32 g_HandId;
#include "shared.h"
#include "w_007_1.h"
#include "w_007_2.h"
#define g_Animset w_007_1
#define g_Animset2 w_007_2
INCLUDE_ASM("weapon/nonmatchings/w_007", EntityWeaponAttack);
@ -57,7 +63,7 @@ s32 func_35000_8017B604(Primitive* prim, s32 x, s32 y) {
return 0;
}
void func_ptr_80170008(Entity* self) {
static void func_ptr_80170008(Entity* self) {
Primitive* prim;
s32 velocityX;
s32 range;
@ -98,26 +104,26 @@ void func_ptr_80170008(Entity* self) {
DestroyEntity(self);
}
}
void func_ptr_8017000C(Entity* self) {}
static void func_ptr_8017000C(Entity* self) {}
s32 func_ptr_80170010(Entity* self) {}
static s32 func_ptr_80170010(Entity* self) {}
s32 func_ptr_80170014(Entity* self) {}
static s32 func_ptr_80170014(Entity* self) {}
int GetWeaponId(void) { return 7; }
static int GetWeaponId(void) { return 7; }
void EntityWeaponShieldSpell(Entity* self) {}
static void EntityWeaponShieldSpell(Entity* self) {}
void func_ptr_80170024(Entity* self) {}
static void func_ptr_80170024(Entity* self) {}
void func_ptr_80170028(Entity* self) {}
static void func_ptr_80170028(Entity* self) {}
void WeaponUnused2C(void) {}
static void WeaponUnused2C(void) {}
void WeaponUnused30(void) {}
static void WeaponUnused30(void) {}
void WeaponUnused34(void) {}
static void WeaponUnused34(void) {}
void WeaponUnused38(void) {}
static void WeaponUnused38(void) {}
void WeaponUnused3C(void) {}
static void WeaponUnused3C(void) {}

View File

@ -1,13 +1,19 @@
// Weapon ID #8. Used by weapons:
// Leather shield, Unknown#203
#include "weapon_private.h"
extern u16* g_WeaponCluts[];
extern s32 g_HandId;
#include "shared.h"
#include "w_008_1.h"
#include "w_008_2.h"
#define g_Animset w_008_1
#define g_Animset2 w_008_2
extern SpriteParts D_3C000_8017A040[];
extern s8 D_3C000_8017A9F8;
extern AnimationFrame* D_3C000_8017AA40;
void EntityWeaponAttack(Entity* self) {
static void EntityWeaponAttack(Entity* self) {
s32 anim1;
s32 anim2;
s32 attackButton;
@ -143,28 +149,28 @@ void EntityWeaponAttack(Entity* self) {
s32 func_ptr_80170004(Entity* self) {}
void func_ptr_80170008(Entity* self) {}
static void func_ptr_80170008(Entity* self) {}
void func_ptr_8017000C(Entity* self) {}
static void func_ptr_8017000C(Entity* self) {}
s32 func_ptr_80170010(Entity* self) {}
static s32 func_ptr_80170010(Entity* self) {}
s32 func_ptr_80170014(Entity* self) {}
static s32 func_ptr_80170014(Entity* self) {}
int GetWeaponId(void) { return 8; }
static int GetWeaponId(void) { return 8; }
INCLUDE_ASM("weapon/nonmatchings/w_008", EntityWeaponShieldSpell);
void func_ptr_80170024(Entity* self) {}
static void func_ptr_80170024(Entity* self) {}
void func_ptr_80170028(Entity* self) {}
static void func_ptr_80170028(Entity* self) {}
void WeaponUnused2C(void) {}
static void WeaponUnused2C(void) {}
void WeaponUnused30(void) {}
static void WeaponUnused30(void) {}
void WeaponUnused34(void) {}
static void WeaponUnused34(void) {}
void WeaponUnused38(void) {}
static void WeaponUnused38(void) {}
void WeaponUnused3C(void) {}
static void WeaponUnused3C(void) {}

View File

@ -1,6 +1,12 @@
// Weapon ID #9. Used by weapons:
// Knight shield, Unknown#204
#include "weapon_private.h"
extern u16* g_WeaponCluts[];
extern s32 g_HandId;
#include "w_009_1.h"
#include "w_009_2.h"
#define g_Animset w_009_1
#define g_Animset2 w_009_2
#include "shared.h"
#include "sfx.h"
@ -9,7 +15,7 @@ extern s8 D_43000_8017A9F8;
extern AnimationFrame* D_43000_8017AA40;
extern s32 D_43000_8017AA78[];
void EntityWeaponAttack(Entity* self) {
static void EntityWeaponAttack(Entity* self) {
s32 anim1;
s32 anim2;
s32 attackButton;
@ -145,15 +151,15 @@ void EntityWeaponAttack(Entity* self) {
s32 func_ptr_80170004(Entity* self) {}
void func_ptr_80170008(Entity* self) {}
static void func_ptr_80170008(Entity* self) {}
void func_ptr_8017000C(Entity* self) {}
static void func_ptr_8017000C(Entity* self) {}
s32 func_ptr_80170010(Entity* self) {}
static s32 func_ptr_80170010(Entity* self) {}
s32 func_ptr_80170014(Entity* self) {}
static s32 func_ptr_80170014(Entity* self) {}
int GetWeaponId(void) { return 9; }
static int GetWeaponId(void) { return 9; }
void EntityWeaponShieldSpell(Entity* self) {
s16 back;
@ -423,16 +429,16 @@ void EntityWeaponShieldSpell(Entity* self) {
}
}
void func_ptr_80170024(Entity* self) {}
static void func_ptr_80170024(Entity* self) {}
void func_ptr_80170028(Entity* self) {}
static void func_ptr_80170028(Entity* self) {}
void WeaponUnused2C(void) {}
static void WeaponUnused2C(void) {}
void WeaponUnused30(void) {}
static void WeaponUnused30(void) {}
void WeaponUnused34(void) {}
static void WeaponUnused34(void) {}
void WeaponUnused38(void) {}
static void WeaponUnused38(void) {}
void WeaponUnused3C(void) {}
static void WeaponUnused3C(void) {}

View File

@ -1,7 +1,13 @@
// Weapon ID #10. Used by weapons:
// Iron shield, Unknown#205
#include "weapon_private.h"
extern u16* g_WeaponCluts[];
extern s32 g_HandId;
#include "shared.h"
#include "w_010_1.h"
#include "w_010_2.h"
#define g_Animset w_010_1
#define g_Animset2 w_010_2
#include "items.h"
#include "sfx.h"
@ -13,7 +19,7 @@ extern s16 D_4A000_8017ABDC[];
extern s32 D_4A000_8017CC1C; // g_DebugWaitInfoTimer
void DebugShowWaitInfo(const char* msg) {
static void DebugShowWaitInfo(const char* msg) {
g_CurrentBuffer = g_CurrentBuffer->next;
FntPrint(msg);
if (D_4A000_8017CC1C++ & 4) {
@ -26,14 +32,14 @@ void DebugShowWaitInfo(const char* msg) {
FntFlush(-1);
}
void DebugInputWait(const char* msg) {
static void DebugInputWait(const char* msg) {
while (PadRead(0))
DebugShowWaitInfo(msg);
while (!PadRead(0))
DebugShowWaitInfo(msg);
}
void EntityWeaponAttack(Entity* self) {
static void EntityWeaponAttack(Entity* self) {
s32 anim1;
s32 anim2;
s32 attackButton;
@ -205,15 +211,15 @@ s32 func_ptr_80170004(Entity* self) {
}
}
void func_ptr_80170008(Entity* self) {}
static void func_ptr_80170008(Entity* self) {}
void func_ptr_8017000C(Entity* self) {}
static void func_ptr_8017000C(Entity* self) {}
s32 func_ptr_80170010(Entity* self) {}
static s32 func_ptr_80170010(Entity* self) {}
s32 func_ptr_80170014(Entity* self) {}
static s32 func_ptr_80170014(Entity* self) {}
int GetWeaponId(void) { return 10; }
static int GetWeaponId(void) { return 10; }
void EntityWeaponShieldSpell(Entity* self) {
Entity* unusedEnt;
@ -652,14 +658,14 @@ void func_ptr_80170024(Entity* self) {
}
}
void func_ptr_80170028(Entity* self) {}
static void func_ptr_80170028(Entity* self) {}
void WeaponUnused2C(void) {}
static void WeaponUnused2C(void) {}
void WeaponUnused30(void) {}
static void WeaponUnused30(void) {}
void WeaponUnused34(void) {}
static void WeaponUnused34(void) {}
void WeaponUnused38(void) {}
static void WeaponUnused38(void) {}
void WeaponUnused3C(void) {}
static void WeaponUnused3C(void) {}

View File

@ -1,19 +1,24 @@
// Weapon ID #11. Used by weapons:
// AxeLord shield, Unknown#206
#include "weapon_private.h"
extern u16* g_WeaponCluts[];
extern s32 g_HandId;
#include "shared.h"
#include "w_011_1.h"
#include "w_011_2.h"
#define g_Animset w_011_1
#define g_Animset2 w_011_2
#include "sfx.h"
extern SpriteParts D_51000_8017A040[];
extern s8 D_51000_8017AB4C;
extern AnimationFrame* D_51000_8017AB94;
extern AnimationFrame D_51000_8017ABCC[];
extern AnimationFrame D_51000_8017ABE8[];
extern s32 D_51000_8017ABF4[];
void EntityWeaponAttack(Entity* self) {
static void EntityWeaponAttack(Entity* self) {
s32 anim1;
s32 anim2;
s32 attackButton;
@ -149,15 +154,15 @@ void EntityWeaponAttack(Entity* self) {
s32 func_ptr_80170004(Entity* self) {}
void func_ptr_80170008(Entity* self) {}
static void func_ptr_80170008(Entity* self) {}
void func_ptr_8017000C(Entity* self) {}
static void func_ptr_8017000C(Entity* self) {}
s32 func_ptr_80170010(Entity* self) {}
static s32 func_ptr_80170010(Entity* self) {}
s32 func_ptr_80170014(Entity* self) {}
static s32 func_ptr_80170014(Entity* self) {}
int GetWeaponId(void) { return 11; }
static int GetWeaponId(void) { return 11; }
void EntityWeaponShieldSpell(Entity* self) {
Primitive* prim;
@ -420,7 +425,7 @@ void EntityWeaponShieldSpell(Entity* self) {
}
}
void func_ptr_80170024(Entity* self) {
static void func_ptr_80170024(Entity* self) {
Collider collider;
Entity* unusedEnt;
@ -630,14 +635,15 @@ void func_ptr_80170024(Entity* self) {
}
self->ext.timer.t++;
}
void func_ptr_80170028(Entity* self) {}
void WeaponUnused2C(void) {}
static void func_ptr_80170028(Entity* self) {}
void WeaponUnused30(void) {}
static void WeaponUnused2C(void) {}
void WeaponUnused34(void) {}
static void WeaponUnused30(void) {}
void WeaponUnused38(void) {}
static void WeaponUnused34(void) {}
void WeaponUnused3C(void) {}
static void WeaponUnused38(void) {}
static void WeaponUnused3C(void) {}

View File

@ -1,13 +1,19 @@
// Weapon ID #12. Used by weapons:
// Chakram, Vorpal blade, Crissaegrim
#include "weapon_private.h"
extern u16* g_WeaponCluts[];
extern s32 g_HandId;
#include "shared.h"
#include "w_012_1.h"
#include "w_012_2.h"
#define g_Animset w_012_1
#define g_Animset2 w_012_2
INCLUDE_ASM("weapon/nonmatchings/w_012", EntityWeaponAttack);
INCLUDE_ASM("weapon/nonmatchings/w_012", func_ptr_80170004);
void func_ptr_80170008(Entity* self) {
static void func_ptr_80170008(Entity* self) {
if (self->step == 0) {
if (self->ext.weapon.parent->entityId == 0) {
DestroyEntity(self);
@ -32,26 +38,26 @@ void func_ptr_80170008(Entity* self) {
DestroyEntity(self);
}
void func_ptr_8017000C(Entity* self) {}
static void func_ptr_8017000C(Entity* self) {}
s32 func_ptr_80170010(Entity* self) {}
static s32 func_ptr_80170010(Entity* self) {}
s32 func_ptr_80170014(Entity* self) {}
static s32 func_ptr_80170014(Entity* self) {}
int GetWeaponId(void) { return 12; }
static int GetWeaponId(void) { return 12; }
void EntityWeaponShieldSpell(Entity* self) {}
static void EntityWeaponShieldSpell(Entity* self) {}
void func_ptr_80170024(Entity* self) {}
static void func_ptr_80170024(Entity* self) {}
void func_ptr_80170028(Entity* self) {}
static void func_ptr_80170028(Entity* self) {}
void WeaponUnused2C(void) {}
static void WeaponUnused2C(void) {}
void WeaponUnused30(void) {}
static void WeaponUnused30(void) {}
void WeaponUnused34(void) {}
static void WeaponUnused34(void) {}
void WeaponUnused38(void) {}
static void WeaponUnused38(void) {}
void WeaponUnused3C(void) {}
static void WeaponUnused3C(void) {}

View File

@ -7,7 +7,13 @@
// the entities. They interact weirdly and seem to not line up.
#include "weapon_private.h"
extern u16* g_WeaponCluts[];
extern s32 g_HandId;
#include "shared.h"
#include "w_013_1.h"
#include "w_013_2.h"
#define g_Animset w_013_1
#define g_Animset2 w_013_2
#include "sfx.h"
extern SpriteParts D_5F000_8017A040[];
@ -62,7 +68,7 @@ s32 func_5F000_8017A9CC(Primitive* prim, s32 x, s32 y) {
return 0;
}
void EntityWeaponAttack(Entity* self) {
static void EntityWeaponAttack(Entity* self) {
Entity* unused;
s16 var_s1;
@ -232,7 +238,7 @@ s32 func_ptr_80170004(Entity* self) {
DestroyEntity(self);
}
void func_ptr_80170008(Entity* self) {
static void func_ptr_80170008(Entity* self) {
Entity* ents2;
Primitive* prim;
s16 angle;
@ -411,7 +417,7 @@ void func_ptr_80170008(Entity* self) {
// Pay attention to unk80, unk8A, and childPalette. These all seem to be
// special for Heaven Sword and we should probably have it as a special weapon.
void func_ptr_8017000C(Entity* self) {
static void func_ptr_8017000C(Entity* self) {
s16 angle;
if (self->ext.weapon.parent->entityId == 0) {
@ -473,24 +479,24 @@ void func_ptr_8017000C(Entity* self) {
}
}
s32 func_ptr_80170010(Entity* self) {}
static s32 func_ptr_80170010(Entity* self) {}
s32 func_ptr_80170014(Entity* self) {}
static s32 func_ptr_80170014(Entity* self) {}
int GetWeaponId(void) { return 13; }
static int GetWeaponId(void) { return 13; }
void EntityWeaponShieldSpell(Entity* self) {}
static void EntityWeaponShieldSpell(Entity* self) {}
void func_ptr_80170024(Entity* self) {}
static void func_ptr_80170024(Entity* self) {}
void func_ptr_80170028(Entity* self) {}
static void func_ptr_80170028(Entity* self) {}
void WeaponUnused2C(void) {}
static void WeaponUnused2C(void) {}
void WeaponUnused30(void) {}
static void WeaponUnused30(void) {}
void WeaponUnused34(void) {}
static void WeaponUnused34(void) {}
void WeaponUnused38(void) {}
static void WeaponUnused38(void) {}
void WeaponUnused3C(void) {}
static void WeaponUnused3C(void) {}

View File

@ -1,7 +1,13 @@
// Weapon ID #14. Used by weapons:
// Runesword
#include "weapon_private.h"
extern u16* g_WeaponCluts[];
extern s32 g_HandId;
#include "shared.h"
#include "w_014_1.h"
#include "w_014_2.h"
#define g_Animset w_014_1
#define g_Animset2 w_014_2
INCLUDE_ASM("weapon/nonmatchings/w_014", EntityWeaponAttack);
@ -55,28 +61,28 @@ s32 func_ptr_80170004(Entity* self) {
self->posY.i.hi = baseY + self->ext.weapon.parent->posY.i.hi;
}
void func_ptr_80170008(Entity* self) {}
static void func_ptr_80170008(Entity* self) {}
void func_ptr_8017000C(Entity* self) {}
static void func_ptr_8017000C(Entity* self) {}
s32 func_ptr_80170010(Entity* self) {}
static s32 func_ptr_80170010(Entity* self) {}
s32 func_ptr_80170014(Entity* self) {}
static s32 func_ptr_80170014(Entity* self) {}
int GetWeaponId(void) { return 14; }
static int GetWeaponId(void) { return 14; }
void EntityWeaponShieldSpell(Entity* self) {}
static void EntityWeaponShieldSpell(Entity* self) {}
void func_ptr_80170024(Entity* self) {}
static void func_ptr_80170024(Entity* self) {}
void func_ptr_80170028(Entity* self) {}
static void func_ptr_80170028(Entity* self) {}
void WeaponUnused2C(void) {}
static void WeaponUnused2C(void) {}
void WeaponUnused30(void) {}
static void WeaponUnused30(void) {}
void WeaponUnused34(void) {}
static void WeaponUnused34(void) {}
void WeaponUnused38(void) {}
static void WeaponUnused38(void) {}
void WeaponUnused3C(void) {}
static void WeaponUnused3C(void) {}

View File

@ -1,7 +1,13 @@
// Weapon ID #15. Used by weapons:
// Shuriken, Cross shuriken, Buffalo star, Flame star, TNT
#include "weapon_private.h"
extern u16* g_WeaponCluts[];
extern s32 g_HandId;
#include "shared.h"
#include "w_015_1.h"
#include "w_015_2.h"
#define g_Animset w_015_1
#define g_Animset2 w_015_2
INCLUDE_ASM("weapon/nonmatchings/w_015", EntityWeaponAttack);
@ -32,7 +38,7 @@ s32 func_ptr_80170004(Entity* self) {
extern AnimationFrame D_6D000_8017A6C0[];
extern s32 D_6D000_8017BFC8;
void func_ptr_80170008(Entity* self) {
static void func_ptr_80170008(Entity* self) {
Entity* factory;
if (self->step == 0) {
@ -77,7 +83,7 @@ INCLUDE_ASM("weapon/nonmatchings/w_015", func_ptr_80170010);
extern SpriteParts D_6D000_8017A2B0[];
extern AnimationFrame D_6D000_8017A770[];
s32 func_ptr_80170014(Entity* self) {
static s32 func_ptr_80170014(Entity* self) {
s16 angle;
if (self->step == 0) {
@ -122,20 +128,20 @@ s32 func_ptr_80170014(Entity* self) {
self->velocityY += self->ext.weapon.accelerationY;
}
int GetWeaponId(void) { return 15; }
static int GetWeaponId(void) { return 15; }
void EntityWeaponShieldSpell(Entity* self) {}
static void EntityWeaponShieldSpell(Entity* self) {}
void func_ptr_80170024(Entity* self) {}
static void func_ptr_80170024(Entity* self) {}
void func_ptr_80170028(Entity* self) {}
static void func_ptr_80170028(Entity* self) {}
void WeaponUnused2C(void) {}
static void WeaponUnused2C(void) {}
void WeaponUnused30(void) {}
static void WeaponUnused30(void) {}
void WeaponUnused34(void) {}
static void WeaponUnused34(void) {}
void WeaponUnused38(void) {}
static void WeaponUnused38(void) {}
void WeaponUnused3C(void) {}
static void WeaponUnused3C(void) {}

View File

@ -1,13 +1,19 @@
// Weapon ID #16. Used by weapons:
// Bwaka knife, Boomerang, Javelin, Fire boomerang, Iron ball
#include "weapon_private.h"
extern u16* g_WeaponCluts[];
extern s32 g_HandId;
#include "shared.h"
#include "w_016_1.h"
#include "w_016_2.h"
#define g_Animset w_016_1
#define g_Animset2 w_016_2
#include "sfx.h"
// Weapon 16
extern SpriteParts D_74000_8017A040[];
void EntityWeaponAttack(Entity* self) {
static void EntityWeaponAttack(Entity* self) {
FakePrim* fakePrim;
s16 angle;
u16 temp_a0;
@ -129,7 +135,7 @@ s32 func_ptr_80170004(Entity* self) {
INCLUDE_ASM("weapon/nonmatchings/w_016", func_ptr_80170008);
void func_ptr_8017000C(Entity* self) {
static void func_ptr_8017000C(Entity* self) {
s16 temp_a0;
switch (self->step) {
@ -218,7 +224,7 @@ s32 func_ptr_80170010(Entity* self) {
// Tracing function calls in emulator indicates that this function manages
// the physics for the Iron Ball item.
s32 func_ptr_80170014(Entity* self) {
static s32 func_ptr_80170014(Entity* self) {
Collider collider;
s16 collX;
s16 collY;
@ -410,20 +416,20 @@ s32 func_ptr_80170014(Entity* self) {
}
}
int GetWeaponId(void) { return 16; }
static int GetWeaponId(void) { return 16; }
void EntityWeaponShieldSpell(Entity* self) {}
static void EntityWeaponShieldSpell(Entity* self) {}
void func_ptr_80170024(Entity* self) {}
static void func_ptr_80170024(Entity* self) {}
void func_ptr_80170028(Entity* self) {}
static void func_ptr_80170028(Entity* self) {}
void WeaponUnused2C(void) {}
static void WeaponUnused2C(void) {}
void WeaponUnused30(void) {}
static void WeaponUnused30(void) {}
void WeaponUnused34(void) {}
static void WeaponUnused34(void) {}
void WeaponUnused38(void) {}
static void WeaponUnused38(void) {}
void WeaponUnused3C(void) {}
static void WeaponUnused3C(void) {}

View File

@ -1,34 +1,40 @@
// Weapon ID #17. Used by weapons:
// Pentagram, Bat Pentagram
#include "weapon_private.h"
extern u16* g_WeaponCluts[];
extern s32 g_HandId;
#include "shared.h"
#include "w_017_1.h"
#include "w_017_2.h"
#define g_Animset w_017_1
#define g_Animset2 w_017_2
INCLUDE_ASM("weapon/nonmatchings/w_017", EntityWeaponAttack);
s32 func_ptr_80170004(Entity* self) {}
void func_ptr_80170008(Entity* self) {}
static void func_ptr_80170008(Entity* self) {}
void func_ptr_8017000C(Entity* self) {}
static void func_ptr_8017000C(Entity* self) {}
s32 func_ptr_80170010(Entity* self) {}
static s32 func_ptr_80170010(Entity* self) {}
s32 func_ptr_80170014(Entity* self) {}
static s32 func_ptr_80170014(Entity* self) {}
int GetWeaponId(void) { return 17; }
static int GetWeaponId(void) { return 17; }
void EntityWeaponShieldSpell(Entity* self) {}
static void EntityWeaponShieldSpell(Entity* self) {}
void func_ptr_80170024(Entity* self) {}
static void func_ptr_80170024(Entity* self) {}
void func_ptr_80170028(Entity* self) {}
static void func_ptr_80170028(Entity* self) {}
void WeaponUnused2C(void) {}
static void WeaponUnused2C(void) {}
void WeaponUnused30(void) {}
static void WeaponUnused30(void) {}
void WeaponUnused34(void) {}
static void WeaponUnused34(void) {}
void WeaponUnused38(void) {}
static void WeaponUnused38(void) {}
void WeaponUnused3C(void) {}
static void WeaponUnused3C(void) {}

View File

@ -1,12 +1,18 @@
// Weapon ID #18. Used by weapons:
// Power of Sire
#include "weapon_private.h"
extern u16* g_WeaponCluts[];
extern s32 g_HandId;
#include "shared.h"
#include "w_018_1.h"
#include "w_018_2.h"
#define g_Animset w_018_1
#define g_Animset2 w_018_2
extern const char D_82000_8017A73C[]; // "\no\n"
extern s32 D_82000_8017B1B4; // g_DebugWaitInfoTimer
void DebugShowWaitInfo(const char* msg) {
static void DebugShowWaitInfo(const char* msg) {
g_CurrentBuffer = g_CurrentBuffer->next;
FntPrint(msg);
if (D_82000_8017B1B4++ & 4) {
@ -19,7 +25,7 @@ void DebugShowWaitInfo(const char* msg) {
FntFlush(-1);
}
void DebugInputWait(const char* msg) {
static void DebugInputWait(const char* msg) {
while (PadRead(0))
DebugShowWaitInfo(msg);
while (!PadRead(0))
@ -93,28 +99,28 @@ s32 func_ptr_80170004(Entity* self) {
}
}
void func_ptr_80170008(Entity* self) {}
static void func_ptr_80170008(Entity* self) {}
void func_ptr_8017000C(Entity* self) {}
static void func_ptr_8017000C(Entity* self) {}
s32 func_ptr_80170010(Entity* self) {}
static s32 func_ptr_80170010(Entity* self) {}
s32 func_ptr_80170014(Entity* self) {}
static s32 func_ptr_80170014(Entity* self) {}
int GetWeaponId(void) { return 18; }
static int GetWeaponId(void) { return 18; }
void EntityWeaponShieldSpell(Entity* self) {}
static void EntityWeaponShieldSpell(Entity* self) {}
void func_ptr_80170024(Entity* self) {}
static void func_ptr_80170024(Entity* self) {}
void func_ptr_80170028(Entity* self) {}
static void func_ptr_80170028(Entity* self) {}
void WeaponUnused2C(void) {}
static void WeaponUnused2C(void) {}
void WeaponUnused30(void) {}
static void WeaponUnused30(void) {}
void WeaponUnused34(void) {}
static void WeaponUnused34(void) {}
void WeaponUnused38(void) {}
static void WeaponUnused38(void) {}
void WeaponUnused3C(void) {}
static void WeaponUnused3C(void) {}

View File

@ -1,34 +1,40 @@
// Weapon ID #19. Used by weapons:
// Neutron bomb
#include "weapon_private.h"
extern u16* g_WeaponCluts[];
extern s32 g_HandId;
#include "shared.h"
#include "w_019_1.h"
#include "w_019_2.h"
#define g_Animset w_019_1
#define g_Animset2 w_019_2
INCLUDE_ASM("weapon/nonmatchings/w_019", EntityWeaponAttack);
s32 func_ptr_80170004(Entity* self) {}
void func_ptr_80170008(Entity* self) {}
static void func_ptr_80170008(Entity* self) {}
void func_ptr_8017000C(Entity* self) {}
static void func_ptr_8017000C(Entity* self) {}
s32 func_ptr_80170010(Entity* self) {}
static s32 func_ptr_80170010(Entity* self) {}
s32 func_ptr_80170014(Entity* self) {}
static s32 func_ptr_80170014(Entity* self) {}
int GetWeaponId(void) { return 19; }
static int GetWeaponId(void) { return 19; }
void EntityWeaponShieldSpell(Entity* self) {}
static void EntityWeaponShieldSpell(Entity* self) {}
void func_ptr_80170024(Entity* self) {}
static void func_ptr_80170024(Entity* self) {}
void func_ptr_80170028(Entity* self) {}
static void func_ptr_80170028(Entity* self) {}
void WeaponUnused2C(void) {}
static void WeaponUnused2C(void) {}
void WeaponUnused30(void) {}
static void WeaponUnused30(void) {}
void WeaponUnused34(void) {}
static void WeaponUnused34(void) {}
void WeaponUnused38(void) {}
static void WeaponUnused38(void) {}
void WeaponUnused3C(void) {}
static void WeaponUnused3C(void) {}

View File

@ -1,7 +1,13 @@
// Weapon ID #20. Used by weapons:
// Karma Coin
#include "weapon_private.h"
extern u16* g_WeaponCluts[];
extern s32 g_HandId;
#include "shared.h"
#include "w_020_1.h"
#include "w_020_2.h"
#define g_Animset w_020_1
#define g_Animset2 w_020_2
#include "sfx.h"
extern SpriteParts D_90000_8017A040[];
@ -19,7 +25,7 @@ extern s32 D_90000_8017AADC[];
extern s32 D_90000_8017AB44[];
extern s32 D_90000_8017C238;
void EntityWeaponAttack(Entity* self) {
static void EntityWeaponAttack(Entity* self) {
Collider sp10;
Entity* child;
Primitive* prim;
@ -423,7 +429,7 @@ void EntityWeaponAttack(Entity* self) {
s32 func_ptr_80170004(Entity* self) {}
void func_ptr_80170008(Entity* self) {
static void func_ptr_80170008(Entity* self) {
if (self->ext.weapon.parent->entityId == 0) {
DestroyEntity(self);
return;
@ -461,26 +467,26 @@ void func_ptr_80170008(Entity* self) {
self->posY.val += self->velocityY;
}
void func_ptr_8017000C(Entity* self) {}
static void func_ptr_8017000C(Entity* self) {}
s32 func_ptr_80170010(Entity* self) {}
static s32 func_ptr_80170010(Entity* self) {}
s32 func_ptr_80170014(Entity* self) {}
static s32 func_ptr_80170014(Entity* self) {}
int GetWeaponId(void) { return 20; }
static int GetWeaponId(void) { return 20; }
void EntityWeaponShieldSpell(Entity* self) {}
static void EntityWeaponShieldSpell(Entity* self) {}
void func_ptr_80170024(Entity* self) {}
static void func_ptr_80170024(Entity* self) {}
void func_ptr_80170028(Entity* self) {}
static void func_ptr_80170028(Entity* self) {}
void WeaponUnused2C(void) {}
static void WeaponUnused2C(void) {}
void WeaponUnused30(void) {}
static void WeaponUnused30(void) {}
void WeaponUnused34(void) {}
static void WeaponUnused34(void) {}
void WeaponUnused38(void) {}
static void WeaponUnused38(void) {}
void WeaponUnused3C(void) {}
static void WeaponUnused3C(void) {}

View File

@ -6,7 +6,13 @@
// tea, Green tea, Natou, Ramen, Miso soup, Sushi, Pork bun, Red bean bun,
// Chinese bun, Dim Sum set, Pot roast, Sirloin, Turkey, Meal ticket
#include "weapon_private.h"
extern u16* g_WeaponCluts[];
extern s32 g_HandId;
#include "shared.h"
#include "w_021_1.h"
#include "w_021_2.h"
#define g_Animset w_021_1
#define g_Animset2 w_021_2
extern SpriteParts D_97000_8017A040[];
@ -209,7 +215,7 @@ s32 func_97000_8017AF2C(Entity* self, s32 arg1) {
return 1;
}
void EntityWeaponAttack(Entity* self) {
static void EntityWeaponAttack(Entity* self) {
Collider sp10;
s16 xShift;
s16 yShift;
@ -524,28 +530,28 @@ s32 func_ptr_80170004(Entity* self) {
}
}
void func_ptr_80170008(Entity* self) {}
static void func_ptr_80170008(Entity* self) {}
void func_ptr_8017000C(Entity* self) {}
static void func_ptr_8017000C(Entity* self) {}
s32 func_ptr_80170010(Entity* self) {}
static s32 func_ptr_80170010(Entity* self) {}
s32 func_ptr_80170014(Entity* self) {}
static s32 func_ptr_80170014(Entity* self) {}
int GetWeaponId(void) { return 21; }
static int GetWeaponId(void) { return 21; }
void EntityWeaponShieldSpell(Entity* self) {}
static void EntityWeaponShieldSpell(Entity* self) {}
void func_ptr_80170024(Entity* self) {}
static void func_ptr_80170024(Entity* self) {}
void func_ptr_80170028(Entity* self) {}
static void func_ptr_80170028(Entity* self) {}
void WeaponUnused2C(void) {}
static void WeaponUnused2C(void) {}
void WeaponUnused30(void) {}
static void WeaponUnused30(void) {}
void WeaponUnused34(void) {}
static void WeaponUnused34(void) {}
void WeaponUnused38(void) {}
static void WeaponUnused38(void) {}
void WeaponUnused3C(void) {}
static void WeaponUnused3C(void) {}

View File

@ -1,7 +1,13 @@
// Weapon ID #22. Used by weapons:
// Magic Missile
#include "weapon_private.h"
extern u16* g_WeaponCluts[];
extern s32 g_HandId;
#include "shared.h"
#include "w_022_1.h"
#include "w_022_2.h"
#define g_Animset w_022_1
#define g_Animset2 w_022_2
extern AnimationFrame D_9E000_8017A760[];
extern AnimationFrame D_9E000_8017A800[];
@ -102,28 +108,28 @@ s32 func_ptr_80170004(Entity* self) {
}
}
void func_ptr_80170008(Entity* self) {}
static void func_ptr_80170008(Entity* self) {}
void func_ptr_8017000C(Entity* self) {}
static void func_ptr_8017000C(Entity* self) {}
s32 func_ptr_80170010(Entity* self) {}
static s32 func_ptr_80170010(Entity* self) {}
s32 func_ptr_80170014(Entity* self) {}
static s32 func_ptr_80170014(Entity* self) {}
int GetWeaponId(void) { return 22; }
static int GetWeaponId(void) { return 22; }
void EntityWeaponShieldSpell(Entity* self) {}
static void EntityWeaponShieldSpell(Entity* self) {}
void func_ptr_80170024(Entity* self) {}
static void func_ptr_80170024(Entity* self) {}
void func_ptr_80170028(Entity* self) {}
static void func_ptr_80170028(Entity* self) {}
void WeaponUnused2C(void) {}
static void WeaponUnused2C(void) {}
void WeaponUnused30(void) {}
static void WeaponUnused30(void) {}
void WeaponUnused34(void) {}
static void WeaponUnused34(void) {}
void WeaponUnused38(void) {}
static void WeaponUnused38(void) {}
void WeaponUnused3C(void) {}
static void WeaponUnused3C(void) {}

View File

@ -1,6 +1,12 @@
// Weapon ID #23. Used by weapons:
// Herald shield, Unknown#207
#include "weapon_private.h"
extern u16* g_WeaponCluts[];
extern s32 g_HandId;
#include "w_023_1.h"
#include "w_023_2.h"
#define g_Animset w_023_1
#define g_Animset2 w_023_2
#include "shared.h"
#include "sfx.h"
@ -15,7 +21,7 @@ extern s32 D_A5000_8017AC50[];
extern SVECTOR* D_A5000_8017AC90[];
extern VECTOR D_A5000_8017ACD8;
void EntityWeaponAttack(Entity* self) {
static void EntityWeaponAttack(Entity* self) {
s32 anim1;
s32 anim2;
s32 attackButton;
@ -163,17 +169,17 @@ void EntityWeaponAttack(Entity* self) {
s32 func_ptr_80170004(Entity* self) {}
void func_ptr_80170008(Entity* self) {}
static void func_ptr_80170008(Entity* self) {}
void func_ptr_8017000C(Entity* self) {}
static void func_ptr_8017000C(Entity* self) {}
s32 func_ptr_80170010(Entity* self) {}
static s32 func_ptr_80170010(Entity* self) {}
s32 func_ptr_80170014(Entity* self) {}
static s32 func_ptr_80170014(Entity* self) {}
int GetWeaponId(void) { return 23; }
static int GetWeaponId(void) { return 23; }
void EntityWeaponShieldSpell(Entity* self) {
static void EntityWeaponShieldSpell(Entity* self) {
s16 back;
s16 front;
s16 top;
@ -450,7 +456,7 @@ void EntityWeaponShieldSpell(Entity* self) {
}
}
void func_ptr_80170024(Entity* self) {
static void func_ptr_80170024(Entity* self) {
s32 unused1;
s32 unusedFlag;
SVECTOR rotation_axis;
@ -583,7 +589,7 @@ void func_ptr_80170024(Entity* self) {
extern AnimationFrame D_A5000_8017AB58[];
void func_ptr_80170028(Entity* self) {
static void func_ptr_80170028(Entity* self) {
switch (self->step) {
case 0:
@ -632,12 +638,12 @@ void func_ptr_80170028(Entity* self) {
break;
}
}
void WeaponUnused2C(void) {}
static void WeaponUnused2C(void) {}
void WeaponUnused30(void) {}
static void WeaponUnused30(void) {}
void WeaponUnused34(void) {}
static void WeaponUnused34(void) {}
void WeaponUnused38(void) {}
static void WeaponUnused38(void) {}
void WeaponUnused3C(void) {}
static void WeaponUnused3C(void) {}

View File

@ -1,7 +1,13 @@
// Weapon ID #24. Used by weapons:
// Dark shield, Unknown#208
#include "weapon_private.h"
extern u16* g_WeaponCluts[];
extern s32 g_HandId;
#include "shared.h"
#include "w_024_1.h"
#include "w_024_2.h"
#define g_Animset w_024_1
#define g_Animset2 w_024_2
#include "sfx.h"
extern SpriteParts D_AC000_8017A040[];
@ -10,7 +16,7 @@ extern AnimationFrame* D_AC000_8017AC20;
extern s16* D_AC000_8017ACF8[];
extern s32 D_AC000_8017AD08[];
void EntityWeaponAttack(Entity* self) {
static void EntityWeaponAttack(Entity* self) {
s32 anim1;
s32 anim2;
s32 attackButton;
@ -171,17 +177,17 @@ void EntityWeaponAttack(Entity* self) {
s32 func_ptr_80170004(Entity* self) {}
void func_ptr_80170008(Entity* self) {}
static void func_ptr_80170008(Entity* self) {}
void func_ptr_8017000C(Entity* self) {}
static void func_ptr_8017000C(Entity* self) {}
s32 func_ptr_80170010(Entity* self) {}
static s32 func_ptr_80170010(Entity* self) {}
s32 func_ptr_80170014(Entity* self) {}
static s32 func_ptr_80170014(Entity* self) {}
int GetWeaponId(void) { return 24; }
static int GetWeaponId(void) { return 24; }
void EntityWeaponShieldSpell(Entity* self) {
static void EntityWeaponShieldSpell(Entity* self) {
Entity* unusedEnt;
Primitive* prim;
Primitive* prevPrim;
@ -523,7 +529,7 @@ void EntityWeaponShieldSpell(Entity* self) {
}
// Appears to be the entity for the rising rocks as part of the Shield Rod spell
void func_ptr_80170024(Entity* self) {
static void func_ptr_80170024(Entity* self) {
Primitive* prim;
s16 selfX;
s16 selfY;
@ -629,14 +635,14 @@ void func_ptr_80170024(Entity* self) {
}
}
void func_ptr_80170028(Entity* self) {}
static void func_ptr_80170028(Entity* self) {}
void WeaponUnused2C(void) {}
static void WeaponUnused2C(void) {}
void WeaponUnused30(void) {}
static void WeaponUnused30(void) {}
void WeaponUnused34(void) {}
static void WeaponUnused34(void) {}
void WeaponUnused38(void) {}
static void WeaponUnused38(void) {}
void WeaponUnused3C(void) {}
static void WeaponUnused3C(void) {}

View File

@ -1,6 +1,12 @@
// Weapon ID #25. Used by weapons:
// Goddess shield, Unknown#209
#include "weapon_private.h"
extern u16* g_WeaponCluts[];
extern s32 g_HandId;
#include "w_025_1.h"
#include "w_025_2.h"
#define g_Animset w_025_1
#define g_Animset2 w_025_2
#include "shared.h"
#include "sfx.h"
@ -18,7 +24,7 @@ void func_B3000_8017AF14(const char* fmt, u_long end) {
}
}
void EntityWeaponAttack(Entity* self) {
static void EntityWeaponAttack(Entity* self) {
s32 anim1;
s32 anim2;
s32 attackButton;
@ -154,17 +160,17 @@ void EntityWeaponAttack(Entity* self) {
s32 func_ptr_80170004(Entity* self) {}
void func_ptr_80170008(Entity* self) {}
static void func_ptr_80170008(Entity* self) {}
void func_ptr_8017000C(Entity* self) {}
static void func_ptr_8017000C(Entity* self) {}
s32 func_ptr_80170010(Entity* self) {}
static s32 func_ptr_80170010(Entity* self) {}
s32 func_ptr_80170014(Entity* self) {}
static s32 func_ptr_80170014(Entity* self) {}
int GetWeaponId(void) { return 25; }
static int GetWeaponId(void) { return 25; }
void EntityWeaponShieldSpell(Entity* self) {
static void EntityWeaponShieldSpell(Entity* self) {
Entity* unusedEnt;
Primitive* prim;
Primitive* prevPrim;
@ -473,7 +479,7 @@ void EntityWeaponShieldSpell(Entity* self) {
}
// Probably the dancing clouds of fog that appear with the shield spell?
void func_ptr_80170024(Entity* self) {
static void func_ptr_80170024(Entity* self) {
Primitive* prim;
s16 angle;
s16 xSize;
@ -601,14 +607,14 @@ void func_ptr_80170024(Entity* self) {
prim->y3 = yVar - (((rsin(angle) >> 4) * ySize) >> 8);
}
void func_ptr_80170028(Entity* self) {}
static void func_ptr_80170028(Entity* self) {}
void WeaponUnused2C(void) {}
static void WeaponUnused2C(void) {}
void WeaponUnused30(void) {}
static void WeaponUnused30(void) {}
void WeaponUnused34(void) {}
static void WeaponUnused34(void) {}
void WeaponUnused38(void) {}
static void WeaponUnused38(void) {}
void WeaponUnused3C(void) {}
static void WeaponUnused3C(void) {}

View File

@ -1,6 +1,12 @@
// Weapon ID #26. Used by weapons:
// Shaman shield, Unknown#210
#include "weapon_private.h"
extern u16* g_WeaponCluts[];
extern s32 g_HandId;
#include "w_026_1.h"
#include "w_026_2.h"
#define g_Animset w_026_1
#define g_Animset2 w_026_2
#include "shared.h"
#include "sfx.h"
@ -14,7 +20,7 @@ extern u8 D_BA000_8017AADC[];
extern s32 D_BA000_8017CC3C;
void EntityWeaponAttack(Entity* self) {
static void EntityWeaponAttack(Entity* self) {
s32 anim1;
s32 anim2;
s32 attackButton;
@ -150,15 +156,15 @@ void EntityWeaponAttack(Entity* self) {
s32 func_ptr_80170004(Entity* self) {}
void func_ptr_80170008(Entity* self) {}
static void func_ptr_80170008(Entity* self) {}
void func_ptr_8017000C(Entity* self) {}
static void func_ptr_8017000C(Entity* self) {}
s32 func_ptr_80170010(Entity* self) {}
static s32 func_ptr_80170010(Entity* self) {}
s32 func_ptr_80170014(Entity* self) {}
static s32 func_ptr_80170014(Entity* self) {}
int GetWeaponId(void) { return 26; }
static int GetWeaponId(void) { return 26; }
void func_BA000_8017B37C(void) {
RECT rect;
@ -188,7 +194,7 @@ void func_BA000_8017B37C(void) {
LoadImage(&rect, &g_Clut[0x1100]);
}
void EntityWeaponShieldSpell(Entity* self) {
static void EntityWeaponShieldSpell(Entity* self) {
s16 back;
s16 front;
s16 top;
@ -491,7 +497,7 @@ const SVECTOR D_BA000_8017AB94 = {56, 28, 0};
// When casting the Shaman Shield spell with the Shield Rod, an animation plays
// where several stars rotate in 3D around Alucard. This handles that rotation.
void func_ptr_80170024(Entity* self) {
static void func_ptr_80170024(Entity* self) {
SVECTOR rotation_axis;
VECTOR transfer_vector;
MATRIX m;
@ -686,14 +692,14 @@ void func_ptr_80170024(Entity* self) {
}
}
void func_ptr_80170028(Entity* self) {}
static void func_ptr_80170028(Entity* self) {}
void WeaponUnused2C(void) {}
static void WeaponUnused2C(void) {}
void WeaponUnused30(void) {}
static void WeaponUnused30(void) {}
void WeaponUnused34(void) {}
static void WeaponUnused34(void) {}
void WeaponUnused38(void) {}
static void WeaponUnused38(void) {}
void WeaponUnused3C(void) {}
static void WeaponUnused3C(void) {}

View File

@ -1,6 +1,12 @@
// Weapon ID #27. Used by weapons:
// Medusa shield, Unknown#211
#include "weapon_private.h"
extern u16* g_WeaponCluts[];
extern s32 g_HandId;
#include "w_027_1.h"
#include "w_027_2.h"
#define g_Animset w_027_1
#define g_Animset2 w_027_2
#include "shared.h"
#include "sfx.h"
@ -11,7 +17,7 @@ extern AnimationFrame D_C1000_8017AC8C[];
extern AnimationFrame D_C1000_8017ACB4[];
extern s32 D_C1000_8017C6EC; // g_DebugWaitInfoTimer
void DebugShowWaitInfo(const char* msg) {
static void DebugShowWaitInfo(const char* msg) {
g_CurrentBuffer = g_CurrentBuffer->next;
FntPrint(msg);
if (D_C1000_8017C6EC++ & 4) {
@ -24,7 +30,7 @@ void DebugShowWaitInfo(const char* msg) {
FntFlush(-1);
}
void DebugInputWait(const char* msg) {
static void DebugInputWait(const char* msg) {
while (PadRead(0))
DebugShowWaitInfo(msg);
while (!PadRead(0))
@ -32,7 +38,7 @@ void DebugInputWait(const char* msg) {
}
// Duplicate of Weapon 28!
void EntityWeaponAttack(Entity* self) {
static void EntityWeaponAttack(Entity* self) {
s32 anim = 0;
bool crouchCheck = false;
s32 attackButton;
@ -166,17 +172,17 @@ void EntityWeaponAttack(Entity* self) {
s32 func_ptr_80170004(Entity* self) {}
void func_ptr_80170008(Entity* self) {}
static void func_ptr_80170008(Entity* self) {}
void func_ptr_8017000C(Entity* self) {}
static void func_ptr_8017000C(Entity* self) {}
s32 func_ptr_80170010(Entity* self) {}
static s32 func_ptr_80170010(Entity* self) {}
s32 func_ptr_80170014(Entity* self) {}
static s32 func_ptr_80170014(Entity* self) {}
int GetWeaponId(void) { return 27; }
static int GetWeaponId(void) { return 27; }
void EntityWeaponShieldSpell(Entity* self) {
static void EntityWeaponShieldSpell(Entity* self) {
Primitive* prim;
s16 selfPosX;
s16 selfPosY;
@ -315,7 +321,7 @@ void EntityWeaponShieldSpell(Entity* self) {
return;
}
void func_ptr_80170024(Entity* self) {
static void func_ptr_80170024(Entity* self) {
Primitive* prim;
Primitive* basePrim;
s16 angle;
@ -547,7 +553,7 @@ void func_ptr_80170024(Entity* self) {
}
}
void func_ptr_80170028(Entity* self) {
static void func_ptr_80170028(Entity* self) {
Entity* parent = self->ext.generic.unk8C.entityPtr;
if (parent->entityId == 0) {
DestroyEntity(self);
@ -573,12 +579,12 @@ void func_ptr_80170028(Entity* self) {
}
}
void WeaponUnused2C(void) {}
static void WeaponUnused2C(void) {}
void WeaponUnused30(void) {}
static void WeaponUnused30(void) {}
void WeaponUnused34(void) {}
static void WeaponUnused34(void) {}
void WeaponUnused38(void) {}
static void WeaponUnused38(void) {}
void WeaponUnused3C(void) {}
static void WeaponUnused3C(void) {}

View File

@ -1,7 +1,13 @@
// Weapon ID #28. Used by weapons:
// Skull shield, Unknown#212
#include "weapon_private.h"
extern u16* g_WeaponCluts[];
extern s32 g_HandId;
#include "shared.h"
#include "w_028_1.h"
#include "w_028_2.h"
#define g_Animset w_028_1
#define g_Animset2 w_028_2
#include "sfx.h"
extern SpriteParts D_C8000_8017A040[];
@ -9,7 +15,7 @@ extern s8 D_C8000_8017AA98[];
extern s32 D_C8000_8017AAE0[];
extern s32 D_C8000_8017AB1C[];
void EntityWeaponAttack(Entity* self) {
static void EntityWeaponAttack(Entity* self) {
s32 anim = 0;
bool crouchCheck = false;
s32 attackButton;
@ -143,15 +149,15 @@ void EntityWeaponAttack(Entity* self) {
s32 func_ptr_80170004(Entity* self) {}
void func_ptr_80170008(Entity* self) {}
static void func_ptr_80170008(Entity* self) {}
void func_ptr_8017000C(Entity* self) {}
static void func_ptr_8017000C(Entity* self) {}
s32 func_ptr_80170010(Entity* self) {}
static s32 func_ptr_80170010(Entity* self) {}
s32 func_ptr_80170014(Entity* self) {}
static s32 func_ptr_80170014(Entity* self) {}
int GetWeaponId(void) { return 28; }
static int GetWeaponId(void) { return 28; }
extern s16 D_C8000_8017AB18;
extern s16 D_C8000_8017AB1A;
@ -184,7 +190,7 @@ void func_C8000_8017B3D4(void) {
LoadImage(&rect, &g_Clut[0x1100]);
}
void EntityWeaponShieldSpell(Entity* self) {
static void EntityWeaponShieldSpell(Entity* self) {
s32 i;
s16 left;
s16 right;
@ -508,7 +514,7 @@ void EntityWeaponShieldSpell(Entity* self) {
func_C8000_8017B3D4();
}
void func_ptr_80170024(Entity* self) {
static void func_ptr_80170024(Entity* self) {
Primitive* prim;
s32 xShift;
s16 selfPosX;
@ -652,14 +658,14 @@ void func_ptr_80170024(Entity* self) {
return;
}
void func_ptr_80170028(Entity* self) {}
static void func_ptr_80170028(Entity* self) {}
void WeaponUnused2C(void) {}
static void WeaponUnused2C(void) {}
void WeaponUnused30(void) {}
static void WeaponUnused30(void) {}
void WeaponUnused34(void) {}
static void WeaponUnused34(void) {}
void WeaponUnused38(void) {}
static void WeaponUnused38(void) {}
void WeaponUnused3C(void) {}
static void WeaponUnused3C(void) {}

View File

@ -1,7 +1,13 @@
// Weapon ID #29. Used by weapons:
// Fire shield, Unknown#213
#include "weapon_private.h"
extern u16* g_WeaponCluts[];
extern s32 g_HandId;
#include "shared.h"
#include "w_029_1.h"
#include "w_029_2.h"
#define g_Animset w_029_1
#define g_Animset2 w_029_2
#include "items.h"
#include "sfx.h"
@ -27,7 +33,7 @@ typedef struct {
} FireShieldDragon;
extern FireShieldDragon D_CF000_8017C9A0[][20];
void EntityWeaponAttack(Entity* self) {
static void EntityWeaponAttack(Entity* self) {
s32 anim;
s32 handButton;
s32 unkAC_offset;
@ -192,17 +198,17 @@ s32 func_ptr_80170004(Entity* self) {
self->ext.weapon.unk80 + D_CF000_8017AD04[g_GameTimer / 2 % 5];
}
void func_ptr_80170008(Entity* self) {}
static void func_ptr_80170008(Entity* self) {}
void func_ptr_8017000C(Entity* self) {}
static void func_ptr_8017000C(Entity* self) {}
s32 func_ptr_80170010(Entity* self) {}
static s32 func_ptr_80170010(Entity* self) {}
s32 func_ptr_80170014(Entity* self) {}
static s32 func_ptr_80170014(Entity* self) {}
int GetWeaponId(void) { return 29; }
static int GetWeaponId(void) { return 29; }
void EntityWeaponShieldSpell(Entity* self) {
static void EntityWeaponShieldSpell(Entity* self) {
Primitive* prim;
s32 var_v0;
u16 selfX;
@ -350,7 +356,7 @@ void EntityWeaponShieldSpell(Entity* self) {
return;
}
void func_ptr_80170024(Entity* self) {
static void func_ptr_80170024(Entity* self) {
// All these variables are kind of guessing names, behavior of this
// function is a little unclear.
Primitive* firstPrim;
@ -560,7 +566,7 @@ void func_ptr_80170024(Entity* self) {
g_api.CreateEntFactoryFromEntity(self, ((g_HandId + 1) << 14) + 100, 0);
}
void func_ptr_80170028(Entity* self) {
static void func_ptr_80170028(Entity* self) {
if (self->ext.weapon.parent->entityId == 0) {
DestroyEntity(self);
return;
@ -579,12 +585,12 @@ void func_ptr_80170028(Entity* self) {
}
}
void WeaponUnused2C(void) {}
static void WeaponUnused2C(void) {}
void WeaponUnused30(void) {}
static void WeaponUnused30(void) {}
void WeaponUnused34(void) {}
static void WeaponUnused34(void) {}
void WeaponUnused38(void) {}
static void WeaponUnused38(void) {}
void WeaponUnused3C(void) {}
static void WeaponUnused3C(void) {}

View File

@ -1,11 +1,17 @@
// Weapon ID #30. Used by weapons:
// Sword of Dawn, Unknown#177
#include "weapon_private.h"
extern u16* g_WeaponCluts[];
extern s32 g_HandId;
#include "shared.h"
#include "w_030_1.h"
#include "w_030_2.h"
#define g_Animset w_030_1
#define g_Animset2 w_030_2
extern WeaponAnimation D_D6000_8017A5E4[];
void EntityWeaponAttack(Entity* self) {
static void EntityWeaponAttack(Entity* self) {
WeaponAnimation* anim;
WeaponAnimation* anim2;
s8 animIndex;
@ -64,22 +70,22 @@ INCLUDE_ASM("weapon/nonmatchings/w_030", func_ptr_8017000C);
INCLUDE_ASM("weapon/nonmatchings/w_030", func_ptr_80170010);
s32 func_ptr_80170014(Entity* self) {}
static s32 func_ptr_80170014(Entity* self) {}
int GetWeaponId(void) { return 30; }
static int GetWeaponId(void) { return 30; }
void EntityWeaponShieldSpell(Entity* self) {}
static void EntityWeaponShieldSpell(Entity* self) {}
void func_ptr_80170024(Entity* self) {}
static void func_ptr_80170024(Entity* self) {}
void func_ptr_80170028(Entity* self) {}
static void func_ptr_80170028(Entity* self) {}
void WeaponUnused2C(void) {}
static void WeaponUnused2C(void) {}
void WeaponUnused30(void) {}
static void WeaponUnused30(void) {}
void WeaponUnused34(void) {}
static void WeaponUnused34(void) {}
void WeaponUnused38(void) {}
static void WeaponUnused38(void) {}
void WeaponUnused3C(void) {}
static void WeaponUnused3C(void) {}

View File

@ -1,7 +1,13 @@
// Weapon ID #31. Used by weapons:
// Basilard, Unknown#174
#include "weapon_private.h"
extern u16* g_WeaponCluts[];
extern s32 g_HandId;
#include "shared.h"
#include "w_031_1.h"
#include "w_031_2.h"
#define g_Animset w_031_1
#define g_Animset2 w_031_2
extern WeaponAnimation D_DD000_8017A8EC[];
@ -66,28 +72,28 @@ void EntityWeaponAttack(Entity* self) {
s32 func_ptr_80170004(Entity* self) {}
void func_ptr_80170008(Entity* self) {}
static void func_ptr_80170008(Entity* self) {}
void func_ptr_8017000C(Entity* self) {}
static void func_ptr_8017000C(Entity* self) {}
s32 func_ptr_80170010(Entity* self) {}
static s32 func_ptr_80170010(Entity* self) {}
s32 func_ptr_80170014(Entity* self) {}
static s32 func_ptr_80170014(Entity* self) {}
int GetWeaponId(void) { return 31; }
static int GetWeaponId(void) { return 31; }
void EntityWeaponShieldSpell(Entity* self) {}
static void EntityWeaponShieldSpell(Entity* self) {}
void func_ptr_80170024(Entity* self) {}
static void func_ptr_80170024(Entity* self) {}
void func_ptr_80170028(Entity* self) {}
static void func_ptr_80170028(Entity* self) {}
void WeaponUnused2C(void) {}
static void WeaponUnused2C(void) {}
void WeaponUnused30(void) {}
static void WeaponUnused30(void) {}
void WeaponUnused34(void) {}
static void WeaponUnused34(void) {}
void WeaponUnused38(void) {}
static void WeaponUnused38(void) {}
void WeaponUnused3C(void) {}
static void WeaponUnused3C(void) {}

View File

@ -1,34 +1,40 @@
// Weapon ID #32. Used by weapons:
// Combat knife, Unknown#175
#include "weapon_private.h"
extern u16* g_WeaponCluts[];
extern s32 g_HandId;
#include "shared.h"
#include "w_032_1.h"
#include "w_032_2.h"
#define g_Animset w_032_1
#define g_Animset2 w_032_2
INCLUDE_ASM("weapon/nonmatchings/w_032", EntityWeaponAttack);
s32 func_ptr_80170004(Entity* self) {}
void func_ptr_80170008(Entity* self) {}
static void func_ptr_80170008(Entity* self) {}
void func_ptr_8017000C(Entity* self) {}
static void func_ptr_8017000C(Entity* self) {}
s32 func_ptr_80170010(Entity* self) {}
static s32 func_ptr_80170010(Entity* self) {}
s32 func_ptr_80170014(Entity* self) {}
static s32 func_ptr_80170014(Entity* self) {}
int GetWeaponId(void) { return 32; }
static int GetWeaponId(void) { return 32; }
void EntityWeaponShieldSpell(Entity* self) {}
static void EntityWeaponShieldSpell(Entity* self) {}
void func_ptr_80170024(Entity* self) {}
static void func_ptr_80170024(Entity* self) {}
void func_ptr_80170028(Entity* self) {}
static void func_ptr_80170028(Entity* self) {}
void WeaponUnused2C(void) {}
static void WeaponUnused2C(void) {}
void WeaponUnused30(void) {}
static void WeaponUnused30(void) {}
void WeaponUnused34(void) {}
static void WeaponUnused34(void) {}
void WeaponUnused38(void) {}
static void WeaponUnused38(void) {}
void WeaponUnused3C(void) {}
static void WeaponUnused3C(void) {}

View File

@ -1,7 +1,13 @@
// Weapon ID #33. Used by weapons:
// Nunchaku
#include "weapon_private.h"
extern u16* g_WeaponCluts[];
extern s32 g_HandId;
#include "shared.h"
#include "w_033_1.h"
#include "w_033_2.h"
#define g_Animset w_033_1
#define g_Animset2 w_033_2
extern WeaponAnimation D_EB000_8017AC3C[2];
@ -61,28 +67,28 @@ void EntityWeaponAttack(Entity* self) {
s32 func_ptr_80170004(Entity* self) {}
void func_ptr_80170008(Entity* self) {}
static void func_ptr_80170008(Entity* self) {}
void func_ptr_8017000C(Entity* self) {}
static void func_ptr_8017000C(Entity* self) {}
s32 func_ptr_80170010(Entity* self) {}
static s32 func_ptr_80170010(Entity* self) {}
s32 func_ptr_80170014(Entity* self) {}
static s32 func_ptr_80170014(Entity* self) {}
int GetWeaponId(void) { return 33; }
static int GetWeaponId(void) { return 33; }
void EntityWeaponShieldSpell(Entity* self) {}
static void EntityWeaponShieldSpell(Entity* self) {}
void func_ptr_80170024(Entity* self) {}
static void func_ptr_80170024(Entity* self) {}
void func_ptr_80170028(Entity* self) {}
static void func_ptr_80170028(Entity* self) {}
void WeaponUnused2C(void) {}
static void WeaponUnused2C(void) {}
void WeaponUnused30(void) {}
static void WeaponUnused30(void) {}
void WeaponUnused34(void) {}
static void WeaponUnused34(void) {}
void WeaponUnused38(void) {}
static void WeaponUnused38(void) {}
void WeaponUnused3C(void) {}
static void WeaponUnused3C(void) {}

View File

@ -1,11 +1,17 @@
// Weapon ID #34. Used by weapons:
// Shotel, Unknown#176
#include "weapon_private.h"
extern u16* g_WeaponCluts[];
extern s32 g_HandId;
#include "shared.h"
#include "w_034_1.h"
#include "w_034_2.h"
#define g_Animset w_034_1
#define g_Animset2 w_034_2
extern WeaponAnimation D_F2000_8017A934[];
void EntityWeaponAttack(Entity* self) {
static void EntityWeaponAttack(Entity* self) {
WeaponAnimation* anim;
s8 animIndex;
@ -58,28 +64,28 @@ void EntityWeaponAttack(Entity* self) {
INCLUDE_ASM("weapon/nonmatchings/w_034", func_ptr_80170004);
void func_ptr_80170008(Entity* self) {}
static void func_ptr_80170008(Entity* self) {}
void func_ptr_8017000C(Entity* self) {}
static void func_ptr_8017000C(Entity* self) {}
s32 func_ptr_80170010(Entity* self) {}
static s32 func_ptr_80170010(Entity* self) {}
s32 func_ptr_80170014(Entity* self) {}
static s32 func_ptr_80170014(Entity* self) {}
int GetWeaponId(void) { return 34; }
static int GetWeaponId(void) { return 34; }
void EntityWeaponShieldSpell(Entity* self) {}
static void EntityWeaponShieldSpell(Entity* self) {}
void func_ptr_80170024(Entity* self) {}
static void func_ptr_80170024(Entity* self) {}
void func_ptr_80170028(Entity* self) {}
static void func_ptr_80170028(Entity* self) {}
void WeaponUnused2C(void) {}
static void WeaponUnused2C(void) {}
void WeaponUnused30(void) {}
static void WeaponUnused30(void) {}
void WeaponUnused34(void) {}
static void WeaponUnused34(void) {}
void WeaponUnused38(void) {}
static void WeaponUnused38(void) {}
void WeaponUnused3C(void) {}
static void WeaponUnused3C(void) {}

View File

@ -1,11 +1,17 @@
// Weapon ID #35. Used by weapons:
// Red Rust
#include "weapon_private.h"
extern u16* g_WeaponCluts[];
extern s32 g_HandId;
#include "shared.h"
#include "w_035_1.h"
#include "w_035_2.h"
#define g_Animset w_035_1
#define g_Animset2 w_035_2
extern WeaponAnimation D_F9000_8017A530[];
void EntityWeaponAttack(Entity* self) {
static void EntityWeaponAttack(Entity* self) {
WeaponAnimation* anim;
s8 animIndex;
@ -59,28 +65,28 @@ void EntityWeaponAttack(Entity* self) {
s32 func_ptr_80170004(Entity* self) {}
void func_ptr_80170008(Entity* self) {}
static void func_ptr_80170008(Entity* self) {}
void func_ptr_8017000C(Entity* self) {}
static void func_ptr_8017000C(Entity* self) {}
s32 func_ptr_80170010(Entity* self) {}
static s32 func_ptr_80170010(Entity* self) {}
s32 func_ptr_80170014(Entity* self) {}
static s32 func_ptr_80170014(Entity* self) {}
int GetWeaponId(void) { return 35; }
static int GetWeaponId(void) { return 35; }
void EntityWeaponShieldSpell(Entity* self) {}
static void EntityWeaponShieldSpell(Entity* self) {}
void func_ptr_80170024(Entity* self) {}
static void func_ptr_80170024(Entity* self) {}
void func_ptr_80170028(Entity* self) {}
static void func_ptr_80170028(Entity* self) {}
void WeaponUnused2C(void) {}
static void WeaponUnused2C(void) {}
void WeaponUnused30(void) {}
static void WeaponUnused30(void) {}
void WeaponUnused34(void) {}
static void WeaponUnused34(void) {}
void WeaponUnused38(void) {}
static void WeaponUnused38(void) {}
void WeaponUnused3C(void) {}
static void WeaponUnused3C(void) {}

View File

@ -1,11 +1,17 @@
// Weapon ID #36. Used by weapons:
// Takemitsu
#include "weapon_private.h"
extern u16* g_WeaponCluts[];
extern s32 g_HandId;
#include "shared.h"
#include "w_036_1.h"
#include "w_036_2.h"
#define g_Animset w_036_1
#define g_Animset2 w_036_2
extern WeaponAnimation D_100000_8017A540[];
void EntityWeaponAttack(Entity* self) {
static void EntityWeaponAttack(Entity* self) {
WeaponAnimation* anim;
s8 animIndex;
@ -58,28 +64,28 @@ void EntityWeaponAttack(Entity* self) {
s32 func_ptr_80170004(Entity* self) {}
void func_ptr_80170008(Entity* self) {}
static void func_ptr_80170008(Entity* self) {}
void func_ptr_8017000C(Entity* self) {}
static void func_ptr_8017000C(Entity* self) {}
s32 func_ptr_80170010(Entity* self) {}
static s32 func_ptr_80170010(Entity* self) {}
s32 func_ptr_80170014(Entity* self) {}
static s32 func_ptr_80170014(Entity* self) {}
int GetWeaponId(void) { return 36; }
static int GetWeaponId(void) { return 36; }
void EntityWeaponShieldSpell(Entity* self) {}
static void EntityWeaponShieldSpell(Entity* self) {}
void func_ptr_80170024(Entity* self) {}
static void func_ptr_80170024(Entity* self) {}
void func_ptr_80170028(Entity* self) {}
static void func_ptr_80170028(Entity* self) {}
void WeaponUnused2C(void) {}
static void WeaponUnused2C(void) {}
void WeaponUnused30(void) {}
static void WeaponUnused30(void) {}
void WeaponUnused34(void) {}
static void WeaponUnused34(void) {}
void WeaponUnused38(void) {}
static void WeaponUnused38(void) {}
void WeaponUnused3C(void) {}
static void WeaponUnused3C(void) {}

View File

@ -1,13 +1,19 @@
// Weapon ID #37. Used by weapons:
// Short sword, Jewel sword, Stone sword, Unknown#198
#include "weapon_private.h"
extern u16* g_WeaponCluts[];
extern s32 g_HandId;
#include "shared.h"
#include "w_037_1.h"
#include "w_037_2.h"
#define g_Animset w_037_1
#define g_Animset2 w_037_2
#include "sfx.h"
extern WeaponAnimation D_107000_8017A6A4[];
extern s32 D_107000_8017BBE4;
void EntityWeaponAttack(Entity* self) {
static void EntityWeaponAttack(Entity* self) {
WeaponAnimation* anim;
s8 animIndex;
@ -322,7 +328,7 @@ s32 func_ptr_80170004(Entity* self) {
extern AnimationFrame D_107000_8017A798[];
void func_ptr_80170008(Entity* self) {
static void func_ptr_80170008(Entity* self) {
Collider collider;
s16 distX;
s16 distY;
@ -404,26 +410,26 @@ void func_ptr_80170008(Entity* self) {
}
}
void func_ptr_8017000C(Entity* self) {}
static void func_ptr_8017000C(Entity* self) {}
s32 func_ptr_80170010(Entity* self) {}
static s32 func_ptr_80170010(Entity* self) {}
s32 func_ptr_80170014(Entity* self) {}
static s32 func_ptr_80170014(Entity* self) {}
int GetWeaponId(void) { return 37; }
static int GetWeaponId(void) { return 37; }
void EntityWeaponShieldSpell(Entity* self) {}
static void EntityWeaponShieldSpell(Entity* self) {}
void func_ptr_80170024(Entity* self) {}
static void func_ptr_80170024(Entity* self) {}
void func_ptr_80170028(Entity* self) {}
static void func_ptr_80170028(Entity* self) {}
void WeaponUnused2C(void) {}
static void WeaponUnused2C(void) {}
void WeaponUnused30(void) {}
static void WeaponUnused30(void) {}
void WeaponUnused34(void) {}
static void WeaponUnused34(void) {}
void WeaponUnused38(void) {}
static void WeaponUnused38(void) {}
void WeaponUnused3C(void) {}
static void WeaponUnused3C(void) {}

View File

@ -1,11 +1,17 @@
// Weapon ID #38. Used by weapons:
// Rapier, Unknown#191
#include "weapon_private.h"
extern u16* g_WeaponCluts[];
extern s32 g_HandId;
#include "shared.h"
#include "w_038_1.h"
#include "w_038_2.h"
#define g_Animset w_038_1
#define g_Animset2 w_038_2
extern WeaponAnimation D_10E000_8017ADC0[2];
void EntityWeaponAttack(Entity* self) {
static void EntityWeaponAttack(Entity* self) {
WeaponAnimation* anim;
s8 animIndex;
@ -66,28 +72,28 @@ void EntityWeaponAttack(Entity* self) {
INCLUDE_ASM("weapon/nonmatchings/w_038", func_ptr_80170004);
void func_ptr_80170008(Entity* self) {}
static void func_ptr_80170008(Entity* self) {}
void func_ptr_8017000C(Entity* self) {}
static void func_ptr_8017000C(Entity* self) {}
s32 func_ptr_80170010(Entity* self) {}
static s32 func_ptr_80170010(Entity* self) {}
s32 func_ptr_80170014(Entity* self) {}
static s32 func_ptr_80170014(Entity* self) {}
int GetWeaponId(void) { return 38; }
static int GetWeaponId(void) { return 38; }
void EntityWeaponShieldSpell(Entity* self) {}
static void EntityWeaponShieldSpell(Entity* self) {}
void func_ptr_80170024(Entity* self) {}
static void func_ptr_80170024(Entity* self) {}
void func_ptr_80170028(Entity* self) {}
static void func_ptr_80170028(Entity* self) {}
void WeaponUnused2C(void) {}
static void WeaponUnused2C(void) {}
void WeaponUnused30(void) {}
static void WeaponUnused30(void) {}
void WeaponUnused34(void) {}
static void WeaponUnused34(void) {}
void WeaponUnused38(void) {}
static void WeaponUnused38(void) {}
void WeaponUnused3C(void) {}
static void WeaponUnused3C(void) {}

View File

@ -1,11 +1,17 @@
// Weapon ID #39. Used by weapons:
// Were Bane, Unknown#190
#include "weapon_private.h"
extern u16* g_WeaponCluts[];
extern s32 g_HandId;
#include "shared.h"
#include "w_039_1.h"
#include "w_039_2.h"
#define g_Animset w_039_1
#define g_Animset2 w_039_2
extern WeaponAnimation D_115000_8017ADC0[2];
void EntityWeaponAttack(Entity* self) {
static void EntityWeaponAttack(Entity* self) {
WeaponAnimation* anim;
s8 animIndex;
@ -66,28 +72,28 @@ void EntityWeaponAttack(Entity* self) {
INCLUDE_ASM("weapon/nonmatchings/w_039", func_ptr_80170004);
void func_ptr_80170008(Entity* self) {}
static void func_ptr_80170008(Entity* self) {}
void func_ptr_8017000C(Entity* self) {}
static void func_ptr_8017000C(Entity* self) {}
s32 func_ptr_80170010(Entity* self) {}
static s32 func_ptr_80170010(Entity* self) {}
s32 func_ptr_80170014(Entity* self) {}
static s32 func_ptr_80170014(Entity* self) {}
int GetWeaponId(void) { return 39; }
static int GetWeaponId(void) { return 39; }
void EntityWeaponShieldSpell(Entity* self) {}
static void EntityWeaponShieldSpell(Entity* self) {}
void func_ptr_80170024(Entity* self) {}
static void func_ptr_80170024(Entity* self) {}
void func_ptr_80170028(Entity* self) {}
static void func_ptr_80170028(Entity* self) {}
void WeaponUnused2C(void) {}
static void WeaponUnused2C(void) {}
void WeaponUnused30(void) {}
static void WeaponUnused30(void) {}
void WeaponUnused34(void) {}
static void WeaponUnused34(void) {}
void WeaponUnused38(void) {}
static void WeaponUnused38(void) {}
void WeaponUnused3C(void) {}
static void WeaponUnused3C(void) {}

View File

@ -1,7 +1,13 @@
// Weapon ID #40. Used by weapons:
// Monster vial 1
#include "weapon_private.h"
extern u16* g_WeaponCluts[];
extern s32 g_HandId;
#include "shared.h"
#include "w_040_1.h"
#include "w_040_2.h"
#define g_Animset w_040_1
#define g_Animset2 w_040_2
#include "sfx.h"
extern AnimationFrame D_11C000_8017A724[];
@ -29,7 +35,7 @@ void func_11C000_8017AC14(void) {
LoadImage(&rect, D_8006EDCC);
}
void EntityWeaponAttack(Entity* self) {
static void EntityWeaponAttack(Entity* self) {
Collider col;
s32 var_a2;
s16 xMod;
@ -180,7 +186,7 @@ s32 func_ptr_80170004(Entity* self) {
func_11C000_8017AC14();
}
void func_ptr_80170008(Entity* self) {
static void func_ptr_80170008(Entity* self) {
s32 var_a1;
if (self->step == 0) {
@ -217,7 +223,7 @@ void func_ptr_80170008(Entity* self) {
g_api.UpdateAnim(D_11C000_8017A844, NULL);
}
void func_ptr_8017000C(Entity* self) {
static void func_ptr_8017000C(Entity* self) {
if (self->step == 0) {
self->animSet = self->ext.weapon.parent->animSet;
self->unk5A = self->ext.weapon.parent->unk5A;
@ -233,24 +239,24 @@ void func_ptr_8017000C(Entity* self) {
}
}
s32 func_ptr_80170010(Entity* self) {}
static s32 func_ptr_80170010(Entity* self) {}
s32 func_ptr_80170014(Entity* self) {}
static s32 func_ptr_80170014(Entity* self) {}
int GetWeaponId(void) { return 40; }
static int GetWeaponId(void) { return 40; }
void EntityWeaponShieldSpell(Entity* self) {}
static void EntityWeaponShieldSpell(Entity* self) {}
void func_ptr_80170024(Entity* self) {}
static void func_ptr_80170024(Entity* self) {}
void func_ptr_80170028(Entity* self) {}
static void func_ptr_80170028(Entity* self) {}
void WeaponUnused2C(void) {}
static void WeaponUnused2C(void) {}
void WeaponUnused30(void) {}
static void WeaponUnused30(void) {}
void WeaponUnused34(void) {}
static void WeaponUnused34(void) {}
void WeaponUnused38(void) {}
static void WeaponUnused38(void) {}
void WeaponUnused3C(void) {}
static void WeaponUnused3C(void) {}

View File

@ -1,6 +1,12 @@
// Weapon ID #41. Used by weapons:
// Monster vial 2
#include "weapon_private.h"
extern u16* g_WeaponCluts[];
extern s32 g_HandId;
#include "w_041_1.h"
#include "w_041_2.h"
#define g_Animset w_041_1
#define g_Animset2 w_041_2
#include "shared.h"
#include "sfx.h"
@ -199,28 +205,28 @@ s32 func_ptr_80170004(Entity* self) {
func_123000_8017A914();
}
void func_ptr_80170008(Entity* self) {}
static void func_ptr_80170008(Entity* self) {}
void func_ptr_8017000C(Entity* self) {}
static void func_ptr_8017000C(Entity* self) {}
s32 func_ptr_80170010(Entity* self) {}
static s32 func_ptr_80170010(Entity* self) {}
s32 func_ptr_80170014(Entity* self) {}
static s32 func_ptr_80170014(Entity* self) {}
int GetWeaponId(void) { return 41; }
static int GetWeaponId(void) { return 41; }
void EntityWeaponShieldSpell(Entity* self) {}
static void EntityWeaponShieldSpell(Entity* self) {}
void func_ptr_80170024(Entity* self) {}
static void func_ptr_80170024(Entity* self) {}
void func_ptr_80170028(Entity* self) {}
static void func_ptr_80170028(Entity* self) {}
void WeaponUnused2C(void) {}
static void WeaponUnused2C(void) {}
void WeaponUnused30(void) {}
static void WeaponUnused30(void) {}
void WeaponUnused34(void) {}
static void WeaponUnused34(void) {}
void WeaponUnused38(void) {}
static void WeaponUnused38(void) {}
void WeaponUnused3C(void) {}
static void WeaponUnused3C(void) {}

View File

@ -1,7 +1,13 @@
// Weapon ID #42. Used by weapons:
// Monster vial 3
#include "weapon_private.h"
extern u16* g_WeaponCluts[];
extern s32 g_HandId;
#include "shared.h"
#include "w_042_1.h"
#include "w_042_2.h"
#define g_Animset w_042_1
#define g_Animset2 w_042_2
#include "sfx.h"
// data
@ -22,7 +28,7 @@ extern s32 D_12A000_8017B5F0;
extern const char D_12A000_8017A760[]; // "\no\n"
extern s32 D_12A000_8017B5EC; // g_DebugWaitInfoTimer
void DebugShowWaitInfo(const char* msg) {
static void DebugShowWaitInfo(const char* msg) {
g_CurrentBuffer = g_CurrentBuffer->next;
FntPrint(msg);
if (D_12A000_8017B5EC++ & 4) {
@ -35,7 +41,7 @@ void DebugShowWaitInfo(const char* msg) {
FntFlush(-1);
}
void DebugInputWait(const char* msg) {
static void DebugInputWait(const char* msg) {
while (PadRead(0))
DebugShowWaitInfo(msg);
while (!PadRead(0))
@ -57,7 +63,7 @@ void func_12A000_8017AC08(void) {
LoadImage(&rect, D_8006EDCC);
}
void EntityWeaponAttack(Entity* self) {
static void EntityWeaponAttack(Entity* self) {
Collider col;
s32 var_a2;
s16 xMod;
@ -214,7 +220,7 @@ s32 func_ptr_80170004(Entity* self) {
func_12A000_8017AC08();
}
void func_ptr_80170008(Entity* self) {
static void func_ptr_80170008(Entity* self) {
s16 unk;
s32 modX;
@ -276,7 +282,7 @@ void func_ptr_80170008(Entity* self) {
g_api.UpdateAnim(D_12A000_8017A6DC, NULL);
}
void func_ptr_8017000C(Entity* self) {
static void func_ptr_8017000C(Entity* self) {
if (self->step == 0) {
self->animSet = self->ext.weapon.parent->animSet;
self->unk5A = self->ext.weapon.parent->unk5A;
@ -292,24 +298,24 @@ void func_ptr_8017000C(Entity* self) {
}
}
s32 func_ptr_80170010(Entity* self) {}
static s32 func_ptr_80170010(Entity* self) {}
s32 func_ptr_80170014(Entity* self) {}
static s32 func_ptr_80170014(Entity* self) {}
int GetWeaponId(void) { return 42; }
static int GetWeaponId(void) { return 42; }
void EntityWeaponShieldSpell(Entity* self) {}
static void EntityWeaponShieldSpell(Entity* self) {}
void func_ptr_80170024(Entity* self) {}
static void func_ptr_80170024(Entity* self) {}
void func_ptr_80170028(Entity* self) {}
static void func_ptr_80170028(Entity* self) {}
void WeaponUnused2C(void) {}
static void WeaponUnused2C(void) {}
void WeaponUnused30(void) {}
static void WeaponUnused30(void) {}
void WeaponUnused34(void) {}
static void WeaponUnused34(void) {}
void WeaponUnused38(void) {}
static void WeaponUnused38(void) {}
void WeaponUnused3C(void) {}
static void WeaponUnused3C(void) {}

View File

@ -1,7 +1,13 @@
// Weapon ID #43. Used by weapons:
// Alucard sword, Sword Familiar, Alucart sword, Unknown#197
#include "weapon_private.h"
extern u16* g_WeaponCluts[];
extern s32 g_HandId;
#include "shared.h"
#include "w_043_1.h"
#include "w_043_2.h"
#define g_Animset w_043_1
#define g_Animset2 w_043_2
extern SpriteParts D_131000_8017A040[];
extern AnimationFrame D_131000_8017AF40[];
@ -10,7 +16,7 @@ INCLUDE_ASM("weapon/nonmatchings/w_043", EntityWeaponAttack);
INCLUDE_ASM("weapon/nonmatchings/w_043", func_ptr_80170004);
void func_ptr_80170008(Entity* self) {
static void func_ptr_80170008(Entity* self) {
if (self->step == 0) {
self->unk4C = D_131000_8017AF40;
SetSpriteBank1(D_131000_8017A040);
@ -52,26 +58,26 @@ void func_ptr_80170008(Entity* self) {
self->rotPivotY = PLAYER.rotPivotY;
}
void func_ptr_8017000C(Entity* self) {}
static void func_ptr_8017000C(Entity* self) {}
s32 func_ptr_80170010(Entity* self) {}
static s32 func_ptr_80170010(Entity* self) {}
s32 func_ptr_80170014(Entity* self) {}
static s32 func_ptr_80170014(Entity* self) {}
int GetWeaponId(void) { return 43; }
static int GetWeaponId(void) { return 43; }
void EntityWeaponShieldSpell(Entity* self) {}
static void EntityWeaponShieldSpell(Entity* self) {}
void func_ptr_80170024(Entity* self) {}
static void func_ptr_80170024(Entity* self) {}
void func_ptr_80170028(Entity* self) {}
static void func_ptr_80170028(Entity* self) {}
void WeaponUnused2C(void) {}
static void WeaponUnused2C(void) {}
void WeaponUnused30(void) {}
static void WeaponUnused30(void) {}
void WeaponUnused34(void) {}
static void WeaponUnused34(void) {}
void WeaponUnused38(void) {}
static void WeaponUnused38(void) {}
void WeaponUnused3C(void) {}
static void WeaponUnused3C(void) {}

View File

@ -1,34 +1,40 @@
// Weapon ID #44. Used by weapons:
// Heart Refresh
#include "weapon_private.h"
extern u16* g_WeaponCluts[];
extern s32 g_HandId;
#include "shared.h"
#include "w_044_1.h"
#include "w_044_2.h"
#define g_Animset w_044_1
#define g_Animset2 w_044_2
INCLUDE_ASM("weapon/nonmatchings/w_044", EntityWeaponAttack);
s32 func_ptr_80170004(Entity* self) {}
void func_ptr_80170008(Entity* self) {}
static void func_ptr_80170008(Entity* self) {}
void func_ptr_8017000C(Entity* self) {}
static void func_ptr_8017000C(Entity* self) {}
s32 func_ptr_80170010(Entity* self) {}
static s32 func_ptr_80170010(Entity* self) {}
s32 func_ptr_80170014(Entity* self) {}
static s32 func_ptr_80170014(Entity* self) {}
int GetWeaponId(void) { return 44; }
static int GetWeaponId(void) { return 44; }
void EntityWeaponShieldSpell(Entity* self) {}
static void EntityWeaponShieldSpell(Entity* self) {}
void func_ptr_80170024(Entity* self) {}
static void func_ptr_80170024(Entity* self) {}
void func_ptr_80170028(Entity* self) {}
static void func_ptr_80170028(Entity* self) {}
void WeaponUnused2C(void) {}
static void WeaponUnused2C(void) {}
void WeaponUnused30(void) {}
static void WeaponUnused30(void) {}
void WeaponUnused34(void) {}
static void WeaponUnused34(void) {}
void WeaponUnused38(void) {}
static void WeaponUnused38(void) {}
void WeaponUnused3C(void) {}
static void WeaponUnused3C(void) {}

View File

@ -1,6 +1,12 @@
// Weapon ID #45. Used by weapons:
// Unknown#216
#include "weapon_private.h"
extern u16* g_WeaponCluts[];
extern s32 g_HandId;
#include "w_045_1.h"
#include "w_045_2.h"
#define g_Animset w_045_1
#define g_Animset2 w_045_2
#include "shared.h"
#include "sfx.h"
@ -38,7 +44,7 @@ int func_13F000_8017A718() {
return 0;
}
void EntityWeaponAttack(Entity* self) {
static void EntityWeaponAttack(Entity* self) {
SetSpriteBank1(D_13F000_8017A040);
if (g_HandId != 0) {
g_CurrentEntity->animSet = ANIMSET_OVL(0x12);
@ -68,7 +74,7 @@ void EntityWeaponAttack(Entity* self) {
INCLUDE_ASM("weapon/nonmatchings/w_045", func_ptr_80170004);
void func_ptr_80170008(Entity* self) {
static void func_ptr_80170008(Entity* self) {
SetSpriteBank1(D_13F000_8017A040);
if (g_HandId != 0) {
g_CurrentEntity->animSet = ANIMSET_OVL(0x12);
@ -128,7 +134,7 @@ void func_ptr_80170008(Entity* self) {
INCLUDE_ASM("weapon/nonmatchings/w_045", func_ptr_8017000C);
s32 func_ptr_80170010(Entity* self) {
static s32 func_ptr_80170010(Entity* self) {
D_13F000_8017B3BC += 0x80;
SetSpriteBank1(D_13F000_8017A040);
if (g_HandId != 0) {
@ -210,22 +216,22 @@ s32 func_ptr_80170010(Entity* self) {
}
}
s32 func_ptr_80170014(Entity* self) {}
static s32 func_ptr_80170014(Entity* self) {}
int GetWeaponId(void) { return 45; }
static int GetWeaponId(void) { return 45; }
void EntityWeaponShieldSpell(Entity* self) {}
static void EntityWeaponShieldSpell(Entity* self) {}
void func_ptr_80170024(Entity* self) {}
static void func_ptr_80170024(Entity* self) {}
void func_ptr_80170028(Entity* self) {}
static void func_ptr_80170028(Entity* self) {}
void WeaponUnused2C(void) {}
static void WeaponUnused2C(void) {}
void WeaponUnused30(void) {}
static void WeaponUnused30(void) {}
void WeaponUnused34(void) {}
static void WeaponUnused34(void) {}
void WeaponUnused38(void) {}
static void WeaponUnused38(void) {}
void WeaponUnused3C(void) {}
static void WeaponUnused3C(void) {}

View File

@ -1,34 +1,40 @@
// Weapon ID #46. Used by weapons:
// Holbein dagger, Blue knuckles
#include "weapon_private.h"
extern u16* g_WeaponCluts[];
extern s32 g_HandId;
#include "shared.h"
#include "w_046_1.h"
#include "w_046_2.h"
#define g_Animset w_046_1
#define g_Animset2 w_046_2
INCLUDE_ASM("weapon/nonmatchings/w_046", EntityWeaponAttack);
INCLUDE_ASM("weapon/nonmatchings/w_046", func_ptr_80170004);
void func_ptr_80170008(Entity* self) {}
static void func_ptr_80170008(Entity* self) {}
void func_ptr_8017000C(Entity* self) {}
static void func_ptr_8017000C(Entity* self) {}
s32 func_ptr_80170010(Entity* self) {}
static s32 func_ptr_80170010(Entity* self) {}
s32 func_ptr_80170014(Entity* self) {}
static s32 func_ptr_80170014(Entity* self) {}
int GetWeaponId(void) { return 46; }
static int GetWeaponId(void) { return 46; }
void EntityWeaponShieldSpell(Entity* self) {}
static void EntityWeaponShieldSpell(Entity* self) {}
void func_ptr_80170024(Entity* self) {}
static void func_ptr_80170024(Entity* self) {}
void func_ptr_80170028(Entity* self) {}
static void func_ptr_80170028(Entity* self) {}
void WeaponUnused2C(void) {}
static void WeaponUnused2C(void) {}
void WeaponUnused30(void) {}
static void WeaponUnused30(void) {}
void WeaponUnused34(void) {}
static void WeaponUnused34(void) {}
void WeaponUnused38(void) {}
static void WeaponUnused38(void) {}
void WeaponUnused3C(void) {}
static void WeaponUnused3C(void) {}

View File

@ -1,7 +1,13 @@
// Weapon ID #47. Used by weapons:
// Dynamite
#include "weapon_private.h"
extern u16* g_WeaponCluts[];
extern s32 g_HandId;
#include "shared.h"
#include "w_047_1.h"
#include "w_047_2.h"
#define g_Animset w_047_1
#define g_Animset2 w_047_2
INCLUDE_ASM("weapon/nonmatchings/w_047", EntityWeaponAttack);
@ -47,28 +53,28 @@ s32 func_ptr_80170004(Entity* self) {
}
}
void func_ptr_80170008(Entity* self) {}
static void func_ptr_80170008(Entity* self) {}
void func_ptr_8017000C(Entity* self) {}
static void func_ptr_8017000C(Entity* self) {}
s32 func_ptr_80170010(Entity* self) {}
static s32 func_ptr_80170010(Entity* self) {}
s32 func_ptr_80170014(Entity* self) {}
static s32 func_ptr_80170014(Entity* self) {}
int GetWeaponId(void) { return 47; }
static int GetWeaponId(void) { return 47; }
void EntityWeaponShieldSpell(Entity* self) {}
static void EntityWeaponShieldSpell(Entity* self) {}
void func_ptr_80170024(Entity* self) {}
static void func_ptr_80170024(Entity* self) {}
void func_ptr_80170028(Entity* self) {}
static void func_ptr_80170028(Entity* self) {}
void WeaponUnused2C(void) {}
static void WeaponUnused2C(void) {}
void WeaponUnused30(void) {}
static void WeaponUnused30(void) {}
void WeaponUnused34(void) {}
static void WeaponUnused34(void) {}
void WeaponUnused38(void) {}
static void WeaponUnused38(void) {}
void WeaponUnused3C(void) {}
static void WeaponUnused3C(void) {}

View File

@ -1,7 +1,13 @@
// Weapon ID #48. Used by weapons:
// Thunderbrand, Unknown#178
#include "weapon_private.h"
extern u16* g_WeaponCluts[];
extern s32 g_HandId;
#include "shared.h"
#include "w_048_1.h"
#include "w_048_2.h"
#define g_Animset w_048_1
#define g_Animset2 w_048_2
INCLUDE_ASM("weapon/nonmatchings/w_048", EntityWeaponAttack);
@ -38,26 +44,26 @@ INCLUDE_ASM("weapon/nonmatchings/w_048", func_ptr_80170004);
INCLUDE_ASM("weapon/nonmatchings/w_048", func_ptr_80170008);
void func_ptr_8017000C(Entity* self) {}
static void func_ptr_8017000C(Entity* self) {}
s32 func_ptr_80170010(Entity* self) {}
static s32 func_ptr_80170010(Entity* self) {}
s32 func_ptr_80170014(Entity* self) {}
static s32 func_ptr_80170014(Entity* self) {}
int GetWeaponId(void) { return 48; }
static int GetWeaponId(void) { return 48; }
void EntityWeaponShieldSpell(Entity* self) {}
static void EntityWeaponShieldSpell(Entity* self) {}
void func_ptr_80170024(Entity* self) {}
static void func_ptr_80170024(Entity* self) {}
void func_ptr_80170028(Entity* self) {}
static void func_ptr_80170028(Entity* self) {}
void WeaponUnused2C(void) {}
static void WeaponUnused2C(void) {}
void WeaponUnused30(void) {}
static void WeaponUnused30(void) {}
void WeaponUnused34(void) {}
static void WeaponUnused34(void) {}
void WeaponUnused38(void) {}
static void WeaponUnused38(void) {}
void WeaponUnused3C(void) {}
static void WeaponUnused3C(void) {}

View File

@ -1,6 +1,12 @@
// Weapon ID #49. Used by weapons:
// Firebrand, Marsil, Unknown#179, Unknown#180
#include "weapon_private.h"
extern u16* g_WeaponCluts[];
extern s32 g_HandId;
#include "w_049_1.h"
#include "w_049_2.h"
#define g_Animset w_049_1
#define g_Animset2 w_049_2
#include "shared.h"
#include "sfx.h"
@ -46,7 +52,7 @@ INCLUDE_ASM("weapon/nonmatchings/w_049", func_ptr_80170010);
extern SpriteParts D_15B000_8017AA44[];
extern AnimationFrame D_15B000_8017B10C[];
s32 func_ptr_80170014(Entity* self) {
static s32 func_ptr_80170014(Entity* self) {
switch (self->step) {
case 0:
SetSpriteBank2(D_15B000_8017AA44);
@ -81,20 +87,20 @@ s32 func_ptr_80170014(Entity* self) {
}
}
int GetWeaponId(void) { return 49; }
static int GetWeaponId(void) { return 49; }
void EntityWeaponShieldSpell(Entity* self) {}
static void EntityWeaponShieldSpell(Entity* self) {}
void func_ptr_80170024(Entity* self) {}
static void func_ptr_80170024(Entity* self) {}
void func_ptr_80170028(Entity* self) {}
static void func_ptr_80170028(Entity* self) {}
void WeaponUnused2C(void) {}
static void WeaponUnused2C(void) {}
void WeaponUnused30(void) {}
static void WeaponUnused30(void) {}
void WeaponUnused34(void) {}
static void WeaponUnused34(void) {}
void WeaponUnused38(void) {}
static void WeaponUnused38(void) {}
void WeaponUnused3C(void) {}
static void WeaponUnused3C(void) {}

View File

@ -1,7 +1,13 @@
// Weapon ID #50. Used by weapons:
// Icebrand, Unknown#181, Unknown#199, Unknown#200, Unknown#201
#include "weapon_private.h"
extern u16* g_WeaponCluts[];
extern s32 g_HandId;
#include "shared.h"
#include "w_050_1.h"
#include "w_050_2.h"
#define g_Animset w_050_1
#define g_Animset2 w_050_2
INCLUDE_ASM("weapon/nonmatchings/w_050", EntityWeaponAttack);
@ -119,22 +125,22 @@ INCLUDE_ASM("weapon/nonmatchings/w_050", func_ptr_8017000C);
INCLUDE_ASM("weapon/nonmatchings/w_050", func_ptr_80170010);
s32 func_ptr_80170014(Entity* self) {}
static s32 func_ptr_80170014(Entity* self) {}
int GetWeaponId(void) { return 50; }
static int GetWeaponId(void) { return 50; }
void EntityWeaponShieldSpell(Entity* self) {}
static void EntityWeaponShieldSpell(Entity* self) {}
void func_ptr_80170024(Entity* self) {}
static void func_ptr_80170024(Entity* self) {}
void func_ptr_80170028(Entity* self) {}
static void func_ptr_80170028(Entity* self) {}
void WeaponUnused2C(void) {}
static void WeaponUnused2C(void) {}
void WeaponUnused30(void) {}
static void WeaponUnused30(void) {}
void WeaponUnused34(void) {}
static void WeaponUnused34(void) {}
void WeaponUnused38(void) {}
static void WeaponUnused38(void) {}
void WeaponUnused3C(void) {}
static void WeaponUnused3C(void) {}

View File

@ -2,7 +2,13 @@
// Estoc, Claymore, Flamberge, Zwei hander, Obsidian sword, Great Sword,
// Unknown#182, Unknown#183, Unknown#184, Unknown#185
#include "weapon_private.h"
extern u16* g_WeaponCluts[];
extern s32 g_HandId;
#include "shared.h"
#include "w_051_1.h"
#include "w_051_2.h"
#define g_Animset w_051_1
#define g_Animset2 w_051_2
#include "sfx.h"
u16 D_169000_8017A950[] = {
@ -290,7 +296,7 @@ void func_169000_8017B1DC(s32 arg0) {
LoadImage(&rect, (u_long*)D_8006EDCC);
}
void EntityWeaponAttack(Entity* self) {
static void EntityWeaponAttack(Entity* self) {
WeaponAnimation* anim;
s16 subType;
@ -420,7 +426,7 @@ s32 func_ptr_80170004(Entity* self) {
}
}
void func_ptr_80170008(Entity* self) {
static void func_ptr_80170008(Entity* self) {
AnimProperties* anim;
Primitive* prim;
s16 rot;
@ -557,26 +563,26 @@ void func_ptr_80170008(Entity* self) {
prim->y3 = y - (((rsin(rot) >> 4) * t) >> 9);
}
void func_ptr_8017000C(Entity* self) {}
static void func_ptr_8017000C(Entity* self) {}
s32 func_ptr_80170010(Entity* self) {}
static s32 func_ptr_80170010(Entity* self) {}
s32 func_ptr_80170014(Entity* self) {}
static s32 func_ptr_80170014(Entity* self) {}
int GetWeaponId(void) { return 51; }
static int GetWeaponId(void) { return 51; }
void EntityWeaponShieldSpell(Entity* self) {}
static void EntityWeaponShieldSpell(Entity* self) {}
void func_ptr_80170024(Entity* self) {}
static void func_ptr_80170024(Entity* self) {}
void func_ptr_80170028(Entity* self) {}
static void func_ptr_80170028(Entity* self) {}
void WeaponUnused2C(void) {}
static void WeaponUnused2C(void) {}
void WeaponUnused30(void) {}
static void WeaponUnused30(void) {}
void WeaponUnused34(void) {}
static void WeaponUnused34(void) {}
void WeaponUnused38(void) {}
static void WeaponUnused38(void) {}
void WeaponUnused3C(void) {}
static void WeaponUnused3C(void) {}

View File

@ -1,7 +1,13 @@
// Weapon ID #52. Used by weapons:
// Alucard shield, Unknown#214
#include "weapon_private.h"
extern u16* g_WeaponCluts[];
extern s32 g_HandId;
#include "shared.h"
#include "w_052_1.h"
#include "w_052_2.h"
#define g_Animset w_052_1
#define g_Animset2 w_052_2
#include "sfx.h"
extern SpriteParts D_170000_8017A040[];
@ -18,7 +24,7 @@ extern s16 D_170000_8017CBA0[];
extern s16 D_170000_8017CBB8[];
extern f32 D_170000_8017CBD0[11][4];
void EntityWeaponAttack(Entity* self) {
static void EntityWeaponAttack(Entity* self) {
s32 anim;
s32 anim2;
s32 attackButton;
@ -184,17 +190,17 @@ void EntityWeaponAttack(Entity* self) {
}
}
void func_ptr_80170008(Entity* self) {}
static void func_ptr_80170008(Entity* self) {}
void func_ptr_8017000C(Entity* self) {}
static void func_ptr_8017000C(Entity* self) {}
s32 func_ptr_80170010(Entity* self) {}
static s32 func_ptr_80170010(Entity* self) {}
s32 func_ptr_80170014(Entity* self) {}
static s32 func_ptr_80170014(Entity* self) {}
int GetWeaponId(void) { return 52; }
static int GetWeaponId(void) { return 52; }
void EntityWeaponShieldSpell(Entity* self) {
static void EntityWeaponShieldSpell(Entity* self) {
Primitive* prim;
s16 angle;
s16 selfX;
@ -676,16 +682,16 @@ s32 func_ptr_80170004(Entity* self) {
}
}
void func_ptr_80170024(Entity* self) {}
static void func_ptr_80170024(Entity* self) {}
void func_ptr_80170028(Entity* self) {}
static void func_ptr_80170028(Entity* self) {}
void WeaponUnused2C(void) {}
static void WeaponUnused2C(void) {}
void WeaponUnused30(void) {}
static void WeaponUnused30(void) {}
void WeaponUnused34(void) {}
static void WeaponUnused34(void) {}
void WeaponUnused38(void) {}
static void WeaponUnused38(void) {}
void WeaponUnused3C(void) {}
static void WeaponUnused3C(void) {}

View File

@ -2,7 +2,13 @@
// Katana, Osafune katana, Masamune, Yasutsuna, Unknown#189, Unknown#192,
// Unknown#193, Unknown#194
#include "weapon_private.h"
extern u16* g_WeaponCluts[];
extern s32 g_HandId;
#include "shared.h"
#include "w_053_1.h"
#include "w_053_2.h"
#define g_Animset w_053_1
#define g_Animset2 w_053_2
INCLUDE_ASM("weapon/nonmatchings/w_053", EntityWeaponAttack);
@ -12,24 +18,24 @@ INCLUDE_ASM("weapon/nonmatchings/w_053", func_ptr_80170008);
INCLUDE_ASM("weapon/nonmatchings/w_053", func_ptr_8017000C);
s32 func_ptr_80170010(Entity* self) {}
static s32 func_ptr_80170010(Entity* self) {}
s32 func_ptr_80170014(Entity* self) {}
static s32 func_ptr_80170014(Entity* self) {}
int GetWeaponId(void) { return 53; }
static int GetWeaponId(void) { return 53; }
void EntityWeaponShieldSpell(Entity* self) {}
static void EntityWeaponShieldSpell(Entity* self) {}
void func_ptr_80170024(Entity* self) {}
static void func_ptr_80170024(Entity* self) {}
void func_ptr_80170028(Entity* self) {}
static void func_ptr_80170028(Entity* self) {}
void WeaponUnused2C(void) {}
static void WeaponUnused2C(void) {}
void WeaponUnused30(void) {}
static void WeaponUnused30(void) {}
void WeaponUnused34(void) {}
static void WeaponUnused34(void) {}
void WeaponUnused38(void) {}
static void WeaponUnused38(void) {}
void WeaponUnused3C(void) {}
static void WeaponUnused3C(void) {}

View File

@ -1,34 +1,40 @@
// Weapon ID #54. Used by weapons:
// Gurthang, Unknown#195
#include "weapon_private.h"
extern u16* g_WeaponCluts[];
extern s32 g_HandId;
#include "shared.h"
#include "w_054_1.h"
#include "w_054_2.h"
#define g_Animset w_054_1
#define g_Animset2 w_054_2
INCLUDE_ASM("weapon/nonmatchings/w_054", EntityWeaponAttack);
s32 func_ptr_80170004(Entity* self) {}
void func_ptr_80170008(Entity* self) {}
static void func_ptr_80170008(Entity* self) {}
void func_ptr_8017000C(Entity* self) {}
static void func_ptr_8017000C(Entity* self) {}
s32 func_ptr_80170010(Entity* self) {}
static s32 func_ptr_80170010(Entity* self) {}
s32 func_ptr_80170014(Entity* self) {}
static s32 func_ptr_80170014(Entity* self) {}
int GetWeaponId(void) { return 54; }
static int GetWeaponId(void) { return 54; }
void EntityWeaponShieldSpell(Entity* self) {}
static void EntityWeaponShieldSpell(Entity* self) {}
void func_ptr_80170024(Entity* self) {}
static void func_ptr_80170024(Entity* self) {}
void func_ptr_80170028(Entity* self) {}
static void func_ptr_80170028(Entity* self) {}
void WeaponUnused2C(void) {}
static void WeaponUnused2C(void) {}
void WeaponUnused30(void) {}
static void WeaponUnused30(void) {}
void WeaponUnused34(void) {}
static void WeaponUnused34(void) {}
void WeaponUnused38(void) {}
static void WeaponUnused38(void) {}
void WeaponUnused3C(void) {}
static void WeaponUnused3C(void) {}

View File

@ -1,34 +1,40 @@
// Weapon ID #55. Used by weapons:
// Holy sword, Unknown#196
#include "weapon_private.h"
extern u16* g_WeaponCluts[];
extern s32 g_HandId;
#include "shared.h"
#include "w_055_1.h"
#include "w_055_2.h"
#define g_Animset w_055_1
#define g_Animset2 w_055_2
INCLUDE_ASM("weapon/nonmatchings/w_055", EntityWeaponAttack);
INCLUDE_ASM("weapon/nonmatchings/w_055", func_ptr_80170004);
void func_ptr_80170008(Entity* self) {}
static void func_ptr_80170008(Entity* self) {}
void func_ptr_8017000C(Entity* self) {}
static void func_ptr_8017000C(Entity* self) {}
s32 func_ptr_80170010(Entity* self) {}
static s32 func_ptr_80170010(Entity* self) {}
s32 func_ptr_80170014(Entity* self) {}
static s32 func_ptr_80170014(Entity* self) {}
int GetWeaponId(void) { return 55; }
static int GetWeaponId(void) { return 55; }
void EntityWeaponShieldSpell(Entity* self) {}
static void EntityWeaponShieldSpell(Entity* self) {}
void func_ptr_80170024(Entity* self) {}
static void func_ptr_80170024(Entity* self) {}
void func_ptr_80170028(Entity* self) {}
static void func_ptr_80170028(Entity* self) {}
void WeaponUnused2C(void) {}
static void WeaponUnused2C(void) {}
void WeaponUnused30(void) {}
static void WeaponUnused30(void) {}
void WeaponUnused34(void) {}
static void WeaponUnused34(void) {}
void WeaponUnused38(void) {}
static void WeaponUnused38(void) {}
void WeaponUnused3C(void) {}
static void WeaponUnused3C(void) {}

View File

@ -1,34 +1,40 @@
// Weapon ID #56. Used by weapons:
// Muramasa
#include "weapon_private.h"
extern u16* g_WeaponCluts[];
extern s32 g_HandId;
#include "shared.h"
#include "w_056_1.h"
#include "w_056_2.h"
#define g_Animset w_056_1
#define g_Animset2 w_056_2
INCLUDE_ASM("weapon/nonmatchings/w_056", EntityWeaponAttack);
INCLUDE_ASM("weapon/nonmatchings/w_056", func_ptr_80170004);
void func_ptr_80170008(Entity* self) {}
static void func_ptr_80170008(Entity* self) {}
void func_ptr_8017000C(Entity* self) {}
static void func_ptr_8017000C(Entity* self) {}
s32 func_ptr_80170010(Entity* self) {}
static s32 func_ptr_80170010(Entity* self) {}
s32 func_ptr_80170014(Entity* self) {}
static s32 func_ptr_80170014(Entity* self) {}
int GetWeaponId(void) { return 56; }
static int GetWeaponId(void) { return 56; }
void EntityWeaponShieldSpell(Entity* self) {}
static void EntityWeaponShieldSpell(Entity* self) {}
void func_ptr_80170024(Entity* self) {}
static void func_ptr_80170024(Entity* self) {}
void func_ptr_80170028(Entity* self) {}
static void func_ptr_80170028(Entity* self) {}
void WeaponUnused2C(void) {}
static void WeaponUnused2C(void) {}
void WeaponUnused30(void) {}
static void WeaponUnused30(void) {}
void WeaponUnused34(void) {}
static void WeaponUnused34(void) {}
void WeaponUnused38(void) {}
static void WeaponUnused38(void) {}
void WeaponUnused3C(void) {}
static void WeaponUnused3C(void) {}

View File

@ -1,11 +1,17 @@
// Weapon ID #57. Used by weapons:
// Mablung Sword
#include "weapon_private.h"
extern u16* g_WeaponCluts[];
extern s32 g_HandId;
#include "shared.h"
#include "w_057_1.h"
#include "w_057_2.h"
#define g_Animset w_057_1
#define g_Animset2 w_057_2
extern WeaponAnimation D_193000_8017B06C[];
void EntityWeaponAttack(Entity* self) {
static void EntityWeaponAttack(Entity* self) {
WeaponAnimation* anim;
s8 animIndex;
@ -59,28 +65,28 @@ void EntityWeaponAttack(Entity* self) {
s32 func_ptr_80170004(Entity* self) {}
void func_ptr_80170008(Entity* self) {}
static void func_ptr_80170008(Entity* self) {}
void func_ptr_8017000C(Entity* self) {}
static void func_ptr_8017000C(Entity* self) {}
s32 func_ptr_80170010(Entity* self) {}
static s32 func_ptr_80170010(Entity* self) {}
s32 func_ptr_80170014(Entity* self) {}
static s32 func_ptr_80170014(Entity* self) {}
s32 GetWeaponId(void) { return 0; }
void EntityWeaponShieldSpell(Entity* self) {}
static void EntityWeaponShieldSpell(Entity* self) {}
void func_ptr_80170024(Entity* self) {}
static void func_ptr_80170024(Entity* self) {}
void func_ptr_80170028(Entity* self) {}
static void func_ptr_80170028(Entity* self) {}
void WeaponUnused2C(void) {}
static void WeaponUnused2C(void) {}
void WeaponUnused30(void) {}
static void WeaponUnused30(void) {}
void WeaponUnused34(void) {}
static void WeaponUnused34(void) {}
void WeaponUnused38(void) {}
static void WeaponUnused38(void) {}
void WeaponUnused3C(void) {}
static void WeaponUnused3C(void) {}

View File

@ -1,6 +1,12 @@
// Weapon ID #58. Used by weapons:
// Alucart shield, Unknown#215
#include "weapon_private.h"
extern u16* g_WeaponCluts[];
extern s32 g_HandId;
#include "w_058_1.h"
#include "w_058_2.h"
#define g_Animset w_058_1
#define g_Animset2 w_058_2
#include "shared.h"
#include "sfx.h"
@ -9,7 +15,7 @@ extern s8 D_19A000_8017AB3C;
extern AnimationFrame* D_19A000_8017AB84;
extern s32 D_19A000_8017BB40;
void EntityWeaponAttack(Entity* self) {
static void EntityWeaponAttack(Entity* self) {
s32 anim1;
s32 anim2;
s32 attackButton;
@ -147,17 +153,17 @@ void EntityWeaponAttack(Entity* self) {
s32 func_ptr_80170004(Entity* self) {}
void func_ptr_80170008(Entity* self) {}
static void func_ptr_80170008(Entity* self) {}
void func_ptr_8017000C(Entity* self) {}
static void func_ptr_8017000C(Entity* self) {}
s32 func_ptr_80170010(Entity* self) {}
static s32 func_ptr_80170010(Entity* self) {}
s32 func_ptr_80170014(Entity* self) {}
static s32 func_ptr_80170014(Entity* self) {}
s32 GetWeaponId(void) { return 52; }
void EntityWeaponShieldSpell(Entity* self) {
static void EntityWeaponShieldSpell(Entity* self) {
Primitive* prim;
s16 primRight;
s16 primLeft;
@ -345,16 +351,16 @@ void EntityWeaponShieldSpell(Entity* self) {
}
}
void func_ptr_80170024(Entity* self) {}
static void func_ptr_80170024(Entity* self) {}
void func_ptr_80170028(Entity* self) {}
static void func_ptr_80170028(Entity* self) {}
void WeaponUnused2C(void) {}
static void WeaponUnused2C(void) {}
void WeaponUnused30(void) {}
static void WeaponUnused30(void) {}
void WeaponUnused34(void) {}
static void WeaponUnused34(void) {}
void WeaponUnused38(void) {}
static void WeaponUnused38(void) {}
void WeaponUnused3C(void) {}
static void WeaponUnused3C(void) {}

View File

@ -24,34 +24,37 @@
#endif
// exported
void EntityWeaponAttack(Entity* self);
void LoadWeaponPalette(s32 clutIndex);
s32 func_ptr_80170004(Entity* self);
void func_ptr_80170008(Entity* self);
void func_ptr_8017000C(Entity* self);
s32 func_ptr_80170010(Entity* self);
s32 func_ptr_80170014(Entity* self);
int GetWeaponId(void);
void EntityWeaponShieldSpell(Entity* self);
void func_ptr_80170024(Entity* self);
void func_ptr_80170028(Entity* self);
void WeaponUnused2C(void);
void WeaponUnused30(void);
void WeaponUnused34(void);
void WeaponUnused38(void);
void WeaponUnused3C(void);
// internals
extern SpriteParts* g_Animset[];
extern SpriteParts* g_Animset2[];
extern u16* g_WeaponCluts[];
extern s32 g_HandId;
static void EntityWeaponAttack(Entity* self);
static void LoadWeaponPalette(s32 clutIndex);
static s32 func_ptr_80170004(Entity* self);
static void func_ptr_80170008(Entity* self);
static void func_ptr_8017000C(Entity* self);
static s32 func_ptr_80170010(Entity* self);
static s32 func_ptr_80170014(Entity* self);
static int GetWeaponId(void);
static void EntityWeaponShieldSpell(Entity* self);
static void func_ptr_80170024(Entity* self);
static void func_ptr_80170028(Entity* self);
static void WeaponUnused2C(void);
static void WeaponUnused30(void);
static void WeaponUnused34(void);
static void WeaponUnused38(void);
static void WeaponUnused3C(void);
void DestroyEntity(Entity* entity);
void SetSpriteBank1(SpriteParts* animset);
void SetSpriteBank2(SpriteParts* animset);
static void SetSpriteBank1(SpriteParts* animset);
static void SetSpriteBank2(SpriteParts* animset);
static void DecelerateX(s32 amount);
static void DecelerateY(s32 amount);
static void SetSpeedX(s32 speed);
Weapon OVL_EXPORT(header) = {
EntityWeaponAttack, func_ptr_80170004, func_ptr_80170008,
func_ptr_8017000C, func_ptr_80170010, func_ptr_80170014,
GetWeaponId, LoadWeaponPalette, EntityWeaponShieldSpell,
func_ptr_80170024, func_ptr_80170028, WeaponUnused2C,
WeaponUnused30, WeaponUnused34, WeaponUnused38,
WeaponUnused3C,
};
#endif

View File

@ -0,0 +1,257 @@
package main
import (
"bytes"
"encoding/json"
"fmt"
"github.com/xeeynamo/sotn-decomp/tools/sotn-assets/psx"
"golang.org/x/sync/errgroup"
"gopkg.in/yaml.v2"
"os"
"path"
"path/filepath"
"strconv"
)
type assetSegmentEntry struct {
Start int `yaml:"start"`
Vram psx.Addr `yaml:"vram"`
Assets [][]string `yaml:"assets"`
}
type assetFileEntry struct {
Target string `yaml:"target"`
AssetDir string `yaml:"asset_path"`
SourceDir string `yaml:"src_path"`
Segments []assetSegmentEntry `yaml:"segments"`
}
type assetConfig struct {
Files []assetFileEntry `yaml:"files"`
}
type assetEntry struct {
data []byte
start int
end int
assetDir string
name string
args []string
ramBase psx.Addr
}
type assetBuildEntry struct {
assetDir string
srcDir string
name string
}
var extractHandlers = map[string]func(assetEntry) error{
"frameset": func(e assetEntry) error {
var set []*[]sprite
var err error
if e.start != e.end {
r := bytes.NewReader(e.data)
set, _, err = readFrameSet(r, e.ramBase, e.ramBase.Sum(e.start))
if err != nil {
return err
}
} else {
set = make([]*[]sprite, 0)
}
content, err := json.MarshalIndent(set, "", " ")
if err != nil {
return err
}
outPath := path.Join(e.assetDir, fmt.Sprintf("%s.frameset.json", e.name))
dir := filepath.Dir(outPath)
if err := os.MkdirAll(dir, 0755); err != nil {
fmt.Printf("failed to create directory %s: %v\n", dir, err)
return err
}
return os.WriteFile(outPath, content, 0644)
},
}
var buildHandlers = map[string]func(assetBuildEntry) error{
"frameset": func(e assetBuildEntry) error {
inFileName := path.Join(e.assetDir, fmt.Sprintf("%s.frameset.json", e.name))
outFileName := path.Join(e.srcDir, fmt.Sprintf("%s.h", e.name))
return buildFrameSet(inFileName, outFileName, e.name)
},
}
func parseArgs(entry []string) (offset int64, kind string, args []string, err error) {
if len(entry) < 2 {
err = fmt.Errorf("asset %v is malformed", entry)
return
}
offsetRaw := entry[0]
if len(offsetRaw) >= 2 && offsetRaw[0] == '0' && offsetRaw[1] == 'x' {
offset, err = strconv.ParseInt(offsetRaw[2:], 16, 32)
} else {
offset, err = strconv.ParseInt(offsetRaw, 10, 32)
}
if err != nil {
err = fmt.Errorf("offset %q in asset %v is malformed", offset, entry)
return
}
kind = entry[1]
args = entry[2:]
return
}
func readConfig(path string) (*assetConfig, error) {
yamlFile, err := os.ReadFile(path)
if err != nil {
return nil, fmt.Errorf("Error reading YAML file: %v", err)
}
var data assetConfig
if err = yaml.Unmarshal(yamlFile, &data); err != nil {
return nil, fmt.Errorf("Error unmarshalling YAML file: %v", err)
}
return &data, nil
}
func enqueueExtractAssetEntry(
eg *errgroup.Group,
handler func(assetEntry) error,
assetDir string,
name string,
data []byte,
start int,
end int,
args []string,
ramBase psx.Addr) {
eg.Go(func() error {
if err := handler(assetEntry{
data: data,
start: start,
end: end,
assetDir: assetDir,
ramBase: ramBase,
name: name,
args: args,
}); err != nil {
return fmt.Errorf("unable to extract asset %q: %v", name, err)
}
return nil
})
}
func extractAssetFile(file assetFileEntry) error {
var eg errgroup.Group
data, err := os.ReadFile(file.Target)
if err != nil {
return err
}
for _, segment := range file.Segments {
if len(segment.Assets) == 0 {
continue
}
off, kind, args, err := parseArgs(segment.Assets[0])
if err != nil {
return err
}
for i := 1; i < len(segment.Assets); i++ {
off2, kind2, args2, err2 := parseArgs(segment.Assets[i])
if err2 != nil {
return err2
}
size := int(off2 - off)
if size < 0 {
return fmt.Errorf("offset 0x%X should be smaller than 0x%X, asset %v", off, off2, segment.Assets[i-1])
}
if kind == "skip" {
continue
}
if handler, found := extractHandlers[kind]; found {
name := strconv.FormatUint(uint64(off), 16)
if len(args) > 0 {
name = args[0]
args = args[1:]
}
start := int(off) - segment.Start
end := start + size
enqueueExtractAssetEntry(&eg, handler, file.AssetDir, name, data[segment.Start:], start, end, args, segment.Vram)
}
off = off2
kind = kind2
args = args2
}
}
return eg.Wait()
}
func enqueueBuildAssetEntry(
eg *errgroup.Group,
handler func(assetBuildEntry) error,
assetDir,
sourceDir,
name string) {
eg.Go(func() error {
err := handler(assetBuildEntry{
assetDir: assetDir,
srcDir: sourceDir,
name: name,
})
if err != nil {
return fmt.Errorf("unable to build asset %q: %v", name, err)
}
return nil
})
}
func extractFromConfig(c *assetConfig) error {
var eg errgroup.Group
for _, file := range c.Files {
if len(file.Segments) == 0 {
continue
}
eg.Go(func() error {
return extractAssetFile(file)
})
}
return eg.Wait()
}
func buildAssetFile(file assetFileEntry) error {
var eg errgroup.Group
for _, segment := range file.Segments {
if len(segment.Assets) == 0 {
continue
}
for _, asset := range segment.Assets {
off, kind, args, err := parseArgs(asset)
if err != nil {
return err
}
if kind == "skip" {
continue
}
if handler, found := buildHandlers[kind]; found {
name := strconv.FormatUint(uint64(off), 16)
if len(args) > 0 {
name = args[0]
args = args[1:]
}
enqueueBuildAssetEntry(&eg, handler, file.AssetDir, file.SourceDir, name)
}
}
}
return eg.Wait()
}
func buildFromConfig(c *assetConfig) error {
var eg errgroup.Group
for _, file := range c.Files {
if len(file.Segments) == 0 {
continue
}
eg.Go(func() error {
return buildAssetFile(file)
})
}
return eg.Wait()
}

View File

@ -253,7 +253,7 @@ func buildLayers(inputDir string, fileName string, outputDir string) error {
}
sb.WriteString("static MyLayer layers[] = {\n")
sb.WriteString(" {},\n")
sb.WriteString(" { NULL, NULL, 0, 0, 0, 0 },\n")
for _, l := range layers[1:] {
sb.WriteString(fmt.Sprintf(" { %s, %s, 0x%08X, 0x%02X, %d, %d },\n",
makeSymbolFromFileName(l["data"].(string)),
@ -329,6 +329,25 @@ func buildSpriteGroup(sb *strings.Builder, sprites []*[]sprite, mainSymbol strin
}
}
func buildFrameSet(inputFileName, outputFileName, prefix string) error {
data, err := os.ReadFile(inputFileName)
if err != nil {
return fmt.Errorf("unable to open %q: %v", inputFileName, err)
}
var sprites []*[]sprite
if err := json.Unmarshal(data, &sprites); err != nil {
return fmt.Errorf("unable to parse %q: %v", inputFileName, err)
}
sb := strings.Builder{}
sb.WriteString("// clang-format off\n")
r := rand.New(rand.NewSource(int64(len(data))))
if len(sprites) > 0 {
buildSpriteGroup(&sb, sprites, prefix, r)
}
return os.WriteFile(outputFileName, []byte(sb.String()), 0644)
}
func buildSprites(fileName string, outputDir string) error {
ovlName := path.Base(outputDir)
data, err := os.ReadFile(fileName)

View File

@ -2,12 +2,13 @@ package main
import (
"fmt"
"github.com/xeeynamo/sotn-decomp/tools/sotn-assets/psx"
"sort"
)
type dataRange struct {
begin PsxOffset
end PsxOffset
begin psx.Addr
end psx.Addr
}
func (r dataRange) Format(f fmt.State, c rune) {
@ -15,7 +16,7 @@ func (r dataRange) Format(f fmt.State, c rune) {
}
func (r dataRange) empty() bool {
return r.begin == RamNull && r.end == RamNull
return r.begin == psx.RamNull && r.end == psx.RamNull
}
func mergeDataRanges(ranges []dataRange) dataRange {

View File

@ -2,4 +2,7 @@ module github.com/xeeynamo/sotn-decomp/tools/sotn-assets
go 1.21
require golang.org/x/sync v0.7.0 // indirect
require (
golang.org/x/sync v0.7.0 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
)

View File

@ -1,2 +1,5 @@
golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M=
golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=

View File

@ -2,6 +2,7 @@ package main
import (
"encoding/binary"
"github.com/xeeynamo/sotn-decomp/tools/sotn-assets/psx"
"os"
)
@ -20,7 +21,7 @@ type gfxEntry struct {
Y uint16
Width uint16
Height uint16
Data PsxOffset
Data psx.Addr
}
type gfxBlock struct {
@ -34,15 +35,15 @@ type gfx struct {
indices []int
}
func readGraphics(file *os.File, off PsxOffset) (gfx, dataRange, error) {
if err := off.moveFile(file); err != nil {
func readGraphics(file *os.File, off psx.Addr) (gfx, dataRange, error) {
if err := off.MoveFile(file, psx.RamStageBegin); err != nil {
return gfx{}, dataRange{}, err
}
// all the offsets are before the array, so it is easy to find where the offsets array ends
blockOffsets := []PsxOffset{}
blockOffsets := []psx.Addr{}
for {
var offBank PsxOffset
var offBank psx.Addr
if err := binary.Read(file, binary.LittleEndian, &offBank); err != nil {
return gfx{}, dataRange{}, err
}
@ -53,15 +54,15 @@ func readGraphics(file *os.File, off PsxOffset) (gfx, dataRange, error) {
}
// the order of each gfxBlock must be preserved
pool := map[PsxOffset]int{}
pool[RamNull] = -1
pool := map[psx.Addr]int{}
pool[psx.RamNull] = -1
blocks := []gfxBlock{}
ranges := []dataRange{}
for _, blockOffset := range sortUniqueOffsets(blockOffsets) {
if blockOffset == RamNull { // exception for ST0
if blockOffset == psx.RamNull { // exception for ST0
continue
}
if err := blockOffset.moveFile(file); err != nil {
if err := blockOffset.MoveFile(file, psx.RamStageBegin); err != nil {
return gfx{}, dataRange{}, err
}
var block gfxBlock
@ -77,7 +78,7 @@ func readGraphics(file *os.File, off PsxOffset) (gfx, dataRange, error) {
blocks = append(blocks, block)
ranges = append(ranges, dataRange{
begin: blockOffset,
end: blockOffset.sum(4),
end: blockOffset.Sum(4),
})
continue
}
@ -96,7 +97,7 @@ func readGraphics(file *os.File, off PsxOffset) (gfx, dataRange, error) {
blocks = append(blocks, block)
ranges = append(ranges, dataRange{
begin: blockOffset,
end: blockOffset.sum(4 + len(block.entries)*12 + 4),
end: blockOffset.Sum(4 + len(block.entries)*12 + 4),
})
}
@ -107,6 +108,6 @@ func readGraphics(file *os.File, off PsxOffset) (gfx, dataRange, error) {
return g, mergeDataRanges(append(ranges, dataRange{
begin: off,
end: off.sum(len(blockOffsets) * 4),
end: off.Sum(len(blockOffsets) * 4),
})), nil
}

View File

@ -3,13 +3,14 @@ package main
import (
"encoding/binary"
"encoding/json"
"github.com/xeeynamo/sotn-decomp/tools/sotn-assets/psx"
"os"
"slices"
)
type layer struct {
Data PsxOffset
Tiledef PsxOffset
Data psx.Addr
Tiledef psx.Addr
PackedInfo uint32
ZPriority uint16
UnkE uint8
@ -76,44 +77,44 @@ func (r roomLayers) MarshalJSON() ([]byte, error) {
return json.Marshal(m)
}
func readLayers(file *os.File, off PsxOffset) ([]roomLayers, dataRange, error) {
func readLayers(file *os.File, off psx.Addr) ([]roomLayers, dataRange, error) {
if off == 0 {
return nil, dataRange{}, nil
}
if err := off.moveFile(file); err != nil {
if err := off.MoveFile(file, psx.RamStageBegin); err != nil {
return nil, dataRange{}, err
}
// when the data starts to no longer makes sense, we can assume we reached the end of the array
layerOffsets := []PsxOffset{}
layersOff := make([]PsxOffset, 2)
layerOffsets := []psx.Addr{}
layersOff := make([]psx.Addr, 2)
for {
if err := binary.Read(file, binary.LittleEndian, layersOff); err != nil {
return nil, dataRange{}, err
}
if layersOff[0] <= RamStageBegin || layersOff[0] >= off ||
layersOff[1] <= RamStageBegin || layersOff[1] >= off {
if layersOff[0] <= psx.RamStageBegin || layersOff[0] >= off ||
layersOff[1] <= psx.RamStageBegin || layersOff[1] >= off {
break
}
layerOffsets = append(layerOffsets, layersOff...)
}
// Creates a map of layers, so we can re-use them when a layer is used by multiple rooms
pool := map[PsxOffset]*layer{}
pool[PsxOffset(0)] = nil
pool := map[psx.Addr]*layer{}
pool[psx.Addr(0)] = nil
for _, layerOffset := range layerOffsets {
if _, exists := pool[layerOffset]; exists {
continue
}
if err := layerOffset.moveFile(file); err != nil {
if err := layerOffset.MoveFile(file, psx.RamStageBegin); err != nil {
return nil, dataRange{}, err
}
var l layer
if err := binary.Read(file, binary.LittleEndian, &l); err != nil {
return nil, dataRange{}, err
}
if l.Data != RamNull || l.Tiledef != RamNull || l.PackedInfo != 0 {
if l.Data != psx.RamNull || l.Tiledef != psx.RamNull || l.PackedInfo != 0 {
pool[layerOffset] = &l
} else {
pool[layerOffset] = nil
@ -129,6 +130,6 @@ func readLayers(file *os.File, off PsxOffset) ([]roomLayers, dataRange, error) {
}
return roomsLayers, dataRange{
begin: slices.Min(layerOffsets),
end: off.sum(count * 8),
end: off.Sum(count * 8),
}, nil
}

View File

@ -3,6 +3,7 @@ package main
import (
"encoding/binary"
"fmt"
"github.com/xeeynamo/sotn-decomp/tools/sotn-assets/psx"
"io"
"os"
)
@ -73,24 +74,24 @@ func hydrateYOrderFields(x layouts, y layouts) error {
return nil
}
func readEntityLayout(file *os.File, off PsxOffset, count int, isX bool) (layouts, []dataRange, error) {
if err := off.moveFile(file); err != nil {
func readEntityLayout(file *os.File, off psx.Addr, count int, isX bool) (layouts, []dataRange, error) {
if err := off.MoveFile(file, psx.RamStageBegin); err != nil {
return layouts{}, nil, err
}
// there are two copies of the layout, one ordered by X and the other one ordered by Y
// we will only read the first one, which is ordered by Y
blockOffsets := make([]PsxOffset, count)
blockOffsets := make([]psx.Addr, count)
if err := binary.Read(file, binary.LittleEndian, blockOffsets); err != nil {
return layouts{}, nil, err
}
// the order of each layout entry must be preserved
pool := map[PsxOffset]int{}
pool := map[psx.Addr]int{}
blocks := [][]layoutEntry{}
xRanges := []dataRange{}
for _, blockOffset := range sortUniqueOffsets(blockOffsets) {
if err := blockOffset.moveFile(file); err != nil {
if err := blockOffset.MoveFile(file, psx.RamStageBegin); err != nil {
return layouts{}, nil, err
}
entries := []layoutEntry{}
@ -116,18 +117,18 @@ func readEntityLayout(file *os.File, off PsxOffset, count int, isX bool) (layout
blocks = append(blocks, entries)
xRanges = append(xRanges, dataRange{
begin: blockOffset,
end: blockOffset.sum(len(entries) * 10),
end: blockOffset.Sum(len(entries) * 10),
})
}
// the very last entry needs to be aligned by 4
xRanges[len(xRanges)-1].end = xRanges[len(xRanges)-1].end.align4()
xRanges[len(xRanges)-1].end = xRanges[len(xRanges)-1].end.Align4()
l := layouts{Entities: blocks}
for _, blockOffset := range blockOffsets {
l.Indices = append(l.Indices, pool[blockOffset])
}
endOfArray := off.sum(count * 4)
endOfArray := off.Sum(count * 4)
if isX { // we want to do the same thing with the vertically aligned layout
yLayouts, yRanges, err := readEntityLayout(file, endOfArray, count, false)
if err != nil {

View File

@ -5,6 +5,7 @@ import (
"encoding/json"
"flag"
"fmt"
"github.com/xeeynamo/sotn-decomp/tools/sotn-assets/psx"
"os"
"path"
)
@ -22,23 +23,23 @@ type ovl struct {
graphics dataContainer[gfx]
layouts dataContainer[layouts]
layoutsExtraRange dataRange
tileMaps dataContainer[map[PsxOffset][]byte]
tileDefs dataContainer[map[PsxOffset]tileDef]
tileMaps dataContainer[map[psx.Addr][]byte]
tileDefs dataContainer[map[psx.Addr]tileDef]
}
func getOvlAssets(fileName string) (ovl, error) {
type stageHeader struct {
FnUpdate PsxOffset
FnHitDetection PsxOffset
FnUpdateRoomPos PsxOffset
FnInitRoomEntities PsxOffset
Rooms PsxOffset // ✅
Sprites PsxOffset // ✅
Cluts PsxOffset // 🫥
Layouts PsxOffset // ✅
Layers PsxOffset // ✅
Graphics PsxOffset // 🫥 WIP
FnUpdateStageEntities PsxOffset
FnUpdate psx.Addr
FnHitDetection psx.Addr
FnUpdateRoomPos psx.Addr
FnInitRoomEntities psx.Addr
Rooms psx.Addr // ✅
Sprites psx.Addr // ✅
Cluts psx.Addr // 🫥
Layouts psx.Addr // ✅
Layers psx.Addr // ✅
Graphics psx.Addr // 🫥 WIP
FnUpdateStageEntities psx.Addr
}
file, err := os.Open(fileName)
@ -74,7 +75,7 @@ func getOvlAssets(fileName string) (ovl, error) {
// check for unused tile defs (CEN has one)
for tileMapsRange.end < tileDefsRange.begin {
offset := tileDefsRange.begin.sum(-0x10)
offset := tileDefsRange.begin.Sum(-0x10)
unusedTileDef, unusedTileDefRange, err := readTiledef(file, offset)
if err != nil {
return ovl{}, fmt.Errorf("there is a gap between tileMaps and tileDefs: %w", err)
@ -83,7 +84,7 @@ func getOvlAssets(fileName string) (ovl, error) {
tileDefsRange = mergeDataRanges([]dataRange{tileDefsRange, unusedTileDefRange})
}
sprites, spritesRange, err := readSpritesBanks(file, header.Sprites)
sprites, spritesRange, err := readSpritesBanks(file, psx.RamStageBegin, header.Sprites)
if err != nil {
return ovl{}, fmt.Errorf("unable to gather all sprites: %w", err)
}
@ -94,7 +95,7 @@ func getOvlAssets(fileName string) (ovl, error) {
}
layoutOff := header.Layouts
if layoutOff == RamNull {
if layoutOff == psx.RamNull {
// some overlays have this field nulled, we have to find the offset ourselves
// it should be usually be right after header.Graphics
layoutOff = graphicsRange.end // ⚠️ assumption
@ -125,8 +126,8 @@ func getOvlAssets(fileName string) (ovl, error) {
graphics: dataContainer[gfx]{dataRange: graphicsRange, content: graphics},
layouts: dataContainer[layouts]{dataRange: layoutsRange[1], content: entityLayouts},
layoutsExtraRange: layoutsRange[0],
tileMaps: dataContainer[map[PsxOffset][]byte]{dataRange: tileMapsRange, content: tileMaps},
tileDefs: dataContainer[map[PsxOffset]tileDef]{dataRange: tileDefsRange, content: tileDefs},
tileMaps: dataContainer[map[psx.Addr][]byte]{dataRange: tileMapsRange, content: tileMaps},
tileDefs: dataContainer[map[psx.Addr]tileDef]{dataRange: tileDefsRange, content: tileDefs},
}, nil
}
@ -246,7 +247,7 @@ func info(fileName string) error {
fmt.Println(" - [0x0, .data, header]")
for i := 0; i < len(entries); i++ {
e := entries[i]
s := fmt.Sprintf(" - [0x%X, .data, %s]", e.dataRange.begin.real(), e.name)
s := fmt.Sprintf(" - [0x%X, .data, %s]", e.dataRange.begin.Real(psx.RamStageBegin), e.name)
if e.comment != "" {
s = fmt.Sprintf("%s # %s", s, e.comment)
}
@ -254,7 +255,7 @@ func info(fileName string) error {
// if there is a gap between the current entry and the next one, mark it as unrecognized data
if i == len(entries)-1 || e.dataRange.end != entries[i+1].dataRange.begin {
fmt.Printf(" - [0x%X, data]\n", e.dataRange.end.real())
fmt.Printf(" - [0x%X, data]\n", e.dataRange.end.Real(psx.RamStageBegin))
}
}
return nil
@ -288,92 +289,143 @@ func testStuff() {
}
}
func main() {
if len(os.Args) < 2 {
fmt.Println("expected 'info', 'extract', 'build' or 'build_all' subcommands")
os.Exit(1)
}
switch os.Args[1] {
case "info":
extractCmd := flag.NewFlagSet("info", flag.ExitOnError)
func handlerStage(args []string) error {
commands := map[string]func(args []string) error{}
commands["info"] = func(args []string) error {
var stageOvl string
extractCmd := flag.NewFlagSet("info", flag.ExitOnError)
extractCmd.StringVar(&stageOvl, "stage_ovl", "", "The overlay file to process")
extractCmd.Parse(os.Args[2:])
if err := info(stageOvl); err != nil {
panic(err)
}
case "extract":
extractCmd := flag.NewFlagSet("extract", flag.ExitOnError)
extractCmd.Parse(args)
return info(stageOvl)
}
commands["extract"] = func(args []string) error {
var stageOvl string
var assetDir string
extractCmd := flag.NewFlagSet("extract", flag.ExitOnError)
extractCmd.StringVar(&stageOvl, "stage_ovl", "", "The overlay file to process")
extractCmd.StringVar(&assetDir, "o", "", "Where to extract the asset files")
extractCmd.Parse(args)
extractCmd.Parse(os.Args[2:])
if stageOvl == "" || assetDir == "" {
fmt.Println("stage_ovl and asset_dir are required for extract")
fmt.Fprintln(os.Stderr, "stage_ovl and asset_dir are required for extract")
extractCmd.PrintDefaults()
os.Exit(1)
}
if err := extract(stageOvl, assetDir); err != nil {
panic(err)
}
case "build":
buildCmd := flag.NewFlagSet("build", flag.ExitOnError)
return extract(stageOvl, assetDir)
}
commands["build"] = func(args []string) error {
var file string
var kind string
var outputDir string
buildCmd := flag.NewFlagSet("build", flag.ExitOnError)
buildCmd.StringVar(&file, "file", "", "File to process")
buildCmd.StringVar(&kind, "kind", "", "Kind of the file to process")
buildCmd.StringVar(&outputDir, "o", "", "Where to store the processed source files")
buildCmd.Parse(os.Args[2:])
buildCmd.Parse(args)
if file == "" || kind == "" || outputDir == "" {
fmt.Println("file, kind, and output_dir are required for build")
fmt.Fprintln(os.Stderr, "file, kind, and output_dir are required for build")
buildCmd.PrintDefaults()
os.Exit(1)
}
var err error
switch kind {
case "rooms":
err = buildRooms(file, outputDir)
return buildRooms(file, outputDir)
case "layers":
err = buildLayers(path.Base(file), file, outputDir)
return buildLayers(path.Base(file), file, outputDir)
case "sprites":
err = buildSprites(file, outputDir)
default:
fmt.Println("unknown kind, valid values are 'room', 'layer', 'sprites'")
return buildSprites(file, outputDir)
}
if err != nil {
panic(err)
}
case "build_all":
return fmt.Errorf("unknown kind, valid values are 'room', 'layer', 'sprites'")
}
commands["build_all"] = func(args []string) error {
buildCmd := flag.NewFlagSet("build_all", flag.ExitOnError)
var inputDir string
var outputDir string
buildCmd.StringVar(&inputDir, "i", "", "Folder where all the assets are located")
buildCmd.StringVar(&outputDir, "o", "", "Where to store the processed source files")
buildCmd.Parse(os.Args[2:])
buildCmd.Parse(args)
if inputDir == "" || outputDir == "" {
fmt.Println("input_dir and output_dir are required for build")
fmt.Fprintln(os.Stderr, "input_dir and output_dir are required for build")
buildCmd.PrintDefaults()
os.Exit(1)
}
if err := buildAll(inputDir, outputDir); err != nil {
panic(err)
}
default:
fmt.Println("expected 'info', 'extract', 'build' or 'build_all' subcommands")
os.Exit(1)
return buildAll(inputDir, outputDir)
}
if len(args) > 0 {
command := args[0]
if f, found := commands[command]; found {
return f(args[1:])
}
fmt.Fprintf(os.Stderr, "unknown subcommand %q. Valid subcommands are %s\n", command, joinMapKeys(commands, ", "))
} else {
fmt.Fprintf(os.Stderr, "Need a subcommand. Valid subcommands are %s\n", joinMapKeys(commands, ", "))
}
os.Exit(1)
return nil
}
func handlerConfigExtract(args []string) error {
c, err := readConfig(args[0])
if err != nil {
return err
}
return extractFromConfig(c)
}
func handlerConfigBuild(args []string) error {
c, err := readConfig(args[0])
if err != nil {
return err
}
return buildFromConfig(c)
}
func handlerConfig(args []string) error {
commands := map[string]func(args []string) error{
"extract": handlerConfigExtract,
"build": handlerConfigBuild,
}
if len(args) > 0 {
command := args[0]
if f, found := commands[command]; found {
if err := f(args[1:]); err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
return nil
}
fmt.Fprintf(os.Stderr, "unknown subcommand %q. Valid subcommand are %s\n", command, joinMapKeys(commands, ", "))
} else {
fmt.Fprintf(os.Stderr, "Need a subcommand. Valid subcommand are %s\n", joinMapKeys(commands, ", "))
}
os.Exit(1)
return nil
}
func main() {
commands := map[string]func(args []string) error{
"stage": handlerStage,
"config": handlerConfig,
}
args := os.Args[1:]
if len(args) > 0 {
command := args[0]
if f, found := commands[command]; found {
if err := f(args[1:]); err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
return
}
fmt.Fprintf(os.Stderr, "unknown command %q. Valid commands are %s\n", command, joinMapKeys(commands, ", "))
} else {
fmt.Fprintf(os.Stderr, "Need a command. Valid commands are %s\n", joinMapKeys(commands, ", "))
}
os.Exit(1)
}

View File

@ -1,27 +1,30 @@
package main
import "fmt"
import (
"fmt"
"github.com/xeeynamo/sotn-decomp/tools/sotn-assets/psx"
)
func getTilemapFileName(off PsxOffset) string {
return fmt.Sprintf("tilemap_%05X.bin", off.real())
func getTilemapFileName(off psx.Addr) string {
return fmt.Sprintf("tilemap_%05X.bin", off.Real(psx.RamStageBegin))
}
func getTiledefFileName(off PsxOffset) string {
return fmt.Sprintf("tiledef_%05X.json", off.real())
func getTiledefFileName(off psx.Addr) string {
return fmt.Sprintf("tiledef_%05X.json", off.Real(psx.RamStageBegin))
}
func getTiledefIndicesFileName(off PsxOffset) string {
return fmt.Sprintf("tiledef_%05X_tiles.bin", off.real())
func getTiledefIndicesFileName(off psx.Addr) string {
return fmt.Sprintf("tiledef_%05X_tiles.bin", off.Real(psx.RamStageBegin))
}
func getTiledefPagesFileName(off PsxOffset) string {
return fmt.Sprintf("tiledef_%05X_pages.bin", off.real())
func getTiledefPagesFileName(off psx.Addr) string {
return fmt.Sprintf("tiledef_%05X_pages.bin", off.Real(psx.RamStageBegin))
}
func getTiledefClutsFileName(off PsxOffset) string {
return fmt.Sprintf("tiledef_%05X_cluts.bin", off.real())
func getTiledefClutsFileName(off psx.Addr) string {
return fmt.Sprintf("tiledef_%05X_cluts.bin", off.Real(psx.RamStageBegin))
}
func getTiledefCollisionsFileName(off PsxOffset) string {
return fmt.Sprintf("tiledef_%05X_cols.bin", off.real())
func getTiledefCollisionsFileName(off psx.Addr) string {
return fmt.Sprintf("tiledef_%05X_cols.bin", off.Real(psx.RamStageBegin))
}

View File

@ -0,0 +1,67 @@
package psx
import (
"encoding/binary"
"fmt"
"io"
)
type Addr uint32
const (
RamNull = Addr(0)
RamGameBegin = Addr(0x800A0000)
RamStageBegin = Addr(0x80180000)
RamStageEnd = Addr(0x801C0000)
RamGameEnd = Addr(0x801F8000)
)
func (off Addr) Format(f fmt.State, c rune) {
f.Write([]byte(fmt.Sprintf("0x%08X", uint32(off))))
}
func (off Addr) Real(begin Addr) int {
return int(off - begin)
}
func (off Addr) Align4() Addr {
if (off & 3) != 0 {
return (off | 3) + 1
}
return off
}
func (off Addr) Sum(x int) Addr {
return Addr(uint32(off) + uint32(x))
}
func (off Addr) DistanceTo(x Addr) int {
return int(x - off)
}
func (off Addr) InRange(begin Addr, end Addr) bool {
return off >= begin && off < end
}
func (off Addr) MoveFile(r io.ReadSeeker, begin Addr) error {
end := RamGameEnd
if !off.InRange(begin, end) {
err := fmt.Errorf("offset %s is outside the boundaries [%s, %s]", off, begin, end)
panic(err)
return err
}
fileOffset := int64(off - begin)
r.Seek(fileOffset, 0)
return nil
}
func GetAddr(data []byte) Addr {
return Addr(binary.LittleEndian.Uint32(data))
}
func ReadAddr(r io.Reader) Addr {
b := make([]byte, 4)
_, _ = r.Read(b)
return GetAddr(b)
}

View File

@ -1,84 +0,0 @@
package main
import (
"fmt"
"os"
"slices"
)
type PsxOffset uint32
const (
RamNull = PsxOffset(0)
RamStageBegin = PsxOffset(0x80180000)
RamStageEnd = PsxOffset(0x801C0000)
)
func (off PsxOffset) Format(f fmt.State, c rune) {
f.Write([]byte(fmt.Sprintf("0x%08X", uint32(off))))
}
func (off PsxOffset) real() int {
return int(off - RamStageBegin)
}
func (off PsxOffset) align4() PsxOffset {
if (off & 3) != 0 {
return (off | 3) + 1
}
return off
}
func (off PsxOffset) sum(x int) PsxOffset {
return PsxOffset(uint32(off) + uint32(x))
}
func (off PsxOffset) distanceTo(x PsxOffset) int {
return int(x - off)
}
func (off PsxOffset) valid() bool {
return off >= RamStageBegin && off < RamStageEnd
}
func (off PsxOffset) moveFile(file *os.File) error {
if !off.valid() {
err := fmt.Errorf("offset %08X is outside the stage boundaries", off)
panic(err)
return err
}
stats, err := file.Stat()
if err != nil {
return err
}
fileOffset := int64(off - RamStageBegin)
if fileOffset >= stats.Size() {
return fmt.Errorf("offset %08X is outside the file boundaries", off)
}
file.Seek(fileOffset, 0)
return nil
}
func sortUniqueOffsets(slice []PsxOffset) []PsxOffset {
unique := map[PsxOffset]struct{}{}
for _, v := range slice {
unique[v] = struct{}{}
}
newSlice := make([]PsxOffset, 0, len(unique))
for offset := range unique {
newSlice = append(newSlice, offset)
}
slices.SortFunc(newSlice, func(a, b PsxOffset) int {
if a < b {
return -1
} else if a > b {
return 1
}
return 0
})
return newSlice
}

View File

@ -2,6 +2,7 @@ package main
import (
"encoding/binary"
"github.com/xeeynamo/sotn-decomp/tools/sotn-assets/psx"
"os"
)
@ -20,11 +21,11 @@ func (r room) isTerminator() bool {
return r.Left == 0x40
}
func readRooms(file *os.File, off PsxOffset) ([]room, dataRange, error) {
func readRooms(file *os.File, off psx.Addr) ([]room, dataRange, error) {
if off == 0 {
return nil, dataRange{}, nil
}
if err := off.moveFile(file); err != nil {
if err := off.MoveFile(file, psx.RamStageBegin); err != nil {
return nil, dataRange{}, err
}
@ -41,6 +42,6 @@ func readRooms(file *os.File, off PsxOffset) ([]room, dataRange, error) {
}
return rooms, dataRange{
begin: off,
end: off.sum(len(rooms)*8 + 4),
end: off.Sum(len(rooms)*8 + 4),
}, nil
}

View File

@ -3,7 +3,8 @@ package main
import (
"encoding/binary"
"fmt"
"os"
"github.com/xeeynamo/sotn-decomp/tools/sotn-assets/psx"
"io"
"sort"
)
@ -26,49 +27,49 @@ type spriteDefs struct {
Indices []int `json:"indices"`
}
func readSprites(file *os.File, off PsxOffset) ([]sprite, dataRange, error) {
if err := off.moveFile(file); err != nil {
func readSprites(r io.ReadSeeker, baseAddr, addr psx.Addr) ([]sprite, dataRange, error) {
if err := addr.MoveFile(r, baseAddr); err != nil {
return nil, dataRange{}, fmt.Errorf("invalid sprites: %w", err)
}
var count uint16
if err := binary.Read(file, binary.LittleEndian, &count); err != nil {
if err := binary.Read(r, binary.LittleEndian, &count); err != nil {
return nil, dataRange{}, err
}
sprites := make([]sprite, count)
if err := binary.Read(file, binary.LittleEndian, sprites); err != nil {
if err := binary.Read(r, binary.LittleEndian, sprites); err != nil {
return nil, dataRange{}, err
}
return sprites, dataRange{
begin: off,
end: off.sum(4 + 0x16*int(count)).align4(),
begin: addr,
end: addr.Sum(4 + 0x16*int(count)).Align4(),
}, nil
}
func readSpriteBank(file *os.File, off PsxOffset) ([]*[]sprite, dataRange, error) {
if err := off.moveFile(file); err != nil {
func readFrameSet(r io.ReadSeeker, baseAddr, addr psx.Addr) ([]*[]sprite, dataRange, error) {
if err := addr.MoveFile(r, baseAddr); err != nil {
return nil, dataRange{}, fmt.Errorf("invalid sprite Indices: %w", err)
}
// the end of the sprite array is the beginning of the earliest sprite offset
earliestSpriteOff := RamStageEnd
currentOff := off
spriteOffsets := make([]PsxOffset, 0)
earliestSpriteOff := psx.RamStageEnd
currentOff := addr
spriteOffsets := make([]psx.Addr, 0)
for {
if currentOff == earliestSpriteOff {
break
}
currentOff += 4
var spriteOffset PsxOffset
if err := binary.Read(file, binary.LittleEndian, &spriteOffset); err != nil {
var spriteOffset psx.Addr
if err := binary.Read(r, binary.LittleEndian, &spriteOffset); err != nil {
return nil, dataRange{}, err
}
spriteOffsets = append(spriteOffsets, spriteOffset)
if spriteOffset != RamNull {
if !spriteOffset.valid() {
if spriteOffset != psx.RamNull {
if !spriteOffset.InRange(baseAddr, psx.RamGameEnd) {
err := fmt.Errorf("sprite offset %s is not valid", spriteOffset)
return nil, dataRange{}, err
}
@ -76,18 +77,18 @@ func readSpriteBank(file *os.File, off PsxOffset) ([]*[]sprite, dataRange, error
}
}
headerRange := dataRange{
begin: off,
begin: addr,
end: earliestSpriteOff,
}
spriteBank := make([]*[]sprite, len(spriteOffsets))
spriteRanges := []dataRange{}
for i, offset := range spriteOffsets {
if offset == RamNull {
if offset == psx.RamNull {
spriteBank[i] = nil
continue
}
sprites, ranges, err := readSprites(file, offset)
sprites, ranges, err := readSprites(r, baseAddr, offset)
if err != nil {
return nil, dataRange{}, fmt.Errorf("unable to read sprites: %w", err)
}
@ -98,37 +99,43 @@ func readSpriteBank(file *os.File, off PsxOffset) ([]*[]sprite, dataRange, error
return spriteBank, mergeDataRanges(append(spriteRanges, headerRange)), nil
}
func readSpritesBanks(file *os.File, off PsxOffset) (spriteDefs, dataRange, error) {
if err := off.moveFile(file); err != nil {
func readSpritesBanks(r io.ReadSeeker, baseAddr, addr psx.Addr) (spriteDefs, dataRange, error) {
if err := addr.MoveFile(r, baseAddr); err != nil {
return spriteDefs{}, dataRange{}, err
}
offBanks := make([]PsxOffset, 24)
if err := binary.Read(file, binary.LittleEndian, offBanks); err != nil {
return spriteDefs{}, dataRange{}, err
// start with a capacity of 24 as that's the length for all the stage overlays
offBanks := make([]psx.Addr, 0, 24)
for {
addr := psx.ReadAddr(r)
if addr != psx.RamNull && !addr.InRange(baseAddr, psx.RamGameEnd) {
break
}
offBanks = append(offBanks, addr)
}
r.Seek(-4, io.SeekCurrent)
// the order sprites are stored must be preserved
pool := map[PsxOffset][]*[]sprite{}
pool := map[psx.Addr][]*[]sprite{}
spriteRanges := []dataRange{}
for _, offset := range offBanks {
if offset == RamNull {
for _, spriteAddr := range offBanks {
if spriteAddr == psx.RamNull {
continue
}
if _, found := pool[offset]; found {
if _, found := pool[spriteAddr]; found {
continue
}
bank, bankRange, err := readSpriteBank(file, offset)
bank, bankRange, err := readFrameSet(r, baseAddr, spriteAddr)
if err != nil {
return spriteDefs{}, dataRange{}, fmt.Errorf("unable to read sprite Indices: %w", err)
}
pool[offset] = bank
pool[spriteAddr] = bank
spriteRanges = append(spriteRanges, bankRange)
}
// the indices do not guarantee sprites to be stored in a linear order
// we must sort the offsets to preserve the order sprites are stored
sortedOffsets := make([]PsxOffset, 0, len(pool))
sortedOffsets := make([]psx.Addr, 0, len(pool))
for offset := range pool {
sortedOffsets = append(sortedOffsets, offset)
}
@ -137,7 +144,7 @@ func readSpritesBanks(file *os.File, off PsxOffset) (spriteDefs, dataRange, erro
// create a list of indices to replace the original pointers
indices := make([]int, len(offBanks))
for i, offset := range offBanks {
if offset == RamNull {
if offset == psx.RamNull {
indices[i] = -1
}
for j, sortedOffset := range sortedOffsets {

View File

@ -3,6 +3,7 @@ package main
import (
"encoding/binary"
"fmt"
"github.com/xeeynamo/sotn-decomp/tools/sotn-assets/psx"
"os"
)
@ -20,12 +21,12 @@ type tileDefPaths struct {
Collisions string `json:"collisions"`
}
func readTiledef(file *os.File, off PsxOffset) (tileDef, dataRange, error) {
if err := off.moveFile(file); err != nil {
func readTiledef(file *os.File, off psx.Addr) (tileDef, dataRange, error) {
if err := off.MoveFile(file, psx.RamStageBegin); err != nil {
return tileDef{}, dataRange{}, err
}
offsets := make([]PsxOffset, 4)
offsets := make([]psx.Addr, 4)
if err := binary.Read(file, binary.LittleEndian, offsets); err != nil {
return tileDef{}, dataRange{}, err
}
@ -37,28 +38,28 @@ func readTiledef(file *os.File, off PsxOffset) (tileDef, dataRange, error) {
cols: make([]byte, off-offsets[3]),
}
if err := offsets[0].moveFile(file); err != nil {
if err := offsets[0].MoveFile(file, psx.RamStageBegin); err != nil {
return tileDef{}, dataRange{}, err
}
if _, err := file.Read(td.tiles); err != nil {
return tileDef{}, dataRange{}, err
}
if err := offsets[1].moveFile(file); err != nil {
if err := offsets[1].MoveFile(file, psx.RamStageBegin); err != nil {
return tileDef{}, dataRange{}, err
}
if _, err := file.Read(td.pages); err != nil {
return tileDef{}, dataRange{}, err
}
if err := offsets[2].moveFile(file); err != nil {
if err := offsets[2].MoveFile(file, psx.RamStageBegin); err != nil {
return tileDef{}, dataRange{}, err
}
if _, err := file.Read(td.cluts); err != nil {
return tileDef{}, dataRange{}, err
}
if err := offsets[3].moveFile(file); err != nil {
if err := offsets[3].MoveFile(file, psx.RamStageBegin); err != nil {
return tileDef{}, dataRange{}, err
}
if _, err := file.Read(td.cols); err != nil {
@ -67,13 +68,13 @@ func readTiledef(file *os.File, off PsxOffset) (tileDef, dataRange, error) {
return td, dataRange{
begin: offsets[0],
end: off.sum(0x10),
end: off.Sum(0x10),
}, nil
}
func readAllTiledefs(file *os.File, roomLayers []roomLayers) (map[PsxOffset]tileDef, dataRange, error) {
func readAllTiledefs(file *os.File, roomLayers []roomLayers) (map[psx.Addr]tileDef, dataRange, error) {
ranges := []dataRange{}
processed := map[PsxOffset]tileDef{}
processed := map[psx.Addr]tileDef{}
for _, rl := range roomLayers {
if rl.fg != nil {
if _, found := processed[rl.fg.Tiledef]; !found {

View File

@ -2,11 +2,12 @@ package main
import (
"fmt"
"github.com/xeeynamo/sotn-decomp/tools/sotn-assets/psx"
"os"
)
func readTilemap(file *os.File, layer *layer) ([]byte, dataRange, error) {
if err := layer.Data.moveFile(file); err != nil {
if err := layer.Data.MoveFile(file, psx.RamStageBegin); err != nil {
return nil, dataRange{}, err
}
data := make([]byte, layer.tilemapFileSize())
@ -15,13 +16,13 @@ func readTilemap(file *os.File, layer *layer) ([]byte, dataRange, error) {
}
return data, dataRange{
begin: layer.Data,
end: layer.Data.sum(len(data)),
end: layer.Data.Sum(len(data)),
}, nil
}
func readAllTileMaps(file *os.File, roomLayers []roomLayers) (map[PsxOffset][]byte, dataRange, error) {
func readAllTileMaps(file *os.File, roomLayers []roomLayers) (map[psx.Addr][]byte, dataRange, error) {
ranges := []dataRange{}
processed := map[PsxOffset][]byte{}
processed := map[psx.Addr][]byte{}
for _, rl := range roomLayers {
if rl.fg != nil {
if _, found := processed[rl.fg.Data]; !found {

View File

@ -1,5 +1,19 @@
package main
import (
"github.com/xeeynamo/sotn-decomp/tools/sotn-assets/psx"
"slices"
"strings"
)
func joinMapKeys[T any](m map[string]T, sep string) string {
keys := make([]string, 0, len(m))
for k := range m {
keys = append(keys, k)
}
return strings.Join(keys, sep)
}
func minBy[T any](slice []T, getter func(T) int) (max int) {
if len(slice) == 0 {
return max
@ -34,3 +48,24 @@ func btoi(b bool) int {
}
return 0
}
func sortUniqueOffsets(slice []psx.Addr) []psx.Addr {
unique := map[psx.Addr]struct{}{}
for _, v := range slice {
unique[v] = struct{}{}
}
newSlice := make([]psx.Addr, 0, len(unique))
for offset := range unique {
newSlice = append(newSlice, offset)
}
slices.SortFunc(newSlice, func(a, b psx.Addr) int {
if a < b {
return -1
} else if a > b {
return 1
}
return 0
})
return newSlice
}

View File

@ -1,8 +1,5 @@
#!/usr/bin/python3
import argparse
import json
import io
import os
import sys
from typing import Optional
@ -12,102 +9,6 @@ from pathlib import Path
sys.path.append(f"{os.getcwd()}/tools/splat_ext")
from splat.util import options
from splat.segtypes.n64.segment import N64Segment
import utils
item_size = 0x16 # sizeof(SpritePart)
def parse_spriteparts(data: bytearray) -> list:
count = utils.to_s16(data[0:])
items = []
data = data[2:]
for i in range(0, count):
items.append(
{
"flags": utils.to_s16(data[0:]),
"offsetx": utils.to_s16(data[2:]),
"offsety": utils.to_s16(data[4:]),
"width": utils.to_s16(data[6:]),
"height": utils.to_s16(data[8:]),
"clut": utils.to_s16(data[10:]),
"tileset": utils.to_s16(data[12:]),
"left": utils.to_s16(data[14:]),
"top": utils.to_s16(data[16:]),
"right": utils.to_s16(data[18:]),
"bottom": utils.to_s16(data[20:]),
}
)
data = data[item_size:]
return items
def parse_animset(start_ptr, data: bytearray) -> list:
end_ptr = start_ptr + len(data)
assumed_list_end = len(data)
spriteparts_offsets = []
for i in range(0, len(data), 4):
if i >= assumed_list_end:
break
ptr = utils.to_u32(data[i:])
if ptr != 0:
if ptr < start_ptr or ptr >= end_ptr:
utils.log_fatal(
f"spriteparts list pointer 0x{ptr:X} is out of bounds (start:{start_ptr:X}, end:{end_ptr:X})"
)
offset = ptr - start_ptr
assumed_list_end = min(assumed_list_end, offset)
spriteparts_offsets.append(offset)
else:
spriteparts_offsets.append(0)
animset = []
for offset in spriteparts_offsets:
if offset != 0:
animset.append(parse_spriteparts(data[offset:]))
else:
animset.append(None)
return animset
def write_animset_list_as_asm(writer: io.BufferedWriter, name: str, content: str):
animset = json.loads(content)
writer.write(".section .data\n")
writer.write(f".global {name}\n")
writer.write(f"{name}:\n")
for i, spriteparts in enumerate(animset):
if spriteparts != None:
writer.write(f".word {name}_{i}\n")
else:
writer.write(".word 0\n")
for i, spriteparts in enumerate(animset):
if spriteparts == None:
continue
n_parts = len(spriteparts)
writer.write(f".global {name}_{i}\n")
writer.write(f"{name}_{i}:\n")
writer.write(f".half {n_parts}\n")
for i, part in enumerate(spriteparts):
writer.write(f"# part {i}\n")
writer.write(f".half {part['flags']}\n")
writer.write(f".half {part['offsetx']}\n")
writer.write(f".half {part['offsety']}\n")
writer.write(f".half {part['width']}\n")
writer.write(f".half {part['height']}\n")
writer.write(f".half {part['clut']}\n")
writer.write(f".half {part['tileset']}\n")
writer.write(f".half {part['left']}\n")
writer.write(f".half {part['top']}\n")
writer.write(f".half {part['right']}\n")
writer.write(f".half {part['bottom']}\n")
# now align by 4
if (n_parts % 2) == 1:
writer.write(f".word 0 # terminator\n")
else:
writer.write(f".half 0 # terminator\n")
class PSXSegAnimset(N64Segment):
@ -121,52 +22,9 @@ class PSXSegAnimset(N64Segment):
return options.opts.asset_path / self.dir / f"{self.name}.animset.json"
def split(self, rom_bytes):
path = self.src_path()
path.parent.mkdir(parents=True, exist_ok=True)
data = parse_animset(
self.vram_start,
rom_bytes[self.rom_start : self.rom_end],
)
with open(path, "w") as f:
f.write(json.dumps(data, indent=4))
def get_file_name(full_path):
file_name = os.path.basename(full_path)
exts = os.path.splitext(file_name)
if len(exts) > 1 and len(exts[1]) > 0:
return get_file_name(exts[0])
return exts[0]
return
if __name__ == "__main__":
parser = argparse.ArgumentParser(
description="De/serialize a list of animation sets"
)
subparsers = parser.add_subparsers(dest="command")
gen_asm_parser = subparsers.add_parser(
"gen-asm",
description="Generate assembly code from an already parsed JSON",
)
gen_asm_parser.add_argument(
"input",
help="The animset parsed in JSON to convert",
)
gen_asm_parser.add_argument(
"output",
help="Generates the correspondent assembly code",
)
gen_asm_parser.add_argument(
"-s", "--symbol", required=False, type=str, help="Assign a custom symbol name"
)
args = parser.parse_args()
if args.command == "gen-asm":
symbol_name = args.symbol
if symbol_name is None:
symbol_name = get_file_name(args.input)
with open(args.input, "r") as f_in:
with open(args.output, "w") as f_out:
write_animset_list_as_asm(f_out, symbol_name, f_in.read())
print("dummy")
exit(1)