예제 #1
0
    private void GoToQueue(WorldState.SalesmanCharacterName salesman)
    {
        Transform position;

        for (int i = 0; i < WorldState.instance.SalesmanList.Count; i++)
        {
            if (WorldState.instance.SalesmanList[i].GetComponent <Salesman>().characterName == salesman)
            {
                position = WorldState.instance.SalesmanList[i].GetComponent <Salesman>().InsertInQueueLastPosition(gameObject);
                if (position == GetComponent <Npc>().GetStartPosition()) //queue full
                {
                    //wait some seconds
                    StartCoroutine(WaitToQueueDrop());
                }
                else
                {
                    positionInQueue = WorldState.instance.SalesmanList[i].GetComponent <Salesman>().GetLastPositionInQueue() - 1; //if we enter here, salesman has included the npc in queue
                    if (buyState == BuyState.GOING_TO_SEE)
                    {
                        shopsChecked.Add(salesman);// we should add this later when the character gets the first position
                    }
                    //, but then we have to save this value somewhere, soo this is a easy solution
                    buyState = BuyState.ON_ROUTE;
                }
                GetComponent <Npc>().GoToPosition(position);
            }
        }
    }
예제 #2
0
파일: Npc.cs 프로젝트: franstuka/TFG-rep
    public void ChangeRelationshipsOnUsedFood(int qualityResult, WorldState.SalesmanCharacterName salesman) //0 bad, 1 medium, 2 good
    {
        if (salesman != WorldState.SalesmanCharacterName.START_ITEM)
        {
            switch (qualityResult)
            {
            case 0:
            {
                salesmanRelationships[salesman] += SocialBehaviour.negativeInteractionResult;
                break;
            }

            case 1:
            {
                salesmanRelationships[salesman] += SocialBehaviour.neutralInteractionResult;
                break;
            }

            case 2:
            {
                salesmanRelationships[salesman] += SocialBehaviour.positiveInteractionResult;
                break;
            }
            }
            WorldState.instance.hud.UpdateSalesmanRelationshipText();
        }
    }
예제 #3
0
    public void AddDetergentToStore(WorldState.SalesmanCharacterName buyedFrom)
    {
        float quality = Random.Range(MinItemQuality, MaxItemQuality);
        Item  item    = new Item(Item.ItemType.DETERGENT, DetergentBasePrice * (ProfitMargin + 100) / 100, quality,
                                 Mathf.RoundToInt(WorldState.DetergentBaseLifetime / 2 + WorldState.DetergentBaseLifetime * quality / 100), WorldState.DetergentBaseLifetime, buyedFrom);

        DetergentList.Add(item);
        itemsVisible.ChangeDetergentItemsDisplayed(true, DetergentList.Count);
    }
예제 #4
0
    public void AddWasherToStore(WorldState.SalesmanCharacterName buyedFrom)
    {
        float quality = Random.Range(MinItemQuality, MaxItemQuality);
        Item  item    = new Item(Item.ItemType.WASHER, WasherBasePrice * (ProfitMargin + 100) / 100, quality,
                                 Mathf.RoundToInt(WorldState.WasherBaseLifetime / 2 + WorldState.WasherBaseLifetime * quality / 100), WorldState.WasherBaseLifetime, buyedFrom);

        WasherList.Add(item);
        itemsVisible.ChangeWasherItemsDisplayed(true, WasherList.Count);
    }
예제 #5
0
 public Item(ItemType itemType, float itemValue, float itemQuality, int itemSpectedLifeTime, int itemBaseLifeTime, WorldState.SalesmanCharacterName boughtFrom)//params
 {
     this.itemType            = itemType;
     this.itemValue           = itemValue;
     this.itemQuality         = itemQuality;
     this.itemSpectedLifeTime = itemSpectedLifeTime;
     this.boughtFrom          = boughtFrom;
     this.itemBaseLifeTime    = itemBaseLifeTime;
     itemLifeTime             = 0;
 }
