The Spatials V3 devblog 2015-11-02
Internal development notes, very slightly cleaned up and commented a week later.
TL;DR: more code cleanups, some systems for of planet resource extraction are now implemented (resource nodes, extraction objects, simplified logistics, automatic ship cargo transfers), the UI color can now be customized, and fixing a bad programming pattern before it is too late.
- another massive removal / commenting commit
Surface, Skill, Avatar, Agent*, Mission are out, plus minor related stuff
and their UIs
Another week, another huge amount of code deleted from V2. This is the biggest one, and it affected very core areas of V2, including the entire model for map surfaces, the skill and combat system, and the AI for anything that moved on screen. Part of those tasks are already being handled by new V3 code, and the missing ones, like the skills and combat, need to be rewritten anyway to use the ECS framework in V3.
- resource extraction
an in-world system counts nodes within extractor range
model in scheme side for Body
key based on X-Y, data contains resource, room for more
another system persists some entities (extractors for now) into model
key based on X-Y, data contains a hint in the planet-persist-component
obj model has the hint, reverse map built during gen
- filter by the correct resource kind in planet-resource-system-post-processSystem
add to extractor obj model
also add radius
- resource tick generation
model for resource gathering, in scheme
c++ Body::tick does hook call
each tick increases the (body 'stock) resource -> amount map prop to the amount of covered resource nodes
logic is out of ECS, works without ECS sim
hardcode speed and max capacity for now, will depend on more constructions later on
- resource+ship galaxy logistics
model for galaxy+ship resource transfer logistics
need model ship inventory of some sort
- fix: resource list in ship view makes following UI disappear
as usual, no intrisic sizing
add support for parent widgets inheriting explicit sizing from their children
use -1 for width or height
- try to re-enable resource filter for galaxy view
scheme re-populates C++ side data when needed
- planet: logistics mini system for extractors
pallet-like object
adds to global planet capacity, not per-extractor
extractors also provide a small capacity
The big task of the last week was to start the new resource gathering system. Just like in V2 resources are gathered from planets. But in V3 those resources are represented by node objects on the surface of the planet, instead of abstract icons in the galaxy planet window. Your officers must now build resource extractors: automatic machines that slowly extract resources from nearby resource nodes. Here’s an anotated video on how it works:
For starters the resource system from V2 has been ported to V3, and each resource has been assigned a few categories, to be matched by the correct extractors (fluid, biological, mineral). The model and systems to support this new gameplay were implemented, as well as new V3 concept: being able to build persistent structures on planets, that will still be here if you land on them again in the future (unless a pirate decided he didn’t like them, of course).
Some basic code for planet and ship logistics is now place. For now logistics in planets are meant to be simplified. Only pallets have to be built, which increase an abstract inventory capacity stat in the planet (similar to how the V2 station warehouse worked). Ships will also have limited cargo capacity, but for now there are no gameplay systems in place for it.
- make UI colors re-definable
- options section for UI colors
store in options model
The GUI subsystem was already fully based on symbolic colors for most of the user interface, so it was easy to fix the few hardcoded values and make it possible for the user to pick a different color for the UI.
- fix now before it's too late: way too much model lazy initialization is creeping into scheme code
body stocks, storage, persists
ship stocks
find a pattern for init and use it
constructor-like on ::create: NO, it will be stomped by deserialization, which overrides the hasthable as a whole
manual init on ::init: deserialization wont affect it, but NO: it's not forward compatible like C++ constructors, will still need defensive programming
constructor-like but passing current value: much better since it allows merge, but still difficult to find the right moment in deserialization
try call on Registry::create -> BridgeCPPOwned::unserialize
try call on Persisting::afterLoad -> BridgeCPPOwned::unserialize
then stop doing so much defensive (and predicate ...) and (or assumed-accesor default)
Dynamically typed programming languages like Scheme make it very easy and fast to model your data as you go. While this is good for iterating fast over a feature, it can lead to brittle code. A usual anti-pattern is to include guards before you access some bit of state that may or may be not be there:
(display (or (table member:) "default"))
This will print default
when member:
is not a key in table
. While this may fine for user provided data (a config file, a file downloaded from a third party, the input from a UI control), accessing fully internal data and structures like this is a very strong indicator of the code being in a bad shape.
A constructor-like pattern was implemented for the Scheme-side dictionary that C++ objects provide. This way, when a C++ object is created, there’s a chance for a Scheme-side proc to also initialize its dictionary.