Recovers the game's event-posting API so the engine can post events and the
compare harness can see them. Until now the owner's event list was invisible to
every layer: B3's replace-mode oracle failed by exactly one item across 40,300
(an unposted EVENT_RESEARCH_OVERBUDGET) while its compare read clean, and B2's
clean compare bounds the economy fields only.
New pure module src/game/events:
* EventStorage / TurnEvents / PlayerEvent -- the list is bucketed by TURN, not
flat, which the save-editor struct notes had wrong.
* EventStorage::Post reproducing the original's rules, including the four that
change save bytes: the FLT_MAX (not infinity) default position; action 0 with
no subject and no position storing as 2; per-bucket dedup that compares
message/image/location/position/action but NOT summary; and EvNxID starting
at 0 and being promoted to 1 on the first post.
* PruneOldTurns reproduced with its off-by-one: of a leading run of buckets
older than turn-50 it erases n-1, so one stale bucket always survives. The
survivor is serialized, so correcting it would diverge.
* research_events: the five events the research path raises, their EvImg
identifiers and string-table keys, and the 0.8 completion split evaluated
against (double)0.8f rather than the decimal 0.8.
Localized text is deliberately absent: only the EVENTSUM_/EVENTMSG_ keys are
here and the text resolves through a caller-supplied lookup, as the game does.
The four event offsets the B3 hook carried as local literals now come from the
generated header; they are read off instructions rather than inferred from the
save schema.
tests/game_events: 112 checks including a replay of the event list
turn3-state.sav actually holds. ctest 31/31 -> 32/32.
docs/E-events.md carries the proposed region and Coverage wording for the next
B3 recapture.
25 lines
994 B
Bash
Executable file
25 lines
994 B
Bash
Executable file
#!/usr/bin/env bash
|
|
# Build and run the game/events unit tests with plain g++ (no CMake needed).
|
|
# tests/game_events/build_and_run.sh
|
|
# BUILD_DIR=/some/dir tests/game_events/build_and_run.sh
|
|
set -euo pipefail
|
|
|
|
here="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
root="$(cd "$here/../.." && pwd)"
|
|
build="${BUILD_DIR:-$(mktemp -d "${TMPDIR:-/tmp}/sots-game-events.XXXXXX")}"
|
|
mkdir -p "$build"
|
|
|
|
CXX="${CXX:-g++}"
|
|
CXXFLAGS="${CXXFLAGS:--std=c++17 -O1 -g -Wall -Wextra -Werror -pedantic}"
|
|
srcs=("$root"/src/game/events/event_log.cpp "$root"/src/game/events/research_events.cpp)
|
|
|
|
objs=()
|
|
for s in "${srcs[@]}"; do
|
|
o="$build/$(basename "${s%.cpp}").o"
|
|
$CXX $CXXFLAGS -I"$root/src" -c "$s" -o "$o"
|
|
objs+=("$o")
|
|
done
|
|
|
|
exe="$build/test_events"
|
|
$CXX $CXXFLAGS -I"$root/src" -I"$here" -I"$root/tests/game_sim" "$here/test_events.cpp" "${objs[@]}" -o "$exe"
|
|
if "$exe"; then echo "game_events: all tests passed (build dir $build)"; else echo "game_events: FAILURES (build dir $build)"; exit 1; fi
|