Commit Graph
1024 Commits
Author SHA1 Message Date
kichikuou 7ef9719cc7 Use little_endian.h in libsys4 2024-05-19 10:59:50 +09:00
Nunuhara Cabbage f47e5e5a82 Merge pull request #151 from kichikuou/PixelRestore
Add stubs for PixelRestore hll
2024-05-03 20:37:55 -07:00
kichikuou f0fc0b6699 Add stubs for PixelRestore hll
It is used (only?) in Beat Blades Haruka, when two enemies are found by
enemy seek.

This is just a screen effect and can be ignored without affecting
gameplay.
2024-05-04 07:31:35 +09:00
Nunuhara Cabbage 8cfc20999f Merge pull request #150 from kichikuou/PassRegister
PassRegister: Use the same format as AliceSoft's implementation
2024-04-26 21:12:47 -07:00
kichikuou bb72ad60b2 PassRegister: Improve query performance
Keep the arrays sorted and use binary search.
2024-04-27 11:45:35 +09:00
kichikuou 2b3e100cba PassRegister: Use the same format as AliceSoft's implementation
The old JSON format can still be loaded for backwards compatibility.
2024-04-27 11:45:29 +09:00
Nunuhara Cabbage 5f432ce672 Merge pull request #149 from kichikuou/file
Fix compilation error with clang
2024-04-15 06:09:24 -07:00
kichikuou c3e4cd5e9f Fix compilation error with clang 2024-04-15 15:27:29 +09:00
Nunuhara Cabbage 0f4529e1a6 Merge pull request #148 from kichikuou/file
File.Read/Write: Use the same format as AliceSoft's implementation
2024-04-14 15:46:57 -07:00
kichikuou 58366e199e File.Read/Write: Use the same format as AliceSoft's implementation
This improves interoperability of save files in Rance6, GALZOO, etc.
The old JSON format can still be loaded for backwards compatibility.
2024-04-14 09:23:23 +09:00
Nunuhara Cabbage d512275f99 Merge pull request #147 from kichikuou/system-gettime
system.GetTime(): Use SDL_GetTicks() instead of clock_gettime()
2024-04-02 17:30:09 -07:00
kichikuou 7e54e159df system.GetTime(): Use SDL_GetTicks() instead of clock_gettime()
Some games (e.g. Toushin Toshi 3) malfunction when system.GetTime()
returns a negative number.

On many systems clock_gettime(CLOCK_MONOTONIC) returns the time since
OS startup, but this wraps to a negative number after about 24.8 days.

As a mitigation, use SDL_GetTicks() instead, which returns the elapsed
time since game startup.
2024-04-02 13:26:53 +09:00
Nunuhara Cabbage a92e26c49c Merge pull request #146 from kichikuou/fix-feedback-loop
SACT2: Do not put sprite -1 (main surface) in the scene list
2024-03-30 07:37:18 -07:00
kichikuou e65a506dac SACT2: Do not put sprite -1 (main surface) in the scene list
Since this is the surface to render to, it should not be added to the
list of surfaces to draw from.

This is done by marking sprite -1 as hidden. Now SACT2.SP_GetShow(-1)
returns 0 and SACT2.SP_SetShow(-1, true) raises a runtime error. This is
consistent with the AliceSoft's implementation.
2024-03-28 09:38:50 +09:00
Nunuhara Cabbage 6e78f05d75 Merge pull request #145 from kichikuou/android-upstream
Android support
2024-03-16 09:10:40 -07:00
kichikuou f0f84a05ce Android: Fix text input issue
On Android, when the user enters "ら", "ん", "す" with the virtual
keyboard and converts it to "ランス", xsystem4 receives the following
events:

    SDL_TEXTINPUT("ら")
    SDL_TEXTINPUT("ん")
    SDL_TEXTINPUT("す")
    SDL_KEYDOWN(backspace)
    SDL_KEYUP(backspace)
    SDL_KEYDOWN(backspace)
    SDL_KEYUP(backspace)
    SDL_KEYDOWN(backspace)
    SDL_KEYUP(backspace)
    SDL_TEXTINPUT("ランス")

The backspace key events are generated by SDL to delete the unconverted
text. However, System4 games process the backspace key by polling, so
if the SDL_KEYDOWN and SDL_KEYUP events occur in close succession, the
game cannot detect that the backspace key has been pressed.

