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

Pages: [1] 2 3 4 5 6 ... 37
1
Hello.
That would be done using Memoria sequence files. You can read the documentation about them there: https://github.com/Albeoris/Memoria/wiki/Battle-SFX-Sequence.
Most likely, you'd want to start by using existing attack animation sequences, like the one from Fire Sword, and tweak it to do something else. That animation sequence looks like that for example:
Code: [Select]
// Player sequence of SFX Fire_Sword

WaitAnimation: Char=Caster
Turn: Char=Caster ; BaseAngle=AllTargets ; Time=5
Message: Text=[MagicSword] ; Priority=1 ; Title=True ; Reflect=True
SetupReflect: Delay=SFXLoaded
LoadSFX: SFX=Fire_Sword ; MagicCaster=Vivi ; Reflect=True
Turn: Char=Vivi ; BaseAngle=Caster ; Time=5
PlayAnimation: Char=Vivi ; Anim=MP_IDLE_TO_CHANT
WaitAnimation: Char=Vivi
PlayAnimation: Char=Vivi ; Anim=MP_CHANT ; Loop=True
Channel: Char=Vivi
WaitSFXLoaded: SFX=Fire_Sword ; Reflect=True
WaitAnimation: Char=Vivi
StopChannel: Char=Vivi
PlayAnimation: Char=Vivi ; Anim=MP_MAGIC
WaitAnimation: Char=Vivi
Turn: Char=Vivi ; BaseAngle=Default ; Time=4
PlayAnimation: Char=Caster ; Anim=MP_SET
WaitAnimation: Char=Caster
PlaySFX: SFX=Fire_Sword ; Reflect=True
MoveToTarget: Char=Caster ; Target=AllTargets ; Distance=600 ; UseCollisionRadius=True ; Anim=MP_RUN
Turn: Char=Caster ; BaseAngle=AllTargets ; Time=10
WaitMove: Char=Caster
MoveToTarget: Char=Caster ; Target=AllTargets ; Distance=0 ; UseCollisionRadius=True ; Anim=MP_RUN_TO_ATTACK
WaitMove: Char=Caster
PlayAnimation: Char=Caster ; Anim=MP_ATTACK
Wait: Time=5
PlayAnimation: Char=Caster ; Speed=0
Wait: Time=20
MoveToPosition: Char=Caster ; AbsolutePosition=Default ; Anim=MP_BACK
Turn: Char=Caster ; BaseAngle=Default ; Time=4
WaitMove: Caster
PlayAnimation: Char=Caster ; Anim=Idle
WaitTurn: Char=Caster
WaitSFXDone: SFX=Fire_Sword ; Reflect=True
ActivateReflect
WaitReflect
(fetched from there)

Note that the section "Party -> Special -> Ability Availabilities" can bug in the current version of Hades Workshop. If I recall correctly, if you modify both that section and the "Interface -> UI Texts", then the HWS mod file saved cannot be loaded by Hades Workshop anymore (it randomly crashes). That's a bug that will be fixed hopefully in the next update.
That section is meant to deal with the conditions that makes abilities castable, not their casting animations.

Good luck.

2
FF9 Tools / Re: [PC] Save editor - Memoria (0.6.3.1)
« on: 2025-09-11 14:47:26 »
I tried looking at that some time ago but the way the save editor is built is difficult to adapt to the Memoria Engine updates. Memoria Save Editor changes the datas with their specific binary adresses, which is adapted to the PSX saves but not so much to the PC saves (and even less to the Memoria Engine saves). It would require a somewhat important re-work of the editor's data management :/

