[FF7] Enemies editor - Hojo (1.0)

  • Thread starter Thread starter Squall78
  • Start date Start date
Status
Not open for further replies.
Are there something concerning the scene.bin you don't understand. Like attacks, battle setup etc. I might be able to help you if you don't. By the looks of it you seem to have plenty knowledge.
 
Even just being able to automatically insert the AI script, even if we still have to write it ourself, would be nice.

Just so we can edit that (and attack data) without having to mess around with a hex editor.

(Exactly what I mean is, even if we still have to write the code, but the program inserts it in the right place and puts in the pointers and stuff)
 
Last edited:
I wrote a (BASIC-like language) to FF7-AI code compiler, but it is quite primitive so far.
 
Ergh, would you believe it...

I was having some problems with the drive I have most of my code on a while ago, but now they seem to have cleared up. However, the one source file that deals with my BASIC implementation (ai_basic.py) has been corrupted beyond repair. Isn't that typical? However, I can release my old compiled version of 'ff7mod', a command-line util for changing most kernel and battle parameters. Yes, it includes the FF7AI-BASIC compiler.

Read the readmes, and ask me any questions. If it's deemed useable by people other than me, I'll make a new topic about it. And if I can be bothered, I'll try and rewrite my ai_basic.py script. :)
 
Hm, I might be able to make something if anyone can give me a detailed and simple to understand explanation of how the AI scripting works...

I don't quite understand your script language, either, sorry...
 
The 'script language' is just Python, that's why it's saved in .py files

The AIBASIC-FF7 language is pretty much fully documented in the txt files, I don't know what help I could give you with that.
 
I don't really understand it even through that.
Perhaps a few example scripts, explained well through comments, would help... I often find this easier to learn off...

