三国志NET設置

  • 目次

前準備

  • CGIを一度も設置したこと無い人は、まず掲示板設置で練習しましょう。
  • いろんなことを自力で調べる必要があります。試しに、次の事をやってみるといいでしょう。
    • CGIが利用可能な無料レンタルサーバーを借りる。手軽な「infoseek isweb」あたりでOK。
    • 定番掲示板の「yybbs」を設置してみる。KentWebにあります。
    • できれば、そこにあるPerl入門も少し目を通しておくといいでしょう。もし改造するなら、当然それぐらいの知識は必須。
  • おもむろにNetwork Game Projectからスクリプトを入手します。
  • これを試験設置しますが、できるだけローカルで実行することをお勧めします。
  • 無料鯖に一時的に設置するのは構いませんが、それで人に教えるのはやめましょう。友達とかでもダメです。設置ができたら削除しましょう。
ローカル実行環境を整える
  • 単純に言うと、ActivePerlとAN HTTPDがあれば動きます。
  • やり方はKentWebに載ってるので、ちゃんと読みましょう。

設置

  • 基本的にあんまりアドバイスはありません。そこまで本格的な知識も必要ないので、できるだけ自分で調べられるようにしましょう。
  • 出易いエラーは「500」。次の事を確認します。
    • ローカルでなければ、ちゃんとパーミッションは設定しているか?
      • プロバイダによってはパーミッションを制限している場合もあるので、そのへんはしっかり調べましょう。
  • 一度設置ができたら、有料のレンタルサーバーを借ります。「チャット禁止」や「高負荷CGI禁止」などの表記がある場合も少なくないので、ちゃんとそういった用件を読んだ上で借ります。
    • 最初は月額300〜1000以下で十分です。人が増えるとそれではもたなくなる場合がほとんどです。

簡単な楽しみ方

