• Welcome to Final Fantasy Hacktics. Please login or sign up.
 

Auto-SCC Patch

Started by Glain, September 07, 2018, 07:25:01 pm

Glain

This patch makes the game a Straight Character Challenge (SCC) immediately from the start of the game.  In the opening sequence, the player chooses an initial job.  Your starting characters are automatically in that job (and will have appropriate equipment).  You even start the opening battle with Ramza as the SCC job.

This eliminates the tedium of unlocking the job you want to play as, but also forces the player into that job earlier than normal.

At the start of the game, there's a job to select...


Looks like we're starting in the Geomancer Academy.


Since you only have access to your chosen job, there's no need to see all kinds of other jobs in the job list...


And, well... you can't change jobs.  This is an SCC.


Also, the only selectable abilities are the ones from your job.

The soldier office appears to now be the Geomancer Office.


Note: Soldier office prices will vary based on whatever equipment is rolled for the unit!  The calculation for the hiring price is actually 1000 + (Equipment Cost).  Since equipment can vary, the price will read 1000 until either Male Fighter or Female Fighter is selected (and the equipment is determined), at which point the price will update with an increased value.

Characters will still join the party as normal... but will be in the SCC job, and cannot be changed out of it.  This applies to special characters as well as generics!  Monsters can join the party, but will not create eggs and cannot be fielded in battles.


Level caps are automatically enforced, and use the standard:
    Chapter 1: 20
    Chapter 2: 35
    Chapter 3: 50
    Chapter 4: 70 (Before Orbonne)
This means you actually don't have to worry about a unit going over the level limit because they just won't be able to level if they would normally have done so.

Abilities to be learned from crystals only include abilities for your job.
Invited units will not join the party at the end of the battle, but their equipment will silently be added to your inventory (much like what happens with a dismissed unit).

This patch uses the "Random unit equipment more selective" ASM patch, and modifies the levels of some equipment so that the AI will, in general, have access to more varied equipment but not equipment that's obsolete.

There are also a few scattered changes:
    Gafgarion at Zirekile doesn't load from the party
    Rubber Shoes become available in Chapter 3
    "Defeat Dycedarg!" at Igros Chapter 4

In addition to employing its own extensive ASM changes, this patch also makes use of the following ASMs:
    Random unit equipment more selective
    Fix Reraise Graphic Width
    Start button skips events, effects, battle and event text, etc.
    JP scroll glitch actual fix (Disable paging on confirm menu)
    Unit slots backfilled when unit is removed from party
    Speed up text crawls
    Switch unit number with L1 and R1 buttons (formation)
    Equipment duplication glitch fixes
    Level down fix
    Crits always deal bonus damage
   
This patch is actually completed, as far as I'm aware!  The PPF is attached.  I've played through on console without issue.
Feedback is welcome!
  • Modding version: Other/Unknown

3lric

Wow! Thats really cool, man. I cant offer much feedback as I'm a bit too whimpy for a SSC, but I will make a News post for this later tonight so more people take notice of it.

Well done!
  • Modding version: PSX

3lric

Moving this to completed patches.
  • Modding version: PSX

Wingale

Hello! So I tried this mod last night and I started with Samurai, but apparently none of my unit comes with a weapon. Also none of the starting city have any katana (Just finished Rat Cellar battle), and new soldier also didnt come with any weapon.

So do I have to punch (literally) my way out of chapter 1 and proceed until katana available on the shop (midway chapter 2 iirc) or is this a bug?
  • Modding version: PSX

Glain

That's as expected, and standard fare for certain SCCs.  The first katana doesn't become available until Chapter 2, as always.  On the bright side, you should be able to punch decently hard since Samurai have good PA.  I think high Brave will also help you do more punching damage.  You can also rely somewhat on Guests (who have no class restrictions) in the early game.
  • Modding version: Other/Unknown

Wingale

Thanks for the clarification, I will try to go through chapter 1. Blade grasp and chemist Delita should actually be enough for me to beat it.
  • Modding version: PSX

Ram

