61 lines
1.6 KiB
GDScript
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)]
|