キャラクターやアイテムのパラメータ配列(RPGエディタ)

投稿者:            mini mosmoss 投稿日:2016/08/02 21:51

具体的には関数で取得するキャラクタやアイテムのパラメータ配列には
何番目のインデックスに何の情報がどんなふうに入っているのか、を確認します。

関数を呼べばパラメータ配列が返ってくるのはわかっていて
その配列を表示させてキャラクターやアイテムの情報と照らし合わせれば
何番目のインデックスに何の情報がどんなふうに入っているのかはわかるのですが、

その作業は見るからに面倒そう…
必要になるたびに確認するのではなく
できるなら一回で済ませたい…!(これからやる)

そういう経緯で、
メモ書き場としてここを使わせてもらいたいと思います。

■■キャラクター編■■
参考 仕様:キャラクターステータス操作
見本キャラクタとしてキャラクター「おにぎり」を作成
キャラクター画像はsurakeiさんのおにぎりです




getPlayerParam関数
プレーヤーのパラメーターの配列を取得する関数
getPlayerParam()
返り値はプレーヤーのパラメーターの配列

getPartyMemberParam関数
パーティメンバーのステータスを取得する関数
getPartyMemberParam(12)
第1引数はパーティメンバーのID
返り値は指定したパーティメンバーのステータス配列
 パーティメンバーのIDはプレーヤーキャラクターならば
 "playerCharacter"を指定、
 それ以外のキャラクターの場合は
 キャラクターのIDを指定する

考えたこと:
引数がパーティメンバーインデックスではなくてキャラクターのIDになっている
プレイヤーでもパーティーメンバーでもないキャラのパラメータ配列は取得できるのか?
ちょっとやってみたいと思います

speak("プレイヤーをおにぎりに変更します")
setEventCharacter("playerCharacterEvent", 33896) #プレイヤーをおにぎりに変更
s=getPlayerParam()
speak("test1:プレイヤーのパラメータ情報を取得します")
speak(s)
#数値あり
#33896,のりで包まれた三角のおにぎり,おにぎり,912,304,3,25,25,15,15,5,6,8,9,7,25,15,5,6,8,9,7

s=getPartyMemberParam(33896)
speak("test2:パーティーに加えていないおにぎりのパーティーメンバーパラメータ情報を取得します")
speak(s)
#null
addPartyMember(33896)
s=getPartyMemberParam(33896)
speak("test3:おにぎりをパーティーメンバーに加えておにぎりのパーティメンバーパラメータ情報を取得します")
speak(s)
#数値あり
#33896,のりで包まれた三角のおにぎり,おにぎり,16,16,3,25,25,15,15,5,6,8,9,7,25,15,5,6,8,9,7

speak("プレイヤーをおにぎり以外に変更します")
setEventCharacter("playerCharacterEvent", 33894) #プレイヤーをおにぎり以外に変更
s=getPartyMemberParam(33896)
speak("test4:test3をもう一度")
speak(s)
#数値あり
#33896,のりで包まれた三角のおにぎり,おにぎり,16,16,3,25,25,15,15,5,6,8,9,7,25,15,5,6,8,9,7

speak("おにぎりをパーティーメンバーから外します")
removePartyMember(33896)
s=getPartyMemberParam(33896)
speak("test5:パーティーから外したおにぎりのパーティーメンバーパラメータ情報を取得します")
speak(s)
#null


考えたこと:
パーティーメンバーでない状態の登録キャラIDを引数に指定した場合nullになるので
プレイヤーでもパーティメンバーでもないマップ登録キャラクタのステータス取得はできない
キャラ名のすぐあとの二つの数字、おそらくキャラクターの位置(座標)と思われるものについて
プレイヤーキャラクタの座標(ピクセル単位)は問題ないのだが、
パーティーメンバーの座標はちょっと変なかんじになった
一巡目のイベントはかならず、-50000,-50000になり、二巡目以降は16,16になったのだ
フィールド内におにぎりキャラクターを配置したがその座標とも関係ないようである
おそらく、最初にプレイヤーキャラを想定して作った配列情報の取得機能をあとになって
パーティメンバーの実装とともにそちらへ転用したために起ってしまった挙動なのかと思う
パーティメンバーの座標というのはおそらくないだろうから仕方ないだろう
この数値が何を意味するのかはこの記事では気にしないことにする
それ以外で注意することといえば、
「器用」の順番が最後ということと、位置情報が配列で返ること、状態異常耐性の情報や、
レベルアップで上昇するステの幅とかの情報は取得できないことくらいだろうか
装備したアイテムの情報については別の関数があるから取得できる

