Announcement

Collapse
No announcement yet.

Eye of the Abyss - WIP#1

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

    Eye of the Abyss - WIP#1

    Hi peeps, I came across a bug in my code but decided (tentatively) that my project was at a point that merited an actual WIP, so here it is.


    My project, Eye of the Abyss, is a third person adventure/slasher game in the vein of Alice: Madness Returns or the console Zelda games.

    A (very brief) outline of the story is:

    A young brother wander in the woods, playing and reading fairy tales. They come across a dark grove, at the centre of which stands a gnarled tree with a sword stuck in its trunk. At this point the player will choose weather the brother or sister will draw the sword, leading to the other other sibling getting imprisoned in the tree, releasing an evil entity. This evil entity must allow the remaining sibling one chance to redeem themselves before it can devour the world, so it decides to corrupt the forest, populating it with evil, twisted forms of the characters from the book of fairy tales the children carried, and the child (you) must venture through the woods defeating these perversions of innocence to save your brother/sister.

    Not so quick, but hopefully that covers it.

    To start with I am only doing the intro and the first enemy; Snow White.

    Here are a few design pages from my design document, they read half notes, half lore. [NOTE: not all the art is mine, I am note much of an artist. I pulled images that have the look and/or feel I am going for]
    [shot]http://fc08.deviantart.net/fs71/i/2013/261/9/3/slide3_by_arcanis_lupus-d6mv5e7.png[/shot]
    [shot]http://fc03.deviantart.net/fs71/i/2013/261/2/b/slide4_by_arcanis_lupus-d6mv5cr.png[/shot]
    [shot]http://fc09.deviantart.net/fs71/i/2013/261/7/f/slide5_by_arcanis_lupus-d6mv5b8.png[/shot]
    [shot]http://fc09.deviantart.net/fs70/i/2013/261/b/5/slide6_by_arcanis_lupus-d6mv5a7.png[/shot]
    [shot]http://fc08.deviantart.net/fs71/i/2013/261/b/1/slide7_by_arcanis_lupus-d6mv58i.png[/shot]
    [shot]http://th05.deviantart.net/fs71/PRE/f/2013/261/f/f/slide12_by_arcanis_lupus-d6mv518.png[/shot]

    Follow this link to the full design document that I am constantly updating. It should give you an idea of the visual style/design path I'm taking.

    But while that stuff is important, it's not where my primary focus lies. That lies in getting all my .UC classes up to scratch. I only started learning UnrealScript this year, reading through Rachel Cordone's amazing book on the subject and diving right in.

    #2
    I managed to fix some issues I was having with my bot by completely re-writing the code, and removing the bools altogether. Looks like this now:

    Code:
    class TDDwarfController extends AIController;
    
    var TDPawn Target;
    var TDPlayerController PC;
    
    var() int Health;
    
    var() float DetectionRange;
    var() float WaitingDistance;
    var() float WaitingTime;
    var() float MoveSpeed;
    var() float AttackingRange;
    var() float CircleDistance;
    var float TargetDistance;
    
    var bool bAlertedByRoar;
    
    var SkeletalMeshComponent DwarfMesh;
    
    event Possess(Pawn inPawn, bool bVehicleTransition)
    {
        super.Possess(inPawn, bVehicleTransition);
        Pawn.SetMovementPhysics();
    }
    
    function PostBeginPlay()
    {
    	`log("TD Dwarf Controller Spawned!==================");
    	super.PostBeginPlay();
    }
    
    auto state Wandering
    {
    
        function GetEnemy()
        {
            local TDPawn P;
    
            foreach DynamicActors(class'TDPawn', P)
            {
                    if(TDPlayerController(P.Controller) != none)
                    Target = P;
            }
    
        }
    
        Begin:
    
            if(Target == none)
            {
                `log("====================Looking for target. ============================================================== InRange?" @ Target @ TargetDistance);
                WorldInfo.Game.Broadcast(self, "Distance:" @ TargetDistance);
                GetEnemy();
                TargetDistance = vsize(Pawn.Location - Target.Location);
                
                if(TargetDistance > DetectionRange)
                {
                    Target = none;
                    `log("====================Target too distant, Roaming. ===================================================== InRange?" @ Target @ TargetDistance);
                    WorldInfo.Game.Broadcast(self, "Distance:" @ TargetDistance);
                    MoveTo(FindRandomDest().Location);
                    Sleep(1);
                    goto ('Begin');
                }
            }
            
            if(Target != none)
            {
                TargetDistance = vsize(Pawn.Location - Target.Location);
                
                if(TargetDistance > DetectionRange)
                {
                    Target = none;
                    goto ('Begin');
                    `log("====================Target too distant, ignoring.===================================================== InRange?" @ Target @ TargetDistance);
                    WorldInfo.Game.Broadcast(self, "Distance:" @ TargetDistance);
                }
                
                if(TargetDistance <= DetectionRange && TargetDistance >= AttackingRange /*&&  TargetDistance >= CircleDistance*/)
                {
                    MoveSpeed = 128;
                    `log("====================Target close. Moving to intercept. =============================================== InRange?" @ Target @ TargetDistance);
                    WorldInfo.Game.Broadcast(self, "Distance:" @ TargetDistance);
                    MoveToward(Target,,,False);
                    goto ('Begin');
                }
    
                if(TargetDistance <= DetectionRange /*&& TargetDistance <= CircleDistance*/ && TargetDistance <= AttackingRange)
                {
                    `log("====================Target Close, beginning attack. ================================================== InRange?" @ Target @ TargetDistance);
                    WorldInfo.Game.Broadcast(self, "Distance:" @ TargetDistance);
                    /*MoveTo((Target.Location - Pawn.Location) cross vect(0,0,5));
                    Sleep(1);*/
                    GoToState('Attacking');
                }
                
                else
                {
                    WorldInfo.Game.Broadcast(self, 'Error Line 96');
                    goto 'Begin';
                }
            }
    
            else
            {
                `log("====================This shouldnt be happening. Line 105. ============================================ InRange?" @ Target @ TargetDistance);
                WorldInfo.Game.Broadcast(self, "Distance:" @ TargetDistance);
                goto ('Begin');
            }
    
    }
    
    state Attacking
    {
        Begin:
    
        if(Target != none && TargetDistance <= DetectionRange && TargetDistance <= CircleDistance && TargetDistance <= AttackingRange)
        {
            `log("====================Attacking happening. ============================================================= InRange?" @ Target @ TargetDistance);
            WorldInfo.Game.Broadcast(self, "Distance:" @ TargetDistance);
            WorldInfo.Game.Broadcast(self, 'Hit Confirmed');
    
            Target.TDTakeDamage();
            Sleep(2);
        
            GoToState('Wandering');
        }
    
        if(Target != none && TargetDistance <= DetectionRange && TargetDistance <= CircleDistance && TargetDistance >= AttackingRange)
        {
            `log("====================Moving in for the kill. ========================================================== InRange?" @ Target @ TargetDistance);
            MoveToward(Target,,,False);
            WorldInfo.Game.Broadcast(self, "Distance:" @ TargetDistance);
            GoToState ('Wandering');
        }
    
    }
    
    defaultproperties
    {
            MoveSpeed=64
            DetectionRange=1024
            CircleDistance=500
            AttackingRange=100
    }
    Again, forgive the extensive logs. I will have to move the wandering state into a "tick" function (i think) to make the bot able to target the player while moving from node to node, but that will make the bot pick a new random path node every tick, no?

    So for now I'm giving it a test custom mesh and animations to get its punch attack working.

    I'm currently using my own damage system ("TDTakeDamage" instead of the out of the box "TakeDamage" in UDKPawn) for simplicity but i have a feeling that I'm just making things more complicated.

    As always I'd love feedback but regardless I'll keep posting with updates as they come.

    Comment


      #3
      And how right I was. I'm now using the normal TakeDamage function making for a much less stupid system.

      Got the bot to a point where it is stable and working, the giving and taking of damaged included. Here is a video of it in action.

      My next steps are:

      ✔Get it to follow the player the instant we come within range, not just when it reaches a node.✔✔✔✔✔✔
      ✔Get it to swing its arm when it attacks.✔✔✔✔✔
      ✔Get it to retreat a short distance when attacked.✔✔✔✔✔✔


      Once those are done I will check how it plays against multiple of the bots (I dont want one getting attacked to make them all retreat, for example) The move on to coding the Boss, followed by tidying up the players attacks.

      Any thoughts on my to do list are more than welcome.

      Comment


        #4
        Very happy to report that something clicked in my head and I blitzed through those steps much faster than i anticipated. Placing some decision making into a tick function did the trick.

        Here is the finished Pawn:

        Code:
        class TDDwarfPawn extends UDKPawn
        	placeable;
        
        var() const DynamicLightEnvironmentComponent LightEnvironment;
        var() const array<Name> SwingAnimationNames;
        var() const Name SwordHandSocketName;
        
        var AnimNodePlayCustomAnim SwingAnim;
        
        var int TDHealth;
        
        var TDPawn Target;
        
        var array<Actor> SwingHitActors;
        
        function PostBeginPlay()
        {
        	`log("TD Dwarf Pawn Spawned!==================");
        	super.PostBeginPlay();
        }
        
        simulated event PostInitAnimTree(SkeletalMeshComponent SkelComp)
        {
        	super.PostInitAnimTree(SkelComp);
        
        	if (SkelComp == Mesh)
        	{
        		SwingAnim = AnimNodePlayCustomAnim(SkelComp.FindAnimNode('SwingCustomAnim'));
        	}
        }
        
        function Attack()
        {
            SwingHitActors.Remove(0, SwingHitActors.Length);
            Self.SwingAnim.PlayCustomAnim('SwingOne', 2.0);
        }
        
        event TakeDamage(int DamageAmount, Controller EventInstigator, vector HitLocation, vector Momentum, class<DamageType> DamageType, optional TraceHitInfo HitInfo, optional Actor DamageCauser)
        {   
                TDHealth = TDHealth - DamageAmount;
            
                WorldInfo.Game.Broadcast(self, "==========Dwarf Took Damage" @ DamageAmount);
            
                if(TDHealth <= 50 && TDHealth > 20)
                    {
                    WorldInfo.Game.Broadcast(self, "==========Dwarf Half Health");
                    }
            
                if(TDHealth <= 20 && TDHealth > 0)
                    {
                    WorldInfo.Game.Broadcast(self, "=========Dwarf One hit left");
                    }
            
                if(TDHealth <= 0)
                    {
                    WorldInfo.Game.Broadcast(self, "=========Dwarf Dead");
                    Destroy();
                    }
                
                GroundSpeed = 300;
                TDDwarfController(Controller).Attacked();
        }
        
        function AttackSpeed()
        {
            GroundSpeed = 200;
        }
        
        function BaseSpeed()
        {
            GroundSpeed = 100;
        }
        
        simulated event Tick(float DeltaTime)
        {
            super.Tick(DeltaTime);
                    
            if(self.SwingAnim.bIsPlayingCustomAnim == true)
            {
                TraceSwing();
            }
        }
        
        function TraceSwing()
        {
        	local Actor HitActor;
        	local Vector HitLoc, HitNorm, SwordPoint;
            local TDPawn P;
            
        	SwordPoint = GetSwordSocketLocation(SwordHandSocketName);
        	    
            foreach DynamicActors(class'TDPawn', P)
            {
                if(TDPlayerController(P.Controller) != none)
                Target = P;
            }
        
        	foreach TraceActors(class'Actor', HitActor, HitLoc, HitNorm, SwordPoint)
        	{   	    
        		if (HitActor != self && AddToSwingHitActors(HitActor) && HitActor == Target)
        		{
        			HitActor.TakeDamage(10, Instigator.Controller, HitLoc, HitNorm, class'DamageType');
        		}
        	}
        }
        
        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 Vector GetSwordSocketLocation(Name SocketName)
        {
        	local Vector SocketLocation;
        	local Rotator SocketRotation;
        	local SkeletalMeshComponent SMC;
        	
        	SMC = self.mesh;
        
        	if (SMC != none && SMC.GetSocketByName(SocketName) != none)
        	{
        		SMC.GetSocketWorldLocationAndRotation(SocketName, SocketLocation, SocketRotation);
        	}
        
        	return SocketLocation;
        }
        
        defaultproperties
        {
        	SwordHandSocketName="SwordPoint"
        
        	Components.Remove(Sprite)
        
        	Begin Object Class=DynamicLightEnvironmentComponent Name=MyLightEnvironment
        		bSynthesizeSHLight=true
        		bIsCharacterLightEnvironment=true
        		bUseBooleanEnvironmentShadowing=false
        	End Object
        	Components.Add(MyLightEnvironment)
        
        	Begin Object Class=SkeletalMeshComponent Name=MySkeletalMeshComponent
        		bCacheAnimSequenceNodes=false
        		AlwaysLoadOnClient=true
        		AlwaysLoadOnServer=true
        		CastShadow=true
        		BlockRigidBody=true
        		bUpdateSkelWhenNotRendered=false
        		bIgnoreControllersWhenNotRendered=true
        		bUpdateKinematicBonesFromAnimation=true
        		bCastDynamicShadow=true
        		RBChannel=RBCC_Untitled3
        		RBCollideWithChannels=(Untitled3=true)
                LightEnvironment=MyLightEnvironment
        		bOverrideAttachmentOwnerVisibility=true
        		bAcceptsDynamicDecals=false
        		SkeletalMesh=SkeletalMesh'TrueDarknessContent.TestSkeletalMeshes.Test_Varnan_S_M'
        		AnimTreeTemplate=AnimTree'TrueDarknessContent.TestAnims.Test_Varnan_Anim_Tree'
        		AnimSets(0)=AnimSet'TrueDarknessContent.TestAnims.Test_Varnan_S_M_Anims'
        		Scale3D=(X=5, Y=5, Z=5)
        		Translation=(X=0, Y=0, Z=-80)
        		bHasPhysicsAssetInstance=true
        		TickGroup=TG_PreAsyncWork
        		MinDistFactorForKinematicUpdate=0.2f
        		bChartDistanceFactor=true
        		RBDominanceGroup=20
        		Scale=1.f
        		bAllowAmbientOcclusion=false
        		bUseOnePassLightingOnTranslucency=true
        		bPerBoneMotionBlur=true
        	End Object
        	Mesh=MySkeletalMeshComponent
        	Components.Add(MySkeletalMeshComponent)
        
            ControllerClass=class'TrueDarkness.TDDwarfController'
        
            bJumpCapable=false
            bCanJump=false
         
            GroundSpeed=100
            TDHealth=100
        }

        And the Controller:

        Code:
        class TDDwarfController extends AIController;
        
        var TDPawn Target;
        var TDPlayerController PC;
        
        var() float DetectionRange;
        var() float AttackingRange;
        var float TargetDistance;
        var() float avoidDistance;
        
        var vector awayFromPlayer;
        var vector SelfToOther, OtherToSelf;
        
        var SkeletalMeshComponent DwarfMesh;
        
        event Possess(Pawn inPawn, bool bVehicleTransition)
        {
            super.Possess(inPawn, bVehicleTransition);
            Pawn.SetMovementPhysics();
        }
        
        function PostBeginPlay()
        {
        	`log("TD Dwarf Controller Spawned!==================");
        	super.PostBeginPlay();
        }
        
        function Attacked()
        {
            GoToState ('Running');
        }
        
        event Tick(float DeltaTime)
        {
            local TDPawn P;
            
            super.Tick(DeltaTime);
            
            foreach DynamicActors(class'TDPawn', P)
            {
                if(TDPLayerController(P.Controller) != none)
                
                Target = P;
            }
            
            TargetDistance = VSize(Target.Location - Pawn.Location);
            
            if(GetStateName() == 'Running')
            {
                SetTimer(2.5, false);
                return;
            }
            
            if(TargetDistance > DetectionRange)
            {
                return;
            }
            
            if(TargetDistance <= DetectionRange && TargetDistance > AttackingRange)
            {
                GoToState('Wandering', 'MoveIn');
            }
            
            if(TargetDistance <= AttackingRange)
            {
                SetTimer(2.5, false);
                return;
            }
        }
        
        auto state Wandering
        {
        
            function GetEnemy()
            {
                local TDPawn P;
        
                foreach DynamicActors(class'TDPawn', P)
                {
                        if(TDPlayerController(P.Controller) != none)
                        Target = P;
                }
        
            }
        
            Begin:
        
                if(Target == none)
                {
                    GetEnemy();
                    TargetDistance = vsize(Pawn.Location - Target.Location);
                    
           /*LABEL*/Wander:
                    
                    if(TargetDistance > DetectionRange)
                    {
                        Target = none;
                        TDDwarfPawn(Pawn).BaseSpeed();
                        MoveTo(FindRandomDest().Location);
                        Sleep(1);
                        goto ('Begin');
                    }
                }
                
                if(Target != none)
                {
                    TargetDistance = vsize(Pawn.Location - Target.Location);
                    
                    if(TargetDistance > DetectionRange)
                    {
                        Target = none;
                        TDDwarfPawn(Pawn).BaseSpeed();
                        goto ('Begin');
                    }
                    
           /*LABEL*/MoveIn:
                    
                    if(TargetDistance <= DetectionRange && TargetDistance >= AttackingRange)
                    {
                        TDDwarfPawn(Pawn).AttackSpeed();
                        MoveToward(Target,,,False);
                        goto ('Begin');
                    }
        
                    if(TargetDistance <= DetectionRange && TargetDistance <= AttackingRange)
                    {
                        TDDwarfPawn(Pawn).AttackSpeed();
                        GoToState('Attacking');
                    }
        
                    else
                    {
                        goto 'Begin';
                    }
                }
        
                else
                {
                    goto ('Begin');
                }
        
        }
        
        state Attacking
        {
            Begin:
        
            if(Target != none && TargetDistance <= DetectionRange && TargetDistance <= AttackingRange)
            {
                TDDwarfPawn(Pawn).Attack();
                Sleep(2);
            
                GoToState('Wandering');
            }
        
            if(Target != none && TargetDistance <= DetectionRange && TargetDistance >= AttackingRange)
            {
                MoveToward(Target,,,False);
                GoToState ('Wandering');
            }
        
        }
        
        state Running
        {
        
        Begin:
        
            if(Target != none)
            {
        		TargetDistance = VSize(Target.Location - Pawn.Location);
        		SelfToOther = Normal(Target.Location - Pawn.Location);
        
        		OtherToSelf = Normal(Pawn.Location - Target.Location);
        		awayFromPlayer = Pawn.Location + OtherToSelf * avoidDistance;
        
                MoveTo(awayFromPlayer);
                Sleep(1);
                TDDwarfPawn(Pawn).AttackSpeed();
                GoToState('Wandering');
            }
        }
        
        defaultproperties
        {
                avoidDistance=500
                DetectionRange=1024
                AttackingRange=125
        }

        If any experienced peeps notice anything outstandingly wrong let me know


        So now is on to the boss, Snow White.

        Her basic behavior is:

        ✔Move to the player (as a boss fight she will be always aware of your presence)
        Once within a certain range hold back and circle (menacingly)
        ✔Suddenly advance and slash with her dagger (block-able)
        Back off to circling.

        ✔When she is attacked while circling she will block.
        ✔When she is blocked while slashing she will be stopped temporarily, this is the time to attack.

        After she takes X amount of damage, she will start circling from a greater distance and begin throwing large orbs of black ooze which explode on landing. (unblock-able)

        If the player moves closer to her to attack she will block, slash and retreat.

        Eventually, either after being hit by her balls (huehuehuehue) or dodging long enough, there will be a cut scene where the player is hit, goes down, gets a shield, and blocks a killing blow, back to the fight.

        Her behavior will be much the same, except now the player can block with the shield which is great because snow white now is kinda out of breath and goes down to a knee after launching (maaaybe you can deflect the balls back (the shield is sort of a mirror after all) but i may be aiming too high here)

        and down she'll go eventually.

        I am aware this will take...a while.



        I will probably write a few kismet nodes and activators for them in this boss to trigger the cutscenes and adding of the shield (which I am yet to make, hell I need to get the sword blocking too!)

        So ill probably be writing the sword, shield, and Snow White in tandem.

        Hooray

        Comment


          #5
          Quick little update on bots.

          Two youtube links:
          Snow White
          Dwarves

          Note the health and blocking state display up top left, and the blocking and damage feedback bottom left

          Comment


            #6
            Major update, Shield is now a thing.

            This makes me moist 'cause I thought getting the shield working would be a truly arduous task, but now that its in there and working to an acceptable point (its just a skeletal mesh attached to the pawns arm) Ill just have to implement a kismet sequence to equip the shield at the right moment in the game (along with switching the player pawn to a different anim tree).


            If anyone has any thoughts about anything, let me know.

            I feel like Simon and/or Garfunkel here.

            Addendum, I love the targeting system and most of the camera here and will probably work towards them later on.

            Comment


              #7
              quick update. While I bash my head against my player camera once again, I've decided on a slightly different menu system.

              This video shows my little test, with a map change and a quit. Quite simple and will be fun to set up prettily. Inspired by Psychonaughts,

              On with bashing my head on my camera.

              Comment


                #8
                52 Weeks remain...

                Oooookaaaaay been a bit, I had a Work in progress essay to hand in, so tangible progress has crawled to a much slower pace.
                The essay is done now, and already I've made progress. Apparently leaving coding alone for a bit helps the mind think of new solutions. Whodathunkit.

                anyway, ill post a little of my essay (the part detailing my work process) so ya'll can understand what I'm doing and how I'm doing it.

                Preproduction

                Art Design (Designing Characters, locations and the world in general)
                Script Writing (Writing the script for both the animated scenes and game play segments)
                Level Design (Designing the maps in the game, ensuring they are interesting while not too easy/hard)
                Mechanics Design (Planning the behaviour of characters, enemies and items within the game)


                Initial Production

                Coding (Implementing the planned Mechanics through Unreal Script)
                Content Creation (Creating the designed characters and items, includes modelling, textures and rigging)
                Animation Capture (Using the Motion Capture studio to capture the animation planned in scripting and mechanics)
                Sound Design (Recording and creating ambient sounds, music and dialogue for cutscenes)


                Production

                Level Creation (Building the full maps in UDK, using the Content designed previously)
                Character Creation (putting together of created character models, character animation and character mechanics from previous stages)
                Cutscene Creation (placing the characters, their animation and sound in the UDK to implement the planned cutscenes)
                Menu Creation (Building and implementing a menu system to bring together everything created so far, making the game playable)


                Post Production

                Play Testing (Getting the game played by people outside of the project to be tested thoroughly, along with receiving as much feedback as possible)
                Post Tweaking (Acting on that feedback and editing the game where required)
                Final Play Test/Tweaking (A repeat of the last two steps, time permitting could repeat many times)
                Package Game (final packaging of the game into installable .EXE for release/assessment)
                In terms of the game itself, I have managed to almost get the lock on working properly (the camera just needs a little more tweaking is all) and rebound some of the controls more to my liking.

                here is a changelog

                TD v 0.1.7 (1/10/2013)
                -Pawn moves free of camera
                -test menu map added
                -lock on for player pawn added Right Click or Q. Hold.
                -cycle targets with E or Z.
                -lab safe inputs file added

                TD v 0.1.8 (14/10/2013)
                -lock on system implemented

                -Pawn moves relative to camera when locked, relative to self when not locked
                -Camera (almost) works during lock
                -When targeted enemy dies, lock on will look for new target
                -Player can no longer move when blocking
                -Camera switching and zooming disabled while locked on
                -Controls changed

                -”Space” cycles targets (jumping disabled)
                -”Left Shift” toggles lock on
                -”Right Click blocks
                its not much, but its moving along nicely since all of 0.1.8's changes were done in an afternoon/evening. </self-praise>

                As always, I soldier on, and outside input is greatly desired.

                Comment


                  #9
                  Base Coding Complete!

                  Feeling pretty **** happy, as of right now, the basic behaviour, mechanics and structure of my project is complete.

                  2338 lines of UScript between 25 custom classes (including Whitespace)

                  quick changelog update:

                  TD v 0.1.9 (21/10/2013)
                  -Snow White stage three added
                  --combines past two stages without strafing, much more agressive
                  -New kismet events (TDSeqEvent_)
                  --Player died
                  --Snow White Died
                  --Begin Shield Cutscene (completed)
                  -New Kismet Actions (TDSeqAct_)
                  --Give Shield
                  --Snow White Stage Three activation
                  -Shield functionality added
                  --Now only get shield when given through kismet
                  --Snow Whites balls cant damage through shield
                  --player can move when blocking with shield (only while locked on)
                  --shield reflects balls back at Snow White (and damage her, currently spawning new projectile rather than actual reflection, possibly naughty)
                  -Camera now locks on to Snow White too.
                  From here I will begin making proper content in the form of 3D models, textures and sounds, and then I will make use of the MoCap suite at Uni to get the animation done. Good times ahead.

                  Comment


                    #10
                    Update time!

                    It's been a while, but after a short sabbatical I'm back in action and rearing to go.

                    I've done a bunch of quick art to make sure I know exactly how I want my characters to look, and from there I am beginning to model them all! It's a strange, bitter-sweet reunion with 3D software.

                    Here is the art in no particular order:


                    Sorry they're so big (I have that problem a lot hurr hurr)


                    http://www.nicholas-ferrar.net/wp-co...07/Brother.png
                    http://www.nicholas-ferrar.net/wp-co.../07/Sister.png
                    http://www.nicholas-ferrar.net/wp-co...Snow-White.png
                    http://www.nicholas-ferrar.net/wp-co...Snow-White.png
                    http://www.nicholas-ferrar.net/wp-co...13/12/Evil.png
                    http://www.nicholas-ferrar.net/wp-co...13/12/Menu.png
                    http://www.nicholas-ferrar.net/wp-co.../Full-Cast.png

                    As an aside, I am terrible at drawing, and as such the above art was made through heavy reference to art from The Hyrule Historia, 'cause I'm heavily inspired by the Zelda franchise.

                    With all that drawn, I have begun modelling the characters, and will have some lovely models for you all to see soon!

                    Comment


                      #11
                      In what can clearly be described as "well overdue", here is an update on what I've been upto since I last posted a month ago.

                      After having made all that art I began modelling assets and characters. I also did a great job of contracting some kind of lymphatic infection which almost had me catatonic for most of December. Now I'm hopped up on antibiotics and back in full force.

                      First, ill quickly show my change log since I began making assets, then get into particulars.

                      (05/12/13)

                      -Game Assets folder added.
                      -final Brother and Sister models begun.

                      (13/12/13)
                      -More Asset Updates
                      -Tree_1
                      -Tree_2
                      -Evil_Tree
                      -Evil_Snow_White
                      -Updates to Brother and Sister

                      (18/12/13)
                      -More assets
                      -Small Tree 1
                      -Small Tree 2
                      -small grass
                      -large grass
                      -Castle Assets:
                      -throne
                      -doors
                      -stair
                      -chandelier
                      -Maps begun
                      -Forest
                      -Castle

                      (21/12/13)
                      -Maps
                      -Menu Forest added
                      -castle exterior added to dark forest map
                      -forest rocks added to forest package
                      -base_package created

                      (03/01/14)
                      -models modified
                      -brother head complete
                      -sister head almost complete

                      TO DO:
                      -doors for menu map
                      -day forest map (all cutscene only)
                      -castle rubble
                      If that makes sense to you, you'll see that I've been building maps and characters in parallel, along with assets the dress the maps. At this point 3 of 4 maps are well under way, 2 and a half of 4 characters are done, and most of the major assets and items are complete.

                      Here are some photos of maps and characters in progress, no textures yet.
                      http://www.nicholas-ferrar.net/wp-co...-Full-Shot.png
                      http://www.nicholas-ferrar.net/wp-co...other-Head.png
                      http://www.nicholas-ferrar.net/wp-co...-Full-Shot.png
                      http://www.nicholas-ferrar.net/wp-co...ister-Head.png
                      http://www.nicholas-ferrar.net/wp-co...1/Menu-map.png
                      http://www.nicholas-ferrar.net/wp-co...k-forest-1.png
                      http://www.nicholas-ferrar.net/wp-co...k-forest-2.png
                      http://www.nicholas-ferrar.net/wp-co...k-forest-5.png
                      http://www.nicholas-ferrar.net/wp-co...1/interior.png


                      I'm going to be doing weekly updates from now on at the very least, probably more. So watch this space.

                      Comment


                        #12
                        Another week, another update.

                        I can happily say that all the characters are now modelled and UVd. With this step complete I now need to begin texturing and rigging, in that order.

                        I've also begun to dip my toes into Apex, and subsequently broken those toes. Seriously, I have never seen so many crashes from both Maya AND the UDK. I'm flipping tables over here. So for now I'm doing more research on version compatibilities and probably doing a fresh install of Maya.

                        So anywhoo, here are the characters:

                        http://www.nicholas-ferrar.net/wp-co...01/brother.png
                        http://www.nicholas-ferrar.net/wp-co.../01/sister.png
                        http://www.nicholas-ferrar.net/wp-co...ister_topo.png
                        http://www.nicholas-ferrar.net/wp-co...lsnowwhite.png
                        http://www.nicholas-ferrar.net/wp-co...wwhitetopo.png
                        http://www.nicholas-ferrar.net/wp-co...hite.pnng_.png
                        http://www.nicholas-ferrar.net/wp-co...wwhitetopo.png
                        http://www.nicholas-ferrar.net/wp-co...1/menuchar.png
                        http://www.nicholas-ferrar.net/wp-co...nuchartopo.png

                        Check out my website for more details.

                        Comment


                          #13
                          Really awesome start Arcanis...it's disturbingly quiet from the other UDK'ers here on the forum but really looking forward to seeing where this project goes...Good luck man...no idea why I'm just now seeing this thread but I'll be keeping watch on it....

                          Comment


                            #14
                            Thanks for the update(s)!! I really like the style and are extremely curios to see the textured versions of your assets and environments Keep up the work

                            Comment


                              #15
                              Update time!

                              Firstly, shout out to President and Hackmet, I'm way more excited than I probably should be to have people on these forums start to take an interest.

                              Now, onto the update.

                              After a week of work, I've completed the basic texturing and sculpting of all the characters. These are their base colours and details that I will build upon more in photoshop to add the finder details.
                              I'm having a touch of consternation with normals flipping on both Snow Whites dresses, which is what gives them that thick black outline and no details on the pure version. But that is an easy fix, at least in theory. I am also going to probably swap out the sisters head for something less...crappy.

                              With all that said, next up is details and some environment textures to make those maps looks even better!

                              Picture time.

                              http://www.nicholas-ferrar.net/wp-co...1/brofront.png
                              http://www.nicholas-ferrar.net/wp-co...01/broback.png
                              http://www.nicholas-ferrar.net/wp-co...1/sisfront.png
                              http://www.nicholas-ferrar.net/wp-co...01/sisback.png
                              http://www.nicholas-ferrar.net/wp-co...Esnowfront.png
                              http://www.nicholas-ferrar.net/wp-co.../esnowback.png
                              http://www.nicholas-ferrar.net/wp-co...psnowfront.png
                              http://www.nicholas-ferrar.net/wp-co.../psnowback.png
                              http://www.nicholas-ferrar.net/wp-co...Menu_Front.png


                              As always, feedback, criticism and all input is welcome.

                              Comment

                              Working...
                              X