投稿記事

無料プランの記事 (15)

K-Shin07 2024/06/23 16:02

【Wodistant】ウディタ開発補助ツールをVer1.3.4へ更新(Discordサーバーも公開)

ウディタでのゲーム開発効率を上げるためのツールである
WodistantをVer1.3.4.0に更新しました!
※最新版の取得はツール内のアップデート機能か公式サイトからダウンロードしてください。


タイルセット画面の通行設定切り替えショートカット

タイルセット設定画面にてクリックによる通行設定タイプ(〇×★▲等)をF1/F2/F3で切り替えられるように対応しました。

コモンイベントランチャー経由でイベント挿入

コモンイベントランチャーに登録された各コモンの右クリックメニューからイベント挿入コマンドを挿入できるようになりました。

ランチャーに登録したときのイベント挿入コマンドがそのまま使われます。
つまり、引数設定がそのまま引き継がれるため、よく使うイベント挿入コマンドを登録することで素早く配置できるようになります。

公式Discordサーバーを公開

WodistantのDiscordサーバーを作成して公開しました。
下記を気軽に行えることを目的としたサーバーとなります。

  • Wodistant
    • 更新/告知
    • 要望/バグ報告/質問/相談
    • 拡張機能の共有(プラグイン/カスタムウィンドウ)
      • ※各ユーザーが作成したものを共有できる状態にすることがメイン
  • ウディタ利用者間の交流の場提供
    • (コミュニティが各所に分散しているイメージなので中心的な場として使えるようになればと考えています)

ウディタ関係の人が集まるはずなので、
ウディタでゲーム開発をする者同士の交流目的でも使える状態にしています。

Wodistantを利用していない方もウディタユーザー間の交流目的で参加していただいてかまいません。
昔はウディタ使っていたけど、今は別のツールを使っているような方でも問題ないです。
ウディタを知っている人が集まる状態を達成できればと考えています。

下記招待リンクからご参加いただけますのでご自由にどうぞ。
https://discord.gg/ByP8fuHjf2

Wodistant経由でもDiscordサーバーに参加できるように対応

ヘルプメニューから招待リンクを開けるようにしました。
興味がありましたら下記からいつでも参加可能です。

おわりに

今回のDiscordサーバー公開で、そちらから要望やバグ報告ができるようになりましたが
従来通りツール内のフィードバック機能から報告していただいてかまいません。

更新告知/予告などは引き続きTwitter(X)やCi-en等でも行われるので
参加する予定がない方もご安心ください。

既にご参加いただいた方もありがとうございます。
次のWodistant更新時期は現時点では未定ですが、
これからも更新し続けていくので、引き続きよろしくお願いいたします。

K-Shin07 2024/05/27 21:07

【Rewind 開発進捗 #2】プログラミングパズルRPG

はじめに

以前の記事で共有した、開発中のプログラミングパズルRPGのRewindについて、
6ヵ月ぐらい経過したので、さすがにそろそろ進捗記事を書こうと思います。

来年のウディコンに向けて開発中なので、今年のウディコンには出ません。
ウディコンが来年も無事に開催されて、ゲームも無事完成したら参加します。

進捗的には来年なら不可能じゃないぐらいにはなってきたので
仕事とかなんやらで忙しくなって開発休止期間が多くならない限りは完成できそう感があります。

パズルステージ進捗

プログラミングパズルなので各ステージが存在するのですが
マップの見た目などの部分を除いてパズル部分が全30ステージ中24ステージが完成しています。
(ステージ数が今後の調整で増減する可能性はあります)

全体を加味したレベルデザインも行ったので
前半ステージまでならパズル要素はほぼ完成版相当で遊べる状態になってますね。

まだ実装していないステージ攻略に影響する仕様とかもあるので、まだまだ調整の必要はありますが前半のパズル要素体験としてはほぼ完成版相当だと思います。

プログラミングパズルのゲームシステムについて

ゲームシステム概要

以前の記事ではゲームシステムについてはまだ伏せていたので、
今回はどんな感じのゲームシステムなのかある程度公開しておきます。

まずステージ1(チュートリアル相当)の画面とクリアの流れがわかる画像を下記に貼ります。
ステージのクリア条件はシンプルで開始地点からゴール地点にたどり着くことです。
※一部ステージは全ての敵を倒すなど異なる条件のステージもあります

まず画面左に絵が付いたパネルとロックされたパネルが並んでいますが、これが現在利用可能な1ターンで行動できるアクションの種類を表しています。

最初にアンロックされているものは下記のパネルです。

  • 向いている前方に進む
  • 左に旋回して向きを変える
  • 右に旋回して向きを変える
  • パネルセット(後述)の任意のパネル位置へジャンプする

パネルセット

パネルセットは画面下部にある縦横3x10のパネルをセットできるマスのことです。
パネルは中央の左端にセットされたパネルから右方向へ順に実行されます。

右端に辿りつくと左端に戻ります。
このとき縦方向にずれることはありません。
上や下のパネルへ移動したい場合は基本的にジャンプ用のパネルを使う必要があります。

上で貼っていた画像の例だと下記行動をループします。

  • 前方に6マス移動 → 右に旋回 → ループ(前方6マス移動へ)

ステージ1の動画

上記を実際に動かしたプレイ動画はこんな感じです。

本ゲーム特有のシステム

ここまでの説明だとよくあるプログラミングパズルゲームとそう本質は変わらないのですが、このゲームでは次の特殊なシステムがあり、これにより独自のゲーム体験を実現しています。

各ステージは独立していない

一般的にプログラミングパズルゲームは各パズルステージが独立していてそれぞれのステージで効率化を行い、最短手数や最小コストを競うことができます。

本ゲームはステージが独立しておらず、全て連動します。
それにより各ステージ別の効率化に加え次の効率化を求められます。

  • 全ステージの組み合わせの最適化を行う

