[PSX/PC] Battle editor - Proud Clod (1.5.0/FINAL)

  • Thread starter Thread starter nfitc1
  • Start date Start date
Status
Not open for further replies.
I never tried actually changing that value.....Give it a try. :D

Has anyone noticed that on some scripts (usually quite long ones) that close to the end of the disassembly it just doesn't have any tabs on the lines anymore? I always thought that was weird. Now I know what was causing that and I fixed it. ;) This next version's going to have lots (and LOTS) of fixes in it.
 
how about an option to turn all statuses, targets, and elements on or off, so that you don't have to click all the damn boxes? it would make things even easier, and since it will have a resizing option, it should have more room to put stuff ^^.

yeah, i noticed it as well, and it always bugged me, but wasn't hurting anything, but at least it won't be there anymore >:D. after i finish AB (hopefully soon >_>) i will try out some of the variables to see what they all do... i found out the ones i did easily enough, so it shouldn't be too hard to find more. putting in debug messages (not to the actual debugger, but printed on screen) works pretty well, i just need to learn more about that to print the actual values instead of a message saying 1 if true, or 0 if false, because the larger than bit values will require it.

you work any towards a copy/paste ai ability yet? there are many times that it would have proven useful, and will be greatly helpful if i want to implement an enemy level-up-as-you-do script for each enemy, or just try to test out the different unknown variables on different enemies without retyping... or just copying an entire ai script from one enemy to another, massively useful there ;).
 
Last edited:
how about an option to turn all statuses, targets, and elements on or off, so that you don't have to click all the damn boxes? it would make things even easier, and since it will have a resizing option, it should have more room to put stuff ^^.
Done, but in a right-click menu in the empty spaces between the statuses and elements. Best you're going to get.

you work any towards a copy/paste ai ability yet? there are many times that it would have proven useful, and will be greatly helpful if i want to implement an enemy level-up-as-you-do script for each enemy, or just try to test out the different unknown variables on different enemies without retyping... or just copying an entire ai script from one enemy to another, massively useful there ;).
I've considered it, but I'm not sure the best way to do it. Not going to happen in this version.

EDIT: Another thing I'm adding is the attack index to the disassembled script. When multiple Attacks have the same name it gets confusing otherwise.
 
Last edited:
nice, and that's ok, this version will be awesome enough as it is... i might die from happiness if it got that as well XD.

by not knowing the best way to do it, do you mean what exactly will be copied, and how the user will do it, or do you just not know how to program it in? if you just don't know how to lay it out, it could be possible to make a right click option for the whole left side (the enemy and the specific ai fields), so that if you click a certain field and copy it, the entire contents would be copied (so if you clicked the mono drive and selected copy, it would copy the entire ai of mono drive, and the specific ai types in it (keeping track of what's in main, etc.), or if you clicked on just the ai type of an enemy, it'd copy only that segment of ai. when in an ai section, you could allow the user to highlight the ai by selecting the rows (enable more than one row to be selected, possibly for mass deletion as well) and right clicking -> copy.

for pasting, right click on a field/row in a section and select paste with insert above/below, or overwrite (adding the ability to insert it above or below the row would be nice if a row was selected, or inserting above/below the current selected section's code, meaning if right clicking on main and pasting above, it'd make the first row where the code begins and push everything else down. an overwrite paste would be nice as well, completely overwriting the current code, though it wouldn't be too hard to just delete the old code later) would be pretty nice little ways of doing it. if you were to select the entire code of an enemy (enemy copy), it should only be able to be pasted onto another enemy, so that bugs wouldnt occur when trying to paste multiple sections into one ai section.

but if you just don't know how to program it to add a copy/paste feature, then i have no idea what to do XD.

yeah, i noticed that when looking at AB's two bodyblow/rear gun attacks... i had to look between the coded portion and the attack's index to tell them apart.

... it would be cool if an enemy could steal the skeleton/model of another enemy in battle, as well as it's animations, because that could have some usage with an enemy that can mimic other people (create an ffvii gogo, or metamorph enemy like in v), and "could" have some potential elsewhere, especially if the color can be changed as well, since it could be possible to give the MP enemy a grenade attack for instance by swapping the entire model and animations. i doubt it, but there is a way to change their size, so it could be possible.
 
Last edited:
I see you have renamed a lot of the monsters correct names :P  Have you done this yourself or have you been following our project

Jst wondering :P
 
what do you mean? if you are talking about in PrC then it is because it shows the current enemy names used in your scene.bin, so it would be keeping track of your project :P. not quite sure who you were talking to  :?
 
sefer etc are nor called that in the original scene bin?  Or are they?  Was to the mod maker :)  I just lwant to know how he came about choosing certain names esp Midgar Sormr as that is a vote for it in my book.  (having a little vote on certain names)

