• Welcome to Freedom Reborn Archive.
 

FFX 3.2.2 Update

Started by TaskMasterX, April 07, 2008, 02:44:09 PM

Previous topic - Next topic

TaskMasterX

I finally finished the Grapple Mod and decided that, since it's been nearly 10 months since the release of anything FFX-related, I'd bundle it together with all the other things members of the FFX team have done since then.

I made a video showing the Grapple Mod in action:

http://www.youtube.com/watch?v=gm7hWXt48I0

I updated the online manual at ffx.freedomforceforever.com

You can download the update here:
FFX 3.2.2.zip
Please read the ReadMe before installing. I tried to minimize overwriting custom data so you'll need to merge the .dat files and copy and paste the strings.txt text to your strings.txt and then Generate Language Files in FFEdit.

Here's a list of the Fixes, Updates, and New Features:
Fixes:
- Corrected COST_FREEZE= to COST_FROZEN= in ffx.py. Most of the state swaps were looking for COST_FROZEN and would give an error if the Frozen State was used for the swap. Changed Breach State Swap to use COST_FROZEN.
- Corrected entries for Megablast and Angelic Ally FFX_FEATSPERSONAL list in ffxdefault.py
- Fixed Metabolic Speed so a character who also has Energy Tanks, Energy Redirection or Volatile Storage doesn't get a bonus at the start of the mission without absorbing any Energy above the normal 100.
- Fixed Polymorph tactic
- Changed entry in m25custompowers.specialtypestring={} from 'energize' to 'energise' so AI can use Energized Power Swaps correctly

Updates:
- Added Stasis to Crystallise State Swap
- Added Stasis to Sleep State Swap
- Added Limeylure to Sleep Swap
- Added Speed Increase to Gravity Increase State Swap
- Added Speed Increase to Mental Damage State Swap
- Updated Body Snatch State Swap so the possessed target will have the proper reactions to other teams
- Updated scripted Grim Resolve to be removable
- Updated scripted Shake It Off to be removable
- Added 'darkforce' subtype to Power Absorber Attribute, so Power Absorbers can duplicate (or steal) darkforce powers.
- Updated Transmute Swap so targets that are flying fall to the ground after being transmuted to objects.
- Updated Sleep Swap so targets that are flying fall to the ground when they fall asleep.
- Updated Throw State Swap to work better with large meshes.
- Updated Strong Leaper Combo Attribute to include Heavy Footed.
- Updated Amplifier Attribute which now works against Mental and Mystical targets. Amplifier can now be resisted by comparing Energy Stats of Target and Amplifier. If Amplifier fails, then damage is inflicted upon him/her equal to the Energy Stat of the Target.
- Updated Driver/Vehicle Attribute
- Updated Rally to Heal Swap to heal more damage to targets and to remove the rally FX and added Buoyancy to Heal, Speed Increase to Heal, Energize to Heal and Energy Surge to Heal Swaps
- Updated HasActiveDefenceActive() to use hero file power name for the Active Defense rather than the one created in powers.dat
- Decreased AI_DEFAULTTIMER = 1, AI_AUTOTIMER = 0.5, BRAWL_TIMER = 0.5 to improve AI reaction time, ecspecially after getting up from KB and after landing
- Added Subtypes: 'asleep', 'tangled', 'grappled', 'grappler', and updated 'staticked' and 'stasis' to include the 'tangled' and 'grappled' subtypes
- Remarked out line if js.Object_GetPrimaryState(object) == js.PCSTATE_ENRAGED: reaction=TARGET_ANY so Enraged AI characters attack closest target rather than stand around
- Updated Target_CheckForAlteredReaction() to check for Hypnosis State Swap before swapping reactions
- Updated default minimum range for the RangedExplosive tactic from Melee to Short Range

New Features:
- Added Battle Computer Attribute
- Added Body Armor Attribute
- Added Power Reserve Attribute
- Added Genetic Symbiote Attribute
- Added Free Spirit Attribute
- Added FF Active Defense Attribute
- Added Wrestler Attribute
- Added Life Drain with Mind Control Swap
- Added Possession with Powers Swap
- Added Hypnosis Swap
- Added Throw2 State Swap which works like the Throw Command but works on characters
- Added Grapple State Swap for Wrestling Holds
- Added Ranged Grapple State Swap for ranged ensnarement attacks that locks both grappler and target and can deal damage over time
- Added Tangle State Swap which drops fliers, plays an FX loop on the target, and allows the target chances to break free every few seconds
- Added Explosive Tangle State Swap which triggers a custom explosion after holding the target a few seconds
- Added isAlly function
- Added increaseStrengthAndInvulnerability function
- Added AI Tactic for Free Spirit
- Added AI Tactic for FF Active Defense
- Added AI Tactic for Power Reserver