どんな風にステージの連動を実現しているかについては下記で説明していきます。

全ステージが連動している

本ゲームは成長要素があり、プレイヤーはステージをクリアすることで経験値を得てレベルを上げながら各種ステージを攻略していきます。
レベルを上げることで新しいパネルがアンロックされ、新しい解法が増えていきます。
また、HPや攻撃力も上がり、敵を倒すのに必要なターン数が削減できます。

ただし、一般的なRPGのレベル上げのように繰り返し敵を倒すことで任意で延々と成長し続けるような仕組みはありません。

ステージを挑戦する回数には制限があります。
その制限は各ステージ単位ではなく全てのステージで挑める回数が共有されます。
その回数を増やすためにはレベルを上げる必要があります。
つまり、挑戦回数に余裕があれば同じステージを複数回挑んで経験値を稼げます。

上記仕組みだけでは、ただ単にレベル上げという仕様によって全ステージが連動しただけで結局のところ最短手を目指すならステージ1から順に完璧な最適化をし続ければいいだけのゲーム体験になってしまい、一般的なプログラミングパズルとそう変わりません。

そこで本作では次の機能により、人によってゲームの進行の流れが大きく変わる可能性を実現しています。

過去に戻って過去のステージを改変できる

過去のステージ(挑戦1回目のステージなど)に戻って過去を改変するシステムがあります。

また、レベルを上げて新しいパネルをアンロックすると、そのパネルは永久的に使用可能になるという仕様になっており、過去に戻っても新しいパネルが利用できます。

これにより新しいパネルがアンロックされる度に、過去のステージで新しく最適化できるかもしれないという状況を生み出せます。

過去が最適化されることで獲得経験値が多くなりレベルが早期に上がることで、今まででは途中で複数回同じステージで経験値稼ぎしないといけなかった状況が改善され、別の攻略ルートが生まれるかもしれません。

新しいステージの攻略に詰まったら過去のステージを改良してみるといった遊び方ができるようになります。

何度も同じステージに挑戦する可能性があるゲームだからこそ、ステージのクリア条件が
『目的地点に移動する』や『敵を全て倒す』などのシンプルなルールになっています。

過去を最適化する目的

単純に効率よくレベルを上げて新しいステージを攻略しやすくすることや、
最適化という遊びそのものを楽しみたいといった要素以外にも最適化を促す目的があります。

このゲームはRPGのファンタジー世界みたいな世界観になっていて
その中でストーリーが展開されます。
そしてターン数の経過が世界の時間経過を意味しています。

ゲーム内では一定ターン数経過するまでにたどり着けるかどうかで
ステージの状況などが変化する要素があります。

その状況を変えるために過去に戻ってターン数を短くしたり、別の攻略ルートを探したりするモチベーションが生まれるかもしれません。



ひとまずゲームシステムの解説はこれぐらいにしておきます。
オンラインランキング機能も実装する予定なので、ゲームクリアを最短ターンで競うみたいなこともできるようにする予定です。
紹介していないシステムなどについてはおいおい紹介していけたらと思います。


グラフィック関連進捗

見た目はほとんど仮の画像が多い状態なので
少しずつ正式な画像を作っていっています。

直近で対応が入ったのは下記ですね。

  • ワールドマップ
  • 上部のUI(タイムラインUI)
  • ワールドマップ上での下部UI(アクションスロットUI)

各ステージのマップ背景は以前書いた記事時点から特に進捗はないので
そろそろ少しずつ進めていかないと後で苦労することになりそうです。

パズルステージではないものも含めて背景が必要なマップ数は全部で35マップ+αになる予定で、現状は17マップ完成している状態です。


さいごに

だいぶ遊べる状態にはなってきつつありますが、
これでも見た目とかはまだまだ仮部分が多いのでそういったところは正式なものにしていきたいですね。

特にキャラクターデザインがどんどん後回しになってて手付かず状態なのもそろそろどうにかしないといけないです。
いいかげんキャラクターはマップ上に表示させたいですね。

ストーリー部分も今はすべてのイベントでテスト用のキャラチップや顔グラフィックを出しているだけの状態になっちゃってます。

今後はそういった部分に手を出し始めつつ、まだ反映していない遊びに影響する仕様を実装していきたいところです。

フォロワー以上限定無料

ストーリー部分はゲーム上でどんな感じなのかを動画でチラ見せ。

無料

K-Shin07 2024/04/12 20:42

【Wodistant】ウディタ開発補助ツールをVer1.3.3へ更新(新機能バグチェッカー公開!)

ウディタでのゲーム開発効率を上げるためのツールである
WodistantをVer1.3.3に更新しました!
※最新版の取得はツール内のアップデート機能か公式サイトからダウンロードしてください
実装機能を下記で紹介しておきます。

コモンイベントバグチェッカー機能追加

全てのコモンイベントを分析して
バグになりうる箇所を検出してくれる機能を実装しました。
いわゆる静的解析をしてバグのチェックや品質の低いコードを検出するというものです。

是非みなさんのゲームでも試してみてどれくらい検出されるか見てみてください。
自分は約60件ほど検出されて、いくつかの特に問題にはならないバグと1件のいつか致命的になるバグが見つかりました。
※検出されたからと言って必ずバグっているわけではありません。検出された警告内容と処理の場所を見て問題がないか確認してみましょう。

現在サポートしているチェック内容

