using System.Collections.Generic;
using ColdMint.scripts.character;
using ColdMint.scripts.debug;
using ColdMint.scripts.utils;
using ColdMint.scripts.weapon;
using Godot;
namespace ColdMint.scripts.stateMachine.StateProcessor;
///
/// Weapon seeking condition
/// 寻找武器状态
///
public class LookForWeaponProcessor : StateProcessorTemplate
{
protected WeaponTemplate? TargetWeapon;
protected override void OnExecute(StateContext context, Node owner)
{
if (owner is not AiCharacter aiCharacter)
{
LogCat.LogError("owner_is_not_AiCharacter", LogCat.LogLabel.LookForWeaponProcessor);
return;
}
if (TargetWeapon != null)
{
//If the nearest weapon is found, move the character to the weapon.
//如果有最近的武器被找到了,那么将角色移动到武器旁边。
var weaponTemplates = aiCharacter.GetCanPickedWeapon();
//Weapons are not in the range of the pickup.
//武器没在拾捡范围内。
if (weaponTemplates.Length == 0)
{
LogCat.Log("weapon_not_in_pickup_range", LogCat.LogLabel.LookForWeaponProcessor);
aiCharacter.SetTargetPosition(TargetWeapon.GlobalPosition);
}
else
{
var haveWeapon = false;
foreach (var weaponTemplate in weaponTemplates)
{
if (weaponTemplate == TargetWeapon)
{
haveWeapon = true;
}
}
if (haveWeapon)
{
var pickResult = aiCharacter.PickItem(TargetWeapon);
if (pickResult)
{
context.CurrentState = context.PreviousState;
//Successfully picked up the weapon.
//成功拾起武器。
LogCat.Log("weapon_picked_up", LogCat.LogLabel.LookForWeaponProcessor);
}
else
{
TargetWeapon = null;
//Weapon failed to pick up.
//武器捡起时失败。
LogCat.Log("weapon_pickup_failed", LogCat.LogLabel.LookForWeaponProcessor);
}
}
else
{
//No weapons are included in the pickup area.
//拾捡范围内不包含武器。
LogCat.Log("weapon_not_in_pickup_range", LogCat.LogLabel.LookForWeaponProcessor);
aiCharacter.SetTargetPosition(TargetWeapon.GlobalPosition);
}
}
return;
}
if (aiCharacter.ScoutWeaponDetected())
{
//Weapons were found in the character's recon area.
//在角色的侦察范围内发现了武器。
//We search for the nearest weapon.
//我们搜索最近的武器。
LogCat.Log("weapon_detected", LogCat.LogLabel.LookForWeaponProcessor);
var weaponTemplates = aiCharacter.GetWeaponInScoutArea();
if (weaponTemplates == null || weaponTemplates.Length == 0)
{
//The weapon may have been lost or taken by someone else.
//武器可能已丢失,或被他人占用。
LogCat.Log("weapon_lost", LogCat.LogLabel.LookForWeaponProcessor);
return;
}
var nodes = new List();
foreach (var weapon in weaponTemplates)
{
if (weapon is Node newNode)
{
nodes.Add(newNode);
}
}
var node = NodeUtils.GetTheNearestNode(aiCharacter, nodes.ToArray());
if (node == null)
{
//When looking for the nearest node, return null.
//查找最近的节点时,返回null。
LogCat.Log("nearest_node_is_null", LogCat.LogLabel.LookForWeaponProcessor);
return;
}
if (node is WeaponTemplate weaponTemplate)
{
TargetWeapon = weaponTemplate;
}
else
{
LogCat.LogError("node_is_not_WeaponTemplate", LogCat.LogLabel.LookForWeaponProcessor);
}
}
else
{
//No weapons detected
//没有检测到武器
LogCat.Log("no_weapon_detected", LogCat.LogLabel.LookForWeaponProcessor);
}
}
public override State State => State.LookForWeapon;
}