Move PlayerResources to Mods.Common.

This commit is contained in:
Paul Chote
2018-04-27 19:20:21 +00:00
committed by abcdefg30
parent d186ca38f7
commit da29250711
6 changed files with 5 additions and 4 deletions

View File

@@ -181,7 +181,6 @@
<Compile Include="Sync.cs" />
<Compile Include="TraitDictionary.cs" />
<Compile Include="Traits\LintAttributes.cs" />
<Compile Include="Traits\Player\PlayerResources.cs" />
<Compile Include="Traits\Player\Shroud.cs" />
<Compile Include="Traits\Selectable.cs" />
<Compile Include="Traits\Target.cs" />

View File

@@ -1,185 +0,0 @@
#region Copyright & License Information
/*
* Copyright 2007-2018 The OpenRA Developers (see AUTHORS)
* This file is part of OpenRA, which is free software. It is made
* available to you under the terms of the GNU General Public License
* as published by the Free Software Foundation, either version 3 of
* the License, or (at your option) any later version. For more
* information, see COPYING.
*/
#endregion
using System;
using System.Collections.Generic;
using System.Linq;
namespace OpenRA.Traits
{
public class PlayerResourcesInfo : ITraitInfo, ILobbyOptions
{
[Translate]
[Desc("Descriptive label for the starting cash option in the lobby.")]
public readonly string DefaultCashDropdownLabel = "Starting Cash";
[Translate]
[Desc("Tooltip description for the starting cash option in the lobby.")]
public readonly string DefaultCashDropdownDescription = "Change the amount of cash that players start with";
[Desc("Starting cash options that are available in the lobby options.")]
public readonly int[] SelectableCash = { 2500, 5000, 10000, 20000 };
[Desc("Default starting cash option: should be one of the SelectableCash options.")]
public readonly int DefaultCash = 5000;
[Desc("Force the DefaultCash option by disabling changes in the lobby.")]
public readonly bool DefaultCashDropdownLocked = false;
[Desc("Whether to display the DefaultCash option in the lobby.")]
public readonly bool DefaultCashDropdownVisible = true;
[Desc("Display order for the DefaultCash option.")]
public readonly int DefaultCashDropdownDisplayOrder = 0;
[Desc("Speech notification to play when the player does not have any funds.")]
public readonly string InsufficientFundsNotification = null;
[Desc("Delay (in ticks) during which warnings will be muted.")]
public readonly int InsufficientFundsNotificationDelay = 750;
IEnumerable<LobbyOption> ILobbyOptions.LobbyOptions(Ruleset rules)
{
var startingCash = SelectableCash.ToDictionary(c => c.ToString(), c => "$" + c.ToString());
if (startingCash.Any())
yield return new LobbyOption("startingcash", DefaultCashDropdownLabel, DefaultCashDropdownDescription, DefaultCashDropdownVisible, DefaultCashDropdownDisplayOrder,
new ReadOnlyDictionary<string, string>(startingCash), DefaultCash.ToString(), DefaultCashDropdownLocked);
}
public object Create(ActorInitializer init) { return new PlayerResources(init.Self, this); }
}
public class PlayerResources : ITick, ISync
{
readonly PlayerResourcesInfo info;
readonly Player owner;
public PlayerResources(Actor self, PlayerResourcesInfo info)
{
this.info = info;
owner = self.Owner;
var startingCash = self.World.LobbyInfo.GlobalSettings
.OptionOrDefault("startingcash", info.DefaultCash.ToString());
if (!int.TryParse(startingCash, out Cash))
Cash = info.DefaultCash;
}
[Sync] public int Cash;
[Sync] public int Resources;
[Sync] public int ResourceCapacity;
public int Earned;
public int Spent;
int lastNotificationTick;
public bool CanGiveResources(int amount)
{
return Resources + amount <= ResourceCapacity;
}
public void GiveResources(int num)
{
Resources += num;
Earned += num;
if (Resources > ResourceCapacity)
{
Earned -= Resources - ResourceCapacity;
Resources = ResourceCapacity;
}
}
public bool TakeResources(int num)
{
if (Resources < num) return false;
Resources -= num;
Spent += num;
return true;
}
public void GiveCash(int num)
{
if (Cash < int.MaxValue)
{
try
{
checked
{
Cash += num;
}
}
catch (OverflowException)
{
Cash = int.MaxValue;
}
}
if (Earned < int.MaxValue)
{
try
{
checked
{
Earned += num;
}
}
catch (OverflowException)
{
Earned = int.MaxValue;
}
}
}
public bool TakeCash(int num, bool notifyLowFunds = false)
{
if (Cash + Resources < num)
{
if (notifyLowFunds && !string.IsNullOrEmpty(info.InsufficientFundsNotification) &&
owner.World.WorldTick - lastNotificationTick >= info.InsufficientFundsNotificationDelay)
{
lastNotificationTick = owner.World.WorldTick;
Game.Sound.PlayNotification(owner.World.Map.Rules, owner, "Speech", info.InsufficientFundsNotification, owner.Faction.InternalName);
}
return false;
}
// Spend ore before cash
Resources -= num;
Spent += num;
if (Resources < 0)
{
Cash += Resources;
Resources = 0;
}
return true;
}
void ITick.Tick(Actor self)
{
// PERF: Avoid LINQ.
ResourceCapacity = 0;
foreach (var tp in self.World.ActorsWithTrait<IStoreResources>())
if (tp.Actor.Owner == owner)
ResourceCapacity += tp.Trait.Capacity;
if (Resources > ResourceCapacity)
Resources = ResourceCapacity;
}
}
}