Author Topic: [WIP] Custom Game Settings (FF7)  (Read 92427 times)

Wutai Clan

  • *
  • Posts: 115
    • View Profile
[WIP] Custom Game Settings (FF7)
« on: 2011-04-14 08:26:03 »
This project is an attempt to add easy to configure settings, that will allow for easy modifications to how the game works. (That are normally not easy, or require external tools like trainers\hacking of the .exe, etc,.)

For example, I'm trying to add settings that will allow you to easily change how much HP get's restored by various healing items.

The project uses a dll file called "GameSettings.dll", and will read values from an .ini file. (It will require Aali's Custom Graphic Driver to run.)

Code: [Select]
Example GameSettings.ini

#HP Restoring Items
Potions = 100

#MP Restoring Items
Ether = 100 (I don't know the real value right off hand.)

# Lot's of other settings will be added as I work on the project, but for now, I'm working on HP\MP restoring items.

An example, MP regeneration, is something I always thought might be interesting.

MP_Regen = Enabled
MP_RegenRate = 6 [ie, Every six seconds]
« Last Edit: 2011-05-02 23:14:24 by Wutai Clan »

Wutai Clan

  • *
  • Posts: 115
    • View Profile
Re: [WIP] Custom Game Settings
« Reply #1 on: 2011-04-14 08:33:01 »
Functions Found\Hooked

IncreaseHP = 0x006CBA6A [DWORD formationIndex, WORD amount]
DecreaseHP = 0x006CB9D2 [DWORD formationIndex, DWORD amount]
IncreaseMP = 0x006CBBBF [DWORD formationIndex, WORD amount]
DecreaseMP = 0x006CBB27 [DWORD formationIndex, DWORD amount]
RestoreHPMP = 0x0061F793 [] // Full Heal Party

AddItems = 0x006CBFFA [DWORD item:amount]
RemoveItems = 0x006CBE5F [DWORD item:amount]

IncreaseGil = 0x006CBCB9 [DWORD amount]
DecreaseGil = 0x006CBC7C [DWORD amount]
GetCurrentGil = 0x006CBCE9 []

GetCharacterData = 0x006CB98E [DWORD formationIndex]
DebugOutput = 0x00664E30 [char* string]

IsMenuOpen = 0x0063BC9D []
CurrentMenu = 0x006C6AEE [DWORD menu] // Not sure exactly what this is doing yet, but I can get the currently opened menu by intercepting it's argument. (Materia\Spell\Equipment\etc,.)

Custom Functions: Created\Patched

SetRandomBattleRate [BYTE rate] [Options: Enabled\Disabled | Rate]

Found WIP\Untested

ShowMessage = 0x00631586 [WORD unk1, WORD unk2] -Tested\Hooked\Still needs work. (Shows empty window, no matter what parameters I feed it, it definitely depends on a file for it's entries, whether on disk, or in memory.)

SaveGame = 00720F6E [DWORD unk1:slot? filename?] - Completely untested
LoadGame = 007210BC [DWORD unk1:slot? filename?] - Completely untested

GetCharacterBySlot [Derive from GetCharacterData?]

GetItemCount = 0x006CBF57 [DWORD index] - Needs adjusted to return counts. (Going to have to create a wrapper function, that converts the data to other formats, ItemID, and Counts, I already have the formulas to do so.)

GetRandomBattleRate = 0x00767C55 []

Misc Addresses

Battle Timer Variable = 0x009AE17C // Times how long each battle took.

Turn Timer Variable = 0x009AE180 // Measures how long each battle participants turn took. (Enemies, and allies.. This only accounts for the time the animations, etc, take to play out, it doesn't count time spent in the menu's, etc,.)

Battle IsTargeting Variable = 0x009A8B08 // This is equal to 0, if you aren't targeting something, 1 if you are. ie, if you select a command, and a target icon appears, this will be equal to 1.

Battle Escape Variable = 0x009AAD06 // This is the counter that determines when you escape, the longer you try, the larger this number gets, after it hits a certain value, you escape. (This value will slowly decrease after you stop trying to escape.)

Pressed Key Variable = 0x009A85D4 // Works with keys the game actually uses, doesn't seem to register other keys. (This also responds to gamepad input.)

Menu Open Variable = 0x00CFFB8C // Equals 1 while the menu is open. (Triangle menu.)

Ideas

E. Skill materia: Expand the list of learn-able skills.

Improve battle targeting: Make items\spells target relevant party members. (ie, phoenix down, will target a KO'd member.)

New Hotkeys [To trigger various functions. Example: Custom Option Menu->RenamePartyMember.]

Note: These are just notes to myself, so I don't forget anything, but they are also here so you can offer feedback on the ideas, etc,.

Progress Notes\Issues

Hooked the game's internal debug messages. (Tells me all kinds of stuff, like when the engine is loading different modules(WorldMap\Menu\Battle), etc,.)

Setup a debugging console, so I can watch log entries as they occur. (Much nicer than using the .log file, though it still exist, it's a shared function.))

GameLoop hooked. (This hook isn't working in battle mode, but works pretty much everywhere else, I need to find a function that get's called no matter what mode the game is in.)

BattleLoop hooked.

MP Regen: Implemented. (Doesn't work in battle, the hook doesn't run, and the values are stored different.)

Infinite Item Usage: Implemented. (Doesn't work in battle, the hook doesn't run, and it probably stores the values differently.)

Custom Random Battle Rates: Implemented.

Battle Reward Multipliers: Implemented.

Sense Materia Fix: Implemented.

Better 3rd Person Camera Patch: Implemented.

INI File: Implemented.

Here are the current .ini options. (All of them are fully implemented.)

Code: [Select]
[Debug Console]
Enabled = false

[Infinite Item Use]
Enabled = true

[MP Regeneration Settings]
Enabled = true
Rate = 6

[Random Battle Settings]
Enabled = true
Rate = 4

[Battle Reward Multipliers]
Enabled = true;
EXP = 1
GIL = 1
AP = 1
« Last Edit: 2011-05-02 23:15:58 by Wutai Clan »

Dark_Ansem

  • *
  • Posts: 320
    • View Profile
Re: [WIP] Custom Game Settings
« Reply #2 on: 2011-04-14 09:54:51 »
I like the idea of MP regen as well, maybe attached to items and of variable intensity. think the BIN expander could do you some help?

Wutai Clan

  • *
  • Posts: 115
    • View Profile
Re: [WIP] Custom Game Settings
« Reply #3 on: 2011-04-14 10:05:55 »
Yeah, there are lot's of possibilities, for now it's probably best to stick to the basics, but, the more functions I hook, the more control I'll gain over how the game works.

Mp regen will probably be global at first, just restoring 1mp every x seconds that pass to all the party members. But I like your idea too, so maybe, depends on how far I get with hacking the .exe..
« Last Edit: 2011-04-14 10:07:54 by Wutai Clan »

Vgr

  • Global moderator
  • *
  • Posts: 2163
  • If it quacks like a duck, it must be a duck
    • View Profile
Re: [WIP] Custom Game Settings
« Reply #4 on: 2011-04-14 12:00:32 »
I think that Potion restore must be 64 to be 100 because this is in hexa. Well, looking forward for the first release.

Wutai Clan

  • *
  • Posts: 115
    • View Profile
Re: [WIP] Custom Game Settings
« Reply #5 on: 2011-04-14 12:42:46 »
Well, that function definitely get's called, but only after the healing occurs, so it's not the right function. (It does have the proper item. Probably related to item removal..)

I was able to make my custom edit to potion values using it, but, it works like this.

Heal function called
Item used function called
Set global value (For tracking item use, ie, storing 512)

So it didn't work on the first run..

However, on the second run, since I had successfully set my tracking variable the first run, it did work.

So I'm close, if I can just find the right item used function. (I still need to write a parser to read the .ini file too, then I should be able to release with a few values exposed.)
« Last Edit: 2011-04-14 13:30:10 by Wutai Clan »

nfitc1

  • *
  • Posts: 3011
  • I just don't know what went wrong.
    • View Profile
    • WM/PrC Blog
Re: [WIP] Custom Game Settings
« Reply #6 on: 2011-04-14 21:52:52 »
Right now, I need to find the "Item Used" function, if it even exist, I'm guessing there is a function that get's called when an item is used, I need to get the values from it that represent what item was used.

...

A function that returns character data, HP, MP, STR, etc,. (ie, I can feed it an NPC, and get data about that NPC.)

A function that increases\decreases item counts. (Inventory, etc,.)

A function to get the NPC occupying a slot. (ie, Slot1 = Cloud)

.... More to come.

I know where most of those are, but of course I've put my laptop away and I don't have time to fish it back out. Maybe tonight I'll update. I know exactly where the menu-based item handler is and how it works. I can find the item increase/decrease function too, but I haven't looked for the "NPC to battle slotX" function is.

EDIT:
Item Menu Usage handler begins at 0x715105. It's a long function too, running through 0x717599. It's really each item's function all squished together.

return character data is at 0x6CB98E. Give it a byte (formation index) and get the pointer to that position's stats. That will only return an active character (in the party), but that's probably all you'd need anyway. The game mostly ignores the characters NOT in the party.

Decrease Item count function is 0x6CBE5F. Pass it the item index ORd with ( quantity to remove << 9 ) like an item inventory data. XXXXXXXY:YYYYYYYY where XXXXXXX is the item quantity and YYYYYYYYY is the item index.
Increase Item is different because decrease is unsigned. It's at 0x6CBFFA and can either increase an existing item's quantity or put it in the first blank space it comes to. Input format is identical to Decrease Item.

Get Character occupying a slot is not a function. Each sub that wants to know that info manually derives what that is if necessary. It's always 0xDBA498 + 440h * Slot.


As for that healing function you've been messing with, that's almost exclusively used out of battle. It's more for item menu usage and magic menu use (which starts at 0x710DFA and ends at 0x71441B). Only a few others use it. Handle_Cats_Bell (0x6CC4A8), some full_heal function (0x61F6B0) that restores HP, MP and FurySadness flag I don't know what calls it (inn maybe?), a heal HP/MP function (0x61F793) that increments some counter (not sure what), and a similar one to that (0x61F977) that increases the same counter by 5.
« Last Edit: 2011-04-15 01:32:52 by NFITC1 »

Wutai Clan

  • *
  • Posts: 115
    • View Profile
Re: [WIP] Custom Game Settings
« Reply #7 on: 2011-04-15 00:58:03 »
@NFITC1, awesome, I appreciate it, it will greatly help this project. :)

(Aali helped me a bit with the .ini file end of things, so I will start working on that tonight, just crawled out of bed. We should be able to get a working demo up in no time.)

--

Edit:

@NFITC1, I need to get a global function hooked, ie, a function that always get's called by the game(every frame). I need this for things like mp regen. (I also need a way to tell if I'm in game, in menu, or still on the start menu, in order to control when my custom code should run.)

So if you know anything on this front, that would be great, I can probably find the global function, there are generally lot's of things being called by the game every frame. But I definitely need to know if I'm still on the start menu, running party based code for regen, with no party, is bad.
« Last Edit: 2011-04-15 01:04:59 by Wutai Clan »

nfitc1

  • *
  • Posts: 3011
  • I just don't know what went wrong.
    • View Profile
    • WM/PrC Blog
Re: [WIP] Custom Game Settings
« Reply #8 on: 2011-04-15 01:34:25 »
Just edited my above post. Check it out.

Wutai Clan

  • *
  • Posts: 115
    • View Profile
Re: [WIP] Custom Game Settings
« Reply #9 on: 2011-04-15 02:00:46 »
Just edited my above post. Check it out.

Excellent, thanks for that. :)

On the subject of the generic healing function, yeah, I mainly need it for making dynamic changes to values(potion = 250), I thought that it worked on spells, because when I was testing, Healing Wind triggered it, but that makes sense with what you've told me.

Will character stats returned by 0x6CB98E include the character name(is this an array, or are the values separate variables?), I want to use that for debugging, rather than returning Slot1\Slot2, just return the name of the character. (Though it will probably get used for more as the project matures.)

Anyways, thanks for all this, most helpful. :)

----

That item use function you listed 0x00715105, any idea what the input arg is?

Here is a sample of the log I get when hooking it.

Code: [Select]
ItemUse: Executing
ItemUse: 72
ItemUse: Executing
ItemUse: 73
ItemUse: Executing
ItemUse: 74
ItemUse: Executing
ItemUse: 75
ItemUse: Executing
ItemUse: 76
ItemUse: Executing
ItemUse: 77
ItemUse: Executing
ItemUse: 78
ItemUse: Executing
ItemUse: 79
ItemUse: Executing
ItemUse: 80
ItemUse: Executing
ItemUse: 81
ItemUse: Executing
ItemUse: 82
ItemUse: Executing
ItemUse: 83

This went on for quite some time, all the way up to around 400+, I don't think I can use that one for my purpose, it seems to be called constantly, and keeps incrementing some counter. (Though this may work for my global function hook, depends on where it gets called in the game loop.)

Is there another function that only get's called once when you use an item, and has an input arg that equates to the item? That's what I really need, so I can track item usage. (It needs to be called before GenericHeal too, so RemoveItems won't work, unless I damage the HP to make up the difference, but that's really hacky.)

The function will probably be in the same range as the decrease\increase item functions. (Or around that area.)
« Last Edit: 2011-04-15 04:52:59 by Wutai Clan »

nfitc1

  • *
  • Posts: 3011
  • I just don't know what went wrong.
    • View Profile
    • WM/PrC Blog
Re: [WIP] Custom Game Settings
« Reply #10 on: 2011-04-15 05:18:44 »
Will character stats returned by 0x6CB98E include the character name(is this an array, or are the values separate variables?), I want to use that for debugging, rather than returning Slot1\Slot2, just return the name of the character. (Though it will probably get used for more as the project matures.)

A Pointer to the 1088 byte array will be returned. If you know what the values are then you can access almost anything about them. I don't know if Name is in that array or not. I think name is always pulled out of the SaveMap.

That item use function you listed 0x00715105, any idea what the input arg is?

Here is a sample of the log I get when hooking it.

[ code ]

This went on for quite some time, all the way up to around 400+, I don't think I can use that one for my purpose, it seems to be called constantly, and keeps incrementing some counter. (Though this may work for my global function hook, depends on where it gets called in the game loop.)

Is there another function that only get's called once when you use an item, and has an input arg that equates to the item? That's what I really need, so I can track item usage. (It needs to be called before GenericHeal too, so RemoveItems won't work, unless I damage the HP to make up the difference, but that's really hacky.)

The function will probably be in the same range as the decrease\increase item functions. (Or around that area.)

I think the argument is the item itself. I could be wrong on that. It only has one argument. I can assure you that this is the only place where menu item usage is handled. It might be the entire menu handler for all I know. Item usage is just a part of that function. There's a lot more going on inside it, but I have it labeled as item usage because that's the point of interest I have in it.

Wutai Clan

  • *
  • Posts: 115
    • View Profile
Re: [WIP] Custom Game Settings
« Reply #11 on: 2011-04-15 05:39:32 »
A Pointer to the 1088 byte array will be returned. If you know what the values are then you can access almost anything about them. I don't know if Name is in that array or not. I think name is always pulled out of the SaveMap.

Saved for future reference.
« Last Edit: 2011-04-19 10:36:47 by Wutai Clan »

Wutai Clan

  • *
  • Posts: 115
    • View Profile
Re: [WIP] Custom Game Settings (FF7)
« Reply #12 on: 2011-04-18 14:52:16 »
Here is a log showing the DebugOutput I recently hooked..

Code: [Select]
Game: Started
GameSettings: Loaded
Hooked: GameLoop
Hooked: Item_Menu
Hooked: DebugOutput
Hooked: GetCharacterData
Hooked: IncreaseHP
Hooked: IncreaseMP
Hooked: RestoreHPMP
Hooked: AddItems
Hooked: RemoveItems

DebugOutput: LOCK UNLOCK TEST

DebugOutput: MATRIX INITIALIZE

DebugOutput: INITIALIZE DD/D3D END

DebugOutput: initializing sound...

DebugOutput: creating dsound primary buffer

DebugOutput: reading audio file

DebugOutput: loading static sounds

DebugOutput: sound initialized

DebugOutput: set music volume: 127

DebugOutput: set music volume: 127

DebugOutput: Entering MAIN

DebugOutput: Exiting MAIN

DebugOutput: START OF CREDITS!!!

DebugOutput: set music volume trans: 127->0, step=60

DebugOutput: END OF CREDITS!!!

DebugOutput: Entering MAIN

DebugOutput: set music volume: 127

DebugOutput: Exiting MAIN

DebugOutput: START OF MENU SYSTEM!!!

DebugOutput: SET VOLUME 5: 127

DebugOutput: END OF MENU SYSTEM!!!

DebugOutput: Entering MAIN

DebugOutput: Exiting MAIN

DebugOutput: -=-=[START OF WORLD MAP!!!]=-=-

DebugOutput: stop_sound

DebugOutput: cross play music: 0

DebugOutput: set music volume trans: 127->0, step=4

DebugOutput: set music volume: 127

DebugOutput: stop_sound

DebugOutput: -=-=[END OF WORLD MAP!!!]=-=-

DebugOutput: Entering MAIN

DebugOutput: Exiting MAIN

DebugOutput: Field Start

DebugOutput: Entering MAIN

DebugOutput: Exiting MAIN

DebugOutput: START OF MENU SYSTEM!!!

DebugOutput: SET VOLUME 5: 127

DebugOutput: WM_CLOSE

DebugOutput: END OF MENU SYSTEM!!!

DebugOutput: Field Quit

DebugOutput: UNINITIALIZE DD

Unhooked: GameLoop
Unhooked: Item_Menu
Unhooked: DebugOutput
Unhooked: GetCharacterData
Unhooked: IncreaseHP
Unhooked: IncreaseMP
Unhooked: RestoreHPMP
Unhooked: AddItems
Unhooked: RemoveItems
GameSettings: Unloaded
Game: Exit

Vgr

  • Global moderator
  • *
  • Posts: 2163
  • If it quacks like a duck, it must be a duck
    • View Profile
Re: [WIP] Custom Game Settings (FF7)
« Reply #13 on: 2011-04-18 21:23:08 »
How is it supposed to load? I put it either in the LOADR folder with the Multi.dll or directly in the FF7 directory and configure, but no one works. I'm running W7 64 bits (or was it? I have (x86) after one of my Program Files, so what is it?)

Kranmer

  • *
  • Posts: 766
    • View Profile
Re: [WIP] Custom Game Settings (FF7)
« Reply #14 on: 2011-04-18 21:33:55 »
How is it supposed to load? I put it either in the LOADR folder with the Multi.dll or directly in the FF7 directory and configure, but no one works. I'm running W7 64 bits (or was it? I have (x86) after one of my Program Files, so what is it?)

if you have x86 after one of your program files folders then you are on 64bit (x86 means 32bit so all the files in the program files folder that uses the x86 are 32bit programs)

EDIT- i also just get
ERROR: Failed to load library GameSettings.dll
when running this DLL on Windows XP SP3 32bit
« Last Edit: 2011-04-18 21:47:26 by kranmer »

Vgr

  • Global moderator
  • *
  • Posts: 2163
  • If it quacks like a duck, it must be a duck
    • View Profile
Re: [WIP] Custom Game Settings (FF7)
« Reply #15 on: 2011-04-18 21:35:48 »
Ok... O.o

I put all my programs into the Program Files (x86) and the other one serves the only purposes of the pre-installed programs, some transfered programs and being there.

Wutai Clan

  • *
  • Posts: 115
    • View Profile
Re: [WIP] Custom Game Settings (FF7)
« Reply #16 on: 2011-04-18 22:55:17 »
Not sure why it wouldn't load on Win7, that's what I'm running(x64) and it works fine. (XP should be fine too. ?)

For the install, you just put it in your FF7 directory.

C:\Program Files (x86)\Square Soft, Inc\Final Fantasy VII\GameSettings.dll

Open up "ff7_opengl.cfg" <-- Aali's Custom Driver Config

Add this line at the bottom..

load_library = GameSettings.dll

Save the config after you edit it.. Then run the game in windowed mode to test it out..

Let me know if this solves your issue.

----

Do you have the lastest patch installed(v1.02)? Do you have any .exe modifications from other mods? Latest Visual C++ runtimes installled? (VC++ 2010 runtimes.)

Here are links to the runtimes, try installing them all in order(2005, 2008, 2010) to be sure you have everything.

VC++ Runtimes 2010
http://www.microsoft.com/downloads/en/details.aspx?FamilyID=a7b7a05e-6de6-4d3a-a423-37bf0912db84

VC++ Runtimes 2008
http://www.microsoft.com/downloads/en/details.aspx?FamilyID=9b2da534-3e03-4391-8a4d-074b9f2bc1bf&displaylang=en

VC++ Runtimes 2005
http://www.microsoft.com/downloads/en/details.aspx?FamilyID=32bc1bee-a3f9-4c13-9c99-220b62a191ee&displaylang=en

Vgr

  • Global moderator
  • *
  • Posts: 2163
  • If it quacks like a duck, it must be a duck
    • View Profile
Re: [WIP] Custom Game Settings (FF7)
« Reply #17 on: 2011-04-18 23:08:10 »
1.02 exe modified by some YAMP patches. Put the GameSettings.dll into a subfolder called "LOADR" and a dll Multi.dll load every dll in that folder. I tested it in the FF7 directory (directly) and it still doesn't work.

Other DLLs that run with it : Speedhack, AnyCD crack.

Wutai Clan

  • *
  • Posts: 115
    • View Profile
Re: [WIP] Custom Game Settings (FF7)
« Reply #18 on: 2011-04-18 23:12:26 »
1.02 exe modified by some YAMP patches. Put the GameSettings.dll into a subfolder called "LOADR" and a dll Multi.dll load every dll in that folder. I tested it in the FF7 directory (directly) and it still doesn't work.

Other DLLs that run with it : Speedhack, AnyCD crack.

Did you try installing it like I said? I don't know what the other .dll files do, but mine assumes it's being loaded with the game, so that may be an issue.

Also, make sure you have the VC++ runtimes installed, it's not optional, they are required for VC++ applications to run. (See my last post for links.)

Vgr

  • Global moderator
  • *
  • Posts: 2163
  • If it quacks like a duck, it must be a duck
    • View Profile
Re: [WIP] Custom Game Settings (FF7)
« Reply #19 on: 2011-04-18 23:16:41 »
Yeah, I already have these (and I reinstalled to make sure). The other DLLs load properly, so I really don't know what is the issue...

Wutai Clan

  • *
  • Posts: 115
    • View Profile
Re: [WIP] Custom Game Settings (FF7)
« Reply #20 on: 2011-04-18 23:23:47 »
What's it do? Does it crash, do you get any kind of errors, etc,. ?

The only thing I can think of, is my hooking lib might not be getting compiled into the .dll.. (This would be the same as having a missing .dll, etc,.)

That or a YAMP patch is conflicting. ?

Vgr

  • Global moderator
  • *
  • Posts: 2163
  • If it quacks like a duck, it must be a duck
    • View Profile
Re: [WIP] Custom Game Settings (FF7)
« Reply #21 on: 2011-04-18 23:26:16 »
It just not starting...
...
...
...
CRAP!
I just realized that I used my AVgr's executable (which has modified limits/shops) when testing. Maybe that?

Wutai Clan

  • *
  • Posts: 115
    • View Profile
Re: [WIP] Custom Game Settings (FF7)
« Reply #22 on: 2011-04-18 23:32:01 »
It just not starting...
...
...
...
CRAP!
I just realized that I used my AVgr's executable (which has modified limits/shops) when testing. Maybe that?

Just not starting? That's odd, for Win7. (Do you have error reporting disabled or something.)

That .exe could be an issue, if you have an original backup somewhere, just test it out. (The other .dll files might cause issues too.)

Vgr

  • Global moderator
  • *
  • Posts: 2163
  • If it quacks like a duck, it must be a duck
    • View Profile
Re: [WIP] Custom Game Settings (FF7)
« Reply #23 on: 2011-04-18 23:33:50 »
Yeah, I tried with original executable, but I have some mods :

- Menu Reconstruction
- Yamp patches
- etc...

Will try with th original 1.02 exe

Edit : Nope >:(
« Last Edit: 2011-04-18 23:36:35 by Vgr255 »

Wutai Clan

  • *
  • Posts: 115
    • View Profile
Re: [WIP] Custom Game Settings (FF7)
« Reply #24 on: 2011-04-18 23:45:30 »
Yeah, I tried with original executable, but I have some mods :

- Menu Reconstruction
- Yamp patches
- etc...

Will try with th original 1.02 exe

Edit : Nope >:(

Hmm, must be an issue with the hooking library(?) I'm using, I'll see what I can do before I get a real release up. (This was just a test release anyways, to find, and fix issues like this one.)

Can any C++ programmers verify this, I'm using a .lib\.h library, does that need shipped with the .dll in order to function correctly, or should it be getting compiled into the .dll.. ?
« Last Edit: 2011-04-19 10:37:46 by Wutai Clan »