예제 #1
0
    public static DataInfoFinder GetDataInfoLocationFromID(int x, int y, int distantion, SaveLoadData.TypePrefabs typeObserver, string id_Observer)
    {
        int            distantionLocalObjects = 50;
        DataInfoFinder finder = new DataInfoFinder();

        //---------------------------- CASH
        if (IsUseCashFinderPriorityNPC)
        {
            var listFindedLocalObjectsID = Storage.ReaderWorld.CollectionInfoID
                                           .Where(p =>
            {
                Vector2 posT     = p.Value.Data.Position;
                int distToTatget = Math.Max(Math.Abs(x - (int)posT.x), Math.Abs(y - (int)posT.y));
                return(distToTatget <= distantionLocalObjects);
            })
                                           .Select(p => p.Key)
                                           .ToList();
        }
        //-----------------------------------

        var listPowers = Storage.ReaderWorld.CollectionInfoID
                         .Where(p => {
            //Vector2 posT = p.Value.Data.Position;
            Vector2 posT     = p.Value.FiledPos;
            int distToTatget = Math.Max(Math.Abs(x - (int)posT.x), Math.Abs(y - (int)posT.y));
            return(distToTatget <= distantion);
        })
                         .Select(p => {
            Vector2 posT             = p.Value.FiledPos;
            DataInfoFinder resFinder = new DataInfoFinder()
            {
                DistantionToTarget = Math.Max(Math.Abs(x - (int)posT.x), Math.Abs(y - (int)posT.y)),
                ResultData         = p.Value.Data,
                PowerTarget        = Storage.Person.GetPriorityPowerByJoin(typeObserver, p.Value.Data.TypePrefab)
            };
            return(resFinder);
        })
                         .ToList();
        string id;
        int    power     = 0;
        int    powerDist = 0;

        foreach (DataInfoFinder objDataPower in listPowers)
        {
            id = Helper.GetID(objDataPower.ResultData.NameObject);
            //string id = objDataPower.ResultData;
            if (id == id_Observer)
            {
                continue;
            }

            power     = objDataPower.PowerTarget;
            powerDist = (distantion - objDataPower.DistantionToTarget) * 3;
            power    += powerDist;

            if (finder.ResultPowerData.ContainsKey(id))
            {
                Debug.Log("######### Error finder.ResultPowerData.ContainsKey(id)");
            }
            else
            {
                finder.ResultPowerData.Add(id, power);
            }
        }

        int    priorityIndex = 0;
        string selId         = string.Empty;

        foreach (var item in finder.ResultPowerData)
        {
            if (priorityIndex < item.Value)
            {
                priorityIndex = item.Value;
                selId         = item.Key;
            }
        }
        if (!string.IsNullOrEmpty(selId))
        {
            if (Storage.ReaderWorld.CollectionInfoID.ContainsKey(selId))
            {
                finder.ResultData = Storage.ReaderWorld.CollectionInfoID[selId].Data;
            }
        }


        return(finder);
    }
예제 #2
0
    //===============================================================================
    //public static DataInfoFinder GetDataInfoLocation(Vector2Int fieldPosit, int distantion, PriorityFinder priority, string id_Observer, SaveLoadData.TypePrefabs typeObserver, string id_PrevousTarget)
    //public static DataInfoFinder GetDataInfoLocation(Vector2Int fieldPosit, int distantion, string id_Observer, SaveLoadData.TypePrefabs typeObserver, string id_PrevousTarget, bool isFoor)
    public static DataInfoFinder GetDataInfoLocation(int xPos, int yPos, int distantion, string id_Observer, SaveLoadData.TypePrefabs typeObserver, string id_PrevousTarget, bool isFoor)
    {
        DataInfoFinder finder = new DataInfoFinder();
        Dictionary <string, ModelNPC.ObjectData> locationObjects = new Dictionary <string, ModelNPC.ObjectData>();

        int startX = xPos - distantion;
        int startY = yPos - distantion;
        int endX   = xPos + distantion;
        int endY   = yPos + distantion;

        if (startX < 1)
        {
            startX = 1;
        }
        if (startY < 1)
        {
            startY = 1;
        }
        string id        = "";
        int    power     = 0;
        int    powerDist = 0;

        for (int y = startY; y < endY; y++)
        {
            for (int x = startX; x < endX; x++)
            {
                string field = Helper.GetNameField(x, y);
                List <ModelNPC.ObjectData> objects = GetObjectsDataFromGridTest(field); //TEST
                foreach (ModelNPC.ObjectData objData in objects)
                {
                    id = Helper.GetID(objData.NameObject);
                    if (id == id_Observer || id == id_PrevousTarget)
                    {
                        continue;
                    }

                    //int power = Storage.Person.GetPriorityPower(objData, priority);
                    if (isFoor)
                    {
                        power = Storage.GenWorld.GetPriorityPowerByJoin(typeObserver, objData.TypePrefab);
                    }
                    else
                    {
                        power = Storage.Person.GetPriorityPowerByJoin(typeObserver, objData.TypePrefab);
                    }

                    //~TEST PRIORITY~
                    //powerDist = (distantion - Math.Max(Math.Abs(xPos - x), Math.Abs(yPos - y))) * 3;
                    //power += powerDist;

                    if (!finder.ResultPowerData.ContainsKey(id))
                    {
                        finder.ResultPowerData.Add(id, power);
                        if (!locationObjects.ContainsKey(id))
                        {
                            locationObjects.Add(id, objData);
                        }
                    }
                }
            }
        }

        string        selId     = string.Empty;
        int           top       = 20; // 10; //~TEST PRIORITY~
        List <string> listTopId = new List <string>();

        foreach (var item in finder.ResultPowerData.OrderByDescending(p => p.Value))
        {
            listTopId.Add(item.Key);
            if (listTopId.Count > top) //top
            {
                break;
            }
        }
        if (listTopId.Count() > 0)
        {
            int indRnd = UnityEngine.Random.Range(0, listTopId.Count() - 1);
            selId = listTopId[indRnd];
        }
        //--------------------------
        if (!string.IsNullOrEmpty(selId))
        {
            finder.ResultData = locationObjects[selId];
        }
        return(finder);
    }