(The provided scripts don't exactly explain what they do and why)
 
Here are some AI examples I've jotted down while creating enemies. Some is Norwegian but you should be able understand.

Code: [Select]
Code:
FORVOKSE FIENDER12 60 2011 [98 40]8002 60 2001 [98 40]8060 0A3090   :::::Adresser:::::ATTACK (str)4068hMATTACK4070hDEF4100hHP4160h Current - 4180h MaxPhysical Immunity4028hMagical Immunity4029hMDEF4110hEXP4020hTarget able4023h (01h = on, 00 = off)hAI Main4024h (01h = on, 00h = off)STATUS4000h = death (60h 01h = true)DEX40A0hLast attacker Mag40F0hLast att General40D0hMP4041h   ::::Skripter::::::::80 = (AND):::RANDOM NUMBER (if XX MOD random nr 0-65535 == 0 GOTO ZZ ZZ)::::81(random)| 60(byte 61 = WORD 62 = DWORD), XX| 34(MOD)| 52(NOT)| 70 ZZ ZZ| END END ENDChecks if Current Hp is under MAX HP/XX*YY. (if not GOTO ZZ ZZ)::::02, 60 20| 03, 60 41| 80(AND)| 02, 60 20| 03, 80 41| 80| 60, XX| 33 (div)| 60, YY| 32 (mul)| 43(<=)| 70, ZZ ZZ|END END ENDChecks if Current Mp is enough to cast ID. (if not GOTO ZZ ZZ)::::02, 60 20| 02, 40 41| 80| 60, ID (or 61 ID ID)| 86 (get mp cost of ID)| 42(>=)| 70, ZZ ZZ|Execute ID on target::::12, 70 20| 02, A0 20(20A0 = opponents)| 60, 20| 60, ID (or 61, ID ID)| 92(Run ID)| (often after an ID is executed it jumps to the end of the AI: |72, ZZ ZZ|)Set target (1 or all) and execute ID and::::12, 70 20| 02, A0 20| 82 (only if 1 target, if all; skip this)| 90| 60, 20| 60, ID (or 61, ID ID)| 92|NOTE: Switching between 1 and all targets only works if Target byte in attack data is 0x0F. Default works as 1.END END END (counter) Attack the target's last attacker::::02, 60 20| 02, D0 40| 80| 90| 60, 20| 60, ID (or 61, ID ID)| 92|-> set Row 12, 60 20| 10, 28 40| 80| 90| END END ENDSets counter (Not as in counter attack) to address YY YY and counter = random(0.. (X - 1))::::11(push value), YY YY| 81(random)| 60, XX| 34(MOD)| 90|END END ENDIf counter (Not as in counter attack) from address YY YY isn't XX (XX) GOTO ZZ ZZ::::01(load address), YY YY| 60, XX (or 61, XX XX)| 71 ZZ ZZ|  END END ENDChecks if target got status 40 XX (where 00 is death etc) If not GOTO ZZ ZZ:::02, 70 20 (if check is on self: 60 20)| 00, XX 40| 80| 60, 01 (00 if the check for which status it doesn't have)| 40(==)| 70 ZZ ZZ|  END END ENDChecks if address XX XX is "checked/used". If not GOTO ZZ ZZ00, XX XX| 52| 70, ZZ ZZ|END END ENDSelf = 0000 Cloud = 002012,00 00| 02, 60 20| 90| 12, 20 00| 02, 50 20| 01, 60 40| 80| 60, 10| 40| 90|END END ENDSet Cloud as self use attack (0020 = CLoud (se '2050' over) 0000 = target)12, 60 20| 02, 20 00| 90| 12, 70 20| 02, 00 00| 90| 60, 01| 60, 00| 92|END END ENDself immune to Phys (4029h Mag)12, 60 20| 10, 28 40| 80| 60, 01| 90| END END ENDTarget = 1 random opponentIf (Target Current HP == Target Max HP){ if(1/2)  PrintMessage("Estuans interius ira vehementi"); else  PrintMessage("Sors immanis Et inanis"); Target Current HP = 0;}Else{ PrintMessage("Veni, veni, venias, Ne me mori facias");  Target Current HP = Target Max HP;} 12, 00 00| 02, A0 20| 82| 90|If: 02, 00 00| 03, 60 41| 80| 02, 00 00| 03, 80 41| 80| 40(==)| 70, YY YY(GOTO ElseY)|If: 81| 60, 02| 34| 52| 70, XX XX(GOTO ElseYX)| 93 (Estuans interius ira vehementi) FF| 72, AA AA|ElseX: 93 (Sors immanis Et inanis) FF|AA AA: 12, 00 00| 13, 60 41| 80| 60, 00| 90| 72, ZZ ZZ(GOTO End)|ElseY:  93 (Veni, veni, venias, Ne me mori facias) FF| 02, 00 00| 13 ,60 41| 80| 02, 00 00| 03, 80 41| 80| 90|End: 73|END END END END END END END END END END END END END END ENDIf(1/4) Use Beak;Else if (1/8) Use Hell Charm;Else if(1/16) Use HC all;Else PrintMessage("Qwim's taking a break...");81| 60, 04| 34| 52| 70, XX XX|12, 70 20| 02, A0 20| 82| 90| 60, 20| 61, 01 01| 92| 72, ZZ ZZ|81| 60, 08| 34| 52| 70, XX XX|12, 70 20| 02, A0 20| 82| 90| 60, 20| 61, 02 01| 92| 72, ZZ ZZ|81| 60, 0F| 34| 52| 70, XX XX|12, 70 20| 02, A0 20| 90| 60, 20| 61, 02 01| 92| 72, ZZ ZZ|93 (Qwim's taking a break...) FF| 73|END END END END END END END END END END END END END END END ENDSETUP:::::::::::::::::Selve's 4278 = 150;Count = 0;END:::::::::::::::::::MAIN:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::If(Self MP <= 1/4 AND Count < 3){ Use Hyper Ether on Self; Count += 1;}Else If(Any ally have Reflect, Slow or Stop AND 1/4) Use DeSpell on target(s);Else If(Any opponent have either Shield, Regen, Barrier, Mbarrier or Haste AND 1/3) Use DeSpell on Target(s)Else If(Any ally have either Darkness, Mini, Confuse, Silence, Berserk, Paralyzed, Petrify or Slow-Numb AND 1/2) Use Esuna on target(s);Else If(Any ally have Poison Status AND 1/2) Use Poisona on target(s);Else If(1/2){ If(Self doesn't have Barrier, Mbarrier, Shield or Resist and 1/3) {  if(1/2)  {   Use Wall on self;   Use Resist on self;  }     Else  {   Use Shield on Self;   Use Resist on self;  } } Else If(Self doesn't have Shield, Haste or Resist and 1/2) {  Use Haste on self;  Use Resist on self; } Else If(Self doesn't have Shield, Regen or Resist) {  Use Regen on self;  Use Resist on self; } Else {  If(1/2)   Use Phy1 on random opponent;  Else   use Phy2 on random opponent; } }Else If(Selve's HP <= 1/4 AND 1/2) Use Fullcure on Self;Else Use Ultima on all opponents;END::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::END END END END END END END END END END END END END END END ENDIF self = self A, else GOTO XX XX and keep var X(the 1st in stack)02, 60 20| 01, 60 40| 80| 60, 00 (00 = A, 01 = B etch)| 71, XX XXEND END ENDIf self != SHIELD cont Barrier == GOTO ATTACKIf self != Barrier & MBarrier cont HASTE == GOTO ATTACKIf self != HASTE cont Regen == GOTO ATTACKIf self != Regen cont Resist == GOTO ATTACKIf self != Resist GOTO rand Buffer == GOTO ATTACKIf(1/4) Shield END != Next etc...
 
Last edited:
Just wondering if anyone has encountered bugs. For a scene editor, this program seems pretty good (seems better than sceneeditor and scenester so far).

Edit: How come Hojo doesn't let you edit the formations? Maybe I'm missing something. Could someone tell me how to edit enemy formations by using hojo?
 
Last edited:
Hi auxili160

Currently, it's not possible to edit enemies' formations. I've planned to add this feature in a future version of Hojo.

Thanks for using Hojo :)
 
No problem. :P

Also, any plans of adding a copy+paste feature (like scenester)? This would let us copy an enemy from one battle set to another.
For example, instead of modifying the four kalm fang enemies that you encounter in the midgar area, you can simply edit one of them and copy+paste the enemy stats into the other kalm fangs in the area.
 
Last edited:
Oooo, I just realized that this is the only editor so far that lets you edit enemy status effect immunities. I don't think Scenester has this, and SceneEdit is (sorry) useless due to the potion bug so I haven't bothered trying it any more.

All this needs is a copy+paste and formation editor and I'll cream somebody's pants (likely my own).
 
Would this editor be able to make the final 3 bosses (Jenova, Bizzaro Seph, and Seraph/Safer Sephiroth) more threatening with better HPs and stuff. Fact is by the time ure done with FFVII 1-2x Omnislash just finish off Safer Sephiroth which is embarassing.
 
This might have been answered

I see that "leg" is a component of emerald weapon?

Can we deduce that this was going to be an additional feature of Emerald Weapon along with his eyes?

and can anyone confirm that safer sephiroth was a translation error?
 
Last edited:
The "leg" part from Emerald Weapon is here only for battle script purposes.
And for the "Safer Sephiroth" mistranslation I am unsure, but, Bizarro
was meant to be Rebirth (it could be Reverse too, but this has no sense).
 
I've heard that "Safer Sephiroth" was meant to be "Seraph Sephiroth", although these people think that it was meant to be "Sepher". It certainly wouldn't be the only mistransliteration in the game: there is "Helletic (Heretic) Hojo" and "Midgar Zolom" (Midgardsorm(r)) as well.
 
Last edited:
Yes,  I feel pretty damn sure now that it is sepher.  Sepher means book and sephiroth numbers.  A book from the bible.  Not just that the sound is similar "sepher" and "safer"  <obvious romanising issue.

What is annoying though is that sepher sephiroth's appearence is modelled after a seraph lmao.

I will certainly be renaming all these mistakes using your great program for my walkthrough.
 
Last edited:
What is annoying though is that sepher sephiroth's appearence is modelled after a seraph lmao.
I'm glad they didn't try to call him something like "Seraph Sepher Sephiroth". Wow! Talk about a tongue-twister. Although I'm of the camp that things it should have been "Savior Sephiroth".

Squall78: I can work with you in integrating an attack editor into Hojo. My work with Wall Market has been quite fruitful and I did make a basic enemy attack viewer for the purpose of figuring out more damage formulas and special effects.
 
Status
Not open for further replies.
Back
Top