using System; using Config; using Godot; public partial class ShopItemSlot : Area2D, IInteractive, IOutline { private Label _name; private Label _price; private Sprite2D _icon; private ExcelConfig.ActivityBase _config; private uint _finalPrice; //是否买得起 private bool _flag = true; public bool ShowOutline { get; set; } = true; public Color OutlineColor { get => _blendShaderMaterial == null ? Colors.Black : _blendShaderMaterial.GetShaderParameter(ShaderParamNames.OutlineColor).AsColor(); set => _blendShaderMaterial?.SetShaderParameter(ShaderParamNames.OutlineColor, value); } public bool IsDestroyed { get; private set; } private ShaderMaterial _blendShaderMaterial; public void InitItem(ExcelConfig.ActivityBase config) { _price = GetNode<Label>("Price"); _name = GetNode<Label>("NameLabel"); _icon = GetNode<Sprite2D>("Icon"); _name.Visible = false; _blendShaderMaterial = _icon.Material as ShaderMaterial; _config = config; _name.Text = config.Name; _finalPrice = config.Price; _price.Text = _finalPrice.ToString(); _icon.Texture = ResourceManager.LoadTexture2D(config.Icon); } public override void _Process(double delta) { var player = World.Current.Player; if (player != null) { if (_flag && player.RoleState.Gold < _finalPrice) //买不起 { _flag = false; _price.Modulate = Colors.Red; } else if (!_flag && player.RoleState.Gold >= _finalPrice) //买得起 { _flag = true; _price.Modulate = Colors.White; } } } public CheckInteractiveResult CheckInteractive(ActivityObject master) { return new CheckInteractiveResult(this, _config != null && master is Role); } public void Interactive(ActivityObject master) { var role = (Role)master; if (role.RoleState.Gold < _finalPrice) { return; } Monitorable = false; Visible = false; role.UseGold((int)_finalPrice); var item = ActivityObject.Create(_config); if (item is Weapon weapon) { if (!role.PickUpWeapon(weapon)) { role.ThrowWeapon(); role.PickUpWeapon(weapon); } } else if (item is ActiveProp activeProp) { if (!role.PickUpActiveProp(activeProp)) { role.ThrowActiveProp(); role.PickUpActiveProp(activeProp); } } else if (item is BuffProp buffProp) { role.PickUpBuffProp(buffProp); } else { throw new Exception("商店中购买到不支持的物体: " + _config.Id); } _config = null; } public virtual void OnTargetEnterd(ActivityObject target) { _name.Visible = true; OutlineColor = Colors.White; } public virtual void OnTargetExitd(ActivityObject target) { _name.Visible = false; OutlineColor = Colors.Black; } public void Destroy() { if (IsDestroyed) return; IsDestroyed = true; QueueFree(); } }