diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm index 93f85dfa024..25dfdf2adf0 100644 --- a/code/game/area/Space Station 13 areas.dm +++ b/code/game/area/Space Station 13 areas.dm @@ -636,34 +636,44 @@ var/list/ghostteleportlocs = list() requires_power = 0 /area/xenos_station/southwest - name = "\improper Aft Port Solars" + name = "\improper Aft Port Solars Landing Area" icon_state = "southwest" requires_power = 0 /area/xenos_station/northwest - name = "\improper Fore Port Solars" + name = "\improper Fore Port Solars Landing Area" icon_state = "northwest" requires_power = 0 /area/xenos_station/northeast - name = "\improper Fore Starboard Solars" + name = "\improper Fore Starboard Solars Landing Area" icon_state = "northeast" requires_power = 0 /area/xenos_station/southeast - name = "\improper Aft Starboard Solars" + name = "\improper Aft Starboard Solars Landing Area" icon_state = "southeast" requires_power = 0 -/area/xenos_station/north +/area/xenos_station/east + name = "\improper East Landing Area" + icon_state = "east" + requires_power = 0 + +/area/xenos_station/west name = "\improper West Landing Area" + icon_state = "west" + requires_power = 0 + +/area/xenos_station/researchoutpost + name = "\improper Research Outpost Landing Area" icon_state = "north" requires_power = 0 -/area/xenos_station/south - name = "\improper East Landing Area" +/area/xenos_station/miningoutpost + name = "\improper Mining Outpost Landing Area" icon_state = "south" - requires_power = 0 + requires_power = 0 //PRISON /area/prison diff --git a/code/game/gamemodes/blob/blob.dm b/code/game/gamemodes/blob/blob.dm index 0ad19479f8c..ccbff9b326d 100644 --- a/code/game/gamemodes/blob/blob.dm +++ b/code/game/gamemodes/blob/blob.dm @@ -182,7 +182,7 @@ var/list/blob_nodes = list() return if (2) - command_alert("The biohazard has grown out of control and will soon reach critical mass. Activate the nuclear failsafe to mantain quarantine. The Nuclear Authentication Code is [get_nuke_code()] ", "Biohazard Alert") + command_alert("The biohazard has grown out of control and will soon reach critical mass. Activate the nuclear failsafe to maintain quarantine. The Nuclear Authentication Code is [get_nuke_code()] ", "Biohazard Alert") set_security_level("gamma") var/obj/machinery/door/airlock/vault/V = locate(/obj/machinery/door/airlock/vault) in world if(V && V.z == 1) diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm index a207fec53c2..8cfa326239b 100644 --- a/code/game/gamemodes/nuclear/nuclearbomb.dm +++ b/code/game/gamemodes/nuclear/nuclearbomb.dm @@ -29,6 +29,7 @@ var/bomb_set var/uititle flags = FPRINT use_power = 0 + unacidable = 1 /obj/machinery/nuclearbomb/New() ..() diff --git a/code/game/gamemodes/xenos/xenos.dm b/code/game/gamemodes/xenos/xenos.dm index b10cdaca32b..511ae7fd06c 100644 --- a/code/game/gamemodes/xenos/xenos.dm +++ b/code/game/gamemodes/xenos/xenos.dm @@ -13,12 +13,14 @@ var/result = 0 var/checkwin_counter = 0 var/xenos_list = list() + var/gammacalled = 0 var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds) var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds) var/xenoai = 0 //Should the Xenos have their own AI? var/xenoborg = 0 //Should the Xenos have their own borg? + var/gammaratio = 3 //At what alien to human ratio will the Gamma security level be called and the nuke be made available? /datum/game_mode/xenos/announce() world << "The current game mode is - Xenos!" @@ -87,6 +89,7 @@ O.mind.original = O else O.key = xeno_mind.current.key + //del(xeno_mind) var/obj/loc_landmark for(var/obj/effect/landmark/start/sloc in landmarks_list) @@ -101,6 +104,7 @@ O.laws = new /datum/ai_laws/alienmov O.name = "Alien AI" O.real_name = name + xeno_mind.name = O.name O.alienAI = 1 O.network = list("SS13","Xeno") O.holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holo3")) @@ -115,6 +119,7 @@ xeno_mind.transfer_to(O) else O.key = xeno_mind.current.key + xeno_mind.name = O.name //del(xeno_mind) xenoqueen_selected = 1 spawnpos++ @@ -135,6 +140,7 @@ O.job = "Alien Cyborg" O.name = "Alien Cyborg" O.real_name = name + xeno_mind.name = O.name O.module = new /obj/item/weapon/robot_module/alien/hunter(src) O.hands.icon_state = "standard" O.icon = 'icons/mob/alien.dmi' @@ -156,6 +162,7 @@ xeno_mind.transfer_to(O) else O.key = xeno_mind.current.key + xeno_mind.name = O.name //del(xeno_mind) spawnpos++ @@ -171,11 +178,13 @@ ticker.mode.check_win() checkwin_counter = 0 return 0 + /datum/game_mode/xenos/check_win() var/xenosalive = xenos_alive() var/playersalive = players_alive() - if(emergency_shuttle && (emergency_shuttle.returned() || emergency_shuttle.departed)) + var/playeralienratio = player_alien_ratio() + if(emergency_shuttle && emergency_shuttle.returned()) return ..() if(!xenosalive) result = 1 @@ -183,20 +192,38 @@ else if(!playersalive) result = 2 return 1 + else if(station_was_nuked) + result = 3 + return 1 else + if(playeralienratio >= gammaratio && !gammacalled) + gammacalled = 1 + command_alert("The aliens have nearly succeeded in capturing the station and exterminating the crew. Activate the nuclear failsafe to stop the alien threat once and for all. The Nuclear Authentication Code is [get_nuke_code()] ", "Alien Lifeform Alert") + set_security_level("gamma") + var/obj/machinery/door/airlock/vault/V = locate(/obj/machinery/door/airlock/vault) in world + if(V && V.z == 1) + V.locked = 0 + V.update_icon() return ..() /datum/game_mode/xenos/check_finished() if(config.continous_rounds) if(result) return ..() - if(emergency_shuttle && (emergency_shuttle.returned() || emergency_shuttle.departed)) + if(emergency_shuttle && emergency_shuttle.returned()) return ..() - if(result) + if(result || station_was_nuked) return 1 else return 0 +/datum/game_mode/xenos/proc/get_nuke_code() + var/nukecode = "ERROR" + for(var/obj/machinery/nuclearbomb/bomb in world) + if(bomb && bomb.r_code && bomb.z == 1) + nukecode = bomb.r_code + return nukecode + /datum/game_mode/xenos/proc/xenos_alive() var/list/livingxenos = list() for(var/datum/mind/xeno in xenos) @@ -209,12 +236,30 @@ var/list/livingplayers = list() for(var/mob/M in player_list) var/turf/T = get_turf(M) - if((M) && (M.stat != 2) && M.client && T && (T.z == 1)) + if((M) && (M.stat != 2) && M.client && T && (T.z == 1 || emergency_shuttle.departed && (T.z == 1 || T.z == 2))) if(ishuman(M)) livingplayers += 1 return livingplayers.len + +/datum/game_mode/xenos/proc/player_alien_ratio() + var/list/livingplayers = list() + var/list/livingxenos = list() + for(var/mob/M in player_list) + if((M) && (M.stat != 2) && M.client) + if(ishuman(M)) + livingplayers += 1 + for(var/datum/mind/xeno in xenos) + if((xeno) && (xeno.current) && (xeno.current.stat != 2) && (xeno.current.client)) + if(istype(xeno.current,/mob/living/carbon/alien) || (xenoborg && isrobot(xeno.current)) || (xenoai && isAI(xeno.current))) + livingxenos += xeno -/datum/game_mode/xenos/declare_completion() + if(!livingxenos.len || !livingplayers.len) + return 0 + + var/ratio = livingxenos.len / livingplayers.len + return ratio + +/datum/game_mode/xenos/declare_completion() if(result == 1) feedback_set_details("round_end_result","win - xenos killed") world << "Crew Victory" @@ -223,6 +268,10 @@ feedback_set_details("round_end_result","win - crew killed") world << "Alien Victory" world << "The aliens were successful and slaughtered the crew!" + else if(station_was_nuked) + feedback_set_details("round_end_result","win - xenos nuked") + world << "Crew Victory" + world << "The station was destroyed in a nuclear explosion, preventing the aliens from overrunning it!" else feedback_set_details("round_end_result","win - crew escaped") world << "Draw" @@ -231,7 +280,7 @@ var/text = "
There were [xenos.len] aliens." text += "
The aliens were:" for(var/datum/mind/xeno in xenos) - text += "
[xeno.key] was [xeno.current.name] (" + text += "
[xeno.key] was [xeno.name] (" if(xeno.current) if(xeno.current.stat == DEAD) text += "died" diff --git a/code/game/jobs/job/supervisor.dm b/code/game/jobs/job/supervisor.dm index 85d2e213b5b..a5bebf6fd72 100644 --- a/code/game/jobs/job/supervisor.dm +++ b/code/game/jobs/job/supervisor.dm @@ -246,8 +246,8 @@ access_all_personal_lockers, access_maint_tunnels, access_bar, access_janitor, access_construction, access_morgue, access_crematorium, access_kitchen, access_cargo, access_cargo_bot, access_mailsorting, access_qm, access_hydroponics, access_lawyer, access_theatre, access_chapel_office, access_library, access_research, access_mining, access_heads_vault, access_mining_station, - access_clown, access_mime, access_hop, access_RC_announce, access_keycard_auth, access_gateway) - minimal_access = list(access_security, access_sec_doors, access_brig, access_court, access_maint_tunnels, access_lawyer) + access_clown, access_mime, access_hop, access_RC_announce, access_keycard_auth, access_gateway, access_magistrate) + minimal_access = list(access_security, access_sec_doors, access_brig, access_court, access_maint_tunnels, access_lawyer, access_magistrate) equip(var/mob/living/carbon/human/H) if(!H) return 0 @@ -279,8 +279,8 @@ spawn_positions = 2 supervisors = "the magistrate" selection_color = "#ddddff" - access = list(access_lawyer, access_court, access_sec_doors, access_maint_tunnels, access_magistrate) - minimal_access = list(access_lawyer, access_court, access_sec_doors, access_maint_tunnels, access_magistrate) + access = list(access_lawyer, access_court, access_sec_doors, access_maint_tunnels) + minimal_access = list(access_lawyer, access_court, access_sec_doors, access_maint_tunnels) alt_titles = list("Lawyer","Public Defender") minimal_player_age = 21 diff --git a/code/game/machinery/OpTable.dm b/code/game/machinery/OpTable.dm index 36984e5c314..837759072ed 100644 --- a/code/game/machinery/OpTable.dm +++ b/code/game/machinery/OpTable.dm @@ -73,7 +73,7 @@ /obj/machinery/optable/MouseDrop_T(atom/movable/O as mob|obj, mob/user as mob) - if(usr.stat || !ishuman(usr) || usr.restrained() || !check_table(usr)) + if(usr.stat || !ishuman(usr) || usr.restrained() || !check_table(usr) || usr.weakened || usr.stunned) return var/mob/living/L = O diff --git a/code/game/machinery/bots/secbot.dm b/code/game/machinery/bots/secbot.dm index d554caf3cd0..dfa42e7c1da 100644 --- a/code/game/machinery/bots/secbot.dm +++ b/code/game/machinery/bots/secbot.dm @@ -247,7 +247,7 @@ Auto Patrol: []"}, var/area/location = get_area(src) speak("[arrest_type ? "Detaining" : "Arresting"] level [threatlevel] scumbag [target] in [location].",radio_frequency, radio_name) target.visible_message("[target] has been [harmbaton ? "beaten" : "stunned"] by [src]!",\ - "[target] has been [harmbaton ? "beaten" : "unlocked"] by [src]!") + "[target] has been [harmbaton ? "beaten" : "stunned"] by [src]!") mode = BOT_PREP_ARREST anchored = 1 diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index b0d44d31d9b..977c1bd3d3e 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -28,6 +28,7 @@ var/light_disabled = 0 var/alarm_on = 0 var/busy = 0 + var/indestructible = 0 // If set, prevents aliens from destroying it /obj/machinery/camera/New() wires = new(src) @@ -97,6 +98,8 @@ /obj/machinery/camera/attack_paw(mob/living/carbon/alien/humanoid/user as mob) if(!istype(user)) return + if(indestructible) + return status = 0 visible_message("\The [user] slashes at [src]!") playsound(src.loc, 'sound/weapons/slash.ogg', 100, 1) diff --git a/code/game/machinery/computer/xenos_shuttle.dm b/code/game/machinery/computer/xenos_shuttle.dm index 0fda373fe2a..1944274965a 100644 --- a/code/game/machinery/computer/xenos_shuttle.dm +++ b/code/game/machinery/computer/xenos_shuttle.dm @@ -9,6 +9,7 @@ var/area/curr_location var/moving = 0 var/lastMove = 0 + unacidable = 1 /obj/machinery/computer/xenos_station/New() @@ -26,9 +27,8 @@ for(var/obj/machinery/door/airlock/alien/A in world) A.close() - if(dest_location == locate(/area/xenos_station/start)) - A.locked = 1 - A.update_icon() + A.locked = 1 + A.update_icon() for(var/mob/M in curr_location) if(M.client) @@ -109,11 +109,12 @@ Ready to move[max(lastMove + XENOS_SHUTTLE_COOLDOWN - world.time, 0) ? " in [max(round((lastMove + XENOS_SHUTTLE_COOLDOWN - world.time) * 0.1), 0)] seconds" : ": now"]
Alien Space
North-West of SS13 | - North of SS13 | North-East of SS13
+ East of SS13
South-West of SS13 | - South of SS13 | South-East of SS13
+ West of SS13
+ North of Research Outpost
Close"} user << browse(dat, "window=computer;size=575x450") @@ -132,17 +133,18 @@ xenos_move_to(/area/xenos_station/start) else if(href_list["station_nw"]) xenos_move_to(/area/xenos_station/northwest) - else if(href_list["station_n"]) - xenos_move_to(/area/xenos_station/north) else if(href_list["station_ne"]) xenos_move_to(/area/xenos_station/northeast) + else if(href_list["station_e"]) + xenos_move_to(/area/xenos_station/east) else if(href_list["station_sw"]) xenos_move_to(/area/xenos_station/southwest) - else if(href_list["station_s"]) - xenos_move_to(/area/xenos_station/south) else if(href_list["station_se"]) xenos_move_to(/area/xenos_station/southeast) - + else if(href_list["station_w"]) + xenos_move_to(/area/xenos_station/west) + else if(href_list["station_ro"]) + xenos_move_to(/area/xenos_station/researchoutpost) add_fingerprint(usr) updateUsrDialog() diff --git a/code/game/objects/effects/aliens.dm b/code/game/objects/effects/aliens.dm index 74df833b887..32ea115a9f3 100644 --- a/code/game/objects/effects/aliens.dm +++ b/code/game/objects/effects/aliens.dm @@ -166,6 +166,21 @@ connected_weeds = new() ..(src.loc, src) +/obj/effect/alien/weeds/node/Destroy() + for(var/obj/effect/alien/weeds/W in connected_weeds) + processing_objects.Add(W) // Start processing the weeds so they lose health when there's no connected node + ..() + +/obj/effect/alien/weeds/process() + if(!linked_node || (get_dist(linked_node, src) > linked_node.node_range)) + if(prob(50)) + health -= 1 + else if(prob(50)) + health -= 2 + else if(prob(25)) + health -= 3 + healthcheck() + /obj/effect/alien/weeds/New(pos, var/obj/effect/alien/weeds/node/N) ..() @@ -187,6 +202,7 @@ if(linked_node) linked_node.connected_weeds.Remove(src) linked_node = null + processing_objects.Remove(src) ..() /obj/effect/alien/weeds/proc/Life() diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm index 1d03d465763..839a0163b3c 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm @@ -39,8 +39,9 @@ src << "You begin to evolve!" for(var/mob/O in viewers(src, null)) O.show_message(text("[src] begins to twist and contort!"), 1) - var/mob/living/carbon/alien/humanoid/queen/new_xeno = new (loc) + var/mob/living/carbon/alien/humanoid/queen/new_xeno = new(loc) mind.transfer_to(new_xeno) + new_xeno.mind.name = new_xeno.name del(src) else src << "We already have an alive queen." diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm index c5926be8936..7b7bb5fe859 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm @@ -81,11 +81,12 @@ src << "\green You begin to evolve!" for(var/mob/O in viewers(src, null)) O.show_message(text("\green [src] begins to twist and contort!"), 1) - var/mob/living/carbon/alien/humanoid/sentinel/praetorian/new_xeno = new (loc) + var/mob/living/carbon/alien/humanoid/sentinel/praetorian/new_xeno = new(loc) if(mind) mind.transfer_to(new_xeno) else new_xeno.key = key + new_xeno.mind.name = new_xeno.name del(src) return \ No newline at end of file diff --git a/code/modules/mob/living/carbon/alien/humanoid/queen.dm b/code/modules/mob/living/carbon/alien/humanoid/queen.dm index 2f102511162..ae4024bb852 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/queen.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/queen.dm @@ -123,11 +123,12 @@ src << "You begin to evolve!" for(var/mob/O in viewers(src, null)) O.show_message(text("\green [src] begins to twist and contort!"), 1) - var/mob/living/carbon/alien/humanoid/empress/new_xeno = new (loc) + var/mob/living/carbon/alien/humanoid/empress/new_xeno = new(loc) if(mind) mind.transfer_to(new_xeno) else new_xeno.key = key + new_xeno.mind.name = new_xeno.name del(src) else src << "We already have an alive empress." diff --git a/code/modules/mob/living/carbon/alien/larva/powers.dm b/code/modules/mob/living/carbon/alien/larva/powers.dm index 28634d20e61..c42a2dffbb4 100644 --- a/code/modules/mob/living/carbon/alien/larva/powers.dm +++ b/code/modules/mob/living/carbon/alien/larva/powers.dm @@ -52,6 +52,7 @@ mind.transfer_to(new_xeno) else new_xeno.key = key + new_xeno.mind.name = new_xeno.name del(src) return else diff --git a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm index 3744fbb47f5..eeb4cd08ef1 100644 --- a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm +++ b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm @@ -99,6 +99,7 @@ var/const/ALIEN_AFK_BRACKET = 450 // 45 seconds new_xeno.key = C.key if(ticker && ticker.mode) ticker.mode.xenos += new_xeno.mind + new_xeno.mind.name = new_xeno.name new_xeno.mind.assigned_role = "MODE" new_xeno.mind.special_role = "Alien" new_xeno << sound('sound/voice/hiss5.ogg',0,0,0,100) //To get the player's attention diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 63ebadd4a19..acea2b9849c 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -97,6 +97,7 @@ var/global/list/status_overlays_equipment var/global/list/status_overlays_lighting var/global/list/status_overlays_environ + var/indestructible = 0 // If set, prevents aliens from destroying it /obj/machinery/power/apc/updateDialog() if (stat & (BROKEN|MAINT)) @@ -667,6 +668,8 @@ return if(!istype(user,/mob/living/carbon/alien/humanoid)) return + if(indestructible) + return user.visible_message("\red [user.name] slashes at the [src.name]!", "\blue You slash at the [src.name]!") playsound(src.loc, 'sound/weapons/slash.ogg', 100, 1) diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm index acc6311632c..1613bc46187 100644 --- a/code/modules/power/smes.dm +++ b/code/modules/power/smes.dm @@ -331,13 +331,13 @@ /obj/machinery/power/smes/attack_ai(mob/user) add_fingerprint(user) ui_interact(user) - - + /obj/machinery/power/smes/attack_hand(mob/user) add_fingerprint(user) ui_interact(user) - +/obj/machinery/power/smes/attack_alien(mob/living/carbon/alien/humanoid/user) + return /obj/machinery/power/smes/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index fb226832d22..46aacf1231a 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -1106,7 +1106,7 @@ datum/design/basic_capacitor build_path = "/obj/item/weapon/stock_parts/capacitor" datum/design/basic_sensor - name = "Basic Sensor Module" + name = "Basic Scanning Module" desc = "A stock part used in the construction of various devices." id = "basic_sensor" req_tech = list("magnets" = 1) diff --git a/data/mode.txt b/data/mode.txt index ef18df98db4..b728002254f 100644 --- a/data/mode.txt +++ b/data/mode.txt @@ -1 +1 @@ -extended +xenos diff --git a/nano/debug.html b/nano/debug.html index 42159c9df17..abe9da0bc8a 100644 --- a/nano/debug.html +++ b/nano/debug.html @@ -16,7 +16,7 @@ - +