GogglesPizanno


catwhowalksbyhimself

That's a lot of new stuff there!

If I knew you were working on this, though, I could have contributed the new Energy Cannisters I have working now, but those probably won't be used much anyway.

Great work.

Xenolith

Nice!

I'm getting a new computer, so this a perfect time to start from scratch.

USAgent

Great update Taskmaster, A ton of useful stuff here. 
(so many hero files to go over now....so so many...)

I am having problems with that link though, is anybody else?

catwhowalksbyhimself

The ftp link isn't working for me, but the main one to the site is, and you can find it there.

Epimethee

The link is invalid; pasting it manually malkes it valid, but you'd need the FTP login and password. Instead, change the link to an http one:
http://ffx.freedomforceforever.com/downloads/FFX%203.2.2.zip

lmalonsof

These are great news!!!

Once again, congratulations to all of you who make possible FFX. :thumbup:

TaskMasterX

Whoops! Sorry about that. I was in a bit of a hurry in trying to finish that post. Thanks for providing the correct link, Ep. I fixed the first link as well.

USAgent

Thanks for the updated link.

Quote from: catwhowalksbyhimself on April 07, 2008, 08:25:31 PM
The ftp link isn't working for me, but the main one to the site is, and you can find it there.
I searched around and didnt come across it anywhere there. The downloads section had FFX 3.2 as the latest.

catwhowalksbyhimself

I may have been wrong there.

That needs to be fixed.  I'll probably look into it if no one else does.

yell0w_lantern

I can add opponents to my battle computer and I get a little bonus sign over the guy but I don't get any custom commands for the FFEdit-designed powers I made.
### Battle Computer
FFX_BATTLECOMPUTER_CUSTOM=[
["default","","","","",300,"","","",""],
["types","UDatabase Entry1","UDatabase Entry2","UDatabase Entry3","UDatabase Entry4","iRadius","CCommand1","sPower1","CCommand2","sPower2"],
["iron_man","","","","",300,"UNIBEAM","iron_man unibeam1","REPULSORS","iron_man repulsors1"],
]

TaskMasterX

Thanks YL,
It looks like BC might need to be updated. I think the FFX team has some other neat stuff to add, so we may be re-releasing this as FFX 3.3. Stay tuned!

EDIT:
I was able to do a quick fix for BC. Replace the entire Battle Computer code with this and it should work. There shouldn't be any rally or Plus sign FX effect anymore and you should get you commands:
[spoiler]############################## BATTLE COMPUTER ########################################
# Allows the character to have a database of up to 4 characters. When the character
# is within range of one of these characters, they get +2 agility and two new commands
# that appear only on the target and can be used to simulate the character's existing powers
# but with higher accuracy, speed, magnitude, stun, etc.
# The character can also add one target to the database during a mission for a total of
# 5 database entries.
# -TaskmasterX
#######################################################################################

def initbattlecomputer(char,update):
    RegTimer('enemyCheck',1,0,char)
    FFX_ObjectSetAttr(char,'computer_on',0)
    FFX_ObjectSetAttr(char,'battleComputer',1)
    objects = Mission_GetObjects()
    for obj in objects:
        if ((Object_GetClass(obj)&FFX_CHARACTER)!=0) & (obj!=char):
            Mission_CustomAction('ADD_TARGET_TO_DATABASE',char,obj,'studyTarget',30,0)

