Added first real behavior

pull/6/head
Yan Wittmann 2025-01-09 17:54:24 +01:00
parent 3c61ce4e7f
commit b89131bbaa
9 changed files with 82 additions and 23 deletions

View File

@ -1,4 +1,4 @@
[gd_scene load_steps=13 format=4 uid="uid://b88asko1ugyd2"]
[gd_scene load_steps=15 format=4 uid="uid://b88asko1ugyd2"]
[ext_resource type="Script" path="res://scripts/global/GameManager.gd" id="1_eeg2d"]
[ext_resource type="Script" path="res://scripts/tilemap/World.gd" id="1_k0rw8"]
@ -11,12 +11,15 @@
[ext_resource type="Script" path="res://scripts/player/tree/impl/testing/WalkUpToMouse.gd" id="8_s6mqc"]
[ext_resource type="Script" path="res://scripts/player/tree/impl/base/TaskSequence.gd" id="9_i67mw"]
[ext_resource type="Script" path="res://scripts/player/tree/impl/base/GoToWhileRunningSuccessStop.gd" id="10_4v1m1"]
[ext_resource type="Script" path="res://scripts/player/tree/impl/game/inventory/TaskEatFoodFromInventory.gd" id="10_70s0w"]
[ext_resource type="Script" path="res://scripts/player/tree/impl/game/critical_survival/TaskCheckFoodCritical.gd" id="10_sf2pi"]
[ext_resource type="Script" path="res://scripts/player/tree/impl/game/inventory/TaskPickupBerry.gd" id="13_mljce"]
[node name="Island-scene" type="Node2D"]
script = ExtResource("1_eeg2d")
[node name="Camera2D" type="Camera2D" parent="."]
position = Vector2(352, 235)
script = ExtResource("2_k51iv")
[node name="CanvasLayer" type="CanvasLayer" parent="Camera2D"]
@ -67,6 +70,7 @@ tile_set = ExtResource("1_vlccq")
[node name="StepVisualization" type="Node2D" parent="Tileset"]
script = ExtResource("5_sr2su")
text_color = Color(0.16133, 0.00745911, 0.0516868, 1)
[node name="PlayerManager" type="Node" parent="."]
script = ExtResource("4_1xqo1")
@ -80,15 +84,27 @@ script = ExtResource("7_1jajd")
[node name="sl_CriticalSurvival" type="Node" parent="PlayerManager/BehaviorTree/sl_Root"]
script = ExtResource("7_1jajd")
[node name="sq_Food" type="Node" parent="PlayerManager/BehaviorTree/sl_Root/sl_CriticalSurvival"]
[node name="sl_Food" type="Node" parent="PlayerManager/BehaviorTree/sl_Root/sl_CriticalSurvival"]
script = ExtResource("7_1jajd")
[node name="sq_FoodInInventory" type="Node" parent="PlayerManager/BehaviorTree/sl_Root/sl_CriticalSurvival/sl_Food"]
script = ExtResource("9_i67mw")
[node name="TaskCheckFoodCritical" type="Node" parent="PlayerManager/BehaviorTree/sl_Root/sl_CriticalSurvival/sq_Food"]
[node name="TaskEatFoodFromInventory" type="Node" parent="PlayerManager/BehaviorTree/sl_Root/sl_CriticalSurvival/sl_Food/sq_FoodInInventory"]
script = ExtResource("10_70s0w")
[node name="sq_NextFood" type="Node" parent="PlayerManager/BehaviorTree/sl_Root/sl_CriticalSurvival/sl_Food"]
script = ExtResource("9_i67mw")
[node name="TaskCheckFoodCritical" type="Node" parent="PlayerManager/BehaviorTree/sl_Root/sl_CriticalSurvival/sl_Food/sq_NextFood"]
script = ExtResource("10_sf2pi")
[node name="GoToWhileRunningSuccessStop" type="Node" parent="PlayerManager/BehaviorTree/sl_Root/sl_CriticalSurvival/sq_Food"]
[node name="GoToWhileRunningSuccessStop" type="Node" parent="PlayerManager/BehaviorTree/sl_Root/sl_CriticalSurvival/sl_Food/sq_NextFood"]
script = ExtResource("10_4v1m1")
[node name="TaskPickupBerry" type="Node" parent="PlayerManager/BehaviorTree/sl_Root/sl_CriticalSurvival/sl_Food/sq_NextFood"]
script = ExtResource("13_mljce")
[node name="WalkUpToMouse" type="Node" parent="PlayerManager/BehaviorTree/sl_Root"]
script = ExtResource("8_s6mqc")

