using System;
using System.Collections.Generic;
using System.Linq;
using Continentis.MainGame.Card;
using Continentis.MainGame.Combat;
using Lean.Pool;
using NaughtyAttributes;
using SLSFramework.UModAssistance;
using UnityEngine;
using Object = UnityEngine.Object;
using Random = UnityEngine.Random;
namespace Continentis.MainGame.Character
{
public enum Fraction
{
Player,
Ally,
Enemy,
Neutral
}
public interface ICardOwner
{
DeckSubmodule deckSubmodule { get; }
}
public partial class CharacterBase : ICardOwner, IGameElement
{
public Guid elementID { get; set; }
public CharacterData data;
public CharacterLogicBase logicBase;
public Fraction fraction;
public CombatTeam team;
public int actionCountThisRound;
[ShowNativeProperty]
public AttributeSubmodule attributeSubmodule { get; private set; }
[ShowNativeProperty]
public EventSubmodule eventSubmodule { get; private set; }
[ShowNativeProperty]
public EquipmentSubmodule equipmentSubmodule { get; private set; }
[ShowNativeProperty]
public DeckSubmodule deckSubmodule { get; private set; }
[ShowNativeProperty]
public IntentionSubmodule intentionSubmodule { get; private set; }
[ShowNativeProperty]
public StatusSubmodule statusSubmodule { get; private set; }
[ShowNativeProperty]
public CombatBuffSubmodule combatBuffSubmodule { get; private set; }
[ShowNativeProperty]
public RecordSubmodule recordSubmodule { get; private set; }
public CharacterBase(CharacterData data, Fraction fraction)
{
(this as IGameElement).Initialize();
this.data = data;
this.fraction = fraction;
switch (fraction)
{
case Fraction.Player:
this.team = CombatMainManager.Instance.characterController.playerTeam;
break;
case Fraction.Enemy:
this.team = CombatMainManager.Instance.characterController.enemyTeam;
break;
default:
this.team = null;
break;
}
attributeSubmodule = new AttributeSubmodule(this);
equipmentSubmodule = new EquipmentSubmodule(this);
eventSubmodule = new EventSubmodule(this);
deckSubmodule = new DeckSubmodule(this);
intentionSubmodule = new IntentionSubmodule(this);
statusSubmodule = new StatusSubmodule(this);
combatBuffSubmodule = new CombatBuffSubmodule(this);
recordSubmodule = new RecordSubmodule(this);
this.logicBase = GenerateCharacterLogic(data);
this.logicBase.Initialize(this);
}
///
/// 生成卡牌逻辑实例
///
public static CharacterLogicBase GenerateCharacterLogic(CharacterData data)
{
string typeID = ModManager.GetTypeID(data.modName, "Characters", "", data.className);
Type logicType = ModManager.GetType(typeID);
if(logicType == null)
{
return new CharacterLogicBase();
}
if (Activator.CreateInstance(logicType) is CharacterLogicBase logic)
{
return logic;
}
Debug.LogError($"Card class '{typeID}' not found or could not be instantiated.");
return null;
}
}
public partial class CharacterBase
{
public CombatCharacterViewBase characterView;
}
public partial class CharacterBase
{
public CombatCharacterViewBase GenerateCharacterView(Vector3 position)
{
GameObject prefab = data.combatCharacterView;
CombatCharacterViewBase characterView = Object.Instantiate(prefab, position, Quaternion.identity).GetComponent();
characterView.Initialize(this);
this.characterView = characterView;
return characterView;
}
public virtual void Die()
{
CombatMainManager.Instance.characterController.RemoveCharacter(this);
}
}
}