「battle.cgi」の編集履歴(バックアップ)一覧はこちら
「battle.cgi」(2010/09/27 (月) 20:16:47) の最新版変更点
追加された行は緑色になります。
削除された行は赤色になります。
<p># Sub Enemy List #<br />
sub enemy {<br />
&get_all_users;<br />
&form_table('up','100%',1);<br />
&reload;<br />
print qq|襲撃 |;<br />
&submit_button;<br />
print qq|</td></tr><tr><td align=left>\n|;<br />
foreach (@alllines) {<br />
($uid,$uname,$usex,$uarea,$uport,$utactics) =
(split(/<>/))[0,1,3,15,16,18];<br />
if ( ((($port != $uport) || !$port) && ($port || $uport ||
($area != $uarea))) || $id == $uid) { next }<br />
$checked = !$first ? ' checked' : '';<br />
$surrender = $utactics == 3 ? ' 白旗' : '';<br />
$first =1;<br />
$sex_img = $usex ? $wmn_img : $man_img;<br />
$on_click = qq|onClick="return
opWin('$listcgi?mode=uprofile&uid=$uid','win6')"|;<br />
print qq|<input type=radio name=uid value="$uid"$checked>\n|;<br />
print qq|<img src="$img/$sex_img"><a
href="$listcgi?mode=uprofile&uid=$uid" $on_click
target=_blank>$uname</a>$surrender<br>\n|;<br />
}<br />
if (!$sex_img) { print qq|ここには誰もいません| }<br />
print qq|<input type=hidden name=mode value="battle">\n|;<br />
&id_ps;<br />
&form_table('down');<br />
&b_lift;<br />
}<br /><font color="#339966">襲撃対象欄表示処理</font><br /><br />
# Sub Battle #<br />
sub battle {<br />
&get_me($F{'id'});<br />
if ($action ne $F{'reload'}) { &play; exit }<br />
if ($#ship_ind < 0 ) { &play("船がありません"); exit }<br />
if (!$F{'uid'}) { &play; exit }<br />
&get_u($F{'uid'});<br />
if ( ((($port != $uport) || !$port) && ($port || $uport || ($area
!= $uarea))) || $id == $uid) { &play; exit }<br />
&b_limit;<br />
$urecord .= "$nameに襲撃されました!<br>";<br />
if (($utactics >= 3) ||($#uship_ind < 0) || ($utactics == 2
&& rand(100) < &level($utexp*(1 + $ut_item*0.01)) ) ) {<br /><font color="#339966">対象の戦術が3以上(デフォルトでは降伏)か、船が無いか、対象の戦術が回避かつ、数式が真だった場合</font><br />
$piracy += 100;<br />
my $lost_money = int($umoney * 0.005);<br /><font color="#339966">海賊名声+100、奪取金額=対象の金額*0.005</font><br />
$money += $lost_money;<br />
$umoney -= $lost_money;<br />
$upiracy -= 200;<br />
$uadven -= 100;<br />
&add_record("$nameに襲撃され降伏し、$lost_money Gを献上しました",1);<br />
&set_me;<br />
&set_u;<br />
&msg("<font
color=\"#00AA00\">$unameは降伏しました<br>$lost_money
Gを献上してきました</font>");<br />
&play;<br />
exit<br />
}<br />
&ship_data;<br />
&uship_data;<br />
if ($tactics == 0) { $turn = @ship_ind < 3 ? @ship_ind : 3 }<br />
elsif ($tactics == 1) { $turn = @ship_ind < 2 ? @ship_ind : 2 }<br />
else { $turn = 1 }<br /><font color="#339966">戦術が0(デフォルト好戦)なら、数式が真なら現在船数、偽なら3を$turnに格納。</font><br />
my $aup_exist = &item_search($item_line,@atkup);<br />
if ($aup_exist != -1 && rand(100) < 1 && @ship_ind >
3) {<br />
$turn++;<br />
&msg("<font
color=\"#00AA00\">$atkup[$aup_exist]があやしく笑う!<br>攻撃回数+1!</font>");<br />
}<br /><font color="#339966">特定(ここではターン増加の)財宝を所持していれば$aup_existは0以上になる。</font><br /><font color="#339966">$aup_existが-1ではなく、かつランダム判定が真、かつ船の数が4以上ならば、$turnが1増加。</font><br />
$uturn = $tactics - $utactics > 0 ? 1 : 0; # 被襲撃側の方がより好戦である場合<br /><font color="#339966">自分の戦術-対象戦術が0より大きければ、1、小さければ0を$uturnに格納。</font><br />
my $van_exist = &item_search($uitem_line,@vanish);<br />
if ($utactics == 2 && $van_exist != -1 && rand(100) < 5)
{<br />
$turn = -1;<br />
$uturn = -1;<br />
&msg("<font
color=\"#00AA00\">$unameの$vanish[$van_exist]が激しく輝き、敵は消えました・・・</font>");<br />
$urecord .= "$vanish[$van_exist]の加護により回避しました!<br>";<br />
}<br />
$a_i_atk = $a_u_atk = 0;<br />
for (0 .. ($turn - 1)) {<br />
$i_atked = &s_sort;<br />
$u_atked = int(rand(@uship));<br /><font color="#339966">攻撃する船の選択</font><br />
if ($utactics) {<font color="#339966"><br />
好戦以外の場合</font><br />
my $uavoid = $utactics == 2 ? $ucmd / 3 : $ucmd / 5;<br /><font color="#339966">2(デフォ回避)なら指揮力/3、それ以外(デフォ適度)なら指揮力/5を$uavoidに格納。</font><br />
$uavoid = $uavoid * (($uship[$u_atked][3] + ($unav * 0.01))/
7);<br /><font color="#339966">$uavoid*((対象の攻撃船のノット数+(航海力*0.01)/7))を$uavoidに格納。</font><br />
if (rand(100) < $uavoid) {<br />
&msg("<font
color=\"#0000FF\">$unameの$uship[$u_atked][4]に攻撃失敗!</font>");<br />
next<br />
}<br />
}<br />
&b_p_d;<br /><font color="#339966">攻撃力の算出</font><br />
my $sh_exist = &item_search($uitem_line,@shield);<br />
if ($sh_exist != -1) {<br />
if (rand(100) < 10 - 2 * $sh_exist) {<br />
&msg("<font
color=\"#00AA00\">$unameの$shield[$sh_exist]が攻撃を吸収!攻撃力ダウン!</font>");<br />
$i_pow = int($i_pow * 0.9);<br />
$protect = $shield[$sh_exist];<br />
}<br />
}<br />
$a_i_atk += $i_pow;<br />
if ($i_pow - int($us_pow / 5) < 0) { $usailor -= 5 * $i_pow } #
水夫で耐えた場合(被)<br /><font color="#339966">攻撃力-対象の積載水夫/5が0より小さければ、対象水夫数-5*攻撃力。</font><br />
else {<br />
$usailor -= $us_pow;<br />
$usailor -= 1 if $usailor > 0;<br />
$i_pow -= int($us_pow / 5);<br />
if ($uship[$u_atked][2] - $i_pow > 0) {<br /><font color="#339966">対象HP-攻撃力が>0の場合</font><br />
$uship[$u_atked][2] -= $i_pow;<br />
&msg("<font
color=\"#0000FF\">$unameの$uship[$u_atked][4]を攻撃!$i_pow
ptのダメージを与えました!</font>")<br />
} else {<br />
if($#ship < 16 ) {<font color="#339966"><br />
船が16隻より下だった場合</font><br />
push(@ship, $uship[$u_atked]);<br />
&msg("<font
color=\"#0000FF\">$unameから$uship[$u_atked][4]を奪取!</font>");<br />
$get_s .= "$uship[$u_atked][4] "<br />
} else {<br />
&msg("<font
color=\"#0000FF\">$unameの$uship[$u_atked][4]を撃沈!</font>");<br />
$sink_s .= "$uship[$u_atked][4] "<br />
}<br />
&u_lost;<br />
if ($#uship < 0) { $a_u_atk = 0; last }<br />
}<br />
}<br />
my $ualv = &level($uaexp*(1 + $ut_item*0.01));<br />
if (rand(200) < $ualv) { $u_pow += $ualv }<br />
my $plv = &level($pexp*(1 + $t_item*0.01));<br />
if (rand(200) < $plv) { $u_pow = int($u_pow * 0.9);
&msg("<font color=\"#00AA00\">敵をひるませました!</font>") }<br />
$a_u_atk += $u_pow;<br />
if (&u_attack == -1) { $a_i_atk = 0; last }<br />
if ($utactics == 2) { last if rand(100) < $ucmd * 0.5 }<br />
}<br />
for (0 .. ($uturn -1)) {<br />
if ($#uship < 0 || $#ship < 0) { last; }<br />
last if $uturn == 0;<br />
$i_atked = int(rand(@ship));<br />
$u_atked = int(rand(@uship));<br />
&b_p_d;<br />
$a_u_atk += $u_pow;<br />
if (&u_attack == -1) { $a_i_atk = 0; last }<br />
}<br /><br />
if ($a_i_atk >= $a_u_atk && $a_i_atk != 0) {<br />
my $pup = 3000;<br />
$pup += int( ($upiracy - $piracy) * 0.5 ) if $upiracy > $piracy;<br />
$piracy += $pup; $pexp += $pup;<br />
my $aup = int( ($upiracy - $piracy) * 0.01 ) if $piracy <
$upiracy;<br />
$adven += $aup; $aexp += $aup;<br />
$upiracy -= 200;<br />
$utrade -= 200;<br />
&item_get;<br />
&msg("<font color=\"#0000FF\">戦闘に勝利しました!</font>");<br />
my $lost_money = int($umoney * rand($robmoney) * 0.01);<br />
if (int(rand(100)) > ($ucmd / 4) && $lost_money) {<br />
$get_money = $lost_money;<br />
$money += $lost_money;<br />
$umoney -= $lost_money;<br />
&msg("<font color=\"#0000FF\">$unameから$lost_money
Gを略奪しました!</font>")<br />
}<br />
} elsif ($a_i_atk != 0) {<br />
my $upup = 2000;<br />
$upup += int($piracy/10) if $piracy > $upiracy;<br />
$upiracy += $upup; $upexp += $upup;<br />
$piracy = int(0.9 * $piracy);<br />
$trade = int(0.9 * $trade);<br />
&msg("<font color=\"#FF0000\">返り討ちにされました</font>");<br />
$urecord .= "返り討ちにしました!<br>"<br />
}<br />
$urecord .= "$protectの加護を受けました<br>" if $protect;<br />
$get_s = 'なし' if !$get_s; $sink_s = 'なし' if !$sink_s; $get_money = '0' if
!$get_money; $rob_item = 'なし' if !$rob_item;<br />
$uget_s = 'なし' if !$uget_s; $usink_s = 'なし' if !$usink_s;<br />
if ($a_i_atk == 0 && $uturn <= 0) {<br />
&add_record("$unameを襲撃!襲撃失敗!");<br />
&add_record("$nameが急襲!回避成功!",1)<br />
} else {<br />
&add_record("$unameを襲撃!<br>獲得[奪取:$get_s、撃沈:$sink_s、資金:$get_money
G、財宝:$rob_item]<br>被害[奪取:$uget_s、撃沈:$usink_s]");<br />
&add_record("$nameが急襲!<br>被害[奪取:$get_s、撃沈:$sink_s、資金:$get_money
G、財宝:$rob_item]<br>獲得[奪取:$uget_s、撃沈:$usink_s]",1)<br />
}<br />
&into_ind; &into_uind;<br />
&set_me;<br />
&set_u;<br />
&play<br />
}<br /><br />
# Sub Battle Pre-disposal #<br />
sub b_p_d {<br />
$utotal = 0;<br />
for(0 .. $#uship){ $utotal += $uship[$_][1] }<br />
&fleet;<br />
$is_pow = $total ? int($sailor * $ship[$i_atked][1] / $total) : 0; #
積荷割合によって水夫配置<br />
$us_pow = $utotal ? int($usailor * $uship[$u_atked][1] / $utotal) : 0;<br />
$i_pow = int(rand(2 * $atk) + ($is_pow / 5)); # 戦闘力 = 船長戦闘力 + 水夫/5<br />
$u_pow = int(rand(2 * $uatk) + ($us_pow / 5))<br />
}<br /><br />
# Sub U Attack #<br />
sub u_attack {<br />
if ($u_pow - int($is_pow / 5) < 0) { $sailor -= 5 * $u_pow; return 1; }
# 水夫で耐えた場合(自)<br />
else {<br />
$sailor -= $is_pow;<br />
$sailor -= 1 if $sailor > 0;<br />
$u_pow -= int($is_pow / 5);<br />
if ($ship[$i_atked][2] - $u_pow > 0) {<br />
$ship[$i_atked][2] -= $u_pow;<br />
&msg("<font
color=\"#FF0000\">$ship[$i_atked][4]を攻撃されました!$u_pow
ptのダメージを受けました!</font>");<br />
return 1;<br />
} else {<br />
if($#uship < 16 ) {<br />
push(@uship , $ship[$i_atked]);<br />
&msg("<font
color=\"#FF0000\">$unameに$ship[$i_atked][4]を奪われました!</font>");<br />
$uget_s .= "$ship[$i_atked][4] ";<br />
&i_lost;<br />
return -1 if $#ship < 0;<br />
return 1;<br />
} else { &msg("<font
color=\"#FF0000\">$ship[$i_atked][4]を撃沈されました!</font>"); $usink_s .=
"$ship[$i_atked][4] " }<br />
&i_lost;<br />
return -1 if $#ship < 0;<br />
return 1;<br />
}<br />
}<br />
}<br /><br />
# Sub Ship Sort #<br />
sub s_sort {<br />
$most_ld = 0;<br />
for (0 .. $#ship) {<br />
if ($most_ld < $ship[$_][1]) {<br />
$most_ld = $ship[$_][1];<br />
$most_nb = $_;<br />
}<br />
}<br />
return $most_nb;<br />
}<font color="#339966"><br />
$most_ld<N番目の積載なら、$most_ldにN番目の積載を格納、$most_nbにN番を格納。以下最後の船まで繰り返し$most_nbの値を返す。</font><br /><br />
# Sub Get U Ship Data #<br />
sub uship_data {<br />
undef @uship;<br />
foreach (0 .. $#uship_ind) {<br />
@{$uship[$_]} = split(/,/,$uship_ind[$_])<br />
}<br />
}<br /><br />
# Sub Into I ind #<br />
sub into_ind {<br />
undef @ship_ind;<br />
return if @ship < 0;<br />
foreach (0 .. $#ship) {<br />
next if !$ship[$_][0];<br />
push(@ship_ind ,
"$ship[$_][0],$ship[$_][1],$ship[$_][2],$ship[$_][3],$ship[$_][4]")<br />
}<br />
}<br /><br />
# Sub Into U ind #<br />
sub into_uind {<br />
undef @uship_ind;<br />
return if $#uship < 0;<br />
foreach (0 .. $#uship) {<br />
next if !$uship[$_][0];<br />
push(@uship_ind ,
"$uship[$_][0],$uship[$_][1],$uship[$_][2],$uship[$_][3],$uship[$_][4]")<br />
}<br />
}<br /><br />
# Sub Battle Limit # $battle_line=id,time△id,time△time<br />
sub b_limit {<br />
my @battled = split(/△/,$battle_line);<br />
my $last_b = pop(@battled);<br />
if ($battle_line =~ /$F{'uid'},/ ) { &play("$unameは襲撃したばかりです"); exit
}<br />
my $now = time;<br />
if ( ($now - $last_b)/60 < $cont ) { &play("$cont分以内に続けて戦闘はできません");
exit }<br />
unshift(@battled , "$F{'uid'},$now");<br />
$battle_line = join('△' , @battled , $now);<br />
}<br /><br />
# Sub Battle Lift #<br />
sub b_lift {<br />
my @battled = split(/△/,$battle_line);<br />
my $last_b = pop(@battled);<br />
my $now = time;<br />
my @battled = grep { ($now - (split(/,/))[1])/(60*60*24) < $same }
@battled;<br />
$battle_line = join('△' , @battled , $last_b);<br />
}<br /><br />
# Sub I Lost #<br />
sub i_lost {<br />
&fleet;<br />
undef @my_load;<br />
$rate = $total ? 1 - ($ship[$i_atked][1] / $total) : 0;<br />
$food = int($food * $rate);<br />
my @my_lt = split(/△/,$load);<br />
foreach (0 .. $#my_lt) {<br />
($load_name,$load_quan) = split(/,/,$my_lt[$_]);<br />
$load_quan = int($load_quan * $rate);<br />
push(@my_load , "$load_name,$load_quan") if $load_quan != 0;<br />
}<br />
$load = join('△' , @my_load); <br />
splice(@ship , $i_atked ,1 )<br />
}<br /><br />
# Sub U Lost #<br />
sub u_lost {<br />
$utotal = 0;<br />
undef @u_load;<br />
for(0 .. $#uship){ $utotal += $uship[$_][1] }<br />
$urate = $utotal ? 1 - ($uship[$u_atked][1] / $utotal) : 0;<br />
$ufood = int($ufood * $urate);<br />
my @u_lt = split(/△/,$uload);<br />
foreach (0 .. $#u_lt) {<br />
($uload_name,$uload_quan) = split(/,/,$u_lt[$_]);<br />
$uload_quan = int($uload_quan * $urate);<br />
push(@u_load , "$uload_name,$uload_quan") if $uload_quan != 0;<br />
}<br />
$uload = join('△' , @u_load); <br />
splice(@uship , $u_atked ,1 )<br />
}<br /><br />
# Sub Item Search # 引数[0]=$item_line or $uitem_line, 引数[1]... = 対象アイテム<br />
sub item_search {<br />
foreach $j(1 .. $#_) {<br />
if (index($_[0],"$_[$j]") != -1) {<br />
return ($j - 1);<br />
}<br />
}<br />
return (-1);<br />
}<br /><br />
# Sub Item Get #<br />
sub item_get {<br />
return if !$uitem_line;<br />
return if int(rand(100)) < ($ucmd / 4);<br />
my $gd_exist = &item_search($uitem_line,@gard);<br />
if ($gd_exist != -1 && rand(100) > 5) {<br />
$urecord .= "$gard[$gd_exist]の加護により財宝は守られました<br>";<br />
return;<br />
}<br />
my @uitem_ind = split(/,/,$uitem_line);<br />
srand(time*time);<br />
my $rob = int(rand($#uitem_ind));<br />
my @item_check = split(/,/,$item_line);<br />
foreach (@item_check) { if ($_ eq $uitem_ind[$rob]) { $find = 1; last }
}<br />
return if $find;<br />
$item_line = join(',' , @item_check , $uitem_ind[$rob]);<br />
&msg("<font
color=\"#0000FF\">$uitem_ind[$rob]を奪いました!</font>");<br />
$rob_item = $uitem_ind[$rob];<br />
splice(@uitem_ind , $rob , 1);<br />
$uitem_line = join(',' , @uitem_ind)<br />
}<br /><br />
1;</p>
<p># Sub Enemy List #<br />
sub enemy {<br />
&get_all_users;<br />
&form_table('up','100%',1);<br />
&reload;<br />
print qq|襲撃 |;<br />
&submit_button;<br />
print qq|</td></tr><tr><td align=left>\n|;<br />
foreach (@alllines) {<br />
($uid,$uname,$usex,$uarea,$uport,$utactics) =
(split(/<>/))[0,1,3,15,16,18];<br />
if ( ((($port != $uport) || !$port) && ($port || $uport ||
($area != $uarea))) || $id == $uid) { next }<br />
$checked = !$first ? ' checked' : '';<br />
$surrender = $utactics == 3 ? ' 白旗' : '';<br />
$first =1;<br />
$sex_img = $usex ? $wmn_img : $man_img;<br />
$on_click = qq|onClick="return
opWin('$listcgi?mode=uprofile&uid=$uid','win6')"|;<br />
print qq|<input type=radio name=uid value="$uid"$checked>\n|;<br />
print qq|<img src="$img/$sex_img"><a
href="$listcgi?mode=uprofile&uid=$uid" $on_click
target=_blank>$uname</a>$surrender<br>\n|;<br />
}<br />
if (!$sex_img) { print qq|ここには誰もいません| }<br />
print qq|<input type=hidden name=mode value="battle">\n|;<br />
&id_ps;<br />
&form_table('down');<br />
&b_lift;<br />
}<br /><font color="#339966">襲撃対象欄表示処理</font><br /><br />
# Sub Battle #<br />
sub battle {<br />
&get_me($F{'id'});<br />
if ($action ne $F{'reload'}) { &play; exit }<br />
if ($#ship_ind < 0 ) { &play("船がありません"); exit }<br />
if (!$F{'uid'}) { &play; exit }<br />
&get_u($F{'uid'});<br />
if ( ((($port != $uport) || !$port) && ($port || $uport || ($area
!= $uarea))) || $id == $uid) { &play; exit }<br />
&b_limit;<br />
$urecord .= "$nameに襲撃されました!<br>";<br />
if (($utactics >= 3) ||($#uship_ind < 0) || ($utactics == 2
&& rand(100) < &level($utexp*(1 + $ut_item*0.01)) ) ) {<br /><font color="#339966">対象の戦術が3以上(デフォルトでは降伏)か、船が無いか、対象の戦術が回避かつ、数式が真だった場合</font><br />
$piracy += 100;<br />
my $lost_money = int($umoney * 0.005);<br /><font color="#339966">海賊名声+100、奪取金額=対象の金額*0.005</font><br />
$money += $lost_money;<br />
$umoney -= $lost_money;<br />
$upiracy -= 200;<br />
$uadven -= 100;<br />
&add_record("$nameに襲撃され降伏し、$lost_money Gを献上しました",1);<br />
&set_me;<br />
&set_u;<br />
&msg("<font
color=\"#00AA00\">$unameは降伏しました<br>$lost_money
Gを献上してきました</font>");<br />
&play;<br />
exit<br />
}<br />
&ship_data;<br />
&uship_data;<br />
if ($tactics == 0) { $turn = @ship_ind < 3 ? @ship_ind : 3 }<br />
elsif ($tactics == 1) { $turn = @ship_ind < 2 ? @ship_ind : 2 }<br />
else { $turn = 1 }<br /><font color="#339966">戦術が0(デフォルト好戦)なら、数式が真なら現在船数、偽なら3を$turnに格納。</font><br />
my $aup_exist = &item_search($item_line,@atkup);<br />
if ($aup_exist != -1 && rand(100) < 1 && @ship_ind >
3) {<br />
$turn++;<br />
&msg("<font
color=\"#00AA00\">$atkup[$aup_exist]があやしく笑う!<br>攻撃回数+1!</font>");<br />
}<br /><font color="#339966">特定(ここではターン増加の)財宝を所持していれば$aup_existは0以上になる。</font><br /><font color="#339966">$aup_existが-1ではなく、かつランダム判定が真、かつ船の数が4以上ならば、$turnが1増加。</font><br />
$uturn = $tactics - $utactics > 0 ? 1 : 0; # 被襲撃側の方がより好戦である場合<br /><font color="#339966">自分の戦術-対象戦術が0より大きければ、1、小さければ0を$uturnに格納。</font><br />
my $van_exist = &item_search($uitem_line,@vanish);<br />
if ($utactics == 2 && $van_exist != -1 && rand(100) < 5)
{<br />
$turn = -1;<br />
$uturn = -1;<br />
&msg("<font
color=\"#00AA00\">$unameの$vanish[$van_exist]が激しく輝き、敵は消えました・・・</font>");<br />
$urecord .= "$vanish[$van_exist]の加護により回避しました!<br>";<br />
}<br />
$a_i_atk = $a_u_atk = 0;<br />
for (0 .. ($turn - 1)) {<br />
$i_atked = &s_sort;<br />
$u_atked = int(rand(@uship));<br /><font color="#339966">攻撃する船の選択</font><br />
if ($utactics) {<font color="#339966"><br />
好戦以外の場合</font><br />
my $uavoid = $utactics == 2 ? $ucmd / 3 : $ucmd / 5;<br /><font color="#339966">2(デフォ回避)なら指揮力/3、それ以外(デフォ適度)なら指揮力/5を$uavoidに格納。</font><br />
$uavoid = $uavoid * (($uship[$u_atked][3] + ($unav * 0.01))/
7);<br /><font color="#339966">$uavoid*((対象の攻撃船のノット数+(航海力*0.01)/7))を$uavoidに格納。</font><br />
if (rand(100) < $uavoid) {<br />
&msg("<font
color=\"#0000FF\">$unameの$uship[$u_atked][4]に攻撃失敗!</font>");<br />
next<br />
}<br />
}<br />
&b_p_d;<br /><font color="#339966">攻撃力の算出</font><br />
my $sh_exist = &item_search($uitem_line,@shield);<br />
if ($sh_exist != -1) {<br />
if (rand(100) < 10 - 2 * $sh_exist) {<br />
&msg("<font
color=\"#00AA00\">$unameの$shield[$sh_exist]が攻撃を吸収!攻撃力ダウン!</font>");<br />
$i_pow = int($i_pow * 0.9);<br />
$protect = $shield[$sh_exist];<br />
}<br />
}<br />
$a_i_atk += $i_pow;<br />
if ($i_pow - int($us_pow / 5) < 0) { $usailor -= 5 * $i_pow } #
水夫で耐えた場合(被)<br /><font color="#339966">攻撃力-対象の積載水夫/5が0より小さければ、対象水夫数-5*攻撃力。</font><br />
else {<br />
$usailor -= $us_pow;<br />
$usailor -= 1 if $usailor > 0;<br />
$i_pow -= int($us_pow / 5);<br />
if ($uship[$u_atked][2] - $i_pow > 0) {<br /><font color="#339966">対象HP-攻撃力が>0の場合</font><br />
$uship[$u_atked][2] -= $i_pow;<br />
&msg("<font
color=\"#0000FF\">$unameの$uship[$u_atked][4]を攻撃!$i_pow
ptのダメージを与えました!</font>")<br />
} else {<br />
if($#ship < 16 ) {<font color="#339966"><br />
船が16隻より下だった場合</font><br />
push(@ship, $uship[$u_atked]);<br />
&msg("<font
color=\"#0000FF\">$unameから$uship[$u_atked][4]を奪取!</font>");<br />
$get_s .= "$uship[$u_atked][4] "<br />
} else {<br />
&msg("<font
color=\"#0000FF\">$unameの$uship[$u_atked][4]を撃沈!</font>");<br />
$sink_s .= "$uship[$u_atked][4] "<br />
}<br />
&u_lost;<br />
if ($#uship < 0) { $a_u_atk = 0; last }<br />
}<br />
}<br />
my $ualv = &level($uaexp*(1 + $ut_item*0.01));<br />
if (rand(200) < $ualv) { $u_pow += $ualv }<br />
my $plv = &level($pexp*(1 + $t_item*0.01));<br />
if (rand(200) < $plv) { $u_pow = int($u_pow * 0.9);
&msg("<font color=\"#00AA00\">敵をひるませました!</font>") }<br />
$a_u_atk += $u_pow;<br />
if (&u_attack == -1) { $a_i_atk = 0; last }<br />
if ($utactics == 2) { last if rand(100) < $ucmd * 0.5 }<br />
}<br />
for (0 .. ($uturn -1)) {<br />
if ($#uship < 0 || $#ship < 0) { last; }<br />
last if $uturn == 0;<br />
$i_atked = int(rand(@ship));<br />
$u_atked = int(rand(@uship));<br />
&b_p_d;<br />
$a_u_atk += $u_pow;<br />
if (&u_attack == -1) { $a_i_atk = 0; last }<br />
}<br /><br />
if ($a_i_atk >= $a_u_atk && $a_i_atk != 0) {<br />
my $pup = 3000;<br />
$pup += int( ($upiracy - $piracy) * 0.5 ) if $upiracy > $piracy;<br />
$piracy += $pup; $pexp += $pup;<br />
my $aup = int( ($upiracy - $piracy) * 0.01 ) if $piracy <
$upiracy;<br />
$adven += $aup; $aexp += $aup;<br />
$upiracy -= 200;<br />
$utrade -= 200;<br />
&item_get;<br />
&msg("<font color=\"#0000FF\">戦闘に勝利しました!</font>");<br />
my $lost_money = int($umoney * rand($robmoney) * 0.01);<br />
if (int(rand(100)) > ($ucmd / 4) && $lost_money) {<br />
$get_money = $lost_money;<br />
$money += $lost_money;<br />
$umoney -= $lost_money;<br />
&msg("<font color=\"#0000FF\">$unameから$lost_money
Gを略奪しました!</font>")<br />
}<br />
} elsif ($a_i_atk != 0) {<br />
my $upup = 2000;<br />
$upup += int($piracy/10) if $piracy > $upiracy;<br />
$upiracy += $upup; $upexp += $upup;<br />
$piracy = int(0.9 * $piracy);<br />
$trade = int(0.9 * $trade);<br />
&msg("<font color=\"#FF0000\">返り討ちにされました</font>");<br />
$urecord .= "返り討ちにしました!<br>"<br />
}<br />
$urecord .= "$protectの加護を受けました<br>" if $protect;<br />
$get_s = 'なし' if !$get_s; $sink_s = 'なし' if !$sink_s; $get_money = '0' if
!$get_money; $rob_item = 'なし' if !$rob_item;<br />
$uget_s = 'なし' if !$uget_s; $usink_s = 'なし' if !$usink_s;<br />
if ($a_i_atk == 0 && $uturn <= 0) {<br />
&add_record("$unameを襲撃!襲撃失敗!");<br />
&add_record("$nameが急襲!回避成功!",1)<br />
} else {<br />
&add_record("$unameを襲撃!<br>獲得[奪取:$get_s、撃沈:$sink_s、資金:$get_money
G、財宝:$rob_item]<br>被害[奪取:$uget_s、撃沈:$usink_s]");<br />
&add_record("$nameが急襲!<br>被害[奪取:$get_s、撃沈:$sink_s、資金:$get_money
G、財宝:$rob_item]<br>獲得[奪取:$uget_s、撃沈:$usink_s]",1)<br />
}<br />
&into_ind; &into_uind;<br />
&set_me;<br />
&set_u;<br />
&play<br />
}<br /><br />
# Sub Battle Pre-disposal #<br />
sub b_p_d {<br />
$utotal = 0;<br />
for(0 .. $#uship){ $utotal += $uship[$_][1] }<br />
&fleet;<br />
$is_pow = $total ? int($sailor * $ship[$i_atked][1] / $total) : 0; #
積荷割合によって水夫配置<br />
$us_pow = $utotal ? int($usailor * $uship[$u_atked][1] / $utotal) : 0;<br />
$i_pow = int(rand(2 * $atk) + ($is_pow / 5)); # 戦闘力 = 船長戦闘力 + 水夫/5<br />
$u_pow = int(rand(2 * $uatk) + ($us_pow / 5))<br />
}<br /><br />
# Sub U Attack #<br />
sub u_attack {<br />
if ($u_pow - int($is_pow / 5) < 0) { $sailor -= 5 * $u_pow; return 1; }
# 水夫で耐えた場合(自)<br />
else {<br />
$sailor -= $is_pow;<br />
$sailor -= 1 if $sailor > 0;<br />
$u_pow -= int($is_pow / 5);<br />
if ($ship[$i_atked][2] - $u_pow > 0) {<br />
$ship[$i_atked][2] -= $u_pow;<br />
&msg("<font
color=\"#FF0000\">$ship[$i_atked][4]を攻撃されました!$u_pow
ptのダメージを受けました!</font>");<br />
return 1;<br />
} else {<br />
if($#uship < 16 ) {<br />
push(@uship , $ship[$i_atked]);<br />
&msg("<font
color=\"#FF0000\">$unameに$ship[$i_atked][4]を奪われました!</font>");<br />
$uget_s .= "$ship[$i_atked][4] ";<br />
&i_lost;<br />
return -1 if $#ship < 0;<br />
return 1;<br />
} else { &msg("<font
color=\"#FF0000\">$ship[$i_atked][4]を撃沈されました!</font>"); $usink_s .=
"$ship[$i_atked][4] " }<br />
&i_lost;<br />
return -1 if $#ship < 0;<br />
return 1;<br />
}<br />
}<br />
}<br /><br />
# Sub Ship Sort #<br />
sub s_sort {<br />
$most_ld = 0;<br />
for (0 .. $#ship) {<br />
if ($most_ld < $ship[$_][1]) {<br />
$most_ld = $ship[$_][1];<br />
$most_nb = $_;<br />
}<br />
}<br />
return $most_nb;<br />
}<font color="#339966"><br />
$most_ld<N番目の積載なら、$most_ldにN番目の積載を格納、$most_nbにN番を格納。以下最後の船まで繰り返し$most_nbの値を返す。</font><br /><br />
# Sub Get U Ship Data #<br />
sub uship_data {<br />
undef @uship;<br />
foreach (0 .. $#uship_ind) {<br />
@{$uship[$_]} = split(/,/,$uship_ind[$_])<br />
}<br />
}<br /><br />
# Sub Into I ind #<br />
sub into_ind {<br />
undef @ship_ind;<br />
return if @ship < 0;<br />
foreach (0 .. $#ship) {<br />
next if !$ship[$_][0];<br />
push(@ship_ind ,
"$ship[$_][0],$ship[$_][1],$ship[$_][2],$ship[$_][3],$ship[$_][4]")<br />
}<br />
}<br /><br />
# Sub Into U ind #<br />
sub into_uind {<br />
undef @uship_ind;<br />
return if $#uship < 0;<br />
foreach (0 .. $#uship) {<br />
next if !$uship[$_][0];<br />
push(@uship_ind ,
"$uship[$_][0],$uship[$_][1],$uship[$_][2],$uship[$_][3],$uship[$_][4]")<br />
}<br />
}<br /><br />
# Sub Battle Limit # $battle_line=id,time△id,time△time<br />
sub b_limit {<br />
my @battled = split(/△/,$battle_line);<br />
my $last_b = pop(@battled);<br />
if ($battle_line =~ /$F{'uid'},/ ) { &play("$unameは襲撃したばかりです"); exit
}<br />
my $now = time;<br />
if ( ($now - $last_b)/60 < $cont ) { &play("$cont分以内に続けて戦闘はできません");
exit }<br />
unshift(@battled , "$F{'uid'},$now");<br />
$battle_line = join('△' , @battled , $now);<br />
}<br /><br />
# Sub Battle Lift #<br />
sub b_lift {<br />
my @battled = split(/△/,$battle_line);<br />
my $last_b = pop(@battled);<br />
my $now = time;<br />
my @battled = grep { ($now - (split(/,/))[1])/(60*60*24) < $same }
@battled;<br />
$battle_line = join('△' , @battled , $last_b);<br />
}<br /><br />
# Sub I Lost #<br />
sub i_lost {<br />
&fleet;<br />
undef @my_load;<br />
$rate = $total ? 1 - ($ship[$i_atked][1] / $total) : 0;<br />
$food = int($food * $rate);<br />
my @my_lt = split(/△/,$load);<br />
foreach (0 .. $#my_lt) {<br />
($load_name,$load_quan) = split(/,/,$my_lt[$_]);<br />
$load_quan = int($load_quan * $rate);<br />
push(@my_load , "$load_name,$load_quan") if $load_quan != 0;<br />
}<br />
$load = join('△' , @my_load); <br />
splice(@ship , $i_atked ,1 )<br />
}<br /><br />
# Sub U Lost #<br />
sub u_lost {<br />
$utotal = 0;<br />
undef @u_load;<br />
for(0 .. $#uship){ $utotal += $uship[$_][1] }<br />
$urate = $utotal ? 1 - ($uship[$u_atked][1] / $utotal) : 0;<br />
$ufood = int($ufood * $urate);<br />
my @u_lt = split(/△/,$uload);<br />
foreach (0 .. $#u_lt) {<br />
($uload_name,$uload_quan) = split(/,/,$u_lt[$_]);<br />
$uload_quan = int($uload_quan * $urate);<br />
push(@u_load , "$uload_name,$uload_quan") if $uload_quan != 0;<br />
}<br />
$uload = join('△' , @u_load); <br />
splice(@uship , $u_atked ,1 )<br />
}<br /><br />
# Sub Item Search # 引数[0]=$item_line or $uitem_line, 引数[1]... = 対象アイテム<br />
sub item_search {<br />
foreach $j(1 .. $#_) {<br />
if (index($_[0],"$_[$j]") != -1) {<br />
return ($j - 1);<br />
}<br />
}<br />
return (-1);<br />
}<br /><br />
# Sub Item Get #<br />
sub item_get {<br />
return if !$uitem_line;<br />
return if int(rand(100)) < ($ucmd / 4);<br />
my $gd_exist = &item_search($uitem_line,@gard);<br />
if ($gd_exist != -1 && rand(100) > 5) {<br />
$urecord .= "$gard[$gd_exist]の加護により財宝は守られました<br>";<br />
return;<br />
}<br />
my @uitem_ind = split(/,/,$uitem_line);<br />
srand(time*time);<br />
my $rob = int(rand($#uitem_ind));<br />
my @item_check = split(/,/,$item_line);<br />
foreach (@item_check) { if ($_ eq $uitem_ind[$rob]) { $find = 1; last }
}<br />
return if $find;<br />
$item_line = join(',' , @item_check , $uitem_ind[$rob]);<br />
&msg("<font
color=\"#0000FF\">$uitem_ind[$rob]を奪いました!</font>");<br />
$rob_item = $uitem_ind[$rob];<br />
splice(@uitem_ind , $rob , 1);<br />
$uitem_line = join(',' , @uitem_ind)<br />
}<br /><br />
1;</p>