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 - gaaasstly

Pages: [1] 2
1
Gameplay Releases / [FF8] Training Center
« on: 2017-09-20 23:10:03 »
Steam BuildID: 296320 (FF8_EN.exe)
I put the absolute minimum effort into this program because I was not sure if something like it already existed. If it garners enough support, I may continue the project.

What is Training Center?
In its current state, it is a battle simulator.

What does it do?
(Re)Play any battle with the current party (untested).

Can I switch/customize my party?
Not yet, but that is the long term goal.

Can I play as a monster?
Maybe one day.

How do I use it?
Start FF8_EN.exe and load a save file
Start FF8_TrainingCenter.exe
Enter a number in the edit box
Check the Check1 checkbox
Go to B-Garden- Training Center location and encounter!

Comments
I do not have time to catalog each battle right now which is why the UI is practically non-existent.

VT
https://www.virustotal.com/#/file/074de361c9ab329f2e71adb28b4878da29735ae58e041754ed299bab7d42e299/detection

Download
https://drive.google.com/open?id=0Bx_SMFEky68FSWZ3eHIwcWpzTXc

2
Gameplay Mods / Re: FF VIII How to MOD?
« on: 2017-09-20 01:39:11 »
Is there a particular reason people want to make the game artificially harder (more damage in, less damage out, etc.) instead of simply placing a limitation on themselves like not leveling, no magic, no junctions, etc.?

3
You can use 'db 90 90' in place of 'nop nop', etc.

4
Cheat Engine is about as simple as it gets; create a script and enable/disable it. It won't interfere with any mods you have installed.

Code: [Select]
[ENABLE]
FF8_EN.exe+86B0C:
nop
nop

[DISABLE]
FF8_EN.exe+86B0C:
dec cl

The only time I use a dll anymore is to hook functions (which can be done in CE, but is much more effort than it is worth) and even then I do not use a proxy like ddraw.dll.

5
It would be easier to use a program like Cheat Engine, but you can translate the instructions here.

6
Can you clarify the syntax for me?

