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); } } }
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(); } }
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); }
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); }
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; }
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); }
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(); } }
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; }
public void DayOne(WorldState.SalesmanCharacterName buyedFrom) { itemsVisible.DayOne(); }
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); }
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; }
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); }
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); }