It's Cow Game! Version 2.04!

This commit is contained in:
PajamaBee 2024-09-19 23:06:51 -05:00
commit a9e1ed9ddd
3148 changed files with 95332 additions and 0 deletions

View file

@ -0,0 +1,72 @@
extends RefCounted
class_name AshGenerator
static func generate_ash(item:Item):
var tentativeItemOverride = check_for_overrides(item)
if tentativeItemOverride != null:
return tentativeItemOverride
var baseCheckedItem = ItemGenerationUtils.base_item_check(item)
baseCheckedItem.itemModifications = item.itemModifications.duplicate(true)
if Item.modifications.Knotted in baseCheckedItem.itemModifications:
baseCheckedItem.itemModifications.erase(Item.modifications.Knotted)
return generate_standard_ash_item(baseCheckedItem)
static func check_for_overrides(item):
var newItem = null
if item.get_name(false) == "Sugar":
newItem = load("res://Items/Foods/Snack/Caramel.gd").new()
if item.get_name(false) == "Ketchup":
newItem = load("res://Items/Foods/Condiments/BBQSauce.gd").new()
if item.get_name(false) == "Old Ketchup":
newItem = load("res://Items/Foods/Condiments/OldBBQSauce.gd").new()
if item.get_name(false) == "Corn":
newItem = load("res://Items/Foods/Snack/Popcorn.gd").new()
if item.get_name(false) == "Sand":
newItem = load("res://Items/Glass/Glass.gd").new()
if item.get_name(false) == "Worm on a String":
newItem = item
if item.get_name(false) == "Basket on a String":
newItem = item
if newItem != null:
newItem.itemModifications = item.itemModifications.duplicate(true)
if Item.modifications.Knotted in newItem.itemModifications:
newItem.itemModifications.erase(Item.modifications.Knotted)
return newItem
static func generate_standard_ash_item(item):
var ashItem = Item.new()
ashItem.itemName = item.get_name(false) + " Ash"
ashItem.itemDescription = "The ashes of a " + item.get_name(false) + "."
ashItem.value = 1
ashItem.weight = 0.01
ashItem.hardness = 2
ashItem.edibility = item.edibility - 60
if ashItem.edibility < 0:
ashItem.edibility = 0
ashItem.basketPower = 1
ashItem.basketabilityDifficulty = 99
ashItem.flammability = 2
ashItem.itemTypes.append(Item.types.Ash)
ashItem.itemModifications = item.itemModifications.duplicate(true)
var itemSprite = item.get_sprite(false)
var averageColor = SpriteGeneration.get_average_color(itemSprite.get_image())
var defaultAshSprite = load("res://Items/Ash/Ash.png")
var ashImage = SpriteGeneration.color_multipy_image(defaultAshSprite.get_image(), averageColor)
var ashSprite = ImageTexture.new()
ashSprite = ImageTexture.create_from_image(ashImage)
ashItem.itemSprite = ashSprite
return ashItem

View file