3
Hello. Here's the answer I made a couple of days ago to that same question:
Quote
I've never tested on real hardware, but normally it doesn't work, as there are security checks that are performed on real hardwares and not on most emulators.
There should be tools to fix that though. Again, I have not tested it, but this tool should do that: https://www.romhacking.net/utilities/1264/
(1st patch the game's BIN with Alternate Fantasy, then run error_recalc on it, then burn the result onto a CD, and that should be fine)

4
Hello. Double magics can be setup by using a file "DictionaryPatch.txt" in a mod.
More infos there: https://github.com/Albeoris/Memoria/wiki/Dictionary-Patch

5
@iamthehorker: Hello. That's the link now. Dropbox indeed changed its URL format several years ago.
The Collector

6
It might be related to the SFXRework mode.
Alternate Fantasy is not fully compatible with the option "SFXRework = 0" since a long time, but these incompatibilities only get more and more important with each version. You need to have "SFXRework = 1" in your Memoria.ini for that kind of things.

7
Hello.
Yes, there has been problems with Alternate Fantasy for the past few days, since the latest release of Memoria. That version of Memoria (v2025.05.12) broke compatibility with a few mods, including Alternate Fantasy, and we had to update them.

So now, Alternate Fantasy should be compatible again, but you need to have everything updated: Memoria v2025.05.12 and Alternate Fantasy v6.8.
Alternatively, you should have no problem if you kept Alternate Fantasy v6.6 and Memoria v2024.12.04, but rather update everything.

8
From my experience, there is no module compression by default in FF9, but it may be that some ISO are shared with a patch that add such compression (decades ago, there was a "Paradox patch" of the french ISO that used RNC to compress a part of the menu modules).

9
Duplicate the file "FF9_Launcher.bak" in your game's folder and rename the duplicate as "FF9_Launcher.fix".
If you don't find "FF9_Launcher.bak", then duplicate "FF9_Launcher.exe" instead (and still rename it "FF9_Launcher.fix").

That is most likely because you uninstalled the game without disabling the "Fix Steam Overlay" option.

10
Hi.
I'm afraid so, yes. As said, you really need to save on a different file everytime.
It might be that your .hws are not corrupted and the datas can be technically retrieved, but for that I need to dig into what's the problem and I'm not on it yet.

11
Hello.
That looks very complicated. I don't know how you should proceed.
I know why it bugs though: the coordinates in functions "Zidane_Init" are the XZY coordinates on the field. They are of type "Int16" so 65477 must indeed be interpreted as -59, there's no problem there. The problem is that the coordinates used by "MoveCamera" are XY coordinates on the screen. The conversion from field coordinates to screen coordinates is all but straightforward. Maybe you can search for other ways to manipulate the camera there (can you add an offset to the camera that follows the player character? I don't remember).

12
Hello Yerek.
That would be very great. I should be working again on Hades Workshop in a foreseeable future (maybe a month or so), so it can be part of the version after that.
You can contact me on discord (Tirlititi) if that's OK with you. Another possibility is to create a "Pull Request" on github directly.

13
Hi charlie_38.

The entry names are not very trustful in that regard. Entries are named "Region" as soon as they are initialized (most likely in the function "Main_Init") with "InitRegion", while object entries are named according to the "SetModel" line found in their own functions. You need to compile, close and re-open the script editor to have updated entry names.

I guess your problem is only the "InitRegion", as the rest seems correct. An example of region in the vanilla script using the same method as yours is:
Code: [Select]
Function Region8_Init
    SetRegion( ( -44, 1481 ), ( -159, 1237 ), ( 31, 1169 ), ( 88, 1329 ) )
    return


Function Region8_Range
    ifnot ( IsMovementEnabled ) {
        return
    }
    Bubble( 1 )
    return


Function Region8_SpeakBTN
    ifnot ( IsMovementEnabled ) {
        return
    }
    // Whatever happens when interacting while inside the region
    return

14
Hello.

Glad you found the problem, charlie_38. The indexings of statuses are indeed confusing, because of a mistake we did early on that lead to shift the indexing by 1 in some places. Sorry about that.

@Kapten Teo: Thanks. Unfortunatly, there is no easy way to do that. The main problem is that there are enemies with a 10,000 extra HP that should not be taken into account but are there for scripting purposes. For example, Plant Brain's HP, internally, are 11,431 HP instead of 1,431 HP, and then its AI script manages the way it dies. If you raised its HP by 50%, it would go up to 17,146 HP and require 7,146 damage to be killed, way more than the expected 50% bonus.
And there are plenty of enemies like that, and there are also enemies with a slightly different system, which makes things more complicated.
So, except for checking the option "Edit similar enemies", I don't see a way to ease the task for you (and you'll still need to take into account these extra 10,000 HP when they are present).

The HWS are found here ("AF & PCP source files").
However, it's been a while since I didn't update these source files (althoug the Beatrix Mod's HWS is up-to-date because I didn't update the mod since a long time), partly because I need to update Hades Workshop and partly because I think people tend to import the .hws files for compatibility reasons for situations in which compatibility should be handled by the Memoria engine instead. There are situations that prevent compatibility unless "compiling a mix of both mods", but most of the time it's rather a matter of file conciseness and priority choices.
Well, for the Beatrix Mod, I should be the one improving the file conciseness. But there, you have the HWS.

