int型配列とstring配列を合わせた構造体を作る

Last-modified: 2007-11-08 (木) 20:10:07

概要

 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のステータス用構造体として作ったやつです。まあどちらでも使えれば良し。
 いくつステータス値作るか分からなかったり、キャラにステータスを追加する時には便利なのかな。簡単にアイテムをキャラクターに持たせる場合にもいいかもしれない。