def studyTarget(obj,char):
    dbEntry1=getByTemplate(char,FFX_BATTLECOMPUTER_CUSTOM,1)
    dbEntry2=getByTemplate(char,FFX_BATTLECOMPUTER_CUSTOM,2)
    dbEntry3=getByTemplate(char,FFX_BATTLECOMPUTER_CUSTOM,3)
    dbEntry4=getByTemplate(char,FFX_BATTLECOMPUTER_CUSTOM,4)
    target=getTargetname(obj)
    if (dbEntry1==target) | (dbEntry2==target) | (dbEntry3==target) | (dbEntry4==target):
        Mission_StatusText('target is already in Battle Computer!')
        return
    if FFX_ObjectGetAttr(obj,'addedToDB')!=0:
        FFX_ADD_TARGET_TO_DB = target
        dbEntry5=FFX_ADD_TARGET_TO_DB
        if dbEntry5==target:
            Mission_StatusText('target is already in Battle Computer!')
            return
    Mission_StatusText('adding target to Battle Computer...')
    FFX_ObjectSetAttr(obj,'addingToDB',1)
    RegTimer('checkRangeBC',1,0,char,obj)
    RegTimer('addTargettoDB',10,0,char,obj)
    RegTimer('checkEnergyUseBC',1,0,char,obj)
    RegCharState(char,PCSTATE_BLANK,'battleComputerFail',0,0,obj)
    RegCharState(char,PCSTATE_EXILE,'battleComputerFail',0,0,obj)
    RegCharState(char,PCSTATE_STATIC,'battleComputerFail',0,0,obj)
    RegCharState(char,PCSTATE_ENRAGED,'battleComputerFail',0,0,obj)
    RegCharState(char,PCSTATE_HYPNOTISED,'battleComputerFail',0,0,obj)
    RegCharState(char,PCSTATE_PANICKED,'battleComputerFail',0,0,obj)
    RegCharState(char,PCSTATE_STUNNED,'battleComputerFail',0,0,obj)

def battleComputerFail(event):
    char=event.object
    obj=event.string
    Mission_StatusText('Battle Computer failed! try again')
    FFX_ObjectSetAttr(obj,'addingToDB',0)
    FFX_ObjectSetAttr(obj,'addingToDBFailed',1)

def checkEnergyUseBC(event):
    char=event.object
    obj=event.string
    if FFX_ObjectGetAttr(obj,'addingToDBFailed')==1:
        return
    if FFX_ObjectGetAttr(obj,'addedToDB')==1:
        return
    if FFX_ObjectGetAttr(char,'battleComputer')==1:
        FFX_ObjectSetAttr(char,'ivlasteng',Object_GetAttr(char,'energyPoints'))
        FFX_ObjectSetAttr(char,'battleComputer',0)
    energy=Object_GetAttr(char,'energyPoints')
    lastenergy = FFX_ObjectGetAttr(char,'ivlasteng')
    if energy<lastenergy:
        if FFX_ObjectGetAttr(obj,'addingToDB')!=0:
            Mission_StatusText('you used energy the Battle Computer needs! try again!')
            FFX_ObjectSetAttr(obj,'addingToDB',0)
            FFX_ObjectSetAttr(obj,'addingToDBFailed',1)
    else:
        RegTimer('checkEnergyUseBC',0.1,0,char,obj)
    FFX_ObjectSetAttr(char,'ivlasteng',Object_GetAttr(char,'energyPoints'))

def checkRangeBC(event):
    char=event.object
    obj=event.string
    if FFX_ObjectGetAttr(obj,'addingToDBFailed')==1:
        return
    pos1 = Get_ObjectPos(char)
    pos2 = Get_ObjectPos(obj)
    dist = cshelper.distance2D(pos1, pos2)
    radius=getByTemplate(char,FFX_BATTLECOMPUTER_CUSTOM,5)
    if FFX_ObjectGetAttr(obj,'addedToDB')==1:
        return
    if dist > radius:
        if FFX_ObjectGetAttr(obj,'addingToDB')!=0:
            Mission_StatusText('target is out of range and can not be added to Battle Computer! try again!')
            FFX_ObjectSetAttr(obj,'addingToDB',0)
            FFX_ObjectSetAttr(obj,'addingToDBFailed',1)
    if dist < radius:
        RegTimer('checkRangeBC',1,0,char,obj)

def addTargettoDB(event):
    char=event.object
    obj=event.string
    if FFX_ObjectGetAttr(obj,'addingToDBFailed')==1:
        FFX_ObjectSetAttr(obj,'addingToDBFailed',0)
        return
    else:
        if FFX_ObjectGetAttr(obj,'addingToDB')!=0:
            FFX_ObjectSetAttr(obj,'addedToDB',1)
            FFX_ADD_TARGET_TO_DB = obj
            Mission_StatusText('successfully added target to Battle Computer!')
        else:
            Mission_StatusText('target failed to be entered into Battle Computer! try again!')
            FFX_ObjectSetAttr(obj,'addingToDB',0)