{ = comment?
address = relative or absolute?
<address> = <hex>:<size>?

@Mcindus -> http://forums.qhimm.com/index.php?topic=15354.msg252994#msg252994

7
Gameplay Mods / Re: Final fantasy 8 Steam mod help
« on: 2017-08-15 15:05:26 »
Can you elaborate? Choose like FF7? Choose in battle from a sub-menu? Choose from equipped weapon? All of the above? Something different?

8
You are using the French version and the addresses are for the English version. You will need to do a file comparison with a disassembler to calculate the correct offset. The easiest way is to find what writes to the address and either use a nearby string reference or do a byte signature search.

9
Are you sure this was not a localization issue?

10
Gameplay Mods / Re: [REL] FF8Launcher 1.4
« on: 2017-07-25 00:59:44 »
You can use Cheat Engine to apply the patches I linked to in my previous post without needing to inject dlls.

11
Gameplay Mods / Re: [REL] FF8Launcher 1.4
« on: 2017-07-23 22:45:15 »

12
It is easiest to freeze the value.

13
General discussion / Re: Final Fantasy XV
« on: 2017-07-08 22:42:54 »
Am I a heretic for liking 12?

14
There is no ETA on an updated Summoner or the FF7 x FF8 Limit Break scripts. I will probably finish the Summoner script next, after I finish a request to always draw 100 magic, unless someone can help me RE the UI or has some slick idea on how to add a Limit Gauge and select Limit Breaks from the Command list (like Quistis' Blue Magic).

I finally had time to finish the idea I mentioned in the OP. I have not tested this beyond Squall and Qusitis, but I am confident it will work as intended; however, if it does not, let me know so I can fix it.

Video (gif):


Instructions:
Quote
To equip a GF:
Enable the script and equip any GF to any character

To unequip a GF:
Enable the Unequip <Character> script

Break GF Limit:
Code: [Select]
[ENABLE]
FF8_EN.exe+DF5E6:
db 90 90 90 90 90 90 90

FF8_EN.exe+E2D6F:
db 90 90
db 90 90
db 90 90

[DISABLE]
FF8_EN.exe+E2D6F:
test esi,ebx
je FF8_EN.exe+E2D75
mov [eax],dl

FF8_EN.exe+DF5E6:
mov [eax*4+"FF8_EN.exe"+198B2E5],bl

Unequip All:
Code: [Select]
[ENABLE]
ALLOC(newmem,1024)

newmem:
// Prologue
push eax
push ecx
xor ecx,ecx
// Field
loop1_begin:
mov eax,98
mul ecx
inc ecx
mov word ptr [eax+FF8_EN.exe+18FE140],0
cmp ecx,7
jb loop1_begin
xor ecx,ecx
// Quezacotl -&gt; Eden
loop2_begin:
mov eax,C
mul ecx
inc ecx
mov byte ptr [eax+FF8_EN.exe+198B2E5],FF
cmp ecx,10
jb loop2_begin
xor ecx,ecx
// Menu
loop3_begin:
mov eax,1C
mul ecx
inc ecx
mov word ptr [eax+FF8_EN.exe+198B6AE],0
cmp ecx,7
jb loop3_begin
// Epilogue
pop ecx
pop eax
retn

CREATETHREAD(newmem)

[DISABLE]
DEALLOC(newmem)[code]

[b]Unequip Squall:[/b]
[code][ENABLE]
ALLOC(newmem,1024)

newmem:
// Prologue
push eax
push ecx
// Field
mov eax,98
mov ecx,0
mul ecx
mov word ptr [eax+FF8_EN.exe+18FE140],0
xor ecx,ecx
// Quezacotl -&gt; Eden
loop_begin:
mov eax,C
mul ecx
inc ecx
mov byte ptr [eax+FF8_EN.exe+198B2E5],FF
cmp ecx,10
jb loop_begin
// Menu
mov eax,1C
mov ecx,0
mul ecx
mov word ptr [eax+FF8_EN.exe+198B6AE],0
// Epilogue
pop ecx
pop eax
retn

CREATETHREAD(newmem)

[DISABLE]
DEALLOC(newmem)

Unequip Zell:
Code: [Select]
[ENABLE]
ALLOC(newmem,1024)

newmem:
// Prologue
push eax
push ecx
// Field
mov eax,98
mov ecx,1
mul ecx
mov word ptr [eax+FF8_EN.exe+18FE140],0
xor ecx,ecx
// Quezacotl -&gt; Eden
loop_begin:
mov eax,C
mul ecx
inc ecx
mov byte ptr [eax+FF8_EN.exe+198B2E5],FF
cmp ecx,10
jb loop_begin
// Menu
mov eax,1C
mov ecx,1
mul ecx
mov word ptr [eax+FF8_EN.exe+198B6AE],0
// Epilogue
pop ecx
pop eax
retn

CREATETHREAD(newmem)

[DISABLE]
DEALLOC(newmem)

Unequip Irvine:
Code: [Select]
[ENABLE]
ALLOC(newmem,1024)

newmem:
// Prologue
push eax
push ecx
// Field
mov eax,98
mov ecx,2
mul ecx
mov word ptr [eax+FF8_EN.exe+18FE140],0
xor ecx,ecx
// Quezacotl -&gt; Eden
loop_begin:
mov eax,C
mul ecx
inc ecx
mov byte ptr [eax+FF8_EN.exe+198B2E5],FF
cmp ecx,10
jb loop_begin
// Menu
mov eax,1C
mov ecx,2
mul ecx
mov word ptr [eax+FF8_EN.exe+198B6AE],0
// Epilogue
pop ecx
pop eax
retn

CREATETHREAD(newmem)

[DISABLE]
DEALLOC(newmem)

Unequip Quistis:
Code: [Select]
[ENABLE]
ALLOC(newmem,1024)

newmem:
// Prologue
push eax
push ecx
// Field
mov eax,98
mov ecx,3
mul ecx
mov word ptr [eax+FF8_EN.exe+18FE140],0
xor ecx,ecx
// Quezacotl -&gt; Eden
loop_begin:
mov eax,C
mul ecx
inc ecx
mov byte ptr [eax+FF8_EN.exe+198B2E5],FF
cmp ecx,10
jb loop_begin
// Menu
mov eax,1C
mov ecx,3
mul ecx
mov word ptr [eax+FF8_EN.exe+198B6AE],0
// Epilogue
pop ecx
pop eax
retn

CREATETHREAD(newmem)

[DISABLE]
DEALLOC(newmem)

Unequip Rinoa:
Code: [Select]
[ENABLE]
ALLOC(newmem,1024)

newmem:
// Prologue
push eax
push ecx
// Field
mov eax,98
mov ecx,4
mul ecx
mov word ptr [eax+FF8_EN.exe+18FE140],0
xor ecx,ecx
// Quezacotl -&gt; Eden
loop_begin:
mov eax,C
mul ecx
inc ecx
mov byte ptr [eax+FF8_EN.exe+198B2E5],FF
cmp ecx,10
jb loop_begin
// Menu
mov eax,1C
mov ecx,4
mul ecx
mov word ptr [eax+FF8_EN.exe+198B6AE],0
// Epilogue
pop ecx
pop eax
retn

CREATETHREAD(newmem)

[DISABLE]
DEALLOC(newmem)

Unequip Selphie:
Code: [Select]
[ENABLE]
ALLOC(newmem,1024)

newmem:
// Prologue
push eax
push ecx
// Field
mov eax,98
mov ecx,5
mul ecx
mov word ptr [eax+FF8_EN.exe+18FE140],0
xor ecx,ecx
// Quezacotl -&gt; Eden
loop_begin:
mov eax,C
mul ecx
inc ecx
mov byte ptr [eax+FF8_EN.exe+198B2E5],FF
cmp ecx,10
jb loop_begin
// Menu
mov eax,1C
mov ecx,5
mul ecx
mov word ptr [eax+FF8_EN.exe+198B6AE],0
// Epilogue
pop ecx
pop eax
retn

CREATETHREAD(newmem)

[DISABLE]
DEALLOC(newmem)

Unequip Seifer:
Code: [Select]
[ENABLE]
ALLOC(newmem,1024)

newmem:
// Prologue
push eax
push ecx
// Field
mov eax,98
mov ecx,6
mul ecx
mov word ptr [eax+FF8_EN.exe+18FE140],0
xor ecx,ecx
// Quezacotl -&gt; Eden
loop_begin:
mov eax,C
mul ecx
inc ecx
mov byte ptr [eax+FF8_EN.exe+198B2E5],FF
cmp ecx,10
jb loop_begin
// Menu
mov eax,1C
mov ecx,6
mul ecx
mov word ptr [eax+FF8_EN.exe+198B6AE],0
// Epilogue
pop ecx
pop eax
retn

CREATETHREAD(newmem)

[DISABLE]
DEALLOC(newmem)

Unequip Edea:
Code: [Select]
[ENABLE]
ALLOC(newmem,1024)

newmem:
// Prologue
push eax
push ecx
// Field
mov eax,98
mov ecx,7
mul ecx
mov word ptr [eax+FF8_EN.exe+18FE140],0
xor ecx,ecx
// Quezacotl -&gt; Eden
loop_begin:
mov eax,C
mul ecx
inc ecx
mov byte ptr [eax+FF8_EN.exe+198B2E5],FF
cmp ecx,10
jb loop_begin
// Menu
mov eax,1C
mov ecx,7
mul ecx
mov word ptr [eax+FF8_EN.exe+198B6AE],0
// Epilogue
pop ecx
pop eax
retn

CREATETHREAD(newmem)

[DISABLE]
DEALLOC(newmem)

15
Draw 100 Magic (not thoroughly tested, probably buggy):
Code: [Select]
[ENABLE]
FF8_EN.exe+86A89:
mov al,64
mov [ecx],al
nop
nop
nop
nop
pop edi
pop esi
nop
nop

[DISABLE]
FF8_EN.exe+86A89:
mov al,[ecx]
cmp al,64
jnl FF8_EN.exe+86A75
inc al
pop edi
pop esi
mov [ecx],al

I will look more into the drawing 100 magic tomorrow night, if I can, so that will have to do for now.

"Notes" for breaking 2 byte damage limit:
Code: [Select]
[ENABLE]
ALLOC(newmem,1024)

newmem:
mov edx,[FF8_EN.exe+1927AE4]
mov [eax+04],cx
mov ecx,[FF8_EN.exe+1927AE8]
mov [eax+06],edx
jmp returnhere

FF8_EN.exe+8EFC4:
jmp newmem
nop
nop
db 90 90 90 90 // mov [eax+04],cx
db 90 90 90 90 90 90 // mov ecx,[FF8_EN.exe+1927AE8]
db 90 90 90 90 // mov [eax+06],dx
returnhere:

FF8_EN.exe+9113D:
mov esi,0001869F // F423F
nop
db 90 90 // jmp FF8_EN.exe+9114F
db 90 90 // xor ecx,ecx
db 90 90 // test esi,esi
db 90 90 90 // setl cl
db 90 // dec ecx
db 90 90 // and esi,ecx

FF8_EN.exe+93F24:
mov ecx,[ebp+06]
nop

FF8_EN.exe+106920:
mov esi,[edi+06]
nop

[DISABLE]
FF8_EN.exe+106920:
mov si,[edi+06]

FF8_EN.exe+93F24:
mov cx,[ebp+06]

FF8_EN.exe+9113D:
cmp esi,ecx
jle FF8_EN.exe+91145
mov esi,ecx
jmp FF8_EN.exe+9114F
xor ecx,ecx
test esi,esi
setl cl
dec ecx
and esi,ecx

FF8_EN.exe+8EFC4:
mov dx,[FF8_EN.exe+1927AE4]
mov [eax+04],cx
mov ecx,[FF8_EN.exe+1927AE8]
mov [eax+06],dx

DEALLOC(newmem)

16
Hey guys, was looking around the forum for mods to play FFVIII, such as Hardcore Mode, HP 9999+ and Dmg 9999. ...

http://forums.qhimm.com/index.php?topic=15354.msg250751#msg250751 - There may be something else available, but you can apply those patches to an Auto Assembler script in Cheat Engine.

... The HP and DMG are still cap to 32k but I saw an image from Maki in this thread: http://forums.qhimm.com/index.php?topic=16838.msg240173#msg240173 ...

The HP limit for your party is 65,535 (2 bytes), but for monsters it is 4,294,967,295 (4 bytes). The damage limit for both is 65,535 (2 bytes).

... Squall dealed 98765 dmg, is this mod working? Or still in process? ...

http://imgur.com/a/NwlWA - You can do more than 65,535 damage by forcing the registers to 32 bits, but the engine will not render more than 5 digits, as Maki said. There is no reason to do this, though, as you will never reach numbers that high.

Video (gif):


... Another thing, is there a mod to draw 100 magic at once? ...

I would imagine it is trivial to accomplish. I will look into it tomorrow.

17
... (cumulative damage counter to pass threshold to make attack -> limit, and then reset) ...

The obstacle I am facing is an intuitive way to represent the Limit Gauge value (because there is not one) without extensive patches. I would like to figure this out before I begin.

... Would be wonderful to change threshold value multiplier too to make 1 -> 2 -> 3 -> 4 style tiers in vein of Omnislash = Lionheart. ...

There is no easy way to select which Limit Break/Final Blow to use from a menu. The game was programmed with space for one sub-command (Attack>Limit Break). The bytes immediately after are for Quistis' Blue Magic.

18
There are a few things I plan to change/improve with the summoner mod and I might take it further if it does not take too much time. Unfortunately, changing portions of the story is not one of them, so unless someone wants to put that effort in, whatever I come up with will have to suffice.

As for your 7 x 8 Limit Break idea, I can help make that a reality, though not until Tuesday-ish. Contact me through Personal Message to stay updated on development.

19
Final update, with the most accurate information I could gather. Both the address lists are in-battle; the 'Status 2' status(es) will persist.

Status 1:
Address: FF8_EN.exe+1927B18
Address: FF8_EN.exe+1927BE8
Address: FF8_EN.exe+1927CB8
Type: 4 Bytes (Binary)
0 - Sleep
1 - Haste
2 - Slow
3 - Stop
4 - Regen
5 - Protect
6 - Shell
7 - Reflect
0 - Aura
1 - Curse
2 - Doom
3 - Invincible <--- <--- <--- <--- <---
4 - Petrifying
5 - Float
6 - Confuse
7 -
0 -
1 - Eject
2 - Double
3 - Triple
4 - Defend
5 -
6 -
7 -
0 - Vit 0
1 - Angel Wing
2 -
3 -
4 -
5 -
6 -
7 -

Status 2:
Address: FF8_EN.exe+1927B90
Address: FF8_EN.exe+1927C60
Address: FF8_EN.exe+1927D30
Type: Byte (Binary)
0 - Death
1 - Poison
2 - Petrify
3 - Darkness
4 - Silence
5 - Berserk
6 - Zombie
7 -

20
Sorry for the double-post, but I felt like this deserved its own reply and I did not want to create a thread for it.

I thought the idea you proposed of having a character as a dedicated summoner was very interesting. So interesting, in fact, that I implemented it, albeit roughly. Unfortunately, I am not far enough in my current save to find the variable that would allow me to add the restriction of summoning based on story progress, but perhaps it is for the best. I made Rinoa the summoner, for reasons I mentioned in my previous post, but that can be changed. You will see other character-related information, miss learning/Command abilities while Rinoa is not in the party, and miss plot elements (RIP Ifrit x Shiva).

Create an Auto Assembly script in Cheat Engine, paste the following code, and enable it.

Code: [Select]
[ENABLE]
ALLOC(newmem, 1024)

newmem:
// disable Junction in menu
menu_junction_disable:
push eax
push ebx
test cl,cl
jnz menu_junction_disable_cleanup
mov eax,FF8_EN.exe+1976C75
mov bl,0
menu_junction_disable_begin_loop:
cmp byte ptr [eax],4
je menu_junction_disable_cleanup
inc eax
inc bl
cmp bl,8
jb menu_junction_disable_begin_loop
inc cl
menu_junction_disable_cleanup:
pop ebx
pop eax
menu_junction_disable_original:
mov [esi+40],cl
test dh,-80
jmp menu_junction_disable_return
// disable Junction in sub-menu
submenu_junction_disable:
cmp byte ptr [FF8_EN.exe+1976C80],0
jne submenu_junction_disable_original
cmp byte ptr [FF8_EN.exe+1976C62],4
jne submenu_junction_disable_return
submenu_junction_disable_original:
mov word ptr [esi+10],0004
jmp submenu_junction_disable_return

FF8_EN.exe+C1056:
jmp menu_junction_disable
nop
menu_junction_disable_return:

FF8_EN.exe+C11FC:
jmp submenu_junction_disable
nop
submenu_junction_disable_return:

FF8_EN.exe+DBCF2:
nop
nop
nop

FF8_EN.exe+DBF68:
nop
nop
nop

[DISABLE]
FF8_EN.exe+DBF68:
mov [esi+43],al

FF8_EN.exe+DBCF2:
mov [esi+43],al

FF8_EN.exe+C11FC:
mov word ptr [esi+10],0004

FF8_EN.exe+C1056:
mov [esi+40],cl
test dh,-80

DEALLOC(newmem)

21
Having a "summoner" is an interesting idea for FF8, but I do not think it would work well with the plot or mechanics without significant modification. It could be done, roughly, with code patches, but it would not "feel good". The only character that makes sense (at least to myself) would be Rinoa, but not until after the party defeats Edea and her powers are passed on to Rinoa. That is a long time to not have access to your GF's. If you are really pressed to do something like this, it would be much easier to not junction anything until you have access to Rinoa after that point in the story. I would categorize this type of thing as a mod or, if taking the latter approach, a challenge run, but not a gameplay enhancement.

Again, I am not interested in discussing if changes make the game easier/harder in this thread. If you really want the game to be as hard as possible: run from every battle, do not junction, do not use magic, do not upgrade your weapons, do not use items, etc.; there are countless ways to challenge yourself in the vanilla game.

As for junctioning all GF's simultaneously to any character, I found the instructions I needed. Currently, you cannot unequip a GF once it has been junctioned while the patch is enabled, but I am working on that.

22
I began playing FF8 again and have been making small adjustments to gameplay I feel are quality of life improvements. One could argue the vanilla game is too easy and certain proposed changes will make it easier, but that is not the focus of this thread. I want to take suggestions the community has and possibly implement them.

I'll begin with something I posted in another thread:

Save Anywhere:
Spoiler: show
Save Anywhere - Address (set value to 1 and freeze):
Code: [Select]
FF8_EN.exe+18FEA89
Save Anywhere - Patch:
Code: [Select]
Save Point

FF8_EN.exe+1221CF | 8A 88 D1 00 00 00        | mov cl,byte ptr ds:[eax+D1]             | mov cl, 1
FF8_EN.exe+1221D7 | 80 C9 01                 | or cl,1                                 | nop
FF8_EN.exe+1221E6 | 80 E1 FE                 | and cl,FE                               | nop

Loading Zone

FF8_EN.exe+12BE1D | 8A 90 D1 00 00 00        | mov dl,byte ptr ds:[eax+D1]             | mov dl, 1
FF8_EN.exe+12BE2D | 80 E2 FC                 | and dl,FC                               | nop


I was also interested in allowing any GF to be junctioned simultaneously by all of the characters. I had partial success by writing the value (flag) that determines which GF(s) a character has junctioned. I will eventually determine which instruction(s) disable the GF once it has been junctioned and modify them accordingly. For now, you will have to live with this screenshot:


23
First is to have a fraction of all damage you take persist to your max HP for that battle. Easily done with a Post-Attack Character AI script in WallMarket and works fine; only problem is that the max HP value does not update in the battle menu. It works - you cannot heal above the new max HP value - but the menu doesn't reflect that. Anybody know a way to deal with this issue in the PC version?

FF7_EN.exe+9BA4AA
FF7_EN.exe+9BA8EA
FF7_EN.exe+9BAD2A

24
Type: 2 bytes, Value: 8

Member 1: FF8_EN.exe+1927B19
Member 2: FF8_EN.exe+1927BE9
Member 3: FF8_EN.exe+1927CB9 - Not verified

25
Use a memory editor, like Cheat Engine, to search for the value. I found them within 5 minutes using Unknown initial value, Changed value, and Unchanged value.

Pages: [1] 2