Return to “[Archived] Daily Dev Logs, 2012 - 2015”

Re: Week of August 24, 2014

Tuesday, August 26, 2014

Woooohooooo!! Hi :) :wave: Miss me? :D

The Vacation

What a two weeks! I knew it would be good, but I couldn't have realized just how much this was what the doctor ordered. It was fantastic. For two weeks, I let the tension of two years of continuous pressure and expectation wash away from my neural circuitry. Every day I felt more and more stress being exhumed and exhaled from deep within me. It was glorious.

Many times during those two weeks I felt the compulsive urge to do something productive. I felt a sudden pang of guilt for not making some massive conceptual breakthrough, for not sitting down and banging out a piece of code that would change LT forever, for not hopping on the forums and posting some grand anthology of gameplay gems or technical wizardry. But each time, I stifled the thought. I reminded myself that this was the entire point: to get away from that constant feeling of "I need to make something happen now." To get away from the constant cycle of "I need to make today's devlog impressive" / "I need to make this month's update impressive" / "I need to make LT impressive." After two years, that pressure and expectation had become so deeply ingrained in my thought processes that I felt it hard to leave behind. But I did so, and I think it's done wonders for my mental state. I didn't touch LT for two weeks. No theory, no code. A complete detox. And now that I'm back, I feel better than ever about approaching work again. I've let go of the pressure and expectation, and can once again look at LT as I did in the beginning: as my love, my baby, my dream. I can once more let my passion take me over and guide my hand in the code, rather than let the pressure of delivery force my hand into making sub-optimal management decisions. It was honestly a very, very good move to get away for two weeks.

As for the actual vacation, I'll just tell you that I enjoyed it more than any vacation I've ever taken before. Eating, sleeping, seeing new places, and spending time with fantastic new people. I still won't divulge where I went, but I'll say that it's 12 hours timezone difference from here. So that should narrow it down a bit :) At least you can determine on which continent I was... :)

Now listen, to be completely honest, I did do a bit of work on the flight over. I was bored and it was a long flight :oops: I resumed my LTSL->C++ conversion work, because it's fun and exciting to me right now. I made huge progress and have already got some almost-functional C++ modules coming out of LT scripts. As I mentioned before, I don't think that's going to play a big role in LT 1.0. But for my future work, I anticipate that it will be a game changer. I don't ever want to write a full application in C++ again. Once I've got a solid pipeline for conversion from my own custom language to C++, I won't ever have to. That day is rapidly approaching :)

The Return

Not surprisingly, the 26th consisted of a good deal of unpacking and jet lag-induced sleep. Nonetheless, I was still able to steal plenty of hours for work. Upon returning, one of the first things I did was launch the game. I knew it would be a neat experience - having not seen LT for two weeks - but I didn't realize how hard it would hit me. Just flying around a system was a near-euphoric experience (at least for 30 minutes or so). There can be no doubt that I have lost nearly all objective perspective on the game - seeing it all day everyday. But taking a 2-week break and then seeing it for the first time...I was overcome with happiness and pride. It's such a beautiful game. I love it. I love the universe. I love the way my ship handles. I love the sleek interface. I love the scale and the grandeur. I love the knowledge that everything is generated by the computer. I love my game! I really never would have imagined that it could come so far. It makes me so excited excited to know what it can become. With more hours, with the help of rapid iteration in LTSL, with some more deep conceptual can become everything and anything. Freelancer, EVE, Homeworld...scripts could make it any of those (but procedural!)

Needless to say, the sadness of vacation ending has been quickly washed away by the excitement of the rest of the year of LT development. I'm refreshed, I'm inspired, and I'm completely hyped for what my game will become.

As for today's work, I looked carefully at the things that are blocking me from that massive content sprint of which I keep speaking. Realistically, I still face some blockages. There is only one thing to do: tear them down as quickly as possible, while simultaneously attempting to sprint in all directions. Remove every stray pebble from the road before we race down it at 300mph. I started looking at writing the entire HUD in script so that I can iterate quickly and finally hammer down those HUD widgets that have been bugging us all for eternity. When the pebbles are gone, the LTSL will look twice as elegant as the C++ version. But that's not even the point: the point is the fast iteration. Anyway, here's what happened today:
  • Exposed ALL UI nodes to LTSL
  • Implemented direct field access in LTSL
  • Implemented object component access in LTSL
  • Implemented automatic type printing support in LTSL (easy debugging!)
  • Exposed universe creation to LTSL
The last one is a bit interesting. I would like to move towards a world in which the main LT executable is simply a script invocation. From the script, I would then create the interface, display the main menu, etc. Again, rapid iteration + scripting flexibility. Modders could essentially change the entire game. The LT executable would be little more than an execution environment for the game's script.


The road ahead is no longer frightening or daunting. It's exciting. It beckons me ever closer to the finish line. True, I wish I could turn back time. I wish I had another two years, simply because every month brings so much more raw power and potential to the game. But I don't. That's OK - we all know that LT 1.0 won't be the end. It's time to look toward the finish line, accept what will and won't be there, and cross it.

Many long days of code ahead. Pack some snacks :geek:


