サイトロゴ

フリーのRTSRPG「Millennium Legend」をメインとしたブログ、その他すぴブレの改造講座など。
 
いつも通り、講座でないことを書くのは省略させてください。

今回のこの記事にてすぴブレのシステムの限界について検証して行きたいと思います。
とはいえ、調べること、検証することが多くなり、大半は予想や推察となっています。
今後この記事には書き足したりする可能性が高いです。

最終更新日時 10/15 12時ぐらい (その他、未検証などの情報)

以下の文章中に出てくる記号の意味を示しておきます。
×:どうやっても不可能
:要検証
:理論上可能
:十分可能
:可能なことを検証済み、もしくは私が使うことが出来ている(謎基準)

もし、検証したいネタがありましたらコメントの方へどうぞ。
また、もし出来ないことが出来たならばコメントをお願いします。

なお、ある程度の説明は省いています。

現時点で未完成です、結構投げやりな部分もあります

マウス・入力関係
マウスカーソルの位置(X/Y/Z)の確保:×
システム上、ソースを見る限りは不可能です。
もしこれが可能ならばもっとすごいことが出来るのですが・・・

マウスクリックイベント:×
KeyEventで仮想コード表などを調べて見つけた数値を入れても反応しませんでした。
もしこれが可能ならばもっとすごいことがry

キー押しっぱなしイベント:×
一見押している間イベントを発生させられるのではないか、と思っていたのですが、
「キーを離した」という情報の取得が出来ない為、断念しました。

文字入力:
出来ることには出来ますし、以前すぴブレコンソールとして当ブログで公開したこともありますが、
正直言って実装が面倒なうえ、アルファベットぐらいしか入力できません。
何故作ったのかが分からない上、作っておきながら全然使わなかったというブツとなりました。
パスワード入力とかしたい場合はこれがピッタリかもしれませんが・・
あの文字入力のシステム・・・・もう作れる気がしません・・・・内容すら忘れてます。

矢印キー:
可能だった気がします、単に使う用途が見当たらないだけで・・

コントロール・シフトキー無効化:
CtrlとShiftにはシステム側でストップ・早送りの機能が付いていますが、
KeyEventで別のイベントを割り当てると無効化された気がします。
試したのは結構昔だったのでうろ覚えです。

XML関係
マルチバイト-Unicode:×
どうやらshift-jis以外は対応できないらしいです。
扱おうとすると「?」として出力されます。
環境文字全般が使用不可ということになります。

余談ですが・・・私のゲームに無駄に多言語切り替え機能を付けてしまいましたが・・
実質日本語と英語しかサポートできそうもありません。その前に英語をサポートする必要性なんてなかったのですが・・
イベントファイル自体から2バイト文字を抜きたかっただけなんです。

ドラッグドロップ禁止:
違うんです、本当は正しくファイルが読み込まれたかのチェックの副作用だったんです。
まぁ・・すぴブレのゲームで楽しさを損ねるD&Dを封じれたのは結果としてはプラスだったのですが・・・

アーカイブ・暗号化:×
当初、ファイルを隠蔽するならファイルを一纏めにしようと考えていましたが・・
当然Zipとかに入れたファイルにアクセスさせることは出来ませんでした。

XMLからのHTML出力:
スタイルシートの処理(もしくはxsltの処理)の一行を入れてもゲーム中で読み込むことは出来ました。
xsltを工夫すればhtmlとしてそのファイルを視覚化することが出来るかもしれません。
当然HTMLの知識とXSLTの知識が必要となってくるわけですが・・
エディタマニュアルでも同じことをしてたので真似をすれば何とか出来るでしょう

XSLT:
XSLTは単にイベントの置き換えをしているだけです。
何度も何度も長いイベントを繰り返し呼ぶならば纏めてしまおうと考えた結果が私のゲームです。
元はといえばオブジェクト指向について学んだ結果なのですが・・・

自前のノードを作れたりすぴブレの対応以外のノードの読み込み等もあっさりと出来てしまいます。

LIST構造モドキ:
実装は約6時間、地獄でした。
今回出来るようになったことは、あるリスト列からデータを抜き出してイベントを実行するブツです。

例えば キャラA/キャラB/キャラC/キャラDがいる中でその4キャラの武器と防具を参照(取得)したい時、
すぴブレの既存のシステムを使うと、
<Command com="param/member/_temp_seW/キャラA/wepon"/>
<Command com="param/member/_temp_seB/キャラA/body"/>
<Command com="param/member/_temp_seW/キャラB/wepon"/>
<Command com="param/member/_temp_seB/キャラB/body"/>
<Command com="param/member/_temp_seW/キャラC/wepon"/>
<Command com="param/member/_temp_seB/キャラC/body"/>
<Command com="param/member/_temp_seW/キャラD/wepon"/>
<Command com="param/member/_temp_seB/キャラD/body"/>
と、取得だけで8行使いますが、XSLTの酷使無双により、<List/>をオーバーライドさせ

