diff --git a/deco.lua b/deco.lua new file mode 100644 index 0000000..5ff6d9a --- /dev/null +++ b/deco.lua @@ -0,0 +1,110 @@ +--[[ + + Hyperloop Mod + ============= + + Copyright (C) 2017 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + History: + see init.lua + +]]-- + +local tilesL = {"hyperloop_alpsL.png", "hyperloop_seaL.png", "hyperloop_agyptL.png"} +local tilesR = {"hyperloop_alpsR.png", "hyperloop_seaR.png", "hyperloop_agyptR.png"} + +for idx = 1,3 do + + minetest.register_node("hyperloop:poster"..idx.."L", { + description = "Hyperloop Promo Poster "..idx, + tiles = { + -- up, down, right, left, back, front + "hyperloop_skin2.png", + "hyperloop_skin2.png", + "hyperloop_skin2.png", + "hyperloop_skin2.png", + "hyperloop_skin2.png", + tilesL[idx], + }, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + { -8/16, -8/16, -6/16, 8/16, 8/16, 8/16}, + }, + }, + selection_box = { + type = "fixed", + fixed = { -8/16, -8/16, -6/16, 24/16, 8/16, 8/16}, + }, + + after_place_node = function(pos, placer) + local meta = minetest.get_meta(pos) + local facedir + facedir, pos = hyperloop.right_hand_side(pos, placer) + meta:set_string("pos", minetest.pos_to_string(pos)) + if minetest.get_node_or_nil(pos).name == "air" then + minetest.add_node(pos, {name="hyperloop:poster"..idx.."R", param2=facedir}) + end + end, + + on_destruct = function(pos) + local meta = minetest.get_meta(pos) + pos = minetest.string_to_pos(meta:get_string("pos")) + if pos ~= nil and minetest.get_node_or_nil(pos).name == "hyperloop:poster"..idx.."R" then + minetest.remove_node(pos) + end + end, + + + paramtype2 = "facedir", + light_source = 4, + is_ground_content = false, + groups = {cracky = 2, stone = 2}, + }) + + minetest.register_node("hyperloop:poster"..idx.."R", { + description = "Hyperloop Promo Poster "..idx, + tiles = { + -- up, down, right, left, back, front + "hyperloop_skin2.png", + "hyperloop_skin2.png", + "hyperloop_skin2.png", + "hyperloop_skin2.png", + "hyperloop_skin2.png", + tilesR[idx], + }, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + { -8/16, -8/16, -6/16, 8/16, 8/16, 8/16}, + }, + }, + paramtype2 = "facedir", + light_source = 4, + is_ground_content = false, + groups = {cracky = 2, stone = 2, not_in_creative_inventory=1}, + }) +end + + +minetest.register_node("hyperloop:sign", { + description = "Hyperloop Station Sign", + tiles = { + -- up, down, right, left, back, front + "hyperloop_sign_top.png", + "hyperloop_sign.png", + "hyperloop_sign.png", + "hyperloop_sign.png", + "hyperloop_sign.png", + "hyperloop_sign.png", + }, + drawtype = "nodebox", + light_source = 4, + is_ground_content = false, + groups = {cracky = 2, stone = 2}, +}) \ No newline at end of file diff --git a/elevator.lua b/elevator.lua new file mode 100644 index 0000000..ef96b38 --- /dev/null +++ b/elevator.lua @@ -0,0 +1,510 @@ +--[[ + + Hyperloop Mod + ============= + + Copyright (C) 2017 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + +]]-- + + +---------------------------------------------------------------------------------------------------- +---------------------------------------------------------------------------------------------------- + +--[[ + spos = : + level = pos.y + hyperloop.data.tAllElevators[spos].floors[level] = { + pos = {x,y,z}, -- lower elevator block + facedir = n, -- for the door placement + name = "...", -- floor name + up = true, -- connetion flag + down = true, -- connetion flag + } +]]-- + +-- return index of the table position matching pos or nil +local function pos_index(tbl, pos) + for idx,v in ipairs(tbl) do + if v.pos.x == pos.x and v.pos.y == pos.y and v.pos.z == pos.z then + return idx + end + end + return nil +end + +-- remove invalid entries +local function remove_artifacts(floors) + local tbl = {} + for idx,floor in ipairs(floors) do + if floor.pos ~= nil and floor.name ~= nil and floor.up ~= nil and floor.down ~= nil then + table.insert(tbl, floor) + end + end + return tbl +end + + +-- determine the elevator list +local function get_elevator_list(pos) + local spos = tostring(pos.x)..":"..tostring(pos.z) + if hyperloop.data.tAllElevators[spos] == nil then + -- create the elevator + hyperloop.data.tAllElevators[spos] = {} + end + if hyperloop.data.tAllElevators[spos].floors == nil then + -- create the floor list + hyperloop.data.tAllElevators[spos].floors = {} + end + -- remove invalid entries + hyperloop.data.tAllElevators[spos].floors = remove_artifacts(hyperloop.data.tAllElevators[spos].floors) + return hyperloop.data.tAllElevators[spos].floors +end + +local function remove_elevator_list(pos) + local spos = tostring(pos.x)..":"..tostring(pos.z) + hyperloop.data.tAllElevators[spos] = nil + --print(spos, dump(hyperloop.data.tAllElevators)) +end + +-- determine the elevator floor item or create one +local function get_floor_item(pos) + local floors = get_elevator_list(pos) + local idx = pos_index(floors, pos) + if idx == nil then + -- create the floor item + table.insert(floors, {pos=pos}) + idx = #floors + end + return floors[idx] +end + +-- Add the given arguments to the elevator table +local function add_to_elevator_list(pos, tArgs) + --print("add_to_elevator_list", dump(pos)) + local floor = get_floor_item(pos) + for k,v in pairs(tArgs) do + floor[k] = v + end +end + +local function dbg_out(label, pos) + print(label..":") + local floors = get_elevator_list(pos) + for _,floor in ipairs(floors) do + print(" pos="..floor.pos.x..","..floor.pos.y..","..floor.pos.z.. + " facedir="..tostring(floor.facedir).." name="..tostring(floor.name).. + " up="..dump(floor.up).." down="..dump(floor.down)) + end +end + +-- return a sorted list of connected floors +local function floor_list(pos) + local floors = table.copy(get_elevator_list(pos)) + -- sort the list + table.sort(floors, function(x,y) + return x.pos.y > y.pos.y + end) + -- check if elevator is complete + for idx,floor in ipairs(floors) do + --print(idx, #floors, floor.name, floor.up, floor.down) + if idx == 1 then + if floor.down == false then + return {} + end + elseif idx == #floors then + if floor.up == false then + return {} + end + elseif floor.up == false or floor.down == false then + return {} + end + end + return floors +end + + +-- store floor_pos (lower car block) as meta data +local function set_floor_pos(pos, floor_pos) + local s = minetest.pos_to_string(floor_pos) + minetest.get_meta(pos):set_string("floor_pos", s) + return floor_pos +end + +-- read floor_pos (upper car block) from meta data +local function get_floor_pos(pos) + local s = minetest.get_meta(pos):get_string("floor_pos") + if s == nil then + return nil + end + return minetest.string_to_pos(s) +end + + +-- Form spec for the floor list +local function formspec(pos) + local tRes = {"size[5,10]label[0.5,0; Wähle dein Ziel :: Select your destination]"} + tRes[2] = "label[1,0.6;Destination]label[2.5,0.6;Floor]" + local list = floor_list(pos) + for idx,floor in ipairs(list) do + if idx >= 12 then + break + end + local ypos = 0.5 + idx*0.8 + local ypos2 = ypos - 0.2 + tRes[#tRes+1] = "button_exit[1,"..ypos2..";1,1;button;"..#list-idx.."]" + if floor.pos.y ~= pos.y then + tRes[#tRes+1] = "label[2.5,"..ypos..";"..floor.name.."]" + else + tRes[#tRes+1] = "label[2.5,"..ypos..";(current position)]" + end + end + return table.concat(tRes) +end + +local function update_formspec(pos) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", formspec(pos)) +end + +local function remove_from_elevator_list(pos) + local floors = get_elevator_list(pos) + local idx = pos_index(floors, pos) + if idx ~= nil then + table.remove(floors, idx) + end + -- last car in the list? + if not next(floors) then + remove_elevator_list(pos) + else + -- update all other elevator cars + for _,floor in ipairs(get_elevator_list(pos)) do + print(_, floor.name) + if floor.name ~= "" then + update_formspec(floor.pos) + end + end + end +end + +function hyperloop.update_elevator(pos) + local up = false + local down = false + --print("update y=", pos.y) + + pos.y = pos.y - 1 + if string.find(minetest.get_node_or_nil(pos).name, "hyperloop:shaft") then + down = true + end + + pos.y = pos.y + 3 + if string.find(minetest.get_node_or_nil(pos).name, "hyperloop:shaft") then + up = true + end + + pos.y = pos.y - 2 + add_to_elevator_list(pos, {up=up, down=down}) + --dbg_out("update", pos) + + -- update all elevator cars which are already named + for _,floor in ipairs(get_elevator_list(pos)) do + print(_, floor.name) + if floor.name ~= "" then + update_formspec(floor.pos) + end + end +end + + +-- place the elevator door on the given position: y, y+1 +local function place_door(pos, facedir, floor_pos) + if minetest.get_node_or_nil(pos).name == "air" then + minetest.add_node(pos, {name="hyperloop:elevator_door", param2=facedir}) + set_floor_pos(pos, floor_pos) + end + pos.y = pos.y + 1 + if minetest.get_node_or_nil(pos).name == "air" then + minetest.add_node(pos, {name="hyperloop:elevator_door_top", param2=facedir}) + set_floor_pos(pos, floor_pos) + end + pos.y = pos.y - 1 -- restore old value +end + +-- remove the elevator door on the given position: y, y+1 +local function remove_door(pos) + if minetest.get_node_or_nil(pos).name == "hyperloop:elevator_door" then + minetest.remove_node(pos) + end + pos.y = pos.y + 1 + if minetest.get_node_or_nil(pos).name == "hyperloop:elevator_door_top" then + minetest.remove_node(pos) + end + pos.y = pos.y - 1 -- restore old value +end + +local function door_command(floor_pos, facedir, cmnd) + local placedir = hyperloop.facedir_to_placedir(facedir) + print("placedir="..placedir.." facedir="..facedir) + local pos = hyperloop.new_pos(floor_pos, placedir, "1B") + if cmnd == "close" then + place_door(pos, facedir, floor_pos) + elseif cmnd == "open" then + remove_door(pos) + end +end + +-- on arrival station +local function on_close_door(pos, facedir) + -- close the door and play sound if no player is around + if hyperloop.is_player_around(pos) then + -- try again later + minetest.after(3.0, on_close_door, pos, facedir) + else + door_command(pos, facedir, "close") + end +end + +-- on arrival station +local function on_open_door(pos, facedir) + minetest.sound_play("door", { + pos = pos, + gain = 0.5, + max_hear_distance = 10, + }) + door_command(pos, facedir, "open") + minetest.after(5.0, on_close_door, pos, facedir) +end + +local function on_arrival(pos, player) + local floor = get_floor_item(pos) + --door_command(dest.pos, facedir, "close") + if player ~= nil then + player:setpos(floor.pos) + end + minetest.after(1.0, on_open_door, floor.pos, floor.facedir) +end + +minetest.register_node("hyperloop:elevator_bottom", { + description = "Hyperloop Elevator", + tiles = { + "hyperloop_elevator.png", + "hyperloop_elevator.png", + "hyperloop_elevator.png", + "hyperloop_elevator.png", + "hyperloop_elevator.png", + "hyperloop_elevator.png", + }, + node_box = { + type = "fixed", + fixed = { + { -8/16, -8/16, -8/16, -7/16, 8/16, 8/16}, + { 7/16, -8/16, -8/16, 8/16, 8/16, 8/16}, + { -7/16, -8/16, 7/16, 7/16, 8/16, 8/16}, + }, + }, + selection_box = { + type = "fixed", + fixed = { -8/16, -8/16, -7/16, 8/16, 24/16, 8/16 }, + }, + inventory_image = "hyperloop_elevator_inventory.png", + drawtype = "nodebox", + paramtype = 'light', + light_source = 4, + paramtype2 = "facedir", + is_ground_content = false, + groups = {snappy = 3}, + + after_place_node = function(pos, placer, itemstack, pointed_thing) + -- store floor_pos (lower car block) as meta data + set_floor_pos(pos, pos) + local facedir = hyperloop.get_facedir(placer) + add_to_elevator_list(pos, {name="", up=false, down=false, facedir=facedir, pos=pos}) + hyperloop.update_elevator(pos) + -- formspec + local meta = minetest.get_meta(pos) + local formspec = "size[6,4]".. + "label[0,0;Please insert floor name]" .. + "field[0.5,1.5;5,1;floor;Floor name;Base]" .. + "button_exit[2,3.6;2,1;exit;Save]" + meta:set_string("formspec", formspec) + + -- swap last shaft node + pos.y = pos.y - 1 + if minetest.get_node_or_nil(pos).name == "hyperloop:shaft" then + local node = minetest.get_node(pos) + node.name = "hyperloop:shaft2" + minetest.swap_node(pos, node) + end + pos.y = pos.y + 1 + + -- add upper part of the car + local floor_pos = table.copy(pos) + pos.y = pos.y + 1 + minetest.add_node(pos, {name="hyperloop:elevator_top", param2=facedir}) + -- store floor_pos (lower car block) as meta data + set_floor_pos(pos, floor_pos) + pos.y = pos.y - 1 + --dbg_out("after_place_node", pos) + end, + + on_receive_fields = function(pos, formname, fields, player) + -- floor name entered? + if fields.floor ~= nil then + local floor = string.trim(fields.floor) + if floor == "" then + return + end + -- store the floor name in the global elevator list + local floor_pos = get_floor_pos(pos) + add_to_elevator_list(floor_pos, {name=floor}) + hyperloop.update_elevator(floor_pos) + --dbg_out("on_receive_fields", floor_pos) + -- destination selected? + elseif fields.button ~= nil then + local floor_pos = get_floor_pos(pos) + local floor = get_floor_item(floor_pos) + local idx = tonumber(fields.button) + local list = floor_list(floor_pos) + local dest = list[#list-idx] + if dest.pos.y ~= floor_pos.y then + --local facedir = get_floor_item(floor_pos).facedir + minetest.sound_play("door", { + pos = floor_pos, + gain = 0.5, + max_hear_distance = 10, + }) + door_command(floor_pos, floor.facedir, "close") + door_command(dest.pos, dest.facedir, "close") + minetest.after(2.0, on_arrival, dest.pos, player) + end + end + end, + + on_destruct = function(pos) + pos.y = pos.y - 1 + if minetest.get_node_or_nil(pos).name == "hyperloop:shaft2" then + local node = minetest.get_node(pos) + node.name = "hyperloop:shaft" + minetest.swap_node(pos, node) + end + pos.y = pos.y + 2 + --print("pos.y="..pos.y) + minetest.remove_node(pos) + pos.y = pos.y - 1 + remove_from_elevator_list(pos) + --local facedir = minetest.get_meta(pos):get_int("facedir") + --door_command(pos, facedir, "open") + end, + +}) + +minetest.register_node("hyperloop:elevator_top", { + description = "Hyperloop Elevator", + tiles = { + -- up, down, right, left, back, front + "hyperloop_elevator.png", + "hyperloop_elevator.png", + "hyperloop_elevator_top.png", + "hyperloop_elevator.png", + "hyperloop_elevator.png", + "hyperloop_elevator.png", + }, + node_box = { + type = "fixed", + fixed = { + { -8/16, -8/16, -8/16, -7/16, 8/16, 8/16}, + { 7/16, -8/16, -8/16, 8/16, 8/16, 8/16}, + { -7/16, -8/16, 7/16, 7/16, 8/16, 8/16}, + }, + }, + + drawtype = "nodebox", + paramtype = 'light', + light_source = 2, + paramtype2 = "facedir", + is_ground_content = false, + groups = {snappy = 3, not_in_creative_inventory=1}, + drop = "hyperloop:elevator_bottom", +}) + +minetest.register_node("hyperloop:elevator_door_top", { + description = "Hyperloop Elevator Door", + tiles = { + -- up, down, right, left, back, front + "hyperloop_elevator_door_top.png", + }, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + { -8/16, -8/16, 7/16, 8/16, 8/16, 8/16}, + }, + }, + + paramtype2 = "facedir", + is_ground_content = false, + groups = {snappy = 3, not_in_creative_inventory=1}, +}) + +minetest.register_node("hyperloop:elevator_door", { + description = "Hyperloop Elevator Door", + tiles = { + -- up, down, right, left, back, front + "hyperloop_elevator_door.png", + }, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + { -8/16, -8/16, 7/16, 8/16, 8/16, 8/16}, + }, + }, + + selection_box = { + type = "fixed", + fixed = { -8/16, -8/16, 7/16, 8/16, 24/16, 8/16 }, + }, + + on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + local floor_pos = get_floor_pos(pos) + local floor = get_floor_item(floor_pos) + print(dump(floor.pos), floor.facedir) + door_command(floor.pos, floor.facedir, "open") + end, + + paramtype2 = "facedir", + is_ground_content = false, + groups = {snappy = 3, not_in_creative_inventory=1}, +}) + +------------------------------------------------------- +--[[ +local pos = {x=1, y=2, z=3} +local spos = tostring(pos.x)..":"..tostring(pos.z) +hyperloop.data.tAllElevators[spos].floors = nil + +local floor = get_floor_item(pos) +dbg_out("1", pos) +add_to_elevator_list(pos, {name="test1", up=false, down=false, facedir=1, pos=pos}) +dbg_out("2", pos) +remove_from_elevator_list(pos) +dbg_out("3", pos) +add_to_elevator_list(pos, {name="test1", up=false, down=false, facedir=1, pos=pos}) +dbg_out("4", pos) +add_to_elevator_list(pos, {up=true}) +dbg_out("5", pos) +print("6: ", dump(floor_list(pos))) + +local pos2 = {x=1, y=5, z=3} +add_to_elevator_list(pos2, {name="test2", up=true, down=true, facedir=1, pos=pos2}) +dbg_out("7", pos2) +print("8: ", dump(floor_list(pos2))) + +local pos3 = {x=1, y=9, z=3} +add_to_elevator_list(pos3, {name="test3", up=false, down=true, facedir=1, pos=pos3}) +dbg_out("9", pos3) +print("10: ", dump(floor_list(pos3))) +]]-- diff --git a/shaft.lua b/shaft.lua new file mode 100644 index 0000000..4fc1f2f --- /dev/null +++ b/shaft.lua @@ -0,0 +1,82 @@ +--[[ + + Hyperloop Mod + ============= + + Copyright (C) 2017 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + History: + see init.lua + +]]-- + + +-- simple shaft without logic or "memory" +minetest.register_node("hyperloop:shaft", { + description = "Hyperloop Elevator Shaft", + tiles = { + -- up, down, right, left, back, front + 'hyperloop_tube_open.png', + 'hyperloop_tube_open.png', + "hyperloop_tube_locked.png^[transformR90]", + "hyperloop_tube_locked.png^[transformR90]", + "hyperloop_tube_locked.png^[transformR90]", + "hyperloop_tube_locked.png^[transformR90]", + }, + + after_place_node = function(pos, placer, itemstack, pointed_thing) + local npos = table.copy(pos) + npos.y = npos.y - 1 + if minetest.get_node_or_nil(npos).name == "hyperloop:shaft" then + local node = minetest.get_node(npos) + node.name = "hyperloop:shaft2" + minetest.swap_node(npos, node) + elseif minetest.get_node_or_nil(npos).name == "hyperloop:elevator_top" then + npos.y = npos.y - 1 + hyperloop.update_elevator(npos) + else + minetest.remove_node(pos) + return itemstack + end + end, + + after_destruct = function(pos) + local npos = table.copy(pos) + npos.y = npos.y - 1 + if minetest.get_node_or_nil(npos).name == "hyperloop:shaft2" then + local node = minetest.get_node(npos) + node.name = "hyperloop:shaft" + minetest.swap_node(npos, node) + elseif minetest.get_node_or_nil(npos).name == "hyperloop:elevator_top" then + npos.y = npos.y - 1 + hyperloop.update_elevator(npos) + end + end, + + light_source = 6, + paramtype2 = "facedir", + groups = {cracky=1}, + is_ground_content = false, +}) + +-- simple shaft without logic or "memory" +minetest.register_node("hyperloop:shaft2", { + description = "Hyperloop Elevator Shaft", + tiles = { + -- up, down, right, left, back, front + "hyperloop_tube_locked.png^[transformR90]", + "hyperloop_tube_locked.png^[transformR90]", + "hyperloop_tube_locked.png^[transformR90]", + "hyperloop_tube_locked.png^[transformR90]", + "hyperloop_tube_locked.png^[transformR90]", + "hyperloop_tube_locked.png^[transformR90]", + }, + + diggable = false, + paramtype2 = "facedir", + groups = {cracky=1, not_in_creative_inventory=1}, + is_ground_content = false, +}) diff --git a/station.lua b/station.lua new file mode 100644 index 0000000..0ffb4f1 --- /dev/null +++ b/station.lua @@ -0,0 +1,89 @@ +--[[ + + Hyperloop Mod + ============= + + Copyright (C) 2017 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + History: + see init.lua + +]]-- + +local function assembly_plan(pos, facedir, clbk) + local placedir = hyperloop.facedir_to_placedir(facedir) + local res = true + facedir = (facedir + 1) % 4 + pos = hyperloop.new_pos(pos, placedir, "1L") + res = clbk(pos, facedir, "hyperloop:tube0") and res + pos.y = pos.y + 1 + res = clbk(pos, facedir, "hyperloop:pod_wall") and res + pos.y = pos.y + 1 + res = clbk(pos, facedir, "hyperloop:pod_wall") and res + pos.y = pos.y - 2 + pos = hyperloop.new_pos(pos, placedir, "1R") + facedir = (facedir + 2) % 4 + res = clbk(pos, facedir, "hyperloop:tube0") and res + pos.y = pos.y + 2 + res = clbk(pos, facedir, "hyperloop:lcd") and res + pos.y = pos.y - 2 + facedir = (facedir + 2) % 4 + pos = hyperloop.new_pos(pos, placedir, "1R") + res = clbk(pos, facedir, "hyperloop:junction") and res + pos.y = pos.y + 1 + res = clbk(pos, facedir, "hyperloop:seat") and res + return res +end + + +local function check_space(pos, facedir) + local clbk = function(pos, facedir, block) + return minetest.get_node_or_nil(pos).name == "air" + end + + local my_pos = table.copy(pos) + return assembly_plan(my_pos, facedir, clbk) +end + +local function construct(pos, facedir) + local clbk = function(pos, facedir, block) + if block == "hyperloop:lcd" then + local tbl = {[0]=4, [1]=2, [2]=5, [3]=3} + minetest.add_node(pos, {name=block, paramtype2="wallmounted", param2=tbl[facedir]}) + hyperloop.after_lcd_placed(pos, tbl[facedir]) + elseif block == "hyperloop:seat" then + minetest.add_node(pos, {name=block, param2=facedir}) + hyperloop.after_seat_placed(pos, facedir) + else + minetest.place_node(pos, {name=block, param2=facedir}) + end + end + + local my_pos = table.copy(pos) + return assembly_plan(my_pos, facedir, clbk) +end + +minetest.register_node("hyperloop:station", { + description = "Hyperloop Station Core", + inventory_image = "hyperloop_station_inventory.png", + wield_image = "hyperloop_station_inventory.png", + + on_place = function(itemstack, placer, pointed_thing) + print("on_place") + local pos = minetest.pointed_thing_to_face_pos(placer, pointed_thing) + pos.y = pos.y + 0.5 + --pos = vector.floor(pos) + print(dump(pos)) + local facedir = hyperloop.get_facedir(placer) + if check_space(pos, facedir) then + print("checked") + construct(pos, facedir) + itemstack:take_item(1) + print("done") + end + return itemstack + end, +}) \ No newline at end of file diff --git a/textures/hyperloop_agyptL.png b/textures/hyperloop_agyptL.png new file mode 100644 index 0000000..0d1a9c5 Binary files /dev/null and b/textures/hyperloop_agyptL.png differ diff --git a/textures/hyperloop_agyptR.png b/textures/hyperloop_agyptR.png new file mode 100644 index 0000000..e174965 Binary files /dev/null and b/textures/hyperloop_agyptR.png differ diff --git a/textures/hyperloop_alpsL.png b/textures/hyperloop_alpsL.png new file mode 100644 index 0000000..4b6b2ed Binary files /dev/null and b/textures/hyperloop_alpsL.png differ diff --git a/textures/hyperloop_alpsR.png b/textures/hyperloop_alpsR.png new file mode 100644 index 0000000..0f3de61 Binary files /dev/null and b/textures/hyperloop_alpsR.png differ diff --git a/textures/hyperloop_elevator.png b/textures/hyperloop_elevator.png new file mode 100644 index 0000000..a771971 Binary files /dev/null and b/textures/hyperloop_elevator.png differ diff --git a/textures/hyperloop_elevator_door.png b/textures/hyperloop_elevator_door.png new file mode 100644 index 0000000..6665f77 Binary files /dev/null and b/textures/hyperloop_elevator_door.png differ diff --git a/textures/hyperloop_elevator_door_top.png b/textures/hyperloop_elevator_door_top.png new file mode 100644 index 0000000..2950280 Binary files /dev/null and b/textures/hyperloop_elevator_door_top.png differ diff --git a/textures/hyperloop_elevator_inventory.png b/textures/hyperloop_elevator_inventory.png new file mode 100644 index 0000000..bc6c524 Binary files /dev/null and b/textures/hyperloop_elevator_inventory.png differ diff --git a/textures/hyperloop_elevator_top.png b/textures/hyperloop_elevator_top.png new file mode 100644 index 0000000..9770297 Binary files /dev/null and b/textures/hyperloop_elevator_top.png differ diff --git a/textures/hyperloop_seaL.png b/textures/hyperloop_seaL.png new file mode 100644 index 0000000..1d9d05a Binary files /dev/null and b/textures/hyperloop_seaL.png differ diff --git a/textures/hyperloop_seaR.png b/textures/hyperloop_seaR.png new file mode 100644 index 0000000..9595e4e Binary files /dev/null and b/textures/hyperloop_seaR.png differ diff --git a/textures/hyperloop_sign.png b/textures/hyperloop_sign.png new file mode 100644 index 0000000..498c749 Binary files /dev/null and b/textures/hyperloop_sign.png differ diff --git a/textures/hyperloop_sign_top.png b/textures/hyperloop_sign_top.png new file mode 100644 index 0000000..c5ecda1 Binary files /dev/null and b/textures/hyperloop_sign_top.png differ diff --git a/textures/hyperloop_station_inventory.png b/textures/hyperloop_station_inventory.png new file mode 100644 index 0000000..43ae767 Binary files /dev/null and b/textures/hyperloop_station_inventory.png differ