@ -0,0 +1,62 @@
extends RefCounted
class_name BasketGenerator
static func generate_basket(item:Item, justGetName:bool = false):
var tentativeItemOverride = check_for_overrides(item)
if tentativeItemOverride != null:
return tentativeItemOverride
var baseCheckedItem = ItemGenerationUtils.base_item_check(item)
baseCheckedItem.itemModifications = item.itemModifications.duplicate(true)
if Item.modifications.Knotted in baseCheckedItem.itemModifications:
baseCheckedItem.itemModifications.erase(Item.modifications.Knotted)
return generate_standard_basket_item(baseCheckedItem, justGetName)
static func check_for_overrides(item):
var newItem = null
if item.get_name(false) == "Worm on a String":
newItem = load("res://Items/Toys/WormOnAString/BasketOnAString.gd").new()
if item.get_name(false) == "Basket on a String":
newItem = load("res://Items/Toys/WormOnAString/WormOnAString.gd").new()
if newItem != null:
newItem.itemModifications = item.itemModifications.duplicate(true)
if Item.modifications.Knotted in newItem.itemModifications:
newItem.itemModifications.erase(Item.modifications.Knotted)
return newItem
static func generate_standard_basket_item(item, returnName:bool = false):
if returnName:
return item.get_name(false) + " Basket"
var basketItem = Item.new()
basketItem.itemName = item.get_name(false) + " Basket"
basketItem.itemDescription = "A basket made from a " + item.get_name(false) + "."
basketItem.value = item.value + 3
basketItem.weight = item.weight
basketItem.hardness = item.hardness
basketItem.edibility = item.edibility - 5
basketItem.basketPower = item.basketPower
basketItem.basketabilityDifficulty = 99
basketItem.flammability = item.flammability
basketItem.itemTypes.append(Item.types.Basket)
basketItem.itemModifications = item.itemModifications.duplicate(true)
var itemSprite = item.get_sprite(false)
var averageColor = SpriteGeneration.get_average_color(itemSprite.get_image())
var defaultBasketSprite = load("res://Items/Basket/BaseItem/Basket.png")
var basketImage = SpriteGeneration.color_multipy_image(defaultBasketSprite.get_image(), averageColor)
var basketSprite = ImageTexture.new()
basketSprite = ImageTexture.create_from_image(basketImage)
basketItem.itemSprite = basketSprite
return basketItem

View file

@ -0,0 +1,40 @@
extends RefCounted
class_name BoneGenerator
const boneClasses = ["res://Items/Natural/Bones/CrystalBone.gd",
"res://Items/Natural/Bones/DirtBone.gd",
"res://Items/Natural/Bones/HauntedBone.gd",
"res://Items/Natural/Bones/LicoriceBone.gd",
"res://Items/Natural/Bones/ParallelogramBone.gd",
"res://Items/Natural/Bones/PretzelBone.gd",
"res://Items/Natural/Bones/RedbyBone.gd",
"res://Items/Natural/Bones/RexBone.gd",
"res://Items/Natural/Bones/RockBone.gd",
"res://Items/Natural/Bones/SquareBone.gd",
"res://Items/Natural/Bones/ZucchiniBone.gd"]
const boneOdds = [2, 20, 10, 10, 4, 10, 2, 1, 20, 10, 10]
const boneXpRewards = [320, 4, 70, 24, 44, 9, 435, 1500, 6, 40, 38]
static func get_a_bone():
var rng = RandomNumberGenerator.new()
var rngResult = rng.randi_range(1, 99)
var chancesChecked = 0
for boneIndex in range(boneOdds.size()):
var currentBoneChance = boneOdds[boneIndex]
chancesChecked += currentBoneChance
if chancesChecked >= rngResult:
var boneToGenerate = load(boneClasses[boneIndex]).new()
return boneToGenerate
static func get_xp_reward_for_bone(bone):
var bonePath = bone.get_script().resource_path
for i in range(boneClasses.size()):
var currentPath = boneClasses[i]
if bonePath == currentPath:
return boneXpRewards[i]

View file

