feat: give the player a real carried inventory and deposit transactions

This commit is contained in:
2026-08-08 23:59:19 +02:00
parent 9678526c5a
commit 5e6c963d23
12 changed files with 565 additions and 65 deletions
+43 -29
View File
@@ -30,6 +30,7 @@ signal player_quest_expired(quest: PlayerQuestRecord)
signal player_standing_changed(standing: PlayerStandingRecord)
signal player_tier_advanced(tier: int, tier_name: String)
signal player_needs_changed(state: PlayerStateRecord)
signal player_inventory_changed(state: PlayerStateRecord)
signal player_died(state: PlayerStateRecord)
var village := SimVillage.new()
@@ -85,6 +86,8 @@ func _ready() -> void:
event_log.event_recorded.connect(_on_economic_event_recorded)
event_recorder.configure(event_log, Callable(self, "get_tick_count_for_recording"))
event_recorder.set_npcs(npcs)
player_needs.configure(economy, event_recorder)
player_needs.set_resource_states(resource_states)
economy.inventory_changed.connect(_on_economy_inventory_changed)
economy.economic_event_requested.connect(event_recorder.record_economic)
economy.narrative_event_requested.connect(event_recorder.record_narrative)
@@ -578,30 +581,28 @@ func _on_economic_event_recorded(event: EconomicEventRecord) -> void:
for learned_record in learned_records:
_apply_new_event_knowledge(learned_record, event)
if StringName(event.data["event_type"]) == SimulationIds.EVENT_ANIMAL_FED:
_resolve_animal_care_quest(event)
_finish_quest_resolution(
player_quest_system.on_animal_fed(
animal_care.get_state(StringName(event.data["destination_id"])), event, tick_count
)
)
_update_opportunity_from_event(event)
economic_event_recorded.emit(event)
func _resolve_animal_care_quest(event: EconomicEventRecord) -> void:
var animal_state := animal_care.get_state(StringName(event.data["destination_id"]))
var resolution := player_quest_system.on_animal_fed(animal_state, event, tick_count)
_finish_quest_resolution(resolution)
func _finish_quest_resolution(resolution: Dictionary) -> void:
if not resolution.has("quest"):
return
var quest: PlayerQuestRecord = resolution["quest"]
if resolution["completed"]:
player_quest_completed.emit(quest)
var standing := player_quest_system.standing
player_standing_changed.emit(standing)
if standing.get_tier() > _last_player_tier:
_last_player_tier = standing.get_tier()
player_tier_advanced.emit(standing.get_tier(), standing.get_tier_name())
else:
if not resolution["completed"]:
player_quest_expired.emit(quest)
return
player_quest_completed.emit(quest)
var standing := player_quest_system.standing
player_standing_changed.emit(standing)
if standing.get_tier() > _last_player_tier:
_last_player_tier = standing.get_tier()
player_tier_advanced.emit(standing.get_tier(), standing.get_tier_name())
func try_communicate_at_shared_activity(speaker_id: int, listener_id: int) -> bool:
@@ -609,12 +610,11 @@ func try_communicate_at_shared_activity(speaker_id: int, listener_id: int) -> bo
var listener := _find_npc_by_id(listener_id)
if not _can_communicate_at_shared_activity(speaker, listener):
return false
var known_event_ids := event_knowledge_system.get_communicable_event_ids(
for event_id in event_knowledge_system.get_communicable_event_ids(
speaker.id,
_get_lasting_event_ids(speaker.id),
opportunity_system.get_open_trigger_event_id()
)
for event_id in known_event_ids:
):
var event := event_log.get_by_id(event_id)
if event == null:
continue
@@ -742,22 +742,21 @@ func get_active_player_quest() -> PlayerQuestRecord:
func _advance_player_needs() -> void:
if not player_needs.advance(village):
player_needs_changed.emit(player_needs.state)
if player_needs.advance(village):
player_died.emit(player_needs.state)
player_needs.apply_death_consequence(player_quest_system.standing)
_last_player_tier = player_quest_system.standing.get_tier()
player_standing_changed.emit(player_quest_system.standing)
return
player_died.emit(player_needs.state)
player_needs.apply_death_consequence(player_quest_system.standing)
_last_player_tier = player_quest_system.standing.get_tier()
player_standing_changed.emit(player_quest_system.standing)
player_needs_changed.emit(player_needs.state)
func respawn_player() -> bool:
var was_dead := player_needs.state.is_dead()
if not player_needs.state.is_dead():
return false
player_needs.respawn()
if was_dead and not player_needs.state.is_dead():
player_needs_changed.emit(player_needs.state)
return true
return false
player_needs_changed.emit(player_needs.state)
return true
func get_player_state() -> PlayerStateRecord:
@@ -771,6 +770,21 @@ func player_eat(amount: float) -> float:
return eaten
func player_gather(node: ResourceNode) -> float:
var gathered := player_needs.gather_node(node)
if gathered > 0.0:
player_inventory_changed.emit(player_needs.state)
return gathered
func player_deposit(resource_id: StringName) -> float:
var deposited := player_needs.deposit_resource(resource_id)
if deposited > 0.0:
village_changed.emit(village)
player_inventory_changed.emit(player_needs.state)
return deposited
func _consider_animal_care_quests() -> void:
var pantry: StorageStateRecord = get_pantry()
for animal_state in animal_care.get_all_states():