Combat Overhaul Alpha

Show off your mod creations or just a work in progress.
Post Reply
l3lessed
Posts: 1399
Joined: Mon Aug 12, 2019 4:32 pm
Contact:

Re: Combat Overhaul Alpha

Post by l3lessed »

Making some progress to first release again. Moved everything over to the newest 10.9 build.

I'm waiting because I realized, there is no reason to release this if users have no way of seeing the range and weapon speed of an item in game. How can I fine tune the numbers without users having this information?

So, I've been spending time digging into how the UI and Text coding system works and finally deciphered how it sets up UI components and, more importantly, how it creates and renders the texts. In short, it uses a RSC token system for reading and rendering texts.

I was finally able to put in an extra line in the item information read out area for range, and one in the pop-up info window too. It also has a simple switch, so range text will only show if the item has a usable range.

I need to add a speed readout line, but I plan on only putting that in the pop-up information window. It shouldn't be needed or used passed debugging and tuning.

I also created a quick method for setting the current render frame from outside the fpsweapon script. I needed this to ensure proper frame numbers when recoil animation system kicked in, but it is also nice to have, as I or others may need to mess with the current render frame.

I'm thinking one more week, especially if work is slow.
My Daggerfall Mod Github: l3lessed DFU Mod Github

My Beth Mods: l3lessed Nexus Page

Daggerfall Unity mods: Combat Overhaul Mod

Enjoy the free work I'm doing? Consider lending your support.

User avatar
King of Worms
Posts: 4752
Joined: Mon Oct 17, 2016 11:18 pm
Location: Scourg Barrow (CZ)
Contact:

Re: Combat Overhaul Alpha

Post by King of Worms »

Very nice progress, Im eager to test it, but take your time ;)

l3lessed
Posts: 1399
Joined: Mon Aug 12, 2019 4:32 pm
Contact:

Re: Combat Overhaul Alpha

Post by l3lessed »

Been dumping good amount of time into this last two days. I created a for loop to run my offset routine, which increases code efficiency and makes it easier for future adjustment and debugging. I also cleaned out some old unused code. I finished the UI portion too: Now the item scroll over panel shows item ranges, if they have one; On opening the item info ui, you will see all the normal stuff, plus the item range, and finally the item inertia. Think of this as the amount of force it takes to swing the weapon. The higher the inertia value, the more it will slow down the default attack speed. Also worked little on the recoil animations, nothing really noticeable.

I hit two roadblocks:
The first, I found I wasn't transferring weapon attack speeds into the animation system, so weapons didn't have different attack speeds. I don't think this will be too hard to sort out, just need a few hours, so I have ignored it so I could focus on the harder second problem.
The second was a complicated issue of how engines and computers render animations, how the df engine was built to render, and how to scale all of it with the old, rudimentary attack speed/animation system, but I am getting close to a hacky solution right now for this..

Once I felt good with my old animation system, I tested it on the highest attack speed. And, as expected, a bug appeared. Even though attack speeds were set to the max (lowest animation time), the animation still seemed to go way slower than it should.

I quickly figured I was rendering offsets faster than the frames allowed. What I mean, the fastest the engine will tend to compute is at 60 frames a second or one computation every .016 seconds.

The fastest attack animation processes each animation frame at .045 seconds for a total animation attack speed of .22 seconds. Well, that only allows the routine to render at max 4 offsets before the number of offset calculations take longer than the original animation time, and this slow down the attack speeds. Again, the engine can only render an offset at .016 seconds, and this is at 60fps too.

Well, after a day trying differing solutions to try and get proper offset scaling no matter your attack speed, I have come up with a hacky solution that will work until I possibly find a better route. It uses a mathf.lerp calculator and the base attack speed ratios and offset values.

Whenever an animation is triggered, I have a routine that calculates the number of max offsets that can be rendered based on the returned attack speed of the player; the faster the animation the fewer offset frames are allowed to render. It then uses this to run a for loop that stops when max offset frames are reached. The for loop itself uses a mathf.lerp command combined with a time calculator and a offset calculator based on animation time to continually move the animation frame at the right intervals and offset frames, no matter how slow or fast the animation.

The limits of this system are that is is hindered by individual user frame rates. I need to test this by forcing a lower frame rate to see how it screws with it. Right now, the system is assuming a constant 60 fps by the user.