@ -0,0 +1,63 @@
extends RefCounted
class_name CandyGenerator
static func generate_candy(item:Item):
var tentativeItemOverride = check_for_overrides(item)
if tentativeItemOverride != null:
return tentativeItemOverride
return generate_standard_candy_item(item)
static func check_for_overrides(item):
var newItem = null
if newItem != null:
newItem.itemModifications = item.itemModifications.duplicate(true)
if Item.modifications.Knotted in newItem.itemModifications:
newItem.itemModifications.erase(Item.modifications.Knotted)
return newItem
static func generate_standard_candy_item(item:Item):
var candyItem = Item.new()
var itemNameWords = item.get_name(false).split(" ")
var itemName = ""
var itemWordIndex = 0
while itemWordIndex < itemNameWords.size():
var currentWord = itemNameWords[itemWordIndex]
if !(itemWordIndex == (itemNameWords.size() - 1) and currentWord == "Juice"):
if itemName != "":
itemName += " "
itemName += currentWord
itemWordIndex += 1
candyItem.itemName = itemName + " Candy"
candyItem.itemDescription = "Some " + item.get_name(false) + " solidified into a sugary candy."
candyItem.value = item.value + 5
candyItem.weight = item.weight
candyItem.hardness = item.hardness + 50
candyItem.edibility = item.edibility + 20
candyItem.basketPower = 45
candyItem.basketabilityDifficulty = 50
candyItem.flammability = item.flammability * 3
candyItem.itemTypes.append(Item.types.Candy)
candyItem.itemModifications = []
var itemSprite = item.get_sprite(false)
var averageColor = SpriteGeneration.get_average_color(itemSprite.get_image(), [Color.BLACK])
var defaultCandySprite = load("res://Items/Candy/Candy.png")
var candyImage = SpriteGeneration.color_multipy_image(defaultCandySprite.get_image(), averageColor)
var candySprite = ImageTexture.new()
candySprite = ImageTexture.create_from_image(candyImage)
candyItem.itemSprite = candySprite
return candyItem

View file

@ -0,0 +1,105 @@
extends RefCounted
class_name ItemDrying
const raisinScript = preload("res://Items/Foods/Fruits/Raisin.gd")
static func dry_inventory_items(inventory:Inventory, amount:int = 1):
var amountLeftToDry = amount
amountLeftToDry = dry_wet_inventory_items(inventory, amountLeftToDry)
if amountLeftToDry > 0:
amountLeftToDry = dry_other_inventory_items(inventory, amountLeftToDry)
static func dry_wet_inventory_items(inventory:Inventory, amount:int):
var amountLeftToDry = amount
var pairedInvCopy = inventory.get_item_quantity_pair_array()
pairedInvCopy.shuffle()
var originalInventorySize = pairedInvCopy.size()
var i = 0
while i < originalInventorySize:
var currentItem:Item = pairedInvCopy[i][0]
if Item.modifications.Wet in currentItem.itemModifications:
var newItem = dry_item(currentItem)
var originalItemQuantity = pairedInvCopy[i][1]
var amountDrying = originalItemQuantity
if amountDrying > amountLeftToDry:
amountDrying = amountLeftToDry
inventory.remove_item(currentItem, amountDrying)
inventory.add_item(newItem, amountDrying)
amountLeftToDry -= amountDrying
if amountLeftToDry <= 0:
break
i += 1
return amountLeftToDry
static func dry_other_inventory_items(inventory:Inventory, amount:int):
var amountLeftToDry = amount
var pairedInvCopy = inventory.get_item_quantity_pair_array()
pairedInvCopy.shuffle()
var originalInventorySize = pairedInvCopy.size()
var i = 0
while i < originalInventorySize:
var currentItem:Item = pairedInvCopy[i][0]
var newItem = dry_item(currentItem)
if !newItem.equals(currentItem):
var originalItemQuantity = pairedInvCopy[i][1]
var amountDrying = originalItemQuantity
if amountDrying > amountLeftToDry:
amountDrying = amountLeftToDry
inventory.remove_item(currentItem, amountDrying)
inventory.add_item(newItem, amountDrying)
amountLeftToDry -= amountDrying
if amountLeftToDry <= 0:
break
i += 1
return amountLeftToDry
static func dry_item(item:Item):
var newItem:Item = item.duplicate()
if Item.modifications.Wet in newItem.itemModifications:
newItem.remove_modification(Item.modifications.Wet)
elif newItem.get_name(false) == "Grape":
newItem = raisinScript.new()
return newItem
static func sun_dry_item(item:Item):
var newItem:Item = item.duplicate()
if Item.modifications.Wet in newItem.itemModifications:
newItem.remove_modification(Item.modifications.Wet)
elif Item.types.Juice in newItem.itemTypes:
newItem = concentrate_juice(newItem)
elif newItem.get_name(false) == "Grape":
newItem = raisinScript.new()
return newItem
static func concentrate_juice(item:Item):
var newItem:Item = item.duplicate()
if Item.modifications.Sugared in newItem.itemModifications:
newItem = candy_item(newItem)
else:
newItem.set_modification(Item.modifications.Concentrated)
return newItem
static func candy_item(item:Item):
var newCandy = CandyGenerator.generate_candy(item)
return newCandy

