Compare commits
82 Commits
chosenofbe
...
master
Author | SHA1 | Date |
---|---|---|
Amaryllis Kulla | 6a875b30d2 | |
Amaryllis Kulla | 998aa9f846 | |
Amaryllis Kulla | b4c439c6eb | |
Amaryllis Kulla | 380b676777 | |
Amaryllis Kulla | a962c158db | |
Jaiden | cf6403ae65 | |
Ancurio | f138731f7c | |
mara | ac8f4b1594 | |
Jari Vetoniemi | 990843a50b | |
Jari Vetoniemi | 66dc9309db | |
Jonas Kulla | 5c117a55bf | |
Jonas Kulla | cb09036c55 | |
Jonas Kulla | 6903f2ab43 | |
Jonas Kulla | 9dc42914de | |
Jonas Kulla | 86194118a3 | |
Jonas Kulla | 98bdfcf758 | |
Jonas Kulla | 6fa5b8c856 | |
Jonas Kulla | d6b477b887 | |
Jonas Kulla | 9dcfb66e86 | |
Jonas Kulla | d4b9adc1d1 | |
Luis Caceres | 43cb318862 | |
Eliza Velasquez | bab22d87be | |
Jonas Kulla | ae59fcd112 | |
ReinUsesLisp | b5e5a26d8b | |
Jonas Kulla | 9f44ee5068 | |
Jonas Kulla | 183ebbed65 | |
Jonas Kulla | 7902d0942d | |
Jonas Kulla | 947974cac6 | |
Jonas Kulla | 2f81fbbf4b | |
Jonas Kulla | 7d9a85dbbd | |
Carsten Teibes | d427df0c2b | |
Carsten Teibes | b1bdf1e445 | |
Carsten Teibes | fde6a92197 | |
Marty Plummer | 01e17ed5c6 | |
Jonas Kulla | f172f58c74 | |
Jonas Kulla | fba20e6294 | |
Marty Plummer | f5c30affaa | |
Jonas Kulla | bd694f9f99 | |
Jonas Kulla | cab453ac3a | |
Jonas Kulla | 006f701fec | |
Jonas Kulla | 1478e1e0f9 | |
Jonas Kulla | 06feafe9ef | |
Jonas Kulla | e4079d5738 | |
Jonas Kulla | 0481f920b0 | |
Jonas Kulla | 3ea24bd757 | |
Marty Plummer | 60e967e3b7 | |
Jonas Kulla | 0f9b5f274a | |
Jonas Kulla | 6349146e01 | |
Jonas Kulla | c4dd3ffaf6 | |
Jonas Kulla | 55cec53911 | |
Jonas Kulla | 541e24f678 | |
Jonas Kulla | 0ec1fce4ac | |
Jonas Kulla | d4e09f55bd | |
Jonas Kulla | e98c2e0535 | |
Jonas Kulla | fdaf6c3611 | |
Jonas Kulla | 47ef36ca19 | |
Jonas Kulla | de74fc1bc3 | |
Jonas Kulla | 5d776319b5 | |
Jonas Kulla | 53b5b923d4 | |
Mook | 8e411cbcfe | |
Jonas Kulla | 7bf6eca362 | |
Jonas Kulla | 4d97a17c44 | |
Jonas Kulla | 7017ca1c53 | |
Jonas Kulla | 30465691ae | |
Jonas Kulla | dd7545fcf2 | |
Jonas Kulla | 5aaeb0206c | |
Jonas Kulla | 9a3dd2d554 | |
Jonas Kulla | 384249c31a | |
Jonas Kulla | d1ee507ec4 | |
Jonas Kulla | 21247b18b5 | |
cremno | 861d261af2 | |
Jonas Kulla | fe6799d00b | |
Jonas Kulla | fe709b6010 | |
Jonas Kulla | 54c1107f19 | |
Jonas Kulla | 533e69275a | |
Jonas Kulla | e4558c9dfb | |
Jonas Kulla | 5382cc11a3 | |
Jonas Kulla | 1e9e24e45c | |
Jonas Kulla | 9acdd206f6 | |
Jonas Kulla | 6e176a454c | |
Jonas Kulla | afab51279e | |
Jonas Kulla | 61849a9158 |
|
@ -0,0 +1,5 @@
|
||||||
|
root=true
|
||||||
|
[*]
|
||||||
|
end_of_line = lf
|
||||||
|
indent_style = tab
|
||||||
|
indent_size = 4
|
|
@ -110,6 +110,7 @@ set(MAIN_HEADERS
|
||||||
src/flashable.h
|
src/flashable.h
|
||||||
src/font.h
|
src/font.h
|
||||||
src/input.h
|
src/input.h
|
||||||
|
src/iniconfig.h
|
||||||
src/plane.h
|
src/plane.h
|
||||||
src/scene.h
|
src/scene.h
|
||||||
src/sprite.h
|
src/sprite.h
|
||||||
|
@ -167,6 +168,7 @@ set(MAIN_SOURCE
|
||||||
src/filesystem.cpp
|
src/filesystem.cpp
|
||||||
src/font.cpp
|
src/font.cpp
|
||||||
src/input.cpp
|
src/input.cpp
|
||||||
|
src/iniconfig.cpp
|
||||||
src/plane.cpp
|
src/plane.cpp
|
||||||
src/scene.cpp
|
src/scene.cpp
|
||||||
src/sprite.cpp
|
src/sprite.cpp
|
||||||
|
@ -205,6 +207,11 @@ set(MAIN_SOURCE
|
||||||
src/fluid-fun.cpp
|
src/fluid-fun.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if(WIN32)
|
||||||
|
list(APPEND MAIN_HEADERS windows/resource.h)
|
||||||
|
list(APPEND MAIN_SOURCE windows/resource.rc)
|
||||||
|
endif()
|
||||||
|
|
||||||
source_group("MKXP Source" FILES ${MAIN_SOURCE} ${MAIN_HEADERS})
|
source_group("MKXP Source" FILES ${MAIN_SOURCE} ${MAIN_HEADERS})
|
||||||
|
|
||||||
## Setup embedded source ##
|
## Setup embedded source ##
|
||||||
|
@ -405,10 +412,12 @@ target_compile_definitions(${PROJECT_NAME} PRIVATE
|
||||||
)
|
)
|
||||||
target_include_directories(${PROJECT_NAME} PRIVATE
|
target_include_directories(${PROJECT_NAME} PRIVATE
|
||||||
src
|
src
|
||||||
|
windows
|
||||||
${SIGCXX_INCLUDE_DIRS}
|
${SIGCXX_INCLUDE_DIRS}
|
||||||
${PIXMAN_INCLUDE_DIRS}
|
${PIXMAN_INCLUDE_DIRS}
|
||||||
${PHYSFS_INCLUDE_DIRS}
|
${PHYSFS_INCLUDE_DIRS}
|
||||||
${SDL2_INCLUDE_DIRS} # Blindly assume other SDL bits are in same directory
|
${SDL2_INCLUDE_DIRS} # Blindly assume other SDL bits are in same directory
|
||||||
|
${SDL_SOUND_INCLUDE_DIRS}
|
||||||
${Boost_INCLUDE_DIR}
|
${Boost_INCLUDE_DIR}
|
||||||
${MRI_INCLUDE_DIRS}
|
${MRI_INCLUDE_DIRS}
|
||||||
${VORBISFILE_INCLUDE_DIRS}
|
${VORBISFILE_INCLUDE_DIRS}
|
||||||
|
|
18
README.md
18
README.md
|
@ -1,13 +1,19 @@
|
||||||
# mkxp
|
# mkxp
|
||||||
|
|
||||||
|
Discord community: https://discord.gg/A8xHE8P
|
||||||
|
Matrix space: https://matrix.to/#/#rpgmaker:mapleshrine.eu
|
||||||
|
Further links: https://mapleshrine.eu
|
||||||
|
|
||||||
mkxp is a project that seeks to provide a fully open source implementation of the Ruby Game Scripting System (RGSS) interface used in the popular game creation software "RPG Maker XP", "RPG Maker VX" and "RPG Maker VX Ace" (trademark by Enterbrain, Inc.), with focus on Linux. The goal is to be able to run games created with the above software natively without changing a single file.
|
mkxp is a project that seeks to provide a fully open source implementation of the Ruby Game Scripting System (RGSS) interface used in the popular game creation software "RPG Maker XP", "RPG Maker VX" and "RPG Maker VX Ace" (trademark by Enterbrain, Inc.), with focus on Linux. The goal is to be able to run games created with the above software natively without changing a single file.
|
||||||
|
|
||||||
It is licensed under the GNU General Public License v2+.
|
It is licensed under the GNU General Public License v2+.
|
||||||
|
|
||||||
## Prebuilt binaries
|
## Prebuilt binaries
|
||||||
[**Linux (32bit/64bit)**](http://ancurio.bplaced.net/mkxp/generic/)
|
[**Linux / Windows**](https://www.mapleshrine.eu/releases/)
|
||||||
[**OSX**](https://app.box.com/mkxpmacbuilds) by Ali
|
[**OSX**](https://app.box.com/mkxpmacbuilds) by Ali
|
||||||
[**Windows (mingw-w64 32bit)**](http://ancurio.bplaced.net/mkxp/mingw32/)
|
|
||||||
|
## Should I use mkxp
|
||||||
|
mkxp primarily targets technically versed users that are comfortable with Ruby / RGSS, and ideally know how to compile the project themselves. The reason for this is that for most games, due to Win32-API usage, mkxp is simply not a plug-and-play solution, but a building block with which a fully cross-platform version can be created in time.
|
||||||
|
|
||||||
## Bindings
|
## Bindings
|
||||||
Bindings provide the glue code for an interpreted language environment to run game scripts in. Currently there are three bindings:
|
Bindings provide the glue code for an interpreted language environment to run game scripts in. Currently there are three bindings:
|
||||||
|
@ -20,6 +26,8 @@ Matz's Ruby Interpreter, also called CRuby, is the most widely deployed version
|
||||||
For a list of differences, see:
|
For a list of differences, see:
|
||||||
http://stackoverflow.com/questions/21574/what-is-the-difference-between-ruby-1-8-and-ruby-1-9
|
http://stackoverflow.com/questions/21574/what-is-the-difference-between-ruby-1-8-and-ruby-1-9
|
||||||
|
|
||||||
|
This binding supports RGSS1, RGSS2 and RGSS3.
|
||||||
|
|
||||||
### mruby (Lightweight Ruby)
|
### mruby (Lightweight Ruby)
|
||||||
Website: https://github.com/mruby/mruby
|
Website: https://github.com/mruby/mruby
|
||||||
|
|
||||||
|
@ -29,6 +37,8 @@ Due to heavy differences between mruby and MRI as well as lacking modules, runni
|
||||||
|
|
||||||
Some extensions to the standard classes/modules are provided, taking the RPG Maker XP helpfile as a quasi "reference". These include Marshal, File, FileTest and Time.
|
Some extensions to the standard classes/modules are provided, taking the RPG Maker XP helpfile as a quasi "reference". These include Marshal, File, FileTest and Time.
|
||||||
|
|
||||||
|
This binding only supports RGSS1.
|
||||||
|
|
||||||
**Important:** If you decide to use [mattn's oniguruma regexp gem](https://github.com/mattn/mruby-onig-regexp), don't forget to add `-lonig` to the linker flags to avoid ugly symbol overlaps with libc.
|
**Important:** If you decide to use [mattn's oniguruma regexp gem](https://github.com/mattn/mruby-onig-regexp), don't forget to add `-lonig` to the linker flags to avoid ugly symbol overlaps with libc.
|
||||||
|
|
||||||
### null
|
### null
|
||||||
|
@ -79,7 +89,7 @@ To run mkxp, you should have a graphics card capable of at least **OpenGL (ES) 2
|
||||||
|
|
||||||
## Dependency kit
|
## Dependency kit
|
||||||
|
|
||||||
To facilitate hacking, I have assembled a package containing all dependencies to compile mkxp on a bare-bones Ubuntu 12.04 64bit installation. Compatibility with other distributions has not been tested. You can download it [here](https://www.dropbox.com/s/mtp44ur367m2zts/mkxp-depkit.tar.xz). Read the "README" for instructions.
|
To facilitate hacking, I have assembled a package containing all dependencies to compile mkxp on a bare-bones Ubuntu 12.04 64bit installation. Compatibility with other distributions has not been tested. You can download it [here](https://mapleshrine.eu/depkits/linux64.tar.xz). Read the "README" for instructions.
|
||||||
|
|
||||||
## Configuration
|
## Configuration
|
||||||
|
|
||||||
|
@ -95,7 +105,7 @@ Example: `./mkxp --gameFolder="my game" --vsync=true --fixedFramerate=60`
|
||||||
|
|
||||||
mkxp doesn't come with a soundfont by default, so you will have to supply it yourself (set its path in the config). Playback has been tested and should work reasonably well with all RTP assets.
|
mkxp doesn't come with a soundfont by default, so you will have to supply it yourself (set its path in the config). Playback has been tested and should work reasonably well with all RTP assets.
|
||||||
|
|
||||||
You can use this public domain soundfont: [GMGSx.sf2](https://www.dropbox.com/s/qxdvoxxcexsvn43/GMGSx.sf2?dl=0)
|
You can use this public domain soundfont: [GMGSx.sf2](https://mapleshrine.eu/unsorted/GMGSx.sf2)
|
||||||
|
|
||||||
## Fonts
|
## Fonts
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
@ -97,6 +97,15 @@ DEF_FADE( me )
|
||||||
|
|
||||||
DEF_PLAY_STOP( se )
|
DEF_PLAY_STOP( se )
|
||||||
|
|
||||||
|
RB_METHOD(audioSetupMidi)
|
||||||
|
{
|
||||||
|
RB_UNUSED_PARAM;
|
||||||
|
|
||||||
|
shState->audio().setupMidi();
|
||||||
|
|
||||||
|
return Qnil;
|
||||||
|
}
|
||||||
|
|
||||||
RB_METHOD(audioReset)
|
RB_METHOD(audioReset)
|
||||||
{
|
{
|
||||||
RB_UNUSED_PARAM;
|
RB_UNUSED_PARAM;
|
||||||
|
@ -135,6 +144,8 @@ audioBindingInit()
|
||||||
{
|
{
|
||||||
BIND_POS( bgm );
|
BIND_POS( bgm );
|
||||||
BIND_POS( bgs );
|
BIND_POS( bgs );
|
||||||
|
|
||||||
|
_rb_define_module_function(module, "setup_midi", audioSetupMidi);
|
||||||
}
|
}
|
||||||
|
|
||||||
BIND_PLAY_STOP( se )
|
BIND_PLAY_STOP( se )
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
@ -80,6 +80,7 @@ RB_METHOD(mriP);
|
||||||
RB_METHOD(mkxpDataDirectory);
|
RB_METHOD(mkxpDataDirectory);
|
||||||
RB_METHOD(mkxpPuts);
|
RB_METHOD(mkxpPuts);
|
||||||
RB_METHOD(mkxpRawKeyStates);
|
RB_METHOD(mkxpRawKeyStates);
|
||||||
|
RB_METHOD(mkxpMouseInWindow);
|
||||||
|
|
||||||
RB_METHOD(mriRgssMain);
|
RB_METHOD(mriRgssMain);
|
||||||
RB_METHOD(mriRgssStop);
|
RB_METHOD(mriRgssStop);
|
||||||
|
@ -144,8 +145,18 @@ static void mriBindingInit()
|
||||||
_rb_define_module_function(mod, "data_directory", mkxpDataDirectory);
|
_rb_define_module_function(mod, "data_directory", mkxpDataDirectory);
|
||||||
_rb_define_module_function(mod, "puts", mkxpPuts);
|
_rb_define_module_function(mod, "puts", mkxpPuts);
|
||||||
_rb_define_module_function(mod, "raw_key_states", mkxpRawKeyStates);
|
_rb_define_module_function(mod, "raw_key_states", mkxpRawKeyStates);
|
||||||
|
_rb_define_module_function(mod, "mouse_in_window", mkxpMouseInWindow);
|
||||||
|
|
||||||
|
/* Load global constants */
|
||||||
rb_gv_set("MKXP", Qtrue);
|
rb_gv_set("MKXP", Qtrue);
|
||||||
|
|
||||||
|
VALUE debug = rb_bool_new(shState->config().editor.debug);
|
||||||
|
if (rgssVer == 1)
|
||||||
|
rb_gv_set("DEBUG", debug);
|
||||||
|
else if (rgssVer >= 2)
|
||||||
|
rb_gv_set("TEST", debug);
|
||||||
|
|
||||||
|
rb_gv_set("BTEST", rb_bool_new(shState->config().editor.battleTest));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -222,6 +233,13 @@ RB_METHOD(mkxpRawKeyStates)
|
||||||
return str;
|
return str;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
RB_METHOD(mkxpMouseInWindow)
|
||||||
|
{
|
||||||
|
RB_UNUSED_PARAM;
|
||||||
|
|
||||||
|
return rb_bool_new(EventThread::mouseState.inWindow);
|
||||||
|
}
|
||||||
|
|
||||||
static VALUE rgssMainCb(VALUE block)
|
static VALUE rgssMainCb(VALUE block)
|
||||||
{
|
{
|
||||||
rb_funcall2(block, rb_intern("call"), 0, 0);
|
rb_funcall2(block, rb_intern("call"), 0, 0);
|
||||||
|
@ -452,8 +470,9 @@ static void runRMXPScripts(BacktraceData &btData)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Execute preloaded scripts */
|
/* Execute preloaded scripts */
|
||||||
for (size_t i = 0; i < conf.preloadScripts.size(); ++i)
|
for (std::set<std::string>::iterator i = conf.preloadScripts.begin();
|
||||||
runCustomScript(conf.preloadScripts[i]);
|
i != conf.preloadScripts.end(); ++i)
|
||||||
|
runCustomScript(*i);
|
||||||
|
|
||||||
VALUE exc = rb_gv_get("$!");
|
VALUE exc = rb_gv_get("$!");
|
||||||
if (exc != Qnil)
|
if (exc != Qnil)
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
@ -67,7 +67,7 @@ raiseRbExc(const Exception &exc);
|
||||||
|
|
||||||
/* 2.1 has added a new field (flags) to rb_data_type_t */
|
/* 2.1 has added a new field (flags) to rb_data_type_t */
|
||||||
#include <ruby/version.h>
|
#include <ruby/version.h>
|
||||||
#if RUBY_API_VERSION_MINOR > 0
|
#if RUBY_API_VERSION_MAJOR >= 2 && RUBY_API_VERSION_MINOR >= 1
|
||||||
/* TODO: can mkxp use RUBY_TYPED_FREE_IMMEDIATELY here? */
|
/* TODO: can mkxp use RUBY_TYPED_FREE_IMMEDIATELY here? */
|
||||||
#define DEF_TYPE_FLAGS 0
|
#define DEF_TYPE_FLAGS 0
|
||||||
#else
|
#else
|
||||||
|
@ -90,7 +90,12 @@ raiseRbExc(const Exception &exc);
|
||||||
template<rb_data_type_t *rbType>
|
template<rb_data_type_t *rbType>
|
||||||
static VALUE classAllocate(VALUE klass)
|
static VALUE classAllocate(VALUE klass)
|
||||||
{
|
{
|
||||||
|
/* 2.3 has changed the name of this function */
|
||||||
|
#if RUBY_API_VERSION_MAJOR >= 2 && RUBY_API_VERSION_MINOR >= 3
|
||||||
|
return rb_data_typed_object_wrap(klass, 0, rbType);
|
||||||
|
#else
|
||||||
return rb_data_typed_object_alloc(klass, 0, rbType);
|
return rb_data_typed_object_alloc(klass, 0, rbType);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class C>
|
template<class C>
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
@ -46,7 +46,7 @@ fileIntForPath(const char *path, bool rubyExc)
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
shState->fileSystem().openRead(*ops, path);
|
shState->fileSystem().openReadRaw(*ops, path);
|
||||||
}
|
}
|
||||||
catch (const Exception &e)
|
catch (const Exception &e)
|
||||||
{
|
{
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
@ -27,6 +27,29 @@
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
collectStrings(VALUE obj, std::vector<std::string> &out)
|
||||||
|
{
|
||||||
|
if (RB_TYPE_P(obj, RUBY_T_STRING))
|
||||||
|
{
|
||||||
|
out.push_back(RSTRING_PTR(obj));
|
||||||
|
}
|
||||||
|
else if (RB_TYPE_P(obj, RUBY_T_ARRAY))
|
||||||
|
{
|
||||||
|
for (long i = 0; i < RARRAY_LEN(obj); ++i)
|
||||||
|
{
|
||||||
|
VALUE str = rb_ary_entry(obj, i);
|
||||||
|
|
||||||
|
/* Non-string objects are tolerated (ignored) */
|
||||||
|
if (!RB_TYPE_P(str, RUBY_T_STRING))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
out.push_back(RSTRING_PTR(str));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
DEF_TYPE(Font);
|
DEF_TYPE(Font);
|
||||||
|
|
||||||
RB_METHOD(fontDoesExist)
|
RB_METHOD(fontDoesExist)
|
||||||
|
@ -48,12 +71,30 @@ RB_METHOD(FontSetName);
|
||||||
|
|
||||||
RB_METHOD(fontInitialize)
|
RB_METHOD(fontInitialize)
|
||||||
{
|
{
|
||||||
VALUE name = Qnil;
|
VALUE namesObj = Qnil;
|
||||||
int size = 0;
|
int size = 0;
|
||||||
|
|
||||||
rb_get_args(argc, argv, "|oi", &name, &size RB_ARG_END);
|
rb_get_args(argc, argv, "|oi", &namesObj, &size RB_ARG_END);
|
||||||
|
|
||||||
Font *f = new Font(0, size);
|
Font *f;
|
||||||
|
|
||||||
|
if (NIL_P(namesObj))
|
||||||
|
{
|
||||||
|
namesObj = rb_iv_get(rb_obj_class(self), "default_name");
|
||||||
|
f = new Font(0, size);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
std::vector<std::string> names;
|
||||||
|
collectStrings(namesObj, names);
|
||||||
|
|
||||||
|
f = new Font(&names, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* This is semantically wrong; the new Font object should take
|
||||||
|
* a dup'ed object here in case of an array. Ditto for the setters.
|
||||||
|
* However the same bug/behavior exists in all RM versions. */
|
||||||
|
rb_iv_set(self, "name", namesObj);
|
||||||
|
|
||||||
setPrivateData(self, f);
|
setPrivateData(self, f);
|
||||||
|
|
||||||
|
@ -65,13 +106,6 @@ RB_METHOD(fontInitialize)
|
||||||
if (rgssVer >= 3)
|
if (rgssVer >= 3)
|
||||||
wrapProperty(self, &f->getOutColor(), "out_color", ColorType);
|
wrapProperty(self, &f->getOutColor(), "out_color", ColorType);
|
||||||
|
|
||||||
if (NIL_P(name))
|
|
||||||
name = rb_iv_get(rb_obj_class(self), "default_name");
|
|
||||||
|
|
||||||
/* Going over the 'name=' function automatically causes
|
|
||||||
* a possbile name array to be re-verified for existing fonts */
|
|
||||||
FontSetName(1, &name, self);
|
|
||||||
|
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -105,57 +139,17 @@ RB_METHOD(FontGetName)
|
||||||
return rb_iv_get(self, "name");
|
return rb_iv_get(self, "name");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
fontSetNameHelper(VALUE self, int argc, VALUE *argv,
|
|
||||||
const char *nameIv, char *outBuf, size_t outLen)
|
|
||||||
{
|
|
||||||
rb_check_argc(argc, 1);
|
|
||||||
|
|
||||||
VALUE arg = argv[0];
|
|
||||||
|
|
||||||
// Fixme: in RGSS3, specifying "" (and only that) as font name results in
|
|
||||||
// no text being drawn (everything else is substituted with Arial I think)
|
|
||||||
strncpy(outBuf, "", outLen);
|
|
||||||
|
|
||||||
if (RB_TYPE_P(arg, RUBY_T_STRING))
|
|
||||||
{
|
|
||||||
strncpy(outBuf, RSTRING_PTR(arg), outLen);
|
|
||||||
}
|
|
||||||
else if (RB_TYPE_P(arg, RUBY_T_ARRAY))
|
|
||||||
{
|
|
||||||
for (long i = 0; i < RARRAY_LEN(arg); ++i)
|
|
||||||
{
|
|
||||||
VALUE str = rb_ary_entry(arg, i);
|
|
||||||
|
|
||||||
/* Non-string objects are tolerated (ignored) */
|
|
||||||
if (!RB_TYPE_P(str, RUBY_T_STRING))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
const char *family = RSTRING_PTR(str);
|
|
||||||
|
|
||||||
/* We only set the core Font object's name attribute
|
|
||||||
* to the actually existing font name */
|
|
||||||
if (!shState->fontState().fontPresent(family))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
strncpy(outBuf, family, outLen);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* RMXP doesn't even care if the argument type is
|
|
||||||
* something other than string/array. Whatever... */
|
|
||||||
rb_iv_set(self, nameIv, arg);
|
|
||||||
}
|
|
||||||
|
|
||||||
RB_METHOD(FontSetName)
|
RB_METHOD(FontSetName)
|
||||||
{
|
{
|
||||||
Font *f = getPrivateData<Font>(self);
|
Font *f = getPrivateData<Font>(self);
|
||||||
|
|
||||||
char result[256];
|
rb_check_argc(argc, 1);
|
||||||
fontSetNameHelper(self, argc, argv, "name",
|
|
||||||
result, sizeof(result));
|
|
||||||
|
|
||||||
f->setName(result);
|
std::vector<std::string> namesObj;
|
||||||
|
collectStrings(argv[0], namesObj);
|
||||||
|
|
||||||
|
f->setName(namesObj);
|
||||||
|
rb_iv_set(self, "name", argv[0]);
|
||||||
|
|
||||||
return argv[0];
|
return argv[0];
|
||||||
}
|
}
|
||||||
|
@ -223,11 +217,15 @@ RB_METHOD(FontGetDefaultName)
|
||||||
|
|
||||||
RB_METHOD(FontSetDefaultName)
|
RB_METHOD(FontSetDefaultName)
|
||||||
{
|
{
|
||||||
char result[256];
|
RB_UNUSED_PARAM;
|
||||||
fontSetNameHelper(self, argc, argv, "default_name",
|
|
||||||
result, sizeof(result));
|
|
||||||
|
|
||||||
Font::setDefaultName(result);
|
rb_check_argc(argc, 1);
|
||||||
|
|
||||||
|
std::vector<std::string> namesObj;
|
||||||
|
collectStrings(argv[0], namesObj);
|
||||||
|
|
||||||
|
Font::setDefaultName(namesObj, shState->fontState());
|
||||||
|
rb_iv_set(self, "default_name", argv[0]);
|
||||||
|
|
||||||
return argv[0];
|
return argv[0];
|
||||||
}
|
}
|
||||||
|
@ -267,7 +265,24 @@ fontBindingInit()
|
||||||
|
|
||||||
Font::initDefaultDynAttribs();
|
Font::initDefaultDynAttribs();
|
||||||
wrapProperty(klass, &Font::getDefaultColor(), "default_color", ColorType);
|
wrapProperty(klass, &Font::getDefaultColor(), "default_color", ColorType);
|
||||||
rb_iv_set(klass, "default_name", rb_str_new_cstr(Font::getDefaultName()));
|
|
||||||
|
/* Initialize default names */
|
||||||
|
const std::vector<std::string> &defNames = Font::getInitialDefaultNames();
|
||||||
|
VALUE defNamesObj;
|
||||||
|
|
||||||
|
if (defNames.size() == 1)
|
||||||
|
{
|
||||||
|
defNamesObj = rb_str_new_cstr(defNames[0].c_str());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
defNamesObj = rb_ary_new2(defNames.size());
|
||||||
|
|
||||||
|
for (size_t i = 0; i < defNames.size(); ++i)
|
||||||
|
rb_ary_push(defNamesObj, rb_str_new_cstr(defNames[i].c_str()));
|
||||||
|
}
|
||||||
|
|
||||||
|
rb_iv_set(klass, "default_name", defNamesObj);
|
||||||
|
|
||||||
if (rgssVer >= 3)
|
if (rgssVer >= 3)
|
||||||
wrapProperty(klass, &Font::getDefaultOutColor(), "default_out_color", ColorType);
|
wrapProperty(klass, &Font::getDefaultOutColor(), "default_out_color", ColorType);
|
||||||
|
@ -310,14 +325,4 @@ fontBindingInit()
|
||||||
INIT_PROP_BIND(Font, Outline, "outline");
|
INIT_PROP_BIND(Font, Outline, "outline");
|
||||||
INIT_PROP_BIND(Font, OutColor, "out_color");
|
INIT_PROP_BIND(Font, OutColor, "out_color");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rgssVer >= 2)
|
|
||||||
{
|
|
||||||
VALUE defNames = rb_ary_new2(3);
|
|
||||||
rb_ary_push(defNames, rb_str_new2("Verdana"));
|
|
||||||
rb_ary_push(defNames, rb_str_new2("Arial"));
|
|
||||||
rb_ary_push(defNames, rb_str_new2("Courier New"));
|
|
||||||
|
|
||||||
FontSetDefaultName(1, &defNames, klass);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
@ -183,6 +183,18 @@ RB_METHOD(graphicsReset)
|
||||||
return Qnil;
|
return Qnil;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
RB_METHOD(graphicsPlayMovie)
|
||||||
|
{
|
||||||
|
RB_UNUSED_PARAM;
|
||||||
|
|
||||||
|
const char *filename;
|
||||||
|
rb_get_args(argc, argv, "z", &filename RB_ARG_END);
|
||||||
|
|
||||||
|
shState->graphics().playMovie(filename);
|
||||||
|
|
||||||
|
return Qnil;
|
||||||
|
}
|
||||||
|
|
||||||
DEF_GRA_PROP_I(FrameRate)
|
DEF_GRA_PROP_I(FrameRate)
|
||||||
DEF_GRA_PROP_I(FrameCount)
|
DEF_GRA_PROP_I(FrameCount)
|
||||||
DEF_GRA_PROP_I(Brightness)
|
DEF_GRA_PROP_I(Brightness)
|
||||||
|
@ -223,6 +235,11 @@ void graphicsBindingInit()
|
||||||
INIT_GRA_PROP_BIND( Brightness, "brightness" );
|
INIT_GRA_PROP_BIND( Brightness, "brightness" );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (rgssVer >= 3)
|
||||||
|
{
|
||||||
|
_rb_define_module_function(module, "play_movie", graphicsPlayMovie);
|
||||||
|
}
|
||||||
|
|
||||||
INIT_GRA_PROP_BIND( Fullscreen, "fullscreen" );
|
INIT_GRA_PROP_BIND( Fullscreen, "fullscreen" );
|
||||||
INIT_GRA_PROP_BIND( ShowCursor, "show_cursor" );
|
INIT_GRA_PROP_BIND( ShowCursor, "show_cursor" );
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
@ -56,6 +56,7 @@ DEF_PROP_I(Sprite, Y)
|
||||||
DEF_PROP_I(Sprite, OX)
|
DEF_PROP_I(Sprite, OX)
|
||||||
DEF_PROP_I(Sprite, OY)
|
DEF_PROP_I(Sprite, OY)
|
||||||
DEF_PROP_I(Sprite, BushDepth)
|
DEF_PROP_I(Sprite, BushDepth)
|
||||||
|
DEF_PROP_I(Sprite, BushOpacity)
|
||||||
DEF_PROP_I(Sprite, Opacity)
|
DEF_PROP_I(Sprite, Opacity)
|
||||||
DEF_PROP_I(Sprite, BlendType)
|
DEF_PROP_I(Sprite, BlendType)
|
||||||
DEF_PROP_I(Sprite, WaveAmp)
|
DEF_PROP_I(Sprite, WaveAmp)
|
||||||
|
@ -126,6 +127,8 @@ spriteBindingInit()
|
||||||
_rb_define_method(klass, "width", spriteWidth);
|
_rb_define_method(klass, "width", spriteWidth);
|
||||||
_rb_define_method(klass, "height", spriteHeight);
|
_rb_define_method(klass, "height", spriteHeight);
|
||||||
|
|
||||||
|
INIT_PROP_BIND( Sprite, BushOpacity, "bush_opacity" );
|
||||||
|
|
||||||
INIT_PROP_BIND( Sprite, WaveAmp, "wave_amp" );
|
INIT_PROP_BIND( Sprite, WaveAmp, "wave_amp" );
|
||||||
INIT_PROP_BIND( Sprite, WaveLength, "wave_length" );
|
INIT_PROP_BIND( Sprite, WaveLength, "wave_length" );
|
||||||
INIT_PROP_BIND( Sprite, WaveSpeed, "wave_speed" );
|
INIT_PROP_BIND( Sprite, WaveSpeed, "wave_speed" );
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2014 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2014 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
@ -114,8 +114,17 @@ static void mrbBindingInit(mrb_state *mrb)
|
||||||
/* Load RPG module */
|
/* Load RPG module */
|
||||||
mrb_load_irep(mrb, mrbModuleRPG);
|
mrb_load_irep(mrb, mrbModuleRPG);
|
||||||
|
|
||||||
|
/* Load global constants */
|
||||||
mrb_define_global_const(mrb, "MKXP", mrb_true_value());
|
mrb_define_global_const(mrb, "MKXP", mrb_true_value());
|
||||||
|
|
||||||
|
mrb_value debug = rb_bool_new(shState->config().editor.debug);
|
||||||
|
if (rgssVer == 1)
|
||||||
|
mrb_define_global_const(mrb, "DEBUG", debug);
|
||||||
|
else if (rgssVer >= 2)
|
||||||
|
mrb_define_global_const(mrb, "TEST", debug);
|
||||||
|
|
||||||
|
mrb_define_global_const(mrb, "BTEST", mrb_bool_value(shState->config().editor.battleTest));
|
||||||
|
|
||||||
mrb_gc_arena_restore(mrb, arena);
|
mrb_gc_arena_restore(mrb, arena);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -266,7 +275,7 @@ runRMXPScripts(mrb_state *mrb, mrbc_context *ctx)
|
||||||
mrb_state *scriptMrb = mrb_open();
|
mrb_state *scriptMrb = mrb_open();
|
||||||
SDL_RWops ops;
|
SDL_RWops ops;
|
||||||
|
|
||||||
shState->fileSystem().openRead(ops, scriptPack.c_str());
|
shState->fileSystem().openReadRaw(ops, scriptPack.c_str());
|
||||||
|
|
||||||
mrb_value scriptArray = mrb_nil_value();
|
mrb_value scriptArray = mrb_nil_value();
|
||||||
std::string readError;
|
std::string readError;
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -57,9 +57,9 @@
|
||||||
|
|
||||||
# Apply linear interpolation when game screen
|
# Apply linear interpolation when game screen
|
||||||
# is upscaled
|
# is upscaled
|
||||||
# (default: disabled)
|
# (default: enabled)
|
||||||
#
|
#
|
||||||
# smoothScaling=false
|
# smoothScaling=true
|
||||||
|
|
||||||
|
|
||||||
# Sync screen redraws to the monitor refresh rate
|
# Sync screen redraws to the monitor refresh rate
|
||||||
|
@ -86,6 +86,12 @@
|
||||||
# defScreenH=480
|
# defScreenH=480
|
||||||
|
|
||||||
|
|
||||||
|
# Override the game window title
|
||||||
|
# (default: none)
|
||||||
|
#
|
||||||
|
# windowTitle=Custom Title
|
||||||
|
|
||||||
|
|
||||||
# Enforce a static frame rate
|
# Enforce a static frame rate
|
||||||
# (0 = disabled)
|
# (0 = disabled)
|
||||||
#
|
#
|
||||||
|
@ -124,6 +130,26 @@
|
||||||
# subImageFix=false
|
# subImageFix=false
|
||||||
|
|
||||||
|
|
||||||
|
# Enable framebuffer blitting if the driver is
|
||||||
|
# capable of it. Some drivers carry buggy
|
||||||
|
# implementations of this functionality, so
|
||||||
|
# disabling it can be used as a workaround
|
||||||
|
# (default: enabled)
|
||||||
|
#
|
||||||
|
# enableBlitting=true
|
||||||
|
|
||||||
|
|
||||||
|
# Limit the maximum size (width, height) of
|
||||||
|
# most textures mkxp will create (exceptions are
|
||||||
|
# rendering backbuffers and similar).
|
||||||
|
# If set to 0, the hardware maximum is used.
|
||||||
|
# This is useful for recording traces that can
|
||||||
|
# be played back on machines with lower specs.
|
||||||
|
# (default: 0)
|
||||||
|
#
|
||||||
|
# maxTextureSize=0
|
||||||
|
|
||||||
|
|
||||||
# Set the base path of the game to '/path/to/game'
|
# Set the base path of the game to '/path/to/game'
|
||||||
# (default: executable directory)
|
# (default: executable directory)
|
||||||
#
|
#
|
||||||
|
|
6
mkxp.pro
6
mkxp.pro
|
@ -8,6 +8,10 @@ INCLUDEPATH += . src
|
||||||
|
|
||||||
CONFIG(release, debug|release): DEFINES += NDEBUG
|
CONFIG(release, debug|release): DEFINES += NDEBUG
|
||||||
|
|
||||||
|
CONFIG += c++11
|
||||||
|
# And for older qmake versions..
|
||||||
|
QMAKE_CXXFLAGS += -std=c++11
|
||||||
|
|
||||||
isEmpty(BINDING) {
|
isEmpty(BINDING) {
|
||||||
BINDING = MRI
|
BINDING = MRI
|
||||||
}
|
}
|
||||||
|
@ -89,6 +93,7 @@ HEADERS += \
|
||||||
src/flashable.h \
|
src/flashable.h \
|
||||||
src/font.h \
|
src/font.h \
|
||||||
src/input.h \
|
src/input.h \
|
||||||
|
src/iniconfig.h \
|
||||||
src/plane.h \
|
src/plane.h \
|
||||||
src/scene.h \
|
src/scene.h \
|
||||||
src/sprite.h \
|
src/sprite.h \
|
||||||
|
@ -145,6 +150,7 @@ SOURCES += \
|
||||||
src/filesystem.cpp \
|
src/filesystem.cpp \
|
||||||
src/font.cpp \
|
src/font.cpp \
|
||||||
src/input.cpp \
|
src/input.cpp \
|
||||||
|
src/iniconfig.cpp \
|
||||||
src/plane.cpp \
|
src/plane.cpp \
|
||||||
src/scene.cpp \
|
src/scene.cpp \
|
||||||
src/sprite.cpp \
|
src/sprite.cpp \
|
||||||
|
|
|
@ -1,48 +1,40 @@
|
||||||
|
|
||||||
uniform sampler2D inputTexture;
|
uniform sampler2D texture;
|
||||||
uniform float hueAdjust;
|
uniform mediump float hueAdjust;
|
||||||
|
|
||||||
varying vec2 v_texCoord;
|
varying vec2 v_texCoord;
|
||||||
|
|
||||||
|
/* Source: gamedev.stackexchange.com/a/59808/24839 */
|
||||||
|
vec3 rgb2hsv(vec3 c)
|
||||||
|
{
|
||||||
|
const vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);
|
||||||
|
vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g));
|
||||||
|
vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));
|
||||||
|
|
||||||
|
float d = q.x - min(q.w, q.y);
|
||||||
|
|
||||||
|
/* Avoid divide-by-zero situations by adding a very tiny delta.
|
||||||
|
* Since we always deal with underlying 8-Bit color values, this
|
||||||
|
* should never mask a real value */
|
||||||
|
const float eps = 1.0e-10;
|
||||||
|
|
||||||
|
return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + eps)), d / (q.x + eps), q.x);
|
||||||
|
}
|
||||||
|
|
||||||
|
vec3 hsv2rgb(vec3 c)
|
||||||
|
{
|
||||||
|
const vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);
|
||||||
|
vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);
|
||||||
|
return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);
|
||||||
|
}
|
||||||
|
|
||||||
void main ()
|
void main ()
|
||||||
{
|
{
|
||||||
const vec4 kRGBToYPrime = vec4 (0.299, 0.587, 0.114, 0.0);
|
vec4 color = texture2D (texture, v_texCoord.xy);
|
||||||
const vec4 kRGBToI = vec4 (0.596, -0.275, -0.321, 0.0);
|
vec3 hsv = rgb2hsv(color.rgb);
|
||||||
const vec4 kRGBToQ = vec4 (0.212, -0.523, 0.311, 0.0);
|
|
||||||
|
|
||||||
const vec4 kYIQToR = vec4 (1.0, 0.956, 0.621, 0.0);
|
hsv.x += hueAdjust;
|
||||||
const vec4 kYIQToG = vec4 (1.0, -0.272, -0.647, 0.0);
|
color.rgb = hsv2rgb(hsv);
|
||||||
const vec4 kYIQToB = vec4 (1.0, -1.107, 1.704, 0.0);
|
|
||||||
|
|
||||||
/* Sample the input pixel */
|
gl_FragColor = color;
|
||||||
vec4 color = texture2D (inputTexture, v_texCoord.xy);
|
|
||||||
|
|
||||||
/* Convert to YIQ */
|
|
||||||
float YPrime = dot (color, kRGBToYPrime);
|
|
||||||
float I = dot (color, kRGBToI);
|
|
||||||
float Q = dot (color, kRGBToQ);
|
|
||||||
|
|
||||||
/* Calculate the hue and chroma */
|
|
||||||
float hue = atan (Q, I);
|
|
||||||
float chroma = sqrt (I * I + Q * Q);
|
|
||||||
|
|
||||||
/* Make the user's adjustments */
|
|
||||||
hue += hueAdjust;
|
|
||||||
|
|
||||||
/* Remember old I and color */
|
|
||||||
float IOriginal = I;
|
|
||||||
vec4 coOriginal = color;
|
|
||||||
|
|
||||||
/* Convert back to YIQ */
|
|
||||||
Q = chroma * sin (hue);
|
|
||||||
I = chroma * cos (hue);
|
|
||||||
|
|
||||||
/* Convert back to RGB */
|
|
||||||
vec4 yIQ = vec4 (YPrime, I, Q, 0.0);
|
|
||||||
color.r = dot (yIQ, kYIQToR);
|
|
||||||
color.g = dot (yIQ, kYIQToG);
|
|
||||||
color.b = dot (yIQ, kYIQToB);
|
|
||||||
|
|
||||||
/* Save the result */
|
|
||||||
gl_FragColor = (IOriginal == 0.0) ? coOriginal : color;
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
@ -238,6 +238,6 @@ inline ALenum chooseALFormat(int sampleSize, int channelCount)
|
||||||
|
|
||||||
#define AUDIO_SLEEP 10
|
#define AUDIO_SLEEP 10
|
||||||
#define STREAM_BUF_SIZE 32768
|
#define STREAM_BUF_SIZE 32768
|
||||||
#define GLOBAL_VOLUME 0.8
|
#define GLOBAL_VOLUME 0.8f
|
||||||
|
|
||||||
#endif // ALUTIL_H
|
#endif // ALUTIL_H
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2014 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2014 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2014 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2014 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
@ -42,12 +42,12 @@ ALStream::ALStream(LoopMode loopMode,
|
||||||
source(0),
|
source(0),
|
||||||
thread(0),
|
thread(0),
|
||||||
preemptPause(false),
|
preemptPause(false),
|
||||||
pitch(1.0)
|
pitch(1.0f)
|
||||||
{
|
{
|
||||||
alSrc = AL::Source::gen();
|
alSrc = AL::Source::gen();
|
||||||
|
|
||||||
AL::Source::setVolume(alSrc, 1.0);
|
AL::Source::setVolume(alSrc, 1.0f);
|
||||||
AL::Source::setPitch(alSrc, 1.0);
|
AL::Source::setPitch(alSrc, 1.0f);
|
||||||
AL::Source::detachBuffer(alSrc);
|
AL::Source::detachBuffer(alSrc);
|
||||||
|
|
||||||
for (int i = 0; i < STREAM_BUFS; ++i)
|
for (int i = 0; i < STREAM_BUFS; ++i)
|
||||||
|
@ -172,7 +172,7 @@ void ALStream::setPitch(float value)
|
||||||
/* If the source supports setting pitch natively,
|
/* If the source supports setting pitch natively,
|
||||||
* we don't have to do it via OpenAL */
|
* we don't have to do it via OpenAL */
|
||||||
if (source && source->setPitch(value))
|
if (source && source->setPitch(value))
|
||||||
AL::Source::setPitch(alSrc, 1.0);
|
AL::Source::setPitch(alSrc, 1.0f);
|
||||||
else
|
else
|
||||||
AL::Source::setPitch(alSrc, value);
|
AL::Source::setPitch(alSrc, value);
|
||||||
}
|
}
|
||||||
|
@ -199,23 +199,34 @@ void ALStream::closeSource()
|
||||||
delete source;
|
delete source;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ALStream::openSource(const std::string &filename)
|
struct ALStreamOpenHandler : FileSystem::OpenHandler
|
||||||
{
|
{
|
||||||
char ext[8];
|
SDL_RWops *srcOps;
|
||||||
shState->fileSystem().openRead(srcOps, filename.c_str(), false, ext, sizeof(ext));
|
bool looped;
|
||||||
needsRewind.clear();
|
ALDataSource *source;
|
||||||
|
std::string errorMsg;
|
||||||
|
|
||||||
|
ALStreamOpenHandler(SDL_RWops &srcOps, bool looped)
|
||||||
|
: srcOps(&srcOps), looped(looped), source(0)
|
||||||
|
{}
|
||||||
|
|
||||||
|
bool tryRead(SDL_RWops &ops, const char *ext)
|
||||||
|
{
|
||||||
|
/* Copy this because we need to keep it around,
|
||||||
|
* as we will continue reading data from it later */
|
||||||
|
*srcOps = ops;
|
||||||
|
|
||||||
/* Try to read ogg file signature */
|
/* Try to read ogg file signature */
|
||||||
char sig[5] = { 0 };
|
char sig[5] = { 0 };
|
||||||
SDL_RWread(&srcOps, sig, 1, 4);
|
SDL_RWread(srcOps, sig, 1, 4);
|
||||||
SDL_RWseek(&srcOps, 0, RW_SEEK_SET);
|
SDL_RWseek(srcOps, 0, RW_SEEK_SET);
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (!strcmp(sig, "OggS"))
|
if (!strcmp(sig, "OggS"))
|
||||||
{
|
{
|
||||||
source = createVorbisSource(srcOps, looped);
|
source = createVorbisSource(*srcOps, looped);
|
||||||
return;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!strcmp(sig, "MThd"))
|
if (!strcmp(sig, "MThd"))
|
||||||
|
@ -224,18 +235,37 @@ void ALStream::openSource(const std::string &filename)
|
||||||
|
|
||||||
if (HAVE_FLUID)
|
if (HAVE_FLUID)
|
||||||
{
|
{
|
||||||
source = createMidiSource(srcOps, looped);
|
source = createMidiSource(*srcOps, looped);
|
||||||
return;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
source = createSDLSource(srcOps, ext, STREAM_BUF_SIZE, looped);
|
source = createSDLSource(*srcOps, ext, STREAM_BUF_SIZE, looped);
|
||||||
}
|
}
|
||||||
catch (const Exception &e)
|
catch (const Exception &e)
|
||||||
|
{
|
||||||
|
/* All source constructors will close the passed ops
|
||||||
|
* before throwing errors */
|
||||||
|
errorMsg = e.msg;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
void ALStream::openSource(const std::string &filename)
|
||||||
|
{
|
||||||
|
ALStreamOpenHandler handler(srcOps, looped);
|
||||||
|
shState->fileSystem().openRead(handler, filename.c_str());
|
||||||
|
source = handler.source;
|
||||||
|
needsRewind.clear();
|
||||||
|
|
||||||
|
if (!source)
|
||||||
{
|
{
|
||||||
char buf[512];
|
char buf[512];
|
||||||
snprintf(buf, sizeof(buf), "Unable to decode audio stream: %s.%s: %s",
|
snprintf(buf, sizeof(buf), "Unable to decode audio stream: %s: %s",
|
||||||
filename.c_str(), ext, e.msg.c_str());
|
filename.c_str(), handler.errorMsg.c_str());
|
||||||
|
|
||||||
Debug() << buf;
|
Debug() << buf;
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2014 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2014 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
@ -170,7 +170,7 @@ struct AudioPrivate
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* BGM is stopped. -> MeNotPlaying */
|
/* BGM is stopped. -> MeNotPlaying */
|
||||||
bgm.setVolume(AudioStream::External, 1.0);
|
bgm.setVolume(AudioStream::External, 1.0f);
|
||||||
|
|
||||||
if (!bgm.noResumeStop)
|
if (!bgm.noResumeStop)
|
||||||
bgm.stream.play();
|
bgm.stream.play();
|
||||||
|
@ -193,7 +193,7 @@ struct AudioPrivate
|
||||||
if (bgm.stream.queryState() == ALStream::Stopped)
|
if (bgm.stream.queryState() == ALStream::Stopped)
|
||||||
{
|
{
|
||||||
/* BGM stopped midway fade in. -> MeNotPlaying */
|
/* BGM stopped midway fade in. -> MeNotPlaying */
|
||||||
bgm.setVolume(AudioStream::External, 1.0);
|
bgm.setVolume(AudioStream::External, 1.0f);
|
||||||
meWatch.state = MeNotPlaying;
|
meWatch.state = MeNotPlaying;
|
||||||
bgm.unlockStream();
|
bgm.unlockStream();
|
||||||
|
|
||||||
|
@ -219,7 +219,7 @@ struct AudioPrivate
|
||||||
if (vol >= 1)
|
if (vol >= 1)
|
||||||
{
|
{
|
||||||
/* BGM fully faded in. -> MeNotPlaying */
|
/* BGM fully faded in. -> MeNotPlaying */
|
||||||
vol = 1.0;
|
vol = 1.0f;
|
||||||
meWatch.state = MeNotPlaying;
|
meWatch.state = MeNotPlaying;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2014 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2014 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
@ -34,11 +34,11 @@ AudioStream::AudioStream(ALStream::LoopMode loopMode,
|
||||||
noResumeStop(false),
|
noResumeStop(false),
|
||||||
stream(loopMode, threadId)
|
stream(loopMode, threadId)
|
||||||
{
|
{
|
||||||
current.volume = 1.0;
|
current.volume = 1.0f;
|
||||||
current.pitch = 1.0;
|
current.pitch = 1.0f;
|
||||||
|
|
||||||
for (size_t i = 0; i < VolumeTypeCount; ++i)
|
for (size_t i = 0; i < VolumeTypeCount; ++i)
|
||||||
volumes[i] = 1.0;
|
volumes[i] = 1.0f;
|
||||||
|
|
||||||
fade.thread = 0;
|
fade.thread = 0;
|
||||||
fade.threadName = std::string("audio_fadeout (") + threadId + ")";
|
fade.threadName = std::string("audio_fadeout (") + threadId + ")";
|
||||||
|
@ -82,8 +82,8 @@ void AudioStream::play(const std::string &filename,
|
||||||
|
|
||||||
lockStream();
|
lockStream();
|
||||||
|
|
||||||
float _volume = clamp<int>(volume, 0, 100) / 100.f;
|
float _volume = clamp<int>(volume, 0, 100) / 100.0f;
|
||||||
float _pitch = clamp<int>(pitch, 50, 150) / 100.f;
|
float _pitch = clamp<int>(pitch, 50, 150) / 100.0f;
|
||||||
|
|
||||||
ALStream::State sState = stream.queryState();
|
ALStream::State sState = stream.queryState();
|
||||||
|
|
||||||
|
@ -211,7 +211,7 @@ void AudioStream::fadeOut(int duration)
|
||||||
}
|
}
|
||||||
|
|
||||||
fade.active.set();
|
fade.active.set();
|
||||||
fade.msStep = (1.0) / duration;
|
fade.msStep = 1.0f / duration;
|
||||||
fade.reqFini.clear();
|
fade.reqFini.clear();
|
||||||
fade.reqTerm.clear();
|
fade.reqTerm.clear();
|
||||||
fade.startTicks = SDL_GetTicks();
|
fade.startTicks = SDL_GetTicks();
|
||||||
|
@ -302,7 +302,7 @@ void AudioStream::fadeOutThread()
|
||||||
lockStream();
|
lockStream();
|
||||||
|
|
||||||
uint32_t curDur = SDL_GetTicks() - fade.startTicks;
|
uint32_t curDur = SDL_GetTicks() - fade.startTicks;
|
||||||
float resVol = 1.0 - (curDur*fade.msStep);
|
float resVol = 1.0f - (curDur*fade.msStep);
|
||||||
|
|
||||||
ALStream::State state = stream.queryState();
|
ALStream::State state = stream.queryState();
|
||||||
|
|
||||||
|
@ -313,7 +313,7 @@ void AudioStream::fadeOutThread()
|
||||||
if (state != ALStream::Paused)
|
if (state != ALStream::Paused)
|
||||||
stream.stop();
|
stream.stop();
|
||||||
|
|
||||||
setVolume(FadeOut, 1.0);
|
setVolume(FadeOut, 1.0f);
|
||||||
unlockStream();
|
unlockStream();
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
@ -340,15 +340,15 @@ void AudioStream::fadeInThread()
|
||||||
|
|
||||||
/* Fade in duration is always 1 second */
|
/* Fade in duration is always 1 second */
|
||||||
uint32_t cur = SDL_GetTicks() - fadeIn.startTicks;
|
uint32_t cur = SDL_GetTicks() - fadeIn.startTicks;
|
||||||
float prog = cur / 1000.0;
|
float prog = cur / 1000.0f;
|
||||||
|
|
||||||
ALStream::State state = stream.queryState();
|
ALStream::State state = stream.queryState();
|
||||||
|
|
||||||
if (state != ALStream::Playing
|
if (state != ALStream::Playing
|
||||||
|| prog >= 1.0
|
|| prog >= 1.0f
|
||||||
|| fadeIn.rqFini)
|
|| fadeIn.rqFini)
|
||||||
{
|
{
|
||||||
setVolume(FadeIn, 1.0);
|
setVolume(FadeIn, 1.0f);
|
||||||
unlockStream();
|
unlockStream();
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2014 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2014 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
@ -221,9 +221,9 @@ struct BitmapPrivate
|
||||||
surf = surfConv;
|
surf = surfConv;
|
||||||
}
|
}
|
||||||
|
|
||||||
void onModified()
|
void onModified(bool freeSurface = true)
|
||||||
{
|
{
|
||||||
if (surface)
|
if (surface && freeSurface)
|
||||||
{
|
{
|
||||||
SDL_FreeSurface(surface);
|
SDL_FreeSurface(surface);
|
||||||
surface = 0;
|
surface = 0;
|
||||||
|
@ -233,13 +233,26 @@ struct BitmapPrivate
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct BitmapOpenHandler : FileSystem::OpenHandler
|
||||||
|
{
|
||||||
|
SDL_Surface *surf;
|
||||||
|
|
||||||
|
BitmapOpenHandler()
|
||||||
|
: surf(0)
|
||||||
|
{}
|
||||||
|
|
||||||
|
bool tryRead(SDL_RWops &ops, const char *ext)
|
||||||
|
{
|
||||||
|
surf = IMG_LoadTyped_RW(&ops, 1, ext);
|
||||||
|
return surf != 0;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
Bitmap::Bitmap(const char *filename)
|
Bitmap::Bitmap(const char *filename)
|
||||||
{
|
{
|
||||||
SDL_RWops ops;
|
BitmapOpenHandler handler;
|
||||||
char ext[8];
|
shState->fileSystem().openRead(handler, filename);
|
||||||
|
SDL_Surface *imgSurf = handler.surf;
|
||||||
shState->fileSystem().openRead(ops, filename, false, ext, sizeof(ext));
|
|
||||||
SDL_Surface *imgSurf = IMG_LoadTyped_RW(&ops, 1, ext);
|
|
||||||
|
|
||||||
if (!imgSurf)
|
if (!imgSurf)
|
||||||
throw Exception(Exception::SDLError, "Error loading image '%s': %s",
|
throw Exception(Exception::SDLError, "Error loading image '%s': %s",
|
||||||
|
@ -755,6 +768,14 @@ void Bitmap::clear()
|
||||||
p->onModified();
|
p->onModified();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static uint32_t &getPixelAt(SDL_Surface *surf, SDL_PixelFormat *form, int x, int y)
|
||||||
|
{
|
||||||
|
size_t offset = x*form->BytesPerPixel + y*surf->pitch;
|
||||||
|
uint8_t *bytes = (uint8_t*) surf->pixels + offset;
|
||||||
|
|
||||||
|
return *((uint32_t*) bytes);
|
||||||
|
}
|
||||||
|
|
||||||
Color Bitmap::getPixel(int x, int y) const
|
Color Bitmap::getPixel(int x, int y) const
|
||||||
{
|
{
|
||||||
guardDisposed();
|
guardDisposed();
|
||||||
|
@ -777,9 +798,7 @@ Color Bitmap::getPixel(int x, int y) const
|
||||||
glState.viewport.pop();
|
glState.viewport.pop();
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t offset = x*p->format->BytesPerPixel + y*p->surface->pitch;
|
uint32_t pixel = getPixelAt(p->surface, p->format, x, y);
|
||||||
uint8_t *bytes = (uint8_t*) p->surface->pixels + offset;
|
|
||||||
uint32_t pixel = *((uint32_t*) bytes);
|
|
||||||
|
|
||||||
return Color((pixel >> p->format->Rshift) & 0xFF,
|
return Color((pixel >> p->format->Rshift) & 0xFF,
|
||||||
(pixel >> p->format->Gshift) & 0xFF,
|
(pixel >> p->format->Gshift) & 0xFF,
|
||||||
|
@ -806,7 +825,16 @@ void Bitmap::setPixel(int x, int y, const Color &color)
|
||||||
|
|
||||||
p->addTaintedArea(IntRect(x, y, 1, 1));
|
p->addTaintedArea(IntRect(x, y, 1, 1));
|
||||||
|
|
||||||
p->onModified();
|
/* Setting just a single pixel is no reason to throw away the
|
||||||
|
* whole cached surface; we can just apply the same change */
|
||||||
|
|
||||||
|
if (p->surface)
|
||||||
|
{
|
||||||
|
uint32_t &surfPixel = getPixelAt(p->surface, p->format, x, y);
|
||||||
|
surfPixel = SDL_MapRGBA(p->format, pixel[0], pixel[1], pixel[2], pixel[3]);
|
||||||
|
}
|
||||||
|
|
||||||
|
p->onModified(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Bitmap::hueChange(int hue)
|
void Bitmap::hueChange(int hue)
|
||||||
|
@ -826,13 +854,10 @@ void Bitmap::hueChange(int hue)
|
||||||
quad.setTexPosRect(texRect, texRect);
|
quad.setTexPosRect(texRect, texRect);
|
||||||
quad.setColor(Vec4(1, 1, 1, 1));
|
quad.setColor(Vec4(1, 1, 1, 1));
|
||||||
|
|
||||||
/* Calculate hue parameter */
|
|
||||||
hue = wrapRange(hue, 0, 359);
|
|
||||||
float hueAdj = -((M_PI * 2) / 360) * hue;
|
|
||||||
|
|
||||||
HueShader &shader = shState->shaders().hue;
|
HueShader &shader = shState->shaders().hue;
|
||||||
shader.bind();
|
shader.bind();
|
||||||
shader.setHueAdjust(hueAdj);
|
/* Shader expects normalized value */
|
||||||
|
shader.setHueAdjust(wrapRange(hue, 0, 359) / 360.0f);
|
||||||
|
|
||||||
FBO::bind(newTex.fbo);
|
FBO::bind(newTex.fbo);
|
||||||
p->pushSetViewport(shader);
|
p->pushSetViewport(shader);
|
||||||
|
@ -877,9 +902,9 @@ static void applyShadow(SDL_Surface *&in, const SDL_PixelFormat &fm, const SDL_C
|
||||||
SDL_Surface *out = SDL_CreateRGBSurface
|
SDL_Surface *out = SDL_CreateRGBSurface
|
||||||
(0, in->w+1, in->h+1, fm.BitsPerPixel, fm.Rmask, fm.Gmask, fm.Bmask, fm.Amask);
|
(0, in->w+1, in->h+1, fm.BitsPerPixel, fm.Rmask, fm.Gmask, fm.Bmask, fm.Amask);
|
||||||
|
|
||||||
float fr = c.r / 255.0;
|
float fr = c.r / 255.0f;
|
||||||
float fg = c.g / 255.0;
|
float fg = c.g / 255.0f;
|
||||||
float fb = c.b / 255.0;
|
float fb = c.b / 255.0f;
|
||||||
|
|
||||||
/* We allocate an output surface one pixel wider and higher than the input,
|
/* We allocate an output surface one pixel wider and higher than the input,
|
||||||
* (implicitly) blit a copy of the input with RGB values set to black into
|
* (implicitly) blit a copy of the input with RGB values set to black into
|
||||||
|
@ -933,11 +958,11 @@ static void applyShadow(SDL_Surface *&in, const SDL_PixelFormat &fm, const SDL_C
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
float fSrcA = srcA / 255.0;
|
float fSrcA = srcA / 255.0f;
|
||||||
float fShdA = shdA / 255.0;
|
float fShdA = shdA / 255.0f;
|
||||||
|
|
||||||
/* Because opacity == 1, co1 == fSrcA */
|
/* Because opacity == 1, co1 == fSrcA */
|
||||||
float co2 = fShdA * (1.0 - fSrcA);
|
float co2 = fShdA * (1.0f - fSrcA);
|
||||||
/* Result alpha */
|
/* Result alpha */
|
||||||
float fa = fSrcA + co2;
|
float fa = fSrcA + co2;
|
||||||
/* Temp value to simplify arithmetic below */
|
/* Temp value to simplify arithmetic below */
|
||||||
|
@ -946,10 +971,10 @@ static void applyShadow(SDL_Surface *&in, const SDL_PixelFormat &fm, const SDL_C
|
||||||
/* Result colors */
|
/* Result colors */
|
||||||
uint8_t r, g, b, a;
|
uint8_t r, g, b, a;
|
||||||
|
|
||||||
r = clamp<float>(fr * co3, 0, 1) * 255;
|
r = clamp<float>(fr * co3, 0, 1) * 255.0f;
|
||||||
g = clamp<float>(fg * co3, 0, 1) * 255;
|
g = clamp<float>(fg * co3, 0, 1) * 255.0f;
|
||||||
b = clamp<float>(fb * co3, 0, 1) * 255;
|
b = clamp<float>(fb * co3, 0, 1) * 255.0f;
|
||||||
a = clamp<float>(fa, 0, 1) * 255;
|
a = clamp<float>(fa, 0, 1) * 255.0f;
|
||||||
|
|
||||||
*outP = SDL_MapRGBA(&fm, r, g, b, a);
|
*outP = SDL_MapRGBA(&fm, r, g, b, a);
|
||||||
}
|
}
|
||||||
|
@ -1054,11 +1079,11 @@ void Bitmap::drawText(const IntRect &rect, const char *str, int align)
|
||||||
Vec2i gpTexSize;
|
Vec2i gpTexSize;
|
||||||
shState->ensureTexSize(txtSurf->w, txtSurf->h, gpTexSize);
|
shState->ensureTexSize(txtSurf->w, txtSurf->h, gpTexSize);
|
||||||
|
|
||||||
bool fastBlit = !p->touchesTaintedArea(posRect) && txtAlpha == 1.0;
|
bool fastBlit = !p->touchesTaintedArea(posRect) && txtAlpha == 1.0f;
|
||||||
|
|
||||||
if (fastBlit)
|
if (fastBlit)
|
||||||
{
|
{
|
||||||
if (squeeze == 1.0 && !shState->config().subImageFix)
|
if (squeeze == 1.0f && !shState->config().subImageFix)
|
||||||
{
|
{
|
||||||
/* Even faster: upload directly to bitmap texture.
|
/* Even faster: upload directly to bitmap texture.
|
||||||
* We have to make sure the posRect lies within the texture
|
* We have to make sure the posRect lies within the texture
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
@ -33,6 +33,7 @@
|
||||||
#include "debugwriter.h"
|
#include "debugwriter.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
#include "sdl-util.h"
|
#include "sdl-util.h"
|
||||||
|
#include "iniconfig.h"
|
||||||
|
|
||||||
#ifdef INI_ENCODING
|
#ifdef INI_ENCODING
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
@ -134,6 +135,12 @@ static std::string prefPath(const char *org, const char *app)
|
||||||
return str;
|
return str;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
std::set<T> setFromVec(const std::vector<T> &vec)
|
||||||
|
{
|
||||||
|
return std::set<T>(vec.begin(), vec.end());
|
||||||
|
}
|
||||||
|
|
||||||
typedef std::vector<std::string> StringVec;
|
typedef std::vector<std::string> StringVec;
|
||||||
namespace po = boost::program_options;
|
namespace po = boost::program_options;
|
||||||
|
|
||||||
|
@ -151,15 +158,18 @@ void Config::read(int argc, char *argv[])
|
||||||
PO_DESC(winResizable, bool, false) \
|
PO_DESC(winResizable, bool, false) \
|
||||||
PO_DESC(fullscreen, bool, false) \
|
PO_DESC(fullscreen, bool, false) \
|
||||||
PO_DESC(fixedAspectRatio, bool, true) \
|
PO_DESC(fixedAspectRatio, bool, true) \
|
||||||
PO_DESC(smoothScaling, bool, false) \
|
PO_DESC(smoothScaling, bool, true) \
|
||||||
PO_DESC(vsync, bool, false) \
|
PO_DESC(vsync, bool, false) \
|
||||||
PO_DESC(defScreenW, int, 0) \
|
PO_DESC(defScreenW, int, 0) \
|
||||||
PO_DESC(defScreenH, int, 0) \
|
PO_DESC(defScreenH, int, 0) \
|
||||||
|
PO_DESC(windowTitle, std::string, "") \
|
||||||
PO_DESC(fixedFramerate, int, 0) \
|
PO_DESC(fixedFramerate, int, 0) \
|
||||||
PO_DESC(frameSkip, bool, true) \
|
PO_DESC(frameSkip, bool, true) \
|
||||||
PO_DESC(syncToRefreshrate, bool, false) \
|
PO_DESC(syncToRefreshrate, bool, false) \
|
||||||
PO_DESC(solidFonts, bool, false) \
|
PO_DESC(solidFonts, bool, false) \
|
||||||
PO_DESC(subImageFix, bool, false) \
|
PO_DESC(subImageFix, bool, false) \
|
||||||
|
PO_DESC(enableBlitting, bool, true) \
|
||||||
|
PO_DESC(maxTextureSize, int, 0) \
|
||||||
PO_DESC(gameFolder, std::string, ".") \
|
PO_DESC(gameFolder, std::string, ".") \
|
||||||
PO_DESC(anyAltToggleFS, bool, false) \
|
PO_DESC(anyAltToggleFS, bool, false) \
|
||||||
PO_DESC(enableReset, bool, true) \
|
PO_DESC(enableReset, bool, true) \
|
||||||
|
@ -180,6 +190,27 @@ void Config::read(int argc, char *argv[])
|
||||||
// Not gonna take your shit boost
|
// Not gonna take your shit boost
|
||||||
#define GUARD_ALL( exp ) try { exp } catch(...) {}
|
#define GUARD_ALL( exp ) try { exp } catch(...) {}
|
||||||
|
|
||||||
|
editor.debug = false;
|
||||||
|
editor.battleTest = false;
|
||||||
|
|
||||||
|
/* Read arguments sent from the editor */
|
||||||
|
if (argc > 1)
|
||||||
|
{
|
||||||
|
std::string argv1 = argv[1];
|
||||||
|
/* RGSS1 uses "debug", 2 and 3 use "test" */
|
||||||
|
if (argv1 == "debug" || argv1 == "test")
|
||||||
|
editor.debug = true;
|
||||||
|
else if (argv1 == "btest")
|
||||||
|
editor.battleTest = true;
|
||||||
|
|
||||||
|
/* Fix offset */
|
||||||
|
if (editor.debug || editor.battleTest)
|
||||||
|
{
|
||||||
|
argc--;
|
||||||
|
argv++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#define PO_DESC(key, type, def) (#key, po::value< type >()->default_value(def))
|
#define PO_DESC(key, type, def) (#key, po::value< type >()->default_value(def))
|
||||||
|
|
||||||
po::options_description podesc;
|
po::options_description podesc;
|
||||||
|
@ -226,7 +257,7 @@ void Config::read(int argc, char *argv[])
|
||||||
|
|
||||||
PO_DESC_ALL;
|
PO_DESC_ALL;
|
||||||
|
|
||||||
GUARD_ALL( preloadScripts = vm["preloadScript"].as<StringVec>(); );
|
GUARD_ALL( preloadScripts = setFromVec(vm["preloadScript"].as<StringVec>()); );
|
||||||
|
|
||||||
GUARD_ALL( rtps = vm["RTP"].as<StringVec>(); );
|
GUARD_ALL( rtps = vm["RTP"].as<StringVec>(); );
|
||||||
|
|
||||||
|
@ -280,26 +311,32 @@ void Config::readGameINI()
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
po::options_description podesc;
|
|
||||||
podesc.add_options()
|
|
||||||
("Game.Title", po::value<std::string>())
|
|
||||||
("Game.Scripts", po::value<std::string>())
|
|
||||||
;
|
|
||||||
|
|
||||||
po::variables_map vm;
|
|
||||||
std::string iniFilename = execName + ".ini";
|
std::string iniFilename = execName + ".ini";
|
||||||
SDLRWStream iniFile(iniFilename.c_str(), "r");
|
SDLRWStream iniFile(iniFilename.c_str(), "r");
|
||||||
|
|
||||||
if (iniFile)
|
if (iniFile)
|
||||||
{
|
{
|
||||||
try
|
INIConfiguration ic;
|
||||||
|
if(ic.load(iniFile.stream()))
|
||||||
{
|
{
|
||||||
po::store(po::parse_config_file(iniFile.stream(), podesc, true), vm);
|
GUARD_ALL( game.title = ic.getStringProperty("Game", "Title"); );
|
||||||
po::notify(vm);
|
GUARD_ALL( game.scripts = ic.getStringProperty("Game", "Scripts"); );
|
||||||
|
|
||||||
|
strReplace(game.scripts, '\\', '/');
|
||||||
|
|
||||||
|
if (game.title.empty())
|
||||||
|
{
|
||||||
|
Debug() << iniFilename + ": Could not find Game.Title property";
|
||||||
}
|
}
|
||||||
catch (po::error &error)
|
|
||||||
|
if (game.scripts.empty())
|
||||||
{
|
{
|
||||||
Debug() << iniFilename + ":" << error.what();
|
Debug() << iniFilename + ": Could not find Game.Scripts property";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Debug() << iniFilename + ": Failed to parse ini file";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -307,11 +344,6 @@ void Config::readGameINI()
|
||||||
Debug() << "FAILED to open" << iniFilename;
|
Debug() << "FAILED to open" << iniFilename;
|
||||||
}
|
}
|
||||||
|
|
||||||
GUARD_ALL( game.title = vm["Game.Title"].as<std::string>(); );
|
|
||||||
GUARD_ALL( game.scripts = vm["Game.Scripts"].as<std::string>(); );
|
|
||||||
|
|
||||||
strReplace(game.scripts, '\\', '/');
|
|
||||||
|
|
||||||
#ifdef INI_ENCODING
|
#ifdef INI_ENCODING
|
||||||
/* Can add more later */
|
/* Can add more later */
|
||||||
const char *languages[] =
|
const char *languages[] =
|
||||||
|
|
57
src/config.h
57
src/config.h
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
@ -24,49 +24,7 @@
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
#include <set>
|
||||||
struct TouchOverlay
|
|
||||||
{
|
|
||||||
std::string image;
|
|
||||||
|
|
||||||
struct Button
|
|
||||||
{
|
|
||||||
enum Shape
|
|
||||||
{
|
|
||||||
Rectangle,
|
|
||||||
Circle,
|
|
||||||
Triangle
|
|
||||||
};
|
|
||||||
|
|
||||||
std::string id;
|
|
||||||
std::string target;
|
|
||||||
Shape shape;
|
|
||||||
|
|
||||||
int x;
|
|
||||||
int y;
|
|
||||||
|
|
||||||
union
|
|
||||||
{
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
int width;
|
|
||||||
int height;
|
|
||||||
} r;
|
|
||||||
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
int radius;
|
|
||||||
} c;
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
int x1, y1;
|
|
||||||
int x2, y2;
|
|
||||||
} t;
|
|
||||||
} u;
|
|
||||||
};
|
|
||||||
|
|
||||||
std::vector<Button> buttons;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct Config
|
struct Config
|
||||||
{
|
{
|
||||||
|
@ -83,6 +41,7 @@ struct Config
|
||||||
|
|
||||||
int defScreenW;
|
int defScreenW;
|
||||||
int defScreenH;
|
int defScreenH;
|
||||||
|
std::string windowTitle;
|
||||||
|
|
||||||
int fixedFramerate;
|
int fixedFramerate;
|
||||||
bool frameSkip;
|
bool frameSkip;
|
||||||
|
@ -91,6 +50,8 @@ struct Config
|
||||||
bool solidFonts;
|
bool solidFonts;
|
||||||
|
|
||||||
bool subImageFix;
|
bool subImageFix;
|
||||||
|
bool enableBlitting;
|
||||||
|
int maxTextureSize;
|
||||||
|
|
||||||
std::string gameFolder;
|
std::string gameFolder;
|
||||||
bool anyAltToggleFS;
|
bool anyAltToggleFS;
|
||||||
|
@ -120,13 +81,19 @@ struct Config
|
||||||
bool useScriptNames;
|
bool useScriptNames;
|
||||||
|
|
||||||
std::string customScript;
|
std::string customScript;
|
||||||
std::vector<std::string> preloadScripts;
|
std::set<std::string> preloadScripts;
|
||||||
std::vector<std::string> rtps;
|
std::vector<std::string> rtps;
|
||||||
|
|
||||||
std::vector<std::string> fontSubs;
|
std::vector<std::string> fontSubs;
|
||||||
|
|
||||||
std::vector<std::string> rubyLoadpaths;
|
std::vector<std::string> rubyLoadpaths;
|
||||||
|
|
||||||
|
/* Editor flags */
|
||||||
|
struct {
|
||||||
|
bool debug;
|
||||||
|
bool battleTest;
|
||||||
|
} editor;
|
||||||
|
|
||||||
/* Game INI contents */
|
/* Game INI contents */
|
||||||
struct {
|
struct {
|
||||||
std::string scripts;
|
std::string scripts;
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
@ -61,9 +61,9 @@ struct Vec4
|
||||||
return (x == other.x && y == other.y && z == other.z && w == other.w);
|
return (x == other.x && y == other.y && z == other.z && w == other.w);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool xyzHasEffect() const
|
bool xyzNotNull() const
|
||||||
{
|
{
|
||||||
return (x != 0.0 || y != 0.0 || z != 0.0);
|
return (x != 0.0f || y != 0.0f || z != 0.0f);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -88,6 +88,11 @@ struct Vec2i
|
||||||
return x == other.x && y == other.y;
|
return x == other.x && y == other.y;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool operator!=(const Vec2i &other) const
|
||||||
|
{
|
||||||
|
return !(*this == other);
|
||||||
|
}
|
||||||
|
|
||||||
Vec2i &operator+=(const Vec2i &value)
|
Vec2i &operator+=(const Vec2i &value)
|
||||||
{
|
{
|
||||||
x += value.x;
|
x += value.x;
|
||||||
|
@ -131,6 +136,11 @@ struct Vec2i
|
||||||
return Vec2i(x % value, y % value);
|
return Vec2i(x % value, y % value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Vec2i operator&(unsigned value) const
|
||||||
|
{
|
||||||
|
return Vec2i(x & value, y & value);
|
||||||
|
}
|
||||||
|
|
||||||
Vec2i operator-() const
|
Vec2i operator-() const
|
||||||
{
|
{
|
||||||
return Vec2i(-x, -y);
|
return Vec2i(-x, -y);
|
||||||
|
@ -176,6 +186,11 @@ struct IntRect : SDL_Rect
|
||||||
w == other.w && h == other.h);
|
w == other.w && h == other.h);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool operator!=(const IntRect &other) const
|
||||||
|
{
|
||||||
|
return !(*this == other);
|
||||||
|
}
|
||||||
|
|
||||||
Vec2i pos() const
|
Vec2i pos() const
|
||||||
{
|
{
|
||||||
return Vec2i(x, y);
|
return Vec2i(x, y);
|
||||||
|
@ -259,13 +274,13 @@ struct NormValue
|
||||||
|
|
||||||
NormValue(int unNorm)
|
NormValue(int unNorm)
|
||||||
: unNorm(unNorm),
|
: unNorm(unNorm),
|
||||||
norm(unNorm / 255.0)
|
norm(unNorm / 255.0f)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
void operator =(int value)
|
void operator =(int value)
|
||||||
{
|
{
|
||||||
unNorm = clamp(value, 0, 255);
|
unNorm = clamp(value, 0, 255);
|
||||||
norm = unNorm / 255.0;
|
norm = unNorm / 255.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool operator ==(int value) const
|
bool operator ==(int value) const
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
@ -27,9 +27,9 @@
|
||||||
#include <SDL_timer.h>
|
#include <SDL_timer.h>
|
||||||
#include <SDL_thread.h>
|
#include <SDL_thread.h>
|
||||||
#include <SDL_touch.h>
|
#include <SDL_touch.h>
|
||||||
|
#include <SDL_rect.h>
|
||||||
|
|
||||||
#include <al.h>
|
#include <al.h>
|
||||||
#include <alc.h>
|
|
||||||
#include <alext.h>
|
#include <alext.h>
|
||||||
|
|
||||||
#include "sharedstate.h"
|
#include "sharedstate.h"
|
||||||
|
@ -83,6 +83,7 @@ enum
|
||||||
REQUEST_SETCURSORVISIBLE,
|
REQUEST_SETCURSORVISIBLE,
|
||||||
|
|
||||||
UPDATE_FPS,
|
UPDATE_FPS,
|
||||||
|
UPDATE_SCREEN_RECT,
|
||||||
|
|
||||||
EVENT_COUNT
|
EVENT_COUNT
|
||||||
};
|
};
|
||||||
|
@ -111,7 +112,11 @@ void EventThread::process(RGSSThreadData &rtData)
|
||||||
UnidirMessage<Vec2i> &windowSizeMsg = rtData.windowSizeMsg;
|
UnidirMessage<Vec2i> &windowSizeMsg = rtData.windowSizeMsg;
|
||||||
|
|
||||||
initALCFunctions(rtData.alcDev);
|
initALCFunctions(rtData.alcDev);
|
||||||
|
|
||||||
|
// XXX this function breaks input focus on OSX
|
||||||
|
#ifndef __MACOSX__
|
||||||
SDL_SetEventFilter(eventFilter, &rtData);
|
SDL_SetEventFilter(eventFilter, &rtData);
|
||||||
|
#endif
|
||||||
|
|
||||||
fullscreen = rtData.config.fullscreen;
|
fullscreen = rtData.config.fullscreen;
|
||||||
int toggleFSMod = rtData.config.anyAltToggleFS ? KMOD_ALT : KMOD_LALT;
|
int toggleFSMod = rtData.config.anyAltToggleFS ? KMOD_ALT : KMOD_LALT;
|
||||||
|
@ -127,7 +132,11 @@ void EventThread::process(RGSSThreadData &rtData)
|
||||||
bool displayingFPS = false;
|
bool displayingFPS = false;
|
||||||
|
|
||||||
bool cursorInWindow = false;
|
bool cursorInWindow = false;
|
||||||
bool windowFocused = false;
|
/* Will be updated eventually */
|
||||||
|
SDL_Rect gameScreen = { 0, 0, 0, 0 };
|
||||||
|
|
||||||
|
/* SDL doesn't send an initial FOCUS_GAINED event */
|
||||||
|
bool windowFocused = true;
|
||||||
|
|
||||||
bool terminate = false;
|
bool terminate = false;
|
||||||
|
|
||||||
|
@ -164,7 +173,7 @@ void EventThread::process(RGSSThreadData &rtData)
|
||||||
delete sMenu;
|
delete sMenu;
|
||||||
sMenu = 0;
|
sMenu = 0;
|
||||||
|
|
||||||
updateCursorState(cursorInWindow && windowFocused);
|
updateCursorState(cursorInWindow && windowFocused, gameScreen);
|
||||||
}
|
}
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
|
@ -205,14 +214,14 @@ void EventThread::process(RGSSThreadData &rtData)
|
||||||
case SDL_WINDOWEVENT_ENTER :
|
case SDL_WINDOWEVENT_ENTER :
|
||||||
cursorInWindow = true;
|
cursorInWindow = true;
|
||||||
mouseState.inWindow = true;
|
mouseState.inWindow = true;
|
||||||
updateCursorState(cursorInWindow && windowFocused && !sMenu);
|
updateCursorState(cursorInWindow && windowFocused && !sMenu, gameScreen);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SDL_WINDOWEVENT_LEAVE :
|
case SDL_WINDOWEVENT_LEAVE :
|
||||||
cursorInWindow = false;
|
cursorInWindow = false;
|
||||||
mouseState.inWindow = false;
|
mouseState.inWindow = false;
|
||||||
updateCursorState(cursorInWindow && windowFocused && !sMenu);
|
updateCursorState(cursorInWindow && windowFocused && !sMenu, gameScreen);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -223,13 +232,13 @@ void EventThread::process(RGSSThreadData &rtData)
|
||||||
|
|
||||||
case SDL_WINDOWEVENT_FOCUS_GAINED :
|
case SDL_WINDOWEVENT_FOCUS_GAINED :
|
||||||
windowFocused = true;
|
windowFocused = true;
|
||||||
updateCursorState(cursorInWindow && windowFocused && !sMenu);
|
updateCursorState(cursorInWindow && windowFocused && !sMenu, gameScreen);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SDL_WINDOWEVENT_FOCUS_LOST :
|
case SDL_WINDOWEVENT_FOCUS_LOST :
|
||||||
windowFocused = false;
|
windowFocused = false;
|
||||||
updateCursorState(cursorInWindow && windowFocused && !sMenu);
|
updateCursorState(cursorInWindow && windowFocused && !sMenu, gameScreen);
|
||||||
resetInputStates();
|
resetInputStates();
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
@ -262,7 +271,7 @@ void EventThread::process(RGSSThreadData &rtData)
|
||||||
if (!sMenu)
|
if (!sMenu)
|
||||||
{
|
{
|
||||||
sMenu = new SettingsMenu(rtData);
|
sMenu = new SettingsMenu(rtData);
|
||||||
updateCursorState(false);
|
updateCursorState(false, gameScreen);
|
||||||
}
|
}
|
||||||
|
|
||||||
sMenu->raise();
|
sMenu->raise();
|
||||||
|
@ -286,14 +295,14 @@ void EventThread::process(RGSSThreadData &rtData)
|
||||||
if (fullscreen)
|
if (fullscreen)
|
||||||
{
|
{
|
||||||
/* Prevent fullscreen flicker */
|
/* Prevent fullscreen flicker */
|
||||||
strncpy(pendingTitle, rtData.config.game.title.c_str(),
|
strncpy(pendingTitle, rtData.config.windowTitle.c_str(),
|
||||||
sizeof(pendingTitle));
|
sizeof(pendingTitle));
|
||||||
havePendingTitle = true;
|
havePendingTitle = true;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
SDL_SetWindowTitle(win, rtData.config.game.title.c_str());
|
SDL_SetWindowTitle(win, rtData.config.windowTitle.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
@ -368,6 +377,7 @@ void EventThread::process(RGSSThreadData &rtData)
|
||||||
case SDL_MOUSEMOTION :
|
case SDL_MOUSEMOTION :
|
||||||
mouseState.x = event.motion.x;
|
mouseState.x = event.motion.x;
|
||||||
mouseState.y = event.motion.y;
|
mouseState.y = event.motion.y;
|
||||||
|
updateCursorState(cursorInWindow, gameScreen);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SDL_FINGERDOWN :
|
case SDL_FINGERDOWN :
|
||||||
|
@ -399,7 +409,7 @@ void EventThread::process(RGSSThreadData &rtData)
|
||||||
|
|
||||||
case REQUEST_MESSAGEBOX :
|
case REQUEST_MESSAGEBOX :
|
||||||
SDL_ShowSimpleMessageBox(event.user.code,
|
SDL_ShowSimpleMessageBox(event.user.code,
|
||||||
rtData.config.game.title.c_str(),
|
rtData.config.windowTitle.c_str(),
|
||||||
(const char*) event.user.data1, win);
|
(const char*) event.user.data1, win);
|
||||||
free(event.user.data1);
|
free(event.user.data1);
|
||||||
msgBoxDone.set();
|
msgBoxDone.set();
|
||||||
|
@ -407,7 +417,7 @@ void EventThread::process(RGSSThreadData &rtData)
|
||||||
|
|
||||||
case REQUEST_SETCURSORVISIBLE :
|
case REQUEST_SETCURSORVISIBLE :
|
||||||
showCursor = event.user.code;
|
showCursor = event.user.code;
|
||||||
updateCursorState(cursorInWindow);
|
updateCursorState(cursorInWindow, gameScreen);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case UPDATE_FPS :
|
case UPDATE_FPS :
|
||||||
|
@ -418,7 +428,7 @@ void EventThread::process(RGSSThreadData &rtData)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
snprintf(buffer, sizeof(buffer), "%s - %d FPS",
|
snprintf(buffer, sizeof(buffer), "%s - %d FPS",
|
||||||
rtData.config.game.title.c_str(), event.user.code);
|
rtData.config.windowTitle.c_str(), event.user.code);
|
||||||
|
|
||||||
/* Updating the window title in fullscreen
|
/* Updating the window title in fullscreen
|
||||||
* mode seems to cause flickering */
|
* mode seems to cause flickering */
|
||||||
|
@ -432,6 +442,15 @@ void EventThread::process(RGSSThreadData &rtData)
|
||||||
|
|
||||||
SDL_SetWindowTitle(win, buffer);
|
SDL_SetWindowTitle(win, buffer);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case UPDATE_SCREEN_RECT :
|
||||||
|
gameScreen.x = event.user.windowID;
|
||||||
|
gameScreen.y = event.user.code;
|
||||||
|
gameScreen.w = reinterpret_cast<intptr_t>(event.user.data1);
|
||||||
|
gameScreen.h = reinterpret_cast<intptr_t>(event.user.data2);
|
||||||
|
updateCursorState(cursorInWindow, gameScreen);
|
||||||
|
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -490,13 +509,13 @@ int EventThread::eventFilter(void *data, SDL_Event *event)
|
||||||
Debug() << "SDL_APP_LOWMEMORY";
|
Debug() << "SDL_APP_LOWMEMORY";
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
case SDL_RENDER_TARGETS_RESET :
|
// case SDL_RENDER_TARGETS_RESET :
|
||||||
Debug() << "****** SDL_RENDER_TARGETS_RESET";
|
// Debug() << "****** SDL_RENDER_TARGETS_RESET";
|
||||||
return 0;
|
// return 0;
|
||||||
|
|
||||||
case SDL_RENDER_DEVICE_RESET :
|
// case SDL_RENDER_DEVICE_RESET :
|
||||||
Debug() << "****** SDL_RENDER_DEVICE_RESET";
|
// Debug() << "****** SDL_RENDER_DEVICE_RESET";
|
||||||
return 0;
|
// return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -526,9 +545,13 @@ void EventThread::setFullscreen(SDL_Window *win, bool mode)
|
||||||
fullscreen = mode;
|
fullscreen = mode;
|
||||||
}
|
}
|
||||||
|
|
||||||
void EventThread::updateCursorState(bool inWindow)
|
void EventThread::updateCursorState(bool inWindow,
|
||||||
|
const SDL_Rect &screen)
|
||||||
{
|
{
|
||||||
if (inWindow)
|
SDL_Point pos = { mouseState.x, mouseState.y };
|
||||||
|
bool inScreen = inWindow && SDL_PointInRect(&pos, &screen);
|
||||||
|
|
||||||
|
if (inScreen)
|
||||||
SDL_ShowCursor(showCursor ? SDL_TRUE : SDL_FALSE);
|
SDL_ShowCursor(showCursor ? SDL_TRUE : SDL_FALSE);
|
||||||
else
|
else
|
||||||
SDL_ShowCursor(SDL_TRUE);
|
SDL_ShowCursor(SDL_TRUE);
|
||||||
|
@ -634,6 +657,19 @@ void EventThread::notifyFrame()
|
||||||
SDL_PushEvent(&event);
|
SDL_PushEvent(&event);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void EventThread::notifyGameScreenChange(const SDL_Rect &screen)
|
||||||
|
{
|
||||||
|
/* We have to get a bit hacky here to fit the rectangle
|
||||||
|
* data into the user event struct */
|
||||||
|
SDL_Event event;
|
||||||
|
event.type = usrIdStart + UPDATE_SCREEN_RECT;
|
||||||
|
event.user.windowID = screen.x;
|
||||||
|
event.user.code = screen.y;
|
||||||
|
event.user.data1 = reinterpret_cast<void*>(screen.w);
|
||||||
|
event.user.data2 = reinterpret_cast<void*>(screen.h);
|
||||||
|
SDL_PushEvent(&event);
|
||||||
|
}
|
||||||
|
|
||||||
void SyncPoint::haltThreads()
|
void SyncPoint::haltThreads()
|
||||||
{
|
{
|
||||||
if (mainSync.locked)
|
if (mainSync.locked)
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
@ -36,8 +36,9 @@
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include <alc.h>
|
||||||
|
|
||||||
struct RGSSThreadData;
|
struct RGSSThreadData;
|
||||||
typedef struct ALCdevice_struct ALCdevice;
|
|
||||||
struct SDL_Window;
|
struct SDL_Window;
|
||||||
union SDL_Event;
|
union SDL_Event;
|
||||||
|
|
||||||
|
@ -98,12 +99,16 @@ public:
|
||||||
/* RGSS thread calls this once per frame */
|
/* RGSS thread calls this once per frame */
|
||||||
void notifyFrame();
|
void notifyFrame();
|
||||||
|
|
||||||
|
/* Called on game screen (size / offset) changes */
|
||||||
|
void notifyGameScreenChange(const SDL_Rect &screen);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static int eventFilter(void *, SDL_Event*);
|
static int eventFilter(void *, SDL_Event*);
|
||||||
|
|
||||||
void resetInputStates();
|
void resetInputStates();
|
||||||
void setFullscreen(SDL_Window *, bool mode);
|
void setFullscreen(SDL_Window *, bool mode);
|
||||||
void updateCursorState(bool inWindow);
|
void updateCursorState(bool inWindow,
|
||||||
|
const SDL_Rect &screen);
|
||||||
|
|
||||||
bool fullscreen;
|
bool fullscreen;
|
||||||
bool showCursor;
|
bool showCursor;
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
@ -37,6 +37,7 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
#include <stack>
|
||||||
|
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
#include <iconv.h>
|
#include <iconv.h>
|
||||||
|
@ -249,22 +250,12 @@ strcpySafe(char *dst, const char *src,
|
||||||
return cpyMax;
|
return cpyMax;
|
||||||
}
|
}
|
||||||
|
|
||||||
const Uint32 SDL_RWOPS_PHYSFS = SDL_RWOPS_UNKNOWN+10;
|
/* Attempt to locate an extension string in a filename.
|
||||||
|
|
||||||
struct FileSystemPrivate
|
|
||||||
{
|
|
||||||
/* Maps: lower case filepath without extension,
|
|
||||||
* To: mixed case full filepath
|
|
||||||
* This is for compatibility with games that take Windows'
|
|
||||||
* case insensitivity for granted */
|
|
||||||
BoostHash<std::string, std::string> pathCache;
|
|
||||||
bool havePathCache;
|
|
||||||
|
|
||||||
/* Attempt to locate an extension string in a filename.
|
|
||||||
* Either a pointer into the input string pointing at the
|
* Either a pointer into the input string pointing at the
|
||||||
* extension, or null is returned */
|
* extension, or null is returned */
|
||||||
const char *findExt(const char *filename)
|
static const char *
|
||||||
{
|
findExt(const char *filename)
|
||||||
|
{
|
||||||
size_t len;
|
size_t len;
|
||||||
|
|
||||||
for (len = strlen(filename); len > 0; --len)
|
for (len = strlen(filename); len > 0; --len)
|
||||||
|
@ -277,160 +268,13 @@ struct FileSystemPrivate
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct CompleteFilenameData
|
static void
|
||||||
{
|
initReadOps(PHYSFS_File *handle,
|
||||||
bool found;
|
|
||||||
/* Contains the incomplete filename we're looking for;
|
|
||||||
* when found, we write the complete filename into this
|
|
||||||
* same buffer */
|
|
||||||
char *outBuf;
|
|
||||||
/* Length of incomplete file name */
|
|
||||||
size_t filenameLen;
|
|
||||||
/* Maximum we can write into outBuf */
|
|
||||||
size_t outBufN;
|
|
||||||
};
|
|
||||||
|
|
||||||
static void completeFilenameRegCB(void *data, const char *,
|
|
||||||
const char *fname)
|
|
||||||
{
|
|
||||||
CompleteFilenameData &d = *static_cast<CompleteFilenameData*>(data);
|
|
||||||
|
|
||||||
if (d.found)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (strncmp(d.outBuf, fname, d.filenameLen) != 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* If fname matches up to a following '.' (meaning the rest is part
|
|
||||||
* of the extension), or up to a following '\0' (full match), we've
|
|
||||||
* found our file */
|
|
||||||
switch (fname[d.filenameLen])
|
|
||||||
{
|
|
||||||
case '.' :
|
|
||||||
/* Overwrite the incomplete file name we looked for with
|
|
||||||
* the full version containing any extensions */
|
|
||||||
strcpySafe(d.outBuf, fname, d.outBufN, -1);
|
|
||||||
case '\0' :
|
|
||||||
d.found = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool completeFilenameReg(const char *filepath,
|
|
||||||
char *outBuffer,
|
|
||||||
size_t outN)
|
|
||||||
{
|
|
||||||
strcpySafe(outBuffer, filepath, outN, -1);
|
|
||||||
|
|
||||||
size_t len = strlen(outBuffer);
|
|
||||||
char *delim;
|
|
||||||
|
|
||||||
/* Find the deliminator separating directory and file name */
|
|
||||||
for (delim = outBuffer + len; delim > outBuffer; --delim)
|
|
||||||
if (*delim == '/')
|
|
||||||
break;
|
|
||||||
|
|
||||||
bool root = (delim == outBuffer);
|
|
||||||
CompleteFilenameData d;
|
|
||||||
|
|
||||||
if (!root)
|
|
||||||
{
|
|
||||||
/* If we have such a deliminator, we set it to '\0' so we
|
|
||||||
* can pass the first half to PhysFS as the directory name,
|
|
||||||
* and compare all filenames against the second half */
|
|
||||||
d.outBuf = delim+1;
|
|
||||||
d.filenameLen = len - (delim - outBuffer + 1);
|
|
||||||
|
|
||||||
*delim = '\0';
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* Otherwise the file is in the root directory */
|
|
||||||
d.outBuf = outBuffer;
|
|
||||||
d.filenameLen = len - (delim - outBuffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
d.found = false;
|
|
||||||
d.outBufN = outN - (d.outBuf - outBuffer);
|
|
||||||
|
|
||||||
PHYSFS_enumerateFilesCallback(root ? "" : outBuffer, completeFilenameRegCB, &d);
|
|
||||||
|
|
||||||
if (!d.found)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
/* Now we put the deliminator back in to form the completed
|
|
||||||
* file path (if required) */
|
|
||||||
if (delim != outBuffer)
|
|
||||||
*delim = '/';
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool completeFilenamePC(const char *filepath,
|
|
||||||
char *outBuffer,
|
|
||||||
size_t outN)
|
|
||||||
{
|
|
||||||
std::string lowCase(filepath);
|
|
||||||
|
|
||||||
for (size_t i = 0; i < lowCase.size(); ++i)
|
|
||||||
lowCase[i] = tolower(lowCase[i]);
|
|
||||||
|
|
||||||
if (!pathCache.contains(lowCase))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
const std::string &fullPath = pathCache[lowCase];
|
|
||||||
strcpySafe(outBuffer, fullPath.c_str(), outN, fullPath.size());
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool completeFilename(const char *filepath,
|
|
||||||
char *outBuffer,
|
|
||||||
size_t outN)
|
|
||||||
{
|
|
||||||
if (havePathCache)
|
|
||||||
return completeFilenamePC(filepath, outBuffer, outN);
|
|
||||||
else
|
|
||||||
return completeFilenameReg(filepath, outBuffer, outN);
|
|
||||||
}
|
|
||||||
|
|
||||||
PHYSFS_File *openReadHandle(const char *filename,
|
|
||||||
char *extBuf,
|
|
||||||
size_t extBufN)
|
|
||||||
{
|
|
||||||
char found[512];
|
|
||||||
|
|
||||||
if (!completeFilename(filename, found, sizeof(found)))
|
|
||||||
throw Exception(Exception::NoFileError, "%s", filename);
|
|
||||||
|
|
||||||
PHYSFS_File *handle = PHYSFS_openRead(found);
|
|
||||||
|
|
||||||
if (!handle)
|
|
||||||
throw Exception(Exception::PHYSFSError, "PhysFS: %s", PHYSFS_getLastError());
|
|
||||||
|
|
||||||
if (!extBuf)
|
|
||||||
return handle;
|
|
||||||
|
|
||||||
for (char *q = found+strlen(found); q > found; --q)
|
|
||||||
{
|
|
||||||
if (*q == '/')
|
|
||||||
break;
|
|
||||||
|
|
||||||
if (*q != '.')
|
|
||||||
continue;
|
|
||||||
|
|
||||||
strcpySafe(extBuf, q+1, extBufN, -1);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return handle;
|
|
||||||
}
|
|
||||||
|
|
||||||
void initReadOps(PHYSFS_File *handle,
|
|
||||||
SDL_RWops &ops,
|
SDL_RWops &ops,
|
||||||
bool freeOnClose)
|
bool freeOnClose)
|
||||||
{
|
{
|
||||||
ops.size = SDL_RWopsSize;
|
ops.size = SDL_RWopsSize;
|
||||||
ops.seek = SDL_RWopsSeek;
|
ops.seek = SDL_RWopsSeek;
|
||||||
ops.read = SDL_RWopsRead;
|
ops.read = SDL_RWopsRead;
|
||||||
|
@ -443,21 +287,56 @@ struct FileSystemPrivate
|
||||||
|
|
||||||
ops.type = SDL_RWOPS_PHYSFS;
|
ops.type = SDL_RWOPS_PHYSFS;
|
||||||
ops.hidden.unknown.data1 = handle;
|
ops.hidden.unknown.data1 = handle;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void strTolower(std::string &str)
|
||||||
|
{
|
||||||
|
for (size_t i = 0; i < str.size(); ++i)
|
||||||
|
str[i] = tolower(str[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
const Uint32 SDL_RWOPS_PHYSFS = SDL_RWOPS_UNKNOWN+10;
|
||||||
|
|
||||||
|
struct FileSystemPrivate
|
||||||
|
{
|
||||||
|
/* Maps: lower case full filepath,
|
||||||
|
* To: mixed case full filepath */
|
||||||
|
BoostHash<std::string, std::string> pathCache;
|
||||||
|
/* Maps: lower case directory path,
|
||||||
|
* To: list of lower case filenames */
|
||||||
|
BoostHash<std::string, std::vector<std::string> > fileLists;
|
||||||
|
|
||||||
|
/* This is for compatibility with games that take Windows'
|
||||||
|
* case insensitivity for granted */
|
||||||
|
bool havePathCache;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static void throwPhysfsError(const char *desc)
|
||||||
|
{
|
||||||
|
PHYSFS_ErrorCode ec = PHYSFS_getLastErrorCode();
|
||||||
|
const char *englishStr = PHYSFS_getErrorByCode(ec);
|
||||||
|
|
||||||
|
throw Exception(Exception::PHYSFSError, "%s: %s", desc, englishStr);
|
||||||
|
}
|
||||||
|
|
||||||
FileSystem::FileSystem(const char *argv0,
|
FileSystem::FileSystem(const char *argv0,
|
||||||
bool allowSymlinks)
|
bool allowSymlinks)
|
||||||
{
|
{
|
||||||
|
if (PHYSFS_init(argv0) == 0)
|
||||||
|
throwPhysfsError("Error initializing PhysFS");
|
||||||
|
|
||||||
|
/* One error (=return 0) turns the whole product to 0 */
|
||||||
|
int er = 1;
|
||||||
|
er *= PHYSFS_registerArchiver(&RGSS1_Archiver);
|
||||||
|
er *= PHYSFS_registerArchiver(&RGSS2_Archiver);
|
||||||
|
er *= PHYSFS_registerArchiver(&RGSS3_Archiver);
|
||||||
|
|
||||||
|
if (er == 0)
|
||||||
|
throwPhysfsError("Error registering PhysFS RGSS archiver");
|
||||||
|
|
||||||
p = new FileSystemPrivate;
|
p = new FileSystemPrivate;
|
||||||
p->havePathCache = false;
|
p->havePathCache = false;
|
||||||
|
|
||||||
PHYSFS_init(argv0);
|
|
||||||
|
|
||||||
PHYSFS_registerArchiver(&RGSS1_Archiver);
|
|
||||||
PHYSFS_registerArchiver(&RGSS2_Archiver);
|
|
||||||
PHYSFS_registerArchiver(&RGSS3_Archiver);
|
|
||||||
|
|
||||||
if (allowSymlinks)
|
if (allowSymlinks)
|
||||||
PHYSFS_permitSymbolicLinks(1);
|
PHYSFS_permitSymbolicLinks(1);
|
||||||
}
|
}
|
||||||
|
@ -484,99 +363,107 @@ void FileSystem::addPath(const char *path)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef __APPLE__
|
struct CacheEnumData
|
||||||
struct CacheEnumCBData
|
|
||||||
{
|
{
|
||||||
FileSystemPrivate *p;
|
FileSystemPrivate *p;
|
||||||
|
std::stack<std::vector<std::string>*> fileLists;
|
||||||
|
|
||||||
|
#ifdef __APPLE__
|
||||||
iconv_t nfd2nfc;
|
iconv_t nfd2nfc;
|
||||||
|
char buf[512];
|
||||||
|
#endif
|
||||||
|
|
||||||
CacheEnumCBData(FileSystemPrivate *fsp)
|
CacheEnumData(FileSystemPrivate *p)
|
||||||
|
: p(p)
|
||||||
{
|
{
|
||||||
p = fsp;
|
#ifdef __APPLE__
|
||||||
nfd2nfc = iconv_open("utf-8", "utf-8-mac");
|
nfd2nfc = iconv_open("utf-8", "utf-8-mac");
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
~CacheEnumCBData()
|
~CacheEnumData()
|
||||||
{
|
{
|
||||||
|
#ifdef __APPLE__
|
||||||
iconv_close(nfd2nfc);
|
iconv_close(nfd2nfc);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void nfcFromNfd(char *dst, const char *src, size_t dstSize)
|
/* Converts in-place */
|
||||||
|
void toNFC(char *inout)
|
||||||
{
|
{
|
||||||
size_t srcSize = strlen(src);
|
#ifdef __APPLE__
|
||||||
|
size_t srcSize = strlen(inout);
|
||||||
|
size_t bufSize = sizeof(buf);
|
||||||
|
char *bufPtr = buf;
|
||||||
|
char *inoutPtr = inout;
|
||||||
|
|
||||||
/* Reserve room for null terminator */
|
/* Reserve room for null terminator */
|
||||||
--dstSize;
|
--bufSize;
|
||||||
/* iconv takes a char** instead of a const char**, even though
|
|
||||||
* the string data isn't written to. */
|
|
||||||
iconv(nfd2nfc,
|
iconv(nfd2nfc,
|
||||||
const_cast<char**>(&src), &srcSize,
|
&inoutPtr, &srcSize,
|
||||||
&dst, &dstSize);
|
&bufPtr, &bufSize);
|
||||||
/* Null-terminate */
|
/* Null-terminate */
|
||||||
*dst = 0;
|
*bufPtr = 0;
|
||||||
|
strcpy(inout, buf);
|
||||||
|
#else
|
||||||
|
(void) inout;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
#endif
|
|
||||||
|
|
||||||
static void cacheEnumCB(void *d, const char *origdir,
|
static PHYSFS_EnumerateCallbackResult
|
||||||
const char *fname)
|
cacheEnumCB(void *d, const char *origdir, const char *fname)
|
||||||
{
|
{
|
||||||
#ifdef __APPLE__
|
CacheEnumData &data = *static_cast<CacheEnumData*>(d);
|
||||||
CacheEnumCBData *data = static_cast<CacheEnumCBData*>(d);
|
char fullPath[512];
|
||||||
FileSystemPrivate *p = data->p;
|
|
||||||
#else
|
|
||||||
FileSystemPrivate *p = static_cast<FileSystemPrivate*>(d);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
char buf[512];
|
if (!*origdir)
|
||||||
|
snprintf(fullPath, sizeof(fullPath), "%s", fname);
|
||||||
if (*origdir == '\0')
|
|
||||||
strncpy(buf, fname, sizeof(buf));
|
|
||||||
else
|
else
|
||||||
snprintf(buf, sizeof(buf), "%s/%s", origdir, fname);
|
snprintf(fullPath, sizeof(fullPath), "%s/%s", origdir, fname);
|
||||||
|
|
||||||
#ifdef __APPLE__
|
/* Deal with OSX' weird UTF-8 standards */
|
||||||
char bufNfc[sizeof(buf)];
|
data.toNFC(fullPath);
|
||||||
data->nfcFromNfd(bufNfc, buf, sizeof(bufNfc));
|
|
||||||
#else
|
|
||||||
char *const bufNfc = buf;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
char *ptr = bufNfc;
|
std::string mixedCase(fullPath);
|
||||||
|
std::string lowerCase = mixedCase;
|
||||||
|
strTolower(lowerCase);
|
||||||
|
|
||||||
/* Trim leading slash */
|
PHYSFS_Stat stat;
|
||||||
if (*ptr == '/')
|
PHYSFS_stat(fullPath, &stat);
|
||||||
++ptr;
|
|
||||||
|
|
||||||
std::string mixedCase(ptr);
|
if (stat.filetype == PHYSFS_FILETYPE_DIRECTORY)
|
||||||
|
|
||||||
for (char *q = bufNfc; *q; ++q)
|
|
||||||
*q = tolower(*q);
|
|
||||||
|
|
||||||
p->pathCache.insert(std::string(ptr), mixedCase);
|
|
||||||
|
|
||||||
for (char *q = ptr+strlen(ptr); q > ptr; --q)
|
|
||||||
{
|
{
|
||||||
if (*q == '/')
|
/* Create a new list for this directory */
|
||||||
break;
|
std::vector<std::string> &list = data.p->fileLists[lowerCase];
|
||||||
|
|
||||||
if (*q != '.')
|
/* Iterate over its contents */
|
||||||
continue;
|
data.fileLists.push(&list);
|
||||||
|
PHYSFS_enumerate(fullPath, cacheEnumCB, d);
|
||||||
|
data.fileLists.pop();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Get the file list for the directory we're currently
|
||||||
|
* traversing and append this filename to it */
|
||||||
|
std::vector<std::string> &list = *data.fileLists.top();
|
||||||
|
std::string lowerFilename(fname);
|
||||||
|
strTolower(lowerFilename);
|
||||||
|
list.push_back(lowerFilename);
|
||||||
|
|
||||||
*q = '\0';
|
/* Add the lower -> mixed mapping of the file's full path */
|
||||||
p->pathCache.insert(std::string(ptr), mixedCase);
|
data.p->pathCache.insert(lowerCase, mixedCase);
|
||||||
}
|
}
|
||||||
|
|
||||||
PHYSFS_enumerateFilesCallback(mixedCase.c_str(), cacheEnumCB, d);
|
return PHYSFS_ENUM_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
void FileSystem::createPathCache()
|
void FileSystem::createPathCache()
|
||||||
{
|
{
|
||||||
#ifdef __APPLE__
|
CacheEnumData data(p);
|
||||||
CacheEnumCBData data(p);
|
data.fileLists.push(&p->fileLists[""]);
|
||||||
PHYSFS_enumerateFilesCallback("", cacheEnumCB, &data);
|
PHYSFS_enumerate("", cacheEnumCB, &data);
|
||||||
#else
|
|
||||||
PHYSFS_enumerateFilesCallback("", cacheEnumCB, p);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
p->havePathCache = true;
|
p->havePathCache = true;
|
||||||
}
|
}
|
||||||
|
@ -587,17 +474,16 @@ struct FontSetsCBData
|
||||||
SharedFontState *sfs;
|
SharedFontState *sfs;
|
||||||
};
|
};
|
||||||
|
|
||||||
static void fontSetEnumCB(void *data, const char *,
|
static PHYSFS_EnumerateCallbackResult
|
||||||
const char *fname)
|
fontSetEnumCB (void *data, const char *dir, const char *fname)
|
||||||
{
|
{
|
||||||
FontSetsCBData *d = static_cast<FontSetsCBData*>(data);
|
FontSetsCBData *d = static_cast<FontSetsCBData*>(data);
|
||||||
FileSystemPrivate *p = d->p;
|
|
||||||
|
|
||||||
/* Only consider filenames with font extensions */
|
/* Only consider filenames with font extensions */
|
||||||
const char *ext = p->findExt(fname);
|
const char *ext = findExt(fname);
|
||||||
|
|
||||||
if (!ext)
|
if (!ext)
|
||||||
return;
|
return PHYSFS_ENUM_OK;
|
||||||
|
|
||||||
char lowExt[8];
|
char lowExt[8];
|
||||||
size_t i;
|
size_t i;
|
||||||
|
@ -607,40 +493,195 @@ static void fontSetEnumCB(void *data, const char *,
|
||||||
lowExt[i] = '\0';
|
lowExt[i] = '\0';
|
||||||
|
|
||||||
if (strcmp(lowExt, "ttf") && strcmp(lowExt, "otf"))
|
if (strcmp(lowExt, "ttf") && strcmp(lowExt, "otf"))
|
||||||
return;
|
return PHYSFS_ENUM_OK;
|
||||||
|
|
||||||
char filename[512];
|
char filename[512];
|
||||||
snprintf(filename, sizeof(filename), "Fonts/%s", fname);
|
snprintf(filename, sizeof(filename), "%s/%s", dir, fname);
|
||||||
|
|
||||||
PHYSFS_File *handle = PHYSFS_openRead(filename);
|
PHYSFS_File *handle = PHYSFS_openRead(filename);
|
||||||
|
|
||||||
if (!handle)
|
if (!handle)
|
||||||
return;
|
return PHYSFS_ENUM_ERROR;
|
||||||
|
|
||||||
SDL_RWops ops;
|
SDL_RWops ops;
|
||||||
p->initReadOps(handle, ops, false);
|
initReadOps(handle, ops, false);
|
||||||
|
|
||||||
d->sfs->initFontSetCB(ops, filename);
|
d->sfs->initFontSetCB(ops, filename);
|
||||||
|
|
||||||
SDL_RWclose(&ops);
|
SDL_RWclose(&ops);
|
||||||
|
|
||||||
|
return PHYSFS_ENUM_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Basically just a case-insensitive search
|
||||||
|
* for the folder "Fonts"... */
|
||||||
|
static PHYSFS_EnumerateCallbackResult
|
||||||
|
findFontsFolderCB(void *data, const char *, const char *fname)
|
||||||
|
{
|
||||||
|
size_t i = 0;
|
||||||
|
char buffer[512];
|
||||||
|
const char *s = fname;
|
||||||
|
|
||||||
|
while (*s && i < sizeof(buffer))
|
||||||
|
buffer[i++] = tolower(*s++);
|
||||||
|
|
||||||
|
buffer[i] = '\0';
|
||||||
|
|
||||||
|
if (strcmp(buffer, "fonts") == 0)
|
||||||
|
PHYSFS_enumerate(fname, fontSetEnumCB, data);
|
||||||
|
|
||||||
|
return PHYSFS_ENUM_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
void FileSystem::initFontSets(SharedFontState &sfs)
|
void FileSystem::initFontSets(SharedFontState &sfs)
|
||||||
{
|
{
|
||||||
FontSetsCBData d = { p, &sfs };
|
FontSetsCBData d = { p, &sfs };
|
||||||
|
|
||||||
PHYSFS_enumerateFilesCallback("Fonts", fontSetEnumCB, &d);
|
PHYSFS_enumerate("", findFontsFolderCB, &d);
|
||||||
}
|
}
|
||||||
|
|
||||||
void FileSystem::openRead(SDL_RWops &ops,
|
struct OpenReadEnumData
|
||||||
const char *filename,
|
|
||||||
bool freeOnClose,
|
|
||||||
char *extBuf,
|
|
||||||
size_t extBufN)
|
|
||||||
{
|
{
|
||||||
PHYSFS_File *handle = p->openReadHandle(filename, extBuf, extBufN);
|
FileSystem::OpenHandler &handler;
|
||||||
|
SDL_RWops ops;
|
||||||
|
|
||||||
p->initReadOps(handle, ops, freeOnClose);
|
/* The filename (without directory) we're looking for */
|
||||||
|
const char *filename;
|
||||||
|
size_t filenameN;
|
||||||
|
|
||||||
|
/* Optional hash to translate full filepaths
|
||||||
|
* (used with path cache) */
|
||||||
|
BoostHash<std::string, std::string> *pathTrans;
|
||||||
|
|
||||||
|
/* Number of files we've attempted to read and parse */
|
||||||
|
size_t matchCount;
|
||||||
|
bool stopSearching;
|
||||||
|
|
||||||
|
/* In case of a PhysFS error, save it here so it
|
||||||
|
* doesn't get changed before we get back into our code */
|
||||||
|
const char *physfsError;
|
||||||
|
|
||||||
|
OpenReadEnumData(FileSystem::OpenHandler &handler,
|
||||||
|
const char *filename, size_t filenameN,
|
||||||
|
BoostHash<std::string, std::string> *pathTrans)
|
||||||
|
: handler(handler), filename(filename), filenameN(filenameN),
|
||||||
|
pathTrans(pathTrans), matchCount(0), stopSearching(false),
|
||||||
|
physfsError(0)
|
||||||
|
{}
|
||||||
|
};
|
||||||
|
|
||||||
|
static PHYSFS_EnumerateCallbackResult
|
||||||
|
openReadEnumCB(void *d, const char *dirpath, const char *filename)
|
||||||
|
{
|
||||||
|
OpenReadEnumData &data = *static_cast<OpenReadEnumData*>(d);
|
||||||
|
char buffer[512];
|
||||||
|
const char *fullPath;
|
||||||
|
|
||||||
|
if (data.stopSearching)
|
||||||
|
return PHYSFS_ENUM_STOP;
|
||||||
|
|
||||||
|
/* If there's not even a partial match, continue searching */
|
||||||
|
if (strncmp(filename, data.filename, data.filenameN) != 0)
|
||||||
|
return PHYSFS_ENUM_OK;
|
||||||
|
|
||||||
|
if (!*dirpath)
|
||||||
|
{
|
||||||
|
fullPath = filename;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
snprintf(buffer, sizeof(buffer), "%s/%s", dirpath, filename);
|
||||||
|
fullPath = buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
char last = filename[data.filenameN];
|
||||||
|
|
||||||
|
/* If fname matches up to a following '.' (meaning the rest is part
|
||||||
|
* of the extension), or up to a following '\0' (full match), we've
|
||||||
|
* found our file */
|
||||||
|
if (last != '.' && last != '\0')
|
||||||
|
return PHYSFS_ENUM_STOP;
|
||||||
|
|
||||||
|
/* If the path cache is active, translate from lower case
|
||||||
|
* to mixed case path */
|
||||||
|
if (data.pathTrans)
|
||||||
|
fullPath = (*data.pathTrans)[fullPath].c_str();
|
||||||
|
|
||||||
|
PHYSFS_File *phys = PHYSFS_openRead(fullPath);
|
||||||
|
|
||||||
|
if (!phys)
|
||||||
|
{
|
||||||
|
/* Failing to open this file here means there must
|
||||||
|
* be a deeper rooted problem somewhere within PhysFS.
|
||||||
|
* Just abort alltogether. */
|
||||||
|
data.stopSearching = true;
|
||||||
|
data.physfsError = PHYSFS_getErrorByCode(PHYSFS_getLastErrorCode());
|
||||||
|
|
||||||
|
return PHYSFS_ENUM_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
initReadOps(phys, data.ops, false);
|
||||||
|
|
||||||
|
const char *ext = findExt(filename);
|
||||||
|
|
||||||
|
if (data.handler.tryRead(data.ops, ext))
|
||||||
|
data.stopSearching = true;
|
||||||
|
|
||||||
|
++data.matchCount;
|
||||||
|
return PHYSFS_ENUM_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
void FileSystem::openRead(OpenHandler &handler, const char *filename)
|
||||||
|
{
|
||||||
|
char buffer[512];
|
||||||
|
size_t len = strcpySafe(buffer, filename, sizeof(buffer), -1);
|
||||||
|
char *delim;
|
||||||
|
|
||||||
|
if (p->havePathCache)
|
||||||
|
for (size_t i = 0; i < len; ++i)
|
||||||
|
buffer[i] = tolower(buffer[i]);
|
||||||
|
|
||||||
|
/* Find the deliminator separating directory and file name */
|
||||||
|
for (delim = buffer + len; delim > buffer; --delim)
|
||||||
|
if (*delim == '/')
|
||||||
|
break;
|
||||||
|
|
||||||
|
const bool root = (delim == buffer);
|
||||||
|
|
||||||
|
const char *file = buffer;
|
||||||
|
const char *dir = "";
|
||||||
|
|
||||||
|
if (!root)
|
||||||
|
{
|
||||||
|
/* Cut the buffer in half so we can use it
|
||||||
|
* for both filename and directory path */
|
||||||
|
*delim = '\0';
|
||||||
|
file = delim+1;
|
||||||
|
dir = buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
OpenReadEnumData data(handler, file, len + buffer - delim - !root,
|
||||||
|
p->havePathCache ? &p->pathCache : 0);
|
||||||
|
|
||||||
|
if (p->havePathCache)
|
||||||
|
{
|
||||||
|
/* Get the list of files contained in this directory
|
||||||
|
* and manually iterate over them */
|
||||||
|
const std::vector<std::string> &fileList = p->fileLists[dir];
|
||||||
|
|
||||||
|
for (size_t i = 0; i < fileList.size(); ++i)
|
||||||
|
openReadEnumCB(&data, dir, fileList[i].c_str());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
PHYSFS_enumerate(dir, openReadEnumCB, &data);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data.physfsError)
|
||||||
|
throw Exception(Exception::PHYSFSError, "PhysFS: %s", data.physfsError);
|
||||||
|
|
||||||
|
if (data.matchCount == 0)
|
||||||
|
throw Exception(Exception::NoFileError, "%s", filename);
|
||||||
}
|
}
|
||||||
|
|
||||||
void FileSystem::openReadRaw(SDL_RWops &ops,
|
void FileSystem::openReadRaw(SDL_RWops &ops,
|
||||||
|
@ -650,12 +691,10 @@ void FileSystem::openReadRaw(SDL_RWops &ops,
|
||||||
PHYSFS_File *handle = PHYSFS_openRead(filename);
|
PHYSFS_File *handle = PHYSFS_openRead(filename);
|
||||||
assert(handle);
|
assert(handle);
|
||||||
|
|
||||||
p->initReadOps(handle, ops, freeOnClose);
|
initReadOps(handle, ops, freeOnClose);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool FileSystem::exists(const char *filename)
|
bool FileSystem::exists(const char *filename)
|
||||||
{
|
{
|
||||||
char found[512];
|
return PHYSFS_exists(filename);
|
||||||
|
|
||||||
return p->completeFilename(filename, found, sizeof(found));
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
@ -43,17 +43,28 @@ public:
|
||||||
* available font assets */
|
* available font assets */
|
||||||
void initFontSets(SharedFontState &sfs);
|
void initFontSets(SharedFontState &sfs);
|
||||||
|
|
||||||
void openRead(SDL_RWops &ops,
|
struct OpenHandler
|
||||||
const char *filename,
|
{
|
||||||
bool freeOnClose = false,
|
/* Try to read and interpret data provided from ops.
|
||||||
char *extBuf = 0,
|
* If data cannot be parsed, return false, otherwise true.
|
||||||
size_t extBufN = 0);
|
* Can be called multiple times until a parseable file is found.
|
||||||
|
* It's the handler's responsibility to close every passed
|
||||||
|
* ops structure, even when data could not be parsed.
|
||||||
|
* After this function returns, ops becomes invalid, so don't take
|
||||||
|
* references to it. Instead, copy the structure without closing
|
||||||
|
* if you need to further read from it later. */
|
||||||
|
virtual bool tryRead(SDL_RWops &ops, const char *ext) = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
void openRead(OpenHandler &handler,
|
||||||
|
const char *filename);
|
||||||
|
|
||||||
/* Circumvents extension supplementing */
|
/* Circumvents extension supplementing */
|
||||||
void openReadRaw(SDL_RWops &ops,
|
void openReadRaw(SDL_RWops &ops,
|
||||||
const char *filename,
|
const char *filename,
|
||||||
bool freeOnClose = false);
|
bool freeOnClose = false);
|
||||||
|
|
||||||
|
/* Does not perform extension supplementing */
|
||||||
bool exists(const char *filename);
|
bool exists(const char *filename);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -6,10 +6,6 @@
|
||||||
|
|
||||||
#include "debugwriter.h"
|
#include "debugwriter.h"
|
||||||
|
|
||||||
#ifdef SHARED_FLUID
|
|
||||||
#include <fluidsynth.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if __LINUX__ || __ANDROID__
|
#if __LINUX__ || __ANDROID__
|
||||||
#define FLUID_LIB "libfluidsynth.so.1"
|
#define FLUID_LIB "libfluidsynth.so.1"
|
||||||
#elif __MACOSX__
|
#elif __MACOSX__
|
||||||
|
|
|
@ -1,6 +1,12 @@
|
||||||
#ifndef FLUIDFUN_H
|
#ifndef FLUIDFUN_H
|
||||||
#define FLUIDFUN_H
|
#define FLUIDFUN_H
|
||||||
|
|
||||||
|
#ifdef SHARED_FLUID
|
||||||
|
# include <fluidsynth.h>
|
||||||
|
#else
|
||||||
|
# define FLUIDSYNTH_VERSION_MAJOR 2
|
||||||
|
#endif
|
||||||
|
|
||||||
typedef struct _fluid_hashtable_t fluid_settings_t;
|
typedef struct _fluid_hashtable_t fluid_settings_t;
|
||||||
typedef struct _fluid_synth_t fluid_synth_t;
|
typedef struct _fluid_synth_t fluid_synth_t;
|
||||||
|
|
||||||
|
@ -19,7 +25,12 @@ typedef int (*FLUIDSYNTHPROGRAMCHANGEPROC)(fluid_synth_t* synth, int chan, int p
|
||||||
typedef fluid_settings_t* (*NEWFLUIDSETTINGSPROC)(void);
|
typedef fluid_settings_t* (*NEWFLUIDSETTINGSPROC)(void);
|
||||||
typedef fluid_synth_t* (*NEWFLUIDSYNTHPROC)(fluid_settings_t* settings);
|
typedef fluid_synth_t* (*NEWFLUIDSYNTHPROC)(fluid_settings_t* settings);
|
||||||
typedef void (*DELETEFLUIDSETTINGSPROC)(fluid_settings_t* settings);
|
typedef void (*DELETEFLUIDSETTINGSPROC)(fluid_settings_t* settings);
|
||||||
|
|
||||||
|
#if FLUIDSYNTH_VERSION_MAJOR == 1
|
||||||
typedef int (*DELETEFLUIDSYNTHPROC)(fluid_synth_t* synth);
|
typedef int (*DELETEFLUIDSYNTHPROC)(fluid_synth_t* synth);
|
||||||
|
#else
|
||||||
|
typedef void (*DELETEFLUIDSYNTHPROC)(fluid_synth_t* synth);
|
||||||
|
#endif
|
||||||
|
|
||||||
#define FLUID_FUNCS \
|
#define FLUID_FUNCS \
|
||||||
FLUID_FUN(settings_setnum, FLUIDSETTINGSSETNUMPROC) \
|
FLUID_FUN(settings_setnum, FLUIDSETTINGSSETNUMPROC) \
|
||||||
|
|
90
src/font.cpp
90
src/font.cpp
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
@ -174,7 +174,7 @@ _TTF_Font *SharedFontState::getFont(std::string family,
|
||||||
// FIXME 0.9 is guesswork at this point
|
// FIXME 0.9 is guesswork at this point
|
||||||
// float gamma = (96.0/45.0)*(5.0/14.0)*(size-5);
|
// float gamma = (96.0/45.0)*(5.0/14.0)*(size-5);
|
||||||
// font = TTF_OpenFontRW(ops, 1, gamma /** .90*/);
|
// font = TTF_OpenFontRW(ops, 1, gamma /** .90*/);
|
||||||
font = TTF_OpenFontRW(ops, 1, size* .90);
|
font = TTF_OpenFontRW(ops, 1, size* 0.90f);
|
||||||
|
|
||||||
if (!font)
|
if (!font)
|
||||||
throw Exception(Exception::SDLError, "%s", SDL_GetError());
|
throw Exception(Exception::SDLError, "%s", SDL_GetError());
|
||||||
|
@ -184,7 +184,7 @@ _TTF_Font *SharedFontState::getFont(std::string family,
|
||||||
return font;
|
return font;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SharedFontState::fontPresent(std::string family)
|
bool SharedFontState::fontPresent(std::string family) const
|
||||||
{
|
{
|
||||||
/* Check for substitutions */
|
/* Check for substitutions */
|
||||||
if (p->subs.contains(family))
|
if (p->subs.contains(family))
|
||||||
|
@ -202,6 +202,26 @@ _TTF_Font *SharedFontState::openBundled(int size)
|
||||||
return TTF_OpenFontRW(ops, 1, size);
|
return TTF_OpenFontRW(ops, 1, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void pickExistingFontName(const std::vector<std::string> &names,
|
||||||
|
std::string &out,
|
||||||
|
const SharedFontState &sfs)
|
||||||
|
{
|
||||||
|
/* Note: In RMXP, a names array with no existing entry
|
||||||
|
* results in no text being drawn at all (same for "" and []);
|
||||||
|
* we can't replicate this in mkxp due to the default substitute. */
|
||||||
|
|
||||||
|
for (size_t i = 0; i < names.size(); ++i)
|
||||||
|
{
|
||||||
|
if (sfs.fontPresent(names[i]))
|
||||||
|
{
|
||||||
|
out = names[i];
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
out = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
struct FontPrivate
|
struct FontPrivate
|
||||||
{
|
{
|
||||||
|
@ -229,15 +249,15 @@ struct FontPrivate
|
||||||
static Color defaultColorTmp;
|
static Color defaultColorTmp;
|
||||||
static Color defaultOutColorTmp;
|
static Color defaultOutColorTmp;
|
||||||
|
|
||||||
|
static std::vector<std::string> initialDefaultNames;
|
||||||
|
|
||||||
/* The actual font is opened as late as possible
|
/* The actual font is opened as late as possible
|
||||||
* (when it is queried by a Bitmap), prior it is
|
* (when it is queried by a Bitmap), prior it is
|
||||||
* set to null */
|
* set to null */
|
||||||
TTF_Font *sdlFont;
|
TTF_Font *sdlFont;
|
||||||
|
|
||||||
FontPrivate(const char *name = 0,
|
FontPrivate(int size)
|
||||||
int size = 0)
|
: size(size),
|
||||||
: name(name ? std::string(name) : defaultName),
|
|
||||||
size(size ? size : defaultSize),
|
|
||||||
bold(defaultBold),
|
bold(defaultBold),
|
||||||
italic(defaultItalic),
|
italic(defaultItalic),
|
||||||
outline(defaultOutline),
|
outline(defaultOutline),
|
||||||
|
@ -290,6 +310,8 @@ Color *FontPrivate::defaultOutColor = &FontPrivate::defaultOutColorTmp;
|
||||||
Color FontPrivate::defaultColorTmp(255, 255, 255, 255);
|
Color FontPrivate::defaultColorTmp(255, 255, 255, 255);
|
||||||
Color FontPrivate::defaultOutColorTmp(0, 0, 0, 128);
|
Color FontPrivate::defaultOutColorTmp(0, 0, 0, 128);
|
||||||
|
|
||||||
|
std::vector<std::string> FontPrivate::initialDefaultNames;
|
||||||
|
|
||||||
bool Font::doesExist(const char *name)
|
bool Font::doesExist(const char *name)
|
||||||
{
|
{
|
||||||
if (!name)
|
if (!name)
|
||||||
|
@ -298,10 +320,15 @@ bool Font::doesExist(const char *name)
|
||||||
return shState->fontState().fontPresent(name);
|
return shState->fontState().fontPresent(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
Font::Font(const char *name,
|
Font::Font(const std::vector<std::string> *names,
|
||||||
int size)
|
int size)
|
||||||
{
|
{
|
||||||
p = new FontPrivate(name, size);
|
p = new FontPrivate(size ? size : FontPrivate::defaultSize);
|
||||||
|
|
||||||
|
if (names)
|
||||||
|
setName(*names);
|
||||||
|
else
|
||||||
|
p->name = FontPrivate::defaultName;
|
||||||
}
|
}
|
||||||
|
|
||||||
Font::Font(const Font &other)
|
Font::Font(const Font &other)
|
||||||
|
@ -321,17 +348,9 @@ const Font &Font::operator=(const Font &o)
|
||||||
return o;
|
return o;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *Font::getName() const
|
void Font::setName(const std::vector<std::string> &names)
|
||||||
{
|
{
|
||||||
return p->name.c_str();
|
pickExistingFontName(names, p->name, shState->fontState());
|
||||||
}
|
|
||||||
|
|
||||||
void Font::setName(const char *value)
|
|
||||||
{
|
|
||||||
if (p->name == value)
|
|
||||||
return;
|
|
||||||
|
|
||||||
p->name = value;
|
|
||||||
p->sdlFont = 0;
|
p->sdlFont = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -367,14 +386,15 @@ DEF_ATTR_SIMPLE_STATIC(Font, DefaultOutline, bool, FontPrivate::defaultOutli
|
||||||
DEF_ATTR_SIMPLE_STATIC(Font, DefaultColor, Color&, *FontPrivate::defaultColor)
|
DEF_ATTR_SIMPLE_STATIC(Font, DefaultColor, Color&, *FontPrivate::defaultColor)
|
||||||
DEF_ATTR_SIMPLE_STATIC(Font, DefaultOutColor, Color&, *FontPrivate::defaultOutColor)
|
DEF_ATTR_SIMPLE_STATIC(Font, DefaultOutColor, Color&, *FontPrivate::defaultOutColor)
|
||||||
|
|
||||||
const char *Font::getDefaultName()
|
void Font::setDefaultName(const std::vector<std::string> &names,
|
||||||
|
const SharedFontState &sfs)
|
||||||
{
|
{
|
||||||
return FontPrivate::defaultName.c_str();
|
pickExistingFontName(names, FontPrivate::defaultName, sfs);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Font::setDefaultName(const char *value)
|
const std::vector<std::string> &Font::getInitialDefaultNames()
|
||||||
{
|
{
|
||||||
FontPrivate::defaultName = value;
|
return FontPrivate::initialDefaultNames;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Font::initDynAttribs()
|
void Font::initDynAttribs()
|
||||||
|
@ -393,8 +413,30 @@ void Font::initDefaultDynAttribs()
|
||||||
FontPrivate::defaultOutColor = new Color(FontPrivate::defaultOutColorTmp);
|
FontPrivate::defaultOutColor = new Color(FontPrivate::defaultOutColorTmp);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Font::initDefaults()
|
void Font::initDefaults(const SharedFontState &sfs)
|
||||||
{
|
{
|
||||||
|
std::vector<std::string> &names = FontPrivate::initialDefaultNames;
|
||||||
|
|
||||||
|
switch (rgssVer)
|
||||||
|
{
|
||||||
|
case 1 :
|
||||||
|
// FIXME: Japanese version has "MS PGothic" instead
|
||||||
|
names.push_back("Arial");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2 :
|
||||||
|
names.push_back("UmePlus Gothic");
|
||||||
|
names.push_back("MS Gothic");
|
||||||
|
names.push_back("Courier New");
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
case 3 :
|
||||||
|
names.push_back("VL Gothic");
|
||||||
|
}
|
||||||
|
|
||||||
|
setDefaultName(names, sfs);
|
||||||
|
|
||||||
FontPrivate::defaultOutline = (rgssVer >= 3 ? true : false);
|
FontPrivate::defaultOutline = (rgssVer >= 3 ? true : false);
|
||||||
FontPrivate::defaultShadow = (rgssVer == 2 ? true : false);
|
FontPrivate::defaultShadow = (rgssVer == 2 ? true : false);
|
||||||
}
|
}
|
||||||
|
|
43
src/font.h
43
src/font.h
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
@ -25,6 +25,9 @@
|
||||||
#include "etc.h"
|
#include "etc.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
struct SDL_RWops;
|
struct SDL_RWops;
|
||||||
struct _TTF_Font;
|
struct _TTF_Font;
|
||||||
struct Config;
|
struct Config;
|
||||||
|
@ -47,7 +50,7 @@ public:
|
||||||
_TTF_Font *getFont(std::string family,
|
_TTF_Font *getFont(std::string family,
|
||||||
int size);
|
int size);
|
||||||
|
|
||||||
bool fontPresent(std::string family);
|
bool fontPresent(std::string family) const;
|
||||||
|
|
||||||
static _TTF_Font *openBundled(int size);
|
static _TTF_Font *openBundled(int size);
|
||||||
|
|
||||||
|
@ -55,22 +58,6 @@ private:
|
||||||
SharedFontStatePrivate *p;
|
SharedFontStatePrivate *p;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Concerning Font::name/defaultName :
|
|
||||||
* In RGSS, this is not actually a string; any type of
|
|
||||||
* object is accepted, however anything but strings and
|
|
||||||
* arrays is ignored (and text drawing turns blank).
|
|
||||||
* Single strings are interpreted as font family names,
|
|
||||||
* and directly passed to the underlying C++ object;
|
|
||||||
* arrays however are searched for the first string
|
|
||||||
* object corresponding to a valid font family name,
|
|
||||||
* and rendering is done with that. In mkxp, we pass
|
|
||||||
* this first valid font family as the 'name' attribute
|
|
||||||
* back to the C++ object on assignment and object
|
|
||||||
* creation (in case Font.default_name is also an array).
|
|
||||||
* Invalid parameters (things other than strings or
|
|
||||||
* arrays not containing any valid family name) are
|
|
||||||
* passed back as "". */
|
|
||||||
|
|
||||||
struct FontPrivate;
|
struct FontPrivate;
|
||||||
|
|
||||||
class Font
|
class Font
|
||||||
|
@ -78,15 +65,16 @@ class Font
|
||||||
public:
|
public:
|
||||||
static bool doesExist(const char *name);
|
static bool doesExist(const char *name);
|
||||||
|
|
||||||
Font(const char *name = 0,
|
Font(const std::vector<std::string> *names = 0,
|
||||||
int size = 0);
|
int size = 0);
|
||||||
|
|
||||||
/* Clone constructor */
|
/* Clone constructor */
|
||||||
Font(const Font &other);
|
Font(const Font &other);
|
||||||
|
|
||||||
~Font();
|
~Font();
|
||||||
|
|
||||||
const Font &operator=(const Font &o);
|
const Font &operator=(const Font &o);
|
||||||
|
|
||||||
DECL_ATTR( Name, const char * )
|
|
||||||
DECL_ATTR( Size, int )
|
DECL_ATTR( Size, int )
|
||||||
DECL_ATTR( Bold, bool )
|
DECL_ATTR( Bold, bool )
|
||||||
DECL_ATTR( Italic, bool )
|
DECL_ATTR( Italic, bool )
|
||||||
|
@ -95,7 +83,6 @@ public:
|
||||||
DECL_ATTR( Outline, bool )
|
DECL_ATTR( Outline, bool )
|
||||||
DECL_ATTR( OutColor, Color& )
|
DECL_ATTR( OutColor, Color& )
|
||||||
|
|
||||||
DECL_ATTR_STATIC( DefaultName, const char* )
|
|
||||||
DECL_ATTR_STATIC( DefaultSize, int )
|
DECL_ATTR_STATIC( DefaultSize, int )
|
||||||
DECL_ATTR_STATIC( DefaultBold, bool )
|
DECL_ATTR_STATIC( DefaultBold, bool )
|
||||||
DECL_ATTR_STATIC( DefaultItalic, bool )
|
DECL_ATTR_STATIC( DefaultItalic, bool )
|
||||||
|
@ -104,13 +91,25 @@ public:
|
||||||
DECL_ATTR_STATIC( DefaultOutline, bool )
|
DECL_ATTR_STATIC( DefaultOutline, bool )
|
||||||
DECL_ATTR_STATIC( DefaultOutColor, Color& )
|
DECL_ATTR_STATIC( DefaultOutColor, Color& )
|
||||||
|
|
||||||
|
/* There is no point in providing getters for these,
|
||||||
|
* as the bindings will always return the stored native
|
||||||
|
* string/array object anyway. It's impossible to mirror
|
||||||
|
* in the C++ core.
|
||||||
|
* The core object picks the first existing name from the
|
||||||
|
* passed array and stores it internally (same for default). */
|
||||||
|
void setName(const std::vector<std::string> &names);
|
||||||
|
static void setDefaultName(const std::vector<std::string> &names,
|
||||||
|
const SharedFontState &sfs);
|
||||||
|
|
||||||
|
static const std::vector<std::string> &getInitialDefaultNames();
|
||||||
|
|
||||||
/* Assigns heap allocated objects to object properties;
|
/* Assigns heap allocated objects to object properties;
|
||||||
* using this in pure C++ will cause memory leaks
|
* using this in pure C++ will cause memory leaks
|
||||||
* (ie. only to be used in GCed language bindings) */
|
* (ie. only to be used in GCed language bindings) */
|
||||||
void initDynAttribs();
|
void initDynAttribs();
|
||||||
static void initDefaultDynAttribs();
|
static void initDefaultDynAttribs();
|
||||||
|
|
||||||
static void initDefaults();
|
static void initDefaults(const SharedFontState &sfs);
|
||||||
|
|
||||||
/* internal */
|
/* internal */
|
||||||
_TTF_Font *getSdlFont();
|
_TTF_Font *getSdlFont();
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2014 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2014 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2014 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2014 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2014 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2014 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
@ -175,9 +175,9 @@ void blitSource(TEXFBO &source)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void blitRectangle(const IntRect &src, const Vec2i &dstPos, bool smooth)
|
void blitRectangle(const IntRect &src, const Vec2i &dstPos)
|
||||||
{
|
{
|
||||||
blitRectangle(src, IntRect(dstPos.x, dstPos.y, src.w, src.h), smooth);
|
blitRectangle(src, IntRect(dstPos.x, dstPos.y, src.w, src.h), false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void blitRectangle(const IntRect &src, const IntRect &dst, bool smooth)
|
void blitRectangle(const IntRect &src, const IntRect &dst, bool smooth)
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2014 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2014 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
@ -68,8 +68,7 @@ void vaoUnbind(VAO &vao);
|
||||||
void blitBegin(TEXFBO &target);
|
void blitBegin(TEXFBO &target);
|
||||||
void blitBeginScreen(const Vec2i &size);
|
void blitBeginScreen(const Vec2i &size);
|
||||||
void blitSource(TEXFBO &source);
|
void blitSource(TEXFBO &source);
|
||||||
void blitRectangle(const IntRect &src, const Vec2i &dstPos,
|
void blitRectangle(const IntRect &src, const Vec2i &dstPos);
|
||||||
bool smooth = false);
|
|
||||||
void blitRectangle(const IntRect &src, const IntRect &dst,
|
void blitRectangle(const IntRect &src, const IntRect &dst,
|
||||||
bool smooth = false);
|
bool smooth = false);
|
||||||
void blitEnd();
|
void blitEnd();
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
@ -23,6 +23,7 @@
|
||||||
#include "shader.h"
|
#include "shader.h"
|
||||||
#include "etc.h"
|
#include "etc.h"
|
||||||
#include "gl-fun.h"
|
#include "gl-fun.h"
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
#include <SDL_rect.h>
|
#include <SDL_rect.h>
|
||||||
|
|
||||||
|
@ -83,10 +84,9 @@ void GLBlendMode::apply(const BlendType &value)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case BlendSubstraction :
|
case BlendSubstraction :
|
||||||
// FIXME Alpha calculation is untested
|
|
||||||
gl.BlendEquation(GL_FUNC_REVERSE_SUBTRACT);
|
gl.BlendEquation(GL_FUNC_REVERSE_SUBTRACT);
|
||||||
gl.BlendFuncSeparate(GL_SRC_ALPHA, GL_ONE,
|
gl.BlendFuncSeparate(GL_SRC_ALPHA, GL_ONE,
|
||||||
GL_ONE, GL_ONE);
|
GL_ZERO, GL_ONE);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -111,7 +111,7 @@ GLState::Caps::Caps()
|
||||||
gl.GetIntegerv(GL_MAX_TEXTURE_SIZE, &maxTexSize);
|
gl.GetIntegerv(GL_MAX_TEXTURE_SIZE, &maxTexSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
GLState::GLState()
|
GLState::GLState(const Config &conf)
|
||||||
{
|
{
|
||||||
gl.Disable(GL_DEPTH_TEST);
|
gl.Disable(GL_DEPTH_TEST);
|
||||||
|
|
||||||
|
@ -121,4 +121,7 @@ GLState::GLState()
|
||||||
scissorTest.init(false);
|
scissorTest.init(false);
|
||||||
scissorBox.init(IntRect(0, 0, 640, 480));
|
scissorBox.init(IntRect(0, 0, 640, 480));
|
||||||
program.init(0);
|
program.init(0);
|
||||||
|
|
||||||
|
if (conf.maxTextureSize > 0)
|
||||||
|
caps.maxTexSize = conf.maxTextureSize;
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
@ -27,6 +27,8 @@
|
||||||
#include <stack>
|
#include <stack>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
|
||||||
|
struct Config;
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
struct GLProperty
|
struct GLProperty
|
||||||
{
|
{
|
||||||
|
@ -130,7 +132,7 @@ public:
|
||||||
|
|
||||||
} caps;
|
} caps;
|
||||||
|
|
||||||
GLState();
|
GLState(const Config &conf);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // GLSTATE_H
|
#endif // GLSTATE_H
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
**
|
**
|
||||||
** This file is part of mkxp.
|
** This file is part of mkxp.
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
||||||
**
|
**
|
||||||
** mkxp is free software: you can redistribute it and/or modify
|
** mkxp is free software: you can redistribute it and/or modify
|
||||||
** it under the terms of the GNU General Public License as published by
|
** it under the terms of the GNU General Public License as published by
|
||||||
|
@ -92,11 +92,9 @@ struct PingPong
|
||||||
{
|
{
|
||||||
screenW = width;
|
screenW = width;
|
||||||
screenH = height;
|
screenH = height;
|
||||||
|
|
||||||
for (int i = 0; i < 2; ++i)
|
for (int i = 0; i < 2; ++i)
|
||||||
{
|
TEXFBO::allocEmpty(rt[i], width, height);
|
||||||
TEX::bind(rt[i].tex);
|
|
||||||
TEX::allocEmpty(width, height);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void startRender()
|
void startRender()
|
||||||
|
@ -169,12 +167,17 @@ public:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void requestViewportRender(Vec4 &c, Vec4 &f, Vec4 &t)
|
void requestViewportRender(const Vec4 &c, const Vec4 &f, const Vec4 &t)
|
||||||
{
|
{
|
||||||
const IntRect &viewpRect = glState.scissorBox.get();
|
const IntRect &viewpRect = glState.scissorBox.get();
|
||||||
const IntRect &screenRect = geometry.rect;
|
const IntRect &screenRect = geometry.rect;
|
||||||
|
|
||||||
if (t.w != 0.0)
|
const bool toneRGBEffect = t.xyzNotNull();
|
||||||
|
const bool toneGrayEffect = t.w != 0;
|
||||||
|
const bool colorEffect = c.w > 0;
|
||||||
|
const bool flashEffect = f.w > 0;
|
||||||
|
|
||||||
|
if (toneGrayEffect)
|
||||||
{
|
{
|
||||||
pp.swapRender();
|
pp.swapRender();
|
||||||
|
|
||||||
|
@ -206,19 +209,14 @@ public:
|
||||||
glState.blend.pop();
|
glState.blend.pop();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool toneEffect = t.xyzHasEffect();
|
if (!toneRGBEffect && !colorEffect && !flashEffect)
|
||||||
bool colorEffect = c.xyzHasEffect();
|
|
||||||
bool flashEffect = f.xyzHasEffect();
|
|
||||||
|
|
||||||
if (!toneEffect && !colorEffect && !flashEffect)
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
FlatColorShader &shader = shState->shaders().flatColor;
|
FlatColorShader &shader = shState->shaders().flatColor;
|
||||||
shader.bind();
|
shader.bind();
|
||||||
shader.applyViewportProj();
|
shader.applyViewportProj();
|
||||||
|
|
||||||
/* Apply tone */
|
if (toneRGBEffect)
|
||||||
if (toneEffect)
|
|
||||||
{
|
{
|
||||||
/* First split up additive / substractive components */
|
/* First split up additive / substractive components */
|
||||||
Vec4 add, sub;
|
Vec4 add, sub;
|
||||||
|
@ -240,7 +238,7 @@ public:
|
||||||
/* Then apply them using hardware blending */
|
/* Then apply them using hardware blending */
|
||||||
gl.BlendFuncSeparate(GL_ONE, GL_ONE, GL_ZERO, GL_ONE);
|
gl.BlendFuncSeparate(GL_ONE, GL_ONE, GL_ZERO, GL_ONE);
|
||||||
|
|
||||||
if (add.xyzHasEffect())
|
if (add.xyzNotNull())
|
||||||
{
|
{
|
||||||
gl.BlendEquation(GL_FUNC_ADD);
|
gl.BlendEquation(GL_FUNC_ADD);
|
||||||
shader.setColor(add);
|
shader.setColor(add);
|
||||||
|
@ -248,7 +246,7 @@ public:
|
||||||
screenQuad.draw();
|
screenQuad.draw();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sub.xyzHasEffect())
|
if (sub.xyzNotNull())
|
||||||
{
|
{
|
||||||
gl.BlendEquation(GL_FUNC_REVERSE_SUBTRACT);
|
gl.BlendEquation(GL_FUNC_REVERSE_SUBTRACT);
|
||||||
shader.setColor(sub);
|
shader.setColor(sub);
|
||||||
|
@ -281,9 +279,9 @@ public:
|
||||||
|
|
||||||
void setBrightness(float norm)
|
void setBrightness(float norm)
|
||||||
{
|
{
|
||||||
brightnessQuad.setColor(Vec4(0, 0, 0, 1.0 - norm));
|
brightnessQuad.setColor(Vec4(0, 0, 0, 1.0f - norm));
|
||||||
|
|
||||||
brightEffect = norm < 1.0;
|
brightEffect = norm < 1.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
void updateReso(int width, int height)
|
void updateReso(int width, int height)
|
||||||
|
@ -476,9 +474,7 @@ struct GraphicsPrivate
|
||||||
|
|
||||||
bool frozen;
|
bool frozen;
|
||||||
TEXFBO frozenScene;
|
TEXFBO frozenScene;
|
||||||
TEXFBO currentScene;
|
|
||||||
Quad screenQuad;
|
Quad screenQuad;
|
||||||
TEXFBO transBuffer;
|
|
||||||
|
|
||||||
/* Global list of all live Disposables
|
/* Global list of all live Disposables
|
||||||
* (disposed on reset) */
|
* (disposed on reset) */
|
||||||
|
@ -504,26 +500,15 @@ struct GraphicsPrivate
|
||||||
TEXFBO::allocEmpty(frozenScene, scRes.x, scRes.y);
|
TEXFBO::allocEmpty(frozenScene, scRes.x, scRes.y);
|
||||||
TEXFBO::linkFBO(frozenScene);
|
TEXFBO::linkFBO(frozenScene);
|
||||||
|
|
||||||
TEXFBO::init(currentScene);
|
|
||||||
TEXFBO::allocEmpty(currentScene, scRes.x, scRes.y);
|
|
||||||
TEXFBO::linkFBO(currentScene);
|
|
||||||
|
|
||||||
FloatRect screenRect(0, 0, scRes.x, scRes.y);
|
FloatRect screenRect(0, 0, scRes.x, scRes.y);
|
||||||
screenQuad.setTexPosRect(screenRect, screenRect);
|
screenQuad.setTexPosRect(screenRect, screenRect);
|
||||||
|
|
||||||
TEXFBO::init(transBuffer);
|
|
||||||
TEXFBO::allocEmpty(transBuffer, scRes.x, scRes.y);
|
|
||||||
TEXFBO::linkFBO(transBuffer);
|
|
||||||
|
|
||||||
fpsLimiter.resetFrameAdjust();
|
fpsLimiter.resetFrameAdjust();
|
||||||
}
|
}
|
||||||
|
|
||||||
~GraphicsPrivate()
|
~GraphicsPrivate()
|
||||||
{
|
{
|
||||||
TEXFBO::fini(frozenScene);
|
TEXFBO::fini(frozenScene);
|
||||||
TEXFBO::fini(currentScene);
|
|
||||||
|
|
||||||
TEXFBO::fini(transBuffer);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void updateScreenResoRatio(RGSSThreadData *rtData)
|
void updateScreenResoRatio(RGSSThreadData *rtData)
|
||||||
|
@ -566,6 +551,9 @@ struct GraphicsPrivate
|
||||||
glState.viewport.refresh();
|
glState.viewport.refresh();
|
||||||
recalculateScreenSize(threadData);
|
recalculateScreenSize(threadData);
|
||||||
updateScreenResoRatio(threadData);
|
updateScreenResoRatio(threadData);
|
||||||
|
|
||||||
|
SDL_Rect screen = { scOffset.x, scOffset.y, scSize.x, scSize.y };
|
||||||
|
threadData->ethread->notifyGameScreenChange(screen);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -721,7 +709,14 @@ void Graphics::transition(int duration,
|
||||||
setBrightness(255);
|
setBrightness(255);
|
||||||
|
|
||||||
/* Capture new scene */
|
/* Capture new scene */
|
||||||
p->compositeToBuffer(p->currentScene);
|
p->screen.composite();
|
||||||
|
|
||||||
|
/* The PP frontbuffer will hold the current scene after the
|
||||||
|
* composition step. Since the backbuffer is unused during
|
||||||
|
* the transition, we can reuse it as the target buffer for
|
||||||
|
* the final rendered image. */
|
||||||
|
TEXFBO ¤tScene = p->screen.getPP().frontBuffer();
|
||||||
|
TEXFBO &transBuffer = p->screen.getPP().backBuffer();
|
||||||
|
|
||||||
/* If no transition bitmap is provided,
|
/* If no transition bitmap is provided,
|
||||||
* we can use a simplified shader */
|
* we can use a simplified shader */
|
||||||
|
@ -734,9 +729,9 @@ void Graphics::transition(int duration,
|
||||||
shader.bind();
|
shader.bind();
|
||||||
shader.applyViewportProj();
|
shader.applyViewportProj();
|
||||||
shader.setFrozenScene(p->frozenScene.tex);
|
shader.setFrozenScene(p->frozenScene.tex);
|
||||||
shader.setCurrentScene(p->currentScene.tex);
|
shader.setCurrentScene(currentScene.tex);
|
||||||
shader.setTransMap(transMap->getGLTypes().tex);
|
shader.setTransMap(transMap->getGLTypes().tex);
|
||||||
shader.setVague(vague / 256.0);
|
shader.setVague(vague / 256.0f);
|
||||||
shader.setTexSize(p->scRes);
|
shader.setTexSize(p->scRes);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -745,7 +740,7 @@ void Graphics::transition(int duration,
|
||||||
shader.bind();
|
shader.bind();
|
||||||
shader.applyViewportProj();
|
shader.applyViewportProj();
|
||||||
shader.setFrozenScene(p->frozenScene.tex);
|
shader.setFrozenScene(p->frozenScene.tex);
|
||||||
shader.setCurrentScene(p->currentScene.tex);
|
shader.setCurrentScene(currentScene.tex);
|
||||||
shader.setTexSize(p->scRes);
|
shader.setTexSize(p->scRes);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -774,7 +769,7 @@ void Graphics::transition(int duration,
|
||||||
|
|
||||||
p->checkSyncLock();
|
p->checkSyncLock();
|
||||||
|
|
||||||
const float prog = i * (1.0 / duration);
|
const float prog = i * (1.0f / duration);
|
||||||
|
|
||||||
if (transMap)
|
if (transMap)
|
||||||
{
|
{
|
||||||
|
@ -789,7 +784,7 @@ void Graphics::transition(int duration,
|
||||||
|
|
||||||
/* Draw the composed frame to a buffer first
|
/* Draw the composed frame to a buffer first
|
||||||
* (we need this because we're skipping PingPong) */
|
* (we need this because we're skipping PingPong) */
|
||||||
FBO::bind(p->transBuffer.fbo);
|
FBO::bind(transBuffer.fbo);
|
||||||
FBO::clear();
|
FBO::clear();
|
||||||
p->screenQuad.draw();
|
p->screenQuad.draw();
|
||||||
|
|
||||||
|
@ -800,7 +795,7 @@ void Graphics::transition(int duration,
|
||||||
FBO::clear();
|
FBO::clear();
|
||||||
|
|
||||||
GLMeta::blitBeginScreen(Vec2i(p->winSize));
|
GLMeta::blitBeginScreen(Vec2i(p->winSize));
|
||||||
GLMeta::blitSource(p->transBuffer);
|
GLMeta::blitSource(transBuffer);
|
||||||
p->metaBlitBufferFlippedScaled();
|
p->metaBlitBufferFlippedScaled();
|
||||||
GLMeta::blitEnd();
|
GLMeta::blitEnd();
|
||||||
|
|
||||||
|
@ -852,7 +847,7 @@ void Graphics::fadeout(int duration)
|
||||||
FBO::unbind();
|
FBO::unbind();
|
||||||
|
|
||||||
float curr = p->brightness;
|
float curr = p->brightness;
|
||||||
float diff = 255.0 - curr;
|
float diff = 255.0f - curr;
|
||||||
|
|
||||||
for (int i = duration-1; i > -1; --i)
|
for (int i = duration-1; i > -1; --i)
|
||||||
{
|
{
|
||||||
|
@ -882,7 +877,7 @@ void Graphics::fadein(int duration)
|
||||||
FBO::unbind();
|
FBO::unbind();
|
||||||
|
|
||||||
float curr = p->brightness;
|
float curr = p->brightness;
|
||||||
float diff = 255.0 - curr;
|
float diff = 255.0f - curr;
|
||||||
|
|
||||||
for (int i = 1; i <= duration; ++i)
|
for (int i = 1; i <= duration; ++i)
|
||||||
{
|
{
|
||||||
|
@ -943,20 +938,19 @@ void Graphics::resizeScreen(int width, int height)
|
||||||
|
|
||||||
p->screen.setResolution(width, height);
|
p->screen.setResolution(width, height);
|
||||||
|
|
||||||
TEX::bind(p->frozenScene.tex);
|
TEXFBO::allocEmpty(p->frozenScene, width, height);
|
||||||
TEX::allocEmpty(width, height);
|
|
||||||
TEX::bind(p->currentScene.tex);
|
|
||||||
TEX::allocEmpty(width, height);
|
|
||||||
|
|
||||||
FloatRect screenRect(0, 0, width, height);
|
FloatRect screenRect(0, 0, width, height);
|
||||||
p->screenQuad.setTexPosRect(screenRect, screenRect);
|
p->screenQuad.setTexPosRect(screenRect, screenRect);
|
||||||
|
|
||||||
TEX::bind(p->transBuffer.tex);
|
|
||||||
TEX::allocEmpty(width, height);
|
|
||||||
|
|
||||||
shState->eThread().requestWindowResize(width, height);
|
shState->eThread().requestWindowResize(width, height);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Graphics::playMovie(const char *filename)
|
||||||
|
{
|
||||||
|
Debug() << "Graphics.playMovie(" << filename << ") not implemented";
|
||||||
|
}
|
||||||
|
|
||||||
DEF_ATTR_RD_SIMPLE(Graphics, Brightness, int, p->brightness)
|
DEF_ATTR_RD_SIMPLE(Graphics, Brightness, int, p->brightness)
|
||||||
|
|
||||||
void Graphics::setBrightness(int value)
|
void Graphics::setBrightness(int value)
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue