
inc-corp.cgiの解説株価の上昇・下落の金額を一定の割合にしたい場合は、STR #----------------------------------------------------------# # 自動更新 #----------------------------------------------------------# sub CAuto{ if($Ch >= $Cst_t && $Ch < $Cen_t){ #取引時間内 $CAutoindexnum=0; foreach(0..$#Cread_f){ #(データファイル名数を使用する) &CDopen("$Cdata_d/$Cread_f[$CAutoindexnum].cgi"); #staNPC売買 $CAutoBuyNum=0; $CAutoSellNum=0; foreach(1..$CNPCNUM){ #買い if($Cdata[10] >= rand(100)){ #買い気配とのランダム要素(0〜100の間の数と買い気配を比較) $CAutoBuyNum+=1; #(もし上回れば一単位株購入する) } if($Cdata[12] > 0){ #(NPC発行が存在するということを確認) #売り if($Cdata[9] >= rand(100)){ #売り気配とのランダム要素(0〜100の間の数と売り気配を比較) $CAutoSellNum+=1; #(もし上回れば一単位株売却する) } } } if($CAutoBuyNum){ #(NPC自動購入数が存在するということを確認) $CAutoBuy_A=$CAutoBuyNum*$Cdata[1]; #自動買い取り数 $Cdata[12]+=$CAutoBuy_A; #対NPC発行量に+ $Cdata[13]+=$CAutoBuy_A*$Cdata[2]; #会社収入+ $Cdata[15]+=$CAutoBuy_A*$Cdata[2]; #会社総資産+ } if($CAutoSellNum){ #(NPC自動売却数が存在するということを確認) $CAutoSell_A=$CAutoSellNum*$Cdata[1]; #自動売却数 if($CAutoSell_A > $Cdata[12]){ #NPC発行と比較(もしNPC自動売却数>NPC発行数の場合は是正) $CAutoSell_A=$Cdata[12]; } $Cdata[12]-=$CAutoSell_A; #対NPC発行量に− $Cdata[14]+=$CAutoSell_A*$Cdata[2]; #会社支出+ $Cdata[15]-=$CAutoSell_A*$Cdata[2]; #会社総資産− } if($CAutoBuyNum > $CAutoSellNum){ #自動買い取り数>自動売却数 $Cdata[2]+=int(rand(3)); #株価0〜2+ }elsif($CAutoBuyNum < $CAutoSellNum){ #自動買い取り数<自動売却数 $Cdata[2]-=int(rand(3)); #株価0〜2− } $Cdata[7]+=($CAutoBuyNum+$CAutoSellNum)*$Cdata[1]; #取引量を+ if($Cdata[13] > $Cdata[14]){ #今期の会社収入>会社支出 $Cdata[2]++; #株価1+ }elsif($Cdata[13] < $Cdata[14]){ #今期の会社収入<会社支出 $Cdata[2]--; #株価1− } #endNPC売買 #sta会社投資 $Ctousi_r=0; #(投資回収用乱数) $Ctousi_p=0; #(投資回収用数値) $Ctousi_m=0; #(投資用数値) if($Cdata[8]>0 && rand(4)<1){ #会社投資状況が+のとき&1/4の確率で発生 $Ctousi_r=(int(rand(171))+30)/100; #0.3〜2.0までの乱数発生←投資成功か失敗か $Ctousi_p=int($Cdata[8]*$Ctousi_r); #資金回収 $Cdata[13]+=$Ctousi_p; #会社収入+ $Cdata[15]+=$Ctousi_p; #会社総資産+ $Cdata[8]=0; if($Ctousi_r > 1){ #投資成功 $Cdata[2]++; #株価1+ }elsif($Ctousi_r < 1){ #投資失敗 $Cdata[2]--; #株価1− } } if(!$Cdata[8] && rand(4)<1){ #会社投資状況なし&1/4で発生 $Ctousi_m=int($Cdata[15]*(rand(1)/100)); #総資産の1%以下で投資を決定 $Cdata[8]=$Ctousi_m; #投資状況=投資 $Cdata[14]+=$Ctousi_m; #会社支出+ $Cdata[15]-=$Ctousi_m; #会社総資産− } #end会社投資 #調整 $Cdata[9]-=int($Cdata[9]**(3/2)*20*$Crenew)/1000; $Cdata[10]-=int($Cdata[10]**(3/2)*20*$Crenew)/1000; #買い気配売り気配自動減衰用関数(これを変化させることにより市場が流動しやすいかどうかを決定させることもできる) $Cdata[9]=int($Cdata[9]*1000)/1000; #0.001以下は切り捨て(買い気配) $Cdata[10]=int($Cdata[10]*1000)/1000; #0.001以下は切り捨て(売り気配) if($Cdata[2] > $Cdata[5]) {$Cdata[5]=$Cdata[2];} if($Cdata[2] < $Cdata[6]) {$Cdata[6]=$Cdata[2];} if($Cdata[9] < 0) {$Cdata[9]=0;} if($Cdata[10] < 0) {$Cdata[10]=0;} if($Cdata[9] > 100) {$Cdata[9]=100;} if($Cdata[10] > 100) {$Cdata[10]=100;} if($Cdata[2] < 1) {$Cdata[2]=1;} #株価上下の一日上限下限 if($Cdata[2] > int($Cdata[4]*$Cmax_day_up/100)) {$Cdata[2]=int($Cdata[4]*$Cmax_day_up/100);} if($Cdata[2] < int($Cdata[4]*$Cmax_day_down/100)) {$Cdata[2]=int($Cdata[4]*$Cmax_day_down/100);} &CDwrite("$Cdata_d/$Cread_f[$CAutoindexnum].cgi") if($Cdata[0]); $CAutoindexnum++; } }else{ #取引時間外=更新 $CAutoindexnum=0; foreach(0..$#Cread_f){ &CDopen("$Cdata_d/$Cread_f[$CAutoindexnum].cgi"); if($Cdata[7] > 0){ $Cdata[3]=$Cdata[2]; if($Cdata[13] > $Cdata[14]){ #(企業収入>支出) $Cdata[4]=int($Cdata[2]+3); #(株価3+) $Cdata[2]=$Cdata[4]; }elsif($Cdata[13] < $Cdata[14]){ #(企業収入<支出) $Cdata[4]=int($Cdata[2]-3); #(株価3−) $Cdata[2]=$Cdata[4]; }else{ $Cdata[4]=$Cdata[2]; #(変動なし) } $Cdata[5]=$Cdata[2]; $Cdata[6]=$Cdata[2]; $Cdata[7]=0; $Chriritu=$Cdata[13]/($Cdata[14]+1); #(企業利益率計算) $Cdata[13]=0; $Cdata[14]=0; $Cdata[17]="$Cdata[3]\→$Cdata[17]"; #sta配当 if($Cplus_s>0){ if($Chriritu>=2){ #(利益率が200%以上) $Cdata[16]=int($Cdata[3]*$Cplus); #(最高配当%) }elsif($Chriritu>1){ #(利益率が100%以上) $Chriritu=($Chriritu-1)*$Cplus; $Cdata[16]=int($Cdata[3]*$Chriritu); }else{ #(利益率が100%未満) $Cdata[16]=0; #(配当なし) } my ($page,$pagestart,$pageend,$pagenext,$pageprev,$pagemax)=GetPage($Q{pg},$TOP_RANKING_PAGE_ROWS,$DTusercount); #(店舗データを読み込む) foreach my $idx ($pagestart..$pageend){ my $DT=$DT[$idx]; $DTgetmoney=int($Cdata[16]*$DT->{item}[$Citem_id[$CAutoindexnum]-1]);#(配当される金額) if($DTgetmoney>0){ $DT->{money}+=$DTgetmoney; $Cmes="$Cdata[0]から株式配当の$DTgetmoney$term[2]が送られてきました。"; PushLog(0,$DT->{id},$Cmes); $Cdata[15]-=$DTgetmoney;#(配当した金額を総資産から減らす) } } }else{ $Cdata[16]=0; } #end配当 &CDwrite("$Cdata_d/$Cread_f[$CAutoindexnum].cgi") if($Cdata[0]); #バックアップ1,2,3 if($Cdata[0] && $Cspare1_d){ $CSPO="$Cspare1_d/$Cread_f[$CAutoindexnum].cgi"; open(SPOO,"+<$CSPO"); @SPOdata=
# CORP config file #----------------------------------------------------------# # データ設定 #----------------------------------------------------------# $CORPname="corp"; $CORPSname="corp-s"; $Cdata_d="$COMMON_URL/$CORPname"; #データディレクトリ $Clog_f="$Cdata_d/log.cgi"; #ログファイル $Cspare1_d="$Cdata_d/s1"; #バックアップディレクトリ1 $Cspare2_d="$Cdata_d/s2"; #バックアップディレクトリ2 $Cspare3_d="$Cdata_d/s3"; #バックアップディレクトリ3 @Cread_f=("01","02"); #データファイル名 @Citem_id=("259","260"); #アイテムNo $Cpath="http://127.0.0.1/akimono/tf3/action.cgi?key=$CORPname"; ($Creff,$Creffex)=split(/\&\&/,"$ENV{'HTTP_REFERER'}"); #後ろの&以下を切り取る $Cst_t=10; #取引開始時間 $Cen_t=22; #取引終了時間 $Ctime=time(); #1970 1/1 00:00:00からの秒数 ($Cs,$Cm,$Ch,$Cd,$Cmo,$Cy,$Cw)=localtime($Ctime); $Crenew=$UPDATE_TIME/180; #一日480回更新を目安にするため(過剰な場合は割り、足りない場合は掛けるで安定化させる) $Cfee_s=1; #購入取引手数料(%) $Cfee=1+($Cfee_s/100); #実際に使うのはこちら $Cplus_s=0.5; #配当の最高%,0で配当なし $Cplus=($Cplus_s/100); #実際に使うのはこちら $CNPCNUM=int($DTpeople/50); #投資に参加するNPC人数 #int($DTpeople/10)で実際の街人口も可能 #増やしすぎると重くなります(foreach(1..$CNPCNUM)として使用するため) $Cmax_day_up=150; #1日に上がる株価の上限(D=150%) $Cmax_day_down=50; #1日に下がる株価の下限(D=50%) #----------------------------------------------------------# # 表示設定 #----------------------------------------------------------# $Cstart="index"; #株式のスタートページ #index or top #株数が多い場合は top がオススメ(株数=株銘柄数) $Ccomment=< 注意事項 現在のNPC数は$CNPCNUM人です 取引時間は$Cst_t時〜$Cen_t時です 購入取引手数料は$Cfee_s%です(予\定) 配当(最高配当$Cplus_s%)は自動で配当されます ; close(SPOO); open(SPOW,">$CSPO"); print SPOW @CWrite; close(SPOW); if($Cspare2_d){ $CSPT="$Cspare2_d/$Cread_f[$CAutoindexnum].cgi"; open(SPTO,"+<$CSPT"); @SPTdata= ; close(SPTO); open(SPTW,">$CSPT"); print SPTW @SPOdata; close(SPTW); if($Cspare3_d){ $CSPH="$Cspare3_d/$Cread_f[$CAutoindexnum].cgi"; open(SPHW,">$CSPH"); print SPHW @SPTdata; close(SPHW); } } } } $CAutoindexnum++; } } } #----------------------------------------------------------# # データ読み込み・書き込み #----------------------------------------------------------# sub CDopen{ open(CDopen,"+<$_[0]"); @Cdata= ; close(CDopen); chomp @Cdata; } sub CDwrite{ @CWrite=("$Cdata[0]\n$Cdata[1]\n$Cdata[2]\n$Cdata[3]\n$Cdata[4]\n$Cdata[5]\n$Cdata[6]\n$Cdata[7]\n$Cdata[8]\n$Cdata[9]\n$Cdata[10]\n$Cdata[11]\n$Cdata[12]\n$Cdata[13]\n$Cdata[14]\n$Cdata[15]\n$Cdata[16]\n$Cdata[17]\n"); open(CDwrite,"+>$_[0]"); print CDwrite @CWrite; close(CDwrite); } sub CLwrite{ open(CLopen,"+<$Clog_f"); @Clog= ; close(CLopen); @CNlog=("$_[0]\n"); unshift(@Clog,@CNlog); open(CLwrite,"+>$Clog_f"); print CLwrite @Clog; close(CLwrite); } 1;
corp.cgiの解説(表示用ファイル)$Ccomment
DataRead(); CheckUserPass(); RequireFile('inc-html-ownerinfo.cgi'); RequireFile('inc-corp.cgi'); #(corpの設定ファイルを読み込む) $SUB=$Q{mode}; #(modeによって分岐) $disp.=< -株式市場-
STR if($Ch < $Cst_t || $Ch >= $Cen_t){ #(取引時間外) $disp.=<株式市場
取引時間は「$Cst_t時」から「$Cen_t時」までです。
取引開始までしばらくお待ち下さい。
$Ccomment
STR $CORPindexnum=0; foreach(0..$#Cread_f){ #(株式情報出力) &CDopen("$Cdata_d/$Cread_f[$CORPindexnum].cgi"); $Call_ins_num=$Cdata[11]+$Cdata[12]; $disp.=< 株式名:ID 取引値 総株式発行数 会社総資産額 $Cdata[0]:$Cread_f[$CORPindexnum] $Cdata[2] $Call_ins_num $Cdata[15] STR $CORPindexnum++; } $disp.=<
STR $disp.=GetMenuTag("$CORPname",'[株式相場再確認]'); #(更新と同じ感じで) }elsif(defined(&$SUB)){ #(modeが確認された場合) &$SUB; }else{ #(mode確認されなかった場合、$Cstartで設定されたものが表示される) &$Cstart; } $disp.="
"; OutSkin(); 1; sub top{ #(株銘柄数が多い場合はinc-corp.cgiの$Cstartを"top"としたほうが良い) $disp.=<株式市場
$Ccomment
STR $CORPindexnum=0; foreach(0..$#Cread_f){ &CDopen("$Cdata_d/$Cread_f[$CORPindexnum].cgi"); $Call_ins_num=$Cdata[11]+$Cdata[12]; $disp.=< 株式名:ID(クリックで詳細) 取引値 前日終値 始値 高値 安値 総株式発行数 購入 売却 $Cdata[0]:ID$Cread_f[$CORPindexnum] $Cdata[2] $Cdata[3] $Cdata[4] $Cdata[5] $Cdata[6] $Call_ins_num STR $CORPindexnum++; } $disp.=<
株式詳細
STR $disp.=GetMenuTag("$CORPname",'[株式相場再確認]'); } sub index{ $disp.=<株式相場
STR $CORPindexnum=0; foreach(0..$#Cread_f){ &CDopen("$Cdata_d/$Cread_f[$CORPindexnum].cgi"); $Cs_t_y=$Cdata[2]-$Cdata[3]; $Cp_t_y=int(($Cdata[2]/$Cdata[3]*100-100)*100)/100; if($Cs_t_y > 0){ $Cs_t_y="+$Cs_t_y"; }elsif($Cs_t_y < 0){ $Cs_t_y=abs($Cs_t_y); $Cs_t_y="−$Cs_t_y"; }else{ $Cs_t_y="±0" } if($Cp_t_y > 0){ $Cp_t_y="+$Cp_t_y"; }elsif($Cp_t_y < 0){ $Cp_t_y=abs($Cp_t_y); $Cp_t_y="−$Cp_t_y"; }else{ $Cp_t_y="±0" } $Call_ins_num=$Cdata[11]+$Cdata[12]; $CallC=$Call_ins_num*$Cdata[2]; $Chave_n=$DT->{item}[$Citem_id[$CORPindexnum]-1]; $Chave_m=$Cdata[2]*$Chave_n; $disp.=<
$Cdata[0](株式ID:$Cread_f[$CORPindexnum]) 出来高:$Cdata[7]株 取引値
$Cdata[2]前日比
$Cs_t_y($Cp_t_y%)前日終値
$Cdata[3]始値
$Cdata[4]高値
$Cdata[5]安値
$Cdata[6]配当
$Cdata[16]単元株数
$Cdata[1]株総株式発行数
$Call_ins_num株時価総額
$CallC$term[2]会社収入
$Cdata[13]$term[2]会社支出
$Cdata[14]$term[2]会社総資産額
$Cdata[15]$term[2]所有株数:$Chave_n株($Chave_m$term[2])
購入 売却
STR $disp.="[買い気配あり]" if($Cdata[10] > 1); $disp.="[売り気配あり]" if($Cdata[9] > 1); $disp.="
"; $CORPindexnum++; } $disp.=GetMenuTag("$CORPname",'[株式相場再確認]'); } sub chart{ &CDopen("$Cdata_d/$Q{Cid}.cgi"); #(チャートを表示するために読み込む) $disp.=<株式変動チャート
"; if($Q{Cchart}){ $disp.="
$Cdata[0]株 1週間のデータ 1日前 2日前 3日前 4日前 5日前 6日前 7日前 STR $Cchartnum=0; ($Cone,$Ctwo,$Cthr,$Cfou,$Cfiv,$Csix,$Csev)=split(/\→/,$Cdata[17]); if($Cone){$Cchartnum++;}if($Ctwo){$Cchartnum++;}if($Cthr){$Cchartnum++;}if($Cfou){$Cchartnum++;}if($Cfiv){$Cchartnum++;}if($Csix){$Cchartnum++;}if($Csev){$Cchartnum++;} $Cchartall=$Cone+$Ctwo+$Cthr+$Cfou+$Cfiv+$Csix+$Csev; $Ccharthei=int($Cchartall/$Cchartnum); if($Cone){$disp.=" $Cone ";} if($Ctwo){$disp.="$Ctwo ";} if($Cthr){$disp.="$Cthr ";} if($Cfou){$disp.="$Cfou ";} if($Cfiv){$disp.="$Cfiv ";} if($Csix){$disp.="$Csix ";} if($Csev){$disp.="$Csev ";} $disp.="平均:$Ccharthei$term[2] "; } }
"; $disp.="$Cdata[17]"; $disp.="
corp-s.cgiの解説(データ書き込み用ファイル)$Ccomment
Lock(); DataRead(); CheckUserPass(); RequireFile('inc-html-ownerinfo.cgi'); RequireFile('inc-corp.cgi'); $SUB=$Q{mode}; !$SUB && ($SUB='index'); #(modeが設定されていない場合はindexとなる) $disp.=< -株式市場-
STR $CORPSindexnum=0; foreach(0..$#Cread_f){ if($Q{Cid} eq "$Cread_f[$CORPSindexnum]"){ $Cgetnumber=$CORPSindexnum; $CgetOK=1; } $CORPSindexnum++; } if($CgetOK){ #(株式が存在する場合) &CDopen("$Cdata_d/$Cread_f[$Cgetnumber].cgi"); $Cnum=$Cdata[1]*CheckCount($Q{Cnum},0,0,$MAX_MONEY); $Chave=$DT->{item}[$Citem_id[$Cgetnumber]-1]; }else{ #(存在しない場合はindexとなる) $SUB="index"; } if($Ch < $Cst_t || $Ch >= $Cen_t){ $disp.=<株式市場
取引時間は「$Cst_t時」から「$Cen_t時」までです。
取引開始までしばらくお待ち下さい。 STR }elsif(defined(&$SUB) && $SUB ne "index" && $Cpath eq $Creff && $Q{Cch} > $DT->{lasttime}){ #(購入、売却完了の場合) &$SUB; #高値低値,売り買い気配 調整 $Cdata[7]+=$Cnum; if($Cdata[2] > $Cdata[5]) {$Cdata[5]=$Cdata[2];} if($Cdata[2] < $Cdata[6]) {$Cdata[6]=$Cdata[2];} if($Cdata[9] < 0) {$Cdata[9]=0;} if($Cdata[10] < 0) {$Cdata[10]=0;} if($Cdata[9] > 100) {$Cdata[9]=100;} if($Cdata[10] > 100) {$Cdata[10]=100;} #株価上下の一日上限下限 if($Cdata[2] > int($Cdata[4]*$Cmax_day_up/100)) {$Cdata[2]=int($Cdata[4]*$Cmax_day_up/100);} if($Cdata[2] < int($Cdata[4]*$Cmax_day_down/100)) {$Cdata[2]=int($Cdata[4]*$Cmax_day_down/100);} &CDwrite("$Cdata_d/$Cread_f[$Cgetnumber].cgi") if($Cdata[0]); &CLwrite("$Ctime<>$DT->{shopname}($DT->{id}:$TOWN_CODE)<>$Cdata[0]($Cread_f[$Cgetnumber])<>$Cnum<>$Cdata[2]<>$ENV{'REMOTE_ADDR'}") if($Cdata[0]); $DT->{lasttime}=$Ctime; RenewLog(); DataWrite(); DataCommitOrAbort(); }else{ #($SUB="index"はこちらの場合エラーということになる) &index; &CLwrite("$Ctime<>$DT->{shopname}($DT->{id}:$TOWN_CODE)<>$ENV{'REMOTE_ADDR'}<>ERROR"); } $disp.="
".GetMenuTag("$CORPname",'[株式市場へ]').GetMenuTag('main', '[自店へ]'); $disp.="
"; OutSkin(); UnLock(); 1; sub index{ $disp.=<エラーです。 STR } sub buy{ #(購入処理) $CneedMoney=int($Cnum*$Cdata[2]*$Cfee); if($DT->{money} < $CneedMoney){ $Cnum=int($DT->{money}/$Cdata[2]/$Cfee/$Cdata[1])*$Cdata[1]; $CneedMoney=int($Cnum*$Cdata[2]*$Cfee); } $DT->{money}-=$CneedMoney; $DT->{item}[$Citem_id[$Cgetnumber]-1]+=$Cnum; $CNowHaveNum=$DT->{item}[$Citem_id[$Cgetnumber]-1]; #調整 $Cdata[9]-=0.0002*$Cnum; $Cdata[10]+=0.001*$Cnum; if($Cnum > rand(10000)){ $Cdata[2]=int($Cdata[2]*(1+(int(rand(3))+1)/1000)); } $Cdata[11]+=$Cnum; $Cdata[13]+=$CneedMoney; $Cdata[15]+=$CneedMoney; $disp.=< 株式市場 $Ccomment 株式購入(株式ID:$Q{Cid})
STR PushLog(0,$DT->{id},"$Cdata[0]株を$Cnum枚購入しました。"); } sub sel{ #(売却処理) if($Chave < $Cnum){ $Cnum=$Chave; } $CgetMoney=$Cnum*$Cdata[2]; $DT->{item}[$Citem_id[$Cgetnumber]-1]-=$Cnum; $DT->{money}+=$CgetMoney; $CNowHaveNum=$DT->{item}[$Citem_id[$Cgetnumber]-1]; #調整 $Cdata[9]+=0.001*$Cnum; $Cdata[10]-=0.0002*$Cnum; if($Cnum > rand(10000)){ $Cdata[2]=int($Cdata[2]/(1+(int(rand(3))+1)/1000)); } $Cdata[11]-=$Cnum; $Cdata[14]+=$CgetMoney; $Cdata[15]-=$CgetMoney; $disp.=<
購入:$Cdata[0]株 $Cnum株(残:$CNowHaveNum株) 金:$CneedMoney$term[2]也 $Ccomment 株式売却(株式ID:$Q{Cid})
STR PushLog(0,$DT->{id},"$Cdata[0]株を$Cnum枚売却しました。"); }
売却:$Cdata[0]株 $Cnum株(残:$CNowHaveNum株) 金:$CgetMoney$term[2]也