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

Post

Week of January 13, 2013

#1
Sunday, January 13, 2013

Summary

A much slower day than I would have liked, but, then again, Sundays usually are. After all this low-level madness, I'm finally back to trying to crack the interface. Today I made very little code progress, once again because I have failed to find the right architecture for an elegant interface. Granted, I'm shooting a bit higher than the average game. Most games build a UI engine, arrange the UI elements to make specific menus for specific purposes, and leave it at that. I am trying to construct a system in which the UI builds and manages itself directly from the information that I wish for it to convey or acquire...so it's significantly more complex, but also more powerful (and will take a lot less code to build interfaces if it works).

Thankfully, I developed a substantial amount of theory today concerning the right approach to this new interface, and am getting very close to what I think will be a sizable breakthrough. I may be in a position to implement it tomorrow, if I can finish working all the kinks out of the theory tonight.

Sorry...I really hate having to report little progress, but it's this kind of heavy-duty thinking-before-coding that can really pay off in the long run!

PS ~ Keep in mind that "thinking" hours, spent with my pen and notebook, are, sadly, not logged by my time tracking software :|

Hour Tally

Coding: 3.82
Internet: 3.47
Testing: 1.06
Total Logged Time: 8.36
“Whether you think you can, or you think you can't--you're right.” ~ Henry Ford
Post

Re: Week of January 13, 2013

#2
Monday, January 14, 2013

Summary

A moderate day. I pushed forward on the interface, started implementing my ideas and they're looking pretty promising. The part I'm working on right now is a replacement for what I called the "tactical interface" in tech demo #3. The new version uses the new UI system, so it's much sleeker. But the more important thing is that it's automatically linked to the entity component system, and it generates the options automatically, rather than me specifying them (like I did for the tech demo). This is a really a cool system! For example, if an object has an "Orientation" component (this means a spatial location, rotation information, etc...i.e., the object has a physical location), then the menu will include the option "Go To," because that action makes sense for anything that has a spatial orientation. For objects with a motion component, the menu includes "Follow," because it makes sense to follow something that's moving. For objects that have an integrity component (generalized health, shields, etc), the menu includes "Attack," because it makes sense to attack something that has health/shields (although, I did say that you would be able to attack asteroids...and asteroids have no integrity...so I'm going to have to hack that one :P ). In all, I really like this system conceptually, and I think it's going to pay off in the long run.

I would say that it was a boring day, but then, a few hours ago, I decided to take a break from all this interface nonsense and work on something more fun: the procedural nebula generator, since I haven't touched it in a while. Amazingly, I hit an awesome streak of luck, and was able to dramatically improve the quality of nebulae! So much so, in fact, that I was in a state of exhilaration for quite a while. I've been working forever to try to generate good nebulae, and I think I've finally done it! They're still not perfect, but man, they are so much better than any of my previous attempts. They really make for some beautiful eye candy while flying around :) To read more and see pictures, check my personal dev blog.

So it ended up not being a boring day after all! Chipping away at this interface work is...meh...but having a breakthrough in procedural nebulae? That's more like it!!! :D

Oh, also started a new piece today, which I think will be another keeper :)

Hour Tally

Coding: 5.80
Composing: 1.07
Internet: 2.17
Testing: 2.00
Total Logged Time: 11.04
“Whether you think you can, or you think you can't--you're right.” ~ Henry Ford
Post

Re: Week of January 13, 2013

#3
Tuesday, January 15, 2013

Summary

Shields!! :D Did shields pretty much all day today. Great fun...I love working on graphics things :) They're pretty much fully-implemented now, and I'm pleased with the effect. I've decided to go for quite a minimalistic graphical effect. You can't see the shield unless it's being activated by bombardment. This means that you'll need to either scan a ship or attack it to know whether or not it's shielded...but I imagine that it will be very easy to obtain the scan information for most shields at short range (in fact, it should usually be automatic when you target the ship). Still, it means that if, for some reason, you can't get a reading on the shield...you won't know until you strike, which could be a very bad thing if you aren't familiar with your enemies ;)

