Re: [PSX/PC] Alternate F...

  • Thread starter Thread starter Tirlititi
  • Start date Start date
Status
Not open for further replies.
Hi everyone, i love the mod, its amazing, played in pc perfectly.

Recently i got a Steam Deck, is it the mod playable in a steam deck ?
Thanks
 
Recently i got a Steam Deck, is it the mod playable in a steam deck ?
It should, yes. I don't have a Steam Deck and cannot help you much in that regard, but there are tutorials on how to install the latest Memoria versions. If you succeed in doing that, then using Alternate Fantasy shouldn't be harder (at worst, you'll need to put the mod manually in the game's folder, if the Mod Manager doesn't work on the Steam Deck).

SonicBrawler wrote this about installing Memoria on Steam Deck. It's about the framerate (FPS) update of Memoria but it works the same with the versions even more recent:
Assuming you've already got Moguri installed, go to Desktop Mode and all you have to do is put the Memoria Patcher from the embedded video's description into your FFIX folder, then add the patcher .exe as a non-Steam game. Then right-click the patcher in Steam and select Properties > Compatibility. There will be a single checkbox that says something like "Force use of a Steam Compatibility tool". Check that, and from the drop down that appears, select Proton 7. Then hit Play in Steam and it will install it.

I found the checkboxes for the launcher did not work in Steam Deck (the Moguri launcher did before), but you can still activate the settings you need by editing Memoria.ini.

Also worth noting you can go as high as 120 FPS, though Steam Deck's screen is 60hz so no need to go higher than that for it.

---‐----------

There are few minor issues to be aware of:

- The game's lack of animation blending is much more apparent at higher framerates.

- World map animations are locked at the original FPS even when increasing it, it really just makes the camera turning look smoother. If you think this looks off-putting, you can turn it off individually for the world map.

- 2D sprite VFX will still be at the original 15 FPS, they would probably need a whole mod to update the VFX through interpolation or just use brand new VFX.
Apparently, the newest (or beta version) of Proton has less problems, especially with tick boxes on the launcher and things like that. Again, I don't really know how all of this work.
 
Can you still modify the mod using Hades Workshop? I can't seem to figure out how to open the mod in the tool.
 
Great, I found it. Thanks a bunch.

Makes me wonder, is it somehow possible to read a mod with the Hades tool if it doesnt have a hws file?

Edit: Ive also seen that, since the last time I looked at this mod, you added a lot more modifications, especially to enemies.
How does the difficulty stack up? While I'm not a fan of ludicrously hard mods, I do like me a good challenge.
 
Last edited:
Not really. In many situations, you can't read a mod without its hws file. It happened to end up this way although that was not especially the objective at start.

The changes in AF in the past few years tended to add a couple more mechanics on one hand (eg. the behaviour of "Blind" that is much more subtile now) but to reduce the overall difficulty of the mod. It never was a "ludicrously hard mod" though, in my opinion.
 
Okay then.

Ah, the difficulty is actually reduced(from what the mod was before)? Well, I'll try a low-level run then.
I wonder~ how much work would it be to tinker with XP gain or levelup requirements? Basically something to make me level slowly(like halving all XP gains).
 
Very simple: you open a file "AbilityFeatures.txt" (for example "StreamingAssets/Data/Characters/Abilities/AbilityFeatures.txt" but you could do that with the Ability Features of any active mod as they can have cumulative effects).

In this file, at the end, you add these lines:
Code: [Select]
Code:
>SA Global+BattleResult [code=BonusExp] BonusExp / 2 [ /code ]
This reduces the experience gain to 50%. It basically works like the supporting ability "Level Up" but it applies without being tied to any supporting ability.

NOTE: I have to write "[ /code ]" in the code block because it is the same tag as the forum's format, but you need to remove the spaces in there.
 
Nice, that's much simpler than I expected. Thanks a lot for your help ^.^
 
I found a bug. Well, that, or somethings wrong on my side, not sure.
Windfall deals way too much damage and is AoE. In burmecia, from backrow, basic attacks dealt about 114 damage, windfall over 500. About 800 on ironites(Who are weak to wind, I think)
I tried looking at the hws file, but as it used a number of unused things(effect is unused 114, it has the menu flags Unused(4) and Unused(5), I can't make heads or tails of that.

It still does the defence decrease(the line of text for the decreases appears at least).
 
Last edited:
Hello, I'm trying to use the Beatrix-only mod but when I recruit her she has White Magic abilities but no Seiken abilities. The Seiken menu is completely empty. Is there a file/files I can modify on my end to fix this? Or drag/drop from the AF mod to replace the older Beatrix-only version?
 
I found a small bug.
Fenrirs two spells are swapped. First cast did the wind attack, second the earth attack, but the wrong name is listed. Might just be the animation that is swapped, I am not sure.
 
Last edited:
I'm currently in Oeilvert and am wondering about the Epitaphs. Is it intended that the clones can just remove party members for the rest of the dungeon? Is there any way to get them back?
 
Just beat it with everybody lvl 1 except Beatrix! That was majestic. Please accept my appreciation. Your work is truly outstanding.
Two most difficult battles were Necron(due to rng) and surprisingly duel with Amarant, grind both fights for hours :-D
 
Hello!

First of all I just made this account because I just found out about FF9 mods and I am immediately invested.

Therefore I started with Moguri and of course Alternate Fantasy (along with a few other smaller ones).

I reached Lindblum however, and I noticed a few problems... It all started when I noticed Cotton Robe still sold for 2000 even though the mod supposedly decreased the price.
Next I checked Zidane's new weapons, specifically The Butterfly Sword and... it still listed its original ability 'What's That'!!
Bear in mind that other of the mod's effects where easily noticeable up to this pointy, like spells causing ailments (Fire -> Heat, Blizzard -> Snow, etc).
I got curious to try out the 'What's That' in battle and as I suspected, it had been turned into the single hit physical attack as it was supposed to... While the menus and the explanation box described the original abilty.

It seems then that this could simply be a visual bug, however the cotton robe issue has me worried that other things are not working as intented.

Has anyone else encountered this? Is there a fix?

Some extra info: here is the memoria.ini mod list:
FolderNames= "FlattenGrowth", "DragonKnightRising", "AlternateFantasy", "PlayableCharacterPack/ZidaneArmor", "PlayableCharacterPack/GarnetHooded", "PlayableCharacterPack", "PSXButtons", "TweakedPortraits", "MoguriFiles", "MoguriSoundtrack", "MoguriVideo"
Priorities = "FlattenGrowth", "DragonKnightRising", "AlternateFantasy", "PlayableCharacterPack", "PSXButtons", "TweakedPortraits", "MoguriFiles", "MoguriSoundtrack", "MoguriVideo"
 
Hi.
I'm pretty sure that's the mod Dragon Knight Rising messing with abilities (and surely the items as well, hence the Cotton Robe price). I don't think you can do much about that right now: either you'll have these differences or you need to disable it. Mod compatibility of two mods that both change the gameplay is difficult to maintain unfortunatly.
 
Thank you very much for your answer. It was naturally a compatibility problem..

I have now messed with some of the modded files to hopefully retain some of the features from Dragon Knight Rising, while making sure Alternate fantasy is not further affected. Definitely not a proper compatibility patch, otherwise I would share, just some patchwork to suit my needs. Hopefully it will work. as I forsee.
 
Hey Tirlititi,
sorry if I ask your help again.
I'm exploring the possibilities offered by Memoria engine and trying to mod Alternate Fantasy to allow summons + normal attacks with ultimate weapons to break the damage limit, using support abilities as described here: https://github.com/Albeoris/Memoria/wiki/Supporting-ability-features

However, in order to keep some balance I would like to reduce the damage exceeding 9999, actually I used this formula to halve damage between 10.000-15.000 and reduce to 1/4 the damage above 15.000:
Code: [Select]
Code:
   if ((_v.Target.HpDamage > 9999) && (_v.Target.HpDamage < 15001))    _v.Target.HpDamage = 9999 + (_v.Target.HpDamage - 9999) / 2;   if (_v.Target.HpDamage > 15000)    _v.Target.HpDamage = 12500 + (_v.Target.HpDamage - 15000) / 4;
I made this work by rewriting a part of Memoria SBattlecalculator.cs in Alternate Fantasy Commonscript.cs to bypass the normal CalcPhysicalHpDamage() function. The result is not very linear (I actually haven't a 100% awareness of what I copy-pasted) but actually seems to work as intended without major bugs:

Code: [Select]
Code:
using System;using Memoria.Data;namespace Memoria.Scripts.Battle{ public static class CommonScript {  public const String InfoMessageColor = "[00FFFF]";  public const String GoodMessageColor = "[00FFFF]";  public const String BadMessageColor = "[FF4040]"; }  public abstract class BaseWeaponScript : IBattleScript {  private readonly BattleCalculator _v;  private readonly CalcAttackBonus _bonus;  private readonly Boolean _drain;  protected BaseWeaponScript(BattleCalculator v, CalcAttackBonus bonus, Boolean drain = false)  {   _v = v;   _bonus = bonus;   _drain = drain;  }  public virtual void Perform()  {   if (_drain && (!_v.IsCasterNotTarget() || !_v.Target.CanBeAttacked()))    return;   _v.PhysicalAccuracy();   if (!_v.TryPhysicalHit())    return;      if (_bonus != CalcAttackBonus.Level)    _v.WeaponPhysicalParams(_bonus);   else   {    Int32 baseDamage = GameRandom.Next16() % (1 + (_v.Caster.Level + _v.Caster.Strength >> 3));    _v.Context.AttackPower = _v.Caster.WeaponPower;    _v.Target.SetPhysicalDefense();    if (_v.Caster.Weapon == (RegularItem)256)    {     _v.Context.AttackPower += 3 * _v.Caster.Level / 4;     if (_v.Target.IsPlayer && _v.Target.PlayerIndex == CharacterId.Garnet)      _v.Target.Flags |= CalcFlag.HpRecovery;    }    else    {     _v.Context.AttackPower += _v.Caster.Level / 2;    }    _v.Context.Attack = _v.Caster.Strength + baseDamage;   }      if (_v.Caster.IsUnderAnyStatus(BattleStatus.Mini))    _v.Context.Attack = 1;   if (_v.Caster.IsUnderAnyStatus(BattleStatus.Berserk))    ++_v.Context.DamageModifierCount;   if (_v.Caster.IsUnderAnyStatus(BattleStatus.Trance))    ++_v.Context.DamageModifierCount;   if (_v.Target.IsUnderAnyStatus(BattleStatus.Defend))    --_v.Context.DamageModifierCount;   if (_v.Target.IsUnderAnyStatus(BattleStatus.Protect))    --_v.Context.DamageModifierCount;   if (_v.Target.IsUnderAnyStatus(BattleStatus.Sleep))    ++_v.Context.DamageModifierCount;   if (_v.Target.IsUnderAnyStatus(BattleStatus.Mini))    ++_v.Context.DamageModifierCount;   if (_drain)    _v.PrepareHpDraining();  if (_v.Caster.Weapon == (RegularItem)15) //I still have to add other final weapons   {            _v.CalcDamageCommon();            _v.Target.HpDamage = _v.Context.EnsureAttack * _v.Context.EnsurePowerDifference;                  if (_v.Target.Flags != 0)                  {                    Single modifier_factor = 1.0f;                    Single modifier_bonus = 0.5f;                    Byte modifier_index = 0;                        if (_v.Caster.IsUnderAnyStatus(BattleStatus.Trance) && _v.Caster.PlayerIndex == CharacterId.Steiner)                            modifier_bonus = 1.0f;                        while (_v.Context.DamageModifierCount > 0)                        {                            modifier_factor += modifier_bonus;                            modifier_index++;                            if (modifier_index >= 2)                            {                                modifier_bonus *= 0.5f;                                modifier_index = 0;                            }                            --_v.Context.DamageModifierCount;                        }                     while (_v.Context.DamageModifierCount < 0)                     {                        modifier_factor *= 0.5f;                        ++_v.Context.DamageModifierCount;                     }                     if ((_v.Target.Flags & CalcFlag.HpAlteration) != 0)                     {                        _v.Target.HpDamage = (Int32)Math.Round(modifier_factor * _v.Target.HpDamage);   if ((_v.Target.HpDamage > 9999) && (_v.Target.HpDamage < 15001))    _v.Target.HpDamage = 9999 + (_v.Target.HpDamage - 9999) / 2;   if (_v.Target.HpDamage > 15000)    _v.Target.HpDamage = 12500 + (_v.Target.HpDamage - 15000) / 4;                        if ((_v.Target.Flags & CalcFlag.HpRecovery) != 0)                        {                        _v.Target.HpDamage = btl_para.SetRecover(_v.Target, (UInt32)_v.Target.HpDamage);               _v.Target.FaceTheEnemy();                        }                     }        }      }  else  {   _v.CalcPhysicalHpDamage();  }   if (_drain)    _v.Caster.HpDamage = _v.Target.HpDamage;  } }}

However I couldn't find a way to handle critical strikes, which double the final damage regardless of my efforts.
Commonscript.cs of Alternate fantasy doesn't contain a call for the "_v.TryCriticalHit()" function, unlike vanilla "baseweaponscript.cs", that is only coded in SBattleCalculator.cs and seems to be applied after the damage calculation (if I end my function setting targethpdamage to a fix "100", a critical strike inflicts "200" damage).
What I would like to do is to calculate the *2 damage of critical hits before my damage reduction formula, so that a 5000x2 critical is handled normally but a 10000x2 one deals way lesser damage.

There is any way to do this?
A BIG thank you in advance  :)
 
Last edited:
Hi,
Fortunatly, that shouldn't be too hard. You only need to emulate the method "TryCriticalHit" and change the increase formula it uses.
Code: [Select]
Code:
// In your "CommonScript.cs" public static void TryCriticalHitAdjusted(BattleCalculator _v) {  Int32 quarterWill = _v.Caster.Data.elem.wpr >> 2;  if (quarterWill != 0 && (Comn.random16() % quarterWill) + _v.Caster.Data.critical_rate_deal_bonus + _v.Target.Data.critical_rate_receive_bonus > Comn.random16() % 100)  {   _v.Target.HpDamage = (Int32)(_v.Target.HpDamage / 4f + Math.Min(15000, _v.Target.HpDamage) / 4f + Math.Min(10000, _v.Target.HpDamage) / 2f);   // Do the same for "_v.Target.MpDamage"; apparently you don't use "_v.Context.Attack" in your situation when the critical strike triggers   _v.Target.Flags |= CalcFlag.Critical;  } }
And then you use "CommonScript.TryCriticalHitAdjusted(_v)" in place of "_v.TryCriticalHit()".
I think the rounding in my formula is correct, but you'd better check how it behaves exactly in practice to be sure about it.
 
Status
Not open for further replies.
Back
Top