現時点で実装していものを以下に列挙しておきます。
※バグチェックというより品質チェックみたいな項目も含みます
※今後のアップデートでチェック対象が増える可能性があります。

  • 無意味な変数操作
    • 例:CSelf0 += 0 + 0
    • ゼロ代入をしたかった初期化ミスや不要になった処理消し忘れなど
  • 無意味な文字列操作
    • 例:CSelf5 += ""
  • コモンイベント名が見つからない
    • コモンイベント名を変更したあとに修正していない
      名前呼び出しのイベント挿入コマンドの検知など
  • コモンイベントの引数が一致しない
    • コモンイベント本体の引数を増やしたり減らしたりした後に
      コモンイベントを呼び出しているイベント挿入コマンドを修正していないものを検知など
  • 名前/番号呼出のコモンイベントが混在
    • コモンイベントの呼び出し方を統一している場合のコマンド挿入ミスチェック
  • ファイルが見つからない
    • ピクチャ表示で指定した画像ファイルが
      ファイル名を変えた等の原因で見つからないなど
  • 上記以外を含む条件分岐内のラベル地点
    • 上記以外を含んでいる条件分岐内のラベル地点へジャンプすると
      上記以外の処理が分岐終了後に続けて実行されてしまうため、
      その問題に該当するコマンドがないかチェック
  • 無効な同じ名前のラベル地点
    • 同じ名前のラベル地点が複数ある場合は2つ目以降が無視されるため
      名前の指定が間違っていないかチェック
  • ラベルジャンプ先が見つからない
    • ラベルジャンプで指定している名前と同じラベル地点が見つからない
      名前の指定が間違っていないかチェック
  • どこからもジャンプされないラベル地点
    • ラベル地点が挿入されているが名前が一致するラベルジャンプが見つからない
      名前の指定が間違っていないかチェック
  • 行数が多すぎる(3000行以上)
    • 行数が多すぎて修正や改善、処理の把握がしづらくなっているコモンのチェック
  • ネストが深すぎる(30以上)
    • 条件分岐が入れ子になりすぎているような箇所のチェック
  • 番号呼び出しのコモンイベントがある(オプション機能)
    • 名前呼び出しに統一している場合はコマンド挿入ミスをチェックできる
  • 直接番号指定のピクチャ表示がある(オプション機能)
    • ピクチャ番号を動的に生成して管理している場合の対応漏れチェックができる

実行方法

ウディタと接続中にメニューバーの
『ウディタ(W) > コモンイベントバグチェッカー』から起動できます。

この機能の目的

既に実装済みの処理などでバグがないと思っていても
たまたま今は正しく動作しているような場合があります。

そういったものは実際にバグが発生する状況にならないと見つからないことが多いため、それらの怪しいかもしれない処理を検出して、事前に対処するのが目的となります。

検出例

例えば、ある処理を回数付きループ等でループしながら処理する箇所があるとします。
ループ前に値を『0』に初期化して、ループ内で+1して順々に処理しているような実装パターンはよくあることでしょう。

このときに最初の『0』に初期化する処理が次のようになっていたら、1回目は正しく動作しますが、その処理をもう一度実行したときにバグります。
(0に初期化するはずが0を足してしまっている)

■変数操作: CSelf10[カウント] += 0 + 0 
■回数付きループ [ 10 ]回
 |■可変DB書込:DB[ 0 : CSelf10[カウント] : 0 ]  (- : - : -) =  0
 |■変数操作: CSelf10[カウント] += 1 + 0 
 |■
◇ループここまで◇◇

本バグチェッカーを使用すると↑の 【CSelf10 += 0 + 0】が
無意味な変数操作として検出
されます。

ゲーム上でよく実行される処理ならすぐにバグが発生しますが
たまにしか実行しない処理の場合は1回目が必ず成功してしまうため
バグを見逃してしまう可能性があります。

利用にあたっての注意点

バグチェッカーでチェックできるようになったからといって
これを過信せず、日々の処理実装時にこういった問題にならないかどうかを
意識しながら実装を行いましょう。

『後で一気にチェックしたら1000件以上ヒットした!』みたいな状態になると
それをいちいちチェックして直すのも大変です。

コメント文挿入機能(F2キー)でデバッグ文対応

従来まではコメント文しか挿入できませんでしたが
今回からデバッグ文も挿入できます。

  • コメント文の挿入
    • Ctrl+Enter または OKボタン
  • デバッグ文の挿入
    • Ctrl+Shift+Enter または デバッグ文ボタン

フィードバッグを送る機能実装

メニューバーの『ヘルプ(H) -> フィードバックを送る(要望/バグ報告等)』で
フィードバックを開発者に送れるようになりました。

バグ報告やこんな機能が欲しい!といったものがあれば
お気軽にお送りいただければと思います。


開発中の機能(α/β)を有効化する機能実装

オプションに開発中の機能を有効化する項目が追加されました。
メニューバーの下記でON/OFFできます。(デフォルトはOFFです)
『ファイル(F) -> オプション(O) -> 開発中機能(α/β機能)の有効化』

現状はVer1.4.0 α版で公開していた
『ウディタデバッガー機能(α版)』が利用できるようになります。
これに伴いVer1.4.0α版は公開を停止しました。
デバッガー機能を試したい方はこちらの機能を有効にしてご利用ください。

ウディタデバッガー機能自体については下記記事を参照してください。
【Wodistant】待望のウディタデバッガー機能のα版公開!


そのほか変更点

ウディタVer3.310のファイル形式に対応化

ウディタVer3.310以降は以前のWodistantで読み込めないため、
これらのウディタバージョンを利用する方は本Ver1.3.3.0以降に更新してください

追記:まだ一部の状況で読み込めないことがあったので修正しました。お手数をおかけしますがVer1.3.3.3以降に更新していただくことで改善されます。

ウディタVer3.310までの約1年分の仕様変更に対応

イベントコマンドの表記仕様変更や新コマンドに正しく対応化

.NET Frameworkを4.5.2→4.7.2へ更新

古いOSや最新のWindowsアップデートを適用していない場合は
起動できなくなる場合があります。

万が一起動できない場合は下記URLから『.NET Framework 4.7.2 ランタイム』をダウンロード/インストールしてください。
https://dotnet.microsoft.com/ja-jp/download/dotnet-framework/net472

