Cow_Life_Sim_RPG/Items/Item.gd

402 lines
12 KiB
GDScript

extends RefCounted
class_name Item
enum types {Juice, Ash, Basket, Trumpet, Puppet, Toy, Plushie, Reformable
, Unknottable, Unjuiceable, Unburnable, Candy}
enum modifications {Sugared, Caramelized, Knotted, Wet, Concentrated, Grubby}
var itemName:String
var itemDescription:String
var itemSprite
var additionalSprites = []
var itemTypes = []
var itemModifications = []
var cachedModifiedSprite = null
var cachedModifications = []
var value:int
var weight:float
var hardness:int
var edibility:int
var basketPower:int
var basketabilityDifficulty:int
var flammability:int
func _init():
initialize_stats()
func remove_modification(modification:modifications):
itemModifications.erase(modification)
func set_modification(modification:modifications):
var wasWet = false
if modifications.Wet in itemModifications:
wasWet = true
if modification == modifications.Wet:
if !wasWet:
itemModifications.append(modification)
return
if modification == modifications.Knotted and types.Unknottable in itemTypes:
return
itemModifications = [modification]
if wasWet:
itemModifications.append(modifications.Wet)
func get_sprite(modified:bool = true):
assert(itemSprite != null)
var modifiedImage = itemSprite.get_image()
if modified:
var sameModifications = true
if cachedModifiedSprite == null or cachedModifications.size() != itemModifications.size():
sameModifications = false
else:
for i in range(cachedModifications.size()):
if cachedModifications[i] != itemModifications[i]:
sameModifications = false
break
if sameModifications:
return cachedModifiedSprite
modifiedImage = modify_sprite(modifiedImage)
var modifiedSprite = ImageTexture.new()
modifiedSprite = ImageTexture.create_from_image(modifiedImage)
if modified:
cachedModifiedSprite = modifiedSprite
cachedModifications = []
for modification in itemModifications:
cachedModifications.append(modification)
return modifiedSprite
func get_additional_sprites():
var modifiedSprites = []
for sprite in additionalSprites:
var modifiedImage = sprite.get_image()
modifiedImage = modify_sprite(modifiedImage)
var modifiedSprite = ImageTexture.new()
modifiedSprite = ImageTexture.create_from_image(modifiedImage)
modifiedSprites.append(modifiedSprite)
return modifiedSprites
func modify_sprite(sprite):
if modifications.Concentrated in itemModifications and types.Juice in itemTypes:
sprite = concentrate_sprite(sprite)
if modifications.Caramelized in itemModifications:
sprite = caramellize_sprite(sprite)
if modifications.Sugared in itemModifications:
sprite = sugar_sprite(sprite)
if modifications.Knotted in itemModifications:
sprite = knot_sprite(sprite)
if modifications.Wet in itemModifications:
sprite = wet_sprite(sprite)
if modifications.Grubby in itemModifications:
sprite = grub_up_sprite(sprite)
return sprite
func sugar_sprite(sprite):
var ignoredColors:Array[Color] = []
if types.Juice in itemTypes:
ignoredColors.append(Color.BLACK)
return SpriteGeneration.color_sprinkle_image(sprite, Color.GHOST_WHITE, ignoredColors)
func caramellize_sprite(sprite):
return SpriteGeneration.color_multipy_image(sprite, Color.SANDY_BROWN)
func wet_sprite(sprite):
var overlayColor = Color(0, 1, 1, 0.3)
var outlineColor = Color(0, 1, 1, 0.6)
var result = SpriteGeneration.color_blend_image(sprite, overlayColor)
return SpriteGeneration.add_lower_outline(result, outlineColor, 2)
func grub_up_sprite(sprite):
var overlayColor = Color(0.45, 0.2, 0.1, 0.3)
var outlineColor = Color(0.45, 0.2, 0.1, 0.6)
var result = SpriteGeneration.color_blend_image(sprite, overlayColor)
return SpriteGeneration.add_lower_outline(result, outlineColor, 2)
func knot_sprite(sprite):
var knotSprite = load("res://Items/Basket/BaseItem/Knot.png").get_image()
var averageColor = SpriteGeneration.get_average_color(sprite)
return SpriteGeneration.color_multipy_image(knotSprite, averageColor)
func concentrate_sprite(sprite):
var concentratedJuiceSprite = load("res://Items/Juice/ConcentratedJuice.png").get_image()
var averageColor = SpriteGeneration.get_average_color(sprite, [Color.BLACK])
return SpriteGeneration.color_multipy_image(concentratedJuiceSprite, averageColor)
func get_average_color():
assert(itemSprite != null)
var sprite = itemSprite.get_image()
var averageColor = SpriteGeneration.get_average_color(sprite)
return averageColor
func get_description(modified:bool = true):
var modifiedDescription = itemDescription
if modified:
if modifications.Sugared in itemModifications:
modifiedDescription += " It's been covered in sugar."
if modifications.Caramelized in itemModifications:
if types.Juice in itemTypes:
modifiedDescription += " Now Caramel Flavoured!"
else:
modifiedDescription += " It's been caramelized."
if modifications.Knotted in itemModifications:
modifiedDescription += " It's been tied in a knot."
if modifications.Wet in itemModifications:
if itemName == "Water":
modifiedDescription = "Ohno"
elif types.Juice in itemTypes:
modifiedDescription += " Some water got into it."
else:
modifiedDescription += " It's wet."
if modifications.Concentrated in itemModifications:
modifiedDescription += " In concentrated form."
if modifications.Grubby in itemModifications:
modifiedDescription = "It's too grubbed up to read."
return modifiedDescription
func get_value(modified:bool = true):
return value
func get_weight(modified:bool = true):
var modifiedWeight = weight
if modified:
if modifications.Wet in itemModifications:
if types.Juice in itemTypes:
modifiedWeight += 0.4
else:
modifiedWeight = modifiedWeight * 1.7
elif modifications.Concentrated in itemModifications:
modifiedWeight -= 0.4
if modifiedWeight <= 0:
modifiedWeight = 0.01
if modifications.Grubby in itemModifications:
modifiedWeight += 0.2
return modifiedWeight
func get_hardness(modified:bool = true):
var modifiedHardness = hardness
if modified:
if modifications.Wet in itemModifications:
if types.Juice in itemTypes:
modifiedHardness -= 5
else:
var difference = 30 - modifiedHardness
if abs(difference) <= 10:
modifiedHardness = 30
elif difference < 0:
modifiedHardness -= 10
else:
modifiedHardness += 10
if modifications.Concentrated in itemModifications:
modifiedHardness += 3
return modifiedHardness
func get_basket_power(modified:bool = true):
return basketPower
func get_edibility(modified:bool = true):
var modifiedEdibility = edibility
if modified:
if modifications.Sugared in itemModifications:
modifiedEdibility += 10
if modifications.Caramelized in itemModifications:
modifiedEdibility += 15
if modifications.Knotted in itemModifications:
modifiedEdibility += 2
if modifications.Wet in itemModifications:
if types.Juice in itemTypes:
var difference = 70 - modifiedEdibility
if abs(difference) <= 5:
modifiedEdibility = 70
elif difference < 0:
modifiedEdibility -= 5
else:
modifiedEdibility += 5
if modifications.Concentrated in itemModifications:
if modifiedEdibility < 0:
modifiedEdibility -= 30
elif modifiedEdibility < 25:
modifiedEdibility -= 20
elif modifiedEdibility < 50:
modifiedEdibility -= 10
elif modifiedEdibility > 100:
modifiedEdibility += 10
elif modifiedEdibility > 75:
modifiedEdibility += 20
elif modifiedEdibility > 50:
modifiedEdibility += 30
if modifications.Grubby in itemModifications:
modifiedEdibility -= 10
return modifiedEdibility
func get_flammability(modified:bool = true):
var modifiedFlammability = flammability
if modified:
if modifications.Sugared in itemModifications:
modifiedFlammability += 10
if modifications.Concentrated in itemModifications:
modifiedFlammability += 10
return modifiedFlammability
func get_basketability_difficulty(modified:bool = true):
var modifiedBasketabilityDifficulty = basketabilityDifficulty
if modified:
if modifications.Knotted in itemModifications:
modifiedBasketabilityDifficulty += 10
if modifiedBasketabilityDifficulty > 100:
modifiedBasketabilityDifficulty = 100
return modifiedBasketabilityDifficulty
func get_name(modified:bool = true):
var modifiedName = itemName
if modified:
if modifications.Sugared in itemModifications:
modifiedName = "Sugary " + modifiedName
if modifications.Caramelized in itemModifications:
if types.Juice in itemTypes:
modifiedName = "Caramel " + modifiedName
else:
modifiedName = "Caramelized " + modifiedName
if modifications.Knotted in itemModifications:
modifiedName = "Knotted " + modifiedName
if modifications.Wet in itemModifications:
if types.Juice in itemTypes:
modifiedName = "Diluted " + modifiedName
else:
modifiedName = "Wet " + modifiedName
if modifications.Concentrated in itemModifications:
modifiedName = "Concentrated " + modifiedName
if modifications.Grubby in itemModifications:
modifiedName = "Grubby " + modifiedName
return modifiedName
func initialize_stats():
pass
func save():
var save_dict = {
"itemName": itemName,
"itemDescription": itemDescription,
"itemSprite": binarify_sprite(),
"additionalSprites": binarify_addition_sprites(),
"itemTypes": itemTypes,
"itemModifications": itemModifications,
"value": value,
"weight": weight,
"hardness": hardness,
"edibility": edibility,
"basketPower": basketPower,
"basketabilityDifficulty": basketabilityDifficulty,
"flammability": flammability
}
return save_dict
func set_sprite_from_binary(binary):
var image = Image.new()
image.set_data(60, 60, false, Image.FORMAT_RGBA8, Marshalls.base64_to_raw(binary))
itemSprite = ImageTexture.create_from_image(image)
func set_additional_sprites_from_binary(binaries):
for binary in binaries:
var image = Image.new()
var rawData = Marshalls.base64_to_raw(binary)
var sideLength = sqrt(rawData.size()/4)
image.set_data(sideLength, sideLength, false, Image.FORMAT_RGBA8, rawData)
additionalSprites.append(ImageTexture.create_from_image(image))
func binarify_sprite():
return Marshalls.raw_to_base64(itemSprite.get_image().get_data())
func binarify_addition_sprites():
var spriteBinaries = []
#remember, sprites have to be square to save properly
for sprite in additionalSprites:
spriteBinaries.append(Marshalls.raw_to_base64(sprite.get_image().get_data()))
return spriteBinaries
func equals(otherItem:Item):
if otherItem.itemName != itemName:
return false
if otherItem.itemDescription != itemDescription:
return false
if otherItem.itemTypes != itemTypes:
if itemTypes.size() != otherItem.itemTypes.size():
return false
for i in range(itemTypes.size()):
if itemTypes[i] != otherItem.itemTypes[i]:
return false
if otherItem.itemModifications != itemModifications:
if itemModifications.size() != otherItem.itemModifications.size():
return false
for i in range(itemModifications.size()):
if itemModifications[i] != otherItem.itemModifications[i]:
return false
if otherItem.value != value:
return false
if !is_equal_approx(otherItem.weight, weight):
return false
if otherItem.hardness != hardness:
return false
if otherItem.edibility != edibility:
return false
if otherItem.basketPower != basketPower:
return false
if otherItem.basketabilityDifficulty != basketabilityDifficulty:
return false
if otherItem.flammability != flammability:
return false
return true
func duplicate():
var newItem = Item.new()
newItem.itemName = itemName
newItem.itemDescription = itemDescription
newItem.itemSprite = itemSprite
newItem.additionalSprites = additionalSprites
newItem.itemTypes = itemTypes.duplicate(true)
newItem.itemModifications = itemModifications.duplicate(true)
newItem.value = value
newItem.weight = weight
newItem.hardness = hardness
newItem.edibility = edibility
newItem.basketPower = basketPower
newItem.basketabilityDifficulty = basketabilityDifficulty
newItem.flammability = flammability
return newItem