Files
2026-07-09 21:33:33 +02:00

114 lines
4.9 KiB
C#

using System;
using VOID.Generic.Objects.Unit.Actions;
using VOID.Generic.Objects.Usable;
using VOID.Generic.Player.Input;
using VOID.Generic.Player.Util;
using VOID.UserInterface.Game;
namespace VOID.Generic.Player.CursorOperation
{
public class OnUsableCursorOperation : AbstractCursorOperation
{
public override Type ForType() => typeof(UsableObject);
public override bool Check(SelectUtilResult select)
{
return select.selectObject is UsableObject;
}
public override void DoDefault(SelectUtilResult select, bool isAlternate)
{
if (isAlternate) return;
var usable = (UsableObject)select.selectObject;
var activeUnit = PlayerController.current.activeUnit;
var carrier = usable.itemState.carriedBy;
var attackAbility = activeUnit.unitAbilityBook.attackAbility;
activeUnit.OrderStop();
if (activeUnit.unitData.canAttack && PlayerInputManager.current.isForceAttack)
{
// Player forced attack action
activeUnit.Order(new MoveAction(activeUnit, select.position, attackAbility.range));
activeUnit.Order(new AbilityAction(activeUnit, attackAbility, select.position));
}
else if (activeUnit.unitData.canTake && usable.itemData.canBePicked && usable.itemData.canBeMoved && (carrier == null || carrier.basicState.isDead))
{
// Default operation is TAKE (+ move closer if needed)
activeUnit.Order(new MoveAction(activeUnit, usable.transform.position, activeUnit.unitData.takeRange));
activeUnit.Order(new TakeAction(activeUnit, usable));
}
else if(activeUnit.unitData.canUse)
{
// If can't be taken then... USE (+ move closer if needed)
activeUnit.Order(new MoveAction(activeUnit, usable.transform.position, activeUnit.unitData.useRange));
activeUnit.Order(new UseAction(activeUnit, usable));
}
}
public override void DoContext(SelectUtilResult select)
{
var usable = (UsableObject)select.selectObject;
var activeUnit = PlayerController.current.activeUnit;
var attackAbility = activeUnit.unitAbilityBook.attackAbility;
var carrier = usable.itemState.carriedBy;
ContextMenuUI.current.Prepare();
ContextMenuUI.current.AddBeforeClick(() => activeUnit.OrderStop());
if (activeUnit.unitData.canUse)
{
ContextMenuUI.current.AddOption("Use", () =>
{
activeUnit.Order(new MoveAction(activeUnit, usable.transform.position, activeUnit.unitData.takeRange));
activeUnit.Order(new UseAction(activeUnit, usable));
});
}
if (!select.onUI)
{
if (activeUnit.unitData.canMove)
{
ContextMenuUI.current.AddOption("Move", () =>
{
activeUnit.Order(new MoveAction(activeUnit, usable.transform.position));
});
}
if (activeUnit.unitData.canAttack)
{
ContextMenuUI.current.AddOption("Attack", () =>
{
activeUnit.Order(new MoveAction(activeUnit, select.position, attackAbility.range));
activeUnit.Order(new AbilityAction(activeUnit, attackAbility, select.position));
});
}
}
if (activeUnit.unitData.canTake && usable.itemData.canBePicked && usable.itemData.canBeMoved && (carrier == null || carrier.basicState.isDead))
{
ContextMenuUI.current.AddOption("Take", () =>
{
activeUnit.Order(new MoveAction(activeUnit, usable.transform.position, activeUnit.unitData.takeRange));
activeUnit.Order(new TakeAction(activeUnit, usable));
});
}
if (carrier == activeUnit)
{
ContextMenuUI.current.AddOption("Drop", () =>
{
activeUnit.Order(new DropAction(activeUnit, usable));
});
}
if (activeUnit.unitData.canInspect && usable.basicData.canBeInspected)
{
ContextMenuUI.current.AddOption("Inspect", () =>
{
MoveAction moveAction = new MoveAction(activeUnit, usable.transform.position, activeUnit.unitData.inspectRange);
moveAction.OnEnd += () => activeUnit.OrderInstantly(new InspectAction(activeUnit, usable));
activeUnit.Order(moveAction);
});
}
ContextMenuUI.current.Open();
}
}
}