Sorry I am offtopic here, also I was curious if they were named because he had some japanese insight or if the game already contained the data
 
Last edited:
this thread is about Proud Clod, an ai and enemy move editor, not a mod (unless nfitc1 is doing one on the side...), so i think either you are in the wrong thread, or i am just very confused :P.

yay for an epic fail on the first counter ai script for air buster... but i think i can fix it (dunno why his death animation happened... but i think i can fix it easily)

ok, i have a new one for you, but sadly cannot tell yo the cause. my attempt was a fail, only partly because of my ai (little tweaking will fix it), but the entire ai script for air buster (except my counter ai), and the special combatant with it were completely wiped clean. i now have a blank ai scene but with the general counter (thankfully) in tact. i have no idea what caused this, and now i have to take the scene.bin files apart and replace the entire scene manually so that i dont have to retype the whole ai >_<.

well, it is redone now, and works (hopefully perfectly), so i am happy anyway :P.

ok, nfiitc1, how exactly do you have the disassembler lain out in regards to the way it creates the if statements, indentation and bracketing, because i was wondering if i could help tweak it more (not the actual programming help, but idea help :P), but i'd need to know how it is right now, like how exactly it follows the logic.
 
Last edited:
sefer etc are nor called that in the original scene bin?  Or are they?  Was to the editor maker :)  I just lwant to know how he came about choosing certain names esp Midgar Sormr as that is a vote for it in my book.  (having a little vote on certain names)

Sorry I am offtopic here, also I was curious if they were named because he had some japanese insight or if the game already contained the data
 
ok, nfiitc1, how exactly do you have the disassembler lain out in regards to the way it creates the if statements, indentation and bracketing, because i was wondering if i could help tweak it more (not the actual programming help, but idea help :P), but i'd need to know how it is right now, like how exactly it follows the logic.
No. Not because I don't want help, but just because I mostly don't remember. It's not like I don't have ideas on how it SHOULD work, but the scripts are so badly coded that it's impossible to get it to look much better than it does automatically. Well, I shouldn't say impossible. I just don't want to take the time to program it the way it should look.

sefer etc are nor called that in the original scene bin?  Or are they?  Was to the editor maker :)  I just lwant to know how he came about choosing certain names esp Midgar Sormr as that is a vote for it in my book.  (having a little vote on certain names)

Sorry I am offtopic here, also I was curious if they were named because he had some japanese insight or if the game already contained the data
Huh? Why'd you quote yourself? Don't do that. I don't have a clue what you're asking anyway.
 
