Register - Login
Views: 99392543
Main - Memberlist - Active users - Calendar - Wiki - IRC Chat - Online users
Ranks - Rules/FAQ - Stats - Latest Posts - Color Chart - Smilies
04-24-22 10:10:34 AM
Jul - Game Development/Mod Projects - Star Fox Adventures: Krystal Ver. [NEW PROJECT] New poll - New thread - New reply
Pages: 1 2 Next newer thread | Next older thread
Strychnine

Goomba
Level: 10


Posts: 1/24
EXP: 3542
For next: 872

Since: 10-29-19

Pronouns: They/them
From: CO, USA

Since last post: 1.5 years
Last activity: 1.5 years

Posted on 10-30-19 09:37:28 PM (last edited by Strychnine at 11-01-19 03:44:29 PM) Link | Quote
Hello everyone. Long-time lurker, first-time poster here.
I've been planning something for a while now, and I believe I finally have a way to make it into reality.

I've decided to make Krystal the hero of Star Fox Adventures.

Using the fantastic powers of HEX-Editing, I've found that not only is it possible to replace Fox's model data with Krystal's,
but that doing so will not have any game-breaking consequences on the ROM itself.

At the moment, I've confirmed the following by examining/testing HEX-Values:
- Fox's model data can be successfully replaced by Krystal's.
- Fox's model data is not exclusive to one MODELS.BIN file, but is located in multiple directories.
- Krystal will automatically use Fox's animations, as they share the same bones.
- Links between textures and model data are stored in the TEX0.tab and TEX1.tab files.

In time, I hope to successfully achieve the following:
- Replace as many of Fox's animations with Krystal's as possible.
- Direct Krystal's texture data properly in all required TEX1.tab files.
- Replace Fox's audio with Krystal's.
- Modify the subtitle text to match Krystal's new dialogue.

To do it, I'm using the these tools:
- HxD
- N64 Universal Game Decompressor (by SubDrag, Zoinkity)
- SfAdv_Ripper (unknown, possibly xDaniel?)
- MusyXExtract (script by Nisto)
- BZR Player (by Andreas Argirakis)
- Audacity 2.3.0-gc-dspadpcm (branch by Jack Andersen)
- GC-Tool v1.20 (by Icarus/Paradox)
- GCRebuilder v1.0 (by BSV)
- Nintendo Gamecube SDK
- Autodesk Maya 2016 (Student Edition)
- ... And probably more.

_________________________________________________________________________________________________________________________________

Why?

1. This thread, though unlikely, might be useful to someone looking to play around with SFA's files.

2. I have wanted to play as Krystal, for years. I've been hoping that someone would have made this a
reality by now, but that's unrealistic. This is time-consuming, and at times deeply frustrating, so it's
unlikely that anyone will ever dedicate so much of their time to something with so little return. Maybe other
people want the same, and will find some enjoyment in this patch.

3. I would like to eventually turn this into some sort of mashup between SFA and DP. I love Star Fox Adventures,
but after spending so much time looking at Dinosaur Planet lore, it just doesn't compare to what could have been.


A fair warning to readers:

Everything I've achieved has been purely through trial-and-error. I have no experience or knowledge of reverse-
engineering, and am relying entirely on the patterns of data that I see when using HxD. As such, my notes may be
frustrating and/or completely wrong. Please have patience with what you see here, and if you have suggestions
or notice something I missed, please let me know.

_________________________________________________________________________________________________________________________________

Table of Contents:

____________________

I'm not going to stop until I've made her the hero.

2Tie

Rumours of my death have been greatly exaggerated.
Level: 70


Posts: 1157/1229
EXP: 2872011
For next: 143800

Since: 02-22-10

Pronouns: anything works
From: here

Since last post: 49 days
Last activity: 1 day

Posted on 10-30-19 09:40:00 PM Link | Quote
UESCTerm 802.11 (remote override)
044 05.10.2337

sounds exciting, i wish you good luck in this endeavor!

____________________
Press B to Cancel
Press A to Acknowledge
Strychnine

Goomba
Level: 10


Posts: 2/24
EXP: 3542
For next: 872

Since: 10-29-19

Pronouns: They/them
From: CO, USA

Since last post: 1.5 years
Last activity: 1.5 years

Posted on 10-30-19 10:01:48 PM (last edited by Strychnine at 11-01-19 03:43:59 PM) Link | Quote
ATTEMPT 1:

I used the following code, intended for GSAE01 v1.1 of Star Fox Adventures:


Character Modifier (provided by BvqRzxi5)


40343558 0000AD0x

where x:
0=Krystal
1=Fox
2=SharpClaw



I was warned that this code only works for the Great Fox and Krazoa Palace, and breaks almost all other areas. As expected, loading a save in ThornTail Hollow resulted in Dolphin Emulator crashing. Bypassing the in-game save screen and instead using a save state resulted in everything except for the player model loading.

Instead:



So clearly something went wrong.

After later examination, Krystal's model data was not found in swaphol/MODELS.BIN, so it appeared to default to the first viable model in the file. Maya files show that this appears to be the level's skybox, based on the geometry a basic cube that is usually colored.

____________________

I'm not going to stop until I've made her the hero.

Rena
I had one (1) message in Discord deleted and proceeded to make a huge, huge mess about how it was a violation of free speech and how moderators are supposed to be spam janitors and nobody should have the right to tell me not to talk about school shootings
Level: 135


Posts: 5291/5390
EXP: 29051659
For next: 283346

Since: 07-22-07

Pronouns: he/him/whatever
From: RSP Segment 6

Since last post: 333 days
Last activity: 333 days

Posted on 10-30-19 10:03:46 PM (last edited by Rena at 10-30-19 10:06:02 PM) Link | Quote
I've also been working on this.

Actually that project started as an effort to rip sound effects, but next thing I knew I was writing a model extractor. ¯\_(ツ)_/¯

From that screenshot, it looks like you simply changed the "active model" variable of the Player object. That does let you switch between Fox, Krystal, and the SharpClaw disguise, but if a model isn't loaded, you get that cube. (Which is usually colored...) Getting the game to load in her model would be the more difficult part.

____________________
Strychnine

Goomba
Level: 10


Posts: 3/24
EXP: 3542
For next: 872

Since: 10-29-19

Pronouns: They/them
From: CO, USA

Since last post: 1.5 years
Last activity: 1.5 years

Posted on 10-31-19 12:46:52 AM (last edited by Strychnine at 11-01-19 03:44:56 PM) Link | Quote
Originally posted by Rena
I've also been working on this.

Actually that project started as an effort to rip sound effects, but next thing I knew I was writing a model extractor. ¯\_(ツ)_/¯

From that screenshot, it looks like you simply changed the "active model" variable of the Player object. That does let you switch between Fox, Krystal, and the SharpClaw disguise, but if a model isn't loaded, you get that cube. (Which is usually colored...) Getting the game to load in her model would be the more difficult part.


Funny that you mention that...

ATTEMPT 2:

The previous code works perfectly in Krazoa Palace, but with a few issues. Despite having the staff by the time Fox enters KP, the code loads Krystal's controls and thus disables the staff. From my previous attempts at making AR codes (mostly the Pokemon Mystery Dungeon series), I can tell that this particular code seems to be activating the flag that determines whether Fox or Krystal is loaded in KP, since both models are present in warlock/MODELS.bin.

