/// <summary> /// 車両開発 /// </summary> /// <param name="name"></param> /// <param name="bestSpeed"></param> /// <param name="power"></param> /// <param name="gauge"></param> /// <param name="seat"></param> /// <param name="tilt"></param> public void DevelopVehicle(string name, int bestSpeed, PowerEnum power, CarGaugeEnum gauge, SeatEnum seat, CarTiltEnum tilt) { (bool can, _) = CheckCreateVehicle(name, bestSpeed, power, gauge, seat, tilt); if (!can) { throw new InvalidOperationException("車両を開発可能な技術が揃っていません"); } SpendMoney(CalcDevelopVehicleCost(bestSpeed, power, gauge, seat, tilt)); vehicles.Add(new Car { Name = name, bestSpeed = bestSpeed, power = power, gauge = gauge, seat = seat, carTilt = tilt, type = power == PowerEnum.LinearMotor ? RailTypeEnum.LinearMotor : RailTypeEnum.Iron, money = CalcPurchaseVehicleCost(bestSpeed, power, gauge, seat, tilt), }); }
/// <summary> /// 指定の車両が開発可能か /// </summary> /// <returns>開発可否 メッセージ</returns> public (bool CanCreateVehicle, string msg) CheckCreateVehicle(string Name, int BestSpeed, PowerEnum Power, CarGaugeEnum Gauge, SeatEnum Seat, CarTiltEnum tilt) { if (string.IsNullOrWhiteSpace(Name)) { return(false, "名無しの権兵衛です"); } if (Power == PowerEnum.LinearMotor) { if (genkaiLinear == 0) { return(false, "リニアは作れません"); } else if (BestSpeed > genkaiLinear) { return(false, "速すぎます"); } } if (Gauge == CarGaugeEnum.FreeGauge && !isDevelopedFreeGauge) { return(false, "フリーゲージは作れません"); } if (Power == PowerEnum.Steam) { if (!IsSteamAvailable()) { return(false, "時代遅れです"); } if (BestSpeed > genkaiJoki) { return(false, "速すぎます"); } } if (Power == PowerEnum.Electricity) { if (genkaiDenki == 0) { return(false, "電車は作れません"); } else if (BestSpeed > genkaiDenki) { return(false, "速すぎます"); } } if (Power == PowerEnum.Diesel) { if (genkaiKidosha == 0) { return(false, "ディーゼルは作れません"); } else if (BestSpeed > genkaiKidosha) { return(false, "速すぎます"); } } if (Seat == SeatEnum.Dual && !isDevelopedDualSeat) { return(false, "デュアル不可"); } if (Seat == SeatEnum.Convertible && !isDevelopedConvertibleCross) { return(false, "転換式クロス不可"); } if (Seat == SeatEnum.RetructableLong && !isDevelopedRetructableLong) { return(false, "収納式ロング不可"); } if (Seat == SeatEnum.Rich && !isDevelopedRichCross) { return(false, "豪華クロス不可"); } if (Seat == SeatEnum.DoubleDeckerRich && !isDevelopedRichCross) { return(false, "豪華クロス不可"); } switch (tilt) { case CarTiltEnum.Pendulum: if (!isDevelopedCarTiltPendulum) { return(false, "振り子式車体傾斜装置は未開発"); } break; case CarTiltEnum.SimpleMecha: case CarTiltEnum.HighMecha: if (!isDevelopedMachineTilt) { return(false, "機械式式車体傾斜装置は未開発"); } break; } return(true, ""); }
/// <summary> /// 車両購入コスト計算 /// </summary> /// <param name="bestSpeed"></param> /// <param name="power"></param> /// <param name="gauge"></param> /// <param name="seat"></param> /// <param name="tilt"></param> /// <param name="genkaiLinear"></param> /// <param name="genkaiJoki"></param> /// <param name="genkaiDenki"></param> /// <param name="genkaiKidosha"></param> /// <returns></returns> public static int CalcPurchaseCarCost(int bestSpeed, PowerEnum power, CarGaugeEnum gauge, SeatEnum seat, CarTiltEnum tilt, int genkaiLinear, int genkaiJoki, int genkaiDenki, int genkaiKidosha) { // 8*速度^2 int cost = 8 * bestSpeed * bestSpeed; if (power == PowerEnum.LinearMotor) { cost = cost * 6 / 5 / genkaiLinear; } //リニア else { if (gauge == CarGaugeEnum.Regular || gauge == CarGaugeEnum.FreeGauge) { cost = cost * 3 / 2; } //標準軌orフリーゲージ if (power == PowerEnum.Steam) { cost = cost * 6 / 5 / genkaiJoki; } //蒸気 if (power == PowerEnum.Electricity) { cost /= genkaiDenki; } //電車 if (power == PowerEnum.Diesel) { cost /= genkaiKidosha; } //ディーゼル } switch (tilt) { case CarTiltEnum.Pendulum: cost = cost * 6 / 5; break; case CarTiltEnum.SimpleMecha: cost = cost * 11 / 10; break; case CarTiltEnum.HighMecha: cost = cost * 6 / 5; break; } cost += 500; //シート別 switch (seat) { case SeatEnum.None: case SeatEnum.Dual: cost += 100; break; case SeatEnum.RetructableLong: cost += 50; break; case SeatEnum.Long: case SeatEnum.Semi: case SeatEnum.Convertible: cost += 150; break; case SeatEnum.DoubleDeckerRotatable: case SeatEnum.DoubleDeckerRich: cost = cost * 4 / 3; break; } return(cost); }