Show Posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.

Messages - JeMaCheHi

Pages: 1 [2] 3 4 5 6 7 ... 9
General Discussion / Re: FFVII on IOS Appstore
« on: 2015-08-20 00:21:59 »
Holy shit.... They will never get tired of that crappy re-re-re-re-re-re-re-re-releases man... It makes me sick  >:(

Try to replace second witch with any other enemy. It appears invisible (casting potion will show them), and replicated by THREE. Works with any enemy. How the game know to replicate enemy by 3? What's hidden in this FF8!?

I monitored variables on sorceress battle. Here's what I got:

This opcode:
Code: [Select]
FF8_EN.exe+8870B - mov [eax],edx

Memory: FF8_EN.exe+1928DA4 [01D28DA4]  (Holds kill count of sorceress)
Memory: 01D28D98 (Holds whole count of sorceress, ex actual sorceress count, ex if you kill one, this raises, when second gets on stage, this count raises)

@UPDATE: Yes. Just tested. The game checks if 01D28D98 is 12, if yes, then next summon is witch_worm. Either the game gets in infinite loop if you either freeze 01D28D98 or NOP (90h) the FF8_EN.exe+1928DA4

Battle stages are divided to three segments:

1. Ground
2. Background
3. Sky sphere

The game takes one segments and deforms it. That's why only the objects deforms and not ground or sky. On final worm_witch, the engine loads shaking camera animation and moves segment 3 on X axis. Thanks to memory hack I forced game to fight with normal witch on final stage. I froze witch count to 1 and kept killing them. This way, the segment 3 was moving on all stages which was kinda funny. I recorder video. I'll upload this and update this post. :D

Wow Maki, you're a god of hacking man. The most strange thing (and the one that I'm most curious) is the fact that the scene is constantly changing (probably some pointer to several .x files will do the trick) and the deformation.
I tried replacing the 2nd witch as you said, but doesn't get replaced 3 times as you said but just once. Here's what I have on my notes about death code for 1st witch (it's executed when the witch is killed) on its AI script:

Code: [Select]
02 63 C8 05 09 00 07 00 [ // if ($63>=9)
   08                  // unknown OPCODE but almost sure it's a 1byte OPCODE
   33                  // the same as above
   1F 04               // LOAD enemy in slot 04, in that case wormlike witch.
   23 5D 00
   02 62 C8 00 01 00 4E 00 [          //if ($62==1)
      0F 62 00                   //$62 = 0
      13 63 01                   //13 seem to be add operator so -> $13 = $13 + 1
      02 DD C8 00 03 00 1A 00 [      //if $DD == 3
         02 60 C8 05 06 00 09 00 [      //if $60 >= 6 ($60 is where the game stores how many times you killed 1st witch(pink/purple one))
            0F 61 04                // $61 = 4
            33                      //
            1F 01                   // LOAD enemy on slot 1, the (red/yellow) 2nd witch in that case
            23 06 00
         ]{                        //ELSE
            0F 61 06                // $61 = 6
            33                      //
            1F 03                   //LOAD enemy on slot 3, in an unmodified scene.out, the 1st witch.
         23 22 00
      ]{                        //ELSE
         02 DD C8 00 06 00 1A 00 [      //if ($DD = 6)
            02 60 C8 05 06 00 09 00 [      //if ($60>=6)
               0F 61 05                   // $61 = 5
               1F 02                      //load the second witch from slot 02
               23 06 00   
            ]{                        //ELSE
               0F 61 03                   //$61 = 3
               1F 00                      //LOAD 1st witch from slot 00
            23 00 00
      23 07 00
   0F 62 01                            //$62 = 01
   13 63 01                            //$63+1
00 00 00 00

The game stores the 1st witch kill count on variable $60. Still doesn't know what is stored on $63 or why is checked if its mayor/equal than 9, maybe if I extract and analyze the 2nd witch code we'll know it, but all this is old stuff I had on my pc. I'll do it this night or tomorrow. $DD seem to store an identifier to know if the witch is the one from slot 0 or the one from slot 3, but not sure at 100%. I also have the turn code on a txt, but didn't paste it here since it hasn't much to do with the summoning control. Just ask for it and I'll paste it too.

Just extracted and formated the script for 2nd witch entrance and death. Also corrected some stuff on the 1st sorceress code. I located $60 on memory (FF8_ES.exe+192A1E0). That's what we have:
Code: [Select]
//Init code

13 60 01                // $60+1
02 62 C8 00 00 00 06 00[   // if ($62 == 0)
   0F 62 01                // $62 = 01
   23 03 00
]{                     // ELSE
   0F 62 02                // $62 = 02
04 C8 0C 01             // ability 010C on self (it's the entrance animation, no more, no less)
02 60 C8 00 07 00 06 00 [   // if ($60 == 7)
   0E DC 07                //DC = 7   
   23 00 00
02 60 C8 00 08 00 06 00 [   // if ($60 ==
   0E DC 08                // $DC = 8
   23 00 00
02 60 C8 00 09 00 06 00 [   // if ($60 == 9)
   0E DC 09                // $DC = 9
   23 00 00
02 60 C8 00 0A 00 06 00 [   // if ($60 == 0xA)
   0E DC 0A                // $DC = 0xA
   23 00 00
02 61 C8 00 04 00 09 00 [   // if ($61 == 4)
   0F 61 00                // $61 = 0
   0E DD 04                // $DD = 4
   23 06 00
]{                     //ELSE
   0F 61 00                // $61 = 0
   0E DD 05
00 00 00 00 00

//Death Code

02 63 C8 05 09 00 07 00 [   // if ($63 >= 9)
   1F 04                   //LOAD enemy 4 (wormlike sorceress)
   23 3D 00
02 62 C8 00 01 00 2E 00 [   // if ($62 == 1)
   0F 62 00                // $62 = 0
   13 63 01                // $63 + 1
   02 DD C8 00 04 00 0A 00 [   // if (DD == 4)
      0F 61 05                // $61 = 5
      1F 02                   // LOAD slot 2 (2nd witch)
      23 12 00
      02 DD C8 00 05 00 0A 00 [//ELSE
         0F 61 04             // $61 = 4
         1F 01                // LOAD slot 1 (2nd witch too)
         23 00 00
   23 07 00
]{                     //ELSE ($62 != 1)
   0F 62 01                // $62 = 1
   13 63 01                // $63 + 1
00 00 00 00

The most important fact here is the ability they do when they become active (number 01) corresponding to ability 0x13F. I bet that it's the ability itself the one which deforms and changes the scenario. I also made a liitle experiment. I located $60 in memory (FF8_ES.exe+192A1E0) and edited it (when it was 5 I set it on 3) and so, I fought 2 extra pink sorceress. That way, I reached the worm sorceress scenario before fighting herself(still had to kill 2 extra red witches). The ground didn't shake as usual. When the next sorceress came in, the scenario changed again. I eventually fought the worm on Esthar area, and now the ground did shake, so we can assume that all effects are triggered with enemy abilities. Actually, the same happens with Ultimecia when she summons Griever, all the summoning and scenario change stuff are triggered by an ability (you can see it putting her in any encounter and killing her)

Sorceress battles are my the most unknown. There are like ~12 enemies. This makes no sense to scene.out, also the stages are changing. I'm confused.

I was also very confused and intrigued about that battle. It's probably late to say that since you and kaspar found out that it's hardcoded on EXE (I take my hat off), but there's no 12 monsters, just 5. There's 2 of the first sorceres, 2 of the second one, and 1 of the wormlike. I spent some time digging on their AI scripts, and concluded that they was reviving all the time the same monsters. As far as I remember, they has a counter with a shared variable. It increments when a sorceress is killed (better said, when a sorceress is killed it will be revived and reloaded, and it's init code will be runned). If it's minor than 6, the game revives a 1st sorceress. If it's equal than 6, then it loads a 2nd sorceress. And the same is applied for the 2nd one.

Here's what I had on my notes about the first sorceress AI's Init code:

Code: [Select]
//Init Code:
02 60 C8 03 00 00 78 00 [ // if $60 != 0
13 60 01 // $60++
02 62 C8 00 00 00 06 00 [ // if $62 == 0
0F 62 01 // $62 = 1
23 03 00
{ // else
0F 62 02 // $62 = 2
04 C8 0C 01 // ability 0c01 on self (entrance animation)
02 60 C8 00 02 00 06 00 [ // if $60 == 2
0E DC 02 // DC = 2
23 00 00
02 60 C8 00 03 00 06 00 [   // if $60 == 3
0E DC 03 // set DC = 3
23 00 00
02 60 C8 00 04 00 06 00 [
0E DC 04
23 00 00
02 60 C8 00 05 00 06 00 [
0E DC 05
23 00 00
02 60 C8 00 06 00 06 00 [
0E DC 06
23 00 00
02 61 C8 00 03 00 09 00 [ // if $61 == 3
0F 61 00 // $61 = 0
0E DD 03 // $DD = 3
23 06 00
0F 61 00 // $61 = 0
0E DD 06 // $DD = 6
23 13 00
13 60 01 // $60 + 1
0F 62 01 // $62 = 1
0F 63 00 // $63 = 0
0E DC 01 // DC = 1 -> DC is the number of witch
0E DD 03 // DD = 3
04 C8 0C 00 // ability 00: appear fading in.
00 00 00 00 00

For Omega Weapon, it depends on what version of the game you have. On the Playstation version he's always at Level 100, but on the PC version he averages with your party just like most monsters.

Oh man... epic fail then hahaha. This happens when you assume things u.u
Anyway... are you sure he scales with your party level? In that case he should have a value "200", for a max level of 100, scaling with party members. Anyway, if you're really interested in this, you should refer to the research thread and post there your findings, that way, every discussion about battle structure will be recorded there :) (

It seems to me that this is the max level, rather than a fixed level, or is it? Because all storyline bosses have a value that is exactly 100 above their max level, e.g. Norg and his pots have a max level of 27, and in Cactilio the value is 127.

Edit: No wait, it is actually both! After taking a closer look at it, I've noticed the following: values from 1-100 are fixed levels, just like the wiki says, but values above 100 seem to be the max levels (that's what the wiki doesn't know yet). Interestingly, not all enemies in the Fire Cavern have level 5, like so many sources say. The Red Bats have a fixed level of 4.

Edit2: I think I'm beginning to understand the higher values of the level byte as well.

Values above 200 seem to be those special level conditions that I mentioned before, because all monsters in the lower depths of the Deep Sea Research Center have a value of 215. (However, those in the upper half have a value of 210. Does that mean that their levels always get +10 added? I don't think I've ever noticed that in game, and all sources I find on the web only ever talk about the +15 levels.)

All monsters in Ultimecia's Castle have a value of 252, so this must be the random level from 1-100. Alright, great, then I think we've covered pretty much anything about enemy levels, right?

Yes, as you pointed, values from 1 to 100 are the fixed ones (that's for sure) and from 101 to 200 seem to be the max levels, but didn't had time to test it enough so I can assure it 100%. From 201 to 255 seem to be the (grouplevel)+(certain value) as you said, (this is used mostly on deep sea center) but there certain values that I tested that doesn't fit this. For example, the Tear's Point enemies have a level of 255, and they seem to have random levels. Also, Omega Weapon has a level of 254, but as far as I know, he always have a level 100... There's a lot of confusion here, so I didn't dare to write a "correct" version on wiki yet. Also, I'm short of free time this days...

I have finally looked at your source and have some notes to share with you...
thats about all i have for now.  sorry for the wall of text hopefully it helps you .

Oh my.... holy crap. Never expected such amount of feedback... And I LOVE walls of text if they are sooo helpful as yours! I'll use your advice to enhance the app. To be honest, I rushed the release so everyone could experiment with this as soon as possible. From now on, I can calmly polish it. Let's see...

General: Actually, I forgot to remove it from github sync files, because I made the repo in a rush xD. If you had not point this out, it would probably have remained here forever.

Pro file: I think I need a deep study on this, I didn't even read documentation about it

Gui: Wow, lots of tips here... I love it. I took good note of everything. Layers everywhere. Also copied your .ui file, but I think I can tweak it a little more so stuff remains more centered. Anyway, as I told you before, I made it in a rush. I don't even like to use the form. I'll end up fully remaking the GUI just using code. The forms seem to me like... losing control of what your program does.  About that "HiDPi" screens... I didn't even know about their existence... Anyway, I'll redo the code for the about dialog and push a commit. If I understood everything, you'll be able to see it correctly and even to resize it without trouble.

Translation: Another good point, and I really appreciate your interest here. I always was curious about how myst6re did translate Deling. However... don't think a translation is needed here. I mean, this is a very simple app...

Look and Feel: There's no much to say here... I used a couple of icons because I wanted to experiment with them but they was not really needeed... Anyway that QIcon::fromTheme() method seem to be really powerful, and will be useful in future projects, indeed.

As you can see, I still have much to do with Qt, but now that I have a base project to start with, I just have to start tweaking and enhancing stuff. Thanks thanks thanks :D
Keep looking at github

Maybe it's Odin related? Like this fight can or cannot be zantetsuken'ed.

Then it should be a global parameter, not a per-enemy parameter... Also, zantetsuken inmunity should be coded in each .dat file... In fact, it's a good point, there's still some unknown fields on .dat files, maybe zantetsuken inmunity is one of those unknowns....

I've been playing around with the unknowns, but doesn't seem to have anything to do with camera stuff. Even if you nullify, or set to the default (the same value use for dummies), the enemies will still have all the same animations. I'm running out of ideas with unknowns so I'll start diggin deeper on the level byte until I have new ones...

Thanks for your support guys :)
@sithlord48: I'm still trying to figure out how to set a repo on github, when I'm done with it, I'll post the link. Anyway... I'm afraid that there's no much to see on the source :(
EDIT: Done :D

Cactilio (the Spanish name for Cactuar) is a little program to edit the battles structure on FF8. It's the first time I code a GUI program so... be comprehensive ah?  ;D Also, any advice/constructive criticism will be appreciated.

  How to use it:

  • Extract the scene.out file from battle.fs. I recommend using myst6re's Deling:
  • Open Cactilio, go to File->Open and select your scene.out file.
  • Select an encounter number and hit the "Load" button. You won't be able to modify anything until you load an encounter. When you want to switch to another encounter, you'll have to select it and hit the Load button again.
  • If you want to modify an enemy parameter, you have to select its index on the left part of the application. Once you've done it you can start modifying that enemy's stuff.
  • When you're done with your changes, just go to File->Save and save your file, but DON'T JUST OVERWRITE THE OLD ONE, sometimes you can mess up things when editing the scene.out file and if you overwrite the previous one... well, you know what will happen : /

  • Implement the ability to edit the battle.fs file directly
  • Continue researching the scene.out unknowns
  • Improve the stages name list
  • Improve the GUI
  • Probably more stuff I'm leaving on the way...
If you don't understand something about how scene.out works, you should take a look at this links:
Thanks to kaspar01, who made a list of stage name which was very useful:
Thanks also to myst6re, whose src from Deling was very useful when I felt lostwith Qt.

  Improved GUI
  Fixed enemy coordinates. Now you can set them from -32768 to 32767, a more logical range.
  Fixed some stage names (to be honest, don't even remember which ones...)
  Initial release

Download Cactilio v0.2
Github page here

If they are not in scene.out then they may be in r0win.dat file. I'm really surprised if for some reason they are in battlefields, because that's just really bad optimizing especially for a game of this scale. Well I'm more than willing to help with these kind of things.

Thanks Halfer :) I've always been suspicious about r0win.dat file, scene.out feels pretty incomplete. There's a lot of stuff you can't do just by editing the .out file. For now, I'm finishing that tool so everyone can test everything comfortably :D. When I end with it, I'll try to see if some of the unknowns corresponds to enemy animations or something...

Well to answer the connection between scene.out and .x battlefields in game development aspect, if the scene.out file contains camera animations they are probably the winning animations for each character. It is waste of space to include the winning animations to each battlefield so they are in one file and it's in scene.out if there are no other files containing camera animations. This applies off course for every animations that are "global".

No, I'm pretty sure that the scene.out doesn't contain any camera animations, but pointers or indexes to those animations, which has to be in other files. The two cameras I added today on the first post are relative to the entrance animation, and are dependant on the battle stage. That's why I supposed the actual camera animation is on the .x file. About character winning animations... I don't think they're on the scene.out. I mean, there's still 4 unknown sections, but they seem to be strongly related to each enemy... Maybe some of those sections are camera animations too... I'll think about it, thanks a lot Halfer.

Thanks Maki, I'll ask Covarr for an account then.
By the way, I've been looking at your research on .x files, and I think the cameras in battle formations has much to do with .x files. Maybe you can find some useful info by combining .out and .x files...

Don't know if this is necrobumping but, since I rebooted my research on this, there's no much activity on scripting and reverse engineering board, and I'm developing a little tool on Qt.... I think is fine to rebump this thread. I'll have a little spare time now, so I'll post my new findings.

BTW, anyone here could explain me how to edit the wiki entry? The current scene.out entry is a little deprecated and I'd like to update it.

I have no problem with this. Didn't want to gloss over anything like I did last time. And if textures that didn't work before are starting to work now, then that's a good sign. It just motivates me more to continue collecting codes/bitmaps for this. :D

Yeah, it's a good sign indeed :D. Don't forget to keep all the debug textures and sending them to Mavirick or me!

Good work. Glad to see things are progressing.

Now... As for 2.02. It seems I've ran into this problem. Surprisingly, this happened in the 2.0 version as well.

It doesn't appear to happen in the 2.01 version, though.

That's a classic collision FatedCourage. If you say it worked on 2.01 and it doesn't on 2.02, there's no other explanation. All I changed on 2.02 was the naming for the debug folder and made an enumerated type for the type of mached hash. Nothing to do with that. Also, I've found out that some collisions will happen 100% of the time, and some others are more probabilistic since they depends on where are they placed on memory. Anyway, you all will have to wait until we finish the new hashing to see most collisions solved :)

2.02 is out people. We fixed the debug folders issue (it seems we remove a code line by accident hehe  ::) ) and we've enhanced the comparisons in some algorithms.

Peace :)

2.0.1. is still glitchy and crashes with the Steam overlay. Works fine without it.

The Steam Overlay is kind of important to me since I need it in order to broadcast the game.

Sorry about that Devina, but for now Steam Overlay is not a priority. Tonberry has never worked with it, and won't do for now since we're focused on more critical features like smoothness, eliminating collisions and remake the hashing algorithm. However, thanks for pointing it out, I'll put it on the "known issues" section so everyone know it before downloading.

To everyone else, we still want your comments, opinions and questions! :)

Tonberry 2.01 release. We fixed the broken cache (and we deleted the 2.0 link, we told you guys not to download it but you still did it ¬¬).

Now everything should work fine. Don't forget to take a look at prefs.txt :)

Sorry for any inconvenience people, we missed a little fact which had a big impact on the final software ^^
Mav will work on it and I'll join him probably on the weekend, you'd better use 1.61 in the meantime. Thanks for your feedback as always, we wouldn't have detected the bug without it ;)


the 1.61 was very cool and the 2.0 looks like very promising, anyway it seems like there some issue i just replace dll from 1.61 to 2.0 and now world texture map is no more apply on HD, and some precalc scene is not here too.

;) hope i can help on anything
I've been using Tonberry 2.0. It seems that now my character textures seem to blink in and out(new to old). I've debuged and the codes are the same that I have and I've messed with the prefs.txt to see if it would help, but doesn't. Not exactly sure what is causing this. It also kind of messes with SeeD Reborn on my end as well. But things are considerably faster, though.

Thank you guys for your feedback. As commented on the main post, there will be some issues with SeeD Reborn HD textures and some other ones. This is an inherent problem to Omzy's algorithm and we're working on a quick workaround until we fully get the new hashing. The main problem is that Omzy used the texturenames for caching and all, but we changed it and now we index our cache elements by their hashcode, which is way faster. This obviously gives us some problems (I fixed some of them, like most SeeD Reborn collisions, though not all of 'em)

This is why we don't deleted the previous versions: If you're having so much glitches that the game became unplayable, just switch to 1.61. But, if you're a modder and want to start working on animations, you'll appreciate this speedup.

 I'm thinking about designing a log system so yo guys can send me logs and we can figure out what exactly is crashing here... As Mav said, now I'm gettin busier and will have to work on this with less intensity :)

From here, when you have a crash with some texture (flashing, not appearing, being replaced with an incorrect one...) please try to post which texture is giving you the problem, and the cache_size you're using.

Just checked out the new Spanish release for Tripod and... I wanted to share it with you. Now the text cards are in high resolution, which is amazing... I wanted to share some pics with you guys:

Nice work Mcindus, you are the guy :D


Hellfire Pack (80% complete) - but until animations work, I probably won't release a pack.

I know I know bro, animations and collisions are our biggest obstacle now. The good new is that Tonberry is now a two man project. Mavirick has joined and he is working hard on a bunch of hashing improvements, while I'm working on a better texture caching method. Just sit and wait ;)

Wow, this is cool Mcindus, thanks for your work.

We'll soon have a fully upscaled FF8 so... better to improve Tonberry ASAP xD

after installing 1.61 tonberry affect the image quality on the world map =(((
What trouble are you exactly having?

Pages: 1 [2] 3 4 5 6 7 ... 9