extends Actor export var player_number: int = 1 # Declare member variables here. Examples: # var a = 2 # var b = "text" onready var player_inventory :InventoryManager = InventoryManager.new() onready var stamina_component = $"%Stamina_Component" onready var health_component = $"%Health_Component" var punch_item :Item = preload("res://assets/items/punch.tres") const state_stamina_cost :Dictionary = { "jump": 10, "attack_sword":20, "attack_punch":10, "roll":40, "ledge_climb":10 } const state_damage_amount :Dictionary = { "attack_sword":30, "attack_punch":10, } var player_info_index :int var player_data :PlayerData # Called when the node enters the scene tree for the first time. func _ready(): # PlayerInfo.player_health = health_component.health PlayerInfo.player_inventory = player_inventory # PlayerInfo.player_stamina = stamina_component.stamina player_info_index = PlayerInfo.register_player() print ("Registered as player: ", player_info_index) player_data = PlayerInfo.get_player_data(player_info_index) PlayerInfo.get_player_data(player_info_index).player_health = health_component.health print ("My health is: ", player_data.player_health) player_data.player_inventory = player_inventory player_data.player_stamina = stamina_component.stamina # Set initial player position in world. global_position = LevelInfo.player_start_position player_inventory.add_to_inventory(punch_item) player_inventory.select_primary(punch_item) movement_component.state_stamina_cost = state_stamina_cost #var stamina_recovery :float = 0.0 # Called every frame. 'delta' is the elapsed time since the previous frame. func _process(delta): #PlayerInfo.player_position = global_position.round() player_data.player_position = global_position.round() # stamina_recovery += delta # if stamina_recovery > 1.0: # stamina_component.recover(1) # stamina_recovery = 0.0 # #print("recover ", stamina_component.stamina) #PlayerInfo.player_stamina = stamina_component.stamina player_data.player_stamina = stamina_component.stamina ##TODO: well I'm not sure I like this but making a whole state receiver is silly if state_damage_amount.has(movement_state_machine.current_state.name): $Hitbox_Component.damage_amount = state_damage_amount[movement_state_machine.current_state.name] else: $Hitbox_Component.damage_amount = 10 match movement_state_machine.current_state.name: "idle": if Input.is_action_just_released("switch_primary_item_" + str(player_number)): var _selected_item = player_inventory.switch_primary() if _selected_item: print("Switched Primary item to: ", _selected_item.name) elif Input.is_action_just_released("switch_secondary_item_" + str(player_number)): var _selected_item = player_inventory.switch_secondary() if _selected_item: print("Switched Secondary item to: ", _selected_item.name) func hit_Receiver(damage): $Hurtbox_Component.set_hurtbox(false) health_component.take_damage(damage) if $Health_Component.health > 0: movement_state_machine.change_to_known_state('hurt') #PlayerInfo.player_health = health_component.health player_data.player_health = health_component.health print ("Got Hurt, What happend: " , PlayerInfo.get_player_data(player_info_index).player_health, " vs ", player_data.player_health) if health_component.health <= 0: return yield( get_tree().create_timer(2 + movement_state_machine.get_state_reference('hurt').timeout_seconds), "timeout") $Hurtbox_Component.set_hurtbox(true) func touch_the_thing(the_thing: Interactable) -> bool: print("You see! a THING...", the_thing.name) if the_thing is HealthPickup: # Do some healthy stuff. the_thing.trigger_interaction() return false if the_thing is LevelTransition: if movement_state_machine.current_state.name != 'enter_right': if the_thing._transition_type == 'door_right': # Make sure we're facing right. transform.x.x = movement_component.RIGHT movement_state_machine.change_to_known_state('enter_right') elif the_thing._transition_type == 'door_left': transform.x.x = movement_component.LEFT movement_state_machine.change_to_known_state('enter_right') the_thing.trigger_interaction() if the_thing is ItemPickup: player_inventory.add_to_inventory(the_thing.item, the_thing.count) #player_inventory.select_secondary(the_thing.item) the_thing.trigger_interaction() return true func enough_stamina_for(_state_name :String) -> bool: if state_stamina_cost.has(_state_name): if stamina_component.stamina >= state_stamina_cost[_state_name]: return true else: return false ## Return true by default because we don't have a cost for this move return true var state_to_item_map :Dictionary = { "sword": "attack_sword" , "gun": "attack_shoot", "punch" : "attack_punch", "mushroom" : "attack_shoot" } ##TODO: We need to find a way to 'use' the item. func use_primary_item() -> String: # if player_inventory.primary_selection.consumable == false: # if state_to_item_map.has(player_inventory.primary_selection.name): # player_inventory.remove_from_inventory(player_inventory.primary_selection) # return state_to_item_map[player_inventory.primary_selection.name] if player_inventory.primary_selection != null: # Have to make sure we even have a second var _item_name :String = player_inventory.primary_selection.name if state_to_item_map.has(_item_name): var state_name = state_to_item_map[_item_name] ## This item state has a cost associated with it. if enough_stamina_for(state_name): #print("Yup: ", state_stamina_cost[state_name], "<=", stamina_component.stamina) player_inventory.remove_from_inventory(player_inventory.primary_selection) return state_to_item_map[_item_name] else: ## TODO: maybe some sort of 'fail' animation state #print("Nope: ", state_stamina_cost[state_name], "<=", stamina_component.stamina) return '' ## you can't use this player_inventory.remove_from_inventory(player_inventory.primary_selection) return state_to_item_map[_item_name] return '' func use_secondary_item() -> String: if player_inventory.secondary_selection != null: # Have to make sure we even have a second var _item_name :String = player_inventory.secondary_selection.name if state_to_item_map.has(_item_name): var state_name = state_to_item_map[_item_name] if enough_stamina_for(state_name): player_inventory.remove_from_inventory(player_inventory.secondary_selection) return state_to_item_map[_item_name] else: ## TODO: maybe some sort of 'fail' animation state return '' return '' #func check_state_change(_new_state_name: String) -> bool: # match _new_state_name: # "attack_sword": # print("nope.") # return false # "attack_shoot": # return true # _: # None # return true # return true func _on_Movement_StateMachine_state_changed(old_state_name, new_state): # if new_state.name == "jump": # stamina_component.reduce_stamina(state_stamina_cost["jump"]) if state_stamina_cost.has(new_state.name): stamina_component.reduce_stamina(state_stamina_cost[new_state.name]) func _on_Health_Component_health_depleted(): movement_state_machine.change_to_known_state('death')