<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7265778554141669292</id><updated>2011-11-27T19:11:35.598-05:00</updated><title type='text'>Otus &amp; Rupurt (Development Blog)</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://otusandrupurt.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265778554141669292/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://otusandrupurt.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Jacob Schieck</name><uri>http://www.blogger.com/profile/04562687762228940994</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>7</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7265778554141669292.post-5819346336446274763</id><published>2010-06-11T20:00:00.005-04:00</published><updated>2010-06-11T20:49:59.946-04:00</updated><title type='text'>Working with animations</title><content type='html'>Unreal coding for animations can be tricky at times especially if your using custom ones and not using Unreal's nodes. Here is a simple way to play a custom animation.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;My animation tree looks like this:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://img809.imageshack.us/img809/8621/animtree.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 550px;" src="http://img809.imageshack.us/img809/8621/animtree.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;So basically it's just a bunch of switches, and once I finish more animations it'll be more complex but for now it's simple. &lt;/div&gt;&lt;ul&gt;&lt;li&gt;idle_default&lt;/li&gt;&lt;li&gt;combat_idle&lt;/li&gt;&lt;li&gt;combat_attack_auto1&lt;/li&gt;&lt;li&gt;run&lt;/li&gt;&lt;/ul&gt;Now all I have to do in UnrealScript is flip those switches. So I want most of this to happen in my OtusPawn class (which is my character) and get called from my OtusPlayerController. So in the pawn file we have these functions:&lt;blockquote&gt;function EnterCombat() {&lt;br /&gt; pc.InCombat = true;&lt;br /&gt; CombatSwitch.SetBlendTarget(0.0, 0.1);&lt;br /&gt; GetALocalPlayerController().ClientMessage("Entering Combat");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function LeaveCombat() {&lt;br /&gt; pc.InCombat = false;&lt;br /&gt; CombatSwitch.SetBlendTarget(1.0, 0.1);&lt;br /&gt; AttackSwitch.SetBlendTarget(0.0, 0.1);&lt;br /&gt; AttackType.SetActiveChild(0.0, 0);&lt;br /&gt; GetALocalPlayerController().ClientMessage("Leaving Combat");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function AttackTarget(int Damage, GamePawn Target) {&lt;br /&gt; local int ActualDamageCaused;&lt;br /&gt; ActualDamageCaused = DamagePerAttack;&lt;br /&gt; GetALocalPlayerController().ClientMessage("Attacking: " @ Target @ " for " @ ActualDamageCaused @ " damage.");&lt;br /&gt; PlayAttack();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function int CalcKillExp(int CL) {&lt;br /&gt; local int xp;&lt;br /&gt; local int playerLevel;&lt;br /&gt; local int levDif;&lt;br /&gt; playerLevel = OtusPlayerController(Controller).char.level;&lt;br /&gt; levDif = playerLevel - CL;&lt;br /&gt; if (levDif &gt; 7) xp = 0;&lt;br /&gt; else if (levDif &lt; 7 &amp;&amp; levDif &gt; 3) xp = (45 + (5 * CL)) * (1 - 2/11);&lt;br /&gt; else if (levDif &lt; 3 &amp;&amp; levDif &gt; -3) xp = 45 + (5 * CL);&lt;br /&gt; else if (levDif &lt; -3 &amp;&amp; levDif &gt; -7) xp = (45 + (5 * CL)) * (1 + 0.05 * 1);&lt;br /&gt; else xp = (45 + (5 * CL)) * 1.5;&lt;br /&gt; return xp;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//////////////////////////////////////&lt;br /&gt;//                                  //&lt;br /&gt;//    ANIMATIONS             //&lt;br /&gt;//            //&lt;br /&gt;//////////////////////////////////////&lt;br /&gt;simulated function PlayAttack()&lt;br /&gt;{&lt;br /&gt; AttackSwitch.SetBlendTarget(1.0f,0.2);&lt;br /&gt; AttackType.SetActiveChild(0.0, 0);&lt;br /&gt; AutoAttackNode.SetPosition(0.0f, true);&lt;br /&gt; AutoAttackNode.PlayAnim(false,1.0f,0.0f);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;simulated function StopAttack()&lt;br /&gt;{&lt;br /&gt; AttackSwitch.SetBlendTarget(0.0f,0.3);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;event OnAnimEnd(AnimNodeSequence SeqNode,float PlayedTime,float ExcessTime)&lt;br /&gt;{&lt;br /&gt; switch(SeqNode)&lt;br /&gt; {&lt;br /&gt;  case AutoAttackNode : StopAttack(); break;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;All the variables like AttackSwitch, AttackType, and AutoAttackNode are declared at the top of my OtusPawn like this:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;var AnimNodeBlend AttackSwitch;&lt;br /&gt;var AnimNodeBlendList AttackType;&lt;br /&gt;var AnimNodeBlend CombatSwitch;&lt;br /&gt;var AnimNodeSlot FullBodyAnimSlot;&lt;br /&gt;var AnimNodeSequence AutoAttackNode;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;And then set to values in an event called PostInitAnimTree:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;simulated event PostInitAnimTree(SkeletalMeshComponent SkelComp)&lt;br /&gt;{&lt;br /&gt; AttackSwitch = AnimNodeBlend(SkelComp.FindAnimNode('AttackSwitch'));&lt;br /&gt; AttackType = AnimNodeBlendList(SkelComp.FindAnimNode('AttackType'));&lt;br /&gt; CombatSwitch = AnimNodeBlend(SkelComp.FindAnimNode('CombatSwitch'));&lt;br /&gt; AutoAttackNode = AnimNodeSequence(SkelComp.FindAnimNode('combat_attack_auto1'));&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;*NOTE*: If your are using and AnimNodeBlendList, &lt;span style="font-weight:bold;"&gt;MAKE SURE YOUR CHECK PLAY ACTIVE CHILD&lt;/span&gt; in your AnimTree or else it won't play when you do SetPostion() and PlayAnim() on your animation node and your will spend days figuring out why not (I know because I did it!)&lt;br /&gt;&lt;br /&gt;Now that we've got all that set up.... In my player controller I have a bunch of stuff set up to determine whether or not you clicked on an enemy but if you just want you animation to play all you have to do is do the command in my case:&lt;br /&gt;&lt;blockquote&gt;OtusPawn(Pawn).PlayAttack();&lt;/blockquote&gt;&lt;br /&gt;Now it should play your animation and if you have it looping it will keep playing it. Now I included it in this code. But in my real one the &lt;span style="font-style:italic;"&gt;OnAnimEnd &lt;/span&gt;event will only be called if you check the checkbox in your Animation Tree to call ActorAnimEnd or something like that on the sequence. &lt;br /&gt;&lt;br /&gt;However, this creates the problem that if your not using looping animation, like I'm not for my attack animations, you see the character reach the end of the animation, then start to blend back to idle animation which isn't pretty, so we basically want it blend back before it reaches the end of the animation, prefferrably the amount of time we are using to blend (let's say 0.1 seconds).&lt;br /&gt;&lt;br /&gt;So in my controller I have my loop that checks if the player is ready to attack that gets called every frame that the player is in combat and trying to attack something.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;function CheckAttackReady() {&lt;br /&gt; local EnemyPawn ep;&lt;br /&gt; if (AttackTimeAccum &gt; p.AttackSpeed) {&lt;br /&gt;  AutoAttackReady = true;&lt;br /&gt;&lt;br /&gt;  if (AttackTarget != None &amp;&amp; AutoAttackReady == true) {&lt;br /&gt;   ep = EnemyPawn(AttackTarget);&lt;br /&gt;   if (ep.isDead) {&lt;br /&gt;    ToggleCombat();&lt;br /&gt;    return;&lt;br /&gt;   }&lt;br /&gt;   else {&lt;br /&gt;    p.AttackTarget(p.DamagePerAttack, AttackTarget);&lt;br /&gt;    AttackTargetActor.TakeDamage(10, Pawn.Controller, Pawn.Location, vect(0,0,0), class'DmgType_Melee');&lt;br /&gt;    AttackTimeAccum = 0;&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; else {&lt;br /&gt;  if (AttackTimeAccum &gt;= 0.6333) {&lt;br /&gt;   p.StopAttack();&lt;br /&gt;  }&lt;br /&gt;  AutoAttackReady = false;&lt;br /&gt; }&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;The line if &lt;span style="font-style:italic;"&gt;"(AttackTimeAccum &gt;= 0.6333)"&lt;/span&gt; is saying that if my attack is not ready AND it's been longer than 0.6333 seconds since my last attack (my total attack animation is 0.8333 seconds total) then call OtusPawn(Pawn).StopAttack() and start blending back to the idle. This way by the time my animation reaches the end, it's already been faded out and you don't see the character stall. Tadaaa! Smoother animation blending!&lt;br /&gt;&lt;br /&gt;Well that sums up this post, phew... Let's finish it off with a gameplay video. :)&lt;br /&gt;&lt;br /&gt;&lt;object width="480" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/1PfhcS4WnGM&amp;hl=en_US&amp;fs=1&amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/1PfhcS4WnGM&amp;hl=en_US&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="580" height="465"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265778554141669292-5819346336446274763?l=otusandrupurt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://otusandrupurt.blogspot.com/feeds/5819346336446274763/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://otusandrupurt.blogspot.com/2010/06/working-with-animations.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265778554141669292/posts/default/5819346336446274763'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265778554141669292/posts/default/5819346336446274763'/><link rel='alternate' type='text/html' href='http://otusandrupurt.blogspot.com/2010/06/working-with-animations.html' title='Working with animations'/><author><name>Jacob Schieck</name><uri>http://www.blogger.com/profile/04562687762228940994</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265778554141669292.post-7009894516751394841</id><published>2010-06-10T15:50:00.001-04:00</published><updated>2010-06-10T15:51:54.721-04:00</updated><title type='text'></title><content type='html'>&lt;span style="font-weight:bold;"&gt;BACK IN ACTION!&lt;/span&gt;&lt;br /&gt;After several months of not working in Unreal or with this project I've started up again.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Newest Implementations:&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Fully working inventory system with stat bonuses and equip-able items.&lt;/li&gt;&lt;li&gt;Damage dealt based off base stats, level, enemy level difficulty, and equipped items.&lt;/li&gt;&lt;li&gt;Leveling system with enemy experience formulas and quest bonuses.&lt;/li&gt;&lt;li&gt;Combat animations.&lt;/li&gt;&lt;li&gt;Character saves and progress saves.&lt;/li&gt;&lt;li&gt;Attack speed implemented based of stats, items, buffs, de-buffs.&lt;/li&gt;&lt;li&gt;Basic monetary system with item rarity, sell value, buy value.&lt;/li&gt;&lt;li&gt;Selectable friendly/enemy NPCs with vendor properties (almost got vendors working).&lt;/li&gt;&lt;li&gt;Health/Energy bars for players and selected targets (or hovering).&lt;/li&gt;&lt;li&gt;Enemy and item 3D tool-tips and improved HUD.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265778554141669292-7009894516751394841?l=otusandrupurt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://otusandrupurt.blogspot.com/feeds/7009894516751394841/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://otusandrupurt.blogspot.com/2010/06/back-in-action-after-several-months-of.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265778554141669292/posts/default/7009894516751394841'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265778554141669292/posts/default/7009894516751394841'/><link rel='alternate' type='text/html' href='http://otusandrupurt.blogspot.com/2010/06/back-in-action-after-several-months-of.html' title=''/><author><name>Jacob Schieck</name><uri>http://www.blogger.com/profile/04562687762228940994</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265778554141669292.post-2653549294739797241</id><published>2010-03-01T20:42:00.005-05:00</published><updated>2010-03-01T22:21:51.878-05:00</updated><title type='text'>Unreal Maya Shelf</title><content type='html'>Created this shelf to be used in Maya to make things easier. Click the image to download it.&lt;br /&gt;&lt;a href="http://jacobschieck.com/files/unreal_shelf.zip"&gt;&lt;br /&gt;&lt;img id="BLOGGER_PHOTO_ID_5443846711383084690" src="http://jacobschieck.com/wp/images/unrealshelf.PNG" width="440" border="0" alt="" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265778554141669292-2653549294739797241?l=otusandrupurt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://otusandrupurt.blogspot.com/feeds/2653549294739797241/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://otusandrupurt.blogspot.com/2010/03/unreal-maya-shelf.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265778554141669292/posts/default/2653549294739797241'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265778554141669292/posts/default/2653549294739797241'/><link rel='alternate' type='text/html' href='http://otusandrupurt.blogspot.com/2010/03/unreal-maya-shelf.html' title='Unreal Maya Shelf'/><author><name>Jacob Schieck</name><uri>http://www.blogger.com/profile/04562687762228940994</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265778554141669292.post-5409356128456432954</id><published>2010-02-05T01:25:00.011-05:00</published><updated>2010-02-10T22:57:23.336-05:00</updated><title type='text'>Combat System (Kinda)</title><content type='html'>Okay, so after many hours of digging through UT code and forum post after forum post I've gotten my damage and enemy bot system kind of set up.&lt;br /&gt;&lt;br /&gt;Basically I compare the distance from the bot to the player and if it's below a certain distance, in this case 300, the bot calls the AttackEnemy state. So something like this:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;ForEach AllActors(class'OtusPawn', P)&lt;br /&gt;{&lt;br /&gt;Destination = P.Location;&lt;br /&gt;DistanceCheck.X = Destination.X - Pawn.Location.X;&lt;br /&gt;DistanceCheck.Y = Destination.Y - Pawn.Location.Y;&lt;br /&gt;DistanceRemaining = Sqrt((DistanceCheck.X*DistanceCheck.X) + (DistanceCheck.Y*DistanceCheck.Y));&lt;br /&gt;GetALocalPlayerController().ClientMessage("Distance Remaining Till Spotted: "@DistanceRemaining - 300);&lt;br /&gt;bPawnNearDestination = DistanceRemaining &lt; 300.0f;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;My TakeDamage event in my Pawn class looks like this:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;event TakeDamage(int Damage, Controller InstigatedBy, vector HitLocation, vector Momentum, class DamageType, optional TraceHitInfo HitInfo, optional Actor DamageCauser)&lt;br /&gt;{&lt;br /&gt;local int actualDamage;&lt;br /&gt;GetALocalPlayerController().ClientMessage("I'm taking " $ Damage $ " damage from" $ InstigatedBy $ "!");&lt;br /&gt;&lt;br /&gt;ActualDamage = Damage;&lt;br /&gt;&lt;br /&gt;// call Actor's version to handle any SeqEvent_TakeDamage for scripting&lt;br /&gt;&lt;br /&gt;if ( Health &gt;= 1 ) {&lt;br /&gt;Health -= actualDamage;&lt;br /&gt;}&lt;br /&gt;if ( Health &lt;= 0 )&lt;br /&gt;{&lt;br /&gt;// pawn died&lt;br /&gt;GetALocalPlayerController().ClientMessage("Your dead!");&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="412" height="325" class="BLOG_video_class" id="BLOG_video-90ff31f694557e15" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"&gt;&lt;param name="movie" value="http://www.youtube.com/get_player"&gt;&lt;param name="bgcolor" value="#FFFFFF"&gt;&lt;param name="allowfullscreen" value="true"&gt;&lt;param name="flashvars" value="flvurl=http://v22.nonxt8.googlevideo.com/videoplayback?id%3D90ff31f694557e15%26itag%3D5%26app%3Dblogger%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1331394132%26sparams%3Did,itag,ip,ipbits,expire%26signature%3D83A7671543F9C95D53D113ED996B9D2BF8481805.73F987E537FC4D88586DCD077E197717461AA7B7%26key%3Dck1&amp;amp;iurl=http://video.google.com/ThumbnailServer2?app%3Dblogger%26contentid%3D90ff31f694557e15%26offsetms%3D5000%26itag%3Dw160%26sigh%3D-Z7uEbEmlwRt6-rVeYASrlW8t9Q&amp;amp;autoplay=0&amp;amp;ps=blogger"&gt;&lt;embed src="http://www.youtube.com/get_player" type="application/x-shockwave-flash"width="412" height="325" bgcolor="#FFFFFF"flashvars="flvurl=http://v22.nonxt8.googlevideo.com/videoplayback?id%3D90ff31f694557e15%26itag%3D5%26app%3Dblogger%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1331394132%26sparams%3Did,itag,ip,ipbits,expire%26signature%3D83A7671543F9C95D53D113ED996B9D2BF8481805.73F987E537FC4D88586DCD077E197717461AA7B7%26key%3Dck1&amp;iurl=http://video.google.com/ThumbnailServer2?app%3Dblogger%26contentid%3D90ff31f694557e15%26offsetms%3D5000%26itag%3Dw160%26sigh%3D-Z7uEbEmlwRt6-rVeYASrlW8t9Q&amp;autoplay=0&amp;ps=blogger"allowFullScreen="true" /&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://jacobschieck.com/files/UDK2010-02-05%2001-23-02-24.mov"&gt;VIEW HIGH RES&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265778554141669292-5409356128456432954?l=otusandrupurt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://otusandrupurt.blogspot.com/feeds/5409356128456432954/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://otusandrupurt.blogspot.com/2010/02/combat-system-kinda.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265778554141669292/posts/default/5409356128456432954'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265778554141669292/posts/default/5409356128456432954'/><link rel='alternate' type='text/html' href='http://otusandrupurt.blogspot.com/2010/02/combat-system-kinda.html' title='Combat System (Kinda)'/><author><name>Jacob Schieck</name><uri>http://www.blogger.com/profile/04562687762228940994</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265778554141669292.post-5751441070056556078</id><published>2010-02-02T23:10:00.008-05:00</published><updated>2010-02-10T22:59:18.982-05:00</updated><title type='text'>Otus and the RupurtBot.uc</title><content type='html'>I've gotten Otus into the engine and running around so next on the list is a little bit of combat programming stuff then adding in more characters and art. I'm going to try and get a vertical slice of the game done then expand upon that before I get overwhelmed with an entire game at once.&lt;div&gt;&lt;br /&gt;&lt;object width="415" height="345" class="BLOG_video_class" id="BLOG_video-474913e513943dbb" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"&gt;&lt;param name="movie" value="http://www.youtube.com/get_player"&gt;&lt;param name="bgcolor" value="#FFFFFF"&gt;&lt;param name="allowfullscreen" value="true"&gt;&lt;param name="flashvars" value="flvurl=http://v3.nonxt3.googlevideo.com/videoplayback?id%3D474913e513943dbb%26itag%3D5%26app%3Dblogger%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1331394132%26sparams%3Did,itag,ip,ipbits,expire%26signature%3D65CF71F72F0746F602A27304D5DDDE0F4EF5DEDA.2C7758605239D11C2C120F532FD9D19C677444BD%26key%3Dck1&amp;amp;iurl=http://video.google.com/ThumbnailServer2?app%3Dblogger%26contentid%3D474913e513943dbb%26offsetms%3D5000%26itag%3Dw160%26sigh%3DfTUBp9EkRwkbLK-7pr2hf2Ay6Bk&amp;amp;autoplay=0&amp;amp;ps=blogger"&gt;&lt;embed src="http://www.youtube.com/get_player" type="application/x-shockwave-flash"width="415" height="345" bgcolor="#FFFFFF"flashvars="flvurl=http://v3.nonxt3.googlevideo.com/videoplayback?id%3D474913e513943dbb%26itag%3D5%26app%3Dblogger%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1331394132%26sparams%3Did,itag,ip,ipbits,expire%26signature%3D65CF71F72F0746F602A27304D5DDDE0F4EF5DEDA.2C7758605239D11C2C120F532FD9D19C677444BD%26key%3Dck1&amp;iurl=http://video.google.com/ThumbnailServer2?app%3Dblogger%26contentid%3D474913e513943dbb%26offsetms%3D5000%26itag%3Dw160%26sigh%3DfTUBp9EkRwkbLK-7pr2hf2Ay6Bk&amp;autoplay=0&amp;ps=blogger"allowFullScreen="true" /&gt;&lt;/object&gt;&lt;br /&gt;&lt;a href="http://jacobschieck.com/files/UDK2010-02-02%2023-05-05-372.mov"&gt;VIEW HIGH RES&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Also I've decided it'd be helpful for anyone trying to make bots chase characters around or just follow a player. Most of this code is borrowed from multiple sources but here's how I did it:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;class RupurtBot extends UTBot;&lt;br /&gt;&lt;br /&gt;protected event ExecuteWhatToDoNext()&lt;br /&gt;{&lt;br /&gt;`log("Tra la la la la");&lt;br /&gt;&lt;br /&gt;// add events and states, and regulate them from here to govern your AI&lt;br /&gt;GotoState('SeekEnemy');&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;state SeekEnemy&lt;br /&gt;{&lt;br /&gt;//This function just returns the first player it finds&lt;br /&gt;function OtusPawn FindEnemy()&lt;br /&gt;{&lt;br /&gt;local OtusPawn P;&lt;br /&gt;&lt;br /&gt;ForEach AllActors(class'OtusPawn', P)&lt;br /&gt;{&lt;br /&gt;`log("I FOUND YOU!!");&lt;br /&gt;//if(DECPawn(P) == None)&lt;br /&gt;//{&lt;br /&gt;return P;&lt;br /&gt;//}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;return None;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt; Begin:&lt;br /&gt;if(Enemy == None)&lt;br /&gt;{&lt;br /&gt;//If the bot has no enemy, find one&lt;br /&gt;Enemy = FindEnemy();&lt;br /&gt;`log("LOOKING FOR ENEMY");&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if(Enemy != None)&lt;br /&gt;{&lt;br /&gt;//If the bot has an Enemy search for a path using&lt;br /&gt;//pathnodes to it&lt;br /&gt;if(FindBestPathToward(Enemy, false, false))&lt;br /&gt;{&lt;br /&gt;//Move along the path that was just calculated&lt;br /&gt;MoveToward(MoveTarget,,,False);&lt;br /&gt;`log("Enemy found! Moving to target");&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;{&lt;br /&gt;//Move directly towards Enemy if no&lt;br /&gt;//path was found&lt;br /&gt;MoveToward(Enemy, , ,False);&lt;br /&gt;`log("Enemy found! Moving to target");&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;{&lt;br /&gt;//Find a random pathnode and go to it&lt;br /&gt;MoveTo(FindRandomDest().Location);&lt;br /&gt;`log("No enemy found: Moving to pathnode");&lt;br /&gt;}&lt;br /&gt;LatentWhatToDoNext();&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;DefaultProperties&lt;br /&gt;{&lt;br /&gt;bIsPlayer=false&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265778554141669292-5751441070056556078?l=otusandrupurt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://otusandrupurt.blogspot.com/feeds/5751441070056556078/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://otusandrupurt.blogspot.com/2010/02/otus-and-rupurtbotuc.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265778554141669292/posts/default/5751441070056556078'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265778554141669292/posts/default/5751441070056556078'/><link rel='alternate' type='text/html' href='http://otusandrupurt.blogspot.com/2010/02/otus-and-rupurtbotuc.html' title='Otus and the RupurtBot.uc'/><author><name>Jacob Schieck</name><uri>http://www.blogger.com/profile/04562687762228940994</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265778554141669292.post-6297123237999890651</id><published>2010-02-01T21:19:00.007-05:00</published><updated>2010-02-10T23:00:01.913-05:00</updated><title type='text'>Progress so far...</title><content type='html'>So since I decided to start this blog a little late, I've already accomplished a lot when it comes to basic gameplay. Here's a quick run-down of what I've got (keeping in mind I'm learning UnrealScript as I go so programming is a little slow.&lt;br /&gt;&lt;br /&gt;Basic features:&lt;br /&gt;- Isometric RPG style camera.&lt;br /&gt;- Player controller for Otus completed (click to move).&lt;br /&gt;- Inventory system set up for creating items and storing them.&lt;br /&gt;- Game saves and character stats.&lt;br /&gt;- Basic HUD with health and energy bars implemented.&lt;br /&gt;- Basic AI for Rupurt so he chases Otus around.&lt;br /&gt;- Rupurt and Otus models completed and rigged in Maya.&lt;br /&gt;- Rupurt implemented and running around like the crazy cat he is :)&lt;br /&gt;&lt;br /&gt;Again a majority of this stuff is taken from people who have much more experience with UnrealScript and I wouldn't be able to make any progress without the platform built by them. So thanks to &lt;a href="http://www.hourences.com/"&gt;Hourences&lt;/a&gt;, &lt;a href="http://www.psyonix.com/games.html"&gt;The Whizzle Team&lt;/a&gt;, &lt;a href="http://udn.epicgames.com/Three/DevelopmentKitHome.html"&gt;UDN people&lt;/a&gt;, &lt;a href="http://forums.epicgames.com/"&gt;Epic forums community&lt;/a&gt;, Mike Milano for the Otus and Rupurt models, and  Christian Roy at &lt;a href="http://x9productions.com/"&gt;http://x9productions.com/&lt;/a&gt; for getting me started.&lt;br /&gt;&lt;br /&gt;I plan on finishing Otus tonight and maybe even get him running around in the engine!&lt;br /&gt;Here's a little video of progress so far:&lt;br /&gt;&lt;br /&gt;&lt;object width="415" height="345" class="BLOG_video_class" id="BLOG_video-2ba97c1e28227e96" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"&gt;&lt;param name="movie" value="http://www.youtube.com/get_player"&gt;&lt;param name="bgcolor" value="#FFFFFF"&gt;&lt;param name="allowfullscreen" value="true"&gt;&lt;param name="flashvars" value="flvurl=http://v6.nonxt7.googlevideo.com/videoplayback?id%3D2ba97c1e28227e96%26itag%3D5%26app%3Dblogger%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1331394132%26sparams%3Did,itag,ip,ipbits,expire%26signature%3D696FC27EC8FE95E31B25BF649CCB95EBF12D0880.638A492A2767A450A99E8CBA294529A9CA4CACA1%26key%3Dck1&amp;amp;iurl=http://video.google.com/ThumbnailServer2?app%3Dblogger%26contentid%3D2ba97c1e28227e96%26offsetms%3D5000%26itag%3Dw160%26sigh%3DSNUOd3wU2MySqfzgI8dl8FnnYyo&amp;amp;autoplay=0&amp;amp;ps=blogger"&gt;&lt;embed src="http://www.youtube.com/get_player" type="application/x-shockwave-flash"width="415" height="345" bgcolor="#FFFFFF"flashvars="flvurl=http://v6.nonxt7.googlevideo.com/videoplayback?id%3D2ba97c1e28227e96%26itag%3D5%26app%3Dblogger%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1331394132%26sparams%3Did,itag,ip,ipbits,expire%26signature%3D696FC27EC8FE95E31B25BF649CCB95EBF12D0880.638A492A2767A450A99E8CBA294529A9CA4CACA1%26key%3Dck1&amp;iurl=http://video.google.com/ThumbnailServer2?app%3Dblogger%26contentid%3D2ba97c1e28227e96%26offsetms%3D5000%26itag%3Dw160%26sigh%3DSNUOd3wU2MySqfzgI8dl8FnnYyo&amp;autoplay=0&amp;ps=blogger"allowFullScreen="true" /&gt;&lt;/object&gt;&lt;br /&gt;&lt;a href="http://jacobschieck.com/files/UDK2010-01-28%2023-29-31-67.mov"&gt;VIEW HIGH RES&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Cheers!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265778554141669292-6297123237999890651?l=otusandrupurt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://otusandrupurt.blogspot.com/feeds/6297123237999890651/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://otusandrupurt.blogspot.com/2010/02/progress-so-far.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265778554141669292/posts/default/6297123237999890651'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265778554141669292/posts/default/6297123237999890651'/><link rel='alternate' type='text/html' href='http://otusandrupurt.blogspot.com/2010/02/progress-so-far.html' title='Progress so far...'/><author><name>Jacob Schieck</name><uri>http://www.blogger.com/profile/04562687762228940994</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265778554141669292.post-5385819259645652451</id><published>2010-02-01T21:11:00.003-05:00</published><updated>2010-02-01T22:54:44.551-05:00</updated><title type='text'>Otus &amp; Rupurt</title><content type='html'>Hi everyone! My name is Jacob Schieck and I'm developing a completely new game using Epic Games UDK (Unreal Development Kit) entitled Otus &amp;amp; Rupurt. This is the progress blog of my work and new stuff (tutorials, screenshots, whatever!) As I implement them into my game :) So come along for the ride and hopefully you'll have as much fun learning and hopefully playing as I will!&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_swUKWbO6F1Q/S2eh9x1d0UI/AAAAAAAAAJ4/Gtk5NA9zbDQ/s1600-h/otusandrupurtnew.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 266px;" src="http://2.bp.blogspot.com/_swUKWbO6F1Q/S2eh9x1d0UI/AAAAAAAAAJ4/Gtk5NA9zbDQ/s400/otusandrupurtnew.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5433489558167474498" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265778554141669292-5385819259645652451?l=otusandrupurt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://otusandrupurt.blogspot.com/feeds/5385819259645652451/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://otusandrupurt.blogspot.com/2010/02/otus-rupurt.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265778554141669292/posts/default/5385819259645652451'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265778554141669292/posts/default/5385819259645652451'/><link rel='alternate' type='text/html' href='http://otusandrupurt.blogspot.com/2010/02/otus-rupurt.html' title='Otus &amp; Rupurt'/><author><name>Jacob Schieck</name><uri>http://www.blogger.com/profile/04562687762228940994</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_swUKWbO6F1Q/S2eh9x1d0UI/AAAAAAAAAJ4/Gtk5NA9zbDQ/s72-c/otusandrupurtnew.png' height='72' width='72'/><thr:total>0</thr:total></entry></feed>