By extracting the files for the ROM via GC-Tool v1.20, I found that multiple directories contain .bin files indicating the presence of models. Using SfAdv_Ripper on the MODELS.bin file in each directory, I received an output of .ma files for all model data stored in the .bin file.

Next was manually loading every file, one at a time, into the Educational version of Maya 2016, which you can use for free for up to three years.

I started with the largest files first, under the assumption that Fox and Krystal's model data would be the most complex. I was indeed correct, as the uncompressed 1.5MB file held Fox's model:



Delving further into the files, I found Krystal to be 2.0MB, uncompressed:



The size for Fox's model data was the same for every directory, and was always labeled as MODELS.bin.001.ma. Krystal's model data was present as MODELS.bin.129.ma, in the warlock directory. She was also located in the animtest directory, but her entry in that particular MODELS.bin file appears to use a different structure than the rest of the game.

This indicates that Fox is the second entry in the .bin file, and Krystal is the 130th entry; the entries begin with 000 as the first, and so on. Pulling up warlock/MODELS.bin in HxD shows that all entries begin with FA CE FE ED as the first four bytes, along with a unique identifier that follows for the next 32 bytes. As an example:




Offset 00 04 08 0C
0000000 FACEFEED 00000280 0000000C 00000100
0000010 00000018 00000028 00000000 00000000
0000020 00000000 5A4C4200 00000001 00000280
0000030 000000D8 5885CD51 CB51C330 14DCF793
0000040 0C182674 A0231D70 75297482 8F1CA881
0000050 A1144A71 21994956 8AE271C6 29807D96
0000060 77575ED9 4F32B085 CED841BE E2C20B9F
0000070 979E9BE8 BFF7D97F 81237B9B 91BB7B77
0000080 C78044F5 729990EB 5575C1C7 825AA555
0000090 C36BDEBC EC071E96 9265D890 ED815661
00000A0 026D19A1 15511533 7197A035 75D7084D
00000B0 49735DEB 8F8C983F 892B6D0E A41835CC
00000C0 E3B97733 BEC17FD7 CF9DFA90 2608F456
00000D0 AB767CB6 D0BCE9EF D4413984 EC0FA3AC
00000E0 7BBB554B F7CB4D95 3BC739B1 803FD654
00000F0 E90EBC8D EB7DA8AD 9047F248 3E900FEB
0000100 ECB1FD20 5FD79E01 AFEB3383 00000000
0000110 00000000 00000000 00000000 00000000



In the example above, everything before offset 0x00000024 is the header of the entry, and everything after is the model data itself, beginning with 5A4C4200 (ZLB in ASCII). The entry ends with at least 16 bytes of 0x00. I omitted 32 bytes of this from the example.

Fox's model data can be found by going to the second "FACEFEED" entry, and Krystal's to the 130th entry. Replacing Fox's model data with Krystal's, while leaving Fox's header intact, yielded this:



Which actually worked, much to my surprise, even though there was no texturing.

____________________

I'm not going to stop until I've made her the hero.

Rena
I had one (1) message in Discord deleted and proceeded to make a huge, huge mess about how it was a violation of free speech and how moderators are supposed to be spam janitors and nobody should have the right to tell me not to talk about school shootings
Level: 135


Posts: 5292/5390
EXP: 29051659
For next: 283346

Since: 07-22-07

Pronouns: he/him/whatever
From: RSP Segment 6

Since last post: 333 days
Last activity: 333 days

Posted on 11-02-19 08:12:24 PM (last edited by Rena at 11-02-19 08:12:56 PM) Link | Quote
Right, patching the MODELS.bin for every map is one way to go, though I'm surprised it worked that easily. I was planning to patch the code instead. The code in that repo shows how to decode ZLB, and FACEFEED is just a wrapper around that.

There's another variable that changes things like the voice and whether to render the backpack. I still haven't looked into preventing the staff from being despawned and/or letting Krystal use it. (That might not be necessary if we just swap the models themselves.) Also I'm not sure how it loads the actual texture graphics.

