ドラクエって実は凄い。

私が駆け出しだからなのかもしれないが、
システムをWebで真似ようとして、そのアルゴリズムを描き出してみると…

単純に描いただけでもこれだけある。


本来はコマンド選択式の戦闘UIなのだけど、
魔法の動作が非常に複雑そうなので、あくまでも今回は基本攻撃だけで計算する流れにした。
これに状態異常が加わるとさらに複雑。
毒や麻痺でHPやコマンドに制御を加えないといけないし、命中率や回避率やクリティカル判定もあるし、
混乱状態になったら味方の攻撃でもダメージが発生して画面をシェイクする関数を呼び出さなければいけない。
私が子供の頃遊んだFF4はAI(AutomaticInterface:この場合戦闘AI)が導入されたとかで当時宣伝してたけど…
戦闘だけでこれだけ複雑なら宣伝したくなるだけのことはあると思う。
RPG構想だけでこの複雑さ。好きなACTゲームを作るんてまだまだ夢の夢やでェ…



できるだけ近しいものにしたいけど、オブジェクト指向も理解したいので必要最小限から作っていこう。
今回は必要なファイルとデータの受け渡しを明確化する。
訓練で勉強したmailformを元に作っていく。
input.php ― input.tpl(form形式)[入力{名前(name):textbox、性別(gender):radio、職業(job):option}、確認画面へのボタン]
   ↓$_POST['name'],$_POST['gender'],$_POST['job']  ↑SESSION['post_data']
confirm.php ― conrifm.tpl[エラーチェック、戦闘開始ボタン]
   ↓
battle.php ― monitor.tpl[とりあえず入力なし、計算が速すぎる場合は時間パラメーターで管理予定]
   ↓
fin.php ― fin.tpl[結果表示、input.phpへ戻るボタン]



定義することが見込まれる変数
input.php {
 $name,$gender,$job…confirmで入力エラー発生し、戻ってきたときに$_SESSIONの値を格納しておく変数。
           $SESSIONはリセットされてはじまるので必要。
}
confirm.php {
 $errors(array)…name,gender,jobの入力エラーの有無+エラーの内容を表すstringをerrflgに格納した配列。
         今回、3要素がそれぞれエラーになるケースは未入力の1通りしかないので、
         エラーの種類を書き込まず、直接bool値を格納するだけで良さそう。
 $errflg(bool)…エラーフラグ。配列の値を論理積のif文で制御するなら、
        この変数をいちいち渡す必要も無い気がするけど…解りづらくなるからかなぁ?
 $_SESSION['post_data']…input.phpから送られてくる入力内容を格納した配列キー。$_POST値をまとめて格納。
      ['input_error']…エラー時にinputへ送る配列キー。
               ユーザーが入力したStringなどが値として入っており、打ち直しの手間を解消する。
}
ここからは全く自信がない…
battle.php {
 $player(array)…プレイヤーのステータスを格納した配列。選択したjobで分岐(固定値)。
 $enemy(array)…敵のステータスを格納した配列(固定値)。
 $daflg(bool)…敵と味方双方の生死をif文で判定する。攻撃時、被撃時一回ずつ判定。
 $status(integer)…HP変化時にif文でチェックし、bool値に似た値を格納する。(0〜3)
          プレイヤー死亡時=赤(0),HP15%未満=オレンジ(1),else正常=白(3)
          jsで画面の色を変更するのに使う。
 $dmg(function)…ダメージ計算式を決定する関数。後でステータスの影響がある計算式に作り変えたい。
         今回は固定値で削りあう(当然結果も固定されてしまう)。
}