装備したアイテムによって、パラメータが増えている場合、増えた状態のパラメータが取得される
※武器の効果量はパラメータに含まれない

結論:
キャラのパラメータ取得関数で得られる配列は
後述するgetValueFromCharacterParam関数で得られる値と同じ内容である。

キャラ配列のインデックス項目getValueFromCharacterParam関数で使う関数(この表の一番左の数値を求める関数?)
0ID getCharacterIdIndex()
1名前 getCharacterNameIndex()
2名前(表示名) getCharacterViewNameIndex()
3位置(座標x)ピクセル単位,位置(座標y)ピクセル単位 getCharacterPositionIndex()
現在のステータス
4レベル getCharacterLevelIndex()
5最大HP getCharacterMaxHPIndex()
6最大MP getCharacterMaxMPIndex()
7HP getCharacterHPIndex()
8MP getCharacterMPIndex()
9 getCharacterStrengthIndex()
10耐久 getCharacterDefenceIndex()
11賢さ getCharacterIntellectIndex()
12精神 getCharacterMentalIndex()
13器用さ getCharacterDexterityIndex()
エディタ設定値
14基本最大HP getCharacterBaseMaxHPIndex()
15基本最大MP getCharacterBaseMaxMPIndex()
16基本力 getCharacterBaseStrengthIndex()
17基本耐久 getCharacterBaseDeffenceIndex()
18基本賢さ getCharacterBaseIntellectIndex()
19基本精神 getCharacterBaseMentalIndex()
20基本器用さ getCharacterBaseDexterityIndex()

getValueFromCharacterParam関数
キャラクターステータス配列からステータスを取得する関数
speak("主人公のID", getValueFromCharacterParam( getPlayerParam(), getCharacterIdIndex()))
第1引数はキャラクターステータスの配列
第2引数は取得したいキャラクターステータスのインデックス
返り値は取得したキャラクターステータス
 キャラクターステータスのインデックスの指定は
 入力支援から選択形式で行うことができる
 参考:仕様/スクリプト/キャラクタステータス操作について
 キャラクターステータスのインデックスの見出し(?)は↑に書かれている項目

考えたこと:
キャラクターのパラメータ配列を既に出してることが前提のこの関数は一見必要ないように見えるが、
配列を知らなくてもパラメータ情報を抜き出せるこの関数は初心者には使いやすいのかもしれない
アイテムパラ配列にもこの方式の関数があるがキャラクタのと若干ちがうところがある

ちなみに、例えばgetCharacterViewNameIndex()の値は2だったりする。
これってキャラクターパラメータ配列のインデックスの数値!!('ω')
(関数名にそう書いてあるよっていうツッコミが聞こえてきそうです…)
つまり、
A=getValueFromCharacterParam( getPlayerParam(), getCharacterViewNameIndex())
B=getValueFromCharacterParam( getPlayerParam(), 2)
a=getPlayerParam()
C=a[2]
のとき
AとBとCの値は等しくキャラクタの表示名ということ
言い換えるとキャラクタの表示名を取得するのにABCの3つの書き方がある
ちなみに、Cの書き方で位置情報を引き出す場合、
X座標はa[3][0]、Y座標はa[3][1]と書く

なんでわざわざまわりくどいことをするのかと考えたが、
おそらくこれを実装した当時は機能改訂が頻繁にあって、
パラメータやパラメータ配列も変更する可能性があった。
いざ変更した時に既存のゲームへの影響が少なくなるように
とくにスクリプト初心者のユーザーが困らないように
a=getPlayerParam()
C=a[0]
のような書き方でなく
A=getValueFromCharacterParam( getPlayerParam(), getCharacterIdIndex())
の書き方を標準としたのだと思う
つまり運営さんのユーザーへの配慮のたまもの('ω'っ)3
(※個人の妄想です)

でも自分で使うとしたらCの書き方をすると思います

追記:
上の仕様を見て試したのですが
speak(getDownDirection()) #0
speak(getLeftDirection()) #1
speak(getRightDirection()) #2
speak(getUpDirection()) #3
つまりsetEventDirection関数の第二引数で
getDownDirection()、getLeftDirection()、getRightDirection()、getUpDirection()のかわりに
0、1、2、3と書くことができる
製作の時短に使えるほか、条件付けなどを簡単にかける場合があると思います