武器、書物の変更
  • 改造に比べると、ほとんど知識はいりません。特にExcelなどCSV対応ソフトがあれば簡単に出来ます。
    • できるだけ、テキストエディタと表計算ソフトの両方を揃えたほうが作業が楽になります。
    • どちらも無料で利用できるものがあります。テキストエディタはTeraPad、表計算ソフトはOpenOfficeなどがあります。
    • CSVと武器データの相互変換は下記CSVの項を参照してください。
    • 公開されているMapEditorをちょこっと改造すると武器エディタになるのですが、誰かやってくれませんか?(人任せ
MAPの変更
  • 公開MAPデータのマップデータを、/log_file/f_town_data.cgi に上書きするだけ。
    • MAP作成はCSVとの相互変換でもできますが、MapEditorを利用することで、バランスを見ながら編集することが容易になります。
    • MapViewerを別窓に表示しながらやるのをおすすめ。
  • 新しくMAPを作ったら、ぜひ公開MAPデータにアップロードしてください。

三国志NETの改造

改造時のアドバイス

  • まず、ソースをよく読みましょう。あまり読みやすいつくりとは言えませんが、勉強だと思って……。
改造などの実装手順
  • 何を実装したいのかを考える。
  • 実装の仕方を考える。この時、どのようなパーツが必要かなども考えると良い。
  • 実装する。
  • モジュール(実装部分の)テストが必要なら行う。やらなくても良いが、やらないと問題が出た時の対処が面倒になる。
  • 全体テストを行う。まず、改造者自身の手で確かめる事。簡単な改造でも基本的にはやるべき。
  • ユーザーテスト(普通はβテスト)を行う。実際にいろんなパターンで動かされるので予期せぬエラーがこの時に見つかる。
  • エラーチェックが一段落して初めて実装完了となる。
  • 上記手順は絶対ではないが、かといって手を抜くと、痛い目にあう。ちなみに、一応正式というか一般的な手順を簡略化したもの。
以下、三国志NETに限らず、プログラミングのアドバイス事項
  • 改造は区切りごとにバックアップを取りましょう。オリジナルのバージョン表記を用意しておいて、それを区切りにするのも手。
  • 改造するときは、まずやりたいことを紙に書いて、そこから構成を練って行く事をお勧めします。
    • PC上に拘りたくなるのもわかるけど、自由度を考えると紙と鉛筆が非常に優秀。綺麗に書くより、自分にわかりやすいように文字と図を用い、線を引いたりしてうまく組み立てましょう。
    • 図や表を書くのが苦手、という人はとにかく概念で文字を○で囲ってみたり、箇条書きにして並べてみたものを比べたりするだけでも効果があります。
CSVへの相互変換
  • '<>'で区切られている各種データは、'<>'を','に置換することでExcelなどのCSV対応ソフトで容易に編集が可能になる。
  • ','から'<>'に戻す時は注意。Excelで保存を行うと、空欄部分がカットされるためそのまま置換を行うと誤作動を起こす。空欄にせず、代替文字([空欄]と書けばいい)を入れて、置換時に削除するようにする。 Terapadの場合、次の置換を行う。
    • 検索文字列「,」、置換文字列「<>」で全て置換
    • 検索文字列「[空欄]」、置換文字列「」で全て変換
  • なお、元から','を使っている部分では、一度他の記号に置換する必要があります。
JavaScriptを用いた更新時間の秒単位表示
  • あれは簡単なJavaScriptを用いているので、単純に使用しているサイトに許可をもらって転載したほうが早いです。
  • HTMLのソースを開けばわかると思います。その文をほぼそのままprintするだけで動きます。多分。
  • ちなみにこれを用いるとJavaScriptを使用できないプレイヤーは更新時間を把握できなくなるので、なんらかの措置が必要になります。
JavaScriptを用いたコマンドの偶数・奇数選択
  • 同上。基本的にあの程度ならもらってきたほうがよいと思います。
  • ソースから必要な部分を抜き出します。printする位置がおかしくならないように注意。

改造(スクリプト修正編)

ファイルロック
  • ファイルロックとは、他のプロセスがそのファイルを読み書きしているかどうかをチェックしてからファイル操作を行うことをいいます。このチェックをせずにファイルの書き換えを行うと二つ以上のプロセスが同時にファイルを書き換える事が起り、ファイルは破壊されます。
  • 三国志のファイルロックは非常にルーズです。ファイルが壊れる原因の多くはこれです。そのままで放置するとプロセスが残りサーバーに負荷をかける危険があります。
  • ファイルロックはver2.8で多少改善されていますが、ソースを読んだところファイルが壊れる可能性が十分にあり不完全です。新規登録、国宛や国政などいろいろなプロセスからファイルの書き込みがある事を考慮すると、すべてのファイルの読み書きにはファイルロックをかけるべきだと思われます。
    • ファイルロックはどこのHPでもサンプルコードが載っているのでそれを参考にすると良いでしょう。
軽量化
  • index.cgiの&CHECK_COMを軽量化すると、かなり軽くなります。
    • D_F_LOCKでファイルロックがかかっていたらスリープなんかせずに、そのままhtmlだけ送信してexitする。
    • 各キャラクターの更新時間のリストだけを別ファイルに保存し、更新の必要なキャラデータだけを読み込むようにする。これにより、ファイルアクセス数が相当減ります。
    • FORKを利用し、htmlだけを先に送信し、重たい処理は子プロセスで計算する。FORKについてはどこかのHPを参考にしてください。
  • これを全部やれば、かなり軽くなります。
コメント
  • 配布スクリプトの既存バグがいくつかあったと思うけど、その内容をここか掲示板にでも書いてくれれば、取った対応策を教えます。
  • というか、経験者の皆さんが教えてあげてください(ぇ
  • Ver2.8で登用をしようとするとサーバーエラーが発生するらしいです。 -- 2005-06-30 (木) 16:18:16
  • 修正できなくて困ってる人がいるようでしたら、解析してみますけど……。気力と時間があるときに -- 疾 2005-07-05 (火) 03:06:11
  • 登用ができないバグは直ってる・・・らしい。 -- 2005-07-05 (火) 13:53:48
  • 子プロセス……参考になりました。ありがとうございます! -- 2005-09-21 (水) 20:51:50
  • 初心者です。”JavaScriptを用いたコマンドの偶数・奇数選択”の具体的方法をご伝授ください -- Sho 2006-01-13 (金) 22:53:50
  • 初心者です。”JavaScriptを用いたコマンドの偶数・奇数選択”の具体的方法をご伝授ください -- Sho 2006-01-13 (金) 23:11:34
  • 登用のバグは、index.iniファイルのREFREEチェックをオンにしたら起こったようです。 -- 2006-11-12 (日) 15:38:25

改造(実用編)

ステータス画面のコマンド表上に時間を表示する。

  • &ref(): File not found: "comtime.html" at page "設置と改造";
  • 時間が変則の場合は、場合分けをしてください。
  • その際、「ターンの開始時間」か「ターンの終了時間」のどちらで時間が変化するか、しっかり判断してください。
    • $next_time_2はJavaScriptでのカウントダウン表示用の変数をまとめて読み込んでるだけなので使わないなら無視して構いません。
 【status.cgi:120行目あたりのFOR文を差し替える】
	$next_time = int(($kdate + $TIME_REMAKE - $tt)/60);
	if($next_time < 0){
		$next_time = 0;
	}
 
	$next_time_2 = $kdate + $TIME_REMAKE - $tt;
 
	for($i=0;$i<$MAX_COM;$i++){
		($cid,$cno,$cname,$ctime,$csub,$cnum,$cend) = split(/<>/,$COM_DATA[$i]);
		$no = $i+1;
		$acmin = $min + $next_time + $i * ($TIME_REMAKE/60);
		$achour = $hour;
		$acday = $mday;
 
		while($acmin >= 60){
			$achour++;
			$acmin = $acmin - 60;
		}
		while($achour >= 24){
			$acday++;
			$achour = $achour - 24;
		}
		if($cid eq ""){
			$com_list .= "<TR><TH>$no</TH><TH><P title=\"実行時間$acday日$achour時$acmin分\">【$wyear年$wmonth月】</P></TH><TH> ----- </TH></TR>";
		}else{
			$com_list .= "<TR><TH>$no</TH><TH><P title=\"実行時間$acday日$achour時$acmin分\">【$wyear年$wmonth月】</P></TH><TH>$cname</TH></TR>";
		}
		$wmonth++;
	
		if($wmonth > 12){
			$wyear++;
			$wmonth = 1;
		}
	}
  • ここにあるソース、実装した場合は一言寄せてくれると嬉しいです。 -- 2005-07-17 (日) 13:05:25
  • うちとこで実装してみました。あんまり気付かれないのですが,個人的に気に入っています。どうもありがとう。 -- 2005-07-21 (木) 18:58:37
  • ところでスクリプトが半分くらい消えてるのはわざと? -- 2005-07-21 (木) 19:20:55
  • 直しました〜 -- 2005-07-21 (木) 23:59:47
  • うちはコマンドリストが長いので,if($achour >= 24){ 〜 はwhile($achour >= 24){ に変えてます。 -- 2005-07-22 (金) 08:50:51
  • 只今設置に向け勉強及び見た目の機能の改造中。使わせてもらいました^^いい感じですね〜 -- 2005-07-29 (金) 13:09:46
  • 使わせていただきました。まだいろいろ勉強中なので助かりました。有難うございました。 -- weasel 2005-08-13 (土) 12:38:11
  • 使わせていただきました。まだいろいろ勉強中なので助かりました。有難うございました。 -- weasel 2005-08-13 (土) 12:38:23
  • 使用させていただきました。大変助かっております -- IMPULSE 2006-01-11 (水) 23:40:37
  • 1月と表示するより01月と表示した方が、見た目が綺麗かも…。 -- shiro 2006-01-12 (木) 14:12:32

  • 以下追記しましたが、細かい説明を書いてないので、その点ご留意を

次の更新時間をJavaScriptで秒単位カウントダウンさせる

  • $next_time2はCGI側で取得した時間です。上記ソースを利用してる場合は、そのまま利用できます。
print <<"EOM";
<script type="text/javascript">
<!--
var next_time = $next_time_2;

function count_time(){
	clearTimeout(set);
	if(next_time > 0){
		next_time--;
		var n_min = Math.floor(next_time / 60);
		var n_sec = next_time % 60;
		if(n_min < 10) n_min = "0" + n_min;
		if(n_sec < 10) n_sec = "0" + n_sec;
		document.count_down.time_count.value = n_min + "分" + n_sec + "秒" ;
		if(next_time > 0){
			set = setTimeout("count_time()",1000);
		}
	}
}
set = setTimeout("count_time()",1000);

// -->
</script>
EOM

奇数・偶数のコマンドを選択させる

  • 奇数偶数以外にも少し変更すれば使えるはずです。
print <<"EOM";
	<script type="text/javascript">
	<!--
	function cbo_select(prmStartNo,prmPeriod){
		var intA;
		for(intA = 0;intA < document.all.no.options.length;intA++){
			document.all.no.options[intA].selected = false;
		}
		for(intA = prmStartNo;intA < document.all.no.options.length;intA = intA + prmPeriod){
			document.all.no.options[intA].selected = true;
		}
	}

// -->
</script>
EOM

ボタンは

<input type = "button" value = "奇数選択" onclick = "cbo_select(1,2)">
<input type = "button" value = "偶数選択" onclick = "cbo_select(2,2)">

など。

  • 偶数、奇数選択のスクリプトを頂きました。掲載してくれた方に感謝致します。 -- 桃缶 2006-02-25 (土) 11:33:40
  • う〜ん うまく追加できない・・・。どうふうに追加したら良いの? -- 運石 2006-09-09 (土) 18:40:44
  • やっと出来た〜 意外とシンプルだったwヒントくれなかった方感謝します。 -- 運石 2006-09-11 (月) 00:22:46
  • やっと出来た〜 意外とシンプルだったwヒントくれなかった方感謝します。 -- 運石 2006-09-11 (月) 00:23:24
  • 僕もようやくできました… --   2006-10-11 (水) 22:43:10

管理ツールにおける初期化ミスの防止

  • 管理ツールで間違えて初期化ボタンを押して初期化されないようにします。
  • 手順は3つです。プログラミングがわからなくても実装できるように順に説明します。
    編集するファイルはadmin.cgiです。まず、次の行を検索してください。
    <input type=hidden name=mode value=INIT_DATA>
    これを以下のように置き換えます。これは、初期化確認画面を指定するためのものです。
    <input type=hidden name=mode value=RESET_CONF>
    次に、確認画面を表示する関数を実装します。以下をどこかに記述してください。関数の内部でなければどこでもいいです。
    (わからなければ、else{&TOP;} の次の行に入れてください)
#_/_/_/_/_/_/_/_/_/_/_/#
#_/  初期化確認画面  _/#
#_/_/_/_/_/_/_/_/_/_/_/#
sub RESET_CONF {

if($in{'id'} ne "$adminid" || $in{'pass'} ne "$adminpass"){
&ERR2("ID、パスワードエラー $num ");}
 
&HEADER;
print <<"EOM";
<h2>管理ツール</h2>
<CENTER>
<table width=80% cellspacing=1 border=0 bgcolor=$TABLE_C><TBODY bgcolor=$TD_C4>
<TR><TH colspan=3>管理メニュー</TH></TR>
<TR>
<TD>初期化してよろしいですか?</TD>
<form method="post" action="admin.cgi">
<Th>
<input type=hidden name=mode value=TOP>
<input type=hidden name=id value="$in{id}">
<input type=hidden name=pass value="$in{pass}">
<input type=submit value='キャンセル'>
</Th>
</form>
<form method="post" action="admin.cgi">
<Th>
<input type=hidden name=mode value=INIT_DATA>
<input type=hidden name=id value="$in{id}">
<input type=hidden name=pass value="$in{pass}">
<input type=submit value='初期化する'>
</Th></form>
</TR>

</TBODY></TABLE>

<form method="post" action="index.cgi">
</select><input type=submit value='編集を終える'>
<br></form>
</CENTER>

EOM
open(IN,"$ADMIN_BBS");
@A_BBS = <IN>;
close(IN);

print "<center><table width=80% border=0 >@A_BBS</table></center>";

&FOOTER;
exit;
}

最後に、この画面を呼びだす部分を追加します。次の行を検索してください。

elsif($mode eq 'INIT_DATA') { &INIT_DATA; }

ここに、このように追加します。

elsif($mode eq 'INIT_DATA') { &INIT_DATA; }
elsif($mode eq 'RESET_CONF'){ &RESET_CONF;}

以上で完了です。動作としては、本当にワンクッション置いただけのものです。

  • ちなみに、仕組みを理解したら解雇防止等にも使えます。確認画面をつけたいと思う箇所は何箇所かあると思うので、どうでしょうか -- 2006-06-10 (土) 01:44:14
  • いただきました。ありがとうございます。 -- 2006-09-11 (月) 13:09:56

トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2007-02-19 (月) 02:23:53 (4354d)