リンクが切れている場合は『.NET Framework 4.7.2 インストール』などをウェブブラウザで検索してください。



Ver1.3.3.0のアップデート内容は以上です。
Wodistantを利用して、よきウディタでのゲーム開発ライフを!

K-Shin07 2024/04/06 15:49

ウディタでのゲーム開発者が行えるセキュリティ対策

はじめに

本記事について

ウディタを利用するゲーム開発者が行えるセキュリティ対策について
いくつかまとめたいと思います。

ただし、対策例みたいものを出しているものもありますが
ここでは具体的な実装の話はあまりされません。
攻撃者側がこれを見れば対策されてしまう可能性があるからです。

基本的にはここで知った情報をもとに
各開発者が独自にアレンジや応用して対策していくことが重要です。

こういった対策は対応がどれも面倒で時間がかかるものが多いです。
自分の作品でそこまで対策を施すか必要があるかどうかはよく検討してみましょう。

また、ここで書かれている情報はウディタ用に書かれています。
ウディタ以外でのゲーム開発でも有効なものが含まれていますが
他の環境では手段として適切でない可能性があるので、ご了承ください。

ここで書かれない情報について

対策の手段が書いたままの1通りしかないような情報は
たとえここで記載した内容よりも有用であったとしてもあまり記載していません。

そういったものは各開発者がみんな同じように対策すれば、
攻撃者側も同じように対策を破ることで、一網打尽にされるためです。



セーブデータの改ざん対策

セーブデータの改ざんによる
不正なゲームプレイの対策についてです。

オンラインランキング機能を持つようなゲームを作る際は
特に重要になります。

ウディタのセーブ機能で保存されたセーブファイルも
中身を解析して簡単に読み込めるようなものではないのですが、
大多数のウディタ利用者が使用するため、
何者かによって解析されてしまう可能性が非常に高いです。

とは言え慣れた人でもない限り、
独自にセーブファイルを作るのは敷居が高いと思います。
雑な実装ならウディタのセーブファイルよりも簡単に突破されてしまうでしょう。

特にウディタはユーザーが独自の完全なバイナリファイルを出力できないようになっているため、
保存したファイルは中身が見られやすいテキストファイルになってしまいます。

ここではウディタのセーブ機能を使いつつも
改ざんをなるべく避ける対策方法について記載します。

チェックサムによる改ざん検知

チェックサムと呼ばれる改ざんを検知する一般的な手法があります。

例えばセーブデータとして保存したい複数の数値データがあったとしたら、
それらの数値を全て足して特定の数値で割った余り『検知用の数値』として追加でセーブファイルに保存します。

そしてセーブファイルを読み込んだときに、保存したときと同じように『検知用の数値』を求めなおして、セーブファイルに保存していた『検知用の数値』と比較します。

これで数値が同じじゃなければセーブファイルが改ざんされたことがわかります。

以下にわかりやすく図で示しました。

上記のようにセーブファイルに保存したHPやMPが書き換えられても
読み込み時に検知できるようになります。

もちろん上記例だと検知用の数値が±255の範囲しか取らないため
改ざんされていても偶然検知用数値が一致する可能性はあります。

実際に実装する場合は数値の計算方法をアレンジしましょう。
計算結果さえ一致する処理なら、何をしてもかまいません。

ウディタ特有の計算処理実装時の注意点

ウディタには数値計算が±20億の範囲に丸めこまれるパターンがあります。

例えば『デバッグ文』の隠しコマンドである【変数監視機能 ValWatch】を
使用していると数値計算が常に±20億の範囲に丸め込まれてしまい、
検知用の数値を求めるときにセーブファイルに保存した値との
数値誤差が発生する可能性があります。

これについては注意しておきましょう。
基本的には開発者がテストプレイしているときにしか遭遇しないはずなので
実際のゲームを遊ぶ側に影響はないと思います。

独自チェックサム機能を搭載したセーブコモンを配布したい場合の注意点

基本的には独自でコモンを作って自分自身で利用するほうが安全ではありますが
このような機能を持ったコモンを配布したい場合は
必ず利用者側で計算結果を調整できる機能や余地を用意してあげましょう。
(単体のコモン配布やRPG作成用の独自の大規模コモンにチェックサム機能付きセーブ機能を搭載する場合など)

例えば利用者が変更可能な『キーとなる数値』を用意して
その値次第で計算結果が変わるような仕組みです。

↑で例に挙げていたチェックサムの計算例でいうと割るときに使用していた
『256』を『キーとなる数値』とするようなイメージです。
利用者がこれを『600』にすれば計算結果が変わるので解析されにくくなります。
(みんなが同じものを使うと解析されてしまったときに全ての人に影響がでます)

ゲーム名に空白を入れる

ウディタのセーブ機能は同じゲームから出力されたセーブファイルが読み込めます。
これはゲーム名が一致するかどうかで判定されるので
同じ名前のゲームがあればセーブファイルが読み込めてしまう可能性があります。

ウディタの基本システムを利用している方や
他の人が作成した基本システムのような大規模コモンを使用している方は
同じようなCDB構造になる可能性が高いので読み込めてしまう可能性も高いです。

そこでゲーム名に見えない空白を含めることで
仮に同じ名前のゲームから出力したセーブファイルが読み込まれたとしても
弾ける可能性が高くなります。

もちろん開発中のゲームの名前を変更すると
以前のセーブファイルが読み込めなくなる
のでご注意ください。





不正なゲーム実行を阻止

配布版でのテストプレイ実行を阻止

人によってはテストプレイ中だけ実行される
デバッグ機能を実装している方もいるでしょう。

実装は主に『Sys112:[読]テストプレイ中?(1=YES) 』を判定して
デバッグ機能を動かすかどうかを判断していると思います。

これを無理やりONにされて実行されてしまうケースがあります。

