예제 #1
0
 function doIslandProcess($hako, &$island)
 {
     global $init;
     // 導出値
     $name = $island['name'];
     $id = $island['id'];
     $land = $island['land'];
     $landValue = $island['landValue'];
     $presentItem = isset($island['present']['item']) ? $island['present']['item'] : 0;
     // 収入ログ
     if (isset($island['oilincome'])) {
         if ($island['oilincome'] > 0) {
             $this->log->oilMoney($id, $name, "海底油田", "", "総額{$island['oilincome']}{$init->unitMoney}");
         }
     }
     // 収入ログ
     if (isset($island['bank'])) {
         if ($island['bank'] > 0) {
             $value = (int) ($island['money'] * 0.005);
             $island['money'] += $value;
             $this->log->oilMoney($id, $name, "銀行", "", "総額{$value}{$init->unitMoney}");
         }
     }
     // 天気判定
     if (isset($island['tenki'])) {
         if ($island['tenki'] > 0) {
             $rnd = Util::random(100);
             if ($rnd < 5) {
                 $island['tenki'] = 5;
             } elseif ($rnd < 10) {
                 $island['tenki'] = 4;
             } elseif ($rnd < 15) {
                 $island['tenki'] = 3;
             } elseif ($rnd < 20) {
                 $island['tenki'] = 2;
             } else {
                 $island['tenki'] = 1;
             }
         } else {
             $island['tenki'] = 1;
         }
     }
     // 日照り判定
     if (isset($island['tenki'])) {
         if (Util::random(1000) < $init->disTenki && $island['tenki'] == 1) {
             // 日照り発生
             $this->log->Hideri($id, $name);
             for ($i = 0; $i < $init->pointNumber; $i++) {
                 $x = $this->rpx[$i];
                 $y = $this->rpy[$i];
                 $landKind = $land[$x][$y];
                 $lv = $landValue[$x][$y];
                 if ($landKind == $init->landTown && $landValue[$x][$y] > 100) {
                     // 人口が減る
                     $people = Util::random(2) + 1;
                     $landValue[$x][$y] -= $people;
                 }
             }
         }
     }
     // にわか雨判定
     if (isset($island['tenki'])) {
         if (Util::random(1000) < $init->disTenki && $island['tenki'] == 3) {
             // にわか雨発生
             $this->log->Niwakaame($id, $name);
             for ($i = 0; $i < $init->pointNumber; $i++) {
                 $x = $this->rpx[$i];
                 $y = $this->rpy[$i];
                 $landKind = $land[$x][$y];
                 $lv = $landValue[$x][$y];
                 if ($landKind == $init->landForest) {
                     // 木が増える
                     $tree = Util::random(5) + 1;
                     $landValue[$x][$y] += $tree;
                     if ($landValue[$x][$y] > 200) {
                         $landValue[$x][$y] = 200;
                     }
                 }
             }
         }
     }
     // 宝くじ判定
     if ($hako->islandTurn % $init->lottery == 0) {
         if (Util::random(500) < $island['lot'] && $island['lot'] > 0) {
             // 何等賞に当選するか?
             $syo = Util::random(2) + 1;
             $value = $init->lotmoney / $syo;
             $island['money'] += $value;
             $str = "{$value}{$init->unitMoney}";
             // 収入ログ
             $this->log->LotteryMoney($id, $name, $str, $syo);
         }
         // 宝くじの枚数リセット
         $island['lot'] = 0;
     }
     // 暴動判定
     $island['pop'] = $island['pop'] <= 0 ? 1 : $island['pop'];
     $unemployed = ($island['pop'] - ($island['farm'] + $island['factory'] + $island['commerce'] + $island['mountain'] + $island['hatuden']) * 10) / $island['pop'] * 100;
     if ($island['isBF'] != 1 && Util::random(1000) < $unemployed && $unemployed > $init->disPoo && $island['pop'] >= $init->disPooPop) {
         // 暴動発生
         $this->log->pooriot($id, $name);
         for ($i = 0; $i < $init->pointNumber; $i++) {
             $x = $this->rpx[$i];
             $y = $this->rpy[$i];
             $landKind = $land[$x][$y];
             $lv = $landValue[$x][$y];
             if ($landKind == $init->landTown || $landKind == $init->landSeaCity || $landKind == $init->landNewtown || $landKind == $init->landBigtown || $landKind == $init->landProcity || $landKind == $init->landFroCity) {
                 // 1/4で人口が減る
                 if (Util::random(4) == 0) {
                     $landValue[$x][$y] -= Util::random($unemployed);
                     if ($landValue[$x][$y] > 0) {
                         // 人口減
                         $this->log->riotDamage1($id, $name, $this->landName($landKind, $lv), "({$x}, {$y})");
                     } else {
                         // 壊滅
                         if ($landKind == $init->landSeaCity || $landKind == $init->landFroCity) {
                             $land[$x][$y] = $init->landSea;
                         } else {
                             $land[$x][$y] = $init->landWaste;
                         }
                         $landValue[$x][$y] = 0;
                         $this->log->riotDamage2($id, $name, $this->landName($landKind, $lv), "({$x}, {$y})");
                     }
                 }
             }
         }
     }
     // 地震判定
     $prepare2 = isset($island['prepare2']) ? (int) $island['prepare2'] : 0;
     if (Util::random(1000) < ($prepare2 + 1) * $init->disEarthquake - (int) ($island['eisei'][1] / 15) || $presentItem == 1) {
         // 地震発生
         $this->log->earthquake($id, $name);
         for ($i = 0; $i < $init->pointNumber; $i++) {
             $x = $this->rpx[$i];
             $y = $this->rpy[$i];
             $landKind = $land[$x][$y];
             $lv = $landValue[$x][$y];
             if ($landKind == $init->landTown && $lv >= 100 || $landKind == $init->landProcity && $lv < 130 || $landKind == $init->landSfarm && $lv < 20 || $landKind == $init->landFactory && $lv < 100 || $landKind == $init->landHatuden && $lv < 100 || $landKind == $init->landHaribote || $landKind == $init->landSeaResort || $landKind == $init->landSeaSide || $landKind == $init->landSeaCity || $landKind == $init->landFroCity) {
                 // 1/4で壊滅
                 if (Util::random(4) == 0) {
                     $this->log->eQDamage($id, $name, $this->landName($landKind, $lv), "({$x}, {$y})");
                     if ($landKind == $init->landSeaCity || $landKind == $init->landFroCity || $landKind == $init->landSfarm) {
                         $land[$x][$y] = $init->landSea;
                     } else {
                         $land[$x][$y] = $init->landWaste;
                     }
                     $landValue[$x][$y] = 0;
                 }
             }
             if ($landKind == $init->landBigtown && $lv >= 100 || $landKind == $init->landNewtown && $lv >= 100) {
                 // 1/3で壊滅
                 if (Util::random(3) == 0) {
                     $this->log->eQDamagenot($id, $name, $this->landName($landKind, $lv), "({$x}, {$y})");
                     $landValue[$x][$y] -= Util::random(100) + 50;
                 }
                 if ($landValue[$x][$y] <= 0) {
                     $land[$x][$y] = $init->landWaste;
                     $landValue[$x][$y] = 0;
                     $this->log->eQDamage($id, $name, $this->landName($landKind, $lv), "({$x}, {$y})");
                     continue;
                 }
             }
         }
     }
     // 食料不足
     if ($island['food'] <= 0) {
         // 不足メッセージ
         $this->log->starve($id, $name);
         $island['food'] = 0;
         for ($i = 0; $i < $init->pointNumber; $i++) {
             $x = $this->rpx[$i];
             $y = $this->rpy[$i];
             $landKind = $land[$x][$y];
             $lv = $landValue[$x][$y];
             if ($landKind == $init->landFarm || $landKind == $init->landSfarm || $landKind == $init->landFactory || $landKind == $init->landCommerce || $landKind == $init->landHatuden || $landKind == $init->landBase || $landKind == $init->landDefence) {
                 // 1/4で壊滅
                 if (Util::random(4) == 0) {
                     $this->log->svDamage($id, $name, $this->landName($landKind, $lv), "({$x}, {$y})");
                     $land[$x][$y] = $init->landWaste;
                     $landValue[$x][$y] = 0;
                     // でも養殖場なら浅瀬
                     if ($landKind == $init->landNursery) {
                         $land[$x][$y] = $init->landSea;
                         $landValue[$x][$y] = 1;
                     } elseif ($landKind == $init->landSfarm) {
                         $land[$x][$y] = $init->landSea;
                         $landValue[$x][$y] = 0;
                     }
                 }
             }
         }
     }
     // 座礁判定
     if (Util::random(1000) < $init->disRunAground1) {
         for ($i = 0; $i < $init->pointNumber; $i++) {
             $x = $this->rpx[$i];
             $y = $this->rpy[$i];
             $landKind = $land[$x][$y];
             $lv = $landValue[$x][$y];
             if ($landKind == $init->landShip && Util::random(1000) < $init->disRunAground2) {
                 $this->log->RunAground($id, $name, $this->landName($landKind, $lv), "({$x},{$y})");
                 $land[$x][$y] = $init->landSea;
                 $landValue[$x][$y] = 0;
             }
         }
     }
     // 海賊船判定
     $ownShip = 0;
     for ($i = 0; $i < 10; $i++) {
         $ownShip += $island['ship'][$i];
     }
     if (Util::random(1000) < $init->disViking * $ownShip) {
         // どこに現れるか決める
         for ($i = 0; $i < $init->pointNumber; $i++) {
             $x = $this->rpx[$i];
             $y = $this->rpy[$i];
             $landKind = $land[$x][$y];
             $lv = $landValue[$x][$y];
             if ($landKind == $init->landSea && $lv == 0) {
                 // 海賊船登場
                 $land[$x][$y] = $init->landShip;
                 $landValue[$x][$y] = Util::navyPack(0, 10, $init->shipHP[10], 0, 0);
                 $this->log->VikingCome($id, $name, "({$x},{$y})");
                 break;
             }
         }
     }
     // 電車判定
     if (Util::random(1000) < $init->disTrain && $island['stat'] >= 2 && $island['train'] < $island['stat'] && $island['pop'] >= 2000) {
         // どこに現れるか決める
         for ($i = 0; $i < $init->pointNumber; $i++) {
             $bx = $this->rpx[$i];
             $by = $this->rpy[$i];
             $landKind = $land[$bx][$by];
             $lv = $landValue[$bx][$by];
             if ($landKind == $init->landRail) {
                 // 電車登場
                 $land[$bx][$by] = $init->landTrain;
                 break;
             }
         }
     }
     // ぞらす判定
     if ($island['money'] >= 10000) {
         $smo = Util::random(800);
     } else {
         $smo = Util::random(1000);
     }
     if ($smo < $init->disZorasu && $island['taiji'] >= 50 && $island['pop'] >= 2000) {
         // どこに現れるか決める
         for ($i = 0; $i < $init->pointNumber; $i++) {
             $bx = $this->rpx[$i];
             $by = $this->rpy[$i];
             $landKind = $land[$bx][$by];
             $lv = $landValue[$bx][$by];
             if ($landKind == $init->landSea && $lv == 0) {
                 // ぞらす登場
                 $land[$bx][$by] = $init->landZorasu;
                 $landValue[$bx][$by] = Util::random(200);
                 $this->log->ZorasuCome($id, $name, "({$x},{$y})");
                 break;
             }
         }
     }
     // 津波判定
     if (Util::random(1000) < $init->disTsunami - (int) ($island['eisei'][1] / 15) || $presentItem == 2) {
         // 津波発生
         $this->log->tsunami($id, $name);
         for ($i = 0; $i < $init->pointNumber; $i++) {
             $x = $this->rpx[$i];
             $y = $this->rpy[$i];
             $landKind = $land[$x][$y];
             $lv = $landValue[$x][$y];
             if ($landKind == $init->landTown || $landKind == $init->landProcity && $lv < 110 || $landKind == $init->landNewtown || $landKind == $init->landBigtown || $landKind == $init->landFarm && $lv < 25 || $landKind == $init->landNursery || $landKind == $init->landFactory || $landKind == $init->landHatuden || $landKind == $init->landBase || $landKind == $init->landDefence || $landKind == $init->landSeaSide || $landKind == $init->landSeaResort || $landKind == $init->landPort || $landKind == $init->landShip || $landKind == $init->landHaribote) {
                 // 1d12 <= (周囲の海 - 1) で崩壊
                 if (Util::random(12) < Turn::countAround($land, $x, $y, 7, array($init->landOil, $init->landSbase, $init->landSea)) - 1) {
                     $this->log->tsunamiDamage($id, $name, $this->landName($landKind, $lv), "({$x}, {$y})");
                     if ($landKind == $init->landSeaSide || $landKind == $init->landNursery || $landKind == $init->landPort) {
                         //砂浜か養殖場か港なら浅瀬に
                         $land[$x][$y] = $init->landSea;
                         $landValue[$x][$y] = 1;
                     } elseif ($landKind == $init->landShip) {
                         //船なら水没、海に
                         $land[$x][$y] = $init->landSea;
                         $landValue[$x][$y] = 0;
                     } else {
                         $land[$x][$y] = $init->landWaste;
                         $landValue[$x][$y] = 0;
                     }
                 }
             }
         }
     }
     // 怪獣判定
     if ($island['isBF'] == 1) {
         $r = Util::random(500);
         $pop = $island['pop'];
     } else {
         $r = Util::random(10000);
         $pop = $island['pop'];
     }
     $isMons = $presentItem == 3 && $pop >= $init->disMonsBorder1;
     if (!isset($island['monstersend'])) {
         $island['monstersend'] = 0;
     }
     do {
         if ($r < $init->disMonster * $island['area'] && $pop >= $init->disMonsBorder1 || $isMons || $island['monstersend'] > 0) {
             // 怪獣出現
             // 種類を決める
             if ($island['monstersend'] > 0) {
                 // 人造
                 $kind = 0;
                 $island['monstersend']--;
             } elseif ($pop >= $init->disMonsBorder5) {
                 // level5まで
                 $kind = Util::random($init->monsterLevel5) + 1;
             } elseif ($pop >= $init->disMonsBorder4) {
                 // level4まで
                 $kind = Util::random($init->monsterLevel4) + 1;
             } elseif ($pop >= $init->disMonsBorder3) {
                 // level3まで
                 $kind = Util::random($init->monsterLevel3) + 1;
             } elseif ($pop >= $init->disMonsBorder2) {
                 // level2まで
                 $kind = Util::random($init->monsterLevel2) + 1;
             } else {
                 // level1のみ
                 $kind = Util::random($init->monsterLevel1) + 1;
             }
             // lvの値を決める
             $lv = $kind * 100 + $init->monsterBHP[$kind] + Util::random($init->monsterDHP[$kind]);
             // どこに現れるか決める
             for ($i = 0; $i < $init->pointNumber; $i++) {
                 $bx = $this->rpx[$i];
                 $by = $this->rpy[$i];
                 if ($land[$bx][$by] == $init->landTown || $land[$bx][$by] == $init->landBigtown || $land[$bx][$by] == $init->landNewtown) {
                     // 地形名
                     $lName = $this->landName($init->landTown, $landValue[$bx][$by]);
                     // そのヘックスを怪獣に
                     $land[$bx][$by] = $init->landMonster;
                     $landValue[$bx][$by] = $lv;
                     // 怪獣情報
                     $monsSpec = Util::monsterSpec($lv);
                     $mName = $monsSpec['name'];
                     // メッセージ
                     $this->log->monsCome($id, $name, $mName, "({$bx}, {$by})", $lName);
                     break;
                 }
             }
         }
     } while ($island['monstersend'] > 0);
     // 地盤沈下判定
     if ($island['area'] > $init->disFallBorder && (Util::random(1000) < $init->disFalldown && $island['isBF'] != 1 || $presentItem == 4)) {
         $this->log->falldown($id, $name);
         for ($i = 0; $i < $init->pointNumber; $i++) {
             $x = $this->rpx[$i];
             $y = $this->rpy[$i];
             $landKind = $land[$x][$y];
             $lv = $landValue[$x][$y];
             if ($landKind != $init->landSea && $landKind != $init->landSbase && $landKind != $init->landSdefence && $landKind != $init->landSfarm && $landKind != $init->landOil && $landKind != $init->landMountain) {
                 // 周囲に海があれば、値を-1に
                 if (Turn::countAround($land, $x, $y, 7, array($init->landSea, $init->landSbase))) {
                     $land[$x][$y] = -1;
                     $landValue[$x][$y] = 0;
                     $this->log->falldownLand($id, $name, $this->landName($landKind, $lv), "({$x}, {$y})");
                 }
             }
         }
         for ($i = 0; $i < $init->pointNumber; $i++) {
             $x = $this->rpx[$i];
             $y = $this->rpy[$i];
             $landKind = $land[$x][$y];
             if ($landKind == -1) {
                 // -1になっている所を浅瀬に
                 $land[$x][$y] = $init->landSea;
                 $landValue[$x][$y] = 1;
             } elseif ($landKind == $init->landSea) {
                 // 浅瀬は海に
                 $landValue[$x][$y] = 0;
             }
         }
     }
     // 台風判定
     if (Util::random(1000) < $init->disTyphoon - (int) ($island['eisei'][0] / 10) && ($island['tenki'] == 2 || $island['tenki'] == 3) || $presentItem == 5) {
         // 台風発生
         $this->log->typhoon($id, $name);
         for ($i = 0; $i < $init->pointNumber; $i++) {
             $x = $this->rpx[$i];
             $y = $this->rpy[$i];
             $landKind = $land[$x][$y];
             $lv = $landValue[$x][$y];
             if ($landKind == $init->landFarm && $lv < 25 || $landKind == $init->landSfarm && $lv < 20 || $landKind == $init->landNursery || $landKind == $init->landSeaSide || $landKind == $init->landHaribote) {
                 // 1d12 <= (6 - 周囲の森) で崩壊
                 if (Util::random(12) < 6 - Turn::countAround($land, $x, $y, 7, array($init->landForest, $init->landFusy, $init->landMonument))) {
                     $this->log->typhoonDamage($id, $name, $this->landName($landKind, $lv), "({$x}, {$y})");
                     if ($landKind == $init->landSeaSide || $landKind == $init->landNursery) {
                         //砂浜か養殖場ならは浅瀬
                         $land[$x][$y] = $init->landSea;
                         $landValue[$x][$y] = 1;
                     } elseif ($landKind == $init->landSfarm) {
                         $land[$x][$y] = $init->landSea;
                         $landValue[$x][$y] = 0;
                     } else {
                         //その他は平地に
                         $land[$x][$y] = $init->landPlains;
                         $landValue[$x][$y] = 0;
                     }
                 }
             }
         }
     }
     // 巨大隕石判定
     if (Util::random(1000) < $init->disHugeMeteo - (int) ($island['eisei'][2] / 50) && $island['id'] != 1 || $presentItem == 6) {
         // 落下
         if ($presentItem == 6) {
             $x = $island['present']['px'];
             $y = $island['present']['py'];
         } else {
             $x = Util::random($init->islandSize);
             $y = Util::random($init->islandSize);
         }
         $landKind = $land[$x][$y];
         $lv = $landValue[$x][$y];
         $point = "({$x}, {$y})";
         // メッセージ
         $this->log->hugeMeteo($id, $name, $point);
         // 広域被害ルーチン
         $this->wideDamage($id, $name, $land, $landValue, $x, $y);
     }
     // 巨大ミサイル判定
     if (isset($island['bigmissile'])) {
         while ($island['bigmissile'] > 0) {
             $island['bigmissile']--;
             // 家族の力
             for ($i = 0; $i < $init->pointNumber; $i++) {
                 $x = $this->rpx[$i];
                 $y = $this->rpy[$i];
                 $landKind = $land[$x][$y];
                 $lv = $landValue[$x][$y];
                 if ($landKind == $init->landMyhome && Util::random(100) < $lv * 10) {
                     // 自宅があったとき
                     $power = 1;
                     if ($lv > 1) {
                         // 家族が1人死ぬ
                         $landValue[$x][$y]--;
                         $this->log->kazokuPower($id, $name, "家族の力");
                         break;
                     } else {
                         // 全滅…
                         $land[$x][$y] = $init->landWaste;
                         $landValue[$x][$y] = 0;
                         $this->log->kazokuPower($id, $name, "独身の底力");
                         break;
                     }
                 }
             }
             if ($power != 1) {
                 // 落下
                 $x = Util::random($init->islandSize);
                 $y = Util::random($init->islandSize);
                 $landKind = $land[$x][$y];
                 $lv = $landValue[$x][$y];
                 $point = "({$x}, {$y})";
                 // メッセージ
                 $this->log->monDamage($id, $name, $point);
                 // 広域被害ルーチン
                 $this->wideDamage($id, $name, $land, $landValue, $x, $y);
             }
         }
     }
     // 隕石判定
     if (Util::random(1000) < $init->disMeteo - (int) ($island['eisei'][2] / 40) || $presentItem == 7) {
         $first = 1;
         while (Util::random(2) == 0 || $first == 1) {
             $first = 0;
             // 落下
             if ($presentItem == 7 && $first == 1) {
                 $x = $island['present']['px'];
                 $y = $island['present']['py'];
             } else {
                 $x = Util::random($init->islandSize);
                 $y = Util::random($init->islandSize);
             }
             $first = 0;
             $landKind = $land[$x][$y];
             $lv = $landValue[$x][$y];
             $point = "({$x}, {$y})";
             if ($landKind == $init->landSea && $lv == 0) {
                 // 海ポチャ
                 $this->log->meteoSea($id, $name, $this->landName($landKind, $lv), $point);
             } elseif ($landKind == $init->landMountain) {
                 // 山破壊
                 $this->log->meteoMountain($id, $name, $this->landName($landKind, $lv), $point);
                 $land[$x][$y] = $init->landWaste;
                 $landValue[$x][$y] = 0;
                 continue;
             } elseif ($landKind == $init->landSbase || $landKind == $init->landSfarm || $landKind == $init->landSeaCity || $landKind == $init->landFroCity || $landKind == $init->landSdefence) {
                 $this->log->meteoSbase($id, $name, $this->landName($landKind, $lv), $point);
             } elseif ($landKind == $init->landMonster || $landKind == $init->landSleeper) {
                 $this->log->meteoMonster($id, $name, $this->landName($landKind, $lv), $point);
             } elseif ($landKind == $init->landSea) {
                 // 浅瀬
                 $this->log->meteoSea1($id, $name, $this->landName($landKind, $lv), $point);
             } else {
                 $this->log->meteoNormal($id, $name, $this->landName($landKind, $lv), $point);
             }
             $land[$x][$y] = $init->landSea;
             $landValue[$x][$y] = 0;
         }
     }
     // 噴火判定
     if (Util::random(1000) < $init->disEruption - (int) ($island['eisei'][1] / 40) || $presentItem == 8) {
         if ($presentItem == 8) {
             $x = $island['present']['px'];
             $y = $island['present']['py'];
         } else {
             $x = Util::random($init->islandSize);
             $y = Util::random($init->islandSize);
         }
         $landKind = $land[$x][$y];
         $lv = $landValue[$x][$y];
         $point = "({$x}, {$y})";
         $this->log->eruption($id, $name, $this->landName($landKind, $lv), $point);
         $land[$x][$y] = $init->landMountain;
         $landValue[$x][$y] = 0;
         for ($i = 1; $i < 7; $i++) {
             $sx = $x + $init->ax[$i];
             $sy = $y + $init->ay[$i];
             // 行による位置調整
             if ($sy % 2 == 0 && $y % 2 == 1) {
                 $sx--;
             }
             $landKind = $land[$sx][$sy];
             $lv = $landValue[$sx][$sy];
             $point = "({$sx}, {$sy})";
             if ($sx < 0 || $sx >= $init->islandSize || $sy < 0 || $sy >= $init->islandSize) {
             } else {
                 // 範囲内の場合
                 $landKind = $land[$sx][$sy];
                 $lv = $landValue[$sx][$sy];
                 $point = "({$sx}, {$sy})";
                 if ($landKind == $init->landSea || $landKind == $init->landOil || $landKind == $init->landSeaCity || $landKind == $init->landFroCity || $landKind == $init->landSsyoubou || $landKind == $init->landSfarm || $landKind == $init->landSdefence || $landKind == $init->landSbase) {
                     // 海の場合
                     if ($lv == 1) {
                         // 浅瀬
                         $this->log->eruptionSea1($id, $name, $this->landName($landKind, $lv), $point);
                     } else {
                         $land[$sx][$sy] = $init->landSea;
                         $landValue[$sx][$sy] = 1;
                         $this->log->eruptionSea($id, $name, $this->landName($landKind, $lv), $point);
                         continue;
                     }
                 } elseif ($landKind == $init->landMountain || $landKind == $init->landMonster || $landKind == $init->landSleeper || $landKind == $init->landWaste) {
                     continue;
                 } else {
                     // それ以外の場合
                     $this->log->eruptionNormal($id, $name, $this->landName($landKind, $lv), $point);
                 }
                 $land[$sx][$sy] = $init->landWaste;
                 $landValue[$sx][$sy] = 0;
             }
         }
     }
     // 人工衛星エネルギー減少
     for ($i = 0; $i < 6; $i++) {
         if ($island['eisei'][$i]) {
             $island['eisei'][$i] -= Util::random(2);
             if ($island['eisei'][$i] < 1) {
                 $island['eisei'][$i] = 0;
                 $this->log->EiseiEnd($id, $name, $init->EiseiName[$i]);
             }
         }
     }
     // 変更された可能性のある変数を書き戻す
     $island['land'] = $land;
     $island['landValue'] = $landValue;
     $island['gold'] = $island['money'] - $island['oldMoney'];
     $island['rice'] = $island['food'] - $island['oldFood'];
     // 食料があふれてたら換金
     if ($island['food'] > $init->maxFood) {
         $island['money'] += round(($island['food'] - $init->maxFood) / 10);
         $island['food'] = $init->maxFood;
     }
     // 金があふれてたら切り捨て
     if ($island['money'] > $init->maxMoney) {
         $island['money'] = $init->maxMoney;
     }
     // 各種の値を計算
     Turn::estimate($hako, $island);
     // 繁栄、災難賞
     $pop = $island['pop'];
     $damage = $island['oldPop'] - $pop;
     $prize = $island['prize'];
     list($flags, $monsters, $turns) = explode(",", $prize, 3);
     $island['peop'] = $island['pop'] - $island['oldPop'];
     $island['pots'] = $island['point'] - $island['oldPoint'];
     // 繁栄賞
     if (!($flags & 1) && $pop >= 3000 * 100) {
         $flags |= 1;
         $this->log->prize($id, $name, $init->prizeName[1]);
     } elseif (!($flags & 2) && $pop >= 5000 * 100) {
         $flags |= 2;
         $this->log->prize($id, $name, $init->prizeName[2]);
     } elseif (!($flags & 4) && $pop >= 10000 * 100) {
         $flags |= 4;
         $this->log->prize($id, $name, $init->prizeName[3]);
     }
     // 災難賞
     if (!($flags & 64) && $damage >= 500 * 100) {
         $flags |= 64;
         $this->log->prize($id, $name, $init->prizeName[7]);
     } elseif (!($flags & 128) && $damage >= 1000 * 100) {
         $flags |= 128;
         $this->log->prize($id, $name, $init->prizeName[8]);
     } elseif (!($flags & 256) && $damage >= 2000 * 100) {
         $flags |= 256;
         $this->log->prize($id, $name, $init->prizeName[9]);
     }
     $island['prize'] = "{$flags},{$monsters},{$turns}";
 }
