Commit Graph
1614 Commits
Author SHA1 Message Date
Nunuhara Cabbage a19c200870 parts: clean up text layout logic 2026-08-14 11:30:52 -07:00
Nunuhara Cabbage 5cbc697f23 parts: use bold width for text layout
Fixes the remaining issues with item descriptions in Rance 9.
2026-08-14 10:48:07 -07:00
Nunuhara Cabbage 4e20a499d4 parts: use ceilf(ch->advance) for text layout
Fixes an issue in English version of Rance 9 where item description text
was overly compressed. Now ChipmunkSpriteEngine.SP_GetFontWidth returns
the same values as the official engine.

There are still text layout bugs with item descriptions in Rance 9
(affecting both JP and EN versions), but this at least makes the text
readable.
2026-08-13 20:14:54 -07:00
Nunuhara Cabbage 0d4eb2a2a7 Merge pull request #373 from kichikuou/math-rand
Math: Replace rand() with mt19937
2026-08-13 18:28:18 -07:00
kichikuou d800e12f59 Math: Replace rand() with mt19937
On Windows RAND_MAX is 0x7fff, which makes Rand() and RandF() far too
coarse. Use mt19937 instead so that seeded sequences reproduce the
original engine's behavior.
2026-08-14 09:31:32 +09:00
Nunuhara Cabbage b1f8948b74 Merge pull request #372 from kichikuou/parts-load-text
parts: Fix loss of line breaks in saved multi-line text
2026-08-11 19:14:35 -07:00
Nunuhara Cabbage ebc319994e Merge pull request #371 from kichikuou/rance9-v2
parts: Reference construction process CGs by name
2026-08-11 19:13:18 -07:00
kichikuou 9bb871d9fd parts: Fix loss of line breaks in saved multi-line text
Text lines are saved individually without newlines. Insert an explicit
newline between lines on load so the original line structure is
restored. Also free the strings read from the save data.
2026-08-11 13:46:18 +09:00
kichikuou 62d38aaf59 parts: Reference construction process CGs by name
Rance 9's AFA archives have no ID field, so asset IDs are sequential
indices local to each archive. When the game loads an additional CG
archive, the ID spaces overlap: a name resolved to an ID against the
base archive later fetches a different CG from the additional archive.
Keep the CG name instead.