To solve this problem, this patch queues these consecutive input events
and processes them with an interval of at least 10ms.

Fixes https://github.com/kichikuou/xsystem4-android/issues/2.
2024-03-16 13:36:57 +09:00
kichikuou 18a71960e8 Add touch gestures
This adds gestures that allow touch device users to emulate the
following mouse/keyboard actions:

- Right-click: touch outside the game's viewport
- Ctrl key: one-finger touch and hold (for one second)
- Mouse wheel: Swipe up / down with two fingers
2024-03-16 13:35:12 +09:00
kichikuou 5e80c96587 Defer mouse button events synthesized from touch events
A typical event loop in System4 game looks like this:

    while (true) {
        SACT2.Mouse_GetPos(x, y);

        // Update the screen according to the mouse position (x, y)
        ...
        SACT2.Update();

        if (SACT2.Key_IsDown(VK_LBUTTON)) {
            // A button was pressed at (x, y)
            ...
        }
    }

This works poorly with touch devices. Assume that a touch event occured
during SACT2.Update(). It updates internal mouse position and button
status. After SACT2.Update(), the game calls SACT2.Key_IsDown(VK_LBUTTON).
It returns true, but the game has not yet called SACT2.Mouse_GetPos()
after the touch event, so it assumes that the button was pressed where
the mouse pointer was before the touch.

In order to avoid this situation, this defers mouse button events
synthesized (by SDL) from touch. Such deferred events are processed when
SACT2.Mouse_GetPos() is called or after 50ms.
2024-03-16 13:26:29 +09:00
kichikuou 9ec354c198 Android: Add CMakeLists.txt 2024-03-16 12:54:54 +09:00
kichikuou b7304f747b Android: Load fonts and shaders from apk assets 2024-03-16 12:53:56 +09:00
kichikuou b7ab1ed476 Android: Enforce landscape fullscreen mode 2024-03-16 12:49:52 +09:00
kichikuou bc522b27e0 Android: Report ERROR() with a message box 2024-03-16 12:45:07 +09:00
kichikuou 3e9f975213 Update libsys4 2024-03-16 12:43:55 +09:00
Nunuhara Cabbage ba9e42fad6 Merge pull request #144 from kichikuou/resume-save
Add support for reading / writing System4 resume save files
2024-02-15 20:34:45 -08:00
kichikuou 05226453d9 Add support for reading / writing System4 resume save files
Writing save files in RSM format is only enabled if `--save-format=rsm`
command line flag is specified, because this implementation does not
create save files that are fully compatible with the AliceSoft's
implementation:

* There is no simple way to determine the RSM format version used by the
  game.
* There are several unknown fields in the RSM format.
* Empty arrays are represented as NULL pages in xsystem4, so type
  information of such objects cannot be saved.

These limitations are not a problem for the following use cases:

* Use the created save files only in xsystem4
* Load save files created by System40.exe

