The Spatials V3 devblog 2016-01-04

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

TL;DR: more development for combat AI and various fixes.

The past two weeks with the holidays in the middle have been low intensity for development, but work advances steadily.

- generic sdl backend
    handle non-vsync main loop
    custom cursors
    window close confirmation
- migrate windows to generic sdl for display/events

After a few more reports of occasional fullscreen problems in Windows, plus existing problems with some keyboard layouts, I've decided to dump the custom direct Win32 windowing code and use SDL2. The advantage of SDL2 is the years of fixes and thousands of shipped games. Being a proven library will make it less likely for problems to surface in platform-depending areas of the code.

- auto discovery of sound fx
    with scheme-compatible discovery proc
    still indexed by file name
    remove the "sound/" of the current paths

Sound effects are now autodiscovered on load, and folders for them can be provided my mod scripts.

- add fauna camps to planet gen

Another V2 parity feature: random fauna camps have been added on planets.

- add last-attacker-component on attack
- last-attacker decay system
- last-attacker system: attacked entities can put the last-attacker component on same-civ entities around them
- use last-attacker-component as preferred target in aggressor SM
    and make it override any friend/hostile rep evaluation

Another component for the combat AI. The last-attacker-component is added by aggressors to entities being attacked. Those entities in turn can make use of the component to trigger a series of behaviors. One of them is a system that looks up friendly entities and sets them with a new last-attacker-component referencing the original attacker. This "empathy" behavior then makes those friendly entities either flee along with the original entity or start attacking the aggressor, depending on their component configuration.

- more attack model
    attack-model-component, decoupled from aggressor-component
    proc is now a symbol ref
- attack: melee
- fix: range check related problems with melee
    ecs-walk-to-entity uses ecs-preferred-center, which is meant for interactive objects, so it keeps a margin
    this walking for melee range fails, the target pos is sometimes out of range
    but behavior is still useful, to attack impassables for example
    just increase melee range
- fix: useless walk to original sight point in aggressor, when target moved
    check when target moves too much and reset aggressor state

Some cleanups to the aggressor AI as the code moves from a testing prototype to more robust behavior.

- diff neutral vs hostile stance

A true neutral combat stance is now supported, with neutral entities ignoring each other unless provoked.

- true line of sight
    use coarse Bresenham to check tiles for walkable
- use LoS in vulnerable sm sightings too

Line of sight testing has now been implemented and attacks can make use of it as required. The default aggressor state machine now requires LoS for initiating an attack (including checking while the aggressor aproaches the target, so for example it is able to walk down a corridor and them stop in the entrance to a room when the target is in sight). The vulnerable state machine (later renamed to the flee state machine) also requires LoS for triggering a fear-motivated walk.

- turrets
    need aggressor on building-like component, but cannot move
    also aggressor sm uses pathing test for vuln finding, which is always #f with fixed, impassable objects
        first tile of path is blocked
- support vulnerable component on fixed impassable objects
    vuln sm requires PhysicsC so it's not enabled on fixed objects - OK
    bug: walkable aggressor tries to find path to F+I but doesnt find it, so it doesnt attack (using ecs-pos-center)
    bug: walkable aggressor tries to find path to F+I last attacker but doesnt find it for some pathological cases (cornered impassable objects)
        this actually generates error (#f in preferred-center)
    fix both errors by making sure center-or-4side is used, and allow it in some places to be #f

More V2 parity, this time enabling turrets. This posed a challenge since turrets are based on an impassable tile, and some of the combat code uses walkability testing. This has now been fixed by using a "center or nearby walkable tile" position test.

- add model accesors to proxy hp changes
- vulnerable: death proc proto
    for now add to existing comps, a symbol proc to call on hp = 0 in hp-delta
- vulnerable: formalize current mess of components
    vulnerable-component: tracks hp, hp max, and procs for various hp changes, including fatal hits. replaces hitpoints-component
    flee-compoment/SM/system: rename of old vulnerable-component, concerns exclusively with flee behavior
    separate make-flee/make-vulnerable
- default fatal proc: helper to spawn death posed placeholder
    copy components from original entity with specialized helpers

The vulnerable component, system and state machine was mixing concepts and was in general in a bad shape, being barely prototype code. It has now been fixed to be more generic and extensible. The flee behavior has been moved to its own system and is now opt-in. And entities are now finally able to die. A proc system has been introduced for this, based on a centralized handling of all hit points changes combined with a flexible proc configuration. Entities can then completely customize death and damage reciving behavior. A default behavior has been provided for death that clones the dead pose from the just killed entity and creates a temporary corpse entity.

Terminated robot