예제 #6
0
파일: Npc.cs 프로젝트: franstuka/TFG-rep
    public float GetSalesmanRelationships(WorldState.SalesmanCharacterName name)
    {
        for (int i = 0; i < WorldState.instance.SalesmanList.Count; i++)
        {
            if (name == WorldState.instance.SalesmanList[i].GetComponent <Salesman>().characterName)
            {
                return(salesmanRelationships[name]);
            }
        }

        Debug.LogError("Salesman " + name + " not found");
        return(0);
    }
예제 #7
0
파일: Npc.cs 프로젝트: franstuka/TFG-rep
 public void ChangeRelationshipsOnUsedDetergent(bool goodResult, WorldState.SalesmanCharacterName salesman)
 {
     if (salesman != WorldState.SalesmanCharacterName.START_ITEM)
     {
         if (goodResult)
         {
             salesmanRelationships[salesman] += SocialBehaviour.neutralInteractionResult;
         }
         else
         {
             salesmanRelationships[salesman] += SocialBehaviour.negativeInteractionResult;
         }
         WorldState.instance.hud.UpdateSalesmanRelationshipText();
     }
 }
예제 #8
0
    public Item(ItemType itemType)//for random starting items
    {
        this.itemType = itemType;
        itemValue     = 0;
        itemQuality   = Random.Range(0f, 100f);
        switch (itemType)
        {
        case ItemType.DETERGENT:
        {
            itemSpectedLifeTime = WorldState.DetergentBaseLifetime;
            itemBaseLifeTime    = WorldState.DetergentBaseLifetime;
            itemLifeTime        = Mathf.RoundToInt(itemSpectedLifeTime * Random.Range(0f, 1f));
            break;
        }

        case ItemType.FOOD:
        {
            itemSpectedLifeTime = WorldState.FoodBaseLifetime;
            itemBaseLifeTime    = WorldState.FoodBaseLifetime;

            itemLifeTime = Mathf.RoundToInt(itemSpectedLifeTime * Random.Range(0f, 1f));
            break;
        }

        case ItemType.FRIDGE:
        {
            itemSpectedLifeTime = WorldState.FridgeBaseLifetime;
            itemBaseLifeTime    = WorldState.FridgeBaseLifetime;
            itemLifeTime        = Mathf.RoundToInt(itemSpectedLifeTime * Random.Range(0f, 1f));
            break;
        }

        case ItemType.WASHER:
        {
            itemSpectedLifeTime = WorldState.WasherBaseLifetime;
            itemBaseLifeTime    = WorldState.WasherBaseLifetime;
            itemLifeTime        = Mathf.RoundToInt(itemSpectedLifeTime * Random.Range(0f, 1f));
            break;
        }

        default:
        {
            Debug.LogError("On generate initial items, item don't recognised");
            break;
        }
        }
        boughtFrom = WorldState.SalesmanCharacterName.START_ITEM;
    }
예제 #9
0
 public void DayOne(WorldState.SalesmanCharacterName buyedFrom)
 {
     itemsVisible.DayOne();
 }
