130 lines
5.7 KiB
C#
130 lines
5.7 KiB
C#
using System;
|
|
using VOID.Generic.Dict;
|
|
using VOID.Generic.Objects.Unit;
|
|
using VOID.Generic.Objects.Unit.Actions;
|
|
using VOID.Generic.Player.Input;
|
|
using VOID.Generic.Player.Util;
|
|
using VOID.UserInterface.Game;
|
|
using VOID.Generic.Util;
|
|
|
|
namespace VOID.Generic.Player.CursorOperation
|
|
{
|
|
public class OnUnitCursorOperation : AbstractCursorOperation
|
|
{
|
|
public override Type ForType() => typeof(UnitObject);
|
|
|
|
public override bool Check(SelectUtilResult select)
|
|
{
|
|
return select.selectObject is UnitObject;
|
|
}
|
|
|
|
public override void DoDefault(SelectUtilResult select, bool isAlternate)
|
|
{
|
|
var onPartyUI = select.partyUI != null;
|
|
var onPortraitUI = select.unitPortraitUI != null;
|
|
var activeUnit = PlayerController.current.activeUnit;
|
|
var attackAbility = activeUnit.unitAbilityBook.attackAbility;
|
|
var targetUnit = (UnitObject)select.selectObject;
|
|
var attitude = activeUnit.unitAttitude.GetAttitudeWith(targetUnit);
|
|
|
|
if (isAlternate && onPortraitUI && onPartyUI && targetUnit == PlayerController.current.activeUnit)
|
|
{
|
|
CameraManager.current.MoveTo(targetUnit.transform.position);
|
|
}
|
|
else if (isAlternate && onPortraitUI && onPartyUI && targetUnit == PlayerController.current.mainUnit)
|
|
{
|
|
PlayerController.current.SetMainUnitActive();
|
|
}
|
|
else if (isAlternate && onPortraitUI && onPartyUI && targetUnit == PlayerController.current.subUnit)
|
|
{
|
|
PlayerController.current.SetSubUnitActive();
|
|
}
|
|
else if (isAlternate && onPortraitUI)
|
|
{
|
|
CameraManager.current.MoveTo(targetUnit.transform.position);
|
|
}
|
|
else if (!isAlternate && onPortraitUI)
|
|
{
|
|
CameraManager.current.stickTo = targetUnit.transform;
|
|
}
|
|
|
|
// No action to order when clicking portraits
|
|
if (onPortraitUI) return;
|
|
|
|
activeUnit.OrderStop();
|
|
|
|
if (targetUnit.basicState.isDead)
|
|
{
|
|
// Open - when other unit is dead, we open him like container
|
|
activeUnit.Order(new MoveAction(activeUnit, targetUnit, activeUnit.unitData.takeRange));
|
|
activeUnit.Order(new OpenOtherUnitAction(activeUnit, targetUnit));
|
|
}
|
|
else if (activeUnit.unitData.canAttack && (PlayerInputManager.current.isForceAttack || attitude <= AttitudeType.Cautious))
|
|
{
|
|
// Attack - when this unit can Attack AND forced attack OR target unit is hostile/cautious
|
|
activeUnit.Order(new MoveAction(activeUnit, select.position, attackAbility.range));
|
|
activeUnit.Order(new AbilityAction(activeUnit, attackAbility, select.position));
|
|
}
|
|
else
|
|
{
|
|
// Talk - when this unit can Talk AND target unit is neutral/friendly
|
|
activeUnit.Order(new MoveAction(activeUnit, targetUnit, activeUnit.unitData.talkRange));
|
|
if (activeUnit.unitData.canTalk && targetUnit.unitData.canBeTalked) activeUnit.Order(new TalkAction(activeUnit, targetUnit));
|
|
}
|
|
}
|
|
|
|
public override void DoContext(SelectUtilResult select)
|
|
{
|
|
var activeUnit = PlayerController.current.activeUnit;
|
|
var attackAbility = activeUnit.unitAbilityBook.attackAbility;
|
|
var targetUnit = (UnitObject)select.selectObject;
|
|
var attitude = activeUnit.unitAttitude.GetAttitudeWith(targetUnit);
|
|
|
|
if (targetUnit == activeUnit && select.onUI) return;
|
|
|
|
ContextMenuUI.current.Prepare();
|
|
|
|
ContextMenuUI.current.AddBeforeClick(() => activeUnit.OrderStop());
|
|
|
|
if (activeUnit.unitData.canMove)
|
|
{
|
|
ContextMenuUI.current.AddOption("Move",
|
|
() => activeUnit.Order(new MoveAction(activeUnit, select.position)));
|
|
}
|
|
if (targetUnit.basicState.isDead)
|
|
{
|
|
ContextMenuUI.current.AddOption("Loot", () =>
|
|
{
|
|
activeUnit.Order(new MoveAction(activeUnit, targetUnit, activeUnit.unitData.takeRange));
|
|
activeUnit.Order(new OpenOtherUnitAction(activeUnit, targetUnit));
|
|
});
|
|
}
|
|
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 (attitude >= AttitudeType.Neutral && activeUnit.unitData.canTalk && targetUnit.unitData.canBeTalked)
|
|
{
|
|
ContextMenuUI.current.AddOption("Talk", () =>
|
|
{
|
|
activeUnit.Order(new MoveAction(activeUnit, select.position, activeUnit.unitData.takeRange));
|
|
activeUnit.Order(new TalkAction(activeUnit, targetUnit));
|
|
});
|
|
}
|
|
if (activeUnit.unitData.canInspect && targetUnit.basicData.canBeInspected)
|
|
{
|
|
ContextMenuUI.current.AddOption("Inspect", () =>
|
|
{
|
|
MoveAction moveAction = new MoveAction(activeUnit, select.position, activeUnit.unitData.inspectRange);
|
|
moveAction.OnEnd += () => activeUnit.OrderInstantly(new InspectAction(activeUnit, targetUnit));
|
|
activeUnit.Order(moveAction);
|
|
});
|
|
}
|
|
ContextMenuUI.current.Open();
|
|
}
|
|
}
|
|
} |