View file

@ -0,0 +1,26 @@
extends RefCounted
class_name ItemGenerationUtils
const ashScript = preload("res://Items/Ash/Ash.gd")
const juiceScript = preload("res://Items/Juice/Juice.gd")
const basketScript = preload("res://Items/Basket/BaseItem/Basket.gd")
const puppetScript = preload("res://Items/Toys/Puppets/Puppet.gd")
const candyScript = preload("res://Items/Candy/Candy.gd")
static func base_item_check(item):
if Item.types.Reformable in item.itemTypes:
return item
if Item.types.Ash in item.itemTypes:
return ashScript.new()
if Item.types.Juice in item.itemTypes:
return juiceScript.new()
if Item.types.Basket in item.itemTypes:
return basketScript.new()
if Item.types.Puppet in item.itemTypes:
return puppetScript.new()
if Item.types.Candy in item.itemTypes:
return candyScript.new()
return item

View file

@ -0,0 +1,65 @@
extends RefCounted
class_name ItemSoaking
const grapeScript = preload("res://Items/Foods/Fruits/Grape.gd")
const mudScript = preload("res://Items/Natural/Mud.gd")
const paperItemNames = ["Love Novel", "Love Tome", "Empty Sugar Packet", "Taxes"]
const sugaryPaperItemNames = ["Sugar Packet", "Sugar Stick"]
const paperMushScript = preload("res://Items/Paper/PaperMush.gd")
static func soak_inventory(inventory:Inventory):
var totalWetted = 0
var originalInventorySize = inventory.items.size()
for i in range(originalInventorySize):
var currentItemIndex = originalInventorySize - i - 1
var currentItem:Item = inventory.items[currentItemIndex]
var newItem = wet_item(currentItem)
if !newItem.equals(currentItem):
totalWetted += inventory.quantities[currentItemIndex]
inventory.items[currentItemIndex] = newItem
for j in range(inventory.items.size()):
if inventory.items[j].equals(newItem) and j != currentItemIndex:
inventory.quantities[j] += inventory.quantities[currentItemIndex]
inventory.items.remove_at(currentItemIndex)
inventory.quantities.remove_at(currentItemIndex)
break
if totalWetted >= 100:
AchievementManager.complete_achievement("Leaky Basket")
static func wet_item(item:Item):
var newItem:Item = item.duplicate()
var itemName = item.get_name(false)
var copyModifications = false
if Item.modifications.Concentrated in newItem.itemModifications:
newItem.remove_modification(Item.modifications.Concentrated)
elif itemName == "Raisin":
newItem = grapeScript.new()
copyModifications = true
elif itemName == "Dirt":
newItem = mudScript.new()
copyModifications = true
elif itemName in paperItemNames:
newItem = paperMushScript.new()
copyModifications = true
elif itemName in sugaryPaperItemNames:
newItem = paperMushScript.new()
newItem.set_modification(Item.modifications.Sugared)
copyModifications = true
elif !Item.modifications.Wet in newItem.itemModifications:
newItem.set_modification(Item.modifications.Wet)
if Item.modifications.Grubby in newItem.itemModifications:
newItem.remove_modification(Item.modifications.Grubby)
if copyModifications:
for modification in item.itemModifications:
newItem.set_modification(modification)
return newItem