예제 #10
0
    public float ResupplyShop(float money, ref ShopInventory inventory, WorldState.SalesmanCharacterName salesman)
    {
        //we are going to resupply if difference between a member and his min is less than maxPercentageDifference
        //the salesman will try to have all the items in shop buying the less percentage item,
        //we have to check that salesman don't buy only food and detergent, saving for get aswell fridges and washers
        float foodPercentage      = (float)inventory.FoodList.Count / maxFoodToBuy;
        float detergentPercentage = (float)inventory.DetergentList.Count / maxDetergentToBuy;
        float frigdePercentage    = (float)inventory.FridgeList.Count / maxFridgesToBuy;
        float washerPercentage    = (float)inventory.WasherList.Count / maxWashersToBuy;
        bool  end = false;

        while (!end)
        {
            if (money <= minMoneyToBuy)
            {
                end = true;
            }
            else if (money <= minMoneyToBuyFrigdeAndWasher)
            {
                if (foodPercentage < detergentPercentage)
                {
                    if (foodPercentage < (frigdePercentage + maxPercentageDifference) && foodPercentage < (washerPercentage + maxPercentageDifference))
                    {
                        inventory.AddFoodToStore(salesman);
                        money         -= ShopInventory.FoodBasePrice;
                        foodPercentage = (float)inventory.FoodList.Count / maxFoodToBuy;
                    }
                    else //fridges or washers percentage it's so low
                    {
                        end = true;
                    }
                }
                else if (detergentPercentage < (frigdePercentage + maxPercentageDifference) && detergentPercentage < (washerPercentage + maxPercentageDifference))
                {
                    inventory.AddDetergentToStore(salesman);
                    money -= ShopInventory.DetergentBasePrice;
                    detergentPercentage = (float)inventory.DetergentList.Count / maxDetergentToBuy;
                }
                else //fridges or washers percentage it's so low
                {
                    end = true;
                }
            }
            else //get who's the lowest percentage
            {
                if (foodPercentage == 1 && foodPercentage == detergentPercentage && frigdePercentage == washerPercentage && frigdePercentage == detergentPercentage)
                {
                    //shop full
                    end = true;
                }
                else
                {
                    if (foodPercentage <= detergentPercentage && foodPercentage <= frigdePercentage && foodPercentage <= washerPercentage)
                    {
                        inventory.AddFoodToStore(salesman);
                        money         -= ShopInventory.FoodBasePrice;
                        foodPercentage = (float)inventory.FoodList.Count / maxFoodToBuy;
                    }
                    else if (detergentPercentage <= foodPercentage && detergentPercentage <= frigdePercentage && detergentPercentage <= washerPercentage)
                    {
                        inventory.AddDetergentToStore(salesman);
                        money -= ShopInventory.DetergentBasePrice;
                        detergentPercentage = (float)inventory.DetergentList.Count / maxDetergentToBuy;
                    }
                    else if (frigdePercentage <= detergentPercentage && frigdePercentage <= foodPercentage && frigdePercentage <= washerPercentage)
                    {
                        inventory.AddFrigdeToStore(salesman);
                        money           -= ShopInventory.FrigdeBasePrice;
                        frigdePercentage = (float)inventory.FridgeList.Count / maxFridgesToBuy;
                    }
                    else if (washerPercentage <= detergentPercentage && washerPercentage <= frigdePercentage && washerPercentage <= foodPercentage)
                    {
                        inventory.AddWasherToStore(salesman);
                        money           -= ShopInventory.WasherBasePrice;
                        washerPercentage = (float)inventory.WasherList.Count / maxWashersToBuy;
                    }
                }
            }
        }

        return(money);
    }
