øAslickproductions.org/forum/index.php?PHPSESSID=so1iojs5ocdn0o2vf0tti7fbu6&action=profile;area=showposts;sa=topics;u=337e:/My Web Sites/Slick Productions - FFIV Message Board/slickproductions.org/forum/index0e2d-2.htmlslickproductions.org/forum/index.php?PHPSESSID=so1iojs5ocdn0o2vf0tti7fbu6&action=profile;u=337e:/My Web Sites/Slick Productions - FFIV Message Board/slickproductions.org/forum/index0e2d-2.html.zxRõg^ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÈ@>æ²OKtext/htmlISO-8859-1gzip@øÕæ²ÿÿÿÿÿÿÿÿTue, 10 Mar 2020 20:31:37 GMT0ó°° ®0®P®€§²ð®Qõg^ÿÿÿÿÿÿÿÿD'æ² Show Posts - Praetarius5018

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.


Topics - Praetarius5018

Pages: 1
1
Final Fantasy V Research & Development / Free RAM?
« on: August 24, 2017, 10:59:14 AM »
As with many ROM hacking projects, more usable RAM is needed.
I don't care if it is included in the savegame for now.

So I went and just checked in the RAM watch values that didn't change at all (equal to previous value) between power on and switching between 5 different saves.
Coincidently all values are 0x55 so that helps, I guess.

Results were:

7E1E14 - 7E1E3F
7E1E68 - 7E1EFF
7E1F08 - 7E1F94
7E7D09 - 7E7D28
7EDC76 - 7EDCF5
7EF873 - 7EF9A0
7EF9CC - 7EFFFF
7F6000 - 7F61FF
7F6A11 - 7F6A17
7F6A43 - 7F6A48

I don't really trust this method, so someone already got a list or a better method?

2
Final Fantasy V Research & Development / Monster AI - HP triggers
« on: August 05, 2017, 05:55:57 AM »
when I started I thought the HP conditions in enemy AI would be percentage so it wouldn't matter what I set HP to.
I was wrong, the checks are in absolute values ..

specifically I mean the likes of Magisa checking for her own HP to drop below 300 before she summons her husband.

does someone happen to have a list with enemies that even use any HP checks or a good method to find them?
367 entries are a bit much for me atm..

3
So theoretically the game can have 8 enemies in battle at the same time.
This doesn't seem to be a good idea.
If there are 7-8 enemies alive at the same time, casting a multitarget spell will crash the game.
"Simple" animations like Bolt survive 7 enemies (at least in my test group) but 8 was too much.
Fire3 glitches the game at 7 enemies already. I had to restart the entire emulator, loading savestate didn't suffice for some reason.
Ice2 doesn't crash the game at 6 enemies, but the 6th enemy didn't display the "got hit" part of the animation.
Ice1 passed even 8 enemies but was very laggy.

The biggest "natural" enemy group I know of has 6 of those Puroboros bomb enemies and a quick search found no enemy formation that even used the 8th slot.

Also anything targetting the 8th enemy exclusively somehow lands instead on the parties first character. But only while all 8 are alive.
This is confusing, yo...


Background is:
I wanted to use the unused enemy slots for random encounters and make it really random.
Enemy slot 1-8 would all be filled and then RNG decides at battle start that enemy 2,4 and 7 stay home.
So far the theory. Reality... has crashed and needs a reboot.


So what I wanted to know is, has anyone ever used those "extra" monster formation slots successfully or just stuck to vanilla?

4
Final Fantasy V Research & Development / Inventory Sorting
« on: June 05, 2017, 02:10:11 PM »
Do we have any information on how the inventory is "sorted"?
To be honest, all results seem utterly random apart from consumables first, then weapon, then armor.
Even within each of those groups the order looks random...

5
more a presentation of the "idea" than anything solid.


1) MP/action economy

