diff --git a/baystation12.dme b/baystation12.dme
index a7176e3b98a..112c747f103 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -819,6 +819,7 @@
#include "code\modules\clothing\spacesuits\rig\suits\combat.dm"
#include "code\modules\clothing\spacesuits\rig\suits\ert.dm"
#include "code\modules\clothing\spacesuits\rig\suits\light.dm"
+#include "code\modules\clothing\spacesuits\rig\suits\merc.dm"
#include "code\modules\clothing\spacesuits\rig\suits\station.dm"
#include "code\modules\clothing\spacesuits\void\merc.dm"
#include "code\modules\clothing\spacesuits\void\station.dm"
diff --git a/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm b/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm
index aed8b2dc07e..649972297a3 100644
--- a/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm
+++ b/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm
@@ -1,5 +1,5 @@
obj/machinery/atmospherics/binary
- set_dir(SOUTH)
+ dir = SOUTH
initialize_directions = SOUTH|NORTH
use_power = 1
diff --git a/code/ATMOSPHERICS/components/omni_devices/mixer.dm b/code/ATMOSPHERICS/components/omni_devices/mixer.dm
index b59c0281c19..2740966867c 100644
--- a/code/ATMOSPHERICS/components/omni_devices/mixer.dm
+++ b/code/ATMOSPHERICS/components/omni_devices/mixer.dm
@@ -49,8 +49,6 @@
for(var/datum/omni_port/P in ports)
P.air.volume = ATMOS_DEFAULT_VOLUME_MIXER
- rebuild_mixing_inputs()
-
/obj/machinery/atmospherics/omni/mixer/Del()
inputs.Cut()
output = null
@@ -77,6 +75,8 @@
if(output)
output.air.volume = ATMOS_DEFAULT_VOLUME_MIXER * 0.75 * inputs.len
output.concentration = 1
+
+ rebuild_mixing_inputs()
/obj/machinery/atmospherics/omni/mixer/proc/mapper_set()
return (tag_north_con || tag_south_con || tag_east_con || tag_west_con)
@@ -108,7 +108,7 @@
var/power_draw = -1
if (transfer_moles > MINUMUM_MOLES_TO_FILTER)
- power_draw = mix_gas(src, mixing_inputs, output, transfer_moles, active_power_usage)
+ power_draw = mix_gas(src, mixing_inputs, output.air, transfer_moles, active_power_usage)
if (power_draw < 0)
//update_use_power(0)
diff --git a/code/ATMOSPHERICS/components/portables_connector.dm b/code/ATMOSPHERICS/components/portables_connector.dm
index 488c1eeb915..4bfd61a0a2a 100644
--- a/code/ATMOSPHERICS/components/portables_connector.dm
+++ b/code/ATMOSPHERICS/components/portables_connector.dm
@@ -5,7 +5,7 @@
name = "Connector Port"
desc = "For connecting portables devices related to atmospherics control."
- set_dir(SOUTH)
+ dir = SOUTH
initialize_directions = SOUTH
var/obj/machinery/portable_atmospherics/connected_device
diff --git a/code/ATMOSPHERICS/components/trinary_devices/filter.dm b/code/ATMOSPHERICS/components/trinary_devices/filter.dm
index 4f5205687ed..145a1d61086 100755
--- a/code/ATMOSPHERICS/components/trinary_devices/filter.dm
+++ b/code/ATMOSPHERICS/components/trinary_devices/filter.dm
@@ -5,7 +5,7 @@
level = 1
name = "Gas filter"
-
+
use_power = 1
idle_power_usage = 150 //internal circuitry, friction losses and stuff
active_power_usage = 7500 //This also doubles as a measure of how powerful the filter is, in Watts. 7500 W ~ 10 HP
@@ -49,11 +49,11 @@
filtered_out = list("carbon_dioxide")
if(4)//removing N2O
filtered_out = list("sleeping_agent")
-
+
air1.volume = ATMOS_DEFAULT_VOLUME_FILTER
air2.volume = ATMOS_DEFAULT_VOLUME_FILTER
air3.volume = ATMOS_DEFAULT_VOLUME_FILTER
-
+
if(radio_controller)
initialize()
@@ -102,14 +102,14 @@
update_use_power(0) //usually we get here because a player turned a pump off - definitely want to update.
last_flow_rate = 0
return
-
+
//Figure out the amount of moles to transfer
var/transfer_moles = (set_flow_rate/air1.volume)*air1.total_moles
-
+
var/power_draw = -1
if (transfer_moles > MINUMUM_MOLES_TO_FILTER)
power_draw = filter_gas(src, filtered_out, air1, air2, air3, transfer_moles, active_power_usage)
-
+
if(network2)
network2.update = 1
@@ -125,7 +125,7 @@
last_flow_rate = 0
else
handle_power_draw(power_draw)
-
+
return 1
/obj/machinery/atmospherics/trinary/filter/initialize()
@@ -214,7 +214,7 @@
src.add_fingerprint(usr)
if(href_list["filterset"])
filter_type = text2num(href_list["filterset"])
-
+
filtered_out.Cut() //no need to create new lists unnecessarily
switch(filter_type)
if(0) //removing hydrocarbons
@@ -228,7 +228,7 @@
filtered_out += "carbon_dioxide"
if(4)//removing N2O
filtered_out += "sleeping_agent"
-
+
if (href_list["temp"])
src.temp = null
if(href_list["set_flow_rate"])
@@ -248,7 +248,7 @@
/obj/machinery/atmospherics/trinary/filter/m_filter
icon_state = "mmap"
- set_dir(SOUTH)
+ dir = SOUTH
initialize_directions = SOUTH|NORTH|EAST
obj/machinery/atmospherics/trinary/filter/m_filter/New()
diff --git a/code/ATMOSPHERICS/components/trinary_devices/mixer.dm b/code/ATMOSPHERICS/components/trinary_devices/mixer.dm
index 9432518b539..c63c6208d36 100644
--- a/code/ATMOSPHERICS/components/trinary_devices/mixer.dm
+++ b/code/ATMOSPHERICS/components/trinary_devices/mixer.dm
@@ -12,7 +12,7 @@
var/set_flow_rate = ATMOS_DEFAULT_VOLUME_MIXER
var/list/mixing_inputs
-
+
//for mapping
var/node1_concentration = 0.5
var/node2_concentration = 0.5
@@ -71,23 +71,23 @@
/obj/machinery/atmospherics/trinary/mixer/process()
..()
-
+
//For some reason this doesn't work even in initialize(), so it goes here.
if (!mixing_inputs)
mixing_inputs = list(src.air1 = node1_concentration, src.air2 = node2_concentration)
-
+
if((stat & (NOPOWER|BROKEN)) || !on)
update_use_power(0) //usually we get here because a player turned a pump off - definitely want to update.
last_flow_rate = 0
return
-
+
//Figure out the amount of moles to transfer
var/transfer_moles = (set_flow_rate*mixing_inputs[air1]/air1.volume)*air1.total_moles + (set_flow_rate*mixing_inputs[air1]/air2.volume)*air2.total_moles
-
+
var/power_draw = -1
if (transfer_moles > MINUMUM_MOLES_TO_FILTER)
power_draw = mix_gas(src, mixing_inputs, air3, transfer_moles, active_power_usage)
-
+
if(network1 && mixing_inputs[air1])
network1.update = 1
@@ -103,7 +103,7 @@
last_flow_rate = 0
else
handle_power_draw(power_draw)
-
+
return 1
/obj/machinery/atmospherics/trinary/mixer/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob)
@@ -181,7 +181,7 @@
obj/machinery/atmospherics/trinary/mixer/t_mixer
icon_state = "tmap"
- set_dir(SOUTH)
+ dir = SOUTH
initialize_directions = SOUTH|EAST|WEST
//node 3 is the outlet, nodes 1 & 2 are intakes
@@ -227,7 +227,7 @@ obj/machinery/atmospherics/trinary/mixer/t_mixer/initialize()
obj/machinery/atmospherics/trinary/mixer/m_mixer
icon_state = "mmap"
- set_dir(SOUTH)
+ dir = SOUTH
initialize_directions = SOUTH|NORTH|EAST
//node 3 is the outlet, nodes 1 & 2 are intakes
diff --git a/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm b/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm
index ce3aafc9536..822c9a4d6dc 100644
--- a/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm
+++ b/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm
@@ -1,5 +1,5 @@
obj/machinery/atmospherics/trinary
- set_dir(SOUTH)
+ dir = SOUTH
initialize_directions = SOUTH|NORTH|WEST
use_power = 1
diff --git a/code/ATMOSPHERICS/components/tvalve.dm b/code/ATMOSPHERICS/components/tvalve.dm
index 4d931bd3249..39ca1e25fd8 100644
--- a/code/ATMOSPHERICS/components/tvalve.dm
+++ b/code/ATMOSPHERICS/components/tvalve.dm
@@ -6,7 +6,7 @@
desc = "A pipe valve"
level = 1
- set_dir(SOUTH)
+ dir = SOUTH
initialize_directions = SOUTH|NORTH|WEST
var/state = 0 // 0 = go straight, 1 = go to side
diff --git a/code/ATMOSPHERICS/components/unary/oxygen_generator.dm b/code/ATMOSPHERICS/components/unary/oxygen_generator.dm
index c3ccdbc574b..14bbb46bbaa 100644
--- a/code/ATMOSPHERICS/components/unary/oxygen_generator.dm
+++ b/code/ATMOSPHERICS/components/unary/oxygen_generator.dm
@@ -6,7 +6,7 @@ obj/machinery/atmospherics/unary/oxygen_generator
name = "Oxygen Generator"
desc = ""
- set_dir(SOUTH)
+ dir = SOUTH
initialize_directions = SOUTH
var/on = 0
diff --git a/code/ATMOSPHERICS/components/unary/unary_base.dm b/code/ATMOSPHERICS/components/unary/unary_base.dm
index 8d850cc74fa..8af26e51eb3 100644
--- a/code/ATMOSPHERICS/components/unary/unary_base.dm
+++ b/code/ATMOSPHERICS/components/unary/unary_base.dm
@@ -1,5 +1,5 @@
/obj/machinery/atmospherics/unary
- set_dir(SOUTH)
+ dir = SOUTH
initialize_directions = SOUTH
//layer = TURF_LAYER+0.1
diff --git a/code/ATMOSPHERICS/components/valve.dm b/code/ATMOSPHERICS/components/valve.dm
index 4633c06511f..036ed920316 100644
--- a/code/ATMOSPHERICS/components/valve.dm
+++ b/code/ATMOSPHERICS/components/valve.dm
@@ -6,7 +6,7 @@
desc = "A pipe valve"
level = 1
- set_dir(SOUTH)
+ dir = SOUTH
initialize_directions = SOUTH|NORTH
var/open = 0
@@ -316,4 +316,8 @@
"\blue You have unfastened \the [src].", \
"You hear ratchet.")
new /obj/item/pipe(loc, make_from=src)
- del(src)
\ No newline at end of file
+ del(src)
+
+/obj/machinery/atmospherics/valve/examine(mob/user)
+ ..()
+ user << "It is [open ? "open" : "closed"]."
diff --git a/code/ATMOSPHERICS/mainspipe.dm b/code/ATMOSPHERICS/mainspipe.dm
index ce23f7bfba3..d70d2bc53e5 100644
--- a/code/ATMOSPHERICS/mainspipe.dm
+++ b/code/ATMOSPHERICS/mainspipe.dm
@@ -37,7 +37,7 @@ obj/machinery/atmospherics/mains_pipe
layer = 2.4 //under wires with their 2.5
force = 20
-
+
var/volume = 0
var/alert_pressure = 80*ONE_ATMOSPHERE
@@ -115,7 +115,7 @@ obj/machinery/atmospherics/mains_pipe/simple
name = "mains pipe"
desc = "A one meter section of 3-line mains pipe"
- set_dir(SOUTH)
+ dir = SOUTH
initialize_mains_directions = SOUTH|NORTH
New()
@@ -196,7 +196,7 @@ obj/machinery/atmospherics/mains_pipe/manifold
name = "manifold pipe"
desc = "A manifold composed of mains pipes"
- set_dir(SOUTH)
+ dir = SOUTH
initialize_mains_directions = EAST|NORTH|WEST
volume = 105
@@ -261,7 +261,7 @@ obj/machinery/atmospherics/mains_pipe/manifold4w
name = "manifold pipe"
desc = "A manifold composed of mains pipes"
- set_dir(SOUTH)
+ dir = SOUTH
initialize_mains_directions = EAST|NORTH|WEST|SOUTH
volume = 105
@@ -504,7 +504,7 @@ obj/machinery/atmospherics/mains_pipe/cap
name = "pipe cap"
desc = "A cap for the end of a mains pipe"
- set_dir(SOUTH)
+ dir = SOUTH
initialize_directions = SOUTH
volume = 35
@@ -546,7 +546,7 @@ obj/machinery/atmospherics/mains_pipe/valve
var/open = 1
- set_dir(SOUTH)
+ dir = SOUTH
initialize_mains_directions = SOUTH|NORTH
New()
diff --git a/code/ATMOSPHERICS/pipes.dm b/code/ATMOSPHERICS/pipes.dm
index 037d39218ae..34ece52777a 100644
--- a/code/ATMOSPHERICS/pipes.dm
+++ b/code/ATMOSPHERICS/pipes.dm
@@ -143,7 +143,7 @@
volume = ATMOS_DEFAULT_VOLUME_PIPE
- set_dir(SOUTH)
+ dir = SOUTH
initialize_directions = SOUTH|NORTH
var/obj/machinery/atmospherics/node1
@@ -406,7 +406,7 @@
volume = ATMOS_DEFAULT_VOLUME_PIPE * 1.5
- set_dir(SOUTH)
+ dir = SOUTH
initialize_directions = EAST|NORTH|WEST
var/obj/machinery/atmospherics/node1
@@ -658,7 +658,7 @@
volume = ATMOS_DEFAULT_VOLUME_PIPE * 2
- set_dir(SOUTH)
+ dir = SOUTH
initialize_directions = NORTH|SOUTH|EAST|WEST
var/obj/machinery/atmospherics/node1
@@ -918,7 +918,7 @@
volume = 35
- set_dir(SOUTH)
+ dir = SOUTH
initialize_directions = SOUTH
var/obj/machinery/atmospherics/node
@@ -1042,7 +1042,7 @@
var/start_pressure = 25*ONE_ATMOSPHERE
level = 1
- set_dir(SOUTH)
+ dir = SOUTH
initialize_directions = SOUTH
density = 1
@@ -1220,7 +1220,7 @@
volume = 250
- set_dir(SOUTH)
+ dir = SOUTH
initialize_directions = SOUTH
var/build_killswitch = 1
diff --git a/code/TriDimension/Pipes.dm b/code/TriDimension/Pipes.dm
index 4f38444e988..776716f567a 100644
--- a/code/TriDimension/Pipes.dm
+++ b/code/TriDimension/Pipes.dm
@@ -10,7 +10,7 @@ obj/machinery/atmospherics/pipe/zpipe
volume = 70
- set_dir(SOUTH)
+ dir = SOUTH
initialize_directions = SOUTH
var/obj/machinery/atmospherics/node1 //connection on the same Z
diff --git a/code/WorkInProgress/Chinsky/overmap/ships/computers/shuttle.dm b/code/WorkInProgress/Chinsky/overmap/ships/computers/shuttle.dm
index 4ebc9469da3..dbfa94043ec 100644
--- a/code/WorkInProgress/Chinsky/overmap/ships/computers/shuttle.dm
+++ b/code/WorkInProgress/Chinsky/overmap/ships/computers/shuttle.dm
@@ -83,7 +83,7 @@
shuttle_status = "Standing-by at station."
else
shuttle_status = "Standing-by at offsite location."
- if(WAIT_LAUNCH)
+ if(WAIT_LAUNCH, FORCE_LAUNCH)
shuttle_status = "Shuttle has recieved command and will depart shortly."
if(WAIT_ARRIVE)
shuttle_status = "Proceeding to destination."
diff --git a/code/WorkInProgress/computer3/component.dm b/code/WorkInProgress/computer3/component.dm
index 18cf2de1c76..f484e04c645 100644
--- a/code/WorkInProgress/computer3/component.dm
+++ b/code/WorkInProgress/computer3/component.dm
@@ -215,9 +215,12 @@
if(reader)
reader.loc = loc
if(istype(L) && !L.get_active_hand())
- L.put_in_hands(reader)
+ if(istype(L,/mob/living/carbon/human))
+ L.put_in_hands(reader)
+ else
+ reader.loc = get_turf(computer)
else
- reader.loc = computer.loc
+ reader.loc = get_turf(computer)
reader = null
return 1
return 0
@@ -226,16 +229,16 @@
if(writer && dualslot)
writer.loc = loc
if(istype(L) && !L.get_active_hand())
- L.put_in_hands(writer)
+ if(istype(L,/mob/living/carbon/human))
+ L.put_in_hands(writer)
+ else
+ writer.loc = get_turf(computer)
else
- writer.loc = computer.loc
+ writer.loc = get_turf(computer)
writer = null
return 1
return 0
-
-
-
// Authorizes the user based on the computer's requirements
proc/authenticate()
return computer.check_access(reader)
diff --git a/code/WorkInProgress/computer3/computers/camera.dm b/code/WorkInProgress/computer3/computers/camera.dm
index 193070ce3e3..b3a0c7fcfa7 100644
--- a/code/WorkInProgress/computer3/computers/camera.dm
+++ b/code/WorkInProgress/computer3/computers/camera.dm
@@ -147,7 +147,7 @@
if(temp.len)
L.Add(C)
- //camera_sort(L)
+ camera_sort(L)
return L
verify_machine(var/obj/machinery/camera/C,var/datum/file/camnet_key/key = null)
diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm
index 8bde73c238e..c16aac30f7f 100644
--- a/code/__HELPERS/global_lists.dm
+++ b/code/__HELPERS/global_lists.dm
@@ -26,7 +26,7 @@ var/global/list/language_keys[0] //table of say codes for all languages
var/global/list/whitelisted_species = list("Human")
// Posters
-var/global/list/datum/poster/poster_designs = typesof(/datum/poster) - /datum/poster
+var/global/list/poster_designs = list()
// Uplinks
var/list/obj/item/device/uplink/world_uplinks = list()
@@ -106,9 +106,10 @@ var/global/list/backbaglist = list("Nothing", "Backpack", "Satchel", "Satchel Al
for (var/language_name in all_languages)
var/datum/language/L = all_languages[language_name]
- language_keys[":[lowertext(L.key)]"] = L
- language_keys[".[lowertext(L.key)]"] = L
- language_keys["#[lowertext(L.key)]"] = L
+ if(!(L.flags & NONGLOBAL))
+ language_keys[":[lowertext(L.key)]"] = L
+ language_keys[".[lowertext(L.key)]"] = L
+ language_keys["#[lowertext(L.key)]"] = L
var/rkey = 0
paths = typesof(/datum/species)-/datum/species
@@ -121,6 +122,12 @@ var/global/list/backbaglist = list("Nothing", "Backpack", "Satchel", "Satchel Al
if(S.flags & IS_WHITELISTED)
whitelisted_species += S.name
+ //Posters
+ paths = typesof(/datum/poster) - /datum/poster
+ for(var/T in paths)
+ var/datum/poster/P = new T
+ poster_designs += P
+
return 1
/* // Uncomment to debug chemical reaction list.
diff --git a/code/__HELPERS/turfs.dm b/code/__HELPERS/turfs.dm
index 57d4b865557..3e26d117b2d 100644
--- a/code/__HELPERS/turfs.dm
+++ b/code/__HELPERS/turfs.dm
@@ -5,3 +5,6 @@
while(mloc && mloc.loc && !istype(mloc.loc, /turf/))
mloc = mloc.loc
return mloc
+
+/proc/iswall(turf/T)
+ return (istype(T, /turf/simulated/wall) || istype(T, /turf/unsimulated/wall) || istype(T, /turf/simulated/shuttle/wall))
\ No newline at end of file
diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm
index e69ed4b5ddd..3df48454de7 100644
--- a/code/datums/datumvars.dm
+++ b/code/datums/datumvars.dm
@@ -794,6 +794,9 @@ client
var/new_language = input("Please choose a language to add.","Language",null) as null|anything in all_languages
+ if(!new_language)
+ return
+
if(!H)
usr << "Mob doesn't exist anymore"
return
@@ -817,6 +820,9 @@ client
var/datum/language/rem_language = input("Please choose a language to remove.","Language",null) as null|anything in H.languages
+ if(!rem_language)
+ return
+
if(!H)
usr << "Mob doesn't exist anymore"
return
diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm
index 6de75c2b9df..79074cfbe68 100644
--- a/code/defines/obj/weapon.dm
+++ b/code/defines/obj/weapon.dm
@@ -634,4 +634,4 @@
icon = 'icons/obj/stock_parts.dmi'
icon_state = "capacitor"
desc = "A debug item for research."
- origin_tech = "materials=8;programming=8;magnets=8;powerstorage=8;bluespace=8;combat=8;biotech=8;syndicate=8"
+ origin_tech = "materials=8;programming=8;magnets=8;powerstorage=8;bluespace=8;combat=8;biotech=8;syndicate=8;phorontech=8;engineering=8"
diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm
index 7f115404b3d..3f7ddbceb2a 100755
--- a/code/game/area/Space Station 13 areas.dm
+++ b/code/game/area/Space Station 13 areas.dm
@@ -1040,6 +1040,7 @@ var/list/ghostteleportlocs = list()
/area/holodeck/source_space
name = "\improper Holodeck - Space"
+ has_gravity = 0
diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm
index 1f7b8a6510c..e1ce51997d4 100644
--- a/code/game/gamemodes/changeling/changeling.dm
+++ b/code/game/gamemodes/changeling/changeling.dm
@@ -161,7 +161,7 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
var/text = "The changelings were:"
for(var/datum/mind/changeling in changelings)
var/changelingwin = changeling.current
- text += printplayer(changeling)
+ text += print_player_full(changeling)
//Removed sanity if(changeling) because we -want- a runtime to inform us that the changelings list is incorrect and needs to be fixed.
text += "
Changeling ID: [changeling.changeling.changelingID]."
diff --git a/code/game/gamemodes/changeling/changeling_powers.dm b/code/game/gamemodes/changeling/changeling_powers.dm
index 0309eccee0b..d353c77ad06 100644
--- a/code/game/gamemodes/changeling/changeling_powers.dm
+++ b/code/game/gamemodes/changeling/changeling_powers.dm
@@ -457,7 +457,7 @@
changeling.chem_charges -= 20
// restore us to health
- C.rejuvenate()
+ C.revive()
// remove our fake death flag
C.status_flags &= ~(FAKEDEATH)
diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm
index e6e70ff35f7..4c4226e4ea2 100644
--- a/code/game/gamemodes/cult/cult.dm
+++ b/code/game/gamemodes/cult/cult.dm
@@ -334,7 +334,7 @@
if( cult.len || (ticker && istype(ticker.mode,/datum/game_mode/cult)) )
var/text = "The cultists were:"
for(var/datum/mind/cultist in cult)
- text += printplayer(cultist)
+ text += print_player_full(cultist)
text += "
"
world << text
diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm
index aeafddb0152..88e16dbe46b 100644
--- a/code/game/gamemodes/cult/runes.dm
+++ b/code/game/gamemodes/cult/runes.dm
@@ -414,12 +414,12 @@ var/list/sacrificed = list()
else
ticker.mode.cult+=D.mind
- D.mind.assigned_role = pick("Anguished", "Blasphemous", "Corrupt", "Cruel", "Depraved", "Despicable", "Disturbed", "Exacerbated", "Foul", "Hateful", "Inexorable", "Implacable", "Impure", "Malevolent", "Malignant", "Malicious", "Pained", "Profane", "Profligate", "Relentless", "Resentful", "Restless", "Spiteful", "Tormented", "Unclean", "Unforgiving", "Vengeful", "Vindictive", "Wicked", "Wronged")
- D.mind.assigned_role += " "
- D.mind.assigned_role += pick("Apparition", "Aptrgangr", "Dis", "Draugr", "Dybbuk", "Eidolon", "Fetch", "Fylgja", "Ghast", "Ghost", "Gjenganger", "Haint", "Phantom", "Phantasm", "Poltergeist", "Revenant", "Shade", "Shadow", "Soul", "Spectre", "Spirit", "Spook", "Visitant", "Wraith")
+ D.mind.assigned_role = "Manifest Ghost"
D.mind.special_role = "Cultist"
if(!chose_name)
- D.real_name = D.mind.assigned_role
+ D.real_name = pick("Anguished", "Blasphemous", "Corrupt", "Cruel", "Depraved", "Despicable", "Disturbed", "Exacerbated", "Foul", "Hateful", "Inexorable", "Implacable", "Impure", "Malevolent", "Malignant", "Malicious", "Pained", "Profane", "Profligate", "Relentless", "Resentful", "Restless", "Spiteful", "Tormented", "Unclean", "Unforgiving", "Vengeful", "Vindictive", "Wicked", "Wronged")
+ D.real_name += " "
+ D.real_name += pick("Apparition", "Aptrgangr", "Dis", "Draugr", "Dybbuk", "Eidolon", "Fetch", "Fylgja", "Ghast", "Ghost", "Gjenganger", "Haint", "Phantom", "Phantasm", "Poltergeist", "Revenant", "Shade", "Shadow", "Soul", "Spectre", "Spirit", "Spook", "Visitant", "Wraith")
D << "Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind something sinister takes root."
D << "Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back."
diff --git a/code/game/gamemodes/cult/talisman.dm b/code/game/gamemodes/cult/talisman.dm
index 52f1ff6286e..0f5ab245d1f 100644
--- a/code/game/gamemodes/cult/talisman.dm
+++ b/code/game/gamemodes/cult/talisman.dm
@@ -2,7 +2,7 @@
icon_state = "paper_talisman"
var/imbue = null
var/uses = 0
- info = "
"
+ info = "

"
attack_self(mob/living/user as mob)
if(iscultist(user))
diff --git a/code/game/gamemodes/events/space_ninja.dm b/code/game/gamemodes/events/space_ninja.dm
index 1bf2406db5b..3dac9f21488 100644
--- a/code/game/gamemodes/events/space_ninja.dm
+++ b/code/game/gamemodes/events/space_ninja.dm
@@ -531,20 +531,31 @@ As such, it's hard-coded for now. No reason for it not to be, really.
else
equip_to_slot_or_del(new /obj/item/clothing/under/color/black(src), slot_w_uniform)
+ equip_to_slot_or_del(new /obj/item/clothing/mask/gas/voice/space_ninja(src), slot_wear_mask)
+ equip_to_slot_or_del(new /obj/item/device/flashlight(src), slot_belt)
+
var/obj/item/weapon/rig/light/ninja/ninjasuit = new(src)
// Make sure the ninja can actually equip the suit.
if(src.dna && src.dna.unique_enzymes)
- src << "Suit hardware locked to your DNA hash."
ninjasuit.locked_dna = src.dna.unique_enzymes
+ spawn(10)
+ src << "Suit hardware locked to your DNA hash."
else
ninjasuit.req_access = list()
equip_to_slot_or_del(ninjasuit,slot_back)
+
+ if(istype(wear_suit,/obj/item/weapon/rig))
+ var/obj/item/weapon/rig/rig = wear_suit
+ if(rig.air_supply)
+ internal = rig.air_supply
+ if(!internal && s_store)
+ internal = s_store
+ if(internal)
+ internals.icon_state = "internal1"
+
spawn(10)
ninjasuit.toggle_seals(src,1)
- equip_to_slot_or_del(new /obj/item/clothing/mask/gas/voice/space_ninja(src), slot_wear_mask)
- equip_to_slot_or_del(new /obj/item/device/flashlight(src), slot_belt)
- equip_to_slot_or_del(new /obj/item/weapon/tank/oxygen(src), slot_s_store)
- return 1
+ return 1
\ No newline at end of file
diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm
index 12d9278205a..68bf3935d86 100644
--- a/code/game/gamemodes/game_mode.dm
+++ b/code/game/gamemodes/game_mode.dm
@@ -155,7 +155,7 @@
for(var/mob/M in player_list)
if(M.mind)
- pltext += printplayer(M.mind)
+ pltext += print_player_lite(M.mind)
if(M.client)
clients++
if(ishuman(M))
@@ -183,7 +183,7 @@
if(isobserver(M))
ghosts++
- var/text = "A round of [src.name] has ended."
+ var/text = ""
if(surviving_total > 0)
text += "
There [surviving_total>1 ? "were [surviving_total] survivors" : "was one survivor"]"
text += " ([escaped_total>0 ? escaped_total : "none"] [emergency_shuttle.evac ? "escaped" : "transferred"]) and [ghosts] ghosts.
"
@@ -526,7 +526,7 @@ proc/get_nt_opposed()
player.current << "Objective #[obj_count]: [objective.explanation_text]"
obj_count++
-/datum/game_mode/proc/printplayer(var/datum/mind/ply)
+/datum/game_mode/proc/print_player_lite(var/datum/mind/ply)
var/role = ply.assigned_role == "MODE" ? "\improper[ply.special_role]" : "\improper[ply.assigned_role]"
var/text = "
[ply.name] ([ply.key]) as \a [role] ("
if(ply.current)
@@ -540,6 +540,11 @@ proc/get_nt_opposed()
text += "body destroyed"
text += ")"
+ return text
+
+/datum/game_mode/proc/print_player_full(var/datum/mind/ply)
+ var/text = print_player_lite(ply)
+
var/TC_uses = 0
var/uplink_true = 0
var/purchases = ""
@@ -547,9 +552,15 @@ proc/get_nt_opposed()
if(H && H.uplink_owner && H.uplink_owner == ply)
TC_uses += H.used_TC
uplink_true = 1
- for(var/log in H.purchase_log)
- purchases += "[log]"
+ var/list/refined_log = new()
+ for(var/datum/uplink_item/UI in H.purchase_log)
+ var/obj/I = new UI.path
+ refined_log.Add("[H.purchase_log[UI]]x\icon[I][I.name]")
+ del(I)
+ purchases = english_list(refined_log, nothing_text = "")
if(uplink_true)
- text += " (used [TC_uses] TC) [purchases]"
+ text += " (used [TC_uses] TC)"
+ if(purchases)
+ text += "
[purchases]"
return text
diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm
index d4d14c9120e..6f782176493 100644
--- a/code/game/gamemodes/gameticker.dm
+++ b/code/game/gamemodes/gameticker.dm
@@ -376,7 +376,7 @@ var/global/datum/controller/gameticker/ticker
/datum/controller/gameticker/proc/declare_completion()
- world << "
The round has ended."
+ world << "
A round of [mode.name] has ended!
"
for(var/mob/Player in player_list)
if(Player.mind && !isnewplayer(Player))
if(Player.stat != DEAD)
diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm
index 980b7862003..8fd46fc8970 100644
--- a/code/game/gamemodes/nuclear/nuclear.dm
+++ b/code/game/gamemodes/nuclear/nuclear.dm
@@ -313,7 +313,7 @@ var/global/list/turf/synd_spawn = list()
var/text = "The mercenaries were:"
for(var/datum/mind/syndicate in syndicates)
- text += printplayer(syndicate)
+ text += print_player_full(syndicate)
world << text
return 1
diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm
index 7ac8ffd671f..2e0f8b91fa3 100644
--- a/code/game/gamemodes/traitor/traitor.dm
+++ b/code/game/gamemodes/traitor/traitor.dm
@@ -180,7 +180,7 @@
var/text = "The traitors were:"
for(var/datum/mind/traitor in traitors)
var/traitorwin = 1
- text += printplayer(traitor)
+ text += print_player_full(traitor)
if(traitor.objectives.len)//If the traitor had no objectives, don't need to process this.
var/count = 1
diff --git a/code/game/jobs/job/medical.dm b/code/game/jobs/job/medical.dm
index 085ca17a80b..a63363f779c 100644
--- a/code/game/jobs/job/medical.dm
+++ b/code/game/jobs/job/medical.dm
@@ -27,16 +27,14 @@
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/chief_medical_officer(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/device/pda/heads/cmo(H), slot_belt)
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat/cmo(H), slot_wear_suit)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/adv(H), slot_l_hand)
- H.equip_to_slot_or_del(new /obj/item/device/flashlight/pen(H), slot_s_store)
if(H.backbag == 1)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand)
else
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack)
return 1
-
-
+ H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat/cmo(H), slot_wear_suit)
+ H.equip_to_slot_or_del(new /obj/item/device/flashlight/pen(H), slot_s_store)
/datum/job/doctor
title = "Medical Doctor"
@@ -54,6 +52,8 @@
equip(var/mob/living/carbon/human/H)
if(!H) return 0
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_med(H), slot_l_ear)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes)
+ H.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/adv(H), slot_l_hand)
switch(H.backbag)
if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/medic(H), slot_back)
if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_med(H), slot_back)
@@ -68,8 +68,8 @@
H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat(H), slot_wear_suit)
H.equip_to_slot_or_del(new /obj/item/clothing/head/surgery/blue(H), slot_head)
if("Virologist")
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat/virologist(H), slot_wear_suit)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/virologist(H), slot_w_uniform)
+ H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat/virologist(H), slot_wear_suit)
H.equip_to_slot_or_del(new /obj/item/clothing/mask/surgical(H), slot_wear_mask)
switch(H.backbag)
if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/virology(H), slot_back)
@@ -90,14 +90,12 @@
else
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat(H), slot_wear_suit)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes)
- H.equip_to_slot_or_del(new /obj/item/device/pda/medical(H), slot_belt)
- H.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/adv(H), slot_l_hand)
- H.equip_to_slot_or_del(new /obj/item/device/flashlight/pen(H), slot_s_store)
if(H.backbag == 1)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand)
else
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack)
+ H.equip_to_slot_or_del(new /obj/item/device/pda/medical(H), slot_belt)
+ H.equip_to_slot_or_del(new /obj/item/device/flashlight/pen(H), slot_s_store)
return 1
@@ -123,13 +121,13 @@
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/chemist(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/device/pda/chemist(H), slot_belt)
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat/chemist(H), slot_wear_suit)
switch(H.backbag)
if(1) H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand)
if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/chemistry(H), slot_back)
if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_chem(H), slot_back)
if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack)
+ H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat/chemist(H), slot_wear_suit)
return 1
@@ -153,48 +151,15 @@
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/geneticist(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/device/pda/geneticist(H), slot_belt)
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat/genetics(H), slot_wear_suit)
- H.equip_to_slot_or_del(new /obj/item/device/flashlight/pen(H), slot_s_store)
switch(H.backbag)
if(1) H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand)
if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/genetics(H), slot_back)
if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_gen(H), slot_back)
if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack)
- return 1
-
-/*/datum/job/virologist
- title = "Virologist"
- flag = VIROLOGIST
- department_flag = MEDSCI
- faction = "Station"
- total_positions = 1
- spawn_positions = 1
- supervisors = "the chief medical officer"
- selection_color = "#ffeef0"
- access = list(access_medical, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics)
- minimal_access = list(access_medical, access_virology)
- alt_titles = list("Pathologist","Microbiologist")
-
-
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_med(H), slot_l_ear)
- switch(H.backbag)
- if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/medic(H), slot_back)
- if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_med(H), slot_back)
- if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/virologist(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/device/pda/viro(H), slot_belt)
- H.equip_to_slot_or_del(new /obj/item/clothing/mask/surgical(H), slot_wear_mask)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes)
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat/virologist(H), slot_wear_suit)
+ H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat/genetics(H), slot_wear_suit)
H.equip_to_slot_or_del(new /obj/item/device/flashlight/pen(H), slot_s_store)
- if(H.backbag == 1)
- H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand)
- else
- H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack)
- return 1*/
+ return 1
/datum/job/psychiatrist
title = "Psychiatrist"
@@ -224,10 +189,10 @@
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/psych/turtleneck(H), slot_w_uniform)
else
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat(H), slot_wear_suit)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/laceup(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/device/pda/medical(H), slot_belt)
if(H.backbag == 1)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand)
else
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack)
+ H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat(H), slot_wear_suit)
diff --git a/code/game/jobs/job/science.dm b/code/game/jobs/job/science.dm
index b18e8b8ec16..e387e0d4be0 100644
--- a/code/game/jobs/job/science.dm
+++ b/code/game/jobs/job/science.dm
@@ -25,7 +25,6 @@
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/research_director(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/device/pda/heads/rd(H), slot_belt)
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat(H), slot_wear_suit)
H.equip_to_slot_or_del(new /obj/item/weapon/clipboard(H), slot_l_hand)
switch(H.backbag)
if(1) H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand)
@@ -33,6 +32,7 @@
if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_tox(H), slot_back)
if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack)
+ H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat(H), slot_wear_suit)
return 1
@@ -58,13 +58,13 @@
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/scientist(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/device/pda/science(H), slot_belt)
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat/science(H), slot_wear_suit)
switch(H.backbag)
if(1) H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand)
if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/toxins(H), slot_back)
if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_tox(H), slot_back)
if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack)
+ H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat/science(H), slot_wear_suit)
return 1
@@ -89,16 +89,15 @@
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/scientist(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/device/pda/science(H), slot_belt)
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat/science(H), slot_wear_suit)
switch(H.backbag)
if(1) H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand)
if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/toxins(H), slot_back)
if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_tox(H), slot_back)
if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack)
+ H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat/science(H), slot_wear_suit)
return 1
-
/datum/job/roboticist
title = "Roboticist"
flag = ROBOTICIST
@@ -122,11 +121,10 @@
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/roboticist(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/device/pda/roboticist(H), slot_belt)
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat(H), slot_wear_suit)
-// H.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(H), slot_gloves)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/toolbox/mechanical(H), slot_l_hand)
if(H.backbag == 1)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand)
else
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack)
- return 1
+ H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat(H), slot_wear_suit)
+ return 1
\ No newline at end of file
diff --git a/code/game/jobs/job/security.dm b/code/game/jobs/job/security.dm
index cc0628c2849..6d25f7fe58b 100644
--- a/code/game/jobs/job/security.dm
+++ b/code/game/jobs/job/security.dm
@@ -106,17 +106,8 @@
H.equip_to_slot_or_del(new /obj/item/clothing/under/det(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/device/pda/detective(H), slot_belt)
-/* var/obj/item/clothing/mask/cigarette/CIG = new /obj/item/clothing/mask/cigarette(H)
- CIG.light("")
- H.equip_to_slot_or_del(CIG, slot_wear_mask) */
H.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(H), slot_gloves)
- if(H.mind.role_alt_title && H.mind.role_alt_title == "Forensic Technician")
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/forensics/blue(H), slot_wear_suit)
- else
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/det_suit(H), slot_wear_suit)
- H.equip_to_slot_or_del(new /obj/item/clothing/head/det_hat(H), slot_head)
H.equip_to_slot_or_del(new /obj/item/weapon/flame/lighter/zippo(H), slot_l_store)
-
if(H.backbag == 1)//Why cant some of these things spawn in his office?
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/evidence(H), slot_l_hand)
@@ -125,7 +116,11 @@
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/evidence(H), slot_in_backpack)
H.equip_to_slot_or_del(new /obj/item/device/detective_scanner(H), slot_in_backpack)
-
+ if(H.mind.role_alt_title && H.mind.role_alt_title == "Forensic Technician")
+ H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/forensics/blue(H), slot_wear_suit)
+ else
+ H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/det_suit(H), slot_wear_suit)
+ H.equip_to_slot_or_del(new /obj/item/clothing/head/det_hat(H), slot_head)
return 1
diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm
index 326f705a5da..b3918713e79 100644
--- a/code/game/jobs/job_controller.dm
+++ b/code/game/jobs/job_controller.dm
@@ -379,16 +379,17 @@ var/global/datum/controller/occupations/job_master
continue
if(G.slot && !(G.slot in custom_equip_slots))
- if(H.equip_to_slot_or_del(new G.path(H), G.slot))
+ // This is a miserable way to fix the loadout overwrite bug, but the alternative requires
+ // adding an arg to a bunch of different procs. Will look into it after this merge. ~ Z
+ if(G.slot == slot_wear_mask || G.slot == slot_wear_suit || G.slot == slot_head)
+ custom_equip_leftovers += thing
+ else if(H.equip_to_slot_or_del(new G.path(H), G.slot))
H << "\blue Equipping you with [thing]!"
custom_equip_slots.Add(G.slot)
else
custom_equip_leftovers.Add(thing)
-
else
spawn_in_storage += thing
-
-
//Equip job items.
job.equip(H)
job.apply_fingerprints(H)
diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm
index e70875941e6..6f9a2c4b959 100644
--- a/code/game/machinery/autolathe.dm
+++ b/code/game/machinery/autolathe.dm
@@ -31,7 +31,7 @@
var/dat = "Autolathe Control Panel
"
- if(!panel_open)
+ if(panel_open == 0)
dat += ""
var/material_top = ""
var/material_bottom = "
"
@@ -48,41 +48,36 @@
index++
if(R.hidden && !hacked || (show_category != "All" && show_category != R.category))
continue
+ var/can_make = 1
+ var/material_string = ""
+ var/multiplier_string = ""
+ var/max_sheets
+ var/comma
+ if(!R.resources || !R.resources.len)
+ material_string = "No resources required."
+ else
+ //Make sure it's buildable and list requires resources.
+ for(var/material in R.resources)
+ var/sheets = round(stored_material[material]/R.resources[material])
+ if(isnull(max_sheets) || max_sheets > sheets)
+ max_sheets = sheets
+ if(!isnull(stored_material[material]) && stored_material[material] < R.resources[material])
+ can_make = 0
+ if(!comma)
+ comma = 1
+ else
+ material_string += ", "
+ material_string += "[R.resources[material]] [material]"
+ material_string += ".
"
+ //Build list of multipliers for sheets.
+ if(R.is_stack)
+ if(max_sheets && max_sheets > 0)
+ multiplier_string += "
"
+ for(var/i = 5;i\[x[i]\]"
+ multiplier_string += "\[x[max_sheets]\]"
- var/can_make = 1
- var/material_string = ""
- var/multiplier_string = ""
- var/max_sheets
-
- var/comma
- if(!R.resources || !R.resources.len)
- material_string = "No resources required."
- else
-
- //Make sure it's buildable and list requires resources.
- for(var/material in R.resources)
- var/sheets = round(stored_material[material]/R.resources[material])
- if(isnull(max_sheets) || max_sheets > sheets)
- max_sheets = sheets
-
- if(!isnull(stored_material[material]) && stored_material[material] < R.resources[material])
- can_make = 0
- if(!comma)
- comma = 1
- else
- material_string += ", "
- material_string += "[R.resources[material]] [material]"
- material_string += ".
"
-
- //Build list of multipliers for sheets.
- if(R.is_stack)
- if(max_sheets && max_sheets > 0)
- multiplier_string += "
"
- for(var/i = 5;i\[x[i]\]"
- multiplier_string += "\[x[max_sheets]\]"
-
- dat += "| [R.hidden ? "*" : ""][can_make ? "" : ""][R.name][can_make ? "" : ""][R.hidden ? "*" : ""][multiplier_string] | [material_string] |
"
+ dat += "| [R.hidden ? "*" : ""][can_make ? "" : ""][R.name][can_make ? "" : ""][R.hidden ? "*" : ""][multiplier_string] | [material_string] |
"
dat += "
"
//Hacking.
diff --git a/code/game/machinery/computer/HolodeckControl.dm b/code/game/machinery/computer/HolodeckControl.dm
index 984d6816ce4..1c9fe7cfe5a 100644
--- a/code/game/machinery/computer/HolodeckControl.dm
+++ b/code/game/machinery/computer/HolodeckControl.dm
@@ -19,11 +19,19 @@ var/global/list/holodeck_programs = list(
name = "Holodeck Control Computer"
desc = "A computer used to control a nearby holodeck."
icon_state = "holocontrol"
+
+ use_power = 1
+ active_power_usage = 8000 //8kW for the scenery + 500W per holoitem
+ var/item_power_usage = 500
+
var/area/linkedholodeck = null
var/area/target = null
var/active = 0
var/list/holographic_items = list()
+ var/list/holographic_mobs = list()
var/damaged = 0
+ var/safety_disabled = 0
+ var/mob/last_to_emag = null
var/last_change = 0
var/list/supported_programs = list( \
"Empty Court" = "emptycourt", \
@@ -38,84 +46,111 @@ var/global/list/holodeck_programs = list(
"Theatre" = "theatre", \
"Meeting Hall" = "meetinghall" \
)
- var/list/restricted_programs = list("Atmospheric Burn Simulation" = "burntest", "ildlife Simulation" = "wildlifecarp")
+ var/list/restricted_programs = list("Atmospheric Burn Simulation" = "burntest", "Wildlife Simulation" = "wildlifecarp")
- attack_ai(var/mob/user as mob)
- return src.attack_hand(user)
+/obj/machinery/computer/HolodeckControl/attack_ai(var/mob/user as mob)
+ return src.attack_hand(user)
- attack_hand(var/mob/user as mob)
+/obj/machinery/computer/HolodeckControl/attack_hand(var/mob/user as mob)
- if(..())
- return
- user.set_machine(src)
- var/dat
+ if(..())
+ return
+ user.set_machine(src)
+ var/dat
- dat += "Holodeck Control System
"
- dat += "
Current Loaded Programs:
"
- for(var/prog in supported_programs)
- dat += "(([prog]))
"
+ dat += "Holodeck Control System
"
+ dat += "
Current Loaded Programs:
"
+ for(var/prog in supported_programs)
+ dat += "(([prog]))
"
- dat += "Please ensure that only holographic weapons are used in the holodeck if a combat simulation has been loaded.
"
+ dat += "Please ensure that only holographic weapons are used in the holodeck if a combat simulation has been loaded.
"
- if(issilicon(user))
- if(emagged)
- dat += "(Re-Enable Safety Protocols?)
"
+ if(issilicon(user))
+ if(safety_disabled)
+ if (emagged)
+ dat += "ERROR: Cannot re-enable Safety Protocols.
"
else
- dat += "(Override Safety Protocols?)
"
-
- if(emagged)
- for(var/prog in restricted_programs)
- dat += "(Begin [prog])
"
- dat += "Ensure the holodeck is empty before testing.
"
- dat += "
"
- dat += "Safety Protocols are DISABLED
"
+ dat += "(Re-Enable Safety Protocols?)
"
else
- dat += "Safety Protocols are ENABLED
"
+ dat += "(Override Safety Protocols?)
"
- user << browse(dat, "window=computer;size=400x500")
- onclose(user, "computer")
+ if(safety_disabled)
+ for(var/prog in restricted_programs)
+ dat += "(Begin [prog])
"
+ dat += "Ensure the holodeck is empty before testing.
"
+ dat += "
"
+ dat += "Safety Protocols are DISABLED
"
+ else
+ dat += "Safety Protocols are ENABLED
"
+ user << browse(dat, "window=computer;size=400x500")
+ onclose(user, "computer")
+
+ return
+
+
+/obj/machinery/computer/HolodeckControl/Topic(href, href_list)
+ if(..())
return
+ if((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon)))
+ usr.set_machine(src)
+ if(href_list["program"])
+ var/prog = href_list["program"]
+ if(prog in holodeck_programs)
+ target = locate(holodeck_programs[prog])
+ if(target)
+ loadProgram(target)
- Topic(href, href_list)
- if(..())
- return
- if((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon)))
- usr.set_machine(src)
+ else if(href_list["AIoverride"])
+ if(!issilicon(usr))
+ return
+
+ if(safety_disabled && emagged)
+ return //if a traitor has gone through the trouble to emag the thing, let them keep it.
+
+ safety_disabled = !safety_disabled
+ update_projections()
+ if(safety_disabled)
+ message_admins("[key_name_admin(usr)] overrode the holodeck's safeties")
+ log_game("[key_name(usr)] overrided the holodeck's safeties")
+ else
+ message_admins("[key_name_admin(usr)] restored the holodeck's safeties")
+ log_game("[key_name(usr)] restored the holodeck's safeties")
- if(href_list["program"])
- var/prog = href_list["program"]
- if(prog in holodeck_programs)
- target = locate(holodeck_programs[prog])
- if(target)
- loadProgram(target)
-
- else if(href_list["AIoverride"])
- if(!issilicon(usr)) return
- emagged = !emagged
- if(emagged)
- message_admins("[key_name_admin(usr)] overrode the holodeck's safeties")
- log_game("[key_name(usr)] overrided the holodeck's safeties")
- else
- message_admins("[key_name_admin(usr)] restored the holodeck's safeties")
- log_game("[key_name(usr)] restored the holodeck's safeties")
-
- src.add_fingerprint(usr)
- src.updateUsrDialog()
- return
-
-
-/obj/machinery/computer/HolodeckControl/attackby(var/obj/item/weapon/D as obj, var/mob/user as mob)
- if(istype(D, /obj/item/weapon/card/emag) && !emagged)
- playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1)
- emagged = 1
- user << "\blue You vastly increase projector power and override the safety and security protocols."
- user << "Warning. Automatic shutoff and derezing protocols have been corrupted. Please call Nanotrasen maintenance and do not use the simulator."
- log_game("[key_name(usr)] emagged the Holodeck Control Computer")
+ src.add_fingerprint(usr)
src.updateUsrDialog()
return
+/obj/machinery/computer/HolodeckControl/attackby(var/obj/item/weapon/D as obj, var/mob/user as mob)
+ if(istype(D, /obj/item/weapon/card/emag))
+ playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1)
+ last_to_emag = user //emag again to change the owner
+ if (!emagged)
+ emagged = 1
+ safety_disabled = 1
+ update_projections()
+ user << "You vastly increase projector power and override the safety and security protocols."
+ user << "Warning. Automatic shutoff and derezing protocols have been corrupted. Please call Nanotrasen maintenance and do not use the simulator."
+ log_game("[key_name(usr)] emagged the Holodeck Control Computer")
+ src.updateUsrDialog()
+ return
+
+/obj/machinery/computer/HolodeckControl/proc/update_projections()
+ if (safety_disabled)
+ item_power_usage = 2500
+ for(var/obj/item/weapon/holo/esword/H in linkedholodeck)
+ H.damtype = BRUTE
+ else
+ item_power_usage = initial(item_power_usage)
+ for(var/obj/item/weapon/holo/esword/H in linkedholodeck)
+ H.damtype = initial(H.damtype)
+
+ for(var/mob/living/simple_animal/hostile/carp/holodeck/C in holographic_mobs)
+ C.set_safety(!safety_disabled)
+ if (last_to_emag)
+ C.friends = list(last_to_emag)
+
/obj/machinery/computer/HolodeckControl/New()
..()
linkedholodeck = locate(/area/holodeck/alphadeck)
@@ -148,14 +183,27 @@ var/global/list/holodeck_programs = list(
emergencyShutdown()
..()
+/obj/machinery/computer/HolodeckControl/power_change()
+ var/oldstat
+ ..()
+ if (stat != oldstat && active && (stat & NOPOWER))
+ emergencyShutdown()
+
/obj/machinery/computer/HolodeckControl/process()
for(var/item in holographic_items) // do this first, to make sure people don't take items out when power is down.
if(!(get_turf(item) in linkedholodeck))
derez(item, 0)
-
+
+ if (!safety_disabled)
+ for(var/mob/living/simple_animal/hostile/carp/holodeck/C in holographic_mobs)
+ if (get_area(C.loc) != linkedholodeck)
+ holographic_mobs -= C
+ C.derez()
+
if(!..())
return
if(active)
+ use_power(item_power_usage * (holographic_items.len + holographic_mobs.len))
if(!checkInteg(linkedholodeck))
damaged = 1
@@ -163,6 +211,7 @@ var/global/list/holodeck_programs = list(
if(target)
loadProgram(target)
active = 0
+ use_power = 1
for(var/mob/M in range(10,src))
M.show_message("The holodeck overloads!")
@@ -199,6 +248,7 @@ var/global/list/holodeck_programs = list(
return 1
+//Why is it called toggle if it doesn't toggle?
/obj/machinery/computer/HolodeckControl/proc/togglePower(var/toggleOn = 0)
if(toggleOn)
@@ -218,12 +268,14 @@ var/global/list/holodeck_programs = list(
T.hotspot_expose(50000,50000,1)
active = 1
+ use_power = 2
else
for(var/item in holographic_items)
derez(item)
var/area/targetsource = locate(/area/holodeck/source_plating)
targetsource.copy_contents_to(linkedholodeck , 1)
active = 0
+ use_power = 1
/obj/machinery/computer/HolodeckControl/proc/loadProgram(var/area/A)
@@ -238,22 +290,20 @@ var/global/list/holodeck_programs = list(
last_change = world.time
active = 1
+ use_power = 2
for(var/item in holographic_items)
derez(item)
+ for(var/mob/living/simple_animal/hostile/carp/holodeck/C in holographic_mobs)
+ holographic_mobs -= C
+ C.derez()
+
for(var/obj/effect/decal/cleanable/blood/B in linkedholodeck)
del(B)
- for(var/mob/living/simple_animal/hostile/carp/C in linkedholodeck)
- del(C)
-
holographic_items = A.copy_contents_to(linkedholodeck , 1)
- if(emagged)
- for(var/obj/item/weapon/holo/esword/H in linkedholodeck)
- H.damtype = BRUTE
-
spawn(30)
for(var/obj/effect/landmark/L in linkedholodeck)
if(L.name=="Atmospheric Test Start")
@@ -266,13 +316,22 @@ var/global/list/holodeck_programs = list(
T.temperature = 5000
T.hotspot_expose(50000,50000,1)
if(L.name=="Holocarp Spawn")
- new /mob/living/simple_animal/hostile/carp(L.loc)
+ holographic_mobs += new /mob/living/simple_animal/hostile/carp/holodeck(L.loc)
+
+ if(L.name=="Holocarp Spawn Random")
+ if (prob(4)) //With 4 spawn points, carp should only appear 15% of the time.
+ holographic_mobs += new /mob/living/simple_animal/hostile/carp/holodeck(L.loc)
+
+ update_projections()
/obj/machinery/computer/HolodeckControl/proc/emergencyShutdown()
//Get rid of any items
for(var/item in holographic_items)
derez(item)
+ for(var/mob/living/simple_animal/hostile/carp/holodeck/C in holographic_mobs)
+ holographic_mobs -= C
+ C.derez()
//Turn it back to the regular non-holographic room
target = locate(/area/holodeck/source_plating)
if(target)
@@ -281,6 +340,7 @@ var/global/list/holodeck_programs = list(
var/area/targetsource = locate(/area/holodeck/source_plating)
targetsource.copy_contents_to(linkedholodeck , 1)
active = 0
+ use_power = 1
@@ -327,17 +387,6 @@ var/global/list/holodeck_programs = list(
/obj/structure/table/holotable/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if (istype(W, /obj/item/weapon/grab) && get_dist(src,user)<2)
- var/obj/item/weapon/grab/G = W
- if(G.state<2)
- user << "\red You need a better grip to do that!"
- return
- G.affecting.loc = src.loc
- G.affecting.Weaken(5)
- visible_message("\red [G.assailant] puts [G.affecting] on the table.")
- del(W)
- return
-
if (istype(W, /obj/item/weapon/wrench))
user << "It's a holotable! There are no bolts!"
return
@@ -424,13 +473,13 @@ var/global/list/holodeck_programs = list(
icon_state = "sword[item_color]"
w_class = 4
playsound(user, 'sound/weapons/saberon.ogg', 50, 1)
- user << "\blue [src] is now active."
+ user << "[src] is now active."
else
force = 3
icon_state = "sword0"
w_class = 2
playsound(user, 'sound/weapons/saberoff.ogg', 50, 1)
- user << "\blue [src] can now be concealed."
+ user << "[src] can now be concealed."
if(istype(user,/mob/living/carbon/human))
var/mob/living/carbon/human/H = user
@@ -463,16 +512,16 @@ var/global/list/holodeck_programs = list(
if (istype(W, /obj/item/weapon/grab) && get_dist(src,user)<2)
var/obj/item/weapon/grab/G = W
if(G.state<2)
- user << "\red You need a better grip to do that!"
+ user << "You need a better grip to do that!"
return
G.affecting.loc = src.loc
G.affecting.Weaken(5)
- visible_message("\red [G.assailant] dunks [G.affecting] into the [src]!", 3)
+ visible_message("[G.assailant] dunks [G.affecting] into the [src]!", 3)
del(W)
return
else if (istype(W, /obj/item) && get_dist(src,user)<2)
user.drop_item(src)
- visible_message("\blue [user] dunks [W] into the [src]!", 3)
+ visible_message("[user] dunks [W] into the [src]!", 3)
return
/obj/structure/holohoop/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
@@ -482,9 +531,9 @@ var/global/list/holodeck_programs = list(
return
if(prob(50))
I.loc = src.loc
- visible_message("\blue Swish! \the [I] lands in \the [src].", 3)
+ visible_message("Swish! \the [I] lands in \the [src].", 3)
else
- visible_message("\red \the [I] bounces off of \the [src]'s rim!", 3)
+ visible_message("\The [I] bounces off of \the [src]'s rim!", 3)
return 0
else
return ..(mover, target, height, air_group)
@@ -577,4 +626,40 @@ var/global/list/holodeck_programs = list(
/obj/structure/rack/holorack/attackby(obj/item/weapon/W as obj, mob/user as mob)
if (istype(W, /obj/item/weapon/wrench))
user << "It's a holorack! You can't unwrench it!"
- return
\ No newline at end of file
+ return
+
+//Holocarp
+
+/mob/living/simple_animal/hostile/carp/holodeck
+ icon = 'icons/mob/AI.dmi'
+ icon_state = "holo4"
+ icon_living = "holo4"
+ icon_dead = "holo4"
+ icon_gib = null
+ meat_amount = 0
+ meat_type = null
+
+/mob/living/simple_animal/hostile/carp/holodeck/proc/set_safety(var/safe)
+ if (safe)
+ faction = "neutral"
+ melee_damage_lower = 0
+ melee_damage_upper = 0
+ wall_smash = 0
+ destroy_surroundings = 0
+ else
+ faction = "carp"
+ melee_damage_lower = initial(melee_damage_lower)
+ melee_damage_upper = initial(melee_damage_upper)
+ wall_smash = initial(wall_smash)
+ destroy_surroundings = initial(destroy_surroundings)
+
+/mob/living/simple_animal/hostile/carp/holodeck/gib()
+ derez() //holograms can't gib
+
+/mob/living/simple_animal/hostile/carp/holodeck/death()
+ ..()
+ derez()
+
+/mob/living/simple_animal/hostile/carp/holodeck/proc/derez()
+ visible_message("\The [src] fades away!")
+ del(src)
diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm
index 4342778f9af..76d1e0fb939 100644
--- a/code/game/machinery/computer/card.dm
+++ b/code/game/machinery/computer/card.dm
@@ -40,13 +40,13 @@
if(scan)
usr << "You remove \the [scan] from \the [src]."
scan.loc = get_turf(src)
- if(!usr.get_active_hand())
+ if(!usr.get_active_hand() && istype(usr,/mob/living/carbon/human))
usr.put_in_hands(scan)
scan = null
else if(modify)
usr << "You remove \the [modify] from \the [src]."
modify.loc = get_turf(src)
- if(!usr.get_active_hand())
+ if(!usr.get_active_hand() && istype(usr,/mob/living/carbon/human))
usr.put_in_hands(modify)
modify = null
else
diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm
index a03edba52ad..1a7a8ea33a2 100644
--- a/code/game/machinery/computer/medical.dm
+++ b/code/game/machinery/computer/medical.dm
@@ -26,7 +26,7 @@
if(scan)
usr << "You remove \the [scan] from \the [src]."
scan.loc = get_turf(src)
- if(!usr.get_active_hand())
+ if(!usr.get_active_hand() && istype(usr,/mob/living/carbon/human))
usr.put_in_hands(scan)
scan = null
else
diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm
index e97d9f6865d..5aed27cc564 100644
--- a/code/game/machinery/computer/security.dm
+++ b/code/game/machinery/computer/security.dm
@@ -32,7 +32,7 @@
if(scan)
usr << "You remove \the [scan] from \the [src]."
scan.loc = get_turf(src)
- if(!usr.get_active_hand())
+ if(!usr.get_active_hand() && istype(usr,/mob/living/carbon/human))
usr.put_in_hands(scan)
scan = null
else
diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm
index c2a6d996a1e..d1e3887e4b9 100644
--- a/code/game/machinery/cryopod.dm
+++ b/code/game/machinery/cryopod.dm
@@ -15,6 +15,7 @@
icon = 'icons/obj/Cryogenic2.dmi'
icon_state = "cellconsole"
circuit = "/obj/item/weapon/circuitboard/cryopodcontrol"
+ density = 0
interact_offline = 1
var/mode = null
diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm
index de38264cd3d..c3ab77d74a1 100644
--- a/code/game/machinery/doors/door.dm
+++ b/code/game/machinery/doors/door.dm
@@ -31,7 +31,7 @@
var/hitsound = 'sound/weapons/smash.ogg' //sound door makes when hit with a weapon
//Multi-tile doors
- set_dir(EAST)
+ dir = EAST
var/width = 1
/obj/machinery/door/New()
diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm
index 66708db7f7b..dc98e0ce7e9 100644
--- a/code/game/machinery/hologram.dm
+++ b/code/game/machinery/hologram.dm
@@ -81,13 +81,17 @@ var/const/HOLOPAD_MODE = 0
/*This is the proc for special two-way communication between AI and holopad/people talking near holopad.
For the other part of the code, check silicon say.dm. Particularly robot talk.*/
-/obj/machinery/hologram/holopad/hear_talk(mob/living/M, text, verb)
+/obj/machinery/hologram/holopad/hear_talk(mob/living/M, text, verb, datum/language/speaking)
if(M&&hologram&&master)//Master is mostly a safety in case lag hits or something.
- if(!master.say_understands(M))//The AI will be able to understand most mobs talking through the holopad.
+ if(!master.say_understands(M, speaking))//The AI will be able to understand most mobs talking through the holopad.
text = stars(text)
var/name_used = M.GetVoice()
//This communication is imperfect because the holopad "filters" voices and is only designed to connect to the master only.
- var/rendered = "Holopad received, [name_used] [verb], \"[text]\""
+ var/rendered
+ if(speaking)
+ rendered = "Holopad received, [name_used] [speaking.format_message(text, verb)]"
+ else
+ rendered = "Holopad received, [name_used] [verb], \"[text]\""
master.show_message(rendered, 2)
return
diff --git a/code/game/machinery/jukebox.dm b/code/game/machinery/jukebox.dm
index 4bca09fdcc9..4301d344950 100644
--- a/code/game/machinery/jukebox.dm
+++ b/code/game/machinery/jukebox.dm
@@ -34,6 +34,7 @@ datum/track/New(var/title_name, var/audio)
/obj/machinery/media/jukebox/Del()
StopPlaying()
+ ..()
/obj/machinery/media/jukebox/power_change()
if(!powered(power_channel) || !anchored)
diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm
index 33334ffe04d..8d4d4ac2df2 100644
--- a/code/game/machinery/portable_turret.dm
+++ b/code/game/machinery/portable_turret.dm
@@ -338,6 +338,10 @@
die() //the death process :(
/obj/machinery/porta_turret/bullet_act(obj/item/projectile/Proj)
+
+ if(Proj.damage_type == HALLOSS)
+ return
+
if(on)
if(!attacked && !emagged)
attacked = 1
@@ -358,7 +362,7 @@
check_records = prob(50)
check_weapons = prob(50)
check_access = prob(20) // check_access is a pretty big deal, so it's least likely to get turned on
- check_anomalies = prob(50)
+ check_anomalies = prob(50)
if(prob(5))
emagged = 1
diff --git a/code/game/machinery/turrets.dm b/code/game/machinery/turrets.dm
index 29811e1a18d..cb76c7921a7 100644
--- a/code/game/machinery/turrets.dm
+++ b/code/game/machinery/turrets.dm
@@ -89,6 +89,8 @@
return
/obj/machinery/turret/bullet_act(var/obj/item/projectile/Proj)
+ if(Proj.damage_type == HALLOSS)
+ return
take_damage(Proj.damage)
..()
return
@@ -297,6 +299,8 @@
popping = 0
/obj/machinery/turret/bullet_act(var/obj/item/projectile/Proj)
+ if(Proj.damage_type == HALLOSS)
+ return
src.health -= Proj.damage
..()
if(prob(45) && Proj.damage > 0) src.spark_system.start()
@@ -376,6 +380,8 @@
bullet_act(var/obj/item/projectile/Proj)
+ if(Proj.damage_type == HALLOSS)
+ return
take_damage(Proj.damage)
..()
return
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index 031077d2eab..d964529c02a 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -492,14 +492,17 @@
src.visible_message("The [src.name] armor deflects the projectile")
src.log_append_to_last("Armor saved.")
return
- var/ignore_threshold
- if(Proj.flag == "taser")
- use_power(200)
- return
- if(istype(Proj, /obj/item/projectile/beam/pulse))
- ignore_threshold = 1
- src.take_damage(Proj.damage,Proj.flag)
- src.check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST,MECHA_INT_SHORT_CIRCUIT),ignore_threshold)
+
+ if(Proj.damage_type == HALLOSS)
+ use_power(Proj.agony * 5)
+
+ if(!(Proj.nodamage))
+ var/ignore_threshold
+ if(istype(Proj, /obj/item/projectile/beam/pulse))
+ ignore_threshold = 1
+ src.take_damage(Proj.damage,Proj.flag)
+ src.check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST,MECHA_INT_SHORT_CIRCUIT),ignore_threshold)
+
Proj.on_hit(src)
return
diff --git a/code/game/objects/effects/decals/contraband.dm b/code/game/objects/effects/decals/contraband.dm
index 68f60816fa7..121c4d16678 100644
--- a/code/game/objects/effects/decals/contraband.dm
+++ b/code/game/objects/effects/decals/contraband.dm
@@ -23,9 +23,63 @@
name += " - No. [serial_number]"
..(loc)
+//Places the poster on a wall
+/obj/item/weapon/contraband/poster/afterattack(var/atom/A, var/mob/user, var/adjacent, var/clickparams)
+ if (!adjacent)
+ return
+
+ //must place on a wall and user must not be inside a closet/mecha/whatever
+ var/turf/W = A
+ if (!iswall(W) || !isturf(user.loc))
+ user << "\red You can't place this here!"
+ return
+
+ var/placement_dir = get_dir(user, W)
+ if (!(placement_dir in cardinal))
+ user << "You must stand directly in front of the wall you wish to place that on."
+ return
+
+ //just check if there is a poster on or adjacent to the wall
+ var/stuff_on_wall = 0
+ if (locate(/obj/structure/sign/poster) in W)
+ stuff_on_wall = 1
+
+ //crude, but will cover most cases. We could do stuff like check pixel_x/y but it's not really worth it.
+ for (var/dir in cardinal)
+ var/turf/T = get_step(W, dir)
+ if (locate(/obj/structure/sign/poster) in T)
+ stuff_on_wall = 1
+ break
+
+ if (stuff_on_wall)
+ user << "There is already a poster there!"
+ return
+
+ user << "You start placing the poster on the wall..." //Looks like it's uncluttered enough. Place the poster.
+
+ var/obj/structure/sign/poster/P = new(user.loc, placement_dir=get_dir(user, W), serial=serial_number)
+
+ flick("poster_being_set", P)
+ //playsound(W, 'sound/items/poster_being_created.ogg', 100, 1) //why the hell does placing a poster make printer sounds?
+
+ var/oldsrc = src //get a reference to src so we can delete it after detaching ourselves
+ src = null
+ spawn(17)
+ if(!P) return
+
+ if(iswall(W) && user && P.loc == user.loc) //Let's check if everything is still there
+ user << "You place the poster!"
+ else
+ P.roll_and_drop(P.loc)
+
+ del(oldsrc) //delete it now to cut down on sanity checks afterwards. Agouri's code supports rerolling it anyway
+
+//I'm
+/obj/structure/sign/poster/proc/placement_check()
+
//############################## THE ACTUAL DECALS ###########################
-obj/structure/sign/poster
+/obj/structure/sign/poster
name = "poster"
desc = "A large piece of space-resistant printed paper. "
icon = 'icons/obj/contraband.dmi'
@@ -34,22 +88,42 @@ obj/structure/sign/poster
var/poster_type //So mappers can specify a desired poster
var/ruined = 0
-obj/structure/sign/poster/New(var/serial)
- var/designtype
- if (poster_type)
- designtype = text2path(poster_type)
- else
- if(serial_number == loc)
- serial_number = rand(1, poster_designs.len) //This is for the mappers that want individual posters without having to use rolled posters.
- designtype = poster_designs[serial_number]
-
- var/datum/poster/design=new designtype()
- name += " - [design.name]"
- desc += " [design.desc]"
- icon_state = design.icon_state // poster[serial_number]
- ..()
+/obj/structure/sign/poster/New(var/newloc, var/placement_dir=null, var/serial=null)
+ ..(newloc)
-obj/structure/sign/poster/attackby(obj/item/weapon/W as obj, mob/user as mob)
+ if(!serial)
+ serial = rand(1, poster_designs.len) //use a random serial if none is given
+
+ serial_number = serial
+ var/datum/poster/design = poster_designs[serial_number]
+ set_poster(design)
+
+ switch (placement_dir)
+ if (NORTH)
+ pixel_x = 0
+ pixel_y = 32
+ if (SOUTH)
+ pixel_x = 0
+ pixel_y = -32
+ if (EAST)
+ pixel_x = 32
+ pixel_y = 0
+ if (WEST)
+ pixel_x = -32
+ pixel_y = 0
+
+/obj/structure/sign/poster/initialize()
+ if (poster_type)
+ var/path = text2path(poster_type)
+ var/datum/poster/design = new path
+ set_poster(design)
+
+/obj/structure/sign/poster/proc/set_poster(var/datum/poster/design)
+ name = "[initial(name)] - [design.name]"
+ desc = "[initial(desc)] [design.desc]"
+ icon_state = design.icon_state // poster[serial_number]
+
+/obj/structure/sign/poster/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W, /obj/item/weapon/wirecutters))
playsound(loc, 'sound/items/Wirecutter.ogg', 100, 1)
if(ruined)
diff --git a/code/game/objects/effects/decals/posters/bs12.dm b/code/game/objects/effects/decals/posters/bs12.dm
index 73700472334..eef2b2e3bfc 100644
--- a/code/game/objects/effects/decals/posters/bs12.dm
+++ b/code/game/objects/effects/decals/posters/bs12.dm
@@ -234,12 +234,12 @@
name = "Security pinup"
desc = "This is a pin-up poster. A dark skinned white haired girl poses in the sunlight wearing a tank top with her stomach exposed. The text on the poster states \"M, Succubus of Security.\" and a lipstick mark stains the top right corner, as if kissed by the model herself."
- /datum/poster/bay_48
+/datum/poster/bay_48
icon_state="bsposter48"
name = "Borg pinup?"
desc = "This is a.. pin-up poster? It is a diagram on an old model of cyborg with a note scribbled in marker on the bottom, on the top there is a large XO written in red marker."
- /datum/poster/bay_49
+/datum/poster/bay_49
icon_state="bsposter49"
name = "Engineering recruitment"
desc = "This is a poster showing an engineer relaxing by a computer, the text states \"Living the life! Join Engineering today!\""
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 40a38621bef..98cc1a2f2fc 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -321,9 +321,7 @@
if(slot_l_ear)
if(H.l_ear)
return 0
- if( w_class < 2 )
- return 1
- if( !(slot_flags & SLOT_EARS) )
+ if( (w_class > 1) && !(slot_flags & SLOT_EARS) )
return 0
if( (slot_flags & SLOT_TWOEARS) && H.r_ear )
return 0
@@ -331,9 +329,7 @@
if(slot_r_ear)
if(H.r_ear)
return 0
- if( w_class < 2 )
- return 1
- if( !(slot_flags & SLOT_EARS) )
+ if( (w_class > 1) && !(slot_flags & SLOT_EARS) )
return 0
if( (slot_flags & SLOT_TWOEARS) && H.l_ear )
return 0
@@ -341,7 +337,7 @@
if(slot_w_uniform)
if(H.w_uniform)
return 0
- if(H.wear_suit)
+ if(H.wear_suit && (H.wear_suit.body_parts_covered & src.body_parts_covered))
if(!disable_warning)
H << "\The [H.wear_suit] is in the way."
return 0
diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm
index 6071c4054f8..6a25b46444f 100755
--- a/code/game/objects/items/devices/PDA/PDA.dm
+++ b/code/game/objects/items/devices/PDA/PDA.dm
@@ -1048,10 +1048,10 @@ var/global/list/obj/item/device/pda/PDAs = list()
// Do nothing
/obj/item/device/pda/proc/new_message_from_pda(var/obj/item/device/pda/sending_device, var/message)
- new_message(sending_device.name, sending_device.owner, sending_device.ownjob, message)
+ new_message(sending_device, sending_device.owner, sending_device.ownjob, message)
/obj/item/device/pda/proc/new_message(var/sending_unit, var/sender, var/sender_job, var/message)
- var/reception_message = "\icon[src] Message from [sender] ([sender_job]), \"[message]\" (Reply)"
+ var/reception_message = "\icon[src] Message from [sender] ([sender_job]), \"[message]\" (Reply)"
new_info(news_silent, newstone, reception_message)
log_pda("[usr] (PDA: [sending_unit]) sent \"[message]\" to [name]")
diff --git a/code/game/objects/items/devices/aicard.dm b/code/game/objects/items/devices/aicard.dm
index 6945729b5fe..7767ecd3074 100644
--- a/code/game/objects/items/devices/aicard.dm
+++ b/code/game/objects/items/devices/aicard.dm
@@ -67,7 +67,7 @@
/obj/item/device/aicard/Topic(href, href_list)
var/mob/U = usr
- if (!(get_turf(U) == get_turf(src)) || U.machine != src)//If they are not in range of 1 or less or their machine is not the card (ie, clicked on something else).
+ if (get_dist(get_turf(U),get_turf(src)) > 1 || U.machine != src)//If they are not in range of 1 or less or their machine is not the card (ie, clicked on something else).
U << browse(null, "window=aicard")
U.unset_machine()
return
diff --git a/code/game/objects/items/devices/paicard.dm b/code/game/objects/items/devices/paicard.dm
index fc41725ef46..2f3a9c682ec 100644
--- a/code/game/objects/items/devices/paicard.dm
+++ b/code/game/objects/items/devices/paicard.dm
@@ -169,19 +169,13 @@
| Transmit: |
- [(radio.wires & 4) ? "En" : "Dis" ]abled
+ | [radio.broadcasting ? "En" : "Dis" ]abled
|
| Receive: |
- [(radio.wires & 2) ? "En" : "Dis" ]abled
-
- |
-
-
- | Signal Pulser: |
- [(radio.wires & 1) ? "En" : "Dis" ]abled
+ | [radio.listening ? "En" : "Dis" ]abled
|
@@ -261,10 +255,11 @@
removePersonality()
if(href_list["wires"])
var/t1 = text2num(href_list["wires"])
- if (radio.wires & t1)
- radio.wires &= ~t1
- else
- radio.wires |= t1
+ switch(t1)
+ if(4)
+ radio.ToggleBroadcast()
+ if(2)
+ radio.ToggleReception()
if(href_list["setlaws"])
var/newlaws = copytext(sanitize(input("Enter any additional directives you would like your pAI personality to follow. Note that these directives will not override the personality's allegiance to its imprinted master. Conflicting directives will be ignored.", "pAI Directive Configuration", pai.pai_laws) as message),1,MAX_MESSAGE_LEN)
if(newlaws)
@@ -309,4 +304,10 @@
/obj/item/device/paicard/emp_act(severity)
for(var/mob/M in src)
M.emp_act(severity)
- ..()
\ No newline at end of file
+ ..()
+
+/obj/item/device/paicard/ex_act(severity)
+ if(pai)
+ pai.ex_act(severity)
+ else
+ del(src)
diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm
index dad292fd472..bb6f0d91f54 100644
--- a/code/game/objects/items/devices/radio/radio.dm
+++ b/code/game/objects/items/devices/radio/radio.dm
@@ -108,6 +108,12 @@
Speaker: [list ? "Engaged" : "Disengaged"]
"}
+/obj/item/device/radio/proc/ToggleBroadcast()
+ broadcasting = !broadcasting && !(wires.IsIndexCut(WIRE_TRANSMIT) || wires.IsIndexCut(WIRE_SIGNAL))
+
+/obj/item/device/radio/proc/ToggleReception()
+ listening = !listening && !(wires.IsIndexCut(WIRE_RECEIVE) || wires.IsIndexCut(WIRE_SIGNAL))
+
/obj/item/device/radio/Topic(href, href_list)
//..()
if (usr.stat || !on)
@@ -135,11 +141,11 @@
return
else if (href_list["talk"])
- broadcasting = !(wires.IsIndexCut(WIRE_TRANSMIT) || wires.IsIndexCut(WIRE_SIGNAL)) && text2num(href_list["talk"])
+ ToggleBroadcast()
else if (href_list["listen"])
var/chan_name = href_list["ch_name"]
if (!chan_name)
- listening = !(wires.IsIndexCut(WIRE_RECEIVE) || wires.IsIndexCut(WIRE_SIGNAL)) && text2num(href_list["listen"])
+ ToggleReception()
else
if (channels[chan_name] & FREQ_LISTENING)
channels[chan_name] &= ~FREQ_LISTENING
diff --git a/code/game/objects/items/devices/uplinks.dm b/code/game/objects/items/devices/uplinks.dm
index 35a80a1b4e1..9b58a812ce1 100644
--- a/code/game/objects/items/devices/uplinks.dm
+++ b/code/game/objects/items/devices/uplinks.dm
@@ -128,11 +128,7 @@ datum/nano_item_lists
var/mob/living/carbon/human/A = usr
A.put_in_any_hand_if_possible(I)
- if(istype(I ,/obj/item/weapon/storage/box/) && I.contents.len>0)
- for(var/atom/o in I)
- purchase_log += "\icon[o]"
- else
- purchase_log += "\icon[I]"
+ purchase_log[UI] = purchase_log[UI] + 1
return 1
return 0
@@ -192,7 +188,7 @@ datum/nano_item_lists
data["menu"] = nanoui_menu
data["nano_items"] = nanoui_items
data += nanoui_data
-
+
// update the ui if it exists, returns null if no ui is passed/found
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
diff --git a/code/game/objects/items/weapons/RCD.dm b/code/game/objects/items/weapons/RCD.dm
index 0427960398d..d08377a7042 100644
--- a/code/game/objects/items/weapons/RCD.dm
+++ b/code/game/objects/items/weapons/RCD.dm
@@ -59,7 +59,7 @@
if(!proximity) return
if(disabled && !isrobot(user))
return 0
- if(istype(A,/area/shuttle)||istype(A,/turf/space/transit))
+ if(istype(get_area(A),/area/shuttle)||istype(get_area(A),/turf/space/transit))
return 0
return alter_turf(A,user,(mode == 3))
diff --git a/code/game/objects/items/weapons/implants/implantcase.dm b/code/game/objects/items/weapons/implants/implantcase.dm
index 3dc57db6549..03776c78ded 100644
--- a/code/game/objects/items/weapons/implants/implantcase.dm
+++ b/code/game/objects/items/weapons/implants/implantcase.dm
@@ -3,128 +3,159 @@
/obj/item/weapon/implantcase
name = "Glass Case"
desc = "A case containing an implant."
+ icon = 'icons/obj/items.dmi'
icon_state = "implantcase-0"
item_state = "implantcase"
throw_speed = 1
throw_range = 5
w_class = 1.0
var/obj/item/weapon/implant/imp = null
- proc
- update()
+/obj/item/weapon/implantcase/proc/update()
+ if (src.imp)
+ src.icon_state = text("implantcase-[]", src.imp.item_color)
+ else
+ src.icon_state = "implantcase-0"
+ return
- update()
- if (src.imp)
- src.icon_state = text("implantcase-[]", src.imp.item_color)
+/obj/item/weapon/implantcase/attackby(obj/item/weapon/I as obj, mob/user as mob)
+ ..()
+ if (istype(I, /obj/item/weapon/pen))
+ var/t = input(user, "What would you like the label to be?", text("[]", src.name), null) as text
+ if (user.get_active_hand() != I)
+ return
+ if((!in_range(src, usr) && src.loc != user))
+ return
+ t = copytext(sanitize(t),1,MAX_MESSAGE_LEN)
+ if(t)
+ src.name = text("Glass Case - '[]'", t)
else
- src.icon_state = "implantcase-0"
- return
-
-
- attackby(obj/item/weapon/I as obj, mob/user as mob)
- ..()
- if (istype(I, /obj/item/weapon/pen))
- var/t = input(user, "What would you like the label to be?", text("[]", src.name), null) as text
- if (user.get_active_hand() != I)
+ src.name = "Glass Case"
+ else if(istype(I, /obj/item/weapon/reagent_containers/syringe))
+ if(!src.imp) return
+ if(!src.imp.allow_reagents) return
+ if(src.imp.reagents.total_volume >= src.imp.reagents.maximum_volume)
+ user << "\red [src] is full."
+ else
+ spawn(5)
+ I.reagents.trans_to(src.imp, 5)
+ user << "\blue You inject 5 units of the solution. The syringe now contains [I.reagents.total_volume] units."
+ else if (istype(I, /obj/item/weapon/implanter))
+ var/obj/item/weapon/implanter/M = I
+ if (M.imp)
+ if ((src.imp || M.imp.implanted))
return
- if((!in_range(src, usr) && src.loc != user))
- return
- t = copytext(sanitize(t),1,MAX_MESSAGE_LEN)
- if(t)
- src.name = text("Glass Case- '[]'", t)
- else
- src.name = "Glass Case"
- else if(istype(I, /obj/item/weapon/reagent_containers/syringe))
- if(!src.imp) return
- if(!src.imp.allow_reagents) return
- if(src.imp.reagents.total_volume >= src.imp.reagents.maximum_volume)
- user << "\red [src] is full."
- else
- spawn(5)
- I.reagents.trans_to(src.imp, 5)
- user << "\blue You inject 5 units of the solution. The syringe now contains [I.reagents.total_volume] units."
- else if (istype(I, /obj/item/weapon/implanter))
- if (I:imp)
- if ((src.imp || I:imp.implanted))
+ M.imp.loc = src
+ src.imp = M.imp
+ M.imp = null
+ src.update()
+ M.update()
+ else
+ if (src.imp)
+ if (M.imp)
return
- I:imp.loc = src
- src.imp = I:imp
- I:imp = null
- src.update()
- I:update()
- else
- if (src.imp)
- if (I:imp)
- return
- src.imp.loc = I
- I:imp = src.imp
- src.imp = null
- update()
- I:update()
- return
-
+ src.imp.loc = M
+ M.imp = src.imp
+ src.imp = null
+ update()
+ M.update()
+ return
/obj/item/weapon/implantcase/tracking
- name = "Glass Case- 'Tracking'"
+ name = "Glass Case - 'Tracking'"
desc = "A case containing a tracking implant."
- icon = 'icons/obj/items.dmi'
icon_state = "implantcase-b"
-
- New()
- src.imp = new /obj/item/weapon/implant/tracking( src )
- ..()
- return
-
+/obj/item/weapon/implantcase/tracking/New()
+ src.imp = new /obj/item/weapon/implant/tracking( src )
+ ..()
+ return
/obj/item/weapon/implantcase/explosive
- name = "Glass Case- 'Explosive'"
+ name = "Glass Case - 'Explosive'"
desc = "A case containing an explosive implant."
- icon = 'icons/obj/items.dmi'
icon_state = "implantcase-r"
-
- New()
- src.imp = new /obj/item/weapon/implant/explosive( src )
- ..()
- return
-
+/obj/item/weapon/implantcase/explosive/New()
+ src.imp = new /obj/item/weapon/implant/explosive( src )
+ ..()
+ return
/obj/item/weapon/implantcase/chem
- name = "Glass Case- 'Chem'"
+ name = "Glass Case - 'Chem'"
desc = "A case containing a chemical implant."
- icon = 'icons/obj/items.dmi'
icon_state = "implantcase-b"
-/obj/item/weapon/implantcase/chem/New()
+/obj/item/weapon/implantcase/chem/New()
src.imp = new /obj/item/weapon/implant/chem( src )
..()
return
/obj/item/weapon/implantcase/loyalty
- name = "Glass Case- 'Loyalty'"
+ name = "Glass Case - 'Loyalty'"
desc = "A case containing a loyalty implant."
- icon = 'icons/obj/items.dmi'
icon_state = "implantcase-r"
-
- New()
- src.imp = new /obj/item/weapon/implant/loyalty( src )
- ..()
- return
+/obj/item/weapon/implantcase/loyalty/New()
+ src.imp = new /obj/item/weapon/implant/loyalty( src )
+ ..()
+ return
/obj/item/weapon/implantcase/death_alarm
- name = "Glass Case- 'Death Alarm'"
+ name = "Glass Case - 'Death Alarm'"
desc = "A case containing a death alarm implant."
- icon = 'icons/obj/items.dmi'
icon_state = "implantcase-b"
- New()
- src.imp = new /obj/item/weapon/implant/death_alarm( src )
- ..()
- return
+/obj/item/weapon/implantcase/death_alarm/New()
+ src.imp = new /obj/item/weapon/implant/death_alarm( src )
+ ..()
+ return
+
+
+/obj/item/weapon/implantcase/freedom
+ name = "Glass Case - 'Freedom'"
+ desc = "A case containing a freedom implant."
+ icon_state = "implantcase-r"
+
+/obj/item/weapon/implantcase/freedom/New()
+ src.imp = new /obj/item/weapon/implant/freedom( src )
+ ..()
+ return
+
+
+/obj/item/weapon/implantcase/adrenalin
+ name = "Glass Case - 'Adrenalin'"
+ desc = "A case containing an adrenalin implant."
+ icon_state = "implantcase-b"
+
+/obj/item/weapon/implantcase/adrenalin/New()
+ src.imp = new /obj/item/weapon/implant/adrenalin( src )
+ ..()
+ return
+
+
+/obj/item/weapon/implantcase/dexplosive
+ name = "Glass Case - 'Explosive'"
+ desc = "A case containing an explosive."
+ icon_state = "implantcase-r"
+
+/obj/item/weapon/implantcase/dexplosive/New()
+ src.imp = new /obj/item/weapon/implant/dexplosive( src )
+ ..()
+ return
+
+
+/obj/item/weapon/implantcase/health
+ name = "Glass Case - 'Health'"
+ desc = "A case containing a health tracking implant."
+ icon_state = "implantcase-b"
+
+/obj/item/weapon/implantcase/health/New()
+ src.imp = new /obj/item/weapon/implant/health( src )
+ ..()
+ return
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm
index 291418f5108..12078e0addf 100644
--- a/code/game/objects/items/weapons/storage/storage.dm
+++ b/code/game/objects/items/weapons/storage/storage.dm
@@ -452,11 +452,11 @@
del(src)
//BubbleWrap END
-/obj/item/weapon/storage/hear_talk(mob/M as mob, text)
+/obj/item/weapon/storage/hear_talk(mob/M as mob, text, verb, datum/language/speaking)
for (var/atom/A in src)
if(istype(A,/obj/))
var/obj/O = A
- O.hear_talk(M, text)
+ O.hear_talk(M, text, verb, speaking)
//Returns the storage depth of an atom. This is the number of storage items the atom is contained in before reaching toplevel (the area).
//Returns -1 if the atom was not found on container.
diff --git a/code/game/objects/items/weapons/tape.dm b/code/game/objects/items/weapons/tape.dm
index 8177c746d70..0514e7d1d25 100644
--- a/code/game/objects/items/weapons/tape.dm
+++ b/code/game/objects/items/weapons/tape.dm
@@ -45,6 +45,7 @@
W.forceMove(src)
icon_state = W.icon_state + "_taped"
name = W.name + " (taped)"
+ overlays = W.overlays
/obj/item/weapon/ducttape/attack_self(mob/user as mob)
if(!stuck)
@@ -56,6 +57,7 @@
stuck.forceMove(get_turf(src))
user.put_in_hands(stuck)
stuck = null
+ overlays = null
del(src)
/obj/item/weapon/ducttape/afterattack(var/A, mob/user as mob, flag, params)
diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm
index 44fc441926f..ba696b6850b 100644
--- a/code/game/objects/objs.dm
+++ b/code/game/objects/objs.dm
@@ -126,7 +126,7 @@
return
-/obj/proc/hear_talk(mob/M as mob, text)
+/obj/proc/hear_talk(mob/M as mob, text, verb, datum/language/speaking)
if(talking_atom)
talking_atom.catchMessage(text, M)
/*
diff --git a/code/game/objects/random/random.dm b/code/game/objects/random/random.dm
index d9ed995845d..83923831506 100644
--- a/code/game/objects/random/random.dm
+++ b/code/game/objects/random/random.dm
@@ -102,4 +102,5 @@
prob(3);/obj/item/stack/cable_coil,\
prob(2);/obj/random/toolbox,\
prob(2);/obj/item/weapon/storage/belt/utility,\
- prob(5);/obj/random/tool)
\ No newline at end of file
+ prob(5);/obj/random/tool,\
+ prob(2);/obj/item/weapon/tape_roll)
\ No newline at end of file
diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm
index 44c2c3b9002..8ff522a8585 100644
--- a/code/game/objects/structures/crates_lockers/closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets.dm
@@ -293,11 +293,11 @@
else
icon_state = icon_opened
-/obj/structure/closet/hear_talk(mob/M as mob, text)
+/obj/structure/closet/hear_talk(mob/M as mob, text, verb, datum/language/speaking)
for (var/atom/A in src)
if(istype(A,/obj/))
var/obj/O = A
- O.hear_talk(M, text)
+ O.hear_talk(M, text, verb, speaking)
/obj/structure/closet/attack_generic(var/mob/user, var/damage, var/attack_message = "destroys", var/wallbreaker)
if(!damage || !wallbreaker)
diff --git a/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm b/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm
index 3d21575c749..e67fea38494 100644
--- a/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm
+++ b/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm
@@ -1,4 +1,5 @@
//Alium nests. Essentially beds with an unbuckle delay that only aliums can buckle mobs to.
+#define NEST_RESIST_TIME 1200
/obj/structure/stool/bed/nest
name = "alien nest"
@@ -19,12 +20,16 @@
buckled_mob.old_y = 0
unbuckle()
else
+ if(world.time <= buckled_mob.last_special+NEST_RESIST_TIME)
+ return
+ buckled_mob.last_special = world.time
buckled_mob.visible_message(\
"[buckled_mob.name] struggles to break free of the gelatinous resin...",\
"You struggle to break free from the gelatinous resin...",\
"You hear squelching...")
- spawn(1200)
+ spawn(NEST_RESIST_TIME)
if(user && buckled_mob && user.buckled == src)
+ buckled_mob.last_special = world.time
buckled_mob.pixel_y = 0
buckled_mob.old_y = 0
unbuckle()
diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm
index 4ac8aa6c465..608bd782dc7 100644
--- a/code/game/objects/structures/window.dm
+++ b/code/game/objects/structures/window.dm
@@ -163,31 +163,32 @@
/obj/structure/window/attackby(obj/item/W as obj, mob/user as mob)
if(!istype(W)) return//I really wish I did not need this
- if(W.flags & NOBLUDGEON) return
-
if (istype(W, /obj/item/weapon/grab) && get_dist(src,user)<2)
var/obj/item/weapon/grab/G = W
- if (istype(G.affecting, /mob/living))
+ if(istype(G.affecting,/mob/living))
var/mob/living/M = G.affecting
var/state = G.state
del(W) //gotta delete it here because if window breaks, it won't get deleted
switch (state)
if(1)
+ M.visible_message("[user] slams [M] against \the [src]!")
M.apply_damage(7)
hit(10)
- visible_message("\red [user] slams [M] against \the [src]!")
if(2)
+ M.visible_message("[user] bashes [M] against \the [src]!")
if (prob(50))
M.Weaken(1)
M.apply_damage(10)
hit(25)
- visible_message("\red [user] bashes [M] against \the [src]!")
if(3)
+ M.visible_message("[user] crushes [M] against \the [src]!")
M.Weaken(5)
M.apply_damage(20)
hit(50)
- visible_message("\red [user] crushes [M] against \the [src]!")
return
+
+ if(W.flags & NOBLUDGEON) return
+
if(istype(W, /obj/item/weapon/screwdriver))
if(reinf && state >= 1)
state = 3 - state
diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm
index 80a70d5c049..d2cd7a18d54 100644
--- a/code/game/turfs/turf.dm
+++ b/code/game/turfs/turf.dm
@@ -86,7 +86,7 @@
//Finally, check objects/mobs to block entry that are not on the border
for(var/atom/movable/obstacle in src)
- if(obstacle.flags & ~ON_BORDER)
+ if(!(obstacle.flags & ON_BORDER))
if(!obstacle.CanPass(mover, mover.loc, 1, 0) && (forget != obstacle))
mover.Bump(obstacle, 1)
return 0
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index 93b2824ebe1..07bca599952 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -169,17 +169,29 @@ var/global/floorIsLava = 0
Shade
"}
-
- if (M.client)
- body += {"
+ body += {"
Other actions:
- Forcesay |
+ Forcesay
+ "}
+ if (M.client)
+ body += {" |
Thunderdome 1 |
Thunderdome 2 |
Thunderdome Admin |
Thunderdome Observer |
"}
+ // language toggles
+ body += "
Languages:
"
+ var/f = 1
+ for(var/k in all_languages)
+ var/datum/language/L = all_languages[k]
+ if(!f) body += " | "
+ else f = 0
+ if(L in M.languages)
+ body += "[k]"
+ else
+ body += "[k]"
body += {"