Announcement

Collapse
No announcement yet.

Eye of the Abyss - WIP#1

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

    #76
    Hey Arcanis
    When I install any game made with UDK, they install automatically in UDK directories without asking me in what directory I want to install. It's a very odd thing... It happened to me with two different games.

    Comment


      #77
      Originally posted by AmyP View Post
      Hey Arcanis
      When I install any game made with UDK, they install automatically in UDK directories without asking me in what directory I want to install. It's a very odd thing... It happened to me with two different games.
      That is really odd indeed! Sadly I don't know what I can do to fix that at this stage :/ It asks me where I would like to install it when I do, but I'll make a point of getting to know frontend better for my next release.

      Comment


        #78
        Not so much to report this week as last week, but stuff nonetheless.

        The best part for me this week is seeing the final shield model imported and implemented. The reason this took so long was a combination of complacency and foolishness – the import kept failing because of me forgetting one little detail of the skeletal mesh import process. Not a problem though as its a purely cosmetic change, but it instantly makes things look better, as now there are no place-holder models in the game.

        Beyond that, all the cutscenes with Evil Snow White have been completed and implemented, again un-cleaned like all the others. All that remains on the mo-cap front now is recording of the Pure Snow White scenes, which, when implemented, will be ALL animation in game and ready to polish. A happy day that will be.

        There is also an entirely new menu system in place, which uses flash and kismet instead of a walking player character, which makes the game smoother, more approachable and actually feel like a proper game. For now its mostly place-holder, but it works and it can be replaced easily. Loving it.

        Speaking of smoothness, I’ve added some establishing shots to the opening cutscene, makes for, again, a more gentle intro to the game. All that said, none of you get to see it yet as I’m waiting to get the last of the animation in before I release the next version. However, I have recorded a little play-through (as the Sister) for those of you who may be having issues playing the game (compatibility and hardware requirements are on my to-do list, along with a settings menu, such fun.)

        Check out the video here!

        [9:11] Watch out for sound, it gets loud at parts, haven’t mastered it all yet.

        All that said, here is the changelog, and I’ll be seeing you all next week!


        (11/08/2014)
        -Proper shield finally imported. Hooray!
        -Brother has met snow white properly, shield cutscene to come

        (12/08/2014)
        -Sister Meets snow white.
        -Alternative reflection socket added for both siblings to avoid bad reflection of attacks.
        -New sexier menu test made, will be full of prettiness

        (13/08/2014)
        -TD_Main_Menu is now main menu map, references fixed on all pause menus

        (15/08/2014)
        -Additional cutscene added to start, smooths out start of game.

        TO DO:
        -CUTSCENES (so ******* repetetive)
        -FINAL FONTS (Emma?)
        -Dialogue background textures (Emma?)
        -Polish all dem animations.
        -Texture Throne Room assets
        -Texture Castle exterior assets
        -Text book and lecturn
        -Menu design
        -Make tapestries
        -sticks
        -filler anim for forests
        -brother gets shield anim

        Comment


          #79
          Thank you for uploading a gameplay video. I really liked the idea of reflecting the magic sphere with a piece of mirror in Evil Snow White battle.
          Indeed, the menu looks smoother with Scaleform/flash implementation.
          I've noticed a thing. Before entering in the castle, the player view changed to first person. It is a first/third person game or it was a little glitch? I know there are a lot of gamers who love going to the two views available, but I'm not sure it was your intention here ^^.

          I just have a minuscule, very little suggestion (or maybe a question?)... I have the impression we are a little far from enemies during the battles, so if the camera view zoom just a little more during the battles, it could be cool. I know there are a lot of games with a distant camera, as in Diablo, warcraft and others, mainly hack 'n slash, but something between Dark Soul camera position could give a better sight of the player and the enemies. Sorry if it wasn't your intention anyway.

          Comment


            #80
            Originally posted by AmyP View Post
            Thank you for uploading a gameplay video. I really liked the idea of reflecting the magic sphere with a piece of mirror in Evil Snow White battle.
            Not to say I played a lot of Zelda as a kid, but I always loved the Mirror Shield.

            Originally posted by AmyP View Post
            Indeed, the menu looks smoother with Scaleform/flash implementation.
            Thanks! I'm not sure what I was thinking with the old menu..


            Originally posted by AmyP View Post
            I've noticed a thing. Before entering in the castle, the player view changed to first person. It is a first/third person game or it was a little glitch? I know there are a lot of gamers who love going to the two views available, but I'm not sure it was your intention here ^^.
            Oh yeah, that was me barely remembering to show the first person mode toggle. Middle mouse click toggles between third person and first person, though the first person is way to far off the ground at the moment.


            Originally posted by AmyP View Post
            I just have a minuscule, very little suggestion (or maybe a question?)... I have the impression we are a little far from enemies during the battles, so if the camera view zoom just a little more during the battles, it could be cool. I know there are a lot of games with a distant camera, as in Diablo, warcraft and others, mainly hack 'n slash, but something between Dark Soul camera position could give a better sight of the player and the enemies. Sorry if it wasn't your intention anyway.
            You're quite right, the lock on camera is something that has given me a lot of trouble when making it and continuing to use it. I don't particularly like how it is now, but it is at a baseline that I'm okay with until the rest of the game is at that same base line. I want to add a reticle above the target and such, but that is way down the to do list.

            That said the exact code and maths of the lock on camera is a cobbled patchwork from many different sources and as such is only about 70-80% understood by me, so until I have some time to study it further I don't see any amazing progress there, so probably not till November/December.

            Thanks for all the feedback, is awesomely useful, as always.

            Comment


              #81
              That said the exact code and maths of the lock on camera is a cobbled patchwork from many different sources and as such is only about 70-80% understood by me, so until I have some time to study it further I don't see any amazing progress there, so probably not till November/December.
              -Like mine! I had bad moments with my camera, with that cobble patchworks from other scripts. I have an annoying problem with smooth interpolation in Y Axis. It works, but I can't make it doing smoothly. It's like a Silent Hill Shattered Memories camera, but I wanted to implement it, adding a choice for the player positioning the camera in the left or the right shoulder with a press button. It works, but it always "jump" to the other side of the character and don't have a smooth effect. It makes me mad, because I tried everything... everything!!!
              I have so much problems with my camera, maybe, just maybe, I can help you. What's your problem exactly with your camera?

              Edit: I found myself with a spare time today and I tried another camera class I used in my older scripts, extending to UDKPawn, not UTPawn... And you know what? It worked -__-... Man, sometimes I think UT classes are so bugged. I'm really dying to move to U4 as soon as possible.

              Comment


                #82
                Yeah cameras are a pain, sounds like you're right in the thick of it, which is always fun.

                I mat as well post my camera code here, maybe it'll help you if you see something useful...I'm not sure it's quite thoroughly commented, mind you.

                This is all in my Player controller class, as it builds off of existing code in the UDK playercontroller and GamePlayerCamera (which TDCamera is just an extension of which changes nothing)
                Code:
                //==============================//
                //          BEGIN CAMERA MOD    //
                //==============================//
                
                exec function ZoomIn() 
                {
                	if (GamePlayerCamera(PlayerCamera).CameraStyle == 'FreeCam_Default' && TDPawn(Pawn).bPlayerLockedOn == false)
                	{
                		if (PlayerCamera.FreeCamDistance > 50)
                		{
                			PlayerCamera.FreeCamDistance -= (PlayerCamera.FreeCamDistance/8); 
                		}
                	}
                }
                
                exec function ZoomOut() 
                {
                	if (GamePlayerCamera(PlayerCamera).CameraStyle == 'FreeCam_Default' && TDPawn(Pawn).bPlayerLockedOn == false) 
                	{
                		if (PlayerCamera.FreeCamDistance < 512)
                		{
                			PlayerCamera.FreeCamDistance += (PlayerCamera.FreeCamDistance/8);
                		}
                	}
                }
                
                function HideMesh(bool meshVisible)
                {
                	Pawn.Mesh.SetOwnerNoSee(meshVisible);
                }
                
                exec function ToggleCam()
                {
                
                    local TDShield S;
                
                    foreach DynamicActors(class'TDShield', S)
                    {
                        if(bHasShield == true)//if we have the shield, hide and show it accordingly
                        {
                        	if(TDCamera(PlayerCamera).CameraStyle == 'FreeCam_Default' && TDPawn(Pawn).bPlayerLockedOn == false)
                        	{
                        		TDCamera(PlayerCamera).CameraStyle = 'FirstPerson';
                        		HideMesh(true);
                        		S.SetHidden(true);
                        	}
                        	
                        	else
                        	{
                        		TDCamera(PlayerCamera).CameraStyle = 'FreeCam_Default';
                        		HideMesh(false);
                        		S.SetHidden(false);
                        	}
                        }
                        
                        if(bHasShield == false)//if we dont have the shield, ignore its visibility
                        {
                            if(TDCamera(PlayerCamera).CameraStyle == 'FreeCam_Default' && TDPawn(Pawn).bPlayerLockedOn == false)
                        	{
                        		TDCamera(PlayerCamera).CameraStyle = 'FirstPerson';
                        		HideMesh(true);
                        	}
                        	
                        	else
                        	{
                        		TDCamera(PlayerCamera).CameraStyle = 'FreeCam_Default';
                        		HideMesh(false);
                        	}
                        }
                    }
                }
                
                function UpdateRotation(float DeltaTime)
                {
                    local rotator       DeltaRot, NewRotation, ViewRotation;
                    
                    ViewRotation = Rotation;
                
                    //if we're not locked on, currently no else.
                    if(TDPawn(Pawn).bPlayerLockedOn == false)
                    {
                        if(pawn !=none)
                        {
                            Pawn.SetDesiredRotation(ViewRotation);
                        }
                        
                        DeltaRot.Yaw = PlayerInput.aTurn;
                        DeltaRot.Pitch = PlayerInput.aLookUp;
                        
                        ProcessViewRotation(DeltaTime, ViewRotation, DeltaRot);
                        SetRotation(ViewRotation);
                        
                        self.ViewRotationPitch = ViewRotation.Pitch;
                        
                        ViewShake(DeltaTime);
                        
                        NewRotation = ViewRotation;
                        NewRotation.Roll = Rotation.Roll;
                        
                        //Another Pawn variable
                        if(Pawn != none && (PlayerInput.RawJoyRight != 0.0 || PlayerInput.RawJoyUp != 0.0))
                        {
                            Pawn.FaceRotation(NewRotation, DeltaTime);
                        }
                    }
                }
                
                state PlayerWalking
                {
                    
                    function ProcessMove(float DeltaTime, vector NewAccel, eDoubleClickDir DoubleClickMove, rotator DeltaRot)
                    {
                        if(Pawn == none)
                        {
                            `log("No Pawn!==========================");
                            return;
                        }
                        
                        if(Role == ROLE_Authority)
                        {
                            Pawn.SetRemoteViewPitch(Rotation.Pitch);
                        }
                        
                        Pawn.Acceleration = NewAccel;
                        
                        CheckJumpOrDuck();
                    }
                    
                	function PlayerMove(float DeltaTime)
                	{
                        
                        local vector            X, Y, Z, NewAccel;
                        local eDoubleClickDir   DoubleClickMove;
                        local bool              bSaveJump;
                        local rotator           DeltaRot, ViewRotation, OldRot, NewRot;
                
                        if(Pawn == none)
                        {
                            `log("No Pawn!==================");
                            GoToState('Dead');
                        }
                        
                        else
                        {
                            //If we're locked on, movement is relative to the pawn
                             if(TDPawn(Pawn).bPlayerLockedOn == true)
                                GetAxes(LockOnRot,X,Y,Z);
                            
                            //otherwise, it is relative to the camera
                             else
                                GetAxes(Rotation,X,Y,Z);
                                
                            ViewRotation = Rotation;
                            
                            DeltaRot.Yaw = PlayerInput.aTurn;
                            DeltaRot.Pitch = PlayerInput.aLookUp;
                            ProcessViewRotation(DeltaTime, ViewRotation, DeltaRot);
                            SetRotation(ViewRotation);
                
                            NewAccel = PlayerInput.aForward*X + PlayerInput.aStrafe*Y;
                            NewAccel.Z = 0;
                
                            OldRot = Pawn.Rotation;
                            
                            if(Pawn != none)
                            {
                                if(NewAccel.X > 0.0 || NewAccel.Y > 0.0 || NewAccel.X < 0.0 || NewAccel.Y < 0.0)
                                    NewRot = Rotator(NewAccel);
                                else
                                    NewRot = Pawn.Rotation;
                            }
                
                            //If not locked on, pawn moves freely
                            if(TDPawn(Pawn).bPlayerLockedOn == false)
                            {
                                Pawn.SetRotation(RInterpTo(OldRot, NewRot, DeltaTime, 70000, true));
                            }
                
                            //if locked on, pawn faces target
                            if(TDPawn(Pawn).bPlayerLockedOn == true)
                            {
                                NewRot = Rotator(TDPawn(Pawn).LockOnTarget.Location - TDPawn(Pawn).Location);
                                Pawn.SetRotation(RInterpTo(OldRot, NewRot, DeltaTime, 70000, true));
                            }
                            
                            NewAccel = Pawn.AccelRate * Normal(NewAccel);
                            
                            DoubleClickMove = PlayerInput.CheckforDoubleClickMove(DeltaTime / WorldInfo.TimeDilation);
                            
                            if(bPressedJump && Pawn.CannotJumpNow())
                            {
                                bSaveJump = true;
                                bPressedJump = true;
                            }
                
                            else
                            {
                                bSaveJump = false;
                            }
                            
                            ProcessMove(DeltaTime, NewAccel, DoubleClickMove, Rotation);
                            
                            bPressedJump = bSaveJump;
                        }
                	}
                		
                	event BeginState(Name PreviousStateName)
                	{
                        DoubleClickDir = DCLICK_None;
                        bPressedJump = false;
                        GroundPitch = 0;
                            
                        if(Pawn != none)
                        {
                            Pawn.ShouldCrouch(false);
                                
                            if(Pawn.Physics != PHYS_Falling && Pawn.Physics != PHYS_RigidBody)
                                Pawn.SetPhysics(PHYS_Walking);
                        }
                    }
                        
                    event EndState(Name NextStateName)
                    {
                        GroundPitch = 0;
                            
                        if(Pawn != none)
                        {
                            Pawn.SetRemoteViewPitch(0);
                                
                            if(bDuck == 0)
                            {
                                Pawn.ShouldCrouch(false);
                            }
                        }
                    }
                }
                
                //HERE BE ISSUES WITH CAMERA MOVEMENT
                simulated event GetPlayerViewPoint(out vector POVLocation, out rotator POVRotation)
                {
                    super.GetPlayerViewPoint(POVLocation, POVRotation);
                
                    if(GamePlayerCamera(PlayerCamera).CameraStyle == 'FreeCam_Default')
                    {
                    	if(TDPawn(Pawn).bPlayerLockedOn == true)//THIS IS WHERE THE CAMERA POSITION WHEN LOCKED ON IS DEFINED
                    	{
                            LockOnCamOffset = Pawn.Location + Vector(Rotator(TDPawn(Pawn).LockOnTarget.Location - POVLocation)) * -350;
                            POVLocation = LockOnCamOffset;
                        	POVRotation = Rotator(TDPawn(Pawn).LockOnTarget.Location - POVLocation);
                        	LockOnRot = POVRotation;
                        	/*DrawDebugLine(TDPawn(Pawn).Location, TDPawn(Pawn).LockOnTarget.Location, 255, 0, 0, true);
                        	DrawDebugLine(TDPawn(Pawn).Location, POVLocation, 0, 255, 0, true);
                        	DrawDebugLine(TDPawn(Pawn).LockOnTarget.Location, POVLocation, 0, 0, 255, true);*/
                    	}
                
                    	else
                    	{
                    	    super.GetPlayerViewPoint(POVLocation, POVRotation);
                    	}
                    }
                    else
                    {
                    	super.GetPlayerViewPoint(POVLocation, POVRotation);
                    }
                }
                
                
                //==============================//
                //          End   CAMERA MOD    //
                //==============================//
                Hopefully something in there is helpful to you, it took me a while to get it this state, and it works just well enough that I don't hate it entirely. My only issue is with how the camera behaves when locked on (the only part I wrote entirely myself, you can still see some commented out debug)

                What are your thoughts on this mess?

                Comment


                  #83
                  A quieter week of work this one.

                  After two weeks of very focused work on animation and cutscenes, I had accumulated a decent to-do list of little things here and there, either visual or minor in nature. So this week was spent getting all those done in preparation for one last week of cutscene making (final MoCap session this weekend!) which will then be followed by a few weeks of animation cleanup and finalisation, which will no doubt be long, repetitive and irritating work.

                  Aside from the various visual improvements (see images below) I have added a targeting icon to enemies! So now when you have multiple enemies in-front of you it will be easy to tell which one the camera is focusing on. This was a fun little return to scripting.

                  Here be pictures and changelog (note the smaller TO DO list compared to last week), see you all next week (with a new release version!)

                  [SHOT]http://www.nicholas-ferrar.net/wp-content/uploads/2014/08/throne-2.png[/SHOT]
                  [SHOT]http://www.nicholas-ferrar.net/wp-content/uploads/2014/08/throne-1.png[/SHOT]
                  [SHOT]http://www.nicholas-ferrar.net/wp-content/uploads/2014/08/forest-2.png[/SHOT]
                  [SHOT]http://www.nicholas-ferrar.net/wp-content/uploads/2014/08/forest-1.png[/SHOT]

                  (18/08/2014)
                  -Throne room completion goes to correct menu now.
                  -new texures on throne room pillars, throne and thronestand.
                  -in-game pause now goes to main menu on quit
                  -new textures for external castle thingys
                  -undid the quit thing because thats already an option dummy
                  -tweaked a lot of forest textures

                  (19/08/2014)
                  -textured book, lecturn
                  -book and sticks added to inro cutscene
                  -tapestries and carpet added to thronerooms, tapestries are placeholder textures because they’re terrible

                  (22/08/2014)
                  -Lock on icons added to dwarves and Snow White. Pretty and should do fine.
                  -When a dwarf is killed it loses itas collision, so it can be walked through

                  TO DO:
                  -CUTSCENES (so ******* repetetive)
                  -FINAL FONTS (Emma?) -
                  -Dialogue background textures (Emma?)
                  -Polish all dem animations.
                  -filler anim for forests
                  -brother gets shield anim

                  Comment


                    #84
                    What are your thoughts on this mess?
                    I don't think it's a mess. This code is well organized and it didn't take much time to figure out what is what in your code. I've noticed interesting things. Functions as GetPlayerViewPoint and UpdateRotation I put into Pawn class, not in my Controller class. I know you're doing it right and everyone puts those functions in Player controller class, but I just had less bug problems when I transferred this kind of functions from Player Controller class to my Pawn class. Check it out (my class is extended from UTPawn):

                    Code:
                    class CIPawn extends UTPawn
                    placeable;
                    
                    
                    var bool                bIsProned;
                    var                     AnimNodeBlend CrouchBlend;
                    var float               CrouchEyeHeight;
                    var bool                bRun;
                    var float		Stamina;
                    var float		SprintTimer;
                    var float		SprintRecoverTimer;
                    var float		Empty;
                    var bool		bSprinting;
                    var name                AnimName;
                    var bool                EnemyClass;
                    //var float             AnalogSpeed;
                    //var bool              bInterpLocation;
                    var Pawn                CIPawn;
                    var()bool               bCamShake;
                    var bool                MadeNoise;
                    
                    /////////Camera Switch//////////
                    var float               Dist;
                    var vector              Loc, Pos;
                    var rotator             Rot;
                    
                    ///////////Grenades/////////
                    
                    var bool bCanThrowGrenade;
                    var int GrenadeCount;
                    var bool bThrowingGrenade;
                    var bool bIsNapalm;
                    var int GrenadeSpreadDist;
                    var float ThrowTime;
                    var float SpawnGrenTime;
                    var int i;
                    
                    
                    ///////////
                    
                    ///////////Grenade function///////////
                    
                    exec function GiveGrenade()
                    {
                    
                    
                    	if(GrenadeCount >= 4)
                    	{
                    		return;
                    	}
                    
                    	GrenadeCount++;
                    
                    
                    }
                    
                    
                    //Grenade Throw function
                    exec function ThrowGrenade()
                    {
                    
                    
                        ConsoleCommand("ThrowGrenade");
                    
                        if(bThrowingGrenade || GrenadeCount <= 0)
                        {
                           return;
                        }
                    
                    	//Dont allow grenade throwing
                    	bThrowingGrenade=true;
                    
                        WorldInfo.Game.BroadcastHandler.Broadcast(self, "Throwing Grenade");
                    
                    	if (bThrowingGrenade)
                    	{
                    		if ( GrenadeCount > 0 )
                    		{
                    			TopHalfAnimSlot.PlayCustomAnim( 'Throw', 3.0, 0.2, 0.2, false, true);
                    
                    			SetTimer(SpawnGrenTime, false, 'CreateGrenade');
                    		}
                    	}
                        SetTimer(ThrowTime, false, 'RefillAmmo');
                    }
                    
                    simulated function RefillAmmo()
                    {
                        // if we have enough or more ammo than the weapon needs 
                        if(GrenadeCount >= 0)
                        {
                           // subtrack the grenades from our inventory
                           GrenadeCount --;
                        }
                        else
                        {
                           // empty our inventory from grenades
                           GrenadeCount = 0;
                        }
                    
                        // Allow throwing grenades again
                        bThrowingGrenade=false;
                    }
                    
                    simulated function CreateGrenade()
                    {
                    
                            local Projectile SpawnedGrenade;
                    	local float theta;
                            local vector SpreadVector;
                    	local rotator Aim;
                            local Vector FinalLocation;
                    
                    	Aim = Weapon.GetAdjustedAim( Location );			// get fire aim direction
                    
                    	if (bThrowingGrenade || SpawnedGrenade != none)
                    	{
                    		// Give the grenade some gradual spread.
                    		theta = GrenadeSpreadDist * PI / 32768.0 * (i - float(GrenadeCount - 1) / 2.0);
                    		SpreadVector.X = Cos(theta);
                    		SpreadVector.Y = Sin(theta);
                    		SpreadVector.Z = 0.0;
                    
                    		Mesh.GetSocketWorldLocationAndRotation ('RB_Handle0', FinalLocation);
                                    SpawnedGrenade = Spawn(Class 'CI_ThrownItem',self,, FinalLocation, Rotation);
                    		UTProjectile(SpawnedGrenade).TossZ += (FRand() * 200 - 100);
                    
                    	}
                    
                    	SpawnedGrenade.Init(SpreadVector >> Aim);
                    }
                    
                    
                    
                    
                    ////////////////////////////////////
                    
                    
                    simulated event PostIntAnimTree(SkeletalMeshComponent SkelComp)
                    {
                           if(SkelComp == Mesh)
                           {
                            AimNode = AnimNodeAimOffSet(mesh.FindAnimNode('AnimNode'));
                            CrouchBlend = AnimNodeBlend(mesh.FindAnimNode('CrouchBlend'));
                           super.PostInitAnimTree(SkelComp);
                            //AimNode.bForceAimDir = true; //forces centercenter
                            FullBodyAnimSlot = AnimNodeSlot(mesh.FindAnimNode('FullBodySlot'));
                            TopHalfAnimSlot = AnimNodeSlot(Mesh.FindAnimNode('TopHalfSlot'));
                    
                    }
                    
                    }
                    
                    
                    //event TakeDamage(int Damage, Controller EventInstigator, vector HitLocation, vector Momentum, class<DamageType> DamageType, optional TraceHitInfo HitInfo, optional Actor DamageCauser)
                    //{
                    //local NegaAI MP;
                    //MP = NegaAI(Controller);
                    //super.TakeDamage(0, MP, vect(0,0,0), vect(0,0,0), class'DmgType_Crushed');
                    ////I can put an animation here and it will be settled OR Call for Physics here, like Falling
                    ////FullBodyAnimSlot.PlayCustomAnim('Liv_Crouched',0.8, 0.2, 0.2, false,true, , );
                    //
                    //}
                    
                    
                    
                    simulated function PostBeginPlay()
                    {
                    	super.PostBeginPlay();
                    	SetPhysics(PHYS_Walking);
                    }
                    
                    exec function SwitchPOV()
                    {
                    
                            ConsoleCommand("SwitchPOV");
                            
                            if (Dist != CamOffset.Y)
                    
                            {
                                    CamOffset.Y *= -1.f;
                                    Dist = Lerp(Dist,CamOffset.Y,0.50);
                            }
                            Loc += CamOffset >> Rot;
                            Pos = Loc - Vector(Rot) * Dist;
                            //I don't know how to implement Interpolation Speed:
                    }
                    
                    function ActivateCameraShake()
                    {
                    bCamShake=true;
                    }
                    
                    
                    /** Test function to enable Proning */
                    exec function EnableProne()
                    {
                    	bIsProned = true;
                    	
                    }
                    
                    /** Test function to disable Proning */
                    exec function DisableProne()
                    {
                    	bIsProned = false;
                    }
                    
                    simulated function SetCharacterClassFromInfo(class<UTFamilyInfo> Info)
                    {
                    
                    }
                    
                    event OnAnimEnd(AnimNodeSequence SeqNode, float PlayedTime, float ExcessTime)
                    {
                    	//local name AnimName;
                    
                    	AnimName = SeqNode.AnimSeqName;
                    }
                    
                    event OnAnimPlay(AnimNodeSequence SeqNode)
                    {
                    
                    }
                    
                    simulated event PlayFootStepSound(int FootDown)
                    {
                    	local SoundCue FootSound;
                    	FootSound = SoundCue'A_Character_Footsteps.FootSteps.A_Character_Footstep_StoneCue';
                    	PlaySound(FootSound, false, true,,, true);
                    	MakeNoise(10.0f);
                    }
                    
                    
                    exec function SetSpeed( int speed )
                    {
                    	GroundSpeed = speed;
                    }
                    
                    exec function Run()
                    	{
                                local SoundCue FootSound;
                    	FootSound = SoundCue'A_Character_Footsteps.FootSteps.A_Character_Footstep_StoneCue';
                    	PlaySound(FootSound, false, true,,, true);
                            MakeNoise(20.0f);
                    	ConsoleCommand("Run");
                    	Groundspeed = 300;
                    	bRun = true;
                    
                        // If we have enough speed, run
                        if(Groundspeed >= 290)
                        {   
                        StopFiring();    
                    
                        }
                    }
                    
                    exec function StopRun()
                    {
                    	GroundSpeed = 150;
                    }
                    
                    
                    exec function StartSprint()
                    {
                         if(Stamina==5.0){
                         //sprintBreathing.Play();
                    
                         GroundSpeed = 600;
                         bSprinting = true;
                         MakeNoise(50.0f);
                             if(GroundSpeed == 600)
                             {
                                 setTimer(SprintTimer, false, 'EmptySprint');
                             }
                         }
                    }
                    
                    
                    simulated function EmptySprint()
                    {
                        Stamina = Empty;
                        Groundspeed = 300;
                        bSprinting = true;
                        setTimer(SprintRecoverTimer, false, 'ReplenishStamina');
                    }
                    
                    simulated function ReplenishStamina()
                    {
                    
                        Stamina = 5.0;
                        bSprinting = false;
                        setTimer(SprintRecoverTimer, false, 'ReplenishStamina');
                    }
                    
                    exec function StopSprinting()
                    {
                    	GroundSpeed = 150;
                    }
                    
                    simulated event StartCrouch(float HeightAdjust)
                    {
                    	SetBaseEyeHeight();
                    	EyeHeight += HeightAdjust;
                    	CrouchMeshZOffset=HeightAdjust;
                    
                    	if(Mesh != none)
                    	{
                    		Mesh.SetTranslation(Mesh.Translation + vect(0,0,1) * HeightAdjust);
                    	}
                    }
                    
                    
                    //override to make player mesh visible by default
                    simulated event BecomeViewTarget( PlayerController PC )
                    { 
                       local CIPlayerController UTPC;
                    
                       Super.BecomeViewTarget(PC);
                    
                       if (LocalPlayer(PC.Player) != None) 
                       { 
                          UTPC = CIPlayerController(PC);
                          if (UTPC != None)
                          { 
                             //set player controller to behind view and make mesh visible 
                             UTPC.SetBehindView(true); 
                             SetMeshVisibility(UTPC.bBehindView); 
                             
                             //Show Crosshair = false, hide = true 
                             UTPC.bNoCrosshair = false; 
                          }
                       }
                    }
                    
                    simulated function FaceRotation(rotator NewRotation, float DeltaTime)
                    {
                    
                    // Do not update Pawn's rotation if no accel
                    if (Normal(Acceleration)!=vect(0,0,0))
                    {
                    if ( Physics == PHYS_Ladder )
                    {
                    NewRotation = OnLadder.Walldir;
                    }
                    else if ( (Physics == PHYS_Walking) || (Physics == PHYS_Falling) )
                    		{
                    			NewRotation.Pitch = 0;
                    		}
                    //Pawn.FaceRotation(RInterpTo(Pawn.Rotation, NewRotation, DeltaTime, RotationSpeed, true), DeltaTime);
                            NewRotation = RLerp(Rotation,NewRotation,0.06,true);
                    	SetRotation(NewRotation);
                    
                    	}
                    }
                    
                    //When Aiming and shooting,the rotator cease
                    simulated singular event Rotator GetBaseAimRotation()
                    {
                    local rotator	POVRot;
                    
                    // If we have a controller, by default we aim at the player's 'eyes' direction
                    // that is by default Controller.Rotation for AI, and camera (crosshair) rotation for human players.
                    
                    // If we have no controller, we simply use our rotation
                    POVRot = Rotation;
                    
                    // If our Pitch is 0, then use RemoveViewPitch
                    if( POVRot.Pitch == 0 )
                    {
                    POVRot.Pitch = RemoteViewPitch << 8;
                    }
                    
                    return POVRot;
                    }
                    
                    
                    simulated function name GetDefaultCameraMode(PlayerController RequestedBy)
                    {
                    	return 'ThirdPerson';
                    }
                    
                    
                    ///////////HIT WALL EVENT//////////////
                    //event bool NotifyHitWall(vector HitNormal, actor Wall)
                    //{
                    //
                    //if(Wall != none && CIPawn.Groundspeed == 300)
                    //{
                    //    FullBodyAnimSlot.PlayCustomAnim('Throw',4.0, 0.2, 0.2, false,true, , );
                    //    CIPawn.Acceleration=vect(0,0,0);
                    //CIPawn.Velocity=vect(0,0,0);
                    //CIPawn.GroundSpeed=0;
                    //}
                    //return true;
                    //}
                    //
                    //event HitWall( vector HitNormal, actor Wall, PrimitiveComponent WallComp )
                    //{
                    //
                    //if(Wall != none && Groundspeed == 300)
                    //{
                    //
                    //		 FullBodyAnimSlot.PlayCustomAnim('Throw',4.0, 0.2, 0.2, false,true, , );
                    //CIPawn.Acceleration=vect(0,0,0);
                    //CIPawn.Velocity=vect(0,0,0);
                    //CIPawn.Groundspeed =0;
                    //}
                    //}
                    //////////////////////////////
                    
                    defaultproperties
                    {
                    
                            EyeHeight=+0038.000000
                    	CrouchEyeHeight=+0020.000000
                    	BaseEyeHeight=+0038.000000
                    
                            WalkingPct=+0.4
                           CrouchedPct=+0.4
                            CrouchHeight=45.0
                            CrouchRadius=25.0
                            bCanCrouch=true
                            BaseTranslationOffset=12.0
                           WalkableFloorZ=0.9999
                            LeftFootControlName=LeftFootControl
                            RightFootControlName=RightFootControl
                            bEnableFootPlacement=true
                            MaxFootPlacementDistSquared=56250000.0 // 7500 squared
                            SprintTimer=2.0
                    	SprintRecoverTimer=5.0
                    	Stamina=5
                            Empty=1.0
                            GroundSpeed=150.0
                           // AnalogSpeed=300.0
                           CamOffset=(X=16.0,Y=30.0,Z=-28.0) ----Here I control the camera offset
                    
                    
                            Begin Object  Name=MyLightEnvironment
                            bSynthesizeSHLight=TRUE
                            bIsCharacterLightEnvironment=TRUE
                            End Object
                            Components.Add(MyLightEnvironment)
                            LightEnvironment=MyLightEnvironment
                    
                            Begin Object Name=WPawnSkeletalMeshComponent
                    		SkeletalMesh=SkeletalMesh'CopernicusIsland_Characters.Mesh.Liv'
                    		AnimSets(0)=AnimSet'CopernicusIsland_Characters.Mesh.Liv_AnimSet'
                    		bCacheAnimSequenceNodes=FALSE
                    		AlwaysLoadOnClient=true
                    		AlwaysLoadOnServer=true
                    		bOwnerNoSee=false
                    		CastShadow=true
                    
                            CollideActors=true
                            //BlockRigidBody=true
                            AlwaysCheckCollision=true
                    
                    		bUpdateSkelWhenNotRendered=false
                    		bIgnoreControllersWhenNotRendered=TRUE
                    		bUpdateKinematicBonesFromAnimation=true
                    		bCastDynamicShadow=true
                    		RBChannel=RBCC_Untitled3
                    		RBCollideWithChannels=(Untitled3=true)
                    		LightEnvironment=MyLightEnvironment
                    		bOverrideAttachmentOwnerVisibility=true
                    		bAcceptsDynamicDecals=FALSE
                    		AnimTreeTemplate=AnimTree'CopernicusIsland_Characters.Mesh.Liv_AnimTree'
                    		//PhysicsAsset=PhysicsAsset'CopernicusIsland_Characters.Mesh.Liv_Physics'
                    		bHasPhysicsAssetInstance=true
                    		TickGroup=TG_PreAsyncWork
                    		MinDistFactorForKinematicUpdate=0.2
                    		bChartDistanceFactor=true
                    		//bSkipAllUpdateWhenPhysicsAsleep=TRUE
                    		RBDominanceGroup=20
                    		//Scale=0.6
                    		//MotionBlurScale=0.0
                    		bAllowAmbientOcclusion=false
                    		bUseOnePassLightingOnTranslucency=TRUE
                    	End Object
                    	Mesh=WPawnSkeletalMeshComponent
                    	Components.Add(WPawnSkeletalMeshComponent)
                    
                    
                    		Begin Object Name=CollisionCylinder
                    		CollisionRadius=+0040.000000
                    		CollisionHeight=+0060.000000
                                    End Object
                                    CylinderComponent=CollisionCylinder
                    	
                    
                    
                    	/////Grenades/////
                    	bCanThrowGrenade=true
                    	GrenadeCount=1
                    	ThrowTime=1.0
                    	SpawnGrenTime=0.5
                    	
                    	WeaponSocket= RB_Handle0
                    	
                    /////End of Grenade/////////////
                    
                            Health = 100
                            MadeNoise = true
                    	bIsProned=false
                    	bIsCrouched=false
                    	EnemyClass = true
                    	bDirectHitWall=false
                            bCollideWorld = true
                            bPushesRigidBodies=true
                    	InventoryManagerClass=class'CI_InventoryManager'
                    
                    }
                    So, I used SetBehindView in my BecomeViewTarget function to lock the camera and control the camera offset by Pawn class, with this I don't mess with the aim. The FaceRotation function allowed me to rotate the camera and Rotator GetBaseAimRotation function allowed me to lock the aim in the center of the screen, or ate least controlling it ^^. But my code above will never work with your Player controller because it is a 3rd person camera exclusively. With your complex camera, I can't see another way than a CalcCamera in the Pawn class (like that our old UDN said in: http://udn.epicgames.com/Three/Camer...-In-One Camera

                    I'll try to drop your Player controller class on UDK and see what's happening.

                    Comment


                      #85
                      After two weeks of very focused work on animation and cutscenes, I had accumulated a decent to-do list of little things here and there, either visual or minor in nature. So this week was spent getting all those done in preparation for one last week of cutscene making (final MoCap session this weekend!) which will then be followed by a few weeks of animation cleanup and finalisation, which will no doubt be long, repetitive and irritating work.
                      Indeed! Animation cleanup is a pain in the neck.
                      But, man, how I liked your new screenshots. Mainly the contrast with the red carpet with the greenish background

                      Comment


                        #86
                        That's some great readability there, looks good. Sometimes I wonder if I should have built off of UT classes instead of UDK ones, might has saved me some headaches. What was your experience?

                        Indeed! Animation cleanup is a pain in the neck.
                        Oh man yeah, I'm doing that now, and it's so monotonous. I'm actually procrastinating by doing improvements to the combat system.

                        Glad you like the new look, figured some colour would be a good thing.

                        Comment


                          #87
                          So the MoCap studio was out of commission, so I was unable to record the final scenes, which took a bit of wind out of my sails, but by no means stopped work.

                          This week saw work done on the existing animations, with the Sister receiving some much needed details in her initial cutscenes, imbuing her with facial expressions and hand gestures, which though subtle, make for much more interesting cutscenes.

                          On the flip side, I have gone and tweaked much of the AI behaviours for the normal enemy, which now move faster and can be knocked back by a powerful chain of attacks. Likewise Evil Snow White knocks back the player if the player tries to attack her too much at the wrong time (this is still slightly buggy, and will be fixed when I make sufficient sacrifices to the Vector Math Gods.

                          So overall a quiet week, with MoCap either being recorded this weekend or coming week. Stay tuned.



                          Changelog:

                          TD 0.2.7(25/08/2014)
                          -Sister now has added animation in first scene: mouth, eyes, brows and hands.
                          -Test map "return to menu" is now the right menu
                          -Dwarf behaviour changed to take more punishment before backing away.
                          -Turns out i broke the cutscene pause, fixed it, please be more thorough with changelog in future

                          (26/08/2014)
                          -Sister has added animation in brother's sword drawing scene.
                          -Sword Damage types added, to allow for heavy damage and light damage
                          -Begining forays into knockback integration, I also remember I hate vector maths, also perfect time to stop the sword being terrible CURRENTLY NOT WORKING

                          (27/08/2014)
                          -Knockback working on dwarves. Such fun when you forget the foundation for it all was already there.
                          -Snow White now knocks back the player after she blocks 4 times, should get the message accross.

                          (28/08/2014)
                          -Sisters hands animated in her sword scene, head ready.

                          (28/08/2014)
                          -Sister now has additional face animation in her sword attaining cutscene.

                          TO DO:
                          -CUTSCENES (so ******* repetetive)
                          -FINAL FONTS (Emma?) -
                          -Dialogue background textures (Emma?)
                          -Polish all dem animations.
                          -filler anim for forests
                          -brother gets shield anim

                          Comment


                            #88
                            That's some great readability there, looks good. Sometimes I wonder if I should have built off of UT classes instead of UDK ones, might has saved me some headaches. What was your experience?
                            When I tried to extend from UDK, the camera class worked like a charm. For testing new camera, I got inspired by the Stealth Project code from our UDK buddies months ago. This camera has similar characteristics as yours, but it only works if you extend your pawn class from UDK pawn class. In this case, UTPawn has your own camera messing the camera class code and everything goes wrong extending from it:
                            Code:
                            class StealthFrameworkCamera extends Camera;
                            // initializing static variables
                            var float Dist;
                            
                            var Vector cameraLocation;
                            
                            function UpdateViewTarget(out TViewTarget OutVT, float DeltaTime)
                            {
                            	//Declaring local variables
                            	local vector            Loc, Pos, HitLocation, HitNormal;
                            	local rotator           Rot;
                            	local Actor                     HitActor;
                            	local CameraActor       CamActor;
                            	local bool                      bDoNotApplyModifiers;
                            	local TPOV                      OrigPOV;
                            
                            	// store previous POV, in case we need it later
                            	OrigPOV = OutVT.POV;
                            
                            	// Default FOV on viewtarget
                            	OutVT.POV.FOV = DefaultFOV;
                            
                            	// Viewing through a camera actor.
                            	CamActor = CameraActor(OutVT.Target);
                            	if( CamActor != None )
                            	{
                            		CamActor.GetCameraView(DeltaTime, OutVT.POV);
                            
                            		// Grab aspect ratio from the CameraActor.
                            		bConstrainAspectRatio   = bConstrainAspectRatio || CamActor.bConstrainAspectRatio;
                            		OutVT.AspectRatio               = CamActor.AspectRatio;
                            
                            		// See if the CameraActor wants to override the PostProcess settings used.
                            		CamOverridePostProcessAlpha = CamActor.CamOverridePostProcessAlpha;
                            		CamPostProcessSettings = CamActor.CamOverridePostProcess;
                            	}
                            	else
                            	{
                            		// Give Pawn Viewtarget a chance to dictate the camera position.
                            		// If Pawn doesn't override the camera view, then we proceed with our own defaults
                            		if( Pawn(OutVT.Target) == None || !Pawn(OutVT.Target).CalcCamera(DeltaTime, OutVT.POV.Location, OutVT.POV.Rotation, OutVT.POV.FOV) )
                            		{
                            			// don't apply modifiers when using these debug camera modes. 
                            			bDoNotApplyModifiers = TRUE;
                            			switch(CameraStyle)
                            			{
                            				case 'Fixed' : // No update, keeps previous view
                            				OutVT.POV = OrigPOV;
                            				break;
                            
                            				case 'ThirdPerson' : //Enters here as long as CameraStyle is still set to ThirdPerson
                            				case 'FreeCam' :
                            
                            				Loc = OutVT.Target.Location; // Setting the camera location and rotation to the viewtarget's
                            				Rot = OutVT.Target.Rotation;
                            
                            				if (CameraStyle == 'ThirdPerson')
                            				{
                            					Rot = PCOwner.Rotation; //setting the rotation of the camera to the rotation of the pawn
                            				}
                            
                            				//OutVT.Target.GetActorEyesViewPoint(Loc, Rot);
                            
                            				if(CameraStyle == 'FreeCam')
                            				{
                            					Rot = PCOwner.Rotation;
                            					PCOwner.Pawn.SetRotation(Rot);
                            				}
                            
                            				Loc += FreeCamOffset >> Rot;
                            				//Linear interpolation algorithm. This is the "smoothing," so the camera doesn't jump between zoom levels
                            				if (Dist != FreeCamDistance)
                            				{
                            					Dist = Lerp(Dist,FreeCamDistance,0.15); //Increment Dist towards FreeCamDistance, which is where you want your camera to be. Increments a percentage of the distance between them according to the third term, in this case, 0.15 or 15%
                            				}
                            
                            				Pos = Loc - Vector(Rot) * Dist; /*Instead of using FreeCamDistance here, which would cause the camera to jump by the entire increment, we use Dist, which increments in small steps to the desired value of FreeCamDistance using the Lerp function above*/
                            				// @fixme, respect BlockingVolume.bBlockCamera=false
                            
                            				//This determines if the camera will pass through a mesh by tracing a path to the view target.
                            				HitActor = Trace(HitLocation, HitNormal, Pos, Loc, FALSE, vect(12,12,12));
                            				//This is where the location and rotation of the camera are actually set
                            				OutVT.POV.Location = (HitActor == None) ? Pos : HitLocation;
                            				CameraLocation = OutVT.POV.Location;
                            				OutVT.POV.Rotation = Rot;
                            
                            				break; //This is where our code leaves the switch-case statement, preventing it from executing the commands intended for the FirstPerson case.
                            
                            				case 'FirstPerson' : // Simple first person, view through viewtarget's 'eyes'
                            				default : OutVT.Target.GetActorEyesViewPoint(OutVT.POV.Location, OutVT.POV.Rotation);
                            				break;
                            
                            			}
                            		}
                            	}
                            
                            	if( !bDoNotApplyModifiers )
                            	{
                            		// Apply camera modifiers at the end (view shakes for example)
                            		ApplyCameraModifiers(DeltaTime, OutVT.POV);
                            	}
                            
                            }
                            
                            DefaultProperties
                            {
                            	FreeCamDistance = 200.f
                            	FreeCamOffset=(X=0,Y=30,Z=50)
                            }
                            BUT, and a big BUUUT here, when I extended from UDKPawn, there are a lot of things, mainly in animation function parts, that needs to copy and paste from UT classes again. I think that famous Adventure Kit from our other UDK user buddy can help with it, because he extended his classes from UDK and not from UT.

                            My opinion? In my game, extending from UT works well because it has a very simple gameplay. But your game is an adventure game with more resources. If your problems became insoluble because of UT classes, it would be a good idea take a look at UDK classes. The only (big) issue is rewriting your entire code again with a lot of native functions missing in UDK class ("error party" in compilation -__-).

                            Comment


                              #89
                              "...when I make sufficient sacrifices to the Vector Math Gods."
                              Hahaha, indeed!

                              Comment


                                #90
                                Another week has flown by, and so has much of the work still needed to be done on Eye of the Abyss.

                                The MoCap studio is still out of commission, so that has being delayed again.

                                But as for good news, most of this weeks work went into polishing the existing animation; facial expressions and hand motions, all previously missing from the MoCap data. To this effect Snow White and the Sister have both being very fun and easy to make work. The Brother is being a little terror, however.

                                The brother was the first character I modelled and rigged, and as such still used much of my knowledge from working in animation. The sister was the second, and by extension had a bit more UDK friendly rigging in her, and Snow White, being the third and final was the most UDK friendly. Sadly, by the time I realised my error with the Brother, I was/am way to far into production to be able to re-rig him, re-import him, and re-target all the animation onto him. So sadly for now I am fighting my own work as it were. It is not the end of the world, but the Brother is not as expressive as his Sister is, poor introvert that he is.

                                That said, it is still working and is still within acceptable parameters of aesthetic pleasantness.

                                More excitingly, I got my hands on an XBox USB controller and have got it almost fully functioning with the game, so XBox controller support is a go. It’s quite pleasing to play with a remote (I haven’t played a console game in quite some time)

                                The only things not working with the controller are the menus: main, pause and all conversations, I’m working on a work around but haven’t cracked it yet.



                                So while I continue to wait for MoCap goodness, there is still plenty to keep me busy. When I get that MoCap done and dusted there will be a new release for all (3?) of you.

                                See you all next week!
                                Changelog:

                                (01/09/2014)
                                -Sister Scenes all given emotion etc, some tweaking still needed once other anims reach baseline
                                -ESnow now has extended animation in her meeting with the Sister

                                (02/09/2014)
                                -XBox controller aquired, controls implemented. Menus not working. Otherwise all gooooooooooood.
                                -ESnow now has emotions and such in all her current scenes.
                                -XBox controller now pauses, doesnt jump, and has block, sprint et all added. only menu interfacing needed.

                                (03/09/2014)
                                -Custom into animation thingy added to game itself, now has my logo, yay.

                                (04/09/2014)
                                -Brother now emotes, limited though he is, in opening scene.

                                (05/09/2014)
                                -Brother emotes when eaten by tree and is begging to emote during his sword scene

                                TO DO:
                                -CUTSCENES (so ******* repetetive)
                                -FINAL FONTS (Emma?) –
                                -Dialogue background textures (Emma?)
                                -Polish all dem animations.
                                -filler anim for forests
                                -brother gets shield anim

                                Comment

                                Working...
                                X