Bumps the save version to 5; version 4 and earlier saves still store IDs
and are converted on load.
2026-08-11 13:05:32 +09:00
Nunuhara Cabbage 5bb36c7524 Update libsys4
Fixes #370 via nunuhara/libsys4@cbc57ce
2026-08-09 19:00:36 -07:00
Nunuhara Cabbage 4dc9792632 Merge branch 'master' of github.com:nunuhara/xsystem4 2026-08-09 08:32:53 -07:00
Nunuhara Cabbage a7e973c0a9 Merge pull request #369 from kichikuou/rance9-v2
Resolve archive paths in asset_manager_load_archive
2026-08-08 20:09:26 -07:00
kichikuou 33f1295237 Resolve archive paths in asset_manager_load_archive
AFAFactory.LoadArchive passed the SJIS archive name straight through, so
the extra assets loaded by the Rance 9 v2.00 patch were never found.
Move the path resolution out of CGManager.LoadArchive so that both
callers share it.
2026-08-09 10:36:00 +09:00
Nunuhara Cabbage e699fb0aa2 DAP: ensure messages are null-terminated 2026-08-08 10:10:28 -07:00
Nunuhara Cabbage 4e0dd82776 Merge pull request #368 from kichikuou/libsys4
Update libsys4
2026-08-05 18:42:52 -07:00
kichikuou 77d9e77053 Update libsys4 2026-08-06 09:22:23 +09:00
Nunuhara Cabbage d65a1e6d9b Merge pull request #367 from kichikuou/rance9
game_compatibility.md: Add Rance 9 (JA) as supported
2026-08-04 18:50:56 -07:00
kichikuou 68e8257c27 game_compatibility.md: Add Rance 9 (JA) as supported 2026-08-04 20:52:41 +09:00
Nunuhara Cabbage 8e339d1537 Merge pull request #366 from kichikuou/save
PartsEngine: Stabilize save format for Rance 9
2026-08-02 11:12:12 -07:00
kichikuou a2524bafd5 PartsEngine: Stabilize save format for Rance 9
Bump the save version and always serialize controller state and the
Rance 9 parts fields. Load these fields based on the save version while
retaining compatibility with existing multi-controller saves.
2026-08-02 08:49:06 +09:00
Nunuhara Cabbage f146320e36 Merge pull request #365 from kichikuou/3d
Two 3D fixes for Rance 9
2026-08-01 06:25:54 -07:00
kichikuou 09a0e3329a 3d: Disable specular with zero power
Treat zero SpecularPower as disabling specular lighting instead of
producing a constant white highlight (pow(..., 0) = 1).
2026-07-29 08:50:18 +09:00
kichikuou b68e1622fd 3d: Implement DrawShadow mesh attribute
Also parse some other .opr attributes for features not implemented in
xsystem4.
2026-07-28 14:29:50 +09:00
Nunuhara Cabbage 433e3be3e6 Merge pull request #364 from kichikuou/rance9-bgi
KiwiSoundEngine: Fix BGM loop for Rance 9
2026-07-26 09:13:40 -07:00
kichikuou d5b27a0a47 KiwiSoundEngine: Fix BGM loop for Rance 9
Commit 03062d5 fixed audio lookup for Rance 9, but the new archive-data
preparation path bypassed BGI and WAI metadata. Pass the asset number
through that path so loop points are applied correctly.
2026-07-26 07:53:03 +09:00
Nunuhara Cabbage a38c55602d Merge pull request #363 from kichikuou/ffmpeg
movie_ffmpeg: Use nb_samples for audio frame length
2026-07-25 08:50:35 -07:00
Nunuhara Cabbage b3bcd79bae Merge pull request #362 from kichikuou/pl_mpeg
pl_mpeg: Support MPEG-2 program stream headers
2026-07-25 08:50:00 -07:00
kichikuou f0c4db718d movie_ffmpeg: Use nb_samples for audio frame length
Audio linesize may include unused buffer space. Using it as the sample
count caused short Vorbis frames to replay stale samples and slowed down
audio playback.
2026-07-22 09:07:30 +09:00
kichikuou d17fc30731 pl_mpeg: Support MPEG-2 program stream headers
Fortress.alm from Rance IX uses an MPEG-2 Program Stream containing
MPEG-1 video and MPEG-1 Layer II audio. As far as I checked, it is the
only .alm movie released in Japan that does not use an MPEG-1 Program
Stream.

The existing pl_mpeg decoders support its elementary streams, but the
demuxer rejects its MPEG-2 pack and PES headers. Extend the demuxer to
parse those headers and the PTS/DTS combinations used by Fortress.alm.
2026-07-22 07:31:44 +09:00
Nunuhara Cabbage ca2254360c Merge pull request #361 from kichikuou/libdeflate
Use libsys4 zlib wrappers
2026-07-19 21:21:54 -07:00
kichikuou 81f9113906 Use libsys4 wrappers for zlib operations
Replace direct one-shot zlib compression and decompression calls with
the libsys4 wrappers. Use exact-size decompression where file formats
provide the uncompressed size.

File2.c continues to depend directly on zlib because it uses streaming
inflate.
2026-07-20 12:53:19 +09:00
Nunuhara Cabbage d63e71e85d Merge pull request #360 from kichikuou/numpad
input: Handle numpad keys with NumLock disabled
2026-07-16 21:03:56 -07:00
kichikuou 6d05546c2c input: Handle numpad keys with NumLock disabled
When NumLock is disabled, Windows reports numpad keys as navigation
virtual-key codes in the WM_KEYDOWN message. SACT2 games rely on this
behavior.

Translate SDL keypad scancodes to the corresponding SACT key codes in
that state, and map keypad Enter to VK_RETURN.

Fixes #359.
2026-07-15 08:36:08 +09:00
Nunuhara Cabbage e260b82828 Merge pull request #358 from kichikuou/3d-debug
debugger: Add "3d" debugger commands
2026-07-13 17:55:14 -07:00
kichikuou c0cdf4f070 debugger: Add "3d" debugger commands
Add the following commands to the debugger:

  3d list [all]                      List plugins and instances
  3d plugin [<plugin>]               Show or select the current plugin
  3d show [<instance>]               Dump plugin or instance state
  3d set <instance> draw <0|1>       Enable or disable drawing
  3d set <instance> pos <x> <y> <z>  Set the instance position
  3d help                            Show command help

