straywild/messages/bottle_message_catalog.gd

61 lines
1.6 KiB
GDScript

class_name BottleMessageCatalog
extends Resource
const BottleMessageDataType = preload(
"res://messages/bottle_message_data.gd"
)
@export var entries: Array[BottleMessageDataType] = []
func get_message(message_id: StringName) -> BottleMessageDataType:
if message_id.is_empty():
return null
for entry: BottleMessageDataType in entries:
if (
entry != null
and entry.is_valid()
and entry.message_id == message_id
):
return entry
return null
func get_active_unseen_messages(
received_message_ids: Array[StringName],
) -> Array[BottleMessageDataType]:
var received: Dictionary[StringName, bool] = {}
for message_id: StringName in received_message_ids:
received[message_id] = true
var result: Array[BottleMessageDataType] = []
var included: Dictionary[StringName, bool] = {}
for entry: BottleMessageDataType in entries:
if (
entry == null
or not entry.active
or not entry.is_valid()
or received.has(entry.message_id)
or included.has(entry.message_id)
):
continue
included[entry.message_id] = true
result.append(entry)
result.sort_custom(
func(first: BottleMessageDataType, second: BottleMessageDataType) -> bool:
return String(first.message_id) < String(second.message_id)
)
return result
func choose_random_unseen_message(
received_message_ids: Array[StringName],
rng: RandomNumberGenerator,
) -> BottleMessageDataType:
if rng == null:
return null
var candidates: Array[BottleMessageDataType] = get_active_unseen_messages(
received_message_ids
)
if candidates.is_empty():
return null
return candidates[rng.randi_range(0, candidates.size() - 1)]