View File

@ -9,6 +9,8 @@ enum Event {
CAMP_TAKEN_ITEM,
CAMP_TAKE_ITEM_FAILED,
SLEEP,
PLAYER_PICKED_UP_ITEM,
PLAYER_DROPPED_ITEM,
};
#
static var events: Array[TrackedEvent] = []

View File

@ -3,16 +3,22 @@ extends Node
@onready var inventory_label: Label = %InventoryLabel
# food system
@export var food_damage: int = 1
@export var food_addon_per_berry: int = 100
@export var food_critical_threshold: int = 50
# temperature
@export var temperature_damage: int = 1
@export var temperature_endure: int = 50
# viewing
@export var view_distance: int = 50
var tilemap_types: TileMapTileTypes = TileMapTileTypes.new()
#
var game_manager: GameManager = null
var last_board_position: Vector2i = Vector2i(0, 0)
var board_position: Vector2i = Vector2i(0, 0):
var board_position: Vector2i = Vector2i(0, 0):
set(value):
last_board_position = board_position
board_position = value
@ -24,6 +30,7 @@ var food: int = 0
# var water: int = 0
var temperature_timer: int = 0
var health: int = 0
#
var inventory_slot: Vector2i = tilemap_types.EMPTY:
set(value):
@ -96,9 +103,13 @@ func pick_up_item(tilemap_pos: Vector2i) -> void:
else:
game_manager.world.tilemap_interactive.clear_cell(tilemap_pos)
print("Picked up item: ", pick_up_item_type)
EventsTracker.track(EventsTracker.Event.PLAYER_PICKED_UP_ITEM, {"item": pick_up_item_type})
else:
# inventory is full, swap the item
print("Inventory is full. Swapping item: ", inventory_slot, " with item: ", pick_up_item_type)
EventsTracker.track(EventsTracker.Event.PLAYER_DROPPED_ITEM, {"item": inventory_slot})
EventsTracker.track(EventsTracker.Event.PLAYER_PICKED_UP_ITEM, {"item": pick_up_item_type})
if tile_after_pickup_transform:
game_manager.world.tilemap_interactive.set_cell(tilemap_pos, tile_after_pickup_transform)
var drop_location: Vector2i = game_manager.world.find_item_drop_location(tilemap_pos)
@ -185,6 +196,8 @@ func tick_handle_temperature(cell_temperature: int):
func tick_handle_food():
if food > 0:
food -= 1
if food <= 0:
health -= food_damage

View File

@ -6,6 +6,11 @@ func run(blackboard: Dictionary) -> void:
var player: PlayerManager = blackboard["player"]
var navigation: TilemapNavigation = blackboard["navigation"]
if player.food > player.food_critical_threshold:
status = FAILURE
status_reason = "Player food is not critical (" + str(player.food) + " > " + str(player.food_critical_threshold) + ")"
return
var active_foods: Array[Vector2i] = world.tilemap_interactive.get_cells_by_type_collection(
tilemap_types.OBJECT_COLLECTION_BERRY_SOURCE, player.board_position, player.view_distance)
if len(active_foods) == 0:
@ -19,6 +24,8 @@ func run(blackboard: Dictionary) -> void:
status_reason = "No closest berry found"
return
blackboard["closest_berry"] = closest_berry
var path: Array[Vector2i] = navigation.find_path_allow_neighbors(player.board_position, closest_berry, player.view_distance)
if path.size() > 0:
blackboard["path"] = path

