珍走記を改造しよう

第七回:特殊車両を追加しよう

今回、新しい特殊車両を追加してみたいと思います。特殊車両とは、プレイヤー以外にうろつくもののことです。パトカー、当たり屋、レッカー車などがあります。また、もはや車でないですが、天使や死神、通行止めなどもこれに入ります。

さて、これに新しい特殊車両を追加したいと思います。

仕様を決める

まず、どんなものを作るのか決める必要があります。なんでもいいのですが、今回は「配給車」というものを作ってみたいと思います。僕が欲しいと思っていたもので、出会うと強力なアイテムをくれるというものです。

また、今回の改造は、前回までの改造が施されたソースを使って行いますが、概念自体はソースが違っても大丈夫です。

特殊車両の情報の設定

まず、main.jsの、特殊車両の情報を追加します。

main.jsの特殊車両に関する情報は、5行目の specialcar=['specialcar','パトカー','当たり屋','レッカー車','死神','天使','道路工事','通行止め']; と10行目の specialexp=['specialexp','罰金を取られます。','パンクさせられたり車を壊されたりします。','どこかにレッカーされます。','何か悪いことが起こります。','何か良いことが起こります。','追い抜けません。','通過できません。']; にあります。5行目は特殊車両の名前、10行目は特殊車両の説明です。

これは文字列が「,」で区切られていて、最初は0番目となっているので、パトカーは1番目、当たり屋は2番目、...となっています。0番目は、関係ない文字列となっていて、欠番です。

ここに、新しい特殊車両の情報を追加します。 specialcar=['specialcar','パトカー','当たり屋','レッカー車','死神','天使','道路工事','通行止め','配給車']; specialexp=['specialexp','罰金を取られます。','パンクさせられたり車を壊されたりします。','どこかにレッカーされます。','何か悪いことが起こります。','何か良いことが起こります。','追い抜けません。','通過できません。','強力なアイテムをくれます。']; これで、新しく追加された配給車は8番目になりました。

特殊車両の数の設定

設定に関わる部分はまだあります。lib.cgiです。24行目付近に、 @specialnum=(2,2,2,1,1,3); という記述があります。これは、それぞれの特殊車両の数です。数字が区切られていて、最初の2が1番目のパトカーの数、次の2は2番目の当たり屋の数、以下同様にレッカー車も2台、死神と天使はそれぞれ1体ずつ、そして道路工事は3ということになります。

ここで気づくはずです。通行止めの数がないのです。これの理由ですが、この設定内容を使っている部分を見てみましょう。admin.cgiの $count=$#lib'graph; for($j=1; $j<=6; $j++){ for($k=1; $k<=$lib'specialnum[$j-1]; $k++){ $m=int(rand($count-1))+2; while($list=~/\+$m\+/){$m++;} $user{"*special$j"}.=$m.","; $list.="+$m+"; $count--; &lib'err(23) if $m>$#lib'graph || $count<2; } } の部分です。これは、最初ゲームを初期化する際に、各特殊車両をマップ上に配置する処理です。実は、ここでもともと通行止めを配置する処理は行われていない、つまり最初通行止めはマップに配置されないのです。実は、通行止めの数は固定ではなく可変で、通行止め標識などのアイテムによって増えたり、通行許可証によって減ったりします。

しかし、だからといって上の数のリストにそのまま配給車の数を追加していいわけではありません。そのまま追加するとそれは7番目になります。配給車は8番目だから、7番目の通行止めの数も一応書いておかないと次のは追加できません。そこで、通行止めの数は「0」ということにしましょう。そうすれば追加できます。 @specialnum=(2,2,2,1,1,3,0,1); 今回、配給車は1つにしました。

さて、上で触れたように、admin.cgiではもともと1番から6番までの処理しかされていません。これを全ての特殊車両についてちゃんと処理するようにするには、 $count=$#lib'graph; for($j=1; $j<=@lib'specialnum; $j++){ for($k=1; $k<=$lib'specialnum[$j-1]; $k++){ $m=int(rand($count-1))+2; while($list=~/\+$m\+/){$m++;} $user{"*special$j"}.=$m.","; $list.="+$m+"; $count--; &lib'err(23) if $m>$#lib'graph || $count<2; } } こうすると、全ての特殊車両だから、今まで全く処理されなかった通行止めも処理されるようになりますが、「0個」なので結果は変わりません。