def enemyCheck(event):
    char=event.object
    if Object_IsAlive(char)==0:
        return
    radius=getByTemplate(char,FFX_BATTLECOMPUTER_CUSTOM,5)
    radius2=radius*radius
    RegTimer('enemyCheck',3,0,char)
    if FFX_ObjectGetAttr(char,'computer_on')!=0:
        return
    else:
        for obj in Mission_GetDynamicObjects():
            if ((Object_GetClass(obj)&FFX_CHARACTER!=0)) & (obj!=char) & ((Object_GetClass(obj)&js.OC_TERRAIN)==0) & ((Object_GetClass(obj)&js.OC_VEHICLE)==0) & ((Object_GetClass(obj)&js.OC_BUILDING)==0) & ((Object_GetClass(obj)&js.OC_GENERIC)==0):
                d=distanceSq(obj,char)
                if d<radius2:
                    target=getTargetname(obj)
                    lookupTargetinBattleComputer(char,target,obj)

def lookupTargetinBattleComputer(char,target,obj):
    dbEntry1=getByTemplate(char,FFX_BATTLECOMPUTER_CUSTOM,1)
    dbEntry2=getByTemplate(char,FFX_BATTLECOMPUTER_CUSTOM,2)
    dbEntry3=getByTemplate(char,FFX_BATTLECOMPUTER_CUSTOM,3)
    dbEntry4=getByTemplate(char,FFX_BATTLECOMPUTER_CUSTOM,4)
    cmd1=getByTemplate(char,FFX_BATTLECOMPUTER_CUSTOM,6)
    cmd2=getByTemplate(char,FFX_BATTLECOMPUTER_CUSTOM,8)
    team=m25ai.GetTeam(obj)
    myTeam=m25ai.GetTeam(char)
    if FFX_ObjectGetAttr(obj,'addedToDB')!=0:
        FFX_ADD_TARGET_TO_DB = target
        dbEntry5=FFX_ADD_TARGET_TO_DB
        if dbEntry5==target:
            if myTeam!=team:
                Mission_CustomAction(cmd1,char,obj,'bcPower1',30,0)
                Mission_CustomAction(cmd2,char,obj,'bcPower2',30,0)
                FFX_ObjectSetAttr(char,'computer_on',1)
                agility=Object_GetAttr(char,'templateAgility')
                newAgility=Object_GetAttr(char,'templateAgility')+2
                Object_SetAttr(char,'agility',newAgility)
                agl=Object_GetAttr(char,'agility')
                Mission_StatusText('battle computer detected known enemy in range')
                RegTimer('trackTarget',1,0,char,obj)
                return
    if (dbEntry1==target) | (dbEntry2==target) | (dbEntry3==target) | (dbEntry4==target):
        if myTeam!=team:
            Mission_CustomAction(cmd1,char,obj,'bcPower1',30,0)
            Mission_CustomAction(cmd2,char,obj,'bcPower2',30,0)
            FFX_ObjectSetAttr(char,'computer_on',1)
            agility=Object_GetAttr(char,'templateAgility')
            newAgility=Object_GetAttr(char,'templateAgility')+2
            Object_SetAttr(char,'agility',newAgility)
            agl=Object_GetAttr(char,'agility')
            Mission_StatusText('battle computer detected known enemy in range!')
            RegTimer('trackTarget',1,0,char,obj)

def bcPower1(target,char):
    pwr1=getByTemplate(char,FFX_BATTLECOMPUTER_CUSTOM,7)
    Trigger_Power(char,target,pwr1,'')

def bcPower2(target,char):
    pwr2=getByTemplate(char,FFX_BATTLECOMPUTER_CUSTOM,9)
    Trigger_Power(char,target,pwr2,'')

def trackTarget(event):
    char=event.object
    obj=event.string
    if Object_IsAlive(obj)==0:
        return
    if Object_IsAlive(char)==0:
        return
    dbEntry1=getByTemplate(char,FFX_BATTLECOMPUTER_CUSTOM,1)
    dbEntry2=getByTemplate(char,FFX_BATTLECOMPUTER_CUSTOM,2)
    dbEntry3=getByTemplate(char,FFX_BATTLECOMPUTER_CUSTOM,3)
    dbEntry4=getByTemplate(char,FFX_BATTLECOMPUTER_CUSTOM,4)
    pos1 = Get_ObjectPos(char)
    pos2 = Get_ObjectPos(obj)
    dist = cshelper.distance2D(pos1, pos2)
    radius=getByTemplate(char,FFX_BATTLECOMPUTER_CUSTOM,5)
    if dist > radius:
        Mission_StatusText('enemy out of range of battle computer!')
        removeBCBonus(char,obj)
    if dist < radius:
        RegTimer('trackTarget',1,0,char,obj)

