diff --git a/_maps/map_files/cyberiad/z2.dmm b/_maps/map_files/cyberiad/z2.dmm index e5706c55edc..e9363cdd8e7 100644 --- a/_maps/map_files/cyberiad/z2.dmm +++ b/_maps/map_files/cyberiad/z2.dmm @@ -206,12 +206,14 @@ "dX" = (/obj/structure/filingcabinet/filingcabinet,/turf/unsimulated/floor{dir = 5; icon_state = "carpetside"},/area/centcom/control) "dY" = (/turf/unsimulated/floor{dir = 1; icon_state = "carpet15-11"},/area/centcom/control) "dZ" = (/obj/structure/table/woodentable,/obj/item/weapon/paper_bin{pixel_y = 5},/obj/item/weapon/pen/multi,/turf/unsimulated/floor{dir = 9; icon_state = "carpetside"},/area/centcom/control) -"ea" = (/obj/machinery/computer/bsa_control,/turf/unsimulated/floor{dir = 5; icon_state = "carpetside"},/area/centcom/control) +"ea" = (/obj/machinery/computer/bsa_control/admin,/turf/unsimulated/floor{dir = 5; icon_state = "carpetside"},/area/centcom/control) "eb" = (/obj/structure/stool/bed/chair/office/dark{dir = 4},/turf/unsimulated/floor{dir = 8; icon_state = "carpet15-14"; tag = "icon-carpet (WEST)"},/area/centcom/control) "ec" = (/turf/unsimulated/floor{tag = "icon-warnplate (NORTHWEST)"; icon_state = "warnplate"; dir = 9},/area/centcom/control) "ed" = (/turf/unsimulated/floor{icon_state = "platingdmg1"},/area/prison/solitary) "ee" = (/turf/unsimulated/floor{icon_state = "floorscorched2"},/area/prison/solitary) -"ef" = (/obj/machinery/bsa/full/admin,/turf/unsimulated/floor{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/centcom/control) +"ef" = (/obj/machinery/bsa/full/admin/east,/turf/unsimulated/floor{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/centcom/control) +"eg" = (/turf/unsimulated/wall/fakeglass{dir = 1; icon_state = "fakewindows"; tag = "icon-fakewindows2 (NORTH)"},/area/centcom/control) +"eh" = (/turf/unsimulated/wall/fakeglass{dir = 7; icon_state = "fakewindows"; tag = "icon-fakewindows2 (NORTH)"},/area/centcom/control) "ej" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/wall{tag = "icon-iron12"; icon_state = "iron12"},/area/space) "ek" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/unsimulated/wall{tag = "icon-iron12"; icon_state = "iron12"},/area/space) "el" = (/turf/unsimulated/wall{tag = "icon-iron11"; icon_state = "iron11"},/area/space) @@ -1535,8 +1537,8 @@ aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXtatbtctdtdtesqsqsqsqsqsEsEmnsMsCmnsEsEsEsEsEsQsQsQsQtfsQsQtgsqsqsqdVaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNthtitititititititititjtktitititjtltmtntdtdtdsqsrssstsqtosEmnsMtpmnsEsEsEsEsutqsQsQsQtrsQsQtssqsqsqsqdVaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXtatttutdtdtdsqswsssssxsEsEsEsEsEsEsEsEsEsEsqsusususususususqsqdWdXsqsqsqsqsqsqsqsqsqsqsqsqsqdVaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNthtitititititititititvtktitititvtwtmtntdtdtdsqsqsqsqsqsqsqtxsqsqsqsqsEsEtysqtztztztztztztzsudZdYebeasueceVeVeVeVeVefeVeVeVeUfFaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXtatttutdtdtAsqtBtCtDsqtEtFtFtFtFtGsqsEsEtHsqtztztztztztztzsufbfatLfcsufdfEfEfEfEfEfEfEfEfEfsfFaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNthtitititititititititvtktitititvtwtmtntdtdtdsqsqsqsqsqsqsqtxsqsqsqsqsEsEtysqtztztztztztztzsudZdYebeaegeceVeVeVeVeVefeVeVeVeUfFaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXtatttutdtdtAsqtBtCtDsqtEtFtFtFtFtGsqsEsEtHsqtztztztztztztzsufbfatLfcehfdfEfEfEfEfEfEfEfEfEfsfFaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNthtitititititititititItktitititItJtmtntdtdtdsqtKtLtMtNtFtFtFtFtFtOsqsusxsusqsusususususususqsqfLsqsqsqsqsqsqsqsqsqsqsqsqsqsqfXaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXtatttutdtdtdsqsqsususqsqsqsususususqtQtRtStTtTtTtTtTtTtTtTtTuEtRtZsqfXaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNthtitititititititititVtktitititVtWtXtYtdtdtdsqtztztztztztztztztztzsqtQtRtRtRtRtRtRtRtRtRtRtRtRtRtZsqaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index e160f5327b6..1da36cd3bda 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -300,4 +300,4 @@ #define OOC_COOLDOWN 5 // The number of station goals generated each round. -#define STATION_GOAL_BUDGET 3 \ No newline at end of file +#define STATION_GOAL_BUDGET 1 \ No newline at end of file diff --git a/code/datums/beam.dm b/code/datums/beam.dm index 1b48dd37560..4c0ebba46b1 100644 --- a/code/datums/beam.dm +++ b/code/datums/beam.dm @@ -15,7 +15,6 @@ var/static_beam = 0 var/beam_type = /obj/effect/ebeam //must be subtype - /datum/beam/New(beam_origin,beam_target,beam_icon='icons/effects/beam.dmi',beam_icon_state="b_beam",time=50,maxdistance=10,btype = /obj/effect/ebeam) endtime = world.time+time origin = beam_origin @@ -30,7 +29,6 @@ icon_state = beam_icon_state beam_type = btype - /datum/beam/proc/Start() Draw() while(!finished && origin && target && world.time < endtime && get_dist(origin,target)\The [user] does something \the [src], causing the screen to flash!",\ "You cause the screen to flash as you gain full control.",\ diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm index 0c09bc5f2c5..42f89a01f54 100644 --- a/code/game/machinery/computer/buildandrepair.dm +++ b/code/game/machinery/computer/buildandrepair.dm @@ -30,7 +30,12 @@ var/frame_desc = null var/contain_parts = 1 - +/obj/item/weapon/circuitboard/computer + board_type = "computer" + +/obj/item/weapon/circuitboard/machine + board_type = "machine" + /obj/item/weapon/circuitboard/message_monitor name = "Circuit board (Message Monitor)" build_path = /obj/machinery/computer/message_monitor diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index ed5e3d2fb00..3cf2600aa48 100644 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -53,6 +53,24 @@ to_chat(user, "Access denied.") return COMM_AUTHENTICATION_NONE +/obj/machinery/computer/communications/proc/change_security_level(var/new_level) + tmp_alertlevel = new_level + var/old_level = security_level + if(!tmp_alertlevel) tmp_alertlevel = SEC_LEVEL_GREEN + if(tmp_alertlevel < SEC_LEVEL_GREEN) tmp_alertlevel = SEC_LEVEL_GREEN + if(tmp_alertlevel > SEC_LEVEL_BLUE) tmp_alertlevel = SEC_LEVEL_BLUE //Cannot engage delta with this + set_security_level(tmp_alertlevel) + if(security_level != old_level) + //Only notify the admins if an actual change happened + log_game("[key_name(usr)] has changed the security level to [get_security_level()].") + message_admins("[key_name_admin(usr)] has changed the security level to [get_security_level()].") + switch(security_level) + if(SEC_LEVEL_GREEN) + feedback_inc("alert_comms_green",1) + if(SEC_LEVEL_BLUE) + feedback_inc("alert_comms_blue",1) + tmp_alertlevel = 0 + /obj/machinery/computer/communications/Topic(href, href_list) if(..(href, href_list)) return 1 @@ -100,35 +118,25 @@ if("newalertlevel") if(isAI(usr) || isrobot(usr)) to_chat(usr, "Firewalls prevent you from changing the alert level.") - nanomanager.update_uis(src) return 1 - tmp_alertlevel = text2num(href_list["level"]) + else if(usr.can_admin_interact()) + change_security_level(text2num(href_list["level"])) + return 1 + else if(!ishuman(usr)) + to_chat(usr, "Security measures prevent you from changing the alert level.") + return 1 + var/mob/living/carbon/human/L = usr var/obj/item/card = L.get_active_hand() - var/obj/item/weapon/card/id/I = (card && card.GetID())||L.wear_id||L.wear_pda + var/obj/item/weapon/card/id/I = (card && card.GetID()) || L.wear_id || L.wear_pda if(istype(I, /obj/item/device/pda)) var/obj/item/device/pda/pda = I I = pda.id if(I && istype(I)) if(access_captain in I.access) - var/old_level = security_level - if(!tmp_alertlevel) tmp_alertlevel = SEC_LEVEL_GREEN - if(tmp_alertlevel < SEC_LEVEL_GREEN) tmp_alertlevel = SEC_LEVEL_GREEN - if(tmp_alertlevel > SEC_LEVEL_BLUE) tmp_alertlevel = SEC_LEVEL_BLUE //Cannot engage delta with this - set_security_level(tmp_alertlevel) - if(security_level != old_level) - //Only notify the admins if an actual change happened - log_game("[key_name(usr)] has changed the security level to [get_security_level()].") - message_admins("[key_name_admin(usr)] has changed the security level to [get_security_level()].") - switch(security_level) - if(SEC_LEVEL_GREEN) - feedback_inc("alert_comms_green",1) - if(SEC_LEVEL_BLUE) - feedback_inc("alert_comms_blue",1) - tmp_alertlevel = 0 + change_security_level(text2num(href_list["level"])) else to_chat(usr, "You are not authorized to do this.") - tmp_alertlevel = 0 setMenuState(usr,COMM_SCREEN_MAIN) else to_chat(usr, "You need to swipe your ID.") diff --git a/code/modules/station_goals/bsa.dm b/code/modules/station_goals/bsa.dm index 1c886ce71a3..5ea24bbd864 100644 --- a/code/modules/station_goals/bsa.dm +++ b/code/modules/station_goals/bsa.dm @@ -27,7 +27,7 @@ return FALSE /obj/machinery/bsa - icon = 'icons/obj/machines/particle_accelerator.dmi' + icon = 'icons/obj/machines/particle_accelerator3.dmi' density = 1 anchored = 1 @@ -125,18 +125,38 @@ name = "Bluespace Artillery" desc = "Long range bluespace artillery." icon = 'icons/obj/lavaland/cannon.dmi' - icon_state = "cannon_east" + icon_state = "cannon_west" + + var/obj/machinery/computer/bsa_control/controller + var/cannon_direction = WEST var/static/image/top_layer = null var/ex_power = 3 var/power_used_per_shot = 2000000 //enough to kil standard apc - todo : make this use wires instead and scale explosion power with it - var/ready + var/last_fire_time = 0 // The time at which the gun was last fired + var/reload_cooldown = 600 // The gun's cooldown + pixel_y = -32 pixel_x = -192 bound_width = 352 bound_x = -192 +/obj/machinery/bsa/full/Destroy() + if(controller && controller.cannon == src) + controller.cannon = null + controller = null + return ..() + /obj/machinery/bsa/full/admin power_used_per_shot = 0 + reload_cooldown = 100 + +/obj/machinery/bsa/full/east + icon_state = "cannon_east" + cannon_direction = EAST + +/obj/machinery/bsa/full/admin/east + icon_state = "cannon_east" + cannon_direction = EAST /obj/machinery/bsa/full/proc/get_front_turf() switch(dir) @@ -162,8 +182,12 @@ return locate(world.maxx,y,z) return get_turf(src) -/obj/machinery/bsa/full/New(loc,cannon_direction = WEST) +/obj/machinery/bsa/full/New(loc, direction) ..() + + if(direction) + cannon_direction = direction + switch(cannon_direction) if(WEST) dir = WEST @@ -183,21 +207,19 @@ var/turf/point = get_front_turf() for(var/turf/T in getline(get_step(point,dir),get_target_turf())) T.ex_act(1) - point.Beam(get_target_turf(),icon_state="bsa_beam",time=50,maxdistance = world.maxx) //ZZZAP - + for(var/atom/A in T) + A.ex_act(1) + point.Beam(get_target_turf(), icon_state = "bsa_beam", time = 50, maxdistance = world.maxx, beam_type = /obj/effect/ebeam/deadly) //ZZZAP + playsound(src, 'sound/machines/bsa_fire.ogg', 70, 1) + message_admins("[key_name_admin(user)] has launched an artillery strike.") explosion(bullseye,ex_power,ex_power*2,ex_power*4) reload() /obj/machinery/bsa/full/proc/reload() - ready = FALSE use_power(power_used_per_shot) - spawn(600) - ready_cannon() - -/obj/machinery/bsa/full/proc/ready_cannon() - ready = TRUE + last_fire_time = world.time / 10 /obj/structure/filler name = "big machinery part" @@ -245,12 +267,19 @@ var/target use_power = 0 circuit = /obj/item/weapon/circuitboard/computer/bsa_control - icon_screen = "accelerator" - icon_keyboard = "accelerator_key" - icon_state = "computer-wires" + icon = 'icons/obj/machines/particle_accelerator3.dmi' + icon_state = "control_boxp" + layer = 3.1 + var/area_aim = FALSE //should also show areas for targeting var/target_all_areas = FALSE //allows all areas (including admin areas) to be targetted +/obj/machinery/computer/bsa_control/Destroy() + if(cannon && cannon.controller == src) + cannon.controller = null + cannon = null + return ..() + /obj/machinery/computer/bsa_control/admin area_aim = TRUE target_all_areas = TRUE @@ -268,11 +297,24 @@ /obj/machinery/computer/bsa_control/ui_data(mob/user, ui_key = "main", datum/topic_state/state = physical_state) var/list/data = list() - data["ready"] = cannon ? cannon.ready : FALSE data["connected"] = cannon data["notice"] = notice if(target) data["target"] = get_target_name() + + if(cannon) + var/reload_cooldown = cannon.reload_cooldown + var/last_fire_time = cannon.last_fire_time + var/time_to_wait = max(0, round(reload_cooldown - ((world.time / 10) - last_fire_time))) + var/minutes = max(0, round(time_to_wait / 60)) + var/seconds = max(0, time_to_wait - (60 * minutes)) + + data["reloadtime_mins"] = minutes + data["reloadtime_secs"] = (seconds < 10) ? "0[seconds]" : seconds + data["ready"] = minutes == 0 && seconds == 0 + else + data["ready"] = FALSE + return data /obj/machinery/computer/bsa_control/Topic(href, href_list) @@ -316,15 +358,18 @@ return get_turf(target) /obj/machinery/computer/bsa_control/proc/fire(mob/user) + if(!cannon || !target) + return if(cannon.stat) notice = "Cannon unpowered!" return notice = null cannon.fire(user, get_impact_turf()) -/obj/machinery/computer/bsa_control/proc/deploy(force=FALSE) +/obj/machinery/computer/bsa_control/proc/deploy() var/obj/machinery/bsa/full/prebuilt = locate() in range(7) //In case of adminspawn if(prebuilt) + prebuilt.controller = src return prebuilt var/obj/machinery/bsa/middle/centerpiece = locate() in range(7) @@ -338,7 +383,8 @@ var/datum/effect/system/harmless_smoke_spread/s = new /datum/effect/system/harmless_smoke_spread() s.set_up(4, 0, get_turf(centerpiece)) s.start() - var/obj/machinery/bsa/full/cannon = new(get_turf(centerpiece),cannon_direction=centerpiece.get_cannon_direction()) + var/obj/machinery/bsa/full/cannon = new(get_turf(centerpiece),centerpiece.get_cannon_direction()) + cannon.controller = src qdel(centerpiece.front) qdel(centerpiece.back) qdel(centerpiece) diff --git a/code/modules/station_goals/dna_vault.dm b/code/modules/station_goals/dna_vault.dm index 38855aece3c..c920a8b0247 100644 --- a/code/modules/station_goals/dna_vault.dm +++ b/code/modules/station_goals/dna_vault.dm @@ -7,7 +7,7 @@ #define VAULT_XRAY "X-Ray Vision" #define VAULT_TELEKINESIS "Telekinesis" #define VAULT_PSYCHIC "Psychic Powers" -#define VAULT_SPEED "Speed" +#define VAULT_SPEED "Speediness" /datum/station_goal/dna_vault name = "DNA Vault" @@ -18,7 +18,7 @@ /datum/station_goal/dna_vault/New() ..() animal_count = rand(15,20) //might be too few given ~15 roundstart stationside ones - human_count = rand(round(0.75 * ticker.mode.num_players()) , ticker.mode.num_players()) // 75%+ roundstart population. + human_count = rand(round(0.75 * ticker.mode.num_players_started()), ticker.mode.num_players_started()) // 75%+ roundstart population. var/non_standard_plants = non_standard_plants_count() plant_count = rand(round(0.5 * non_standard_plants),round(0.7 * non_standard_plants)) @@ -97,7 +97,7 @@ var/list/non_simple_animals = typecacheof(list(/mob/living/carbon/human/monkey,/ if(isanimal(target)) var/mob/living/simple_animal/A = target if(!A.healable)//simple approximation of being animal not a robot or similar - to_chat(user, "No compatibile DNA detected") + to_chat(user, "No compatible DNA detected") return if(animals[target.type]) to_chat(user, "Animal data already present in local storage.") @@ -183,7 +183,8 @@ var/list/non_simple_animals = typecacheof(list(/mob/living/carbon/human/monkey,/ /obj/machinery/dna_vault/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) ui = nanomanager.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) - ui = new(user, src, ui_key, "dna_vault.tmpl", name, 350, 400) + roll_powers(user) + ui = new(user, src, ui_key, "dna_vault.tmpl", name, 550, 400) ui.open() /obj/machinery/dna_vault/proc/roll_powers(mob/user) @@ -251,14 +252,16 @@ var/list/non_simple_animals = typecacheof(list(/mob/living/carbon/human/monkey,/ /obj/machinery/dna_vault/proc/upgrade(mob/living/carbon/human/H, upgrade_type) if(!(upgrade_type in power_lottery[H])) return + if(!completed) + return if(!H.ignore_gene_stability) to_chat(H, "[src] stabilizes your genes, granting you the ability to have multiple powers.") H.ignore_gene_stability = 1 switch(upgrade_type) if(VAULT_SPACEIMMUNE) - to_chat(H, "You suddenly don't feel the need to breathe anymore. Your body also feels very warm.") + to_chat(H, "You suddenly don't feel the need to breathe anymore. You also don't feel any cold anymore.") grant_power(H, NOBREATHBLOCK, NO_BREATH) - grant_power(H, COLDBLOCK, RESIST_COLD) + grant_power(H, FIREBLOCK, RESIST_COLD) if(VAULT_XRAY) to_chat(H, "You can suddenly see through walls.") grant_power(H, XRAYBLOCK, XRAY) diff --git a/code/modules/station_goals/shield.dm b/code/modules/station_goals/shield.dm index f39f731e9c4..fae4b3cf4bd 100644 --- a/code/modules/station_goals/shield.dm +++ b/code/modules/station_goals/shield.dm @@ -29,12 +29,12 @@ /datum/station_goal/proc/get_coverage() var/list/coverage = list() for(var/obj/machinery/satellite/meteor_shield/A in machines) - if(!A.active || is_station_level(A.z)) + if(!A.active || !is_station_level(A.z)) continue coverage |= view(A.kill_range, A) return coverage.len -/obj/item/weapon/circuitboard/machine/computer/sat_control +/obj/item/weapon/circuitboard/computer/sat_control name = "Satellite Network Control (Computer Board)" build_path = /obj/machinery/computer/sat_control origin_tech = "engineering=3" @@ -42,7 +42,7 @@ /obj/machinery/computer/sat_control name = "Satellite control" desc = "Used to control the satellite network." - circuit = /obj/item/weapon/circuitboard/machine/computer/sat_control + circuit = /obj/item/weapon/circuitboard/computer/sat_control icon_screen = "accelerator" icon_keyboard = "accelerator_key" var/notice @@ -55,7 +55,7 @@ /obj/machinery/computer/sat_control/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) ui = nanomanager.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) - ui = new(user, src, ui_key, "sat_control.tmpl", name, 400, 305) + ui = new(user, src, ui_key, "sat_control.tmpl", name, 475, 400) ui.open() /obj/machinery/computer/sat_control/Topic(href, href_list) @@ -88,8 +88,9 @@ data["meteor_shield"] = 1 data["meteor_shield_coverage"] = G.get_coverage() data["meteor_shield_coverage_max"] = G.coverage_goal + data["meteor_shield_coverage_percentage"] = (G.get_coverage() / G.coverage_goal) * 100 return data - + /obj/machinery/satellite name = "Defunct Satellite" desc = "" @@ -105,6 +106,11 @@ /obj/machinery/satellite/New() ..() id = gid++ + +/obj/machinery/satellite/attack_hand(mob/user) + if(..()) + return 1 + interact(user) /obj/machinery/satellite/interact(mob/user) toggle(user) @@ -113,7 +119,7 @@ if(!active && !isinspace()) if(user) to_chat(user, "You can only active the [src] in space.") - return FALSE + return TRUE if(user) to_chat(user, "You [active ? "deactivate": "activate"] the [src]") active = !active @@ -153,15 +159,15 @@ for(var/obj/effect/meteor/M in meteor_list) if(M.z != z) continue - if(get_dist(M,src) > kill_range) + if(get_dist(M, src) > kill_range) continue if(!emagged && space_los(M)) - Beam(get_turf(M), icon_state="sat_beam", time=5, maxdistance=kill_range) + Beam(get_turf(M), icon_state = "sat_beam", time = 5, maxdistance = kill_range) qdel(M) /obj/machinery/satellite/meteor_shield/toggle(user) - if(!..(user)) - return FALSE + if(..(user)) + return TRUE if(emagged) if(active) change_meteor_chance(2) @@ -179,8 +185,9 @@ if(active && emagged) change_meteor_chance(0.5) -/obj/machinery/satellite/meteor_shield/emag_act() +/obj/machinery/satellite/meteor_shield/emag_act(mob/user) if(!emagged) + to_chat(user, "You override the shield's circuits, causing it to attract meteors instead of destroying them.") emagged = 1 if(active) change_meteor_chance(2) diff --git a/icons/effects/beam.dmi b/icons/effects/beam.dmi index c64e2336449..b7bc119cfbe 100644 Binary files a/icons/effects/beam.dmi and b/icons/effects/beam.dmi differ diff --git a/icons/obj/machines/particle_accelerator3.dmi b/icons/obj/machines/particle_accelerator3.dmi new file mode 100644 index 00000000000..c601b8d1b6a Binary files /dev/null and b/icons/obj/machines/particle_accelerator3.dmi differ diff --git a/nano/templates/bsa.tmpl b/nano/templates/bsa.tmpl new file mode 100644 index 00000000000..a0e8a60deb5 --- /dev/null +++ b/nano/templates/bsa.tmpl @@ -0,0 +1,51 @@ + +{{if data.notice}} +
{{:data.notice}}
+{{/if}} +

