Exemple #1
0
        /// <summary>
        /// Generate NPCs and Items for current game. Should be called by the master client.
        /// </summary>
        private void SetGenPointAndGenSceneObj()
        {
            if (!PhotonNetwork.isMasterClient)
            {
                Debug.LogError("Object generation must be operated by the master client.");
                return;
            }

            // Set the starting point of each players and generate the local players.
            int[] thiefGenPointSelector = new int[mapDataManager.ThiefGenertaionPoints.Count];
            for (int i = 0; i < thiefGenPointSelector.Length; i++)
            {
                thiefGenPointSelector[i] = i;
            }
            GlobalFunctions.RandomizeArray <int>(thiefGenPointSelector);

            for (int i = 0; i < NPCPrefabs.Count; i++)
            {
                randomNPCSelector.Add(i);
            }
            GlobalFunctions.RandomizeList <int>(randomNPCSelector);

            //Set the avatar of the thief player from NPC list and remove selected NPCs from the list.
            //And set the generation points of the thief players.
            for (int i = 0; i < thiefPlayers.Count; i++)
            {
                Hashtable cp = thiefPlayers[i].CustomProperties;
                cp[playerGenPointKey] = thiefGenPointSelector[i];
                cp[theifFigureIdxKey] = randomNPCSelector[0];
                thiefPlayers[i].SetCustomProperties(cp);

                randomNPCSelector.RemoveAt(0);
            }

            //Set the generation points of the detective players.
            for (int i = 0; i < detectivePlayers.Count; i++)
            {
                Hashtable cp = detectivePlayers[i].CustomProperties;
                cp[playerGenPointKey] = i;
                detectivePlayers[i].SetCustomProperties(cp);
            }

            // Generate Scene Objects(NPCs, Items).
            GenerateNPC();
            GenerateItems();

            // Game initiation ends, send ready signal to other players.
            PhotonExtends.SetRoomCustomProp(initializedKey, true);
        }