<List list="キャラA/キャラB/キャラC/キャラD">
<Command com="param/member/_temp_seW/=_temp_readlist/wepon"/>
<Command com="param/member/_temp_seB/=_temp_readlist/body"/>
</List>

というように大幅に行数を削減することが出来ました。
(実のところ、裏で何度も再帰実行しているため総イベント数自体は増えていたりします)


アイテム関係
id30000以上:×
出来ませんでした、ちなみに0もダメのようです。
30000でも十分すぎるはずですが・・・

アイテムを一個単位で操作:
アイテムをいくつ持っているかを取得できればあとは簡単です。
値を変更するたびに全捨て→必要数取得という方法で実装可能です。

アイテムを100以上所持:
アイテムを一個単位で操作するパラメータを使えば可能ですが、ショップなどでは使えない上、
表示自体は99が限界です。



音楽関係
MP3・Ogg:×
残念ながら使えません。ただすぴブレ改造講座 -BGM編 -にて紹介した方法を用いると、
mp3ファイルのサイズ以下でwavを扱うことが出来ます。
もしすぴブレでwavを使うならば必須の情報だと考えています。

ループ:
midiのみ可能です。
曲が終わった際に指定した位置に音楽をループさせることが出来ます。
ただし、終了地点は指定できません。midiファイルを直接いじって変えるしかありません。
音楽素材元の利用規約に反しない範囲でどうぞ。

System/BGMDefine.xml内の例
<File name="world" path="midi/loop011_gm.mid" loop_s="300"/>
loop_s="300"がそうです。 数値は恐らくミリ秒だと思います。
毎回変更して起動、違ったからもう一回変更して起動・・・という手間を省くには
正しいミリ秒を確認できるソフトが必要になりそうです。
私は前者のトライ&エラーという苦行を味わったのです。3曲分ぐらい

二重再生:
一応・・BGM再生と効果音再生を使えばできますが・・・やりませんよね?

フルボイス:
断言しますが絶対に誰もやりません。 でも部分的にボイスを入れるということは・・・・でも誰もやらないでしょう。
(ただでさえこのシステムに触っている人が少ないというのに・・・)

イベント関係
ウィンドウでセリフ表示:
いわゆるりべいすの・・・
smile6I7QBA12.jpg
これ       ↑(画像は適当に取ってきてちょっと加工させていただきました。)
私の中ではある程度の構造は出来ていますが、メッセージ送りに難がありそうです。(ダミーMsgが必要と思われます)
また、おそらくすぴブレの方ではウィンドウをクリックしてもメッセージが進まないので工夫が必要です。
(ウィンドウ全体にnextmsgを仕組めば解決?)

時間があったらSystemCoreの方に組み込んでみたいと思います。

オートメッセージ送り機能:
ボタン一つで自動でイベントを進めてくれるような夢のような機能。
イベントの内容によってはイベントが崩壊しかねない恐れが考えられます。
nextmsgを割り込ませることは出来ると思いますが、本来演出上の都合で停止させなければならない場合には不向きです。
おもにDelayを使う場合ですが、Timerで次のイベントを呼ぶことで解決できますが・・・

バトル関係(この記事の本編です?)
部隊にいるキャラの情報取得:
さて、すぴブレのシステムでは戦闘中のキャラのデータをある程度取ることが出来ます。
主にコマンドを使えばリーダーのステータスやパラメータを取得することが出来ますが・・・・
部隊の二番目、三番目にいるキャラの情報を取ることは・・・・?
または、今第1部隊には何人のキャラが組まれているか、もしくは、何人生存しているか・・・

実質、つい最近のことですが、戦闘中に全キャラのパラメータを引き抜くことが出来ました。
バトルにいるキャラ全員にLogicを適応することによって・・・
(次のバージョンから全員にロジックが付くという暴挙に出させていただきます)

ここで重要なのは「バトルID」の存在です。
戦闘に登場した順に全キャラにこのIDが割り振られます。
そのロジック内でそのキャラの名前IDとバトルIDを _temp_ID(バトルID) val 名前ID という形で保存します。
少しこの後の処理が複雑なので希望があれば説明しますが、リーダーのバトルIDに1づつ足していって
バトルIDが次のリーダーのIDと重なったら部隊変更という形となっています。
上の説明を簡単(分かりやすいというわけではない)に表すと
(注意プログラム文に見えますが別の何かです、この処理をすぴブレ上で実装します)