PS ~ Hope you all didn't suffer too much without your devlog fix :lol: It's back!
“Whether you think you can, or you think you can't--you're right.” ~ Henry Ford

Re: Week of August 24, 2014

Wednesday, August 27, 2014

Wow, it feels good to be back! Gotta admit, missed that feeling of code flowing :)

Full Script Objects for Nodes & Tasks (and Objects soon!)

Today I made a big step forward in the LTSL world as I continue pushing my content creation abilities (I really wanted to get rapid interface work rolling!) As of today, I have the ability to define entire custom objects, including member functions, in script. I can then plug those objects into the game engine and use them in place of hard-coded versions of those objects. There's a subtle but important distinction between this and what I showed last month when creating my 'custom' UI.

Previously, I quickly injected some custom UI capabilities into the engine by creating a function Node_Custom that took a name, icon, etc. The engine then internally created a node, stored the name / icon / children data, and used it as part of the UI. But that's limited in that it only allows me to specify custom node data. You see, the real power of the nodal UI is that it is not about just data: it's about function. Every node can have its own code to draw, expand children, run code, etc. To actually use that capability, we need to allow the script itself to define a new node type along with all of the functions. Today I have finally been able to do just that!

The result is that I can now create fully-custom UI nodes that actually execute code to draw themselves, dynamically list their child nodes, update their states, etc. This means that we can now do way more than just create some cool procedural icon nodes. It means that we can write things like the HUD, the commodity graph, the scanner, etc. in script. Real, meaty UI nodes. But nodes are just one example of the application of full script objects to the game. The work carries over to every other type of object that could be scripted. For example, we could now create full-blown custom Tasks that include scripted AI behavior code, scripted dynamic input/output listing, scripted LOD updates, etc. Everything that the engine could do. I don't yet have the engine set up with a fully-scripted custom game object, but the exact same principle can apply there.

I'll be honest in admitting that this task required some more time spent on technical work. In particular, the inclusion of member functions conveniences took quite some work. Nonetheless, it's one more piece of the fast-iteration puzzle that's done now, and I feel very good that we'll be seeing a lot of rapid UI work momentarily.


In terms of this month's update, I'm really hoping to have enough to show. I'm honestly convinced that if I can just get this rapid iteration going, I'll be able to. A lot of what lacks in the gameplay department is honestly just an inability to interact with components of the game that already exist in code (due to a lack of UI). Trading, hardpoint management, fast fleet orders, etc etc....all of this already exists in game logic, but without a solid player-side UI to expose it, we can't really see the gameplay. I've always said that player-side UI was one of the last things that I would focus on, first because I view it more as content, and second because it depends so heavily on the underlying mechanics (and is therefore subject to change if the underlying mechanics change). But with most of the mechanics solidified and a platform for rapid UI content iteration in place, it's definitely time to start gamifying this game :geek:

PS ~ Changed my desktop wallpaper to a rotation of Freelancer screenshots today. Very inspirational :geek: :lol:
“Whether you think you can, or you think you can't--you're right.” ~ Henry Ford

Re: Week of August 24, 2014

Thursday, August 28, 2014

Short log today: I'm in the zone and I can't stop. The rapid iteration is addictive. Watching the UI bow to the strokes of the keyboard in real-time. Watching the HUD evolve into what I want it to be so much more quickly than before. Watching the nodes, the glyphs, the text re-arranging themselves every few seconds as I bring them closer to what I see in my mind. It's beautiful, euphoric even. It's a new level of development, so much faster and more exciting than before. I'm in love again :geek:

Today, I simply continued to explore the ramifications of last month's, this month's, and yesterday's work. All of the elements are falling into place and I can feel the flow, the power. The barrier between mind and implementation is so low now, I feel as though I'm directly injecting my ideas into the game. I don't have to wait for Clang/GCC. I don't have to look at compiler errors as I try to remember awkward syntaxes. I just let chunks of natural LTSL flow directly from the mind and see them play out on-screen in an instant. I can hardly express the joy I feel :) I know now that I don't need years to build my dream game. I just need this - hours of rapid mutation.

I've already ditched the workspaces concept, at least as it applies to the main HUD, and moved to a HUD where everything is accessible from one screen (and I'm doing it in script, of course :) ). Scanner, cargo, player information, settings - it's all coming from the same place now. It feels so fast and natural!

I don't want to stop and describe all of the changes. You know what's happening and so do I. Just give me my hours :) There are still so many between now and update #20. A limitless world of functionality and content to build between now and then. I'm not so sure my feet are on the ground anymore - they're high in the skies of LT and LTSL.

Maybe tomorrow's log will be more concrete, more tangible. But I am in the sky.

“Whether you think you can, or you think you can't--you're right.” ~ Henry Ford

Re: Week of August 24, 2014

Friday, August 29, 2014

