///Mining Base//// #define BAD_ZLEVEL 1 #define BAD_AREA 2 #define ZONE_SET 3 /area/shuttle/auxillary_base name = "Auxillary Base" luminosity = 0 //Lighting gets lost when it lands anyway /obj/machinery/computer/auxillary_base name = "auxillary base management console" icon = 'icons/obj/terminals.dmi' icon_state = "dorm_available" var/shuttleId = "colony_drop" desc = "Allows a deployable expedition base to be dropped from the station to a designated mining location. It can also \ interface with the mining shuttle at the landing site if a mobile beacon is also deployed." var/launch_warning = TRUE var/list/turrets = list() //List of connected turrets req_one_access = list(access_cargo, access_construction, access_heads, access_research) var/possible_destinations clockwork = TRUE var/obj/item/device/gps/internal/base/locator circuit = /obj/item/weapon/circuitboard/computer/auxillary_base /obj/machinery/computer/auxillary_base/New(location, obj/item/weapon/circuitboard/computer/shuttle/C) ..() locator = new /obj/item/device/gps/internal/base(src) /obj/machinery/computer/auxillary_base/attack_hand(mob/user) if(..(user)) return add_fingerprint(usr) var/list/options = params2list(possible_destinations) var/obj/docking_port/mobile/M = SSshuttle.getShuttle(shuttleId) var/dat = "[z == ZLEVEL_STATION ? "Docking clamps engaged. Standing by." : "Mining Shuttle Uplink: [M ? M.getStatusText() : "*OFFLINE*"]"]
" if(M) var/destination_found for(var/obj/docking_port/stationary/S in SSshuttle.stationary) if(!options.Find(S.id)) continue if(!M.check_dock(S)) continue destination_found = 1 dat += "Send to [S.name]
" if(!destination_found && z == ZLEVEL_STATION) //Only available if miners are lazy and did not set an LZ using the remote. dat += "Prepare for blind drop? (Dangerous)
" if(LAZYLEN(turrets)) dat += "
Perimeter Defense System: Enable All / Disable All
\ Units connected: [LAZYLEN(turrets)]
\ Unit | Condition | Status | Direction | Distance
" for(var/PDT in turrets) var/obj/machinery/porta_turret/aux_base/T = PDT var/integrity = max((T.obj_integrity-T.integrity_failure)/(T.max_integrity-T.integrity_failure)*100, 0) var/status if(T.stat & BROKEN) status = "ERROR" else if(!T.on) status = "Disabled" else if(T.raised) status = "Firing" else status = "All Clear" dat += "[T.name] | [integrity]% | [status] | [dir2text(get_dir(src, T))] | [get_dist(src, T)]m Toggle Power
" dat += "Close" var/datum/browser/popup = new(user, "computer", "base management", 550, 300) //width, height popup.set_content("
[dat]
") popup.set_title_image(usr.browse_rsc_icon(src.icon, src.icon_state)) popup.open() /obj/machinery/computer/auxillary_base/Topic(href, href_list) if(..()) return usr.set_machine(src) add_fingerprint(usr) if(!allowed(usr)) usr << "Access denied." return if(href_list["move"]) if(z != ZLEVEL_STATION && shuttleId == "colony_drop") usr << "You can't move the base again!" return var/shuttle_error = SSshuttle.moveShuttle(shuttleId, href_list["move"], 1) if(launch_warning) say("Launch sequence activated! Prepare for drop!!") playsound(loc, 'sound/machines/warning-buzzer.ogg', 70, 0) launch_warning = FALSE else if(!shuttle_error) say("Shuttle request uploaded. Please stand away from the doors.") else say("Shuttle interface failed.") if(href_list["random"] && !possible_destinations) usr.changeNext_move(CLICK_CD_RAPID) //Anti-spam var/turf/LZ = safepick(Z_TURFS(ZLEVEL_MINING)) //Pick a random mining Z-level turf if(!istype(LZ, /turf/closed/mineral) && !istype(LZ, /turf/open/floor/plating/asteroid)) //Find a suitable mining turf. Reduces chance of landing in a bad area usr << "Landing zone scan failed. Please try again." updateUsrDialog() return if(set_landing_zone(LZ, usr) != ZONE_SET) usr << "Landing zone unsuitable. Please recalculate." updateUsrDialog() return if(LAZYLEN(turrets)) if(href_list["turrets_power"]) for(var/obj/machinery/porta_turret/aux_base/T in turrets) if(href_list["turrets_power"] == "on") T.on = TRUE else T.on = FALSE if(href_list["single_turret_power"]) var/obj/machinery/porta_turret/aux_base/T = locate(href_list["single_turret_power"]) in turrets if(istype(T)) T.on = !T.on updateUsrDialog() /obj/machinery/computer/auxillary_base/onShuttleMove(turf/T1, rotation) ..() if(z == ZLEVEL_MINING) //Avoids double logging and landing on other Z-levels due to badminnery feedback_add_details("colonies_dropped", "[x]|[y]|[z]") //Number of times a base has been dropped! /obj/machinery/computer/auxillary_base/proc/set_mining_mode() if(z == ZLEVEL_MINING) //The console switches to controlling the mining shuttle once landed. req_one_access = list() shuttleId = "mining" //The base can only be dropped once, so this gives the console a new purpose. possible_destinations = "mining_home;mining_away;landing_zone_dock;mining_public" /obj/machinery/computer/auxillary_base/proc/set_landing_zone(turf/T, mob/user, var/no_restrictions) var/obj/docking_port/mobile/auxillary_base/base_dock = locate(/obj/docking_port/mobile/auxillary_base) in SSshuttle.mobile if(!base_dock) //Not all maps have an Aux base. This object is useless in that case. user << "This station is not equipped with an auxillary base. Please contact your Nanotrasen contractor." return if(!no_restrictions) if(T.z != ZLEVEL_MINING) return BAD_ZLEVEL var/colony_radius = max(base_dock.width, base_dock.height)*0.5 var/list/area_counter = get_areas_in_range(colony_radius, T) if(area_counter.len > 1) //Avoid smashing ruins unless you are inside a really big one return BAD_AREA var/area/A = get_area(T) var/obj/docking_port/stationary/landing_zone = new /obj/docking_port/stationary(T) landing_zone.id = "colony_drop(\ref[src])" landing_zone.name = "Landing Zone ([T.x], [T.y])" landing_zone.dwidth = base_dock.dwidth landing_zone.dheight = base_dock.dheight landing_zone.width = base_dock.width landing_zone.height = base_dock.height landing_zone.setDir(base_dock.dir) landing_zone.turf_type = T.type landing_zone.area_type = A.type possible_destinations += "[landing_zone.id];" //Serves as a nice mechanic to people get ready for the launch. minor_announce("Auxiliary base landing zone coordinates locked in for [A]. Launch command now available!") user << "Landing zone set." return ZONE_SET /obj/item/device/assault_pod/mining name = "Landing Field Designator" icon_state = "gangtool-purple" item_state = "electronic" icon = 'icons/obj/device.dmi' desc = "Deploy to designate the landing zone of the auxillary base." w_class = WEIGHT_CLASS_SMALL shuttle_id = "colony_drop" var/setting = FALSE var/no_restrictions = FALSE //Badmin variable to let you drop the colony ANYWHERE. /obj/item/device/assault_pod/mining/attack_self(mob/living/user) if(setting) return user << "You begin setting the landing zone parameters..." setting = TRUE if(!do_after(user, 50, target = user)) //You get a few seconds to cancel if you do not want to drop there. setting = FALSE return var/turf/T = get_turf(user) var/obj/machinery/computer/auxillary_base/AB for (var/obj/machinery/computer/auxillary_base/A in machines) if(A.z == ZLEVEL_STATION) AB = A break if(!AB) user << "No auxillary base console detected." return switch(AB.set_landing_zone(T, user, no_restrictions)) if(BAD_ZLEVEL) user << "This uplink can only be used in a designed mining zone." if(BAD_AREA) user << "Unable to acquire a targeting lock. Find an area clear of stuctures or entirely within one." if(ZONE_SET) qdel(src) /obj/item/device/assault_pod/mining/unrestricted name = "omni-locational landing field designator" desc = "Allows the deployment of the mining base ANYWHERE. Use with caution." no_restrictions = TRUE /obj/docking_port/mobile/auxillary_base name = "auxillary base" id = "colony_drop" //Reminder to map-makers to set these values equal to the size of your base. dheight = 4 dwidth = 4 width = 9 height = 9 obj/docking_port/stationary/public_mining_dock name = "public mining base dock" id = "disabled" //The Aux Base has to leave before this can be used as a dock. //Should be checked on the map to ensure it matchs the mining shuttle dimensions. dwidth = 3 width = 7 height = 5 obj/docking_port/stationary/public_mining_dock/onShuttleMove() id = "mining_public" //It will not move with the base, but will become enabled as a docking point. return 0 /obj/structure/mining_shuttle_beacon name = "mining shuttle beacon" desc = "A bluespace beacon calibrated to mark a landing spot for the mining shuttle when deployed near the auxillary mining base." anchored = 0 density = 0 var/shuttle_ID = "landing_zone_dock" icon = 'icons/obj/objects.dmi' icon_state = "miningbeacon" var/obj/docking_port/stationary/Mport //Linked docking port for the mining shuttle pressure_resistance = 200 //So it does not get blown into lava. var/anti_spam_cd = 0 //The linking process might be a bit intensive, so this here to prevent over use. var/console_range = 15 //Wifi range of the beacon to find the aux base console /obj/structure/mining_shuttle_beacon/attack_hand(mob/user) if(anchored) user << "Landing zone already set." return if(anti_spam_cd) user << "[src] is currently recalibrating. Please wait." return anti_spam_cd = 1 addtimer(CALLBACK(src, .proc/clear_cooldown), 50) var/turf/landing_spot = get_turf(src) if(landing_spot.z != ZLEVEL_MINING) user << "This device is only to be used in a mining zone." return var/obj/machinery/computer/auxillary_base/aux_base_console for(var/obj/machinery/computer/auxillary_base/ABC in machines) if(get_dist(landing_spot, ABC) <= console_range) aux_base_console = ABC break if(!aux_base_console) //Needs to be near the base to serve as its dock and configure it to control the mining shuttle. user << "The auxillary base's console must be within [console_range] meters in order to interface." return //Mining shuttles may not be created equal, so we find the map's shuttle dock and size accordingly. for(var/S in SSshuttle.stationary) var/obj/docking_port/stationary/SM = S //SM is declared outside so it can be checked for null if(SM.id == "mining_home" || SM.id == "mining_away") var/area/A = get_area(landing_spot) Mport = new(landing_spot) Mport.id = "landing_zone_dock" Mport.name = "auxillary base landing site" Mport.dwidth = SM.dwidth Mport.dheight = SM.dheight Mport.width = SM.width Mport.height = SM.height Mport.setDir(dir) Mport.turf_type = landing_spot.type Mport.area_type = A.type break if(!Mport) user << "This station is not equipped with an approprite mining shuttle. Please contact Nanotrasen Support." return var/obj/docking_port/mobile/mining_shuttle var/list/landing_turfs = list() //List of turfs where the mining shuttle may land. for(var/S in SSshuttle.mobile) var/obj/docking_port/mobile/MS = S if(MS.id != "mining") continue mining_shuttle = MS landing_turfs = mining_shuttle.return_ordered_turfs(x,y,z,dir) break if(!mining_shuttle) //Not having a mining shuttle is a map issue user << "No mining shuttle signal detected. Please contact Nanotrasen Support." SSshuttle.stationary.Remove(Mport) qdel(Mport) return for(var/L in landing_turfs) //You land NEAR the base, not IN it. if(istype(get_area(L), /area/shuttle/auxillary_base)) user << "The mining shuttle must not land within the mining base itself." SSshuttle.stationary.Remove(Mport) qdel(Mport) return if(!mining_shuttle.canDock(Mport)) user << "Unable to secure a valid docking zone. Please try again in an open area near, but not within the aux. mining base." SSshuttle.stationary.Remove(Mport) qdel(Mport) return aux_base_console.set_mining_mode() //Lets the colony park the shuttle there, now that it has a dock. user << "Mining shuttle calibration successful! Shuttle interface available at base console." anchored = 1 //Locks in place to mark the landing zone. playsound(loc, 'sound/machines/ping.ogg', 50, 0) /obj/structure/mining_shuttle_beacon/proc/clear_cooldown() anti_spam_cd = 0 /obj/structure/mining_shuttle_beacon/attack_robot(mob/user) return attack_hand(user) //So borgies can help #undef BAD_ZLEVEL #undef BAD_AREA #undef ZONE_SET