www.pudn.com > sangoku_26_zh_tw.rar > check_com.cgi
# _/_/_/_/_/_/_/_ #
# 更新處理 #
# _/_/_/_/_/_/_/_ #
sub CHECK_COM{
# Command list
require './ini_file/com_list.ini';
&D_F_LOCK;
if (!-e $lockfile2) {&ERR2("做文件沒被鎖。");}
open(IN,"$TOWN_LIST");
@TOWN_DATA = ;
close(IN);
open(IN,"$UNIT_LIST") or &ERR("被指定了的文件不開啟。");
@UNI_DATA = ;
close(IN);
# 都市數據排列收藏
$zc=0;
foreach(@TOWN_DATA){
($z2name,$z2con,$z2num,$z2nou,$z2syo,$z2shiro)=split(/<>/);
$town_name[$zc] = "$z2name";
$town_cou[$zc] = "$z2con";
$town_get[$z2con] += 1;
$town_num[$z2con] += $z2num;
$town_nou[$z2con] += $z2nou;
$town_syo[$z2con] += $z2syo;
$zc++;
}
# PLAYER DATA排列收藏
$dir="./charalog/main";
if($mmonth eq "1" || $mmonth eq "7"){
opendir(dirlist,"$dir");
while($file = readdir(dirlist)){
if($file =~ /\.cgi/i){
if(!open(page,"$dir/$file")){
&ERR2("文件開啟錯誤!");
}
@page = ;
close(page);
($kid,$kpass,$kname,$kchara,$kstr,$kint,$klea,$kcha,$ksol,$kgat,$kcon,$kgold,$krice,$kcex) = split(/<>/,$page[0]);
$cou_num[$kcon]++;
$cex_total[$kcon]+=$kcex;
push(@CL_DATA,"@page
");
}
}
closedir(dirlist);
}
opendir(dirlist,"$dir");
$kup_date=0;
$thit=0;
while($file = readdir(dirlist)){
if($file =~ /\.cgi/i){
if(!open(page,"$dir/$file")){
&ERR2("文件開啟錯誤!");
}
@page = ;
close(page);
($kid,$kpass,$kname,$kchara,$kstr,$kint,$klea,$kcha,$ksol,$kgat,$kcon,$kgold,$krice,$kcex,$kclass,$karm,$kbook,$kbank,$ksub1,$ksub2,$kpos,$kmes,$khost,$kdate,$kmail,$kos) = split(/<>/,$page[0]);
if($kdate + $TIME_REMAKE < $date && $mtime > $kdate){
$thit=1;
($kstr_ex,$kint_ex,$klea_ex,$kcha_ex,$ksub1_ex,$ksub2_ex) = split(/,/,$ksub1);
if($mmonth eq "1"){
&SALARY;
if($cou_num[$kcon] eq "0" || $cou_num[$kcon] eq ""){
$cou_num[$kcon] = 1;
}
$kadd = 0;
if($cex_total[$kcon] ne 0){
$kadd = int(($ksal * $kcex / $cex_total[$kcon]) + $kcex * 1.3);
}
$s_num = int($kclass / $LANK);
if($s_num > 20){$s_num = 20;}
if($kadd > 1000 + $s_num * 150){$kadd=1000 + $s_num * 150;}
$kgold += $kadd;
$k_ex_fol= ($kclass % $LANK)+$kcex;
$kclass += $kcex;
if($k_ex_fol > $LANK){
$s_num = int($kclass / $LANK);
if($s_num > 20){$s_num = 20;}
$nadd = int(rand(3));
if($nadd eq "1"){
$kstr++;
$add_m = "武力";
}elsif($nadd eq "2"){
$kint++;
$add_m = "智力";
}else{
$klea++;
$add_m = "統率力";
}
$max_sal = 1000 + $s_num * 150;
&K_LOG("$mmonth月:【升級】$add_m提升1點!");
&K_LOG("$mmonth月:【升級】恭喜升到$LANK[$s_num]官階~發放俸祿的提升到 $max_sal !");
}
$kcex = 0;
&K_LOG("$mmonth月:向全國徵收稅金$kadd金。");
}elsif($mmonth eq "7"){
&SALARY;
if($cou_num[$kcon] eq "0" || $cou_num[$kcon] eq ""){
$cou_num[$kcon] = 1;
}
$kadd = 0;
if($cex_total[$kcon] ne 0){
$kadd = int(($ksal * $kcex / $cex_total[$kcon]) + $kcex * 1.3);
}
$s_num = int($kclass / $LANK);
if($s_num > 20){$s_num = 20;}
if($kadd > 1000 + $s_num * 150){$kadd=1000 + $s_num * 150;}
$krice += $kadd;
$k_ex_fol= ($kclass % $LANK)+$kcex;
$kclass += $kcex;
if($k_ex_fol > $LANK){
$s_num = int($kclass / $LANK);
if($s_num > 20){$s_num = 20;}
$nadd = int(rand(3));
if($nadd eq "1"){
$kstr++;
$add_m = "武力";
}elsif($nadd eq "2"){
$kint++;
$add_m = "智力";
}else{
$klea++;
$add_m = "統率力";
}
$max_sal = 1000 + $s_num * 150;
&K_LOG("$mmonth月:【升級】$add_m 經驗值上升!");
&K_LOG("$mmonth月:【升級】恭喜升到$LAMK[$s_num]官階~發放俸祿的提升到 $max_sal !");
}
$kcex = 0;
&K_LOG("$mmonth月:收穫季節向全國徵收米糧$kadd。");
}
open(IN,"./charalog/command/$kid\.cgi");
@COM_DATA = ;
close(IN);
($cid,$cno,$cname,$ctime,$csub,$cnum,$cend) = split(/<>/,$COM_DATA[0]);
$kdate += $TIME_REMAKE;
&CHARA_MAIN_INPUT;
splice(@COM_DATA,0,1);
push(@COM_DATA,"<><><><><><><>\n");
open(OUT,">./charalog/command/$kid\.cgi");
print OUT @COM_DATA;
close(OUT);
($zname,$zcon,$znum,$znou,$zsyo,$zshiro,$znou_max,$zsyo_max,$zshiro_max,$zpri,$zx,$zy,$zsouba,$zdef_att,$zsub1,$zsub2,$z[0],$z[1],$z[2],$z[3],$z[4],$z[5],$z[6],$z[7])=split(/<>/,$TOWN_DATA[$kpos]);
if($zcon eq "$kcon" || $cid eq "20" || $cid eq "21" || $cid eq "27" || $cid eq "0" || $cid eq ""){
$kprodmg = 0;
if($kbook ne "" && $kbook ne 0){
open(IN,"$PRO_LIST");
@PRO_DATA = ;
close(IN);
($kproname,$kproval,$kprodmg) = split(/<>/,$PRO_DATA[$kbook]);
}
if($cid eq $NOUGYOU){
if(!$nougyou){
require "$EXE/nougyou.pl";
$nougyou = TRUE;
}
&NOUGYOU;
}elsif($cid eq $SYOUGYOU){
if(!$syougyou){
require "$EXE/syougyou.pl";
$syougyou = TRUE;
}
&SYOUGYOU;
}elsif($cid eq $SHIRO){
if(!$shiro){
require "$EXE/shiro.pl";
$shiro = TRUE;
}
&SHIRO;
}elsif($cid eq $RICE_GIVE){
if(!$rice_give){
require "$EXE/rice_give.pl";
$rice_give = TRUE;
}
&RICE_GIVE;
}elsif($cid eq $GET_SOL2){
if(!$get_sol){
require "$EXE/get_sol.pl";
$get_sol = TRUE;
}
&GET_SOL;
}elsif($cid eq $KUNREN){
$ksub2=0;
$kgat += int($klea/6 + rand($klea/6));
if($kgat > 100){
$kgat = 100;
}
$kcex += 15;
&K_LOG("$mmonth月:士兵的訓練度提升到$kgat點。");
$klea_ex++;
$ksub1 = "$kstr_ex,$kint_ex,$klea_ex,$kcha_ex,$ksub1_ex,$ksub2_ex,";
}elsif($cid eq $TOWN_DEF){
if(!$town_def){
require "$EXE/town_def.pl";
$town_def = TRUE;
}
&TOWN_DEF;
}elsif($cid eq "18"){
$ksub2=0;
($zname,$zcon,$znum,$znou,$zsyo,$zshiro,$znou_max,$zsyo_max,$zshiro_max,$zpri,$zx,$zy,$zsouba,$zdef_att,$zsub1,$zsub2,$z[0],$z[1],$z[2],$z[3],$z[4],$z[5],$z[6],$z[7])=split(/<>/,$TOWN_DATA[$cnum]);
if($zcon eq $kcon){
&K_LOG("$mmonth月:不能攻擊自己所在的國家。");
}elsif($z[0] ne $kpos && $z[1] ne $kpos && $z[2] ne $kpos && $z[3] ne $kpos && $z[4] ne $kpos && $z[5] ne $kpos && $z[6] ne $kpos && $z[7] ne $kpos ){
&K_LOG("$mmonth月:$zname 領土沒有連接。");
}else{
if(!$battle_check){
require 'battle.cgi';
$battle_check = 1;
}
&BATTLE;
}
}elsif($cid eq $BUY2){
if(!$buy){
require "$EXE/buy.pl";
$buy = TRUE;
}
&BUY;
}elsif($cid eq "20"){
$ksub2=0;
$zhit=0;
foreach(@z){
if($_ eq $cnum){$zhit=1;}
}
if($zhit){
$kpos = $cnum;
$klea_ex++;
if($xcid ne "0"){$kcex += 20;}
$ksub1 = "$kstr_ex,$kint_ex,$klea_ex,$kcha_ex,$ksub1_ex,$ksub2_ex,";
&K_LOG("$mmonth月:已經往前 $town_name[$cnum] 移動。");
}else{
&K_LOG("$mmonth月:你目前位置在:$zname,而你所選擇移動城市是 $town_name[$cnum],所以不能前往移動。");
}
}elsif($cid eq $SHIKAN){
if(!$shikan){
require "$EXE/shikan.pl";
$shikan = TRUE;
}
&SHIKAN;
}elsif($cid eq "22"){
$ksub2=0;
open(IN,"$ARM_LIST");
@ARM_DATA = ;
close(IN);
($armname,$armval,$armdmg,$armwei,$armele,$armsta,$armclass,$armtownid) = split(/<>/,$ARM_DATA[$cnum]);
($armname2,$armval2) = split(/<>/,$ARM_DATA[$karm]);
$armval2 = int($armval2 * 0.6);
if($armval > $kgold + $armval2){
&K_LOG("$mmonth月:手持金錢不足。$armname 金:$armval");
}else{
$kgold += $armval2;
$kgold -= $armval;
$karm = $cnum;
&K_LOG("$mmonth月:武器:$armname2メ金$armval2出售$armname購買。");
}
}elsif($cid eq "23"){
$ksub2=0;
open(IN,"$PRO_LIST");
@PRO_DATA = ;
close(IN);
($proname,$proval,$prodmg,$prowei,$proele,$prosta,$proclass,$protownid) = split(/<>/,$PRO_DATA[$cnum]);
($proname2,$proval2) = split(/<>/,$PRO_DATA[$kbook]);
$proval2 = int($proval2 * 0.6);
if($proval > $kgold + $proval2){
&K_LOG("$mmonth月:手持金錢不足。$proname 金:$proval");
}else{
$kgold += $proval2;
$kgold -= $proval;
$kbook = $cnum;
&K_LOG("$mmonth月:書籍:$proname購買。");
}
}elsif($cid eq $GET_MAN2){
if(!$get_man){
require "$EXE/get_man.pl";
$get_man = TRUE;
}
&GET_MAN;
}elsif($cid eq $TANREN2){
if(!$tanren){
require "$EXE/tanren.pl";
$tanren = TRUE;
}
&TANREN;
}elsif($cid eq $SYUUGOU){
if(!$syuugou){
require "$EXE/syuugou.pl";
$syuugou = TRUE;
}
&SYUUGOU;
}elsif($cid eq $TEC){
if(!$tec){
require "$EXE/tec.pl";
$tec = TRUE;
}
&TEC;
}elsif($cid eq $SHIRO_TAI){
if(!$shiro_tai){
require "$EXE/shiro_tai.pl";
$shiro_tai = TRUE;
}
&SHIRO_TAI;
}else{
$ksub2++;
if($ksub2 > $DEL_TURN){
unlink("./charalog/main/$kid\.cgi");
unlink("./charalog/log/$kid\.cgi");
unlink("./charalog/command/$kid\.cgi");
&MAP_LOG("[放置]:$kname已經被系統刪除。");
next;
}
&K_LOG("$mmonth月:這個月完全沒實行行程。");
}
}else{
&K_LOG("$mmonth月:不屬於你的國家,所以不能實施行程。");
}
$krice -= $ksol;
if($krice < 0){
&K_LOG("$mmonth月:【脫走】:無法發放米糧,士兵逃兵了!");
$ksol = 0;
$krice = 0;
}
$uhit=0;
if($kstr_ex >= 10){
$kstr++;
$kstr_ex-=10;
$uhit=1;
&K_LOG("$mmonth月:【上昇】:$kname武力提升1點!");
}
if($kint_ex >= 10){
$kint++;
$kint_ex-=10;
$uhit=1;
&K_LOG("$mmonth月:【上昇】:$kname智力提升1點!");
}
if($klea_ex >= 10){
$klea++;
$klea_ex-=10;
$uhit=1;
&K_LOG("$mmonth月:【上昇】:$kname統率力提升1點!");
}
if($kcha_ex >= 10){
$kcha++;
$kcha_ex-=10;
$uhit=1;
&K_LOG("$mmonth月:【上昇】:$kname人望提升1點!");
}
if($uhit){
$ksub1 = "$kstr_ex,$kint_ex,$klea_ex,$kcha_ex,$ksub1_ex,$ksub2_ex,";
}
&CHARA_MAIN_INPUT;
if($ACT_LOG){
($qsec,$qmin,$qhour,$qday) = localtime($kdate);
unshift(@ACT_DATA,"$knameメ更新 \($qday日 $qhour:$qmin:$qsec\)\n");
}
$kup_date++;
if($kup_date > $ENTRY_MAX){last;}
}
}
}
if($thit){
&lock("xxx","1") or &ERR2("文件鎖失敗了。");
&SAVE_DATA($TOWN_LIST,@TOWN_DATA);
&unlock("xxx");
}
closedir(dirlist);
&D_UNLOCK_FILE;
}
#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/#
#_/ 紀錄寫入 _/#
#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/#
sub E_LOG2 {
if($eid ne ""){
open(IN,"./charalog/log/$eid\.cgi");
@E_LOG2 = ;
close(IN);
unshift(@E_LOG2,"$_[0]($mday日$hour時$min分)\n");
splice(@E_LOG2,20);
open(OUT,">./charalog/log/$eid\.cgi");
print OUT @E_LOG2;
close(OUT);
}
}
sub K_LOG2 {
open(IN,"./charalog/log/$kid\.cgi");
@K_LOG2 = ;
close(IN);
unshift(@K_LOG2,"$_[0]($mday日$hour時$min分)\n");
splice(@K_LOG2,20);
open(OUT,">./charalog/log/$kid\.cgi");
print OUT @K_LOG2;
close(OUT);
}
#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/#
#_/ 給料計算 _/#
#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/#
sub SALARY {
$ksal=0;
foreach(@TOWN_DATA){
($z2name,$z2con,$z2num,$z2nou,$z2syo,$z2shiro)=split(/<>/);
if($z2con eq $kcon){
if($mmonth eq "1"){
$ksal += int($z2syo * 8 * $z2num / 10000);
}elsif($mmonth eq "7"){
$ksal += int($z2nou * 8 * $z2num / 10000);
}
}
}
}
#_/_/_/_/_/_/_/_/_/_/_/_/#
# FILE LOCK #
#_/_/_/_/_/_/_/_/_/_/_/_/#
sub D_F_LOCK {
local($retry)=1;
if (-e $lockfile2) {
local($mtime) = (stat($lockfile2))[9];
if ($mtime && $mtime < time - 60) { &D_UNLOCK_FILE; }
}
while (!mkdir($lockfile2, 0755)) {
if (--$retry <= 0) { &ERR2("File lock error!
數據更新中。請稍等。");
}
sleep(1);
}
}
# DATA LOCK #
sub lock #($file_name, $use_lock)
{
local($file_name, $use_lock) = @_;
local($lock_flag) = $file_name . ".lock";
if ($use_lock) {
local($i) = 0;
# return -1 if (!-f $file_name);
rmdir($lock_flag) if (-d $lock_flag && time - (stat($lock_flag))[9] > 60);
while(!mkdir($lock_flag, 0755)) {
select(undef, undef, undef, 0.05);
return 0 if (++ $i >= 100);
}
return 1;
}
return 1;
}
#_/_/_/_/_/_/_/_/_/_/_/_/#
# FILE UNLOCK #
#_/_/_/_/_/_/_/_/_/_/_/_/#
sub D_UNLOCK_FILE
{
rmdir("$lockfile2");
}
sub unlock
{
rmdir("$_[0].lock") if (-d "$_[0].lock");
}
1;