Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
d1eb992
PS2: read the PS2 release's archive and convert its worlds to PC worlds
nolffan Oct 24, 2026
8deb8f4
PS2: convert the PS2 release's models to PC models
nolffan Oct 24, 2026
b6bd700
PS2: decode the PS2 release's sound banks and voice streams
nolffan Oct 24, 2026
ba78a36
PS2: the PS2 levels' text, and the IDs it takes in CRes.dll
nolffan Oct 24, 2026
6b2915d
Client: the PS2 thief levels' loading screen, hands and intel
nolffan Oct 24, 2026
d28f001
Build: make modern PS2=1 adds the PS2 thief levels
nolffan Oct 24, 2026
cf28558
PS2: the Baron's training rooms in "A Man of Influence"
nolffan Oct 24, 2026
d73e15a
PS2: the safe cracker's LEDs and coloured parts
nolffan Oct 24, 2026
4507eab
Main menu: choose its Cate, young Cate with the PS2 levels
nolffan Oct 24, 2026
be5691c
Docs: package P8, the PS2 release's levels
nolffan Oct 24, 2026
59a4c6e
ps2build.sh: a failed step before a tee fails the build
nolffan Oct 27, 2026
b6aaf1c
Young Cate menu: one check for the PS2 build and the Thief mod
nolffan Oct 27, 2026
58a8cac
PS2: the thief safes are marked ThiefCodeBreaker, as the Thief mod's
nolffan Oct 27, 2026
4bd6282
PS2: M07S03's halves are m07s03a and m07s03b, the Thief mod's names
nolffan Oct 27, 2026
47ecd99
PS2: the intel popups are ScaleFX252-254, the Thief mod's numbers
nolffan Oct 27, 2026
0731b0c
Thief levels' loading screen: one, P9's, with the mod's text or the P…
nolffan Oct 27, 2026
db20682
PS2: the PS2 levels draw with the PS2's own textures
nolffan Oct 27, 2026
48eaf77
Docs: P8 on top of P9, the three ways to play the thief levels
nolffan Oct 27, 2026
5b2e6ee
ps2build.sh: a build without PS2=1 also removes the folders the PS2 f…
nolffan Oct 27, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,16 @@ Since the first public release:
modern renderers left the processor at full precision, and the
collision tests came out differently. They now set it as the original
did. (issue #43)
- **The PlayStation 2 release's extra levels**, for a build from source
with your own PS2 disc image (`make modern PS2=1`; no public archive
yet). Young Cate's three "Nine years ago" flashbacks, as a thief in
London and Scotland, play inside missions 3, 5 and 13 as on the PS2,
with the lock pick and safe cracker; "A Man of Influence" gets the
Baron's secret training rooms under his courtyard. Interface options
can also put young Cate on the main menu, or any of the menu's other
Cates. The levels draw with the PS2's own textures. With the Thief mod
installed as well, the mod's versions of the same levels take their
place. ([`docs/MODERN.md`](docs/MODERN.md), P8)
- **Sound effects at retail loudness.** OpenMiles played most sounds
1.5-3 dB louder than Miles 6.0i (its volume curve was approximated, and
it did not round as Miles does); its volume, master volume and pan now
Expand Down
4 changes: 4 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ SRC_MOUNT := $(if $(NOLF_SOURCE),-v $(realpath $(NOLF_SOURCE)):/nolfsource:ro -e
DOCKER_RUN = docker run --rm --init --name $(CONTAINER) \
-u $(shell id -u):$(shell id -g) -e HOME=/tmp/home $(if $(JOBS),-e NOLFSRC_JOBS=$(JOBS)) \
$(if $(NOLF_ARCHIVES),-e NOLF_ARCHIVES="$(NOLF_ARCHIVES)") \
$(if $(PS2),-e NOLFSRC_PS2=1) \
-v $(CURDIR):/repo -w /repo $(SRC_MOUNT) $(IMAGE)

TOOLCHAIN_FILES = toolchains/msvc-6.00-9782/VC98/Bin/CL.EXE \
Expand All @@ -56,6 +57,9 @@ help:
@echo "make debug the game with symbols and NOLFSRC_DEBUG logging, in out/nolf-legacy-debug/"
@echo "make modern the game with NOLFSRC_MODERN (the retail bugs fixed), in out/nolf-modern-release/"
@echo "make modern-debug both, in out/nolf-modern-debug/"
@echo " (with PS2=1, the modern ones also get the PS2 release's levels: the three"
@echo " \"Nine years ago\" flashbacks and the Baron's training rooms, from the PS2"
@echo " disc in rez/isos/ps2/; no public archive)"
@echo " (none of these is ever scored; build/variant.sh)"
@echo "make test scripted playtest of out/nolf-legacy-release/ ($(TEST_LEVELS)), under Xvfb"
@echo "make test-modern the same of out/nolf-modern-release/"
Expand Down
6 changes: 6 additions & 0 deletions build/all.sh
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,12 @@ python3 build/retailextract.py lithtechres "$RETAIL" src/engine/lithtech/res
step "2c. Game of the Year text: the retail CRES.dll in $RETAIL -> src/game/ClientRes/goty/"
python3 build/retailextract.py goty "$RETAIL" src/game/ClientRes/goty

step "2d. the PS2 levels' text (modern build, make modern PS2=1): the PS2 disc in rez/isos/ps2/ -> src/game/ClientRes/goty/ps2.rc"
case "${NOLFSRC_CFLAGS:-}" in
*NOLFSRC_MODERN*) bash build/ps2/ps2build.sh strings src/game/ClientRes/goty/ps2.rc ;;
*) rm -f src/game/ClientRes/goty/ps2.rc ;;
esac