def removeBCBonus(char,obj):
    cmd1=getByTemplate(char,FFX_BATTLECOMPUTER_CUSTOM,6)
    cmd2=getByTemplate(char,FFX_BATTLECOMPUTER_CUSTOM,8)
    Mission_RemoveCustomAction(cmd1,char,obj)
    Mission_RemoveCustomAction(cmd2,char,obj)
    FFX_ObjectSetAttr(char,'computer_on',0)
    agility=Object_GetAttr(char,'templateAgility')
    Object_SetAttr(char,'agility',agility)

def getTargetname(obj):
    temp=FFX_GetTemplate(obj)
    name=GetRootName(temp)
    return name
[/spoiler]

yell0w_lantern

It got rid of the rally/plus sign but I'm still not getting any custom commands. Would it make a difference that my character is a built-in? I suppose I could re-run the power ID utility and see if that helps.

TaskMasterX

I'm not sure. I'll run a test on my end. Does it work with one of your customs? Thanks for testing this, YL,

yell0w_lantern

No, it doesn't work with a custom character either.  :(

TaskMasterX

I made a copy of liberty_lad in FFEdit and renamed it battle_computer_lad and loaded him up in M25's Team Mode. I did get my commands on the first target I added to the database, but even though I got notifications that the other targets I added were added successfully, I never got the commands on them, they remained on the 1st target. So there's certainly a bug in there, but you should be getting commands on at least your 1st target. I noticed that you didn't add any targets in your customization for targets that are already in the database at the start of the mission. This is fine as it should work that way, too, but what if you add in some hero file or built-in names to your customization in ffxcustom2. Do you still not get any commands on them? Are you sure you have the name of the built-in spelled exaclty the same as you have it in the customization? Do you get any errors in the script.log?

TaskMasterX

Okay, I fixed Battle Computer (I think) and gave it a rehaul. Instead of getting 4 slots for existing targets and having the ability to add one during a mission, now you have a total of 5 slots that you can place targets in to have at the beginning of the mission (or you can have all or some of your slots empty at the beginning) and you can overwrite them with new ones during a mission. You can overwrite slots as many times as you want during a mission.
When using the Add Target to Database command on a target, you then rt.-click on the target again and get a list of slots 1-5. If you've added targets in your Battle Computer in ffxcustom2.py, then their name will appear in that slot (i.e. Slot 1: Captain America, Slot 2: Daredevil, Slot 3: , Slot 4: , Slot 5: )
Click the slot you want to add the target too. You can choose an empty slot or overwrite and existing target's slot. The newly added target's name will then replace the ones you overwrote or be added to the empty slot.
Once a target is overwritten, that target must be re-entered into the database to get the bonuses against that character, even if they are in the ffxcustom2.py customization list. Now, of course, if you restart the mission then the targets in the ffxcustom2.py list will again be the default targets in the database.
If, during the process of overwriting a target with a new target, you get stunned, or enraged, etc., the Battle Computer will corrupt the data of the original target and not be able to add the new data. You no longer get the bonus against the original target but the entry is still there in the slot. So basically it's an empty slot, but still shows the name of the original target. You can re-enter new data into that slot.
Basically everything else works the same.

You can download the fix here:
Battle Computer Update

Make sure you update your existing customization for Battle Computer in the new ffxcustom2.py file to have 5 slots for targets instead of 4.

daglob

Um... I think I did something wrong.

The game locks up when it finishes precaching data. I mean, it stops dead. It didn't before I installed the update.

In the character creation section, all the new attributes say "ATTRIB_[attribute name]", and when you select one, the description box says "ATTRIB_[attribute name]_DESC".

I did save the original copies of the files, so going back isn't a problem, but I don't know what I did wrong, so I don't know how to fix it when I re-install the update.

TaskMasterX

Quote from: daglob on April 21, 2008, 11:33:59 AM
Um... I think I did something wrong.

The game locks up when it finishes precaching data. I mean, it stops dead. It didn't before I installed the update.

In the character creation section, all the new attributes say "ATTRIB_[attribute name]", and when you select one, the description box says "ATTRIB_[attribute name]_DESC".

