クエストギルド

モンスターを討伐して報酬を得たりすることができる施設です。
では早速、./libにkoubou.cgiを作りましょう。中身は

#=================================================
# クエストギルド Created by Merino
# system.cgiの変数にque_jyu toubatu_mons que_flg mokuhyou_mons mons_hantei追加。config.cgiにはmons_hantei追加
#=================================================
# 場所名
$this_title = 'クエストギルド';

# NPC名
$npc_name = '@ナムニャ';

# ログに使うファイル(.cgi抜き)
$this_file = "$logdir/quest_guild";

# 背景画像
$bgimg = "$bgimgdir/reborn.gif";

# クエストリスト
@quest_ban = (1);

#=================================================
# はなす言葉
#=================================================
@words = (
"ようこそ。ここは$this_titleです。クエストを受けにきたのですか?",
"どのようなクエストを受けるかは貴方の自由。依頼者が喜ぶような結果を出してくるんだよ!",
"自分の強さに合ったクエストを受けるんだよ!じゃないとクリア出来ないかもしれないから気をつけてね!",
"クエスト達成が難しくなったらキャンセルも受け付けるよ!",
);
#=================================================
# @しらべる>NPC
#=================================================
sub shiraberu_npc {
$mes ="え、何するんですか!やめてください!";
$mes = "ボソッ…私の気分が良い時は報酬におまけつきなんだよね…";
}

#=================================================
# 追加アクション
#=================================================
push @actions, ('クエスト');
push @actions, ('キャンセル');
push @actions, ('ほうこく');
push @actions, ('ひきだす');

$actions{'クエスト'} = sub{ &irai };
$actions{'キャンセル'} = sub{ &irai_kyan };
$actions{'ほうこく'} = sub{ &houkoku };
$actions{'ひきだす'} = sub{ &hikidasu };
#=================================================
# ステータス表示
#=================================================
sub header_html {
print qq!<div class="mes">【$this_title】!;
print qq|$e2j{coupon}: $e2j{hp}:<b>$m{hp}</b>/<b>$m{mhp}</b> $e2j{mp}:<b>$m{mp}</b>/<b>$m{mmp}</b><BR>|;

print qq| E:$weas[$m{wea}][1]| if $m{wea};
print qq| E:$arms[$m{arm}][1]| if $m{arm};
print qq| E:$ites[$m{ite}][1]| if $m{ite};
print qq| </div>|;
}

#=================================================
# @クエスト
#=================================================
sub irai {
my $target = shift;

my $p = qq|<table class="table1"><tr><th>クエスト名</th><th>ターゲット</th><th>目標数</th><th>契約金</th><th>報酬</th><th>難易度</th><th>詳細</th></tr>|;

for my $i (@quest_ban) {
	if ($kues[$i][1] eq $target ) {
		if ($m{name}) {
			if ($m{que_jyu} == 0 && $m{money} > $kues[$i][4]) {

				$m{que_jyu} = $i;
				$m{mokuhyou_mons} = 0; 
				$m{toubatu_mons} = $kues[$m{que_jyu}][3]; 
                                       $m{money}        -= $kues[$i][4]; 
				$npc_com = "あら、$kues[$i][1]の依頼を受けるようですね。無事に帰ってくることを祈ってますよ。";
			}
			else {
				$npc_com = "残念ですけど、貴方にはこのクエストを任せられないよ。他のクエストを受けてませんか?";
			}
		}
		else {
			$mes = "貴方にはこのクエストは合ってませんね…。";
		}
		return;
	}
	$p .= qq|<tr onclick="text_set('@クエスト>$kues[$i][1] ')"><td>$kues[$i][1]</td><td align="right">$kues[$i][2]</td><td align="right">$kues[$i][3]</td><td align="right">$kues[$i][4]</td><td align="right">$kues[$i][5]</td><td align="right">$kues[$i][6]</td><td align="right">$kues[$i][7]</td></tr>|;
}
$p .= qq|</table>|;
$mes = qq|どの依頼を受けるのですか?<br />$p|;
$act_time = 0;
}