step "3. compile: libraries, game DLLs, engine (build/compile.sh: build/build.mk, ${NOLFSRC_JOBS:-$(nproc)} jobs)"
GAME_CONFIG=final bash build/compile.sh all
for f in src/engine/ltmsg/Release/ltmsg.dll src/engine/sres/Release/sres.dll \
Expand Down
4 changes: 3 additions & 1 deletion build/build.mk
Original file line number Diff line number Diff line change
Expand Up @@ -309,7 +309,9 @@ $(eval $(call compile,$(CRES)/Release/main.obj,$(CRES),main.cpp,$(ENV_GAME),$(CL
CRES_RC := $(CRES)/goty/cres_goty.rc
# (a printf format: \\ is one backslash)
hash := \#
CRES_RC_FMT := $(hash)include "..\\ClientRes.rc"\r\n$(hash)include "goty.rc"\r\n$(foreach r,$(if $(MODERN),$(notdir $(wildcard src/modern/cres/*.rc))),$(hash)include "..\\..\\..\\modern\\cres\\$(r)"\r\n)
# The modern build adds the PS2 levels' text (goty/ps2.rc) when build/all.sh
# made it from the PS2 disc (MODERN.md, P8).
CRES_RC_FMT := $(hash)include "..\\ClientRes.rc"\r\n$(hash)include "goty.rc"\r\n$(foreach r,$(if $(MODERN),$(notdir $(wildcard src/modern/cres/*.rc))),$(hash)include "..\\..\\..\\modern\\cres\\$(r)"\r\n)$(if $(MODERN),$(if $(wildcard $(CRES)/goty/ps2.rc),$(hash)include "ps2.rc"\r\n))
$(CRES_RC): FORCE
@test -f $(CRES)/goty/goty.rc -a -f $(CRES)/goty/credits.txt || \
{ echo "error: $(CRES)/goty/ is missing -- build/all.sh writes it" >&2; exit 1; }
Expand Down
7 changes: 7 additions & 0 deletions build/package.sh
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,13 @@ if [[ $ARCHIVES == *" private "* ]]; then
echo " $PKG: $(du -h "$PKG" | cut -f1) (unpacks to $NAME/)"
fi
[[ $ARCHIVES == *" public "* ]] || exit 0
# Nor of a game directory with the PS2 levels (make modern PS2=1): they are
# made from the PS2 disc, which the install scripts do not read.
if [ -f "$OUT/custom/PS2-DATA.txt" ]; then
echo " $PARENT/$NAME-public.tar.gz: skipped (the game directory has the PS2 levels, custom/PS2-DATA.txt)"
rm -f "$PARENT/$NAME-public.tar.gz"
exit 0
fi

# The public archive: the scripts beside the rest, the disc files left out.
PUB="$PARENT/$NAME-public.tar.gz"
Expand Down
Loading
Loading