Files

158 lines
5.2 KiB
C#

using KernelPanic.Combat;
using KernelPanic.Data;
namespace KernelPanic.Run
{
public enum RepositoryOfferKind
{
NewCard,
CardUpgrade,
StatUpgrade
}
public enum CardUpgradeKind
{
CostDown,
MagnitudeUp,
DrawRider
}
public enum RunStatUpgradeKind
{
MaxCycles,
MaxUptime,
Heal,
Ram
}
public sealed class RepositoryOffer
{
private RepositoryOffer(
RepositoryOfferKind kind,
string commandName,
string displayName,
string description,
int price)
{
Kind = kind;
CommandName = commandName;
DisplayName = displayName;
Description = description;
Price = price;
}
public RepositoryOfferKind Kind { get; }
public string CommandName { get; }
public string DisplayName { get; }
public string Description { get; }
public int Price { get; }
public CardDefinition CardDefinition { get; private set; }
public CardInstance TargetCard { get; private set; }
public CardUpgradeKind CardUpgradeKind { get; private set; }
public RunStatUpgradeKind StatUpgradeKind { get; private set; }
public bool Sold { get; private set; }
public static RepositoryOffer NewCard(CardDefinition card, int price)
{
string name = DisplayNameFor(card);
RepositoryOffer offer = new(RepositoryOfferKind.NewCard, SafeCommandName(card?.Id, name), name, RulesTextFor(card), price)
{
CardDefinition = card
};
return offer;
}
public static RepositoryOffer CardUpgrade(CardInstance target, CardUpgradeKind upgradeKind, int price)
{
string cardName = DisplayNameFor(target?.Definition);
string description = UpgradeDescription(target, upgradeKind);
RepositoryOffer offer = new(RepositoryOfferKind.CardUpgrade, SafeCommandName(target?.Definition?.Id, cardName), $"upgrade {cardName}", description, price)
{
TargetCard = target,
CardUpgradeKind = upgradeKind
};
return offer;
}
public static RepositoryOffer StatUpgrade(RunStatUpgradeKind upgradeKind, int price)
{
return new RepositoryOffer(RepositoryOfferKind.StatUpgrade, upgradeKind.ToString().ToLowerInvariant(), StatName(upgradeKind), StatDescription(upgradeKind), price)
{
StatUpgradeKind = upgradeKind
};
}
public void MarkSold()
{
Sold = true;
}
private static string RulesTextFor(CardDefinition card)
{
if (card == null)
{
return "--";
}
CardInstance preview = new(card);
return CardEffectFactory.GetRulesText(preview);
}
private static string UpgradeDescription(CardInstance target, CardUpgradeKind upgradeKind)
{
if (target?.Definition == null)
{
return "--";
}
return upgradeKind switch
{
CardUpgradeKind.CostDown => $"cost {CombatManager.GetCardCost(target)} -> {UnityEngine.Mathf.Max(0, CombatManager.GetCardCost(target) - 1)}",
CardUpgradeKind.MagnitudeUp => $"effect magnitude +{CombatTuning.UpgradeMagnitudeBonus}",
CardUpgradeKind.DrawRider => "add rider: draw 1 after resolving",
_ => "--"
};
}
private static string StatName(RunStatUpgradeKind upgradeKind)
{
return upgradeKind switch
{
RunStatUpgradeKind.MaxCycles => "+1 max cycles",
RunStatUpgradeKind.MaxUptime => "+max uptime",
RunStatUpgradeKind.Heal => "heal uptime",
RunStatUpgradeKind.Ram => "+1 RAM",
_ => upgradeKind.ToString()
};
}
private static string StatDescription(RunStatUpgradeKind upgradeKind)
{
return upgradeKind switch
{
RunStatUpgradeKind.MaxCycles => $"+{CombatTuning.StatUpgradeMaxCycles} max cycles this run",
RunStatUpgradeKind.MaxUptime => $"+{CombatTuning.StatUpgradeMaxUptimePercent}% max uptime this run",
RunStatUpgradeKind.Heal => $"heal {CombatTuning.StatUpgradeHealPercent}% max uptime now",
RunStatUpgradeKind.Ram => $"+{CombatTuning.StatUpgradeRam} RAM this run",
_ => "--"
};
}
private static string DisplayNameFor(CardDefinition card)
{
if (card == null)
{
return "--";
}
return string.IsNullOrWhiteSpace(card.DisplayName) ? card.Id : card.DisplayName;
}
private static string SafeCommandName(string id, string fallback)
{
string value = string.IsNullOrWhiteSpace(id) ? fallback : id;
return string.IsNullOrWhiteSpace(value) ? "package" : value.Replace(' ', '-');
}
}
}