2016/10/05

EasyRPG Player(RPGツクール2000/2003作品をLinux,Mac,Android等で動かすソフト)の改造メモ

EasyRPG Player自体についてはここでは詳しくは扱わず、幾つかの改造についてを扱う。対象バージョンは0.5系。

重要:ソースの改造なので、ソースからビルドする前提となっている。ソースの変更箇所は、(探しやすいように)一部を除いて変更前の状態のものに変更の仕方をコメントで追加する形で示している。

  1. ウィンドウモードで起動した場合の表示位置指定
  2. マップ内移動速度を速くする
  3. 一部作品で戦闘時のアニメーションが敵の背後に表示されないようにする(修正済みにつき不要)
  4. 個人的な左手用キー割り当て変更

ウィンドウモードで起動した場合の表示位置指定

ウィンドウモード(--windowオプション)で起動すると必ず画面中央にウィンドウが作られるが、いつも中央以外の場所にウィンドウを持ってきてプレイする場合には都合が悪く、特に内蔵戦闘のテスト("--battle-test [番号]"オプション)を幾つも行いたい場合は面倒になる。

(少なくとも)GNU/Linuxにおいては、決まった位置にウィンドウを作成したい場合、SDL_CreateWindow()の2番目の引数と3番目の引数にそれぞれX座標とY座標を指定する。

[引用]ファイル名:src/sdl_ui.cpp
  // Create our window
  sdl_window = SDL_CreateWindow(GAME_TITLE,
   SDL_WINDOWPOS_CENTERED,  // X座標の数値でここを置き換える
   SDL_WINDOWPOS_CENTERED,  // Y座標の数値でここを置き換える
   display_width, display_height,
   SDL_WINDOW_RESIZABLE | flags);

マップ内移動速度を速くする

人によっては “移動速度さえ速ければ快適に(時間もかからずに)プレイできるのに…” と感じる作品があるものだが、移動処理を一部(移動速度1段階分高速に動くように)書き換えることで快適にプレイできるようになる。

修正としては 下の “1 + GetMoveSpeed()” の値を “1” 大きくすることになるのだが、この部分が “7” を超えると “Mystic Star” の乗り物などでうまくスクロールしなくなる現象が発生するため、 “7” を超えないように “min(2 + GetMoveSpeed(), 7)” とする。

[引用]ファイル名:src/game_character.cpp
void Game_Character::UpdateSprite() {
 if (IsJumping()) {
  UpdateJump();
  if (IsSpinning())
   anime_count++;
 } else if (IsMoving()) {
 // "1 + GetMoveSpeed()" -> "min(2 + GetMoveSpeed(), 7)" と置き換える
 remaining_step -= min(1 << (1 + GetMoveSpeed()), remaining_step);

一部作品で戦闘時のアニメーションが敵の背後に表示されないようにする(修正済みにつき不要)

  • RPGツクール2000のバージョン1.50
  • RPGツクール2003のバージョン1.05

において戦闘アニメーション(魔法などの攻撃エフェクトの一部)と “ピクチャ” と呼ばれる種類の画像との重なり順が逆になるという仕様変更があり、EasyRPG Playerのバージョン0.5.0時点ではこれより古いバージョンの挙動となっているため、 特に自作戦闘搭載の一部作品(“Seraphic Blue” や “Mystic Star” など)の戦闘時の攻撃エフェクトなどで敵キャラの背後にエフェクトが隠れる現象が発生する(該当バグは#1031)。

将来のEasyRPG Playerではバージョン検出やオプション指定(あるいはRPG_RT.iniの編集)によってこの挙動が適切に切り替えられるようになるものと期待されるが、それまでの間、上に示したそれぞれのRPGツクールのバージョンからの新しい挙動に合わせるにはsrc/battle_animation.cpp内の先頭付近にあるSetZ()の引数を “5000” などの大きな値にする。RPG_RT.exeに古いものと新しいものがあるように、ここを変更したものとしていないものをそれぞれビルドして両方用意しておくのがよいかもしれない。

(2016/11/3)この問題はRPG_RT.exeのバージョン(が重なり順の変更を含んだ大規模アップデートより新しいかどうか)を判定する処理を実装してこれを取り込んでもらうことができたことで進展し、2016年11月上旬時点の開発版のソースでは正しい重なり順(描画)になるように修正済みとなっている。

個人的な左手用キー割り当て変更

個人的には、キー割り当て設定(変更)機能のあるゲームなどでは、キーボードの G,H,Jに左手の薬指,中指,人差し指を置いて

キー方向左手の指
Y中指
H
G薬指
J人差し指

として(中指のみを上下に動かす形で)操作することを好むのだが、少なくともバージョン0.5.0ではキー割り当ての変更はできず(RPT_RT.exeと同様の固定された割り当て)、また、xmodmapは効果がないようなので、(将来キー割り当て設定が実装されるまでの間は)キー割り当てが決められている部分のソースを変更して使うことにしている。

修正としては、下のHからLまでの4つのキーとYキーに既に存在する割り当ての記述をなくしてから上の割り当ての記述を入れる形になる。

[引用]ファイル名:src/input_buttons_desktop.cpp
修正前:
void Input::InitButtons() {
 buttons.resize(BUTTON_COUNT);

 buttons[UP].push_back(Keys::UP);
 buttons[UP].push_back(Keys::K);
 buttons[UP].push_back(Keys::KP8);
 buttons[UP].push_back(Keys::W);
 buttons[DOWN].push_back(Keys::DOWN);
 buttons[DOWN].push_back(Keys::J);
 buttons[DOWN].push_back(Keys::KP2);
 buttons[DOWN].push_back(Keys::S);
 buttons[LEFT].push_back(Keys::LEFT);
 buttons[LEFT].push_back(Keys::H);
 buttons[LEFT].push_back(Keys::KP4);
 buttons[LEFT].push_back(Keys::A);
 buttons[RIGHT].push_back(Keys::RIGHT);
 buttons[RIGHT].push_back(Keys::L);
 buttons[RIGHT].push_back(Keys::KP6);
 buttons[RIGHT].push_back(Keys::D);
 buttons[DECISION].push_back(Keys::Z);
 buttons[DECISION].push_back(Keys::Y);
 buttons[DECISION].push_back(Keys::SPACE);
 buttons[DECISION].push_back(Keys::RETURN);
 buttons[DECISION].push_back(Keys::SELECT);
...
修正後:
void Input::InitButtons() {
 buttons.resize(BUTTON_COUNT);

 buttons[UP].push_back(Keys::UP);
 buttons[UP].push_back(Keys::Y);
 buttons[UP].push_back(Keys::KP8);
 buttons[UP].push_back(Keys::W);
 buttons[DOWN].push_back(Keys::DOWN);
 buttons[DOWN].push_back(Keys::H);
 buttons[DOWN].push_back(Keys::KP2);
 buttons[DOWN].push_back(Keys::S);
 buttons[LEFT].push_back(Keys::LEFT);
 buttons[LEFT].push_back(Keys::G);
 buttons[LEFT].push_back(Keys::KP4);
 buttons[LEFT].push_back(Keys::A);
 buttons[RIGHT].push_back(Keys::RIGHT);
 buttons[RIGHT].push_back(Keys::J);
 buttons[RIGHT].push_back(Keys::KP6);
 buttons[RIGHT].push_back(Keys::D);
 buttons[DECISION].push_back(Keys::Z);
 buttons[DECISION].push_back(Keys::SPACE);
 buttons[DECISION].push_back(Keys::RETURN);
 buttons[DECISION].push_back(Keys::SELECT);
...

使用したバージョン:
  • EasyRPG 0.5.0