Welcome Guest [Log In] [Register]
Welcome to Maco. We hope you enjoy your visit.


You're currently viewing our forum as a guest. This means you are limited to certain areas of the board and there are some features you can't use. If you join our community, you'll be able to access member-only sections, and use many member-only features such as customizing your profile, sending personal messages, and voting in polls. Registration is simple, fast, and completely free.


Join our community!


If you're already a member please log in to your account to access all of our features:

Username:   Password:
Add Reply
[OOT DBG] UPDATED Display List Tutorial
Topic Started: Jan 21 2014, 09:26 PM (7,017 Views)
sylux102
Member Avatar
Advanced Member
[ *  *  * ]
Ok we needed a new tutorial. This is going to be A LOT faster than using wotf.py

You need:
A new display list model (obj format)
Hylian Toolbox
A zobj to inject into (I will use linkobjboy.zobj)
A hex editor
ZELOOTMA.Z64


Step 1: open linkobjboy.zobj in HT. Don't do anything, just click File>save. Doing this makes all of the Low Poly display lists unused. Close HT.

Step 2: open ZELOOTMA.Z64 in a hex editor. Search for "0600020A78" this will take you to links display list table. Go to the first 0600xxxxxx you see (it's obvious). This is the start of said table. It starts with Adult Link and alternates with Young Link (a pattern like AL, YL, AL, YL etc.). Use the information found here to change ALL (seriously change all of them) low poly display list pointers into the High Poly display lists. This frees space in linkobjboy.zobj so you can inject more data in the file (because it makes the low poly dlists unused). Now save and close out of the ROM but not the hex editor.

Step 3: Copy linkobjboy.zobj. Open one copy in the hex editor and the other in HT. Using HT, (I guess you could use the site I linked to as well) locate the low poly display lists. For each low poly display list, determine its length and then fill that space in with "0000000" empty space. Check to make sure you don't overwrite things like the hook shot chain (unless you won't use it) or things like that. When you have freed as much space as you can, save it and MAKE NOT OF WHERE THE FREE SPACE STARTS AND WHERE IT STOPS. THIS IS IMPORTANT.

Step 4: delete the copy of linkobjboy.zobj that you opened in HT. This simply helps prevent confusion between the "empty" link file and the original one.