int n=部隊1のリーダーのバトルID;//バトルID
int patyC=0;//パーティ数
String[ ] lead={"部隊2のリーダーの名前","部隊3のリーダーの名前",}//部隊1のリーダー名は除外
String[ ][ ] paty;
for(int i=0;i<味方のエントリー数;i++){
  if(="_temp_id"+n==lead[n]){
patyC++;
}
paty[patyC++][n]="_temp_id"+n;
n++;
}

ちょっと分かりにくいです。道中パラメータのポインタらしき物を使う必要が出てきてしまいますが、
一度実装してしまえばこっちの物です。

部隊同時移動:×
りべいすの部隊を選択して移動させることはちょっと無理があります。

キャラ間の距離測定:
二点の座標(自分の座標、相手の座標)を取得したのちJavaScriptで計算してください。
私は計算については苦手ですのでアレですが調べると公式が載っています。
計算にはJavaScriptが必要となります。

部隊ワープ:
キャラを戦場から削除しないで部隊ごとワープさせることは恐らく出来ると思われます。
ただし、部隊の全隊員の情報を知る必要があります・・・・つまり・・・・

追記、できました。
ワープ発生時のイベント(発生自体はTresとかRangeです)
手順1、部隊のリーダーの移動指示をキャンセルする
     <Move name="リーダー名" x="0" y="0" shift="1"/>
     これは自動戦闘にも使われているもので、
     移動指示先をキャラ直下に上書きしてキャンセルします。

手順2、部隊全体を移動したい座標に<Act time="0"/>で飛ばします、
     この時全員同じ座標でも構いません(移動後、キャラが自動で隊列を組んでくれます。)

手順3、リーダーを除く部隊全員に移動指示をキャンセルさせます。
     リーダーのキャンセルと同じでOKです。

以上。
あとは部隊にいるキャラの情報取得と組み合わせれば動的に部隊ワープを発生させることが出来ます。

追記、この部隊ワープを安定して使うにはSystem.xmlのpatymoveが1である必要がありますが、
戦闘を行わない(謎解きとか)ならばpatymoveは0でも動作します。

その他、未検証などの情報
ロジックでJavaScript以外の言語は使えるか:
VBScriptは試してみたのですが・・使えませんでした。
書式や機能的にもJavaScriptが優れているので他のを使用する必要はないかと・・・

ポリゴンファイルの形式:
.polyファイルの内容について、恐らくこのゲームの為だけにエンコードされた形式の可能性が高いです。
少なくても他のポリゴンファイル(.xをはじめとしたもの)と一致することはありませんでした。
なおコードを眺めていたのですが、いまいちフォーマットが分かりません。
GeraHa氏はそもそもどうやってモデリングをしていたのでしょうか?

ファイル書き込み&読み込み:
そういえば・・txtファイルを読み込みたくなってまいりました。
XMLファイル以外のファイルを読み込み、文字として出力できるのでは?
すぴブレのシステムからファイルにアクセスしてファイルを書き換えることが出来るのではないか?
よくよく考えてみればセキュリティの関係で危険な気もしますが・・
XSLTもしくはjavascriptで読み書きすることが出来るのではないかと考えています。


ポリゴン表示bridgeの謎:
ポリゴン表示のタイプにはblock glass delete の三つが指定できますがコード内にはbridgeという謎のタイプが残っていました。
機能していない可能性が高いです。
元々ポリゴンの上に乗れて立体的に戦えるようにしたかったのではないでしょうか?

JavaScriptの限界:
基本的にJavaScriptの書式を知っている方ならばピンと来るはずですが、
このゲームでもしっかりと配列やfor、switchが使えます。
未検証なのは一応標準搭載されていると思われるデータ構造(Map、Listなど)、正規表現などです。
これらを応用すればもっとすぴブレのシステムの幅が広がると思います。

エディットマニュアル:
そういえばここで公開しているゲームにはすぴブレのエディットマニュアルが入っていません。
色々と書きなおしたり、書き足したりして再配布しようかと考えていますが・・・
誰か・・・Strict DTDの範囲で作ることが出来る使いやすいメニュー考案していただけませんかね・・・・?
色々とWEB技術を学んで知ったのですが・・あのマニュアルはIEにとって相性が悪いようです。
内部を少し書き換えるとIEでも使いやすくなるのですが・・・ テーブルの表示とかされないケースありますよね?

<Powered>の<Tag>のcol指定にパラメータ指定:
すぴブレのシステムでは col="=_temp_col" などの書き方が出来ません。(_temp_colには0xffffffffが入ってるとします)
原因はソースコード内にありました。

もしcol=""の内部が0xで始まっていない場合、未処理とする。

=_temp~ では =_ で始まっている為、処理されないということになっています。

XSTLを使ってChoose whenを使えばパラメータによって色を変えることは出来そうですが・・・

