Thursday, September 27, 2012

Blending Achieved!

I have finally solved an issue that I had since I started animating the character! The blending aspect! Before I had issues with the character not blending animations correctly. For example, if the character initiated the reload animation and then started moving, the model would glide until the reload animation was finished which then would cause the run animation to initiate. The two animations would never blend and the same goes for any animation that only involves the top half of the body like shooting. However, I did some more research on the topic and found out a tiny bit of information that I was apparently missing. I had my set up right in the character animtree involving the two animation nodes: tophalfslot and fullbodyslot. It turns out just like my professor had stated, that I needed to specify the bones in the properties that the tophalfslot node would be initiating the animations from. Once I did that and changed the script files so that only the tophalfslots would initiate animations for the top half of the body (like shooting, reloading, etc) and the fullbodyslot took care of the full body animations, I was golden! Everything is blending well now. You can see an example of it in the screenshot below.** Just pay attention to the legs animating while the reload animation is playing.

Reloading and Running! YES!


I also started on developing the blood particle for human blood. I created the texture of the blood using a blood brush that I downloaded from a source and then imported that into UDK to create the material. The material is not the best it could be, but it is sufficient. I quickly ran into a problem that I am still unsure as how to solve though. The material is correct but the particle system is spitting out a black version of the material. I have no idea why but I'm currently looking into it.

Wednesday, September 19, 2012

More Animations and A Little Scripts

This week I worked more on trying to make my animations look a little better. Because our main character has custom bones for his skeleton, it's really hard to show the weight impact on the feet when the player is running. I tried to implement that sort of animation to the best that I could, but it's not looking that good. It gives him more of a skiing animation then an actual run.
Another adjustment I made was the reload animation for the revolver. The previous animation was a bit of a mystery to the player because from their view all they say was the hand moving to the front of the character's body. I changed this to make the character take his left hand and act as if he's reaching into his pocket each time and putting a bullet into the revolver. This animation looks much better and is definitely more obvious in a visual sense as to show what exactly the character is doing.
One issue I ran into while implementing the reload animation was that when the reload animation was called, the player could actually hit the fire button and cause the fire animation to occur which would break the reload animation before it finished. This issue was not too difficult to solve. It just took some digging around in the weapon and pawn class. What I did was create the bool variable bIsReloading in the base UTWeapon class, and I check that if it's true in the pawn class then prevent the firing animation from taking place. This will be helpful when the rifle is implemented because the same check will prevent the rifle reload animation from being broken as well. You can see the code snippetof the StartFire function below from the pawn class.

simulated function StartFire(byte FireModeNum)
{
    local UTWeapon Weap;

    Weap = UTWeapon(Weapon);
    // firing cancels feign death
    if (bFeigningDeath)
    {
        FeignDeath();
    }
    else
    {
        if(!Weap.bIsReloading)
        {
            super.StartFire(FireModeNum);
        }
    }
}

Wednesday, September 12, 2012

Arrival of the Beta Phase!

Hey everybody, I'm back to blogging and as you can tell from the title we are officially in the beta phase for this project before we reach our deadline. The team got together and set up a new statement of work so that each of us know what we are responsible for by the end of the beta phase.
Our first and foremost concern was to address the bugs that were compiled from our bug testing session. I guess I forgot to mention that we had a bug testing session after our alpha phase. But anyways, the bugs were are main concern. One of the bugs that I worked on was disabling the fire animation if the player is in a state where he should not be firing at all. This wasn't that tough and it mainly involved me implementing the reload animation which is also what I did. I created the animation and coded a reload function for our revolver with some help from the web on how to exactly go about coding it. You can see that code below. The issue at this point was making sure the player could not initiate the fire animation during the reload animation because that breaks the reload animation. This was not too difficult to resolve because I just needed to check a bool variable that checked if the weapon was currently reloading, and if that variable was true then the firing and its animation will not initiate unless that variable changed into being false.
Looking forward, I'm going to create some reload animations for the repeater rifle and the laser rifle. I also need to get the dynamite throw animations and possibly damage animations created so that they could be implemented coming up.

simulated function bool DoOverrideNextWeapon()
{
    if(clips == 0)
        super.DoOverrideNextWeapon();

    return false;
}