Step 5: Go into your HT program directory (mine is D:\HT\) and create a text file called "Injection Offset.txt" open this in notepad or something similar and type only 6 digits in it. These digits are the offset where the free space starts. (I typed 27500 as a test and it automatically fixed it and worked so don't worry about the 0x00 stuff). This file tells HT you want to inject at that offset instead of appending data to the end of linkobjboy.zobj.

Step 6: Open HT, then click File>Open Individual. Open linkobjboy.zobj and you'll notice you can no longer see the low poly dlists. (HT just skips to the next offset which will be a pretty big jump). Now click File>Import Obj. Locate your obj file and open it. HT will import your model for you and put it where you told it to (in "Injection Offset.txt"). Now you can click File>Save. Locate your new dlist and WRITE DOWN THE OFFSET ITS NOT THE SAME ONE YOU PUT IN THE TEXT FILE. You can close HT.

Step 7: Open the newly modified zobj file in a hex editor (yes, again) and from here it turns into the old tutorial. Which I will quote the relevant information for the lazy ones. This was by Jason777 for replacing the Big Goron Sword but the principle still applies. Just change what you need to.

Quote:
 
It is time that we replaced one of the already existing swords (or another weapon if you want) with our sword. Go to 0x238C8 (Display list start) in the ZOBJ to replace the high-poly Biggoron's Sword. When you are at 0x238C8 you should see an E7 command:

E7 00 00 00 00 00 00 00​; This marks the beginning of a display list most of the time

What we are going to be modifying is the data right after that 8th byte. We are going to be placing a DE command to append display lists to that one. Here is the format for the DE command we will be placing:

DE 00 00 00 BB XX XX XX​

BB. ​​= Bank​​​​; we will be using 06
XX XX XX ​ = Display List to attach​​; wotf.py gave you this

After typing that DE command, we are going to want to place another DE command right after it so that way Link's hand is attached to it when he draws it. Here is the format for the DE command we will be placing:

DE 00 00 00 BB YY YY YY

BB​​ = Bank​​​​; we will be using 06 AGAIN
YY YY YY​ = Display List to attach​​; adult link's high-poly left fist is 0x21CE8

Next, we want to place a DF command (marks the end of a display list) right after that last DE command so that way the Biggoron Sword doesn't load up along with your model and Link's fist. Here is how we would write a DF command:

DF 00 00 00 00 00 00 00

Here is an example of how the start of the display list to the high-poly Biggoron Sword should look like after you are done modifying it (wotf.py provided me with a display list offset start of 0x391EC):

E7 00 00 00 00 00 00 00 DE 00 00 00 06 03 91 EC DE 00 00 00 06 02 1E C8 DF 00 00 00 00 00 00 00

^^ If it looks exactly like that except with a different XX XX XX value then you're doing it right. Alright, we're done modifying the adult link ZOBJ; you can save. BE SURE TO SAVE IT AS SOMETHING ELSE AND THAT YOU CAN REMEMBER LIKE "custom_sword.zobj".


Step 8: Ok, so you're basically done all you have to do is inject your new zobj into the ROM. With my method, you DO NOT need to move any files anywhere. Just overwrite the old zobj. This allows for more free space in the ROM. Test your new mod and use the weapon/dlist you replaced. If it doesn't show up along with the HUD and other stuff, you probably did what I did the first time. Just open your zobj in a hex editor and check the offsets you put for the DE command. You probably put in the wrong offset.

You're welcome Maco.
A sword wields no strength unless the hand that holds it has courage.
Offline Profile Quote Post Goto Top
 
link_the_lefthanded_swordsman
Member Avatar
Advanced Member
[ *  *  * ]
:D:D:D:D:D:D:D:D:D
Offline Profile Quote Post Goto Top
 
link_the_lefthanded_swordsman
Member Avatar
Advanced Member
[ *  *  * ]
could you posibly add some screenshots of hxd as example
Offline Profile Quote Post Goto Top
 
Ideka
Member Avatar

[ *  *  * ]
Nice tutorial, though HT doesn't work very well on my computer, so I can't import objs(yes, I have tried everything in the help topic). It does not really matter anyway, because I have developed my own way of importing dlists. Interesting, huh?
"What?! You don't have my money?! How dare you! You'd better bring me my money...or else!" ~ Happy Mask Salesman
Youtube
Webpage
Offline Profile Quote Post Goto Top
 
link_the_lefthanded_swordsman
Member Avatar
Advanced Member
[ *  *  * ]
Ideka
Jan 22 2014, 07:19 AM
Nice tutorial, though HT doesn't work very well on my computer, so I can't import objs(yes, I have tried everything in the help topic). It does not really matter anyway, because I have developed my own way of importing dlists. Interesting, huh?
have you tried removing Model2N64CHT.exe.config and Model2N64CHT from the folder then putting them back in? it worked for me
Offline Profile Quote Post Goto Top
 
GANONdork123
Member Avatar
Advanced Member
[ *  *  * ]
Posted Image
GANONdork123

Posted Image
Offline Profile Quote Post Goto Top
 
sylux102
Member Avatar
Advanced Member
[ *  *  * ]
GANONdork123
Jan 22 2014, 08:14 AM
Posted Image
0600020a78 was an example. You can search any of links display lists to go to the table.
A sword wields no strength unless the hand that holds it has courage.
Offline Profile Quote Post Goto Top
 
GANONdork123
Member Avatar
Advanced Member
[ *  *  * ]
so i thought about this for awhile, and why don't we just inject our dlists into empty data and change the pointers so that they load the dlists from that offset
GANONdork123

Posted Image
Offline Profile Quote Post Goto Top
 
sylux102
Member Avatar
Advanced Member
[ *  *  * ]
GANONdork123
Jan 22 2014, 06:48 PM
so i thought about this for awhile, and why don't we just inject our dlists into empty data and change the pointers so that they load the dlists from that offset
Because it wouldn't be in bank 06 or 04
A sword wields no strength unless the hand that holds it has courage.
Offline Profile Quote Post Goto Top
 
GANONdork123
Member Avatar
Advanced Member
[ *  *  * ]
sylux102
Jan 22 2014, 06:52 PM
GANONdork123
Jan 22 2014, 06:48 PM
so i thought about this for awhile, and why don't we just inject our dlists into empty data and change the pointers so that they load the dlists from that offset
Because it wouldn't be in bank 06 or 04
[7:56:45 PM] Flotonic: When you add the data onto the end of Link's file, you have to move his entire file into unused space.
[7:56:51 PM] Flotonic: The "bank" stays at 06.
[7:57:20 PM] Flotonic: If you edit Link's data so there is unused space within his file and replace that unused data within his file so the file-size stays the same, the "bank" stays at 06.
Flotonic says this is possible.
Edited by GANONdork123, Jan 22 2014, 08:02 PM.
GANONdork123

Posted Image
Offline Profile Quote Post Goto Top
 
Jiyaro
Member Avatar
Advanced Member
[ *  *  * ]
GANONdork123
Jan 22 2014, 08:01 PM
[7:56:45 PM] Flotonic: When you add the data onto the end of Link's file, you have to move his entire file into unused space.
[7:56:51 PM] Flotonic: The "bank" stays at 06.
[7:57:20 PM] Flotonic: If you edit Link's data so there is unused space within his file and replace that unused data within his file so the file-size stays the same, the "bank" stays at 06.
Flotonic says this is possible.
Well then, what are you waiting for?

Oh, and great tutorial, Sylux.
Offline Profile Quote Post Goto Top
 
sylux102
Member Avatar
Advanced Member
[ *  *  * ]
GANONdork123
Jan 22 2014, 08:01 PM
sylux102
Jan 22 2014, 06:52 PM
GANONdork123
Jan 22 2014, 06:48 PM
so i thought about this for awhile, and why don't we just inject our dlists into empty data and change the pointers so that they load the dlists from that offset
Because it wouldn't be in bank 06 or 04
[7:56:45 PM] Flotonic: When you add the data onto the end of Link's file, you have to move his entire file into unused space.
[7:56:51 PM] Flotonic: The "bank" stays at 06.
[7:57:20 PM] Flotonic: If you edit Link's data so there is unused space within his file and replace that unused data within his file so the file-size stays the same, the "bank" stays at 06.
Flotonic says this is possible.
That still uses links file so of course the bank is still 06. I meant injecting a custom .zobj with custom dlists.
A sword wields no strength unless the hand that holds it has courage.
Offline Profile Quote Post Goto Top
 
GANONdork123
Member Avatar
Advanced Member
[ *  *  * ]
sylux102
Jan 22 2014, 09:58 PM
GANONdork123
Jan 22 2014, 08:01 PM
sylux102
Jan 22 2014, 06:52 PM
GANONdork123
Jan 22 2014, 06:48 PM
so i thought about this for awhile, and why don't we just inject our dlists into empty data and change the pointers so that they load the dlists from that offset
Because it wouldn't be in bank 06 or 04
[7:56:45 PM] Flotonic: When you add the data onto the end of Link's file, you have to move his entire file into unused space.
[7:56:51 PM] Flotonic: The "bank" stays at 06.
[7:57:20 PM] Flotonic: If you edit Link's data so there is unused space within his file and replace that unused data within his file so the file-size stays the same, the "bank" stays at 06.
Flotonic says this is possible.
That still uses links file so of course the bank is still 06. I meant injecting a custom .zobj with custom dlists.
yeah i soon pointed that out to him
GANONdork123

Posted Image
Offline Profile Quote Post Goto Top
 
link_the_lefthanded_swordsman
Member Avatar
Advanced Member
[ *  *  * ]
can you do it with the rom insted of the zobj
Offline Profile Quote Post Goto Top
 
SanguinettiMods
Member Avatar
Your friendly neighborhood insomniac
[ *  *  * ]
I think some of you have the wrong idea of "banks". Think of it like drives on a computer.

Bank 06 tells the game that whatever pointer it is given is inside the current object file. This goes for anything, not just Link.
Bank 04 tells the game that whatever pointer it is given is inside the file gameplay_keep.zdata. You can reference data in gameplay_keep within Link's file. This is how Hylian Shield is textured, since the texture is inside gameplay keep instead of Link's file.
Offline Profile Quote Post Goto Top
 
1 user reading this topic (1 Guest and 0 Anonymous)
DealsFor.me - The best sales, coupons, and discounts for you
Go to Next Page
« Previous Topic · Zelda Tutorials · Next Topic »
Add Reply

As some of you may know, I have left the rom editing scene, never to return. I will be attending UNL. I will also be getting a job, so I will not have the time to run a community and make all of these projects.

I'm leaving you all in good hands. Sylux102, one of the best Maco staff members, will be carrying on in my stead. His forums are on Zelda64.net. Register there, since this website is archive only.

As for OoT 2D and Izou, I will be leaving those in the hands of GodsTurf's team, Lunar World. If you are fans of these projects, subscribe to them.