salesman/gd/src/lib/town.gd
2024-09-08 17:57:53 -03:00

84 lines
1.7 KiB
GDScript

class_name Town
extends Resource
enum Status {
STATUS_POOR,
STATUS_WEALTHY,
}
enum Size {
SIZE_SMALL,
SIZE_MEDIUM,
SIZE_LARGE,
}
enum Workshop {
WORKSHOP_NONE = 0,
WORKSHOP_BLACKSMITH = 1 << 0,
WORKSHOP_NUM = 1 << 1,
}
@export var name := "Nonamey"
@export var size := Size.SIZE_SMALL
@export var status := Status.STATUS_POOR
@export_flags("Blacksmith") var workshops := 0
@export var neighboring_towns: Array[Town]
@export var has_dimension_gate := false
@export var has_water := false
@export var possible_npcs: Array[PackedScene]
func status_to_string() -> String:
match status:
Status.STATUS_POOR:
return "poor"
Status.STATUS_WEALTHY:
return "wealthy"
_:
assert(false, "tried to get string representation of invalid status")
return "stupid"
func size_to_string() -> String:
match size:
Size.SIZE_SMALL:
return "small"
Size.SIZE_MEDIUM:
return "medium"
Size.SIZE_LARGE:
return "large"
_:
assert(false, "tried to get string representation of invalid size")
return "microscopic"
func workshop_to_string(workshop: Workshop) -> String:
match workshop:
Workshop.WORKSHOP_NONE:
return "none"
Workshop.WORKSHOP_BLACKSMITH:
return "blacksmith"
_:
assert(false, "tried to get string representation of invalid workshop bit")
return "buggyworld"
func workshop_list(capitalize := true, add_commas := true) -> String:
var strings: PackedStringArray
var current_bit: int = Workshop.WORKSHOP_NUM
while current_bit > Workshop.WORKSHOP_NONE:
if workshops & current_bit:
strings.push_back(workshop_to_string(current_bit))
current_bit >>= 1
if capitalize:
strings[0] = strings[0].to_pascal_case()
if add_commas:
return ", ".join(strings)
else:
return " ".join(strings)