おまけ
ステータス・パラメータに関する仕様
仕様/パーティ
仕様/スクリプト/キャラクタステータス操作について
仕様/ダメージ計算
仕様/状態異常

キャラクター編はここまで
結構長くなってしまいましたが、キャラクタ編は序の口と見ています
アイテムパラメータはもっと確認することが多くなるでしょう…

■■アイテム編■■
見本アイテムとしてアイテム「しずめのすず」を作成
アイテム画像はmifaさんの和風のすずです



item=getItemParamWithId(20549)
speak("指定のアイテムのパラメータ情報を取得します")
speak(item)
果たして、speak(item)の結果は…?

20549,1,みたましずめのすず,しずめのすず,3,1,1,0,0,0,8,3,7,,0,0,2,2,2,0,0,0,0,0,0,0,,0,0,2,2,2,5,3,2,1,4,6,0

長い!
しかも所々にある値なしのカンマがミステリアス(@ω@っ)3

おそらくアイテム情報が全部入ってるので
ユーザーとしては嬉しい限りなのですが
全部の値について確認するのに結構時間がかかりそうです

getItemParamWithId関数
アイテムのIDから対応するアイテムのパラメーターを取得する関数
getItemParamWithId(32)
第1引数はアイテムのID
返り値はアイテムのパラメーターの配列
返り値の配列からパラメーターを取得するには
getValueFromItemParam関数の入力支援がある

とりあえず0~38のインデックスについて表を立てておいて、わかったものから書いてくことにします。
インデックスの数は39で配列で返されている値はないようです。
追記:表は一応完成しました

アイテム配列のインデックス項目どんなふうに入っているか(とくに説明のない場合、項目の通りの数値や文字列が入っています)(「0近接1遠距離2全体」のような書き方をしている場合、数値0~2の形で入っていて、対応する項目を指しているということです)
0ID
1アイテムの種類0道具1武器2盾3鎧4兜5靴6装飾7魔法
2名前(長いやつ)
3名前(表示名)
4レベル
5最大使用回数道具以外のとき1
6使用可能回数道具以外のとき1で変化なし
7攻撃方法0近接1遠距離2全体
8攻撃対象0敵1仲間
9攻撃コストの種類(武器0コストなし2MP)(魔法2MP)
10攻撃コストの値
11攻撃効果の種類(武器の場合3力攻撃4器用攻撃5魔法攻撃)(魔法の場合0効果なし1HP回復2MP回復3通常攻撃(力攻撃)4通常攻撃(器用攻撃)5通常攻撃(魔法攻撃)6蘇生7毒回復8マヒ回復9混乱回復10即死(力)11即死(器用)12即死(魔法)13毒(力)14毒(器用)15毒(魔法)16マヒ(力)17マヒ(器用)18マヒ(魔法)19混乱(攻撃)20混乱(器用)21混乱(魔法))
12攻撃効果の値
13値が入っていないインデックス。nullが返ってくる
14攻撃効果アニメのID実際には数値が取得できず0のまま?
15攻撃命中効果アニメのID実際には数値が取得できず0のまま?
16アイテムの攻撃間隔0遅い1遅め2普通3速め4速い
17アイテムの攻撃移動速度0遅い1遅め2普通3速め4速い
18アイテムの攻撃範囲0短い1短め2普通3長め4長い
19アイテムが使用可能かどうか0使用不可1使用可能
20アイテムの使用時攻撃方法0近接1遠距離
21アイテムの使用時攻撃対象0敵1仲間
22アイテムの使用時攻撃コストの種類0コストなし1HP2MP
23アイテムの使用時攻撃コストの値
24アイテムの使用時攻撃効果の種類0効果なし1HP回復2MP回復3通常攻撃(力攻撃)4通常攻撃(器用攻撃)5通常攻撃(魔法攻撃)6蘇生7毒回復8マヒ回復9混乱回復10即死(力)11即死(器用)12即死(魔法)13毒(力)14毒(器用)15毒(魔法)16マヒ(力)17マヒ(器用)18マヒ(魔法)19混乱(攻撃)20混乱(器用)21混乱(魔法)
25アイテムの使用時攻撃効果の値
26値が入っていないインデックス。nullが返ってくる
27アイテムの使用時攻撃効果アニメのID実際には数値が取得できず0のまま?
28アイテムの使用時攻撃命中効果アニメのID実際には数値が取得できず0のまま?
29アイテムの使用時攻撃間隔0遅い1遅め2普通3速め4速い
30アイテムの使用時攻撃移動速度0遅い1遅め2普通3速め4速い
31アイテムの使用時攻撃範囲0短い1短め2普通3長め4長い
32HP装備したキャラクタのパラメータを上昇させる値
33MP同上
34同上
35耐久同上
36賢さ同上
37精神同上
38器用同上
武器・魔法のパラメータは前半のインデックス7~18、道具は後半の19~31
攻撃間隔・攻撃移動速度・攻撃範囲はさわっていない状態で「2普通」

