using TaleWorlds.Core;
using TaleWorlds.Engine.GauntletUI;
using TaleWorlds.GauntletUI.Data;
using TaleWorlds.MountAndBlade;
using TaleWorlds.MountAndBlade.View.Missions;
namespace OpponentHealthBar
{
public class MissionOpponentHealthBar : MissionView
{
private OpponentHealthVM _dataSource;
private GauntletLayer _gauntletLayer;
private IGauntletMovie _gauntletMovie;
public MissionOpponentHealthBar()
{
ViewOrderPriorty = 20;
}
public override void OnMissionScreenInitialize()
{
base.OnMissionScreenInitialize();
_dataSource
= new OpponentHealthVM
(); _gauntletLayer
= new GauntletLayer
(ViewOrderPriorty
); _gauntletMovie = _gauntletLayer.LoadMovie("OpponentHealthBar", _dataSource);
MissionScreen.AddLayer(_gauntletLayer);
}
public override void OnMissionScreenFinalize()
{
MissionScreen.RemoveLayer(_gauntletLayer);
_gauntletLayer.ReleaseMovie(_gauntletMovie);
_gauntletLayer = null;
_dataSource.OnFinalize();
base.OnMissionScreenFinalize();
}
// 画面中央 (マウスカーソルの位置) と、一番手前にある IFocusable なオブジェクトとが交差した瞬間に呼ばれます。
//
// agent: フォーカスした Agent。シングルプレイだと、おそらく常に Agent.Main (プレイヤーキャラクター) です。
// focusableObject: フォーカスされたもの
// isInteractable: Talk や Use などのインタラクトが可能か
//
// フォーカスが 10m までしか利かないのは MissionMainAgentInteractionComponent.FocusTick() で
// 決められた仕様なのでどうしようもありません。
public override void OnFocusGained(Agent agent, IFocusable focusableObject, bool isInteractable)
{
base.OnFocusGained(agent, focusableObject, isInteractable);
_dataSource.OnFocusChanged(focusableObject);
}
// 今までフォーカスされていた IFocusable なオブジェクトから、フォーカスが外れた瞬間に呼ばれます。
//
// agent: フォーカスしていた Agent。シングルプレイだと、おそらく常に Agent.Main (プレイヤーキャラクター) です。
// focusableObject: フォーカスされていたもの
public override void OnFocusLost(Agent agent, IFocusable focusableObject)
{
base.OnFocusLost(agent, focusableObject);
_dataSource.OnFocusChanged(focusableObject);
}
// Agent が何らかの攻撃を受けた際に呼ばれます。
//
// affectedAgent: 攻撃を受けた Agent
// affectorAgent: 攻撃を行った Agent
// damage: ダメージ量
// affectorWeapon: 使用された武器
public override void OnAgentHit(Agent affectedAgent, Agent affectorAgent, int damage, in MissionWeapon affectorWeapon)
{
base.OnAgentHit(affectedAgent, affectorAgent, damage, affectorWeapon);
_dataSource.OnAgentHit(affectedAgent);
}
// Agent が戦闘不能になった際に呼ばれます。
//
// affectedAgent: 攻撃を受けた Agent
// affectorAgent: 攻撃を行った Agent
// agentState: Agent の状態
// blow: とどめの一撃の内容
//
// 似たようなメソッドに OnAgentDeleted がありますが、そちらは
// 戦闘不能になって倒れている Agent が時間経過や表示限界により消滅する際に呼ばれるようです。
public override void OnAgentRemoved(Agent affectedAgent, Agent affectorAgent, AgentState agentState, KillingBlow blow)
{
base.OnAgentRemoved(affectedAgent, affectorAgent, agentState, blow);
_dataSource.OnAgentRemoved(affectedAgent);
}
// フォトモードで構図を決めている最中に GUI が表示されないようにするための処理です。
// この処理を入れても入れなくても、どちらにしろ出力される画像ファイルに GUI は写りません。
public override void OnPhotoModeActivated()
{
base.OnPhotoModeActivated();
_gauntletLayer._gauntletUIContext.ContextAlpha = 0f;
}
public override void OnPhotoModeDeactivated()
{
base.OnPhotoModeDeactivated();
_gauntletLayer._gauntletUIContext.ContextAlpha = 1f;
}
}
}