以下のような対策が可能です。

  • .wolfファイルが存在する場合はテストプレイ中判定になっても
    デバッグ機能を実行しない
  • プロテクト用のファイルがあれば同様に実行しない

これについては自分が配布しているコモンがあるので、共有しておきます。
そのまま使ってもよいですし、中身を参考にして独自に組んでも構いません。
https://silsec.sakura.ne.jp/WolfRPGEditor/CommonList/html/tdv201.html#16806970059801

他のゲーム配信プラットフォームに勝手に配信されないようにする

このようなケースがどれだけ発生しているのかは
自分は把握していないのですが、ある程度こういったものを防止する手段はあります。
(この対策を入れても完全に防げる保証はありません)

Steam

Steamで実行する場合下記DLLがゲームに同梱されています。

  • steam_api.dll
    • ↑ウディタの場合はこちらだと思います
  • steam_api64.dll

Steamに配信する予定がないものはGame.exeと同じ階層に
これらのDLLが配置されていないかどうかをチェックするとよさそうです。
見つかったら即時ゲームが終了するようなイメージです。

PLiCy

PLiCy上で動作しているときは
下記システム文字列変数に専用の文字列が格納されるみたいです。

  • システム文字列変数SysS[19](9900019)

PLiCyで配信するつもりがないなら、
上記に『PLiCy』という文字列が含まれているか
チェックすることで弾くことができそうです。


▼ システム文字列変数についての詳細はPLiCyのよくある質問に記載されています
https://plicy.net/ToolFAQ/WolfRPGEditor#3275a3575c128f54cabb900c9d58c140




秘匿性の高い文字列や数値の暗号化

ゲーム実行中のコモンセルフやDBなどの変数に格納されているデータは
外部から読み取られる可能性があります。

チート対策が必要でもない限り、
基本的にはほとんどの変数は読み取られてもかまわないと思いますが
サーバーに接続する際に必要な文字列情報など外部に絶対流出させたくない値
なるべく生の値を変数に持たないようにしましょう。

例えば流出させたくない文字列が『ABC』だとして
使用していない間は暗号化を施して『DEF』に変えておくことで仮に読み取られても、復号化されない限りは問題になりません。

暗号化の方法

暗号化って言われても結局どうすればいいのか
まったく分からない人も多いと思います。

ここでいう暗号化というのは元の値に戻す復号化が可能なものを指します。
暗号化の手法はたくさんありますが
ここではビット演算を利用した暗号化について記載します。

ウディタではビット演算は論理積(AND)しか公式では対応していないため
コモンイベントでビット演算を実装するところから始まります。
(論理積は変数操作にある『ビット積』のことです)

一式実装したコモンイベントは下記で配布しているので
めんどくさくて自分で実装したくない方や参考にしたい方はこちらをどうぞ。
https://silsec.sakura.ne.jp/WolfRPGEditor/CommonList/html/tdv249.html#14400752006401

XOR暗号

ビット演算のXOR(排他的論理和)を使用することで簡単に暗号化と復号化ができます。
例えば以下のようなことができます。

『100』 →暗号化(XOR)→ 『65435』 →復号化(XOR)→ 『100』  

数値『100』と『65435』は一見関連性が無いように見えますが
2進数で表すと次のようになります。

0000 0000 0110 0100 ←100
1111 1111 1001 1011 ←65435

『0』と『1』がそれぞれ反転していることがわかると思います。
こういった反転をXORを使うことで簡単にできます。
反転しているだけなのでもう一度反転すると元の値に戻るという仕組みです。

またウディタで扱う数値は全て『32ビット』です。
これは2進数にすると『0』または『1』が32個並ぶ数値という意味です。

それを踏まえて実際のウディタの数値『100』『65435』を
正しく2進数で表示すると下記になります。

0000 0000 0000 0000 0000 0000 0110 0100 ←100
0000 0000 0000 0000 1111 1111 1001 1011 ←65435

左側にある『0』は反転していません。
XORは反転させたい範囲や位置を自分で決めることができるからです。

例えば上記例では次のようにXORされています。

計算式:100 XOR 65535 → 計算結果 65435

それぞれ2進数で表記
0000 0000 0000 0000 0000 0000 0110 0100 ←100
0000 0000 0000 0000 1111 1111 1111 1111 ←65535
0000 0000 0000 0000 1111 1111 1001 1011 ←65435

『100』に対して『65535』をXORした結果が『65435』になっています。
この『65535』の2進数は右半分が全て『1』です。

『1』になっている箇所が反転される位置を表しています。

XORに使用する値を変えることで反転する位置を自由に変えられます。
この使用する値がバレなければ暗号化された数値は元の値がわかりません。

これがXOR暗号です。

XORは別々の値で連続して反転させても復号化できます。
復号化したい場合は逆の順番でXORを行いましょう。

以下に例を置いておきます。

▼ 58 を暗号化
1回目:58 XOR 255 →計算結果 197
2回目:197 XOR 170 →計算結果 111
3回目 : 111 XOR 240 →計算結果 159
58 を暗号化した結果は 159

▼ 159 を復号化して58を求める
1回目:159 XOR 240 →計算結果 111
2回目:111 XOR 170 →計算結果 197
3回目 : 197 XOR 255 →計算結果 58
159 を復号化した結果は 58

↑で共有していたコモンイベントを導入すればそのまま動かせる
例と同じ処理が可能なイベントコードも貼っておきます。