#========================================================
#@ほうこく
#========================================================
sub houkoku {
if($m{mokuhyou_mons} >= $kues[$m{kue_jyu}][3] && $m{que_flg} == 1){
	$npc_com = "あら、無事に帰ってきたようですね。$kues[$m{que_jyu}][5]等の報酬は預かり所に送っておくよ。";
	&send_item($m,3,$kues[$m{que_jyu}][8]);
if(rand(5)<1){
	&send_item($m,3,$kues[$m{que_jyu}][9]);
}
if(rand(11)<1){
	&send_item($m,3,$kues[$m{que_jyu}][10]);
}
if(rand(50)<1){
               &send_item($m,3,$kues[$m{que_jyu}][11]);
}
	$m{que_flg} = 0;
               $m{que_jyu} = 0;#すべて初期化
               $m{mokuhyou_mons} = 0;
               $m{toubatu_mons} = 0;
}
else{
	$npc_com = "貴方はまだクエストを達成してませんよ?";
	return;
}
}
#=================================================
# @クエストキャンセル
#=================================================
sub irai_kyan {
if($m{que_jyu}){
	$npc_com = "そうですか…。依頼者には断っておきます。残念ですね。それと、契約金は返しませんからね?";
	$m{que_jyu} = 0;
	$m{que_flg} = 0;
	$m{toubatu_mons} = 0;
               $m{mokuhyou_mons} = 0;
}
else {
	$npc_com = "貴方はクエストを受けていないようだけど?";
}
return;
}
#=================================================
# @ひきだす
#=================================================
sub hikidasu {
my $target = shift;

# 送金があれば最初に受け取る
if (-s "$userdir/$id/money.cgi") {
	&_get_money;
	return;
}

my $is_find = 0;
my $p = '';
my @lines = ();
open my $fh, "+< $userdir/$id/depot.cgi" or &error("$userdir/$id/depot.cgiファイルが開けません");
eval { flock $fh, 2; };
while (my $line = <$fh>) {
	my($kind, $no) = split /<>/, $line;
	if ($kind eq '1') { # 武器
		if (!$is_find && $weas[$no][1] eq $target) { # 交換
			$is_find = 1;
			if ($m{wea}) {
				$npc_com .= "$weas[$m{wea}][1]をお預かりしました。";
				push @lines, "1<>$m{wea}<>\n";
			}
			$m{wea} = $no;
			$npc_com .= "$weas[$m{wea}][1]をお返しします";
		}
		else {
			$p .= qq|<span onclick="text_set('@ひきだす>$weas[$no][1] ')">$weas[$no][1]</span> / |;
			push @lines, $line;
		}
	}
	elsif ($kind eq '2') { # 防具
		if (!$is_find && $tates[$no][1] eq $target) { # 交換
			$is_find = 1;
			if ($m{tate}) {
				$npc_com .= "$tates[$m{tate}][1]をお預かりしました。";
				push @lines, "2<>$m{tate}<>\n";
			}
			$m{tate} = $no;
			$npc_com .= "$tates[$m{tate}][1]をお返しします";
		}
		else {
			$p .= qq|<span onclick="text_set('@ひきだす>$tates[$no][1] ')">$tates[$no][1]</span> / |;
			push @lines, $line;
		}
	}
	elsif ($kind eq '3') { # 道具
		if (!$is_find && $atamas[$no][1] eq $target) { # 交換
			$is_find = 1;
			if ($m{atama}) {
				$npc_com .= "$atamas[$m{atama}][1]をお預かりしました。";
				push @lines, "3<>$m{atama}<>\n";
			}
			$m{atama} = $no;
			$npc_com .= "$atamas[$m{atama}][1]をお返しします";
		}
		else {
			$p .= qq|<span onclick="text_set('@ひきだす>$atamas[$no][1] ')">$atamas[$no][1]</span> / |;
			push @lines, $line;
		}
	}
}
if ($npc_com) {
	seek  $fh, 0, 0;
	truncate $fh, 0;
	print $fh @lines;
	close $fh;
	
	require "./lib/_add_collection.cgi";
	&add_collection;
	return;
}
close $fh;

$mes = qq|どれをひきだす?<br />$p|;
$act_time = 0;
}
# ------------------
# ゴールドを受けとる
sub _get_money {
open my $fh, "+< $userdir/$id/money.cgi" or &error("$userdir/$id/money.cgiファイルが開けません");
eval { flock $fh, 2; };
while (my $line = <$fh>) {
	my($money, $message) = split /<>/, $line;
	$m{money} += $money;
	if ($money >= 0) {
		$mes.="$message として $money Gを受け取りました<br />";
	}
	else {
		$money *= -1;
		$mes.="$message として $money Gを支払いました<br />";
	}
}
seek  $fh, 0, 0;
truncate $fh, 0;
close $fh;
}

です。

次に./lib/_data.cgiに・・

#=================================================
# クエスト依頼 ◎変更/追加可能。
#=================================================
@kues = (
#[0]No, [1]クエ名, [2]ターゲット, [3]目標数, [4]契約金, [5]報酬名, [6]難易度, [7],詳細 [8],報酬ナンバーメイン→サブ→レア→極レア
[0, 'なし', 'なし', 0, 'なし', 0, 0, 'なし',],

[1, 'スライム大量出現', 'スライム', 100, '1000', '薬草', '★', 'おいしく焼きたいので', 1, 1, 1, 1,],
);

こんな感じのを追加。

さらに、./lib/_battle.cgiの for my $name (@partys) {の中に・・

if ($ms{$y}{mons_hantei} eq $kues[$m{que_jyu}][2] && !$m{que_flg}) {
	$m{mokuhyou_mons}++;
	if ($m{mokuhyou_mons} >= $kues[$m{que_jyu}][3]) {
		$npc_com .= "$mは討伐クエストを達成しました!";
		$m{que_flg} = 1;
	}
}

を追加。

そしてlogファイルを作れば完成。

前開発していたパーティーで作ったスクリプトを引っ張ってきました。
お疲れ様でした。
最終更新:2013年02月09日 15:22