예제 #1
0
    public void DoesNotSeeEnemy(HumanoidModel enemy)
    {
        EnemyTarget enemyTarget;

        viewableEnemies.TryGetValue(enemy, out enemyTarget);
        if (enemyTarget != null)
        {
            viewableEnemies.Remove(enemy);
            EnemyMarker newMarker = new EnemyMarker(enemyTarget, this);
            CommunicatableEnemyMarker newCMarker = new CommunicatableEnemyMarker(
                newMarker,
                checkHiddenEnemyRadius
                );
            // avoid clustering enemy markers in one spot
            if (NoMarkerTooCloseTo(newCMarker))
            {
                AddHiddenEnemy(newCMarker);
                HumanoidTargeterCommunication.Communicate(
                    new CommunicationPackage(
                        GetDeepCopyOfHiddenEnemies(),
                        this
                        )
                    );
            }
        }
    }
예제 #2
0
 public void setVisible(EnemyMarker marker)
 {
     this.marker     = marker;
     portrait.sprite = ImagesProvider.getMarkerSprite(marker.enemyType);
     enemyName.setText(marker.enemyType.name());
     fightResult.gameObject.SetActive(false);
     attackBtn.setVisible(true);
     gameObject.SetActive(true);
 }
예제 #3
0
 public CommunicatableEnemyMarker(EnemyMarker marker,
                                  float radius)
 {
     this.enemyMarker = marker;
     valid            = true;
     this.radius      = radius;
     CreateSecondaryLocations();
     foreach (Vector3 location in secondaryLocations)
     {
         var cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
         cube.transform.position = location;
     }
 }
예제 #4
0
        private void WorldEventPublisher_SettingsLoaded(object sender, EventArgs e)
        {
            EnemyMarker.SetMarker(World.Default.Map.MarkerManager.EnemyMarkerSettings);
            AbandonedMarker.SetMarker(World.Default.Map.MarkerManager.AbandonedMarkerSettings);

            var viewsList = new GridEXValueListItemCollection();

            string[] viewItems = World.Default.Views.GetBackgroundViews(false).ToArray();
            viewsList.AddRange(viewItems.Select(x => new GridEXValueListItem(x, x)).ToArray());
            MarkersGrid.RootTable.Columns["View"].EditValueList = viewsList;
            MarkersGrid.RootTable.Columns["View"].DefaultValue  = viewItems.FirstOrDefault();

            SetMarkersGridDataSource();
        }
예제 #5
0
    public static void SuppressHiddenEnemy(EnemyMarker enemy)
    {
        AttackableObject <EnemyMarker> info = instance.markersForAttack.Find(m => {
            return(m.GetObject() == enemy);
        });

        if (info == null)
        {
            Debug.LogError("No enemy marker found!");
        }
        else
        {
            info.AddSuppressor();
        }
    }
예제 #6
0
    public static void NoLongerFlankLeftHiddenEnemy(EnemyMarker enemy)
    {
        AttackableObject <EnemyMarker> info = instance.markersForAttack.Find(m => {
            return(m.GetObject() == enemy);
        });

        if (info == null)
        {
            Debug.LogError("No enemy marker found!");
        }
        else
        {
            info.RemoveLeftFlanker();
        }
    }
예제 #7
0
    public static void AddCommunicatorSubscriber(CommunicatableEnemyMarker communicator)
    {
        Integer     communicators = null;
        EnemyMarker enemyMarker   = communicator.GetEnemyMarker();

        instance.enemyMarkers.TryGetValue(enemyMarker, out communicators);
        if (communicators == null)
        {
            instance.enemyMarkers.Add(enemyMarker, new Integer(0));
            instance.enemyMarkersPublic.Add(enemyMarker);
        }
        Integer existingCommunicator = instance.enemyMarkers[enemyMarker];

        existingCommunicator.value++;
    }
예제 #8
0
 void Start()
 {
     amyTarget = HumanoidStore.GetAmyModel();
     enemyMarkerLocations.ForEach(m =>
     {
         EnemyMarker newMarker = new EnemyMarker(amyTarget, m.position, null);
         targeters.ForEach(t =>
         {
             CommunicatableEnemyMarker newCMarker = new CommunicatableEnemyMarker(
                 newMarker,
                 5
                 );
             t.AddEnemyMarker(newCMarker);
         });
     });
 }
예제 #9
0
    public static void RemoveCommunicatorSubscriber(CommunicatableEnemyMarker communicator)
    {
        Integer     communicators = null;
        EnemyMarker enemyMarker   = communicator.GetEnemyMarker();

        instance.enemyMarkers.TryGetValue(enemyMarker, out communicators);
        if (communicators != null)
        {
            communicators.value--;
            if (communicators.value == 0)
            {
                instance.enemyMarkers.Remove(enemyMarker);
                instance.enemyMarkersPublic.Remove(enemyMarker);
            }
        }
    }
예제 #10
0
    public static int GetSuppressorsOnHiddenEnemy(
        EnemyMarker target
        )
    {
        AttackableObject <EnemyMarker> info = instance.markersForAttack.Find(m => {
            return(m.GetObject() == target);
        });

        if (info == null)
        {
            Debug.LogError("No enemy marker found!");
            return(0);
        }
        else
        {
            return(info.GetCoveringFireAttackers());
        }
    }
