hakoniwaRAの改造 | |
---|---|
対象プログラム | hakoniwaRA ver030314 |
内容 | 電車の動く処理を一元化する |
説明 | 電車の動く処理を変えました、配布されているものに比べ大分短くすることが可能です。 また、処理を少し加えるだけで新しい電車も追加できます。 配布されているものでは、電車一つ一つに対して、 動ける方向を決める→移動予定先の地形が線路&地形の値が相応しいか→相応しかったら電車移動 という処理でしたが、ここでは、電車があればとにかく動ける方向を決める→ →移動予定先が線路&移動予定先からも移動元に動けるか判定→動けるようだったら動かす という処理に変わっています。 この改造は本家、情報交換掲示板、No.5434のnul様の記事を参考にさせて頂きました。 一応、動作は確認しておりますが、なにか不具合があるかも知れませんので、 そのようなことがあれば報告よろしくお願い致します。 |
日付 | 2006/3/16 |
作者 | 片翼の天使 |
履歴 | ― |
}
} elsif($landKind == $HlandTrain) {
# 電車
if(($lv >= 10) && ($lv <= 29)){
my($Ttype) = int($lv/10); # 列車の種類を判断
my($Tkind) = $lv % 10; # 線路の種類を判断
my(@tdire) = Tmoveline($Tkind); # 動ける方向を洗い出す
my($mline);
# 動く方向を決定する
if($tdire[0] == 0){
# 動ける方向は2方向のみ
if(random(2) == 0){
$mline = $tdire[1];
} else{
$mline = $tdire[2];
}
} else{
# 動ける方向は3方向
my($pro);
$pro = random(3);
if($pro == 1){
$mline = $tdire[0];
} elsif($pro == 2){
$mline = $tdire[1];
} else{
$mline = $tdire[2];
}
}
$sx = $x + $ax[$mline];
$sy = $y + $ay[$mline];
# 行による位置調整
if((($sy % 2) == 0) && (($y % 2) == 1)) {
$sx--;
}
# 範囲外判定
if(($sx < 0) || ($sx >= $HislandSize) ||
($sy < 0) || ($sy >= $HislandSize)) {
next;
}
my($sl) = $land->[$sx][$sy];
my($slv) = $landValue->[$sx][$sy];
if(($land->[$sx][$sy] == $HlandTrain) && ($slv >= 0) && ($slv <= 9)){
my($i);
my(@stdire) = Tmoveline($slv);
foreach $i (@stdire){
# 移動予定先から移動元地形に動けるかチェック
if(($i - $mline == 3)||($i - $mline == -3)){
# 動けるようだったら電車を動かす
$landValue->[$sx][$sy] += $Ttype*10;
$landValue->[$x][$y] -= $Ttype*10;
if($Ttype == 1){
$island->{'money'} += 1000;
$island->{'trainmoney'} += 1000;
$island->{'shouhi'} += 100;
} elsif($Ttype == 2){
$island->{'money'} += 500;
$island->{'trainmoney2'} += 500;
$island->{'shouhi'} += 10;
}
if($island->{'sabun'} < 0) {
$landValue->[$sx][$sy] -= $Ttype*10;
if($Ttype == 1){
logStarve3($id, $name, "普通列車", "($sx, $sy)");
} elsif($Ttype == 2){
logStarve3($id, $name, "貨物列車", "($sx, $sy)");
}
}
last;
}
}
}
}
} elsif($landKind == $HlandKura) {
$seq = int($lv/100);
return $count;
}
sub Tmoveline{
# (0,なし 1,右上 2,右 3,右下 4,左下 5,左 6,左上)
my($tkind) = @_;
my(@dire1) = (0, 0, 0, 0, 0, 0, 1, 2, 0, 0);
my(@dire2) = (2, 2, 1, 3, 2, 2, 3, 4, 4, 2);
my(@dire3) = (5, 5, 5, 5, 6, 4, 5, 6, 5, 3);
return ($dire1[$tkind] , $dire2[$tkind] , $dire3[$tkind]);
}
# 0から(n - 1)までの数字が一回づつ出てくる数列を作る
sub randomArray {
my($n) = @_;