ここからは完全に妄想…
ダメージで画面をシェイクするエフェクトを考える。
Webで表示された画面(div#container)のmarginをjQueryで瞬間的に書き換えたい
←8px&&↑5px,  →12px&&↓7px, ←&11px&↓5px,… みたいな感じで。
値はmt_rand()で5〜15pxが出るようにすればなお良いかな?

問題はシェイクが発生する瞬間だ。jsはあくまでもイベントトリガーが必要だ。
confirm.phpの戦闘開始ボタンのonclickイベントというよりも、battle.phpのonloadイベントになりそう?
プレイヤーがphpの計算で出たダメージを受けた瞬間だけjsで画面を制御する。
どう考えたってそれはonloadからの経過時間パラメーターの制御じゃダメだ。…うーんドウシヨウ
phpの計算過程でjsを呼び出したりする制御ってできるのかなあ?ソコが一番の問題だ。
Ajaxっていうのがソレなのかな。使えたらカッコイイなぁ…

最近好きだった作品を読み返しておりました。

先日、芥川龍之介の誕生日をGoogleで偶然知り、「杜子春」を読みました。
忘れたくないな、とふと思い出し、小泉八雲の「草ひばり」「停車場にて」を読みました。
どれもすばらしい作品です。


人間関係が軽薄になるように感じる現代で、いつか読者たちがこうした物語の
登場人物たちの心情を理解できなくなってしまう日は来るのでしょうか?
ふと、そう不安になることがあります。



「土に根を下ろし 風と共に生きよう
種と共に冬を越え 鳥と共に春を謳おう」
天空の城ラピュタの台詞です。
人間がどんなに便利な文明を手に入れたとしても、
人が生きるのに根付いて切り離してはいけないものがあると私も思います。
文明が便利になればなるほど、あるがままの苦楽を受け入れて生活しようととすることすら
忘れ去られてしまうような気がしてなりません。


コイルに磁石を通すと電流が発生するように、
世の中には変化するものを元に戻そうとする力が生まれる仕組みがあります。
例えばそれは増えすぎた人口に対してもあったとして、
それが戦争だったり、原子力だったりするのかな、と考えています。


映画ではこれを、
「どんなに恐ろしい武器を持っても、
たくさんのかわいそうなロボットを操っても、
土から離れては生きられない。」と解釈し、


フランス語ではこれを
「生きるために 死をまき散らす必要はなく
たくさんのかわいそうなロボットの必要はない
しかし人は大地から遠く離れて生きることはできない。」と訳しています。

生きるために死を撒き散らす―まさに3.11の原発事故を思い起こします。

カレー.PHP

オブジェクト「空腹だから」
クラス「カレーライス(の作り方)」
メソッド「$仕込み」={$洗い、$皮むき、$カット}
    「$加熱処理」=($炒める、$煮込む)
インスタンス = カレーの作り方を知っている人($smarty君)
 この人、本当はいろいろな雑務ができるのだけど、今回はカレーを完成させるのに必要最低限なことだけを頭に入れておいてもらおう。
     $カレーを作るのに必要な基本作業のため に 炊飯と盛り付けのできる新人さん を投入する。
                   ↑($smarty = new Smarty)

※ここで頭に「$」の付いているものは、PHPの標準で使われる言葉ではなく、自分の都合で名前をつけた変数か、関数の名前だよ!
・-------------------------------------------------カレー.php---------------------------------------------------------------
$野菜=配列(
      'にんじん'= にんじん一本,
      'じゃがいも'= じゃがいも2個,
      'たまねぎ'= たまねぎ2個,
    )
$野菜[0](野菜の配列の0番目は) == にんじん(key) => にんじん一本(value)
  count($野菜){ == 野菜のkeyの数(valeの数じゃないよ!)}== 3種類
  mt_rand (0番目から,($野菜の3種類)-1番目まで) = ランダムに選ばれた野菜1種類

↓任意の関数名前 = function(引数){
$仕込み = 仕事だよ(食材に対する){
洗い(メソッド1);
皮むき(メソッド2);
$カット(メソッド3);
}

この関数に$野菜(の配列)を投入すると…
$仕込み($野菜) == 洗って皮むきされてカットされた、野菜の配列が(返り値として)出てくる。ので

$味付け($加熱処理($仕込み($野菜))) とすると… = 完成されたカレーのルー が返ってくる。
 ↑これら↑3つは関数↑  ↑コレだけ配列の引き数 

作るメニューに合わせて、動的に調理する、カレー.phpはここまで。
・-------------------------------------------配膳.tpl-----------------------------------------------------------------
ではこれを$smarty君に配膳してもらおう。
お米を盛り付けて、テーブルにおくだけの仕事だが、
お客さんの注文(入力)に合わせて、分量を動的に割り当てなければいけない。

//$smarty君は以下の2項目が決まらないと作業を始めてくれないので。
$smarty君の作業場所=("チキューの/日本の/東京の/〜〜〜〜〜/キッチンのはしっこ/")
$smarty君が受けた指示(テンプレートファイル)+盛り付けレイアウト(css)を元に
 盛り付けた料理(HTML+css)の提供先=("チキューの/日本の/東京の/〜〜〜〜〜/ひっくり返るちゃぶ台")
(assign)で盛り付けて(display)で提供だよ!くれぐれもスマートに頼むぜ!

 もしも(田丸さんのお腹がキングハラヘロッシュだったら){
  $smarty君よ -> 盛り付け($田丸さんのお皿へ,テラ盛りで。)
 }それ以外は{
  $smarty君よ -> 盛り付け($田丸さんのお皿へ,いつも通りで。)
 }

$smarty君はカレーじゃなくて、定食でもゴハンを盛り付けて出してくれる便利な子、なので
よく使われるイメージ…なのかな?
assgin以外にも便利なメソッドを持っているかもしれない。
お会計を代行したり、食い逃げを捕まえたりするような…?
・------------------------------------------------[EOF]-------------------------------------------------------------
解りやすくするために書いたけど、書くと意外にややこしくなったなぁ。
COOKIEまで絡めるとさすがに収集つかなくなりそうで無理だった…

ウチのPHPイメージは大体こんな感じです。
下手な例えできっと間違いも多いので、ご指摘とかありましたら是非お願い致します。

具体的過ぎるPHPを作ってみる。

$hoge = 'hogehoge'って言われると。
「ああ、うん。解るかよ」って思う。
混乱の原因は、具体的な数値やモノが入らず、関数名や変数が文字になってしまっているからだと思う。
だから極端にPHPを現実的にしてみた。

ハングアップギリギリのSK線経由サーバー

ピークを迎える朝8時頃で、およそ 4分/1パケットの通信量である。
AKABANEブランドのメモリはデータで溢れ、今にも空きが無くなりそう。
あわやメモリからデータがこぼれて、パケットに轢かれそうな様相を呈している。


そんな状態なので、データはパケットの格納スペースを我先にと奪い合う。
EKI-IN製CPU(大体3〜4コア)の先導も空しく、プロトコルを遵守することすらままならない。
データが壊れるのではないかと思うほど、実に腹立たしく効率的な圧縮をかけて、パケットは発信される。
もうこれ以上圧縮できないよ、っていうときに限ってFAT32フォーマットのデータがその質量を活かし、
他のデータを押しつぶすように格納スペースに滑り込んでくるから困ったものだ。


毎朝これだけサーバーがイッパイイッパイなのでいい加減、帯域制限をもう少し緩めて欲しい。
サーバーのストレステストというものはあるけれど、データにかかるストレスを思いやったことはさすがに無かった。



ライフラインのサービスは未だ独占性が強く、競争相手が居ないせいなのか、質が悪い傾向がある。
求職者支援訓練のように、国が支援し、民間がサービスを競うシステムを充実させて欲しい。