158 lines
5.2 KiB
C#
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(' ', '-');
|
|
}
|
|
}
|
|
}
|