Exemple #2
0
        /// <summary>
        /// Generate items at generation points randomly.
        /// </summary>
        private void GenerateItems()
        {
            // Initialize variables related to items.
            int numOfItems        = itemPrefabs.Length;
            int numOfItemGenPoint = mapDataManager.ItemGenPoints.Count;

            if (numOfItemGenPoint > numOfItems)
            {
                Debug.LogError("There are fewer items than generation points.");
                return;
            }
            if (numOfItemGenPoint < targetItemNum)
            {
                Debug.LogError("The number of items to steal can't exceed the number of all items in the level.");
                return;
            }

            // Select the target item property and divide the item prefab list
            // to the group which has that property and the group which doesn't have.
            // issue: 카테고리 및 속성 번호를 수동으로 지정, 이후 enum 활용식 혹은 다른 방법 고안 필요.
            int category     = Random.Range(0, 3);
            int selectedProp = Random.Range(0, 3);

            switch (category)
            {
            case 0:
                Debug.Log("Selected property: " + (EItemColor)selectedProp);
                break;

            case 1:
                Debug.Log("Selected property: " + (EItemAge)selectedProp);
                break;

            case 2:
                Debug.Log("Selected property: " + (EItemUsage)selectedProp);
                break;
            }

            List <GameObject> ItemsHaveProp = new List <GameObject>();

            foreach (GameObject item in itemPrefabs)
            {
                ItemController itemController = item.GetComponent <ItemController>();
                //issue: Error
                if (itemController == null)
                {
                    Debug.LogError("The prefab name " + item.name + " in item list doesn't have ItemContorller.");
                    return;
                }

                switch (category)
                {
                case 0:
                    if (itemController.Color == (EItemColor)selectedProp)
                    {
                        ItemsHaveProp.Add(item);
                    }
                    break;

                case 1:
                    if (itemController.Age == (EItemAge)selectedProp)
                    {
                        ItemsHaveProp.Add(item);
                    }
                    break;

                case 2:
                    if (itemController.Usage == (EItemUsage)selectedProp)
                    {
                        ItemsHaveProp.Add(item);
                    }
                    break;
                }
            }


            // Select steal target/non-target items to generate;
            GlobalFunctions.RandomizeList <GameObject>(ItemsHaveProp);
            List <GameObject> targetItems = new List <GameObject>();

            for (int i = 0; i < targetItemNum; i++)
            {
                targetItems.Add(ItemsHaveProp[i]);
            }

            List <GameObject> nonTargetItems = new List <GameObject>();

            for (int i = 0; i < numOfItems; i++)
            {
                if (!targetItems.Contains(itemPrefabs[i]))
                {
                    nonTargetItems.Add(itemPrefabs[i]);
                }
            }
            GlobalFunctions.RandomizeList <GameObject>(nonTargetItems);


            // Select generation points where the target items are generated.
            int[] targetItemPointSelector = new int[numOfItemGenPoint];
            for (int i = 0; i < numOfItemGenPoint; i++)
            {
                targetItemPointSelector[i] = i;
            }
            GlobalFunctions.RandomizeArray <int>(targetItemPointSelector);

            List <int>         targetItemPoints      = new List <int>();
            List <ExhibitRoom> roomContainTargetItem = new List <ExhibitRoom>();

            for (int i = 0; i < numOfItemGenPoint; i++)
            {
                // Not allow the case in which multiple items in a same room.
                ExhibitRoom roomOfPoint = mapDataManager.ItemGenPoints[targetItemPointSelector[i]].GetComponentInParent <ExhibitRoom>();
                if (!roomContainTargetItem.Contains(roomOfPoint))
                {
                    targetItemPoints.Add(targetItemPointSelector[i]);
                    roomContainTargetItem.Add(roomOfPoint);
                    if (targetItemPoints.Count == targetItemNum)
                    {
                        break;
                    }
                }
            }
            if (targetItemPoints.Count != targetItemNum)
            {
                Debug.LogError("There are not enough rooms for item generation.");
                return;
            }

            // Generate items.
            for (int i = 0; i < numOfItemGenPoint; i++)
            {
                GameObject newItemPrefab;
                if (targetItemPoints.Contains(i))
                {
                    newItemPrefab = targetItems[0];
                    targetItems.RemoveAt(0);
                }
                else
                {
                    newItemPrefab = nonTargetItems[0];
                    nonTargetItems.RemoveAt(0);
                }

                GameObject newItem = PhotonNetwork.InstantiateSceneObject("Items\\" + newItemPrefab.name,
                                                                          mapDataManager.ItemGenPoints[i].ItemPos, Quaternion.identity, 0, null);
                PhotonView.Get(newItem).RPC("Init", PhotonTargets.All, i);
            }

            photonView.RPC("SetTargetItemList", PhotonTargets.All, targetItemPoints.ToArray());

            // Select put item point to activate in this game.
            Dictionary <int, List <int> > roomsInFloor = new Dictionary <int, List <int> >();

            for (int i = 0; i < mapDataManager.Rooms.Count; i++)
            {
                ExhibitRoom room = mapDataManager.Rooms[i];

                if (!roomsInFloor.ContainsKey(room.Floor))
                {
                    roomsInFloor[room.Floor] = new List <int>();
                }
                roomsInFloor[room.Floor].Add(i);
            }

            foreach (int floor in roomsInFloor.Keys)
            {
                int r               = Random.Range(0, roomsInFloor[floor].Count);
                int randRoomIdx     = roomsInFloor[floor][r];
                int randPutPointIdx = Random.Range(0, mapDataManager.Rooms[randRoomIdx].PutItemPoints.Length);
                //issue: 인덱스 오류남
                photonView.RPC("ActivatePutItemPointInRoom", PhotonTargets.All, randRoomIdx, randPutPointIdx);
            }
        }