View file

@ -0,0 +1,87 @@
extends RefCounted
class_name JuiceGenerator
static func generate_juice(item:Item):
var tentativeItemOverride = check_for_overrides(item)
if tentativeItemOverride != null:
return tentativeItemOverride
var checkedItem = ItemGenerationUtils.base_item_check(item)
checkedItem.itemModifications = item.itemModifications.duplicate(true)
if Item.modifications.Knotted in checkedItem.itemModifications:
checkedItem.itemModifications.erase(Item.modifications.Knotted)
return generate_standard_juice_item(checkedItem)
static func check_for_overrides(item):
var newItem = null
if item.get_name(false) == "Bouncy Ball":
newItem = load("res://Items/Artificial/Goo/BouncyGoo.gd").new()
elif item.get_name(false) == "Mustard Seed":
newItem = load("res://Items/Foods/Condiments/Mustard.gd").new()
elif item.get_name(false) == "Maple Tea Bag":
newItem = load("res://Items/Foods/Liquids/MapleTea.gd").new()
elif item.get_name(false) == "Sticky Hand":
newItem = load("res://Items/Artificial/Goo/StickyGoo.gd").new()
elif item.itemName == "Sugar Packet":
newItem = load("res://Items/Foods/Snack/Sugar.gd").new()
elif item.get_name(false) == "Ketchup Packet":
newItem = load("res://Items/Foods/Condiments/OldKetchup.gd").new()
elif item.get_name(false) == "Relish Packet":
newItem = load("res://Items/Foods/Condiments/FakeRelish.gd").new()
elif item.get_name(false) == "Wustard Packet":
newItem = load("res://Items/Foods/Condiments/Wustard.gd").new()
elif item.get_name(false) == "Key Packet":
newItem = load("res://Items/Artificial/Products/BrassKey.gd").new()
elif item.get_name(false) == "Silica Gel Packet":
newItem = load("res://Items/Artificial/Products/SilicaGel.gd").new()
elif item.get_name(false) == "Tomato" and Item.modifications.Sugared in item.itemModifications:
newItem = load("res://Items/Foods/Condiments/Ketchup.gd").new()
return newItem
elif item.get_name(false) == "Worm on a String":
newItem = item
elif item.get_name(false) == "Basket on a String":
newItem = item
if newItem != null:
newItem.itemModifications = item.itemModifications.duplicate(true)
if Item.modifications.Knotted in newItem.itemModifications:
newItem.itemModifications.erase(Item.modifications.Knotted)
return newItem
static func generate_standard_juice_item(item:Item):
var juiceItem = Item.new()
juiceItem.itemName = item.get_name(false) + " Juice"
juiceItem.itemDescription = "The juice of a " + item.get_name(false) + "."
juiceItem.value = item.value
juiceItem.weight = item.weight
juiceItem.hardness = (item.hardness - 20)/6
if juiceItem.hardness < 0:
juiceItem.hardness = 0
juiceItem.edibility = item.edibility
juiceItem.basketPower = 90
juiceItem.basketabilityDifficulty = 99
juiceItem.flammability = (item.flammability)/6
juiceItem.itemTypes.append(Item.types.Juice)
juiceItem.itemModifications = item.itemModifications.duplicate(true)
var itemSprite = item.get_sprite(false)
var averageColor = SpriteGeneration.get_average_color(itemSprite.get_image())
var defaultJuiceSprite = load("res://Items/Juice/Juice.png")
var juiceImage = SpriteGeneration.color_multipy_image(defaultJuiceSprite.get_image(), averageColor)
var juiceSprite = ImageTexture.new()
juiceSprite = ImageTexture.create_from_image(juiceImage)
juiceItem.itemSprite = juiceSprite
return juiceItem

View file

