public override void Start()
    {
        List <EncounterAgent> potentialEnemies = encounter.GetEnemiesInEncounter(controlledShip.GetComponent <EncounterAgent>());

        float          shortestSquaredDist = 0f;
        EncounterAgent closestEnemy        = null;

        foreach (var enemy in potentialEnemies)
        {
            float    squaredDist       = (controlledShip.transform.position - enemy.transform.position).sqrMagnitude;
            Dockable dockableComponent = enemy.GetComponent <Dockable>();
            if (dockableComponent == null || dockableComponent.Docked == false)
            {
                if ((closestEnemy == null || squaredDist < shortestSquaredDist))
                {
                    closestEnemy        = enemy;
                    shortestSquaredDist = squaredDist;
                }
            }
        }

        if (closestEnemy != null)
        {
            Succeed();
            onTargetFoundCallback(closestEnemy);
        }
        else
        {
            Fail("ENCOUNTER OVER");
        }
    }
 public void AssignNewTarget(EncounterAgent target)
 {
     this.target   = target;
     targetPilot   = target.GetComponent <ShipPiloting>();
     targetEngines = target.GetComponent <ShipEngine>();
     Start();
 }
예제 #3
0
 private void OnTargetFound(EncounterAgent target)
 {
     if (attackTarget.Target != target)
     {
         attackTarget.AssignNewTarget(target);
     }
 }
예제 #4
0
    public Encounter(EncounterAgent initiator, EncounterAgent initialTarget)
    {
        for (int facID = 0; facID < Ownership.FactionCount; facID++)
        {
            encounterMembers[facID] = new HashSet <EncounterAgent>();
        }

        AddToEncounter(initiator);
        AddToEncounter(initialTarget);
        All.Add(this);
    }
예제 #5
0
    private void OnTargetFound(EncounterAgent target)
    {
        // When a target is found, we start an Encounter.
        // if the target is already in an encounter, then we join it ?

        if (target.CurrentEncounter == null)
        {
            controlledEncounterAgent.StartEncounter(target);
        }
        else
        {
            target.CurrentEncounter.AddToEncounter(controlledEncounterAgent);
        }
    }
예제 #6
0
    public DefendAreaBehavior(Vector2 area, float areaRadius, GameObject ship, AIOrderQueue orderQueue) : base(ship, orderQueue)
    {
        areaCenter          = area;
        radius              = areaRadius;
        goToAreaCenterOrder = new GoToOrder(ship, area, areaRadius);
        goToAreaCenterOrder.OnStateSucceeded += GoToAreaCenterOrder_OnStateSucceeded;

        controlledEncounterAgent = controlledShip.GetComponent <EncounterAgent>();
        controlledEncounterAgent.OnEncounterJoined += ControlledEncounterAgent_OnEncounterJoined;
        controlledEncounterAgent.OnEncounterLeft   += ControlledEncounterAgent_OnEncounterLeft;
        resolveEncounterOrder = new ResolveEncounterOrder(ship, controlledEncounterAgent);

        findTargetOrder = new LookForTargetOrder(ship, OnTargetFound, areaRadius);
    }
예제 #7
0
    public List <EncounterAgent> GetEnemiesInEncounter(EncounterAgent agent)
    {
        List <EncounterAgent> enemies = new List <EncounterAgent>();

        uint[] enemyFactionIDs = agent.GetComponent <Ownership>().GetEnemyFactionIDs();
        foreach (var enemyFactionID in enemyFactionIDs)
        {
            foreach (var enemy in encounterMembers[enemyFactionID])
            {
                enemies.Add(enemy);
            }
        }

        return(enemies);
    }
예제 #8
0
    public override void Start()
    {
        uint myFaction = controlledShip.GetComponent <Ownership>().OwnerFactionID;

        List <Ownership[]> potentialEnemies = new List <Ownership[]>();

        for (int facID = 1; facID < Ownership.FactionCount; facID++)
        {
            if (facID != myFaction)
            {
                potentialEnemies.Add(Ownership.GetFactionMembers(facID));
            }
        }

        float          shortestSquaredDist = 0f;
        EncounterAgent closestEnemy        = null;

        foreach (var enemyGroup in potentialEnemies)
        {
            foreach (var enemy in enemyGroup)
            {
                EncounterAgent encounterAgent    = enemy.GetComponent <EncounterAgent>();
                Dockable       dockableComponent = enemy.GetComponent <Dockable>();
                if (encounterAgent != null && (dockableComponent == null || dockableComponent.Docked == false))
                {
                    float squaredDist = (controlledShip.transform.position - enemy.transform.position).sqrMagnitude;
                    if (squaredDist < maxDistance * maxDistance && (closestEnemy == null || squaredDist < shortestSquaredDist))
                    {
                        closestEnemy        = encounterAgent;
                        shortestSquaredDist = squaredDist;
                    }
                }
            }
        }

        if (closestEnemy != null)
        {
            Succeed();
            targetFoundCallback(closestEnemy);
        }
        else
        {
            Fail("NO ENEMY IN RANGE");
        }
    }
예제 #9
0
    public ResolveEncounterOrder(GameObject ship, EncounterAgent encounterAgent) : base(ship)
    {
        this.encounterAgent = encounterAgent;

        this.encounterAgent.OnEncounterLeft   += EncounterAgent_OnEncounterLeft;
        this.encounterAgent.OnEncounterJoined += EncounterAgent_OnEncounterJoined;

        float combatRange = 10f;

        if (ship.GetComponent <ShipProperties>().Size == SHIP_SIZE.M)
        {
            combatRange = 40f;
        }

        attackTarget             = new AttackTargetOrder(ship, combatRange);
        lookForTargetInEncounter = new LookForTargetInEncounterOrder(ship, OnTargetFound);
        lookForTargetInEncounter.OnStateFailed += LookForTargetInEncounter_OnStateFailed;
    }
 public AttackTargetOrder(GameObject ship, EncounterAgent target, float attackRange) : base(ship)
 {
     this.attackRange = attackRange;
     AssignNewTarget(target);
 }
예제 #11
0
 public void RemoveFromEncounter(EncounterAgent agent)
 {
     encounterMembers[agent.GetComponent <Ownership>().OwnerFactionID].Remove(agent);
     agent.EncounterLeft();
 }
예제 #12
0
 public void AddToEncounter(EncounterAgent agent)
 {
     encounterMembers[agent.GetComponent <Ownership>().OwnerFactionID].Add(agent);
     agent.EncounterJoined(this);
 }
예제 #13
0
 public void StartEncounter(EncounterAgent otherAgent)
 {
     new Encounter(this, otherAgent);
 }