アイテムパラメータ配列を取得する関数は4つある
アイテムIDから求めるもの
所持アイテムのインデックスから求めるもの
プレイヤーキャラクタの装備のインデックスから求めるもの
パーティメンバーの装備のインデックスから求めるもの
詳しくは関数リファレンスを参照したり掲示板を検索したりしてください

考えたこと(脱線):
所持しているアイテム全てのパラメータ情報がほしいとき二通りの方法が考えられる

所持アイテムのID配列を取得する関数を使って
インデックス順に並んだアイテムID配列を得たあと
IDからアイテムパラメータ配列を取得する関数を使って
各インデックスにパラメータ配列を上書きして二次元配列にする方法(方法A)と

所持アイテムのインデックスからアイテムパラメータを求める関数を使って
所持アイテム上限数だけ配列を取得し、二次元配列にする方法(方法B)である

この二つの場合方法Aの方がいい
工数から考えると一見方法Bの方がよく見えるのだが、
方法Bだとアイテム欄の空きの数だけエラー文を吐くのだ
このエラーは中身のないインデックスへアクセスすることからおこると思われるもので
(getItemParamWithIndexで範囲外にアクセスしました、と書かれる)
ゲームの進行を妨げるものではないのだが、鬱陶しい
他のエラー文が埋もれてしまう可能性がある
※装備のインデックスからアイテムパラメータ配列を取得する関数ではこの挙動は起きない
※アイテムを装備していないインデックスの場合返り値はnullだが、-1が入っているのでエラー文が出ない
※所持アイテムのインデックスに何もなかった場合、返り値はnullだが、-1なども入っていないためエラー文が出る
このエラー文の問題を解決したい場合にはcfm_さんの記事が参考になるのではないかと思っている
(スクリプトの仕様、や、引数から配列を得る関数、など)

少し脱線したが本題に戻る

アイテムパラメータ配列の中身の調べ方:
アイテムの情報と配列の中身を比べてわかるところを埋めたあとで
後述のgetValueFromItemParam関数を使ってインデックスに入っている情報を調べて記入
そのあとでアイテム設定を少しずつ変えながら数値の変化を記録した

#アイテムパラメータ配列の中身を調べるために使ったスクリプト
speak("指定のアイテムのパラメータ情報を取得・表示します")
item=getItemParamWithId(20549) #コピペで使用する場合、アイテムIDをマップに登録してあるものに変えてください
speak(item)
speak("取得したアイテムパラメータ配列のインデックスの数(配列の長さ)と中身を調べます")
speak(getArrayLength(item))
i=0
while i<getArrayLength(item)
speak(i,",", item[i])
i=i+1
end


考えたこと:
効果アニメのIDを取得できることにどんな意味があるのか?
また効果アニメは最大で3種類設定できるのに2種類しか取得できないのか?
そう思って、アイテムに効果アニメを設定してみたが
該当インデックスの数値はゼロのままだった
効果アニメ関連のIDは取得できないようだ

またアイテムを「使用できない」と設定した場合にも
使用できるアイテム用の(効果種類や発動時間など)全ての項目は設定・取得できた

アイテムの長い名前は最大で255文字設定できるので、
ここにアイテムの説明などを書いて呼び出せば、
変数を作らなくてもいいかもしれない


getValueFromItemParam関数
アイテムパラメーターの配列からパラメーターの値を取得する関数
アイテムパラメーターの配列はgetItemParamWithIdなどアイテムのパラメーターを取得する関数の返り値です。
getValueFromItemParam(getItemParamWithId(36), getItemViewNameIndex())
第1引数はアイテムパラメーターの配列
第2引数は取得したいアイテムパラメーターのインデックス
返り値はインデックスに対応したアイテムパラメーターの値
アイテムパラメーターのインデックスは入力支援を使用して
入力することができる