I did save the original copies of the files, so going back isn't a problem, but I don't know what I did wrong, so I don't know how to fix it when I re-install the update.
Remember that you need to merge the new .dat files and strings.txt, not replace your existing ones with them. If this isn't the issue, then please post your script.log.

GogglesPizanno

You also need to regenerate the Strings DAT file once you update the strings.txt file. Thats what would cause the "ATTRIB_[attribute name]" issue.

daglob

Quote from: GogglesPizanno on April 21, 2008, 01:11:25 PM
You also need to regenerate the Strings DAT file once you update the strings.txt file. Thats what would cause the "ATTRIB_[attribute name]" issue.

How does one do that?

I did merge and not replace.

TaskMasterX

Quote from: daglob on April 21, 2008, 03:03:09 PM
Quote from: GogglesPizanno on April 21, 2008, 01:11:25 PM
You also need to regenerate the Strings DAT file once you update the strings.txt file. Thats what would cause the "ATTRIB_[attribute name]" issue.

How does one do that?

I did merge and not replace.
After copying and pasting the text from strings.txt into your strings.txt, open FFEdit and click the Generate Language Files button. It could take awhile, so go walk your hamster, pack a trek-dak, or do whatever it is you do to waste time. ^_^

Now, I don't see not generating your language files as the issue of the game locking up, so you may still need to post your script.log and FF.log.

daglob

Ah! Okay, that is the problem: I click that button and nothing happens. The file dates are the same as they were before, no hourglass by the cursor, no nothing.

I have both the input and outpur directories set to the same one, the one with the stings.txt file in it, as are the strings, captins, and speech files.

...and how does one access the Arnim Zola attribute?

TaskMasterX

Quote from: daglob on April 22, 2008, 09:46:39 PM
Ah! Okay, that is the problem: I click that button and nothing happens. The file dates are the same as they were before, no hourglass by the cursor, no nothing.

I have both the input and outpur directories set to the same one, the one with the stings.txt file in it, as are the strings, captins, and speech files.

...and how does one access the Arnim Zola attribute?
Hmm. Nothing happens when clicking the Generate Language Files button? If, when you open FFEdit, you scroll down to the bottom of the FFEdit window, you should see a blank, grey, text field. You should be able to click the Generate Language Files button and then see text stating what language file is being generated. This is the only visual confirmation that anything might be happening while Generating Language Files. Also, when you checked the file dates, did you just check the strings.txt or did you look at the strings.dat?

To access the Arnim Zola Attribute, which is an FFX Combo Attribute, you'll need to add arnimzola to your Attributes tab in FFEdit and make sure it's added into your ffxmulti.py file.

yell0w_lantern

Use M25's language generator - it is much faster.

daglob

Strings.txt, which I edited, has a recent date (4/13, I think), all the .dat files have a date from last year.

I moved the slider to the bottom of the page, and discovered that it is giving me an error message that is hidden with the usual view. It is saying that it has troulbe copying string.txt to the directory. I guess that means that I need the file in a separate directory to do this. Let me try that and see what happens.

Is there a tutorial for the M25 language generator or adding those attributes?

Bear with me, guys. When I went to college, computers where things that had their own building, and us commercial art majors never went in there 'cause, like, what could it possibly do for us?

Bill

GogglesPizanno

QuoteBear with me, guys. When I went to college, computers where things that had their own building, and us commercial art majors never went in there 'cause, like, what could it possibly do for us?

Blink a lot and look pretty?

I haven't used the M25 generator but I hear it works well and is really quick.

As for using FFEdit, there is a quirk to it in that you need the destination to be somewhere else (there is a way to like leave the line blank or something but I don't remember) - anyway what i normally do is choose the path to the language files and then for the target I just choose some temp folder on my desktop. Then they generate (it will look like the app froze up) and then when its done I just copy them from the temp directory back to the lang directory.

See i could use M25's fancy sleek new machine, but as lazy people, "what could it possibly do for us?"

;)

yell0w_lantern

Well, for one thing, it doesn't take 10 minutes to compile the DATs.

stumpy

I typically leave the Input Directory blank and specify the Output Directory as the Lang\English folder of the current mod (where the strings.txt file is). That way, FFEdit takes its input as the strings.txt of the current mod (as determined by the Primary Data Path) and sends the output strings.dat to the folder specified without trying to copy strings.txt over itself.