From 0e9c383312db456741581fd64f6791f013b5bc69 Mon Sep 17 00:00:00 2001 From: Chinsky Date: Thu, 3 Jul 2014 04:47:50 +0400 Subject: [PATCH] Added proc to imitate movement of stars. Changes icon state and throws all unanchored items in space. Added var denoting which direction is fore of the ship. Adjusting speed now applies movement effect on ship's zlevel. Added working engines system. Only defined type currently is thermal engine. Acceleration is now based on total thrust and ship's mass. Added engine control console. Changed shuttle control console to use custom interface to pick destinations. Shuttles can now go between any types of sectors, not just ship->sector. Shuttles cannot return to base if they are too far on overmap. Moved helm computer to NanoUI. Helm computer now stores navigation data records instead of polling info from actual overmap objects every time. Metaobjects now can define if sector is well known, in which case it will be automatically added to helm computer records on creation. Can add and delete records. Conflicts: icons/effects/effects.dmi --- code/WorkInProgress/Chinsky/overmap/README.dm | 39 +- .../Chinsky/overmap/_defines.dm | 35 ++ code/WorkInProgress/Chinsky/overmap/helm.dm | 161 --------- .../WorkInProgress/Chinsky/overmap/sectors.dm | 22 +- .../overmap/ships/computers/engine_control.dm | 99 +++++ .../Chinsky/overmap/ships/computers/helm.dm | 174 +++++++++ .../overmap/ships/computers/shuttle.dm | 139 +++++++ .../Chinsky/overmap/ships/engines/engine.dm | 60 ++++ .../Chinsky/overmap/ships/engines/thermal.dm | 99 +++++ .../Chinsky/overmap/ships/ship.dm | 105 ++++++ icons/effects/effects.dmi | Bin 264304 -> 266909 bytes icons/obj/ship_engine.dmi | Bin 0 -> 817 bytes maps/overmap/bearcat/bearcat.dm | 5 + maps/overmap/bearcat/bearcat.dmm | 56 +-- maps/overmap/example_sector1.dmm | 41 ++- maps/overmap/example_sector2.dmm | 339 +++++++++--------- maps/overmap/examples.dm | 3 + nano/templates/engines_control.tmpl | 84 +++++ nano/templates/helm.tmpl | 119 ++++++ .../shuttle_control_console_exploration.tmpl | 74 ++++ 20 files changed, 1254 insertions(+), 400 deletions(-) create mode 100644 code/WorkInProgress/Chinsky/overmap/_defines.dm delete mode 100644 code/WorkInProgress/Chinsky/overmap/helm.dm create mode 100644 code/WorkInProgress/Chinsky/overmap/ships/computers/engine_control.dm create mode 100644 code/WorkInProgress/Chinsky/overmap/ships/computers/helm.dm create mode 100644 code/WorkInProgress/Chinsky/overmap/ships/computers/shuttle.dm create mode 100644 code/WorkInProgress/Chinsky/overmap/ships/engines/engine.dm create mode 100644 code/WorkInProgress/Chinsky/overmap/ships/engines/thermal.dm create mode 100644 code/WorkInProgress/Chinsky/overmap/ships/ship.dm create mode 100644 icons/obj/ship_engine.dmi create mode 100644 maps/overmap/examples.dm create mode 100644 nano/templates/engines_control.tmpl create mode 100644 nano/templates/helm.tmpl create mode 100644 nano/templates/shuttle_control_console_exploration.tmpl diff --git a/code/WorkInProgress/Chinsky/overmap/README.dm b/code/WorkInProgress/Chinsky/overmap/README.dm index 79bff8f1c92..d11ea1fdee2 100644 --- a/code/WorkInProgress/Chinsky/overmap/README.dm +++ b/code/WorkInProgress/Chinsky/overmap/README.dm @@ -58,11 +58,15 @@ Currently no modifications were made to interface to display availability of lan Guide to how make new sector ************************************************************* 0.Map -Remember to put a helm console on ship maps. -Remember to define shuttle areas - both for sectors and ships. +Remember to define shuttle areas if you want sector be accessible via shuttles. Currently there are no other ways to reach sectors from ships. In examples, 4x6 shuttle area is used. In case of shuttle area being too big, it will apear in bottom left corner of it. +Remember to put a helm console and engine control console on ship maps. +Ships need engines to move. Currently there are only thermal engines. +Thermal engines are just a unary atmopheric machine, like a vent. They need high-pressure gas input to produce more thrust. + + 1.Metaobject All vars needed for it to work could be set directly in map editor, so in most cases you won't have to define new in code. Remember to set landing_area var for sectors. @@ -76,24 +80,31 @@ Remember to place one on the actual shuttle too, or it won't be able to return f Remember to set landing_type var to ship-side shuttle area type. shuttle_tag can be set to custom name (it shows up in console interface) -4.Tick map in and compile. +5.Engines +Actual engines could be any type of machinery, as long as it creates a ship_engine datum for itself. + +6.Tick map in and compile. Sector should appear on overmap (in random place if you didn't set mapx,mapy) TODO: -sector-to-ship shuttles. -ship-ship interactions -helm console interface: - current coordinates - list of known locations - autopilot - manual control more mechanics to moving ship: - overmap movement delay - engine objects - 'moving stars' effect + actually working engine objects + unary atmospheric machinery + give more thrust the more pressure gas has + ships have mass var, which is used to caalculate how much acceleration those engines give better space travel / stragglers handling shuttle console: - showing if shuttle has nowhere to be sent to + checking occupied pad or not with docking controllers ?landing pad size detection +non-zlevel overmap objects + field generator + meteor fields + speed-based chance for a rock in the ship + debris fields + speed-based chance of + debirs in the ship + a drone + EMP + nebulaes */ \ No newline at end of file diff --git a/code/WorkInProgress/Chinsky/overmap/_defines.dm b/code/WorkInProgress/Chinsky/overmap/_defines.dm new file mode 100644 index 00000000000..dfc0881ed53 --- /dev/null +++ b/code/WorkInProgress/Chinsky/overmap/_defines.dm @@ -0,0 +1,35 @@ +//Zlevel where overmap objects should be +#define OVERMAP_ZLEVEL 1 +//How far from the edge of overmap zlevel could randomly placed objects spawn +#define OVERMAP_EDGE 7 + +//list used to track which zlevels are being 'moved' by the proc below +var/list/moving_levels = list() +//Proc to 'move' stars in spess +//yes it looks ugly, but it should only fire when state actually change. +//null direction stops movement +proc/toggle_move_stars(zlevel, direction) + if(!zlevel) + return + + var/gen_dir = null + if(direction & (NORTH|SOUTH)) + gen_dir += "ns" + else if(direction & (EAST|WEST)) + gen_dir += "ew" + if(!direction) + gen_dir = null + + if (moving_levels["zlevel"] != gen_dir) + moving_levels["zlevel"] = gen_dir + for(var/turf/space/S in world) + if(S.z == zlevel) + spawn(0) + var/turf/T = S + if(!gen_dir) + T.icon_state = "[((T.x + T.y) ^ ~(T.x * T.y) + T.z) % 25]" + else + T.icon_state = "speedspace_[gen_dir]_[rand(1,15)]" + for(var/atom/movable/AM in T) + if (!AM.anchored) + AM.throw_at(get_step(T,reverse_direction(direction)), 5, 1) \ No newline at end of file diff --git a/code/WorkInProgress/Chinsky/overmap/helm.dm b/code/WorkInProgress/Chinsky/overmap/helm.dm deleted file mode 100644 index 8d5600b1907..00000000000 --- a/code/WorkInProgress/Chinsky/overmap/helm.dm +++ /dev/null @@ -1,161 +0,0 @@ -/obj/machinery/computer/helm - name = "helm control console" - icon_state = "id" - var/obj/effect/map/ship/linked //connected overmap object - var/autopilot = 0 - var/manual_control = 0 - var/dx //desitnation - var/dy //coordinates - var/ship_last_move = 0 - var/ship_move_delay = 10 - - -/obj/machinery/computer/helm/initialize() - linked = map_sectors["[z]"] - if (!linked) - testing("Helm console at level [z] was unable to find a corresponding overmap object.") - else - testing("Helm console at level [z] found a corresponding overmap object '[linked.name]'.") - -/obj/machinery/computer/helm/process() - ..() - if (autopilot && dx && dy && world.time > ship_last_move + ship_move_delay) - ship_last_move = world.time - var/turf/T = locate(dx,dy,1) - if (T) - step_towards(linked,T) - return - -/obj/machinery/computer/helm/relaymove(var/mob/user, direction) - if(manual_control && linked) - if (world.time > ship_last_move + ship_move_delay) - linked.relaymove(user,direction) - ship_last_move = world.time - return 1 - -/obj/machinery/computer/helm/check_eye(var/mob/user as mob) - if (!manual_control) - return null - if (!get_dist(user, src) > 1 || user.blinded || !linked ) - return null - user.reset_view(linked) - return 1 - -/obj/machinery/computer/helm/attack_hand(var/mob/user as mob) - if(..()) - user.unset_machine() - manual_control = 0 - return - - if(!isAI(user)) - user.set_machine(src) - - var/dat = "" - if(!linked) - dat = "
Could not get navigation data!
" - else - dat += "" - dat += "
Current sector:[linked.current_sector ? linked.current_sector.name : "Deep Space"]" - dat += "
Sector information:[linked.current_sector ? linked.current_sector.desc : "Not Available"]" - dat += "
Current coordinates:\[[linked.x], [linked.y]\]" - dat += "
Current destination:" - if (dx && dy) - dat += "\[[dx], " - dat += "[dy]\]" - else - dat += "None" - dat += "
" - - dat += "


" - - dat += "Known locations:
" - dat += "" - for (var/lvl in map_sectors) - var/obj/effect/map/sector/S = map_sectors[lvl] - if (istype(S)) - dat += "" - dat += "
[S.name]:\[[S.x], [S.y]\]Plot course
" - - dat += "



" - - dat += "" - dat += "
Autopilot:[autopilot ? "Engaged" : "Disengaged"]Reset desetination" - dat += "
Manual control:[manual_control ? "Engaged" : "Disengaged"]" - dat += "
" - user << browse("Helm Control[dat]", "window=helm") - onclose(user, "helm") - return - - -/obj/machinery/computer/helm/Topic(href, href_list) - if(..()) - return - - if (!linked) - return - - if (href_list["setx"]) - var/newx = input("Input new destiniation x coordinate", "Coordinate input", dx) as num|null - if (newx) - dx = Clamp(newx, 1, world.maxx) - - if (href_list["sety"]) - var/newy = input("Input new destiniation y coordinate", "Coordinate input", dy) as num|null - if (newy) - dy = Clamp(newy, 1, world.maxy) - - if (href_list["x"] && href_list["y"]) - dx = text2num(href_list["x"]) - dy = text2num(href_list["y"]) - - if (href_list["reset"]) - dx = 0 - dy = 0 - - if (href_list["apilot"]) - autopilot = !autopilot - - if (href_list["manual"]) - manual_control = !manual_control - autopilot = 0 - - add_fingerprint(usr) - updateUsrDialog() - -//Shuttle controller computer for shuttles going from ship to sectors - -/obj/machinery/computer/shuttle_control/explore - name = "exploration shuttle console" - shuttle_tag = "Exploration" - req_access = list() - var/landing_type //area for shuttle ship-side - -/obj/machinery/computer/shuttle_control/explore/initialize() - ..() - shuttle_tag = "[shuttle_tag]-[z]" - if(!shuttle_controller.shuttles[shuttle_tag]) - var/datum/shuttle/ferry/shuttle = new() - shuttle.warmup_time = 10 - shuttle.area_station = locate(landing_type) - shuttle.area_offsite = shuttle.area_station - shuttle_controller.shuttles[shuttle_tag] = shuttle - shuttle_controller.process_shuttles += shuttle - testing("Exploration shuttle '[shuttle_tag]' at zlevel [z] successfully added.") - -/obj/machinery/computer/shuttle_control/explore/proc/update_destination() - if(shuttle_controller.shuttles[shuttle_tag]) - var/obj/effect/map/ship/S = map_sectors["[z]"] - if (!istype(S)) - return - var/datum/shuttle/ferry/shuttle = shuttle_controller.shuttles[shuttle_tag] - if(S && S.current_sector) - var/obj/effect/map/M = S.current_sector - shuttle.area_offsite = M.shuttle_landing - testing("Shuttle controller now sends shuttle to [M]") - else - shuttle.area_offsite = shuttle.area_station - shuttle_controller.shuttles[shuttle_tag] = shuttle - -/obj/machinery/computer/shuttle_control/explore/attack_hand(user as mob) - update_destination() - ..() \ No newline at end of file diff --git a/code/WorkInProgress/Chinsky/overmap/sectors.dm b/code/WorkInProgress/Chinsky/overmap/sectors.dm index 9c80cfc2ac2..9e1635a9602 100644 --- a/code/WorkInProgress/Chinsky/overmap/sectors.dm +++ b/code/WorkInProgress/Chinsky/overmap/sectors.dm @@ -1,4 +1,4 @@ -#define OVERMAP_ZLEVEL 1 + //=================================================================================== //Hook for building overmap //=================================================================================== @@ -29,6 +29,7 @@ var/global/list/map_sectors = list() var/zlevel var/mapx //coordinates on the var/mapy //overmap zlevel + var/known = 1 /obj/effect/mapinfo/New() tag = "sector[z]" @@ -43,9 +44,6 @@ var/global/list/map_sectors = list() name = "generic ship" obj_type = /obj/effect/map/ship -/obj/effect/mapinfo/ship/relaymove(var/mob/user, direction) - step(src,direction) - //=================================================================================== //Overmap object representing zlevel @@ -57,17 +55,19 @@ var/global/list/map_sectors = list() icon_state = "sheet-plasteel" var/map_z = 0 var/area/shuttle/shuttle_landing + var/always_known = 1 /obj/effect/map/New(var/obj/effect/mapinfo/data) map_z = data.zlevel name = data.name + always_known = data.known if (data.icon != 'icons/mob/screen1.dmi') icon = data.icon icon_state = data.icon_state if(data.desc) desc = data.desc - var/new_x = data.mapx ? data.mapx : rand(2,world.maxx-2) - var/new_y = data.mapy ? data.mapy : rand(2,world.maxy-2) + var/new_x = data.mapx ? data.mapx : rand(OVERMAP_EDGE, world.maxx - OVERMAP_EDGE) + var/new_y = data.mapy ? data.mapy : rand(OVERMAP_EDGE, world.maxy - OVERMAP_EDGE) loc = locate(new_x, new_y, OVERMAP_ZLEVEL) if(data.landing_area) @@ -93,13 +93,3 @@ var/global/list/map_sectors = list() name = "generic sector" desc = "Sector with some stuff in it." anchored = 1 - -/obj/effect/map/ship - name = "generic ship" - desc = "Space faring vessel." - icon_state = "sheet-sandstone" - density = 1 - var/obj/effect/map/current_sector - -/obj/effect/map/ship/relaymove(mob/user, direction) - step(src,direction) diff --git a/code/WorkInProgress/Chinsky/overmap/ships/computers/engine_control.dm b/code/WorkInProgress/Chinsky/overmap/ships/computers/engine_control.dm new file mode 100644 index 00000000000..07d6a4579be --- /dev/null +++ b/code/WorkInProgress/Chinsky/overmap/ships/computers/engine_control.dm @@ -0,0 +1,99 @@ +//Engine control and monitoring console + +/obj/machinery/computer/engines + name = "engines control console" + icon_state = "id" + var/state = "status" + var/list/engines = list() + var/obj/effect/map/ship/linked + +/obj/machinery/computer/engines/initialize() + linked = map_sectors["[z]"] + if (linked) + if (!linked.eng_control) + linked.eng_control = src + testing("Engines console at level [z] found a corresponding overmap object '[linked.name]'.") + else + testing("Engines console at level [z] was unable to find a corresponding overmap object.") + + for(var/datum/ship_engine/E in engines) + if (E.zlevel == z && !(E in engines)) + engines += E + +/obj/machinery/computer/engines/attack_hand(var/mob/user as mob) + if(..()) + user.unset_machine() + return + + if(!isAI(user)) + user.set_machine(src) + + ui_interact(user) + +/obj/machinery/computer/engines/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null) + if(!linked) + return + + var/data[0] + data["state"] = state + + var/list/enginfo[0] + for(var/datum/ship_engine/E in engines) + var/list/rdata[0] + rdata["eng_type"] = E.name + rdata["eng_on"] = E.is_on() + rdata["eng_thrust"] = E.get_thrust() + rdata["eng_thrust_limiter"] = round(E.get_thrust_limit()*100) + rdata["eng_status"] = E.get_status() + rdata["eng_reference"] = "\ref[E]" + enginfo.Add(list(rdata)) + + data["engines_info"] = enginfo + + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data) + if (!ui) + ui = new(user, src, ui_key, "engines_control.tmpl", "[linked.name] Engines Control", 380, 530) + ui.set_initial_data(data) + ui.open() + ui.set_auto_update(1) + +/obj/machinery/computer/engines/Topic(href, href_list) + if(..()) + return + + if(href_list["state"]) + state = href_list["state"] + + if(href_list["engine"]) + if(href_list["set_limit"]) + var/datum/ship_engine/E = locate(href_list["engine"]) + var/newlim = input("Input new thrust limit (0..100)", "Thrust limit", E.get_thrust_limit()) as num + var/limit = Clamp(newlim/100, 0, 1) + if(E) + E.set_thrust_limit(limit) + + if(href_list["limit"]) + var/datum/ship_engine/E = locate(href_list["engine"]) + var/limit = Clamp(E.get_thrust_limit() + text2num(href_list["limit"]), 0, 1) + if(E) + E.set_thrust_limit(limit) + + if(href_list["toggle"]) + var/datum/ship_engine/E = locate(href_list["engine"]) + if(E) + E.toggle() + + add_fingerprint(usr) + updateUsrDialog() + +/obj/machinery/computer/engines/proc/burn() + if(engines.len == 0) + return 0 + var/res = 0 + for(var/datum/ship_engine/E in engines) + res |= E.burn() + return res + +/obj/machinery/computer/engines/proc/get_total_thrust() + for(var/datum/ship_engine/E in engines) + . += E.get_thrust() diff --git a/code/WorkInProgress/Chinsky/overmap/ships/computers/helm.dm b/code/WorkInProgress/Chinsky/overmap/ships/computers/helm.dm new file mode 100644 index 00000000000..f81e569abcf --- /dev/null +++ b/code/WorkInProgress/Chinsky/overmap/ships/computers/helm.dm @@ -0,0 +1,174 @@ +/obj/machinery/computer/helm + name = "helm control console" + icon_state = "id" + var/state = "status" + var/obj/effect/map/ship/linked //connected overmap object + var/autopilot = 0 + var/manual_control = 0 + var/list/known_sectors = list() + var/dx //desitnation + var/dy //coordinates + +/obj/machinery/computer/helm/initialize() + linked = map_sectors["[z]"] + if (linked) + if(!linked.nav_control) + linked.nav_control = src + testing("Helm console at level [z] found a corresponding overmap object '[linked.name]'.") + else + testing("Helm console at level [z] was unable to find a corresponding overmap object.") + + for(var/level in map_sectors) + var/obj/effect/map/sector/S = map_sectors["[level]"] + if (istype(S) && S.always_known) + var/datum/data/record/R = new() + R.fields["name"] = S.name + R.fields["x"] = S.x + R.fields["y"] = S.y + known_sectors += R + +/obj/machinery/computer/helm/process() + ..() + if (autopilot && dx && dy) + var/turf/T = locate(dx,dy,1) + if(linked.loc == T) + if(linked.is_still()) + autopilot = 0 + else + linked.decelerate() + + var/brake_path = linked.get_brake_path() + + if(get_dist(linked.loc, T) > brake_path) + linked.accelerate(get_dir(linked.loc, T)) + else + linked.decelerate() + + return + +/obj/machinery/computer/helm/relaymove(var/mob/user, direction) + if(manual_control && linked) + linked.relaymove(user,direction) + return 1 + +/obj/machinery/computer/helm/check_eye(var/mob/user as mob) + if (!manual_control) + return null + if (!get_dist(user, src) > 1 || user.blinded || !linked ) + return null + user.reset_view(linked) + return 1 + +/obj/machinery/computer/helm/attack_hand(var/mob/user as mob) + if(..()) + user.unset_machine() + manual_control = 0 + return + + if(!isAI(user)) + user.set_machine(src) + + ui_interact(user) + +/obj/machinery/computer/helm/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null) + if(!linked) + return + + var/data[0] + data["state"] = state + + data["sector"] = linked.current_sector ? linked.current_sector.name : "Deep Space" + data["sector_info"] = linked.current_sector ? linked.current_sector.desc : "Not Available" + data["s_x"] = linked.x + data["s_y"] = linked.y + data["dest"] = dy && dx + data["d_x"] = dx + data["d_y"] = dy + data["speed"] = linked.get_speed() + data["accel"] = round(linked.get_acceleration()) + data["heading"] = linked.get_heading() ? dir2angle(linked.get_heading()) : 0 + data["autopilot"] = autopilot + data["manual_control"] = manual_control + + var/list/locations[0] + for (var/datum/data/record/R in known_sectors) + var/list/rdata[0] + rdata["name"] = R.fields["name"] + rdata["x"] = R.fields["x"] + rdata["y"] = R.fields["y"] + rdata["reference"] = "\ref[R]" + locations.Add(list(rdata)) + + data["locations"] = locations + + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data) + if (!ui) + ui = new(user, src, ui_key, "helm.tmpl", "[linked.name] Helm Control", 380, 530) + ui.set_initial_data(data) + ui.open() + ui.set_auto_update(1) + +/obj/machinery/computer/helm/Topic(href, href_list) + if(..()) + return + + if (!linked) + return + + if (href_list["add"]) + var/datum/data/record/R = new() + var/sec_name = input("Input naviation entry name", "New navigation entry", "Sector #[known_sectors.len]") as text + if(!sec_name) + sec_name = "Sector #[known_sectors.len]" + R.fields["name"] = sec_name + switch(href_list["add"]) + if("current") + R.fields["x"] = linked.x + R.fields["y"] = linked.y + if("new") + var/newx = input("Input new entry x coordinate", "Coordinate input", linked.x) as num + R.fields["x"] = Clamp(newx, 1, world.maxx) + var/newy = input("Input new entry y coordinate", "Coordinate input", linked.y) as num + R.fields["y"] = Clamp(newy, 1, world.maxy) + known_sectors += R + + if (href_list["remove"]) + var/datum/data/record/R = locate(href_list["remove"]) + known_sectors.Remove(R) + + if (href_list["setx"]) + var/newx = input("Input new destiniation x coordinate", "Coordinate input", dx) as num|null + if (newx) + dx = Clamp(newx, 1, world.maxx) + + if (href_list["sety"]) + var/newy = input("Input new destiniation y coordinate", "Coordinate input", dy) as num|null + if (newy) + dy = Clamp(newy, 1, world.maxy) + + if (href_list["x"] && href_list["y"]) + dx = text2num(href_list["x"]) + dy = text2num(href_list["y"]) + + if (href_list["reset"]) + dx = 0 + dy = 0 + + if (href_list["move"]) + var/ndir = text2num(href_list["move"]) + linked.relaymove(usr, ndir) + + if (href_list["brake"]) + linked.decelerate() + + if (href_list["apilot"]) + autopilot = !autopilot + + if (href_list["manual"]) + manual_control = !manual_control + + if (href_list["state"]) + state = href_list["state"] + add_fingerprint(usr) + updateUsrDialog() + diff --git a/code/WorkInProgress/Chinsky/overmap/ships/computers/shuttle.dm b/code/WorkInProgress/Chinsky/overmap/ships/computers/shuttle.dm new file mode 100644 index 00000000000..c63ad2d763a --- /dev/null +++ b/code/WorkInProgress/Chinsky/overmap/ships/computers/shuttle.dm @@ -0,0 +1,139 @@ +//Shuttle controller computer for shuttles going between sectors +/datum/shuttle/ferry/var/range = 0 //how many overmap tiles can shuttle go, for picking destinatiosn and returning. +/obj/machinery/computer/shuttle_control/explore + name = "exploration shuttle console" + shuttle_tag = "Exploration" + req_access = list() + var/landing_type //area for shuttle ship-side + var/obj/effect/map/destination //current destination + var/obj/effect/map/home //current destination + +/obj/machinery/computer/shuttle_control/explore/initialize() + ..() + home = map_sectors["[z]"] + shuttle_tag = "[shuttle_tag]-[z]" + if(!shuttle_controller.shuttles[shuttle_tag]) + var/datum/shuttle/ferry/shuttle = new() + shuttle.warmup_time = 10 + shuttle.area_station = locate(landing_type) + shuttle.area_offsite = shuttle.area_station + shuttle_controller.shuttles[shuttle_tag] = shuttle + shuttle_controller.process_shuttles += shuttle + testing("Exploration shuttle '[shuttle_tag]' at zlevel [z] successfully added.") + +//Sets destination to new sector. Can be null. +/obj/machinery/computer/shuttle_control/explore/proc/update_destination(var/obj/effect/map/D) + destination = D + if(destination && shuttle_controller.shuttles[shuttle_tag]) + var/datum/shuttle/ferry/shuttle = shuttle_controller.shuttles[shuttle_tag] + shuttle.area_offsite = destination.shuttle_landing + testing("Shuttle controller [shuttle_tag] now sends shuttle to [destination]") + shuttle_controller.shuttles[shuttle_tag] = shuttle + +//Gets all sectors with landing zones in shuttle's range +/obj/machinery/computer/shuttle_control/explore/proc/get_possible_destinations() + var/list/res = list() + var/datum/shuttle/ferry/shuttle = shuttle_controller.shuttles[shuttle_tag] + for (var/obj/effect/map/S in orange(shuttle.range, home)) + if(S.shuttle_landing) + res += S + return res + +//Checks if current destination is still reachable +/obj/machinery/computer/shuttle_control/explore/proc/check_destination() + var/datum/shuttle/ferry/shuttle = shuttle_controller.shuttles[shuttle_tag] + return shuttle && destination && get_dist(home, destination) <= shuttle.range + +/obj/machinery/computer/shuttle_control/explore/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null) + var/data[0] + var/datum/shuttle/ferry/shuttle = shuttle_controller.shuttles[shuttle_tag] + if (!istype(shuttle)) + return + + //If we are already there, or can't reach place anymore, reset destination + if(!shuttle.location && !check_destination()) + destination = null + + //check if shuttle can fly at all + var/can_go = !isnull(destination) + var/current_destination = destination ? destination.name : "None" + //shuttle doesn't need destination set to return home, as long as it's in range. + if(shuttle.location) + current_destination = "Return" + var/area/offsite = shuttle.area_offsite + var/obj/effect/map/cur_loc = map_sectors["[offsite.z]"] + can_go = (get_dist(home,cur_loc) <= shuttle.range) + + //disable picking locations if there are none, or shuttle is already off-site + var/list/possible_d = get_possible_destinations() + var/can_pick = !shuttle.location && possible_d.len + + var/shuttle_state + switch(shuttle.moving_status) + if(SHUTTLE_IDLE) shuttle_state = "idle" + if(SHUTTLE_WARMUP) shuttle_state = "warmup" + if(SHUTTLE_INTRANSIT) shuttle_state = "in_transit" + + var/shuttle_status + switch (shuttle.process_state) + if(IDLE_STATE) + if (shuttle.in_use) + shuttle_status = "Busy." + else if (!shuttle.location) + shuttle_status = "Standing-by at station." + else + shuttle_status = "Standing-by at offsite location." + if(WAIT_LAUNCH) + shuttle_status = "Shuttle has recieved command and will depart shortly." + if(WAIT_ARRIVE) + shuttle_status = "Proceeding to destination." + if(WAIT_FINISH) + shuttle_status = "Arriving at destination now." + + data = list( + "destination_name" = current_destination, + "can_pick" = can_pick, + "shuttle_status" = shuttle_status, + "shuttle_state" = shuttle_state, + "has_docking" = shuttle.docking_controller? 1 : 0, + "docking_status" = shuttle.docking_controller? shuttle.docking_controller.get_docking_status() : null, + "docking_override" = shuttle.docking_controller? shuttle.docking_controller.override_enabled : null, + "can_launch" = can_go && shuttle.can_launch(), + "can_cancel" = can_go && shuttle.can_cancel(), + "can_force" = can_go && shuttle.can_force(), + ) + + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data) + + if (!ui) + ui = new(user, src, ui_key, "shuttle_control_console_exploration.tmpl", "[shuttle_tag] Shuttle Control", 470, 310) + ui.set_initial_data(data) + ui.open() + ui.set_auto_update(1) + +/obj/machinery/computer/shuttle_control/explore/Topic(href, href_list) + if(..()) + return + + usr.set_machine(src) + src.add_fingerprint(usr) + + var/datum/shuttle/ferry/shuttle = shuttle_controller.shuttles[shuttle_tag] + if (!istype(shuttle)) + return + + if(href_list["pick"]) + var/obj/effect/map/self = map_sectors["[z]"] + if(self) + var/list/possible_d = get_possible_destinations() + var/obj/effect/map/D + if(possible_d.len) + D = input("Choose shuttle destination", "Shuttle Destination") as null|anything in possible_d + update_destination(D) + + if(href_list["move"]) + shuttle.launch(src) + if(href_list["force"]) + shuttle.force_launch(src) + else if(href_list["cancel"]) + shuttle.cancel_launch(src) \ No newline at end of file diff --git a/code/WorkInProgress/Chinsky/overmap/ships/engines/engine.dm b/code/WorkInProgress/Chinsky/overmap/ships/engines/engine.dm new file mode 100644 index 00000000000..80690aa84dc --- /dev/null +++ b/code/WorkInProgress/Chinsky/overmap/ships/engines/engine.dm @@ -0,0 +1,60 @@ +//Engine component object + +var/list/ship_engines = list() +/datum/ship_engine + var/name = "ship engine" + var/obj/machinery/engine //actual engine object + var/zlevel = 0 + +/datum/ship_engine/New(var/obj/machinery/holder) + engine = holder + zlevel = holder.z + for(var/obj/machinery/computer/engines/E in machines) + if (E.z == zlevel && !(src in E.engines)) + E.engines += src + break + +//Tries to fire the engine. If successfull, returns 1 +/datum/ship_engine/proc/burn() + if(!engine) + die() + return 1 + +//Returns status string for this engine +/datum/ship_engine/proc/get_status() + if(!engine) + die() + return "All systems nominal" + +/datum/ship_engine/proc/get_thrust() + if(!engine) + die() + return 100 + +//Sets thrust limiter, a number between 0 and 1 +/datum/ship_engine/proc/set_thrust_limit(var/new_limit) + if(!engine) + die() + return 1 + +/datum/ship_engine/proc/get_thrust_limit() + if(!engine) + die() + return 1 + +/datum/ship_engine/proc/is_on() + if(!engine) + die() + return 1 + +/datum/ship_engine/proc/toggle() + if(!engine) + die() + return 1 + +/datum/ship_engine/proc/die() + for(var/obj/machinery/computer/engines/E in machines) + if (E.z == zlevel) + E.engines -= src + break + del(src) \ No newline at end of file diff --git a/code/WorkInProgress/Chinsky/overmap/ships/engines/thermal.dm b/code/WorkInProgress/Chinsky/overmap/ships/engines/thermal.dm new file mode 100644 index 00000000000..b26e7216389 --- /dev/null +++ b/code/WorkInProgress/Chinsky/overmap/ships/engines/thermal.dm @@ -0,0 +1,99 @@ +//Thermal nozzle engine +/datum/ship_engine/thermal + name = "thermal engine" + +/datum/ship_engine/thermal/get_status() + ..() + var/obj/machinery/atmospherics/unary/engine/E = engine + return "Fuel pressure: [E.air_contents.return_pressure()]" + +/datum/ship_engine/thermal/get_thrust() + ..() + var/obj/machinery/atmospherics/unary/engine/E = engine + if(!is_on()) + return 0 + var/pressurized_coef = E.air_contents.return_pressure()/E.effective_pressure + return round(E.thrust_limit * E.nominal_thrust * pressurized_coef) + +/datum/ship_engine/thermal/burn() + ..() + var/obj/machinery/atmospherics/unary/engine/E = engine + return E.burn() + +/datum/ship_engine/thermal/set_thrust_limit(var/new_limit) + ..() + var/obj/machinery/atmospherics/unary/engine/E = engine + E.thrust_limit = new_limit + +/datum/ship_engine/thermal/get_thrust_limit() + ..() + var/obj/machinery/atmospherics/unary/engine/E = engine + return E.thrust_limit + +/datum/ship_engine/thermal/is_on() + ..() + var/obj/machinery/atmospherics/unary/engine/E = engine + return E.on + +/datum/ship_engine/thermal/toggle() + ..() + var/obj/machinery/atmospherics/unary/engine/E = engine + E.on = !E.on + +//Actual thermal nozzle engine object + +/obj/machinery/atmospherics/unary/engine + name = "engine nozzle" + desc = "Simple thermal nozzle, uses heated gast to propell the ship." + icon = 'icons/obj/ship_engine.dmi' + icon_state = "nozzle" + var/on = 1 + var/thrust_limit = 1 //Value between 1 and 0 to limit the resulting thrust + var/nominal_thrust = 3000 + var/effective_pressure = 3000 + var/datum/ship_engine/thermal/controller + +/obj/machinery/atmospherics/unary/engine/initialize() + ..() + controller = new(src) + +/obj/machinery/atmospherics/unary/engine/Del() + ..() + controller.die() + +/obj/machinery/atmospherics/unary/engine/proc/burn() + if (!on) + return + if(air_contents.temperature > 0) + var/transfer_moles = 100 * air_contents.volume/max(air_contents.temperature * R_IDEAL_GAS_EQUATION, 0,01) + transfer_moles = round(thrust_limit * transfer_moles, 0.01) + if(transfer_moles > air_contents.total_moles) + on = !on + return 0 + + var/datum/gas_mixture/removed = air_contents.remove(transfer_moles) + + loc.assume_air(removed) + if(air_contents.temperature > PHORON_MINIMUM_BURN_TEMPERATURE) + var/exhaust_dir = reverse_direction(dir) + var/turf/T = get_step(src,exhaust_dir) + if(T) + new/obj/effect/engine_exhaust(T,exhaust_dir,air_contents.temperature) + return 1 + +//Exhaust effect +/obj/effect/engine_exhaust + name = "engine exhaust" + icon = 'icons/effects/effects.dmi' + icon_state = "exhaust" + anchored = 1 + + New(var/turf/nloc, var/ndir, var/temp) + dir = ndir + ..(nloc) + + if(nloc) + nloc.hotspot_expose(temp,125) + + spawn(20) + loc = null \ No newline at end of file diff --git a/code/WorkInProgress/Chinsky/overmap/ships/ship.dm b/code/WorkInProgress/Chinsky/overmap/ships/ship.dm new file mode 100644 index 00000000000..b080c41b071 --- /dev/null +++ b/code/WorkInProgress/Chinsky/overmap/ships/ship.dm @@ -0,0 +1,105 @@ +/obj/effect/map/ship + name = "generic ship" + desc = "Space faring vessel." + icon_state = "sheet-sandstone" + var/vessel_mass = 9000 //tonnes, random number + var/default_delay = 60 + var/list/speed = list(0,0) + var/last_burn = 0 + var/list/last_movement = list(0,0) + var/fore_dir = NORTH + + var/obj/effect/map/current_sector + var/obj/machinery/computer/helm/nav_control + var/obj/machinery/computer/engines/eng_control + +/obj/effect/map/ship/initialize() + for(var/obj/machinery/computer/engines/E in machines) + if (E.z == map_z) + eng_control = E + break + for(var/obj/machinery/computer/helm/H in machines) + if (H.z == map_z) + nav_control = H + break + processing_objects.Add(src) + +/obj/effect/map/ship/relaymove(mob/user, direction) + accelerate(direction) + +/obj/effect/map/ship/proc/is_still() + return !(speed[1] || speed[2]) + +/obj/effect/map/ship/proc/get_acceleration() + return eng_control.get_total_thrust()/vessel_mass + +/obj/effect/map/ship/proc/get_speed() + return round(sqrt(speed[1]*speed[1] + speed[2]*speed[2])) + +/obj/effect/map/ship/proc/get_heading() + var/res = 0 + if(speed[1]) + if(speed[1] > 0) + res |= EAST + else + res |= WEST + if(speed[2]) + if(speed[2] > 0) + res |= NORTH + else + res |= SOUTH + return res + +/obj/effect/map/ship/proc/adjust_speed(n_x, n_y) + speed[1] = Clamp(speed[1] + n_x, -default_delay, default_delay) + speed[2] = Clamp(speed[2] + n_y, -default_delay, default_delay) + if(is_still()) + toggle_move_stars(map_z) + else + toggle_move_stars(map_z, fore_dir) + +/obj/effect/map/ship/proc/can_burn() + if (!eng_control) + return 0 + if (world.time < last_burn + 10) + return 0 + if (!eng_control.burn()) + return 0 + return 1 + +/obj/effect/map/ship/proc/get_brake_path() + if(!get_acceleration()) + return INFINITY + return max(abs(speed[1]),abs(speed[2]))/get_acceleration() + +/obj/effect/map/ship/proc/decelerate() + if(!is_still() && can_burn()) + if (speed[1]) + adjust_speed(-SIGN(speed[1]) * min(get_acceleration(),speed[1]), 0) + if (speed[2]) + adjust_speed(0, -SIGN(speed[2]) * min(get_acceleration(),speed[2])) + last_burn = world.time + +/obj/effect/map/ship/proc/accelerate(direction) + if(can_burn()) + last_burn = world.time + + if(direction & EAST) + adjust_speed(get_acceleration(), 0) + if(direction & WEST) + adjust_speed(-get_acceleration(), 0) + if(direction & NORTH) + adjust_speed(0, get_acceleration()) + if(direction & SOUTH) + adjust_speed(0, -get_acceleration()) + +/obj/effect/map/ship/process() + if(!is_still()) + var/list/deltas = list(0,0) + for(var/i=1, i<=2, i++) + if(speed[i] && world.time > last_movement[i] + default_delay - speed[i]) + deltas[i] = speed[i] > 0 ? 1 : -1 + last_movement[i] = world.time + var/turf/newloc = locate(x + deltas[1], y + deltas[2], z) + if(newloc) + Move(newloc) \ No newline at end of file diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi index 71062b8ddbbcca9b2b134961a68ba98a83933f31..fbd4e4100d38205e9024d06d7a02519820936c3f 100644 GIT binary patch delta 28891 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 diff --git a/icons/obj/ship_engine.dmi b/icons/obj/ship_engine.dmi new file mode 100644 index 0000000000000000000000000000000000000000..76546be416a49274a4d20a734312e381cc2ec03b GIT binary patch literal 817 zcmV-11J3-3P)Vq#*rxVVLdg>Z0iwY9ZdTU#nBDrsqHp{rGY00001bW%=J06^y0W&i*HYkE{z zbVOxyV{&P5bZKvH004NLQ&wgYlKpfFde_@M&EWZ%SPAi5kPy6EX(jVlQNFWW`T^bn)S@f^R(8r| z@p;3imm`1&R^OmmSwP-Psxp;BH=j6&t2O8yl3G`(mV<}>H!RA%p&q0wJ?hmSV2r_< z83UTB0zhq$R(AkPXpq*e-v%%+7PNf;Y~BMHrvNr4;XH^0co)G(WM1&CfYt(;AMQys z0HTBf#;;fhkSMlXF$-%gTF4VJ~f3^TW>P)P;g8dEv!jfy>nE?9h z!F>k-OoV&jgaH~eyJ}-VAk&0^CV2n42jD|90|WxV*8{$z7TPPd{^TJQHjYgH7t6Fc9_Pgzy_V^CGF@P1~O^!-lL zBOavf$_q=f?05{aEQ#NRUpNP`C-D(;7aqTN8>90 + {{:~link('Overall status', 'note', {'state' :'status'}, null, state == 'status' ? 'selected' : null)}} + {{:~link('Details', 'note', {'state' : 'engines'}, null, state == 'engines' ? 'selected' : null)}} + + +{{if state == "engines"}} + {{if engines_info}} + {{for engines_info}} +
+
+ Engine #{{:#index + 1}}: +
+
+ {{:~link(eng_on ? 'Shutdown' : 'Power up', 'power', { 'toggle' : 1, 'engine' : eng_reference }, null, eng_on ? 'selected' : null)}} +
+
+
+
+
+ Type: +
+
+ {{:eng_type}} +
+
+
+
+ Status: +
+
+ {{:eng_on ? 'Online' : 'Offline'}}
+ {{:eng_status}} +
+
+
+
+ Current thrust: +
+
+ {{:eng_thrust}} +
+
+
+
+ Thrust limit: +
+
+ {{:~link('', 'circle-plus', { 'limit' : 0.1, 'engine' : eng_reference }, null, null)}} + {{:~link(eng_thrust_limiter+'%', null, { 'set_limit' : 1, 'engine' : eng_reference }, null, null)}} + {{:~link('', 'circle-minus', { 'limit' : -0.1, 'engine' : eng_reference }, null, null)}} +
+
+
+ {{/for}} + {{/if}} +{{/if}} +{{if state == "status"}} +{{if engines_info}} + {{for engines_info}} +
+
+
+ Engine #{{:#index + 1}}: +
+
+ {{:~link(eng_on ? 'Shutdown' : 'Power up', 'power', { 'toggle' : 1, 'engine' : eng_reference }, null, eng_on ? 'selected' : null)}} +
+
+
+
+ Thrust: +
+ Thrust limit: +
+
+ {{:eng_thrust}} +
+ {{:eng_thrust_limiter}}% +
+
+
+ {{/for}} + {{/if}} +{{/if}} \ No newline at end of file diff --git a/nano/templates/helm.tmpl b/nano/templates/helm.tmpl new file mode 100644 index 00000000000..1457d7a3368 --- /dev/null +++ b/nano/templates/helm.tmpl @@ -0,0 +1,119 @@ + + + + + +
+

Sector information

+
+ {{:sector}} +
+ Coordinates: {{:s_x}} : {{:s_y}} +
+ Additional information: {{:s_x}} : {{:s_y}} + {{:sector_info}} +
+
+ +
+

Flight data

+
+
+
+ Speed: +
+
+ {{:speed}} +
+
+
+
+ Acceleration: +
+
+ {{:accel}} +
+
+
+
+ Heading: +
+
+ {{:heading}} +
+
+
+
+ + +

Manual control

+
+
+
+
+ {{:~link('', 'triangle-1-nw', { 'move' : 9 }, null, null)}} + {{:~link('', 'triangle-1-n', { 'move' : 1 }, null, null)}} + {{:~link('', 'triangle-1-ne', { 'move' : 5 }, null, null)}} +
+
+ {{:~link('', 'triangle-1-w', { 'move' : 8 }, null, null)}} + {{:~link('', 'circle-close', { 'brake' : 1 }, null, null)}} + {{:~link('', 'triangle-1-e', { 'move' : 4 }, null, null)}} +
+
+ {{:~link('', 'triangle-1-sw', { 'move' : 10 }, null, null)}} + {{:~link('', 'triangle-1-s', { 'move' : 2 }, null, null)}} + {{:~link('', 'triangle-1-se', { 'move' : 6 }, null, null)}} +
+
+ +
+
+ Direct control + {{:~link(manual_control ? 'Engaged' : 'Disengaged', 'shuffle', { 'manual' : 1 }, manual_control ? 'selected' : null, null)}} +
+
+
+
+ +
+
+

Autopilot

+
+
+ {{:~link(autopilot? 'Engaged' : 'Disengaged', 'gear', { 'apilot' : 1 }, dest ? null : 'disabled' , autopilot ? 'selected' : null)}} +
+
+
+
+ Target coordinates +
+
+ {{if dest}} + {{:~link(d_x, null, { 'setx' : 1 }, null, null)}} {{:~link(d_y, null, { 'sety' : 1 }, null, null)}} + {{else}} + {{:~link('None', null, { 'sety' : 1, 'setx' : 1 }, null, null)}} + {{/if}} +
+
+ +

Navigation data

+
+ {{:~link('Save current position', 'disk', { 'add' : 'current' }, null)}} + {{:~link('Add new entry', 'document', { 'add' : 'new' }, null)}} +
+ +
+ {{if locations}} + {{for locations}} +
+ {{:name}}: + {{:x}} : {{:y}} +
+
+ {{:~link('Plot course', 'arrowreturnthick-1-e', { 'x' : x, 'y' : y }, null, null)}} + {{:~link('Remove entry', 'close', { 'remove' : reference }, null, null)}} +
+ {{/for}} + {{/if}} +
diff --git a/nano/templates/shuttle_control_console_exploration.tmpl b/nano/templates/shuttle_control_console_exploration.tmpl new file mode 100644 index 00000000000..443b3190a92 --- /dev/null +++ b/nano/templates/shuttle_control_console_exploration.tmpl @@ -0,0 +1,74 @@ +

Shuttle Status

+
+
+ {{:shuttle_status}} +
+
+
+
+
+ Drive: +
+
+ {{if shuttle_state == "idle"}} + IDLE + {{else shuttle_state == "warmup"}} + SPINNING UP + {{else shuttle_state == "in_transit"}} + ENGAGED + {{else}} + ERROR + {{/if}} +
+
+
+{{if has_docking}} +
+
+
+ Docking Status: +
+
+ {{if docking_status == "docked"}} + DOCKED + {{else docking_status == "docking"}} + {{if !docking_override}} + DOCKING + {{else}} + DOCKING-MANUAL + {{/if}} + {{else docking_status == "undocking"}} + {{if !docking_override}} + UNDOCKING + {{else}} + UNDOCKING-MANUAL + {{/if}} + {{else docking_status == "undocked"}} + UNDOCKED + {{else}} + ERROR + {{/if}} + +
+
+
+{{/if}} +
+
+ Current Destination: +
+ {{:destination_name}} +
+ {{:~link('Choose Destination', 'arrowreturn-1-s', {'pick' : '1'}, can_pick? null : 'disabled' , null)}} +
+
+

Shuttle Control

+
+
+
+ {{:~link('Launch Shuttle', 'arrowthickstop-1-e', {'move' : '1'}, can_launch? null : 'disabled' , null)}} + {{:~link('Cancel Launch', 'cancel', {'cancel' : '1'}, can_cancel? null : 'disabled' , null)}} + {{:~link('Force Launch', 'alert', {'force' : '1'}, can_force? null : 'disabled' , can_force? 'redBackground' : null)}} +
+
+
\ No newline at end of file