[PSX/PC] General editor - Hades Workshop (0.50b)

  • Thread starter Thread starter Tirlititi
  • Start date Start date
Status
Not open for further replies.
Hi Tirlititi, I've encountered a problem with a specific battle that I hope you (or anyone here) can help me with. I spent weeks adding more enemies to most battles, so all of the small-and medium-sized enemies appear in groups of 3 or 4, and during playtesting all of them worked quite well, except for the battles with the Hecteyes. For some reason, the game always crashes when I enter a battle with 3 Hecteyes, and and on my old computer I've also experienced a major slowdown during this particular battle.

First I thought that my old and outdated computer was the problem, but I have recently aquired a new and technically up-to-date netbook. The game runs much faster now, and even in the 3 Hecteyes battles there's no more slowdown, however, the game crashes still remain. Any idea what might be causing this? I've been wondering because all other battles with increased enemy numbers (and those were a lot!) work just fine.
 
Hey, long time I didn't post anything here !

I've updated the tool to v0.30 (yes, I passed from 0.28b to 0.30 because I'm totally crazy :evil:), you can read the changelog at the end of the post.

@resinate : About Hot & Cold, I'll try to decipher the script and make it a bit more readable. The way it is coded doesn't allow to just "loop for an infinite amount of items" though, so you'll have to get creative to find a way to do it.
About the items incompatible effects, that unfortunatly can't be fixed : there are indeed missing fields, but that's not that I didn't find them, that's because they simply don't exist. Adding an accuracy field for items or such requires knowledge I don't currently have.

@Yugisokubodai : Thank you, but that's strange... The 1st bug you mentioned, I thought I fixed it a while ago and when I check, it's fine. The 2nd bug is different though : the height of windows seems to be calculated automatically in the japanese version. I adjusted the text preview to fit a bit more with that.

@Kuroda Masahiro : It is perfectly possible (though tedious) to replace a character by another, minus the well-known fact that Cinna, Marcus and Blank share some data (the levels in particular) with Quina, Eiko and Amarant respectively. You can't have both Cinna and Quina in the team either, for instance. To replace a character, you can put the following lines inside scripts, at points before you can change your party (in the Hildaguard 3, for instance) :
Code: [Select]
Code:
PARTY_RESERVE( 4095 ) // Adjust this argument if you want fewer peoplePARTY_BATTLE_DATA( 8, 1, 255, 22, 15 ) // BeatrixPARTY_BATTLE_DATA( 9, 1, 255, 21, 8 ) // CinnaPARTY_BATTLE_DATA( 10, 1, 255, 21, 10 ) // MarcusPARTY_BATTLE_DATA( 11, 1, 255, 21, 12 ) // BlankNAME( 8, 75 ) // Rename Beatrix (shouldn't be important)NAME( 9, 72 ) // Rename Cinna (or else he's called "Quina")NAME( 10, 73 ) // Rename Marcus (or else he's called "Eiko")NAME( 11, 74 ) // Rename Blank (or else he's called "Amarant")
You'd need to add that kind of script anywhere the party is somehow modified to make it persistant ; or use a similar script to revert the changes if you want Quina, Eiko or Amarant back in the team.
There are bugs that can happen at some point of the game, however. I don't know if the Oeilvert part will be ok, for instance, because the script looks for your party members to see which character should be present in the cutscenes. Also, things that heal the whole party on the fields (regenerative springs...) will likely not work on Cinna, Marcus and Blank because the script misses the healing code for those particular characters.

@uzoko1 : I don't understand what you said... What was the questions?

@shikulja : Ok, I'll try to make that feature. Maybe not for the next update, but likely the next one (once all the texts of the game can be edited).

Kefka's bug is serious and I can't find any way to solve it. Hecteyes' model animations are handled through script and spell sequencer and it seems to make it impossible to have more than 2 hecteyes models in the same battle. For 2 hecteyes, strangely, it seems to work fine.


Ok. For the v0.30, I added few more things. The .hwf files will update so be sure to create it with an unmodified version of the game (and then change the .hwf file name if needed). If it updates well on a modded version, that's fine though.

- Added a "Party Special" panel. It will contain special list of spell and command-related things, that are handled specially by the game. For now, it only contains the Magic Sword requirements (the spells Vivi needs to learn in order to unlock the related Magic Sword) but it should also contain things like Meteor's accuracy formula or Roulette randomness script in the future.