예제 #11
0
    IEnumerator BuyShop()
    {
        yield return(new WaitForSeconds(WaitTimeToBuy));

        WorldState.SalesmanCharacterName searchedSalesman = shopToBuy[0];
        int  salesmanNum = 0;
        int  searchPos   = 0;
        Item itemToBuy;
        bool allBought = true;

        //search the salesman index
        while (salesmanNum < WorldState.instance.SalesmanList.Count)
        {
            if (WorldState.instance.SalesmanList[salesmanNum].GetComponent <Salesman>().characterName == shopToBuy[0])
            {
                break;
            }
            else
            {
                salesmanNum++;
            }
        }

        //buy
        while (searchPos < shopToBuy.Count)
        {
            if (shopToBuy[searchPos] == searchedSalesman) //buy in this shop
            {
                //search item to buy
                itemToBuy = null;
                switch (itemToBuyType[searchPos])
                {
                case Item.ItemType.FRIDGE:
                {
                    if (WorldState.instance.SalesmanList[salesmanNum].GetComponent <ShopInventory>().FridgeList.Count != 0)
                    {
                        itemToBuy = WorldState.instance.SalesmanList[salesmanNum].GetComponent <ShopInventory>().FridgeList[0];
                    }
                    break;
                }

                case Item.ItemType.WASHER:
                {
                    if (WorldState.instance.SalesmanList[salesmanNum].GetComponent <ShopInventory>().WasherList.Count != 0)
                    {
                        itemToBuy = WorldState.instance.SalesmanList[salesmanNum].GetComponent <ShopInventory>().WasherList[0];
                    }
                    break;
                }

                case Item.ItemType.FOOD:
                {
                    if (WorldState.instance.SalesmanList[salesmanNum].GetComponent <ShopInventory>().FoodList.Count != 0)
                    {
                        itemToBuy = WorldState.instance.SalesmanList[salesmanNum].GetComponent <ShopInventory>().FoodList[0];
                    }
                    break;
                }

                case Item.ItemType.DETERGENT:
                {
                    if (WorldState.instance.SalesmanList[salesmanNum].GetComponent <ShopInventory>().DetergentList.Count != 0)
                    {
                        itemToBuy = WorldState.instance.SalesmanList[salesmanNum].GetComponent <ShopInventory>().DetergentList[0];
                    }
                    break;
                }

                default:
                {
                    Debug.LogError("Item out of list");
                    break;
                }
                }
                //test if have an item avaible
                if (itemToBuy != null)
                {
                    if (GetComponent <Npc>().money >= itemToBuy.itemValue)
                    {
                        //buy
                        Debug.Log(gameObject.name + " has bought " + itemToBuy.itemType + ".");
                        WorldState.instance.hud.UpdateDebugText(gameObject.name + " has bought " + itemToBuy.itemType + ".");
                        GetComponent <Npc>().money -= itemToBuy.itemValue;
                        GetComponent <Inventory>().AddNewItem(itemToBuy);
                        WorldState.instance.SalesmanList[salesmanNum].GetComponent <ShopInventory>().ItemBought(itemToBuy);
                        shopToBuy.RemoveAt(searchPos);
                        itemToBuyType.RemoveAt(searchPos);
                        WorldState.instance.hud.UpdateInventoryAndMoneyHud();
                    }
                    else
                    {
                        Debug.Log(gameObject.name + " not enought money");
                        WorldState.instance.hud.UpdateDebugText(gameObject.name + " not enought money.");
                        shopToBuy.RemoveAt(searchPos);
                        itemToBuyType.RemoveAt(searchPos);
                        allBought = false;
                    }
                }
                else
                {
                    WorldState.instance.hud.UpdateDebugText(gameObject.name + " item not avaible.");
                    Debug.Log(gameObject.name + " item not avaible");
                    allBought = false;
                    shopToBuy.RemoveAt(searchPos);
                    itemToBuyType.RemoveAt(searchPos);
                }
            }
            else //next
            {
                searchPos++;
            }
        }
        //move to exit
        gameObject.GetComponent <Npc>().GoToPosition(WorldState.instance.SalesmanList[salesmanNum].GetComponent <Salesman>().GetShopExitPoint());
        WorldState.instance.SalesmanList[salesmanNum].GetComponent <Salesman>().UpdateQueue();

        //has buy all?
        if (allBought && shopToBuy.Count == 0) //all bought in all
        {
            Debug.Log(gameObject.name + " has bought all");
            buyState = BuyState.END;
            GetComponent <Npc>().CheckIfEndedAll();
        }
        else if (allBought) //all bought in this shop
        {
            Debug.Log(gameObject.name + " has bought all in this shop");
            WorldState.instance.hud.UpdateDebugText(gameObject.name + " has bought all in this shop.");
            buyState = BuyState.PLANNED;
        }
        else
        {
            if (MakeBuyDecision())
            {
                buyState = BuyState.END; //has not enought money or stock
                GetComponent <Npc>().CheckIfEndedAll();
            }
            else
            {
                buyState = BuyState.PLANNED;
            }
        }
        coroutineStarted = false;
    }