Battle starts with 10 MP, except for certain class bonus (below) and some equipment.
ELEMENT1 spells cost 0 MP, stronger and more specific spells > 0.
Magic damage is reworked so that even the lowest spells remain relevant by changing fixed spell power into a percentage modifer of the weapon power.
Staff and Rod provide and small bonus on top of that.

Guarding grants 100 MP, next to the usual recovery options like Ethers and Osmose.
If MP is at least 100 at the end of a turn, that character skips wait and immediatly gets to act again.
ATB only moves when noone can do anything.
If you're seeing parallels to Bravely Default, it was kinda the inspiration.

And yes, that makes the Quick spell useless. Will be replaced.
Hmmm... one source of bugs less, strike!

 

2) classes

We have 4 characters and all have access to the same 22 classes, including Freelancer and Mime.
No more!
Noone gets to keep the Hobo class, they learned a profession after all :P
Aside from that, I block 6 classes per character, so each one has 15 classes to choose from. E.g. Bartz can never be a Chemist while Lenna just doesn't have it in her to go Berserker.
Less breakage, more character diversity.

Each class gets to teach 7 abilities, some duplicates across classes for the basics, but the heavy stuff like !X-Fight and !X-Magic should stay unique and as a 7th ability.
Additionally stupid stuff like White1-6 goes and only teaches White once. You don't have to learn 6 times how to wield a sword either, neither has !Blue that problem.

Changing into a class no longer changes stats, instead levelling a class grants permanent stat bonuses, 3 out of HP, MP (starting bonus and max), STR, AGL, MAG, VIT. Duplicates possible.
E.g. each level of Monk gives +2x VIT and +1x HP (30 HP before VIT %bonus)

ABP required is not based on which ability you learn next but purely on how many class levels you already have.
From the 30th class level it costs 999 ABP then. I've so far decided against a hard cap of class levels.

 

3) items

Consumables aren't used up, instead you get a cooldown during which you can't use !Item.
Higher item stacks increase effect or lower cooldown. E.g. 1x Potion heals 30 HP, 99x Potion 2000 HP.
Mix still uses items up because it is that broken.
Undecided on Drink and Throw.

Out of battle healing is not possible anymore (except for tents), instead you get a free partial heal based on VIT on victory.

 

4) equipment

Equipment is changed from Helm, Armor and Relic to 3x Relic.
Non-shields have to get renamed.

 

5) elements

Everything should get one of the eight elements this game has instead of 90% neutral.
Weapons belong to one element per type, i.e. swords would be fire except for special cases.
Armors for defensive obviously, each element would give 2 resistances and 2 weaknesses, mix gear badly and you're suddenly weak to 6 elements.
The only thing I'd allow to be neutral would be the final boss. Everything else, enemy or otherwise, should have elemental affinity (i.e. weaknesses).



Also, I'm still stuck on the biggest hurdle: the hack's name. :sad:
I've decided on the acronym, not on the long title. Go figure...

6
Final Fantasy V Research & Development / New Ability Info
« on: May 25, 2017, 03:04:45 AM »
at least I didn't find it on the wiki

$C1/5F17 has a table with the called up menues for abilities, 1 byte per ability
0 for abilities that don't use a magic menu, 1 = Spellblade, 2 = white, 3 = black, etc.
called from $C1/52A8


$D0/ED02 has a table with the "action types" that are executed
04 = normal attack and variants like aim
0C = jump start
16 = X-Fight (4x fight)
2B = value for all spell menues and monster attacks
called from $C2/49EA


$D1/5DA0 has a table with the delays before actions are executed
$80 or higher - instant
otherwise that many atb ticks
called from $C2/1AAA

7
Final Fantasy V Research & Development / Instant ATB
« on: November 25, 2016, 02:57:37 PM »
So I was tired of waiting for the ATB bar, and thought I'd share my changes.

