No.1836 Re:NPCに特定のアイテムを送り、ランダムでアイテムを入手 |
> あけましておめでとうございます。
> 昨年度は大変お世話になりました。
> 今年も宜しくお願いします。
こちらこそよろしくお願いいたします。
> 題名通りなのですが、
> NPCに特定のアイテムを送ったら、
> ランダムでアイテムを入手させたいと考えています。
>
> 具体的なイメージとしては、
> NPC鬼(ID指定)に、豆を投げつけて、
> 成功したら、いくつかの限定アイテムの中からアイテムをランダムで入手させ、失敗したら体力にダメージを受ける…
>
> 豆まきをイメージした遊びを考えています。
>
> できるだけ簡単に導入できないかなと考えているのですが、
> 難しいでしょうか…
>
> ただ思いついただけで、節分も迫っている時期に申し訳ないです…。
以下の条件で試しに作成してみました。
・ベースはFinalβ(2002.08.11)。
・相手の判定はIDではなくスキル「-BEAN-」
・投げつけることができるアイテム属性「-BEAN-」
・自分が死亡状態か体力が5以下の時は投げつけられない。
・失敗時のダメージは1〜5でランダム。
なお、以下のソースではタブ文字を全角空白2つで表現しています。
あと、sub sell_beforeおよびsub sell_afterをベースに必要最小限の変更で作成したので書き方に統一感がないですし、おおまかにしか動作を確認していないのでバグがあるかもしれません。
ですので、内容を理解した上で適宜変更してください。
#### contact_action.plに追加 ####
print qq|<FONT onMouseOver="Msg('アイテムを投げつけます。');return true" onMouseOut="Msg('$def_fid');return true">|;
&input('radio','mode','throw_before','',"投げつける<br>\n") if(index($psp, '-BEAN-') != -1 && $av ne 'dead' && $hp > 5);
print qq|</FONT>|;
#### sos2.cgiの「if ($Fm{'mode'} eq 'sell_after') { &contact_form }」の下に追加 ####
if ($Fm{'mode'} eq 'throw_before') { &action_form }
if ($Fm{'mode'} eq 'throw_after') { &contact_form }
#### sos2.cgiのsub contact_form内の「&sell_after if $Fm{'mode'} eq 'sell_after';」の下に追加 ####
&throw_after if $Fm{'mode'} eq 'throw_after';
#### sos2.cgiのsub action_form内の「&sell_before if $Fm{'mode'} eq 'sell_before';」の下に追加 ####
&throw_before if $Fm{'mode'} eq 'throw_before';
#### sos2.cgiのsub sell_afterの次くらいに追加 ####
sub throw_before {
@rcdlines = &get_user("$Fm{'id'}");
if ($av eq 'dead' || $hp <= 5) { push (@msg,'投げつけるだけの体力がありません'); return }
@prclines = &get_partner("$Fm{'pd'}");
if (index($psp, '-BEAN-') == -1) { push (@msg,'投げつけられる相手ではありません'); return }
if (!$bg) { push (@msg,'何ももっていません'); return }
$fg='THB'; &userout;
push (@msg,"$pnmに投げつけるアイテムにチェックを入れ$def_okボタンを押してください");
&splititem('i');
&form('start'); print qq|<tr><td colspan=2>|;
print qq|<FONT onMouseOver="Msg('投げつけるアイテムにチェックをいれて決定ボタンを押してください。');return true" onMouseOut="Msg('$def_fid');return true">|;
foreach (0 .. $#items) {
($item,$sts,$price,$imaxs,$iimg) = split(/△/,$items[$_]);
&input('radio','throw',"$_",'',"$item<BR>") if(index($sts, '-BEAN-') != -1);
}
print qq|</FONT>|;
&OKbuttoninform('on','throw_after');
print qq|</td></tr>|; &form('end');
}
sub throw_after {
@rcdlines = &get_user("$Fm{'id'}");
return if $fg ne 'THB';
if ($av eq 'dead' || $hp <= 5) { push (@msg,'投げつけるだけの体力がありません'); return }
@prclines = &get_partner("$Fm{'pd'}");
if (index($psp, '-BEAN-') == -1) { push (@msg,'投げつけられる相手ではありません'); return }
&splititem('i');
my $index = int($Fm{'throw'});
if ($Fm{'throw'} eq '' || $index < 0 || $index > $#items) { push (@msg,'投げつけるアイテムが選択されていません'); return }
my ($item,$sts,$price,$imaxs,$iimg) = split(/△/,$items[$index]);
if (index($sts, '-BEAN-') == -1) { push (@msg,"${item}は投げつけられません"); return }
splice(@items, $index, 1); # 投げつけたアイテムを削除
my $rnd = int(rand(100));
if($rnd < 50){
# 失敗の場合
my $dmg = int(rand(5)) + 1;
$hp -= $dmg;
push(@msg, "${item}を投げつけるのに失敗して${dmg}ダメージを受けました。");
$words = "[$id] $nmから$itemを投げつけられました。(失敗:${dmg})";
}
else{
# 成功の場合
my @list = (
'アイテムA△…', # 省略:実際はアイテムデータを書く
'アイテムB△…', # 省略:実際はアイテムデータを書く
'アイテムC△…', # 省略:実際はアイテムデータを書く
);
push(@items, $list[int(rand(@list))]);
my $prize_name = (split(/△/,$items[-1]))[0];
push(@msg, "${item}を投げつけて${prize_name}を手に入れました。");
$words = "[$id] $nmから$itemを投げつけられました。(成功:${prize_name})";
}
&joinitem('i');
$fg = ''; &userout; &add_record($words);
}
▼関連発言
│
└◆1835:NPCに特定のアイテムを送り、ランダムでアイテムを入... [YOUME] 01/29 09:49
└◆1836:Re:NPCに特定のアイテムを送り、ランダムでアイテム.. [moon] 01/29 21:51
└◆1837:Re[2]:NPCに特定のアイテムを送り、ランダムでア... [YOUME] 01/30 12:00<-last
◇題名は、短くわかりやすく書いてください。 ◇過去に同じ内容が投稿されていないか検索してから書き込んで下さい。 ◇管理人の判断により相応しくない投稿は削除します。 |