예제 #12
0
    public WorldState.SalesmanCharacterName GetPreferredSalesman() //for hud
    {
        WorldState.SalesmanCharacterName betterScore = WorldState.SalesmanCharacterName.START_ITEM;
        float bestScore = float.MinValue;
        float auxScore  = float.MinValue;

        for (int i = 0; i < WorldState.instance.SalesmanList.Count; i++)
        {
            if (WorldState.instance.SalesmanList[i].GetComponent <Salesman>().GetShopState() == Salesman.ShopState.CLOSED) //shop closed
            {
                continue;
            }

            auxScore = 0;
            switch (priceRelevance)
            {
            case PriceRelevance.NONE:
            {
                break;
            }

            case PriceRelevance.MEDIUM:
            {
                if (buyPreference == BuyPreference.BALANCE && WorldState.instance.SalesmanList[i].GetComponent <Salesman>().buySell == Salesman.BuySell.BALANCE)
                {
                    auxScore = mediumPriceRelevanceBonusScore;
                }
                else if (buyPreference == BuyPreference.CHEAP && WorldState.instance.SalesmanList[i].GetComponent <Salesman>().buySell == Salesman.BuySell.CHEAP)
                {
                    auxScore = mediumPriceRelevanceBonusScore;
                }
                else if (buyPreference == BuyPreference.QUALITY && WorldState.instance.SalesmanList[i].GetComponent <Salesman>().buySell == Salesman.BuySell.QUALITY)
                {
                    auxScore = mediumPriceRelevanceBonusScore;
                }
                break;
            }

            case PriceRelevance.IMPORTANT:
            {
                if (buyPreference == BuyPreference.BALANCE && WorldState.instance.SalesmanList[i].GetComponent <Salesman>().buySell == Salesman.BuySell.BALANCE)
                {
                    auxScore = highPriceRelevanceBonusScore;
                }
                else if (buyPreference == BuyPreference.CHEAP && WorldState.instance.SalesmanList[i].GetComponent <Salesman>().buySell == Salesman.BuySell.CHEAP)
                {
                    auxScore = highPriceRelevanceBonusScore;
                }
                else if (buyPreference == BuyPreference.QUALITY && WorldState.instance.SalesmanList[i].GetComponent <Salesman>().buySell == Salesman.BuySell.QUALITY)
                {
                    auxScore = highPriceRelevanceBonusScore;
                }
                else
                {
                    auxScore = -mediumPriceRelevanceBonusScore;
                }
                break;
            }
            }

            if (GetComponent <Npc>().GetSalesmanRelationships(WorldState.instance.SalesmanList[i].GetComponent <Salesman>().characterName) >= 0)
            {
                auxScore += GetComponent <SocialBehaviour>().GetInteractionModifiers(WorldState.instance.SalesmanList[i].GetComponent <Personality>().npcPersonality)
                            * GetComponent <Npc>().GetSalesmanRelationships(WorldState.instance.SalesmanList[i].GetComponent <Salesman>().characterName)
                            + GetComponent <SocialBehaviour>().GetInteractionModifiers(WorldState.instance.SalesmanList[i].GetComponent <Personality>().npcPersonality); //this line is for solve the initial state
            }
            else //negative relationship, the modifier must divide because is a negative value
            {
                auxScore += GetComponent <Npc>().GetSalesmanRelationships(WorldState.instance.SalesmanList[i].GetComponent <Salesman>().characterName) /
                            GetComponent <SocialBehaviour>().GetInteractionModifiers(WorldState.instance.SalesmanList[i].GetComponent <Personality>().npcPersonality);
            }
            if (auxScore > bestScore)
            {
                bestScore   = auxScore;
                betterScore = WorldState.instance.SalesmanList[i].GetComponent <Salesman>().characterName;
            }
        }

        if (betterScore == WorldState.SalesmanCharacterName.START_ITEM)
        {
            Debug.LogError("Salesman returned is grong");
        }

        return(betterScore);
    }
