class_name SurfaceDrawingPalette extends RefCounted const DEFAULT_COLOR_ID: StringName = &"chalk_white" # Stable IDs are the network and future progression boundary. New colors may # be appended without changing drawings created with an older palette. const COLORS: Array[Dictionary] = [ {"id": &"chalk_white", "name": "Chalk white", "color": Color("f5eed9")}, {"id": &"ocean_teal", "name": "Ocean teal", "color": Color("35b9c7")}, {"id": &"coral", "name": "Coral", "color": Color("ef5b62")}, {"id": &"sunny", "name": "Sunny", "color": Color("ffd166")}, {"id": &"leaf", "name": "Leaf", "color": Color("46c878")}, {"id": &"blue", "name": "Blue", "color": Color("5596f6")}, {"id": &"violet", "name": "Violet", "color": Color("b176e8")}, {"id": &"charcoal", "name": "Charcoal", "color": Color("28251f")}, ] static func has_color(color_id: StringName) -> bool: return not get_entry(color_id).is_empty() static func get_entry(color_id: StringName) -> Dictionary: for entry: Dictionary in COLORS: if StringName(entry.get("id", &"")) == color_id: return entry return {} static func get_color(color_id: StringName) -> Color: var entry: Dictionary = get_entry(color_id) var value: Variant = entry.get("color", Color.WHITE) return value if typeof(value) == TYPE_COLOR else Color.WHITE static func get_display_name(color_id: StringName) -> String: return str(get_entry(color_id).get("name", "Unknown")) static func get_color_ids() -> Array[StringName]: var result: Array[StringName] = [] for entry: Dictionary in COLORS: result.append(StringName(entry.get("id", &""))) return result static func palette_index_for_id(color_id: StringName) -> int: for index: int in COLORS.size(): if StringName(COLORS[index].get("id", &"")) == color_id: return index + 1 return 0 static func id_for_palette_index(palette_index: int) -> StringName: var index: int = palette_index - 1 return ( StringName(COLORS[index].get("id", &"")) if index >= 0 and index < COLORS.size() else StringName() ) static func color_for_palette_index(palette_index: int) -> Color: var index: int = palette_index - 1 return ( COLORS[index].get("color", Color.TRANSPARENT) if index >= 0 and index < COLORS.size() else Color.TRANSPARENT ) static func filter_unlocked_ids( unlocked_ids: Array[StringName], ) -> Array[StringName]: var result: Array[StringName] = [] for color_id: StringName in unlocked_ids: if has_color(color_id) and color_id not in result: result.append(color_id) if result.is_empty(): result.append(DEFAULT_COLOR_ID) return result