FFA改造のコツ


へっぽこプログラマーのカビファ改造者 らる のFFA改造のコツ。
このページはカビファとは一切関係ありませんので、FFAを改造したい人などがお読みいただければ。
また、FFAのバージョンは いくのCGIのHP 様で配布されている FFA いく改ver2.00 です。
このページは改造初心者向けに書かれています。ソースが汚いのはご了承ください。

制作言語はperl
使用環境はテキストエディタ(サクラエディタがおすすめ)、ActivePerlです。
perlの知識などは別のサイトや参考書で調べてください。

  • なぜこのようなページを作ったのか。
1.スクリプトについての問い合わせが多かったため。
2.FFA改造について詳しく書いているサイトがあまりなかったため。
3.暇だった。

  • FFA設置者の方へ(2010/02/19)
FFAいく改(以下「このバージョン」)では穴が多数あります。
例を挙げると、カビファでも流行った人為的データ破損の穴や、スクリプトの覗き見等が簡単にできます。

【対策方法】
regist.pl内のchara_load内の最初に以下の2文を追加
$in{'id'} =~ s/\.//g;
$in{'id'} =~ s/\///g;
これでFFAのファイルを覗き見されなくなるはず。
もう一つの人為的な破壊についてですが、悪用される可能性があるのでメール等で問い合わせてください。


  • その1 - とりあえずFFAいく改はどのようなの仕組みで動いているか把握する(2010/02/15)
このバージョンではユーザーデータを@chara配列で管理しています。
たとえば $chara[0]はID $chara[1]はパスワード $chara[2]はユーザー名 とのようになっています。
これは配布ファイルのログ.txtに記述されているのでそこを参照しながら作業を行うと効率的です。
保存されているユーザーデータは「<>」で区切られており、splitを行うことで配列に渡しています。
これがサブルーチン&chara_load;(regist.pl)の中身です。

また、キャラデータを保存するときは&chara_registを呼び出すことで行えます。
このサブルーチンを呼び出すと$new_charaという変数にキャラの整合性を保つためのデータが入ってきます。
戦闘後等でステータスへ戻る等にmydataのvalueが$new_charaになっているのはそのためです。

ここまでわかれば改造は簡単です。
1.キャラデータを読み込む
2.キャラデータを変更する
3.キャラデータを保存する
基本的にこの3ステップで行えます。

また、プログラムが開始するとまずはデコードが行われ、引数が%inに格納されます。
このうちの$in{'mode'}が$mode変数にコピーされ、そのサブルーチンが呼ばれるようになっています。

【重要】変数について
このゲームの変数はほぼ(実は全部?)グローバル変数で宣言されています。
変数名がかぶらないようにしましょう。

  • その2 - 実際に改造をやってみよう(2010/02/15)
まずは簡単な改造を行ってみましょう。
カビファの中でも簡単に制作できるものはヒント屋、リセットなどがありますが、1から新しい機能を作るのは大変なので
ステータスの変更(sts.cgi)を改造してみましょう。

sts.cgiは各ユーザーのステータスの参照、クリティカルのコメントの変更が行えます。
では、ここでカビファでは実装をしていないですが対人戦での勝敗コメントを追加してみましょう。

【重要】改造前の確認
まず、ユーザーデータの格納される@chara配列がどこまで使われているのかを確認しましょう。
ちなみにデフォルトでは34番まで使われています。
ここの値がかぶってしまうと続行不可能になってしまう可能性があります。気をつけましょう。

前述した通り、デフォルトでは34番まで使われているので勝ちコメントを35番目、負けコメントを36番に入れることにしましょう。
(2つも使いたくない人はエスケープできる記号等で区切り、使用するときにsplitすると良いでしょう。)
まずsts.cgiのクリティカルコメントの入力部分であるHTMLをコピーしましょう。(input type="text" name="waza"の部分。TableがおかしくならないようにTR,TDタグも。)
そしたらname="waza"の'waza'をわかりやすい好きな名前にしましょう。('win_comment'等)
そうすればそこに入力された値が受け取れるようになります。
負けコメントも同じように設定しましょう。

そうしたら下へスクロールさせ、 sub st_buy まで移動します。
ここで先ほど渡した値を受け取り、ユーザーデータに保存します。
引数はその1にも書かれたとおり%inに格納されます。
なのでname="win_comment"とした場合は、$in{'win_comment'}に格納されます。
そのままスクロールするといかにもユーザーデータを書き換えている部分があります。(&get_host;以降、&chara_regist;以前)
ここに
$chara[35] = $in{'win_comment'};
$chara[36] = $in{'lose_comment'};
と入力しましょう。
その後ユーザーデータを確認すると入力した文字が保存されているはずです。

【注意】
win_commentは"name="で決めた勝ち台詞の文字に変える
lose_commentは"name="で決めた負け台詞の文字に変える

最後にこれを表示させましょう。
wbattle.plを開き、戦闘結果判定の書かれている場所まで移動します。

勝ちコメントを表示させたいので以下の文を少し改変し、表示させたい場所に$chara[35]を追加します。
$comment = "<b><font size=5>$chara[4]は、戦闘に勝利した!!</font></b><br>";
例:
$comment = "<b><font size=5>$chara[35]<br>$chara[4]は、戦闘に勝利した!!</font></b><br>";

そして負けコメントも同じように表示させたいので、以下の好きなところに追加しましょう
$comment = "<b><font size=5>$chara[4]は、戦闘に負けた・・・。</font></b><br>";
例:
$comment = "<b><font size=5>$chara[36]<br>$chara[4]は、戦闘に負けた・・・。</font></b><br>";

これで動作の確認を行ってください。
また、WEBにアップロードする前に必ずプログラムエラーを吐かないか確認しましょう。

最後に忘れないようにlog.txtに35,36のメモを残しておきましょう。

【重要】エラーの確認方法
注:ActivePerlがインストールされていなければできません。
1.コマンドプロンプトを開き、以下の文字を入力します。
perl -c(最後に半角スペースあり。)
そして確認したいファイルをプロンプトにドラッグします。するとそのファイルのパスが追加されるのでそのままエンターを押します。
syntax OKと出れば問題ありません。
それ以外が出た場合は、エラー行付近が表示されるのでそこを確認し再度チェックしましょう。


【ユーザーバックアップのやり方】(2010/11/24)
質問フォームにてユーザー自身がバックアップを取る方法についてあったので簡単に紹介します。

FFAのユーザーデータは「charalog」(変更していない場合)フォルダにID毎に保存されます。
保存は上でも紹介しましたが、chara_registを呼んだときに行われます。

と言うことは、「chara_regist」というサブルーチンをそのままコピペし、
保存フォルダを変え別のサブルーチン名にすればバックアップが実装できると言うことになります。
あとは、ステータス変更画面等からバックアップ用のサブルーチンにアクセスするサブルーチンを製作し、アクセスさせればOKということです。
簡潔に書いたので、わかりにくいところ等あるかと思いますが、perlをちょっとでも勉強すれば理解できる内容だと思うので頑張ってください。


質問フォーム

  • とても興味深く拝見させて頂き勉強になりました
    ffaいくver2.00を設置している者なのですが、
    そちら様で実装されている
    ユーザー自身がバックアップを取るシステムを
    どうやれば作成できるのか教えてほしいのです。
    大変図々しいと重々承知の上で要望させて頂きます。
    社会人になられ仕事で忙しいという噂も耳にしましたが
    なにとぞよろしくお願いします。
    -- おっぴーさん (2010-11-07 17:04:31)
名前:
コメント:

Byらる
最終更新:2011年12月29日 10:12