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