アイテムパラメータのインデックス項目アイテムパラ配列のインデックスの数値を求める関数アイテムパラ配列のインデックスの数値
アイテムIDgetItemIdIndex()0
種類getItemTypeIdIndex()1
長い名前getItemNameIndex()2
表示名getItemViewNameIndex()3
レベルgetItemLevelIndex()4
最大使用回数getItemMaxUseCountIndex()5
使用可能回数getItemCanUseCountIndex()6
攻撃方法getItemAttackTypeIndex()7
攻撃対象getItemTargetIndex()8
攻撃コストの種類getItemCostTypeIndex()9
攻撃コストの値getItemCostValueIndex()10
攻撃効果の種類getItemEffectTypeIndex()11
攻撃効果の値getItemEffectValueIndex()12
攻撃効果アニメのIDgetItemAnimationIdIndex()14
攻撃命中効果アニメのIDgetItemHitAnimationIdIndex()15
アイテムの攻撃間隔getItemWaitIndex()16
アイテムの攻撃移動速度getItemAttackMoveIndex()17
アイテムの攻撃範囲getItemRangeIndex()18
アイテムが使用可能かどうかgetItemCanUse()19
アイテムの使用時攻撃方法getItemUseAttackTypeIndex()20
アイテムの使用時攻撃対象getItemUseTargetIndex()21
アイテムの使用時コストの種類getItemUseCostTypeIndex()22
アイテムの使用時コストの値getItemUseCostValueIndex()23
アイテムの使用時効果の種類getItemUseEffectTypeIndex()24
アイテムの使用時効果の値getItemUseEffectValueIndex()25
アイテムの使用時効果アニメのIDgetItemUseAnimationIdIndex()27
アイテムの使用時命中効果アニメのIDgetItemUseHitAnimationIdIndex()28
アイテムの使用間隔getItemUseWaitIndex()29
アイテムの使用時移動速度getItemUseAttackMoveIndex()30
アイテムの使用時攻撃範囲getItemUseRangeIndex()31
インデックス13と26には値がないようです

アイテムパラメータ配列におさめられているほとんどの情報を入手できますが、
装備したキャラのパラメータをあげる数値はこの関数では取得できません
アイテムパラメータ配列のインデックス32~38を呼ぶ必要があります

以上でアイテム編もおわりです
不備があったらすみません

■■■■■■
(この記事を上げる前にしたこと)
関数リファレンスのチェック
関数名や、パラメータ、アイテム、装備、配列、などのキーワードでのWiki、掲示板、ブログ検索

基本的なことだし自分で調べるまでもなく検索したらすぐ出てくるじゃろ…
と思って検索したのですが・・・
肝心なパラメータ配列の情報があんまり書いてなくて、
そのわりにキーワード関連記事が多く、スレッドタイトルも内容がわからないものが多くて
調べるのが大変に感じたので自分で調べてまとめることにしました。


おまけ

最近読んで面白かったゲーム感想ブログ
km0909さんという方が書かれてる「フリーゲーム攻略日記」というブログの
「懐かしの」というタイトルのブログからはじまる一連の攻略ブログ
http://ameblo.jp/km9090/entry-11952980309.html
ある有名な古典RPGのパロディ作品の攻略記なんですが、
このインスパイア元のゲームを遊んだことがない私にはとても面白かったです
こういうかんじなんだ!ってのとこれはおもしろそうだ!っていう興奮が味わえました
ブログ筆者さんは攻略記の書き方がうまくて引き込まれながら楽しく読ませてもらいました

おまけ

プログラミングの再帰、相互再帰を検索してたらハノイの塔というのを知りました
https://ja.wikipedia.org/wiki/ハノイの塔
これ、ちょっと前に個人的にはまってたcoin lineというアプリゲームのシステム!(@ω@)
このアプリ考えた人のアイデア力すごい!と思ってたけど
自分の数学的教養がなかっただけとわかってちょっと悲しいです
コンピュータとハノイの塔で対戦するゲームなんてどうでしょう?

コメントする

コメントするには、ログインする必要があります。

コメント一覧

コメントはありません。