예제 #11
0
    public static void GenerateNewTimeline(TimelineAsset originTimeline, TimelineAsset dstTimeline)
    {
        dstTimeline.CreateMarkerTrack();

        foreach (IMarker output in  originTimeline.markerTrack.GetMarkers())
        {
            EnemyMarker marker = output as EnemyMarker;

            if (marker == null)
            {
                Debug.Log("Marker added " + output.time);
                continue;
            }

            double deltaTime    = EnemyBase.Distance / marker.enemyParams.speed;
            double creationTime = marker.time - deltaTime;

            EnemyNotificationMarker copyMarker = dstTimeline.markerTrack.CreateMarker(typeof(EnemyNotificationMarker), creationTime) as EnemyNotificationMarker;

            copyMarker.enemyParams = marker.enemyParams;

            Debug.Log("Old time " + marker.time + ", New time " + creationTime);
        }
    }
예제 #12
0
    private void ProcessHiddenEnemy(
        EnemyMarker enemy
        )
    {
        int leftFlankers =
            HumanoidAttackPlannerCommunications.GetLeftFlankersOnHiddenEnemy(
                enemy
                );
        int rightFlankers =
            HumanoidAttackPlannerCommunications.GetRightFlankersOnHiddenEnemy(
                enemy
                );
        int suppressors =
            HumanoidAttackPlannerCommunications.GetSuppressorsOnHiddenEnemy(
                enemy
                );

        bool canFlankLeft  = leftFlankers < flankParticipationLimit;
        bool canFlankRight = rightFlankers < flankParticipationLimit;
        bool canSuppress   = suppressors < suppressiveFireParticipationLimit;

        CanDoAction flankLeftResult = new CanDoAction(
            canFlankLeft,
            leftFlankers,
            AttackAction.FLANK_LEFT
            );
        CanDoAction flankRightResult = new CanDoAction(
            canFlankRight,
            rightFlankers,
            AttackAction.FLANK_RIGHT
            );
        CanDoAction suppressorResult = new CanDoAction(
            canSuppress,
            suppressors,
            AttackAction.SUPPRESS_FIRE
            );
        List <CanDoAction> potentialActions = new List <CanDoAction>();

        potentialActions.Add(flankLeftResult);
        potentialActions.Add(flankRightResult);
        potentialActions.Add(suppressorResult);

        potentialActions.OrderBy(pa => {
            return(pa.number);
        });

        foreach (CanDoAction action in potentialActions)
        {
            if (action.canDo)
            {
                attackAction = action.action;
                switch (action.action)
                {
                case AttackAction.FLANK_LEFT:
                    HumanoidAttackPlannerCommunications.FlankLeftHiddenEnemy(
                        enemy
                        );
                    break;

                case AttackAction.FLANK_RIGHT:
                    HumanoidAttackPlannerCommunications.FlankRightHiddenEnemy(
                        enemy
                        );
                    break;

                case AttackAction.SUPPRESS_FIRE:
                    HumanoidAttackPlannerCommunications.SuppressHiddenEnemy(
                        enemy
                        );
                    break;
                }
                return;
            }
        }

        int rightRelocators =
            HumanoidAttackPlannerCommunications.GetRightRelocators().Count;

        int leftRelocators =
            HumanoidAttackPlannerCommunications.GetLeftRelocators().Count;

        if (rightRelocators < leftRelocators)
        {
            if (rightRelocators < relocateParticipationLimit)
            {
                attackAction = AttackAction.RELOCATE_RIGHT;
            }
        }
        else
        {
            if (leftRelocators < relocateParticipationLimit)
            {
                attackAction = AttackAction.RELOCATE_LEFT;
            }
        }
    }
예제 #13
0
    public void FindNextAction()
    {
        var boundingEnemies        = targeter.GetBoundingEnemies();
        var boundingHiddenEnemies  = boundingEnemies.Item1;
        var boundingVisibleEnemies = boundingEnemies.Item2;

        boundingMarkers = boundingHiddenEnemies.ToList();
        boundingTargets = boundingVisibleEnemies.ToList();

        var currentMarkersLocations = boundingMarkers.Select(m => {
            return(m.GetLocation().To2D());
        });
        var currentTargetsLocations = boundingTargets.Select(m => {
            return(m.GetLocation().To2D());
        });

        enemyBounds =
            new ConvexPolygon(
                currentMarkersLocations.Concat(
                    currentTargetsLocations
                    ).ToList()
                );

        float       closestHiddenEnemyDistance = float.MaxValue;
        EnemyMarker closestHiddenEnemy         = null;

        foreach (var hiddenEnemy in boundingHiddenEnemies)
        {
            float currentDistanceFromPlanner =
                Vector2.Distance(
                    hiddenEnemy.GetLocation().To2D(),
                    planner.InfoGetCenterBottom().To2D()
                    );
            if (currentDistanceFromPlanner < closestHiddenEnemyDistance)
            {
                closestHiddenEnemy         = hiddenEnemy;
                closestHiddenEnemyDistance = currentDistanceFromPlanner;
            }
        }

        float       closestVisibleEnemyDistance = float.MaxValue;
        EnemyTarget closestVisibleEnemy         = null;

        foreach (var visibleEnemy in boundingVisibleEnemies)
        {
            float currentDistanceFromPlanner =
                Vector2.Distance(
                    visibleEnemy.GetLocation().To2D(),
                    planner.InfoGetCenterBottom().To2D()
                    );
            if (currentDistanceFromPlanner < closestVisibleEnemyDistance)
            {
                closestVisibleEnemy         = visibleEnemy;
                closestVisibleEnemyDistance = currentDistanceFromPlanner;
            }
        }

        if (closestVisibleEnemy != null)
        {
            ProcessVisibleEnemy(closestVisibleEnemy);
        }
        else if (closestHiddenEnemy != null)
        {
            ProcessHiddenEnemy(closestHiddenEnemy);
        }
        else
        {
            attackAction = AttackAction.NONE;
        }
    }