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

Pages: 1 [2] 3
26
General Discussion / Proposal: Nibelheim
« on: 2012-05-19 22:45:08 »
Nibelheim is my proposed GUI tool for creating AI scripts for creatures in Final Fantasy VII.

Some of you might be aware of my 'Welder' templates - 'plug and play' pieces of boilerplate script code that could be combined to create hierarchical, semi-randomized enemy AI for difficulty mods and my own, belated 'Rebirth' project. I've been thinking about turning these scrappy pieces of code into something more substantial and actually creating a GUI tool for assembling them together.

Specifically, what I have in mind is a tool broadly modelled on FFXII's gambit controls. For those who never played XII, party AI is managed by stringing together a set of prioritized condition checks, with the highest-ranking true condition winning. For instance, an actor's AI gambits might read:

Code: [Select]
Top priority: If HP < 25%, use potion on self
Mid priority: If ally is KOed, use Life2 on that ally
Low priority: Use attack on random enemy

Normally, the actor will hit random creatures with their weapon, but if an ally is taken down, reviving them takes priority. However, if the actor is in critical health, healing becomes most important, even if other allies are knocked out.

Nibelheim would handle similar decision trees, possibly with a flowchart UI:


What's the scope of what Nibelheim would create?

I'm not looking to create a high-level, Turing-complete scripting language that can be compiled into any feasible FF7 AI 'program'. There are constraints around what a Nibelheim 'script' would support, and what a Nibelheim application would do. Namely:
  • Assume creatures will always act, and do so by taking one action. This action will always be a spell or ability.
  • Scripts only control actions. They do not allow the user to arbitrarily set status flags or set data.
  • Scripts are highly abstracted. They do not expose memory, or the 'compiled' FF7 pseudo-assembler. No inline opcodes.
  • Allow users to export and distribute abstracted scripts in a non-proprietary format
  • Assume users will insert 'compiled' scripts into FF7 data files themselves, using WallMarket / Proud Clod
  • Assume that Nibelheim scripts should be forwards-compatible, and that any Nibelheim release could extend the features of scripts, and the types of data users can access
  • Assume that the application source should be available for others to modify, extend and redistribute
  • Not support decision trees that would fall outside the simple 'flowchart' model / gambit system outlined above
Nibelheim might support some randomized decision making, but would not replace simple templates for 'roulette' AI scripts. I'm thinking AI that makes smart but tactically predictable choices, with occasional random variation.

What would the technology be?

