211 lines
4.6 KiB
GDScript
211 lines
4.6 KiB
GDScript
extends NPC
|
|
|
|
var meowDelay = 0
|
|
|
|
func _ready():
|
|
MessageManager.messageSent.connect(messageSpoken)
|
|
dialogueResource = load("res://NPCs/Beach/Ambrose/Ambrose.dialogue")
|
|
pronouns = "he/they"
|
|
|
|
func _process(delta):
|
|
if meowDelay > 0:
|
|
meowDelay -= delta
|
|
|
|
func messageSpoken(message:String):
|
|
if meowDelay > 0:
|
|
return
|
|
|
|
if GameVariables.player.global_position.distance_to(global_position) > 900:
|
|
return
|
|
|
|
var responseMessages = ["you're a cute kitty", "your a cute kitty", "cute kitty", "meow"]
|
|
message = message.to_lower().strip_edges()
|
|
|
|
for responseMessage in responseMessages:
|
|
if message.contains(responseMessage):
|
|
meowDelay = 0.5
|
|
MessageManager.addMessage("meow :3", self, "Ambrose", Color.YELLOW)
|
|
break
|
|
|
|
func notes_check():
|
|
if !note_check_1():
|
|
return false
|
|
if !note_check_2():
|
|
return false
|
|
if !note_check_3():
|
|
return false
|
|
|
|
return true
|
|
|
|
func note_check_1():
|
|
if InventoryManager.get_item_count_by_name("Basket Plan 1", "keyItems") > 0:
|
|
return true
|
|
return false
|
|
|
|
func note_check_2():
|
|
if InventoryManager.get_item_count_by_name("Basket Plan 2", "keyItems") > 0:
|
|
return true
|
|
return false
|
|
|
|
func note_check_3():
|
|
if InventoryManager.get_item_count_by_name("Basket Plan 3", "keyItems") > 0:
|
|
return true
|
|
return false
|
|
|
|
func rules_check():
|
|
if !basket_rule_check_1():
|
|
return false
|
|
if !basket_rule_check_2():
|
|
return false
|
|
if !basket_rule_check_3():
|
|
return false
|
|
|
|
return true
|
|
|
|
#Rule 1: Sort the baskets from highest to lowest edibility, left to right then top to bottom
|
|
func basket_rule_check_1():
|
|
var baskets = get_basket_items()
|
|
|
|
var highest = 500000
|
|
for basket in baskets:
|
|
if basket == null:
|
|
continue
|
|
|
|
if basket.get_edibility() > highest:
|
|
return false
|
|
else:
|
|
highest = basket.get_edibility()
|
|
|
|
return true
|
|
|
|
#Rule 2: The top row baskets must be edible and the bottom row must be inedible
|
|
func basket_rule_check_2():
|
|
var baskets = get_basket_items()
|
|
|
|
var index = 0
|
|
for basket in baskets:
|
|
if basket == null:
|
|
continue
|
|
|
|
if index <= 2:
|
|
if basket.get_edibility() < 50:
|
|
return false
|
|
else:
|
|
if basket.get_edibility() >= 50:
|
|
return false
|
|
index += 1
|
|
|
|
return true
|
|
|
|
#Rule 3: One collumn must be very red, one collumn very green, and one collumn very blue
|
|
func basket_rule_check_3():
|
|
var baskets = get_basket_items()
|
|
|
|
var colorsLeft = ["red", "green", "blue"]
|
|
|
|
var collumnOneColor = get_main_color(baskets[0])
|
|
if collumnOneColor == "none":
|
|
return false
|
|
if get_main_color(baskets[3]) != collumnOneColor:
|
|
return false
|
|
colorsLeft.erase(collumnOneColor)
|
|
|
|
var collumnTwoColor = get_main_color(baskets[1])
|
|
if collumnTwoColor == "none" or !(collumnTwoColor in colorsLeft):
|
|
return false
|
|
if get_main_color(baskets[4]) != collumnTwoColor:
|
|
return false
|
|
colorsLeft.erase(collumnTwoColor)
|
|
|
|
var collumnThreeColor = get_main_color(baskets[2])
|
|
if collumnThreeColor == "none" or !(collumnThreeColor in colorsLeft):
|
|
return false
|
|
if get_main_color(baskets[5]) != collumnThreeColor:
|
|
return false
|
|
|
|
return true
|
|
|
|
func get_main_color(basket:Item):
|
|
if basket == null:
|
|
return "none"
|
|
|
|
var color:Color = basket.get_average_color()
|
|
|
|
if color.r > color.g and color.r > color.b:
|
|
return red_check(color)
|
|
elif color.g > color.r and color.g > color.b:
|
|
return green_check(color)
|
|
elif color.b > color.r and color.b > color.g:
|
|
return blue_check(color)
|
|
else:
|
|
return "none"
|
|
|
|
func red_check(color:Color):
|
|
var otherColor = color.g + color.b
|
|
var red = color.r
|
|
|
|
if color.g > 0.2:
|
|
return "none"
|
|
|
|
if red <= 0.156:
|
|
return "none"
|
|
if red <= 0.25:
|
|
if otherColor <= 0.06:
|
|
return "red"
|
|
else:
|
|
return "none"
|
|
if red <= 0.39:
|
|
if otherColor <= 0.12:
|
|
return "red"
|
|
else:
|
|
return "none"
|
|
if red <= 0.58:
|
|
if color.g <= 0.20 and color.b <= 0.20:
|
|
return "red"
|
|
else:
|
|
return "none"
|
|
|
|
if otherColor <= 0.36:
|
|
return "red"
|
|
else:
|
|
return "none"
|
|
|
|
func green_check(color:Color):
|
|
var otherColor = color.r + color.b
|
|
var green = color.g
|
|
|
|
if green <= 0.156:
|
|
return "none"
|
|
|
|
if otherColor < green + 0.2:
|
|
return "green"
|
|
else:
|
|
return "none"
|
|
|
|
func blue_check(color:Color):
|
|
var red = color.r
|
|
var blue = color.b
|
|
|
|
if blue <= 0.156:
|
|
return "none"
|
|
|
|
if red <= float(blue/float(2.5)):
|
|
return "blue"
|
|
else:
|
|
return "none"
|
|
|
|
func get_basket_items():
|
|
var basketInvNames = ["BeachBasket1Basket", "BeachBasket2Basket", "BeachBasket3Basket",
|
|
"BeachBasket4Basket", "BeachBasket5Basket", "BeachBasket6Basket"]
|
|
|
|
var baskets = []
|
|
for basketInvName in basketInvNames:
|
|
var basketHoldingInv = InventoryManager.get_inventory(basketInvName)
|
|
if basketHoldingInv.items.size() > 0:
|
|
baskets.append(basketHoldingInv.items[0])
|
|
else:
|
|
baskets.append(null)
|
|
|
|
return baskets
|
|
|