Files
spacetrader/source/SpaceTraderSource201/Commander.cs
T

400 lines
9.4 KiB
C#

/*******************************************************************************
*
* Space Trader for Windows 2.00
*
* Copyright (C) 2005 Jay French, All Rights Reserved
*
* Additional coding by David Pierron
* Original coding by Pieter Spronck, Sam Anderson, Samuel Goldstein, Matt Lee
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
* Software Foundation; either version 2 of the License, or (at your option) any
* later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
*
* If you'd like a copy of the GNU General Public License, go to
* http://www.gnu.org/copyleft/gpl.html.
*
* You can contact the author at spacetrader@frenchfryz.com
*
******************************************************************************/
using System;
using System.Collections;
using System.Windows.Forms;
namespace Fryz.Apps.SpaceTrader
{
public class Commander : CrewMember
{
#region Member Declarations
private int _cash = 1000;
private int _debt = 0;
private int _killsPirate = 0;
private int _killsPolice = 0;
private int _killsTrader = 0;
private int _policeRecordScore = 0;
private int _reputationScore = 0;
private int _days = 0;
private bool _insurance = false;
private int _noclaim = 0;
private Ship _ship = new Ship(ShipType.Gnat);
private int[] _priceCargo = new int[10]; // Total price paid for trade goods
#endregion
#region Methods
public Commander(CrewMember baseCrewMember): base(baseCrewMember)
{
// Start off with a crew of only the commander and a Pulse Laser.
Ship.Crew[0] = this;
Ship.AddEquipment(Consts.Weapons[(int)WeaponType.PulseLaser]);
}
public Commander(Hashtable hash): base(hash)
{
_cash = (int)GetValueFromHash(hash, "_cash", _cash);
_debt = (int)GetValueFromHash(hash, "_debt", _debt);
_killsPirate = (int)GetValueFromHash(hash, "_killsPirate", _killsPirate);
_killsPolice = (int)GetValueFromHash(hash, "_killsPolice", _killsPolice);
_killsTrader = (int)GetValueFromHash(hash, "_killsTrader", _killsTrader);
_policeRecordScore = (int)GetValueFromHash(hash, "_policeRecordScore", _policeRecordScore);
_reputationScore = (int)GetValueFromHash(hash, "_reputationScore", _reputationScore);
_days = (int)GetValueFromHash(hash, "_days", _days);
_insurance = (bool)GetValueFromHash(hash, "_insurance", _insurance);
_noclaim = (int)GetValueFromHash(hash, "_noclaim", _noclaim);
_ship = new Ship((Hashtable)GetValueFromHash(hash, "_ship", _ship));
_priceCargo = (int[])GetValueFromHash(hash, "_priceCargo", _priceCargo);
Game.CurrentGame.Mercenaries[(int)CrewMemberId.Commander] = this;
Strings.CrewMemberNames[(int)CrewMemberId.Commander] = (string)GetValueFromHash(hash, "_name",
Strings.CrewMemberNames[(int)CrewMemberId.Commander]);
}
public void PayInterest()
{
if (Debt > 0)
{
int interest = Math.Max(1, (int)(Debt * Consts.IntRate));
if (Cash > interest)
Cash -= interest;
else
{
Debt += (interest - Cash);
Cash = 0;
}
}
}
public override Hashtable Serialize()
{
Hashtable hash = base.Serialize();
hash.Add("_cash", _cash);
hash.Add("_debt", _debt);
hash.Add("_killsPirate", _killsPirate);
hash.Add("_killsPolice", _killsPolice);
hash.Add("_killsTrader", _killsTrader);
hash.Add("_policeRecordScore", _policeRecordScore);
hash.Add("_reputationScore", _reputationScore);
hash.Add("_days", _days);
hash.Add("_insurance", _insurance);
hash.Add("_noclaim", _noclaim);
hash.Add("_ship", _ship.Serialize());
hash.Add("_priceCargo", _priceCargo);
hash.Add("_name", Name);
return hash;
}
public bool TradeShip(ShipSpec specToBuy, int netPrice, IWin32Window owner)
{
return TradeShip(specToBuy, netPrice, specToBuy.Name, owner);
}
public bool TradeShip(ShipSpec specToBuy, int netPrice, string newShipName, IWin32Window owner)
{
bool traded = false;
if (netPrice > 0 && Debt > 0)
FormAlert.Alert(AlertType.DebtNoBuy, owner);
else if (netPrice > CashToSpend)
FormAlert.Alert(AlertType.ShipBuyIF, owner);
else if (specToBuy.CrewQuarters < Ship.SpecialCrew.Length)
{
string passengers = Ship.SpecialCrew[1].Name;
if (Ship.SpecialCrew.Length > 2)
passengers += " and " + Ship.SpecialCrew[2].Name;
FormAlert.Alert(AlertType.ShipBuyPassengerQuarters, owner, passengers);
}
else if (specToBuy.CrewQuarters < Ship.CrewCount)
FormAlert.Alert(AlertType.ShipBuyCrewQuarters, owner);
else if (Ship.ReactorOnBoard)
FormAlert.Alert(AlertType.ShipBuyReactor, owner);
else
{
Equipment[] special = new Equipment[]
{
Consts.Weapons[(int)WeaponType.MorgansLaser],
Consts.Weapons[(int)WeaponType.QuantumDistruptor],
Consts.Shields[(int)ShieldType.Lightning],
Consts.Gadgets[(int)GadgetType.FuelCompactor],
Consts.Gadgets[(int)GadgetType.HiddenCargoBays]
};
bool[] add = new bool[special.Length];
bool addPod = false;
int extraCost = 0;
for (int i = 0; i < special.Length; i++)
{
if (Ship.HasEquipment(special[i]))
{
if (specToBuy.Slots(special[i].EquipmentType) == 0)
FormAlert.Alert(AlertType.ShipBuyNoSlots, owner, newShipName, special[i].Name,
Strings.EquipmentTypes[(int)special[i].EquipmentType]);
else
{
extraCost += special[i].TransferPrice;
add[i] = true;
}
}
}
if (Ship.EscapePod)
{
addPod = true;
extraCost += Consts.PodTransferCost;
}
if (netPrice + extraCost > CashToSpend)
FormAlert.Alert(AlertType.ShipBuyIFTransfer, owner);
extraCost = 0;
for (int i = 0; i < special.Length; i++)
{
if (add[i])
{
if (netPrice + extraCost + special[i].TransferPrice > CashToSpend)
FormAlert.Alert(AlertType.ShipBuyNoTransfer, owner, special[i].Name);
else if (FormAlert.Alert(AlertType.ShipBuyTransfer, owner, special[i].Name, special[i].Name.ToLower(),
Functions.FormatNumber(special[i].TransferPrice)) == DialogResult.Yes)
extraCost += special[i].TransferPrice;
else
add[i] = false;
}
}
if (addPod)
{
if (netPrice + extraCost + Consts.PodTransferCost > CashToSpend)
FormAlert.Alert(AlertType.ShipBuyNoTransfer, owner, Strings.ShipInfoEscapePod);
else if (FormAlert.Alert(AlertType.ShipBuyTransfer, owner, Strings.ShipInfoEscapePod,
Strings.ShipInfoEscapePod.ToLower(), Functions.FormatNumber(Consts.PodTransferCost)) == DialogResult.Yes)
extraCost += Consts.PodTransferCost;
else
addPod = false;
}
if (FormAlert.Alert(AlertType.ShipBuyConfirm, owner, Ship.Name, newShipName,
(add[0] || add[1] || add[2] || addPod ? Strings.ShipBuyTransfer : "")) == DialogResult.Yes)
{
CrewMember[] oldCrew = Ship.Crew;
Ship = new Ship(specToBuy.Type);
Cash -= (netPrice + extraCost);
for (int i = 0; i < Math.Min(oldCrew.Length, Ship.Crew.Length); i++)
Ship.Crew[i] = oldCrew[i];
for (int i = 0; i < special.Length; i++)
{
if (add[i])
Ship.AddEquipment(special[i]);
}
if (addPod)
Ship.EscapePod = true;
else if (Insurance)
{
Insurance = false;
NoClaim = 0;
}
traded = true;
}
}
return traded;
}
#endregion
#region Properties
public int Cash
{
get
{
return _cash;
}
set
{
_cash = value;
}
}
public int CashToSpend
{
get
{
return _cash - (Game.CurrentGame.Options.ReserveMoney ? Game.CurrentGame.CurrentCosts : 0);
}
}
public int Days
{
get
{
return _days;
}
set
{
_days = value;
}
}
public int Debt
{
get
{
return _debt;
}
set
{
_debt = value;
}
}
public bool Insurance
{
get
{
return _insurance;
}
set
{
_insurance = value;
}
}
public int KillsPirate
{
get
{
return _killsPirate;
}
set
{
_killsPirate = value;
}
}
public int KillsPolice
{
get
{
return _killsPolice;
}
set
{
_killsPolice = value;
}
}
public int KillsTrader
{
get
{
return _killsTrader;
}
set
{
_killsTrader = value;
}
}
public int NoClaim
{
get
{
return _noclaim;
}
set
{
_noclaim = Math.Max(0, Math.Min(Consts.MaxNoClaim, value));
}
}
public int PoliceRecordScore
{
get
{
return _policeRecordScore;
}
set
{
_policeRecordScore = value;
}
}
public int[] PriceCargo
{
get
{
return _priceCargo;
}
}
public int ReputationScore
{
get
{
return _reputationScore;
}
set
{
_reputationScore = value;
}
}
public Ship Ship
{
get
{
return _ship;
}
set
{
_ship = value;
}
}
public int Worth
{
get
{
return Ship.Price + _cash - _debt + (Game.CurrentGame.QuestStatusMoon > 0 ? SpecialEvent.MoonCost : 0);
}
}
#endregion
}
}