また、lib.cgiの sub getroute { local($pos,$j,$route,@specials); ($pos)=@_; $route=0; for($j=1; $j<=5; $j++){ @specials=split(/\,/,$'user{"*special$j"}); foreach(@specials){ return(2) if $_==$pos; } } for($j=6; $j<=7; $j++){ @specials=split(/\,/,$'user{"*special$j"}); foreach(@specials){ return(4) if $_==$pos; } } return(0); } sub getspecial { local($j,$pos,@specials); ($pos)=@_; for($j=1; $j<=7; $j++){ @specials=split(/\,/,$'user{"*special$j"}); foreach(@specials){ return($j) if $_==$pos; } } return(0); } の部分も、特殊車両が7個という前提の処理になっているので、これをこう修正します。 sub getroute { local($pos,$j,$route,@specials); ($pos)=@_; $route=0; for($j=1; $j<=@specialnum; $j++){ @specials=split(/\,/,$'user{"*special$j"}); foreach(@specials){ if($j==6 || $j==7){ # 通れない特殊車両の場合 return(4) if $_==$pos; }else{ # 通れる特殊車両の場合 return(2) if $_==$pos; } } } return(0); } sub getspecial { local($j,$pos,@specials); ($pos)=@_; for($j=1; $j<=@specialnum; $j++){ @specials=split(/\,/,$'user{"*special$j"}); foreach(@specials){ return($j) if $_==$pos; } } return(0); }

特殊車両の動作の設定

これで設定は終わりです。いよいよ動作を作る部分です。今までの作業はどんな特殊車両でも変わりませんが、ここからは追加する特殊車両に応じた改造が必要になってきます。

特殊車両の処理は、custom.cgi###特殊車両と出会った時 sub special { local($num,$special,$param,$capacity,$adv,$tmp); ($num,$special)=@_; ($tmp,$tmp,$tmp,$capacity,$adv)=&lib'getprice($'user{"${num}_car"}); if($special==1 && $adv!~/b/ && $'user{"${num}_status"}!~/[bpsvw]/){ if($'user{"${num}_status"}=~/y/){ $'user{"${num}_alert"}.="パトカーに飲酒運転でつかまりました。車を没収されました。"; &lib'chat("<$num>はパトカーに<font color=\"red\">飲酒運転</font>でつかまりました。"); &lib'chat("車を<font color=\"red\">没収</font>されました。"); $'user{"${num}_car"}="+9+"; $'user{"${num}_work"}=~s/\(\+[0-9]+\+\)//g; if($'user{"${num}_money"}>0){ $'user{"${num}_alert"}.="罰金で持ち金がなくなりました。"; &lib'chat("罰金で持ち金が<font color=\"red\">なくなり</font>ました。"); $'user{"${num}_money"}=0; } $'user{"${num}_alert"}.="<br>"; }else{ $'user{"${num}_alert"}.="パトカーにスピード違反でつかまりました。"; &lib'chat("<$num>はパトカーに<font color=\"red\">スピード違反</font>でつかまりました。"); if($'user{"${num}_status"}=~/t/){ $param=4; }else{ $param=2; } if($'user{"${num}_money"}>0){ $'user{"${num}_alert"}.="罰金で持ち金が1/$paramになりました。<br>"; &lib'chat("罰金で持ち金が<font color=\"red\">1/$param</font>になりました。"); $'user{"${num}_money"}=int($'user{"${num}_money"}/$param); }else{ $'user{"${num}_alert"}.="罰金で借金が$param倍になりました。<br>"; &lib'chat("罰金で借金が<font color=\"red\">$param倍</font>になりました。"); $'user{"${num}_money"}*=$param; } } }elsif($special==2 && ($'user{"${num}_status"}.$adv)!~/b/){ if(($'user{"${num}_status"}.$adv)=~/p/ || rand(1)<0.3){ $'user{"${num}_alert"}.="当たり屋にぶつけられました。車が壊れたのでチャリンコになりました。<br>"; &lib'chat("<$num>は当たり屋にぶつけられました。"); &lib'chat("車が壊れたので<font color=\"red\">チャリンコ</font>になりました。"); $'user{"${num}_car"}="+9+"; $'user{"${num}_status"}=~s/p//g; $'user{"${num}_work"}=~s/\(\+[0-9]+\+\)//g; }else{ $'user{"${num}_alert"}.="当たり屋にぶつけられました。タイヤがパンクしました。<br>"; &lib'chat("<$num>は当たり屋にぶつけられました。"); &lib'chat("タイヤが<font color=\"red\">パンク</font>しました。"); $'user{"${num}_status"}.="p"; } }elsif($special==3 && ($'user{"${num}_status"}.$adv)!~/b/){ local($pname,$prf); $'user{"${num}_position"}=&lib'getrandom; ($pname,$tmp,$tmp,$prf)=&lib'getgraph($'user{"${num}_position"}); $prf=$lib'prfname[$prf]; $'user{"${num}_alert"}.="レッカー車に$prf $pnameまでレッカーされました。レッカー代50万円を払いました。<br>"; &lib'chat("<$num>はレッカー車に<font color=\"green\">"."$prf $pname"."</font>までレッカーされました。"); &lib'chat("レッカー代<font color=\"red\">50万円</font>を払いました。"); $'user{"${num}_money"}-=50; }elsif($special==4 && $'user{"${num}_status"}!~/b/){ local(@specials,$i,@items); @items = split(/\+\+/,$'user{"${num}_item"}); if(@items>=3 && rand(1)<0.2){ $'user{"${num}_alert"}.="死神にアイテムを全部捨てられました。<br>"; &lib'chat("<$num>は死神に<font color=\"red\">アイテムを全部</font>捨てられました。"); $'user{"${num}_item"}=''; }elsif($'user{"${num}_money"}>=500 && rand(1)<0.3){ $'user{"${num}_alert"}.="死神に持ち金を全部捨てられました。<br>"; &lib'chat("<$num>は死神に<font color=\"red\">持ち金を全部</font>捨てられました。"); $'user{"${num}_money"}=0; }elsif($'user{"${num}_car"}!="+9+" && rand(1)<0.3){ $'user{"${num}_alert"}.="死神に車を捨てられました。車を失ったのでチャリンコになりました。<br>"; &lib'chat("<$num>は死神に車を捨てられました。"); &lib'chat("車を失ったので<font color=\"red\">チャリンコ</font>になりました。"); $'user{"${num}_car"}="+9+"; $'user{"${num}_work"}=~s/\(\+[0-9]+\+\)//g; }elsif($'user{"${num}_own"} ne '' && rand(1)<0.6){ local($prf,@buil,$j,@each); $'user{"${num}_own"}=~s/\+([0-9]+)\+//; $prf=$1; $'user{"*history"}=~s/\+$prf\+//g; @buil=split(/\,/,$'user{"${num}_buil"}); for($i=0; $i<=$#buil; $i++){ @each=split(/\+/,$buil[$i]); foreach(@each){ if($_>0){ ($tmp,$tmp,$tmp,$j)=&lib'getgraph($_); if($j==$prf){ $buil[$i]=~s/\+$_\+//g; } } } } $'user{"${num}_buil"}=join(',',@buil); $prf=$lib'prfname[$prf]; $'user{"${num}_alert"}.="死神に$prfを没収されました。<br>"; &lib'chat("<$num>は死神に<font color=\"green\">$prf</font>を没収されました。"); }elsif($'user{"${num}_ticket"} ne ''){ $'user{"${num}_alert"}.="死神に車券を全部捨てられました。<br>"; &lib'chat("<$num>は死神に<font color=\"red\">車券を全部</font>捨てられました。"); $'user{"${num}_ticket"}=''; }elsif($adv!~/p/){ $'user{"${num}_alert"}.="死神にパンクさせられた上、酔わされて眠らされました。<br>"; &lib'chat("<$num>は死神に<font color=\"red\">パンク</font>させられた上、<font color=\"red\">酔わされて眠らされ</font>ました。"); $'user{"${num}_status"}=~s/[pys]//g; $'user{"${num}_status"}.="pys"; }else{ $'user{"${num}_alert"}.="死神に酔わされて眠らされました。<br>"; &lib'chat("<$num>は死神に<font color=\"red\">酔わされて眠らされ</font>ました。"); $'user{"${num}_status"}=~s/[ys]//g; $'user{"${num}_status"}.="ys"; } $'user{"${num}_work"}.="d"; local($on,$lim); @specials=split(/\,/,$'user{'*special4'}); for($i=0; $i<=$#specials; $i++){ if($specials[$i]==$'user{"${num}_position"}){ $specials[$i]=&lib'getrandom; $on=&lib'getspecial($specials[$i]); $lim=0; while($on!=0 && $lim<10){ $specials[$i]=&lib'getrandom; $on=&lib'getspecial($specials[$i]); $lim++; } } } $'user{'*special4'}=join(',',@specials); }elsif($special==5){ local(@specials,$i,@items); @items = split(/\+\+/,$'user{"${num}_item"}); if(rand(1)<0.3){ $'user{"${num}_alert"}.="天使が".$'user{"${num}_name"}."券を10枚くれました。<br>"; &lib'chat("<$num>は天使に".$'user{"${num}_name"}."券を<font color=\"red\">10枚</font>もらいました。"); for($i=0; $i<10; $i++){ $'user{"${num}_ticket"}.=$num.","; } }elsif($'user{"${num}_item"} ne '' && @items<=int($capacity/2) && rand(1)<0.4){ $'user{"${num}_alert"}.="天使がアイテムを倍増してくれました。<br>"; &lib'chat("<$num>は天使に<font color=\"red\">アイテムを倍増</font>してもらいました。"); $'user{"${num}_item"}.=$'user{"${num}_item"}; }elsif(rand(1)<0.6){ if($'user{"${num}_money"}>=0){ $'user{"${num}_alert"}.="天使が持ち金を倍増してくれました。<br>"; &lib'chat("<$num>は天使に<font color=\"red\">持ち金を倍増</font>してもらいました。"); $'user{"${num}_money"}*=2; }else{ $'user{"${num}_alert"}.="天使が借金を帳消しにしてくれました。<br>"; &lib'chat("<$num>は天使に<font color=\"red\">借金帳消し</font>してもらいました。"); $'user{"${num}_money"}=0; } }elsif($'user{"${num}_status"}=~/p/){ $'user{"${num}_alert"}.="天使がパンクをなおしてくれました。<br>"; &lib'chat("<$num>は天使にパンクをなおしてもらいました。"); $'user{"${num}_status"}=~s/p//g; }else{ $'user{"${num}_alert"}.="天使がターボ・バリヤー・追い越し禁止にしてくれました。<br>"; &lib'chat("<$num>は天使に<font color=\"red\">ターボ・バリヤー・追い越し禁止</font>にしてもらいました。"); $'user{"${num}_status"}=~s/[tbg]//g; $'user{"${num}_status"}.="tbg"; } $'user{"${num}_work"}.="a"; local($on,$lim); @specials=split(/\,/,$'user{'*special5'}); for($i=0; $i<=$#specials; $i++){ if($specials[$i]==$'user{"${num}_position"}){ $specials[$i]=&lib'getrandom; $on=&lib'getspecial($specials[$i]); $lim=0; while($on!=0 && $lim<10){ $specials[$i]=&lib'getrandom; $on=&lib'getspecial($specials[$i]); $lim++; } } } $'user{'*special5'}=join(',',@specials); } return; } のところに書いてあります。なかなか巨大ですね。

見てみると、 }elsif($special==4 && $'user{"${num}_status"}!~/b/){ 〜 } に死神の処理が、 }elsif($special==5){ 〜 } にあることが分かります。この4や5が、その特殊車両の番号です。したがって、8番である配給車の処理は、 }elsif($special==8){ 〜 } というようにして書けばよいということが分かります。

さて、この配給車はなかなか強いので、連続して出会ってしまわれても困ります。そこで、死神や天使と同じように、会った後ワープするようにします。これは、死神や天使の処理からコピーしてきましょう。 }elsif($special==8){ local(@specials,$i,@items); @items = split(/\+\+/,$'user{"${num}_item"}); local($on,$lim); @specials=split(/\,/,$'user{'*special8'}); for($i=0; $i<=$#specials; $i++){ if($specials[$i]==$'user{"${num}_position"}){ $specials[$i]=&lib'getrandom; $on=&lib'getspecial($specials[$i]); $lim=0; while($on!=0 && $lim<10){ $specials[$i]=&lib'getrandom; $on=&lib'getspecial($specials[$i]); $lim++; } } } $'user{'*special8'}=join(',',@specials); } 前と後ろに処理が追加されました。アイテムに関係する処理なので、@itemsに自分の持っているアイテムを分割して代入しています。

あとはまとめて書きます。まず、アイテムをくれるわけですが、既にアイテムの積載量が限界の場合、アイテムをもらうことができません。そこで、その場合は1000万をくれるということにします。

そうでない場合、ただ強いアイテムを闇雲に渡すのではなく、状況に応じたアイテムをくれると嬉しいですね。それをいろいろやってみました。各アイテムの処理の順番を変えれば、優先順位を変えることが可能です。 }elsif($special==8){ local(@specials,$i,@items); @items = split(/\+\+/,$'user{"${num}_item"}); local($iname,$tmp,$myx,$myy,$prf); ($tmp,$myx,$myy,$prf) = &lib'getgraph($user{"${num}_position"}); if(@items >= $capacity){ #アイテムが満杯なら1000万あげる $'user{"${num}_money"} += 1000; $iname = "1000万円"; }elsif($'user{"${num}_car"} eq "+9+" && $'user{"${num}_item"} !~ /\+45\+/ && rand(1)<0.7){ #チャリンコで、交換権を既に持っていなければ、70%の確率で交換権をあげる $'user{"${num}_item"} .= "+45+"; ($iname) = &lib'getprice("+45+"); }elsif($'user{"${num}_money"} < 0 && $'user{"${num}_item"} !~ /\+58\+/ && rand(1)<0.8){ #金がマイナスで、平等権を既に持っていなければ、80%の確率で平等権をあげる $'user{"${num}_item"} .= "+58+"; ($iname) = &lib'getprice("+58+"); }elsif(&lib'getdistance($myx,$myy,$user{'*goal'}) >= 900 && $'user{"${num}_item"} !~ /\+55\+/ && rand(1)<0.6){ #目的地から900km以上離れていて、自由切符を既に持っていなければ、60%の確率で自由切符をあげる $'user{"${num}_item"} .= "+55+"; ($iname) = &lib'getprice("+55+"); }else{ #その他 local(@rnds); @rnds = (56,31,43,52,15); #爆弾DX、召集令状DX、差し押さえ令状、サイコロDX、睡眠薬DXの中からランダムに1つ選ぶ local($get) = $rnds[int(rand(@rnds))]; $'user{"${num}_item"} .= "+$get+"; ($iname) = &lib'getprice("+$get+"); } $'user{"${num}_alert"}.="配給車が$inameをくれました。<br>"; &lib'chat("<$num>は配給車に<font color=\"brown\">$iname</font>をもらいました。"); local($on,$lim); @specials=split(/\,/,$'user{'*special8'}); for($i=0; $i<=$#specials; $i++){ if($specials[$i]==$'user{"${num}_position"}){ $specials[$i]=&lib'getrandom; $on=&lib'getspecial($specials[$i]); $lim=0; while($on!=0 && $lim<10){ $specials[$i]=&lib'getrandom; $on=&lib'getspecial($specials[$i]); $lim++; } } } $'user{'*special8'}=join(',',@specials); } これを最初の巨大なのに追加して、 (省略) }elsif($special==5){ local(@specials,$i,@items); @items = split(/\+\+/,$'user{"${num}_item"}); if(rand(1)<0.3){ $'user{"${num}_alert"}.="天使が".$'user{"${num}_name"}."券を10枚くれました。<br>"; &lib'chat("<$num>は天使に".$'user{"${num}_name"}."券を<font color=\"red\">10枚</font>もらいました。"); for($i=0; $i<10; $i++){ $'user{"${num}_ticket"}.=$num.","; } }elsif($'user{"${num}_item"} ne '' && @items<=int($capacity/2) && rand(1)<0.4){ $'user{"${num}_alert"}.="天使がアイテムを倍増してくれました。<br>"; &lib'chat("<$num>は天使に<font color=\"red\">アイテムを倍増</font>してもらいました。"); $'user{"${num}_item"}.=$'user{"${num}_item"}; }elsif(rand(1)<0.6){ if($'user{"${num}_money"}>=0){ $'user{"${num}_alert"}.="天使が持ち金を倍増してくれました。<br>"; &lib'chat("<$num>は天使に<font color=\"red\">持ち金を倍増</font>してもらいました。"); $'user{"${num}_money"}*=2; }else{ $'user{"${num}_alert"}.="天使が借金を帳消しにしてくれました。<br>"; &lib'chat("<$num>は天使に<font color=\"red\">借金帳消し</font>してもらいました。"); $'user{"${num}_money"}=0; } }elsif($'user{"${num}_status"}=~/p/){ $'user{"${num}_alert"}.="天使がパンクをなおしてくれました。<br>"; &lib'chat("<$num>は天使にパンクをなおしてもらいました。"); $'user{"${num}_status"}=~s/p//g; }else{ $'user{"${num}_alert"}.="天使がターボ・バリヤー・追い越し禁止にしてくれました。<br>"; &lib'chat("<$num>は天使に<font color=\"red\">ターボ・バリヤー・追い越し禁止</font>にしてもらいました。"); $'user{"${num}_status"}=~s/[tbg]//g; $'user{"${num}_status"}.="tbg"; } $'user{"${num}_work"}.="a"; local($on,$lim); @specials=split(/\,/,$'user{'*special5'}); for($i=0; $i<=$#specials; $i++){ if($specials[$i]==$'user{"${num}_position"}){ $specials[$i]=&lib'getrandom; $on=&lib'getspecial($specials[$i]); $lim=0; while($on!=0 && $lim<10){ $specials[$i]=&lib'getrandom; $on=&lib'getspecial($specials[$i]); $lim++; } } } $'user{'*special5'}=join(',',@specials); }elsif($special==8){ local(@specials,$i,@items); @items = split(/\+\+/,$'user{"${num}_item"}); local($iname,$tmp,$myx,$myy,$prf); ($tmp,$myx,$myy,$prf) = &lib'getgraph($user{"${num}_position"}); if(@items >= $capacity){ #アイテムが満杯なら1000万あげる $'user{"${num}_money"} += 1000; $iname = "1000万円"; }elsif($'user{"${num}_car"} eq "+9+" && $'user{"${num}_item"} !~ /\+45\+/ && rand(1)<0.7){ #チャリンコで、交換権を既に持っていなければ、70%の確率で交換権をあげる $'user{"${num}_item"} .= "+45+"; ($iname) = &lib'getprice("+45+"); }elsif($'user{"${num}_money"} < 0 && $'user{"${num}_item"} !~ /\+58\+/ && rand(1)<0.8){ #金がマイナスで、平等権を既に持っていなければ、80%の確率で平等権をあげる $'user{"${num}_item"} .= "+58+"; ($iname) = &lib'getprice("+58+"); }elsif(&lib'getdistance($myx,$myy,$user{'*goal'}) >= 900 && $'user{"${num}_item"} !~ /\+55\+/ && rand(1)<0.6){ #目的地から900km以上離れていて、自由切符を既に持っていなければ、60%の確率で自由切符をあげる $'user{"${num}_item"} .= "+55+"; ($iname) = &lib'getprice("+55+"); }else{ #その他 local(@rnds); @rnds = (56,31,43,52,15); #爆弾DX、召集令状DX、差し押さえ令状、サイコロDX、睡眠薬DXの中からランダムに1つ選ぶ local($get) = $rnds[int(rand(@rnds))]; $'user{"${num}_item"} .= "+$get+"; ($iname) = &lib'getprice("+$get+"); } $'user{"${num}_alert"}.="配給車が$inameをくれました。<br>"; &lib'chat("<$num>は配給車に<font color=\"brown\">$iname</font>をもらいました。"); local($on,$lim); @specials=split(/\,/,$'user{'*special8'}); for($i=0; $i<=$#specials; $i++){ if($specials[$i]==$'user{"${num}_position"}){ $specials[$i]=&lib'getrandom; $on=&lib'getspecial($specials[$i]); $lim=0; while($on!=0 && $lim<10){ $specials[$i]=&lib'getrandom; $on=&lib'getspecial($specials[$i]); $lim++; } } } $'user{'*special8'}=join(',',@specials); } return; }

また、custom.cgiにはまだ変更点があります。その直後の、 sub movespecial { local(@specials,@others,$mv,@connection,$i,$j,$tmp); for($j=1; $j<=6; $j++){ @specials=split(/\,/,$'user{"*special$j"}); の部分です。これは特殊車両が動く処理ですが、6番までしか動かないようになっています。そこで、 sub movespecial { local(@specials,@others,$mv,@connection,$i,$j,$tmp); for($j=1; $j<=@lib'specialnum; $j++){ next if($j==7); @specials=split(/\,/,$'user{"*special$j"}); とします。実は、7番の通行止めは移動しないようにしているのですが、通行止めはもっと後ろで専用の処理があります。だから、ここでは移動しないようにしているのです。

表示部分の変更

最後に、表示部分、つまりmain.jsを変更します。 for(i=1; i<=7; i++){ for(j=0; j<user_special[i].length; j++){ if(offset["n" + user_special[i][j]] == undefined){ offset["n" + user_special[i][j]]=0; } layer.push("cars" + i + ".gif"); //alert(user_special[i][j]+" : "+graph[user_special[i][j]]); layer.push(graph[user_special[i][j]][1]-mx); layer.push(graph[user_special[i][j]][2]-my); layer.push(2*offset["n" + user_special[i][j]]); layer.push(8*(1+offset["n" + user_special[i][j]])); layer.push("javascript:alert('" + specialcar[i] + "はターゲットに設定できません。')"); layer.push(specialcar[i]); layer.push("\\n" + specialexp[i]); offset["n" + user_special[i][j]]++; } } これも、特殊車両が7番までしかない前提でかかれた処理です。これを for(i=1; i<specialcar.length; i++){ for(j=0; j<user_special[i].length; j++){ if(offset["n" + user_special[i][j]] == undefined){ offset["n" + user_special[i][j]]=0; } layer.push("cars" + i + ".gif"); //alert(user_special[i][j]+" : "+graph[user_special[i][j]]); layer.push(graph[user_special[i][j]][1]-mx); layer.push(graph[user_special[i][j]][2]-my); layer.push(2*offset["n" + user_special[i][j]]); layer.push(8*(1+offset["n" + user_special[i][j]])); layer.push("javascript:alert('" + specialcar[i] + "はターゲットに設定できません。')"); layer.push(specialcar[i]); layer.push("\\n" + specialexp[i]); offset["n" + user_special[i][j]]++; } } とします。さらに、、main.cgiprint"user_special=[null,"; for($i=1; $i<=7; $i++){ chop($user{"*special$i"}) while substr($user{"*special$i"},length($user{"*special$i"})-1,1) eq ','; print"[".$user{"*special$i"}."],"; } も同様に print"user_special=[null,"; for($i=1; $i<=@lib'specialnum; $i++){ chop($user{"*special$i"}) while substr($user{"*special$i"},length($user{"*special$i"})-1,1) eq ','; print"[".$user{"*special$i"}."],"; } とします。

これで、改造は終了です。ところで、画像はどうしましょう。imgフォルダ内の画像をみてみると、cars1.gifがパトカー、cars2.gifが当たり屋・・・のようになっています。したがって、配給車はcars8.gifということになります。

なんでもいいですが、僕は配給車という画像を用意しました。これは自由に使って構いませんが、できればもっといい画像を使いましょう。