forked from 2121578/gai-ca2
Added camp functionality and started event tracking system
parent
51a04ca403
commit
b3e33b7cfa
|
@ -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")
|
||||
|
|
|
@ -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")
|
||||
|
|
|
@ -1,7 +1,9 @@
|
|||
class_name Camera
|
||||
class_name CameraController
|
||||
extends Camera2D
|
||||
|
||||
@export var border_acceleration: float = 0#2000.0
|
||||
@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
|
||||
@export var outer_border_threshold: float = 40.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)
|
|
@ -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)
|
|
@ -3,15 +3,18 @@ extends Node
|
|||
|
||||
@onready var world: World = $Tileset
|
||||
@onready var player: PlayerManager = $PlayerManager
|
||||
@onready var camera: Camera2D = $Camera2D
|
||||
@onready var game_ticker: Timer = $GameTick
|
||||
@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()
|
||||
|
||||
|
|
|
@ -0,0 +1,5 @@
|
|||
class_name TrackedEvent
|
||||
extends Node
|
||||
|
||||
var event: EventsTracker.Event = -1
|
||||
var params: Dictionary = {}
|
|
@ -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,7 +37,12 @@ func _ready() -> void:
|
|||
|
||||
func defer_ready() -> void:
|
||||
behavior_tree.game_manager = game_manager
|
||||
update_board()
|
||||
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()
|
||||
|
||||
|
||||
func _process(delta: float) -> void:
|
||||
|
@ -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)
|
||||
|
||||
|
|
|
@ -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"]
|
|
@ -6,80 +6,87 @@ var sid: int = 0
|
|||
|
||||
|
||||
func setup() -> void:
|
||||
pass
|
||||
pass
|
||||
|
||||
|
||||
func get_cells_by_type(atlas_coords: Vector2i) -> Array[Vector2i]:
|
||||
return tilemap.get_used_cells_by_id(sid, atlas_coords)
|
||||
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():
|
||||
var tile_data: TileData = tilemap.get_cell_tile_data(coords)
|
||||
if tile_data.get_custom_data(field_name) == custom_data:
|
||||
tiles_with_custom_data.append(coords)
|
||||
return tiles_with_custom_data
|
||||
var tiles_with_custom_data: Array = []
|
||||
for coords in tilemap.get_used_cells():
|
||||
var tile_data: TileData = tilemap.get_cell_tile_data(coords)
|
||||
if tile_data.get_custom_data(field_name) == custom_data:
|
||||
tiles_with_custom_data.append(coords)
|
||||
return tiles_with_custom_data
|
||||
|
||||
|
||||
func get_custom_data(coords: Vector2i, field_name: String, default_value: Variant) -> Variant:
|
||||
var tile_data: TileData = tilemap.get_cell_tile_data(coords)
|
||||
if not tile_data:
|
||||
return default_value
|
||||
return tile_data.get_custom_data(field_name)
|
||||
var tile_data: TileData = tilemap.get_cell_tile_data(coords)
|
||||
if not tile_data:
|
||||
return default_value
|
||||
return tile_data.get_custom_data(field_name)
|
||||
|
||||
|
||||
func get_cells(positions: Array[Vector2i]) -> Array[TileData]:
|
||||
var tiles: Array = []
|
||||
for coords in positions:
|
||||
tiles.append(tilemap.get_cell_tile_data(coords))
|
||||
return tiles
|
||||
var tiles: Array = []
|
||||
for coords in positions:
|
||||
tiles.append(tilemap.get_cell_tile_data(coords))
|
||||
return tiles
|
||||
|
||||
|
||||
func get_cell(position: Vector2i) -> TileData:
|
||||
return tilemap.get_cell_tile_data(position)
|
||||
return tilemap.get_cell_tile_data(position)
|
||||
|
||||
|
||||
func get_cell_atlas_coords(position: Vector2i) -> Vector2i:
|
||||
return tilemap.get_cell_atlas_coords(position)
|
||||
return tilemap.get_cell_atlas_coords(position)
|
||||
|
||||
|
||||
func set_cell(position: Vector2i, atlas_coords: Vector2i) -> void:
|
||||
tilemap.set_cell(position, sid, atlas_coords)
|
||||
tilemap.set_cell(position, sid, atlas_coords)
|
||||
|
||||
|
||||
func clear_cell(position: Vector2i) -> void:
|
||||
tilemap.set_cell(position, -1)
|
||||
tilemap.set_cell(position, -1)
|
||||
|
||||
|
||||
func clear_cells() -> void:
|
||||
for coords in tilemap.get_used_cells():
|
||||
tilemap.set_cell(coords, -1)
|
||||
for coords in tilemap.get_used_cells():
|
||||
tilemap.set_cell(coords, -1)
|
||||
|
||||
|
||||
func local_to_cell(global_position: Vector2) -> Vector2i:
|
||||
return tilemap.local_to_map(global_position)
|
||||
return tilemap.local_to_map(global_position)
|
||||
|
||||
|
||||
func cell_to_local(cell_position: Vector2i) -> Vector2:
|
||||
return tilemap.map_to_local(cell_position)
|
||||
return tilemap.map_to_local(cell_position)
|
||||
|
||||
|
||||
func fill_area(start: Vector2i, end: Vector2i, atlas_coords: Vector2i) -> void:
|
||||
for x in range(start.x, end.x + 1):
|
||||
for y in range(start.y, end.y + 1):
|
||||
tilemap.set_cell(Vector2i(x, y), sid, atlas_coords)
|
||||
for x in range(start.x, end.x + 1):
|
||||
for y in range(start.y, end.y + 1):
|
||||
tilemap.set_cell(Vector2i(x, y), sid, atlas_coords)
|
||||
|
||||
|
||||
func fill_circle(center: Vector2i, radius: int, atlas_coords: Vector2i) -> void:
|
||||
for x in range(center.x - radius, center.x + radius + 1):
|
||||
for y in range(center.y - radius, center.y + radius + 1):
|
||||
if center.distance_to(Vector2i(x, y)) <= radius:
|
||||
tilemap.set_cell(Vector2i(x, y), sid, atlas_coords)
|
||||
for x in range(center.x - radius, center.x + radius + 1):
|
||||
for y in range(center.y - radius, center.y + radius + 1):
|
||||
if center.distance_to(Vector2i(x, y)) <= radius:
|
||||
tilemap.set_cell(Vector2i(x, y), sid, atlas_coords)
|
||||
|
||||
|
||||
func fill_ellipse(center: Vector2i, radius_x: int, radius_y: int, atlas_coords: Vector2i) -> void:
|
||||
for x in range(center.x - radius_x, center.x + radius_x + 1):
|
||||
for y in range(center.y - radius_y, center.y + radius_y + 1):
|
||||
if (pow(x - center.x, 2) / pow(radius_x, 2) + pow(y - center.y, 2) / pow(radius_y, 2)) <= 1:
|
||||
tilemap.set_cell(Vector2i(x, y), sid, atlas_coords)
|
||||
for x in range(center.x - radius_x, center.x + radius_x + 1):
|
||||
for y in range(center.y - radius_y, center.y + radius_y + 1):
|
||||
if (pow(x - center.x, 2) / pow(radius_x, 2) + pow(y - center.y, 2) / pow(radius_y, 2)) <= 1:
|
||||
tilemap.set_cell(Vector2i(x, y), sid, atlas_coords)
|
||||
|
|
|
@ -13,32 +13,44 @@ const GROUND_DOCK: Vector2i = Vector2i(3, 0)
|
|||
#
|
||||
# objects, sid = 1
|
||||
# NI = not interactive
|
||||
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)
|
||||
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)
|
||||
#
|
||||
# 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)
|
||||
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)
|
||||
# boat
|
||||
const OBJECT_I_BOAT_NO_ENIGNE: Vector2i = Vector2i(4, 4)
|
||||
const OBJECT_I_BOAT_WITH_ENGINE: Vector2i = Vector2i(6, 4)
|
||||
const OBJECT_I_FIREPIT_OFF: Vector2i = Vector2i(6, 1)
|
||||
# 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_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
|
||||
|
|
|
@ -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()
|
||||
var tilemap_nav_vis: TileMapLayerAccess = TileMapLayerAccess.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
|
||||
|
|
|
@ -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)
|
Loading…
Reference in New Issue