about summary refs log tree commit diff stats
path: root/tools/util/naming.cpp
Commit message (Collapse)AuthorAgeFilesLines
* Started writing a data validatorStar Rauchenberger2025-08-161-0/+4
| | | | | | | Currently, it can check whether identifiers point to non-existent objects, or whether multiple objects share the same identifier. It can also determine whether an identifier is underspecified (e.g. a door doesn't specify a room, or a global connection doesn't specify a map).
* Converted to proto2Star Rauchenberger2025-08-121-2/+2
| | | | | | | | | | | | | | | | | This will let us use an older version of protobuf in Python, and allows us to use the Godot protobuf implementation at all. Scalar fields with custom defaults in data.proto were changed to not have a default, because Godot doesn't handle it properly. The equivalent fields in human.proto still have the defaults, and datapacker copies the default value in if necessary. The Panel message in data.proto was also renamed to PanelData because otherwise it conflicts with the native Godot class named Panel. The double field in Letter was renamed to level2, because Godot couldn't handle it well. Finally, common.proto was removed and its contents were moved into data.proto, which allows us to generate code for Python without needing to edit it. NOTE: I had to slightly modify the Godot protobuf code generator. I'll need to upload that somewhere.
* Added support for masteriesStar Rauchenberger2025-08-091-0/+11
Also assigned IDs for the_butterfly, as well as already configured letters.
cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */ .highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */ .highlight .ge { font-style: italic } /* Generic.Emph */ .highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ .highlight .gr { color: #aa0000 } /* Generic.Error */ .highlight .gh { color: #333333 } /* Generic.Heading */ .highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */ .highlight .go { color: #888888 } /* Generic.Output */ .highlight .gp { color: #555555 } /* Generic.Prompt */ .highlight .gs { font-weight: bold } /* Generic.Strong */ .highlight .gu { color: #666666 } /* Generic.Subheading */ .highlight .gt { color: #aa0000 } /* Generic.Traceback */ .highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */ .highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */ .highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */ .highlight .kp { color: #008800 } /* Keyword.Pseudo */ .highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */ .highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */ .highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */ .highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */ .highlight .na { color: #336699 } /* Name.Attribute */ .highlight .nb { color: #003388 } /* Name.Builtin */ .highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */ .highlight .no { color: #003366; font-weight: bold } /* Name.Constant */ .highlight .nd { color: #555555 } /* Name.Decorator */ .highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */ .highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */ .highlight .nl { color: #336699; font-style: italic } /* Name.Label */ .highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */ .highlight .py { color: #336699; font-weight: bold } /* Name.Property */ .highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */ .highlight .nv { color: #336699 } /* Name.Variable */ .highlight .ow { color: #008800 } /* Operator.Word */ .highlight .w { color: #bbbbbb } /* Text.Whitespace */ .highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */ .highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */ .highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */ .highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */ .highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */ .highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */ .highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */ .highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */ .highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */ .highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */ .highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */ .highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */ .highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */ .highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */ .highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */ .highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */ .highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */ .highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */ .highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */ .highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */ .highlight .vc { color: #336699 } /* Name.Variable.Class */ .highlight .vg { color: #dd7700 } /* Name.Variable.Global */ .highlight .vi { color: #3333bb } /* Name.Variable.Instance */ .highlight .vm { color: #336699 } /* Name.Variable.Magic */ .highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */
extends Spatial

var orientation = ""  # north, south, east, west
var move = false
var move_to_x
var move_to_z
var target = null
var key


func _ready():
	var _connected = get_tree().get_root().get_node("Spatial/player").connect(
		"looked_at", self, "_looked_at"
	)
	if move:
		key.get_node("Viewport/GUI/Panel/TextEdit").connect(
			"answer_correct", self, "_answer_correct"
		)


func _answer_correct():
	var apclient = global.get_node("Archipelago")
	if not apclient._door_shuffle or apclient.paintingIsVanilla(self.get_parent().name):
		movePainting()


func movePainting():
	self.get_parent().translation.x = move_to_x
	self.get_parent().translation.z = move_to_z


func _looked_at(body, painting):
	if (
		target != null
		and body.is_in_group("player")
		and (painting.get_name() == self.get_parent().get_name())
	):
		var target_dir = _dir_to_int(target.orientation)
		var source_dir = _dir_to_int(orientation)
		var rotate = target_dir - source_dir
		if rotate < 0:
			rotate += 4
		rotate *= 90

		var target_painting = target.get_parent()

		# this is ACW
		if rotate == 0:
			body.translation.x = (
				target_painting.translation.x + (body.translation.x - painting.translation.x)
			)
			body.translation.y = (
				target_painting.translation.y + (body.translation.y - painting.translation.y)
			)
			body.translation.z = (
				target_painting.translation.z + (body.translation.z - painting.translation.z)
			)
		elif rotate == 180:
			body.translation.x = (
				target_painting.translation.x - (body.translation.x - painting.translation.x)
			)
			body.translation.y = (
				target_painting.translation.y + (body.translation.y - painting.translation.y)
			)
			body.translation.z = (
				target_painting.translation.z - (body.translation.z - painting.translation.z)
			)
			body.rotate_y(PI)
			body.velocity = body.velocity.rotated(Vector3(0, 1, 0), PI)
		elif rotate == 90:
			var diff_x = body.translation.x - painting.translation.x
			var diff_y = body.translation.y - painting.translation.y
			var diff_z = body.translation.z - painting.translation.z
			body.translation.x = target_painting.translation.x + diff_z
			body.translation.y = target_painting.translation.y + diff_y
			body.translation.z = target_painting.translation.z - diff_x
			body.rotate_y(PI / 2)
			body.velocity = body.velocity.rotated(Vector3(0, 1, 0), PI / 2)
		elif rotate == 270:
			var diff_x = body.translation.x - painting.translation.x
			var diff_y = body.translation.y - painting.translation.y
			var diff_z = body.translation.z - painting.translation.z
			body.translation.x = target_painting.translation.x - diff_z
			body.translation.y = target_painting.translation.y + diff_y
			body.translation.z = target_painting.translation.z + diff_x
			body.rotate_y(3 * PI / 2)
			body.velocity = body.velocity.rotated(Vector3(0, 1, 0), 3 * PI / 2)


func _dir_to_int(dir):
	if dir == "north":
		return 0
	elif dir == "west":
		return 1
	elif dir == "south":
		return 2
	elif dir == "east":
		return 3
	return 4