simulated function WeaponEmpty()
{
    local AFTU_Pawn P;

    foreach AllActors(class'AFTU_Pawn',P)
    {
        Player=P;
        break;
    }

    if(clips > 0 && !bIsReloading)
    {
        WorldInfo.Game.Broadcast(self, "Reloading");
        bIsReloading = true;
        SetTimer(2.5, false, 'Reload');
        Player.FullBodyAnimSlot.PlayCustomAnim('DW_Reload_Revolver', 0.5, 0.2, 0.2, false, true);
        return;
    }

    super.WeaponEmpty();
}

function Reload()
{
    bIsReloading = false;
    clips = clips - 1;
    AddAmmo(30);
    ClearTimer();
}

Wednesday, August 29, 2012

Alpha Complete

Well it's been a great 8 week session for the Alpha phase for Arrival: From the Unknown. The team did a great job wrapping everything up for completing the Alpha build. There were a couple of issues that we were not able to completely resolve. The AI code was pretty buggy because all the Savages were moving into one location. Another particular problem that I spent trying to correct was the melee animation. I solved the first issue which was that the Savage would go into the attacking state when approaching the main character, but the animation would not play. This was a simple fix in code because I discovered the call in UnrealScript to the animation was spelled incorrectly. The second problem was that the melee attack was not doing any damage to the player. You can see parts of the AlienMelee.uc file that governs how the melee is implemented below. It's what I was staring at and debugging profusely. In the end, we decided to just present with the latest build with the animation playing but with no damage being done.

class AFTU_AlienMelee extends UTWeapon;

var() const name SwordHiltSocket;
var() const name SwordTipSocket;

var array<Actor> SwingHitActors;
var array<int> Swings;
var const int MaxSwings;

//Instigator.mesh.GetSocketWorldLocationAndRotation ('WeaponPoint', traceStart);
//Instigator.mesh.GetSocketWorldLocationAndRotation('meleesocket', traceEnd);

function RestoreAmmo(int Amount, optional byte FireModeNum)
{
Swings[FireModeNum] = Min(Amount, MaxSwings);
}

function ConsumeAmmo(byte FireModeNum)
{
if (HasAmmo(FireModeNum))
{
Swings[FireModeNum]--;
}
}

simulated state Swinging extends WeaponFiring
{
simulated event Tick(float DeltaTime)
{
super.Tick(DeltaTime);
TraceSwing();
}

simulated event EndState(Name NextStateName)
{
super.EndState(NextStateName);
SetTimer(GetFireInterval(CurrentFireMode), false, nameof(ResetSwings));
}
}

function ResetSwings()
{
RestoreAmmo(MaxSwings);
}

function Vector GetSwordSocketLocation(Name SocketName)
{
local Vector SocketLocation;
local Rotator SwordRotation;
local SkeletalMeshComponent SMC;

SMC = SkeletalMeshComponent(Mesh);

if (SMC != none && SMC.GetSocketByName(SocketName) != none)
{
SMC.GetSocketWorldLocationAndRotation(SocketName, SocketLocation, SwordRotation);
}

return SocketLocation;
}

function bool AddToSwingHitActors(Actor HitActor)
{
local int i;

for (i = 0; i < SwingHitActors.Length; i++)
{
if (SwingHitActors[i] == HitActor)
{
return false;
}
}

SwingHitActors.AddItem(HitActor);
return true;
}

function TraceSwing()
{
local Actor HitActor;
local Vector HitLoc, HitNorm, SwordTip, SwordHilt, Momentum;
local int DamageAmount;

SwordTip = GetSwordSocketLocation(SwordTipSocket);
SwordHilt = GetSwordSocketLocation(SwordHiltSocket);
DamageAmount = FCeil(InstantHitDamage[CurrentFireMode]);

foreach TraceActors(class'Actor', HitActor, HitLoc, HitNorm, SwordTip, SwordHilt)
{
if (HitActor != self && AddToSwingHitActors(HitActor))
{
Momentum = Normal(SwordTip - SwordHilt) * InstantHitMomentum[CurrentFireMode];
HitActor.TakeDamage(DamageAmount, Instigator.Controller, HitLoc, Momentum, class'DamageType');
}
}
}