When the shield gets hit, it emits a bright flash of light that flows outward in a sinusoidal pattern, along the curves of the shield shape (which is loosely fitted to the ship), to convey the appearance of energy being dissipated into the shield. It's quite short, both for technical reasons, but also because it looks cool - just little sparks of light dancing around the ship as you fire upon it. I'm thinking the appearance of this flash and the pattern that radiates from it will vary based on the type of shield. That way, if you can't get exact scan information, a few shots will reveal to the keen-eyed pilot exactly what they're up against. For example, some shields might radiate in a circular pattern, while others might radiate in a sharp rectangular pattern, and perhaps this has to do with the underlying dissipation technology, which affects how well it dissipates certain types of energy.

So that was fun! What wasn't fun, of course, was getting back to the UI work. I'll tell you what...it's very difficult making a programmer's interface that doesn't look like a programmer's interface. I guess that's why we don't really see them often...it's usually an artist's interface or a programmer's interface. :|

On another bright side, I'm definitely getting better at building a nice space atmosphere for the music. If I keep working in an hour of learning each day, maybe I'll succeed with the soundtrack after all!

Hour Tally

Coding: 7.06
Composing: 1.36
Internet: 1.53
Testing: 1.88
Total Logged Time: 11.83
“Whether you think you can, or you think you can't--you're right.” ~ Henry Ford
Post

Re: Week of January 13, 2013

#4
Wednesday, January 16, 2012

Summary

YES!!! Finally nailed the interface :D I was lucky enough to get a rush of inspiration today that led me to a compromise between the old interface and my grand new plans. The result is pretty beautiful, at least I think. It's fairly dynamic and fluid, but not quite as dynamic as I was planning. But I was just having too much trouble figuring out how to organize things without imposing any kind of structure (which was basically what my last attempt was). Now, there's some structure, but it's not overwhelming, and I still think it feels very natural and non-programmer-ish. Awesome!!! Behind-the-scenes, it's super-easy to build stuff with this system, so I'm going to be a happy camper when it comes time to design all those interfaces.

I finished a lot of the groundwork today, completing many of the basic widget types. Naturally, I spent a long, long time tweaking the aesthetics, and am pleased with the result. As always, it's not perfect, but I like it a lot. One thing I'm really looking forward to is making some unconventional widget types. Sure, Scaleform looks better than my interface...but since I'm both LT's interface designer as well as the rendering engine programmer, I've got access to a bit more power than the average interface artist :) For example...in-menu 3D positioning widget? That'd be cool, maybe for quickly specifying formations or approach vectors. And seamlessly integrating renderings of objects and other things into the interface...these are all things that will be super easy but could look really cool. I can't wait to try :geek: OH! And graphs. I want to make a graph widget. What for? Who knows. Monitoring the economy of a planet? Dunno. But there's so much potential to make graphs look fancy...!

