* 称号のレベルで1になっても現状維持を押すとレベルが消える [#l683c4f5] - ページ: [[罪罰改造板3]] - 投稿者: [[trool]] - 優先順位: 緊急 - 状態: 提案 - カテゴリー: 設置できません - 投稿日: 2008-01-30 (水) 02:20:45 - バージョン: ** メッセージ [#m3a73864] #-----------------------------------------------------------# # 罪と罰++ 二律背反 # # Copyright(C) 2001-2002 by Vivid Studio. BLANK BOARD # # Vivid Studio.[ http://www17.big.or.jp/~obochan/vivid/ ] # # BLANK BOARD [ http://pom.to/ ] # #-----------------------------------------------------------# # 共通サブルーチン Version 1.0 #--- [注意事項] --------------------------------------------# # 1.このスクリプトは以下の利用規程に従って配布しています。 # # http://www24.big.or.jp/~obo/game/ore_/gild/ # #-----------------------------------------------------------# #------------------------------------------------------------------------------- # ファイル IN 関連 #---------------------------------------# # 参加者データ全取得 # #---------------------------------------# # 参加者データファイル一覧取得 sub usrdata_read{ opendir(DIR,"$usrdata") || &error("ユーザデータ読みこみエラー",1); @usrfile = grep /\.cgi/,readdir(DIR); closedir(DIR); } # 参加者データ一括読み込み sub usrdata_open{ foreach (0 .. $#usrfile) { open(IN,"$usrdata$usrfile[$_]") || &error("Can't open $usrfile[$_]",1); $line = <IN>; close(IN); push(@tdat,$line); } } #---------------------------------------# # 参加者データ個別取得 # #---------------------------------------# # 参加者データ個別読み込み sub usr_file_open{ open(IN,"$usrdata$id\.cgi") || &error("ユーザーIDが間違っているか、登録されていません。<br>Open Error : $usrdata$id\.cgi",1); @dat = <IN>; close(IN); %DAT = ''; # chop $dat[0]; my @prats = split(/,/,$dat[0]); foreach (0 .. $#prats){ my($key,$v) = split(/;/,$prats[$_]); $DAT{$key} = $v; } &error("パスワードが間違っています",1) if($pw ne $DAT{'pw'} && $admin_pass ne $pw); &hash_data; # 行動セッションリセット $act_cnt=0 if($time-$la>3600*24); } # ハッシュ割り当て sub hash_data{ foreach(0..$#sogo_p){ $sogo_lv[$_]=$DAT{"sglv$_"}; } $pw = $DAT{'pw'}; # パスワード $sogo = $DAT{'sogo'}; $sogo3 = $DAT{'sogo3'}; $soko_cnt= $DAT{'soko_cnt'}; # 倉庫の収納数 $soko_lst= $DAT{'soko_lst'}; # 倉庫の収納品 $gold = $DAT{'gold'}; # お金 $nm = $DAT{'nm'}; # 名前 $nai_cnt = $DAT{'nai_cnt'}; # 内政カウント $wua_cnt = $DAT{'wua_cnt'}; # 武器強化カウント $ten_cnt = $DAT{'ten_cnt'}; # 転生カウント $gun_cnt = $DAT{'gun_cnt'}; # 軍事カウント $war_cnt = $DAT{'war_cnt'}; # 戦争カウント $s_g = $DAT{'s_g'}; # 統一ボーナス $lv = $DAT{'lv'}; # レベル $sei = $DAT{'sei'}; # 性別 $hp = $DAT{'hp'}; # 体力 $max_hp = $DAT{'max_hp'}; # 最大体力 $mp = $DAT{'mp'}; # 魔力 $max_mp = $DAT{'max_mp'}; # 最大魔力 $ua = $DAT{'ua'}; # 攻撃力 $ud = $DAT{'ud'}; # 防御力 $lr = $DAT{'lr'}; # 指揮力 $ag = $DAT{'ag'}; # 敏捷力 $exe = $DAT{'exe'}; # 経験値 $rank = $DAT{'rank'}; # 階級 $rank_exe = $DAT{'rank_exe'}; # 貢献値 $camp = $DAT{'camp'}; # 所属国 $sol = $DAT{'sol'}; # 部隊数 $sol_lv = $DAT{'sol_lv'}; # 部隊訓練度 $nation = $DAT{'nation'}; # 対象国 $we = $DAT{'we'}; # 討伐 回数 $dg_a = $DAT{'dg_a'}; # 武具 $dg_cnt = $DAT{'dg_cnt'}; # 武具 回数 $df_a = $DAT{'df_a'}; # 防具 $df_cnt = $DAT{'df_cnt'}; # 防具 回数 $di_a = $DAT{'di_a'}; # 道具 $di_cnt = $DAT{'di_cnt'}; # 道具 回数 $sogo = $DAT{'sogo'}; # 称号 $sogo2 = $DAT{'sogo2'}; # 称号2 $sogo3 = $DAT{'sogo3'}; # 称号3 $type = $DAT{'type'}; # 行動判定(行動フラグ) $tm = $DAT{'tm'}; # 行動判定(行動フラグ) $bt = $DAT{'bt'}; # 戦闘時敵キャラ判別(行動フラグ) $bst = $DAT{'bst'}; # 技による能力上昇の判定 $ck = $DAT{'ck'}; # 戦闘判定(行動フラグ) $pr = $DAT{'pr'}; # 拘束時間 残り(行動フラグ) $la = $DAT{'la'}; # 更新時間 $roku = $DAT{'roku'}; # 前回給料が払われた時間(仕官した時間) $mes = $DAT{'mes'}; # メッセージ $tnm = $DAT{'tnm'}; # 名前 敵 $tid = $DAT{'tid'}; # ID 敵 $thp = $DAT{'thp'}; # 体力 敵 $thp_max = $DAT{'thp_max'}; # 最大体力 敵 $tmp = $DAT{'tmp'}; # 魔力 敵 $tlv = $DAT{'tlv'}; # レベル 敵 $tua = $DAT{'tua'}; # 攻撃力 敵 $tud = $DAT{'tud'}; # 防御力 敵 $tlr = $DAT{'tlr'}; # 指揮力 敵 $tag = $DAT{'tag'}; # 敏捷力 敵 $tdf_a = $DAT{'tdf_a'}; # 防具 敵 $tdg_a = $DAT{'tdg_a'}; # 武器 敵 $tcp = $DAT{'tcp'}; # 所属国 敵 $tsol = $DAT{'tsol'}; # 部隊数 敵 $tsg = $DAT{'tsg'}; # 称号 敵 $tsol_lv = $DAT{'tsol_lv'}; # 敵部隊訓練度 $b_n = $DAT{'b_n'}; # 戦闘限界ターン $b_v = $DAT{'b_v'}; # 現在のターン数 # 配列インデックス $act_cnt = $DAT{'act_cnt'}; # 行動セッション値 $age_time = $DAT{'age_time'}; # 前回のレベルアップ < time式 $info_mes = $DAT{'info_mes'}; # 情報時に表示されるコメント $pr -= $time-$la; $pr = 0 if($pr<0); } # 国データ読み込み sub cdata_open{ open (IN,"$cdatfile") || &error("国データファイルが開けませんでした",1); @cdat = <IN>; close(IN) or die "Can't close : $!"; %CP = ''; my @prats = split(/,/,$cdat[0]); foreach $prats (@prats){ my($k,$v) = split(/;/,$prats); $CP{$k} = $v; } $cn1=$CP{'cn1'};# 国1の国力 $cg1=$CP{'cg1'};# 国1の財政 $cf1=$CP{'cf1'};# 国1の蓄米 $cs1=$CP{'cs1'};# 国1の予備兵 $ce1=$CP{'ce1'};# 国1の現状 $c1 =$CP{'c1'}; # 国1の参加人数 $c1a=$CP{'c1a'};# 国1の定員数 $cn2=$CP{'cn2'}; $cg2=$CP{'cg2'}; $cf2=$CP{'cf2'}; $cs2=$CP{'cs2'}; $ce2=$CP{'ce2'}; $c2 =$CP{'c2'}; $c2a=$CP{'c2a'}; $cn3=$CP{'cn3'}; $cg3=$CP{'cg3'}; $cf3=$CP{'cf3'}; $cs3=$CP{'cs3'}; $ce3=$CP{'ce3'}; $c3 =$CP{'c3'}; $c3a=$CP{'c3a'}; $cn4=$CP{'cn4'}; $cg4=$CP{'cg4'}; $cf4=$CP{'cf4'}; $cs4=$CP{'cs4'}; $ce4=$CP{'ce4'}; $c4 =$CP{'c4'}; $c4a=$CP{'c4a'}; $cn5=$CP{'cn5'}; $cg5=$CP{'cg5'}; $cf5=$CP{'cf5'}; $cs5=$CP{'cs5'}; $ce5=$CP{'ce5'}; $c5 =$CP{'c5'}; $c5a=$CP{'c5a'}; $set=$CP{'set'}; $all_mem=$CP{'all_mem'}; $goal_no=$CP{'goal_no'}; # 現在何期か。 $hasya=$CP{'hasya'}; $hcamp=$CP{'hcamp'}; $wr_mes=$CP{'wr_mes'}; if($camp==1){ $my_cn=$cn1; $my_cg=$cg1; $my_cf=$cf1; $my_cs=$cs1; $my_ce=$ce1; }elsif($camp==2){ $my_cn=$cn2; $my_cg=$cg2; $my_cf=$cf2; $my_cs=$cs2; $my_ce=$ce2; }elsif($camp==3){ $my_cn=$cn3; $my_cg=$cg3; $my_cf=$cf3; $my_cs=$cs3; $my_ce=$ce3; }elsif($camp==4){ $my_cn=$cn4; $my_cg=$cg4; $my_cf=$cf4; $my_cs=$cs4; $my_ce=$ce4; }elsif($camp==5){ $my_cn=$cn5; $my_cg=$cg5; $my_cf=$cf5; $my_cs=$cs5; $my_ce=$ce5; } } # ログデータ読み込み sub read_data{ # キャラデータ読み込み &usr_file_open; # リロード規制 foreach(0 .. $#act_limit){ # エラー表示式(リロード抑制を明示的に行いたい方はコチラがオススメ。) # &error("行動は $act_limit[$_][2]秒以上間隔を空けて行なってください",1) if($time<=$la+$act_limit[$_][2] && $hour==$act_limit[$_][0]); # リロード無効式 if($time<=$la+$act_limit[$_][2] && $hour==$act_limit[$_][0]){ print "Status: 204\n\n"; if($mode ne "mes_write"){ &unlock($lock) if $lock_check; } exit; } } # 国データ読み込み &cdata_open; $id_p = $id; $pw_p = $pw; $next_lv = int(($lv*$lv)*5); $max_sol = $g_p[$rank]; $sol_lv = 1 if($sol_lv<1); $sol_lv = 500 if($sol_lv>500+($ten_cnt*25)); $max_hp = 10000+($ten_cnt*100) if($max_hp>10000+($ten_cnt*100)); $max_mp = 10000+($ten_cnt*100) if($max_mp>10000+($ten_cnt*100)); $mp = 1 if($mp<1); $ua = 1000+($ten_cnt*30) if($ua>1000+($ten_cnt*30)); $ud = 1000+($ten_cnt*30) if($ud>1000+($ten_cnt*30)); $lr = 1000+($ten_cnt*30) if($lr>1000+($ten_cnt*30)); $ag = 1000+($ten_cnt*30) if($ag>1000+($ten_cnt*30)); $rank = 22 if($rank>22); $rank_exe = 0 if($rank_exe<1); $lv = 1 if($lv<1); $hp = $max_hp if($hp>$max_hp); $mp = $max_mp if($mp>$max_mp); if($pr<1){ &settei;#設定読み込み &status;#ステータス表示 } $bmes="最新情報 ◎ $wr_mes\n" if $wr_mes; $data_reset = int(($cn1+$cn2+$cn3+$cn4+$cn5) * $reset_point); } #------------------------------------------------------------------------------- # ファイル OUT 関連 # 国データ&キャラデータ書き込み sub write_data{ &cdat_write; &dat_write; } # 国データ書き込み sub cdat_write{ $cdat = "cn1;$cn1,cg1;$cg1,cf1;$cf1,cs1;$cs1,ce1;$ce1,c1;$c1,c1a;$c1a,cn2;$cn2,cg2;$cg2,cf2;$cf2,cs2;$cs2,ce2;$ce2,c2;$c2,c2a;$c2a,cn3;$cn3,cg3;$cg3,cf3;$cf3,cs3;$cs3,ce3;$ce3,c3;$c3,c3a;$c3a,cn4;$cn4,cg4;$cg4,cf4;$cf4,cs4;$cs4,ce4;$ce4,c4;$c4,c4a;$c4a,cn5;$cn5,cg5;$cg5,cf5;$cf5,cs5;$cs5,ce5;$ce5,c5;$c5,c5a;$c5a,set;$set,all_mem;$all_mem,goal_no;$goal_no,hasya;$hasya,hcamp;$hcamp,ad;$addr,ht;$host,date;$date,wr_mes;$wr_mes,\n"; open (OUT,">$cdatfile") || &error("open error:$cdatfile",1); print OUT $cdat; close(OUT) or die "Can't close : $!"; } # キャラデータ書き込み sub dat_write{ &error("open error no such a file!",1) if(!$nm || !$id); $dat[0] = "la;$time,nm;$nm,nai_cnt;$nai_cnt,dat_sogo_lv;$dat_sogo_lv,ten_cnt;$ten_cnt,gun_cnt;$gun_cnt,war_cnt;$war_cnt,pw;$pw,id;$id,sei;$sei,type;$type,age_time;$age_time,act_cnt;$act_cnt,hp;$hp,max_hp;$max_hp,lv;$lv,mp;$mp,max_mp;$max_mp,rank;$rank,ua;$ua,ud;$ud,lr;$lr,ag;$ag,ck;$ck,tm;$tm,bt;$bt,bst;$bst,exe;$exe,rank_exe;$rank_exe,sol;$sol,sol_lv;$sol_lv,nation;$nation,we;$we,camp;$camp,pr;$pr,tnm;$tnm,tid;$tid,thp;$thp,tlr;$tlr,tag;$tag,tsol;$tsol,tsg;$tsg,tsol_lv;$tsol_lv,b_n;$b_n,b_v;$b_v,thp_max;$thp_max,tlv;$tlv,tdg_a;$tdg_a,tdf_a;$tdf_a,tua;$tua,tud;$tud,tmp;$tmp,tcp;$tcp,gold;$gold,roku;$roku,dg_a;$dg_a,dg_cnt;$dg_cnt,df_a;$df_a,df_cnt;$df_cnt,di_a;$di_a,di_cnt;$di_cnt,sogo;$sogo,sogo2;$sogo2, sogo3;$sogo3,soko_cnt;$soko_cnt,soko_lst;$soko_lst,wua_cnt;$wua_cnt,mes;$mes,s_g;$s_g,info_mes;$info_mes,\n";foreach(0..$#sogo_p){ $dat_sogo_lv.="sglv$_;$sogo_lv[$_]," if($sogo_lv[$_]); } $dat[1] = "$date<>$addr<>$host<>$agent<>\n"; if($sogo!=$sogo3){$sogo_lv[$sogo]++; $sogo3=$sogo; } $dat_sogo_lv = "sogo3;$sogo3,"; open (OUT,">$usrdata$id\.cgi") || &error("open error:$usrdata$id\.cgi",1); print OUT @dat; close(OUT) or die "Can't close : $!"; } # 過去の栄光書き込み&バックアップ処理 sub hist_write{ $cdat = "cn1;$cn1,cg1;$cg1,cf1;$cf1,cs1;$cs1,ce1;$ce1,c1;$c1,c1a;$c1a,cn2;$cn2,cg2;$cg2,cf2;$cf2,cs2;$cs2,ce2;$ce2,c2;$c2,c2a;$c2a,cn3;$cn3,cg3;$cg3,cf3;$cf3,cs3;$cs3,ce3;$ce3,c3;$c3,c3a;$c3a,cn4;$cn4,cg4;$cg4,cf4;$cf4,cs4;$cs4,ce4;$ce4,c4;$c4,c4a;$c4a,cn5;$cn5,cg5;$cg5,cf5;$cf5,cs5;$cs5,ce5;$ce5,c5;$c5,c5a;$c5a,set;$set,all_mem;$all_mem,goal_no;$goal_no,hasya;$hasya,hcamp;$hcamp,ad;$addr,ht;$host,date;$date,wr_mes;$wr_mes,\n"; open (DB,">>$histfile") || &error("open error:$histfile",1); print DB $cdat; close(DB) or die "Can't close : $!"; } #------------------------------------------------------------------------------- # ファイルロック関連(rename式) # $lock = &lock if($lock_check); # &unlock($lock) if($lock_check); # -----ロック----- sub lock { my %lock = (dir => "$lockdir", basename => "$lockfile", timeout => 30, trytime => 10, @_); $lock{path} = $lock{dir} . $lock{basename}; for (my $i = 0; $i < $lock{trytime}; $i++, sleep 1) { return \%lock if (rename($lock{path}, $lock{current} = $lock{path} . time)); } opendir(LOCKDIR, $lock{dir}); my @filelist = readdir(LOCKDIR); closedir(LOCKDIR); foreach (@filelist) { if (/^$lock{basename}(\d+)/) { return \%lock if (time - $1 > $lock{timeout} and rename($lock{dir} . $_, $lock{current} = $lock{path} . time)); last; } } undef; &error("ファイルがロックされています"); } # -----ロック解除----- sub unlock { rename($_[0]->{current}, $_[0]->{path}); } #------------------------------------------------------------------------------- # フォームデータ関連 # フォームデコード処理 sub decode { local($buffer, @pairs, $name, $value); $post_flag=0; if($ENV{'REQUEST_METHOD'} eq "POST"){ $post_flag=1; &error("投稿量が大きすぎます") if($ENV{'CONTENT_LENGTH'}>1024); read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); }else{ $buffer = $ENV{'QUERY_STRING'}; &error("投稿量が大きすぎます") if(length($buffer)>800) } @pairs = split(/&/, $buffer); foreach (@pairs) { ($name,$value) = split(/=/); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; # 記号置換え $value =~ s/&/&/g; $value =~ s/\;/;\;/g; $value =~ s/,/,\;/g; $value =~ s/</</g; $value =~ s/>/>/g; $value =~ s/"/"/g; $value =~ s/\///\;/g; $value =~ s/\./.\;/g; $value =~ s/cgi/c\;g\;i\;/g; # 改行等処理 $value =~ s/\r\n//g; $value =~ s/\r//g; $value =~ s/\n//g; # 文字コードをシフトJIS変換 &jcode'convert(*value, "sjis", "", "z"); $in{$name} = $value; # 一括削除用 if ($name eq "usr_del") { push(@USR_DEL,$value); } } $pw = $in{'pw'}; $cmd = $in{'cmd'}; $com = $in{'com'}; $com2 = $in{'com2'}; $id = $in{'id'}; $sogo_sel = $in{'sogo_sel'}; $mode = $in{'mode'}; } #------------------------------------------------------------------------------- # アクセス制御関連 # アクセスチェック(アクセス拒否) sub axs_check { &get_host; local($flag)=0; foreach (@deny) { if (!$_) { next; } $_ =~ s/\*/\.\*/g; if ($host =~ /$_/i || $addr =~ /$_/i) { $flag=1; last; } } if ($flag) { &error("アクセスを許可されていません"); } } # ホスト情報取得 sub get_host { $host = $ENV{'REMOTE_HOST'}; $addr = $ENV{'REMOTE_ADDR'}; $agent= $ENV{'HTTP_USER_AGENT'}; if ($get_remotehost) { if ($host eq "" || $host eq "$addr") { $host = gethostbyaddr(pack("C4", split(/\./, $addr)), 2); } } if ($host eq "") { $host = $addr; } } # 時間取得 sub get_time { $time = time; ($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime($time); $min = "0$min" if($min<10); $sec = "0$sec" if($sec<10); $month++; @week=('Sun','Mon','Tue','Wed','Thu','Fri','Sat'); $date = "$month/$mday $hour:$min:$sec"; srand($time); } # プレイ規制 sub safetime { foreach (0 .. $#safetime){ &error("プレイ規制時間中です。暫くお待ち下さい。") if $hour eq $safetime[$_]; } } #------------------------------------------------------------------------------- # 表示関連 # 圧縮転送 sub content_type { if($gzip){ $|=1; if($ENV{'HTTP_ACCEPT_ENCODING'}=~/gzip/ ){ print "Content-type: text/html; charset=shift_jis\n"; print "Content-encoding: gzip\n\n"; open(STDOUT,"| $gzip -1 -c"); }else{ print "Content-type: text/html; charset=shift_jis\n\n"; } print "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">\n"; } else { print "Content-type: text/html; charset=shift_jis\n\n"; print "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">\n"; } } #著作権表示(削除・変更不可) sub copyright{ if($mv_mode eq 'mv'){ print qq|<hr color="white">罪と罰++ 二律背反 $ver<br><a href="http://pom.to/">BLANK BOARD[ねっと遊園地♪]</a>| if(!$tm && !$log); print qq|</body></html>|; }else{ print <<"EOM"; <div align="right" style="font-size:12px"> 罪と罰++ 二律背反 $ver<br> <a href="http://www17.big.or.jp/~obochan/vivid/" target="_blank" style="font-size:13px">Vivid Studio.</a><br> <a href="http://pom.to/" target="_blank" style="font-size:11px">BLANK BOARD[ねっと遊園地♪]<br> <img src="$imgs/bb.gif" border="0" alt="BLANK BOARD[ねっと遊園地♪]"></a> </div> </body> </html> EOM } } # エラー表示 sub error{ print "Content-type: text/html\n\n"; print "<html><head><title>CGI Error</title></head>\n"; print "<body $body><h1>CGI Error</h1>\n"; print "<p>This program encountered an internal error.</p>"; print "<p><b>Error:</b> $_[0]</p>\n"; print "</body></html>"; if ($_[1] && $lock_check) { &unlock($lock); } exit; } # 称号の取得部分 sub get_sogo(){ $sogo3=$sogo2; # 3つめの称号 $sogo2=$sogo; $sogo = @_[0]; # 称号取得時の効果 # たとえば、3回連続 覇者なら10万G # if($sogo==1&&$sogo==$sogo2&&$sogo2==$sogo3){ # $gold+=100000; # } # 称号レベルアップ $sogo_lv[$sogo]++; } 1;#削除不可 丸ごと張るのはよくないのは知っていますがperl checkerに掛けるときに 厄介なので許して下さい 称号のレベルで1になっても現状維持を押すとレベルが消える おそらく,称号レベルの保存が上手くいってないですが,どこをどうすればいいのか わかりません,また称号2と3はいらないのですがどこを消せば良いにか分からなくて,困っています 詳しく教えて頂けると幸いです ちなみにこのサイトの称号の切り替えと称号レベルをやったつもりです -------- - 丸ごと貼るのがよくないとわかってるなら貼らないでください^^見る側が苦労します。~ 更新毎に消えるのなら sub dat_write がおかしいんじゃないですかね?~ 私は実装してないんでよく知らないですけど。 -- [[six]] &new{2008-01-30 (水) 13:38:10}; - よく考えればtxt形式で張ればよかった,ごめんなさい -- [[trool]] &new{2008-01-30 (水) 17:29:29}; - sub dat_write みてもどこが違うのかわからないです -- [[trool]] &new{2008-01-30 (水) 17:38:50}; #comment