What this does it:
instead of directly counting down remaining ATB, status ticks, etc.
we calculate in the first pass-through how many "ticks" would be needed until the next event (action, poison tick, etc.)
and in the second pass we subtract just that many.
Disadvantage is of course that you can no longer wait for the perfect moment to use jump to avoid specific attacks.


I'll use 2 seemingly unused enemy bytes for this:
7E2596   8th enemy "command 1"; we'll use this to calculate how many ATB ticks have to pass
7E2597   8th enemy "command 2"; 0x80 = calculation mode, otherwise update ATB


this function is used for ALL increases/checks of all status timer, ATB, jump, etc.
Code: [Select]
$C2/203C 20 55 20    JSR $2055  [$C2:2055]   A:0000 X:0007 Y:0002 P:envMxdizc
$C2/2055 64 08       STZ $08    [$00:0008]   A:0000 X:0007 Y:0002 P:envMxdizc
$C2/2057 5A          PHY                     A:0000 X:0007 Y:0002 P:envMxdizc
$C2/2058 A4 0C       LDY $0C    [$00:000C]   A:0000 X:0007 Y:0002 P:envMxdizc
$C2/205A B9 E4 3E    LDA $3EE4,y[$7E:3EEB]   A:0000 X:0007 Y:0007 P:envMxdizc
$C2/205D F0 2C       BEQ $2C    [$208B]      A:0001 X:0007 Y:0007 P:envMxdizc
$C2/205F C0 0A 00    CPY #$000A              A:0001 X:0007 Y:0007 P:envMxdizc <- branch for ATB, status effects check first if they are actually applied
$C2/2062 F0 05       BEQ $05    [$2069]      A:0001 X:0007 Y:0007 P:eNvMxdizc <- change to F011 to go directly to our edited check
$C2/2064 AD 4E 47    LDA $474E  [$7E:474E]   A:0001 X:0007 Y:0007 P:eNvMxdizc
$C2/2067 D0 22       BNE $22    [$208B]      A:0000 X:0007 Y:0007 P:envMxdiZc
$C2/2069 BD F1 3C    LDA $3CF1,x[$7E:3CF8]   A:0000 X:0007 Y:0007 P:envMxdiZc
$C2/206C F0 1D       BEQ $1D    [$208B]      A:0001 X:0007 Y:0007 P:envMxdizc
$C2/206E 30 15       BMI $15    [$2085]      A:0001 X:0007 Y:0007 P:envMxdizc
$C2/2070 BD 75 3D    LDA $3D75,x[$7E:3D7C]   A:0001 X:0007 Y:0007 P:envMxdizc <- needed ticks on regeneration gauge
$C2/2073 F0 08       BEQ $08    [$207D]      A:0001 X:0007 Y:0007 P:envMxdizc
$C2/2075 DE 75 3D    DEC $3D75,x[$7E:3D7C]   A:0001 X:0007 Y:0007 P:envMxdizc <- we'll place a fitting JSL/JSR here
$C2/2078 BD 75 3D    LDA $3D75,x[$7E:3D7C]   A:0001 X:0007 Y:0007 P:envMxdiZc <- EA/use for missing JSL byte as needed
$C2/207B D0 08       BNE $08    [$2085]      A:0000 X:0007 Y:0007 P:envMxdiZc
$C2/207D BD F1 3C    LDA $3CF1,x[$7E:3CF8]   A:0000 X:0007 Y:0007 P:envMxdiZc
$C2/2080 09 81       ORA #$81                A:0001 X:0007 Y:0007 P:envMxdizc
$C2/2082 9D F1 3C    STA $3CF1,x[$7E:3CF8]   A:0081 X:0007 Y:0007 P:eNvMxdizc
$C2/2085 A5 0C       LDA $0C    [$00:000C]   A:0081 X:0007 Y:0007 P:eNvMxdizc
$C2/2087 D0 00       BNE $00    [$2089]      A:0007 X:0007 Y:0007 P:envMxdizc
$C2/2089 E6 08       INC $08    [$00:0008]   A:0007 X:0007 Y:0007 P:envMxdizc
$C2/208B 7A          PLY                     A:0007 X:0007 Y:0007 P:envMxdizc
$C2/208C E8          INX                     A:0007 X:0007 Y:0002 P:envMxdizc
$C2/208D E6 0C       INC $0C    [$00:000C]   A:0007 X:0008 Y:0002 P:envMxdizc
$C2/208F 60          RTS                     A:0007 X:0008 Y:0002 P:envMxdizc


