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 @@
-