mirror of
https://github.com/kichikuou/xsystem35-sdl2.git
synced 2026-09-22 22:48:08 +03:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
904e10daa7 | ||
|
|
65b6da3f2a | ||
|
|
3f495b72c1 | ||
|
|
90670477c6 | ||
|
|
566ebb503f | ||
|
|
6feab51a5d | ||
|
|
15d0b44ab9 | ||
|
|
a0f20caa77 | ||
|
|
39712ee46e | ||
|
|
dcdbe7bb76 | ||
|
|
01a4255b83 | ||
|
|
d978a24a5e | ||
|
|
ed196f72b9 | ||
|
|
c9fd1dcfd0 | ||
|
|
c1018d9e0f | ||
|
|
cb8a48cdec | ||
|
|
6bf6a5c86a | ||
|
|
790aa07130 | ||
|
|
fa74a4744c | ||
|
|
fb68b03a4f | ||
|
|
75228cc4c8 | ||
|
|
8c13361164 | ||
|
|
d05dc83e67 | ||
|
|
c9f21c4547 | ||
|
|
f053f25397 | ||
|
|
f673708a3f | ||
|
|
aab63adac2 | ||
|
|
6f09a999d2 | ||
|
|
2ed44dab6d | ||
|
|
a8f46453d8 | ||
|
|
baa4a3158f | ||
|
|
8328b93227 | ||
|
|
6665416683 | ||
|
|
cf5e899632 | ||
|
|
51954c6bd4 | ||
|
|
f282c02376 | ||
|
|
e2c75fbd9d | ||
|
|
b28e3ef2fd | ||
|
|
215de5511e | ||
|
|
f669804573 | ||
|
|
9c6423bf99 | ||
|
|
4f3b73c1ac | ||
|
|
8ee53accf9 | ||
|
|
6b646b3857 | ||
|
|
dec1649882 | ||
|
|
6b9c3475a0 | ||
|
|
1335a12065 | ||
|
|
93bd8ca737 | ||
|
|
5bae0c16c5 | ||
|
|
d551cdbb70 | ||
|
|
e711d5786e | ||
|
|
64abb3c582 | ||
|
|
bf26f1b0c0 | ||
|
|
f4f1a99372 | ||
|
|
53f0a5ce2a | ||
|
|
c621a5dddb | ||
|
|
42faf38a47 | ||
|
|
c50a563e80 | ||
|
|
996f63f55f | ||
|
|
fb77b229ea | ||
|
|
886d55057a | ||
|
|
7f645d6bd1 | ||
|
|
f8d59e5fc0 | ||
|
|
78ebbf40f4 | ||
|
|
dccd75113b | ||
|
|
d063655b25 | ||
|
|
5e0844e9ea | ||
|
|
386c3c0fcd | ||
|
|
2857c13e15 | ||
|
|
d14b42c146 | ||
|
|
29988d0d6c | ||
|
|
bc5d72b6fe | ||
|
|
03f9b36ff0 | ||
|
|
afb9f96a1a | ||
|
|
28e685818c |
@@ -1,5 +1,22 @@
|
||||
# Changelog
|
||||
|
||||
## 2.15.0 - 2024-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 - 2024-04-01
|
||||
- Fixed build for big endian architectures.
|
||||
|
||||
## 2.14.2 - 2024-03-09
|
||||
- Android: Back button to exit the game (#50)
|
||||
- Improved touch input usability in ママトト (#64)
|
||||
|
||||
## 2.14.1 - 2024-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
|
||||
- New supported games: 俺の下であがけ and 楽園行.
|
||||
- Windows: On Windows 10 version 1903 or above, now xsystem35 can handle
|
||||
|
||||
+3
-3
@@ -10,7 +10,7 @@ set(CMAKE_C_STANDARD 99)
|
||||
enable_testing()
|
||||
set(CMAKE_EXPORT_COMPILE_COMMANDS TRUE)
|
||||
|
||||
set(XSYSTEM35_VERSION "2.14.0")
|
||||
set(XSYSTEM35_VERSION "2.15.0")
|
||||
|
||||
include(CheckSymbolExists)
|
||||
include(FetchContent)
|
||||
@@ -37,8 +37,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)
|
||||
|
||||
+37
-37
@@ -1,48 +1,17 @@
|
||||
# xsystem35 for Android
|
||||
|
||||
Minimum supported Android version: 5.0
|
||||
|
||||
## Download
|
||||
You can download prebuilt APKs
|
||||
[here](https://github.com/kichikuou/xsystem35-sdl2/releases).
|
||||
|
||||
## Build
|
||||
Prerequisites:
|
||||
- Android SDK >=28
|
||||
- Android NDK >=r15c
|
||||
|
||||
### Using Android Studio
|
||||
Open this directory as an Android Studio project.
|
||||
|
||||
### Command Line Build
|
||||
Set environment variables and run the `gradlew` script in this directory.
|
||||
|
||||
Example build instructions (for Debian bookworm):
|
||||
```sh
|
||||
# Install necessary packages
|
||||
sudo apt install git wget unzip default-jdk-headless ninja-build
|
||||
|
||||
# Install Android SDK / NDK
|
||||
export ANDROID_SDK_ROOT=$HOME/android-sdk
|
||||
mkdir -p $ANDROID_SDK_ROOT/cmdline-tools
|
||||
wget https://dl.google.com/android/repository/commandlinetools-linux-10406996_latest.zip
|
||||
unzip commandlinetools-linux-10406996_latest.zip -d $ANDROID_SDK_ROOT/cmdline-tools
|
||||
mv $ANDROID_SDK_ROOT/cmdline-tools/cmdline-tools $ANDROID_SDK_ROOT/cmdline-tools/tools
|
||||
yes | $ANDROID_SDK_ROOT/cmdline-tools/tools/bin/sdkmanager --licenses
|
||||
$ANDROID_SDK_ROOT/cmdline-tools/tools/bin/sdkmanager ndk-bundle 'cmake;3.22.1'
|
||||
export ANDROID_NDK_HOME=$ANDROID_SDK_ROOT/ndk-bundle
|
||||
|
||||
# Clone and build xsystem35
|
||||
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.
|
||||
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.
|
||||
@@ -51,10 +20,12 @@ cd xsystem35-sdl2/android
|
||||
- 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:
|
||||
- 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.)
|
||||
|
||||
@@ -71,3 +42,32 @@ Note: This ZIP format is also compatible with
|
||||
[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.
|
||||
|
||||
### Command Line Build
|
||||
Set environment variables and run the `gradlew` script in this directory.
|
||||
|
||||
Example build instructions (for Debian bookworm):
|
||||
```sh
|
||||
# Install necessary packages
|
||||
sudo apt install git wget unzip default-jdk-headless ninja-build
|
||||
|
||||
# Install Android SDK / NDK
|
||||
export ANDROID_SDK_ROOT=$HOME/android-sdk
|
||||
mkdir -p $ANDROID_SDK_ROOT/cmdline-tools
|
||||
wget https://dl.google.com/android/repository/commandlinetools-linux-11076708_latest.zip
|
||||
unzip commandlinetools-linux-11076708_latest.zip -d $ANDROID_SDK_ROOT/cmdline-tools
|
||||
mv $ANDROID_SDK_ROOT/cmdline-tools/cmdline-tools $ANDROID_SDK_ROOT/cmdline-tools/tools
|
||||
yes | $ANDROID_SDK_ROOT/cmdline-tools/tools/bin/sdkmanager --licenses
|
||||
$ANDROID_SDK_ROOT/cmdline-tools/tools/bin/sdkmanager ndk-bundle 'cmake;3.22.1'
|
||||
export ANDROID_NDK_HOME=$ANDROID_SDK_ROOT/ndk-bundle
|
||||
|
||||
# Clone and build xsystem35
|
||||
git clone https://github.com/kichikuou/xsystem35-sdl2.git
|
||||
cd xsystem35-sdl2/android
|
||||
./gradlew build # or ./gradlew installDebug if you have a connected device
|
||||
```
|
||||
|
||||
@@ -14,10 +14,10 @@ android {
|
||||
}
|
||||
compileSdkVersion 34
|
||||
defaultConfig {
|
||||
minSdkVersion 19
|
||||
minSdkVersion 21
|
||||
targetSdkVersion 34
|
||||
versionCode 29
|
||||
versionName "2.14.0" + gitRevision()
|
||||
versionCode 33
|
||||
versionName "2.15.0" + gitRevision()
|
||||
externalNativeBuild {
|
||||
cmake {
|
||||
arguments "-DANDROID_APP_PLATFORM=android-19", "-DANDROID_STL=c++_static"
|
||||
|
||||
@@ -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.9/SDL2-2.30.9.tar.gz
|
||||
URL_HASH SHA1=9403df0573d47f62f2de074b582b87576bb4abbc
|
||||
URL https://github.com/libsdl-org/SDL/releases/download/release-2.32.4/SDL2-2.32.4.tar.gz
|
||||
URL_HASH SHA1=4fb68f43891ca4def414cc7cf0f3b2a053cb6aaf
|
||||
)
|
||||
FetchContent_Declare(
|
||||
SDL_ttf
|
||||
|
||||
Vendored
+81
@@ -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
|
||||
}
|
||||
|
||||
@@ -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.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()
|
||||
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,12 @@ class LauncherActivity : Activity(), LauncherObserver {
|
||||
SAVEDATA_IMPORT_REQUEST)
|
||||
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 +164,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)
|
||||
}
|
||||
|
||||
@@ -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 = 9;
|
||||
private static final int SDL_MINOR_VERSION = 32;
|
||||
private static final int SDL_MICRO_VERSION = 4;
|
||||
/*
|
||||
// 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,17 @@
|
||||
<?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/help"
|
||||
android:title="@string/action_help" />
|
||||
<item
|
||||
android:id="@+id/licenses"
|
||||
android:title="@string/action_licenses" />
|
||||
|
||||
@@ -2,14 +2,15 @@
|
||||
<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="cancel">キャンセル</string>
|
||||
<string name="cannot_find_ald">System 3.x のファイル (*.ald) が見つかりません。</string>
|
||||
<string name="choose_a_file">ファイルを選択</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>
|
||||
@@ -19,4 +20,21 @@
|
||||
<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>
|
||||
@@ -1,14 +1,15 @@
|
||||
<resources>
|
||||
<string name="app_name">xsystem35</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="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>
|
||||
@@ -19,4 +20,22 @@
|
||||
<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 "Install from ZIP," and choose the ZIP you transferred.</p>
|
||||
]]>
|
||||
</string>
|
||||
</resources>
|
||||
|
||||
@@ -7,7 +7,7 @@ buildscript {
|
||||
google()
|
||||
}
|
||||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:8.1.1'
|
||||
classpath 'com.android.tools.build:gradle:8.7.3'
|
||||
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
|
||||
|
||||
// NOTE: Do not place your application dependencies here; they belong
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
#Thu Nov 11 18:20:34 PST 2021
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-bin.zip
|
||||
distributionPath=wrapper/dists
|
||||
zipStorePath=wrapper/dists
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -58,6 +58,8 @@ Game Compatibility
|
||||
| 妻みぐい2 | Supported | |
|
||||
| シェル・クレイル | Supported | |
|
||||
| ナイトデーモン | Supported | |
|
||||
| Nor | Unsupported | |
|
||||
| 翡翠の眸 | Unsupported | |
|
||||
| 学園KING | Supported | From アリスCD |
|
||||
| 学園KING 番外編 | Supported | From アリスCD |
|
||||
| 蒼海に墜ちて | Supported | From アリスCD |
|
||||
|
||||
+5
-19
@@ -5,7 +5,12 @@ add_library(modules STATIC
|
||||
AliceLogo/AliceLogo.c
|
||||
Confirm/Confirm.c
|
||||
Gpx/Gpx.c
|
||||
Gpx/cg.c
|
||||
Gpx/effectcopy.c
|
||||
Gpx/graph_copy_amap.c
|
||||
Gpx/graph_fillrect_amap.c
|
||||
Gpx/graph.c
|
||||
Gpx/surface.c
|
||||
Math/Math.c
|
||||
MsgSkip/MsgSkip.c
|
||||
NIGHTDLL/NIGHTDLL.c
|
||||
@@ -61,27 +66,8 @@ add_library(modules STATIC
|
||||
eeDemo/eeDemo.c
|
||||
lib/alk.c
|
||||
lib/drawtext.c
|
||||
lib/graph.c
|
||||
lib/list.c
|
||||
lib/surface.c
|
||||
lib/cg.c
|
||||
lib/graph_expandcolor_blend.c
|
||||
lib/graph_fillrect.c
|
||||
lib/graph_fillrect_amap.c
|
||||
lib/graph_fillrect_acolor.c
|
||||
lib/graph_rect.c
|
||||
lib/graph_copy.c
|
||||
lib/graph_copy_amap.c
|
||||
lib/graph_copy_bright.c
|
||||
lib/graph_blend_amap.c
|
||||
lib/graph_blend_screen.c
|
||||
lib/graph_saturadd_amap.c
|
||||
lib/graph_draw_amap.c
|
||||
lib/graph_stretch.c
|
||||
lib/graph_cg.c
|
||||
lib/gre_blend_useamap.c
|
||||
lib/gre_blend.c
|
||||
lib/gre_blend_screen.c
|
||||
nDEMO/nDEMO.c
|
||||
nDEMOE/nDEMOE.c
|
||||
oDEMO/oDEMO.c
|
||||
|
||||
+15
-37
@@ -42,7 +42,7 @@
|
||||
// #include "alpha_plane.h"
|
||||
#include "surface.h"
|
||||
#include "graph.h"
|
||||
// #include "graph2.h"
|
||||
#include "graph_blend_amap.h"
|
||||
|
||||
#include "effectcopy.h"
|
||||
#include "ngraph.h"
|
||||
@@ -68,37 +68,19 @@ static int find_null_surface() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int sf_free_one(int no) {
|
||||
surface_t *s;
|
||||
if (no == 0) return NG;
|
||||
|
||||
s = suf[no];
|
||||
if (s == NULL) return NG;
|
||||
|
||||
if (s->pixel) free(s->pixel);
|
||||
if (s->alpha) free(s->alpha);
|
||||
free(s);
|
||||
|
||||
static void sf_free_one(int no) {
|
||||
if (no == 0 || !suf[no]) return;
|
||||
sf_free(suf[no]);
|
||||
suf[no] = NULL;
|
||||
pre_freesurfno = no;
|
||||
return OK;
|
||||
}
|
||||
|
||||
static int sf_free_all() {
|
||||
int i;
|
||||
surface_t *s;
|
||||
|
||||
for (i = 1; i < MAX_SURFACE; i++) {
|
||||
if (suf[i] == NULL) continue;
|
||||
s = suf[i];
|
||||
if (s->pixel) free(s->pixel);
|
||||
if (s->alpha) free(s->alpha);
|
||||
free(s);
|
||||
static void sf_free_all() {
|
||||
for (int i = 1; i < MAX_SURFACE; i++) {
|
||||
sf_free(suf[i]);
|
||||
suf[i] = NULL;
|
||||
}
|
||||
|
||||
pre_freesurfno = 1;
|
||||
return OK;
|
||||
}
|
||||
|
||||
static surface_t *sf_get(int no) {
|
||||
@@ -151,18 +133,15 @@ static void Create() {
|
||||
作成に失敗した場合は 0 を返す
|
||||
width : surface の幅
|
||||
height: surface の高さ
|
||||
bpp : surface の深さ(オリジナルでは24bppのみサポート,
|
||||
xsystem35 では display の depth と同じ)
|
||||
bpp : surface の深さ(24bppのみサポート)
|
||||
*/
|
||||
int *var = getCaliVariable();
|
||||
int width = getCaliValue();
|
||||
int height = getCaliValue();
|
||||
int bpp = getCaliValue();
|
||||
surface_t *s;
|
||||
|
||||
//get_surface0();
|
||||
s = sf_create_surface(width, height, sf_get(0)->depth);
|
||||
|
||||
|
||||
surface_t *s = sf_create_surface(width, height);
|
||||
|
||||
if (s == NULL) {
|
||||
*var = 0;
|
||||
} else {
|
||||
@@ -187,10 +166,9 @@ static void CreatePixelOnly() {
|
||||
int width = getCaliValue();
|
||||
int height = getCaliValue();
|
||||
int bpp = getCaliValue();
|
||||
surface_t *s;
|
||||
|
||||
s = sf_create_pixel(width, height, sf_get(0)->depth);
|
||||
|
||||
|
||||
surface_t *s = sf_create_pixel(width, height);
|
||||
|
||||
if (s == NULL) {
|
||||
*var = 0;
|
||||
} else {
|
||||
@@ -259,7 +237,7 @@ static void IsPixel() {
|
||||
if (s == NULL) {
|
||||
*var = 0;
|
||||
} else {
|
||||
*var = s->pixel ? 1 : 0;
|
||||
*var = s->sdl_surface ? 1 : 0;
|
||||
}
|
||||
|
||||
TRACE("Gpx.IsPixel %d,%p:", p1, var);
|
||||
|
||||
@@ -33,9 +33,7 @@
|
||||
#include "ags.h"
|
||||
#include "pms.h"
|
||||
#include "qnt.h"
|
||||
#ifdef HAVE_WEBP
|
||||
#include "webp.h"
|
||||
#endif
|
||||
#include "sdl_core.h"
|
||||
#include "ngraph.h"
|
||||
#include "dri.h"
|
||||
#include "ald_manager.h"
|
||||
@@ -53,10 +51,6 @@ static CG_TYPE check_cgformat(uint8_t *data) {
|
||||
return ALCG_PMS8;
|
||||
} else if (pms64k_checkfmt(data)) {
|
||||
return ALCG_PMS16;
|
||||
#ifdef HAVE_WEBP
|
||||
} else if (webp_checkfmt(data)) {
|
||||
return ALCG_WEBP;
|
||||
#endif
|
||||
}
|
||||
return ALCG_UNKNOWN;
|
||||
}
|
||||
@@ -68,65 +62,38 @@ static CG_TYPE check_cgformat(uint8_t *data) {
|
||||
* @return CG が展開された surface
|
||||
* 未知の形式のときは NULL が返る
|
||||
*/
|
||||
surface_t *sf_getcg(void *b, size_t size) {
|
||||
surface_t *sf = NULL;
|
||||
int type;
|
||||
cgdata *cg = NULL;
|
||||
|
||||
type = check_cgformat(b);
|
||||
switch(type) {
|
||||
static surface_t *sf_getcg(void *b, size_t size) {
|
||||
surface_t *sf;
|
||||
cgdata *cg;
|
||||
|
||||
switch(check_cgformat(b)) {
|
||||
case ALCG_PMS8:
|
||||
// Load as an alpha map
|
||||
cg = pms256_extract(b);
|
||||
cg->alpha = cg->pic;
|
||||
cg->pic = NULL;
|
||||
sf = sf_create_alpha(cg->width, cg->height);
|
||||
sdl_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);
|
||||
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);
|
||||
break;
|
||||
#ifdef HAVE_WEBP
|
||||
case ALCG_WEBP:
|
||||
cg = webp_extract(b, size);
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (cg == NULL) {
|
||||
WARNING("Unknown Cg Type");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
switch(type) {
|
||||
case ALCG_PMS8:
|
||||
sf = sf_create_alpha(cg->width, cg->height);
|
||||
gr_draw_amap(sf, cg->x, cg->y, cg->pic, cg->width, cg->height, cg->width);
|
||||
break;
|
||||
|
||||
case ALCG_PMS16:
|
||||
if (cg->alpha) {
|
||||
sf = sf_create_surface(cg->width, cg->height, sf0->depth);
|
||||
gr_drawimage16(sf, cg, cg->x, cg->y);
|
||||
gr_draw_amap(sf, cg->x, cg->y, cg->alpha, cg->width, cg->height, cg->width);
|
||||
} else {
|
||||
sf = sf_create_pixel(cg->width, cg->height, sf0->depth);
|
||||
gr_drawimage16(sf, cg, cg->x, cg->y);
|
||||
}
|
||||
break;
|
||||
|
||||
case ALCG_QNT:
|
||||
case ALCG_WEBP:
|
||||
if (cg->alpha) {
|
||||
sf = sf_create_surface(cg->width, cg->height, sf0->depth);
|
||||
gr_drawimage24(sf, cg, cg->x, cg->y);
|
||||
gr_draw_amap(sf, cg->x, cg->y, cg->alpha, cg->width, cg->height, cg->width);
|
||||
} else {
|
||||
sf = sf_create_pixel(cg->width, cg->height, sf0->depth);
|
||||
gr_drawimage24(sf, cg, cg->x, cg->y);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
cgdata_free(cg);
|
||||
return sf;
|
||||
}
|
||||
@@ -33,7 +33,7 @@ void gpx_effect(int no,
|
||||
struct sdl_effect *eff = sdl_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);
|
||||
ags_runEffect(time, false, (ags_EffectStepFunc)sdl_effect_step, eff);
|
||||
sdl_effect_finish(eff);
|
||||
|
||||
switch (no) {
|
||||
|
||||
@@ -3,25 +3,15 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <SDL.h>
|
||||
|
||||
#include "portab.h"
|
||||
#include "system.h"
|
||||
#include "surface.h"
|
||||
#include "graph.h"
|
||||
#include "ngraph.h"
|
||||
#include "nact.h"
|
||||
|
||||
/*
|
||||
gr_xxxx はクリッピングあり
|
||||
gre_xxxx はクリッピングなし
|
||||
*/
|
||||
|
||||
#undef WARNING
|
||||
#define WARNING(...)
|
||||
|
||||
#undef NOTICE
|
||||
#define NOTICE(...)
|
||||
|
||||
#include "ags.h"
|
||||
#include "sdl_core.h"
|
||||
|
||||
/**
|
||||
* surface から surface にコピーなどをする際に、転送元と転送先のsurface
|
||||
@@ -36,80 +26,16 @@
|
||||
* @param ds: 転送先surface
|
||||
* @param dx: 転送先X座標
|
||||
* @param dy: 転送先Y座標
|
||||
* @return TRUE -> 描画領域がある
|
||||
* FALSE-> 転送領域の高さや幅が0以下になったり、転送元、転送先の座標が
|
||||
* @return true -> 描画領域がある
|
||||
* false-> 転送領域の高さや幅が0以下になったり、転送元、転送先の座標が
|
||||
* surfaceの範囲外になり、描画領域がなくなった。
|
||||
* それぞれの引数は適宜変更されている
|
||||
*/
|
||||
boolean gr_clip(surface_t *ss, int *sx, int *sy, int *sw, int *sh, surface_t *ds, int *dx, int *dy) {
|
||||
int w, h;
|
||||
|
||||
if (ss == NULL) {
|
||||
WARNING("ss surface is null");
|
||||
return FALSE;
|
||||
}
|
||||
if (ss == NULL) {
|
||||
WARNING("ss surface is null");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (*sx > ss->width) {
|
||||
WARNING("sx is too large (sx=%d,width=%d)", *sx, ss->width);
|
||||
return FALSE;
|
||||
}
|
||||
if (*sy > ss->height) {
|
||||
WARNING("sy is too large (sy=%d,height=%d)", *sy, ss->height);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (*sx < 0) {
|
||||
WARNING("sx is too small (sx=%d)", *sx);
|
||||
return FALSE;
|
||||
}
|
||||
if (*sy < 0) {
|
||||
WARNING("sy is too small (sy=%d)", *sy);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (*dx > ds->width) {
|
||||
WARNING("dx is too large (dx=%d,width=%d)", *dx, ds->width);
|
||||
return FALSE;
|
||||
}
|
||||
if (*dy > ds->height) {
|
||||
WARNING("dy is too large (dy=%d,height=%d)", *dy, ds->height);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
w = *sw;
|
||||
h = *sh;
|
||||
|
||||
if (*dx < 0) {
|
||||
*sx -= *dx; *sw += *dx; *dx = 0;
|
||||
}
|
||||
if (*dy < 0) {
|
||||
*sy -= *dy; *sh += *dy; *dy = 0;
|
||||
}
|
||||
|
||||
*sw = min(ss->width - *sx, min(ds->width - *dx, *sw));
|
||||
*sh = min(ss->height - *sy, min(ds->height - *dy, *sh));
|
||||
|
||||
if (*sw <= 0) {
|
||||
WARNING("sw become <=0");
|
||||
return FALSE;
|
||||
}
|
||||
if (*sh <= 0) {
|
||||
WARNING("sh become <=0");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (*sw != w) {
|
||||
NOTICE("width change %d -> %d", w, *sw);
|
||||
}
|
||||
if (*sh != h) {
|
||||
NOTICE("height change %d -> %d", h, *sh);
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
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 };
|
||||
return ags_clipCopyRect(&src_window, &dst_window, sx, sy, dx, dy, sw, sh);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -120,67 +46,75 @@ boolean gr_clip(surface_t *ss, int *sx, int *sy, int *sw, int *sh, surface_t *ds
|
||||
* @param sy: 描画開始Y座標
|
||||
* @param sw: 描画幅
|
||||
* @param sh: 描画高さ
|
||||
* @return TRUE -> 描画領域がある
|
||||
* FALSE-> 描画領域の高さや幅が0以下になったり、描画開始座標が
|
||||
* @return true -> 描画領域がある
|
||||
* false-> 描画領域の高さや幅が0以下になったり、描画開始座標が
|
||||
* surfaceの範囲外になり、描画領域がなくなった。
|
||||
* それぞれの引数は適宜変更されている
|
||||
*/
|
||||
boolean gr_clip_xywh(surface_t *ss, int *sx, int *sy, int *sw, int *sh) {
|
||||
int w, h;
|
||||
|
||||
if (ss == NULL) {
|
||||
WARNING("ss surface is null");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (*sx > ss->width) {
|
||||
WARNING("sx is too large (sx=%d,width=%d)", *sx, ss->width);
|
||||
return FALSE;
|
||||
}
|
||||
if (*sy > ss->height) {
|
||||
WARNING("sy is too large (sy=%d,height=%d)", *sy, ss->height);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
w = *sw;
|
||||
h = *sh;
|
||||
|
||||
if (*sx < 0) {
|
||||
*sw += *sx; *sx = 0;
|
||||
}
|
||||
if (*sy < 0) {
|
||||
*sh += *sy; *sy = 0;
|
||||
}
|
||||
|
||||
*sw = min(ss->width - *sx, *sw);
|
||||
*sh = min(ss->height - *sy, *sh);
|
||||
|
||||
if (*sw <= 0) {
|
||||
WARNING("sw become <=0");
|
||||
return FALSE;
|
||||
}
|
||||
if (*sh <= 0) {
|
||||
WARNING("sh become <=0");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (*sw != w) {
|
||||
NOTICE("width change %d -> %d", w, *sw);
|
||||
}
|
||||
if (*sh != h) {
|
||||
NOTICE("height change %d -> %d", h, *sh);
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
bool gr_clip_xywh(surface_t *ss, int *sx, int *sy, int *sw, int *sh) {
|
||||
if (!ss) return false;
|
||||
SDL_Rect rect = {*sx, *sy, *sw, *sh};
|
||||
if (!SDL_IntersectRect(&rect, &(SDL_Rect){ 0, 0, ss->width, ss->height }, &rect))
|
||||
return false;
|
||||
*sx = rect.x;
|
||||
*sy = rect.y;
|
||||
*sw = rect.w;
|
||||
*sh = rect.h;
|
||||
return true;
|
||||
}
|
||||
|
||||
void gr_init() {
|
||||
}
|
||||
|
||||
void gr_copy(surface_t *dst, int dx, int dy, surface_t *src, int sx, int sy, int sw, int sh) {
|
||||
if (!dst->sdl_surface || !src->sdl_surface) return;
|
||||
if (!gr_clip(src, &sx, &sy, &sw, &sh, dst, &dx, &dy)) return;
|
||||
|
||||
SDL_Rect src_rect = {sx, sy, sw, sh};
|
||||
SDL_Rect dst_rect = {dx, dy, sw, sh};
|
||||
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 *tmp = SDL_ConvertSurface(view, dst->sdl_surface->format, 0);
|
||||
src_rect.x = 0;
|
||||
src_rect.y = 0;
|
||||
SDL_LowerBlit(tmp, &src_rect, dst->sdl_surface, &dst_rect);
|
||||
SDL_FreeSurface(tmp);
|
||||
SDL_FreeSurface(view);
|
||||
return;
|
||||
}
|
||||
}
|
||||
SDL_LowerBlit(src->sdl_surface, &src_rect, dst->sdl_surface, &dst_rect);
|
||||
}
|
||||
|
||||
// Copy the specified surface area with brightness lv/255 times
|
||||
void gr_copy_bright(surface_t *dst, int dx, int dy, surface_t *src, int sx, int sy, int width, int height, int lv) {
|
||||
SDL_Rect src_rect = {sx, sy, width, height};
|
||||
SDL_Rect dst_rect = {dx, dy, width, height};
|
||||
SDL_SetSurfaceColorMod(src->sdl_surface, lv, lv, lv);
|
||||
SDL_BlitSurface(src->sdl_surface, &src_rect, dst->sdl_surface, &dst_rect);
|
||||
SDL_SetSurfaceColorMod(src->sdl_surface, 255, 255, 255);
|
||||
}
|
||||
|
||||
void gr_fill(surface_t *dst, int dx, int dy, int dw, int dh, int r, int g, int b) {
|
||||
SDL_Rect rect = {dx, dy, dw, dh};
|
||||
uint32_t color = SDL_MapRGB(dst->sdl_surface->format, r, g, b);
|
||||
SDL_FillRect(dst->sdl_surface, &rect, color);
|
||||
}
|
||||
|
||||
void gr_copy_stretch(surface_t *dst, int dx, int dy, int dw, int dh, surface_t *src, int sx, int sy, int sw, int sh) {
|
||||
SDL_Rect srcrect = {sx, sy, sw, sh};
|
||||
SDL_Rect dstrect = {dx, dy, dw, dh};
|
||||
SDL_BlitScaled(src->sdl_surface, &srcrect, dst->sdl_surface, &dstrect);
|
||||
}
|
||||
|
||||
void gr_blend(surface_t *dst, int dx, int dy, surface_t *src, int sx, int sy, int width, int height, int lv) {
|
||||
if (!gr_clip(src, &sx, &sy, &width, &height, dst, &dx, &dy)) return;
|
||||
gre_Blend(dst, dx, dy, dst, dx, dy, src, sx, sy, width, height, lv);
|
||||
SDL_SetSurfaceBlendMode(src->sdl_surface, SDL_BLENDMODE_BLEND);
|
||||
SDL_SetSurfaceAlphaMod(src->sdl_surface, lv);
|
||||
SDL_BlitSurface(src->sdl_surface, &(SDL_Rect){sx, sy, width, height}, dst->sdl_surface, &(SDL_Rect){dx, dy, width, height});
|
||||
SDL_SetSurfaceAlphaMod(src->sdl_surface, 255);
|
||||
SDL_SetSurfaceBlendMode(src->sdl_surface, SDL_BLENDMODE_NONE);
|
||||
}
|
||||
|
||||
void gr_blend_src_bright(surface_t *dst, int dx, int dy, surface_t *src, int sx, int sy, int width, int height, int alpha, int rate) {
|
||||
@@ -271,56 +205,34 @@ void gr_copy_stretch_blend_alpha_map(surface_t *dst, int dx, int dy, int dw, int
|
||||
row[x] = xd; xd += a1;
|
||||
}
|
||||
|
||||
switch(dst->depth) {
|
||||
case 16:
|
||||
{
|
||||
uint16_t *yls, *yld;
|
||||
uint8_t *yla;
|
||||
|
||||
for (y = 0; y < dh; y++) {
|
||||
yls = (uint16_t *)(sp + *(y + col) * src->bytes_per_line);
|
||||
yld = (uint16_t *)(dp + y * dst->bytes_per_line);
|
||||
yla = (uint8_t *)(sa + *(y + col) * src->width);
|
||||
for (x = 0; x < dw; x++) {
|
||||
*(yld + x) = ALPHABLEND16(*(yls+ *(row + x)), *(yld+x), *(yla+*(row+x)));
|
||||
}
|
||||
while (y < dh - 1 && *(col + y) == *(col + y + 1)) {
|
||||
yld += dst->width;
|
||||
for (x = 0; x < dw; x++) {
|
||||
*(yld + x) = ALPHABLEND16(*(yls+ *(row+x)), *(yld+x), *(yla+*(row+x)));
|
||||
}
|
||||
y++;
|
||||
}
|
||||
for (y = 0; y < dh; y++) {
|
||||
uint32_t *yls = (uint32_t *)(sp + *(y + col) * src->sdl_surface->pitch);
|
||||
uint32_t *yld = (uint32_t *)(dp + y * dst->sdl_surface->pitch);
|
||||
uint8_t *yla = (uint8_t *)(sa + *(y + col) * src->width);
|
||||
for (x = 0; x < dw; x++) {
|
||||
*(yld + x) = ALPHABLEND24(*(yls+ *(row + x)), *(yld+x), *(yla+*(row+x)));
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 24:
|
||||
case 32:
|
||||
{
|
||||
uint32_t *yls, *yld;
|
||||
uint8_t *yla;
|
||||
|
||||
for (y = 0; y < dh; y++) {
|
||||
yls = (uint32_t *)(sp + *(y + col) * src->bytes_per_line);
|
||||
yld = (uint32_t *)(dp + y * dst->bytes_per_line);
|
||||
yla = (uint8_t *)(sa + *(y + col) * src->width);
|
||||
while (y < dh - 1 && *(col + y) == *(col + y + 1)) {
|
||||
yld += dst->width;
|
||||
for (x = 0; x < dw; x++) {
|
||||
*(yld + x) = ALPHABLEND24(*(yls+ *(row + x)), *(yld+x), *(yla+*(row+x)));
|
||||
}
|
||||
while (y < dh - 1 && *(col + y) == *(col + y + 1)) {
|
||||
yld += dst->width;
|
||||
for (x = 0; x < dw; x++) {
|
||||
*(yld + x) = ALPHABLEND24(*(yls+ *(row+x)), *(yld+x), *(yla+*(row+x)));
|
||||
}
|
||||
y++;
|
||||
*(yld + x) = ALPHABLEND24(*(yls+ *(row+x)), *(yld+x), *(yla+*(row+x)));
|
||||
}
|
||||
y++;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
free(row);
|
||||
free(col);
|
||||
}
|
||||
|
||||
// Fill the rectangle with the specified color (rgb) and blend rate (lv)
|
||||
void gr_fill_alpha_color(surface_t *dst, int dx, int dy, int dw, int dh, int r, int g, int b, int lv) {
|
||||
SDL_Surface *src = SDL_CreateRGBSurfaceWithFormat(0, dw, dh, 32, SDL_PIXELFORMAT_ARGB8888);
|
||||
SDL_FillRect(src, NULL, SDL_MapRGBA(src->format, r, g, b, lv));
|
||||
SDL_SetSurfaceBlendMode(src, SDL_BLENDMODE_BLEND);
|
||||
SDL_Rect dstrect = {dx, dy, dw, dh};
|
||||
SDL_BlitSurface(src, NULL, dst->sdl_surface, &dstrect);
|
||||
SDL_FreeSurface(src);
|
||||
}
|
||||
|
||||
#include "graph2.c"
|
||||
@@ -0,0 +1,23 @@
|
||||
#ifndef __GRAPH_H__
|
||||
#define __GRAPH_H__
|
||||
|
||||
#include "config.h"
|
||||
#include "surface.h"
|
||||
|
||||
void gr_init();
|
||||
|
||||
void gr_copy(surface_t *dst, int dx, int dy, surface_t *src, int sx, int sy, int sw, int sh);
|
||||
void gr_copy_bright(surface_t *dst, int dx, int dy, surface_t *src, int sx, int sy, int width, int height, int lv);
|
||||
void gr_fill(surface_t *dst, int dx, int dy, int dw, int dh, int r, int g, int b);
|
||||
void gr_copy_stretch(surface_t *dst, int dx, int dy, int dw, int dh, surface_t *src, int sx, int sy, int sw, int sh);
|
||||
void gr_blend(surface_t *dst, int dx, int dy, surface_t *src, int sx, int sy, int width, int height, int lv);
|
||||
void gr_copy_stretch_blend_alpha_map(surface_t *dst, int dx, int dy, int dw, int dh, surface_t *src, int sx, int sy, int sw, int sh);
|
||||
void gr_fill_alpha_color(surface_t *dst, int dx, int dy, int dw, int dh, int r, int g, int b, int lv);
|
||||
void gr_fill_alpha_overborder(surface_t *dst, int dx, int dy, int dw, int dh, int s, int d);
|
||||
void gr_fill_alpha_underborder(surface_t *dst, int dx, int dy, int dw, int dh, int s, int d);
|
||||
void gr_copy_alpha_map_sprite(surface_t *dst, int dx, int dy, surface_t *src, int sx, int sy, int sw, int sh, int cl);
|
||||
void gr_blend_alpha_wds_stretch2x2(surface_t *src1, int sx1, int sy1, surface_t *src2, int sx2, int sy2, int sw, int sh, surface_t *dst, int dx, int dy);
|
||||
void gr_blend_alpha_wds(surface_t *src1, int sx1, int sy1, surface_t *src2, int sx2, int sy2, int sw, int sh, surface_t *dst, int dx, int dy);
|
||||
|
||||
#endif /* __GRAPH_H__ */
|
||||
|
||||
@@ -75,7 +75,7 @@ void gr_copy_alpha_map_sprite(surface_t *dst, int dx, int dy, surface_t *src, in
|
||||
}
|
||||
|
||||
void gr_blend_alpha_wds_stretch2x2(surface_t *src1, int sx1, int sy1, surface_t *src2, int sx2, int sy2, int sw, int sh, surface_t *dst, int dx, int dy) {
|
||||
surface_t *t = sf_create_surface(sw * 2, sh * 2, dst->depth);
|
||||
surface_t *t = sf_create_surface(sw * 2, sh * 2);
|
||||
|
||||
gr_copy_stretch(t, 0, 0, sw * 2, sh * 2, src2, sx2, sy2, sw, sh);
|
||||
gr_blend_alpha_wds(t, 0, 0, src1, sx1, sy1, sw * 2, sh * 2, dst, dx, dy);
|
||||
@@ -93,45 +93,16 @@ void gr_blend_alpha_wds(surface_t *src1, int sx1, int sy1, surface_t *src2, int
|
||||
sa = GETOFFSET_ALPHA(src1, sx1, sy1);
|
||||
dp = GETOFFSET_PIXEL(dst, dx, dy);
|
||||
|
||||
switch(dst->depth) {
|
||||
case 16:
|
||||
{
|
||||
uint16_t *yls1, *yls2, *yld;
|
||||
uint8_t *yla;
|
||||
|
||||
for (y = 0; y < sh; y++) {
|
||||
yls1 = (uint16_t *)(sp1 + y * src1->bytes_per_line);
|
||||
yls2 = (uint16_t *)(sp2 + y * src2->bytes_per_line);
|
||||
yld = (uint16_t *)(dp + y * dst->bytes_per_line);
|
||||
yla = (uint8_t *)(sa + y * src1->width);
|
||||
|
||||
for (x = 0; x < sw; x++) {
|
||||
*yld = SUTURADD16(*yls1, ALPHABLEND16(*yls1, *yls2, *yla));
|
||||
//*yld = SUTURADD16(*yls1, ALPHALEVEL16(*yls2, *yla));
|
||||
yls1++; yls2++; yld++; yla++;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 24:
|
||||
case 32:
|
||||
{
|
||||
uint32_t *yls1, *yls2, *yld;
|
||||
uint8_t *yla;
|
||||
for (y = 0; y < sh; y++) {
|
||||
uint32_t *yls1 = (uint32_t *)(sp1 + y * src1->sdl_surface->pitch);
|
||||
uint32_t *yls2 = (uint32_t *)(sp2 + y * src2->sdl_surface->pitch);
|
||||
uint32_t *yld = (uint32_t *)(dp + y * dst->sdl_surface->pitch);
|
||||
uint8_t *yla = (uint8_t *)(sa + y * src1->width);
|
||||
|
||||
for (y = 0; y < sh; y++) {
|
||||
yls1 = (uint32_t *)(sp1 + y * src1->bytes_per_line);
|
||||
yls2 = (uint32_t *)(sp2 + y * src2->bytes_per_line);
|
||||
yld = (uint32_t *)(dp + y * dst->bytes_per_line);
|
||||
yla = (uint8_t *)(sa + y * src1->width);
|
||||
|
||||
for (x = 0; x < sw; x++) {
|
||||
*yld = SUTURADD24(*yls1, ALPHABLEND24(*yls1, *yls2, *yla));
|
||||
yls1++; yls2++; yld++; yla++;
|
||||
}
|
||||
for (x = 0; x < sw; x++) {
|
||||
*yld = SUTURADD24(*yls1, ALPHABLEND24(*yls1, *yls2, *yla));
|
||||
yls1++; yls2++; yld++; yla++;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -41,22 +41,22 @@
|
||||
* @param sw: 転送幅
|
||||
* @param sh: 転送高さ
|
||||
*/
|
||||
int gr_copy_alpha_map(surface_t *dst, int dx, int dy, surface_t *src, int sx, int sy, int sw, int sh) {
|
||||
void gr_copy_alpha_map(surface_t *dst, int dx, int dy, surface_t *src, int sx, int sy, int sw, int sh) {
|
||||
uint8_t *sp, *dp;
|
||||
|
||||
if (!gr_clip(src, &sx, &sy, &sw, &sh, dst, &dx, &dy)) return NG;
|
||||
if (!gr_clip(src, &sx, &sy, &sw, &sh, dst, &dx, &dy)) return;
|
||||
|
||||
sp = GETOFFSET_ALPHA(src, sx, sy);
|
||||
dp = GETOFFSET_ALPHA(dst, dx, dy);
|
||||
|
||||
if (sp == NULL) {
|
||||
WARNING("src alpha NULL");
|
||||
return NG;
|
||||
return;
|
||||
}
|
||||
|
||||
if (dp == NULL) {
|
||||
WARNING("dst alpha NULL");
|
||||
return NG;
|
||||
return;
|
||||
}
|
||||
|
||||
if (src == dst) {
|
||||
@@ -82,6 +82,4 @@ int gr_copy_alpha_map(surface_t *dst, int dx, int dy, surface_t *src, int sx, in
|
||||
dp += dst->width;
|
||||
}
|
||||
}
|
||||
|
||||
return OK;
|
||||
}
|
||||
@@ -6,11 +6,11 @@
|
||||
#include "ngraph.h"
|
||||
#include "ags.h"
|
||||
|
||||
int gr_fill_alpha_map(surface_t *dst, int dx, int dy, int dw, int dh, int lv) {
|
||||
void gr_fill_alpha_map(surface_t *dst, int dx, int dy, int dw, int dh, int lv) {
|
||||
uint8_t *a;
|
||||
|
||||
if (!gr_clip_xywh(dst, &dx, &dy, &dw, &dh)) {
|
||||
return NG;
|
||||
return;
|
||||
}
|
||||
|
||||
a = GETOFFSET_ALPHA(dst, dx, dy);
|
||||
@@ -19,6 +19,4 @@ int gr_fill_alpha_map(surface_t *dst, int dx, int dy, int dw, int dh, int lv) {
|
||||
memset(a, lv, dw);
|
||||
a += dst->width;
|
||||
}
|
||||
|
||||
return OK;
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
#ifndef __NGRAPH_H__
|
||||
#define __NGRAPH_H__
|
||||
|
||||
#include "portab.h"
|
||||
#include "nact.h"
|
||||
#include "ags.h"
|
||||
#include "surface.h"
|
||||
#include "graph.h"
|
||||
|
||||
#define sf0 nact->ags.dib
|
||||
|
||||
struct SDL_Surface;
|
||||
|
||||
// DLL 用 graphic 関連関数
|
||||
|
||||
/* in graph.c */
|
||||
bool gr_clip(surface_t *ss, int *sx, int *sy, int *sw, int *sh, surface_t *ds, int *dx, int *dy);
|
||||
bool gr_clip_xywh(surface_t *ss, int *sx, int *sy, int *sw, int *sh);
|
||||
|
||||
/* in graph_fillrect_amap.c */
|
||||
void gr_fill_alpha_map(surface_t *dst, int dx, int dy, int dw, int dh, int lv);
|
||||
|
||||
/* in graph_copy_amap.c */
|
||||
void gr_copy_alpha_map(surface_t *dst, int dx, int dy, surface_t *src, int sx, int sy, int sw, int sh);
|
||||
|
||||
// /* in graph_bright_dst_only.c */
|
||||
#define gr_bright_dst_only(dst,dx,dy,w,h,lv) gr_copy_bright(dst,dx,dy,dst,dx,dy,w,h,lv)
|
||||
// void gr_bright_dst_only(surface_t *dst, int dx, int dy, int w, int h, int lv);
|
||||
|
||||
/* defined in cg.c */
|
||||
surface_t *sf_loadcg_no(int no);
|
||||
|
||||
#endif /* __GRAPH_H__ */
|
||||
@@ -0,0 +1,80 @@
|
||||
#include "config.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <SDL.h>
|
||||
|
||||
#include "portab.h"
|
||||
#include "surface.h"
|
||||
#include "system.h"
|
||||
|
||||
static surface_t *create(int width, int height, bool has_pixel, bool has_alpha) {
|
||||
surface_t *s = calloc(1, sizeof(surface_t));
|
||||
s->width = width;
|
||||
s->height = height;
|
||||
|
||||
if (has_pixel) {
|
||||
s->sdl_surface = SDL_CreateRGBSurfaceWithFormat(0, width, height, 32, SDL_PIXELFORMAT_RGB888);
|
||||
}
|
||||
|
||||
if (has_alpha) {
|
||||
s->alpha = calloc(width * (height +1), sizeof(uint8_t));
|
||||
}
|
||||
|
||||
return s;
|
||||
}
|
||||
|
||||
// Create a surface with pixel and alpha data
|
||||
surface_t *sf_create_surface(int width, int height) {
|
||||
return create(width, height, true, true);
|
||||
}
|
||||
|
||||
// Create a surface with alpha data only
|
||||
surface_t *sf_create_alpha(int width, int height) {
|
||||
return create(width, height, false, true);
|
||||
}
|
||||
|
||||
// Create a surface with pixel data only
|
||||
surface_t *sf_create_pixel(int width, int height) {
|
||||
return create(width, height, true, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* surfaceオブジェクトの開放
|
||||
* @param s: 開放するオブジェクト
|
||||
* @return: なし
|
||||
*/
|
||||
void sf_free(surface_t *s) {
|
||||
if (s == NULL) return;
|
||||
if (s->sdl_surface) SDL_FreeSurface(s->sdl_surface);
|
||||
if (s->alpha) free(s->alpha);
|
||||
free(s);
|
||||
}
|
||||
|
||||
/**
|
||||
* surface の複製を作成(dupulicate)
|
||||
* @param in: 複製もと
|
||||
* @return : 複製したsurface
|
||||
*/
|
||||
surface_t *sf_dup(surface_t *in) {
|
||||
surface_t *sf;
|
||||
int len;
|
||||
|
||||
if (in == NULL) return NULL;
|
||||
|
||||
sf = malloc(sizeof(surface_t));
|
||||
memcpy(sf, in, sizeof(surface_t));
|
||||
|
||||
if (in->sdl_surface) {
|
||||
sf->sdl_surface = SDL_ConvertSurface(in->sdl_surface, in->sdl_surface->format, 0);
|
||||
}
|
||||
|
||||
if (in->alpha) {
|
||||
len = sf->width * sf->height;
|
||||
sf->alpha = malloc(sizeof(uint8_t) * (len + sf->width));
|
||||
memcpy(sf->alpha, in->alpha, len);
|
||||
}
|
||||
|
||||
return sf;
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
#ifndef __SURFACE_H__
|
||||
#define __SURFACE_H__
|
||||
|
||||
#include "portab.h"
|
||||
#include "ags.h"
|
||||
|
||||
extern surface_t *sf_create_surface(int width, int height);
|
||||
extern surface_t *sf_create_alpha(int width, int height);
|
||||
extern surface_t *sf_create_pixel(int width, int height);
|
||||
extern void sf_free(surface_t *s);
|
||||
extern surface_t *sf_dup(surface_t *in);
|
||||
|
||||
#endif /* __SURFACE_H__ */
|
||||
@@ -13,7 +13,7 @@
|
||||
#include "msgskip.h"
|
||||
#include "utfsjis.h"
|
||||
|
||||
static boolean valid;
|
||||
static bool valid;
|
||||
static int action;
|
||||
|
||||
static void Init() {
|
||||
|
||||
@@ -51,7 +51,7 @@ static void NIGHTDLL_reset(void) {
|
||||
}
|
||||
|
||||
static void InitGame() { /* 1 */
|
||||
ags_setAntialiasedStringMode(TRUE);
|
||||
ags_setAntialiasedStringMode(true);
|
||||
sys_setHankakuMode(2);
|
||||
|
||||
nact->msgout = ntmsg_add;
|
||||
@@ -400,7 +400,7 @@ static void CDStop(void) { /* 39 */
|
||||
static void CDMute(void) { /* 40 */
|
||||
int p1 = getCaliValue(); // 0: mute off, 1: mute on
|
||||
|
||||
nt_cd_mute(p1 == 0 ? FALSE : TRUE);
|
||||
nt_cd_mute(p1 != 0);
|
||||
|
||||
TRACE_UNIMPLEMENTED("NIGHTDLL.CDMute %d:", p1);
|
||||
}
|
||||
@@ -440,7 +440,7 @@ static void SoundEffectSetSyncFlag(void) { /* 44 */
|
||||
int p1 = getCaliValue(); // ch
|
||||
int p2 = getCaliValue(); // 0: 終るまで待たない, 1: 待つ
|
||||
|
||||
nt_snd_waitend(p1, p2 == 0 ? FALSE : TRUE);
|
||||
nt_snd_waitend(p1, p2 != 0);
|
||||
|
||||
TRACE_UNIMPLEMENTED("NIGHTDLL.SoundEffectSetSyncFlag %d,%d:", p1, p2);
|
||||
}
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
#include "config.h"
|
||||
#include "portab.h"
|
||||
#include "graphics.h"
|
||||
#include "surface.h"
|
||||
#include "ags.h"
|
||||
#include "sprite.h"
|
||||
|
||||
@@ -45,7 +44,7 @@ struct _night {
|
||||
|
||||
MyRectangle updaterect;
|
||||
|
||||
int fonttype;
|
||||
FontType fonttype;
|
||||
int fontsize;
|
||||
|
||||
sprite_t *sp[SPRITEMAX];
|
||||
@@ -55,7 +54,7 @@ struct _night {
|
||||
|
||||
// msg
|
||||
char msgbuf[MSGBUFMAX];
|
||||
boolean zhiding;
|
||||
bool zhiding;
|
||||
struct {
|
||||
void (* cbmove)(agsevent_t *);
|
||||
void (* cbrelease)(agsevent_t *);
|
||||
|
||||
+12
-19
@@ -1,11 +1,10 @@
|
||||
#include <stdio.h>
|
||||
#include <SDL.h>
|
||||
|
||||
#include "portab.h"
|
||||
#include "system.h"
|
||||
#include "cg.h"
|
||||
#include "ags.h"
|
||||
#include "surface.h"
|
||||
#include "ngraph.h"
|
||||
#include "night.h"
|
||||
#include "sprite.h"
|
||||
#include "nt_scenario.h"
|
||||
@@ -54,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 = sf0->width;
|
||||
sp->cursize.height = sf0->height;
|
||||
sp->cursize.width = main_surface->w;
|
||||
sp->cursize.height = main_surface->h;
|
||||
sp->update = nt_sp_draw_wall;
|
||||
}
|
||||
|
||||
@@ -178,28 +177,22 @@ void nt_gr_draw(int effectno) {
|
||||
// 全消し
|
||||
break;
|
||||
case 1:
|
||||
nt_sp_update_all(TRUE);
|
||||
nt_sp_update_all(true);
|
||||
break;
|
||||
default:
|
||||
if (night.waitskiplv > 1) {
|
||||
nt_sp_update_all(TRUE);
|
||||
nt_sp_update_all(true);
|
||||
break;
|
||||
}
|
||||
//nt_sp_eupdate(effectno, effecttime, TRUE);
|
||||
nt_sp_eupdate(effectno, 1000, TRUE);
|
||||
//nt_sp_eupdate(effectno, effecttime, true);
|
||||
nt_sp_eupdate(effectno, 1000, true);
|
||||
}
|
||||
}
|
||||
|
||||
void nt_gr_screencg(int no, int x, int y) {
|
||||
surface_t *sf;
|
||||
|
||||
sf = sf_loadcg_no(no -1);
|
||||
|
||||
gre_BlendScreen(sf0, x, y, sf0, x, y, sf, 0, 0, sf->width, sf->height);
|
||||
|
||||
ags_updateArea(x, y, sf->width, sf->height);
|
||||
|
||||
sf_free(sf);
|
||||
SDL_Surface *sf = cg_load_as_sdlsurface(no - 1);
|
||||
SDL_SetSurfaceBlendMode(sf, SDL_BLENDMODE_ADD);
|
||||
SDL_BlitSurface(sf, NULL, main_surface, &(SDL_Rect){x, y, sf->w, sf->h});
|
||||
ags_updateArea(x, y, sf->w, sf->h);
|
||||
SDL_FreeSurface(sf);
|
||||
}
|
||||
|
||||
|
||||
|
||||
+69
-91
@@ -3,6 +3,7 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <SDL.h>
|
||||
|
||||
#include "portab.h"
|
||||
#include "system.h"
|
||||
@@ -11,7 +12,6 @@
|
||||
#include "ags.h"
|
||||
#include "nact.h"
|
||||
#include "input.h"
|
||||
#include "ngraph.h"
|
||||
#include "drawtext.h"
|
||||
#include "night.h"
|
||||
#include "nt_msg.h"
|
||||
@@ -25,23 +25,29 @@ extern int ntsel_dosel(void);
|
||||
#define SNAME_RYO "亮 "
|
||||
#define SNAME_RYO_DEF "亮"
|
||||
|
||||
// 通常メッセージ表示位置と大きさ
|
||||
#define MSGFRAME_0_X 6
|
||||
#define MSGFRAME_0_Y 347
|
||||
#define MSGFRAME_0_WIDTH 628
|
||||
#define MSGFRAME_0_HEIGHT 125
|
||||
// Normal message window
|
||||
static const SDL_Rect msgframe_0 = {
|
||||
.x = 6,
|
||||
.y = 347,
|
||||
.w = 628,
|
||||
.h = 125
|
||||
};
|
||||
|
||||
// 画面全体メッセージ表示位置と大きさ
|
||||
#define MSGFRAME_1_X 0
|
||||
#define MSGFRAME_1_Y 0
|
||||
#define MSGFRAME_1_WIDTH 640
|
||||
#define MSGFRAME_1_HEIGHT 480
|
||||
// Full screen message window
|
||||
static const SDL_Rect msgframe_1 = {
|
||||
.x = 0,
|
||||
.y = 0,
|
||||
.w = 640,
|
||||
.h = 480
|
||||
};
|
||||
|
||||
// 通常メッセージ(顔つき)表示位置と大きさ
|
||||
#define MSGFRAME_2_X (6+160)
|
||||
#define MSGFRAME_2_Y 347
|
||||
#define MSGFRAME_2_WIDTH (628-160)
|
||||
#define MSGFRAME_2_HEIGHT 125
|
||||
// Normal message (with face) window
|
||||
static const SDL_Rect msgframe_2 = {
|
||||
.x = 6 + 160,
|
||||
.y = 347,
|
||||
.w = 628 - 160,
|
||||
.h = 125
|
||||
};
|
||||
|
||||
// キー入力アニメーション位置
|
||||
#define HAKANIM_LOC_X 620
|
||||
@@ -69,7 +75,7 @@ void ntmsg_init() {
|
||||
sprite_t *sp;
|
||||
|
||||
// メッセージスプライト
|
||||
sp = night.sp[SPNO_MSGFRAME_FG] = nt_sp_msg_new(SPNO_MSGFRAME_FG, 0, 0, sf0->width, sf0->height);
|
||||
sp = night.sp[SPNO_MSGFRAME_FG] = nt_sp_msg_new(SPNO_MSGFRAME_FG, 0, 0, main_surface->w, main_surface->h);
|
||||
nt_sp_add_updatelist(sp);
|
||||
|
||||
// メッセージ背景用CG
|
||||
@@ -78,7 +84,7 @@ void ntmsg_init() {
|
||||
|
||||
// 文字背景CG作成
|
||||
nt_scg_create(CGNO_MSGFR_BG,
|
||||
sf0->width, sf0->height,
|
||||
main_surface->w, main_surface->h,
|
||||
0, 0, 0, 255);
|
||||
// night.cg[CGNO_MSGFR_BG]->refcnt++;
|
||||
|
||||
@@ -95,7 +101,7 @@ void ntmsg_init() {
|
||||
sp->u.anime.interval = HAKANIM_INTERVAL;
|
||||
nt_sp_add_updatelist(sp);
|
||||
nt_sp_set_loc(sp, HAKANIM_LOC_X, HAKANIM_LOC_Y);
|
||||
nt_sp_set_show(sp, FALSE);
|
||||
nt_sp_set_show(sp, false);
|
||||
sp->update = nt_sp_draw_scg;
|
||||
|
||||
|
||||
@@ -121,45 +127,34 @@ void ntmsg_init() {
|
||||
// type=1 枠あり
|
||||
// type=2 中央
|
||||
void ntmsg_set_frame(int type) {
|
||||
surface_t *sf;
|
||||
|
||||
night.msgframe = type;
|
||||
|
||||
sf = night.sp[SPNO_MSGBG]->curcg->sf;
|
||||
memset(sf->pixel, 0, sf->bytes_per_line * sf->height);
|
||||
memset(sf->alpha, 0, sf->width * sf->height);
|
||||
SDL_Surface *sf = night.sp[SPNO_MSGBG]->curcg->sf;
|
||||
SDL_FillRect(sf, NULL, 0);
|
||||
|
||||
switch(type) {
|
||||
case 0:
|
||||
nt_sp_set_show(night.sp[SPNO_MSGBG], FALSE);
|
||||
nt_sp_set_show(night.sp[SPNO_MSGFRAME_BG], FALSE);
|
||||
nt_sp_set_show(night.sp[SPNO_MSGFRAME_FG], FALSE);
|
||||
nt_sp_set_show(night.sp[SPNO_MSGBG], false);
|
||||
nt_sp_set_show(night.sp[SPNO_MSGFRAME_BG], false);
|
||||
nt_sp_set_show(night.sp[SPNO_MSGFRAME_FG], false);
|
||||
break;
|
||||
case 1:
|
||||
nt_sp_set_show(night.sp[SPNO_MSGBG], TRUE);
|
||||
nt_sp_set_show(night.sp[SPNO_MSGFRAME_BG], TRUE);
|
||||
nt_sp_set_show(night.sp[SPNO_MSGFRAME_FG], TRUE);
|
||||
nt_sp_set_show(night.sp[SPNO_MSGBG], true);
|
||||
nt_sp_set_show(night.sp[SPNO_MSGFRAME_BG], true);
|
||||
nt_sp_set_show(night.sp[SPNO_MSGFRAME_FG], true);
|
||||
|
||||
gr_fill(sf, MSGFRAME_0_X, MSGFRAME_0_Y,
|
||||
MSGFRAME_0_WIDTH, MSGFRAME_0_HEIGHT,
|
||||
16, 32, 64);
|
||||
gr_fill_alpha_map(sf, MSGFRAME_0_X, MSGFRAME_0_Y,
|
||||
MSGFRAME_0_WIDTH, MSGFRAME_0_HEIGHT, 192);
|
||||
SDL_FillRect(sf, &msgframe_0, SDL_MapRGBA(sf->format, 16, 32, 64, 192));
|
||||
ntmsg_clear(SPNO_MSGFRAME_FG);
|
||||
nt_sp_update_all(TRUE);
|
||||
nt_sp_update_all(true);
|
||||
break;
|
||||
case 2:
|
||||
nt_sp_set_show(night.sp[SPNO_MSGBG], TRUE);
|
||||
nt_sp_set_show(night.sp[SPNO_MSGFRAME_BG], FALSE);
|
||||
nt_sp_set_show(night.sp[SPNO_MSGFRAME_FG], TRUE);
|
||||
nt_sp_set_show(night.sp[SPNO_MSGBG], true);
|
||||
nt_sp_set_show(night.sp[SPNO_MSGFRAME_BG], false);
|
||||
nt_sp_set_show(night.sp[SPNO_MSGFRAME_FG], true);
|
||||
|
||||
gr_fill(sf, MSGFRAME_1_X, MSGFRAME_1_Y,
|
||||
MSGFRAME_1_WIDTH, MSGFRAME_1_HEIGHT,
|
||||
32, 32, 32);
|
||||
gr_fill_alpha_map(sf, MSGFRAME_1_X, MSGFRAME_1_Y,
|
||||
MSGFRAME_1_WIDTH, MSGFRAME_1_HEIGHT, 128);
|
||||
SDL_FillRect(sf, &msgframe_1, SDL_MapRGBA(sf->format, 32, 32, 32, 128));
|
||||
ntmsg_clear(SPNO_MSGFRAME_FG);
|
||||
nt_sp_update_all(TRUE);
|
||||
nt_sp_update_all(true);
|
||||
|
||||
break;
|
||||
}
|
||||
@@ -221,7 +216,7 @@ int ntmsg_ana(void) {
|
||||
static void ntmsg_out(int wNum, int wSize, int wColorR, int wColorG, int wColorB, int wFont, int wSpeed, int wLineSpace) {
|
||||
char *msg;
|
||||
sprite_t *sp;
|
||||
boolean needupdate = FALSE;
|
||||
bool needupdate = false;
|
||||
MyRectangle uparea = {0,0,0,0};
|
||||
int savex;
|
||||
|
||||
@@ -260,7 +255,7 @@ static void ntmsg_out(int wNum, int wSize, int wColorR, int wColorG, int wColorB
|
||||
mbuf,
|
||||
wColorR, wColorG, wColorB);
|
||||
|
||||
needupdate = TRUE;
|
||||
needupdate = true;
|
||||
|
||||
if (wSpeed > 0) {
|
||||
nt_sp_updateme_part(sp,
|
||||
@@ -269,7 +264,7 @@ static void ntmsg_out(int wNum, int wSize, int wColorR, int wColorG, int wColorB
|
||||
cw,
|
||||
wSize);
|
||||
nt_sp_update_clipped();
|
||||
needupdate = FALSE;
|
||||
needupdate = false;
|
||||
|
||||
// keywait
|
||||
delta = sdl_getTicks() - wcnt;
|
||||
@@ -337,8 +332,8 @@ static void set_align(char *msg, sprite_t *sp, int wSize) {
|
||||
|
||||
switch(night.msgplace) {
|
||||
case 0:
|
||||
sp->u.msg.dspcur.x = MSGFRAME_0_X;
|
||||
sp->u.msg.dspcur.y = MSGFRAME_0_Y + 8;
|
||||
sp->u.msg.dspcur.x = msgframe_0.x;
|
||||
sp->u.msg.dspcur.y = msgframe_0.y + 8;
|
||||
break;
|
||||
|
||||
case 1:
|
||||
@@ -364,8 +359,8 @@ static void set_align(char *msg, sprite_t *sp, int wSize) {
|
||||
sp->u.msg.dspcur.y = (sp->cursize.height - (line * (wSize+2))) /2;
|
||||
break;
|
||||
case 2:
|
||||
sp->u.msg.dspcur.x = MSGFRAME_2_X;
|
||||
sp->u.msg.dspcur.y = MSGFRAME_2_Y + 8;
|
||||
sp->u.msg.dspcur.x = msgframe_2.x;
|
||||
sp->u.msg.dspcur.y = msgframe_2.y + 8;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -424,7 +419,7 @@ static void setup_hakanim() {
|
||||
// メッセージ表示時のキー入力を促すアニメーション
|
||||
static void hakanim(int i) {
|
||||
sprite_t *sp;
|
||||
boolean show;
|
||||
bool show;
|
||||
|
||||
sp = night.sp[SPNO_MSG_KEYANIM];
|
||||
if (sp == NULL) return;
|
||||
@@ -434,60 +429,43 @@ static void hakanim(int i) {
|
||||
} else {
|
||||
sp->curcg = sp->cg2;
|
||||
}
|
||||
sp->show = TRUE;
|
||||
sp->show = true;
|
||||
nt_sp_updateme(sp);
|
||||
nt_sp_update_clipped();
|
||||
|
||||
sp->show = show;
|
||||
}
|
||||
|
||||
int ntmsg_update(sprite_t *sp, MyRectangle *r) {
|
||||
int sx, sy, w, h, dx, dy;
|
||||
surface_t update;
|
||||
|
||||
// canvas が clean のときはなにもしない
|
||||
// -> 説明スプライトのように、SetShowされたときに対応できないからだめ
|
||||
//if (sact.msgbufempty) return OK;
|
||||
|
||||
update.width = r->w;
|
||||
update.height = r->h;
|
||||
|
||||
dx = sp->cur.x - r->x;
|
||||
dy = sp->cur.y - r->y;
|
||||
|
||||
w = sp->cursize.width;
|
||||
h = sp->cursize.height;
|
||||
|
||||
sx = 0; sy = 0;
|
||||
|
||||
if (!gr_clip(sp->u.msg.canvas, &sx, &sy, &w, &h, &update, &dx, &dy)) {
|
||||
return NG;
|
||||
void ntmsg_update(sprite_t *sp, MyRectangle *r) {
|
||||
SDL_Rect sp_rect = {0, 0, sp->cursize.width, sp->cursize.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;
|
||||
if (!ags_clipCopyRect(&sp_rect, r, &sx, &sy, &dx, &dy, &w, &h)) {
|
||||
return;
|
||||
}
|
||||
|
||||
dx += r->x;
|
||||
dy += r->y;
|
||||
|
||||
gre_BlendUseAMap(sf0, dx, dy, sf0, dx, dy, sp->u.msg.canvas, sx, sy, w, h, sp->u.msg.canvas, sx, sy, sp->blendrate);
|
||||
|
||||
|
||||
SDL_SetSurfaceBlendMode(sp->u.msg.canvas, SDL_BLENDMODE_BLEND);
|
||||
SDL_SetSurfaceAlphaMod(sp->u.msg.canvas, sp->blendrate);
|
||||
SDL_BlitSurface(sp->u.msg.canvas, &(SDL_Rect){sx, sy, w, h}, main_surface, &(SDL_Rect){dx, dy, w, h});
|
||||
|
||||
SACT_DEBUG("do update no=%d, sx=%d, sy=%d, w=%d, h=%d, dx=%d, dy=%d",
|
||||
sp->no, sx, sy, w, h, dx, dy);
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
static void ntmsg_clear(int wNum) {
|
||||
sprite_t *sp = night.sp[wNum];
|
||||
surface_t *sf;
|
||||
|
||||
|
||||
sp->u.msg.dspcur.x = 0;
|
||||
sp->u.msg.dspcur.y = 0;
|
||||
|
||||
night.msgbuf[0] = '\0';
|
||||
|
||||
// キャンバスのクリア
|
||||
sf = sp->u.msg.canvas;
|
||||
memset(sf->pixel, 0, sf->bytes_per_line * sf->height);
|
||||
memset(sf->alpha, 0, sf->width * sf->height);
|
||||
|
||||
|
||||
// Clear the canvas
|
||||
SDL_FillRect(sp->u.msg.canvas, NULL, 0);
|
||||
|
||||
nt_sp_updateme(sp);
|
||||
}
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
#ifndef __NT_MSG_H__
|
||||
#define __NT_MSG_H__
|
||||
|
||||
extern void ntmsg_init();
|
||||
extern void ntmsg_set_frame(int type);
|
||||
extern void ntmsg_set_place(int type);
|
||||
extern void ntmsg_newline();
|
||||
extern void ntmsg_add(const char *msg);
|
||||
extern int ntmsg_ana(void);
|
||||
extern int ntmsg_update(sprite_t *sp, MyRectangle *r);
|
||||
void ntmsg_init();
|
||||
void ntmsg_set_frame(int type);
|
||||
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);
|
||||
|
||||
#endif /* __NT_MSG_H__ */
|
||||
|
||||
@@ -107,9 +107,9 @@ void nt_sco_callevent(int ev) {
|
||||
}
|
||||
|
||||
|
||||
boolean nt_sco_is_natsu() {
|
||||
if (night.Month < 6 || night.Month > 9) return FALSE;
|
||||
if (night.Month == 6 && night.Day < 11) return FALSE;
|
||||
return TRUE;
|
||||
bool nt_sco_is_natsu() {
|
||||
if (night.Month < 6 || night.Month > 9) return false;
|
||||
if (night.Month == 6 && night.Day < 11) return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
extern void nt_sco_init();
|
||||
extern int nt_sco_main(int mode);
|
||||
extern boolean nt_sco_is_natsu();
|
||||
extern bool nt_sco_is_natsu();
|
||||
extern void nt_sco_callevent(int ev);
|
||||
|
||||
#endif /* __NT_SCENARIO_H__ */
|
||||
|
||||
@@ -10,7 +10,7 @@ struct _ntsnd {
|
||||
int no;
|
||||
int vol;
|
||||
int loop;
|
||||
boolean waitend;
|
||||
bool waitend;
|
||||
};
|
||||
static struct _ntsnd ntsnd[10];
|
||||
|
||||
@@ -27,14 +27,14 @@ void nt_cd_play(int no) {
|
||||
}
|
||||
|
||||
void nt_cd_stop(int msec) {
|
||||
mus_mixer_fadeout_start(MIX_CD, msec, 0, TRUE);
|
||||
mus_mixer_fadeout_start(MIX_CD, msec, 0, true);
|
||||
}
|
||||
|
||||
void nt_cd_mute(boolean mute) {
|
||||
void nt_cd_mute(bool mute) {
|
||||
if (mute) {
|
||||
mus_mixer_fadeout_start(MIX_CD, 0, 0, FALSE);
|
||||
mus_mixer_fadeout_start(MIX_CD, 0, 0, false);
|
||||
} else {
|
||||
mus_mixer_fadeout_start(MIX_CD, 0, 100, FALSE);
|
||||
mus_mixer_fadeout_start(MIX_CD, 0, 100, false);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -56,7 +56,7 @@ void nt_snd_setvol(int ch, int vol) {
|
||||
ntsnd[ch -1].vol = vol;
|
||||
}
|
||||
|
||||
void nt_snd_waitend(int ch, boolean waitend) {
|
||||
void nt_snd_waitend(int ch, bool waitend) {
|
||||
if (ch < 1) return;
|
||||
|
||||
ntsnd[ch -1].waitend = waitend;
|
||||
@@ -74,13 +74,13 @@ void nt_snd_play(int ch) {
|
||||
void nt_snd_stop(int ch, int msec) {
|
||||
if (ch < 1) return;
|
||||
|
||||
mus_wav_fadeout_start(ch, msec, 0, TRUE);
|
||||
mus_wav_fadeout_start(ch, msec, 0, true);
|
||||
}
|
||||
|
||||
void nt_snd_stopall(int msec) {
|
||||
int i;
|
||||
|
||||
for (i = 1; i <= 10; i++) {
|
||||
mus_wav_fadeout_start(i, msec, 0, TRUE);
|
||||
mus_wav_fadeout_start(i, msec, 0, true);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,11 +6,11 @@
|
||||
extern void nt_voice_set(int no);
|
||||
extern void nt_cd_play(int no);
|
||||
extern void nt_cd_stop(int msec);
|
||||
extern void nt_cd_mute(boolean mute);
|
||||
extern void nt_cd_mute(bool mute);
|
||||
extern void nt_snd_setwave(int ch, int no);
|
||||
extern void nt_snd_setloop(int ch, int num);
|
||||
extern void nt_snd_setvol(int ch, int vol);
|
||||
extern void nt_snd_waitend(int ch, boolean waitend);
|
||||
extern void nt_snd_waitend(int ch, bool waitend);
|
||||
extern void nt_snd_play(int ch);
|
||||
extern void nt_snd_stop(int ch, int msec);
|
||||
extern void nt_snd_stopall(int msec);
|
||||
|
||||
+21
-220
@@ -26,29 +26,25 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <SDL.h>
|
||||
|
||||
#include "portab.h"
|
||||
#include "nact.h"
|
||||
#include "system.h"
|
||||
#include "ags.h"
|
||||
#include "surface.h"
|
||||
#include "ngraph.h"
|
||||
#include "cg.h"
|
||||
#include "sactcg.h"
|
||||
|
||||
#define CGMAX 65536
|
||||
static cginfo_t *cgs[CGMAX];
|
||||
|
||||
#include "sactcg_stretch.c"
|
||||
#include "sactcg_blend.c"
|
||||
|
||||
|
||||
#define spcg_assert_no(no) \
|
||||
#define SPCG_ASSERT_NO(no) \
|
||||
if ((no) > (CGMAX -1)) { \
|
||||
WARNING("no is too large (should be %d < %d)", (no), CGMAX); \
|
||||
return NG; \
|
||||
return; \
|
||||
} \
|
||||
|
||||
static cginfo_t *nt_scg_new(enum cgtype type, int no, surface_t *sf) {
|
||||
static cginfo_t *nt_scg_new(enum cgtype type, int no, SDL_Surface *sf) {
|
||||
cginfo_t *info = calloc(1, sizeof(cginfo_t));
|
||||
info->type = type;
|
||||
info->no = no;
|
||||
@@ -78,7 +74,7 @@ static cginfo_t *nt_scg_get(int no) {
|
||||
if (cgs[no] != NULL)
|
||||
return cgs[no];
|
||||
|
||||
surface_t *sf = sf_loadcg_no(no - 1);
|
||||
SDL_Surface *sf = cg_load_as_sdlsurface(no - 1);
|
||||
if (!sf) {
|
||||
WARNING("load fail (%d)", no -1);
|
||||
return NULL;
|
||||
@@ -98,248 +94,53 @@ void nt_scg_deref(cginfo_t *cg) {
|
||||
return;
|
||||
|
||||
if (cg->sf)
|
||||
sf_free(cg->sf);
|
||||
SDL_FreeSurface(cg->sf);
|
||||
free(cg);
|
||||
}
|
||||
|
||||
// 指定の大きさ、色の矩形の CG を作成
|
||||
int nt_scg_create(int wNumCG, int wWidth, int wHeight, int wR, int wG, int wB, int wBlendRate) {
|
||||
spcg_assert_no(wNumCG);
|
||||
void nt_scg_create(int wNumCG, int wWidth, int wHeight, int wR, int wG, int wB, int wBlendRate) {
|
||||
SPCG_ASSERT_NO(wNumCG);
|
||||
|
||||
surface_t *sf = sf_create_surface(wWidth, wHeight, sf0->depth);
|
||||
gr_fill(sf, 0, 0, wWidth, wHeight, wR, wG, wB);
|
||||
gr_fill_alpha_map(sf, 0, 0, wWidth, wHeight, wBlendRate);
|
||||
SDL_Surface *sf = SDL_CreateRGBSurfaceWithFormat(0, wWidth, wHeight, 32, SDL_PIXELFORMAT_ARGB8888);
|
||||
SDL_FillRect(sf, NULL, SDL_MapRGBA(sf->format, wR, wG, wB, wBlendRate));
|
||||
nt_scg_new(CG_SET, wNumCG, sf);
|
||||
return OK;
|
||||
}
|
||||
|
||||
// 指定のCGを反転させたCGを作成
|
||||
int nt_scg_create_reverse(int wNumCG, int wNumSrcCG, int wReverseX, int wReverseY) {
|
||||
spcg_assert_no(wNumCG);
|
||||
spcg_assert_no(wNumSrcCG);
|
||||
|
||||
cginfo_t *src = nt_scg_get(wNumSrcCG);
|
||||
if (!src)
|
||||
return NG;
|
||||
|
||||
surface_t *sf = stretch(src->sf, src->sf->width, src->sf->height, (wReverseX << 1) | wReverseY);
|
||||
nt_scg_new(CG_REVERSE, wNumCG, sf);
|
||||
return OK;
|
||||
}
|
||||
|
||||
// 指定のCGを拡大/縮小したCGを作成
|
||||
int nt_scg_create_stretch(int wNumCG, int wWidth, int wHeight, int wNumSrcCG) {
|
||||
spcg_assert_no(wNumCG);
|
||||
spcg_assert_no(wNumSrcCG);
|
||||
|
||||
cginfo_t *src = nt_scg_get(wNumSrcCG);
|
||||
if (!src)
|
||||
return NG;
|
||||
|
||||
surface_t *sf = stretch(src->sf, wWidth, wHeight, 0);
|
||||
nt_scg_new(CG_STRETCH, wNumCG, sf);
|
||||
return OK;
|
||||
}
|
||||
|
||||
// ベースCGの上にブレンドCGを重ねた CG を作成
|
||||
int nt_scg_create_blend(int wNumDstCG, int wNumBaseCG, int wX, int wY, int wNumBlendCG, int wAlphaMapMode) {
|
||||
spcg_assert_no(wNumDstCG);
|
||||
spcg_assert_no(wNumBaseCG);
|
||||
spcg_assert_no(wNumBlendCG);
|
||||
|
||||
cginfo_t *basecg = nt_scg_get(wNumBaseCG);
|
||||
cginfo_t *blendcg = nt_scg_get(wNumBlendCG);
|
||||
if (!basecg || !blendcg) return NG;
|
||||
|
||||
surface_t *sf = blend(basecg->sf, wX, wY, blendcg->sf, wAlphaMapMode);
|
||||
nt_scg_new(CG_SET, wNumDstCG, sf);
|
||||
return OK;
|
||||
}
|
||||
|
||||
// 指定の文字列のCGを作成
|
||||
int nt_scg_create_text(int wNumCG, int wSize, int wR, int wG, int wB, char *cText) {
|
||||
spcg_assert_no(wNumCG);
|
||||
|
||||
// 勝手に出ていいのかな?
|
||||
if (strlen(cText) == 0) return OK;
|
||||
|
||||
ags_setFont(FONT_GOTHIC, wSize);
|
||||
agsurface_t *glyph = ags_drawStringToSurface(cText);
|
||||
|
||||
surface_t *sf = sf_create_surface(glyph->width, wSize, nact->ags.dib->depth);
|
||||
gr_fill(sf, 0, 0, glyph->width, wSize, wR, wG, wB);
|
||||
gr_draw_amap(sf, 0, 0, glyph->pixel, glyph->width, wSize, glyph->bytes_per_line);
|
||||
|
||||
nt_scg_new(CG_SET, wNumCG, sf);
|
||||
return OK;
|
||||
}
|
||||
|
||||
// 数字文字列のCGを作成
|
||||
int nt_scg_create_textnum(int wNumCG, int wSize, int wR, int wG, int wB, int wFigs, int wZeroPadding, int wValue) {
|
||||
spcg_assert_no(wNumCG);
|
||||
|
||||
char s[256], ss[256];
|
||||
if (wZeroPadding) {
|
||||
char *sss = "%%0%dd";
|
||||
sprintf(ss, sss, wFigs);
|
||||
} else {
|
||||
char *sss = "%%%dd";
|
||||
sprintf(ss, sss, wFigs);
|
||||
}
|
||||
sprintf(s, ss, wValue);
|
||||
|
||||
ags_setFont(FONT_GOTHIC, wSize);
|
||||
agsurface_t *glyph = ags_drawStringToSurface(s);
|
||||
|
||||
surface_t *sf = sf_create_surface(glyph->width, wSize, nact->ags.dib->depth);
|
||||
gr_fill(sf, 0, 0, glyph->width, wSize, wR, wG, wB);
|
||||
gr_draw_amap(sf, 0, 0, glyph->pixel, glyph->width, wSize, glyph->bytes_per_line);
|
||||
|
||||
nt_scg_new(CG_SET, wNumCG, sf);
|
||||
return OK;
|
||||
}
|
||||
|
||||
// CGを複製
|
||||
int nt_scg_copy(int wNumDstCG, int wNumSrcCG) {
|
||||
spcg_assert_no(wNumDstCG);
|
||||
spcg_assert_no(wNumSrcCG);
|
||||
|
||||
cginfo_t *src = nt_scg_get(wNumSrcCG);
|
||||
if (!src)
|
||||
return NG;
|
||||
|
||||
nt_scg_new(CG_SET, wNumDstCG, sf_dup(src->sf));
|
||||
return OK;
|
||||
}
|
||||
|
||||
// CGの一部を切りぬいたCGを作成
|
||||
int nt_scg_cut(int wNumDstCG, int wNumSrcCG, int wX, int wY, int wWidth, int wHeight) {
|
||||
spcg_assert_no(wNumDstCG);
|
||||
spcg_assert_no(wNumSrcCG);
|
||||
void nt_scg_cut(int wNumDstCG, int wNumSrcCG, int wX, int wY, int wWidth, int wHeight) {
|
||||
SPCG_ASSERT_NO(wNumDstCG);
|
||||
SPCG_ASSERT_NO(wNumSrcCG);
|
||||
|
||||
cginfo_t *src = nt_scg_get(wNumSrcCG);
|
||||
if (!src)
|
||||
return NG;
|
||||
return;
|
||||
|
||||
surface_t *sf = src->sf->alpha
|
||||
? sf_create_surface(wWidth, wHeight, src->sf->depth)
|
||||
: sf_create_pixel(wWidth, wHeight, src->sf->depth);
|
||||
|
||||
if (src->sf->pixel)
|
||||
gr_copy(sf, 0, 0, src->sf, wX, wY, wWidth, wHeight);
|
||||
if (src->sf->alpha)
|
||||
gr_copy_alpha_map(sf, 0, 0, src->sf, wX, wY, wWidth, wHeight);
|
||||
SDL_Surface *sf = SDL_CreateRGBSurfaceWithFormat(0, wWidth, wHeight, src->sf->format->BitsPerPixel, src->sf->format->format);
|
||||
SDL_BlitSurface(src->sf, &(SDL_Rect){wX, wY, wWidth, wHeight}, sf, NULL);
|
||||
|
||||
nt_scg_new(CG_SET, wNumDstCG, sf);
|
||||
return OK;
|
||||
}
|
||||
|
||||
// 元のCGの一部を切りぬいたCGを作成
|
||||
int nt_scg_partcopy(int wNumDstCG, int wNumSrcCG, int wX, int wY, int wWidth, int wHeight) {
|
||||
spcg_assert_no(wNumDstCG);
|
||||
spcg_assert_no(wNumSrcCG);
|
||||
|
||||
cginfo_t *src = nt_scg_get(wNumSrcCG);
|
||||
if (!src)
|
||||
return NG;
|
||||
|
||||
surface_t *sf;
|
||||
if (src->sf->alpha) {
|
||||
sf = sf_create_surface(src->sf->width, src->sf->height, src->sf->depth);
|
||||
gr_fill_alpha_map(sf, 0, 0, src->sf->width, src->sf->height, 255);
|
||||
} else {
|
||||
sf = sf_create_pixel(src->sf->width, src->sf->height, src->sf->depth);
|
||||
}
|
||||
|
||||
if (src->sf->pixel)
|
||||
gr_copy(sf, wX, wY, src->sf, wX, wY, wWidth, wHeight);
|
||||
if (src->sf->alpha)
|
||||
gr_copy_alpha_map(sf, wX, wY, src->sf, wX, wY, wWidth, wHeight);
|
||||
|
||||
nt_scg_new(CG_SET, wNumDstCG, sf);
|
||||
return OK;
|
||||
}
|
||||
|
||||
// 全てのCGの開放
|
||||
int nt_scg_freeall() {
|
||||
void nt_scg_freeall(void) {
|
||||
int i;
|
||||
|
||||
for (i = 1; i < CGMAX; i++) {
|
||||
nt_scg_free(i);
|
||||
}
|
||||
return OK;
|
||||
}
|
||||
|
||||
/**
|
||||
* 指定の番号の CG をオブジェクトリストから消し、オブジェクトがどこからも参照
|
||||
* されていない(参照数が0の)場合のみ、オブジェクトを削除
|
||||
*/
|
||||
int nt_scg_free(int no) {
|
||||
spcg_assert_no(no);
|
||||
void nt_scg_free(int no) {
|
||||
SPCG_ASSERT_NO(no);
|
||||
|
||||
cginfo_t *cg = cgs[no];
|
||||
if (!cg) return NG;
|
||||
if (!cg) return;
|
||||
|
||||
nt_scg_deref(cg);
|
||||
cgs[no] = NULL;
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
// CGの種類を取得
|
||||
int nt_scg_querytype(int wNumCG, int *ret) {
|
||||
if (wNumCG >= (CGMAX -1)) goto errexit;
|
||||
if (cgs[wNumCG] == NULL) goto errexit;
|
||||
|
||||
*ret = cgs[wNumCG]->type;
|
||||
|
||||
return OK;
|
||||
|
||||
errexit:
|
||||
*ret = CG_NOTUSED;
|
||||
return NG;
|
||||
}
|
||||
|
||||
// CGの大きさを取得
|
||||
int nt_scg_querysize(int wNumCG, int *w, int *h) {
|
||||
if (wNumCG >= (CGMAX -1)) goto errexit;
|
||||
if (cgs[wNumCG] == NULL) goto errexit;
|
||||
if (cgs[wNumCG]->sf == NULL) goto errexit;
|
||||
|
||||
*w = cgs[wNumCG]->sf->width;
|
||||
*h = cgs[wNumCG]->sf->height;
|
||||
|
||||
return OK;
|
||||
|
||||
errexit:
|
||||
*w = *h = 0;
|
||||
return NG;
|
||||
}
|
||||
|
||||
// CGのBPPを取得
|
||||
int nt_scg_querybpp(int wNumCG, int *ret) {
|
||||
if (wNumCG >= (CGMAX -1)) goto errexit;
|
||||
if (cgs[wNumCG] == NULL) goto errexit;
|
||||
if (cgs[wNumCG]->sf == NULL) goto errexit;
|
||||
|
||||
*ret = cgs[wNumCG]->sf->depth;
|
||||
|
||||
return OK;
|
||||
|
||||
errexit:
|
||||
*ret = 0;
|
||||
return NG;
|
||||
}
|
||||
|
||||
// CGの alphamap が存在するかを取得
|
||||
int nt_scg_existalphamap(int wNumCG, int *ret) {
|
||||
if (wNumCG >= (CGMAX -1)) goto errexit;
|
||||
if (cgs[wNumCG] == NULL) goto errexit;
|
||||
if (cgs[wNumCG]->sf == NULL) goto errexit;
|
||||
|
||||
*ret = cgs[wNumCG]->sf->alpha ? 1 : 0;
|
||||
|
||||
errexit:
|
||||
*ret = 0;
|
||||
return NG;
|
||||
}
|
||||
|
||||
@@ -27,23 +27,11 @@
|
||||
#include "portab.h"
|
||||
#include "night.h"
|
||||
|
||||
extern cginfo_t *nt_scg_addref(int no);
|
||||
extern void nt_scg_deref(cginfo_t *cg);
|
||||
extern int nt_scg_create(int wNumCG, int wWidth, int wHeight, int wR, int wG, int wB, int wBlendRate);
|
||||
extern int nt_scg_create_reverse(int NumCG, int wNumSrcCG, int wReverseX, int wReverseY);
|
||||
extern int nt_scg_create_stretch(int wNumCG, int wWidth, int wHeight, int wNumSrcCG);
|
||||
extern int nt_scg_create_blend(int wNumDstCG, int wNumBaseCG, int wX, int wY, int wNumBlendCG, int wAlphaMapMode);
|
||||
extern int nt_scg_create_text(int wNumCG, int wSize, int wR, int wG, int wB, char *cText);
|
||||
extern int nt_scg_create_textnum(int wNumCG, int wSize, int wR, int wG, int wB, int wFigs, int wZeroPadding, int wValue);
|
||||
extern int nt_scg_copy(int wNumDstCG, int wNumSrcCG);
|
||||
extern int nt_scg_cut(int wNumDstCG, int wNumSrcCG, int wX, int wY, int wWidth, int wHeight);
|
||||
extern int nt_scg_partcopy(int wNumDstCG, int wNumSrcCG, int wX, int wY, int wWidth, int wHeight);
|
||||
extern int nt_scg_freeall();
|
||||
extern int nt_scg_free(int cg);
|
||||
extern int nt_scg_querytype(int wNumCG, int *ret);
|
||||
extern int nt_scg_querysize(int wNumCG, int *w, int *h);
|
||||
extern int nt_scg_querybpp(int wNumCG, int *ret);
|
||||
extern int nt_scg_existalphamap(int wNumCG, int *ret);
|
||||
extern int nt_scg_linkcgfree(int no);
|
||||
cginfo_t *nt_scg_addref(int no);
|
||||
void nt_scg_deref(cginfo_t *cg);
|
||||
void nt_scg_create(int wNumCG, int wWidth, int wHeight, int wR, int wG, int wB, int wBlendRate);
|
||||
void nt_scg_cut(int wNumDstCG, int wNumSrcCG, int wX, int wY, int wWidth, int wHeight);
|
||||
void nt_scg_freeall(void);
|
||||
void nt_scg_free(int cg);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,31 +0,0 @@
|
||||
//
|
||||
static surface_t *blend(surface_t *base, int x, int y, surface_t *blend, int mode) {
|
||||
surface_t *dst = sf_create_surface(base->width, base->height, base->depth);
|
||||
|
||||
gr_copy(dst, 0, 0, base, 0, 0, base->width, base->height);
|
||||
|
||||
if (base->alpha) {
|
||||
// ベースに alpha map がある場合はそれをコピー
|
||||
gr_copy_alpha_map(dst, 0, 0, base, 0, 0, base->width, base->height);
|
||||
} else {
|
||||
// 無い場合は全て 255 の map を作成
|
||||
gr_fill_alpha_map(dst, 0, 0, base->width, base->height, 255);
|
||||
}
|
||||
|
||||
if (blend->alpha) {
|
||||
// 重ね合わせ先の alpha map があるときはそれを使う
|
||||
gre_BlendUseAMap(dst, x, y, base, x, y, blend, 0, 0, blend->width, blend->height, blend, 0, 0, 255);
|
||||
} else {
|
||||
// 無いときは dst の alpha map を使う
|
||||
gre_BlendUseAMap(dst, x, y, base, x, y, blend, 0, 0, blend->width, blend->height, dst, x, y, 255);
|
||||
}
|
||||
|
||||
// alpha 作成モードが dst + blend の時は飽和加算
|
||||
if (mode == 1) {
|
||||
gr_saturadd_alpha_map(dst, x, y, blend, 0, 0, blend->width, blend->height);
|
||||
}
|
||||
|
||||
return dst;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,114 +0,0 @@
|
||||
// 拡大縮小
|
||||
static surface_t *stretch(surface_t *src, int dw, int dh, int mirror) {
|
||||
surface_t *dst = calloc(1, sizeof(surface_t));
|
||||
float a1, a2, xd, yd;
|
||||
int sw, sh;
|
||||
int *row, *col;
|
||||
int x, y;
|
||||
uint8_t *sdata, *ddata;
|
||||
|
||||
dst->width = dw;
|
||||
dst->height = dh;
|
||||
dst->depth = src->depth;
|
||||
dst->bytes_per_line = dw * src->bytes_per_pixel;
|
||||
dst->bytes_per_pixel = src->bytes_per_pixel;
|
||||
|
||||
if (src->pixel) {
|
||||
dst->pixel = malloc(dh * dst->bytes_per_line);
|
||||
}
|
||||
if (src->alpha) {
|
||||
dst->alpha = malloc(dw * dh);
|
||||
}
|
||||
|
||||
|
||||
sdata = GETOFFSET_PIXEL(src, 0, 0);
|
||||
ddata = GETOFFSET_PIXEL(dst, 0, 0);
|
||||
sw = src->width;
|
||||
sh = src->height;
|
||||
|
||||
a1 = (float)sw / (float)dw;
|
||||
a2 = (float)sh / (float)dh;
|
||||
row = malloc(sizeof(int) * dw);
|
||||
// 1おおきくして初期化しないと col[dw-1]とcol[dw]が同じになる
|
||||
// 可能性がある。
|
||||
col = calloc(dh +1, sizeof(int));
|
||||
|
||||
if (mirror & 1) {
|
||||
/* 上下反転 added by tajiri@wizard */
|
||||
for (yd = sh - a2, y = 0; y < dh; y++) {
|
||||
col[y] = yd; yd -= a2;
|
||||
}
|
||||
} else {
|
||||
for (yd = 0.0, y = 0; y < dh; y++) {
|
||||
col[y] = yd; yd += a2;
|
||||
}
|
||||
}
|
||||
if (mirror & 2) {
|
||||
/* 左右反転 added by tajiri@wizard */
|
||||
for (xd = sw - a1, x = 0; x < dw; x++) {
|
||||
row[x] = xd; xd -= a1;
|
||||
}
|
||||
} else {
|
||||
for (xd = 0.0, x = 0; x < dw; x++) {
|
||||
row[x] = xd; xd += a1;
|
||||
}
|
||||
}
|
||||
|
||||
#define SCALEDCOPYAREA(type) { \
|
||||
int x, y; \
|
||||
type *sl, *dl; \
|
||||
uint8_t *_sl, *_dl; \
|
||||
for (y = 0; y < dh; y++) { \
|
||||
sl = (type *)(sdata + *(y + col) * src->bytes_per_line);\
|
||||
dl = (type *)(ddata + y * dst->bytes_per_line);\
|
||||
for (x = 0; x < dw; x++) { \
|
||||
*(dl + x) = *(sl + *(row + x)); \
|
||||
} \
|
||||
_dl = (uint8_t *)dl; \
|
||||
while (y < dh - 1 && *(col + y) == *(col + y + 1)) { \
|
||||
_sl = _dl; \
|
||||
_dl += dst->bytes_per_line; \
|
||||
memcpy(_dl, _sl, dw * sizeof(type)); \
|
||||
y++; \
|
||||
} \
|
||||
}}
|
||||
|
||||
switch(dst->depth) {
|
||||
case 8:
|
||||
SCALEDCOPYAREA(uint8_t); break;
|
||||
case 16:
|
||||
SCALEDCOPYAREA(uint16_t); break;
|
||||
case 24:
|
||||
case 32:
|
||||
SCALEDCOPYAREA(uint32_t); break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (src->alpha) {
|
||||
int x, y;
|
||||
uint8_t *sl, *dl;
|
||||
uint8_t *_sl, *_dl;
|
||||
sdata = GETOFFSET_ALPHA(src, 0, 0);
|
||||
ddata = GETOFFSET_ALPHA(dst, 0, 0);
|
||||
for (y = 0; y < dh; y++) {
|
||||
sl = (uint8_t *)(sdata + *(y + col) * src->width);
|
||||
dl = (uint8_t *)(ddata + y * dst->width);
|
||||
for (x = 0; x < dw; x++) {
|
||||
*(dl + x) = *(sl + *(row + x));
|
||||
}
|
||||
_dl = (uint8_t *)dl;
|
||||
while (y < dh - 1 && *(col + y) == *(col + y + 1)) {
|
||||
_sl = _dl;
|
||||
_dl += dst->width;
|
||||
memcpy(_dl, _sl, dw);
|
||||
y++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
free(row);
|
||||
free(col);
|
||||
|
||||
return dst;
|
||||
}
|
||||
@@ -51,14 +51,13 @@ static char *replacedst;
|
||||
/**
|
||||
* 文字列変数スタックの初期化
|
||||
*/
|
||||
int nt_sstr_init() {
|
||||
void nt_sstr_init(void) {
|
||||
stack = malloc(sizeof(char *) * DEFSTACKSIZE);
|
||||
idx = 0;
|
||||
idxmax = DEFSTACKSIZE;
|
||||
return OK;
|
||||
}
|
||||
|
||||
int nt_sstr_reset(void) {
|
||||
void nt_sstr_reset(void) {
|
||||
for (int i = 0; i < idx; i++)
|
||||
free(stack[i]);
|
||||
idx = 0;
|
||||
@@ -73,35 +72,6 @@ int nt_sstr_reset(void) {
|
||||
}
|
||||
slist_free(strreplace);
|
||||
strreplace = NULL;
|
||||
return OK;
|
||||
}
|
||||
|
||||
/**
|
||||
* 文字列変数スタックに文字列を積む
|
||||
* @param strno: シナリオ上での文字列変数番号
|
||||
*/
|
||||
int nt_sstr_push(char *str) {
|
||||
if (idx >= idxmax) {
|
||||
stack = realloc(stack, sizeof(char *) * idx*2);
|
||||
idxmax = idx*2;
|
||||
}
|
||||
|
||||
stack[idx++] = strdup(str);
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
/**
|
||||
* 文字列変数スタックから文字列を取り出す
|
||||
* @param strno: スタックから戻した文字列を格納する文字列変数番号
|
||||
*/
|
||||
int nt_sstr_pop(char *str, int maxlen) {
|
||||
if (idx == 0) return NG;
|
||||
|
||||
strncpy(str, stack[--idx], maxlen);
|
||||
free(stack[idx]);
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -109,36 +79,15 @@ int nt_sstr_pop(char *str, int maxlen) {
|
||||
* @param sstrno: 変換元文字列変数番号
|
||||
* @param dstrno: 変換先文字列変数番号
|
||||
*/
|
||||
int nt_sstr_regist_replace(char *sstr, char *dstr) {
|
||||
void nt_sstr_regist_replace(char *sstr, char *dstr) {
|
||||
strexchange_t *ex;
|
||||
|
||||
if (sstr == dstr) return NG;
|
||||
if (sstr == dstr) return;
|
||||
|
||||
ex = malloc(sizeof(strexchange_t));
|
||||
ex->src = sstr;
|
||||
ex->dst = dstr;
|
||||
strreplace = slist_append(strreplace, ex);
|
||||
return OK;
|
||||
}
|
||||
|
||||
/**
|
||||
* 数値 -> 文字列化
|
||||
*/
|
||||
int nt_sstr_num2str(int strno, int fig, int nzeropad, int num) {
|
||||
char s[256], ss[256];
|
||||
|
||||
if (nzeropad) {
|
||||
char *sss = "%%0%dd";
|
||||
sprintf(ss, sss, fig);
|
||||
} else {
|
||||
char *sss = "%%%dd";
|
||||
sprintf(ss, sss, fig);
|
||||
}
|
||||
|
||||
sprintf(s, ss, num);
|
||||
svar_set(strno, s);
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
// 文字列の置き換え処理
|
||||
@@ -151,7 +100,7 @@ static void replacestr_cb(void* data, void* userdata) {
|
||||
start = replacesrc;
|
||||
out = replacedst;
|
||||
|
||||
while (TRUE) {
|
||||
while (true) {
|
||||
next = strstr(start, ex->src);
|
||||
if (next == NULL) break;
|
||||
strncat(out, start, (size_t)(next - start));
|
||||
|
||||
@@ -24,13 +24,10 @@
|
||||
#ifndef __SACTSTRING_H__
|
||||
#define __SACTSTRING_H__
|
||||
|
||||
extern int nt_sstr_init();
|
||||
extern int nt_sstr_reset(void);
|
||||
extern int nt_sstr_push(char *str);
|
||||
extern int nt_sstr_pop(char *str, int maxlen);
|
||||
extern int nt_sstr_regist_replace(char *sstr, char *dstr);
|
||||
extern int nt_sstr_num2str(int strno, int fig, int nzeropad, int num);
|
||||
extern char *nt_sstr_replacestr(char *msg);
|
||||
void nt_sstr_init(void);
|
||||
void nt_sstr_reset(void);
|
||||
void nt_sstr_regist_replace(char *sstr, char *dstr);
|
||||
char *nt_sstr_replacestr(char *msg);
|
||||
|
||||
|
||||
#endif /* __SACTSTRING_H__ */
|
||||
|
||||
+11
-12
@@ -1,12 +1,11 @@
|
||||
#include "config.h"
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <SDL.h>
|
||||
|
||||
#include "portab.h"
|
||||
#include "sprite.h"
|
||||
#include "sactcg.h"
|
||||
#include "surface.h"
|
||||
#include "ngraph.h"
|
||||
#include "nt_msg.h"
|
||||
|
||||
sprite_t *nt_sp_new(int no, int cg1, int cg2, int cg3, int type) {
|
||||
@@ -22,7 +21,7 @@ sprite_t *nt_sp_new(int no, int cg1, int cg2, int cg3, int type) {
|
||||
sp->cg3 = cg3 ? nt_scg_addref(cg3) : NULL;
|
||||
|
||||
sp->curcg = sp->cg1;
|
||||
sp->show = TRUE;
|
||||
sp->show = true;
|
||||
sp->blendrate = 255;
|
||||
sp->loc.x = 0;
|
||||
sp->loc.y = 0;
|
||||
@@ -32,8 +31,8 @@ sprite_t *nt_sp_new(int no, int cg1, int cg2, int cg3, int type) {
|
||||
sp->cursize.width = 0;
|
||||
sp->cursize.height = 0;
|
||||
} else {
|
||||
sp->cursize.width = sp->curcg->sf->width;
|
||||
sp->cursize.height = sp->curcg->sf->height;
|
||||
sp->cursize.width = sp->curcg->sf->w;
|
||||
sp->cursize.height = sp->curcg->sf->h;
|
||||
}
|
||||
sp->update = DEFAULT_UPDATE;
|
||||
|
||||
@@ -54,7 +53,7 @@ sprite_t *nt_sp_msg_new(int no, int x, int y, int width, int height) {
|
||||
|
||||
sp->no = no;
|
||||
sp->type = SPRITE_MSG;
|
||||
sp->show = TRUE;
|
||||
sp->show = true;
|
||||
sp->blendrate = 255;
|
||||
sp->loc.x = x;
|
||||
sp->loc.y = y;
|
||||
@@ -63,7 +62,7 @@ sprite_t *nt_sp_msg_new(int no, int x, int y, int width, int height) {
|
||||
sp->cursize.height = height;
|
||||
sp->u.msg.dspcur.x = 0;
|
||||
sp->u.msg.dspcur.y = 0;
|
||||
sp->u.msg.canvas = sf_create_surface(width, height, sf0->depth);
|
||||
sp->u.msg.canvas = SDL_CreateRGBSurfaceWithFormat(0, width, height, 32, SDL_PIXELFORMAT_ARGB8888);
|
||||
sp->update = ntmsg_update;
|
||||
|
||||
return sp;
|
||||
@@ -77,14 +76,14 @@ void nt_sp_free(sprite_t *sp) {
|
||||
if (sp->cg3) nt_scg_deref(sp->cg3);
|
||||
|
||||
if (sp->type == SPRITE_MSG) {
|
||||
sf_free(sp->u.msg.canvas);
|
||||
SDL_FreeSurface(sp->u.msg.canvas);
|
||||
}
|
||||
|
||||
free(sp);
|
||||
}
|
||||
|
||||
void nt_sp_set_show(sprite_t *sp, boolean show) {
|
||||
boolean oldshow;
|
||||
void nt_sp_set_show(sprite_t *sp, bool show) {
|
||||
bool oldshow;
|
||||
|
||||
if (sp == NULL) return;
|
||||
|
||||
@@ -111,8 +110,8 @@ void nt_sp_set_cg(sprite_t *sp, int no) {
|
||||
sp->cursize.width = 0;
|
||||
sp->cursize.height = 0;
|
||||
} else {
|
||||
sp->cursize.width = cg->sf->width;
|
||||
sp->cursize.height = cg->sf->height;
|
||||
sp->cursize.width = cg->sf->w;
|
||||
sp->cursize.height = cg->sf->h;
|
||||
}
|
||||
|
||||
sp->curcg = cg;
|
||||
|
||||
+21
-24
@@ -3,7 +3,6 @@
|
||||
#define __SPRITE_H__
|
||||
|
||||
#include "portab.h"
|
||||
#include "surface.h"
|
||||
#include "graphics.h"
|
||||
|
||||
#define DEFAULT_UPDATE nt_sp_draw
|
||||
@@ -54,7 +53,7 @@ enum cgtype {
|
||||
struct _cginfo {
|
||||
enum cgtype type; // CGの種類, 0: 未使用, 1:リンクされている, ...
|
||||
int no; // CGの番号
|
||||
surface_t *sf; // CG本体
|
||||
struct SDL_Surface *sf;
|
||||
int refcnt; // 参照カウンタ。0になったら開放してもよい。
|
||||
};
|
||||
typedef struct _cginfo cginfo_t;
|
||||
@@ -78,7 +77,7 @@ struct _sprite {
|
||||
cginfo_t *curcg;
|
||||
cginfo_t *cg1, *cg2, *cg3;
|
||||
|
||||
boolean show;
|
||||
bool show;
|
||||
|
||||
int blendrate;
|
||||
|
||||
@@ -86,7 +85,7 @@ struct _sprite {
|
||||
|
||||
MyPoint cur;
|
||||
|
||||
int (* update)(struct _sprite *sp, MyRectangle *updatearea);
|
||||
void (* update)(struct _sprite *sp, MyRectangle *updatearea);
|
||||
|
||||
union {
|
||||
struct {
|
||||
@@ -97,7 +96,7 @@ struct _sprite {
|
||||
} anime;
|
||||
|
||||
struct {
|
||||
surface_t *canvas;
|
||||
struct SDL_Surface *canvas;
|
||||
MyPoint dspcur;
|
||||
} msg;
|
||||
} u;
|
||||
@@ -107,31 +106,29 @@ typedef struct _sprite sprite_t;
|
||||
|
||||
|
||||
/* in nt_sprite.c */
|
||||
extern sprite_t *nt_sp_new(int no, int cg1, int cg2, int cg3, int type);
|
||||
extern sprite_t *nt_sp_msg_new(int no, int x, int y, int width, int height);
|
||||
extern void nt_sp_free(sprite_t *sp);
|
||||
extern void nt_sp_set_show(sprite_t *sp, boolean show);
|
||||
// extern void nt_sp_set_cg(sprite_t *sp, int no);
|
||||
extern void nt_sp_set_loc(sprite_t *sp, int x, int y);
|
||||
sprite_t *nt_sp_new(int no, int cg1, int cg2, int cg3, int type);
|
||||
sprite_t *nt_sp_msg_new(int no, int x, int y, int width, int height);
|
||||
void nt_sp_free(sprite_t *sp);
|
||||
void nt_sp_set_show(sprite_t *sp, bool show);
|
||||
// void nt_sp_set_cg(sprite_t *sp, int no);
|
||||
void nt_sp_set_loc(sprite_t *sp, int x, int y);
|
||||
|
||||
/* in nt_sprite_update.c */
|
||||
extern int nt_sp_update_clipped();
|
||||
extern int nt_sp_update_all(boolean syncscreen);
|
||||
extern int nt_sp_updateme(sprite_t *sp);
|
||||
extern int nt_sp_updateme_part(sprite_t *sp, int x, int y, int w, int h);
|
||||
extern void nt_sp_add_updatelist(sprite_t *sp);
|
||||
extern void nt_sp_remove_updatelist(sprite_t *sp);
|
||||
extern int nt_sp_draw_wall(sprite_t *sp, MyRectangle *r);
|
||||
extern void nt_sp_clear_updatelist(void);
|
||||
void nt_sp_update_clipped();
|
||||
void nt_sp_update_all(bool syncscreen);
|
||||
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_clear_updatelist(void);
|
||||
|
||||
/* in nt_sprite_draw.c */
|
||||
extern int nt_sp_draw(sprite_t *sp, MyRectangle *r);
|
||||
extern int nt_sp_draw2(sprite_t *sp, cginfo_t *cg, MyRectangle *r);
|
||||
extern void nt_sp_draw_dmap(void* data, void* userdata);
|
||||
extern int nt_sp_draw_scg(sprite_t *sp, MyRectangle *r);
|
||||
void nt_sp_draw(sprite_t *sp, MyRectangle *r);
|
||||
void nt_sp_draw_scg(sprite_t *sp, MyRectangle *r);
|
||||
|
||||
/* in nt_sprite_eupdate.c */
|
||||
extern int nt_sp_eupdate(int type, int time, int cancel);
|
||||
void nt_sp_eupdate(int type, int time, int cancel);
|
||||
|
||||
|
||||
#endif /* __SPRITE_H__ */
|
||||
|
||||
@@ -24,13 +24,12 @@
|
||||
#include "config.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <SDL.h>
|
||||
|
||||
#include "portab.h"
|
||||
#include "system.h"
|
||||
#include "ags.h"
|
||||
#include "graphics.h"
|
||||
#include "surface.h"
|
||||
#include "ngraph.h"
|
||||
#include "sprite.h"
|
||||
|
||||
/*
|
||||
@@ -38,106 +37,60 @@
|
||||
@param sp: 描画するスプライト
|
||||
@param r : 再描画する領域
|
||||
*/
|
||||
int nt_sp_draw(sprite_t *sp, MyRectangle *r) {
|
||||
if (sp == NULL) return NG;
|
||||
|
||||
return nt_sp_draw2(sp, sp->curcg, r);
|
||||
}
|
||||
|
||||
/*
|
||||
指定の spriteの指定のCGを surface0 に書く
|
||||
(このインターフェイスはもう不要?)
|
||||
|
||||
@param sp: 描画するスプライト
|
||||
@param cg: 描画するCG
|
||||
@param r : 再描画する領域
|
||||
*/
|
||||
int nt_sp_draw2(sprite_t *sp, cginfo_t *cg, MyRectangle *r) {
|
||||
surface_t update;
|
||||
int sx, sy, w, h, dx, dy;
|
||||
|
||||
if (cg == NULL) return NG;
|
||||
if (cg->sf == NULL) return NG;
|
||||
void nt_sp_draw(sprite_t *sp, MyRectangle *r) {
|
||||
if (sp == NULL) return;
|
||||
cginfo_t *cg = sp->curcg;
|
||||
if (cg == NULL) return;
|
||||
if (cg->sf == NULL) return;
|
||||
|
||||
// 更新領域の確定
|
||||
update.width = r->w;
|
||||
update.height = r->h;
|
||||
sx = 0;
|
||||
sy = 0;
|
||||
dx = sp->cur.x - r->x;
|
||||
dy = sp->cur.y - r->y;
|
||||
w = cg->sf->width;
|
||||
h = cg->sf->height;
|
||||
SDL_Rect cg_rect = {0, 0, cg->sf->w, cg->sf->h};
|
||||
int sx = 0;
|
||||
int sy = 0;
|
||||
int dx = sp->cur.x;
|
||||
int dy = sp->cur.y;
|
||||
int w = cg->sf->w;
|
||||
int h = cg->sf->h;
|
||||
|
||||
if (!gr_clip(cg->sf, &sx, &sy, &w, &h, &update, &dx, &dy)) {
|
||||
return NG;
|
||||
if (!ags_clipCopyRect(&cg_rect, r, &sx, &sy, &dx, &dy, &w, &h)) {
|
||||
return;
|
||||
}
|
||||
|
||||
dx += r->x;
|
||||
dy += r->y;
|
||||
|
||||
if (cg->sf->alpha) {
|
||||
// alpha map がある場合
|
||||
gre_BlendUseAMap(sf0, dx, dy,
|
||||
sf0, dx, dy,
|
||||
cg->sf, sx, sy, w, h,
|
||||
cg->sf, sx, sy,
|
||||
sp->blendrate);
|
||||
|
||||
if (SDL_ISPIXELFORMAT_ALPHA(cg->sf->format->format) || sp->blendrate < 255) {
|
||||
SDL_SetSurfaceBlendMode(cg->sf, SDL_BLENDMODE_BLEND);
|
||||
SDL_SetSurfaceAlphaMod(cg->sf, sp->blendrate);
|
||||
} else {
|
||||
if (sp->blendrate == 255) {
|
||||
// alpha値指定が無い場合
|
||||
gr_copy(sf0, dx, dy, cg->sf, sx, sy, w, h);
|
||||
} else if (sp->blendrate > 0) {
|
||||
// alpha値指定がある場合
|
||||
gre_Blend(sf0, dx, dy,
|
||||
sf0, dx, dy,
|
||||
cg->sf, sx, sy, w, h,
|
||||
sp->blendrate);
|
||||
}
|
||||
SDL_SetSurfaceBlendMode(cg->sf, SDL_BLENDMODE_NONE);
|
||||
}
|
||||
SDL_BlitSurface(cg->sf, &(SDL_Rect){sx, sy, w, h}, main_surface, &(SDL_Rect){dx, dy, w, h});
|
||||
|
||||
SACT_DEBUG("do update no=%d, sx=%d, sy=%d, w=%d, h=%d, dx=%d, dy=%d",
|
||||
sp->no, sx, sy, w, h, dx, dy);
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
// BlendScreenによる描画
|
||||
int nt_sp_draw_scg(sprite_t *sp, MyRectangle *r) {
|
||||
surface_t update;
|
||||
cginfo_t *cg;
|
||||
int sx, sy, w, h, dx, dy;
|
||||
|
||||
if (sp == NULL) return NG;
|
||||
|
||||
cg = sp->curcg;
|
||||
|
||||
if (cg == NULL) return NG;
|
||||
if (cg->sf == NULL) return NG;
|
||||
void nt_sp_draw_scg(sprite_t *sp, MyRectangle *r) {
|
||||
if (sp == NULL) return;
|
||||
cginfo_t *cg = sp->curcg;
|
||||
if (cg == NULL) return;
|
||||
if (cg->sf == NULL) return;
|
||||
|
||||
// 更新領域の確定
|
||||
update.width = r->w;
|
||||
update.height = r->h;
|
||||
sx = 0;
|
||||
sy = 0;
|
||||
dx = sp->cur.x - r->x;
|
||||
dy = sp->cur.y - r->y;
|
||||
w = cg->sf->width;
|
||||
h = cg->sf->height;
|
||||
SDL_Rect cg_rect = {0, 0, cg->sf->w, cg->sf->h};
|
||||
int sx = 0;
|
||||
int sy = 0;
|
||||
int dx = sp->cur.x;
|
||||
int dy = sp->cur.y;
|
||||
int w = cg->sf->w;
|
||||
int h = cg->sf->h;
|
||||
|
||||
if (!gr_clip(cg->sf, &sx, &sy, &w, &h, &update, &dx, &dy)) {
|
||||
return NG;
|
||||
if (!ags_clipCopyRect(&cg_rect, r, &sx, &sy, &dx, &dy, &w, &h)) {
|
||||
return;
|
||||
}
|
||||
|
||||
dx += r->x;
|
||||
dy += r->y;
|
||||
|
||||
gre_BlendScreen(sf0, dx, dy,
|
||||
sf0, dx, dy,
|
||||
cg->sf, sx, sy, w, h);
|
||||
SDL_SetSurfaceBlendMode(cg->sf, SDL_BLENDMODE_ADD);
|
||||
SDL_BlitSurface(cg->sf, &(SDL_Rect){sx, sy, w, h}, main_surface, &(SDL_Rect){dx, dy, w, h});
|
||||
|
||||
SACT_DEBUG("do update no=%d, sx=%d, sy=%d, w=%d, h=%d, dx=%d, dy=%d",
|
||||
sp->no, sx, sy, w, h, dx, dy);
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
@@ -25,7 +25,6 @@
|
||||
|
||||
#include "portab.h"
|
||||
#include "system.h"
|
||||
#include "ngraph.h"
|
||||
#include "ags.h"
|
||||
#include "input.h"
|
||||
#include "sprite.h"
|
||||
@@ -37,20 +36,20 @@
|
||||
@param time: 実行時間(msec)
|
||||
@param cancel: キー抜け(0:なし, 1:あり)
|
||||
*/
|
||||
int nt_sp_eupdate(int no, int time, int cancel) {
|
||||
void nt_sp_eupdate(int no, int time, int cancel) {
|
||||
if (no == 1013) {
|
||||
nt_sp_update_all(TRUE);
|
||||
return OK;
|
||||
nt_sp_update_all(true);
|
||||
return;
|
||||
}
|
||||
|
||||
nt_sp_update_all(FALSE);
|
||||
nt_sp_update_all(false);
|
||||
|
||||
enum sdl_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, sf0->width, sf0->height };
|
||||
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);
|
||||
|
||||
int sttime, curtime;
|
||||
@@ -66,5 +65,4 @@ int nt_sp_eupdate(int no, int time, int cancel) {
|
||||
}
|
||||
sdl_effect_finish(eff);
|
||||
ags_updateFull();
|
||||
return OK;
|
||||
}
|
||||
|
||||
@@ -25,15 +25,13 @@
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <SDL.h>
|
||||
|
||||
#include "portab.h"
|
||||
#include "system.h"
|
||||
#include "list.h"
|
||||
#include "ags.h"
|
||||
#include "graphics.h"
|
||||
// #include "sact.h"
|
||||
#include "surface.h"
|
||||
#include "ngraph.h"
|
||||
#include "sprite.h"
|
||||
|
||||
// スプライト再描画間の間に変更のあったスプライトの領域の和
|
||||
@@ -57,7 +55,7 @@ static void disjunction(void* region, void* data) {
|
||||
// 更新の必要なスプライトの領域の和をとってクリッピングする
|
||||
static MyRectangle get_updatearea() {
|
||||
MyRectangle clip = {0, 0, 0, 0};
|
||||
MyRectangle rsf0 = {0, 0, sf0->width, sf0->height};
|
||||
MyRectangle screen = {0, 0, main_surface->w, main_surface->h};
|
||||
MyRectangle result;
|
||||
|
||||
slist_foreach(updatearea, disjunction, &clip);
|
||||
@@ -66,7 +64,7 @@ static MyRectangle get_updatearea() {
|
||||
updatearea = NULL;
|
||||
|
||||
// surface0との領域の積をとる
|
||||
SDL_IntersectRect(&rsf0, &clip, &result);
|
||||
SDL_IntersectRect(&screen, &clip, &result);
|
||||
|
||||
SACT_DEBUG("clipped area x=%d y=%d w=%d h=%d",
|
||||
result.x, result.y, result.w, result.h);
|
||||
@@ -92,9 +90,9 @@ static void do_update_each(void* data, void* userdata) {
|
||||
画面全体の更新
|
||||
@param syncscreen: surface0 に描画したものを Screen に反映させるかどうか
|
||||
*/
|
||||
int nt_sp_update_all(boolean syncscreen) {
|
||||
void nt_sp_update_all(bool syncscreen) {
|
||||
// 画面全体を更新領域に
|
||||
MyRectangle r = {0, 0, sf0->width, sf0->height };
|
||||
MyRectangle r = {0, 0, main_surface->w, main_surface->h };
|
||||
|
||||
// updatelistに登録してあるスプライトを再描画
|
||||
// updatelistはスプライトの番号順に並んでいる
|
||||
@@ -106,41 +104,37 @@ int nt_sp_update_all(boolean syncscreen) {
|
||||
if (syncscreen) {
|
||||
ags_updateFull();
|
||||
}
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
/*
|
||||
画面の一部を更新
|
||||
updateme(_part)で登録した更新が必要なspriteの和の領域をupdate
|
||||
*/
|
||||
int nt_sp_update_clipped() {
|
||||
void nt_sp_update_clipped() {
|
||||
MyRectangle r;
|
||||
|
||||
// 更新領域の確定
|
||||
r = get_updatearea();
|
||||
|
||||
if (SDL_RectEmpty(&r))
|
||||
return OK;
|
||||
return;
|
||||
|
||||
// 更新領域に入っているスプライトの再描画
|
||||
slist_foreach(updatelist, do_update_each, &r);
|
||||
|
||||
// 更新領域を Window に転送
|
||||
ags_updateArea(r.x, r.y, r.w, r.h);
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
/*
|
||||
sprite全体の更新を登録
|
||||
@param sp: 更新するスプライト
|
||||
*/
|
||||
int nt_sp_updateme(sprite_t *sp) {
|
||||
void nt_sp_updateme(sprite_t *sp) {
|
||||
MyRectangle *r;
|
||||
|
||||
if (sp == NULL) return NG;
|
||||
if (sp->cursize.width == 0 || sp->cursize.height == 0) return NG;
|
||||
if (sp == NULL) return;
|
||||
if (sp->cursize.width == 0 || sp->cursize.height == 0) return;
|
||||
|
||||
r = malloc(sizeof(MyRectangle));
|
||||
r->x = sp->cur.x;
|
||||
@@ -152,8 +146,6 @@ int nt_sp_updateme(sprite_t *sp) {
|
||||
|
||||
SACT_DEBUG("x = %d, y = %d, spno = %d w=%d,h=%d",
|
||||
r->x, r->y, sp->no, r->w, r->h);
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -164,11 +156,11 @@ int nt_sp_updateme(sprite_t *sp) {
|
||||
@param w: 更新領域幅
|
||||
@param h: 更新領域高さ
|
||||
*/
|
||||
int nt_sp_updateme_part(sprite_t *sp, int x, int y, int w, int h) {
|
||||
void nt_sp_updateme_part(sprite_t *sp, int x, int y, int w, int h) {
|
||||
MyRectangle *r;
|
||||
|
||||
if (sp == NULL) return NG;
|
||||
if (w == 0 || h == 0) return NG;
|
||||
if (sp == NULL) return;
|
||||
if (w == 0 || h == 0) return;
|
||||
|
||||
r = malloc(sizeof(MyRectangle));
|
||||
r->x = sp->cur.x + x;
|
||||
@@ -180,8 +172,6 @@ int nt_sp_updateme_part(sprite_t *sp, int x, int y, int w, int h) {
|
||||
|
||||
SACT_DEBUG("x = %d, y = %d, spno = %d w=%d,h=%d",
|
||||
r->x, r->y, sp->no, r->w, r->h);
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
// スプライトの番号順に更新するためにリストに順番に要れるためのcallbck
|
||||
@@ -214,18 +204,6 @@ void nt_sp_clear_updatelist(void) {
|
||||
}
|
||||
|
||||
// デフォルトの壁紙update
|
||||
int nt_sp_draw_wall(sprite_t *sp, MyRectangle *area) {
|
||||
int sx, sy, w, h;
|
||||
|
||||
sx = area->x;
|
||||
sy = area->y;
|
||||
w = area->w;
|
||||
h = area->h;
|
||||
gr_fill(sf0, sx, sy, w, h, 0, 0, 0);
|
||||
|
||||
SACT_DEBUG("do update no=%d, sx=%d, sy=%d, w=%d, h=%d",
|
||||
sp->no, sx, sy, w, h);
|
||||
|
||||
return OK;
|
||||
void nt_sp_draw_wall(sprite_t *sp, MyRectangle *area) {
|
||||
SDL_FillRect(main_surface, area, SDL_MapRGB(main_surface->format, 0, 0, 0));
|
||||
}
|
||||
|
||||
|
||||
@@ -34,7 +34,6 @@
|
||||
#include "music.h"
|
||||
#include "sdl_core.h"
|
||||
#include "input.h"
|
||||
#include "ngraph.h"
|
||||
#include "cg.h"
|
||||
#include "jpeg.h"
|
||||
|
||||
@@ -61,8 +60,10 @@ static void ndd_run(int demonum) {
|
||||
|
||||
cgdata *cg = jpeg_extract(alk->entries[i].data, alk->entries[i].size);
|
||||
if (cg) {
|
||||
gr_drawimage24(sf0, cg, 0, 0);
|
||||
SDL_Surface *sf = SDL_CreateRGBSurfaceWithFormatFrom(cg->pic, cg->width, cg->height, 24, cg->width * 3, SDL_PIXELFORMAT_RGB24);
|
||||
SDL_BlitSurface(sf, NULL, main_surface, NULL);
|
||||
ags_updateFull();
|
||||
SDL_FreeSurface(sf);
|
||||
cgdata_free(cg);
|
||||
} else {
|
||||
WARNING("Cannot decode CG %d in %s", i, alk_path);
|
||||
|
||||
@@ -48,7 +48,7 @@ static void Prepare(void) {
|
||||
current_no = no;
|
||||
*result = 1;
|
||||
} else {
|
||||
*result = muspcm_load_bgm(SLOT, no) == OK;
|
||||
*result = muspcm_load_bgm(SLOT, no) ? 1 : 0;
|
||||
}
|
||||
TRACE("S3xMusic.Prepare %d, %d => %d:", ch, no, *result);
|
||||
}
|
||||
|
||||
+16
-17
@@ -25,6 +25,7 @@
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <SDL.h>
|
||||
#ifdef __EMSCRIPTEN__
|
||||
#include <emscripten.h>
|
||||
#endif
|
||||
@@ -46,8 +47,6 @@
|
||||
#include "sactsound.h"
|
||||
#include "sactcrypto.h"
|
||||
#include "sactchart.h"
|
||||
#include "ngraph.h"
|
||||
#include "surface.h"
|
||||
#include "sactamask.h"
|
||||
|
||||
/*
|
||||
@@ -147,20 +146,20 @@ static void Init() {
|
||||
}
|
||||
|
||||
// create depth map
|
||||
sact.dmap = sf_create_pixel(sf0->width, sf0->height, 16);
|
||||
sact.dmap = SDL_CreateRGBSurface(0, main_surface->w, main_surface->h, 16, 0, 0, 0, 0);
|
||||
|
||||
// その他 System35 のデフォルト動作の変更
|
||||
ags_setAntialiasedStringMode(TRUE);
|
||||
ags_setAntialiasedStringMode(true);
|
||||
sys_setHankakuMode(2); // 全角半角変換無し
|
||||
ags_autorepeat(FALSE); // key auto repeat off
|
||||
ags_autorepeat(false); // key auto repeat off
|
||||
|
||||
if (sact.version >= 120) {
|
||||
sact.logging = TRUE;
|
||||
sact.logging = true;
|
||||
#ifdef __EMSCRIPTEN__
|
||||
EM_ASM( xsystem35.texthook.disableWheelEvent(0xffffffff) );
|
||||
#endif
|
||||
} else {
|
||||
sact.logging = FALSE;
|
||||
sact.logging = false;
|
||||
}
|
||||
|
||||
TRACE("SACT.Init %d:", p1);
|
||||
@@ -267,7 +266,7 @@ static void SpriteDeleteCount() {
|
||||
* 現在設定されているスプライト状態を画面に反映(~SP_UPDATE)
|
||||
*/
|
||||
static void Draw() {
|
||||
sp_update_all(TRUE);
|
||||
sp_update_all(true);
|
||||
|
||||
TRACE("SACT.Draw:");
|
||||
}
|
||||
@@ -639,7 +638,7 @@ static void QuerySpriteIsExist() {
|
||||
int wNum = getCaliValue();
|
||||
int *var = getCaliVariable();
|
||||
|
||||
sp_query_isexist(wNum, var);
|
||||
*var = sp_exists(wNum) ? 1 : 0;
|
||||
|
||||
TRACE("SACT.QuerySpriteIsExist %d,%p:", wNum, var);
|
||||
}
|
||||
@@ -765,7 +764,7 @@ static void CG_QueryType() {
|
||||
int wNumCG = getCaliValue();
|
||||
int *vType = getCaliVariable();
|
||||
|
||||
scg_querytype(wNumCG, vType);
|
||||
*vType = scg_querytype(wNumCG);
|
||||
|
||||
TRACE("SACT.CG_QueryType %d,%p:", wNumCG, vType);
|
||||
}
|
||||
@@ -797,7 +796,7 @@ static void CG_QueryBpp() {
|
||||
int wNumCG = getCaliValue();
|
||||
int *vBpp = getCaliVariable();
|
||||
|
||||
scg_querybpp(wNumCG, vBpp);
|
||||
*vBpp = scg_querybpp(wNumCG);
|
||||
|
||||
TRACE("SACT.CG_QueryBpp %d,%p:", wNumCG, vBpp);
|
||||
}
|
||||
@@ -812,7 +811,7 @@ static void CG_ExistAlphaMap() {
|
||||
int wNumCG = getCaliValue();
|
||||
int *vMask = getCaliVariable();
|
||||
|
||||
scg_existalphamap(wNumCG, vMask);
|
||||
*vMask = scg_existalphamap(wNumCG) ? 1 : 0;
|
||||
|
||||
TRACE("SACT.CG_ExistAlphaMap %d,%p:", wNumCG, vMask);
|
||||
}
|
||||
@@ -1027,7 +1026,7 @@ static void WaitKeySimple() {
|
||||
TRACE("SACT.WaitKeySimple %d:", vKey);
|
||||
|
||||
// とりあえず全更新
|
||||
sp_update_all(TRUE);
|
||||
sp_update_all(true);
|
||||
|
||||
sact.waittype = KEYWAIT_SIMPLE;
|
||||
sact.waitkey = -1;
|
||||
@@ -1314,7 +1313,7 @@ static void MessageClear() {
|
||||
static void MessageIsEmpty() {
|
||||
int *wResult = getCaliVariable();
|
||||
|
||||
*wResult = smsg_is_empty();
|
||||
*wResult = smsg_is_empty() ? 1 : 0;
|
||||
|
||||
TRACE("SACT.MessageIsEmpty %p:", wResult);
|
||||
}
|
||||
@@ -1339,7 +1338,7 @@ static void MessagePeek() {
|
||||
* ログ採取停止
|
||||
*/
|
||||
static void Log_Stop() {
|
||||
sact.logging = FALSE;
|
||||
sact.logging = false;
|
||||
TRACE("SACT.Log_Stop:");
|
||||
}
|
||||
|
||||
@@ -1348,7 +1347,7 @@ static void Log_Stop() {
|
||||
* ログ採取開始
|
||||
*/
|
||||
static void Log_Start() {
|
||||
sact.logging = TRUE;
|
||||
sact.logging = true;
|
||||
TRACE("SACT.Log_Start:");
|
||||
}
|
||||
|
||||
@@ -2146,7 +2145,7 @@ static void SACT_reset(void) {
|
||||
sp_reset();
|
||||
|
||||
scg_freeall();
|
||||
sf_free(sact.dmap);
|
||||
SDL_FreeSurface(sact.dmap);
|
||||
memset(&sact, 0, sizeof(sact));
|
||||
}
|
||||
|
||||
|
||||
+16
-16
@@ -29,7 +29,7 @@
|
||||
#include "portab.h"
|
||||
#include "list.h"
|
||||
#include "graphics.h"
|
||||
#include "surface.h"
|
||||
#include "ags.h"
|
||||
#include "sacttimer.h"
|
||||
#include "variable.h"
|
||||
|
||||
@@ -73,7 +73,7 @@ enum cgtype {
|
||||
struct _cginfo {
|
||||
enum cgtype type; // CGの種類, 0: 未使用, 1:リンクされている, ...
|
||||
int no; // CGの番号
|
||||
surface_t *sf; // CG本体
|
||||
struct SDL_Surface *sf;
|
||||
int refcnt; // 参照カウンタ。0になったら開放してもよい。
|
||||
};
|
||||
typedef struct _cginfo cginfo_t;
|
||||
@@ -116,8 +116,8 @@ struct _sprite {
|
||||
cginfo_t *curcg;
|
||||
|
||||
// スプライトを表示するか
|
||||
boolean show;
|
||||
boolean show_save; // Zkey hide save用
|
||||
bool show;
|
||||
bool show_save; // Zkey hide save用
|
||||
|
||||
// 表示する際のブレンド率 0:全く見えない, 255: 通常表示
|
||||
int blendrate;
|
||||
@@ -137,10 +137,10 @@ struct _sprite {
|
||||
// sprite削除時の callback
|
||||
void (* remove)(struct _sprite *sp);
|
||||
// spriteを再描画するときの callback
|
||||
int (* update)(struct _sprite *sp);
|
||||
void (* update)(struct _sprite *sp);
|
||||
|
||||
boolean focused; // forcusを得ているか
|
||||
boolean pressed; // このsprite上でマウスが押されているか
|
||||
bool focused; // forcusを得ているか
|
||||
bool pressed; // このsprite上でマウスが押されているか
|
||||
|
||||
SList *expsp; // 説明スプライトのリスト
|
||||
|
||||
@@ -151,7 +151,7 @@ struct _sprite {
|
||||
int speed; // 移動速度
|
||||
int starttime; // 移動開始時刻
|
||||
int endtime; // 移動終了予定時刻
|
||||
boolean moving; // 移動中かどうか
|
||||
bool moving; // 移動中かどうか
|
||||
} move;
|
||||
|
||||
// SACT.Numeral用パラメータ
|
||||
@@ -170,7 +170,7 @@ struct _sprite {
|
||||
|
||||
// ゲットスプライト
|
||||
struct {
|
||||
boolean dragging; // ドラッグ中
|
||||
bool dragging; // ドラッグ中
|
||||
MyPoint dragstart; // ドラッグ開始位置
|
||||
} get;
|
||||
|
||||
@@ -190,7 +190,7 @@ struct _sprite {
|
||||
// メッセージスプライト
|
||||
struct {
|
||||
SList *buf; // 表示する文字のリスト
|
||||
surface_t *canvas; // 文字を描画するsurface
|
||||
struct SDL_Surface *canvas;
|
||||
MyPoint dspcur; // 現在の表示位置
|
||||
} msg;
|
||||
} u;
|
||||
@@ -234,7 +234,7 @@ struct _sact {
|
||||
int align; // 行そろえ
|
||||
void (* cbmove)(agsevent_t *);
|
||||
void (* cbrelease)(agsevent_t *);
|
||||
surface_t *charcanvas;
|
||||
struct SDL_Surface *charcanvas;
|
||||
} sel;
|
||||
|
||||
// event listener
|
||||
@@ -254,7 +254,7 @@ struct _sact {
|
||||
|
||||
// DnDに関するもの
|
||||
sprite_t *draggedsp; // drag中のスプライト
|
||||
boolean dropped; // スプライトがドロップされたかどうか
|
||||
bool dropped; // スプライトがドロップされたかどうか
|
||||
|
||||
// keywaitの種類
|
||||
int waittype;
|
||||
@@ -273,14 +273,14 @@ struct _sact {
|
||||
int numsoundob;
|
||||
|
||||
// depth map
|
||||
surface_t *dmap;
|
||||
struct SDL_Surface *dmap;
|
||||
|
||||
boolean zhiding; // Zkeyによる隠し中
|
||||
bool zhiding; // Zkeyによる隠し中
|
||||
int zofftime;
|
||||
boolean zdooff;
|
||||
bool zdooff;
|
||||
|
||||
// バックログ
|
||||
boolean logging;
|
||||
bool logging;
|
||||
List *log;
|
||||
};
|
||||
typedef struct _sact sact_t;
|
||||
|
||||
+21
-82
@@ -25,23 +25,18 @@
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <SDL.h>
|
||||
|
||||
#include "portab.h"
|
||||
#include "system.h"
|
||||
#include "LittleEndian.h"
|
||||
#include "input.h"
|
||||
#include "ags.h"
|
||||
#include "sact.h"
|
||||
#include "surface.h"
|
||||
#include "ngraph.h"
|
||||
#include "pms.h"
|
||||
#include "sprite.h"
|
||||
#include "sdl_core.h"
|
||||
#include "mmap.h"
|
||||
|
||||
static surface_t *smask_get(int no);
|
||||
static surface_t *smask_mul(surface_t *sf, int val);
|
||||
|
||||
// SACTEFAM を使ったマスク
|
||||
typedef struct {
|
||||
mmap_t *mmap;
|
||||
@@ -52,24 +47,14 @@ typedef struct {
|
||||
|
||||
static SACTEFAM_t am;
|
||||
|
||||
struct ecopyparam {
|
||||
int sttime;
|
||||
int curtime;
|
||||
int edtime;
|
||||
int curstep;
|
||||
int oldstep;
|
||||
};
|
||||
typedef struct ecopyparam ecopyparam_t;
|
||||
static ecopyparam_t ecp;
|
||||
|
||||
// SACTEFAM.KLD の読み込み
|
||||
int smask_init(char *path) {
|
||||
bool smask_init(char *path) {
|
||||
if (am.mmap)
|
||||
return OK; // already loaded
|
||||
return true; // already loaded
|
||||
|
||||
mmap_t *m = map_file(path);
|
||||
if (!m)
|
||||
return NG;
|
||||
return false;
|
||||
am.mmap = m;
|
||||
am.datanum = LittleEndian_getDW(m->addr, 0);
|
||||
am.no = malloc(sizeof(int) * am.datanum);
|
||||
@@ -80,11 +65,11 @@ int smask_init(char *path) {
|
||||
am.offset[i] = LittleEndian_getDW(m->addr, 16 + i * 16 + 8);
|
||||
}
|
||||
|
||||
return OK;
|
||||
return true;
|
||||
}
|
||||
|
||||
// 指定番号の alphamask ファイルをよみだす
|
||||
static surface_t *smask_get(int no) {
|
||||
static cgdata *smask_get(int no) {
|
||||
int i;
|
||||
|
||||
for (i = 0; i < am.datanum; i++) {
|
||||
@@ -93,71 +78,25 @@ static surface_t *smask_get(int no) {
|
||||
|
||||
if (i == am.datanum) return NULL;
|
||||
|
||||
return sf_getcg(am.mmap->addr + am.offset[i], 0 /*FIXME*/);
|
||||
}
|
||||
|
||||
// ベースになるマスクの alpha 値を拡大して取り出す
|
||||
static surface_t *smask_mul(surface_t *sf, int val) {
|
||||
surface_t *out = sf_create_alpha(sf->width, sf->height);
|
||||
uint8_t *src = sf->alpha;
|
||||
uint8_t *dst = out->alpha;
|
||||
int pix = sf->width * sf->height;
|
||||
|
||||
while(pix--) {
|
||||
int i = (*src - val) * 16;
|
||||
if (i < 0) *dst = 255; // 指定値よりも大きいのはコピー
|
||||
else if (i > 255) *dst = 0; // 指定値よりも小さいのは無視
|
||||
else *dst = 255-i; // それ以外は値を16倍
|
||||
src++; dst++;
|
||||
}
|
||||
|
||||
return out;
|
||||
return pms256_extract(am.mmap->addr + am.offset[i]);
|
||||
}
|
||||
|
||||
/**
|
||||
* マスクつき画面更新
|
||||
*/
|
||||
int sp_eupdate_amap(int index, int time, int cancel) {
|
||||
surface_t *mask, *mask2;
|
||||
surface_t *sfsrc, *sfdst;
|
||||
int key;
|
||||
|
||||
mask = smask_get(index);
|
||||
void sp_eupdate_amap(int index, int time, int cancel) {
|
||||
cgdata *mask = smask_get(index);
|
||||
if (mask == NULL) {
|
||||
sp_update_all(TRUE);
|
||||
return OK;
|
||||
sp_update_all(true);
|
||||
return;
|
||||
}
|
||||
|
||||
// 現在の sf0 をセーブ
|
||||
sfsrc = sf_dup(sf0);
|
||||
sp_update_all(FALSE);
|
||||
sfdst = sf_dup(sf0);
|
||||
sf_copyall(sf0, sfsrc);
|
||||
|
||||
ecp.sttime = ecp.curtime = sdl_getTicks();
|
||||
ecp.edtime = ecp.curtime + time*10;
|
||||
ecp.oldstep = 0;
|
||||
|
||||
while ((ecp.curtime = sdl_getTicks()) < ecp.edtime) {
|
||||
int curstep = 255 * (ecp.curtime - ecp.sttime)/ (ecp.edtime - ecp.sttime);
|
||||
// 元になるマスクのalpha値を16倍して欲しいところだけ取り出す
|
||||
mask2 = smask_mul(mask, curstep);
|
||||
|
||||
gre_BlendUseAMap(sf0, 0, 0, sfsrc, 0, 0, sfdst, 0, 0, sfsrc->width, sfsrc->height, mask2, 0, 0, 255);
|
||||
ags_updateFull();
|
||||
|
||||
key = sys_keywait(10, cancel ? KEYWAIT_CANCELABLE : KEYWAIT_NONCANCELABLE);
|
||||
if (cancel && key) break;
|
||||
|
||||
// 一時マスクを削除
|
||||
sf_free(mask2);
|
||||
}
|
||||
|
||||
sf_copyall(sf0, sfdst);
|
||||
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);
|
||||
ags_updateFull();
|
||||
sf_free(sfsrc);
|
||||
sf_free(sfdst);
|
||||
|
||||
sf_free(mask);
|
||||
return OK;
|
||||
|
||||
SDL_FreeSurface(mask_sf);
|
||||
cgdata_free(mask);
|
||||
}
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
#ifndef __SACTAMASK_H__
|
||||
#define __SACTAMASK_H__
|
||||
|
||||
extern int smask_init(const char *path);
|
||||
bool smask_init(const char *path);
|
||||
void sp_eupdate_amap(int type, int time, int key);
|
||||
|
||||
#endif
|
||||
|
||||
+143
-132
@@ -23,9 +23,11 @@
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <SDL.h>
|
||||
|
||||
#include "portab.h"
|
||||
#include "nact.h"
|
||||
@@ -33,19 +35,16 @@
|
||||
#include "ags.h"
|
||||
#include "sact.h"
|
||||
#include "sactcg.h"
|
||||
#include "surface.h"
|
||||
#include "ngraph.h"
|
||||
#include "cg.h"
|
||||
#include "sdl_core.h"
|
||||
|
||||
#include "sactcg_stretch.c"
|
||||
#include "sactcg_blend.c"
|
||||
|
||||
#define spcg_assert_no(no) \
|
||||
#define SPCG_ASSERT_NO(no) \
|
||||
if ((no) > (CGMAX -1)) { \
|
||||
WARNING("no is too large (should be %d < %d)", (no), CGMAX); \
|
||||
return NG; \
|
||||
return; \
|
||||
} \
|
||||
|
||||
static cginfo_t *scg_new(enum cgtype type, int no, surface_t *sf) {
|
||||
static cginfo_t *scg_new(enum cgtype type, int no, SDL_Surface *sf) {
|
||||
cginfo_t *info = calloc(1, sizeof(cginfo_t));
|
||||
info->type = type;
|
||||
info->no = no;
|
||||
@@ -75,7 +74,7 @@ static cginfo_t *scg_get(int no) {
|
||||
if (sact.cg[no] != NULL)
|
||||
return sact.cg[no];
|
||||
|
||||
surface_t *sf = sf_loadcg_no(no - 1);
|
||||
SDL_Surface *sf = cg_load_as_sdlsurface(no - 1);
|
||||
if (!sf) {
|
||||
WARNING("load fail (%d)", no -1);
|
||||
return NULL;
|
||||
@@ -95,85 +94,137 @@ void scg_deref(cginfo_t *cg) {
|
||||
return;
|
||||
|
||||
if (cg->sf)
|
||||
sf_free(cg->sf);
|
||||
SDL_FreeSurface(cg->sf);
|
||||
free(cg);
|
||||
}
|
||||
|
||||
// 指定の大きさ、色の矩形の CG を作成
|
||||
int scg_create(int wNumCG, int wWidth, int wHeight, int wR, int wG, int wB, int wBlendRate) {
|
||||
spcg_assert_no(wNumCG);
|
||||
void scg_create(int wNumCG, int wWidth, int wHeight, int wR, int wG, int wB, int wBlendRate) {
|
||||
SPCG_ASSERT_NO(wNumCG);
|
||||
|
||||
surface_t *sf = sf_create_surface(wWidth, wHeight, sf0->depth);
|
||||
gr_fill(sf, 0, 0, wWidth, wHeight, wR, wG, wB);
|
||||
gr_fill_alpha_map(sf, 0, 0, wWidth, wHeight, wBlendRate);
|
||||
SDL_Surface *sf = SDL_CreateRGBSurfaceWithFormat(0, wWidth, wHeight, 32, SDL_PIXELFORMAT_ARGB8888);
|
||||
SDL_FillRect(sf, NULL, SDL_MapRGBA(sf->format, wR, wG, wB, wBlendRate));
|
||||
scg_new(CG_SET, wNumCG, sf);
|
||||
return OK;
|
||||
}
|
||||
|
||||
// 指定のCGを反転させたCGを作成
|
||||
int scg_create_reverse(int wNumCG, int wNumSrcCG, int wReverseX, int wReverseY) {
|
||||
spcg_assert_no(wNumCG);
|
||||
spcg_assert_no(wNumSrcCG);
|
||||
void scg_create_reverse(int wNumCG, int wNumSrcCG, int wReverseX, int wReverseY) {
|
||||
SPCG_ASSERT_NO(wNumCG);
|
||||
SPCG_ASSERT_NO(wNumSrcCG);
|
||||
|
||||
cginfo_t *src = scg_get(wNumSrcCG);
|
||||
if (!src)
|
||||
return NG;
|
||||
return;
|
||||
|
||||
surface_t *sf = stretch(src->sf, src->sf->width, src->sf->height, (wReverseX << 1) | wReverseY);
|
||||
SDL_Surface *sf = SDL_ConvertSurface(src->sf, src->sf->format, 0);
|
||||
if (wReverseX)
|
||||
sdl_FlipSurfaceHorizontal(sf);
|
||||
if (wReverseY)
|
||||
sdl_FlipSurfaceVertical(sf);
|
||||
scg_new(CG_REVERSE, wNumCG, sf);
|
||||
return OK;
|
||||
}
|
||||
|
||||
// 指定のCGを拡大/縮小したCGを作成
|
||||
int scg_create_stretch(int wNumCG, int wWidth, int wHeight, int wNumSrcCG) {
|
||||
spcg_assert_no(wNumCG);
|
||||
spcg_assert_no(wNumSrcCG);
|
||||
void scg_create_stretch(int wNumCG, int wWidth, int wHeight, int wNumSrcCG) {
|
||||
SPCG_ASSERT_NO(wNumCG);
|
||||
SPCG_ASSERT_NO(wNumSrcCG);
|
||||
|
||||
cginfo_t *src = scg_get(wNumSrcCG);
|
||||
if (!src)
|
||||
return NG;
|
||||
|
||||
surface_t *sf = stretch(src->sf, wWidth, wHeight, 0);
|
||||
return;
|
||||
|
||||
SDL_Surface *sf = SDL_CreateRGBSurfaceWithFormat(0, wWidth, wHeight, src->sf->format->BitsPerPixel, src->sf->format->format);
|
||||
SDL_BlitScaled(src->sf, NULL, sf, NULL);
|
||||
scg_new(CG_STRETCH, wNumCG, sf);
|
||||
return OK;
|
||||
}
|
||||
|
||||
static SDL_Surface *blend(SDL_Surface *base, int x, int y, SDL_Surface *blend, int mode) {
|
||||
assert(blend->format->format == SDL_PIXELFORMAT_ARGB8888 || blend->format->format == SDL_PIXELFORMAT_XRGB8888);
|
||||
bool src_has_alpha = SDL_ISPIXELFORMAT_ALPHA(blend->format->format);
|
||||
SDL_Surface *dst = SDL_ConvertSurfaceFormat(base, SDL_PIXELFORMAT_ARGB8888, 0);
|
||||
SDL_Rect rect = {x, y, blend->w, blend->h};
|
||||
SDL_IntersectRect(&(SDL_Rect){0, 0, dst->w, dst->h}, &rect, &rect);
|
||||
|
||||
for (int i = 0; i < rect.h; i++) {
|
||||
uint8_t *dstp = (uint8_t *)dst->pixels + (i + rect.y) * dst->pitch + rect.x * 4;
|
||||
uint8_t *srcp = (uint8_t *)blend->pixels + i * blend->pitch;
|
||||
for (int j = 0; j < rect.w; j++) {
|
||||
uint8_t *dstpp = dstp + j * 4;
|
||||
uint8_t *srcpp = srcp + j * 4;
|
||||
#if SDL_BYTEORDER == SDL_LIL_ENDIAN
|
||||
// Use base's alpha map if blend has no alpha map
|
||||
uint8_t alpha = src_has_alpha ? srcpp[3] : dstpp[3];
|
||||
if (alpha == 0) {
|
||||
// do nothing
|
||||
} else if (alpha == 255) {
|
||||
memcpy(dstpp, srcpp, 3);
|
||||
} else {
|
||||
for (int k = 0; k < 3; k++) {
|
||||
dstpp[k] = (dstpp[k] * (255 - alpha) + srcpp[k] * alpha) / 255;
|
||||
}
|
||||
}
|
||||
if (mode) {
|
||||
int dsta = dstpp[3] + srcpp[3];
|
||||
dstpp[3] = dsta > 255 ? 255 : dsta;
|
||||
}
|
||||
#else
|
||||
// Use base's alpha map if blend has no alpha map
|
||||
uint8_t alpha = src_has_alpha ? srcpp[0] : dstpp[0];
|
||||
if (alpha == 0) {
|
||||
// do nothing
|
||||
} else if (alpha == 255) {
|
||||
memcpy(dstpp + 1, srcpp + 1, 3);
|
||||
} else {
|
||||
for (int k = 1; k < 4; k++) {
|
||||
dstpp[k] = (dstpp[k] * (255 - alpha) + srcpp[k] * alpha) / 255;
|
||||
}
|
||||
}
|
||||
if (mode) {
|
||||
int dsta = dstpp[0] + srcpp[0];
|
||||
dstpp[0] = dsta > 255 ? 255 : dsta;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
return dst;
|
||||
}
|
||||
|
||||
// ベースCGの上にブレンドCGを重ねた CG を作成
|
||||
int scg_create_blend(int wNumDstCG, int wNumBaseCG, int wX, int wY, int wNumBlendCG, int wAlphaMapMode) {
|
||||
spcg_assert_no(wNumDstCG);
|
||||
spcg_assert_no(wNumBaseCG);
|
||||
spcg_assert_no(wNumBlendCG);
|
||||
void scg_create_blend(int wNumDstCG, int wNumBaseCG, int wX, int wY, int wNumBlendCG, int wAlphaMapMode) {
|
||||
SPCG_ASSERT_NO(wNumDstCG);
|
||||
SPCG_ASSERT_NO(wNumBaseCG);
|
||||
SPCG_ASSERT_NO(wNumBlendCG);
|
||||
|
||||
cginfo_t *basecg = scg_get(wNumBaseCG);
|
||||
cginfo_t *blendcg = scg_get(wNumBlendCG);
|
||||
if (!basecg || !blendcg) return NG;
|
||||
if (!basecg || !blendcg) return;
|
||||
|
||||
surface_t *sf = blend(basecg->sf, wX, wY, blendcg->sf, wAlphaMapMode);
|
||||
SDL_Surface *sf = blend(basecg->sf, wX, wY, blendcg->sf, wAlphaMapMode);
|
||||
scg_new(CG_SET, wNumDstCG, sf);
|
||||
return OK;
|
||||
}
|
||||
|
||||
// 指定の文字列のCGを作成
|
||||
int scg_create_text(int wNumCG, int wSize, int wR, int wG, int wB, int wText) {
|
||||
spcg_assert_no(wNumCG);
|
||||
void scg_create_text(int wNumCG, int wSize, int wR, int wG, int wB, int wText) {
|
||||
SPCG_ASSERT_NO(wNumCG);
|
||||
|
||||
// 勝手に出ていいのかな?
|
||||
if (svar_length(wText) == 0) return OK;
|
||||
if (svar_length(wText) == 0) return;
|
||||
|
||||
ags_setFont(FONT_GOTHIC, wSize);
|
||||
agsurface_t *glyph = ags_drawStringToSurface(svar_get(wText));
|
||||
SDL_Surface *glyph = ags_drawStringToSurface(svar_get(wText), wR, wG, wB);
|
||||
|
||||
surface_t *sf = sf_create_surface(glyph->width, wSize, nact->ags.dib->depth);
|
||||
gr_fill(sf, 0, 0, glyph->width, wSize, wR, wG, wB);
|
||||
gr_draw_amap(sf, 0, 0, glyph->pixel, glyph->width, wSize, glyph->bytes_per_line);
|
||||
SDL_Surface *sf = SDL_CreateRGBSurfaceWithFormat(0, glyph->w, wSize, 32, SDL_PIXELFORMAT_ARGB8888);
|
||||
SDL_SetSurfaceBlendMode(glyph, SDL_BLENDMODE_NONE);
|
||||
SDL_BlitSurface(glyph, NULL, sf, NULL);
|
||||
SDL_FreeSurface(glyph);
|
||||
|
||||
scg_new(CG_SET, wNumCG, sf);
|
||||
return OK;
|
||||
}
|
||||
|
||||
// 数字文字列のCGを作成
|
||||
int scg_create_textnum(int wNumCG, int wSize, int wR, int wG, int wB, int wFigs, int wZeroPadding, int wValue) {
|
||||
spcg_assert_no(wNumCG);
|
||||
void scg_create_textnum(int wNumCG, int wSize, int wR, int wG, int wB, int wFigs, int wZeroPadding, int wValue) {
|
||||
SPCG_ASSERT_NO(wNumCG);
|
||||
|
||||
char s[256], ss[256];
|
||||
if (wZeroPadding) {
|
||||
@@ -186,157 +237,117 @@ int scg_create_textnum(int wNumCG, int wSize, int wR, int wG, int wB, int wFigs,
|
||||
sprintf(s, ss, wValue);
|
||||
|
||||
ags_setFont(FONT_GOTHIC, wSize);
|
||||
agsurface_t *glyph = ags_drawStringToSurface(s);
|
||||
SDL_Surface *glyph = ags_drawStringToSurface(s, wR, wG, wB);
|
||||
|
||||
surface_t *sf = sf_create_surface(glyph->width, wSize, nact->ags.dib->depth);
|
||||
gr_fill(sf, 0, 0, glyph->width, wSize, wR, wG, wB);
|
||||
gr_draw_amap(sf, 0, 0, glyph->pixel, glyph->width, wSize, glyph->bytes_per_line);
|
||||
SDL_Surface *sf = SDL_CreateRGBSurfaceWithFormat(0, glyph->w, wSize, 32, SDL_PIXELFORMAT_ARGB8888);
|
||||
SDL_SetSurfaceBlendMode(glyph, SDL_BLENDMODE_NONE);
|
||||
SDL_BlitSurface(glyph, NULL, sf, NULL);
|
||||
SDL_FreeSurface(glyph);
|
||||
|
||||
scg_new(CG_SET, wNumCG, sf);
|
||||
return OK;
|
||||
}
|
||||
|
||||
// CGを複製
|
||||
int scg_copy(int wNumDstCG, int wNumSrcCG) {
|
||||
spcg_assert_no(wNumDstCG);
|
||||
spcg_assert_no(wNumSrcCG);
|
||||
void scg_copy(int wNumDstCG, int wNumSrcCG) {
|
||||
SPCG_ASSERT_NO(wNumDstCG);
|
||||
SPCG_ASSERT_NO(wNumSrcCG);
|
||||
|
||||
cginfo_t *src = scg_get(wNumSrcCG);
|
||||
if (!src)
|
||||
return NG;
|
||||
return;
|
||||
|
||||
scg_new(CG_SET, wNumDstCG, sf_dup(src->sf));
|
||||
return OK;
|
||||
scg_new(CG_SET, wNumDstCG, SDL_ConvertSurface(src->sf, src->sf->format, 0));
|
||||
}
|
||||
|
||||
// CGの一部を切りぬいたCGを作成
|
||||
int scg_cut(int wNumDstCG, int wNumSrcCG, int wX, int wY, int wWidth, int wHeight) {
|
||||
spcg_assert_no(wNumDstCG);
|
||||
spcg_assert_no(wNumSrcCG);
|
||||
void scg_cut(int wNumDstCG, int wNumSrcCG, int wX, int wY, int wWidth, int wHeight) {
|
||||
SPCG_ASSERT_NO(wNumDstCG);
|
||||
SPCG_ASSERT_NO(wNumSrcCG);
|
||||
|
||||
cginfo_t *src = scg_get(wNumSrcCG);
|
||||
if (!src)
|
||||
return NG;
|
||||
return;
|
||||
|
||||
surface_t *sf = src->sf->alpha
|
||||
? sf_create_surface(wWidth, wHeight, src->sf->depth)
|
||||
: sf_create_pixel(wWidth, wHeight, src->sf->depth);
|
||||
|
||||
if (src->sf->pixel)
|
||||
gr_copy(sf, 0, 0, src->sf, wX, wY, wWidth, wHeight);
|
||||
if (src->sf->alpha)
|
||||
gr_copy_alpha_map(sf, 0, 0, src->sf, wX, wY, wWidth, wHeight);
|
||||
SDL_Surface *sf = SDL_CreateRGBSurfaceWithFormat(0, wWidth, wHeight, src->sf->format->BitsPerPixel, src->sf->format->format);
|
||||
SDL_BlitSurface(src->sf, &(SDL_Rect){wX, wY, wWidth, wHeight}, sf, NULL);
|
||||
|
||||
scg_new(CG_SET, wNumDstCG, sf);
|
||||
return OK;
|
||||
}
|
||||
|
||||
// 元のCGの一部を切りぬいたCGを作成
|
||||
int scg_partcopy(int wNumDstCG, int wNumSrcCG, int wX, int wY, int wWidth, int wHeight) {
|
||||
spcg_assert_no(wNumDstCG);
|
||||
spcg_assert_no(wNumSrcCG);
|
||||
void scg_partcopy(int wNumDstCG, int wNumSrcCG, int wX, int wY, int wWidth, int wHeight) {
|
||||
SPCG_ASSERT_NO(wNumDstCG);
|
||||
SPCG_ASSERT_NO(wNumSrcCG);
|
||||
|
||||
cginfo_t *src = scg_get(wNumSrcCG);
|
||||
if (!src)
|
||||
return NG;
|
||||
return;
|
||||
|
||||
surface_t *sf;
|
||||
if (src->sf->alpha) {
|
||||
sf = sf_create_surface(src->sf->width, src->sf->height, src->sf->depth);
|
||||
gr_fill_alpha_map(sf, 0, 0, src->sf->width, src->sf->height, 255);
|
||||
} else {
|
||||
sf = sf_create_pixel(src->sf->width, src->sf->height, src->sf->depth);
|
||||
}
|
||||
|
||||
if (src->sf->pixel)
|
||||
gr_copy(sf, wX, wY, src->sf, wX, wY, wWidth, wHeight);
|
||||
if (src->sf->alpha)
|
||||
gr_copy_alpha_map(sf, wX, wY, src->sf, wX, wY, wWidth, wHeight);
|
||||
SDL_Surface *sf = SDL_CreateRGBSurfaceWithFormat(0, src->sf->w, src->sf->h, src->sf->format->BitsPerPixel, src->sf->format->format);
|
||||
SDL_FillRect(sf, NULL, SDL_MapRGBA(sf->format, 0, 0, 0, 255));
|
||||
SDL_BlitSurface(src->sf, &(SDL_Rect){wX, wY, wWidth, wHeight}, sf, &(SDL_Rect){wX, wY, wWidth, wHeight});
|
||||
|
||||
scg_new(CG_SET, wNumDstCG, sf);
|
||||
return OK;
|
||||
}
|
||||
|
||||
// 全てのCGの開放
|
||||
int scg_freeall() {
|
||||
void scg_freeall(void) {
|
||||
int i;
|
||||
|
||||
for (i = 1; i < CGMAX; i++) {
|
||||
scg_free(i);
|
||||
}
|
||||
return OK;
|
||||
}
|
||||
|
||||
/**
|
||||
* 指定の番号の CG をオブジェクトリストから消し、オブジェクトがどこからも参照
|
||||
* されていない(参照数が0の)場合のみ、オブジェクトを削除
|
||||
*/
|
||||
int scg_free(int no) {
|
||||
spcg_assert_no(no);
|
||||
void scg_free(int no) {
|
||||
SPCG_ASSERT_NO(no);
|
||||
|
||||
cginfo_t *cg = sact.cg[no];
|
||||
if (!cg) return NG;
|
||||
if (!cg) return;
|
||||
|
||||
scg_deref(cg);
|
||||
sact.cg[no] = NULL;
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
// CGの種類を取得
|
||||
int scg_querytype(int wNumCG, int *ret) {
|
||||
if (wNumCG >= (CGMAX -1)) goto errexit;
|
||||
if (sact.cg[wNumCG] == NULL) goto errexit;
|
||||
|
||||
*ret = sact.cg[wNumCG]->type;
|
||||
|
||||
return OK;
|
||||
|
||||
errexit:
|
||||
*ret = CG_NOTUSED;
|
||||
return NG;
|
||||
int scg_querytype(int wNumCG) {
|
||||
if (wNumCG >= (CGMAX -1)) return CG_NOTUSED;
|
||||
if (sact.cg[wNumCG] == NULL) return CG_NOTUSED;
|
||||
return sact.cg[wNumCG]->type;
|
||||
}
|
||||
|
||||
// CGの大きさを取得
|
||||
int scg_querysize(int wNumCG, int *w, int *h) {
|
||||
bool scg_querysize(int wNumCG, int *w, int *h) {
|
||||
if (wNumCG >= (CGMAX -1)) goto errexit;
|
||||
if (sact.cg[wNumCG] == NULL) goto errexit;
|
||||
if (sact.cg[wNumCG]->sf == NULL) goto errexit;
|
||||
|
||||
*w = sact.cg[wNumCG]->sf->width;
|
||||
*h = sact.cg[wNumCG]->sf->height;
|
||||
*w = sact.cg[wNumCG]->sf->w;
|
||||
*h = sact.cg[wNumCG]->sf->h;
|
||||
|
||||
return OK;
|
||||
return true;
|
||||
|
||||
errexit:
|
||||
*w = *h = 0;
|
||||
return NG;
|
||||
return false;
|
||||
}
|
||||
|
||||
// CGのBPPを取得
|
||||
int scg_querybpp(int wNumCG, int *ret) {
|
||||
if (wNumCG >= (CGMAX -1)) goto errexit;
|
||||
if (sact.cg[wNumCG] == NULL) goto errexit;
|
||||
if (sact.cg[wNumCG]->sf == NULL) goto errexit;
|
||||
|
||||
*ret = sact.cg[wNumCG]->sf->depth;
|
||||
|
||||
return OK;
|
||||
|
||||
errexit:
|
||||
*ret = 0;
|
||||
return NG;
|
||||
int scg_querybpp(int wNumCG) {
|
||||
if (wNumCG >= (CGMAX -1)) return 0;
|
||||
if (sact.cg[wNumCG] == NULL) return 0;
|
||||
if (sact.cg[wNumCG]->sf == NULL) return 0;
|
||||
return sact.cg[wNumCG]->sf->format->BitsPerPixel;
|
||||
}
|
||||
|
||||
// CGの alphamap が存在するかを取得
|
||||
int scg_existalphamap(int wNumCG, int *ret) {
|
||||
if (wNumCG >= (CGMAX -1)) goto errexit;
|
||||
if (sact.cg[wNumCG] == NULL) goto errexit;
|
||||
if (sact.cg[wNumCG]->sf == NULL) goto errexit;
|
||||
|
||||
*ret = sact.cg[wNumCG]->sf->alpha ? 1 : 0;
|
||||
|
||||
errexit:
|
||||
*ret = 0;
|
||||
return NG;
|
||||
bool scg_existalphamap(int wNumCG) {
|
||||
if (wNumCG >= (CGMAX -1)) return false;
|
||||
if (sact.cg[wNumCG] == NULL) return false;
|
||||
if (sact.cg[wNumCG]->sf == NULL) return false;
|
||||
return SDL_ISPIXELFORMAT_ALPHA(sact.cg[wNumCG]->sf->format->format);
|
||||
}
|
||||
|
||||
+17
-18
@@ -27,23 +27,22 @@
|
||||
#include "portab.h"
|
||||
#include "sact.h"
|
||||
|
||||
extern cginfo_t *scg_addref(int no);
|
||||
extern void scg_deref(cginfo_t *cg);
|
||||
extern int scg_create(int wNumCG, int wWidth, int wHeight, int wR, int wG, int wB, int wBlendRate);
|
||||
extern int scg_create_reverse(int NumCG, int wNumSrcCG, int wReverseX, int wReverseY);
|
||||
extern int scg_create_stretch(int wNumCG, int wWidth, int wHeight, int wNumSrcCG);
|
||||
extern int scg_create_blend(int wNumDstCG, int wNumBaseCG, int wX, int wY, int wNumBlendCG, int wAlphaMapMode);
|
||||
extern int scg_create_text(int wNumCG, int wSize, int wR, int wG, int wB, int wText);
|
||||
extern int scg_create_textnum(int wNumCG, int wSize, int wR, int wG, int wB, int wFigs, int wZeroPadding, int wValue);
|
||||
extern int scg_copy(int wNumDstCG, int wNumSrcCG);
|
||||
extern int scg_cut(int wNumDstCG, int wNumSrcCG, int wX, int wY, int wWidth, int wHeight);
|
||||
extern int scg_partcopy(int wNumDstCG, int wNumSrcCG, int wX, int wY, int wWidth, int wHeight);
|
||||
extern int scg_freeall();
|
||||
extern int scg_free(int cg);
|
||||
extern int scg_querytype(int wNumCG, int *ret);
|
||||
extern int scg_querysize(int wNumCG, int *w, int *h);
|
||||
extern int scg_querybpp(int wNumCG, int *ret);
|
||||
extern int scg_existalphamap(int wNumCG, int *ret);
|
||||
extern int scg_linkcgfree(int no);
|
||||
cginfo_t *scg_addref(int no);
|
||||
void scg_deref(cginfo_t *cg);
|
||||
void scg_create(int wNumCG, int wWidth, int wHeight, int wR, int wG, int wB, int wBlendRate);
|
||||
void scg_create_reverse(int NumCG, int wNumSrcCG, int wReverseX, int wReverseY);
|
||||
void scg_create_stretch(int wNumCG, int wWidth, int wHeight, int wNumSrcCG);
|
||||
void scg_create_blend(int wNumDstCG, int wNumBaseCG, int wX, int wY, int wNumBlendCG, int wAlphaMapMode);
|
||||
void scg_create_text(int wNumCG, int wSize, int wR, int wG, int wB, int wText);
|
||||
void scg_create_textnum(int wNumCG, int wSize, int wR, int wG, int wB, int wFigs, int wZeroPadding, int wValue);
|
||||
void scg_copy(int wNumDstCG, int wNumSrcCG);
|
||||
void scg_cut(int wNumDstCG, int wNumSrcCG, int wX, int wY, int wWidth, int wHeight);
|
||||
void scg_partcopy(int wNumDstCG, int wNumSrcCG, int wX, int wY, int wWidth, int wHeight);
|
||||
void scg_freeall(void);
|
||||
void scg_free(int cg);
|
||||
int scg_querytype(int wNumCG);
|
||||
bool scg_querysize(int wNumCG, int *w, int *h);
|
||||
int scg_querybpp(int wNumCG);
|
||||
bool scg_existalphamap(int wNumCG);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,31 +0,0 @@
|
||||
//
|
||||
static surface_t *blend(surface_t *base, int x, int y, surface_t *blend, int mode) {
|
||||
surface_t *dst = sf_create_surface(base->width, base->height, base->depth);
|
||||
|
||||
gr_copy(dst, 0, 0, base, 0, 0, base->width, base->height);
|
||||
|
||||
if (base->alpha) {
|
||||
// ベースに alpha map がある場合はそれをコピー
|
||||
gr_copy_alpha_map(dst, 0, 0, base, 0, 0, base->width, base->height);
|
||||
} else {
|
||||
// 無い場合は全て 255 の map を作成
|
||||
gr_fill_alpha_map(dst, 0, 0, base->width, base->height, 255);
|
||||
}
|
||||
|
||||
if (blend->alpha) {
|
||||
// 重ね合わせ先の alpha map があるときはそれを使う
|
||||
gre_BlendUseAMap(dst, x, y, base, x, y, blend, 0, 0, blend->width, blend->height, blend, 0, 0, 255);
|
||||
} else {
|
||||
// 無いときは dst の alpha map を使う
|
||||
gre_BlendUseAMap(dst, x, y, base, x, y, blend, 0, 0, blend->width, blend->height, dst, x, y, 255);
|
||||
}
|
||||
|
||||
// alpha 作成モードが dst + blend の時は飽和加算
|
||||
if (mode == 1) {
|
||||
gr_saturadd_alpha_map(dst, x, y, blend, 0, 0, blend->width, blend->height);
|
||||
}
|
||||
|
||||
return dst;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,114 +0,0 @@
|
||||
// 拡大縮小
|
||||
static surface_t *stretch(surface_t *src, int dw, int dh, int mirror) {
|
||||
surface_t *dst = calloc(1, sizeof(surface_t));
|
||||
float a1, a2, xd, yd;
|
||||
int sw, sh;
|
||||
int *row, *col;
|
||||
int x, y;
|
||||
uint8_t *sdata, *ddata;
|
||||
|
||||
dst->width = dw;
|
||||
dst->height = dh;
|
||||
dst->depth = src->depth;
|
||||
dst->bytes_per_line = dw * src->bytes_per_pixel;
|
||||
dst->bytes_per_pixel = src->bytes_per_pixel;
|
||||
|
||||
if (src->pixel) {
|
||||
dst->pixel = malloc(dh * dst->bytes_per_line);
|
||||
}
|
||||
if (src->alpha) {
|
||||
dst->alpha = malloc(dw * dh);
|
||||
}
|
||||
|
||||
|
||||
sdata = GETOFFSET_PIXEL(src, 0, 0);
|
||||
ddata = GETOFFSET_PIXEL(dst, 0, 0);
|
||||
sw = src->width;
|
||||
sh = src->height;
|
||||
|
||||
a1 = (float)sw / (float)dw;
|
||||
a2 = (float)sh / (float)dh;
|
||||
row = malloc(sizeof(int) * dw);
|
||||
// 1おおきくして初期化しないと col[dw-1]とcol[dw]が同じになる
|
||||
// 可能性がある。
|
||||
col = calloc(dh +1, sizeof(int));
|
||||
|
||||
if (mirror & 1) {
|
||||
/* 上下反転 added by tajiri@wizard */
|
||||
for (yd = sh - a2, y = 0; y < dh; y++) {
|
||||
col[y] = yd; yd -= a2;
|
||||
}
|
||||
} else {
|
||||
for (yd = 0.0, y = 0; y < dh; y++) {
|
||||
col[y] = yd; yd += a2;
|
||||
}
|
||||
}
|
||||
if (mirror & 2) {
|
||||
/* 左右反転 added by tajiri@wizard */
|
||||
for (xd = sw - a1, x = 0; x < dw; x++) {
|
||||
row[x] = xd; xd -= a1;
|
||||
}
|
||||
} else {
|
||||
for (xd = 0.0, x = 0; x < dw; x++) {
|
||||
row[x] = xd; xd += a1;
|
||||
}
|
||||
}
|
||||
|
||||
#define SCALEDCOPYAREA(type) { \
|
||||
int x, y; \
|
||||
type *sl, *dl; \
|
||||
uint8_t *_sl, *_dl; \
|
||||
for (y = 0; y < dh; y++) { \
|
||||
sl = (type *)(sdata + *(y + col) * src->bytes_per_line);\
|
||||
dl = (type *)(ddata + y * dst->bytes_per_line);\
|
||||
for (x = 0; x < dw; x++) { \
|
||||
*(dl + x) = *(sl + *(row + x)); \
|
||||
} \
|
||||
_dl = (uint8_t *)dl; \
|
||||
while (y < dh - 1 && *(col + y) == *(col + y + 1)) { \
|
||||
_sl = _dl; \
|
||||
_dl += dst->bytes_per_line; \
|
||||
memcpy(_dl, _sl, dw * sizeof(type)); \
|
||||
y++; \
|
||||
} \
|
||||
}}
|
||||
|
||||
switch(dst->depth) {
|
||||
case 8:
|
||||
SCALEDCOPYAREA(uint8_t); break;
|
||||
case 16:
|
||||
SCALEDCOPYAREA(uint16_t); break;
|
||||
case 24:
|
||||
case 32:
|
||||
SCALEDCOPYAREA(uint32_t); break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (src->alpha) {
|
||||
int x, y;
|
||||
uint8_t *sl, *dl;
|
||||
uint8_t *_sl, *_dl;
|
||||
sdata = GETOFFSET_ALPHA(src, 0, 0);
|
||||
ddata = GETOFFSET_ALPHA(dst, 0, 0);
|
||||
for (y = 0; y < dh; y++) {
|
||||
sl = (uint8_t *)(sdata + *(y + col) * src->width);
|
||||
dl = (uint8_t *)(ddata + y * dst->width);
|
||||
for (x = 0; x < dw; x++) {
|
||||
*(dl + x) = *(sl + *(row + x));
|
||||
}
|
||||
_dl = (uint8_t *)dl;
|
||||
while (y < dh - 1 && *(col + y) == *(col + y + 1)) {
|
||||
_sl = _dl;
|
||||
_dl += dst->width;
|
||||
memcpy(_dl, _sl, dw);
|
||||
y++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
free(row);
|
||||
free(col);
|
||||
|
||||
return dst;
|
||||
}
|
||||
@@ -25,13 +25,12 @@
|
||||
#include "portab.h"
|
||||
|
||||
// グラフ用チャート作成
|
||||
int schart_pos(int *pos, int pos1, int pos2, int val1, int val2, int val) {
|
||||
void schart_pos(int *pos, int pos1, int pos2, int val1, int val2, int val) {
|
||||
if (val1 == val2) {
|
||||
*pos = 0;
|
||||
} else {
|
||||
*pos = (((pos2 - pos1) * (val - val1)) / (val2 - val1)) + pos1;
|
||||
}
|
||||
return OK;
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -24,6 +24,6 @@
|
||||
#ifndef __SACTCHART_H__
|
||||
#define __SACTCHART_H__
|
||||
|
||||
extern int schart_pos(int *pos, int pos1, int pos2, int val1, int val2, int val);
|
||||
void schart_pos(int *pos, int pos1, int pos2, int val1, int val2, int val);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -31,23 +31,19 @@
|
||||
適当でいいとおもう
|
||||
*/
|
||||
|
||||
int scryp_encrypt_word(int *array, int num, int key) {
|
||||
void scryp_encrypt_word(int *array, int num, int key) {
|
||||
WARNING("NOT IMPLEMENTED");
|
||||
return OK;
|
||||
}
|
||||
|
||||
int scryp_decrypt_word(int *array, int num, int key) {
|
||||
void scryp_decrypt_word(int *array, int num, int key) {
|
||||
WARNING("NOT IMPLEMENTED");
|
||||
return OK;
|
||||
}
|
||||
|
||||
int scryp_encrypt_str(int strno, int key) {
|
||||
void scryp_encrypt_str(int strno, int key) {
|
||||
WARNING("NOT IMPLEMENTED");
|
||||
return OK;
|
||||
}
|
||||
|
||||
int scryp_decrypt_str(int strno, int key) {
|
||||
void scryp_decrypt_str(int strno, int key) {
|
||||
WARNING("str = '%s'", svar_get(strno));
|
||||
WARNING("NOT IMPLEMENTED");
|
||||
return OK;
|
||||
}
|
||||
|
||||
@@ -24,9 +24,9 @@
|
||||
#ifndef __SACTCRYPT_H__
|
||||
#define __SACTCRYPT_H__
|
||||
|
||||
extern int scryp_encrypt_word(int *array, int num, int key);
|
||||
extern int scryp_decrypt_word(int *array, int num, int key);
|
||||
extern int scryp_encrypt_str(int strno, int key);
|
||||
extern int scryp_decrypt_str(int strno, int key);
|
||||
void scryp_encrypt_word(int *array, int num, int key);
|
||||
void scryp_decrypt_word(int *array, int num, int key);
|
||||
void scryp_encrypt_str(int strno, int key);
|
||||
void scryp_decrypt_str(int strno, int key);
|
||||
|
||||
#endif
|
||||
|
||||
+28
-34
@@ -26,6 +26,7 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <SDL.h>
|
||||
|
||||
#include "portab.h"
|
||||
#include "system.h"
|
||||
@@ -35,7 +36,6 @@
|
||||
#include "nact.h"
|
||||
#include "sact.h"
|
||||
#include "sprite.h"
|
||||
#include "ngraph.h"
|
||||
#include "drawtext.h"
|
||||
#include "utfsjis.h"
|
||||
|
||||
@@ -58,10 +58,9 @@ static const char *logmsg_utf8[LOGMSG_LINES] = {
|
||||
|
||||
#define FONTSIZEINDEX 10
|
||||
#define FONTSIZE 20
|
||||
#define LOGLINENUM (sf0->height / FONTSIZE)
|
||||
#define LOGLINENUM (main_surface->h / FONTSIZE)
|
||||
static int curline;
|
||||
static surface_t *back;
|
||||
static surface_t *chr;
|
||||
static SDL_Surface *back;
|
||||
|
||||
static void draw_log() {
|
||||
int i, y = 0, len;
|
||||
@@ -69,14 +68,20 @@ static void draw_log() {
|
||||
char pinfo[256];
|
||||
List *node;
|
||||
|
||||
// canvas clear
|
||||
memset(chr->pixel, 0, chr->bytes_per_line * chr->height);
|
||||
|
||||
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);
|
||||
SDL_SetSurfaceAlphaMod(hline, 128);
|
||||
|
||||
SDL_SetSurfaceColorMod(back, 128, 128, 128);
|
||||
SDL_BlitSurface(back, NULL, main_surface, NULL);
|
||||
SDL_SetSurfaceColorMod(back, 255, 255, 255);
|
||||
|
||||
// ページ位置情報
|
||||
len = snprintf(pinfo, sizeof(pinfo) -1, "%d/%d", curline, list_length(sact.log));
|
||||
|
||||
dt_setfont(FONT_GOTHIC, FONTSIZEINDEX);
|
||||
dt_drawtext(chr, sf0->width - FONTSIZEINDEX *len /2, 0, pinfo);
|
||||
dt_drawtext_col(main_surface, main_surface->w - FONTSIZEINDEX *len /2, 0, pinfo, 255, 255, 255);
|
||||
|
||||
// 表示始め位置
|
||||
node = list_nth(sact.log, list_length(sact.log) - curline);
|
||||
@@ -85,31 +90,28 @@ static void draw_log() {
|
||||
|
||||
char *str = (char *)(node->data);
|
||||
if (0 == strcmp(str, "\n")) {
|
||||
gr_fill(chr, 0, y + FONTSIZE/2, sf0->width, 3, 128, 0, 0);
|
||||
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);
|
||||
} else {
|
||||
dt_setfont(FONT_GOTHIC, FONTSIZE);
|
||||
}
|
||||
dt_drawtext(chr, 0, y, str);
|
||||
dt_drawtext_col(main_surface, 0, y, str, 255, 255, 255);
|
||||
}
|
||||
y += FONTSIZE;
|
||||
cur--;
|
||||
node = list_next(node);
|
||||
}
|
||||
|
||||
gr_copy_bright(sf0, 0, 0, back, 0, 0, sf0->width, sf0->height, 128);
|
||||
gr_expandcolor_blend(sf0, 0, 0, chr, 0, 0, sf0->width, sf0->height,
|
||||
255, 255, 255);
|
||||
|
||||
ags_updateFull();
|
||||
}
|
||||
|
||||
|
||||
|
||||
int sblog_start(void) {
|
||||
bool sblog_start(void) {
|
||||
if (sact.version < 120)
|
||||
return NG;
|
||||
return false;
|
||||
|
||||
static char *logmsg[LOGMSG_LINES];
|
||||
if (!logmsg[0]) {
|
||||
@@ -121,52 +123,44 @@ int sblog_start(void) {
|
||||
for (int i = 0; i < LOGMSG_LINES; i++)
|
||||
sact.log = list_append(sact.log, logmsg[i]);
|
||||
|
||||
back = sf_dup(sf0);
|
||||
chr = sf_create_surface(sf0->width, sf0->height, 8);
|
||||
back = SDL_ConvertSurface(main_surface, main_surface->format, 0);
|
||||
curline = 6;
|
||||
draw_log();
|
||||
return OK;
|
||||
return true;
|
||||
}
|
||||
|
||||
int sblog_end(void) {
|
||||
void sblog_end(void) {
|
||||
List *node;
|
||||
int i;
|
||||
|
||||
sf_copyall(sf0, back);
|
||||
SDL_BlitSurface(back, NULL, main_surface, NULL);
|
||||
ags_updateFull();
|
||||
|
||||
sf_free(back);
|
||||
sf_free(chr);
|
||||
|
||||
SDL_FreeSurface(back);
|
||||
|
||||
// 説明文章を削除
|
||||
for (i = 0; i < LOGMSG_LINES; i++) {
|
||||
node = list_last(sact.log);
|
||||
sact.log = list_remove(sact.log, node->data);
|
||||
}
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
int sblog_pageup(void) {
|
||||
void sblog_pageup(void) {
|
||||
curline = min(list_length(sact.log), curline + (LOGLINENUM -1));
|
||||
draw_log();
|
||||
return OK;
|
||||
}
|
||||
|
||||
int sblog_pagedown(void) {
|
||||
void sblog_pagedown(void) {
|
||||
curline = max(1, curline - (LOGLINENUM -1));
|
||||
draw_log();
|
||||
return OK;
|
||||
}
|
||||
|
||||
int sblog_pagepre(void) {
|
||||
void sblog_pagepre(void) {
|
||||
curline = max(1, curline - 1);
|
||||
draw_log();
|
||||
return OK;
|
||||
}
|
||||
|
||||
int sblog_pagenext(void) {
|
||||
void sblog_pagenext(void) {
|
||||
curline = min(list_length(sact.log), curline + 1);
|
||||
draw_log();
|
||||
return OK;
|
||||
}
|
||||
|
||||
@@ -24,11 +24,11 @@
|
||||
#ifndef __SACTLOG_H__
|
||||
#define __SACTLOG_H__
|
||||
|
||||
extern int sblog_start(void);
|
||||
extern int sblog_end(void);
|
||||
extern int sblog_pageup(void);
|
||||
extern int sblog_pagedown(void);
|
||||
extern int sblog_pagepre(void);
|
||||
extern int sblog_pagenext(void);
|
||||
bool sblog_start(void);
|
||||
void sblog_end(void);
|
||||
void sblog_pageup(void);
|
||||
void sblog_pagedown(void);
|
||||
void sblog_pagepre(void);
|
||||
void sblog_pagenext(void);
|
||||
|
||||
#endif
|
||||
|
||||
+14
-28
@@ -64,27 +64,24 @@ static int slt_find(int no) {
|
||||
/*
|
||||
SACT 効果音 subsystem 初期化
|
||||
*/
|
||||
int ssnd_init() {
|
||||
void ssnd_init(void) {
|
||||
// ch 1-8 をキャッシュとして使おう
|
||||
cachei = 0;
|
||||
memset(cache, 0, sizeof(cache));
|
||||
return OK;
|
||||
}
|
||||
|
||||
// 指定の番号の効果音をメモリに読み込み
|
||||
int ssnd_prepare(int no) {
|
||||
void ssnd_prepare(int no) {
|
||||
int slot = slt_find(no);
|
||||
|
||||
if (slot == -1) {
|
||||
slot = slt_getnext(no);
|
||||
mus_wav_load(slot, no);
|
||||
}
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
// 指定の番号の効果音を再生
|
||||
int ssnd_play(int no) {
|
||||
void ssnd_play(int no) {
|
||||
int slot = slt_find(no);
|
||||
|
||||
if (slot == -1) {
|
||||
@@ -92,45 +89,40 @@ int ssnd_play(int no) {
|
||||
mus_wav_load(slot, no);
|
||||
}
|
||||
mus_wav_play(slot, 1);
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
// 指定の番号の効果音を再生停止
|
||||
int ssnd_stop(int no, int fadetime) {
|
||||
void ssnd_stop(int no, int fadetime) {
|
||||
int slot = slt_find(no);
|
||||
|
||||
if (slot != -1) {
|
||||
mus_wav_fadeout_start(slot, fadetime, 0, TRUE);
|
||||
mus_wav_fadeout_start(slot, fadetime, 0, true);
|
||||
cache[slot - SLOTOFFSET] = 0;
|
||||
}
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
// 指定の番号の効果音が再生終了するのを待つ
|
||||
int ssnd_wait(int no) {
|
||||
void ssnd_wait(int no) {
|
||||
int slot = slt_find(no);
|
||||
|
||||
if (slot != -1) {
|
||||
mus_wav_waitend(slot);
|
||||
cache[slot - SLOTOFFSET] = 0;
|
||||
}
|
||||
return OK;
|
||||
}
|
||||
|
||||
// 指定の効果音が終了するか、キーが押されるまで待つ
|
||||
int ssnd_waitkey(int no, int *res) {
|
||||
void ssnd_waitkey(int no, int *res) {
|
||||
int slot = slt_find(no);
|
||||
|
||||
if (slot == -1) {
|
||||
*res = 0;
|
||||
return OK;
|
||||
return;
|
||||
}
|
||||
|
||||
if (sact.waitskiplv > 1) {
|
||||
*res = SYS35KEY_RET;
|
||||
return OK;
|
||||
return;
|
||||
}
|
||||
|
||||
sact.waittype = KEYWAIT_SIMPLE;
|
||||
@@ -147,39 +139,33 @@ int ssnd_waitkey(int no, int *res) {
|
||||
*res = sact.waitkey;
|
||||
}
|
||||
sact.waittype = KEYWAIT_NONE;
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
// 左右チャンネルの反転した効果音をメモリに読み込む
|
||||
int ssnd_prepareLRrev(int no) {
|
||||
void ssnd_prepareLRrev(int no) {
|
||||
mus_wav_load_lrsw(30, no); // slot は 30固定でいい?
|
||||
return OK;
|
||||
}
|
||||
|
||||
// 左右チャンネルの反転した効果音を再生
|
||||
int ssnd_playLRrev(int no) {
|
||||
void ssnd_playLRrev(int no) {
|
||||
mus_wav_load_lrsw(30, no);
|
||||
mus_wav_play(30, 1);
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
// 指定の番号の効果音が存在するかどうかをチェック
|
||||
int ssnd_getlinknum(int no) {
|
||||
WARNING("NOT IMPLEMENTED");
|
||||
return OK;
|
||||
return 0;
|
||||
}
|
||||
|
||||
// すべての再生中の効果音が再生を終了するのを待つ
|
||||
int ssnd_stopall(int time) {
|
||||
void ssnd_stopall(int time) {
|
||||
int i;
|
||||
|
||||
for (i = 0; i < CACHEMAX; i++) {
|
||||
if (cache[i] > 0) {
|
||||
mus_wav_fadeout_start(i + SLOTOFFSET, time, 0, TRUE);
|
||||
mus_wav_fadeout_start(i + SLOTOFFSET, time, 0, true);
|
||||
cache[i] = 0;
|
||||
}
|
||||
}
|
||||
return OK;
|
||||
}
|
||||
|
||||
+10
-10
@@ -24,15 +24,15 @@
|
||||
#ifndef __SACTSOUND_H__
|
||||
#define __SACTSOUND_H__
|
||||
|
||||
extern int ssnd_init();
|
||||
extern int ssnd_play(int no);
|
||||
extern int ssnd_stop(int no, int fadetime);
|
||||
extern int ssnd_wait(int no);
|
||||
extern int ssnd_waitkey(int no, int *res);
|
||||
extern int ssnd_prepare(int no);
|
||||
extern int ssnd_prepareLRrev(int no);
|
||||
extern int ssnd_playLRrev(int no);
|
||||
extern int ssnd_getlinknum(int no);
|
||||
extern int ssnd_stopall(int time);
|
||||
void ssnd_init(void);
|
||||
void ssnd_play(int no);
|
||||
void ssnd_stop(int no, int fadetime);
|
||||
void ssnd_wait(int no);
|
||||
void ssnd_waitkey(int no, int *res);
|
||||
void ssnd_prepare(int no);
|
||||
void ssnd_prepareLRrev(int no);
|
||||
void ssnd_playLRrev(int no);
|
||||
int ssnd_getlinknum(int no);
|
||||
void ssnd_stopall(int time);
|
||||
|
||||
#endif /* __SACTSOUND_H__ */
|
||||
|
||||
@@ -39,14 +39,13 @@ static int idxmax; // stack pointerの最大
|
||||
/**
|
||||
* 文字列変数スタックの初期化
|
||||
*/
|
||||
int sstr_init() {
|
||||
void sstr_init(void) {
|
||||
stack = malloc(sizeof(char *) * DEFSTACKSIZE);
|
||||
idx = 0;
|
||||
idxmax = DEFSTACKSIZE;
|
||||
return OK;
|
||||
}
|
||||
|
||||
int sstr_reset(void) {
|
||||
void sstr_reset(void) {
|
||||
for (int i = 0; i < idx; i++)
|
||||
free(stack[i]);
|
||||
idx = 0;
|
||||
@@ -61,35 +60,30 @@ int sstr_reset(void) {
|
||||
}
|
||||
slist_free(sact.strreplace);
|
||||
sact.strreplace = NULL;
|
||||
return OK;
|
||||
}
|
||||
|
||||
/**
|
||||
* 文字列変数スタックに文字列を積む
|
||||
* @param strno: シナリオ上での文字列変数番号
|
||||
*/
|
||||
int sstr_push(int strno) {
|
||||
void sstr_push(int strno) {
|
||||
if (idx >= idxmax) {
|
||||
stack = realloc(stack, sizeof(char *) * idx*2);
|
||||
idxmax = idx*2;
|
||||
}
|
||||
|
||||
stack[idx++] = strdup(svar_get(strno));
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
/**
|
||||
* 文字列変数スタックから文字列を取り出す
|
||||
* @param strno: スタックから戻した文字列を格納する文字列変数番号
|
||||
*/
|
||||
int sstr_pop(int strno) {
|
||||
if (idx == 0) return NG;
|
||||
void sstr_pop(int strno) {
|
||||
if (idx == 0) return;
|
||||
|
||||
svar_set(strno, stack[--idx]);
|
||||
free(stack[idx]);
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -97,22 +91,21 @@ int sstr_pop(int strno) {
|
||||
* @param sstrno: 変換元文字列変数番号
|
||||
* @param dstrno: 変換先文字列変数番号
|
||||
*/
|
||||
int sstr_regist_replace(int sstrno, int dstrno) {
|
||||
void sstr_regist_replace(int sstrno, int dstrno) {
|
||||
strexchange_t *ex;
|
||||
|
||||
if (sstrno == dstrno) return NG;
|
||||
if (sstrno == dstrno) return;
|
||||
|
||||
ex = malloc(sizeof(strexchange_t));
|
||||
ex->src = strdup(svar_get(sstrno));
|
||||
ex->dst = strdup(svar_get(dstrno));
|
||||
sact.strreplace = slist_append(sact.strreplace, ex);
|
||||
return OK;
|
||||
}
|
||||
|
||||
/**
|
||||
* 数値 -> 文字列化
|
||||
*/
|
||||
int sstr_num2str(int strno, int fig, int nzeropad, int num) {
|
||||
void sstr_num2str(int strno, int fig, int nzeropad, int num) {
|
||||
char s[256], ss[256];
|
||||
|
||||
if (nzeropad) {
|
||||
@@ -125,6 +118,4 @@ int sstr_num2str(int strno, int fig, int nzeropad, int num) {
|
||||
|
||||
sprintf(s, ss, num);
|
||||
svar_set(strno, s);
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
@@ -24,12 +24,12 @@
|
||||
#ifndef __SACTSTRING_H__
|
||||
#define __SACTSTRING_H__
|
||||
|
||||
extern int sstr_init();
|
||||
extern int sstr_reset(void);
|
||||
extern int sstr_push(int strno);
|
||||
extern int sstr_pop(int strno);
|
||||
extern int sstr_regist_replace(int sstrtno, int dstrno);
|
||||
extern int sstr_num2str(int strno, int fig, int nzeropad, int num);
|
||||
void sstr_init(void);
|
||||
void sstr_reset(void);
|
||||
void sstr_push(int strno);
|
||||
void sstr_pop(int strno);
|
||||
void sstr_regist_replace(int sstrtno, int dstrno);
|
||||
void sstr_num2str(int strno, int fig, int nzeropad, int num);
|
||||
|
||||
|
||||
#endif /* __SACTSTRING_H__ */
|
||||
|
||||
@@ -32,16 +32,14 @@
|
||||
/*
|
||||
sact timer subsystem 初期化
|
||||
*/
|
||||
int stimer_init() {
|
||||
void stimer_init(void) {
|
||||
stimer_reset(0, 0);
|
||||
return OK;
|
||||
}
|
||||
|
||||
// 指定IDのタイマーのリセット
|
||||
int stimer_reset(int id, int val) {
|
||||
void stimer_reset(int id, int val) {
|
||||
gettimeofday(&(sact.timer[id].tv_base), NULL);
|
||||
sact.timer[id].val = val;
|
||||
return OK;
|
||||
}
|
||||
|
||||
// 指定IDのタイマーの取得
|
||||
|
||||
@@ -34,8 +34,8 @@ struct _stimer {
|
||||
typedef struct _stimer stimer_t;
|
||||
|
||||
|
||||
extern int stimer_init();
|
||||
extern int stimer_reset(int id, int val);
|
||||
extern int stimer_get(int id);
|
||||
void stimer_init(void);
|
||||
void stimer_reset(int id, int val);
|
||||
int stimer_get(int id);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -33,8 +33,6 @@
|
||||
#include "ags.h"
|
||||
#include "input.h"
|
||||
#include "sact.h"
|
||||
#include "surface.h"
|
||||
#include "ngraph.h"
|
||||
#include "sprite.h"
|
||||
#include "sdl_core.h"
|
||||
#include "randMT.h"
|
||||
@@ -73,12 +71,12 @@ static void quake1(float curstep, int diam, int round, int *adjx, int *adjy) {
|
||||
@param wCount: 時間(1/100秒)
|
||||
@param nfKeyEnable: キー抜け (1で有効)
|
||||
*/
|
||||
int sp_quake_screen(int type, int p1, int p2, int time, int cancel) {
|
||||
void sp_quake_screen(int type, int p1, int p2, int time, int cancel) {
|
||||
int sttime, edtime, curtime;
|
||||
int key;
|
||||
entrypoint *cb[2] = {quake0, quake1};
|
||||
|
||||
if (type > 1) return OK;
|
||||
if (type > 1) return;
|
||||
|
||||
sttime = sdl_getTicks();
|
||||
edtime = time * 10 + sttime;
|
||||
@@ -86,16 +84,14 @@ int sp_quake_screen(int type, int p1, int p2, int time, int cancel) {
|
||||
int adjx, adjy;
|
||||
|
||||
cb[type]((float)(curtime - sttime)/(edtime - sttime), p1, p2, &adjx, &adjy);
|
||||
ags_setViewArea(adjx, adjy, sf0->width, sf0->height);
|
||||
ags_setViewArea(adjx, adjy, main_surface->w, main_surface->h);
|
||||
ags_updateFull();
|
||||
|
||||
key = sys_keywait(10, cancel ? KEYWAIT_CANCELABLE : KEYWAIT_NONCANCELABLE);
|
||||
if (cancel && key) break;
|
||||
}
|
||||
|
||||
ags_setViewArea(0, 0, sf0->width, sf0->height);
|
||||
ags_setViewArea(0, 0, main_surface->w, main_surface->h);
|
||||
ags_updateFull();
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
|
||||
+103
-181
@@ -26,33 +26,25 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <SDL.h>
|
||||
|
||||
#include "portab.h"
|
||||
#include "system.h"
|
||||
#include "list.h"
|
||||
#include "ngraph.h"
|
||||
#include "ags.h"
|
||||
#include "nact.h"
|
||||
#include "sact.h"
|
||||
#include "sprite.h"
|
||||
#include "surface.h"
|
||||
#include "sactcg.h"
|
||||
#include "sactsound.h"
|
||||
|
||||
static int compare_spriteno_smallfirst(const void *a, const void *b);
|
||||
|
||||
|
||||
#define sp_assert_no(no) do { \
|
||||
#define SP_ASSERT_NO(no) do { \
|
||||
if ((no) >= SPRITEMAX) { \
|
||||
WARNING("no is too large (should be %d < %d)", no, SPRITEMAX); \
|
||||
return NG; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define sp_assert_null(no) do { \
|
||||
if (sact.sp[no] == NULL) { \
|
||||
WARNING("sprite %d is NULL", no); \
|
||||
return NG; \
|
||||
return; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
@@ -72,27 +64,14 @@ static int compare_spriteno_smallfirst(const void *a, const void *b) {
|
||||
}
|
||||
|
||||
// デフォルトの壁紙update
|
||||
static int sp_draw_wall(sprite_t *sp) {
|
||||
int sx, sy, w, h;
|
||||
|
||||
sx = sact.updaterect.x;
|
||||
sy = sact.updaterect.y;
|
||||
w = sact.updaterect.w;
|
||||
h = sact.updaterect.h;
|
||||
gr_fill(sf0, sx, sy, w, h, 0, 0, 0);
|
||||
|
||||
SACT_DEBUG("do update no=%d, sx=%d, sy=%d, w=%d, h=%d",
|
||||
sp->no, sx, sy, w, h);
|
||||
|
||||
return OK;
|
||||
static void sp_draw_wall(sprite_t *sp) {
|
||||
SDL_FillRect(main_surface, &sact.updaterect, SDL_MapRGB(main_surface->format, 0, 0, 0));
|
||||
}
|
||||
|
||||
/**
|
||||
* sprite 関連の初期化
|
||||
* @param none
|
||||
* @return OK:成功, NG:失敗
|
||||
*/
|
||||
int sp_init() {
|
||||
void sp_init(void) {
|
||||
int i;
|
||||
|
||||
// DLL用メッセージ表示
|
||||
@@ -109,7 +88,7 @@ int sp_init() {
|
||||
sact.sp[i] = calloc(1, sizeof(sprite_t));
|
||||
sact.sp[i]->no = i;
|
||||
sact.sp[i]->type = SPRITE_NONE;
|
||||
sact.sp[i]->show = FALSE;
|
||||
sact.sp[i]->show = false;
|
||||
}
|
||||
|
||||
// 壁紙(スプライト番号0)はデフォルトへ
|
||||
@@ -117,15 +96,12 @@ int sp_init() {
|
||||
|
||||
// 壁紙を updateリストに追加
|
||||
sact.updatelist = slist_append(sact.updatelist, sact.sp[0]);
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
int sp_reset(void) {
|
||||
void sp_reset(void) {
|
||||
sp_clear_zkey_hidesprite_all();
|
||||
sp_clear_quakesprite_all();
|
||||
sp_free_all();
|
||||
return OK;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -136,10 +112,10 @@ int sp_reset(void) {
|
||||
* @param cg3: 3枚目のCG (ない場合は0)
|
||||
* @param type: スプライトの種類
|
||||
*/
|
||||
int sp_new(int no, int cg1, int cg2, int cg3, int type) {
|
||||
void sp_new(int no, int cg1, int cg2, int cg3, int type) {
|
||||
sprite_t *sp;
|
||||
|
||||
sp_assert_no(no);
|
||||
SP_ASSERT_NO(no);
|
||||
|
||||
sp = sact.sp[no];
|
||||
|
||||
@@ -161,7 +137,7 @@ int sp_new(int no, int cg1, int cg2, int cg3, int type) {
|
||||
//初期のcurcgはcg1
|
||||
sp->curcg = sp->cg1;
|
||||
|
||||
sp->show = TRUE; // 初期状態は表示
|
||||
sp->show = true; // 初期状態は表示
|
||||
sp->blendrate = 255; // ブレンド無し
|
||||
sp->loc.x = 0; // 初期表示位置は(0,0)
|
||||
sp->loc.y = 0;
|
||||
@@ -172,8 +148,8 @@ int sp_new(int no, int cg1, int cg2, int cg3, int type) {
|
||||
sp->cursize.width = 0;
|
||||
sp->cursize.height = 0;
|
||||
} else {
|
||||
sp->cursize.width = sp->curcg->sf->width;
|
||||
sp->cursize.height = sp->curcg->sf->height;
|
||||
sp->cursize.width = sp->curcg->sf->w;
|
||||
sp->cursize.height = sp->curcg->sf->h;
|
||||
}
|
||||
|
||||
sp->freezed_state = 0; // 状態固定は無し
|
||||
@@ -199,15 +175,13 @@ int sp_new(int no, int cg1, int cg2, int cg3, int type) {
|
||||
sp_anime_setup(sp);
|
||||
break;
|
||||
}
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
// メッセージスプライトの作成
|
||||
int sp_new_msg(int no, int x, int y, int width, int height) {
|
||||
void sp_new_msg(int no, int x, int y, int width, int height) {
|
||||
sprite_t *sp;
|
||||
|
||||
sp_assert_no(no);
|
||||
SP_ASSERT_NO(no);
|
||||
|
||||
sp = sact.sp[no];
|
||||
|
||||
@@ -220,7 +194,7 @@ int sp_new_msg(int no, int x, int y, int width, int height) {
|
||||
|
||||
sp->type = SPRITE_MSG;
|
||||
sp->no = no;
|
||||
sp->show = TRUE; // 初期状態は表示
|
||||
sp->show = true; // 初期状態は表示
|
||||
sp->blendrate = 255; // ブレンド無し
|
||||
sp->freezed_state = 0; // 状態固定無し
|
||||
sp->loc.x = x - sact.origin.x; // 初期表示位置
|
||||
@@ -231,18 +205,16 @@ int sp_new_msg(int no, int x, int y, int width, int height) {
|
||||
sp->cursize.height = height;
|
||||
sp->cur = sp->loc;
|
||||
sp->u.msg.buf = NULL;
|
||||
|
||||
// 文字描画用キャンバス
|
||||
sp->u.msg.canvas = sf_create_surface(width, height, sf0->depth);
|
||||
|
||||
|
||||
// canvas for drawing text
|
||||
sp->u.msg.canvas = SDL_CreateRGBSurfaceWithFormat(0, width, height, 32, SDL_PIXELFORMAT_ARGB8888);
|
||||
|
||||
// スプライト再描画用コールバック
|
||||
sp->update = smsg_update;
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
// 壁紙の設定
|
||||
int sp_set_wall_paper(int no) {
|
||||
void sp_set_wall_paper(int no) {
|
||||
sprite_t *sp = sact.sp[0];
|
||||
|
||||
if (sp->curcg)
|
||||
@@ -252,38 +224,35 @@ int sp_set_wall_paper(int no) {
|
||||
|
||||
if (sp->curcg) { // display specified CG
|
||||
sp->update = DEFAULT_UPDATE;
|
||||
sp->cursize.width = sp->curcg->sf->width;
|
||||
sp->cursize.height = sp->curcg->sf->height;
|
||||
sp->cursize.width = sp->curcg->sf->w;
|
||||
sp->cursize.height = sp->curcg->sf->h;
|
||||
} else { // Black
|
||||
sp->cursize.height = sf0->height;
|
||||
sp->cursize.height = main_surface->h;
|
||||
sp->curcg = NULL;
|
||||
sp->update = sp_draw_wall;
|
||||
}
|
||||
|
||||
sp->type = SPRITE_WP;
|
||||
sp->show = TRUE;
|
||||
sp->show = true;
|
||||
sp->blendrate = 255;
|
||||
sp->cur.x = 0;
|
||||
sp->cur.y = 0;
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
// 全ての sprite を消去
|
||||
int sp_free_all() {
|
||||
void sp_free_all(void) {
|
||||
int i;
|
||||
|
||||
for (i = 1; i < SPRITEMAX; i++) {
|
||||
sp_free(i);
|
||||
}
|
||||
return OK;
|
||||
}
|
||||
|
||||
// 指定のsprite を消去
|
||||
int sp_free(int no) {
|
||||
void sp_free(int no) {
|
||||
sprite_t *sp;
|
||||
|
||||
sp_assert_no(no);
|
||||
SP_ASSERT_NO(no);
|
||||
|
||||
sp = sact.sp[no];
|
||||
|
||||
@@ -310,7 +279,7 @@ int sp_free(int no) {
|
||||
|
||||
if (sp->type == SPRITE_MSG) {
|
||||
slist_free(sp->u.msg.buf);
|
||||
sf_free(sp->u.msg.canvas);
|
||||
SDL_FreeSurface(sp->u.msg.canvas);
|
||||
}
|
||||
sact.updatelist = slist_remove(sact.updatelist, sp);
|
||||
|
||||
@@ -321,50 +290,46 @@ int sp_free(int no) {
|
||||
memset(sp, 0, sizeof(sprite_t));
|
||||
sp->type = SPRITE_NONE;
|
||||
sp->no = no;
|
||||
sp->show = FALSE;
|
||||
sp->show = false;
|
||||
memcpy(&(sp->numeral), &(back.numeral), sizeof(sp->numeral));
|
||||
}
|
||||
return OK;
|
||||
}
|
||||
|
||||
// 表示状態の変更
|
||||
int sp_set_show(int wNum, int wCount, int sShow) {
|
||||
void sp_set_show(int wNum, int wCount, int sShow) {
|
||||
int i;
|
||||
boolean oldstate;
|
||||
bool oldstate;
|
||||
sprite_t *sp;
|
||||
|
||||
sp_assert_no(wNum);
|
||||
SP_ASSERT_NO(wNum);
|
||||
|
||||
for (i = wNum; i < (wNum + wCount); i++) {
|
||||
if (i >= (SPRITEMAX -1)) break;
|
||||
sp = sact.sp[i];
|
||||
oldstate = sp->show;
|
||||
|
||||
sp->show = (sShow == 1 ? TRUE : FALSE);
|
||||
sp->show = sShow == 1;
|
||||
}
|
||||
return OK;
|
||||
}
|
||||
|
||||
// 表示位置の設定
|
||||
int sp_set_pos(int wNum, int wX, int wY) {
|
||||
void sp_set_pos(int wNum, int wX, int wY) {
|
||||
sprite_t *sp;
|
||||
|
||||
sp_assert_no(wNum);
|
||||
SP_ASSERT_NO(wNum);
|
||||
|
||||
sp = sact.sp[wNum];
|
||||
sp->loc.x = wX - sact.origin.x;
|
||||
sp->loc.y = wY - sact.origin.y;
|
||||
sp->cur.x = sp->loc.x;
|
||||
sp->cur.y = sp->loc.y;
|
||||
return OK;
|
||||
|
||||
}
|
||||
|
||||
// スプライトの移動
|
||||
int sp_set_move(int wNum, int wX, int wY) {
|
||||
void sp_set_move(int wNum, int wX, int wY) {
|
||||
sprite_t *sp;
|
||||
|
||||
sp_assert_no(wNum);
|
||||
SP_ASSERT_NO(wNum);
|
||||
|
||||
sp = sact.sp[wNum];
|
||||
sp->move.to.x = wX - sact.origin.x;
|
||||
@@ -378,59 +343,52 @@ int sp_set_move(int wNum, int wX, int wY) {
|
||||
// moveするスプライトリストに登録
|
||||
// 実際に move を開始するのは ~SP_DRAW(sp_update_all)が呼ばれたとき
|
||||
sact.movelist = slist_append(sact.movelist, sp);
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
// スプライト移動時間の設定
|
||||
int sp_set_movetime(int wNum, int wTime) {
|
||||
sp_assert_no(wNum);
|
||||
void sp_set_movetime(int wNum, int wTime) {
|
||||
SP_ASSERT_NO(wNum);
|
||||
|
||||
sact.sp[wNum]->move.time = wTime * 10;
|
||||
sact.sp[wNum]->move.speed = 0;
|
||||
return OK;
|
||||
}
|
||||
|
||||
// スプライト移動速度の設定
|
||||
int sp_set_movespeed(int wNum, int wSpeed) {
|
||||
sp_assert_no(wNum);
|
||||
void sp_set_movespeed(int wNum, int wSpeed) {
|
||||
SP_ASSERT_NO(wNum);
|
||||
|
||||
if (wSpeed == 0) wSpeed = 1;
|
||||
|
||||
sact.sp[wNum]->move.speed = wSpeed;
|
||||
sact.sp[wNum]->move.time = 0;
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
// Zキーを押したときに隠すスプライトの登録
|
||||
int sp_add_zkey_hidesprite(int wNum) {
|
||||
void sp_add_zkey_hidesprite(int wNum) {
|
||||
sprite_t *sp;
|
||||
|
||||
sp_assert_no(wNum);
|
||||
SP_ASSERT_NO(wNum);
|
||||
sp = sact.sp[wNum];
|
||||
|
||||
// 登録時点でまだ生成していないスプライトは隠さない
|
||||
// シェルクレイルでまずいのがあったので中止
|
||||
// if (sp->type == SPRITE_NONE) return NG;
|
||||
// if (sp->type == SPRITE_NONE) return;
|
||||
|
||||
sact.sp_zhide = slist_append(sact.sp_zhide, sp);
|
||||
return OK;
|
||||
}
|
||||
|
||||
// 上で登録したスプライトの削除
|
||||
int sp_clear_zkey_hidesprite_all() {
|
||||
void sp_clear_zkey_hidesprite_all(void) {
|
||||
slist_free(sact.sp_zhide);
|
||||
sact.sp_zhide = NULL;
|
||||
return OK;
|
||||
}
|
||||
|
||||
// スプライト状態の固化
|
||||
int sp_freeze_sprite(int wNum, int wIndex) {
|
||||
void sp_freeze_sprite(int wNum, int wIndex) {
|
||||
sprite_t *sp;
|
||||
void *oldstate;
|
||||
|
||||
sp_assert_no(wNum);
|
||||
SP_ASSERT_NO(wNum);
|
||||
|
||||
sp = sact.sp[wNum];
|
||||
sp->freezed_state = wIndex;
|
||||
@@ -444,74 +402,60 @@ int sp_freeze_sprite(int wNum, int wIndex) {
|
||||
case 3:
|
||||
sp->curcg = sp->cg3; break;
|
||||
}
|
||||
return OK;
|
||||
}
|
||||
|
||||
// 上で固化した状態の解除
|
||||
int sp_thaw_sprite(int wNum) {
|
||||
sp_assert_no(wNum);
|
||||
void sp_thaw_sprite(int wNum) {
|
||||
SP_ASSERT_NO(wNum);
|
||||
|
||||
sact.sp[wNum]->freezed_state = 0;
|
||||
return OK;
|
||||
}
|
||||
|
||||
// SP_QUAKEで揺らすスプライトの登録
|
||||
int sp_add_quakesprite(int wNum) {
|
||||
sp_assert_no(wNum);
|
||||
void sp_add_quakesprite(int wNum) {
|
||||
SP_ASSERT_NO(wNum);
|
||||
|
||||
sact.sp_quake = slist_append(sact.sp_quake, sact.sp[wNum]);
|
||||
return OK;
|
||||
}
|
||||
|
||||
// 上で登録したスプライトの削除
|
||||
int sp_clear_quakesprite_all() {
|
||||
void sp_clear_quakesprite_all(void) {
|
||||
slist_free(sact.sp_quake);
|
||||
sact.sp_quake = NULL;
|
||||
return OK;
|
||||
}
|
||||
|
||||
// アニメーションスプライトの間隔の設定
|
||||
int sp_set_animeinterval(int wNum, int wTime) {
|
||||
sp_assert_no(wNum);
|
||||
void sp_set_animeinterval(int wNum, int wTime) {
|
||||
SP_ASSERT_NO(wNum);
|
||||
|
||||
if (sact.sp[wNum]->type != SPRITE_ANIME) return NG;
|
||||
if (sact.sp[wNum]->type != SPRITE_ANIME) return;
|
||||
|
||||
sact.sp[wNum]->u.anime.interval = wTime * 10;
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
// スプライトのブレンド率の設定
|
||||
int sp_set_blendrate(int wNum, int wCount, int rate) {
|
||||
void sp_set_blendrate(int wNum, int wCount, int rate) {
|
||||
int i;
|
||||
sprite_t *sp;
|
||||
|
||||
sp_assert_no(wNum);
|
||||
SP_ASSERT_NO(wNum);
|
||||
|
||||
for (i = wNum; i < (wNum + wCount); i++) {
|
||||
if (i >= (SPRITEMAX -1)) break;
|
||||
sp = sact.sp[i];
|
||||
sp->blendrate = rate;
|
||||
}
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
// スプライトが create されているかどうかの取得
|
||||
int sp_query_isexist(int wNum, int *ret) {
|
||||
if (wNum >= SPRITEMAX) goto errexit;
|
||||
if (sact.sp[wNum]->type == SPRITE_NONE) goto errexit;
|
||||
|
||||
*ret = 1;
|
||||
return OK;
|
||||
|
||||
errexit:
|
||||
*ret = 0;
|
||||
return NG;
|
||||
bool sp_exists(int wNum) {
|
||||
if (wNum >= SPRITEMAX) return false;
|
||||
if (sact.sp[wNum]->type == SPRITE_NONE) return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
// スプライトのタイプと何番のCGがセットされているかの取得
|
||||
int sp_query_info(int wNum, int *vtype, int *vcg1, int *vcg2, int *vcg3) {
|
||||
bool sp_query_info(int wNum, int *vtype, int *vcg1, int *vcg2, int *vcg3) {
|
||||
sprite_t *sp;
|
||||
|
||||
if (wNum >= SPRITEMAX) goto errexit;
|
||||
@@ -524,46 +468,46 @@ int sp_query_info(int wNum, int *vtype, int *vcg1, int *vcg2, int *vcg3) {
|
||||
*vcg2 = sp->cg2 ? sp->cg2->no : 0;
|
||||
*vcg3 = sp->cg3 ? sp->cg3->no : 0;
|
||||
|
||||
return OK;
|
||||
return true;
|
||||
|
||||
errexit:
|
||||
*vtype = 0;
|
||||
*vcg1 = 0;
|
||||
*vcg2 = 0;
|
||||
*vcg3 = 0;
|
||||
return NG;
|
||||
return false;
|
||||
}
|
||||
|
||||
// スプライトの表示状態の取得
|
||||
int sp_query_show(int wNum, int *vShow) {
|
||||
bool sp_query_show(int wNum, int *vShow) {
|
||||
if (wNum >= SPRITEMAX) goto errexit;
|
||||
if (sact.sp[wNum]->type == SPRITE_NONE) goto errexit;
|
||||
|
||||
*vShow = sact.sp[wNum]->show ? 1: 0;
|
||||
return OK;
|
||||
return true;
|
||||
|
||||
errexit:
|
||||
*vShow = 0;
|
||||
return NG;
|
||||
return false;
|
||||
}
|
||||
|
||||
// スプライトの表示位置の取得
|
||||
int sp_query_pos(int wNum, int *vx, int *vy) {
|
||||
bool sp_query_pos(int wNum, int *vx, int *vy) {
|
||||
if (wNum >= SPRITEMAX) goto errexit;
|
||||
if (sact.sp[wNum]->type == SPRITE_NONE) goto errexit;
|
||||
|
||||
*vx = sact.sp[wNum]->loc.x;
|
||||
*vy = sact.sp[wNum]->loc.y;
|
||||
return OK;
|
||||
return true;
|
||||
|
||||
errexit:
|
||||
*vx = 0;
|
||||
*vy = 0;
|
||||
return NG;
|
||||
return false;
|
||||
}
|
||||
|
||||
// スプライトの大きさの取得
|
||||
int sp_query_size(int wNum, int *vw, int *vh) {
|
||||
bool sp_query_size(int wNum, int *vw, int *vh) {
|
||||
sprite_t *sp;
|
||||
|
||||
if (wNum >= SPRITEMAX) goto errexit;
|
||||
@@ -575,88 +519,76 @@ int sp_query_size(int wNum, int *vw, int *vh) {
|
||||
*vw = sp->cursize.width;
|
||||
*vh = sp->cursize.height;
|
||||
|
||||
return OK;
|
||||
return true;
|
||||
|
||||
errexit:
|
||||
*vw = 0;
|
||||
*vh = 0;
|
||||
return NG;
|
||||
return false;
|
||||
}
|
||||
|
||||
// テキストスプライトの現在の文字表示位置の取得
|
||||
int sp_query_textpos(int wNum, int *vx, int *vy) {
|
||||
bool sp_query_textpos(int wNum, int *vx, int *vy) {
|
||||
if (wNum >= SPRITEMAX) goto errexit;
|
||||
sprite_t *sp = sact.sp[wNum];
|
||||
if (sp->type != SPRITE_MSG) goto errexit;
|
||||
|
||||
*vx = sp->u.msg.dspcur.x + sp->loc.x;
|
||||
*vy = sp->u.msg.dspcur.y + sp->loc.y;
|
||||
return OK;
|
||||
return true;
|
||||
|
||||
errexit:
|
||||
*vx = 0;
|
||||
*vy = 0;
|
||||
return NG;
|
||||
return false;
|
||||
}
|
||||
|
||||
// NumeralXXXのCGのセット
|
||||
int sp_num_setcg(int nNum, int nIndex, int nCG) {
|
||||
sp_assert_no(nNum);
|
||||
void sp_num_setcg(int nNum, int nIndex, int nCG) {
|
||||
SP_ASSERT_NO(nNum);
|
||||
|
||||
sact.sp[nNum]->numeral.cg[nIndex] = nCG;
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
// NumeralXXXのCGの取得
|
||||
int sp_num_getcg(int nNum, int nIndex, int *vCG) {
|
||||
sp_assert_no(nNum);
|
||||
void sp_num_getcg(int nNum, int nIndex, int *vCG) {
|
||||
SP_ASSERT_NO(nNum);
|
||||
|
||||
*vCG = sact.sp[nNum]->numeral.cg[nIndex];
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
// NumeralXXXの位置のセット
|
||||
int sp_num_setpos(int nNum, int nX, int nY) {
|
||||
sp_assert_no(nNum);
|
||||
void sp_num_setpos(int nNum, int nX, int nY) {
|
||||
SP_ASSERT_NO(nNum);
|
||||
|
||||
sact.sp[nNum]->numeral.pos.x = nX;
|
||||
sact.sp[nNum]->numeral.pos.y = nY;
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
// NumeralXXXの位置の取得
|
||||
int sp_num_getpos(int nNum, int *vX, int *vY) {
|
||||
sp_assert_no(nNum);
|
||||
void sp_num_getpos(int nNum, int *vX, int *vY) {
|
||||
SP_ASSERT_NO(nNum);
|
||||
|
||||
*vX = sact.sp[nNum]->numeral.pos.x;
|
||||
*vY = sact.sp[nNum]->numeral.pos.y;
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
// NumeralXXXのスパンのセット
|
||||
int sp_num_setspan(int nNum, int nSpan) {
|
||||
sp_assert_no(nNum);
|
||||
void sp_num_setspan(int nNum, int nSpan) {
|
||||
SP_ASSERT_NO(nNum);
|
||||
|
||||
sact.sp[nNum]->numeral.span = nSpan;
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
// NumeralXXXのスパンの取得
|
||||
int sp_num_getspan(int nNum, int *vSpan) {
|
||||
sp_assert_no(nNum);
|
||||
void sp_num_getspan(int nNum, int *vSpan) {
|
||||
SP_ASSERT_NO(nNum);
|
||||
|
||||
*vSpan = sact.sp[nNum]->numeral.span;
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
// すべての説明スプライトの削除
|
||||
int sp_exp_clear() {
|
||||
void sp_exp_clear(void) {
|
||||
SList *node;
|
||||
|
||||
for (node = sact.updatelist; node; node = node->next) {
|
||||
@@ -664,75 +596,65 @@ int sp_exp_clear() {
|
||||
if (sp == NULL) continue;
|
||||
sp_exp_del(sp->no);
|
||||
}
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
// 説明スプライトの登録
|
||||
int sp_exp_add(int nNumSP1, int nNumSP2) {
|
||||
void sp_exp_add(int nNumSP1, int nNumSP2) {
|
||||
sprite_t *swsp, *expsp;
|
||||
sp_assert_no(nNumSP1);
|
||||
sp_assert_no(nNumSP2);
|
||||
SP_ASSERT_NO(nNumSP1);
|
||||
SP_ASSERT_NO(nNumSP2);
|
||||
|
||||
swsp = sact.sp[nNumSP1];
|
||||
expsp = sact.sp[nNumSP2];
|
||||
|
||||
swsp->expsp = slist_append(swsp->expsp, expsp);
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
// 説明スプライトの削除
|
||||
int sp_exp_del(int nNum) {
|
||||
void sp_exp_del(int nNum) {
|
||||
sprite_t *sp;
|
||||
|
||||
sp_assert_no(nNum);
|
||||
SP_ASSERT_NO(nNum);
|
||||
|
||||
sp = sact.sp[nNum];
|
||||
|
||||
slist_free(sp->expsp);
|
||||
sp->expsp = NULL;
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
// スプライトサウンドのセット
|
||||
int sp_sound_set(int wNumSP, int wNumWave1, int wNumWave2, int wNumWave3) {
|
||||
void sp_sound_set(int wNumSP, int wNumWave1, int wNumWave2, int wNumWave3) {
|
||||
sprite_t *sp;
|
||||
|
||||
sp_assert_no(wNumSP);
|
||||
SP_ASSERT_NO(wNumSP);
|
||||
|
||||
sp = sact.sp[wNumSP];
|
||||
sp->numsound1 = wNumWave1;
|
||||
sp->numsound2 = wNumWave2;
|
||||
sp->numsound3 = wNumWave3;
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
// すべてのスプライトサウンドの終了を待つ
|
||||
int sp_sound_wait() {
|
||||
void sp_sound_wait(void) {
|
||||
WARNING("NOT IMPLEMENTED");
|
||||
return OK;
|
||||
}
|
||||
|
||||
// 範囲外をクリックしたときのサウンドの設定
|
||||
int sp_sound_ob(int wNumWave) {
|
||||
void sp_sound_ob(int wNumWave) {
|
||||
sact.numsoundob = wNumWave;
|
||||
return OK;
|
||||
}
|
||||
|
||||
/**
|
||||
* 指定の座標が現在のスプライトの位置の範囲に入っているか?
|
||||
* @param sp: 調べる対象のスプライト
|
||||
* @param x,y: 座標
|
||||
* @return: TRUE:入っている, FALSE: 入っていない
|
||||
* @return: true:入っている, false: 入っていない
|
||||
*/
|
||||
boolean sp_is_insprite(sprite_t *sp, int x, int y) {
|
||||
bool sp_is_insprite(sprite_t *sp, int x, int y) {
|
||||
uint8_t *dp;
|
||||
|
||||
if (x < 0 || y < 0 || x >= sf0->width || y >= sf0->height) return FALSE;
|
||||
if (x < 0 || y < 0 || x >= main_surface->w || y >= main_surface->h) return false;
|
||||
|
||||
dp = GETOFFSET_PIXEL(sact.dmap, x, y);
|
||||
dp = PIXEL_AT(sact.dmap, x, y);
|
||||
return (*(uint16_t *)dp == sp->no);
|
||||
}
|
||||
|
||||
+81
-85
@@ -29,125 +29,121 @@
|
||||
#define DEFAULT_UPDATE sp_draw
|
||||
|
||||
// in sprite.c
|
||||
extern int sp_init();
|
||||
extern int sp_reset(void);
|
||||
extern int sp_new(int no, int cg1, int cg2, int cg3, int type);
|
||||
extern int sp_new_msg(int no, int x, int y, int width, int height);
|
||||
extern int sp_set_wall_paper(int no);
|
||||
extern int sp_free_all();
|
||||
extern int sp_free(int no);
|
||||
extern int sp_set_show(int no, int cnt, int flag);
|
||||
extern int sp_set_pos(int wNum, int wX, int wY);
|
||||
extern int sp_set_move(int wNum, int wX, int wY);
|
||||
extern int sp_set_movetime(int wNum, int wTime);
|
||||
extern int sp_set_movespeed(int wNum, int wTime);
|
||||
extern int sp_add_zkey_hidesprite(int wNum);
|
||||
extern int sp_clear_zkey_hidesprite_all();
|
||||
extern int sp_freeze_sprite(int wNum, int wIndex);
|
||||
extern int sp_thaw_sprite(int wNum);
|
||||
extern int sp_add_quakesprite(int wNum);
|
||||
extern int sp_clear_quakesprite_all();
|
||||
extern int sp_set_animeinterval(int wNum, int wTime);
|
||||
extern boolean sp_is_insprite(sprite_t *sp, int x, int y);
|
||||
extern int sp_set_blendrate(int wNum, int wCount, int rate);
|
||||
extern int sp_query_isexist(int wNum, int *ret);
|
||||
extern int sp_query_info(int wNum, int *vtype, int *vcg1, int *vcg2, int *vcg3);
|
||||
extern int sp_query_show(int wNum, int *vShow);
|
||||
extern int sp_query_pos(int wNum, int *vx, int *vy);
|
||||
extern int sp_query_size(int wNum, int *vw, int *vh);
|
||||
extern int sp_query_textpos(int wNum, int *vx, int *vy);
|
||||
extern int sp_num_setcg(int nNum, int nIndex, int nCG);
|
||||
extern int sp_num_getcg(int nNum, int nIndex, int *vCG);
|
||||
extern int sp_num_setpos(int nNum, int nX, int nY);
|
||||
extern int sp_num_getpos(int nNum, int *vX, int *vY);
|
||||
extern int sp_num_setspan(int nNum, int nSpan);
|
||||
extern int sp_num_getspan(int nNUm, int *vSpan);
|
||||
extern int sp_exp_clear();
|
||||
extern int sp_exp_add(int nNumSP1, int nNumSP2);
|
||||
extern int sp_exp_del(int wNum);
|
||||
extern int sp_sound_set(int wNumSP, int wNumWave1, int wNumWave2, int wNumWave3);
|
||||
extern int sp_sound_wait();
|
||||
extern int sp_sound_ob(int wNumWave);
|
||||
void sp_init(void);
|
||||
void sp_reset(void);
|
||||
void sp_new(int no, int cg1, int cg2, int cg3, int type);
|
||||
void sp_new_msg(int no, int x, int y, int width, int height);
|
||||
void sp_set_wall_paper(int no);
|
||||
void sp_free_all(void);
|
||||
void sp_free(int no);
|
||||
void sp_set_show(int no, int cnt, int flag);
|
||||
void sp_set_pos(int wNum, int wX, int wY);
|
||||
void sp_set_move(int wNum, int wX, int wY);
|
||||
void sp_set_movetime(int wNum, int wTime);
|
||||
void sp_set_movespeed(int wNum, int wTime);
|
||||
void sp_add_zkey_hidesprite(int wNum);
|
||||
void sp_clear_zkey_hidesprite_all(void);
|
||||
void sp_freeze_sprite(int wNum, int wIndex);
|
||||
void sp_thaw_sprite(int wNum);
|
||||
void sp_add_quakesprite(int wNum);
|
||||
void sp_clear_quakesprite_all(void);
|
||||
void sp_set_animeinterval(int wNum, int wTime);
|
||||
bool sp_is_insprite(sprite_t *sp, int x, int y);
|
||||
void sp_set_blendrate(int wNum, int wCount, int rate);
|
||||
bool sp_exists(int wNum);
|
||||
bool sp_query_info(int wNum, int *vtype, int *vcg1, int *vcg2, int *vcg3);
|
||||
bool sp_query_show(int wNum, int *vShow);
|
||||
bool sp_query_pos(int wNum, int *vx, int *vy);
|
||||
bool sp_query_size(int wNum, int *vw, int *vh);
|
||||
bool sp_query_textpos(int wNum, int *vx, int *vy);
|
||||
void sp_num_setcg(int nNum, int nIndex, int nCG);
|
||||
void sp_num_getcg(int nNum, int nIndex, int *vCG);
|
||||
void sp_num_setpos(int nNum, int nX, int nY);
|
||||
void sp_num_getpos(int nNum, int *vX, int *vY);
|
||||
void sp_num_setspan(int nNum, int nSpan);
|
||||
void sp_num_getspan(int nNUm, int *vSpan);
|
||||
void sp_exp_clear(void);
|
||||
void sp_exp_add(int nNumSP1, int nNumSP2);
|
||||
void sp_exp_del(int wNum);
|
||||
void sp_sound_set(int wNumSP, int wNumWave1, int wNumWave2, int wNumWave3);
|
||||
void sp_sound_wait(void);
|
||||
void sp_sound_ob(int wNumWave);
|
||||
|
||||
|
||||
// in sprite_update.c
|
||||
extern int sp_update_all(boolean syncscreen);
|
||||
extern int sp_update_clipped();
|
||||
extern int sp_updateme(sprite_t *sp);
|
||||
extern int sp_updateme_part(sprite_t *sp, int x, int y, int w, int h);
|
||||
void sp_update_all(bool syncscreen);
|
||||
void sp_update_clipped();
|
||||
void sp_updateme(sprite_t *sp);
|
||||
void sp_updateme_part(sprite_t *sp, int x, int y, int w, int h);
|
||||
|
||||
|
||||
// in sprite_draw.c
|
||||
extern int sp_draw(sprite_t *sf);
|
||||
extern int sp_draw2(sprite_t *sf, cginfo_t *cg);
|
||||
extern void sp_draw_dmap(void* data, void* userdata);
|
||||
void sp_draw(sprite_t *sf);
|
||||
void sp_draw_dmap(void* data, void* userdata);
|
||||
|
||||
|
||||
// in sprite_msg.c
|
||||
extern void smsg_add(const char *msg);
|
||||
extern void smsg_newline(int wNum, int size);
|
||||
extern void smsg_out(int wNum, int wSize, int wColorR, int wColorG, int wColorB, int wFont, int wSpeed, int wLineSpace, int wAlign, int wRSize, int wRFont, int wRLineSpace, int *wLength);
|
||||
extern void smsg_clear(int wNum);
|
||||
extern int smsg_is_empty();
|
||||
extern int smsg_peek(int nTopStringNum);
|
||||
extern int smsg_keywait(int sp1, int sp2, int timeout);
|
||||
extern int smsg_update(sprite_t *sp);
|
||||
void smsg_add(const char *msg);
|
||||
void smsg_newline(int wNum, int size);
|
||||
void smsg_out(int wNum, int wSize, int wColorR, int wColorG, int wColorB, int wFont, int wSpeed, int wLineSpace, int wAlign, int wRSize, int wRFont, int wRLineSpace, int *wLength);
|
||||
void smsg_clear(int wNum);
|
||||
bool smsg_is_empty();
|
||||
int smsg_peek(int nTopStringNum);
|
||||
int smsg_keywait(int sp1, int sp2, int timeout);
|
||||
void smsg_update(sprite_t *sp);
|
||||
|
||||
// in sprite_sel.c
|
||||
extern void ssel_init();
|
||||
extern void ssel_reset(void);
|
||||
extern void ssel_clear();
|
||||
extern void ssel_add(int nString, int wI);
|
||||
extern int ssel_select(int wNum, int wChoiceSize, int wMenuOutSpc, int wChoiceLineSpace, int wChoiceAutoMoveCursor, int nAlign);
|
||||
void ssel_init();
|
||||
void ssel_reset(void);
|
||||
void ssel_clear();
|
||||
void ssel_add(int nString, int wI);
|
||||
int ssel_select(int wNum, int wChoiceSize, int wMenuOutSpc, int wChoiceLineSpace, int wChoiceAutoMoveCursor, int nAlign);
|
||||
|
||||
// in sprite_event.c
|
||||
extern void spev_callback(agsevent_t *e);
|
||||
extern void spev_add_eventlistener(sprite_t *sp, int (*cb)(sprite_t *, agsevent_t *));
|
||||
extern void spev_remove_eventlistener(sprite_t *sp);
|
||||
void spev_callback(agsevent_t *e);
|
||||
void spev_add_eventlistener(sprite_t *sp, int (*cb)(sprite_t *, agsevent_t *));
|
||||
void spev_remove_eventlistener(sprite_t *sp);
|
||||
|
||||
// in sprite_tevent.c
|
||||
extern void spev_add_teventlistener(sprite_t *sp, int (*cb)(sprite_t *, agsevent_t *));
|
||||
extern void spev_remove_teventlistener(sprite_t *sp);
|
||||
extern void spev_main();
|
||||
void spev_add_teventlistener(sprite_t *sp, int (*cb)(sprite_t *, agsevent_t *));
|
||||
void spev_remove_teventlistener(sprite_t *sp);
|
||||
void spev_main();
|
||||
|
||||
// in sprite_move.c
|
||||
extern void spev_move_setup(void* data, void* userdata);
|
||||
extern void spev_move_waitend(sprite_t *sp, int dx, int dy, int time);
|
||||
extern void spev_wait4moving_sp();
|
||||
void spev_move_setup(void* data, void* userdata);
|
||||
void spev_move_waitend(sprite_t *sp, int dx, int dy, int time);
|
||||
void spev_wait4moving_sp();
|
||||
|
||||
// in sprite_switch.c
|
||||
extern int sp_sw_setup(sprite_t *sp);
|
||||
void sp_sw_setup(sprite_t *sp);
|
||||
|
||||
// in sprite_get.c
|
||||
extern int sp_get_setup(sprite_t *sp);
|
||||
void sp_get_setup(sprite_t *sp);
|
||||
|
||||
// in sprite_put.c
|
||||
extern int sp_put_setup(sprite_t *sp);
|
||||
void sp_put_setup(sprite_t *sp);
|
||||
|
||||
// in sprite_anime.c
|
||||
extern int sp_anime_setup(sprite_t *sp);
|
||||
void sp_anime_setup(sprite_t *sp);
|
||||
|
||||
// in sprite_eupdate.c
|
||||
extern int sp_eupdate(int type, int time, int key);
|
||||
void sp_eupdate(int type, int time, int key);
|
||||
|
||||
// in sprite_quake.c
|
||||
extern int sp_quake_sprite(int wType, int wAmplitudeX, int wAmplitude, int wCount, int cancel);
|
||||
void sp_quake_sprite(int wType, int wAmplitudeX, int wAmplitude, int wCount, int cancel);
|
||||
|
||||
// in sprite_keywait.c
|
||||
extern int sp_keywait(int *vOK, int *vRND, int *vRsv1, int *vRsv2, int *vRsv3, int timeout);
|
||||
void sp_keywait(int *vOK, int *vRND, int *vRsv1, int *vRsv2, int *vRsv3, int timeout);
|
||||
|
||||
// in screen_quake.c
|
||||
extern int sp_quake_screen(int type, int p1, int p2, int time, int cancel);
|
||||
|
||||
// in sactamask.c
|
||||
extern int sp_eupdate_amap(int type, int time, int key);
|
||||
void sp_quake_screen(int type, int p1, int p2, int time, int cancel);
|
||||
|
||||
// in sprite_xmenu.c
|
||||
extern int spxm_clear(void);
|
||||
extern int spxm_register(int reginum, int menuid);
|
||||
extern int spxm_getnum(int reginum);
|
||||
extern int spxm_gettext(int regnum, int strno);
|
||||
extern int spxm_titlereg(void);
|
||||
extern int spxm_titleget(int strno);
|
||||
void spxm_clear(void);
|
||||
void spxm_register(int reginum, int menuid);
|
||||
int spxm_getnum(int reginum);
|
||||
void spxm_gettext(int regnum, int strno);
|
||||
void spxm_titlereg(void);
|
||||
void spxm_titleget(int strno);
|
||||
|
||||
#endif /* __SPRITE_H__ */
|
||||
|
||||
@@ -81,7 +81,7 @@ static void cb_remove(sprite_t *sp) {
|
||||
sp_new の時にスプライトの種類毎の初期化
|
||||
@param sp: 初期化するスプライト
|
||||
*/
|
||||
int sp_anime_setup(sprite_t *sp) {
|
||||
void sp_anime_setup(sprite_t *sp) {
|
||||
int n = 0;
|
||||
|
||||
sp->u.anime.interval = 500; // デフォルトの間隔 0.5秒
|
||||
@@ -96,6 +96,4 @@ int sp_anime_setup(sprite_t *sp) {
|
||||
|
||||
spev_add_teventlistener(sp, eventCB_ANIM);
|
||||
sp->remove = cb_remove;
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
+44
-102
@@ -23,55 +23,32 @@
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <SDL.h>
|
||||
|
||||
#include "portab.h"
|
||||
#include "system.h"
|
||||
#include "ags.h"
|
||||
#include "graphics.h"
|
||||
#include "sact.h"
|
||||
#include "surface.h"
|
||||
#include "ngraph.h"
|
||||
#include "sprite.h"
|
||||
|
||||
static void fill_dmap(int dx ,int dy, int w, int h, uint16_t val);
|
||||
static void fill_dmap_mask(surface_t *src, int sx, int sy, int dx ,int dy, int w, int h, uint16_t val);
|
||||
|
||||
|
||||
|
||||
// 矩形の depthmap を描画
|
||||
static void fill_dmap(int dx ,int dy, int w, int h, uint16_t val) {
|
||||
uint8_t *dp, *dp_;
|
||||
int x, y;
|
||||
|
||||
dp = dp_ = (GETOFFSET_PIXEL(sact.dmap, dx, dy));
|
||||
|
||||
for (x = 0; x < w; x++) {
|
||||
*((uint16_t *)dp + x) = val;
|
||||
}
|
||||
dp += sact.dmap->bytes_per_line;
|
||||
|
||||
for (y = 1; y < h; y++) {
|
||||
memcpy(dp, dp_, w * 2);
|
||||
dp += sact.dmap->bytes_per_line;
|
||||
}
|
||||
}
|
||||
|
||||
// alphamapにしたがって、alpha値が0より大きいところを指定のdepthとする
|
||||
static void fill_dmap_mask(surface_t *src, int sx, int sy, int dx ,int dy, int w, int h, uint16_t val) {
|
||||
static void fill_dmap_mask(SDL_Surface *src, int sx, int sy, int dx ,int dy, int w, int h, uint16_t val) {
|
||||
uint8_t *sp, *dp;
|
||||
int x, y;
|
||||
|
||||
dp = GETOFFSET_PIXEL(sact.dmap, dx, dy);
|
||||
sp = GETOFFSET_ALPHA(src, sx, sy);
|
||||
assert(src->format->Amask == 0xff000000);
|
||||
dp = PIXEL_AT(sact.dmap, dx, dy);
|
||||
sp = ALPHA_AT(src, sx, sy);
|
||||
|
||||
for (y = 0; y < h; y++) {
|
||||
uint8_t *yls = (uint8_t *)(sp + y * src->width);
|
||||
uint16_t *yld = (uint16_t *)(dp + y * sact.dmap->bytes_per_line);
|
||||
uint8_t *yls = sp + y * src->pitch;
|
||||
uint16_t *yld = (uint16_t *)(dp + y * sact.dmap->pitch);
|
||||
for (x = 0; x < w; x++) {
|
||||
if (*yls > 0) *yld = val;
|
||||
yls++; yld++;
|
||||
yls += 4; yld++;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -80,66 +57,34 @@ static void fill_dmap_mask(surface_t *src, int sx, int sy, int dx ,int dy, int w
|
||||
指定の sprite (の現在のCG)を surface0 に書く
|
||||
@param sp: 描画するスプライト
|
||||
*/
|
||||
int sp_draw(sprite_t *sp) {
|
||||
if (sp == NULL) return NG;
|
||||
|
||||
return sp_draw2(sp, sp->curcg);
|
||||
}
|
||||
|
||||
/*
|
||||
指定の spriteの指定のCGを surface0 に書く
|
||||
(このインターフェイスはもう不要?)
|
||||
|
||||
@param sp: 描画するスプライト
|
||||
@param cg: 描画するCG
|
||||
*/
|
||||
int sp_draw2(sprite_t *sp, cginfo_t *cg) {
|
||||
surface_t update;
|
||||
int sx, sy, w, h, dx, dy;
|
||||
|
||||
if (cg == NULL) return NG;
|
||||
if (cg->sf == NULL) return NG;
|
||||
void sp_draw(sprite_t *sp) {
|
||||
if (sp == NULL) return;
|
||||
cginfo_t *cg = sp->curcg;
|
||||
if (cg == NULL) return;
|
||||
if (cg->sf == NULL) return;
|
||||
|
||||
// 更新領域の確定
|
||||
update.width = sact.updaterect.w;
|
||||
update.height = sact.updaterect.h;
|
||||
sx = 0;
|
||||
sy = 0;
|
||||
dx = sp->cur.x - sact.updaterect.x;
|
||||
dy = sp->cur.y - sact.updaterect.y;
|
||||
w = cg->sf->width;
|
||||
h = cg->sf->height;
|
||||
|
||||
if (!gr_clip(cg->sf, &sx, &sy, &w, &h, &update, &dx, &dy)) {
|
||||
return NG;
|
||||
SDL_Rect cg_rect = {0, 0, cg->sf->w, cg->sf->h};
|
||||
int sx = 0;
|
||||
int sy = 0;
|
||||
int dx = sp->cur.x;
|
||||
int dy = sp->cur.y;
|
||||
int w = cg->sf->w;
|
||||
int h = cg->sf->h;
|
||||
|
||||
if (!ags_clipCopyRect(&cg_rect, &sact.updaterect, &sx, &sy, &dx, &dy, &w, &h)) {
|
||||
return;
|
||||
}
|
||||
|
||||
dx += sact.updaterect.x;
|
||||
dy += sact.updaterect.y;
|
||||
|
||||
if (cg->sf->alpha) {
|
||||
// alpha map がある場合
|
||||
gre_BlendUseAMap(sf0, dx, dy,
|
||||
sf0, dx, dy,
|
||||
cg->sf, sx, sy, w, h,
|
||||
cg->sf, sx, sy,
|
||||
sp->blendrate);
|
||||
|
||||
if (SDL_ISPIXELFORMAT_ALPHA(cg->sf->format->format) || sp->blendrate < 255) {
|
||||
SDL_SetSurfaceBlendMode(cg->sf, SDL_BLENDMODE_BLEND);
|
||||
SDL_SetSurfaceAlphaMod(cg->sf, sp->blendrate);
|
||||
} else {
|
||||
if (sp->blendrate == 255) {
|
||||
// alpha値指定が無い場合
|
||||
gr_copy(sf0, dx, dy, cg->sf, sx, sy, w, h);
|
||||
} else if (sp->blendrate > 0) {
|
||||
// alpha値指定がある場合
|
||||
gre_Blend(sf0, dx, dy,
|
||||
sf0, dx, dy,
|
||||
cg->sf, sx, sy, w, h,
|
||||
sp->blendrate);
|
||||
}
|
||||
SDL_SetSurfaceBlendMode(cg->sf, SDL_BLENDMODE_NONE);
|
||||
}
|
||||
SDL_BlitSurface(cg->sf, &(SDL_Rect){sx, sy, w, h}, main_surface, &(SDL_Rect){dx, dy, w, h});
|
||||
|
||||
SACT_DEBUG("do update no=%d, sx=%d, sy=%d, w=%d, h=%d, dx=%d, dy=%d", sp->no, sx, sy, w, h, dx, dy);
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -147,38 +92,35 @@ int sp_draw2(sprite_t *sp, cginfo_t *cg) {
|
||||
*/
|
||||
void sp_draw_dmap(void* data, void* userdata) {
|
||||
sprite_t *sp = (sprite_t *)data;
|
||||
cginfo_t *cg;
|
||||
surface_t update;
|
||||
int sx, sy, w, h, dx, dy;
|
||||
|
||||
|
||||
// 非表示状態の時は無視
|
||||
if (!sp->show) return;
|
||||
|
||||
// ドラッグ中のスプライトは無視
|
||||
if (sp == sact.draggedsp) return;
|
||||
|
||||
cg = sp->curcg;
|
||||
cginfo_t *cg = sp->curcg;
|
||||
if (cg == NULL) return;
|
||||
if (cg->sf == NULL) return;
|
||||
|
||||
// depth map を書く領域を確定
|
||||
update.width = sf0->width;
|
||||
update.height = sf0->height;
|
||||
sx = 0;
|
||||
sy = 0;
|
||||
dx = sp->cur.x;
|
||||
dy = sp->cur.y;
|
||||
w = cg->sf->width;
|
||||
h = cg->sf->height;
|
||||
|
||||
if (!gr_clip(cg->sf, &sx, &sy, &w, &h, &update, &dx, &dy)) {
|
||||
SDL_Rect cg_rect = {0, 0, cg->sf->w, cg->sf->h};
|
||||
SDL_Rect screen_rect = {0, 0, main_surface->w, main_surface->h};
|
||||
int sx = 0;
|
||||
int sy = 0;
|
||||
int dx = sp->cur.x;
|
||||
int dy = sp->cur.y;
|
||||
int w = cg->sf->w;
|
||||
int h = cg->sf->h;
|
||||
|
||||
if (!ags_clipCopyRect(&cg_rect, &screen_rect, &sx, &sy, &dx, &dy, &w, &h)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (cg->sf->alpha) {
|
||||
if (SDL_ISPIXELFORMAT_ALPHA(cg->sf->format->format)) {
|
||||
fill_dmap_mask(cg->sf, sx, sy, dx, dy, w, h, sp->no);
|
||||
} else {
|
||||
fill_dmap(dx, dy, w, h, sp->no);
|
||||
SDL_FillRect(sact.dmap, &(SDL_Rect){dx, dy, w, h}, sp->no);
|
||||
}
|
||||
|
||||
return;
|
||||
|
||||
@@ -25,7 +25,6 @@
|
||||
|
||||
#include "portab.h"
|
||||
#include "system.h"
|
||||
#include "ngraph.h"
|
||||
#include "ags.h"
|
||||
#include "input.h"
|
||||
#include "sact.h"
|
||||
@@ -38,20 +37,20 @@
|
||||
@param time: 実行時間
|
||||
@param cancel: キー抜け(0:なし, 1:あり)
|
||||
*/
|
||||
int sp_eupdate(int type, int time, int cancel) {
|
||||
void sp_eupdate(int type, int time, int cancel) {
|
||||
if (sact.waitskiplv > 1) {
|
||||
sp_update_all(TRUE);
|
||||
return OK;
|
||||
sp_update_all(true);
|
||||
return;
|
||||
}
|
||||
|
||||
sp_update_all(FALSE);
|
||||
sp_update_all(false);
|
||||
|
||||
enum sdl_effect_type sdl_effect = from_sact_effect(type);
|
||||
if (sdl_effect == EFFECT_INVALID) {
|
||||
WARNING("Unimplemented effect %d", type);
|
||||
type = EFFECT_CROSSFADE;
|
||||
}
|
||||
SDL_Rect rect = { 0, 0, sf0->width, sf0->height };
|
||||
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);
|
||||
|
||||
int sttime, curtime;
|
||||
@@ -67,5 +66,4 @@ int sp_eupdate(int type, int time, int cancel) {
|
||||
}
|
||||
sdl_effect_finish(eff);
|
||||
ags_updateFull();
|
||||
return OK;
|
||||
}
|
||||
|
||||
+16
-16
@@ -91,11 +91,11 @@ static void cb_waitkey_selection(agsevent_t *e);
|
||||
static void cb_focused_swsp(void* s, void* data) {
|
||||
sprite_t *sp = (sprite_t *)s;
|
||||
int *update = (int *)data;
|
||||
boolean oldstate = sp->show;
|
||||
bool oldstate = sp->show;
|
||||
|
||||
SACT_DEBUG("show up spex %d", sp->no);
|
||||
|
||||
sp->show = TRUE;
|
||||
sp->show = true;
|
||||
if (oldstate != sp->show) {
|
||||
(*update)++;
|
||||
sp_updateme(sp);
|
||||
@@ -109,11 +109,11 @@ static void cb_focused_swsp(void* s, void* data) {
|
||||
static void cb_defocused_swsp(void* s, void* data) {
|
||||
sprite_t *sp = (sprite_t *)s;
|
||||
int *update = (int *)data;
|
||||
boolean oldstate = sp->show;
|
||||
bool oldstate = sp->show;
|
||||
|
||||
SACT_DEBUG("hide spex %d", sp->no);
|
||||
|
||||
sp->show = FALSE;
|
||||
sp->show = false;
|
||||
if (oldstate != sp->show) {
|
||||
(*update)++;
|
||||
sp_updateme(sp);
|
||||
@@ -124,7 +124,7 @@ static void cb_defocused_swsp(void* s, void* data) {
|
||||
static void cb_focused_zkey(void* s, void* data) {
|
||||
sprite_t *sp = (sprite_t *)s;
|
||||
int *update = (int *)data;
|
||||
boolean oldstate = sp->show;
|
||||
bool oldstate = sp->show;
|
||||
|
||||
sp->show = sp->show_save;
|
||||
if (oldstate != sp->show) {
|
||||
@@ -137,9 +137,9 @@ static void cb_focused_zkey(void* s, void* data) {
|
||||
static void cb_defocused_zkey(void* s, void* data) {
|
||||
sprite_t *sp = (sprite_t *)s;
|
||||
int *update = (int *)data;
|
||||
boolean oldstate = sp->show;
|
||||
bool oldstate = sp->show;
|
||||
|
||||
sp->show = FALSE;
|
||||
sp->show = false;
|
||||
if (oldstate != sp->show) {
|
||||
(*update)++;
|
||||
sp_updateme(sp);
|
||||
@@ -174,7 +174,7 @@ static int cb_focused(sprite_t *sp) {
|
||||
sp->curcg = sp->cg2;
|
||||
update++;
|
||||
}
|
||||
sp->focused = TRUE;
|
||||
sp->focused = true;
|
||||
SACT_DEBUG("get forcused %d, type %d", sp->no, sp->type);
|
||||
if (sp->numsound1) {
|
||||
ssnd_play(sp->numsound1);
|
||||
@@ -197,7 +197,7 @@ static int cb_defocused(sprite_t *sp) {
|
||||
}
|
||||
sp->curcg = sp->cg1;
|
||||
update++;
|
||||
sp->focused = FALSE;
|
||||
sp->focused = false;
|
||||
SACT_DEBUG("lost forcused %d", sp->no);
|
||||
}
|
||||
|
||||
@@ -216,11 +216,11 @@ static void cb_waitkey_simple(agsevent_t *e) {
|
||||
cur = sdl_getTicks();
|
||||
if (!sact.zhiding) {
|
||||
slist_foreach(sact.sp_zhide, cb_defocused_zkey, &update);
|
||||
sact.zhiding = TRUE;
|
||||
sact.zdooff = TRUE;
|
||||
sact.zhiding = true;
|
||||
sact.zdooff = true;
|
||||
sact.zofftime = cur;
|
||||
} else {
|
||||
sact.zdooff = FALSE;
|
||||
sact.zdooff = false;
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -229,14 +229,14 @@ static void cb_waitkey_simple(agsevent_t *e) {
|
||||
// back log view mode に移行
|
||||
// MessageKey 待ちのときのみ
|
||||
if (sact.waittype != KEYWAIT_MESSAGE) break;
|
||||
if (sblog_start() == OK)
|
||||
if (sblog_start())
|
||||
sact.waittype = KEYWAIT_BACKLOG;
|
||||
break;
|
||||
|
||||
case AGSEVENT_BUTTON_RELEASE:
|
||||
if (sact.zhiding) {
|
||||
slist_foreach(sact.sp_zhide, cb_focused_zkey, &update);
|
||||
sact.zhiding = FALSE;
|
||||
sact.zhiding = false;
|
||||
}
|
||||
// fall through
|
||||
|
||||
@@ -246,14 +246,14 @@ static void cb_waitkey_simple(agsevent_t *e) {
|
||||
cur = sdl_getTicks();
|
||||
if (500 < (cur - sact.zofftime) || !sact.zdooff) {
|
||||
slist_foreach(sact.sp_zhide, cb_focused_zkey, &update);
|
||||
sact.zhiding = FALSE;
|
||||
sact.zhiding = false;
|
||||
}
|
||||
break;
|
||||
case KEY_PAGEUP:
|
||||
case KEY_PAGEDOWN:
|
||||
// MessageKey 待ちのときのみ
|
||||
if (sact.waittype != KEYWAIT_MESSAGE) break;
|
||||
if (sblog_start() == OK)
|
||||
if (sblog_start())
|
||||
sact.waittype = KEYWAIT_BACKLOG;
|
||||
break;
|
||||
default:
|
||||
|
||||
@@ -42,9 +42,9 @@ static void cb_remove(sprite_t *sp);
|
||||
static void cb_defocused_swsp(void* s, void* data) {
|
||||
sprite_t *sp = (sprite_t *)s;
|
||||
int *update = (int *)data;
|
||||
boolean oldstate = sp->show;
|
||||
bool oldstate = sp->show;
|
||||
|
||||
sp->show = FALSE;
|
||||
sp->show = false;
|
||||
if (oldstate != sp->show) {
|
||||
(*update)++;
|
||||
sp_updateme(sp);
|
||||
@@ -61,7 +61,7 @@ static int eventCB_GET(sprite_t *sp, agsevent_t *e) {
|
||||
if (e->code != AGSEVENT_BUTTON_LEFT) break;
|
||||
|
||||
// drag開始時のマウスの位置記録
|
||||
sp->u.get.dragging = TRUE;
|
||||
sp->u.get.dragging = true;
|
||||
sp->u.get.dragstart.x = e->mousex;
|
||||
sp->u.get.dragstart.y = e->mousey;
|
||||
|
||||
@@ -73,7 +73,7 @@ static int eventCB_GET(sprite_t *sp, agsevent_t *e) {
|
||||
|
||||
// スプライトの表示を一番前に持って来る
|
||||
sact.draggedsp = sp;
|
||||
sact.dropped = FALSE;
|
||||
sact.dropped = false;
|
||||
|
||||
// 説明スプライトがある場合は、それを非表示にする
|
||||
if (sp->expsp) {
|
||||
@@ -92,7 +92,7 @@ static int eventCB_GET(sprite_t *sp, agsevent_t *e) {
|
||||
|
||||
if (!sp->u.get.dragging) break;
|
||||
|
||||
sact.dropped = TRUE;
|
||||
sact.dropped = true;
|
||||
break;
|
||||
|
||||
case AGSEVENT_MOUSE_MOTION:
|
||||
@@ -128,10 +128,8 @@ static void cb_remove(sprite_t *sp) {
|
||||
sp_new の時にスプライトの種類毎の初期化
|
||||
@param sp: 初期化するスプライト
|
||||
*/
|
||||
int sp_get_setup(sprite_t *sp) {
|
||||
void sp_get_setup(sprite_t *sp) {
|
||||
spev_add_eventlistener(sp, eventCB_GET);
|
||||
sp->remove = cb_remove;
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
|
||||
@@ -33,15 +33,13 @@
|
||||
#include "ags.h"
|
||||
#include "nact.h"
|
||||
#include "input.h"
|
||||
#include "ngraph.h"
|
||||
#include "surface.h"
|
||||
#include "sact.h"
|
||||
#include "sprite.h"
|
||||
#include "sactsound.h"
|
||||
|
||||
|
||||
static void hidesprite(sprite_t *sp);
|
||||
static boolean waitcond(int endtime);
|
||||
static bool waitcond(int endtime);
|
||||
|
||||
|
||||
|
||||
@@ -57,23 +55,23 @@ static void hidesprite(sprite_t *sp) {
|
||||
}
|
||||
|
||||
sp_updateme(sp);
|
||||
sp->show = FALSE;
|
||||
sp->show = false;
|
||||
sp_update_clipped();
|
||||
}
|
||||
|
||||
/*
|
||||
キー待ち終了の条件チェック
|
||||
@param endtime: 終了時間
|
||||
@return: 終了なら TRUE、継続なら FALSE
|
||||
@return: 終了なら true、継続なら false
|
||||
|
||||
スプライトがドロップされた時の各種処理を含む
|
||||
*/
|
||||
static boolean waitcond(int endtime) {
|
||||
static bool waitcond(int endtime) {
|
||||
int curtime = sdl_getTicks();
|
||||
if (curtime >= endtime) return TRUE;
|
||||
if (curtime >= endtime) return true;
|
||||
|
||||
if (sact.dropped) {
|
||||
sact.draggedsp->u.get.dragging = FALSE;
|
||||
sact.draggedsp->u.get.dragging = false;
|
||||
if (sact.waitkey != -1) {
|
||||
// dropしたスプライトをじわじわ消す
|
||||
hidesprite(sact.draggedsp);
|
||||
@@ -81,8 +79,8 @@ static boolean waitcond(int endtime) {
|
||||
sact.sp_result_put = sact.waitkey;
|
||||
sp_free(sact.draggedsp->no);
|
||||
sact.draggedsp = NULL;
|
||||
sact.dropped = FALSE;
|
||||
return TRUE;
|
||||
sact.dropped = false;
|
||||
return true;
|
||||
} else {
|
||||
// PUT/SWPUTスプライト以外のところにdropした場合
|
||||
sprite_t *sp = sact.draggedsp;
|
||||
@@ -99,12 +97,12 @@ static boolean waitcond(int endtime) {
|
||||
ssnd_play(sact.draggedsp->numsound3);
|
||||
}
|
||||
sact.draggedsp = NULL;
|
||||
sact.dropped = FALSE;
|
||||
sact.dropped = false;
|
||||
}
|
||||
}
|
||||
|
||||
// その他キー入力があれば終了
|
||||
return sact.waitkey == -1 ? FALSE : TRUE;
|
||||
return sact.waitkey != -1;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -116,11 +114,11 @@ static boolean waitcond(int endtime) {
|
||||
@param vD03: タイムアウトした場合=1, しない場合=0
|
||||
@param wTime: タイムアウト時間 (1/100sec)
|
||||
*/
|
||||
int sp_keywait(int *vOK, int *vRND, int *vD01, int *vD02, int *vD03, int timeout) {
|
||||
void sp_keywait(int *vOK, int *vRND, int *vD01, int *vD02, int *vD03, int timeout) {
|
||||
int curtime, endtime;
|
||||
|
||||
// とりあえず全更新
|
||||
sp_update_all(TRUE);
|
||||
sp_update_all(true);
|
||||
|
||||
// depthmap を準備
|
||||
slist_foreach(sact.updatelist, sp_draw_dmap, NULL);
|
||||
@@ -136,7 +134,7 @@ int sp_keywait(int *vOK, int *vRND, int *vD01, int *vD02, int *vD03, int timeout
|
||||
// とりあえず、現在のマウス位置を送って、switch sprite の
|
||||
// 状態を更新しておく
|
||||
MyPoint p;
|
||||
sys_getMouseInfo(&p, FALSE);
|
||||
sys_getMouseInfo(&p, false);
|
||||
agsevent_t agse = {
|
||||
.type = AGSEVENT_MOUSE_MOTION,
|
||||
.mousex = p.x,
|
||||
@@ -172,8 +170,6 @@ int sp_keywait(int *vOK, int *vRND, int *vD01, int *vD02, int *vD03, int timeout
|
||||
*vD02 = sact.sp_result_put;
|
||||
|
||||
sact.waittype = KEYWAIT_NONE;
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -62,7 +62,7 @@ static void move_drain(sprite_t *sp) {
|
||||
// 後で、movelist から外してもらうための処理
|
||||
sact.teventremovelist = slist_append(sact.teventremovelist, sp);
|
||||
|
||||
sp->move.moving = FALSE;
|
||||
sp->move.moving = false;
|
||||
if (sp->move.speed > 0)
|
||||
sp->move.time = 0;
|
||||
}
|
||||
@@ -122,7 +122,7 @@ void spev_move_setup(void* data, void* userdata) {
|
||||
|
||||
// move 開始時刻の記録
|
||||
sp->move.starttime = sact.movestarttime;
|
||||
sp->move.moving = TRUE;
|
||||
sp->move.moving = true;
|
||||
|
||||
// MOVE_SPEED で設定した場合は、移動量を考慮して移動時間を決定
|
||||
if (sp->move.speed > 0) {
|
||||
|
||||
+31
-52
@@ -35,7 +35,6 @@
|
||||
#include "input.h"
|
||||
#include "sact.h"
|
||||
#include "sprite.h"
|
||||
#include "ngraph.h"
|
||||
#include "drawtext.h"
|
||||
#include "sactlog.h"
|
||||
|
||||
@@ -46,7 +45,7 @@ struct markinfo {
|
||||
int interval;
|
||||
};
|
||||
|
||||
static boolean is_messagesprite(int wNum);
|
||||
static bool is_messagesprite(int wNum);
|
||||
static void replacestr_cb(void* data, void* userdata);
|
||||
static char *replacestr(char *msg);
|
||||
static void update_mark(sprite_t *sp, cginfo_t *cg);
|
||||
@@ -65,17 +64,17 @@ static char *replacesrc;
|
||||
static char *replacedst;
|
||||
|
||||
// 指定の番号のスプライトがメッセージスプライトかどうかをチェック
|
||||
static boolean is_messagesprite(int wNum) {
|
||||
static bool is_messagesprite(int wNum) {
|
||||
// check sprite number is sane
|
||||
if (wNum >= (SPRITEMAX -1) || wNum <= 0) return FALSE;
|
||||
if (wNum >= (SPRITEMAX -1) || wNum <= 0) return false;
|
||||
|
||||
// check sprite is set
|
||||
if (sact.sp[wNum] == NULL) return FALSE;
|
||||
if (sact.sp[wNum] == NULL) return false;
|
||||
|
||||
// check sprite is message sprite
|
||||
if (sact.sp[wNum]->type != SPRITE_MSG) return FALSE;
|
||||
if (sact.sp[wNum]->type != SPRITE_MSG) return false;
|
||||
|
||||
return TRUE;
|
||||
return true;
|
||||
}
|
||||
|
||||
// 文字列の置き換え処理
|
||||
@@ -88,7 +87,7 @@ static void replacestr_cb(void* data, void* userdata) {
|
||||
start = replacesrc;
|
||||
out = replacedst;
|
||||
|
||||
while (TRUE) {
|
||||
while (true) {
|
||||
next = strstr(start, ex->src);
|
||||
if (next == NULL) break;
|
||||
strncat(out, start, (size_t)(next - start));
|
||||
@@ -118,10 +117,10 @@ static char *replacestr(char *msg) {
|
||||
|
||||
// アニメパターンの描画
|
||||
static void update_mark(sprite_t *sp, cginfo_t *cg) {
|
||||
boolean show = sp->show;
|
||||
bool show = sp->show;
|
||||
cginfo_t *curcg = sp->curcg;
|
||||
|
||||
sp->show = TRUE;
|
||||
sp->show = true;
|
||||
sp->curcg = cg;
|
||||
|
||||
sp_updateme(sp);
|
||||
@@ -241,7 +240,7 @@ void smsg_out(int wNum, int wSize, int wColorR, int wColorG, int wColorB, int wF
|
||||
char *msg;
|
||||
sprite_t *sp;
|
||||
int len = 0; // 処理した文字数?
|
||||
boolean needupdate = FALSE;
|
||||
bool needupdate = false;
|
||||
MyRectangle uparea = {0,0,0,0};
|
||||
|
||||
// wRSize == 0 -> ルビ無し(SACT.MessageOutputからの呼出)
|
||||
@@ -303,7 +302,7 @@ void smsg_out(int wNum, int wSize, int wColorR, int wColorG, int wColorB, int wF
|
||||
mbuf,
|
||||
wColorR, wColorG, wColorB);
|
||||
|
||||
needupdate = TRUE;
|
||||
needupdate = true;
|
||||
|
||||
append_to_log(mbuf);
|
||||
|
||||
@@ -314,7 +313,7 @@ void smsg_out(int wNum, int wSize, int wColorR, int wColorG, int wColorB, int wF
|
||||
cw,
|
||||
wSize + wRSize + wRLineSpace);
|
||||
sp_update_clipped();
|
||||
needupdate = FALSE;
|
||||
needupdate = false;
|
||||
|
||||
// keywait
|
||||
delta = sdl_getTicks() - wcnt;
|
||||
@@ -352,24 +351,19 @@ void smsg_out(int wNum, int wSize, int wColorR, int wColorG, int wColorB, int wF
|
||||
@param wNum: クリアするスプライト番号
|
||||
*/
|
||||
void smsg_clear(int wNum) {
|
||||
sprite_t *sp;
|
||||
surface_t *sf;
|
||||
|
||||
if (!is_messagesprite(wNum)) return;
|
||||
|
||||
// 表示位置の初期化
|
||||
sp = sact.sp[wNum];
|
||||
sprite_t *sp = sact.sp[wNum];
|
||||
sp->u.msg.dspcur.x = 0;
|
||||
sp->u.msg.dspcur.y = 0;
|
||||
|
||||
sact.msgbuf[0] = '\0';
|
||||
sact.msgbuf2[0] = '\0';
|
||||
|
||||
// キャンバスのクリア
|
||||
sf = sp->u.msg.canvas;
|
||||
memset(sf->pixel, 0, sf->bytes_per_line * sf->height);
|
||||
memset(sf->alpha, 0, sf->width * sf->height);
|
||||
|
||||
|
||||
// Clear the canvas
|
||||
SDL_FillRect(sp->u.msg.canvas, NULL, 0);
|
||||
|
||||
sp_updateme(sp);
|
||||
|
||||
if (sact.logging) {
|
||||
@@ -381,7 +375,7 @@ void smsg_clear(int wNum) {
|
||||
出力中の文字列があるかチェック
|
||||
@return: なし(1) , あり(0)
|
||||
*/
|
||||
int smsg_is_empty() {
|
||||
bool smsg_is_empty() {
|
||||
return (sact.msgbuf[0] == '\0');
|
||||
}
|
||||
|
||||
@@ -452,38 +446,23 @@ int smsg_keywait(int wNum1, int wNum2, int msglen) {
|
||||
スプライト再描画のコールバック
|
||||
@param sp: 再描画するスプライト
|
||||
*/
|
||||
int smsg_update(sprite_t *sp) {
|
||||
int sx, sy, w, h, dx, dy;
|
||||
surface_t update;
|
||||
|
||||
// canvas が clean のときはなにもしない
|
||||
// -> 説明スプライトのように、SetShowされたときに対応できないからだめ
|
||||
//if (sact.msgbufempty) return OK;
|
||||
|
||||
update.width = sact.updaterect.w;
|
||||
update.height = sact.updaterect.h;
|
||||
|
||||
dx = sp->cur.x - sact.updaterect.x;
|
||||
dy = sp->cur.y - sact.updaterect.y;
|
||||
|
||||
w = sp->cursize.width;
|
||||
h = sp->cursize.height;
|
||||
|
||||
sx = 0; sy = 0;
|
||||
|
||||
if (!gr_clip(sp->u.msg.canvas, &sx, &sy, &w, &h, &update, &dx, &dy)) {
|
||||
return NG;
|
||||
void smsg_update(sprite_t *sp) {
|
||||
SDL_Rect sp_rect = {0, 0, sp->cursize.width, sp->cursize.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;
|
||||
if (!ags_clipCopyRect(&sp_rect, &sact.updaterect, &sx, &sy, &dx, &dy, &w, &h)) {
|
||||
return;
|
||||
}
|
||||
|
||||
dx += sact.updaterect.x;
|
||||
dy += sact.updaterect.y;
|
||||
|
||||
gre_BlendUseAMap(sf0, dx, dy, sf0, dx, dy, sp->u.msg.canvas, sx, sy, w, h, sp->u.msg.canvas, sx, sy, sp->blendrate);
|
||||
SDL_SetSurfaceBlendMode(sp->u.msg.canvas, SDL_BLENDMODE_BLEND);
|
||||
SDL_SetSurfaceAlphaMod(sp->u.msg.canvas, sp->blendrate);
|
||||
SDL_BlitSurface(sp->u.msg.canvas, &(SDL_Rect){sx, sy, w, h}, main_surface, &(SDL_Rect){dx, dy, w, h});
|
||||
|
||||
SACT_DEBUG("do update no=%d, sx=%d, sy=%d, w=%d, h=%d, dx=%d, dy=%d",
|
||||
sp->no, sx, sy, w, h, dx, dy);
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
// 改行を含む文字列バッファ中から、改行までの文字列の長さを取り出す
|
||||
|
||||
@@ -48,7 +48,7 @@ static int eventCB_PUT(sprite_t *sp, agsevent_t *e) {
|
||||
update++;
|
||||
}
|
||||
|
||||
sp->pressed = TRUE;
|
||||
sp->pressed = true;
|
||||
break;
|
||||
|
||||
case AGSEVENT_BUTTON_RELEASE:
|
||||
@@ -76,7 +76,7 @@ static int eventCB_PUT(sprite_t *sp, agsevent_t *e) {
|
||||
ssnd_play(sp->numsound2);
|
||||
}
|
||||
}
|
||||
sp->pressed = FALSE;
|
||||
sp->pressed = false;
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -98,9 +98,7 @@ static void cb_remove(sprite_t *sp) {
|
||||
sp_new の時にスプライトの種類毎の初期化
|
||||
@param sp: 初期化するスプライト
|
||||
*/
|
||||
int sp_put_setup(sprite_t *sp) {
|
||||
void sp_put_setup(sprite_t *sp) {
|
||||
spev_add_eventlistener(sp, eventCB_PUT);
|
||||
sp->remove = cb_remove;
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
@@ -30,8 +30,6 @@
|
||||
#include "list.h"
|
||||
#include "input.h"
|
||||
#include "sact.h"
|
||||
#include "surface.h"
|
||||
#include "ngraph.h"
|
||||
#include "sprite.h"
|
||||
#include "sdl_core.h"
|
||||
#include "randMT.h"
|
||||
@@ -46,7 +44,7 @@
|
||||
@param wCount: 時間(1/100秒)
|
||||
@param cancel: キーキャンセルあり(=1)
|
||||
*/
|
||||
int sp_quake_sprite(int wType, int wAmplitudeX, int wAmplitudeY, int wCount, int cancel) {
|
||||
void sp_quake_sprite(int wType, int wAmplitudeX, int wAmplitudeY, int wCount, int cancel) {
|
||||
int edtime, curtime;
|
||||
int i = 0, key;
|
||||
SList *node;
|
||||
@@ -97,5 +95,4 @@ int sp_quake_sprite(int wType, int wAmplitudeX, int wAmplitudeY, int wCount, int
|
||||
sp_updateme(sp);
|
||||
}
|
||||
sp_update_clipped();
|
||||
return OK;
|
||||
}
|
||||
|
||||
+36
-40
@@ -26,6 +26,7 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <SDL.h>
|
||||
|
||||
#include "portab.h"
|
||||
#include "nact.h"
|
||||
@@ -33,25 +34,20 @@
|
||||
#include "input.h"
|
||||
#include "sact.h"
|
||||
#include "sprite.h"
|
||||
#include "ngraph.h"
|
||||
#include "drawtext.h"
|
||||
|
||||
// 選択された要素(1~) キャンセルの場合は0、初期状態は -1
|
||||
static int selected_item;
|
||||
static int selected_item_cur;
|
||||
|
||||
// 選択肢を描画するsurface
|
||||
static surface_t *selcanvas;
|
||||
|
||||
// 前のカーソルの状態
|
||||
static boolean oldstate; // spriteの中か外か
|
||||
static bool oldstate; // spriteの中か外か
|
||||
static int oldindex; // 何番目の要素か(0~)
|
||||
|
||||
|
||||
static boolean sp_is_insprite2(sprite_t *sp, int x, int y, int margin);
|
||||
static bool sp_is_insprite2(sprite_t *sp, int x, int y, int margin);
|
||||
static void cb_select_move(agsevent_t *e);
|
||||
static void cb_select_release(agsevent_t *e);
|
||||
static int update_selwindow(sprite_t *sp);
|
||||
static void setup_selwindow();
|
||||
static void remove_selwindow();
|
||||
static int sel_main();
|
||||
@@ -63,13 +59,13 @@ static int sel_main();
|
||||
* 内側にマージンを含む sprite内領域チェック
|
||||
* マージン内はsprite内部とは判断しない
|
||||
*/
|
||||
static boolean sp_is_insprite2(sprite_t *sp, int x, int y, int margin) {
|
||||
static bool sp_is_insprite2(sprite_t *sp, int x, int y, int margin) {
|
||||
MyPoint p = {x, y};
|
||||
MyRectangle r = {
|
||||
sp->cur.x + margin,
|
||||
sp->cur.y + margin,
|
||||
sp->curcg->sf->width - 2 * margin,
|
||||
sp->curcg->sf->height - 2 * margin
|
||||
sp->curcg->sf->w - 2 * margin,
|
||||
sp->curcg->sf->h - 2 * margin
|
||||
};
|
||||
return SDL_PointInRect(&p, &r);
|
||||
}
|
||||
@@ -78,7 +74,7 @@ static boolean sp_is_insprite2(sprite_t *sp, int x, int y, int margin) {
|
||||
static void cb_select_move(agsevent_t *e) {
|
||||
int x = e->mousex, y = e->mousey;
|
||||
sprite_t *sp = sact.sp[sact.sel.spno];
|
||||
boolean newstate;
|
||||
bool newstate;
|
||||
int newindex;
|
||||
|
||||
// sprite内か?
|
||||
@@ -86,7 +82,7 @@ static void cb_select_move(agsevent_t *e) {
|
||||
newindex = (y - (sp->cur.y + sact.sel.frame_dot)) / (sact.sel.font_size + sact.sel.linespace);
|
||||
|
||||
if (newstate == oldstate) {
|
||||
if ((newstate == FALSE) || (newindex == oldindex)) {
|
||||
if (!newstate || newindex == oldindex) {
|
||||
// 前と状態が同じでかつ、新しい状態がspriteの外か、
|
||||
// indexが変わらない場合はなにもしない。
|
||||
return;
|
||||
@@ -116,7 +112,7 @@ static void cb_select_move(agsevent_t *e) {
|
||||
static void cb_select_release(agsevent_t *e) {
|
||||
int x = e->mousex, y = e->mousey;
|
||||
sprite_t *sp = sact.sp[sact.sel.spno];
|
||||
boolean st;
|
||||
bool st;
|
||||
int iy;
|
||||
|
||||
switch (e->code) {
|
||||
@@ -125,7 +121,7 @@ static void cb_select_release(agsevent_t *e) {
|
||||
iy = (y - (sp->cur.y + sact.sel.frame_dot)) / (sact.sel.font_size + sact.sel.linespace);
|
||||
|
||||
// カーソルが sprite の外の場合は無視
|
||||
if (st == FALSE) {
|
||||
if (!st) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -142,8 +138,19 @@ static void cb_select_release(agsevent_t *e) {
|
||||
}
|
||||
}
|
||||
|
||||
static void draw_box(SDL_Surface *dst, int x, int y, int w, int h) {
|
||||
SDL_FillRect(dst, &(SDL_Rect){x, y, w, h}, SDL_MapRGB(dst->format, 0, 0, 0));
|
||||
SDL_Rect border_rects[4] = {
|
||||
{x, y, w, 1},
|
||||
{x, y + h - 1, w, 1},
|
||||
{x, y, 1, h},
|
||||
{x + w - 1, y, 1, h}
|
||||
};
|
||||
SDL_FillRects(dst, border_rects, 4, SDL_MapRGB(dst->format, 255, 255, 255));
|
||||
}
|
||||
|
||||
// 選択ウィンドを更新するときの callback
|
||||
static int update_selwindow(sprite_t *sp) {
|
||||
static void update_selwindow(sprite_t *sp) {
|
||||
int selno = selected_item_cur;
|
||||
int x0, y0;
|
||||
|
||||
@@ -154,20 +161,16 @@ static int update_selwindow(sprite_t *sp) {
|
||||
|
||||
// 選択されている要素
|
||||
if (selno && sact.sel.elem[selno] != NULL) {
|
||||
int w = selcanvas->width - 2 * sact.sel.frame_dot;
|
||||
int w = sact.sel.charcanvas->w - 2 * sact.sel.frame_dot;
|
||||
int h = sact.sel.font_size + sact.sel.linespace;
|
||||
int x = x0 + sact.sel.frame_dot;
|
||||
int y = y0 + sact.sel.frame_dot + (selno -1) * h;
|
||||
gr_fill(sf0, x, y, w, h, 0, 0, 0);
|
||||
gr_drawrect(sf0, x, y, w, h, 255, 255, 255);
|
||||
draw_box(main_surface, x, y, w, h);
|
||||
}
|
||||
|
||||
// 選択肢文字列
|
||||
gr_expandcolor_blend(sf0, x0, y0,
|
||||
sact.sel.charcanvas, 0, 0,
|
||||
selcanvas->width, selcanvas->height, 255, 255, 255);
|
||||
|
||||
return OK;
|
||||
SDL_BlitSurface(sact.sel.charcanvas, NULL, main_surface,
|
||||
&(SDL_Rect){x0, y0, sact.sel.charcanvas->w, sact.sel.charcanvas->h});
|
||||
}
|
||||
|
||||
// 選択ウィンドの準備
|
||||
@@ -175,11 +178,9 @@ static void setup_selwindow() {
|
||||
sprite_t *sp = sact.sp[sact.sel.spno];
|
||||
int i;
|
||||
|
||||
//選択ウィンド作業 surfaceの生成
|
||||
selcanvas = sf_dup(sp->cg1->sf);
|
||||
|
||||
// 選択肢文字用 canvas
|
||||
sact.sel.charcanvas = sf_create_pixel(selcanvas->width, selcanvas->height, 8);
|
||||
sact.sel.charcanvas = SDL_CreateRGBSurfaceWithFormat(0, sp->cg1->sf->w, sp->cg1->sf->h, 32, SDL_PIXELFORMAT_ARGB8888);
|
||||
SDL_SetSurfaceBlendMode(sact.sel.charcanvas, SDL_BLENDMODE_BLEND);
|
||||
|
||||
dt_setfont(sact.sel.font_type, sact.sel.font_size);
|
||||
|
||||
@@ -190,9 +191,9 @@ static void setup_selwindow() {
|
||||
// 文字の場所計算
|
||||
x = 0; // 行そろえは無し
|
||||
y = (i - 1) * (sact.sel.font_size + sact.sel.linespace);
|
||||
dt_drawtext(sact.sel.charcanvas,
|
||||
dt_drawtext_col(sact.sel.charcanvas,
|
||||
x + sact.sel.frame_dot, y + sact.sel.frame_dot,
|
||||
sact.sel.elem[i]);
|
||||
sact.sel.elem[i], 255, 255, 255);
|
||||
}
|
||||
|
||||
// デフォルトで選択される選択肢がある場合、そこへカーソルを移動
|
||||
@@ -202,7 +203,7 @@ static void setup_selwindow() {
|
||||
(sact.sel.font_size + sact.sel.linespace) * (sact.sel.movecursor - 1);
|
||||
ags_setCursorLocation(x, y, true, true);
|
||||
selected_item = (sact.sel.movecursor -1);
|
||||
oldstate = TRUE;
|
||||
oldstate = true;
|
||||
oldindex = selected_item -1;
|
||||
}
|
||||
|
||||
@@ -225,9 +226,8 @@ static void remove_selwindow() {
|
||||
sp_update_clipped();
|
||||
|
||||
// 作業用 surface の削除
|
||||
sf_free(selcanvas);
|
||||
selcanvas = NULL;
|
||||
sf_free(sact.sel.charcanvas);
|
||||
if (sact.sel.charcanvas)
|
||||
SDL_FreeSurface(sact.sel.charcanvas);
|
||||
sact.sel.charcanvas = NULL;
|
||||
}
|
||||
|
||||
@@ -264,12 +264,8 @@ void ssel_init() {
|
||||
|
||||
void ssel_reset(void) {
|
||||
ssel_clear();
|
||||
if (selcanvas) {
|
||||
sf_free(selcanvas);
|
||||
selcanvas = NULL;
|
||||
}
|
||||
if (sact.sel.charcanvas) {
|
||||
sf_free(sact.sel.charcanvas);
|
||||
SDL_FreeSurface(sact.sel.charcanvas);
|
||||
sact.sel.charcanvas = NULL;
|
||||
}
|
||||
}
|
||||
@@ -315,7 +311,7 @@ void ssel_add(int nString, int wI) {
|
||||
*/
|
||||
int ssel_select(int wNum, int wChoiceSize, int wMenuOutSpc, int wChoiceLineSpace, int wChoiceAutoMoveCursor, int nAlign) {
|
||||
int ret = 0;
|
||||
boolean saveflag;
|
||||
bool saveflag;
|
||||
|
||||
// check sprite number is sane
|
||||
if (wNum >= (SPRITEMAX-1) || wNum <= 0) return ret;
|
||||
@@ -335,7 +331,7 @@ int ssel_select(int wNum, int wChoiceSize, int wMenuOutSpc, int wChoiceLineSpace
|
||||
|
||||
// 古い sprite の表示フラグを保存
|
||||
saveflag = sact.sp[wNum]->show;
|
||||
sact.sp[wNum]->show = TRUE;
|
||||
sact.sp[wNum]->show = true;
|
||||
setup_selwindow();
|
||||
|
||||
ret = sel_main();
|
||||
|
||||
@@ -49,7 +49,7 @@ static int eventCB_switch(sprite_t *sp, agsevent_t *e) {
|
||||
update++;
|
||||
}
|
||||
|
||||
sp->pressed = TRUE;
|
||||
sp->pressed = true;
|
||||
break;
|
||||
|
||||
case AGSEVENT_BUTTON_RELEASE:
|
||||
@@ -71,7 +71,7 @@ static int eventCB_switch(sprite_t *sp, agsevent_t *e) {
|
||||
ssnd_play(sp->numsound2);
|
||||
}
|
||||
}
|
||||
sp->pressed = FALSE;
|
||||
sp->pressed = false;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -93,8 +93,7 @@ static void cb_remove(sprite_t *sp) {
|
||||
sp_new の時にスプライトの種類毎の初期化
|
||||
@param sp: 初期化するスプライト
|
||||
*/
|
||||
int sp_sw_setup(sprite_t *sp) {
|
||||
void sp_sw_setup(sprite_t *sp) {
|
||||
spev_add_eventlistener(sp, eventCB_switch);
|
||||
sp->remove = cb_remove;
|
||||
return OK;
|
||||
}
|
||||
|
||||
@@ -32,8 +32,6 @@
|
||||
#include "ags.h"
|
||||
#include "graphics.h"
|
||||
#include "sact.h"
|
||||
#include "surface.h"
|
||||
#include "ngraph.h"
|
||||
#include "sprite.h"
|
||||
|
||||
// スプライト再描画間の間に変更のあったスプライトの領域の和
|
||||
@@ -54,7 +52,7 @@ static void disjunction(void* region, void* data) {
|
||||
// 更新の必要なスプライトの領域の和をとってクリッピングする
|
||||
static void get_updatearea() {
|
||||
MyRectangle clip = {0, 0, 0, 0};
|
||||
MyRectangle rsf0 = {0, 0, sf0->width, sf0->height};
|
||||
MyRectangle screen = {0, 0, main_surface->w, main_surface->h};
|
||||
|
||||
slist_foreach(updatearea, disjunction, &clip);
|
||||
|
||||
@@ -62,7 +60,7 @@ static void get_updatearea() {
|
||||
updatearea = NULL;
|
||||
|
||||
// surface0との領域の積をとる
|
||||
SDL_IntersectRect(&rsf0, &clip, &sact.updaterect);
|
||||
SDL_IntersectRect(&screen, &clip, &sact.updaterect);
|
||||
|
||||
SACT_DEBUG("clipped area x=%d y=%d w=%d h=%d",
|
||||
sact.updaterect.x, sact.updaterect.y,
|
||||
@@ -90,7 +88,7 @@ static void do_update_each(void* data, void* userdata) {
|
||||
画面全体の更新
|
||||
@param syncscreen: surface0 に描画したものを Screen に反映させるかどうか
|
||||
*/
|
||||
int sp_update_all(boolean syncscreen) {
|
||||
void sp_update_all(bool syncscreen) {
|
||||
|
||||
// スプライト移動がある場合は移動開始
|
||||
if (sact.movelist) {
|
||||
@@ -104,8 +102,8 @@ int sp_update_all(boolean syncscreen) {
|
||||
// 画面全体を更新領域に
|
||||
sact.updaterect.x = 0;
|
||||
sact.updaterect.y = 0;
|
||||
sact.updaterect.w = sf0->width;
|
||||
sact.updaterect.h = sf0->height;
|
||||
sact.updaterect.w = main_surface->w;
|
||||
sact.updaterect.h = main_surface->h;
|
||||
|
||||
// updatelistに登録してあるスプライトを再描画
|
||||
// updatelistはスプライトの番号順に並んでいる
|
||||
@@ -121,20 +119,18 @@ int sp_update_all(boolean syncscreen) {
|
||||
// 移動中のすべてのスプライトが移動終了するまで待つ
|
||||
// こうしないと動きが同期しない
|
||||
spev_wait4moving_sp();
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
/*
|
||||
画面の一部を更新
|
||||
updateme(_part)で登録した更新が必要なspriteの和の領域をupdate
|
||||
*/
|
||||
int sp_update_clipped() {
|
||||
void sp_update_clipped() {
|
||||
// 更新領域の確定
|
||||
get_updatearea();
|
||||
|
||||
if (SDL_RectEmpty(&sact.updaterect))
|
||||
return OK;
|
||||
return;
|
||||
|
||||
// 更新領域に入っているスプライトの再描画
|
||||
slist_foreach(sact.updatelist, do_update_each, NULL);
|
||||
@@ -146,19 +142,17 @@ int sp_update_clipped() {
|
||||
|
||||
// 更新領域を Window に転送
|
||||
ags_updateArea(sact.updaterect.x, sact.updaterect.y, sact.updaterect.w, sact.updaterect.h);
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
/*
|
||||
sprite全体の更新を登録
|
||||
@param sp: 更新するスプライト
|
||||
*/
|
||||
int sp_updateme(sprite_t *sp) {
|
||||
void sp_updateme(sprite_t *sp) {
|
||||
MyRectangle *r;
|
||||
|
||||
if (sp == NULL) return NG;
|
||||
if (sp->cursize.width == 0 || sp->cursize.height == 0) return NG;
|
||||
if (sp == NULL) return;
|
||||
if (sp->cursize.width == 0 || sp->cursize.height == 0) return;
|
||||
|
||||
r = malloc(sizeof(MyRectangle));
|
||||
r->x = sp->cur.x;
|
||||
@@ -170,8 +164,6 @@ int sp_updateme(sprite_t *sp) {
|
||||
|
||||
SACT_DEBUG("x = %d, y = %d, spno = %d w=%d,h=%d",
|
||||
r->x, r->y, sp->no, r->w, r->h);
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -182,11 +174,11 @@ int sp_updateme(sprite_t *sp) {
|
||||
@param w: 更新領域幅
|
||||
@param h: 更新領域高さ
|
||||
*/
|
||||
int sp_updateme_part(sprite_t *sp, int x, int y, int w, int h) {
|
||||
void sp_updateme_part(sprite_t *sp, int x, int y, int w, int h) {
|
||||
MyRectangle *r;
|
||||
|
||||
if (sp == NULL) return NG;
|
||||
if (w == 0 || h == 0) return NG;
|
||||
if (sp == NULL) return;
|
||||
if (w == 0 || h == 0) return;
|
||||
|
||||
r = malloc(sizeof(MyRectangle));
|
||||
r->x = sp->cur.x + x;
|
||||
@@ -198,7 +190,5 @@ int sp_updateme_part(sprite_t *sp, int x, int y, int w, int h) {
|
||||
|
||||
SACT_DEBUG("x = %d, y = %d, spno = %d w=%d,h=%d",
|
||||
r->x, r->y, sp->no, r->w, r->h);
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
|
||||
@@ -40,7 +40,7 @@ struct _xm {
|
||||
|
||||
static struct _xm xmenu;
|
||||
|
||||
int spxm_clear(void) {
|
||||
void spxm_clear(void) {
|
||||
int i;
|
||||
|
||||
free(xmenu.title); xmenu.title = NULL;
|
||||
@@ -48,16 +48,14 @@ int spxm_clear(void) {
|
||||
free(xmenu.item[i]); xmenu.item[i] = NULL;
|
||||
xmenu.ret[i] = 0;
|
||||
}
|
||||
return OK;
|
||||
}
|
||||
|
||||
int spxm_register(int reginum, int menuid) {
|
||||
if (reginum > SEL_ELEMENT_MAX) return NG;
|
||||
void spxm_register(int reginum, int menuid) {
|
||||
if (reginum > SEL_ELEMENT_MAX) return;
|
||||
|
||||
xmenu.ret[reginum] = menuid;
|
||||
xmenu.item[reginum] = strdup(sact.msgbuf);
|
||||
sact.msgbuf[0] = '\0';
|
||||
return OK;
|
||||
}
|
||||
|
||||
int spxm_getnum(int reginum) {
|
||||
@@ -65,19 +63,16 @@ int spxm_getnum(int reginum) {
|
||||
return xmenu.ret[reginum];
|
||||
}
|
||||
|
||||
int spxm_gettext(int reginum, int strno) {
|
||||
if (reginum > SEL_ELEMENT_MAX) return NG;
|
||||
void spxm_gettext(int reginum, int strno) {
|
||||
if (reginum > SEL_ELEMENT_MAX) return;
|
||||
svar_set(strno, xmenu.item[reginum]);
|
||||
return OK;
|
||||
}
|
||||
|
||||
int spxm_titlereg(void) {
|
||||
void spxm_titlereg(void) {
|
||||
xmenu.title = strdup(sact.msgbuf);
|
||||
sact.msgbuf[0] = '\0';
|
||||
return OK;
|
||||
}
|
||||
|
||||
int spxm_titleget(int strno) {
|
||||
void spxm_titleget(int strno) {
|
||||
svar_set(strno, xmenu.title);
|
||||
return OK;
|
||||
}
|
||||
|
||||
+23
-95
@@ -41,8 +41,6 @@
|
||||
|
||||
#define SLOT 40
|
||||
|
||||
static void copy_sprite(int sx, int sy, int width, int height, int dx, int dy, int r, int g, int b);
|
||||
|
||||
static MyRectangle maprect; /* アニメーション表示領域 */
|
||||
static MyRectangle mapback; /* 背景セーブ領域 */
|
||||
static int mapback_p5; /* 背景転送先 X */
|
||||
@@ -89,6 +87,14 @@ static struct _s2 s2[SLOT];
|
||||
|
||||
static int* add_p5[SLOT]; /* どこまでアニメーションのコマが進んだか */
|
||||
|
||||
static void copy_sprite(int sx, int sy, int width, int height, int dx, int dy, int r, int g, int b) {
|
||||
SDL_Surface *sf = nact->ags.dib->sdl_surface;
|
||||
SDL_SetColorKey(sf, SDL_TRUE, SDL_MapRGB(sf->format, r, g, b));
|
||||
SDL_Rect src_rect = { sx, sy, width, height };
|
||||
SDL_Rect dst_rect = { dx, dy, width, height };
|
||||
SDL_BlitSurface(sf, &src_rect, sf, &dst_rect);
|
||||
SDL_SetColorKey(sf, SDL_FALSE, 0);
|
||||
}
|
||||
|
||||
static void Init() {
|
||||
/*
|
||||
@@ -135,7 +141,7 @@ static void ChangeNotColor() {
|
||||
int *src = getCaliVariable(); /* r, g, b */
|
||||
int *dst = getCaliVariable(); /* r, g, b */
|
||||
int p7 = getCaliValue(); /* ISurface */
|
||||
agsurface_t *dib;
|
||||
surface_t *dib;
|
||||
int x, y;
|
||||
uint8_t *dp;
|
||||
|
||||
@@ -146,42 +152,18 @@ static void ChangeNotColor() {
|
||||
dib = nact->ags.dib;
|
||||
dp = GETOFFSET_PIXEL(dib, x0, y0);
|
||||
|
||||
switch(dib->depth) {
|
||||
case 16:
|
||||
{
|
||||
uint16_t pic16s = PIX16(*src, *(src+1), *(src+2));
|
||||
uint16_t pic16d = PIX16(*dst, *(dst+1), *(dst+2));
|
||||
uint16_t *yl;
|
||||
|
||||
for (y = 0; y < height; y++) {
|
||||
yl = (uint16_t *)(dp + y * dib->bytes_per_line);
|
||||
for (x = 0; x < width; x++) {
|
||||
if (*yl != pic16s) {
|
||||
*yl = pic16d;
|
||||
}
|
||||
yl++;
|
||||
uint32_t pic24s = PIX24(*src, *(src+1), *(src+2));
|
||||
uint32_t pic24d = PIX24(*dst, *(dst+1), *(dst+2));
|
||||
uint32_t *yl;
|
||||
|
||||
for (y = 0; y < height; y++) {
|
||||
yl = (uint32_t *)(dp + y * dib->sdl_surface->pitch);
|
||||
for (x = 0; x < width; x++) {
|
||||
if (*yl != pic24s) {
|
||||
*yl = pic24d;
|
||||
}
|
||||
yl++;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 24:
|
||||
case 32:
|
||||
{
|
||||
uint32_t pic24s = PIX24(*src, *(src+1), *(src+2));
|
||||
uint32_t pic24d = PIX24(*dst, *(dst+1), *(dst+2));
|
||||
uint32_t *yl;
|
||||
|
||||
for (y = 0; y < height; y++) {
|
||||
yl = (uint32_t *)(dp + y * dib->bytes_per_line);
|
||||
for (x = 0; x < width; x++) {
|
||||
if (*yl != pic24s) {
|
||||
*yl = pic24d;
|
||||
}
|
||||
yl++;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
// The CX command after ChangeNotColor (in FIGHT.ADV) must use a precise
|
||||
// calculation.
|
||||
@@ -452,8 +434,8 @@ static void PlayAnimeData() {
|
||||
int p6 = getCaliValue(); /* IWinMsg */
|
||||
int interval, loop;
|
||||
int i;
|
||||
boolean is_backcopied;
|
||||
agsurface_t *dib;
|
||||
bool is_backcopied;
|
||||
surface_t *dib;
|
||||
|
||||
TRACE("ShGraph.PlayAnimeData %d,%d,%d,%d,%d,%d:", p1, p2, p3, p4, p5, p6);
|
||||
|
||||
@@ -470,7 +452,7 @@ static void PlayAnimeData() {
|
||||
|
||||
for (loop = 0; loop < p1; loop++) {
|
||||
int cnt = sdl_getTicks();
|
||||
is_backcopied = FALSE;
|
||||
is_backcopied = false;
|
||||
|
||||
for (i = 0; i < SLOT; i++) {
|
||||
int srcno = s1[i].add_p2;
|
||||
@@ -489,7 +471,7 @@ static void PlayAnimeData() {
|
||||
int sx, sy, dx, dy;
|
||||
|
||||
if (!is_backcopied) {
|
||||
is_backcopied = TRUE;
|
||||
is_backcopied = true;
|
||||
ags_copyArea(mapback.x, mapback.y, mapback.w, mapback.h,
|
||||
mapback_p5, mapback_p6);
|
||||
}
|
||||
@@ -553,60 +535,6 @@ static void PlayAnimeData() {
|
||||
}
|
||||
}
|
||||
|
||||
static void copy_sprite(int sx, int sy, int width, int height, int dx, int dy, int r, int g, int b) {
|
||||
int x, y;
|
||||
uint8_t *sp, *dp;
|
||||
agsurface_t *dib;
|
||||
|
||||
if (dx < 0 || dy < 0) return;
|
||||
|
||||
ags_check_param(&sx, &sy, &width, &height);
|
||||
ags_check_param(&dx, &dy, &width, &height);
|
||||
|
||||
dib = nact->ags.dib;
|
||||
|
||||
sp = GETOFFSET_PIXEL(dib, sx, sy);
|
||||
dp = GETOFFSET_PIXEL(dib, dx, dy);
|
||||
|
||||
switch(dib->depth) {
|
||||
case 16:
|
||||
{
|
||||
uint16_t pic16 = PIX16(r, g, b);
|
||||
uint16_t *yls, *yld;
|
||||
|
||||
for (y = 0; y < height; y++) {
|
||||
yls = (uint16_t *)(sp + y * dib->bytes_per_line);
|
||||
yld = (uint16_t *)(dp + y * dib->bytes_per_line);
|
||||
for (x = 0; x < width; x++) {
|
||||
if (*yls != pic16) {
|
||||
*yld = *yls;
|
||||
}
|
||||
yls++; yld++;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 24:
|
||||
case 32:
|
||||
{
|
||||
uint32_t pic24 = PIX24(r, g, b);
|
||||
uint32_t *yls, *yld;
|
||||
|
||||
for (y = 0; y < height; y++) {
|
||||
yls = (uint32_t *)(sp + y * dib->bytes_per_line);
|
||||
yld = (uint32_t *)(dp + y * dib->bytes_per_line);
|
||||
for (x = 0; x < width; x++) {
|
||||
if (*yls != pic24) {
|
||||
*yld = *yls;
|
||||
}
|
||||
yls++; yld++;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static const ModuleFunc functions[] = {
|
||||
{"AddAnimeData", AddAnimeData},
|
||||
{"AddAnimeRemain", AddAnimeRemain},
|
||||
|
||||
+9
-49
@@ -30,10 +30,8 @@
|
||||
#include "nact.h"
|
||||
#include "ags.h"
|
||||
#include "font.h"
|
||||
#include "surface.h"
|
||||
#include "ngraph.h"
|
||||
|
||||
static int ftype; // フォントの種類
|
||||
static FontType ftype;
|
||||
static int fsize; // フォントの大きさ
|
||||
|
||||
/**
|
||||
@@ -42,44 +40,16 @@ static int fsize; // フォントの大きさ
|
||||
* @param type: フォント種類 (FONT_MINCHO, FONT_GOTHIC)
|
||||
* @param size: フォントサイズ
|
||||
*/
|
||||
int dt_setfont(int type, int size) {
|
||||
void dt_setfont(FontType type, int size) {
|
||||
#ifdef __EMSCRIPTEN__
|
||||
if (type == FONT_MINCHO) {
|
||||
if (load_mincho_font() != OK)
|
||||
if (!load_mincho_font())
|
||||
type = FONT_GOTHIC;
|
||||
}
|
||||
#endif
|
||||
|
||||
ftype = type;
|
||||
fsize = size;
|
||||
return OK;
|
||||
}
|
||||
|
||||
/**
|
||||
* surface にモノクロ文字を描画。アンチエイリアスされており256階調
|
||||
* 書き出すsurfaceは8ビットである必要あり
|
||||
*
|
||||
* @param sf: 描画する surface
|
||||
* @param x: 描画位置X座標
|
||||
* @param y: 描画位置Y座標
|
||||
* @param buf: 描画文字列 (SJIS)
|
||||
* @return: 実際に描画した幅
|
||||
*/
|
||||
int dt_drawtext(surface_t *sf, int x, int y, char *buf) {
|
||||
int sx, sy, sw, sh;
|
||||
|
||||
ags_setFont(ftype, fsize);
|
||||
agsurface_t *glyph = ags_drawStringToSurface(buf);
|
||||
if (glyph == NULL) return 0;
|
||||
|
||||
sx = x; sy = y;
|
||||
sw = glyph->width;
|
||||
sh = glyph->height;
|
||||
if (!gr_clip_xywh(sf, &sx, &sy, &sw, &sh)) return 0;
|
||||
|
||||
gr_copy(sf, sx, sy, glyph, 0, 0, sw, sh);
|
||||
|
||||
return sw;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -95,23 +65,13 @@ int dt_drawtext(surface_t *sf, int x, int y, char *buf) {
|
||||
* @param b: 文字色青
|
||||
* @return: 実際に描画した幅
|
||||
*/
|
||||
int dt_drawtext_col(surface_t *sf, int x, int y, char *buf, int r, int g, int b) {
|
||||
int sx, sy, sw, sh;
|
||||
|
||||
int dt_drawtext_col(SDL_Surface *sf, int x, int y, char *buf, int r, int g, int b) {
|
||||
ags_setFont(ftype, fsize);
|
||||
agsurface_t *glyph = ags_drawStringToSurface(buf);
|
||||
SDL_Surface *glyph = ags_drawStringToSurface(buf, r, g, b);
|
||||
if (glyph == NULL) return 0;
|
||||
|
||||
sx = x; sy = y;
|
||||
sw = glyph->width;
|
||||
sh = glyph->height;
|
||||
if (!gr_clip_xywh(sf, &sx, &sy, &sw, &sh)) return 0;
|
||||
|
||||
// alpha map に文字そのものを描く
|
||||
gr_draw_amap(sf, sx, sy, glyph->pixel, sw, sh, glyph->bytes_per_line);
|
||||
|
||||
// pixel map には色情報を矩形で描く
|
||||
gr_fill(sf, sx, sy, sw, sh, r, g, b);
|
||||
|
||||
return sw;
|
||||
SDL_Rect rect = {x, y, glyph->w, glyph->h};
|
||||
SDL_BlitSurface(glyph, NULL, sf, &rect);
|
||||
SDL_FreeSurface(glyph);
|
||||
return rect.w;
|
||||
}
|
||||
|
||||
@@ -24,8 +24,11 @@
|
||||
#ifndef __DRAWTEXT_H__
|
||||
#define __DRAWTEXT_H__
|
||||
|
||||
extern int dt_setfont(int type, int size);
|
||||
extern int dt_drawtext(surface_t *sf, int x, int y, char *buf);
|
||||
extern int dt_drawtext_col(surface_t *sf, int x, int y, char *buf, int r, int g, int b);
|
||||
#include "graphics.h"
|
||||
|
||||
struct SDL_Surface;
|
||||
|
||||
void dt_setfont(FontType type, int size);
|
||||
int dt_drawtext_col(struct SDL_Surface *sf, int x, int y, char *buf, int r, int g, int b);
|
||||
|
||||
#endif /* __DRAWTEXT_H__ */
|
||||
|
||||
@@ -1,18 +0,0 @@
|
||||
#ifndef __GRAPH_H__
|
||||
#define __GRAPH_H__
|
||||
|
||||
#include "config.h"
|
||||
#include "surface.h"
|
||||
|
||||
extern void gr_init();
|
||||
|
||||
extern void gr_blend(surface_t *dst, int dx, int dy, surface_t *src, int sx, int sy, int width, int height, int lv);
|
||||
extern void gr_copy_stretch_blend_alpha_map(surface_t *dst, int dx, int dy, int dw, int dh, surface_t *src, int sx, int sy, int sw, int sh);
|
||||
extern void gr_fill_alpha_overborder(surface_t *dst, int dx, int dy, int dw, int dh, int s, int d);
|
||||
extern void gr_fill_alpha_underborder(surface_t *dst, int dx, int dy, int dw, int dh, int s, int d);
|
||||
extern void gr_copy_alpha_map_sprite(surface_t *dst, int dx, int dy, surface_t *src, int sx, int sy, int sw, int sh, int cl);
|
||||
extern void gr_blend_alpha_wds_stretch2x2(surface_t *src1, int sx1, int sy1, surface_t *src2, int sx2, int sy2, int sw, int sh, surface_t *dst, int dx, int dy);
|
||||
extern void gr_blend_alpha_wds(surface_t *src1, int sx1, int sy1, surface_t *src2, int sx2, int sy2, int sw, int sh, surface_t *dst, int dx, int dy);
|
||||
|
||||
#endif /* __GRAPH_H__ */
|
||||
|
||||
@@ -5,19 +5,54 @@
|
||||
|
||||
#include "portab.h"
|
||||
#include "system.h"
|
||||
#include "surface.h"
|
||||
#include "ngraph.h"
|
||||
#include "graph_blend_amap.h"
|
||||
#include "ags.h"
|
||||
|
||||
int 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 NG;
|
||||
if (!gr_clip(src, &sx, &sy, &sw, &sh, dst, &dx, &dy)) return NG;
|
||||
static void gre_BlendUseAMap(surface_t *dst, int dx, int dy, surface_t *src, int sx, int sy, int width, int height) {
|
||||
uint8_t *sp = GETOFFSET_PIXEL(src, sx, sy);
|
||||
uint8_t *dp = GETOFFSET_PIXEL(dst, dx, dy);
|
||||
uint8_t *ap = GETOFFSET_ALPHA(src, sx, sy);
|
||||
|
||||
switch (dst->sdl_surface->format->BitsPerPixel) {
|
||||
case 16:
|
||||
for (int y = 0; y < height; y++) {
|
||||
uint16_t *yls = (uint16_t *)(sp + y * src->sdl_surface->pitch);
|
||||
uint16_t *yld = (uint16_t *)(dp + y * dst->sdl_surface->pitch);
|
||||
uint8_t *yla = (uint8_t *)(ap + y * src->width);
|
||||
|
||||
for (int x = 0; x < width; x++) {
|
||||
*yld = ALPHABLEND16(*yls, *yld, *yla);
|
||||
yls++; yld++; yla++;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 24:
|
||||
case 32:
|
||||
for (int y = 0; y < height; y++) {
|
||||
uint32_t *yls = (uint32_t *)(sp + y * src->sdl_surface->pitch);
|
||||
uint32_t *yld = (uint32_t *)(dp + y * dst->sdl_surface->pitch);
|
||||
uint8_t *yla = (uint8_t *)(ap + y * src->width);
|
||||
|
||||
for (int x = 0; x < width; x++) {
|
||||
*yld = ALPHABLEND24(*yls, *yld, *yla);
|
||||
yls++; yld++; yla++;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
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 };
|
||||
if (!ags_clipCopyRect(&src_window, &dst_window, &sx, &sy, &dx, &dy, &sw, &sh)) return;
|
||||
|
||||
if (src->alpha == NULL) {
|
||||
WARNING("src alpha NULL");
|
||||
return NG;
|
||||
return;
|
||||
}
|
||||
|
||||
return gre_BlendUseAMap(dst, dx, dy, dst, dx, dy, src, sx, sy, sw, sh, src, sx, sy, 255);
|
||||
gre_BlendUseAMap(dst, dx, dy, src, sx, sy, sw, sh);
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
#ifndef __GRAPH_BLEND_AMAP_H__
|
||||
#define __GRAPH_BLEND_AMAP_H__
|
||||
|
||||
#include "ags.h"
|
||||
|
||||
void gr_blend_alpha_map(surface_t *dst, int dx, int dy, surface_t *src, int sx, int sy, int sw, int sh);
|
||||
|
||||
#endif /* __GRAPH_BLEND_AMAP_H__ */
|
||||
@@ -1,18 +0,0 @@
|
||||
// srcのsurfaceの一部をdstに飽和加算
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include "portab.h"
|
||||
#include "system.h"
|
||||
#include "surface.h"
|
||||
#include "ngraph.h"
|
||||
#include "ags.h"
|
||||
|
||||
int gr_blend_screen(surface_t *dst, int dx, int dy, surface_t *src, int sx, int sy, int w, int h) {
|
||||
|
||||
if (src == NULL || dst == NULL) return NG;
|
||||
if (!gr_clip(src, &sx, &sy, &w, &h, dst, &dx, &dy)) return NG;
|
||||
|
||||
return gre_BlendScreen(dst, dx, dy, dst, dx, dy, src, sx, sy, w, h);
|
||||
}
|
||||
|
||||
@@ -1,150 +0,0 @@
|
||||
/*
|
||||
* graph_cg.c surface に 実際にcgデータを描く
|
||||
*
|
||||
* Copyright (C) 1997-1998 Masaki Chikama (Wren) <chikama@kasumi.ipl.mech.nagoya-u.ac.jp>
|
||||
* 1998- <masaki-c@is.aist-nara.ac.jp>
|
||||
*
|
||||
* 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
|
||||
*
|
||||
*/
|
||||
/* $Id: graph_cg.c,v 1.2 2003/08/30 21:29:16 chikama Exp $ */
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "portab.h"
|
||||
#include "surface.h"
|
||||
#include "cg.h"
|
||||
#include "ags.h"
|
||||
#include "ngraph.h"
|
||||
|
||||
/**
|
||||
* surface に 24bpp CG (QNT)を描画
|
||||
*
|
||||
* @param ds: 描画 surface
|
||||
* @param cg: 描画するCGデータ
|
||||
* @param x: 描画X座標
|
||||
* @param y: 描画Y座標
|
||||
*/
|
||||
void gr_drawimage24(surface_t *ds, cgdata *cg, int x, int y) {
|
||||
int dx, dy, dw, dh;
|
||||
uint8_t *sp, *dp, r, g, b;
|
||||
|
||||
dx = x;
|
||||
dy = y;
|
||||
dw = cg->width;
|
||||
dh = cg->height;
|
||||
|
||||
if (!gr_clip_xywh(ds, &dx, &dy, &dw, &dh)) return;
|
||||
|
||||
int data_offset = (abs(dy - y) * cg->width + abs(dx - x)) * 3;
|
||||
|
||||
sp = (uint8_t *)(cg->pic + data_offset);
|
||||
dp = GETOFFSET_PIXEL(ds, dx, dy);
|
||||
|
||||
switch(ds->depth) {
|
||||
case 16:
|
||||
{
|
||||
uint16_t *yl;
|
||||
|
||||
for (y = 0; y < dh; y++) {
|
||||
yl = (uint16_t *)(dp + y * ds->bytes_per_line);
|
||||
for (x = 0; x < dw; x++) {
|
||||
r = *sp;
|
||||
g = *(sp +1);
|
||||
b = *(sp +2);
|
||||
*yl = PIX16(r, g, b);
|
||||
yl++; sp += 3;
|
||||
}
|
||||
sp += ((cg->width - dw) * 3);
|
||||
}
|
||||
break;
|
||||
|
||||
}
|
||||
case 24:
|
||||
case 32:
|
||||
{
|
||||
uint32_t *yl;
|
||||
|
||||
for (y = 0; y < dh; y++) {
|
||||
yl = (uint32_t *)(dp + y * ds->bytes_per_line);
|
||||
for (x = 0; x < dw; x++) {
|
||||
r = *sp;
|
||||
g = *(sp +1);
|
||||
b = *(sp +2);
|
||||
*yl = PIX24(r, g, b);
|
||||
yl++; sp += 3;
|
||||
}
|
||||
sp += ((cg->width - dw) * 3);
|
||||
}
|
||||
break;
|
||||
}}
|
||||
}
|
||||
|
||||
/**
|
||||
* surface に 16bpp CG (PMS16/BMP)を描画
|
||||
*
|
||||
* @param ds: 描画 surface
|
||||
* @param cg: 描画するCGデータ
|
||||
* @param x: 描画X座標
|
||||
* @param y: 描画Y座標
|
||||
*/
|
||||
void gr_drawimage16(surface_t *ds, cgdata *cg, int x, int y) {
|
||||
int dx, dy, dw, dh;
|
||||
uint8_t *dp;
|
||||
uint16_t pic16, *sp;
|
||||
|
||||
dx = x;
|
||||
dy = y;
|
||||
dw = cg->width;
|
||||
dh = cg->height;
|
||||
|
||||
if (!gr_clip_xywh(ds, &dx, &dy, &dw, &dh)) return;
|
||||
|
||||
int data_offset = (abs(dy - y) * cg->width + abs(dx - x)) * 2;
|
||||
|
||||
sp = (uint16_t *)(cg->pic + data_offset);
|
||||
dp = GETOFFSET_PIXEL(ds, dx, dy);
|
||||
|
||||
switch(ds->depth) {
|
||||
case 16:
|
||||
{
|
||||
for (y = 0; y < dh; y++) {
|
||||
memcpy(dp, sp, dw * 2);
|
||||
sp += cg->width;
|
||||
dp += ds->bytes_per_line;
|
||||
}
|
||||
break;
|
||||
|
||||
}
|
||||
case 24:
|
||||
case 32:
|
||||
{
|
||||
uint32_t *yl;
|
||||
|
||||
for (y = 0; y < dh; y++) {
|
||||
yl = (uint32_t *)(dp + y * ds->bytes_per_line);
|
||||
for (x = 0; x < dw; x++) {
|
||||
pic16 = *sp;
|
||||
*yl = rgb565_to_rgb888(pic16);
|
||||
yl++; sp++;
|
||||
}
|
||||
sp += (cg->width - dw);
|
||||
}
|
||||
break;
|
||||
}}
|
||||
}
|
||||
@@ -1,80 +0,0 @@
|
||||
/*
|
||||
* graph_copy.c pixel データのコピー
|
||||
*
|
||||
* Copyright (C) 1997-1998 Masaki Chikama (Wren) <chikama@kasumi.ipl.mech.nagoya-u.ac.jp>
|
||||
* 1998- <masaki-c@is.aist-nara.ac.jp>
|
||||
*
|
||||
* 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
|
||||
*
|
||||
*/
|
||||
/* $Id: graph_copy.c,v 1.2 2003/04/25 17:23:55 chikama Exp $ */
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include "portab.h"
|
||||
#include "surface.h"
|
||||
#include "ngraph.h"
|
||||
#include "ags.h"
|
||||
|
||||
/**
|
||||
* 指定の surface の領域を 別の surface の指定位置へコピーする
|
||||
* pixelデータのみコピー
|
||||
*
|
||||
* @param dst: 転送先 surface
|
||||
* @param dx: 転送先X座標
|
||||
* @param dy: 転送先Y座標
|
||||
* @param src: 転送元surface
|
||||
* @param sx: 転送元X座標
|
||||
* @param sy: 転送元Y座標
|
||||
* @param sw: 転送幅
|
||||
* @param sh: 転送高さ
|
||||
*/
|
||||
int gr_copy(surface_t *dst, int dx, int dy, surface_t *src, int sx, int sy, int sw, int sh) {
|
||||
uint8_t *sp, *dp;
|
||||
|
||||
if (src == NULL || dst == NULL) return NG;
|
||||
if (!gr_clip(src, &sx, &sy, &sw, &sh, dst, &dx, &dy)) return NG;
|
||||
|
||||
sp = GETOFFSET_PIXEL(src, sx, sy);
|
||||
dp = GETOFFSET_PIXEL(dst, dx, dy);
|
||||
|
||||
if (sp == NULL || dp == NULL) return NG;
|
||||
|
||||
if (src == dst) {
|
||||
if (sy <= dy && dy < (sy + sh)) {
|
||||
sp += (sh -1) * src->bytes_per_line;
|
||||
dp += (sh -1) * dst->bytes_per_line;
|
||||
while(sh--) {
|
||||
memmove(dp, sp, sw * src->bytes_per_pixel);
|
||||
sp -= src->bytes_per_line;
|
||||
dp -= dst->bytes_per_line;
|
||||
}
|
||||
} else {
|
||||
while(sh--) {
|
||||
memmove(dp, sp, sw * src->bytes_per_pixel);
|
||||
sp += src->bytes_per_line;
|
||||
dp += dst->bytes_per_line;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
while(sh--) {
|
||||
memcpy(dp, sp, sw * src->bytes_per_pixel);
|
||||
sp += src->bytes_per_line;
|
||||
dp += dst->bytes_per_line;
|
||||
}
|
||||
}
|
||||
|
||||
return OK;
|
||||
}
|
||||
@@ -1,55 +0,0 @@
|
||||
// 指定のsurface領域を明るさを lv/255 倍してコピー
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include "portab.h"
|
||||
#include "surface.h"
|
||||
#include "ngraph.h"
|
||||
#include "ags.h"
|
||||
|
||||
void gr_copy_bright(surface_t *dst, int dx, int dy, surface_t *src, int sx, int sy, int width, int height, int lv) {
|
||||
int x, y;
|
||||
uint8_t *sp, *dp;
|
||||
|
||||
if (!gr_clip(src, &sx, &sy, &width, &height, dst, &dx, &dy)) return;
|
||||
|
||||
sp = GETOFFSET_PIXEL(src, sx, sy);
|
||||
dp = GETOFFSET_PIXEL(dst, dx, dy);
|
||||
|
||||
if (sp == NULL || dp == NULL) return;
|
||||
|
||||
switch(dst->depth) {
|
||||
case 16:
|
||||
{
|
||||
uint16_t *yls, *yld;
|
||||
|
||||
for (y = 0; y < height; y++) {
|
||||
yls = (uint16_t *)(sp + y * src->bytes_per_line);
|
||||
yld = (uint16_t *)(dp + y * dst->bytes_per_line);
|
||||
|
||||
for (x = 0; x < width; x++) {
|
||||
*yld = ALPHALEVEL16(*yls, lv);
|
||||
yls++; yld++;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 24:
|
||||
case 32:
|
||||
{
|
||||
uint32_t *yls, *yld;
|
||||
|
||||
for (y = 0; y < height; y++) {
|
||||
yls = (uint32_t *)(sp + y * src->bytes_per_line);
|
||||
yld = (uint32_t *)(dp + y * dst->bytes_per_line);
|
||||
|
||||
for (x = 0; x < width; x++) {
|
||||
*yld = ALPHALEVEL24(*yls, lv);
|
||||
yls++; yld++;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,24 +0,0 @@
|
||||
// 8bit surface (or data列)から surface の alpha map へコピー
|
||||
|
||||
#include <string.h>
|
||||
#include "portab.h"
|
||||
#include "surface.h"
|
||||
#include "ngraph.h"
|
||||
#include "ags.h"
|
||||
|
||||
int gr_draw_amap(surface_t *dst, int dx, int dy, uint8_t *src, int width, int height, int scanline) {
|
||||
int y;
|
||||
uint8_t *sp, *dp;
|
||||
|
||||
sp = src;
|
||||
dp = GETOFFSET_ALPHA(dst, dx, dy);
|
||||
|
||||
for (y = 0; y < height; y++) {
|
||||
memcpy(dp, sp, width);
|
||||
sp += scanline;
|
||||
dp += dst->width;
|
||||
}
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user