Bluespace Artillery Control

+
+
+ Target: +
+
+ {{:helper.link(data.target ? data.target : "None", 'crosshairs', {'recalibrate' : 1})}} +
+
+
+
+ Reload Cooldown: +
+
+ {{if data.ready}} + Ready + {{else data.reloadtime_mins || data.reloadtime_secs}} + {{:data.reloadtime_mins}}:{{:data.reloadtime_secs}} + {{else}} + No cannon connected! + {{/if}} +
+
+
+
+ Controls: +
+
+ {{:helper.link('FIRE!', 'warning', {'fire' : 1}, data.ready && data.target ? null : 'disabled')}} +
+
+{{if !data.connected}} +
+
+ Maintenance: +
+
+ {{:helper.link('Complete Deployment', 'wrench', {'build' : 1})}} +
+
+{{else}} +
+Deployment of weapon authorized by Nanotrasen Naval Command. Remember, friendly fire is grounds for termination of your contract and life. +{{/if}} \ No newline at end of file diff --git a/nano/templates/dna_vault.tmpl b/nano/templates/dna_vault.tmpl new file mode 100644 index 00000000000..a5d631414d1 --- /dev/null +++ b/nano/templates/dna_vault.tmpl @@ -0,0 +1,49 @@ + +

DNA Vault Database

