2022-07-09 18:38:54 +02:00

412 lines
14 KiB
C#

using Newtonsoft.Json.Linq;
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace Assets.Scripts
{
public class Equipment : Item
{
ItemPlace place;
Dictionary<string, int> attributes;
public Equipment(int luck) : base(luck)
{
attributes = new Dictionary<string, int>();
int numberOfAttributes = 1;
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();
loadImage();
}
public Equipment(JToken json) : base(json)
{
attributes = new Dictionary<string, int>();
place = (ItemPlace)Enum.Parse(typeof(ItemPlace), json["place"].ToString());
loadAttributes(json);
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<Player>().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<Player>().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 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 1:
if (i == 0)
{
itemName = "luck";
}
attributes.Add("LCK", Mathf.RoundToInt((float)(3 - (2 * i) + rand.Next(luck) * 0.1)));
break;
case 2:
if (i == 0)
{
itemName = "intelligence";
}
attributes.Add("INT", Mathf.RoundToInt((float)(3 - (2 * i) + rand.Next(luck) * 0.1)));
break;
case 3:
if (i == 0)
{
itemName = "dexterity";
}
attributes.Add("DEX", Mathf.RoundToInt((float)(3 - (2 * i) + rand.Next(luck) * 0.1)));
break;
case 4:
if (i == 0)
{
itemName = "strength";
}
attributes.Add("STR", Mathf.RoundToInt((float)(3 - (2 * i) + rand.Next(luck) * 0.1)));
break;
case 5:
if (i == 0)
{
itemName = "health";
}
attributes.Add("HP", Mathf.RoundToInt((float)(10 - (2 * i) + rand.Next(luck) * 0.1)));
break;
case 6:
if (i == 0)
{
itemName = "mana";
}
attributes.Add("MP", Mathf.RoundToInt((float)(10 - (2 * i) + rand.Next(luck) * 0.1)));
break;
case 7:
if (i == 0)
{
itemName = "health regeneration";
}
attributes.Add("HPR", Mathf.RoundToInt((float)(3 - (2 * i) + rand.Next(luck) * 0.1)));
break;
case 8:
if (i == 0)
{
itemName = "mana regeneration";
}
attributes.Add("MPR", Mathf.RoundToInt((float)(3 - (2 * i) + rand.Next(luck) * 0.1)));
break;
}
indexes[i] = index;
}
}
else
{
int bonus = rand.Next(luck);
attributes.Add("MPR", Mathf.RoundToInt((float)(3 + bonus * 0.1)));
attributes.Add("HPR", Mathf.RoundToInt((float)(3 + bonus * 0.1)));
attributes.Add("MP", Mathf.RoundToInt((float)(3 + bonus * 0.1)));
attributes.Add("HP", Mathf.RoundToInt((float)(3 + bonus * 0.1)));
attributes.Add("STR", Mathf.RoundToInt((float)(3 + bonus * 0.1)));
attributes.Add("DEX", Mathf.RoundToInt((float)(3 + bonus * 0.1)));
attributes.Add("INT", Mathf.RoundToInt((float)(3 + bonus * 0.1)));
attributes.Add("LCK", Mathf.RoundToInt((float)(3 + bonus * 0.1)));
}
}
private int calculateIndex(int[] indexes)
{
int counter = 0;
int index = 0;
while (true)
{
index = rand.Next(8) + 1;
counter = 0;
for (int j = 0; j < indexes.Length; j++)
{
if (indexes[j] == index)
{
counter++;
break;
}
}
if (counter == 0)
{
break;
}
}
return index;
}
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;
}
override
protected void loadImage()
{
switch (place)
{
case ItemPlace.LEFTHAND:
image = Resources.Load<Texture>("Equipment/" + GameObject.Find("Player").GetComponent<Player>().getClass().classname + "/Inv_LeftHand");
break;
case ItemPlace.RIGHTHAND:
image = Resources.Load<Texture>("Equipment/" + GameObject.Find("Player").GetComponent<Player>().getClass().classname + "/Inv_RightHand");
break;
case ItemPlace.HELMET:
image = Resources.Load<Texture>("Equipment/Inv_Helmet");
break;
case ItemPlace.BOOTS:
image = Resources.Load<Texture>("Equipment/Inv_Boots");
break;
case ItemPlace.SHOULDER:
image = Resources.Load<Texture>("Equipment/Inv_Shoulders");
break;
case ItemPlace.AMULET:
image = Resources.Load<Texture>("Equipment/Inv_Amulet");
break;
case ItemPlace.RING:
image = Resources.Load<Texture>("Equipment/Inv_Ring");
break;
case ItemPlace.ARMOR:
image = Resources.Load<Texture>("Equipment/Inv_Chest");
break;
}
}
public Dictionary<string, int> getAttributes()
{
return attributes;
}
override
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;
}
override
public string getInformation()
{
string text = "Stats:\r\n";
if (rarity == ItemRarity.LEGENDARY)
{
text = "All stats: +" + attributes["STR"];
}
else
{
foreach (string key in attributes.Keys)
{
text = text + key + ": +" + attributes[key] + "\r\n";
}
}
return text;
}
override
public void move(InventorySlot startDrag, Inventory inventory, InventorySlot endDrag)
{
bool isSwap = false;
if (endDrag.place != place && endDrag.place != ItemPlace.BAG)
{
return;
}
if (endDrag.place == ItemPlace.BAG)
{
Item endItem = endDrag.getItem(endDrag.getCurrentBag());
if (endItem != null)
{
if (((Equipment)endItem).getPlace() != startDrag.place)
{
return;
}
if (startDrag.place == ItemPlace.BAG)
{
startDrag.setItem(endItem, endDrag.getCurrentBag());
}
else
{
startDrag.setEquip((Equipment)endItem);
inventory.calculateStatBoost(attributes, false);
inventory.calculateStatBoost(((Equipment)endItem).getAttributes(), true);
}
isSwap = true;
}
endDrag.setItem(this, endDrag.getCurrentBag());
}
else
{
if (endDrag.getEquip() != null)
{
if (startDrag.place == ItemPlace.BAG)
{
startDrag.setItem(endDrag.getEquip(), startDrag.getCurrentBag());
isSwap = true;
inventory.calculateStatBoost(endDrag.getEquip().getAttributes(), false);
}
else
{
return;
}
}
inventory.calculateStatBoost(getAttributes(), true);
endDrag.setEquip(this);
}
if (!isSwap)
{
if (startDrag.place != ItemPlace.BAG)
{
inventory.calculateStatBoost(startDrag.getEquip().getAttributes(), false);
startDrag.removeEquip();
}
else
{
startDrag.removeItem();
}
}
}
}
}