概要
NScriptやSYSTEM3.9などでは、文字列は宣言することなく、配列に格納する形で利用します。
あれをSYSTEM4.0上で再現できるような構造体を作ってみます。
仕組みはちょっと分かりにくい。整数の値と文字列を同時にそれぞれの配列に入れます。
取得する時は、値を検索し、値の要素から文字列を呼び出します。で、おまけとして逆も可能な形にしてみました。
11/08
318さんのコードを参考にNStringを修正。今までのは忘れて下さい。
struct ans_t
{ array@int anX[1];
array@string asX[1];
const int nA = -2147483648;
ans_t()
{ans_ReAlloc;anX[0] = nA;
}
int nSet(string szX,int nX){return SNum(szX,nX);}
string sSet(int nX,string szX){return NString(nX,szX);}
int nGet(string szX ){return SNum(szX,,"Olding");}
string sGet(int nX ){return NString(nX),,"Olding;}
//要素の低い方に合わせて要素数を同一にします
void ans_ReAlloc(void)
{if(anX.Numof() > asX.Numof()){anX.Realloc(asX.Numof());}
if(anX.Numof() < asX.Numof()){asX.Realloc(asX.Numof());}
}
//数から要素を検索し、szXを返します。
string NString(int nX,string szX = "",string szY = "Renew")
{ ans_ReAlloc;
int nL;for (;nL < anX.Numof(); nL++)
{ if(nX == anX[nL]) { if(szX == ""){ return asX[nL];}
if(szX != ""){asX.Insert(nL,szX);asX.Erase(nL+1);return asX[nL];}
}
}
if(szY == "Renew" && szX != "")
{anX.PushBack(nX);
asX.PushBack(szX);
return szX;
}
return "";
}
//文字列から要素を検索し、nXを返します。
int SNum(string szX,int nX = nA,string szY = "Renew")
{ ans_ReAlloc;
int nL;for (;nL < asX.Numof(); nL++)
{ if(szX == asX[nL]) { if(nX == nA){ return anX[nL];}
if(nX != nA){anX[nL] = nX; return anX[nL];}
}
}
if(szY == "Renew" && nX != nA)
{asX.PushBack(szX);
anX.PushBack(nX);
return nX;
}
return nA;
}
};
作ったら動かしてみましょう。
void game_main(void)
{
ans_t MS;
MS.sSet(10,"エターナルフォースブリザード");
MS.sSet(11,"一瞬で相手の周囲の大気ごと氷結させる。相手は死ぬ");
S(MS.sGet(10));':'R; S(MS.sGet(11));A; }
エターナルフォースブリザード:
一瞬で相手の周囲の大気ごと氷結させる。相手は死ぬ
と出力されます
解説
int+string配列の構造体
nSet&nGetでは数値で文字列を検索させます。これは文字列配列と要素の関係に等しい。
ただし要素の役割をする数値が多くても、配列の要素は少なめです。エコロジック。
sSet&sGetでは文字列で数値を検索させます。
それぞれ要素(的な)数値、文字列の中の(結びついた)値はSetを使うことで、上書きされます。
"Renew"コマンドにより、その検索値がない場合、配列を新しく追加することができます。
実はおまけというか、RPGのステータス用構造体として作ったやつです。まあどちらでも使えれば良し。
いくつステータス値作るか分からなかったり、キャラにステータスを追加する時には便利なのかな。簡単にアイテムをキャラクターに持たせる場合にもいいかもしれない。