From 60ea630c6da8e5a3bcaf89ddc1a750f881f5144e Mon Sep 17 00:00:00 2001 From: Emmanuel S Date: Tue, 22 Dec 2020 15:09:28 -0500 Subject: [PATCH] Base construction console refactor (#55451) Refactors base construction consoles to be generic instead of only being meant for building the aux shuttle. The current aux base construction console behaves the exact same. This PR is A step towards minichem, as I'll be using base construction code in it pretty heavily. More information about the whole minichem thing in this design doc In terms of player-facing changes, this PR has made possible a neat admin-only base construction console that can be used to construct things anywhere on the z level. Why It's Good For The Game The current base construction console code was snowflakey and didn't follow particularly great coding practices. This fixes that and provides a solid foundation for future work. --- .../map_files/Deltastation/DeltaStation2.dmm | 2 +- .../map_files/IceBoxStation/IceBoxStation.dmm | 2 +- _maps/map_files/KiloStation/KiloStation.dmm | 2 +- _maps/map_files/MetaStation/MetaStation.dmm | 2 +- .../machinery/computer/camera_advanced.dm | 3 +- .../circuitboards/computer_circuitboards.dm | 12 +- .../construction_actions.dm | 152 ++++++++++ .../construction_console.dm | 134 +++++++++ .../construction_console_aux.dm | 36 +++ .../construction_console_centcom.dm | 16 + code/modules/mining/aux_base_camera.dm | 276 ------------------ tgstation.dme | 5 +- 12 files changed, 359 insertions(+), 283 deletions(-) create mode 100644 code/game/objects/structures/construction_consolse/construction_actions.dm create mode 100644 code/game/objects/structures/construction_consolse/construction_console.dm create mode 100644 code/game/objects/structures/construction_consolse/construction_console_aux.dm create mode 100644 code/game/objects/structures/construction_consolse/construction_console_centcom.dm delete mode 100644 code/modules/mining/aux_base_camera.dm diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index ff1395d971f..e0664f080e6 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -1993,7 +1993,7 @@ /turf/open/floor/plasteel, /area/construction/mining/aux_base) "afG" = ( -/obj/machinery/computer/camera_advanced/base_construction{ +/obj/machinery/computer/camera_advanced/base_construction/aux{ dir = 8 }, /obj/effect/turf_decal/tile/yellow, diff --git a/_maps/map_files/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm index f31bfb053f0..9a8627e5981 100644 --- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm +++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm @@ -9853,7 +9853,7 @@ c_tag = "Auxillary Base Construction"; dir = 8 }, -/obj/machinery/computer/camera_advanced/base_construction{ +/obj/machinery/computer/camera_advanced/base_construction/aux{ dir = 8 }, /obj/effect/turf_decal/tile/yellow, diff --git a/_maps/map_files/KiloStation/KiloStation.dmm b/_maps/map_files/KiloStation/KiloStation.dmm index e8a3bc77fc5..45878c3525d 100644 --- a/_maps/map_files/KiloStation/KiloStation.dmm +++ b/_maps/map_files/KiloStation/KiloStation.dmm @@ -85899,7 +85899,7 @@ /area/security/main) "cJk" = ( /obj/effect/turf_decal/bot, -/obj/machinery/computer/camera_advanced/base_construction{ +/obj/machinery/computer/camera_advanced/base_construction/aux{ dir = 4 }, /obj/effect/decal/cleanable/dirt, diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 6be05b6ec73..f4bffdf5e9e 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -18275,7 +18275,7 @@ /obj/machinery/light{ dir = 8 }, -/obj/machinery/computer/camera_advanced/base_construction{ +/obj/machinery/computer/camera_advanced/base_construction/aux{ dir = 4 }, /obj/effect/turf_decal/tile/yellow{ diff --git a/code/game/machinery/computer/camera_advanced.dm b/code/game/machinery/computer/camera_advanced.dm index d47a0fb9d5c..bd7fc128f1b 100644 --- a/code/game/machinery/computer/camera_advanced.dm +++ b/code/game/machinery/computer/camera_advanced.dm @@ -132,7 +132,8 @@ var/mob/living/L = user if(!eyeobj) CreateEye() - + if(!eyeobj) //Eye creation failed + return if(!eyeobj.eye_initialized) var/camera_location var/turf/myturf = get_turf(src) diff --git a/code/game/objects/items/circuitboards/computer_circuitboards.dm b/code/game/objects/items/circuitboards/computer_circuitboards.dm index e720efadd81..1eb38559b66 100644 --- a/code/game/objects/items/circuitboards/computer_circuitboards.dm +++ b/code/game/objects/items/circuitboards/computer_circuitboards.dm @@ -173,10 +173,20 @@ build_path = /obj/machinery/computer/auxiliary_base /obj/item/circuitboard/computer/base_construction - name = "circuit board (Aux Mining Base Construction Console)" + name = "circuit board (Generic Base Construction Console)" icon_state = "engineering" build_path = /obj/machinery/computer/camera_advanced/base_construction +/obj/item/circuitboard/computer/base_construction/aux + name = "circuit board (Aux Mining Base Construction Console)" + icon_state = "engineering" + build_path = /obj/machinery/computer/camera_advanced/base_construction/aux + +/obj/item/circuitboard/computer/base_construction/centcom + name = "circuit board (Centcom Base Construction Console)" + icon_state = "engineering" + build_path = /obj/machinery/computer/camera_advanced/base_construction/centcom + /obj/item/circuitboard/computer/comm_monitor name = "Telecommunications Monitor (Computer Board)" icon_state = "engineering" diff --git a/code/game/objects/structures/construction_consolse/construction_actions.dm b/code/game/objects/structures/construction_consolse/construction_actions.dm new file mode 100644 index 00000000000..48d5a75d2ec --- /dev/null +++ b/code/game/objects/structures/construction_consolse/construction_actions.dm @@ -0,0 +1,152 @@ +/datum/action/innate/camera_off/base_construction + name = "Log out" + +///Generic construction action for base [construction consoles][/obj/machinery/computer/camera_advanced/base_construction]. +/datum/action/innate/construction + icon_icon = 'icons/mob/actions/actions_construction.dmi' + ///Console's eye mob + var/mob/camera/ai_eye/remote/base_construction/remote_eye + ///Console itself + var/obj/machinery/computer/camera_advanced/base_construction/base_console + ///Is this used to build only on the station z level? + var/only_station_z = TRUE + +/datum/action/innate/construction/Activate() + if(!target) + return TRUE + remote_eye = owner.remote_control + base_console = target + +///Sanity check for any construction action that relies on an RCD being in the base console +/datum/action/innate/construction/proc/check_rcd() + //The console must always have an RCD. + if(!base_console.internal_rcd) + CRASH("Base console is somehow missing an internal RCD!") + +///Check a loction to see if it is inside the aux base at the station. Camera visbility checks omitted so as to not hinder construction. +/datum/action/innate/construction/proc/check_spot() + var/turf/build_target = get_turf(remote_eye) + var/area/build_area = get_area(build_target) + var/area/area_constraint = base_console.allowed_area + //If the console has no allowed_area var, then we're free to build wherever + if (!area_constraint) + return TRUE + if(!istype(build_area, area_constraint)) + to_chat(owner, "You can only build within [area_constraint]!") + return FALSE + if(only_station_z && !is_station_level(build_target.z)) + to_chat(owner, "[area_constraint] has launched and can no longer be modified.") + return FALSE + return TRUE + +/datum/action/innate/construction/build + name = "Build" + button_icon_state = "build" + +/datum/action/innate/construction/build/Activate() + if(..()) + return + if(!check_spot()) + return + var/turf/target_turf = get_turf(remote_eye) + var/atom/rcd_target = target_turf + //Find airlocks and other shite + for(var/obj/S in target_turf) + if(LAZYLEN(S.rcd_vals(owner,base_console.internal_rcd))) + rcd_target = S //If we don't break out of this loop we'll get the last placed thing + owner.changeNext_move(CLICK_CD_RANGE) + check_rcd() + base_console.internal_rcd.afterattack(rcd_target, owner, TRUE) //Activate the RCD and force it to work remotely! + playsound(target_turf, 'sound/items/deconstruct.ogg', 60, TRUE) + +/datum/action/innate/construction/switch_mode + name = "Switch Mode" + button_icon_state = "builder_mode" + +/datum/action/innate/construction/switch_mode/Activate() + if(..()) + return + var/list/buildlist = list("Walls and Floors" = 1,"Airlocks" = 2,"Deconstruction" = 3,"Windows and Grilles" = 4) + var/buildmode = input("Set construction mode.", "Base Console", null) in buildlist + check_rcd() + base_console.internal_rcd.mode = buildlist[buildmode] + to_chat(owner, "Build mode is now [buildmode].") + +/datum/action/innate/construction/airlock_type + name = "Select Airlock Type" + button_icon_state = "airlock_select" + +/datum/action/innate/construction/airlock_type/Activate() + if(..()) + return + check_rcd() + base_console.internal_rcd.change_airlock_setting() + +/datum/action/innate/construction/window_type + name = "Select Window Glass" + button_icon_state = "window_select" + +/datum/action/innate/construction/window_type/Activate() + if(..()) + return + check_rcd() + base_console.internal_rcd.toggle_window_glass() + +///Generic action used with base construction consoles to build anything that can't be built with an RCD +/datum/action/innate/construction/place_structure + name = "Place Generic Structure" + var/obj/structure_path + var/structure_name + var/place_sound + +/datum/action/innate/construction/place_structure/Activate() + if(..()) + return + var/turf/place_turf = get_turf(remote_eye) + if(!base_console.structures[structure_name]) + to_chat(owner, "[base_console] is out of [structure_name]!") + return + if(!check_spot()) + return + //Can't place inside a closed turf + if(place_turf.density) + to_chat(owner, "[structure_name] may only be placed on a floor.") + return + //Can't place two dense objects inside eachother + if(initial(structure_path.density) && place_turf.is_blocked_turf()) + to_chat(owner, "Location is obstructed by something. Please clear the location and try again.") + return + var/obj/placed_structure = new structure_path(place_turf) + base_console.structures[structure_name]-- + var/remaining = base_console.structures[structure_name] + playsound(place_turf, place_sound, 50, TRUE) + after_place(placed_structure, remaining) + +///Proc to handle additional behavior after placing an object +/datum/action/innate/construction/place_structure/proc/after_place() + return + +/datum/action/innate/construction/place_structure/fan + name = "Place Tiny Fan" + button_icon_state = "build_fan" + structure_name = "fans" + structure_path = /obj/structure/fans/tiny + place_sound = 'sound/machines/click.ogg' + +/datum/action/innate/construction/place_structure/turret/after_place(obj/placed_structure, remaining) + to_chat(owner, "Tiny fan placed. [remaining] fans remaining.") + +/datum/action/innate/construction/place_structure/turret + name = "Install Plasma Anti-Wildlife Turret" + button_icon_state = "build_turret" + structure_name = "turrets" + structure_path = /obj/machinery/porta_turret/aux_base + place_sound = 'sound/items/drill_use.ogg' + +/datum/action/innate/construction/place_structure/turret/after_place(obj/placed_structure, remaining) + var/obj/machinery/computer/auxiliary_base/turret_controller = locate() in get_area(placed_structure) + if(!turret_controller) + to_chat(owner, "Warning: Aux base controller not found. Turrets might not work properly.") + return + turret_controller.turrets += placed_structure + to_chat(owner, "You've constructed an additional turret. [remaining] turrets remaining.") diff --git a/code/game/objects/structures/construction_consolse/construction_console.dm b/code/game/objects/structures/construction_consolse/construction_console.dm new file mode 100644 index 00000000000..056419946da --- /dev/null +++ b/code/game/objects/structures/construction_consolse/construction_console.dm @@ -0,0 +1,134 @@ +/** + * Camera console used to control a base building drone + * + * Using this console will put the user in control of a [base building drone][/mob/camera/ai_eye/remote/base_construction]. + * The drone will appear somewhere within the allowed_area var, or if no area is specified, at the location of the console.area + * Upon interacting, the user will be granted a set of base building actions that will generally be carried out at the drone's location. + * To create a new base builder system, this class should be the only thing that needs to be subtyped. + * + */ +/obj/machinery/computer/camera_advanced/base_construction + name = "generic base construction console" + desc = "An industrial computer integrated with a camera-assisted rapid construction drone." + networks = list("ss13") + circuit = /obj/item/circuitboard/computer/base_construction + off_action = new/datum/action/innate/camera_off/base_construction + jump_action = null + icon_screen = "mining" + icon_keyboard = "rd_key" + light_color = LIGHT_COLOR_PINK + ///Area that the eyeobj will be constrained to. If null, eyeobj will be able to build and move anywhere. + var/area/allowed_area + ///Assoc. list ("structure_name" : count) that keeps track of the number of special structures that can't be built with an RCD, for example, tiny fans or turrets. + var/list/structures = list() + ///Internal RCD. Some construction actions rely on having this. + var/obj/item/construction/rcd/internal/internal_rcd + ///Actions given to the console user to help with base building. Actions are generally carried out at the location of the eyeobj + var/list/datum/action/innate/construction_actions + +/obj/machinery/computer/camera_advanced/base_construction/Initialize(mapload) + . = ..() + //Populate the actions list with the different action objects that will be granted to console users + populate_actions_list() + //Map spawned consoles will automatically restock their materials + if(mapload) + restock_materials() + +/** + * Fill the construction_actios list with actions + * + * Instantiate each action object that we'll be giving to users of + * this console, and put it in the construction actions list. + */ +/obj/machinery/computer/camera_advanced/base_construction/proc/populate_actions_list() + construction_actions = list() + +/** + * Reload materials used by the console + * + * Restocks any materials used by the base construction console. + * This might mean refilling the internal RCD (should it be initialized), or + * giving the structures list default values. + */ +/obj/machinery/computer/camera_advanced/base_construction/proc/restock_materials() + return + +///Find a spawn location for the eyeobj. If no allowed_area is defined, spawn ontop of the console. +/obj/machinery/computer/camera_advanced/base_construction/proc/find_spawn_spot() + if (allowed_area) + return pick(get_area_turfs(allowed_area)) + return get_turf(src) + +/obj/machinery/computer/camera_advanced/base_construction/CreateEye() + var/turf/spawn_spot = find_spawn_spot() + if (!spawn_spot) + return FALSE + eyeobj = new /mob/camera/ai_eye/remote/base_construction(spawn_spot, src) + eyeobj.origin = src + return TRUE + +/obj/machinery/computer/camera_advanced/base_construction/attackby(obj/item/W, mob/user, params) + //If we have an internal RCD, we can refill it by slapping the console with some materials + if(internal_rcd && (istype(W, /obj/item/rcd_ammo) || istype(W, /obj/item/stack/sheet))) + internal_rcd.attackby(W, user, params) + else + return ..() + +/obj/machinery/computer/camera_advanced/base_construction/Destroy() + qdel(internal_rcd) + return ..() + +///Go through every action object in the construction_action list (which should be fully initialized by now) and grant it to the user. +/obj/machinery/computer/camera_advanced/base_construction/GrantActions(mob/living/user) + ..() + for (var/datum/action/innate/construction_action in construction_actions) + if(construction_action) + construction_action.target = src + construction_action.Grant(user) + actions += construction_action + //When the eye is in use, make it visible to players so they know when someone is building. + eyeobj.invisibility = 0 + +/obj/machinery/computer/camera_advanced/base_construction/remove_eye_control(mob/living/user) + ..() + //Hide the eye when not in use. + eyeobj.invisibility = INVISIBILITY_MAXIMUM + +/** + * A mob used by [/obj/machinery/computer/camera_advanced/base_construction] for building in specific areas. + * + * Controlled by a user who is using a base construction console. + * The user will be granted a set of building actions by the console, and the actions will be carried out by this mob. + * The mob is constrained to a given area defined by the base construction console. + * + */ +/mob/camera/ai_eye/remote/base_construction + name = "construction holo-drone" + //Allows any curious crew to watch the base after it leaves. (This is safe as the base cannot be modified once it leaves) + move_on_shuttle = TRUE + icon = 'icons/obj/mining.dmi' + icon_state = "construction_drone" + ///Reference to the camera console controlling this drone + var/obj/machinery/computer/camera_advanced/base_construction/linked_console + +/mob/camera/ai_eye/remote/base_construction/Initialize(mapload, obj/machinery/computer/camera_advanced/console_link) + linked_console = console_link + return ..() + +/mob/camera/ai_eye/remote/base_construction/setLoc(t) + var/area/curr_area = get_area(t) + //Only move if we're in the allowed area. If no allowed area is defined, then we're free to move wherever. + if(!linked_console.allowed_area || istype(curr_area, linked_console.allowed_area)) + return ..() + +/mob/camera/ai_eye/remote/base_construction/relaymove(mob/living/user, direction) + //This camera eye is visible, and as such needs to keep it's dir updated + dir = direction + return ..() + +///[Base console's][/obj/machinery/computer/camera_advanced/base_construction] internal RCD. Has a large material capacity and a fast buildspeed. +/obj/item/construction/rcd/internal + name = "internal RCD" + max_matter = 600 + no_ammo_message = "Internal matter exhausted. Please add additional materials." + delay_mod = 0.5 diff --git a/code/game/objects/structures/construction_consolse/construction_console_aux.dm b/code/game/objects/structures/construction_consolse/construction_console_aux.dm new file mode 100644 index 00000000000..16179fbb02e --- /dev/null +++ b/code/game/objects/structures/construction_consolse/construction_console_aux.dm @@ -0,0 +1,36 @@ +///base consturctino console subtype for the mining aux base +/obj/machinery/computer/camera_advanced/base_construction/aux + name = "aux base construction console" + circuit = /obj/item/circuitboard/computer/base_construction/aux + structures = list("fans" = 0, "turrets" = 0) + allowed_area = /area/shuttle/auxiliary_base + +/obj/machinery/computer/camera_advanced/base_construction/aux/Initialize(mapload) + internal_rcd = new(src) + return ..() + +/obj/machinery/computer/camera_advanced/base_construction/aux/restock_materials() + internal_rcd.matter = internal_rcd.max_matter + structures["fans"] = 4 + structures["turrets"] = 4 + +/obj/machinery/computer/camera_advanced/base_construction/aux/populate_actions_list() + construction_actions = list() + construction_actions.Add(new /datum/action/innate/construction/switch_mode())//Action for switching the RCD's build modes + construction_actions.Add(new /datum/action/innate/construction/build()) //Action for using the RCD + construction_actions.Add(new /datum/action/innate/construction/airlock_type()) //Action for setting the airlock type + construction_actions.Add(new /datum/action/innate/construction/window_type()) //Action for setting the window type + construction_actions.Add(new /datum/action/innate/construction/place_structure/fan()) //Action for spawning fans + construction_actions.Add(new /datum/action/innate/construction/place_structure/turret()) //Action for spawning turrets + +/obj/machinery/computer/camera_advanced/base_construction/aux/find_spawn_spot() + //Aux base controller. Where the eyeobj will spawn. + var/obj/machinery/computer/auxiliary_base/aux_controller + for(var/obj/machinery/computer/auxiliary_base/potential_aux_console in GLOB.machines) + if(istype(get_area(potential_aux_console), allowed_area)) + aux_controller = potential_aux_console + break + if(!aux_controller) + say("ERROR: Unable to locate auxiliary base controller!") + return null + return aux_controller diff --git a/code/game/objects/structures/construction_consolse/construction_console_centcom.dm b/code/game/objects/structures/construction_consolse/construction_console_centcom.dm new file mode 100644 index 00000000000..8cab9f3379c --- /dev/null +++ b/code/game/objects/structures/construction_consolse/construction_console_centcom.dm @@ -0,0 +1,16 @@ +///admin-only base consturctino console subtype for building anywhere! +/obj/machinery/computer/camera_advanced/base_construction/centcom + name = "centcom base construction console" + circuit = /obj/item/circuitboard/computer/base_construction/centcom + +/obj/machinery/computer/camera_advanced/base_construction/centcom/Initialize(mapload) + internal_rcd = new(src) + return ..() + +/obj/machinery/computer/camera_advanced/base_construction/centcom/restock_materials() + internal_rcd.matter = internal_rcd.max_matter + +/obj/machinery/computer/camera_advanced/base_construction/centcom/populate_actions_list() + construction_actions = list() + construction_actions.Add(new /datum/action/innate/construction/switch_mode())//Action for switching the RCD's build modes + construction_actions.Add(new /datum/action/innate/construction/build()) //Action for using the RCD diff --git a/code/modules/mining/aux_base_camera.dm b/code/modules/mining/aux_base_camera.dm deleted file mode 100644 index 2668becd1eb..00000000000 --- a/code/modules/mining/aux_base_camera.dm +++ /dev/null @@ -1,276 +0,0 @@ -//Aux base construction console -/mob/camera/ai_eye/remote/base_construction - name = "construction holo-drone" - move_on_shuttle = 1 //Allows any curious crew to watch the base after it leaves. (This is safe as the base cannot be modified once it leaves) - icon = 'icons/obj/mining.dmi' - icon_state = "construction_drone" - var/area/starting_area - -/mob/camera/ai_eye/remote/base_construction/Initialize() - . = ..() - starting_area = get_area(loc) - -/mob/camera/ai_eye/remote/base_construction/setLoc(t) - var/area/curr_area = get_area(t) - if(curr_area == starting_area || istype(curr_area, /area/shuttle/auxiliary_base)) - return ..() - //While players are only allowed to build in the base area, but consoles starting outside the base can move into the base area to begin work. - - -/mob/camera/ai_eye/remote/base_construction/relaymove(mob/living/user, direction) - dir = direction //This camera eye is visible as a drone, and needs to keep the dir updated - return ..() - - -/obj/item/construction/rcd/internal //Base console's internal RCD. Roundstart consoles are filled, rebuilt cosoles start empty. - name = "internal RCD" - max_matter = 600 //Bigger container and faster speeds due to being specialized and stationary. - no_ammo_message = "Internal matter exhausted. Please add additional materials." - delay_mod = 0.5 - -/obj/machinery/computer/camera_advanced/base_construction - name = "base construction console" - desc = "An industrial computer integrated with a camera-assisted rapid construction drone." - networks = list("ss13") - var/obj/item/construction/rcd/internal/RCD //Internal RCD. The computer passes user commands to this in order to avoid massive copypaste. - circuit = /obj/item/circuitboard/computer/base_construction - off_action = new/datum/action/innate/camera_off/base_construction - jump_action = null - var/datum/action/innate/aux_base/switch_mode/switch_mode_action = new //Action for switching the RCD's build modes - var/datum/action/innate/aux_base/build/build_action = new //Action for using the RCD - var/datum/action/innate/aux_base/airlock_type/airlock_mode_action = new //Action for setting the airlock type - var/datum/action/innate/aux_base/window_type/window_action = new //Action for setting the window type - var/datum/action/innate/aux_base/place_fan/fan_action = new //Action for spawning fans - var/fans_remaining = 0 //Number of fans in stock. - var/datum/action/innate/aux_base/install_turret/turret_action = new //Action for spawning turrets - var/turret_stock = 0 //Turrets in stock - var/obj/machinery/computer/auxiliary_base/found_aux_console //Tracker for the Aux base console, so the eye can always find it. - - icon_screen = "mining" - icon_keyboard = "rd_key" - - light_color = LIGHT_COLOR_PINK - -/obj/machinery/computer/camera_advanced/base_construction/Initialize() - . = ..() - RCD = new(src) - -/obj/machinery/computer/camera_advanced/base_construction/Initialize(mapload) - . = ..() - if(mapload) //Map spawned consoles have a filled RCD and stocked special structures - RCD.matter = RCD.max_matter - fans_remaining = 4 - turret_stock = 4 - -/obj/machinery/computer/camera_advanced/base_construction/CreateEye() - - var/spawn_spot - for(var/obj/machinery/computer/auxiliary_base/ABC in GLOB.machines) - if(istype(get_area(ABC), /area/shuttle/auxiliary_base)) - found_aux_console = ABC - break - - if(found_aux_console) - spawn_spot = found_aux_console - else - spawn_spot = src - - - eyeobj = new /mob/camera/ai_eye/remote/base_construction(get_turf(spawn_spot)) - eyeobj.origin = src - - -/obj/machinery/computer/camera_advanced/base_construction/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/rcd_ammo) || istype(W, /obj/item/stack/sheet)) - RCD.attackby(W, user, params) //If trying to feed the console more materials, pass it along to the RCD. - else - return ..() - -/obj/machinery/computer/camera_advanced/base_construction/Destroy() - qdel(RCD) - return ..() - -/obj/machinery/computer/camera_advanced/base_construction/GrantActions(mob/living/user) - ..() - - if(switch_mode_action) - switch_mode_action.target = src - switch_mode_action.Grant(user) - actions += switch_mode_action - - if(build_action) - build_action.target = src - build_action.Grant(user) - actions += build_action - - if(airlock_mode_action) - airlock_mode_action.target = src - airlock_mode_action.Grant(user) - actions += airlock_mode_action - - if(window_action) - window_action.target = src - window_action.Grant(user) - actions += window_action - - if(fan_action) - fan_action.target = src - fan_action.Grant(user) - actions += fan_action - - if(turret_action) - turret_action.target = src - turret_action.Grant(user) - actions += turret_action - - eyeobj.invisibility = 0 //When the eye is in use, make it visible to players so they know when someone is building. - -/obj/machinery/computer/camera_advanced/base_construction/remove_eye_control(mob/living/user) - ..() - eyeobj.invisibility = INVISIBILITY_MAXIMUM //Hide the eye when not in use. - -/datum/action/innate/aux_base //Parent aux base action - icon_icon = 'icons/mob/actions/actions_construction.dmi' - var/mob/living/C //Mob using the action - var/mob/camera/ai_eye/remote/base_construction/remote_eye //Console's eye mob - var/obj/machinery/computer/camera_advanced/base_construction/B //Console itself - -/datum/action/innate/aux_base/Activate() - if(!target) - return TRUE - C = owner - remote_eye = C.remote_control - B = target - if(!B.RCD) //The console must always have an RCD. - B.RCD = new /obj/item/construction/rcd/internal(src) //If the RCD is lost somehow, make a new (empty) one! - -/datum/action/innate/aux_base/proc/check_spot() -//Check a loction to see if it is inside the aux base at the station. Camera visbility checks omitted so as to not hinder construction. - var/turf/build_target = get_turf(remote_eye) - var/area/build_area = get_area(build_target) - - if(!istype(build_area, /area/shuttle/auxiliary_base)) - to_chat(owner, "You can only build within the mining base!") - return FALSE - - if(!is_station_level(build_target.z)) - to_chat(owner, "The mining base has launched and can no longer be modified.") - return FALSE - - return TRUE - -/datum/action/innate/camera_off/base_construction - name = "Log out" - -//*******************FUNCTIONS******************* - -/datum/action/innate/aux_base/build - name = "Build" - button_icon_state = "build" - -/datum/action/innate/aux_base/build/Activate() - if(..()) - return - - if(!check_spot()) - return - - var/turf/target_turf = get_turf(remote_eye) - var/atom/rcd_target = target_turf - - //Find airlocks and other shite - for(var/obj/S in target_turf) - if(LAZYLEN(S.rcd_vals(owner,B.RCD))) - rcd_target = S //If we don't break out of this loop we'll get the last placed thing - - owner.changeNext_move(CLICK_CD_RANGE) - B.RCD.afterattack(rcd_target, owner, TRUE) //Activate the RCD and force it to work remotely! - playsound(target_turf, 'sound/items/deconstruct.ogg', 60, TRUE) - -/datum/action/innate/aux_base/switch_mode - name = "Switch Mode" - button_icon_state = "builder_mode" - -/datum/action/innate/aux_base/switch_mode/Activate() - if(..()) - return - - var/list/buildlist = list("Walls and Floors" = 1,"Airlocks" = 2,"Deconstruction" = 3,"Windows and Grilles" = 4) - var/buildmode = input("Set construction mode.", "Base Console", null) in buildlist - B.RCD.mode = buildlist[buildmode] - to_chat(owner, "Build mode is now [buildmode].") - -/datum/action/innate/aux_base/airlock_type - name = "Select Airlock Type" - button_icon_state = "airlock_select" - -/datum/action/innate/aux_base/airlock_type/Activate() - if(..()) - return - - B.RCD.change_airlock_setting() - - -/datum/action/innate/aux_base/window_type - name = "Select Window Glass" - button_icon_state = "window_select" - -/datum/action/innate/aux_base/window_type/Activate() - if(..()) - return - B.RCD.toggle_window_glass() - -/datum/action/innate/aux_base/place_fan - name = "Place Tiny Fan" - button_icon_state = "build_fan" - -/datum/action/innate/aux_base/place_fan/Activate() - if(..()) - return - - var/turf/fan_turf = get_turf(remote_eye) - - if(!B.fans_remaining) - to_chat(owner, "[B] is out of fans!") - return - - if(!check_spot()) - return - - if(fan_turf.density) - to_chat(owner, "Fans may only be placed on a floor.") - return - - new /obj/structure/fans/tiny(fan_turf) - B.fans_remaining-- - to_chat(owner, "Tiny fan placed. [B.fans_remaining] remaining.") - playsound(fan_turf, 'sound/machines/click.ogg', 50, TRUE) - -/datum/action/innate/aux_base/install_turret - name = "Install Plasma Anti-Wildlife Turret" - button_icon_state = "build_turret" - -/datum/action/innate/aux_base/install_turret/Activate() - if(..()) - return - - if(!check_spot()) - return - - if(!B.turret_stock) - to_chat(owner, "Unable to construct additional turrets.") - return - - var/turf/turret_turf = get_turf(remote_eye) - - if(turret_turf.is_blocked_turf()) - to_chat(owner, "Location is obstructed by something. Please clear the location and try again.") - return - - var/obj/machinery/porta_turret/aux_base/T = new /obj/machinery/porta_turret/aux_base(turret_turf) - if(B.found_aux_console) - B.found_aux_console.turrets += T //Add new turret to the console's control - - B.turret_stock-- - to_chat(owner, "Turret installation complete!") - playsound(turret_turf, 'sound/items/drill_use.ogg', 65, TRUE) diff --git a/tgstation.dme b/tgstation.dme index b03a47a0761..91b9fc19ae1 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1285,6 +1285,10 @@ #include "code\game\objects\structures\beds_chairs\chair.dm" #include "code\game\objects\structures\beds_chairs\pew.dm" #include "code\game\objects\structures\beds_chairs\sofa.dm" +#include "code\game\objects\structures\construction_consolse\construction_actions.dm" +#include "code\game\objects\structures\construction_consolse\construction_console.dm" +#include "code\game\objects\structures\construction_consolse\construction_console_aux.dm" +#include "code\game\objects\structures\construction_consolse\construction_console_centcom.dm" #include "code\game\objects\structures\crates_lockers\closets.dm" #include "code\game\objects\structures\crates_lockers\crates.dm" #include "code\game\objects\structures\crates_lockers\closets\bodybag.dm" @@ -2210,7 +2214,6 @@ #include "code\modules\mapping\space_management\zlevel_manager.dm" #include "code\modules\mining\abandoned_crates.dm" #include "code\modules\mining\aux_base.dm" -#include "code\modules\mining\aux_base_camera.dm" #include "code\modules\mining\fulton.dm" #include "code\modules\mining\machine_processing.dm" #include "code\modules\mining\machine_redemption.dm"