The show and set commands operate on the current plugin. If only one
plugin exists, it is selected automatically. Changes made with set are
rendered immediately.
2026-07-12 13:37:44 +09:00
Nunuhara Cabbage 74461f5b9c Merge pull request #357 from kichikuou/issue-356
parts: Fail construction build without target texture
2026-07-06 18:24:53 -07:00
kichikuou d8479ad80a parts: Fail construction build without target texture
If AddCreateCGToProcess fails for a missing CG, no create op is added to
the construction process. Game scripts still add drawing operations and
then build the process, leaving those operations with no destination
texture and causing an incomplete framebuffer error.

This makes construction build operations return false as soon as an
operation cannot be executed.

Fixes #356.
2026-07-07 08:52:17 +09:00
Nunuhara Cabbage e8bd5ab036 Merge pull request #355 from kichikuou/relative-user-config-paths
Resolve game config paths relative to game dir
2026-07-05 11:23:53 -07:00
kichikuou 05fee4ba83 Resolve game config paths relative to game dir
Game-specific .xsys4rc files are loaded from the game directory, so
relative paths in that file are most useful when interpreted from the
same directory. This allows patches that ship external fonts to
reference them with relative paths.
2026-07-05 08:03:29 +09:00
Nunuhara Cabbage bf3b3416fe Merge pull request #354 from kichikuou/edge
SealEngine: Implement outline rendering options
2026-06-27 08:12:00 -07:00
kichikuou fb3d0bbd3e 3d: Gate edge drawing on per-instance flag
In both TapirEngine and SealEngine an instance is outlined only when the
global edge draw option and its per-instance edge flag are both on. The
per-instance flag is exposed via Set/GetInstanceDrawParam, whose edge
index differs by engine (Tapir 0, Seal 2).

For the global option the engine only distinguishes on/off, so drop the
RE_draw_edge_mode enum.
2026-06-26 09:19:15 +09:00
kichikuou 507b65fc9c SealEngine: Implement SetEdgeLength/SetEdgeColor
In SealEngine the outline length and color are plugin-wide values set
via SetEdgeLength/SetEdgeColor, not the per-mesh .opr parameters used by
TapirEngine.
2026-06-25 16:32:54 +09:00
Nunuhara Cabbage 24df15b9e9 Merge pull request #353 from kichikuou/delegate
VM: Check function signature in DG_STR_TO_METHOD
2026-06-20 17:55:08 -07:00
kichikuou fab789df65 VM: Check function signature in DG_STR_TO_METHOD
Only resolve the method when the function's signature matches the
delegate type, returning 0 otherwise.

Also, DG_SET / DG_NEW_FROM_METHOD / DG_ADD should not add function 0.
2026-06-21 06:56:24 +09:00
Nunuhara Cabbage 3012faa6ff Merge pull request #352 from kichikuou/lighting
SealEngine: Add lighting support
2026-06-20 06:22:14 -07:00
kichikuou 6dbb5baf19 SealEngine: Implement filmic tone mapping
Apply the Uncharted 2 tone curve [1] from light_params[0..7] as the
final fragment operation.

[1] https://filmicworlds.com/blog/filmic-tonemapping-operators/
2026-06-20 11:41:56 +09:00
kichikuou db8279ebc3 SealEngine: Implement hemisphere lighting
This implements the sky/middle/ground hemisphere ambient driven by
light_params[8..19].

SealEngine has no separate specular-light instance; its specular instead
shares the hemisphere light vector.
2026-06-20 11:41:56 +09:00
kichikuou 250bc82818 SealEngine: Enable light scattering
Reuse ReignEngine's existing scattering shader code. The ls_* uniforms
are sourced from .lit parameters.
2026-06-20 11:41:56 +09:00
kichikuou 4843e4e87a SealEngine: add light parameter storage and HLL bindings
SealEngine manages a 41-float light parameter set (serialized as .lit
file) for tone mapping, hemisphere lighting, and light scattering. This
adds the storage and HLL plumbing, without wiring values into shaders.

- A DIRECTIONAL_LIGHT instance owns a parameter set, filled by loading a
  .lit file (RE_instance_load).
- SealEngine.StoreInstanceLightParam() reflects that presets into the
  plugin's master buffer, which is used by the renderer.
- SealEngine.LoadInstanceLightParam() copies the master back into an
  instance, and Reset()/Set()/Get() operate directly on the master.
2026-06-20 11:41:56 +09:00
kichikuou 1051294247 SealEngine: Implement SpecularColor and SpecularPower .opr attributes
Parse per-mesh SpecularColor and SpecularPower attributes from .opr
files, and apply them to specular lighting.
2026-06-20 11:41:56 +09:00