- Added a "Tetra Master" panel. You can modify the name and the random range for the statistics of cards (not pictures yet). You can also modify the card decks used by the NPC. The naming rules for decks are the following :
-- For decks used by NPC in Treno Stadium, Memoria or by the Fat Chocobo, the name of the NPC is used,
-- For the others, the name of the town where you can first meet a NPC playing that deck (provided you don't change the script for that) is used,
-- If decks are used by NPC of several towns, a dot dot dot is added.
Thanks to Froggy25 who totally cracked the Tetra Master deep mechanics btw.

- Added an "Interface" panel. For now, it contains all the menu and special texts that were not available yet, including the casting names of Eiko's Eidolons and a bunch of other things.

- Enhanced several features :
-- Spells : you can decide of the "casting name" of spells. For instance, Fira Sword's name is only "Fira" but a " Sword" is appended at the casting time. You can decide of that.
-- Enemies : you can define the default attack used by the enemies under the Berserk and Confuse status ailments (it will always target 1 random character). Also added the "Link enemies" flag in the groups submenu : it is, by default, used exclusively by the Sand Golem, Movers and Kraken to make several targeting parts for 1 enemy. When enabling that flag, the scripts for all the linked enemies but 1 must be deleted and the remaining one will handle all the attacks and counter-attacks (See Kraken's AI script for an example).
-- Text editing : in the japanese version, the height of the preview window is properly displayed. It is also displayed (instead of being of infinite size) in all the game versions for menu texts and such, where you can't modify the size of the text window.
-- Script editing : you can determine how many local variables you need in each entry of scripts. Local variables seem to be recognized by the fact the 1st number in their name is odd (such as "VAR_B7_0" or "VAR_A11_0"). You need to make the local variable amount strictly higher than the 2nd number of the name of every local variable you use in an entry. For example, in this post, I explain how to add more than 65536 HP to Trance Kuja but I make use of "VAR_B7_60". It works by miracle but it would need to set the local variable amount to 61 or higher to properly be done. Note that VAR_B7 are 1 byte-long, VAR_B5 are 2 bytes-long and VAR_A11 are 3 bytes-long. I'll go in details for the next version and use that to make the final version of the script editing window.
The function names are a bit more meaningful now.
Also, the scripts for exiting to the world maps are properly un-parsed now. I think that was the last case of script problems.

Next time, if I'm not distracted by something else, you should be able to modify the name of locations on the World Maps (that'll conclude the non-picture texts tour) and a better script editing window should be available (with the feature to name variables, that'll at last look like something).

Tell me if you find problems ^^
 
Last edited:
Hey man, good to see that this program is still getting updates. (After the long break now, I was beginning to worry.)

- Added a "Tetra Master" panel. You can modify the name and the random range for the statistics of cards (not pictures yet). You can also modify the card decks used by the NPC. The naming rules for decks are the following :
-- For decks used by NPC in Treno Stadium, Memoria or by the Fat Chocobo, the name of the NPC is used,
-- For the others, the name of the town where you can first meet a NPC playing that deck (provided you don't change the script for that) is used,
-- If decks are used by NPC of several towns, a dot dot dot is added.
Thanks to Froggy25 who totally cracked the Tetra Master deep mechanics btw.
That's quite interesting, I've always wanted to achieve the highest rank in Tetra Master, but I never bothered trying because getting all different arrow combinations is a pain in the a**. The ability to modify the decks of all opponents will definitely allow for huge improvements, I'll certainly take a look at that.

Also added the "Link enemies" flag in the groups submenu : it is, by default, used exclusively by the Sand Golem, Movers and Kraken to make several targeting parts for 1 enemy. When enabling that flag, the scripts for all the linked enemies but 1 must be deleted and the remaining one will handle all the attacks and counter-attacks (See Kraken's AI script for an example).
Now this is most intriguing. I've already tried several times to make all three Movers act independently from each other (so that they can attack three times per round instead of just once), but no matter how much I tweaked their battle script, it just wouldn't work. Now I know the reason, and I'll give it another go. By removing that Link flag and giving additional AI scripts to the other two Movers it should work, right?
 
Well, yes you can do that. But the movers won't move 3 by 3 anymore when attacking and it will be tricky to reproduce their Delta Attack counter system.
You also have to do few more things about the AI than what you said :
1) Remove (or empty, or write new ones) the "Counter" and "CounterEx" functions, since it messes up with each other mover's HP
2) In the function "Init" of the 1st mover, remove the following lines :
Code: [Select]
Code:
        SET VAR_B15_0[MAX_HP] =$ 65535L        SET VAR_B15_2[MAX_HP] =$ ( 65535L - ( Op2B(SV_FunctionEnemy[HP]) / 2 ) )        SET VAR_B15_4[MAX_HP] =$ 65535L        SET VAR_B15_0[HP] =$ 65535L        SET VAR_B15_2[HP] =$ Op2B(VAR_B15_2[MAX_HP])        SET VAR_B15_4[HP] =$ 65535L
And insert those instead :
Code: [Select]
Code:
        SET VAR_B15_0[MODEL_OFF] =$ 60        SET VAR_B15_2[MODEL_OFF] =$ 51        SET VAR_B15_4[MODEL_OFF] =$ 15
You'll see their purpose if you don't do it ;)

3) Also, the Delta Attack is engaged in the "ATB" function. When Movers cast the "Continue1" attack, they normally stop bouncing and form a triangle. It won't work anymore unless all the movers cast that attack. Alternatively, you can put those lines in the script to force that triangle formation instantatly :
Code: [Select]
Code:
        SET VAR_B15_0[STAND_ANIMATION] =$ 1        SET VAR_B15_2[STAND_ANIMATION] =$ 1        SET VAR_B15_4[STAND_ANIMATION] =$ 1