The other limit is that the faster the animation, the lower the amount of offset frames, and the more frame skipping you will notice. However, the decreased time between the 5 frame renders helps smooth out the lower number of offset frames. The fastest attack, which has the lowest amount of frames, still goes from 4 frames to 20 frames, a five fold increase. At the slowest attack speed, you get something like 150+ animation frames. This helps keep the appearance of a smooth hi-frame animation no matter attack speed.
Last edited by l3lessed on Thu Nov 21, 2019 12:35 am, edited 1 time in total.
My Daggerfall Mod Github: l3lessed DFU Mod Github

My Beth Mods: l3lessed Nexus Page

Daggerfall Unity mods: Combat Overhaul Mod

Enjoy the free work I'm doing? Consider lending your support.

l3lessed
Posts: 1399
Joined: Mon Aug 12, 2019 4:32 pm
Contact:

Re: Combat Overhaul Alpha

Post by l3lessed »

Here is my offset routine:
I Honestly do not 100% understand how the timer calculators are working with the mathf.lerp calculator, but they seem to be working; So will see how this goes upon release and larger testing. :lol:

Code: Select all

if (WeaponState != WeaponStates.Idle && !GameManager.Instance.WeaponManager.hitobject && WeaponType != WeaponTypes.Bow)
                {
                    //gets and sets the animation time
                    time = GetAnimTickTime();
                    //calculates the totaloffsets possible within the attack animation time (For every .01s of animation time, add an offsetframe).
                    int totalOffsets = (int)(time * 100);
                    //figure out the amount of time the animation routine should wait based on the calculated offsets frames.
                    float waitTime = (time / totalOffsets);
                    //grab the current time since this routine/script began.
                    float frameTime = Time.time;
                    //figure out the duration ratio between the current time passed and the animation time.
                    //used to move the mathf.lerp numbers and this the frame.
                    float t = (frameTime / time);

                    //begin for loop to loop until the maximum number of offset frames are ran.
                    for (int Offset = 0; Offset < totalOffsets; Offset++)
                    {
                        //debugging messages I commented out but are keeping for later use.
                        // DaggerfallUI.Instance.PopupMessage("Time: " + time.ToString());
                        // DaggerfallUI.Instance.PopupMessage("DTime: " + frameTime.ToString());
                        // DaggerfallUI.Instance.PopupMessage("Total: " + t.ToString());

                        //calculates maxoffset based on the attack animations speed. uses
                        //the base maximum animation speed offset value & multiplies it by
                        //the player speeds ratio to the max.
                        float maxOffset = .0075f * (345 / speed);
                        //figures out offset position using the above calculated numbers.
                        offsetposition = Mathf.Lerp(0, maxOffset, t);
                        //sets the posi position, which moves the animation in the above positioning routines.
                        posi = posi + offsetposition;
                        //waits the calculated time for the frame offset total.
                        yield return new WaitForSeconds(waitTime);
                    }
                }
Here is the animation position routines that use the above offset coroutine