WoditorEvCOMMAND_START
[103][0,1]<0>()("暗号化と復号化のサンプル")
[121][4,0]<0>(1600020,58,0,0)()
[106][0,1]<0>()("■■■■■■■■■■■■■■")
[106][0,1]<0>()("▼ \cself[20] を暗号化")
[300][5,1]<0>(0,16777218,1600020,255,1600021)("◇排他的論理和演算<XOR>")
[106][0,1]<0>()(">> \cself[21]")
[300][5,1]<0>(0,16777218,1600021,170,1600021)("◇排他的論理和演算<XOR>")
[106][0,1]<0>()(">> \cself[21]")
[300][5,1]<0>(0,16777218,1600021,240,1600021)("◇排他的論理和演算<XOR>")
[106][0,1]<0>()("暗号化結果:\cself[21]")
[103][0,1]<0>()(" ")
[106][0,1]<0>()("▼ \cself[21] を復号化")
[300][5,1]<0>(0,16777218,1600021,240,1600022)("◇排他的論理和演算<XOR>")
[106][0,1]<0>()(">> \cself[22]")
[300][5,1]<0>(0,16777218,1600022,170,1600022)("◇排他的論理和演算<XOR>")
[106][0,1]<0>()(">> \cself[22]")
[300][5,1]<0>(0,16777218,1600022,255,1600022)("◇排他的論理和演算<XOR>")
[106][0,1]<0>()("復号化結果:\cself[22]")
WoditorEvCOMMAND_END

ちなみにWindowsの電卓を使えば
100などの数値(10進数)を2進数にしたときの並びが確認できます。
もちろんXORの計算も可能です。(ビット演算は『ビット単位』を押すと可能)
2進数の並びをささっと確認したい場合に便利です。
(ウディタの処理上で確認したい場合は↑で共有していたコモンイベントに2進数文字列に変換するコモンが同梱されているのでそちらをご利用ください)

▼ 電卓の左上の『三』を押してプログラマーモードへ切り替えると2進数確認が可能


シフト演算による暗号化

上記ではXORによるビットの反転によって暗号化/復号化を実現していました。
ここではビットシフトを利用したビットの移動によって暗号化を行います。

以下に例を出します。

暗号化したい値:96
 0110 0000  ←96
 
 シフト演算でビットを右に3個ずらす
 0000 1100  ←12
 
 暗号化されて『12』が得られる
 
 『12』を復号化する(ビットを反対の左方向に3個ずらす)
 0110 0000  ←96
 
 復号化されて元の値『96』が得られる

このようにビットをシフトすることで暗号化と復号化を実現可能です。

↑で共有していたコモンイベントを利用する場合は
下記コモンで同じことを実現できます。
・◇左ローテートシフト演算
・◇右ローテートシフト演算

ローテートではないシフト演算コモンを利用すると
右端または左端で溢れてしまったビットの情報が無くなってしまうため
復号化できなくなるのでご注意ください。





ウディタ感を減らす

ゲームフォルダを開いて
ぱっと見でウディタとわかるような状態になっていると解析されやすいです。

効果としてはどれも弱いですが
ウディタ感無くすことで抽出されにくくできます。

Game.exeのアイコンを差し替える

これだけでウディタ感を取り除けます。

差し替えている人は多いと思うので、効果としてはかなり弱いですが
ゲーム開発ツール側に詳しくない人が何かしらの抽出ツールを利用している場合
ウディタと気づかれない可能性はあります。

ゲームランチャーを用意する

※この手法はウディコン投稿作品ではできませんのでご注意ください(外部のexeの同梱禁止)

ゲーム起動用のexeを別途用意して、
実際のウディタのゲームフォルダを隠して用意したexeからゲームを起動します。

こうすることでウディタ製のゲームフォルダに良くあるファイル構成が
見られにくくなり、ウディタと気づかれなくなる可能性が増えます。





抽出されてしまった場合を想定した対策

ゲームデータの抽出を完全に100%防ぐ手段は存在しません。
どうあがいても本気で解析されればいつかは抽出されてしまいます。

ゲーム会社が開発したAAAタイトルでも解析されてしまっています。
このことからわかるように個人がどれだけ頑張っても
目を付けれてしまったらいつかは破られてしまいます。

とはいえ何かしら対策が入っている限り、
すぐに破られることはなくなるため、
攻撃者が理解できなかったり、めんどくさくなったりして
あきらめる可能性も高くなります。

ここでは暗号化された.wolfファイルが復号化されてしまい、
全てのファイルが抽出されてしまったとしても
ある程度解析を防ぐ手段について記載します。
※ただしどれも対応が面倒なため安易におすすめできない手法です。

プログラム(コモンイベント)の難読化

難読化について

(最初に言っておきますが、難読化はかなりめんどくさいです。
効果としては理解されにくくなるだけですし、デメリットもあるので
初心者にはお勧めしません)

抽出されるとコモンイベントの中身も全て見られてしまいます。
コモンへの理解がある人に抽出されてしまったなら
改造されてしまう可能性もあります。

とはいえ他人のコードを読むのはそれなりに経験が必要です。
さらにコードが読みにくくなっていれば、なおのことです。

一般的な手法でウディタでもできそうな範囲であれば下記になると思います。

  • コモンイベント名やコモンセルフ/DB名など名前全般を意味のないものにする
  • コメント文/デバッグ文を無くす
  • 不要なイベントコマンドを挟む(意味のない処理)

ただこれらを行うと開発者自身も作業しにくくなります。
もしやるとしたら配布する前に自動で変換するような対応が現実的でしょう。
ただしゲームをアプデする度に
自動変換しなおさないといけないのでめんどくさいです。

CommonEvent.datを別のプログラムで読み込めるようにして
自動変換するプログラムを組めるレベルの人でない限り、
あまりおすすめできない手法となります。

難読化を自動で行う

私が下記で公開している処理最適化用の『WoditorOptimizer』で
似たようなことは可能です。
ただし9年ぐらい前に作った処理なため、やるのは自己責任でお願いします。(ウディタ3に対応済みではある)
https://alpha-stella.com/tools
(一応2025年~2026年あたりに処理を最新にする予定はあります。厳密には今開発中のゲームが完成したあと)

