1
0
Fork 0

Added camp functionality and started event tracking system

Yan Wittmann 2025-01-09 12:43:07 +01:00
parent 51a04ca403
commit b3e33b7cfa
12 changed files with 278 additions and 78 deletions

View File

@ -29,19 +29,27 @@ texture = ExtResource("2_15xge")
1:0/0 = 0
2:0/0 = 0
0:1/0 = 0
0:1/0/custom_data_0 = true
0:2/0 = 0
0:2/0/custom_data_0 = true
0:4/size_in_atlas = Vector2i(2, 1)
0:4/0 = 0
0:5/0 = 0
0:7/0 = 0
3:0/0 = 0
1:1/0 = 0
1:1/0/custom_data_0 = true
2:1/0 = 0
2:1/0/custom_data_0 = true
3:1/0 = 0
1:2/0 = 0
1:2/0/custom_data_0 = true
2:2/0 = 0
2:2/0/custom_data_0 = true
3:2/0 = 0
3:2/0/custom_data_0 = true
4:2/0 = 0
4:2/0/custom_data_0 = true
2:4/size_in_atlas = Vector2i(2, 1)
2:4/0 = 0
4:4/size_in_atlas = Vector2i(2, 1)
@ -52,11 +60,14 @@ texture = ExtResource("2_15xge")
1:5/0 = 0
0:6/size_in_atlas = Vector2i(2, 1)
0:6/0 = 0
5:1/0 = 0
6:1/0 = 0
6:1/0/custom_data_0 = true
7:1/0 = 0
7:1/0/custom_data_0 = true
4:0/size_in_atlas = Vector2i(1, 2)
4:0/0 = 0
5:0/size_in_atlas = Vector2i(1, 2)
5:0/0 = 0
[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_1og8x"]
texture = ExtResource("3_xap0v")

View File

@ -1,9 +1,10 @@
[gd_scene load_steps=9 format=4 uid="uid://b88asko1ugyd2"]
[gd_scene load_steps=10 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"]
[ext_resource type="TileSet" uid="uid://bi836ygcmyvhb" path="res://assets/tilemap/tileset.tres" id="1_vlccq"]
[ext_resource type="Script" path="res://scripts/global/Camera.gd" id="2_1vbjl"]
[ext_resource type="Script" path="res://scripts/global/CameraController.gd" id="2_k51iv"]
[ext_resource type="Material" uid="uid://ckg3be082ny3h" path="res://assets/shader/shader_vignette.tres" id="2_spils"]
[ext_resource type="Script" path="res://scripts/player/PlayerManager.gd" id="4_1xqo1"]
[ext_resource type="Script" path="res://scripts/player/tree/BehaviorTree.gd" id="6_efs30"]
[ext_resource type="Script" path="res://scripts/player/tree/impl/base/TaskSelector.gd" id="7_1jajd"]
@ -13,10 +14,19 @@
script = ExtResource("1_eeg2d")
[node name="Camera2D" type="Camera2D" parent="."]
script = ExtResource("2_1vbjl")
script = ExtResource("2_k51iv")
[node name="CanvasLayer" type="CanvasLayer" parent="Camera2D"]
[node name="Vignette" type="ColorRect" parent="Camera2D/CanvasLayer"]
material = ExtResource("2_spils")
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
size_flags_horizontal = 4
[node name="VBoxContainer" type="VBoxContainer" parent="Camera2D/CanvasLayer"]
offset_right = 40.0
offset_bottom = 40.0
@ -38,10 +48,11 @@ tile_map_data = PackedByteArray("AAAOAAkAAQACAAAAAAANAAkAAQACAAAAAAANAAoAAQACAAA
tile_set = ExtResource("1_vlccq")
[node name="InteractiveObjectsLayer" type="TileMapLayer" parent="Tileset"]
tile_map_data = PackedByteArray("AAAKABkAAQAAAAQAAAAUAAYAAQADAAEAAAAXAAYAAQADAAAAAAAJAAkAAQADAAEAAAAFAAgAAQADAAEAAAAFAAwAAQADAAEAAAAJAAwAAQADAAEAAAAYABAAAQACAAQAAAARAAYAAQAEAAAAAAA=")
tile_map_data = PackedByteArray("AAAKABkAAQAAAAQAAAAUAAYAAQADAAEAAAAXAAYAAQADAAAAAAAJAAkAAQADAAEAAAAFAAgAAQADAAEAAAAFAAwAAQADAAEAAAAJAAwAAQADAAEAAAAYABAAAQACAAQAAAARAAYAAQAEAAAAAAARABEAAQAGAAIAAAAQABEAAQAGAAEAAAAcABUAAQABAAEAAABCACMAAQACAAEAAABdAAkAAQACAAIAAABXADMAAQABAAIAAAA7ADUAAQADAAIAAAA8AAQAAQAEAAIAAAA=")
tile_set = ExtResource("1_vlccq")
[node name="PlayerLayer" type="TileMapLayer" parent="Tileset"]
tile_map_data = PackedByteArray("AAAQAA4AAwAAAAAAAAA=")
tile_set = ExtResource("1_vlccq")
[node name="TemperatureLayer" type="TileMapLayer" parent="Tileset"]
@ -53,10 +64,6 @@ tile_set = ExtResource("1_vlccq")
[node name="PlayerManager" type="Node" parent="."]
script = ExtResource("4_1xqo1")
food_damage = null
temperature_damage = null
temperature_endure = null
view_distance = null
[node name="BehaviorTree" type="Node" parent="PlayerManager"]
script = ExtResource("6_efs30")

View File

@ -1,6 +1,8 @@
class_name Camera
class_name CameraController
extends Camera2D
@onready var shader_vignette: ColorRect = $CanvasLayer/Vignette
@export var border_acceleration: float = 0 # 2000.0
@export var max_speed: float = 500.0
@export var inner_border_threshold: float = 60.0
@ -125,3 +127,9 @@ func _process(delta):
var offset: Vector2 = target_position - position
position += offset
# SECTION: shader access
func set_vignette_intensity(value: float) -> void:
var material: ShaderMaterial = shader_vignette.material
material.set_shader_parameter("vignette_strength", value)

View File

@ -0,0 +1,27 @@
class_name EventsTracker
extends Node
enum Event {
CAMPFIRE_LIT,
CAMPFIRE_LIT_FAILED,
CAMPFIRE_EXTINGUISHED,
CAMP_ADDED_ITEM,
CAMP_TAKEN_ITEM,
CAMP_TAKE_ITEM_FAILED,
SLEEP,
};
#
static var events: Array[TrackedEvent] = []
static var max_events: int = 20
static var callbacks: Array[Callable] = []
static func track(event: Event, params: Dictionary = {}) -> void:
var tracked_event: TrackedEvent = TrackedEvent.new()
tracked_event.event = event
tracked_event.params = params
events.append(tracked_event)
print("Event tracked: ", event, " params: ", params)
if events.size() > max_events:
events.remove_at(0)
for cb in callbacks:
cb.call(event, params)

View File

@ -3,15 +3,18 @@ extends Node
@onready var world: World = $Tileset
@onready var player: PlayerManager = $PlayerManager
@onready var camera: Camera2D = $Camera2D
@onready var camera: CameraController = $Camera2D as CameraController
@onready var game_ticker: Timer = $GameTick
var tilemap_navigation: TilemapNavigation = TilemapNavigation.new()
func _ready() -> void:
tilemap_navigation.world = world
tilemap_navigation.player = player
player.game_manager = self
game_ticker.start()
world.camp_manager.game_manager = self
# game_ticker.start()
func _process(delta: float) -> void:
@ -20,7 +23,7 @@ func _process(delta: float) -> void:
if Input.is_action_just_pressed("key_2"):
camera.go_to_zooming(Vector2(789.883972167969, 450.102813720703), 0.56015348434448)
if Input.is_action_just_pressed("key_9"):
camera.print_config()
world.camp_manager.sleep_effect()
if Input.is_action_just_pressed("force_game_tick"):
player.game_tick()

View File

@ -0,0 +1,5 @@
class_name TrackedEvent
extends Node
var event: EventsTracker.Event = -1
var params: Dictionary = {}

View File

@ -12,7 +12,7 @@ var tilemap_types: TileMapTileTypes = TileMapTileTypes.new()
#
var game_manager: GameManager = null
var last_board_position: Vector2i = Vector2i(0, 0)
var board_position: Vector2i = Vector2i(8, 10):
var board_position: Vector2i = Vector2i(0, 0):
set(value):
last_board_position = board_position
board_position = value
@ -37,6 +37,11 @@ func _ready() -> void:
func defer_ready() -> void:
behavior_tree.game_manager = game_manager
var player_start_position: Array[Vector2i] = game_manager.world.tilemap_player.get_cells_by_type(tilemap_types.PLAYER_DOWN)
if len(player_start_position) > 0:
board_position = player_start_position[0]
else:
push_error("No player start position found on tilemap")
update_board()
@ -47,7 +52,7 @@ func _process(delta: float) -> void:
pick_up_item(Vector2i(5, 8))
pick_up_item(Vector2i(9, 9))
if Input.is_action_just_pressed("key_4"):
var nearest: Vector2i = find_nearest_object([game_manager.world.tilemap_types.OBJECT_I_TREE_1])
var nearest: Vector2i = find_nearest_object([game_manager.world.tilemap_types.OBJECT_I_TREE_FULL])
# nearest.x = nearest.x - 1
walk_towards(nearest)

View File

@ -0,0 +1,6 @@
class_name TaskCheckFoodCritical
extends Task
func run(p_blackboard: Dictionary) -> void:
var world: World = p_blackboard["world"]
var player: PlayerManager = p_blackboard["player"]

View File

@ -13,6 +13,13 @@ func get_cells_by_type(atlas_coords: Vector2i) -> Array[Vector2i]:
return tilemap.get_used_cells_by_id(sid, atlas_coords)
func get_cells_by_type_collection(atlas_coords: Array[Vector2i]) -> Array[Vector2i]:
var tiles_with_type: Array[Vector2i] = []
for coords in atlas_coords:
tiles_with_type.append_array(get_cells_by_type(coords))
return tiles_with_type
func get_cells_by_custom_data(field_name: String, custom_data: Variant) -> Array[Vector2i]:
var tiles_with_custom_data: Array = []
for coords in tilemap.get_used_cells():

View File

@ -16,29 +16,41 @@ const GROUND_DOCK: Vector2i = Vector2i(3, 0)
const OBJECT_NI_RANDOM_1: Vector2i = Vector2i(0, 0) # testing only, to be removed
const OBJECT_NI_RANDOM_2: Vector2i = Vector2i(1, 0) # testing only, to be removed
const OBJECT_NI_ROCK_1: Vector2i = Vector2i(2, 0)
const OBJECT_NI_FIREPIT_ON: Vector2i = Vector2i(7, 1)
const OBJECT_NI_TREE_CUT: Vector2i = Vector2i(2, 0)
const OBJECT_NI_BOAT_NO_ENIGNE: Vector2i = Vector2i(4, 4)
#
# I = interactive
const OBJECT_I_BOAT_ENGINE: Vector2i = Vector2i(0, 1)
const OBJECT_I_FUEL: Vector2i = Vector2i(1, 1)
const OBJECT_I_ANCHOR: Vector2i = Vector2i(2, 1)
# boat
const OBJECT_I_BOAT_NO_ENIGNE: Vector2i = Vector2i(4, 4)
const OBJECT_I_BOAT_WITH_ENGINE: Vector2i = Vector2i(6, 4)
# boat parts
const OBJECT_I_BOAT_PART_GENERIC: Vector2i = Vector2i(4584, 5234)
const OBJECT_I_BOAT_PART_ENGINE: Vector2i = Vector2i(0, 1)
const OBJECT_I_BOAT_PART_FUEL: Vector2i = Vector2i(1, 1)
const OBJECT_I_BOAT_PART_ANCHOR: Vector2i = Vector2i(2, 1)
const OBJECT_I_BOAT_PART_CHEST: Vector2i = Vector2i(0, 2)
const OBJECT_I_BOAT_PART_GEARS: Vector2i = Vector2i(1, 2)
const OBJECT_I_BOAT_PART_MEDIKIT: Vector2i = Vector2i(2, 2)
const OBJECT_I_BOAT_PART_PADDLE: Vector2i = Vector2i(3, 2)
const OBJECT_I_BOAT_PART_GAS_STOVE: Vector2i = Vector2i(4, 2)
# camp
const OBJECT_I_TENT: Vector2i = Vector2i(6, 2)
const OBJECT_I_FIREPIT_OFF: Vector2i = Vector2i(6, 1)
const OBJECT_I_FIREPIT_ON: Vector2i = Vector2i(7, 1)
# other
const OBJECT_I_EMPTY_BUSH: Vector2i = Vector2i(3, 0)
const OBJECT_I_FILLED_BUSH: Vector2i = Vector2i(3, 1)
const OBJECT_I_BERRY: Vector2i = Vector2i(0, 5)
const OBJECT_I_STICK: Vector2i = Vector2i(1, 5)
const OBJECT_I_TREE_1: Vector2i = Vector2i(4, 0)
const OBJECT_I_CHEST: Vector2i = Vector2i(0, 2)
const OBJECT_I_GEARS: Vector2i = Vector2i(1, 2)
const OBJECT_I_MEDIKIT: Vector2i = Vector2i(2, 2)
const OBJECT_I_PADDLE: Vector2i = Vector2i(3, 2)
const OBJECT_I_GAS_STOVE: Vector2i = Vector2i(4, 2)
const OBJECT_I_TENT: Vector2i = Vector2i(6, 2)
const OBJECT_I_BOAT_WITH_ENGINE: Vector2i = Vector2i(6, 4)
const OBJECT_I_FIREPIT_OFF: Vector2i = Vector2i(6, 1)
const OBJECT_I_TREE_FULL: Vector2i = Vector2i(4, 0)
const OBJECT_I_TREE_CUT: Vector2i = Vector2i(5, 0)
# collections
const OBJECT_COLLECTION_BERRY_SOURCE: Array[Vector2i] = [OBJECT_I_FILLED_BUSH, OBJECT_I_BERRY]
const OBJECT_COLLECTION_FIREPIT: Array[Vector2i] = [OBJECT_I_FIREPIT_OFF, OBJECT_I_FIREPIT_ON]
const OBJECT_COLLECTION_BOAT_PARTS: Array[Vector2i] = [ # @formatter:off
OBJECT_I_BOAT_PART_GENERIC,
OBJECT_I_BOAT_PART_ENGINE, OBJECT_I_BOAT_PART_FUEL, OBJECT_I_BOAT_PART_ANCHOR,
OBJECT_I_BOAT_PART_CHEST, OBJECT_I_BOAT_PART_GEARS, OBJECT_I_BOAT_PART_MEDIKIT,
OBJECT_I_BOAT_PART_PADDLE, OBJECT_I_BOAT_PART_GAS_STOVE
] # @formatter:on
#
# temperature, sid = 2
const TEMPERATURE_NORMAL: Vector2i = EMPTY

View File

@ -1,14 +1,16 @@
class_name World
extends Node2D
var tilemap_types: TileMapTileTypes = TileMapTileTypes.new()
# tilemap layers
var tilemap_ground: TileMapLayerAccess = TileMapLayerAccess.new()
var tilemap_non_interactive: TileMapLayerAccess = TileMapLayerAccess.new()
var tilemap_interactive: TileMapLayerAccess = TileMapLayerAccess.new()
var tilemap_player: TileMapLayerAccess = TileMapLayerAccess.new()
var tilemap_temperature: TileMapLayerAccess = TileMapLayerAccess.new()
var tilemap_nav_vis: TileMapLayerAccess = TileMapLayerAccess.new()
#
var tilemap_types: TileMapTileTypes = TileMapTileTypes.new()
# other nodes
var camp_manager: CampManager = CampManager.new()
func _ready() -> void:
@ -31,7 +33,11 @@ func _ready() -> void:
tilemap_player.setup()
tilemap_temperature.setup()
print(tilemap_interactive.get_cell_atlas_coords(Vector2i(17, 6)))
call_deferred("defer_ready")
func defer_ready() -> void:
camp_manager.setup()
# example usage

View File

@ -0,0 +1,103 @@
class_name CampManager
extends Node
var tilemap_types: TileMapTileTypes = TileMapTileTypes.new()
#
var game_manager: GameManager = null
var tilemap_interactive: TileMapLayerAccess = null
#
var items: Array[Vector2i] = []
var camp: Vector2i = Vector2i(0, 0)
var campfire: Vector2i = Vector2i(0, 0)
func setup() -> void:
tilemap_interactive = game_manager.world.tilemap_interactive
var camp_locations: Array[Vector2i] = tilemap_interactive.get_cells_by_type(tilemap_types.OBJECT_I_TENT)
if len(camp_locations) > 0:
camp = camp_locations[0]
else:
push_error("No camp location found on tilemap")
var firepit_locations: Array[Vector2i] = tilemap_interactive.get_cells_by_type_collection(tilemap_types.OBJECT_COLLECTION_FIREPIT)
if len(firepit_locations) > 0:
campfire = firepit_locations[0]
else:
push_error("No firepit location found on tilemap")
print("CampManager: camp=", camp, " campfire=", campfire)
tilemap_interactive.set_cell(campfire, tilemap_types.OBJECT_I_FIREPIT_OFF)
func camp_contains_item(item: Vector2i) -> bool:
return items.find(item) != -1
func camp_contains_item_collection(item: Array[Vector2i]) -> bool:
for i in item:
if items.find(i) == -1:
return false
return true
func camp_item_count(item: Vector2i) -> int:
var count: int = 0
for i in items:
if i == item:
count += 1
return count
func camp_item_collection_count(item: Array[Vector2i]) -> int:
var count: int = 0
for i in items:
if item.find(i) != -1:
count += 1
return count
func camp_take_item(item: Vector2i, count: int = 1) -> bool:
if camp_item_count(item) < count:
push_error("CampManager: not enough items to take: " + str(item))
EventsTracker.track(EventsTracker.Event.CAMP_TAKE_ITEM_FAILED, {"item": item, "count": count})
return false
var taken: int = 0
for i in range(items.size()):
if items[i] == item:
items.remove_at(i)
taken += 1
if taken == count:
break
EventsTracker.track(EventsTracker.Event.CAMP_TAKEN_ITEM, {"item": item, "count": count})
return true
func camp_add_item(item: Vector2i) -> void:
items.append(item)
EventsTracker.track(EventsTracker.Event.CAMP_ADDED_ITEM, {"item": item, "count": 1, "new_count": camp_item_count(item)})
func campfire_light() -> bool:
# requires two sticks in the camp
if camp_take_item(tilemap_types.OBJECT_I_STICK, 2):
tilemap_interactive.set_cell(campfire, tilemap_types.OBJECT_I_FIREPIT_ON)
EventsTracker.track(EventsTracker.Event.CAMPFIRE_LIT)
return true
else:
EventsTracker.track(EventsTracker.Event.CAMPFIRE_LIT_FAILED)
return false
func campfire_extinguish() -> void:
tilemap_interactive.set_cell(campfire, tilemap_types.OBJECT_I_FIREPIT_OFF)
EventsTracker.track(EventsTracker.Event.CAMPFIRE_EXTINGUISHED)
func sleep_effect() -> void:
EventsTracker.track(EventsTracker.Event.SLEEP)
game_manager.camera.go_to_zooming(game_manager.world.tilemap_player.cell_to_local(camp), 3)
var tween_in: Tween = game_manager.world.get_tree().create_tween()
tween_in.tween_method(game_manager.camera.set_vignette_intensity, 0.0, 1.0, 2.0).set_delay(0.5)
var tween_out: Tween = game_manager.world.get_tree().create_tween()
tween_out.tween_method(game_manager.camera.set_vignette_intensity, 1.0, 0.0, 2.0).set_delay(4.0)