Not as powerful of a day as I was hoping for, mainly because I had to spend time debugging some of the interplay between custom node work and LTSL (and, in particular, the real-time recompilation / reloading of custom functions & types). It's pretty unusual for me to have to spend time debugging these days, but with the rawness of the script execution environment it's not surprising that I'm encountering some bugs of a caliber that I've grown unaccustomed to (at this point, the constructs that I use inside the LT engine are so stable that I'm totally out of the habit of debugging things like segfaults and memory corruption). Nonetheless, it hasn't put a damper on my excitement. Some hours spent ensuring a really solid execution engine for custom node work is a small price to pay for the amount of power that I'm getting. Every day I'm pushing further into new territory with respect to squeezing more out of the scripted node interface (and scripts in general).

The only thing that really bothers me is that this is the end of the month, and I'd rather be working on the final content push to have shinies for you all in August. Having two weeks cut out definitely hurt me, but the increase in motivation is still worth it. In light of my current situation, it's likely that I'll be taking one or two extra days again in August to push out the update. I've just got to keep my nose to the grindstone, and I know that we can make something great happen!!

Apologies for the lack of substance in this log. But I'd rather be honest and continue working through my problems at the moment than try to make something exciting happen right now for the sole purpose of an interesting devlog. That's one of the lessons that I took away from my introspective time during my vacation: much like I'm in the habit of trying to push a lot of 'visible' change in the last week of the month, I'm also in the habit now of trying to push a lot of 'noteworthy' change during the last few hours of the day, for the sole purpose of writing an 'exciting' devlog. I've got to let that go and let the natural development process take place. Some days are going to be filled with tangible, visible change, and other days aren't going to be. I've got to accept it :|

Anyway. I'm very pleased with the number of hours being put in ever since my return - I'm very much back to the every-moment-spent-on-LT mentality, and it's paying off. Just got to maintain this pace for another few months :)

Hoping for some visible goodies by tomorrow's log!! :geek:
“Whether you think you can, or you think you can't--you're right.” ~ Henry Ford

Re: Week of August 24, 2014

Saturday, August 30, 2014

Finally powered through those script execution bugs and moved onward with my UI and object scripts. The code is currently flowing at the standard end-of-month-sprint rate, and I'm happy to be a part of it :D Today's work saw me continuing to build a scripted HUD, playing with instantiating fleets and controlling their behavior in script (muahaha), and attaching strange, scripted particle emitters to wormholes solely for the sake of making things shiny. Throughout it all, I'm enjoying the power of a scripting engine that automatically reloads its code/data whenever it detects a change to the external script. As soon as I hit save, my changes show up in the game :shock: It's a pretty wonderful experience (even better than last month, when I had to hit a key to recompile scripts).

There's a lot happening, but, as usual, I'd like to talk about the parts of today's work that tickle my conceptual-elegance bone :geek:

Dynamic Extension of Object Functionality via Script Objects

One of the really cool things that comes out of the script object work that I completed the other day is that, instead of just running 'functions' on a game object in order to extend its functionality, I now attach entire 'script objects' to the game object. Those objects have their own internal (persistent) data that can be used to extend functionality. Even more importantly, those objects can define as many functions within them as they like, and the engine can dynamically bind those functions to certain parts of the game object's logic. This is an awesome paradigm shift!

For example, suppose that I want to enhance the collision graphical effects in the game. I could create a script like this:

Code: Select all

type CollisionEnhancer
  field Object object
  function (OnCollide (Position contactPoint) (Object collider))
    // Add cool particle effects here
    if (< object.GetHealthFraction 0.1)
      // Add even cooler particle effects - we're almost dead!
    if (< collider.GetHealthFraction 0.1)
      // Add even cooler particle effects - they're almost dead!

function (CollisionEnhancer_Create (Object object))
  var self CollisionEnhancer
  = self.object object
And then add this script object to every ship object in the game during initialization:

Code: Select all

function (Ship_Init (Object self))
  self.AddScriptObject (CollisionEnhancer_Create self)
The result would be that the engine would take the CollisionEnhancer object, poke and prod the member functions to recognize that the object has an OnCollide function that should be bound to the game object's collision handling logic, and then inject it in the corresponding location.

We can, in this manner, extend any piece of an object's functionality with absurd ease, and the engine can perform dynamic binding simply by using the type's member function table to determine where the logic should be run. The convenience of this paradigm is tremendous! Note that this is already the way that the custom UI nodes are working (by dynamically binding to specific script object functions).

It's easy to see how mods could linearly stack functionality. If every mod is given a chance to execute some code during the initialization of specific objects, then each mod can simply attach its own script object to the game objects of which it wants to modify the functionality. The engine dynamically determines how to attach the logic of those script objects as discussed above. It all feels very powerful :geek:


I've been feeling for the entirety of this month like I'm right on the edge of the content explosion. I keep feeling like I could take just one more step and then be there. But I always take that step, only to realize that I've only gone half the distance. Like Zeno's paradox, I'm constantly moving only half of the final distance closer to the content bomb. It's truly an elusive thing. At the end of today, I feel closer than ever before - but I guess I'm just going to have to keep saying that every day until I finally cross the finish line :crazy:

I'm going to go ahead and say that August's update will be 2 days late. I'm going to cross that line or die trying :lol:
“Whether you think you can, or you think you can't--you're right.” ~ Henry Ford

Online Now

Users browsing this forum: No registered users and 1 guest