I just found this, fantastic stuff Glain! I'll have to try this out on console soon. I've been wanting to do more SCCs but the setup and cutscenes were always a turn off to do more. The start button skip feature sounds unbelievably awesome and is a game changer! To further enhance some of these I'll apply Hard Mode (Enemy abilities and JP bypass).
<&Angel> if WotL is your preference, 99 times out of 100, you can't be trusted to know how to use a toilet properly
<~Xifanie> Weazel has a degree in bathroomonics
<&Angel> everyone who wants to mod WotL exclusively is pants on head retarded

Necrohol

Thank you very much for this amazing patch! I ove all of you guys who allow me to keep playing my favorite game over and over with different challenges in mind!
  • Modding version: PSX & WotL

Heisho

Hello there!

Forgive the question, but are you going to release the level cap hack separately? That also would be cool.

Regards.

  • Modding version: PSX
Grrr, arwg, hiss, and some other zombie noises...
  • Discord username: Heisho

Timbo

January 13, 2019, 12:10:31 pm #9 Last Edit: January 14, 2019, 02:28:32 am by Timbo
Quote from: Heisho on January 13, 2019, 03:39:08 am
Hello there!

Forgive the question, but are you going to release the level cap hack separately? That also would be cool.

Regards.



I was wondering about this as well.
  • Modding version: PSX
  • Discord username: Timbo

Glain

January 13, 2019, 01:56:56 pm #10 Last Edit: January 13, 2019, 03:11:41 pm by Glain
I hadn't even really thought of it, but yes, I suppose I could release the level cap functionality as a separate hack.  I just put together the pieces from the SCC patch that control the level cap functionality into a single patch.  I didn't really test this new patch, so let me know if it doesn't work, but I did at least test to make sure it didn't cause a crash when a unit levels up.

The parts of this patch that use free space can be moved around in free space by changing the offset attributes of the relevant Location tags if there is a conflict with another hack.

The actual level caps are defined in the first Location tag in the patch XML.  The data looks like this:

0F 14 1F 23 29 32 35 46 00 00

Each entry is a two-byte set, and it ends with 00 00.  All numbers are in hex.

