Closes internal-consistency items 19 through 36, 38 and 41. Item 37, the ~180 redundant casts, is deliberately left open with its reasoning in TODO.md: the benefit only arrives once the build turns on the warnings those casts suppress, and doing it before that is churn across the two files with the most outstanding functional defects. The two that were real bugs are in the actor state table. AKGL_ACTOR_STATE_STRING_NAMES was declared [AKGL_ACTOR_MAX_STATES+1] and defined [32], so a consumer trusting the declared bound read past the object; and indices 11 and 12 were named UNDEFINED_11 and UNDEFINED_12 where actor.h has MOVING_IN and MOVING_OUT, so no character JSON could bind a sprite to either state. tests/registry.c now walks the whole table -- every entry non-NULL, every entry resolving to its own bit, no two entries sharing a name. The bitmask macros are parenthesized and AKGL_BITMASK_CLEAR has lost the semicolon inside its body. Writing tests/bitmasks.c for that turned up something worth knowing: the obvious test does not catch it. For a bit that is set, the misparse `!(mask & bit) == bit` gives the same answer as the correct one. It only diverges for an unset bit whose value is not 1, and that is the shape the suite uses now. akgl_draw_background was the last public function outside the error protocol. It takes a backend like everything else in draw.h, restores the draw colour it found, and is tested -- TODO.md had it filed under "needs the offscreen renderer harness", which was never true; what it needed was to stop reading the global. All eight registry initializers go through one helper, so the seven that leaked an SDL_PropertiesID on every call after the first no longer do. Fixed in the same place because it is the same function: akgl_registry_init never called akgl_registry_init_properties, which made akgl_set_property a silent no-op for anyone not going through akgl_game_init -- Defects, Known and still open item 3. Also: AKGL_COLLIDE_RECTANGLES (three open parens, two closes) and akgl_Frame deleted, float32_t/float64_t used consistently, the developer-specific debug logging removed from the controller inner loop, the abandoned SDL_GetBasePath comments removed, nine unused locals removed, and dst renamed to dest. akgl_game_update's default flags no longer OR the same bit twice. That changes nothing today, and the reason is Performance item 32: the loop never reads either bit, which is why every actor is updated sixteen times a frame. Still open. 25/25 pass, memcheck clean, reindent --check clean. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
66 lines
3.9 KiB
C
66 lines
3.9 KiB
C
/**
|
|
* @file iterator.h
|
|
* @brief The work order handed to a registry sweep.
|
|
*
|
|
* There is no iterator object with a `next()` on it. Traversal is SDL's --
|
|
* `SDL_EnumerateProperties` over a registry -- and this struct is the `userdata`
|
|
* carried into each callback, telling it *which* entries to touch and *what* to
|
|
* do to each one. akgl_registry_iterate_actor and
|
|
* akgl_registry_iterate_character are the callbacks that read it;
|
|
* akgl_game_update, akgl_physics_simulate, and akgl_render_2d_draw_world are the
|
|
* entry points that take one.
|
|
*
|
|
* The operations are independent bits, not an enum: a single sweep can update,
|
|
* scale, and render, and they run in that fixed order regardless of how the bits
|
|
* were set. Passing `NULL` where an `akgl_Iterator *` is expected is not an
|
|
* error at the top-level entry points -- each substitutes its own default set --
|
|
* but it *is* an error once inside a callback.
|
|
*/
|
|
|
|
#ifndef _AKGL_ITERATOR_H_
|
|
#define _AKGL_ITERATOR_H_
|
|
|
|
#include <stdint.h>
|
|
|
|
/** @brief Selects operations and an optional layer for actor traversal. */
|
|
typedef struct {
|
|
uint32_t flags; /**< Bitwise OR of the `AKGL_ITERATOR_OP_*` values below. */
|
|
uint8_t layerid; /**< Layer to restrict the sweep to. Read only when #AKGL_ITERATOR_OP_LAYERMASK is set. */
|
|
} akgl_Iterator;
|
|
|
|
#define AKGL_ITERATOR_OP_UPDATE (1 << 0) // 1 Call the actor's updatefunc
|
|
#define AKGL_ITERATOR_OP_RENDER (1 << 1) // 2 Call the actor's renderfunc
|
|
#define AKGL_ITERATOR_OP_RELEASE (1 << 2) // 4 Release the object back to its heap layer
|
|
#define AKGL_ITERATOR_OP_LAYERMASK (1 << 3) // 8 Skip anything whose layer != layerid
|
|
#define AKGL_ITERATOR_OP_TILEMAPSCALE (1 << 4) // 16 Scale actors to the tilemap; otherwise force scale 1.0
|
|
#define AKGL_ITERATOR_OP_UNDEFINED_5 (1 << 5) // 32
|
|
#define AKGL_ITERATOR_OP_UNDEFINED_6 (1 << 6) // 64
|
|
#define AKGL_ITERATOR_OP_UNDEFINED_7 (1 << 7) // 128
|
|
#define AKGL_ITERATOR_OP_UNDEFINED_8 (1 << 8) // 256
|
|
#define AKGL_ITERATOR_OP_UNDEFINED_9 (1 << 9) // 512
|
|
#define AKGL_ITERATOR_OP_UNDEFINED_10 (1 << 10) // 1024
|
|
#define AKGL_ITERATOR_OP_UNDEFINED_11 (1 << 11) // 2048
|
|
#define AKGL_ITERATOR_OP_UNDEFINED_12 (1 << 12) // 4096
|
|
#define AKGL_ITERATOR_OP_UNDEFINED_13 (1 << 13) // 8192
|
|
#define AKGL_ITERATOR_OP_UNDEFINED_14 (1 << 14) // 16384
|
|
#define AKGL_ITERATOR_OP_UNDEFINED_15 (1 << 15) // 32768
|
|
#define AKGL_ITERATOR_OP_UNDEFINED_16 (1 << 16) // 65536
|
|
#define AKGL_ITERATOR_OP_UNDEFINED_17 (1 << 17) // 131072
|
|
#define AKGL_ITERATOR_OP_UNDEFINED_18 (1 << 18) // 262144
|
|
#define AKGL_ITERATOR_OP_UNDEFINED_19 (1 << 19) // 524288
|
|
#define AKGL_ITERATOR_OP_UNDEFINED_20 (1 << 20) // 1048576
|
|
#define AKGL_ITERATOR_OP_UNDEFINED_21 (1 << 21) // 2097152
|
|
#define AKGL_ITERATOR_OP_UNDEFINED_22 (1 << 22) // 4194304
|
|
#define AKGL_ITERATOR_OP_UNDEFINED_23 (1 << 23) // 8388608
|
|
#define AKGL_ITERATOR_OP_UNDEFINED_24 (1 << 24) // 16777216
|
|
#define AKGL_ITERATOR_OP_UNDEFINED_25 (1 << 25) // 33554432
|
|
#define AKGL_ITERATOR_OP_UNDEFINED_26 (1 << 26) // 67108864
|
|
#define AKGL_ITERATOR_OP_UNDEFINED_27 (1 << 27) // 134217728
|
|
#define AKGL_ITERATOR_OP_UNDEFINED_28 (1 << 28) // 268435456
|
|
#define AKGL_ITERATOR_OP_UNDEFINED_29 (1 << 29) // 536870912
|
|
#define AKGL_ITERATOR_OP_UNDEFINED_30 (1 << 30) // 1073741824
|
|
#define AKGL_ITERATOR_OP_UNDEFINED_31 (1 << 31) // 2147483648
|
|
|
|
|
|
#endif // _AKGL_ITERATOR_H_
|