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