예제 #13
0
    private WorldState.SalesmanCharacterName GetBetterSalesman()
    {
        WorldState.SalesmanCharacterName betterScore = WorldState.SalesmanCharacterName.START_ITEM;
        float bestScore  = float.MinValue;
        float auxScore   = float.MinValue;
        bool  wasVisited = false;

        for (int i = 0; i < WorldState.instance.SalesmanList.Count && WorldState.instance.SalesmanList.Count > shopsChecked.Count; i++)
        {
            if (WorldState.instance.SalesmanList[i].GetComponent <Salesman>().GetShopState() == Salesman.ShopState.CLOSED) //shop closed
            {
                continue;
            }

            wasVisited = false;
            for (int j = 0; j < shopsChecked.Count; j++) //check if this salesman was visited
            {
                if (shopsChecked[j] == WorldState.instance.SalesmanList[i].GetComponent <Salesman>().characterName)
                {
                    wasVisited = true;
                    break;
                }
            }
            if (wasVisited)
            {
                continue;
            }

            //Get price preference score
            auxScore = 0;
            switch (priceRelevance)
            {
            case PriceRelevance.NONE:
            {
                break;
            }

            case PriceRelevance.MEDIUM:
            {
                if (buyPreference == BuyPreference.BALANCE && WorldState.instance.SalesmanList[i].GetComponent <Salesman>().buySell == Salesman.BuySell.BALANCE)
                {
                    auxScore = mediumPriceRelevanceBonusScore;
                }
                else if (buyPreference == BuyPreference.CHEAP && WorldState.instance.SalesmanList[i].GetComponent <Salesman>().buySell == Salesman.BuySell.CHEAP)
                {
                    auxScore = mediumPriceRelevanceBonusScore;
                }
                else if (buyPreference == BuyPreference.QUALITY && WorldState.instance.SalesmanList[i].GetComponent <Salesman>().buySell == Salesman.BuySell.QUALITY)
                {
                    auxScore = mediumPriceRelevanceBonusScore;
                }
                break;
            }

            case PriceRelevance.IMPORTANT:
            {
                if (buyPreference == BuyPreference.BALANCE && WorldState.instance.SalesmanList[i].GetComponent <Salesman>().buySell == Salesman.BuySell.BALANCE)
                {
                    auxScore = highPriceRelevanceBonusScore;
                }
                else if (buyPreference == BuyPreference.CHEAP && WorldState.instance.SalesmanList[i].GetComponent <Salesman>().buySell == Salesman.BuySell.CHEAP)
                {
                    auxScore = highPriceRelevanceBonusScore;
                }
                else if (buyPreference == BuyPreference.QUALITY && WorldState.instance.SalesmanList[i].GetComponent <Salesman>().buySell == Salesman.BuySell.QUALITY)
                {
                    auxScore = highPriceRelevanceBonusScore;
                }
                else
                {
                    auxScore = -mediumPriceRelevanceBonusScore;
                }
                break;
            }
            }

            //get final score adding the relationship factor
            if (GetComponent <Npc>().GetSalesmanRelationships(WorldState.instance.SalesmanList[i].GetComponent <Salesman>().characterName) >= 0)
            {
                auxScore += GetComponent <SocialBehaviour>().GetInteractionModifiers(WorldState.instance.SalesmanList[i].GetComponent <Personality>().npcPersonality)
                            * GetComponent <Npc>().GetSalesmanRelationships(WorldState.instance.SalesmanList[i].GetComponent <Salesman>().characterName) +
                            +GetComponent <SocialBehaviour>().GetInteractionModifiers(WorldState.instance.SalesmanList[i].GetComponent <Personality>().npcPersonality); //this line is for solve the initial state
            }
            else //negative relationship, the modifier must divide because is a negative value
            {
                auxScore += GetComponent <Npc>().GetSalesmanRelationships(WorldState.instance.SalesmanList[i].GetComponent <Salesman>().characterName) /
                            GetComponent <SocialBehaviour>().GetInteractionModifiers(WorldState.instance.SalesmanList[i].GetComponent <Personality>().npcPersonality);
            }
            if (auxScore > bestScore)
            {
                bestScore   = auxScore;
                betterScore = WorldState.instance.SalesmanList[i].GetComponent <Salesman>().characterName;
            }
        }

        if (betterScore == WorldState.SalesmanCharacterName.START_ITEM)
        {
            Debug.LogError("Salesman returned is grong");
        }

        return(betterScore);
    }