412 lines
14 KiB
C#
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();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|