@ -0,0 +1,28 @@
extends RefCounted
class_name MushroomGenerator
const mushroomClasses = ["res://Items/Fungi/AmethystDeceiver.gd",
"res://Items/Fungi/BluePinkGill.gd",
"res://Items/Fungi/HairyCurtainCrust.gd",
"res://Items/Fungi/LionsMane.gd",
"res://Items/Fungi/Mycenachlorophos.gd",
"res://Items/Fungi/VeiledLady.gd",
"res://Items/Fungi/WolfsMilkSlimeMould.gd"]
const mushroomOdds = [20, 20, 10, 30, 20, 5, 5]
static func get_a_mushroom():
var rng = RandomNumberGenerator.new()
var rngResult = rng.randi_range(1, 100)
var chancesChecked = 0
for mushroomIndex in range(mushroomOdds.size()):
var currentMushroomChance = mushroomOdds[mushroomIndex]
chancesChecked += currentMushroomChance
if chancesChecked >= rngResult:
var mushroomToGenerate = load(mushroomClasses[mushroomIndex]).new()
return mushroomToGenerate

View file

@ -0,0 +1,93 @@
extends RefCounted
class_name SpriteGeneration
static func color_sprinkle_image(image:Image, color:Color, ignoreColors:Array[Color] = []):
var imageWidth = image.get_width()
var imageHeight = image.get_height()
var sprinkleOffsets = [5, 6, 3, 4, 6, 4, 5, 3, 2, 4, 4, 6, 3, 2, 4]
var sprinkleOffsetIndex = 0
var countToSprinkle = 3
for x in range(imageWidth):
for y in range(imageHeight):
var currentColor = image.get_pixel(x, y)
if currentColor.a > 0 and !(currentColor in ignoreColors):
countToSprinkle -= 1
if countToSprinkle <= 0:
image.set_pixel(x, y, color)
countToSprinkle = sprinkleOffsets[sprinkleOffsetIndex]
sprinkleOffsetIndex += 1
if sprinkleOffsetIndex >= sprinkleOffsets.size():
sprinkleOffsetIndex = 0
return image
static func color_multipy_image(image:Image, color:Color):
var imageWidth = image.get_width()
var imageHeight = image.get_height()
for x in range(imageWidth):
for y in range(imageHeight):
var currentColor = image.get_pixel(x, y)
if currentColor.a > 0:
image.set_pixel(x, y, currentColor * color)
return image
static func color_blend_image(image:Image, color:Color):
var imageWidth = image.get_width()
var imageHeight = image.get_height()
for x in range(imageWidth):
for y in range(imageHeight):
var currentColor = image.get_pixel(x, y)
if currentColor.a > 0:
image.set_pixel(x, y, currentColor.blend(color))
return image
static func add_lower_outline(image:Image, color:Color, pixelCount:int = 3):
var imageWidth = image.get_width()
var imageHeight = image.get_height()
var outlineLeft = 0
for x in range(imageWidth):
outlineLeft = 0
for y in range(imageHeight):
var currentColor = image.get_pixel(x, y)
if currentColor.a == 0:
if outlineLeft > 0:
image.set_pixel(x, y, color)
outlineLeft -= 1
else:
outlineLeft = pixelCount
return image
static func get_average_color(image:Image, ignoreColors:Array[Color] = []):
var totalRed = 0
var totalGreen = 0
var totalBlue = 0
var imageWidth = image.get_width()
var imageHeight = image.get_height()
var pixelsChecked = 0
for x in range(imageWidth):
for y in range(imageHeight):
var currentColor = image.get_pixel(x, y)
if currentColor.a > 0 and !(currentColor in ignoreColors):
pixelsChecked += 1
totalRed += currentColor.r
totalGreen += currentColor.g
totalBlue += currentColor.b
if pixelsChecked > 0:
totalRed = totalRed / pixelsChecked
totalGreen = totalGreen / pixelsChecked
totalBlue = totalBlue / pixelsChecked
return Color(totalRed, totalGreen, totalBlue)