View File

@ -0,0 +1,16 @@
class_name TaskEatFoodFromInventory
extends Task
func run(blackboard: Dictionary) -> void:
var player: PlayerManager = blackboard["player"]
if player.inventory_slot != tilemap_types.OBJECT_I_BERRY:
status = FAILURE
status_reason = "Inventory does not contain berry"
return
player.inventory_slot = tilemap_types.EMPTY
player.food += player.food_addon_per_berry
status = SUCCESS
status_reason = "Ate berry, player now has " + str(player.food) + " food"

View File

@ -0,0 +1,11 @@
class_name TaskPickupBerry
extends Task
func run(blackboard: Dictionary) -> void:
var player: PlayerManager = blackboard["player"]
var closest_berry: Vector2i = blackboard["closest_berry"]
player.pick_up_item(closest_berry)
status = SUCCESS
status_reason = "Picked up berry"

View File

@ -13,18 +13,8 @@ static func add_line(from: Vector2i, to: Vector2i, label: String) -> void:
static func add_line_tileset(from: Vector2i, to: Vector2i, label: String) -> void:
var add_factor: Vector2i = world.tilemap_ground.tilemap.tile_set.tile_size
add_factor.x /= 2
add_factor.y /= 2
var from_tileset: Vector2i = world.tilemap_ground.cell_to_local(from)
from_tileset.x += add_factor.x
from_tileset.y += add_factor.y
var to_tileset: Vector2i = world.tilemap_ground.cell_to_local(to)
to_tileset.x += add_factor.x
to_tileset.y += add_factor.y
var to_tileset: Vector2i = world.tilemap_ground.cell_to_local(to)
draw_lines[[from_tileset, to_tileset]] = label
@ -37,6 +27,9 @@ func game_tick_end():
var label_font = Control.new().get_theme_default_font()
@export var line_color: Color = Color("red")
@export var text_color: Color = Color("white")
func _ready() -> void:
pass
@ -48,6 +41,6 @@ func _draw() -> void:
var from: Vector2i = key[0]
var to: Vector2i = key[1]
var label: String = draw_lines[key]
draw_line(from, to, Color("red"), 2)
draw_line(from, to, line_color, 2)
var center: Vector2 = (from + to) / 2
draw_string(label_font, center, label)
draw_string(label_font, center, label, 0, -1, 12, text_color)

View File

@ -23,7 +23,7 @@ func get_cells_by_type_collection(
if max_distance < 99999999:
var filtered_tiles: Array[Vector2i] = []
for tile in tiles_with_type:
if TilemapNavigation.manhattan_distance(center, tile) <= max_distance:
if TilemapNavigation.manhattan_distance(center, tile, true) <= max_distance:
filtered_tiles.append(tile)
return filtered_tiles
return tiles_with_type

View File

@ -32,13 +32,14 @@ func game_tick_end() -> void:
world.tilemap_nav_vis.set_cell(chosen_path[chosen_path.size() - 1], tilemap_types.NAVIGATION_TARGET)
func is_within_radius(position: Vector2i, center: Vector2i, radius: int) -> bool:
return TilemapNavigation.manhattan_distance(position, center) <= radius
func is_within_radius(position: Vector2i, center: Vector2i, radius: int, record: bool = false) -> bool:
return TilemapNavigation.manhattan_distance(position, center, record) <= radius
static func manhattan_distance(a: Vector2i, b: Vector2i) -> int:
static func manhattan_distance(a: Vector2i, b: Vector2i, record: bool = false) -> int:
var dist: int = abs(a.x - b.x) + abs(a.y - b.y)
# StepVisualization.add_line_tileset(a, b, str(dist))
if record:
StepVisualization.add_line_tileset(a, b, str(dist))
return dist