I want to open this application's source, so I don't need the language behind this project to compile into binary. I want an object-orientated, dynamically-typed language that gives me experience useful as a web designer (that's my profession), and that I could potentially deploy in a webapp. As such, I'm thinking about using Javascript, using a technology like Titanium or Adobe Air for distribution.

Why "Nibelheim"?

Because that's where FFVII's monsters were born!

What do I want from you?

The answers to three questions:

1. Would you use it?
2. What sorts of scripts do you write? What types of decisions do your monsters make? What types of scripts would you like to write, if only you knew FF7's AI scripting language better?
3. Would anyone else be prepared to help with this project? Not necessarily as a developer - bugtesters would also be a boon.

29
As some of you may know, I've never been happy with the poison status in vanilla FFVII. 1/32 Max HP damage per turn just doesn't cut it in the endgame, when many monsters can be KOed in one or two hits anyway.

The usual solution is to add the 'dual drain' status to all poison-inflicting attacks and spells. This makes poison much more dangerous. But it has three main disadvantages:

1. Modifying *every* enemy and player attack is very time-consuming. And if you want to switch back, you have to be very thorough.
2. Just adding the status to poison attacks isn't enough - you now have to modify enemy status immunities (many creatures are vulnerable to the one status but not another). Again, this takes a lot of time.
3. You can't inflict your dual-drain status via added effect, because you can't give materia a dual-drain status affinity. Boo!

But do not despair! There is another way - to create an AI script that automatically gives poisoned creatures the dual-drain status, and removes it when they're cured. Here's the AI script:

Code: [Select]
12   0000
02   20E0
90
12   0020
61   0001
90
12   0040
02   0000
02   0020
35
90
02   0040
70   002E
12   0040
10   401B
80
02   0040
00   4003
80
90
02   0020
61   8000
45
70   0045
12   0020
02   0020
60   02
32
90
72   000E
73

The idea is to put this into Vincent's preTurn-counter and general-counter scripts, then link other characters to Vincent's scripts with the preBattle code

Code: [Select]
60 07
75
73

Now, poisoned characters and creatures will immediately take the Seizure status. The only potential bug is if a character has a counter ability, in which case, the seizure status will be delayed until another battle actor takes an action.

What if I want a disease status, rather than seizure / dual-drain?

Oh, that's simple. Use the code

Code: [Select]
12   0000
02   20E0
90
12   0020
61   0001
90
12   0040
02   0000
02   0020
35
90
02   0040
70   002E
12   0040
10   42A9
80
02   0040
00   4003
80
90
02   0020
61   8000
45
70   0045
12   0020
02   0020
60   02
32
90
72   000E
73

That should work just fine.

And if I want to link any statuses?

Then replace the values in the following:

Code: [Select]
12   0000
02   20E0
90
12   0020
61   0001
90
12   0040
02   0000
02   0020
35
90
02   0040
70   002E
12   0040
10   ADDRESS OF STATUS TO ADD (E.G. DUAL-DRAIN)
80
02   0040
00   ADDRESS OF STATUS THAT TRIGGERS IT (E.G. POISON)
80
90
02   0020
61   8000
45
70   0045
12   0020
02   0020
60   02
32
90
72   000E
73

So if you wanted to give Flag:PhysicalImmune to anyone with Flag:Defending (so Defend blocks *all* non-magic damage), you'd substitute the values 4028 and 4025 respectively, etc. etc.

How is this script any different to older ones?

This isn't the first time this has been attempted (see http://forums.qhimm.com/index.php?topic=11861.25). The problem with those attempts is that they attempted to directly set allActors.dualDrain = allActors.poison by simply copying a word of one status mask to another, which the battle engine doesn't support. The result was typically a buggy script where all creatures would suffer dualDrain if *any* were poisoned. Not good. Instead, this script directly iterates through all battle actors and sets statuses individually.

How does it do that?

The idea is simple. We put the AllUnitsMask in a local variable, then we perform a bitwise AND on it with an iterator that's logically shifted to the left with every loop (by multiplying by two). That means that every loop, we get a unitmask that points to each actor in the battle. If the mask isn't empty, we copy the unit's poison status to its dual-drain status. We don't do that for units that don't exist, because that might invoke glitches (probably not, but better safe than sorry).

Here's an annotated AI script:

Code: [Select]
12   0000
02   20E0
90      Put a mask of all actors in LocalVar 0000
12   0020
61   0001
90      Start our iterator (LocalVar 0020) at 1
12   0040
02   0000   
02   0020
35       Bitwise operation to cycle through bits in the LocalVar 0000, one at a time
90
02   0040
70   002E   If there's an active bit in the current position...
12   0040
10   401B   
80      Get the address of currentActor.dualDrain...
02   0040
00   4003
80      And currentActor.poison...
90      ... and finally make currentActor.dualDrain = currentActor.poison
02   0020
61   8000
45
70   0045   If the iterator is at 0x8000 (which means one 1 and fifteen 0s), exit
12   0020
02   0020
60   02
32
90      If not, double the iterator (which effectively applies a left shift) and go again
72   000E   Loops
73      End of script!

I've encountered a problem! Help!

...then post your issue here and I'll update the script if I can fix it.

Other than that, enjoy!

31
It's evident that FF7 has some kind of exception handling, or else we wouldn't get 'Data Errors' when actors attempted to use animations that the game couldn't look up. But exactly how does this handling work?


The 'data error' functionality doesn't seem particularly comprehensive - I've only ever reproduced instances where it captures animation problems (a code 32). Even then, I've noticed that it can't handle animation problems when the action is called as a 'follow-up' to another (called as the special effect 'call [Modifier] after completion', as per the second halves of Vincent's Satan Slam or Cloud's Finishing Touch) - the 'Scene: XX / Code: YY' message comes out as the nonsensical 'Scene: #$' (though it's not clear why).


I've heard others refer to a Scene 38, which appears to be linked to KERNEL character AI issues, but I've never reproduced this myself. I can find no references to any other error codes. Do we know where this logic - and the text for the


On a related note, why is the FF7 animation system so brittle? Why doesn't FF7 just degrade gracefully and let an actor without an animation to a spell or action just idle for a while?

32
One of the key paradigms to modding in this community is the idea of working with individual files. When we reverse engineer, we look to specific blocks of data. When we document them, we create articles for each file and directory. And when we build modding tools, we build them to manipulate these specific files.

There are advantages to this paradigm, but limitations, too. There are times where a specific mechanic (say, limit breaks) is spread over several files, and a user must co-ordinate several tools. Tools for particularly important files can become bloated or difficult to use, offering a range of functionality when a modder probably only wants to edit a specific mechanic or element of his game (unless he's a casual tinkerer, in which case, the more options the better). Mods usually have to contain a variety of small diffs and patches that end-users find fiddly to apply. Tools built to manipulate particular files usually support only a limited number of releases. Finally, the whole idea of working with individual files fails with games like FFIX, which completely strips filenames from the PSX iso (like many later PSOne games).

What I suggest is a completely different way of handling the process. Imagine a generic 'compiler / decompiler' (I use the terms loosely) that can transform PSX releases into plain-text files that 'describe' the features and the mechanics of the game. After modifying these plain-text files (perhaps XML-based?), our 'compiler' can turn them back into a playable PSX ISO.

Why would this offer advantages?
The benefits aren't obvious at first sight, but think about it:
  • it makes it a lot easier to combine mods. If a file or data section is compressed, simply applying two patches on top of each other could be disastrous. But with plaintext mod 'descriptors', it's a lot simpler. And when two mods clash in some way, it's a lot easier for the user to choose which parts of the mod he does or doesn't want (because he's comparing to plaintext configurations, not compressed binary data)
  • no issues around distributing complete mod files. They're just plain text. No proprietary data.
  • tools and their developers can specialize. Currently, if a particular tool is inefficient or buggy at compressing / opening data, but has a great feature, users are stuck with enduring the slowness and the crashing for the sake of the benefit. But when raw data handling and game manipulation are separate, tool developers can stick to their specialities
  • ensures open-source development. In the current model, if only one developer knows a data section well, but leaves the community / gets too busy / gets run over by a bus, the tool stagnates. By separating our tools, we spread our bets and reduce the risks of yet another tool being abandoned by its creator.
  • mods become compatible with all and any versions of the game. If the compiler / decompiler can export to a non-occidental release, I can send my own mod - developed for UK PAL - to, say, a friend in South Africa. No issues.
  • Very easy to document mods. If a mod is just an XML file, then all it takes is an XSLT file and a bit of CSS to create a full, glossy set of release notes
  • Easy-to-edit games. Even if a GUI tool doesn't exist, astute users can still fire up a text editor to make their changes
  • Single-sourced data. Imagine, as a translator, being able to go to a single resource file that lists all the terms consistently used in the UI. Imagine being able to transform all instances of the word 'dexterity' into a better translation. When we're producing a descriptive file with semantic, rather than binary data, we encourage those sorts of workflows.
That's my thinking, anyway.

The question is: is this really a better model of working, and is it even feasible?

33
Download and installation:

Download from http://www.mediafire.com/?2g9z2t0qpzmo0c5 (mirror: http://www.filedropper.com/ff7spellnamepatchforntscpsx)

The file is a .zip containing three PPF files. To apply a PPF patch to an FF7 disc ISO, download a free copy of PPF-o-Matic and follow the instructions at http://forums.ngemu.com/showthread.php?t=85859.

Description:

On the request of another user, I have created a simple spell name patch for the PSX release (NTSC version).

This patch:
  • Changes level 2 and level 3 spell names to their '-ra' and '-aga' forms
  • Changes 'Ice' to 'Blizzard'
  • Changes 'Bolt' to 'Thunder'
  • Changes 'Barrier' and 'MBarrier' to 'Protect' and 'Shell', respectively
  • Changes 'Demi' to 'Gravi'
  • Changes 'DeSpell' to 'Dispell'
  • Changes the descriptions of any spell-casting items (eg Fire Fang, Lunar Curtain) to reflect new spell names
Issues:

None reported.

34
Completely Unrelated / MOVED: Square RPG Component Rating
« on: 2011-04-11 14:25:15 »
This topic concerns Final Fantasy, so I've moved it to General discussion.

http://forums.qhimm.com/index.php?topic=11677.0

36
Releases / [FF7PSX NTSC-U] Disc Extension Patch (v1.0)
« on: 2011-03-18 00:40:23 »
FF7 Disc Extension Patch (NTSC)
Version 1.0

Expands the SCENE.BIN and KERNEL.BIN files for heavier modding

Tired of working within the filesize constraints of FF7 PSX? This Disc Extension Patch expands the KERNEL.BIN to 64kb and the SCENE.BIN to a whopping 2mb. Just apply the PPF patch to an NTSC Disc One ISO and you'll never need worry about filesizes again! Whether you need a bigger KERNEL for a translation patch, or you want to extend the SCENE's AI, the Disc Extension Patch should be part of every modder's arsenal.

This mod currently supports only the NTSC version

Download link: http://www.mediafire.com/?r4h6vfwjw10nmq4

Installing and Using the Patch

The patch is a simple PPF file, with instructions bundled in the download. The patch moves the files in question to the MOVIE directory, right at the end of the disc. You can then use something like CDMage or cdprog to import your modified files into the ISO.

Please be aware that this patch is mostly untested. Whilst I can confirm success playing ISOs with KERNELs and SCENEs larger than allowed in vanilla FF7, I cannot guarantee the exact max sizes of either file.

37
You may know that enemy attack animations can be co-opted to create new spell animations for players. What you may not know is which of these enemy attacks can be cannibalized.

This thread seeks to resolve that by listing the attack animations you can use.

If you want to know how to turn enemy attack animation indexes into spell indexes, see here.

Here is the spreadsheet: https://spreadsheets.google.com/ccc?key=0Avv5n_dvnE2jdFVMUEpqNm5jVFk3SUYwdnI4S1JXTlE&hl=en

I will add more to this sheet soon. That said, please post any omissions you've spotted.

38
Scripting and Reverse Engineering / Gaps in the CDs
« on: 2011-03-15 00:40:42 »
Some of us need to insert files into unused locations on the disc. This thread documents those locations.

If you have your own, please make a suggestion, and I will create a public spreadsheet.

This thread refers to sectors rather than LBAs. For PSX discs, and other Mode 2 CD-ROMS, the sector number = the LBA + 150

Major spaces:
  • The opening of the data section, sectors 150-153, are blank. This is a great place to put small inclusions.
  • Sectors 341-367 are empty. That's 25 sectors, or around 50k of space.
  • Sectors 17829-17839 are empty. 10 sectors, or 20k of space.
  • Sectors 53921-53973 are empty. 52 sectors means over 100k of space
  • Sectors 54052-54099 are empty. 47 sectors means nearly 100k of space
  • Sectors 314,857 onwards (to 333,300 for a 74 minute ISO) are empty. 18143 sectors means around 36m of unused space

There are also some unused strings, and null data. It's also possible to insert files over unused enemy models for each disc, so long as your mod doesn't use those enemies.

I have not yet tested inclusions into all of these sections. Backup your ISOs before modifying them.

39
Completely Unrelated / The Great Thread of Avatarness
« on: 2011-02-17 23:45:58 »
This thread has a simple purpose: a thread to discuss avatars.

Remember, no quoting images.



I was thinking of switching to the following, using an image rotator:








Obviously, they'll need to be resized and cleaned up a little, but thoughts?

I was also considering a simple rotation of monochrome hazard signs, a bit like I have already, just levelled up.

40
Completely Unrelated / Can you tell Helvetica from Arial?
« on: 2011-02-11 22:18:31 »
Take the test here.

I got 18/20.

There's a few simple rules for telling them apart, but I'll leave that until after you've taken the test.

41
Gameplay / [Abandoned] Final Fantasy 7: Plus (PSX)
« on: 2011-02-03 22:05:49 »
FF7+ is a simple collection of bugfixes for the PSX version of Final Fantasy 7. It also corrects ambiguous battle / interface text and clarifies equipment descriptions.

What does FF7+ deal with?

Specific bugs
* Silver Barrette cannot be sold
* Cloud's initial Exp is broken
* Pandora's box no longer missable
* Rude AI fix
* True MDef bug fix (not a spirit boost)
* 'Last Elixir' to 'Megalixir'
* Wall Market underwear bug fix (perhaps)
* Will look at Save Crystal glitch (can lose if you exit area with 'Obtained Save Crystal!' message still up)
* Will look at code that changes 'love' values with in-battle events (can't promise anything)

AI fixes for
- Rude
- Adamantaimai
- Dual Horn
- Unknown 3
- Maximum Kimaira
- Christopher
- Bizarro Sephiroth (possibly - there's a lot, and they're tricky!)
- MP
- Guard Hound
- Mono Drive
- Grunt
- Aps
- Rufus
- Desert Sahagin
- Jersey
- Acrophies
- Submarine Crew
- Diablo (perhaps)
- Unknown 3

[Some of these creatures have AI that mentions attacks, yet never uses them. I'll use my discretion to restore these scripts to their likely 'intended' functionality]

Battle Text fixes
- Consistency fix: full stops in battle messages (I will remove them, except for multi-line messages or dialog)
- Ambiguous "Couldn't steal anything" revised to "Couldn't steal the item..."
- 'Set buttons yourself' revised to 'Set your own controls'
- 'Set magic placement' revised to 'Arrange spells'
- 'Fail to union' revised to 'You need a complete party!'
- '{item} was X' to 'X {item}' (that is, I'll write these messages in the clearer, snappier active voice)
- 'Skill power is used up' revised to 'Not enough MP'
- 'Cold' to 'Ice'
- 'Holy power' to 'Holy'
- 'Learned Enemy Skill"{ATKNAME}"' to 'Learned Enemy Skill "{ATKNAME}"'
- '{TAR} was cought by surprise.' to 'First strike!'

Item, materia, weapon, armour and accessory descriptions to be revised. Inaccurate descriptions (like the Peace Ring, which coyly hides its ability to block Confusion) are a priority, as are the ultimate weapons. I'll look at magic and summon descriptions. Equipment names aren't the focus right now, except perhaps for 'Organics' (which should really be 'Ogre Nix')

What I won't do (yet) -
- I won't change spell or summon names
- I can't fix the W-Item bug
- I won't change any weapon *mechanics*
- I won't fix the Conformer
- I won't fix overflow
- I won't fix your car

Reactions? Would anyone be bothered to play this, or does it just have too little benefit?

42
I've been trying to add some functionality via character AI scripts, but I've come across a couple of barriers.

It seems that character AI scripts are only active in certain circumstances, in certain ways.

For instance, this General Counter script, that cuts a random enemy, works absolutely fine:

Code: [Select]
General Counter, Cloud:
12 2070
02 20a0
82
90
60 01
60 00
92

But if I just use

Code: [Select]
93 'Ugh!'
Nothing displays, and

Code: [Select]
Self.FlagPoison<-1
won't work either.

In what cases can I use these different counter scripts, and what can I actually do in them? When does this flag manipulation actually work?

Also, I've read that extra counter scripts can be applied to the party, for example in the Carry Armor fights. Where are these scripts? In the scenes?

Do different battle flags switch on and off certain character AI functionality?

43
As modders working on FF7, I'm sure we all come across a variety of cryptic, difficult-to-resolve errors - not least in battle scenes. Whether that's the dreaded Data Error, a glitched background, or completely invisible creatures, we've all been puzzled by them from time to time.

Because debugging a mod can be so time-consuming, I want to document and explain the various errors that battles can throw us, and hopefully speed up everyone's bug-resolving efforts.

The Data Error: Scene XXX / Code : YY

XXX is the encounter number, in decimal rather than hex. If you use Proud Clod, you'll know these as formation numbers. Use the formation tab and look at the 'formations' - those are the numbers we're talking about. If you convert the Scene number into hex, you'll know exactly which formation (and attached enemies) is causing the trouble. That should save you time right from the off.

Now, YY is a bit less obvious. So far, I know that

32 - Can mean: Creature uses an animation that hasn't been 'authorized', i.e. isn't listed in the "Assign Animations" dialog within Proud Clod. Use Proud Clod's 'check animations' feature to help resolve this.
38 - Can mean: Unknown. Linked to Kernel AI problems?

I didn't get a scene number for my data error! All I got was the message 'Scene: #$'. What does that mean?

Are you using a multi-part spell (eg a spell with additional effect 18, 'Perform X after completion')? You may have forgotten to authorize the animations to the second part of the attack.

Help! My emulator crashed when a monster used a custom attack!

This, alas, is common. Certain attacks are linked to certain actors and backgrounds. For instance, Supernova relies on the Safer Sephiroth background.

There's little you can do about this one.

FF7 just went black when a battle started. What's going on?

You may have deleted the scene being called. Double-check this.

The monsters just sit in their idle animations. My party's time bars fill, but when I select an action, nothing happens. There is no data error.

You may be performing an enemy attack in the wrong 'type'. Let me explain

Normally, to attack, you push two values onto a stack and use opcode 92, eg

60 20
61 0111
92

That 20 is significant. It tells the battle engine that it's to look in the list of enemy attacks - or, in FF7 terms, it sets the attack 'type' as an enemy ability. If you see this glitch, you have used an incorrect 'type' (eg not 20 or 24 for enemy attacks, 0 for commands, 1 for spells, etc...)

My monsters just don't do anything?

Are you sure you haven't deleted their Main scripts, or written AI that always chooses inaction?

I start a battle, and the background gets messed up - as though the colours are 'inverted'. No entities appear, and the game freezes

Alternatively, The enemy model won't appear!

This can happen if your general battle flags are incorrectly set. Not much is known about these flags, but they typically take the forms FFFD and FFED. There are some other, rarer flags, but they're typically associated with the 'quirky' boss battles - such as those including multipart enemies, multiple parties and other odd behaviour. They presumably interact with various battle engine settings for these 'special' battles.

My monster doesn't appear!

Your monster may have the enemy battle flag FFE6FFFF, used by Reno's Pyramid, Waterpolo and all other enemies that don't appear until 'summoned'. Reset to FFFFFFFF to force the creature to appear when the battle opens.

The battle begins, and the background starts to appear - then the game freezes!

This can happen if the battle calls an enemy that doesn't belong in the scene. Check your formation data.

44
Creating new enemies, or radically changing the attacks of existing enemies is hard, because many attack animations just plain don't work with certain enemy models or backgrounds.

One workaround is to rely on magic for your new attacks. Many enemies have a 'cast spell' animation that works with any valid player spell.

Here they are:

========================================================================
Enemies that use magic (incomplete)
========================================================================
Enemy                                             Index / Enemy ID                 Animation for casting (in formation tab)
========================================================================
Mono Drive                                      0012                                    04
Adamantaimai                                  00AC                                   04
Beachplug                                       0063                                    04
Flower Prong                                   0079                                    04
Malboro                                           00D7                                    04
Dark Nation                                     0045                                     04
Crown Lance                                   0078                                    04/05
Soldier: 3rd                                     0038                                    04
Garuda                                            00AF                                    04/05
Grimguard                                        00CA                                   04/05
Unknown 3                                      0110                                    05
Christopher                                     0137                                     04
King Behemoth                                0139                                     05
Killbin                                               00E8                                    04/05/06
2-Faced                                            006B                                    03
Shred                                               00CE                                    05
Scissors (Lower)                              00F2                                     06
Deenglow                                        002B                                     04
Gorkii                                               00B2                                     08
Godo                                                00B6                                   03/05/06
Valron                                              008F                                     08


{To finish. Note to self: E}

45
One of the objectives of Rebirth is to make enemy attack patterns clear, intuitive, and fun to work against. Part of this means allowing the player to easily see which monsters are doing which attacks. This allows me to mark up, say, low-acc / high power attacks as 'Deathblow', a team-up between monsters with an appropriate name, and elemental attacks as such.

Unfortunately, I'm not exactly sure how to make attack names display. Is this something in the ENEMYxxx.LZS files I have to edit? Or am I missing something really obvious in Proud Clod?

46
Completely Unrelated / The QHIMM Forries!
« on: 2010-11-12 21:45:11 »
OMG WTF ZOMG IT R...The Qhimm Forries

'Girls = pink' came about merely 70 years ago. Kilts only date back 200 years. No-one cared about Shakespeare until the Victorians. There are plenty of 'traditions' invented at the drop of a hat, and no time like the present to create a new one. So let's institute the QHIMM FORRIES, a semi-demi-casually-annual-whenifeellikeit awards of the best, the worst, and the downright weirdest Qhimm has to offer.

How to vote

Simply post a category and a nominee, and that's it! You can change a vote, and can even vote for yourself, but try to avoid it - at least for my sanity. I'm more than willing to add categories, so just get posting!

The proposed awards:

Best new member (eg last year or so)

- Nominated: Timber (currently 3 votes)
- Nominated: HackMaster (currently 2 votes)

Member of the year

- Nominated: Aali (currently 3 votes)
- Nominated: Leighos Kudistos Megistos (currently 1 vote)


Trophy: best contribution in modelling

- Nominated: Timu_Sumisu (currently 3 votes)

Trophy: best contribution in backgrounds

- Nominated: SpooX (currently 2 votes)

Trophy: best contribution in animations / textures

- Nominated: Millenia (currently 2 votes)

Trophy: best contribution in AI

- Nominated: gjoerulv (currently 1 vote)
- Nominated: NFITC1 (currently 2 votes)

Trophy: best contribution in field design / development

- Nominated: Pyrozen (currently 1 vote

Trophy: best contribution in technical knowledge / disassembly

- Nominated: Aali (currently 5 votes)

Trophy: best mod of 2010

- Nominated: Ultima Espio's Final Fantasy VII Aeris Patch (currently 1 vote)
- Nominated: Team Avalanche Font and Graphic Overhaul (currently 4 votes)
- Nominated: FinalFanTim's Remastered Soundtrack (currently 1 vote)

Trophy: best tool of 2010

- Nominated: WallMarket (currently 2 votes)
- Nominated: Proud Clod (currently 1 vote)
- Nominated: Black Choco (currently 1 vote)
- Nominated: Gemini's translation tools (currently 1 vote)

Trophy: most helpful member of 2010

- Nominated: Kranmer (currently 3 votes)
- Nominated: Cyberman (currently 1 vote)
- Nominated: LKM (currently 1 vote)

Trophy: best post of 2010

- Nominated: Obesebear [post undefined] (currently 1 vote)
- Nominated: Bosola [Qhimm Forries] (currently 2 votes)

Smelly stick: worst n00b of 2010

- Nominated: HackMaster (currently 3 votes)
- Nominated: Squall Leonhart 3000 (currently 1 vote)
- Nominated: Mirenheart (currently 1 vote)
- Nominated: Senti (currently 1 vote)

Mod of the year

- Nominated: Obesebear and / or anyone who doesn't place KM on the same list as spamtastic OMG WHER R CRESES CROE MODLS???!??! (currently 2 votes)
- Nominated: sl1982 (currently 1 vote)

47
In my current project, I'm at a bit of an impasse. I need poison to be something far more threatening. 1/32 damage a turn simply isn't significant enough to make an impact for me, especially because I want Rebirth to be built around a small number of important status effects. I see three possible ways of dealing with the issue - but which should I choose?

1. Turning Poison into Doom.

Advantages:
 * The player can see and pre-empt the death of opponents.
 * It's relatively easy to implement, and can be added to the materia itself
 * Pre-existing algorithms take note of Doom for attack bonuses, which can be exploited for certain mods.

Disadvantages:
 * 60 seconds in not a long time to wait for an enemy to die.
 * Monsters can either be completely immune, or null it instantly with a certain spell.
 * Isn't compounded by other damage. Players who have inflicted it may as well sit around and tank.

2. Turning Poison into Seizure
Advantages:
 * Compounded with other damage. Still an incentive to attack once inflicted.
 * Certain enemies can try and put the attack off with Cure and Regen.
 * Takes about 12-16 turns (assuming Terrence's estimates in the Battle FAQ are correct), which suggests Poison's damage roughly doubled.
 * Very dramatic when used on players. When you see inverse regen, you sit up and take notice!

Disadvantages:
 * If Terrence's estimates aren't always in line with what happens in battle, it's possible for Seizure to become completely OP
 * Can't be added as a materia status, although equipment can still guard

3. Adding Null-Restore via AI as Counter

This would probably be done by making the spells inflict an invisible status, such as Death Force. Or, if Poison is still inflicted, Darkness could be used (it has no effect on enemies, and the dark visual effect is trumped by the bright green poison effect). Unless you wanted to replace the green glow and slow damage with just an inability to heal and darkness, of course. Anyhoo, AI would then check that status flag on counter / Main, as opposed to checking for every attack index), and change Absorb flags accordingly.

Advantages:
 * Makes sense as a status, useful position in many mechanics
 * 'Disease' as a status is popular with players

Disadvantages.
Where to start?
 * Mostly untested. Effects of combination with equipment / natural elemental affinities uncertain.
 * Adds AI code. Size issues with KERNEL AI, unless we use the 'link to scripts' function to attach to Cloud. I don't know how these would work when Cloud isn't present in the party, though. I understand there are ways around the size limitation, but I haven't done much testing, nor know much about reinjecting the KERNEL into some part of the disc.

48
Completely Unrelated / FONTS!
« on: 2010-08-04 23:46:59 »
So, what's everyone's preferences for fonts? I've an allergic reaction to Times New Roman - not because it shows some lack of originality or worse, care, but because it's an ugly, uneven, unpleasant font to read. Look at some placeholder text in a word processor under TNR - there are spacing issues, the text looks 'grainy' and uneven. Ugh.

Lately, I've become a big fan of Gentium where it's available, or resigned myself to using Trebuchet when I can't guarantee my readers have the font. Does anyone here have any 'proper' fonts (not symbols) they're particular about?

I'm probably one of only, ooh, three people interested in this, but there's an interesting review on the issue of whether serif or non-serif fonts are more readable. Their conclusions: there's no good evidence for assuming either is easier to follow. See it here: http://www.alexpoole.info/academic/literaturereview.html#part2

49
Title says it all really. I'd like to ask about upping the damage in the PC or PSOne versions of FF7.

I did make a first time try and disassembly (the R3000 version), but I can't say I got too far. I managed to find where damage dealt is stored (0xF99EC) and put a breakpoint on it, but without much experience with true assembler I couldn't find much out. Here's what I could make out:

When damage is dealt, data from R2 is put into address 0xF99EC. Where does this data for R2 come from? Well, the mention of R2 that comes before it is

lhu R2 0x0000 R1

So, it pulls whatever data R1 points to into R2. What's that?

I try setting a breakpoint with the PSX R3000 debugger, setting 'execute' and the address of the instruction (I *assume* that's how it's done - I'm honestly unsure). Doing this seems to break at that instruction, although the next instruction becomes illegal (maybe the break happens *before* the specified instruction is performed, not during?).

The value in R1 is 800fa08d. There's my poison damage at that location. What writes there? Setting a breakpoint yields

sll R4 R4 0x02

That's just a shift left? There's no mention of any prominent addresses anywhere in the registries, either. Evidently, I must be misunderstanding how this works...

The question is: how would I find the point at which poison damage is calculated? Or, if anyone already knows, I'd be glad for the help.


50
Link: Find the XLS file  here.

Don't like working with AI code in Proud Clod and Wallmarket, but need it to keep track of addresses and the size of your code? Fear not. The 'autoparser' is simply an excel document that automatically traces the addresses and size.

Simply start typing into it and 'autoparser' will automatically work out the address of the next line, so you don't need to keep track of the number of bytes in each line. The only limitation is that it doesn't work if AI code displays text on the battle marquee.

It also includes templates for Welder that automatically work out correct jumps for the next plugin / footer, wherever you paste them into your script. If you haven't read the Welder thread, that won't mean much to you, but basically, Welder is a means by which newbies can very easily put together quite intricate and playable AI scripts without having any knowledge of the battle engine's pseudo-assembler. I recommend reading the thread - this excel document contains the latest versions of the plugins (as have been corrected and informed by Akari, NFITC1 and Terence Fergusson).



Above: The 'hex address' values in the leftmost column are generated automatically. Just type and go.

Plugins have variables for the 'author' to change marked in red. If it has four characters, remember to use a word (two bytes, ie 0-FFFF) rather than a single byte (0-FF).

You can find the xls sheet here. Both Excel and OpenOffice Calc will open it. It's nothing special, just a pretty simple excel formula sheet, but I thought it might be handy to have.

I will post a fuller tutorial on using this spreadsheet soon.

Pages: 1 [2] 3