今後この記事には書き足したりする可能性が高いです。
コメント
この記事へのコメント
すぴぶれのマップ上でのキャラクター描画で気になってるんですがあれ奥に向かって高くなる斜面上かつ戦闘時よく使う表示角度だとキャラクターのポリゴンが横に倒れて地面より下に成るはず、だけどそんなことは起こらないしマップに設置したポリゴンとキャラクターとの前後関係は割りと正しく表示されるからキャラクターのポリゴンのZバッファは多分ある程度正しい値が入っている筈で訳がわからない。
すぴぶれソースからどうなってるか分かりませんかね?
2015/08/04(火) 15:27 | URL | 某部長 #-[ 編集]
実はキャラクターのポリゴン自体にはZバッファは存在しません。

マップ+ポリゴン描写とキャラクター描写は殆ど別の処理で描写が行われています。前後関係などの描写順位だけは同じのようです。

キャラクターのポリゴンはカメラワークにかかわらず角度はずっと同じままの為(倒れたりはしていない、動いているのは全てマップ等のポリゴン)正常に描写されます。

ちなみにキャラクターのポリゴンの表示方法はビルボード表示です。

ビルボードについての参考はこちらです
https://www.c3.club.kyutech.ac.jp/gamewiki/index.php?%A5%D3%A5%EB%A5%DC%A1%BC%A5%C9
疑問に思っていることは大抵ここに乗っているはずです。

DirectXにてよくある描写パターンなのですが、正直ソースコードを見て分かるようなものではないと思います。

というより単に私がまだDirectX勉強中の身というのもありますが・・・




2015/08/04(火) 15:54 | URL | Stnsllet #C30KqXvA[ 編集]
後部隊ワープですがこれの自軍に対して行う場合の最大の問題が<Act>で移動してもそれ以前に出していた移動指示が継続される点です、特に戦闘状態中にしようとしてワープ先でも戦闘状態になる場合移動指示の解除が不可能に近い、部隊長に移動指示が出ている場合周りに敵が居なくても戦闘状態が維持されますし。
この問題の解決は全ての移動タイプが瞬間移動で動けるマップタイプを作っておいてそのマップを一瞬読み込んで移動指示をこなしてからワープ、ワープしない部隊はLogicで行動を出来ないようにする、問題はどう考えてもその瞬間移動マップが見られるし視点がリセットされる。
戦闘中の移動指示の拘束力の高さは厄介ですね。
2015/08/04(火) 16:08 | URL | 某部長 #-[ 編集]
移動指示のキャンセル自体は簡単なのですが・・・

ちょっと検証して可能だったら動画上げてこの記事の該当箇所に張っておきます。
2015/08/04(火) 16:53 | URL | Stnsllet #-[ 編集]
<Move>を使う方式は戦闘中以外キャンセルが聞きますが、戦闘中に出した移動指示、特に部隊長に出したものをキャンセルするのは不可能な筈です。少なくとも私の環境では無理です。
2015/08/04(火) 17:41 | URL | 某部長 #-[ 編集]
実のところ戦闘中に出した指示についてもキャンセルする方法があるのですが・・、ゲーム自体の操作性を変えることになります。

上記の方法は確かに戦闘中に出した指示をキャンセルすることは出来ませんでした。

そこでSystem/System.xmlの
patymoveを1にしてみるとキャンセル出来てしまうのです。

この部隊ワープを戦闘中に使うのならばpatymoveが1である必要があります。
しかしpatymoveが1だと個人に指示が出せなくなるという大きなデメリットが生じます。
2015/08/04(火) 18:05 | URL | Stnsllet #C30KqXvA[ 編集]
midiのループで設定しなくても勝手にループするのもあります。
すぴブレではkouteiがそうです。
他のmidiでもループ再生するのも確認しましたが何かループする法則性があるのでしょうか?
2015/08/15(土) 18:51 | URL | boru #SFo5/nok[ 編集]
DirectXに使われているmidi再生機能の特徴としてmidiの最後まで行ったら自動で1小節目に移ります。

ここで自動でループされるように聞こえるmidiを確認したところ、kouteiを始めとしたsweet_snowなどのmidiファイルにある共通点があります。

結論としては1小節目の最初から音が鳴るようになっているからです。

その他の曲は1小節目を開けて2小節目から音楽が始まるようになっているため、終了後少し間が空きますが、
1小節目から音がなるmidiではループして聞こえることになります。
2015/08/15(土) 20:13 | URL | Stnsllet #C30KqXvA[ 編集]
コメントを投稿する
URL:
Comment:
Pass:
秘密: 管理者にだけ表示を許可する
 
トラックバック
この記事のトラックバックURL
http://stnsllethouse.blog.fc2.com/tb.php/134-6594a466
この記事にトラックバックする(FC2ブログユーザー)
この記事へのトラックバック