I'm hoping to allow switching characters on the fly. The game seems to have been programmed with that in mind; Fox and Krystal have separate variables for health, coords, etc in the save data. If I can force it to load both characters at once, or to reload the area with the other character (maybe can just stick a dummy model in the inactive character's place), it might just work. (Maybe some game mechanics wouldn't play so well with it, but, oh well)

____________________
Strychnine

Goomba
Level: 10


Posts: 4/24
EXP: 3542
For next: 872

Since: 10-29-19

Pronouns: They/them
From: CO, USA

Since last post: 1.5 years
Last activity: 1.5 years

Posted on 11-03-19 12:38:28 AM (last edited by Strychnine at 11-03-19 12:39:41 AM) Link | Quote
Originally posted by Rena
Right, patching the MODELS.bin for every map is one way to go, though I'm surprised it worked that easily. I was planning to patch the code instead. The code in that repo shows how to decode ZLB, and FACEFEED is just a wrapper around that.

There's another variable that changes things like the voice and whether to render the backpack. I still haven't looked into preventing the staff from being despawned and/or letting Krystal use it. (That might not be necessary if we just swap the models themselves.) Also I'm not sure how it loads the actual texture graphics.

I'm hoping to allow switching characters on the fly. The game seems to have been programmed with that in mind; Fox and Krystal have separate variables for health, coords, etc in the save data. If I can force it to load both characters at once, or to reload the area with the other character (maybe can just stick a dummy model in the inactive character's place), it might just work. (Maybe some game mechanics wouldn't play so well with it, but, oh well)


It would be awesome if you figured out the code to enable/disable the backpack! I attempted to try loading an empty model in its place, but it broke Dolphin pretty badly (I'm not surprised). I know it's possible, since you lose it in CloudRunner Fortress temporarily, but I've been having trouble trying to translate that to other levels.

Have you figured out how textures are joined to the models? I've found what seem to be 4 bytes of unique identifiers at the end of each texture in TEX1.bin, but I haven't had any success in getting the game to load the textures yet. I suspect it has to do with the .tab file, but I haven't confirmed it. Nevermind. I just read the end of your post.

____________________

I'm not going to stop until I've made her the hero.

Rozurabu
Random nobody
Level: 2


Posts: 1/1
EXP: 30
For next: 16

Since: 11-04-19


Since last post: 2.5 years
Last activity: 2.5 years

Posted on 11-04-19 06:30:37 AM Link | Quote
I've been lurking this forum for a long time, mostly just watching the DP thread.
Seeing this, though, and I just couldn't sit back anymore. A lot of what OP's doing is stuff that I've already worked on awhile back with rather little publicity aside from the KA Discord server.

15.06.2019, First Attempt:



16.06.2019, Second Attempt, pretty Dolphin screenshots:








05.07.2019, Second Attempt tested & working on Console:



Apologies in advanced for not using spoiler tags, the syntaxes I tried appeared to make buttons that wouldn't expand.
Strychnine

Goomba
Level: 10


Posts: 6/24
EXP: 3542
For next: 872

Since: 10-29-19

Pronouns: They/them
From: CO, USA

Since last post: 1.5 years
Last activity: 1.5 years

Posted on 11-04-19 10:07:01 PM Link | Quote
Originally posted by Rozurabu
I've been lurking this forum for a long time, mostly just watching the DP thread.
Seeing this, though, and I just couldn't sit back anymore. A lot of what OP's doing is stuff that I've already worked on awhile back with rather little publicity aside from the KA Discord server.

15.06.2019, First Attempt:



16.06.2019, Second Attempt, pretty Dolphin screenshots:








05.07.2019, Second Attempt tested & working on Console:



Apologies in advanced for not using spoiler tags, the syntaxes I tried appeared to make buttons that wouldn't expand.


This is amazing! How did you get her textures to load in-game? I've been manually recalculating the values in the .tab file, along with rebuilding the original .bin, but so far I haven't had any success.

Did you use a code, or did you manually replace Fox's model with Krystal's?


____________________

I'm not going to stop until I've made her the hero.

Strychnine

Goomba
Level: 10


Posts: 7/24
EXP: 3542
For next: 872

Since: 10-29-19

Pronouns: They/them
From: CO, USA

Since last post: 1.5 years
Last activity: 1.5 years

Posted on 11-04-19 11:26:02 PM (last edited by Strychnine at 11-04-19 11:26:46 PM) Link | Quote
GUYS WAIT A MINUTE.



IT WORKED. Manually replacing the .tab values actually WORKED.

____________________

I'm not going to stop until I've made her the hero.

Rena
I had one (1) message in Discord deleted and proceeded to make a huge, huge mess about how it was a violation of free speech and how moderators are supposed to be spam janitors and nobody should have the right to tell me not to talk about school shootings
Level: 135


Posts: 5294/5390
EXP: 29051659
For next: 283346

Since: 07-22-07

Pronouns: he/him/whatever
From: RSP Segment 6

Since last post: 333 days
Last activity: 333 days

Posted on 11-05-19 02:38:12 PM Link | Quote
Oh snap. So this is just from changing the models.tab and textures.tab? I haven't really looked into textures yet. I should be able to quickly put together a Gecko code that will apply those changes on the fly, so we'll be able to at least replace Fox.

Long term plan is still to have both at once though.
Strychnine

Goomba
Level: 10


Posts: 8/24
EXP: 3542
For next: 872

Since: 10-29-19

Pronouns: They/them
From: CO, USA

Since last post: 1.5 years
Last activity: 1.5 years

Posted on 11-07-19 01:03:21 AM Link | Quote


In related news, Kyte is unhappy when she replaces Tricky.

____________________

I'm not going to stop until I've made her the hero.

Strychnine

Goomba
Level: 10


Posts: 9/24
EXP: 3542
For next: 872

Since: 10-29-19

Pronouns: They/them
From: CO, USA

Since last post: 1.5 years
Last activity: 1.5 years

Posted on 11-07-19 04:25:28 PM (last edited by Strychnine at 11-07-19 04:36:14 PM) Link | Quote
Originally posted by Rena
Oh snap. So this is just from changing the models.tab and textures.tab? I haven't really looked into textures yet. I should be able to quickly put together a Gecko code that will apply those changes on the fly, so we'll be able to at least replace Fox.

Long term plan is still to have both at once though.


Yes and no. I replaced Fox's model in MODELS.bin Krystal's by beginning at Fox's offset and Krystal's data over it. Since her entry is smaller than Fox's, I had to nullify the remaining data with 0x00 bytes until I reached the beginning offset of the next entry. It seems that the MODELS.bin file has to remain the same size, or else the game breaks.

The textures are more tricky, since both the .bin and .tab files have to be edited. From examining the textures extracted from each directory, as well as the corresponding .tab files, I figured out that all of the textures have to be stored in a specific order in each .bin file. The .tab file is then used to determine whether the textures are loaded (these textures are applied to the correct model somehow, I have no clue how yet).

For ThornTail Hollow's TEX1.bin, I had to remove Fox's textures and insert Krystal's textures right before the entry for the Staff's textures. I've been using the warlock directory to reference where Krystal's textures should be located. From there, I added 0x00 bytes onto the end of the file until it matched the original file size.

And then came the .tab file.

All TEX#.tab files are identical in size and layout, and it seems textures are linked to models via 4 byte words. If the word begins as 8XXXXXXX, then the texture is loaded and applied to the correct model. If the word is 01000000, then the texture is not loaded, regardless of whether it's in the .bin file. I figured out which offsets correspond with Fox and Krystal's textures by manually nullifying each word and loading the ROM in Dolphin.

Fox is located at the following offsets:

0x00001968

0x00001974
0x00001978
0x00001980
0x00001984


Krystal is located at the following offsets:

0x00001C90

0x00001C94
0x00001C98
0x00001CA0
0x00001CA4
0x00001CA8


The entry for the staff's texture is at:

0x00001CB4


Depending on what textures are in the .bin file for that directory, the values will differ. Unfortunately, this whole process has to be done for every directory containing Fox's model. I've made a list of each directory that needs to be edited:

BossDrakor
CapeClaw
CloudRace
CRFort
DarkIceMines
DarkIceMines2
DragRock
DragRockBot
GameFront
IceMountain
MMPass
NWastes
Root
SwapHol
Volcano
WallCity
Warlock


Luckily, there seems to be a general pattern to recalculating these new .tab values. I'm testing it out to make sure it works, but I'll post it soon.

____________________

I'm not going to stop until I've made her the hero.

Rena
I had one (1) message in Discord deleted and proceeded to make a huge, huge mess about how it was a violation of free speech and how moderators are supposed to be spam janitors and nobody should have the right to tell me not to talk about school shootings
Level: 135


Posts: 5295/5390
EXP: 29051659
For next: 283346

Since: 07-22-07

Pronouns: he/him/whatever
From: RSP Segment 6

Since last post: 333 days
Last activity: 333 days

Posted on 11-07-19 07:26:51 PM Link | Quote
Right, MODELS.tab is a list of offsets into MODELS.bin, so if you're overwriting models, you'd need to either keep the offsets the same or update those (and possibly others). Within a model the offsets are relative to its beginning, so they don't mind being moved around.

I'm not sure about textures. I know they're commonly referenced by ID. Are they all the same size TEX0/TEX1.bin? It would make sense that each map has a list of which textures to load.

I know the models' display lists select textures by ID. (And if the selected texture isn't loaded, you get that weird blue effect, which I think is the beginning of RAM interpreted as a texture.) But I'm not sure how the IDs are resolved to pointers in RAM or offsets in a file.

(Actually I'm not sure how GX display lists reference textures either; maybe they don't? The game uses its own custom display list format in addition to GX lists, and those select textures. A lot like Mario Kart 64 does... but, much simpler.)

There's also different materials which can share the same texture. For example Krystal's fur and clothes are both part of the same texture, but are drawn with different settings so that the clothes have a metallic reflection and don't appear furry up close. I don't really even know how materials work in general, let alone how this game uses them...

____________________
Strychnine

Goomba
Level: 10


Posts: 10/24
EXP: 3542
For next: 872

Since: 10-29-19

Pronouns: They/them
From: CO, USA

Since last post: 1.5 years
Last activity: 1.5 years

Posted on 11-07-19 07:46:49 PM Link | Quote
Originally posted by Rena
Right, MODELS.tab is a list of offsets into MODELS.bin, so if you're overwriting models, you'd need to either keep the offsets the same or update those (and possibly others). Within a model the offsets are relative to its beginning, so they don't mind being moved around.

I'm not sure about textures. I know they're commonly referenced by ID. Are they all the same size TEX0/TEX1.bin? It would make sense that each map has a list of which textures to load.

I know the models' display lists select textures by ID. (And if the selected texture isn't loaded, you get that weird blue effect, which I think is the beginning of RAM interpreted as a texture.) But I'm not sure how the IDs are resolved to pointers in RAM or offsets in a file.