For now, I've been testing the UI in isolation, so tomorrow, if I finish the groundwork, I'll start building the strategic interface. The reason I keep hesitating to do so is that I want to be sure that the UI is near-finalized before I start building with it. UIs are notoriously-painful to change once systems are developed with them (because there's just so darn much code that expects them to behave a certain way), so it would be quite counterproductive if I launched into building every interface under the sun before having the underlying engine really solidified. This is the reason that you've seen so little interface in the demos so far: I've intentionally held off on building them, because I knew that it would be subject to too much change to make it a worthwhile endeavor.

PS ~ If you happen to notice, I'll be editing the "Testing" numbers for this week (the ones that have already been posted), because I realized today that I had forgotten to tell the time tracker about one of the test builds that I use, so I was getting ripped off slightly on previous hour logs. I am now getting reimbursed!

PPS ~ I'm going to attempt radically changing my sleep schedule over the next few weeks (for enhanced productivity), so it might impact my hours for a few days...we'll see. Hopefully not.

Hour Tally

Coding: 7.69
Composing: 0.00
Internet: 3.27
Testing: 2.50
Total Logged Time: 13.46
“Whether you think you can, or you think you can't--you're right.” ~ Henry Ford
Post

Re: Week of January 13, 2013

#5
Thursday, January 17, 2013

Summary

Another slightly-less-than-exciting day, thanks to interfaces. I'm sure everyone's tired of hearing that by now (I know I am) :P But like the old saying says...you can't put a price on being able to manage your space empire in a slick, intuitive fashion. Ok, maybe that's not an old saying, but it should be.

So my time today was spent tweaking the UI aesthetics, building new widgets, and streamlining the existing code to make sure that everything is extremely solid and ready for use by other subsystems. I already replaced a few of my little debug menus with the new UI, and let me tell you...toggling fog has never been so exciting :D I also spent plenty of time staring blankly at other game interfaces, trying to figure out what makes them so beautiful (I'm looking at you, Battlefield 3 ...).

It sure feels like the interface is just a black hole that ruthlessly consumes my hours. I definitely am getting frequent urges to split my time and go work on something more fun, like faction AI or planets or something. But then I remember that the prototype needs to come out ASAP, and the UI is going to be a big part of that, since fleet command will be in. So I just suck it up and keep feeding the black hole. I hope I get a bit more bang for my buck with tomorrow's hours :|

Hour Tally

Coding: 6.40
Composing: 1.05
Internet: 2.84
Testing: 1.48
Total Logged Time: 11.77
“Whether you think you can, or you think you can't--you're right.” ~ Henry Ford
Post

Re: Week of January 13, 2013

#6
Friday, January 18, 2013

Summary

Surely enough, I did manage to get more bang for my buck in terms of hours today :) I worked on both AI as well as the interface (again). They're intimately related, obviously, since I'm trying to implement an interface for bossing your ships around.

In the past, I've talked at length about high-level AI versus low-level AI, and have generally made a very strong distinction between the two. Today, you'll notice that I just worked on "AI," not HLAI or LLAI...and yes, this minor issue of semantics was actually another moderately-sized breakthrough for me. They're the same thing. Ok, maybe at this point you'll write me off as stupid and say it doesn't matter what you call it, it's an issue of semantics. But I think it's more than that. Previously, I really, deeply believed in separation of low-level and high-level AI. Maybe I even managed to convince readers of it. I believed very strongly that the mind does one thing, and the body does another. The mind makes a plan, reasons about the world, evaluates consequences, goals, values, and so on. And then the body is this boring thing that just carries out orders that the mind has constructed (biologists can protest this remark in the off-topic section if they so desire..). That was the reasoning that led me to a strong separation. So strong, in fact, that the two systems were separated at the highest level possible in my engine: different directories in the source tree.

And then, today, I realized how absolutely inconvenient I was making things. Information was getting laboriously translated through the wall between LLAI and HLAI, solely for the purpose of allowing the two to speak freely, which, indeed, suggests that they should never have been separated in the first place. That's when I started to realize that they shouldn't be separate. The mind constructs a plan, but in doing so, it careful considers the body that will implement its plan. The plan and that which will carry out the plan are intimately related! Only with great pain can they be separated. But it goes the other way as well: the body does not receive a plan from the mind and carry it out. No, the body must be given the plan in excruciating detail (discrete electrical signals) to carry it out. So the mind is really the one implementing the plan as well as constructing it (duh). But, it's important to realize that, at every level of granularity, the construction of the plan refers back to the level before it. It is not realistic to say that one constructs a neat and tidy plan at the high level, then hands it to the next level, which converts it to the next form, and so on, until we have a set of electrical signals (aka thruster impulse vectors in-game). Every level is constantly querying higher levels to make sure that the plan is being implemented correctly. Why? Because the plan must be responsive. It must adapt to external factors, and we must constantly make sure that we're carrying it out correctly. We can't just queue up a day's worth of electrical signals and then expect to execute them to get the desired effect. And that's why low-level and high-level cannot be separate. The high-level generates the low-level, yes, but the low-level must be in constant communication with the high-level in order to understand what is to be achieved. In this sense, it is just one big process. AI. Not HLAI, not LLAI. Just AI. And that, my friends, is simple and clean. (...subtle Kingdom Hearts reference?!?)

Sorry, that digression really did have to do with game programming, I promise. So I spent a lot of today mutilating yet another system in search of simplicity. And I found it :geek: Thanks to that, the command interface is a lot closer to functioning.

So, excuse me for not seeing that AI should be unified in the first place. My bad. Now I know. One step closer to sentient computers.

Hour Tally

Coding: 5.40
Composing: 0.47
Internet: 4.53
Testing: 1.84
Total Logged Time: 12.24
“Whether you think you can, or you think you can't--you're right.” ~ Henry Ford
Post

Re: Week of January 13, 2013

#7
Saturday, January 19, 2013

Summary

Great day, much more fun that the previous few days! Finally got to start pulling the UI, AI, and other things ending in I together!

The strategic interface is functional. It understands how to create and populate menus with actions based on the object that's selected. Essentially, the job of populating actions is handed down to the component system, as described in an earlier log. These menus are then populated with the configuration menus for each action. Each action has its own "editor," so-to-speak, which it exposes to control its parameters. So the job of building the option menus is handed down to the actions themselves. This general strategy of handing work down to the lowest level is something that I've come to appreciate immensely over the course of development. In general, handing the work down to the lowest possible subsystem is a beautiful solution to many problems. It doesn't take much thought to realize why: at the low level, dependencies are clean, minimal, and visible. When you see a component returning a list of actions, it's all too clear what the component is doing. Furthermore, you can clearly see that the component is doing so independent of any other factors - other entities, other components, etc. If all of this logic were to happen at the top level, in, say, the code that builds the context menu for an entity, then you would see a steaming pile of else-ifs, conditional branching, etc. All of the components would be manipulated right there, from that single area of code. It would look significantly more complicated than it really is! Why handle logic at a level where greater dependencies are involved, when it can be cleanly handled in an isolated level? I've come to absolutely love this technique, and use it wherever possible. So the strategic interface basically populates itself - from the list of actions, to the action configurations, to (in the future) entity information.

With that in place, I'm in good shape to give orders to my units! I re-introduced the attack option today, and used it to pick a few fights. I also had some fun with improving the follow command, and giving the AI a concept of "lead time" and velocity calculations when following an object. By playing with this, I was finally able to implement real formation flying - the kind where you actually see your wingmen beside you, matching your heading but maintaining a suitable distance so as not to collide. By changing the lead time slider, you can tell your ships to hang back or to fly ahead of you. I particularly like the latter, as it feels very neat having your ships try to predict where you're going and fly in front of you. Definitely feels like an "epic" way to charge into battle - with your wingmen creating a shield in front of you! I exploited this particular feature a bit to test collision avoidance while I was at it - attempting to ram my shield of wingmen into large asteroids. Most of them survived :roll: The avoidance mechanism is quite good, but there are still failures every now and then that, realistically, would result in a kaboom. I'm going to have to improve avoidance or hack collisions so that they have more mercy on blind AI pilots. Despite my pilots' rather haphazard flying abilites, I definitely felt a moment of excitement when I was flying through that asteroid field with them surrounding me. This game is coming together nicely, and it's always comforting to know that it still gives me those rushes of excitement :)

The interface is also looking better every day. I'm almost satisfied with it. If you remember the interface that was showed sporadically in the KS video...this one is way better.

Hour Tally

Coding: 7.02
Composing: 0.26
Internet: 2.60
Testing: 2.07
Total Logged Time: 11.94
“Whether you think you can, or you think you can't--you're right.” ~ Henry Ford
Post

Re: Week of January 13, 2013

#8
Week Summary

General Sentiment

It didn't feel like a huge week, but, then again, nothing could feel like a huge week after what happened last week (which was just insane). Still, the hours are there, and it's clear that I worked just as long and hard this week as I did last. So I suppose the apparent lower yield is just another testimony to how incredibly time-consuming it was to nail down this new interface that I've been working on. Thankfully, we're through the thick of it, and I'm more than happy to put that thing to rest and move on with my life. Nonetheless, I won't deny that it was worth the toil. Navigating menus is now...well, it's downright fun. You may think otherwise :roll: But I find it really compelling.

Also, it turns out that hitting the [11/1/minimal] split on [code/internet/testing] is proving...extremely difficult. Even though I feel like I'm just waking up, coding, eating lunch, coding, eating dinner, coding, sleeping, and repeating...those moments of launching the game to test a feature, or of participating in the forums, or checking stackoverflow...they add up, a lot more than I was expecting. To be honest, I'm not sure how much leaner I can get with my time, but I'm still going to try! (Although, on this post + today's dev log alone, I've already spent 40 minutes...maybe I should be more brief! But I just like talking about coding so darn much.. :| )

Major Accomplishments
  • Implemented shields in the game, including logic and graphical effects
  • Overhauled interface yet again, this time with great success
  • Re-implemented several of the existing interfaces with the new system, again, with great success
  • Drastically improved procedural nebula generation
  • Unified high-level and low-level AI
  • Brought the strategic menu to a working state
  • Started 3 new compositions, all of which I believe to be keepers
Combined Hour Tally

Coding: 43.19
Composing: 4.21
Internet: 20.40
Testing: 12.83
Total Logged Time: 80.64
“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 7 guests

cron