external routine for $C2/2075
Code: [Select]
AD 97 25 LDA $2597  [$7E:2597]
29 80 AND #$80
F0 11 BEQ $11
---read mode---
AD 96 25 LDA $2596
38 SEC
FD 75 3D SBC $3D75,x[$7E:3D7C]
90 06 BCC
BD 75 3D LDA $3D75,x[$7E:3D7C]
8D 96 25 STA $2596
80 0E BRA skip apply
---apply mode---
BD 75 3D LDA $3D75,x[$7E:3D7C]
38 SEC
ED 96 25 SBC $2596  [$7E:2596]
B0 02 BCS $02
A9 00 LDA #$00
9D 75 3D STA $3D75,x[$7E:3D7C]
---end cases---
BD 75 3D LDA $3D75,x[$7E:3D7C]
6B RTL



At the end of each character's status/ atb check loop, it checks if we have to go to the next character or if we have finished all 12 possible characters (4 heroes + 8 enemies).
We'll expand the "finished" case for a mode change (calculate ticks <-> apply difference)

Code: [Select]
$C2/204E A5 0A       LDA $0A    [$00:000A]   A:0000 X:0079 Y:000B P:envMxdizc <- we'll place a fitting JSL/JSR here
$C2/2050 C9 0C       CMP #$0C                A:000C X:0079 Y:000B P:envMxdizc <- this'll disappear into the JSL/JSR
$C2/2052 D0 BE       BNE $BE    [$2012]      A:000C X:0079 Y:000B P:envMxdiZC
$C2/2054 60          RTS                     A:000C X:0079 Y:000B P:envMxdiZC


external routine for $C2/204E

Code: [Select]
A5 0A LDA $0A
C9 0C CMP #$0C
D0 11 BNE $11
---update mode---
AD 97 25 LDA $2597  [$7E:2597]
49 80 EOR #$80
8D 97 25 STA $2597  [$7E:2597]
29 80 AND #$80
F0 05 BEQ $05
A9 FF LDA #$FF
8D 96 25 STA $2596  [$7E:2596]
---end---
A5 0A LDA $0A
C9 0C CMP #$0C
6B RTL

8
Seiken Densetsu 3 Research & Development / cast timer / menu bug
« on: June 01, 2015, 12:00:50 PM »
Not a 100% perfect thing, but so far it seems to work.

some background information
$7E:2040 - pointer to 1st hero (e.g. F060)
$7E:2042 - pointer to 2nd hero
$7E:2044 - pointer to 3rd hero
$7E:2046 - pointer to 1st enemy
$7E:2048 - pointer to 2nd enemy
$7E:204A - pointer to 3rd enemy

all of these have a pointer that tells them if they are present:
+$04, non-0 means is on screen, e.g. 7F:F064

+$5B, e.g. 7F:F0BB - is 0 while you can act
   1 in ring menu, 2 in main menu, 1 or 2 while casting or spell animation runs or during events
   1 or 2 during map transition, anything higher means world map - so we should do nothing then

+$8A, e.g. 7F:F0EA, has the flag if anyone is in the menu, AND $04 tells us that

and last there's +$57 (2 bytes), e.g. 7F:F0B7, which is the pointer to the timer of the current action