Sorry, I really need to update my mods at some point. I focus on improving Memoria and they are lagging behind.

15
Hello qwepoi. Sorry I didn't see your message earlier.
That's a totally normal behaviour for this final boss:
Spoiler: show
Fate Cross inflicts 1 status ailment that cannot be bypassed to each character. When moving to the next stage (ie. Necron loses an elemental orb), it casts Fate Cross again, which shuffle these statuses amongst the characters. Only for the final phase, all of these statuses are cleared.

16
Mainly, there's Qhimm's discord, although it's not very active concerning FF9, and there's Moogle & Mods: https://discord.gg/b4D9SRG9

Compatibility is not always possible: if a mod decides to give Mage Masher a power of 30 and another mod decides it should be 40, then there's no way to have both be effective at the same time. There are a few ways to try achieving the maximum compatibility with other mods, but no way to make everything compatible with everything. The possibilities are:
1) Make sure that your mod folder contains only the files that are indeed modified. Hades Workshop should do that automatically in most cases.
2) For almost all the CSV files, it is possible to only have the modified entries in the files there. Again, Hades Worshop automatically filters these and only write the entries that were actually modded, but it currently has many flaws in that regard.
3) Same goes with text files (.mes): a MES file that only contains something like [TXID=100][STRT=0,1]And now for something completly different[ENDN] will only change 1 text (of the text block or concerning spell names or item names, etc...) without touching the others. Hades Workshop is rather clumsy for now concerning that aspect.

Still, that's the kind of things you'd not want to do manually, and if you do it's after everything else.

17
No, don't start over: it will be easier to spot that some things are missing (if there are any) rather than doing it all over again, even if you're not far away yet.

18
Hello Charlie_38,

Indeed, the HWS files sometimes bug right now. It is quite irritating because it's the first version of HW that has bugs concerning the save format in a long time and it can (and unfortunatly did) make people lose their mod or parts of it.
So I advise to always save your HWS as a new file everytime you save, instead of overwriting them.