上記ツールで対応できるのは下記です。

  • コメント文を消す
  • デバッグ文を消す
  • コモンイベント名をぐちゃぐちゃにする
    • ※実行できる条件があります
      • \cself[5]など文字列変数でコモンイベントを呼び出していない
      • マップイベントからコモンイベントを名前呼び出ししているゲームでは使えない
  • コモンイベントのメモ欄を空にする
  • コモンセルフ名を空にする
  • コモンイベントの数値/文字列入力の各引数名および返り値名を空にする
  • コモンイベントの色をランダムに変更する
  • ラベル名を変える(ラベル名の最適化処理で変わる)

↓試しに開発中のゲームに上記難読化を適応させてみました。
こんな感じになります。相当解読しづらくなったと思います。
※もちろんゲームは正しく動作します

画像ファイルの対策

どうしても取り出されたくない画像ファイルがある場合は
画像ファイル自体に何かしらの変換をかけておいて
ウディタ上で表示するときに正しい画像に戻す
という手法が使えそうです。

ただし、取り出されたときに正しい画像に戻すのが
とてつもなくめんどくさくなるだけで完全に防ぐことはできないのでご注意ください。
(それにゲーム画面をスクショされれば正しい画像のまま取り出せてしまいます)

例としては以下のようなイメージです。
単に画像が分割されたり、90度刻みで回転しているだけならウディタ上でも元の画像に戻せます。

※改変禁止の素材サイトの画像を使用しているなら、場合によっては改変とみなされる可能性があるかもしれないのでご注意ください。


テキストファイル(CSVも含む)の暗号化

Dataフォルダ内のテキストファイルにゲーム上での会話などの
イベントを記載していることがあると思います。

特に開発に慣れてきた人は
だいたいこのような仕組みを実装している人が多いと思います。
(イベントが書かれたテキストファイル(スクリプト)を読み込んでゲーム内でイベントを動かすなど)

こういったデータの文字列に暗号化をかけておいて
ゲーム内で読み込んだあとに復号化する
ことで
テキストファイルを開かれてしまっても何が書いてあるかわからなくできます。

ただし多言語翻訳とかをする場合に障害になる可能性があるので
海外展開も視野に入れている方は翻訳に影響がないような仕組みを検討する必要があるかもしれません。
(スクリプト内にはテキストのIDだけ入っているようにして別途テキストを管理する対応など)


ファイルの拡張子偽装

.txt/.csvなどのテキストファイルの拡張子をそのままにせず
『.bin』などの別の拡張子に偽装することで何のデータか
ぱっと見わかりにくくなり、解析の手間が増えます。

もちろん拡張子を変えてもゲーム上で正しく動作するかは
よく確認するようにしましょう。


フォルダ構成を分かりにくくする

Dataフォルダ内の各フォルダ名を意味のないものに変えたり
不必要に階層化することで抽出されたときに判別しにくくなります。
※ファイルパスが長くなればなるほどゲーム上でファイルに対する処理負荷が微増していくのでご注意ください

この手法はファイルパスが変わってしまう上に
開発中もめんどくさくなるため、本当に対応する場合は
配布前に実行すれば勝手にやってくれるなどの自動化が必須だと思います。





GET送信とPOST送信の選択

ウディタのダウンロード機能でGET送信/POST送信を利用して
サーバーなどにアクセスすることができます。

サーバーにデータを送る場合にどちらの方法でも送信できますが
GET送信の場合はアクセス用のURLに全てのパラメータが載るため
情報が丸見えになりやすいです。

外部に漏らしたくないようなデータを送信する際は
POST送信でデータを送るようにすることで安全性が向上します。





WOLF RPG エディターPROの利用

プロ版には追加のプロテクト機能が搭載されています。
それを利用することで通常版よりもセキュリティを向上可能です。

ただし、通常の暗号化同様破られるリスクは存在するため
過信しすぎずゲーム開発者自身も何かしらの対策をすることが重要です。

▼ WOLF RPG エディターPRO
https://silversecond.booth.pm/items/4302198
※ウディコンなどでは利用できないのでご注意ください。





まとめ

ここに記載された対策はあくまでも対応例です。
各作者が『こういう風にアレンジすればもっと安全になるんじゃない?』
といった形でアプローチを変えたり応用したり、
複数の対策を組み合わせて自身の作品を守ることが重要です。
(POST送信でデータを送るときに暗号化してチェックサムで改ざん検知もするみたいなイメージ)

ここまで読んでくださり、ありがとうございます。

自身の作品に対する解析やチート行為で悩んでいる方や
対策したいけど何を考えればいいのかわからなかった方に
何かしらの気づきや対応のきっかけを与えられていたら幸いです。

K-Shin07 2023/12/17 16:26

プロシージャル生成による効果音作成ツール『GameSynth』検証

はじめに

前から気になっていたプロシージャルサウンド合成による
効果音作成が可能な『GameSynth』を試しに使ってみました。

開発中のゲーム用効果音を作ってみて、
どんな感じだったのかを軽くまとめてみます。

そもそもプロシージャル生成とは

データを作る際に手作業で順々に作っていくのではなく、
処理を連続的に組み合わせてデータを生成していくものになります。

例えば次のような工程でデータを作成しているとします。

  • 処理A → 処理B → 処理C → データ完成

この場合、常に上記工程を辿ってデータが自動的に生成されます。

手作業でデータを作成している場合は『A』で行った作業工程だけを調整して
新しくデータを確認したい場合は、
『A』の調整後に『B』→『C』ともう一度加工する必要があると思います。

プロシージャル生成では全ての工程が『処理』になっているため
『A』を調整したら自動的に『B』→『C』も処理されて常に最新のデータが生成されます。

これにより、調整や工程の抜き差しが簡単に行えます。