those timer objects are 16 bytes each
00, 01 - tells us the next timer in the list (the whole thing should be a ordered list, it isn't)
02, 03 - (unknown)
04, 05 - time stamp in frames when the action is to be executed
06, 07 - original duration from start of timer until its execution
08, 09 - if 0 the timer is active, non-0 means the timer is stopped and this value is the remaining duration after resuming
0A, 0B - (unknown)
0C..0F - identifies the type of action


7F00C6 (2 bytes) holds the current time stamp in frames and gets updated exactly once per frame there:
Code: [Select]
$C0/CC63 C2 30       REP #$30                A:0000 X:000A Y:1CC0 P:envmxdIZC
$C0/CC65 EE C6 00    INC $00C6  [$7F:00C6]   A:0000 X:000A Y:1CC0 P:envmxdIZC

instead put a JSL to some free space and put there:
Code: [Select]
C2 30 REP #$30
48 PHA
DA PHX
5A PHY
AD C6 00 LDA $00C6 [$7F:00C6]
29 07 00 AND #$07 <- run only once every 8th frame
C9 07 00 CMP #$07
D0 04 BNE 04
22 xy xyxy JSL <- run tick updater
7A PLY
FA PLX
68 PLA
EE C6 00 INC $00C6  [$7F:00C6]
6B RTL

tick updater:
Code: [Select]
A2 40 20 LDX #$2040
A0 06 00 LDY #$06
===LOOP START===
DA PHX
5A PHY
BF 00 00 7E LDA 7E0000, x
F0 2D BEQ <- no one there, skip checks
===checks start===
AA TAX
BD 04 00 LDA $0004,x[$7F:F064] - 0 while not present
F0 27 BEQ <- was 0, go to checks end
BD 5B 00 LDA $0004,x[$7F:F0BB] - 2 while casting, >> 2 while on world map
29 FF 00 AND #$00FF
C9 10 00 CMP #$10
90 04 BCC <- $10 or more, go to end of entire function
--go to end--
7A PLY
FA PLX
80 21 BRA
--else--
C9 02 00 CMP #$02 <- 2 = casts a spell right now, go to update timer
90 04 BCC
--go to update timer--
7A PLY
FA PLX
80 19 BRA
--else--
BD 8A 00 LDA $0004,x[$7F:F0EA] - 4 is set while in menu, 1 seems to be movement related; enemies can have non-sensical values here sometimes... D255
29 05 00 AND #$05
C9 04 00 CMP #$04
D0 04 BNE <- was not set, go to checks end
---go to update timer--
7A PLY
FA PLX
80 0A BRA
===checks end===
7A PLY
FA PLX
E8 INX
E8 INX
88 DEY
F0 02 BEQ leave loop if 0
80 C2 BRA go to start of loop
===LOOP END===
6B RTL
===update timers===
A2 40 20 LDX #$2040
A0 03 00 LDY #$03
===START UPDATE LOOP===
DA PHX
5A PHY
BF 00 00 7E LDA 7E0000, x
F0 23 BEQ <- no one there, skip
===CHECK===
A8 TAY
BE 57 00 LDX $0057,y[$7F:F0B7] <- pointer to spell data
F0 1D BEQ
BD 0E 00 LDA $000E,x[$7F:19BE] <- timer type, 21D3 is spell preparation
EA EA EA
C9 D3 21 CMP #$21D3
D0 12 BNE
BD 0C 00 LDA $000C,x[$7F:19BC] <- timer type, D064 is spell
C9 64 D0 CMP #$D064
D0 0A BNE
BD 04 00 LDA $0004,x[$7F:19F4]
18 CLC
69 08 00 ADC #$0008
9D 04 00 STA $0008,x[$7F:19F4]
===END CHECK===
7A PLY
FA PLX
E8 INX
E8 INX
88 DEY
F0 02 BEQ leave loop if 0
80 CC BRA go to start of loop
===END UPDATE LOOP===
===end update timers===
6B RTL


I run this only every 8 frame because I've put a few more changes in that routine (e.g. passive MP regeneration)

edit: added check against false menu positive

Pages: 1