Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

MAD Asset Manager support #1388

Draft
wants to merge 2 commits into
base: master
Choose a base branch
from
Draft
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions Makefile.psx.mk
Original file line number Diff line number Diff line change
@@ -51,6 +51,7 @@ $(BUILD_DIR)/weapon.ld: $(CONFIG_DIR)/splat.$(VERSION).weapon.yaml $(PSX_BASE_SY
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/MAD/MAD.BIN -o assets/st/mad_a
$(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
@@ -60,6 +61,7 @@ extract_assets: $(SOTNASSETS)
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/mad_a -o src/st/mad/
$(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/
36 changes: 9 additions & 27 deletions config/splat.us.stmad.yaml
Original file line number Diff line number Diff line change
@@ -36,40 +36,22 @@ segments:
subalign: 4
subsegments:
- [0x0, .data, header]
- [0xB8, data]
- [0xB8, .data, header] # layers
- [0x290, data]
- [0x2F4, .data, e_laydef] # layout entries header
- [0x49C, data]
- [0x6DC, .data, collision]
- [0x9D4, .data, e_red_door]
- [0x9EC, data]
- [0xE40, data]
- [0xEF8, .data, entity_relic_orb]
- [0xF5C, data]
- [0x1130, data, g_Rooms]
- [0x11D4, data] # assets/st/mad/0.objlayout
# - [0x11E8, data] # assets/st/mad/1.objlayout
# - [0x1206, data] # assets/st/mad/2.objlayout
# - [0x12B0, data] # assets/st/mad/3.objlayout
# - [0x135A, data] # assets/st/mad/4.objlayout
# - [0x1404, data] # assets/st/mad/5.objlayout
# - [0x14AE, data] # assets/st/mad/6.objlayout
# - [0x1558, data] # assets/st/mad/7.objlayout
# - [0x1602, data] # assets/st/mad/8.objlayout
# - [0x16AC, data] # assets/st/mad/9.objlayout
# - [0x1756, data] # assets/st/mad/10.objlayout
# - [0x1774, data] # assets/st/mad/11.objlayout
# - [0x1788, data] # assets/st/mad/12.objlayout
# - [0x17A6, data] # assets/st/mad/13.objlayout
# - [0x1850, data] # assets/st/mad/14.objlayout
# - [0x18FA, data] # assets/st/mad/15.objlayout
# - [0x19A4, data] # assets/st/mad/16.objlayout
# - [0x1A4E, data] # assets/st/mad/17.objlayout
# - [0x1AF8, data] # assets/st/mad/18.objlayout
# - [0x1BA2, data] # assets/st/mad/19.objlayout
# - [0x1C4C, data] # assets/st/mad/20.objlayout
# - [0x1CF6, data] # assets/st/mad/21.objlayout
- [0x1404, data]
- [0x1774, data]
- [0x19A4, data]
- [0x1130, .data, rooms]
- [0x11D4, .data, e_layout] # layout entries data
- [0x1D14, data]
- [0x2078, .data, tile_data] # tile data
- [0x4678, .data, tile_data] # tile definitions
- [0xCAA8, data]
- [0xD794, rodata]
- [0xD7CC, .rodata, e_red_door] # EntityRedDoor
- [0xD7E4, rodata]
2 changes: 1 addition & 1 deletion config/symbols.stmad.txt
Original file line number Diff line number Diff line change
@@ -20,7 +20,7 @@ unk14_startFrame = 0x80180FFC;
unk14_lifetime = 0x80181000;
unk15_rot = 0x80180FBC;
unk15_yVel = 0x80180FCC;
g_Rooms = 0x80181130;
MAD_rooms = 0x80181130;
g_eRedDoorTiles = 0x80180594;
g_olroxDroolCollOffsets = 0x80181008;
g_UnkRecursPrimVecOrder = 0x80181020;
22 changes: 9 additions & 13 deletions src/st/mad/header.c
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
#include "mad.h"

extern RoomHeader g_Rooms[];
extern SpriteParts** SpriteBanks[];
extern RoomHeader OVL_EXPORT(rooms)[];
extern signed short* spriteBanks[];
extern void* Cluts[];
extern RoomDef g_TileLayers[];
extern MyRoomDef rooms_layers[];
extern GfxBank* g_pStTileset[];
void UpdateStageEntities();
void func_8018E1D4();
@@ -13,11 +13,11 @@ static Overlay OVL_EXPORT(Overlay) = {
.HitDetection = HitDetection,
.UpdateRoomPosition = UpdateRoomPosition,
.InitRoomEntities = InitRoomEntities,
.rooms = g_Rooms,
.spriteBanks = SpriteBanks,
.rooms = OVL_EXPORT(rooms),
.spriteBanks = spriteBanks,
.cluts = Cluts,
.objLayoutHorizontal = g_pStObjLayoutHorizontal,
.tileLayers = g_TileLayers,
.tileLayers = rooms_layers,
.gfxBanks = g_pStTileset,
.UpdateStageEntities = UpdateStageEntities,
.unk2c = NULL,
@@ -27,13 +27,7 @@ static Overlay OVL_EXPORT(Overlay) = {
.StageEndCutScene = func_8018E1D4,
};

extern SpriteParts* D_8018CAA8[];

static SpriteParts** SpriteBanks[] = {
NULL, D_8018CAA8, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
};
#include "sprite_banks.h"

extern u16* D_80182058[0x10];

@@ -46,3 +40,5 @@ static u16** Clut[] = {
static void* Cluts[] = {
Clut,
};

#include "layers.h"
24 changes: 24 additions & 0 deletions src/st/mad/tile_data.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
#include <stage.h>

#include "tilemap_02078.h"
#include "tilemap_02278.h"
#include "tilemap_02478.h"
#include "tilemap_02678.h"
#include "tilemap_02878.h"
#include "tilemap_02A78.h"
#include "tilemap_02C78.h"
#include "tilemap_02E78.h"
#include "tilemap_03078.h"
#include "tilemap_03278.h"
#include "tilemap_03478.h"
#include "tilemap_03678.h"
#include "tilemap_03878.h"
#include "tilemap_03A78.h"
#include "tilemap_03C78.h"
#include "tilemap_03E78.h"
#include "tilemap_04078.h"
#include "tilemap_04278.h"
#include "tilemap_04478.h"
#include "tiledef_04A78.h"
#include "tiledef_08A88.h"
#include "tiledef_0CA98.h"
23 changes: 20 additions & 3 deletions tools/sotn-assets/data_range.go
Original file line number Diff line number Diff line change
@@ -18,15 +18,32 @@ func (r dataRange) empty() bool {
return r.begin == RamNull && r.end == RamNull
}

func mergeDataRanges(ranges []dataRange) dataRange {
func getDataRangeBegin(ranges []dataRange) PsxOffset {
if len(ranges) == 0 {
err := fmt.Errorf("no datarange, bug?!")
panic(err)
panic(fmt.Errorf("range array cannot be empty"))
}
earliest := ranges[0].begin
for _, rng := range ranges[1:] {
if earliest > rng.begin {
earliest = rng.begin
}
}
return earliest
}

func sortDataRanges(ranges []dataRange) {
sort.Slice(ranges, func(i, j int) bool {
return ranges[i].begin < ranges[j].begin
})
}

func mergeDataRanges(ranges []dataRange) dataRange {
if len(ranges) == 0 {
err := fmt.Errorf("no datarange, bug?!")
panic(err)
}

sortDataRanges(ranges)

// performs a sanity check before merging everything
for i := 0; i < len(ranges)-1; i++ {
10 changes: 3 additions & 7 deletions tools/sotn-assets/main.go
Original file line number Diff line number Diff line change
@@ -67,20 +67,16 @@ func getOvlAssets(fileName string) (ovl, error) {
return ovl{}, fmt.Errorf("unable to gather all the tile maps: %w", err)
}

tileDefs, tileDefsRange, err := readAllTiledefs(file, layers)
tileDefs, tileDefsRange, err := readAllTiledefs(file, layers, tileMapsRange.end)
if err != nil {
return ovl{}, fmt.Errorf("unable to gather all the tile defs: %w", err)
}

// check for unused tile defs (CEN has one)
// tile maps and tile defs must be stored consecutively
for tileMapsRange.end < tileDefsRange.begin {
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)
return ovl{}, fmt.Errorf("there is a gap between tileMaps and tileDefs")
}
tileDefs[offset] = unusedTileDef
tileDefsRange = mergeDataRanges([]dataRange{tileDefsRange, unusedTileDefRange})
}

sprites, spritesRange, err := readSpritesBanks(file, header.Sprites)
31 changes: 30 additions & 1 deletion tools/sotn-assets/tile_def.go
Original file line number Diff line number Diff line change
@@ -71,7 +71,7 @@ func readTiledef(file *os.File, off PsxOffset) (tileDef, dataRange, error) {
}, nil
}

func readAllTiledefs(file *os.File, roomLayers []roomLayers) (map[PsxOffset]tileDef, dataRange, error) {
func readAllTiledefs(file *os.File, roomLayers []roomLayers, offBegin PsxOffset) (map[PsxOffset]tileDef, dataRange, error) {
ranges := []dataRange{}
processed := map[PsxOffset]tileDef{}
for _, rl := range roomLayers {
@@ -96,5 +96,34 @@ func readAllTiledefs(file *os.File, roomLayers []roomLayers) (map[PsxOffset]tile
}
}
}

// In CEN there is an unused tiledef at the beginning
for offBegin < getDataRangeBegin(ranges) {
offset := getDataRangeBegin(ranges).sum(-0x10)
td, r, err := readTiledef(file, offset)
if err != nil {
return nil, dataRange{}, err
}
processed[offset] = td
ranges = append(ranges, r)
}

// In MAD there is an unused tiledef between two used tiledefs
// search for gaps and fill them with the missing tiledef
sortDataRanges(ranges)
for i := 0; i < len(ranges)-1; i++ {
if ranges[i].end == ranges[i+1].begin {
continue
}
offset := ranges[i+1].begin.sum(-0x10)
td, r, err := readTiledef(file, offset)
if err != nil {
return nil, dataRange{}, err
}
processed[offset] = td
ranges = append(ranges, r)
sortDataRanges(ranges)
}

return processed, mergeDataRanges(ranges), nil
}