Also, RSM save files are much smaller and faster to read and write than
JSON.
2024-02-14 12:45:37 +09:00
Nunuhara Cabbage 4e2c050ffc Merge pull request #143 from kichikuou/savedir
Create savedir just before running VM
2024-02-09 06:52:02 -08:00
kichikuou 39701c7657 Create savedir just before running VM
Before this change, directory described in System40.ini was created even
if --save-folder was specified.
2024-02-07 16:36:57 +09:00
Nunuhara Cabbage 6bdd22f875 Merge pull request #142 from kichikuou/game_compatibility
Update game_compatibility.md
2024-01-31 06:12:09 -08:00
kichikuou 20411f3518 Update game_compatibility.md 2024-01-31 18:09:28 +09:00
Nunuhara Cabbage 27e733758d Merge pull request #141 from kichikuou/banmisc
BanMisc: Use the same save format as AliceSoft's implementation
2023-12-16 17:01:35 -08:00
kichikuou 288381d8f6 BanMisc: Use the same save format as AliceSoft's implementation
BanMisc.{Save,Load}Struct now serializes structs in the same format as
AliceSoft's implementation, rather than in JSON format. The old JSON
format can also be loaded for backwards compatibility.
2023-12-17 09:01:36 +09:00
kichikuou c3f39aeb96 Use mt19937_xorcode helper function 2023-12-17 09:01:28 +09:00
Nunuhara Cabbage 05d2ad8600 Merge pull request #139 from kichikuou/shimaima
Update libsys4
2023-11-17 23:41:48 -08:00
kichikuou 0911103949 Update libsys4
And add tests for https://github.com/nunuhara/libsys4/pull/26.
2023-11-18 16:35:58 +09:00
Nunuhara Cabbage 9c8c290d83 Merge pull request #138 from kichikuou/movie-fix
Fix a bug that bgm did not work after movie load failed
2023-10-15 07:02:08 -07:00
kichikuou bf3700ea8e Fix a bug that bgm did not work after movie load failed
When movie_free() was called in movie_load(), mixer_stream_stop(0) was
mistakenly called and the music mixer was stopped.
2023-10-15 15:00:07 +09:00
Nunuhara Cabbage c521f1faf7 Merge pull request #137 from kichikuou/confirm3
Add Confirm3.Initialize
2023-09-25 20:10:23 -07:00
kichikuou ef7b789810 Add Confirm3.Initialize
For some reason, this function is renamed from GetHDDVolumeNumber only
in Momoiro Guardian.

This also makes all Confirm3 functions HLL_QUIET_UNIMPLEMENTED.
2023-09-17 21:22:43 +09:00
Nunuhara Cabbage 530f606657 Merge pull request #136 from kichikuou/sactdx
Add SACTDX.SP_DeleteAll
2023-09-05 06:06:03 -07:00
kichikuou 120b9888f1 Add SACTDX.SP_DeleteAll
Used in Edo Ranze.
2023-09-05 20:31:27 +09:00
Nunuhara Cabbage 87884d4230 Merge pull request #135 from kichikuou/s_mod
Fix S_MOD for bool and long int
2023-09-01 20:38:21 -07:00
kichikuou 0b4eb92e95 Fix S_MOD for bool and long int
* The "type" argument of S_MOD is 48 for bool, 56 for long int
* %b, %c, %d can consume any integer types (int, bool, or long int)
* If the value cannot be consumed, S_MOD should return the format
  string instead of an empty string
2023-09-02 11:36:54 +09:00
kichikuou 51e55644f5 DrawDungeon14: Fix incorrect return types in SetRaster{Scroll,Amp} 2023-09-02 11:11:01 +09:00
Nunuhara Cabbage 296496e895 Merge pull request #134 from kichikuou/raster
DrawDungeon14: Implement raster effect
2023-09-01 13:42:49 -07:00
kichikuou afae3fc9a6 DrawDungeon14: Implement raster effect
It is implemented as a post-processing effect. The hack for the
projection transform matrix has been removed, because now the image is
flipped upside down in the post-processing stage.
2023-09-01 21:45:46 +09:00
kichikuou a301ca1311 DrawGraph, Gpx2Plus: Implement CopyReverseUD() 2023-08-31 14:16:52 +09:00
Nunuhara Cabbage eb97693e3f Merge pull request #133 from kichikuou/msgskip
Fix path resolution in MsgSkip.Init
2023-08-25 06:48:35 -07:00
kichikuou a6f01f7f82 Fix path resolution in MsgSkip.Init
Some games (Ojou-sama o Iinari ni Suru Game and Double Sensei Life, as
far as I know) pass "SaveData\\MsgSkip.asd" to MsgSkip.Init. So this
change:

* uses savedir_path() to resolve the relative path, and
* removes the "SaveData\\" prefix, otherwise "SaveData/" will be
  duplicated in the resolved path.
2023-08-24 21:31:14 +09:00
Nunuhara Cabbage a27996def8 Merge pull request #132 from kichikuou/window-settings
SystemService: Implement "Wait Vsync" window setting
2023-08-22 18:26:42 -07:00
kichikuou fa96987eca SystemService: Implement "Wait Vsync" window setting
This also rewrites the SetWindowSetting and GetWindowSetting functions
based on the understanding gained from examining games after Haru Urare:

* Setting IDs are consistent across games.
* Settings 5 and 6 are added in Pastel Chime 3, both default true
2023-08-22 21:27:46 +09:00