never mind....  I figured it out.  No wonder I am not making sense when I have got the damn cold :(  That was probably most stupid thing I have ever wrote   :lol:  I better go bed and get some damn sleep....

I totally forgot that I had already altered scene bin myself and hadnt moved it like I was supposed to.  I am afraid a bad cold knocks you a bit  :-P

Sorry....
 
Last edited:
no prob nfitc1, i just wanted to know, and it's ok to not want to tackle a coding mess XD. i just finished AB's ai (still some minor tweaking), so i know what you mean by that... i chopped off so much useless crap it is unreal (not repetitive stuff that needed optimized, like eligor, just unused stuff... at least 100 bytes worth). if you ever feel like it, tell me though :P.
 
Hey NFITC1, if it's not too much to ask, could you make a copy method that copies attacks? I could imagine a button named "Copy to equal ID". The button would copy the attack through the entire Scene to attacks with equal ID. All it really should check fot is the attack ID, as there are no similar attack IDs with different effects by default. At least as far as I know. You should have a warning box popping up to confirm the action though (imo).

You could also have simple Copy-Paste methods. Then you don't have to worry about the ID, unless you paste it to an unused attack.
 
Hey NFITC1, if it's not too much to ask, could you make a copy method that copies attacks? I could imagine a button named "Copy to equal ID". The button would copy the attack through the entire Scene to attacks with equal ID. All it really should check fot is the attack ID, as there are no similar attack IDs with different effects by default. At least as far as I know. You should have a warning box popping up to confirm the action though (imo).

You could also have simple Copy-Paste methods. Then you don't have to worry about the ID, unless you paste it to an unused attack.
Those actually sound easy compared to the AI copy-paste function. I should probably even make a "Sync with KERNEL.BIN" function as well (I'm still not sure which trumps which).

I also added a search by attack index that acts like the enemy search. But it won't jump to a scene because you have to be in a scene to search for the attack. Here's an example:

Attack Bolt3 with index of 35 [0023h] found in the following scenes:

0, 2, 221, 226, 228, 230, 232, 233, 247, 249
So the Attack's name, the index in Decimal and Hexadecimal, and the scene indexes are reported to the user. There will also have to be a "find Unused indexes" function that I'll add to the top menu.
 
Last edited:
It would certainly save time. If you're up for it that is. I'm not an expert on this particular part, but as far as I know the kernel kinda contains the scenes as a look-up files. Each bank has a particular length. You prob knew this though.  :-P
 
blank attack indexes in the vanilla scene.bin include:

Code: [Select]
Code:
0100, 0101, 0102, 0165, 0166, 0167, 0168, 01B2,0244, 0250, 0265, 0266, 0267, 026C, 0286, 02D1,02D4, 02DC, 02DD, 0302, 0316, 0317, 0318, 031A,031B, 0324, 0326, 0327, 0329, 032A, 0335, 0350,037F, 0380, 0381, 0382, 0386, 03A0, 03A1, 03AD,03C1, 03C2, >03E2
I don't know how high they're allowed. I assume they could go up to FFFE if you wanted them too.
 
blank attack indexes in the vanilla scene.bin include:

Code: [Select]
Code:
0100, 0101, 0102, 0165, 0166, 0167, 0168, 01B2,0244, 0250, 0265, 0266, 0267, 026C, 0286, 02D1,02D4, 02DC, 02DD, 0302, 0316, 0317, 0318, 031A,031B, 0324, 0326, 0327, 0329, 032A, 0335, 0350,037F, 0380, 0381, 0382, 0386, 03A0, 03A1, 03AD,03C1, 03C2, >03E2
I don't know how high they're allowed. I assume they could go up to FFFE if you wanted them too.
Yeah, you prob could go as high as you want. Anyone wanna test? lol

A simple copy-paste function should only include the attack data though. The data you paste should not overwrite the ID. If you copy an attack to a blank, unused field (FFFFFFFFFFFFFFF...etc). Then the would be ID  FFFF anyway and not included in the AI. The user have to come up with the ID him/herself then assign it to the enemies and their AIs. The user must just make any similar IDs in the same scene.

The trouble with copying to all equal IDs is equal IDs can be different from each other in different scenes. An example: ID 0101h in scene 5 could be a fire-based attack physical attack, while the same ID, 0101h, in scene 6 could be a thunder-based magical attack.

EDIT: oh and there is no harm in copying the attack name of course  :-D
 
Last edited:
A simple copy-paste function should only include the attack data though. The data you paste should not overwrite the ID. If you copy an attack to a blank, unused field (FFFFFFFFFFFFFFF...etc). Then the would be ID  FFFF anyway and not included in the AI. The user have to come up with the ID him/herself then assign it to the enemies and their AIs. The user must just make any similar IDs in the same scene.

The trouble with copying to all equal IDs is equal IDs can be different from each other in different scenes. An example: ID 0101h in scene 5 could be a fire-based attack physical attack, while the same ID, 0101h, in scene 6 could be a thunder-based magical attack.

EDIT: oh and there is no harm in copying the attack name of course  :-D
An attack copy will take the attack data, name, and index along with it. There's no reason not to. This is mostly to help keep straight enemies that exist in different scenes, but you want them to function the same.

Also, I'm not syncing ALL the attack IDs to ALL the attacks. Just one that the user selects. If you don't want to use it, fine, don't. But pretty much the same deal here. If you change one enemy's attack in one scene and that enemy exists in multiple scenes, just sync it so you don't have to remember all the changes you made before.
 
i don't know if you didn't think of this, or what, but this is how i now have the absorb/null element variable, spit into flags instead of just one variable:
Code: [Select]
Code:
4130|AbsorbFire4131|AbsorbIce4132|AbsorbLightning4133|AbsorbEarth4134|AbsorbPoison4135|AbsorbGravity4136|AbsorbWater4137|AbsorbWind4138|AbsorbHoly4139|AbsorbRestorative413A|AbsorbCut413B|AbsorbHit413C|AbsorbPunch413D|AbsorbShoot413E|AbsorbShout413F|AbsorbHidden42A0|NullFire42A1|NullIce42A2|NullLightning42A3|NullEarth42A4|NullPoison42A5|NullGravity42A6|NullWater42A7|NullWind42A8|NullHoly42A9|NullRestorative42AA|NullCut42AB|NullHit42AC|NullPunch42AD|NullShoot42AE|NullShout42AF|NullHiddenaddendum (elemental check could be shorter, but elemental resistance alone would be confusing, people may think thatit sets a resistance to the element, when it just checks for one):4050|ElemResistCheckFire4051|ElemResistCheckIce4052|ElemResistCheckLightning4053|ElemResistCheckEarth4054|ElemResistCheckPoison4055|ElemResistCheckGravity4056|ElemResistCheckWater4057|ElemResistCheckWind4058|ElemResistCheckHoly4059|ElemResistCheckRestorative405A|ElemResistCheckCut405B|ElemResistCheckHit405C|ElemResistCheckPunch405D|ElemResistCheckShoot405E|ElemResistCheckShout405F|ElemResistCheckHidden
having it like this both works, and makes it easier to edit the specific values instead of figuring out what hex value would turn on a specific resistance. i am looking for a halve/weak/etc. version for this in the ai, so i will see what i can find. these should be accurate too, i tested ice and cut, and they are in the same order as usual.

ok, a question, why do you have certain unknowns in the dat file as flags, or as dwords, how did you determine that they are indeed those types, or were you just guessing?

edit: the 4050-405f flags (you have it as elemental defense?, the check sephy uses iirc) are enabled when the character has some sort of elemental resistance (at least null, i will test others as well to see).

going to check the 4050-405f more real quick ok, as i thought, it works for absorption as well, after (if) i find ones for the other element types i will recheck the way the flags are set in regards to the resist check.

now, with sephy's checking for the earth element, the 96 should check to see if the value given is active in the mask given (in his case it checks against 08, the hex value for earth, though it should work the same i you put:
02   20a0 (or whichever)
00   4053 (earth resist check)
80
60   01
96

and this should push a true value onto the stack if the target is resistant to earth. i am saying this because your editor doesn't show anything in the disassembler about the 96's popped value in the next if statement. i will check in-game to see if my little method works to check resistance (but for ice, since i dont feel like editing the kernel constantly, and i already have steal :P), and get back with the results. if this works then 96 could be an opcode that could have some nice functionality, since checking for resistances would be great for enemies to have when attacking.
 
Last edited:
i don't know if you didn't think of this, or what, but this is how i now have the absorb/null element variable, spit into flags instead of just one variable:
Code: [Select]
Code:
4130|AbsorbFire4131|AbsorbIce4132|AbsorbLightning4133|AbsorbEarth4134|AbsorbPoison4135|AbsorbGravity4136|AbsorbWater4137|AbsorbWind4138|AbsorbHoly4139|AbsorbRestorative413A|AbsorbCut413B|AbsorbHit413C|AbsorbPunch413D|AbsorbShoot413E|AbsorbShout413F|AbsorbHidden42A0|NullFire42A1|NullIce42A2|NullLightning42A3|NullEarth42A4|NullPoison42A5|NullGravity42A6|NullWater42A7|NullWind42A8|NullHoly42A9|NullRestorative42AA|NullCut42AB|NullHit42AC|NullPunch42AD|NullShoot42AE|NullShout42AF|NullHiddenaddendum (elemental check could be shorter, but elemental resistance alone would be confusing, people may think thatit sets a resistance to the element, when it just checks for one):4050|ElemResistCheckFire4051|ElemResistCheckIce4052|ElemResistCheckLightning4053|ElemResistCheckEarth4054|ElemResistCheckPoison4055|ElemResistCheckGravity4056|ElemResistCheckWater4057|ElemResistCheckWind4058|ElemResistCheckHoly4059|ElemResistCheckRestorative405A|ElemResistCheckCut405B|ElemResistCheckHit405C|ElemResistCheckPunch405D|ElemResistCheckShoot405E|ElemResistCheckShout405F|ElemResistCheckHidden
having it like this both works, and makes it easier to edit the specific values instead of figuring out what hex value would turn on a specific resistance. i am looking for a halve/weak/etc. version for this in the ai, so i will see what i can find. these should be accurate too, i tested ice and cut, and they are in the same order as usual.

ok, a question, why do you have certain unknowns in the dat file as flags, or as dwords, how did you determine that they are indeed those types, or were you just guessing?

edit: the 4050-405f flags (you have it as elemental defense?, the check sephy uses iirc) are enabled when the character has some sort of elemental resistance (at least null, i will test others as well to see).

going to check the 4050-405f more real quick
Most of the sizes are guesses or just placeholders for later testing. Your first two groups are correct, but it seems that the third is incorrect. At least, according to Akari, 4058 is mostly untouched until the command 96 comes along and sets it based on the element it is given. Here's a snippet from the updated help file (not yet uploaded).

Code: [Select]
Code:
0006: 02 20A0 PSHA (20A0) Type (02)0009: 60 08 PUSH (08) Type (01)000B: 96  EDEF000C: 12 2070 PUSH (2070) Type (12)000F: 02 2070 PSHA (2070) Type (02)0012: 01 4058 PSHA (4058) Type (01)0015: 80  MASK0016: 60 05 PUSH (05) Type (01)0018: 42  GEQU0019: 90  STRA
What it is doing is going through all the targets in the second pop and checking the elemental modifiers of the element reference in the first pop. In this case, this is element 08h which is Earth (because the third bit is active). Then for every target in the mask that has a modifier OTHER than three (which is normal damage) it puts that target into the script owner's target address (2070h). Then it stores whatever modifier it finds for that element in that targets' resistance data (4058h).
That explains the next part of the script. It checks all the targets in the target mask and sees if their greatest elemental modifier is greater than or equal to 5. So it detected a monster that either nullifies or heals from earth elemental damage. It then puts this information back into the target address (2070h) for further use.
Resist is technically anything with a modifier of greater than 3. This is halve, nullify, absorb, full-heal. So if there's flags for one of those modifiers, there's probably flags for all of them. That is to say, there isn't flags for any of them.
 
Status
Not open for further replies.
Back
Top