Code: Select all

    try
            {
                bool isImported = customTextures.TryGetValue(MaterialReader.MakeTextureKey(0, (byte)weaponAnimRecordIndex, (byte)currentFrame), out curCustomTexture);
                if (FlipHorizontal && (weaponState == WeaponStates.Idle || weaponState == WeaponStates.StrikeDown || weaponState == WeaponStates.StrikeUp))
                {
                    // Mirror weapon rect
                    if (isImported)
                    {
                        curAnimRect = new Rect(1, 0, -1, 1);
                    }
                    else
                    {
                        Rect rect = weaponRects[weaponIndices[weaponAnimRecordIndex].startIndex + currentFrame];
                        curAnimRect = new Rect(rect.xMax, rect.yMin, -rect.width, rect.height);
                    }
                }
                else
                {
                    if (weaponState == WeaponStates.Idle)
                    {
                        if ((InputManager.Instance.HasAction(InputManager.Actions.MoveRight) || InputManager.Instance.HasAction(InputManager.Actions.MoveLeft) || InputManager.Instance.HasAction(InputManager.Actions.MoveForwards) || InputManager.Instance.HasAction(InputManager.Actions.MoveBackwards)))
                        {
                            if (bob >= .10f && bobSwitch)
                                bobSwitch = false;
                            else if (bob <= 0 && !bobSwitch)
                                bobSwitch = true;

                            if (bobSwitch)
                                bob = bob + Random.Range(.0005f, .001f);
                            else
                                bob = bob - Random.Range(.0005f, .001f);
                        }

                        curAnimRect = isImported ? new Rect(0, 0, 1, 1) : weaponRects[weaponIndices[0].startIndex];
                        weaponAnimRecordIndex = 0;
                        anim.Offset = (bob / 1.5f) - .07f;
                        anim.Offsety = (bob * 1.5f) - .15f;
                    }
                    else
                    {
                        curAnimRect = isImported ? new Rect(0, 0, 1, 1) : weaponRects[weaponIndices[weaponAnimRecordIndex].startIndex + currentFrame];
                        if (weaponState == WeaponStates.StrikeLeft)
                        {
                            if (WeaponType == WeaponTypes.Flail || WeaponType == WeaponTypes.Flail_Magic)
                            {
                                if (GetCurrentFrame() <= 1)
                                {
                                    curAnimRect = isImported ? new Rect(0, 0, 1, 1) : weaponRects[weaponIndices[3].startIndex + 3];
                                    weaponAnimRecordIndex = 3;
                                    anim.Offset = posi - .65f;
                                }
                                else if (GetCurrentFrame() == 2)
                                {
                                    posi = posi + .002f;
                                    Rect rect = weaponRects[weaponIndices[6].startIndex + 2];
                                    curAnimRect = new Rect(rect.xMax, rect.yMin, -rect.width, rect.height);
                                    weaponAnimRecordIndex = 6;
                                    anim.Offset = posi + .1f;
                                }
                                else
                                {
                                    anim.Offset = posi;
                                    anim.Offsety = (posi / 2) * -1;
                                }
                            }
                            else if (WeaponType == WeaponTypes.Dagger || WeaponType == WeaponTypes.Dagger_Magic)
                            {
                                if (GetCurrentFrame() <= 1)
                                {
                                    curAnimRect = isImported ? new Rect(0, 0, 1, 1) : weaponRects[weaponIndices[2].startIndex + 2];
                                    weaponAnimRecordIndex = 2;
                                    anim.Offset = posi - .25f;
                                }
                                else
                                {
                                    anim.Offset = posi;
                                    anim.Offsety = (posi / 2) * -1;
                                }
                            }
                            else if (WeaponType == WeaponTypes.Battleaxe_Magic)
                            {
                                if (currentFrame <= 1)
                                {
                                    curAnimRect = isImported ? new Rect(0, 0, 1, 1) : weaponRects[weaponIndices[4].startIndex + currentFrame];
                                    anim.Offset = posi;
                                    anim.Offsety = (posi / 6) * -1;
                                }
                                else if (currentFrame == 2)
                                {
                                    curAnimRect = isImported ? new Rect(0, 0, 1, 1) : weaponRects[weaponIndices[4].startIndex + currentFrame];
                                    anim.Offset = posi + .1f;
                                    anim.Offsety = (posi / 6) * -1;
                                }
                                else if (currentFrame == 3)
                                {
                                    curAnimRect = isImported ? new Rect(0, 0, 1, 1) : weaponRects[weaponIndices[4].startIndex + currentFrame];
                                    anim.Offset = posi + .2f;
                                    anim.Offsety = (posi / 6) * -1;
                                }
                                else if (currentFrame == 4)
                                {
                                    curAnimRect = isImported ? new Rect(0, 0, 1, 1) : weaponRects[weaponIndices[4].startIndex + currentFrame];
                                    anim.Offset = posi + .3f;
                                    anim.Offsety = (posi / 6) * -1;
                                }
                            }
                            else
                            {
                                anim.Offset = posi;
                                anim.Offsety = (posi / 6) * -1;
                            }

                        }
                        else if (weaponState == WeaponStates.StrikeRight)
                        {
                            if (WeaponType == WeaponTypes.Flail || WeaponType == WeaponTypes.Flail_Magic)
                            {
                                if (currentFrame <= 1)
                                {
                                    curAnimRect = isImported ? new Rect(0, 0, 1, 1) : weaponRects[weaponIndices[4].startIndex + 3];
                                    weaponAnimRecordIndex = 4;
                                    anim.Offset = posi - .65f;
                                }
                                else if (currentFrame == 2)
                                {
                                    posi = posi + .003f;
                                    curAnimRect = isImported ? new Rect(0, 0, 1, 1) : weaponRects[weaponIndices[6].startIndex + 2];
                                    weaponAnimRecordIndex = 6;
                                    anim.Offset = posi + .075f;
                                    anim.Offsety = (posi / 2) - .1f;
                                }
                                else
                                {
                                    anim.Offset = posi;
                                    anim.Offsety = posi / 2;
                                }
                            }
                            else if (WeaponType == WeaponTypes.Dagger || WeaponType == WeaponTypes.Dagger_Magic)
                            {
                                if (currentFrame <= 1)
                                {
                                    curAnimRect = isImported ? new Rect(0, 0, 1, 1) : weaponRects[weaponIndices[5].startIndex + 2];
                                    weaponAnimRecordIndex = 5;
                                    anim.Offsety = posi + .25f;
                                    anim.Offset = posi - .25f;
                                }
                                else
                                {
                                    anim.Offset = posi;
                                    anim.Offsety = posi / 2;
                                }
                            }
                            else if (WeaponType == WeaponTypes.Battleaxe_Magic)
                            {
                                if (currentFrame <= 1)
                                {
                                    curAnimRect = isImported ? new Rect(0, 0, 1, 1) : weaponRects[weaponIndices[5].startIndex + currentFrame];
                                    anim.Offset = posi;
                                    anim.Offsety = (posi / 6) * -1;
                                }
                                else if (currentFrame == 2)
                                {
                                    curAnimRect = isImported ? new Rect(0, 0, 1, 1) : weaponRects[weaponIndices[5].startIndex + currentFrame];
                                    anim.Offset = posi + .1f;
                                    anim.Offsety = (posi / 6) * -1;
                                }
                                else if (currentFrame == 3)
                                {
                                    curAnimRect = isImported ? new Rect(0, 0, 1, 1) : weaponRects[weaponIndices[5].startIndex + currentFrame];
                                    anim.Offset = posi + .2f;
                                    anim.Offsety = (posi / 6) * -1;
                                }
                                else if (currentFrame == 4)
                                {
                                    curAnimRect = isImported ? new Rect(0, 0, 1, 1) : weaponRects[weaponIndices[5].startIndex + currentFrame];
                                    anim.Offset = posi + .3f;
                                    anim.Offsety = (posi / 6) * -1;
                                }
                            }
                            else
                            {
                                anim.Offset = posi;
                                anim.Offsety = posi / 2;
                            }


                        }
                        else if (weaponState == WeaponStates.StrikeDown)
                        {
                            if (WeaponType == WeaponTypes.Flail || WeaponType == WeaponTypes.Flail_Magic)
                            {
                                if (currentFrame <= 1)
                                {
                                    curAnimRect = isImported ? new Rect(0, 0, 1, 1) : weaponRects[weaponIndices[2].startIndex + 1];
                                    weaponAnimRecordIndex = 2;
                                    anim.Offset = (posi / 4) - .27f;
                                    anim.Offsety = .21f - posi;
                                }
                                else if (currentFrame == 2)
                                {
                                    curAnimRect = isImported ? new Rect(0, 0, 1, 1) : weaponRects[weaponIndices[6].startIndex + 3];
                                    weaponAnimRecordIndex = 6;
                                    anim.Offset = (posi / 4) - .10f;
                                    anim.Offsety = .05f - (posi);
                                }
                                else if (currentFrame == 3)
                                {
                                    curAnimRect = isImported ? new Rect(0, 0, 1, 1) : weaponRects[weaponIndices[6].startIndex + 2];
                                    weaponAnimRecordIndex = 6;
                                    anim.Offset = posi / 4;
                                    anim.Offsety = ((posi) * -1) - .05f;
                                }
                                else
                                {
                                    curAnimRect = isImported ? new Rect(0, 0, 1, 1) : weaponRects[weaponIndices[6].startIndex + 1];
                                    weaponAnimRecordIndex = 6;
                                    anim.Offset = posi / 4;
                                    anim.Offsety = ((posi) * -1) - .1f;
                                }
                            }
                            else if (WeaponType == WeaponTypes.Dagger || WeaponType == WeaponTypes.Dagger_Magic)
                            {
                                if (currentFrame <= 1)
                                {
                                    curAnimRect = isImported ? new Rect(0, 0, 1, 1) : weaponRects[weaponIndices[2].startIndex + 2];
                                    weaponAnimRecordIndex = 2;
                                    anim.Offset = (posi / 2) - .2f;
                                    anim.Offsety = ((posi) * -1) + .05f;
                                }
                                else
                                {
                                    anim.Offset = posi / 4;
                                    anim.Offsety = (posi) * -1;
                                }
                            }
                            else if (WeaponType == WeaponTypes.Battleaxe || WeaponType == WeaponTypes.Battleaxe_Magic)
                            {
                                if (currentFrame <= 1)
                                {
                                    curAnimRect = isImported ? new Rect(0, 0, 1, 1) : weaponRects[weaponIndices[6].startIndex + 3];
                                    weaponAnimRecordIndex = 1;
                                    anim.Offset = (posi / 4) - .025f;
                                    anim.Offsety = (posi * -1) + .1f;
                                }
                                else if (currentFrame == 2)
                                {
                                    posi = posi + .003f;
                                    curAnimRect = isImported ? new Rect(0, 0, 1, 1) : weaponRects[weaponIndices[6].startIndex + 4];
                                    weaponAnimRecordIndex = 1;
                                    anim.Offset = (posi / 4) + .05f;
                                    anim.Offsety = (posi * -1) - .2f;
                                }
                                else if (currentFrame == 3)
                                {
                                    posi = posi + .003f;
                                    anim.Offset = (posi / 4) + .1f;
                                    anim.Offsety = ((posi) * -1) - .05f;
                                }
                                else
                                {
                                    posi = posi + .003f;
                                    anim.Offset = (posi / 4) + .1f;
                                    anim.Offsety = ((posi) * -1) - .15f;
                                }
                            }
                            else
                            {
                                if (currentFrame <= 1)
                                {
                                    curAnimRect = isImported ? new Rect(0, 0, 1, 1) : weaponRects[weaponIndices[6].startIndex + 3];
                                    weaponAnimRecordIndex = 1;
                                    anim.Offset = (posi / 4) - .125f;
                                    anim.Offsety = (posi * -1) + .05f;
                                }
                                else if (currentFrame == 2)
                                {
                                    posi = posi + .003f;
                                    curAnimRect = isImported ? new Rect(0, 0, 1, 1) : weaponRects[weaponIndices[6].startIndex + 4];
                                    weaponAnimRecordIndex = 1;
                                    anim.Offset = (posi / 4) - .075f;
                                    anim.Offsety = (posi * -1) - .2f;
                                }
                                else if (currentFrame == 3)
                                {
                                    posi = posi + .003f;
                                    anim.Offset = (posi / 4) + .1f;
                                    anim.Offsety = ((posi) * -1) - .05f;
                                }
                                else
                                {
                                    posi = posi + .003f;
                                    anim.Offset = (posi / 4) + .1f;
                                    anim.Offsety = ((posi) * -1) - .15f;
                                }
                            }
                        }
                        else if (weaponState == WeaponStates.StrikeUp)
                        {
                            if ((WeaponType == WeaponTypes.Flail || WeaponType == WeaponTypes.Flail_Magic) && currentFrame < 4)
                            {
                                anim.Offsety = (posi / 2) - .22f;
                            }
                            else if ((WeaponType == WeaponTypes.Flail || WeaponType == WeaponTypes.Flail_Magic) && currentFrame == 4)
                            {
                                curAnimRect = isImported ? new Rect(0, 0, 1, 1) : weaponRects[weaponIndices[6].startIndex + 3];
                                anim.Offsety = (posi / 2) - .11f;
                            }
                            else
                            {
                                if (currentFrame < 2)
                                {
                                    curAnimRect = isImported ? new Rect(0, 0, 1, 1) : weaponRects[weaponIndices[0].startIndex];
                                    weaponAnimRecordIndex = 0;
                                    anim.Offsety = (posi * -1) * 2.2f;
                                }
                                else if (currentFrame == 2)
                                {
                                    curAnimRect = isImported ? new Rect(0, 0, 1, 1) : weaponRects[weaponIndices[6].startIndex + currentFrame];
                                    weaponAnimRecordIndex = 6;
                                    posi = posi + .004f;
                                    anim.Offsety = posi - 1.125f;
                                }
                                else if (currentFrame == 3)
                                {
                                    curAnimRect = isImported ? new Rect(0, 0, 1, 1) : weaponRects[weaponIndices[6].startIndex + currentFrame];
                                    weaponAnimRecordIndex = 6;
                                    posi = posi + .004f;
                                    anim.Offsety = posi - .8f;
                                }
                                else if (currentFrame == 4)
                                {
                                    curAnimRect = isImported ? new Rect(0, 0, 1, 1) : weaponRects[weaponIndices[6].startIndex + currentFrame];
                                    weaponAnimRecordIndex = 6;
                                    posi = posi + .004f;
                                    anim.Offsety = posi - .4f;
                                }
                            }

                        }
                    }
                }
My Daggerfall Mod Github: l3lessed DFU Mod Github

My Beth Mods: l3lessed Nexus Page

Daggerfall Unity mods: Combat Overhaul Mod

Enjoy the free work I'm doing? Consider lending your support.

User avatar
King of Worms
Posts: 4752
Joined: Mon Oct 17, 2016 11:18 pm
Location: Scourg Barrow (CZ)
Contact:

Re: Combat Overhaul Alpha

Post by King of Worms »

Interresting read, thanks for a update.
You will make it all work, I believe in you :))