The first number in each set is compared against the storyline progression variable (List of some of the possible values here: http://ffhacktics.com/wiki/Storyline_Progression)
Basically, events corresponding to certain cutscenes set this variable (Variable 0x006E) to a specific value to keep track of how far you are in the storyline.  The higher the number, the further along you are.

The second number in the set is the actual level cap, and that cap applies when the storyline progression variable is less than or equal to what the first number is.

In our case we have four sets.
0x0F    Orbonne (Ch 2 start scene)  (0x14 = 20)
0x1F    Chapter 3 Start                   (0x23 = 35)
0x29    Chapter 4 Start                   (0x32 = 50)
0x35    Before final Orbonne            (0x46 = 70)

Anyhow, here are the goods:


    <Patch name="Enforce level caps">
        <Description>Enforces level caps. Defined in sets of two by the data in the first Location tag. First number in the set is storyline progression variable value and second number in the set is what the level cap is up to and including that progression. Sets end when 00 00 is reached. All values in hex.</Description>
        <Location file="SCUS_942_21" offset="27730" mode="DATA" offsetMode="RAM">
            0F 14 1F 23 29 32 35 46 00 00
        </Location>
        <Location file="SCUS_942_21" offset="27A5C" mode="ASM" offsetMode="RAM">
            .label  @address_storyline_progression_variable, 0x800578d4
            .label  @address_level_cap_data, 0x80027730
            .label  @address_skip_level_up, 0x8005d8e4
           
            .eqv    %battle_unit_experience_offset, 0x21
       
            #   HOOK: ENFORCE LEVEL CAP
            #       Parameters:
            #           s0 = Unit in-battle data pointer
            #           s1 = Unit level
            #       Sets v0 = 0 and experience = 99 if unit is at level cap, and skips the level up code.
            #       Preserve: v0, in default case
            @enforce_level_cap_hook:
                   
                    addiu   sp, sp, -24
                    sw      ra, 4(sp)
                    sw      v0, 8(sp)
                   
                    jal     @find_level_cap
                    nop
                   
                    sltu    t0, s1, v0
                    bne     t0, zero, enforce_level_cap_hook_default
                    li      t0, 99
                 
                    sb      t0, %battle_unit_experience_offset (s0)
                    la      ra, @address_skip_level_up
                    j       enforce_level_cap_hook_end
                    li      v0, 0
                 
                enforce_level_cap_hook_default:
                    lw      v0, 8(sp)
                    lw      ra, 4(sp)
                   
                enforce_level_cap_hook_end:
                    addiu   sp, sp, 24
                    jr      ra
                    nop

                   
            #   ROUTINE: FIND LEVEL CAP
            #       Finds the level cap based on the storyline progression variable.
            #       Returns:
            #           v0 = Level cap
            @find_level_cap:

                    lbu     t0, @address_storyline_progression_variable
                    la      t1, @address_level_cap_data
                   
                find_level_cap_loop:
                    lbu     t2, 0(t1)
                    lbu     t3, 1(t1)
                    beq     t2, zero, find_level_cap_default
                    sltu    t4, t2, t0
                    beq     t4, zero, find_level_cap_end
                    move    v0, t3
                    j       find_level_cap_loop
                    addiu   t1, t1, 2
                   
                find_level_cap_default:
                    li      v0, 99
                   
                find_level_cap_end:
                    jr      ra
                    nop
        </Location>
       
        <Location file="SCUS_942_21" offset="5D8AC" mode="ASM" offsetMode="RAM">
            jal     @enforce_level_cap_hook
        </Location>       
       
        <Location file="BATTLE_BIN" offset="15AF30" mode="ASM" offsetMode="RAM">
            .label  @address_skip_ability_level_up, 0x8018c910
       
            #   HOOK: ENFORCE LEVEL CAP (ABILITY)
            #       Parameters:
            #           v0 = Unit level
            #       Sets v0 = 0 if unit is at level cap, and skips the level up code.
            #       Preserve: v0 and v1, in default case
            @enforce_ability_level_cap_hook:
                   
                    addiu   sp, sp, -24
                    sw      ra, 4(sp)
                    sw      s0, 8(sp)
                    sw      v1, 12(sp)
                   
                    move    s0, v0
                    jal     @find_level_cap
                    nop
                   
                    sltu    t0, s0, v0
                    bne     t0, zero, enforce_ability_level_cap_hook_default
                    nop
                 
                    la      ra, @address_skip_ability_level_up
                    j       enforce_ability_level_cap_hook_end
                    li      v0, 0
                 
                enforce_ability_level_cap_hook_default:
                    lw      v1, 12(sp)
                    move    v0, s0
                    lw      ra, 4(sp)
                   
                enforce_ability_level_cap_hook_end:
                    lw      s0, 8(sp)
                    addiu   sp, sp, 24
                    jr      ra
                    nop
        </Location>
       
        <Location file="BATTLE_BIN" offset="18A770" mode="ASM" offsetMode="RAM">
            lui     s1, 0x8019
            lw      s1, 0x2d98(s1)
            nop
            lbu     s1, 0x22(s1)
            jal     @find_level_cap
            nop
            sltu    v0, s1, v0
        </Location>
        <Location file="BATTLE_BIN" offset="18C890" mode="ASM" offsetMode="RAM">
            jal     @enforce_ability_level_cap_hook
        </Location>
    </Patch>   
  • Modding version: Other/Unknown

AbnormalVoid

Very nice. I know I'm going to get a great deal of use out of this.
  • Modding version: PSX

Pixy

Quote from: Glain on September 07, 2018, 07:25:01 pm
Characters will still join the party as normal... but will be in the SCC job, and cannot be changed out of it.  This applies to special characters as well as generics!  Monsters can join the party, but will not create eggs and cannot be fielded in battles.


How does this affect the actual battles? For example, in that particular instance, is Agrias a Geomancer during the actual Bariaus Valley fight or is she forced that way after?

Quote
There are also a few scattered changes:
    Gafgarion at Zirekile doesn't load from the party
    Rubber Shoes become available in Chapter 3
    "Defeat Dycedarg!" at Igros Chapter 4


Strange change for the Rubber Shoes. It's not terribly important but it does change the fight At the Gate of Lionel Castle. Why change it?

The "crits always do bonus damage" business is also a little strange to me. I'm for quality of life changes but anything that shakes the foundation of the game, even if it's only a little, makes the challenge slightly different from the original. Of course, if that was your goal, this is a solid patch through and through, and may be worth a try one day.
*is FFTRamza*
no, I mean what I said. Perhaps if I said it in Japanese it'd become magically better for you. - philsov

Glain

Quote from: Pixy on February 16, 2019, 11:53:56 am
How does this affect the actual battles? For example, in that particular instance, is Agrias a Geomancer during the actual Bariaus Valley fight or is she forced that way after?


She's a Holy Knight during the battle, and is then locked into the chosen SCC class afterwards.  The general rule is that Guests will be the same as usual until they join you.  I also didn't want that battle in particular to be a lot more difficult if you had chosen a less sturdy class.

Quote from: Pixy on February 16, 2019, 11:53:56 am
Strange change for the Rubber Shoes. It's not terribly important but it does change the fight At the Gate of Lionel Castle. Why change it?


For that reason.  The Rubber Shoes make you immune to damage from everybody in that battle except Gafgarion (and maybe the summoner?).  I don't think it was intended for Rubber Shoes to break the battle that badly, because the enemy units in the Lionel Gate battle are actually assigned to have random equipment, and it just so happens the game can only select the lightning weapons because of the unit levels.

Quote from: Pixy on February 16, 2019, 11:53:56 am
The "crits always do bonus damage" business is also a little strange to me. I'm for quality of life changes but anything that shakes the foundation of the game, even if it's only a little, makes the challenge slightly different from the original. Of course, if that was your goal, this is a solid patch through and through, and may be worth a try one day.


I understand that point of view, but I think of "crits that aren't really crits" as a bug that should be fixed.  It's strange for the visual and audio effects of a crit to happen but for no bonus damage to be dealt, and I don't see why that would be desirable behavior in any circumstance.
  • Modding version: Other/Unknown

CryofthePlanet

"The "crits always do bonus damage" business is also a little strange to me. I'm for quality of life changes but anything that shakes the foundation of the game, even if it's only a little, makes the challenge slightly different from the original. Of course, if that was your goal, this is a solid patch through and through, and may be worth a try one day."

I agree with this point. Overall, this patch is really awesome and I love it, but these changes are negatives in my opinion. They change mechanics in the game that whether you like them or not, you are forced to contend with. The idea of the setup being taken out is kind of in this line, but it's really only relevant for a couple difficult-to-unlock jobs like Mime, Calc, etc. Even so, you're forced to contend with either getting throwaway soldiers and slooowly accruing spillover JP for these unlocks to keep your units at a low level, or forced to contend with the issue of getting higher leveled and dealing with riskier random encounters just to get the job unlocked.

Changing the availability of an item (Rubber Shoes) or a basic mechanic (critical hits) might be adjusting an issue that could use tweaking, but I feel like it ultimately affects the authenticity of the run. It would be like changing Kimahri's Thrust Kick in FFX to actually inflict Eject, or fixing Steiner's Thunder Slash and Iai Strike in IX. At that point, it's not a far jump to do things like adjust the Sanctuary Keeper's poison resistance to allow an easier infliction with back-to-back Bad Breaths in a Kimahri SCC, or nerfing the instant death rate of Anima's Pain at Macalania. Of course, those are extreme and drastic examples, but it's a slippery slope.

I think I'll check this patch out for SCC runs that aren't normally available for the player (Assassin, Ultima Demon, etc), if that's even an option. But I feel the changes that alter mechanics in any way affect the legitimacy of the run.
  • Modding version: PSX

IronJustice

Thanks for sharing, this is great! I'm sure that took a lot of work, and you really seemed to think of everything.

  • Modding version: PSX
FFT: Spirit of '98 is out and ready for testers!
  • Discord username: Ironjustice

Desocupado

Is it possible to mod on top of this mod?

I'd like to change some class abilities around,shop availability, battle formationsand some items. And perhaps replace calculators and some other job.
  • Modding version: PSX

Glain

Sure, I suppose you could.  At least, I can't think of any reason why not off the top of my head.
  • Modding version: Other/Unknown