Set it back to 0 to remove the formation.

Other than that, you can try not to disable the "link" flag and put more useful counters in the "Counter" function ; that doesn't give more turns to movers but that's about the same effect without modifying the IA too much (but that's if you are concerned about having the same IA as in the vanilla game).
 
Wow, thanks a ton man! Those are some really useful tips. I'll try them out right away, and who knows, if it works I might even try the same for Kraken and his tentacles.

Yeah, I was worrying about the Delta Attack, too, so I'm glad that you found a solution for that one.
 
Hey Tirlititi, thanks for this program. FF9 is one of my favorite games but sadly, there are many things I would like to change. So far I have made a simple .ppf with just 255 accuracy for stat mags and changed steal slots from some bosses like Hilgigars.

It already made the game a whole lot better!!

I look forward to stuff like editing treasures, hot and cold list, and most importantly more items and harder enemies. And that's what I would like to ask.

- Is it possible to have enemies with more than 65000 or so HP? More than 254 items? Removing the damage limit cap? I'm sure it involves some pretty complex stuff but just wanted to know.

But again thank you very much, this is some extremely quality stuff.
 
Hey gorildo, glad you enjoy modding the game ;)

Actually, you can already modify few things you ask for. You can modify chest contents by script editing. Chest treasures are not something that are listed in some place, but rather spread around in the fields' scripts. See the "Field" panel and check the script to find the chest functions that give the items.

Somewhat removing the damage limit cap can be easily done in the "Spell Animations" panel : you only need to add several "damage point" and "figure point" to the spell animation sequence. However, there are bugs that may happen then due to counter attacks (explained here).

You can also cheat with the script and add artificialy more than 65535 HP to one ennemy ; an example is given here for Trance Kuja.

However, you can't add more than 254 items unfortunatly... You can change the purpose and most aspects of existing items but you have to sacrifice something old for that ^^

Good luck !
 
Hey thanks, I spent some 2 days trying to figure it out and I finally got something.

On the first field of the list there is this part of the code "Function Code8_Loop"

Code: [Select]
Code:
 }                0x27( 127 )                SET VAR_B9_220 = 600                SET VAR_B9_222 = 1700                SET VAR_B5_226 = VAR_C5_7175                SET VAR_B9_224 = 236                TEXT_VARIABLE( 0, 236 )                RUN_SCRIPT_SYNC( 2, 250, 12 )                if ( 1 ) {                    SET VAR_C5_7175 = VAR_B5_226                }
I figured 236 was the code for Potion. I substituted it for "12" on "SET VAR_B9_224" and I got a Sargatanas, as expected.
But what does "TEXT_VARIABLE( 0, 236 )" means? Does it have anything to do with that potion? If not, then is this all there is to it, just substitute that number as in this case and it's okay?

I plan on changing a few chests, but just a few of them.
 
Congrats ;)

In short : yes you should replace it with the right number. The following explains why.

The "SetTextVariable" code has the purpose to replace variable part of the texts to one that makes sense.
If you look for the texts, you'll find things like :
Code: [Select]
Code:
 Received µ!
With µ corresponding to the text opcode "[VAR_ITEM]". That "SetTextVariable" is used in the script to tell which item's name should be written in place of that µ. Note: For the Steam version, text opcodes are written more explicitely.
That same "SetTextVariable" is also used for the other text opcodes of the same kind :

  • "[VAR_NUM]", to replace it with the plain number
  • "[VAR_TOKEN]", to replace it with a token of a tokenized string (that's usually a moogle's name)