+
+
+ Human DNA: +
+
+ {{:helper.displayBar(data.dna, 0, data.dna_max, data.dna >= data.dna_max ? 'good' : 'average')}} +
+ {{:data.dna}}/{{:data.dna_max}} Samples +
+
+
+
+
+ Plant Data: +
+
+ {{:helper.displayBar(data.plants, 0, data.plants_max, data.plants >= data.plants_max ? 'good' : 'average')}} +
+ {{:data.plants}}/{{:data.plants_max}} Samples +
+
+
+
+
+ Animal Data: +
+
+ {{:helper.displayBar(data.animals, 0, data.animals_max, data.animals >= data.animals_max ? 'good' : 'average')}} +
+ {{:data.animals}}/{{:data.animals_max}} Samples +
+
+
+{{if data.completed && !data.used}} +
+
+ Applicable gene therapy treatments: +
+
+ {{:helper.link(data.choiceA, null, {'gene' : 1, 'choice' : data.choiceA})}} + {{:helper.link(data.choiceB, null, {'gene' : 1, 'choice' : data.choiceB})}} +
+
+{{/if}} \ No newline at end of file diff --git a/nano/templates/sat_control.tmpl b/nano/templates/sat_control.tmpl new file mode 100644 index 00000000000..a3b5ad40cb1 --- /dev/null +++ b/nano/templates/sat_control.tmpl @@ -0,0 +1,32 @@ + +{{if data.notice}} +
{{:data.notice}}
+{{/if}} +

Satellite Network Control

+{{for data.satellites}} +
+
+ #{{:value.id}} - {{:value.mode}} +
+
+ + {{:helper.link(value.active ? 'Deactivate' : 'Activate', null, {'toggle' : 1, 'id' : value.id})}} +
+
+{{/for}} +{{if data.meteor_shield}} +
+
+ Station Shield Coverage: +
+
+ {{:helper.displayBar(data.meteor_shield_coverage, 0, data.meteor_shield_coverage_max, data.meteor_shield_coverage_percentage >= 100 ? 'good' : 'average')}} +
+ {{:data.meteor_shield_coverage_percentage}}% +
+
+
+{{/if}} \ No newline at end of file diff --git a/sound/machines/bsa_fire.ogg b/sound/machines/bsa_fire.ogg new file mode 100644 index 00000000000..19244ff69d6 Binary files /dev/null and b/sound/machines/bsa_fire.ogg differ