402 lines
12 KiB
GDScript
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
|