Now, if you got it well, you should wonder why, when you picked up the item, not only you got a Sargatanas, but the game also displayed to you "Received Sargatanas" while it should still display "Received Potion" because you didn't change the "SetTextVariable" argument.
That is because the script then calls the function "Zidane_12" and that's the function in charge of adding the item and displaying the related text (and few other things, such as making Zidane face in the right direction, saving in a variable the fact that this item has been took, ...). The function "Code8_Loop" you modified is in charge of setting it up. In the "Zidane_12", another "SetTextVariable" opcode is present :
Code: [Select]
Code:
                if ( ( GetItemCount(VAR_GenInt16_224) < 99 ) && ( VAR_GenInt16_224 < 512 ) ) {                    RunSoundCode3( 53248, 108, 0, -128, 125 )                    set VAR_GenUInt8_226 = 1                    SetTextVariable( 0, VAR_GenInt16_224 )                    AddItem( VAR_GenInt16_224, 1 )                    WindowSync( "Received [VAR_ITEM]!" )                } ....
Since you updated the variable "VAR_GenInt16_224" well, it all works fine as intended : check if the right item is not owned 99 times already, display the right item's name and add the right item to the inventory.
Note that regular items have an ID between 0 and 255, the key items have an ID between 256 and 511 and the cards have an ID between 512 and 611. So it also checks whether the item received is a card (in which case, it does slightly different things) or not.

I tell you to modify the number in the "SetTextVariable" opcode because, while it is totally useless here, the same system is not used for every treasure of the game. Most of the time, this system is used for treasures not contained in a chest (and thus not related to any 3D model) and a different system, where there is no "set VAR_GenInt16_224 = some number" setup and you have to change all the numbers in the script, is used for treasures contained in a chest.

