diff --git a/baystation12.dme b/baystation12.dme
index 16343fcf62..46751361fe 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -4,9 +4,11 @@
// BEGIN_INTERNALS
// END_INTERNALS
// BEGIN_FILE_DIR
+#define FILE_DIR .
// END_FILE_DIR
// BEGIN_PREFERENCES
+#define DEBUG
// END_PREFERENCES
// BEGIN_INCLUDE
@@ -77,7 +79,6 @@
#include "code\datums\spell.dm"
#include "code\datums\sun.dm"
#include "code\datums\supplypacks.dm"
-#include "code\datums\diseases\alien_embryo.dm"
#include "code\datums\diseases\appendicitis.dm"
#include "code\datums\diseases\beesease.dm"
#include "code\datums\diseases\brainrot.dm"
@@ -127,6 +128,7 @@
#include "code\datums\organs\wound.dm"
#include "code\datums\spells\area_teleport.dm"
#include "code\datums\spells\conjure.dm"
+#include "code\datums\spells\dumbfire.dm"
#include "code\datums\spells\emplosion.dm"
#include "code\datums\spells\ethereal_jaunt.dm"
#include "code\datums\spells\explosion.dm"
@@ -140,10 +142,6 @@
#include "code\datums\spells\wizard.dm"
#include "code\defines\obj.dm"
#include "code\defines\obj\hydro.dm"
-#include "code\defines\obj\machinery.dm"
-#include "code\defines\obj\storage.dm"
-#include "code\defines\obj\toy.dm"
-#include "code\defines\obj\vending.dm"
#include "code\defines\obj\weapon.dm"
#include "code\defines\procs\AStar.dm"
#include "code\defines\procs\captain_announce.dm"
@@ -200,7 +198,9 @@
#include "code\game\gamemodes\events\space_ninja.dm"
#include "code\game\gamemodes\events\spacevines.dm"
#include "code\game\gamemodes\events\wormholes.dm"
+#include "code\game\gamemodes\events\holidays\Christmas.dm"
#include "code\game\gamemodes\events\holidays\Holidays.dm"
+#include "code\game\gamemodes\events\holidays\Other.dm"
#include "code\game\gamemodes\extended\extended.dm"
#include "code\game\gamemodes\malfunction\Malf_Modules.dm"
#include "code\game\gamemodes\malfunction\malfunction.dm"
@@ -243,6 +243,7 @@
#include "code\game\machinery\autolathe.dm"
#include "code\game\machinery\Beacon.dm"
#include "code\game\machinery\biogenerator.dm"
+#include "code\game\machinery\buttons.dm"
#include "code\game\machinery\cell_charger.dm"
#include "code\game\machinery\cloning.dm"
#include "code\game\machinery\constructable_frame.dm"
@@ -283,6 +284,7 @@
#include "code\game\machinery\turrets.dm"
#include "code\game\machinery\vending.dm"
#include "code\game\machinery\washing_machine.dm"
+#include "code\game\machinery\wishgranter.dm"
#include "code\game\machinery\atmoalter\area_atmos_computer.dm"
#include "code\game\machinery\atmoalter\canister.dm"
#include "code\game\machinery\atmoalter\meter.dm"
@@ -333,6 +335,7 @@
#include "code\game\machinery\computer\syndicate_specops_shuttle.dm"
#include "code\game\machinery\doors\airlock.dm"
#include "code\game\machinery\doors\airlock_electronics.dm"
+#include "code\game\machinery\doors\alarmlock.dm"
#include "code\game\machinery\doors\brigdoors.dm"
#include "code\game\machinery\doors\checkForMultipleDoors.dm"
#include "code\game\machinery\doors\door.dm"
@@ -426,6 +429,7 @@
#include "code\game\objects\items\latexballoon.dm"
#include "code\game\objects\items\shooting_range.dm"
#include "code\game\objects\items\tk_grab.dm"
+#include "code\game\objects\items\toys.dm"
#include "code\game\objects\items\trash.dm"
#include "code\game\objects\items\devices\aicard.dm"
#include "code\game\objects\items\devices\chameleonproj.dm"
@@ -436,7 +440,6 @@
#include "code\game\objects\items\devices\paicard.dm"
#include "code\game\objects\items\devices\powersink.dm"
#include "code\game\objects\items\devices\scanners.dm"
-#include "code\game\objects\items\devices\shields.dm"
#include "code\game\objects\items\devices\taperecorder.dm"
#include "code\game\objects\items\devices\traitordevices.dm"
#include "code\game\objects\items\devices\transfer_valve.dm"
@@ -485,17 +488,19 @@
#include "code\game\objects\items\weapons\mop.dm"
#include "code\game\objects\items\weapons\paint.dm"
#include "code\game\objects\items\weapons\paiwire.dm"
+#include "code\game\objects\items\weapons\power_cells.dm"
#include "code\game\objects\items\weapons\RCD.dm"
#include "code\game\objects\items\weapons\RSF.dm"
#include "code\game\objects\items\weapons\scrolls.dm"
+#include "code\game\objects\items\weapons\shields.dm"
#include "code\game\objects\items\weapons\stunbaton.dm"
#include "code\game\objects\items\weapons\surgery_tools.dm"
#include "code\game\objects\items\weapons\swords_axes_etc.dm"
#include "code\game\objects\items\weapons\table_rack_parts.dm"
#include "code\game\objects\items\weapons\teleportation.dm"
#include "code\game\objects\items\weapons\tools.dm"
-#include "code\game\objects\items\weapons\trashbag.dm"
#include "code\game\objects\items\weapons\twohanded.dm"
+#include "code\game\objects\items\weapons\weaponry.dm"
#include "code\game\objects\items\weapons\wires.dm"
#include "code\game\objects\items\weapons\grenades\chem_grenade.dm"
#include "code\game\objects\items\weapons\grenades\emgrenade.dm"
@@ -511,21 +516,22 @@
#include "code\game\objects\items\weapons\implants\implantnanoaug.dm"
#include "code\game\objects\items\weapons\implants\implantpad.dm"
#include "code\game\objects\items\weapons\implants\implantuplink.dm"
-#include "code\game\objects\items\weapons\secstorage\sbriefcase.dm"
-#include "code\game\objects\items\weapons\secstorage\secstorage.dm"
-#include "code\game\objects\items\weapons\secstorage\ssafe.dm"
+#include "code\game\objects\items\weapons\melee\energy.dm"
+#include "code\game\objects\items\weapons\melee\misc.dm"
#include "code\game\objects\items\weapons\storage\backpack.dm"
+#include "code\game\objects\items\weapons\storage\bags.dm"
#include "code\game\objects\items\weapons\storage\belt.dm"
#include "code\game\objects\items\weapons\storage\bible.dm"
+#include "code\game\objects\items\weapons\storage\boxes.dm"
#include "code\game\objects\items\weapons\storage\briefcase.dm"
#include "code\game\objects\items\weapons\storage\fancy.dm"
#include "code\game\objects\items\weapons\storage\firstaid.dm"
-#include "code\game\objects\items\weapons\storage\kit.dm"
#include "code\game\objects\items\weapons\storage\lockbox.dm"
-#include "code\game\objects\items\weapons\storage\misc.dm"
+#include "code\game\objects\items\weapons\storage\secure.dm"
#include "code\game\objects\items\weapons\storage\storage.dm"
#include "code\game\objects\items\weapons\storage\toolbox.dm"
#include "code\game\objects\items\weapons\storage\uplink_kits.dm"
+#include "code\game\objects\items\weapons\storage\wallets.dm"
#include "code\game\objects\items\weapons\tanks\jetpack.dm"
#include "code\game\objects\items\weapons\tanks\tank_types.dm"
#include "code\game\objects\items\weapons\tanks\tanks.dm"
@@ -536,8 +542,10 @@
#include "code\game\objects\structures\electricchair.dm"
#include "code\game\objects\structures\extinguisher.dm"
#include "code\game\objects\structures\false_walls.dm"
+#include "code\game\objects\structures\flora.dm"
#include "code\game\objects\structures\girders.dm"
#include "code\game\objects\structures\grille.dm"
+#include "code\game\objects\structures\janicart.dm"
#include "code\game\objects\structures\kitchen_spike.dm"
#include "code\game\objects\structures\ladders.dm"
#include "code\game\objects\structures\lamarr_cage.dm"
@@ -596,10 +604,6 @@
#include "code\game\turfs\unsimulated\beach.dm"
#include "code\game\turfs\unsimulated\floor.dm"
#include "code\game\turfs\unsimulated\walls.dm"
-#include "code\game\vehicles\vehicle.dm"
-#include "code\game\vehicles\airtight\airtight.dm"
-#include "code\game\vehicles\airtight\land.dm"
-#include "code\game\vehicles\airtight\space.dm"
#include "code\game\verbs\atom_verbs.dm"
#include "code\game\verbs\ooc.dm"
#include "code\game\verbs\suicide.dm"
@@ -723,16 +727,25 @@
#include "code\modules\clothing\under\jobs\engineering.dm"
#include "code\modules\clothing\under\jobs\medsci.dm"
#include "code\modules\clothing\under\jobs\security.dm"
-#include "code\modules\critters\critter.dm"
-#include "code\modules\critters\critter_AI.dm"
-#include "code\modules\critters\critter_defenses.dm"
-#include "code\modules\critters\critters.dm"
#include "code\modules\customitems\item_defines.dm"
#include "code\modules\customitems\item_spawning.dm"
#include "code\modules\DetectiveWork\detective_work.dm"
#include "code\modules\DetectiveWork\evidence.dm"
#include "code\modules\DetectiveWork\footprints_and_rag.dm"
#include "code\modules\DetectiveWork\scanner.dm"
+#include "code\modules\events\alien_infestation.dm"
+#include "code\modules\events\blob.dm"
+#include "code\modules\events\carp_migration.dm"
+#include "code\modules\events\communications_blackout.dm"
+#include "code\modules\events\disease_outbreak.dm"
+#include "code\modules\events\electrical_storm.dm"
+#include "code\modules\events\event.dm"
+#include "code\modules\events\event_manager.dm"
+#include "code\modules\events\meteor_wave.dm"
+#include "code\modules\events\prison_break.dm"
+#include "code\modules\events\radiation_storm.dm"
+#include "code\modules\events\spacevine.dm"
+#include "code\modules\events\spontaneous_appendicitis.dm"
#include "code\modules\flufftext\Dreaming.dm"
#include "code\modules\flufftext\Hallucination.dm"
#include "code\modules\flufftext\TextFilters.dm"
@@ -812,6 +825,7 @@
#include "code\modules\mob\living\carbon\alien\larva\life.dm"
#include "code\modules\mob\living\carbon\alien\larva\powers.dm"
#include "code\modules\mob\living\carbon\alien\larva\update_icons.dm"
+#include "code\modules\mob\living\carbon\alien\special\alien_embryo.dm"
#include "code\modules\mob\living\carbon\alien\special\facehugger.dm"
#include "code\modules\mob\living\carbon\brain\brain.dm"
#include "code\modules\mob\living\carbon\brain\brain_item.dm"
@@ -849,6 +863,7 @@
#include "code\modules\mob\living\carbon\metroid\metroid.dm"
#include "code\modules\mob\living\carbon\metroid\powers.dm"
#include "code\modules\mob\living\carbon\metroid\say.dm"
+#include "code\modules\mob\living\carbon\metroid\subtypes.dm"
#include "code\modules\mob\living\carbon\metroid\update_icons.dm"
#include "code\modules\mob\living\carbon\monkey\death.dm"
#include "code\modules\mob\living\carbon\monkey\emote.dm"
@@ -916,17 +931,23 @@
#include "code\modules\mob\living\simple_animal\friendly\cat.dm"
#include "code\modules\mob\living\simple_animal\friendly\corgi.dm"
#include "code\modules\mob\living\simple_animal\friendly\crab.dm"
+#include "code\modules\mob\living\simple_animal\friendly\lizard.dm"
#include "code\modules\mob\living\simple_animal\friendly\mouse.dm"
#include "code\modules\mob\living\simple_animal\friendly\mushroom.dm"
+#include "code\modules\mob\living\simple_animal\friendly\slime.dm"
#include "code\modules\mob\living\simple_animal\friendly\tomato.dm"
+#include "code\modules\mob\living\simple_animal\hostile\alien.dm"
#include "code\modules\mob\living\simple_animal\hostile\bear.dm"
#include "code\modules\mob\living\simple_animal\hostile\carp.dm"
+#include "code\modules\mob\living\simple_animal\hostile\creature.dm"
#include "code\modules\mob\living\simple_animal\hostile\faithless.dm"
#include "code\modules\mob\living\simple_animal\hostile\hivebot.dm"
#include "code\modules\mob\living\simple_animal\hostile\hostile.dm"
+#include "code\modules\mob\living\simple_animal\hostile\mimic.dm"
#include "code\modules\mob\living\simple_animal\hostile\pirate.dm"
#include "code\modules\mob\living\simple_animal\hostile\russian.dm"
#include "code\modules\mob\living\simple_animal\hostile\syndicate.dm"
+#include "code\modules\mob\living\simple_animal\hostile\tree.dm"
#include "code\modules\mob\new_player\hud.dm"
#include "code\modules\mob\new_player\login.dm"
#include "code\modules\mob\new_player\logout.dm"
@@ -997,6 +1018,7 @@
#include "code\modules\projectiles\guns\projectile\pistol.dm"
#include "code\modules\projectiles\guns\projectile\revolver.dm"
#include "code\modules\projectiles\guns\projectile\shotgun.dm"
+#include "code\modules\projectiles\projectile\animate.dm"
#include "code\modules\projectiles\projectile\beams.dm"
#include "code\modules\projectiles\projectile\bullets.dm"
#include "code\modules\projectiles\projectile\change.dm"
@@ -1138,5 +1160,7 @@
#include "interface\skin.dmf"
#include "maps\tgstation.2.0.9.1.dmm"
#include "maps\RandomZLevels\Academy.dm"
+#include "maps\RandomZLevels\challenge.dm"
#include "maps\RandomZLevels\stationCollision.dm"
+#include "maps\RandomZLevels\wildwest.dm"
// END_INCLUDE
diff --git a/code/ATMOSPHERICS/atmospherics.dm b/code/ATMOSPHERICS/atmospherics.dm
index d745a48d89..3c12e1f943 100644
--- a/code/ATMOSPHERICS/atmospherics.dm
+++ b/code/ATMOSPHERICS/atmospherics.dm
@@ -12,7 +12,6 @@ Pipelines + Other Objects -> Pipe network
obj/machinery/atmospherics
anchored = 1
- use_power = 0
idle_power_usage = 0
active_power_usage = 0
power_channel = ENVIRON
diff --git a/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm b/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm
index 44446589cb..9d2a8e32e8 100644
--- a/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm
+++ b/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm
@@ -1,6 +1,7 @@
obj/machinery/atmospherics/binary
dir = SOUTH
initialize_directions = SOUTH|NORTH
+ use_power = 1
var/datum/gas_mixture/air1
var/datum/gas_mixture/air2
diff --git a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm
index e92cc48510..a126928e2d 100644
--- a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm
+++ b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm
@@ -15,7 +15,9 @@ obj/machinery/atmospherics/binary/passive_gate
var/datum/radio_frequency/radio_connection
update_icon()
- if(node1&&node2)
+ if(stat & NOPOWER)
+ icon_state = "intact_off"
+ else if(node1 && node2)
icon_state = "intact_[on?("on"):("off")]"
else
if(node1)
@@ -24,8 +26,6 @@ obj/machinery/atmospherics/binary/passive_gate
icon_state = "exposed_2_off"
else
icon_state = "exposed_3_off"
- on = 0
-
return
process()
diff --git a/code/ATMOSPHERICS/components/binary_devices/pump.dm b/code/ATMOSPHERICS/components/binary_devices/pump.dm
index f22da69ff8..0a0a56fb74 100644
--- a/code/ATMOSPHERICS/components/binary_devices/pump.dm
+++ b/code/ATMOSPHERICS/components/binary_devices/pump.dm
@@ -37,7 +37,9 @@ obj/machinery/atmospherics/binary/pump
icon_state = "intact_on"
update_icon()
- if(node1&&node2)
+ if(stat & NOPOWER)
+ icon_state = "intact_off"
+ else if(node1 && node2)
icon_state = "intact_[on?("on"):("off")]"
else
if(node1)
diff --git a/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm b/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm
index 2c5f233706..e2dddfa97c 100644
--- a/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm
+++ b/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm
@@ -31,7 +31,9 @@ obj/machinery/atmospherics/binary/volume_pump
icon_state = "intact_on"
update_icon()
- if(node1&&node2)
+ if(stat & NOPOWER)
+ icon_state = "intact_off"
+ else if(node1 && node2)
icon_state = "intact_[on?("on"):("off")]"
else
if(node1)
diff --git a/code/ATMOSPHERICS/components/portables_connector.dm b/code/ATMOSPHERICS/components/portables_connector.dm
index 8d7a6efb05..9ecc82b324 100644
--- a/code/ATMOSPHERICS/components/portables_connector.dm
+++ b/code/ATMOSPHERICS/components/portables_connector.dm
@@ -15,7 +15,7 @@
var/datum/pipe_network/network
var/on = 0
-
+ use_power = 0
level = 0
diff --git a/code/ATMOSPHERICS/components/trinary_devices/filter.dm b/code/ATMOSPHERICS/components/trinary_devices/filter.dm
index a2d72ca523..6a92f9a24b 100755
--- a/code/ATMOSPHERICS/components/trinary_devices/filter.dm
+++ b/code/ATMOSPHERICS/components/trinary_devices/filter.dm
@@ -39,16 +39,21 @@ Filter types:
..()
update_icon()
- if(node2 && node3 && node1)
+ if(stat & NOPOWER)
+ icon_state = "intact_off"
+ else if(node2 && node3 && node1)
icon_state = "intact_[on?("on"):("off")]"
else
- icon_state = "hintact_off"
+ icon_state = "intact_off"
on = 0
return
- New()
+ power_change()
+ var/old_stat = stat
..()
+ if(old_stat != stat)
+ update_icon()
process()
..()
diff --git a/code/ATMOSPHERICS/components/trinary_devices/mixer.dm b/code/ATMOSPHERICS/components/trinary_devices/mixer.dm
index 69307784a9..6d532286de 100644
--- a/code/ATMOSPHERICS/components/trinary_devices/mixer.dm
+++ b/code/ATMOSPHERICS/components/trinary_devices/mixer.dm
@@ -16,7 +16,9 @@ obj/machinery/atmospherics/trinary/mixer
//node 3 is the outlet, nodes 1 & 2 are intakes
update_icon()
- if(node2 && node3 && node1)
+ if(stat & NOPOWER)
+ icon_state = "intact_off"
+ else if(node2 && node3 && node1)
icon_state = "intact_[on?("on"):("off")]"
else
icon_state = "intact_off"
@@ -24,6 +26,12 @@ obj/machinery/atmospherics/trinary/mixer
return
+ power_change()
+ var/old_stat = stat
+ ..()
+ if(old_stat != stat)
+ update_icon()
+
New()
..()
air3.volume = 300
diff --git a/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm b/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm
index e22208b071..d3f1116a43 100644
--- a/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm
+++ b/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm
@@ -1,6 +1,7 @@
obj/machinery/atmospherics/trinary
dir = SOUTH
initialize_directions = SOUTH|NORTH|WEST
+ use_power = 1
var/datum/gas_mixture/air1
var/datum/gas_mixture/air2
diff --git a/code/ATMOSPHERICS/components/unary/cold_sink.dm b/code/ATMOSPHERICS/components/unary/cold_sink.dm
index 32de005dc6..ef1d5f60be 100644
--- a/code/ATMOSPHERICS/components/unary/cold_sink.dm
+++ b/code/ATMOSPHERICS/components/unary/cold_sink.dm
@@ -2,6 +2,7 @@
icon = 'icons/obj/atmospherics/cold_sink.dmi'
icon_state = "intact_off"
density = 1
+ use_power = 1
name = "Cold Sink"
desc = "Cools gas when connected to pipe network"
diff --git a/code/ATMOSPHERICS/components/unary/heat_source.dm b/code/ATMOSPHERICS/components/unary/heat_source.dm
index adfd04e15a..01438c32d9 100644
--- a/code/ATMOSPHERICS/components/unary/heat_source.dm
+++ b/code/ATMOSPHERICS/components/unary/heat_source.dm
@@ -4,6 +4,7 @@
icon = 'icons/obj/atmospherics/cold_sink.dmi'
icon_state = "intact_off"
density = 1
+ use_power = 1
name = "Heat Reservoir"
desc = "Heats gas when connected to pipe network"
diff --git a/code/ATMOSPHERICS/components/unary/outlet_injector.dm b/code/ATMOSPHERICS/components/unary/outlet_injector.dm
index 571fc7dcb9..f070882ba8 100644
--- a/code/ATMOSPHERICS/components/unary/outlet_injector.dm
+++ b/code/ATMOSPHERICS/components/unary/outlet_injector.dm
@@ -1,6 +1,7 @@
/obj/machinery/atmospherics/unary/outlet_injector
icon = 'icons/obj/atmospherics/outlet_injector.dmi'
icon_state = "off"
+ use_power = 1
name = "Air Injector"
desc = "Has a valve and pump attached to it"
@@ -18,7 +19,7 @@
update_icon()
if(node)
- if(on)
+ if(on && !(stat & NOPOWER))
icon_state = "[level == 1 && istype(loc, /turf/simulated) ? "h" : "" ]on"
else
icon_state = "[level == 1 && istype(loc, /turf/simulated) ? "h" : "" ]off"
@@ -28,11 +29,18 @@
return
+ power_change()
+ var/old_stat = stat
+ ..()
+ if(old_stat != stat)
+ update_icon()
+
+
process()
..()
injecting = 0
- if(!on)
+ if(!on || stat & NOPOWER)
return 0
if(air_contents.temperature > 0)
diff --git a/code/ATMOSPHERICS/components/unary/vent_pump.dm b/code/ATMOSPHERICS/components/unary/vent_pump.dm
index 9aae6910c7..9590a9015e 100644
--- a/code/ATMOSPHERICS/components/unary/vent_pump.dm
+++ b/code/ATMOSPHERICS/components/unary/vent_pump.dm
@@ -4,15 +4,15 @@
name = "Air Vent"
desc = "Has a valve and pump attached to it"
+ use_power = 1
+ var/area/initial_loc
level = 1
var/area_uid
- var/id_tag
- power_channel = ENVIRON
+ var/id_tag = null
var/on = 0
var/pump_direction = 1 //0 = siphoning, 1 = releasing
- var/pump_speed = 1 //Used to adjust speed for siphons
var/external_pressure_bound = ONE_ATMOSPHERE
var/internal_pressure_bound = 0
@@ -43,27 +43,25 @@
icon_state = "in"
New()
- var/area/A = get_area(loc)
- if (A.master)
- A = A.master
- area_uid = A.uid
+ initial_loc = get_area(loc)
+ if (initial_loc.master)
+ initial_loc = initial_loc.master
+ area_uid = initial_loc.uid
if (!id_tag)
assign_uid()
id_tag = num2text(uid)
if(ticker && ticker.current_state == 3)//if the game is running
- initialize()
- broadcast_status()
+ src.initialize()
+ src.broadcast_status()
..()
high_volume
name = "Large Air Vent"
power_channel = EQUIP
-
New()
..()
air_contents.volume = 1000
-
update_icon()
if(welded)
icon_state = "[level == 1 && istype(loc, /turf/simulated) ? "h" : "" ]weld"
@@ -80,12 +78,11 @@
process()
..()
-// broadcast_status()
if(stat & (NOPOWER|BROKEN))
return
if (!node)
on = 0
-
+ //broadcast_status() // from now air alarm/control computer should request update purposely --rastaf0
if(!on)
return 0
@@ -105,7 +102,7 @@
if(pressure_delta > 0)
if(air_contents.temperature > 0)
- var/transfer_moles = pressure_delta*environment.volume*environment.group_multiplier*pump_speed/(air_contents.temperature * R_IDEAL_GAS_EQUATION)
+ var/transfer_moles = pressure_delta*environment.volume/(air_contents.temperature * R_IDEAL_GAS_EQUATION)
var/datum/gas_mixture/removed = air_contents.remove(transfer_moles)
@@ -123,7 +120,7 @@
if(pressure_delta > 0)
if(environment.temperature > 0)
- var/transfer_moles = pressure_delta*air_contents.volume*air_contents.group_multiplier*pump_speed/(environment.temperature * R_IDEAL_GAS_EQUATION)
+ var/transfer_moles = pressure_delta*air_contents.volume/(environment.temperature * R_IDEAL_GAS_EQUATION)
var/datum/gas_mixture/removed = loc.remove_air(transfer_moles)
if (isnull(removed)) //in space
@@ -136,42 +133,45 @@
return 1
-
-
-
//Radio remote control
- proc/set_frequency(new_frequency)
- radio_controller.remove_object(src, frequency)
- frequency = new_frequency
- if(frequency)
- radio_connection = radio_controller.add_object(src, frequency,radio_filter_in)
+ proc
+ set_frequency(new_frequency)
+ radio_controller.remove_object(src, frequency)
+ frequency = new_frequency
+ if(frequency)
+ radio_connection = radio_controller.add_object(src, frequency,radio_filter_in)
- proc/broadcast_status()
- if(!radio_connection)
- return 0
+ broadcast_status()
+ if(!radio_connection)
+ return 0
- var/datum/signal/signal = new
- signal.transmission_method = 1 //radio signal
- signal.source = src
+ var/datum/signal/signal = new
+ signal.transmission_method = 1 //radio signal
+ signal.source = src
- signal.data = list(
- "area" = src.area_uid,
- "tag" = src.id_tag,
- "device" = "AVP",
- "power" = on,
- "direction" = pump_direction?("release"):("siphon"),
- "checks" = pressure_checks,
- "internal" = internal_pressure_bound,
- "external" = external_pressure_bound,
- "timestamp" = world.time,
- "sigtype" = "status",
- "setting" = pump_speed
- )
+ signal.data = list(
+ "area" = src.area_uid,
+ "tag" = src.id_tag,
+ "device" = "AVP",
+ "power" = on,
+ "direction" = pump_direction?("release"):("siphon"),
+ "checks" = pressure_checks,
+ "internal" = internal_pressure_bound,
+ "external" = external_pressure_bound,
+ "timestamp" = world.time,
+ "sigtype" = "status"
+ )
- radio_connection.post_signal(src, signal, radio_filter_out)
+ if(!initial_loc.air_vent_names[id_tag])
+ var/new_name = "[initial_loc.name] Vent Pump #[initial_loc.air_vent_names.len+1]"
+ initial_loc.air_vent_names[id_tag] = new_name
+ src.name = new_name
+ initial_loc.air_vent_info[id_tag] = signal.data
- return 1
+ radio_connection.post_signal(src, signal, radio_filter_out)
+
+ return 1
initialize()
@@ -183,7 +183,6 @@
if(frequency)
set_frequency(frequency)
-
receive_signal(datum/signal/signal)
if(stat & (NOPOWER|BROKEN))
return
@@ -191,49 +190,67 @@
if(!signal.data["tag"] || (signal.data["tag"] != id_tag) || (signal.data["sigtype"]!="command"))
return 0
- if("purge" in signal.data)
+ if(signal.data["purge"] != null)
pressure_checks &= ~1
pump_direction = 0
- if("stabalize" in signal.data)
+ if(signal.data["stabalize"] != null)
pressure_checks |= 1
pump_direction = 1
- if("power" in signal.data)
+ if(signal.data["power"] != null)
on = text2num(signal.data["power"])
- if("power_toggle" in signal.data)
+ if(signal.data["power_toggle"] != null)
on = !on
- if("checks" in signal.data)
+ if(signal.data["checks"] != null)
pressure_checks = text2num(signal.data["checks"])
- if("checks_toggle" in signal.data)
+ if(signal.data["checks_toggle"] != null)
pressure_checks = (pressure_checks?0:3)
- if("direction" in signal)
+ if(signal.data["direction"] != null)
pump_direction = text2num(signal.data["direction"])
- if("set_internal_pressure" in signal.data)
- internal_pressure_bound = between(0, text2num(signal.data["set_internal_pressure"]), ONE_ATMOSPHERE*50)
+ if(signal.data["set_internal_pressure"] != null)
+ internal_pressure_bound = between(
+ 0,
+ text2num(signal.data["set_internal_pressure"]),
+ ONE_ATMOSPHERE*50
+ )
- if("set_external_pressure" in signal.data)
- external_pressure_bound = between(0, text2num(signal.data["set_external_pressure"]), ONE_ATMOSPHERE*50)
+ if(signal.data["set_external_pressure"] != null)
+ external_pressure_bound = between(
+ 0,
+ text2num(signal.data["set_external_pressure"]),
+ ONE_ATMOSPHERE*50
+ )
- if("adjust_internal_pressure" in signal.data)
- internal_pressure_bound = between(0, internal_pressure_bound + text2num(signal.data["adjust_internal_pressure"]), ONE_ATMOSPHERE*50)
+ if(signal.data["adjust_internal_pressure"] != null)
+ internal_pressure_bound = between(
+ 0,
+ internal_pressure_bound + text2num(signal.data["adjust_internal_pressure"]),
+ ONE_ATMOSPHERE*50
+ )
- if("adjust_external_pressure" in signal.data)
- external_pressure_bound = between(0, external_pressure_bound + text2num(signal.data["adjust_external_pressure"]), ONE_ATMOSPHERE*50)
+ if(signal.data["adjust_external_pressure"] != null)
+ external_pressure_bound = between(
+ 0,
+ external_pressure_bound + text2num(signal.data["adjust_external_pressure"]),
+ ONE_ATMOSPHERE*50
+ )
- if("init" in signal.data)
+ if(signal.data["init"] != null)
name = signal.data["init"]
return
- if("setting" in signal.data)
- pump_speed = text2num(signal.data["setting"])
+ if(signal.data["status"] != null)
+ spawn(2)
+ broadcast_status()
+ return //do not update_icon
- //log_admin("DEBUG \[[world.timeofday]\]: vent_pump/receive_signal: unknown command \"[signal["command"]]\"\n[signal.debug_print()]")
+ //log_admin("DEBUG \[[world.timeofday]\]: vent_pump/receive_signal: unknown command \"[signal.data["command"]]\"\n[signal.debug_print()]")
spawn(2)
broadcast_status()
update_icon()
@@ -274,7 +291,6 @@
else
user << "\blue You need more welding fuel to complete this task."
return 1
-
examine()
set src in oview(1)
..()
@@ -312,4 +328,11 @@
"\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/unary/vent_pump/Del()
+ if(initial_loc)
+ initial_loc.air_vent_info -= id_tag
+ initial_loc.air_vent_names -= id_tag
+ ..()
+ return
diff --git a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm
index b9c26d3251..4c386f44ec 100644
--- a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm
+++ b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm
@@ -4,39 +4,38 @@
name = "Air Scrubber"
desc = "Has a valve and pump attached to it"
+ use_power = 1
level = 1
+ var/area/initial_loc
var/id_tag = null
+ var/frequency = 1439
+ var/datum/radio_frequency/radio_connection
var/on = 0
var/scrubbing = 1 //0 = siphoning, 1 = scrubbing
var/scrub_CO2 = 1
var/scrub_Toxins = 0
var/scrub_N2O = 0
- var/scrub_rate = 1
var/volume_rate = 120
var/panic = 0 //is this scrubber panicked?
var/area_uid
-
- var/frequency = 1439
- var/datum/radio_frequency/radio_connection
var/radio_filter_out
var/radio_filter_in
-
New()
- var/area/A = get_area(loc)
- if (A.master)
- A = A.master
- area_uid = A.uid
+ initial_loc = get_area(loc)
+ if (initial_loc.master)
+ initial_loc = initial_loc.master
+ area_uid = initial_loc.uid
if (!id_tag)
assign_uid()
id_tag = num2text(uid)
if(ticker && ticker.current_state == 3)//if the game is running
- initialize()
- broadcast_status()
+ src.initialize()
+ src.broadcast_status()
..()
update_icon()
@@ -75,6 +74,11 @@
"filter_n2o" = scrub_N2O,
"sigtype" = "status"
)
+ if(!initial_loc.air_scrub_names[id_tag])
+ var/new_name = "[initial_loc.name] Air Scrubber #[initial_loc.air_scrub_names.len+1]"
+ initial_loc.air_scrub_names[id_tag] = new_name
+ src.name = new_name
+ initial_loc.air_scrub_info[id_tag] = signal.data
radio_connection.post_signal(src, signal, radio_filter_out)
return 1
@@ -88,20 +92,20 @@
process()
..()
-// broadcast_status()
if(stat & (NOPOWER|BROKEN))
return
if (!node)
on = 0
-
+ //broadcast_status()
if(!on)
return 0
+
var/datum/gas_mixture/environment = loc.return_air()
if(scrubbing)
if((environment.toxins>0) || (environment.carbon_dioxide>0) || (environment.trace_gases.len>0))
- var/transfer_moles = min(1, volume_rate*scrub_rate/environment.volume)*environment.total_moles
+ var/transfer_moles = min(1, volume_rate/environment.volume)*environment.total_moles()
//Take a gas sample
var/datum/gas_mixture/removed = loc.remove_air(transfer_moles)
@@ -120,14 +124,15 @@
if(removed.trace_gases.len>0)
for(var/datum/gas/trace_gas in removed.trace_gases)
- if(istype(trace_gas, /datum/gas/sleeping_agent) && scrub_N2O)
+ if(istype(trace_gas, /datum/gas/oxygen_agent_b))
+ removed.trace_gases -= trace_gas
+ filtered_out.trace_gases += trace_gas
+ else if(istype(trace_gas, /datum/gas/sleeping_agent) && scrub_N2O)
removed.trace_gases -= trace_gas
filtered_out.trace_gases += trace_gas
//Remix the resulting gases
- filtered_out.update_values()
- removed.update_values()
air_contents.merge(filtered_out)
loc.assume_air(removed)
@@ -139,7 +144,7 @@
if (air_contents.return_pressure()>=50*ONE_ATMOSPHERE)
return
- var/transfer_moles = environment.total_moles*(volume_rate*scrub_rate/environment.volume)
+ var/transfer_moles = environment.total_moles()*(volume_rate/environment.volume)
var/datum/gas_mixture/removed = loc.remove_air(transfer_moles)
@@ -168,13 +173,13 @@
if(!signal.data["tag"] || (signal.data["tag"] != id_tag) || (signal.data["sigtype"]!="command"))
return 0
- if("power" in signal.data)
+ if(signal.data["power"] != null)
on = text2num(signal.data["power"])
- if("power_toggle" in signal.data)
+ if(signal.data["power_toggle"] != null)
on = !on
- if("panic_siphon" in signal.data) //must be before if("scrubbing" thing
- panic = text2num(signal.data["panic_siphon"])
+ if(signal.data["panic_siphon"]) //must be before if("scrubbing" thing
+ panic = text2num(signal.data["panic_siphon"] != null)
if(panic)
on = 1
scrubbing = 0
@@ -182,7 +187,7 @@
else
scrubbing = 1
volume_rate = initial(volume_rate)
- if("toggle_panic_siphon" in signal.data)
+ if(signal.data["toggle_panic_siphon"] != null)
panic = !panic
if(panic)
on = 1
@@ -192,38 +197,35 @@
scrubbing = 1
volume_rate = initial(volume_rate)
- if("scrubbing" in signal.data)
+ if(signal.data["scrubbing"] != null)
scrubbing = text2num(signal.data["scrubbing"])
- if("toggle_scrubbing" in signal.data)
+ if(signal.data["toggle_scrubbing"])
scrubbing = !scrubbing
- if("co2_scrub" in signal.data)
+ if(signal.data["co2_scrub"] != null)
scrub_CO2 = text2num(signal.data["co2_scrub"])
- if("toggle_co2_scrub" in signal.data)
+ if(signal.data["toggle_co2_scrub"])
scrub_CO2 = !scrub_CO2
- if("tox_scrub" in signal.data)
+ if(signal.data["tox_scrub"] != null)
scrub_Toxins = text2num(signal.data["tox_scrub"])
- if("toggle_tox_scrub" in signal.data)
+ if(signal.data["toggle_tox_scrub"])
scrub_Toxins = !scrub_Toxins
- if("n2o_scrub" in signal.data)
+ if(signal.data["n2o_scrub"] != null)
scrub_N2O = text2num(signal.data["n2o_scrub"])
- if("toggle_n2o_scrub" in signal.data)
+ if(signal.data["toggle_n2o_scrub"])
scrub_N2O = !scrub_N2O
- if("init" in signal.data)
+ if(signal.data["init"] != null)
name = signal.data["init"]
return
- if("status" in signal.data)
+ if(signal.data["status"] != null)
spawn(2)
broadcast_status()
return //do not update_icon
- if("setting" in signal.data)
- scrub_rate = text2num(signal.data["setting"])
-
// log_admin("DEBUG \[[world.timeofday]\]: vent_scrubber/receive_signal: unknown command \"[signal.data["command"]]\"\n[signal.debug_print()]")
spawn(2)
broadcast_status()
@@ -231,7 +233,7 @@
return
power_change()
- if(powered(ENVIRON))
+ if(powered(power_channel))
stat &= ~NOPOWER
else
stat |= NOPOWER
@@ -261,4 +263,11 @@
"\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/unary/vent_scrubber/Del()
+ if(initial_loc)
+ initial_loc.air_scrub_info -= id_tag
+ initial_loc.air_scrub_names -= id_tag
+ ..()
+ return
diff --git a/code/ATMOSPHERICS/pipes.dm b/code/ATMOSPHERICS/pipes.dm
index e13a58f601..c9e763e839 100644
--- a/code/ATMOSPHERICS/pipes.dm
+++ b/code/ATMOSPHERICS/pipes.dm
@@ -4,9 +4,10 @@ obj/machinery/atmospherics/pipe
var/datum/pipeline/parent
var/volume = 0
- var/force = 20
+ force = 20
layer = 2.4 //under wires with their 2.44
+ use_power = 0
var/alert_pressure = 80*ONE_ATMOSPHERE
//minimum pressure before check_pressure(...) should be called
diff --git a/code/FEA/DEBUG_REMOVE_BEFORE_RELEASE.dm b/code/FEA/DEBUG_REMOVE_BEFORE_RELEASE.dm
index 339af71e29..4c173b7b7e 100644
--- a/code/FEA/DEBUG_REMOVE_BEFORE_RELEASE.dm
+++ b/code/FEA/DEBUG_REMOVE_BEFORE_RELEASE.dm
@@ -368,7 +368,7 @@ mob
network.marker = rand(1,4)
for(var/obj/machinery/atmospherics/pipe/P in world)
- P.overlays = null
+ P.overlays.Cut()
var/datum/pipe_network/master = P.return_network()
if(master)
@@ -378,7 +378,7 @@ mob
P.overlays += icon('icons/Testing/atmos_testing.dmi',"marker0")
for(var/obj/machinery/atmospherics/valve/V in world)
- V.overlays = null
+ V.overlays.Cut()
if(V.network_node1)
V.overlays += icon('icons/Testing/atmos_testing.dmi',"marker[V.network_node1.marker]")
@@ -396,7 +396,7 @@ turf/simulated
verb
mark_direction()
set src in world
- overlays = null
+ overlays.Cut()
for(var/direction in list(NORTH,SOUTH,EAST,WEST))
if(group_border&direction)
overlays += icon('icons/Testing/turf_analysis.dmi',"red_arrow",direction)
diff --git a/code/FEA/FEA_fire.dm b/code/FEA/FEA_fire.dm
index 6aaf328b9b..1bd31295e8 100644
--- a/code/FEA/FEA_fire.dm
+++ b/code/FEA/FEA_fire.dm
@@ -62,101 +62,114 @@
var/bypassing = 0
- proc/perform_exposure()
- var/turf/simulated/floor/location = loc
- if(!istype(location)) return 0
+/obj/effect/hotspot/proc/perform_exposure()
+ var/turf/simulated/floor/location = loc
+ if(!istype(location)) return 0
- if(volume > CELL_VOLUME*0.95) bypassing = 1
- else bypassing = 0
+ if(volume > CELL_VOLUME*0.95) bypassing = 1
+ else bypassing = 0
- if(bypassing)
- if(!just_spawned)
- volume = location.air.fuel_burnt*FIRE_GROWTH_RATE
- temperature = location.air.temperature
- else
- var/datum/gas_mixture/affected = location.air.remove_ratio(volume/location.air.volume)
- affected.temperature = temperature
- affected.react()
- temperature = affected.temperature
- volume = affected.fuel_burnt*FIRE_GROWTH_RATE
- location.assume_air(affected)
+ if(bypassing)
+ if(!just_spawned)
+ volume = location.air.fuel_burnt*FIRE_GROWTH_RATE
+ temperature = location.air.temperature
+ else
+ var/datum/gas_mixture/affected = location.air.remove_ratio(volume/location.air.volume)
+ affected.temperature = temperature
+ affected.react()
+ temperature = affected.temperature
+ volume = affected.fuel_burnt*FIRE_GROWTH_RATE
+ location.assume_air(affected)
- for(var/atom/item in loc)
- item.temperature_expose(null, temperature, volume)
+ for(var/atom/item in loc)
+ if(!bypassing)
+ item.temperature_expose(null, temperature, volume)
+ if(item) // It's possible that the item is deleted in temperature_expose
+ item.fire_act(null, temperature, volume)
+
+ return 0
+
+
+/obj/effect/hotspot/process(turf/simulated/list/possible_spread)
+ if(just_spawned)
+ just_spawned = 0
return 0
+ var/turf/simulated/floor/location = loc
+ if(!istype(location))
+ Kill()
- process(turf/simulated/list/possible_spread)
- if(just_spawned)
- just_spawned = 0
- return 0
+ if((temperature < FIRE_MINIMUM_TEMPERATURE_TO_EXIST) || (volume <= 1))
+ Kill()
- var/turf/simulated/floor/location = loc
- if(!istype(location))
- del(src)
+ if(location.air.toxins < 0.5 || location.air.oxygen < 0.5)
+ Kill()
- if((temperature < FIRE_MINIMUM_TEMPERATURE_TO_EXIST) || (volume <= 1))
- del(src)
+ perform_exposure()
- if(location.air.toxins < 0.5 || location.air.oxygen < 0.5)
- del(src)
+ if(location.wet) location.wet = 0
- perform_exposure()
+ if(bypassing)
+ icon_state = "3"
+ location.burn_tile()
- if(location.wet) location.wet = 0
+ //Possible spread due to radiated heat
+ if(location.air.temperature > FIRE_MINIMUM_TEMPERATURE_TO_SPREAD)
+ var/radiated_temperature = location.air.temperature*FIRE_SPREAD_RADIOSITY_SCALE
- if(bypassing)
- icon_state = "3"
- location.burn_tile()
-
- //Possible spread due to radiated heat
- if(location.air.temperature > FIRE_MINIMUM_TEMPERATURE_TO_SPREAD)
- var/radiated_temperature = location.air.temperature*FIRE_SPREAD_RADIOSITY_SCALE
-
- for(var/turf/simulated/possible_target in possible_spread)
- if(!possible_target.active_hotspot)
- possible_target.hotspot_expose(radiated_temperature, CELL_VOLUME/4)
+ for(var/turf/simulated/possible_target in possible_spread)
+ if(!possible_target.active_hotspot)
+ possible_target.hotspot_expose(radiated_temperature, CELL_VOLUME/4)
+ else
+ if(volume > CELL_VOLUME*0.4)
+ icon_state = "2"
else
- if(volume > CELL_VOLUME*0.4)
- icon_state = "2"
+ icon_state = "1"
+
+ if(temperature > location.max_fire_temperature_sustained)
+ location.max_fire_temperature_sustained = temperature
+
+ if(temperature > location.heat_capacity)
+ location.to_be_destroyed = 1
+ /*if(prob(25))
+ location.ReplaceWithSpace()
+ return 0*/
+ return 1
+
+// Garbage collect itself by nulling reference to it
+
+/obj/effect/hotspot/proc/Kill()
+ DestroyTurf()
+ if(istype(loc, /turf/simulated))
+ var/turf/simulated/T = loc
+ if(T.active_hotspot == src)
+ T.active_hotspot = null
+ loc = null
+
+/obj/effect/hotspot/proc/DestroyTurf()
+
+ if(istype(loc, /turf/simulated))
+ var/turf/simulated/T = loc
+ if(T.to_be_destroyed)
+ var/chance_of_deletion
+ if (T.heat_capacity) //beware of division by zero
+ chance_of_deletion = T.max_fire_temperature_sustained / T.heat_capacity * 8 //there is no problem with prob(23456), min() was redundant --rastaf0
else
- icon_state = "1"
+ chance_of_deletion = 100
+ if(prob(chance_of_deletion))
+ T.ChangeTurf(/turf/space)
+ else
+ T.to_be_destroyed = 0
+ T.max_fire_temperature_sustained = 0
- if(temperature > location.max_fire_temperature_sustained)
- location.max_fire_temperature_sustained = temperature
+/obj/effect/hotspot/New()
+ ..()
+ dir = pick(cardinal)
+ return
- if(temperature > location.heat_capacity)
- location.to_be_destroyed = 1
- /*if(prob(25))
- location.ReplaceWithSpace()
- return 0*/
- return 1
-
-
- New()
- ..()
- dir = pick(cardinal)
- return
-
-
- Del()
- if (istype(loc, /turf/simulated))
- var/turf/simulated/T = loc
- loc:active_hotspot = null
-
- if(T.to_be_destroyed)
- var/chance_of_deletion
- if (T.heat_capacity) //beware of division by zero
- chance_of_deletion = T.max_fire_temperature_sustained / T.heat_capacity * 8 //there is no problem with prob(23456), min() was redundant --rastaf0
- else
- chance_of_deletion = 100
- if(prob(chance_of_deletion))
- T.ChangeTurf(/turf/space)
- else
- T.to_be_destroyed = 0
- T.max_fire_temperature_sustained = 0
-
- loc = null
- ..()
- return
+/obj/effect/hotspot/Del()
+ if (istype(loc, /turf/simulated))
+ DestroyTurf()
+ ..()
+ return
\ No newline at end of file
diff --git a/code/FEA/FEA_turf_tile.dm b/code/FEA/FEA_turf_tile.dm
index 1fd6aaf715..65f60c1732 100644
--- a/code/FEA/FEA_turf_tile.dm
+++ b/code/FEA/FEA_turf_tile.dm
@@ -124,7 +124,7 @@ turf
super_conduct()
update_visuals(datum/gas_mixture/model)
- overlays = null
+ overlays.Cut()
var/siding_icon_state = return_siding_icon_state()
if(siding_icon_state)
diff --git a/code/WorkInProgress/Sigyn/Department Sec/__README.dm b/code/WorkInProgress/Sigyn/Department Sec/__README.dm
new file mode 100644
index 0000000000..e6b3f7967f
--- /dev/null
+++ b/code/WorkInProgress/Sigyn/Department Sec/__README.dm
@@ -0,0 +1,8 @@
+/*
+
+Hey you!
+You only need to untick maps/tgstation.2.0.9.dmm for this if you download the modified map from:
+http://tgstation13.googlecode.com/files/tgstation.2.1.0_deptsec.zip
+
+Everything else can just be ticked on top of the original stuff.
+*/
\ No newline at end of file
diff --git a/code/WorkInProgress/Sigyn/Department Sec/jobs.dm b/code/WorkInProgress/Sigyn/Department Sec/jobs.dm
new file mode 100644
index 0000000000..75181dc73e
--- /dev/null
+++ b/code/WorkInProgress/Sigyn/Department Sec/jobs.dm
@@ -0,0 +1,126 @@
+var/list/sec_departments = list("engineering", "supply", "medical", "science")
+
+proc/assign_sec_to_department(var/mob/living/carbon/human/H)
+ if(sec_departments.len)
+ var/department = pick(sec_departments)
+ sec_departments -= department
+ var/access = null
+ var/destination = null
+ switch(department)
+ if("supply")
+ H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/security/cargo(H), slot_w_uniform)
+ H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sec/department/supply(H), slot_ears)
+ access = list(access_mailsorting, access_mining)
+ destination = /area/security/checkpoint/supply
+ if("engineering")
+ H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/security/engine(H), slot_w_uniform)
+ H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sec/department/engi(H), slot_ears)
+ access = list(access_construction, access_engine)
+ destination = /area/security/checkpoint/engineering
+ if("medical")
+ H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/security/med(H), slot_w_uniform)
+ H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sec/department/med(H), slot_ears)
+ access = list(access_medical)
+ destination = /area/security/checkpoint/medical
+ if("science")
+ H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/security/science(H), slot_w_uniform)
+ H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sec/department/sci(H), slot_ears)
+ access = list(access_research)
+ destination = /area/security/checkpoint/science
+ else
+ H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/security(H), slot_w_uniform)
+ H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sec(H), slot_ears)
+
+
+ if(destination)
+ var/teleport = 0
+ if(!ticker || ticker.current_state <= GAME_STATE_SETTING_UP)
+ teleport = 1
+ spawn(15)
+ if(H)
+ if(teleport)
+ var/turf/T
+ var/safety = 0
+ while(safety < 25)
+ T = pick(get_area_turfs(destination))
+ if(!H.Move(T))
+ safety += 1
+ continue
+ else
+ break
+ H << "You have been assigned to [department]!"
+ if(locate(/obj/item/weapon/card/id, H))
+ var/obj/item/weapon/card/id/I = locate(/obj/item/weapon/card/id, H)
+ if(I)
+ I.access |= access
+
+
+/datum/job/officer
+ title = "Security Officer"
+ flag = OFFICER
+ department_flag = ENGSEC
+ faction = "Station"
+ total_positions = 5
+ spawn_positions = 5
+ supervisors = "the head of security, and the head of your assigned department (if applicable)"
+ selection_color = "#ffeeee"
+
+
+ equip(var/mob/living/carbon/human/H)
+ if(!H) return 0
+ if(H.backbag == 2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/security(H), slot_back)
+ if(H.backbag == 3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_sec(H), slot_back)
+ assign_sec_to_department(H)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/jackboots(H), slot_shoes)
+ H.equip_to_slot_or_del(new /obj/item/device/pda/security(H), slot_belt)
+ H.equip_to_slot_or_del(new /obj/item/clothing/suit/armor/vest(H), slot_wear_suit)
+ H.equip_to_slot_or_del(new /obj/item/clothing/head/helmet(H), slot_head)
+ H.equip_to_slot_or_del(new /obj/item/weapon/handcuffs(H), slot_s_store)
+ H.equip_to_slot_or_del(new /obj/item/device/flash(H), slot_l_store)
+ if(H.backbag == 1)
+ 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/handcuffs(H), slot_l_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/weapon/handcuffs(H), slot_in_backpack)
+ var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(H)
+ L.imp_in = H
+ L.implanted = 1
+ return 1
+
+/obj/item/device/radio/headset/headset_sec/department/New()
+ if(radio_controller)
+ initialize()
+ recalculateChannels()
+
+/obj/item/device/radio/headset/headset_sec/department/engi
+ keyslot1 = new /obj/item/device/encryptionkey/headset_sec
+ keyslot2 = new /obj/item/device/encryptionkey/headset_eng
+
+/obj/item/device/radio/headset/headset_sec/department/supply
+ keyslot1 = new /obj/item/device/encryptionkey/headset_sec
+ keyslot2 = new /obj/item/device/encryptionkey/headset_cargo
+
+/obj/item/device/radio/headset/headset_sec/department/med
+ keyslot1 = new /obj/item/device/encryptionkey/headset_sec
+ keyslot2 = new /obj/item/device/encryptionkey/headset_med
+
+/obj/item/device/radio/headset/headset_sec/department/sci
+ keyslot1 = new /obj/item/device/encryptionkey/headset_sec
+ keyslot2 = new /obj/item/device/encryptionkey/headset_sci
+
+/obj/item/clothing/under/rank/security/cargo/New()
+ var/obj/item/clothing/tie/armband/cargo/A = new /obj/item/clothing/tie/armband/cargo
+ hastie = A
+
+/obj/item/clothing/under/rank/security/engine/New()
+ var/obj/item/clothing/tie/armband/engine/A = new /obj/item/clothing/tie/armband/engine
+ hastie = A
+
+/obj/item/clothing/under/rank/security/science/New()
+ var/obj/item/clothing/tie/armband/science/A = new /obj/item/clothing/tie/armband/science
+ hastie = A
+
+/obj/item/clothing/under/rank/security/med/New()
+ var/obj/item/clothing/tie/armband/med/A = new /obj/item/clothing/tie/armband/med
+ hastie = A
\ No newline at end of file
diff --git a/code/WorkInProgress/Sigyn/Softcurity/__README.dm b/code/WorkInProgress/Sigyn/Softcurity/__README.dm
new file mode 100644
index 0000000000..75c62c277d
--- /dev/null
+++ b/code/WorkInProgress/Sigyn/Softcurity/__README.dm
@@ -0,0 +1,10 @@
+/*
+
+Hey you!
+You'll need to untick code/game/jobs/access.dm for this to all work correctly!
+
+Everything else can just be ticked on top of the original stuff.
+
+You'll also need to download a modified map from http://tgstation13.googlecode.com/files/tgstation.2.0.9_Softcurity.zip.
+Make sure to untick the original map!
+*/
\ No newline at end of file
diff --git a/code/WorkInProgress/Sigyn/Softcurity/access.dm b/code/WorkInProgress/Sigyn/Softcurity/access.dm
new file mode 100644
index 0000000000..d0dace17bf
--- /dev/null
+++ b/code/WorkInProgress/Sigyn/Softcurity/access.dm
@@ -0,0 +1,522 @@
+//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31
+
+/var/const/access_security = 1 // Security equipment
+/var/const/access_brig = 2 // Brig timers and permabrig
+/var/const/access_armory = 3
+/var/const/access_forensics_lockers= 4
+/var/const/access_medical = 5
+/var/const/access_morgue = 6
+/var/const/access_tox = 7
+/var/const/access_tox_storage = 8
+/var/const/access_genetics = 9
+/var/const/access_engine = 10
+/var/const/access_engine_equip= 11
+/var/const/access_maint_tunnels = 12
+/var/const/access_external_airlocks = 13
+/var/const/access_emergency_storage = 14
+/var/const/access_change_ids = 15
+/var/const/access_ai_upload = 16
+/var/const/access_teleporter = 17
+/var/const/access_eva = 18
+/var/const/access_heads = 19
+/var/const/access_captain = 20
+/var/const/access_all_personal_lockers = 21
+/var/const/access_chapel_office = 22
+/var/const/access_tech_storage = 23
+/var/const/access_atmospherics = 24
+/var/const/access_bar = 25
+/var/const/access_janitor = 26
+/var/const/access_crematorium = 27
+/var/const/access_kitchen = 28
+/var/const/access_robotics = 29
+/var/const/access_rd = 30
+/var/const/access_cargo = 31
+/var/const/access_construction = 32
+/var/const/access_chemistry = 33
+/var/const/access_cargo_bot = 34
+/var/const/access_hydroponics = 35
+/var/const/access_manufacturing = 36
+/var/const/access_library = 37
+/var/const/access_lawyer = 38
+/var/const/access_virology = 39
+/var/const/access_cmo = 40
+/var/const/access_qm = 41
+/var/const/access_court = 42
+/var/const/access_clown = 43
+/var/const/access_mime = 44
+/var/const/access_surgery = 45
+/var/const/access_theatre = 46
+/var/const/access_research = 47
+/var/const/access_mining = 48
+/var/const/access_mining_office = 49 //not in use
+/var/const/access_mailsorting = 50
+/var/const/access_mint = 51
+/var/const/access_mint_vault = 52
+/var/const/access_heads_vault = 53
+/var/const/access_mining_station = 54
+/var/const/access_xenobiology = 55
+/var/const/access_ce = 56
+/var/const/access_hop = 57
+/var/const/access_hos = 58
+/var/const/access_RC_announce = 59 //Request console announcements
+/var/const/access_keycard_auth = 60 //Used for events which require at least two people to confirm them
+/var/const/access_tcomsat = 61 // has access to the entire telecomms satellite / machinery
+/var/const/access_gateway = 62
+/var/const/access_sec_doors = 63 // Security front doors
+
+ //BEGIN CENTCOM ACCESS
+ /*Should leave plenty of room if we need to add more access levels.
+/var/const/Mostly for admin fun times.*/
+/var/const/access_cent_general = 101//General facilities.
+/var/const/access_cent_thunder = 102//Thunderdome.
+/var/const/access_cent_specops = 103//Special Ops.
+/var/const/access_cent_medical = 104//Medical/Research
+/var/const/access_cent_living = 105//Living quarters.
+/var/const/access_cent_storage = 106//Generic storage areas.
+/var/const/access_cent_teleporter = 107//Teleporter.
+/var/const/access_cent_creed = 108//Creed's office.
+/var/const/access_cent_captain = 109//Captain's office/ID comp/AI.
+
+ //The Syndicate
+/var/const/access_syndicate = 150//General Syndicate Access
+
+ //MONEY
+/var/const/access_crate_cash = 200
+
+/obj/var/list/req_access = null
+/obj/var/req_access_txt = "0"
+/obj/var/list/req_one_access = null
+/obj/var/req_one_access_txt = "0"
+
+/obj/New()
+ ..()
+ //NOTE: If a room requires more than one access (IE: Morgue + medbay) set the req_acesss_txt to "5;6" if it requires 5 and 6
+ if(src.req_access_txt)
+ var/list/req_access_str = text2list(req_access_txt,";")
+ if(!req_access)
+ req_access = list()
+ for(var/x in req_access_str)
+ var/n = text2num(x)
+ if(n)
+ req_access += n
+
+ if(src.req_one_access_txt)
+ var/list/req_one_access_str = text2list(req_one_access_txt,";")
+ if(!req_one_access)
+ req_one_access = list()
+ for(var/x in req_one_access_str)
+ var/n = text2num(x)
+ if(n)
+ req_one_access += n
+
+
+
+//returns 1 if this mob has sufficient access to use this object
+/obj/proc/allowed(mob/M)
+ //check if it doesn't require any access at all
+ if(src.check_access(null))
+ return 1
+ if(istype(M, /mob/living/silicon))
+ //AI can do whatever he wants
+ return 1
+ else if(istype(M, /mob/living/carbon/human))
+ var/mob/living/carbon/human/H = M
+ //if they are holding or wearing a card that has access, that works
+ if(src.check_access(H.get_active_hand()) || src.check_access(H.wear_id))
+ return 1
+ else if(istype(M, /mob/living/carbon/monkey) || istype(M, /mob/living/carbon/alien/humanoid))
+ var/mob/living/carbon/george = M
+ //they can only hold things :(
+ if(george.get_active_hand() && (istype(george.get_active_hand(), /obj/item/weapon/card/id) || istype(george.get_active_hand(), /obj/item/device/pda)) && src.check_access(george.get_active_hand()))
+ return 1
+ return 0
+
+/obj/item/proc/GetAccess()
+ return list()
+
+/obj/item/proc/GetID()
+ return null
+
+/obj/proc/check_access(obj/item/weapon/card/id/I)
+
+ if (istype(I, /obj/item/device/pda))
+ var/obj/item/device/pda/pda = I
+ I = pda.id
+
+ if(!src.req_access && !src.req_one_access) //no requirements
+ return 1
+ if(!istype(src.req_access, /list)) //something's very wrong
+ return 1
+
+ var/list/L = src.req_access
+ if(!L.len && (!src.req_one_access || !src.req_one_access.len)) //no requirements
+ return 1
+ if(!I || !istype(I, /obj/item/weapon/card/id) || !I.access) //not ID or no access
+ return 0
+ for(var/req in src.req_access)
+ if(!(req in I.access)) //doesn't have this access
+ return 0
+ if(src.req_one_access && src.req_one_access.len)
+ for(var/req in src.req_one_access)
+ if(req in I.access) //has an access from the single access list
+ return 1
+ return 0
+ return 1
+
+
+/obj/proc/check_access_list(var/list/L)
+ if(!src.req_access && !src.req_one_access) return 1
+ if(!istype(src.req_access, /list)) return 1
+ if(!src.req_access.len && (!src.req_one_access || !src.req_one_access.len)) return 1
+ if(!L) return 0
+ if(!istype(L, /list)) return 0
+ for(var/req in src.req_access)
+ if(!(req in L)) //doesn't have this access
+ return 0
+ if(src.req_one_access && src.req_one_access.len)
+ for(var/req in src.req_one_access)
+ if(req in L) //has an access from the single access list
+ return 1
+ return 0
+ return 1
+
+
+/proc/get_access(job)
+ switch(job)
+ if("Geneticist")
+ return list(access_medical, access_morgue, access_genetics)
+ if("Station Engineer")
+ return list(access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks, access_construction)
+ if("Assistant")
+ if(config.assistant_maint)
+ return list(access_maint_tunnels)
+ else
+ return list()
+ if("Chaplain")
+ return list(access_morgue, access_chapel_office, access_crematorium)
+ if("Detective")
+ return list(access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_court)
+ if("Medical Doctor")
+ return list(access_medical, access_morgue, access_surgery)
+ if("Botanist") // -- TLE
+ return list(access_hydroponics, access_morgue) // Removed tox and chem access because STOP PISSING OFF THE CHEMIST GUYS // //Removed medical access because WHAT THE FUCK YOU AREN'T A DOCTOR YOU GROW WHEAT //Given Morgue access because they have a viable means of cloning.
+ if("Librarian") // -- TLE
+ return list(access_library)
+ if("Lawyer") //Muskets 160910
+ return list(access_lawyer, access_court, access_sec_doors)
+ if("Captain")
+ return get_all_accesses()
+ if("Crew Supervisor")
+ return list(access_security, access_sec_doors, access_brig, access_court)
+ if("Correctional Advisor")
+ return list(access_security, access_sec_doors, access_brig, access_armory, access_court)
+ if("Scientist")
+ return list(access_tox, access_tox_storage, access_research, access_xenobiology)
+ if("Safety Administrator")
+ return list(access_medical, access_morgue, access_tox, access_tox_storage, access_chemistry, access_genetics, access_court,
+ access_teleporter, access_heads, access_tech_storage, access_security, access_sec_doors, access_brig, access_atmospherics,
+ access_maint_tunnels, access_bar, access_janitor, access_kitchen, access_robotics, access_armory, access_hydroponics,
+ access_theatre, access_research, access_hos, access_RC_announce, access_forensics_lockers, access_keycard_auth, access_gateway)
+ if("Head of Personnel")
+ return list(access_security, access_sec_doors, access_brig, access_court, access_forensics_lockers,
+ access_tox, access_tox_storage, access_chemistry, access_medical, access_genetics, access_engine,
+ access_emergency_storage, access_change_ids, access_ai_upload, access_eva, access_heads,
+ access_all_personal_lockers, access_tech_storage, access_maint_tunnels, access_bar, access_janitor,
+ access_crematorium, access_kitchen, access_robotics, 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)
+ if("Atmospheric Technician")
+ return list(access_atmospherics, access_maint_tunnels, access_emergency_storage, access_construction)
+ if("Bartender")
+ return list(access_bar)
+ if("Chemist")
+ return list(access_medical, access_chemistry)
+ if("Janitor")
+ return list(access_janitor, access_maint_tunnels)
+ if("Clown")
+ return list(access_clown, access_theatre)
+ if("Mime")
+ return list(access_mime, access_theatre)
+ if("Chef")
+ return list(access_kitchen, access_morgue)
+ if("Roboticist")
+ return list(access_robotics, access_tech_storage, access_morgue) //As a job that handles so many corpses, it makes sense for them to have morgue access.
+ if("Cargo Technician")
+ return list(access_maint_tunnels, access_cargo, access_cargo_bot, access_mailsorting)
+ if("Shaft Miner")
+ return list(access_mining, access_mint, access_mining_station)
+ if("Quartermaster")
+ return list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mint, access_mining, access_mining_station)
+ if("Chief Engineer")
+ return list(access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels,
+ access_teleporter, access_external_airlocks, access_atmospherics, access_emergency_storage, access_eva,
+ access_heads, access_ai_upload, access_construction, access_robotics,
+ access_mint, access_ce, access_RC_announce, access_keycard_auth, access_tcomsat, access_sec_doors)
+ if("Research Director")
+ return list(access_rd, access_heads, access_tox, access_genetics,
+ access_tox_storage, access_teleporter,
+ access_research, access_robotics, access_xenobiology,
+ access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway, access_sec_doors)
+ if("Virologist")
+ return list(access_medical, access_virology)
+ if("Chief Medical Officer")
+ return list(access_medical, access_morgue, access_genetics, access_heads,
+ access_chemistry, access_virology, access_cmo, access_surgery, access_RC_announce,
+ access_keycard_auth, access_sec_doors)
+ else
+ return list()
+
+/proc/get_centcom_access(job)
+ switch(job)
+ if("VIP Guest")
+ return list(access_cent_general)
+ if("Custodian")
+ return list(access_cent_general, access_cent_living, access_cent_storage)
+ if("Thunderdome Overseer")
+ return list(access_cent_general, access_cent_thunder)
+ if("Intel Officer")
+ return list(access_cent_general, access_cent_living)
+ if("Medical Officer")
+ return list(access_cent_general, access_cent_living, access_cent_medical)
+ if("Death Commando")
+ return list(access_cent_general, access_cent_specops, access_cent_living, access_cent_storage)
+ if("Research Officer")
+ return list(access_cent_general, access_cent_specops, access_cent_medical, access_cent_teleporter, access_cent_storage)
+ if("BlackOps Commander")
+ return list(access_cent_general, access_cent_thunder, access_cent_specops, access_cent_living, access_cent_storage, access_cent_creed)
+ if("Supreme Commander")
+ return get_all_centcom_access()
+
+/proc/get_all_accesses()
+ return list(access_security, access_sec_doors, access_brig, access_armory, access_forensics_lockers, access_court,
+ access_medical, access_genetics, access_morgue, access_rd,
+ access_tox, access_tox_storage, access_chemistry, access_engine, access_engine_equip, access_maint_tunnels,
+ access_external_airlocks, access_emergency_storage, access_change_ids, access_ai_upload,
+ access_teleporter, access_eva, access_heads, access_captain, access_all_personal_lockers,
+ access_tech_storage, access_chapel_office, access_atmospherics, access_kitchen,
+ access_bar, access_janitor, access_crematorium, access_robotics, access_cargo, access_cargo_bot, access_construction,
+ access_hydroponics, access_library, access_manufacturing, access_lawyer, access_virology, access_cmo, access_qm, access_clown, access_mime, access_surgery,
+ access_theatre, access_research, access_mining, access_mailsorting, access_mint_vault, access_mint,
+ access_heads_vault, access_mining_station, access_xenobiology, access_ce, access_hop, access_hos, access_RC_announce,
+ access_keycard_auth, access_tcomsat, access_gateway)
+
+/proc/get_all_centcom_access()
+ return list(access_cent_general, access_cent_thunder, access_cent_specops, access_cent_medical, access_cent_living, access_cent_storage, access_cent_teleporter, access_cent_creed, access_cent_captain)
+
+/proc/get_all_syndicate_access()
+ return list(access_syndicate)
+
+/proc/get_region_accesses(var/code)
+ switch(code)
+ if(0)
+ return get_all_accesses()
+ if(1) //security
+ return list(access_sec_doors, access_security, access_brig, access_armory, access_forensics_lockers, access_court, access_hos)
+ if(2) //medbay
+ return list(access_medical, access_genetics, access_morgue, access_chemistry, access_virology, access_surgery, access_cmo)
+ if(3) //research
+ return list(access_research, access_tox, access_tox_storage, access_xenobiology, access_rd)
+ if(4) //engineering and maintenance
+ return list(access_maint_tunnels, access_engine, access_engine_equip, access_external_airlocks, access_tech_storage, access_atmospherics, access_construction, access_robotics, access_ce)
+ if(5) //command
+ return list(access_heads, access_change_ids, access_ai_upload, access_teleporter, access_eva, access_all_personal_lockers, access_heads_vault, access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway, access_hop, access_captain)
+ if(6) //station general
+ return list(access_kitchen,access_bar, access_hydroponics, access_janitor, access_chapel_office, access_crematorium, access_library, access_theatre, access_lawyer, access_clown, access_mime)
+ if(7) //supply
+ return list(access_cargo, access_cargo_bot, access_mailsorting, access_qm, access_mining, access_mining_station)
+
+/proc/get_region_accesses_name(var/code)
+ switch(code)
+ if(0)
+ return "All"
+ if(1) //security
+ return "Security"
+ if(2) //medbay
+ return "Medbay"
+ if(3) //research
+ return "Research"
+ if(4) //engineering and maintenance
+ return "Engineering"
+ if(5) //command
+ return "Command"
+ if(6) //station general
+ return "Station General"
+ if(7) //supply
+ return "Supply"
+
+
+/proc/get_access_desc(A)
+ switch(A)
+ if(access_cargo)
+ return "Cargo Bay"
+ if(access_cargo_bot)
+ return "Cargo Bot Delivery"
+ if(access_security)
+ return "Security"
+ if(access_brig)
+ return "Holding Cells"
+ if(access_court)
+ return "Courtroom"
+ if(access_forensics_lockers)
+ return "Detective's Office"
+ if(access_medical)
+ return "Medical"
+ if(access_genetics)
+ return "Genetics Lab"
+ if(access_morgue)
+ return "Morgue"
+ if(access_tox)
+ return "Research Lab"
+ if(access_tox_storage)
+ return "Toxins Storage"
+ if(access_chemistry)
+ return "Chemistry Lab"
+ if(access_rd)
+ return "RD Private"
+ if(access_bar)
+ return "Bar"
+ if(access_janitor)
+ return "Custodial Closet"
+ if(access_engine)
+ return "Engineering"
+ if(access_engine_equip)
+ return "APCs"
+ if(access_maint_tunnels)
+ return "Maintenance"
+ if(access_external_airlocks)
+ return "External Airlocks"
+ if(access_emergency_storage)
+ return "Emergency Storage"
+ if(access_change_ids)
+ return "ID Computer"
+ if(access_ai_upload)
+ return "AI Upload"
+ if(access_teleporter)
+ return "Teleporter"
+ if(access_eva)
+ return "EVA"
+ if(access_heads)
+ return "Bridge"
+ if(access_captain)
+ return "Captain Private"
+ if(access_all_personal_lockers)
+ return "Personal Lockers"
+ if(access_chapel_office)
+ return "Chapel Office"
+ if(access_tech_storage)
+ return "Technical Storage"
+ if(access_atmospherics)
+ return "Atmospherics"
+ if(access_crematorium)
+ return "Crematorium"
+ if(access_armory)
+ return "Armory"
+ if(access_construction)
+ return "Construction Areas"
+ if(access_kitchen)
+ return "Kitchen"
+ if(access_hydroponics)
+ return "Hydroponics"
+ if(access_library)
+ return "Library"
+ if(access_lawyer)
+ return "Law Office"
+ if(access_robotics)
+ return "Robotics"
+ if(access_virology)
+ return "Virology"
+ if(access_cmo)
+ return "CMO Private"
+ if(access_qm)
+ return "Quartermaster's Office"
+ if(access_clown)
+ return "HONK! Access"
+ if(access_mime)
+ return "Silent Access"
+ if(access_surgery)
+ return "Surgery"
+ if(access_theatre)
+ return "Theatre"
+ if(access_manufacturing)
+ return "Manufacturing"
+ if(access_research)
+ return "Science"
+ if(access_mining)
+ return "Mining"
+ if(access_mining_office)
+ return "Mining Office"
+ if(access_mailsorting)
+ return "Delivery Office"
+ if(access_mint)
+ return "Mint"
+ if(access_mint_vault)
+ return "Mint Vault"
+ if(access_heads_vault)
+ return "Main Vault"
+ if(access_mining_station)
+ return "Mining Station EVA"
+ if(access_xenobiology)
+ return "Xenobiology Lab"
+ if(access_hop)
+ return "HoP Private"
+ if(access_hos)
+ return "HoS Private"
+ if(access_ce)
+ return "CE Private"
+ if(access_RC_announce)
+ return "RC Announcements"
+ if(access_keycard_auth)
+ return "Keycode Auth. Device"
+ if(access_tcomsat)
+ return "Telecommunications"
+ if(access_gateway)
+ return "Gateway"
+ if(access_sec_doors)
+ return "Brig"
+
+/proc/get_centcom_access_desc(A)
+ switch(A)
+ if(access_cent_general)
+ return "Code Grey"
+ if(access_cent_thunder)
+ return "Code Yellow"
+ if(access_cent_storage)
+ return "Code Orange"
+ if(access_cent_living)
+ return "Code Green"
+ if(access_cent_medical)
+ return "Code White"
+ if(access_cent_teleporter)
+ return "Code Blue"
+ if(access_cent_specops)
+ return "Code Black"
+ if(access_cent_creed)
+ return "Code Silver"
+ if(access_cent_captain)
+ return "Code Gold"
+
+/proc/get_all_jobs()
+ return list("Assistant", "Captain", "Head of Personnel", "Bartender", "Chef", "Botanist", "Quartermaster", "Cargo Technician",
+ "Shaft Miner", "Clown", "Mime", "Janitor", "Librarian", "Lawyer", "Chaplain", "Chief Engineer", "Station Engineer",
+ "Atmospheric Technician", "Roboticist", "Chief Medical Officer", "Medical Doctor", "Chemist", "Geneticist", "Virologist",
+ "Research Director", "Scientist", "Head of Security", "Warden", "Detective", "Security Officer")
+
+/proc/get_all_centcom_jobs()
+ return list("VIP Guest","Custodian","Thunderdome Overseer","Intel Officer","Medical Officer","Death Commando","Research Officer","BlackOps Commander","Supreme Commander")
+
+/obj/proc/GetJobName()
+ if (!istype(src, /obj/item/device/pda) && !istype(src,/obj/item/weapon/card/id))
+ return
+
+ var/jobName
+
+ if(istype(src, /obj/item/device/pda))
+ if(src:id)
+ jobName = src:id:assignment
+ if(istype(src, /obj/item/weapon/card/id))
+ jobName = src:assignment
+
+ if(jobName in get_all_jobs())
+ return jobName
+ else
+ return "Unknown"
diff --git a/code/WorkInProgress/Sigyn/Softcurity/clothing.dm b/code/WorkInProgress/Sigyn/Softcurity/clothing.dm
new file mode 100644
index 0000000000..057c10cb57
--- /dev/null
+++ b/code/WorkInProgress/Sigyn/Softcurity/clothing.dm
@@ -0,0 +1,33 @@
+/obj/item/clothing/under/rank/administrator
+ name = "safety administrator's jumpsuit"
+ desc = "It's a jumpsuit worn by those few with the dedication to achieve the position of \"Safety Administrator\"."
+ icon_state = "hosblueclothes"
+ item_state = "ba_suit"
+ color = "hosblueclothes"
+ armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+ flags = FPRINT | TABLEPASS | ONESIZEFITSALL
+
+/obj/item/clothing/under/rank/advisor
+ name = "correctional advisor's jumpsuit"
+ desc = "It's made of a slightly sturdier material than standard jumpsuits, to allow for more robust protection. It has the words \"Correctional Advisor\" written on the shoulders."
+ icon_state = "wardenblueclothes"
+ item_state = "ba_suit"
+ color = "wardenblueclothes"
+ armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+ flags = FPRINT | TABLEPASS | ONESIZEFITSALL
+
+/obj/item/clothing/under/rank/supervisor
+ name = "crew supervisor's jumpsuit"
+ desc = "It's made of a slightly sturdier material than standard jumpsuits, to allow for robust protection."
+ icon_state = "officerblueclothes"
+ item_state = "ba_suit"
+ color = "officerblueclothes"
+ armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+ flags = FPRINT | TABLEPASS | ONESIZEFITSALL
+
+/obj/item/clothing/shoes/boots
+ name = "boots"
+ desc = "Nanotrasen-issue hard-toe safety boots."
+ icon_state = "secshoes"
+ item_state = "secshoes"
+ color = "hosred"
\ No newline at end of file
diff --git a/code/WorkInProgress/Sigyn/Softcurity/jobs.dm b/code/WorkInProgress/Sigyn/Softcurity/jobs.dm
new file mode 100644
index 0000000000..a214626d1c
--- /dev/null
+++ b/code/WorkInProgress/Sigyn/Softcurity/jobs.dm
@@ -0,0 +1,152 @@
+/datum/job/hos
+ title = "Safety Administrator"
+ flag = HOS
+ department_flag = ENGSEC
+ faction = "Station"
+ total_positions = 1
+ spawn_positions = 1
+ supervisors = "the captain"
+ selection_color = "#ffdddd"
+ idtype = /obj/item/weapon/card/id/silver
+ req_admin_notify = 1
+
+
+ equip(var/mob/living/carbon/human/H)
+ if(!H) return 0
+ H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_sec(H), slot_back)
+ H.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/hos(H), slot_ears)
+ H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/administrator(H), slot_w_uniform)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/boots(H), slot_shoes)
+ H.equip_to_slot_or_del(new /obj/item/device/pda/heads/hos(H), slot_belt)
+ H.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(H), slot_glasses)
+ H.equip_to_slot_or_del(new /obj/item/clothing/suit/armor/vest(H), slot_wear_suit)
+ H.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/taser(H), slot_s_store)
+ 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/handcuffs(H), slot_in_backpack)
+ var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(H)
+ L.imp_in = H
+ L.implanted = 1
+ return 1
+
+
+
+/datum/job/warden
+ title = "Correctional Advisor"
+ flag = WARDEN
+ department_flag = ENGSEC
+ faction = "Station"
+ total_positions = 1
+ spawn_positions = 1
+ supervisors = "the safety administrator"
+ selection_color = "#ffeeee"
+
+
+ equip(var/mob/living/carbon/human/H)
+ if(!H) return 0
+ H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sec(H), slot_ears)
+ H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_sec(H), slot_back)
+ H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/advisor(H), slot_w_uniform)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/boots(H), slot_shoes)
+ H.equip_to_slot_or_del(new /obj/item/device/pda/warden(H), slot_belt)
+ H.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(H), slot_glasses)
+ H.equip_to_slot_or_del(new /obj/item/device/flash(H), slot_l_store)
+ 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/handcuffs(H), slot_in_backpack)
+ var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(H)
+ L.imp_in = H
+ L.implanted = 1
+ return 1
+
+
+
+/datum/job/detective
+ title = "Detective"
+ flag = DETECTIVE
+ department_flag = ENGSEC
+ faction = "Station"
+ total_positions = 1
+ spawn_positions = 1
+ supervisors = "the safety administrator"
+ selection_color = "#ffeeee"
+
+
+ equip(var/mob/living/carbon/human/H)
+ if(!H) return 0
+ H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sec(H), slot_ears)
+ H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_norm(H), slot_back)
+ 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)
+ H.equip_to_slot_or_del(new /obj/item/clothing/head/det_hat(H), slot_head)
+ 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)
+ H.equip_to_slot_or_del(new /obj/item/clothing/suit/det_suit(H), slot_wear_suit)
+ H.equip_to_slot_or_del(new /obj/item/weapon/lighter/zippo(H), slot_l_store)
+
+ 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)
+
+ var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(H)
+ L.imp_in = H
+ L.implanted = 1
+ return 1
+
+
+
+/datum/job/officer
+ title = "Crew Supervisor"
+ flag = OFFICER
+ department_flag = ENGSEC
+ faction = "Station"
+ total_positions = 5
+ spawn_positions = 5
+ supervisors = "the safety administrator"
+ selection_color = "#ffeeee"
+
+
+ equip(var/mob/living/carbon/human/H)
+ if(!H) return 0
+ H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sec(H), slot_ears)
+ H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_sec(H), slot_back)
+ H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/supervisor(H), slot_w_uniform)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/boots(H), slot_shoes)
+ H.equip_to_slot_or_del(new /obj/item/device/pda/security(H), slot_belt)
+ H.equip_to_slot_or_del(new /obj/item/weapon/handcuffs(H), slot_r_store)
+ H.equip_to_slot_or_del(new /obj/item/device/flash(H), slot_l_store)
+ 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/handcuffs(H), slot_in_backpack)
+ var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(H)
+ L.imp_in = H
+ L.implanted = 1
+ return 1
+
+/datum/job/hop
+ title = "Head of Personnel"
+ flag = HOP
+ department_flag = CIVILIAN
+ faction = "Station"
+ total_positions = 1
+ spawn_positions = 1
+ supervisors = "the captain"
+ selection_color = "#ddddff"
+ idtype = /obj/item/weapon/card/id/silver
+ req_admin_notify = 1
+
+
+ equip(var/mob/living/carbon/human/H)
+ if(!H) return 0
+ H.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/hop(H), slot_ears)
+ if(H.backbag == 2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back)
+ if(H.backbag == 3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_norm(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/under/rank/head_of_personnel(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/hop(H), slot_belt)
+ if(H.backbag == 1)
+ H.equip_to_slot_or_del(new /obj/item/weapon/storage/id_kit(H), slot_r_hand)
+ else
+ H.equip_to_slot_or_del(new /obj/item/weapon/storage/id_kit(H.back), slot_in_backpack)
+ return 1
diff --git a/code/WorkInProgress/Sigyn/Softcurity/secure_closet.dm b/code/WorkInProgress/Sigyn/Softcurity/secure_closet.dm
new file mode 100644
index 0000000000..88f06f98e7
--- /dev/null
+++ b/code/WorkInProgress/Sigyn/Softcurity/secure_closet.dm
@@ -0,0 +1,235 @@
+/obj/structure/closet/secure_closet/captains
+ name = "Captain's Locker"
+ req_access = list(access_captain)
+ icon_state = "capsecure1"
+ icon_closed = "capsecure"
+ icon_locked = "capsecure1"
+ icon_opened = "capsecureopen"
+ icon_broken = "capsecurebroken"
+ icon_off = "capsecureoff"
+
+ New()
+ sleep(2)
+ if(prob(50))
+ new /obj/item/weapon/storage/backpack/captain(src)
+ else
+ new /obj/item/weapon/storage/backpack/satchel_cap(src)
+ new /obj/item/clothing/suit/captunic(src)
+ new /obj/item/clothing/head/helmet/cap(src)
+ new /obj/item/clothing/under/rank/captain(src)
+ new /obj/item/clothing/suit/armor/vest(src)
+ new /obj/item/weapon/cartridge/captain(src)
+ new /obj/item/clothing/head/helmet/swat(src)
+ new /obj/item/clothing/shoes/brown(src)
+ new /obj/item/device/radio/headset/heads/captain(src)
+ new /obj/item/weapon/reagent_containers/food/drinks/flask(src)
+ new /obj/item/clothing/gloves/captain(src)
+ new /obj/item/weapon/gun/energy/gun(src)
+ return
+
+
+
+/obj/structure/closet/secure_closet/hop
+ name = "Head of Personnel's Locker"
+ req_access = list(access_hop)
+ icon_state = "hopsecure1"
+ icon_closed = "hopsecure"
+ icon_locked = "hopsecure1"
+ icon_opened = "hopsecureopen"
+ icon_broken = "hopsecurebroken"
+ icon_off = "hopsecureoff"
+
+ New()
+ sleep(2)
+ new /obj/item/clothing/under/rank/head_of_personnel(src)
+ new /obj/item/clothing/suit/armor/vest(src)
+ new /obj/item/clothing/head/helmet(src)
+ new /obj/item/weapon/cartridge/hop(src)
+ new /obj/item/device/radio/headset/heads/hop(src)
+ new /obj/item/clothing/shoes/brown(src)
+ new /obj/item/weapon/storage/id_kit(src)
+ new /obj/item/weapon/storage/id_kit( src )
+ new /obj/item/device/flash(src)
+ new /obj/item/clothing/glasses/sunglasses(src)
+ return
+
+
+
+/obj/structure/closet/secure_closet/hos
+ name = "Safety Administrator's Locker"
+ req_access = list(access_hos)
+ icon_state = "hossecure1"
+ icon_closed = "hossecure"
+ icon_locked = "hossecure1"
+ icon_opened = "hossecureopen"
+ icon_broken = "hossecurebroken"
+ icon_off = "hossecureoff"
+
+ New()
+ sleep(2)
+ new /obj/item/weapon/storage/backpack/satchel_sec(src)
+ new /obj/item/weapon/cartridge/hos(src)
+ new /obj/item/device/radio/headset/heads/hos(src)
+ new /obj/item/weapon/storage/lockbox/loyalty(src)
+ new /obj/item/weapon/storage/flashbang_kit(src)
+ new /obj/item/weapon/storage/belt/security(src)
+ new /obj/item/device/flash(src)
+ new /obj/item/weapon/melee/baton(src)
+ new /obj/item/weapon/gun/energy/taser(src)
+ new /obj/item/weapon/reagent_containers/spray/pepper(src)
+ return
+
+
+
+/obj/structure/closet/secure_closet/warden
+ name = "Correctional Advisor's Locker"
+ req_access = list(access_armory)
+ icon_state = "wardensecure1"
+ icon_closed = "wardensecure"
+ icon_locked = "wardensecure1"
+ icon_opened = "wardensecureopen"
+ icon_broken = "wardensecurebroken"
+ icon_off = "wardensecureoff"
+
+
+ New()
+ sleep(2)
+ new /obj/item/weapon/storage/backpack/satchel_sec(src)
+ new /obj/item/clothing/under/rank/advisor(src)
+ new /obj/item/device/radio/headset/headset_sec(src)
+ new /obj/item/clothing/glasses/sunglasses(src)
+ new /obj/item/weapon/storage/flashbang_kit(src)
+ new /obj/item/weapon/storage/belt/security(src)
+ new /obj/item/weapon/reagent_containers/spray/pepper(src)
+ new /obj/item/weapon/reagent_containers/spray/pepper(src)
+ new /obj/item/weapon/melee/baton(src)
+ return
+
+
+
+/obj/structure/closet/secure_closet/security
+ name = "Crew Supervisor's Locker"
+ req_access = list(access_security)
+ icon_state = "sec1"
+ icon_closed = "sec"
+ icon_locked = "sec1"
+ icon_opened = "secopen"
+ icon_broken = "secbroken"
+ icon_off = "secoff"
+
+ New()
+ sleep(2)
+ new /obj/item/weapon/storage/backpack/satchel_sec(src)
+ new /obj/item/device/radio/headset/headset_sec(src)
+ new /obj/item/weapon/storage/belt/security(src)
+ new /obj/item/device/flash(src)
+ new /obj/item/weapon/reagent_containers/spray/pepper(src)
+ new /obj/item/weapon/reagent_containers/spray/pepper(src)
+ new /obj/item/clothing/glasses/sunglasses(src)
+ return
+
+
+
+/obj/structure/closet/secure_closet/detective
+ name = "Detective's Cabinet"
+ req_access = list(access_forensics_lockers)
+ icon_state = "cabinetdetective_locked"
+ icon_closed = "cabinetdetective"
+ icon_locked = "cabinetdetective_locked"
+ icon_opened = "cabinetdetective_open"
+ icon_broken = "cabinetdetective_broken"
+ icon_off = "cabinetdetective_broken"
+
+ New()
+ sleep(2)
+ new /obj/item/clothing/under/det(src)
+ new /obj/item/clothing/suit/armor/det_suit(src)
+ new /obj/item/clothing/suit/det_suit(src)
+ new /obj/item/clothing/gloves/black(src)
+ new /obj/item/clothing/head/det_hat(src)
+ new /obj/item/clothing/shoes/brown(src)
+ new /obj/item/device/radio/headset/headset_sec(src)
+ new /obj/item/weapon/cartridge/detective(src)
+ new /obj/item/weapon/clipboard(src)
+ new /obj/item/device/detective_scanner(src)
+ new /obj/item/weapon/storage/box/evidence(src)
+ return
+
+/obj/structure/closet/secure_closet/detective/update_icon()
+ if(broken)
+ icon_state = icon_broken
+ else
+ if(!opened)
+ if(locked)
+ icon_state = icon_locked
+ else
+ icon_state = icon_closed
+ else
+ icon_state = icon_opened
+
+/obj/structure/closet/secure_closet/injection
+ name = "Lethal Injections"
+ req_access = list(access_hos)
+
+
+ New()
+ sleep(2)
+ new /obj/item/weapon/reagent_containers/ld50_syringe/choral(src)
+ new /obj/item/weapon/reagent_containers/ld50_syringe/choral(src)
+ return
+
+
+
+/obj/structure/closet/secure_closet/brig
+ name = "Brig Locker"
+ req_access = list(access_brig)
+ anchored = 1
+
+ New()
+ new /obj/item/clothing/under/color/orange( src )
+ new /obj/item/clothing/shoes/orange( src )
+ return
+
+
+
+/obj/structure/closet/secure_closet/courtroom
+ name = "Courtroom Locker"
+ req_access = list(access_court)
+
+ New()
+ sleep(2)
+ new /obj/item/clothing/shoes/brown(src)
+ new /obj/item/weapon/paper/Court (src)
+ new /obj/item/weapon/paper/Court (src)
+ new /obj/item/weapon/paper/Court (src)
+ new /obj/item/weapon/pen (src)
+ new /obj/item/clothing/suit/judgerobe (src)
+ new /obj/item/clothing/head/powdered_wig (src)
+ new /obj/item/weapon/storage/briefcase(src)
+ return
+
+/obj/structure/closet/secure_closet/wall
+ name = "wall locker"
+ req_access = list(access_security)
+ icon_state = "wall-locker1"
+ density = 1
+ icon_closed = "wall-locker"
+ icon_locked = "wall-locker1"
+ icon_opened = "wall-lockeropen"
+ icon_broken = "wall-lockerbroken"
+ icon_off = "wall-lockeroff"
+
+ //too small to put a man in
+ large = 0
+
+/obj/structure/closet/secure_closet/wall/update_icon()
+ if(broken)
+ icon_state = icon_broken
+ else
+ if(!opened)
+ if(locked)
+ icon_state = icon_locked
+ else
+ icon_state = icon_closed
+ else
+ icon_state = icon_opened
diff --git a/code/WorkInProgress/Sigyn/Softcurity/wardrobe.dm b/code/WorkInProgress/Sigyn/Softcurity/wardrobe.dm
new file mode 100644
index 0000000000..452670091f
--- /dev/null
+++ b/code/WorkInProgress/Sigyn/Softcurity/wardrobe.dm
@@ -0,0 +1,311 @@
+/obj/structure/closet/wardrobe
+ name = "wardrobe"
+ desc = "It's a storage unit for standard-issue Nanotrasen attire."
+ icon_state = "blue"
+ icon_closed = "blue"
+
+/obj/structure/closet/wardrobe/New()
+ new /obj/item/clothing/under/color/blue(src)
+ new /obj/item/clothing/under/color/blue(src)
+ new /obj/item/clothing/under/color/blue(src)
+ new /obj/item/clothing/shoes/brown(src)
+ new /obj/item/clothing/shoes/brown(src)
+ new /obj/item/clothing/shoes/brown(src)
+ return
+
+
+/obj/structure/closet/wardrobe/red
+ name = "security wardrobe"
+ icon_state = "red"
+ icon_closed = "red"
+
+/obj/structure/closet/wardrobe/red/New()
+ new /obj/item/clothing/under/rank/supervisor(src)
+ new /obj/item/clothing/under/rank/supervisor(src)
+ new /obj/item/clothing/under/rank/supervisor(src)
+ new /obj/item/clothing/shoes/boots(src)
+ new /obj/item/clothing/shoes/boots(src)
+ new /obj/item/clothing/shoes/boots(src)
+ new /obj/item/clothing/head/soft/grey(src)
+ new /obj/item/clothing/head/soft/grey(src)
+ new /obj/item/clothing/head/soft/grey(src)
+ return
+
+
+/obj/structure/closet/wardrobe/pink
+ name = "pink wardrobe"
+ icon_state = "pink"
+ icon_closed = "pink"
+
+/obj/structure/closet/wardrobe/pink/New()
+ new /obj/item/clothing/under/color/pink(src)
+ new /obj/item/clothing/under/color/pink(src)
+ new /obj/item/clothing/under/color/pink(src)
+ new /obj/item/clothing/shoes/brown(src)
+ new /obj/item/clothing/shoes/brown(src)
+ new /obj/item/clothing/shoes/brown(src)
+ return
+
+/obj/structure/closet/wardrobe/black
+ name = "black wardrobe"
+ icon_state = "black"
+ icon_closed = "black"
+
+/obj/structure/closet/wardrobe/black/New()
+ new /obj/item/clothing/under/color/black(src)
+ new /obj/item/clothing/under/color/black(src)
+ new /obj/item/clothing/under/color/black(src)
+ new /obj/item/clothing/shoes/black(src)
+ new /obj/item/clothing/shoes/black(src)
+ new /obj/item/clothing/shoes/black(src)
+ new /obj/item/clothing/head/that(src)
+ new /obj/item/clothing/head/that(src)
+ new /obj/item/clothing/head/that(src)
+ return
+
+
+/obj/structure/closet/wardrobe/chaplain_black
+ name = "chapel wardrobe"
+ desc = "It's a storage unit for Nanotrasen-approved religious attire."
+ icon_state = "black"
+ icon_closed = "black"
+
+/obj/structure/closet/wardrobe/chaplain_black/New()
+ new /obj/item/clothing/under/rank/chaplain(src)
+ new /obj/item/clothing/shoes/black(src)
+ new /obj/item/clothing/suit/nun(src)
+ new /obj/item/clothing/head/nun_hood(src)
+ new /obj/item/clothing/suit/chaplain_hoodie(src)
+ new /obj/item/clothing/head/chaplain_hood(src)
+ new /obj/item/clothing/suit/holidaypriest(src)
+ new /obj/item/weapon/storage/backpack/cultpack (src)
+ new /obj/item/weapon/storage/fancy/candle_box(src)
+ new /obj/item/weapon/storage/fancy/candle_box(src)
+ return
+
+
+/obj/structure/closet/wardrobe/green
+ name = "green wardrobe"
+ icon_state = "green"
+ icon_closed = "green"
+
+/obj/structure/closet/wardrobe/green/New()
+ new /obj/item/clothing/under/color/green(src)
+ new /obj/item/clothing/under/color/green(src)
+ new /obj/item/clothing/under/color/green(src)
+ new /obj/item/clothing/shoes/black(src)
+ new /obj/item/clothing/shoes/black(src)
+ new /obj/item/clothing/shoes/black(src)
+ return
+
+
+/obj/structure/closet/wardrobe/orange
+ name = "prison wardrobe"
+ desc = "It's a storage unit for Nanotrasen-regulation prisoner attire."
+ icon_state = "orange"
+ icon_closed = "orange"
+
+/obj/structure/closet/wardrobe/orange/New()
+ new /obj/item/clothing/under/color/orange(src)
+ new /obj/item/clothing/under/color/orange(src)
+ new /obj/item/clothing/under/color/orange(src)
+ new /obj/item/clothing/shoes/orange(src)
+ new /obj/item/clothing/shoes/orange(src)
+ new /obj/item/clothing/shoes/orange(src)
+ return
+
+
+/obj/structure/closet/wardrobe/yellow
+ name = "yellow wardrobe"
+ icon_state = "wardrobe-y"
+ icon_closed = "wardrobe-y"
+
+/obj/structure/closet/wardrobe/yellow/New()
+ new /obj/item/clothing/under/color/yellow(src)
+ new /obj/item/clothing/under/color/yellow(src)
+ new /obj/item/clothing/under/color/yellow(src)
+ new /obj/item/clothing/shoes/orange(src)
+ new /obj/item/clothing/shoes/orange(src)
+ new /obj/item/clothing/shoes/orange(src)
+ return
+
+
+/obj/structure/closet/wardrobe/atmospherics_yellow
+ name = "atmospherics wardrobe"
+ icon_state = "yellow"
+ icon_closed = "yellow"
+
+/obj/structure/closet/wardrobe/atmospherics_yellow/New()
+ new /obj/item/clothing/under/rank/atmospheric_technician(src)
+ new /obj/item/clothing/under/rank/atmospheric_technician(src)
+ new /obj/item/clothing/under/rank/atmospheric_technician(src)
+ new /obj/item/clothing/shoes/black(src)
+ new /obj/item/clothing/shoes/black(src)
+ new /obj/item/clothing/shoes/black(src)
+ return
+
+
+
+/obj/structure/closet/wardrobe/engineering_yellow
+ name = "engineering wardrobe"
+ icon_state = "yellow"
+ icon_closed = "yellow"
+
+/obj/structure/closet/wardrobe/engineering_yellow/New()
+ new /obj/item/clothing/under/rank/engineer(src)
+ new /obj/item/clothing/under/rank/engineer(src)
+ new /obj/item/clothing/under/rank/engineer(src)
+ new /obj/item/clothing/shoes/orange(src)
+ new /obj/item/clothing/shoes/orange(src)
+ new /obj/item/clothing/shoes/orange(src)
+ return
+
+
+/obj/structure/closet/wardrobe/white
+ name = "white wardrobe"
+ icon_state = "white"
+ icon_closed = "white"
+
+/obj/structure/closet/wardrobe/white/New()
+ new /obj/item/clothing/under/color/white(src)
+ new /obj/item/clothing/under/color/white(src)
+ new /obj/item/clothing/under/color/white(src)
+ new /obj/item/clothing/shoes/white(src)
+ new /obj/item/clothing/shoes/white(src)
+ new /obj/item/clothing/shoes/white(src)
+ return
+
+
+/obj/structure/closet/wardrobe/pjs
+ name = "Pajama wardrobe"
+ icon_state = "white"
+ icon_closed = "white"
+
+/obj/structure/closet/wardrobe/pjs/New()
+ new /obj/item/clothing/under/pj/red(src)
+ new /obj/item/clothing/under/pj/red(src)
+ new /obj/item/clothing/under/pj/blue(src)
+ new /obj/item/clothing/under/pj/blue(src)
+ new /obj/item/clothing/shoes/white(src)
+ new /obj/item/clothing/shoes/white(src)
+ new /obj/item/clothing/shoes/white(src)
+ new /obj/item/clothing/shoes/white(src)
+ return
+
+
+/obj/structure/closet/wardrobe/toxins_white
+ name = "toxins wardrobe"
+ icon_state = "white"
+ icon_closed = "white"
+
+/obj/structure/closet/wardrobe/toxins_white/New()
+ new /obj/item/clothing/under/rank/scientist(src)
+ new /obj/item/clothing/under/rank/scientist(src)
+ new /obj/item/clothing/under/rank/scientist(src)
+ new /obj/item/clothing/suit/labcoat(src)
+ new /obj/item/clothing/suit/labcoat(src)
+ new /obj/item/clothing/suit/labcoat(src)
+ new /obj/item/clothing/shoes/white(src)
+ new /obj/item/clothing/shoes/white(src)
+ new /obj/item/clothing/shoes/white(src)
+ return
+
+
+/obj/structure/closet/wardrobe/robotics_black
+ name = "robotics wardrobe"
+ icon_state = "black"
+ icon_closed = "black"
+
+/obj/structure/closet/wardrobe/robotics_black/New()
+ new /obj/item/clothing/under/rank/roboticist(src)
+ new /obj/item/clothing/under/rank/roboticist(src)
+ new /obj/item/clothing/suit/labcoat(src)
+ new /obj/item/clothing/suit/labcoat(src)
+ new /obj/item/clothing/shoes/black(src)
+ new /obj/item/clothing/shoes/black(src)
+ new /obj/item/clothing/gloves/black(src)
+ new /obj/item/clothing/gloves/black(src)
+ return
+
+
+/obj/structure/closet/wardrobe/chemistry_white
+ name = "chemistry wardrobe"
+ icon_state = "white"
+ icon_closed = "white"
+
+/obj/structure/closet/wardrobe/chemistry_white/New()
+ new /obj/item/clothing/under/rank/chemist(src)
+ new /obj/item/clothing/under/rank/chemist(src)
+ new /obj/item/clothing/shoes/white(src)
+ new /obj/item/clothing/shoes/white(src)
+ new /obj/item/clothing/suit/labcoat/chemist(src)
+ new /obj/item/clothing/suit/labcoat/chemist(src)
+ return
+
+
+/obj/structure/closet/wardrobe/genetics_white
+ name = "genetics wardrobe"
+ icon_state = "white"
+ icon_closed = "white"
+
+/obj/structure/closet/wardrobe/genetics_white/New()
+ new /obj/item/clothing/under/rank/geneticist(src)
+ new /obj/item/clothing/under/rank/geneticist(src)
+ new /obj/item/clothing/shoes/white(src)
+ new /obj/item/clothing/shoes/white(src)
+ new /obj/item/clothing/suit/labcoat/genetics(src)
+ new /obj/item/clothing/suit/labcoat/genetics(src)
+ return
+
+
+/obj/structure/closet/wardrobe/virology_white
+ name = "virology wardrobe"
+ icon_state = "white"
+ icon_closed = "white"
+
+/obj/structure/closet/wardrobe/virology_white/New()
+ new /obj/item/clothing/under/rank/virologist(src)
+ new /obj/item/clothing/under/rank/virologist(src)
+ new /obj/item/clothing/shoes/white(src)
+ new /obj/item/clothing/shoes/white(src)
+ new /obj/item/clothing/suit/labcoat/virologist(src)
+ new /obj/item/clothing/suit/labcoat/virologist(src)
+ new /obj/item/clothing/mask/surgical(src)
+ new /obj/item/clothing/mask/surgical(src)
+ return
+
+
+/obj/structure/closet/wardrobe/grey
+ name = "grey wardrobe"
+ icon_state = "grey"
+ icon_closed = "grey"
+
+/obj/structure/closet/wardrobe/grey/New()
+ new /obj/item/clothing/under/color/grey(src)
+ new /obj/item/clothing/under/color/grey(src)
+ new /obj/item/clothing/under/color/grey(src)
+ new /obj/item/clothing/shoes/black(src)
+ new /obj/item/clothing/shoes/black(src)
+ new /obj/item/clothing/shoes/black(src)
+ new /obj/item/clothing/head/soft/grey(src)
+ new /obj/item/clothing/head/soft/grey(src)
+ new /obj/item/clothing/head/soft/grey(src)
+ return
+
+
+/obj/structure/closet/wardrobe/mixed
+ name = "mixed wardrobe"
+ icon_state = "mixed"
+ icon_closed = "mixed"
+
+/obj/structure/closet/wardrobe/mixed/New()
+ new /obj/item/clothing/under/color/white(src)
+ new /obj/item/clothing/under/color/blue(src)
+ new /obj/item/clothing/under/color/yellow(src)
+ new /obj/item/clothing/under/color/green(src)
+ new /obj/item/clothing/under/color/orange(src)
+ new /obj/item/clothing/under/color/pink(src)
+ new /obj/item/clothing/shoes/black(src)
+ new /obj/item/clothing/shoes/brown(src)
+ new /obj/item/clothing/shoes/white(src)
+ return
diff --git a/code/__HELPERS/files.dm b/code/__HELPERS/files.dm
index 9d9a3140d2..d804dcb06a 100644
--- a/code/__HELPERS/files.dm
+++ b/code/__HELPERS/files.dm
@@ -15,4 +15,46 @@
//Sends resource files to client cache
/client/proc/getFiles()
for(var/file in args)
- src << browse_rsc(file)
\ No newline at end of file
+ src << browse_rsc(file)
+
+/client/proc/browse_files(root="data/logs/", max_iterations=10, list/valid_extensions=list(".txt",".log",".htm"))
+ var/path = root
+
+ for(var/i=0, i
[worth] [currency]"
- dat += "
New pile:"
-
- dat += "-"
- dat += "-"
- if(round<=0.1)
- dat += "-"
- if(round<=0.01)
- dat += "-"
- dat += "[split]"
- if(round<=0.01)
- dat += "+"
- if(round<=0.1)
- dat += "+"
- dat += "+"
- dat += "+"
- dat += "
split"
-
-
- user << browse(dat, "window=computer;size=400x500")
-
- onclose(user, "computer")
- return
-
-/obj/item/weapon/spacecash/Topic(href, href_list)
- if ((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon)))
- usr.machine = src
-
- if (href_list["su"])
- var/samt = text2num(href_list["su"])
- if(split+samt
\n
\n"
-
-/obj/item/weapon/paper/Toxin
- name = "paper- 'Chemical Information'"
- info = "Known Onboard Toxins:
\n\tGrade A Semi-Liquid Plasma:
\n\t\tHighly poisonous. You cannot sustain concentrations above 15 units.
\n\t\tA gas mask fails to filter plasma after 50 units.
\n\t\tWill attempt to diffuse like a gas.
\n\t\tFiltered by scrubbers.
\n\t\tThere is a bottled version which is very different
\n\t\t\tfrom the version found in canisters!
\n
\n\t\tWARNING: Highly Flammable. Keep away from heat sources
\n\t\texcept in a enclosed fire area!
\n\t\tWARNING: It is a crime to use this without authorization.
\nKnown Onboard Anti-Toxin:
\n\tAnti-Toxin Type 01P: Works against Grade A Plasma.
\n\t\tBest if injected directly into bloodstream.
\n\t\tA full injection is in every regular Med-Kit.
\n\t\tSpecial toxin Kits hold around 7.
\n
\nKnown Onboard Chemicals (other):
\n\tRejuvenation T#001:
\n\t\tEven 1 unit injected directly into the bloodstream
\n\t\t\twill cure paralysis and sleep toxins.
\n\t\tIf administered to a dying patient it will prevent
\n\t\t\tfurther damage for about units*3 seconds.
\n\t\t\tit will not cure them or allow them to be cured.
\n\t\tIt can be administeredd to a non-dying patient
\n\t\t\tbut the chemicals disappear just as fast.
\n\tSleep Toxin T#054:
\n\t\t5 units wilkl induce precisely 1 minute of sleep.
\n\t\t\tThe effect are cumulative.
\n\t\tWARNING: It is a crime to use this without authorization"
-
-/obj/item/weapon/paper/courtroom
- name = "paper- 'A Crash Course in Legal SOP on SS13'"
- info = "Roles:
\nThe Detective is basically the investigator and prosecutor.
\nThe Staff Assistant can perform these functions with written authority from the Detective.
\nThe Captain/HoP/Warden is ct as the judicial authority.
\nThe Security Officers are responsible for executing warrants, security during trial, and prisoner transport.
\n
\nInvestigative Phase:
\nAfter the crime has been committed the Detective's job is to gather evidence and try to ascertain not only who did it but what happened. He must take special care to catalogue everything and don't leave anything out. Write out all the evidence on paper. Make sure you take an appropriate number of fingerprints. IF he must ask someone questions he has permission to confront them. If the person refuses he can ask a judicial authority to write a subpoena for questioning. If again he fails to respond then that person is to be jailed as insubordinate and obstructing justice. Said person will be released after he cooperates.
\n
\nONCE the FT has a clear idea as to who the criminal is he is to write an arrest warrant on the piece of paper. IT MUST LIST THE CHARGES. The FT is to then go to the judicial authority and explain a small version of his case. If the case is moderately acceptable the authority should sign it. Security must then execute said warrant.
\n
\nPre-Pre-Trial Phase:
\nNow a legal representative must be presented to the defendant if said defendant requests one. That person and the defendant are then to be given time to meet (in the jail IS ACCEPTABLE). The defendant and his lawyer are then to be given a copy of all the evidence that will be presented at trial (rewriting it all on paper is fine). THIS IS CALLED THE DISCOVERY PACK. With a few exceptions, THIS IS THE ONLY EVIDENCE BOTH SIDES MAY USE AT TRIAL. IF the prosecution will be seeking the death penalty it MUST be stated at this time. ALSO if the defense will be seeking not guilty by mental defect it must state this at this time to allow ample time for examination.
\nNow at this time each side is to compile a list of witnesses. By default, the defendant is on both lists regardless of anything else. Also the defense and prosecution can compile more evidence beforehand BUT in order for it to be used the evidence MUST also be given to the other side.\nThe defense has time to compile motions against some evidence here.
\nPossible Motions:
\n1. Invalidate Evidence- Something with the evidence is wrong and the evidence is to be thrown out. This includes irrelevance or corrupt security.
\n2. Free Movement- Basically the defendant is to be kept uncuffed before and during the trial.
\n3. Subpoena Witness- If the defense presents god reasons for needing a witness but said person fails to cooperate then a subpoena is issued.
\n4. Drop the Charges- Not enough evidence is there for a trial so the charges are to be dropped. The FT CAN RETRY but the judicial authority must carefully reexamine the new evidence.
\n5. Declare Incompetent- Basically the defendant is insane. Once this is granted a medical official is to examine the patient. If he is indeed insane he is to be placed under care of the medical staff until he is deemed competent to stand trial.
\n
\nALL SIDES MOVE TO A COURTROOM
\nPre-Trial Hearings:
\nA judicial authority and the 2 sides are to meet in the trial room. NO ONE ELSE BESIDES A SECURITY DETAIL IS TO BE PRESENT. The defense submits a plea. If the plea is guilty then proceed directly to sentencing phase. Now the sides each present their motions to the judicial authority. He rules on them. Each side can debate each motion. Then the judicial authority gets a list of crew members. He first gets a chance to look at them all and pick out acceptable and available jurors. Those jurors are then called over. Each side can ask a few questions and dismiss jurors they find too biased. HOWEVER before dismissal the judicial authority MUST agree to the reasoning.
\n
\nThe Trial:
\nThe trial has three phases.
\n1. Opening Arguments- Each side can give a short speech. They may not present ANY evidence.
\n2. Witness Calling/Evidence Presentation- The prosecution goes first and is able to call the witnesses on his approved list in any order. He can recall them if necessary. During the questioning the lawyer may use the evidence in the questions to help prove a point. After every witness the other side has a chance to cross-examine. After both sides are done questioning a witness the prosecution can present another or recall one (even the EXACT same one again!). After prosecution is done the defense can call witnesses. After the initial cases are presented both sides are free to call witnesses on either list.
\nFINALLY once both sides are done calling witnesses we move onto the next phase.
\n3. Closing Arguments- Same as opening.
\nThe jury then deliberates IN PRIVATE. THEY MUST ALL AGREE on a verdict. REMEMBER: They mix between some charges being guilty and others not guilty (IE if you supposedly killed someone with a gun and you unfortunately picked up a gun without authorization then you CAN be found not guilty of murder BUT guilty of possession of illegal weaponry.). Once they have agreed they present their verdict. If unable to reach a verdict and feel they will never they call a deadlocked jury and we restart at Pre-Trial phase with an entirely new set of jurors.
\n
\nSentencing Phase:
\nIf the death penalty was sought (you MUST have gone through a trial for death penalty) then skip to the second part.
\nI. Each side can present more evidence/witnesses in any order. There is NO ban on emotional aspects or anything. The prosecution is to submit a suggested penalty. After all the sides are done then the judicial authority is to give a sentence.
\nII. The jury stays and does the same thing as I. Their sole job is to determine if the death penalty is applicable. If NOT then the judge selects a sentence.
\n
\nTADA you're done. Security then executes the sentence and adds the applicable convictions to the person's record.
\n"
-
-/obj/item/weapon/paper/hydroponics
- name = "paper- 'Greetings from Billy Bob'"
- info = "Hey fellow botanist!
\n
\nI didn't trust the station folk so I left
\na couple of weeks ago. But here's some
\ninstructions on how to operate things here.
\nYou can grow plants and each iteration they become
\nstronger, more potent and have better yield, if you
\nknow which ones to pick. Use your botanist's analyzer
\nfor that. You can turn harvested plants into seeds
\nat the seed extractor, and replant them for better stuff!
\nSometimes if the weed level gets high in the tray
\nmutations into different mushroom or weed species have
\nbeen witnessed. On the rare occassion even weeds mutate!
\n
\nEither way, have fun!
\n
\nBest regards,
\nBilly Bob Johnson.
\n
\nPS.
\nHere's a few tips:
\nIn nettles, potency = damage
\nIn amanitas, potency = deadliness + side effect
\nIn Liberty caps, potency = drug power + effect
\nIn chilis, potency = heat
\nNutrients keep mushrooms alive!
\nWater keeps weeds such as nettles alive!
\nAll other plants need both."
-
-/obj/item/weapon/paper/djstation
- name = "paper - 'DJ Listening Outpost'"
- info = "Welcome new owner!
You have purchased the latest in listening equipment. The telecommunication setup we created is the best in listening to common and private radio fequencies. Here is a step by step guide to start listening in on those saucy radio channels:
Simple as that. Now to listen to the private channels, you'll have to configure the intercoms, located on the front desk. Here is a list of frequencies for you to listen on.
\nThe data will be in the following form.
\nGenerally lower ranking positions come first in this list.
\n
\nJob Name general access>lab access-engine access-systems access (atmosphere control)
\n\tJob Description
\nJob Duties (in no particular order)
\nTips (where applicable)
\n
\nResearch Assistant 1>1-0-0
\n\tThis is probably the lowest level position. Anyone who enters the space station after the initial job\nassignment will automatically receive this position. Access with this is restricted. Head of Personnel should\nappropriate the correct level of assistance.
\n1. Assist the researchers.
\n2. Clean up the labs.
\n3. Prepare materials.
\n
\nStaff Assistant 2>0-0-0
\n\tThis position assists the security officer in his duties. The staff assisstants should primarily br\npatrolling the ship waiting until they are needed to maintain ship safety.\n(Addendum: Updated/Elevated Security Protocols admit issuing of low level weapons to security personnel)
\n1. Patrol ship/Guard key areas
\n2. Assist security officer
\n3. Perform other security duties.
\n
\nTechnical Assistant 1>0-0-1
\n\tThis is yet another low level position. The technical assistant helps the engineer and the statian\ntechnician with the upkeep and maintenance of the station. This job is very important because it usually\ngets to be a heavy workload on station technician and these helpers will alleviate that.
\n1. Assist Station technician and Engineers.
\n2. Perform general maintenance of station.
\n3. Prepare materials.
\n
\nMedical Assistant 1>1-0-0
\n\tThis is the fourth position yet it is slightly less common. This position doesn't have much power\noutside of the med bay. Consider this position like a nurse who helps to upkeep medical records and the\nmaterials (filling syringes and checking vitals)
\n1. Assist the medical personnel.
\n2. Update medical files.
\n3. Prepare materials for medical operations.
\n
\nResearch Technician 2>3-0-0
\n\tThis job is primarily a step up from research assistant. These people generally do not get their own lab\nbut are more hands on in the experimentation process. At this level they are permitted to work as consultants to\nthe others formally.
\n1. Inform superiors of research.
\n2. Perform research alongside of official researchers.
\n
\nDetective 3>2-0-0
\n\tThis job is in most cases slightly boring at best. Their sole duty is to\nperform investigations of crine scenes and analysis of the crime scene. This\nalleviates SOME of the burden from the security officer. This person's duty\nis to draw conclusions as to what happened and testify in court. Said person\nalso should stroe the evidence ly.
\n1. Perform crime-scene investigations/draw conclusions.
\n2. Store and catalogue evidence properly.
\n3. Testify to superiors/inquieries on findings.
\n
\nStation Technician 2>0-2-3
\n\tPeople assigned to this position must work to make sure all the systems aboard Space Station 13 are operable.\nThey should primarily work in the computer lab and repairing faulty equipment. They should work with the\natmospheric technician.
\n1. Maintain SS13 systems.
\n2. Repair equipment.
\n
\nAtmospheric Technician 3>0-0-4
\n\tThese people should primarily work in the atmospheric control center and lab. They have the very important\njob of maintaining the delicate atmosphere on SS13.
\n1. Maintain atmosphere on SS13
\n2. Research atmospheres on the space station. (safely please!)
\n
\nEngineer 2>1-3-0
\n\tPeople working as this should generally have detailed knowledge as to how the propulsion systems on SS13\nwork. They are one of the few classes that have unrestricted access to the engine area.
\n1. Upkeep the engine.
\n2. Prevent fires in the engine.
\n3. Maintain a safe orbit.
\n
\nMedical Researcher 2>5-0-0
\n\tThis position may need a little clarification. Their duty is to make sure that all experiments are safe and\nto conduct experiments that may help to improve the station. They will be generally idle until a new laboratory\nis constructed.
\n1. Make sure the station is kept safe.
\n2. Research medical properties of materials studied of Space Station 13.
\n
\nScientist 2>5-0-0
\n\tThese people study the properties, particularly the toxic properties, of materials handled on SS13.\nTechnically they can also be called Plasma Technicians as plasma is the material they routinly handle.
\n1. Research plasma
\n2. Make sure all plasma is properly handled.
\n
\nMedical Doctor (Officer) 2>0-0-0
\n\tPeople working this job should primarily stay in the medical area. They should make sure everyone goes to\nthe medical bay for treatment and examination. Also they should make sure that medical supplies are kept in\norder.
\n1. Heal wounded people.
\n2. Perform examinations of all personnel.
\n3. Moniter usage of medical equipment.
\n
\nSecurity Officer 3>0-0-0
\n\tThese people should attempt to keep the peace inside the station and make sure the station is kept safe. One\nside duty is to assist in repairing the station. They also work like general maintenance personnel. They are not\ngiven a weapon and must use their own resources.
\n(Addendum: Updated/Elevated Security Protocols admit issuing of weapons to security personnel)
\n1. Maintain order.
\n2. Assist others.
\n3. Repair structural problems.
\n
\nHead of Security 4>5-2-2
\n\tPeople assigned as Head of Security should issue orders to the security staff. They should\nalso carefully moderate the usage of all security equipment. All security matters should be reported to this person.
\n1. Oversee security.
\n2. Assign patrol duties.
\n3. Protect the station and staff.
\n
\nHead of Personnel 4>4-2-2
\n\tPeople assigned as head of personnel will find themselves moderating all actions done by personnel. \nAlso they have the ability to assign jobs and access levels.
\n1. Assign duties.
\n2. Moderate personnel.
\n3. Moderate research.
\n
\nCaptain 5>5-5-5 (unrestricted station wide access)
\n\tThis is the highest position youi can aquire on Space Station 13. They are allowed anywhere inside the\nspace station and therefore should protect their ID card. They also have the ability to assign positions\nand access levels. They should not abuse their power.
\n1. Assign all positions on SS13
\n2. Inspect the station for any problems.
\n3. Perform administrative duties.
\n"
-
-/obj/item/weapon/paper/photograph
- name = "photo"
- icon_state = "photo"
- var/photo_id = 0.0
- item_state = "paper"
-
-/obj/item/weapon/paper/sop
- name = "paper- 'Standard Operating Procedure'"
- info = "Alert Levels:
\nBlue- Emergency
\n\t1. Caused by fire
\n\t2. Caused by manual interaction
\n\tAction:
\n\t\tClose all fire doors. These can only be opened by reseting the alarm
\nRed- Ejection/Self Destruct
\n\t1. Caused by module operating computer.
\n\tAction:
\n\t\tAfter the specified time the module will eject completely.
\n
\nEngine Maintenance Instructions:
\n\tShut off ignition systems:
\n\tActivate internal power
\n\tActivate orbital balance matrix
\n\tRemove volatile liquids from area
\n\tWear a fire suit
\n
\n\tAfter
\n\t\tDecontaminate
\n\t\tVisit medical examiner
\n
\nToxin Laboratory Procedure:
\n\tWear a gas mask regardless
\n\tGet an oxygen tank.
\n\tActivate internal atmosphere
\n
\n\tAfter
\n\t\tDecontaminate
\n\t\tVisit medical examiner
\n
\nDisaster Procedure:
\n\tFire:
\n\t\tActivate sector fire alarm.
\n\t\tMove to a safe area.
\n\t\tGet a fire suit
\n\t\tAfter:
\n\t\t\tAssess Damage
\n\t\t\tRepair damages
\n\t\t\tIf needed, Evacuate
\n\tMeteor Shower:
\n\t\tActivate fire alarm
\n\t\tMove to the back of ship
\n\t\tAfter
\n\t\t\tRepair damage
\n\t\t\tIf needed, Evacuate
\n\tAccidental Reentry:
\n\t\tActivate fire alrms in front of ship.
\n\t\tMove volatile matter to a fire proof area!
\n\t\tGet a fire suit.
\n\t\tStay secure until an emergency ship arrives.
\n
\n\t\tIf ship does not arrive-
\n\t\t\tEvacuate to a nearby safe area!"
-
-/obj/item/weapon/paper/genetics_side_effects
- name = "paper - 'Genetical Side-Effects and Treatments'"
-
- New()
- ..()
- info = ""
- for(var/tp in typesof(/datum/genetics/side_effect) - /datum/genetics/side_effect)
- var/datum/genetics/side_effect/S = new tp
- info += "Name:\t [S.name]
"
- info += "Symptom:\t [S.symptom]
"
- info += "Treatment:\t [S.treatment]
"
- info += "Effect:\t [S.effect]
"
- info += "
"
-
-/obj/item/weapon/banhammer
- desc = "A banhammer"
- name = "banhammer"
- icon = 'icons/obj/items.dmi'
- icon_state = "toyhammer"
- flags = FPRINT | TABLEPASS
- slot_flags = SLOT_BELT
- throwforce = 0
- w_class = 1.0
- throw_speed = 7
- throw_range = 15
- attack_verb = list("banned")
-
/obj/item/weapon/rack_parts
name = "rack parts"
desc = "Parts of a rack."
@@ -1068,32 +284,6 @@
flags = FPRINT | TABLEPASS| CONDUCT
m_amt = 3750
-/* //gtfo my object tree
-/obj/item/weapon/rubber_chicken
- name = "rubber chicken"
- desc = "A rubber chicken, isn't that hilarious?"
- icon = 'icons/obj/items.dmi'
- icon_state = "rubber_chicken"
- item_state = "rubber_chicken"
- w_class = 2.0
-*/
-
-/obj/item/weapon/screwdriver
- name = "screwdriver"
- desc = "You can be totally screwwy with this."
- icon = 'icons/obj/items.dmi'
- icon_state = "screwdriver"
- flags = FPRINT | TABLEPASS| CONDUCT
- slot_flags = SLOT_BELT
- force = 5.0
- w_class = 1.0
- throwforce = 5.0
- throw_speed = 3
- throw_range = 5
- g_amt = 0
- m_amt = 75
- attack_verb = list("stabbed")
-
/obj/item/weapon/shard
name = "shard"
icon = 'icons/obj/shards.dmi'
@@ -1106,6 +296,11 @@
g_amt = 3750
attack_verb = list("stabbed", "slashed", "sliced", "cut")
+ suicide_act(mob/user)
+ viewers(user) << pick("/red [user] is slitting \his wrists with the shard of glass! It looks like \he's trying to commit suicide.", \
+ "\red [user] is slitting \his throat with the shard of glass! It looks like \he's trying to commit suicide.")
+ return (BRUTELOSS)
+
/obj/item/weapon/shard/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1)
return ..()
@@ -1230,138 +425,9 @@
m_amt = 40
attack_verb = list("whipped", "lashed", "disciplined", "tickled")
-/obj/item/weapon/wrapping_paper
- name = "wrapping paper"
- desc = "You can use this to wrap items in."
- icon = 'icons/obj/items.dmi'
- icon_state = "wrap_paper"
- var/amount = 20.0
-
-/obj/item/weapon/cell
- name = "power cell"
- desc = "A rechargable electrochemical power cell."
- icon = 'icons/obj/power.dmi'
- icon_state = "cell"
- item_state = "cell"
- origin_tech = "powerstorage=1"
- flags = FPRINT|TABLEPASS
- force = 5.0
- throwforce = 5.0
- throw_speed = 3
- throw_range = 5
- w_class = 3.0
- pressure_resistance = 80
- var/charge = 0 // note %age conveted to actual charge in New
- var/maxcharge = 1000
- m_amt = 700
- g_amt = 50
- var/rigged = 0 // true if rigged to explode
- var/minor_fault = 0 //If not 100% reliable, it will build up faults.
- var/construction_cost = list("metal"=750,"glass"=75)
- var/construction_time=100
-
-/obj/item/weapon/cell/crap
- name = "\improper Nanotrasen brand rechargable AA battery"
- desc = "You can't top the plasma top." //TOTALLY TRADEMARK INFRINGEMENT
- origin_tech = "powerstorage=0"
- maxcharge = 500
- g_amt = 40
-
-/obj/item/weapon/cell/crap/empty/New()
- ..()
- charge = 0
-
-/obj/item/weapon/cell/secborg
- name = "\improper Security borg rechargable D battery"
- origin_tech = "powerstorage=0"
- maxcharge = 600 //600 max charge / 100 charge per shot = six shots
- g_amt = 40
-
-/obj/item/weapon/cell/secborg/empty/New()
- ..()
- charge = 0
-
-/obj/item/weapon/cell/high
- name = "high-capacity power cell"
- origin_tech = "powerstorage=2"
- icon_state = "hcell"
- maxcharge = 10000
- g_amt = 60
-
-/obj/item/weapon/cell/high/empty/New()
- ..()
- charge = 0
-
-/obj/item/weapon/cell/super
- name = "super-capacity power cell"
- origin_tech = "powerstorage=5"
- icon_state = "scell"
- maxcharge = 20000
- g_amt = 70
- construction_cost = list("metal"=750,"glass"=100)
-
-/obj/item/weapon/cell/super/empty/New()
- ..()
- charge = 0
-
-/obj/item/weapon/cell/hyper
- name = "hyper-capacity power cell"
- origin_tech = "powerstorage=6"
- icon_state = "hpcell"
- maxcharge = 30000
- g_amt = 80
- construction_cost = list("metal"=500,"glass"=150,"gold"=200,"silver"=200)
-
-/obj/item/weapon/cell/hyper/empty/New()
- ..()
- charge = 0
-
-/obj/item/weapon/cell/infinite
- name = "infinite-capacity power cell!"
- icon_state = "icell"
- origin_tech = null
- maxcharge = 30000
- g_amt = 80
- use()
- return 1
-
-/obj/item/weapon/cell/potato
- name = "potato battery"
- desc = "A rechargable starch based power cell."
- origin_tech = "powerstorage=1"
- icon = 'icons/obj/power.dmi' //'icons/obj/harvest.dmi'
- icon_state = "potato_cell" //"potato_battery"
- charge = 100
- maxcharge = 300
- m_amt = 0
- g_amt = 0
- minor_fault = 1
-
-/obj/item/weapon/camera_bug/attack_self(mob/usr as mob)
- var/list/cameras = new/list()
- for (var/obj/machinery/camera/C in cameranet.cameras)
- if (C.bugged && C.status)
- cameras.Add(C)
- if (length(cameras) == 0)
- usr << "\red No bugged functioning cameras found."
- return
-
- var/list/friendly_cameras = new/list()
-
- for (var/obj/machinery/camera/C in cameras)
- friendly_cameras.Add(C.c_tag)
-
- var/target = input("Select the camera to observe", null) as null|anything in friendly_cameras
- if (!target)
- return
- for (var/obj/machinery/camera/C in cameras)
- if (C.c_tag == target)
- target = C
- break
- if (usr.stat == 2) return
-
- usr.client.eye = target
-
+ suicide_act(mob/user)
+ viewers(user) << "\red [user] is strangling \himself with the [src]! It looks like \he's trying to commit suicide."
+ return (OXYLOSS)
/obj/item/weapon/module
icon = 'icons/obj/module.dmi'
@@ -1397,15 +463,6 @@
desc = "Charging circuits for power cells."
-/obj/item/weapon/a_gift
- name = "gift"
- desc = "A gift it appears."
- icon = 'icons/obj/items.dmi'
- icon_state = "gift"
- item_state = "gift"
- pressure_resistance = 70
-
-
/obj/item/device/camera_bug
name = "camera bug"
icon = 'icons/obj/device.dmi'
@@ -1415,240 +472,31 @@
throw_speed = 4
throw_range = 20
+/obj/item/weapon/camera_bug/attack_self(mob/usr as mob)
+ var/list/cameras = new/list()
+ for (var/obj/machinery/camera/C in cameranet.cameras)
+ if (C.bugged && C.status)
+ cameras.Add(C)
+ if (length(cameras) == 0)
+ usr << "\red No bugged functioning cameras found."
+ return
-/obj/item/weapon/kitchen
- icon = 'icons/obj/kitchen.dmi'
+ var/list/friendly_cameras = new/list()
-/obj/item/weapon/kitchen/rollingpin
- name = "rolling pin"
- desc = "Used to knock out the Bartender."
- icon_state = "rolling_pin"
- force = 8.0
- throwforce = 10.0
- throw_speed = 2
- throw_range = 7
- w_class = 3.0
- attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "whacked") //I think the rollingpin attackby will end up ignoring this anyway.
+ for (var/obj/machinery/camera/C in cameras)
+ friendly_cameras.Add(C.c_tag)
-/obj/item/weapon/kitchenknife
- name = "kitchen knife"
- icon = 'icons/obj/kitchen.dmi'
- icon_state = "knife"
- desc = "A general purpose Chef's Knife made by SpaceCook Incorporated. Guaranteed to stay sharp for years to come."
- flags = FPRINT | TABLEPASS | CONDUCT
- force = 10.0
- w_class = 3.0
- throwforce = 6.0
- throw_speed = 3
- throw_range = 6
- m_amt = 12000
- origin_tech = "materials=1"
- attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
- sharp = 1
+ var/target = input("Select the camera to observe", null) as null|anything in friendly_cameras
+ if (!target)
+ return
+ for (var/obj/machinery/camera/C in cameras)
+ if (C.c_tag == target)
+ target = C
+ break
+ if (usr.stat == 2) return
-/obj/item/weapon/kitchenknife/ritual
- name = "ritual knife"
- desc = "The unearthly energies that once powered this blade are now dormant."
- icon = 'icons/obj/wizard.dmi'
- icon_state = "render"
+ usr.client.eye = target
-/obj/item/weapon/butch
- name = "butcher's Cleaver"
- icon = 'icons/obj/kitchen.dmi'
- icon_state = "butch"
- desc = "A huge thing used for chopping and chopping up meat."
- flags = FPRINT | TABLEPASS | CONDUCT
- force = 15.0
- w_class = 2.0
- throwforce = 8.0
- throw_speed = 3
- throw_range = 6
- m_amt = 12000
- origin_tech = "materials=1"
- attack_verb = list("cleaved", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
- sharp = 1
-
-/obj/item/weapon/butch/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
- playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1)
- return ..()
-
-/obj/item/weapon/tray
- name = "tray"
- icon = 'icons/obj/food.dmi'
- icon_state = "tray"
- desc = "A metal tray to lay food on."
- throwforce = 12.0
- throwforce = 10.0
- throw_speed = 1
- throw_range = 5
- w_class = 3.0
- flags = FPRINT | TABLEPASS | CONDUCT
- m_amt = 3000
- /* // NOPE
- var/food_total= 0
- var/burger_amt = 0
- var/cheese_amt = 0
- var/fries_amt = 0
- var/classyalcdrink_amt = 0
- var/alcdrink_amt = 0
- var/bottle_amt = 0
- var/soda_amt = 0
- var/carton_amt = 0
- var/pie_amt = 0
- var/meatbreadslice_amt = 0
- var/salad_amt = 0
- var/miscfood_amt = 0
- */
- var/list/carrying = list() // List of things on the tray. - Doohl
- var/max_carry = 10 // w_class = 1 -- takes up 1
- // w_class = 2 -- takes up 3
- // w_class = 3 -- takes up 5
-
-
-/obj/item/weapon/kitchen/utensil
- force = 5.0
- w_class = 1.0
- throwforce = 5.0
- throw_speed = 3
- throw_range = 5
- flags = FPRINT | TABLEPASS | CONDUCT
- origin_tech = "materials=1"
- attack_verb = list("attacked", "stabbed", "poked")
-
-
-/obj/item/weapon/kitchen/utensil/fork
- name = "fork"
- desc = "Pointy."
- icon_state = "fork"
-
-/obj/item/weapon/kitchen/utensil/knife
- name = "knife"
- desc = "Can cut through any food."
- icon_state = "knife"
- force = 10.0
- throwforce = 10.0
- sharp = 1
-
-/obj/item/weapon/kitchen/utensil/spoon
- name = "spoon"
- desc = "SPOON!"
- icon_state = "spoon"
- attack_verb = list("attacked", "poked")
-
-/obj/item/weapon/scalpel
- name = "scalpel"
- desc = "Cut, cut, and once more cut."
- icon = 'icons/obj/surgery.dmi'
- icon_state = "scalpel"
- flags = FPRINT | TABLEPASS | CONDUCT
- force = 10.0
- w_class = 1.0
- throwforce = 5.0
- throw_speed = 3
- throw_range = 5
- m_amt = 10000
- g_amt = 5000
- origin_tech = "materials=1;biotech=1"
- attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
- sharp = 1
-
-/obj/item/weapon/scalpel/stabslash
- name = "\proper Stabslash The Pains of Healing"
- desc = "All craftsmanship is of highest quality. On it is image of doctor and patient. Doctor is panicing. Patien is asleep."
- icon_state = "stabslash"
-
-/obj/item/weapon/retractor
- name = "retractor"
- desc = "Retracts stuff."
- icon = 'icons/obj/surgery.dmi'
- icon_state = "retractor"
- m_amt = 10000
- g_amt = 5000
- flags = FPRINT | TABLEPASS | CONDUCT
- w_class = 1.0
- origin_tech = "materials=1;biotech=1"
-
-/obj/item/weapon/hemostat
- name = "hemostat"
- desc = "You think you have seen this before."
- icon = 'icons/obj/surgery.dmi'
- icon_state = "hemostat"
- m_amt = 5000
- g_amt = 2500
- flags = FPRINT | TABLEPASS | CONDUCT
- w_class = 1.0
- origin_tech = "materials=1;biotech=1"
- attack_verb = list("attacked", "pinched")
-
-/obj/item/weapon/cautery
- name = "cautery"
- desc = "This stops bleeding."
- icon = 'icons/obj/surgery.dmi'
- icon_state = "cautery"
- m_amt = 5000
- g_amt = 2500
- flags = FPRINT | TABLEPASS | CONDUCT
- w_class = 1.0
- origin_tech = "materials=1;biotech=1"
- attack_verb = list("burnt")
-
-/obj/item/weapon/surgicaldrill
- name = "surgical drill"
- desc = "You can drill using this item. You dig?"
- icon = 'icons/obj/surgery.dmi'
- icon_state = "drill"
- hitsound = 'sound/weapons/circsawhit.ogg'
- m_amt = 15000
- g_amt = 10000
- flags = FPRINT | TABLEPASS | CONDUCT
- force = 15.0
- w_class = 1.0
- origin_tech = "materials=1;biotech=1"
- attack_verb = list("drilled")
-
-/obj/item/weapon/circular_saw
- name = "circular saw"
- desc = "For heavy duty cutting."
- icon = 'icons/obj/surgery.dmi'
- icon_state = "saw3"
- hitsound = 'sound/weapons/circsawhit.ogg'
- flags = FPRINT | TABLEPASS | CONDUCT
- force = 15.0
- w_class = 1.0
- throwforce = 9.0
- throw_speed = 3
- throw_range = 5
- m_amt = 20000
- g_amt = 10000
- origin_tech = "materials=1;biotech=1"
- attack_verb = list("attacked", "slashed", "sawed", "cut")
- sharp = 1
-
-/obj/item/weapon/bonegel
- name = "bone gel"
- icon = 'surgery.dmi'
- icon_state = "bone-gel"
- force = 0
- throwforce = 1.0
-
-/obj/item/weapon/FixOVein
- name = "FixOVein"
- icon = 'surgery.dmi'
- icon_state = "fixovein"
- force = 0
- throwforce = 1.0
- origin_tech = "materials=1;biotech=3"
- var/usage_amount = 10
-
-/obj/item/weapon/bonesetter
- name = "bone setter"
- icon = 'surgery.dmi'
- icon_state = "bone setter"
- force = 8.0
- throwforce = 9.0
- throw_speed = 3
- throw_range = 5
- attack_verb = list("attacked", "hit", "bludgeoned")
/obj/item/weapon/syntiflesh
name = "syntiflesh"
@@ -1678,6 +526,27 @@
playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1)
return ..()
+/obj/item/weapon/scythe
+ icon_state = "scythe0"
+ name = "scythe"
+ desc = "A sharp and curved blade on a long fibremetal handle, this tool makes it easy to reap what you sow."
+ force = 13.0
+ throwforce = 5.0
+ throw_speed = 1
+ throw_range = 3
+ w_class = 4.0
+ flags = FPRINT | TABLEPASS | NOSHIELD
+ slot_flags = SLOT_BACK
+ origin_tech = "materials=2;combat=2"
+ attack_verb = list("chopped", "sliced", "cut", "reaped")
+
+/obj/item/weapon/scythe/afterattack(atom/A, mob/user as mob)
+ if(istype(A, /obj/effect/spacevine))
+ for(var/obj/effect/spacevine/B in orange(A,1))
+ if(prob(80))
+ del B
+ del A
+
/*
/obj/item/weapon/cigarpacket
name = "Pete's Cuban Cigars"
@@ -1793,7 +662,7 @@
/obj/item/weapon/stock_parts/manipulator/nano
name = "nano-manipulator"
desc = "A tiny little manipulator used in the construction of certain devices."
- icon_state = "micro_mani"
+ icon_state = "nano_mani"
origin_tech = "materials=3,programming=2"
rating = 2
m_amt = 30
@@ -1801,7 +670,7 @@
/obj/item/weapon/stock_parts/micro_laser/high
name = "high-power micro-laser"
desc = "A tiny laser used in certain devices."
- icon_state = "micro_laser"
+ icon_state = "high_micro_laser"
origin_tech = "magnets=3"
rating = 2
m_amt = 10
@@ -1810,7 +679,7 @@
/obj/item/weapon/stock_parts/matter_bin/adv
name = "advanced matter bin"
desc = "A container for hold compressed matter awaiting re-construction."
- icon_state = "matter_bin"
+ icon_state = "advanced_matter_bin"
origin_tech = "materials=3"
rating = 2
m_amt = 80
@@ -1836,12 +705,14 @@
/obj/item/weapon/stock_parts/manipulator/pico
name = "pico-manipulator"
desc = "A tiny little manipulator used in the construction of certain devices."
+ icon_state = "pico_mani"
origin_tech = "materials=5,programming=2"
rating = 3
m_amt = 30
/obj/item/weapon/stock_parts/micro_laser/ultra
name = "ultra-high-power micro-laser"
+ icon_state = "ultra_high_micro_laser"
desc = "A tiny laser used in certain devices."
origin_tech = "magnets=5"
rating = 3
@@ -1851,6 +722,7 @@
/obj/item/weapon/stock_parts/matter_bin/super
name = "super matter bin"
desc = "A container for hold compressed matter awaiting re-construction."
+ icon_state = "super_matter_bin"
origin_tech = "materials=5"
rating = 3
m_amt = 80
@@ -1924,17 +796,3 @@
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"
-
-/obj/item/weapon/autopsy_scanner
- name = "autopsy scanner"
- desc = "Extracts information on wounds."
- icon = 'icons/obj/autopsy_scanner.dmi'
- icon_state = ""
- flags = FPRINT | TABLEPASS | CONDUCT
- w_class = 1.0
- origin_tech = "materials=1;biotech=1"
-
-/obj/item/weapon/autopsy_scanner/var/list/datum/autopsy_data_scanner/wdata = list()
-/obj/item/weapon/autopsy_scanner/var/list/datum/autopsy_data_scanner/chemtraces = list()
-/obj/item/weapon/autopsy_scanner/var/target_name = null
-/obj/item/weapon/autopsy_scanner/var/timeofdeath = null
diff --git a/code/defines/procs/command_alert.dm b/code/defines/procs/command_alert.dm
index d7a97fe254..6545307fa1 100644
--- a/code/defines/procs/command_alert.dm
+++ b/code/defines/procs/command_alert.dm
@@ -1,9 +1,11 @@
-/proc/command_alert(var/text, var/title = "", var/maintitle = "NanoTrasen Update")
- world << "[maintitle]
"
-
+/proc/command_alert(var/text, var/title = "")
+ var/command
+ command += "[command_name()] Update
"
if (title && length(title) > 0)
- world << "[html_encode(title)]
"
-
- world << "[html_encode(text)]"
- world << "
"
+ command += "[html_encode(title)]
"
+ command += "
[html_encode(text)]
"
+ command += "
"
+ for(var/mob/M in player_list)
+ if(!istype(M,/mob/new_player))
+ M << command
diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm
index 56bfcb5f4d..83cd08c224 100755
--- a/code/game/area/Space Station 13 areas.dm
+++ b/code/game/area/Space Station 13 areas.dm
@@ -606,11 +606,11 @@ proc/process_ghost_teleport_locs()
icon_state = "fsmaint"
/area/maintenance/asmaint
- name = "Library Maintenance"
+ name = "Medbay Maintenance"
icon_state = "asmaint"
/area/maintenance/asmaint2
- name = "Med-Sci Maintenance"
+ name = "Science Maintenance"
icon_state = "asmaint"
/area/maintenance/apmaint
@@ -634,7 +634,7 @@ proc/process_ghost_teleport_locs()
icon_state = "pmaint"
/area/maintenance/aft
- name = "Robotics Maintenance"
+ name = "Engineering Maintenance"
icon_state = "amaint"
/area/maintenance/storage
@@ -696,7 +696,7 @@ proc/process_ghost_teleport_locs()
music = null
/area/crew_quarters/captain
- name = "\improper Captain's Quarters"
+ name = "\improper Captain's Office"
icon_state = "captain"
/area/crew_quarters/heads/hop
@@ -887,10 +887,10 @@ proc/process_ghost_teleport_locs()
engineering
name = "Engineering"
- icon_state = "engine"
+ icon_state = "engine_smes"
break_room
- name = "\improper Engineering Break Room"
+ name = "\improper Engineering Foyer"
icon_state = "engine"
chiefs_office
@@ -947,17 +947,24 @@ proc/process_ghost_teleport_locs()
/area/assembly/chargebay
- name = "\improper Recharging Bay"
+ name = "\improper Mech Bay"
icon_state = "mechbay"
/area/assembly/showroom
name = "\improper Robotics Showroom"
icon_state = "showroom"
-/area/assembly/assembly_line
- name = "\improper Robotics Assembly Line"
+/area/assembly/robotics
+ name = "\improper Robotics Lab"
icon_state = "ass_line"
+/area/assembly/assembly_line //Derelict Assembly Line
+ name = "\improper Assembly Line"
+ icon_state = "ass_line"
+ power_equip = 0
+ power_light = 0
+ power_environ = 0
+
//Teleporter
/area/teleporter
@@ -965,7 +972,7 @@ proc/process_ghost_teleport_locs()
icon_state = "teleporter"
music = "signal"
-/area/teleporter/gateway
+/area/gateway
name = "\improper Gateway"
icon_state = "teleporter"
music = "signal"
@@ -1042,7 +1049,7 @@ proc/process_ghost_teleport_locs()
icon_state = "cloning"
/area/medical/sleeper
- name = "\improper Medical Sleeper Room"
+ name = "Medbay Treatment Center"
icon_state = "exam_room"
//Security
@@ -1112,6 +1119,22 @@ proc/process_ghost_teleport_locs()
name = "\improper Security Checkpoint"
icon_state = "security"
+/area/security/checkpoint/supply
+ name = "Security Post - Cargo Bay"
+ icon_state = "checkpoint1"
+
+/area/security/checkpoint/engineering
+ name = "Security Post - Engineering"
+ icon_state = "checkpoint1"
+
+/area/security/checkpoint/medical
+ name = "Security Post - Medbay"
+ icon_state = "checkpoint1"
+
+/area/security/checkpoint/science
+ name = "Security Post - Science"
+ icon_state = "checkpoint1"
+
/area/security/vacantoffice
name = "\improper Vacant Office"
icon_state = "security"
@@ -1163,7 +1186,7 @@ proc/process_ghost_teleport_locs()
//Toxins
/area/toxins/lab
- name = "\improper Research Hallway"
+ name = "\improper Research and Development"
icon_state = "toxlab"
/area/toxins/hallway
@@ -1400,7 +1423,7 @@ proc/process_ghost_teleport_locs()
icon_state = "ai_upload"
/area/turret_protected/ai_upload_foyer
- name = "Secure Network Access"
+ name = "AI Upload Access"
icon_state = "ai_foyer"
/area/turret_protected/ai
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index fd88f79c29..d3554ef839 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -236,6 +236,9 @@ its easier to just keep the beam vertical.
/atom/proc/blob_act()
return
+/atom/proc/fire_act()
+ return
+
/atom/proc/attack_hand(mob/user as mob)
return
@@ -270,8 +273,8 @@ its easier to just keep the beam vertical.
/atom/proc/attack_larva(mob/user as mob)
return
-// for metroids
-/atom/proc/attack_metroid(mob/user as mob)
+// for slimes
+/atom/proc/attack_slime(mob/user as mob)
return
/atom/proc/hand_h(mob/user as mob) //human (hand) - restrained
@@ -291,7 +294,7 @@ its easier to just keep the beam vertical.
src.hand_p(user)
return
-/atom/proc/hand_m(mob/user as mob) //metroid - restrained
+/atom/proc/hand_m(mob/user as mob) //slime - restrained
return
@@ -528,20 +531,7 @@ its easier to just keep the beam vertical.
var/turf/simulated/source2 = src
new /obj/effect/decal/cleanable/oil(source2)
-/atom/proc/clean_prints()
- if(istype(fingerprints, /list))
- //Smudge up dem prints some
- for(var/P in fingerprints)
- var/test_print = stars(fingerprints[P], rand(10,20))
- if(stringpercent(test_print) == 32) //She's full of stars! (No actual print left)
- fingerprints.Remove(P)
- else
- fingerprints[P] = test_print
- if(!fingerprints.len)
- del(fingerprints)
-
/atom/proc/clean_blood()
- clean_prints()
src.germ_level = 0
if(istype(blood_DNA, /list))
del(blood_DNA)
@@ -602,8 +592,8 @@ var/using_new_click_proc = 0 //TODO ERRORAGE (This is temporary, while the DblCl
src.attack_paw(usr)
else if(isalienadult(usr))
src.attack_alien(usr)
- else if(ismetroid(usr))
- src.attack_metroid(usr)
+ else if(isslime(usr))
+ src.attack_slime(usr)
else if(isanimal(usr))
src.attack_animal(usr)
else
@@ -621,7 +611,7 @@ var/using_new_click_proc = 0 //TODO ERRORAGE (This is temporary, while the DblCl
src.hand_p(usr, usr.hand)
else if(isalienadult(usr))
src.hand_al(usr, usr.hand)
- else if(ismetroid(usr))
+ else if(isslime(usr))
return
else if(isanimal(usr))
return
@@ -833,27 +823,28 @@ var/using_new_click_proc = 0 //TODO ERRORAGE (This is temporary, while the DblCl
attack_larva(alien)
else if(ismetroid(usr))
- var/mob/living/carbon/metroid/metroid = usr
- //-metroid stuff-
+ else if(isslime(usr))
+ var/mob/living/carbon/slime/slime = usr
+ //-slime stuff-
- if(metroid.stat)
+ if(slime.stat)
return
- var/in_range = in_range(src, metroid) || src.loc == metroid
+ var/in_range = in_range(src, slime) || src.loc == slime
if (in_range)
- if ( !metroid.restrained() )
+ if ( !slime.restrained() )
if (W)
- attackby(W,metroid)
+ attackby(W,slime)
if (W)
- W.afterattack(src, metroid)
+ W.afterattack(src, slime)
else
- attack_metroid(metroid)
+ attack_slime(slime)
else
- hand_m(metroid, metroid.hand)
+ hand_m(slime, slime.hand)
else
- if ( (W) && !metroid.restrained() )
- W.afterattack(src, metroid)
+ if ( (W) && !slime.restrained() )
+ W.afterattack(src, slime)
else if(isanimal(usr))
@@ -1165,8 +1156,8 @@ var/using_new_click_proc = 0 //TODO ERRORAGE (This is temporary, while the DblCl
src.attack_larva(usr)
else if (istype(usr, /mob/living/silicon/ai) || istype(usr, /mob/living/silicon/robot))
src.attack_ai(usr, usr.hand)
- else if(istype(usr, /mob/living/carbon/metroid))
- src.attack_metroid(usr)
+ else if(istype(usr, /mob/living/carbon/slime))
+ src.attack_slime(usr)
else if(istype(usr, /mob/living/simple_animal))
src.attack_animal(usr)
else
diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm
index 86bce8b00c..ad3ca36fbd 100644
--- a/code/game/atoms_movable.dm
+++ b/code/game/atoms_movable.dm
@@ -90,7 +90,7 @@
- while(src && target &&((((src.x < target.x && dx == EAST) || (src.x > target.x && dx == WEST)) && dist_travelled < range) || (a.has_gravity == 0) || istype(src.loc, /turf/space)) && src.throwing && istype(src.loc, /turf))
+ while(src && target &&((((src.x < target.x && dx == EAST) || (src.x > target.x && dx == WEST)) && dist_travelled < range) || (a && a.has_gravity == 0) || istype(src.loc, /turf/space)) && src.throwing && istype(src.loc, /turf))
// only stop when we've gone the whole distance (or max throw range) and are on a non-space tile, or hit something, or hit the end of the map, or someone picks it up
if(error < 0)
var/atom/step = get_step(src, dy)
diff --git a/code/game/communications.dm b/code/game/communications.dm
index b79d1f9597..5e4e856269 100644
--- a/code/game/communications.dm
+++ b/code/game/communications.dm
@@ -106,11 +106,10 @@ var/list/radiochannels = list(
"Security" = 1359,
"Deathsquad" = 1441,
"Syndicate" = 1213,
- "Mining" = 1349,
- "Cargo" = 1347,
+ "Supply" = 1347,
)
//depenging helpers
-var/list/DEPT_FREQS = list(1351,1355,1357,1359,1213,1441,1349,1347)
+var/list/DEPT_FREQS = list(1351,1355,1357,1359,1213,1441,1347)
var/const/COMM_FREQ = 1353 //command, colored gold in chat window
var/const/SYND_FREQ = 1213
diff --git a/code/game/dna.dm b/code/game/dna.dm
index 2ff33521bb..f450fcaed0 100644
--- a/code/game/dna.dm
+++ b/code/game/dna.dm
@@ -680,6 +680,19 @@
/////////////////////////// DNA MACHINES
+/obj/machinery/dna_scannernew
+ name = "\improper DNA modifier"
+ desc = "It scans DNA structures."
+ icon = 'icons/obj/Cryogenic2.dmi'
+ icon_state = "scanner_0"
+ density = 1
+ var/locked = 0.0
+ var/mob/occupant = null
+ anchored = 1.0
+ use_power = 1
+ idle_power_usage = 50
+ active_power_usage = 300
+
/obj/machinery/dna_scannernew/New()
..()
component_parts = list()
@@ -838,6 +851,7 @@
A.loc = src.loc
del(src)
+
/obj/machinery/computer/scan_consolenew/ex_act(severity)
switch(severity)
@@ -993,31 +1007,32 @@
src.temphtml = text("No viable occupant detected.")//More than anything, this just acts as a sanity check in case the option DOES appear for whatever reason
usr << browse(temphtml, "window=scannernew;size=550x650")
onclose(usr, "scannernew")
- src.delete = 1
- src.temphtml = text("Working ... Please wait ([] Seconds)", src.radduration)
- usr << browse(temphtml, "window=scannernew;size=550x650")
- onclose(usr, "scannernew")
- var/lock_state = src.connected.locked
- src.connected.locked = 1//lock it
- sleep(10*src.radduration)
- if (!src.connected.occupant)
+ else
+ src.delete = 1
+ src.temphtml = text("Working ... Please wait ([] Seconds)", src.radduration)
+ usr << browse(temphtml, "window=scannernew;size=550x650")
+ onclose(usr, "scannernew")
+ var/lock_state = src.connected.locked
+ src.connected.locked = 1//lock it
+ sleep(10*src.radduration)
+ if (!src.connected.occupant)
+ temphtml = null
+ delete = 0
+ return null
+ if (prob(95))
+ if(prob(75))
+ randmutb(src.connected.occupant)
+ else
+ randmuti(src.connected.occupant)
+ else
+ if(prob(95))
+ randmutg(src.connected.occupant)
+ else
+ randmuti(src.connected.occupant)
+ src.connected.occupant.radiation += ((src.radstrength*3)+src.radduration*3)
+ src.connected.locked = lock_state
temphtml = null
delete = 0
- return null
- if (prob(95))
- if(prob(75))
- randmutb(src.connected.occupant)
- else
- randmuti(src.connected.occupant)
- else
- if(prob(95))
- randmutg(src.connected.occupant)
- else
- randmuti(src.connected.occupant)
- src.connected.occupant.radiation += ((src.radstrength*3)+src.radduration*3)
- src.connected.locked = lock_state
- temphtml = null
- delete = 0
if (href_list["radset"])
src.temphtml = text("Radiation Duration: []
", src.radduration)
src.temphtml += text("Radiation Intensity: []
", src.radstrength)
@@ -1056,21 +1071,22 @@
src.temphtml = text("No viable occupant detected.")
usr << browse(temphtml, "window=scannernew;size=550x650")
onclose(usr, "scannernew")
- //src.temphtml = text("Unique Identifier: []
", src.connected.occupant.dna.uni_identity)
- //src.temphtml = text("Unique Identifier: [getleftblocks(src.connected.occupant.dna.uni_identity,uniblock,3)][src.subblock == 1 ? ""+getblock(getblock(src.connected.occupant.dna.uni_identity,src.uniblock,3),1,1)+"" : getblock(getblock(src.connected.occupant.dna.uni_identity,src.uniblock,3),1,1)][src.subblock == 2 ? ""+getblock(getblock(src.connected.occupant.dna.uni_identity,src.uniblock,3),2,1)+"" : getblock(getblock(src.connected.occupant.dna.uni_identity,src.uniblock,3),2,1)][src.subblock == 3 ? ""+getblock(getblock(src.connected.occupant.dna.uni_identity,src.uniblock,3),3,1)+"" : getblock(getblock(src.connected.occupant.dna.uni_identity,src.uniblock,3),3,1)][getrightblocks(src.connected.occupant.dna.uni_identity,uniblock,3)]
")
+ else
+ //src.temphtml = text("Unique Identifier: []
", src.connected.occupant.dna.uni_identity)
+ //src.temphtml = text("Unique Identifier: [getleftblocks(src.connected.occupant.dna.uni_identity,uniblock,3)][src.subblock == 1 ? ""+getblock(getblock(src.connected.occupant.dna.uni_identity,src.uniblock,3),1,1)+"" : getblock(getblock(src.connected.occupant.dna.uni_identity,src.uniblock,3),1,1)][src.subblock == 2 ? ""+getblock(getblock(src.connected.occupant.dna.uni_identity,src.uniblock,3),2,1)+"" : getblock(getblock(src.connected.occupant.dna.uni_identity,src.uniblock,3),2,1)][src.subblock == 3 ? ""+getblock(getblock(src.connected.occupant.dna.uni_identity,src.uniblock,3),3,1)+"" : getblock(getblock(src.connected.occupant.dna.uni_identity,src.uniblock,3),3,1)][getrightblocks(src.connected.occupant.dna.uni_identity,uniblock,3)]
")
- // New way of displaying DNA blocks
- src.temphtml = text("Unique Identifier: [getblockstring(src.connected.occupant.dna.uni_identity,uniblock,subblock,3, src,1)]
")
+ // New way of displaying DNA blocks
+ src.temphtml = text("Unique Identifier: [getblockstring(src.connected.occupant.dna.uni_identity,uniblock,subblock,3, src,1)]
")
- src.temphtml += text("Selected Block: []
", src.uniblock)
- src.temphtml += text("<- Block ->
", src, src)
- src.temphtml += text("Selected Sub-Block: []
", src.subblock)
- src.temphtml += text("<- Sub-Block ->
", src, src)
- src.temphtml += text("Selected Target: []
", src.unitargethex)
- src.temphtml += text("<- Target ->
", src, src)
- src.temphtml += "Modify Block:
"
- src.temphtml += text("Irradiate
", src)
- src.delete = 0
+ src.temphtml += text("Selected Block: []
", src.uniblock)
+ src.temphtml += text("<- Block ->
", src, src)
+ src.temphtml += text("Selected Sub-Block: []
", src.subblock)
+ src.temphtml += text("<- Sub-Block ->
", src, src)
+ src.temphtml += text("Selected Target: []
", src.unitargethex)
+ src.temphtml += text("<- Target ->
", src, src)
+ src.temphtml += "Modify Block:
"
+ src.temphtml += text("Irradiate
", src)
+ src.delete = 0
if (href_list["unimenuplus"])
if (src.uniblock < 13)
src.uniblock++
@@ -1188,15 +1204,20 @@
src.temphtml = text("No viable occupant detected.")
usr << browse(temphtml, "window=scannernew;size=550x650")
onclose(usr, "scannernew")
- var/mob/living/carbon/human/H = src.connected.occupant
- if(H)
- if (H.reagents.get_reagent_amount("inaprovaline") < 60)
- H.reagents.add_reagent("inaprovaline", 30)
- usr << text("Occupant now has [] units of rejuvenation in his/her bloodstream.", H.reagents.get_reagent_amount("inaprovaline"))
- src.delete = 0
+ else
+ var/mob/living/carbon/human/H = src.connected.occupant
+ if(H)
+ if (H.reagents.get_reagent_amount("inaprovaline") < 60)
+ H.reagents.add_reagent("inaprovaline", 30)
+ usr << text("Occupant now has [] units of rejuvenation in his/her bloodstream.", H.reagents.get_reagent_amount("inaprovaline"))
+ src.delete = 0
////////////////////////////////////////////////////////
if (href_list["strucmenu"])
- if(src.connected.occupant)
+ if(!src.connected.occupant || !src.connected.occupant.dna)
+ src.temphtml = text("No viable occupant detected.")
+ usr << browse(temphtml, "window=scannernew;size=550x650")
+ onclose(usr, "scannernew")
+ else
// Get this shit outta here it sucks
//src.temphtml = text("Structural Enzymes: [getleftblocks(src.connected.occupant.dna.struc_enzymes,strucblock,3)][src.subblock == 1 ? ""+getblock(getblock(src.connected.occupant.dna.struc_enzymes,src.strucblock,3),1,1)+"" : getblock(getblock(src.connected.occupant.dna.struc_enzymes,src.strucblock,3),1,1)][src.subblock == 2 ? ""+getblock(getblock(src.connected.occupant.dna.struc_enzymes,src.strucblock,3),2,1)+"" : getblock(getblock(src.connected.occupant.dna.struc_enzymes,src.strucblock,3),2,1)][src.subblock == 3 ? ""+getblock(getblock(src.connected.occupant.dna.struc_enzymes,src.strucblock,3),3,1)+"" : getblock(getblock(src.connected.occupant.dna.struc_enzymes,src.strucblock,3),3,1)][getrightblocks(src.connected.occupant.dna.struc_enzymes,strucblock,3)]
")
//src.temphtml = text("Structural Enzymes: []
", src.connected.occupant.dna.struc_enzymes)
diff --git a/code/game/gamemodes/blob/blob.dm b/code/game/gamemodes/blob/blob.dm
index 7454370030..7cca20dfac 100644
--- a/code/game/gamemodes/blob/blob.dm
+++ b/code/game/gamemodes/blob/blob.dm
@@ -109,7 +109,9 @@ var/list/blob_nodes = list()
if (1)
command_alert("Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert")
- world << sound('sound/AI/outbreak5.ogg')
+ for(var/mob/M in player_list)
+ if(!istype(M,/mob/new_player))
+ M << sound('sound/AI/outbreak5.ogg')
autoexpand = 0//No more extra pulses
stage = -1
//next stage in 4-5 minutes
diff --git a/code/game/gamemodes/blob/blobs/factory.dm b/code/game/gamemodes/blob/blobs/factory.dm
index bc83a3bb3b..ca1c3f206e 100644
--- a/code/game/gamemodes/blob/blobs/factory.dm
+++ b/code/game/gamemodes/blob/blobs/factory.dm
@@ -19,5 +19,48 @@
run_action()
if(spores.len >= max_spores) return 0
- new/obj/effect/critter/blob(src.loc, src)
+ new/mob/living/simple_animal/hostile/blobspore(src.loc, src)
return 1
+
+
+/mob/living/simple_animal/hostile/blobspore
+ name = "blob"
+ desc = "Some blob thing."
+ icon = 'icons/mob/critter.dmi'
+ icon_state = "blobsquiggle"
+ icon_living = "blobsquiggle"
+ pass_flags = PASSBLOB
+ health = 20
+ maxHealth = 20
+ melee_damage_lower = 4
+ melee_damage_upper = 8
+ attacktext = "hits"
+ attack_sound = 'sound/weapons/genhit1.ogg'
+ var/obj/effect/blob/factory/factory = null
+ faction = "blob"
+ min_oxy = 0
+ max_oxy = 0
+ min_tox = 0
+ max_tox = 0
+ min_co2 = 0
+ max_co2 = 0
+ min_n2 = 0
+ max_n2 = 0
+ minbodytemp = 0
+ maxbodytemp = 360
+
+
+ New(loc, var/obj/effect/blob/factory/linked_node)
+ ..()
+ if(istype(linked_node))
+ factory = linked_node
+ factory.spores += src
+ ..(loc)
+ return
+ Die()
+ ..()
+ if(factory)
+ factory.spores -= src
+ ..()
+ del(src)
+
diff --git a/code/game/gamemodes/changeling/changeling_powers.dm b/code/game/gamemodes/changeling/changeling_powers.dm
index 3db2e1a144..63ba22d87f 100644
--- a/code/game/gamemodes/changeling/changeling_powers.dm
+++ b/code/game/gamemodes/changeling/changeling_powers.dm
@@ -35,29 +35,29 @@
//Helper proc. Does all the checks and stuff for us to avoid copypasta
/mob/proc/changeling_power(var/required_chems=0, var/required_dna=0, var/max_genetic_damage=100, var/max_stat=0)
- if(!usr) return
- if(!usr.mind) return
- if(!iscarbon(usr)) return
- var/datum/changeling/changeling = usr.mind.changeling
+ if(!src.mind) return
+ if(!iscarbon(src)) return
+
+ var/datum/changeling/changeling = src.mind.changeling
if(!changeling)
- world.log << "[usr] has the changeling_transform() verb but is not a changeling."
+ world.log << "[src] has the changeling_transform() verb but is not a changeling."
return
- if(usr.stat > max_stat)
- usr << "We are incapacitated."
+ if(src.stat > max_stat)
+ src << "We are incapacitated."
return
if(changeling.absorbed_dna.len < required_dna)
- usr << "We require at least [required_dna] samples of compatible DNA."
+ src << "We require at least [required_dna] samples of compatible DNA."
return
if(changeling.chem_charges < required_chems)
- usr << "We require at least [required_chems] units of chemicals to do that!"
+ src << "We require at least [required_chems] units of chemicals to do that!"
return
if(changeling.geneticdamage > max_genetic_damage)
- usr << "Our geneomes are still reassembling. We need time to recover first."
+ src << "Our geneomes are still reassembling. We need time to recover first."
return
return changeling
@@ -72,55 +72,55 @@
var/datum/changeling/changeling = changeling_power(0,0,100)
if(!changeling) return
- var/obj/item/weapon/grab/G = usr.get_active_hand()
+ var/obj/item/weapon/grab/G = src.get_active_hand()
if(!istype(G))
- usr << "We must be grabbing a creature in our active hand to absorb them."
+ src << "We must be grabbing a creature in our active hand to absorb them."
return
var/mob/living/carbon/human/T = G.affecting
if(!istype(T))
- usr << "[T] is not compatible with our biology."
+ src << "[T] is not compatible with our biology."
return
if(NOCLONE in T.mutations)
- usr << "This creature's DNA is ruined beyond useability!"
+ src << "This creature's DNA is ruined beyond useability!"
return
if(!G.killing)
- usr << "We must have a tighter grip to absorb this creature."
+ src << "We must have a tighter grip to absorb this creature."
return
if(changeling.isabsorbing)
- usr << "We are already absorbing!"
+ src << "We are already absorbing!"
return
changeling.isabsorbing = 1
for(var/stage = 1, stage<=3, stage++)
switch(stage)
if(1)
- usr << "This creature is compatible. We must hold still..."
+ src << "This creature is compatible. We must hold still..."
if(2)
- usr << "We extend a proboscis."
- usr.visible_message("[usr] extends a proboscis!")
+ src << "We extend a proboscis."
+ src.visible_message("[src] extends a proboscis!")
if(3)
- usr << "We stab [T] with the proboscis."
- usr.visible_message("[usr] stabs [T] with the proboscis!")
+ src << "We stab [T] with the proboscis."
+ src.visible_message("[src] stabs [T] with the proboscis!")
T << "You feel a sharp stabbing pain!"
T.take_overall_damage(40)
feedback_add_details("changeling_powers","A[stage]")
- if(!do_mob(usr, T, 150))
- usr << "Our absorption of [T] has been interrupted!"
+ if(!do_mob(src, T, 150))
+ src << "Our absorption of [T] has been interrupted!"
changeling.isabsorbing = 0
return
- usr << "We have absorbed [T]!"
- usr.visible_message("[usr] sucks the fluids from [T]!")
+ src << "We have absorbed [T]!"
+ src.visible_message("[src] sucks the fluids from [T]!")
T << "You have been absorbed by the changeling!"
T.dna.real_name = T.real_name //Set this again, just to be sure that it's properly set.
changeling.absorbed_dna |= T.dna
- if(usr.nutrition < 400) usr.nutrition = min((usr.nutrition + T.nutrition), 400)
+ if(src.nutrition < 400) src.nutrition = min((src.nutrition + T.nutrition), 400)
changeling.chem_charges += 10
changeling.geneticpoints += 2
@@ -143,7 +143,7 @@
if(!Tp.isVerb)
call(Tp.verbpath)()
else
- usr.make_changeling()
+ src.make_changeling()
changeling.chem_charges += T.mind.changeling.chem_charges
changeling.geneticpoints += T.mind.changeling.geneticpoints
@@ -179,15 +179,15 @@
return
changeling.chem_charges -= 5
- usr.visible_message("[usr] transforms!")
+ src.visible_message("[src] transforms!")
changeling.geneticdamage = 30
- usr.dna = chosen_dna
- usr.real_name = chosen_dna.real_name
- updateappearance(usr, usr.dna.uni_identity)
- domutcheck(usr, null)
+ src.dna = chosen_dna
+ src.real_name = chosen_dna.real_name
+ updateappearance(src, src.dna.uni_identity)
+ domutcheck(src, null)
- usr.verbs -= /mob/proc/changeling_transform
- spawn(10) usr.verbs += /mob/proc/changeling_transform
+ src.verbs -= /mob/proc/changeling_transform
+ spawn(10) src.verbs += /mob/proc/changeling_transform
feedback_add_details("changeling_powers","TR")
return 1
@@ -201,7 +201,7 @@
var/datum/changeling/changeling = changeling_power(1,0,0)
if(!changeling) return
- var/mob/living/carbon/C = usr
+ var/mob/living/carbon/C = src
changeling.chem_charges--
C.remove_changeling_powers()
C.visible_message("[C] transforms!")
@@ -216,7 +216,7 @@
C.monkeyizing = 1
C.canmove = 0
C.icon = null
- C.overlays = null
+ C.overlays.Cut()
C.invisibility = 101
var/atom/movable/overlay/animation = new /atom/movable/overlay( C.loc )
@@ -276,7 +276,7 @@
if(!chosen_dna)
return
- var/mob/living/carbon/C = usr
+ var/mob/living/carbon/C = src
changeling.chem_charges--
C.remove_changeling_powers()
@@ -290,7 +290,7 @@
C.monkeyizing = 1
C.canmove = 0
C.icon = null
- C.overlays = null
+ C.overlays.Cut()
C.invisibility = 101
var/atom/movable/overlay/animation = new /atom/movable/overlay( C.loc )
animation.icon_state = "blank"
@@ -300,7 +300,7 @@
sleep(48)
del(animation)
- for(var/obj/item/W in usr)
+ for(var/obj/item/W in src)
C.u_equip(W)
if (C.client)
C.client.screen -= W
@@ -350,7 +350,7 @@
var/datum/changeling/changeling = changeling_power(20,1,100,DEAD)
if(!changeling) return
- var/mob/living/carbon/C = usr
+ var/mob/living/carbon/C = src
if(!C.stat && alert("Are we sure we wish to fake our death?",,"Yes","No") == "No")//Confirmation for living changelings if they want to fake their death
return
C << "We will attempt to regenerate our form."
@@ -380,7 +380,7 @@
C.heal_overall_damage(C.getBruteLoss(), C.getFireLoss())
C.reagents.clear_reagents()
C << "We have regenerated."
- C.visible_message("[usr] appears to wake from the dead, having healed all wounds.")
+ C.visible_message("[src] appears to wake from the dead, having healed all wounds.")
C.status_flags &= ~(FAKEDEATH)
C.update_canmove()
@@ -398,10 +398,10 @@
var/datum/changeling/changeling = changeling_power(10,0,100)
if(!changeling) return 0
changeling.chem_charges -= 10
- usr << "Your throat adjusts to launch the sting."
+ src << "Your throat adjusts to launch the sting."
changeling.sting_range = 2
- usr.verbs -= /mob/proc/changeling_boost_range
- spawn(5) usr.verbs += /mob/proc/changeling_boost_range
+ src.verbs -= /mob/proc/changeling_boost_range
+ spawn(5) src.verbs += /mob/proc/changeling_boost_range
feedback_add_details("changeling_powers","RS")
return 1
@@ -416,7 +416,7 @@
if(!changeling) return 0
changeling.chem_charges -= 45
- var/mob/living/carbon/human/C = usr
+ var/mob/living/carbon/human/C = src
C.stat = 0
C.SetParalysis(0)
C.SetStunned(0)
@@ -424,45 +424,44 @@
C.lying = 0
C.update_canmove()
- usr.verbs -= /mob/proc/changeling_unstun
- spawn(5) usr.verbs += /mob/proc/changeling_unstun
+ src.verbs -= /mob/proc/changeling_unstun
+ spawn(5) src.verbs += /mob/proc/changeling_unstun
feedback_add_details("changeling_powers","UNS")
return 1
//Speeds up chemical regeneration
/mob/proc/changeling_fastchemical()
- usr.mind.changeling.chem_recharge_rate *= 2
+ src.mind.changeling.chem_recharge_rate *= 2
return 1
//Increases macimum chemical storage
/mob/proc/changeling_engorgedglands()
- usr.mind.changeling.chem_storage += 25
+ src.mind.changeling.chem_storage += 25
return 1
//Prevents AIs tracking you but makes you easily detectable to the human-eye.
/mob/proc/changeling_digitalcamo()
set category = "Changeling"
- set name = "Toggle Digital Camoflague (10)"
+ set name = "Toggle Digital Camoflague"
set desc = "The AI can no longer track us, but we will look different if examined. Has a constant cost while active."
- var/datum/changeling/changeling = changeling_power(10)
+ var/datum/changeling/changeling = changeling_power()
if(!changeling) return 0
- usr.mind.changeling.chem_charges -= 10
- var/mob/living/carbon/human/C = usr
+ var/mob/living/carbon/human/C = src
if(C.digitalcamo) C << "We return to normal."
else C << "We distort our form to prevent AI-tracking."
C.digitalcamo = !C.digitalcamo
spawn(0)
- while(C && C.digitalcamo)
- C.mind.changeling.chem_charges -= 1
+ while(C && C.digitalcamo && C.mind && C.mind.changeling)
+ C.mind.changeling.chem_charges = max(C.mind.changeling.chem_charges - 1, 0)
sleep(40)
- usr.verbs -= /mob/proc/changeling_digitalcamo
- spawn(5) usr.verbs += /mob/proc/changeling_digitalcamo
+ src.verbs -= /mob/proc/changeling_digitalcamo
+ spawn(5) src.verbs += /mob/proc/changeling_digitalcamo
feedback_add_details("changeling_powers","CAM")
return 1
@@ -475,9 +474,9 @@
var/datum/changeling/changeling = changeling_power(30,0,100,UNCONSCIOUS)
if(!changeling) return 0
- usr.mind.changeling.chem_charges -= 30
+ src.mind.changeling.chem_charges -= 30
- var/mob/living/carbon/human/C = usr
+ var/mob/living/carbon/human/C = src
spawn(0)
for(var/i = 0, i<10,i++)
if(C)
@@ -487,8 +486,8 @@
C.adjustFireLoss(-10)
sleep(10)
- usr.verbs -= /mob/proc/changeling_rapidregen
- spawn(5) usr.verbs += /mob/proc/changeling_rapidregen
+ src.verbs -= /mob/proc/changeling_rapidregen
+ spawn(5) src.verbs += /mob/proc/changeling_rapidregen
feedback_add_details("changeling_powers","RR")
return 1
@@ -510,7 +509,7 @@ var/list/datum/dna/hivemind_bank = list()
names += DNA.real_name
if(names.len <= 0)
- usr << "The airwaves already have all of our DNA."
+ src << "The airwaves already have all of our DNA."
return
var/S = input("Select a DNA to channel: ", "Channel DNA", null) as null|anything in names
@@ -522,7 +521,7 @@ var/list/datum/dna/hivemind_bank = list()
changeling.chem_charges -= 10
hivemind_bank += chosen_dna
- usr << "We channel the DNA of [S] to the air."
+ src << "We channel the DNA of [S] to the air."
feedback_add_details("changeling_powers","HU")
return 1
@@ -540,7 +539,7 @@ var/list/datum/dna/hivemind_bank = list()
names[DNA.real_name] = DNA
if(names.len <= 0)
- usr << "There's no new DNA to absorb from the air."
+ src << "There's no new DNA to absorb from the air."
return
var/S = input("Select a DNA absorb from the air: ", "Absorb DNA", null) as null|anything in names
@@ -551,7 +550,7 @@ var/list/datum/dna/hivemind_bank = list()
changeling.chem_charges -= 20
changeling.absorbed_dna += chosen_dna
- usr << "We absorb the DNA of [S] from the air."
+ src << "We absorb the DNA of [S] from the air."
feedback_add_details("changeling_powers","HD")
return 1
@@ -559,32 +558,32 @@ var/list/datum/dna/hivemind_bank = list()
/mob/proc/changeling_mimicvoice()
set category = "Changeling"
- set name = "Mimic Voice (10)"
- set desc = "Shape our vocal glands to form a voice of someone we choose."
+ set name = "Mimic Voice"
+ set desc = "Shape our vocal glands to form a voice of someone we choose. We cannot regenerate chemicals when mimicing."
- var/datum/changeling/changeling = changeling_power(10,1)
+
+ var/datum/changeling/changeling = changeling_power()
if(!changeling) return
if(changeling.mimicing)
changeling.mimicing = ""
- usr << "We return our vocal glands to their original location."
+ src << "We return our vocal glands to their original location."
return
var/mimic_voice = input("Enter a name to mimic.", "Mimic Voice", null) as text
if(!mimic_voice)
return
- changeling.chem_charges -= 10
changeling.mimicing = mimic_voice
- usr << "We shape our glands to take the voice of [mimic_voice], this will stop us from regenerating chemicals while active."
- usr << "Use this power again to return to our original voice and reproduce chemicals again."
+ src << "We shape our glands to take the voice of [mimic_voice], this will stop us from regenerating chemicals while active."
+ src << "Use this power again to return to our original voice and reproduce chemicals again."
feedback_add_details("changeling_powers","MV")
spawn(0)
while(src && src.mind && src.mind.changeling && src.mind.changeling.mimicing)
- src.mind.changeling.chem_charges -= 1
+ src.mind.changeling.chem_charges = max(src.mind.changeling.chem_charges - 1, 0)
sleep(40)
if(src && src.mind && src.mind.changeling)
src.mind.changeling.mimicing = ""
@@ -607,7 +606,7 @@ var/list/datum/dna/hivemind_bank = list()
var/list/victims = list()
for(var/mob/living/carbon/C in oview(changeling.sting_range))
victims += C
- var/mob/living/carbon/T = input(usr, "Who will we sting?") as null|anything in victims
+ var/mob/living/carbon/T = input(src, "Who will we sting?") as null|anything in victims
if(!T) return
if(!(T in view(changeling.sting_range))) return
@@ -616,10 +615,10 @@ var/list/datum/dna/hivemind_bank = list()
changeling.chem_charges -= required_chems
changeling.sting_range = 1
- usr.verbs -= verb_path
- spawn(10) usr.verbs += verb_path
+ src.verbs -= verb_path
+ spawn(10) src.verbs += verb_path
- usr << "We stealthily sting [T]."
+ src << "We stealthily sting [T]."
if(!T.mind || !T.mind.changeling) return T //T will be affected by the sting
T << "You feel a tiny prick."
return
@@ -712,7 +711,7 @@ var/list/datum/dna/hivemind_bank = list()
var/mob/living/carbon/T = changeling_sting(40,/mob/proc/changeling_transformation_sting)
if(!T) return 0
if((HUSK in T.mutations) || (!ishuman(T) && !ismonkey(T)))
- usr << "Our sting appears ineffective against its DNA."
+ src << "Our sting appears ineffective against its DNA."
return 0
T.visible_message("[T] transforms!")
T.dna = chosen_dna
@@ -756,8 +755,8 @@ var/list/datum/dna/hivemind_bank = list()
set desc="Stealthily sting a target to extract their DNA."
var/datum/changeling/changeling = null
- if(usr.mind && usr.mind.changeling)
- changeling = usr.mind.changeling
+ if(src.mind && src.mind.changeling)
+ changeling = src.mind.changeling
if(!changeling)
return 0
diff --git a/code/game/gamemodes/changeling/modularchangling.dm b/code/game/gamemodes/changeling/modularchangling.dm
index 2f3659bc7a..2395e63b27 100644
--- a/code/game/gamemodes/changeling/modularchangling.dm
+++ b/code/game/gamemodes/changeling/modularchangling.dm
@@ -81,7 +81,7 @@ var/list/datum/power/changeling/powerinstances = list()
/datum/power/changeling/mimicvoice
name = "Mimic Voice"
desc = "We shape our vocal glands to sound like a desired voice."
- helptext = "Will turn your voice into the name that you enter."
+ helptext = "Will turn your voice into the name that you enter. We must constantly expend chemicals to maintain our form like this"
genomecost = 3
verbpath = /mob/proc/changeling_mimicvoice
@@ -494,7 +494,7 @@ var/list/datum/power/changeling/powerinstances = list()
purchasedpowers += Thepower
if(!Thepower.isVerb && Thepower.verbpath)
- call(Thepower.verbpath)()
+ call(M.current, Thepower.verbpath)()
else if(remake_verbs)
M.current.make_changeling()
diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm
index 4990ed625b..b08faf9ebb 100644
--- a/code/game/gamemodes/cult/ritual.dm
+++ b/code/game/gamemodes/cult/ritual.dm
@@ -774,24 +774,3 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology",
R.word3=wordtech
R.loc = user.loc
R.check_icon()
-
-
-/obj/item/weapon/paperscrap
- name = "scrap of paper"
- icon_state = "scrap"
- throw_speed = 1
- throw_range = 2
- w_class = 1.0
- flags = FPRINT | TABLEPASS
-
- var/data
-
- attack_self(mob/user as mob)
- view_scrap(user)
-
- examine()
- set src in usr
- view_scrap(usr)
-
- proc/view_scrap(var/viewer)
- viewer << browse(data)
diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm
index b4eefa6380..4564ea2fc9 100644
--- a/code/game/gamemodes/cult/runes.dm
+++ b/code/game/gamemodes/cult/runes.dm
@@ -377,10 +377,14 @@ var/list/sacrificed = list()
"\red A shape forms in the center of the rune. A shape of... a man.", \
"\red You hear liquid flowing.")
D.real_name = "Unknown"
+ var/chose_name = 0
for(var/obj/item/weapon/paper/P in this_rune.loc)
if(P.info)
D.real_name = copytext(P.info, 1, MAX_NAME_LEN)
+ chose_name = 1
break
+ if(!chose_name)
+ D.real_name = "[pick(first_names_male)] [pick(last_names)]"
D.universal_speak = 1
D.status_flags &= ~GODMODE
diff --git a/code/game/gamemodes/events.dm b/code/game/gamemodes/events.dm
index 9e0ba0a37d..333af390eb 100644
--- a/code/game/gamemodes/events.dm
+++ b/code/game/gamemodes/events.dm
@@ -8,13 +8,14 @@
/*if(prob(50))//Every 120 seconds and prob 50 2-4 weak spacedusts will hit the station
spawn(1)
dust_swarm("weak")*/
- if (!event)
+ if(!event)
//CARN: checks to see if random events are enabled.
if(config.allow_random_events)
- hadevent = event()
- else
- Holiday_Random_Event()
- else
+ if(prob(eventchance))
+ event()
+ hadevent = 1
+ else
+ Holiday_Random_Event() else
event = 0
sleep(2400)
@@ -77,15 +78,52 @@
switch(picked_event)
if("Meteor")
command_alert("Meteors have been detected on collision course with the station.", "Meteor Alert")
- world << sound('sound/AI/meteors.ogg')
+ for(var/mob/M in player_list)
+ if(!istype(M,/mob/new_player))
+ M << sound('sound/AI/meteors.ogg')
spawn(100)
meteor_wave()
spawn_meteors()
spawn(700)
meteor_wave()
spawn_meteors()
- if("Blob")
- mini_blob_event()
+
+ if(2)
+ command_alert("Gravitational anomalies detected on the station. There is no additional data.", "Anomaly Alert")
+ for(var/mob/M in player_list)
+ if(!istype(M,/mob/new_player))
+ M << sound('sound/AI/granomalies.ogg')
+ var/turf/T = pick(blobstart)
+ var/obj/effect/bhole/bh = new /obj/effect/bhole( T.loc, 30 )
+ spawn(rand(50, 300))
+ del(bh)
+ /*
+ if(3) //Leaving the code in so someone can try and delag it, but this event can no longer occur randomly, per SoS's request. --NEO
+ command_alert("Space-time anomalies detected on the station. There is no additional data.", "Anomaly Alert")
+ world << sound('sound/AI/spanomalies.ogg')
+ var/list/turfs = new
+ var/turf/picked
+ for(var/turf/simulated/floor/T in world)
+ if(T.z == 1)
+ turfs += T
+ for(var/turf/simulated/floor/T in turfs)
+ if(prob(20))
+ spawn(50+rand(0,3000))
+ picked = pick(turfs)
+ var/obj/effect/portal/P = new /obj/effect/portal( T )
+ P.target = picked
+ P.creator = null
+ P.icon = 'icons/obj/objects.dmi'
+ P.failchance = 0
+ P.icon_state = "anom"
+ P.name = "wormhole"
+ spawn(rand(300,600))
+ del(P)
+ */
+ if(3)
+ if((world.time/10)>=3600 && toggle_space_ninja && !sent_ninja_to_station)//If an hour has passed, relatively speaking. Also, if ninjas are allowed to spawn and if there is not already a ninja for the round.
+ space_ninja_arrival()//Handled in space_ninja.dm. Doesn't announce arrival, all sneaky-like.
+ if(4) mini_blob_event()
if("Space Ninja")
//Handled in space_ninja.dm. Doesn't announce arrival, all sneaky-like.
space_ninja_arrival()
@@ -118,13 +156,16 @@
command_alert("Ionospheric anomalies detected. Temporary telecommunication failure imminent. Please contact you-BZZT")
else // AIs will always know if there's a comm blackout, rogue AIs could then lie about comm blackouts in the future while they shutdown comms
for(var/mob/living/silicon/ai/A in player_list)
- A << "Ionospheric anomalies detected. Temporary telecommunication failure imminent. Please contact you-BZZT"
+ A << "
"
+ A << "Ionospheric anomalies detected. Temporary telecommunication failure imminent. Please contact you-BZZT"
+ A << "
"
for(var/obj/machinery/telecomms/T in telecomms_list)
T.emp_act(1)
/proc/power_failure()
command_alert("Abnormal activity detected in [station_name()]'s powernet. As a precautionary measure, the station's power will be shut off for an indeterminate duration.", "Critical Power Failure")
- world << sound('sound/AI/poweroff.ogg')
+ for(var/mob/M in player_list)
+ M << sound('sound/AI/poweroff.ogg')
for(var/obj/machinery/power/smes/S in world)
if(istype(get_area(S), /area/turret_protected) || S.z != 1)
continue
@@ -172,7 +213,8 @@
/proc/power_restore()
command_alert("Power has been restored to [station_name()]. We apologize for the inconvenience.", "Power Systems Nominal")
- world << sound('sound/AI/poweron.ogg')
+ for(var/mob/M in player_list)
+ M << sound('sound/AI/poweron.ogg')
for(var/obj/machinery/power/apc/C in world)
if(C.cell && C.z == 1)
C.cell.charge = C.cell.maxcharge
@@ -194,7 +236,8 @@
/proc/power_restore_quick()
command_alert("All SMESs on [station_name()] have been recharged. We apologize for the inconvenience.", "Power Systems Nominal")
- world << sound('sound/AI/poweron.ogg')
+ for(var/mob/M in player_list)
+ M << sound('sound/AI/poweron.ogg')
for(var/obj/machinery/power/smes/S in world)
if(S.z != 1)
continue
@@ -250,6 +293,8 @@
var/foundAlready = 0 // don't infect someone that already has the virus
var/turf/T = get_turf(H)
+ if(!T)
+ continue
if(T.z != 1)
continue
for(var/datum/disease/D in H.viruses)
@@ -278,7 +323,8 @@
break
spawn(rand(1500, 3000)) //Delayed announcements to keep the crew on their toes.
command_alert("Confirmed outbreak of level 7 viral biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert")
- world << sound('sound/AI/outbreak7.ogg')
+ for(var/mob/M in player_list)
+ M << sound('sound/AI/outbreak7.ogg')
/proc/alien_infestation(var/spawncount = 1) // -- TLE
//command_alert("Unidentified lifesigns detected coming aboard [station_name()]. Secure any exterior access, including ducting and ventilation.", "Lifesign Alert")
@@ -306,7 +352,8 @@
spawn(rand(5000, 6000)) //Delayed announcements to keep the crew on their toes.
command_alert("Unidentified lifesigns detected coming aboard [station_name()]. Secure any exterior access, including ducting and ventilation.", "Lifesign Alert")
- world << sound('sound/AI/aliens.ogg')
+ for(var/mob/M in player_list)
+ M << sound('sound/AI/aliens.ogg')
/proc/high_radiation_event()
@@ -321,6 +368,8 @@
sleep(600)
for(var/mob/living/carbon/human/H in living_mob_list)
var/turf/T = get_turf(H)
+ if(!T)
+ continue
if(T.z != 1)
continue
if(istype(H,/mob/living/carbon/human))
@@ -329,12 +378,15 @@
H.apply_effect((rand(90,150)),IRRADIATE,0)
for(var/mob/living/carbon/monkey/M in living_mob_list)
var/turf/T = get_turf(M)
+ if(!T)
+ continue
if(T.z != 1)
continue
M.apply_effect((rand(15,75)),IRRADIATE,0)
sleep(100)
command_alert("Radiation levels are within standard parameters again.", "Anomaly Alert")
- world << sound('sound/AI/radiation.ogg')
+ for(var/mob/M in player_list)
+ M << sound('sound/AI/radiation.ogg')
@@ -384,7 +436,8 @@
//sleep(100)
spawn(rand(300, 600)) //Delayed announcements to keep the crew on their toes.
command_alert("Unknown biological entities have been detected near [station_name()], please stand-by.", "Lifesign Alert")
- world << sound('sound/AI/commandreport.ogg')
+ for(var/mob/M in player_list)
+ M << sound('sound/AI/commandreport.ogg')
/proc/lightsout(isEvent = 0, lightsoutAmount = 1,lightsoutRange = 25) //leave lightsoutAmount as 0 to break ALL lights
if(isEvent)
@@ -451,46 +504,74 @@ Would like to add a law like "Law x is _______" where x = a number, and _____ is
crew = "Any Human"
switch(rand(1,14))
if(1)
+ M << "
"
M << "\red THERE ARE [amount] [who2] ON THE STATION...LAWS UPDATED"
+ M << "
"
M.add_ion_law("THERE ARE [amount] [who2] ON THE STATION")
if(2)
+ M << "
"
M << "\red [what2] ARE DANGEROUS TO HUMANS...LAWS UPDATED"
+ M << "
"
M.add_ion_law("[what2] ARE DANGEROUS TO HUMANS")
if(3)
+ M << "
"
M << "\red THE ESCAPE-SHUTTLE CANNOT BE CALLED BECAUSE OF [who2] ON THE STATION...LAWS UPDATED"
+ M << "
"
M.add_ion_law("THE ESCAPE SHUTTLE CANNOT BE CALLED BECAUSE OF [who2] ON THE STATION")
if(4)
+ M << "
"
M << "\red HUMANS NEED TO EAT [what2pref] [what2] TO SURVIVE...LAWS UPDATED"
+ M << "
"
M.add_ion_law("HUMANS NEED TO EAT [what2pref] [what2] TO SURVIVE")
if(5)
+ M << "
"
M << "\red THE CAPTAIN, HOP AND HOS ARE [who2]...LAWS UPDATED"
+ M << "
"
M.add_ion_law("THE CAPTAIN, HOP AND HOS ARE [who2]")
if(6)
+ M << "
"
M << "\red THE STATION IS BUILT FOR [who2]...LAWS UPDATED"
+ M << "
"
M.add_ion_law("THE STATION IS BUILT FOR [who2]")
if(7)
+ M << "
"
M << "\red YOU ARE [amount] [who2]...LAWS UPDATED"
+ M << "
"
M.add_ion_law("YOU ARE [amount] [who2]")
if(8)
+ M << "
"
M << "\red YOU MUST ALWAYS [aimust]...LAWS UPDATED"
+ M << "
"
M.add_ion_law("YOU MUST ALWAYS [aimust]")
if(9)
+ M << "
"
M << "\red [area] [area2] [amount] [what2]...LAWS UPDATED"
+ M << "
"
M.add_ion_law("[area] [area2] [amount] [what2]")
if(10)
+ M << "
"
M << "\red [crew] is [target]...LAWS UPDATED"
+ M << "
"
M.add_ion_law("[crew] is [target]")
if(11)
+ M << "
"
M << "\red [define] IS A FORM OF HARM...LAWS UPDATED"
+ M << "
"
M.add_ion_law("[define] IS A FORM OF HARM")
if(12)
+ M << "
"
M << "\red YOU REQUIRE [require] IN ORDER TO PROTECT HUMANS... LAWS UPDATED"
+ M << "
"
M.add_ion_law("YOU REQUIRE [require] IN ORDER TO PROTECT HUMANS")
if(13)
+ M << "
"
M << "\red [crew] is [allergysev] to [allergy]...LAWS UPDATED"
+ M << "
"
M.add_ion_law("[crew] is [allergysev] to [allergy]")
if(14)
+ M << "
"
M << "\red THE STATION IS [who2pref] [who2]...LAWS UPDATED"
+ M << "
"
M.add_ion_law("THE STATION IS [who2pref] [who2]")
if(botEmagChance)
diff --git a/code/game/gamemodes/events/dust.dm b/code/game/gamemodes/events/dust.dm
index fb1f167c34..378c6b2468 100644
--- a/code/game/gamemodes/events/dust.dm
+++ b/code/game/gamemodes/events/dust.dm
@@ -100,7 +100,7 @@ The "dust" will damage the hull of the station causin minor hull breaches.
if(ismob(A))
A.meteorhit(src)//This should work for now I guess
- else if(!istype(A,/obj/machinery/emitter) && !istype(A,/obj/machinery/field_generator)) //Protect the singularity from getting released every round!
+ else if(!istype(A,/obj/machinery/power/emitter) && !istype(A,/obj/machinery/field_generator)) //Protect the singularity from getting released every round!
A.ex_act(strength) //Changing emitter/field gen ex_act would make it immune to bombs and C4
life--
diff --git a/code/game/gamemodes/events/holidays/Christmas.dm b/code/game/gamemodes/events/holidays/Christmas.dm
index 2b4a1008ff..2ee79e7c65 100644
--- a/code/game/gamemodes/events/holidays/Christmas.dm
+++ b/code/game/gamemodes/events/holidays/Christmas.dm
@@ -1 +1,63 @@
-//placeholder for holiday stuff
\ No newline at end of file
+/proc/Christmas_Game_Start()
+ for(var/obj/structure/flora/tree/pine/xmas in world)
+ if(xmas.z != 1) continue
+ for(var/turf/simulated/floor/T in orange(1,xmas))
+ for(var/i=1,i<=rand(1,5),i++)
+ new /obj/item/weapon/a_gift(T)
+ for(var/mob/living/simple_animal/corgi/Ian/Ian in mob_list)
+ Ian.place_on_head(new /obj/item/clothing/head/helmet/space/santahat(Ian))
+
+/proc/ChristmasEvent()
+ for(var/obj/structure/flora/tree/pine/xmas in world)
+ var/mob/living/simple_animal/hostile/tree/evil_tree = new /mob/living/simple_animal/hostile/tree(xmas.loc)
+ evil_tree.icon_state = xmas.icon_state
+ evil_tree.icon_living = evil_tree.icon_state
+ evil_tree.icon_dead = evil_tree.icon_state
+ evil_tree.icon_gib = evil_tree.icon_state
+ del(xmas)
+
+/obj/item/weapon/toy/xmas_cracker
+ name = "xmas cracker"
+ icon = 'icons/obj/christmas.dmi'
+ icon_state = "cracker"
+ desc = "Directions for use: Requires two people, one to pull each end."
+ var/cracked = 0
+
+/obj/item/weapon/toy/xmas_cracker/New()
+ ..()
+
+/obj/item/weapon/toy/xmas_cracker/attack(mob/target, mob/user)
+ if( !cracked && istype(target,/mob/living/carbon/human) && (target.stat == CONSCIOUS) && !target.get_active_hand() )
+ target.visible_message("[user] and [target] pop \an [src]! *pop*", "You pull \an [src] with [target]! *pop*", "You hear a *pop*.")
+ var/obj/item/weapon/paper/Joke = new /obj/item/weapon/paper(user.loc)
+ Joke.name = "[pick("awful","terrible","unfunny")] joke"
+ Joke.info = pick("What did one snowman say to the other?\n\n'Is it me or can you smell carrots?'",
+ "Why couldn't the snowman get laid?\n\nHe was frigid!",
+ "Where are santa's helpers educated?\n\nNowhere, they're ELF-taught.",
+ "What happened to the man who stole advent calanders?\n\nHe got 25 days.",
+ "What does Santa get when he gets stuck in a chimney?\n\nClaus-trophobia.",
+ "Where do you find chili beans?\n\nThe north pole.",
+ "What do you get from eating tree decorations?\n\nTinsilitis!",
+ "What do snowmen wear on their heads?\n\nIce caps!",
+ "Why is Christmas just like life on ss13?\n\nYou do all the work and the fat guy gets all the credit.",
+ "Why doesn’t Santa have any children?\n\nBecause he only comes down the chimney.")
+ new /obj/item/clothing/head/festive(target.loc)
+ user.update_icons()
+ cracked = 1
+ icon_state = "cracker1"
+ var/obj/item/weapon/toy/xmas_cracker/other_half = new /obj/item/weapon/toy/xmas_cracker(target)
+ other_half.cracked = 1
+ other_half.icon_state = "cracker2"
+ target.put_in_active_hand(other_half)
+ playsound(user, 'sound/effects/snap.ogg', 50, 1)
+ return 1
+ return ..()
+
+/obj/item/clothing/head/festive
+ name = "festive paper hat"
+ icon_state = "xmashat"
+ desc = "A crappy paper hat that you are REQUIRED to wear."
+ flags_inv = 0
+ flags = FPRINT|TABLEPASS
+ armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+
diff --git a/code/game/gamemodes/events/holidays/Holidays.dm b/code/game/gamemodes/events/holidays/Holidays.dm
index eed0a08332..d2481eae44 100644
--- a/code/game/gamemodes/events/holidays/Holidays.dm
+++ b/code/game/gamemodes/events/holidays/Holidays.dm
@@ -101,6 +101,7 @@ var/global/Holiday = null
switch(DD)
if(10) Holiday = "Human-Rights Day"
if(14) Holiday = "Monkey Day"
+ if(21) if(YY==12) Holiday = "End of the World"
if(22) Holiday = "Orgasming Day" //lol. These all actually exist
if(24) Holiday = "Christmas Eve"
if(25) Holiday = "Christmas"
@@ -120,14 +121,13 @@ var/global/Holiday = null
set desc = "Force-set the Holiday variable to make the game think it's a certain day."
if(!check_rights(R_SERVER)) return
- if(!T) return
Holiday = T
//get a new station name
station_name = null
station_name()
//update our hub status
world.update_status()
-// Holiday_Game_Start()
+ Holiday_Game_Start()
message_admins("\blue ADMIN: Event: [key_name(src)] force-set Holiday to \"[Holiday]\"")
log_admin("[key_name(src)] force-set Holiday to \"[Holiday]\"")
@@ -141,10 +141,9 @@ var/global/Holiday = null
switch(Holiday) //special holidays
if("Easter")
//do easter stuff
- if("Christmas ")
- //do christmas stuff
- else
- //etc. you get what I'm getting at
+ if("Christmas Eve","Christmas")
+ Christmas_Game_Start()
+
return
//Nested in the random events loop. Will be triggered every 2 minutes
@@ -171,4 +170,9 @@ var/global/Holiday = null
if(S.z != 1) continue
containers += S
- message_admins("\blue DEBUG: Event: Egg spawned at [Egg.loc] ([Egg.x],[Egg.y],[Egg.z])")*/
\ No newline at end of file
+ message_admins("\blue DEBUG: Event: Egg spawned at [Egg.loc] ([Egg.x],[Egg.y],[Egg.z])")*/
+ if("End of the World")
+ if(prob(eventchance)) GameOver()
+
+ if("Christmas","Christmas Eve")
+ if(prob(eventchance)) ChristmasEvent()
diff --git a/code/game/gamemodes/events/holidays/Other.dm b/code/game/gamemodes/events/holidays/Other.dm
new file mode 100644
index 0000000000..b520bbe342
--- /dev/null
+++ b/code/game/gamemodes/events/holidays/Other.dm
@@ -0,0 +1,10 @@
+/proc/GameOver()
+ if(!hadevent)
+ hadevent = 1
+ message_admins("The apocalypse has begun! (this holiday event can be disabled by toggling events off within 60 seconds)")
+ spawn(600)
+ if(!config.allow_random_events) return
+ Show2Group4Delay(ScreenText(null,"
The [name_1] [name_2] implied an undercover operative was acting on their behalf on the station currently.
"
+ src.text += "
The [name_1] [name_2] implied an undercover operative was acting on their behalf on the station currently."
+ src.text += "It would be in your best interests to suspect everybody, as these undercover operatives could have implants which trigger them to have their memories removed until they are needed. He, or she, could even be a high ranking officer."
+ /*
src.text += "After some investigation, we "
if(traitor_name)
src.text += "are [prob_right_dude]% sure that [traitor_name] may have been involved, and should be closely observed."
@@ -130,11 +140,13 @@
else
src.text += "discovered the following set of fingerprints ([fingerprints]) on sensitive materials, and their owner should be closely observed."
src.text += "However, these could also belong to a current Cent. Com employee, so do not act on this without reason."
+ */
/datum/intercept_text/proc/build_cult(datum/mind/correct_person)
var/name_1 = pick(src.org_names_1)
var/name_2 = pick(src.org_names_2)
+ /*
var/traitor_name
var/traitor_job
var/prob_right_dude = rand(prob_correct_person_lower, prob_correct_person_higher)
@@ -156,19 +168,23 @@
traitor_name = correct_person:current
else
traitor_name = pick_mob()
-
- src.text += "
It has been brought to our attention that the [name_1] [name_2] have stumbled upon some dark secrets. They apparently want to spread the dangerous knowledge on as many stations as they can.
"
+ */
+ src.text += "
It has been brought to our attention that the [name_1] [name_2] have stumbled upon some dark secrets. They apparently want to spread the dangerous knowledge onto as many stations as they can."
+ src.text += "Watch out for the following: praying to an unfamilar god, preaching the word of \[REDACTED\], sacrifices, magical dark power, living constructs of evil and a portal to the dimension of the underworld."
+ /*
src.text += "Based on our intelligence, we are [prob_right_job]% sure that if true, someone doing the job of [traitor_job] on your station may have been converted "
src.text += "and instilled with the idea of the flimsiness of the real world, seeking to destroy it. "
if(prob(prob_right_dude))
src.text += "
In addition, we are [prob_right_dude]% sure that [traitor_name] may have also some in to contact with this "
src.text += "organisation."
src.text += "
However, if this information is acted on without substantial evidence, those responsible will face severe repercussions."
+ */
/datum/intercept_text/proc/build_rev(datum/mind/correct_person)
var/name_1 = pick(src.org_names_1)
var/name_2 = pick(src.org_names_2)
+ /*
var/traitor_name
var/traitor_job
var/prob_right_dude = rand(prob_correct_person_lower, prob_correct_person_higher)
@@ -192,14 +208,17 @@
traitor_name = correct_person.current
else
traitor_name = src.pick_mob()
-
- src.text += "
It has been brought to our attention that the [name_1] [name_2] are attempting to stir unrest on one of our stations in your sector.
"
+ */
+ src.text += "
It has been brought to our attention that the [name_1] [name_2] are attempting to stir unrest on one of our stations in your sector."
+ src.text += "Watch out for suspicious activity among the crew and make sure that all heads of staff report in periodically."
+ /*
src.text += "Based on our intelligence, we are [prob_right_job]% sure that if true, someone doing the job of [traitor_job] on your station may have been brainwashed "
src.text += "at a recent conference, and their department should be closely monitored for signs of mutiny. "
if(prob(prob_right_dude))
src.text += "
In addition, we are [prob_right_dude]% sure that [traitor_name] may have also some in to contact with this "
src.text += "organisation."
src.text += "
However, if this information is acted on without substantial evidence, those responsible will face severe repercussions."
+ */
/datum/intercept_text/proc/build_wizard(datum/mind/correct_person)
@@ -211,7 +230,7 @@
src.text += "Known attributes include: Brown sandals, a large blue hat, a voluptous white beard, and an inclination to cast spells."
/datum/intercept_text/proc/build_nuke(datum/mind/correct_person)
- src.text += "
Cent. Com recently recieved a report of a plot to destory one of our stations in your area. We believe the Nuclear Authentication Disc "
+ src.text += "
Cent. Com recently recieved a report of a plot to destroy one of our stations in your area. We believe the Nuclear Authentication Disc "
src.text += "that is standard issue aboard your vessel may be a target. We recommend removal of this object, and it's storage in a safe "
src.text += "environment. As this may cause panic among the crew, all efforts should be made to keep this information a secret from all but "
src.text += "the most trusted crew-members."
@@ -226,6 +245,7 @@
var/cname = pick(src.changeling_names)
var/orgname1 = pick(src.org_names_1)
var/orgname2 = pick(src.org_names_2)
+ /*
var/changeling_name
var/changeling_job
var/prob_right_dude = rand(prob_correct_person_lower, prob_correct_person_higher)
@@ -245,9 +265,12 @@
changeling_name = src.pick_mob()
else
changeling_name = src.pick_mob()
+ */
src.text += "
We have received a report that a dangerous alien lifeform known only as \"[cname]\" may have infiltrated your crew. "
+ /*
src.text += "Our intelligence suggests a [prob_right_job]% chance that a [changeling_job] on board your station has been replaced by the alien. "
src.text += "Additionally, the report indicates a [prob_right_dude]% chance that [changeling_name] may have been in contact with the lifeform at a recent social gathering. "
+ */
src.text += "These lifeforms are assosciated with the [orgname1] [orgname2] and may be attempting to acquire sensitive materials on their behalf. "
- src.text += "Please take care not to alarm the crew, as [cname] may take advantage of a panic situation."
+ src.text += "Please take care not to alarm the crew, as [cname] may take advantage of a panic situation. Remember, they can be anybody, suspect everybody!"
diff --git a/code/game/gamemodes/malfunction/malfunction.dm b/code/game/gamemodes/malfunction/malfunction.dm
index 34545842cc..3ae4807464 100644
--- a/code/game/gamemodes/malfunction/malfunction.dm
+++ b/code/game/gamemodes/malfunction/malfunction.dm
@@ -65,6 +65,8 @@
if(alert(AI_mind.current,"Do you want to use an alternative sprite for your real core?",,"Yes","No")=="Yes")
AI_mind.current.icon_state = "ai-malf2"
*/
+ if(emergency_shuttle)
+ emergency_shuttle.always_fake_recall = 1
spawn (rand(waittime_l, waittime_h))
send_intercept()
..()
@@ -131,7 +133,11 @@
if (station_captured && !to_nuke_or_not_to_nuke)
return 1
if (is_malf_ai_dead())
- return 1
+ if(config.continous_rounds)
+ if(emergency_shuttle)
+ emergency_shuttle.always_fake_recall = 0
+ else
+ return 1
return ..() //check for shuttle and nuke
@@ -165,7 +171,9 @@
ticker.mode:malf_mode_declared = 1
for(var/datum/mind/AI_mind in ticker.mode:malf_ai)
AI_mind.current.verbs -= /datum/game_mode/malfunction/proc/takeover
- world << sound('sound/AI/aimalf.ogg')
+ for(var/mob/M in player_list)
+ if(!istype(M,/mob/new_player))
+ M << sound('sound/AI/aimalf.ogg')
/datum/game_mode/malfunction/proc/ai_win()
diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm
index 0aa28f8cf0..c3720275ee 100644
--- a/code/game/gamemodes/meteor/meteors.dm
+++ b/code/game/gamemodes/meteor/meteors.dm
@@ -114,7 +114,7 @@
//Prevent meteors from blowing up the singularity's containment.
//Changing emitter and generator ex_act would result in them being bomb and C4 proof.
- if(!istype(A,/obj/machinery/emitter) && \
+ if(!istype(A,/obj/machinery/power/emitter) && \
!istype(A,/obj/machinery/field_generator) && \
prob(15))
@@ -141,7 +141,7 @@
spawn(0)
//Prevent meteors from blowing up the singularity's containment.
//Changing emitter and generator ex_act would result in them being bomb and C4 proof
- if(!istype(A,/obj/machinery/emitter) && \
+ if(!istype(A,/obj/machinery/power/emitter) && \
!istype(A,/obj/machinery/field_generator))
if(--src.hits <= 0)
del(src) //Dont blow up singularity containment if we get stuck there.
diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm
index d9bfca2b0e..a8d629f2fd 100644
--- a/code/game/gamemodes/objective.dm
+++ b/code/game/gamemodes/objective.dm
@@ -295,7 +295,7 @@ datum/objective/hijack
datum/objective/block
- explanation_text = "Do not allow any humans to escape on the shuttle alive."
+ explanation_text = "Do not allow any organic lifeforms to escape on the shuttle alive."
check_completion()
@@ -474,16 +474,26 @@ datum/objective/steal
"a hand teleporter" = /obj/item/weapon/hand_tele,
"an RCD" = /obj/item/weapon/rcd,
"a jetpack" = /obj/item/weapon/tank/jetpack,
- "a captains jumpsuit" = /obj/item/clothing/under/rank/captain,
+ "a captain's jumpsuit" = /obj/item/clothing/under/rank/captain,
"a functional AI" = /obj/item/device/aicard,
"a pair of magboots" = /obj/item/clothing/shoes/magboots,
"the station blueprints" = /obj/item/blueprints,
"a nasa voidsuit" = /obj/item/clothing/suit/space/nasavoid,
"28 moles of plasma (full tank)" = /obj/item/weapon/tank,
+ "a sample of slime extract" = /obj/item/slime_extract,
+ "a piece of corgi meat" = /obj/item/weapon/reagent_containers/food/snacks/meat/corgi,
+ "a research director's jumpsuit" = /obj/item/clothing/under/rank/research_director,
+ "a chief engineer's jumpsuit" = /obj/item/clothing/under/rank/chief_engineer,
+ "a chief medical officer's jumpsuit" = /obj/item/clothing/under/rank/chief_medical_officer,
+ "a head of security's jumpsuit" = /obj/item/clothing/under/rank/head_of_security,
+ "a head of personnel's jumpsuit" = /obj/item/clothing/under/rank/head_of_personnel,
+ "the hypospray" = /obj/item/weapon/reagent_containers/hypospray,
+ "the captain's pinpointer" = /obj/item/weapon/pinpointer,
+ "an ablative armor vest" = /obj/item/clothing/suit/armor/laserproof,
)
var/global/possible_items_special[] = list(
- "nuclear authentication disk" = /obj/item/weapon/disk/nuclear,
+ /*"nuclear authentication disk" = /obj/item/weapon/disk/nuclear,*///Broken with the change to nuke disk making it respawn on z level change.
"nuclear gun" = /obj/item/weapon/gun/energy/gun/nuclear,
"diamond drill" = /obj/item/weapon/pickaxe/diamonddrill,
"bag of holding" = /obj/item/weapon/storage/backpack/holding,
diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm
index a210d856cd..bba325296e 100644
--- a/code/game/gamemodes/revolution/revolution.dm
+++ b/code/game/gamemodes/revolution/revolution.dm
@@ -89,6 +89,8 @@
for(var/datum/mind/rev_mind in head_revolutionaries)
greet_revolutionary(rev_mind)
modePlayer += head_revolutionaries
+ if(emergency_shuttle)
+ emergency_shuttle.always_fake_recall = 1
spawn (rand(waittime_l, waittime_h))
send_intercept()
..()
@@ -165,6 +167,11 @@
//Checks if the round is over//
///////////////////////////////
/datum/game_mode/revolution/check_finished()
+ if(config.continous_rounds)
+ if(finished != 0)
+ if(emergency_shuttle)
+ emergency_shuttle.always_fake_recall = 0
+ return ..()
if(finished != 0)
return 1
else
diff --git a/code/game/gamemodes/sandbox/h_sandbox.dm b/code/game/gamemodes/sandbox/h_sandbox.dm
index 64e418f0ee..439befdc63 100644
--- a/code/game/gamemodes/sandbox/h_sandbox.dm
+++ b/code/game/gamemodes/sandbox/h_sandbox.dm
@@ -144,8 +144,6 @@ datum/hSB
continue
if(istype(O, /obj/item/weapon/melee/energy/sword))
continue
- if(istype(O, /obj/effect/critter))
- continue
if(istype(O, /obj/structure))
continue
selectable += O
diff --git a/code/game/gamemodes/sandbox/sandbox.dm b/code/game/gamemodes/sandbox/sandbox.dm
index 3bace4756e..475c3d22aa 100644
--- a/code/game/gamemodes/sandbox/sandbox.dm
+++ b/code/game/gamemodes/sandbox/sandbox.dm
@@ -15,5 +15,7 @@
M.CanBuild()
return 1
-/datum/game_mode/sandbox/check_finished()
- return 0
+/datum/game_mode/sandbox/post_setup()
+ ..()
+ if(emergency_shuttle)
+ emergency_shuttle.always_fake_recall = 1
diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm
index 474aa85eff..531e3f558d 100644
--- a/code/game/gamemodes/wizard/spellbook.dm
+++ b/code/game/gamemodes/wizard/spellbook.dm
@@ -38,8 +38,10 @@
dat += "
"
dat += "Mastercrafted Armor Set
"
dat += "
"
+ dat += "Staff of Animation
"
+ dat += "
"
if(op)
- dat += "Re-memorize Spells
"
+ dat += "Re-memorize Spells
"
user << browse(dat, "window=radio")
onclose(user, "radio")
return
@@ -54,9 +56,9 @@
if ( src.loc == usr || (in_range(src,usr) && istype(src.loc, /turf)))
usr.set_machine(src)
if(href_list["spell_choice"])
- if(src.uses >= 1 && src.max_uses >=1 && text2num(href_list["spell_choice"]) < 18)
+ if(src.uses >= 1 && src.max_uses >=1 && text2num(href_list["spell_choice"]) < 19)
src.uses--
- var/list/available_spells = list("Magic Missile","Fireball","Disintegrate","Disable Tech","Smoke","Blind","Mind Transfer","Forcewall","Blink","Teleport","Mutate","Ethereal Jaunt","Knock","Summon Guns","Staff of Change","Six Soul Stone Shards and the spell Artificer","Mastercrafted Armor Set")
+ var/list/available_spells = list("Magic Missile","Fireball","Disintegrate","Disable Tech","Smoke","Blind","Mind Transfer","Forcewall","Blink","Teleport","Mutate","Ethereal Jaunt","Knock","Summon Guns","Staff of Change","Six Soul Stone Shards and the spell Artificer","Mastercrafted Armor Set", "Staff of Animation")
var/already_knows = 0
for(var/obj/effect/proc_holder/spell/aspell in usr.spell_list)
if(available_spells[text2num(href_list["spell_choice"])] == aspell.name)
@@ -72,7 +74,7 @@
src.temp = "This spell fires several, slow moving, magic projectiles at nearby targets. If they hit a target, it is paralyzed and takes minor damage."
if ("2")
feedback_add_details("wizard_spell_learned","FB") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
- usr.spell_list += new /obj/effect/proc_holder/spell/targeted/projectile/fireball(usr)
+ usr.spell_list += new /obj/effect/proc_holder/spell/dumbfire/fireball(usr)
src.temp = "This spell fires a fireball in the direction you're facing and does not require wizard garb. Be careful not to fire it at people that are standing next to you."
if ("3")
feedback_add_details("wizard_spell_learned","DG") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
@@ -142,8 +144,13 @@
new /obj/item/clothing/head/helmet/space/rig/wizard(get_turf(usr))
src.temp = "An artefact suit of armor that allows you to cast spells while providing more protection against attacks and the void of space."
src.max_uses--
+ if("18")
+ feedback_add_details("wizard_spell_learned","SA") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
+ new /obj/item/weapon/gun/energy/staff/animate(get_turf(usr))
+ src.temp = "An artefact that spits bolts of life-force which causes objects which are hit by it to animate and come to life! This magic doesn't affect machines."
+ src.max_uses--
- if (href_list["spell_choice"] == "18")
+ if (href_list["spell_choice"] == "19")
var/area/wizard_station/A = locate()
if(usr in A.contents)
src.uses = src.max_uses
diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm
index dec9e7496c..deb4e05d24 100644
--- a/code/game/gamemodes/wizard/wizard.dm
+++ b/code/game/gamemodes/wizard/wizard.dm
@@ -183,6 +183,10 @@
/datum/game_mode/wizard/check_finished()
+
+ if(config.continous_rounds)
+ return ..()
+
var/wizards_alive = 0
for(var/datum/mind/wizard in wizards)
if(!istype(wizard.current,/mob/living/carbon))
@@ -198,6 +202,7 @@
return 1
+
/datum/game_mode/wizard/declare_completion()
if(finished)
feedback_set_details("round_end_result","loss - wizard killed")
diff --git a/code/game/jobs/access.dm b/code/game/jobs/access.dm
index ac96aa1ce1..deff61f50a 100644
--- a/code/game/jobs/access.dm
+++ b/code/game/jobs/access.dm
@@ -127,15 +127,17 @@
else if(istype(M, /mob/living/carbon/monkey) || istype(M, /mob/living/carbon/alien/humanoid))
var/mob/living/carbon/george = M
//they can only hold things :(
- if(george.get_active_hand() && (istype(george.get_active_hand(), /obj/item/weapon/card/id) || istype(george.get_active_hand(), /obj/item/device/pda)) && src.check_access(george.get_active_hand()))
+ if(src.check_access(george.get_active_hand()))
return 1
return 0
-/obj/proc/check_access(obj/item/weapon/card/id/I)
+/obj/item/proc/GetAccess()
+ return list()
- if (istype(I, /obj/item/device/pda))
- var/obj/item/device/pda/pda = I
- I = pda.id
+/obj/item/proc/GetID()
+ return null
+
+/obj/proc/check_access(obj/item/I)
if(!src.req_access && !src.req_one_access) //no requirements
return 1
@@ -145,14 +147,14 @@
var/list/L = src.req_access
if(!L.len && (!src.req_one_access || !src.req_one_access.len)) //no requirements
return 1
- if(!I || !istype(I, /obj/item/weapon/card/id) || !I.access) //not ID or no access
+ if(!I)
return 0
for(var/req in src.req_access)
- if(!(req in I.access)) //doesn't have this access
+ if(!(req in I.GetAccess())) //doesn't have this access
return 0
if(src.req_one_access && src.req_one_access.len)
for(var/req in src.req_one_access)
- if(req in I.access) //has an access from the single access list
+ if(req in I.GetAccess()) //has an access from the single access list
return 1
return 0
return 1
@@ -174,92 +176,6 @@
return 0
return 1
-
-/proc/get_access(job)
- switch(job)
- if("Geneticist")
- return list(access_medical, access_morgue, access_genetics)
- if("Station Engineer")
- return list(access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks, access_construction)
- if("Assistant")
- if(config.assistant_maint)
- return list(access_maint_tunnels)
- else
- return list()
- if("Chaplain")
- return list(access_morgue, access_chapel_office, access_crematorium)
- if("Detective")
- return list(access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_court)
- if("Medical Doctor")
- return list(access_medical, access_morgue, access_surgery, access_virology)
- if("Botanist") // -- TLE
- return list(access_hydroponics, access_morgue) // Removed tox and chem access because STOP PISSING OFF THE CHEMIST GUYS // //Removed medical access because WHAT THE FUCK YOU AREN'T A DOCTOR YOU GROW WHEAT //Given Morgue access because they have a viable means of cloning.
- if("Librarian") // -- TLE
- return list(access_library)
- if("Lawyer") //Muskets 160910
- return list(access_lawyer, access_court)
- if("Captain")
- return get_all_accesses()
- if("Security Officer")
- return list(access_security, access_sec_doors, access_brig, access_court, access_maint_tunnels)
- if("Warden")
- return list(access_security, access_sec_doors, access_brig, access_armory, access_court, access_maint_tunnels)
- if("Scientist")
- return list(access_tox, access_tox_storage, access_research, access_xenobiology)
- if("Head of Security")
- return list(access_medical, access_morgue, access_tox, access_tox_storage, access_chemistry, access_genetics, access_court,
- access_teleporter, access_heads, access_tech_storage, access_security, access_sec_doors, access_brig, access_atmospherics,
- access_maint_tunnels, access_bar, access_janitor, access_kitchen, access_robotics, access_armory, access_hydroponics,
- access_theatre, access_research, access_hos, access_RC_announce, access_forensics_lockers, access_keycard_auth)
- if("Head of Personnel")
- return list(access_security, access_sec_doors, access_brig, access_court, access_forensics_lockers,
- access_tox, access_tox_storage, access_chemistry, access_medical, access_genetics, access_engine,
- access_emergency_storage, access_change_ids, access_ai_upload, access_eva, access_heads,
- access_all_personal_lockers, access_tech_storage, access_maint_tunnels, access_bar, access_janitor,
- access_crematorium, access_kitchen, access_robotics, 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)
- if("Atmospheric Technician")
- return list(access_atmospherics, access_maint_tunnels, access_emergency_storage, access_construction)
- if("Bartender")
- return list(access_bar)
- if("Chemist")
- return list(access_medical, access_chemistry)
- if("Janitor")
- return list(access_janitor, access_maint_tunnels)
- if("Clown")
- return list(access_clown, access_theatre)
- if("Mime")
- return list(access_mime, access_theatre)
- if("Chef")
- return list(access_kitchen, access_morgue)
- if("Roboticist")
- return list(access_robotics, access_tech_storage, access_morgue) //As a job that handles so many corpses, it makes sense for them to have morgue access.
- if("Cargo Technician")
- return list(access_maint_tunnels, access_cargo, access_cargo_bot, access_mailsorting)
- if("Shaft Miner")
- return list(access_mining, access_mint, access_mining_station)
- if("Quartermaster")
- return list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mint, access_mining, access_mining_station)
- if("Chief Engineer")
- return list(access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels,
- access_teleporter, access_external_airlocks, access_atmospherics, access_emergency_storage, access_eva,
- access_heads, access_ai_upload, access_construction, access_robotics,
- access_mint, access_ce, access_RC_announce, access_keycard_auth, access_tcomsat)
- if("Research Director")
- return list(access_rd, access_heads, access_tox, access_genetics,
- access_tox_storage, access_teleporter,
- access_research, access_robotics, access_xenobiology,
- access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway)
- if("Virologist")
- return list(access_medical, access_virology)
- if("Chief Medical Officer")
- return list(access_medical, access_morgue, access_genetics, access_heads,
- access_chemistry, access_virology, access_cmo, access_surgery, access_RC_announce,
- access_keycard_auth)
- else
- return list()
-
/proc/get_centcom_access(job)
switch(job)
if("VIP Guest")
@@ -285,12 +201,12 @@
return list(access_security, access_sec_doors, access_brig, access_armory, access_forensics_lockers, access_court,
access_medical, access_genetics, access_morgue, access_rd,
access_tox, access_tox_storage, access_chemistry, access_engine, access_engine_equip, access_maint_tunnels,
- access_external_airlocks, access_emergency_storage, access_change_ids, access_ai_upload,
+ access_external_airlocks, access_change_ids, access_ai_upload,
access_teleporter, access_eva, access_heads, access_captain, access_all_personal_lockers,
access_tech_storage, access_chapel_office, access_atmospherics, access_kitchen,
- access_bar, access_janitor, access_crematorium, access_robotics, access_cargo, access_cargo_bot, access_construction,
- access_hydroponics, access_library, access_manufacturing, access_lawyer, access_virology, access_cmo, access_qm, access_clown, access_mime, access_surgery,
- access_theatre, access_research, access_mining, access_mailsorting, access_mint_vault, access_mint,
+ access_bar, access_janitor, access_crematorium, access_robotics, access_cargo, access_construction,
+ access_hydroponics, access_library, access_lawyer, access_virology, access_cmo, access_qm, access_clown, access_mime, access_surgery,
+ access_theatre, access_research, access_mining, access_mailsorting,
access_heads_vault, access_mining_station, access_xenobiology, access_ce, access_hop, access_hos, access_RC_announce,
access_keycard_auth, access_tcomsat, access_gateway)
@@ -309,15 +225,15 @@
if(2) //medbay
return list(access_medical, access_genetics, access_morgue, access_chemistry, access_virology, access_surgery, access_cmo)
if(3) //research
- return list(access_research, access_tox, access_tox_storage, access_xenobiology, access_rd)
+ return list(access_research, access_tox, access_tox_storage, access_robotics, access_xenobiology, access_rd)
if(4) //engineering and maintenance
- return list(access_maint_tunnels, access_engine, access_engine_equip, access_external_airlocks, access_tech_storage, access_atmospherics, access_construction, access_robotics, access_ce)
+ return list(access_construction, access_maint_tunnels, access_engine, access_engine_equip, access_external_airlocks, access_tech_storage, access_atmospherics, access_ce)
if(5) //command
- return list(access_heads, access_change_ids, access_ai_upload, access_teleporter, access_eva, access_all_personal_lockers, access_heads_vault, access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway, access_hop, access_captain)
+ return list(access_heads, access_RC_announce, access_keycard_auth, access_change_ids, access_ai_upload, access_teleporter, access_eva, access_tcomsat, access_gateway, access_all_personal_lockers, access_heads_vault, access_hop, access_captain)
if(6) //station general
return list(access_kitchen,access_bar, access_hydroponics, access_janitor, access_chapel_office, access_crematorium, access_library, access_theatre, access_lawyer, access_clown, access_mime)
if(7) //supply
- return list(access_cargo, access_cargo_bot, access_mailsorting, access_qm, access_mining, access_mining_station)
+ return list(access_mailsorting, access_mining, access_mining_station, access_cargo, access_qm)
/proc/get_region_accesses_name(var/code)
switch(code)
@@ -352,7 +268,7 @@
if(access_court)
return "Courtroom"
if(access_forensics_lockers)
- return "Detective's Office"
+ return "Forensics"
if(access_medical)
return "Medical"
if(access_genetics)
@@ -360,13 +276,13 @@
if(access_morgue)
return "Morgue"
if(access_tox)
- return "Research Lab"
+ return "R&D Lab"
if(access_tox_storage)
- return "Toxins Storage"
+ return "Toxins Lab"
if(access_chemistry)
return "Chemistry Lab"
if(access_rd)
- return "RD Private"
+ return "Research Director"
if(access_bar)
return "Bar"
if(access_janitor)
@@ -374,7 +290,7 @@
if(access_engine)
return "Engineering"
if(access_engine_equip)
- return "APCs"
+ return "Power Equipment"
if(access_maint_tunnels)
return "Maintenance"
if(access_external_airlocks)
@@ -392,7 +308,7 @@
if(access_heads)
return "Bridge"
if(access_captain)
- return "Captain Private"
+ return "Captain"
if(access_all_personal_lockers)
return "Personal Lockers"
if(access_chapel_office)
@@ -420,9 +336,9 @@
if(access_virology)
return "Virology"
if(access_cmo)
- return "CMO Private"
+ return "Chief Medical Officer"
if(access_qm)
- return "Quartermaster's Office"
+ return "Quartermaster"
/* if(access_clown)
return "HONK! Access"
if(access_mime)
@@ -440,7 +356,7 @@
if(access_mining_office)
return "Mining Office"
if(access_mailsorting)
- return "Delivery Office"
+ return "Cargo Office"
if(access_mint)
return "Mint"
if(access_mint_vault)
@@ -448,15 +364,15 @@
if(access_heads_vault)
return "Main Vault"
if(access_mining_station)
- return "Mining Station EVA"
+ return "Mining EVA"
if(access_xenobiology)
return "Xenobiology Lab"
if(access_hop)
- return "HoP Private"
+ return "Head of Personnel"
if(access_hos)
- return "HoS Private"
+ return "Head of Security"
if(access_ce)
- return "CE Private"
+ return "Chief Engineer"
if(access_RC_announce)
return "RC Announcements"
if(access_keycard_auth)
@@ -492,8 +408,8 @@
/proc/get_all_jobs()
return list("Assistant", "Captain", "Head of Personnel", "Bartender", "Chef", "Botanist", "Quartermaster", "Cargo Technician",
"Shaft Miner", /*"Clown", "Mime", */"Janitor", "Librarian", "Lawyer", "Chaplain", "Chief Engineer", "Station Engineer",
- "Atmospheric Technician", "Roboticist", "Chief Medical Officer", "Medical Doctor", "Chemist", "Geneticist", "Virologist",
- "Research Director", "Scientist", "Head of Security", "Warden", "Detective", "Security Officer")
+ "Atmospheric Technician", "Chief Medical Officer", "Medical Doctor", "Chemist", "Geneticist", "Virologist",
+ "Research Director", "Scientist", "Roboticist", "Head of Security", "Warden", "Detective", "Security Officer")
/proc/get_all_centcom_jobs()
return list("VIP Guest","Custodian","Thunderdome Overseer","Intel Officer","Medical Officer","Death Commando","Research Officer","BlackOps Commander","Supreme Commander")
diff --git a/code/game/jobs/job/assistant.dm b/code/game/jobs/job/assistant.dm
index b5b6f03970..3028502420 100644
--- a/code/game/jobs/job/assistant.dm
+++ b/code/game/jobs/job/assistant.dm
@@ -7,13 +7,17 @@
spawn_positions = -1
supervisors = "absolutely everyone"
selection_color = "#dddddd"
+ access = list() //See /datum/job/assistant/get_access()
+ minimal_access = list() //See /datum/job/assistant/get_access()
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.equip_to_slot_or_del(new /obj/item/clothing/under/color/grey(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
- 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
+/datum/job/assistant/equip(var/mob/living/carbon/human/H)
+ if(!H) return 0
+ H.equip_to_slot_or_del(new /obj/item/clothing/under/color/grey(H), slot_w_uniform)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
+ return 1
+
+/datum/job/assistant/get_access()
+ if(config.assistant_maint)
+ return list(access_maint_tunnels)
+ else
+ return list()
\ No newline at end of file
diff --git a/code/game/jobs/job/captain.dm b/code/game/jobs/job/captain.dm
index 8ca6a5e49a..09bfdd280d 100644
--- a/code/game/jobs/job/captain.dm
+++ b/code/game/jobs/job/captain.dm
@@ -9,6 +9,8 @@
selection_color = "#ccccff"
idtype = /obj/item/weapon/card/id/gold
req_admin_notify = 1
+ access = list() //See get_access()
+ minimal_access = list() //See get_access()
equip(var/mob/living/carbon/human/H)
@@ -28,15 +30,18 @@
H.equip_to_slot_or_del(new /obj/item/clothing/head/caphat(H), slot_head)
H.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(H), slot_glasses)
if(H.backbag == 1)
- H.equip_to_slot_or_del(new /obj/item/weapon/storage/id_kit(H), slot_r_hand)
+ H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/ids(H), slot_r_hand)
else
- H.equip_to_slot_or_del(new /obj/item/weapon/storage/id_kit(H.back), slot_in_backpack)
+ H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/ids(H.back), slot_in_backpack)
var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(H)
L.imp_in = H
L.implanted = 1
world << "[H.real_name] is the captain!"
return 1
+ get_access()
+ return get_all_accesses()
+
/datum/job/hop
@@ -50,6 +55,18 @@
selection_color = "#ddddff"
idtype = /obj/item/weapon/card/id/silver
req_admin_notify = 1
+ access = list(access_security, access_sec_doors, access_brig, access_court, access_forensics_lockers,
+ access_medical, access_engine, access_change_ids, access_ai_upload, access_eva, access_heads,
+ 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_forensics_lockers,
+ access_medical, access_engine, access_change_ids, access_ai_upload, access_eva, access_heads,
+ 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)
equip(var/mob/living/carbon/human/H)
@@ -64,7 +81,7 @@
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/hop(H), slot_belt)
if(H.backbag == 1)
- H.equip_to_slot_or_del(new /obj/item/weapon/storage/id_kit(H), slot_r_hand)
+ H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/ids(H), slot_r_hand)
else
- H.equip_to_slot_or_del(new /obj/item/weapon/storage/id_kit(H.back), slot_in_backpack)
- return 1
+ H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/ids(H.back), slot_in_backpack)
+ return 1
\ No newline at end of file
diff --git a/code/game/jobs/job/civilian.dm b/code/game/jobs/job/civilian.dm
index fc840b1871..36d240dbd0 100644
--- a/code/game/jobs/job/civilian.dm
+++ b/code/game/jobs/job/civilian.dm
@@ -8,6 +8,8 @@
spawn_positions = 1
supervisors = "the head of personnel"
selection_color = "#dddddd"
+ access = list(access_bar)
+ minimal_access = list(access_bar)
equip(var/mob/living/carbon/human/H)
@@ -48,6 +50,8 @@
spawn_positions = 1
supervisors = "the head of personnel"
selection_color = "#dddddd"
+ access = list(access_kitchen, access_morgue)
+ minimal_access = list(access_kitchen, access_morgue)
equip(var/mob/living/carbon/human/H)
@@ -74,6 +78,8 @@
spawn_positions = 2
supervisors = "the head of personnel"
selection_color = "#dddddd"
+ access = list(access_hydroponics, access_morgue) // Removed tox and chem access because STOP PISSING OFF THE CHEMIST GUYS // //Removed medical access because WHAT THE FUCK YOU AREN'T A DOCTOR YOU GROW WHEAT //Given Morgue access because they have a viable means of cloning.
+ minimal_access = list(access_hydroponics, access_morgue) // Removed tox and chem access because STOP PISSING OFF THE CHEMIST GUYS // //Removed medical access because WHAT THE FUCK YOU AREN'T A DOCTOR YOU GROW WHEAT //Given Morgue access because they have a viable means of cloning.
equip(var/mob/living/carbon/human/H)
@@ -102,15 +108,17 @@
spawn_positions = 1
supervisors = "the head of personnel"
selection_color = "#dddddd"
+ access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mint, access_mining, access_mining_station)
+ minimal_access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mint, access_mining, access_mining_station)
equip(var/mob/living/carbon/human/H)
if(!H) return 0
- H.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/qm(H), slot_ears)
+ H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_cargo(H), slot_ears)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/cargo(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/quartermaster(H), slot_belt)
- H.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(H), slot_gloves)
+// H.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(H), slot_gloves)
H.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(H), slot_glasses)
H.equip_to_slot_or_del(new /obj/item/weapon/clipboard(H), slot_l_hand)
if(H.backbag == 1)
@@ -130,6 +138,8 @@
spawn_positions = 2
supervisors = "the quartermaster and the head of personnel"
selection_color = "#dddddd"
+ access = list(access_maint_tunnels, access_cargo, access_cargo_bot, access_mailsorting)
+ minimal_access = list(access_maint_tunnels, access_cargo, access_cargo_bot, access_mailsorting)
equip(var/mob/living/carbon/human/H)
@@ -138,7 +148,7 @@
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/cargotech(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/cargo(H), slot_belt)
- H.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(H), slot_gloves)
+// H.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(H), slot_gloves)
if(H.backbag == 1)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand)
else
@@ -156,11 +166,13 @@
spawn_positions = 3
supervisors = "the quartermaster and the head of personnel"
selection_color = "#dddddd"
+ access = list(access_mining, access_mint, access_mining_station, access_mailsorting)
+ minimal_access = list(access_mining, access_mint, access_mining_station, access_mailsorting)
equip(var/mob/living/carbon/human/H)
if(!H) return 0
- H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_mine (H), slot_ears)
+ H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_cargo (H), slot_ears)
switch(H.backbag)
if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/industrial(H), slot_back)
if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_eng(H), slot_back)
@@ -168,15 +180,15 @@
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/miner(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/device/pda/shaftminer(H), slot_belt)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
- H.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(H), slot_gloves)
+// H.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(H), slot_gloves)
if(H.backbag == 1)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(H), slot_r_hand)
H.equip_to_slot_or_del(new /obj/item/weapon/crowbar(H), slot_l_hand)
- H.equip_to_slot_or_del(new /obj/item/weapon/storage/satchel(H), slot_l_store)
+ H.equip_to_slot_or_del(new /obj/item/weapon/storage/bag/ore(H), slot_l_store)
else
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(H.back), slot_in_backpack)
H.equip_to_slot_or_del(new /obj/item/weapon/crowbar(H), slot_in_backpack)
- H.equip_to_slot_or_del(new /obj/item/weapon/storage/satchel(H), slot_in_backpack)
+ H.equip_to_slot_or_del(new /obj/item/weapon/storage/bag/ore(H), slot_in_backpack)
return 1
@@ -192,6 +204,8 @@
spawn_positions = 1
supervisors = "the head of personnel"
selection_color = "#dddddd"
+ access = list(access_clown, access_theatre)
+ minimal_access = list(access_clown, access_theatre)
equip(var/mob/living/carbon/human/H)
@@ -206,7 +220,8 @@
H.equip_to_slot_or_del(new /obj/item/weapon/bikehorn(H), slot_in_backpack)
H.equip_to_slot_or_del(new /obj/item/weapon/stamp/clown(H), slot_in_backpack)
H.equip_to_slot_or_del(new /obj/item/toy/crayon/rainbow(H), slot_in_backpack)
- H.equip_to_slot_or_del(new /obj/item/weapon/storage/crayonbox(H), slot_in_backpack)
+ H.equip_to_slot_or_del(new /obj/item/weapon/storage/fancy/crayons(H), slot_in_backpack)
+ H.equip_to_slot_or_del(new /obj/item/toy/waterflower(H), slot_in_backpack)
H.mutations.Add(CLUMSY)
return 1
@@ -221,6 +236,8 @@
spawn_positions = 1
supervisors = "the head of personnel"
selection_color = "#dddddd"
+ access = list(access_mime, access_theatre)
+ minimal_access = list(access_mime, access_theatre)
equip(var/mob/living/carbon/human/H)
@@ -260,6 +277,8 @@
spawn_positions = 1
supervisors = "the head of personnel"
selection_color = "#dddddd"
+ access = list(access_janitor, access_maint_tunnels)
+ minimal_access = list(access_janitor, access_maint_tunnels)
equip(var/mob/living/carbon/human/H)
@@ -271,7 +290,7 @@
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/key(H), slot_l_store) return 1
@@ -285,6 +304,8 @@
spawn_positions = 1
supervisors = "the head of personnel"
selection_color = "#dddddd"
+ access = list(access_library)
+ minimal_access = list(access_library)
equip(var/mob/living/carbon/human/H)
@@ -311,6 +332,8 @@ var/global/lawyer = 0//Checks for another lawyer
spawn_positions = 2
supervisors = "the head of personnel"
selection_color = "#dddddd"
+ access = list(access_lawyer, access_court, access_sec_doors)
+ minimal_access = list(access_lawyer, access_court, access_sec_doors)
equip(var/mob/living/carbon/human/H)
diff --git a/code/game/jobs/job/civilian_chaplain.dm b/code/game/jobs/job/civilian_chaplain.dm
index d81e06eee3..859eaffe95 100644
--- a/code/game/jobs/job/civilian_chaplain.dm
+++ b/code/game/jobs/job/civilian_chaplain.dm
@@ -8,6 +8,8 @@
spawn_positions = 1
supervisors = "the head of personnel"
selection_color = "#dddddd"
+ access = list(access_morgue, access_chapel_office, access_crematorium)
+ minimal_access = list(access_morgue, access_chapel_office, access_crematorium)
equip(var/mob/living/carbon/human/H)
diff --git a/code/game/jobs/job/engineering.dm b/code/game/jobs/job/engineering.dm
index 3b76e5c225..f89ba4e217 100644
--- a/code/game/jobs/job/engineering.dm
+++ b/code/game/jobs/job/engineering.dm
@@ -9,6 +9,14 @@
selection_color = "#ffeeaa"
idtype = /obj/item/weapon/card/id/silver
req_admin_notify = 1
+ access = list(access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels,
+ access_teleporter, access_external_airlocks, access_atmospherics, access_emergency_storage, access_eva,
+ access_heads, access_construction, access_sec_doors,
+ access_ce, access_RC_announce, access_keycard_auth, access_tcomsat)
+ minimal_access = list(access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels,
+ access_teleporter, access_external_airlocks, access_atmospherics, access_emergency_storage, access_eva,
+ access_heads, access_construction, access_sec_doors,
+ access_ce, access_RC_announce, access_keycard_auth, access_tcomsat)
equip(var/mob/living/carbon/human/H)
@@ -41,6 +49,9 @@
spawn_positions = 5
supervisors = "the chief engineer"
selection_color = "#fff5cc"
+ access = list(access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks, access_construction)
+ minimal_access = list(access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks, access_construction)
+
equip(var/mob/living/carbon/human/H)
@@ -73,6 +84,8 @@
spawn_positions = 2
supervisors = "the chief engineer"
selection_color = "#fff5cc"
+ access = list(access_atmospherics, access_maint_tunnels, access_emergency_storage, access_construction)
+ minimal_access = list(access_atmospherics, access_maint_tunnels, access_emergency_storage, access_construction)
equip(var/mob/living/carbon/human/H)
@@ -90,35 +103,4 @@
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(H), slot_r_hand)
else
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(H.back), slot_in_backpack)
- return 1
-
-
-
-/datum/job/roboticist
- title = "Roboticist"
- flag = ROBOTICIST
- department_flag = ENGSEC
- faction = "Station"
- total_positions = 2
- spawn_positions = 2
- supervisors = "the chief engineer and research director"
- selection_color = "#fff5cc"
-
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_rob(H), slot_ears)
- switch(H.backbag)
- if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back)
- if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_norm(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/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/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
\ No newline at end of file
diff --git a/code/game/jobs/job/job.dm b/code/game/jobs/job/job.dm
index e3995483ff..6cb0e2366a 100644
--- a/code/game/jobs/job/job.dm
+++ b/code/game/jobs/job/job.dm
@@ -3,6 +3,10 @@
//The name of the job
var/title = "NOPE"
+ //Job access. The use of minimal_access or access is determined by a config setting: config.jobs_have_minimal_access
+ var/minimal_access = list() //Useful for servers which prefer to only have access given to the places a job absolutely needs (Larger server population)
+ var/access = list() //Useful for servers which either have fewer players, so each person needs to fill more than one role, or servers which like to give more access, so players can't hide forever in their super secure departments (I'm looking at you, chemistry!)
+
//Bitflags for the job
var/flag = 0
var/department_flag = 0
@@ -36,3 +40,12 @@
/datum/job/proc/equip(var/mob/living/carbon/human/H)
return 1
+
+/datum/job/proc/get_access()
+ if(!config) //Needed for robots.
+ return src.minimal_access
+
+ if(config.jobs_have_minimal_access)
+ return src.minimal_access
+ else
+ return src.access
diff --git a/code/game/jobs/job/medical.dm b/code/game/jobs/job/medical.dm
index b4cad5555b..406c9aca2c 100644
--- a/code/game/jobs/job/medical.dm
+++ b/code/game/jobs/job/medical.dm
@@ -9,6 +9,12 @@
selection_color = "#ffddf0"
idtype = /obj/item/weapon/card/id/silver
req_admin_notify = 1
+ access = list(access_medical, access_morgue, access_genetics, access_heads,
+ access_chemistry, access_virology, access_cmo, access_surgery, access_RC_announce,
+ access_keycard_auth, access_sec_doors)
+ minimal_access = list(access_medical, access_morgue, access_genetics, access_heads,
+ access_chemistry, access_virology, access_cmo, access_surgery, access_RC_announce,
+ access_keycard_auth, access_sec_doors)
equip(var/mob/living/carbon/human/H)
@@ -41,8 +47,10 @@
spawn_positions = 3
supervisors = "the chief medical officer"
selection_color = "#ffeef0"
- alt_titles = list("Surgeon", "Emergency Physician", "Virologist")
+ access = list(access_medical, access_morgue, access_surgery)
+ minimal_access = list(access_medical, access_morgue, access_surgery)
+ alt_titles = list("Surgeon", "Emergency Physician", "Virologist")
equip(var/mob/living/carbon/human/H)
if(!H) return 0
@@ -82,7 +90,7 @@
-//Chemist is a medical job damnit //YEAH FUCK YOU SCIENCE -Pete
+//Chemist is a medical job damnit //YEAH FUCK YOU SCIENCE -Pete //Guys, behave -Erro
/datum/job/chemist
title = "Chemist"
flag = CHEMIST
@@ -92,6 +100,8 @@
spawn_positions = 2
supervisors = "the chief medical officer"
selection_color = "#ffeef0"
+ access = list(access_medical, access_chemistry)
+ minimal_access = list(access_medical, access_chemistry)
equip(var/mob/living/carbon/human/H)
@@ -118,6 +128,8 @@
spawn_positions = 2
supervisors = "the chief medical officer and research director"
selection_color = "#ffeef0"
+ access = list(access_medical, access_morgue, access_genetics, access_research)
+ minimal_access = list(access_medical, access_morgue, access_genetics, access_research)
equip(var/mob/living/carbon/human/H)
@@ -145,6 +157,8 @@
spawn_positions = 1
supervisors = "the chief medical officer"
selection_color = "#ffeef0"
+ access = list(access_medical, access_virology)
+ minimal_access = list(access_medical, access_virology)
equip(var/mob/living/carbon/human/H)
diff --git a/code/game/jobs/job/science.dm b/code/game/jobs/job/science.dm
index c9292feedb..573c1a9e8d 100644
--- a/code/game/jobs/job/science.dm
+++ b/code/game/jobs/job/science.dm
@@ -9,6 +9,14 @@
selection_color = "#ffddff"
idtype = /obj/item/weapon/card/id/silver
req_admin_notify = 1
+ access = list(access_rd, access_heads, access_tox, access_genetics, access_morgue,
+ access_tox_storage, access_teleporter, access_sec_doors,
+ access_research, access_robotics, access_xenobiology, access_ai_upload,
+ access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway)
+ minimal_access = list(access_rd, access_heads, access_tox, access_genetics, access_morgue,
+ access_tox_storage, access_teleporter, access_sec_doors,
+ access_research, access_robotics, access_xenobiology, access_ai_upload,
+ access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway)
equip(var/mob/living/carbon/human/H)
@@ -36,8 +44,10 @@
spawn_positions = 3
supervisors = "the research director"
selection_color = "#ffeeff"
- alt_titles = list("Xenoarcheologist", "Anomalist", "Plasma Researcher", "Xenobiologist")
+ access = list(access_tox, access_tox_storage, access_research, access_xenobiology)
+ minimal_access = list(access_tox, access_tox_storage, access_research, access_xenobiology)
+ alt_titles = list("Xenoarcheologist", "Anomalist", "Plasma Researcher", "Xenobiologist")
equip(var/mob/living/carbon/human/H)
if(!H) return 0
@@ -46,6 +56,37 @@
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/toxins(H), slot_belt)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/labcoat/science(H), slot_wear_suit)
+ 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
+
+
+
+/datum/job/roboticist
+ title = "Roboticist"
+ flag = ROBOTICIST
+ department_flag = MEDSCI
+ faction = "Station"
+ total_positions = 2
+ spawn_positions = 1
+ supervisors = "research director"
+ selection_color = "#ffeeff"
+ access = list(access_robotics, access_tech_storage, access_morgue, access_research) //As a job that handles so many corpses, it makes sense for them to have morgue access.
+ minimal_access = list(access_robotics, access_tech_storage, access_morgue, access_research) //As a job that handles so many corpses, it makes sense for them to have morgue access.
+
+ equip(var/mob/living/carbon/human/H)
+ if(!H) return 0
+ H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sci(H), slot_ears)
+ if(H.backbag == 2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back)
+ if(H.backbag == 3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_norm(H), slot_back)
+ 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/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
diff --git a/code/game/jobs/job/security.dm b/code/game/jobs/job/security.dm
index 2340459ab4..0a3e4d695a 100644
--- a/code/game/jobs/job/security.dm
+++ b/code/game/jobs/job/security.dm
@@ -9,6 +9,14 @@
selection_color = "#ffdddd"
idtype = /obj/item/weapon/card/id/silver
req_admin_notify = 1
+ access = list(access_security, access_sec_doors, access_brig, access_armory, access_court,
+ access_forensics_lockers, access_morgue, access_maint_tunnels, access_all_personal_lockers,
+ access_research, access_engine, access_mining, access_medical, access_construction, access_mailsorting,
+ access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway)
+ minimal_access = list(access_security, access_sec_doors, access_brig, access_armory, access_court,
+ access_forensics_lockers, access_morgue, access_maint_tunnels, access_all_personal_lockers,
+ access_research, access_engine, access_mining, access_medical, access_construction, access_mailsorting,
+ access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway)
equip(var/mob/living/carbon/human/H)
@@ -47,6 +55,8 @@
spawn_positions = 1
supervisors = "the head of security"
selection_color = "#ffeeee"
+ access = list(access_security, access_sec_doors, access_brig, access_armory, access_court)
+ minimal_access = list(access_security, access_sec_doors, access_brig, access_armory, access_court)
equip(var/mob/living/carbon/human/H)
@@ -82,8 +92,10 @@
spawn_positions = 1
supervisors = "the head of security"
selection_color = "#ffeeee"
- alt_titles = list("Forensic Technician")
+ access = list(access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_court)
+ minimal_access = list(access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_court)
+ alt_titles = list("Forensic Technician")
equip(var/mob/living/carbon/human/H)
if(!H) return 0
@@ -128,6 +140,8 @@
spawn_positions = 5
supervisors = "the head of security"
selection_color = "#ffeeee"
+ access = list(access_security, access_sec_doors, access_brig, access_court)
+ minimal_access = list(access_security, access_sec_doors, access_brig, access_court)
equip(var/mob/living/carbon/human/H)
diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm
index 29f2420b50..29fe36dc74 100644
--- a/code/game/jobs/job_controller.dm
+++ b/code/game/jobs/job_controller.dm
@@ -367,13 +367,13 @@ var/global/datum/controller/occupations/job_master
return
else
C = new job.idtype(H)
+ C.access = job.get_access()
else
C = new /obj/item/weapon/card/id(H)
if(C)
C.registered_name = H.real_name
C.assignment = title
C.name = "[C.registered_name]'s ID Card ([C.assignment])"
- C.access = get_access(rank)
H.equip_to_slot_or_del(C, slot_wear_id)
/* if(prob(50))
H.equip_to_slot_or_del(new /obj/item/weapon/pen(H), slot_r_store)
@@ -383,7 +383,7 @@ var/global/datum/controller/occupations/job_master
if(locate(/obj/item/device/pda,H))//I bet this could just use locate. It can --SkyMarshal
var/obj/item/device/pda/pda = locate(/obj/item/device/pda,H)
pda.owner = H.real_name
- pda.ownjob = H.wear_id.assignment
+ pda.ownjob = C.assignment
pda.name = "PDA-[H.real_name] ([pda.ownjob])"
return 1
diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm
index 9994d29a78..5c53d4ce8b 100644
--- a/code/game/machinery/Sleeper.dm
+++ b/code/game/machinery/Sleeper.dm
@@ -175,9 +175,9 @@
user << "\blue The sleeper is already occupied!"
return
- for(var/mob/living/carbon/metroid/M in range(1,G.affecting))
+ for(var/mob/living/carbon/slime/M in range(1,G.affecting))
if(M.Victim == G.affecting)
- usr << "[G.affecting.name] will not fit into the sleeper because they have a Metroid latched onto their head."
+ usr << "[G.affecting.name] will not fit into the sleeper because they have a slime latched onto their head."
return
visible_message("[user] starts putting [G.affecting.name] into the sleeper.", 3)
@@ -230,7 +230,13 @@
del(src)
return
return
-
+ emp_act(severity)
+ if(stat & (BROKEN|NOPOWER))
+ ..(severity)
+ return
+ if(occupant)
+ go_out()
+ ..(severity)
alter_health(mob/living/M as mob)
if (M.health > 0)
@@ -267,52 +273,52 @@
proc/inject_inap(mob/living/user as mob)
- if(src.occupant)
+ if(src.occupant && src.occupant.reagents)
if(src.occupant.reagents.get_reagent_amount("inaprovaline") + 30 <= 60)
src.occupant.reagents.add_reagent("inaprovaline", 30)
user << text("Occupant now has [] units of Inaprovaline in his/her bloodstream.", src.occupant.reagents.get_reagent_amount("inaprovaline"))
else
- user << "No occupant!"
+ user << "There's no occupant in the sleeper or the subject rejects the chemicals!"
return
proc/inject_stox(mob/living/user as mob)
- if(src.occupant)
+ if(src.occupant && src.occupant.reagents)
if(src.occupant.reagents.get_reagent_amount("stoxin") + 20 <= 40)
src.occupant.reagents.add_reagent("stoxin", 20)
user << text("Occupant now has [] units of soporifics in his/her bloodstream.", src.occupant.reagents.get_reagent_amount("stoxin"))
else
- user << "No occupant!"
+ user << "There's no occupant in the sleeper or the subject rejects the chemicals!"
return
proc/inject_dermaline(mob/living/user as mob)
- if (src.occupant)
+ if(src.occupant && src.occupant.reagents)
if(src.occupant.reagents.get_reagent_amount("dermaline") + 20 <= 40)
src.occupant.reagents.add_reagent("dermaline", 20)
user << text("Occupant now has [] units of Dermaline in his/her bloodstream.", src.occupant.reagents.get_reagent_amount("dermaline"))
else
- user << "No occupant!"
+ user << "There's no occupant in the sleeper or the subject rejects the chemicals!"
return
proc/inject_bicaridine(mob/living/user as mob)
- if(src.occupant)
+ if(src.occupant && src.occupant.reagents)
if(src.occupant.reagents.get_reagent_amount("bicaridine") + 10 <= 20)
src.occupant.reagents.add_reagent("bicaridine", 10)
user << text("Occupant now has [] units of Bicaridine in his/her bloodstream.", src.occupant.reagents.get_reagent_amount("bicaridine"))
else
- user << "No occupant!"
+ user << "There's no occupant in the sleeper or the subject rejects the chemicals!"
return
proc/inject_dexalin(mob/living/user as mob)
- if(src.occupant)
+ if(src.occupant && src.occupant.reagents)
if(src.occupant.reagents.get_reagent_amount("dexalin") + 20 <= 40)
src.occupant.reagents.add_reagent("dexalin", 20)
user << text("Occupant now has [] units of Dexalin in his/her bloodstream.", src.occupant.reagents.get_reagent_amount("dexalin"))
else
- user << "No occupant!"
+ user << "There's no occupant in the sleeper or the subject rejects the chemicals!"
return
@@ -367,7 +373,7 @@
usr << "\blue The sleeper is already occupied!"
return
- for(var/mob/living/carbon/metroid/M in range(1,usr))
+ for(var/mob/living/carbon/slime/M in range(1,usr))
if(M.Victim == usr)
usr << "You're too busy getting your life sucked out of you."
return
diff --git a/code/game/machinery/atmo_control.dm b/code/game/machinery/atmo_control.dm
index b0e5170dca..faac347b33 100644
--- a/code/game/machinery/atmo_control.dm
+++ b/code/game/machinery/atmo_control.dm
@@ -87,6 +87,8 @@ obj/machinery/computer/general_air_control
var/datum/radio_frequency/radio_connection
attack_hand(mob/user)
+ if(..(user))
+ return
user << browse(return_text(),"window=computer")
user.set_machine(src)
onclose(user, "computer")
diff --git a/code/game/machinery/atmoalter/area_atmos_computer.dm b/code/game/machinery/atmoalter/area_atmos_computer.dm
index 8aee956b51..ac7af07435 100644
--- a/code/game/machinery/atmoalter/area_atmos_computer.dm
+++ b/code/game/machinery/atmoalter/area_atmos_computer.dm
@@ -25,6 +25,8 @@
return
attack_hand(var/mob/user as mob)
+ if(..(user))
+ return
src.add_fingerprint(usr)
var/dat = {"
@@ -126,28 +128,6 @@
src.updateUsrDialog()
- attackby(I as obj, user as mob)
- if(istype(I, /obj/item/weapon/screwdriver))
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
- if(do_after(user, 20))
- var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
- var/obj/item/weapon/circuitboard/area_atmos/M = new /obj/item/weapon/circuitboard/area_atmos( A )
- for (var/obj/C in src)
- C.loc = src.loc
- A.circuit = M
- A.anchored = 1
-
- if (src.stat & BROKEN)
- user << "\blue The broken glass falls out."
- new /obj/item/weapon/shard( src.loc )
- A.state = 3
- A.icon_state = "3"
- else
- user << "\blue You disconnect the monitor."
- A.state = 4
- A.icon_state = "4"
-
- del(src)
/obj/machinery/computer/area_atmos/area
zone = "This computer is working in a wired network limited to this area."
diff --git a/code/game/machinery/atmoalter/meter.dm b/code/game/machinery/atmoalter/meter.dm
index 09fb8faa2a..939e1c94f3 100644
--- a/code/game/machinery/atmoalter/meter.dm
+++ b/code/game/machinery/atmoalter/meter.dm
@@ -1,3 +1,17 @@
+/obj/machinery/meter
+ name = "meter"
+ desc = "It measures something."
+ icon = 'icons/obj/meter.dmi'
+ icon_state = "meterX"
+ var/obj/machinery/atmospherics/pipe/target = null
+ anchored = 1.0
+ power_channel = ENVIRON
+ var/frequency = 0
+ var/id
+ use_power = 1
+ idle_power_usage = 2
+ active_power_usage = 4
+
/obj/machinery/meter/New()
..()
src.target = locate(/obj/machinery/atmospherics/pipe) in loc
diff --git a/code/game/machinery/atmoalter/portable_atmospherics.dm b/code/game/machinery/atmoalter/portable_atmospherics.dm
index 171552fa48..f929cc0d5e 100644
--- a/code/game/machinery/atmoalter/portable_atmospherics.dm
+++ b/code/game/machinery/atmoalter/portable_atmospherics.dm
@@ -1,5 +1,6 @@
/obj/machinery/portable_atmospherics
name = "atmoalter"
+ use_power = 0
var/datum/gas_mixture/air_contents = new
var/obj/machinery/atmospherics/portables_connector/connected_port
@@ -105,7 +106,7 @@
user << "\blue Nothing happens."
return
- else if ((istype(W, /obj/item/device/analyzer) || (istype(W, /obj/item/device/pda))) && get_dist(user, src) <= 1)
+ else if ((istype(W, /obj/item/device/analyzer)) && get_dist(user, src) <= 1)
visible_message("\red [user] has used [W] on \icon[icon]")
if(air_contents)
var/pressure = air_contents.return_pressure()
diff --git a/code/game/machinery/atmoalter/pump.dm b/code/game/machinery/atmoalter/pump.dm
index 764ee3afd3..00aedd9363 100644
--- a/code/game/machinery/atmoalter/pump.dm
+++ b/code/game/machinery/atmoalter/pump.dm
@@ -27,6 +27,22 @@
return
+/obj/machinery/portable_atmospherics/pump/emp_act(severity)
+ if(stat & (BROKEN|NOPOWER))
+ ..(severity)
+ return
+
+ if(prob(50/severity))
+ on = !on
+
+ if(prob(100/severity))
+ direction_out = !direction_out
+
+ target_pressure = rand(0,1300)
+ update_icon()
+
+ ..(severity)
+
/obj/machinery/portable_atmospherics/pump/process()
..()
if(on)
diff --git a/code/game/machinery/atmoalter/scrubber.dm b/code/game/machinery/atmoalter/scrubber.dm
index eae5dd9293..6432aa755b 100644
--- a/code/game/machinery/atmoalter/scrubber.dm
+++ b/code/game/machinery/atmoalter/scrubber.dm
@@ -10,6 +10,17 @@
volume = 750
+/obj/machinery/portable_atmospherics/scrubber/emp_act(severity)
+ if(stat & (BROKEN|NOPOWER))
+ ..(severity)
+ return
+
+ if(prob(50/severity))
+ on = !on
+ update_icon()
+
+ ..(severity)
+
/obj/machinery/portable_atmospherics/scrubber/huge
name = "Huge Air Scrubber"
icon_state = "scrubber:0"
diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm
index 4621e51914..9401ed769c 100644
--- a/code/game/machinery/autolathe.dm
+++ b/code/game/machinery/autolathe.dm
@@ -59,10 +59,34 @@ var/global/list/autolathe_recipes_hidden = list( \
)
/obj/machinery/autolathe
- var/busy = 0
+ name = "\improper Autolathe"
+ desc = "It produces items using metal and glass."
+ icon_state = "autolathe"
+ density = 1
+
+ var/m_amount = 0.0
var/max_m_amount = 150000.0
+
+ var/g_amount = 0.0
var/max_g_amount = 75000.0
+ var/operating = 0.0
+ var/opened = 0.0
+ anchored = 1.0
+ var/list/L = list()
+ var/list/LL = list()
+ var/hacked = 0
+ var/disabled = 0
+ var/shocked = 0
+ var/list/wires = list()
+ var/hack_wire
+ var/disable_wire
+ var/shock_wire
+ use_power = 1
+ idle_power_usage = 10
+ active_power_usage = 100
+ var/busy = 0
+
proc
wires_win(mob/user as mob)
var/dat as text
diff --git a/code/game/machinery/biogenerator.dm b/code/game/machinery/biogenerator.dm
index 80d4174fd4..c75cda5dba 100644
--- a/code/game/machinery/biogenerator.dm
+++ b/code/game/machinery/biogenerator.dm
@@ -42,7 +42,7 @@
updateUsrDialog()
else if(processing)
user << "\red The biogenerator is currently processing."
- else if(istype(O, /obj/item/weapon/plantbag))
+ else if(istype(O, /obj/item/weapon/storage/bag/plants))
var/i = 0
for(var/obj/item/weapon/reagent_containers/food/snacks/grown/G in contents)
i++
diff --git a/code/game/machinery/bots/bots.dm b/code/game/machinery/bots/bots.dm
index af1683acfe..9862f63e2c 100644
--- a/code/game/machinery/bots/bots.dm
+++ b/code/game/machinery/bots/bots.dm
@@ -4,6 +4,7 @@
icon = 'icons/obj/aibots.dmi'
layer = MOB_LAYER
luminosity = 3
+ use_power = 0
var/obj/item/weapon/card/id/botcard // the ID card that the bot "holds"
var/on = 1
var/health = 0 //do not forget to set health for your bot!
@@ -88,13 +89,16 @@
else if (istype(W, /obj/item/weapon/card/emag) && emagged < 2)
Emag(user)
else
- switch(W.damtype)
- if("fire")
- src.health -= W.force * fire_dam_coeff
- if("brute")
- src.health -= W.force * brute_dam_coeff
- ..()
- healthcheck()
+ if(hasvar(W,"force") && hasvar(W,"damtype"))
+ switch(W.damtype)
+ if("fire")
+ src.health -= W.force * fire_dam_coeff
+ if("brute")
+ src.health -= W.force * brute_dam_coeff
+ ..()
+ healthcheck()
+ else
+ ..()
/obj/machinery/bot/bullet_act(var/obj/item/projectile/Proj)
health -= Proj.damage
diff --git a/code/game/machinery/bots/cleanbot.dm b/code/game/machinery/bots/cleanbot.dm
index af3d49e6e4..3e970a580c 100644
--- a/code/game/machinery/bots/cleanbot.dm
+++ b/code/game/machinery/bots/cleanbot.dm
@@ -52,7 +52,8 @@
should_patrol = 1
src.botcard = new /obj/item/weapon/card/id(src)
- src.botcard.access = get_access("Janitor")
+ var/datum/job/janitor/J = new/datum/job/janitor
+ src.botcard.access = J.get_access()
if(radio_controller)
radio_controller.add_object(src, beacon_freq, filter = RADIO_NAVBEACONS)
diff --git a/code/game/machinery/bots/ed209bot.dm b/code/game/machinery/bots/ed209bot.dm
index b2ddb8aab3..9e67f5df2b 100644
--- a/code/game/machinery/bots/ed209bot.dm
+++ b/code/game/machinery/bots/ed209bot.dm
@@ -7,7 +7,7 @@
density = 1
anchored = 0
// weight = 1.0E7
- req_access = list(access_security)
+ req_one_access = list(access_security, access_forensics_lockers)
health = 100
maxhealth = 100
fire_dam_coeff = 0.7
@@ -78,7 +78,8 @@
src.icon_state = "[lasercolor]ed209[src.on]"
spawn(3)
src.botcard = new /obj/item/weapon/card/id(src)
- src.botcard.access = get_access("Detective")
+ var/datum/job/detective/J = new/datum/job/detective
+ src.botcard.access = J.get_access()
if(radio_controller)
radio_controller.add_object(src, control_freq, filter = RADIO_SECBOT)
@@ -194,11 +195,12 @@ Auto Patrol: []"},
user << "Access denied."
else
..()
- if (!istype(W, /obj/item/weapon/screwdriver) && (W.force) && (!src.target))
- src.target = user
- if(lasercolor)//To make up for the fact that lasertag bots don't hunt
- src.shootAt(user)
- src.mode = SECBOT_HUNT
+ if (!istype(W, /obj/item/weapon/screwdriver) && (!src.target))
+ if(hasvar(W,"force") && W.force)//If force is defined and non-zero
+ src.target = user
+ if(lasercolor)//To make up for the fact that lasertag bots don't hunt
+ src.shootAt(user)
+ src.mode = SECBOT_HUNT
/obj/machinery/bot/ed209/Emag(mob/user as mob)
..()
@@ -317,29 +319,36 @@ Auto Patrol: []"},
mode = SECBOT_HUNT
return
- if (!src.target.handcuffed && !src.arrest_type)
- playsound(src.loc, 'sound/weapons/handcuffs.ogg', 30, 1, -2)
- mode = SECBOT_ARREST
- visible_message("\red [src] is trying to put handcuffs on [src.target]!")
+ if(istype(src.target,/mob/living/carbon))
+ if (!src.target.handcuffed && !src.arrest_type)
+ playsound(src.loc, 'sound/weapons/handcuffs.ogg', 30, 1, -2)
+ mode = SECBOT_ARREST
+ visible_message("\red [src] is trying to put handcuffs on [src.target]!")
- spawn(60)
- if (get_dist(src, src.target) <= 1)
- if (src.target.handcuffed)
- return
+ spawn(60)
+ if (get_dist(src, src.target) <= 1)
+ if (src.target.handcuffed)
+ return
- if(istype(src.target,/mob/living/carbon))
- src.target.handcuffed = new /obj/item/weapon/handcuffs(src.target)
- target.update_inv_handcuffed() //update handcuff overlays
+ if(istype(src.target,/mob/living/carbon))
+ src.target.handcuffed = new /obj/item/weapon/handcuffs(src.target)
+ target.update_inv_handcuffed() //update handcuff overlays
- mode = SECBOT_IDLE
- src.target = null
- src.anchored = 0
- src.last_found = world.time
- src.frustration = 0
+ mode = SECBOT_IDLE
+ src.target = null
+ src.anchored = 0
+ src.last_found = world.time
+ src.frustration = 0
- // playsound(src.loc, pick('sound/voice/bgod.ogg', 'sound/voice/biamthelaw.ogg', 'sound/voice/bsecureday.ogg', 'sound/voice/bradio.ogg', 'sound/voice/binsult.ogg', 'sound/voice/bcreep.ogg'), 50, 0)
- // var/arrest_message = pick("Have a secure day!","I AM THE LAW.", "God made tomorrow for the crooks we don't catch today.","You can't outrun a radio.")
- // src.speak(arrest_message)
+ // playsound(src.loc, pick('sound/voice/bgod.ogg', 'sound/voice/biamthelaw.ogg', 'sound/voice/bsecureday.ogg', 'sound/voice/bradio.ogg', 'sound/voice/binsult.ogg', 'sound/voice/bcreep.ogg'), 50, 0)
+ // var/arrest_message = pick("Have a secure day!","I AM THE LAW.", "God made tomorrow for the crooks we don't catch today.","You can't outrun a radio.")
+ // src.speak(arrest_message)
+ else
+ mode = SECBOT_IDLE
+ src.target = null
+ src.anchored = 0
+ src.last_found = world.time
+ src.frustration = 0
if(SECBOT_ARREST) // arresting
if(src.lasercolor)
@@ -704,22 +713,17 @@ Auto Patrol: []"},
if(istype(perp:belt, /obj/item/weapon/gun/energy/laser/bluetag))
threatcount += 2
- if (src.check_records)
+ if(src.check_records)
for (var/datum/data/record/E in data_core.general)
var/perpname = perp.name
- if (perp:wear_id)
- var/obj/item/weapon/card/id/id = perp:wear_id
- if(istype(perp:wear_id, /obj/item/device/pda))
- var/obj/item/device/pda/pda = perp:wear_id
- id = pda.id
- if (id)
+ if(perp.wear_id)
+ var/obj/item/weapon/card/id/id = perp.wear_id.GetID()
+ if(id)
perpname = id.registered_name
- else
- var/obj/item/device/pda/pda = perp:wear_id
- perpname = pda.owner
- if (E.fields["name"] == perpname)
+
+ if(E.fields["name"] == perpname)
for (var/datum/data/record/R in data_core.security)
- if ((R.fields["id"] == E.fields["id"]) && (R.fields["criminal"] == "*Arrest*"))
+ if((R.fields["id"] == E.fields["id"]) && (R.fields["criminal"] == "*Arrest*"))
threatcount = 4
break
diff --git a/code/game/machinery/bots/floorbot.dm b/code/game/machinery/bots/floorbot.dm
index 15886be92d..986728f5c6 100644
--- a/code/game/machinery/bots/floorbot.dm
+++ b/code/game/machinery/bots/floorbot.dm
@@ -45,7 +45,7 @@
var/turf/target
var/turf/oldtarget
var/oldloc = null
- req_access = list(access_atmospherics)
+ req_access = list(access_construction)
var/path[] = new()
var/targetdirection
diff --git a/code/game/machinery/bots/medbot.dm b/code/game/machinery/bots/medbot.dm
index a0556aeb78..df7b8b0ff8 100644
--- a/code/game/machinery/bots/medbot.dm
+++ b/code/game/machinery/bots/medbot.dm
@@ -6,17 +6,17 @@
/obj/machinery/bot/medbot
name = "Medibot"
desc = "A little medical robot. He looks somewhat underwhelmed."
- icon = 'aibots.dmi'
+ icon = 'icons/obj/aibots.dmi'
icon_state = "medibot0"
layer = 5.0
- density = 1
+ density = 0
anchored = 0
health = 20
maxhealth = 20
req_access =list(access_medical)
var/stunned = 0 //It can be stunned by tasers. Delicate circuits.
- var/obj/machinery/camera/cam = null
- var/list/botcard_access = list(access_medical, access_morgue, access_genetics, access_robotics)
+//var/emagged = 0
+ var/list/botcard_access = list(access_medical)
var/obj/item/weapon/reagent_containers/glass/reagent_glass = null //Can be set to draw from this for reagents.
var/skin = null //Set to "tox", "ointment" or "o2" for the other two firstaid kits.
var/frustration = 0
@@ -27,29 +27,30 @@
var/last_found = 0
var/last_newpatient_speak = 0 //Don't spam the "HEY I'M COMING" messages
var/currently_healing = 0
- var/injection_amount = 5 //How much reagent do we inject at a time?
- var/heal_threshold = 15 //Start healing when they have this much damage in a category
- var/use_beaker = 1 //Use reagents in beaker instead of default treatment agents.
+ var/injection_amount = 15 //How much reagent do we inject at a time?
+ var/heal_threshold = 10 //Start healing when they have this much damage in a category
+ var/use_beaker = 0 //Use reagents in beaker instead of default treatment agents.
//Setting which reagents to use to treat what by default. By id.
- var/treatment_brute = "bicaridine"
- var/treatment_oxy = "dexalin"
- var/treatment_fire = "kelotane"
- var/treatment_tox = "anti_toxin"
+ var/treatment_brute = "tricordrazine"
+ var/treatment_oxy = "tricordrazine"
+ var/treatment_fire = "tricordrazine"
+ var/treatment_tox = "tricordrazine"
var/treatment_virus = "spaceacillin"
- var/reagent_id = "inaprovaline"
var/shut_up = 0 //self explanatory :)
- var/always_inject = 0
/obj/machinery/bot/medbot/mysterious
name = "Mysterious Medibot"
desc = "International Medibot of mystery."
skin = "bezerk"
- reagent_id = "dexalinp"
+ treatment_oxy = "dexalinp"
+ treatment_brute = "bicaridine"
+ treatment_fire = "kelotane"
+ treatment_tox = "anti_toxin"
/obj/item/weapon/firstaid_arm_assembly
name = "first aid/robot arm assembly"
desc = "A first aid kit with a robot arm permanently grafted to it."
- icon = 'aibots.dmi'
+ icon = 'icons/obj/aibots.dmi'
icon_state = "firstaid_arm"
var/build_step = 0
var/created_name = "Medibot" //To preserve the name if it's a unique medbot I guess
@@ -60,7 +61,7 @@
..()
spawn(5)
if(src.skin)
- src.overlays += image('aibots.dmi', "kit_skin_[src.skin]")
+ src.overlays += image('icons/obj/aibots.dmi', "kit_skin_[src.skin]")
/obj/machinery/bot/medbot/New()
@@ -69,16 +70,14 @@
spawn(4)
if(src.skin)
- src.overlays += image('aibots.dmi', "medskin_[src.skin]")
+ src.overlays += image('icons/obj/aibots.dmi', "medskin_[src.skin]")
src.botcard = new /obj/item/weapon/card/id(src)
if(isnull(src.botcard_access) || (src.botcard_access.len < 1))
- src.botcard.access = get_access("Medical Doctor")
+ var/datum/job/doctor/J = new/datum/job/doctor
+ src.botcard.access = J.get_access()
else
src.botcard.access = src.botcard_access
- src.cam = new /obj/machinery/camera(src)
- src.cam.c_tag = src.name
- src.cam.network = "Medbay"
/obj/machinery/bot/medbot/turn_on()
. = ..()
@@ -106,6 +105,7 @@
var/dat
dat += "Automatic Medical Unit v1.0
"
dat += "Status: [src.on ? "On" : "Off"]
"
+ dat += "Maintenance panel panel is [src.open ? "opened" : "closed"]
"
dat += "Beaker: "
if (src.reagent_glass)
dat += "Loaded \[[src.reagent_glass.reagents.total_volume]/[src.reagent_glass.reagents.maximum_volume]\]"
@@ -130,9 +130,6 @@
dat += "Reagent Source: "
dat += "[src.use_beaker ? "Loaded Beaker (When available)" : "Internal Synthesizer"]
"
- dat += "Inject: "
- dat += "[src.always_inject ? "Always" : "If loaded chemical is known to help"]
"
-
dat += "The speaker switch is [src.shut_up ? "off" : "on"]. Toggle"
user << browse("
"
- else
- priority_text = "No priority alerts detected.
"
+ if(priority_alarms.len)
+ for(var/zone in priority_alarms)
+ priority_text += "[zone] X
"
+ else
+ priority_text = "No priority alerts detected.
"
- if(minor_alarms.len)
- for(var/zone in minor_alarms)
- minor_text += "[zone] X
"
- else
- minor_text = "No minor alerts detected.
"
+ if(minor_alarms.len)
+ for(var/zone in minor_alarms)
+ minor_text += "[zone] X
"
+ else
+ minor_text = "No minor alerts detected.
"
- var/output = {"[name]
+ var/output = {"[name]
Priority Alerts:
[priority_text]
@@ -85,46 +91,23 @@
[minor_text]
"}
- return output
+ return output
- Topic(href, href_list)
- if(..())
- return
-
- if(href_list["priority_clear"])
- var/removing_zone = href_list["priority_clear"]
- for(var/zone in priority_alarms)
- if(ckey(zone) == removing_zone)
- priority_alarms -= zone
-
- if(href_list["minor_clear"])
- var/removing_zone = href_list["minor_clear"]
- for(var/zone in minor_alarms)
- if(ckey(zone) == removing_zone)
- minor_alarms -= zone
- update_icon()
+/obj/machinery/computer/atmos_alert/Topic(href, href_list)
+ if(..())
return
- attackby(I as obj, user as mob)
- if(istype(I, /obj/item/weapon/screwdriver))
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
- if(do_after(user, 20))
- var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
- var/obj/item/weapon/circuitboard/atmos_alert/M = new /obj/item/weapon/circuitboard/atmos_alert( A )
- for (var/obj/C in src)
- C.loc = src.loc
- A.circuit = M
- A.anchored = 1
+ if(href_list["priority_clear"])
+ var/removing_zone = href_list["priority_clear"]
+ for(var/zone in priority_alarms)
+ if(ckey(zone) == removing_zone)
+ priority_alarms -= zone
- if (src.stat & BROKEN)
- user << "\blue The broken glass falls out."
- new /obj/item/weapon/shard( src.loc )
- A.state = 3
- A.icon_state = "3"
- else
- user << "\blue You disconnect the monitor."
- A.state = 4
- A.icon_state = "4"
-
- del(src)
+ if(href_list["minor_clear"])
+ var/removing_zone = href_list["minor_clear"]
+ for(var/zone in minor_alarms)
+ if(ckey(zone) == removing_zone)
+ minor_alarms -= zone
+ update_icon()
+ return
diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm
index 0a34785be2..c1703891b9 100644
--- a/code/game/machinery/computer/camera.dm
+++ b/code/game/machinery/computer/camera.dm
@@ -88,6 +88,12 @@
density = 0
circuit = null
+/obj/machinery/computer/security/telescreen/update_icon()
+ icon_state = initial(icon_state)
+ if(stat & BROKEN)
+ icon_state += "b"
+ return
+
/obj/machinery/computer/security/telescreen/entertainment
name = "entertainment monitor"
desc = "Damn, they better have /tg/thechannel on these things."
diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm
index c0171f2277..773d4897c7 100644
--- a/code/game/machinery/computer/card.dm
+++ b/code/game/machinery/computer/card.dm
@@ -235,7 +235,17 @@
if(temp_t)
t1 = temp_t
else
- modify.access = ( istype(src,/obj/machinery/computer/card/centcom) ? get_centcom_access(t1) : get_access(t1) )
+ var/datum/job/jobdatum
+ for(var/jobtype in typesof(/datum/job))
+ var/datum/job/J = new jobtype
+ if(ckey(J.title) == ckey(t1))
+ jobdatum = J
+ break
+ if(!jobdatum)
+ usr << "\red No log exists for this job."
+ return
+
+ modify.access = ( istype(src,/obj/machinery/computer/card/centcom) ? get_centcom_access(t1) : jobdatum.get_access() )
if (modify)
modify.assignment = t1
if ("reg")
diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm
index 0644c656b1..c41af18366 100644
--- a/code/game/machinery/computer/cloning.dm
+++ b/code/game/machinery/computer/cloning.dm
@@ -31,7 +31,7 @@
var/delete = 0
var/injectorready = 0 //Quick fix for issue 286 (screwdriver the screen twice to restore injector) -Pete
var/temphtml = null
- var/obj/machinery/dna_scanner/connected = null
+ var/obj/machinery/dna_scannernew/connected = null
var/obj/item/weapon/disk/data/diskette = null
anchored = 1.0
use_power = 1
@@ -464,15 +464,14 @@
break
return selected_record
-/obj/machinery/computer/cloning/power_change()
+/obj/machinery/computer/cloning/update_icon()
if(stat & BROKEN)
icon_state = "commb"
else
- if( powered() )
+ if(stat & NOPOWER)
+ src.icon_state = "c_unpowered"
+ stat |= NOPOWER
+ else
icon_state = initial(icon_state)
stat &= ~NOPOWER
- else
- spawn(rand(0, 15))
- src.icon_state = "c_unpowered"
- stat |= NOPOWER
\ No newline at end of file
diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm
index 40dfa896c1..880d2b565a 100644
--- a/code/game/machinery/computer/communications.dm
+++ b/code/game/machinery/computer/communications.dm
@@ -36,9 +36,9 @@
/obj/machinery/computer/communications/process()
- ..()
- if(state != STATE_STATUSDISPLAY)
- src.updateDialog()
+ if(..())
+ if(state != STATE_STATUSDISPLAY)
+ src.updateDialog()
/obj/machinery/computer/communications/Topic(href, href_list)
@@ -455,10 +455,6 @@
user << "The emergency shuttle is already on its way."
return
- if(ticker.mode.name == "revolution" || ticker.mode.name == "AI malfunction" || ticker.mode.name == "sandbox")
- //New version pretends to call the shuttle but cause the shuttle to return after a random duration.
- emergency_shuttle.fake_recall = rand(300,500)
-
if(ticker.mode.name == "blob")
user << "Under directive 7-10, [station_name()] is quarantined until further notice."
return
diff --git a/code/game/machinery/computer/computer.dm b/code/game/machinery/computer/computer.dm
index 8bdc0729f0..ae0dc3c5c3 100644
--- a/code/game/machinery/computer/computer.dm
+++ b/code/game/machinery/computer/computer.dm
@@ -3,131 +3,122 @@
icon = 'icons/obj/computer.dmi'
density = 1
anchored = 1.0
- var/obj/item/weapon/circuitboard/circuit = null //if circuit==null, computer can't disassemble
+ use_power = 1
+ idle_power_usage = 300
+ active_power_usage = 300
+ var/obj/item/weapon/circuitboard/circuit = null //if circuit==null, computer can't disassembly
+ var/processing = 0
+
+/obj/machinery/computer/New()
+ ..()
+ if(ticker)
+ initialize()
- New()
- ..()
- spawn(2)
- power_change()
+/obj/machinery/computer/initialize()
+ power_change()
+
+/obj/machinery/computer/process()
+ if(stat & (NOPOWER|BROKEN))
+ return 0
+ return 1
+
+/obj/machinery/computer/meteorhit(var/obj/O as obj)
+ for(var/x in verbs)
+ verbs -= x
+ set_broken()
+ var/datum/effect/effect/system/harmless_smoke_spread/smoke = new /datum/effect/effect/system/harmless_smoke_spread()
+ smoke.set_up(5, 0, src)
+ smoke.start()
+ return
- meteorhit(var/obj/O as obj)
+/obj/machinery/computer/emp_act(severity)
+ if(prob(20/severity)) set_broken()
+ ..()
+
+
+/obj/machinery/computer/ex_act(severity)
+ switch(severity)
+ if(1.0)
+ del(src)
+ return
+ if(2.0)
+ if (prob(25))
+ del(src)
+ return
+ if (prob(50))
+ for(var/x in verbs)
+ verbs -= x
+ set_broken()
+ if(3.0)
+ if (prob(25))
+ for(var/x in verbs)
+ verbs -= x
+ set_broken()
+ else
+ return
+
+/obj/machinery/computer/bullet_act(var/obj/item/projectile/Proj)
+ if(prob(Proj.damage))
+ set_broken()
+ ..()
+
+
+/obj/machinery/computer/blob_act()
+ if (prob(75))
for(var/x in verbs)
verbs -= x
set_broken()
- var/datum/effect/effect/system/harmless_smoke_spread/smoke = new /datum/effect/effect/system/harmless_smoke_spread()
- smoke.set_up(5, 0, src)
- smoke.start()
- return
+ density = 0
-
- emp_act(severity)
- if(prob(20/severity)) set_broken()
- ..()
-
-
- ex_act(severity)
- switch(severity)
- if(1.0)
- del(src)
- return
- if(2.0)
- if (prob(25))
- del(src)
- return
- if (prob(50))
- for(var/x in verbs)
- verbs -= x
- set_broken()
- if(3.0)
- if (prob(25))
- for(var/x in verbs)
- verbs -= x
- set_broken()
- else
- return
-
- bullet_act(var/obj/item/projectile/Proj)
- if(prob(Proj.damage))
- set_broken()
- ..()
-
-
- blob_act()
- if (prob(75))
- for(var/x in verbs)
- verbs -= x
- set_broken()
- density = 0
-
-
- power_change()
- if(!istype(src,/obj/machinery/computer/security/telescreen))
- if(stat & BROKEN)
- icon_state = initial(icon_state)
- icon_state += "b"
- if (istype(src,/obj/machinery/computer/aifixer))
- overlays = null
-
- else if(powered())
- icon_state = initial(icon_state)
- stat &= ~NOPOWER
- if (istype(src,/obj/machinery/computer/aifixer))
- var/obj/machinery/computer/aifixer/O = src
- if (O.occupant)
- switch (O.occupant.stat)
- if (0)
- overlays += image('icons/obj/computer.dmi', "ai-fixer-full")
- if (2)
- overlays += image('icons/obj/computer.dmi', "ai-fixer-404")
- else
- overlays += image('icons/obj/computer.dmi', "ai-fixer-empty")
- else
- spawn(rand(0, 15))
- //icon_state = "c_unpowered"
- icon_state = initial(icon_state)
- icon_state += "0"
- stat |= NOPOWER
- if (istype(src,/obj/machinery/computer/aifixer))
- overlays = null
-
-
- process()
- if(stat & (NOPOWER|BROKEN))
- return
- use_power(250)
-
-
- proc/set_broken()
- icon_state = initial(icon_state)
+/obj/machinery/computer/update_icon()
+ ..()
+ icon_state = initial(icon_state)
+ // Broken
+ if(stat & BROKEN)
icon_state += "b"
- stat |= BROKEN
+
+ // Powered
+ else if(stat & NOPOWER)
+ icon_state = initial(icon_state)
+ icon_state += "0"
- attackby(I as obj, user as mob)
- if(istype(I, /obj/item/weapon/screwdriver) && circuit)
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
- if(do_after(user, 20))
- var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
- var/obj/item/weapon/circuitboard/M = new circuit( A )
- A.circuit = M
- A.anchored = 1
- for (var/obj/C in src)
- C.loc = src.loc
- if (src.stat & BROKEN)
- user << "\blue The broken glass falls out."
- new /obj/item/weapon/shard( src.loc )
- A.state = 3
- A.icon_state = "3"
- else
- user << "\blue You disconnect the monitor."
- A.state = 4
- A.icon_state = "4"
- del(src)
- else
- src.attack_hand(user)
- return
+
+/obj/machinery/computer/power_change()
+ ..()
+ update_icon()
+
+
+/obj/machinery/computer/proc/set_broken()
+ stat |= BROKEN
+ update_icon()
+
+
+/obj/machinery/computer/attackby(I as obj, user as mob)
+ if(istype(I, /obj/item/weapon/screwdriver) && circuit)
+ playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ if(do_after(user, 20))
+ var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
+ var/obj/item/weapon/circuitboard/M = new circuit( A )
+ A.circuit = M
+ A.anchored = 1
+ for (var/obj/C in src)
+ C.loc = src.loc
+ if (src.stat & BROKEN)
+ user << "\blue The broken glass falls out."
+ new /obj/item/weapon/shard( src.loc )
+ A.state = 3
+ A.icon_state = "3"
+ else
+ user << "\blue You disconnect the monitor."
+ A.state = 4
+ A.icon_state = "4"
+ del(src)
+ else
+ src.attack_hand(user)
+ return
diff --git a/code/game/machinery/computer/crew.dm b/code/game/machinery/computer/crew.dm
index a4cbf96dd2..ab3c456535 100644
--- a/code/game/machinery/computer/crew.dm
+++ b/code/game/machinery/computer/crew.dm
@@ -9,110 +9,111 @@
var/list/tracked = list( )
- New()
- tracked = list()
- ..()
+/obj/machinery/computer/crew/New()
+ tracked = list()
+ ..()
- attack_ai(mob/user)
- attack_hand(user)
- interact(user)
+/obj/machinery/computer/crew/attack_ai(mob/user)
+ attack_hand(user)
+ interact(user)
- attack_hand(mob/user)
- add_fingerprint(user)
- if(stat & (BROKEN|NOPOWER))
- return
- interact(user)
+/obj/machinery/computer/crew/attack_hand(mob/user)
+ add_fingerprint(user)
+ if(stat & (BROKEN|NOPOWER))
+ return
+ interact(user)
- power_change()
- if(stat & BROKEN)
- icon_state = "broken"
+/obj/machinery/computer/crew/update_icon()
+
+ if(stat & BROKEN)
+ icon_state = "broken"
+ else
+ if(stat & NOPOWER)
+ src.icon_state = "c_unpowered"
+ stat |= NOPOWER
else
- if( powered() )
- icon_state = initial(icon_state)
- stat &= ~NOPOWER
- else
- spawn(rand(0, 15))
- src.icon_state = "c_unpowered"
- stat |= NOPOWER
+ icon_state = initial(icon_state)
+ stat &= ~NOPOWER
- Topic(href, href_list)
- if(..()) return
- if (src.z > 6)
- usr << "\red Unable to establish a connection: \black You're too far away from the station!"
- return
- if( href_list["close"] )
- usr << browse(null, "window=crewcomp")
- usr.unset_machine()
- return
- if(href_list["update"])
- src.updateDialog()
- return
+/obj/machinery/computer/crew/Topic(href, href_list)
+ if(..()) return
+ if (src.z > 6)
+ usr << "\red Unable to establish a connection: \black You're too far away from the station!"
+ return
+ if( href_list["close"] )
+ usr << browse(null, "window=crewcomp")
+ usr.unset_machine()
+ return
+ if(href_list["update"])
+ src.updateDialog()
+ return
- interact(mob/user)
- if( (get_dist(src, user) > 1 ) || (stat & (BROKEN|NOPOWER)) )
- if(!istype(user, /mob/living/silicon))
- user.unset_machine()
- user << browse(null, "window=powcomp")
- return
- user.set_machine(src)
- src.scan()
- var/t = "Crew Monitoring
"
- t += "
Refresh "
- t += "Close
"
- t += "
"
+ t += ""
+ user << browse(t, "window=crewcomp;size=900x600")
+ onclose(user, "crewcomp")
- proc/scan()
- for(var/obj/item/clothing/under/C in world)
- if((C.has_sensor) && (istype(C.loc, /mob/living/carbon/human)))
- var/check = 0
- for(var/O in src.tracked)
- if(O == C)
- check = 1
- break
- if(!check)
- src.tracked.Add(C)
- return 1
\ No newline at end of file
+/obj/machinery/computer/crew/proc/scan()
+ for(var/obj/item/clothing/under/C in world)
+ if((C.has_sensor) && (istype(C.loc, /mob/living/carbon/human)))
+ var/check = 0
+ for(var/O in src.tracked)
+ if(O == C)
+ check = 1
+ break
+ if(!check)
+ src.tracked.Add(C)
+ return 1
\ No newline at end of file
diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm
index 3f7af0a075..d3e7e4c178 100644
--- a/code/game/machinery/computer/medical.dm
+++ b/code/game/machinery/computer/medical.dm
@@ -309,7 +309,7 @@
if("watch")
src.active1.fields["m_stat"] = "*Watch*"
if("stable")
- src.active2.fields["m_stat"] = "Stable"
+ src.active1.fields["m_stat"] = "Stable"
if (href_list["b_type"])
@@ -442,6 +442,34 @@
src.updateUsrDialog()
return
+/obj/machinery/computer/med_data/emp_act(severity)
+ if(stat & (BROKEN|NOPOWER))
+ ..(severity)
+ return
+
+ for(var/datum/data/record/R in data_core.medical)
+ if(prob(10/severity))
+ switch(rand(1,6))
+ if(1)
+ R.fields["name"] = "[pick(pick(first_names_male), pick(first_names_female))] [pick(last_names)]"
+ if(2)
+ R.fields["sex"] = pick("Male", "Female")
+ if(3)
+ R.fields["age"] = rand(5, 85)
+ if(4)
+ R.fields["b_type"] = pick("A-", "B-", "AB-", "O-", "A+", "B+", "AB+", "O+")
+ if(5)
+ R.fields["p_stat"] = pick("*Unconcious*", "Active", "Physically Unfit")
+ if(6)
+ R.fields["m_stat"] = pick("*Insane*", "*Unstable*", "*Watch*", "Stable")
+ continue
+
+ else if(prob(1))
+ del(R)
+ continue
+
+ ..(severity)
+
/obj/machinery/computer/med_data/laptop
name = "Medical Laptop"
diff --git a/code/game/machinery/computer/message.dm b/code/game/machinery/computer/message.dm
index f4a07ca681..ed16489636 100644
--- a/code/game/machinery/computer/message.dm
+++ b/code/game/machinery/computer/message.dm
@@ -65,7 +65,7 @@
..()
return
-/obj/machinery/computer/message_monitor/power_change()
+/obj/machinery/computer/message_monitor/update_icon()
..()
if(stat & (NOPOWER|BROKEN))
return
@@ -74,7 +74,7 @@
else
icon_state = normal_icon
-/obj/machinery/computer/message_monitor/process()
+/obj/machinery/computer/message_monitor/initialize()
//Is the server isn't linked to a server, and there's a server available, default it to the first one in the list.
if(!linkedServer)
if(message_servers && message_servers.len > 0)
@@ -405,7 +405,7 @@
//Get out list of viable PDAs
var/list/obj/item/device/pda/sendPDAs = list()
for(var/obj/item/device/pda/P in PDAs)
- if(!P.owner || P.toff) continue
+ if(!P.owner || P.toff || P.hidden) continue
sendPDAs += P
if(PDAs && PDAs.len > 0)
customrecepient = input(usr, "Select a PDA from the list.") as null|anything in sortAtom(sendPDAs)
@@ -437,7 +437,7 @@
var/obj/item/device/pda/PDARec = null
for (var/obj/item/device/pda/P in PDAs)
- if (!P.owner||P.toff) continue
+ if (!P.owner || P.toff || P.hidden) continue
if(P.owner == customsender)
PDARec = P
//Sender isn't faking as someone who exists
@@ -452,7 +452,7 @@
var/mob/living/carbon/human/H = customrecepient.loc
H << "\icon[customrecepient] Message from [customsender] ([customjob]), \"[custommessage]\" (Reply)"
log_pda("[usr] (PDA: [customsender]) sent \"[custommessage]\" to [customrecepient.owner]")
- customrecepient.overlays = null
+ customrecepient.overlays.Cut()
customrecepient.overlays += image('icons/obj/pda.dmi', "pda-r")
//Sender is faking as someone who exists
else
@@ -466,7 +466,7 @@
var/mob/living/carbon/human/H = customrecepient.loc
H << "\icon[customrecepient] Message from [PDARec.owner] ([customjob]), \"[custommessage]\" (Reply)"
log_pda("[usr] (PDA: [PDARec.owner]) sent \"[custommessage]\" to [customrecepient.owner]")
- customrecepient.overlays = null
+ customrecepient.overlays.Cut()
customrecepient.overlays += image('icons/obj/pda.dmi', "pda-r")
//Finally..
ResetMessage()
@@ -499,7 +499,7 @@
for(var/obj/machinery/message_server/server in message_servers)
if(!isnull(server))
if(!isnull(server.decryptkey))
- info = " "
- var/list/logs = list()
- for(var/obj/item/clothing/under/C in src.tracked)
- var/log = ""
- var/turf/pos = get_turf(C)
- if((C) && (C.has_sensor) && (pos) && (pos.z == src.z) && C.sensor_mode)
- if(istype(C.loc, /mob/living/carbon/human))
+/obj/machinery/computer/crew/interact(mob/user)
+ if(stat & (BROKEN|NOPOWER))
+ return
+ if(!istype(user, /mob/living/silicon) && get_dist(src, user) > 1)
+ user.unset_machine()
+ user << browse(null, "window=powcomp")
+ return
+ user.set_machine(src)
+ src.scan()
+ var/t = "Crew MonitoringName Vitals Position
"
+ t += "
Refresh "
+ t += "Close
"
+ t += "
"
- t += ""
- user << browse(t, "window=crewcomp;size=900x600")
- onclose(user, "crewcomp")
+ switch(C.sensor_mode)
+ if(1)
+ log += " "
+ var/list/logs = list()
+ for(var/obj/item/clothing/under/C in src.tracked)
+ var/log = ""
+ var/turf/pos = get_turf(C)
+ if((C) && (C.has_sensor) && (pos) && (pos.z == src.z) && C.sensor_mode)
+ if(istype(C.loc, /mob/living/carbon/human))
- var/mob/living/carbon/human/H = C.loc
+ var/mob/living/carbon/human/H = C.loc
- var/dam1 = round(H.getOxyLoss(),1)
- var/dam2 = round(H.getToxLoss(),1)
- var/dam3 = round(H.getFireLoss(),1)
- var/dam4 = round(H.getBruteLoss(),1)
+ var/dam1 = round(H.getOxyLoss(),1)
+ var/dam2 = round(H.getToxLoss(),1)
+ var/dam3 = round(H.getFireLoss(),1)
+ var/dam4 = round(H.getBruteLoss(),1)
- var/life_status = "[H.stat > 1 ? "Deceased" : "Living"]"
- var/damage_report = "([dam1]/[dam2]/[dam3]/[dam4])"
+ var/life_status = "[H.stat > 1 ? "Deceased" : "Living"]"
+ var/damage_report = "([dam1]/[dam2]/[dam3]/[dam4])"
- if(H.wear_id)
- log += "Name Vitals Position [H.wear_id.name] "
- else
- log += "Unknown "
+ if(H.wear_id)
+ log += "[H.wear_id.name] "
+ else
+ log += " "
- if(2)
- log += "Unknown "
- switch(C.sensor_mode)
- if(1)
- log += "[life_status] Not Available [life_status] [damage_report] Not Available "
- if(3)
- var/area/player_area = get_area(H)
- log += "[life_status] [damage_report] [player_area.name] ([pos.x], [pos.y]) "
- logs += log
- logs = sortList(logs)
- for(var/log in logs)
- t += log
- t += "[life_status] Not Available "
+ if(2)
+ log += "[life_status] [damage_report] Not Available "
+ if(3)
+ var/area/player_area = get_area(H)
+ log += "[life_status] [damage_report] [player_area.name] ([pos.x], [pos.y]) "
+ logs += log
+ logs = sortList(logs)
+ for(var/log in logs)
+ t += log
+ t += "Daily Key Reset
The new message monitor key is '[server.decryptkey]'.
Please keep this a secret.
If necessary, change the password to a more secure one."
+ info = "Daily Key Reset
The new message monitor key is '[server.decryptkey]'.
Please keep this a secret and away from the clown.
If necessary, change the password to a more secure one."
info_links = info
overlays += "paper_words"
break
diff --git a/code/game/machinery/computer/pod.dm b/code/game/machinery/computer/pod.dm
index e557cbc212..0a5696ee4c 100644
--- a/code/game/machinery/computer/pod.dm
+++ b/code/game/machinery/computer/pod.dm
@@ -146,7 +146,8 @@
/obj/machinery/computer/pod/process()
- ..()
+ if(!..())
+ return
if(timing)
if(time > 0)
time = round(time) - 1
@@ -199,8 +200,14 @@
name = "ProComp Executive IIc"
desc = "The Syndicate operate on a tight budget. Operates external airlocks."
title = "External Airlock Controls"
+ req_access = list(access_syndicate)
-
+/obj/machinery/computer/pod/old/syndicate/attack_hand(var/mob/user as mob)
+ if(!allowed(user))
+ user << "\red Access Denied"
+ return
+ else
+ ..()
/obj/machinery/computer/pod/old/swf
name = "Magix System IV"
diff --git a/code/game/machinery/computer/power.dm b/code/game/machinery/computer/power.dm
index ce441f00d0..b3b017565c 100644
--- a/code/game/machinery/computer/power.dm
+++ b/code/game/machinery/computer/power.dm
@@ -126,10 +126,6 @@
return
-/obj/machinery/power/monitor/process()
- if(!(stat & (NOPOWER|BROKEN)) )
- use_power(250)
-
/obj/machinery/power/monitor/power_change()
if(stat & BROKEN)
diff --git a/code/game/machinery/computer/prisoner.dm b/code/game/machinery/computer/prisoner.dm
index b5265e89d6..c60e2a31c8 100644
--- a/code/game/machinery/computer/prisoner.dm
+++ b/code/game/machinery/computer/prisoner.dm
@@ -63,10 +63,8 @@
process()
- if(stat & (NOPOWER|BROKEN))
- return
- use_power(500)
- src.updateDialog()
+ if(!..())
+ src.updateDialog()
return
diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm
index 318f4fd7fa..deb6e9e8c8 100644
--- a/code/game/machinery/computer/security.dm
+++ b/code/game/machinery/computer/security.dm
@@ -549,6 +549,34 @@ What a mess.*/
updateUsrDialog()
return
+/obj/machinery/computer/secure_data/emp_act(severity)
+ if(stat & (BROKEN|NOPOWER))
+ ..(severity)
+ return
+
+ for(var/datum/data/record/R in data_core.security)
+ if(prob(10/severity))
+ switch(rand(1,6))
+ if(1)
+ R.fields["name"] = "[pick(pick(first_names_male), pick(first_names_female))] [pick(last_names)]"
+ if(2)
+ R.fields["sex"] = pick("Male", "Female")
+ if(3)
+ R.fields["age"] = rand(5, 85)
+ if(4)
+ R.fields["criminal"] = pick("None", "*Arrest*", "Incarcerated", "Parolled", "Released")
+ if(5)
+ R.fields["p_stat"] = pick("*Unconcious*", "Active", "Physically Unfit")
+ if(6)
+ R.fields["m_stat"] = pick("*Insane*", "*Unstable*", "*Watch*", "Stable")
+ continue
+
+ else if(prob(1))
+ del(R)
+ continue
+
+ ..(severity)
+
/obj/machinery/computer/secure_data/detective_computer
icon = 'icons/obj/computer.dmi'
icon_state = "messyfiles"
diff --git a/code/game/machinery/computer/syndicate_shuttle.dm b/code/game/machinery/computer/syndicate_shuttle.dm
index a421d2c21a..681fc65fe9 100644
--- a/code/game/machinery/computer/syndicate_shuttle.dm
+++ b/code/game/machinery/computer/syndicate_shuttle.dm
@@ -5,7 +5,7 @@
name = "syndicate shuttle terminal"
icon = 'icons/obj/computer.dmi'
icon_state = "syndishuttle"
- req_access = list()
+ req_access = list(access_syndicate)
var/area/curr_location
var/moving = 0
var/lastMove = 0
@@ -47,7 +47,7 @@
/obj/machinery/computer/syndicate_station/attack_hand(mob/user as mob)
if(!allowed(user))
- user << "Access Denied."
+ user << "\red Access Denied"
return
user.set_machine(src)
diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm
index 7790526dd7..e1f1dfa36e 100644
--- a/code/game/machinery/constructable_frame.dm
+++ b/code/game/machinery/constructable_frame.dm
@@ -35,19 +35,17 @@
switch(state)
if(1)
if(istype(P, /obj/item/weapon/cable_coil))
- if(P:amount >= 5)
+ var/obj/item/weapon/cable_coil/C = P
+ if(C.amount >= 5)
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
user << "\blue You start to add cables to the frame."
if(do_after(user, 20))
- if(!P)
- user << "\blue You realize the cable coil no longer exist."
- return;
- P:amount -= 5
- if(!P:amount) del(P)
- user << "\blue You add cables to the frame."
- state = 2
- icon_state = "box_1"
- else
+ if(C)
+ C.amount -= 5
+ if(!C.amount) del(C)
+ user << "\blue You add cables to the frame."
+ state = 2
+ icon_state = "box_1" else
if(istype(P, /obj/item/weapon/wrench))
playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1)
user << "\blue You dismantle the frame"
diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm
index 6669ad5137..9b433f33f7 100644
--- a/code/game/machinery/cryo.dm
+++ b/code/game/machinery/cryo.dm
@@ -120,9 +120,9 @@
else if(istype(G, /obj/item/weapon/grab))
if(!ismob(G:affecting))
return
- for(var/mob/living/carbon/metroid/M in range(1,G:affecting))
+ for(var/mob/living/carbon/slime/M in range(1,G:affecting))
if(M.Victim == G:affecting)
- usr << "[G:affecting:name] will not fit into the cryo because they have a Metroid latched onto their head."
+ usr << "[G:affecting:name] will not fit into the cryo because they have a slime latched onto their head."
return
var/mob/M = G:affecting
if(put_mob(M))
@@ -253,7 +253,7 @@
set name = "Move Inside"
set category = "Object"
set src in oview(1)
- for(var/mob/living/carbon/metroid/M in range(1,usr))
+ for(var/mob/living/carbon/slime/M in range(1,usr))
if(M.Victim == usr)
usr << "You're too busy getting your life sucked out of you."
return
diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm
index 171608be17..70010a74d5 100644
--- a/code/game/machinery/deployable.dm
+++ b/code/game/machinery/deployable.dm
@@ -229,6 +229,13 @@ for reference:
if (src.health <= 0)
src.explode()
return
+ emp_act(severity)
+ if(stat & (BROKEN|NOPOWER))
+ return
+ if(prob(50/severity))
+ locked = !locked
+ anchored = !anchored
+ icon_state = "barrier[src.locked]"
meteorhit()
src.explode()
diff --git a/code/game/machinery/door_control.dm b/code/game/machinery/door_control.dm
index 6dfa0da691..c4e9fd0230 100644
--- a/code/game/machinery/door_control.dm
+++ b/code/game/machinery/door_control.dm
@@ -1,3 +1,36 @@
+/obj/machinery/door_control
+ name = "remote door-control"
+ desc = "It controls doors, remotely."
+ icon = 'icons/obj/stationobjs.dmi'
+ icon_state = "doorctrl0"
+ desc = "A remote control-switch for a door."
+ power_channel = ENVIRON
+ var/id = null
+ var/range = 10
+ var/normaldoorcontrol = 0
+ var/desiredstate = 0 // Zero is closed, 1 is open.
+ var/specialfunctions = 1
+ /*
+ Bitflag, 1= open
+ 2= idscan,
+ 4= bolts
+ 8= shock
+ 16= door safties
+
+ */
+
+ var/exposedwires = 0
+ var/wires = 3
+ /*
+ Bitflag, 1=checkID
+ 2=Network Access
+ */
+
+ anchored = 1.0
+ use_power = 1
+ idle_power_usage = 2
+ active_power_usage = 4
+
/obj/machinery/door_control/attack_ai(mob/user as mob)
if(wires & 2)
return src.attack_hand(user)
@@ -24,6 +57,10 @@
*/
if(istype(W, /obj/item/device/detective_scanner))
return
+ if(istype(W, /obj/item/weapon/card/emag))
+ req_access = list()
+ req_one_access = list()
+ playsound(src.loc, "sparks", 100, 1)
return src.attack_hand(user)
/obj/machinery/door_control/attack_hand(mob/user as mob)
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index f6592af522..0fb0293792 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -92,6 +92,7 @@ Airlock index -> wire color are { 9, 4, 6, 7, 5, 8, 1, 2, 3 }.
normalspeed = 1
var/obj/item/weapon/airlock_electronics/electronics = null
var/hasShocked = 0 //Prevents multiple shocks from happening
+ var/heat_proof = 0 // For glass airlocks
/obj/machinery/door/airlock/command
name = "Airlock"
@@ -216,6 +217,7 @@ Airlock index -> wire color are { 9, 4, 6, 7, 5, 8, 1, 2, 3 }.
opacity = 0
doortype = 21
glass = 1
+ heat_proof = 1
/obj/machinery/door/airlock/glass_mining
name = "Maintenance Hatch"
@@ -630,8 +632,15 @@ About the new airlock wires panel:
return 0
+/obj/machinery/door/airlock/update_heat_protection(var/turf/simulated/source)
+ if(istype(source))
+ if(src.density && (src.opacity || src.heat_proof))
+ source.thermal_conductivity = DOOR_HEAT_TRANSFER_COEFFICIENT
+ else
+ source.thermal_conductivity = initial(source.thermal_conductivity)
+
/obj/machinery/door/airlock/update_icon()
- if(overlays) overlays = null
+ if(overlays) overlays.Cut()
if(density)
if(locked && lights)
icon_state = "door_locked"
@@ -651,14 +660,14 @@ About the new airlock wires panel:
/obj/machinery/door/airlock/animate(animation)
switch(animation)
if("opening")
- if(overlays) overlays = null
+ if(overlays) overlays.Cut()
if(p_open)
spawn(2) // The only work around that works. Downside is that the door will be gone for a millisecond.
flick("o_door_opening", src) //can not use flick due to BYOND bug updating overlays right before flicking
else
flick("door_opening", src)
if("closing")
- if(overlays) overlays = null
+ if(overlays) overlays.Cut()
if(p_open)
flick("o_door_closing", src)
else
@@ -825,7 +834,8 @@ About the new airlock wires panel:
sleep(10)
//bring up airlock dialog
src.aiHacking = 0
- src.attack_ai(user)
+ if (user)
+ src.attack_ai(user)
/obj/machinery/door/airlock/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
if (src.isElectrified())
diff --git a/code/game/machinery/doors/airlock_electronics.dm b/code/game/machinery/doors/airlock_electronics.dm
index 6a57e7cc5e..2310e85c07 100644
--- a/code/game/machinery/doors/airlock_electronics.dm
+++ b/code/game/machinery/doors/airlock_electronics.dm
@@ -1,7 +1,7 @@
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31
/obj/item/weapon/airlock_electronics
- name = "Airlock Electronics"
+ name = "airlock electronics"
icon = 'icons/obj/doors/door_assembly.dmi'
icon_state = "door_electronics"
w_class = 2.0 //It should be tiny! -Agouri
diff --git a/code/game/machinery/doors/brigdoors.dm b/code/game/machinery/doors/brigdoors.dm
index 6e95c932ef..4d634d4589 100644
--- a/code/game/machinery/doors/brigdoors.dm
+++ b/code/game/machinery/doors/brigdoors.dm
@@ -219,7 +219,7 @@
// Adds an icon in case the screen is broken/off, stolen from status_display.dm
proc/set_picture(var/state)
picture_state = state
- overlays = null
+ overlays.Cut()
overlays += image('icons/obj/status_display.dmi', icon_state=picture_state)
@@ -227,10 +227,10 @@
// Stolen from status_display
proc/update_display(var/line1, var/line2)
if(line2 == null) // single line display
- overlays = null
+ overlays.Cut()
overlays += texticon(line1, 23, -13)
else // dual line display
- overlays = null
+ overlays.Cut()
overlays += texticon(line1, 23, -9)
overlays += texticon(line2, 23, -17)
// return an icon of a time text string (tn)
diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm
index c8ad53eb19..33cf295195 100644
--- a/code/game/machinery/doors/door.dm
+++ b/code/game/machinery/doors/door.dm
@@ -18,251 +18,275 @@
var/glass = 0
var/normalspeed = 1
- proc/bumpopen(mob/user as mob)
- proc/update_nearby_tiles(need_rebuild)
- proc/requiresID() return 1
- proc/animate(animation)
- proc/open()
- proc/close()
+/obj/machinery/door/New()
+ ..()
+ if(density)
+ layer = 3.1 //Above most items if closed
+ explosion_resistance = initial(explosion_resistance)
+ update_heat_protection(get_turf(src))
+ else
+ layer = 2.7 //Under all objects if opened. 2.7 due to tables being at 2.6
+ explosion_resistance = 0
+ update_nearby_tiles(need_rebuild=1)
+ return
- New()
- ..()
- if(density)
- layer = 3.1 //Above most items if closed
- explosion_resistance = initial(explosion_resistance)
- if(opacity)
- var/turf/T = get_turf(src)
- T.thermal_conductivity = DOOR_HEAT_TRANSFER_COEFFICIENT
- else
- layer = 2.7 //Under all objects if opened. 2.7 due to tables being at 2.6
- explosion_resistance = 0
- update_nearby_tiles(need_rebuild=1)
+
+/obj/machinery/door/Del()
+ density = 0
+ update_nearby_tiles()
+ ..()
+ return
+
+//process()
+ //return
+
+/obj/machinery/door/Bumped(atom/AM)
+ if(p_open || operating) return
+ if(ismob(AM))
+ var/mob/M = AM
+ if(world.time - M.last_bumped <= 10) return //Can bump-open one airlock per second. This is to prevent shock spam.
+ M.last_bumped = world.time
+ if(!M.restrained())
+ bumpopen(M)
return
-
- Del()
- density = 0
- update_nearby_tiles()
- ..()
- return
-
- //process()
- //return
-
- Bumped(atom/AM)
- if(p_open || operating) return
- if(ismob(AM))
- var/mob/M = AM
- if(world.time - M.last_bumped <= 10) return //Can bump-open one airlock per second. This is to prevent shock spam.
- M.last_bumped = world.time
- if(!M.restrained())
- bumpopen(M)
- return
-
- if(istype(AM, /obj/machinery/bot))
- var/obj/machinery/bot/bot = AM
- if(src.check_access(bot.botcard))
- if(density)
- open()
- return
-
- if(istype(AM, /obj/effect/critter))
- var/obj/effect/critter/critter = AM
- if(critter.opensdoors) return
- if(src.check_access_list(critter.access_list))
- if(density)
- open()
- return
-
- if(istype(AM, /obj/mecha))
- var/obj/mecha/mecha = AM
+ if(istype(AM, /obj/machinery/bot))
+ var/obj/machinery/bot/bot = AM
+ if(src.check_access(bot.botcard))
if(density)
- if(mecha.occupant && (src.allowed(mecha.occupant) || src.check_access_list(mecha.operation_req_access)))
- open()
- else
- flick("door_deny", src)
- return
+ open()
return
-
- CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
- if(air_group) return 0
- if(istype(mover) && mover.checkpass(PASSGLASS))
- return !opacity
- return !density
-
-
- bumpopen(mob/user as mob)
- if(operating) return
- src.add_fingerprint(user)
- if(!src.requiresID())
- user = null
-
+ if(istype(AM, /obj/mecha))
+ var/obj/mecha/mecha = AM
if(density)
- if(allowed(user)) open()
- else flick("door_deny", src)
- return
-
- meteorhit(obj/M as obj)
- src.open()
- return
-
-
- attack_ai(mob/user as mob)
- return src.attack_hand(user)
-
-
- attack_paw(mob/user as mob)
- return src.attack_hand(user)
-
-
- attack_hand(mob/user as mob)
- return src.attackby(user, user)
-
-
- attackby(obj/item/I as obj, mob/user as mob)
- if(istype(I, /obj/item/device/detective_scanner))
- return
- if(src.operating || isrobot(user)) return //borgs can't attack doors open because it conflicts with their AI-like interaction with them.
- src.add_fingerprint(user)
- if(!src.requiresID())
- user = null
- if(src.density && (istype(I, /obj/item/weapon/card/emag)||istype(I, /obj/item/weapon/melee/energy/blade)))
- flick("door_spark", src)
- sleep(6)
- open()
- operating = -1
- return 1
- if(src.allowed(user))
- if(src.density)
+ if(mecha.occupant && (src.allowed(mecha.occupant) || src.check_access_list(mecha.operation_req_access)))
open()
else
- close()
- return
- if(src.density)
- flick("door_deny", src)
- return
-
-
- blob_act()
- if(prob(40))
- del(src)
- return
-
-
- emp_act(severity)
- if(prob(20/severity) && (istype(src,/obj/machinery/door/airlock) || istype(src,/obj/machinery/door/window)) )
- open()
- if(prob(40/severity))
- if(secondsElectrified == 0)
- secondsElectrified = -1
- spawn(300)
- secondsElectrified = 0
- ..()
-
-
- ex_act(severity)
- switch(severity)
- if(1.0)
- del(src)
- if(2.0)
- if(prob(25))
- del(src)
- if(3.0)
- if(prob(80))
- var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
- s.set_up(2, 1, src)
- s.start()
- return
-
-
- update_icon()
- if(density)
- icon_state = "door1"
- else
- icon_state = "door0"
- return
-
-
- animate(animation)
- switch(animation)
- if("opening")
- if(p_open)
- flick("o_doorc0", src)
- else
- flick("doorc0", src)
- if("closing")
- if(p_open)
- flick("o_doorc1", src)
- else
- flick("doorc1", src)
- if("deny")
flick("door_deny", src)
return
+ return
- open()
- if(!density) return 1
- if(operating > 0) return
- if(!ticker) return 0
- if(!operating) operating = 1
-
- animate("opening")
- icon_state = "door0"
- src.SetOpacity(0)
- sleep(10)
- src.layer = 2.7
- src.density = 0
- explosion_resistance = 0
- update_icon()
- SetOpacity(0)
- update_nearby_tiles()
-
- if(operating) operating = 0
-
- if(autoclose && normalspeed)
- spawn(150)
- autoclose()
- if(autoclose && !normalspeed)
- spawn(5)
- autoclose()
-
- return 1
+/obj/machinery/door/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
+ if(air_group) return 0
+ if(istype(mover) && mover.checkpass(PASSGLASS))
+ return !opacity
+ return !density
- close()
- if(density) return 1
- if(operating) return
- operating = 1
+/obj/machinery/door/proc/bumpopen(mob/user as mob)
+ if(operating) return
+ src.add_fingerprint(user)
+ if(!src.requiresID())
+ user = null
- animate("closing")
- src.density = 1
- explosion_resistance = initial(explosion_resistance)
- src.layer = 3.1
- sleep(10)
- update_icon()
- if(visible && !glass)
- SetOpacity(1) //caaaaarn!
- operating = 0
- update_nearby_tiles()
+ if(density)
+ if(allowed(user)) open()
+ else flick("door_deny", src)
+ return
+
+/obj/machinery/door/meteorhit(obj/M as obj)
+ src.open()
+ return
+
+
+/obj/machinery/door/attack_ai(mob/user as mob)
+ return src.attack_hand(user)
+
+
+/obj/machinery/door/attack_paw(mob/user as mob)
+ return src.attack_hand(user)
+
+
+/obj/machinery/door/attack_hand(mob/user as mob)
+ return src.attackby(user, user)
+
+
+/obj/machinery/door/attackby(obj/item/I as obj, mob/user as mob)
+ if(istype(I, /obj/item/device/detective_scanner))
return
+ if(src.operating || isrobot(user)) return //borgs can't attack doors open because it conflicts with their AI-like interaction with them.
+ src.add_fingerprint(user)
+ if(!src.requiresID())
+ user = null
+ if(src.density && (istype(I, /obj/item/weapon/card/emag)||istype(I, /obj/item/weapon/melee/energy/blade)))
+ flick("door_spark", src)
+ sleep(6)
+ open()
+ operating = -1
+ return 1
+ if(src.allowed(user))
+ if(src.density)
+ open()
+ else
+ close()
+ return
+ if(src.density)
+ flick("door_deny", src)
+ return
- update_nearby_tiles(need_rebuild)
- if(!air_master) return 0
+/obj/machinery/door/blob_act()
+ if(prob(40))
+ del(src)
+ return
- var/turf/simulated/source = loc
- var/turf/simulated/north = get_step(source,NORTH)
- var/turf/simulated/south = get_step(source,SOUTH)
- var/turf/simulated/east = get_step(source,EAST)
- var/turf/simulated/west = get_step(source,WEST)
+/obj/machinery/door/emp_act(severity)
+ if(prob(20/severity) && (istype(src,/obj/machinery/door/airlock) || istype(src,/obj/machinery/door/window)) )
+ open()
+ if(prob(40/severity))
+ if(secondsElectrified == 0)
+ secondsElectrified = -1
+ spawn(300)
+ secondsElectrified = 0
+ ..()
+
+
+/obj/machinery/door/ex_act(severity)
+ switch(severity)
+ if(1.0)
+ del(src)
+ if(2.0)
+ if(prob(25))
+ del(src)
+ if(3.0)
+ if(prob(80))
+ var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
+ s.set_up(2, 1, src)
+ s.start()
+ return
+
+
+/obj/machinery/door/update_icon()
+ if(density)
+ icon_state = "door1"
+ else
+ icon_state = "door0"
+ return
+
+
+/obj/machinery/door/proc/animate(animation)
+ switch(animation)
+ if("opening")
+ if(p_open)
+ flick("o_doorc0", src)
+ else
+ flick("doorc0", src)
+ if("closing")
+ if(p_open)
+ flick("o_doorc1", src)
+ else
+ flick("doorc1", src)
+ if("deny")
+ flick("door_deny", src)
+ return
+
+
+/obj/machinery/door/proc/open()
+ if(!density) return 1
+ if(operating > 0) return
+ if(!ticker) return 0
+ if(!operating) operating = 1
+
+ animate("opening")
+ icon_state = "door0"
+ src.SetOpacity(0)
+ sleep(10)
+ src.layer = 2.7
+ src.density = 0
+ explosion_resistance = 0
+ update_icon()
+ SetOpacity(0)
+ update_nearby_tiles()
+
+ if(operating) operating = 0
+
+ if(autoclose && normalspeed)
+ spawn(150)
+ autoclose()
+ if(autoclose && !normalspeed)
+ spawn(5)
+ autoclose()
+
+ return 1
+
+
+/obj/machinery/door/proc/close()
+ if(density) return 1
+ if(operating) return
+ operating = 1
+
+ animate("closing")
+ src.density = 1
+ explosion_resistance = initial(explosion_resistance)
+ src.layer = 3.1
+ sleep(10)
+ update_icon()
+ if(visible && !glass)
+ SetOpacity(1) //caaaaarn!
+ operating = 0
+ update_nearby_tiles()
+ return
+
+/obj/machinery/door/proc/requiresID()
+ return 1
+
+/obj/machinery/door/proc/update_nearby_tiles(need_rebuild)
+ if(!air_master) return 0
+
+ var/turf/simulated/source = loc
+ var/turf/simulated/north = get_step(source,NORTH)
+ var/turf/simulated/south = get_step(source,SOUTH)
+ var/turf/simulated/east = get_step(source,EAST)
+ var/turf/simulated/west = get_step(source,WEST)
+
+ update_heat_protection(loc)
+
+ if(need_rebuild)
+ if(istype(source)) //Rebuild/update nearby group geometry
+ if(source.parent)
+ air_master.groups_to_rebuild += source.parent
+ else
+ air_master.tiles_to_update += source
+ if(istype(north))
+ if(north.parent)
+ air_master.groups_to_rebuild += north.parent
+ else
+ air_master.tiles_to_update += north
+ if(istype(south))
+ if(south.parent)
+ air_master.groups_to_rebuild += south.parent
+ else
+ air_master.tiles_to_update += south
+ if(istype(east))
+ if(east.parent)
+ air_master.groups_to_rebuild += east.parent
+ else
+ air_master.tiles_to_update += east
+ if(istype(west))
+ if(west.parent)
+ air_master.groups_to_rebuild += west.parent
+ else
+ air_master.tiles_to_update += west
+ else
+ if(istype(source)) air_master.tiles_to_update += source
+ if(istype(north)) air_master.tiles_to_update += north
+ if(istype(south)) air_master.tiles_to_update += south
+ if(istype(east)) air_master.tiles_to_update += east
+ if(istype(west)) air_master.tiles_to_update += west
+ return 1
+
+/obj/machinery/door/proc/update_heat_protection(var/turf/simulated/source)
+ if(istype(source))
if(src.density && src.opacity)
source.thermal_conductivity = DOOR_HEAT_TRANSFER_COEFFICIENT
else
source.thermal_conductivity = initial(source.thermal_conductivity)
- //not sure what the equivalent in zas is
+
+ //skytodo
/*if(need_rebuild)
if(istype(source)) //Rebuild/update nearby group geometry
if(source.parent)
@@ -298,7 +322,6 @@
return 1
-
/obj/machinery/door/proc/autoclose()
var/obj/machinery/door/airlock/A = src
if(!A.density && !A.operating && !A.locked && !A.welded && A.autoclose)
@@ -306,33 +329,4 @@
return
/obj/machinery/door/morgue
- icon = 'icons/obj/doors/doormorgue.dmi'
-
-/*
-/obj/machinery/door/airlock/proc/ion_act()
- if(src.z == 1 && src.density)
- if(length(req_access) > 0 && !(12 in req_access))
- if(prob(4))
- world << "\red Airlock emagged in [src.loc.loc]"
- src.operating = -1
- flick("door_spark", src)
- sleep(6)
- open()
- else
- if(prob(8))
- world << "\red non vital Airlock emagged in [src.loc.loc]"
- src.operating = -1
- flick("door_spark", src)
- sleep(6)
- open()
- return
-
-/obj/machinery/door/firedoor/proc/ion_act()
- if(src.z == 1)
- if(prob(15))
- if(density)
- open()
- else
- close()
- return
-*/
\ No newline at end of file
+ icon = 'icons/obj/doors/doormorgue.dmi'
\ No newline at end of file
diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm
index b755f16d0a..2fdb122e9a 100644
--- a/code/game/machinery/doors/firedoor.dm
+++ b/code/game/machinery/doors/firedoor.dm
@@ -209,7 +209,7 @@
update_icon()
- overlays = null
+ overlays.Cut()
if(density)
icon_state = "door_closed"
if(blocked)
@@ -221,4 +221,50 @@
return
-/obj/machinery/door/firedoor/border_only
\ No newline at end of file
+
+/obj/machinery/door/firedoor/border_only
+ icon = 'icons/obj/doors/edge_Doorfire.dmi'
+ glass = 1 //There is a glass window so you can see through the door
+ //This is needed due to BYOND limitations in controlling visibility
+
+ CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
+ if(istype(mover) && mover.checkpass(PASSGLASS))
+ return 1
+ if(get_dir(loc, target) == dir) //Make sure looking at appropriate border
+ if(air_group) return 0
+ return !density
+ else
+ return 1
+
+ CheckExit(atom/movable/mover as mob|obj, turf/target as turf)
+ if(istype(mover) && mover.checkpass(PASSGLASS))
+ return 1
+ if(get_dir(loc, target) == dir)
+ return !density
+ else
+ return 1
+
+
+ update_nearby_tiles(need_rebuild)
+ if(!air_master) return 0
+
+ var/turf/simulated/source = loc
+ var/turf/simulated/destination = get_step(source,dir)
+
+ update_heat_protection(loc)
+
+ if(need_rebuild)
+ if(istype(source)) //Rebuild/update nearby group geometry
+ if(source.parent)
+ air_master.groups_to_rebuild += source.parent
+ else
+ air_master.tiles_to_update += source
+ if(istype(destination))
+ if(destination.parent)
+ air_master.groups_to_rebuild += destination.parent
+ else
+ air_master.tiles_to_update += destination
+ else
+ if(istype(source)) air_master.tiles_to_update += source
+ if(istype(destination)) air_master.tiles_to_update += destination
+ return 1
diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm
index 7905fc559d..55aef446ea 100644
--- a/code/game/machinery/doors/windowdoor.dm
+++ b/code/game/machinery/doors/windowdoor.dm
@@ -6,6 +6,7 @@
var/base_state = "left"
var/health = 150.0 //If you change this, consiter changing ../door/window/brigdoor/ health at the bottom of this .dm file
visible = 0.0
+ use_power = 0
flags = ON_BORDER
opacity = 0
var/obj/item/weapon/airlock_electronics/electronics = null
@@ -157,7 +158,7 @@
return src.attack_hand(user)
/obj/machinery/door/window/attack_paw(mob/user as mob)
- if(istype(user, /mob/living/carbon/alien/humanoid) || istype(user, /mob/living/carbon/metroid/adult))
+ if(istype(user, /mob/living/carbon/alien/humanoid) || istype(user, /mob/living/carbon/slime/adult))
if(src.operating)
return
src.health = max(0, src.health - 25)
diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm
index ac2ec0da46..9de6b2c6aa 100644
--- a/code/game/machinery/flasher.dm
+++ b/code/game/machinery/flasher.dm
@@ -88,6 +88,14 @@
O.eye_stat += rand(0, 2)
+/obj/machinery/flasher/emp_act(severity)
+ if(stat & (BROKEN|NOPOWER))
+ ..(severity)
+ return
+ if(prob(75/severity))
+ flash()
+ ..(severity)
+
/obj/machinery/flasher/portable/HasProximity(atom/movable/AM as mob|obj)
if ((src.disable) || (src.last_flash && world.time < src.last_flash + 150))
return
@@ -104,7 +112,7 @@
if (!src.anchored)
user.show_message(text("\red [src] can now be moved."))
- src.overlays = null
+ src.overlays.Cut()
else if (src.anchored)
user.show_message(text("\red [src] is now secured."))
diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm
index 90b628d93e..5442248986 100644
--- a/code/game/machinery/hologram.dm
+++ b/code/game/machinery/hologram.dm
@@ -1,3 +1,10 @@
+/* Holograms!
+ * Contains:
+ * Holopad
+ * Hologram
+ * Other stuff
+ */
+
/*
Revised. Original based on space ninja hologram code. Which is also mine. /N
How it works:
@@ -12,11 +19,23 @@ Possible to do for anyone motivated enough:
Itegrate EMP effect to disable the unit.
*/
+
+/*
+ * Holopad
+ */
+
// HOLOPAD MODE
// 0 = RANGE BASED
// 1 = AREA BASED
var/const/HOLOPAD_MODE = 0
+/obj/machinery/hologram/holopad
+ name = "\improper AI holopad"
+ desc = "It's a floor-mounted device for projecting holographic images. It is activated remotely."
+ icon_state = "holopad0"
+ var/mob/living/silicon/ai/master//Which AI, if any, is controlling the object? Only one AI may control a hologram at any time.
+ var/last_request = 0 //to prevent request spam. ~Carn
+ var/holo_range = 5 // Change to change how far the AI can move away from the holopad before deactivating.
/obj/machinery/hologram/holopad/attack_hand(var/mob/living/carbon/human/user) //Carn: Hologram requests.
if(!istype(user))
@@ -120,6 +139,17 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/
return 1
+/*
+ * Hologram
+ */
+
+/obj/machinery/hologram
+ anchored = 1
+ use_power = 1
+ idle_power_usage = 5
+ active_power_usage = 100
+ var/obj/effect/overlay/hologram//The projection itself. If there is one, the instrument is on, off otherwise.
+
/obj/machinery/hologram/power_change()
if (powered())
stat &= ~NOPOWER
@@ -171,4 +201,13 @@ Holographic project of everything else.
world << "Your icon should appear now."
return
-*/
\ No newline at end of file
+*/
+
+/*
+ * Other Stuff: Is this even used?
+ */
+/obj/machinery/hologram/projector
+ name = "hologram projector"
+ desc = "It makes a hologram appear...with magnets or something..."
+ icon = 'icons/obj/stationobjs.dmi'
+ icon_state = "hologram0"
\ No newline at end of file
diff --git a/code/game/machinery/hydroponics.dm b/code/game/machinery/hydroponics.dm
index d1a5a3ff6c..aec6290da7 100644
--- a/code/game/machinery/hydroponics.dm
+++ b/code/game/machinery/hydroponics.dm
@@ -151,7 +151,7 @@ obj/machinery/hydroponics/process()
obj/machinery/hydroponics/proc/updateicon()
//Refreshes the icon and sets the luminosity
- overlays = null
+ overlays.Cut()
if(planted)
if(dead)
overlays += image('icons/obj/hydroponics.dmi', icon_state="[myseed.species]-dead")
@@ -729,15 +729,13 @@ obj/machinery/hydroponics/attackby(var/obj/item/O as obj, var/mob/user as mob)
del(O)
updateicon()
- else if (istype(O, /obj/item/weapon/plantbag))
+ else if (istype(O, /obj/item/weapon/storage/bag/plants))
attack_hand(user)
- var/obj/item/weapon/plantbag/S = O
+ var/obj/item/weapon/storage/bag/plants/S = O
for (var/obj/item/weapon/reagent_containers/food/snacks/grown/G in locate(user.x,user.y,user.z))
- if (S.contents.len < S.capacity)
- S.contents += G;
- else
- user << "\blue The plant bag is full."
+ if(!S.can_be_inserted(G))
return
+ S.handle_item_insertion(G, 1)
else if ( istype(O, /obj/item/weapon/pestspray) )
var/obj/item/pestkiller/myPKiller = O
@@ -812,6 +810,16 @@ obj/machinery/hydroponics/attackby(var/obj/item/O as obj, var/mob/user as mob)
parent.update_tray()
+/obj/item/seeds/grassseed/harvest(mob/user = usr)
+ var/obj/machinery/hydroponics/parent = loc //for ease of access
+ var/t_yield = round(yield*parent.yieldmod)
+
+ if(t_yield > 0)
+ var/obj/item/stack/tile/grass/new_grass = new/obj/item/stack/tile/grass(user.loc)
+ new_grass.amount = t_yield
+
+ parent.update_tray()
+
/obj/item/seeds/gibtomato/harvest(mob/user = usr)
var/produce = text2path(productname)
var/obj/machinery/hydroponics/parent = loc //for ease of access
@@ -1005,10 +1013,10 @@ obj/machinery/hydroponics/attackby(var/obj/item/O as obj, var/mob/user as mob)
icon = 'icons/obj/hydroponics.dmi'
icon_state = "soil"
density = 0
- New()
- ..()
+ use_power = 0
+
updateicon() // Same as normal but with the overlays removed - Cheridan.
- overlays = null
+ overlays.Cut()
if(planted)
if(dead)
overlays += image('icons/obj/hydroponics.dmi', icon_state="[myseed.species]-dead")
diff --git a/code/game/machinery/igniter.dm b/code/game/machinery/igniter.dm
index 0cacca07ed..817a3603e8 100755
--- a/code/game/machinery/igniter.dm
+++ b/code/game/machinery/igniter.dm
@@ -1,3 +1,15 @@
+/obj/machinery/igniter
+ name = "igniter"
+ desc = "It's useful for igniting plasma."
+ icon = 'icons/obj/stationobjs.dmi'
+ icon_state = "igniter1"
+ var/id = null
+ var/on = 1.0
+ anchored = 1.0
+ use_power = 1
+ idle_power_usage = 2
+ active_power_usage = 4
+
/obj/machinery/igniter/attack_ai(mob/user as mob)
return src.attack_hand(user)
@@ -100,6 +112,12 @@
location.hotspot_expose(1000,500,1)
return 1
+/obj/machinery/sparker/emp_act(severity)
+ if(stat & (BROKEN|NOPOWER))
+ ..(severity)
+ return
+ ignite()
+ ..(severity)
/obj/machinery/ignition_switch/attack_ai(mob/user as mob)
return src.attack_hand(user)
diff --git a/code/game/machinery/kitchen/gibber.dm b/code/game/machinery/kitchen/gibber.dm
index 5730462265..0a8bde59dd 100644
--- a/code/game/machinery/kitchen/gibber.dm
+++ b/code/game/machinery/kitchen/gibber.dm
@@ -50,7 +50,7 @@
src.overlays += image('icons/obj/kitchen.dmi', "grjam")
/obj/machinery/gibber/update_icon()
- overlays = null
+ overlays.Cut()
if (dirty)
src.overlays += image('icons/obj/kitchen.dmi', "grbloody")
if(stat & (NOPOWER|BROKEN))
diff --git a/code/game/machinery/kitchen/processor.dm b/code/game/machinery/kitchen/processor.dm
index b0e2d2ad4c..f5e5b2987d 100644
--- a/code/game/machinery/kitchen/processor.dm
+++ b/code/game/machinery/kitchen/processor.dm
@@ -60,9 +60,9 @@
..()
- metroid
- input = /mob/living/carbon/metroid
- output = /obj/item/weapon/reagent_containers/glass/beaker/roro
+ slime
+ input = /mob/living/carbon/slime
+ output = /obj/item/weapon/reagent_containers/glass/beaker/slime
monkey
process(loc, what)
@@ -82,7 +82,7 @@
for(var/datum/disease/D in O.viruses)
if(D.spread_type != SPECIAL)
- B.data["viruses"] = D.Copy()
+ B.data["viruses"] += D.Copy()
B.data["blood_DNA"] = copytext(O.dna.unique_enzymes,1,0)
if(O.resistances&&O.resistances.len)
diff --git a/code/game/machinery/kitchen/smartfridge.dm b/code/game/machinery/kitchen/smartfridge.dm
index 926e413378..d02e5fd4f4 100644
--- a/code/game/machinery/kitchen/smartfridge.dm
+++ b/code/game/machinery/kitchen/smartfridge.dm
@@ -12,23 +12,52 @@
active_power_usage = 100
flags = NOREACT
var/global/max_n_of_items = 999 // Sorry but the BYOND infinite loop detector doesn't look things over 1000.
+ var/icon_on = "smartfridge"
+ var/icon_off = "smartfridge-off"
var/item_quants = list()
var/ispowered = 1 //starts powered
var/isbroken = 0
+/obj/machinery/smartfridge/proc/accept_check(var/obj/item/O as obj)
+ if(istype(O,/obj/item/weapon/reagent_containers/food/snacks/grown/) || istype(O,/obj/item/seeds/))
+ return 1
+ return 0
+
+/obj/machinery/smartfridge/seeds
+ name = "\improper MegaSeed Servitor"
+ desc = "When you need seeds fast!"
+ icon = 'icons/obj/vending.dmi'
+ icon_state = "seeds"
+ icon_on = "seeds"
+ icon_off = "seeds-off"
+
+/obj/machinery/smartfridge/seeds/accept_check(var/obj/item/O as obj)
+ if(istype(O,/obj/item/seeds/))
+ return 1
+ return 0
+
+/obj/machinery/smartfridge/extract
+ name = "\improper Slime Extract Storage"
+ desc = "A refrigerated storage unit for slime extracts"
+
+/obj/machinery/smartfridge/extract/accept_check(var/obj/item/O as obj)
+ if(istype(O,/obj/item/slime_extract))
+ return 1
+ return 0
+
/obj/machinery/smartfridge/power_change()
if( powered() )
src.ispowered = 1
stat &= ~NOPOWER
if(!isbroken)
- icon_state = "smartfridge"
+ icon_state = icon_on
else
spawn(rand(0, 15))
src.ispowered = 0
stat |= NOPOWER
if(!isbroken)
- icon_state = "smartfridge-off"
+ icon_state = icon_off
/*******************
@@ -40,7 +69,7 @@
user << "\The [src] is unpowered and useless."
return
- if(istype(O,/obj/item/weapon/reagent_containers/food/snacks/grown/))
+ if(accept_check(O))
if(contents.len >= max_n_of_items)
user << "\The [src] is full."
return 1
@@ -54,20 +83,27 @@
user.visible_message("[user] has added \the [O] to \the [src].", \
"You add \the [O] to \the [src].")
- else if(istype(O, /obj/item/weapon/plantbag))
- user.visible_message("[user] loads \the [src] with \the [O].", \
- "You load \the [src] with \the [O].")
- for(var/obj/item/weapon/reagent_containers/food/snacks/grown/G in O.contents)
- if(contents.len >= max_n_of_items)
- user << "\The [src] is full."
- return 1
- else
- O.contents -= G
- G.loc = src
- if(item_quants[G.name])
- item_quants[G.name]++
+ else if(istype(O, /obj/item/weapon/storage/bag/plants))
+ var/obj/item/weapon/storage/bag/plants/P = O
+ var/plants_loaded = 0
+ for(var/obj/G in P.contents)
+ if(accept_check(G))
+ if(contents.len >= max_n_of_items)
+ user << "\The [src] is full."
+ return 1
else
- item_quants[G.name] = 1
+ P.remove_from_storage(G,src)
+ if(item_quants[G.name])
+ item_quants[G.name]++
+ else
+ item_quants[G.name] = 1
+ plants_loaded++
+ if(plants_loaded)
+
+ user.visible_message("[user] loads \the [src] with \the [P].", \
+ "You load \the [src] with \the [P].")
+ if(P.contents.len > 0)
+ user << "Some items are refused."
else
user << "\The [src] smartly refuses [O]."
@@ -104,13 +140,18 @@
dat += "[capitalize(O)]:"
dat += " [N] "
dat += "Vend "
- dat += "(x5)"
- dat += "(x10)"
- dat += "(x25)"
+ if(N > 5)
+ dat += "(x5)"
+ if(N > 10)
+ dat += "(x10)"
+ if(N > 25)
+ dat += "(x25)"
+ if(N > 1)
+ dat += "(All)"
dat += "
"
dat += ""
- user << browse("
Receiving Channel: [src.channel_name]
" //MARK
dat+="Message Author: [src.scanned_user]
"
dat+="Message Body: [src.msg]
"
+ dat+="Attach Photo: [(src.photo ? "Photo Attached" : "No Photo")]"
dat+="
Submit
Cancel
"
if(4)
dat+="Feed story successfully submitted to [src.channel_name].
"
@@ -292,8 +296,14 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
if( isemptylist(src.viewing_channel.messages) )
dat+="No feed messages found in channel...
"
else
+ var/i = 0
for(var/datum/feed_message/MESSAGE in src.viewing_channel.messages)
- dat+="-[MESSAGE.body]
\[Story by [MESSAGE.author]\]
"
+ i++
+ dat+="-[MESSAGE.body]
"
+ if(MESSAGE.img)
+ usr << browse_rsc(MESSAGE.img, "tmp_photo[i].png")
+ dat+="
"
+ dat+="\[Story by [MESSAGE.author]\]
"
dat+="
Refresh"
dat+="
Back"
if(10)
@@ -358,6 +368,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
dat+="
"
dat+="Criminal Name: [src.channel_name]
"
dat+="Description: [src.msg]
"
+ dat+="Attach Photo: [(src.photo ? "Photo Attached" : "No Photo")]"
if(wanted_already)
dat+="Wanted Issue created by: [news_network.wanted_issue.backup_author]
"
else
@@ -385,7 +396,13 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
dat+="-- STATIONWIDE WANTED ISSUE --
\[Submitted by: [news_network.wanted_issue.backup_author]\]
"
dat+="Criminal: [news_network.wanted_issue.author]
"
dat+="Description: [news_network.wanted_issue.body]
"
- dat+="
Back
"
+ dat+="Photo:: "
+ if(news_network.wanted_issue.img)
+ usr << browse_rsc(news_network.wanted_issue.img, "tmp_photow.png")
+ dat+="
"
+ else
+ dat+="None"
+ dat+="
Back
"
if(19)
dat+="Wanted issue for [src.channel_name] successfully edited.
"
dat+="
Return
"
@@ -473,6 +490,10 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
src.msg = copytext(src.msg,2,lentext(src.msg)+1)
src.updateUsrDialog()
+ else if(href_list["set_attachment"])
+ AttachPhoto(usr)
+ src.updateUsrDialog()
+
else if(href_list["submit_new_message"])
if(src.msg =="" || src.msg=="\[REDACTED\]" || src.scanned_user == "Unknown" || src.channel_name == "" )
src.screen=6
@@ -480,6 +501,8 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
var/datum/feed_message/newMsg = new /datum/feed_message
newMsg.author = src.scanned_user
newMsg.body = src.msg
+ if(photo)
+ newMsg.img = photo.img
feedback_inc("newscaster_stories",1)
for(var/datum/feed_channel/FC in news_network.network_channels)
if(FC.channel_name == src.channel_name)
@@ -553,6 +576,8 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
WANTED.author = src.channel_name
WANTED.body = src.msg
WANTED.backup_author = src.scanned_user //I know, a bit wacky
+ if(photo)
+ WANTED.img = photo.img
news_network.wanted_issue = WANTED
for(var/obj/machinery/newscaster/NEWSCASTER in allCasters)
NEWSCASTER.newsAlert()
@@ -565,6 +590,8 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
news_network.wanted_issue.author = src.channel_name
news_network.wanted_issue.body = src.msg
news_network.wanted_issue.backup_author = src.scanned_user
+ if(photo)
+ news_network.wanted_issue.img = photo.img
src.screen = 19
src.updateUsrDialog()
@@ -712,6 +739,16 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
user << "The newscaster controls are far too complicated for your tiny brain!"
return
+/obj/machinery/newscaster/proc/AttachPhoto(mob/user as mob)
+ if(photo)
+ photo.loc = src.loc
+ user.put_in_inactive_hand(photo)
+ photo = null
+ if(istype(user.get_active_hand(), /obj/item/weapon/photo))
+ photo = user.get_active_hand()
+ user.drop_item()
+ photo.loc = src
+
@@ -723,6 +760,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
/obj/item/weapon/newspaper
name = "newspaper"
desc = "An issue of The Griffon, the newspaper circulating aboard Nanotrasen Space Stations."
+ icon = 'icons/obj/bureaucracy.dmi'
icon_state = "newspaper"
w_class = 2 //Let's make it fit in trashbags!
attack_verb = list("bapped")
@@ -778,8 +816,14 @@ obj/item/weapon/newspaper/attack_self(mob/user as mob)
dat+="No Feed stories stem from this channel..."
else
dat+=""
+ var/i = 0
for(var/datum/feed_message/MESSAGE in C.messages)
- dat+="-[MESSAGE.body]
"
if(scribble_page==curr_page)
dat+="
\[Story by [MESSAGE.author]\]
"
+ i++
+ dat+="-[MESSAGE.body]
"
+ if(MESSAGE.img)
+ user << browse_rsc(MESSAGE.img, "tmp_photo[i].png")
+ dat+="
"
+ dat+="\[Story by [MESSAGE.author]\]
"
dat+="
There is a small scribble near the end of this page... It reads: \"[src.scribble]\""
@@ -790,7 +834,13 @@ obj/item/weapon/newspaper/attack_self(mob/user as mob)
if(src.important_message!=null)
dat+="
"
dat+="Criminal name: [important_message.author]
"
- dat+="Description: [important_message.body]"
+ dat+="Description: [important_message.body]
"
+ dat+="Photo:: "
+ if(important_message.img)
+ user << browse_rsc(important_message.img, "tmp_photow.png")
+ dat+="
"
+ else
+ dat+="None"
else
dat+="Apart from some uninteresting Classified ads, there's nothing on this page..."
if(scribble_page==curr_page)
diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm
index 06bd921dfb..f7b369ab85 100644
--- a/code/game/machinery/portable_turret.dm
+++ b/code/game/machinery/portable_turret.dm
@@ -449,9 +449,6 @@ Status: []
"},
var/list/secondarytargets = list() // targets that are least important
if(src.check_anomalies) // if its set to check for xenos/carps, check for non-mob "crittersssss"(And simple_animals)
- for (var/obj/effect/critter/L in view(7,src))
- if(L.alive)
- targets += L
for(var/mob/living/simple_animal/C in view(7,src))
if(!C.stat)
targets += C
@@ -506,15 +503,6 @@ Status: []
"},
spawn() popUp() // pop the turret up if it's not already up.
dir=get_dir(src,M) // even if you can't shoot, follow the target
spawn() shootAt(M) // shoot the target, finally
- else
-
- if (istype(t, /obj/effect/critter)) // shoot other things, same process as above
- var/obj/effect/critter/L = t
- if (L.alive==1)
- spawn() popUp()
- dir=get_dir(src,L)
- spawn() shootAt(L)
-
else
if(secondarytargets.len>0) // if there are no primary targets, go for secondary targets
diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm
index da44e9559b..10002bc570 100644
--- a/code/game/machinery/recharger.dm
+++ b/code/game/machinery/recharger.dm
@@ -80,6 +80,21 @@ obj/machinery/recharger/process()
else
icon_state = "recharger2"
+obj/machinery/recharger/emp_act(severity)
+ if(stat & (NOPOWER|BROKEN) || !anchored)
+ ..(severity)
+ return
+
+ if(istype(charging, /obj/item/weapon/gun/energy))
+ var/obj/item/weapon/gun/energy/E = charging
+ if(E.power_supply)
+ E.power_supply.emp_act(severity)
+
+ else if(istype(charging, /obj/item/weapon/melee/baton))
+ var/obj/item/weapon/melee/baton/B = charging
+ B.charges = 0
+ ..(severity)
+
obj/machinery/recharger/update_icon() //we have an update_icon() in addition to the stuff in process to make it feel a tiny bit snappier.
if(charging)
icon_state = "recharger1"
diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm
index 95d0f342e8..9912e2e85d 100644
--- a/code/game/machinery/rechargestation.dm
+++ b/code/game/machinery/rechargestation.dm
@@ -34,6 +34,15 @@
src.go_out()
return
+ emp_act(severity)
+ if(stat & (BROKEN|NOPOWER))
+ ..(severity)
+ return
+ if(occupant)
+ occupant.emp_act(severity)
+ go_out()
+ ..(severity)
+
proc
build_icon()
if(NOPOWER|BROKEN)
diff --git a/code/game/machinery/requests_console.dm b/code/game/machinery/requests_console.dm
index b294cf026e..ced7486384 100644
--- a/code/game/machinery/requests_console.dm
+++ b/code/game/machinery/requests_console.dm
@@ -56,6 +56,18 @@ var/list/obj/machinery/requests_console/allConsoles = list()
var/priority = -1 ; //Priority of the message being sent
luminosity = 0
+/obj/machinery/requests_console/power_change()
+ ..()
+ update_icon()
+
+/obj/machinery/requests_console/update_icon()
+ if(stat & NOPOWER)
+ if(icon_state != "req_comp_off")
+ icon_state = "req_comp_off"
+ else
+ if(icon_state == "req_comp_off")
+ icon_state = "req_comp0"
+
/obj/machinery/requests_console/New()
name = "[department] Requests Console"
allConsoles += src
@@ -95,6 +107,8 @@ var/list/obj/machinery/requests_console/allConsoles = list()
/obj/machinery/requests_console/attack_hand(user as mob)
+ if(..(user))
+ return
var/dat
dat = text("[department] Requests Console
")
if(!open)
@@ -231,7 +245,9 @@ var/list/obj/machinery/requests_console/allConsoles = list()
if(href_list["sendAnnouncement"])
if(!announcementConsole) return
- world << "[department] announcement: [message]"
+ for(var/mob/M in player_list)
+ if(!istype(M,/mob/new_player))
+ M << "[department] announcement: [message]"
announceAuth = 0
message = ""
screen = 0
@@ -370,7 +386,7 @@ var/list/obj/machinery/requests_console/allConsoles = list()
updateUsrDialog()
if(screen == 10)
var/obj/item/weapon/card/id/ID = O
- if (access_RC_announce in ID.access)
+ if (access_RC_announce in ID.GetAccess())
announceAuth = 1
else
announceAuth = 0
diff --git a/code/game/machinery/seed_extractor.dm b/code/game/machinery/seed_extractor.dm
index cd1621e4c3..615e52f398 100644
--- a/code/game/machinery/seed_extractor.dm
+++ b/code/game/machinery/seed_extractor.dm
@@ -45,4 +45,10 @@ obj/machinery/seed_extractor/attackby(var/obj/item/O as obj, var/mob/user as mob
t_amount++
del(O)
+ else if(istype(O, /obj/item/stack/tile/grass))
+ var/obj/item/stack/tile/grass/S = O
+ user << "You extract some seeds from the [S.name]."
+ S.use(1)
+ new /obj/item/seeds/grassseed(loc)
+
return
\ No newline at end of file
diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm
index 018609fc40..6b657bda78 100644
--- a/code/game/machinery/shieldgen.dm
+++ b/code/game/machinery/shieldgen.dm
@@ -331,7 +331,7 @@
icon_state = "Shield_Gen"
anchored = 0
density = 1
- req_access = list(access_security)
+ req_access = list(access_teleporter)
var/active = 0
var/power = 0
var/state = 0
diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm
index 65c618ef76..a27544b47c 100644
--- a/code/game/machinery/spaceheater.dm
+++ b/code/game/machinery/spaceheater.dm
@@ -23,7 +23,7 @@
return
update_icon()
- overlays = null
+ overlays.Cut()
icon_state = "sheater[on]"
if(open)
overlays += "sheater-open"
@@ -43,6 +43,13 @@
usr << "The charge meter reads [cell ? round(cell.percent(),1) : 0]%"
return
+ emp_act(severity)
+ if(stat & (BROKEN|NOPOWER))
+ ..(severity)
+ return
+ if(cell)
+ cell.emp_act(severity)
+ ..(severity)
attackby(obj/item/I, mob/user)
if(istype(I, /obj/item/weapon/cell))
diff --git a/code/game/machinery/status_display.dm b/code/game/machinery/status_display.dm
index e3d1d7454e..9c37b8212c 100644
--- a/code/game/machinery/status_display.dm
+++ b/code/game/machinery/status_display.dm
@@ -47,11 +47,17 @@
process()
if(stat & NOPOWER)
- overlays = null
+ overlays.Cut()
return
update()
+ emp_act(severity)
+ if(stat & (BROKEN|NOPOWER))
+ ..(severity)
+ return
+ set_picture("ai_bsod")
+ ..(severity)
// set what is displayed
@@ -62,7 +68,7 @@
return
if(mode==0)
- overlays = null
+ overlays.Cut()
return
if(mode==3) // alert picture, no change
@@ -83,7 +89,7 @@
update_display(displayloc, displaytime)
return
else
- overlays = null
+ overlays.Cut()
return
if(mode==4) // supply shuttle timer
@@ -154,7 +160,7 @@
proc/set_picture(var/state)
picture_state = state
- overlays = null
+ overlays.Cut()
overlays += image('icons/obj/status_display.dmi', icon_state=picture_state)
proc/update_display(var/line1, var/line2)
@@ -166,11 +172,11 @@
lastdisplayline2 = line2
if(line2 == null) // single line display
- overlays = null
+ overlays.Cut()
overlays += texticon(line1, 23, -13)
else // dual line display
- overlays = null
+ overlays.Cut()
overlays += texticon(line1, 23, -9)
overlays += texticon(line2, 23, -17)
@@ -266,15 +272,22 @@
process()
if(stat & NOPOWER)
- overlays = null
+ overlays.Cut()
return
update()
+ emp_act(severity)
+ if(stat & (BROKEN|NOPOWER))
+ ..(severity)
+ return
+ set_picture("ai_bsod")
+ ..(severity)
+
proc/update()
if(mode==0) //Blank
- overlays = null
+ overlays.Cut()
return
if(mode==1) // AI emoticon
@@ -325,5 +338,5 @@
proc/set_picture(var/state)
picture_state = state
- overlays = null
+ overlays.Cut()
overlays += image('icons/obj/status_display.dmi', icon_state=picture_state)
diff --git a/code/game/machinery/telecomms/broadcaster.dm b/code/game/machinery/telecomms/broadcaster.dm
index c57d612444..754d758248 100644
--- a/code/game/machinery/telecomms/broadcaster.dm
+++ b/code/game/machinery/telecomms/broadcaster.dm
@@ -286,7 +286,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
if (R.client && !(R.client.prefs.toggles & CHAT_RADIO)) //Adminning with 80 people on can be fun when you're trying to talk and all you can hear is radios.
continue
- if(istype(M, /mob/new_player)) // we don't want new players to hear messages. rare but generates runtimes.
+ if(istype(R, /mob/new_player)) // we don't want new players to hear messages. rare but generates runtimes.
continue
@@ -297,10 +297,10 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
// --- Can understand the speech ---
- if (R.say_understands(M))
+ if (!M || R.say_understands(M))
// - Not human or wearing a voice mask -
- if (!ishuman(M) || vmask)
+ if (!M || !ishuman(M) || vmask)
heard_masked += R
// - Human and not wearing voice mask -
@@ -371,7 +371,11 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
// --- Filter the message; place it in quotes apply a verb ---
- var/quotedmsg = M.say_quote(message)
+ var/quotedmsg = null
+ if(M)
+ quotedmsg = M.say_quote(message)
+ else
+ quotedmsg = "says, \"[message]\""
// --- This following recording is intended for research and feedback in the use of department radio channels ---
@@ -447,7 +451,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
// Does not display message; displayes the mob's voice_message (ie "chimpers")
if (length(heard_voice))
- var/rendered = "[part_a][vname][part_b][M.voice_message][part_c]"
+ var/rendered = "[part_a][vname][part_b][vmessage][part_c]"
for (var/mob/R in heard_voice)
aitrack = ""
@@ -464,7 +468,11 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
// Displays garbled message (ie "f*c* **u, **i*er!")
if (length(heard_garbled))
- quotedmsg = M.say_quote(stars(message))
+ if(M)
+ quotedmsg = M.say_quote(stars(message))
+ else
+ quotedmsg = stars(quotedmsg)
+
var/rendered = "[part_a][vname][part_b][quotedmsg][part_c]"
for (var/mob/R in heard_garbled)
@@ -482,8 +490,12 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
/* --- Complete gibberish. Usually happens when there's a compressed message --- */
if (length(heard_gibberish))
- quotedmsg = M.say_quote(Gibberish(message, compression + 50))
- var/rendered = "[part_a][Gibberish(M.real_name, compression + 50)][part_b][quotedmsg][part_c]"
+ if(M)
+ quotedmsg = M.say_quote(Gibberish(message, compression + 50))
+ else
+ quotedmsg = Gibberish(quotedmsg, compression + 50)
+
+ var/rendered = "[part_a][Gibberish(name, compression + 50)][part_b][quotedmsg][part_c]"
for (var/mob/R in heard_gibberish)
aitrack = ""
diff --git a/code/game/machinery/telecomms/logbrowser.dm b/code/game/machinery/telecomms/logbrowser.dm
index 77b266f73b..968b6cf1dc 100644
--- a/code/game/machinery/telecomms/logbrowser.dm
+++ b/code/game/machinery/telecomms/logbrowser.dm
@@ -82,8 +82,8 @@
else if(issilicon(M) || C.parameters["job"] == "AI") // sometimes M gets deleted prematurely for AIs... just check the job
race = "Artificial Life"
- else if(ismetroid(M)) // NT knows a lot about metroids, but not aliens. Can identify metroids
- race = "Metroid"
+ else if(isslime(M)) // NT knows a lot about slimes, but not aliens. Can identify slimes
+ race = "slime"
language = race
else if(isanimal(M))
diff --git a/code/game/machinery/telecomms/machine_interactions.dm b/code/game/machinery/telecomms/machine_interactions.dm
index d2eb29278f..da2af57a56 100644
--- a/code/game/machinery/telecomms/machine_interactions.dm
+++ b/code/game/machinery/telecomms/machine_interactions.dm
@@ -262,7 +262,7 @@
if(href_list["change_freq"])
var/newfreq = input(usr, "Specify a new frequency for new signals to change to. Enter null to turn off frequency changing. Decimals assigned automatically.", src, network) as null|num
- if(usr in range(1, src))
+ if(canAccess(usr))
if(newfreq)
if(findtext(num2text(newfreq), "."))
newfreq *= 10 // shift the decimal one place
@@ -302,13 +302,13 @@
if("id")
var/newid = copytext(reject_bad_text(input(usr, "Specify the new ID for this machine", src, id) as null|text),1,MAX_MESSAGE_LEN)
- if(newid && usr in range(1, src))
+ if(newid && canAccess(usr))
id = newid
temp = "-% New ID assigned: \"[id]\" %-"
if("network")
var/newnet = input(usr, "Specify the new network for this machine. This will break all current links.", src, network) as null|text
- if(newnet && usr in range(1, src))
+ if(newnet && canAccess(usr))
if(length(newnet) > 15)
temp = "-% Too many characters in new network tag %-"
@@ -324,7 +324,7 @@
if("freq")
var/newfreq = input(usr, "Specify a new frequency to filter (GHz). Decimals assigned automatically.", src, network) as null|num
- if(newfreq && usr in range(1, src))
+ if(newfreq && canAccess(usr))
if(findtext(num2text(newfreq), "."))
newfreq *= 10 // shift the decimal one place
if(!(newfreq in freq_listening) && newfreq < 10000)
@@ -384,5 +384,10 @@
updateUsrDialog()
+/obj/machinery/telecomms/proc/canAccess(var/mob/user)
+ if(issilicon(user) || in_range(user, src))
+ return 1
+ return 0
+
#undef TELECOMM_Z
#undef STATION_Z
diff --git a/code/game/machinery/telecomms/presets.dm b/code/game/machinery/telecomms/presets.dm
index 7ac1bccc06..0cd533cf27 100644
--- a/code/game/machinery/telecomms/presets.dm
+++ b/code/game/machinery/telecomms/presets.dm
@@ -30,7 +30,7 @@
id = "Hub"
network = "tcommsat"
autolinkers = list("hub", "relay", "s_relay", "m_relay", "r_relay", "science", "medical",
- "cargo", "mining", "common", "command", "engineering", "security",
+ "supply", "common", "command", "engineering", "security",
"receiverA", "receiverB", "broadcasterA", "broadcasterB")
//Receivers
@@ -41,7 +41,7 @@
id = "Receiver A"
network = "tcommsat"
autolinkers = list("receiverA") // link to relay
- freq_listening = list(1351, 1355, 1347, 1349) // science, medical, cargo, mining
+ freq_listening = list(1351, 1355, 1347) // science, medical, supply
//--PRESET RIGHT--//
@@ -64,23 +64,31 @@
/obj/machinery/telecomms/bus/preset_one
id = "Bus 1"
network = "tcommsat"
+ freq_listening = list(1351, 1355)
autolinkers = list("processor1", "science", "medical")
/obj/machinery/telecomms/bus/preset_two
id = "Bus 2"
network = "tcommsat"
- autolinkers = list("processor2", "cargo", "mining")
+ freq_listening = list(1347)
+ autolinkers = list("processor2", "supply")
/obj/machinery/telecomms/bus/preset_three
id = "Bus 3"
network = "tcommsat"
+ freq_listening = list(1359, 1353)
autolinkers = list("processor3", "security", "command")
/obj/machinery/telecomms/bus/preset_four
id = "Bus 4"
network = "tcommsat"
+ freq_listening = list(1357)
autolinkers = list("processor4", "engineering", "common")
+/obj/machinery/telecomms/bus/preset_four/New()
+ for(var/i = 1441, i < 1489, i += 2)
+ freq_listening |= i
+ ..()
//Processors
@@ -120,16 +128,16 @@
freq_listening = list(1355)
autolinkers = list("medical")
-/obj/machinery/telecomms/server/presets/cargo
- id = "Cargo Server"
+/obj/machinery/telecomms/server/presets/supply
+ id = "Supply Server"
freq_listening = list(1347)
- autolinkers = list("cargo")
-
+ autolinkers = list("supply")
+/*
/obj/machinery/telecomms/server/presets/mining
id = "Mining Server"
freq_listening = list(1349)
autolinkers = list("mining")
-
+*/
/obj/machinery/telecomms/server/presets/common
id = "Common Server"
freq_listening = list()
diff --git a/code/game/machinery/telecomms/telecomunications.dm b/code/game/machinery/telecomms/telecomunications.dm
index d74a2114d8..f3d8372353 100644
--- a/code/game/machinery/telecomms/telecomunications.dm
+++ b/code/game/machinery/telecomms/telecomunications.dm
@@ -332,11 +332,11 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list()
if(is_freq_listening(signal))
if(istype(machine_from, /obj/machinery/telecomms/receiver))
//If the signal is compressed, send it to the bus.
- relay_information(signal, "/obj/machinery/telecomms/bus") // ideally relay the copied information to bus units
+ relay_information(signal, "/obj/machinery/telecomms/bus", 1) // ideally relay the copied information to bus units
else
// Get a list of relays that we're linked to, then send the signal to their levels.
- relay_information(signal, "/obj/machinery/telecomms/relay")
- relay_information(signal, "/obj/machinery/telecomms/broadcaster") // Send it to a broadcaster.
+ relay_information(signal, "/obj/machinery/telecomms/relay", 1)
+ relay_information(signal, "/obj/machinery/telecomms/broadcaster", 1) // Send it to a broadcaster.
/*
@@ -417,12 +417,11 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list()
/obj/machinery/telecomms/bus/receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from)
if(is_freq_listening(signal))
- if(change_frequency)
- world << "changing [signal.frequency] to [change_frequency]"
+ if(change_frequency)
signal.frequency = change_frequency
- if(!istype(machine_from, /obj/machinery/telecomms/processor)) // Signal must be ready (stupid assuming machine), let's send it
+ if(!istype(machine_from, /obj/machinery/telecomms/processor) && machine_from != src) // Signal must be ready (stupid assuming machine), let's send it
// send to one linked processor unit
var/send_to_processor = relay_information(signal, "/obj/machinery/telecomms/processor")
@@ -519,11 +518,13 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list()
var/salt = "null" // encryption salt: ie "123comsat"
// would add up to md5("password123comsat")
var/language = "human"
+ var/obj/item/device/radio/headset/server_radio = null
/obj/machinery/telecomms/server/New()
..()
Compiler = new()
Compiler.Holder = src
+ server_radio = new()
/obj/machinery/telecomms/server/receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from)
diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm
index 6710e4b95c..916c745021 100644
--- a/code/game/machinery/teleporter.dm
+++ b/code/game/machinery/teleporter.dm
@@ -131,6 +131,23 @@
if(!T || istype(T, /area)) return null
return T
+/obj/machinery/teleport
+ name = "teleport"
+ icon = 'icons/obj/stationobjs.dmi'
+ density = 1
+ anchored = 1.0
+ var/lockeddown = 0
+
+
+/obj/machinery/teleport/hub
+ name = "teleporter hub"
+ desc = "It's the hub of a teleporting machine."
+ icon_state = "tele0"
+ var/accurate = 0
+ use_power = 1
+ idle_power_usage = 10
+ active_power_usage = 2000
+
/obj/machinery/teleport/hub/Bumped(M as mob|obj)
spawn()
if (src.icon_state == "tele1")
@@ -249,6 +266,17 @@
s.start()
return
*/
+
+/obj/machinery/teleport/station
+ name = "station"
+ desc = "It's the station thingy of a teleport thingy." //seriously, wtf.
+ icon_state = "controller"
+ var/active = 0
+ var/engaged = 0
+ use_power = 1
+ idle_power_usage = 10
+ active_power_usage = 2000
+
/obj/machinery/teleport/station/attackby(var/obj/item/weapon/W)
src.attack_hand()
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index f133ecc010..130993612e 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -1,15 +1,54 @@
-/obj/machinery/vending
- var/const/WIRE_EXTEND = 1
- var/const/WIRE_SCANID = 2
- var/const/WIRE_SHOCK = 3
- var/const/WIRE_SHOOTINV = 4
-
/datum/data/vending_product
var/product_name = "generic"
var/product_path = null
var/amount = 0
var/display_color = "blue"
+
+
+/obj/machinery/vending
+ name = "Vendomat"
+ desc = "A generic vending machine."
+ icon = 'icons/obj/vending.dmi'
+ icon_state = "generic"
+ layer = 2.9
+ anchored = 1
+ density = 1
+ var/active = 1 //No sales pitches if off!
+ var/vend_ready = 1 //Are we ready to vend?? Is it time??
+ var/vend_delay = 10 //How long does it take to vend?
+ var/product_paths = "" //String of product paths separated by semicolons. No spaces!
+ var/product_amounts = "" //String of product amounts separated by semicolons, must have amount for every path in product_paths
+ var/product_slogans = "" //String of slogans separated by semicolons, optional
+ var/product_ads = "" //String of small ad messages in the vending screen - random chance
+ var/product_hidden = "" //String of products that are hidden unless hacked.
+ var/product_hideamt = "" //String of hidden product amounts, separated by semicolons. Exact same as amounts. Must be left blank if hidden is.
+ var/product_coin = ""
+ var/product_coin_amt = ""
+ var/list/product_records = list()
+ var/list/hidden_records = list()
+ var/list/coin_records = list()
+ var/list/slogan_list = list()
+ var/list/small_ads = list() // small ad messages in the vending screen - random chance of popping up whenever you open it
+ var/vend_reply //Thank you for shopping!
+ var/last_reply = 0
+ var/last_slogan = 0 //When did we last pitch?
+ var/slogan_delay = 6000 //How long until we can pitch again?
+ var/icon_vend //Icon_state when vending!
+ var/icon_deny //Icon_state when vending!
+ //var/emagged = 0 //Ignores if somebody doesn't have card access to that machine.
+ var/seconds_electrified = 0 //Shock customers like an airlock.
+ var/shoot_inventory = 0 //Fire items at customers! We're broken!
+ var/shut_up = 0 //Stop spouting those godawful pitches!
+ var/extended_inventory = 0 //can we access the hidden inventory?
+ var/panel_open = 0 //Hacking that vending machine. Gonna get a free candy bar.
+ var/wires = 15
+ var/obj/item/weapon/coin/coin
+ var/const/WIRE_EXTEND = 1
+ var/const/WIRE_SCANID = 2
+ var/const/WIRE_SHOCK = 3
+ var/const/WIRE_SHOOTINV = 4
+
/obj/machinery/vending/New()
..()
spawn(4)
@@ -104,7 +143,7 @@
else if(istype(W, /obj/item/weapon/screwdriver))
src.panel_open = !src.panel_open
user << "You [src.panel_open ? "open" : "close"] the maintenance panel."
- src.overlays = null
+ src.overlays.Cut()
if(src.panel_open)
src.overlays += image(src.icon, "[initial(icon_state)]-panel")
src.updateUsrDialog()
@@ -455,3 +494,293 @@
else
return 0
+/*
+ * Vending machine types
+ */
+
+/*
+
+/obj/machinery/vending/[vendors name here] // --vending machine template :)
+ name = ""
+ desc = ""
+ icon = ''
+ icon_state = ""
+ product_paths = ""
+ product_amounts = ""
+ vend_delay = 15
+ product_hidden = ""
+ product_hideamt = ""
+ product_slogans = ""
+ product_ads = ""
+
+*/
+
+/*
+/obj/machinery/vending/atmospherics //Commenting this out until someone ponies up some actual working, broken, and unpowered sprites - Quarxink
+ name = "Tank Vendor"
+ desc = "A vendor with a wide variety of masks and gas tanks."
+ icon = 'icons/obj/objects.dmi'
+ icon_state = "dispenser"
+ product_paths = "/obj/item/weapon/tank/oxygen;/obj/item/weapon/tank/plasma;/obj/item/weapon/tank/emergency_oxygen;/obj/item/weapon/tank/emergency_oxygen/engi;/obj/item/clothing/mask/breath"
+ product_amounts = "10;10;10;5;25"
+ vend_delay = 0
+*/
+
+/obj/machinery/vending/boozeomat
+ name = "Booze-O-Mat"
+ desc = "A technological marvel, supposedly able to mix just the mixture you'd like to drink the moment you ask for one."
+ icon_state = "boozeomat" //////////////18 drink entities below, plus the glasses, in case someone wants to edit the number of bottles
+ icon_deny = "boozeomat-deny"
+ product_paths = "/obj/item/weapon/reagent_containers/food/drinks/bottle/gin;/obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey;/obj/item/weapon/reagent_containers/food/drinks/bottle/tequilla;/obj/item/weapon/reagent_containers/food/drinks/bottle/vodka;/obj/item/weapon/reagent_containers/food/drinks/bottle/vermouth;/obj/item/weapon/reagent_containers/food/drinks/bottle/rum;/obj/item/weapon/reagent_containers/food/drinks/bottle/wine;/obj/item/weapon/reagent_containers/food/drinks/bottle/cognac;/obj/item/weapon/reagent_containers/food/drinks/bottle/kahlua;/obj/item/weapon/reagent_containers/food/drinks/beer;/obj/item/weapon/reagent_containers/food/drinks/ale;/obj/item/weapon/reagent_containers/food/drinks/bottle/orangejuice;/obj/item/weapon/reagent_containers/food/drinks/bottle/tomatojuice;/obj/item/weapon/reagent_containers/food/drinks/bottle/limejuice;/obj/item/weapon/reagent_containers/food/drinks/bottle/cream;/obj/item/weapon/reagent_containers/food/drinks/tonic;/obj/item/weapon/reagent_containers/food/drinks/cola;/obj/item/weapon/reagent_containers/food/drinks/sodawater;/obj/item/weapon/reagent_containers/food/drinks/drinkingglass;/obj/item/weapon/reagent_containers/food/drinks/ice"
+ product_amounts = "5;5;5;5;5;5;5;5;5;6;6;4;4;4;4;8;8;15;30;9"
+ vend_delay = 15
+ product_hidden = "/obj/item/weapon/reagent_containers/food/drinks/tea"
+ product_hideamt = "10"
+ product_slogans = "I hope nobody asks me for a bloody cup o' tea...;Alcohol is humanity's friend. Would you abandon a friend?;Quite delighted to serve you!;Is nobody thirsty on this station?"
+ product_ads = "Drink up!;Booze is good for you!;Alcohol is humanity's best friend.;Quite delighted to serve you!;Care for a nice, cold beer?;Nothing cures you like booze!;Have a sip!;Have a drink!;Have a beer!;Beer is good for you!;Only the finest alcohol!;Best quality booze since 2053!;Award-winning wine!;Maximum alcohol!;Man loves beer.;A toast for progress!"
+ req_access_txt = "25"
+
+/obj/machinery/vending/assist
+ product_amounts = "5;3;4;1;4"
+ product_hidden = "/obj/item/device/flashlight;obj/item/device/assembly/timer"
+ product_paths = "/obj/item/device/assembly/prox_sensor;/obj/item/device/assembly/igniter;/obj/item/device/assembly/signaler;/obj/item/weapon/wirecutters;/obj/item/weapon/cartridge/signal"
+ product_hideamt = "5;2"
+ product_ads = "Only the finest!;Have some tools.;The most robust equipment.;The finest gear in space!"
+
+/obj/machinery/vending/coffee
+ name = "Hot Drinks machine"
+ desc = "A vending machine which dispenses hot drinks."
+ icon_state = "coffee"
+ icon_vend = "coffee-vend"
+ product_paths = "/obj/item/weapon/reagent_containers/food/drinks/coffee;/obj/item/weapon/reagent_containers/food/drinks/tea;/obj/item/weapon/reagent_containers/food/drinks/h_chocolate"
+ product_amounts = "25;25;25"
+ vend_delay = 34
+ product_hidden = "/obj/item/weapon/reagent_containers/food/drinks/ice"
+ product_ads = "Have a drink!;Drink up!;It's good for you!;Would you like a hot joe?;I'd kill for some coffee!;The best beans in the galaxy.;Only the finest brew for you.;Mmmm. Nothing like a coffee.;I like coffee, don't you?;Coffee helps you work!;Try some tea.;We hope you like the best!;Try our new chocolate!;Admin conspiracies"
+ product_hideamt = "10"
+
+/obj/machinery/vending/snack
+ name = "Getmore Chocolate Corp"
+ desc = "A snack machine courtesy of the Getmore Chocolate Corporation, based out of Mars"
+ icon_state = "snack"
+ product_paths = "/obj/item/weapon/reagent_containers/food/snacks/candy;/obj/item/weapon/reagent_containers/food/drinks/dry_ramen;/obj/item/weapon/reagent_containers/food/snacks/chips;/obj/item/weapon/reagent_containers/food/snacks/sosjerky;/obj/item/weapon/reagent_containers/food/snacks/no_raisin;/obj/item/weapon/reagent_containers/food/snacks/spacetwinkie;/obj/item/weapon/reagent_containers/food/snacks/cheesiehonkers"
+ product_amounts = "6;6;6;6;6;6;6"
+ product_slogans = "Try our new nougat bar!;Twice the calories for half the price!"
+ product_hidden = "/obj/item/weapon/reagent_containers/food/snacks/syndicake"
+ product_hideamt = "6"
+ product_ads = "The healthiest!;Award-winning chocolate bars!;Mmm! So good!;Oh my god it's so juicy!;Have a snack.;Snacks are good for you!;Have some more Getmore!;Best quality snacks straight from mars.;We love chocolate!;Try our new jerky!"
+
+
+/obj/machinery/vending/cola
+ name = "Robust Softdrinks"
+ desc = "A softdrink vendor provided by Robust Industries, LLC."
+ icon_state = "Cola_Machine"
+ product_paths = "/obj/item/weapon/reagent_containers/food/drinks/cola;/obj/item/weapon/reagent_containers/food/drinks/space_mountain_wind;/obj/item/weapon/reagent_containers/food/drinks/dr_gibb;/obj/item/weapon/reagent_containers/food/drinks/starkist;/obj/item/weapon/reagent_containers/food/drinks/space_up"
+ product_amounts = "10;10;10;10;10"
+ product_slogans = "Robust Softdrinks: More robust than a toolbox to the head!"
+ product_hidden = "/obj/item/weapon/reagent_containers/food/drinks/thirteenloko"
+ product_hideamt = "5"
+ product_ads = "Refreshing!;Hope you're thirsty!;Over 1 million drinks sold!;Thirsty? Why not cola?;Please, have a drink!;Drink up!;The best drinks in space."
+
+//This one's from bay12
+/obj/machinery/vending/cart
+ name = "PTech"
+ desc = "Cartridges for PDAs"
+ icon_state = "cart"
+ icon_deny = "cart-deny"
+ product_paths = "/obj/item/weapon/cartridge/medical;/obj/item/weapon/cartridge/engineering;/obj/item/weapon/cartridge/security;/obj/item/weapon/cartridge/janitor;/obj/item/weapon/cartridge/signal/toxins;/obj/item/device/pda/heads;/obj/item/weapon/cartridge/captain;/obj/item/weapon/cartridge/quartermaster"
+ product_amounts = "10;10;10;10;10;10;3;10"
+ product_slogans = "Carts to go!"
+ product_hidden = ""
+ product_hideamt = ""
+ product_coin = ""
+ product_coin_amt = ""
+
+/obj/machinery/vending/cigarette
+ name = "Cigarette machine" //OCD had to be uppercase to look nice with the new formating
+ desc = "If you want to get cancer, might as well do it in style"
+ icon_state = "cigs"
+ product_paths = "/obj/item/weapon/storage/fancy/cigarettes;/obj/item/weapon/storage/box/matches;/obj/item/weapon/lighter/random"
+ product_amounts = "10;10;4"
+ product_slogans = "Space cigs taste good like a cigarette should.;I'd rather toolbox than switch.;Smoke!;Don't believe the reports - smoke today!"
+ vend_delay = 34
+ product_hidden = "/obj/item/weapon/lighter/zippo"
+ product_hideamt = "4"
+ product_coin = "/obj/item/clothing/mask/cigarette/cigar/havana"
+ product_coin_amt = "2"
+ product_ads = "Probably not bad for you!;Don't believe the scientists!;It's good for you!;Don't quit, buy more!;Smoke!;Nicotine heaven.;Best cigarettes since 2150.;Award-winning cigs."
+
+/obj/machinery/vending/medical
+ name = "NanoMed Plus"
+ desc = "Medical drug dispenser."
+ icon_state = "med"
+ icon_deny = "med-deny"
+ req_access_txt = "5"
+ product_paths = "/obj/item/weapon/reagent_containers/glass/bottle/antitoxin;/obj/item/weapon/reagent_containers/glass/bottle/inaprovaline;/obj/item/weapon/reagent_containers/glass/bottle/stoxin;/obj/item/weapon/reagent_containers/glass/bottle/toxin;/obj/item/weapon/reagent_containers/syringe/antiviral;/obj/item/weapon/reagent_containers/syringe;/obj/item/device/healthanalyzer;/obj/item/weapon/reagent_containers/glass/beaker;/obj/item/weapon/reagent_containers/dropper"
+ product_amounts = "4;4;4;4;4;12;5;4;2"
+ product_hidden = "/obj/item/weapon/reagent_containers/pill/tox;/obj/item/weapon/reagent_containers/pill/stox;/obj/item/weapon/reagent_containers/pill/antitox"
+ product_hideamt = "3;4;6"
+ product_ads = "Go save some lives!;The best stuff for your medbay.;Only the finest tools.;Natural chemicals!;This stuff saves lives.;Don't you want some?;Ping!"
+
+//This one's from bay12
+/obj/machinery/vending/plasmaresearch
+ name = "Toximate 3000"
+ desc = "All the fine parts you need in one vending machine!"
+ product_paths = "/obj/item/clothing/under/rank/scientist;/obj/item/clothing/suit/bio_suit;/obj/item/clothing/head/bio_hood;/obj/item/device/transfer_valve;/obj/item/device/assembly/signaler;/obj/item/device/assembly/prox_sensor;/obj/item/device/assembly/igniter;/obj/item/device/assembly/timer"
+ product_amounts = "6;6;6;6;6"
+ product_hidden = ""
+ product_hideamt = ""
+ product_coin = ""
+ product_coin_amt = ""
+
+/obj/machinery/vending/wallmed1
+ name = "NanoMed"
+ desc = "Wall-mounted Medical Equipment dispenser."
+ icon_state = "wallmed"
+ icon_deny = "wallmed-deny"
+ req_access_txt = "5"
+ product_paths = "/obj/item/stack/medical/bruise_pack;/obj/item/stack/medical/ointment;/obj/item/weapon/reagent_containers/syringe/inaprovaline;/obj/item/device/healthanalyzer"
+ product_amounts = "2;2;4;1"
+ product_hidden = "/obj/item/weapon/reagent_containers/syringe/antitoxin;/obj/item/weapon/reagent_containers/syringe/antiviral;/obj/item/weapon/reagent_containers/pill/tox"
+ product_hideamt = "4;4;1"
+ density = 0 //It is wall-mounted, and thus, not dense. --Superxpdude
+ product_ads = "Go save some lives!;The best stuff for your medbay.;Only the finest tools.;Natural chemicals!;This stuff saves lives.;Don't you want some?"
+
+/obj/machinery/vending/wallmed2
+ name = "NanoMed"
+ desc = "Wall-mounted Medical Equipment dispenser."
+ icon_state = "wallmed"
+ icon_deny = "wallmed-deny"
+ req_access_txt = "5"
+ product_paths = "/obj/item/weapon/reagent_containers/syringe/inaprovaline;/obj/item/weapon/reagent_containers/syringe/antitoxin;/obj/item/stack/medical/bruise_pack;/obj/item/stack/medical/ointment;/obj/item/device/healthanalyzer"
+ product_amounts = "5;3;3;3;3"
+ product_hidden = "/obj/item/weapon/reagent_containers/pill/tox"
+ product_hideamt = "3"
+ density = 0 //It is wall-mounted, and thus, not dense. --Superxpdude
+
+/obj/machinery/vending/security
+ name = "SecTech"
+ desc = "A security equipment vendor"
+ icon_state = "sec"
+ icon_deny = "sec-deny"
+ req_access_txt = "1"
+ product_paths = "/obj/item/weapon/handcuffs;/obj/item/weapon/grenade/flashbang;/obj/item/device/flash;/obj/item/weapon/reagent_containers/food/snacks/donut/normal;/obj/item/weapon/storage/box/evidence"
+ product_amounts = "8;4;5;12;6"
+ product_hidden = "/obj/item/clothing/glasses/sunglasses;/obj/item/weapon/storage/fancy/donut_box"
+ product_hideamt = "2;2"
+ product_ads = "Crack capitalist skulls!;Beat some heads in!;Don't forget - harm is good!;Your weapons are right here.;Handcuffs!;Freeze, scumbag!;Don't tase me bro!;Tase them, bro.;Why not have a donut?"
+
+/obj/machinery/vending/hydronutrients
+ name = "NutriMax"
+ desc = "A plant nutrients vendor"
+ icon_state = "nutri"
+ icon_deny = "nutri-deny"
+ product_paths = "/obj/item/nutrient/ez;/obj/item/nutrient/l4z;/obj/item/nutrient/rh;/obj/item/weapon/pestspray;/obj/item/weapon/reagent_containers/syringe;/obj/item/weapon/storage/bag/plants"
+ product_amounts = "35;25;15;20;5;5"
+ product_slogans = "Aren't you glad you don't have to fertilize the natural way?;Now with 50% less stink!;Plants are people too!"
+ product_hidden = "/obj/item/weapon/reagent_containers/glass/bottle/ammonia;/obj/item/weapon/reagent_containers/glass/bottle/diethylamine"
+ product_hideamt = "10;5"
+ product_ads = "We like plants!;Don't you want some?;The greenest thumbs ever.;We like big plants.;Soft soil..."
+
+/obj/machinery/vending/hydroseeds
+ name = "MegaSeed Servitor"
+ desc = "When you need seeds fast!"
+ icon_state = "seeds"
+ product_paths = "/obj/item/seeds/bananaseed;/obj/item/seeds/berryseed;/obj/item/seeds/carrotseed;/obj/item/seeds/chantermycelium;/obj/item/seeds/chiliseed;/obj/item/seeds/cornseed;/obj/item/seeds/eggplantseed;/obj/item/seeds/potatoseed;/obj/item/seeds/replicapod;/obj/item/seeds/soyaseed;/obj/item/seeds/sunflowerseed;/obj/item/seeds/tomatoseed;/obj/item/seeds/towermycelium;/obj/item/seeds/wheatseed;/obj/item/seeds/appleseed;/obj/item/seeds/poppyseed;/obj/item/seeds/ambrosiavulgarisseed;/obj/item/seeds/whitebeetseed;/obj/item/seeds/watermelonseed;/obj/item/seeds/limeseed;/obj/item/seeds/lemonseed;/obj/item/seeds/orangeseed;/obj/item/seeds/grassseed;/obj/item/seeds/cocoapodseed;/obj/item/seeds/cabbageseed;/obj/item/seeds/grapeseed;/obj/item/seeds/pumpkinseed;/obj/item/seeds/cherryseed"
+ product_amounts = "3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3"
+ product_slogans = "THIS'S WHERE TH' SEEDS LIVE! GIT YOU SOME!;Hands down the best seed selection on the station!;Also certain mushroom varieties available, more for experts! Get certified today!"
+ product_hidden = "/obj/item/seeds/amanitamycelium;/obj/item/seeds/glowshroom;/obj/item/seeds/libertymycelium;/obj/item/seeds/nettleseed;/obj/item/seeds/plumpmycelium;/obj/item/seeds/reishimycelium"
+ product_hideamt = "2;2;2;2;2;2"
+ product_coin = "/obj/item/toy/waterflower"
+ product_coin_amt = "1"
+ product_ads = "We like plants!;Grow some crops!;Grow, baby, growww!;Aw h'yeah son!"
+
+/obj/machinery/vending/magivend
+ name = "MagiVend"
+ desc = "A magic vending machine."
+ icon_state = "MagiVend"
+ product_amounts = "1;1;1;1;1;2"
+ product_slogans = "Sling spells the proper way with MagiVend!;Be your own Houdini! Use MagiVend!"
+ product_paths = "/obj/item/clothing/head/wizard;/obj/item/clothing/suit/wizrobe;/obj/item/clothing/head/wizard/red;/obj/item/clothing/suit/wizrobe/red;/obj/item/clothing/shoes/sandal;/obj/item/weapon/staff"
+ vend_delay = 15
+ vend_reply = "Have an enchanted evening!"
+ product_hidden = "/obj/item/weapon/reagent_containers/glass/bottle/wizarditis" //No one can get to the machine to hack it anyways
+ product_hideamt = "1" //Just one, for the lulz, not like anyone can get it - Microwave
+ product_ads = "FJKLFJSD;AJKFLBJAKL;1234 LOONIES LOL!;>MFW;Kill them fuckers!;GET DAT FUKKEN DISK;HONK!;EI NATH;Destroy the station!;Admin conspiracies since forever!;Space-time bending hardware!"
+
+/obj/machinery/vending/dinnerware
+ name = "Dinnerware"
+ desc = "A kitchen and restaurant equipment vendor"
+ icon_state = "dinnerware"
+ product_paths = "/obj/item/weapon/tray;/obj/item/weapon/kitchen/utensil/fork;/obj/item/weapon/kitchenknife;/obj/item/weapon/reagent_containers/food/drinks/drinkingglass;/obj/item/clothing/suit/chef/classic"
+ product_amounts = "8;6;3;8;2"
+ //product_amounts = "8;5;4" Old totals
+ product_hidden = "/obj/item/weapon/kitchen/utensil/spoon;/obj/item/weapon/kitchen/utensil/knife;/obj/item/weapon/kitchen/rollingpin;/obj/item/weapon/butch"
+ product_hideamt = "2;2;2;2"
+ product_ads = "Mm, food stuffs!;Food and food accessories.;Get your plates!;You like forks?;I like forks.;Woo, utensils.;You don't really need these..."
+
+
+/obj/machinery/vending/sovietsoda
+ name = "BODA"
+ desc = "Old sweet water vending machine"
+ icon_state = "sovietsoda"
+ product_paths = "/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/soda"
+ product_amounts = "30"
+ //product_amounts = "8;5;4" Old totals
+ product_hidden = "/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/cola"
+ product_hideamt = "20"
+ product_ads = "For Tsar and Country.;Have you fulfilled your nutrition quota today?;Very nice!;We are simple people, for this is all we eat.;If there is a person, there is a problem. If there is no person, then there is no problem."
+
+/obj/machinery/vending/tool
+ name = "YouTool"
+ desc = "Tools for tools."
+ icon_state = "tool"
+ icon_deny = "tool-deny"
+ //req_access_txt = "12" //Maintenance access
+ product_paths = "/obj/item/weapon/cable_coil/random;/obj/item/weapon/crowbar;/obj/item/weapon/weldingtool;/obj/item/weapon/wirecutters;/obj/item/weapon/wrench;/obj/item/device/analyzer;/obj/item/device/t_scanner;/obj/item/weapon/screwdriver"
+ product_amounts = "10;5;3;5;5;5;5;5"
+ product_hidden = "/obj/item/weapon/weldingtool/hugeetank;/obj/item/clothing/gloves/fyellow"
+ product_hideamt = "2;2"
+ product_coin = "/obj/item/clothing/gloves/yellow"
+ product_coin_amt = "1"
+
+/obj/machinery/vending/engivend
+ name = "Engi-Vend"
+ desc = "Spare tool vending. What? Did you expect some witty description?"
+ icon_state = "engivend"
+ icon_deny = "engivend-deny"
+ req_access_txt = "11" //Engineering Equipment access
+ product_paths = "/obj/item/clothing/glasses/meson;/obj/item/device/multitool;/obj/item/weapon/airlock_electronics;/obj/item/weapon/module/power_control;/obj/item/weapon/cell/high"
+ product_amounts = "2;4;10;10;10"
+ product_hidden = "/obj/item/weapon/cell/potato"
+ product_hideamt = "3"
+ product_coin = "/obj/item/weapon/storage/belt/utility"
+ product_coin_amt = "3"
+
+//This one's from bay12
+/obj/machinery/vending/engineering
+ name = "Robco Tool Maker"
+ desc = "Everything you need for do-it-yourself station repair."
+ icon_state = "engi"
+ icon_deny = "engi-deny"
+ req_access_txt = "11"
+ product_paths = "/obj/item/clothing/under/rank/chief_engineer;/obj/item/clothing/under/rank/engineer;/obj/item/clothing/shoes/orange;/obj/item/clothing/head/helmet/hardhat;/obj/item/weapon/storage/belt/utility;/obj/item/clothing/glasses/meson;/obj/item/clothing/gloves/yellow;/obj/item/weapon/screwdriver;/obj/item/weapon/crowbar;/obj/item/weapon/wirecutters;/obj/item/device/multitool;/obj/item/weapon/wrench;/obj/item/device/t_scanner;/obj/item/weapon/CableCoil/power;/obj/item/weapon/circuitry;/obj/item/weapon/cell;/obj/item/weapon/weldingtool;/obj/item/clothing/head/helmet/welding;/obj/item/weapon/light/tube;/obj/item/clothing/suit/fire;/obj/item/weapon/stock_parts/scanning_module;/obj/item/weapon/stock_parts/micro_laser;/obj/item/weapon/stock_parts/matter_bin;/obj/item/weapon/stock_parts/manipulator;/obj/item/weapon/stock_parts/console_screen"
+// product_amounts = "4;4;4;4;4;4;4;12;12;12;12;12;12;8;4;8;8;8;10;4"
+ product_hidden = ""
+ product_hideamt = ""
+ product_coin = ""
+ product_coin_amt = ""
+
+//This one's from bay12
+/obj/machinery/vending/robotics
+ name = "Robotech Deluxe"
+ desc = "All the tools you need to create your own robot army."
+ icon_state = "robotics"
+ icon_deny = "robotics-deny"
+ req_access_txt = "29"
+ product_paths = "/obj/item/clothing/suit/storage/labcoat;/obj/item/clothing/under/rank/roboticist;/obj/item/weapon/cable_coil;/obj/item/device/flash;/obj/item/weapon/cell/high;/obj/item/device/assembly/prox_sensor;/obj/item/device/assembly/signaler;/obj/item/device/healthanalyzer;/obj/item/weapon/scalpel;/obj/item/weapon/circular_saw;/obj/item/weapon/tank/anesthetic;/obj/item/clothing/mask/medical;/obj/item/weapon/screwdriver;/obj/item/weapon/crowbar"
+ product_amounts = "4;4;4;4;12"
+ product_hidden = ""
+ product_hideamt = ""
+ product_coin = ""
+ product_coin_amt = ""
diff --git a/code/game/machinery/wishgranter.dm b/code/game/machinery/wishgranter.dm
index 17f29cd17d..786468c0c4 100644
--- a/code/game/machinery/wishgranter.dm
+++ b/code/game/machinery/wishgranter.dm
@@ -4,6 +4,7 @@
icon = 'icons/obj/device.dmi'
icon_state = "syndbeacon"
+ use_power = 0
anchored = 1
density = 1
diff --git a/code/game/mecha/combat/combat.dm b/code/game/mecha/combat/combat.dm
index 6c8ea5effc..f75bd01ac4 100644
--- a/code/game/mecha/combat/combat.dm
+++ b/code/game/mecha/combat/combat.dm
@@ -1,6 +1,5 @@
/obj/mecha/combat
- var/force = 30
- var/damtype = "brute"
+ force = 30
var/melee_cooldown = 10
var/melee_can_hit = 1
var/list/destroyable_obj = list(/obj/mecha, /obj/structure/window, /obj/structure/grille, /turf/simulated/wall)
diff --git a/code/game/mecha/combat/durand.dm b/code/game/mecha/combat/durand.dm
index 1ebba1bc23..9ee9f3c3ca 100644
--- a/code/game/mecha/combat/durand.dm
+++ b/code/game/mecha/combat/durand.dm
@@ -8,7 +8,7 @@
health = 400
deflect_chance = 20
damage_absorption = list("brute"=0.5,"fire"=1.1,"bullet"=0.65,"laser"=0.85,"energy"=0.9,"bomb"=0.8)
- max_temperature = 3000
+ max_temperature = 30000
infra_luminosity = 8
force = 40
var/defence = 0
diff --git a/code/game/mecha/combat/gygax.dm b/code/game/mecha/combat/gygax.dm
index dae8cd0698..7e8df94015 100644
--- a/code/game/mecha/combat/gygax.dm
+++ b/code/game/mecha/combat/gygax.dm
@@ -8,7 +8,7 @@
health = 300
deflect_chance = 15
damage_absorption = list("brute"=0.75,"fire"=1,"bullet"=0.8,"laser"=0.7,"energy"=0.85,"bomb"=1)
- max_temperature = 3500
+ max_temperature = 25000
infra_luminosity = 6
var/overload = 0
var/overload_coeff = 2
@@ -24,7 +24,7 @@
health = 400
deflect_chance = 25
damage_absorption = list("brute"=0.6,"fire"=0.8,"bullet"=0.6,"laser"=0.5,"energy"=0.65,"bomb"=0.8)
- max_temperature = 4500
+ max_temperature = 45000
overload_coeff = 1
wreckage = /obj/effect/decal/mecha_wreckage/gygax/dark
max_equip = 4
diff --git a/code/game/mecha/combat/honker.dm b/code/game/mecha/combat/honker.dm
index bc35b987e1..622d5bb8ef 100644
--- a/code/game/mecha/combat/honker.dm
+++ b/code/game/mecha/combat/honker.dm
@@ -8,7 +8,7 @@
deflect_chance = 60
internal_damage_threshold = 60
damage_absorption = list("brute"=1.2,"fire"=1.5,"bullet"=1,"laser"=1,"energy"=1,"bomb"=1)
- max_temperature = 3500
+ max_temperature = 25000
infra_luminosity = 5
operation_req_access = list(access_clown)
wreckage = /obj/effect/decal/mecha_wreckage/honker
diff --git a/code/game/mecha/combat/marauder.dm b/code/game/mecha/combat/marauder.dm
index 77e85890de..6e924e13eb 100644
--- a/code/game/mecha/combat/marauder.dm
+++ b/code/game/mecha/combat/marauder.dm
@@ -7,7 +7,7 @@
health = 500
deflect_chance = 25
damage_absorption = list("brute"=0.5,"fire"=0.7,"bullet"=0.45,"laser"=0.6,"energy"=0.7,"bomb"=0.7)
- max_temperature = 5000
+ max_temperature = 60000
infra_luminosity = 3
var/zoom = 0
var/thrusters = 0
diff --git a/code/game/mecha/combat/phazon.dm b/code/game/mecha/combat/phazon.dm
index d063fdf80c..b98f4697e5 100644
--- a/code/game/mecha/combat/phazon.dm
+++ b/code/game/mecha/combat/phazon.dm
@@ -9,7 +9,7 @@
health = 200
deflect_chance = 30
damage_absorption = list("brute"=0.7,"fire"=0.7,"bullet"=0.7,"laser"=0.7,"energy"=0.7,"bomb"=0.7)
- max_temperature = 1000
+ max_temperature = 25000
infra_luminosity = 3
wreckage = /obj/effect/decal/mecha_wreckage/phazon
add_req_access = 1
diff --git a/code/game/mecha/equipment/tools/medical_tools.dm b/code/game/mecha/equipment/tools/medical_tools.dm
index c68ca2d5af..28ccd5eccd 100644
--- a/code/game/mecha/equipment/tools/medical_tools.dm
+++ b/code/game/mecha/equipment/tools/medical_tools.dm
@@ -48,9 +48,9 @@
if(occupant)
occupant_message("The sleeper is already occupied")
return
- for(var/mob/living/carbon/metroid/M in range(1,target))
+ for(var/mob/living/carbon/slime/M in range(1,target))
if(M.Victim == target)
- occupant_message("[target] will not fit into the sleeper because they have a Metroid latched onto their head.")
+ occupant_message("[target] will not fit into the sleeper because they have a slime latched onto their head.")
return
occupant_message("You start putting [target] into [src].")
chassis.visible_message("[chassis] starts putting [target] into the [src].")
diff --git a/code/game/mecha/equipment/tools/tools.dm b/code/game/mecha/equipment/tools/tools.dm
index 23e6a872c4..0cb83e5ac5 100644
--- a/code/game/mecha/equipment/tools/tools.dm
+++ b/code/game/mecha/equipment/tools/tools.dm
@@ -792,7 +792,7 @@
ER.set_ready_state(1)
return
var/cur_charge = ER.chassis.get_charge()
- if(isnull(cur_charge))
+ if(isnull(cur_charge) || !ER.chassis.cell)
stop()
ER.set_ready_state(1)
ER.occupant_message("No powercell detected.")
diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm
index 4d6bd0dd53..c25616ae05 100644
--- a/code/game/mecha/equipment/weapons/weapons.dm
+++ b/code/game/mecha/equipment/weapons/weapons.dm
@@ -288,7 +288,7 @@
/obj/item/missile
icon = 'icons/obj/grenade.dmi'
- icon_state = "flashbang"
+ icon_state = "missile"
var/primed = null
throwforce = 15
diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm
index 22337b5996..108fdafdb6 100644
--- a/code/game/mecha/mech_fabricator.dm
+++ b/code/game/mecha/mech_fabricator.dm
@@ -84,7 +84,7 @@
/obj/item/mecha_parts/part/durand_right_leg,
/obj/item/mecha_parts/part/durand_armour
),
-/* "H.O.N.K"=list(
+ "H.O.N.K"=list(
/obj/item/mecha_parts/chassis/honker,
/obj/item/mecha_parts/part/honker_torso,
/obj/item/mecha_parts/part/honker_head,
@@ -92,7 +92,7 @@
/obj/item/mecha_parts/part/honker_right_arm,
/obj/item/mecha_parts/part/honker_left_leg,
/obj/item/mecha_parts/part/honker_right_leg
- ), */
+ ),
"Exosuit Equipment"=list(
/obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp,
/obj/item/mecha_parts/mecha_equipment/tool/drill,
@@ -106,9 +106,9 @@
///obj/item/mecha_parts/mecha_equipment/jetpack, //TODO MECHA JETPACK SPRITE MISSING
/obj/item/mecha_parts/mecha_equipment/weapon/energy/taser,
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg,
- /* /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/mousetrap_mortar,
+ /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/mousetrap_mortar,
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/banana_mortar,
- /obj/item/mecha_parts/mecha_equipment/weapon/honker*/
+ /obj/item/mecha_parts/mecha_equipment/weapon/honker
),
"Cyborg Upgrade Modules" = list(
@@ -401,17 +401,14 @@
/obj/machinery/mecha_part_fabricator/proc/process_queue()
var/obj/item/part = listgetindex(src.queue, 1)
if(!part)
- if(remove_from_queue(1))
+ remove_from_queue(1)
+ if(src.queue.len)
return process_queue()
else
- // Most likely means we have an empty queue, so stop processing
- return 0
+ return
if(!(part.vars.Find("construction_time")) || !(part.vars.Find("construction_cost")))//If it shouldn't be printed
- if(remove_from_queue(1))//Take it out of the quene
- return process_queue()//Then reprocess it
- else
- // Most likely means we have an empty queue, so stop processing
- return 0
+ remove_from_queue(1)//Take it out of the quene
+ return process_queue()//Then reprocess it
temp = null
while(part)
if(stat&(NOPOWER|BROKEN))
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index acf60d5dd3..84cc3d100d 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -49,7 +49,7 @@
var/obj/item/device/radio/radio = null
- var/max_temperature = 2500
+ var/max_temperature = 25000
var/internal_damage_threshold = 50 //health percentage below which internal damage is possible
var/internal_damage = 0 //contains bitflags
@@ -470,23 +470,6 @@
user.attack_log += text("\[[time_stamp()]\] attacked [src.name]")
return
-
-/obj/mecha/proc/attack_critter(obj/effect/critter/C)
- src.log_message("Attack by creature. Attacker - [C].",1)
- var/damage = max(0, rand(C.melee_damage_lower - 5, C.melee_damage_upper - 5 ))
-
- if(!prob(src.deflect_chance) && damage > 0)
- src.take_damage(damage)
- src.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST))
- playsound(src.loc, "sparks", 50, 1)
- visible_message("\red [C] hits [src.name]'s armor!")
- else
- src.log_append_to_last("Armor saved.")
- src.occupant_message("\blue [C]'s attack is stopped by the armor.")
- visible_message("\blue [C] rebounds off [src.name]'s armor!")
- return
-
-
/obj/mecha/hitby(atom/movable/A as mob|obj) //wrapper
src.log_message("Hit by [A].",1)
call((proc_res["dynhitby"]||src), "dynhitby")(A)
@@ -983,7 +966,7 @@
usr << "\red Access denied"
src.log_append_to_last("Permission denied.")
return
- for(var/mob/living/carbon/metroid/M in range(1,usr))
+ for(var/mob/living/carbon/slime/M in range(1,usr))
if(M.Victim == usr)
usr << "You're too busy getting your life sucked out of you."
return
@@ -1500,7 +1483,7 @@
return
if (href_list["change_name"])
if(usr != src.occupant) return
- var/newname = strip_html_simple(input(occupant,"Choose new exosuit name","Rename exosuit",initial(name)) as text)
+ var/newname = strip_html_simple(input(occupant,"Choose new exosuit name","Rename exosuit",initial(name)) as text, MAX_NAME_LEN)
if(newname && trim(newname))
name = newname
else
diff --git a/code/game/mecha/mecha_control_console.dm b/code/game/mecha/mecha_control_console.dm
index 57708a31c4..da461662f8 100644
--- a/code/game/mecha/mecha_control_console.dm
+++ b/code/game/mecha/mecha_control_console.dm
@@ -118,15 +118,14 @@
return M.get_log_html()
-/obj/item/weapon/storage/mechatrackingbox
-
+/obj/item/weapon/storage/box/mechabeacons
+ name = "Exosuit Tracking Beacons"
New()
- new /obj/item/mecha_parts/mecha_tracking(src)
- new /obj/item/mecha_parts/mecha_tracking(src)
- new /obj/item/mecha_parts/mecha_tracking(src)
- new /obj/item/mecha_parts/mecha_tracking(src)
- new /obj/item/mecha_parts/mecha_tracking(src)
- new /obj/item/mecha_parts/mecha_tracking(src)
- new /obj/item/mecha_parts/mecha_tracking(src)
..()
- return
+ new /obj/item/mecha_parts/mecha_tracking(src)
+ new /obj/item/mecha_parts/mecha_tracking(src)
+ new /obj/item/mecha_parts/mecha_tracking(src)
+ new /obj/item/mecha_parts/mecha_tracking(src)
+ new /obj/item/mecha_parts/mecha_tracking(src)
+ new /obj/item/mecha_parts/mecha_tracking(src)
+ new /obj/item/mecha_parts/mecha_tracking(src)
diff --git a/code/game/mecha/medical/odysseus.dm b/code/game/mecha/medical/odysseus.dm
index 379959925a..f3deea3626 100644
--- a/code/game/mecha/medical/odysseus.dm
+++ b/code/game/mecha/medical/odysseus.dm
@@ -4,7 +4,7 @@
icon_state = "odysseus"
initial_icon = "odysseus"
step_in = 2
- max_temperature = 1500
+ max_temperature = 15000
health = 120
wreckage = /obj/effect/decal/mecha_wreckage/odysseus
internal_damage_threshold = 35
diff --git a/code/game/mecha/working/ripley.dm b/code/game/mecha/working/ripley.dm
index 3288cc6971..2ad11bb021 100644
--- a/code/game/mecha/working/ripley.dm
+++ b/code/game/mecha/working/ripley.dm
@@ -2,9 +2,8 @@
desc = "Autonomous Power Loader Unit. The workhorse of the exosuit world."
name = "APLU \"Ripley\""
icon_state = "ripley"
- initial_icon = "ripley"
step_in = 6
- max_temperature = 1000
+ max_temperature = 20000
health = 200
wreckage = /obj/effect/decal/mecha_wreckage/ripley
var/list/cargo = new
@@ -20,8 +19,7 @@
desc = "Standart APLU chassis was refitted with additional thermal protection and cistern."
name = "APLU \"Firefighter\""
icon_state = "firefighter"
- initial_icon = "firefighter"
- max_temperature = 4500
+ max_temperature = 65000
health = 250
lights_power = 8
damage_absorption = list("fire"=0.5,"bullet"=0.8,"bomb"=0.5)
@@ -31,7 +29,6 @@
desc = "OH SHIT IT'S THE DEATHSQUAD WE'RE ALL GONNA DIE"
name = "DEATH-RIPLEY"
icon_state = "deathripley"
- initial_icon = "deathripley"
step_in = 2
opacity=0
lights_power = 60
@@ -47,7 +44,6 @@
/obj/mecha/working/ripley/mining
desc = "An old, dusty mining ripley."
name = "APLU \"Miner\""
- initial_icon = "ripley"
/obj/mecha/working/ripley/mining/New()
..()
@@ -114,16 +110,4 @@
return
-/obj/mecha/working/ripley/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if(istype(W, /obj/item/weapon/fluff/butcher_royce_1))
- src.icon_state = "titan"
- src.initial_icon = "titan"
- src.name = "APLU \"Titan's Fist\""
- src.desc = "This ordinary mining Ripley has been customized to look like a unit of the Titans Fist."
- user << "You spend some quality time with the Ripley, customising it to look like a \"Titan's Fist\" APLU."
- user.drop_item()
- del(W)
- return
- else
- ..()
\ No newline at end of file
diff --git a/code/game/objects/effects/aliens.dm b/code/game/objects/effects/aliens.dm
index 263e64d02a..b86bf3404d 100644
--- a/code/game/objects/effects/aliens.dm
+++ b/code/game/objects/effects/aliens.dm
@@ -358,8 +358,9 @@ Alien plants should do something if theres a lot of poison
*/
/var/const //for the status var
BURST = 0
- GROWING = 1
- GROWN = 2
+ BURSTING = 1
+ GROWING = 2
+ GROWN = 3
MIN_GROWTH_TIME = 1800 //time it takes to grow a hugger
MAX_GROWTH_TIME = 3000
@@ -394,8 +395,7 @@ Alien plants should do something if theres a lot of poison
return
if(GROWN)
user << "\red You retrieve the child."
- loc.contents += GetFacehugger()//need to write the code for giving it to the alien later
- Burst()
+ Burst(0)
return
else
return attack_hand(user)
@@ -416,12 +416,20 @@ Alien plants should do something if theres a lot of poison
proc/Burst(var/kill = 1) //drops and kills the hugger if any is remaining
var/obj/item/clothing/mask/facehugger/child = GetFacehugger()
- if(kill && istype(child))
- loc.contents += child
- child.Die()
-
icon_state = "egg_hatched"
- status = BURST
+ flick("egg_opening", src)
+ status = BURSTING
+ spawn(15)
+ status = BURST
+ loc.contents += child//need to write the code for giving it to the alien later
+ if(kill && istype(child))
+ child.Die()
+ else
+ for(var/mob/M in range(1,src))
+ if(CanHug(M))
+ child.Attach(M)
+ break
+
return
@@ -462,23 +470,12 @@ Alien plants should do something if theres a lot of poison
healthcheck()
/obj/effect/alien/egg/HasProximity(atom/movable/AM as mob|obj)
- if(!CanHug(AM))
- return
- if(status == GROWN && iscarbon(AM) && !isalien(AM))
-
- var/mob/living/carbon/C = AM
- if(C.stat == CONSCIOUS && C.has_disease(/datum/disease/alien_embryo))
+ if(status == GROWN)
+ if(!CanHug(AM))
return
- status = BURST
- flick("egg_opening", src) //Play animation
- var/turf/pos = get_turf(src)
- spawn(18) // Wait until the animation finishes
- Burst(0)
- var/obj/item/clothing/mask/facehugger/child = GetFacehugger()
- child.loc = pos
- if(!CanHug(AM))
- return
- if(AM && in_range(AM, pos))
- child.Attach(AM)
+ var/mob/living/carbon/C = AM
+ if(C.stat == CONSCIOUS && C.status_flags & XENO_HOST)
+ return
+ Burst(0)
diff --git a/code/game/objects/effects/decals/Cleanable/aliens.dm b/code/game/objects/effects/decals/Cleanable/aliens.dm
index b8b990f6ff..7ee6aaa3b5 100644
--- a/code/game/objects/effects/decals/Cleanable/aliens.dm
+++ b/code/game/objects/effects/decals/Cleanable/aliens.dm
@@ -26,7 +26,9 @@
if (i > 0)
var/obj/effect/decal/cleanable/xenoblood/b = new /obj/effect/decal/cleanable/xenoblood/xsplatter(src.loc)
for(var/datum/disease/D in src.viruses)
- b.viruses += D.Copy()
+ var/datum/disease/ND = D.Copy(1)
+ b.viruses += ND
+ ND.holder = b
if (step_to(src, get_step(src, direction), 0))
break
diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm
index 2086df3b85..516c0d74ca 100644
--- a/code/game/objects/effects/decals/Cleanable/humans.dm
+++ b/code/game/objects/effects/decals/Cleanable/humans.dm
@@ -71,7 +71,10 @@
if (i > 0)
var/obj/effect/decal/cleanable/blood/b = new /obj/effect/decal/cleanable/blood/splatter(src.loc)
for(var/datum/disease/D in src.viruses)
- b.viruses += D.Copy()
+ var/datum/disease/ND = D.Copy(1)
+ b.viruses += ND
+ ND.holder = b
+
if (step_to(src, get_step(src, direction), 0))
break
diff --git a/code/game/objects/effects/effect_system.dm b/code/game/objects/effects/effect_system.dm
index c6190a6a73..27afdadeca 100644
--- a/code/game/objects/effects/effect_system.dm
+++ b/code/game/objects/effects/effect_system.dm
@@ -457,13 +457,13 @@ steam.start() -- spawns the effect
var/area/A = get_area(location)
var/where = "[A.name] | [location.x], [location.y]"
- var/whereLink = "[where]"
+ var/whereLink = "[where]"
if(carry.my_atom.fingerprintslast)
var/mob/M = get_mob_by_key(carry.my_atom.fingerprintslast)
var/more = ""
if(M)
- more = "(?)"
+ more = "(?)"
message_admins("A chemical smoke reaction has taken place in ([whereLink])[contained]. Last associated key is [carry.my_atom.fingerprintslast][more].", 0, 1)
log_game("A chemical smoke reaction has taken place in ([where])[contained]. Last associated key is [carry.my_atom.fingerprintslast].")
else
diff --git a/code/game/objects/effects/gibs.dm b/code/game/objects/effects/gibs.dm
index 92be8ed4dd..ae8fc7220a 100644
--- a/code/game/objects/effects/gibs.dm
+++ b/code/game/objects/effects/gibs.dm
@@ -47,10 +47,10 @@
if(viruses.len > 0)
for(var/datum/disease/D in viruses)
if(prob(virusProb))
- var/datum/disease/viruus = D.Copy()
+ var/datum/disease/viruus = D.Copy(1)
gib.viruses += viruus
viruus.holder = gib
- viruus.spread_type = CONTACT_FEET
+
gib.blood_DNA = list()
if(MobDNA)
gib.blood_DNA[MobDNA.unique_enzymes] = MobDNA.b_type
diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm
index ba91849c24..b72dafb4c3 100644
--- a/code/game/objects/effects/landmarks.dm
+++ b/code/game/objects/effects/landmarks.dm
@@ -101,6 +101,8 @@
//SUBCLASSES. Spawn a bunch of items and disappear likewise
/obj/effect/landmark/costume/chicken/New()
new /obj/item/clothing/suit/chickensuit(src.loc)
+ new /obj/item/clothing/head/chicken(src.loc)
+ new /obj/item/weapon/reagent_containers/food/snacks/egg(src.loc)
del(src)
/obj/effect/landmark/costume/gladiator/New()
@@ -171,7 +173,7 @@
/obj/effect/landmark/costume/nightowl/New()
new /obj/item/clothing/under/owl(src.loc)
- new /obj/item/clothing/mask/owl_mask(src.loc)
+ new /obj/item/clothing/mask/gas/owl_mask(src.loc)
del(src)
/obj/effect/landmark/costume/waiter/New()
@@ -218,6 +220,7 @@
/obj/effect/landmark/costume/fakewizard/New()
new /obj/item/clothing/suit/wizrobe/fake(src.loc)
new /obj/item/clothing/head/wizard/fake(src.loc)
+ new /obj/item/weapon/staff/(src.loc)
del(src)
/obj/effect/landmark/costume/sexyclown/New()
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index b2c9caaa15..a74f1a170a 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -3,9 +3,7 @@
icon = 'icons/obj/items.dmi'
var/icon/blood_overlay = null //this saves our blood splatter overlay, which will be processed not to go over the edges of the sprite
var/abstract = 0
- var/force = 0
var/item_state = null
- var/damtype = "brute"
var/r_speed = 1.0
var/health = null
var/burn_point = null
@@ -63,6 +61,16 @@
/obj/item/blob_act()
return
+//user: The mob that is suiciding
+//damagetype: The type of damage the item will inflict on the user
+//bruteloss = 1
+//fireloss = 2
+//toxloss = 4
+//oxyloss = 8
+//This proc will return an array. The first element of the list should always be the suicide message that players will see, next is the damagetype
+/obj/item/proc/suicide_act(mob/user)
+ return
+
/obj/item/verb/move_to_top()
set name = "Move To Top"
set category = "Object"
@@ -163,22 +171,36 @@
user.put_in_active_hand(src)
return
+// Due to storage type consolidation this should get used more now.
+// I have cleaned it up a little, but it could probably use more. -Sayu
/obj/item/attackby(obj/item/weapon/W as obj, mob/user as mob)
-
if(istype(W,/obj/item/weapon/storage))
var/obj/item/weapon/storage/S = W
if(S.use_to_pickup)
- if(!S.can_be_inserted(src))
- return
if(S.collection_mode) //Mode is set to collect all items on a tile and we clicked on a valid one.
if(isturf(src.loc))
- for(var/obj/item/I in src.loc)
- if(I != src) //We'll do the one we clicked on last.
- if(!S.can_be_inserted(I))
- continue
- S.handle_item_insertion(I, 1) //The 1 stops the "You put the [src] into [S]" insertion message from being displayed.
- S.handle_item_insertion(src)
+ var/list/rejections = list()
+ var/success = 0
+ var/failure = 0
+ for(var/obj/item/I in src.loc)
+ if(I.type in rejections) // To limit bag spamming: any given type only complains once
+ continue
+ if(!S.can_be_inserted(I)) // Note can_be_inserted still makes noise when the answer is no
+ rejections += I.type // therefore full bags are still a little spammy
+ failure = 1
+ continue
+ success = 1
+ S.handle_item_insertion(I, 1) //The 1 stops the "You put the [src] into [S]" insertion message from being displayed.
+ if(success && !failure)
+ user << "You put everything in [S]."
+ else if(success)
+ user << "You put some things in [S]."
+ else
+ user << "You fail to pick anything up with [S]."
+
+ else if(S.can_be_inserted(src))
+ S.handle_item_insertion(src)
return
@@ -225,75 +247,75 @@
power *= 2
if(!istype(M, /mob/living/carbon/human))
- if(istype(M, /mob/living/carbon/metroid))
- var/mob/living/carbon/metroid/Metroid = M
+ if(istype(M, /mob/living/carbon/slime))
+ var/mob/living/carbon/slime/slime = M
if(prob(25))
user << "\red [src] passes right through [M]!"
return
if(power > 0)
- Metroid.attacked += 10
+ slime.attacked += 10
- if(Metroid.Discipline && prob(50)) // wow, buddy, why am I getting attacked??
- Metroid.Discipline = 0
+ if(slime.Discipline && prob(50)) // wow, buddy, why am I getting attacked??
+ slime.Discipline = 0
if(power >= 3)
- if(istype(Metroid, /mob/living/carbon/metroid/adult))
+ if(istype(slime, /mob/living/carbon/slime/adult))
if(prob(5 + round(power/2)))
- if(Metroid.Victim)
- if(prob(80) && !Metroid.client)
- Metroid.Discipline++
- Metroid.Victim = null
- Metroid.anchored = 0
+ if(slime.Victim)
+ if(prob(80) && !slime.client)
+ slime.Discipline++
+ slime.Victim = null
+ slime.anchored = 0
spawn()
- if(Metroid)
- Metroid.SStun = 1
+ if(slime)
+ slime.SStun = 1
sleep(rand(5,20))
- if(Metroid)
- Metroid.SStun = 0
+ if(slime)
+ slime.SStun = 0
spawn(0)
- if(Metroid)
- Metroid.canmove = 0
- step_away(Metroid, user)
+ if(slime)
+ slime.canmove = 0
+ step_away(slime, user)
if(prob(25 + power))
sleep(2)
- if(Metroid && user)
- step_away(Metroid, user)
- Metroid.canmove = 1
+ if(slime && user)
+ step_away(slime, user)
+ slime.canmove = 1
else
if(prob(10 + power*2))
- if(Metroid)
- if(Metroid.Victim)
- if(prob(80) && !Metroid.client)
- Metroid.Discipline++
+ if(slime)
+ if(slime.Victim)
+ if(prob(80) && !slime.client)
+ slime.Discipline++
- if(Metroid.Discipline == 1)
- Metroid.attacked = 0
+ if(slime.Discipline == 1)
+ slime.attacked = 0
spawn()
- if(Metroid)
- Metroid.SStun = 1
+ if(slime)
+ slime.SStun = 1
sleep(rand(5,20))
- if(Metroid)
- Metroid.SStun = 0
+ if(slime)
+ slime.SStun = 0
- Metroid.Victim = null
- Metroid.anchored = 0
+ slime.Victim = null
+ slime.anchored = 0
spawn(0)
- if(Metroid && user)
- step_away(Metroid, user)
- Metroid.canmove = 0
+ if(slime && user)
+ step_away(slime, user)
+ slime.canmove = 0
if(prob(25 + power*4))
sleep(2)
- if(Metroid && user)
- step_away(Metroid, user)
- Metroid.canmove = 1
+ if(slime && user)
+ step_away(slime, user)
+ slime.canmove = 1
var/showname = "."
@@ -319,7 +341,7 @@
else
switch(src.damtype)
if("brute")
- if(istype(src, /mob/living/carbon/metroid))
+ if(istype(src, /mob/living/carbon/slime))
M.adjustBrainLoss(power)
else
@@ -504,6 +526,10 @@
if(!disable_warning)
usr << "You somehow have a suit with no defined allowed items for suit storage, stop that."
return 0
+ if(src.w_class > 3)
+ if(!disable_warning)
+ usr << "The [name] is too big to attach."
+ return 0
if( istype(src, /obj/item/device/pda) || istype(src, /obj/item/weapon/pen) || is_type_in_list(src, H.wear_suit.allowed) )
return 1
return 0
@@ -623,7 +649,7 @@
user << "\red You're going to need to remove that mask/helmet/glasses first."
return
- if(istype(M, /mob/living/carbon/alien) || istype(M, /mob/living/carbon/metroid))//Aliens don't have eyes./N Metroids also don't have eyes!
+ if(istype(M, /mob/living/carbon/alien) || istype(M, /mob/living/carbon/slime))//Aliens don't have eyes./N slimes also don't have eyes!
user << "\red You cannot locate any eyes on this creature!"
return
diff --git a/code/game/objects/items/apc_frame.dm b/code/game/objects/items/apc_frame.dm
index 03c43d2b09..4ed920fd12 100644
--- a/code/game/objects/items/apc_frame.dm
+++ b/code/game/objects/items/apc_frame.dm
@@ -37,7 +37,7 @@
else
var/obj/item/weapon/cable_coil/C = new /obj/item/weapon/cable_coil(loc)
C.amount = 10
- usr << "You cut cables and disassemble the unused power terminal."
+ usr << "You cut the cables and disassemble the unused power terminal."
del(T)
new /obj/machinery/power/apc(loc, ndir, 1)
del(src)
diff --git a/code/game/objects/items/blueprints.dm b/code/game/objects/items/blueprints.dm
index 15fc782f0d..508af9a598 100644
--- a/code/game/objects/items/blueprints.dm
+++ b/code/game/objects/items/blueprints.dm
@@ -64,7 +64,7 @@ move an amendment to the drawing.
This place doesn't noted on these blueprints.
+This place isn't noted on these blueprints.
"} else return @@ -114,7 +114,7 @@ move an amendment to the drawing. usr << "\red Error! Please notify administration!" return var/list/turf/turfs = res - var/str = sanitize(trim(input(usr,"New area title","Blueprints editing"))) + var/str = trim(stripped_input(usr,"New area title","Blueprints editing", "", MAX_NAME_LEN)) if(!str || !length(str)) //cancel return if(length(str) > 50) @@ -147,7 +147,7 @@ move an amendment to the drawing. var/area/A = get_area() //world << "DEBUG: edit_area" var/prevname = A.name - var/str = sanitize(trim(input(usr,"New area title","Blueprints editing",prevname))) + var/str = trim(stripped_input(usr,"New area title","Blueprints editing", prevname, MAX_NAME_LEN)) if(!str || !length(str) || str==prevname) //cancel return if(length(str) > 50) diff --git a/code/game/objects/items/bodybag.dm b/code/game/objects/items/bodybag.dm index 4cf441e2be..1c6fe70e8c 100644 --- a/code/game/objects/items/bodybag.dm +++ b/code/game/objects/items/bodybag.dm @@ -2,7 +2,7 @@ /obj/item/bodybag name = "body bag" - desc = "A folded bag designed to contain dead things." + desc = "A folded bag designed for the storage and transportation of cadavers." icon = 'icons/obj/bodybag.dmi' icon_state = "bodybag_folded" @@ -12,29 +12,24 @@ del(src) -/obj/item/weapon/storage/body_bag_box +/obj/item/weapon/storage/box/bodybags name = "body bags" desc = "This box contains body bags." icon_state = "bodybags" - item_state = "syringe_kit" - foldable = /obj/item/stack/sheet/cardboard //BubbleWrap - - New() - new /obj/item/bodybag(src) - new /obj/item/bodybag(src) - new /obj/item/bodybag(src) - new /obj/item/bodybag(src) - new /obj/item/bodybag(src) - new /obj/item/bodybag(src) - new /obj/item/bodybag(src) ..() - return + new /obj/item/bodybag(src) + new /obj/item/bodybag(src) + new /obj/item/bodybag(src) + new /obj/item/bodybag(src) + new /obj/item/bodybag(src) + new /obj/item/bodybag(src) + new /obj/item/bodybag(src) /obj/structure/closet/body_bag name = "body bag" - desc = "A bag designed to contain dead things." + desc = "A plastic bag designed for the storage and transportation of cadavers." icon = 'icons/obj/bodybag.dmi' icon_state = "bodybag_closed" icon_closed = "bodybag_closed" @@ -61,7 +56,7 @@ else if(istype(W, /obj/item/weapon/wirecutters)) user << "You cut the tag off the bodybag" src.name = "body bag" - src.overlays = null + src.overlays.Cut() return diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index 4fe457094f..836657f587 100755 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -37,6 +37,7 @@ var/global/list/obj/item/device/pda/PDAs = list() var/notehtml = "" var/cart = "" //A place to stick cartridge menu information var/detonate = 1 // Can the PDA be blown up? + var/hidden = 0 // Is the PDA hidden from the PDA list? var/obj/item/weapon/card/id/id = null //Making it possible to slot an ID card into the PDA so it can function as both. var/ownjob = null //related to above @@ -129,7 +130,7 @@ var/global/list/obj/item/device/pda/PDAs = list() icon_state = "pda-syn" name = "Military PDA" owner = "John Doe" - toff = 1 + hidden = 1 /obj/item/device/pda/chaplain icon_state = "pda-holy" @@ -165,6 +166,7 @@ var/global/list/obj/item/device/pda/PDAs = list() icon_state = "pda-bar" /obj/item/device/pda/atmos + default_cartridge = /obj/item/weapon/cartridge/atmos icon_state = "pda-atmo" /obj/item/device/pda/chemist @@ -181,10 +183,8 @@ var/global/list/obj/item/device/pda/PDAs = list() ttone = "data" detonate = 0 -/obj/item/device/pda/pai - icon_state = "NONE" - ttone = "data" - detonate = 0 +/obj/item/device/pda/ai/can_use() + return 1 /obj/item/device/pda/ai/attack_self(mob/user as mob) if ((honkamt > 0) && (prob(60)))//For clown virus. @@ -192,6 +192,9 @@ var/global/list/obj/item/device/pda/PDAs = list() playsound(loc, 'sound/items/bikehorn.ogg', 30, 1) return +/obj/item/device/pda/ai/pai + ttone = "assist" + /* * The Actual PDA */ @@ -222,8 +225,6 @@ var/global/list/obj/item/device/pda/PDAs = list() /obj/item/device/pda/proc/can_use() - if(istype(src, /obj/item/device/pda/ai) || istype(src, /obj/item/device/pda/pai)) - return 1 if(!ismob(loc)) return 0 @@ -235,6 +236,15 @@ var/global/list/obj/item/device/pda/PDAs = list() else return 0 +/obj/item/device/pda/GetAccess() + if(id) + return id.GetAccess() + else + return ..() + +/obj/item/device/pda/GetID() + return id + /obj/item/device/pda/MouseDrop(obj/over_object as obj, src_location, over_location) var/mob/M = usr if((!istype(over_object, /obj/screen)) && !M.restrained() && !M.stat && can_use()) @@ -321,13 +331,15 @@ var/global/list/obj/item/device/pda/PDAs = list() dat += "
Equipment Locator
Custodial Locator
Signaler System
[scanmode == 3 ? "Disable" : "Enable"] Reagent Scanner
[scanmode == 4 ? "Disable" : "Enable"] Halogen Counter
[scanmode == 5 ? "Disable" : "Enable"] Gas Scanner
Toggle Remote Door
Atmospheric Scan
*Detonate*)"
@@ -537,6 +549,11 @@ var/global/list/obj/item/device/pda/PDAs = list()
if ( !(last_honk && world.time < last_honk + 20) )
playsound(loc, 'sound/items/bikehorn.ogg', 50, 1)
last_honk = world.time
+ if("Gas Scan")
+ if(scanmode == 5)
+ scanmode = 0
+ else if((!isnull(cartridge)) && (cartridge.access_atmos))
+ scanmode = 5
//MESSENGER/NOTE FUNCTIONS===================================
@@ -676,7 +693,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
//EXTRA FUNCTIONS===================================
if (mode == 2||mode == 21)//To clear message overlays.
- overlays = null
+ overlays.Cut()
if ((honkamt > 0) && (prob(60)))//For clown virus.
honkamt--
@@ -770,21 +787,14 @@ var/global/list/obj/item/device/pda/PDAs = list()
if(P.loc && isliving(P.loc))
L = P.loc
//Maybe they are a pAI!
- else if(istype(P, /obj/item/device/pda/pai) && P.loc)
- //Search through the location's contents
- for(var/obj/item/device/paicard/Pcard in P.loc)
- //If there's a Pcard there then get the mind inside
- if(Pcard.pai)
- var/mob/living/silicon/pai/pai = Pcard.pai
- //Is it the pAI that is receiving the message?
- if(pai.pda && pai.pda == P)
- L = pai
- break
+ else
+ L = get(P, /mob/living/silicon)
+
if(L)
L << "\icon[P] Message from [src.owner] ([ownjob]), \"[t]\" (Reply)"
log_pda("[usr] (PDA: [src.name]) sent \"[t]\" to [P.name]")
- P.overlays = null
+ P.overlays.Cut()
P.overlays += image('icons/obj/pda.dmi', "pda-r")
else
U << "ERROR: Server isn't responding."
@@ -967,6 +977,63 @@ var/global/list/obj/item/device/pda/PDAs = list()
else
user << "\blue No significant chemical agents found in [A]."
+ if(5)
+ if((istype(A, /obj/item/weapon/tank)) || (istype(A, /obj/machinery/portable_atmospherics)))
+ var/obj/icon = A
+ for (var/mob/O in viewers(user, null))
+ O << "\red [user] has used [src] on \icon[icon] [A]"
+ var/pressure = A:air_contents.return_pressure()
+
+ var/total_moles = A:air_contents.total_moles()
+
+ user << "\blue Results of analysis of \icon[icon]"
+ if (total_moles>0)
+ var/o2_concentration = A:air_contents.oxygen/total_moles
+ var/n2_concentration = A:air_contents.nitrogen/total_moles
+ var/co2_concentration = A:air_contents.carbon_dioxide/total_moles
+ var/plasma_concentration = A:air_contents.toxins/total_moles
+
+ var/unknown_concentration = 1-(o2_concentration+n2_concentration+co2_concentration+plasma_concentration)
+
+ user << "\blue Pressure: [round(pressure,0.1)] kPa"
+ user << "\blue Nitrogen: [round(n2_concentration*100)]%"
+ user << "\blue Oxygen: [round(o2_concentration*100)]%"
+ user << "\blue CO2: [round(co2_concentration*100)]%"
+ user << "\blue Plasma: [round(plasma_concentration*100)]%"
+ if(unknown_concentration>0.01)
+ user << "\red Unknown: [round(unknown_concentration*100)]%"
+ user << "\blue Temperature: [round(A:air_contents.temperature-T0C)]°C"
+ else
+ user << "\blue Tank is empty!"
+
+ if (istype(A, /obj/machinery/atmospherics/pipe/tank))
+ var/obj/icon = A
+ for (var/mob/O in viewers(user, null))
+ O << "\red [user] has used [src] on \icon[icon] [A]"
+
+ var/pressure = A:parent.air.return_pressure()
+ var/total_moles = A:parent.air.total_moles()
+
+ user << "\blue Results of analysis of \icon[icon]"
+ if (total_moles>0)
+ var/o2_concentration = A:parent.air.oxygen/total_moles
+ var/n2_concentration = A:parent.air.nitrogen/total_moles
+ var/co2_concentration = A:parent.air.carbon_dioxide/total_moles
+ var/plasma_concentration = A:parent.air.toxins/total_moles
+
+ var/unknown_concentration = 1-(o2_concentration+n2_concentration+co2_concentration+plasma_concentration)
+
+ user << "\blue Pressure: [round(pressure,0.1)] kPa"
+ user << "\blue Nitrogen: [round(n2_concentration*100)]%"
+ user << "\blue Oxygen: [round(o2_concentration*100)]%"
+ user << "\blue CO2: [round(co2_concentration*100)]%"
+ user << "\blue Plasma: [round(plasma_concentration*100)]%"
+ if(unknown_concentration>0.01)
+ user << "\red Unknown: [round(unknown_concentration*100)]%"
+ user << "\blue Temperature: [round(A:parent.air.temperature-T0C)]°C"
+ else
+ user << "\blue Tank is empty!"
+
if (!scanmode && istype(A, /obj/item/weapon/paper) && owner)
note = A:info
user << "\blue Paper scanned." //concept of scanning paper copyright brainoblivion 2009
@@ -1031,6 +1098,8 @@ var/global/list/obj/item/device/pda/PDAs = list()
for (var/obj/item/device/pda/P in PDAs)
if (!P.owner)
continue
+ else if(P.hidden)
+ continue
else if (P == src)
continue
else if (P.toff)
@@ -1094,39 +1163,27 @@ var/global/list/obj/item/device/pda/PDAs = list()
else
usr << "You do not have a PDA. You should make an issue report about this."
-
-
-
//Some spare PDAs in a box
-
-/obj/item/weapon/storage/PDAbox
+/obj/item/weapon/storage/box/PDAs
name = "spare PDAs"
desc = "A box of spare PDA microcomputers."
icon = 'icons/obj/pda.dmi'
icon_state = "pdabox"
- item_state = "syringe_kit"
- foldable = /obj/item/stack/sheet/cardboard //BubbleWrap
-/obj/item/weapon/storage/PDAbox/New()
- ..()
- new /obj/item/device/pda(src)
- new /obj/item/device/pda(src)
- new /obj/item/device/pda(src)
- new /obj/item/device/pda(src)
-
- var/newcart = pick(1,2,3,4)
- switch(newcart)
- if(1)
- new /obj/item/weapon/cartridge/engineering(src)
- if(2)
- new /obj/item/weapon/cartridge/security(src)
- if(3)
- new /obj/item/weapon/cartridge/medical(src)
- if(4)
- new /obj/item/weapon/cartridge/signal/toxins(src)
-
- new /obj/item/weapon/cartridge/head(src)
+ New()
+ ..()
+ new /obj/item/device/pda(src)
+ new /obj/item/device/pda(src)
+ new /obj/item/device/pda(src)
+ new /obj/item/device/pda(src)
+ new /obj/item/weapon/cartridge/head(src)
+ var/newcart = pick( /obj/item/weapon/cartridge/engineering,
+ /obj/item/weapon/cartridge/security,
+ /obj/item/weapon/cartridge/medical,
+ /obj/item/weapon/cartridge/signal/toxins,
+ /obj/item/weapon/cartridge/quartermaster)
+ new newcart(src)
// Pass along the pulse to atoms in contents, largely added so pAIs are vulnerable to EMP
/obj/item/device/pda/emp_act(severity)
diff --git a/code/game/objects/items/devices/PDA/cart.dm b/code/game/objects/items/devices/PDA/cart.dm
index f6bc2f3365..546b70f28e 100644
--- a/code/game/objects/items/devices/PDA/cart.dm
+++ b/code/game/objects/items/devices/PDA/cart.dm
@@ -9,6 +9,7 @@
var/obj/item/radio/integrated/radio = null
var/access_security = 0
var/access_engine = 0
+ var/access_atmos = 0
var/access_medical = 0
var/access_manifest = 1 // Make all jobs able to access the manifest
var/access_clown = 0
@@ -37,6 +38,11 @@
icon_state = "cart-e"
access_engine = 1
+ atmos
+ name = "BreatheDeep Cartridge"
+ icon_state = "cart-a"
+ access_atmos = 1
+
medical
name = "Med-U Cartridge"
icon_state = "cart-m"
@@ -102,7 +108,8 @@
name = "Signal Ace 2"
desc = "Complete with integrated radio signaler!"
icon_state = "cart-tox"
-// access_reagent_scanner = 1
+ access_reagent_scanner = 1
+ access_atmos = 1
New()
..()
@@ -134,6 +141,8 @@
access_manifest = 1
access_status_display = 1
access_quartermaster = 1
+ access_janitor = 1
+ access_security = 1
New()
..()
@@ -158,6 +167,7 @@
access_manifest = 1
access_status_display = 1
access_engine = 1
+ access_atmos = 1
cmo
name = "Med-U DELUXE"
@@ -172,7 +182,8 @@
icon_state = "cart-rd"
access_manifest = 1
access_status_display = 1
-// access_reagent_scanner = 1
+ access_reagent_scanner = 1
+ access_atmos = 1
New()
..()
@@ -189,6 +200,7 @@
access_medical = 1
access_reagent_scanner = 1
access_status_display = 1
+ access_atmos = 1
syndicate
name = "Detomatix Cartridge"
diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm
index d580480cb9..c1ccb4aa6c 100644
--- a/code/game/objects/items/devices/flashlight.dm
+++ b/code/game/objects/items/devices/flashlight.dm
@@ -10,13 +10,12 @@
m_amt = 50
g_amt = 20
icon_action_button = "action_flashlight"
- light_on = 0
- brightness_on = 4 //luminosity when on
- var brightness = 0
+ var/on = 0
+ var/brightness_on = 4 //luminosity when on
/obj/item/device/flashlight/initialize()
..()
- if(light_on)
+ if(on)
icon_state = "[initial(icon_state)]-on"
SetLuminosity(brightness_on)
else
@@ -24,31 +23,31 @@
SetLuminosity(0)
/obj/item/device/flashlight/proc/update_brightness(var/mob/user = null)
- if(light_on)
+ if(on)
icon_state = "[initial(icon_state)]-on"
- if((loc == user) && (user.luminosity < brightness_on))
- user.SetLuminosity(brightness_on)
+ if(loc == user)
+ user.SetLuminosity(user.luminosity + brightness_on)
else if(isturf(loc))
SetLuminosity(brightness_on)
else
icon_state = initial(icon_state)
if(loc == user)
- user.SetLuminosity(search_light(user, src))
+ user.SetLuminosity(user.luminosity - brightness_on)
else if(isturf(loc))
SetLuminosity(0)
/obj/item/device/flashlight/attack_self(mob/user)
if(!isturf(user.loc))
user << "You cannot turn the light on while in this [user.loc]." //To prevent some lighting anomalities.
- return
- light_on = !light_on
+ return 0
+ on = !on
update_brightness(user)
- return
+ return 1
/obj/item/device/flashlight/attack(mob/living/M as mob, mob/living/user as mob)
add_fingerprint(user)
- if(light_on && user.zone_sel.selecting == "eyes")
+ if(on && user.zone_sel.selecting == "eyes")
if(((CLUMSY in user.mutations) || user.getBrainLoss() >= 60) && prob(50)) //too dumb to use flashlight properly
return ..() //just hit them in the head
@@ -89,24 +88,15 @@
/obj/item/device/flashlight/pickup(mob/user)
- if(light_on)
- if (user.luminosity < brightness_on)
- user.SetLuminosity(brightness_on)
+ if(on)
+ user.SetLuminosity(user.luminosity + brightness_on)
SetLuminosity(0)
/obj/item/device/flashlight/dropped(mob/user)
- if(light_on)
- if ((layer <= 3) || (loc != user.loc))
- user.SetLuminosity(search_light(user, src))
- SetLuminosity(brightness_on)
-
-
-/obj/item/device/flashlight/equipped(mob/user, slot)
- if(light_on)
- if (user.luminosity < brightness_on)
- user.SetLuminosity(brightness_on)
- SetLuminosity(0)
+ if(on)
+ user.SetLuminosity(user.luminosity - brightness_on)
+ SetLuminosity(brightness_on)
/obj/item/device/flashlight/pen
@@ -129,7 +119,7 @@
flags = FPRINT | TABLEPASS | CONDUCT
m_amt = 0
g_amt = 0
- light_on = 1
+ on = 1
// green-shaded desk lamp
@@ -163,21 +153,22 @@
var/produce_heat = 1500
/obj/item/device/flashlight/flare/New()
- fuel = rand(1500, 2000) // Last 10 to 15 minutes.
+ fuel = rand(800, 1000) // Sorry for changing this so much but I keep under-estimating how long X number of ticks last in seconds.
..()
/obj/item/device/flashlight/flare/process()
var/turf/pos = get_turf(src)
- pos.hotspot_expose(produce_heat, 5)
+ if(pos)
+ pos.hotspot_expose(produce_heat, 5)
fuel = max(fuel - 1, 0)
- if(!fuel || !light_on)
+ if(!fuel || !on)
turn_off()
if(!fuel)
src.icon_state = "[initial(icon_state)]-empty"
processing_objects -= src
/obj/item/device/flashlight/flare/proc/turn_off()
- light_on = 0
+ on = 0
src.force = initial(src.force)
src.damtype = initial(src.damtype)
if(ismob(loc))
@@ -187,19 +178,18 @@
update_brightness(null)
/obj/item/device/flashlight/flare/attack_self(mob/user)
+
// Usual checks
- if(loc != usr)
- return
if(!fuel)
user << "It's out of fuel."
return
- if(!light_on)
- user.visible_message("[user] activates the flare.", "You pull the cord on the flare, activating it!")
- else
+ if(on)
return
+
+ . = ..()
// All good, turn it on.
- light_on = 1
- update_brightness(user)
- src.force = on_damage
- src.damtype = "fire"
- processing_objects += src
\ No newline at end of file
+ if(.)
+ user.visible_message("[user] activates the flare.", "You pull the cord on the flare, activating it!")
+ src.force = on_damage
+ src.damtype = "fire"
+ processing_objects += src
\ No newline at end of file
diff --git a/code/game/objects/items/devices/paicard.dm b/code/game/objects/items/devices/paicard.dm
index 9685993c70..d0bc6a4533 100644
--- a/code/game/objects/items/devices/paicard.dm
+++ b/code/game/objects/items/devices/paicard.dm
@@ -110,12 +110,12 @@
/obj/item/device/paicard/proc/removePersonality()
src.pai = null
- src.overlays = null
+ src.overlays.Cut()
src.overlays += "pai-off"
/obj/item/device/paicard/proc/setEmotion(var/emotion)
if(pai)
- src.overlays = null
+ src.overlays.Cut()
switch(emotion)
if(1) src.overlays += "pai-happy"
if(2) src.overlays += "pai-cat"
diff --git a/code/game/objects/items/devices/radio/encryptionkey.dm b/code/game/objects/items/devices/radio/encryptionkey.dm
index 3b026d0be7..165f6748ec 100644
--- a/code/game/objects/items/devices/radio/encryptionkey.dm
+++ b/code/game/objects/items/devices/radio/encryptionkey.dm
@@ -72,7 +72,7 @@
name = "Captain's Encryption Key"
desc = "An encyption key for a radio headset. Contains cypherkeys."
icon_state = "cap_cypherkey"
- channels = list("Command" = 1, "Science" = 0, "Medical" = 0, "Security" = 1, "Engineering" = 0, "Mining" = 0, "Cargo" = 0)
+ channels = list("Command" = 1, "Security" = 1, "Engineering" = 0, "Science" = 0, "Medical" = 0, "Supply" = 0)
/obj/item/device/encryptionkey/heads/rd
name = "Research Director's Encryption Key"
@@ -102,8 +102,8 @@
name = "Head of Personnel's Encryption Key"
desc = "An encyption key for a radio headset. Contains cypherkeys."
icon_state = "hop_cypherkey"
- channels = list("Command" = 1, "Security" = 0, "Cargo" = 1, "Mining" = 0)
-
+ channels = list("Supply" = 1, "Command" = 1, "Security" = 0)
+/*
/obj/item/device/encryptionkey/headset_mine
name = "Mining Radio Encryption Key"
desc = "An encyption key for a radio headset. Contains cypherkeys."
@@ -115,13 +115,12 @@
desc = "An encyption key for a radio headset. Contains cypherkeys."
icon_state = "qm_cypherkey"
channels = list("Cargo" = 1, "Mining" = 1)
-
+*/
/obj/item/device/encryptionkey/headset_cargo
- name = "Cargo Radio Encryption Key"
+ name = "Supply Radio Encryption Key"
desc = "An encyption key for a radio headset. Contains cypherkeys."
icon_state = "cargo_cypherkey"
- channels = list("Cargo" = 1)
-
+ channels = list("Supply" = 1)
/obj/item/device/encryptionkey/ert
name = "NanoTrasen ERT Radio Encryption Key"
desc = "An encyption key for a radio headset. Contains cypherkeys."
diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm
index 216120d4db..05285807d7 100644
--- a/code/game/objects/items/devices/radio/headset.dm
+++ b/code/game/objects/items/devices/radio/headset.dm
@@ -95,7 +95,7 @@
/obj/item/device/radio/headset/heads/captain
name = "captain's headset"
- desc = "The headset of the boss. Channels are as follows: :c - command, :s - security, :e - engineering, :d - mining, :q - cargo, :m - medical, :n - science."
+ desc = "The headset of the boss. Channels are as follows: :c - command, :s - security, :e - engineering, :u - supply, :m - medical, :n - science."
icon_state = "com_headset"
item_state = "headset"
keyslot2 = new /obj/item/device/encryptionkey/heads/captain
@@ -130,11 +130,11 @@
/obj/item/device/radio/headset/heads/hop
name = "head of personnel's headset"
- desc = "The headset of the guy who will one day be captain. Channels are as follows: :c - command, :s - security, :q - cargo, :d - mining."
+ desc = "The headset of the guy who will one day be captain. Channels are as follows: :u - supply, :c - command, :s - security"
icon_state = "com_headset"
item_state = "headset"
keyslot2 = new /obj/item/device/encryptionkey/heads/hop
-
+/*
/obj/item/device/radio/headset/headset_mine
name = "mining radio headset"
desc = "Headset used by miners. How useless. To access the mining channel, use :d."
@@ -148,10 +148,10 @@
icon_state = "cargo_headset"
item_state = "headset"
keyslot2 = new /obj/item/device/encryptionkey/heads/qm
-
+*/
/obj/item/device/radio/headset/headset_cargo
- name = "cargo radio headset"
- desc = "Headset used by the QM's slaves. To access the cargo channel, use :q."
+ name = "supply radio headset"
+ desc = "A headset used by the QM and his slaves. To access the supply channel, use :u."
icon_state = "cargo_headset"
item_state = "headset"
keyslot2 = new /obj/item/device/encryptionkey/headset_cargo
diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm
index 74cf0c4089..895d18bd9d 100644
--- a/code/game/objects/items/devices/radio/radio.dm
+++ b/code/game/objects/items/devices/radio/radio.dm
@@ -497,10 +497,10 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
freq_text = "Engineering"
if(1359)
freq_text = "Security"
- if(1349)
- freq_text = "Mining"
+// if(1349)
+// freq_text = "Mining"
if(1347)
- freq_text = "Cargo"
+ freq_text = "Supply"
//There's probably a way to use the list var of channels in code\game\communications.dm to make the dept channels non-hardcoded, but I wasn't in an experimentive mood. --NEO
if(!freq_text)
diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm
index 55b2be019e..a0f4f202d9 100644
--- a/code/game/objects/items/devices/scanners.dm
+++ b/code/game/objects/items/devices/scanners.dm
@@ -257,6 +257,23 @@ MASS SPECTROMETER
src.add_fingerprint(user)
return
+/obj/item/device/mass_spectrometer
+ desc = "A hand-held mass spectrometer which identifies trace chemicals in a blood sample."
+ name = "mass-spectrometer"
+ icon_state = "spectrometer"
+ item_state = "analyzer"
+ w_class = 2.0
+ flags = FPRINT | TABLEPASS| CONDUCT | OPENCONTAINER
+ slot_flags = SLOT_BELT
+ throwforce = 5
+ throw_speed = 4
+ throw_range = 20
+ m_amt = 30
+ g_amt = 20
+ origin_tech = "magnets=2;biotech=2"
+ var/details = 0
+ var/recent_fail = 0
+
/obj/item/device/mass_spectrometer/New()
..()
var/datum/reagents/R = new/datum/reagents(5)
@@ -307,3 +324,8 @@ MASS SPECTROMETER
reagents.clear_reagents()
return
+/obj/item/device/mass_spectrometer/adv
+ name = "advanced mass-spectrometer"
+ icon_state = "adv_spectrometer"
+ details = 1
+ origin_tech = "magnets=4;biotech=2"
diff --git a/code/game/objects/items/devices/shields.dm b/code/game/objects/items/devices/shields.dm
deleted file mode 100644
index 665c79e0d9..0000000000
--- a/code/game/objects/items/devices/shields.dm
+++ /dev/null
@@ -1,32 +0,0 @@
-/obj/item/weapon/cloaking_device
- name = "cloaking device"
- desc = "Use this to become invisible to the human eyesocket."
- icon = 'icons/obj/device.dmi'
- icon_state = "shield0"
- var/active = 0.0
- flags = FPRINT | TABLEPASS| CONDUCT
- item_state = "electronic"
- throwforce = 10.0
- throw_speed = 2
- throw_range = 10
- w_class = 2.0
- origin_tech = "magnets=3;syndicate=4"
-
-
-/obj/item/weapon/cloaking_device/attack_self(mob/user as mob)
- src.active = !( src.active )
- if (src.active)
- user << "\blue The cloaking device is now active."
- src.icon_state = "shield1"
- else
- user << "\blue The cloaking device is now inactive."
- src.icon_state = "shield0"
- src.add_fingerprint(user)
- return
-
-/obj/item/weapon/cloaking_device/emp_act(severity)
- active = 0
- icon_state = "shield0"
- if(ismob(loc))
- loc:update_icons()
- ..()
diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm
index c77a388d1e..9a57b4ff57 100644
--- a/code/game/objects/items/devices/transfer_valve.dm
+++ b/code/game/objects/items/devices/transfer_valve.dm
@@ -115,7 +115,7 @@
toggle = 1
/obj/item/device/transfer_valve/update_icon()
- overlays = null
+ overlays.Cut()
underlays = null
if(!tank_one && !tank_two && !attached_device)
@@ -164,16 +164,16 @@
else
attacher_name = "[attacher.name]([attacher.ckey])"
- var/log_str = "Bomb valve opened in [A.name] "
+ var/log_str = "Bomb valve opened in [A.name] "
log_str += "with [attached_device ? attached_device : "no device"] attacher: [attacher_name]"
if(attacher)
- log_str += "(?)"
+ log_str += "(?)"
var/mob/mob = get_mob_by_key(src.fingerprintslast)
var/last_touch_info = ""
if(mob)
- last_touch_info = "(?)"
+ last_touch_info = "(?)"
log_str += " Last touched by: [src.fingerprintslast][last_touch_info]"
bombers += log_str
diff --git a/code/game/objects/items/devices/uplinks.dm b/code/game/objects/items/devices/uplinks.dm
index 957da36c89..ebe7b751de 100644
--- a/code/game/objects/items/devices/uplinks.dm
+++ b/code/game/objects/items/devices/uplinks.dm
@@ -59,12 +59,18 @@ A list of items and costs is stored under the datum of every game mode, alongsid
continue
path_obj = text2path(path_text)
- item = new path_obj()
- name = O[3]
- del item
- dat += "[name] ([cost])