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