(Actually I'm not sure how GX display lists reference textures either; maybe they don't? The game uses its own custom display list format in addition to GX lists, and those select textures. A lot like Mario Kart 64 does... but, much simpler.)

There's also different materials which can share the same texture. For example Krystal's fur and clothes are both part of the same texture, but are drawn with different settings so that the clothes have a metallic reflection and don't appear furry up close. I don't really even know how materials work in general, let alone how this game uses them...


Ah, I see what you mean. I did indeed keep the offset the same when I switched Fox's model with Krystal's. Finding a way to redirect it in the .tab file would remove the need to nullify the remaining data, and allow Krystal's model to be inserted using the same process as the textures.

I'll see if I can figure out which .tab offsets correspond to Fox and Krystal, then. As for the GX lists, I have no idea how that's defined yet.

____________________

I'm not going to stop until I've made her the hero.

Rena
I had one (1) message in Discord deleted and proceeded to make a huge, huge mess about how it was a violation of free speech and how moderators are supposed to be spam janitors and nobody should have the right to tell me not to talk about school shootings
Level: 135


Posts: 5296/5390
EXP: 29051659
For next: 283346

Since: 07-22-07

Pronouns: he/him/whatever
From: RSP Segment 6

Since last post: 333 days
Last activity: 333 days

Posted on 11-07-19 08:53:27 PM Link | Quote
This parses the GX lists. You should be able to find everything in there.

____________________
Strychnine

Goomba
Level: 10


Posts: 11/24
EXP: 3542
For next: 872

Since: 10-29-19

Pronouns: They/them
From: CO, USA

Since last post: 1.5 years
Last activity: 1.5 years

Posted on 11-08-19 12:43:25 AM (last edited by Strychnine at 11-08-19 12:44:11 AM) Link | Quote
Originally posted by Rena
This parses the GX lists. You should be able to find everything in there.


You are awesome. Your scripts/research should make de-compiling this game much easier! I'll have to reinstall Python on my computer, though.

____________________

I'm not going to stop until I've made her the hero.

Strychnine

Goomba
Level: 10


Posts: 12/24
EXP: 3542
For next: 872

Since: 10-29-19

Pronouns: They/them
From: CO, USA

Since last post: 1.5 years
Last activity: 1.5 years

Posted on 11-08-19 12:58:57 AM (last edited by Strychnine at 11-08-19 01:00:43 AM) Link | Quote
Just in case anyone was wondering, this is what happens when you apply the animations of a four-legged creature to a flying bird-thing:

SFA - Krystal Ver. (Kyte Test001)



My apologies for the low quality, and for it not being on Youtube. I'm currently fighting a losing war against Google.

____________________

I'm not going to stop until I've made her the hero.

Rena
I had one (1) message in Discord deleted and proceeded to make a huge, huge mess about how it was a violation of free speech and how moderators are supposed to be spam janitors and nobody should have the right to tell me not to talk about school shootings
Level: 135


Posts: 5297/5390
EXP: 29051659
For next: 283346

Since: 07-22-07

Pronouns: he/him/whatever
From: RSP Segment 6

Since last post: 333 days
Last activity: 333 days

Posted on 11-08-19 01:05:08 AM Link | Quote
Yeah, it doesn't work so well to swap models that don't have the same skeletal structure.

I have a pretty nice Ghidra database too but I'm not sure how to share that...

Right now the main question is how the game decides what to load from the global MODELS.bin and what to load from the map's own file. Does it just load all of both? If so we could just tack Krystal on to the end of the global file. (Still need to find a way to use edited game files with Dolphin too.)

____________________
Rena
I had one (1) message in Discord deleted and proceeded to make a huge, huge mess about how it was a violation of free speech and how moderators are supposed to be spam janitors and nobody should have the right to tell me not to talk about school shootings
Level: 135


Posts: 5298/5390
EXP: 29051659
For next: 283346

Since: 07-22-07

Pronouns: he/him/whatever
From: RSP Segment 6

Since last post: 333 days
Last activity: 333 days

Posted on 11-09-19 12:53:28 AM Link | Quote
So, this Gecko code will load Krystal's model in every map, and let you swap them with D-pad Down. But her textures and animations aren't loaded.

c20453d4 0000001b
48000018 7761726c
6f636b2f 4d4f4445
4c532e62 696e0000
9421ffc0 90610018
3c808180 9064fffc
3ca00001 60a52b40
90a10014 7c632a14
38a00000 3c807d7d
60847d7d 3c008002
60003cc8 7c0803a6
4e800021 90610010
48000005 7c6802a6
3863ffa8 38800000
3c008001 60005ab4
7c0803a6 4e800021
9061001c 3c000009
600001c0 7c830214
80610010 80a10014
80010018 7c630214
3c008000 60003494
7c0803a6 4e800021
8061001c 3c008002
600033e8 7c0803a6
4e800021 80610010
38210040 3c808004
608453e4 7c8803a6
4e800020 00000000
c2045670 00000005
3c608035 6063f490
80630000 3c808180
8084fffc 3ca08000
7c842b78 908313a0
60000000 00000000
283398d2 00000004
82200000 803428f8
86000000 000000ac
86410000 00010000
e2000000 80000000


This code has three parts to it:

The first part hooks the function that loads MODELS.bin. It loads warlock/MODELS.bin, copies Krystal's model out of it, and tacks it onto the end of whichever MODELS.bin is actually being loaded.

The second part hooks the loading of MODELS.tab, and sets entry 0x4E8 (Krystal's model ID) to the offset that the first part copied her data to. (It doesn't need to deal with compression; the game will do that on its own!)

The third part just toggles the "current model" variable of the Player object when you press the button.

I'm not sure why it doesn't apply Fox's animations; they should be the same? I hope I don't have to manually load in all the animations this way. I will have to do the textures but fortunately there's only a few of those.

Having studied the code more, I have a better understanding of the files. Every map has its own MODELS.bin which has a copy of every model the map uses. (Same for TEX0.bin and so on.) That way it only needs to load one file to have all of the models it needs, instead of seeking around a lot; it uses a lot more disc space (which doesn't really matter since discs are a fixed size) but greatly reduces loading time. The corresponding .tab file tells where to find each model ID in the .bin file. To load model N, you just go to offset N*4 in the table, read the offset, go to that offset in the .bin file, and read from there. (Well, and the top 4 bits are flags such as "is the data compressed" and others I'm not sure about...)

I'm not sure where the global MODELS.bin comes in; it looks like a few maps don't have their own (cloudtreasure, dbay, dfalls, frontend, insidegal, linklevel, swapcircle) - are these maps even used? (frontend is the title screen, but I think so is gamefront?) But now that I know that the .tab files are just arrays indexed by asset ID, it's all much clearer.

Source for this code is here, except the toggle part which is just a couple lines of Gecko.

____________________
Pages: 1 2 Next newer thread | Next older thread
Jul - Game Development/Mod Projects - Star Fox Adventures: Krystal Ver. [NEW PROJECT] New poll - New thread - New reply


Rusted Logic

Acmlmboard - commit 47be4dc [2021-08-23]
©2000-2022 Acmlm, Xkeeper, Kaito Sinclaire, et al.

28 database queries, 10 query cache hits.
Query execution time:  0.098679 seconds
Script execution time:  0.053707 seconds
Total render time:  0.152386 seconds