l3lessed
Posts: 1399
Joined: Mon Aug 12, 2019 4:32 pm
Contact:

Re: Combat Overhaul Alpha

Post by l3lessed »

Thanks.

I fully understand how it is working now, and it actually does what it needs to do to scale properly. It uses an offset ratio to multiply by the screen animation position coordinates to move the sprite a small percentage. This ensures that offsets are maintained no matter screen resolution, since the offsets are computed based on an offset ratio versus a hard set number of pixels. Only thing I am still confused on is how the time.time calculator is working to compute the time ratio that is than used by the mathf.lerp to compute the new offset ratio based on the current time position. As of now, it works with max speed and minimum speed set and keeps the offsetting, smoothing scaled.

It seems to work on my system no matter the attack speed or resolution I set in the engine. But, as always, need more playhours racked up by myself and others to discover all the possible overlooked bugs.

So, just need to setup the more complicated melee attack offsets, do one more pass on the coding for cleanup, and then should drop the release. Just keep discovering one small hurdle after another everytime I think I am getting close. :?
My Daggerfall Mod Github: l3lessed DFU Mod Github

My Beth Mods: l3lessed Nexus Page

Daggerfall Unity mods: Combat Overhaul Mod

Enjoy the free work I'm doing? Consider lending your support.

l3lessed
Posts: 1399
Joined: Mon Aug 12, 2019 4:32 pm
Contact:

Re: Combat Overhaul Alpha

Post by l3lessed »

Figured out a method to help control offsets, animation speed no matter user framerate. I use a simple unscaled delta timer to calculate the avg fps at a set interval. I then use the average fps to calculate the max number of allowed offsets within the set target user FPS. This way the animation offsets scale with user framerates, so as long as players stays above 30 fps, there should be minimal slowing down or messing with default attack speeds. On very limited testing, animation smoothing scales no matter resolution, framerate, or timescale. Of course, quick spikes and drops in frame rates between my polling will still impact it, but we're talking about hundredths and tenths of full seconds.

I won't lie; I don't prefer some of these tricks, as they are more cpu cycle intensive than I original wanted and planned, but hey, you work with the solutions that the problems in front of you.

Now, I need to just finish the melee animations and track down a bug I introduced with the bow on accident then first release can drop. So close. Can't believe I broke the bow animation though, which is slowing me down.
My Daggerfall Mod Github: l3lessed DFU Mod Github

My Beth Mods: l3lessed Nexus Page

Daggerfall Unity mods: Combat Overhaul Mod

Enjoy the free work I'm doing? Consider lending your support.

User avatar
King of Worms
Posts: 4752
Joined: Mon Oct 17, 2016 11:18 pm
Location: Scourg Barrow (CZ)
Contact:

Re: Combat Overhaul Alpha

Post by King of Worms »

Great job dealing with those issues. I really look forward to this mod! You poured a lot of work and skills into it and Im sure this will enhance the very archaic original version. Thank you!

User avatar
King of Worms
Posts: 4752
Joined: Mon Oct 17, 2016 11:18 pm
Location: Scourg Barrow (CZ)
Contact:

Re: Combat Overhaul Alpha

Post by King of Worms »

Hey, I was wondering if any progess is being made on this mod. I really liked the way it made the animations smooth, the way the weapons swayed while walking and ofc the rest as well. Would be really sad if this was scrapped, I think its like 90% ready?

Ommamar
Posts: 541
Joined: Thu Jul 18, 2019 3:08 am

Re: Combat Overhaul Alpha

Post by Ommamar »

King of Worms wrote: Sun Mar 08, 2020 12:13 pm Hey, I was wondering if any progess is being made on this mod. I really liked the way it made the animations smooth, the way the weapons swayed while walking and ofc the rest as well. Would be really sad if this was scrapped, I think its like 90% ready?
Last edited by Ommamar on Sat Apr 18, 2020 12:29 am, edited 1 time in total.

Post Reply