using Newtonsoft.Json.Linq; using System; using System.Collections; using System.Collections.Generic; using UnityEngine; namespace Assets.Scripts { public class Item { private System.Random rand = new System.Random(); ItemRarity rarity; ItemPlace place; string itemName; Dictionary attributes; public Texture image; public Color32 rarityColor; public Item(int luck) { attributes = new Dictionary(); luck = luck + GameObject.Find("Inventory").GetComponent().getEquipmentBonus()["LCK"]; int numberOfAttributes = 1; calculateRarity(luck); if (rarity > ItemRarity.COMMON) { numberOfAttributes = 2; } if (rarity > ItemRarity.RARE) { numberOfAttributes = 3; } if (rarity == ItemRarity.LEGENDARY) { numberOfAttributes = 0; } calculateAttributes(luck, numberOfAttributes); place = (ItemPlace)rand.Next(8); editName(); setColor(); loadImage(); } public Item(JToken json) { attributes = new Dictionary(); rarity = (ItemRarity)Enum.Parse(typeof(ItemRarity), json["rarity"].ToString()); place = (ItemPlace)Enum.Parse(typeof(ItemPlace), json["place"].ToString()); itemName = json["itemName"].ToString(); loadAttributes(json); setColor(); loadImage(); } private void loadAttributes(JToken json) { if (json["MPR"] != null) { attributes.Add("MPR", int.Parse(json["MPR"].ToString())); } if (json["HPR"] != null) { attributes.Add("HPR", int.Parse(json["HPR"].ToString())); } if (json["MP"] != null) { attributes.Add("MP", int.Parse(json["MP"].ToString())); } if (json["HP"] != null) { attributes.Add("HP", int.Parse(json["HP"].ToString())); } if (json["STR"] != null) { attributes.Add("STR", int.Parse(json["STR"].ToString())); } if (json["DEX"] != null) { attributes.Add("DEX", int.Parse(json["DEX"].ToString())); } if (json["INT"] != null) { attributes.Add("INT", int.Parse(json["INT"].ToString())); } if (json["LCK"] != null) { attributes.Add("LCK", int.Parse(json["LCK"].ToString())); } } private void editName() { string replacement = ""; if (place == ItemPlace.LEFTHAND) { switch (GameObject.Find("Player").GetComponent().getClass().classname) { case "Warrior": replacement = "greatshield"; break; case "Thief": replacement = "shield"; break; case "Mage": replacement = "orb"; break; } } else if (place == ItemPlace.RIGHTHAND) { switch (GameObject.Find("Player").GetComponent().getClass().classname) { case "Warrior": replacement = "sword"; break; case "Thief": replacement = "dagger"; break; case "Mage": replacement = "wand"; break; } } if (itemName != null) { if (replacement.Length > 0) { itemName = rarity.ToString() + " " + replacement + " of " + itemName; } else { itemName = rarity.ToString() + " " + place.ToString() + " of " + itemName; } } else { if (replacement.Length > 0) { itemName = rarity.ToString() + " " + replacement; } else { itemName = rarity.ToString() + " " + place.ToString(); } } itemName = itemName.ToLower(); itemName = char.ToUpper(itemName[0]) + itemName.Substring(1); } private void calculateRarity(int luck) { int number = rand.Next(100); if (number + luck < 70) { rarity = ItemRarity.COMMON; } else if (number + luck >= 70 && number + luck < 95) { rarity = ItemRarity.RARE; } else if (number + luck >= 95 && number + luck < 120) { rarity = ItemRarity.EPIC; } else if (number + luck >= 120) { rarity = ItemRarity.LEGENDARY; } } private void setColor() { switch (rarity) { case ItemRarity.COMMON: rarityColor = new Color32(0, 255, 20, 255); break; case ItemRarity.RARE: rarityColor = new Color32(0, 100, 255, 255); break; case ItemRarity.EPIC: rarityColor = new Color32(255, 0, 230, 255); break; case ItemRarity.LEGENDARY: rarityColor = new Color32(255, 230, 0, 255); break; } } private void calculateAttributes(int luck, int numberOfAttributes) { if (numberOfAttributes != 0) { int[] indexes = new int[numberOfAttributes]; int index; for (int i = 0; i < numberOfAttributes; i++) { index = calculateIndex(indexes); switch (index) { case 0: if (i == 0) { itemName = "luck"; } attributes.Add("LCK", Mathf.RoundToInt((float)(3 - (2 * i) + luck * 0.1))); break; case 1: if (i == 0) { itemName = "intelligence"; } attributes.Add("INT", Mathf.RoundToInt((float)(3 - (2 * i) + luck * 0.1))); break; case 2: if (i == 0) { itemName = "dexterity"; } attributes.Add("DEX", Mathf.RoundToInt((float)(3 - (2 * i) + luck * 0.1))); break; case 3: if (i == 0) { itemName = "strength"; } attributes.Add("STR", Mathf.RoundToInt((float)(3 - (2 * i) + luck * 0.1))); break; case 4: if (i == 0) { itemName = "health"; } attributes.Add("HP", Mathf.RoundToInt((float)(10 - (2 * i) + luck * 0.1))); break; case 5: if (i == 0) { itemName = "mana"; } attributes.Add("MP", Mathf.RoundToInt((float)(10 - (2 * i) + luck * 0.1))); break; case 6: if (i == 0) { itemName = "health regeneration"; } attributes.Add("HPR", Mathf.RoundToInt((float)(3 - (2 * i) + luck * 0.1))); break; case 7: if (i == 0) { itemName = "mana regeneration"; } attributes.Add("MPR", Mathf.RoundToInt((float)(3 - (2 * i) + luck * 0.1))); break; } indexes[i] = index; } } else { attributes.Add("MPR", Mathf.RoundToInt((float)(3 + luck * 0.1))); attributes.Add("HPR", Mathf.RoundToInt((float)(3 + luck * 0.1))); attributes.Add("MP", Mathf.RoundToInt((float)(3 + luck * 0.1))); attributes.Add("HP", Mathf.RoundToInt((float)(3 + luck * 0.1))); attributes.Add("STR", Mathf.RoundToInt((float)(3 + luck * 0.1))); attributes.Add("DEX", Mathf.RoundToInt((float)(3 + luck * 0.1))); attributes.Add("INT", Mathf.RoundToInt((float)(3 + luck * 0.1))); attributes.Add("LCK", Mathf.RoundToInt((float)(3 + luck * 0.1))); } } private int calculateIndex(int[] indexes) { int counter = 0; int index = 0; while (true) { index = rand.Next(8); counter = 0; for (int j = 0; j < indexes.Length; j++) { if (indexes[j] == index) { counter++; break; } } if (counter == 0) { break; } } return index; } public string getName() { return itemName; } public ItemPlace getPlace() { return place; } public string getDisplayText() { string displayText = ""; displayText = displayText + itemName + "\r\n"; if (rarity == ItemRarity.LEGENDARY) { displayText = displayText + "All attributes: +" + attributes["STR"]; } else { foreach (string key in attributes.Keys) { displayText = displayText + key + ": +" + attributes[key] + "\r\n"; } } return displayText; } private void loadImage() { switch (place) { case ItemPlace.LEFTHAND: image = Resources.Load("Equipment/" + GameObject.Find("Player").GetComponent().getClass().classname + "/Inv_LeftHand"); break; case ItemPlace.RIGHTHAND: image = Resources.Load("Equipment/" + GameObject.Find("Player").GetComponent().getClass().classname + "/Inv_RightHand"); break; case ItemPlace.HELMET: image = Resources.Load("Equipment/Inv_Helmet"); break; case ItemPlace.BOOTS: image = Resources.Load("Equipment/Inv_Boots"); break; case ItemPlace.SHOULDER: image = Resources.Load("Equipment/Inv_Shoulders"); break; case ItemPlace.AMULET: image = Resources.Load("Equipment/Inv_Amulet"); break; case ItemPlace.RING: image = Resources.Load("Equipment/Inv_Ring"); break; case ItemPlace.ARMOR: image = Resources.Load("Equipment/Inv_Chest"); break; } } public Dictionary getAttributes() { return attributes; } public ItemRarity getRarity() { return rarity; } public string saveGame() { string result = ""; int counter = 0; result = result + FileHandler.generateJSON("rarity", "\"" + rarity + "\"") + ",\r\n"; result = result + FileHandler.generateJSON("place", "\"" + place + "\"") + ",\r\n"; result = result + FileHandler.generateJSON("itemName", "\"" + itemName + "\"") + ",\r\n"; foreach (string key in attributes.Keys) { result = result + FileHandler.generateJSON(key, attributes[key]); if (counter < attributes.Count - 1) { result = result + ",\r\n"; } counter++; } return result; } } }