TidyHTML vomit below
line 1 column 1 - Warning: missing <!DOCTYPE> declaration
line 119 column 11 - Warning: <form> isn't allowed in <table> elements
line 118 column 10 - Info: <table> previously mentioned
line 120 column 11 - Warning: missing <tr>
line 120 column 119 - Warning: missing </font> before </td>
line 124 column 16 - Warning: plain text isn't allowed in <tr> elements
line 120 column 11 - Info: <tr> previously mentioned
line 125 column 68 - Warning: missing </nobr> before </td>
line 141 column 68 - Warning: missing </nobr> before <tr>
line 147 column 35 - Warning: missing <tr>
line 147 column 50 - Warning: missing </font> before </td>
line 148 column 37 - Warning: unescaped & or unknown entity "&id"
line 147 column 226 - Warning: missing </font> before </table>
line 149 column 35 - Warning: missing <tr>
line 149 column 97 - Warning: unescaped & or unknown entity "&page"
line 149 column 50 - Warning: missing </font> before </td>
line 149 column 132 - Warning: missing </font> before </table>
line 156 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 158 column 9 - Warning: missing <tr>
line 176 column 13 - Warning: missing <tr>
line 177 column 102 - Warning: unescaped & or unknown entity "&postid"
line 179 column 74 - Warning: <style> isn't allowed in <td> elements
line 179 column 9 - Info: <td> previously mentioned
line 179 column 165 - Warning: discarding unexpected </style>
line 179 column 678 - Warning: missing <tr>
line 182 column 934 - Warning: replacing unexpected b with </b>
line 182 column 1029 - Warning: inserting implicit <span>
line 241 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 243 column 9 - Warning: missing <tr>
line 261 column 13 - Warning: missing <tr>
line 262 column 102 - Warning: unescaped & or unknown entity "&postid"
line 264 column 74 - Warning: <style> isn't allowed in <td> elements
line 264 column 9 - Info: <td> previously mentioned
line 267 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 269 column 9 - Warning: missing <tr>
line 287 column 13 - Warning: missing <tr>
line 288 column 102 - Warning: unescaped & or unknown entity "&postid"
line 290 column 74 - Warning: <style> isn't allowed in <td> elements
line 290 column 9 - Info: <td> previously mentioned
line 290 column 165 - Warning: discarding unexpected </style>
line 290 column 678 - Warning: missing <tr>
line 294 column 908 - Warning: missing </span> before <blockquote>
line 294 column 963 - Warning: inserting implicit <span>
line 294 column 963 - Warning: missing </span> before <hr>
line 302 column 1131 - Warning: discarding unexpected </span>
line 317 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 319 column 9 - Warning: missing <tr>
line 337 column 13 - Warning: missing <tr>
line 338 column 102 - Warning: unescaped & or unknown entity "&postid"
line 340 column 74 - Warning: <style> isn't allowed in <td> elements
line 340 column 9 - Info: <td> previously mentioned
line 348 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 350 column 9 - Warning: missing <tr>
line 368 column 13 - Warning: missing <tr>
line 369 column 102 - Warning: unescaped & or unknown entity "&postid"
line 371 column 74 - Warning: <style> isn't allowed in <td> elements
line 371 column 9 - Info: <td> previously mentioned
line 371 column 165 - Warning: discarding unexpected </style>
line 371 column 678 - Warning: missing <tr>
line 399 column 3969 - Warning: missing </span> before <blockquote>
line 399 column 4024 - Warning: inserting implicit <span>
line 399 column 4024 - Warning: missing </span> before <hr>
line 418 column 5010 - Warning: discarding unexpected </span>
line 431 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 433 column 9 - Warning: missing <tr>
line 451 column 13 - Warning: missing <tr>
line 452 column 102 - Warning: unescaped & or unknown entity "&postid"
line 454 column 74 - Warning: <style> isn't allowed in <td> elements
line 454 column 9 - Info: <td> previously mentioned
line 462 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 464 column 9 - Warning: missing <tr>
line 482 column 13 - Warning: missing <tr>
line 483 column 102 - Warning: unescaped & or unknown entity "&postid"
line 485 column 74 - Warning: <style> isn't allowed in <td> elements
line 485 column 9 - Info: <td> previously mentioned
line 485 column 165 - Warning: discarding unexpected </style>
line 485 column 678 - Warning: missing <tr>
line 498 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 500 column 9 - Warning: missing <tr>
line 518 column 13 - Warning: missing <tr>
line 519 column 102 - Warning: unescaped & or unknown entity "&postid"
line 544 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 546 column 9 - Warning: missing <tr>
line 564 column 13 - Warning: missing <tr>
line 565 column 102 - Warning: unescaped & or unknown entity "&postid"
line 567 column 74 - Warning: <style> isn't allowed in <td> elements
line 567 column 9 - Info: <td> previously mentioned
line 567 column 165 - Warning: discarding unexpected </style>
line 567 column 678 - Warning: missing <tr>
line 597 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 599 column 9 - Warning: missing <tr>
line 617 column 13 - Warning: missing <tr>
line 618 column 102 - Warning: unescaped & or unknown entity "&postid"
line 620 column 74 - Warning: <style> isn't allowed in <td> elements
line 620 column 9 - Info: <td> previously mentioned
line 620 column 165 - Warning: discarding unexpected </style>
line 620 column 678 - Warning: missing <tr>
line 629 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 631 column 9 - Warning: missing <tr>
line 649 column 13 - Warning: missing <tr>
line 650 column 102 - Warning: unescaped & or unknown entity "&postid"
line 657 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 659 column 9 - Warning: missing <tr>
line 677 column 13 - Warning: missing <tr>
line 678 column 102 - Warning: unescaped & or unknown entity "&postid"
line 680 column 74 - Warning: <style> isn't allowed in <td> elements
line 680 column 9 - Info: <td> previously mentioned
line 680 column 165 - Warning: discarding unexpected </style>
line 680 column 678 - Warning: missing <tr>
line 687 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 689 column 9 - Warning: missing <tr>
line 707 column 13 - Warning: missing <tr>
line 708 column 102 - Warning: unescaped & or unknown entity "&postid"
line 710 column 74 - Warning: <style> isn't allowed in <td> elements
line 710 column 9 - Info: <td> previously mentioned
line 710 column 165 - Warning: discarding unexpected </style>
line 710 column 678 - Warning: missing <tr>
line 725 column 3173 - Warning: missing </span> before <blockquote>
line 725 column 3228 - Warning: inserting implicit <span>
line 725 column 3228 - Warning: missing </span> before <hr>
line 729 column 3339 - Warning: discarding unexpected </span>
line 731 column 3398 - Warning: missing </span> before <blockquote>
line 731 column 3453 - Warning: inserting implicit <span>
line 731 column 3453 - Warning: missing </span> before <hr>
line 736 column 3578 - Warning: discarding unexpected </span>
line 738 column 3633 - Warning: missing </span> before <blockquote>
line 738 column 3688 - Warning: inserting implicit <span>
line 738 column 3688 - Warning: missing </span> before <hr>
line 738 column 3743 - Warning: discarding unexpected </span>
line 764 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 766 column 9 - Warning: missing <tr>
line 784 column 13 - Warning: missing <tr>
line 785 column 102 - Warning: unescaped & or unknown entity "&postid"
line 787 column 74 - Warning: <style> isn't allowed in <td> elements
line 787 column 9 - Info: <td> previously mentioned
line 799 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 801 column 9 - Warning: missing <tr>
line 819 column 13 - Warning: missing <tr>
line 820 column 102 - Warning: unescaped & or unknown entity "&postid"
line 822 column 74 - Warning: <style> isn't allowed in <td> elements
line 822 column 9 - Info: <td> previously mentioned
line 822 column 165 - Warning: discarding unexpected </style>
line 822 column 678 - Warning: missing <tr>
line 839 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 841 column 9 - Warning: missing <tr>
line 859 column 13 - Warning: missing <tr>
line 860 column 102 - Warning: unescaped & or unknown entity "&postid"
line 862 column 74 - Warning: <style> isn't allowed in <td> elements
line 862 column 9 - Info: <td> previously mentioned
line 866 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 868 column 9 - Warning: missing <tr>
line 886 column 13 - Warning: missing <tr>
line 887 column 102 - Warning: unescaped & or unknown entity "&postid"
line 889 column 74 - Warning: <style> isn't allowed in <td> elements
line 889 column 9 - Info: <td> previously mentioned
line 889 column 165 - Warning: discarding unexpected </style>
line 889 column 678 - Warning: missing <tr>
line 896 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 898 column 9 - Warning: missing <tr>
line 916 column 13 - Warning: missing <tr>
line 917 column 102 - Warning: unescaped & or unknown entity "&postid"
line 919 column 74 - Warning: <style> isn't allowed in <td> elements
line 919 column 9 - Info: <td> previously mentioned
line 919 column 165 - Warning: discarding unexpected </style>
line 919 column 678 - Warning: missing <tr>
line 921 column 906 - Warning: missing </span> before <p>
line 921 column 939 - Warning: inserting implicit <span>
line 921 column 1018 - Warning: discarding unexpected </span>
line 928 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 930 column 9 - Warning: missing <tr>
line 948 column 13 - Warning: missing <tr>
line 949 column 102 - Warning: unescaped & or unknown entity "&postid"
line 951 column 74 - Warning: <style> isn't allowed in <td> elements
line 951 column 9 - Info: <td> previously mentioned
line 959 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 961 column 9 - Warning: missing <tr>
line 979 column 13 - Warning: missing <tr>
line 980 column 102 - Warning: unescaped & or unknown entity "&postid"
line 982 column 74 - Warning: <style> isn't allowed in <td> elements
line 982 column 9 - Info: <td> previously mentioned
line 1043 column 17 - Warning: missing <tr>
line 1043 column 17 - Warning: discarding unexpected <table>
line 1046 column 35 - Warning: missing <tr>
line 1046 column 97 - Warning: unescaped & or unknown entity "&page"
line 1046 column 50 - Warning: missing </font> before </td>
line 1046 column 132 - Warning: missing </font> before </table>
line 1048 column 35 - Warning: missing <tr>
line 1048 column 50 - Warning: missing </font> before </td>
line 1049 column 37 - Warning: unescaped & or unknown entity "&id"
line 1048 column 226 - Warning: missing </font> before </table>
line 1050 column 17 - Warning: discarding unexpected </textarea>
line 1050 column 28 - Warning: discarding unexpected </form>
line 1050 column 35 - Warning: discarding unexpected </embed>
line 1050 column 43 - Warning: discarding unexpected </noembed>
line 1050 column 53 - Warning: discarding unexpected </noscript>
line 1050 column 64 - Warning: discarding unexpected </noembed>
line 1050 column 74 - Warning: discarding unexpected </embed>
line 1050 column 82 - Warning: discarding unexpected </table>
line 1050 column 90 - Warning: discarding unexpected </table>
line 1052 column 9 - Warning: missing </font> before <table>
line 1064 column 25 - Warning: discarding unexpected </font>
line 1073 column 58 - Warning: discarding unexpected </font>
line 1051 column 1 - Warning: missing </center>
line 120 column 63 - Warning: <img> lacks "alt" attribute
line 125 column 19 - Warning: <td> attribute "width" has invalid value "120px"
line 125 column 93 - Warning: <img> lacks "alt" attribute
line 141 column 19 - Warning: <td> attribute "width" has invalid value "120px"
line 141 column 98 - Warning: <img> lacks "alt" attribute
line 148 column 45 - Warning: <img> proprietary attribute value "absmiddle"
line 148 column 144 - Warning: <img> proprietary attribute value "absmiddle"
line 148 column 248 - Warning: <img> proprietary attribute value "absmiddle"
line 160 column 11 - Warning: <img> lacks "alt" attribute
line 161 column 22 - Warning: <img> lacks "alt" attribute
line 161 column 63 - Warning: <img> lacks "alt" attribute
line 161 column 112 - Warning: <img> lacks "alt" attribute
line 161 column 162 - Warning: <img> lacks "alt" attribute
line 162 column 11 - Warning: <img> lacks "alt" attribute
line 172 column 15 - Warning: <img> lacks "alt" attribute
line 179 column 447 - Warning: <img> lacks "alt" attribute
line 236 column 4333 - Warning: <img> lacks "alt" attribute
line 238 column 4516 - Warning: <img> lacks "alt" attribute
line 245 column 11 - Warning: <img> lacks "alt" attribute
line 246 column 22 - Warning: <img> lacks "alt" attribute
line 246 column 63 - Warning: <img> lacks "alt" attribute
line 246 column 111 - Warning: <img> lacks "alt" attribute
line 246 column 161 - Warning: <img> lacks "alt" attribute
line 247 column 11 - Warning: <img> lacks "alt" attribute
line 257 column 15 - Warning: <img> lacks "alt" attribute
line 264 column 566 - Warning: <img> lacks "alt" attribute
line 264 column 748 - Warning: <div> anchor "joyeuse" already defined
line 271 column 11 - Warning: <img> lacks "alt" attribute
line 272 column 22 - Warning: <img> lacks "alt" attribute
line 272 column 63 - Warning: <img> lacks "alt" attribute
line 272 column 112 - Warning: <img> lacks "alt" attribute
line 272 column 162 - Warning: <img> lacks "alt" attribute
line 273 column 11 - Warning: <img> lacks "alt" attribute
line 283 column 15 - Warning: <img> lacks "alt" attribute
line 290 column 447 - Warning: <img> lacks "alt" attribute
line 308 column 1500 - Warning: <img> lacks "alt" attribute
line 312 column 1947 - Warning: <img> lacks "alt" attribute
line 314 column 2130 - Warning: <img> lacks "alt" attribute
line 322 column 23 - Warning: <img> lacks "alt" attribute
line 322 column 64 - Warning: <img> lacks "alt" attribute
line 322 column 113 - Warning: <img> lacks "alt" attribute
line 322 column 163 - Warning: <img> lacks "alt" attribute
line 333 column 15 - Warning: <img> lacks "alt" attribute
line 352 column 11 - Warning: <img> lacks "alt" attribute
line 353 column 22 - Warning: <img> lacks "alt" attribute
line 353 column 63 - Warning: <img> lacks "alt" attribute
line 353 column 112 - Warning: <img> lacks "alt" attribute
line 353 column 162 - Warning: <img> lacks "alt" attribute
line 354 column 11 - Warning: <img> lacks "alt" attribute
line 364 column 15 - Warning: <img> lacks "alt" attribute
line 371 column 447 - Warning: <img> lacks "alt" attribute
line 389 column 2792 - Warning: <img> lacks "alt" attribute
line 393 column 2945 - Warning: <img> lacks "alt" attribute
line 424 column 5686 - Warning: <img> lacks "alt" attribute
line 426 column 5861 - Warning: <img> lacks "alt" attribute
line 428 column 6044 - Warning: <img> lacks "alt" attribute
line 436 column 23 - Warning: <img> lacks "alt" attribute
line 436 column 64 - Warning: <img> lacks "alt" attribute
line 436 column 113 - Warning: <img> lacks "alt" attribute
line 436 column 163 - Warning: <img> lacks "alt" attribute
line 447 column 15 - Warning: <img> lacks "alt" attribute
line 466 column 11 - Warning: <img> lacks "alt" attribute
line 467 column 22 - Warning: <img> lacks "alt" attribute
line 467 column 63 - Warning: <img> lacks "alt" attribute
line 467 column 112 - Warning: <img> lacks "alt" attribute
line 467 column 162 - Warning: <img> lacks "alt" attribute
line 468 column 11 - Warning: <img> lacks "alt" attribute
line 478 column 15 - Warning: <img> lacks "alt" attribute
line 485 column 447 - Warning: <img> lacks "alt" attribute
line 493 column 2621 - Warning: <img> lacks "alt" attribute
line 495 column 2804 - Warning: <img> lacks "alt" attribute
line 503 column 21 - Warning: <img> lacks "alt" attribute
line 503 column 62 - Warning: <img> lacks "alt" attribute
line 503 column 111 - Warning: <img> lacks "alt" attribute
line 503 column 161 - Warning: <img> lacks "alt" attribute
line 504 column 11 - Warning: <img> lacks "alt" attribute
line 514 column 15 - Warning: <img> lacks "alt" attribute
line 525 column 399 - Warning: <img> lacks "alt" attribute
line 526 column 522 - Warning: <img> lacks "alt" attribute
line 529 column 708 - Warning: <img> lacks "alt" attribute
line 530 column 833 - Warning: <img> lacks "alt" attribute
line 531 column 959 - Warning: <img> lacks "alt" attribute
line 532 column 1085 - Warning: <img> lacks "alt" attribute
line 533 column 1211 - Warning: <img> lacks "alt" attribute
line 534 column 1336 - Warning: <img> lacks "alt" attribute
line 535 column 1461 - Warning: <img> lacks "alt" attribute
line 538 column 1650 - Warning: <img> lacks "alt" attribute
line 548 column 11 - Warning: <img> lacks "alt" attribute
line 549 column 22 - Warning: <img> lacks "alt" attribute
line 549 column 63 - Warning: <img> lacks "alt" attribute
line 549 column 112 - Warning: <img> lacks "alt" attribute
line 549 column 162 - Warning: <img> lacks "alt" attribute
line 550 column 11 - Warning: <img> lacks "alt" attribute
line 560 column 15 - Warning: <img> lacks "alt" attribute
line 567 column 447 - Warning: <img> lacks "alt" attribute
line 571 column 1158 - Warning: <img> lacks "alt" attribute
line 572 column 1281 - Warning: <img> lacks "alt" attribute
line 575 column 1467 - Warning: <img> lacks "alt" attribute
line 576 column 1592 - Warning: <img> lacks "alt" attribute
line 577 column 1718 - Warning: <img> lacks "alt" attribute
line 578 column 1844 - Warning: <img> lacks "alt" attribute
line 579 column 1970 - Warning: <img> lacks "alt" attribute
line 580 column 2095 - Warning: <img> lacks "alt" attribute
line 581 column 2220 - Warning: <img> lacks "alt" attribute
line 584 column 2409 - Warning: <img> lacks "alt" attribute
line 592 column 3000 - Warning: <img> lacks "alt" attribute
line 594 column 3183 - Warning: <img> lacks "alt" attribute
line 601 column 11 - Warning: <img> lacks "alt" attribute
line 602 column 22 - Warning: <img> lacks "alt" attribute
line 602 column 63 - Warning: <img> lacks "alt" attribute
line 602 column 112 - Warning: <img> lacks "alt" attribute
line 602 column 162 - Warning: <img> lacks "alt" attribute
line 603 column 11 - Warning: <img> lacks "alt" attribute
line 613 column 15 - Warning: <img> lacks "alt" attribute
line 620 column 447 - Warning: <img> lacks "alt" attribute
line 622 column 783 - Warning: <img> lacks "alt" attribute
line 624 column 941 - Warning: <img> lacks "alt" attribute
line 626 column 1124 - Warning: <img> lacks "alt" attribute
line 634 column 23 - Warning: <img> lacks "alt" attribute
line 634 column 64 - Warning: <img> lacks "alt" attribute
line 634 column 113 - Warning: <img> lacks "alt" attribute
line 634 column 163 - Warning: <img> lacks "alt" attribute
line 645 column 15 - Warning: <img> lacks "alt" attribute
line 661 column 11 - Warning: <img> lacks "alt" attribute
line 662 column 22 - Warning: <img> lacks "alt" attribute
line 662 column 63 - Warning: <img> lacks "alt" attribute
line 662 column 112 - Warning: <img> lacks "alt" attribute
line 662 column 162 - Warning: <img> lacks "alt" attribute
line 663 column 11 - Warning: <img> lacks "alt" attribute
line 673 column 15 - Warning: <img> lacks "alt" attribute
line 680 column 447 - Warning: <img> lacks "alt" attribute
line 680 column 756 - Warning: <img> lacks "alt" attribute
line 682 column 910 - Warning: <img> lacks "alt" attribute
line 684 column 1093 - Warning: <img> lacks "alt" attribute
line 691 column 11 - Warning: <img> lacks "alt" attribute
line 692 column 22 - Warning: <img> lacks "alt" attribute
line 692 column 63 - Warning: <img> lacks "alt" attribute
line 692 column 112 - Warning: <img> lacks "alt" attribute
line 692 column 162 - Warning: <img> lacks "alt" attribute
line 693 column 11 - Warning: <img> lacks "alt" attribute
line 703 column 15 - Warning: <img> lacks "alt" attribute
line 710 column 447 - Warning: <img> lacks "alt" attribute
line 759 column 4439 - Warning: <img> lacks "alt" attribute
line 761 column 4622 - Warning: <img> lacks "alt" attribute
line 769 column 23 - Warning: <img> lacks "alt" attribute
line 769 column 64 - Warning: <img> lacks "alt" attribute
line 769 column 113 - Warning: <img> lacks "alt" attribute
line 769 column 163 - Warning: <img> lacks "alt" attribute
line 780 column 15 - Warning: <img> lacks "alt" attribute
line 793 column 1490 - Warning: <img> proprietary attribute value "absmiddle"
line 793 column 1490 - Warning: <img> lacks "alt" attribute
line 803 column 11 - Warning: <img> lacks "alt" attribute
line 804 column 22 - Warning: <img> lacks "alt" attribute
line 804 column 63 - Warning: <img> lacks "alt" attribute
line 804 column 112 - Warning: <img> lacks "alt" attribute
line 804 column 162 - Warning: <img> lacks "alt" attribute
line 805 column 11 - Warning: <img> lacks "alt" attribute
line 815 column 15 - Warning: <img> lacks "alt" attribute
line 822 column 447 - Warning: <img> lacks "alt" attribute
line 828 column 1809 - Warning: <img> proprietary attribute value "absmiddle"
line 828 column 1809 - Warning: <img> lacks "alt" attribute
line 834 column 2737 - Warning: <img> lacks "alt" attribute
line 836 column 2920 - Warning: <img> lacks "alt" attribute
line 844 column 23 - Warning: <img> lacks "alt" attribute
line 844 column 64 - Warning: <img> lacks "alt" attribute
line 844 column 113 - Warning: <img> lacks "alt" attribute
line 844 column 163 - Warning: <img> lacks "alt" attribute
line 855 column 15 - Warning: <img> lacks "alt" attribute
line 870 column 11 - Warning: <img> lacks "alt" attribute
line 871 column 22 - Warning: <img> lacks "alt" attribute
line 871 column 63 - Warning: <img> lacks "alt" attribute
line 871 column 112 - Warning: <img> lacks "alt" attribute
line 871 column 162 - Warning: <img> lacks "alt" attribute
line 872 column 11 - Warning: <img> lacks "alt" attribute
line 882 column 15 - Warning: <img> lacks "alt" attribute
line 889 column 447 - Warning: <img> lacks "alt" attribute
line 891 column 1203 - Warning: <img> proprietary attribute value "absmiddle"
line 891 column 1203 - Warning: <img> lacks "alt" attribute
line 891 column 1287 - Warning: <img> lacks "alt" attribute
line 893 column 1470 - Warning: <img> lacks "alt" attribute
line 900 column 11 - Warning: <img> lacks "alt" attribute
line 901 column 22 - Warning: <img> lacks "alt" attribute
line 901 column 63 - Warning: <img> lacks "alt" attribute
line 901 column 112 - Warning: <img> lacks "alt" attribute
line 901 column 162 - Warning: <img> lacks "alt" attribute
line 902 column 11 - Warning: <img> lacks "alt" attribute
line 912 column 15 - Warning: <img> lacks "alt" attribute
line 919 column 447 - Warning: <img> lacks "alt" attribute
line 923 column 1183 - Warning: <img> lacks "alt" attribute
line 925 column 1366 - Warning: <img> lacks "alt" attribute
line 933 column 23 - Warning: <img> lacks "alt" attribute
line 933 column 64 - Warning: <img> lacks "alt" attribute
line 933 column 113 - Warning: <img> lacks "alt" attribute
line 933 column 163 - Warning: <img> lacks "alt" attribute
line 944 column 15 - Warning: <img> lacks "alt" attribute
line 953 column 686 - Warning: <img> proprietary attribute value "absmiddle"
line 953 column 686 - Warning: <img> lacks "alt" attribute
line 964 column 23 - Warning: <img> lacks "alt" attribute
line 964 column 64 - Warning: <img> lacks "alt" attribute
line 964 column 113 - Warning: <img> lacks "alt" attribute
line 964 column 163 - Warning: <img> lacks "alt" attribute
line 975 column 15 - Warning: <img> lacks "alt" attribute
line 1023 column 1482 - Warning: <img> lacks "alt" attribute
line 1049 column 45 - Warning: <img> proprietary attribute value "absmiddle"
line 1049 column 144 - Warning: <img> proprietary attribute value "absmiddle"
line 1049 column 248 - Warning: <img> proprietary attribute value "absmiddle"
line 1058 column 25 - Warning: <img> lacks "alt" attribute
line 1063 column 267 - Warning: <img> lacks "alt" attribute
line 182 column 1029 - Warning: trimming empty <span>
line 294 column 908 - Warning: trimming empty <span>
line 294 column 963 - Warning: trimming empty <span>
line 399 column 3969 - Warning: trimming empty <span>
line 399 column 4024 - Warning: trimming empty <span>
line 725 column 3173 - Warning: trimming empty <span>
line 725 column 3228 - Warning: trimming empty <span>
line 731 column 3398 - Warning: trimming empty <span>
line 731 column 3453 - Warning: trimming empty <span>
line 738 column 3633 - Warning: trimming empty <span>
line 738 column 3688 - Warning: trimming empty <span>
line 921 column 906 - Warning: trimming empty <span>
line 1043 column 17 - Warning: trimming empty <tr>
line 125 column 68 - Warning: <nobr> is not approved by W3C
line 141 column 68 - Warning: <nobr> is not approved by W3C
line 177 column 27 - Warning: <nobr> is not approved by W3C
line 179 column 173 - Warning: <table> proprietary attribute "height"
line 262 column 27 - Warning: <nobr> is not approved by W3C
line 288 column 27 - Warning: <nobr> is not approved by W3C
line 290 column 173 - Warning: <table> proprietary attribute "height"
line 338 column 27 - Warning: <nobr> is not approved by W3C
line 369 column 27 - Warning: <nobr> is not approved by W3C
line 371 column 173 - Warning: <table> proprietary attribute "height"
line 452 column 27 - Warning: <nobr> is not approved by W3C
line 483 column 27 - Warning: <nobr> is not approved by W3C
line 485 column 173 - Warning: <table> proprietary attribute "height"
line 519 column 27 - Warning: <nobr> is not approved by W3C
line 565 column 27 - Warning: <nobr> is not approved by W3C
line 567 column 173 - Warning: <table> proprietary attribute "height"
line 618 column 27 - Warning: <nobr> is not approved by W3C
line 620 column 173 - Warning: <table> proprietary attribute "height"
line 650 column 27 - Warning: <nobr> is not approved by W3C
line 678 column 27 - Warning: <nobr> is not approved by W3C
line 680 column 173 - Warning: <table> proprietary attribute "height"
line 708 column 27 - Warning: <nobr> is not approved by W3C
line 710 column 173 - Warning: <table> proprietary attribute "height"
line 785 column 27 - Warning: <nobr> is not approved by W3C
line 820 column 27 - Warning: <nobr> is not approved by W3C
line 822 column 173 - Warning: <table> proprietary attribute "height"
line 860 column 27 - Warning: <nobr> is not approved by W3C
line 887 column 27 - Warning: <nobr> is not approved by W3C
line 889 column 173 - Warning: <table> proprietary attribute "height"
line 917 column 27 - Warning: <nobr> is not approved by W3C
line 919 column 173 - Warning: <table> proprietary attribute "height"
line 949 column 27 - Warning: <nobr> is not approved by W3C
line 980 column 27 - Warning: <nobr> is not approved by W3C
Info: Document content looks like HTML5
Info: No system identifier in emitted doctype
Tidy found 437 warnings and 0 errors!


The alt attribute should be used to give a short description
of an image; longer descriptions should be given with the
longdesc attribute which takes a URL linked to the description.
These measures are needed for people using non-graphical browsers.

For further advice on how to make your pages accessible
see http://www.w3.org/WAI/GL.
You are recommended to use CSS to specify the font and
properties such as its size and color. This will reduce
the size of HTML files and make them easier to maintain
compared with using <FONT> elements.

You are recommended to use CSS to control line wrapping.
Use "white-space: nowrap" to inhibit wrapping in place
of inserting <NOBR>...</NOBR> into the markup.

About HTML Tidy: https://github.com/htacg/tidy-html5
Bug reports and comments: https://github.com/htacg/tidy-html5/issues
Official mailing list: https://lists.w3.org/Archives/Public/public-htacg/
Latest HTML specification: http://dev.w3.org/html5/spec-author-view/
Validate your HTML documents: http://validator.w3.org/nu/
Lobby your company to join the W3C: http://www.w3.org/Consortium

Do you speak a language other than English, or a different variant of
English? Consider helping us to localize HTML Tidy. For details please see
https://github.com/htacg/tidy-html5/blob/master/README/LOCALIZE.md