Sometimes, a HWS that usually crashes on load can be opened without crash randomly. That's not the renaming that solved it but something random that I have yet to understand. It may be that a part of your changes were lost in the process as well.
An example of what was reported to be randomly lost is the field script modifications, but only in japanese.
I made a couple of changes in my own mod without noticeable problem myself (even though it's a big mod), but maybe i missed them or maybe the bugs really appear when adding new entries as you saw with texts... In any case, we should be careful.

I saw that the "Party -> Special" panel makes the HWS very unstable indeed. Your details about the bug in the texts may help me to find the issue.

I'll try to update the tool to fix these bugs and catch up with a couple of Memoria features, but somehow it's always delayed.

Sorry about that.

19
I guess devs had some kind of "macros", ie. they only wrote a single line for changing the party formation and that line was converted into all these lines, doing the process step by step in a way that adapts to all situations. That's why it heals everyone even if they didn't join the party yet or why there are "if ( 0 )" blocks that just never happen. I never added a feature for having macros there.

The "VAR_GlobInt" are restricted to a field.
"local" variables are restricted to the entry, so "VAR_LocInt8_0" in the function "Main_Init" is a different variable than "VAR_LocInt8_0" in the function "Zidane_Init".
"global" variables are restricted to the field, so "VAR_GlobInt8_0" in the field "Prima Vista/Cargo Room" is not the same as in the field "Prima Vista/Meeting Room".
Only "general" variables are unrestricted (and they are the ones saved in save games). It would require a lot of work to identify all of the general variables already and I don't advance on that part anymore since a long time.
If you understand what a global or local variable does, you can name it inside the "local variable panel" right above the function's script. It's lines like
Code: [Select]
global int8 {variable_name} VAR_GlobInt8_0
Please don't edit your posts to remove the question after it is solved. It helps other people that read the topic.

20
Hello Asmorano.

That's not a counter-attack, just their unique attack (one of them casts Catastrophe, the other casts Jinx). It is not that unusual to have them run out of MP but indeed that's the most unsatisfying way to get through this battle. Blind is meant to be that annoying, although there are tips to mitigate its effect (only use items on yourself or use them on the only character on your left/right) and the accuracy malus is negated by using things like Free Energy or Quadraslash.
Jinx is indeed a very special ability. The "dummy" effect is the only spell visual effect that is in the game's database but never used and it was used for debugging purpose, but I found it fitting for this fight. It's not exactly Trouble that they inflict to you (they don't attack physically) but it's another kind of damage spreading status, indeed.

There are a couple of fights that have gimmicks like that. The intent there is to make the fight much easier by understanding the gimmick, but also to make it possible to win without understanding the gimmick, so it's not blocking.

There's another occasion to fight Zorn & Thorn in which they have similar abilities, much later in the game. Maybe you'll get it better by then.

21
Hello HopefulTarnished
You can use "GetEntryUniqueID(250)". It converts the special UIDs 250-255 to their number counterpart. Let's say if Zidane is the entry 11 (then Garnet is the entry 13), you can do:
Code: [Select]
if ( GetEntryUniqueID(250) == 11 ) {
    // Zidane is the player character
}
if ( GetEntryUniqueID(250) == 13 ) {
    // Garnet is the player character
}
I have not tested it but I think that should be the way to go.

Good luck too!

22
Sorry, there was a couple of hours with a mismatch between the update of Memoria and the update of Alternate Fantasy; they had to be simultaneously updated this time. Now if you update both Memoria and AF with the latest versions (v2024-08-18 for Memoria and v6.6 for AF), it should work fine.

Most of the time, updates of Memoria shouldn't break compatibility with mods, even heavy gameplay mods like AF, but sometimes we cannot avoid breaking the compatibility (this time, we didn't break compatibility with Trance Seek for example, only AF).

(I answered Yosharian a while ago on Discord but the "Short Range" attacks can still be performed on the back row, that's normal: it's only that they cannot reach far-away enemies like Deathguise and that they deal less damage from the back row, just like the attack command in vanilla)

23
FF9 Tools / Re: Stiltzkin's Bag a FFIX Randomizer Tool
« on: 2024-08-14 10:51:07 »
I think Stilzkin's bag still works. I did a quick test and it seems to be still 100% functional with the latest version of Memoria.

24
Hello RoSoDude.
That's most likely MIPS code indeed. I am not sure that would be feasible by modifying the parts of the MIPS code that are accessible through Hades Workshop but there's a chance it is.

The parts that are accessible and that are indexed correspond to effects of abilities. That code (which was most likely written in C for the PSX version before it got compiled to MIPS) has been ported into C# that can be read there: btl_calc.cs
Having both MIPS and C# there might help you to see how that MIPS is written and maybe identify data banks that would be relevant to change what you want. For example, there are references to BTL_DATA's "cur.hp": the current ATB of each fighter is very close to that field because "cur" is a structure like that:
Code: [Select]
public class POINTS
{
public ushort hp;
public short mp;
public short at;
public sbyte at_coef;
public byte capa;
}
with "at" being the ATB and "at_coef" being its speed (that depends both on Haste/Slow but also on the battle speed configuration).

Unfortunatly, I don't know about the parts that identify whether an animation (SFX) is running or not in MIPS. I guess using a debugger there (to scan the RAM during runtime) would be the best way. You can see the list of different SFX identifiers here; that should help you when looking for that kind of info.

There are functions that handles ATB progression globally, not just each individual "at_coef", but the C# port of it is surely not as close to the original MIPS code as other parts. The following C# method determines if ATB should be advancing (and would ideally be the place you'd add the condition regarding SFX) but is part of the HUD class, which were much more re-factored than other parts of the code:
Code: [Select]
public bool FF9BMenu_IsEnableAtb()
{
if (!this.commandEnable)
return false;
if (FF9StateSystem.Settings.cfg.atb != 1uL)
return true;
if (this.hidingHud)
return this.currentPlayerId == -1 || this.currentButtonGroup == BattleHUD.CommandGroupButton || this.currentButtonGroup == string.Empty;
return this.currentPlayerId == -1 || ButtonGroupState.ActiveGroup == BattleHUD.CommandGroupButton || ButtonGroupState.ActiveGroup == string.Empty;
}

Good luck.

25
You removed the following lines from the base script:
Code: [Select]
    SetTextVariable( 0, 300 ) // Replace "[ITEM=0]" by "Red Stone"
    SetTextVariable( 1, 301 ) // Replace "[ITEM=1]" by "Blue Stone"
    SetTextVariable( 2, 302 ) // Replace "[ITEM=2]" by "Yellow Stone"
    SetTextVariable( 3, 303 ) // Replace "[ITEM=3]" by "Green Stone"

Pages: [1] 2 3 4 5 6 ... 37