Compare commits

...
42 Commits
Author SHA1 Message Date
kichikuou 8806bc9545 Version 2.17.0 2025-11-09 22:27:45 +09:00
kichikuou 5e62405f17 Move patch/ to misc/patch/ 2025-11-09 22:26:15 +09:00
kichikuou 714c7d44b5 Android: Update SDL to 2.32.10 2025-11-09 22:08:54 +09:00
kichikuou 0f6d4e2343 Add Streamer Mode with -censor option
This introduces "Streamer Mode" to mosaic specified NSFW images, making
the game suitable for streaming or public viewing. This feature is
enabled via the '-censor <file>' command-line option, which takes a file
containing a list of image numbers to be filtered.
2025-11-09 11:47:13 +09:00
kichikuou f1536a801a QE/LE: Handle backslashes in filenames
Rance 5D uses filename `Save\\Rance5dSystem.asd`. This caused issues:

- On Windows, saving would fail if the `Save` directory did not exist.
- On other platforms, files were created with literal backslashes in
  their names.

This change addresses these problems by:

- In commandQE, normalizing backslashes to forward slashes in the path
  and ensuring that the target directory exists by calling mkdir_p().
- In commandLE, first attempting to load files with normalized forward
  slashes. If that fails, it retries with the original path (containing
  backslashes) for compatibility with older saves.
2025-11-06 11:05:23 +09:00
kichikuou ab372b7873 Unify old and new command implementations
Consolidate logic for parsing string arguments by introducing a
parameter to handle different terminators.
2025-11-06 09:39:51 +09:00
kichikuou 2c02f40dc4 Move uppercase commands from cmd2F.c to cmd<first_letter>.c 2025-11-06 09:39:46 +09:00
kichikuou a395366cf8 Version 2.16.1 2025-08-28 13:00:30 +09:00
kichikuou e416fc20d3 CI: Disable portmidi on mingw32
mingw-w64-i686-portmidi is no longer provided.
2025-08-28 12:47:02 +09:00
kichikuou 7d03fc6757 sactlog: Hold log text in UTF-8 2025-08-28 12:24:49 +09:00
kichikuou e3b8c90611 sactlog: Draw text using gfx_drawString()
This fixes #71. It was a regression by commit ec071d4.
2025-08-28 11:41:51 +09:00
kichikuou 361ca89016 Windows: #undef min / max in portab.h 2025-06-20 08:11:35 +09:00
kichikuou 5bd4622031 Version 2.16.0 2025-06-13 17:20:47 +09:00
kichikuou c7c0f69ec4 Split sdl_core.h to event.h and editor.h
And rename sdl_event.c to event.c, sdl_input.c to editor.c.
2025-06-11 10:12:25 +09:00
kichikuou f38a3eda5c Merge sdl_cursor.c to cursor.c 2025-06-11 10:12:22 +09:00
kichikuou dc17b78365 Move miscellaneous low-level functions to system.[ch] 2025-06-11 09:23:44 +09:00
kichikuou b9f68eedd3 Move joystick initialization code to sdl_event.c 2025-06-11 09:23:44 +09:00
kichikuou adf362ea57 Rename sdl_effect_* to effect_* 2025-06-11 09:23:44 +09:00
kichikuou b5bf439b8e Remove graphics.h 2025-06-11 09:23:42 +09:00
kichikuou 9a01d28075 Move gfx_* functions from sdl_core.h to gfx.h 2025-06-11 09:22:36 +09:00
kichikuou 945dbd7722 Rename graphics functions from sdl_* to gfx_*
And rename sdl_{video,draw,image}.c to gfx_{video,draw,image}.c.
2025-06-10 15:00:27 +09:00
kichikuou 1c54487041 cmake: Use new policies up to CMake 4.0 2025-06-10 13:58:40 +09:00
kichikuou 92389289da Android: Add "clear save files" launcher menu command 2025-06-10 13:17:27 +09:00
kichikuou 4de03cc77f Move font license files to license/ 2025-05-30 20:54:28 +09:00
kichikuou 5a81ac6fc8 Windows: Add cancel button to text/number input dialog 2025-05-30 16:06:29 +09:00
kichikuou d7bac22059 Windows: Implement number input dialog (NI command)
Fixes #68.
2025-05-30 16:06:26 +09:00
kichikuou 8d4424061d Switch JPEG decoder to NanoJPEG and disable fancy upsampling
Graymerca uses JPEG images for map tiles, which suffers from color
bleeding due to chroma upsampling in the JPEG decoder.

Since stb_image cannot disable the bilinear upsampling filter, this
switches the JPEG decoder to NanoJPEG.

Fixes #67.
2025-05-29 08:39:59 +09:00
kichikuou 6c692e44e5 Version 2.15.1 2025-05-14 15:06:20 +09:00
kichikuou ec071d4e8a dt_drawtext_col: Fix blend mode
This fixes #66. It was a regression by commit 6b646b3.
2025-05-14 12:46:30 +09:00
kichikuou 904e10daa7 Version 2.15.0 2025-04-21 11:20:31 +09:00
kichikuou 65b6da3f2a emscripten: Export HEAPU8 and HEAP16
Used in Kichikou on Web shell.
2025-04-21 10:12:43 +09:00
kichikuou 3f495b72c1 Fix message waiting in Rance 2 intro
By recreating a bug of the ZW command in system35.exe.
2025-04-21 09:43:01 +09:00
kichikuou 90670477c6 Fix uncancellable message wait mode (ZW 256-511) 2025-04-21 09:42:58 +09:00
kichikuou 566ebb503f Fix PS and PP commands
This was a regression introduced by commit c1018d9.