simulated function bool HasAmmo(byte FireModeNum, optional int Ammount)
{
return Swings[FireModeNum] > Ammount;
}

simulated function FireAmmunition()
{
StopFire(CurrentFireMode);
SwingHitActors.Remove(0, SwingHitActors.Length);

if (HasAmmo(CurrentFireMode))
{
super.FireAmmunition();
}
}

defaultproperties
{
Begin Object class=AnimNodeSequence Name=MeshSequenceA
End Object

// Weapon SkeletalMesh
Begin Object Name=FirstPersonMesh
SkeletalMesh=SkeletalMesh'AFTUClaws.Claws'
//AnimSets(0)=AnimSet'WP_ShockRifle.Anim.K_WP_ShockRifle_1P_Base'
//Animations=MeshSequenceA
Rotation=(Yaw=-16384)
FOV=60.0
End Object

AttachmentClass=class'AFTU.AFTU_AlienMeleeAtachment'

Begin Object Name=PickupMesh
SkeletalMesh=SkeletalMesh'AFTUClaws.Claws'
End Object

MaxSwings=2
Swings(0)=2

MaxAmmoCount=1
AmmoCount=1

ShotCost(0)=0
ShotCost(1)=0

bMeleeWeapon=true;
bInstantHit=true;
bCanThrow=false;

FiringStatesArray(0)="Swinging"
FiringStatesArray(1)=None

WeaponFireTypes(0)=EWFT_Custom
InstantHitDamage(0)=35

}



The next 8 weeks are going to be great. All development and no documents to be created. Definitely excited to begin the Beta phase. I'm going to try to be more efficient and try to make this game as complete and playable as possible. Look out for the official website for Arrival: From the Unknown to be up shortly. You can follow our team's development there and keep track of our progress. I'll put up a link in the future so see you guys then!

Tuesday, August 21, 2012

Preparation for End of Alpha

The end of the Alpha stage is fast approaching and most of the importing is finished. I worked on the Alien Savage enemy animations all week and also tweaking some of our game design documents as well. I have finished the melee class animations and they look pretty good. I ran a nice little test in UDK with a simple wander AI set to our Savage. I have screenshots of those below and you can also see the revolver in those screenshots. Our team has ported that into UDK and it's also performing fine, but still needs minor adjustments.
My next agenda is working on a little flash animation, gathering sounds, and possibly rigging the gunsmith. I need some coffee....
The Savage alien lining up with the iron sights.

Just wandering around.


Thursday, August 16, 2012

Character Ported to UDK


The character has finally been imported into UDK. I was having a lot of trouble getting the animations implemented correctly. I ran into an issue where the model's arms were deformed and that just looked horrible. Luckily, Hoa solved that problem which saved us a lot of time from having to re-rig the model. I imported our character in now, and he has all of his animations in there. I set up the AnimTree and edited some script files to have our character be our pawn that gets loaded up with his own AnimSet, AnimTree, and as well as his own PhysicsAsset. Take a look below for some of the screenshots.You can see that the HUD has also been implemented by our fellow group members. The two animations not in operation as of yet is the firing and long idle animation (the latter is the one I posted last week).
I hate to admit it but I do believe I'm a little behind on my work. Need the enemy animated and ported into UDK as well as find some sound files. Definitely crunch time now.....
Jump animation
Running animation

Wednesday, August 8, 2012

Animation Week

This week I brought our main character to digital life! All of the primary animations for the alpha stage have been completed. I worked on him running forward/backward, strafing left/right, staying idle, and also some shooting animations. I'm very satisfied with all of the animations except the strafing. The hardest animation to rig was the strafe. The legs just did not want to cooperate with me. I don't know if it was because of the way the bones were rigged or just my inexperience of working with created bones rather than a biped.
Nonetheless, the rest of the animations were pretty good. I'm just about ready to import the character into the UDK to test him and the animations out. Check out the idle and running animations below.
**NOTE** First time creating a GIF to upload to my blog. The trail you see the animations are leaving behind are NOT part of the animation!!***
Idle State Animation
Running Animation