忍者ブログ

霧の残像領域

長文を流したいけど皆さんのTLを汚したくないときに使う場所です

[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

定期ゲーってどうやって作るの? 3話目
久しぶりに解説します。今回もAOAI.plを覗いていきましょう

≪前回までのあらすじ≫
システムを起動させて、データを読み込みました
ワオ! 全然進んでないね!

≪今回のめにゅう≫
205~218行……設定反映ゾーン
220~222行……デバッグコマンドゾーン
224~401行……メインループ!!(前編)



205~218行……設定反映ゾーン
全キャラを巡回して、設定を反映させます。この設定とは、継続の「その他の設定」に当たる物です。つまり、アイコンやセリフといったものです。これらのものは先に設定しないとこの回の戦闘とかに反映されないからね、真っ先にね

霧のシステムは基本的にこのようなループ構造をとります
for(my $eno=0; $eno<10000; $eno++) {
これは、enoの0番から9999番までを全部巡回するという意味を持ちます
おかしいじゃないか!この前キャラ数を数えたんだから余計なループは必要ないはずだろ!
この指摘はごもっともです。なぜかというと、先にループ構造を作った後に「キャラ数を数える」という根本的なことに気付き、キャラを数えるプログラムを作ったものの、動くから修正しなくていいやという怠慢の跡だからです
そして9999が限界なのは、「1万人も登録するわけないだろ~」という思いからではなく、あるプログラム上の利点から、あえて最大参加者数を9999人に限定しているのです
これは後日……いつか戦闘処理あたりを解説するときに明らかにします

my $name = $chara_list[$eno][1];
unless ($name){next;}
この部分はとても簡単な意味を持ちます。即ち、名前を参照して空欄なら存在していない・sakujoされたキャラ。ということは処理を行うことはないので飛ばしちゃえ、という処理なのです
FIX案)
名前参照しても使わないなら、最初から
# 名前をチェックしていないなら飛ばす
unless ($chara_list[$eno][1]){next;}
でいいじゃん!

いま思ったけどキャラ名が「0」というキャラが登録されたら熱くスルーされる存在になってましたね。やめよう、デバッグファイター

# 詫びNP
#$chara_list[$eno][23] += 1;

NPを配布するコマンドです。NPは最初に増えていた方がいいのでここに挟みました。#をつけるとプログラムではなくメモ書きになります

&setting_set($eno);

これが読み込んだ「その他の設定」を実際にデータに適用するプログラムです。どういうことかというと、一枚の紙に書かれた「その他の設定」の情報を、バラバラにして分かりやすいところに仕分けするイメージです
例えばアイコンURLはひとつひとつアイコンデータに入れておくのが好ましいし、セリフはセリフの場所にあるのが好ましいからです
&がシステム起動のマークみたいなものです
setting_setが、私が名付けた「仕分けするシステム」の名前です
($eno)は、「このenoのキャラを弄ってくれぃ」という命令です
最後の;は、ここでシステム起動を命令する文の終わりだよ、という気持ちを込めた句点みたいなものです。無いとエラー吐きます

220~222行……デバッグコマンドゾーン

# デバッグ
# パラメータ修正
# &all_parts_reset;

これらは通常使わないコマンドで、コメントアウトしています。コメントアウトとは、頭に#をつけてプログラムから一瞬にしてメモ書きに変えることで、システムを動かなくさせる忍法です

このコマンドはパーツのパラメータのリセットを行うコマンドです。デバッグコマンドですね。ちなみに全キャラの全パーツを新たなベース値でリセットするため、めっちゃ時間がかかります

224~401行……メインループ!!

来ました。戦闘前行動を行うプログラムです!ひとつずつ解説します
my @sakujo = ( );
my @mass_messe = "";
# メインループ
my $sleep = 0;
これは、必要な変数を定義する段階です。sakujoはsakujo、mass_messe は広域メッセージの保存先です。sleep は最後に解説します

for(my $act=1; $act<19; $act++) {
for (my $eno=1; $eno<10000; $eno++){

はい。「その他の設定」と違いますね。$actは戦闘前行動の項目一つ一つを意味します。キャラを巡回して一人一人上から下に戦闘前行動をやれない理由があります
このループの意味することは、項目一つ一つに対していちいちキャラを0から数え直している感じです
なぜかというと、一人一人上から下に戦闘前行動を行うと、見切りが崩壊するからです。eno1番のキャラが日記からアセンブルまで全部終わっても、eno20のキャラは日記すら処理されていません。なので、eno順によって非常にめんどくさかったり有利不利が大きかったりしてしまいます

この「戦闘前行動の項目ごとに最初から最後のキャラまでループさせる」という方式で初めて、ほぼ同時に日記を処理し、送品・送金を処理する……といったことをさせることができるのです

my $name = $chara_list[$eno][1];
unless($name){next;}
前と同じです

if($act == 1){
$log[$eno] .= '<br><table align="center" class="maintable"><tr><td>' . "\n";
 
my $day = $chara_list[$eno][10];
$log[$eno] .= '<DIV align="right"><I><A href="http://blacktea.sakura.ne.jp/AOAICGI/LOGIN/login.cgi" Target="_blank">>>継続登録はこちら</A></DIV>';
$log[$eno] .= '<A name="top">◆</A>tag_hasamimasu' . "<BR>\n";
$log[$eno] .= "<BR>\n";
$log[$eno] .= "<H1><I>第" . $day . "日目</I></H1>\n<BR>\n";
$log[$eno] .= "<I>Eno." . "$eno $name" . "の一日</I><BR><BR>\n";
 
my $mist = $game_data[1][2];
my $rad = $game_data[2][2];
 
$log[$eno] .= "<I>霧濃度" . $mist . "%</I>\n<BR>\n";
$log[$eno] .= "<I>電磁波" . $rad . "%</I>\n<BR><BR>\n";
 
 
$log[$eno] .= '<font color="teal">' . "<I>";
&news($eno);
$log[$eno] .= "</I></font><BR>";
 
$log[$eno] .= "<BR>\n";
 
next;
)
はい、訳が分かりませんね。HTMLを知っている方は、「んっ!」と反応したかもしれません。さらに詳しく見ていきましょう

if($act == 1){

これは、$actが一番最初、つまり戦闘前行動の一番最初であることを意味します。それって日記かな?でも、これは日記ではありません。日記より前に表示されるものを表示するコマンドなのです
ifは、英語そのまんまです。もし~ならば、です。()内のものが正しければ、{}で囲まれた命令を実行する、という分かれ道です。
つまり、$actのループの一番最初にだけ命令を遂行するコマンドなのです

$log[$eno] .= '<br><table align="center" class="maintable"><tr><td>' . "\n";

これはそのまんまです。$logというタンスの中の$enoの引き出しを開き、<br><table align="center" class="maintable"><tr><td>という文字を入れるイメージです。$logは特に重要な変数です。ずばり、更新結果全てが格納されている変数なのです。更新結果の、1ページずつ丸ごとです!
.=は文章の足し算を意味します。つまり更新結果のHTMLソースを上から順番に一行ずつ足し算していき、ウェブページをまるごと書いていくということです。幸い、メモリが爆発するほどのデータ量にはならない範囲の定期システムなので何とか間に合っています

HTMLについてはとても簡単なので同時並行で覚えていくと楽しいかもしれません。これもググるとたくさんのサイトがありますし、ぜひ個人サイトを解説してMIDIを爆音で流して文字をスクロールさせてください

あとはもう簡単ですね。同じように、$logにHTMLを上から順番に書いていくだけです。時折変数をロードして足し算すれば、キャラごとの、更新結果ごとに変わったページになります
例えば、

$log[$eno] .= "<H1><I>第" . $day . "日目</I></H1>\n<BR>\n";

は、<H1><I>第と$dayと日目</I></H1>\n<BR>\nを「.」で足し算!ドッキング!何日目かが更新ごとに自動的に変わるってことです
ちなみに文字を囲う""と''ですが、大きく違います。文中に"を使いたい場合、''で囲う必要があります。逆に'を使いたい場合、""で囲う必要があります。両方使いたい場合、""と''の囲いを「.」でドッキングする必要があります
後の違いは省きます

&news($eno);

自分の書いたログを僭越ながら皆様の結果に表示させる機能です。例によってどこかに書いてあるものを省略して関数にしています

文字が多くなってきたので、今日はこの辺で

≪今日のまとめ≫
基本はenoの最初から最後までループさせろ!
でした

拍手[1回]

PR

コメント

コメントを書く