mirror of
https://github.com/kichikuou/xsystem35-sdl2.git
synced 2026-09-22 22:48:08 +03:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d7deaec972 | ||
|
|
30467371f4 | ||
|
|
e9a30f7493 | ||
|
|
d9e42dd4bb | ||
|
|
0e06cc1e22 | ||
|
|
89423c94f1 | ||
|
|
c694d2282c | ||
|
|
39e94afc44 | ||
|
|
e37a491908 | ||
|
|
43dff9a9e4 | ||
|
|
e6b3d6094d | ||
|
|
61ad4282e6 | ||
|
|
e4628d8bbb | ||
|
|
21bd4279a1 | ||
|
|
b6c33fd761 | ||
|
|
1b9d8c48f1 | ||
|
|
55ef307e07 | ||
|
|
894cd51e01 | ||
|
|
880244020e | ||
|
|
9c2f423399 | ||
|
|
654a489f49 | ||
|
|
912af592ae | ||
|
|
6d70439dff | ||
|
|
aec06f775a | ||
|
|
446ffe9466 | ||
|
|
02cad74568 | ||
|
|
33e1ff3b4a | ||
|
|
11f8f00072 | ||
|
|
b59d683fef | ||
|
|
b9f4c7c03a | ||
|
|
2d2c6aa373 | ||
|
|
850af6d140 | ||
|
|
da4cf017bf | ||
|
|
e88dfcdaa1 |
@@ -2,7 +2,7 @@ name: Emscripten Build
|
||||
on: [push, pull_request]
|
||||
|
||||
env:
|
||||
EM_VERSION: 3.1.27
|
||||
EM_VERSION: 3.1.34
|
||||
EM_CACHE_FOLDER: 'emsdk-cache'
|
||||
|
||||
jobs:
|
||||
|
||||
+1
-5
@@ -123,14 +123,10 @@ elseif (CMAKE_SYSTEM_NAME STREQUAL "Emscripten")
|
||||
list(APPEND SRC_CDROM cdrom.emscripten.c)
|
||||
list(APPEND SUMMARY_CDROM "Emscripten")
|
||||
set(ENABLE_CDROM_EMSCRIPTEN 1)
|
||||
elseif (CMAKE_SYSTEM_NAME STREQUAL "Android")
|
||||
list(APPEND SRC_CDROM cdrom.android.c)
|
||||
list(APPEND SUMMARY_CDROM "Android")
|
||||
set(ENABLE_CDROM_ANDROID 1)
|
||||
else()
|
||||
list(APPEND SRC_CDROM cdrom.empty.c)
|
||||
endif()
|
||||
if (SDL2MIXER_FOUND AND NOT ANDROID)
|
||||
if (SDL2MIXER_FOUND)
|
||||
list(APPEND SRC_CDROM cdrom.mp3.c)
|
||||
list(APPEND SUMMARY_CDROM "SDL_mixer (wav|mp3|ogg...)")
|
||||
set(ENABLE_CDROM_MP3 1)
|
||||
|
||||
@@ -16,8 +16,8 @@ android {
|
||||
}
|
||||
minSdkVersion 19
|
||||
targetSdkVersion 31
|
||||
versionCode 13
|
||||
versionName "2.8.0" + gitRevision()
|
||||
versionCode 15
|
||||
versionName "2.9.1" + gitRevision()
|
||||
externalNativeBuild {
|
||||
cmake {
|
||||
arguments "-DANDROID_APP_PLATFORM=android-16", "-DANDROID_STL=c++_static"
|
||||
@@ -82,6 +82,7 @@ android {
|
||||
dependencies {
|
||||
implementation fileTree(include: ['*.jar'], dir: 'libs')
|
||||
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
|
||||
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4'
|
||||
}
|
||||
|
||||
static String gitRevision() {
|
||||
|
||||
@@ -37,24 +37,20 @@ class GameActivity : SDLActivity() {
|
||||
}
|
||||
|
||||
private lateinit var gameRoot: File
|
||||
private lateinit var cdda: CddaPlayer
|
||||
private val midi = MidiPlayer()
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
gameRoot = File(intent.getStringExtra(EXTRA_GAME_ROOT)!!)
|
||||
cdda = CddaPlayer(File(gameRoot, Launcher.PLAYLIST_FILE))
|
||||
}
|
||||
|
||||
override fun onStop() {
|
||||
super.onStop()
|
||||
cdda.onActivityStop()
|
||||
midi.onActivityStop()
|
||||
}
|
||||
|
||||
override fun onResume() {
|
||||
super.onResume()
|
||||
cdda.onActivityResume()
|
||||
midi.onActivityResume()
|
||||
}
|
||||
|
||||
@@ -63,7 +59,9 @@ class GameActivity : SDLActivity() {
|
||||
}
|
||||
|
||||
override fun getArguments(): Array<String> {
|
||||
return arrayOf("-gamedir", intent.getStringExtra(EXTRA_GAME_ROOT)!!)
|
||||
return arrayOf(
|
||||
"-gamedir", intent.getStringExtra(EXTRA_GAME_ROOT)!!,
|
||||
"-devcd", Launcher.PLAYLIST_FILE)
|
||||
}
|
||||
|
||||
override fun setTitle(title: CharSequence?) {
|
||||
@@ -120,9 +118,6 @@ class GameActivity : SDLActivity() {
|
||||
}
|
||||
|
||||
// The functions below are called in the SDL thread by JNI.
|
||||
@Suppress("unused") fun cddaStart(track: Int, loop: Boolean) = cdda.start(track, loop)
|
||||
@Suppress("unused") fun cddaStop() = cdda.stop()
|
||||
@Suppress("unused") fun cddaCurrentPosition() = cdda.currentPosition()
|
||||
@Suppress("unused") fun midiStart(path: String, loop: Boolean) = midi.start(path, loop)
|
||||
@Suppress("unused") fun midiStop() = midi.stop()
|
||||
@Suppress("unused") fun midiCurrentPosition() = midi.currentPosition()
|
||||
@@ -156,69 +151,6 @@ class GameActivity : SDLActivity() {
|
||||
}
|
||||
}
|
||||
|
||||
private class CddaPlayer(private val playlistPath: File) {
|
||||
private val playlist =
|
||||
try {
|
||||
playlistPath.readLines()
|
||||
} catch (e: IOException) {
|
||||
Log.e("loadPlaylist", "Cannot load $playlistPath", e)
|
||||
emptyList()
|
||||
}
|
||||
private var currentTrack = 0
|
||||
private val player = MediaPlayer()
|
||||
private var playerPaused = false
|
||||
|
||||
fun start(track: Int, loop: Boolean) {
|
||||
val f = playlist.elementAtOrNull(track - 1)
|
||||
if (f.isNullOrEmpty()) {
|
||||
Log.w("cddaStart", "No playlist entry for track $track")
|
||||
return
|
||||
}
|
||||
Log.v("cddaStart", "$f Loop:$loop")
|
||||
try {
|
||||
player.apply {
|
||||
reset()
|
||||
setDataSource(File(playlistPath.parent, f).path)
|
||||
isLooping = loop
|
||||
prepare()
|
||||
start()
|
||||
}
|
||||
currentTrack = track
|
||||
} catch (e: IOException) {
|
||||
Log.e("cddaStart", "Cannot play $f", e)
|
||||
player.reset()
|
||||
}
|
||||
}
|
||||
|
||||
fun stop() {
|
||||
if (currentTrack > 0 && player.isPlaying) {
|
||||
player.stop()
|
||||
currentTrack = 0
|
||||
}
|
||||
}
|
||||
|
||||
fun currentPosition(): Int {
|
||||
if (currentTrack == 0)
|
||||
return 0
|
||||
val frames = player.currentPosition * 75 / 1000
|
||||
return currentTrack or (frames shl 8)
|
||||
}
|
||||
|
||||
fun onActivityStop() {
|
||||
if (currentTrack > 0 && player.isPlaying) {
|
||||
player.pause()
|
||||
playerPaused = true
|
||||
}
|
||||
}
|
||||
|
||||
fun onActivityResume() {
|
||||
if (playerPaused) {
|
||||
player.start()
|
||||
playerPaused = false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private class MidiPlayer {
|
||||
private val player = MediaPlayer()
|
||||
private var playing = false
|
||||
|
||||
@@ -17,11 +17,13 @@
|
||||
*/
|
||||
package io.github.kichikuou.xsystem35
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.os.Build
|
||||
import android.os.Handler
|
||||
import android.os.Message
|
||||
import android.util.Log
|
||||
import kotlinx.coroutines.DelicateCoroutinesApi
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.GlobalScope
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.withContext
|
||||
import java.io.*
|
||||
import java.lang.StringBuilder
|
||||
import java.nio.charset.Charset
|
||||
@@ -40,9 +42,6 @@ interface LauncherObserver {
|
||||
}
|
||||
|
||||
private const val SAVE_DIR = "save"
|
||||
private const val PROGRESS = 0
|
||||
private const val SUCCESS = 1
|
||||
private const val FAILURE = 2
|
||||
|
||||
class Launcher private constructor(private val rootDir: File) {
|
||||
companion object {
|
||||
@@ -74,31 +73,28 @@ class Launcher private constructor(private val rootDir: File) {
|
||||
updateGameList()
|
||||
}
|
||||
|
||||
@OptIn(DelicateCoroutinesApi::class)
|
||||
fun install(input: InputStream, archiveName: String?) {
|
||||
val dir = createDirForGame()
|
||||
@SuppressLint("HandlerLeak")
|
||||
val handler = object : Handler() {
|
||||
override fun handleMessage(msg: Message) {
|
||||
when (msg.what) {
|
||||
PROGRESS -> {
|
||||
observer?.onInstallProgress(msg.obj as String)
|
||||
}
|
||||
SUCCESS -> {
|
||||
isInstalling = false
|
||||
observer?.onInstallSuccess(msg.obj as File, archiveName)
|
||||
}
|
||||
FAILURE -> {
|
||||
isInstalling = false
|
||||
observer?.onInstallFailure(msg.obj as Int)
|
||||
isInstalling = true
|
||||
GlobalScope.launch(Dispatchers.Main) {
|
||||
try {
|
||||
withContext(Dispatchers.IO) {
|
||||
extractFiles(input, dir) { msg ->
|
||||
GlobalScope.launch(Dispatchers.Main) {
|
||||
observer?.onInstallProgress(msg)
|
||||
}
|
||||
}
|
||||
}
|
||||
observer?.onInstallSuccess(dir, archiveName)
|
||||
} catch (e: InstallFailureException) {
|
||||
observer?.onInstallFailure(e.msgId)
|
||||
} catch (e: Exception) {
|
||||
Log.e("launcher", "Failed to extract ZIP", e)
|
||||
observer?.onInstallFailure(R.string.zip_extraction_error)
|
||||
}
|
||||
isInstalling = false
|
||||
}
|
||||
val t = Thread {
|
||||
extractFiles(input, dir, handler)
|
||||
}
|
||||
t.start()
|
||||
isInstalling = true
|
||||
}
|
||||
|
||||
fun uninstall(id: Int) {
|
||||
@@ -183,32 +179,26 @@ class Launcher private constructor(private val rootDir: File) {
|
||||
}
|
||||
}
|
||||
|
||||
private fun extractFiles(input: InputStream, outDir: File, handler: Handler) {
|
||||
try {
|
||||
val configWriter = GameConfigWriter()
|
||||
val hadDecodeError = forEachZipEntry(input) { zipEntry, zip ->
|
||||
Log.i("extractFiles", zipEntry.name)
|
||||
val path = File(outDir, zipEntry.name)
|
||||
if (zipEntry.isDirectory)
|
||||
return@forEachZipEntry
|
||||
path.parentFile?.mkdirs()
|
||||
handler.sendMessage(handler.obtainMessage(PROGRESS, zipEntry.name))
|
||||
FileOutputStream(path).buffered().use {
|
||||
zip.copyTo(it)
|
||||
}
|
||||
configWriter.maybeAdd(zipEntry.name)
|
||||
private fun extractFiles(input: InputStream, outDir: File, progressCallback: (String) -> Unit) {
|
||||
val configWriter = GameConfigWriter()
|
||||
val hadDecodeError = forEachZipEntry(input) { zipEntry, zip ->
|
||||
Log.i("extractFiles", zipEntry.name)
|
||||
val path = File(outDir, zipEntry.name)
|
||||
if (zipEntry.isDirectory)
|
||||
return@forEachZipEntry
|
||||
path.parentFile?.mkdirs()
|
||||
progressCallback(zipEntry.name)
|
||||
FileOutputStream(path).buffered().use {
|
||||
zip.copyTo(it)
|
||||
}
|
||||
if (!configWriter.readyToWrite()) {
|
||||
val msgId = if (hadDecodeError) R.string.unsupported_zip else R.string.cannot_find_ald
|
||||
handler.sendMessage(handler.obtainMessage(FAILURE, msgId))
|
||||
return
|
||||
}
|
||||
configWriter.write(outDir)
|
||||
handler.sendMessage(handler.obtainMessage(SUCCESS, outDir))
|
||||
} catch (e: IOException) {
|
||||
Log.e("launcher", "Failed to extract ZIP", e)
|
||||
handler.sendMessage(handler.obtainMessage(FAILURE, R.string.zip_extraction_error))
|
||||
configWriter.maybeAdd(zipEntry.name)
|
||||
}
|
||||
if (!configWriter.readyToWrite()) {
|
||||
if (hadDecodeError)
|
||||
throw InstallFailureException(R.string.unsupported_zip)
|
||||
throw InstallFailureException(R.string.cannot_find_ald)
|
||||
}
|
||||
configWriter.write(outDir)
|
||||
}
|
||||
|
||||
// Xsystem35-sdl2 <=2.2.0 had a bug where playlist had an extra empty line at
|
||||
@@ -219,12 +209,14 @@ class Launcher private constructor(private val rootDir: File) {
|
||||
if (!oldPlaylist.exists())
|
||||
return
|
||||
var tracks = oldPlaylist.readLines()
|
||||
if (!tracks.isEmpty())
|
||||
if (tracks.isNotEmpty())
|
||||
tracks = tracks.subList(1, tracks.size)
|
||||
File(dir, PLAYLIST_FILE).writeText(tracks.joinToString("\n"))
|
||||
oldPlaylist.delete()
|
||||
}
|
||||
|
||||
class InstallFailureException(val msgId: Int) : Exception()
|
||||
|
||||
// A helper class which generates xsystem35.gr and playlist.txt in the game root directory.
|
||||
private class GameConfigWriter {
|
||||
private val grb = StringBuilder()
|
||||
|
||||
@@ -27,6 +27,7 @@ import android.view.Menu
|
||||
import android.view.MenuItem
|
||||
import android.widget.ArrayAdapter
|
||||
import android.widget.ListView
|
||||
import android.widget.TextView
|
||||
import android.widget.Toast
|
||||
import java.io.*
|
||||
|
||||
@@ -34,10 +35,11 @@ private const val CONTENT_TYPE_ZIP = "application/zip"
|
||||
private const val INSTALL_REQUEST = 1
|
||||
private const val SAVEDATA_EXPORT_REQUEST = 2
|
||||
private const val SAVEDATA_IMPORT_REQUEST = 3
|
||||
private const val STATE_PROGRESS_TEXT = "progressText"
|
||||
|
||||
class LauncherActivity : Activity(), LauncherObserver {
|
||||
private lateinit var launcher: Launcher
|
||||
private var progressDialog: ProgressDialogFragment? = null
|
||||
private var progressDialog: Dialog? = null
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
@@ -46,7 +48,7 @@ class LauncherActivity : Activity(), LauncherObserver {
|
||||
launcher = Launcher.getInstance(filesDir)
|
||||
launcher.observer = this
|
||||
if (launcher.isInstalling) {
|
||||
showProgressDialog()
|
||||
showProgressDialog(savedInstanceState)
|
||||
}
|
||||
|
||||
onGameListChange()
|
||||
@@ -61,9 +63,17 @@ class LauncherActivity : Activity(), LauncherObserver {
|
||||
|
||||
override fun onDestroy() {
|
||||
launcher.observer = null
|
||||
dismissProgressDialog()
|
||||
super.onDestroy()
|
||||
}
|
||||
|
||||
override fun onSaveInstanceState(outState: Bundle) {
|
||||
progressDialog?.let {
|
||||
outState.putCharSequence(STATE_PROGRESS_TEXT, it.findViewById<TextView>(R.id.text).text)
|
||||
}
|
||||
super.onSaveInstanceState(outState)
|
||||
}
|
||||
|
||||
private fun onListItemClick(position: Int) {
|
||||
if (position < launcher.games.size) {
|
||||
startGame(launcher.games[position].path, null)
|
||||
@@ -153,7 +163,7 @@ class LauncherActivity : Activity(), LauncherObserver {
|
||||
}
|
||||
|
||||
override fun onInstallProgress(path: String) {
|
||||
progressDialog?.setProgress(getString(R.string.install_progress, path))
|
||||
progressDialog?.findViewById<TextView>(R.id.text)?.text = getString(R.string.install_progress, path)
|
||||
}
|
||||
|
||||
override fun onInstallSuccess(path: File, archiveName: String?) {
|
||||
@@ -178,9 +188,17 @@ class LauncherActivity : Activity(), LauncherObserver {
|
||||
launcher.uninstall(id)
|
||||
}
|
||||
|
||||
private fun showProgressDialog() {
|
||||
progressDialog = ProgressDialogFragment()
|
||||
progressDialog!!.show(fragmentManager, "progress_dialog")
|
||||
private fun showProgressDialog(savedInstanceState: Bundle? = null) {
|
||||
progressDialog = Dialog(this)
|
||||
progressDialog!!.apply {
|
||||
setTitle(R.string.install_dialog_title)
|
||||
setCancelable(false)
|
||||
setContentView(R.layout.progress_dialog)
|
||||
savedInstanceState?.let {
|
||||
findViewById<TextView>(R.id.text)?.text = it.getCharSequence(STATE_PROGRESS_TEXT)
|
||||
}
|
||||
show()
|
||||
}
|
||||
}
|
||||
|
||||
private fun dismissProgressDialog() {
|
||||
@@ -209,18 +227,3 @@ class LauncherActivity : Activity(), LauncherObserver {
|
||||
return null
|
||||
}
|
||||
}
|
||||
|
||||
@Suppress("DEPRECATION") // for ProgressDialog
|
||||
class ProgressDialogFragment : DialogFragment() {
|
||||
private lateinit var dialog: ProgressDialog
|
||||
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
|
||||
dialog = ProgressDialog(activity)
|
||||
return dialog.apply {
|
||||
setTitle(R.string.install_dialog_title)
|
||||
setCancelable(true)
|
||||
}
|
||||
}
|
||||
fun setProgress(msg: String) {
|
||||
dialog.setMessage(msg)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:orientation="horizontal"
|
||||
android:padding="16dp"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<ProgressBar
|
||||
android:layout_marginEnd="8dp"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/text"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:textSize="16sp"/>
|
||||
</LinearLayout>
|
||||
@@ -1,7 +1,7 @@
|
||||
// Top-level build file where you can add configuration options common to all sub-projects/modules.
|
||||
|
||||
buildscript {
|
||||
ext.kotlin_version = '1.6.20'
|
||||
ext.kotlin_version = '1.7.21'
|
||||
repositories {
|
||||
mavenCentral()
|
||||
google()
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
#cmakedefine PACKAGE "@PACKAGE@"
|
||||
#define VERSION "2.8.0"
|
||||
#define VERSION "2.9.1"
|
||||
|
||||
#cmakedefine CMAKE_SYSTEM_NAME "@CMAKE_SYSTEM_NAME@"
|
||||
|
||||
|
||||
@@ -22,7 +22,7 @@ Game Compatibility
|
||||
| DALK | Supported | From ALICEの館4・5・6 |
|
||||
| 闘神都市 | Supported | From ALICEの館4・5・6 |
|
||||
| Dr.STOP | Supported | From ALICEの館4・5・6 |
|
||||
| 人間狩り | Unsupported | From ALICEの館4・5・6 / アリスCD |
|
||||
| 人間狩り | Supported | From ALICEの館4・5・6 / アリスCD |
|
||||
| 女の子図鑑 | Unknown | From ALICEの館4・5・6 |
|
||||
| 恋のおわり | Unknown | |
|
||||
| 王道勇者 | Supported | |
|
||||
@@ -71,13 +71,13 @@ Game Compatibility
|
||||
| [扉] | Supported | From アリスCD |
|
||||
| 叩き殺し太郎 | Supported | From アリスCD |
|
||||
| バルーンぽっぷ | Supported | From アリスCD |
|
||||
| 高速ひよこ2 | Unsupported | From アリスCD |
|
||||
| 高速ひよこ2 | Supported | From アリスCD |
|
||||
| おせろっと | Supported | From アリスCD |
|
||||
| マスカレイド | Supported | From アリスCD |
|
||||
| キャロル ~聖なる鐘が響く夜~ | Supported | From アリスCD, Online match is not supported |
|
||||
| できるかなー? | Supported | From アリスCD |
|
||||
| Child Assassin | Supported | From アリスCD |
|
||||
| Klavier | Supported | From アリスCD |
|
||||
| 弱肉狂食 | Unsupported | From アリスCD |
|
||||
| 弱肉狂食 | Supported | From アリスCD |
|
||||
| 眼鏡大戦2 | Supported | From アリスCD |
|
||||
| 妄想くん | Supported | From アリスCD |
|
||||
|
||||
@@ -7,7 +7,6 @@
|
||||
#include "menu.h"
|
||||
#include "input.h"
|
||||
#include "nact.h"
|
||||
#include "key.h"
|
||||
#include "night.h"
|
||||
#include "sprite.h"
|
||||
|
||||
@@ -33,7 +32,7 @@ static void cb_waitkey_simple(agsevent_t *e) {
|
||||
switch (e->type) {
|
||||
case AGSEVENT_BUTTON_RELEASE:
|
||||
case AGSEVENT_KEY_RELEASE:
|
||||
night.waitkey = e->d3;
|
||||
night.waitkey = e->code;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -59,15 +58,15 @@ void ntev_callback(agsevent_t *e) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (e->type == AGSEVENT_KEY_PRESS && e->d3 == KEY_CTRL) {
|
||||
if (e->type == AGSEVENT_KEY_PRESS && e->code == KEY_CTRL) {
|
||||
night.waitskiplv = 2;
|
||||
night.waitkey = e->d3;
|
||||
night.waitkey = e->code;
|
||||
return;
|
||||
}
|
||||
|
||||
if (e->type == AGSEVENT_KEY_RELEASE && e->d3 == KEY_CTRL) {
|
||||
if (e->type == AGSEVENT_KEY_RELEASE && e->code == KEY_CTRL) {
|
||||
night.waitskiplv = 0;
|
||||
night.waitkey = e->d3;
|
||||
night.waitkey = e->code;
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -392,13 +392,11 @@ static void is_in_icon() {
|
||||
|
||||
|
||||
static void cb_keyrelease(agsevent_t *e) {
|
||||
int x = e->d1, y = e->d2;
|
||||
|
||||
switch (e->d3) {
|
||||
switch (e->code) {
|
||||
case AGSEVENT_BUTTON_LEFT:
|
||||
#if 0
|
||||
if (is_in_icon()) {
|
||||
do_icon(x, y);
|
||||
do_icon(e->mousex, e->mousey);
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
@@ -408,19 +406,15 @@ static void cb_keyrelease(agsevent_t *e) {
|
||||
// unhide();
|
||||
break;
|
||||
}
|
||||
night.waitkey = e->d3;
|
||||
night.waitkey = e->code;
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static void cb_mousemove(agsevent_t *e) {
|
||||
int x = e->d1, y = e->d2;
|
||||
|
||||
// 音声mute/メッセージスキップ/メッセージ枠消去の領域に
|
||||
// マウスが移動したら、その部分のアイコンを変化させる
|
||||
|
||||
|
||||
}
|
||||
|
||||
// メッセージ表示時に、キー入力を促すアニメーションの設定
|
||||
|
||||
@@ -25,6 +25,9 @@
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#ifdef __EMSCRIPTEN__
|
||||
#include <emscripten.h>
|
||||
#endif
|
||||
|
||||
#include "portab.h"
|
||||
#include "system.h"
|
||||
|
||||
@@ -33,7 +33,6 @@
|
||||
#include "menu.h"
|
||||
#include "input.h"
|
||||
#include "nact.h"
|
||||
#include "key.h"
|
||||
#include "sact.h"
|
||||
#include "sprite.h"
|
||||
#include "ngraph.h"
|
||||
|
||||
+16
-14
@@ -24,6 +24,9 @@
|
||||
#include "config.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#ifdef __EMSCRIPTEN__
|
||||
#include <emscripten.h>
|
||||
#endif
|
||||
|
||||
#include "portab.h"
|
||||
#include "system.h"
|
||||
@@ -31,7 +34,6 @@
|
||||
#include "menu.h"
|
||||
#include "input.h"
|
||||
#include "nact.h"
|
||||
#include "key.h"
|
||||
#include "sact.h"
|
||||
#include "sprite.h"
|
||||
#include "sactsound.h"
|
||||
@@ -210,7 +212,7 @@ static void cb_waitkey_simple(agsevent_t *e) {
|
||||
|
||||
switch (e->type) {
|
||||
case AGSEVENT_KEY_PRESS:
|
||||
if (e->d3 == KEY_Z) {
|
||||
if (e->code == KEY_Z) {
|
||||
cur = sdl_getTicks();
|
||||
if (!sact.zhiding) {
|
||||
slist_foreach(sact.sp_zhide, cb_defocused_zkey, &update);
|
||||
@@ -239,7 +241,7 @@ static void cb_waitkey_simple(agsevent_t *e) {
|
||||
// fall through
|
||||
|
||||
case AGSEVENT_KEY_RELEASE:
|
||||
switch(e->d3) {
|
||||
switch(e->code) {
|
||||
case KEY_Z:
|
||||
cur = sdl_getTicks();
|
||||
if (500 < (cur - sact.zofftime) || !sact.zdooff) {
|
||||
@@ -255,7 +257,7 @@ static void cb_waitkey_simple(agsevent_t *e) {
|
||||
sact.waittype = KEYWAIT_BACKLOG;
|
||||
break;
|
||||
default:
|
||||
sact.waitkey = e->d3;
|
||||
sact.waitkey = e->code;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -289,7 +291,7 @@ void cb_waitkey_sprite(agsevent_t *e) {
|
||||
// 右クリックキャンセル
|
||||
// drag中でない時のみ、キャンセルを受け付ける
|
||||
if (e->type == AGSEVENT_BUTTON_RELEASE &&
|
||||
e->d3 == AGSEVENT_BUTTON_RIGHT) {
|
||||
e->code == AGSEVENT_BUTTON_RIGHT) {
|
||||
sact.waitkey = 0;
|
||||
return;
|
||||
}
|
||||
@@ -308,7 +310,7 @@ void cb_waitkey_sprite(agsevent_t *e) {
|
||||
// dragg中の sprite は無視する
|
||||
if (sp == sact.draggedsp) continue;
|
||||
|
||||
if (focused_sp == NULL && sp_is_insprite(sp, e->d1, e->d2)) {
|
||||
if (focused_sp == NULL && sp_is_insprite(sp, e->mousex, e->mousey)) {
|
||||
/*
|
||||
focusを得ている sprite
|
||||
*/
|
||||
@@ -385,8 +387,8 @@ static void cb_waitkey_selection(agsevent_t *e) {
|
||||
static void cb_waitkey_backlog(agsevent_t *e) {
|
||||
switch (e->type) {
|
||||
case AGSEVENT_KEY_RELEASE:
|
||||
switch (e->d3) {
|
||||
case KEY_ESC:
|
||||
switch (e->code) {
|
||||
case KEY_ESCAPE:
|
||||
sblog_end();
|
||||
sact.waittype = KEYWAIT_MESSAGE;
|
||||
break;
|
||||
@@ -406,14 +408,14 @@ static void cb_waitkey_backlog(agsevent_t *e) {
|
||||
break;
|
||||
|
||||
case AGSEVENT_BUTTON_RELEASE:
|
||||
if (e->d3 == AGSEVENT_BUTTON_RIGHT) {
|
||||
if (e->code == AGSEVENT_BUTTON_RIGHT) {
|
||||
sblog_end();
|
||||
sact.waittype = KEYWAIT_MESSAGE;
|
||||
}
|
||||
break;
|
||||
|
||||
case AGSEVENT_MOUSE_WHEEL:
|
||||
if (e->d3 > 0)
|
||||
if (e->code > 0)
|
||||
sblog_pagenext();
|
||||
else
|
||||
sblog_pagepre();
|
||||
@@ -431,15 +433,15 @@ void spev_callback(agsevent_t *e) {
|
||||
}
|
||||
|
||||
if (sact.waittype != KEYWAIT_BACKLOG) {
|
||||
if (e->type == AGSEVENT_KEY_PRESS && e->d3 == KEY_CTRL) {
|
||||
if (e->type == AGSEVENT_KEY_PRESS && e->code == KEY_CTRL) {
|
||||
sact.waitskiplv = 2;
|
||||
sact.waitkey = e->d3;
|
||||
sact.waitkey = e->code;
|
||||
return;
|
||||
}
|
||||
|
||||
if (e->type == AGSEVENT_KEY_RELEASE && e->d3 == KEY_CTRL) {
|
||||
if (e->type == AGSEVENT_KEY_RELEASE && e->code == KEY_CTRL) {
|
||||
sact.waitskiplv = 0;
|
||||
sact.waitkey = e->d3;
|
||||
sact.waitkey = e->code;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -58,12 +58,12 @@ static int eventCB_GET(sprite_t *sp, agsevent_t *e) {
|
||||
|
||||
switch(e->type) {
|
||||
case AGSEVENT_BUTTON_PRESS:
|
||||
if (e->d3 != AGSEVENT_BUTTON_LEFT) break;
|
||||
if (e->code != AGSEVENT_BUTTON_LEFT) break;
|
||||
|
||||
// drag開始時のマウスの位置記録
|
||||
sp->u.get.dragging = TRUE;
|
||||
sp->u.get.dragstart.x = e->d1;
|
||||
sp->u.get.dragstart.y = e->d2;
|
||||
sp->u.get.dragstart.x = e->mousex;
|
||||
sp->u.get.dragstart.y = e->mousey;
|
||||
|
||||
if (sp->cg3) {
|
||||
sp->curcg = sp->cg3;
|
||||
@@ -104,8 +104,8 @@ static int eventCB_GET(sprite_t *sp, agsevent_t *e) {
|
||||
// if (!sp->u.get.dragging) break;
|
||||
|
||||
// マウスの現在位置により新しい場所を計算
|
||||
newx = sp->loc.x + (e->d1 - sp->u.get.dragstart.x);
|
||||
newy = sp->loc.y + (e->d2 - sp->u.get.dragstart.y);
|
||||
newx = sp->loc.x + (e->mousex - sp->u.get.dragstart.x);
|
||||
newy = sp->loc.y + (e->mousey - sp->u.get.dragstart.y);
|
||||
if (newx != sp->cur.x || newy != sp->cur.y) {
|
||||
sp_updateme(sp);
|
||||
sp->cur.x = newx;
|
||||
|
||||
@@ -135,13 +135,13 @@ int sp_keywait(int *vOK, int *vRND, int *vD01, int *vD02, int *vD03, int timeout
|
||||
{
|
||||
// とりあえず、現在のマウス位置を送って、switch sprite の
|
||||
// 状態を更新しておく
|
||||
agsevent_t agse;
|
||||
MyPoint p;
|
||||
sys_getMouseInfo(&p, FALSE);
|
||||
agse.type = AGSEVENT_MOUSE_MOTION;
|
||||
agse.d1 = p.x;
|
||||
agse.d2 = p.y;
|
||||
agse.d3 = 0;
|
||||
agsevent_t agse = {
|
||||
.type = AGSEVENT_MOUSE_MOTION,
|
||||
.mousex = p.x,
|
||||
.mousey = p.y
|
||||
};
|
||||
spev_callback(&agse);
|
||||
}
|
||||
|
||||
|
||||
@@ -40,7 +40,7 @@ static int eventCB_PUT(sprite_t *sp, agsevent_t *e) {
|
||||
|
||||
switch(e->type) {
|
||||
case AGSEVENT_BUTTON_PRESS:
|
||||
if (e->d3 != AGSEVENT_BUTTON_LEFT) return 0;
|
||||
if (e->code != AGSEVENT_BUTTON_LEFT) return 0;
|
||||
|
||||
// ボタン押下時のスプライトがあれば、それを表示
|
||||
if (sp->cg3) {
|
||||
|
||||
@@ -31,7 +31,6 @@
|
||||
#include "nact.h"
|
||||
#include "ags.h"
|
||||
#include "input.h"
|
||||
#include "key.h"
|
||||
#include "sact.h"
|
||||
#include "sprite.h"
|
||||
#include "ngraph.h"
|
||||
@@ -77,7 +76,7 @@ static boolean sp_is_insprite2(sprite_t *sp, int x, int y, int margin) {
|
||||
|
||||
// マウスが移動したときの callback
|
||||
static void cb_select_move(agsevent_t *e) {
|
||||
int x = e->d1, y = e->d2;
|
||||
int x = e->mousex, y = e->mousey;
|
||||
sprite_t *sp = sact.sp[sact.sel.spno];
|
||||
boolean newstate;
|
||||
int newindex;
|
||||
@@ -115,12 +114,12 @@ static void cb_select_move(agsevent_t *e) {
|
||||
|
||||
// ボタンがリリースされたときの callback
|
||||
static void cb_select_release(agsevent_t *e) {
|
||||
int x = e->d1, y = e->d2;
|
||||
int x = e->mousex, y = e->mousey;
|
||||
sprite_t *sp = sact.sp[sact.sel.spno];
|
||||
boolean st;
|
||||
int iy;
|
||||
|
||||
switch (e->d3) {
|
||||
switch (e->code) {
|
||||
case AGSEVENT_BUTTON_LEFT:
|
||||
st = sp_is_insprite2(sp, x, y, sact.sel.frame_dot);
|
||||
iy = (y - (sp->cur.y + sact.sel.frame_dot)) / (sact.sel.font_size + sact.sel.linespace);
|
||||
|
||||
@@ -41,7 +41,7 @@ static int eventCB_switch(sprite_t *sp, agsevent_t *e) {
|
||||
|
||||
switch(e->type) {
|
||||
case AGSEVENT_BUTTON_PRESS:
|
||||
if (e->d3 != AGSEVENT_BUTTON_LEFT) return 0;
|
||||
if (e->code != AGSEVENT_BUTTON_LEFT) return 0;
|
||||
|
||||
// ボタン押下時のスプライトがあれば、それを表示
|
||||
if (sp->cg3) {
|
||||
@@ -53,7 +53,7 @@ static int eventCB_switch(sprite_t *sp, agsevent_t *e) {
|
||||
break;
|
||||
|
||||
case AGSEVENT_BUTTON_RELEASE:
|
||||
if (e->d3 != AGSEVENT_BUTTON_LEFT) return 0;
|
||||
if (e->code != AGSEVENT_BUTTON_LEFT) return 0;
|
||||
|
||||
// ここにくるときは forcusが当たっているときしかこないので、
|
||||
// curcg は cg2 に戻せばよい
|
||||
|
||||
@@ -37,6 +37,7 @@
|
||||
#include "ags.h"
|
||||
#include "music.h"
|
||||
#include "sdl_core.h"
|
||||
#include "hacks.h"
|
||||
|
||||
#define SLOT 40
|
||||
|
||||
@@ -166,14 +167,14 @@ static void ChangeNotColor() {
|
||||
case 24:
|
||||
case 32:
|
||||
{
|
||||
uint32_t pic24s = PIX24(*src, *(src+1), *(src+2)) & 0xf0f0f0;
|
||||
uint32_t pic24d = PIX24(*dst, *(dst+1), *(dst+2)) & 0xf0f0f0;
|
||||
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 & 0xf0f0f0) != pic24s) {
|
||||
if (*yl != pic24s) {
|
||||
*yl = pic24d;
|
||||
}
|
||||
yl++;
|
||||
@@ -182,6 +183,9 @@ static void ChangeNotColor() {
|
||||
break;
|
||||
}
|
||||
}
|
||||
// The CX command after ChangeNotColor (in FIGHT.ADV) must use a precise
|
||||
// calculation.
|
||||
daiakuji_cx_hack = true;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -585,14 +589,14 @@ static void copy_sprite(int sx, int sy, int width, int height, int dx, int dy, i
|
||||
case 24:
|
||||
case 32:
|
||||
{
|
||||
uint32_t pic24 = PIX24(r, g, b) & 0xf0f0f0;
|
||||
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 & 0xf0f0f0) != pic24) {
|
||||
if (*yls != pic24) {
|
||||
*yld = *yls;
|
||||
}
|
||||
yls++; yld++;
|
||||
|
||||
@@ -37,6 +37,7 @@
|
||||
#include "modules.h"
|
||||
#include "sdl_core.h"
|
||||
#include "sdl_private.h"
|
||||
#include "input.h"
|
||||
#include "menu.h"
|
||||
|
||||
// キー変換テーブル
|
||||
@@ -162,7 +163,7 @@ static void GetKeyStatus(void) {
|
||||
}
|
||||
|
||||
*var = 0;
|
||||
for (i = 0; i < 256; i++) {
|
||||
for (i = 0; i < NUM_KEYCODES; i++) {
|
||||
*var |= (keymap[no -1][i] * RawKeyInfo[i]);
|
||||
}
|
||||
|
||||
|
||||
@@ -140,7 +140,7 @@ void gr_drawimage16(surface_t *ds, cgdata *cg, int x, int y) {
|
||||
yl = (uint32_t *)(dp + y * ds->bytes_per_line);
|
||||
for (x = 0; x < dw; x++) {
|
||||
pic16 = *sp;
|
||||
*yl = PIX24(PIXR16(pic16), PIXG16(pic16), PIXB16(pic16));
|
||||
*yl = rgb565_to_rgb888(pic16);
|
||||
yl++; sp++;
|
||||
}
|
||||
sp += (cg->width - dw);
|
||||
|
||||
+2
-7
@@ -84,6 +84,7 @@ if (EMSCRIPTEN)
|
||||
"SHELL:-s USE_ZLIB=1"
|
||||
"SHELL:-s USE_SDL=2"
|
||||
"SHELL:-s USE_SDL_TTF=2")
|
||||
target_compile_options(src_lib PRIVATE ${LIBS})
|
||||
target_compile_options(xsystem35 PRIVATE ${LIBS})
|
||||
target_link_options(xsystem35 PRIVATE ${LIBS})
|
||||
target_link_libraries(xsystem35 PRIVATE idbfs.js)
|
||||
@@ -99,6 +100,7 @@ if (EMSCRIPTEN)
|
||||
"SHELL:-s ASYNCIFY_ADD=commands2F60,nact_main,send_agsevent,cb_waitkey_sprite"
|
||||
"SHELL:-s ALLOW_MEMORY_GROWTH=1"
|
||||
"SHELL:-s NO_EXIT_RUNTIME=1"
|
||||
"SHELL:-s EXPORTED_FUNCTIONS=_main,_malloc"
|
||||
"SHELL:-s EXPORTED_RUNTIME_METHODS=getValue,addRunDependency,removeRunDependency")
|
||||
|
||||
elseif (ANDROID)
|
||||
@@ -140,10 +142,3 @@ else() # non-emscripten, non-android
|
||||
add_test(NAME src_tests COMMAND src_tests)
|
||||
configure_file(testdata/test.gr ${CMAKE_CURRENT_BINARY_DIR}/testdata/test.gr COPYONLY)
|
||||
endif()
|
||||
|
||||
# FIXME: set up dependency for xsystem35 on this
|
||||
if (NOT EMSCRIPTEN AND NOT ANDROID)
|
||||
add_custom_target(sdl_keytable.h
|
||||
COMMAND perl ../tools/xsyskey.pl ${SDL2_INCLUDE_DIRS} > sdl_keytable.h
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
|
||||
endif()
|
||||
|
||||
@@ -78,24 +78,27 @@ typedef struct agsurface agsurface_t;
|
||||
// for SDL_surface
|
||||
#define PIXEL_AT(suf, x, y) ((suf)->pixels + (y) * (suf)->pitch + (x) * (suf)->format->BytesPerPixel)
|
||||
|
||||
struct _agsevent {
|
||||
typedef struct {
|
||||
int type;
|
||||
int d1, d2, d3;
|
||||
int code;
|
||||
int mousex, mousey;
|
||||
} agsevent_t;
|
||||
|
||||
enum agsevent_type {
|
||||
AGSEVENT_MOUSE_MOTION,
|
||||
AGSEVENT_BUTTON_PRESS,
|
||||
AGSEVENT_BUTTON_RELEASE,
|
||||
AGSEVENT_KEY_PRESS,
|
||||
AGSEVENT_KEY_RELEASE,
|
||||
AGSEVENT_TIMER,
|
||||
AGSEVENT_MOUSE_WHEEL,
|
||||
};
|
||||
typedef struct _agsevent agsevent_t;
|
||||
|
||||
|
||||
#define AGSEVENT_MOUSE_MOTION 1
|
||||
#define AGSEVENT_BUTTON_PRESS 2
|
||||
#define AGSEVENT_BUTTON_RELEASE 3
|
||||
#define AGSEVENT_KEY_PRESS 4
|
||||
#define AGSEVENT_KEY_RELEASE 5
|
||||
#define AGSEVENT_TIMER 6
|
||||
#define AGSEVENT_MOUSE_WHEEL 7
|
||||
|
||||
#define AGSEVENT_BUTTON_LEFT 1
|
||||
#define AGSEVENT_BUTTON_MID 2
|
||||
#define AGSEVENT_BUTTON_RIGHT 3
|
||||
enum agsevent_button {
|
||||
AGSEVENT_BUTTON_LEFT,
|
||||
AGSEVENT_BUTTON_MID,
|
||||
AGSEVENT_BUTTON_RIGHT,
|
||||
};
|
||||
|
||||
enum mouse_warp_mode {
|
||||
MOUSE_WARP_DISABLED,
|
||||
|
||||
@@ -1,102 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2020 <KichikuouChrome@gmail.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#include <SDL.h>
|
||||
#include <jni.h>
|
||||
#include "system.h"
|
||||
#include "portab.h"
|
||||
#include "cdrom.h"
|
||||
|
||||
static int cdrom_init(char *);
|
||||
static int cdrom_exit(void);
|
||||
static int cdrom_reset(void);
|
||||
static int cdrom_start(int, int);
|
||||
static int cdrom_stop();
|
||||
static int cdrom_getPlayingInfo(cd_time *);
|
||||
|
||||
#define cdrom cdrom_android
|
||||
cdromdevice_t cdrom = {
|
||||
cdrom_init,
|
||||
cdrom_exit,
|
||||
cdrom_reset,
|
||||
cdrom_start,
|
||||
cdrom_stop,
|
||||
cdrom_getPlayingInfo,
|
||||
NULL,
|
||||
NULL
|
||||
};
|
||||
|
||||
int cdrom_init(char *name) {
|
||||
return OK;
|
||||
}
|
||||
|
||||
int cdrom_reset(void) {
|
||||
cdrom_stop();
|
||||
return OK;
|
||||
}
|
||||
|
||||
int cdrom_exit(void) {
|
||||
cdrom_stop();
|
||||
return OK;
|
||||
}
|
||||
|
||||
int cdrom_start(int trk, int loop) {
|
||||
JNIEnv *env = SDL_AndroidGetJNIEnv();
|
||||
if ((*env)->PushLocalFrame(env, 16) < 0) {
|
||||
WARNING("Failed to allocate JVM local references");
|
||||
return NG;
|
||||
}
|
||||
jobject context = SDL_AndroidGetActivity();
|
||||
jmethodID mid = (*env)->GetMethodID(env, (*env)->GetObjectClass(env, context),
|
||||
"cddaStart", "(IZ)V");
|
||||
(*env)->CallVoidMethod(env, context, mid, trk, loop == 0);
|
||||
(*env)->PopLocalFrame(env, NULL);
|
||||
return OK;
|
||||
}
|
||||
|
||||
int cdrom_stop() {
|
||||
JNIEnv *env = SDL_AndroidGetJNIEnv();
|
||||
if ((*env)->PushLocalFrame(env, 16) < 0) {
|
||||
WARNING("Failed to allocate JVM local references");
|
||||
return NG;
|
||||
}
|
||||
jobject context = SDL_AndroidGetActivity();
|
||||
jmethodID mid = (*env)->GetMethodID(env, (*env)->GetObjectClass(env, context),
|
||||
"cddaStop", "()V");
|
||||
(*env)->CallVoidMethod(env, context, mid);
|
||||
(*env)->PopLocalFrame(env, NULL);
|
||||
return OK;
|
||||
}
|
||||
|
||||
int cdrom_getPlayingInfo (cd_time *info) {
|
||||
JNIEnv *env = SDL_AndroidGetJNIEnv();
|
||||
if ((*env)->PushLocalFrame(env, 16) < 0) {
|
||||
WARNING("Failed to allocate JVM local references");
|
||||
return NG;
|
||||
}
|
||||
jobject context = SDL_AndroidGetActivity();
|
||||
jmethodID mid = (*env)->GetMethodID(env, (*env)->GetObjectClass(env, context),
|
||||
"cddaCurrentPosition", "()I");
|
||||
int t = (*env)->CallIntMethod(env, context, mid);
|
||||
(*env)->PopLocalFrame(env, NULL);
|
||||
|
||||
info->t = t & 0xff;
|
||||
FRAMES_TO_MSF(t >> 8, &info->m, &info->s, &info->f);
|
||||
return OK;
|
||||
}
|
||||
+2
-6
@@ -43,10 +43,6 @@ extern cdromdevice_t cdrom_bsd;
|
||||
extern cdromdevice_t cdrom_emscripten;
|
||||
#define NATIVE_CD_DEVICE &cdrom_emscripten
|
||||
|
||||
#elif defined(ENABLE_CDROM_ANDROID)
|
||||
extern cdromdevice_t cdrom_android;
|
||||
#define NATIVE_CD_DEVICE &cdrom_android
|
||||
|
||||
#else
|
||||
|
||||
extern cdromdevice_t cdrom_empty;
|
||||
@@ -58,7 +54,7 @@ extern cdromdevice_t cdrom_mp3;
|
||||
#endif
|
||||
|
||||
cdromdevice_t *cd_init(const char *dev) {
|
||||
#if defined(ENABLE_CDROM_EMSCRIPTEN) || defined(ENABLE_CDROM_ANDROID)
|
||||
#if defined(ENABLE_CDROM_EMSCRIPTEN)
|
||||
return NATIVE_CD_DEVICE;
|
||||
#else
|
||||
struct stat st;
|
||||
@@ -71,5 +67,5 @@ cdromdevice_t *cd_init(const char *dev) {
|
||||
WARNING("no cdrom device available");
|
||||
return NULL;
|
||||
#endif
|
||||
#endif // ENABLE_CDROM_EMSCRIPTEN || ENABLE_CDROM_ANDROID
|
||||
#endif // ENABLE_CDROM_EMSCRIPTEN
|
||||
}
|
||||
|
||||
+21
-29
@@ -27,39 +27,10 @@
|
||||
|
||||
static int frame_of_getpos = -1;
|
||||
|
||||
static int cdrom_init(char *);
|
||||
static int cdrom_exit(void);
|
||||
static int cdrom_reset(void);
|
||||
extern int cdrom_start(int, int);
|
||||
extern int cdrom_stop();
|
||||
static int cdrom_getPlayingInfo(cd_time *);
|
||||
|
||||
#define cdrom cdrom_emscripten
|
||||
cdromdevice_t cdrom = {
|
||||
cdrom_init,
|
||||
cdrom_exit,
|
||||
cdrom_reset,
|
||||
cdrom_start,
|
||||
cdrom_stop,
|
||||
cdrom_getPlayingInfo,
|
||||
NULL,
|
||||
NULL
|
||||
};
|
||||
|
||||
int cdrom_init(char *name) {
|
||||
return OK;
|
||||
}
|
||||
|
||||
int cdrom_exit(void) {
|
||||
cdrom_stop();
|
||||
return OK;
|
||||
}
|
||||
|
||||
int cdrom_reset(void) {
|
||||
cdrom_stop();
|
||||
return OK;
|
||||
}
|
||||
|
||||
EM_JS(int, cdrom_start, (int trk, int loop), {
|
||||
xsystem35.cdPlayer.play(trk, loop == 0 ? 1 : 0);
|
||||
return xsystem35.Status.OK;
|
||||
@@ -70,6 +41,16 @@ EM_JS(int, cdrom_stop, (), {
|
||||
return xsystem35.Status.OK;
|
||||
});
|
||||
|
||||
int cdrom_exit(void) {
|
||||
cdrom_stop();
|
||||
return OK;
|
||||
}
|
||||
|
||||
int cdrom_reset(void) {
|
||||
cdrom_stop();
|
||||
return OK;
|
||||
}
|
||||
|
||||
int cdrom_getPlayingInfo(cd_time *info) {
|
||||
if (nact->frame_count == frame_of_getpos)
|
||||
nact->wait_vsync = TRUE;
|
||||
@@ -82,3 +63,14 @@ int cdrom_getPlayingInfo(cd_time *info) {
|
||||
FRAMES_TO_MSF(t >> 8, &info->m, &info->s, &info->f);
|
||||
return OK;
|
||||
}
|
||||
|
||||
cdromdevice_t cdrom_emscripten = {
|
||||
cdrom_init,
|
||||
cdrom_exit,
|
||||
cdrom_reset,
|
||||
cdrom_start,
|
||||
cdrom_stop,
|
||||
cdrom_getPlayingInfo,
|
||||
NULL,
|
||||
NULL
|
||||
};
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
#include "qnt.h"
|
||||
#include "jpeg.h"
|
||||
#include "ald_manager.h"
|
||||
#include "savedata.h"
|
||||
#include "filecheck.h"
|
||||
#include "cache.h"
|
||||
|
||||
/* VSPのパレット展開バンク */
|
||||
@@ -391,6 +391,41 @@ void cg_load_with_alpha(int cgno, int shadowno) {
|
||||
clear_display_loc();
|
||||
}
|
||||
|
||||
static uint8_t* load_cg_from_file(char *fname_utf8, int *status, long *filesize) {
|
||||
int size;
|
||||
FILE *fp;
|
||||
static uint8_t *tmp;
|
||||
|
||||
*status = 0;
|
||||
|
||||
if (NULL == (fp = fc_open(fname_utf8, 'r'))) {
|
||||
*status = SAVE_LOADERR; return NULL;
|
||||
}
|
||||
|
||||
fseek(fp, 0L, SEEK_END);
|
||||
*filesize = ftell(fp);
|
||||
if (*filesize == 0) {
|
||||
*status = SAVE_LOADERR; return NULL;
|
||||
}
|
||||
|
||||
tmp = (char *)malloc(*filesize);
|
||||
if (tmp == NULL) {
|
||||
WARNING("Out of memory");
|
||||
*status = SAVE_LOADERR; return NULL;
|
||||
}
|
||||
fseek(fp, 0L, SEEK_SET);
|
||||
size = fread(tmp, 1, *filesize,fp);
|
||||
|
||||
if (size != *filesize) {
|
||||
*status = SAVE_LOADSHORTAGE;
|
||||
} else {
|
||||
*status = SAVE_LOADOK;
|
||||
}
|
||||
|
||||
fclose(fp);
|
||||
return tmp;
|
||||
}
|
||||
|
||||
/*
|
||||
* Load and display cg from file 'name' (not cached right now)
|
||||
* name: file name to be read
|
||||
@@ -405,7 +440,7 @@ int cg_load_with_filename(char *fname_utf8, int x, int y) {
|
||||
cgdata *cg = NULL;
|
||||
MyPoint p;
|
||||
|
||||
data = load_cg_with_file(fname_utf8, &status, &filesize);
|
||||
data = load_cg_from_file(fname_utf8, &status, &filesize);
|
||||
if (data == NULL) return status;
|
||||
|
||||
cg_set_display_location(x, y, OFFSET_ABSOLUTE_GC);
|
||||
|
||||
@@ -87,4 +87,11 @@ extern int cg_fflg;
|
||||
extern int *cg_loadCountVar;
|
||||
extern int cg_brightness;
|
||||
|
||||
static inline uint32_t rgb565_to_rgb888(uint16_t rgb) {
|
||||
uint32_t r = rgb >> 11;
|
||||
uint32_t g = (rgb >> 5) & 0x3f;
|
||||
uint32_t b = rgb & 0x1f;
|
||||
return (r << 19) | (r >> 2 << 16) | (g << 10) | (g >> 4 << 8) | (b << 3) | (b >> 2);
|
||||
}
|
||||
|
||||
#endif /* !__CG__ */
|
||||
|
||||
+18
-12
@@ -65,35 +65,41 @@ static fncall_table fnctbl[FCTBL_MAX];
|
||||
|
||||
void commands2F00() {
|
||||
/* テキストカラーをスタックからポップして設定する */
|
||||
sl_popState(TxxTEXTCOLOR);
|
||||
sl_popState(STACK_TEXTCOLOR);
|
||||
DEBUG_COMMAND("TOC:");
|
||||
}
|
||||
|
||||
void commands2F01() {
|
||||
/* テキストフォントサイズをスタックからポップして設定する */
|
||||
sl_popState(TxxTEXTSIZE);
|
||||
sl_popState(STACK_TEXTSIZE);
|
||||
DEBUG_COMMAND("TOS:");
|
||||
}
|
||||
|
||||
void commands2F02() {
|
||||
/* 現在のテキストカラーをスタックにプッシュする */
|
||||
int exp = getCaliValue();
|
||||
int val = exp == 0 ? nact->msg.MsgFontColor : nact->sel.MsgFontColor;
|
||||
sl_pushState(TxxTEXTCOLOR, exp, val);
|
||||
int type = getCaliValue();
|
||||
switch (type) {
|
||||
case 0: sl_pushTextColor(type, nact->msg.MsgFontColor); break;
|
||||
case 1: sl_pushTextColor(type, nact->sel.MsgFontColor); break;
|
||||
default: WARNING("TPC: unknown type %d", type); break;
|
||||
}
|
||||
DEBUG_COMMAND("TPC %d", exp);
|
||||
}
|
||||
|
||||
void commands2F03() {
|
||||
/* 現在のテキストフォントサイズをスタックにプッシュする */
|
||||
int exp = getCaliValue();
|
||||
int val = exp == 0 ? nact->msg.MsgFontSize : nact->sel.MsgFontSize;
|
||||
sl_pushState(TxxTEXTSIZE, exp, val);
|
||||
int type = getCaliValue();
|
||||
switch (type) {
|
||||
case 0: sl_pushTextSize(type, nact->msg.MsgFontSize); break;
|
||||
case 1: sl_pushTextSize(type, nact->sel.MsgFontSize); break;
|
||||
default: WARNING("TPS: unknown type %d", type); break;
|
||||
}
|
||||
DEBUG_COMMAND("TPS %d", exp);
|
||||
}
|
||||
|
||||
void commands2F04() {
|
||||
/* テキスト表示位置をスタックからポップして設定する */
|
||||
sl_popState(TxxTEXTLOC);
|
||||
sl_popState(STACK_TEXTLOC);
|
||||
DEBUG_COMMAND("TOP:");
|
||||
}
|
||||
|
||||
@@ -101,7 +107,7 @@ void commands2F05() {
|
||||
/* 現在のテキスト表示位置をスタックにプッシュする */
|
||||
MyPoint loc;
|
||||
msg_getMessageLocation(&loc);
|
||||
sl_pushState(TxxTEXTLOC, loc.x, loc.y);
|
||||
sl_pushTextLoc(loc.x, loc.y);
|
||||
DEBUG_COMMAND("TPP:");
|
||||
}
|
||||
|
||||
@@ -352,7 +358,7 @@ void commands2F24() {
|
||||
case 1:
|
||||
var = getCaliValue();
|
||||
cnt = getCaliValue();
|
||||
sysVar[0] = save_load_str_with_file(fname_utf8, var, cnt);
|
||||
sysVar[0] = load_strs_from_file(fname_utf8, var, cnt);
|
||||
break;
|
||||
default:
|
||||
var = getCaliValue();
|
||||
@@ -458,7 +464,7 @@ void commands2F2A() {
|
||||
case 1:
|
||||
var = getCaliValue();
|
||||
cnt = getCaliValue();
|
||||
sysVar[0] = save_save_str_with_file(fname_utf8, var, cnt);
|
||||
sysVar[0] = save_strs_to_file(fname_utf8, var, cnt);
|
||||
break;
|
||||
default:
|
||||
var = getCaliValue();
|
||||
|
||||
+17
-17
@@ -47,7 +47,7 @@ void commandB0() {
|
||||
}
|
||||
|
||||
void commandB1() {
|
||||
int num = getCaliValue() - 1;
|
||||
int num = getCaliValue();
|
||||
int X1 = getCaliValue();
|
||||
int Y1 = getCaliValue();
|
||||
int X2 = getCaliValue();
|
||||
@@ -64,7 +64,7 @@ void commandB1() {
|
||||
nact->sel.wininfo[num].height = Y2;
|
||||
nact->sel.wininfo[num].save = (V == 0) ? false : true;
|
||||
|
||||
DEBUG_COMMAND("B1 %d,%d,%d,%d,%d,%d:", num + 1, X1, Y1, X2, Y2, V);
|
||||
DEBUG_COMMAND("B1 %d,%d,%d,%d,%d,%d:", num, X1, Y1, X2, Y2, V);
|
||||
}
|
||||
|
||||
void commandB2() {
|
||||
@@ -75,13 +75,13 @@ void commandB2() {
|
||||
int C3 = getCaliValue();
|
||||
int dot = getCaliValue();
|
||||
|
||||
if (num < 1 || num - 1 >= SELWINMAX) {
|
||||
if (num < 0 || num >= SELWINMAX) {
|
||||
WARNING("commandB2(): Window number is out of range %d", num);
|
||||
return;
|
||||
}
|
||||
|
||||
nact->sel.winno = num;
|
||||
nact->sel.win = &nact->sel.wininfo[num - 1];
|
||||
nact->sel.win = &nact->sel.wininfo[num];
|
||||
|
||||
nact->sel.WindowFrameType = W;
|
||||
nact->sel.FrameCgNoTop = C1;
|
||||
@@ -93,7 +93,7 @@ void commandB2() {
|
||||
}
|
||||
|
||||
void commandB3() {
|
||||
int num = getCaliValue() - 1;
|
||||
int num = getCaliValue();
|
||||
int X1 = getCaliValue();
|
||||
int Y1 = getCaliValue();
|
||||
int X2 = getCaliValue();
|
||||
@@ -110,7 +110,7 @@ void commandB3() {
|
||||
nact->msg.wininfo[num].height = Y2;
|
||||
nact->msg.wininfo[num].save = (V == 0) ? FALSE : TRUE;
|
||||
|
||||
DEBUG_COMMAND("B3 %d,%d,%d,%d,%d,%d:", num + 1, X1, Y1, X2, Y2, V);
|
||||
DEBUG_COMMAND("B3 %d,%d,%d,%d,%d,%d:", num, X1, Y1, X2, Y2, V);
|
||||
}
|
||||
|
||||
void commandB4() {
|
||||
@@ -121,13 +121,13 @@ void commandB4() {
|
||||
int N = getCaliValue();
|
||||
int M = getCaliValue();
|
||||
|
||||
if (num < 1 || num - 1 >= MSGWINMAX) {
|
||||
if (num < 0 || num >= MSGWINMAX) {
|
||||
WARNING("commandB4(): Window number is out of range %d", num);
|
||||
num = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
nact->msg.winno = num;
|
||||
nact->msg.win = &nact->msg.wininfo[num - 1];
|
||||
nact->msg.win = &nact->msg.wininfo[num];
|
||||
msg_openWindow(W, C1, C2, N, M);
|
||||
|
||||
DEBUG_COMMAND("B4 %d,%d,%d,%d,%d,%d:", num, W, C1, C2, N, M);
|
||||
@@ -225,8 +225,8 @@ void commandB31() {
|
||||
int *x_var = getCaliVariable();
|
||||
int *y_var = getCaliVariable();
|
||||
|
||||
*x_var = nact->sel.wininfo[no - 1].x;
|
||||
*y_var = nact->sel.wininfo[no - 1].y;
|
||||
*x_var = nact->sel.wininfo[no].x;
|
||||
*y_var = nact->sel.wininfo[no].y;
|
||||
|
||||
DEBUG_COMMAND("B31 %d,%d,%d:", no, *x_var, *y_var);
|
||||
}
|
||||
@@ -236,8 +236,8 @@ void commandB32() {
|
||||
int *x_var_size = getCaliVariable();
|
||||
int *y_var_size = getCaliVariable();
|
||||
|
||||
*x_var_size = nact->sel.wininfo[no - 1].width;
|
||||
*y_var_size = nact->sel.wininfo[no - 1].height;
|
||||
*x_var_size = nact->sel.wininfo[no].width;
|
||||
*y_var_size = nact->sel.wininfo[no].height;
|
||||
|
||||
DEBUG_COMMAND("B32 %d,%d,%d:", no, *x_var_size, *y_var_size);
|
||||
}
|
||||
@@ -247,8 +247,8 @@ void commandB33() {
|
||||
int *x_var = getCaliVariable();
|
||||
int *y_var = getCaliVariable();
|
||||
|
||||
*x_var = nact->msg.wininfo[no - 1].x;
|
||||
*y_var = nact->msg.wininfo[no - 1].y;
|
||||
*x_var = nact->msg.wininfo[no].x;
|
||||
*y_var = nact->msg.wininfo[no].y;
|
||||
DEBUG_COMMAND("B33 %d,%d,%d:", no, *x_var, *y_var);
|
||||
}
|
||||
|
||||
@@ -257,8 +257,8 @@ void commandB34() {
|
||||
int *x_var_size = getCaliVariable();
|
||||
int *y_var_size = getCaliVariable();
|
||||
|
||||
*x_var_size = nact->msg.wininfo[no - 1].width;
|
||||
*y_var_size = nact->msg.wininfo[no - 1].height;
|
||||
*x_var_size = nact->msg.wininfo[no].width;
|
||||
*y_var_size = nact->msg.wininfo[no].height;
|
||||
DEBUG_COMMAND("B34 %d,%d,%d:", no, *x_var_size, *y_var_size);
|
||||
}
|
||||
|
||||
|
||||
+12
-1
@@ -27,6 +27,7 @@
|
||||
#include "xsystem35.h"
|
||||
#include "scenario.h"
|
||||
#include "ags.h"
|
||||
#include "hacks.h"
|
||||
|
||||
void commandCC() {
|
||||
int src_x = getCaliValue();
|
||||
@@ -69,7 +70,16 @@ void commandCX() {
|
||||
|
||||
switch(mode) {
|
||||
case 0:
|
||||
ags_copyArea_shadow(src_x, src_y, width, height, dst_x, dst_y);
|
||||
// In Daiakuji, the image after the blending is used as a source image
|
||||
// for sprite copy (CX 1). SDL's SIMD blending implementation has some
|
||||
// error (blending #ff00ff and #ff00ff results in #fd00fd), so the
|
||||
// resulting color may not match the colorkey of CX 1. To workaround
|
||||
// this, specify a small alpha mod so that SDL will use a "slow path"
|
||||
// that does accurate calculation.
|
||||
if (daiakuji_cx_hack)
|
||||
ags_copyArea_shadow_withrate(src_x, src_y, width, height, dst_x, dst_y, 254);
|
||||
else
|
||||
ags_copyArea_shadow(src_x, src_y, width, height, dst_x, dst_y);
|
||||
ags_updateArea(dst_x, dst_y, width, height);
|
||||
break;
|
||||
case 1:
|
||||
@@ -94,6 +104,7 @@ void commandCX() {
|
||||
DEBUG_COMMAND_YET("CX %d,%d,%d,%d,%d,%d,%d,%d:", mode, src_x, src_y, width, height, dst_x, dst_y, col);
|
||||
break;
|
||||
}
|
||||
daiakuji_cx_hack = false;
|
||||
|
||||
DEBUG_COMMAND("CX %d,%d,%d,%d,%d,%d,%d,%d:", mode, src_x, src_y, width, height, dst_x, dst_y, col);
|
||||
}
|
||||
|
||||
+3
-3
@@ -114,16 +114,16 @@ void commandLE() {
|
||||
|
||||
char *fname_utf8 = toUTF8(filename);
|
||||
switch (type) {
|
||||
case 0: /* T2 */
|
||||
case 0:
|
||||
getCaliArray(&vref);
|
||||
var = vref.var;
|
||||
cnt = getCaliValue();
|
||||
sysVar[0] = load_vars_from_file(fname_utf8, &vref, cnt);
|
||||
break;
|
||||
case 1: /* 456 */
|
||||
case 1:
|
||||
var = getCaliValue();
|
||||
cnt = getCaliValue();
|
||||
sysVar[0] = save_load_str_with_file(fname_utf8, var, cnt);
|
||||
sysVar[0] = load_strs_from_file(fname_utf8, var, cnt);
|
||||
break;
|
||||
default:
|
||||
var = getCaliValue();
|
||||
|
||||
+2
-5
@@ -249,16 +249,13 @@ void commandMF() {
|
||||
|
||||
void commandMZ0() {
|
||||
/* 文字列変数の文字数・個数の設定の変更 */
|
||||
int max_len = getCaliValue();
|
||||
int max_len = getCaliValue(); // deprecated in System3.9
|
||||
int max_num = getCaliValue();
|
||||
int rsv = getCaliValue();
|
||||
|
||||
DEBUG_COMMAND("MZ0 %d,%d,%d:",max_len, max_num, rsv);
|
||||
|
||||
/* いつからか、文字列変数の最大長さは∞になったようだ */
|
||||
if (max_len == 0) max_len = STRVAR_LEN * 2;
|
||||
|
||||
svar_init(max_num, max_len * 2 + 1);
|
||||
svar_init(max_num);
|
||||
}
|
||||
|
||||
void commandMG() {
|
||||
|
||||
+1
-1
@@ -96,7 +96,7 @@ void commandQE() {
|
||||
case 1:
|
||||
var = getCaliValue();
|
||||
cnt = getCaliValue();
|
||||
sysVar[0] = save_save_str_with_file(fname_utf8, var, cnt);
|
||||
sysVar[0] = save_strs_to_file(fname_utf8, var, cnt);
|
||||
break;
|
||||
default:
|
||||
var = getCaliValue();
|
||||
|
||||
+2
-4
@@ -345,10 +345,8 @@ void commandZZ0() {
|
||||
sys_exit(sysVar[0]);
|
||||
#endif
|
||||
} else if (sw == 1) {
|
||||
while (TRUE) {
|
||||
usleep(1000*1000);
|
||||
sys_getInputInfo();
|
||||
}
|
||||
while (!nact->is_quit)
|
||||
sys_keywait(1000, 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+23
-43
@@ -360,21 +360,23 @@ void dbg_delete_breakpoints_in_page(int page) {
|
||||
}
|
||||
|
||||
uint8_t dbg_handle_breakpoint(int page, int addr) {
|
||||
uint8_t restore_op = BREAKPOINT;
|
||||
for (Breakpoint *bp = breakpoints; bp; bp = bp->next) {
|
||||
if (bp->phys->page != page || bp->phys->addr != addr)
|
||||
continue;
|
||||
restore_op = bp->phys->restore_op;
|
||||
if (bp->condition && !eval_condition(bp->condition))
|
||||
continue;
|
||||
|
||||
dbg_state = bp->no == INTERNAL_BREAKPOINT_NO ?
|
||||
DBG_STOPPED_NEXT : DBG_STOPPED_BREAKPOINT;
|
||||
|
||||
uint8_t restore_op = bp->phys->restore_op;
|
||||
dbg_main(bp->no); // this may destroy bp
|
||||
return restore_op;
|
||||
}
|
||||
SYSERROR("Illegal BREAKPOINT instruction");
|
||||
return BREAKPOINT;
|
||||
if (restore_op == BREAKPOINT)
|
||||
SYSERROR("Illegal BREAKPOINT instruction");
|
||||
return restore_op;
|
||||
}
|
||||
|
||||
static void set_stack_frame(StackFrame *frame, int page, int addr, boolean is_return_addr) {
|
||||
@@ -389,9 +391,6 @@ static void set_stack_frame(StackFrame *frame, int page, int addr, boolean is_re
|
||||
}
|
||||
|
||||
StackTrace *dbg_stack_trace(void) {
|
||||
int stack_size;
|
||||
const int *stack_base = sl_getStack(&stack_size);
|
||||
|
||||
int page = nact->current_page;
|
||||
|
||||
int cap = 16;
|
||||
@@ -399,26 +398,17 @@ StackTrace *dbg_stack_trace(void) {
|
||||
set_stack_frame(&trace->frames[0], page, nact->current_addr, false);
|
||||
trace->nr_frame = 1;
|
||||
|
||||
const int *p = stack_base + stack_size - 1;
|
||||
while (p >= stack_base) {
|
||||
int addr = -1;
|
||||
switch (*p) {
|
||||
case STACK_NEARJMP:
|
||||
addr = p[-2];
|
||||
break;
|
||||
case STACK_FARJMP:
|
||||
page = p[-2];
|
||||
addr = p[-3];
|
||||
break;
|
||||
struct stack_frame_info *sfi = NULL;
|
||||
while ((sfi = sl_next_stack_frame(sfi)) != NULL) {
|
||||
if (sfi->tag != STACK_NEARCALL && sfi->tag != STACK_FARCALL)
|
||||
continue;
|
||||
if (trace->nr_frame >= cap) {
|
||||
cap *= 2;
|
||||
trace = realloc(trace, sizeof(StackTrace) + cap * sizeof(StackFrame));
|
||||
}
|
||||
if (addr >= 0) {
|
||||
if (trace->nr_frame >= cap) {
|
||||
cap *= 2;
|
||||
trace = realloc(trace, sizeof(StackTrace) + cap * sizeof(StackFrame));
|
||||
}
|
||||
set_stack_frame(&trace->frames[trace->nr_frame++], page, addr, true);
|
||||
}
|
||||
p -= p[-1] + 2;
|
||||
if (sfi->tag == STACK_FARCALL)
|
||||
page = sfi->page;
|
||||
set_stack_frame(&trace->frames[trace->nr_frame++], page, sfi->addr, true);
|
||||
}
|
||||
|
||||
return trace;
|
||||
@@ -439,26 +429,16 @@ static boolean should_continue_step(void) {
|
||||
|
||||
void dbg_stepout(void) {
|
||||
// Set an internal breakpoint at the return address of current frame.
|
||||
int stack_size;
|
||||
const int *stack_base = sl_getStack(&stack_size);
|
||||
const int *p = stack_base + stack_size - 1;
|
||||
while (p >= stack_base) {
|
||||
int page, addr = -1;
|
||||
switch (*p) {
|
||||
case STACK_NEARJMP:
|
||||
page = nact->current_page;
|
||||
addr = p[-2];
|
||||
break;
|
||||
case STACK_FARJMP:
|
||||
page = p[-2];
|
||||
addr = p[-3];
|
||||
break;
|
||||
}
|
||||
if (addr >= 0) {
|
||||
internal_breakpoint = dbg_set_breakpoint(page, addr, true);
|
||||
struct stack_frame_info *sfi = NULL;
|
||||
while ((sfi = sl_next_stack_frame(sfi)) != NULL) {
|
||||
switch (sfi->tag) {
|
||||
case STACK_NEARCALL:
|
||||
internal_breakpoint = dbg_set_breakpoint(nact->current_page, sfi->addr, true);
|
||||
return;
|
||||
case STACK_FARCALL:
|
||||
internal_breakpoint = dbg_set_breakpoint(sfi->page, sfi->addr, true);
|
||||
return;
|
||||
}
|
||||
p -= p[-1] + 2;
|
||||
}
|
||||
// No parent frame found, continue execution.
|
||||
}
|
||||
|
||||
@@ -47,6 +47,7 @@ void dbg_main(int bp_no);
|
||||
void dbg_onsleep(void);
|
||||
uint8_t dbg_handle_breakpoint(int page, int addr);
|
||||
boolean dbg_console_vprintf(int lv, const char *format, va_list ap);
|
||||
void dbg_post_command(void *data);
|
||||
|
||||
#else // ENABLE_DEBUGGER
|
||||
|
||||
@@ -57,6 +58,7 @@ boolean dbg_console_vprintf(int lv, const char *format, va_list ap);
|
||||
#define dbg_onsleep()
|
||||
#define dbg_handle_breakpoint(page, addr) BREAKPOINT
|
||||
#define dbg_console_vprintf(lv, format, ap) false
|
||||
#define dbg_post_command(data)
|
||||
|
||||
#endif // ENABLE_DEBUGGER
|
||||
|
||||
|
||||
+29
-15
@@ -72,7 +72,7 @@ static void send_json(cJSON *json) {
|
||||
printf("Content-Length: %zu\r\n\r\n%s", strlen(str), str);
|
||||
fflush(stdout);
|
||||
free(str);
|
||||
cJSON_free(json);
|
||||
cJSON_Delete(json);
|
||||
}
|
||||
|
||||
static void emit_initialized_event(void) {
|
||||
@@ -494,7 +494,7 @@ static boolean handle_request(cJSON *request) {
|
||||
if (!cJSON_IsString(command)) {
|
||||
fprintf(stderr, "protocol error: command is not a string\n");
|
||||
// FIXME: return an error response
|
||||
cJSON_free(resp);
|
||||
cJSON_Delete(resp);
|
||||
return continue_repl;
|
||||
}
|
||||
|
||||
@@ -549,7 +549,7 @@ static boolean handle_message(char *msg) {
|
||||
boolean continue_repl = true;
|
||||
if (cJSON_IsString(type) && !strcmp(type->valuestring, "request"))
|
||||
continue_repl = handle_request(json);
|
||||
cJSON_free(json);
|
||||
cJSON_Delete(json);
|
||||
free(msg);
|
||||
return continue_repl;
|
||||
}
|
||||
@@ -567,13 +567,13 @@ static int read_command_thread(void *data) {
|
||||
}
|
||||
char *buf = malloc(content_length);
|
||||
fread(buf, content_length, 1, stdin);
|
||||
msgq_enqueue(queue, buf);
|
||||
sdl_post_debugger_command(buf);
|
||||
content_length = -1;
|
||||
} else {
|
||||
fprintf(stderr, "Unknown Debug Adapter Protocol header: %s", header);
|
||||
}
|
||||
}
|
||||
msgq_enqueue(queue, NULL); // EOF
|
||||
sdl_post_debugger_command(NULL); // end of messages
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -588,11 +588,16 @@ static void dbg_dap_init(const char *path) {
|
||||
|
||||
SDL_CreateThread(read_command_thread, "Debugger", NULL);
|
||||
|
||||
while (!initialized) {
|
||||
char *msg = msgq_dequeue(queue);
|
||||
if (!msg)
|
||||
break;
|
||||
handle_message(msg);
|
||||
while (!initialized && !nact->is_quit) {
|
||||
SDL_Event e;
|
||||
SDL_WaitEvent(&e);
|
||||
sdl_handle_event(&e);
|
||||
while (!msgq_isempty(queue)) {
|
||||
char *msg = msgq_dequeue(queue);
|
||||
if (!msg)
|
||||
return;
|
||||
handle_message(msg);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -605,11 +610,16 @@ static void dbg_dap_repl(int bp_no) {
|
||||
dbg_state = DBG_RUNNING;
|
||||
|
||||
boolean continue_repl = true;
|
||||
while (continue_repl) {
|
||||
char *msg = msgq_dequeue(queue);
|
||||
if (!msg)
|
||||
break;
|
||||
continue_repl = handle_message(msg);
|
||||
while (continue_repl && !nact->is_quit) {
|
||||
SDL_Event e;
|
||||
SDL_WaitEvent(&e);
|
||||
sdl_handle_event(&e);
|
||||
while (!msgq_isempty(queue)) {
|
||||
char *msg = msgq_dequeue(queue);
|
||||
if (!msg)
|
||||
return;
|
||||
continue_repl = handle_message(msg);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -624,6 +634,10 @@ static void dbg_dap_onsleep(void) {
|
||||
dbg_main(0);
|
||||
}
|
||||
|
||||
void dbg_post_command(void *data) {
|
||||
msgq_enqueue(queue, data);
|
||||
}
|
||||
|
||||
DebuggerImpl dbg_dap_impl = {
|
||||
.init = dbg_dap_init,
|
||||
.quit = dbg_dap_quit,
|
||||
|
||||
+23
-4
@@ -66,6 +66,8 @@ static void storeSaveName(GameResource *gr, int no, char *src) {
|
||||
boolean initGameResourceFromDir(GameResource *gr, DIR *dir, struct dirent *(*p_readdir)(DIR *)) {
|
||||
memset(gr, 0, sizeof(GameResource));
|
||||
|
||||
char *basename = NULL;
|
||||
bool found_xsleep = false;
|
||||
struct dirent* d;
|
||||
while ((d = p_readdir(dir))) {
|
||||
char *filename = d->d_name;
|
||||
@@ -91,6 +93,10 @@ boolean initGameResourceFromDir(GameResource *gr, DIR *dir, struct dirent *(*p_r
|
||||
switch (toupper(filename[len - 6])) {
|
||||
case 'S':
|
||||
storeDataName(gr, DRIFILE_SCO, dno, filename);
|
||||
if (!basename) {
|
||||
basename = strdup(filename);
|
||||
basename[len - 5] = '\0';
|
||||
}
|
||||
break;
|
||||
case 'G':
|
||||
storeDataName(gr, DRIFILE_CG, dno, filename);
|
||||
@@ -111,13 +117,26 @@ boolean initGameResourceFromDir(GameResource *gr, DIR *dir, struct dirent *(*p_r
|
||||
storeDataName(gr, DRIFILE_BGM, dno, filename);
|
||||
break;
|
||||
}
|
||||
} else if (strcasecmp(filename + 1, "sleep.asd") == 0) {
|
||||
found_xsleep = true;
|
||||
}
|
||||
}
|
||||
for (int i = 0; i < SAVE_MAXNUMBER; i++) {
|
||||
char buf[] = "asleep.asd";
|
||||
buf[0] = 'a' + i;
|
||||
storeSaveName(gr, i, buf);
|
||||
if (basename && !found_xsleep) {
|
||||
char *buf = malloc(strlen(basename) + 6);
|
||||
int a = basename[strlen(basename) - 1] == 'S' ? 'A' : 'a';
|
||||
for (int i = 0; i < SAVE_MAXNUMBER; i++) {
|
||||
sprintf(buf, "%s%c.asd", basename, a + i);
|
||||
storeSaveName(gr, i, buf);
|
||||
}
|
||||
free(buf);
|
||||
} else {
|
||||
for (int i = 0; i < SAVE_MAXNUMBER; i++) {
|
||||
char buf[] = "asleep.asd";
|
||||
buf[0] = 'a' + i;
|
||||
storeSaveName(gr, i, buf);
|
||||
}
|
||||
}
|
||||
free(basename);
|
||||
|
||||
return (gr->cnt[DRIFILE_SCO] > 0) ? TRUE : FALSE;
|
||||
}
|
||||
|
||||
+62
-43
@@ -74,50 +74,69 @@ static struct dirent *mockReaddir(DIR *dir) {
|
||||
}
|
||||
|
||||
static void initGameResourceFromDir_test(void) {
|
||||
const char *files[] = {
|
||||
"ADISK.ALD",
|
||||
"FOOSB.ALD",
|
||||
"foogz.ald",
|
||||
"WA.ALD",
|
||||
"unknownXA.ald",
|
||||
"a.ald",
|
||||
".ald",
|
||||
"a",
|
||||
"SYSTEM39.AIN",
|
||||
"foo_WA.WAI",
|
||||
"foo_BA.BGI",
|
||||
"SACTEFAM.KLD",
|
||||
"System39.ini",
|
||||
"foo1.alk",
|
||||
"0.alk",
|
||||
".alk",
|
||||
NULL
|
||||
};
|
||||
const char **dir = files;
|
||||
GameResource gr;
|
||||
ASSERT_TRUE(initGameResourceFromDir(&gr, (DIR *)&dir, mockReaddir));
|
||||
ASSERT_EQUAL(gr.cnt[DRIFILE_SCO], 2);
|
||||
ASSERT_STRCMP(gr.game_fname[DRIFILE_SCO][0], "ADISK.ALD");
|
||||
ASSERT_STRCMP(gr.game_fname[DRIFILE_SCO][1], "FOOSB.ALD");
|
||||
ASSERT_EQUAL(gr.cnt[DRIFILE_CG], 26);
|
||||
ASSERT_STRCMP(gr.game_fname[DRIFILE_CG][25], "foogz.ald");
|
||||
ASSERT_EQUAL(gr.cnt[DRIFILE_WAVE], 1);
|
||||
ASSERT_STRCMP(gr.game_fname[DRIFILE_WAVE][0], "WA.ALD");
|
||||
for (int i = 0; i < 26; i++) {
|
||||
char buf[16];
|
||||
sprintf(buf, "%csleep.asd", 'a' + i);
|
||||
ASSERT_STRCMP(gr.save_fname[i], buf);
|
||||
{
|
||||
const char *files[] = {
|
||||
"FOOSA.ALD",
|
||||
"FOOSB.ALD",
|
||||
"foogz.ald",
|
||||
"WA.ALD",
|
||||
"unknownXA.ald",
|
||||
"a.ald",
|
||||
".ald",
|
||||
"a",
|
||||
"SYSTEM39.AIN",
|
||||
"foo_WA.WAI",
|
||||
"foo_BA.BGI",
|
||||
"SACTEFAM.KLD",
|
||||
"System39.ini",
|
||||
"foo1.alk",
|
||||
"0.alk",
|
||||
".alk",
|
||||
NULL
|
||||
};
|
||||
const char **dir = files;
|
||||
GameResource gr;
|
||||
ASSERT_TRUE(initGameResourceFromDir(&gr, (DIR *)&dir, mockReaddir));
|
||||
ASSERT_EQUAL(gr.cnt[DRIFILE_SCO], 2);
|
||||
ASSERT_STRCMP(gr.game_fname[DRIFILE_SCO][0], "FOOSA.ALD");
|
||||
ASSERT_STRCMP(gr.game_fname[DRIFILE_SCO][1], "FOOSB.ALD");
|
||||
ASSERT_EQUAL(gr.cnt[DRIFILE_CG], 26);
|
||||
ASSERT_STRCMP(gr.game_fname[DRIFILE_CG][25], "foogz.ald");
|
||||
ASSERT_EQUAL(gr.cnt[DRIFILE_WAVE], 1);
|
||||
ASSERT_STRCMP(gr.game_fname[DRIFILE_WAVE][0], "WA.ALD");
|
||||
for (int i = 0; i < 26; i++) {
|
||||
char buf[16];
|
||||
sprintf(buf, "FOOS%c.asd", 'A' + i);
|
||||
ASSERT_STRCMP(gr.save_fname[i], buf);
|
||||
}
|
||||
ASSERT_STRCMP(gr.save_path, ".");
|
||||
ASSERT_STRCMP(gr.ain, "SYSTEM39.AIN");
|
||||
ASSERT_STRCMP(gr.wai, "foo_WA.WAI");
|
||||
ASSERT_STRCMP(gr.bgi, "foo_BA.BGI");
|
||||
ASSERT_STRCMP(gr.sact01, "SACTEFAM.KLD");
|
||||
ASSERT_STRCMP(gr.init, "System39.ini");
|
||||
ASSERT_STRCMP(gr.alk[0], "0.alk");
|
||||
ASSERT_STRCMP(gr.alk[1], "foo1.alk");
|
||||
for (int i = 2; i < 10; i++)
|
||||
ASSERT_NULL(gr.alk[i]);
|
||||
}
|
||||
{
|
||||
const char *files[] = {
|
||||
"ADISK.ALD",
|
||||
"asleep.asd",
|
||||
NULL
|
||||
};
|
||||
const char **dir = files;
|
||||
GameResource gr;
|
||||
ASSERT_TRUE(initGameResourceFromDir(&gr, (DIR *)&dir, mockReaddir));
|
||||
ASSERT_EQUAL(gr.cnt[DRIFILE_SCO], 1);
|
||||
ASSERT_STRCMP(gr.game_fname[DRIFILE_SCO][0], "ADISK.ALD");
|
||||
for (int i = 0; i < 26; i++) {
|
||||
char buf[16];
|
||||
sprintf(buf, "%csleep.asd", 'a' + i);
|
||||
ASSERT_STRCMP(gr.save_fname[i], buf);
|
||||
}
|
||||
}
|
||||
ASSERT_STRCMP(gr.save_path, ".");
|
||||
ASSERT_STRCMP(gr.ain, "SYSTEM39.AIN");
|
||||
ASSERT_STRCMP(gr.wai, "foo_WA.WAI");
|
||||
ASSERT_STRCMP(gr.bgi, "foo_BA.BGI");
|
||||
ASSERT_STRCMP(gr.sact01, "SACTEFAM.KLD");
|
||||
ASSERT_STRCMP(gr.init, "System39.ini");
|
||||
ASSERT_STRCMP(gr.alk[0], "0.alk");
|
||||
ASSERT_STRCMP(gr.alk[1], "foo1.alk");
|
||||
for (int i = 2; i < 10; i++)
|
||||
ASSERT_NULL(gr.alk[i]);
|
||||
}
|
||||
|
||||
void gameresource_test(void) {
|
||||
|
||||
@@ -33,6 +33,8 @@
|
||||
/* defined by cmdy.c */
|
||||
extern boolean Y3waitFlags;
|
||||
|
||||
bool daiakuji_cx_hack;
|
||||
|
||||
void enable_hack_by_gameid(const char *gameid) {
|
||||
if (!strcmp(gameid, "toushin2"))
|
||||
nact->game = GAME_TT2;
|
||||
|
||||
@@ -20,6 +20,8 @@
|
||||
#ifndef __HACKS_H_
|
||||
#define __HACKS_H_
|
||||
|
||||
#include <stdbool.h>
|
||||
|
||||
enum gameId {
|
||||
GAME_UNKNOWN = 0,
|
||||
GAME_TT2,
|
||||
@@ -31,4 +33,6 @@ enum gameId {
|
||||
void enable_hack_by_gameid(const char *gameid);
|
||||
void enable_hack_by_title(const char *game_title_utf8);
|
||||
|
||||
extern bool daiakuji_cx_hack;
|
||||
|
||||
#endif // __HACKS_H_
|
||||
|
||||
+117
@@ -41,6 +41,123 @@
|
||||
#define KEYWAIT_CANCELABLE 1
|
||||
#define KEYWAIT_SKIPPABLE 2
|
||||
|
||||
// System3.x key codes (IG command, etc.)
|
||||
// These are originated from Windows virtual key codes (VK_*).
|
||||
#define NUM_KEYCODES 256
|
||||
enum keycode {
|
||||
KEY_MOUSE_LEFT = 0x01, // マウスの左ボタン
|
||||
KEY_MOUSE_RIGHT = 0x02, // マウスの右ボタン
|
||||
KEY_CONTROL = 0x03, // コントロール ブレーク処理に使用
|
||||
KEY_MOUSE_MIDDLE = 0x04, // マウスの中央ボタン (3つボタンのマウス)
|
||||
KEY_BACKSPACE = 0x08, // BackSpaceキー
|
||||
KEY_TAB = 0x09, // Tabキー
|
||||
KEY_CLEAR = 0x0c, // Clearキー
|
||||
KEY_RETURN = 0x0d, // Enterキー
|
||||
KEY_SHIFT = 0x10, // Shiftキー
|
||||
KEY_CTRL = 0x11, // Ctrlキー
|
||||
KEY_ALT = 0x12, // Altキー
|
||||
KEY_PAUSE = 0x13, // Pauseキー
|
||||
KEY_CAPSLOCK = 0x14, // Caps Lockキー
|
||||
KEY_KANAKAN = 0x15, // 英数カナキー
|
||||
KEY_ESCAPE = 0x1b, // Escキー
|
||||
KEY_SPACE = 0x20, // Spaceキー
|
||||
KEY_PAGEUP = 0x21, // Page Upキー
|
||||
KEY_PAGEDOWN = 0x22, // Page Downキー
|
||||
KEY_END = 0x23, // Endキー
|
||||
KEY_HOME = 0x24, // Homeキー
|
||||
KEY_LEFT = 0x25, // ←キー
|
||||
KEY_UP = 0x26, // ↑キー
|
||||
KEY_RIGHT = 0x27, // →キー
|
||||
KEY_DOWN = 0x28, // ↓キー
|
||||
KEY_SELECT = 0x29, // Selectキー
|
||||
KEY_EXECUTE = 0x2b, // Executeキー
|
||||
KEY_PRINTSCREEN = 0x2c, // Print Screenキー (Windows 3.0以降用)
|
||||
KEY_INSERT = 0x2d, // Insキー
|
||||
KEY_DELETE = 0x2e, // Delキー
|
||||
KEY_HELP = 0x2f, // Helpキー
|
||||
KEY_0 = 0x30, // 0キー
|
||||
KEY_1 = 0x31, // 1キー
|
||||
KEY_2 = 0x32, // 2キー
|
||||
KEY_3 = 0x33, // 3キー
|
||||
KEY_4 = 0x34, // 4キー
|
||||
KEY_5 = 0x35, // 5キー
|
||||
KEY_6 = 0x36, // 6キー
|
||||
KEY_7 = 0x37, // 7キー
|
||||
KEY_8 = 0x38, // 8キー
|
||||
KEY_9 = 0x39, // 9キー
|
||||
KEY_PAD_EQUALS = 0x3d,
|
||||
KEY_A = 0x41, // Aキー
|
||||
KEY_B = 0x42, // Bキー
|
||||
KEY_C = 0x43, // Cキー
|
||||
KEY_D = 0x44, // Dキー
|
||||
KEY_E = 0x45, // Eキー
|
||||
KEY_F = 0x46, // Fキー
|
||||
KEY_G = 0x47, // Gキー
|
||||
KEY_H = 0x48, // Hキー
|
||||
KEY_I = 0x49, // Iキー
|
||||
KEY_J = 0x4a, // Jキー
|
||||
KEY_K = 0x4b, // Kキー
|
||||
KEY_L = 0x4c, // Lキー
|
||||
KEY_M = 0x4d, // Mキー
|
||||
KEY_N = 0x4e, // Nキー
|
||||
KEY_O = 0x4f, // Oキー
|
||||
KEY_P = 0x50, // Pキー
|
||||
KEY_Q = 0x51, // Qキー
|
||||
KEY_R = 0x52, // Rキー
|
||||
KEY_S = 0x53, // Sキー
|
||||
KEY_T = 0x54, // Tキー
|
||||
KEY_U = 0x55, // Uキー
|
||||
KEY_V = 0x56, // Vキー
|
||||
KEY_W = 0x57, // Wキー
|
||||
KEY_X = 0x58, // Xキー
|
||||
KEY_Y = 0x59, // Yキー
|
||||
KEY_Z = 0x5a, // Zキー
|
||||
KEY_PAD_0 = 0x60, // テンキーの0キー
|
||||
KEY_PAD_1 = 0x61, // テンキーの1キー
|
||||
KEY_PAD_2 = 0x62, // テンキーの2キー
|
||||
KEY_PAD_3 = 0x63, // テンキーの3キー
|
||||
KEY_PAD_4 = 0x64, // テンキーの4キー
|
||||
KEY_PAD_5 = 0x65, // テンキーの5キー
|
||||
KEY_PAD_6 = 0x66, // テンキーの6キー
|
||||
KEY_PAD_7 = 0x67, // テンキーの7キー
|
||||
KEY_PAD_8 = 0x68, // テンキーの8キー
|
||||
KEY_PAD_9 = 0x69, // テンキーの9キー
|
||||
KEY_PAD_MULTIPLY = 0x6a, // テンキーの*キー
|
||||
KEY_PAD_PLUS = 0x6b, // テンキーの+キー
|
||||
KEY_SEPARATOR = 0x6c, // Separatorキー
|
||||
KEY_PAD_MINUS = 0x6d, // テンキーの-キー
|
||||
KEY_PAD_PERIOD = 0x6e, // テンキーの.キー
|
||||
KEY_PAD_DIVIDE = 0x6f, // テンキーの/キー
|
||||
KEY_F1 = 0x70, // F1キー
|
||||
KEY_F2 = 0x71, // F2キー
|
||||
KEY_F3 = 0x72, // F3キー
|
||||
KEY_F4 = 0x73, // F4キー
|
||||
KEY_F5 = 0x74, // F5キー
|
||||
KEY_F6 = 0x75, // F6キー
|
||||
KEY_F7 = 0x76, // F7キー
|
||||
KEY_F8 = 0x77, // F8キー
|
||||
KEY_F9 = 0x78, // F9キー
|
||||
KEY_F10 = 0x79, // F10キー
|
||||
KEY_F11 = 0x7a, // F11キー
|
||||
KEY_F12 = 0x7b, // F12キー
|
||||
KEY_F13 = 0x7c, // F13キー
|
||||
KEY_F14 = 0x7d, // F14キー
|
||||
KEY_F15 = 0x7e, // F15キー
|
||||
KEY_F16 = 0x7f, // F16キー
|
||||
KEY_F17 = 0x80, // F17キー
|
||||
KEY_F18 = 0x81, // F18キー
|
||||
KEY_F19 = 0x82, // F19キー
|
||||
KEY_F20 = 0x83, // F20キー
|
||||
KEY_F21 = 0x84, // F21キー
|
||||
KEY_F22 = 0x85, // F22キー
|
||||
KEY_F23 = 0x86, // F23キー
|
||||
KEY_F24 = 0x87, // F24キー
|
||||
KEY_NUMLOCK = 0x90, // Num Lockキー
|
||||
KEY_SCROLLLOCK = 0x91, // Scroll Lockキー
|
||||
};
|
||||
|
||||
extern boolean RawKeyInfo[NUM_KEYCODES];
|
||||
|
||||
extern int sys_keywait(int msec, unsigned flags);
|
||||
extern int sys_getMouseInfo(MyPoint *p, boolean is_dibgeo);
|
||||
extern int sys_getInputInfo(void);
|
||||
|
||||
@@ -1,153 +0,0 @@
|
||||
/*
|
||||
* key.h keycode definition
|
||||
*
|
||||
* Copyright (C) 2000- Masaki Chikama (Wren) <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: key.h,v 1.2 2000/08/11 18:55:51 chikama Exp $ */
|
||||
|
||||
#ifndef __KEYCODE__
|
||||
#define __KEYCODE__
|
||||
|
||||
#define KEY_UNDEFINED (0x00)
|
||||
#define KEY_MOUSE_LEFT (0x01)
|
||||
#define KEY_MOUSE_RIGHT (0x02)
|
||||
#define KEY_CONTROL (0x03)
|
||||
#define KEY_MOUSE_MIDDLE (0x04)
|
||||
#define KEY_BS (0x08)
|
||||
#define KEY_BACKSPACE (0x08)
|
||||
#define KEY_TAB (0x09)
|
||||
#define KEY_CLEAR (0x0c)
|
||||
#define KEY_ENTER (0x0d)
|
||||
#define KEY_PAD_ENTER (0x0d)
|
||||
#define KEY_RETURN (0x0d)
|
||||
#define KEY_SHIFT (0x10)
|
||||
#define KEY_LSHIFT (0x10)
|
||||
#define KEY_RSHIFT (0x10)
|
||||
#define KEY_CTRL (0x11)
|
||||
#define KEY_LCTRL (0x11)
|
||||
#define KEY_RCTRL (0x11)
|
||||
#define KEY_ALT (0x12)
|
||||
#define KEY_LALT (0x12)
|
||||
#define KEY_RALT (0x12)
|
||||
#define KEY_PAUSE (0x13)
|
||||
#define KEY_CAPSLOCK (0x14)
|
||||
#define KEY_KANAKAN (0x15)
|
||||
#define KEY_ESC (0x1b)
|
||||
#define KEY_ESCAPE (0x1b)
|
||||
#define KEY_SPACE (0x20)
|
||||
#define KEY_PAGEUP (0x21)
|
||||
#define KEY_PAGEDOWN (0x22)
|
||||
#define KEY_END (0x23)
|
||||
#define KEY_HOME (0x24)
|
||||
#define KEY_LEFT (0x25)
|
||||
#define KEY_UP (0x26)
|
||||
#define KEY_RIGHT (0x27)
|
||||
#define KEY_DOWN (0x28)
|
||||
#define KEY_SELECT (0x29)
|
||||
#define KEY_EXECUTE (0x2b)
|
||||
#define KEY_PRINTSCREEN (0x2c)
|
||||
#define KEY_INS (0x2d)
|
||||
#define KEY_INSERT (0x2d)
|
||||
#define KEY_DEL (0x2e)
|
||||
#define KEY_DELETE (0x2e)
|
||||
#define KEY_HELP (0x2f)
|
||||
#define KEY_0 (0x30)
|
||||
#define KEY_1 (0x31)
|
||||
#define KEY_2 (0x32)
|
||||
#define KEY_3 (0x33)
|
||||
#define KEY_4 (0x34)
|
||||
#define KEY_5 (0x35)
|
||||
#define KEY_6 (0x36)
|
||||
#define KEY_7 (0x37)
|
||||
#define KEY_8 (0x38)
|
||||
#define KEY_9 (0x39)
|
||||
#define KEY_PAD_EQUALS (0x3d)
|
||||
#define KEY_A (0x41)
|
||||
#define KEY_B (0x42)
|
||||
#define KEY_C (0x43)
|
||||
#define KEY_D (0x44)
|
||||
#define KEY_E (0x45)
|
||||
#define KEY_F (0x46)
|
||||
#define KEY_G (0x47)
|
||||
#define KEY_H (0x48)
|
||||
#define KEY_I (0x49)
|
||||
#define KEY_J (0x4a)
|
||||
#define KEY_K (0x4b)
|
||||
#define KEY_L (0x4c)
|
||||
#define KEY_M (0x4d)
|
||||
#define KEY_N (0x4e)
|
||||
#define KEY_O (0x4f)
|
||||
#define KEY_P (0x50)
|
||||
#define KEY_Q (0x51)
|
||||
#define KEY_R (0x52)
|
||||
#define KEY_S (0x53)
|
||||
#define KEY_T (0x54)
|
||||
#define KEY_U (0x55)
|
||||
#define KEY_V (0x56)
|
||||
#define KEY_W (0x57)
|
||||
#define KEY_X (0x58)
|
||||
#define KEY_Y (0x59)
|
||||
#define KEY_Z (0x5a)
|
||||
#define KEY_PAD_0 (0x60)
|
||||
#define KEY_PAD_1 (0x61)
|
||||
#define KEY_PAD_2 (0x62)
|
||||
#define KEY_PAD_3 (0x63)
|
||||
#define KEY_PAD_4 (0x64)
|
||||
#define KEY_PAD_5 (0x65)
|
||||
#define KEY_PAD_6 (0x66)
|
||||
#define KEY_PAD_7 (0x67)
|
||||
#define KEY_PAD_8 (0x68)
|
||||
#define KEY_PAD_9 (0x69)
|
||||
#define KEY_PAD_STAR (0x6a)
|
||||
#define KEY_PAD_MULTIPLY (0x6a)
|
||||
#define KEY_PAD_PLUS (0x6b)
|
||||
#define KEY_PAD_SEP (0x6c)
|
||||
#define KEY_PAD_MINUS (0x6d)
|
||||
#define KEY_PAD_DOT (0x6e)
|
||||
#define KEY_PAD_PERIOD (0x6e)
|
||||
#define KEY_PAD_SLASH (0x6f)
|
||||
#define KEY_PAD_DIVIDE (0x6f)
|
||||
#define KEY_F1 (0x70)
|
||||
#define KEY_F2 (0x71)
|
||||
#define KEY_F3 (0x72)
|
||||
#define KEY_F4 (0x73)
|
||||
#define KEY_F5 (0x74)
|
||||
#define KEY_F6 (0x75)
|
||||
#define KEY_F7 (0x76)
|
||||
#define KEY_F8 (0x77)
|
||||
#define KEY_F9 (0x78)
|
||||
#define KEY_F10 (0x79)
|
||||
#define KEY_F11 (0x7a)
|
||||
#define KEY_F12 (0x7b)
|
||||
#define KEY_F13 (0x7c)
|
||||
#define KEY_F14 (0x7d)
|
||||
#define KEY_F15 (0x7e)
|
||||
#define KEY_F16 (0x7f)
|
||||
#define KEY_F17 (0x80)
|
||||
#define KEY_F18 (0x81)
|
||||
#define KEY_F19 (0x82)
|
||||
#define KEY_F20 (0x83)
|
||||
#define KEY_F21 (0x84)
|
||||
#define KEY_F22 (0x85)
|
||||
#define KEY_F23 (0x86)
|
||||
#define KEY_F24 (0x87)
|
||||
#define KEY_NUMLOCK (0x90)
|
||||
#define KEY_SCROLL_LOCK (0x91)
|
||||
#define KEY_SCROLLOCK (0x91)
|
||||
|
||||
#endif /* __KEYCODE__ */
|
||||
+8
-6
@@ -93,13 +93,15 @@ void msg_init() {
|
||||
}
|
||||
memset(msg.wininfo, 0, sizeof(msg.wininfo));
|
||||
|
||||
for (int i = 0; i < MSGWINMAX; i++) {
|
||||
msg.wininfo[i].x = 100;
|
||||
msg.wininfo[i].y = 300;
|
||||
msg.wininfo[i].width = 400;
|
||||
msg.wininfo[i].height = 90;
|
||||
}
|
||||
msg.winno = 1;
|
||||
msg.win = &msg.wininfo[0];
|
||||
msg.wininfo[0].x = 8;
|
||||
msg.wininfo[0].y = 311;
|
||||
msg.wininfo[0].width = 616;
|
||||
msg.wininfo[0].height = 80;
|
||||
msg.wininfo[0].save = TRUE;
|
||||
msg.win = &msg.wininfo[1];
|
||||
msg.wininfo[1].save = TRUE;
|
||||
|
||||
// Private variables
|
||||
msgDecorateColor = 0;
|
||||
|
||||
+22
-38
@@ -24,43 +24,15 @@
|
||||
#include "portab.h"
|
||||
#include "midi.h"
|
||||
|
||||
static int midi_initilize(char *pname, int subdev);
|
||||
static int midi_exit(void);
|
||||
static int midi_reset(void);
|
||||
static int midi_start(int no, int loop, char *data, int datalen);
|
||||
static int midi_stop();
|
||||
extern int midi_pause(void);
|
||||
extern int midi_unpause(void);
|
||||
static int midi_get_playing_info(midiplaystate *st);
|
||||
static int midi_getflag(int mode, int index);
|
||||
static int midi_setflag(int mode, int index, int val);
|
||||
extern int midi_setvol(int vol);
|
||||
extern int midi_getvol();
|
||||
extern int midi_fadestart(int time, int volume, int stop);
|
||||
extern boolean midi_fading();
|
||||
|
||||
#define midi midi_emscripten
|
||||
mididevice_t midi = {
|
||||
midi_initilize,
|
||||
midi_exit,
|
||||
midi_reset,
|
||||
midi_start,
|
||||
midi_stop,
|
||||
midi_pause,
|
||||
midi_unpause,
|
||||
midi_get_playing_info,
|
||||
midi_getflag,
|
||||
midi_setflag,
|
||||
midi_setvol,
|
||||
midi_getvol,
|
||||
midi_fadestart,
|
||||
midi_fading
|
||||
};
|
||||
|
||||
static int midi_initilize(char *pname, int subdev) {
|
||||
return OK;
|
||||
}
|
||||
|
||||
EM_JS(int, midi_stop, (void), {
|
||||
xsystem35.midiPlayer.stop();
|
||||
return xsystem35.Status.OK;
|
||||
});
|
||||
|
||||
static int midi_exit(void) {
|
||||
midi_stop();
|
||||
return OK;
|
||||
@@ -76,11 +48,6 @@ static int midi_start(int no, int loop, char *data, int datalen) {
|
||||
return OK;
|
||||
}
|
||||
|
||||
static int midi_stop() {
|
||||
EM_ASM( xsystem35.midiPlayer.stop(); );
|
||||
return OK;
|
||||
}
|
||||
|
||||
EM_JS(int, midi_pause, (void), {
|
||||
xsystem35.midiPlayer.pause();
|
||||
return xsystem35.Status.OK;
|
||||
@@ -127,3 +94,20 @@ EM_JS(int, midi_fadestart, (int time, int volume, int stop), {
|
||||
EM_JS(boolean, midi_fading, (), {
|
||||
return xsystem35.midiPlayer.isFading();
|
||||
});
|
||||
|
||||
mididevice_t midi_emscripten = {
|
||||
midi_initilize,
|
||||
midi_exit,
|
||||
midi_reset,
|
||||
midi_start,
|
||||
midi_stop,
|
||||
midi_pause,
|
||||
midi_unpause,
|
||||
midi_get_playing_info,
|
||||
midi_getflag,
|
||||
midi_setflag,
|
||||
midi_setvol,
|
||||
midi_getvol,
|
||||
midi_fadestart,
|
||||
midi_fading
|
||||
};
|
||||
|
||||
+452
-450
File diff suppressed because it is too large
Load Diff
+25
-93
@@ -24,105 +24,37 @@
|
||||
#ifndef __SAVEDATA__
|
||||
#define __SAVEDATA__
|
||||
|
||||
#ifdef __EMSCRIPTEN__
|
||||
#include <emscripten.h>
|
||||
#else
|
||||
typedef int emscripten_align1_int;
|
||||
#endif
|
||||
|
||||
#include "portab.h"
|
||||
#include "windowframe.h"
|
||||
|
||||
#define SAVE_MAXNUMBER (26)
|
||||
#define SAVE_MAXNUMBER 26
|
||||
|
||||
#define SAVE_SAVEERR (255)
|
||||
#define SAVE_LOADERR (255)
|
||||
#define SAVE_LOADSHORTAGE (254)
|
||||
#define SAVE_OTHERERR (201)
|
||||
#define SAVE_LOADOK (0)
|
||||
#define SAVE_SAVEOK1 (1)
|
||||
#define SAVE_SAVEOK0 (0)
|
||||
#define SAVE_SAVEERR 255
|
||||
#define SAVE_LOADERR 255
|
||||
#define SAVE_LOADSHORTAGE 254
|
||||
#define SAVE_OTHERERR 201
|
||||
#define SAVE_LOADOK 0
|
||||
#define SAVE_SAVEOK1 1
|
||||
#define SAVE_SAVEOK0 0
|
||||
|
||||
#define SAVE_DATAID "System3.5 SavaData(c)ALICE-SOFT"
|
||||
#define SAVE_DATAVERSION 0x350200
|
||||
enum save_format {
|
||||
SAVEFMT_XSYS35,
|
||||
SAVEFMT_SYS36, // System3.5 v2.x - System3.6
|
||||
SAVEFMT_SYS38, // System3.8 - System3.9
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
uint16_t x;
|
||||
uint16_t y;
|
||||
uint16_t width;
|
||||
uint16_t height;
|
||||
} RectangleW;
|
||||
|
||||
typedef struct {
|
||||
char ID[32];
|
||||
int version;
|
||||
char gameName[28];
|
||||
uint8_t selMsgSize;
|
||||
uint8_t selMsgColor;
|
||||
uint8_t selBackColor;
|
||||
uint8_t selFrameColor;
|
||||
uint8_t msgMsgSize;
|
||||
uint8_t msgMsgColor;
|
||||
uint8_t msgBackColor;
|
||||
uint8_t msgFrameColor;
|
||||
uint8_t rsvB1;
|
||||
uint8_t rsvB2;
|
||||
uint8_t rsvB3;
|
||||
uint8_t rsvB4;
|
||||
uint8_t rsvB5;
|
||||
uint8_t rsvB6;
|
||||
uint8_t rsvB7;
|
||||
uint8_t rsvB8;
|
||||
int scoPage;
|
||||
int scoIndex;
|
||||
int rsvI1;
|
||||
int rsvI2;
|
||||
RectangleW selWinInfo[SELWINMAX];
|
||||
RectangleW msgWinInfo[MSGWINMAX];
|
||||
int stackinfo;
|
||||
int varStr;
|
||||
int rsvI3;
|
||||
int rsvI4;
|
||||
int varSys[256];
|
||||
int rsvI[228];
|
||||
} Ald_baseHdr;
|
||||
|
||||
typedef struct {
|
||||
int size;
|
||||
int count;
|
||||
int maxlen;
|
||||
int rsv1;
|
||||
} Ald_strVarHdr;
|
||||
|
||||
typedef struct {
|
||||
int size;
|
||||
int rsv1;
|
||||
int rsv2;
|
||||
int rsv3;
|
||||
} Ald_stackHdr;
|
||||
|
||||
typedef struct {
|
||||
emscripten_align1_int size;
|
||||
emscripten_align1_int pageNo;
|
||||
emscripten_align1_int rsv1;
|
||||
emscripten_align1_int rsv2;
|
||||
} Ald_sysVarHdr;
|
||||
|
||||
/* defined by variable.c */
|
||||
extern int strvar_len;
|
||||
struct VarRef;
|
||||
|
||||
extern int save_loadAll(int no);
|
||||
extern int save_saveAll(int no);
|
||||
extern int save_loadPartial(int no, struct VarRef *vref, int cnt);
|
||||
extern int save_savePartial(int no, struct VarRef *vref, int cnt);
|
||||
extern int save_copyAll(int dstno, int srcno);
|
||||
extern int save_vars_to_file(char *fname_utf8, struct VarRef *src, int cnt);
|
||||
extern int load_vars_from_file(char *fname_utf8, struct VarRef *dest, int cnt);
|
||||
extern int save_save_str_with_file(char *fname_utf8, int start, int cnt);
|
||||
extern int save_load_str_with_file(char *fname_utf8, int start, int cnt);
|
||||
extern uint8_t* load_cg_with_file(char *fname_utf8, int *status, long *filesize);
|
||||
extern const char *save_get_file(int index);
|
||||
extern int save_delete_file(int index);
|
||||
int save_setFormat(const char *format_name);
|
||||
int save_loadAll(int no);
|
||||
int save_saveAll(int no);
|
||||
int save_loadPartial(int no, struct VarRef *vref, int cnt);
|
||||
int save_savePartial(int no, struct VarRef *vref, int cnt);
|
||||
int save_copyAll(int dstno, int srcno);
|
||||
int save_vars_to_file(char *fname_utf8, struct VarRef *src, int cnt);
|
||||
int load_vars_from_file(char *fname_utf8, struct VarRef *dest, int cnt);
|
||||
int save_strs_to_file(char *fname_utf8, int start, int cnt);
|
||||
int load_strs_from_file(char *fname_utf8, int start, int cnt);
|
||||
const char *save_get_file(int index);
|
||||
int save_delete_file(int index);
|
||||
|
||||
#endif /* __SAVEDATA__ */
|
||||
|
||||
+481
-246
@@ -36,15 +36,10 @@ const uint8_t *sl_sco;
|
||||
int sl_page;
|
||||
int sl_index;
|
||||
|
||||
/* static mathods */
|
||||
static void popVars(int *tmp);
|
||||
static void popState(int *tmp);
|
||||
static void sl_push(int type, int *val, int cnt);
|
||||
static int* sl_pop(void);
|
||||
static void pop_state(uint8_t tag);
|
||||
|
||||
/* static variables */
|
||||
static int *stack_buf;
|
||||
static int *stack_top;
|
||||
static uint8_t *stack_buf;
|
||||
static uint8_t *stack_top;
|
||||
static int stack_size = 1024;
|
||||
|
||||
static char strbuf[512];
|
||||
@@ -52,9 +47,55 @@ static char strbuf[512];
|
||||
static dridata *dfile; // dri object for current page
|
||||
static dridata *datatbl; // dri object for data table
|
||||
|
||||
static void stack_reserve(int size) {
|
||||
if (stack_top + size < stack_buf + stack_size)
|
||||
return;
|
||||
int n = stack_top - stack_buf;
|
||||
stack_size *= 2;
|
||||
stack_buf = realloc(stack_buf, stack_size);
|
||||
if (!stack_buf)
|
||||
NOMEMERR();
|
||||
stack_top = stack_buf + n;
|
||||
}
|
||||
|
||||
static void stack_push_byte(uint8_t v) {
|
||||
*stack_top++ = v;
|
||||
}
|
||||
|
||||
static void stack_push_word(uint16_t v) {
|
||||
LittleEndian_putW(v, stack_top, 0);
|
||||
stack_top += 2;
|
||||
}
|
||||
|
||||
static void stack_push_dword(uint32_t v) {
|
||||
LittleEndian_putDW(v, stack_top, 0);
|
||||
stack_top += 4;
|
||||
}
|
||||
|
||||
static void stack_drop(int n) {
|
||||
stack_top -= n;
|
||||
if (stack_top < stack_buf)
|
||||
SYSERROR("stack underflow");
|
||||
}
|
||||
|
||||
static uint8_t stack_pop_byte(void) {
|
||||
stack_drop(1);
|
||||
return *stack_top;
|
||||
}
|
||||
|
||||
static int stack_pop_word(void) {
|
||||
stack_drop(2);
|
||||
return LittleEndian_getW(stack_top, 0);
|
||||
}
|
||||
|
||||
static int stack_pop_dword(void) {
|
||||
stack_drop(4);
|
||||
return LittleEndian_getDW(stack_top, 0);
|
||||
}
|
||||
|
||||
/* initilize stack and load first scenario data */
|
||||
boolean sl_init(void) {
|
||||
stack_buf = calloc(stack_size, sizeof(int));
|
||||
stack_buf = malloc(stack_size);
|
||||
if (stack_buf == NULL)
|
||||
NOMEMERR();
|
||||
|
||||
@@ -70,48 +111,6 @@ boolean sl_reinit(void) {
|
||||
return sl_init();
|
||||
}
|
||||
|
||||
static void sl_push(int type, int *val, int cnt) {
|
||||
int i;
|
||||
|
||||
if (stack_top + cnt >= stack_buf + stack_size) {
|
||||
i = stack_top - stack_buf;
|
||||
stack_size <<= 1;
|
||||
stack_buf = realloc(stack_buf, stack_size * sizeof(int));
|
||||
if (stack_buf == NULL)
|
||||
NOMEMERR();
|
||||
stack_top = stack_buf + i;
|
||||
}
|
||||
val += (cnt - 1);
|
||||
for (i = 0; i < cnt; i++) {
|
||||
*stack_top++ = *val--;
|
||||
}
|
||||
*stack_top++ = cnt;
|
||||
*stack_top++ = type;
|
||||
}
|
||||
|
||||
static int* sl_pop(void) {
|
||||
int i, type, cnt;
|
||||
int *tmp, *_tmp;
|
||||
|
||||
type = *--stack_top;
|
||||
cnt = *--stack_top;
|
||||
|
||||
tmp = _tmp = malloc(sizeof(int) * (cnt + 2));
|
||||
if (_tmp == NULL)
|
||||
NOMEMERR();
|
||||
|
||||
*tmp++ = type;
|
||||
*tmp++ = cnt;
|
||||
for (i = 0; i < cnt; i++) {
|
||||
*tmp++ = *--stack_top;
|
||||
}
|
||||
if (stack_top < stack_buf) {
|
||||
SYSERROR("Stack buffer is illegal");
|
||||
}
|
||||
|
||||
return _tmp;
|
||||
}
|
||||
|
||||
int sl_getw(void) {
|
||||
int c0 = sl_getc();
|
||||
int c1 = sl_getc();
|
||||
@@ -212,71 +211,64 @@ boolean sl_jmpFar2(int page, int address) {
|
||||
}
|
||||
|
||||
void sl_callNear(int address) {
|
||||
int val[1];
|
||||
val[0] = sl_index;
|
||||
sl_push(STACK_NEARJMP, val, 1);
|
||||
stack_reserve(4 + 1);
|
||||
stack_push_dword(sl_index);
|
||||
stack_push_byte(STACK_NEARCALL);
|
||||
sl_jmpNear(address);
|
||||
}
|
||||
|
||||
void sl_retNear(void) {
|
||||
int *tmp = sl_pop();
|
||||
int index;
|
||||
|
||||
while (*tmp != STACK_NEARJMP) {
|
||||
if (*tmp == STACK_FARJMP) {
|
||||
SYSERROR("Stack buffer is illegal");
|
||||
} else if (*tmp == STACK_TXXSTATE) {
|
||||
popState(tmp);
|
||||
} else if (*tmp == STACK_VARIABLE) {
|
||||
popVars(tmp);
|
||||
} else {
|
||||
SYSERROR("Stack buffer is illegal");
|
||||
uint8_t tag;
|
||||
while ((tag = stack_pop_byte()) != STACK_NEARCALL) {
|
||||
switch (tag) {
|
||||
case STACK_FARCALL:
|
||||
SYSERROR("label return from page call");
|
||||
break;
|
||||
default:
|
||||
pop_state(tag);
|
||||
break;
|
||||
}
|
||||
free(tmp);
|
||||
tmp = sl_pop();
|
||||
}
|
||||
index = *(tmp + 2);
|
||||
free(tmp);
|
||||
sl_jmpNear(index);
|
||||
int address = stack_pop_dword();
|
||||
sl_jmpNear(address);
|
||||
}
|
||||
|
||||
void sl_callFar(int page) {
|
||||
int val[2] = { sl_page, sl_index };
|
||||
sl_push(STACK_FARJMP, val, 2);
|
||||
boolean ok = sl_jmpFar(page);
|
||||
if (!ok)
|
||||
stack_reserve(2 + 4 + 1);
|
||||
stack_push_word(sl_page + 1);
|
||||
stack_push_dword(sl_index);
|
||||
stack_push_byte(STACK_FARCALL);
|
||||
|
||||
if (!sl_jmpFar(page))
|
||||
sl_retFar();
|
||||
}
|
||||
|
||||
void sl_callFar2(int page, int address) {
|
||||
int val[2] = { sl_page, sl_index };
|
||||
sl_push(STACK_FARJMP, val, 2);
|
||||
boolean ok = sl_jmpFar2(page, address);
|
||||
if (!ok)
|
||||
stack_reserve(2 + 4 + 1);
|
||||
stack_push_word(sl_page + 1);
|
||||
stack_push_dword(sl_index);
|
||||
stack_push_byte(STACK_FARCALL);
|
||||
|
||||
if (!sl_jmpFar2(page, address))
|
||||
sl_retFar();
|
||||
}
|
||||
|
||||
void sl_retFar(void) {
|
||||
int *tmp = sl_pop();
|
||||
int page, index;
|
||||
|
||||
while (*tmp != STACK_FARJMP) {
|
||||
if (*tmp == STACK_NEARJMP) {
|
||||
// do nothing
|
||||
} else if (*tmp == STACK_TXXSTATE) {
|
||||
popState(tmp);
|
||||
} else if (*tmp == STACK_VARIABLE) {
|
||||
popVars(tmp);
|
||||
} else {
|
||||
SYSERROR("Stack buffer is illegal");
|
||||
uint8_t tag;
|
||||
while ((tag = stack_pop_byte()) != STACK_FARCALL) {
|
||||
switch (tag) {
|
||||
case STACK_NEARCALL:
|
||||
stack_drop(4);
|
||||
break;
|
||||
default:
|
||||
pop_state(tag);
|
||||
break;
|
||||
}
|
||||
free(tmp);
|
||||
tmp = sl_pop();
|
||||
}
|
||||
page = *(tmp + 2);
|
||||
index = *(tmp + 3);
|
||||
free(tmp);
|
||||
sl_jmpFar2(page, index);
|
||||
|
||||
int address = stack_pop_dword();
|
||||
int page = stack_pop_word() - 1;
|
||||
sl_jmpFar2(page, address);
|
||||
}
|
||||
|
||||
/* UC0 */
|
||||
@@ -286,211 +278,467 @@ void sl_clearStack(bool restore) {
|
||||
return;
|
||||
}
|
||||
while (stack_top > stack_buf) {
|
||||
int *tmp = sl_pop();
|
||||
switch (*tmp) {
|
||||
case STACK_NEARJMP:
|
||||
case STACK_FARJMP:
|
||||
uint8_t tag = stack_pop_byte();
|
||||
switch (tag) {
|
||||
case STACK_NEARCALL:
|
||||
stack_drop(4);
|
||||
break;
|
||||
case STACK_VARIABLE:
|
||||
popVars(tmp);
|
||||
break;
|
||||
case STACK_TXXSTATE:
|
||||
popState(tmp);
|
||||
case STACK_FARCALL:
|
||||
stack_drop(4 + 2);
|
||||
break;
|
||||
default:
|
||||
SYSERROR("broken stack");
|
||||
pop_state(tag);
|
||||
break;
|
||||
}
|
||||
free(tmp);
|
||||
}
|
||||
|
||||
stack_top = stack_buf;
|
||||
}
|
||||
|
||||
/* UC 2 */
|
||||
void sl_dropPageCalls(int cnt) {
|
||||
while (cnt > 0 && stack_top > stack_buf) {
|
||||
int *tmp = sl_pop();
|
||||
switch (*tmp) {
|
||||
case STACK_NEARJMP:
|
||||
while (cnt > 0) {
|
||||
uint8_t tag = stack_pop_byte();
|
||||
switch (tag) {
|
||||
case STACK_NEARCALL:
|
||||
stack_drop(4);
|
||||
break;
|
||||
case STACK_FARJMP:
|
||||
case STACK_FARCALL:
|
||||
stack_drop(4 + 2);
|
||||
cnt--;
|
||||
break;
|
||||
case STACK_VARIABLE:
|
||||
popVars(tmp);
|
||||
break;
|
||||
case STACK_TXXSTATE:
|
||||
popState(tmp);
|
||||
break;
|
||||
default:
|
||||
SYSERROR("broken stack");
|
||||
pop_state(tag);
|
||||
break;
|
||||
}
|
||||
free(tmp);
|
||||
}
|
||||
}
|
||||
|
||||
/* UC 1 */
|
||||
void sl_dropLabelCalls(int cnt) {
|
||||
while (cnt > 0 && stack_top > stack_buf && stack_top[-1] != STACK_FARJMP) {
|
||||
int *tmp = sl_pop();
|
||||
switch (*tmp) {
|
||||
case STACK_NEARJMP:
|
||||
while (cnt > 0) {
|
||||
uint8_t tag = stack_pop_byte();
|
||||
switch (tag) {
|
||||
case STACK_NEARCALL:
|
||||
stack_drop(4);
|
||||
cnt--;
|
||||
break;
|
||||
case STACK_VARIABLE:
|
||||
popVars(tmp);
|
||||
break;
|
||||
case STACK_TXXSTATE:
|
||||
popState(tmp);
|
||||
break;
|
||||
case STACK_FARCALL:
|
||||
stack_push_byte(tag);
|
||||
return;
|
||||
default:
|
||||
SYSERROR("broken stack");
|
||||
pop_state(tag);
|
||||
break;
|
||||
}
|
||||
free(tmp);
|
||||
}
|
||||
}
|
||||
|
||||
/* US */
|
||||
void sl_pushVar(struct VarRef *vref, int cnt) {
|
||||
int *tmp = malloc(sizeof(int) * (cnt + 2));
|
||||
|
||||
if (tmp == NULL) {
|
||||
NOMEMERR();
|
||||
stack_reserve((2 + 2 + 2 + 1) * cnt);
|
||||
int *val = v_resolveRef(vref);
|
||||
for (int i = 0; i < cnt; i++) {
|
||||
stack_push_word(vref->index + i);
|
||||
stack_push_word(vref->page);
|
||||
stack_push_word(val[i]);
|
||||
stack_push_byte(STACK_VARIABLE);
|
||||
}
|
||||
|
||||
*tmp = vref->page;
|
||||
*(tmp+1) = vref->index;
|
||||
memcpy(tmp + 2, v_resolveRef(vref), sizeof(int) * cnt);
|
||||
sl_push(STACK_VARIABLE, tmp, cnt + 2);
|
||||
free(tmp);
|
||||
}
|
||||
|
||||
/* UG */
|
||||
void sl_popVar(struct VarRef *vref, int cnt) {
|
||||
int *tmp = sl_pop();
|
||||
|
||||
if (*tmp != STACK_VARIABLE) {
|
||||
SYSERROR("Stack buffer is illegal");
|
||||
int *val = v_resolveRef(vref) + cnt;
|
||||
while (cnt-- > 0) {
|
||||
if (stack_pop_byte() != STACK_VARIABLE)
|
||||
SYSERROR("stack top is not a variable push");
|
||||
*--val = stack_pop_word();
|
||||
stack_drop(2 + 2);
|
||||
}
|
||||
if (*(tmp + 2) != vref->page){
|
||||
WARNING("Variable is not match with stacked variable");
|
||||
}
|
||||
if (*(tmp + 3) != vref->index) {
|
||||
WARNING("Variable is not match with stacked variable");
|
||||
}
|
||||
if (*(tmp + 1) != cnt + 2) {
|
||||
WARNING("Variable count is not match with stacked variable");
|
||||
}
|
||||
memcpy(v_resolveRef(vref), tmp + 4, sizeof(int) * cnt);
|
||||
free(tmp);
|
||||
}
|
||||
|
||||
static void popVars(int *tmp) {
|
||||
int cnt, page, index;
|
||||
int *topVar;
|
||||
|
||||
cnt = *(tmp + 1) - 2;
|
||||
page = *(tmp + 2);
|
||||
index = *(tmp + 3);
|
||||
enum save_stack_frame_type {
|
||||
SAVE_NEARJMP = 1,
|
||||
SAVE_FARJMP = 2,
|
||||
SAVE_VARIABLE = 3,
|
||||
SAVE_TXXSTATE = 4
|
||||
};
|
||||
|
||||
if (!varPage[page].value) {
|
||||
WARNING("Illegal Variable pop");
|
||||
enum txx_type {
|
||||
TxxTEXTCOLOR = 1,
|
||||
TxxTEXTSIZE = 2,
|
||||
TxxTEXTLOC = 3
|
||||
};
|
||||
|
||||
struct save_stack_frame {
|
||||
struct save_stack_frame *next;
|
||||
int len;
|
||||
int buf[];
|
||||
};
|
||||
|
||||
struct save_stack_frame *push_save_stack_frame(int size, struct save_stack_frame *next) {
|
||||
struct save_stack_frame *f =
|
||||
malloc(sizeof(struct save_stack_frame) + sizeof(int) * size);
|
||||
f->next = next;
|
||||
f->len = size;
|
||||
return f;
|
||||
}
|
||||
|
||||
uint8_t *sl_saveStack(enum save_format format, int *size_out) {
|
||||
if (format != SAVEFMT_XSYS35) {
|
||||
int size = stack_top - stack_buf;
|
||||
uint8_t *buf = malloc(size);
|
||||
memcpy(buf, stack_buf, size);
|
||||
*size_out = size;
|
||||
return buf;
|
||||
}
|
||||
|
||||
// Serialize to the stack format used in old versions of xsystem35.
|
||||
struct save_stack_frame *frame = NULL;
|
||||
uint8_t *sp = stack_top;
|
||||
while (sp > stack_buf) {
|
||||
switch (sp[-1]) {
|
||||
case STACK_FARCALL:
|
||||
sp -= 7;
|
||||
frame = push_save_stack_frame(4, frame);
|
||||
frame->buf[3] = SAVE_FARJMP;
|
||||
frame->buf[2] = 2;
|
||||
frame->buf[1] = LittleEndian_getW(sp, 0) - 1; // page
|
||||
frame->buf[0] = LittleEndian_getDW(sp, 2); // addr
|
||||
break;
|
||||
case STACK_NEARCALL:
|
||||
sp -= 5;
|
||||
frame = push_save_stack_frame(3, frame);
|
||||
frame->buf[2] = SAVE_NEARJMP;
|
||||
frame->buf[1] = 1;
|
||||
frame->buf[0] = LittleEndian_getDW(sp, 0); // addr
|
||||
break;
|
||||
case STACK_VARIABLE:
|
||||
sp -= 7;
|
||||
{
|
||||
int index = LittleEndian_getW(sp, 0);
|
||||
int page = LittleEndian_getW(sp, 2);
|
||||
int value = LittleEndian_getW(sp, 4);
|
||||
if (frame && frame->buf[frame->len - 1] == SAVE_VARIABLE) {
|
||||
int count = frame->buf[frame->len - 2];
|
||||
int fpage = frame->buf[frame->len - 3];
|
||||
int base = frame->buf[frame->len - 4];
|
||||
// Merge into existing SAVE_VARIABLE frame.
|
||||
if (page == fpage && index == base - 1) {
|
||||
frame = realloc(frame, sizeof(struct save_stack_frame) + sizeof(int) * (frame->len + 1));
|
||||
frame->len++;
|
||||
frame->buf[frame->len - 1] = SAVE_VARIABLE;
|
||||
frame->buf[frame->len - 2] = count + 1;
|
||||
frame->buf[frame->len - 3] = page;
|
||||
frame->buf[frame->len - 4] = base - 1;
|
||||
frame->buf[frame->len - 5] = value;
|
||||
break;
|
||||
}
|
||||
}
|
||||
frame = push_save_stack_frame(5, frame);
|
||||
frame->buf[4] = SAVE_VARIABLE;
|
||||
frame->buf[3] = 3;
|
||||
frame->buf[2] = page;
|
||||
frame->buf[1] = index;
|
||||
frame->buf[0] = value;
|
||||
}
|
||||
break;
|
||||
case STACK_TEXTCOLOR:
|
||||
sp -= 3;
|
||||
frame = push_save_stack_frame(5, frame);
|
||||
frame->buf[4] = SAVE_TXXSTATE;
|
||||
frame->buf[3] = 3;
|
||||
frame->buf[2] = TxxTEXTCOLOR;
|
||||
frame->buf[1] = sp[0]; // type
|
||||
frame->buf[0] = sp[1]; // color
|
||||
break;
|
||||
case STACK_TEXTSIZE:
|
||||
sp -= 6;
|
||||
frame = push_save_stack_frame(5, frame);
|
||||
frame->buf[4] = SAVE_TXXSTATE;
|
||||
frame->buf[3] = 3;
|
||||
frame->buf[2] = TxxTEXTSIZE;
|
||||
frame->buf[1] = sp[0]; // type
|
||||
frame->buf[0] = LittleEndian_getDW(sp, 1); // size
|
||||
break;
|
||||
case STACK_TEXTLOC:
|
||||
sp -= 9;
|
||||
frame = push_save_stack_frame(5, frame);
|
||||
frame->buf[4] = SAVE_TXXSTATE;
|
||||
frame->buf[3] = 3;
|
||||
frame->buf[2] = TxxTEXTLOC;
|
||||
frame->buf[1] = LittleEndian_getDW(sp, 0); // x
|
||||
frame->buf[0] = LittleEndian_getDW(sp, 4); // y
|
||||
break;
|
||||
default:
|
||||
SYSERROR("broken stack");
|
||||
}
|
||||
}
|
||||
int total_len = 0;
|
||||
for (struct save_stack_frame *f = frame; f; f = f->next)
|
||||
total_len += f->len;
|
||||
|
||||
int *buf = malloc(total_len * sizeof(int));
|
||||
int *p = buf;
|
||||
for (struct save_stack_frame *f = frame; f;) {
|
||||
memcpy(p, f->buf, f->len * sizeof(int));
|
||||
p += f->len;
|
||||
struct save_stack_frame *next = f->next;
|
||||
free(f);
|
||||
f = next;
|
||||
}
|
||||
|
||||
*size_out = total_len * sizeof(int);
|
||||
#if 0
|
||||
// Testing code. Call sl_loadStack with the serialized stack, and compare
|
||||
// the deserialized stack with the original stack.
|
||||
{
|
||||
int orig_size = stack_top - stack_buf;
|
||||
uint8_t *orig_stack = malloc(orig_size);
|
||||
memcpy(orig_stack, stack_buf, orig_size);
|
||||
|
||||
sl_loadStack(format, (uint8_t *)buf, *size_out);
|
||||
|
||||
if (stack_top - stack_buf != orig_size || memcmp(stack_buf, orig_stack, orig_size)) {
|
||||
FILE *fp = fopen("orig_stack", "wb");
|
||||
fwrite(orig_stack, 1, orig_size, fp);
|
||||
fclose(fp);
|
||||
fp = fopen("deserialized_stack", "wb");
|
||||
fwrite(stack_buf, 1, stack_top - stack_buf, fp);
|
||||
fclose(fp);
|
||||
SYSERROR("stack mismatch");
|
||||
}
|
||||
}
|
||||
#endif
|
||||
return (uint8_t *)buf;
|
||||
}
|
||||
|
||||
void sl_loadStack(enum save_format format, uint8_t *unaligned_data, int size) {
|
||||
if (format != SAVEFMT_XSYS35) {
|
||||
if (size > stack_size) {
|
||||
while (size > stack_size)
|
||||
stack_size *= 2;
|
||||
free(stack_buf);
|
||||
stack_buf = malloc(stack_size);
|
||||
if (!stack_buf)
|
||||
NOMEMERR();
|
||||
}
|
||||
memcpy(stack_buf, unaligned_data, size);
|
||||
stack_top = stack_buf + size;
|
||||
return;
|
||||
}
|
||||
topVar = &varPage[page].value[index];
|
||||
|
||||
memcpy(topVar, tmp + 4, sizeof(int) * cnt);
|
||||
}
|
||||
|
||||
int *sl_getStack(int *size) {
|
||||
*size = stack_top - stack_buf;
|
||||
return stack_buf;
|
||||
}
|
||||
// Deserialize from the stack format used in old versions of xsystem35.
|
||||
int *data = malloc(size);
|
||||
memcpy(data, unaligned_data, size);
|
||||
struct save_stack_frame *frame = NULL;
|
||||
|
||||
void sl_putStack(int *data, int size) {
|
||||
if (size > stack_size) {
|
||||
stack_size = size << 1;
|
||||
stack_buf = calloc(stack_size, sizeof(int));
|
||||
for (int *p = data + size / sizeof(int); p > data;) {
|
||||
int len = p[-2] + 2;
|
||||
p -= len;
|
||||
frame = push_save_stack_frame(len, frame);
|
||||
memcpy(frame->buf, p, len * sizeof(int));
|
||||
}
|
||||
free(data);
|
||||
|
||||
stack_top = stack_buf;
|
||||
for (struct save_stack_frame *f = frame; f;) {
|
||||
switch (f->buf[f->len - 1]) {
|
||||
case SAVE_NEARJMP:
|
||||
if (f->len != 3)
|
||||
SYSERROR("broken stack data");
|
||||
stack_reserve(4 + 1);
|
||||
stack_push_dword(f->buf[0]);
|
||||
stack_push_byte(STACK_NEARCALL);
|
||||
break;
|
||||
case SAVE_FARJMP:
|
||||
if (f->len != 4)
|
||||
SYSERROR("broken stack data");
|
||||
stack_reserve(2 + 4 + 1);
|
||||
stack_push_word(f->buf[1] + 1);
|
||||
stack_push_dword(f->buf[0]);
|
||||
stack_push_byte(STACK_FARCALL);
|
||||
break;
|
||||
case SAVE_VARIABLE:
|
||||
if (f->len < 5) {
|
||||
SYSERROR("broken stack data");
|
||||
} else {
|
||||
int count = f->len - 4;
|
||||
int page = f->buf[f->len - 3];
|
||||
int base = f->buf[f->len - 4];
|
||||
stack_reserve((2 + 2 + 2 + 1) * count);
|
||||
for (int i = 0; i < count; i++) {
|
||||
stack_push_word(base + i);
|
||||
stack_push_word(page);
|
||||
stack_push_word(f->buf[count - 1 - i]);
|
||||
stack_push_byte(STACK_VARIABLE);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case SAVE_TXXSTATE:
|
||||
if (f->len != 5)
|
||||
SYSERROR("broken stack data");
|
||||
switch (f->buf[2]) {
|
||||
case TxxTEXTCOLOR:
|
||||
stack_reserve(1 + 1 + 1);
|
||||
stack_push_byte(f->buf[1]); // type
|
||||
stack_push_byte(f->buf[0]); // color
|
||||
stack_push_byte(STACK_TEXTCOLOR);
|
||||
break;
|
||||
case TxxTEXTSIZE:
|
||||
stack_reserve(1 + 4 + 1);
|
||||
stack_push_byte(f->buf[1]); // type
|
||||
stack_push_dword(f->buf[0]); // size
|
||||
stack_push_byte(STACK_TEXTSIZE);
|
||||
break;
|
||||
case TxxTEXTLOC:
|
||||
stack_reserve(4 + 4 + 1);
|
||||
stack_push_dword(f->buf[1]); // x
|
||||
stack_push_dword(f->buf[0]); // y
|
||||
stack_push_byte(STACK_TEXTLOC);
|
||||
break;
|
||||
default:
|
||||
SYSERROR("broken stack data");
|
||||
}
|
||||
break;
|
||||
default:
|
||||
SYSERROR("broken stack data");
|
||||
}
|
||||
struct save_stack_frame *next = f->next;
|
||||
free(f);
|
||||
f = next;
|
||||
}
|
||||
if (stack_buf == NULL)
|
||||
NOMEMERR();
|
||||
memcpy(stack_buf, data, size * sizeof(int));
|
||||
stack_top = stack_buf + size;
|
||||
}
|
||||
|
||||
void sl_getStackInfo(struct stack_info *info) {
|
||||
memset(info, 0, sizeof(struct stack_info));
|
||||
for (int *p = stack_top; p > stack_buf; p -= p[-2] + 2) {
|
||||
switch (p[-1]) {
|
||||
case STACK_NEARJMP:
|
||||
|
||||
struct stack_frame_info *sfi = NULL;
|
||||
while ((sfi = sl_next_stack_frame(sfi)) != NULL) {
|
||||
switch (sfi->tag) {
|
||||
case STACK_NEARCALL:
|
||||
info->label_calls++;
|
||||
if (!info->page_calls)
|
||||
info->label_calls_after_page_call++;
|
||||
break;
|
||||
case STACK_FARJMP:
|
||||
case STACK_FARCALL:
|
||||
info->page_calls++;
|
||||
break;
|
||||
case STACK_VARIABLE:
|
||||
info->var_pushes += p[-2] - 2;
|
||||
info->var_pushes++;
|
||||
if (info->page_calls + info->label_calls == 0)
|
||||
info->var_pushes_after_call += p[-2] - 2;
|
||||
info->var_pushes_after_call++;
|
||||
break;
|
||||
case STACK_TXXSTATE:
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* TPx */
|
||||
void sl_pushState(enum txx_type type, int val1, int val2) {
|
||||
int data[] = {type, val1, val2};
|
||||
sl_push(STACK_TXXSTATE, data, 3);
|
||||
/* TPC */
|
||||
void sl_pushTextColor(uint8_t type, uint8_t color) {
|
||||
stack_reserve(1 + 1 + 1);
|
||||
stack_push_byte(type);
|
||||
stack_push_byte(color);
|
||||
stack_push_byte(STACK_TEXTCOLOR);
|
||||
}
|
||||
|
||||
/* TPS */
|
||||
void sl_pushTextSize(uint8_t type, int size) {
|
||||
stack_reserve(1 + 4 + 1);
|
||||
stack_push_byte(type);
|
||||
stack_push_dword(size);
|
||||
stack_push_byte(STACK_TEXTSIZE);
|
||||
}
|
||||
|
||||
/* TPP */
|
||||
void sl_pushTextLoc(int x, int y) {
|
||||
stack_reserve(4 + 4 + 1);
|
||||
stack_push_dword(x);
|
||||
stack_push_dword(y);
|
||||
stack_push_byte(STACK_TEXTLOC);
|
||||
}
|
||||
|
||||
/* TOx */
|
||||
void sl_popState(enum txx_type expected_type) {
|
||||
// No-op if the stack top is of an unexpected type.
|
||||
if (stack_top <= stack_buf ||
|
||||
stack_top[-1] != STACK_TXXSTATE ||
|
||||
stack_top[-3] != expected_type) {
|
||||
void sl_popState(uint8_t expected_type) {
|
||||
uint8_t tag = stack_pop_byte();
|
||||
if (tag != expected_type) {
|
||||
// No-op if the stack top is of an unexpected type.
|
||||
stack_push_byte(tag);
|
||||
WARNING("unexpected stack top type");
|
||||
return;
|
||||
}
|
||||
|
||||
int *tmp = sl_pop();
|
||||
popState(tmp);
|
||||
free(tmp);
|
||||
pop_state(tag);
|
||||
}
|
||||
|
||||
static void popState(int *tmp) {
|
||||
int d1 = *(tmp + 2);
|
||||
int d2 = *(tmp + 3);
|
||||
int d3 = *(tmp + 4);
|
||||
|
||||
if (*(tmp + 1) != 3)
|
||||
WARNING("Variable count is not match with stacked variable");
|
||||
|
||||
switch(d1) {
|
||||
case TxxTEXTCOLOR:
|
||||
if (d2 == 0) {
|
||||
nact->msg.MsgFontColor = d3;
|
||||
} else {
|
||||
nact->sel.MsgFontColor = d3;
|
||||
static void pop_state(uint8_t tag) {
|
||||
switch (tag) {
|
||||
case STACK_VARIABLE:
|
||||
{
|
||||
int value = stack_pop_word();
|
||||
int page = stack_pop_word();
|
||||
int index = stack_pop_word();
|
||||
varPage[page].value[index] = value;
|
||||
}
|
||||
break;
|
||||
case TxxTEXTSIZE:
|
||||
if (d2 == 0) {
|
||||
nact->msg.MsgFontSize = d3;
|
||||
} else {
|
||||
nact->sel.MsgFontSize = d3;
|
||||
case STACK_TEXTCOLOR:
|
||||
{
|
||||
uint8_t color = stack_pop_byte();
|
||||
uint8_t type = stack_pop_byte();
|
||||
if (type)
|
||||
nact->sel.MsgFontColor = color;
|
||||
else
|
||||
nact->msg.MsgFontColor = color;
|
||||
}
|
||||
break;
|
||||
case TxxTEXTLOC:
|
||||
msg_setMessageLocation(d2, d3);
|
||||
case STACK_TEXTSIZE:
|
||||
{
|
||||
int size = stack_pop_dword();
|
||||
uint8_t type = stack_pop_byte();
|
||||
if (type)
|
||||
nact->sel.MsgFontSize = size;
|
||||
else
|
||||
nact->msg.MsgFontSize = size;
|
||||
}
|
||||
break;
|
||||
case STACK_TEXTLOC:
|
||||
{
|
||||
int x = stack_pop_dword();
|
||||
int y = stack_pop_dword();
|
||||
msg_setMessageLocation(x, y);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
SYSERROR("broken stack");
|
||||
}
|
||||
}
|
||||
|
||||
struct stack_frame_info *sl_next_stack_frame(struct stack_frame_info *sfi) {
|
||||
static struct stack_frame_info frame_info;
|
||||
if (!sfi) {
|
||||
sfi = &frame_info;
|
||||
sfi->p = stack_top;
|
||||
}
|
||||
if (sfi->p <= stack_buf)
|
||||
return NULL;
|
||||
sfi->tag = sfi->p[-1];
|
||||
switch (sfi->tag) {
|
||||
case STACK_NEARCALL:
|
||||
sfi->p -= 5;
|
||||
sfi->addr = LittleEndian_getDW(sfi->p, 0);
|
||||
break;
|
||||
case STACK_FARCALL:
|
||||
sfi->p -= 7;
|
||||
sfi->page = LittleEndian_getW(sfi->p, 0) - 1;
|
||||
sfi->addr = LittleEndian_getDW(sfi->p, 2);
|
||||
break;
|
||||
case STACK_VARIABLE: sfi->p -= 7; break;
|
||||
case STACK_TEXTCOLOR: sfi->p -= 3; break;
|
||||
case STACK_TEXTSIZE: sfi->p -= 6; break;
|
||||
case STACK_TEXTLOC: sfi->p -= 9; break;
|
||||
default:
|
||||
SYSERROR("broken stack");
|
||||
}
|
||||
return sfi;
|
||||
}
|
||||
|
||||
void *sl_setDataTable(int page, int index) {
|
||||
if (datatbl) {
|
||||
ald_freedata(datatbl);
|
||||
@@ -500,29 +748,16 @@ void *sl_setDataTable(int page, int index) {
|
||||
}
|
||||
|
||||
void sl_returnGoto(int address) {
|
||||
int *tmp = sl_pop();
|
||||
int page;
|
||||
uint8_t tag;
|
||||
while ((tag = stack_pop_byte()) != STACK_FARCALL && tag != STACK_NEARCALL)
|
||||
pop_state(tag);
|
||||
|
||||
while (*tmp != STACK_FARJMP && *tmp != STACK_NEARJMP) {
|
||||
if (*tmp == STACK_TXXSTATE) {
|
||||
popState(tmp);
|
||||
} else if (*tmp == STACK_VARIABLE) {
|
||||
popVars(tmp);
|
||||
} else {
|
||||
SYSERROR("Stack buffer is illegal: %d", *tmp);
|
||||
}
|
||||
free(tmp);
|
||||
tmp = sl_pop();
|
||||
}
|
||||
|
||||
if (*tmp == STACK_FARJMP) {
|
||||
page = *(tmp + 2);
|
||||
// index = *(tmp + 3);
|
||||
free(tmp);
|
||||
if (tag == STACK_FARCALL) {
|
||||
stack_drop(4);
|
||||
int page = stack_pop_word() - 1;
|
||||
sl_jmpFar2(page, address);
|
||||
} else {
|
||||
// index = *(tmp + 2);
|
||||
free(tmp);
|
||||
stack_drop(4);
|
||||
sl_jmpNear(address);
|
||||
}
|
||||
}
|
||||
|
||||
+27
-21
@@ -27,21 +27,16 @@
|
||||
#include "portab.h"
|
||||
#include "system.h"
|
||||
|
||||
enum save_format;
|
||||
struct VarRef;
|
||||
|
||||
// Warning: changing these enum values will break savedata compatibility.
|
||||
enum stack_frame_type {
|
||||
STACK_NEARJMP = 1,
|
||||
STACK_FARJMP = 2,
|
||||
STACK_VARIABLE = 3,
|
||||
STACK_TXXSTATE = 4
|
||||
};
|
||||
|
||||
enum txx_type {
|
||||
TxxTEXTCOLOR = 1,
|
||||
TxxTEXTSIZE = 2,
|
||||
TxxTEXTLOC = 3
|
||||
};
|
||||
// Stack frame tags. Changing these will break savedata compatibility.
|
||||
#define STACK_FARCALL 0xFF
|
||||
#define STACK_NEARCALL 0xEE
|
||||
#define STACK_VARIABLE 0xDD
|
||||
#define STACK_TEXTCOLOR 0xCC
|
||||
#define STACK_TEXTSIZE 0xBB
|
||||
#define STACK_TEXTLOC 0xAA
|
||||
|
||||
struct stack_info {
|
||||
int top_attr; // always zero?
|
||||
@@ -52,6 +47,13 @@ struct stack_info {
|
||||
int var_pushes_after_call;
|
||||
};
|
||||
|
||||
struct stack_frame_info {
|
||||
uint8_t tag;
|
||||
uint16_t page; // STACK_FARCALL
|
||||
int addr; // STACK_FARCALL or STACK_NEARCALL
|
||||
uint8_t *p; // for internal use
|
||||
};
|
||||
|
||||
// Use functions below instead of accessing these variables directly.
|
||||
extern const uint8_t *sl_sco; // scenario page buffer
|
||||
extern int sl_page; // current scenario page (0-based)
|
||||
@@ -77,19 +79,23 @@ void sl_retNear(void);
|
||||
void sl_callFar(int page);
|
||||
void sl_callFar2(int page, int address);
|
||||
void sl_retFar(void);
|
||||
void sl_clearStack(bool restore);
|
||||
void sl_dropLabelCalls(int cnt);
|
||||
void sl_dropPageCalls(int cnt);
|
||||
void sl_pushVar(struct VarRef *vref, int cnt);
|
||||
void sl_popVar(struct VarRef *vref, int cnt);
|
||||
int *sl_getStack(int *size);
|
||||
void sl_putStack(int *data, int size);
|
||||
void sl_getStackInfo(struct stack_info *info);
|
||||
void sl_pushState(enum txx_type type, int val1, int val2);
|
||||
void sl_popState(enum txx_type expected_type);
|
||||
void *sl_setDataTable(int page, int index);
|
||||
void sl_returnGoto(int address);
|
||||
|
||||
void sl_clearStack(bool restore);
|
||||
void sl_pushVar(struct VarRef *vref, int cnt);
|
||||
void sl_popVar(struct VarRef *vref, int cnt);
|
||||
uint8_t *sl_saveStack(enum save_format format, int *size);
|
||||
void sl_loadStack(enum save_format format, uint8_t *data, int size);
|
||||
void sl_getStackInfo(struct stack_info *info);
|
||||
void sl_pushTextColor(uint8_t type, uint8_t color);
|
||||
void sl_pushTextSize(uint8_t type, int size);
|
||||
void sl_pushTextLoc(int x, int y);
|
||||
void sl_popState(uint8_t expected_type);
|
||||
struct stack_frame_info *sl_next_stack_frame(struct stack_frame_info *frame_info);
|
||||
|
||||
static inline int sl_getIndex(void) { return sl_index; }
|
||||
static inline int sl_getPage(void) { return sl_page; }
|
||||
static inline int sl_getc(void) { return sl_sco[sl_index++]; }
|
||||
|
||||
+3
-1
@@ -25,6 +25,7 @@
|
||||
|
||||
#include "config.h"
|
||||
#include <sys/types.h>
|
||||
#include <SDL_events.h>
|
||||
#include <SDL_surface.h>
|
||||
#include "portab.h"
|
||||
#include "ags.h"
|
||||
@@ -106,10 +107,11 @@ extern MyPoint sdl_translateMouseCoords(int x, int y);
|
||||
|
||||
/* misc */
|
||||
extern void sdl_mainIteration();
|
||||
extern boolean RawKeyInfo[];
|
||||
extern uint32_t sdl_getTicks(void);
|
||||
extern void sdl_sleep(int msec);
|
||||
extern void sdl_wait_vsync();
|
||||
extern boolean sdl_inputString(struct inputstring_param *);
|
||||
extern void sdl_post_debugger_command(void *data);
|
||||
extern void sdl_handle_event(SDL_Event *e);
|
||||
|
||||
#endif /* !__SDL_CORE__ */
|
||||
|
||||
+2
-9
@@ -207,14 +207,7 @@ void sdl_copyArea(int sx, int sy, int w, int h, int dx, int dy) {
|
||||
void sdl_copyAreaSP(int sx, int sy, int w, int h, int dx, int dy, uint8_t sp) {
|
||||
sdl_pal_check();
|
||||
|
||||
Uint32 col = sp;
|
||||
if (sdl_dib->format->BitsPerPixel > 8) {
|
||||
col = SDL_MapRGB(sdl_dib->format,
|
||||
sdl_col[sp].r & 0xf8,
|
||||
sdl_col[sp].g & 0xfc,
|
||||
sdl_col[sp].b & 0xf8);
|
||||
}
|
||||
|
||||
Uint32 col = palette_color(sp);
|
||||
SDL_SetColorKey(sdl_dib, SDL_TRUE, col);
|
||||
|
||||
SDL_Rect r_src = {sx, sy, w, h};
|
||||
@@ -321,7 +314,7 @@ SDL_Rect sdl_drawString(int x, int y, const char *str_utf8, uint8_t col) {
|
||||
* 指定範囲にパレット col を rate の割合で重ねる CK1
|
||||
*/
|
||||
void sdl_wrapColor(int sx, int sy, int w, int h, uint8_t c, int rate) {
|
||||
SDL_Surface *s = SDL_CreateRGBSurface(0, w, h, sdl_dib->format->BitsPerPixel, 0, 0, 0, 0);
|
||||
SDL_Surface *s = SDL_CreateRGBSurfaceWithFormat(0, w, h, sdl_dib->format->BitsPerPixel, sdl_dib->format->format);
|
||||
assert(s->format->BitsPerPixel > 8);
|
||||
|
||||
SDL_Rect r_src = {0, 0, w, h};
|
||||
|
||||
+353
-177
@@ -27,21 +27,30 @@
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <SDL.h>
|
||||
#ifdef __EMSCRIPTEN__
|
||||
#include <emscripten.h>
|
||||
#endif
|
||||
|
||||
#include "portab.h"
|
||||
#include "system.h"
|
||||
#include "debugger.h"
|
||||
#include "nact.h"
|
||||
#include "sdl_core.h"
|
||||
#include "sdl_private.h"
|
||||
#include "key.h"
|
||||
#include "menu.h"
|
||||
#include "input.h"
|
||||
#include "msgskip.h"
|
||||
#include "sdl_keytable.h"
|
||||
|
||||
static void sdl_getEvent(void);
|
||||
static void keyEventProsess(SDL_KeyboardEvent *e, boolean pressed);
|
||||
|
||||
static uint32_t custom_event_type = (uint32_t)-1;
|
||||
|
||||
enum CustomEventCode {
|
||||
SIMULATE_RIGHT_BUTTON,
|
||||
DEBUGGER_COMMAND,
|
||||
};
|
||||
|
||||
/* pointer の状態 */
|
||||
static int mousex, mousey, mouseb;
|
||||
static int mouse_wheel_up, mouse_wheel_down;
|
||||
@@ -50,6 +59,133 @@ boolean RawKeyInfo[256];
|
||||
/* SDL Joystick */
|
||||
static int joyinfo=0;
|
||||
|
||||
static int sdl_keytable[SDL_NUM_SCANCODES] = {
|
||||
[SDL_SCANCODE_A] = KEY_A,
|
||||
[SDL_SCANCODE_B] = KEY_B,
|
||||
[SDL_SCANCODE_C] = KEY_C,
|
||||
[SDL_SCANCODE_D] = KEY_D,
|
||||
[SDL_SCANCODE_E] = KEY_E,
|
||||
[SDL_SCANCODE_F] = KEY_F,
|
||||
[SDL_SCANCODE_G] = KEY_G,
|
||||
[SDL_SCANCODE_H] = KEY_H,
|
||||
[SDL_SCANCODE_I] = KEY_I,
|
||||
[SDL_SCANCODE_J] = KEY_J,
|
||||
[SDL_SCANCODE_K] = KEY_K,
|
||||
[SDL_SCANCODE_L] = KEY_L,
|
||||
[SDL_SCANCODE_M] = KEY_M,
|
||||
[SDL_SCANCODE_N] = KEY_N,
|
||||
[SDL_SCANCODE_O] = KEY_O,
|
||||
[SDL_SCANCODE_P] = KEY_P,
|
||||
[SDL_SCANCODE_Q] = KEY_Q,
|
||||
[SDL_SCANCODE_R] = KEY_R,
|
||||
[SDL_SCANCODE_S] = KEY_S,
|
||||
[SDL_SCANCODE_T] = KEY_T,
|
||||
[SDL_SCANCODE_U] = KEY_U,
|
||||
[SDL_SCANCODE_V] = KEY_V,
|
||||
[SDL_SCANCODE_W] = KEY_W,
|
||||
[SDL_SCANCODE_X] = KEY_X,
|
||||
[SDL_SCANCODE_Y] = KEY_Y,
|
||||
[SDL_SCANCODE_Z] = KEY_Z,
|
||||
[SDL_SCANCODE_1] = KEY_1,
|
||||
[SDL_SCANCODE_2] = KEY_2,
|
||||
[SDL_SCANCODE_3] = KEY_3,
|
||||
[SDL_SCANCODE_4] = KEY_4,
|
||||
[SDL_SCANCODE_5] = KEY_5,
|
||||
[SDL_SCANCODE_6] = KEY_6,
|
||||
[SDL_SCANCODE_7] = KEY_7,
|
||||
[SDL_SCANCODE_8] = KEY_8,
|
||||
[SDL_SCANCODE_9] = KEY_9,
|
||||
[SDL_SCANCODE_0] = KEY_0,
|
||||
[SDL_SCANCODE_RETURN] = KEY_RETURN,
|
||||
[SDL_SCANCODE_ESCAPE] = KEY_ESCAPE,
|
||||
[SDL_SCANCODE_BACKSPACE] = KEY_BACKSPACE,
|
||||
[SDL_SCANCODE_TAB] = KEY_TAB,
|
||||
[SDL_SCANCODE_SPACE] = KEY_SPACE,
|
||||
// SDL_SCANCODE_MINUS
|
||||
// SDL_SCANCODE_EQUALS
|
||||
// SDL_SCANCODE_LEFTBRACKET
|
||||
// SDL_SCANCODE_RIGHTBRACKET
|
||||
// SDL_SCANCODE_BACKSLASH
|
||||
// SDL_SCANCODE_NONUSHASH
|
||||
// SDL_SCANCODE_SEMICOLON
|
||||
// SDL_SCANCODE_APOSTROPHE
|
||||
// SDL_SCANCODE_GRAVE
|
||||
// SDL_SCANCODE_COMMA
|
||||
// SDL_SCANCODE_PERIOD
|
||||
// SDL_SCANCODE_SLASH
|
||||
[SDL_SCANCODE_CAPSLOCK] = KEY_CAPSLOCK,
|
||||
[SDL_SCANCODE_F1] = KEY_F1,
|
||||
[SDL_SCANCODE_F2] = KEY_F2,
|
||||
[SDL_SCANCODE_F3] = KEY_F3,
|
||||
[SDL_SCANCODE_F4] = KEY_F4,
|
||||
[SDL_SCANCODE_F5] = KEY_F5,
|
||||
[SDL_SCANCODE_F6] = KEY_F6,
|
||||
[SDL_SCANCODE_F7] = KEY_F7,
|
||||
[SDL_SCANCODE_F8] = KEY_F8,
|
||||
[SDL_SCANCODE_F9] = KEY_F9,
|
||||
[SDL_SCANCODE_F10] = KEY_F10,
|
||||
[SDL_SCANCODE_F11] = KEY_F11,
|
||||
[SDL_SCANCODE_F12] = KEY_F12,
|
||||
[SDL_SCANCODE_PRINTSCREEN] = KEY_PRINTSCREEN,
|
||||
[SDL_SCANCODE_SCROLLLOCK] = KEY_SCROLLLOCK,
|
||||
[SDL_SCANCODE_PAUSE] = KEY_PAUSE,
|
||||
[SDL_SCANCODE_INSERT] = KEY_INSERT,
|
||||
[SDL_SCANCODE_HOME] = KEY_HOME,
|
||||
[SDL_SCANCODE_PAGEUP] = KEY_PAGEUP,
|
||||
[SDL_SCANCODE_DELETE] = KEY_DELETE,
|
||||
[SDL_SCANCODE_END] = KEY_END,
|
||||
[SDL_SCANCODE_PAGEDOWN] = KEY_PAGEDOWN,
|
||||
[SDL_SCANCODE_RIGHT] = KEY_RIGHT,
|
||||
[SDL_SCANCODE_LEFT] = KEY_LEFT,
|
||||
[SDL_SCANCODE_DOWN] = KEY_DOWN,
|
||||
[SDL_SCANCODE_UP] = KEY_UP,
|
||||
[SDL_SCANCODE_KP_DIVIDE] = KEY_PAD_DIVIDE,
|
||||
[SDL_SCANCODE_KP_MULTIPLY] = KEY_PAD_MULTIPLY,
|
||||
[SDL_SCANCODE_KP_MINUS] = KEY_PAD_MINUS,
|
||||
[SDL_SCANCODE_KP_PLUS] = KEY_PAD_PLUS,
|
||||
[SDL_SCANCODE_KP_ENTER] = KEY_RETURN,
|
||||
[SDL_SCANCODE_KP_1] = KEY_PAD_1,
|
||||
[SDL_SCANCODE_KP_2] = KEY_PAD_2,
|
||||
[SDL_SCANCODE_KP_3] = KEY_PAD_3,
|
||||
[SDL_SCANCODE_KP_4] = KEY_PAD_4,
|
||||
[SDL_SCANCODE_KP_5] = KEY_PAD_5,
|
||||
[SDL_SCANCODE_KP_6] = KEY_PAD_6,
|
||||
[SDL_SCANCODE_KP_7] = KEY_PAD_7,
|
||||
[SDL_SCANCODE_KP_8] = KEY_PAD_8,
|
||||
[SDL_SCANCODE_KP_9] = KEY_PAD_9,
|
||||
[SDL_SCANCODE_KP_0] = KEY_PAD_0,
|
||||
[SDL_SCANCODE_KP_PERIOD] = KEY_PAD_PERIOD,
|
||||
[SDL_SCANCODE_KP_EQUALS] = KEY_PAD_EQUALS,
|
||||
[SDL_SCANCODE_F13] = KEY_F13,
|
||||
[SDL_SCANCODE_F14] = KEY_F14,
|
||||
[SDL_SCANCODE_F15] = KEY_F15,
|
||||
[SDL_SCANCODE_F16] = KEY_F16,
|
||||
[SDL_SCANCODE_F17] = KEY_F17,
|
||||
[SDL_SCANCODE_F18] = KEY_F18,
|
||||
[SDL_SCANCODE_F19] = KEY_F19,
|
||||
[SDL_SCANCODE_F20] = KEY_F20,
|
||||
[SDL_SCANCODE_F21] = KEY_F21,
|
||||
[SDL_SCANCODE_F22] = KEY_F22,
|
||||
[SDL_SCANCODE_F23] = KEY_F23,
|
||||
[SDL_SCANCODE_F24] = KEY_F24,
|
||||
[SDL_SCANCODE_EXECUTE] = KEY_EXECUTE,
|
||||
[SDL_SCANCODE_HELP] = KEY_HELP,
|
||||
[SDL_SCANCODE_SELECT] = KEY_SELECT,
|
||||
[SDL_SCANCODE_CLEAR] = KEY_CLEAR,
|
||||
[SDL_SCANCODE_SEPARATOR] = KEY_SEPARATOR,
|
||||
[SDL_SCANCODE_LCTRL] = KEY_CTRL,
|
||||
[SDL_SCANCODE_LSHIFT] = KEY_SHIFT,
|
||||
[SDL_SCANCODE_LALT] = KEY_ALT,
|
||||
[SDL_SCANCODE_RCTRL] = KEY_CTRL,
|
||||
[SDL_SCANCODE_RSHIFT] = KEY_SHIFT,
|
||||
[SDL_SCANCODE_RALT] = KEY_ALT,
|
||||
};
|
||||
|
||||
void sdl_event_init(void) {
|
||||
if (custom_event_type == (uint32_t)-1)
|
||||
custom_event_type = SDL_RegisterEvents(1);
|
||||
}
|
||||
|
||||
static int mouse_to_rawkey(int button) {
|
||||
switch(button) {
|
||||
case SDL_BUTTON_LEFT:
|
||||
@@ -75,20 +211,16 @@ static int mouse_to_agsevent(int button) {
|
||||
}
|
||||
|
||||
EMSCRIPTEN_KEEPALIVE
|
||||
void send_agsevent(int type, int code) {
|
||||
void send_agsevent(enum agsevent_type type, int code) {
|
||||
if (!nact->ags.eventcb)
|
||||
return;
|
||||
agsevent_t agse;
|
||||
agse.type = type;
|
||||
agse.d1 = mousex;
|
||||
agse.d2 = mousey;
|
||||
agse.d3 = code;
|
||||
agsevent_t agse = {
|
||||
.type = type,
|
||||
.code = code,
|
||||
.mousex = mousex,
|
||||
.mousey = mousey
|
||||
};
|
||||
nact->ags.eventcb(&agse); // Async in emscripten
|
||||
|
||||
#ifdef __EMSCRIPTEN__
|
||||
// HACK: this ensures that callers of this function are instrumented.
|
||||
emscripten_sleep(0);
|
||||
#endif
|
||||
}
|
||||
|
||||
// Improves map navigation of Rance4 v2. See also the function comment of
|
||||
@@ -103,170 +235,195 @@ static void rance4v2_hack(void) {
|
||||
nact->wait_vsync = FALSE;
|
||||
}
|
||||
|
||||
void sdl_handle_event(SDL_Event *e) {
|
||||
if (sdl_custom_event_handler && sdl_custom_event_handler(e))
|
||||
return;
|
||||
|
||||
switch (e->type) {
|
||||
case SDL_QUIT:
|
||||
menu_quitmenu_open();
|
||||
break;
|
||||
|
||||
case SDL_WINDOWEVENT:
|
||||
switch (e->window.event) {
|
||||
case SDL_WINDOWEVENT_EXPOSED:
|
||||
sdl_dirty = TRUE;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
#ifdef _WIN32
|
||||
case SDL_SYSWMEVENT:
|
||||
win_menu_onsyswmevent(e->syswm.msg);
|
||||
break;
|
||||
#endif
|
||||
case SDL_APP_DIDENTERFOREGROUND:
|
||||
sdl_dirty = TRUE;
|
||||
break;
|
||||
case SDL_KEYDOWN:
|
||||
keyEventProsess(&e->key, TRUE);
|
||||
break;
|
||||
case SDL_KEYUP:
|
||||
keyEventProsess(&e->key, FALSE);
|
||||
switch (e->key.keysym.sym) {
|
||||
case SDLK_F1:
|
||||
msgskip_activate(!msgskip_isActivated());
|
||||
break;
|
||||
case SDLK_F4:
|
||||
sdl_setFullscreen(!sdl_fs_on);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case SDL_MOUSEMOTION:
|
||||
mousex = e->motion.x;
|
||||
mousey = e->motion.y;
|
||||
send_agsevent(AGSEVENT_MOUSE_MOTION, 0);
|
||||
break;
|
||||
|
||||
case SDL_MOUSEWHEEL:
|
||||
{
|
||||
int y = e->wheel.y * (e->wheel.direction == SDL_MOUSEWHEEL_FLIPPED ? -1 : 1);
|
||||
if (y > 0)
|
||||
mouse_wheel_up += y;
|
||||
else if (y < 0)
|
||||
mouse_wheel_down -= y;
|
||||
send_agsevent(AGSEVENT_MOUSE_WHEEL, y);
|
||||
break;
|
||||
}
|
||||
|
||||
case SDL_MOUSEBUTTONDOWN:
|
||||
mouseb |= (1 << e->button.button);
|
||||
RawKeyInfo[mouse_to_rawkey(e->button.button)] = TRUE;
|
||||
send_agsevent(AGSEVENT_BUTTON_PRESS, mouse_to_agsevent(e->button.button));
|
||||
break;
|
||||
|
||||
case SDL_MOUSEBUTTONUP:
|
||||
mouseb &= (0xffffffff ^ (1 << e->button.button));
|
||||
RawKeyInfo[mouse_to_rawkey(e->button.button)] = FALSE;
|
||||
send_agsevent(AGSEVENT_BUTTON_RELEASE, mouse_to_agsevent(e->button.button));
|
||||
if (e->button.button == 2) {
|
||||
menu_open();
|
||||
}
|
||||
break;
|
||||
|
||||
case SDL_FINGERDOWN:
|
||||
if (SDL_GetNumTouchFingers(e->tfinger.touchId) >= 2) {
|
||||
mouseb &= ~(1 << SDL_BUTTON_LEFT);
|
||||
mouseb |= 1 << SDL_BUTTON_RIGHT;
|
||||
RawKeyInfo[mouse_to_rawkey(SDL_BUTTON_LEFT)] = FALSE;
|
||||
RawKeyInfo[mouse_to_rawkey(SDL_BUTTON_RIGHT)] = TRUE;
|
||||
send_agsevent(AGSEVENT_BUTTON_PRESS, AGSEVENT_BUTTON_RIGHT);
|
||||
} else {
|
||||
// SDL_RendererEventWatch clamps touch locations outside of the
|
||||
// viewport to 0.0-1.0. Treat such events as right-clicks.
|
||||
int button;
|
||||
if (e->tfinger.x == 0.0f || e->tfinger.x == 1.0f || e->tfinger.y == 0.0f || e->tfinger.y == 1.0f) {
|
||||
button = SDL_BUTTON_RIGHT;
|
||||
} else {
|
||||
button = SDL_BUTTON_LEFT;
|
||||
mousex = e->tfinger.x * view_w;
|
||||
mousey = e->tfinger.y * view_h;
|
||||
send_agsevent(AGSEVENT_MOUSE_MOTION, 0);
|
||||
}
|
||||
mouseb |= 1 << button;
|
||||
RawKeyInfo[mouse_to_rawkey(button)] = TRUE;
|
||||
send_agsevent(AGSEVENT_BUTTON_PRESS, mouse_to_agsevent(button));
|
||||
}
|
||||
break;
|
||||
|
||||
case SDL_FINGERUP:
|
||||
if (SDL_GetNumTouchFingers(e->tfinger.touchId) == 0) {
|
||||
int ags_button = (mouseb & 1 << SDL_BUTTON_LEFT) ? AGSEVENT_BUTTON_LEFT : AGSEVENT_BUTTON_RIGHT;
|
||||
mouseb &= ~(1 << SDL_BUTTON_LEFT | 1 << SDL_BUTTON_RIGHT);
|
||||
RawKeyInfo[mouse_to_rawkey(SDL_BUTTON_LEFT)] = FALSE;
|
||||
RawKeyInfo[mouse_to_rawkey(SDL_BUTTON_RIGHT)] = FALSE;
|
||||
mousex = e->tfinger.x * view_w;
|
||||
mousey = e->tfinger.y * view_h;
|
||||
send_agsevent(AGSEVENT_BUTTON_RELEASE, ags_button);
|
||||
}
|
||||
break;
|
||||
|
||||
case SDL_FINGERMOTION:
|
||||
mousex = e->tfinger.x * view_w;
|
||||
mousey = e->tfinger.y * view_h;
|
||||
send_agsevent(AGSEVENT_MOUSE_MOTION, 0);
|
||||
break;
|
||||
|
||||
case SDL_JOYDEVICEADDED:
|
||||
sdl_joy_open(e->jdevice.which);
|
||||
break;
|
||||
|
||||
case SDL_JOYAXISMOTION:
|
||||
if (abs(e->jaxis.value) < 0x4000) {
|
||||
joyinfo &= e->jaxis.axis == 0 ? ~0xc : ~3;
|
||||
} else {
|
||||
int i = (e->jaxis.axis == 0 ? 2 : 0) +
|
||||
(e->jaxis.value > 0 ? 1 : 0);
|
||||
joyinfo |= 1 << i;
|
||||
}
|
||||
break;
|
||||
|
||||
case SDL_JOYBALLMOTION:
|
||||
break;
|
||||
|
||||
case SDL_JOYHATMOTION:
|
||||
joyinfo &= ~(SYS35KEY_UP | SYS35KEY_DOWN | SYS35KEY_LEFT | SYS35KEY_RIGHT);
|
||||
switch (e->jhat.value) {
|
||||
case SDL_HAT_UP: joyinfo |= SYS35KEY_UP; break;
|
||||
case SDL_HAT_DOWN: joyinfo |= SYS35KEY_DOWN; break;
|
||||
case SDL_HAT_LEFT: joyinfo |= SYS35KEY_LEFT; break;
|
||||
case SDL_HAT_RIGHT: joyinfo |= SYS35KEY_RIGHT; break;
|
||||
case SDL_HAT_LEFTUP: joyinfo |= SYS35KEY_LEFT | SYS35KEY_UP; break;
|
||||
case SDL_HAT_RIGHTUP: joyinfo |= SYS35KEY_RIGHT | SYS35KEY_UP; break;
|
||||
case SDL_HAT_LEFTDOWN: joyinfo |= SYS35KEY_LEFT | SYS35KEY_DOWN; break;
|
||||
case SDL_HAT_RIGHTDOWN: joyinfo |= SYS35KEY_RIGHT | SYS35KEY_DOWN; break;
|
||||
}
|
||||
break;
|
||||
|
||||
case SDL_JOYBUTTONDOWN:
|
||||
case SDL_JOYBUTTONUP:
|
||||
if (e->jbutton.button < 4) {
|
||||
int i = 1 << (e->jbutton.button+4);
|
||||
if (e->jbutton.state == SDL_PRESSED)
|
||||
joyinfo |= i;
|
||||
else
|
||||
joyinfo &= ~i;
|
||||
} else {
|
||||
if (e->jbutton.state == SDL_RELEASED) {
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
if (e->type == custom_event_type) {
|
||||
switch (e->user.code) {
|
||||
case SIMULATE_RIGHT_BUTTON:
|
||||
if ((intptr_t)e->user.data1) {
|
||||
mouseb |= 1 << SDL_BUTTON_RIGHT;
|
||||
RawKeyInfo[KEY_MOUSE_RIGHT] = TRUE;
|
||||
send_agsevent(AGSEVENT_BUTTON_PRESS, AGSEVENT_BUTTON_RIGHT);
|
||||
} else {
|
||||
mouseb &= ~(1 << SDL_BUTTON_RIGHT);
|
||||
RawKeyInfo[KEY_MOUSE_RIGHT] = FALSE;
|
||||
send_agsevent(AGSEVENT_BUTTON_RELEASE, AGSEVENT_BUTTON_RIGHT);
|
||||
}
|
||||
break;
|
||||
case DEBUGGER_COMMAND:
|
||||
dbg_post_command(e->user.data1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* Event処理 */
|
||||
static void sdl_getEvent(void) {
|
||||
static int cmd_count_of_prev_input = -1;
|
||||
SDL_Event e;
|
||||
boolean m2b = FALSE, msg_skip = FALSE;
|
||||
boolean had_input = false;
|
||||
|
||||
SDL_Event e;
|
||||
while (SDL_PollEvent(&e)) {
|
||||
had_input = true;
|
||||
|
||||
if (sdl_custom_event_handler && sdl_custom_event_handler(&e))
|
||||
continue;
|
||||
|
||||
switch (e.type) {
|
||||
case SDL_QUIT:
|
||||
menu_quitmenu_open();
|
||||
break;
|
||||
|
||||
case SDL_WINDOWEVENT:
|
||||
switch (e.window.event) {
|
||||
case SDL_WINDOWEVENT_EXPOSED:
|
||||
sdl_dirty = TRUE;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
#ifdef _WIN32
|
||||
case SDL_SYSWMEVENT:
|
||||
win_menu_onsyswmevent(e.syswm.msg);
|
||||
break;
|
||||
#endif
|
||||
case SDL_APP_DIDENTERFOREGROUND:
|
||||
sdl_dirty = TRUE;
|
||||
break;
|
||||
case SDL_KEYDOWN:
|
||||
keyEventProsess(&e.key, TRUE);
|
||||
break;
|
||||
case SDL_KEYUP:
|
||||
keyEventProsess(&e.key, FALSE);
|
||||
switch (e.key.keysym.sym) {
|
||||
case SDLK_F1:
|
||||
msg_skip = TRUE;
|
||||
break;
|
||||
case SDLK_F4:
|
||||
sdl_setFullscreen(!sdl_fs_on);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case SDL_MOUSEMOTION:
|
||||
mousex = e.motion.x;
|
||||
mousey = e.motion.y;
|
||||
send_agsevent(AGSEVENT_MOUSE_MOTION, 0);
|
||||
break;
|
||||
|
||||
case SDL_MOUSEWHEEL:
|
||||
{
|
||||
int y = e.wheel.y * (e.wheel.direction == SDL_MOUSEWHEEL_FLIPPED ? -1 : 1);
|
||||
if (y > 0)
|
||||
mouse_wheel_up += y;
|
||||
else if (y < 0)
|
||||
mouse_wheel_down -= y;
|
||||
send_agsevent(AGSEVENT_MOUSE_WHEEL, y);
|
||||
break;
|
||||
}
|
||||
|
||||
case SDL_MOUSEBUTTONDOWN:
|
||||
mouseb |= (1 << e.button.button);
|
||||
RawKeyInfo[mouse_to_rawkey(e.button.button)] = TRUE;
|
||||
send_agsevent(AGSEVENT_BUTTON_PRESS, mouse_to_agsevent(e.button.button));
|
||||
break;
|
||||
|
||||
case SDL_MOUSEBUTTONUP:
|
||||
mouseb &= (0xffffffff ^ (1 << e.button.button));
|
||||
RawKeyInfo[mouse_to_rawkey(e.button.button)] = FALSE;
|
||||
send_agsevent(AGSEVENT_BUTTON_RELEASE, mouse_to_agsevent(e.button.button));
|
||||
if (e.button.button == 2) {
|
||||
m2b = TRUE;
|
||||
}
|
||||
break;
|
||||
|
||||
case SDL_FINGERDOWN:
|
||||
if (SDL_GetNumTouchFingers(e.tfinger.touchId) >= 2) {
|
||||
mouseb &= ~(1 << SDL_BUTTON_LEFT);
|
||||
mouseb |= 1 << SDL_BUTTON_RIGHT;
|
||||
RawKeyInfo[mouse_to_rawkey(SDL_BUTTON_LEFT)] = FALSE;
|
||||
RawKeyInfo[mouse_to_rawkey(SDL_BUTTON_RIGHT)] = TRUE;
|
||||
} else {
|
||||
// SDL_RendererEventWatch clamps touch locations outside of the
|
||||
// viewport to 0.0-1.0. Treat such events as right-clicks.
|
||||
if (e.tfinger.x == 0.0f || e.tfinger.x == 1.0f || e.tfinger.y == 0.0f || e.tfinger.y == 1.0f) {
|
||||
mouseb |= 1 << SDL_BUTTON_RIGHT;
|
||||
RawKeyInfo[mouse_to_rawkey(SDL_BUTTON_RIGHT)] = TRUE;
|
||||
} else {
|
||||
mouseb |= 1 << SDL_BUTTON_LEFT;
|
||||
RawKeyInfo[mouse_to_rawkey(SDL_BUTTON_LEFT)] = TRUE;
|
||||
}
|
||||
mousex = e.tfinger.x * view_w;
|
||||
mousey = e.tfinger.y * view_h;
|
||||
}
|
||||
break;
|
||||
|
||||
case SDL_FINGERUP:
|
||||
if (SDL_GetNumTouchFingers(e.tfinger.touchId) == 0) {
|
||||
mouseb &= ~(1 << SDL_BUTTON_LEFT | 1 << SDL_BUTTON_RIGHT);
|
||||
RawKeyInfo[mouse_to_rawkey(SDL_BUTTON_LEFT)] = FALSE;
|
||||
RawKeyInfo[mouse_to_rawkey(SDL_BUTTON_RIGHT)] = FALSE;
|
||||
mousex = e.tfinger.x * view_w;
|
||||
mousey = e.tfinger.y * view_h;
|
||||
}
|
||||
break;
|
||||
|
||||
case SDL_FINGERMOTION:
|
||||
mousex = e.tfinger.x * view_w;
|
||||
mousey = e.tfinger.y * view_h;
|
||||
break;
|
||||
|
||||
case SDL_JOYDEVICEADDED:
|
||||
sdl_joy_open(e.jdevice.which);
|
||||
break;
|
||||
|
||||
case SDL_JOYAXISMOTION:
|
||||
if (abs(e.jaxis.value) < 0x4000) {
|
||||
joyinfo &= e.jaxis.axis == 0 ? ~0xc : ~3;
|
||||
} else {
|
||||
int i = (e.jaxis.axis == 0 ? 2 : 0) +
|
||||
(e.jaxis.value > 0 ? 1 : 0);
|
||||
joyinfo |= 1 << i;
|
||||
}
|
||||
break;
|
||||
|
||||
case SDL_JOYBALLMOTION:
|
||||
break;
|
||||
|
||||
case SDL_JOYHATMOTION:
|
||||
joyinfo &= ~(SYS35KEY_UP | SYS35KEY_DOWN | SYS35KEY_LEFT | SYS35KEY_RIGHT);
|
||||
switch (e.jhat.value) {
|
||||
case SDL_HAT_UP: joyinfo |= SYS35KEY_UP; break;
|
||||
case SDL_HAT_DOWN: joyinfo |= SYS35KEY_DOWN; break;
|
||||
case SDL_HAT_LEFT: joyinfo |= SYS35KEY_LEFT; break;
|
||||
case SDL_HAT_RIGHT: joyinfo |= SYS35KEY_RIGHT; break;
|
||||
case SDL_HAT_LEFTUP: joyinfo |= SYS35KEY_LEFT | SYS35KEY_UP; break;
|
||||
case SDL_HAT_RIGHTUP: joyinfo |= SYS35KEY_RIGHT | SYS35KEY_UP; break;
|
||||
case SDL_HAT_LEFTDOWN: joyinfo |= SYS35KEY_LEFT | SYS35KEY_DOWN; break;
|
||||
case SDL_HAT_RIGHTDOWN: joyinfo |= SYS35KEY_RIGHT | SYS35KEY_DOWN; break;
|
||||
}
|
||||
break;
|
||||
|
||||
case SDL_JOYBUTTONDOWN:
|
||||
case SDL_JOYBUTTONUP:
|
||||
if (e.jbutton.button < 4) {
|
||||
int i = 1 << (e.jbutton.button+4);
|
||||
if (e.jbutton.state == SDL_PRESSED)
|
||||
joyinfo |= i;
|
||||
else
|
||||
joyinfo &= ~i;
|
||||
} else {
|
||||
if (e.jbutton.state == SDL_RELEASED) {
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
NOTICE("ev %x", e.type);
|
||||
break;
|
||||
}
|
||||
sdl_handle_event(&e);
|
||||
}
|
||||
if (had_input) {
|
||||
cmd_count_of_prev_input = nact->cmd_count;
|
||||
@@ -275,12 +432,6 @@ static void sdl_getEvent(void) {
|
||||
if (nact->game == GAME_RANCE4_V2)
|
||||
rance4v2_hack();
|
||||
}
|
||||
|
||||
if (m2b) {
|
||||
menu_open();
|
||||
}
|
||||
|
||||
if (msg_skip) msgskip_activate(!msgskip_isActivated());
|
||||
}
|
||||
|
||||
/* キー情報の取得 */
|
||||
@@ -301,7 +452,7 @@ int sdl_getKeyInfo() {
|
||||
((RawKeyInfo[KEY_RIGHT] || RawKeyInfo[KEY_PAD_6]) << 3) |
|
||||
(RawKeyInfo[KEY_RETURN] << 4) |
|
||||
(RawKeyInfo[KEY_SPACE ] << 5) |
|
||||
(RawKeyInfo[KEY_ESC] << 6) |
|
||||
(RawKeyInfo[KEY_ESCAPE] << 6) |
|
||||
(RawKeyInfo[KEY_TAB] << 7));
|
||||
|
||||
return rt;
|
||||
@@ -337,3 +488,28 @@ int sdl_getJoyInfo(void) {
|
||||
sdl_getEvent();
|
||||
return joyinfo;
|
||||
}
|
||||
|
||||
void sdl_post_debugger_command(void *data) {
|
||||
SDL_Event event = {
|
||||
.user = {
|
||||
.type = custom_event_type,
|
||||
.code = DEBUGGER_COMMAND,
|
||||
.data1 = data
|
||||
}
|
||||
};
|
||||
SDL_PushEvent(&event);
|
||||
}
|
||||
|
||||
#ifdef __EMSCRIPTEN__
|
||||
EMSCRIPTEN_KEEPALIVE
|
||||
void simulate_right_button(int pressed) {
|
||||
SDL_Event event = {
|
||||
.user = {
|
||||
.type = custom_event_type,
|
||||
.code = SIMULATE_RIGHT_BUTTON,
|
||||
.data1 = (void*)pressed
|
||||
}
|
||||
};
|
||||
SDL_PushEvent(&event);
|
||||
}
|
||||
#endif
|
||||
|
||||
+44
-79
@@ -34,8 +34,6 @@
|
||||
#include "alpha_plane.h"
|
||||
#include "image.h"
|
||||
|
||||
static unsigned char shlv_tbl[256*256];
|
||||
|
||||
/*
|
||||
* dib内での拡大・縮小コピー
|
||||
*/
|
||||
@@ -47,7 +45,7 @@ void sdl_scaledCopyArea(int sx, int sy, int sw, int sh, int dx, int dy, int dw,
|
||||
SDL_Surface *src = sdl_dib;
|
||||
SDL_Surface *dst = sdl_dib;
|
||||
|
||||
ss = SDL_CreateRGBSurface(0, dw, dh, dst->format->BitsPerPixel, 0, 0, 0, 0);
|
||||
ss = SDL_CreateRGBSurfaceWithFormat(0, dw, dh, dst->format->BitsPerPixel, dst->format->format);
|
||||
|
||||
if (dst->format->BitsPerPixel == 8) {
|
||||
memcpy(ss->format->palette->colors, dst->format->palette->colors,
|
||||
@@ -142,40 +140,43 @@ void sdl_drawImage16_fromData(cgdata *cg, int dx, int dy, int brightness, bool a
|
||||
int w = cg->width;
|
||||
int h = cg->height;
|
||||
|
||||
SDL_Surface *s;
|
||||
if (cg->alpha && alpha_blend) {
|
||||
unsigned short *p_src = (uint16_t *)cg->pic;
|
||||
uint32_t *p_ds, *p_dst;
|
||||
if (cg->alpha) {
|
||||
uint8_t *a_src = cg->alpha;
|
||||
uint8_t *adata = GETOFFSET_ALPHA(sdl_dibinfo, dx, dy);
|
||||
int x, y, l;
|
||||
|
||||
s = SDL_CreateRGBSurfaceWithFormat(0, w, h, 32, SDL_PIXELFORMAT_ARGB8888);
|
||||
p_ds = s->pixels;
|
||||
l = s->pitch/4;
|
||||
for (y = 0; y < h; y++) {
|
||||
p_dst = p_ds;
|
||||
|
||||
for (int i = 0; i < h; i++) {
|
||||
memcpy(adata, a_src, w);
|
||||
for (x = 0; x < w; x++) {
|
||||
*p_dst++ = *a_src++ << 24 | PIX24(PIXR16(*p_src), PIXG16(*p_src), PIXB16(*p_src));
|
||||
p_src++;
|
||||
}
|
||||
p_ds += l;
|
||||
adata += sdl_dibinfo->width;
|
||||
a_src += cg->width;
|
||||
}
|
||||
}
|
||||
|
||||
SDL_Surface *s;
|
||||
if (cg->alpha && alpha_blend) {
|
||||
uint16_t *p_src = (uint16_t *)cg->pic;
|
||||
uint8_t *a_src = cg->alpha;
|
||||
s = SDL_CreateRGBSurfaceWithFormat(0, w, h, 32, SDL_PIXELFORMAT_ARGB8888);
|
||||
for (int y = 0; y < h; y++) {
|
||||
uint32_t *dst = (uint32_t *)(((uint8_t *)s->pixels) + y * s->pitch);
|
||||
for (int x = 0; x < w; x++) {
|
||||
*dst++ = rgb565_to_rgb888(*p_src++) | *a_src++ << 24;
|
||||
}
|
||||
}
|
||||
} else if (sdl_dibinfo->depth > 16) {
|
||||
// Convert to RGB888 by ourselves. SDL blit functions use a slightly
|
||||
// different mapping, so the color expanded by SDL may not match the
|
||||
// color key specified in the CX command.
|
||||
uint16_t *src = (uint16_t *)cg->pic;
|
||||
s = SDL_CreateRGBSurfaceWithFormat(0, w, h, 32, SDL_PIXELFORMAT_RGB888);
|
||||
for (int y = 0; y < h; y++) {
|
||||
uint32_t *dst = (uint32_t *)(((uint8_t *)s->pixels) + y * s->pitch);
|
||||
for (int x = 0; x < w; x++) {
|
||||
*dst++ = rgb565_to_rgb888(*src++);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
s = SDL_CreateRGBSurfaceWithFormatFrom(
|
||||
cg->pic, cg->width, cg->height, 16, cg->width * 2, SDL_PIXELFORMAT_RGB565);
|
||||
if (cg->alpha) {
|
||||
uint8_t *a_src = cg->alpha;
|
||||
uint8_t *adata = GETOFFSET_ALPHA(sdl_dibinfo, dx, dy);
|
||||
|
||||
for (int i = 0; i < h; i++) {
|
||||
memcpy(adata, a_src, w);
|
||||
adata += sdl_dibinfo->width;
|
||||
a_src += cg->width;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (brightness != 255)
|
||||
@@ -203,65 +204,31 @@ void sdl_drawImage24_fromData(cgdata *cg, int x, int y, int brightness) {
|
||||
SDL_FreeSurface(s);
|
||||
}
|
||||
|
||||
/*
|
||||
* 16bit専用の dib の指定領域コピー alphaつき
|
||||
*/
|
||||
void sdl_shadow_init(void) {
|
||||
int i, j;
|
||||
unsigned char *c = shlv_tbl;
|
||||
|
||||
for (i = 0; i < 255; i++) {
|
||||
for (j = 0; j < 256; j++) {
|
||||
*(c++) = (unsigned char)(i * j / 255);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void sdl_copyAreaSP16_shadow(int sx, int sy, int w, int h, int dx, int dy, int lv) {
|
||||
uint8_t *adata = GETOFFSET_ALPHA(sdl_dibinfo, sx, sy);
|
||||
uint8_t *p_src, *p_dst, *p_ds;
|
||||
|
||||
SDL_Surface *s = SDL_CreateRGBSurfaceWithFormat(0, w, h, 32, SDL_PIXELFORMAT_ARGB8888);
|
||||
int x, y;
|
||||
|
||||
SDL_Rect r_src = {sx, sy, w, h};
|
||||
SDL_Rect r_tmp = { 0, 0, w, h};
|
||||
SDL_BlitSurface(sdl_dib, &r_src, s, &r_tmp);
|
||||
|
||||
#if SDL_BYTEORDER == SDL_LIL_ENDIAN
|
||||
p_ds = s->pixels + 3;
|
||||
uint8_t *p_ds = s->pixels + 3;
|
||||
#else
|
||||
p_ds = s->pixels;
|
||||
uint8_t *p_ds = s->pixels;
|
||||
#endif
|
||||
switch(lv) {
|
||||
case 255:
|
||||
for (y = 0; y < h; y++) {
|
||||
p_src = adata;
|
||||
p_dst = p_ds;
|
||||
for (x = 0; x < w; x++) {
|
||||
*p_dst = *(p_src++);
|
||||
p_dst += 4;
|
||||
}
|
||||
adata += sdl_dibinfo->width;
|
||||
p_ds += s->pitch;
|
||||
uint8_t *adata = GETOFFSET_ALPHA(sdl_dibinfo, sx, sy);
|
||||
for (int y = 0; y < h; y++) {
|
||||
uint8_t *p_src = adata;
|
||||
uint8_t *p_dst = p_ds;
|
||||
for (int x = 0; x < w; x++) {
|
||||
*p_dst = *(p_src++);
|
||||
p_dst += 4;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
{
|
||||
unsigned char *lvtbl = shlv_tbl + lv * 256;
|
||||
for (y = 0; y < h; y++) {
|
||||
p_src = adata;
|
||||
p_dst = p_ds;
|
||||
for (x = 0; x < w; x++) {
|
||||
*p_dst = lvtbl[(int)(*(p_src++))];
|
||||
p_dst += 4;
|
||||
}
|
||||
adata += sdl_dibinfo->width;
|
||||
p_ds += s->pitch;
|
||||
}
|
||||
}
|
||||
break;
|
||||
adata += sdl_dibinfo->width;
|
||||
p_ds += s->pitch;
|
||||
}
|
||||
if (lv < 255)
|
||||
SDL_SetSurfaceAlphaMod(s, lv);
|
||||
|
||||
SDL_Rect r_dst = {dx, dy, w, h};
|
||||
SDL_BlitSurface(s, &r_tmp, sdl_dib, &r_dst);
|
||||
@@ -334,9 +301,7 @@ void sdl_getPixel(int x, int y, Palette *cell) {
|
||||
* dib から領域の切り出し
|
||||
*/
|
||||
void* sdl_saveRegion(int x, int y, int w, int h) {
|
||||
SDL_Surface *s = SDL_CreateRGBSurface(0, w, h, sdl_dib->format->BitsPerPixel,
|
||||
sdl_dib->format->Rmask, sdl_dib->format->Gmask,
|
||||
sdl_dib->format->Bmask, sdl_dib->format->Amask);
|
||||
SDL_Surface *s = SDL_CreateRGBSurfaceWithFormat(0, w, h, sdl_dib->format->BitsPerPixel, sdl_dib->format->format);
|
||||
if (sdl_dib->format->BitsPerPixel == 8)
|
||||
memcpy(s->format->palette->colors, sdl_dib->format->palette->colors,
|
||||
sizeof(SDL_Color) * sdl_dib->format->palette->ncolors);
|
||||
|
||||
@@ -1,73 +0,0 @@
|
||||
static int sdl_keytable[SDL_NUM_SCANCODES] = {
|
||||
0, KEY_UNDEFINED, KEY_UNDEFINED, KEY_UNDEFINED,
|
||||
KEY_A, KEY_B, KEY_C, KEY_D,
|
||||
KEY_E, KEY_F, KEY_G, KEY_H,
|
||||
KEY_I, KEY_J, KEY_K, KEY_L,
|
||||
KEY_M, KEY_N, KEY_O, KEY_P,
|
||||
KEY_Q, KEY_R, KEY_S, KEY_T,
|
||||
KEY_U, KEY_V, KEY_W, KEY_X,
|
||||
KEY_Y, KEY_Z, KEY_1, KEY_2,
|
||||
KEY_3, KEY_4, KEY_5, KEY_6,
|
||||
KEY_7, KEY_8, KEY_9, KEY_0,
|
||||
KEY_RETURN, KEY_ESCAPE, KEY_BACKSPACE, KEY_TAB,
|
||||
KEY_SPACE, 45, 46, 47,
|
||||
48, 49, 50, 51,
|
||||
52, 53, 54, 55,
|
||||
56, KEY_CAPSLOCK, KEY_F1, KEY_F2,
|
||||
KEY_F3, KEY_F4, KEY_F5, KEY_F6,
|
||||
KEY_F7, KEY_F8, KEY_F9, KEY_F10,
|
||||
KEY_F11, KEY_F12, KEY_PRINTSCREEN, 71,
|
||||
KEY_PAUSE, KEY_INSERT, KEY_HOME, KEY_PAGEUP,
|
||||
KEY_DELETE, KEY_END, KEY_PAGEDOWN, KEY_RIGHT,
|
||||
KEY_LEFT, KEY_DOWN, KEY_UP, 83,
|
||||
KEY_PAD_DIVIDE, KEY_PAD_MULTIPLY, KEY_PAD_MINUS, KEY_PAD_PLUS,
|
||||
KEY_PAD_ENTER, KEY_PAD_1, KEY_PAD_2, KEY_PAD_3,
|
||||
KEY_PAD_4, KEY_PAD_5, KEY_PAD_6, KEY_PAD_7,
|
||||
KEY_PAD_8, KEY_PAD_9, KEY_PAD_0, KEY_PAD_PERIOD,
|
||||
0 /* SDL_NONUSBACKSLASH */, 0 /* SDL_APPLICATION */, 0 /* SDL_POWER */, KEY_PAD_EQUALS,
|
||||
KEY_F13, KEY_F14, KEY_F15, KEY_F16,
|
||||
KEY_F17, KEY_F18, KEY_F19, KEY_F20,
|
||||
KEY_F21, KEY_F22, KEY_F23, KEY_F24,
|
||||
KEY_EXECUTE, KEY_HELP, 0 /* SDL_MENU */, KEY_SELECT,
|
||||
0 /* SDL_STOP */, 0 /* SDL_AGAIN */, 0 /* SDL_UNDO */, 0 /* SDL_CUT */,
|
||||
0 /* SDL_COPY */, 0 /* SDL_PASTE */, 0 /* SDL_FIND */, 0 /* SDL_MUTE */,
|
||||
0 /* SDL_VOLUMEUP */, 0 /* SDL_VOLUMEDOWN */, 0 /* SDL_LOCKINGCAPSLOCK */, 0 /* SDL_LOCKINGNUMLOCK */,
|
||||
0 /* SDL_LOCKINGSCROLLLOCK */, 0 /* SDL_PAD_COMMA */, 0 /* SDL_PAD_EQUALSAS400 */, 0 /* SDL_INTERNATIONAL1 */,
|
||||
0 /* SDL_INTERNATIONAL2 */, 0 /* SDL_INTERNATIONAL3 */, 0 /* SDL_INTERNATIONAL4 */, 0 /* SDL_INTERNATIONAL5 */,
|
||||
0 /* SDL_INTERNATIONAL6 */, 0 /* SDL_INTERNATIONAL7 */, 0 /* SDL_INTERNATIONAL8 */, 0 /* SDL_INTERNATIONAL9 */,
|
||||
0 /* SDL_LANG1 */, 0 /* SDL_LANG2 */, 0 /* SDL_LANG3 */, 0 /* SDL_LANG4 */,
|
||||
0 /* SDL_LANG5 */, 0 /* SDL_LANG6 */, 0 /* SDL_LANG7 */, 0 /* SDL_LANG8 */,
|
||||
0 /* SDL_LANG9 */, 0 /* SDL_ALTERASE */, 0 /* SDL_SYSREQ */, 0 /* SDL_CANCEL */,
|
||||
KEY_CLEAR, 0 /* SDL_PRIOR */, 0 /* SDL_RETURN2 */, 0 /* SDL_SEPARATOR */,
|
||||
0 /* SDL_OUT */, 0 /* SDL_OPER */, 0 /* SDL_CLEARAGAIN */, 0 /* SDL_CRSEL */,
|
||||
0 /* SDL_EXSEL */, KEY_UNDEFINED, KEY_UNDEFINED, KEY_UNDEFINED,
|
||||
KEY_UNDEFINED, KEY_UNDEFINED, KEY_UNDEFINED, KEY_UNDEFINED,
|
||||
KEY_UNDEFINED, KEY_UNDEFINED, KEY_UNDEFINED, KEY_UNDEFINED,
|
||||
0 /* SDL_PAD_00 */, 0 /* SDL_PAD_000 */, 0 /* SDL_THOUSANDSSEPARATOR */, 0 /* SDL_DECIMALSEPARATOR */,
|
||||
0 /* SDL_CURRENCYUNIT */, 0 /* SDL_CURRENCYSUBUNIT */, 0 /* SDL_PAD_LEFTPAREN */, 0 /* SDL_PAD_RIGHTPAREN */,
|
||||
0 /* SDL_PAD_LEFTBRACE */, 0 /* SDL_PAD_RIGHTBRACE */, 0 /* SDL_PAD_TAB */, 0 /* SDL_PAD_BACKSPACE */,
|
||||
0 /* SDL_PAD_A */, 0 /* SDL_PAD_B */, 0 /* SDL_PAD_C */, 0 /* SDL_PAD_D */,
|
||||
0 /* SDL_PAD_E */, 0 /* SDL_PAD_F */, 0 /* SDL_PAD_XOR */, 0 /* SDL_PAD_POWER */,
|
||||
0 /* SDL_PAD_PERCENT */, 0 /* SDL_PAD_LESS */, 0 /* SDL_PAD_GREATER */, 0 /* SDL_PAD_AMPERSAND */,
|
||||
0 /* SDL_PAD_DBLAMPERSAND */, 0 /* SDL_PAD_VERTICALBAR */, 0 /* SDL_PAD_DBLVERTICALBAR */, 0 /* SDL_PAD_COLON */,
|
||||
0 /* SDL_PAD_HASH */, 0 /* SDL_PAD_SPACE */, 0 /* SDL_PAD_AT */, 0 /* SDL_PAD_EXCLAM */,
|
||||
0 /* SDL_PAD_MEMSTORE */, 0 /* SDL_PAD_MEMRECALL */, 0 /* SDL_PAD_MEMCLEAR */, 0 /* SDL_PAD_MEMADD */,
|
||||
0 /* SDL_PAD_MEMSUBTRACT */, 0 /* SDL_PAD_MEMMULTIPLY */, 0 /* SDL_PAD_MEMDIVIDE */, 0 /* SDL_PAD_PLUSMINUS */,
|
||||
0 /* SDL_PAD_CLEAR */, 0 /* SDL_PAD_CLEARENTRY */, 0 /* SDL_PAD_BINARY */, 0 /* SDL_PAD_OCTAL */,
|
||||
0 /* SDL_PAD_DECIMAL */, 0 /* SDL_PAD_HEXADECIMAL */, KEY_UNDEFINED, KEY_UNDEFINED,
|
||||
KEY_RCTRL, KEY_RSHIFT, KEY_RALT, 0 /* SDL_LGUI */,
|
||||
KEY_RCTRL, KEY_RSHIFT, KEY_RALT, 0 /* SDL_RGUI */,
|
||||
KEY_UNDEFINED, KEY_UNDEFINED, KEY_UNDEFINED, KEY_UNDEFINED,
|
||||
KEY_UNDEFINED, KEY_UNDEFINED, KEY_UNDEFINED, KEY_UNDEFINED,
|
||||
KEY_UNDEFINED, KEY_UNDEFINED, KEY_UNDEFINED, KEY_UNDEFINED,
|
||||
KEY_UNDEFINED, KEY_UNDEFINED, KEY_UNDEFINED, KEY_UNDEFINED,
|
||||
KEY_UNDEFINED, KEY_UNDEFINED, KEY_UNDEFINED, KEY_UNDEFINED,
|
||||
KEY_UNDEFINED, KEY_UNDEFINED, KEY_UNDEFINED, KEY_UNDEFINED,
|
||||
KEY_UNDEFINED, 0 /* SDL_MODE */, 0 /* SDL_AUDIONEXT */, 0 /* SDL_AUDIOPREV */,
|
||||
0 /* SDL_AUDIOSTOP */, 0 /* SDL_AUDIOPLAY */, 0 /* SDL_AUDIOMUTE */, 0 /* SDL_MEDIASELECT */,
|
||||
0 /* SDL_WWW */, 0 /* SDL_MAIL */, 0 /* SDL_CALCULATOR */, 0 /* SDL_COMPUTER */,
|
||||
0 /* SDL_AC_SEARCH */, 0 /* SDL_AC_HOME */, 0 /* SDL_AC_BACK */, 0 /* SDL_AC_FORWARD */,
|
||||
0 /* SDL_AC_STOP */, 0 /* SDL_AC_REFRESH */, 0 /* SDL_AC_BOOKMARKS */, 0 /* SDL_BRIGHTNESSDOWN */,
|
||||
0 /* SDL_BRIGHTNESSUP */, 0 /* SDL_DISPLAYSWITCH */, 0 /* SDL_KBDILLUMTOGGLE */, 0 /* SDL_KBDILLUMDOWN */,
|
||||
0 /* SDL_KBDILLUMUP */, 0 /* SDL_EJECT */, 0 /* SDL_SLEEP */, 0 /* SDL_APP1 */,
|
||||
0 /* SDL_APP2 */, };
|
||||
+1
-1
@@ -52,8 +52,8 @@ struct sdl_private_data {
|
||||
boolean (*custom_event_handler)(const SDL_Event *);
|
||||
};
|
||||
|
||||
void sdl_event_init(void);
|
||||
void sdl_cursor_init(void);
|
||||
void sdl_shadow_init(void);
|
||||
int sdl_nearest_color(int r, int g, int b);
|
||||
boolean sdl_joy_open(int index);
|
||||
|
||||
|
||||
+19
-8
@@ -81,13 +81,11 @@ int sdl_Initialize(const char *render_driver) {
|
||||
/* offscreen Pixmap */
|
||||
makeDIB(SYS35_DEFAULT_WIDTH, SYS35_DEFAULT_HEIGHT, SYS35_DEFAULT_DEPTH);
|
||||
|
||||
/* init cursor */
|
||||
sdl_event_init();
|
||||
sdl_cursor_init();
|
||||
|
||||
sdl_setWindowSize(SYS35_DEFAULT_WIDTH, SYS35_DEFAULT_HEIGHT);
|
||||
|
||||
sdl_shadow_init();
|
||||
|
||||
#ifdef __EMSCRIPTEN__
|
||||
// Prevent SDL from calling emscripten_exit_fullscreen on visibilitychange
|
||||
emscripten_set_visibilitychange_callback(NULL, 0, NULL);
|
||||
@@ -162,12 +160,25 @@ static void makeDIB(int width, int height, int depth) {
|
||||
if (sdl_dib) {
|
||||
SDL_FreeSurface(sdl_dib);
|
||||
}
|
||||
|
||||
// Graphic routines in modules/ assume 4 bytes/pixel mode for 24-bit surfaces.
|
||||
if (depth == 24)
|
||||
depth = 32;
|
||||
|
||||
sdl_dib = SDL_CreateRGBSurface(0, width, height, depth, 0, 0, 0, 0);
|
||||
uint32_t format;
|
||||
switch (depth) {
|
||||
case 8:
|
||||
format = SDL_PIXELFORMAT_INDEX8;
|
||||
break;
|
||||
case 16:
|
||||
format = SDL_PIXELFORMAT_RGB565;
|
||||
break;
|
||||
case 24:
|
||||
format = SDL_PIXELFORMAT_RGB888;
|
||||
// Graphic routines in modules/ assume 4 bytes/pixel mode for 24-bit surfaces.
|
||||
depth = 32;
|
||||
break;
|
||||
default:
|
||||
SYSERROR("invalid pixel depth %d", depth);
|
||||
}
|
||||
|
||||
sdl_dib = SDL_CreateRGBSurfaceWithFormat(0, width, height, depth, format);
|
||||
|
||||
if (sdl_dib->format->BitsPerPixel == 8) {
|
||||
memset(sdl_dib->format->palette->colors, 0, sizeof(SDL_Color)*256);
|
||||
|
||||
+8
-6
@@ -116,13 +116,15 @@ void sel_init() {
|
||||
}
|
||||
memset(sel.wininfo, 0, sizeof(sel.wininfo));
|
||||
|
||||
for (int i = 0; i < SELWINMAX; i++) {
|
||||
sel.wininfo[i].x = 450;
|
||||
sel.wininfo[i].y = 100;
|
||||
sel.wininfo[i].width = 150;
|
||||
sel.wininfo[i].height = 100;
|
||||
}
|
||||
sel.winno = 1;
|
||||
sel.win = &sel.wininfo[0];
|
||||
sel.wininfo[0].x = 464;
|
||||
sel.wininfo[0].y = 80;
|
||||
sel.wininfo[0].width = 160;
|
||||
sel.wininfo[0].height = 160;
|
||||
sel.wininfo[0].save = TRUE;
|
||||
sel.win = &sel.wininfo[1];
|
||||
sel.wininfo[1].save = TRUE;
|
||||
|
||||
/* 選択肢を登録中 */
|
||||
sel.in_setting = FALSE;
|
||||
|
||||
+19
-16
@@ -29,6 +29,10 @@
|
||||
#include "variable.h"
|
||||
#include "xsystem35.h"
|
||||
|
||||
// For some reasons, System3.9's initial system page size is 65537.
|
||||
#define SYSVAR_MAX 65537
|
||||
#define STRVAR_MAX 5000
|
||||
|
||||
#define SYSVARLONG_MAX 128
|
||||
#define PAGE_MAX 256
|
||||
|
||||
@@ -48,9 +52,7 @@ struct VarPage varPage[PAGE_MAX];
|
||||
double longVar[SYSVARLONG_MAX];
|
||||
/* 文字列変数 */
|
||||
static char **strVar;
|
||||
/* 文字列変数の属性(最大,1つあたりの大きさ) */
|
||||
int strvar_cnt;
|
||||
int strvar_len;
|
||||
static int strvar_cnt;
|
||||
|
||||
const char *v_name(int var) {
|
||||
if (var < nact->ain.varnum)
|
||||
@@ -103,18 +105,20 @@ int *v_ref_indexed(int var, int index, struct VarRef *ref) {
|
||||
|
||||
// DC command
|
||||
bool v_allocatePage(int page, int size, bool saveflag) {
|
||||
if (page <= 0 || page >= PAGE_MAX) { return false; }
|
||||
if (page < 0 || page >= PAGE_MAX) { return false; }
|
||||
if (size <= 0 || size > 65536) { return false; }
|
||||
|
||||
void *buf = varPage[page].value;
|
||||
if (buf != NULL)
|
||||
buf = realloc(buf, size * sizeof(int));
|
||||
else
|
||||
buf = calloc(size, sizeof(int));
|
||||
if (!buf)
|
||||
NOMEMERR();
|
||||
|
||||
varPage[page].value = buf;
|
||||
if (page != 0) {
|
||||
void *buf = varPage[page].value;
|
||||
if (buf != NULL)
|
||||
buf = realloc(buf, size * sizeof(int));
|
||||
else
|
||||
buf = calloc(size, sizeof(int));
|
||||
if (!buf)
|
||||
NOMEMERR();
|
||||
varPage[page].value = buf;
|
||||
}
|
||||
|
||||
varPage[page].size = size;
|
||||
varPage[page].saveflag = saveflag;
|
||||
|
||||
@@ -154,7 +158,7 @@ void v_getPageStatus(int page, int *in_use, int *size) {
|
||||
}
|
||||
|
||||
/* 文字列変数の再初期化 */
|
||||
void svar_init(int max_index, int len) {
|
||||
void svar_init(int max_index) {
|
||||
for (int i = max_index + 1; i < strvar_cnt; i++) {
|
||||
if (strVar[i])
|
||||
free(strVar[i]);
|
||||
@@ -166,7 +170,6 @@ void svar_init(int max_index, int len) {
|
||||
for (int i = strvar_cnt; i <= max_index; i++)
|
||||
strVar[i] = NULL;
|
||||
strvar_cnt = max_index + 1;
|
||||
strvar_len = len;
|
||||
}
|
||||
|
||||
int svar_maxindex(void) {
|
||||
@@ -178,7 +181,7 @@ void v_init(void) {
|
||||
varPage[0].value = sysVar;
|
||||
varPage[0].size = SYSVAR_MAX;
|
||||
varPage[0].saveflag = true;
|
||||
svar_init(STRVAR_MAX - 1, STRVAR_LEN);
|
||||
svar_init(STRVAR_MAX - 1);
|
||||
}
|
||||
|
||||
void v_reset(void) {
|
||||
|
||||
+1
-5
@@ -27,10 +27,6 @@
|
||||
#include <sys/types.h>
|
||||
#include "portab.h"
|
||||
|
||||
#define SYSVAR_MAX 65536
|
||||
#define STRVAR_MAX 5000
|
||||
#define STRVAR_LEN 101
|
||||
|
||||
struct VarPage {
|
||||
int size;
|
||||
boolean saveflag;
|
||||
@@ -67,7 +63,7 @@ static inline int *v_ref(int var, struct VarRef *ref) {
|
||||
return v_ref_indexed(var, -1, ref);
|
||||
}
|
||||
|
||||
void svar_init(int max_index, int len);
|
||||
void svar_init(int max_index);
|
||||
int svar_maxindex(void);
|
||||
const char *svar_get(int no);
|
||||
void svar_set(int no, const char *str);
|
||||
|
||||
+36
-26
@@ -109,46 +109,47 @@ static void sys35_usage(boolean verbose) {
|
||||
}
|
||||
puts("Usage: xsystem35 [OPTIONS]\n");
|
||||
puts("OPTIONS");
|
||||
puts(" -gamefile file : set game resource file to 'file'");
|
||||
puts(" -game game : enable game-specific hacks");
|
||||
puts(" -renderer name : set rendering driver name to 'name'");
|
||||
puts(" -devcd device : set cdrom device name to 'device'");
|
||||
puts(" -devmidi device: set midi device name to 'device'");
|
||||
puts(" -gamefile file : set game resource file to 'file'");
|
||||
puts(" -game game : enable game-specific hacks");
|
||||
puts(" -saveformat fmt : save file format. 'xsystem35', 'system36' or 'system39' (default)");
|
||||
puts(" -renderer name : set rendering driver name to 'name'");
|
||||
puts(" -devcd device : set cdrom device name to 'device'");
|
||||
puts(" -devmidi device : set midi device name to 'device'");
|
||||
|
||||
puts(" -M? : select output midi methos");
|
||||
puts(" -M? : select output midi methos");
|
||||
#ifdef ENABLE_MIDI_SDLMIXER
|
||||
puts(" -Me : SDL_mixer midi player");
|
||||
puts(" -Me : SDL_mixer midi player");
|
||||
#endif
|
||||
#ifdef ENABLE_MIDI_RAWMIDI
|
||||
puts(" -Mr : Raw Midi device");
|
||||
puts(" -Mr : Raw Midi device");
|
||||
#endif
|
||||
#ifdef ENABLE_MIDI_SEQMIDI
|
||||
puts(" -Ms? : Sequenceer device (?:devicenumber)");
|
||||
puts(" -Ms? : Sequenceer device (?:devicenumber)");
|
||||
#endif
|
||||
#ifdef ENABLE_MIDI_PORTMIDI
|
||||
puts(" -Mp? : ALSA (via PortMidi) (?:devicenumber)");
|
||||
puts(" -Mp? : ALSA (via PortMidi) (?:devicenumber)");
|
||||
#endif
|
||||
puts(" -M0 : Disable MIDI output");
|
||||
puts(" -M0 : Disable MIDI output");
|
||||
|
||||
puts(" -devjoy device : joystick device index (0-)");
|
||||
puts(" -devjoy device : joystick device index (0-)");
|
||||
|
||||
puts(" -ttfont_mincho: set TrueType font for mincho");
|
||||
puts(" -ttfont_gothic: set TrueType font for mincho");
|
||||
puts(" -ttfont_mincho : set TrueType font for mincho");
|
||||
puts(" -ttfont_gothic : set TrueType font for mincho");
|
||||
|
||||
#ifdef DEBUG
|
||||
puts(" -debuglv # : debug level");
|
||||
puts(" : 1: warings");
|
||||
puts(" : 2: unimplemented commands");
|
||||
puts(" : 5: command trace");
|
||||
puts(" : 6: message trace");
|
||||
puts(" -debuglv # : debug level");
|
||||
puts(" : 1: warings");
|
||||
puts(" : 2: unimplemented commands");
|
||||
puts(" : 5: command trace");
|
||||
puts(" : 6: message trace");
|
||||
#endif
|
||||
puts(" -noantialias : never use antialiased string");
|
||||
puts(" -fullscreen : start with fullscreen");
|
||||
puts(" -integerscale : use integer scaling when resizing");
|
||||
puts(" -noimagecursor : disable image cursor");
|
||||
puts(" -version : show version");
|
||||
puts(" -h : show this message");
|
||||
puts(" --help : show this message");
|
||||
puts(" -noantialias : never use antialiased string");
|
||||
puts(" -fullscreen : start with fullscreen");
|
||||
puts(" -integerscale : use integer scaling when resizing");
|
||||
puts(" -noimagecursor : disable image cursor");
|
||||
puts(" -version : show version");
|
||||
puts(" -h : show this message");
|
||||
puts(" --help : show this message");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
@@ -315,6 +316,10 @@ static void sys35_ParseOption(int *argc, char **argv) {
|
||||
if (argv[i + 1] != NULL) {
|
||||
enable_hack_by_gameid(argv[i + 1]);
|
||||
}
|
||||
} else if (0 == strcmp(argv[i], "-saveformat")) {
|
||||
if (argv[i + 1] != NULL) {
|
||||
save_setFormat(argv[i + 1]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -404,6 +409,11 @@ static void check_profile() {
|
||||
if (param) {
|
||||
enable_hack_by_gameid(param);
|
||||
}
|
||||
/* Save file format */
|
||||
param = get_profile("saveformat");
|
||||
if (param) {
|
||||
save_setFormat(param);
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef HAVE_SIGACTION
|
||||
|
||||
Binary file not shown.
@@ -7,6 +7,15 @@ const word NUM_VAR_PUSHES = 3:
|
||||
const word NUM_LABEL_CALLS_AFTER_PAGE_CALL = 4:
|
||||
const word NUM_VAR_PUSHES_AFTER_CALL = 5:
|
||||
|
||||
!D01 : 1!
|
||||
!D02 : 2!
|
||||
!D03 : 3!
|
||||
US D01, 3:
|
||||
UG D02, 3:
|
||||
~AssertEquals D02, 1, __LINE__:
|
||||
~AssertEquals D03, 2, __LINE__:
|
||||
~AssertEquals D04, 3, __LINE__:
|
||||
|
||||
UR D01:
|
||||
~AssertEquals D01[STACK_TOP_ATTR], 0, __LINE__:
|
||||
~AssertEquals D01[NUM_PAGE_CALLS], 1, __LINE__:
|
||||
|
||||
Binary file not shown.
@@ -1,50 +0,0 @@
|
||||
#! /usr/bin/perl
|
||||
|
||||
@key_list=();
|
||||
%keyh_list=();
|
||||
open(FX,"<key.h") || exit;
|
||||
while(<FX>) {
|
||||
if( /^#define KEY_([^\s]*)\s+[(]([^)]*)[)]/ ) {
|
||||
$key_list[eval($2)]="$1";
|
||||
$keyh_list{$1}=eval($2);
|
||||
}
|
||||
}
|
||||
close(fp);
|
||||
|
||||
@sdlk_list=();
|
||||
open(FS,"<$ARGV[0]/SDL_scancode.h") || exit;
|
||||
while(<FS>) {
|
||||
if( /SDL_SCANCODE_([^\s]+)\s+=\s*([^,]*),/ ) {
|
||||
$sdlk_list[eval($2)]="$1";
|
||||
}
|
||||
}
|
||||
close(FS);
|
||||
|
||||
|
||||
print "static int sdl_keytable[SDL_NUM_SCANCODES] = {\n\t";
|
||||
for( $i = 0 ; $i < scalar(@sdlk_list) ; $i ++ ) {
|
||||
#print "$i @sdlk_list[$i] $keyh_list{@sdlk_list[$i]}\n";
|
||||
$x = @sdlk_list[$i];
|
||||
if( length($x) == 0 ) {
|
||||
print "KEY_UNDEFINED, ";
|
||||
} elsif ( $keyh_list{$x} ) {
|
||||
print "KEY_@key_list[$keyh_list{$x}], ";
|
||||
} elsif ( $x =~ /[a-z]/ ) {
|
||||
print "KEY_".uc($x).", ";
|
||||
} elsif ( $x =~ /KP_/ ) {
|
||||
$x =~ s/^KP_/PAD_/;
|
||||
if ( $keyh_list{$x} ) {
|
||||
print "KEY_$x, ";
|
||||
} else {
|
||||
print "0 /* SDL_$x */, ";
|
||||
}
|
||||
} elsif ( $i < 0x61) {
|
||||
print "$i, ";
|
||||
} else {
|
||||
print "0 /* SDL_$x */, ";
|
||||
}
|
||||
if(($i % 4) == 3 ) {
|
||||
print "\n\t";
|
||||
}
|
||||
}
|
||||
print "};\n";
|
||||
@@ -30,6 +30,16 @@
|
||||
|
||||
# ------------------------------------------------------------
|
||||
|
||||
# ------------------------------------------------------------
|
||||
# The format when writing save files.
|
||||
# xsystem35 : default
|
||||
# system36 : compatible with System3.5 v2 - System3.6
|
||||
# system39 : compatible with System3.8 - System3.9
|
||||
|
||||
#saveformat: xsystem35
|
||||
|
||||
# ------------------------------------------------------------
|
||||
|
||||
# ------------------------------------------------------------
|
||||
# CD-ROM のデバイス名
|
||||
#
|
||||
|
||||
Reference in New Issue
Block a user