[REL] Havok Animation Converter, Thread 2

Post » Sun May 27, 2012 2:30 am

Okay, well, part of the problem with my conversions between my 2011 exports into the 2010 format is how the annotation tracks are stored: as I noted before, the annotation tracks are listed in an array of structs within object 3 in my 2011 exports, while the 2010 format has them as separate objects (4-102). However, besides this difference, the class is defined the same way, as containing one string for the track name, and one array of strucs containing one real (the time of the annotation) and one string (the annotation itself) Thus, I felt fairly confident that copying the data from the sruct in my 2011 export and pasting it into the object in the 2010 version would work.

Well, it didn't. Opening the 2010 HKX with the transplanted annotation data in the 2010 Havok Preview Tool works fine, right up until I scroll the animation up to the frame of the first annotation, at which point the tool gives me an error and wants to quit.

Part of the problem is, I can't find a single unpacked animation file from the BSA that contains any annotations: all the relevant objects read: "[object id="#0004" type="hkaAnnotationTrack"] [string name="trackName"][/string] [/object]" so I have no idea what this part of the file is supposed to look like. After I transplanted the data, mine looks like this:
[object id="#0004" type="hkaAnnotationTrack"]
[string name="trackName">NPC Root"][/string]
[array name="annotations" size="10"]
[struct]
[real name="time"]x3e6eeeef [!-- 0.233333 --][/real]
[string name="text"]preHitFrame[/string]
[/struct]
[struct]
[real name="time"]x3e99999a [!-- 0.3 --][/real]
[string name="text"]weaponLeftSwing[/string]
[/struct]
[struct]
[real name="time"]x3eddddde [!-- 0.433333 --][/real]
[string name="text"]HitFrame[/string]
[/struct]
[struct]
[real name="time"]x3f2aaaab [!-- 0.666667 --][/real]
[string name="text"]weaponSwing[/string]
[/struct]
[struct]
[real name="time"]x3f444445 [!-- 0.766667 --][/real]
[string name="text"]HitFrame[/string]
[/struct]
[struct]
[real name="time"]x3f911111 [!-- 1.13333 --][/real]
[string name="text"]weaponSwing[/string]
[/struct]
[struct]
[real name="time"]x3f9dddde [!-- 1.23333 --][/real]
[string name="text"]HitFrame[/string]
[/struct]
[struct]
[real name="time"]x3fcccccd [!-- 1.6 --][/real]
[string name="text"]AttackWinStart[/string] [/struct]
[struct]
[real name="time"]x3feaaaab [!-- 1.83333 --][/real]
[string name="text"]attackStop[/string]
[/struct]
[struct]
[real name="time"]x3feaaaab [!-- 1.83333 --][/real]
[string name="text"]AttackWinEnd[/string]
[/struct]
[/array]
[/object]
Anyone see what the problem is?

EDIT: It may be relevant to note, if I toggle off "annotations" under the animation tab, the error does not occur and I can view the animation without a problem.
EDIT 2: So I decided to go ahead and try to save the files as packed 2010 HKXs and try them in game, see what happens. Well, they saved fine, and the CK ran them okay as well, but they functioned exactly the same in game as they were before I added the annotation tracks. Something's not right.
User avatar
clelia vega
 
Posts: 3433
Joined: Wed Mar 21, 2007 6:04 pm

Post » Sun May 27, 2012 7:12 am

I've uploaded version 1.4. The most interesting piece is ability to now read/write the Havok Behavior files with the "convert" command so files can be exported to either pfxml or tagxml and then reimported after edit. I've also changed some timings on fore's behalf to possibly help fix some timing issues in the animations.

There is not much in way of interface changes though I added a report command which is more for debugging and code generation though that could be used for primitive documentation. I'll look into generating some doc files for upload to a wiki or something so people have a reference for the classes and settings since the havok content tools do not go into the behaviors. But it would be generated content and probably less useful initially than it may sound.

I've improved ability to read and write files via the convert command so there are 2 XML formats too choose from. The packedfile format which was a default in the past and the tagfile format which is the one Havok is pushing as the new standard. The tagfile format is a much cleaner format in terms of readability in my opinion but I've still not made it the default.

Examples:
  • Convert Havok file to Packed Binary XML
    hkxcmd.exe convert -v:XML skya\meshes\actors\character\behaviors\0_master.hkx 0_master.xml
  • Convert Havok file to Tag File XML
    hkxcmd.exe convert -v:TAGXML skya\meshes\actors\character\behaviors\0_master.hkx 0_master.xml
  • Convert Havok XML file to Packed Binary Win32 (version which is compatible with Skyrim)
    hkxcmd.exe convert -v:WIN32 0_master.xml data\meshes\actors\character\behaviors\0_master.hkx
In theory there is no difference in the 2 xml formats though I actually had fewer issues with the packed binary xml in the import/export cycle.

There is one known bug in the HKX -> XML -> HKX conversion cycle. The sabrecat has one behavior that loses a reference to a hkbEventProperty hkbEventPayload. I'm not sure why this happens and what it means and the criticality of it. Both XML formats lose this reference.
User avatar
Big Homie
 
Posts: 3479
Joined: Sun Sep 16, 2007 3:31 pm

Post » Sat May 26, 2012 6:03 pm

I've uploaded version 1.4. The most interesting piece is ability to now read/write the Havok Behavior files with the "convert" command so files can be exported to either pfxml or tagxml and then reimported after edit. I've also changed some timings on fore's behalf to possibly help fix some timing issues in the animations.
Hologram, this is so amazing. I can't believe how much information these xmls provide. This is much more than we all could have hoped.

But it also shows, how much we still have to go until we can make use of this information. Checking the XML for "mt_behavior.hkx" and "characters female/defaultfemale.hkx" I tried to figure out, what it would take to "SIMPLY" add an idle animation. And all I can say is, that it's much more to it than just adding one entry to 2 lists, as I had hoped (for the animation file, and for the animation event).

I tried to figure our the structure for "IdleAstridEnter" (because that's a very catchy name), and did not only find classes for said 2 things, but also
- hkbClipGenerator
- hkbModifierList
- hkbModifierGenerator
- hkbStateMachineStateInfo

Maybe AsridIdle is not as simple as I had thought (maybe because there is this special Astrid body involved). But it shows how complicated these structure can be. And combat animations for sure will be even more complicated.

Anyway, pure exitement. :clap:
User avatar
TASTY TRACY
 
Posts: 3282
Joined: Thu Jun 22, 2006 7:11 pm

Post » Sun May 27, 2012 1:01 am

Yep. We now have more than we had before but still not enough to be one-click export yet. If you have not gotten your hands on HBT 6.6.0 yet (I think there was links in the previous thread) I would recommend it just so you have an idea of now files are created and used which should inform usage of the files. There is at least one full sample with fighting type animations included for reference material.

It might be possible to convert some files to the 6.6.0 format via AssetCc2 (i.e. export to xml then import using 6.6.0 version) but about 20 classes have been changed since then so not sure how well that will work in practice.

I also would use the Havok AssetCc2 2010.2 to convert any files from HBT 6.6.0 instead of my converter because I lack the patching to alter several classes to go from 6.6.0 to 2010.2. I can add those later if HBT turns out to be useful other than as a reference tool.

In any case there is raw meat for the wolves to go after and hopefully we can stream line the process and many write some tools once we know what we are doing.
User avatar
Dawn Porter
 
Posts: 3449
Joined: Sun Jun 18, 2006 11:17 am

Post » Sun May 27, 2012 2:23 am

I've uploaded version 1.4. The most interesting piece is ability to now read/write the Havok Behavior files with the "convert" command so files can be exported to either pfxml or tagxml and then reimported after edit. I've also changed some timings on fore's behalf to possibly help fix some timing issues in the animations.

This is awesome, thanks for all your work on this. Just when I was pretty sure I had the XML for the animations all figured out, now it looks like I've got... THIS. Whelp, looks like I know what I'm going to be doing for the next day or so: staring blankly at a computer screen in some vain attempt to grok something I'm not properly equipped to grok.

EDIT: Good lord, these things are arcane. Okay brain, you can do this...

EDIT 2: Notes I've made:
Spoiler
Alright, I'm starting with 1HM_Behavior, because 0_Master is big. Looks like we've got the main entry found in Object 3775 named "1HM_Behavior" which lists 11 "states", each with their own object #, which goes to name them as 1_HM_Ready_State, Recoil, RecoilLarge, AttackState, BlockState, BashState, 1HM_Shout_State, Bow_AttackState, CombatIdles, VictimState and KillMoveState.

I delved further into AttackState, object #3705, which called on several other objects, a list of "enterNotifyEvents" and "exitNotifyEvents", one that lists its "transitions" and another that it calls its "generator"

AttackState's "transitions" object is #3701. It lists even more objects, a transition and a condition, as well as an Event ID and a toStateID.


Here I got tired of my top-down approach, so I came at it from the other way, running a search for the name of an animation I've been using, dw1hm1hm_specialattackpower.hkx.

This led me to object #1930, which is where the animation is actually called. That object refferenced another, #1931, which it calls its "triggers"

#1931 was very interesting, as it contained what appeared to be the data found in the "animationData" folder, namely events and times in the animation where they should occur.


Obviously, I have a long way to go in figuring this all out, but it's already quite clear to me that making serious alterations to one of these files without some kind of User Interface is going to be a huge challenge. All these objects linking to other objects in a complex web would be confusing enough even if we don't have to view every event and object as their various ID numbers, especially with the thousands of objects and hundreds of events we're working with.

Further, we're going to have a major challenge with mod intercompatability: if one mod has it's own version of 1HM_Behavior while another has it's own, those two mods will never work together. Even if the modders make their own Behavior File (Dementors_H2H_Behaviors, for example) which don't replace any existing behaviors, I assume they'd still have to alter 0_Master in order to call the appropriate behaviors, and two mods, each with their own version of 0_Master will never be compatible, which leaves us with the terribly sloppy solution of making a new race with copied behaviors, which is what we're doing now anyway.

What we need, in order for our mods to function alongside one another, is a management utility that can compile the modded versions of the behavior files together. That seems like an awfully tall order though.
User avatar
sam smith
 
Posts: 3386
Joined: Sun Aug 05, 2007 3:55 am

Post » Sat May 26, 2012 7:24 pm

Hi Thank!!

I have problem with long hkx....

"hkxcmd exportkf skeleton.hkx temp.hkx export.kf"

Error processing skeleton 'Npc Root [root]' Number of tracks exceed bones.
Export failed for '.\export.kf'

Animation is converted from Miku Miku dance program and is 8000 or 9000 frame..... :blink: :banana:

Mod from Friend.

http://www.youtube.com/watch?v=gRzTifuejno
User avatar
Gemma Archer
 
Posts: 3492
Joined: Sun Jul 16, 2006 12:02 am

Post » Sat May 26, 2012 6:57 pm

Hi Thank!!

I have problem with long hkx....

"hkxcmd exportkf skeleton.hkx temp.hkx export.kf"

Error processing skeleton 'Npc Root [root]' Number of tracks exceed bones.
Export failed for '.\export.kf'

Animation is converted from Miku Miku dance program and is 8000 or 9000 frame..... :blink: :banana:

Mod from Friend.

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

That is awesome, I never realized how far SR draw distance is, I can see a dragon flying way in the backround, that is the best actor draw distance I have ever seen in an rpg!

So based on this mod custom animations cleary work or am I missing something?
User avatar
Annika Marziniak
 
Posts: 3416
Joined: Wed Apr 18, 2007 6:22 am

Post » Sat May 26, 2012 8:16 pm

Ok, I've managed to get a single idle animation (named Idle.HKX) into the game, but I'm not sure how to add any other animations for my custom race. What do I need to do in 3DS Max aside from setting up each keyframe of the animation?
How do I know which animations to overwrite, and do my new animations have to have the same exact name?
What do I do in gameplay>animations in the creation kit once I have the animation running in the actor window?

I have a full walk cycle with a beginning, middle, and end that I can cut up and use, but I don't know exactly how to get the animation to run when my actor walks. (hey look, a pun)
Also, it doesn't seem to attack anything. Do I need to have animations for that as well?

aaand one more thing. It seems I've accidentally enabled head tracking, but when it tries to look at me, its whole body contorts in really weird ways, and it's back right leg seems to also be affected by this while the back left leg stays still. I'm not sure if the bone names are what decide what will rotate towards the player but any help on that would also be appreciated.

i.imgur(DOT)com/9hnMm.jpg

I'm very new to all this, if it's not obvious already.
User avatar
i grind hard
 
Posts: 3463
Joined: Sat Aug 18, 2007 2:58 am

Post » Sat May 26, 2012 3:47 pm

This is fantastic work Hologram, sadly I do not have the time to really dig into anything as yet as I am busy with a paying project so no real modding for me for a while.

With luck you will have progressed this a bit further by the time I can really start to use it.
User avatar
Rhi Edwards
 
Posts: 3453
Joined: Fri Jul 28, 2006 1:42 am

Post » Sat May 26, 2012 7:19 pm

I think i have a real break-through.

I changed some behavior fies using Hologram's invaluable hkxcmd release. With that I have defined 2 NEW anim events, and I have a script with which I can animate a standard race NPC to play 2 new Idles associated with these events. In other words ...

we can add NEW Idles WITHOUT replacing old ones

The process is more complicated than I had expected, and requires the addition or change of data in at least 8 different classes, mostly in mt_behavior.hkx. I still want to straighten out some things, and also want to test if it is possible to add like 100 animations. So before everybody bugs me what to do, please give me some time so I can publish all of that, maybe make a little mod to prove it. I didn't have much sleep last night, and also need to keep up with real world tasks.
User avatar
Kortknee Bell
 
Posts: 3345
Joined: Tue Jan 30, 2007 5:05 pm

Post » Sun May 27, 2012 4:29 am

Convert Havok XML file to Packed Binary Win32 (version which is compatible with Skyrim)
hkxcmd.exe convert -v:WIN32 0_master.xml data\meshes\actors\character\behaviors\0_master.hkx

This is what eventually solved my problem. Before, I had been exporting as a 2011 XML, transplanting the data into a 2010 XML file, then using the 2010 Havok Preview Tool to save as a 2010 packfile. For whatever reason, this created "multiple bindings" in the resulting packfile, which made Skyrim not play them properly. Converting them with hkxcmd instead apparently solved the problem.

Further, I think I have a pretty good handle now on how the behavior files work, enough, at least, that I feel fairly comfortable attempting to alter them to add in my unique Hand to Hand stances in. It will be a while until I have the mechanical elements figured out to my liking (I had in mind a power-attacking mechanic that was somewhat more similar to casting a spell, in that you could hold down the button and keep it readied until you were ready to actually execute the attack) but that's a stretch goal at this point.
User avatar
dell
 
Posts: 3452
Joined: Sat Mar 24, 2007 2:58 am

Post » Sun May 27, 2012 1:48 am

@fore, good work thanks for digging into this. I've really been stretched thin and really haven't had much time to actually look at the content of the classes rather than working on how to extract the information I require.

@Dementor, that is really good sounds like one less step. Sorry couldn't automate the procedure at this time. Have you tried looking at the tagxml format. I have a feeling it may be slightly more transportable than the packfile xml file.

@umpa, basically my tool requires very rigid requirements around the number of bones in the skeleton vs the number of bones listed in the animation. You get that error if you exceed the number of bones. I think you probably have something like cameras or extra bones in the skeleton and my tool is rejecting it. Could be something like a camera angle as well. Without the file I couldn't help and then not sure i have time. Really amazing work in getting that converted though. Some instances of gimbal lock in the arms but nothing too terrible. The fact that you got hands and fingers working well is also quite a feat.
User avatar
louise fortin
 
Posts: 3327
Joined: Wed Apr 04, 2007 4:51 am

Post » Sun May 27, 2012 2:49 am


I spent a good bit of time last night working on fixing the issues in http://www.youtube.com/watch?v=Cisn0z5KxqM&list=UUFPYvc_Hb0k5CNForvnqdmg&index=1&feature=plcp and I got the game to accept a completely new state "SwimCombatStart" and attached the swimming animations from the non-combat swim to it then enabled drawing and sheathing while swimming ! :)

So basically I have successfully gotten a completely new State to be accepted in the game -> though it is one that already exists in the engine -> next I am going to see if I can get the game to allow me to create a new 1HSpear Combat State and attach/create the events for the Spear Attacks.
User avatar
Rude Gurl
 
Posts: 3425
Joined: Wed Aug 08, 2007 9:17 am

Post » Sun May 27, 2012 3:20 am

Just wanted to stop by and tell you guys that you're doing awesome work! Thanks to The Hologram and everyone involved. :D

We're relying heavily on your tools in our animation pipeline for DoKD so we're happy to see how fast the updates are coming.
User avatar
Samantha hulme
 
Posts: 3373
Joined: Wed Jun 21, 2006 4:22 pm

Post » Sat May 26, 2012 11:40 pm

nice ... if u want a spear model let me know :P ....
User avatar
Robert
 
Posts: 3394
Joined: Sun Sep 02, 2007 5:58 am

Post » Sun May 27, 2012 1:42 am

I spent a good bit of time last night working on fixing the issues in http://www.youtube.com/watch?v=Cisn0z5KxqM&list=UUFPYvc_Hb0k5CNForvnqdmg&index=1&feature=plcp and I got the game to accept a completely new state "SwimCombatStart" and attached the swimming animations from the non-combat swim to it then enabled drawing and sheathing while swimming ! :smile:

So basically I have successfully gotten a completely new State to be accepted in the game -> though it is one that already exists in the engine -> next I am going to see if I can get the game to allow me to create a new 1HSpear Combat State and attach/create the events for the Spear Attacks.
Great to hear you're still finding time for this. I think I've gotten a pretty good understanding of the behavior files and how they work by transitioning from one state to another based on events and conditions. One thing that I'm still not sure I get, though, is how we can create our own variables. For example, when the behavior looks at the "iRightHandType" variable, it's going to wind up with an integer 0-11, each number corresponding to an equipment type (unarmed, dagger, 1Hsword, 1Haxe, etc) Ideally, it would be best of we could alter said variable to give more results based on custom keywords, ie 12 = 1HSpear, 13=XBow, etc. I don't think we can do this however, so we need another variable check. Can we create or own variable, toggle it true/false via scripts in papyrus, then have the Havok behaviors respond appropriately? If so, how?
User avatar
[Bounty][Ben]
 
Posts: 3352
Joined: Mon Jul 30, 2007 2:11 pm

Post » Sat May 26, 2012 6:58 pm

Am I being stupid here? But I can't convert the pair animation file to kf format in the folder actors/sharedkillmoves :(
User avatar
Lily Something
 
Posts: 3327
Joined: Thu Jun 15, 2006 12:21 pm

Post » Sat May 26, 2012 3:42 pm

Can someone please explain how I can get my walking animation working in game? it shows up in the list of animations in the class window in the CK, but I don't know which animation to replace or what do to in the gameplay> animation list. I've gone a week without making any progress and it's really annoying.
User avatar
Naomi Lastname
 
Posts: 3390
Joined: Mon Sep 25, 2006 9:21 am

Post » Sat May 26, 2012 6:11 pm

Am I being stupid here? But I can't convert the pair animation file to kf format in the folder actors/sharedkillmoves :(
No. Not supported at the moment. I probably have sit down and understand what is going on. There are far more tracks than bones in the skeleton because its paired so probably need a new command for doing this conversion.
User avatar
Maya Maya
 
Posts: 3511
Joined: Wed Jul 05, 2006 7:35 pm

Post » Sun May 27, 2012 2:05 am

Am I being stupid here? But I can't convert the pair animation file to kf format in the folder actors/sharedkillmoves :(

You need a special Skeleton.nif that was created for Paired Animations that contains both actors and the Paired Root, 1st Actor Root and Second Actor Root, I created one and gave it out its linked to in the First thread.

Great to hear you're still finding time for this. I think I've gotten a pretty good understanding of the behavior files and how they work by transitioning from one state to another based on events and conditions. One thing that I'm still not sure I get, though, is how we can create our own variables. For example, when the behavior looks at the "iRightHandType" variable, it's going to wind up with an integer 0-11, each number corresponding to an equipment type (unarmed, dagger, 1Hsword, 1Haxe, etc) Ideally, it would be best of we could alter said variable to give more results based on custom keywords, ie 12 = 1HSpear, 13=XBow, etc. I don't think we can do this however, so we need another variable check. Can we create or own variable, toggle it true/false via scripts in papyrus, then have the Havok behaviors respond appropriately? If so, how?

I doubt its going to be possible to do this through Behavior as Skyrim.exe directly references these variables, my plan is to use the Animation Manager and just condition which events to send to the Behavior Graph as far as behavior is concerned these states will still be within the limits of what exists in Skyrim.exe so basically Behavior will have every state concerning Daggers doubled and attacks one will go to normal dagger anims and the other to Spear anims -> what I'm doing is basically copy/paste and renumber for all of the dagger states/behaviors/events/transitions and assigning the anims to lead to my spear anims, then including the paths and transitions from the base states to mine -> with luck once I am done it will not explode the game.
User avatar
matt
 
Posts: 3267
Joined: Wed May 30, 2007 10:17 am

Post » Sat May 26, 2012 6:39 pm

I doubt its going to be possible to do this through Behavior as Skyrim.exe directly references these variables, my plan is to use the Animation Manager and just condition which events to send to the Behavior Graph as far as behavior is concerned these states will still be within the limits of what exists in Skyrim.exe so basically Behavior will have every state concerning Daggers doubled and attacks one will go to normal dagger anims and the other to Spear anims -> what I'm doing is basically copy/paste and renumber for all of the dagger states/behaviors/events/transitions and assigning the anims to lead to my spear anims, then including the paths and transitions from the base states to mine -> with luck once I am done it will not explode the game.
So, okay, so in the animation manager, you'd take the "ActionRightAttack" entry and add a new sub to it "AttackSpearRightForwardSprinting" that says "if you're a spear, do this one." Okay, cool... but then you have it send... what? Are there unused events? Or would it work to use an event that the current state (states? Is the actor only ever in one state, or is he in each state his current state is a child of?) isn't "looking for?" ie, using a "bowRelease" event when you aren't pulling back or even weilding a bow?

I wonder...

If you give a weapon three different weapon type keywords, would the "iRightHandType" variable add the values of the three keywords together? Would a waraxe, a mace, and a greatsword = 12? If so, that would be a much more elegant solution, plus it would open up these mods for some kind of compatibility, with 10 extra "weapon types" to work with in theory (though we'd still have to create new combination behavior files on a case-by-case basis). Feats which effect used keywords would have to be amended to include things like "is a sword but is NOT a waraxe" but that seems like a relatively minor detail.

More likely, though, doing this would just break the game. Still worth a try, neh? Is it appropriate to assume that the "GetEquippedItemType Right" command will return the same results as "iRightHandType"? Because I'm about to go test what happens when I add an extra keyword to a weapon in Skyrim.

EDIT: Disappointingly, there was no effect: apparently at least "GetEquippedItemType" only checks the first keyword, so even though I added the "Mace" keyword to a sword, it didn't return anything but the normal "1". Which is too bad.
User avatar
Laura-Jayne Lee
 
Posts: 3474
Joined: Sun Jul 02, 2006 4:35 pm

Post » Sun May 27, 2012 4:13 am

Folks, I just released my http://skyrim.nexusmods.com/downloads/file.php?id=11811 It adds 400 new animation slots in the behavior files, which are free to use in all different mods. Except for the first 50, which I have reserved for a small plugin, which let's you perform idles of your choice by any NPC. Preferrably the one that are not moving.

I have also opened a thread over here in this forum: http://www.gamesas.com/topic/1354891-rel-fores-new-idles-in-skyrim-fnis/
Thanks to all you have participated here in this thread. Without all of you, and without your great tool, Hologam, I would probably still mediate on how the heck I can just open one of those animation files. Animation, NOT behavior. :smile:
User avatar
Scarlet Devil
 
Posts: 3410
Joined: Wed Aug 16, 2006 6:31 pm

Post » Sun May 27, 2012 3:33 am

Man you guys are so incredibly intelligent and talented. Thank you so much for all of your hard work.
User avatar
Keeley Stevens
 
Posts: 3398
Joined: Wed Sep 06, 2006 6:04 pm

Post » Sun May 27, 2012 4:24 am

What great news! I feel like hugging someone but I just woke up from a nightmare, so that may be why!
User avatar
lolli
 
Posts: 3485
Joined: Mon Jan 01, 2007 10:42 am

Post » Sun May 27, 2012 1:26 am

This may be a noobish question, but I'm wondering where the 'movement' of animations is stored. When I import an animation the actor performs the animation, but doesn't move along the y axis like he should. This is true for all animations (running, attacking etc). In Oblivion there was the bip01 node for movement, is there something similar for hkx anims? Or is this stored in the behavior files as well?
User avatar
Scarlet Devil
 
Posts: 3410
Joined: Wed Aug 16, 2006 6:31 pm

PreviousNext

Return to V - Skyrim