・架空武将ジェネレーター作成ガイド(システム編)

 こちらでは、私awakが作成した架空武将ジェネレーターのシステム解説と改造のガイドを行います。 本来、これは戦国史シナリオ制作の支援の為に作ったものなので、シナリオ制作に当たって自分のシナリオに合った改造をすることはいくらでも推奨します。これらの架空武将ジェネレーターの改造した上でのアップロードは、何処かにawakの名を残して頂けるなら許可は取らなくて結構です。

■システム解説

 一連のジェネレーターはJavaScriptで構築されてます。ですので、Javaの知識がなくても改造が出来るよう必要最低限の解説をします。勿論、十分知識のある方は自分で改良を加えていって下さい(私自身Java初心者の域を出ないので、拙いプログラムかと思われるでしょうがご容赦下さい)。
 まず解説に当たって、ジェネレーターを適当に一つ選んでエディタで開いて下さい。エディタは何でも構いません。表示される文言の中で、重要な部分について解説します。

arr11= new Array("○○","○○",……)
 ファイルによって番号や種類が違いますが、arr1n(nは任意の数字)の行で名前の要素を定義します。このシステムの根本的原理というのは、例えば、
arr11= new Array("東","西","北","南")
arr12= new Array("山","川","原","田")
arr13= new Array("信","家","秀")
arr14= new Array("長","康","吉")
と定義しておくと、各行から要素を一つずつ取り出して繋げることで「西田家長」「北山秀康」「南原信吉」……といった名前が4×4×3×3=144通り作れる、ということです。括弧の中の要素が増えれば増えるほど、多様な名前が作れます。試しに開いてみたファイルをいじくってみて下さい。"○○"の個数は増やしても減らしても構いません。変化を加えると、現れる名前にその変化が反映されているのがお分かり頂けるかと思います。

arr21=new Array("1","2","3",……)
 arr21の行は、能力値に用いられる数字を定義します。当然ながら、0〜10の範囲で設定することになります。多くのファイルで"1"とかを複数設定していますが、これは括弧の中からどの要素が選ばれるかはランダムなので同じ要素を多数設定するほど選ばれやすくなることによります。だから、arr21=new Array(……)の括弧の中身を"1"を1個、"2"を3個、"3"を4個、"4"を2個にしておくと、生成された武将の能力値に1が登場する確率は1/10、以下2は3/10、3は4/10、4は2/10となり、能力値の傾向や平均をコントロールすることが出来ます。

arr31=new Array("1","2","3",……)
 arr31の行は、忠誠と野望の値に用いられる数字を定義します。多くのファイルでは、二つの値の配列は共用になっています。

arr41=new Array("14","15",……)
 arr41の行は、武将の年齢に関わる数字を定義します。このシステムでは、武将の生没年は
   (武将の生年)=(武将の登場年)−X
   (武将の没年)=(武将の登場年)+(武将全体の寿命の平均値。既製のファイルではほぼ60)−X
       (X:arr41の行で設定した数字の中から、任意に一つ選ばれた数字)
という計算式で、設定されます。つまり、arr41の行から選ばれた数字は武将がゲーム上に登場した時の年齢になり、また、arr41行中の数字の最大値と最小値との差をAとすると、武将の寿命は(武将全体の寿命の平均値)±Aの範囲に収まります。

arr51=new Array("K_KUNI001","K_KUNI002",……)
 arr41の行は、武将の登場する国・城を定義します。


要素を単独で用いる場合(数字など)
function arr2(){result="---";while(result.length>(strlen*2)){a=Math.floor(Math.random()*arr21.length);result=arr21[a];}return result;};
要素を四つ繋げる場合
function arr1(){result="-----------------";while(result.length>(strlen*16)){a=Math.floor(Math.random()*arr11.length);b=Math.floor(Math.random()*arr12.length);c=Math.floor(Math.random()*arr13.length);d=Math.floor(Math.random()*arr14.length);result=arr11[a]+arr12[b]+arr13[c]+arr14[d];}return result;};
 この行は、arr11等の行で指定した配列の中から一つずつ要素をランダムに選んで繋げる動作の設定を行います。但し、戦国史には武将の字数制限がある(半角文字20文字分。全角1文字=半角2文字)ので、あまり長くなりすぎないよう字数に制限を掛けています(上の例だとそれぞれ半角2文字、半角16文字まで)。
 なお多くのファイルでは、arr1()は名前の作成、arr2()、arr3()は能力値の決定、arr4()は武将の年齢に関わる数字の決定、arr5()は武将の登場する場所の決定といった、諸動作に割り振られています。


for (y = 0; y < 10; y++){for (i = 0; i < 10; i++) { …… }}
 点線で示された部分を10×10回繰り返します。実際には、10年にわたって一年当たり10人の武将が登場します。ここの数字を変えることで生成される武将の人数を調整できます(多くしすぎるとPCの動作が重くなることがあります)。

document.write('"');document.write(arr1());document.write('", ');
 先述の行で定義した動作「arr1()」を実行して武将の名前を生成します。

document.write(', 0, 5, 0, ');
 登場してくる武将が保有する兵力を設定します。兵力固定が気に入らない方は、
document.write(', 0, ');document.write(arr2());document.write(', 0, ');
というように書き直してみるのを、お勧めします。

document.write(1550+y-arr4());document.write(', ');
 武将の生年を設定します。arr4()で選ばれた数字が、先述の数式のXに相当します(上の数字は、四国史仕様のジェネレーターのものです)。

document.write(1610+y-arr4());document.write(', ');
 武将の没年を設定します。arr4()で選ばれた数字が、先述の数式のXに相当します(上の数字は、四国史仕様のジェネレーターのものです)。ここでは、(武将全体の寿命の平均値)=1610-1550=60となっています。

document.write(1550+y);
 武将の登場年を設定します。


 以上が、システムの要点です。さらに、条件分岐と乱数を用いて複数系統の命名法を一つのジェネレーターで実現することも出来ます。
xx = Math.floor(Math.random() * 2);

if (xx < 1) {document.write(arr1a());} else {document.write(arr1b());}
 名前の作成の動作をarr1a()とarr1b()との二種類作っておいて、上のように記述すると1/2の確率でどちらかの動作が行われます。

 これらのことを参考にして、自分だけのジェネレーターを作ってみてはいかがでしょうか。

    参考リンク:とほほのWWW入門  http://tohoho.wakusei.ne.jp/www.htm
             (htmlのタグ、Javaの概要について分かりやすく説明されてます)



  (お知らせ)
  2004/05/29以前にも試用版をあちこちで公開してきましたが、
  2004/05/29以前のverでは、武将データの登場城・国の後に全角の空白が入っていて、
  生成されたデータをそのままシナリオに貼り付けてもエラーとなってしまう事態が発生します。
  解消するには、for (y = 0; y < 10; y++){for (i = 0; i < 10; i++)で始まる行の最後にある
  document.write(" <br>")をdocument.write("<br>")に修正することで解消されます。
  (上の行のbrは実際は半角。)
  御迷惑をお掛けしたことを、お詫び申し上げます。