Fixes #65.
2025-04-21 08:22:39 +09:00
kichikuou 6feab51a5d Update android/README.md 2025-04-10 10:45:14 +09:00
kichikuou 15d0b44ab9 Android: Move "Install from ZIP" to options menu and add help message
For consistency with xsystem4-android.
2025-04-10 10:12:56 +09:00
kichikuou a0f20caa77 Android: Support audio file names prefixed with track numbers 2025-04-10 10:12:56 +09:00
kichikuou 39712ee46e Version 2.14.3 2025-04-01 09:33:24 +09:00
kichikuou dcdbe7bb76 Android, Emscripten: Upgrade libwebp to 1.5.0 2025-04-01 09:28:33 +09:00
kichikuou 01a4255b83 Android: Upgrade SDL to 2.32.4 2025-04-01 08:49:30 +09:00
kichikuou d978a24a5e Fix build for big endian architectures 2025-04-01 08:24:42 +09:00
kichikuou ed196f72b9 Update game_compatibility.md
AliceNoir games are not supported.
2025-03-30 10:02:31 +09:00
145 changed files with 3607 additions and 10066 deletions
+4 -3
View File
@@ -15,7 +15,9 @@ jobs:
- sys: ucrt64
package: "xsystem35-64bit"
cmake_args: ""
deps: "cjson:p"
deps: >-
cjson:p
portmidi:p
defaults:
run:
shell: msys2 {0}
@@ -31,7 +33,6 @@ jobs:
SDL2_ttf:p
SDL2_mixer:p
libwebp:p
portmidi:p
${{ matrix.deps }}
- name: Checkout
@@ -42,7 +43,7 @@ jobs:
ls /${{ matrix.sys }}/share/licenses
mkdir dist
cp -r /${{ matrix.sys }}/share/licenses dist/
cp fonts/*.license dist/licenses/
cp licenses/* dist/licenses/
- name: Install dev dependencies
run: pacboy --noconfirm -S --needed gcc:p cmake:p ninja:p asciidoctor:p
+28 -3
View File
@@ -1,14 +1,39 @@
# Changelog
## 2.14.2 - 2024-03-09
## 2.17.0 - 2025-11-09
- Added "Streamer Mode" to mosaic specified (NSFW) images. This is enabled via the `-censor <file>` command-line option.
- Windows: Fixed an issue where Rance 5D could not save files if the `Save` directory did not exist.
## 2.16.1 - 2025-08-28
- Fixed text rendering issue in SACT log (#71)
- Windows: The 32-bit version no longer supports the portmidi MIDI backend
## 2.16.0 - 2025-06-13
- Fixed map tile color issue in Graymerca (#67)
- Windows: Implemented number input dialog for the `NI` command (#68)
- Android: Added "Clear Save Files" launcher menu command
## 2.15.1 - 2025-05-14
- Fixed a text rendering issue in Rance 5D (#66)
## 2.15.0 - 2025-04-21
- Fixed color palette bug introduced in v2.14.2.
- Fixed uncancellable message waiting mode.
- Android: "Install from ZIP" button is moved to the top-right option menu.
- Android: Improved extraction logic of track numbers from audio file names.
## 2.14.3 - 2025-04-01
- Fixed build for big endian architectures.
## 2.14.2 - 2025-03-09
- Android: Back button to exit the game (#50)
- Improved touch input usability in ママトト (#64)
## 2.14.1 - 2024-02-07
## 2.14.1 - 2025-02-07
- Fixed font selection and text decoration not working in selection menus.
- Fixed a graphic issue in DALK intro.
## 2.14.0 - 2024-01-09
## 2.14.0 - 2025-01-09
- New supported games: 俺の下であがけ and 楽園行.
- Windows: On Windows 10 version 1903 or above, now xsystem35 can handle
Japanese filenames correctly even if the system locale is not Japanese.
+4 -9
View File
@@ -1,16 +1,11 @@
cmake_minimum_required(VERSION 3.13)
# Rebuild external projects when download URL changes
if (CMAKE_VERSION VERSION_GREATER_EQUAL "3.24.0")
cmake_policy(SET CMP0135 NEW)
endif()
cmake_minimum_required(VERSION 3.13...4.0)
project(xsystem35 LANGUAGES C)
set(CMAKE_C_STANDARD 99)
enable_testing()
set(CMAKE_EXPORT_COMPILE_COMMANDS TRUE)
set(XSYSTEM35_VERSION "2.14.2")
set(XSYSTEM35_VERSION "2.17.0")
include(CheckSymbolExists)
include(FetchContent)
@@ -37,8 +32,8 @@ endfunction()
function(fetch_webp)
FetchContent_Declare(
libwebp
URL https://storage.googleapis.com/downloads.webmproject.org/releases/webp/libwebp-1.4.0.tar.gz
URL_HASH SHA1=0b1c8bea200caaa010182609dbaaa91aec69b64d
URL https://storage.googleapis.com/downloads.webmproject.org/releases/webp/libwebp-1.5.0.tar.gz
URL_HASH SHA1=b21aa842136dc59a72a38776a5aa73f4d0b00ac5
)
set(WEBP_BUILD_ANIM_UTILS OFF CACHE BOOL "Build animation utilities." FORCE)
set(WEBP_BUILD_CWEBP OFF CACHE BOOL "Build the cwebp command line tool." FORCE)
+8
View File
@@ -60,6 +60,14 @@ and examine or modify game variables. There are two ways to use the debugger:
launch the debugger with a console interface. Type `help` to see a list of
available commands.
### Streamer Mode
xsystem35 introduces a "Streamer Mode" to make playing games with NSFW content
safer for streaming or public viewing. When enabled with the `-censor <file>`
option, images specified in the provided file will be automatically mosaiced.
The `misc/censor/` directory contains example censor list files for some games.
## Installation
Prebuilt packages for Windows and Android can be downloaded from the
+38 -37
View File
@@ -6,7 +6,44 @@ Minimum supported Android version: 5.0
You can download prebuilt APKs
[here](https://github.com/kichikuou/xsystem35-sdl2/releases).
## Build
## Usage
### Basic Usage
1. Create a ZIP file containing all the game files and BGM files (see
[below](#preparing-a-zip) for details), and transfer it to your device.
2. Open the app. Tap the option menu (three dots in the top right corner) and
select "Install from ZIP".
3. Select the ZIP file you created in step 1.
4. The game will start. To simulate a right-click, tap the black bars on either
the left or right, or top or bottom of the screen.
### Preparing a ZIP
- Include all files from the `GAMEDATA` folder (such as `.ALD` files and
others). `.EXE` and `.DLL` files are not necessary, but you can include them
if you want.
- Music files (`.mp3`, `.ogg`, or `.wav`) whose filenames have a number either
at the beginning or just before the extension are recognized as BGM files.
For example:
- `Track2.mp3`
- `15.ogg`
- `02 - Title.mp3`
- `rance4_03.wav` (Note: The filename shouldn't be `rance403.wav`, as it
would be treated as the 403rd track.)
Note: This ZIP format is also compatible with
[Kichikuou on Web](http://kichikuou.github.io/web/).
### Miscellaneous
- You can export or import save files via the game list's option menu.
- To uninstall a game, long-tap its title in the game list.
## Known Issues
- Android versions older than 7.0 cannot handle ZIP files containing Shift-JIS
filenames. This issue occurs with some ZIP files distributed on
[retroc.net](http://retropc.net/alice/). If you encounter the error message
"This type of ZIP is not supported," unzip the file on your PC and re-archive
it using modern ZIP creation software.
## Building from Source
### Using Android Studio
Open this directory as an Android Studio project.
@@ -34,39 +71,3 @@ git clone https://github.com/kichikuou/xsystem35-sdl2.git
cd xsystem35-sdl2/android
./gradlew build # or ./gradlew installDebug if you have a connected device
```
## Usage
### Basic Usage
1. Create a ZIP file containing all the game files and BGM files (see
[below](#preparing-a-zip) for details), and transfer it to your device.
2. Open the app. A list of installed games will be displayed. Since no games
have been installed yet, only the "Install from ZIP" button will be visible.
Tap it.
3. Select the ZIP file you created in step 1.
4. The game will start. To simulate a right-click, tap the black bars on either
the left or right, or top or bottom of the screen.
### Preparing a ZIP
- Include all files from the `GAMEDATA` folder (such as `.ALD` files and
others). `.EXE` and `.DLL` files are not necessary, but you can include them
if you want.
- Music files (`.mp3`, `.ogg`, or `.wav`) whose filenames end with a number
will be recognized as BGM files. For example:
- `Track2.mp3`
- `15.ogg`
- `rance4_03.wav` (Note: The filename shouldn't be `rance403.wav`, as it
would be treated as the 403rd track.)
Note: This ZIP format is also compatible with
[Kichikuou on Web](http://kichikuou.github.io/web/).
### Miscellaneous
- You can export or import save files via the game list's option menu.
- To uninstall a game, long-tap its title in the game list.
## Known Issues
- Android versions older than 7.0 cannot handle ZIP files containing Shift-JIS
filenames. This issue occurs with some ZIP files distributed on
[retroc.net](http://retropc.net/alice/). If you encounter the error message
"This type of ZIP is not supported," unzip the file on your PC and re-archive
it using modern ZIP creation software.
+2 -2
View File
@@ -16,8 +16,8 @@ android {
defaultConfig {
minSdkVersion 21
targetSdkVersion 34
versionCode 31
versionName "2.14.2" + gitRevision()
versionCode 36
versionName "2.17.0" + gitRevision()
externalNativeBuild {
cmake {
arguments "-DANDROID_APP_PLATFORM=android-19", "-DANDROID_STL=c++_static"
+5 -4
View File
@@ -7,8 +7,8 @@ set(PROJECT_ROOT_DIR ../../..)
include(FetchContent)
FetchContent_Declare(
SDL
URL https://github.com/libsdl-org/SDL/releases/download/release-2.30.12/SDL2-2.30.12.tar.gz
URL_HASH SHA1=36d48b045209dcd3576250c1571795ad0cd4d5a9
URL https://github.com/libsdl-org/SDL/releases/download/release-2.32.10/SDL2-2.32.10.tar.gz
URL_HASH SHA1=ce98fa93e31836a751feca374ab28a0770b63c16
)
FetchContent_Declare(
SDL_ttf
@@ -44,8 +44,9 @@ file(MAKE_DIRECTORY ${ASSETS_DIR}/licenses)
file(COPY_FILE ${PROJECT_ROOT_DIR}/fonts/MTLc3m.ttf ${ASSETS_DIR}/MTLc3m.ttf)
file(COPY_FILE ${PROJECT_ROOT_DIR}/fonts/mincho.otf ${ASSETS_DIR}/mincho.otf)
file(COPY_FILE ${PROJECT_ROOT_DIR}/COPYING ${ASSETS_DIR}/licenses/xsystem35)
file(COPY_FILE ${PROJECT_ROOT_DIR}/fonts/MTLc3m.ttf.license ${ASSETS_DIR}/licenses/MTLc3m)
file(COPY_FILE ${PROJECT_ROOT_DIR}/fonts/mincho.otf.license ${ASSETS_DIR}/licenses/mincho)
file(COPY_FILE ${PROJECT_ROOT_DIR}/licenses/MTLc3m.txt ${ASSETS_DIR}/licenses/MTLc3m)
file(COPY_FILE ${PROJECT_ROOT_DIR}/licenses/mincho.txt ${ASSETS_DIR}/licenses/mincho)
file(COPY_FILE ${PROJECT_ROOT_DIR}/licenses/nanojpeg.txt ${ASSETS_DIR}/licenses/nanojpeg)
file(COPY_FILE ${sdl_SOURCE_DIR}/LICENSE.txt ${ASSETS_DIR}/licenses/SDL)
file(COPY_FILE ${sdl_ttf_SOURCE_DIR}/LICENSE.txt ${ASSETS_DIR}/licenses/SDL_ttf)
file(COPY_FILE ${sdl_ttf_SOURCE_DIR}/external/freetype/docs/GPLv2.TXT ${ASSETS_DIR}/licenses/freetype)
+81
View File
@@ -15,3 +15,84 @@
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
-keep,includedescriptorclasses,allowoptimization class org.libsdl.app.SDLInputConnection {
void nativeCommitText(java.lang.String, int);
void nativeGenerateScancodeForUnichar(char);
}
-keep,includedescriptorclasses class org.libsdl.app.SDLActivity {
# for some reason these aren't compatible with allowoptimization modifier
boolean supportsRelativeMouse();
void setWindowStyle(boolean);
}
-keep,includedescriptorclasses,allowoptimization class org.libsdl.app.SDLActivity {
java.lang.String nativeGetHint(java.lang.String); # Java-side doesn't use this, so it gets minified, but C-side still tries to register it
boolean onNativeSoftReturnKey();
void onNativeKeyboardFocusLost();
boolean isScreenKeyboardShown();
android.util.DisplayMetrics getDisplayDPI();
java.lang.String clipboardGetText();
boolean clipboardHasText();
void clipboardSetText(java.lang.String);
int createCustomCursor(int[], int, int, int, int);
void destroyCustomCursor(int);
android.content.Context getContext();
boolean getManifestEnvironmentVariables();
android.view.Surface getNativeSurface();
void initTouch();
boolean isAndroidTV();
boolean isChromebook();
boolean isDeXMode();
boolean isTablet();
void manualBackButton();
int messageboxShowMessageBox(int, java.lang.String, java.lang.String, int[], int[], java.lang.String[], int[]);
void minimizeWindow();
int openURL(java.lang.String);
void requestPermission(java.lang.String, int);
int showToast(java.lang.String, int, int, int, int);
boolean sendMessage(int, int);
boolean setActivityTitle(java.lang.String);
boolean setCustomCursor(int);
void setOrientation(int, int, boolean, java.lang.String);
boolean setRelativeMouseEnabled(boolean);
boolean setSystemCursor(int);
boolean shouldMinimizeOnFocusLoss();
boolean showTextInput(int, int, int, int);
}
-keep,includedescriptorclasses,allowoptimization class org.libsdl.app.HIDDeviceManager {
boolean initialize(boolean, boolean);
boolean openDevice(int);
int sendOutputReport(int, byte[]);
int sendFeatureReport(int, byte[]);
boolean getFeatureReport(int, byte[]);
void closeDevice(int);
}
-keep,includedescriptorclasses,allowoptimization class org.libsdl.app.SDLAudioManager {
int[] getAudioOutputDevices();
int[] getAudioInputDevices();
int[] audioOpen(int, int, int, int, int);
void audioWriteFloatBuffer(float[]);
void audioWriteShortBuffer(short[]);
void audioWriteByteBuffer(byte[]);
void audioClose();
int[] captureOpen(int, int, int, int, int);
int captureReadFloatBuffer(float[], boolean);
int captureReadShortBuffer(short[], boolean);
int captureReadByteBuffer(byte[], boolean);
void captureClose();
void audioSetThreadPriority(boolean, int);
native int nativeSetupJNI();
native void removeAudioDevice(boolean, int);
native void addAudioDevice(boolean, int);
}
-keep,includedescriptorclasses,allowoptimization class org.libsdl.app.SDLControllerManager {
void pollInputDevices();
void pollHapticDevices();
void hapticRun(int, float, int);
void hapticStop(int);
}
@@ -127,6 +127,7 @@ class Launcher private constructor(private val rootDir: File) {
if (!saveDirFound) {
File(rootDir, SAVE_DIR).mkdir()
}
observer?.onGameListChange()
}
private fun createDirForGame(): File {
@@ -219,16 +220,17 @@ class Launcher private constructor(private val rootDir: File) {
var gameDir: String? = null
private set
private val aldRegex = """.*?s[a-z]\.ald""".toRegex(RegexOption.IGNORE_CASE)
private val audioRegex = """.*?(\d+)\.(wav|mp3|ogg)""".toRegex(RegexOption.IGNORE_CASE)
private val audioRegex = """((\d+).*|.*?(\d+))\.(wav|mp3|ogg)""".toRegex(RegexOption.IGNORE_CASE)
private val audioFiles: Array<String?> = arrayOfNulls(100)
fun maybeAdd(path: String) {
aldRegex.matchEntire(path)?.let {
val name = File(path).name
aldRegex.matchEntire(name)?.let {
gameDir = File(path).parent
ready = true
}
audioRegex.matchEntire(path)?.let {
val track = it.groupValues[1].toInt()
audioRegex.matchEntire(name)?.let {
val track = it.groupValues[2].toIntOrNull() ?: it.groupValues[3].toInt()
if (0 < track && track <= audioFiles.size)
audioFiles[track - 1] = path
}
@@ -251,6 +253,14 @@ class Launcher private constructor(private val rootDir: File) {
}
}
}
fun clearSaveData(): Boolean {
var success = true
File(rootDir, SAVE_DIR).listFiles()?.forEach { file ->
if (!file.deleteRecursively()) success = false
}
return success
}
}
private fun forEachZipEntry(input: InputStream, action: (ZipEntry, ZipInputStream) -> Unit): Boolean {
@@ -22,6 +22,7 @@ import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.provider.OpenableColumns
import android.text.Html
import android.util.Log
import android.view.Menu
import android.view.MenuItem
@@ -53,6 +54,8 @@ class LauncherActivity : Activity(), LauncherObserver {
onGameListChange()
val listView = findViewById<ListView>(R.id.list)
listView.emptyView = findViewById(R.id.empty)
findViewById<TextView>(R.id.usage).text = Html.fromHtml(getString(R.string.usage))
listView.setOnItemClickListener { _, _, position, _ ->
onListItemClick(position)
}
@@ -75,23 +78,15 @@ class LauncherActivity : Activity(), LauncherObserver {
}
private fun onListItemClick(position: Int) {
if (position < launcher.games.size) {
startGame(launcher.games[position].path, null)
} else {
val i = Intent(Intent.ACTION_GET_CONTENT)
i.type = CONTENT_TYPE_ZIP
startActivityForResult(Intent.createChooser(i, getString(R.string.choose_a_file)), INSTALL_REQUEST)
}
startGame(launcher.games[position].path, null)
}
private fun onItemLongClick(position: Int): Boolean {
if (position < launcher.games.size) {
AlertDialog.Builder(this).setTitle(R.string.uninstall_dialog_title)
.setMessage(getString(R.string.uninstall_dialog_message, launcher.games[position].title))
.setPositiveButton(R.string.ok) {_, _ -> uninstall(position)}
.setNegativeButton(R.string.cancel) {_, _ -> }
.show()
}
AlertDialog.Builder(this).setTitle(R.string.confirm)
.setMessage(getString(R.string.uninstall_dialog_message, launcher.games[position].title))
.setPositiveButton(R.string.ok) {_, _ -> uninstall(position)}
.setNegativeButton(R.string.cancel) {_, _ -> }
.show()
return true
}
@@ -102,6 +97,12 @@ class LauncherActivity : Activity(), LauncherObserver {
override fun onOptionsItemSelected(item: MenuItem): Boolean {
return when (item.itemId) {
R.id.install_from_zip -> {
val i = Intent(Intent.ACTION_GET_CONTENT)
i.type = CONTENT_TYPE_ZIP
startActivityForResult(Intent.createChooser(i, getString(R.string.choose_a_file)), INSTALL_REQUEST)
true
}
R.id.export_savedata -> {
val i = Intent(Intent.ACTION_CREATE_DOCUMENT)
i.type = CONTENT_TYPE_ZIP
@@ -116,6 +117,27 @@ class LauncherActivity : Activity(), LauncherObserver {
SAVEDATA_IMPORT_REQUEST)
true
}
R.id.clear_savedata -> {
AlertDialog.Builder(this)
.setTitle(R.string.confirm)
.setMessage(R.string.clear_save_data_confirm)
.setPositiveButton(R.string.ok) { _, _ ->
if (launcher.clearSaveData()) {
Toast.makeText(this, R.string.save_data_clear_success, Toast.LENGTH_SHORT).show()
} else {
errorDialog(R.string.save_data_clear_error)
}
}
.setNegativeButton(R.string.cancel, null)
.show()
true
}
R.id.help -> {
AlertDialog.Builder(this)
.setMessage(Html.fromHtml(getString(R.string.usage)))
.show()
true
}
R.id.licenses -> {
val intent = Intent(this, LicensesMenuActivity::class.java)
startActivity(intent)
@@ -157,7 +179,6 @@ class LauncherActivity : Activity(), LauncherObserver {
override fun onGameListChange() {
val items = launcher.titles.toMutableList()
items.add(getString(R.string.install_from_zip))
val listView = findViewById<ListView>(R.id.list)
listView.adapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, items)
}
@@ -13,6 +13,7 @@ class LicensesMenuActivity : Activity() {
Entry("SDL", "SDL", "https://www.libsdl.org/"),
Entry("SDL_mixer", "SDL_mixer", "https://github.com/libsdl-org/SDL_mixer"),
Entry("SDL_ttf", "SDL_ttf", "https://github.com/libsdl-org/SDL_ttf"),
Entry("NanoJPEG", "nanojpeg", "https://keyj.emphy.de/nanojpeg/"),
Entry("FreeType", "freetype", "https://freetype.org/"),
Entry("HarfBuzz", "harfbuzz", "https://harfbuzz.github.io/"),
Entry("MotoyaLCedar W3 mono", "MTLc3m", "https://github.com/aosp-mirror/platform_frameworks_base/tree/lollipop-release/data/fonts"),
@@ -60,8 +60,8 @@ import java.util.Locale;
public class SDLActivity extends Activity implements View.OnSystemUiVisibilityChangeListener {
private static final String TAG = "SDL";
private static final int SDL_MAJOR_VERSION = 2;
private static final int SDL_MINOR_VERSION = 30;
private static final int SDL_MICRO_VERSION = 12;
private static final int SDL_MINOR_VERSION = 32;
private static final int SDL_MICRO_VERSION = 10;
/*
// Display InputType.SOURCE/CLASS of events and devices
//
@@ -790,6 +790,9 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh
window.clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
SDLActivity.mFullscreenModeActive = false;
}
if (Build.VERSION.SDK_INT >= 28 /* Android 9 (Pie) */) {
window.getAttributes().layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
}
}
} else {
Log.e(TAG, "error handling message, getContext() returned no Activity");
@@ -6,4 +6,12 @@
<ListView android:id="@+id/list"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<ScrollView android:id="@+id/empty"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView android:id="@+id/usage"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:padding="20dp" />
</ScrollView>
</LinearLayout>
@@ -1,11 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/install_from_zip"
android:title="@string/action_install_from_zip" />
<item
android:id="@+id/export_savedata"
android:title="@string/action_export_save_data" />
<item
android:id="@+id/import_savedata"
android:title="@string/action_import_save_data" />
<item
android:id="@+id/clear_savedata"
android:title="@string/action_clear_save_data" />
<item
android:id="@+id/help"
android:title="@string/action_help" />
<item
android:id="@+id/licenses"
android:title="@string/action_licenses" />
+24 -2
View File
@@ -2,21 +2,43 @@
<resources>
<string name="app_name">xsystem35</string>
<string name="action_export_save_data">セーブデータをエクスポート</string>
<string name="action_help">使い方</string>
<string name="action_import_save_data">セーブデータをインポート</string>
<string name="action_install_from_zip">ZIPからインストール</string>
<string name="action_licenses">オープンソースライセンス</string>
<string name="action_clear_save_data">セーブデータをクリア</string>
<string name="cancel">キャンセル</string>
<string name="cannot_find_ald">System 3.x のファイル (*.ald) が見つかりません。</string>
<string name="choose_a_file">ファイルを選択</string>
<string name="clear_save_data_confirm">セーブデータをすべて削除します。元には戻せません。本当によろしいですか?</string>
<string name="confirm">確認</string>
<string name="error_dialog_title">エラー</string>
<string name="install_dialog_title">インストール中…</string>
<string name="install_from_zip">ZIP からインストール</string>
<string name="install_progress">%s を展開中</string>
<string name="no_data_to_import">ZIP アーカイブ中に save/ フォルダが見つかりません。</string>
<string name="save_data_export_error">セーブデータのエクスポートに失敗しました。</string>
<string name="save_data_export_success">エクスポートに成功しました。</string>
<string name="save_data_import_success">インポートに成功しました。</string>
<string name="save_data_clear_success">セーブデータをクリアしました。</string>
<string name="save_data_clear_error">セーブデータのクリアに失敗しました。</string>
<string name="uninstall_dialog_message">「%s」をアンインストールしますか?</string>
<string name="uninstall_dialog_title">確認</string>
<string name="unsupported_zip">この形式の ZIP はサポートしていません。</string>
<string name="zip_extraction_error">ZIP の展開に失敗しました。</string>
<string name="usage">
<![CDATA[
<h1>ゲームのインストール方法</h1>
<p>1. PC上で、ゲームのファイルが入ったZIPを用意します。例えば以下のようなファイルを含めます:</p>
<div>
・鬼畜王SA.ALD<br>
・鬼畜王GA.ALD<br>
・鬼畜王GB.ALD<br>
・鬼畜王WA.ALD<br>
・02.mp3<br>
・03.mp3<br>
・…<br>
</div>
<p>2. ZIPファイルを (例えばUSB経由で) PCからデバイスに転送します。</p>
<p>3. この画面の右上のメニューボタンをタップして「ZIPからインストール」を選択し、転送したZIPを選びます。</p>
]]>
</string>
</resources>
+25 -2
View File
@@ -1,22 +1,45 @@
<resources>
<string name="app_name">xsystem35</string>
<string name="action_clear_save_data">Clear Save Files</string>
<string name="action_export_save_data">Export Save Files</string>
<string name="action_help">Help</string>
<string name="action_import_save_data">Import Save Files</string>
<string name="action_install_from_zip">Install from ZIP</string>
<string name="action_licenses">Open source licenses</string>
<string name="cancel">Cancel</string>
<string name="cannot_find_ald">Cannot find System 3.x game files (*.ald).</string>
<string name="choose_a_file">Choose a file</string>
<string name="clear_save_data_confirm">Are you sure you want to clear all save files? This cannot be undone.</string>
<string name="confirm">Confirm</string>
<string name="error_dialog_title">Error</string>
<string name="install_dialog_title">Installing…</string>
<string name="install_from_zip">Install from ZIP</string>
<string name="install_progress">Extracting %s</string>
<string name="no_data_to_import">No save/ folder in the ZIP archive.</string>
<string name="ok">OK</string>
<string name="save_data_clear_error">Failed to clear save files.</string>
<string name="save_data_clear_success">Save files cleared.</string>
<string name="save_data_export_error">Failed to export save files.</string>
<string name="save_data_import_success">Imported successfully.</string>
<string name="save_data_export_success">Exported successfully.</string>
<string name="uninstall_dialog_message">Uninstall \"%s\"?</string>
<string name="uninstall_dialog_title">Confirm</string>
<string name="unsupported_zip">This type of ZIP is not supported.</string>
<string name="zip_extraction_error">Failed to extract ZIP.</string>
<string name="usage">
<![CDATA[
<h1>How to install a game</h1>
<p>1. On your PC, prepare a ZIP containing the game files. For example, it should contain the following files:</p>
<div>
* KICHIKUSA.ALD<br>
* KICHIKUGA.ALD<br>
* KICHIKUGB.ALD<br>
* KICHIKUWA.ALD<br>
* System39.ain<br>
* 02.mp3<br>
* 03.mp3<br>
* …<br>
</div>
<p>2. Transfer the ZIP file from your PC to the device (e.g. via USB).</p>
<p>3. Tap the menu button at the upper-right of this screen, select &quot;Install from ZIP,&quot; and choose the ZIP you transferred.</p>
]]>
</string>
</resources>
+7 -1
View File
@@ -30,7 +30,8 @@ finds System 3.x game files (*.ALD) from the current directory.
*-game* _game_::
Enables game-specific hacks. Usually auto-detected, but must be specified for
games with modified / translated titles. Possible values are: `toushin2`,
`rance3_eng`, `rance4_eng`, `rance4_v2`, `persiom`, `agake`.
`rance2`, `rance3`, `rance3_eng`, `rance4_eng`, `rance4_v2`, `persiom`,
`agake`.
*-savedir* _dir_::
Directory to save game state files. If _dir_ begins with '~', it is expanded
@@ -48,6 +49,11 @@ finds System 3.x game files (*.ALD) from the current directory.
Suppress text hook on specified scenario pages. _list_ is a comma-separated
list of page numbers. Used to suppress system messages, etc.
*-censor* _file_::
Enable Streamer Mode, which mosaics specific images to make them safe for
streaming. The _file_ is a text file containing a list of image numbers
to censor, one per line. Lines starting with '#' are treated as comments.
*-renderer* _name_::
Use the SDL rendering driver named _name_.
-2
View File
@@ -1,8 +1,6 @@
install(FILES
MTLc3m.ttf
MTLc3m.ttf.license
mincho.otf
mincho.otf.license
DESTINATION share/xsystem35/fonts)
# pyftsubset is included in fonttools.
+2
View File
@@ -58,6 +58,8 @@ Game Compatibility
| 妻みぐい2 | Supported | |
| シェル・クレイル | Supported | |
| ナイトデーモン | Supported | |
| Nor | Unsupported | |
| 翡翠の眸 | Unsupported | |
| 学園KING | Supported | From アリスCD |
| 学園KING 番外編 | Supported | From アリスCD |
| 蒼海に墜ちて | Supported | From アリスCD |
+22
View File
@@ -0,0 +1,22 @@
// NanoJPEG -- KeyJ's Tiny Baseline JPEG Decoder
// version 1.3.5 (2016-11-14)
// Copyright (c) 2009-2016 Martin J. Fiedler <martin.fiedler@gmx.net>
// published under the terms of the MIT license
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to
// deal in the Software without restriction, including without limitation the
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
// sell copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
+21
View File
@@ -0,0 +1,21 @@
# Censor Lists for Streamer Mode
This directory contains sample censor lists for various games, intended for use
with xsystem35's Streamer Mode.
## Usage
To use a censor list, specify its path with the `-censor` command-line option
or in your `.xsys35rc` file. For example:
```bash
xsystem35 -censor misc/censor/kichikuou.txt
```
The list files contain image numbers (integers), one per line. Lines starting
with `#` are treated as comments.
## Contributing
We welcome contributions of censor lists for other games! If you have created
a censor list that you'd like to share, please open a Pull Request.
+164
View File
@@ -0,0 +1,164 @@
# Censor list for 鬼畜王ランス (Kichikuou Rance)
27
70
93
101
102
103
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
123
124
125
126
127
128
129
130
131
132
133
134
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
160
161
162
163
164
165
166
167
168
169
171
172
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
193
195
196
197
198
199
200
201
203
204
205
206
207
208
209
210
214
215
216
217
218
219
221
222
224
225
226
227
228
229
230
231
232
233
234
235
239
299
300
361
362
363
375
376
377
393
422
461
466
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
517
844
845
846
847
848
851
852
853
854
855
+4 -4
View File
@@ -33,7 +33,7 @@
#include "ags.h"
#include "pms.h"
#include "qnt.h"
#include "sdl_core.h"
#include "gfx.h"
#include "ngraph.h"
#include "dri.h"
#include "ald_manager.h"
@@ -73,21 +73,21 @@ static surface_t *sf_getcg(void *b, size_t size) {
cg->alpha = cg->pic;
cg->pic = NULL;
sf = sf_create_alpha(cg->width, cg->height);
sdl_drawImageAlphaMap(cg, sf, 0, 0);
gfx_drawImageAlphaMap(cg, sf, 0, 0);
break;
case ALCG_PMS16:
cg = pms64k_extract(b);
sf = cg->alpha
? sf_create_surface(cg->width, cg->height)
: sf_create_pixel(cg->width, cg->height);
sdl_drawImage16(cg, sf, 0, 0, 255, false);
gfx_drawImage16(cg, sf, 0, 0, 255, false);
break;
case ALCG_QNT:
cg = qnt_extract(b);
sf = cg->alpha
? sf_create_surface(cg->width, cg->height)
: sf_create_pixel(cg->width, cg->height);
sdl_drawImage24(cg, sf, 0, 0, 255);
gfx_drawImage24(cg, sf, 0, 0, 255);
break;
default:
WARNING("Unknown Cg Type");
+5 -5
View File
@@ -5,7 +5,7 @@
#include "portab.h"
#include "system.h"
#include "surface.h"
#include "sdl_core.h"
#include "effect.h"
#include "ags.h"
#include "input.h"
#include "graph.h"
@@ -24,17 +24,17 @@ void gpx_effect(int no,
*endtype = 0;
enum sdl_effect_type type = from_sact_effect(no);
enum effect_type type = from_sact_effect(no);
if (type == EFFECT_INVALID) {
WARNING("Unimplemented effect %d", no);
type = EFFECT_CROSSFADE;
}
SDL_Rect rect = { wx, wy, width, height };
struct sdl_effect *eff = sdl_effect_init(&rect, dst, dx, dy, src, sx, sy, type);
struct effect *eff = effect_init(&rect, dst, dx, dy, src, sx, sy, type);
if (!time)
time = (no == SACT_EFFECT_CROSSFADE_DOWN || no == SACT_EFFECT_CROSSFADE_UP) ? 1150 : 2700;
ags_runEffect(time, false, (ags_EffectStepFunc)sdl_effect_step, eff);
sdl_effect_finish(eff);
ags_runEffect(time, false, (ags_EffectStepFunc)effect_step, eff);
effect_finish(eff);
switch (no) {
case SACT_EFFECT_FADEOUT:
+4 -4
View File
@@ -11,7 +11,7 @@
#include "graph.h"
#include "ngraph.h"
#include "ags.h"
#include "sdl_core.h"
#include "gfx.h"
/**
* surface から surface にコピーなどをする際に、転送元と転送先のsurface
@@ -33,8 +33,8 @@
*/
bool gr_clip(surface_t *ss, int *sx, int *sy, int *sw, int *sh, surface_t *ds, int *dx, int *dy) {
if (!ss || !ds) return false;
MyRectangle src_window = { 0, 0, ss->width, ss->height };
MyRectangle dst_window = { 0, 0, ds->width, ds->height };
SDL_Rect src_window = { 0, 0, ss->width, ss->height };
SDL_Rect dst_window = { 0, 0, ds->width, ds->height };
return ags_clipCopyRect(&src_window, &dst_window, sx, sy, dx, dy, sw, sh);
}
@@ -75,7 +75,7 @@ void gr_copy(surface_t *dst, int dx, int dy, surface_t *src, int sx, int sy, int
if (dst == src) {
SDL_Rect r;
if (SDL_IntersectRect(&src_rect, &dst_rect, &r)) {
SDL_Surface *view = sdl_createSurfaceView(src->sdl_surface, sx, sy, sw, sh);
SDL_Surface *view = gfx_createSurfaceView(src->sdl_surface, sx, sy, sw, sh);
SDL_Surface *tmp = SDL_ConvertSurface(view, dst->sdl_surface->format, 0);
src_rect.x = 0;
src_rect.y = 0;
+1 -2
View File
@@ -3,7 +3,6 @@
#include "config.h"
#include "portab.h"
#include "graphics.h"
#include "ags.h"
#include "sprite.h"
@@ -42,7 +41,7 @@ struct _night {
// graph
// cginfo_t *cg[CGMAX];
MyRectangle updaterect;
SDL_Rect updaterect;
FontType fonttype;
int fontsize;
+2 -2
View File
@@ -53,8 +53,8 @@ void nt_gr_set_wallpaper(int no) {
sp = nt_sp_new(SPNO_WALL, no, 0, 0, SPRITE_WP);
nt_sp_add_updatelist(sp);
if (no == 0) {
sp->cursize.width = main_surface->w;
sp->cursize.height = main_surface->h;
sp->width = main_surface->w;
sp->height = main_surface->h;
sp->update = nt_sp_draw_wall;
}
+13 -14
View File
@@ -7,7 +7,6 @@
#include "portab.h"
#include "system.h"
#include "sdl_core.h"
#include "utfsjis.h"
#include "ags.h"
#include "nact.h"
@@ -217,7 +216,7 @@ static void ntmsg_out(int wNum, int wSize, int wColorR, int wColorG, int wColorB
char *msg;
sprite_t *sp;
bool needupdate = false;
MyRectangle uparea = {0,0,0,0};
SDL_Rect uparea = {0,0,0,0};
int savex;
if (night.msgbuf[0] == '\0') return;
@@ -236,7 +235,7 @@ static void ntmsg_out(int wNum, int wSize, int wColorR, int wColorG, int wColorB
char mbuf[20];
int cw, delta, wcnt;
wcnt = sdl_getTicks();
wcnt = sys_get_ticks();
mbuf[0] = '\0';
msg = get_char(msg, mbuf, sizeof(mbuf) -1);
@@ -267,7 +266,7 @@ static void ntmsg_out(int wNum, int wSize, int wColorR, int wColorG, int wColorB
needupdate = false;
// keywait
delta = sdl_getTicks() - wcnt;
delta = sys_get_ticks() - wcnt;
if (delta < wSpeed) {
if (sys_keywait(wSpeed - delta, KEYWAIT_NONCANCELABLE)) {
@@ -284,8 +283,8 @@ static void ntmsg_out(int wNum, int wSize, int wColorR, int wColorG, int wColorB
// Waitなしの出力は最後にupdate
if (needupdate) {
uparea.w = sp->cursize.width;
uparea.h = min(sp->cursize.height, uparea.y - sp->u.msg.dspcur.y + wLineSpace + wLineSpace);
uparea.w = sp->width;
uparea.h = min(sp->height, uparea.y - sp->u.msg.dspcur.y + wLineSpace + wLineSpace);
nt_sp_updateme_part(sp, uparea.x, uparea.y, uparea.w, uparea.h);
}
@@ -311,14 +310,14 @@ static int ntmsg_keywait() {
night.waitkey = -1;
while (night.waitkey == -1 && !nact->is_quit) {
int st = sdl_getTicks();
int st = sys_get_ticks();
int interval = 25;
if (!night.zhiding) {
interval = night.sp[SPNO_MSG_KEYANIM]->u.anime.interval;
hakanim(i++);
}
sys_keywait(interval - (sdl_getTicks() - st), KEYWAIT_NONCANCELABLE);
sys_keywait(interval - (sys_get_ticks() - st), KEYWAIT_NONCANCELABLE);
}
night.waittype = KEYWAIT_NONE;
@@ -355,8 +354,8 @@ static void set_align(char *msg, sprite_t *sp, int wSize) {
maxchar = max(maxchar, c);
line++;
sp->u.msg.dspcur.x = (sp->cursize.width - (maxchar * wSize/2)) /2;
sp->u.msg.dspcur.y = (sp->cursize.height - (line * (wSize+2))) /2;
sp->u.msg.dspcur.x = (sp->width - (maxchar * wSize/2)) /2;
sp->u.msg.dspcur.y = (sp->height - (line * (wSize+2))) /2;
break;
case 2:
sp->u.msg.dspcur.x = msgframe_2.x;
@@ -436,14 +435,14 @@ static void hakanim(int i) {
sp->show = show;
}
void ntmsg_update(sprite_t *sp, MyRectangle *r) {
SDL_Rect sp_rect = {0, 0, sp->cursize.width, sp->cursize.height};
void ntmsg_update(sprite_t *sp, SDL_Rect *r) {
SDL_Rect sp_rect = {0, 0, sp->width, sp->height};
int sx = 0;
int sy = 0;
int dx = sp->cur.x;
int dy = sp->cur.y;
int w = sp->cursize.width;
int h = sp->cursize.height;
int w = sp->width;
int h = sp->height;
if (!ags_clipCopyRect(&sp_rect, r, &sx, &sy, &dx, &dy, &w, &h)) {
return;
}
+1 -1
View File
@@ -7,6 +7,6 @@ void ntmsg_set_place(int type);
void ntmsg_newline();
void ntmsg_add(const char *msg);
int ntmsg_ana(void);
void ntmsg_update(sprite_t *sp, MyRectangle *r);
void ntmsg_update(sprite_t *sp, SDL_Rect *r);
#endif /* __NT_MSG_H__ */
-1
View File
@@ -8,7 +8,6 @@
#include "portab.h"
#include "system.h"
#include "input.h"
#include "sdl_core.h"
#include "scheduler.h"
#include "xsystem35.h"
#include "nact.h"
+10 -10
View File
@@ -28,11 +28,11 @@ sprite_t *nt_sp_new(int no, int cg1, int cg2, int cg3, int type) {
sp->cur = sp->loc;
if (sp->curcg == NULL) {
sp->cursize.width = 0;
sp->cursize.height = 0;
sp->width = 0;
sp->height = 0;
} else {
sp->cursize.width = sp->curcg->sf->w;
sp->cursize.height = sp->curcg->sf->h;
sp->width = sp->curcg->sf->w;
sp->height = sp->curcg->sf->h;
}
sp->update = DEFAULT_UPDATE;
@@ -58,8 +58,8 @@ sprite_t *nt_sp_msg_new(int no, int x, int y, int width, int height) {
sp->loc.x = x;
sp->loc.y = y;
sp->cur = sp->loc;
sp->cursize.width = width;
sp->cursize.height = height;
sp->width = width;
sp->height = height;
sp->u.msg.dspcur.x = 0;
sp->u.msg.dspcur.y = 0;
sp->u.msg.canvas = SDL_CreateRGBSurfaceWithFormat(0, width, height, 32, SDL_PIXELFORMAT_ARGB8888);
@@ -107,11 +107,11 @@ void nt_sp_set_cg(sprite_t *sp, int no) {
cg = no ? nt_scg_addref(no) : NULL;
if (cg == NULL) {
sp->cursize.width = 0;
sp->cursize.height = 0;
sp->width = 0;
sp->height = 0;
} else {
sp->cursize.width = cg->sf->w;
sp->cursize.height = cg->sf->h;
sp->width = cg->sf->w;
sp->height = cg->sf->h;
}
sp->curcg = cg;
+10 -9
View File
@@ -3,7 +3,7 @@
#define __SPRITE_H__
#include "portab.h"
#include "graphics.h"
#include <SDL_rect.h>
#define DEFAULT_UPDATE nt_sp_draw
@@ -72,7 +72,8 @@ struct _sprite {
int no;
MyDimension cursize;
int width;
int height;
cginfo_t *curcg;
cginfo_t *cg1, *cg2, *cg3;
@@ -81,11 +82,11 @@ struct _sprite {
int blendrate;
MyPoint loc;
SDL_Point loc;
MyPoint cur;
SDL_Point cur;
void (* update)(struct _sprite *sp, MyRectangle *updatearea);
void (* update)(struct _sprite *sp, SDL_Rect *updatearea);
union {
struct {
@@ -97,7 +98,7 @@ struct _sprite {
struct {
struct SDL_Surface *canvas;
MyPoint dspcur;
SDL_Point dspcur;
} msg;
} u;
};
@@ -120,12 +121,12 @@ void nt_sp_updateme(sprite_t *sp);
void nt_sp_updateme_part(sprite_t *sp, int x, int y, int w, int h);
void nt_sp_add_updatelist(sprite_t *sp);
void nt_sp_remove_updatelist(sprite_t *sp);
void nt_sp_draw_wall(sprite_t *sp, MyRectangle *r);
void nt_sp_draw_wall(sprite_t *sp, SDL_Rect *r);
void nt_sp_clear_updatelist(void);
/* in nt_sprite_draw.c */
void nt_sp_draw(sprite_t *sp, MyRectangle *r);
void nt_sp_draw_scg(sprite_t *sp, MyRectangle *r);
void nt_sp_draw(sprite_t *sp, SDL_Rect *r);
void nt_sp_draw_scg(sprite_t *sp, SDL_Rect *r);
/* in nt_sprite_eupdate.c */
void nt_sp_eupdate(int type, int time, int cancel);
+2 -3
View File
@@ -29,7 +29,6 @@
#include "portab.h"
#include "system.h"
#include "ags.h"
#include "graphics.h"
#include "sprite.h"
/*
@@ -37,7 +36,7 @@
@param sp: 描画するスプライト
@param r : 再描画する領域
*/
void nt_sp_draw(sprite_t *sp, MyRectangle *r) {
void nt_sp_draw(sprite_t *sp, SDL_Rect *r) {
if (sp == NULL) return;
cginfo_t *cg = sp->curcg;
if (cg == NULL) return;
@@ -69,7 +68,7 @@ void nt_sp_draw(sprite_t *sp, MyRectangle *r) {
}
// BlendScreenによる描画
void nt_sp_draw_scg(sprite_t *sp, MyRectangle *r) {
void nt_sp_draw_scg(sprite_t *sp, SDL_Rect *r) {
if (sp == NULL) return;
cginfo_t *cg = sp->curcg;
if (cg == NULL) return;
+9 -8
View File
@@ -28,7 +28,8 @@
#include "ags.h"
#include "input.h"
#include "sprite.h"
#include "sdl_core.h"
#include "gfx.h"
#include "effect.h"
/*
効果つき画面更新
@@ -44,25 +45,25 @@ void nt_sp_eupdate(int no, int time, int cancel) {
nt_sp_update_all(false);
enum sdl_effect_type type = from_sact_effect(no - 100);
enum effect_type type = from_sact_effect(no - 100);
if (type == EFFECT_INVALID) {
WARNING("Unimplemented effect %d", no);
type = EFFECT_CROSSFADE;
}
SDL_Rect rect = { 0, 0, main_surface->w, main_surface->h };
struct sdl_effect *eff = sdl_effect_init(&rect, NULL, 0, 0, sdl_getDIB(), 0, 0, type);
struct effect *eff = effect_init(&rect, NULL, 0, 0, gfx_getDIB(), 0, 0, type);
int sttime, curtime;
sttime = curtime = sdl_getTicks();
sttime = curtime = sys_get_ticks();
int edtime = curtime + time;
while ((curtime = sdl_getTicks()) < edtime) {
sdl_effect_step(eff, (float)(curtime - sttime) / (edtime - sttime));
int rest = 16 - (sdl_getTicks() - curtime);
while ((curtime = sys_get_ticks()) < edtime) {
effect_step(eff, (float)(curtime - sttime) / (edtime - sttime));
int rest = 16 - (sys_get_ticks() - curtime);
int key = sys_keywait(rest, cancel ? KEYWAIT_CANCELABLE : KEYWAIT_NONCANCELABLE);
if (cancel && key)
break;
}
sdl_effect_finish(eff);
effect_finish(eff);
ags_updateFull();
}
+18 -19
View File
@@ -31,7 +31,6 @@
#include "system.h"
#include "list.h"
#include "ags.h"
#include "graphics.h"
#include "sprite.h"
// スプライト再描画間の間に変更のあったスプライトの領域の和
@@ -41,22 +40,22 @@ static SList *updatearea;
static SList *updatelist;
static void disjunction(void* region, void* data);
static MyRectangle get_updatearea();
static SDL_Rect get_updatearea();
static void do_update_each(void* data, void* userdata);
// 領域1と領域2をすべて含む矩形領域を計算
static void disjunction(void* region, void* data) {
MyRectangle *r1 = (MyRectangle *)region;
MyRectangle *r2 = (MyRectangle *)data;
SDL_Rect *r1 = (SDL_Rect *)region;
SDL_Rect *r2 = (SDL_Rect *)data;
SDL_UnionRect(r1, r2, r2);
free(r1);
}
// 更新の必要なスプライトの領域の和をとってクリッピングする
static MyRectangle get_updatearea() {
MyRectangle clip = {0, 0, 0, 0};
MyRectangle screen = {0, 0, main_surface->w, main_surface->h};
MyRectangle result;
static SDL_Rect get_updatearea() {
SDL_Rect clip = {0, 0, 0, 0};
SDL_Rect screen = {0, 0, main_surface->w, main_surface->h};
SDL_Rect result;
slist_foreach(updatearea, disjunction, &clip);
@@ -75,7 +74,7 @@ static MyRectangle get_updatearea() {
// updatelist に登録してあるすべてのスプライトを更新
static void do_update_each(void* data, void* userdata) {
sprite_t *sp = (sprite_t *)data;
MyRectangle *r = (MyRectangle *)userdata;
SDL_Rect *r = (SDL_Rect *)userdata;
// 非表示の場合はなにもしない
if (!sp->show) return;
@@ -92,7 +91,7 @@ static void do_update_each(void* data, void* userdata) {
*/
void nt_sp_update_all(bool syncscreen) {
// 画面全体を更新領域に
MyRectangle r = {0, 0, main_surface->w, main_surface->h };
SDL_Rect r = {0, 0, main_surface->w, main_surface->h };
// updatelistに登録してあるスプライトを再描画
// updatelistはスプライトの番号順に並んでいる
@@ -111,7 +110,7 @@ void nt_sp_update_all(bool syncscreen) {
updateme(_part)で登録した更新が必要なspriteの和の領域をupdate
*/
void nt_sp_update_clipped() {
MyRectangle r;
SDL_Rect r;
// 更新領域の確定
r = get_updatearea();
@@ -131,16 +130,16 @@ void nt_sp_update_clipped() {
@param sp: 更新するスプライト
*/
void nt_sp_updateme(sprite_t *sp) {
MyRectangle *r;
SDL_Rect *r;
if (sp == NULL) return;
if (sp->cursize.width == 0 || sp->cursize.height == 0) return;
if (sp->width == 0 || sp->height == 0) return;
r = malloc(sizeof(MyRectangle));
r = malloc(sizeof(SDL_Rect));
r->x = sp->cur.x;
r->y = sp->cur.y;
r->w = sp->cursize.width;
r->h = sp->cursize.height;
r->w = sp->width;
r->h = sp->height;
updatearea = slist_append(updatearea, r);
@@ -157,12 +156,12 @@ void nt_sp_updateme(sprite_t *sp) {
@param h: 更新領域高さ
*/
void nt_sp_updateme_part(sprite_t *sp, int x, int y, int w, int h) {
MyRectangle *r;
SDL_Rect *r;
if (sp == NULL) return;
if (w == 0 || h == 0) return;
r = malloc(sizeof(MyRectangle));
r = malloc(sizeof(SDL_Rect));
r->x = sp->cur.x + x;
r->y = sp->cur.y + y;
r->w = w;
@@ -204,6 +203,6 @@ void nt_sp_clear_updatelist(void) {
}
// デフォルトの壁紙update
void nt_sp_draw_wall(sprite_t *sp, MyRectangle *area) {
void nt_sp_draw_wall(sprite_t *sp, SDL_Rect *area) {
SDL_FillRect(main_surface, area, SDL_MapRGB(main_surface->format, 0, 0, 0));
}
+5 -5
View File
@@ -32,7 +32,7 @@
#include "nact.h"
#include "alk.h"
#include "music.h"
#include "sdl_core.h"
#include "gfx.h"
#include "input.h"
#include "cg.h"
#include "jpeg.h"
@@ -52,9 +52,9 @@ static void ndd_run(int demonum) {
if (mus)
musbgm_play(mus, 0, 100, 0);
uint32_t start = sdl_getTicks();
uint32_t start = sys_get_ticks();
while (!nact->is_quit) {
int i = (sdl_getTicks() - start) / (1000 / FPS);
int i = (sys_get_ticks() - start) / (1000 / FPS);
if (i >= alk->datanum)
break;
@@ -69,12 +69,12 @@ static void ndd_run(int demonum) {
WARNING("Cannot decode CG %d in %s", i, alk_path);
}
int wait_ms = (i + 1) * (1000 / FPS) - (sdl_getTicks() - start);
int wait_ms = (i + 1) * (1000 / FPS) - (sys_get_ticks() - start);
if (wait_ms > 0) {
if (sys_keywait(wait_ms, KEYWAIT_CANCELABLE))
break;
} else {
sdl_updateScreen();
gfx_updateScreen();
if (sys_getInputInfo())
break;
}
+12 -12
View File
@@ -25,10 +25,9 @@
#define __SACT_H__
#include "config.h"
#include <SDL_rect.h>
#include "portab.h"
#include "list.h"
#include "graphics.h"
#include "ags.h"
#include "sacttimer.h"
#include "variable.h"
@@ -107,7 +106,8 @@ struct _sprite {
int numsound1, numsound2, numsound3;
// 初期 sprite の大きさ(cg1の大きさ)
MyDimension cursize;
int width;
int height;
// それぞれの状態で表示する CG
cginfo_t *cg1, *cg2, *cg3;
@@ -126,10 +126,10 @@ struct _sprite {
int freezed_state;
// 表示位置 (SetPos)
MyPoint loc;
SDL_Point loc;
// 現在のスプライトの表示位置
MyPoint cur;
SDL_Point cur;
// event callback
int (* eventcb)(struct _sprite *sp, agsevent_t *e); // for key/mouse
@@ -146,7 +146,7 @@ struct _sprite {
// move command 用パラメータ
struct {
MyPoint to; // 移動先
SDL_Point to; // 移動先
int time; // 移動完了時間
int speed; // 移動速度
int starttime; // 移動開始時刻
@@ -157,7 +157,7 @@ struct _sprite {
// SACT.Numeral用パラメータ
struct {
int cg[10];
MyPoint pos;
SDL_Point pos;
int span;
} numeral;
@@ -171,7 +171,7 @@ struct _sprite {
// ゲットスプライト
struct {
bool dragging; // ドラッグ中
MyPoint dragstart; // ドラッグ開始位置
SDL_Point dragstart; // ドラッグ開始位置
} get;
// プットスプライト
@@ -191,7 +191,7 @@ struct _sprite {
struct {
SList *buf; // 表示する文字のリスト
struct SDL_Surface *canvas;
MyPoint dspcur; // 現在の表示位置
SDL_Point dspcur; // 現在の表示位置
} msg;
} u;
};
@@ -213,7 +213,7 @@ struct _sact {
cginfo_t *cg[CGMAX]; // cgまたはCG_xxで作った CG
// 座標系の原点
MyPoint origin;
SDL_Point origin;
// 文字列 replce 用
SList *strreplace;
@@ -247,7 +247,7 @@ struct _sact {
int movestarttime; // 一斉に移動を開始するための開始時間
int movecurtime;
MyRectangle updaterect; // 更新が必要なspriteの領域の和
SDL_Rect updaterect; // 更新が必要なspriteの領域の和
// sact timer
stimer_t timer[65536];
@@ -281,7 +281,7 @@ struct _sact {
// バックログ
bool logging;
List *log;
List *log; // UTF-8 strings
};
typedef struct _sact sact_t;
+5 -5
View File
@@ -34,7 +34,7 @@
#include "sact.h"
#include "pms.h"
#include "sprite.h"
#include "sdl_core.h"
#include "effect.h"
#include "mmap.h"
// SACTEFAM を使ったマスク
@@ -91,10 +91,10 @@ void sp_eupdate_amap(int index, int time, int cancel) {
return;
}
SDL_Surface *mask_sf = SDL_CreateRGBSurfaceFrom(mask->pic, mask->width, mask->height, 8, mask->width, 0, 0, 0, 0);
sp_update_all(false); // old = sdl_texture, new = main_surface
struct sdl_effect *eff = sdl_effect_sactamask_init(mask_sf);
ags_runEffect(time * 10, cancel, (ags_EffectStepFunc)sdl_effect_step, eff);
sdl_effect_finish(eff);
sp_update_all(false); // old = gfx_texture, new = main_surface
struct effect *eff = effect_sactamask_init(mask_sf);
ags_runEffect(time * 10, cancel, (ags_EffectStepFunc)effect_step, eff);
effect_finish(eff);
ags_updateFull();
SDL_FreeSurface(mask_sf);
+4 -4
View File
@@ -36,7 +36,7 @@
#include "sact.h"
#include "sactcg.h"
#include "cg.h"
#include "sdl_core.h"
#include "gfx.h"
#define SPCG_ASSERT_NO(no) \
if ((no) > (CGMAX -1)) { \
@@ -118,9 +118,9 @@ void scg_create_reverse(int wNumCG, int wNumSrcCG, int wReverseX, int wReverseY)
SDL_Surface *sf = SDL_ConvertSurface(src->sf, src->sf->format, 0);
if (wReverseX)
sdl_FlipSurfaceHorizontal(sf);
gfx_FlipSurfaceHorizontal(sf);
if (wReverseY)
sdl_FlipSurfaceVertical(sf);
gfx_FlipSurfaceVertical(sf);
scg_new(CG_REVERSE, wNumCG, sf);
}
@@ -175,7 +175,7 @@ static SDL_Surface *blend(SDL_Surface *base, int x, int y, SDL_Surface *blend, i
} else if (alpha == 255) {
memcpy(dstpp + 1, srcpp + 1, 3);
} else {
for (int 1 = 0; k < 4; k++) {
for (int k = 1; k < 4; k++) {
dstpp[k] = (dstpp[k] * (255 - alpha) + srcpp[k] * alpha) / 255;
}
}
+17 -19
View File
@@ -36,12 +36,13 @@
#include "nact.h"
#include "sact.h"
#include "sprite.h"
#include "drawtext.h"
#include "utfsjis.h"
#include "gfx.h"
#include "ags.h"
#include "font.h"
#define LOGMSG_LINES 6
static const char *logmsg_utf8[LOGMSG_LINES] = {
static char *logmsg[LOGMSG_LINES] = {
"\n",
"※バックログ操作方法※",
"[ESC]またはマウス右クリックでゲームに戻る",
@@ -56,7 +57,7 @@ static const char *logmsg_utf8[LOGMSG_LINES] = {
PageUP/Downで1ページ送り
*/
#define FONTSIZEINDEX 10
#define INDEX_FONTSIZE 10
#define FONTSIZE 20
#define LOGLINENUM (main_surface->h / FONTSIZE)
static int curline;
@@ -68,6 +69,10 @@ static void draw_log() {
char pinfo[256];
List *node;
#ifdef __EMSCRIPTEN__
load_mincho_font();
#endif
SDL_Surface *hline = SDL_CreateRGBSurfaceWithFormat(0, main_surface->w, 3, 32, SDL_PIXELFORMAT_RGB888);
SDL_FillRect(hline, NULL, SDL_MapRGB(hline->format, 255, 255, 255));
SDL_SetSurfaceBlendMode(hline, SDL_BLENDMODE_BLEND);
@@ -80,8 +85,8 @@ static void draw_log() {
// ページ位置情報
len = snprintf(pinfo, sizeof(pinfo) -1, "%d/%d", curline, list_length(sact.log));
dt_setfont(FONT_GOTHIC, FONTSIZEINDEX);
dt_drawtext_col(main_surface, main_surface->w - FONTSIZEINDEX *len /2, 0, pinfo, 255, 255, 255);
ags_setFont(FONT_GOTHIC, INDEX_FONTSIZE);
gfx_drawString(main_surface->w - INDEX_FONTSIZE * len / 2, 0, pinfo, 255);
// 表示始め位置
node = list_nth(sact.log, list_length(sact.log) - curline);
@@ -93,11 +98,11 @@ static void draw_log() {
SDL_BlitSurface(hline, NULL, main_surface, &(SDL_Rect){0, y + FONTSIZE/2, main_surface->w, 3});
} else {
if (cur < 6) {
dt_setfont(FONT_MINCHO, FONTSIZE);
ags_setFont(FONT_MINCHO, FONTSIZE);
} else {
dt_setfont(FONT_GOTHIC, FONTSIZE);
ags_setFont(FONT_GOTHIC, FONTSIZE);
}
dt_drawtext_col(main_surface, 0, y, str, 255, 255, 255);
gfx_drawString(0, y, str, 255);
}
y += FONTSIZE;
cur--;
@@ -113,13 +118,7 @@ bool sblog_start(void) {
if (sact.version < 120)
return false;
static char *logmsg[LOGMSG_LINES];
if (!logmsg[0]) {
for (int i = 0; i < LOGMSG_LINES; i++)
logmsg[i] = fromUTF8(logmsg_utf8[i]);
}
// 説明文章を追加
// Append instruction text
for (int i = 0; i < LOGMSG_LINES; i++)
sact.log = list_append(sact.log, logmsg[i]);
@@ -138,10 +137,9 @@ void sblog_end(void) {
SDL_FreeSurface(back);
// 説明文章を削除
// Remove instruction text
for (i = 0; i < LOGMSG_LINES; i++) {
node = list_last(sact.log);
sact.log = list_remove(sact.log, node->data);
sact.log = list_remove(sact.log, logmsg[i]);
}
}
+2 -3
View File
@@ -34,7 +34,6 @@
#include "input.h"
#include "sact.h"
#include "sprite.h"
#include "sdl_core.h"
#include "randMT.h"
#define M_PIf ((float)M_PI)
@@ -78,9 +77,9 @@ void sp_quake_screen(int type, int p1, int p2, int time, int cancel) {
if (type > 1) return;
sttime = sdl_getTicks();
sttime = sys_get_ticks();
edtime = time * 10 + sttime;
while ((curtime = sdl_getTicks()) < edtime) {
while ((curtime = sys_get_ticks()) < edtime) {
int adjx, adjy;
cb[type]((float)(curtime - sttime)/(edtime - sttime), p1, p2, &adjx, &adjy);
+11 -11
View File
@@ -145,11 +145,11 @@ void sp_new(int no, int cg1, int cg2, int cg3, int type) {
// cg1の大きさをスプライトの大きさとする
if (sp->curcg == NULL) {
sp->cursize.width = 0;
sp->cursize.height = 0;
sp->width = 0;
sp->height = 0;
} else {
sp->cursize.width = sp->curcg->sf->w;
sp->cursize.height = sp->curcg->sf->h;
sp->width = sp->curcg->sf->w;
sp->height = sp->curcg->sf->h;
}
sp->freezed_state = 0; // 状態固定は無し
@@ -201,8 +201,8 @@ void sp_new_msg(int no, int x, int y, int width, int height) {
sp->loc.y = y - sact.origin.y;
sp->u.msg.dspcur.x = 0; // 文字描画開始位置
sp->u.msg.dspcur.y = 0;
sp->cursize.width = width; // スプライトの大きさ
sp->cursize.height = height;
sp->width = width; // スプライトの大きさ
sp->height = height;
sp->cur = sp->loc;
sp->u.msg.buf = NULL;
@@ -224,10 +224,10 @@ void sp_set_wall_paper(int no) {
if (sp->curcg) { // display specified CG
sp->update = DEFAULT_UPDATE;
sp->cursize.width = sp->curcg->sf->w;
sp->cursize.height = sp->curcg->sf->h;
sp->width = sp->curcg->sf->w;
sp->height = sp->curcg->sf->h;
} else { // Black
sp->cursize.height = main_surface->h;
sp->height = main_surface->h;
sp->curcg = NULL;
sp->update = sp_draw_wall;
}
@@ -516,8 +516,8 @@ bool sp_query_size(int wNum, int *vw, int *vh) {
if (sp->type == SPRITE_NONE) goto errexit;
*vw = sp->cursize.width;
*vh = sp->cursize.height;
*vw = sp->width;
*vh = sp->height;
return true;
+2 -3
View File
@@ -28,7 +28,6 @@
#include "portab.h"
#include "system.h"
#include "ags.h"
#include "sdl_core.h"
#include "sact.h"
#include "sprite.h"
@@ -44,7 +43,7 @@ static int eventCB_ANIM(sprite_t *sp, agsevent_t *e) {
if (e->type != AGSEVENT_TIMER) return 0;
// 現在時刻の取得
now = sdl_getTicks();
now = sys_get_ticks();
// 指定時間までスキップ
if ((now - sp->u.anime.starttime) < sp->u.anime.interval) return 0;
@@ -85,7 +84,7 @@ void sp_anime_setup(sprite_t *sp) {
int n = 0;
sp->u.anime.interval = 500; // デフォルトの間隔 0.5秒
sp->u.anime.starttime = sdl_getTicks(); // 開始時刻
sp->u.anime.starttime = sys_get_ticks(); // 開始時刻
sp->u.anime.tick = 0; // カウンタ初期化
// アニメパターンはいくつあるか
-1
View File
@@ -31,7 +31,6 @@
#include "portab.h"
#include "system.h"
#include "ags.h"
#include "graphics.h"
#include "sact.h"
#include "sprite.h"
+10 -9
View File
@@ -29,7 +29,8 @@
#include "input.h"
#include "sact.h"
#include "sprite.h"
#include "sdl_core.h"
#include "gfx.h"
#include "effect.h"
/*
効果つき画面更新
@@ -45,25 +46,25 @@ void sp_eupdate(int type, int time, int cancel) {
sp_update_all(false);
enum sdl_effect_type sdl_effect = from_sact_effect(type);
if (sdl_effect == EFFECT_INVALID) {
enum effect_type effect = from_sact_effect(type);
if (effect == EFFECT_INVALID) {
WARNING("Unimplemented effect %d", type);
type = EFFECT_CROSSFADE;
}
SDL_Rect rect = { 0, 0, main_surface->w, main_surface->h };
struct sdl_effect *eff = sdl_effect_init(&rect, NULL, 0, 0, sdl_getDIB(), 0, 0, sdl_effect);
struct effect *eff = effect_init(&rect, NULL, 0, 0, gfx_getDIB(), 0, 0, effect);
int sttime, curtime;
sttime = curtime = sdl_getTicks();
sttime = curtime = sys_get_ticks();
int edtime = curtime + time * 10;
while ((curtime = sdl_getTicks()) < edtime) {
sdl_effect_step(eff, (float)(curtime - sttime) / (edtime - sttime));
int rest = 16 - (sdl_getTicks() - curtime);
while ((curtime = sys_get_ticks()) < edtime) {
effect_step(eff, (float)(curtime - sttime) / (edtime - sttime));
int rest = 16 - (sys_get_ticks() - curtime);
int key = sys_keywait(rest, cancel ? KEYWAIT_CANCELABLE : KEYWAIT_NONCANCELABLE);
if (cancel && key)
break;
}
sdl_effect_finish(eff);
effect_finish(eff);
ags_updateFull();
}
+2 -3
View File
@@ -30,7 +30,6 @@
#include "portab.h"
#include "system.h"
#include "sdl_core.h"
#include "menu.h"
#include "input.h"
#include "nact.h"
@@ -213,7 +212,7 @@ static void cb_waitkey_simple(agsevent_t *e) {
switch (e->type) {
case AGSEVENT_KEY_PRESS:
if (e->code == KEY_Z) {
cur = sdl_getTicks();
cur = sys_get_ticks();
if (!sact.zhiding) {
slist_foreach(sact.sp_zhide, cb_defocused_zkey, &update);
sact.zhiding = true;
@@ -243,7 +242,7 @@ static void cb_waitkey_simple(agsevent_t *e) {
case AGSEVENT_KEY_RELEASE:
switch(e->code) {
case KEY_Z:
cur = sdl_getTicks();
cur = sys_get_ticks();
if (500 < (cur - sact.zofftime) || !sact.zdooff) {
slist_foreach(sact.sp_zhide, cb_focused_zkey, &update);
sact.zhiding = false;
+3 -4
View File
@@ -29,7 +29,6 @@
#include "portab.h"
#include "system.h"
#include "list.h"
#include "sdl_core.h"
#include "ags.h"
#include "nact.h"
#include "input.h"
@@ -67,7 +66,7 @@ static void hidesprite(sprite_t *sp) {
スプライトがドロップされた時の各種処理を含む
*/
static bool waitcond(int endtime) {
int curtime = sdl_getTicks();
int curtime = sys_get_ticks();
if (curtime >= endtime) return true;
if (sact.dropped) {
@@ -133,7 +132,7 @@ void sp_keywait(int *vOK, int *vRND, int *vD01, int *vD02, int *vD03, int timeou
{
// とりあえず、現在のマウス位置を送って、switch sprite の
// 状態を更新しておく
MyPoint p;
SDL_Point p;
sys_getMouseInfo(&p, false);
agsevent_t agse = {
.type = AGSEVENT_MOUSE_MOTION,
@@ -144,7 +143,7 @@ void sp_keywait(int *vOK, int *vRND, int *vD01, int *vD02, int *vD03, int timeou
}
// 終了時間の計算
curtime = sdl_getTicks();
curtime = sys_get_ticks();
endtime = timeout < 0 ? INT_MAX : (curtime + timeout * 10);
// スプライトキー待ちメイン
+3 -4
View File
@@ -32,7 +32,6 @@
#include "nact.h"
#include "sact.h"
#include "sprite.h"
#include "sdl_core.h"
/*
@@ -161,14 +160,14 @@ void spev_move_waitend(sprite_t *sp, int dx, int dy, int time) {
sp->move.time = 0;
sact.movelist = slist_append(sact.movelist, sp);
sact.movestarttime = sdl_getTicks();
sact.movestarttime = sys_get_ticks();
slist_foreach(sact.movelist, spev_move_setup, NULL);
slist_free(sact.movelist);
sact.movelist = NULL;
while (sp->move.moving) {
nact->callback();
sdl_wait_vsync();
sys_wait_vsync();
}
}
@@ -187,7 +186,7 @@ void spev_wait4moving_sp() {
while (sp->move.moving) {
nact->callback();
sdl_wait_vsync();
sys_wait_vsync();
}
}
}
+13 -14
View File
@@ -29,7 +29,6 @@
#include "portab.h"
#include "system.h"
#include "sdl_core.h"
#include "ags.h"
#include "nact.h"
#include "input.h"
@@ -241,7 +240,7 @@ void smsg_out(int wNum, int wSize, int wColorR, int wColorG, int wColorB, int wF
sprite_t *sp;
int len = 0; // 処理した文字数?
bool needupdate = false;
MyRectangle uparea = {0,0,0,0};
SDL_Rect uparea = {0,0,0,0};
// wRSize == 0 -> ルビ無し(SACT.MessageOutputからの呼出)
@@ -268,7 +267,7 @@ void smsg_out(int wNum, int wSize, int wColorR, int wColorG, int wColorB, int wF
char mbuf[20], rbuf[20];
int cw, delta, wcnt;
wcnt = sdl_getTicks();
wcnt = sys_get_ticks();
mbuf[0] = rbuf[0] = '\0';
msg = get_char(msg, mbuf, rbuf, sizeof(mbuf) -1);
@@ -316,7 +315,7 @@ void smsg_out(int wNum, int wSize, int wColorR, int wColorG, int wColorB, int wF
needupdate = false;
// keywait
delta = sdl_getTicks() - wcnt;
delta = sys_get_ticks() - wcnt;
if (delta < wSpeed) {
if (sys_keywait(wSpeed - delta, KEYWAIT_NONCANCELABLE)) {
@@ -335,8 +334,8 @@ void smsg_out(int wNum, int wSize, int wColorR, int wColorG, int wColorB, int wF
// Waitなしの出力は最後にupdate
if (needupdate) {
uparea.w = sp->cursize.width;
uparea.h = min(sp->cursize.height, uparea.y - sp->u.msg.dspcur.y + wLineSpace + wLineSpace + wRSize);
uparea.w = sp->width;
uparea.h = min(sp->height, uparea.y - sp->u.msg.dspcur.y + wLineSpace + wLineSpace + wRSize);
sp_updateme_part(sp, uparea.x, uparea.y, uparea.w, uparea.h);
}
@@ -420,7 +419,7 @@ int smsg_keywait(int wNum1, int wNum2, int msglen) {
sact.waitkey = -1;
while (sact.waitkey == -1 && !nact->is_quit) {
int st = sdl_getTicks();
int st = sys_get_ticks();
int interval = 25;
// アニメパターンがある場合、その更新
@@ -434,7 +433,7 @@ int smsg_keywait(int wNum1, int wNum2, int msglen) {
update_mark(minfo[j].sp, minfo[j].cg);
i++;
}
sys_keywait(interval - (sdl_getTicks() - st), KEYWAIT_NONCANCELABLE);
sys_keywait(interval - (sys_get_ticks() - st), KEYWAIT_NONCANCELABLE);
}
sact.waittype = KEYWAIT_NONE;
@@ -447,13 +446,13 @@ int smsg_keywait(int wNum1, int wNum2, int msglen) {
@param sp:
*/
void smsg_update(sprite_t *sp) {
SDL_Rect sp_rect = {0, 0, sp->cursize.width, sp->cursize.height};
SDL_Rect sp_rect = {0, 0, sp->width, sp->height};
int sx = 0;
int sy = 0;
int dx = sp->cur.x;
int dy = sp->cur.y;
int w = sp->cursize.width;
int h = sp->cursize.height;
int w = sp->width;
int h = sp->height;
if (!ags_clipCopyRect(&sp_rect, &sact.updaterect, &sx, &sy, &dx, &dy, &w, &h)) {
return;
}
@@ -534,7 +533,7 @@ static void append_to_log(char *msg) {
static void sactlog_newline() {
if (sact.logging) {
if (sact.msgbuf2[0] == '\0') return;
sact.log = list_append(sact.log, strdup(sact.msgbuf2));
sact.log = list_append(sact.log, toUTF8(sact.msgbuf2));
sact.msgbuf2[0] = '\0';
}
}
@@ -547,10 +546,10 @@ static void set_align(char *msg, sprite_t *sp, int wSize, int wAlign) {
switch (wAlign) {
case 1: // センタリング
adjx = (sp->cursize.width - mlen) / 2;
adjx = (sp->width - mlen) / 2;
break;
case 2: // 右寄せ
adjx = (sp->cursize.width - mlen);
adjx = (sp->width - mlen);
break;
}
sp->u.msg.dspcur.x = max(0, adjx);
+2 -3
View File
@@ -31,7 +31,6 @@
#include "input.h"
#include "sact.h"
#include "sprite.h"
#include "sdl_core.h"
#include "randMT.h"
/*
@@ -49,9 +48,9 @@ void sp_quake_sprite(int wType, int wAmplitudeX, int wAmplitudeY, int wCount, in
int i = 0, key;
SList *node;
edtime = wCount * 10 + sdl_getTicks();
edtime = wCount * 10 + sys_get_ticks();
while ((curtime = sdl_getTicks()) < edtime) {
while ((curtime = sys_get_ticks()) < edtime) {
if (wType == 0) { // 全てのスプライトを同じように動かす
int adjx = (int)(genrand() * wAmplitudeX/2);
int adjy = (int)(genrand() * wAmplitudeY/2);
+2 -2
View File
@@ -60,8 +60,8 @@ static int sel_main();
* sprite内部とは判断しない
*/
static bool sp_is_insprite2(sprite_t *sp, int x, int y, int margin) {
MyPoint p = {x, y};
MyRectangle r = {
SDL_Point p = {x, y};
SDL_Rect r = {
sp->cur.x + margin,
sp->cur.y + margin,
sp->curcg->sf->w - 2 * margin,
+1 -2
View File
@@ -33,7 +33,6 @@
#include "nact.h"
#include "sact.h"
#include "sprite.h"
#include "sdl_core.h"
/*
@@ -63,7 +62,7 @@ static void tevent_callback(agsevent_t *e) {
int update = 0;
// SP_MOVE の同期移動のためのカウンタの読み込み
sact.movecurtime = sdl_getTicks();
sact.movecurtime = sys_get_ticks();
for (node = sact.teventlisteners; node; node = node->next) {
sprite_t *sp = (sprite_t *)node->data;
+12 -14
View File
@@ -28,9 +28,7 @@
#include "portab.h"
#include "system.h"
#include "sdl_core.h"
#include "ags.h"
#include "graphics.h"
#include "sact.h"
#include "sprite.h"
@@ -43,16 +41,16 @@ static void do_update_each(void* data, void* userdata);
// 領域1と領域2をすべて含む矩形領域を計算
static void disjunction(void* region, void* data) {
MyRectangle *r1 = (MyRectangle *)region;
MyRectangle *r2 = (MyRectangle *)data;
SDL_Rect *r1 = (SDL_Rect *)region;
SDL_Rect *r2 = (SDL_Rect *)data;
SDL_UnionRect(r1, r2, r2);
free(r1);
}
// 更新の必要なスプライトの領域の和をとってクリッピングする
static void get_updatearea() {
MyRectangle clip = {0, 0, 0, 0};
MyRectangle screen = {0, 0, main_surface->w, main_surface->h};
SDL_Rect clip = {0, 0, 0, 0};
SDL_Rect screen = {0, 0, main_surface->w, main_surface->h};
slist_foreach(updatearea, disjunction, &clip);
@@ -93,7 +91,7 @@ void sp_update_all(bool syncscreen) {
// スプライト移動がある場合は移動開始
if (sact.movelist) {
// 移動開始時間を合わせる
sact.movestarttime = sdl_getTicks();
sact.movestarttime = sys_get_ticks();
slist_foreach(sact.movelist, spev_move_setup, NULL);
slist_free(sact.movelist);
sact.movelist = NULL;
@@ -149,16 +147,16 @@ void sp_update_clipped() {
@param sp:
*/
void sp_updateme(sprite_t *sp) {
MyRectangle *r;
SDL_Rect *r;
if (sp == NULL) return;
if (sp->cursize.width == 0 || sp->cursize.height == 0) return;
if (sp->width == 0 || sp->height == 0) return;
r = malloc(sizeof(MyRectangle));
r = malloc(sizeof(SDL_Rect));
r->x = sp->cur.x;
r->y = sp->cur.y;
r->w = sp->cursize.width;
r->h = sp->cursize.height;
r->w = sp->width;
r->h = sp->height;
updatearea = slist_append(updatearea, r);
@@ -175,12 +173,12 @@ void sp_updateme(sprite_t *sp) {
@param h:
*/
void sp_updateme_part(sprite_t *sp, int x, int y, int w, int h) {
MyRectangle *r;
SDL_Rect *r;
if (sp == NULL) return;
if (w == 0 || h == 0) return;
r = malloc(sizeof(MyRectangle));
r = malloc(sizeof(SDL_Rect));
r->x = sp->cur.x + x;
r->y = sp->cur.y + y;
r->w = w;
+5 -6
View File
@@ -36,13 +36,12 @@
#include "nact.h"
#include "ags.h"
#include "music.h"
#include "sdl_core.h"
#include "hacks.h"
#define SLOT 40
static MyRectangle maprect; /* アニメーション表示領域 */
static MyRectangle mapback; /* 背景セーブ領域 */
static SDL_Rect maprect; /* アニメーション表示領域 */
static SDL_Rect mapback; /* 背景セーブ領域 */
static int mapback_p5; /* 背景転送先 X */
static int mapback_p6; /* 背景転送先 Y */
@@ -451,7 +450,7 @@ static void PlayAnimeData() {
dib = ags_getDIB();
for (loop = 0; loop < p1; loop++) {
int cnt = sdl_getTicks();
int cnt = sys_get_ticks();
is_backcopied = false;
for (i = 0; i < SLOT; i++) {
@@ -528,9 +527,9 @@ static void PlayAnimeData() {
if (is_backcopied && !SDL_RectEmpty(&maprect))
ags_updateArea(maprect.x, maprect.y, maprect.w, maprect.h);
int now = sdl_getTicks();
int now = sys_get_ticks();
if (now - cnt < interval) {
sdl_sleep(interval - (now-cnt));
sys_sleep(interval - (now-cnt));
}
}
}
+1 -2
View File
@@ -35,7 +35,6 @@
#include "system.h"
#include "xsystem35.h"
#include "modules.h"
#include "sdl_core.h"
#include "input.h"
#include "menu.h"
@@ -54,7 +53,7 @@ static void OutputMessageBox(void) { /* 0 */
char *title_utf8 = toUTF8(svar_get(title));
char *msg_utf8 = toUTF8(svar_get(msg));
sdl_showMessageBox(MESSAGEBOX_INFO, title_utf8, msg_utf8);
sys_show_message_box(MESSAGEBOX_INFO, title_utf8, msg_utf8);
free(title_utf8);
free(msg_utf8);
+1
View File
@@ -71,6 +71,7 @@ int dt_drawtext_col(SDL_Surface *sf, int x, int y, char *buf, int r, int g, int
if (glyph == NULL) return 0;
SDL_Rect rect = {x, y, glyph->w, glyph->h};
SDL_SetSurfaceBlendMode(glyph, SDL_BLENDMODE_NONE);
SDL_BlitSurface(glyph, NULL, sf, &rect);
SDL_FreeSurface(glyph);
return rect.w;
+1 -1
View File
@@ -24,7 +24,7 @@
#ifndef __DRAWTEXT_H__
#define __DRAWTEXT_H__
#include "graphics.h"
#include "font.h"
struct SDL_Surface;
+2 -2
View File
@@ -44,8 +44,8 @@ static void gre_BlendUseAMap(surface_t *dst, int dx, int dy, surface_t *src, int
void gr_blend_alpha_map(surface_t *dst, int dx, int dy, surface_t *src, int sx, int sy, int sw, int sh) {
if (src == NULL || dst == NULL) return;
MyRectangle src_window = { 0, 0, src->width, src->height };
MyRectangle dst_window = { 0, 0, dst->width, dst->height };
SDL_Rect src_window = { 0, 0, src->width, src->height };
SDL_Rect dst_window = { 0, 0, dst->width, dst->height };
if (!ags_clipCopyRect(&src_window, &dst_window, &sx, &sy, &dx, &dy, &sw, &sh)) return;
if (src->alpha == NULL) {
+5 -5
View File
@@ -22,7 +22,7 @@ typedef struct {
static void *mapdata[NUM_MAPS];
static int setChipParam_index;
static MyRectangle chip_params[NUM_LAYERS];
static SDL_Rect chip_params[NUM_LAYERS];
static int window_width;
static int window_height;
static int map_width;
@@ -68,7 +68,7 @@ static void MakeMapSetChipParam() {
WARNING("unexpected MakeMapSeChipParam call");
return;
}
MyRectangle *r = &chip_params[setChipParam_index++];
SDL_Rect *r = &chip_params[setChipParam_index++];
r->x = p1;
r->y = p2;
r->w = p3;
@@ -93,9 +93,9 @@ static void MakeMapDraw() {
int c1 = a1[index];
int c2 = a2[index];
int c3 = a3[index];
MyRectangle *r1 = &chip_params[0];
MyRectangle *r2 = &chip_params[1];
MyRectangle *r3 = &chip_params[2];
SDL_Rect *r1 = &chip_params[0];
SDL_Rect *r2 = &chip_params[1];
SDL_Rect *r3 = &chip_params[2];
surface_t *dib = ags_getDIB();
if (c3) {
ags_copyArea(r3->x + c3 * r3->w, r3->y, r3->w, r3->h, dstX + x * r3->w, dstY + y * r3->h);
+5 -5
View File
@@ -30,7 +30,7 @@
#include "alk.h"
#include "input.h"
#include "bgm.h"
#include "sdl_core.h"
#include "gfx.h"
#include "cg.h"
#include "jpeg.h"
@@ -72,9 +72,9 @@ static void Run() {
musbgm_play(TDEMO_MUSIC_NO, 0, 100, 0);
uint32_t start = sdl_getTicks();
uint32_t start = sys_get_ticks();
while (!nact->is_quit) {
int i = (sdl_getTicks() - start) / (1000 / FPS);
int i = (sys_get_ticks() - start) / (1000 / FPS);
if (i >= alk->datanum)
break;
@@ -89,12 +89,12 @@ static void Run() {
WARNING("Cannot decode CG %d", i);
}
int wait_ms = (i + 1) * (1000 / FPS) - (sdl_getTicks() - start);
int wait_ms = (i + 1) * (1000 / FPS) - (sys_get_ticks() - start);
if (wait_ms > 0) {
if (sys_keywait(wait_ms, KEYWAIT_CANCELABLE))
break;
} else {
sdl_updateScreen();
gfx_updateScreen();
if (sys_getInputInfo())
break;
}
+8 -8
View File
@@ -59,9 +59,14 @@ target_sources(xsystem35 PRIVATE
cursor.c
dri.c
ecopy.c
effect.c
event.c
filecheck.c
font.c
hacks.c
gfx_draw.c
gfx_image.c
gfx_video.c
image.c
input.c
jpeg.c
@@ -82,13 +87,8 @@ target_sources(xsystem35 PRIVATE
savedata.c
scenario.c
scheduler.c
sdl_cursor.c
sdl_draw.c
sdl_effect.c
sdl_event.c
sdl_image.c
sdl_video.c
selection.c
system.c
texthook.c
variable.c
vsp.c
@@ -125,7 +125,7 @@ elseif (ANDROID)
elseif (ENABLE_GTK)
target_sources(xsystem35 PRIVATE menu.c menu_callback.c menu_gui.c s39init.c)
else ()
target_sources(xsystem35 PRIVATE menu_sdl.c sdl_input.c)
target_sources(xsystem35 PRIVATE menu_sdl.c editor.c)
endif()
if (HAVE_WEBP)
@@ -170,7 +170,7 @@ if (EMSCRIPTEN)
-sALLOW_MEMORY_GROWTH=1
-sNO_EXIT_RUNTIME=1
-sEXPORTED_FUNCTIONS=_main,_malloc
-sEXPORTED_RUNTIME_METHODS=FS,IDBFS,getValue,addRunDependency,removeRunDependency,stringToUTF8OnStack
-sEXPORTED_RUNTIME_METHODS=FS,IDBFS,HEAPU8,HEAP16,getValue,addRunDependency,removeRunDependency,stringToUTF8OnStack
--emit-tsd=xsystem35.d.ts
)
+116 -102
View File
@@ -35,7 +35,9 @@
#include "xsystem35.h"
#include "scenario.h"
#include "ags.h"
#include "sdl_core.h"
#include "gfx.h"
#include "effect.h"
#include "event.h"
#include "alpha_plane.h"
#include "utfsjis.h"
#include "input.h"
@@ -81,25 +83,25 @@ static void initPal(void) {
for (int i = 0; i < 256; i++) {
nact->ags.pal[i].a = 255;
}
sdl_setPalette(nact->ags.pal, 0, 256);
gfx_setPalette(nact->ags.pal, 0, 256);
palette_changed();
}
bool ags_check_param(int *x, int *y, int *w, int *h) {
if (*x >= nact->ags.world_size.width) {
WARNING("Illegal Param x = %d (max=%d)(@%03x:%05x)", *x, nact->ags.world_size.width, sl_getPage(), sl_getIndex());
if (*x >= nact->ags.world_width) {
WARNING("Illegal Param x = %d (max=%d)(@%03x:%05x)", *x, nact->ags.world_width, sl_getPage(), sl_getIndex());
return false;
}
if (*y >= nact->ags.world_size.height) {
WARNING("Illegal Param y = %d (max=%d)", *y, nact->ags.world_size.height);
if (*y >= nact->ags.world_height) {
WARNING("Illegal Param y = %d (max=%d)", *y, nact->ags.world_height);
return false;
}
if (*x < 0) { *w += *x; *x = 0; }
if (*y < 0) { *h += *y; *y = 0; }
if ((*x + *w) > nact->ags.world_size.width) { *w = nact->ags.world_size.width - *x;}
if ((*y + *h) > nact->ags.world_size.height) { *h = nact->ags.world_size.height - *y;}
if ((*x + *w) > nact->ags.world_width) { *w = nact->ags.world_width - *x;}
if ((*y + *h) > nact->ags.world_height) { *h = nact->ags.world_height - *y;}
if (*w <= 0) return false;
if (*h <= 0) return false;
@@ -108,11 +110,11 @@ bool ags_check_param(int *x, int *y, int *w, int *h) {
}
bool ags_check_param_xy(int *x, int *y) {
if (*x >= nact->ags.world_size.width) {
if (*x >= nact->ags.world_width) {
WARNING("Illegal Param x = %d", *x);
return false;
}
if (*y >= nact->ags.world_size.height) {
if (*y >= nact->ags.world_height) {
WARNING("Illegal Param y = %d", *y);
return false;
}
@@ -125,8 +127,8 @@ bool ags_check_param_xy(int *x, int *y) {
void ags_init(const char *render_driver, bool enable_zb) {
nact->ags.mouse_warp_enabled = true;
nact->ags.world_size.width = SYS35_DEFAULT_WIDTH;
nact->ags.world_size.height = SYS35_DEFAULT_HEIGHT;
nact->ags.world_width = SYS35_DEFAULT_WIDTH;
nact->ags.world_height = SYS35_DEFAULT_HEIGHT;
nact->ags.world_depth = SYS35_DEFAULT_DEPTH;
nact->ags.view_area.x = 0;
nact->ags.view_area.y = 0;
@@ -139,7 +141,9 @@ void ags_init(const char *render_driver, bool enable_zb) {
nact->ags.enable_zb = enable_zb;
nact->ags.font_weight = enable_zb ? FONT_WEIGHT_BOLD : FONT_WEIGHT_NORMAL;
sdl_Initialize(render_driver);
gfx_Initialize(render_driver);
event_init();
cursor_init();
font_init();
initPal();
@@ -148,7 +152,8 @@ void ags_init(const char *render_driver, bool enable_zb) {
void ags_remove(void) {
ags_autorepeat(true);
sdl_Remove();
event_remove();
gfx_Remove();
}
void ags_reset(void) {
@@ -159,8 +164,8 @@ void ags_reset(void) {
}
void ags_setWorldSize(int width, int height, int depth) {
nact->ags.world_size.width = width;
nact->ags.world_size.height = height;
nact->ags.world_width = width;
nact->ags.world_height = height;
nact->ags.world_depth = depth;
if (nact->ags.dib && nact->ags.dib->alpha) {
@@ -168,9 +173,9 @@ void ags_setWorldSize(int width, int height, int depth) {
nact->ags.dib->alpha = NULL;
}
sdl_setWorldSize(width, height, depth);
gfx_setWorldSize(width, height, depth);
nact->ags.dib = sdl_getDIB();
nact->ags.dib = gfx_getDIB();
/* DIBが8以上の場合は、alpha plane を用意 */
if (depth > 8) {
@@ -188,29 +193,29 @@ void ags_setViewArea(int x, int y, int width, int height) {
nact->ags.view_area.y = y;
nact->ags.view_area.w = width;
nact->ags.view_area.h = height;
sdl_setWindowSize(width, height);
gfx_setWindowSize(width, height);
}
void ags_setWindowTitle(const char *title_utf8) {
char buf[256];
snprintf(buf, sizeof(buf), "XSystem35 Version %s: %s", VERSION, title_utf8);
sdl_setWindowTitle(buf);
gfx_setWindowTitle(buf);
}
void ags_getDIBInfo(DispInfo *info) {
info->width = nact->ags.world_size.width;
info->height = nact->ags.world_size.height;
info->width = nact->ags.world_width;
info->height = nact->ags.world_height;
info->depth = nact->ags.world_depth;
}
void ags_getViewAreaInfo(DispInfo *info) {
sdl_getWindowInfo(info);
gfx_getWindowInfo(NULL, NULL, &info->depth);
info->width = nact->ags.view_area.w;
info->height = nact->ags.view_area.h;
}
void ags_getWindowInfo(DispInfo *info) {
sdl_getWindowInfo(info);
gfx_getWindowInfo(&info->width, &info->height, &info->depth);
}
void ags_setExposeSwitch(bool expose) {
@@ -221,13 +226,13 @@ void ags_updateArea(int x, int y, int w, int h) {
if (fade_outed || !need_update)
return;
MyRectangle r = {x, y, w, h}, update;
SDL_Rect r = {x, y, w, h}, update;
if (SDL_IntersectRect(&nact->ags.view_area, &r, &update)) {
MyPoint p = {
SDL_Point p = {
update.x - nact->ags.view_area.x,
update.y - nact->ags.view_area.y
};
sdl_updateArea(&update, &p);
gfx_updateArea(&update, &p);
}
}
@@ -235,14 +240,14 @@ void ags_updateFull() {
if (fade_outed || !need_update)
return;
MyRectangle r = {
SDL_Rect r = {
nact->ags.view_area.x,
nact->ags.view_area.y,
min(nact->ags.view_area.w, nact->ags.world_size.width),
min(nact->ags.view_area.h, nact->ags.world_size.height)
min(nact->ags.view_area.w, nact->ags.world_width),
min(nact->ags.view_area.h, nact->ags.world_height)
};
MyPoint p = {0, 0};
sdl_updateArea(&r, &p);
SDL_Point p = {0, 0};
gfx_updateArea(&r, &p);
}
void ags_setPalettes(SDL_Color *src, int dst, int cnt) {
@@ -261,47 +266,47 @@ void ags_setPalette(int no, int red, int green, int blue) {
void ags_setPaletteToSystem(int src, int cnt) {
if (!fade_outed)
sdl_setPalette(nact->ags.pal, src, cnt);
gfx_setPalette(nact->ags.pal, src, cnt);
}
void ags_drawRectangle(int x, int y, int w, int h, int col) {
if (!ags_check_param(&x, &y, &w, &h)) return;
sdl_drawRectangle(x, y, w, h, col);
gfx_drawRectangle(x, y, w, h, col);
}
void ags_fillRectangle(int x, int y, int w, int h, int col) {
if (!ags_check_param(&x, &y, &w, &h)) return;
sdl_fillRectangle(x, y, w, h, col);
gfx_fillRectangle(x, y, w, h, col);
}
void ags_drawLine(int x0, int y0, int x1, int y1, int col) {
if (!ags_check_param_xy(&x0, &y0)) return;
if (!ags_check_param_xy(&x1, &y1)) return;
sdl_drawLine(x0, y0, x1, y1, col);
gfx_drawLine(x0, y0, x1, y1, col);
}
void ags_copyArea(int sx, int sy, int w, int h, int dx, int dy) {
if (!ags_check_param(&sx, &sy, &w, &h)) return;
if (!ags_check_param(&dx, &dy, &w, &h)) return;
sdl_copyArea(sx, sy, w, h, dx, dy);
gfx_copyArea(sx, sy, w, h, dx, dy);
}
void ags_scaledCopyArea(int sx, int sy, int sw, int sh, int dx, int dy, int dw, int dh, int mirror_sw) {
if (!ags_check_param(&sx, &sy, &sw, &sh)) return;
if (!ags_check_param(&dx, &dy, &dw, &dh)) return;
sdl_scaledCopyArea(sx, sy, sw, sh, dx, dy, dw, dh, mirror_sw);
gfx_scaledCopyArea(sx, sy, sw, sh, dx, dy, dw, dh, mirror_sw);
}
void ags_copyAreaSP(int sx, int sy, int w, int h, int dx, int dy, int col) {
if (!ags_check_param(&sx, &sy, &w, &h)) return;
if (!ags_check_param(&dx, &dy, &w, &h)) return;
sdl_copyAreaSP(sx, sy, w, h, dx, dy, col);
gfx_copyAreaSP(sx, sy, w, h, dx, dy, col);
}
void ags_wrapColor(int x, int y, int w, int h, int p1, int p2) {
@@ -309,13 +314,18 @@ void ags_wrapColor(int x, int y, int w, int h, int p1, int p2) {
if (!ags_check_param(&x, &y, &w, &h)) return;
sdl_wrapColor(x, y, w, h, p1, p2);
gfx_wrapColor(x, y, w, h, p1, p2);
}
void ags_getPixel(int x, int y, Palette *cell) {
void ags_getPixel(int x, int y, PixelColor *cell) {
if (!ags_check_param_xy(&x, &y)) return;
sdl_getPixel(x, y, cell);
uint32_t pixel = gfx_getPixel(x, y);
if (main_surface->format->BitsPerPixel == 8) {
cell->index = pixel;
} else {
SDL_GetRGB(pixel, main_surface->format, &cell->r, &cell->g, &cell->b);
}
}
void ags_copyPaletteShift(int sx, int sy, int w, int h, int dx, int dy, uint8_t sprite) {
@@ -357,7 +367,7 @@ void ags_changeColorArea(int sx, int sy, int w, int h, int dst, int src, int cnt
void* ags_saveRegion(int x, int y, int w, int h) {
if (!ags_check_param(&x, &y, &w, &h)) return NULL;
return (void *)sdl_saveRegion(x, y, w, h);
return (void *)gfx_saveRegion(x, y, w, h);
}
void ags_restoreRegion(void *region, int x, int y) {
@@ -365,7 +375,7 @@ void ags_restoreRegion(void *region, int x, int y) {
if (!ags_check_param_xy(&x, &y)) return;
sdl_restoreRegion(region, x, y);
gfx_restoreRegion(region, x, y);
}
void ags_putRegion(void *region, int x, int y) {
@@ -373,16 +383,16 @@ void ags_putRegion(void *region, int x, int y) {
if (!ags_check_param_xy(&x, &y)) return;
sdl_putRegion(region, x, y);
gfx_putRegion(region, x, y);
}
void ags_delRegion(void *region) {
if (region == NULL) return;
sdl_delRegion(region);
gfx_delRegion(region);
}
int ags_drawString(int x, int y, const char *src, int col, MyRectangle *rect_out) {
int ags_drawString(int x, int y, const char *src, int col, SDL_Rect *rect_out) {
if (!ags_check_param_xy(&x, &y)) {
if (rect_out) {
rect_out->x = x;
@@ -393,7 +403,7 @@ int ags_drawString(int x, int y, const char *src, int col, MyRectangle *rect_out
return 0;
}
MyRectangle adj;
SDL_Rect adj;
char *utf8 = toUTF8(src);
switch(nact->ags.text_decoration_type) {
case TEXT_DECORATION_NONE:
@@ -401,46 +411,46 @@ int ags_drawString(int x, int y, const char *src, int col, MyRectangle *rect_out
adj.x = 0; adj.y = 0; adj.w = 0; adj.h = 0;
break;
case TEXT_DECORATION_DROP_SHADOW_BOTTOM:
sdl_drawString(x, y +1, utf8, nact->ags.text_decoration_color);
gfx_drawString(x, y +1, utf8, nact->ags.text_decoration_color);
adj.x = 0; adj.y = 0; adj.w = 0; adj.h = 1;
break;
case TEXT_DECORATION_DROP_SHADOW_RIGHT:
sdl_drawString(x +1, y, utf8, nact->ags.text_decoration_color);
gfx_drawString(x +1, y, utf8, nact->ags.text_decoration_color);
adj.x = 0; adj.y = 0; adj.w = 1; adj.h = 0;
break;
case TEXT_DECORATION_DROP_SHADOW_BOTTOM_RIGHT:
sdl_drawString(x +1, y +1, utf8, nact->ags.text_decoration_color);
gfx_drawString(x +1, y +1, utf8, nact->ags.text_decoration_color);
adj.x = 0; adj.y = 0; adj.w = 1; adj.h = 1;
break;
case TEXT_DECORATION_OUTLINE:
sdl_drawString(x -1, y, utf8, nact->ags.text_decoration_color);
sdl_drawString(x +1, y, utf8, nact->ags.text_decoration_color);
sdl_drawString(x, y -1, utf8, nact->ags.text_decoration_color);
sdl_drawString(x, y +1, utf8, nact->ags.text_decoration_color);
gfx_drawString(x -1, y, utf8, nact->ags.text_decoration_color);
gfx_drawString(x +1, y, utf8, nact->ags.text_decoration_color);
gfx_drawString(x, y -1, utf8, nact->ags.text_decoration_color);
gfx_drawString(x, y +1, utf8, nact->ags.text_decoration_color);
adj.x = -1; adj.y = -1; adj.w = 2; adj.h = 2;
break;
case TEXT_DECORATION_BOLD_HORIZONTAL:
sdl_drawString(x +1, y, utf8, col);
gfx_drawString(x +1, y, utf8, col);
adj.x = 0; adj.y = 0; adj.w = 1; adj.h = 0;
break;
case TEXT_DECORATION_BOLD_VERTICAL:
sdl_drawString(x, y +1, utf8, col);
gfx_drawString(x, y +1, utf8, col);
adj.x = 0; adj.y = 0; adj.w = 0; adj.h = 1;
break;
case TEXT_DECORATION_BOLD_HORIZONTAL_VERTICAL:
sdl_drawString(x +1, y +1, utf8, col);
gfx_drawString(x +1, y +1, utf8, col);
adj.x = 0; adj.y = 0; adj.w = 1; adj.h = 1;
break;
case TEXT_DECORATION_DROP_SHADOW_OUTLINE:
sdl_drawString(x -1, y , utf8, nact->ags.text_decoration_color);
sdl_drawString(x +1, y , utf8, nact->ags.text_decoration_color);
sdl_drawString(x , y -1, utf8, nact->ags.text_decoration_color);
sdl_drawString(x , y +1, utf8, nact->ags.text_decoration_color);
sdl_drawString(x +2, y +2, utf8, nact->ags.text_decoration_color);
gfx_drawString(x -1, y , utf8, nact->ags.text_decoration_color);
gfx_drawString(x +1, y , utf8, nact->ags.text_decoration_color);
gfx_drawString(x , y -1, utf8, nact->ags.text_decoration_color);
gfx_drawString(x , y +1, utf8, nact->ags.text_decoration_color);
gfx_drawString(x +2, y +2, utf8, nact->ags.text_decoration_color);
adj.x = -1; adj.y = -1; adj.w = 3; adj.h = 3;
break;
}
SDL_Rect r = sdl_drawString(x, y, utf8, col);
SDL_Rect r = gfx_drawString(x, y, utf8, col);
if (rect_out) {
rect_out->x = r.x + adj.x;
rect_out->y = r.y + adj.y;
@@ -461,13 +471,13 @@ SDL_Surface *ags_drawStringToSurface(const char *str, int r, int g, int b) {
void ags_drawCg(cgdata *cg, int x, int y, int brightness, int sprite_color, bool alpha_blend) {
switch (cg->depth) {
case 8:
sdl_drawImage8(cg, x, y, sprite_color);
gfx_drawImage8(cg, x, y, sprite_color);
break;
case 16:
sdl_drawImage16(cg, nact->ags.dib, x, y, brightness, alpha_blend);
gfx_drawImage16(cg, nact->ags.dib, x, y, brightness, alpha_blend);
break;
case 24:
sdl_drawImage24(cg, nact->ags.dib, x, y, brightness);
gfx_drawImage24(cg, nact->ags.dib, x, y, brightness);
break;
}
}
@@ -478,7 +488,7 @@ void ags_copyArea_shadow(int sx, int sy, int w, int h, int dx, int dy) {
if (!ags_check_param(&sx, &sy, &w, &h)) return;
if (!ags_check_param(&dx, &dy, &w, &h)) return;
sdl_copyAreaSP16_shadow(sx, sy, w, h, dx, dy, 255);
gfx_copyAreaSP16_shadow(sx, sy, w, h, dx, dy, 255);
}
void ags_copyArea_transparent(int sx, int sy, int w, int h, int dx, int dy, int col) {
@@ -487,7 +497,7 @@ void ags_copyArea_transparent(int sx, int sy, int w, int h, int dx, int dy, int
if (!ags_check_param(&sx, &sy, &w, &h)) return;
if (!ags_check_param(&dx, &dy, &w, &h)) return;
sdl_copyAreaSP(sx, sy, w, h, dx, dy, col);
gfx_copyAreaSP(sx, sy, w, h, dx, dy, col);
}
void ags_copyArea_alphaLevel(int sx, int sy, int w, int h, int dx, int dy, int lv) {
@@ -496,7 +506,7 @@ void ags_copyArea_alphaLevel(int sx, int sy, int w, int h, int dx, int dy, int l
if (!ags_check_param(&sx, &sy, &w, &h)) return;
if (!ags_check_param(&dx, &dy, &w, &h)) return;
sdl_copyAreaSP16_alphaLevel(sx, sy, w, h, dx, dy, lv);
gfx_copyAreaSP16_alphaLevel(sx, sy, w, h, dx, dy, lv);
}
void ags_copyArea_alphaBlend(int sx, int sy, int w, int h, int dx, int dy, int lv) {
@@ -505,14 +515,14 @@ void ags_copyArea_alphaBlend(int sx, int sy, int w, int h, int dx, int dy, int l
if (!ags_check_param(&sx, &sy, &w, &h)) return;
if (!ags_check_param(&dx, &dy, &w, &h)) return;
sdl_copyAreaSP16_alphaBlend(sx, sy, w, h, dx, dy, lv);
gfx_copyAreaSP16_alphaBlend(sx, sy, w, h, dx, dy, lv);
}
MyRectangle ags_floodFill(int x, int y, int col) {
SDL_Rect ags_floodFill(int x, int y, int col) {
if (!ags_check_param_xy(&x, &y))
return (MyRectangle){};
return (SDL_Rect){};
return sdl_floodFill(x, y, col);
return gfx_floodFill(x, y, col);
}
void ags_copyFromAlpha(int sx, int sy, int w, int h, int dx, int dy, ALPHA_DIB_COPY_TYPE flg) {
@@ -521,7 +531,7 @@ void ags_copyFromAlpha(int sx, int sy, int w, int h, int dx, int dy, ALPHA_DIB_C
if (!ags_check_param(&sx, &sy, &w, &h)) return;
if (!ags_check_param(&dx, &dy, &w, &h)) return;
sdl_copy_from_alpha(sx, sy, w, h, dx, dy, flg);
gfx_copy_from_alpha(sx, sy, w, h, dx, dy, flg);
}
void ags_copyToAlpha(int sx, int sy, int w, int h, int dx, int dy, ALPHA_DIB_COPY_TYPE flg) {
@@ -530,7 +540,7 @@ void ags_copyToAlpha(int sx, int sy, int w, int h, int dx, int dy, ALPHA_DIB_COP
if (!ags_check_param(&sx, &sy, &w, &h)) return;
if (!ags_check_param(&dx, &dy, &w, &h)) return;
sdl_copy_to_alpha(sx, sy, w, h, dx, dy, flg);
gfx_copy_to_alpha(sx, sy, w, h, dx, dy, flg);
}
void ags_alpha_uppercut(int sx, int sy, int w, int h, int s, int d) {
@@ -592,10 +602,10 @@ void ags_alpha_setPixel(int x, int y, int w, int h, uint8_t *b) {
void ags_runEffect(int duration_ms, bool cancelable, ags_EffectStepFunc step, void *arg) {
unsigned wflags = cancelable ? KEYWAIT_CANCELABLE : KEYWAIT_NONCANCELABLE;
int start = sdl_getTicks();
for (int t = 0; t < duration_ms; t = sdl_getTicks() - start) {
int start = sys_get_ticks();
for (int t = 0; t < duration_ms; t = sys_get_ticks() - start) {
step(arg, (float)t / duration_ms);
int key = sys_keywait(start + t + 16 - sdl_getTicks(), wflags);
int key = sys_keywait(start + t + 16 - sys_get_ticks(), wflags);
if (cancelable && key) {
nact->waitcancel_key = key;
break;
@@ -604,22 +614,22 @@ void ags_runEffect(int duration_ms, bool cancelable, ags_EffectStepFunc step, vo
step(arg, 1.0);
}
static void fade(int duration, bool cancelable, enum sdl_effect_type type) {
static void fade(int duration, bool cancelable, enum effect_type type) {
nact->waitcancel_key = 0;
SDL_Rect rect = {0, 0, nact->ags.view_area.w, nact->ags.view_area.h};
struct sdl_effect *eff = sdl_effect_init(
struct effect *eff = effect_init(
&rect, NULL, 0, 0,
sdl_getDIB(), nact->ags.view_area.x, nact->ags.view_area.y,
gfx_getDIB(), nact->ags.view_area.x, nact->ags.view_area.y,
type);
ags_runEffect(duration, cancelable, (ags_EffectStepFunc)sdl_effect_step, eff);
sdl_effect_finish(eff);
ags_runEffect(duration, cancelable, (ags_EffectStepFunc)effect_step, eff);
effect_finish(eff);
}
void ags_fadeIn(int rate, bool flag) {
fade_outed = false;
if (nact->ags.world_depth == 8)
sdl_setPalette(nact->ags.pal, 0, 256);
gfx_setPalette(nact->ags.pal, 0, 256);
if (!need_update)
return;
@@ -627,7 +637,7 @@ void ags_fadeIn(int rate, bool flag) {
int duration = rate * 16 * 1000 / 60;
fade(duration, flag, nact->ags.world_depth == 8 ? EFFECT_FADEIN : EFFECT_DITHERING_FADEIN);
sdl_updateAll(&nact->ags.view_area);
gfx_updateAll(&nact->ags.view_area);
}
void ags_fadeOut(int rate, bool flag) {
@@ -642,14 +652,14 @@ void ags_fadeOut(int rate, bool flag) {
for (int i = 0; i < 256; i++) {
pal[i] = (SDL_Color){0, 0, 0, 255};
}
sdl_setPalette(pal, 0, 256);
gfx_setPalette(pal, 0, 256);
}
}
void ags_whiteIn(int rate, bool flag) {
fade_outed = false;
if (nact->ags.world_depth == 8)
sdl_setPalette(nact->ags.pal, 0, 256);
gfx_setPalette(nact->ags.pal, 0, 256);
if (!need_update)
return;
@@ -657,7 +667,7 @@ void ags_whiteIn(int rate, bool flag) {
int duration = rate * 16 * 1000 / 60;
fade(duration, flag, nact->ags.world_depth == 8 ? EFFECT_WHITEIN : EFFECT_DITHERING_WHITEIN);
sdl_updateAll(&nact->ags.view_area);
gfx_updateAll(&nact->ags.view_area);
}
void ags_whiteOut(int rate, bool flag) {
@@ -670,7 +680,7 @@ void ags_whiteOut(int rate, bool flag) {
if (nact->ags.world_depth == 8) {
SDL_Color pal[256];
memset(&pal, 255, sizeof(pal));
sdl_setPalette(pal, 0, 256);
gfx_setPalette(pal, 0, 256);
}
}
@@ -692,7 +702,7 @@ void ags_setTextDecorationColor(int col) {
void ags_setCursorType(int type) {
if (nact->ags.noimagecursor && type >= 100) return;
sdl_setCursorType(type);
cursor_set_type(type);
}
void ags_loadCursor(int p1,int p2) {
@@ -715,26 +725,26 @@ void ags_setCursorLocation(int x, int y, bool is_dibgeo, bool for_selection) {
// We can't move the actual cursor in the browser, but can change the
// internal mouse coordinates. This can help with keyboard/gamepad
// navigation.
sdl_setCursorInternalLocation(x, y);
event_set_mouse_internal_location(x, y);
EM_ASM({ xsystem35.shell.showMouseMoveEffect($0, $1); }, x, y);
sdl_sleep(cursor_move_time);
sys_sleep(cursor_move_time);
}
#else
if (nact->ags.mouse_warp_enabled) {
MyPoint p;
SDL_Point p;
sys_getMouseInfo(&p, is_dibgeo);
int dx = x - p.x;
int dy = y - p.y;
for (int i = 1; i < 8; i++) {
int xi = ((dx*i*i*i) >> 9) - ((3*dx*i*i)>> 6) + ((3*dx*i) >> 3) + p.x;
int yi = ((dy*i*i*i) >> 9) - ((3*dy*i*i)>> 6) + ((3*dy*i) >> 3) + p.y;
sdl_setCursorLocation(xi, yi);
sdl_sleep(cursor_move_time / 7);
event_set_mouse_location(xi, yi);
sys_sleep(cursor_move_time / 7);
}
sdl_setCursorLocation(x, y);
event_set_mouse_location(x, y);
} else if (!for_selection) {
sdl_setCursorInternalLocation(x, y);
sdl_sleep(cursor_move_time);
event_set_mouse_internal_location(x, y);
sys_sleep(cursor_move_time);
}
#endif
}
@@ -758,7 +768,7 @@ void ags_copyArea_shadow_withrate(int sx, int sy, int w, int h, int dx, int dy,
if (!ags_check_param(&sx, &sy, &w, &h)) return;
if (!ags_check_param(&dx, &dy, &w, &h)) return;
sdl_copyAreaSP16_shadow(sx, sy, w, h, dx, dy, lv);
gfx_copyAreaSP16_shadow(sx, sy, w, h, dx, dy, lv);
}
void ags_setCursorMoveTime(int msec) {
@@ -774,10 +784,14 @@ surface_t *ags_getDIB() {
}
void ags_autorepeat(bool enable) {
sdl_setAutoRepeat(enable);
if (enable) {
// SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);
} else {
// SDL_EnableKeyRepeat(0, 0);
}
}
bool ags_clipCopyRect(const MyRectangle *sw, const MyRectangle *dw, int *sx, int *sy, int *dx, int *dy, int *w, int *h) {
bool ags_clipCopyRect(const SDL_Rect *sw, const SDL_Rect *dw, int *sx, int *sy, int *dx, int *dy, int *w, int *h) {
// Clip source rectangle to source window
SDL_Rect sr = {*sx, *sy, *w, *h};
if (!SDL_IntersectRect(&sr, sw, &sr))
+21 -23
View File
@@ -29,22 +29,7 @@
#include <SDL_surface.h>
#include "portab.h"
#include "cg.h"
#include "graphics.h"
/* マウスカーソルの種類 */
#define CURSOR_ARROW 1
#define CURSOR_CROSS 2
#define CURSOR_IBEAM 3
#define CURSOR_ICON 4
#define CURSOR_NO 5
#define CURSOR_SIZE 6
#define CURSOR_SIZEALL 7
#define CURSOR_SIZENESW 8
#define CURSOR_SIZENS 9
#define CURSOR_SIZENWSE 10
#define CURSOR_SIZEWE 11
#define CURSOR_UPARROW 12
#define CURSOR_WAIT 13
#include "font.h"
/* RGB <-> alpha plane copy type */
typedef enum {
@@ -111,13 +96,26 @@ typedef enum {
TEXT_DECORATION_DROP_SHADOW_OUTLINE = 10,
} TextDecorationType;
typedef struct {
uint8_t r, g, b;
uint32_t index;
} PixelColor;
typedef struct {
int width;
int height;
int depth;
} DispInfo;
struct _ags {
SDL_Color pal[256]; /* system palette */
bool pal_changed; /* system palette has changed */
MyDimension world_size; /* size of off-screen */
MyRectangle view_area; /* view region in off-screen */
int world_width;
int world_height;
SDL_Rect view_area; /* view region in off-screen */
int world_depth; /* depth of off-screen (bits per pixel) */
@@ -174,7 +172,7 @@ extern void ags_copyAreaSP(int sx, int sy, int w, int h, int dx, int dy, int col
extern void ags_copyArea_shadow_withrate(int sx, int sy, int w, int h, int dx, int dy, int lv);
extern void ags_wrapColor(int x, int y, int w, int h, int p1, int p2);
extern void ags_getPixel(int x, int y, Palette *cell);
extern void ags_getPixel(int x, int y, PixelColor *cell);
extern void ags_copyPaletteShift(int sx, int sy, int w, int h, int dx, int dy, uint8_t sprite);
extern void ags_changeColorArea(int x, int y, int w, int h, int dst, int src, int cnt);
@@ -183,14 +181,14 @@ extern void ags_restoreRegion(void *region, int x, int y);
extern void ags_putRegion(void *region, int x, int y);
extern void ags_delRegion(void *region);
extern int ags_drawString(int x, int y, const char *src, int col, MyRectangle *rect_out);
extern int ags_drawString(int x, int y, const char *src, int col, SDL_Rect *rect_out);
extern void ags_drawCg(cgdata *cg, int x, int y, int brightness, int sprite_color, bool alpha_blend);
extern void ags_copyArea_shadow(int sx, int sy, int w, int h, int dx, int dy);
extern void ags_copyArea_transparent(int sx, int sy, int w, int h, int dx, int dy, int col);
extern void ags_copyArea_alphaLevel(int sx, int sy, int w, int h, int dx, int dy, int lv);
extern void ags_copyArea_alphaBlend(int sx, int sy, int w, int h, int dx, int dy, int lv);
extern MyRectangle ags_floodFill(int x, int y, int col);
extern SDL_Rect ags_floodFill(int x, int y, int col);
extern void ags_eCopyArea(int sx, int sy, int w, int h, int dx, int dy, int sw, int opt, bool cancel);
extern void ags_eSpriteCopyArea(int sx, int sy, int w, int h, int dx, int dy, int sw, int opt, bool cancel, int spCol);
@@ -228,7 +226,7 @@ extern int ags_getCursorMoveTime();
extern void ags_setAntialiasedStringMode(bool mode);
extern bool ags_getAntialiasedStringMode();
extern void ags_autorepeat(bool enable);
extern bool ags_clipCopyRect(const MyRectangle *sr, const MyRectangle *dr, int *sx, int *sy, int *dx, int *dy, int *w, int *h);
extern bool ags_clipCopyRect(const SDL_Rect *sr, const SDL_Rect *dr, int *sx, int *sy, int *dx, int *dy, int *w, int *h);
typedef void (*ags_EffectStepFunc)(void *, float);
void ags_runEffect(int duration_ms, bool cancelable, ags_EffectStepFunc step, void *arg);
+2 -2
View File
@@ -24,7 +24,7 @@
#include "nact.h"
#include "bgm.h"
#include "bgi.h"
#include "sdl_core.h"
#include "system.h"
bool musbgm_init(DRIFILETYPE type, int base_no) {
if (type == DRIFILE_BGM)
@@ -84,6 +84,6 @@ void musbgm_wait(int no, int timeout) {
for (int i = 0; i * 16 < timeout * 10; i++) {
if (!musbgm_isplaying(no))
break;
sdl_wait_vsync();
sys_wait_vsync();
}
}
-1
View File
@@ -28,7 +28,6 @@
#include <stdlib.h>
#include "portab.h"
#include "LittleEndian.h"
#include "graphics.h"
#include "cg.h"
#include "bmp.h"
+16
View File
@@ -130,3 +130,19 @@ void *cache_foreach(cacher *id, int key) {
}
return NULL;
}
void cache_clear(cacher *id) {
cacheinfo *ic = id->top->next;
cacheinfo *next;
while (ic != NULL) {
next = ic->next;
if (ic->data) {
totalsize -= ic->size;
id->free_(ic->data);
}
free(ic);
ic = next;
}
id->top->next = NULL;
}
+1
View File
@@ -46,5 +46,6 @@ typedef struct _cacher cacher;
extern cacher *cache_new(void *delcallback);
extern void cache_insert(cacher *id, int key, void *data, int size, int *in_use);
extern void *cache_foreach(cacher *id, int key);
extern void cache_clear(cacher *id);
#endif /* !__CASHE__ */
+1
View File
@@ -24,6 +24,7 @@
#include "portab.h"
#include "cdrom.h"
#include "scheduler.h"
#include "system.h"
static bool cdrom_init(char *playlist) {
return true;
+125 -11
View File
@@ -21,12 +21,16 @@
*/
/* $Id: cg.c,v 1.12 2001/09/16 15:59:11 chikama Exp $ */
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <SDL.h>
#ifdef __EMSCRIPTEN__
#include <emscripten.h>
#endif
#include "portab.h"
#include "system.h"
#include "graphics.h"
#include "nact.h"
#include "ags.h"
#include "cg.h"
@@ -42,6 +46,9 @@
#include "filecheck.h"
#include "cache.h"
static int *censor_list; // sorted list of cg numbers
static int censor_list_size;
/* VSPのパレット展開バンク */
int cg_vspPB;
/* cg,palette 展開フラグ (funciotn flag) */
@@ -51,13 +58,15 @@ int *cg_loadCountVar;
/* Brightness (PD command) */
int cg_brightness;
#define MOSAIC_SIZE 16
#define GCMD_EXTRACTCG(c) ((c) & 0x01)
#define GCMD_SET_PALETTE(c) ((c) & 0x02)
#define GCMD_LOAD_PALETTE(c) ((c) & 0x04)
/* CG表示位置に関する情報 */
static CG_WHERETODISP loc_policy, loc_policy0;
static MyPoint loc_where, loc_where0;
static SDL_Point loc_where, loc_where0;
/* extracted cg data cache control object */
static cacher *cacheid;
@@ -65,11 +74,51 @@ static cacher *cacheid;
/* static methods */
static CG_TYPE check_cgformat(uint8_t *data);
static void set_vspbank(uint8_t *pic, int bank, int width, int height);
static MyPoint set_display_loc(cgdata *cg);
static SDL_Point set_display_loc(cgdata *cg);
static void clear_display_loc();
static void display_cg(cgdata *cg, int x, int y, int sprite_color, bool alpha_blend);
static cgdata *loader(int no);
static int compare_integers(const void *a, const void *b) {
int int_a = *(const int *)a;
int int_b = *(const int *)b;
return (int_a > int_b) - (int_a < int_b);
}
static bool is_censored_cg(int no) {
no += 1; // CG numbers are 1-based.
if (!censor_list)
return false;
return bsearch(&no, censor_list, censor_list_size, sizeof(int), compare_integers) != NULL;
}
static void cg_mosaic(cgdata *cg) {
Uint32 format;
switch (cg->depth) {
case 8:
format = SDL_PIXELFORMAT_INDEX8;
break;
case 16:
format = SDL_PIXELFORMAT_RGB565;
break;
case 24:
format = SDL_PIXELFORMAT_RGB24;
break;
default:
SYSERROR("Unsupported cg depth %d", cg->depth);
}
SDL_Surface *sf = SDL_CreateRGBSurfaceWithFormatFrom(
cg->pic, cg->width, cg->height, cg->depth, cg->width * (cg->depth / 8), format);
SDL_Surface *tmp = SDL_CreateRGBSurfaceWithFormat(
0, (cg->width + MOSAIC_SIZE - 1) / MOSAIC_SIZE, (cg->height + MOSAIC_SIZE - 1) / MOSAIC_SIZE, cg->depth, format);
if (sf->format->palette)
SDL_SetSurfacePalette(tmp, sf->format->palette);
// NOTE: SDL_BlitScaled() does not support 8-bit surfaces.
SDL_SoftStretch(sf, NULL, tmp, NULL);
SDL_SoftStretch(tmp, NULL, sf, NULL);
SDL_FreeSurface(tmp);
SDL_FreeSurface(sf);
}
/*
* Identify cg format
@@ -131,8 +180,8 @@ void cgdata_free(cgdata *cg) {
* cg: cg information
* return: x and y for display location
*/
static MyPoint set_display_loc(cgdata *cg) {
MyPoint p;
static SDL_Point set_display_loc(cgdata *cg) {
SDL_Point p;
switch(loc_policy) {
case OFFSET_ABSOLUTE_GC:
@@ -231,8 +280,12 @@ static cgdata *loader(int no) {
default:
break;
}
/* insert to cache */
if (cg) {
if (is_censored_cg(no)) {
cg_mosaic(cg);
}
/* insert to cache */
int size = cg->width * cg->height * (cg->depth / 8);
cache_insert(cacheid, no, cg, size, NULL);
}
@@ -288,7 +341,7 @@ void cg_set_display_location(int x, int y, CG_WHERETODISP policy) {
*/
void cg_load(int no, int flg) {
cgdata *cg;
MyPoint p;
SDL_Point p;
int i, bank = cg_vspPB;
/* load and extract cg */
@@ -361,7 +414,7 @@ void cg_load(int no, int flg) {
*/
void cg_load_with_alpha(int cgno, int shadowno) {
cgdata *cg = NULL, *scg;
MyPoint p;
SDL_Point p;
/* load pixel */
if (cgno >= 0) {
@@ -441,7 +494,7 @@ int cg_load_with_filename(char *fname_utf8, int x, int y) {
long filesize;
uint8_t *data;
cgdata *cg = NULL;
MyPoint p;
SDL_Point p;
data = load_cg_from_file(fname_utf8, &status, &filesize);
if (data == NULL) return status;
@@ -490,9 +543,9 @@ int cg_load_with_filename(char *fname_utf8, int x, int y) {
* no : file no for cg ( >= 0 )
* info: information to be retored
*/
void cg_get_info(int no, MyRectangle *info) {
void cg_get_info(int no, SDL_Rect *info) {
cgdata *cg = loader(no);
MyPoint p;
SDL_Point p;
if (cg == NULL) {
info->x = info->y = info->w = info->h = 0;
@@ -537,6 +590,10 @@ SDL_Surface *cg_load_as_sdlsurface(int no) {
ald_freedata(dfile);
if (!cg) return NULL;
if (is_censored_cg(no)) {
cg_mosaic(cg);
}
SDL_Surface *pic = type == ALCG_PMS16
? SDL_CreateRGBSurfaceWithFormatFrom(cg->pic, cg->width, cg->height, 16, cg->width * 2, SDL_PIXELFORMAT_RGB565)
: SDL_CreateRGBSurfaceWithFormatFrom(cg->pic, cg->width, cg->height, 24, cg->width * 3, SDL_PIXELFORMAT_RGB24);
@@ -563,3 +620,60 @@ SDL_Surface *cg_load_as_sdlsurface(int no) {
cgdata_free(cg);
return sf;
}
EMSCRIPTEN_KEEPALIVE
void load_censor_list(const char *path) {
if (cacheid)
cache_clear(cacheid);
if (censor_list) {
free(censor_list);
censor_list = NULL;
censor_list_size = 0;
}
if (!path || !*path)
return;
FILE *fp = fopen(path, "r");
if (!fp) {
SYSERROR("failed to open censor list file %s", path);
return;
}
char line[256];
int count = 0, cap = 256;
censor_list = malloc(cap * sizeof(int));
int line_no = 0;
while (fgets(line, sizeof(line), fp)) {
line_no++;
char *p = line;
char *comment = strchr(p, '#');
if (comment)
*comment = '\0';
while (*p && isspace((unsigned char)*p))
p++;
if (*p == '\0')
continue;
if (count >= cap) {
cap *= 2;
censor_list = realloc(censor_list, cap * sizeof(int));
}
char *endptr;
censor_list[count++] = (int)strtol(p, &endptr, 10);
while (*endptr && isspace((unsigned char)*endptr))
endptr++;
if (*endptr != '\0')
WARNING("invalid line %d in %s", line_no, path);
}
censor_list_size = count;
fclose(fp);
if (censor_list_size > 0) {
qsort(censor_list, censor_list_size, sizeof(int), compare_integers);
} else {
free(censor_list);
censor_list = NULL;
}
}
+3 -2
View File
@@ -24,8 +24,8 @@
#ifndef __CG__
#define __CG__
#include <SDL_rect.h>
#include "portab.h"
#include "graphics.h"
struct SDL_Surface;
@@ -80,10 +80,11 @@ extern void cg_set_display_location(int x, int y, CG_WHERETODISP policy);
extern void cg_load(int no, int flg);
extern void cg_load_with_alpha(int cgno, int shadowno);
extern int cg_load_with_filename(char *fname_utf8, int x, int y);
extern void cg_get_info(int no, MyRectangle *info);
extern void cg_get_info(int no, SDL_Rect *info);
extern void cg_clear_display_loc();
extern void cgdata_free(cgdata *cg);
extern struct SDL_Surface *cg_load_as_sdlsurface(int no);
extern void load_censor_list(const char *path);
extern int cg_vspPB;
extern int cg_fflg;
+8 -293
View File
@@ -24,7 +24,6 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include "portab.h"
#include "xsystem35.h"
#include "scenario.h"
@@ -33,16 +32,15 @@
#include "input.h"
#include "msgskip.h"
#include "selection.h"
#include "message.h"
#include "music.h"
#include "utfsjis.h"
#include "hankaku.h"
#include "ags.h"
#include "sdl_core.h"
#include "gfx.h"
#include "ald_manager.h"
#include "LittleEndian.h"
#include "hacks.h"
#include "filecheck.h"
#include "cmd_check.h"
/* 選択 Window OPEN 時 callback */
static int cb_sel_init_page = 0;
@@ -52,11 +50,6 @@ static const char REGREADSTRING_RESULT[] = "*regReadString*";
static SDL_Rect clip_window;
extern INPUTSTRING_PARAM mi_param;
extern void commandH();
extern void commandHH();
typedef struct {
int page;
int index;
@@ -65,72 +58,6 @@ typedef struct {
#define FCTBL_MAX 1024
static fncall_table fnctbl[FCTBL_MAX];
void commands2F00() {
/* テキストカラーをスタックからポップして設定する */
sl_popState(STACK_TEXTCOLOR);
TRACE("TOC:");
}
void commands2F01() {
/* テキストフォントサイズをスタックからポップして設定する */
sl_popState(STACK_TEXTSIZE);
TRACE("TOS:");
}
void commands2F02() {
/* 現在のテキストカラーをスタックにプッシュする */
int type = getCaliValue();
switch (type) {
case 0: sl_pushTextColor(type, nact->msg.MsgFontColor); break;
case 1: sl_pushTextColor(type, nact->sel.MsgFontColor); break;
default: WARNING("TPC: unknown type %d", type); break;
}
TRACE("TPC %d", exp);
}
void commands2F03() {
/* 現在のテキストフォントサイズをスタックにプッシュする */
int type = getCaliValue();
switch (type) {
case 0: sl_pushTextSize(type, nact->msg.MsgFontSize); break;
case 1: sl_pushTextSize(type, nact->sel.MsgFontSize); break;
default: WARNING("TPS: unknown type %d", type); break;
}
TRACE("TPS %d", exp);
}
void commands2F04() {
/* テキスト表示位置をスタックからポップして設定する */
sl_popState(STACK_TEXTLOC);
TRACE("TOP:");
}
void commands2F05() {
/* 現在のテキスト表示位置をスタックにプッシュする */
MyPoint loc;
msg_getMessageLocation(&loc);
sl_pushTextLoc(loc.x, loc.y);
TRACE("TPP:");
}
void commands2F08() {
/* アンチエイリアシング付きテキスト描画のフラグ設定 */
int exp = getCaliValue();
ags_setAntialiasedStringMode(exp == 1);
TRACE("TAA %d:", exp);
}
void commands2F09() {
/* アンチエイリアシング付きテキスト描画のフラグ取得 */
int *var = getCaliVariable();
*var = ags_getAntialiasedStringMode() ? 1 : 0;
TRACE("TAB %d:", *var);
}
void commands2F0A() {
/* Wavデータを読み込む */
int eCh = getCaliValue();
@@ -331,162 +258,6 @@ void commands2F21() {
sys_addMsg(str);
}
void commands2F23() {
int x = getCaliValue();
int y = getCaliValue();
const char *vFileName = sl_getString(0);
char *fname_utf8 = toUTF8(vFileName);
sysVar[0] = cg_load_with_filename(fname_utf8, x, y);
free(fname_utf8);
TRACE("LC(new) %d, %d, %s:", x, y, vFileName);
}
void commands2F24() {
int type = sl_getc();
const char *file_name = sl_getString(0);
int var, cnt;
struct VarRef vref;
char *fname_utf8 = toUTF8(file_name);
switch (type) {
case 0:
getCaliArray(&vref);
var = vref.var;
cnt = getCaliValue();
sysVar[0] = load_vars_from_file(fname_utf8, &vref, cnt);
break;
case 1:
var = getCaliValue();
cnt = getCaliValue();
sysVar[0] = load_strs_from_file(fname_utf8, var, cnt);
break;
default:
var = getCaliValue();
cnt = getCaliValue();
WARNING("Unknown LE command type %d", type);
break;
}
free(fname_utf8);
TRACE("LE(new) %d, %s, %d, %d:", type, file_name, var, cnt);
}
void commands2F25() {
int file_name = getCaliValue();
const char *title = sl_getString(0);
const char *filter = sl_getString(0);
TRACE_UNIMPLEMENTED("LXG %d, %s, %s:", file_name, title, filter);
}
void commands2F26() {
int dst_no = getCaliValue();
int max_len = getCaliValue();
const char *title = sl_getString(0);
char *t1, *t2, *t3;
t1 = toUTF8(title);
t2 = toUTF8(svar_get(dst_no));
mi_param.title = t1;
mi_param.oldstring = t2;
mi_param.max = max_len;
menu_inputstring(&mi_param);
if (mi_param.newstring == NULL) {
svar_set(dst_no, NULL);
free(t1); free(t2);
return;
}
t3 = fromUTF8(mi_param.newstring);
svar_set(dst_no, t3);
free(t1);
free(t2);
free(t3);
TRACE("MI(new) %d, %d, %s:", dst_no, max_len, title);
}
void commands2F27() {
int num = getCaliValue();
const char *string = sl_getString(0);
svar_set(num, string);
TRACE("MS(new) %d, %s:", num, string);
}
void commands2F28() {
const char *title = sl_getString(0);
if (nact->game_title_utf8)
free(nact->game_title_utf8);
nact->game_title_utf8 = toUTF8(title);
ags_setWindowTitle(nact->game_title_utf8);
enable_hack_by_title(nact->game_title_utf8);
TRACE("MT(new) %s:",title);
}
/* defined in cmdn.c */
extern INPUTNUM_PARAM ni_param;
void commands2F29() {
const char *title = sl_getString(0);
char *t;
if (ni_param.title != NULL) {
free(ni_param.title);
}
t = toUTF8(title);
ni_param.title = t;
TRACE("NT(new) %s:", title);
}
void commands2F2A() {
int type = sl_getc();
const char *file_name = sl_getString(0);
int var, cnt;
struct VarRef vref;
char *fname_utf8 = toUTF8(file_name);
switch(type) {
case 0:
getCaliArray(&vref);
var = vref.var;
cnt = getCaliValue();
sysVar[0] = save_vars_to_file(fname_utf8, &vref, cnt);
break;
case 1:
var = getCaliValue();
cnt = getCaliValue();
sysVar[0] = save_strs_to_file(fname_utf8, var, cnt);
break;
default:
var = getCaliValue();
cnt = getCaliValue();
WARNING("Unknown QE command");
break;
}
free(fname_utf8);
TRACE("QE(new) %d, %s, %d, %d:", type, file_name, var, cnt);
}
void commands2F2B() {
int type = sl_getc();
const char *work_dir = sl_getString(0);
const char *file_name = sl_getString(0);
TRACE_UNIMPLEMENTED("UP(new) %d, %s, %s:", type, work_dir, file_name);
}
void commands2F2D() {
int eCh = getCaliValue();
int eTime = getCaliValue();
@@ -706,23 +477,12 @@ void commands2F43() {
int eLength = getCaliValue();
int eColor = getCaliValue();
sdl_fillCircle(eX, eY, eLength, eColor);
gfx_fillCircle(eX, eY, eLength, eColor);
ags_updateArea(eX, eY, eLength, eLength);
TRACE("grDrawFillCircle %d, %d, %d, %d:", eX, eY, eLength, eColor);
}
void commands2F44() {
int num1 = getCaliValue();
int fig = getCaliValue();
int num2 = getCaliValue();
char buf[256];
svar_set(num1, format_number(num2, fig, buf));
TRACE("MHH %d, %d, %d:", num1, fig, num2);
}
void commands2F45() {
int fPage = sl_getw();
int fIndex = sl_getaddr();
@@ -781,52 +541,15 @@ void commands2F4C() {
int eWidth = getCaliValue();
int eHeight = getCaliValue();
MyRectangle r = {eSrcX, eSrcY, eWidth, eHeight};
MyPoint p = {eX, eY};
SDL_Rect r = {eSrcX, eSrcY, eWidth, eHeight};
SDL_Point p = {eX, eY};
sdl_updateArea(&r, &p);
gfx_updateArea(&r, &p);
TRACE("grBlt %d, %d, %d, %d, %d, %d:",
eX, eY, eSrcX, eSrcY, eWidth, eHeight);
}
void commands2F4D() {
int eNum = getCaliValue();
const char *sText = sl_getString(0);
TRACE_UNIMPLEMENTED("LXWT %d, %s:", eNum, sText);
}
void commands2F4E() {
int eNum = getCaliValue();
int eTextNum = getCaliValue();
TRACE_UNIMPLEMENTED("LXWS %d, %d:", eNum, eTextNum);
}
void commands2F4F() {
int eNum = getCaliValue();
int eType = getCaliValue();
TRACE_UNIMPLEMENTED("LXWE %d, %d:", eNum, eType);
}
void commands2F50() {
int eFile = getCaliValue();
int nFlg = sl_getc();
int eNum = getCaliValue();
TRACE_UNIMPLEMENTED("LXWH %d, %d, %d:", eFile, nFlg, eNum);
}
void commands2F51() {
int eFile = getCaliValue();
int nFlg = sl_getc();
int eNum = getCaliValue();
TRACE_UNIMPLEMENTED("LXWHH %d, %d, %d:", eFile, nFlg, eNum);
}
void commands2F52() {
int eNum = getCaliValue();
if (eNum <= 0) return;
@@ -882,14 +605,6 @@ void commands2F55() {
}
}
void commands2F56() {
int file_name = getCaliValue();
const char *title = sl_getString(0);
const char *folder = sl_getString(0);
TRACE_UNIMPLEMENTED("LXF %d, %s, %s:", file_name, title, folder);
}
void commands2F57() {
const char *sTitle = sl_getString(0);
int eStrVar = getCaliValue();
@@ -943,7 +658,7 @@ void commands2F5A() {
char *t1;
t1 = toUTF8(sText);
sdl_showMessageBox(MESSAGEBOX_INFO, nact->game_title_utf8, t1);
sys_show_message_box(MESSAGEBOX_INFO, nact->game_title_utf8, t1);
free(t1);
TRACE("strMessageBox %s:", sText);
@@ -954,7 +669,7 @@ void commands2F5B() {
char *t1;
t1 = toUTF8(svar_get(eNum));
sdl_showMessageBox(MESSAGEBOX_INFO, nact->game_title_utf8, t1);
sys_show_message_box(MESSAGEBOX_INFO, nact->game_title_utf8, t1);
free(t1);
TRACE("strMessageBoxStr %d:", eNum);
+34 -34
View File
@@ -32,7 +32,7 @@
#include "selection.h"
#include "message.h"
#include "input.h"
#include "sdl_core.h"
#include "gfx.h"
static void undeferr();
@@ -181,7 +181,7 @@ void exec_command(void) {
int c0 = sl_getc();
if (c0 == BREAKPOINT) {
sdl_updateScreen();
gfx_updateScreen();
c0 = dbg_handle_breakpoint(sl_getPage(), sl_getIndex() - 1);
}
@@ -249,25 +249,25 @@ void exec_command(void) {
/* 小文字コマンド */
switch(sl_getc()) {
case 0x00:
commands2F00(); break;
commandTOC(); break;
case 0x01:
commands2F01(); break;
commandTOS(); break;
case 0x02:
commands2F02(); break;
commandTPC(); break;
case 0x03:
commands2F03(); break;
commandTPS(); break;
case 0x04:
commands2F04(); break;
commandTOP(); break;
case 0x05:
commands2F05(); break;
commandTPP(); break;
case 0x06:
commandsINC(); break;
case 0x07:
commandsDEC(); break;
case 0x08:
commands2F08(); break;
commandTAA(); break;
case 0x09:
commands2F09(); break;
commandTAB(); break;
case 0x0a:
commands2F0A(); break;
case 0x0b:
@@ -319,23 +319,23 @@ void exec_command(void) {
case 0x22:
commandHH(); break;
case 0x23:
commands2F23(); break;
commandLC(0); break;
case 0x24:
commands2F24(); break;
commandLE(0); break;
case 0x25:
commands2F25(); break;
commandLXG(0); break;
case 0x26:
commands2F26(); break;
commandMI(0); break;
case 0x27:
commands2F27(); break;
commandMS(0); break;
case 0x28:
commands2F28(); break;
commandMT(0); break;
case 0x29:
commands2F29(); break;
commandNT(0); break;
case 0x2a:
commands2F2A(); break;
commandQE(0); break;
case 0x2b:
commands2F2B(); break;
commandUP(); break;
case 0x2c:
commandF(); break;
case 0x2d:
@@ -385,7 +385,7 @@ void exec_command(void) {
case 0x43:
commands2F43(); break;
case 0x44:
commands2F44(); break;
commandMHH(); break;
case 0x45:
commands2F45(); break;
case 0x46:
@@ -403,15 +403,15 @@ void exec_command(void) {
case 0x4c:
commands2F4C(); break;
case 0x4d:
commands2F4D(); break;
commandLXWT(); break;
case 0x4e:
commands2F4E(); break;
commandLXWS(); break;
case 0x4f:
commands2F4F(); break;
commandLXWE(); break;
case 0x50:
commands2F50(); break;
commandLXWH(); break;
case 0x51:
commands2F51(); break;
commandLXWHH(); break;
case 0x52:
commands2F52(); break;
case 0x53:
@@ -421,7 +421,7 @@ void exec_command(void) {
case 0x55:
commands2F55(); break;
case 0x56:
commands2F56(); break;
commandLXF(); break;
case 0x57:
commands2F57(); break;
case 0x58:
@@ -731,7 +731,7 @@ void exec_command(void) {
case 'L':
switch(sl_getc()) {
case 'C':
commandLC(); break;
commandLC(':'); break;
case 'D':
commandLD(); break;
case 'P':
@@ -739,7 +739,7 @@ void exec_command(void) {
case 'T':
commandLT(); break;
case 'E':
commandLE(); break;
commandLE(':'); break;
case 'L':
commandLL(); break;
case 'H':
@@ -761,7 +761,7 @@ void exec_command(void) {
case 'X':
switch(sl_getc()) {
case 'G':
commandLXG(); break;
commandLXG(':'); break;
case 'O':
commandLXO(); break;
case 'C':
@@ -803,7 +803,7 @@ void exec_command(void) {
case 'H':
commandMH(); break;
case 'I':
commandMI(); break;
commandMI(':'); break;
case 'J':
commandMJ(); break;
case 'L':
@@ -815,9 +815,9 @@ void exec_command(void) {
case 'P':
commandMP(); break;
case 'S':
commandMS(); break;
commandMS(':'); break;
case 'T':
commandMT(); break;
commandMT(':'); break;
case 'V':
commandMV(); break;
case 'Z':
@@ -871,7 +871,7 @@ void exec_command(void) {
case 'O':
commandNO(); break;
case 'T':
commandNT(); break;
commandNT(':'); break;
case 'D':
switch(sl_getc()) {
case 'C':
@@ -943,7 +943,7 @@ void exec_command(void) {
case 'D':
commandQD(); break;
case 'E':
commandQE(); break;
commandQE(':'); break;
case 'P':
commandQP(); break;
default:
+24 -32
View File
@@ -116,9 +116,9 @@ extern void commandKR();
extern void commandKW();
/* defined by cmdl.c */
extern void commandLC();
extern void commandLC(char terminator);
extern void commandLD();
extern void commandLE();
extern void commandLE(char terminator);
extern void commandLHD();
extern void commandLHG();
extern void commandLHM();
@@ -127,7 +127,7 @@ extern void commandLHW();
extern void commandLL();
extern void commandLP();
extern void commandLT();
extern void commandLXG();
extern void commandLXG(char terminator);
extern void commandLXO();
extern void commandLXC();
extern void commandLXL();
@@ -136,6 +136,12 @@ extern void commandLXP();
extern void commandLXR();
extern void commandLXW();
extern void commandLXX();
extern void commandLXWT();
extern void commandLXWS();
extern void commandLXWE();
extern void commandLXWH();
extern void commandLXWHH();
extern void commandLXF();
/* defined by cmdm.c */
extern void commandMA();
@@ -145,14 +151,15 @@ extern void commandME();
extern void commandMF();
extern void commandMG();
extern void commandMH();
extern void commandMI();
extern void commandMHH();
extern void commandMI(char terminator);
extern void commandMJ();
extern void commandML();
extern void commandMM();
extern void commandMN();
extern void commandMP();
extern void commandMS();
extern void commandMT();
extern void commandMS(char terminator);
extern void commandMT(char terminator);
extern void commandMV();
extern void commandMZ0();
@@ -175,7 +182,7 @@ extern void commandNI();
extern void commandNP();
extern void commandNR();
extern void commandNO();
extern void commandNT();
extern void commandNT(char terminator);
extern void commandND_ADD();
extern void commandND_SUB();
extern void commandND_MUL();
@@ -205,7 +212,7 @@ extern void commandPW();
/* defined by cmdq.c */
extern void commandQC();
extern void commandQD();
extern void commandQE();
extern void commandQE(char terminator);
extern void commandQP();
/* defined by cmds.c */
@@ -227,6 +234,14 @@ extern void commandSI();
/* defined by cmdt.c */
extern void commandT();
extern void commandTOC();
extern void commandTOS();
extern void commandTPC();
extern void commandTPS();
extern void commandTOP();
extern void commandTPP();
extern void commandTAA();
extern void commandTAB();
/* defined by cmdu.c */
extern void commandUC();
@@ -237,6 +252,7 @@ extern void commandUG();
extern void commandUP0();
extern void commandUP1();
extern void commandUP3();
extern void commandUP();
/* defined by cmdv.c */
extern void commandVC();
@@ -308,14 +324,6 @@ extern void commandZR();
extern void commandZU();
/* define in cmd2F.c */
extern void commands2F00();
extern void commands2F01();
extern void commands2F02();
extern void commands2F03();
extern void commands2F04();
extern void commands2F05();
extern void commands2F08();
extern void commands2F09();
extern void commands2F0A();
extern void commands2F0B();
extern void commands2F0C();
@@ -340,15 +348,6 @@ extern void commands2F1E();
extern void commands2F1F();
extern void commands2F20();
extern void commands2F21();
extern void commands2F23();
extern void commands2F24();
extern void commands2F25();
extern void commands2F26();
extern void commands2F27();
extern void commands2F28();
extern void commands2F29();
extern void commands2F2A();
extern void commands2F2B();
extern void commands2F2D();
extern void commands2F2E();
extern void commands2F2F();
@@ -372,7 +371,6 @@ extern void commands2F40();
extern void commands2F41();
extern void commands2F42();
extern void commands2F43();
extern void commands2F44();
extern void commands2F45();
extern void commands2F46();
extern void commands2F47();
@@ -381,16 +379,10 @@ extern void commands2F49();
extern void commands2F4A();
extern void commands2F4B();
extern void commands2F4C();
extern void commands2F4D();
extern void commands2F4E();
extern void commands2F4F();
extern void commands2F50();
extern void commands2F51();
extern void commands2F52();
extern void commands2F53();
extern void commands2F54();
extern void commands2F55();
extern void commands2F56();
extern void commands2F57();
extern void commands2F58();
extern void commands2F59();
+1 -1
View File
@@ -134,7 +134,7 @@ void commandB4() {
}
void commandB10() {
MyPoint p;
SDL_Point p;
int *x_var = getCaliVariable();
int *y_var = getCaliVariable();
+1 -1
View File
@@ -265,7 +265,7 @@ void commandCP() {
int y = getCaliValue();
int color = getCaliValue();
MyRectangle rec = ags_floodFill(x, y, color);
SDL_Rect rec = ags_floodFill(x, y, color);
if (!SDL_RectEmpty(&rec))
ags_updateArea(rec.x, rec.y, rec.w, rec.h);
+6 -7
View File
@@ -26,10 +26,9 @@
#include "xsystem35.h"
#include "scenario.h"
#include "ags.h"
#include "graphics.h"
typedef struct {
MyRectangle r;
SDL_Rect r;
int pal;
} Ecomtbl;
@@ -55,7 +54,7 @@ void commandES() {
void commandEC() {
int num = getCaliValue();
Ecomtbl *e;
MyRectangle *r;
SDL_Rect *r;
if (num == 0) {
r = &nact->ags.view_area;
@@ -91,8 +90,8 @@ void commandEM() {
int x = getCaliValue();
int y = getCaliValue();
MyPoint p = {x, y};
MyRectangle r = tbl[num - 1].r;
SDL_Point p = {x, y};
SDL_Rect r = tbl[num - 1].r;
if (nact->patch_emen == 0) {
r.w -= 1;
r.h -= 1;
@@ -108,11 +107,11 @@ void commandEN() {
int x = getCaliValue();
int y = getCaliValue();
MyPoint p = {x, y};
SDL_Point p = {x, y};
*var = 0;
for (int i = min; i <= max; i++) {
MyRectangle r = tbl[i - 1].r;
SDL_Rect r = tbl[i - 1].r;
if (nact->patch_emen == 0) {
r.w -= 1;
r.h -= 1;
+1 -1
View File
@@ -57,7 +57,7 @@ void commandG1() {
void commandGS() {
/* num 番にリンクされているCGの座標とサイズを取得する */
MyRectangle r;
SDL_Rect r;
int num = getCaliValue();
int *var = getCaliVariable();
+1 -2
View File
@@ -28,7 +28,6 @@
#include "xsystem35.h"
#include "scenario.h"
#include "ags.h"
#include "sdl_core.h"
#include "input.h"
#include "msgskip.h"
@@ -102,7 +101,7 @@ void commandIM() {
/* マウスカーソルの座標取得 */
int *x_var = getCaliVariable();
int *y_var = getCaliVariable();
MyPoint p;
SDL_Point p;
sysVar[0] = sys_getMouseInfo(&p, false);
*x_var = p.x;
+72 -10
View File
@@ -36,6 +36,7 @@
#include "savedata.h"
#include "utfsjis.h"
#include "cg.h"
#include "cmd_check.h"
void commandLD() {
/* 変数領域などのデータをロードする。(全ロード)*/
@@ -106,24 +107,38 @@ void commandLT() {
TRACE("LT %d,%p",num, var);
}
void commandLE() {
void commandLE(char terminator) {
int type = sl_getc();
const char *filename = sl_getString(':');
const char *filename = sl_getString(terminator);
char *fname_utf8 = toUTF8(filename);
char *fallback_fname = NULL;
if (strchr(fname_utf8, '\\')) {
fallback_fname = strdup(fname_utf8);
for (char *p = fname_utf8; *p; p++) {
if (*p == '\\')
*p = '/';
}
}
int var, cnt;
struct VarRef vref;
char *fname_utf8 = toUTF8(filename);
switch (type) {
case 0:
getCaliArray(&vref);
var = vref.var;
cnt = getCaliValue();
sysVar[0] = load_vars_from_file(fname_utf8, &vref, cnt);
// For compatibility; the QE command in v2.16.1 and earlier did not
// convert backslashes to slashes.
if (sysVar[0] == SAVE_LOADERR && fallback_fname)
sysVar[0] = load_vars_from_file(fallback_fname, &vref, cnt);
break;
case 1:
var = getCaliValue();
cnt = getCaliValue();
sysVar[0] = load_strs_from_file(fname_utf8, var, cnt);
if (sysVar[0] == SAVE_LOADERR && fallback_fname)
sysVar[0] = load_strs_from_file(fallback_fname, var, cnt);
break;
default:
var = getCaliValue();
@@ -131,6 +146,8 @@ void commandLE() {
WARNING("Unknown LE command %d", type);
break;
}
if (fallback_fname)
free(fallback_fname);
free(fname_utf8);
TRACE("LE %d,%s,%d,%d:",type, filename, var, cnt);
@@ -254,11 +271,11 @@ void commandLHW() {
TRACE("LHW %d,%d:",p1,no);
}
void commandLC() {
void commandLC(char terminator) {
int x = getCaliValue();
int y = getCaliValue();
const char *filename = sl_getString(':');
const char *filename = sl_getString(terminator);
char *fname_utf8 = toUTF8(filename);
sysVar[0] = cg_load_with_filename(fname_utf8, x, y);
free(fname_utf8);
@@ -266,11 +283,11 @@ void commandLC() {
TRACE("LC %d,%d,%s:", x, y, filename);
}
void commandLXG() {
void commandLXG(char terminator) {
/* ファイルを選択する */
int file_name = getCaliValue();
const char *title = sl_getString(':');
const char *filter = sl_getString(':');
const char *title = sl_getString(terminator);
const char *filter = sl_getString(terminator);
TRACE_UNIMPLEMENTED("LXG %d,%s,%s:", file_name, title, filter);
}
@@ -376,3 +393,48 @@ void commandLXX() {
TRACE("LXX %d,%d,%d:", type, num, *var);
}
void commandLXWT() {
int eNum = getCaliValue();
const char *sText = sl_getString(0);
TRACE_UNIMPLEMENTED("LXWT %d, %s:", eNum, sText);
}
void commandLXWS() {
int eNum = getCaliValue();
int eTextNum = getCaliValue();
TRACE_UNIMPLEMENTED("LXWS %d, %d:", eNum, eTextNum);
}
void commandLXWE() {
int eNum = getCaliValue();
int eType = getCaliValue();
TRACE_UNIMPLEMENTED("LXWE %d, %d:", eNum, eType);
}
void commandLXWH() {
int eFile = getCaliValue();
int nFlg = sl_getc();
int eNum = getCaliValue();
TRACE_UNIMPLEMENTED("LXWH %d, %d, %d:", eFile, nFlg, eNum);
}
void commandLXWHH() {
int eFile = getCaliValue();
int nFlg = sl_getc();
int eNum = getCaliValue();
TRACE_UNIMPLEMENTED("LXWHH %d, %d, %d:", eFile, nFlg, eNum);
}
void commandLXF() {
int file_name = getCaliValue();
const char *title = sl_getString(0);
const char *folder = sl_getString(0);
TRACE_UNIMPLEMENTED("LXF %d, %s, %s:", file_name, title, folder);
}
+20 -8
View File
@@ -34,15 +34,16 @@
#include "message.h"
#include "hankaku.h"
#include "hacks.h"
#include "cmd_check.h"
/* MI 用パラメータ */
INPUTSTRING_PARAM mi_param;
static INPUTSTRING_PARAM mi_param;
void commandMS() {
void commandMS(char terminator) {
/* Xコマンドで表示される文字列領域に文字列を入れる */
int num = getCaliValue();
const char *str = sl_getString(':');
const char *str = sl_getString(terminator);
svar_set(num, str);
TRACE("MS %d,%s:",num,str);
}
@@ -90,11 +91,11 @@ void commandMP() {
free(str);
}
void commandMI() { /* T2 */
void commandMI(char terminator) {
/* ユーザーによる文字列の入力 */
int dst_no = getCaliValue();
int max_len = getCaliValue();
const char *title = sl_getString(':');
const char *title = sl_getString(terminator);
char *t1, *t2, *t3;
t1 = toUTF8(title);
@@ -147,9 +148,9 @@ void commandMC() {
TRACE("MC %d,%d:",num1,num2);
}
void commandMT() {
void commandMT(char terminator) {
/* ウインドウのタイトル文字列を設定する */
const char *str = sl_getString(':');
const char *str = sl_getString(terminator);
if (nact->game_title_utf8)
free(nact->game_title_utf8);
@@ -186,6 +187,17 @@ void commandMH() {
TRACE("MH %d,%d,%d:",num1,fig,num2);
}
void commandMHH() {
int num1 = getCaliValue();
int fig = getCaliValue();
int num2 = getCaliValue();
char buf[256];
svar_set(num1, format_number(num2, fig, buf));
TRACE("MHH %d, %d, %d:", num1, fig, num2);
}
void commandMV() {
/* シナリオバージョンをシステムへ通知する */
int version = getCaliValue();
+4 -3
View File
@@ -30,9 +30,10 @@
#include "xsystem35.h"
#include "scenario.h"
#include "menu.h"
#include "cmd_check.h"
/* NI/NT 用パラメータ */
INPUTNUM_PARAM ni_param;
static INPUTNUM_PARAM ni_param;
void commandNB() {
/* var1 から始まるcount個の変数へ
@@ -376,9 +377,9 @@ void commandNI() { /* From Panyo */
TRACE("NI %p,%d,%d,%d:", var, def, _min, _max);
}
void commandNT() { /* From Panyo */
void commandNT(char terminator) {
/* NIコマンドで表示するタイトルを設定する。*/
const char *str = sl_getString(':');
const char *str = sl_getString(terminator);
free(ni_param.title);
ni_param.title = toUTF8(str);
+4 -4
View File
@@ -156,10 +156,10 @@ void commandPT0() {
int *var = getCaliVariable();
int x = getCaliValue();
int y = getCaliValue();
Palette cell;
PixelColor cell;
ags_getPixel(x, y, &cell);
*var = cell.pixel;
*var = cell.index;
TRACE("PT0 %p,%d,%d:", var, x, y);
}
@@ -171,7 +171,7 @@ void commandPT1() {
int *b_var = getCaliVariable();
int x = getCaliValue();
int y = getCaliValue();
Palette cell;
PixelColor cell;
ags_getPixel(x, y, &cell);
*r_var = cell.r;
@@ -187,7 +187,7 @@ void commandPT2() {
int *low_var = getCaliVariable();
int x = getCaliValue();
int y = getCaliValue();
Palette cell;
PixelColor cell;
int r, g, b, pic;
ags_getPixel(x, y, &cell);
+18 -4
View File
@@ -29,6 +29,8 @@
#include "scenario.h"
#include "savedata.h"
#include "utfsjis.h"
#include "filecheck.h"
#include "cmd_check.h"
void commandQD() {
/* 変数領域などのデータをセーブする。(全セーブ)*/
@@ -79,13 +81,25 @@ void commandQC() {
TRACE("QC %d,%d:",num1,num2);
}
void commandQE() {
void commandQE(char terminator) {
int type = sl_getc();
const char *filename = sl_getString(':');
const char *filename = sl_getString(terminator);
char *fname_utf8 = toUTF8(filename);
char *last_slash = NULL;
for (char *p = fname_utf8; *p; p++) {
if (*p == '\\') {
*p = '/';
last_slash = p;
}
}
if (last_slash) {
*last_slash = '\0';
mkdir_p(fname_utf8);
*last_slash = '/';
}
int var, cnt;
struct VarRef vref;
char *fname_utf8 = toUTF8(filename);
switch (type) {
case 0:
getCaliArray(&vref);
+66
View File
@@ -35,3 +35,69 @@ void commandT() {
TRACE("T %d,%d:",x,y);
}
void commandTOC() {
/* テキストカラーをスタックからポップして設定する */
sl_popState(STACK_TEXTCOLOR);
TRACE("TOC:");
}
void commandTOS() {
/* テキストフォントサイズをスタックからポップして設定する */
sl_popState(STACK_TEXTSIZE);
TRACE("TOS:");
}
void commandTPC() {
/* 現在のテキストカラーをスタックにプッシュする */
int type = getCaliValue();
switch (type) {
case 0: sl_pushTextColor(type, nact->msg.MsgFontColor); break;
case 1: sl_pushTextColor(type, nact->sel.MsgFontColor); break;
default: WARNING("TPC: unknown type %d", type); break;
}
TRACE("TPC %d", exp);
}
void commandTPS() {
/* 現在のテキストフォントサイズをスタックにプッシュする */
int type = getCaliValue();
switch (type) {
case 0: sl_pushTextSize(type, nact->msg.MsgFontSize); break;
case 1: sl_pushTextSize(type, nact->sel.MsgFontSize); break;
default: WARNING("TPS: unknown type %d", type); break;
}
TRACE("TPS %d", exp);
}
void commandTOP() {
/* テキスト表示位置をスタックからポップして設定する */
sl_popState(STACK_TEXTLOC);
TRACE("TOP:");
}
void commandTPP() {
/* 現在のテキスト表示位置をスタックにプッシュする */
SDL_Point loc;
msg_getMessageLocation(&loc);
sl_pushTextLoc(loc.x, loc.y);
TRACE("TPP:");
}
void commandTAA() {
/* アンチエイリアシング付きテキスト描画のフラグ設定 */
int exp = getCaliValue();
ags_setAntialiasedStringMode(exp == 1);
TRACE("TAA %d:", exp);
}
void commandTAB() {
/* アンチエイリアシング付きテキスト描画のフラグ取得 */
int *var = getCaliVariable();
*var = ags_getAntialiasedStringMode() ? 1 : 0;
TRACE("TAB %d:", *var);
}
+8
View File
@@ -122,3 +122,11 @@ void commandUP3() {
TRACE_UNIMPLEMENTED("UP3 %s,%s:",str1,str2);
}
void commandUP() {
int type = sl_getc();
const char *work_dir = sl_getString(0);
const char *file_name = sl_getString(0);
TRACE_UNIMPLEMENTED("UP(new) %d, %s, %s:", type, work_dir, file_name);
}
+4 -5
View File
@@ -27,7 +27,6 @@
#include <unistd.h>
#include <sys/time.h>
#include "portab.h"
#include "sdl_core.h"
#include "scheduler.h"
#include "xsystem35.h"
#include "scenario.h"
@@ -760,7 +759,7 @@ void commandVA() { /* from Panyo */
/* 開始 (p3=コマ数,0:無限(開始位置==終了位置のとき))*/
inAnimation = true;
VAcmd[p1].elaspCut = 0;
VAcmd[p1].startTime = sdl_getTicks();
VAcmd[p1].startTime = sys_get_ticks();
VAcmd[p1].totalCut = p3;
if (p3 == 0) {
@@ -784,7 +783,7 @@ void commandVA() { /* from Panyo */
/* キー抜け無し ,p3=0は指定不可 */
while(VAcmd[p1].state == VA_RUNNING) {
va_animationAlone(p1);
sdl_sleep(10);
sys_sleep(10);
}
va_drawUnit(p1);
va_updateUnit(p1);
@@ -794,7 +793,7 @@ void commandVA() { /* from Panyo */
VAcmd[p1].rewrite = true;
while(VAcmd[p1].state == VA_RUNNING) {
va_animationAlone(p1);
sdl_sleep(10);
sys_sleep(10);
key = sys_getInputInfo();
if (key != 0) {
sysVar[0] = key;
@@ -1003,7 +1002,7 @@ static void va_animationAlone(int i) {
static void va_update() {
bool proceeding = false;
int i;
int curTime = sdl_getTicks();
int curTime = sys_get_ticks();
for (i = 0; i < VACMD_MAX; i++) {
if (VAcmd[i].state == VA_RUNNING) {
+2 -3
View File
@@ -31,7 +31,6 @@
#include "input.h"
#include "scenario.h"
#include "cmd_check.h"
#include "sdl_core.h"
#include "scheduler.h"
#include "music_cdrom.h"
#include "hacks.h"
@@ -68,14 +67,14 @@ unsigned Y3waitFlags = KEYWAIT_CANCELABLE;
* delay, when a button is pressed.
*
* For Rance4 v2, this does not work because the UI loop also checks keyboard
* status, so we use a different hack. See rance4v2_hack() in sdl_event.c.
* status, so we use a different hack. See rance4v2_hack() in event.c.
*/
static void rance4_Y3_IM_hack() {
static int count;
int button_pressed = sys_getInputInfo();
if (!button_pressed) {
sdl_wait_vsync();
sys_wait_vsync();
count = 0;
}
commandIM();
+8 -4
View File
@@ -27,7 +27,7 @@
#include "portab.h"
#include "xsystem35.h"
#include "sdl_core.h"
#include "gfx.h"
#include "scheduler.h"
#include "ags.h"
#include "scenario.h"
@@ -44,13 +44,13 @@ static struct {
} counters[257]; // [0] for ZT 1-5, [1..256] for ZT 10-11
static void reset_counter(int num, int divisor, int offset) {
counters[num].base = sdl_getTicks() - offset;
counters[num].base = sys_get_ticks() - offset;
counters[num].divisor = divisor;
}
static uint32_t get_counter(int num) {
scheduler_on_event(SCHEDULER_EVENT_TIMER_CHECK);
return sdl_getTicks() - counters[num].base;
return sys_get_ticks() - counters[num].base;
}
void commandZC() {
@@ -126,6 +126,10 @@ void commandZW() {
int sw = getCaliValue();
if (sw < 256) {
// System 3.5 has a bug in which ZW 1 does not disable message waiting,
// and Rance 2 depends on it.
if (game_id == GAME_RANCE2)
sw = 2;
nact->messagewait_enable = ((sw & 0xff) > 1);
nact->messagewait_cancelled = false;
} else {
@@ -458,7 +462,7 @@ void commandZZ10() {
/* スクリーンモードを取得する */
int *var = getCaliVariable();
*var = sdl_isFullscreen() ? 1 : 0;
*var = gfx_isFullscreen() ? 1 : 0;
TRACE("ZZ10 %d:",*var);
}
+206 -2
View File
@@ -23,13 +23,217 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <SDL.h>
#include "portab.h"
#include "system.h"
#include "cursor.h"
#include "LittleEndian.h"
#include "ald_manager.h"
#include "sdl_core.h"
#include "bitmaps/cursor_uparrow.xpm"
#define CURSOR_ARROW 1
#define CURSOR_CROSS 2
#define CURSOR_IBEAM 3
#define CURSOR_ICON 4
#define CURSOR_NO 5
#define CURSOR_SIZE 6
#define CURSOR_SIZEALL 7
#define CURSOR_SIZENESW 8
#define CURSOR_SIZENS 9
#define CURSOR_SIZENWSE 10
#define CURSOR_SIZEWE 11
#define CURSOR_UPARROW 12
#define CURSOR_WAIT 13
typedef struct {
short idReserved; /* always set to 0 */
short idType; /* always set to 1 */
short idCount; /* number of cursor images,always set to 1 */
/* immediately followed by idCount TCursorDirEntries */
} CursorHeader;
typedef struct {
unsigned char bWidth; /* Width */
unsigned char bHeight; /* Height */
unsigned char bColorCount;
unsigned char bReserved;
unsigned short wxHotspot;
unsigned short wyHotspot;
unsigned long dwBytesInRes; /* total number of bytes in image */
unsigned long dwImageOffset;
} TCursorDirEntry;
typedef struct {
long biSize; /* sizeof(TBitmapInfoHeader) */
long biWidth; /* width of bitmap */
long biHeight; /* height of bitmap, see notes */
short biPlanes; /* planes, always 1 */
short biBitCount; /* number of color bits */
long biCompression; /* compression used, 0 */
long biSizeImage; /* size of the pixel data, see notes */
long biXPelsPerMeter; /* not used, 0 */
long biYPelsPerMeter; /* not used, 0 */
long biClrUsed; /* # of colors used, set to 0 */
long biClrImportant; /* important colors, set to 0 */
short hotX;
short hotY;
} TBitmapInfoHeader;
/*
biHeight=2*TIconDirEntry.bHeight;
biSizeImage=ANDmask + XORmask;
XORmask=(TIconDirEntry.bWidth * TIconDirEntry.bHeight * biBitCount)/8;
ANDmask=(TIconDirEntry.bWidth * TIconDirEntry.bHeight)/8;
*/
typedef struct {
unsigned char rgbBlue; /* blue component of color */
unsigned char rgbGreen; /* green component of color */
unsigned char rgbRed; /* red component of color */
unsigned char rgbReserved; /* reserved, 0 */
} TRGBQuad;
typedef struct {
TBitmapInfoHeader icHeader; /* image header info */
TRGBQuad *icColors; /* image palette */
int xormasklen;
int andmasklen;
} CursorImage;
typedef struct {
int cbSizeof;
int cFrames;
int cSteps;
int cx;
int cy;
int cBitCount;
int cPlanes;
int jiffRate;
int fl;
int *rate;
int *seq;
} AnimationCursorHeader ;
typedef struct {
AnimationCursorHeader *header;
CursorImage *images;
} AniCursorImage;
static SDL_Cursor *cursor[256];
/* Stolen from the SDL mailing list */
/* Creates a new mouse cursor from an XPM */
static SDL_Cursor *init_system_cursor(const char *image[]) {
int i, row, col;
Uint8 data[4*32];
Uint8 mask[4*32];
int hot_x, hot_y;
i = -1;
for (row = 0; row < 32; row++) {
for (col = 0; col < 32; col++) {
if (col % 8) {
data[i] <<= 1;
mask[i] <<= 1;
} else {
i++;
data[i] = mask[i] = 0;
}
switch (image[4 + row][col]) {
case 'X':
data[i] |= 0x01;
mask[i] |= 0x01;
break;
case '.':
mask[i] |= 0x01;
break;
case ' ':
break;
}
}
}
sscanf(image[4 + row], "%d,%d", &hot_x, &hot_y);
return SDL_CreateCursor(data, mask, 32, 32, hot_x, hot_y);
}
void cursor_init(void) {
cursor[CURSOR_ARROW] = SDL_GetDefaultCursor();
cursor[CURSOR_CROSS] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_CROSSHAIR);
cursor[CURSOR_IBEAM] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_IBEAM);
cursor[CURSOR_ICON] = SDL_GetDefaultCursor();
cursor[CURSOR_NO] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_NO);
cursor[CURSOR_SIZE] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_SIZEALL);
cursor[CURSOR_SIZEALL] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_SIZEALL);
cursor[CURSOR_SIZENESW] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_SIZENESW);
cursor[CURSOR_SIZENS] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_SIZENS);
cursor[CURSOR_SIZENWSE] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_SIZENWSE);
cursor[CURSOR_SIZEWE] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_SIZEWE);
cursor[CURSOR_UPARROW] = init_system_cursor(cursor_uparrow);
cursor[CURSOR_WAIT] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_WAIT);
}
static bool cursor_new(uint8_t* data, int no, CursorImage *cursorImage, TCursorDirEntry *cursordirentry) {
int xormasklen, andmasklen, xornum;
int i, j;
int h = 0;
uint8_t *buf1, *buf2, *buf3, *buf4;
xornum = (cursordirentry->bWidth * cursordirentry->bHeight);
xormasklen = (xornum * cursorImage->icHeader.biBitCount) / 8;
NOTICE("Cursor: xormasklen==%d, xornum==%d", xormasklen, xornum);
andmasklen = xornum / 8;
cursorImage->xormasklen = xormasklen;
cursorImage->andmasklen = andmasklen;
buf1 = malloc(sizeof(uint8_t) * xornum);
buf2 = malloc(sizeof(uint8_t) * xornum);
buf3 = malloc(sizeof(uint8_t) * xornum);
buf4 = malloc(sizeof(uint8_t) * xornum);
memcpy(buf1, data, min(xormasklen, xornum));
data += xormasklen;
memcpy(buf2, data, min(andmasklen, xornum));
data += andmasklen;
#define height cursordirentry->bHeight
#define width cursordirentry->bWidth
for (j = 0; j < height; j++) {
for (i = 0; i < width * cursorImage->icHeader.biBitCount /8; i++) {
buf3[h] = buf1[(height-j-1)*height*cursorImage->icHeader.biBitCount/8+i];
buf4[h] = 0xff ^ buf2[(height-j-1)*height*cursorImage->icHeader.biBitCount/8+i];
h++;
}
}
if (cursor[no])
SDL_FreeCursor(cursor[no]);
cursor[no] = SDL_CreateCursor(buf3, buf4, 32, 32, cursordirentry->wxHotspot, cursordirentry->wyHotspot);
free(buf1);
free(buf2);
free(buf3);
free(buf4);
#undef height
#undef width
return true;
}
void cursor_set_type(int type) {
if (cursor[type] != NULL) {
SDL_SetCursor(cursor[type]);
}
}
static CursorHeader cursorHeader;
static TCursorDirEntry cursordirentry;
@@ -293,7 +497,7 @@ static bool cursor_load_mono(uint8_t *d, int no) {
pos += p1;
/* read pixedl data */
if (!sdl_cursorNew(d + pos, no, &cursorImage, &cursordirentry)) {
if (!cursor_new(d + pos, no, &cursorImage, &cursordirentry)) {
WARNING("unable to read pixel data");
return false;
}
+3 -79
View File
@@ -23,84 +23,8 @@
#ifndef __CURSOR_H__
#define __CURSOR_H__
#define BitSet(byte, bit) (((byte) & (bit)) == (bit))
typedef struct {
short idReserved; /* always set to 0 */
short idType; /* always set to 1 */
short idCount; /* number of cursor images,always set to 1 */
/* immediately followed by idCount TCursorDirEntries */
} CursorHeader;
typedef struct {
unsigned char bWidth; /* Width */
unsigned char bHeight; /* Height */
unsigned char bColorCount;
unsigned char bReserved;
unsigned short wxHotspot;
unsigned short wyHotspot;
unsigned long dwBytesInRes; /* total number of bytes in image */
unsigned long dwImageOffset;
} TCursorDirEntry;
typedef struct {
long biSize; /* sizeof(TBitmapInfoHeader) */
long biWidth; /* width of bitmap */
long biHeight; /* height of bitmap, see notes */
short biPlanes; /* planes, always 1 */
short biBitCount; /* number of color bits */
long biCompression; /* compression used, 0 */
long biSizeImage; /* size of the pixel data, see notes */
long biXPelsPerMeter; /* not used, 0 */
long biYPelsPerMeter; /* not used, 0 */
long biClrUsed; /* # of colors used, set to 0 */
long biClrImportant; /* important colors, set to 0 */
short hotX;
short hotY;
} TBitmapInfoHeader;
/*
biHeight=2*TIconDirEntry.bHeight;
biSizeImage=ANDmask + XORmask;
XORmask=(TIconDirEntry.bWidth * TIconDirEntry.bHeight * biBitCount)/8;
ANDmask=(TIconDirEntry.bWidth * TIconDirEntry.bHeight)/8;
*/
typedef struct {
unsigned char rgbBlue; /* blue component of color */
unsigned char rgbGreen; /* green component of color */
unsigned char rgbRed; /* red component of color */
unsigned char rgbReserved; /* reserved, 0 */
} TRGBQuad;
typedef struct {
TBitmapInfoHeader icHeader; /* image header info */
TRGBQuad *icColors; /* image palette */
int xormasklen;
int andmasklen;
} CursorImage;
typedef struct {
int cbSizeof;
int cFrames;
int cSteps;
int cx;
int cy;
int cBitCount;
int cPlanes;
int jiffRate;
int fl;
int *rate;
int *seq;
} AnimationCursorHeader ;
typedef struct {
AnimationCursorHeader *header;
CursorImage *images;
} AniCursorImage;
extern void cursor_load(int no, int linkno);
void cursor_init(void);
void cursor_load(int no, int linkno);
void cursor_set_type(int type);
#endif /* __CURSOR_H__ */
+7 -6
View File
@@ -31,7 +31,8 @@
#include "debugger_private.h"
#include "debug_symbol.h"
#include "msgqueue.h"
#include "sdl_core.h"
#include "gfx.h"
#include "event.h"
#include "system.h"
#include "nact.h"
#include "variable.h"
@@ -296,7 +297,7 @@ static void cmd_evaluate(cJSON *args, cJSON *resp) {
}
static void cmd_continue(cJSON *args, cJSON *resp) {
sdl_raiseWindow();
gfx_raiseWindow();
cJSON_AddBoolToObject(resp, "success", true);
}
@@ -593,13 +594,13 @@ static int read_command_thread(void *data) {
free(buf);
break;
}
sdl_post_debugger_command(buf);
event_post_debugger_command(buf);
content_length = -1;
} else {
fprintf(stderr, "Unknown Debug Adapter Protocol header: %s", header);
}
}
sdl_post_debugger_command(NULL); // end of messages
event_post_debugger_command(NULL); // end of messages
return 0;
}
@@ -617,7 +618,7 @@ static void dbg_dap_init(const char *path) {
while (!initialized && !nact->is_quit) {
SDL_Event e;
SDL_WaitEvent(&e);
sdl_handle_event(&e);
event_handle_event(&e);
while (!msgq_isempty(queue)) {
char *msg = msgq_dequeue(queue);
if (!msg)
@@ -639,7 +640,7 @@ static void dbg_dap_repl(int bp_no) {
while (continue_repl && !nact->is_quit) {
SDL_Event e;
SDL_WaitEvent(&e);
sdl_handle_event(&e);
event_handle_event(&e);
while (!msgq_isempty(queue)) {
char *msg = msgq_dequeue(queue);
if (!msg)
+1 -2
View File
@@ -29,7 +29,6 @@
#include "system.h"
#include "LittleEndian.h"
#include "dri.h"
#include "sdl_core.h"
static bool read_index(int volume, drifiles *d, FILE *fp) {
fseek(fp, 0L, SEEK_END);
@@ -142,7 +141,7 @@ static void warn_missing_ald(drifiles *d, int no) {
} else {
snprintf(msgbuf, sizeof(msgbuf), "Cannot read resource #%d.", no);
}
sdl_showMessageBox(MESSAGEBOX_WARNING, "xsystem35", msgbuf);
sys_show_message_box(MESSAGEBOX_WARNING, "xsystem35", msgbuf);
}
dridata *dri_getdata(drifiles *d, int no) {
+33 -33
View File
@@ -27,7 +27,7 @@
#include <math.h>
#include "portab.h"
#include "sdl_core.h"
#include "gfx.h"
#include "input.h"
#include "ags.h"
#include "system.h"
@@ -39,19 +39,19 @@ static bool ecp_cancel;
#define EC_WAIT \
if ((key |= sys_getInputInfo()) && ecp_cancel) break; \
do { \
int wait_ms = cnt - sdl_getTicks(); \
int wait_ms = cnt - sys_get_ticks(); \
if (wait_ms >= 16) \
key = sys_keywait(wait_ms, ecp_cancel ? KEYWAIT_CANCELABLE : KEYWAIT_NONCANCELABLE); \
} while (0)
static void eCopyUpdateArea(int sx, int sy, int w, int h, int dx, int dy) {
MyRectangle src = {sx, sy, w, h};
MyPoint dst = {
SDL_Rect src = {sx, sy, w, h};
SDL_Point dst = {
dx - nact->ags.view_area.x,
dy - nact->ags.view_area.y
};
sdl_updateArea(&src, &dst);
gfx_updateArea(&src, &dst);
}
static int eCopyArea5(int sx, int sy, int w, int h, int dx, int dy, int opt) {
@@ -60,7 +60,7 @@ static int eCopyArea5(int sx, int sy, int w, int h, int dx, int dy, int opt) {
static int hx[16]={ 0,32,16,48, 0,32,16,48,16,48, 0,32,16,48, 0,32};
static int hy[16]={ 0, 0,16,16,32,32,48,48, 0, 0,16,16,32,32,48,48};
cnt = sdl_getTicks();
cnt = sys_get_ticks();
for (i = 0; i < 16; i++) {
cnt += waitcnt;
for (y = 0; y < (h -63); y += 64) {
@@ -81,7 +81,7 @@ static int eCopyArea6(int dx, int dy, int w, int h, int opt) {
int i, x, y, key = 0, cnt;
int waitcnt = opt == 0 ? 30 : opt;
cnt = sdl_getTicks();
cnt = sys_get_ticks();
for (i = 0; i < 7; i++) {
cnt += waitcnt;
for (x = 0; x < (w -63); x += 64) {
@@ -105,18 +105,18 @@ static int eCopyArea9(int sx, int sy, int w, int h, int dx, int dy, int opt) {
static int hintY[4] = {0,8,8,0};
cnt = sdl_getTicks();
cnt = sys_get_ticks();
for (i = 0; i < 4; i++) {
cnt+=waitcnt;
for (y = 0; y < h -15; y+=16) {
for (x = 0; x < (w -7); x+=16) {
sdl_copyArea(sx + x + hintX[i],sy + y + hintY[i], 8, 8, dx + x + hintX[i], dy + y + hintY[i]);
gfx_copyArea(sx + x + hintX[i],sy + y + hintY[i], 8, 8, dx + x + hintX[i], dy + y + hintY[i]);
}
}
ags_updateArea(dx, dy, w, h);
EC_WAIT;
}
sdl_copyArea(sx, sy, w, h, dx, dy);
gfx_copyArea(sx, sy, w, h, dx, dy);
ags_updateArea(dx, dy, w, h);
return key;
}
@@ -125,7 +125,7 @@ static int eCopyArea16(int dx, int dy, int w, int h, int opt) {
int i, x, key = 0, cnt;
int waitcnt = opt == 0 ? 30 : opt;
cnt = sdl_getTicks();
cnt = sys_get_ticks();
for (i = 0; i < 8; i++) {
cnt += waitcnt;
for (x = 0; x < (w -15); x += 16) {
@@ -143,7 +143,7 @@ static int eCopyArea17(int dx, int dy, int w, int h, int opt) {
int waitcnt = opt == 0 ? 30 : opt;
#define E17X 18
cnt = sdl_getTicks();
cnt = sys_get_ticks();
for (i = 0; i < E17X; i++) {
cnt += waitcnt;
for (y = 0; y < (h - E17X + 1); y += E17X) {
@@ -159,7 +159,7 @@ static int eCopyArea22(int sx, int sy, int w, int h, int dx, int dy, int opt) {
int i, x, y, key = 0, cnt;
int waitcnt = opt == 0 ? 80 : opt;
cnt = sdl_getTicks();
cnt = sys_get_ticks();
for (i = 0; i < 2; i++) {
cnt += waitcnt;
for (y = 0; y < (h -3); y+=4) {
@@ -184,12 +184,12 @@ static int eCopyArea23(int sx, int sy, int w, int h, int dx, int dy, int opt) {
static int hintX[4] = {0,2,2,0};
static int hintY[4] = {0,2,0,2};
cnt = sdl_getTicks();
cnt = sys_get_ticks();
for (i = 0; i < 4; i++) {
cnt += waitcnt;
for (y = 0; y < (h -3); y+=4) {
for (x = 0; x < (w -3); x+=4) {
sdl_copyArea(sx + x + hintX[i], sy + y + hintY[i], 2, 2,
gfx_copyArea(sx + x + hintX[i], sy + y + hintY[i], 2, 2,
dx + x + hintX[i], dy + y + hintY[i]);
}
}
@@ -207,7 +207,7 @@ static int eCopyArea1000(int sx, int sy, int w, int h, int dx, int dy, int opt)
}
static int eCopyArea2000(int sx, int sy, int w, int h, int dx, int dy, int opt) {
sdl_fillRectangleRGB(dx, dy, w, h, 0, 0, 0);
gfx_fillRectangleRGB(dx, dy, w, h, 0, 0, 0);
ags_copyArea_alphaLevel(sx, sy, w, h, dx, dy, opt);
ags_updateArea(dx, dy, w, h);
return sys_getInputInfo();
@@ -315,9 +315,9 @@ void ags_eCopyArea(int sx, int sy, int w, int h, int dx, int dy, int sw, int opt
if (sw == NACT_EFFECT_MAGNIFY) {
SDL_Rect target_rect = { sx, sy, w, h };
struct sdl_effect *eff = sdl_effect_magnify_init(sdl_getDIB(), &nact->ags.view_area, &target_rect);
ags_runEffect(duration(sw, opt, NULL), cancel, (ags_EffectStepFunc)sdl_effect_step, eff);
sdl_effect_finish(eff);
struct effect *eff = effect_magnify_init(gfx_getDIB(), &nact->ags.view_area, &target_rect);
ags_runEffect(duration(sw, opt, NULL), cancel, (ags_EffectStepFunc)effect_step, eff);
effect_finish(eff);
// Actual copy.
ags_scaledCopyArea(
sx, sy, w, h,
@@ -326,24 +326,24 @@ void ags_eCopyArea(int sx, int sy, int w, int h, int dx, int dy, int sw, int opt
return;
}
enum sdl_effect_type sdl_effect = from_nact_effect(sw);
if (sdl_effect != EFFECT_INVALID) {
enum effect_type effect = from_nact_effect(sw);
if (effect != EFFECT_INVALID) {
SDL_Rect rect = { dx - nact->ags.view_area.x, dy - nact->ags.view_area.y, w, h };
// Note that we specify NULL (which means sdl_texture) for the old
// surface rather than sdl_getDIB(). This is to use the current display
// Note that we specify NULL (which means gfx_texture) for the old
// surface rather than gfx_getDIB(). This is to use the current display
// contents, not reflecting uncommitted palette changes.
struct sdl_effect *eff = sdl_effect_init(&rect, NULL, rect.x, rect.y, sdl_getDIB(), sx, sy, sdl_effect);
ags_runEffect(duration(sw, opt, &rect), cancel, (ags_EffectStepFunc)sdl_effect_step, eff);
sdl_effect_finish(eff);
struct effect *eff = effect_init(&rect, NULL, rect.x, rect.y, gfx_getDIB(), sx, sy, effect);
ags_runEffect(duration(sw, opt, &rect), cancel, (ags_EffectStepFunc)effect_step, eff);
effect_finish(eff);
// Actual copy.
switch (sw) {
case NACT_EFFECT_FADEOUT:
sdl_fillRectangleRGB(dx, dy, w, h, 0, 0, 0);
gfx_fillRectangleRGB(dx, dy, w, h, 0, 0, 0);
ags_updateArea(dx, dy, w, h);
break;
case NACT_EFFECT_WHITEOUT:
sdl_fillRectangleRGB(dx, dy, w, h, 255, 255, 255);
gfx_fillRectangleRGB(dx, dy, w, h, 255, 255, 255);
ags_updateArea(dx, dy, w, h);
break;
default:
@@ -363,7 +363,7 @@ void ags_eCopyArea(int sx, int sy, int w, int h, int dx, int dy, int sw, int opt
case 54:
ags_copyArea(sx, sy, w, h, dx, dy);
{
MyRectangle r = {dx, dy, w, h}, update;
SDL_Rect r = {dx, dy, w, h}, update;
SDL_IntersectRect(&nact->ags.view_area, &r, &update);
w = update.w;
h = update.h;
@@ -431,15 +431,15 @@ void ags_eSpriteCopyArea(int sx, int sy, int w, int h, int dx, int dy, int sw, i
return;
}
enum sdl_effect_type type = from_nact_sprite_effect(sw);
enum effect_type type = from_nact_sprite_effect(sw);
if (type == EFFECT_INVALID) {
WARNING("Invalid effect: %d", sw);
return;
}
SDL_Rect rect = { dx - nact->ags.view_area.x, dy - nact->ags.view_area.y, w, h };
struct sdl_effect *eff = sdl_sprite_effect_init(&rect, dx, dy, sx, sy, spCol, type);
ags_runEffect(duration(sw, opt, &rect), cancel, (ags_EffectStepFunc)sdl_effect_step, eff);
sdl_effect_finish(eff);
struct effect *eff = sprite_effect_init(&rect, dx, dy, sx, sy, spCol, type);
ags_runEffect(duration(sw, opt, &rect), cancel, (ags_EffectStepFunc)effect_step, eff);
effect_finish(eff);
// Actual copy.
if (sw == 5) {
ags_copyArea_shadow(sx, sy, w, h, dx, dy);
+11 -9
View File
@@ -21,10 +21,12 @@
#include <string.h>
#include <SDL.h>
#include "sdl_core.h"
#include "sdl_private.h"
#include "editor.h"
#include "event.h"
#include "gfx.h"
#include "menu.h"
#include "nact.h"
#include "system.h"
#define XMARGIN 3
#define YMARGIN 2
@@ -53,13 +55,13 @@ static void redraw() {
};
if (*input->text) {
int w = sdl_drawString(r.x, r.y, input->text, fgcolor).w;
int w = gfx_drawString(r.x, r.y, input->text, fgcolor).w;
r.x += w;
r.w -= w;
}
if (*input->composingText) {
int w = sdl_drawString(r.x, r.y, input->composingText, fgcolor).w;
int w = gfx_drawString(r.x, r.y, input->composingText, fgcolor).w;
ags_fillRectangle(r.x, r.y + r.h, w, 2, fgcolor); // underline
}
@@ -129,7 +131,7 @@ static bool handle_event(const SDL_Event *e) {
return false;
}
bool sdl_inputString(INPUTSTRING_PARAM *p) {
bool edit_string(INPUTSTRING_PARAM *p) {
static char *buf;
free(buf);
buf = malloc(p->max * MAX_UTF8_BYTES_PAR_CHAR + 1);
@@ -153,14 +155,14 @@ bool sdl_inputString(INPUTSTRING_PARAM *p) {
ags_setFont(FONT_GOTHIC, p->h);
redraw();
sdl_custom_event_handler = handle_event;
event_custom_handler = handle_event;
while (!input->done) {
sdl_getKeyInfo(); // message pump
event_get_key(); // message pump
nact->callback();
sdl_wait_vsync();
sys_wait_vsync();
}
SDL_StopTextInput();
sdl_custom_event_handler = NULL;
event_custom_handler = NULL;
ags_restoreRegion(saved_region, s.rect.x, s.rect.y);
ags_updateArea(s.rect.x, s.rect.y, s.rect.w, s.rect.h);
+28
View File
@@ -0,0 +1,28 @@
/*
* Copyright (C) 2025 kichikuou <KichikuouChrome@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
#ifndef __EDITOR_H__
#define __EDITOR_H__
#include <stdbool.h>
struct inputstring_param;
bool edit_string(struct inputstring_param *);
#endif // __EDITOR_H__
File diff suppressed because it is too large Load Diff

Some files were not shown because too many files have changed in this diff Show More