The Spatials V3 devblog 2015-09-14

Internal development notes, very slightly cleaned up and commented a week later.

- fix colission...
    a chance now, by making sure it excludes the other mover (pathC)
    exhaustive tile-by-tile check of the entire bb helps, but still allowing stuck pos
    fix tile aabb calc for circle, fixed

V3 features a super simple physics system (anything that moves has a velocity vector and that's it), and with it also comes an (optional) super simple collision system. For now it is enabled for every entity that has a PhysicsComponent and doesn't have a PathComponent. This means an entity can be put "on rails" under demand and ignore collisions, which will be very useful later on for certain objects.

- fix path system
    handle nonwalkables while pathing
    quick isWalkable check with 0 phase
        new boundary checker in TMS with fast shortcut for small circle bounds

PathFindingSystem continues to be refined and optimized. A fast 4-sample shortcut was put in place for entities that have a small circular boundary, instead of doing a fully precise boundary-tile checking.

- unstuck system in collision
    to catch building an object over an nonpath ent for example
    stuck counter in phyC, since only phys movers can be stuck
    after 5 stuck ticks does a full map spiral search, warps when tile found

Another improvement to TileMapCollisionSystem adds checking for stuck entities. A "creative" user can, for example, plant a blueprint object on top of an walking entity and get it stuck under it. The system can now detect this situation and automatically warp the entity to a safe, nearby tile.

- test: doors that visually open/close when any matching entity croses
    remove wall door tiles
    then change existing doors to be objects
    DoorC/DoorS in c++ for max speed (phase 0 system)

Another small gameplay system, added at this point to test other systems. Like other phase 0 systems it was done in C++ for maximum efficiency (phase 0 systems run their logic on every entity they subscribe to for every frame, so they are usually done in C++. Scheme systems should be designed for gameplay that accepts a phase of at least 5, so they will check an entity every 0.5 seconds as a minimum).

- system: jobs and job seekers (C++)
    use references and childC, works well
        ref to subj ent, both for job ent and worker ent
        remove BusyC when subj is invalid
        implicit state for now
        abstract progress
            ticks progressed, logic on done/not done in other places
            optional max tick provided for jobs with a definite time
        desired pose for workers
        aspect for valid jobs
        seeking job beha for workers, if not busy find the closest matching job
        keep track of assigned worker (via busyC)
        increment progress if worker on job area and set pose
        try to path worker to job area if away
    interruption support? like being attacked, walking to job and slipping, etc ---> remove BusyC

The big one for the past week. V3 now has a generic collection of components and systems for performing V2-style jobs. This deals only with the basic mechanics: the existence of entities that are jobs, their current state, and act of looking for a job and pathing to it, and the act of staying in the work area until it completes. Notably missing are the spawners of those job entities and the code for dealing with the job results. In V3 this must be handled by separate systems, thereby making the base job system as generic as possible.

- move officer entity maker to scheme
- introduce a "finalizer" for officers inserted into the station, since some comps are now scheme-only
    will need to rethink this pattern in the future, tie into future job metadata model

Officer entity creation has been moved to Scheme to enable scripting it.

- system: object building (scheme)
    building must be under construction mode somehow
        tool add a construction-object-component w/o ent ref, picked up by sys later on
        tool apply tint/opa
        monitors all buildings with construction-object-component
        checks job ent to see if valid (could be suicided by floor destroy for example)
            it is created if needed
                it is children of building
                has construction-job-component plus everything else needed
                    4-side decide
        checks job ent to see if completed
            when completed removes job ent, tint/opa, construction-object-component, adds impassable

Constructing new objects now has a specific job, and the required systems and components were implemented.

- system: floor building (C++)
        phased scan of entire tile map
        when tile is bit constructing and nearby (4-dir) walkable, plant job entity
            how to make sure it's unique?
                get all job ents in 9-area (so single query), make sure none is floor building for this tile
            how to kill job ent when tile is removed? no child possible
                sys also checks on jobs ents to see if still valid

As with objects, building floors is now based on a job. This was done in C++ because tiles have no entities to represent them, by design. So this system requires a (phased) scan of the entire tilemap to detect under construction tiles and spawn the required jobs where necessary. Checking a few hundred tiles per frame is not slow but it's better to use the scripting time slice budget somewhere else.