自分は3Dモデルの作成で『Houdini』を主に使っているのですが
それもプロシージャル生成によるツールなため、
初めて使ったときは各途中工程の3Dモデル状態がいつでも確認、調整できて感動しました。

以下の動画はHoudiniによるプロシージャル生成で自作した歯車です。
完成したあと各工程のパラメータを調整して歯車の歯数を変えたり、
外見を変えたりしています。

効果音作成ツール『GameSynth』を使ってみた

サウンドモデルの選択

GameSynthでは基本的に下記モード(サウンドモデル)のどれかを選択して
効果音を作成するようです。

  • Whooshモデル(風切り音)
    • 剣を振るなどの風に関する音を作りやすい
  • Impactモデル(打撃や摩擦音)
    • 物がぶつかる音や引きずる音などを作りやすい
  • Retroモデル(8ビットゲーム効果音)
    • レトロゲーム音やUIの操作音などを作りやすい
  • Modularモデル(プロシージャルサウンドモデルを組み立てる)
    • プロシージャル生成手法で音を作り上げていくモデル
    • これを使えば基本的に何でも作れる
    • 他のモデルで作った音をベースに加工していくことも可能
    • ベースとなる音源(炎、風など)はたくさんあるので音を用意しなくてそれを加工していくだけでOK
    • 今回の記事で主に使用するモデル
  • Particlesモデル(断続的に発生する音)
    • キラキラ音や瓦礫が崩れる音など特定の音が何度も発生するような音が作りやすい
    • 作成した効果音を音源として利用する
  • VoiceFXモデル(ボイス加工系)
    • 持っているボイスに対して各種エフェクトをかける機能
  • Footstepsモデル(足音)
    • いろんなパターンの足音を簡単に作成できるモデル
  • Weatherモデル(天候に関する音)
    • 雨や暴風、雷、雹などの天候に関する環境音を簡単に作成できるモデル

基本的にModularモデルを今回使用しますが
他のモデルは簡単に扱いやすいものが多いので
下記で軽くいくつか紹介してみます。

Whooshモデル(風切り音)

以下の動画ような感じで風に関する音を作れます。
マウスで線を描いて軌跡に沿って音をならせます。
描いた線をランダムにほかの形状に変えることもできます。
※ペンタブを使用すると筆圧なども考慮されるようです

Impactモデル(打撃や摩擦音)

以下のように打撃や摩擦に関する音を作れます。

Retroモデル(8ビットゲーム効果音)

以下のようにレトロ風の効果音が作れます。

Modularモデル(プロシージャル生成)

以下のように各種ノードを組み合わせて音を作っていきます。
慣れるまでは時間がかかりますが、
扱えるノードが増えれば増えるほど自由に音を作っていけるようになります。

Particlesモデル(断続的に発生する音)

以下のように任意の効果音をベースとして
音をパーティクル的に発生させて作ります。
※ベースの効果音を複数にすることもできます

VoiceFXモデル(ボイス加工系)

以下のように任意のボイスに対してエフェクトを付与できます。

Footstepsモデル(足音)

以下のように足音をシミュレートすることができます。


Weatherモデル(天候に関する音)

以下のように雨や雷などの環境音をシミュレートすることができます。
※雨の強さや雨が当たる地面の材質を変更するなど各種パラメータを変更可能です。


実際にゲームの効果音を作ってみた

今回は主にModularモデルを使用してプロシージャルに効果音を作成してみます。

最近作ってたエフェクトの効果音を試しに作ってみました。
まずは完成品の動画です。


前半のエフェクトと後半のエフェクトで別々の効果音を作っています。
最初の効果音はこのようなノード構成になりました。

上記ノードを見るとなんだか複雑そうに感じると思いますが
実際に作業しているときは1つ目のノードから順々に作っていくので
思ってたよりは複雑に感じないです。
※上記では用意していないですがコメント文も配置できます

上記画像はいきなり他人のプログラムの完成したソースコードを
見せられているようなものなので
自分で組めばどこで何をしているかは把握できますね。


音を再生する際に動画も同時再生する機能があるのですが
こちらを利用すると実際のエフェクトを見ながら確認ができるので
音の調整がとてもしやすかったです。


ノードの種類がかなり多いので自分もまだほとんど理解できていません。
それでも10種類ぐらい使えるだけで
充分いろいろ作れるので意外となんとかなりそうです。

ツール内の『help > Manuals > モジュール周期表』を見ればどれがどのような機能を持っているか確認できる(動画もある)のでまずはここを見ていくのがよさそうですね。

プリセットもたくさんあるのでまずはそれを確認してみるのもおすすめです。


また、各ノードのパラメータを時間経過で変化させることが可能な
『Automation Curve』という機能があります。
このあたりの機能はなるべく早めに扱えるようになるとよさそうです。
(途中からピッチを急激に上げて音が高くなるような表現や音量のフェードコントロールなどが自由にできるようになります)



ちなみに後半のエフェクトの効果音はこのようなノード構成になりました。


まとめ

Modularモデル以外のサウンドモデルは割と雑に使っても
それなりに簡単に効果音が作れると思います。

Modularモデルは自在に音が作れますが
慣れるまでは時間がかかりそうですね。

ちなみに上記で作ったエフェクト効果音の作業時間は
だいたい1時間ちょいぐらいです。
機能を理解しつつ作っていたので、
理解が進めばもっと早く、もっとイメージ通りに作れるようになりそうですね。

一度作ったノードは使いまわすことも可能なので
作れば作るほど音の表現を自在に作れるようになりそうです。

今作っているゲームの効果音は
GameSynthを使って作ってみようと思います。

フォロワー向けに
他の作ってみた効果音やそのノード構成をいくつか公開しておきます。
(大したものではないです)

フォロワー以上限定無料

無料プラン限定特典を受け取ることができます

無料

« 1 2 3

限定特典から探す

記事のタグから探す

月別アーカイブ

記事を検索