battle.cgi

# 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;

最終更新:2010年09月27日 20:16
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。