예제 #2
0
 function newIsland($hako, $data)
 {
     global $init;
     $log = new Log();
     if ($hako->islandNumber >= $init->maxIsland) {
         HakoError::newIslandFull();
         return;
     }
     if (empty($data['ISLANDNAME'])) {
         HakoError::newIslandNoName();
         return;
     }
     // 名前が正当化チェック
     if (preg_match("/[,?()<>\$]/", $data['ISLANDNAME']) || strcmp($data['ISLANDNAME'], "無人") == 0) {
         HakoError::newIslandBadName();
         return;
     }
     // 名前の重複チェック
     if (Util::nameToNumber($hako, $data['ISLANDNAME']) != -1) {
         HakoError::newIslandAlready();
         return;
     }
     // パスワードの存在判定
     if (empty($data['PASSWORD'])) {
         HakoError::newIslandNoPassword();
         return;
     }
     if (strcmp($data['PASSWORD'], $data['PASSWORD2']) != 0) {
         HakoError::wrongPassword();
         return;
     }
     // 新しい島の番号を決める
     $newNumber = $hako->islandNumber;
     $hako->islandNumber++;
     $hako->islandNumberNoBF++;
     $hako->islandNumberNoKP++;
     $island = $this->makeNewIsland();
     // 島の番号の使いまわし
     $safety = 0;
     while (isset($hako->idToNumber[$hako->islandNextID])) {
         $hako->islandNextID++;
         if ($hako->islandNextID > 250) {
             $hako->islandNextID = 1;
         }
         $safety++;
         if ($safety == 250) {
             break;
         }
     }
     // 各種の値を設定
     $island['name'] = htmlspecialchars($data['ISLANDNAME']);
     $island['owner'] = htmlspecialchars($data['OWNERNAME']);
     $island['id'] = $hako->islandNextID;
     $hako->islandNextID++;
     $island['starturn'] = $hako->islandTurn;
     $island['isBF'] = $island['keep'] = 0;
     $island['absent'] = $init->giveupTurn - 3;
     $island['comment'] = '(未登録)';
     $island['comment_turn'] = $hako->islandTurn;
     $island['password'] = Util::encode($data['PASSWORD']);
     $island['tenki'] = 1;
     $island['team'] = $island['shiai'] = $island['kachi'] = $island['make'] = $island['hikiwake'] = $island['kougeki'] = $island['bougyo'] = $island['tokuten'] = $island['shitten'] = 0;
     Turn::estimate($hako, $island);
     if ($hako->islandNumberBF > 0) {
         for ($i = 0; $i < $hako->islandNumberBF; $i++) {
             $hako->islands[$newNumber - $i] = $hako->islands[$newNumber - $i - 1];
         }
         $hako->islands[$newNumber - $hako->islandNumberBF] = $island;
     } else {
         $hako->islands[$newNumber] = $island;
     }
     $hako->writeIslandsFile($island['id']);
     $log->discover($island['id'], $island['name']);
     $htmlMap = new HtmlMap();
     $htmlMap->newIslandHead($island['name']);
     $htmlMap->islandInfo($island, $newNumber);
     $htmlMap->islandMap($hako, $island, 1, $data);
 }