UI/MagicScreen.razor
@using System;
@using Sandbox;
@using Sandbox.UI;
@* The magic shop: learn spells, or enchant your weapon. The wizard stands in the 3D shop. *@
<root class="screen">
<div class="bubble">@Speech</div>
<div class="parchment board">
<div class="slot-tabs">
<div class="tab @(Tab == 0 ? "active" : "")" onclick=@(() => { Tab = 0; speech = null; StateHasChanged(); })>spells</div>
<div class="tab @(Tab == 1 ? "active" : "")" onclick=@(() => { Tab = 1; speech = null; StateHasChanged(); })>enchant</div>
</div>
@if ( Tab == 0 )
{
<div class="heading">@($"Your magicka: {P.Magicka}")</div>
<div class="spells">
@foreach ( var sp in Catalog.Spells )
{
var s = sp;
bool known = P.Spells.Contains( (int)s.Id );
bool locked = !known && P.Magicka < s.MinMagicka;
<div class="spell @(known ? "known" : "") @(locked ? "locked" : "") @(PickedSpell == s.Id ? "picked" : "")" onclick=@(() => PickSpell( s ))>
<div class="icon" style="background-image: url('resources/sad/ss/ui/@(s.Icon).png')"></div>
<div class="name">@s.Name</div>
<div class="price">@(known ? "known" : $"{Gm.Price( s.Price )}g")</div>
</div>
}
</div>
@if ( PickedSpell.HasValue && !P.Spells.Contains( (int)PickedSpell.Value ) )
{
<div class="btn" onclick=@BuySpell>@($"learn for {Gm.Price( Catalog.SpellInfo( PickedSpell.Value ).Price )} gold")</div>
}
}
else
{
<div class="heading">Select enchant type</div>
<div class="choices">
@foreach ( var e in Types )
{
var type = e;
<div class="choice @(Type == type ? "picked" : "")" onclick=@(() => { Type = type; speech = null; StateHasChanged(); })>
<div class="icon" style="background-image: url('resources/sad/ss/ui/@(Catalog.EnchantIcon( type )).png')"></div>
<div class="name">@type</div>
</div>
}
</div>
<div class="heading">Select enchant potency</div>
<div class="choices">
@for ( int t = 1; t <= 3; t++ )
{
var tier = t;
<div class="choice tier @(Tier == tier ? "picked" : "")" onclick=@(() => { Tier = tier; speech = null; StateHasChanged(); })>
<div class="name big">@(new string( 'I', tier ))</div>
<div class="name">@(Catalog.EnchantTierName( tier ))</div>
</div>
}
</div>
<div class="summary">
<div class="line">@($"{Weapon.Name} ({Weapon.Min}-{Weapon.Max})")</div>
<div class="line">@CurrentText</div>
@if ( Type != Enchant.None && Tier > 0 )
{
<div class="line strong">@($"{Catalog.EnchantTierName( Tier )} enchant: +{Catalog.EnchantRange( Tier ).Min}-{Catalog.EnchantRange( Tier ).Max} {Type.ToString().ToLower()} damage")</div>
<div class="btn" onclick=@BuyEnchant>@($"enchant for {Gm.Price( Catalog.EnchantPrice( Tier ) )} gold")</div>
}
</div>
}
</div>
<div class="gold-bar"><div class="coin"></div>@P.Gold</div>
<div class="sas-round cross close" onclick=@(() => Gm.Go( GameScreen.Town ))><div class="mark"></div></div>
</root>
@code
{
static readonly Enchant[] Types = { Enchant.Bleed, Enchant.Poison, Enchant.Death, Enchant.Freeze };
GameManager Gm => GameManager.Instance;
Profile P => Profile.Current;
WeaponDef Weapon => Catalog.Weapons[P.Weapon];
int Tab;
Spell? PickedSpell;
Enchant Type = Enchant.None;
int Tier;
string speech;
string Speech
{
get => speech ?? (Tab == 0 ? "Magic, my friend. The more magicka in your head, the mightier the spells you can learn." : P.Weapon > 0 ? "Do you wish to enchant this weapon?" : "Bring me a weapon and I'll fill it with magic.");
set => speech = value;
}
string CurrentText
{
get
{
var e = P.EnchantFor( P.Weapon );
if ( e is null ) return "No enchantment yet.";
var (min, max) = Catalog.EnchantRange( e.Tier );
return $"Currently: {Catalog.EnchantTierName( e.Tier )} {e.Type.ToString().ToLower()} (+{min}-{max})";
}
}
void PickSpell( SpellDef s )
{
PickedSpell = s.Id;
Speech = $"{s.Name} ({s.Cost} magicka)\n{s.Help}" + (P.Magicka < s.MinMagicka ? $"\nNeeds {s.MinMagicka} magicka." : "");
StateHasChanged();
}
void BuySpell()
{
if ( !PickedSpell.HasValue ) return;
Speech = Gm.BuySpell( PickedSpell.Value );
StateHasChanged();
}
void BuyEnchant()
{
Speech = Gm.BuyEnchant( Type, Tier );
StateHasChanged();
}
protected override int BuildHash() => HashCode.Combine( Tab, PickedSpell, Type, Tier, speech, P?.Gold, P?.Weapon, HashCode.Combine( P?.Enchants.Count, P?.Spells.Count ) );
}