For instance, this is a part of the script found in the "ChestA_Range" function for an ether found in a chest in the ruined Prima Vista :
Code: [Select]
Code:
                if ( ( ( GetItemCount(238) < 99 ) && 1 ) || ( 0 && ( GetCardAmount < 100 ) ) ) {                    Wait( 2 )                    if ( VARL_GenBool_7243 == 0 ) {                        RunSoundCode3( 53248, 108, 0, -128, 125 )                        set VARL_GenBool_7243 = 1                        SetTextVariable( 0, 238 )                        if ( 1 ) {                            AddItem( 238, 1 )                            WindowSync( "Received [VAR_ITEM]!" )                        } else {                            if ( 1 ) {                                AddItem( 238, 1 )                                WindowSync( "Received [VAR_ITEM] Card!" )                            } else {                                AddGil( 16776454 )                                set VAR_GenInt16_224 = 64774                                SetTextVariable( 0, VAR_GenInt16_224 )                                WindowSync( "Received [VAR_NUM] Gil!" )                            }                        }                    }
Here, you have to modify the number 238 into whatever item you want 3 times :

  • In the "GetItemCount" argument
  • In the "SetTextVariable" argument
  • In the "AddItem" argument
You can see that there is a good portion of the script that is utterly useless ("if ( 1 )" will always trigger). I can say for sure that Square's developpers used some macros, which is a programming thing that may generate script codes like this.

tl ; dr : change the value in the "SetTextVariable" and in the "GetItemCount" lines as well if you find those.
 
Last edited:
I do not know how to thank Tirlititi The best game in my life is ff9 And I achieved my dream Amendment to the ff9 Very wonderful your program HadesWorkshop Can not imagine my happiness very thx Tirlititi And I hope in the next release We can edit the songs (I am bad in English sry :-P)
 
Glad you enjoy it ^^
Songs are not going to be editable before long though. It's a huge thing and I don't want to throw myself in it before finishing the other stuff.
 
Hey! Thank u guys for these awesome programm u created. i recently found a video of zidane casting ultima without crashing/freezing the game. i dont know if its fake or not. So i hoped u guys can help me out a little bit. I`m a huge ff9 fan and admire ur work :). Here ist the YT link of the video:

Best regards
 
That's not a fake at all. However, it doesn't totally prevent the game from freezing : casting this Ultima would freeze the game if it didn't kill all the enemies and brought victory.
 
Good job Tirlitit,i  you have team members... I envy you, I wonder which program use for found Offset address ? :)
 
Thanks EditorMaster.
In the early development, I used a little program I made myself to search for a few of data patterns regular hex editors can't search. I don't use it anymore because, mainly thanks to qhimm's wiki, I have the offsets of pretty much every "data directory" and know better how to search things using a regular hex editor.


Attention to everyone : someone warned me about a compatibility issue.
You should never import the "Stats" datas of mod files (.hws) from previous versions (before 0.30). It would mess with all of these datas inside the "Stats" panel.
Only "Stats" datas are concerned, the rest of the mod files is fine.
If you already did that and updated your mod without noticing the stats were totally screwed, that's not a problem : just uncheck the "Stats" box the next time you save your mod and it should work fine.
Modifications made to that "Stats" part, however, are lost ; you'll have to do it again by hand. If that's too much of a work, you can send me you .hws file (or even one that contains only the corrupted "Stats" modifications) and I should be able to fix it pretty easily by hand.
I won't fix this compatibility issue since that would make 0.30 stat datas incompatible with the next releases :/
Sorry to everyone bothered by that.
 
RIP my mod to pieces :( soo much work to make that stat system i did lol
 
If that's too much of a work, you can send me you .hws file (or even one that contains only the corrupted "Stats" modifications) and I should be able to fix it pretty easily by hand.
I'm overly busy these few days, but it'd most likely be done by the end of the week.
 
Update to 0.31 :
- You can now fully choose which statuses are inflicted (or healed) by spells,
- World Maps have 2 more sub-panels : they allow to modify the name of the different places and modify the random encounters in the different areas. However, you can only use random encounters with the proper battle scene or the game will crash. Also, you can't see where are placed those areas on the World Map yet.
- Improved the script edition a lot :
--- Added a way to declare and use local variables. More details below.
--- Added a list of different known functions and variables, with their descriptions.
--- You now easily generate the value corresponding to different things, such as an attack list for enemy IA, or a button list to get the player's inputs.
--- Added a preview of the field walkmesh when editing a field script. The positions in the code are viewed on this preview.
--- Same thing for the world map. The preview can't be zoomed tough.
--- Improved the argument helpers for several data types, such as positions or colors.

About the local variables, the syntax is this one :
Code: [Select]
Code:
local [type] [name] [Default Name]// examplelocal uint8 foo VAR_LocUInt8_10
EDIT: You can now use global variable as well: they are shared by the other entries of the script and are declared using the keyword "global" insteal of "local".

[type] can be one of the following : Bool, SBool (same as Bool), Int8, UInt8, Int16, UInt16, Int24, UInt24 and Null (dummied).
For integers (int) and positive integers (uint), the number is the size in bits, so Int16 is 16 bits (= 2 bytes) long.

[name] is the name you want for your local variable.

[Default Name] is optional and is the name of the variable you want to replace. It should have a compatible size. Note that this default name can still be used to refer to your variable.
If you don't specify it, a default one will be attributed. However, it will likely mess with the local variables already used in the script and not declared.

Usually,
int8 are of the form VAR_LocInt8_##
int16 are of the form VAR_LocInt16_##
uint16 are of the form VAR_LocUInt16_##
etc...

Local variable settings can be saved in .hws files independantly of the rest.
I'm planning to create a .hws file containing all the local variables used by the game by default. Once it'll be done, you can import it and declare local variables without fear of collision with the ones existing (not to mention it will largely increase the readability).

A local variable declaration needs to be parsed to take effect. It can't throw an error but if there's a problem, you'll get a warning and the problematic line will be ignored.


The most immediate and practical use is that you can rename a variable once you understood the purpose :
- Check that the variable is local or global by looking at its name.
- If it's a general variable instead, you may declare it global and still use it as a global variable provided you use the right [Default Name].
- Declare the variable anyway ; the only thing left is to choose its name, which should be feasible since you understood its purpose.
- Parse, close the script window and open it back. The cryptic variable's name has been replaced by the name you've chosen.

Example : for some treasures, the variables "VAR_GenInt16_220" to "VAR_GenInt16_224" serve as settings the treasure's position and item.
If you find a script looking like this :
Code: [Select]
Code:
Function Zidane_12    TimedTurn( Angle(VAR_GenInt16_220, VAR_GenInt16_222), 16 )    WaitTurn(  )    if ( VAR_GenUInt8_226 == 0 ) {        if ( VAR_GenInt16_224 == 29999 ) {            WindowSync( 7, 0, 6 )        } else {            if ( VAR_GenInt16_224 >= 1000 ) {                RunSoundCode3( 53248, 108, 0, -128, 125 )                set VAR_GenInt16_228 = ( VAR_GenInt16_224 - 1000 )                if ( ( VAR_GenInt16_228 + GetGil ) > 9999999L ) {                    set VAR_GenInt16_228 = ( 9999999L - GetGil )                }                AddGil( VAR_GenInt16_228 )                SetTextVariable( 0, VAR_GenInt16_228 )                WindowSync( 7, 0, 6 )                set VAR_GenUInt8_226 = 1            } else {                if ( ( GetItemCount(VAR_GenInt16_224) < 99 ) && ( VAR_GenInt16_224 < 512 ) ) {                    RunSoundCode3( 53248, 108, 0, -128, 125 )                    set VAR_GenUInt8_226 = 1                    SetTextVariable( 0, VAR_GenInt16_224 )                    AddItem( VAR_GenInt16_224, 1 )                    WindowSync( 7, 0, 4 )                } else {                    if ( ( VAR_GenInt16_224 >= 512 ) && ( GetCardAmount < 100 ) ) {                        RunSoundCode3( 53248, 108, 0, -128, 125 )                        set VAR_GenUInt8_226 = 1                        SetTextVariable( 0, VAR_GenInt16_224 )                        AddItem( VAR_GenInt16_224, 1 )                        WindowSync( 7, 0, 5 )                    } else {                        SetTextVariable( 0, VAR_GenInt16_224 )                        if ( VAR_GenInt16_224 < 512 ) {                            WindowSync( 7, 0, 8 )                        } else {                            WindowSync( 7, 0, 9 )                        }                    }                }            }        }    }    return
Then you can declare these :
Code: [Select]
Code:
global int16 TreasurePositionX VAR_GenInt16_220global int16 TreasurePositionY VAR_GenInt16_222global int16 TreasureItem VAR_GenInt16_224global uint8 TreasureTaken VAR_GenInt16_226
Parse, close and reopen and find this instead :
Code: [Select]
Code:
Function Zidane_12    TimedTurn( Angle(TreasurePositionX, TreasurePositionY), 16 )    WaitTurn(  )    if ( VAR_GenUInt8_226 == 0 ) {        if ( TreasureItem == 29999 ) {            WindowSync( 7, 0, 6 )        } else {            if ( TreasureItem >= 1000 ) {                RunSoundCode3( 53248, 108, 0, -128, 125 )                set VAR_GenInt16_228 = ( TreasureItem - 1000 )                if ( ( VAR_GenInt16_228 + GetGil ) > 9999999L ) {                    set VAR_GenInt16_228 = ( 9999999L - GetGil )                }                AddGil( VAR_GenInt16_228 )                SetTextVariable( 0, VAR_GenInt16_228 )                WindowSync( 7, 0, 6 )                set VAR_GenUInt8_226 = 1            } else {                if ( ( GetItemCount(TreasureItem) < 99 ) && ( TreasureItem < 512 ) ) {                    RunSoundCode3( 53248, 108, 0, -128, 125 )                    set VAR_GenUInt8_226 = 1                    SetTextVariable( 0, TreasureItem )                    AddItem( TreasureItem, 1 )                    WindowSync( 7, 0, 4 )                } else {                    if ( ( TreasureItem >= 512 ) && ( GetCardAmount < 100 ) ) {                        RunSoundCode3( 53248, 108, 0, -128, 125 )                        set VAR_GenUInt8_226 = 1                        SetTextVariable( 0, TreasureItem )                        AddItem( TreasureItem, 1 )                        WindowSync( 7, 0, 5 )                    } else {                        SetTextVariable( 0, TreasureItem )                        if ( TreasureItem < 512 ) {                            WindowSync( 7, 0, 8 )                        } else {                            WindowSync( 7, 0, 9 )                        }                    }                }            }        }    }    return


I hope you enjoy the changes  ;)
 
Last edited:
Ugh, I don't know why but after editing a ton of monster data to balance their stats better and saving it, it seems like most of it is gone, which considering how long it took sucks. The really weird thing is that some of that data did get saved, but only the basic stats it seems, all of the status effects and HP/MP stats don't seem to exist. Is that a problem or did I just mess something up somehow?
 
That bites :/
I just tried few tests and it seems to work fine for me. Can you tell me :
1) which datas were saved and which datas were not saved exactly,
2) the save process you had (if you saved as mod, then overwrote the binary data or things like that).

I did change a tiny bit of the saving routine in this version, but I can't see how it would have affect that.
 
Status
Not open for further replies.
Back
Top