133 lines
5.7 KiB
C#
133 lines
5.7 KiB
C#
using System;
|
|
using VOID.Generic.Objects.Unit.Actions;
|
|
using VOID.Generic.Objects.Wearable;
|
|
using VOID.Generic.Player.Input;
|
|
using VOID.Generic.Player.Util;
|
|
using VOID.UserInterface.Game;
|
|
|
|
namespace VOID.Generic.Player.CursorOperation
|
|
{
|
|
public class OnWearableCursorOperation : AbstractCursorOperation
|
|
{
|
|
public override Type ForType() => typeof(WearableObject);
|
|
|
|
public override bool Check(SelectUtilResult select)
|
|
{
|
|
return select.selectObject is WearableObject;
|
|
}
|
|
|
|
public override void DoDefault(SelectUtilResult select, bool isAlternate)
|
|
{
|
|
if (isAlternate) return;
|
|
|
|
var wearable = (WearableObject)select.selectObject;
|
|
var activeUnit = PlayerController.current.activeUnit;
|
|
var carrier = wearable.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 && wearable.itemData.canBePicked && wearable.itemData.canBeMoved && (carrier == null || carrier.basicState.isDead))
|
|
{
|
|
// Default operaion is Take
|
|
activeUnit.Order(new MoveAction(activeUnit, select.position, activeUnit.unitData.takeRange));
|
|
activeUnit.Order(new TakeAction(activeUnit, wearable));
|
|
}
|
|
else if (wearable.wearableState.wearerUnit == activeUnit)
|
|
{
|
|
// Try UNEQUIP (if currently wearing)
|
|
activeUnit.Order(new UnEquipAction(activeUnit, wearable));
|
|
}
|
|
else if (wearable.itemState.carriedBy == activeUnit)
|
|
{
|
|
// Try EQUIP (if in backpack)
|
|
activeUnit.Order(new EquipAction(activeUnit, wearable));
|
|
}
|
|
}
|
|
|
|
public override void DoContext(SelectUtilResult select)
|
|
{
|
|
var wearable = (WearableObject)select.selectObject;
|
|
var activeUnit = PlayerController.current.activeUnit;
|
|
var attackAbility = activeUnit.unitAbilityBook.attackAbility;
|
|
var carrier = wearable.itemState.carriedBy;
|
|
var wearer = wearable.wearableState.wearerUnit;
|
|
|
|
ContextMenuUI.current.Prepare();
|
|
|
|
ContextMenuUI.current.AddBeforeClick(() => activeUnit.OrderStop());
|
|
|
|
if (!select.onUI)
|
|
{
|
|
if (activeUnit.unitData.canMove)
|
|
{
|
|
ContextMenuUI.current.AddOption("Move", () =>
|
|
{
|
|
activeUnit.Order(new MoveAction(activeUnit, select.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 ((carrier == null) && wearer == null && activeUnit.unitData.canTake && wearable.itemData.canBePicked && wearable.itemData.canBeMoved)
|
|
{
|
|
ContextMenuUI.current.AddOption("Equip", () =>
|
|
{
|
|
activeUnit.Order(new MoveAction(activeUnit, select.position, activeUnit.unitData.takeRange));
|
|
activeUnit.Order(new TakeAction(activeUnit, wearable));
|
|
activeUnit.Order(new EquipAction(activeUnit, wearable));
|
|
});
|
|
}
|
|
if ((carrier == activeUnit) && wearer == null)
|
|
{
|
|
ContextMenuUI.current.AddOption("Equip", () =>
|
|
{
|
|
activeUnit.Order(new EquipAction(activeUnit, wearable));
|
|
});
|
|
}
|
|
if (carrier == activeUnit && wearer == activeUnit)
|
|
{
|
|
ContextMenuUI.current.AddOption("UnEquip", () =>
|
|
{
|
|
activeUnit.Order(new UnEquipAction(activeUnit, wearable));
|
|
});
|
|
}
|
|
if (activeUnit.unitData.canTake && wearable.itemData.canBePicked && wearable.itemData.canBeMoved && (carrier == null || carrier.basicState.isDead))
|
|
{
|
|
ContextMenuUI.current.AddOption("Take", () =>
|
|
{
|
|
activeUnit.Order(new MoveAction(activeUnit, select.position, activeUnit.unitData.takeRange));
|
|
activeUnit.Order(new TakeAction(activeUnit, wearable));
|
|
});
|
|
}
|
|
if (carrier == activeUnit)
|
|
{
|
|
ContextMenuUI.current.AddOption("Drop", () =>
|
|
{
|
|
activeUnit.Order(new DropAction(activeUnit, wearable));
|
|
});
|
|
}
|
|
if (activeUnit.unitData.canInspect && wearable.basicData.canBeInspected)
|
|
{
|
|
ContextMenuUI.current.AddOption("Inspect", () =>
|
|
{
|
|
MoveAction moveAction = new MoveAction(activeUnit, select.position, activeUnit.unitData.inspectRange);
|
|
moveAction.OnEnd += () => activeUnit.OrderInstantly(new InspectAction(activeUnit, wearable));
|
|
activeUnit.Order(moveAction);
|
|
});
|
|
}
|
|
ContextMenuUI.current.Open();
|
|
}
|
|
}
|
|
} |