diff options
Diffstat (limited to 'Archipelago/mypainting.gd')
| -rw-r--r-- | Archipelago/mypainting.gd | 99 |
1 files changed, 99 insertions, 0 deletions
| diff --git a/Archipelago/mypainting.gd b/Archipelago/mypainting.gd new file mode 100644 index 0000000..5e9c703 --- /dev/null +++ b/Archipelago/mypainting.gd | |||
| @@ -0,0 +1,99 @@ | |||
| 1 | extends Spatial | ||
| 2 | |||
| 3 | var orientation = "" # north, south, east, west | ||
| 4 | var move = false | ||
| 5 | var move_to_x | ||
| 6 | var move_to_z | ||
| 7 | var target = null | ||
| 8 | var key | ||
| 9 | |||
| 10 | |||
| 11 | func _ready(): | ||
| 12 | var _connected = get_tree().get_root().get_node("Spatial/player").connect( | ||
| 13 | "looked_at", self, "_looked_at" | ||
| 14 | ) | ||
| 15 | if move: | ||
| 16 | key.get_node("Viewport/GUI/Panel/TextEdit").connect( | ||
| 17 | "answer_correct", self, "_answer_correct" | ||
| 18 | ) | ||
| 19 | |||
| 20 | |||
| 21 | func _answer_correct(): | ||
| 22 | var apclient = global.get_node("Archipelago") | ||
| 23 | if not apclient._door_shuffle or apclient.paintingIsVanilla(self.get_parent().name): | ||
| 24 | movePainting() | ||
| 25 | |||
| 26 | |||
| 27 | func movePainting(): | ||
| 28 | self.get_parent().translation.x = move_to_x | ||
| 29 | self.get_parent().translation.z = move_to_z | ||
| 30 | |||
| 31 | |||
| 32 | func _looked_at(body, painting): | ||
| 33 | if ( | ||
| 34 | target != null | ||
| 35 | and body.is_in_group("player") | ||
| 36 | and (painting.get_name() == self.get_parent().get_name()) | ||
| 37 | ): | ||
| 38 | var target_dir = _dir_to_int(target.orientation) | ||
| 39 | var source_dir = _dir_to_int(orientation) | ||
| 40 | var rotate = target_dir - source_dir | ||
| 41 | if rotate < 0: | ||
| 42 | rotate += 4 | ||
| 43 | rotate *= 90 | ||
| 44 | |||
| 45 | var target_painting = target.get_parent() | ||
| 46 | |||
| 47 | # this is ACW | ||
| 48 | if rotate == 0: | ||
| 49 | body.translation.x = ( | ||
| 50 | target_painting.translation.x + (body.translation.x - painting.translation.x) | ||
| 51 | ) | ||
| 52 | body.translation.y = ( | ||
| 53 | target_painting.translation.y + (body.translation.y - painting.translation.y) | ||
| 54 | ) | ||
| 55 | body.translation.z = ( | ||
| 56 | target_painting.translation.z + (body.translation.z - painting.translation.z) | ||
| 57 | ) | ||
| 58 | elif rotate == 180: | ||
| 59 | body.translation.x = ( | ||
| 60 | target_painting.translation.x - (body.translation.x - painting.translation.x) | ||
| 61 | ) | ||
| 62 | body.translation.y = ( | ||
| 63 | target_painting.translation.y + (body.translation.y - painting.translation.y) | ||
| 64 | ) | ||
| 65 | body.translation.z = ( | ||
| 66 | target_painting.translation.z - (body.translation.z - painting.translation.z) | ||
| 67 | ) | ||
| 68 | body.rotate_y(PI) | ||
| 69 | body.velocity = body.velocity.rotated(Vector3(0, 1, 0), PI) | ||
| 70 | elif rotate == 90: | ||
| 71 | var diff_x = body.translation.x - painting.translation.x | ||
| 72 | var diff_y = body.translation.y - painting.translation.y | ||
| 73 | var diff_z = body.translation.z - painting.translation.z | ||
| 74 | body.translation.x = target_painting.translation.x + diff_z | ||
| 75 | body.translation.y = target_painting.translation.y + diff_y | ||
| 76 | body.translation.z = target_painting.translation.z - diff_x | ||
| 77 | body.rotate_y(PI / 2) | ||
| 78 | body.velocity = body.velocity.rotated(Vector3(0, 1, 0), PI / 2) | ||
| 79 | elif rotate == 270: | ||
| 80 | var diff_x = body.translation.x - painting.translation.x | ||
| 81 | var diff_y = body.translation.y - painting.translation.y | ||
| 82 | var diff_z = body.translation.z - painting.translation.z | ||
| 83 | body.translation.x = target_painting.translation.x - diff_z | ||
| 84 | body.translation.y = target_painting.translation.y + diff_y | ||
| 85 | body.translation.z = target_painting.translation.z + diff_x | ||
| 86 | body.rotate_y(3 * PI / 2) | ||
| 87 | body.velocity = body.velocity.rotated(Vector3(0, 1, 0), 3 * PI / 2) | ||
| 88 | |||
| 89 | |||
| 90 | func _dir_to_int(dir): | ||
| 91 | if dir == "north": | ||
| 92 | return 0 | ||
| 93 | elif dir == "west": | ||
| 94 | return 1 | ||
| 95 | elif dir == "south": | ||
| 96 | return 2 | ||
| 97 | elif dir == "east": | ||
| 98 | return 3 | ||
| 99 | return 4 | ||
