diff --git a/Net/net.gd b/Net/net.gd index ef0292c..69f3095 100644 --- a/Net/net.gd +++ b/Net/net.gd @@ -1,6 +1,9 @@ extends Node # Автолоад "Net". Один и тот же скрипт работает и на клиенте, и на выделенном сервере # (RPC требуют одинаковый путь узла и скрипт). Сервер — это headless-запуск Godot. +# +# Игроки делятся на «комнаты» по картам: видят друг друга и общий камень-преследователь +# только те, кто сейчас на одной карте. Сервер ничего не знает об уровнях — он лишь пересылает. const PORT = 9080 const DEFAULT_URL = "ws://127.0.0.1:9080" @@ -20,16 +23,24 @@ var ghosts := {} # peer_id -> Ghost var send_timer := 0.0 var connected := false +# Клиент: на какой мы карте. map_ready — сервер подтвердил, что мы в её комнате. +var current_map := "world" +var map_ready := false + # Камень-преследователь: его считает один клиент (владелец), остальные повторяют var rock: Node3D = null # Камень этой сцены (регистрирует сам) -var rock_owner := 0 # peer_id владельца (0 — ещё не назначен); на сервере тоже +var rock_owner := 0 # peer_id владельца (0 — ещё не назначен) var rock_pos := Vector3.ZERO var rock_yaw := 0.0 var rock_has_state := false -var rock_last_seen := 0.0 # Сервер: когда владелец в последний раз присылал камень (сек) var dead_peers := {} # peer_id -> true, пока игрока поймали var hooked_player: Node = null +# Сервер +var peer_maps := {} # peer_id -> карта ("" пока клиент не сообщил) +var rock_owners := {} # карта -> peer_id владельца камня +var rock_seen := {} # карта -> время (сек), когда владелец последний раз присылал камень + func _ready() -> void: is_server = DisplayServer.get_name() == "headless" if is_server: @@ -53,67 +64,96 @@ func _start_server() -> void: func _server_peer_joined(id: int) -> void: print("+ игрок ", id) - if rock_owner == 0: - _set_rock_owner(id) - else: - recv_rock_owner.rpc_id(id, rock_owner) + peer_maps[id] = "" func _server_peer_left(id: int) -> void: print("- игрок ", id) - for other in multiplayer.get_peers(): - if other != id: - recv_left.rpc_id(other, id) - if id == rock_owner: - _set_rock_owner(_next_rock_owner(id), id) + var map: String = peer_maps.get(id, "") + peer_maps.erase(id) + _leave_room(id, map) -# Новый владелец камня — наименьший peer_id среди оставшихся, кроме except (0 — никого) -func _next_rock_owner(except: int) -> int: - var next := 0 +# Игроки комнаты map, кроме except +func _room(map: String, except := 0) -> Array: + var out := [] + if map == "": + return out for p in multiplayer.get_peers(): - if p != except and (next == 0 or p < next): + if p != except and peer_maps.get(p, "") == map: + out.append(p) + return out + +# Игрок id покинул комнату map (вышел или сменил карту) +func _leave_room(id: int, map: String) -> void: + if map == "": + return + for other in _room(map, id): + recv_left.rpc_id(other, id) + if rock_owners.get(map, 0) == id: + _set_rock_owner(map, _next_rock_owner(map, id)) + +# Новый владелец камня — наименьший peer_id в комнате, кроме except (0 — никого) +func _next_rock_owner(map: String, except: int) -> int: + var next := 0 + for p in _room(map, except): + if next == 0 or p < next: next = p return next -func _set_rock_owner(id: int, gone := 0) -> void: - rock_owner = id - rock_last_seen = Time.get_ticks_msec() / 1000.0 +func _set_rock_owner(map: String, id: int) -> void: + rock_owners[map] = id + rock_seen[map] = Time.get_ticks_msec() / 1000.0 if id != 0: - print("камень считает игрок ", id) - for p in multiplayer.get_peers(): - if p != gone: - recv_rock_owner.rpc_id(p, id) + print("[%s] камень считает игрок %d" % [map, id]) + for p in _room(map): + recv_rock_owner.rpc_id(p, id) # Владелец перестал присылать камень (вкладка в фоне, лаги) — передаём другому func _server_check_rock_owner() -> void: - if rock_owner == 0: - return - if Time.get_ticks_msec() / 1000.0 - rock_last_seen > ROCK_TIMEOUT: - var next := _next_rock_owner(rock_owner) - if next != 0: - _set_rock_owner(next) + var now := Time.get_ticks_msec() / 1000.0 + for map in rock_owners.keys(): + var owner: int = rock_owners[map] + if owner != 0 and now - rock_seen.get(map, now) > ROCK_TIMEOUT: + var next := _next_rock_owner(map, owner) + if next != 0: + _set_rock_owner(map, next) -# Клиент -> сервер: своё состояние. Сервер пересылает остальным. +# Клиент -> сервер: я теперь на этой карте. Подтверждение приходит в recv_map_ack. +@rpc("any_peer", "reliable") +func submit_map(map: String) -> void: + if not is_server: + return + var id := multiplayer.get_remote_sender_id() + var old: String = peer_maps.get(id, "") + peer_maps[id] = map + if old != map: + _leave_room(id, old) + recv_map_ack.rpc_id(id, map) + if rock_owners.get(map, 0) == 0: + _set_rock_owner(map, id) + else: + recv_rock_owner.rpc_id(id, rock_owners[map]) + +# Клиент -> сервер: своё состояние. Сервер пересылает остальным на той же карте. @rpc("any_peer", "unreliable_ordered") func submit_state(pos: Vector3, yaw: float, pitch: float, flags: int) -> void: if not is_server: return var sender := multiplayer.get_remote_sender_id() - for other in multiplayer.get_peers(): - if other != sender: - recv_state.rpc_id(other, sender, pos, yaw, pitch, flags) + for other in _room(peer_maps.get(sender, ""), sender): + recv_state.rpc_id(other, sender, pos, yaw, pitch, flags) -# Владелец камня -> сервер: позиция камня. Сервер пересылает остальным. +# Владелец камня -> сервер: позиция камня. Сервер пересылает остальным на той же карте. @rpc("any_peer", "unreliable_ordered") func submit_rock(pos: Vector3, yaw: float) -> void: if not is_server: return var sender := multiplayer.get_remote_sender_id() - if sender != rock_owner: + var map: String = peer_maps.get(sender, "") + if map == "" or rock_owners.get(map, 0) != sender: return - rock_last_seen = Time.get_ticks_msec() / 1000.0 - for other in multiplayer.get_peers(): - if other != sender: - recv_rock.rpc_id(other, pos, yaw) + rock_seen[map] = Time.get_ticks_msec() / 1000.0 + for other in _room(map, sender): + recv_rock.rpc_id(other, pos, yaw) # Клиент -> сервер: его поймали (dead) или он возродился в точке pos. @rpc("any_peer", "reliable") @@ -121,9 +161,8 @@ func submit_life(dead: bool, pos: Vector3) -> void: if not is_server: return var sender := multiplayer.get_remote_sender_id() - for other in multiplayer.get_peers(): - if other != sender: - recv_life.rpc_id(other, sender, dead, pos) + for other in _room(peer_maps.get(sender, ""), sender): + recv_life.rpc_id(other, sender, dead, pos) # ---------- Клиент ---------- @@ -152,23 +191,81 @@ func _connect_client() -> void: func _on_connected() -> void: connected = true + submit_map.rpc_id(1, current_map) func _on_lost() -> void: connected = false - for g in ghosts.values(): - g.queue_free() - ghosts.clear() - dead_peers.clear() - rock_owner = 0 - rock_has_state = false + _reset_room_state() multiplayer.multiplayer_peer = null _schedule_retry() func _schedule_retry() -> void: get_tree().create_timer(RETRY_DELAY).timeout.connect(_connect_client) +# Забываем всё, что знали про комнату: чужих игроков, владельца и позицию камня +func _reset_room_state() -> void: + for g in ghosts.values(): + if is_instance_valid(g): + g.queue_free() + ghosts.clear() + dead_peers.clear() + rock_owner = 0 + rock_has_state = false + hooked_player = null + map_ready = false + +# Мы перешли на другую карту (вызывает сама карта при загрузке, идемпотентно) +func enter_map(map: String) -> void: + if map == current_map: + return + current_map = map + _reset_room_state() + if connected: + submit_map.rpc_id(1, map) + +# Портал: сообщаем серверу о смене карты и загружаем сцену +func go_to_map(map: String, scene_path: String) -> void: + enter_map(map) + get_tree().change_scene_to_file.call_deferred(scene_path) + +# Камень считаем сами: если не в сети или мы владелец. Пока сервер не назначил владельца — ждём. +func rock_is_local() -> bool: + if not connected: + return true + return rock_owner == multiplayer.get_unique_id() + +@rpc("authority", "reliable") +func recv_map_ack(map: String) -> void: + if map == current_map: + map_ready = true + +@rpc("authority", "reliable") +func recv_rock_owner(id: int) -> void: + if map_ready: + rock_owner = id + +@rpc("authority", "unreliable_ordered") +func recv_rock(pos: Vector3, yaw: float) -> void: + if not map_ready: + return + rock_pos = pos + rock_yaw = yaw + rock_has_state = true + +@rpc("authority", "reliable") +func recv_life(id: int, dead: bool, pos: Vector3) -> void: + if not map_ready: + return + if dead: + dead_peers[id] = true + else: + dead_peers.erase(id) + peer_respawned.emit(pos) + @rpc("authority", "unreliable_ordered") func recv_state(id: int, pos: Vector3, yaw: float, pitch: float, flags: int) -> void: + if not map_ready or get_tree().current_scene == null: + return # Идёт смена сцены — следующий пакет придёт через 50 мс var ghost: Ghost = ghosts.get(id) if ghost == null: ghost = Ghost.new() @@ -185,30 +282,6 @@ func recv_left(id: int) -> void: ghosts.erase(id) dead_peers.erase(id) -# Камень считаем сами: если не в сети или мы владелец. Пока сервер не назначил владельца — ждём. -func rock_is_local() -> bool: - if not connected: - return true - return rock_owner == multiplayer.get_unique_id() - -@rpc("authority", "reliable") -func recv_rock_owner(id: int) -> void: - rock_owner = id - -@rpc("authority", "unreliable_ordered") -func recv_rock(pos: Vector3, yaw: float) -> void: - rock_pos = pos - rock_yaw = yaw - rock_has_state = true - -@rpc("authority", "reliable") -func recv_life(id: int, dead: bool, pos: Vector3) -> void: - if dead: - dead_peers[id] = true - else: - dead_peers.erase(id) - peer_respawned.emit(pos) - # Сообщаем остальным о смерти и возрождении своего игрока func _hook_player(player: Node) -> void: if hooked_player == player: @@ -218,14 +291,14 @@ func _hook_player(player: Node) -> void: player.respawned.connect(func(): _send_life(false, player)) func _send_life(dead: bool, player: Node) -> void: - if connected: + if connected and map_ready: submit_life.rpc_id(1, dead, player.global_position) func _process(delta: float) -> void: if is_server: _server_check_rock_owner() return - if not connected: + if not connected or not map_ready: return send_timer += delta if send_timer < 1.0 / SEND_RATE: diff --git a/World/Backrooms/backrooms.gd b/World/Backrooms/backrooms.gd new file mode 100644 index 0000000..7352a36 --- /dev/null +++ b/World/Backrooms/backrooms.gd @@ -0,0 +1,56 @@ +extends Node3D +# Backrooms на готовой модели. Сцена живёт в отдельном пакете (backrooms.pck) и качается +# только при первом входе в портал. Коллизии строим по мешам модели при загрузке, +# навмеш для камня запечён заранее (backrooms_nav.res) — в вебе запекать на лету долго. + +func _ready() -> void: + Net.enter_map("backrooms") + _build_colliders() + _build_environment() + _build_hum() + +func _build_colliders() -> void: + for mi in $Map.find_children("*", "MeshInstance3D", true, false): + mi.create_trimesh_collision() + +func _build_environment() -> void: + var env := Environment.new() + env.background_mode = Environment.BG_COLOR + env.background_color = Color(0.06, 0.05, 0.03) + env.ambient_light_source = Environment.AMBIENT_SOURCE_COLOR + env.ambient_light_color = Color(1.0, 0.95, 0.8) + env.ambient_light_energy = 0.7 + env.fog_enabled = true + env.fog_light_color = Color(0.25, 0.2, 0.09) + env.fog_density = 0.012 + var we := WorldEnvironment.new() + we.environment = env + add_child(we) + +# Гул ламп: 2 секунды, частоты кратны 0.5 Гц — петля без щелчка +func _build_hum() -> void: + const RATE := 11025 + var n := RATE * 2 + var data := PackedByteArray() + data.resize(n * 2) + var rng := RandomNumberGenerator.new() + rng.seed = 5 + for i in n: + var t := float(i) / RATE + var s := 0.50 * sin(TAU * 60.0 * t) + 0.25 * sin(TAU * 120.0 * t) \ + + 0.12 * sin(TAU * 180.0 * t) + 0.06 * sin(TAU * 240.0 * t) + s += rng.randf_range(-1.0, 1.0) * 0.03 + data.encode_s16(i * 2, int(clampf(s, -1.0, 1.0) * 12000.0)) + var wav := AudioStreamWAV.new() + wav.format = AudioStreamWAV.FORMAT_16_BITS + wav.mix_rate = RATE + wav.stereo = false + wav.loop_mode = AudioStreamWAV.LOOP_FORWARD + wav.loop_begin = 0 + wav.loop_end = n + wav.data = data + var player := AudioStreamPlayer.new() + player.stream = wav + player.volume_db = -12.0 + player.autoplay = true + add_child(player) diff --git a/World/Backrooms/backrooms.gd.uid b/World/Backrooms/backrooms.gd.uid new file mode 100644 index 0000000..5f9d1e8 --- /dev/null +++ b/World/Backrooms/backrooms.gd.uid @@ -0,0 +1 @@ +uid://gmpkjl6m3415 diff --git a/World/Backrooms/backrooms.tscn b/World/Backrooms/backrooms.tscn new file mode 100644 index 0000000..84afdda --- /dev/null +++ b/World/Backrooms/backrooms.tscn @@ -0,0 +1,35 @@ +[gd_scene format=3 uid="uid://djgkggvwiaaoy"] + +[ext_resource type="Script" uid="uid://gmpkjl6m3415" path="res://World/Backrooms/backrooms.gd" id="1_level"] +[ext_resource type="PackedScene" uid="uid://b8ef3wy1pthgm" path="res://models/backrooms/backrooms_vr.glb" id="2_map"] +[ext_resource type="PackedScene" uid="uid://c3efk6k8xnf57" path="res://Player/Player.tscn" id="3_player"] +[ext_resource type="PackedScene" path="res://models/Bochi-Rock/rock.tscn" id="4_rock"] +[ext_resource type="Script" uid="uid://bu8v0ivhmnykt" path="res://World/portal.gd" id="5_portal"] +[ext_resource type="NavigationMesh" path="res://World/Backrooms/backrooms_nav.res" id="6_nav"] + +[node name="Backrooms" type="Node3D" unique_id=511186617] +script = ExtResource("1_level") + +[node name="Map" parent="." unique_id=82811432 instance=ExtResource("2_map")] +transform = Transform3D(1.4, 0, 0, 0, 1.4, 0, 0, 0, 1.4, 0, 0, 0) + +[node name="Player" parent="." unique_id=143512730 instance=ExtResource("3_player")] +transform = Transform3D(0, 0, 1, 0, 1, 0, -1, 0, 0, -0.4838078, 1.2, 2.0468445) + +[node name="Rock" parent="." unique_id=311663607 instance=ExtResource("4_rock")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -48, 0, 3) +speed = 10.0 +catch_distance = 2.0 +catch_height = 3.0 +sight_limited = true + +[node name="Exit" type="Area3D" parent="." unique_id=1540431614] +transform = Transform3D(0, 0, 1, 0, 1, 0, -1, 0, 0, -72, -0.15, 9) +script = ExtResource("5_portal") +target_map = "world" +target_scene = "res://main.tscn" +title = "EXIT" +color = Color(0.3, 1, 0.45, 1) + +[node name="Navigation" type="NavigationRegion3D" parent="." unique_id=122126248] +navigation_mesh = ExtResource("6_nav") diff --git a/World/Backrooms/backrooms_nav.res b/World/Backrooms/backrooms_nav.res new file mode 100644 index 0000000..734caa2 Binary files /dev/null and b/World/Backrooms/backrooms_nav.res differ diff --git a/World/map_loader.gd b/World/map_loader.gd new file mode 100644 index 0000000..a732067 --- /dev/null +++ b/World/map_loader.gd @@ -0,0 +1,123 @@ +extends Node +# Подгружает карту отдельным пакетом при первом входе в портал: в вебе её не качают при старте игры. +# Пакет (например backrooms.pck) лежит рядом с index.html. Если сцена уже есть в проекте +# (редактор, десктоп-запуск) — качать нечего, переходим сразу. + +signal enter_failed + +const PACK_URL_ARG := "--pack-url=" # Для тестов на десктопе: --pack-url=http://127.0.0.1:8000/ + +var _loaded := {} # имя пакета -> true, чтобы не качать и не монтировать дважды +var _busy := false +var _layer: CanvasLayer +var _label: Label +var _bar: ProgressBar + +func _ready() -> void: + process_mode = Node.PROCESS_MODE_ALWAYS + +func enter(map: String, scene_path: String, pack_name: String, title: String) -> void: + if _busy: + return + if pack_name != "" and not _loaded.has(pack_name) and not ResourceLoader.exists(scene_path): + _busy = true + var ok := await _download_and_mount(pack_name, title) + _busy = false + if not ok: + enter_failed.emit() + return + Net.go_to_map(map, scene_path) + +func _download_and_mount(pack_name: String, title: String) -> bool: + _show("Загрузка: %s…" % title) + get_tree().paused = true # Пока качаем, мир стоит (камень не должен убить игрока на экране загрузки) + + var http := HTTPRequest.new() + http.process_mode = Node.PROCESS_MODE_ALWAYS + http.download_file = "user://" + pack_name + add_child(http) + var state := {"done": false, "result": -1, "code": 0} + http.request_completed.connect(func(result: int, code: int, _h, _b): + state.result = result + state.code = code + state.done = true) + + var ok := false + # no-cache: браузер сверяет файл с сервером (после обновления пакета не подсунет старый из кэша) + if http.request(_pack_url(pack_name), ["Cache-Control: no-cache"]) == OK: + while not state.done: + _update_progress(http, title) + await get_tree().process_frame + if state.result == HTTPRequest.RESULT_SUCCESS and state.code == 200: + ok = ProjectSettings.load_resource_pack("user://" + pack_name, false) # false: файлы основной игры в приоритете + http.queue_free() + + if ok: + _loaded[pack_name] = true + _hide() + else: + _label.text = "Не удалось загрузить карту" + _bar.visible = false + await get_tree().create_timer(2.5).timeout + _hide() + get_tree().paused = false + return ok + +func _pack_url(pack_name: String) -> String: + for arg in OS.get_cmdline_user_args(): + if arg.begins_with(PACK_URL_ARG): + return arg.substr(PACK_URL_ARG.length()) + pack_name + if OS.has_feature("web"): + return str(JavaScriptBridge.eval("new URL('%s', window.location.href).href" % pack_name)) + return "http://127.0.0.1:8000/" + pack_name + +# ---------- Экран загрузки ---------- + +func _show(text: String) -> void: + _layer = CanvasLayer.new() + _layer.layer = 100 + add_child(_layer) + + var bg := ColorRect.new() + bg.color = Color(0, 0, 0, 0.88) + bg.mouse_filter = Control.MOUSE_FILTER_IGNORE + _layer.add_child(bg) + bg.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT) + + _label = Label.new() + _label.text = text + _label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER + _label.vertical_alignment = VERTICAL_ALIGNMENT_CENTER + _label.add_theme_font_size_override("font_size", 40) + bg.add_child(_label) + _label.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT) + + _bar = ProgressBar.new() + _bar.custom_minimum_size = Vector2(420, 14) + _bar.show_percentage = false + _bar.indeterminate = true + var track := StyleBoxFlat.new() + track.bg_color = Color(1, 1, 1, 0.15) + var fill := StyleBoxFlat.new() + fill.bg_color = Color(1.0, 0.85, 0.25) + _bar.add_theme_stylebox_override("background", track) + _bar.add_theme_stylebox_override("fill", fill) + bg.add_child(_bar) + _bar.set_anchors_and_offsets_preset(Control.PRESET_CENTER_BOTTOM, Control.PRESET_MODE_KEEP_SIZE) + _bar.position.y -= 120 + +func _update_progress(http: HTTPRequest, title: String) -> void: + var got := http.get_downloaded_bytes() + var total := http.get_body_size() # -1, если сервер не прислал Content-Length (например, gzip) + if total > 0: + _bar.indeterminate = false + _bar.max_value = total + _bar.value = got + _label.text = "Загрузка: %s\n%.1f / %.1f МБ" % [title, got / 1048576.0, total / 1048576.0] + else: + _label.text = "Загрузка: %s\n%.1f МБ" % [title, got / 1048576.0] + +func _hide() -> void: + if _layer: + _layer.queue_free() + _layer = null diff --git a/World/map_loader.gd.uid b/World/map_loader.gd.uid new file mode 100644 index 0000000..cb0efe4 --- /dev/null +++ b/World/map_loader.gd.uid @@ -0,0 +1 @@ +uid://bp4qld1nj4cla diff --git a/World/portal.gd b/World/portal.gd new file mode 100644 index 0000000..82a8296 --- /dev/null +++ b/World/portal.gd @@ -0,0 +1,90 @@ +extends Area3D +# Портал на другую карту: шаг в рамку — переход. Для сети игрок попадает в «комнату» новой карты. + +@export var target_map := "backrooms" +@export var target_scene := "res://World/Backrooms/backrooms.tscn" +@export var pack_name := "" # Пакет с картой (качается при первом входе); пусто — карта уже в игре +@export var title := "BACKROOMS" +@export var color := Color(1.0, 0.85, 0.25) +@export var frame_size := Vector2(2.6, 3.6) +@export var trigger_size := Vector3(3.2, 3.6, 3.0) # Зона входа шире рамки, чтобы не обойти сбоку + +var _used := false +var _glow: StandardMaterial3D + +func _ready() -> void: + collision_layer = 0 + collision_mask = 1 + var cs := CollisionShape3D.new() + var shape := BoxShape3D.new() + shape.size = trigger_size + cs.shape = shape + cs.position.y = trigger_size.y * 0.5 + add_child(cs) + _build_visuals() + body_entered.connect(_on_body_entered) + MapLoader.enter_failed.connect(func(): _used = false) # Не скачалось — можно зайти ещё раз + +func _build_visuals() -> void: + var w := frame_size.x + var h := frame_size.y + + var frame_mat := StandardMaterial3D.new() + frame_mat.albedo_color = color.darkened(0.5) + frame_mat.emission_enabled = true + frame_mat.emission = color + frame_mat.emission_energy_multiplier = 1.5 + _add_box(Vector3(0.2, h, 0.2), Vector3(-w * 0.5 - 0.1, h * 0.5, 0), frame_mat) + _add_box(Vector3(0.2, h, 0.2), Vector3(w * 0.5 + 0.1, h * 0.5, 0), frame_mat) + _add_box(Vector3(w + 0.4, 0.2, 0.2), Vector3(0, h + 0.1, 0), frame_mat) + + _glow = StandardMaterial3D.new() + _glow.shading_mode = BaseMaterial3D.SHADING_MODE_UNSHADED + _glow.transparency = BaseMaterial3D.TRANSPARENCY_ALPHA + _glow.cull_mode = BaseMaterial3D.CULL_DISABLED + _glow.albedo_color = Color(color, 0.35) + var quad := QuadMesh.new() + quad.size = frame_size + quad.material = _glow + var plane := MeshInstance3D.new() + plane.mesh = quad + plane.position.y = h * 0.5 + plane.cast_shadow = GeometryInstance3D.SHADOW_CASTING_SETTING_OFF + add_child(plane) + + var label := Label3D.new() + label.text = title + label.billboard = BaseMaterial3D.BILLBOARD_ENABLED + label.pixel_size = 0.01 + label.font_size = 64 + label.outline_size = 12 + label.modulate = color + label.position.y = h + 0.8 + add_child(label) + + var light := OmniLight3D.new() + light.light_color = color + light.light_energy = 1.5 + light.omni_range = 9.0 + light.position.y = h * 0.5 + light.shadow_enabled = false + add_child(light) + +func _add_box(size: Vector3, pos: Vector3, mat: Material) -> void: + var mesh := BoxMesh.new() + mesh.size = size + mesh.material = mat + var mi := MeshInstance3D.new() + mi.mesh = mesh + mi.position = pos + mi.cast_shadow = GeometryInstance3D.SHADOW_CASTING_SETTING_OFF + add_child(mi) + +func _process(_delta: float) -> void: + _glow.albedo_color.a = 0.3 + 0.12 * sin(Time.get_ticks_msec() * 0.004) + +func _on_body_entered(body: Node3D) -> void: + if _used or not body.is_in_group("local_player") or body.get("is_dead"): + return + _used = true + MapLoader.enter(target_map, target_scene, pack_name, title) diff --git a/World/portal.gd.uid b/World/portal.gd.uid new file mode 100644 index 0000000..4149395 --- /dev/null +++ b/World/portal.gd.uid @@ -0,0 +1 @@ +uid://bu8v0ivhmnykt diff --git a/export_presets.cfg b/export_presets.cfg index e9b33d3..3830140 100644 --- a/export_presets.cfg +++ b/export_presets.cfg @@ -10,7 +10,7 @@ dedicated_server=false custom_features="" export_filter="all_resources" include_filter="" -exclude_filter="" +exclude_filter="models/backrooms/*, World/Backrooms/*" export_path="../grid-world/index.html" patches=PackedStringArray() patch_delta_encoding=false @@ -50,3 +50,53 @@ progressive_web_app/icon_512x512="" progressive_web_app/background_color=Color(0, 0, 0, 1) threads/emscripten_pool_size=8 threads/godot_pool_size=4 + +[preset.1] + +name="Backrooms" +platform="Web" +dedicated_server=false +custom_features="" +export_filter="resources" +export_files=PackedStringArray("res://World/Backrooms/backrooms.tscn") +include_filter="" +exclude_filter="Player/*, models/Bochi-Rock/*, World/portal.gd" +export_path="../grid-world/backrooms.pck" +patches=PackedStringArray() +patch_delta_encoding=false +patch_delta_compression_level_zstd=19 +patch_delta_min_reduction=0.1 +patch_delta_include_filters="*" +patch_delta_exclude_filters="" +encryption_include_filters="" +encryption_exclude_filters="" +seed=0 +encrypt_pck=false +encrypt_directory=false +script_export_mode=2 + +[preset.1.options] + +custom_template/debug="" +custom_template/release="" +variant/extensions_support=true +variant/thread_support=false +vram_texture_compression/for_desktop=true +vram_texture_compression/for_mobile=false +html/export_icon=true +html/custom_html_shell="" +html/head_include="" +html/canvas_resize_policy=2 +html/focus_canvas_on_start=true +html/experimental_virtual_keyboard=false +progressive_web_app/enabled=false +progressive_web_app/ensure_cross_origin_isolation_headers=true +progressive_web_app/offline_page="" +progressive_web_app/display=3 +progressive_web_app/orientation=0 +progressive_web_app/icon_144x144="" +progressive_web_app/icon_180x180="" +progressive_web_app/icon_512x512="" +progressive_web_app/background_color=Color(0, 0, 0, 1) +threads/emscripten_pool_size=8 +threads/godot_pool_size=4 diff --git a/main.tscn b/main.tscn index dede99b..ee91d87 100644 --- a/main.tscn +++ b/main.tscn @@ -18,6 +18,7 @@ [ext_resource type="Script" uid="uid://chtck5eaaddrw" path="res://World/levitate.gd" id="15_levitate"] [ext_resource type="PackedScene" uid="uid://bmprcwbt78ghq" path="res://models/empire-state/Empire-State.glb" id="17_yaehf"] [ext_resource type="Script" uid="uid://c2k1kj4a2s2su" path="res://World/nav-bake.gd" id="18_navbake"] +[ext_resource type="Script" uid="uid://bu8v0ivhmnykt" path="res://World/portal.gd" id="19_portal"] [sub_resource type="PanoramaSkyMaterial" id="PanoramaSkyMaterial_6opy2"] panorama = ExtResource("2_5vw27") @@ -62,8 +63,14 @@ amplitude = 5.0 period = 8.0 [node name="rock" type="Node3D" parent="Architecture" unique_id=1419147983] -transform = Transform3D(-0.4002386, 0, -0.916411, 0, 1, 0, 0.916411, 0, -0.4002386, 5.2467575, -0.0029411316, 93.87327) +transform = Transform3D(-0.4002386, 0, -0.916411, 0, 1, 0, 0.916411, 0, -0.4002386, 8.31884, -0.0029411316, 40.503094) script = ExtResource("10_4c57u") +sight_limited = true +sight_range = 45.0 +sight_fov = 130.0 +hearing_radius = 8.0 +lose_time = 5.0 +wander_radius = 40.0 [node name="Rock" parent="Architecture/rock" unique_id=1431376827 instance=ExtResource("11_efxa6")] @@ -127,3 +134,8 @@ transform = Transform3D(-4.371139e-08, 0, -1, 0, 1, 0, 1, 0, -4.371139e-08, 188. [node name="Navigation" type="NavigationRegion3D" parent="." unique_id=1471038126] script = ExtResource("18_navbake") exclude = Array[NodePath]([NodePath("../Architecture/rock"), NodePath("../CharacterBody3D")]) + +[node name="BackroomsPortal" type="Area3D" parent="." unique_id=982018721] +transform = Transform3D(-0.49999985, 0, -0.8660255, 0, 1, 0, 0.8660255, 0, -0.49999985, -14.694777, 7.7547903, 22.85205) +script = ExtResource("19_portal") +pack_name = "backrooms.pck" diff --git a/models/Bochi-Rock/rock-follow.gd b/models/Bochi-Rock/rock-follow.gd index 2bbbda3..2ff5ac5 100644 --- a/models/Bochi-Rock/rock-follow.gd +++ b/models/Bochi-Rock/rock-follow.gd @@ -1,5 +1,7 @@ extends Node3D # Камень преследует ближайшего живого игрока, обходя препятствия по навмешу, и ловит его. +# С sight_limited он замечает игрока лишь вблизи или в поле зрения без стен между ними; +# потеряв из виду, идёт к последнему месту, где видел, и дальше бродит по карте. # В сети камень считает один клиент (владелец, его назначает сервер), остальные # плавно повторяют его позицию — поэтому у всех игроков камень один и тот же. @@ -12,15 +14,37 @@ extends Node3D @export var sync_smoothing := 12.0 # Плавность повтора чужого камня @export var snap_distance := 20.0 # Дальше этого чужой камень не едет, а прыгает (сброс на старт) +@export_group("Зрение") +@export var sight_limited := false # false — знает, где игрок, из любой точки карты +@export var sight_range := 30.0 # Дальность зрения, м +@export var sight_fov := 120.0 # Угол обзора, градусы +@export var hearing_radius := 6.0 # Ближе этого замечает игрока, даже за стеной +@export var lose_time := 4.0 # Сколько ещё идёт за игроком после потери из виду, сек +@export var patrol_speed := 0.4 # Доля speed, когда бродит +@export var wander_radius := 30.0 # Куда выбирает точки для прогулки, м +@export var eye_height := 0.9 # Высота «глаз» над полом, м + @onready var agent: NavigationAgent3D = $NavigationAgent3D @onready var start_transform := global_transform +enum State { WANDER, CHASE } + var player: Node3D = null +var _state := State.WANDER +var _last_seen := Vector3.ZERO +var _since_seen := 0.0 +var _wander_target := Vector3.ZERO +var _wander_active := false +var _wander_wait := 0.0 +var _wander_time := 0.0 +var _own_rids: Array[RID] = [] func _ready() -> void: agent.target_desired_distance = 1.0 agent.path_desired_distance = 1.5 agent.path_height_offset = 0.25 # Навмеш лежит чуть выше пола + for body in find_children("*", "CollisionObject3D", true, false): + _own_rids.append(body.get_rid()) # Луч зрения не должен упираться в сам камень Net.rock = self Net.peer_respawned.connect(_on_respawned) @@ -51,52 +75,151 @@ func _try_catch() -> void: if flat.length() <= catch_distance and absf(dy) <= catch_height: player.die() -# Ближайший по горизонтали живой игрок: свой или чужой -func _pick_target() -> Node3D: - var best: Node3D = null - var best_d := INF - var candidates: Array[Node3D] = [] +# Живые игроки: свой и чужие +func _candidates() -> Array[Node3D]: + var out: Array[Node3D] = [] if not player.get("is_dead"): - candidates.append(player) + out.append(player) for id in Net.ghosts: var g: Node3D = Net.ghosts[id] if is_instance_valid(g) and not Net.dead_peers.has(id): - candidates.append(g) - for c in candidates: - var d := Vector2(c.global_position.x - global_position.x, c.global_position.z - global_position.z).length_squared() + out.append(g) + return out + +func _horizontal_dist_sq(c: Node3D) -> float: + return Vector2(c.global_position.x - global_position.x, c.global_position.z - global_position.z).length_squared() + +# Ближайший по горизонтали живой игрок +func _pick_target() -> Node3D: + var best: Node3D = null + var best_d := INF + for c in _candidates(): + var d := _horizontal_dist_sq(c) if d < best_d: best_d = d best = c return best -func _chase(delta: float) -> void: - var target := _pick_target() - if target == null: - return # Все лежат — стоим +# Ближайший из тех, кого камень сейчас замечает +func _pick_visible_target() -> Node3D: + var best: Node3D = null + var best_d := INF + for c in _candidates(): + var d := _horizontal_dist_sq(c) + if d < best_d and _can_see(c): + best_d = d + best = c + return best - var flat := target.global_position - global_position - flat.y = 0.0 - if flat.length() <= catch_distance: - _face(flat, delta) # Стоим над жертвой, пока её клиент не засчитает поимку +# Рядом — слышит (даже за стеной); дальше — только в конусе обзора и если стены не мешают +func _can_see(c: Node3D) -> bool: + var to := c.global_position - global_position + var flat := Vector3(to.x, 0.0, to.z) + var dist := flat.length() + if dist <= hearing_radius: + return true + if dist > sight_range: + return false + var fwd := -global_transform.basis.z + fwd.y = 0.0 + if fwd.normalized().dot(flat / dist) < cos(deg_to_rad(sight_fov * 0.5)): + return false + var query := PhysicsRayQueryParameters3D.create(global_position + Vector3(0, eye_height, 0), c.global_position, 1) + var exclude := _own_rids.duplicate() + if c is CollisionObject3D: + exclude.append(c.get_rid()) + query.exclude = exclude + return get_world_3d().direct_space_state.intersect_ray(query).is_empty() + +func _chase(delta: float) -> void: + if not sight_limited: + var target := _pick_target() + if target != null: # Все лежат — стоим + _move_to(target.global_position, speed, catch_distance, delta) return + var seen := _pick_visible_target() + if seen != null: + _state = State.CHASE + _last_seen = seen.global_position + _since_seen = 0.0 + elif _state == State.CHASE: + _since_seen += delta + if _since_seen > lose_time: + _state = State.WANDER + _wander_active = false + _wander_wait = 1.0 + + if _state == State.CHASE: + # Видим — стоим над жертвой у catch_distance; потеряли — идём к последнему месту + _move_to(_last_seen, speed, catch_distance if seen != null else 1.5, delta) + else: + _wander(delta) + +func _wander(delta: float) -> void: + if _wander_wait > 0.0: + _wander_wait -= delta + return + if not _wander_active: + if not _pick_wander_target(): + _wander_wait = 1.0 + return + _wander_active = true + _wander_time = 0.0 + _wander_time += delta + if _move_to(_wander_target, speed * patrol_speed, 1.5, delta) or _wander_time > 20.0: + _wander_active = false + _wander_wait = randf_range(1.0, 3.0) + +# Случайная точка навмеша на расстоянии 8..wander_radius м; нет такой — ближайшая из дальних +func _pick_wander_target() -> bool: + var map := agent.get_navigation_map() + if NavigationServer3D.map_get_iteration_id(map) == 0: + return false + var best := Vector3.INF + var best_d := INF + for i in 8: + var p := NavigationServer3D.map_get_random_point(map, 1, true) + var d := p.distance_to(global_position) + if d < 8.0: + continue + if d <= wander_radius: + best = p + break + if d < best_d: + best = p + best_d = d + if best == Vector3.INF: + return false + _wander_target = best + return true + +# Шаг к точке по навмешу. true — дошли (ближе stop_dist по горизонтали) +func _move_to(dest: Vector3, spd: float, stop_dist: float, delta: float) -> bool: + var flat := dest - global_position + flat.y = 0.0 + if flat.length() <= stop_dist: + _face(flat, delta) # Стоим над жертвой, пока её клиент не засчитает поимку + return true + var step: Vector3 var map := agent.get_navigation_map() if NavigationServer3D.map_get_iteration_id(map) > 0: - if agent.target_position.distance_to(target.global_position) > repath_distance: - agent.target_position = target.global_position + if agent.target_position.distance_to(dest) > repath_distance: + agent.target_position = dest if not agent.is_navigation_finished(): step = agent.get_next_path_position() - global_position - # Навмеш ещё не готов или игрок вне его — идём напрямую + # Навмеш ещё не готов или точка вне его — идём напрямую if step == Vector3.ZERO: step = flat var d := step.length() if d < 0.001: - return - global_position += step / d * min(speed * delta, d) + return false + global_position += step / d * min(spd * delta, d) _face(Vector3(step.x, 0.0, step.z), delta) + return false # Камень считает другой клиент — плавно идём к тому, что он прислал func _follow_owner(delta: float) -> void: diff --git a/models/Bochi-Rock/rock.tscn b/models/Bochi-Rock/rock.tscn new file mode 100644 index 0000000..73434aa --- /dev/null +++ b/models/Bochi-Rock/rock.tscn @@ -0,0 +1,19 @@ +[gd_scene format=3] + +[ext_resource type="Script" path="res://models/Bochi-Rock/rock-follow.gd" id="1_script"] +[ext_resource type="PackedScene" uid="uid://cowp33ejxcfcl" path="res://models/Bochi-Rock/Rock.glb" id="2_model"] +[ext_resource type="AudioStream" uid="uid://280pvcvxt2n2" path="res://models/Bochi-Rock/Guitar.ogg" id="3_audio"] + +[node name="Rock" type="Node3D"] +script = ExtResource("1_script") + +[node name="Model" parent="." instance=ExtResource("2_model")] + +[node name="NavigationAgent3D" type="NavigationAgent3D" parent="."] +height = 5.0 +radius = 2.0 + +[node name="AudioStreamPlayer3D" type="AudioStreamPlayer3D" parent="Model"] +stream = ExtResource("3_audio") +autoplay = true +max_distance = 30.0 diff --git a/models/backrooms/CREDITS.md b/models/backrooms/CREDITS.md new file mode 100644 index 0000000..a957a91 --- /dev/null +++ b/models/backrooms/CREDITS.md @@ -0,0 +1,5 @@ +# Backrooms VR + +Модель «Backrooms VR» — автор VTX (https://sketchfab.com/VTX_car) +Источник: https://sketchfab.com/3d-models/backrooms-vr-1a5c397f0a43408fa38b09ea5c041149 +Лицензия: CC-BY 4.0 (http://creativecommons.org/licenses/by/4.0/) diff --git a/models/backrooms/backrooms_vr.glb b/models/backrooms/backrooms_vr.glb new file mode 100644 index 0000000..b9faac1 Binary files /dev/null and b/models/backrooms/backrooms_vr.glb differ diff --git a/models/backrooms/backrooms_vr.glb.import b/models/backrooms/backrooms_vr.glb.import new file mode 100644 index 0000000..413dc24 --- /dev/null +++ b/models/backrooms/backrooms_vr.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://b8ef3wy1pthgm" +path="res://.godot/imported/backrooms_vr.glb-0d2b88698924672a51ea9e43fb3ac8a4.scn" + +[deps] + +source_file="res://models/backrooms/backrooms_vr.glb" +dest_files=["res://.godot/imported/backrooms_vr.glb-0d2b88698924672a51ea9e43fb3ac8a4.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/models/backrooms/backrooms_vr_0.png b/models/backrooms/backrooms_vr_0.png new file mode 100644 index 0000000..dedb2f8 Binary files /dev/null and b/models/backrooms/backrooms_vr_0.png differ diff --git a/models/backrooms/backrooms_vr_0.png.import b/models/backrooms/backrooms_vr_0.png.import new file mode 100644 index 0000000..4935975 --- /dev/null +++ b/models/backrooms/backrooms_vr_0.png.import @@ -0,0 +1,44 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b6weikavgdbap" +path.s3tc="res://.godot/imported/backrooms_vr_0.png-f4c02e53a6cca71b1adac7615326ab0e.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={ +"md5": "dd26a9d7692e3436812fe8332db11362" +} + +[deps] + +source_file="res://models/backrooms/backrooms_vr_0.png" +dest_files=["res://.godot/imported/backrooms_vr_0.png-f4c02e53a6cca71b1adac7615326ab0e.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 diff --git a/models/backrooms/backrooms_vr_1.png b/models/backrooms/backrooms_vr_1.png new file mode 100644 index 0000000..6123863 Binary files /dev/null and b/models/backrooms/backrooms_vr_1.png differ diff --git a/models/backrooms/backrooms_vr_1.png.import b/models/backrooms/backrooms_vr_1.png.import new file mode 100644 index 0000000..eb6d823 --- /dev/null +++ b/models/backrooms/backrooms_vr_1.png.import @@ -0,0 +1,44 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dpud2naqkm4xs" +path.s3tc="res://.godot/imported/backrooms_vr_1.png-d716f61def983b3d40016ab77643deb5.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={ +"md5": "79c774f9175bf99b66d6647fc9276dd6" +} + +[deps] + +source_file="res://models/backrooms/backrooms_vr_1.png" +dest_files=["res://.godot/imported/backrooms_vr_1.png-d716f61def983b3d40016ab77643deb5.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 diff --git a/models/backrooms/backrooms_vr_10.png b/models/backrooms/backrooms_vr_10.png new file mode 100644 index 0000000..d50cfce Binary files /dev/null and b/models/backrooms/backrooms_vr_10.png differ diff --git a/models/backrooms/backrooms_vr_10.png.import b/models/backrooms/backrooms_vr_10.png.import new file mode 100644 index 0000000..2a81501 --- /dev/null +++ b/models/backrooms/backrooms_vr_10.png.import @@ -0,0 +1,44 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b8nb23j42isps" +path.s3tc="res://.godot/imported/backrooms_vr_10.png-6693254cade6e5be230303d4e03a4118.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={ +"md5": "bdf490cf7f9a54efba63ed6886a31481" +} + +[deps] + +source_file="res://models/backrooms/backrooms_vr_10.png" +dest_files=["res://.godot/imported/backrooms_vr_10.png-6693254cade6e5be230303d4e03a4118.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 diff --git a/models/backrooms/backrooms_vr_11.png b/models/backrooms/backrooms_vr_11.png new file mode 100644 index 0000000..8959668 Binary files /dev/null and b/models/backrooms/backrooms_vr_11.png differ diff --git a/models/backrooms/backrooms_vr_11.png.import b/models/backrooms/backrooms_vr_11.png.import new file mode 100644 index 0000000..7203eda --- /dev/null +++ b/models/backrooms/backrooms_vr_11.png.import @@ -0,0 +1,44 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://djx5e3wiwgqex" +path.s3tc="res://.godot/imported/backrooms_vr_11.png-a17fa98ada75a88222940123fa22d2c4.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={ +"md5": "0eff7867078fb002c73e86db307b5cac" +} + +[deps] + +source_file="res://models/backrooms/backrooms_vr_11.png" +dest_files=["res://.godot/imported/backrooms_vr_11.png-a17fa98ada75a88222940123fa22d2c4.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 diff --git a/models/backrooms/backrooms_vr_12.png b/models/backrooms/backrooms_vr_12.png new file mode 100644 index 0000000..9d9508b Binary files /dev/null and b/models/backrooms/backrooms_vr_12.png differ diff --git a/models/backrooms/backrooms_vr_12.png.import b/models/backrooms/backrooms_vr_12.png.import new file mode 100644 index 0000000..cf260e9 --- /dev/null +++ b/models/backrooms/backrooms_vr_12.png.import @@ -0,0 +1,44 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://djyh6v1wlujbx" +path.s3tc="res://.godot/imported/backrooms_vr_12.png-d78f07b6d7d3138c20741e40ee92edfa.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={ +"md5": "af3cabe8076ab6902c5ef8de7f304b52" +} + +[deps] + +source_file="res://models/backrooms/backrooms_vr_12.png" +dest_files=["res://.godot/imported/backrooms_vr_12.png-d78f07b6d7d3138c20741e40ee92edfa.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 diff --git a/models/backrooms/backrooms_vr_13.png b/models/backrooms/backrooms_vr_13.png new file mode 100644 index 0000000..2416e2b Binary files /dev/null and b/models/backrooms/backrooms_vr_13.png differ diff --git a/models/backrooms/backrooms_vr_13.png.import b/models/backrooms/backrooms_vr_13.png.import new file mode 100644 index 0000000..4ce4c80 --- /dev/null +++ b/models/backrooms/backrooms_vr_13.png.import @@ -0,0 +1,44 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dw68nfgta46bg" +path.s3tc="res://.godot/imported/backrooms_vr_13.png-5712190a97c0176b90edbead990dd794.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={ +"md5": "80b3f1544049ca7469516fae963a8b53" +} + +[deps] + +source_file="res://models/backrooms/backrooms_vr_13.png" +dest_files=["res://.godot/imported/backrooms_vr_13.png-5712190a97c0176b90edbead990dd794.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 diff --git a/models/backrooms/backrooms_vr_14.png b/models/backrooms/backrooms_vr_14.png new file mode 100644 index 0000000..c8323a0 Binary files /dev/null and b/models/backrooms/backrooms_vr_14.png differ diff --git a/models/backrooms/backrooms_vr_14.png.import b/models/backrooms/backrooms_vr_14.png.import new file mode 100644 index 0000000..8158d15 --- /dev/null +++ b/models/backrooms/backrooms_vr_14.png.import @@ -0,0 +1,44 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cgx5ip8cpgxly" +path.s3tc="res://.godot/imported/backrooms_vr_14.png-bbec912f44ebcc9f8e50c98b8f9abaad.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={ +"md5": "f29e6fa0df4712e220723a81961d2409" +} + +[deps] + +source_file="res://models/backrooms/backrooms_vr_14.png" +dest_files=["res://.godot/imported/backrooms_vr_14.png-bbec912f44ebcc9f8e50c98b8f9abaad.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 diff --git a/models/backrooms/backrooms_vr_15.png b/models/backrooms/backrooms_vr_15.png new file mode 100644 index 0000000..4e5deff Binary files /dev/null and b/models/backrooms/backrooms_vr_15.png differ diff --git a/models/backrooms/backrooms_vr_15.png.import b/models/backrooms/backrooms_vr_15.png.import new file mode 100644 index 0000000..4533ecd --- /dev/null +++ b/models/backrooms/backrooms_vr_15.png.import @@ -0,0 +1,44 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dxvxjwfnpxqyb" +path.s3tc="res://.godot/imported/backrooms_vr_15.png-a20bd15c0b1b28d9456bc931978a218d.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={ +"md5": "be89a770b865d0c2b831e2bd61ec5d60" +} + +[deps] + +source_file="res://models/backrooms/backrooms_vr_15.png" +dest_files=["res://.godot/imported/backrooms_vr_15.png-a20bd15c0b1b28d9456bc931978a218d.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 diff --git a/models/backrooms/backrooms_vr_16.png b/models/backrooms/backrooms_vr_16.png new file mode 100644 index 0000000..d10c4f5 Binary files /dev/null and b/models/backrooms/backrooms_vr_16.png differ diff --git a/models/backrooms/backrooms_vr_16.png.import b/models/backrooms/backrooms_vr_16.png.import new file mode 100644 index 0000000..4aa71c9 --- /dev/null +++ b/models/backrooms/backrooms_vr_16.png.import @@ -0,0 +1,44 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://yjj1swxlp5le" +path.s3tc="res://.godot/imported/backrooms_vr_16.png-07a4cbc529fe565672c305dfd8e573d6.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={ +"md5": "a354b1ade1b355ac5f4faf756def42da" +} + +[deps] + +source_file="res://models/backrooms/backrooms_vr_16.png" +dest_files=["res://.godot/imported/backrooms_vr_16.png-07a4cbc529fe565672c305dfd8e573d6.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 diff --git a/models/backrooms/backrooms_vr_17.png b/models/backrooms/backrooms_vr_17.png new file mode 100644 index 0000000..211ac39 Binary files /dev/null and b/models/backrooms/backrooms_vr_17.png differ diff --git a/models/backrooms/backrooms_vr_17.png.import b/models/backrooms/backrooms_vr_17.png.import new file mode 100644 index 0000000..8ec6fda --- /dev/null +++ b/models/backrooms/backrooms_vr_17.png.import @@ -0,0 +1,44 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://decg78uck2mqa" +path.s3tc="res://.godot/imported/backrooms_vr_17.png-5a591d4362230f749be443a19b09de4f.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={ +"md5": "a4ff81f7c103ef7064fdcdf9579550bd" +} + +[deps] + +source_file="res://models/backrooms/backrooms_vr_17.png" +dest_files=["res://.godot/imported/backrooms_vr_17.png-5a591d4362230f749be443a19b09de4f.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 diff --git a/models/backrooms/backrooms_vr_18.png b/models/backrooms/backrooms_vr_18.png new file mode 100644 index 0000000..8716e86 Binary files /dev/null and b/models/backrooms/backrooms_vr_18.png differ diff --git a/models/backrooms/backrooms_vr_18.png.import b/models/backrooms/backrooms_vr_18.png.import new file mode 100644 index 0000000..dc70b0e --- /dev/null +++ b/models/backrooms/backrooms_vr_18.png.import @@ -0,0 +1,44 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://brljydqpvgko0" +path.s3tc="res://.godot/imported/backrooms_vr_18.png-137b67a1864cee9569a91581bee56ca4.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={ +"md5": "1f8b3f56208dfb1ccc4cf99aead75a96" +} + +[deps] + +source_file="res://models/backrooms/backrooms_vr_18.png" +dest_files=["res://.godot/imported/backrooms_vr_18.png-137b67a1864cee9569a91581bee56ca4.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 diff --git a/models/backrooms/backrooms_vr_19.png b/models/backrooms/backrooms_vr_19.png new file mode 100644 index 0000000..de0e1af Binary files /dev/null and b/models/backrooms/backrooms_vr_19.png differ diff --git a/models/backrooms/backrooms_vr_19.png.import b/models/backrooms/backrooms_vr_19.png.import new file mode 100644 index 0000000..b082dc2 --- /dev/null +++ b/models/backrooms/backrooms_vr_19.png.import @@ -0,0 +1,44 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dciao7v0fkii1" +path.s3tc="res://.godot/imported/backrooms_vr_19.png-cdf77da915a8406d23a1f971a1d765fe.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={ +"md5": "e093a35dfb48ed90dfee7417cb40b8aa" +} + +[deps] + +source_file="res://models/backrooms/backrooms_vr_19.png" +dest_files=["res://.godot/imported/backrooms_vr_19.png-cdf77da915a8406d23a1f971a1d765fe.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 diff --git a/models/backrooms/backrooms_vr_2.png b/models/backrooms/backrooms_vr_2.png new file mode 100644 index 0000000..c25c1fb Binary files /dev/null and b/models/backrooms/backrooms_vr_2.png differ diff --git a/models/backrooms/backrooms_vr_2.png.import b/models/backrooms/backrooms_vr_2.png.import new file mode 100644 index 0000000..13c9e3a --- /dev/null +++ b/models/backrooms/backrooms_vr_2.png.import @@ -0,0 +1,44 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://eorb1lixjtbv" +path.s3tc="res://.godot/imported/backrooms_vr_2.png-4f70d8bd72d6cc50f9b317463f7076b9.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={ +"md5": "6f80af8f00ff83fa14604341d717c0a1" +} + +[deps] + +source_file="res://models/backrooms/backrooms_vr_2.png" +dest_files=["res://.godot/imported/backrooms_vr_2.png-4f70d8bd72d6cc50f9b317463f7076b9.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 diff --git a/models/backrooms/backrooms_vr_20.png b/models/backrooms/backrooms_vr_20.png new file mode 100644 index 0000000..3f3f16f Binary files /dev/null and b/models/backrooms/backrooms_vr_20.png differ diff --git a/models/backrooms/backrooms_vr_20.png.import b/models/backrooms/backrooms_vr_20.png.import new file mode 100644 index 0000000..0348f66 --- /dev/null +++ b/models/backrooms/backrooms_vr_20.png.import @@ -0,0 +1,44 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://xbcxlgw40igt" +path.s3tc="res://.godot/imported/backrooms_vr_20.png-4ac1f7f9258502dc9178e35c5602f20d.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={ +"md5": "c089944811fd6841d24c05ff96888a0d" +} + +[deps] + +source_file="res://models/backrooms/backrooms_vr_20.png" +dest_files=["res://.godot/imported/backrooms_vr_20.png-4ac1f7f9258502dc9178e35c5602f20d.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 diff --git a/models/backrooms/backrooms_vr_21.png b/models/backrooms/backrooms_vr_21.png new file mode 100644 index 0000000..d6772f8 Binary files /dev/null and b/models/backrooms/backrooms_vr_21.png differ diff --git a/models/backrooms/backrooms_vr_21.png.import b/models/backrooms/backrooms_vr_21.png.import new file mode 100644 index 0000000..e0c0f4e --- /dev/null +++ b/models/backrooms/backrooms_vr_21.png.import @@ -0,0 +1,44 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://crx06wyll47ou" +path.s3tc="res://.godot/imported/backrooms_vr_21.png-99c9bdd476eb15db8a1993bf96f942b2.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={ +"md5": "8e67b33967174d08949af75bbfdbf99b" +} + +[deps] + +source_file="res://models/backrooms/backrooms_vr_21.png" +dest_files=["res://.godot/imported/backrooms_vr_21.png-99c9bdd476eb15db8a1993bf96f942b2.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 diff --git a/models/backrooms/backrooms_vr_22.png b/models/backrooms/backrooms_vr_22.png new file mode 100644 index 0000000..1cf08dc Binary files /dev/null and b/models/backrooms/backrooms_vr_22.png differ diff --git a/models/backrooms/backrooms_vr_22.png.import b/models/backrooms/backrooms_vr_22.png.import new file mode 100644 index 0000000..ad0a362 --- /dev/null +++ b/models/backrooms/backrooms_vr_22.png.import @@ -0,0 +1,44 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cqareamgsajs" +path.s3tc="res://.godot/imported/backrooms_vr_22.png-a69fa573ac9737ff98f9e3a9cb90184f.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={ +"md5": "1f9cbe82491c2b29517d2e7170fcc8d2" +} + +[deps] + +source_file="res://models/backrooms/backrooms_vr_22.png" +dest_files=["res://.godot/imported/backrooms_vr_22.png-a69fa573ac9737ff98f9e3a9cb90184f.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 diff --git a/models/backrooms/backrooms_vr_23.png b/models/backrooms/backrooms_vr_23.png new file mode 100644 index 0000000..e0beb54 Binary files /dev/null and b/models/backrooms/backrooms_vr_23.png differ diff --git a/models/backrooms/backrooms_vr_23.png.import b/models/backrooms/backrooms_vr_23.png.import new file mode 100644 index 0000000..ac3b10a --- /dev/null +++ b/models/backrooms/backrooms_vr_23.png.import @@ -0,0 +1,44 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dy57qg8yhs4cx" +path.s3tc="res://.godot/imported/backrooms_vr_23.png-1d7ffb8aa29d441bde425ede0413250c.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={ +"md5": "afc73e7b0ceed0e68711ee2553fc102c" +} + +[deps] + +source_file="res://models/backrooms/backrooms_vr_23.png" +dest_files=["res://.godot/imported/backrooms_vr_23.png-1d7ffb8aa29d441bde425ede0413250c.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 diff --git a/models/backrooms/backrooms_vr_24.png b/models/backrooms/backrooms_vr_24.png new file mode 100644 index 0000000..84e5b4c Binary files /dev/null and b/models/backrooms/backrooms_vr_24.png differ diff --git a/models/backrooms/backrooms_vr_24.png.import b/models/backrooms/backrooms_vr_24.png.import new file mode 100644 index 0000000..bad7a4d --- /dev/null +++ b/models/backrooms/backrooms_vr_24.png.import @@ -0,0 +1,44 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bt548bd7s4get" +path.s3tc="res://.godot/imported/backrooms_vr_24.png-584f508479d8bb3725096fabaf30673a.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={ +"md5": "2bfbf2416d5c593dbdd1bfa9d7ccdb2a" +} + +[deps] + +source_file="res://models/backrooms/backrooms_vr_24.png" +dest_files=["res://.godot/imported/backrooms_vr_24.png-584f508479d8bb3725096fabaf30673a.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 diff --git a/models/backrooms/backrooms_vr_25.png b/models/backrooms/backrooms_vr_25.png new file mode 100644 index 0000000..775b3f1 Binary files /dev/null and b/models/backrooms/backrooms_vr_25.png differ diff --git a/models/backrooms/backrooms_vr_25.png.import b/models/backrooms/backrooms_vr_25.png.import new file mode 100644 index 0000000..fa0fb44 --- /dev/null +++ b/models/backrooms/backrooms_vr_25.png.import @@ -0,0 +1,44 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://doneeapv77gj1" +path.s3tc="res://.godot/imported/backrooms_vr_25.png-9c0c3ba7ed9c43115c11c01e6ca76972.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={ +"md5": "d4edeb415eeadc87ba7e8b618df82951" +} + +[deps] + +source_file="res://models/backrooms/backrooms_vr_25.png" +dest_files=["res://.godot/imported/backrooms_vr_25.png-9c0c3ba7ed9c43115c11c01e6ca76972.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 diff --git a/models/backrooms/backrooms_vr_26.png b/models/backrooms/backrooms_vr_26.png new file mode 100644 index 0000000..b93799e Binary files /dev/null and b/models/backrooms/backrooms_vr_26.png differ diff --git a/models/backrooms/backrooms_vr_26.png.import b/models/backrooms/backrooms_vr_26.png.import new file mode 100644 index 0000000..9f9f246 --- /dev/null +++ b/models/backrooms/backrooms_vr_26.png.import @@ -0,0 +1,44 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cg4knissk32f0" +path.s3tc="res://.godot/imported/backrooms_vr_26.png-d404be6f8ec663c23a65f332e8e41866.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={ +"md5": "b00013d16cea649dbfcad40105ea95c2" +} + +[deps] + +source_file="res://models/backrooms/backrooms_vr_26.png" +dest_files=["res://.godot/imported/backrooms_vr_26.png-d404be6f8ec663c23a65f332e8e41866.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 diff --git a/models/backrooms/backrooms_vr_3.png b/models/backrooms/backrooms_vr_3.png new file mode 100644 index 0000000..90448c4 Binary files /dev/null and b/models/backrooms/backrooms_vr_3.png differ diff --git a/models/backrooms/backrooms_vr_3.png.import b/models/backrooms/backrooms_vr_3.png.import new file mode 100644 index 0000000..361c675 --- /dev/null +++ b/models/backrooms/backrooms_vr_3.png.import @@ -0,0 +1,44 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://3gy68ac2rkdx" +path.s3tc="res://.godot/imported/backrooms_vr_3.png-afd56e334c7320959e31f3683f2ccc4f.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={ +"md5": "27c87342265c1142652ee5c1c7de8578" +} + +[deps] + +source_file="res://models/backrooms/backrooms_vr_3.png" +dest_files=["res://.godot/imported/backrooms_vr_3.png-afd56e334c7320959e31f3683f2ccc4f.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 diff --git a/models/backrooms/backrooms_vr_4.png b/models/backrooms/backrooms_vr_4.png new file mode 100644 index 0000000..8f0ca80 Binary files /dev/null and b/models/backrooms/backrooms_vr_4.png differ diff --git a/models/backrooms/backrooms_vr_4.png.import b/models/backrooms/backrooms_vr_4.png.import new file mode 100644 index 0000000..2cd7758 --- /dev/null +++ b/models/backrooms/backrooms_vr_4.png.import @@ -0,0 +1,44 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://d3verocm47dx8" +path.s3tc="res://.godot/imported/backrooms_vr_4.png-93a12f44d34aa99fbfe8479f9f95dda0.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={ +"md5": "c0f85dfdeb975bc1438901e114ee54f5" +} + +[deps] + +source_file="res://models/backrooms/backrooms_vr_4.png" +dest_files=["res://.godot/imported/backrooms_vr_4.png-93a12f44d34aa99fbfe8479f9f95dda0.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 diff --git a/models/backrooms/backrooms_vr_5.png b/models/backrooms/backrooms_vr_5.png new file mode 100644 index 0000000..d0a7a6b Binary files /dev/null and b/models/backrooms/backrooms_vr_5.png differ diff --git a/models/backrooms/backrooms_vr_5.png.import b/models/backrooms/backrooms_vr_5.png.import new file mode 100644 index 0000000..28be6c8 --- /dev/null +++ b/models/backrooms/backrooms_vr_5.png.import @@ -0,0 +1,44 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cnhk7o54biy8d" +path.s3tc="res://.godot/imported/backrooms_vr_5.png-5c53a0e2465ec929aaf203e355069c55.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={ +"md5": "db8e48feaa1472c07f9e3131a9d5455d" +} + +[deps] + +source_file="res://models/backrooms/backrooms_vr_5.png" +dest_files=["res://.godot/imported/backrooms_vr_5.png-5c53a0e2465ec929aaf203e355069c55.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 diff --git a/models/backrooms/backrooms_vr_6.png b/models/backrooms/backrooms_vr_6.png new file mode 100644 index 0000000..9e51b79 Binary files /dev/null and b/models/backrooms/backrooms_vr_6.png differ diff --git a/models/backrooms/backrooms_vr_6.png.import b/models/backrooms/backrooms_vr_6.png.import new file mode 100644 index 0000000..d4cc40a --- /dev/null +++ b/models/backrooms/backrooms_vr_6.png.import @@ -0,0 +1,44 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cjglgsq24tgpr" +path.s3tc="res://.godot/imported/backrooms_vr_6.png-9ef6d8013d662a2fe026a614c10ff766.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={ +"md5": "396d37118c519e43f39dc17472ac44ac" +} + +[deps] + +source_file="res://models/backrooms/backrooms_vr_6.png" +dest_files=["res://.godot/imported/backrooms_vr_6.png-9ef6d8013d662a2fe026a614c10ff766.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 diff --git a/models/backrooms/backrooms_vr_7.png b/models/backrooms/backrooms_vr_7.png new file mode 100644 index 0000000..e505889 Binary files /dev/null and b/models/backrooms/backrooms_vr_7.png differ diff --git a/models/backrooms/backrooms_vr_7.png.import b/models/backrooms/backrooms_vr_7.png.import new file mode 100644 index 0000000..c7e3477 --- /dev/null +++ b/models/backrooms/backrooms_vr_7.png.import @@ -0,0 +1,44 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://7ctu8yeskavl" +path.s3tc="res://.godot/imported/backrooms_vr_7.png-08770a42a1db34f7b66ca5ade29b3692.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={ +"md5": "01930a0b90aed513040fd3d9eedbb6fe" +} + +[deps] + +source_file="res://models/backrooms/backrooms_vr_7.png" +dest_files=["res://.godot/imported/backrooms_vr_7.png-08770a42a1db34f7b66ca5ade29b3692.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 diff --git a/models/backrooms/backrooms_vr_8.png b/models/backrooms/backrooms_vr_8.png new file mode 100644 index 0000000..e96339a Binary files /dev/null and b/models/backrooms/backrooms_vr_8.png differ diff --git a/models/backrooms/backrooms_vr_8.png.import b/models/backrooms/backrooms_vr_8.png.import new file mode 100644 index 0000000..2457453 --- /dev/null +++ b/models/backrooms/backrooms_vr_8.png.import @@ -0,0 +1,44 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dsjo2hg0a0tel" +path.s3tc="res://.godot/imported/backrooms_vr_8.png-d336a3b519d985285c5ac1f5b88e7302.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={ +"md5": "59fd1284dc8ae6306679984e51bd09f4" +} + +[deps] + +source_file="res://models/backrooms/backrooms_vr_8.png" +dest_files=["res://.godot/imported/backrooms_vr_8.png-d336a3b519d985285c5ac1f5b88e7302.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 diff --git a/models/backrooms/backrooms_vr_9.png b/models/backrooms/backrooms_vr_9.png new file mode 100644 index 0000000..26c9527 Binary files /dev/null and b/models/backrooms/backrooms_vr_9.png differ diff --git a/models/backrooms/backrooms_vr_9.png.import b/models/backrooms/backrooms_vr_9.png.import new file mode 100644 index 0000000..98ccc11 --- /dev/null +++ b/models/backrooms/backrooms_vr_9.png.import @@ -0,0 +1,44 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://lg637sqtxhyx" +path.s3tc="res://.godot/imported/backrooms_vr_9.png-84b2fc2b5b2304a3aaac1bf9ef43ec9b.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={ +"md5": "8c6549152c886a78b26090750a2ac1a4" +} + +[deps] + +source_file="res://models/backrooms/backrooms_vr_9.png" +dest_files=["res://.godot/imported/backrooms_vr_9.png-84b2fc2b5b2304a3aaac1bf9ef43ec9b.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 diff --git a/project.godot b/project.godot index 977fb51..cdf4903 100644 --- a/project.godot +++ b/project.godot @@ -18,6 +18,7 @@ config/icon="res://icon.svg" [autoload] Net="*res://Net/net.gd" +MapLoader="*res://World/map_loader.gd" [display]