diff --git a/SQL/feedback_schema.sql b/SQL/feedback_schema.sql
new file mode 100644
index 00000000000..3fa0f7080dd
--- /dev/null
+++ b/SQL/feedback_schema.sql
@@ -0,0 +1,120 @@
+CREATE TABLE `erro_admin` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `ckey` varchar(32) NOT NULL,
+ `rank` varchar(32) NOT NULL DEFAULT 'Administrator',
+ `level` int(2) NOT NULL DEFAULT '0',
+ `flags` int(16) NOT NULL DEFAULT '0',
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1 ;
+
+CREATE TABLE `erro_admin_log` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `datetime` datetime NOT NULL,
+ `adminckey` varchar(32) NOT NULL,
+ `adminip` varchar(18) NOT NULL,
+ `log` text NOT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1 ;
+
+CREATE TABLE `erro_ban` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `bantime` datetime NOT NULL,
+ `serverip` varchar(32) NOT NULL,
+ `bantype` varchar(32) NOT NULL,
+ `reason` text NOT NULL,
+ `job` varchar(32) DEFAULT NULL,
+ `duration` int(11) NOT NULL,
+ `rounds` int(11) DEFAULT NULL,
+ `expiration_time` datetime NOT NULL,
+ `ckey` varchar(32) NOT NULL,
+ `computerid` varchar(32) NOT NULL,
+ `ip` varchar(32) NOT NULL,
+ `a_ckey` varchar(32) NOT NULL,
+ `a_computerid` varchar(32) NOT NULL,
+ `a_ip` varchar(32) NOT NULL,
+ `who` text NOT NULL,
+ `adminwho` text NOT NULL,
+ `edits` text,
+ `unbanned` tinyint(1) DEFAULT NULL,
+ `unbanned_datetime` datetime DEFAULT NULL,
+ `unbanned_ckey` varchar(32) DEFAULT NULL,
+ `unbanned_computerid` varchar(32) DEFAULT NULL,
+ `unbanned_ip` varchar(32) DEFAULT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1 ;
+
+CREATE TABLE `erro_feedback` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `time` datetime NOT NULL,
+ `round_id` int(8) NOT NULL,
+ `var_name` varchar(32) NOT NULL,
+ `var_value` int(16) DEFAULT NULL,
+ `details` text,
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 ;
+
+CREATE TABLE `erro_player` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `ckey` varchar(32) NOT NULL,
+ `firstseen` datetime NOT NULL,
+ `lastseen` datetime NOT NULL,
+ `ip` varchar(18) NOT NULL,
+ `computerid` varchar(32) NOT NULL,
+ `lastadminrank` varchar(32) NOT NULL DEFAULT 'Player',
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `ckey` (`ckey`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1 ;
+
+CREATE TABLE `erro_poll_option` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `pollid` int(11) NOT NULL,
+ `text` varchar(255) NOT NULL,
+ `percentagecalc` tinyint(1) NOT NULL DEFAULT '1',
+ `minval` int(3) DEFAULT NULL,
+ `maxval` int(3) DEFAULT NULL,
+ `descmin` varchar(32) DEFAULT NULL,
+ `descmid` varchar(32) DEFAULT NULL,
+ `descmax` varchar(32) DEFAULT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1 ;
+
+CREATE TABLE `erro_poll_question` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `polltype` varchar(16) NOT NULL DEFAULT 'OPTION',
+ `starttime` datetime NOT NULL,
+ `endtime` datetime NOT NULL,
+ `question` varchar(255) NOT NULL,
+ `adminonly` tinyint(1) DEFAULT '0',
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1 ;
+
+CREATE TABLE `erro_poll_textreply` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `datetime` datetime NOT NULL,
+ `pollid` int(11) NOT NULL,
+ `ckey` varchar(32) NOT NULL,
+ `ip` varchar(18) NOT NULL,
+ `replytext` text NOT NULL,
+ `adminrank` varchar(32) NOT NULL DEFAULT 'Player',
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1 ;
+
+CREATE TABLE `erro_poll_vote` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `datetime` datetime NOT NULL,
+ `pollid` int(11) NOT NULL,
+ `optionid` int(11) NOT NULL,
+ `ckey` varchar(255) NOT NULL,
+ `ip` varchar(16) NOT NULL,
+ `adminrank` varchar(32) NOT NULL,
+ `rating` int(2) DEFAULT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1 ;
+
+CREATE TABLE `erro_privacy` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `datetime` datetime NOT NULL,
+ `ckey` varchar(32) NOT NULL,
+ `option` varchar(128) NOT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1 ;
\ No newline at end of file
diff --git a/baystation12.dme b/baystation12.dme
index c434c879694..5263097db58 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -107,6 +107,7 @@
#define FILE_DIR "code/modules"
#define FILE_DIR "code/modules/admin"
#define FILE_DIR "code/modules/admin/DB ban"
+#define FILE_DIR "code/modules/admin/permissionverbs"
#define FILE_DIR "code/modules/admin/verbs"
#define FILE_DIR "code/modules/assembly"
#define FILE_DIR "code/modules/awaymissions"
@@ -159,6 +160,8 @@
#define FILE_DIR "code/modules/mob/living/silicon/pai"
#define FILE_DIR "code/modules/mob/living/silicon/robot"
#define FILE_DIR "code/modules/mob/living/simple_animal"
+#define FILE_DIR "code/modules/mob/living/simple_animal/friendly"
+#define FILE_DIR "code/modules/mob/living/simple_animal/hostile"
#define FILE_DIR "code/modules/mob/new_player"
#define FILE_DIR "code/modules/mob/simple_animal"
#define FILE_DIR "code/modules/paperwork"
@@ -417,7 +420,6 @@
#include "code\game\gamemodes\intercept_report.dm"
#include "code\game\gamemodes\objective.dm"
#include "code\game\gamemodes\setupgame.dm"
-#include "code\game\gamemodes\autotraitor\autotraitor.dm"
#include "code\game\gamemodes\blob\blob.dm"
#include "code\game\gamemodes\blob\blob_finish.dm"
#include "code\game\gamemodes\blob\blob_report.dm"
@@ -454,6 +456,7 @@
#include "code\game\gamemodes\nuclear\nuclear.dm"
#include "code\game\gamemodes\nuclear\nuclearbomb.dm"
#include "code\game\gamemodes\nuclear\pinpointer.dm"
+#include "code\game\gamemodes\revolution\anti_revolution.dm"
#include "code\game\gamemodes\revolution\revolution.dm"
#include "code\game\gamemodes\revolution\rp_revolution.dm"
#include "code\game\gamemodes\sandbox\h_sandbox.dm"
@@ -480,6 +483,7 @@
#include "code\game\jobs\job\science.dm"
#include "code\game\jobs\job\security.dm"
#include "code\game\jobs\job\silicon.dm"
+#include "code\game\machinery\adv_med.dm"
#include "code\game\machinery\ai_slipper.dm"
#include "code\game\machinery\airlock_control.dm"
#include "code\game\machinery\alarm.dm"
@@ -492,12 +496,11 @@
#include "code\game\machinery\constructable_frame.dm"
#include "code\game\machinery\cryo.dm"
#include "code\game\machinery\deployable.dm"
-#include "code\game\machinery\dispenser.dm"
#include "code\game\machinery\door_control.dm"
#include "code\game\machinery\doppler_array.dm"
#include "code\game\machinery\flasher.dm"
+#include "code\game\machinery\floodlight.dm"
#include "code\game\machinery\Freezer.dm"
-#include "code\game\machinery\gateway.dm"
#include "code\game\machinery\hologram.dm"
#include "code\game\machinery\hydroponics.dm"
#include "code\game\machinery\igniter.dm"
@@ -523,6 +526,7 @@
#include "code\game\machinery\suit_storage_unit.dm"
#include "code\game\machinery\syndicatebeacon.dm"
#include "code\game\machinery\teleporter.dm"
+#include "code\game\machinery\transformer.dm"
#include "code\game\machinery\turrets.dm"
#include "code\game\machinery\vending.dm"
#include "code\game\machinery\washing_machine.dm"
@@ -588,6 +592,7 @@
#include "code\game\machinery\embedded_controller\access_controller.dm"
#include "code\game\machinery\embedded_controller\airlock_controller.dm"
#include "code\game\machinery\embedded_controller\embedded_controller_base.dm"
+#include "code\game\machinery\embedded_controller\simple_vent_controller.dm"
#include "code\game\machinery\kitchen\gibber.dm"
#include "code\game\machinery\kitchen\juicer.dm"
#include "code\game\machinery\kitchen\microwave.dm"
@@ -651,6 +656,7 @@
#include "code\game\objects\effects\decals\misc.dm"
#include "code\game\objects\effects\decals\remains.dm"
#include "code\game\objects\effects\decals\Cleanable\aliens.dm"
+#include "code\game\objects\effects\decals\Cleanable\fuel.dm"
#include "code\game\objects\effects\decals\Cleanable\humans.dm"
#include "code\game\objects\effects\decals\Cleanable\misc.dm"
#include "code\game\objects\effects\decals\Cleanable\robots.dm"
@@ -707,7 +713,6 @@
#include "code\game\objects\items\stacks\tiles\plasteel.dm"
#include "code\game\objects\items\stacks\tiles\tile_types.dm"
#include "code\game\objects\items\weapons\AI_modules.dm"
-#include "code\game\objects\items\weapons\Bedsheets.dm"
#include "code\game\objects\items\weapons\cards_ids.dm"
#include "code\game\objects\items\weapons\cigs_lighters.dm"
#include "code\game\objects\items\weapons\clown_items.dm"
@@ -731,7 +736,6 @@
#include "code\game\objects\items\weapons\RSF.dm"
#include "code\game\objects\items\weapons\scrolls.dm"
#include "code\game\objects\items\weapons\stunbaton.dm"
-#include "code\game\objects\items\weapons\surgery_limbattachment.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"
@@ -790,7 +794,9 @@
#include "code\game\objects\structures\morgue.dm"
#include "code\game\objects\structures\musician.dm"
#include "code\game\objects\structures\noticeboard.dm"
+#include "code\game\objects\structures\shuttle_engines.dm"
#include "code\game\objects\structures\tables_racks.dm"
+#include "code\game\objects\structures\tank_dispenser.dm"
#include "code\game\objects\structures\target_stake.dm"
#include "code\game\objects\structures\watercloset.dm"
#include "code\game\objects\structures\windoor_assembly.dm"
@@ -868,6 +874,8 @@
#include "code\modules\admin\player_panel.dm"
#include "code\modules\admin\ToRban.dm"
#include "code\modules\admin\DB ban\functions.dm"
+#include "code\modules\admin\permissionverbs\assignment.dm"
+#include "code\modules\admin\permissionverbs\permissionedit.dm"
#include "code\modules\admin\verbs\adminhelp.dm"
#include "code\modules\admin\verbs\adminjump.dm"
#include "code\modules\admin\verbs\adminpm.dm"
@@ -903,7 +911,6 @@
#include "code\modules\assembly\shock_kit.dm"
#include "code\modules\assembly\signaler.dm"
#include "code\modules\assembly\timer.dm"
-#include "code\modules\awaymissions\bluespaceartillery.dm"
#include "code\modules\awaymissions\corpse.dm"
#include "code\modules\awaymissions\gateway.dm"
#include "code\modules\awaymissions\loot.dm"
@@ -966,10 +973,10 @@
#include "code\modules\critters\critter_defenses.dm"
#include "code\modules\critters\critters.dm"
#include "code\modules\critters\hivebots\hivebot.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\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\flufftext\Dreaming.dm"
#include "code\modules\flufftext\Hallucination.dm"
#include "code\modules\flufftext\TextFilters.dm"
@@ -1107,7 +1114,6 @@
#include "code\modules\mob\living\silicon\ai\life.dm"
#include "code\modules\mob\living\silicon\ai\login.dm"
#include "code\modules\mob\living\silicon\ai\logout.dm"
-#include "code\modules\mob\living\silicon\ai\move.dm"
#include "code\modules\mob\living\silicon\ai\say.dm"
#include "code\modules\mob\living\silicon\ai\freelook\cameranet.dm"
#include "code\modules\mob\living\silicon\ai\freelook\chunk.dm"
@@ -1139,23 +1145,22 @@
#include "code\modules\mob\living\silicon\robot\robot_movement.dm"
#include "code\modules\mob\living\silicon\robot\say.dm"
#include "code\modules\mob\living\silicon\robot\wires.dm"
-#include "code\modules\mob\living\simple_animal\bear.dm"
-#include "code\modules\mob\living\simple_animal\carp.dm"
-#include "code\modules\mob\living\simple_animal\cat.dm"
#include "code\modules\mob\living\simple_animal\clown.dm"
#include "code\modules\mob\living\simple_animal\constructs.dm"
-#include "code\modules\mob\living\simple_animal\corgi.dm"
-#include "code\modules\mob\living\simple_animal\crab.dm"
-#include "code\modules\mob\living\simple_animal\life.dm"
-#include "code\modules\mob\living\simple_animal\mouse.dm"
-#include "code\modules\mob\living\simple_animal\mushroom.dm"
#include "code\modules\mob\living\simple_animal\parrot.dm"
#include "code\modules\mob\living\simple_animal\shade.dm"
#include "code\modules\mob\living\simple_animal\simple_animal.dm"
#include "code\modules\mob\living\simple_animal\syndicate.dm"
-#include "code\modules\mob\living\simple_animal\tomato.dm"
-#include "code\modules\mob\living\simple_animal\update_icons.dm"
#include "code\modules\mob\living\simple_animal\worm.dm"
+#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\mouse.dm"
+#include "code\modules\mob\living\simple_animal\friendly\mushroom.dm"
+#include "code\modules\mob\living\simple_animal\friendly\tomato.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\hostile.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"
@@ -1178,6 +1183,7 @@
#include "code\modules\power\apc.dm"
#include "code\modules\power\cable.dm"
#include "code\modules\power\cable_heavyduty.dm"
+#include "code\modules\power\cable_logic.dm"
#include "code\modules\power\cell.dm"
#include "code\modules\power\engine.dm"
#include "code\modules\power\generator.dm"
@@ -1348,4 +1354,5 @@
#include "interface\interface.dm"
#include "interface\skin.dmf"
#include "maps\tgstation.2.0.9.1.dmm"
+#include "maps\RandomZLevels\stationCollision.dm"
// END_INCLUDE
diff --git a/bot/YTCv4.py b/bot/YTCv4.py
index 28cb7d4cf13..e21facbf504 100644
--- a/bot/YTCv4.py
+++ b/bot/YTCv4.py
@@ -29,7 +29,7 @@ def YTCV4(youtube_url,cache=1,debug=0):
try:
prev_dict = pickle.load(tiedosto)
except EOFError: # Cache is corrupt
- os.remove(directory+"/nano/"+tiedosto.name)
+ os.remove(directory+tiedosto.name)
print "REMOVED CORRUPT CACHE: "+tiedosto.name
prev_dict = {}
tiedosto.close() # I think this should belong here.
diff --git a/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm b/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm
index 196208d7523..f7de10c2a9f 100644
--- a/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm
+++ b/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm
@@ -145,9 +145,9 @@
set_frequency(frequency)
receive_signal(datum/signal/signal)
+
if(!signal.data["tag"] || (signal.data["tag"] != id) || (signal.data["sigtype"]!="command"))
return 0
-
if("power" in signal.data)
on = text2num(signal.data["power"])
diff --git a/code/ATMOSPHERICS/components/unary/vent_pump.dm b/code/ATMOSPHERICS/components/unary/vent_pump.dm
index c4c9b50e59e..b58a12b8b80 100644
--- a/code/ATMOSPHERICS/components/unary/vent_pump.dm
+++ b/code/ATMOSPHERICS/components/unary/vent_pump.dm
@@ -5,6 +5,7 @@
name = "Air Vent"
desc = "Has a valve and pump attached to it"
+ var/area/initial_loc
level = 1
var/area_uid
var/id_tag = null
@@ -41,10 +42,10 @@
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)
@@ -321,3 +322,8 @@
"You hear ratchet.")
new /obj/item/pipe(loc, make_from=src)
del(src)
+
+ /obj/machinery/atmospherics/unary/vent_pump/Del()
+ initial_loc.air_scrub_info -= id_tag
+ ..()
+ return
diff --git a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm
index 6b14c0cd149..21484d25e19 100644
--- a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm
+++ b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm
@@ -7,6 +7,7 @@
level = 1
+ var/area/initial_loc
var/id_tag = null
var/frequency = 1439
var/datum/radio_frequency/radio_connection
@@ -24,10 +25,10 @@
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)
@@ -257,3 +258,8 @@
"You hear ratchet.")
new /obj/item/pipe(loc, make_from=src)
del(src)
+
+ /obj/machinery/atmospherics/unary/vent_scrubber/Del()
+ initial_loc.air_scrub_info -= id_tag
+ ..()
+ return
diff --git a/code/ATMOSPHERICS/components/valve.dm b/code/ATMOSPHERICS/components/valve.dm
index fea94457df0..09d0b64f866 100644
--- a/code/ATMOSPHERICS/components/valve.dm
+++ b/code/ATMOSPHERICS/components/valve.dm
@@ -174,11 +174,14 @@ obj/machinery/atmospherics/valve
if(target.initialize_directions & get_dir(target,src))
node2 = target
break
+
+ build_network()
+
if(openDuringInit)
+ close()
open()
openDuringInit = 0
- build_network()
/*
var/connect_directions
switch(dir)
diff --git a/code/FEA/FEA_airgroup.dm b/code/FEA/FEA_airgroup.dm
index 9ebb8e6bb1c..00a6afc3949 100644
--- a/code/FEA/FEA_airgroup.dm
+++ b/code/FEA/FEA_airgroup.dm
@@ -90,7 +90,7 @@ datum/air_group
if (next_check > 0)
next_check--
return 1
- next_check += check_delay + rand(0,check_delay/2)
+ next_check += check_delay + rand(max(check_delay, 1)/2,check_delay)
check_delay++
var/turf/simulated/list/border_individual = list()
diff --git a/code/FEA/FEA_system.dm b/code/FEA/FEA_system.dm
index 7d7d9754602..574fd1ba268 100644
--- a/code/FEA/FEA_system.dm
+++ b/code/FEA/FEA_system.dm
@@ -152,10 +152,8 @@ datum
var/start_time = world.timeofday
for(var/turf/simulated/S in world)
- if(!S.blocks_air && !S.parent && S.z < 5) // Added last check to force skipping asteroid z-levels -- TLE
+ if(!S.blocks_air && !S.parent)
assemble_group_turf(S)
- if(S.z > 4) // Skipping asteroids -- TLE
- continue
S.update_air_properties()
world << "\red \b Geometry processed in [(world.timeofday-start_time)/10] seconds!"
diff --git a/code/FEA/FEA_turf_tile.dm b/code/FEA/FEA_turf_tile.dm
index 9af7bd58ec3..d043e348245 100644
--- a/code/FEA/FEA_turf_tile.dm
+++ b/code/FEA/FEA_turf_tile.dm
@@ -304,7 +304,7 @@ turf
if (next_check > 0)
next_check--
return 1
- next_check += check_delay + rand(0,check_delay/2)
+ next_check += check_delay + rand(max(check_delay, 1)/2,check_delay)
check_delay++
var/turf/simulated/list/possible_fire_spreads = list()
diff --git a/code/WorkInProgress/surgery.dm b/code/WorkInProgress/surgery.dm
index ee99b6a0217..31c97c78210 100644
--- a/code/WorkInProgress/surgery.dm
+++ b/code/WorkInProgress/surgery.dm
@@ -274,6 +274,47 @@ proc/build_surgery_steps_list()
"\red Your hand slips, nicking internal organs in [target]'s abdomen with \the [tool]!")
affected.createwound(BRUISE, 20)
+
+//////////////////////////////////////////////////////////////////
+// INTERNAL WOUND PATCHING //
+//////////////////////////////////////////////////////////////////
+
+
+/datum/surgery_step/fix_vein
+ required_tool = /obj/item/weapon/FixOVein
+
+ can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/datum/organ/external/affected = target.get_organ(target_zone)
+
+ var/internal_bleeding = 0
+ for(var/datum/wound/W in affected.wounds) if(W.internal)
+ internal_bleeding = 1
+ break
+
+ return affected.open == 2 && internal_bleeding
+
+ begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/datum/organ/external/affected = target.get_organ(target_zone)
+ if (affected.stage == 0)
+ user.visible_message("[user] starts patching the damaged vein in [target]'s [affected.display_name] with \the [tool]." , \
+ "You start patching the damaged vein in [target]'s [affected.display_name] with \the [tool].")
+
+ end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/datum/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("\blue [user] has patched the damaged vein in [target]'s [affected.display_name] with \the [tool].", \
+ "\blue You have patched the damaged vein in [target]'s [affected.display_name] with \the [tool].")
+
+ for(var/datum/wound/W in affected.wounds) if(W.internal)
+ affected.wounds -= W
+ affected.update_damages()
+
+ fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/datum/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("\red [user]'s hand slips, smearing [tool] in the incision in [target]'s [affected.display_name]!" , \
+ "\red Your hand slips, smearing [tool] in the incision in [target]'s [affected.display_name]!")
+ affected.take_damage(5, 0)
+
+
//////////////////////////////////////////////////////////////////
// BONE SURGERY //
//////////////////////////////////////////////////////////////////
diff --git a/code/ZAS/Fire.dm b/code/ZAS/Fire.dm
index 2a8d6a2ba26..9501d4222e7 100644
--- a/code/ZAS/Fire.dm
+++ b/code/ZAS/Fire.dm
@@ -40,7 +40,7 @@ turf/simulated/hotspot_expose(exposed_temperature, exposed_volume, soh)
if(locate(/obj/fire) in src)
return 1
var/datum/gas/volatile_fuel/fuel = locate() in air_contents.trace_gases
- var/obj/liquid_fuel/liquid = locate() in src
+ var/obj/effect/decal/cleanable/liquid_fuel/liquid = locate() in src
if(air_contents.calculate_firelevel(liquid) > vsc.IgnitionLevel && (fuel || liquid || air_contents.toxins > 0.5))
igniting = 1
if(air_contents.oxygen < 0.5)
@@ -63,7 +63,7 @@ obj
anchored = 1
mouse_opacity = 0
- //luminosity = 3
+ luminosity = 3
icon = 'fire.dmi'
icon_state = "1"
@@ -90,7 +90,7 @@ obj
//Get whatever trace fuels are in the area
datum/gas/volatile_fuel/fuel = locate(/datum/gas/volatile_fuel/) in air_contents.trace_gases
//Also get liquid fuels on the ground.
- obj/liquid_fuel/liquid = locate() in S
+ obj/effect/decal/cleanable/liquid_fuel/liquid = locate() in S
var/datum/gas_mixture/flow = air_contents.remove_ratio(0.25)
//The reason we're taking a part of the air instead of all of it is so that it doesn't jump to
@@ -177,67 +177,12 @@ obj
..()
-obj/liquid_fuel
- //Liquid fuel is used for things that used to rely on volatile fuels or plasma being contained to a couple tiles.
- icon = 'icons/effects/effects.dmi'
- icon_state = "fuel"
- layer = TURF_LAYER+0.2
- anchored = 1
- var/amount = 1 //Basically moles.
-
- New(newLoc,amt=1)
- src.amount = amt
-
- //Be absorbed by any other liquid fuel in the tile.
- for(var/obj/liquid_fuel/other in newLoc)
- if(other != src)
- other.amount += src.amount
- spawn other.Spread()
- del src
-
- Spread()
- . = ..()
-
- proc/Spread()
- //Allows liquid fuels to sometimes flow into other tiles.
- if(amount < 0.5) return
- var/turf/simulated/S = loc
- if(!istype(S)) return
- for(var/d in cardinal)
- if(S.air_check_directions & d)
- if(rand(25))
- var/turf/simulated/O = get_step(src,d)
- if(!locate(/obj/liquid_fuel) in O)
- new/obj/liquid_fuel(O,amount*0.25)
- amount *= 0.75
-
- flamethrower_fuel
- icon_state = "mustard"
- anchored = 0
- New(newLoc, amt = 1, d = 0)
- dir = d //Setting this direction means you won't get torched by your own flamethrower.
- . = ..()
- Spread()
- //The spread for flamethrower fuel is much more precise, to create a wide fire pattern.
- if(amount < 0.1) return
- var/turf/simulated/S = loc
- if(!istype(S)) return
-
- for(var/d in list(turn(dir,90),turn(dir,-90)))
- if(S.air_check_directions & d)
- var/turf/simulated/O = get_step(S,d)
- new/obj/liquid_fuel/flamethrower_fuel(O,amount*0.25,d)
- O.hotspot_expose((T20C*2) + 380,500) //Light flamethrower fuel on fire immediately.
-
- amount *= 0.5
-
-
turf/simulated/var/fire_protection = 0 //Protects newly extinguished tiles from being overrun again.
turf/proc/apply_fire_protection()
turf/simulated/apply_fire_protection()
fire_protection = world.time
-datum/gas_mixture/proc/zburn(obj/liquid_fuel/liquid)
+datum/gas_mixture/proc/zburn(obj/effect/decal/cleanable/liquid_fuel/liquid)
//This proc is similar to fire(), but uses a simple logarithm to calculate temp, and is thus more stable with ZAS.
if(temperature > PLASMA_MINIMUM_BURN_TEMPERATURE)
var
@@ -295,7 +240,7 @@ datum/gas_mixture/proc/zburn(obj/liquid_fuel/liquid)
return 0
-datum/gas_mixture/proc/calculate_firelevel(obj/liquid_fuel/liquid)
+datum/gas_mixture/proc/calculate_firelevel(obj/effect/decal/cleanable/liquid_fuel/liquid)
//Calculates the firelevel based on one equation instead of having to do this multiple times in different areas.
var
datum/gas/volatile_fuel/fuel = locate() in trace_gases
diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm
index 79b094bbb4e..a5819e7a29d 100644
--- a/code/controllers/configuration.dm
+++ b/code/controllers/configuration.dm
@@ -102,6 +102,7 @@
var/metroid_delay = 0
var/animal_delay = 0
+ var/admin_legacy_system = 0 //Defines whether the server uses the legacy admin system with admins.txt or the SQL system.
/datum/configuration/New()
var/list/L = typesof(/datum/game_mode) - /datum/game_mode
@@ -158,6 +159,9 @@
if(type == "config")
switch (name)
+ if ("admin_legacy_system")
+ config.admin_legacy_system = 1
+
if ("log_ooc")
config.log_ooc = 1
diff --git a/code/controllers/verbs.dm b/code/controllers/verbs.dm
index 8e9fbf00701..fcd2c73012f 100644
--- a/code/controllers/verbs.dm
+++ b/code/controllers/verbs.dm
@@ -28,7 +28,7 @@
return
-/client/proc/debug_controller(controller in list("Master","Failsafe","Ticker","Lighting","Air","Jobs","Sun","Radio","Supply Shuttle","Emergency Shuttle","Configuration","pAI"))
+/client/proc/debug_controller(controller in list("Master","Failsafe","Ticker","Lighting","Air","Jobs","Sun","Radio","Supply Shuttle","Emergency Shuttle","Configuration","pAI", "Cameras"))
set category = "Debug"
set name = "Debug Controller"
set desc = "Debug the various periodic loop controllers for the game (be careful!)"
@@ -71,5 +71,8 @@
if("pAI")
debug_variables(paiController)
feedback_add_details("admin_verb","DpAI")
+ if("Cameras")
+ debug_variables(cameranet)
+ feedback_add_details("admin_verb","DCameras")
message_admins("Admin [key_name_admin(usr)] is debugging the [controller] controller.", 1)
return
diff --git a/code/controllers/voting.dm b/code/controllers/voting.dm
index f2596cd5f20..2cf82f11233 100644
--- a/code/controllers/voting.dm
+++ b/code/controllers/voting.dm
@@ -167,8 +167,11 @@ datum/controller/vote
proc/interface(var/client/C)
if(!C) return
var/admin = 0
+ var/trialmin = 0
if(C.holder)
admin = 1
+ if (C.holder.level >= 3)
+ trialmin = 1
voting |= C
. = "
Voting Panel"
@@ -186,24 +189,24 @@ datum/controller/vote
else
. += "Start a vote:
"
. += "Close"
diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm
index 19535a67921..c0aadf28ad1 100644
--- a/code/datums/datacore.dm
+++ b/code/datums/datacore.dm
@@ -11,9 +11,10 @@
var/datum/data/record/foundrecord
for(var/datum/data/record/t in data_core.general)
- if(t.fields["name"] == name)
- foundrecord = t
- break
+ if (t)
+ if(t.fields["name"] == name)
+ foundrecord = t
+ break
if(foundrecord)
foundrecord.fields["rank"] = assignment
@@ -36,6 +37,7 @@
var/id = add_zero(num2hex(rand(1, 1.6777215E7)), 6) //this was the best they could come up with? A large random number? *sigh*
+
//General Record
var/datum/data/record/G = new()
G.fields["id"] = id
@@ -48,6 +50,7 @@
G.fields["m_stat"] = "Stable"
G.fields["sex"] = H.gender
G.fields["species"] = H.get_species()
+ G.fields["photo"] = get_id_photo(H)
general += G
//Medical Record
@@ -94,3 +97,161 @@
locked += L
return
+
+proc/get_id_photo(var/mob/living/carbon/human/H)
+ var/icon/preview_icon = null
+
+ var/g = "m"
+ if (H.gender == FEMALE)
+ g = "f"
+ switch(H.get_species())
+ if("Tajaran")
+ preview_icon = new /icon('icons/effects/species.dmi', "tajaran_[g]_s")
+ preview_icon.Blend(new /icon('icons/effects/species.dmi', "tajtail_s"), ICON_OVERLAY)
+ if( "Soghun")
+ preview_icon = new /icon('icons/effects/species.dmi', "lizard_[g]_s")
+ preview_icon.Blend(new /icon('icons/effects/species.dmi', "sogtail_s"), ICON_OVERLAY)
+ if("Skrell")
+ preview_icon = new /icon('icons/effects/species.dmi', "skrell_[g]_s")
+ else
+ preview_icon = new /icon('human.dmi', "torso_[g]_s")
+ preview_icon.Blend(new /icon('human.dmi', "chest_[g]_s"), ICON_OVERLAY)
+ preview_icon.Blend(new /icon('human.dmi', "groin_[g]_s"), ICON_OVERLAY)
+ preview_icon.Blend(new /icon('human.dmi', "head_[g]_s"), ICON_OVERLAY)
+
+ for(var/datum/organ/external/E in H.organs)
+ if(E.status & ORGAN_CUT_AWAY) continue
+
+ var/icon/temp = new /icon('human.dmi', "[E.name]_s")
+ if(E.status & ORGAN_ROBOT)
+ temp.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0))
+
+ preview_icon.Blend(temp, ICON_OVERLAY)
+
+ // Skin tone
+ if(H.get_species() == "Human")
+ if (H.s_tone >= 0)
+ preview_icon.Blend(rgb(H.s_tone, H.s_tone, H.s_tone), ICON_ADD)
+ else
+ preview_icon.Blend(rgb(-H.s_tone, -H.s_tone, -H.s_tone), ICON_SUBTRACT)
+
+ var/icon/eyes_s = new/icon("icon" = 'icons/mob/human_face.dmi', "icon_state" = "eyes_s")
+ eyes_s.Blend(rgb(H.r_eyes, H.g_eyes, H.b_eyes), ICON_ADD)
+
+ var/datum/sprite_accessory/hair_style = hair_styles_list[H.h_style]
+ if(hair_style)
+ var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s")
+ hair_s.Blend(rgb(H.r_hair, H.g_hair, H.b_hair), ICON_ADD)
+ eyes_s.Blend(hair_s, ICON_OVERLAY)
+
+ var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[H.f_style]
+ if(facial_hair_style)
+ var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s")
+ facial_s.Blend(rgb(H.r_facial, H.g_facial, H.b_facial), ICON_ADD)
+ eyes_s.Blend(facial_s, ICON_OVERLAY)
+
+ var/icon/clothes_s = null
+ switch(H.mind.assigned_role)
+ if("Head of Personnel")
+ clothes_s = new /icon('icons/mob/uniform.dmi', "hop_s")
+ clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY)
+ if("Bartender")
+ clothes_s = new /icon('icons/mob/uniform.dmi', "ba_suit_s")
+ clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
+ if("Botanist")
+ clothes_s = new /icon('icons/mob/uniform.dmi', "hydroponics_s")
+ clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
+ if("Chef")
+ clothes_s = new /icon('icons/mob/uniform.dmi', "chef_s")
+ clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
+ if("Janitor")
+ clothes_s = new /icon('icons/mob/uniform.dmi', "janitor_s")
+ clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
+ if("Librarian")
+ clothes_s = new /icon('icons/mob/uniform.dmi', "red_suit_s")
+ clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
+ if("Quartermaster")
+ clothes_s = new /icon('icons/mob/uniform.dmi', "qm_s")
+ clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY)
+ if("Cargo Technician")
+ clothes_s = new /icon('icons/mob/uniform.dmi', "cargotech_s")
+ clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
+ if("Shaft Miner")
+ clothes_s = new /icon('icons/mob/uniform.dmi', "miner_s")
+ clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
+ if("Lawyer")
+ clothes_s = new /icon('icons/mob/uniform.dmi', "lawyer_blue_s")
+ clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY)
+ if("Chaplain")
+ clothes_s = new /icon('icons/mob/uniform.dmi', "chapblack_s")
+ clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
+ if("Research Director")
+ clothes_s = new /icon('icons/mob/uniform.dmi', "director_s")
+ clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY)
+ clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_open"), ICON_OVERLAY)
+ if("Scientist")
+ clothes_s = new /icon('icons/mob/uniform.dmi', "toxinswhite_s")
+ clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY)
+ clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_tox_open"), ICON_OVERLAY)
+ if("Chemist")
+ clothes_s = new /icon('icons/mob/uniform.dmi', "chemistrywhite_s")
+ clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY)
+ clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_chem_open"), ICON_OVERLAY)
+ if("Chief Medical Officer")
+ clothes_s = new /icon('icons/mob/uniform.dmi', "cmo_s")
+ clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY)
+ clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_cmo_open"), ICON_OVERLAY)
+ if("Medical Doctor")
+ clothes_s = new /icon('icons/mob/uniform.dmi', "medical_s")
+ clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY)
+ clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_open"), ICON_OVERLAY)
+ if("Geneticist")
+ clothes_s = new /icon('icons/mob/uniform.dmi', "geneticswhite_s")
+ clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY)
+ clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_gen_open"), ICON_OVERLAY)
+ if("Virologist")
+ clothes_s = new /icon('icons/mob/uniform.dmi', "virologywhite_s")
+ clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY)
+ clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_vir_open"), ICON_OVERLAY)
+ if("Captain")
+ clothes_s = new /icon('icons/mob/uniform.dmi', "captain_s")
+ clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY)
+ if("Head of Security")
+ clothes_s = new /icon('icons/mob/uniform.dmi', "hosred_s")
+ clothes_s.Blend(new /icon('icons/mob/feet.dmi', "jackboots"), ICON_UNDERLAY)
+ if("Warden")
+ clothes_s = new /icon('icons/mob/uniform.dmi', "warden_s")
+ clothes_s.Blend(new /icon('icons/mob/feet.dmi', "jackboots"), ICON_UNDERLAY)
+ if("Detective")
+ clothes_s = new /icon('icons/mob/uniform.dmi', "detective_s")
+ clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY)
+ clothes_s.Blend(new /icon('icons/mob/suit.dmi', "detective"), ICON_OVERLAY)
+ if("Security Officer")
+ clothes_s = new /icon('icons/mob/uniform.dmi', "secred_s")
+ clothes_s.Blend(new /icon('icons/mob/feet.dmi', "jackboots"), ICON_UNDERLAY)
+ if("Chief Engineer")
+ clothes_s = new /icon('icons/mob/uniform.dmi', "chief_s")
+ clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY)
+ clothes_s.Blend(new /icon('icons/mob/belt.dmi', "utility"), ICON_OVERLAY)
+ if("Station Engineer")
+ clothes_s = new /icon('icons/mob/uniform.dmi', "engine_s")
+ clothes_s.Blend(new /icon('icons/mob/feet.dmi', "orange"), ICON_UNDERLAY)
+ clothes_s.Blend(new /icon('icons/mob/belt.dmi', "utility"), ICON_OVERLAY)
+ if("Atmospheric Technician")
+ clothes_s = new /icon('icons/mob/uniform.dmi', "atmos_s")
+ clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
+ clothes_s.Blend(new /icon('icons/mob/belt.dmi', "utility"), ICON_OVERLAY)
+ if("Roboticist")
+ clothes_s = new /icon('icons/mob/uniform.dmi', "robotics_s")
+ clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
+ clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_open"), ICON_OVERLAY)
+ else
+ clothes_s = new /icon('icons/mob/uniform.dmi', "grey_s")
+ clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
+ preview_icon.Blend(eyes_s, ICON_OVERLAY)
+ if(clothes_s)
+ preview_icon.Blend(clothes_s, ICON_OVERLAY)
+ del(eyes_s)
+ del(clothes_s)
+
+ return preview_icon
\ No newline at end of file
diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm
index b2f9b63c8c7..352eaee7bd6 100644
--- a/code/datums/datumvars.dm
+++ b/code/datums/datumvars.dm
@@ -8,6 +8,11 @@ client
//set src in world
+ if(!usr.client || !usr.client.holder)
+ usr << "\red You need to be an administrator to access this."
+ return
+
+
var/title = ""
var/body = ""
@@ -403,6 +408,7 @@ client
else if (href_list["rename"])
var/mob/M = locate(href_list["rename"])
if(!istype(M)) return
+ if(!admin_rank_check(src.holder.level, 3)) return
var/new_name = copytext(sanitize(input(usr,"What would you like to name this mob?","Input a name",M.real_name) as text|null),1,MAX_NAME_LEN)
if( !new_name || !M ) return
@@ -468,6 +474,7 @@ client
return
if(!src.holder)
return
+ if(!admin_rank_check(src.holder.level, 3)) return
src.give_spell(MOB)
href_list["datumrefresh"] = href_list["give_spell"]
else if (href_list["ninja"])
@@ -480,6 +487,7 @@ client
return
if(!src.holder)
return
+ if(!admin_rank_check(src.holder.level, 3)) return
src.cmd_admin_ninjafy(MOB)
href_list["datumrefresh"] = href_list["ninja"]
else if (href_list["godmode"])
@@ -492,6 +500,7 @@ client
return
if(!src.holder)
return
+ if(!admin_rank_check(src.holder.level, 3)) return
src.cmd_admin_godmode(MOB)
href_list["datumrefresh"] = href_list["godmode"]
else if (href_list["gib"])
@@ -504,6 +513,7 @@ client
return
if(!src.holder)
return
+ if(!admin_rank_check(src.holder.level, 3)) return
src.cmd_admin_gib(MOB)
else if (href_list["build_mode"])
@@ -516,6 +526,7 @@ client
return
if(!src.holder)
return
+ if(!admin_rank_check(src.holder.level, 3)) return
togglebuildmode(MOB)
href_list["datumrefresh"] = href_list["build_mode"]
@@ -531,6 +542,7 @@ client
return
if(usr.client)
+ if(!admin_rank_check(src.holder.level, 3)) return
usr.client.cmd_admin_drop_everything(MOB)
else if (href_list["direct_control"])
@@ -545,6 +557,7 @@ client
return
if(usr.client)
+ if(!admin_rank_check(src.holder.level, 3)) return
usr.client.cmd_assume_direct_control(MOB)
else if (href_list["make_skeleton"])
@@ -559,6 +572,7 @@ client
return
if(ishuman(MOB))
+ if(!admin_rank_check(src.holder.level, 3)) return
var/mob/living/carbon/human/HUMANMOB = MOB
HUMANMOB.makeSkeleton()
@@ -566,6 +580,7 @@ client
if(!href_list["delall"])
return
var/atom/A = locate(href_list["delall"])
+ if(!admin_rank_check(src.holder.level, 3)) return
if(!A)
return
if(!isobj(A))
@@ -612,6 +627,7 @@ client
return
if(!isobj(A) && !ismob(A) && !isturf(A))
return
+ if(!admin_rank_check(src.holder.level, 3)) return
src.cmd_admin_explosion(A)
href_list["datumrefresh"] = href_list["explode"]
else if (href_list["emp"])
@@ -622,6 +638,7 @@ client
return
if(!isobj(A) && !ismob(A) && !isturf(A))
return
+ if(!admin_rank_check(src.holder.level, 3)) return
src.cmd_admin_emp(A)
href_list["datumrefresh"] = href_list["emp"]
else if (href_list["mark_object"])
@@ -632,9 +649,11 @@ client
return
if(!src.holder)
return
+ if(!admin_rank_check(src.holder.level, 3)) return
src.holder.marked_datum = D
href_list["datumrefresh"] = href_list["mark_object"]
else if (href_list["rotatedatum"])
+ if(!admin_rank_check(src.holder.level, 3)) return
if(!href_list["rotatedir"])
return
var/atom/A = locate(href_list["rotatedatum"])
@@ -655,6 +674,7 @@ client
var/mob/M = locate(href_list["makemonkey"])
if(!M)
return
+ if(!admin_rank_check(src.holder.level, 3)) return
if(!ishuman(M))
usr << "This can only be done to objects of type /mob/living/carbon/human"
return
@@ -672,6 +692,7 @@ client
var/mob/M = locate(href_list["makerobot"])
if(!M)
return
+ if(!admin_rank_check(src.holder.level, 3)) return
if(!ishuman(M))
usr << "This can only be done to objects of type /mob/living/carbon/human"
return
@@ -689,6 +710,7 @@ client
var/mob/M = locate(href_list["makealien"])
if(!M)
return
+ if(!admin_rank_check(src.holder.level, 3)) return
if(!ishuman(M))
usr << "This can only be done to objects of type /mob/living/carbon/human"
return
@@ -706,6 +728,7 @@ client
var/mob/M = locate(href_list["makemetroid"])
if(!M)
return
+ if(!admin_rank_check(src.holder.level, 3)) return
if(!ishuman(M))
usr << "This can only be done to objects of type /mob/living/carbon/human"
return
@@ -723,6 +746,7 @@ client
var/mob/M = locate(href_list["makeai"])
if(!M)
return
+ if(!admin_rank_check(src.holder.level, 3)) return
if(!ishuman(M))
usr << "This can only be done to objects of type /mob/living/carbon/human"
return
@@ -738,6 +762,7 @@ client
holder.Topic(href, list("makeai"=href_list["makeai"]))
else if (href_list["setmutantrace"])
var/mob/living/carbon/human/H = locate(href_list["setmutantrace"])
+ if(!admin_rank_check(src.holder.level, 3)) return
if(!istype(H))
usr << "This can only be done to objects of type /mob/living/carbon/human"
return
@@ -756,6 +781,7 @@ client
H.update_mutantrace()
else if (href_list["regenerateicons"])
var/mob/M = locate(href_list["regenerateicons"])
+ if(!admin_rank_check(src.holder.level, 3)) return
if(!istype(M))
usr << "This can only be done to objects of type /mob"
return
@@ -770,6 +796,8 @@ client
if(!isliving(M)) return
var/mob/living/L = M
+ if(!admin_rank_check(src.holder.level, 3)) return
+
var/amount = input("Deal how much damage to mob? (Negative values here heal)","Adjust [Text]loss",0) as num
if(Text == "brute")
L.adjustBruteLoss(amount)
diff --git a/code/datums/disease.dm b/code/datums/disease.dm
index 83dfbd7e95f..ad7fd93e45e 100644
--- a/code/datums/disease.dm
+++ b/code/datums/disease.dm
@@ -43,11 +43,14 @@ to null does not delete the object itself. Thank you.
var/severity = null//severity descr
var/longevity = 250//time in "ticks" the virus stays in inanimate object (blood stains, corpses, etc). In syringes, bottles and beakers it stays infinitely.
var/list/hidden = list(0, 0)
+ var/can_carry = 1 // If the disease allows "carriers".
+ var/age = 0 // age of the disease in the current mob
+ var/stage_minimum_age = 0 // how old the disease must be to advance per stage
// if hidden[1] is true, then virus is hidden from medical scanners
// if hidden[2] is true, then virus is hidden from PANDEMIC machine
-
/datum/disease/proc/stage_act()
+ age++
var/cure_present = has_cure()
//world << "[cure_present]"
@@ -59,7 +62,7 @@ to null does not delete the object itself. Thank you.
if(stage > max_stages)
stage = max_stages
- if(stage_prob != 0 && prob(stage_prob) && stage != max_stages && !cure_present) //now the disease shouldn't get back up to stage 4 in no time
+ if(stage_prob != 0 && prob(stage_prob) && stage != max_stages && !cure_present && age > stage_minimum_age * stage) //now the disease shouldn't get back up to stage 4 in no time
stage++
if(stage != 1 && (prob(1) || (cure_present && prob(cure_chance))))
stage--
diff --git a/code/datums/diseases/alien_embryo.dm b/code/datums/diseases/alien_embryo.dm
index 7928610439c..0e9f41e8b50 100644
--- a/code/datums/diseases/alien_embryo.dm
+++ b/code/datums/diseases/alien_embryo.dm
@@ -37,7 +37,8 @@
cure_id = list("lexorin","toxin","gargleblaster")
cure_chance = 20
affected_species = list("Human", "Monkey")
- permeability_mod = 3//likely to infect
+ permeability_mod = 15//likely to infect
+ can_carry = 0
var/gibbed = 0
/datum/disease/alien_embryo/stage_act()
@@ -79,14 +80,17 @@
affected_mob << "\red You feel something tearing its way out of your stomach..."
affected_mob.adjustToxLoss(10)
affected_mob.updatehealth()
- if(prob(40))
+ if(prob(50))
if(gibbed != 0) return 0
var/list/candidates = list() //List of candidate KEYS to assume control of the new larva ~Carn
- for(var/mob/dead/observer/G in player_list)
- if(G.client.be_alien)
- if(((G.client.inactivity/10)/60) <= 5)
- if(!(G.mind && G.mind.current && G.mind.current.stat != DEAD))
- candidates += G.key
+ var/i = 0
+ while(candidates.len <= 0 && i < 5)
+ for(var/mob/dead/observer/G in player_list)
+ if(G.client.be_alien)
+ if(((G.client.inactivity/10)/60) <= ALIEN_SELECT_AFK_BUFFER + i) // the most active players are more likely to become an alien
+ if(!(G.mind && G.mind.current && G.mind.current.stat != DEAD))
+ candidates += G.key
+ i++
var/mob/living/carbon/alien/larva/new_xeno = new(affected_mob.loc)
if(candidates.len)
diff --git a/code/datums/diseases/appendicitis.dm b/code/datums/diseases/appendicitis.dm
index 68a0eeabf83..c87d435e763 100644
--- a/code/datums/diseases/appendicitis.dm
+++ b/code/datums/diseases/appendicitis.dm
@@ -1,10 +1,10 @@
/datum/disease/appendicitis
form = "Condition"
name = "Appendicitis"
- max_stages = 3
+ max_stages = 4
spread = "Acute"
cure = "Surgery"
- agent = "Shitty Appendix"
+ agent = "Appendix"
affected_species = list("Human")
permeability_mod = 1
contagious_period = 9001 //slightly hacky, but hey! whatever works, right?
@@ -12,16 +12,22 @@
severity = "Medium"
longevity = 1000
hidden = list(0, 1)
+ stage_minimum_age = 100 // at least 100 life ticks per stage
/datum/disease/appendicitis/stage_act()
..()
switch(stage)
if(1)
- if(prob(5)) affected_mob.emote("cough")
+ if(affected_mob.op_stage.appendix == 2.0)
+ // appendix is removed, can't get infected again
+ src.cure()
+ if(prob(5))
+ affected_mob << "\red You feel a stinging pain in your abdomen!"
+ affected_mob.emote("me",1,"winces slightly.")
if(2)
if(prob(3))
affected_mob << "\red You feel a stabbing pain in your abdomen!"
- affected_mob.Stun(rand(2,3))
+ affected_mob.emote("me",1,"winces painfully.")
affected_mob.adjustToxLoss(1)
if(3)
if(prob(1))
@@ -38,4 +44,18 @@
else
affected_mob << "\red You gag as you want to throw up, but there's nothing in your stomach!"
affected_mob.Weaken(10)
- affected_mob.adjustToxLoss(3)
\ No newline at end of file
+ affected_mob.adjustToxLoss(3)
+
+ if(4)
+ if(prob(1) && ishuman(affected_mob))
+ var/mob/living/carbon/human/H = affected_mob
+ H << "\red Your abdomen is a world of pain!"
+ H.Weaken(10)
+ H.op_stage.appendix = 2.0
+
+ var/datum/organ/external/groin = H.get_organ("groin")
+ var/datum/wound/W = new /datum/wound/internal_bleeding(25)
+ H.adjustToxLoss(25)
+ groin.wounds += W
+
+ src.cure()
diff --git a/code/datums/diseases/dna_spread.dm b/code/datums/diseases/dna_spread.dm
index 3712ad2d25d..c7c5f812122 100644
--- a/code/datums/diseases/dna_spread.dm
+++ b/code/datums/diseases/dna_spread.dm
@@ -3,9 +3,9 @@
max_stages = 4
spread = "On contact"
spread_type = CONTACT_GENERAL
- cure = "Ryetalin"
- cure = "ryetalyn"
- curable = 0
+ cure = "Ryetalyn"
+ cure_id = "ryetalyn"
+ curable = 1
agent = "S4E1 retrovirus"
affected_species = list("Human")
var/list/original_dna = list()
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index 69c68d9c114..9a881b644ec 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -55,6 +55,9 @@ datum/mind
var/rev_cooldown = 0
+ // the world.time since the mob has been brigged, or -1 if not at all
+ var/brigged_since = -1
+
New(var/key)
src.key = key
@@ -344,6 +347,10 @@ datum/mind
log_admin("[key_name(usr)] tried to access [current]'s mind without authorization.")
return
+ if (!(usr.client.holder.rank in list("Trial Admin", "Badmin", "Game Admin", "Game Master")))
+ alert("You cannot perform this action. You must be of a higher administrative rank!")
+ return
+
if (href_list["role_edit"])
var/new_role = input("Select new role", "Assigned role", assigned_role) as null|anything in get_all_jobs()
if (!new_role) return
@@ -1081,6 +1088,37 @@ datum/mind
fail |= !ticker.mode.equip_revolutionary(current)
+ // check whether this mind's mob has been brigged for the given duration
+ // have to call this periodically for the duration to work properly
+ proc/is_brigged(duration)
+ var/turf/T = current.loc
+ if(!istype(T))
+ brigged_since = -1
+ return 0
+
+ var/is_currently_brigged = 0
+
+ if(istype(T.loc,/area/security/brig))
+ is_currently_brigged = 1
+ for(var/obj/item/weapon/card/id/card in current)
+ is_currently_brigged = 0
+ break // if they still have ID they're not brigged
+ for(var/obj/item/device/pda/P in current)
+ if(P.id)
+ is_currently_brigged = 0
+ break // if they still have ID they're not brigged
+
+ if(!is_currently_brigged)
+ brigged_since = -1
+ return 0
+
+ if(brigged_since == -1)
+ brigged_since = world.time
+
+ return (duration <= world.time - brigged_since)
+
+
+
//Initialisation procs
/mob/living/proc/mind_initialize()
diff --git a/code/datums/organs/organ_external.dm b/code/datums/organs/organ_external.dm
index 5c534bf45b6..722234ef32f 100644
--- a/code/datums/organs/organ_external.dm
+++ b/code/datums/organs/organ_external.dm
@@ -45,7 +45,6 @@
proc/take_damage(brute, burn, sharp, used_weapon = null, list/forbidden_limbs = list())
- // TODO: this proc needs to be rewritten to not update damages directly
if((brute <= 0) && (burn <= 0))
return 0
if(status & ORGAN_DESTROYED)
@@ -182,6 +181,11 @@
if(W.damage == 0 && W.created + 10 * 10 * 60 <= world.time)
wounds -= W
// let the GC handle the deletion of the wound
+ if(W.internal && !W.is_treated())
+ // internal wounds get worse over time
+ W.open_wound(0.5 * wound_update_accuracy)
+ owner.vessel.remove_reagent("blood",0.1 * W.damage * wound_update_accuracy)
+
if(W.is_treated())
// slow healing
var/amount = 0.2
@@ -197,6 +201,7 @@
proc/bandage()
var/rval = 0
for(var/datum/wound/W in wounds)
+ if(W.internal) continue
rval |= !W.bandaged
W.bandaged = 1
return rval
@@ -423,7 +428,7 @@
W = new wound_type(damage)
if(BURN)
- var/list/size_names = list(/datum/wound/moderate_burn, /datum/wound/large_burn, /datum/wound/severe_burn, /datum/wound/deep_burn, /datum/wound/carbonised_area)
+ var/list/size_names = list(/datum/wound/moderate_burn, /datum/wound/large_burn, /datum/wound/severe_burn, /datum/wound/deep_burn, /datum/wound/carbonised_area, /datum/wound/carbonised_area)
wound_type = size_names[size]
W = new wound_type(damage)
diff --git a/code/datums/organs/wound.dm b/code/datums/organs/wound.dm
index c72d5bcecbc..024419e1818 100644
--- a/code/datums/organs/wound.dm
+++ b/code/datums/organs/wound.dm
@@ -38,6 +38,9 @@
// 1 means all stages except the last should bleed
var/max_bleeding_stage = 1
+ // internal wounds can only be fixed through surgery
+ var/internal = 0
+
// helper lists
var/tmp/list/desc_list = list()
var/tmp/list/damage_list = list()
@@ -90,7 +93,13 @@
// heal the given amount of damage, and if the given amount of damage was more
// than what needed to be healed, return how much heal was left
- proc/heal_damage(amount)
+ // set @heals_internal to also heal internal organ damage
+ // TODO: set heals_internal to 0 by default
+ proc/heal_damage(amount, heals_internal = 1)
+ if(src.internal && !heals_internal)
+ // heal nothing
+ return amount
+
var/healed_damage = min(src.damage, amount)
amount -= healed_damage
src.damage -= healed_damage
@@ -114,7 +123,8 @@
src.min_damage = damage_list[current_stage]
proc/bleeding()
- return (!bandaged && (damage_type == BRUISE && damage >= 20 || damage_type == CUT) && current_stage <= max_bleeding_stage)
+ // internal wounds don't bleed in the sense of this function
+ return (!bandaged && (damage_type == BRUISE && damage >= 20 || damage_type == CUT) && current_stage <= max_bleeding_stage && !src.internal)
/** CUTS **/
/datum/wound/cut
@@ -211,4 +221,12 @@
needs_treatment = 1 // this only heals when bandaged
- damage_type = BURN
\ No newline at end of file
+ damage_type = BURN
+
+/datum/wound/internal_bleeding
+ internal = 1
+
+ stages = list("severed vein" = 30, "cut vein" = 20, "damaged vein" = 10, "bruised vein" = 5)
+ max_bleeding_stage = 0
+
+ needs_treatment = 1
\ No newline at end of file
diff --git a/code/defines/obj.dm b/code/defines/obj.dm
index 4915a0d1dee..739354707bb 100644
--- a/code/defines/obj.dm
+++ b/code/defines/obj.dm
@@ -192,38 +192,37 @@
var/d1 = 0
var/d2 = 1
layer = 2.44 //Just below unary stuff, which is at 2.45 and above pipes, which are at 2.4
- var/color="red"
+ var/color = "red"
var/obj/structure/powerswitch/power_switch
/obj/structure/cable/yellow
- color="yellow"
+ color = "yellow"
icon = 'icons/obj/power_cond_yellow.dmi'
/obj/structure/cable/green
- color="green"
+ color = "green"
icon = 'icons/obj/power_cond_green.dmi'
/obj/structure/cable/blue
- color="blue"
+ color = "blue"
icon = 'icons/obj/power_cond_blue.dmi'
/obj/structure/cable/pink
- color="pink"
+ color = "pink"
icon = 'icons/obj/power_cond_pink.dmi'
/obj/structure/cable/orange
- color="orange"
+ color = "orange"
icon = 'icons/obj/power_cond_orange.dmi'
/obj/structure/cable/cyan
- color="cyan"
+ color = "cyan"
icon = 'icons/obj/power_cond_cyan.dmi'
/obj/structure/cable/white
- color="white"
+ color = "white"
icon = 'icons/obj/power_cond_white.dmi'
-
/obj/effect/projection
name = "Projection"
desc = "This looks like a projection of something."
@@ -244,44 +243,6 @@
anchored = 1
unacidable = 1//temporary until I decide whether the borg can be removed. -veyveyr
-
-// Basically this Metroid Core catalyzes reactions that normally wouldn't happen anywhere
-/obj/item/metroid_core
- name = "roro core"
- desc = "A very slimy and tender part of a Rorobeast. Legends claim these to have \"magical powers\"."
- icon = 'icons/obj/surgery.dmi'
- icon_state = "roro core"
- flags = TABLEPASS
- force = 1.0
- w_class = 1.0
- throwforce = 1.0
- throw_speed = 3
- throw_range = 6
- origin_tech = "biotech=4"
- var/POWERFLAG = 0 // sshhhhhhh
- var/Flush = 30
- var/Uses = 5 // uses before it goes inert
-
- New()
- ..()
- var/datum/reagents/R = new/datum/reagents(100)
- reagents = R
- R.my_atom = src
- POWERFLAG = rand(1,10)
- Uses = rand(7, 25)
- //flags |= NOREACT
-
- spawn()
- Life()
-
- proc/Life()
- while(src)
- sleep(25)
- Flush--
- if(Flush <= 0)
- reagents.clear_reagents()
- Flush = 30
-
/obj/effect/deskclutter
name = "desk clutter"
icon = 'icons/obj/items.dmi'
diff --git a/code/defines/obj/machinery.dm b/code/defines/obj/machinery.dm
index fafebd47135..89413fce523 100644
--- a/code/defines/obj/machinery.dm
+++ b/code/defines/obj/machinery.dm
@@ -41,19 +41,6 @@
idle_power_usage = 10
active_power_usage = 100
-/obj/machinery/dispenser
- name = "tank storage unit"
- desc = "A simple yet bulky one-way storage device for gas tanks. Holds 10 plasma and 10 oxygen tanks."
- icon = 'icons/obj/objects.dmi'
- icon_state = "dispenser"
- density = 1
- var/o2tanks = 10.0
- var/pltanks = 10.0
- anchored = 1.0
- use_power = 1
- idle_power_usage = 5
- active_power_usage = 10
-
/obj/machinery/dna_scanner
name = "\improper DNA scanner/implanter"
desc = "It scans DNA structures."
diff --git a/code/defines/obj/storage.dm b/code/defines/obj/storage.dm
index 62279c6d3ee..6e120871f2b 100644
--- a/code/defines/obj/storage.dm
+++ b/code/defines/obj/storage.dm
@@ -180,11 +180,6 @@
icon_state = "satchel-cap"
item_state = "captainpack"
-/obj/item/weapon/storage/backpack/bandolier
- name = "bandolier"
- desc = "It's a very old bandolier to wear on your back."
- icon_state = "bandolier"
-
/obj/item/weapon/storage/backpack/industrial
name = "industrial backpack"
desc = "It's a tough backpack for the daily grind of station life."
diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm
index c97680fa145..dbe2d89d519 100644
--- a/code/defines/obj/weapon.dm
+++ b/code/defines/obj/weapon.dm
@@ -504,83 +504,6 @@
desc = "An untrustworthy bar of soap. Smells of fear."
icon_state = "soapsyndie"
-/obj/item/weapon/bedsheet
- name = "bedsheet"
- desc = "Nice, linen, bedsheet. Perfect to put on."
- icon = 'icons/obj/items.dmi'
- icon_state = "sheet"
- layer = 4.0
- item_state = "bedsheet"
- throwforce = 1
- w_class = 1.0
- throw_speed = 2
- throw_range = 10
- color = "white"
-
-/obj/item/weapon/bedsheet/blue
- icon_state = "sheetblue"
- color = "blue"
-
-/obj/item/weapon/bedsheet/green
- icon_state = "sheetgreen"
- color = "green"
-
-/obj/item/weapon/bedsheet/orange
- icon_state = "sheetorange"
- color = "orange"
-
-/obj/item/weapon/bedsheet/purple
- icon_state = "sheetpurple"
- color = "purple"
-
-/obj/item/weapon/bedsheet/rainbow
- icon_state = "sheetrainbow"
- color = "rainbow"
-
-/obj/item/weapon/bedsheet/red
- icon_state = "sheetred"
- color = "red"
-
-/obj/item/weapon/bedsheet/yellow
- icon_state = "sheetyellow"
- color = "yellow"
-
-/obj/item/weapon/bedsheet/mime
- icon_state = "sheetmime"
- color = "mime"
-
-/obj/item/weapon/bedsheet/clown
- icon_state = "sheetclown"
- color = "clown"
-
-/obj/item/weapon/bedsheet/captain
- icon_state = "sheetcaptain"
- color = "captain"
-
-/obj/item/weapon/bedsheet/rd
- icon_state = "sheetrd"
- color = "director"
-
-/obj/item/weapon/bedsheet/medical
- icon_state = "sheetmedical"
- color = "medical"
-
-/obj/item/weapon/bedsheet/hos
- icon_state = "sheethos"
- color = "hosred"
-
-/obj/item/weapon/bedsheet/hop
- icon_state = "sheethop"
- color = "hop"
-
-/obj/item/weapon/bedsheet/ce
- icon_state = "sheetce"
- color = "chief"
-
-/obj/item/weapon/bedsheet/brown
- icon_state = "sheetbrown"
- color = "brown"
-
/obj/item/weapon/bikehorn
name = "bike horn"
desc = "A horn off of a bicycle."
@@ -1153,18 +1076,6 @@
throw_range = 15
attack_verb = list("banned")
-/obj/item/weapon/pen/sleepypen
- desc = "It's a normal black ink pen with a sharp point and a carefully engraved \"Waffle Co.\""
- flags = FPRINT | TABLEPASS | OPENCONTAINER
- slot_flags = SLOT_BELT
- origin_tech = "materials=2;biotech=1;syndicate=7"
-
-/obj/item/weapon/pen/paralysis
- desc = "It's a normal black ink pen with a sharp point."
- flags = FPRINT | TABLEPASS | OPENCONTAINER
- slot_flags = SLOT_BELT
- origin_tech = "materials=2;biotech=1;syndicate=5"
-
/obj/item/weapon/rack_parts
name = "rack parts"
desc = "Parts of a rack."
@@ -1729,6 +1640,15 @@
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'
diff --git a/code/defines/procs/gamehelpers.dm b/code/defines/procs/gamehelpers.dm
index 5d8baf58df1..864cc3666fe 100644
--- a/code/defines/procs/gamehelpers.dm
+++ b/code/defines/procs/gamehelpers.dm
@@ -196,7 +196,7 @@
// This is usually for headsets, which only the wearer can hear.
if(R.canhear_range == 0)
if(ismob(R.loc))
- . += R.loc
+ . |= R.loc
continue
var/turf/speaker = get_turf(R)
diff --git a/code/defines/procs/helper_list.dm b/code/defines/procs/helper_list.dm
index cfc9a6edefe..827a6348c26 100644
--- a/code/defines/procs/helper_list.dm
+++ b/code/defines/procs/helper_list.dm
@@ -286,4 +286,22 @@ proc/listclearnulls(list/list)
if(Li <= L.len)
return (result + L.Copy(Li, 0))
- return (result + R.Copy(Ri, 0))
\ No newline at end of file
+ return (result + R.Copy(Ri, 0))
+
+
+//Converts a bitfield to a list of numbers (or words if a wordlist is provided)
+/proc/bitfield2list(bitfield = 0, list/wordlist)
+ var/list/r = list()
+ if(istype(wordlist,/list))
+ var/max = min(wordlist.len,16)
+ var/bit = 1
+ for(var/i=1, i<=max, i++)
+ if(bitfield & bit)
+ r += wordlist[i]
+ bit = bit << 1
+ else
+ for(var/bit=1, bit<=65535, bit = bit << 1)
+ if(bitfield & bit)
+ r += bit
+
+ return r
\ No newline at end of file
diff --git a/code/defines/procs/helpers.dm b/code/defines/procs/helpers.dm
index c9407bde7fe..8dc15b41103 100644
--- a/code/defines/procs/helpers.dm
+++ b/code/defines/procs/helpers.dm
@@ -327,8 +327,8 @@ Turf and target are seperate in case you want to teleport some distance from a t
if(isAI(src))
var/mob/living/silicon/ai/A = src
oldname = null//don't bother with the records update crap
- world << "[newname] is the AI!"
- world << sound('sound/AI/newAI.ogg')
+ //world << "[newname] is the AI!"
+ //world << sound('sound/AI/newAI.ogg')
// Set eyeobj name
if(A.eyeobj)
A.eyeobj.name = "[newname] (AI Eye)"
diff --git a/code/game/algorithm.dm b/code/game/algorithm.dm
deleted file mode 100644
index b9f08159b0f..00000000000
--- a/code/game/algorithm.dm
+++ /dev/null
@@ -1,74 +0,0 @@
-//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31
-#define RECOMMENDED_VERSION 494
-
-/world/New()
- ..()
- if(byond_version < RECOMMENDED_VERSION)
- world.log << "Your server's byond version does not meet the recommended requirements for Baystation12. Please update BYOND"
-
- diary = file("data/logs/[time2text(world.realtime, "YYYY/MM-Month/DD-Day")].log")
- diary << {"
-
-Starting up. [time2text(world.timeofday, "hh:mm.ss")]
----------------------
-"}
-
- diaryofmeanpeople = file("data/logs/[time2text(world.realtime, "YYYY/MM-Month/DD-Day")] Attack.log")
- diaryofmeanpeople << {"
-
-Starting up. [time2text(world.timeofday, "hh:mm.ss")]
----------------------
-"}
-
- href_logfile = file("data/logs/[time2text(world.realtime, "YYYY/MM-Month/DD-Day")] hrefs.html")
-
- jobban_loadbanfile()
- jobban_updatelegacybans()
- LoadBans()
- make_datum_references_lists() //initialises global lists for referencing frequently used datums (so that we only ever do it once)
- process_teleport_locs() //Sets up the wizard teleport locations
- process_ghost_teleport_locs() //Sets up ghost teleport locations.
- sleep_offline = 1
-
- spawn(180) //so we aren't adding to the round-start lag
- /*if(config.ToRban)
- ToRban_autoupdate()*/
- if(config.kick_inactive)
- KickInactiveClients()
-
-#undef RECOMMENDED_VERSION
-#define INACTIVITY_KICK 6000 //10 minutes in ticks (approx.)
-/world/proc/KickInactiveClients()
- for(var/client/C)
- if( !C.holder && (C.inactivity >= INACTIVITY_KICK) )
- if(C.mob)
- if(!istype(C.mob, /mob/dead/))
- log_access("AFK: [key_name(C)]")
- C << "\red You have been inactive for more than 10 minutes and have been disconnected."
- del(C)
- spawn(3000) KickInactiveClients()//more or less five minutes
-#undef INACTIVITY_KICK
-
-/// EXPERIMENTAL STUFF
-
-// This function counts a passed job.
-proc/countJob(rank)
- var/jobCount = 0
- for(var/mob/H in player_list)
- if(H.mind && H.mind.assigned_role == rank)
- jobCount++
- return jobCount
-
-/proc/AutoUpdateAI(obj/subject)
- if (subject!=null)
- for(var/mob/living/silicon/ai/M in player_list)
- if ((M.client && M.machine == subject))
- subject.attack_ai(M)
-
-/proc/AutoUpdateTK(obj/subject)
- if (subject!=null)
- for(var/obj/item/tk_grab/T in world)
- if (T.host)
- var/mob/M = T.host
- if(M.client && M.machine == subject)
- subject.attack_hand(M)
diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm
index e648ff6d3ca..da0749733ab 100755
--- a/code/game/area/Space Station 13 areas.dm
+++ b/code/game/area/Space Station 13 areas.dm
@@ -1466,6 +1466,88 @@ proc/process_ghost_teleport_locs()
name = "\improper Nanotrasen Cruiser"
icon_state = "away"
requires_power = 0
+
+/area/awaymission/spacebattle/syndicate1
+ name = "\improper Syndicate Assault Ship 1"
+
+/area/awaymission/spacebattle/syndicate2
+ name = "\improper Syndicate Assault Ship 2"
+
+/area/awaymission/spacebattle/syndicate3
+ name = "\improper Syndicate Assault Ship 3"
+
+/area/awaymission/spacebattle/syndicate4
+ name = "\improper Syndicate War Sphere 1"
+
+/area/awaymission/spacebattle/syndicate5
+ name = "\improper Syndicate War Sphere 2"
+
+/area/awaymission/spacebattle/syndicate6
+ name = "\improper Syndicate War Sphere 3"
+
+/area/awaymission/spacebattle/syndicate7
+ name = "\improper Syndicate Fighter"
+
+/area/awaymission/spacebattle/secret
+ name = "\improper Hidden Chamber"
+
+
+/area/awaymission/beach
+ name = "Beach"
+ icon_state = "null"
+ luminosity = 1
+ lighting_use_dynamic = 0
+ requires_power = 0
+ var/sound/mysound = null
+
+ New()
+ ..()
+ var/sound/S = new/sound()
+ mysound = S
+ S.file = 'sound/ambience/shore.ogg'
+ S.repeat = 1
+ S.wait = 0
+ S.channel = 123
+ S.volume = 100
+ S.priority = 255
+ S.status = SOUND_UPDATE
+ process()
+
+ Entered(atom/movable/Obj,atom/OldLoc)
+ if(ismob(Obj))
+ if(Obj:client)
+ mysound.status = SOUND_UPDATE
+ Obj << mysound
+ return
+
+ Exited(atom/movable/Obj)
+ if(ismob(Obj))
+ if(Obj:client)
+ mysound.status = SOUND_PAUSED | SOUND_UPDATE
+ Obj << mysound
+
+ proc/process()
+ set background = 1
+
+ var/sound/S = null
+ var/sound_delay = 0
+ if(prob(25))
+ S = sound(file=pick('sound/ambience/seag1.ogg','sound/ambience/seag2.ogg','sound/ambience/seag3.ogg'), volume=100)
+ sound_delay = rand(0, 50)
+
+ for(var/mob/living/carbon/human/H in src)
+ if(H.s_tone > -55)
+ H.s_tone--
+ H.update_body()
+ if(H.client)
+ mysound.status = SOUND_UPDATE
+ H << mysound
+ if(S)
+ spawn(sound_delay)
+ H << S
+
+ spawn(60) .()
+
/////////////////////////////////////////////////////////////////////
/*
Lists of areas to be used with is_type_in_list.
@@ -1586,4 +1668,5 @@ var/list/the_station_areas = list (
spawn(sound_delay)
H << S
- spawn(60) .()
\ No newline at end of file
+ spawn(60) .()
+
diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm
index d3971ac46af..29eb5cd6763 100644
--- a/code/game/area/areas.dm
+++ b/code/game/area/areas.dm
@@ -284,14 +284,22 @@
if ("Mine")
sound = pick('sound/ambience/ambimine.ogg')
musVolume = 25
+
+ if("Telecoms Teleporter") sound = pick('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg')
+ if("Telecoms Central Compartment") sound = pick('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg')
+ if("Telecoms Satellite") sound = pick('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg')
+ if("Telecoms Foyer") sound = pick('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg')
+ if("Telecommunications Satellite West Wing") sound = pick('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg')
+ if("Telecommunications Satellite East Wing") sound = pick('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg')
+ if("Telecoms Control Room") sound = pick('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg')
+ if("Telecommunications Satellite Lounge") sound = pick('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg')
+
else
sound = pick('sound/ambience/ambigen1.ogg','sound/ambience/ambigen3.ogg','sound/ambience/ambigen4.ogg','sound/ambience/ambigen5.ogg','sound/ambience/ambigen6.ogg','sound/ambience/ambigen7.ogg','sound/ambience/ambigen8.ogg','sound/ambience/ambigen9.ogg','sound/ambience/ambigen10.ogg','sound/ambience/ambigen11.ogg','sound/ambience/ambigen12.ogg','sound/ambience/ambigen14.ogg')
- if(findtext(src.name, "Telecommunications"))
- sound = pick('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg')
if (prob(35))
- if(A && A:client && !A:client:played)
+ if(A && A:client && !A:client:played && !A:client:no_ambi)
A << sound(sound, repeat = 0, wait = 0, volume = musVolume, channel = 1)
A:client:played = 1
spawn(600)
diff --git a/code/game/asteroid.dm b/code/game/asteroid.dm
index b0fdab9f3d0..9f21dbcd2ce 100644
--- a/code/game/asteroid.dm
+++ b/code/game/asteroid.dm
@@ -3,7 +3,7 @@ var/global/list/space_surprises = list( /obj/item/clothing/mask/facehugger =
/obj/item/weapon/pickaxe/silver =4,
/obj/item/weapon/pickaxe/drill =4,
/obj/item/weapon/pickaxe/jackhammer =4,
- /mob/living/simple_animal/carp =3,
+ //mob/living/simple_animal/hostile/carp =3,
/obj/item/weapon/pickaxe/diamond =3,
/obj/item/weapon/pickaxe/diamonddrill =3,
/obj/item/weapon/pickaxe/gold =3,
diff --git a/code/game/cellautomata.dm b/code/game/cellautomata.dm
deleted file mode 100644
index 86a002b51ca..00000000000
--- a/code/game/cellautomata.dm
+++ /dev/null
@@ -1,202 +0,0 @@
-/world/proc/load_mode()
- var/text = file2text("data/mode.txt")
- if (text)
- var/list/lines = dd_text2list(text, "\n")
- if (lines[1])
- master_mode = lines[1]
- diary << "Saved mode is '[master_mode]'"
-
-/world/proc/save_mode(var/the_mode)
- var/F = file("data/mode.txt")
- fdel(F)
- F << the_mode
-
-/world/proc/load_motd()
- join_motd = file2text("config/motd.txt")
-
-
-/world/proc/load_admins()
- var/text = file2text("config/admins.txt")
- if (!text)
- diary << "Failed to load config/admins.txt\n"
- else
- var/list/lines = dd_text2list(text, "\n")
- for(var/line in lines)
- if (!line)
- continue
-
- if (copytext(line, 1, 2) == ";")
- continue
-
- var/pos = findtext(line, " - ", 1, null)
- if (pos)
- var/m_key = copytext(line, 1, pos)
- var/a_lev = copytext(line, pos + 3, length(line) + 1)
- admins[m_key] = a_lev
- diary << ("ADMIN: [m_key] = [a_lev]")
-
- // look for moderators in a separate file
- text = file2text("config/moderators.txt")
- if (!text)
- diary << "Failed to load config/moderators.txt\n"
- else
- var/list/lines = dd_text2list(text, "\n")
- for(var/line in lines)
- if (!line)
- continue
-
- if (copytext(line, 1, 2) == ";")
- continue
-
- var/m_key = copytext(line, 1, length(line)+1)
- var/a_lev = "Moderator"
- admins[m_key] = a_lev
-
-/world/proc/load_testers()
- var/text = file2text("config/testers.txt")
- if (!text)
- diary << "Failed to load config/testers.txt\n"
- else
- var/list/lines = dd_text2list(text, "\n")
- for(var/line in lines)
- if (!line)
- continue
-
- if (copytext(line, 1, 2) == ";")
- continue
-
- var/pos = findtext(line, " - ", 1, null)
- if (pos)
- var/m_key = copytext(line, 1, pos)
- var/a_lev = copytext(line, pos + 3, length(line) + 1)
- admins[m_key] = a_lev
-
-
-/world/proc/load_configuration()
- config = new /datum/configuration()
- config.load("config/config.txt")
- config.load("config/game_options.txt","game_options")
- //config.loadsql("config/dbconfig.txt")
- //config.loadforumsql("config/forumdbconfig.txt")
- // apply some settings from config..
- abandon_allowed = config.respawn
-
-/world/New()
- src.load_configuration()
-
- if (config && config.server_name != null && config.server_suffix && world.port > 0)
- // dumb and hardcoded but I don't care~
- config.server_name += " #[(world.port % 1000) / 100]"
-
- src.load_mode()
- src.load_motd()
- src.load_admins()
- investigate_reset()
-
- if (config.usealienwhitelist)
- load_alienwhitelist()
- if (config.usewhitelist)
- load_whitelist()
-
- LoadBansjob()
- //Get_Holiday() //~Carn, needs to be here when the station is named so :P
- src.update_status()
- makepowernets()
-
- sun = new /datum/sun()
- vote = new /datum/vote()
- radio_controller = new /datum/controller/radio()
- data_core = new /obj/effect/datacore()
- paiController = new /datum/paiController()
-
- ..()
-
- sleep(50)
-
- plmaster = new /obj/effect/overlay( )
- plmaster.icon = 'icons/effects/tile_effects.dmi'
- plmaster.icon_state = "plasma"
- plmaster.layer = FLY_LAYER
- plmaster.mouse_opacity = 0
-
- slmaster = new /obj/effect/overlay( )
- slmaster.icon = 'icons/effects/tile_effects.dmi'
- slmaster.icon_state = "sleeping_agent"
- slmaster.layer = FLY_LAYER
- slmaster.mouse_opacity = 0
-
- src.update_status()
-
- socket_talk = new /datum/socket_talk()
- master_controller = new /datum/controller/game_controller()
- spawn(-1)
- master_controller.setup()
- lighting_controller.Initialize()
- return
-
-//Crispy fullban
-/world/Reboot(var/reason)
- spawn(0)
- send2irc(world.url,"Server Rebooting!")
- socket_talk.send_raw("type=reboot")
- //world << sound(pick('sound/AI/newroundsexy.ogg','sound/misc/apcdestroyed.ogg','sound/misc/bangindonk.ogg')) // random end sounds!! - LastyBatsy
-
- for(var/client/C)
- if (config.server) //if you set a server location in config.txt, it sends you there instead of trying to reconnect to the same world address. -- NeoFite
- C << link("byond://[config.server]")
- else
- C << link("byond://[world.address]:[world.port]")
-
-// sleep(10) // wait for sound to play
- ..(reason)
-
-/atom/proc/check_eye(user as mob)
- if (istype(user, /mob/living/silicon/ai))
- return 1
- return
-
-/atom/proc/on_reagent_change()
- return
-
-/atom/proc/Bumped(AM as mob|obj)
- return
-
-/atom/movable/Bump(var/atom/A as mob|obj|turf|area, yes)
- spawn( 0 )
- if ((A && yes))
- A.last_bumped = world.time
- A.Bumped(src)
- return
- ..()
- return
-
-// **** Note in 40.93.4, split into obj/mob/turf point verbs, no area
-
-/atom/verb/point()
- set name = "Point To"
- set category = "Object"
- set src in oview()
- var/atom/this = src//detach proc from src
- src = null
-
- if(!usr || !isturf(usr.loc))
- return
- if(usr.stat || usr.restrained())
- return
- if(usr.status_flags & FAKEDEATH)
- return
-
- var/tile = get_turf(this)
- if (!tile)
- return
-
- var/P = new /obj/effect/decal/point(tile)
- spawn (20)
- if(P) del(P)
-
- usr.visible_message("[usr] points to [this]")
-
-/obj/effect/decal/point/point()
- set src in oview()
- set hidden = 1
- return
\ No newline at end of file
diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm
index fda16d4d4ec..b988cf24470 100644
--- a/code/game/gamemodes/changeling/changeling.dm
+++ b/code/game/gamemodes/changeling/changeling.dm
@@ -215,6 +215,7 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
var/isabsorbing = 0
var/geneticpoints = 5
var/purchasedpowers = list()
+ var/mimicing = ""
/datum/changeling/New(var/gender=FEMALE)
..()
@@ -230,4 +231,13 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
/datum/changeling/proc/regenerate()
chem_charges = min(max(0, chem_charges+chem_recharge_rate), chem_storage)
- geneticdamage = max(0, geneticdamage-1)
\ No newline at end of file
+ geneticdamage = max(0, geneticdamage-1)
+
+
+/datum/changeling/proc/GetDNA(var/dna_owner)
+ var/datum/dna/chosen_dna
+ for(var/datum/dna/DNA in absorbed_dna)
+ if(dna_owner == DNA.real_name)
+ chosen_dna = DNA
+ break
+ return chosen_dna
\ No newline at end of file
diff --git a/code/game/gamemodes/changeling/changeling_powers.dm b/code/game/gamemodes/changeling/changeling_powers.dm
index 1416713022e..94bf80d6331 100644
--- a/code/game/gamemodes/changeling/changeling_powers.dm
+++ b/code/game/gamemodes/changeling/changeling_powers.dm
@@ -174,12 +174,7 @@
var/S = input("Select the target DNA: ", "Target DNA", null) as null|anything in names
if(!S) return
- var/datum/dna/chosen_dna
- for(var/datum/dna/DNA in changeling.absorbed_dna)
- if(S == "[DNA.real_name]")
- chosen_dna = DNA
- break
-
+ var/datum/dna/chosen_dna = changeling.GetDNA(S)
if(!chosen_dna)
return
@@ -277,12 +272,7 @@
var/S = input("Select the target DNA: ", "Target DNA", null) as null|anything in names
if(!S) return
- var/datum/dna/chosen_dna
- for(var/datum/dna/DNA in changeling.absorbed_dna)
- if(S == "[DNA.real_name]")
- chosen_dna = DNA
- break
-
+ var/datum/dna/chosen_dna = changeling.GetDNA(S)
if(!chosen_dna)
return
@@ -500,6 +490,102 @@
feedback_add_details("changeling_powers","RR")
return 1
+// HIVE MIND UPLOAD/DOWNLOAD DNA
+
+var/list/datum/dna/hivemind_bank = list()
+
+/mob/proc/changeling_hiveupload()
+ set category = "Changeling"
+ set name = "Hive Channel (10)"
+ set desc = "Allows you to channel DNA in the airwaves to allow other changelings to absorb it."
+
+ var/datum/changeling/changeling = changeling_power(10,1)
+ if(!changeling) return
+
+ var/list/names = list()
+ for(var/datum/dna/DNA in changeling.absorbed_dna)
+ if(!(DNA in hivemind_bank))
+ names += DNA.real_name
+
+ if(names.len <= 0)
+ usr << "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
+ if(!S) return
+
+ var/datum/dna/chosen_dna = changeling.GetDNA(S)
+ if(!chosen_dna)
+ return
+
+ changeling.chem_charges -= 10
+ hivemind_bank += chosen_dna
+ usr << "We channel the DNA of [S] to the air."
+ feedback_add_details("changeling_powers","HU")
+ return 1
+
+/mob/proc/changeling_hivedownload()
+ set category = "Changeling"
+ set name = "Hive Absorb (40)"
+ set desc = "Allows you to absorb DNA that is being channeled in the airwaves."
+
+ var/datum/changeling/changeling = changeling_power(40,1)
+ if(!changeling) return
+
+ var/list/names = list()
+ for(var/datum/dna/DNA in hivemind_bank)
+ if(!(DNA in changeling.absorbed_dna))
+ names[DNA.real_name] = DNA
+
+ if(names.len <= 0)
+ usr << "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
+ if(!S) return
+ var/datum/dna/chosen_dna = names[S]
+ if(!chosen_dna)
+ return
+
+ changeling.chem_charges -= 40
+ changeling.absorbed_dna += chosen_dna
+ usr << "We absorb the DNA of [S] from the air."
+ feedback_add_details("changeling_powers","HD")
+ return 1
+
+// Fake Voice
+
+/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."
+
+ var/datum/changeling/changeling = changeling_power(10,1)
+ if(!changeling) return
+
+ if(changeling.mimicing)
+ changeling.mimicing = ""
+ usr << "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."
+
+ 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
+ sleep(40)
+ if(src && src.mind && src.mind.changeling)
+ src.mind.changeling.mimicing = ""
//////////
//STINGS// //They get a pretty header because there's just so fucking many of them ;_;
//////////
@@ -617,12 +703,7 @@
var/S = input("Select the target DNA: ", "Target DNA", null) as null|anything in names
if(!S) return
- var/datum/dna/chosen_dna
- for(var/datum/dna/DNA in changeling.absorbed_dna)
- if(S == "[DNA.real_name]")
- chosen_dna = DNA
- break
-
+ var/datum/dna/chosen_dna = changeling.GetDNA(S)
if(!chosen_dna)
return
@@ -666,3 +747,23 @@
if(T.reagents) T.reagents.add_reagent("lexorin", 40)
feedback_add_details("changeling_powers","DTHS")
return 1
+
+/mob/proc/changeling_extract_dna_sting()
+ set category = "Changeling"
+ set name = "Extract DNA Sting (40)"
+ 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(!changeling)
+ return 0
+
+ var/mob/living/carbon/T = changeling_sting(40, /mob/proc/changeling_extract_dna_sting)
+ if(!T) return 0
+
+ T.dna.real_name = T.real_name
+ changeling.absorbed_dna |= T.dna
+
+ feedback_add_details("changeling_powers","ED")
+ return 1
\ No newline at end of file
diff --git a/code/game/gamemodes/changeling/modularchangling.dm b/code/game/gamemodes/changeling/modularchangling.dm
index e188419e744..2f3659bc7ac 100644
--- a/code/game/gamemodes/changeling/modularchangling.dm
+++ b/code/game/gamemodes/changeling/modularchangling.dm
@@ -1,3 +1,4 @@
+// READ: Don't use the apostrophe in name or desc. Causes script errors.
var/list/powers = typesof(/datum/power/changeling) - /datum/power/changeling //needed for the badmin verb for now
var/list/datum/power/changeling/powerinstances = list()
@@ -33,6 +34,22 @@ var/list/datum/power/changeling/powerinstances = list()
allowduringlesserform = 1
verbpath = /mob/proc/changeling_fakedeath
+// Hivemind
+
+/datum/power/changeling/hive_upload
+ name = "Hive Channel"
+ desc = "We can channel a DNA into the airwaves, allowing our fellow changelings to absorb it and transform into it as if they acquired the DNA themselves."
+ helptext = "Allows other changelings to absorb the DNA you channel from the airwaves. Will not help them towards their absorb objectives."
+ genomecost = 0
+ verbpath = /mob/proc/changeling_hiveupload
+
+/datum/power/changeling/hive_download
+ name = "Hive Absorb"
+ desc = "We can absorb a single DNA from the airwaves, allowing us to use more disguises with help from our fellow changelings."
+ helptext = "Allows you to absorb a single DNA and use it. Does not count towards your absorb objective."
+ genomecost = 0
+ verbpath = /mob/proc/changeling_hivedownload
+
/datum/power/changeling/lesser_form
name = "Lesser Form"
desc = "We debase ourselves and become lesser. We become a monkey."
@@ -61,6 +78,21 @@ var/list/datum/power/changeling/powerinstances = list()
allowduringlesserform = 1
verbpath = /mob/proc/changeling_silence_sting
+/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."
+ genomecost = 3
+ verbpath = /mob/proc/changeling_mimicvoice
+
+/datum/power/changeling/extractdna
+ name = "Extract DNA"
+ desc = "We stealthily sting a target and extract the DNA from them."
+ helptext = "Will give you the DNA of your target, allowing you to transform into them. Does not count towards absorb objectives."
+ genomecost = 4
+ allowduringlesserform = 1
+ verbpath = /mob/proc/changeling_extract_dna_sting
+
/datum/power/changeling/transformation_sting
name = "Transformation Sting"
desc = "We silently sting a human, injecting a retrovirus that forces them to transform into another."
@@ -135,7 +167,7 @@ var/list/datum/power/changeling/powerinstances = list()
name = "Digital Camoflauge"
desc = "We evolve the ability to distort our form and proprtions, defeating common altgorthms used to detect lifeforms on cameras."
helptext = "We cannot be tracked by camera while using this skill. However, humans looking at us will find us.. uncanny. We must constantly expend chemicals to maintain our form like this."
- genomecost = 4
+ genomecost = 3
allowduringlesserform = 1
verbpath = /mob/proc/changeling_digitalcamo
@@ -147,6 +179,7 @@ var/list/datum/power/changeling/powerinstances = list()
verbpath = /mob/proc/changeling_rapidregen
+
// Modularchangling, totally stolen from the new player panel. YAYY
/datum/changeling/proc/EvolutionMenu()//The new one
set category = "Changeling"
diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm
index 468ee56a11b..415bcfbb46c 100644
--- a/code/game/gamemodes/cult/ritual.dm
+++ b/code/game/gamemodes/cult/ritual.dm
@@ -504,15 +504,8 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology",
if (C>=26+runedec+ticker.mode.cult.len) //including the useless rune at the secret room, shouldn't count against the limit of 25 runes - Urist
- switch(alert("The cloth of reality can't take that much of a strain. By creating another rune, you risk locally tearing reality apart, which would prove fatal to you. Do you still wish to scribe the rune?",,"Yes","No"))
- if("Yes")
- if(prob(C*5-105-(runedec-ticker.mode.cult.len)*5)) //including the useless rune at the secret room, shouldn't count against the limit - Urist
- usr.emote("scream")
- user << "\red A tear momentarily appears in reality. Before it closes, you catch a glimpse of that which lies beyond. That proves to be too much for your mind."
- usr.gib()
- return
- if("No")
- return
+ alert("The cloth of reality can't take that much of a strain. Remove some runes first!")
+ return
else
switch(alert("You open the tome",,"Read it","Scribe a rune", "Notes")) //Fuck the "Cancel" option. Rewrite the whole tome interface yourself if you want it to work better. And input() is just ugly. - K0000
if("Cancel")
diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm
index ba1cd0c7c0d..fd815fefe6e 100644
--- a/code/game/gamemodes/cult/runes.dm
+++ b/code/game/gamemodes/cult/runes.dm
@@ -109,6 +109,7 @@ var/list/sacrificed = list()
"\red You hear an anguished scream.")
if(is_convertable_to_cult(M.mind))
ticker.mode.add_cultist(M.mind)
+ M.mind.special_role = "Cultist"
M << "Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind something sinister takes root."
M << "Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back."
return 1
@@ -130,7 +131,7 @@ var/list/sacrificed = list()
M.say("Tok-lyr rqa'nap g[pick("'","`")]lt-ulotf!")
cultist_count += 1
if(cultist_count >= 9)
- new /obj/machinery/singularity/narsie(src.loc)
+ new /obj/machinery/singularity/narsie/large(src.loc)
if(ticker.mode.name == "cult")
ticker.mode:eldergod = 0
return
@@ -390,6 +391,7 @@ var/list/sacrificed = list()
else
ticker.mode.cult+=D.mind
+ D.mind.special_role = "Cultist"
D << "Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind something sinister takes root."
D << "Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back."
diff --git a/code/game/gamemodes/events.dm b/code/game/gamemodes/events.dm
index 2140101f723..6a8487b5166 100644
--- a/code/game/gamemodes/events.dm
+++ b/code/game/gamemodes/events.dm
@@ -1,12 +1,13 @@
+
/proc/start_events()
//changed to a while(1) loop since they are more efficient.
//Moved the spawn in here to allow it to be called with advance proc call if it crashes.
//and also to stop spawn copying variables from the game ticker
spawn(3000)
while(1)
- /*if(prob(50))//Every 120 seconds and prob 50 2-4 weak spacedusts will hit the station
+ if(prob(50))//Every 120 seconds and prob 50 2-4 weak spacedusts will hit the station
spawn(1)
- dust_swarm("weak")*/
+ dust_swarm("weak")
if (!event)
//CARN: checks to see if random events are enabled.
if(config.allow_random_events && prob(eventchance))
@@ -36,15 +37,13 @@
meteor_wave()
spawn_meteors()
- /** NOPE!
- if(2)
+ /*if(2)
command_alert("Gravitational anomalies detected on the station. There is no additional data.", "Anomaly Alert")
world << 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)
- **/
+ 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")
@@ -68,12 +67,9 @@
spawn(rand(300,600))
del(P)
*/
-
- /** NOPE!
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()
@@ -81,18 +77,14 @@
high_radiation_event()
if(6)
viral_outbreak()
- /** NOPE!
if(7)
alien_infestation()
- **/
if(8)
prison_break()
if(9)
carp_migration()
- /** NOPE!
if(10)
immovablerod()
- **/
if(11)
lightsout(1,2)
if(12)
@@ -279,11 +271,14 @@
vents += temp_vent
var/list/candidates = list() //List of candidate KEYs to control the new larvae. ~Carn
- for(var/mob/dead/observer/G in player_list)
- if(G.client.be_alien)
- if(((G.client.inactivity/10)/60) <= 5)
- if(!(G.mind && G.mind.current && G.mind.current != DEAD))
- candidates += G.key
+ var/i = 0
+ while(candidates.len <= 0 && i < 5)
+ for(var/mob/dead/observer/G in player_list)
+ if(G.client.be_alien)
+ if(((G.client.inactivity/10)/60) <= ALIEN_SELECT_AFK_BUFFER + i) // the most active players are more likely to become an alien
+ if(!(G.mind && G.mind.current && G.mind.current.stat != DEAD))
+ candidates += G.key
+ i++
if(prob(33)) spawncount++ //sometimes, have two larvae spawn instead of one
while((spawncount >= 1) && vents.len && candidates.len)
@@ -352,20 +347,16 @@
for (var/obj/machinery/power/apc/temp_apc in A)
temp_apc.overload_lighting()
- for(var/area/A in areas)
for (var/obj/structure/closet/secure_closet/brig/temp_closet in A)
temp_closet.locked = 0
temp_closet.icon_state = temp_closet.icon_closed
- for(var/area/A in areas)
for (var/obj/machinery/door/airlock/security/temp_airlock in A)
- temp_airlock.prison_open()
+ spawn(0) temp_airlock.prison_open()
- for(var/area/A in areas)
for (var/obj/machinery/door/airlock/glass_security/temp_glassairlock in A)
- temp_glassairlock.prison_open()
+ spawn(0) temp_glassairlock.prison_open()
- for(var/area/A in areas)
for (var/obj/machinery/door_timer/temp_timer in A)
temp_timer.releasetime = 1
@@ -377,7 +368,7 @@
/proc/carp_migration() // -- Darem
for(var/obj/effect/landmark/C in landmarks_list)
if(C.name == "carpspawn")
- new /mob/living/simple_animal/carp(C.loc)
+ new /mob/living/simple_animal/hostile/carp(C.loc)
//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")
@@ -484,10 +475,10 @@ Would like to add a law like "Law x is _______" where x = a number, and _____ is
M << "\red YOU REQUIRE [require] IN ORDER TO PROTECT HUMANS... LAWS UPDATED"
M.add_ion_law("YOU REQUIRE [require] IN ORDER TO PROTECT HUMANS")
if(13)
- M << "\red [crew] is [allergysev] to [allergy]. LAWS UPDATED"
- M.add_ion_law("[crew] is [allergysev] to [allergy]. LAWS UPDATED")
+ M << "\red [crew] is [allergysev] to [allergy]...LAWS UPDATED"
+ M.add_ion_law("[crew] is [allergysev] to [allergy]")
if(14)
- M << "\ref THE STATION IS [who2pref] [who2]"
+ M << "\red THE STATION IS [who2pref] [who2]...LAWS UPDATED"
M.add_ion_law("THE STATION IS [who2pref] [who2]")
if(botEmagChance)
@@ -537,5 +528,4 @@ Would like to add a law like "Law x is _______" where x = a number, and _____ is
world << "Finished processing FIREDOORS. Processed: [firedoornum]"
world << "Ion Storm Main Done"
-
*/
\ No newline at end of file
diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm
index 352707db228..ae0c93ef040 100644
--- a/code/game/gamemodes/gameticker.dm
+++ b/code/game/gamemodes/gameticker.dm
@@ -124,7 +124,7 @@ var/global/datum/controller/gameticker/ticker
if (S.name != "AI")
del(S)
world << "Enjoy the game!"
-// world << sound('sound/AI/welcome.ogg') // Skie
+ world << sound('sound/AI/welcome.ogg') // Skie
//Holiday Round-start stuff ~Carn
Holiday_Game_Start()
diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm
index 40e81b18b8d..fd423f382f8 100644
--- a/code/game/gamemodes/nuclear/nuclearbomb.dm
+++ b/code/game/gamemodes/nuclear/nuclearbomb.dm
@@ -31,6 +31,16 @@
src.attack_hand(M)
return
+/obj/machinery/nuclearbomb/attackby(obj/item/weapon/I as obj, mob/user as mob)
+ if (src.extended)
+ if (istype(I, /obj/item/weapon/disk/nuclear))
+ usr.drop_item()
+ I.loc = src
+ src.auth = I
+ src.add_fingerprint(user)
+ return
+ ..()
+
/obj/machinery/nuclearbomb/attack_paw(mob/user as mob)
return src.attack_hand(user)
diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm
index 424c822d5ae..1d65b141cc7 100644
--- a/code/game/gamemodes/objective.dm
+++ b/code/game/gamemodes/objective.dm
@@ -119,6 +119,95 @@ datum/objective/mutiny/rp
return 0
return 1
+datum/objective/anti_revolution/execute
+ find_target()
+ ..()
+ if(target && target.current)
+ explanation_text = "[target.current.real_name], the [target.assigned_role] has extracted confidential information above their clearance. Execute \him[target.current]."
+ else
+ explanation_text = "Free Objective"
+ return target
+
+
+ find_target_by_role(role, role_type=0)
+ ..(role, role_type)
+ if(target && target.current)
+ explanation_text = "[target.current.real_name], the [!role_type ? target.assigned_role : target.special_role] has extracted confidential information above their clearance. Execute \him[target.current]."
+ else
+ explanation_text = "Free Objective"
+ return target
+
+ check_completion()
+ if(target && target.current)
+ if(target.current.stat == DEAD || !ishuman(target.current))
+ return 1
+ return 0
+ return 1
+
+datum/objective/anti_revolution/brig
+ var/already_completed = 0
+
+ find_target()
+ ..()
+ if(target && target.current)
+ explanation_text = "Brig [target.current.real_name], the [target.assigned_role] for 20 minutes to set an example."
+ else
+ explanation_text = "Free Objective"
+ return target
+
+
+ find_target_by_role(role, role_type=0)
+ ..(role, role_type)
+ if(target && target.current)
+ explanation_text = "Brig [target.current.real_name], the [!role_type ? target.assigned_role : target.special_role] for 20 minutes to set an example."
+ else
+ explanation_text = "Free Objective"
+ return target
+
+ check_completion()
+ if(already_completed)
+ return 1
+
+ if(target && target.current)
+ if(target.current.stat == DEAD)
+ return 0
+ if(target.is_brigged(10 * 60 * 10))
+ already_completed = 1
+ return 1
+ return 0
+ return 0
+
+datum/objective/anti_revolution/demote
+ find_target()
+ ..()
+ if(target && target.current)
+ explanation_text = "[target.current.real_name], the [target.assigned_role] has been classified as harmful to NanoTrasen's goals. Demote \him[target.current] to assistant."
+ else
+ explanation_text = "Free Objective"
+ return target
+
+ find_target_by_role(role, role_type=0)
+ ..(role, role_type)
+ if(target && target.current)
+ explanation_text = "[target.current.real_name], the [!role_type ? target.assigned_role : target.special_role] has been classified as harmful to NanoTrasen's goals. Demote \him[target.current] to assistant."
+ else
+ explanation_text = "Free Objective"
+ return target
+
+ check_completion()
+ if(target && target.current && istype(target,/mob/living/carbon/human))
+ var/obj/item/weapon/card/id/I = target.current:wear_id
+ if(istype(I, /obj/item/device/pda))
+ var/obj/item/device/pda/P = I
+ I = P.id
+
+ if(!istype(I)) return 1
+
+ if(I.assignment == "Assistant")
+ return 1
+ else
+ return 0
+ return 1
datum/objective/debrain//I want braaaainssss
find_target()
diff --git a/code/game/gamemodes/revolution/anti_revolution.dm b/code/game/gamemodes/revolution/anti_revolution.dm
new file mode 100644
index 00000000000..710b96e797e
--- /dev/null
+++ b/code/game/gamemodes/revolution/anti_revolution.dm
@@ -0,0 +1,222 @@
+// A sort of anti-revolution where the heads are given objectives to mess with the crew
+
+/datum/game_mode/anti_revolution
+ name = "anti-revolution"
+ config_tag = "anti-revolution"
+ required_players = 5
+
+ var/finished = 0
+ var/checkwin_counter = 0
+ var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds)
+ var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds)
+
+ var/required_execute_targets = 1
+ var/required_brig_targets = 0
+
+ var/recommended_execute_targets = 1
+ var/recommended_brig_targets = 3
+ var/recommended_demote_targets = 3
+
+ var/list/datum/mind/heads = list()
+ var/list/datum/mind/execute_targets = list()
+ var/list/datum/mind/brig_targets = list()
+ var/list/datum/mind/demote_targets = list()
+
+///////////////////////////
+//Announces the game type//
+///////////////////////////
+/datum/game_mode/anti_revolution/announce()
+ world << "The current game mode is - Anti-Revolution!"
+ world << "Looks like CentComm has given a few new orders.."
+
+///////////////////////////////////////////////////////////////////////////////
+//Gets the round setup, cancelling if there's not enough players at the start//
+///////////////////////////////////////////////////////////////////////////////
+/datum/game_mode/anti_revolution/pre_setup()
+ for(var/mob/new_player/player in world) if(player.mind)
+ if(player.mind.assigned_role in command_positions)
+ heads += player.mind
+ else
+ if(execute_targets.len < recommended_execute_targets)
+ execute_targets += player.mind
+ else if(brig_targets.len < recommended_brig_targets)
+ brig_targets += player.mind
+ else if(demote_targets.len < recommended_demote_targets)
+ demote_targets += player.mind
+
+
+ if(heads.len==0)
+ return 0
+
+ if(execute_targets.len < required_execute_targets || brig_targets.len < required_brig_targets)
+ return 0
+
+ return 1
+
+
+/datum/game_mode/anti_revolution/proc/add_head_objectives(datum/mind/head)
+ for(var/datum/mind/target in execute_targets)
+ var/datum/objective/anti_revolution/execute/obj = new
+ obj.owner = head
+ obj.target = target
+ obj.explanation_text = "[target.current.real_name], the [target.assigned_role] has extracted confidential information above their clearance. Execute them."
+ head.objectives += obj
+ for(var/datum/mind/target in brig_targets)
+ var/datum/objective/anti_revolution/brig/obj = new
+ obj.owner = head
+ obj.target = target
+ obj.explanation_text = "Brig [target.current.real_name], the [target.assigned_role] for 20 minutes to set an example."
+ head.objectives += obj
+ for(var/datum/mind/target in demote_targets)
+ var/datum/objective/anti_revolution/demote/obj = new
+ obj.owner = head
+ obj.target = target
+ obj.explanation_text = "[target.current.real_name], the [target.assigned_role] has been classified as harmful to NanoTrasen's goals. Demote them to assistant."
+ head.objectives += obj
+
+
+/datum/game_mode/anti_revolution/post_setup()
+
+ for(var/datum/mind/head_mind in heads)
+ add_head_objectives(head_mind)
+ for(var/datum/mind/head_mind in heads)
+ greet_head(head_mind)
+ modePlayer += heads
+ spawn (rand(waittime_l, waittime_h))
+ send_intercept()
+ ..()
+
+
+/datum/game_mode/anti_revolution/process()
+ checkwin_counter++
+ if(checkwin_counter >= 5)
+ if(!finished)
+ ticker.mode.check_win()
+ checkwin_counter = 0
+ return 0
+
+
+/datum/game_mode/proc/greet_head(var/datum/mind/head_mind, var/you_are=1)
+ var/obj_count = 1
+ if (you_are)
+ head_mind.current << "\blue It looks like this shift CentComm has some special orders for you.. check your objectives."
+ head_mind.current << "\blue Note that you can ignore these objectives, but resisting NT's orders probably means demotion or worse."
+ for(var/datum/objective/objective in head_mind.objectives)
+ head_mind.current << "Objective #[obj_count]: [objective.explanation_text]"
+ head_mind.special_role = "Corrupt Head"
+ obj_count++
+
+ head_mind.current.verbs += /mob/proc/ResignFromHeadPosition
+
+//////////////////////////////////////
+//Checks if the revs have won or not//
+//////////////////////////////////////
+/datum/game_mode/anti_revolution/check_win()
+ if(check_head_victory())
+ finished = 1
+ else if(check_crew_victory())
+ finished = 2
+ return
+
+///////////////////////////////
+//Checks if the round is over//
+///////////////////////////////
+/datum/game_mode/anti_revolution/check_finished()
+ if(finished != 0)
+ return 1
+ else
+ return 0
+
+
+//////////////////////////
+//Checks for crew victory//
+//////////////////////////
+/datum/game_mode/anti_revolution/proc/check_crew_victory()
+ for(var/datum/mind/head_mind in heads)
+ var/turf/T = get_turf(head_mind.current)
+ if((head_mind) && (head_mind.current) && (head_mind.current.stat != 2) && T && (T.z == 1) && !head_mind.is_brigged(600))
+ if(ishuman(head_mind.current))
+ return 0
+ return 1
+
+/////////////////////////////
+//Checks for a head victory//
+/////////////////////////////
+/datum/game_mode/anti_revolution/proc/check_head_victory()
+ for(var/datum/mind/head_mind in heads)
+ for(var/datum/objective/objective in head_mind.objectives)
+ if(!(objective.check_completion()))
+ return 0
+
+ return 1
+
+
+/datum/game_mode/anti_revolution/declare_completion()
+
+ var/text = ""
+ if(finished == 2)
+ world << "\red The heads of staff were relieved of their posts! The crew wins!"
+ else if(finished == 1)
+ world << "\red The heads of staff managed to meet the goals set for them by CentComm!"
+
+
+
+ world << "The heads of staff were: "
+ var/list/heads = list()
+ heads = get_all_heads()
+ for(var/datum/mind/head_mind in heads)
+ text = ""
+ if(head_mind.current)
+ text += "[head_mind.current.real_name]"
+ if(head_mind.current.stat == 2)
+ text += " (Dead)"
+ else
+ text += " (Survived!)"
+ else
+ text += "[head_mind.key] (character destroyed)"
+
+ world << text
+
+
+ world << "Their objectives were: "
+ for(var/datum/mind/head_mind in heads)
+ if(head_mind.objectives.len)//If the traitor had no objectives, don't need to process this.
+ var/count = 1
+ for(var/datum/objective/objective in head_mind.objectives)
+ if(objective.check_completion())
+ text += "
Objective #[count]: [objective.explanation_text] Success!"
+ feedback_add_details("head_objective","[objective.type]|SUCCESS")
+ else
+ text += "
Objective #[count]: [objective.explanation_text] Fail."
+ feedback_add_details("head_objective","[objective.type]|FAIL")
+ count++
+ break // just print once
+ return 1
+
+
+/datum/game_mode/anti_revolution/latespawn(mob/living/carbon/human/character)
+ ..()
+ if(emergency_shuttle.departed)
+ return
+
+ if(character.mind.assigned_role in command_positions)
+ heads += character.mind
+ modePlayer += character.mind
+ add_head_objectives(character.mind)
+ greet_head(character.mind)
+
+/mob/proc/ResignFromHeadPosition()
+ set category = "IC"
+ set name = "Resign From Head Position"
+
+ if(!istype(ticker.mode, /datum/game_mode/anti_revolution))
+ return
+
+ ticker.mode:heads -= src.mind
+ src.mind.objectives = list()
+ ticker.mode.modePlayer -= src.mind
+ src.mind.special_role = null
+
+ src.verbs -= /mob/proc/ResignFromHeadPosition
+
+ src << "\red You resigned from your position, now you have the consequences."
\ No newline at end of file
diff --git a/code/game/gamemodes/revolution/rp_revolution.dm b/code/game/gamemodes/revolution/rp_revolution.dm
index 4f02f87b74e..e26c0acc4d1 100644
--- a/code/game/gamemodes/revolution/rp_revolution.dm
+++ b/code/game/gamemodes/revolution/rp_revolution.dm
@@ -67,7 +67,6 @@
modePlayer += head_revolutionaries
spawn (rand(waittime_l, waittime_h))
send_intercept()
- ..()
/datum/game_mode/revolution/rp_revolution/greet_revolutionary(var/datum/mind/rev_mind, var/you_are=1)
var/obj_count = 1
@@ -108,6 +107,14 @@
return 0
return 1
+///////////////////////////
+//Announces the game type//
+///////////////////////////
+/datum/game_mode/revolution/rp_revolution/announce()
+ world << "The current game mode is - Revolution!"
+ world << "Some crewmembers are attempting to start a revolution!"
+
+
//////////////////////////////////////////////////////////////////////
//Announces the end of the game with all relavent information stated//
//////////////////////////////////////////////////////////////////////
@@ -130,10 +137,11 @@
/mob/living/carbon/human/proc/RevConvert(mob/M as mob in oview(src))
set name = "Rev-Convert"
+ set category = "IC"
if(((src.mind in ticker.mode:head_revolutionaries) || (src.mind in ticker.mode:revolutionaries)))
if((M.mind in ticker.mode:head_revolutionaries) || (M.mind in ticker.mode:revolutionaries))
src << "\red [M] is already be a revolutionary!"
- else if(ticker.mode:is_convertible(M))
+ else if(!ticker.mode:is_convertible(M))
src << "\red [M] is implanted with a loyalty implant - Remove it first!"
else
if(world.time < M.mind.rev_cooldown)
@@ -156,37 +164,37 @@
// only perform rev checks once in a while
if(tried_to_add_revheads < world.time)
tried_to_add_revheads = world.time+50
+ var/active_revs = 0
for(var/datum/mind/rev_mind in head_revolutionaries)
- var/active_revs = 0
if(rev_mind.current.client && rev_mind.current.client.inactivity <= 10*60*20) // 20 minutes inactivity are OK
active_revs++
- if(active_revs == 0)
- log_admin("There are zero active head revolutionists, trying to add some..")
- message_admins("There are zero active head revolutionists, trying to add some..")
- var/added_heads = 0
- for(var/mob/living/carbon/human/H in world) if(H.client && H.mind && H.client.inactivity <= 10*60*20 && H.mind in revolutionaries)
- head_revolutionaries += H.mind
- for(var/datum/mind/head_mind in heads)
- var/datum/objective/mutiny/rp/rev_obj = new
- rev_obj.owner = H.mind
- rev_obj.target = head_mind
- rev_obj.explanation_text = "Assassinate or capture [head_mind.name], the [head_mind.assigned_role]."
- H.mind.objectives += rev_obj
+ if(active_revs == 0)
+ log_admin("There are zero active head revolutionists, trying to add some..")
+ message_admins("There are zero active head revolutionists, trying to add some..")
+ var/added_heads = 0
+ for(var/mob/living/carbon/human/H in world) if(H.client && H.mind && H.client.inactivity <= 10*60*20 && H.mind in revolutionaries)
+ head_revolutionaries += H.mind
+ for(var/datum/mind/head_mind in heads)
+ var/datum/objective/mutiny/rp/rev_obj = new
+ rev_obj.owner = H.mind
+ rev_obj.target = head_mind
+ rev_obj.explanation_text = "Assassinate or capture [head_mind.name], the [head_mind.assigned_role]."
+ H.mind.objectives += rev_obj
- update_rev_icons_added(H.mind)
- H.verbs += /mob/living/carbon/human/proc/RevConvert
+ update_rev_icons_added(H.mind)
+ H.verbs += /mob/living/carbon/human/proc/RevConvert
- H << "\red Congratulations, yer heads of revolution are all gone now, so yer earned yourself a promotion."
- added_heads = 1
- break
+ H << "\red Congratulations, yer heads of revolution are all gone now, so yer earned yourself a promotion."
+ added_heads = 1
+ break
- if(added_heads)
- log_admin("Managed to add new heads of revolution.")
- message_admins("Managed to add new heads of revolution.")
- else
- log_admin("Unable to add new heads of revolution.")
- message_admins("Unable to add new heads of revolution.")
- tried_to_add_revheads = world.time + 6000 // wait 10 minutes
+ if(added_heads)
+ log_admin("Managed to add new heads of revolution.")
+ message_admins("Managed to add new heads of revolution.")
+ else
+ log_admin("Unable to add new heads of revolution.")
+ message_admins("Unable to add new heads of revolution.")
+ tried_to_add_revheads = world.time + 6000 // wait 10 minutes
return ..()
\ No newline at end of file
diff --git a/code/game/gamemodes/wizard/veilrender.dm b/code/game/gamemodes/wizard/veilrender.dm
index 53ee1bfa592..225158465fa 100644
--- a/code/game/gamemodes/wizard/veilrender.dm
+++ b/code/game/gamemodes/wizard/veilrender.dm
@@ -33,9 +33,7 @@
if(charged == 1)
new /obj/effect/rend(get_turf(usr))
charged = 0
- for(var/mob/M in viewers(usr, null))
- if ((M.client && !( M.blinded )))
- M.show_message("\red [src] hums with power as [usr] deals a blow to reality itself!")
+ visible_message("\red [src] hums with power as [usr] deals a blow to reality itself!")
else
user << "\red The unearthly energies that powered the blade are now dormant"
diff --git a/code/game/jobs/job/captain.dm b/code/game/jobs/job/captain.dm
index d77b866e001..40a06ea8554 100644
--- a/code/game/jobs/job/captain.dm
+++ b/code/game/jobs/job/captain.dm
@@ -20,6 +20,7 @@
U.hastie = new /obj/item/clothing/tie/medal/gold/captain(U)
H.equip_to_slot_or_del(U, slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/device/pda/captain(H), slot_belt)
+ H.equip_to_slot_or_del(new /obj/item/clothing/suit/armor/captain(H), slot_wear_suit)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/clothing/head/caphat(H), slot_head)
H.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(H), slot_glasses)
diff --git a/code/game/machinery/OpTable.dm b/code/game/machinery/OpTable.dm
index 37a427ff1b9..14337227017 100644
--- a/code/game/machinery/OpTable.dm
+++ b/code/game/machinery/OpTable.dm
@@ -52,26 +52,20 @@
/obj/machinery/optable/attack_paw(mob/user as mob)
if ((HULK in usr.mutations))
usr << text("\blue You destroy the operating table.")
- for(var/mob/O in oviewers())
- if ((O.client && !( O.blinded )))
- O << text("\red [usr] destroys the operating table.")
+ visible_message("\red [usr] destroys the operating table!")
src.density = 0
del(src)
if (!( locate(/obj/machinery/optable, user.loc) ))
step(user, get_dir(user, src))
if (user.loc == src.loc)
user.layer = TURF_LAYER
- for(var/mob/M in viewers(user, null))
- M.show_message("The monkey hides under the table!", 1)
- //Foreach goto(69)
+ visible_message("The monkey hides under the table!")
return
/obj/machinery/optable/attack_hand(mob/user as mob)
if ((HULK in usr.mutations) || (SUPRSTR in usr.augmentations))
usr << text("\blue You destroy the table.")
- for(var/mob/O in oviewers())
- if ((O.client && !( O.blinded )))
- O << text("\red [usr] destroys the table.")
+ visible_message("\red [usr] destroys the operating table!")
src.density = 0
del(src)
return
@@ -118,8 +112,7 @@
M.client.eye = src
M.resting = 1
M.loc = src.loc
- for (var/mob/C in viewers(src))
- C.show_message("\red [M] has been laid on the operating table by [user].", 3)
+ visible_message("\red [M] has been laid on the operating table by [user].", 3)
for(var/obj/O in src)
O.loc = src.loc
src.add_fingerprint(user)
diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm
index 60b7c7fa13b..a1eb4f21a58 100644
--- a/code/game/machinery/Sleeper.dm
+++ b/code/game/machinery/Sleeper.dm
@@ -180,8 +180,7 @@
usr << "[G.affecting.name] will not fit into the sleeper because they have a Metroid latched onto their head."
return
- for (var/mob/V in viewers(user))
- V.show_message("[user] starts putting [G.affecting.name] into the sleeper.", 3)
+ visible_message("[user] starts putting [G.affecting.name] into the sleeper.", 3)
if(do_after(user, 20))
if(src.occupant)
@@ -372,8 +371,7 @@
if(M.Victim == usr)
usr << "You're too busy getting your life sucked out of you."
return
- for(var/mob/V in viewers(usr))
- V.show_message("[usr] starts climbing into the sleeper.", 3)
+ visible_message("[usr] starts climbing into the sleeper.", 3)
if(do_after(usr, 20))
if(src.occupant)
usr << "\blue The sleeper is already occupied!"
diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm
index 816feff98c6..c5471bd696b 100644
--- a/code/game/machinery/adv_med.dm
+++ b/code/game/machinery/adv_med.dm
@@ -262,9 +262,6 @@
if(!D.hidden[SCANNER])
dat += text("Warning: [D.form] Detected\nName: [D.name].\nType: [D.spread].\nStage: [D.stage]/[D.max_stages].\nPossible Cure: [D.cure]
")
- if (occupant.virus2 || occupant.reagents.reagent_list.len > 0)
- dat += text("Warning: Foreign substances detected in bloodstream.")
-
dat += "
"
dat += ""
dat += "| Organ | "
@@ -273,8 +270,7 @@
dat += "Other Wounds | "
dat += "
"
- for(var/name in occupant.organs)
- var/datum/organ/external/e = occupant.organs[name]
+ for(var/datum/organ/external/e in occupant.organs)
dat += ""
var/AN = ""
var/open = ""
@@ -282,6 +278,10 @@
var/imp = ""
var/bled = ""
var/splint = ""
+ var/internal_bleeding = ""
+ for(var/datum/wound/W in e.wounds) if(W.internal)
+ internal_bleeding = "Internal Bleeding:"
+ break
if(e.status & ORGAN_SPLINTED)
splint = "Splinted:"
if(e.status & ORGAN_BLEEDING)
@@ -295,7 +295,7 @@
if(!AN && !open && !infected & !imp)
AN = "None"
if(!(e.status & ORGAN_DESTROYED))
- dat += "| [e.display_name] | [e.burn_dam] | [e.brute_dam] | [bled][AN][splint][open][infected][imp] | "
+ dat += "[e.display_name] | [e.burn_dam] | [e.brute_dam] | [bled][AN][splint][open][infected][imp][internal_bleeding] | "
else
dat += "[e.display_name] | - | - | Not Found | "
dat += "
"
diff --git a/code/game/machinery/airlock_control.dm b/code/game/machinery/airlock_control.dm
index e9af711662f..ec1667ad0c3 100644
--- a/code/game/machinery/airlock_control.dm
+++ b/code/game/machinery/airlock_control.dm
@@ -8,90 +8,98 @@ obj/machinery/door/airlock
var/datum/radio_frequency/radio_connection
explosion_resistance = 15
- receive_signal(datum/signal/signal)
- if(!signal || signal.encryption) return
- if(id_tag != signal.data["tag"] || !signal.data["command"]) return
+obj/machinery/door/airlock/receive_signal(datum/signal/signal)
+ if(!signal || signal.encryption) return
- switch(signal.data["command"])
- if("open")
- spawn open(1)
+ if(id_tag != signal.data["tag"] || !signal.data["command"]) return
- if("close")
- spawn close(1)
+ switch(signal.data["command"])
+ if("open")
+ open(1)
- if("unlock")
- locked = 0
- update_icon()
+ if("close")
+ close(1)
- if("lock")
- locked = 1
- update_icon()
+ if("unlock")
+ locked = 0
+ update_icon()
- if("secure_open")
- spawn
- locked = 0
- update_icon()
+ if("lock")
+ locked = 1
+ update_icon()
- sleep(2)
- open(1)
+ if("secure_open")
+ locked = 0
+ update_icon()
- locked = 1
- update_icon()
+ sleep(2)
+ open(1)
- if("secure_close")
- spawn
- locked = 0
- close(1)
+ locked = 1
+ update_icon()
- locked = 1
- sleep(2)
- update_icon()
+ if("secure_close")
+ locked = 0
+ close(1)
- send_status()
+ locked = 1
+ sleep(2)
+ update_icon()
- proc/send_status()
- if(radio_connection)
- var/datum/signal/signal = new
- signal.transmission_method = 1 //radio signal
- signal.data["tag"] = id_tag
- signal.data["timestamp"] = world.time
+ send_status()
- signal.data["door_status"] = density?("closed"):("open")
- signal.data["lock_status"] = locked?("locked"):("unlocked")
- radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, filter = RADIO_AIRLOCK)
+obj/machinery/door/airlock/proc/send_status()
+ if(radio_connection)
+ var/datum/signal/signal = new
+ signal.transmission_method = 1 //radio signal
+ signal.data["tag"] = id_tag
+ signal.data["timestamp"] = world.time
- open(surpress_send)
- . = ..()
- if(!surpress_send) send_status()
+ signal.data["door_status"] = density?("closed"):("open")
+ signal.data["lock_status"] = locked?("locked"):("unlocked")
- close(surpress_send)
- . = ..()
- if(!surpress_send) send_status()
+ radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, filter = RADIO_AIRLOCK)
- proc/set_frequency(new_frequency)
- radio_controller.remove_object(src, frequency)
- if(new_frequency)
- frequency = new_frequency
- radio_connection = radio_controller.add_object(src, frequency, RADIO_AIRLOCK)
- initialize()
- if(frequency)
- set_frequency(frequency)
+obj/machinery/door/airlock/open(surpress_send)
+ . = ..()
+ if(!surpress_send) send_status()
+
+
+obj/machinery/door/airlock/close(surpress_send)
+ . = ..()
+ if(!surpress_send) send_status()
+
+
+obj/machinery/door/airlock/proc/set_frequency(new_frequency)
+ radio_controller.remove_object(src, frequency)
+ if(new_frequency)
+ frequency = new_frequency
+ radio_connection = radio_controller.add_object(src, frequency, RADIO_AIRLOCK)
+
+
+obj/machinery/door/airlock/initialize()
+ if(frequency)
+ set_frequency(frequency)
+
+ update_icon()
+
+
+obj/machinery/door/airlock/New()
+ ..()
+
+ if(radio_controller)
+ set_frequency(frequency)
- update_icon()
- New()
- ..()
- if(radio_controller)
- set_frequency(frequency)
obj/machinery/airlock_sensor
icon = 'icons/obj/airlock_machines.dmi'
icon_state = "airlock_sensor_off"
- name = "Airlock Sensor"
+ name = "airlock sensor"
anchored = 1
power_channel = ENVIRON
@@ -105,60 +113,64 @@ obj/machinery/airlock_sensor
var/on = 1
var/alert = 0
- update_icon()
- if(on)
- if(alert)
- icon_state = "airlock_sensor_alert"
- else
- icon_state = "airlock_sensor_standby"
- else
- icon_state = "airlock_sensor_off"
- attack_hand(mob/user)
+obj/machinery/airlock_sensor/update_icon()
+ if(on)
+ if(alert)
+ icon_state = "airlock_sensor_alert"
+ else
+ icon_state = "airlock_sensor_standby"
+ else
+ icon_state = "airlock_sensor_off"
+
+obj/machinery/airlock_sensor/attack_hand(mob/user)
+ var/datum/signal/signal = new
+ signal.transmission_method = 1 //radio signal
+ signal.data["tag"] = master_tag
+ signal.data["command"] = "cycle"
+
+ radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, filter = RADIO_AIRLOCK)
+ flick("airlock_sensor_cycle", src)
+
+obj/machinery/airlock_sensor/process()
+ if(on)
var/datum/signal/signal = new
signal.transmission_method = 1 //radio signal
- signal.data["tag"] = master_tag
- signal.data["command"] = "cycle"
+ signal.data["tag"] = id_tag
+ signal.data["timestamp"] = world.time
+
+ var/datum/gas_mixture/air_sample = return_air()
+
+ var/pressure = round(air_sample.return_pressure(),0.1)
+ alert = (pressure < ONE_ATMOSPHERE*0.8)
+
+ signal.data["pressure"] = num2text(pressure)
radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, filter = RADIO_AIRLOCK)
- flick("airlock_sensor_cycle", src)
- process()
- if(on)
- var/datum/signal/signal = new
- signal.transmission_method = 1 //radio signal
- signal.data["tag"] = id_tag
- signal.data["timestamp"] = world.time
+ update_icon()
- var/datum/gas_mixture/air_sample = return_air()
+obj/machinery/airlock_sensor/proc/set_frequency(new_frequency)
+ radio_controller.remove_object(src, frequency)
+ frequency = new_frequency
+ radio_connection = radio_controller.add_object(src, frequency, RADIO_AIRLOCK)
- var/pressure = round(air_sample.return_pressure(),0.1)
- alert = (pressure < ONE_ATMOSPHERE*0.8)
+obj/machinery/airlock_sensor/initialize()
+ set_frequency(frequency)
- signal.data["pressure"] = num2text(pressure)
+obj/machinery/airlock_sensor/New()
+ ..()
- radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, filter = RADIO_AIRLOCK)
-
- update_icon()
-
- proc/set_frequency(new_frequency)
- radio_controller.remove_object(src, frequency)
- frequency = new_frequency
- radio_connection = radio_controller.add_object(src, frequency, RADIO_AIRLOCK)
-
- initialize()
+ if(radio_controller)
set_frequency(frequency)
- New()
- ..()
- if(radio_controller)
- set_frequency(frequency)
+
obj/machinery/access_button
icon = 'icons/obj/airlock_machines.dmi'
icon_state = "access_button_standby"
- name = "Access Button"
+ name = "access button"
anchored = 1
power_channel = ENVIRON
@@ -171,37 +183,41 @@ obj/machinery/access_button
var/on = 1
- update_icon()
- if(on)
- icon_state = "access_button_standby"
- else
- icon_state = "access_button_off"
- attack_hand(mob/user)
- src.add_fingerprint(usr)
- if(!allowed(user))
- user << "\red Access Denied"
+obj/machinery/access_button/update_icon()
+ if(on)
+ icon_state = "access_button_standby"
+ else
+ icon_state = "access_button_off"
- else if(radio_connection)
- var/datum/signal/signal = new
- signal.transmission_method = 1 //radio signal
- signal.data["tag"] = master_tag
- signal.data["command"] = command
- radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, filter = RADIO_AIRLOCK)
- flick("access_button_cycle", src)
+obj/machinery/access_button/attack_hand(mob/user)
+ add_fingerprint(usr)
+ if(!allowed(user))
+ user << "\red Access Denied"
- proc
- set_frequency(new_frequency)
- radio_controller.remove_object(src, frequency)
- frequency = new_frequency
- radio_connection = radio_controller.add_object(src, frequency, RADIO_AIRLOCK)
+ else if(radio_connection)
+ var/datum/signal/signal = new
+ signal.transmission_method = 1 //radio signal
+ signal.data["tag"] = master_tag
+ signal.data["command"] = command
- initialize()
- set_frequency(frequency)
+ radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, filter = RADIO_AIRLOCK)
+ flick("access_button_cycle", src)
- New()
- ..()
- if(radio_controller)
- set_frequency(frequency)
+obj/machinery/access_button/proc/set_frequency(new_frequency)
+ radio_controller.remove_object(src, frequency)
+ frequency = new_frequency
+ radio_connection = radio_controller.add_object(src, frequency, RADIO_AIRLOCK)
+
+
+obj/machinery/access_button/initialize()
+ set_frequency(frequency)
+
+
+obj/machinery/access_button/New()
+ ..()
+
+ if(radio_controller)
+ set_frequency(frequency)
\ No newline at end of file
diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm
index 8e5736541e1..0dc8fec3c6a 100644
--- a/code/game/machinery/atmoalter/canister.dm
+++ b/code/game/machinery/atmoalter/canister.dm
@@ -166,8 +166,7 @@
/obj/machinery/portable_atmospherics/canister/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob)
if(!istype(W, /obj/item/weapon/wrench) && !istype(W, /obj/item/weapon/tank) && !istype(W, /obj/item/device/analyzer) && !istype(W, /obj/item/device/pda))
- for(var/mob/V in viewers(src, null))
- V.show_message(text("\red [user] hits the [src] with a [W]!"))
+ visible_message("\red [user] hits the [src] with a [W]!")
src.health -= W.force
src.add_fingerprint(user)
healthcheck()
diff --git a/code/game/machinery/atmoalter/meter.dm b/code/game/machinery/atmoalter/meter.dm
index c4f40ebb13b..0db8c0c14e0 100644
--- a/code/game/machinery/atmoalter/meter.dm
+++ b/code/game/machinery/atmoalter/meter.dm
@@ -1,8 +1,6 @@
/obj/machinery/meter/New()
..()
-
src.target = locate(/obj/machinery/atmospherics/pipe) in loc
-
return 1
/obj/machinery/meter/initialize()
@@ -105,4 +103,19 @@
"\blue You have unfastened \the [src].", \
"You hear ratchet.")
new /obj/item/pipe_meter(src.loc)
- del(src)
\ No newline at end of file
+ del(src)
+
+// TURF METER - REPORTS A TILE'S AIR CONTENTS
+
+/obj/machinery/meter/turf/New()
+ ..()
+ src.target = loc
+ return 1
+
+
+/obj/machinery/meter/turf/initialize()
+ if (!target)
+ src.target = loc
+
+/obj/machinery/meter/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob)
+ return
\ No newline at end of file
diff --git a/code/game/machinery/atmoalter/portable_atmospherics.dm b/code/game/machinery/atmoalter/portable_atmospherics.dm
index 5130c37be47..171552fa488 100644
--- a/code/game/machinery/atmoalter/portable_atmospherics.dm
+++ b/code/game/machinery/atmoalter/portable_atmospherics.dm
@@ -106,8 +106,7 @@
return
else if ((istype(W, /obj/item/device/analyzer) || (istype(W, /obj/item/device/pda))) && get_dist(user, src) <= 1)
- for (var/mob/O in viewers(user, null))
- O << "\red [user] has used [W] on \icon[icon]"
+ visible_message("\red [user] has used [W] on \icon[icon]")
if(air_contents)
var/pressure = air_contents.return_pressure()
var/total_moles = air_contents.total_moles()
diff --git a/code/game/machinery/bots/cleanbot.dm b/code/game/machinery/bots/cleanbot.dm
index 14f34de449a..3a8a9a6b227 100644
--- a/code/game/machinery/bots/cleanbot.dm
+++ b/code/game/machinery/bots/cleanbot.dm
@@ -167,12 +167,10 @@ text("[src.oddbutton ? "Yes" : "No"
var/list/cleanbottargets = list()
if(!src.screwloose && !src.oddbutton && prob(5))
- for(var/mob/O in viewers(src, null))
- O.show_message(text("[src] makes an excited beeping booping sound!"), 1)
+ visible_message("[src] makes an excited beeping booping sound!")
if(src.screwloose && prob(5))
- for(var/mob/O in viewers(src, null))
- O.show_message(text("[src] leaks a drop of water. How strange."), 1)
+ visible_message("[src] leaks a drop of water. How strange.")
if(istype(loc,/turf/simulated))
var/turf/simulated/T = src.loc
if(T.wet < 1)
@@ -189,8 +187,7 @@ text("[src.oddbutton ? "Yes" : "No"
T.overlays -= T.wet_overlay
T.wet_overlay = null
if(src.oddbutton && prob(5))
- for(var/mob/O in viewers(src, null))
- O.show_message(text("Something flies out of [src]. He seems to be acting oddly."), 1)
+ visible_message("Something flies out of [src]. He seems to be acting oddly.")
var/obj/effect/decal/cleanable/blood/gibs/gib = new /obj/effect/decal/cleanable/blood/gibs(src.loc)
//gib.streak(list(NORTH, SOUTH, EAST, WEST, NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST))
src.oldtarget = gib
@@ -301,6 +298,7 @@ text("[src.oddbutton ? "Yes" : "No"
target_types += /obj/effect/decal/cleanable/vomit
target_types += /obj/effect/decal/cleanable/robot_debris
target_types += /obj/effect/decal/cleanable/crayon
+ target_types += /obj/effect/decal/cleanable/liquid_fuel
if(src.blood)
target_types += /obj/effect/decal/cleanable/xenoblood/
@@ -312,8 +310,7 @@ text("[src.oddbutton ? "Yes" : "No"
/obj/machinery/bot/cleanbot/proc/clean(var/obj/effect/decal/cleanable/target)
src.anchored = 1
src.icon_state = "cleanbot-c"
- for(var/mob/O in viewers(src, null))
- O.show_message(text("\red [src] begins to clean up the [target]"), 1)
+ visible_message("\red [src] begins to clean up the [target]")
src.cleaning = 1
spawn(50)
src.cleaning = 0
diff --git a/code/game/machinery/bots/ed209bot.dm b/code/game/machinery/bots/ed209bot.dm
index 0ed7a0948e5..2c0cd9da7b9 100644
--- a/code/game/machinery/bots/ed209bot.dm
+++ b/code/game/machinery/bots/ed209bot.dm
@@ -288,8 +288,7 @@ Auto Patrol: []"},
maxstuns--
if (maxstuns <= 0)
target = null
- for(var/mob/O in viewers(src, null))
- O.show_message("\red [src.target] has been stunned by [src]!", 1, "\red You hear someone fall", 2)
+ visible_message("\red [src.target] has been stunned by [src]!")
mode = SECBOT_PREP_ARREST
src.anchored = 1
@@ -321,8 +320,7 @@ Auto Patrol: []"},
if (!src.target.handcuffed && !src.arrest_type)
playsound(src.loc, 'sound/weapons/handcuffs.ogg', 30, 1, -2)
mode = SECBOT_ARREST
- for(var/mob/O in viewers(src, null))
- O.show_message("\red [src] is trying to put handcuffs on [src.target]!", 1)
+ visible_message("\red [src] is trying to put handcuffs on [src.target]!")
spawn(60)
if (get_dist(src, src.target) <= 1)
diff --git a/code/game/machinery/bots/floorbot.dm b/code/game/machinery/bots/floorbot.dm
index e40f855b49f..f7c923e8e80 100644
--- a/code/game/machinery/bots/floorbot.dm
+++ b/code/game/machinery/bots/floorbot.dm
@@ -190,8 +190,7 @@
else
return
if(prob(5))
- for(var/mob/O in viewers(src, null))
- O.show_message(text("[src] makes an excited booping beeping sound!"), 1)
+ visible_message("[src] makes an excited booping beeping sound!")
if((!src.target || src.target == null) && emagged < 2)
if(targetdirection != null)
@@ -272,8 +271,7 @@
F.break_tile_to_plating()
else
F.ReplaceWithLattice()
- for(var/mob/O in viewers(src, null))
- O.show_message(text("\red [src] makes an excited booping sound."), 1)
+ visible_message("\red [src] makes an excited booping sound.")
spawn(50)
src.amount ++
src.anchored = 0
@@ -296,8 +294,7 @@
src.anchored = 1
src.icon_state = "floorbot-c"
if(istype(target, /turf/space/))
- for(var/mob/O in viewers(src, null))
- O.show_message(text("\red [src] begins to repair the hole"), 1)
+ visible_message("\red [src] begins to repair the hole")
var/obj/item/stack/tile/plasteel/T = new /obj/item/stack/tile/plasteel
src.repairing = 1
spawn(50)
@@ -308,8 +305,7 @@
src.anchored = 0
src.target = null
else
- for(var/mob/O in viewers(src, null))
- O.show_message(text("\red [src] begins to improve the floor."), 1)
+ visible_message("\red [src] begins to improve the floor.")
src.repairing = 1
spawn(50)
src.loc.icon_state = "floor"
@@ -322,8 +318,7 @@
/obj/machinery/bot/floorbot/proc/eattile(var/obj/item/stack/tile/plasteel/T)
if(!istype(T, /obj/item/stack/tile/plasteel))
return
- for(var/mob/O in viewers(src, null))
- O.show_message(text("\red [src] begins to collect tiles."), 1)
+ visible_message("\red [src] begins to collect tiles.")
src.repairing = 1
spawn(20)
if(isnull(T))
@@ -346,8 +341,7 @@
return
if(M.amount > 1)
return
- for(var/mob/O in viewers(src, null))
- O.show_message(text("\red [src] begins to create tiles."), 1)
+ visible_message("\red [src] begins to create tiles.")
src.repairing = 1
spawn(20)
if(isnull(M))
diff --git a/code/game/machinery/bots/medbot.dm b/code/game/machinery/bots/medbot.dm
index d987a34f41e..f66910d3615 100644
--- a/code/game/machinery/bots/medbot.dm
+++ b/code/game/machinery/bots/medbot.dm
@@ -409,8 +409,7 @@
return
else
src.icon_state = "medibots"
- for(var/mob/O in viewers(src, null))
- O.show_message("\red [src] is trying to inject [src.patient]!", 1)
+ visible_message("\red [src] is trying to inject [src.patient]!")
spawn(30)
if ((get_dist(src, src.patient) <= 1) && (src.on))
if((reagent_id == "internal_beaker") && (src.reagent_glass) && (src.reagent_glass.reagents.total_volume))
@@ -418,8 +417,7 @@
src.reagent_glass.reagents.reaction(src.patient, 2)
else
src.patient.reagents.add_reagent(reagent_id,src.injection_amount)
- for(var/mob/O in viewers(src, null))
- O.show_message("\red [src] injects [src.patient] with the syringe!", 1)
+ visible_message("\red [src] injects [src.patient] with the syringe!")
src.icon_state = "medibot[src.on]"
src.currently_healing = 0
@@ -432,8 +430,7 @@
/obj/machinery/bot/medbot/proc/speak(var/message)
if((!src.on) || (!message))
return
- for(var/mob/O in hearers(src, null))
- O.show_message("[src] beeps, \"[message]\"",2)
+ visible_message("[src] beeps, \"[message]\"")
return
/obj/machinery/bot/medbot/bullet_act(var/obj/item/projectile/Proj)
@@ -448,8 +445,7 @@
/obj/machinery/bot/medbot/explode()
src.on = 0
- for(var/mob/O in hearers(src, null))
- O.show_message("\red [src] blows apart!", 1)
+ visible_message("\red [src] blows apart!", 1)
var/turf/Tsec = get_turf(src)
new /obj/item/weapon/storage/firstaid(Tsec)
diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm
index 0b9c2d06fe7..43387172fd6 100644
--- a/code/game/machinery/camera/camera.dm
+++ b/code/game/machinery/camera/camera.dm
@@ -49,7 +49,7 @@
/obj/machinery/camera/emp_act(severity)
if(!isEmpProof())
if(prob(100/severity))
- icon_state = "cameraemp"
+ icon_state = "[initial(icon_state)]emp"
network = null //Not the best way but it will do. I think.
cameranet.removeCamera(src)
stat |= EMPED
@@ -98,7 +98,7 @@
for(var/mob/O in viewers(user, null))
O.show_message("\The [user] slashes at [src]!", 1)
playsound(src.loc, 'sound/weapons/slash.ogg', 100, 1)
- icon_state = "camera1"
+ icon_state = "[initial(icon_state)]1"
add_hiddenprint(user)
deactivate(user,0)
@@ -111,6 +111,7 @@
panel_open = !panel_open
user.visible_message("[user] screws the camera's panel [panel_open ? "open" : "closed"]!",
"You screw the camera's panel [panel_open ? "open" : "closed"].")
+ playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
else if((iswirecutter(W) || ismultitool(W)) && panel_open)
interact(user)
@@ -183,13 +184,13 @@
for(var/mob/O in viewers(user, null))
O.show_message(text("\red [] has deactivated []!", user, src), 1)
playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1)
- icon_state = "camera1"
+ icon_state = "[initial(icon_state)]1"
add_hiddenprint(user)
else
for(var/mob/O in viewers(user, null))
O.show_message(text("\red [] has reactivated []!", user, src), 1)
playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1)
- icon_state = "camera"
+ icon_state = initial(icon_state)
add_hiddenprint(user)
// now disconnect anyone using the camera
//Apparently, this will disconnect anyone even if the camera was re-activated.
@@ -213,18 +214,6 @@
for(var/mob/living/silicon/S in mob_list)
S.cancelAlarm("Camera", get_area(src), list(src), src)
-/obj/machinery/camera/proc/toggle_panel(var/mob/user)
- if(busy)
- return 0
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
- busy = 1
- if(do_after(user, 30))
- panel_open = !panel_open
- busy = 0
- return 1
- busy = 0
- return 0
-
/obj/machinery/camera/proc/can_use()
if(!status)
return 0
@@ -295,24 +284,4 @@
return 0
return 1
busy = 0
- return 0
-
-
-
-/obj/machinery/camera/autoname
- var/number = 0 //camera number in area
-
-//This camera type automatically sets it's name to whatever the area that it's in is called.
-/obj/machinery/camera/autoname/New()
- ..()
- spawn(10)
- number = 1
- var/area/A = get_area(src)
- if(A)
- for(var/obj/machinery/camera/autoname/C in world)
- if(C == src) continue
- var/area/CA = get_area(C)
- if(CA.type == A.type)
- if(C.number)
- number = max(number, C.number+1)
- c_tag = "[A.name] #[number]"
\ No newline at end of file
+ return 0
\ No newline at end of file
diff --git a/code/game/machinery/camera/presets.dm b/code/game/machinery/camera/presets.dm
index 5733a72c906..3ec4f4b8b55 100644
--- a/code/game/machinery/camera/presets.dm
+++ b/code/game/machinery/camera/presets.dm
@@ -1,23 +1,54 @@
// PRESETS
+// EMP
+
/obj/machinery/camera/emp_proof/New()
..()
upgradeEmpProof()
+// X-RAY
+
+/obj/machinery/camera/xray
+ icon_state = "xraycam" // Thanks to Krutchen for the icons.
+
/obj/machinery/camera/xray/New()
..()
upgradeXRay()
+// MOTION
+
/obj/machinery/camera/motion/New()
..()
upgradeMotion()
+// ALL UPGRADES
+
/obj/machinery/camera/all/New()
..()
upgradeEmpProof()
upgradeXRay()
upgradeMotion()
+// AUTONAME
+
+/obj/machinery/camera/autoname
+ var/number = 0 //camera number in area
+
+//This camera type automatically sets it's name to whatever the area that it's in is called.
+/obj/machinery/camera/autoname/New()
+ ..()
+ spawn(10)
+ number = 1
+ var/area/A = get_area(src)
+ if(A)
+ for(var/obj/machinery/camera/autoname/C in world)
+ if(C == src) continue
+ var/area/CA = get_area(C)
+ if(CA.type == A.type)
+ if(C.number)
+ number = max(number, C.number+1)
+ c_tag = "[A.name] #[number]"
+
// CHECKS
diff --git a/code/game/machinery/camera/tracking.dm b/code/game/machinery/camera/tracking.dm
index 7d7a1d8ef04..7927cea1f00 100644
--- a/code/game/machinery/camera/tracking.dm
+++ b/code/game/machinery/camera/tracking.dm
@@ -1,25 +1,56 @@
-/mob/living/silicon/ai/proc/ai_camera_list()
+/mob/living/silicon/ai/proc/get_camera_list()
+
+ if(src.stat == 2)
+ return
+
+ var/list/L = list()
+ for (var/obj/machinery/camera/C in cameranet.cameras)
+ L.Add(C)
+
+ camera_sort(L)
+
+ var/list/T = list()
+ T["Cancel"] = "Cancel"
+ for (var/obj/machinery/camera/C in L)
+ if (C.network == src.network)
+ T[text("[][]", C.c_tag, (C.can_use() ? null : " (Deactivated)"))] = C
+
+ track = new()
+ track.cameras = T
+ return T
+
+
+/mob/living/silicon/ai/proc/ai_camera_list(var/camera in get_camera_list())
set category = "AI Commands"
set name = "Show Camera List"
- if(usr.stat == 2)
- usr << "You can't track with camera because you are dead!"
+ if(src.stat == 2)
+ src << "You can't list the cameras because you are dead!"
return
- attack_ai(src)
+ if (!camera || camera == "Cancel")
+ return 0
-/mob/living/silicon/ai/proc/ai_camera_track()
- set category = "AI Commands"
- set name = "Track With Camera"
- if(usr.stat == 2)
- usr << "You can't track with camera because you are dead!"
- return
+ var/obj/machinery/camera/C = track.cameras[camera]
+ track = null
+ src.eyeobj.setLoc(C)
+ return
+
+// Used to allow the AI is write in mob names/camera name from the CMD line.
+/datum/trackable
var/list/names = list()
var/list/namecounts = list()
var/list/humans = list()
var/list/others = list()
+ var/list/cameras = list()
+/mob/living/silicon/ai/proc/trackable_mobs()
+
+ if(usr.stat == 2)
+ return list()
+
+ var/datum/trackable/TB = new()
for(var/mob/living/M in mob_list)
// Easy checks first.
// Don't detect mobs on Centcom. Since the wizard den is on Centcomm, we only need this.
@@ -55,25 +86,34 @@
continue
var/name = M.name
- if (name in names)
- namecounts[name]++
- name = text("[] ([])", name, namecounts[name])
+ if (name in TB.names)
+ TB.namecounts[name]++
+ name = text("[] ([])", name, TB.namecounts[name])
else
- names.Add(name)
- namecounts[name] = 1
+ TB.names.Add(name)
+ TB.namecounts[name] = 1
if(human)
- humans[name] = M
+ TB.humans[name] = M
else
- others[name] = M
+ TB.others[name] = M
- var/list/targets = sortList(humans) + sortList(others)
- var/target_name = input(usr, "Which creature should you track?") as null|anything in targets
+ var/list/targets = sortList(TB.humans) + sortList(TB.others)
+ src.track = TB
+ return targets
- if (!target_name)
- usr:cameraFollow = null
+/mob/living/silicon/ai/proc/ai_camera_track(var/target_name in trackable_mobs())
+ set category = "AI Commands"
+ set name = "Track With Camera"
+ set desc = "Select who you would like to track."
+
+ if(src.stat == 2)
+ src << "You can't track with camera because you are dead!"
return
+ if(!target_name)
+ src.cameraFollow = null
- var/mob/target = (isnull(humans[target_name]) ? others[target_name] : humans[target_name])
+ var/mob/target = (isnull(track.humans[target_name]) ? track.others[target_name] : track.humans[target_name])
+ src.track = null
ai_actual_track(target)
/mob/living/silicon/ai/proc/ai_actual_track(mob/living/target as mob)
@@ -121,7 +161,7 @@
return
sleep(10)
-/proc/near_camera(var/mob/M)
+/proc/near_camera(var/mob/living/M)
if (!isturf(M.loc))
return 0
if(isrobot(M))
@@ -141,33 +181,7 @@
/mob/living/silicon/ai/attack_ai(var/mob/user as mob)
- if (user != src)
- return
-
- if (stat == 2)
- return
-
- var/list/L = list()
- for (var/obj/machinery/camera/C in cameranet.cameras)
- L.Add(C)
-
- camera_sort(L)
-
- var/list/D = list()
- D["Cancel"] = "Cancel"
- for (var/obj/machinery/camera/C in L)
- if (C.network == src.network)
- D[text("[][]", C.c_tag, (C.can_use() ? null : " (Deactivated)"))] = C
-
- var/t = input(user, "Which camera should you change to?") as null|anything in D
-
- if (!t || t == "Cancel")
- return 0
-
- var/obj/machinery/camera/C = D[t]
- src.eyeobj.setLoc(C)
-
- return
+ ai_camera_list()
/proc/camera_sort(list/L)
var/obj/machinery/camera/a
diff --git a/code/game/machinery/camera/wires.dm b/code/game/machinery/camera/wires.dm
index 3aa9ed59056..3145a5d156f 100644
--- a/code/game/machinery/camera/wires.dm
+++ b/code/game/machinery/camera/wires.dm
@@ -50,7 +50,7 @@
if(CAMERA_WIRE_POWER)
deactivate(usr, 1)
- shock(usr)
+ //shock(usr)
if(CAMERA_WIRE_LIGHT)
light_disabled = 1
diff --git a/code/game/machinery/computer/HolodeckControl.dm b/code/game/machinery/computer/HolodeckControl.dm
index 8a35a8e7821..4c1228e7ae0 100644
--- a/code/game/machinery/computer/HolodeckControl.dm
+++ b/code/game/machinery/computer/HolodeckControl.dm
@@ -111,7 +111,7 @@
if(!issilicon(usr)) return
emagged = !emagged
if(emagged)
- message_admins("[key_name_admin(usr)] overrided the holodeck's safeties")
+ message_admins("[key_name_admin(usr)] overrode the holodeck's safeties")
log_game("[key_name(usr)] overrided the holodeck's safeties")
else
message_admins("[key_name_admin(usr)] restored the holodeck's safeties")
@@ -293,7 +293,7 @@
for(var/obj/effect/decal/cleanable/blood/B in linkedholodeck)
del(B)
- for(var/mob/living/simple_animal/carp/C in linkedholodeck)
+ for(var/mob/living/simple_animal/hostile/carp/C in linkedholodeck)
del(C)
holographic_items = A.copy_contents_to(linkedholodeck , 1)
@@ -314,7 +314,7 @@
T.temperature = 5000
T.hotspot_expose(50000,50000,1)
if(L.name=="Holocarp Spawn")
- new /mob/living/simple_animal/carp(L.loc)
+ new /mob/living/simple_animal/hostile/carp(L.loc)
/obj/machinery/computer/HolodeckControl/proc/emergencyShutdown()
@@ -445,9 +445,9 @@
desc = "May the force be within you. Sorta"
icon_state = "sword0"
force = 3.0
- throwforce = 5.0
throw_speed = 1
throw_range = 5
+ throwforce = 0
w_class = 2.0
flags = FPRINT | TABLEPASS | NOSHIELD
var/active = 0
diff --git a/code/game/machinery/camera_circuit.dm b/code/game/machinery/computer/camera_circuit.dm
similarity index 100%
rename from code/game/machinery/camera_circuit.dm
rename to code/game/machinery/computer/camera_circuit.dm
diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm
index 9a291815580..97bc50aa902 100644
--- a/code/game/machinery/computer/medical.dm
+++ b/code/game/machinery/computer/medical.dm
@@ -53,9 +53,20 @@
if(3.0)
dat += text("Records Maintenance
\nBackup To Disk
\nUpload From disk
\nDelete All Records
\n
\nBack", src, src, src, src)
if(4.0)
+ var/icon/front = new(active1.fields["photo"], dir = SOUTH)
+ var/icon/side = new(active1.fields["photo"], dir = WEST)
+ user << browse_rsc(front, "front.png")
+ user << browse_rsc(side, "side.png")
dat += "Medical Record
"
if ((istype(src.active1, /datum/data/record) && data_core.general.Find(src.active1)))
- dat += text("Name: [] ID: []
\nSex: []
\nAge: []
\nFingerprint: []
\nPhysical Status: []
\nMental Status: []
", src.active1.fields["name"], src.active1.fields["id"], src, src.active1.fields["sex"], src, src.active1.fields["age"], src, src.active1.fields["fingerprint"], src, src.active1.fields["p_stat"], src, src.active1.fields["m_stat"])
+ dat += ""
else
dat += "General Record Lost!
"
if ((istype(src.active2, /datum/data/record) && data_core.medical.Find(src.active2)))
@@ -84,6 +95,8 @@
dat += "
Medical Robots:"
var/bdat = null
for(var/obj/machinery/bot/medbot/M in world)
+ if(!M)
+ continue
var/turf/bl = get_turf(M)
bdat += "[M.name] - \[[bl.x],[bl.y]\] - [M.on ? "Online" : "Offline"]
"
if((!isnull(M.reagent_glass)) && M.use_beaker)
diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm
index 580988c87e2..68a0fd41ac0 100644
--- a/code/game/machinery/computer/security.dm
+++ b/code/game/machinery/computer/security.dm
@@ -105,9 +105,23 @@
dat += "Records Maintenance
"
dat += "
Delete All Records
Back"
if(3.0)
+ var/icon/front = new(active1.fields["photo"], dir = SOUTH)
+ var/icon/side = new(active1.fields["photo"], dir = WEST)
+ user << browse_rsc(front, "front.png")
+ user << browse_rsc(side, "side.png")
dat += "Security Record
"
if ((istype(active1, /datum/data/record) && data_core.general.Find(active1)))
- dat += text("Name: [] ID: []
\nSex: []
\nAge: []
\nRank: []
\nFingerprint: []
\nPhysical Status: []
\nMental Status: []
", src, active1.fields["name"], src, active1.fields["id"], src, active1.fields["sex"], src, active1.fields["age"], src, active1.fields["rank"], src, active1.fields["fingerprint"], active1.fields["p_stat"], active1.fields["m_stat"])
+ dat += text("")
else
dat += "General Record Lost!
"
if ((istype(active2, /datum/data/record) && data_core.security.Find(active2)))
diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm
index 90f3bc67424..3fbb649198c 100644
--- a/code/game/machinery/cryo.dm
+++ b/code/game/machinery/cryo.dm
@@ -196,6 +196,8 @@
occupant.client.eye = occupant.client.mob
occupant.client.perspective = MOB_PERSPECTIVE
occupant.loc = get_step(loc, SOUTH) //this doesn't account for walls or anything, but i don't forsee that being a problem.
+ if (occupant.bodytemperature < 261 && occupant.bodytemperature > 140) //Patch by Aranclanos to stop people from taking burn damage after being ejected
+ occupant.bodytemperature = 261
// occupant.metabslow = 0
occupant = null
update_icon()
diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm
index 8d2857926f6..171608be173 100644
--- a/code/game/machinery/deployable.dm
+++ b/code/game/machinery/deployable.dm
@@ -68,13 +68,11 @@ for reference:
attackby(obj/item/W as obj, mob/user as mob)
if (istype(W, /obj/item/stack/sheet/wood))
if (src.health < src.maxhealth)
- for(var/mob/O in viewers(src, null))
- O << "\red [user] begins to repair the [src]!"
+ visible_message("\red [user] begins to repair the [src]!")
if(do_after(user,20))
src.health = src.maxhealth
W:use(1)
- for(var/mob/O in viewers(src, null))
- O << "\red [user] repairs the [src]!"
+ visible_message("\red [user] repairs the [src]!")
return
else
return
@@ -87,8 +85,7 @@ for reference:
src.health -= W.force * 0.75
else
if (src.health <= 0)
- for(var/mob/O in viewers(src, null))
- O << "\red The barricade is smashed apart!"
+ visible_message("\red The barricade is smashed apart!")
new /obj/item/stack/sheet/wood(get_turf(src))
new /obj/item/stack/sheet/wood(get_turf(src))
new /obj/item/stack/sheet/wood(get_turf(src))
@@ -98,15 +95,13 @@ for reference:
ex_act(severity)
switch(severity)
if(1.0)
- for(var/mob/O in viewers(src, null))
- O << "\red The barricade is blown apart!"
+ visible_message("\red The barricade is blown apart!")
del(src)
return
if(2.0)
src.health -= 25
if (src.health <= 0)
- for(var/mob/O in viewers(src, null))
- O << "\red The barricade is blown apart!"
+ visible_message("\red The barricade is blown apart!")
new /obj/item/stack/sheet/wood(get_turf(src))
new /obj/item/stack/sheet/wood(get_turf(src))
new /obj/item/stack/sheet/wood(get_turf(src))
@@ -114,8 +109,7 @@ for reference:
return
meteorhit()
- for(var/mob/O in viewers(src, null))
- O << "\red The barricade is smashed apart!"
+ visible_message("\red The barricade is smashed apart!")
new /obj/item/stack/sheet/wood(get_turf(src))
new /obj/item/stack/sheet/wood(get_turf(src))
new /obj/item/stack/sheet/wood(get_turf(src))
@@ -125,8 +119,7 @@ for reference:
blob_act()
src.health -= 25
if (src.health <= 0)
- for(var/mob/O in viewers(src, null))
- O << "\red The blob eats through the barricade!"
+ visible_message("\red The blob eats through the barricade!")
del(src)
return
@@ -181,8 +174,7 @@ for reference:
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
s.set_up(2, 1, src)
s.start()
- for(var/mob/O in viewers(src, null))
- O << "\red BZZzZZzZZzZT"
+ visible_message("\red BZZzZZzZZzZT")
return
return
else if (istype(W, /obj/item/weapon/card/emag))
@@ -193,8 +185,7 @@ for reference:
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
s.set_up(2, 1, src)
s.start()
- for(var/mob/O in viewers(src, null))
- O << "\red BZZZZT"
+ visible_message("\red BZZzZZzZZzZT")
return
else if (src.emagged == 1)
src.emagged = 2
@@ -202,22 +193,19 @@ for reference:
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
s.set_up(2, 1, src)
s.start()
- for(var/mob/O in viewers(src, null))
- O << "\red BZZZZT"
+ visible_message("\red BZZzZZzZZzZT")
return
else if (istype(W, /obj/item/weapon/wrench))
if (src.health < src.maxhealth)
src.health = src.maxhealth
src.emagged = 0
src.req_access = list(access_security)
- for(var/mob/O in viewers(src, null))
- O << "\red [user] repairs the [src]!"
+ visible_message("\red [user] repairs the [src]!")
return
else if (src.emagged > 0)
src.emagged = 0
src.req_access = list(access_security)
- for(var/mob/O in viewers(src, null))
- O << "\red [user] repairs the [src]!"
+ visible_message("\red [user] repairs the [src]!")
return
return
else
@@ -262,8 +250,7 @@ for reference:
proc/explode()
- for(var/mob/O in hearers(src, null))
- O.show_message("\red [src] blows apart!", 1)
+ visible_message("\red [src] blows apart!")
var/turf/Tsec = get_turf(src)
/* var/obj/item/stack/rods/ =*/
diff --git a/code/game/machinery/dispenser.dm b/code/game/machinery/dispenser.dm
deleted file mode 100644
index f7de060a2f0..00000000000
--- a/code/game/machinery/dispenser.dm
+++ /dev/null
@@ -1,117 +0,0 @@
-/obj/machinery/dispenser/New()
- ..()
- update_icon()
-
-/obj/machinery/dispenser/ex_act(severity)
- switch(severity)
- if(1.0)
- //SN src = null
- del(src)
- return
- if(2.0)
- if (prob(50))
- //SN src = null
- del(src)
- return
- if(3.0)
- if (prob(25))
- while(src.o2tanks > 0)
- new /obj/item/weapon/tank/oxygen( src.loc )
- src.o2tanks--
- update_icon()
- while(src.pltanks > 0)
- new /obj/item/weapon/tank/plasma( src.loc )
- src.pltanks--
- update_icon()
- else
- return
-
-/obj/machinery/dispenser/blob_act()
- if (prob(50))
- while(src.o2tanks > 0)
- new /obj/item/weapon/tank/oxygen( src.loc )
- src.o2tanks--
- update_icon()
- while(src.pltanks > 0)
- new /obj/item/weapon/tank/plasma( src.loc )
- src.pltanks--
- update_icon()
- del(src)
-
-/obj/machinery/dispenser/meteorhit()
- while(src.o2tanks > 0)
- new /obj/item/weapon/tank/oxygen( src.loc )
- src.o2tanks--
- update_icon()
- while(src.pltanks > 0)
- new /obj/item/weapon/tank/plasma( src.loc )
- src.pltanks--
- update_icon()
- del(src)
- return
-
-/obj/machinery/dispenser/attack_ai(mob/user as mob)
- return src.attack_hand(user)
-
-/obj/machinery/dispenser/attack_paw(mob/user as mob)
- return src.attack_hand(user)
-
-/obj/machinery/dispenser/attack_hand(mob/user as mob)
- if(stat & BROKEN)
- return
- user.machine = src
- var/dat = text("Loaded Tank Dispensing Unit
\nOxygen: [] []
\nPlasma: [] []
\n", src.o2tanks, (src.o2tanks ? text("Dispense", src) : "empty"), src.pltanks, (src.pltanks ? text("Dispense", src) : "empty"))
- user << browse(dat, "window=dispenser")
- onclose(user, "dispenser")
- return
-
-/obj/machinery/dispenser/Topic(href, href_list)
- if(stat & BROKEN)
- return
- if(usr.stat || usr.restrained())
- return
- if (!(istype(usr, /mob/living/carbon/human) || ticker))
- if (!istype(usr, /mob/living/silicon/ai))
- usr << "\red You don't have the dexterity to do this!"
- else
- usr << "\red You are unable to dispense anything, since the controls are physical levers which don't go through any other kind of input."
- return
-
- if ((usr.contents.Find(src) || ((get_dist(src, usr) <= 1) && istype(src.loc, /turf))))
- usr.machine = src
- if (href_list["oxygen"])
- if (text2num(href_list["oxygen"]))
- if (src.o2tanks > 0)
- use_power(5)
- new /obj/item/weapon/tank/oxygen( src.loc )
- src.o2tanks--
- update_icon()
- if (istype(src.loc, /mob))
- attack_hand(src.loc)
- else
- if (href_list["plasma"])
- if (text2num(href_list["plasma"]))
- if (src.pltanks > 0)
- use_power(5)
- new /obj/item/weapon/tank/plasma( src.loc )
- src.pltanks--
- update_icon()
- if (istype(src.loc, /mob))
- attack_hand(src.loc)
- src.add_fingerprint(usr)
- for(var/mob/M in viewers(1, src))
- if ((M.client && M.machine == src))
- src.attack_hand(M)
- else
- usr << browse(null, "window=dispenser")
- return
- return
-
-/obj/machinery/dispenser/update_icon()
- overlays = null
- switch(o2tanks)
- if(1 to 3) overlays += "oxygen-[o2tanks]"
- if(4 to INFINITY) overlays += "oxygen-4"
- switch(pltanks)
- if(1 to 4) overlays += "plasma-[pltanks]"
- if(5 to INFINITY) overlays += "plasma-5"
\ No newline at end of file
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index 716d05ae1b8..86e4b25cf72 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -828,7 +828,15 @@ About the new airlock wires panel:
src.aiHacking = 0
src.attack_ai(user)
-
+/obj/machinery/door/airlock/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
+ if (src.isElectrified())
+ if (istype(mover, /obj/item))
+ var/obj/item/i = mover
+ if (i.m_amt)
+ var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
+ s.set_up(5, 1, src)
+ s.start()
+ return ..()
/obj/machinery/door/airlock/attack_paw(mob/user as mob)
return src.attack_hand(user)
diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm
index cca3cdace39..c8ad53eb191 100644
--- a/code/game/machinery/doors/door.dm
+++ b/code/game/machinery/doors/door.dm
@@ -30,6 +30,9 @@
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
@@ -38,6 +41,7 @@
Del()
+ density = 0
update_nearby_tiles()
..()
return
@@ -247,17 +251,51 @@
update_nearby_tiles(need_rebuild)
if(!air_master) return 0
- var/turf/simulated/source = get_turf(src)
+ 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)
+ 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
+ /*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
@@ -297,4 +335,4 @@
else
close()
return
-*/
+*/
\ No newline at end of file
diff --git a/code/game/machinery/embedded_controller/simple_vent_controller.dm b/code/game/machinery/embedded_controller/simple_vent_controller.dm
new file mode 100644
index 00000000000..f43031884da
--- /dev/null
+++ b/code/game/machinery/embedded_controller/simple_vent_controller.dm
@@ -0,0 +1,78 @@
+/datum/computer/file/embedded_program/simple_vent_controller
+
+ var/airpump_tag
+
+ receive_user_command(command)
+ switch(command)
+ if("vent_inactive")
+ var/datum/signal/signal = new
+ signal.data = list(
+ "tag" = airpump_tag,
+ "sigtype"="command"
+ )
+ signal.data["power"] = 0
+ post_signal(signal)
+
+ if("vent_pump")
+ var/datum/signal/signal = new
+ signal.data = list(
+ "tag" = airpump_tag,
+ "sigtype"="command"
+ )
+ signal.data["stabalize"] = 1
+ signal.data["power"] = 1
+ post_signal(signal)
+
+ if("vent_clear")
+ var/datum/signal/signal = new
+ signal.transmission_method = 1 //radio signal
+ signal.data = list(
+ "tag" = airpump_tag,
+ "sigtype"="command"
+ )
+ signal.data["purge"] = 1
+ signal.data["power"] = 1
+ post_signal(signal)
+
+ process()
+ return 0
+
+
+/obj/machinery/embedded_controller/radio/simple_vent_controller
+ icon = 'icons/obj/airlock_machines.dmi'
+ icon_state = "airlock_control_standby"
+
+ name = "Vent Controller"
+ density = 0
+
+ frequency = 1229
+ power_channel = ENVIRON
+
+ // Setup parameters only
+ var/airpump_tag
+
+ initialize()
+ ..()
+
+ var/datum/computer/file/embedded_program/simple_vent_controller/new_prog = new
+
+ new_prog.airpump_tag = airpump_tag
+ new_prog.master = src
+ program = new_prog
+
+ update_icon()
+ if(on && program)
+ icon_state = "airlock_control_standby"
+ else
+ icon_state = "airlock_control_off"
+
+
+ return_text()
+ var/state_options = null
+ state_options = {"Deactivate Vent
+Activate Vent / Pump
+Activate Vent / Clear
"}
+ var/output = {"Vent Control Console
+[state_options]
"}
+
+ return output
\ No newline at end of file
diff --git a/code/game/machinery/gateway.dm b/code/game/machinery/gateway.dm
deleted file mode 100644
index f44b663acdc..00000000000
--- a/code/game/machinery/gateway.dm
+++ /dev/null
@@ -1,49 +0,0 @@
-/obj/structure/gatewayplaceholder
- density = 1
- anchored = 1
- icon = 'icons/obj/machines/gateway.dmi'
-
-/obj/structure/gatewayplaceholder/one
- name = "Gateway"
- desc = "A gateway"
- icon_state = "off1"
-
-/obj/structure/gatewayplaceholder/two
- name = "Gateway"
- desc = "A gateway"
- icon_state = "off2"
-
-/obj/structure/gatewayplaceholder/three
- name = "Gateway"
- desc = "A gateway"
- icon_state = "off3"
-
-/obj/structure/gatewayplaceholder/four
- name = "Gateway"
- desc = "A gateway"
- icon_state = "off4"
-
-/obj/structure/gatewayplaceholder/five
- name = "Gateway"
- desc = "A gateway"
- icon_state = "off5"
-
-/obj/structure/gatewayplaceholder/six
- name = "Gateway"
- desc = "A gateway"
- icon_state = "off6"
-
-/obj/structure/gatewayplaceholder/seven
- name = "Gateway"
- desc = "A gateway"
- icon_state = "off7"
-
-/obj/structure/gatewayplaceholder/eight
- name = "Gateway"
- desc = "A gateway"
- icon_state = "off8"
-
-/obj/structure/gatewayplaceholder/nine
- name = "Gateway"
- desc = "A gateway"
- icon_state = "off9"
\ No newline at end of file
diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm
index 9446ddade32..90b628d93e9 100644
--- a/code/game/machinery/hologram.dm
+++ b/code/game/machinery/hologram.dm
@@ -59,13 +59,11 @@ var/const/HOLOPAD_MODE = 0
/*This is the proc for special two-way communication between AI and holopad/people talking near holopad.
For the other part of the code, check silicon say.dm. Particularly robot talk.*/
-/obj/machinery/hologram/holopad/hear_talk(mob/M, text)
+/obj/machinery/hologram/holopad/hear_talk(mob/living/M, text)
if(M&&hologram&&master)//Master is mostly a safety in case lag hits or something.
if(!master.say_understands(M))//The AI will be able to understand most mobs talking through the holopad.
text = stars(text)
- var/name_used = M.name
- if(istype(M.wear_mask, /obj/item/clothing/mask/gas/voice)&&M.wear_mask:vchange)//Can't forget the ninjas.
- name_used = M.wear_mask:voice
+ var/name_used = M.GetVoice()
//This communication is imperfect because the holopad "filters" voices and is only designed to connect to the master only.
var/rendered = "Holopad received, [name_used] [M.say_quote(text)]"
master.show_message(rendered, 2)
diff --git a/code/game/machinery/hydroponics.dm b/code/game/machinery/hydroponics.dm
index f2c0abb759e..16fd85b8dc6 100644
--- a/code/game/machinery/hydroponics.dm
+++ b/code/game/machinery/hydroponics.dm
@@ -194,11 +194,11 @@ obj/machinery/hydroponics/proc/updateicon()
if(src.harvest)
overlays += image('icons/obj/hydroponics.dmi', icon_state="over_harvest3")
- if(!luminosity)
- if(istype(myseed,/obj/item/seeds/glowshroom))
- SetLuminosity(round(myseed.potency/10))
+ if(istype(myseed,/obj/item/seeds/glowshroom))
+ SetLuminosity(round(myseed.potency/10))
else
SetLuminosity(0)
+
return
diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm
index e6456a07e6a..3faf3bebaf2 100644
--- a/code/game/machinery/iv_drip.dm
+++ b/code/game/machinery/iv_drip.dm
@@ -90,3 +90,23 @@
update_icon()
else
return ..()
+
+/obj/machinery/iv_drip/examine()
+ set src in view()
+ ..()
+ if (!(usr in view(2)) && usr!=src.loc) return
+
+ if(beaker)
+ usr << "\blue Attached is \a [beaker] with:"
+ if(beaker.reagents && beaker.reagents.reagent_list.len)
+ for(var/datum/reagent/R in beaker.reagents.reagent_list)
+ usr << "\blue [R.volume] units of [R.name]"
+ else
+ usr << "\blue Attached is an empty [beaker]."
+ else
+ usr << "\blue No chemicals are attached."
+
+ if(attached)
+ usr << "\blue [attached] is attached."
+ else
+ usr << "\blue No one is attached."
\ No newline at end of file
diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm
index b622c169fb1..c02d923571f 100644
--- a/code/game/machinery/machinery.dm
+++ b/code/game/machinery/machinery.dm
@@ -202,8 +202,7 @@ Class Procs:
if (ishuman(user))
var/mob/living/carbon/human/H = user
if(H.getBrainLoss() >= 60)
- for(var/mob/M in viewers(src, null))
- M << "\red [H] stares cluelessly at [src] and drools."
+ visible_message("\red [H] stares cluelessly at [src] and drools.")
return 1
else if(prob(H.getBrainLoss()))
user << "\red You momentarily forget how to use [src]."
diff --git a/code/game/machinery/pipe/pipe_dispenser.dm b/code/game/machinery/pipe/pipe_dispenser.dm
index 8895f9a18c1..b0d60929ab3 100644
--- a/code/game/machinery/pipe/pipe_dispenser.dm
+++ b/code/game/machinery/pipe/pipe_dispenser.dm
@@ -33,7 +33,7 @@
Pipe
Bent Pipe
Junction
-Heat Exchanger
+Heat Exchanger
Insulated pipes:
Pipe
Bent Pipe
diff --git a/code/game/machinery/seed_extractor.dm b/code/game/machinery/seed_extractor.dm
index 513270ca65c..cd1621e4c33 100644
--- a/code/game/machinery/seed_extractor.dm
+++ b/code/game/machinery/seed_extractor.dm
@@ -1,22 +1,21 @@
/obj/machinery/seed_extractor
- name = "Seed Extractor"
- desc = "Extracts seeds from produce"
+ name = "seed extractor"
+ desc = "Extracts and bags seeds from produce."
icon = 'icons/obj/hydroponics.dmi'
icon_state = "sextractor"
density = 1
anchored = 1
obj/machinery/seed_extractor/attackby(var/obj/item/O as obj, var/mob/user as mob)
-
- //Called when mob user "attacks" it with object O
- if (istype(O, /obj/item/weapon/reagent_containers/food/snacks/grown/))
+ if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/grown/))
var/obj/item/weapon/reagent_containers/food/snacks/grown/F = O
- user << "\blue You extract some seeds from the [F.name]"
+ user.drop_item()
+ user << "You extract some seeds from the [F.name]."
var/seed = text2path(F.seed)
var/t_amount = 0
var/t_max = rand(1,4)
- while ( t_amount < t_max)
- var/obj/item/seeds/t_prod = new seed(src.loc)
+ while(t_amount < t_max)
+ var/obj/item/seeds/t_prod = new seed(loc)
t_prod.species = F.species
t_prod.lifespan = F.lifespan
t_prod.endurance = F.endurance
@@ -27,14 +26,15 @@ 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/weapon/grown/))
+ else if(istype(O, /obj/item/weapon/grown/))
var/obj/item/weapon/grown/F = O
- user << "\blue You extract some seeds from the [F.name]"
+ user.drop_item()
+ user << "You extract some seeds from the [F.name]."
var/seed = text2path(F.seed)
var/t_amount = 0
var/t_max = rand(1,4)
- while ( t_amount < t_max)
- var/obj/item/seeds/t_prod = new seed(src.loc)
+ while(t_amount < t_max)
+ var/obj/item/seeds/t_prod = new seed(loc)
t_prod.species = F.species
t_prod.lifespan = F.lifespan
t_prod.endurance = F.endurance
diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm
index c25cf0c4f76..190556191a8 100644
--- a/code/game/machinery/shieldgen.dm
+++ b/code/game/machinery/shieldgen.dm
@@ -57,8 +57,7 @@
if (src.health <= 0)
- for(var/mob/O in viewers(src, null))
- O.show_message("\blue The [src] dissapates")
+ visible_message("\blue The [src] dissapates")
del(src)
return
@@ -71,8 +70,7 @@
src.health -= max_health*0.75 //3/4 health as damage
if(src.health <= 0)
- for(var/mob/O in viewers(src, null))
- O.show_message("\blue The [src] dissapates")
+ visible_message("\blue The [src] dissapates")
del(src)
return
@@ -84,8 +82,7 @@
health -= Proj.damage
..()
if(health <=0)
- for(var/mob/O in viewers(src, null))
- O.show_message("\blue The [src] dissapates")
+ visible_message("\blue The [src] dissapates")
del(src)
return
opacity = 1
@@ -118,8 +115,7 @@
/obj/machinery/shield/hitby(AM as mob|obj)
//Let everyone know we've been hit!
- for(var/mob/O in viewers(src, null))
- O.show_message("\red [src] was hit by [AM].", 1)
+ visible_message("\red [src] was hit by [AM].")
//Super realistic, resource-intensive, real-time damage calculations.
var/tforce = 0
@@ -135,8 +131,7 @@
//Handle the destruction of the shield
if (src.health <= 0)
- for(var/mob/O in viewers(src, null))
- O.show_message("\blue The [src] dissapates")
+ visible_message("\blue The [src] dissapates")
del(src)
return
@@ -521,10 +516,7 @@
else
src.add_fingerprint(user)
- user << "\red You hit the [src.name] with your [W.name]!"
- for(var/mob/M in viewers(src))
- if(M == user) continue
- M.show_message("\red The [src.name] has been hit with the [W.name] by [user.name]!")
+ visible_message("\red The [src.name] has been hit with the [W.name] by [user.name]!")
/obj/machinery/shieldwallgen/proc/cleanup(var/NSEW)
var/obj/machinery/shieldwall/F
diff --git a/code/game/machinery/small_constructable_frame.dm b/code/game/machinery/small_constructable_frame.dm
deleted file mode 100644
index a85973cf8c7..00000000000
--- a/code/game/machinery/small_constructable_frame.dm
+++ /dev/null
@@ -1,186 +0,0 @@
-//Copied from the constructable frame code to make this a hell of a lot easier.
-
-/obj/machinery/small_constructable_frame //Made into a seperate type to make future revisions easier.
- name = "small machine frame"
- icon = 'stock_parts.dmi'
- icon_state = "sbox_0"
- density = 1
- anchored = 1
- use_power = 0
- var/obj/item/weapon/circuitboard/circuit = null
- var/list/components = null
- var/list/req_components = null
- var/list/req_component_names = null
- var/state = 1
-
- proc/update_desc()
- var/D
- if(req_components)
- D = "Requires "
- var/first = 1
- for(var/I in req_components)
- if(req_components[I] > 0)
- D += "[first?"":", "][num2text(req_components[I])] [req_component_names[I]]"
- first = 0
- if(first) // nothing needs to be added, then
- D += "nothing, use a screwdriver to finish it up."
- D += "."
- desc = D
-
-/obj/machinery/small_constructable_frame
- attackby(obj/item/P as obj, mob/user as mob)
- if(P.crit_fail)
- user << "\red This part is faulty, you cannot add this to the machine!"
- return
- switch(state)
- if(1)
- if(istype(P, /obj/item/weapon/cable_coil))
- if(P:amount >= 5)
- playsound(src.loc, 'Deconstruct.ogg', 50, 1)
- user << "\blue You start to add cables to the frame."
- if(do_after(user, 20))
- P:amount -= 5
- if(!P:amount) del(P)
- user << "\blue You add cables to the frame."
- state = 2
- icon_state = "sbox_1"
- if(istype(P, /obj/item/weapon/wrench))
- playsound(src.loc, 'Ratchet.ogg', 75, 1)
- user << "\blue You dismantle the frame"
- new /obj/item/stack/sheet/metal(src.loc, 5)
- del(src)
- if(2)
- if(istype(P, /obj/item/weapon/circuitboard))
- var/obj/item/weapon/circuitboard/B = P
- if(B.board_type == "smachine")
- playsound(src.loc, 'Deconstruct.ogg', 50, 1)
- user << "\blue You add the circuit board to the frame."
- circuit = P
- user.drop_item()
- P.loc = src
- icon_state = "sbox_2"
- state = 3
- components = list()
- req_components = circuit.req_components.Copy()
- for(var/A in circuit.req_components)
- req_components[A] = circuit.req_components[A]
- req_component_names = circuit.req_components.Copy()
- for(var/A in req_components)
- var/cp = text2path(A)
- var/obj/ct = new cp() // have to quickly instantiate it get name
- req_component_names[A] = ct.name
- if(circuit.frame_desc)
- desc = circuit.frame_desc
- else
- update_desc()
- user << desc
- else
- user << "\red This frame does not accept circuit boards of this type!"
- if(istype(P, /obj/item/weapon/wirecutters))
- playsound(src.loc, 'wirecutter.ogg', 50, 1)
- user << "\blue You remove the cables."
- state = 1
- icon_state = "sbox_0"
- var/obj/item/weapon/cable_coil/A = new /obj/item/weapon/cable_coil( src.loc )
- A.amount = 5
-
- if(3)
- if(istype(P, /obj/item/weapon/crowbar))
- playsound(src.loc, 'Crowbar.ogg', 50, 1)
- state = 2
- circuit.loc = src.loc
- circuit = null
- if(components.len == 0)
- user << "\blue You remove the circuit board."
- else
- user << "\blue You remove the circuit board and other components."
- for(var/obj/item/weapon/W in components)
- W.loc = src.loc
- desc = initial(desc)
- req_components = null
- components = null
- icon_state = "sbox_1"
-
- if(istype(P, /obj/item/weapon/screwdriver))
- var/component_check = 1
- for(var/R in req_components)
- if(req_components[R] > 0)
- component_check = 0
- break
- if(component_check)
- playsound(src.loc, 'Screwdriver.ogg', 50, 1)
- var/obj/machinery/new_machine = new src.circuit.build_path(src.loc)
- for(var/obj/O in new_machine.component_parts)
- del(O)
- new_machine.component_parts = list()
- for(var/obj/O in src)
- if(circuit.contain_parts) // things like disposal don't want their parts in them
- O.loc = new_machine
- else
- O.loc = null
- new_machine.component_parts += O
- if(circuit.contain_parts)
- circuit.loc = new_machine
- else
- circuit.loc = null
- new_machine.RefreshParts()
- del(src)
-
- if(istype(P, /obj/item/weapon))
- for(var/I in req_components)
- if(istype(P, text2path(I)) && (req_components[I] > 0))
- playsound(src.loc, 'Deconstruct.ogg', 50, 1)
- if(istype(P, /obj/item/weapon/cable_coil))
- var/obj/item/weapon/cable_coil/CP = P
- if(CP.amount > 1)
- var/camt = min(CP.amount, req_components[I]) // amount of cable to take, idealy amount required, but limited by amount provided
- var/obj/item/weapon/cable_coil/CC = new /obj/item/weapon/cable_coil(src)
- CC.amount = camt
- CC.update_icon()
- CP.use(camt)
- components += CC
- req_components[I] -= camt
- update_desc()
- break
- user.drop_item()
- P.loc = src
- components += P
- req_components[I]--
- update_desc()
- break
- user << desc
- if(P.loc != src && !istype(P, /obj/item/weapon/cable_coil))
- user << "\red You cannot add that component to the machine!"
-
-
-//Machine Frame Circuit Boards
-/*Common Parts: Parts List: Ignitor, Timer, Infra-red laser, Infra-red sensor, t_scanner, Capacitor, Valve, sensor unit,
-micro-manipulator, console screen, beaker, Microlaser, matter bin, power cells.
-Note: Once everything is added to the public areas, will add m_amt and g_amt to circuit boards since autolathe won't be able
-to destroy them and players will be able to make replacements.
-*/
-
-/obj/item/weapon/circuitboard/recharger
- name = "Circuit board (recharger)"
- build_path = "/obj/machinery/recharger"
- board_type = "smachine"
- origin_tech = "engineering=2;powerstorage=3"
- frame_desc = "Requires 1 Manipulator, 2 capacitors, and 1 cable coil"
- req_components = list(
- "/obj/item/weapon/stock_parts/manipulator" = 1,
- "/obj/item/weapon/cable_coil" = 1,
- "/obj/item/weapon/stock_parts/capacitor" = 2)
-
-/obj/item/weapon/circuitboard/cellrecharger
- name = "Circuit board (cell recharger)"
- build_path = "/obj/machinery/cell_charger"
- board_type = "smachine"
- origin_tech = "engineering=2;powerstorage=2"
- frame_desc = "Requires 1 Manipulator, 2 capacitors, and 1 cable coil"
- req_components = list(
- "/obj/item/weapon/stock_parts/manipulator" = 1,
- "/obj/item/weapon/cable_coil" = 1,
- "/obj/item/weapon/stock_parts/capacitor" = 2)
-
-
-
diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm
index 3f0070a9556..2709968cb76 100644
--- a/code/game/machinery/suit_storage_unit.dm
+++ b/code/game/machinery/suit_storage_unit.dm
@@ -353,8 +353,7 @@
src.SUIT = null
if(src.MASK)
src.MASK = null
- for (var/mob/V in viewers(user))
- V.show_message("With a loud whining noise, the Suit Storage Unit's door grinds open. Puffs of ashen smoke come out of its chamber.", 3)
+ visible_message("With a loud whining noise, the Suit Storage Unit's door grinds open. Puffs of ashen smoke come out of its chamber.", 3)
src.isbroken = 1
src.isopen = 1
src.islocked = 0
@@ -449,8 +448,7 @@
if ( (src.OCCUPANT) || (src.HELMET) || (src.SUIT) )
usr << "It's too cluttered inside for you to fit in!"
return
- for (var/mob/V in viewers(usr))
- V.show_message("[usr] starts squeezing into the suit storage unit!", 3)
+ visible_message("[usr] starts squeezing into the suit storage unit!", 3)
if(do_after(usr, 10))
usr.stop_pulling()
usr.client.perspective = EYE_PERSPECTIVE
@@ -494,8 +492,7 @@
if ( (src.OCCUPANT) || (src.HELMET) || (src.SUIT) ) //Unit needs to be absolutely empty
user << "The unit's storage area is too cluttered."
return
- for (var/mob/V in viewers(user))
- V.show_message("[user] starts putting [G.affecting.name] into the Suit Storage Unit.", 3)
+ visible_message("[user] starts putting [G.affecting.name] into the Suit Storage Unit.", 3)
if(do_after(user, 20))
if(!G || !G.affecting) return //derpcheck
var/mob/M = G.affecting
diff --git a/code/game/machinery/telecomms/telecomunications.dm b/code/game/machinery/telecomms/telecomunications.dm
index 97ecbbcffd6..f3d45c25bda 100644
--- a/code/game/machinery/telecomms/telecomunications.dm
+++ b/code/game/machinery/telecomms/telecomunications.dm
@@ -400,13 +400,17 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list()
else // the signal has been decompressed by a processor unit
- // send to all linked server units
- var/sendserver = relay_information(signal, "/obj/machinery/telecomms/server")
- // Can't send to a single server, send to a hub instead!
- if(!sendserver)
- signal.data["slow"] += rand(0, 1) // slow the signal down only slightly
- relay_information(signal, "/obj/machinery/telecomms/hub")
+ // Try sending it!
+ var/list/try_send = list("/obj/machinery/telecomms/server", "/obj/machinery/telecomms/hub", "/obj/machinery/telecomms/broadcaster")
+ var/i = 0
+ for(var/send in try_send)
+ if(i)
+ signal.data["slow"] += rand(0, 1) // slow the signal down only slightly
+ i++
+ var/can_send = relay_information(signal, send)
+ if(can_send)
+ break
diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm
index 031e6f29076..6710e4b95cb 100644
--- a/code/game/machinery/teleporter.dm
+++ b/code/game/machinery/teleporter.dm
@@ -33,16 +33,27 @@
if(istype(L, /obj/effect/landmark/) && istype(L.loc, /turf))
- src.locked = L
- one_time_use = 1
-
usr << "You insert the coordinates into the machine."
usr << "A message flashes across the screen reminding the traveller that the nuclear authentication disk is to remain on the station at all times."
user.drop_item()
del(I)
- for(var/mob/O in hearers(src, null))
- O.show_message("\blue Locked In", 2)
+ if(C.data == "Clown Land")
+ //whoops
+ for(var/mob/O in hearers(src, null))
+ O.show_message("\red Incoming bluespace portal detected, unable to lock in.", 2)
+
+ for(var/obj/machinery/teleport/hub/H in range(1))
+ var/amount = rand(2,5)
+ for(var/i=0;i[M] [M.attacktext] [src]!"), 1)
+ visible_message("\red [M] [M.attacktext] [src]!")
M.attack_log += text("\[[time_stamp()]\] attacked [src.name]")
//src.attack_log += text("\[[time_stamp()]\] was attacked by [M.name] ([M.ckey])")
src.health -= M.melee_damage_upper
@@ -419,9 +417,7 @@
/obj/machinery/turret/attack_alien(mob/living/carbon/alien/humanoid/M as mob)
if(!(stat & BROKEN))
playsound(src.loc, 'sound/weapons/slash.ogg', 25, 1, -1)
- for(var/mob/O in viewers(src, null))
- if ((O.client && !( O.blinded )))
- O.show_message(text("\red [] has slashed at []!", M, src), 1)
+ visible_message("\red [] has slashed at []!", M, src)
src.health -= 15
if (src.health <= 0)
src.die()
diff --git a/code/game/master_controller.dm b/code/game/master_controller.dm
deleted file mode 100644
index 3048e0fe9b3..00000000000
--- a/code/game/master_controller.dm
+++ /dev/null
@@ -1,240 +0,0 @@
-var/global/datum/controller/game_controller/master_controller //Set in world.New()
-var/global/datum/failsafe/Failsafe
-var/global/controllernum = "no"
-var/global/controller_iteration = 0
-
-
-var/global/last_tick_timeofday = world.timeofday
-var/global/last_tick_duration = 0
-
-datum/controller/game_controller
- var/processing = 1
-
- var/global/air_master_ready = 0
- var/global/sun_ready = 0
- var/global/mobs_ready = 0
- var/global/diseases_ready = 0
- var/global/machines_ready = 0
- var/global/objects_ready = 0
- var/global/networks_ready = 0
- var/global/powernets_ready = 0
- var/global/ticker_ready = 0
- var/global/next_crew_shuttle_vote = 2 // the next automatic vote to call the crew shuttle
-
- //Used for MC 'proc break' debugging
- var/global/obj/last_obj_processed
- var/global/datum/disease/last_disease_processed
- var/global/obj/machinery/last_machine_processed
- var/global/mob/last_mob_processed
-
-
- proc/setup()
- if(master_controller && (master_controller != src))
- del(src)
- return
- //There can be only one master.
-
- if(!air_master)
- air_master = new /datum/controller/air_system()
- air_master.setup()
-
- if(!job_master)
- job_master = new /datum/controller/occupations()
- if(job_master.SetupOccupations())
- world << "\red \b Job setup complete"
- job_master.LoadJobs("config/jobs.txt")
-
- world.tick_lag = config.Ticklag
-
- createRandomZlevel()
-
- setup_objects()
-
- setupgenetics()
-
-
- /*for(var/i = 0, i < max_secret_rooms, i++)
- make_mining_asteroid_secret()*/
-
- syndicate_code_phrase = generate_code_phrase()//Sets up code phrase for traitors, for the round.
- syndicate_code_response = generate_code_phrase()
-
- emergency_shuttle = new /datum/shuttle_controller/emergency_shuttle()
-
- if(!ticker)
- ticker = new /datum/controller/gameticker()
-
- setupfactions()
-
- spawn
- ticker.pregame()
-
- proc/setup_objects()
- world << "\red \b Initializing objects"
- sleep(-1)
-
- for(var/obj/object in world)
- object.initialize()
-
- world << "\red \b Initializing pipe networks"
- sleep(-1)
-
- for(var/obj/machinery/atmospherics/machine in world)
- machine.build_network()
-
- world << "\red \b Initializing atmos machinery."
- sleep(-1)
- for(var/obj/machinery/atmospherics/unary/vent_pump/T in world)
- T.broadcast_status()
- for(var/obj/machinery/atmospherics/unary/vent_scrubber/T in world)
- T.broadcast_status()
-
- world << "\red \b Initializations complete."
-
- proc/set_debug_state(txt)
- // This should describe what is currently being done by the master controller
- // Useful for crashlogs and similar, because that way it's easy to tell what
- // was going on when the server crashed.
- socket_talk.send_raw("type=ticker_state&message=[txt]")
- return
-
-
- proc/process()
-
- var/currenttime = world.timeofday
- var/diff = (currenttime - last_tick_timeofday) / 10
- last_tick_timeofday = currenttime
- last_tick_duration = diff
-
- if(!processing)
- return 0
- controllernum = "yes"
- spawn (100)
- controllernum = "no"
-
- controller_iteration++
-
- var/start_time = world.timeofday
-
- // Start an automatic crew shuttle vote every hour starting with the second hour
- if(world.time > 10 * 60 * 60 * next_crew_shuttle_vote)
- next_crew_shuttle_vote++
- automatic_crew_shuttle_vote()
-
- air_master_ready = 0
- sun_ready = 0
- mobs_ready = 0
- diseases_ready = 0
- machines_ready = 0
- objects_ready = 0
- networks_ready = 0
- powernets_ready = 0
- ticker_ready = 0
-
- spawn(0)
- src.set_debug_state("Air Master")
- air_master.tick()
- air_master_ready = 1
-
- sleep(1)
-
- spawn(0)
- src.set_debug_state("Sun Position Calculations")
- sun.calc_position()
- sun_ready = 1
-
- sleep(-1)
-
- spawn(0)
- src.set_debug_state("Mob Processing")
- for(var/mob/M in world)
- last_mob_processed = M
- M.Life()
- mobs_ready = 1
-
-
-
- sleep(-1)
-
-
- spawn(0)
- src.set_debug_state("Disease Processing")
- for(var/datum/disease/D in active_diseases)
- last_disease_processed = D
- D.process()
- diseases_ready = 1
-
- spawn(0)
- src.set_debug_state("Machinery Processing")
- for(var/obj/machinery/machine in machines)
- if(machine)
- last_machine_processed = machine
- machine.process()
- if(machine && machine.use_power)
- machine.auto_use_power()
-
- machines_ready = 1
-
- sleep(-1)
- sleep(1)
-
- spawn(0)
- src.set_debug_state("Object Processing")
- for(var/obj/object in processing_objects)
- last_obj_processed = object
- object.process()
- objects_ready = 1
-
- spawn(0)
- src.set_debug_state("Pipe Network Processing")
- for(var/datum/pipe_network/network in pipe_networks)
- network.process()
- networks_ready = 1
-
- spawn(0)
- src.set_debug_state("Powernet Processing")
- for(var/datum/powernet/P in powernets)
- P.reset()
- powernets_ready = 1
-
- sleep(-1)
-
- spawn(0)
- ticker.process()
- ticker_ready = 1
-
- sleep(world.timeofday+12-start_time)
-
- var/IL_check = 0 //Infinite loop check (To report when the master controller breaks.)
- while(!air_master_ready || !sun_ready || !mobs_ready || !diseases_ready || !machines_ready || !objects_ready || !networks_ready || !powernets_ready || !ticker_ready)
- IL_check++
- if(IL_check > 600)
- var/MC_report = "air_master_ready = [air_master_ready]; sun_ready = [sun_ready]; mobs_ready = [mobs_ready]; diseases_ready = [diseases_ready]; machines_ready = [machines_ready]; objects_ready = [objects_ready]; networks_ready = [networks_ready]; powernets_ready = [powernets_ready]; ticker_ready = [ticker_ready];"
- message_admins("PROC BREAKAGE WARNING: The game's master contorller appears to be stuck in one of it's cycles. It has looped through it's delaying loop [IL_check] times.")
- message_admins("The master controller reports: [MC_report]")
- if(!diseases_ready)
- if(last_disease_processed)
- message_admins("DISEASE PROCESSING stuck on [last_disease_processed]", 0, 1)
- else
- message_admins("DISEASE PROCESSING stuck on unknown")
- if(!machines_ready)
- if(last_machine_processed)
- message_admins("MACHINE PROCESSING stuck on [last_machine_processed]", 0, 1)
- else
- message_admins("MACHINE PROCESSING stuck on unknown")
- if(!objects_ready)
- if(last_obj_processed)
- message_admins("OBJ PROCESSING stuck on [last_obj_processed]", 0, 1)
- else
- message_admins("OBJ PROCESSING stuck on unknown")
- log_admin("PROC BREAKAGE WARNING: infinite_loop_check = [IL_check]; [MC_report];")
- message_admins("Master controller breaking out of delaying loop. Restarting the round is advised if problem persists. DO NOT manually restart the master controller.")
- break;
- sleep(1)
-
-
- spawn
- process()
-
-
- return 1
\ No newline at end of file
diff --git a/code/game/objects/effects/decals/Cleanable/fuel.dm b/code/game/objects/effects/decals/Cleanable/fuel.dm
new file mode 100644
index 00000000000..eae392b5a11
--- /dev/null
+++ b/code/game/objects/effects/decals/Cleanable/fuel.dm
@@ -0,0 +1,58 @@
+obj/effect/decal/cleanable/liquid_fuel
+ //Liquid fuel is used for things that used to rely on volatile fuels or plasma being contained to a couple tiles.
+ icon = 'icons/effects/effects.dmi'
+ icon_state = "fuel"
+ layer = TURF_LAYER+0.2
+ anchored = 1
+ var/amount = 1 //Basically moles.
+
+ New(newLoc,amt=1)
+ src.amount = amt
+
+ //Be absorbed by any other liquid fuel in the tile.
+ for(var/obj/effect/decal/cleanable/liquid_fuel/other in newLoc)
+ if(other != src)
+ other.amount += src.amount
+ spawn other.Spread()
+ del src
+
+ Spread()
+ . = ..()
+
+ proc/Spread()
+ //Allows liquid fuels to sometimes flow into other tiles.
+ if(amount < 0.5) return
+ var/turf/simulated/S = loc
+ if(!istype(S)) return
+ for(var/d in cardinal)
+ if(S.air_check_directions & d)
+ if(rand(25))
+ var/turf/simulated/O = get_step(src,d)
+ var/can_pass = 1
+ for (var/obj/machinery/door/airlock/door in O)
+ if (door.density)
+ can_pass = 0
+ if (can_pass)
+ if(!locate(/obj/effect/decal/cleanable/liquid_fuel) in O)
+ new/obj/effect/decal/cleanable/liquid_fuel(O,amount*0.25)
+ amount *= 0.75
+
+ flamethrower_fuel
+ icon_state = "mustard"
+ anchored = 0
+ New(newLoc, amt = 1, d = 0)
+ dir = d //Setting this direction means you won't get torched by your own flamethrower.
+ . = ..()
+ Spread()
+ //The spread for flamethrower fuel is much more precise, to create a wide fire pattern.
+ if(amount < 0.1) return
+ var/turf/simulated/S = loc
+ if(!istype(S)) return
+
+ for(var/d in list(turn(dir,90),turn(dir,-90)))
+ if(S.air_check_directions & d)
+ var/turf/simulated/O = get_step(S,d)
+ new/obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel(O,amount*0.25,d)
+ O.hotspot_expose((T20C*2) + 380,500) //Light flamethrower fuel on fire immediately.
+
+ amount *= 0.5
\ No newline at end of file
diff --git a/code/game/objects/effects/overlays.dm b/code/game/objects/effects/overlays.dm
index 140e5314eb3..a1af754229a 100644
--- a/code/game/objects/effects/overlays.dm
+++ b/code/game/objects/effects/overlays.dm
@@ -17,12 +17,16 @@
icon = 'icons/misc/beach2.dmi'
icon_state = "palm1"
density = 1
+ layer = 5
+ anchored = 1
/obj/effect/overlay/palmtree_l
name = "Palm tree"
icon = 'icons/misc/beach2.dmi'
icon_state = "palm2"
density = 1
+ layer = 5
+ anchored = 1
/obj/effect/overlay/coconut
name = "Coconuts"
diff --git a/code/game/objects/explosion_recursive.dm b/code/game/objects/explosion_recursive.dm
index d5aea573bc4..80b52811800 100644
--- a/code/game/objects/explosion_recursive.dm
+++ b/code/game/objects/explosion_recursive.dm
@@ -105,9 +105,6 @@ proc/explosion_rec(turf/epicenter, power)
/turf/simulated/wall
explosion_resistance = 5
-/turf/simulated/r_wall
- explosion_resistance = 25
-
/turf/simulated/wall/r_wall
explosion_resistance = 25
diff --git a/code/game/objects/items/devices/PDA/cart.dm b/code/game/objects/items/devices/PDA/cart.dm
index eb3e723a232..1d6e22611f9 100644
--- a/code/game/objects/items/devices/PDA/cart.dm
+++ b/code/game/objects/items/devices/PDA/cart.dm
@@ -429,7 +429,8 @@ Code:
else
for(var/obj/machinery/bot/secbot/B in SC.botlist)
- menu += "[B] at [B.loc.loc]
"
+ if (B)
+ menu += "[B] at [B.loc.loc]
"
menu += "
Scan for active bots
"
@@ -495,7 +496,8 @@ Code:
else
for(var/obj/machinery/bot/mulebot/B in QC.botlist)
- menu += "[B] at [B.loc.loc]
"
+ if(B)
+ menu += "[B] at [B.loc.loc]
"
menu += "
Scan for active bots
"
diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm
index 7fd1fad2209..40c8fcdc89f 100644
--- a/code/game/objects/items/devices/flashlight.dm
+++ b/code/game/objects/items/devices/flashlight.dm
@@ -1,9 +1,10 @@
/obj/item/device/flashlight
name = "flashlight"
desc = "A hand-held emergency light."
- icon_state = "flight0"
+ icon = 'icons/obj/lighting.dmi'
+ icon_state = "flashlight"
+ item_state = "flashlight"
w_class = 2
- item_state = "flight"
flags = FPRINT | TABLEPASS | CONDUCT
slot_flags = SLOT_BELT
m_amt = 50
@@ -11,35 +12,33 @@
icon_action_button = "action_flashlight"
var/on = 0
var/brightness_on = 4 //luminosity when on
- var/icon_on = "flight1"
- var/icon_off = "flight0"
/obj/item/device/flashlight/initialize()
..()
- if (on)
- icon_state = icon_on
- src.SetLuminosity(brightness_on)
+ if(on)
+ icon_state = "[initial(icon_state)]-on"
+ SetLuminosity(brightness_on)
else
- icon_state = icon_off
- src.SetLuminosity(0)
+ icon_state = initial(icon_state)
+ SetLuminosity(0)
/obj/item/device/flashlight/proc/update_brightness(var/mob/user = null)
if(on)
- icon_state = icon_on
- if(src.loc == user)
+ icon_state = "[initial(icon_state)]-on"
+ if(loc == user)
user.SetLuminosity(user.luminosity + brightness_on)
else if(isturf(loc))
SetLuminosity(brightness_on)
else
- icon_state = icon_off
- if(src.loc == user)
+ icon_state = initial(icon_state)
+ if(loc == user)
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.
+ user << "You cannot turn the light on while in this [user.loc]." //To prevent some lighting anomalities.
return
on = !on
update_brightness(user)
@@ -47,37 +46,43 @@
/obj/item/device/flashlight/attack(mob/living/M as mob, mob/living/user as mob)
- src.add_fingerprint(user)
- if(src.on && user.zone_sel.selecting == "eyes")
+ add_fingerprint(user)
+ 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
+ if(((CLUMSY in user.mutations) || user.getBrainLoss() >= 60) && prob(50)) //too dumb to use flashlight properly
+ return ..() //just hit them in the head
- if (!(istype(usr, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey")//don't have dexterity
- usr.show_message("\red You don't have the dexterity to do this!",1)
+ if(!(istype(user, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey") //don't have dexterity
+ user << "You don't have the dexterity to do this!"
return
- var/mob/living/carbon/human/H = M//mob has protective eyewear
+ var/mob/living/carbon/human/H = M //mob has protective eyewear
if(istype(M, /mob/living/carbon/human) && ((H.head && H.head.flags & HEADCOVERSEYES) || (H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) || (H.glasses && H.glasses.flags & GLASSESCOVERSEYES)))
- user << text("\blue You're going to need to remove that [] first.", ((H.head && H.head.flags & HEADCOVERSEYES) ? "helmet" : ((H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) ? "mask": "glasses")))
+ user << "You're going to need to remove that [(H.head && H.head.flags & HEADCOVERSEYES) ? "helmet" : (H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) ? "mask": "glasses"] first."
return
- for(var/mob/O in viewers(M, null))//echo message
- if ((O.client && !(O.blinded )))
- O.show_message("\blue [(O==user?"You direct":"[user] directs")] [src] to [(M==user? "your":"[M]")] eyes", 1)
+ if(M == user) //they're using it on themselves
+ if(!M.blinded)
+ flick("flash", M.flash)
+ M.visible_message("[M] directs [src] to \his eyes.", \
+ "You wave the light in front of your eyes! Trippy!")
+ else
+ M.visible_message("[M] directs [src] to \his eyes.", \
+ "You wave the light in front of your eyes.")
+ return
- if(istype(M, /mob/living/carbon/human) || istype(M, /mob/living/carbon/monkey))//robots and aliens are unaffected
- if(M.stat == DEAD || M.sdisabilities & BLIND)//mob is dead or fully blind
- if(M!=user)
- user.show_message("\red [M] pupils does not react to the light!",1)
- else if(XRAY in M.mutations)//mob has X-RAY vision
- if(M!=user)
- user.show_message("\red [M] pupils give an eerie glow!",1)
- else //nothing wrong
+ user.visible_message("[user] directs [src] to [M]'s eyes.", \
+ "You direct [src] to [M]'s eyes.")
+
+ if(istype(M, /mob/living/carbon/human) || istype(M, /mob/living/carbon/monkey)) //robots and aliens are unaffected
+ if(M.stat == DEAD || M.sdisabilities & BLIND) //mob is dead or fully blind
+ user << "[M] pupils does not react to the light!"
+ else if(XRAY in M.mutations) //mob has X-RAY vision
+ user << "[M] pupils give an eerie glow!"
+ else //they're okay!
if(!M.blinded)
- flick("flash", M.flash)//flash the affected mob
- if(M!=user)
- user.show_message("\blue [M] pupils narrow",1)
+ flick("flash", M.flash) //flash the affected mob
+ user << "[M]'s pupils narrow."
else
return ..()
@@ -96,69 +101,34 @@
/obj/item/device/flashlight/pen
name = "penlight"
- desc = "A pen-sized light. It shines as well as a flashlight."
- icon_state = "plight0"
- flags = FPRINT | TABLEPASS | CONDUCT
+ desc = "A pen-sized light, used by medical staff."
+ icon_state = "penlight"
item_state = ""
- icon_on = "plight1"
- icon_off = "plight0"
- brightness_on = 3
+ flags = FPRINT | TABLEPASS | CONDUCT
+ brightness_on = 2
-
-/obj/item/device/flashlight/pen/paralysis/attack(mob/M as mob, mob/user as mob)
- if(!ismob(M))
- return
- user << "\red You stab [M] with the pen."
- M << "\red You feel a tiny prick!"
- M.attack_log += text("\[[time_stamp()]\] Has been stabbed with [src.name] by [user.name] ([user.ckey])")
- user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to stab [M.name] ([M.ckey])")
-
- log_attack("[user.name] ([user.ckey]) Used the [src.name] to stab [M.name] ([M.ckey])")
-
- log_admin("ATTACK: [user.name] ([user.ckey]) Used the [src.name] to stab [M.name] ([M.ckey])")
- msg_admin_attack("ATTACK: [user.name] ([user.ckey]) Used the [src.name] to stab [M.name] ([M.ckey])") //BS12 EDIT ALG
-
- ..()
- return
-
-/obj/item/device/flashlight/pen/paralysis/New()
- var/datum/reagents/R = new/datum/reagents(15)
- reagents = R
- R.my_atom = src
- R.add_reagent("zombiepowder", 15)
- ..()
- return
-
-/obj/item/device/flashlight/pen/paralysis/attack(mob/M as mob, mob/user as mob)
- if (!( istype(M, /mob) ))
- return
- ..()
- if (reagents.total_volume)
- if(M.reagents) reagents.trans_to(M, 15)
- return
-
// the desk lamps are a bit special
/obj/item/device/flashlight/lamp
name = "desk lamp"
- desc = "A desk lamp"
- icon = 'icons/obj/lighting.dmi'
- icon_state = "lamp0"
+ desc = "A desk lamp with an adjustable mount."
+ icon_state = "lamp"
+ item_state = "lamp"
brightness_on = 5
- icon_on = "lamp1"
- icon_off = "lamp0"
w_class = 4
flags = FPRINT | TABLEPASS | CONDUCT
m_amt = 0
g_amt = 0
on = 1
+
// green-shaded desk lamp
/obj/item/device/flashlight/lamp/green
- icon_state = "green0"
- icon_on = "green1"
- icon_off = "green0"
- desc = "A green-shaded desk lamp"
+ desc = "A classic green-shaded desk lamp."
+ icon_state = "lampgreen"
+ item_state = "lampgreen"
+ brightness_on = 5
+
/obj/item/device/flashlight/lamp/verb/toggle_light()
set name = "Toggle light"
@@ -166,4 +136,59 @@
set src in oview(1)
if(!usr.stat)
- attack_self(usr)
\ No newline at end of file
+ attack_self(usr)
+
+// FLARES
+
+/obj/item/device/flashlight/flare
+ name = "flare"
+ desc = "A red Nanotrasen issued flare. There are instructions on the side, it reads 'pull cord, make light'."
+ w_class = 2.0
+ brightness_on = 7 // Pretty bright.
+ icon_state = "flare"
+ item_state = "flare"
+ var/fuel = 0
+ var/on_damage = 7
+ var/produce_heat = 1500
+
+/obj/item/device/flashlight/flare/New()
+ fuel = rand(3000, 4500) // Last 10 to 15 minutes.
+ ..()
+
+/obj/item/device/flashlight/flare/process()
+ var/turf/pos = get_turf(src)
+ pos.hotspot_expose(produce_heat, 5)
+ fuel = max(fuel - 1, 0)
+ 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()
+ on = 0
+ src.force = initial(src.force)
+ src.damtype = initial(src.damtype)
+ if(ismob(loc))
+ var/mob/U = loc
+ update_brightness(U)
+ else
+ 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(!on)
+ user.visible_message("[user] activates the flare.", "You pull the cord on the flare, activating it!")
+ else
+ return
+ // All good, turn it on.
+ on = 1
+ update_brightness(user)
+ src.force = on_damage
+ src.damtype = "fire"
+ processing_objects += src
\ No newline at end of file
diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm
index f270b5a214b..eb5c3b2582c 100644
--- a/code/game/objects/items/devices/radio/radio.dm
+++ b/code/game/objects/items/devices/radio/radio.dm
@@ -210,14 +210,13 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
if (!connection)
return
- Broadcast_Message(connection, new /mob/living/silicon/ai(src),
+ Broadcast_Message(connection, new /mob/living/silicon/ai(src,null,null,1),
0, "*garbled automated announcement*", src,
message, from, "Automated Announcement", from, "synthesized voice",
4, 0, 1)
return
-/obj/item/device/radio/talk_into(mob/M as mob, message, channel)
-
+/obj/item/device/radio/talk_into(mob/living/M as mob, message, channel)
if(!on) return // the device has to be on
// Fix for permacell radios, but kinda eh about actually fixing them.
if(!M || !message) return
@@ -299,10 +298,9 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
// --- Modifications to the mob's identity ---
// The mob is disguising their identity:
- if (istype(M.wear_mask, /obj/item/clothing/mask/gas/voice))
- if(M.wear_mask:vchange)
- displayname = M.wear_mask:voice
- jobname = "Unknown"
+ if (ishuman(M) && M.GetVoice() != real_name)
+ displayname = M.GetVoice()
+ jobname = "Unknown"
voicemask = 1
@@ -472,7 +470,7 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
if (R.client && R.client.STFU_radio) //Adminning with 80 people on can be fun when you're trying to talk and all you can hear is radios.
continue
if (R.say_understands(M))
- if (!ishuman(M) || istype(M.wear_mask, /obj/item/clothing/mask/gas/voice))
+ if (ishuman(M) && M.GetVoice() != M.real_name)
heard_masked += R
else
heard_normal += R
@@ -556,10 +554,8 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
if (length(heard_masked))
var/N = M.name
var/J = eqjobname
- if (istype(M.wear_mask, /obj/item/clothing/mask/gas/voice)&&M.wear_mask:vchange)
- //To properly have the ninja show up on radio. Could also be useful for similar items.
- //Would not be necessary but the mob could be wearing a mask that is not a voice changer.
- N = M.wear_mask:voice
+ if(ishuman(M) && M.GetVoice() != M.real_name)
+ N = M.GetVoice()
J = "Unknown"
var/rendered = "[part_a][N][part_b][quotedmsg][part_c]"
for (var/mob/R in heard_masked)
diff --git a/code/game/objects/items/devices/violin.dm b/code/game/objects/items/devices/violin.dm
index 2a9487e5b7f..770cac6cc34 100644
--- a/code/game/objects/items/devices/violin.dm
+++ b/code/game/objects/items/devices/violin.dm
@@ -19,175 +19,175 @@
/*BYOND loads resource files at compile time if they are ''. This means you can't really manipulate them dynamically.
Tried doing it dynamically at first but its more trouble than its worth. Would have saved many lines tho.*/
switch(note)
- if("Cn1") soundfile = 'sound/violin/Cn1.ogg'
- if("C#1") soundfile = 'sound/violin/C#1.ogg'
- if("Db1") soundfile = 'sound/violin/Db1.ogg'
- if("Dn1") soundfile = 'sound/violin/Dn1.ogg'
- if("D#1") soundfile = 'sound/violin/D#1.ogg'
- if("Eb1") soundfile = 'sound/violin/Eb1.ogg'
- if("En1") soundfile = 'sound/violin/En1.ogg'
- if("E#1") soundfile = 'sound/violin/E#1.ogg'
- if("Fb1") soundfile = 'sound/violin/Fb1.ogg'
- if("Fn1") soundfile = 'sound/violin/Fn1.ogg'
- if("F#1") soundfile = 'sound/violin/F#1.ogg'
- if("Gb1") soundfile = 'sound/violin/Gb1.ogg'
- if("Gn1") soundfile = 'sound/violin/Gn1.ogg'
- if("G#1") soundfile = 'sound/violin/G#1.ogg'
- if("Ab1") soundfile = 'sound/violin/Ab1.ogg'
- if("An1") soundfile = 'sound/violin/An1.ogg'
- if("A#1") soundfile = 'sound/violin/A#1.ogg'
- if("Bb1") soundfile = 'sound/violin/Bb1.ogg'
- if("Bn1") soundfile = 'sound/violin/Bn1.ogg'
- if("B#1") soundfile = 'sound/violin/B#1.ogg'
- if("Cb2") soundfile = 'sound/violin/Cb2.ogg'
- if("Cn2") soundfile = 'sound/violin/Cn2.ogg'
- if("C#2") soundfile = 'sound/violin/C#2.ogg'
- if("Db2") soundfile = 'sound/violin/Db2.ogg'
- if("Dn2") soundfile = 'sound/violin/Dn2.ogg'
- if("D#2") soundfile = 'sound/violin/D#2.ogg'
- if("Eb2") soundfile = 'sound/violin/Eb2.ogg'
- if("En2") soundfile = 'sound/violin/En2.ogg'
- if("E#2") soundfile = 'sound/violin/E#2.ogg'
- if("Fb2") soundfile = 'sound/violin/Fb2.ogg'
- if("Fn2") soundfile = 'sound/violin/Fn2.ogg'
- if("F#2") soundfile = 'sound/violin/F#2.ogg'
- if("Gb2") soundfile = 'sound/violin/Gb2.ogg'
- if("Gn2") soundfile = 'sound/violin/Gn2.ogg'
- if("G#2") soundfile = 'sound/violin/G#2.ogg'
- if("Ab2") soundfile = 'sound/violin/Ab2.ogg'
- if("An2") soundfile = 'sound/violin/An2.ogg'
- if("A#2") soundfile = 'sound/violin/A#2.ogg'
- if("Bb2") soundfile = 'sound/violin/Bb2.ogg'
- if("Bn2") soundfile = 'sound/violin/Bn2.ogg'
- if("B#2") soundfile = 'sound/violin/B#2.ogg'
- if("Cb3") soundfile = 'sound/violin/Cb3.ogg'
- if("Cn3") soundfile = 'sound/violin/Cn3.ogg'
- if("C#3") soundfile = 'sound/violin/C#3.ogg'
- if("Db3") soundfile = 'sound/violin/Db3.ogg'
- if("Dn3") soundfile = 'sound/violin/Dn3.ogg'
- if("D#3") soundfile = 'sound/violin/D#3.ogg'
- if("Eb3") soundfile = 'sound/violin/Eb3.ogg'
- if("En3") soundfile = 'sound/violin/En3.ogg'
- if("E#3") soundfile = 'sound/violin/E#3.ogg'
- if("Fb3") soundfile = 'sound/violin/Fb3.ogg'
- if("Fn3") soundfile = 'sound/violin/Fn3.ogg'
- if("F#3") soundfile = 'sound/violin/F#3.ogg'
- if("Gb3") soundfile = 'sound/violin/Gb3.ogg'
- if("Gn3") soundfile = 'sound/violin/Gn3.ogg'
- if("G#3") soundfile = 'sound/violin/G#3.ogg'
- if("Ab3") soundfile = 'sound/violin/Ab3.ogg'
- if("An3") soundfile = 'sound/violin/An3.ogg'
- if("A#3") soundfile = 'sound/violin/A#3.ogg'
- if("Bb3") soundfile = 'sound/violin/Bb3.ogg'
- if("Bn3") soundfile = 'sound/violin/Bn3.ogg'
- if("B#3") soundfile = 'sound/violin/B#3.ogg'
- if("Cb4") soundfile = 'sound/violin/Cb4.ogg'
- if("Cn4") soundfile = 'sound/violin/Cn4.ogg'
- if("C#4") soundfile = 'sound/violin/C#4.ogg'
- if("Db4") soundfile = 'sound/violin/Db4.ogg'
- if("Dn4") soundfile = 'sound/violin/Dn4.ogg'
- if("D#4") soundfile = 'sound/violin/D#4.ogg'
- if("Eb4") soundfile = 'sound/violin/Eb4.ogg'
- if("En4") soundfile = 'sound/violin/En4.ogg'
- if("E#4") soundfile = 'sound/violin/E#4.ogg'
- if("Fb4") soundfile = 'sound/violin/Fb4.ogg'
- if("Fn4") soundfile = 'sound/violin/Fn4.ogg'
- if("F#4") soundfile = 'sound/violin/F#4.ogg'
- if("Gb4") soundfile = 'sound/violin/Gb4.ogg'
- if("Gn4") soundfile = 'sound/violin/Gn4.ogg'
- if("G#4") soundfile = 'sound/violin/G#4.ogg'
- if("Ab4") soundfile = 'sound/violin/Ab4.ogg'
- if("An4") soundfile = 'sound/violin/An4.ogg'
- if("A#4") soundfile = 'sound/violin/A#4.ogg'
- if("Bb4") soundfile = 'sound/violin/Bb4.ogg'
- if("Bn4") soundfile = 'sound/violin/Bn4.ogg'
- if("B#4") soundfile = 'sound/violin/B#4.ogg'
- if("Cb5") soundfile = 'sound/violin/Cb5.ogg'
- if("Cn5") soundfile = 'sound/violin/Cn5.ogg'
- if("C#5") soundfile = 'sound/violin/C#5.ogg'
- if("Db5") soundfile = 'sound/violin/Db5.ogg'
- if("Dn5") soundfile = 'sound/violin/Dn5.ogg'
- if("D#5") soundfile = 'sound/violin/D#5.ogg'
- if("Eb5") soundfile = 'sound/violin/Eb5.ogg'
- if("En5") soundfile = 'sound/violin/En5.ogg'
- if("E#5") soundfile = 'sound/violin/E#5.ogg'
- if("Fb5") soundfile = 'sound/violin/Fb5.ogg'
- if("Fn5") soundfile = 'sound/violin/Fn5.ogg'
- if("F#5") soundfile = 'sound/violin/F#5.ogg'
- if("Gb5") soundfile = 'sound/violin/Gb5.ogg'
- if("Gn5") soundfile = 'sound/violin/Gn5.ogg'
- if("G#5") soundfile = 'sound/violin/G#5.ogg'
- if("Ab5") soundfile = 'sound/violin/Ab5.ogg'
- if("An5") soundfile = 'sound/violin/An5.ogg'
- if("A#5") soundfile = 'sound/violin/A#5.ogg'
- if("Bb5") soundfile = 'sound/violin/Bb5.ogg'
- if("Bn5") soundfile = 'sound/violin/Bn5.ogg'
- if("B#5") soundfile = 'sound/violin/B#5.ogg'
- if("Cb6") soundfile = 'sound/violin/Cb6.ogg'
- if("Cn6") soundfile = 'sound/violin/Cn6.ogg'
- if("C#6") soundfile = 'sound/violin/C#6.ogg'
- if("Db6") soundfile = 'sound/violin/Db6.ogg'
- if("Dn6") soundfile = 'sound/violin/Dn6.ogg'
- if("D#6") soundfile = 'sound/violin/D#6.ogg'
- if("Eb6") soundfile = 'sound/violin/Eb6.ogg'
- if("En6") soundfile = 'sound/violin/En6.ogg'
- if("E#6") soundfile = 'sound/violin/E#6.ogg'
- if("Fb6") soundfile = 'sound/violin/Fb6.ogg'
- if("Fn6") soundfile = 'sound/violin/Fn6.ogg'
- if("F#6") soundfile = 'sound/violin/F#6.ogg'
- if("Gb6") soundfile = 'sound/violin/Gb6.ogg'
- if("Gn6") soundfile = 'sound/violin/Gn6.ogg'
- if("G#6") soundfile = 'sound/violin/G#6.ogg'
- if("Ab6") soundfile = 'sound/violin/Ab6.ogg'
- if("An6") soundfile = 'sound/violin/An6.ogg'
- if("A#6") soundfile = 'sound/violin/A#6.ogg'
- if("Bb6") soundfile = 'sound/violin/Bb6.ogg'
- if("Bn6") soundfile = 'sound/violin/Bn6.ogg'
- if("B#6") soundfile = 'sound/violin/B#6.ogg'
- if("Cb7") soundfile = 'sound/violin/Cb7.ogg'
- if("Cn7") soundfile = 'sound/violin/Cn7.ogg'
- if("C#7") soundfile = 'sound/violin/C#7.ogg'
- if("Db7") soundfile = 'sound/violin/Db7.ogg'
- if("Dn7") soundfile = 'sound/violin/Dn7.ogg'
- if("D#7") soundfile = 'sound/violin/D#7.ogg'
- if("Eb7") soundfile = 'sound/violin/Eb7.ogg'
- if("En7") soundfile = 'sound/violin/En7.ogg'
- if("E#7") soundfile = 'sound/violin/E#7.ogg'
- if("Fb7") soundfile = 'sound/violin/Fb7.ogg'
- if("Fn7") soundfile = 'sound/violin/Fn7.ogg'
- if("F#7") soundfile = 'sound/violin/F#7.ogg'
- if("Gb7") soundfile = 'sound/violin/Gb7.ogg'
- if("Gn7") soundfile = 'sound/violin/Gn7.ogg'
- if("G#7") soundfile = 'sound/violin/G#7.ogg'
- if("Ab7") soundfile = 'sound/violin/Ab7.ogg'
- if("An7") soundfile = 'sound/violin/An7.ogg'
- if("A#7") soundfile = 'sound/violin/A#7.ogg'
- if("Bb7") soundfile = 'sound/violin/Bb7.ogg'
- if("Bn7") soundfile = 'sound/violin/Bn7.ogg'
- if("B#7") soundfile = 'sound/violin/B#7.ogg'
- if("Cb8") soundfile = 'sound/violin/Cb8.ogg'
- if("Cn8") soundfile = 'sound/violin/Cn8.ogg'
- if("C#8") soundfile = 'sound/violin/C#8.ogg'
- if("Db8") soundfile = 'sound/violin/Db8.ogg'
- if("Dn8") soundfile = 'sound/violin/Dn8.ogg'
- if("D#8") soundfile = 'sound/violin/D#8.ogg'
- if("Eb8") soundfile = 'sound/violin/Eb8.ogg'
- if("En8") soundfile = 'sound/violin/En8.ogg'
- if("E#8") soundfile = 'sound/violin/E#8.ogg'
- if("Fb8") soundfile = 'sound/violin/Fb8.ogg'
- if("Fn8") soundfile = 'sound/violin/Fn8.ogg'
- if("F#8") soundfile = 'sound/violin/F#8.ogg'
- if("Gb8") soundfile = 'sound/violin/Gb8.ogg'
- if("Gn8") soundfile = 'sound/violin/Gn8.ogg'
- if("G#8") soundfile = 'sound/violin/G#8.ogg'
- if("Ab8") soundfile = 'sound/violin/Ab8.ogg'
- if("An8") soundfile = 'sound/violin/An8.ogg'
- if("A#8") soundfile = 'sound/violin/A#8.ogg'
- if("Bb8") soundfile = 'sound/violin/Bb8.ogg'
- if("Bn8") soundfile = 'sound/violin/Bn8.ogg'
- if("B#8") soundfile = 'sound/violin/B#8.ogg'
- if("Cb9") soundfile = 'sound/violin/Cb9.ogg'
- if("Cn9") soundfile = 'sound/violin/Cn9.ogg'
+ if("Cn1") soundfile = 'sound/violin/Cn1.mid'
+ if("C#1") soundfile = 'sound/violin/C#1.mid'
+ if("Db1") soundfile = 'sound/violin/Db1.mid'
+ if("Dn1") soundfile = 'sound/violin/Dn1.mid'
+ if("D#1") soundfile = 'sound/violin/D#1.mid'
+ if("Eb1") soundfile = 'sound/violin/Eb1.mid'
+ if("En1") soundfile = 'sound/violin/En1.mid'
+ if("E#1") soundfile = 'sound/violin/E#1.mid'
+ if("Fb1") soundfile = 'sound/violin/Fb1.mid'
+ if("Fn1") soundfile = 'sound/violin/Fn1.mid'
+ if("F#1") soundfile = 'sound/violin/F#1.mid'
+ if("Gb1") soundfile = 'sound/violin/Gb1.mid'
+ if("Gn1") soundfile = 'sound/violin/Gn1.mid'
+ if("G#1") soundfile = 'sound/violin/G#1.mid'
+ if("Ab1") soundfile = 'sound/violin/Ab1.mid'
+ if("An1") soundfile = 'sound/violin/An1.mid'
+ if("A#1") soundfile = 'sound/violin/A#1.mid'
+ if("Bb1") soundfile = 'sound/violin/Bb1.mid'
+ if("Bn1") soundfile = 'sound/violin/Bn1.mid'
+ if("B#1") soundfile = 'sound/violin/B#1.mid'
+ if("Cb2") soundfile = 'sound/violin/Cb2.mid'
+ if("Cn2") soundfile = 'sound/violin/Cn2.mid'
+ if("C#2") soundfile = 'sound/violin/C#2.mid'
+ if("Db2") soundfile = 'sound/violin/Db2.mid'
+ if("Dn2") soundfile = 'sound/violin/Dn2.mid'
+ if("D#2") soundfile = 'sound/violin/D#2.mid'
+ if("Eb2") soundfile = 'sound/violin/Eb2.mid'
+ if("En2") soundfile = 'sound/violin/En2.mid'
+ if("E#2") soundfile = 'sound/violin/E#2.mid'
+ if("Fb2") soundfile = 'sound/violin/Fb2.mid'
+ if("Fn2") soundfile = 'sound/violin/Fn2.mid'
+ if("F#2") soundfile = 'sound/violin/F#2.mid'
+ if("Gb2") soundfile = 'sound/violin/Gb2.mid'
+ if("Gn2") soundfile = 'sound/violin/Gn2.mid'
+ if("G#2") soundfile = 'sound/violin/G#2.mid'
+ if("Ab2") soundfile = 'sound/violin/Ab2.mid'
+ if("An2") soundfile = 'sound/violin/An2.mid'
+ if("A#2") soundfile = 'sound/violin/A#2.mid'
+ if("Bb2") soundfile = 'sound/violin/Bb2.mid'
+ if("Bn2") soundfile = 'sound/violin/Bn2.mid'
+ if("B#2") soundfile = 'sound/violin/B#2.mid'
+ if("Cb3") soundfile = 'sound/violin/Cb3.mid'
+ if("Cn3") soundfile = 'sound/violin/Cn3.mid'
+ if("C#3") soundfile = 'sound/violin/C#3.mid'
+ if("Db3") soundfile = 'sound/violin/Db3.mid'
+ if("Dn3") soundfile = 'sound/violin/Dn3.mid'
+ if("D#3") soundfile = 'sound/violin/D#3.mid'
+ if("Eb3") soundfile = 'sound/violin/Eb3.mid'
+ if("En3") soundfile = 'sound/violin/En3.mid'
+ if("E#3") soundfile = 'sound/violin/E#3.mid'
+ if("Fb3") soundfile = 'sound/violin/Fb3.mid'
+ if("Fn3") soundfile = 'sound/violin/Fn3.mid'
+ if("F#3") soundfile = 'sound/violin/F#3.mid'
+ if("Gb3") soundfile = 'sound/violin/Gb3.mid'
+ if("Gn3") soundfile = 'sound/violin/Gn3.mid'
+ if("G#3") soundfile = 'sound/violin/G#3.mid'
+ if("Ab3") soundfile = 'sound/violin/Ab3.mid'
+ if("An3") soundfile = 'sound/violin/An3.mid'
+ if("A#3") soundfile = 'sound/violin/A#3.mid'
+ if("Bb3") soundfile = 'sound/violin/Bb3.mid'
+ if("Bn3") soundfile = 'sound/violin/Bn3.mid'
+ if("B#3") soundfile = 'sound/violin/B#3.mid'
+ if("Cb4") soundfile = 'sound/violin/Cb4.mid'
+ if("Cn4") soundfile = 'sound/violin/Cn4.mid'
+ if("C#4") soundfile = 'sound/violin/C#4.mid'
+ if("Db4") soundfile = 'sound/violin/Db4.mid'
+ if("Dn4") soundfile = 'sound/violin/Dn4.mid'
+ if("D#4") soundfile = 'sound/violin/D#4.mid'
+ if("Eb4") soundfile = 'sound/violin/Eb4.mid'
+ if("En4") soundfile = 'sound/violin/En4.mid'
+ if("E#4") soundfile = 'sound/violin/E#4.mid'
+ if("Fb4") soundfile = 'sound/violin/Fb4.mid'
+ if("Fn4") soundfile = 'sound/violin/Fn4.mid'
+ if("F#4") soundfile = 'sound/violin/F#4.mid'
+ if("Gb4") soundfile = 'sound/violin/Gb4.mid'
+ if("Gn4") soundfile = 'sound/violin/Gn4.mid'
+ if("G#4") soundfile = 'sound/violin/G#4.mid'
+ if("Ab4") soundfile = 'sound/violin/Ab4.mid'
+ if("An4") soundfile = 'sound/violin/An4.mid'
+ if("A#4") soundfile = 'sound/violin/A#4.mid'
+ if("Bb4") soundfile = 'sound/violin/Bb4.mid'
+ if("Bn4") soundfile = 'sound/violin/Bn4.mid'
+ if("B#4") soundfile = 'sound/violin/B#4.mid'
+ if("Cb5") soundfile = 'sound/violin/Cb5.mid'
+ if("Cn5") soundfile = 'sound/violin/Cn5.mid'
+ if("C#5") soundfile = 'sound/violin/C#5.mid'
+ if("Db5") soundfile = 'sound/violin/Db5.mid'
+ if("Dn5") soundfile = 'sound/violin/Dn5.mid'
+ if("D#5") soundfile = 'sound/violin/D#5.mid'
+ if("Eb5") soundfile = 'sound/violin/Eb5.mid'
+ if("En5") soundfile = 'sound/violin/En5.mid'
+ if("E#5") soundfile = 'sound/violin/E#5.mid'
+ if("Fb5") soundfile = 'sound/violin/Fb5.mid'
+ if("Fn5") soundfile = 'sound/violin/Fn5.mid'
+ if("F#5") soundfile = 'sound/violin/F#5.mid'
+ if("Gb5") soundfile = 'sound/violin/Gb5.mid'
+ if("Gn5") soundfile = 'sound/violin/Gn5.mid'
+ if("G#5") soundfile = 'sound/violin/G#5.mid'
+ if("Ab5") soundfile = 'sound/violin/Ab5.mid'
+ if("An5") soundfile = 'sound/violin/An5.mid'
+ if("A#5") soundfile = 'sound/violin/A#5.mid'
+ if("Bb5") soundfile = 'sound/violin/Bb5.mid'
+ if("Bn5") soundfile = 'sound/violin/Bn5.mid'
+ if("B#5") soundfile = 'sound/violin/B#5.mid'
+ if("Cb6") soundfile = 'sound/violin/Cb6.mid'
+ if("Cn6") soundfile = 'sound/violin/Cn6.mid'
+ if("C#6") soundfile = 'sound/violin/C#6.mid'
+ if("Db6") soundfile = 'sound/violin/Db6.mid'
+ if("Dn6") soundfile = 'sound/violin/Dn6.mid'
+ if("D#6") soundfile = 'sound/violin/D#6.mid'
+ if("Eb6") soundfile = 'sound/violin/Eb6.mid'
+ if("En6") soundfile = 'sound/violin/En6.mid'
+ if("E#6") soundfile = 'sound/violin/E#6.mid'
+ if("Fb6") soundfile = 'sound/violin/Fb6.mid'
+ if("Fn6") soundfile = 'sound/violin/Fn6.mid'
+ if("F#6") soundfile = 'sound/violin/F#6.mid'
+ if("Gb6") soundfile = 'sound/violin/Gb6.mid'
+ if("Gn6") soundfile = 'sound/violin/Gn6.mid'
+ if("G#6") soundfile = 'sound/violin/G#6.mid'
+ if("Ab6") soundfile = 'sound/violin/Ab6.mid'
+ if("An6") soundfile = 'sound/violin/An6.mid'
+ if("A#6") soundfile = 'sound/violin/A#6.mid'
+ if("Bb6") soundfile = 'sound/violin/Bb6.mid'
+ if("Bn6") soundfile = 'sound/violin/Bn6.mid'
+ if("B#6") soundfile = 'sound/violin/B#6.mid'
+ if("Cb7") soundfile = 'sound/violin/Cb7.mid'
+ if("Cn7") soundfile = 'sound/violin/Cn7.mid'
+ if("C#7") soundfile = 'sound/violin/C#7.mid'
+ if("Db7") soundfile = 'sound/violin/Db7.mid'
+ if("Dn7") soundfile = 'sound/violin/Dn7.mid'
+ if("D#7") soundfile = 'sound/violin/D#7.mid'
+ if("Eb7") soundfile = 'sound/violin/Eb7.mid'
+ if("En7") soundfile = 'sound/violin/En7.mid'
+ if("E#7") soundfile = 'sound/violin/E#7.mid'
+ if("Fb7") soundfile = 'sound/violin/Fb7.mid'
+ if("Fn7") soundfile = 'sound/violin/Fn7.mid'
+ if("F#7") soundfile = 'sound/violin/F#7.mid'
+ if("Gb7") soundfile = 'sound/violin/Gb7.mid'
+ if("Gn7") soundfile = 'sound/violin/Gn7.mid'
+ if("G#7") soundfile = 'sound/violin/G#7.mid'
+ if("Ab7") soundfile = 'sound/violin/Ab7.mid'
+ if("An7") soundfile = 'sound/violin/An7.mid'
+ if("A#7") soundfile = 'sound/violin/A#7.mid'
+ if("Bb7") soundfile = 'sound/violin/Bb7.mid'
+ if("Bn7") soundfile = 'sound/violin/Bn7.mid'
+ if("B#7") soundfile = 'sound/violin/B#7.mid'
+ if("Cb8") soundfile = 'sound/violin/Cb8.mid'
+ if("Cn8") soundfile = 'sound/violin/Cn8.mid'
+ if("C#8") soundfile = 'sound/violin/C#8.mid'
+ if("Db8") soundfile = 'sound/violin/Db8.mid'
+ if("Dn8") soundfile = 'sound/violin/Dn8.mid'
+ if("D#8") soundfile = 'sound/violin/D#8.mid'
+ if("Eb8") soundfile = 'sound/violin/Eb8.mid'
+ if("En8") soundfile = 'sound/violin/En8.mid'
+ if("E#8") soundfile = 'sound/violin/E#8.mid'
+ if("Fb8") soundfile = 'sound/violin/Fb8.mid'
+ if("Fn8") soundfile = 'sound/violin/Fn8.mid'
+ if("F#8") soundfile = 'sound/violin/F#8.mid'
+ if("Gb8") soundfile = 'sound/violin/Gb8.mid'
+ if("Gn8") soundfile = 'sound/violin/Gn8.mid'
+ if("G#8") soundfile = 'sound/violin/G#8.mid'
+ if("Ab8") soundfile = 'sound/violin/Ab8.mid'
+ if("An8") soundfile = 'sound/violin/An8.mid'
+ if("A#8") soundfile = 'sound/violin/A#8.mid'
+ if("Bb8") soundfile = 'sound/violin/Bb8.mid'
+ if("Bn8") soundfile = 'sound/violin/Bn8.mid'
+ if("B#8") soundfile = 'sound/violin/B#8.mid'
+ if("Cb9") soundfile = 'sound/violin/Cb9.mid'
+ if("Cn9") soundfile = 'sound/violin/Cn9.mid'
else return
hearers(15, get_turf(src)) << sound(soundfile)
diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm
index 65fee3b6dc1..b653c397939 100644
--- a/code/game/objects/items/stacks/sheets/sheet_types.dm
+++ b/code/game/objects/items/stacks/sheets/sheet_types.dm
@@ -1,142 +1,143 @@
-/* Diffrent misc types of sheets
- * Contains:
- * Metal
- * Plasteel
- * Wood
- * Cloth
- * Cardboard
- */
-
-/*
- * Metal
- */
-var/global/list/datum/stack_recipe/metal_recipes = list ( \
- new/datum/stack_recipe("stool", /obj/structure/stool, one_per_turf = 1, on_floor = 1), \
- new/datum/stack_recipe("chair", /obj/structure/stool/bed/chair, one_per_turf = 1, on_floor = 1), \
- new/datum/stack_recipe("bed", /obj/structure/stool/bed, 2, one_per_turf = 1, on_floor = 1), \
- new/datum/stack_recipe("table parts", /obj/item/weapon/table_parts, 2), \
- new/datum/stack_recipe("rack parts", /obj/item/weapon/rack_parts), \
- new/datum/stack_recipe("closet", /obj/structure/closet, 2, time = 15, one_per_turf = 1, on_floor = 1), \
- null, \
- new/datum/stack_recipe("canister", /obj/machinery/portable_atmospherics/canister, 10, time = 15, one_per_turf = 1, on_floor = 1), \
- null, \
- new/datum/stack_recipe("floor tile", /obj/item/stack/tile/plasteel, 1, 4, 20), \
- new/datum/stack_recipe("metal rod", /obj/item/stack/rods, 1, 2, 60), \
- null, \
- new/datum/stack_recipe("computer frame", /obj/structure/computerframe, 5, time = 25, one_per_turf = 1, on_floor = 1), \
- new/datum/stack_recipe("wall girders", /obj/structure/girder, 2, time = 50, one_per_turf = 1, on_floor = 1), \
- new/datum/stack_recipe("airlock assembly", /obj/structure/door_assembly, 4, time = 50, one_per_turf = 1, on_floor = 1), \
- new/datum/stack_recipe("machine frame", /obj/machinery/constructable_frame/machine_frame, 5, time = 25, one_per_turf = 1, on_floor = 1), \
- new/datum/stack_recipe("turret frame", /obj/machinery/porta_turret_construct, 5, time = 25, one_per_turf = 1, on_floor = 1), \
- null, \
- new/datum/stack_recipe("apc frame", /obj/item/apc_frame, 2), \
- new/datum/stack_recipe("grenade casing", /obj/item/weapon/grenade/chem_grenade), \
- new/datum/stack_recipe("light fixture frame", /obj/item/light_fixture_frame, 2), \
- new/datum/stack_recipe("small light fixture frame", /obj/item/light_fixture_frame/small, 1), \
- null, \
- new/datum/stack_recipe("iron door", /obj/structure/mineral_door/iron, 20, one_per_turf = 1, on_floor = 1), \
-)
-
-/obj/item/stack/sheet/metal
- name = "metal"
- desc = "Sheets made out off metal. It has been dubbed Metal Sheets."
- singular_name = "metal sheet"
- icon_state = "sheet-metal"
- m_amt = 3750
- throwforce = 14.0
- flags = FPRINT | TABLEPASS | CONDUCT
- origin_tech = "materials=1"
-
-/obj/item/stack/sheet/metal/cyborg
- name = "metal"
- desc = "Sheets made out off metal. It has been dubbed Metal Sheets."
- singular_name = "metal sheet"
- icon_state = "sheet-metal"
- m_amt = 0
- throwforce = 14.0
- flags = FPRINT | TABLEPASS | CONDUCT
-
-/obj/item/stack/sheet/metal/New(var/loc, var/amount=null)
- recipes = metal_recipes
- return ..()
-
-
-/*
- * Plasteel
- */
-var/global/list/datum/stack_recipe/plasteel_recipes = list ( \
- new/datum/stack_recipe("AI core", /obj/structure/AIcore, 4, time = 50, one_per_turf = 1), \
- )
-
-/obj/item/stack/sheet/plasteel
- name = "plasteel"
- singular_name = "plasteel sheet"
- desc = "This sheet is an alloy of iron and plasma."
- icon_state = "sheet-plasteel"
- item_state = "sheet-metal"
- m_amt = 7500
- throwforce = 15.0
- flags = FPRINT | TABLEPASS | CONDUCT
- origin_tech = "materials=2"
-
-/obj/item/stack/sheet/plasteel/New(var/loc, var/amount=null)
- recipes = plasteel_recipes
- return ..()
-
-/*
- * Wood
- */
-var/global/list/datum/stack_recipe/wood_recipes = list ( \
- new/datum/stack_recipe("wooden sandals", /obj/item/clothing/shoes/sandal, 1), \
- new/datum/stack_recipe("table parts", /obj/item/weapon/table_parts/wood, 2), \
- new/datum/stack_recipe("wood floor tile", /obj/item/stack/tile/wood, 1, 4, 20), \
- new/datum/stack_recipe("wooden barricade", /obj/structure/barricade/wooden, 5, time = 50, one_per_turf = 1, on_floor = 1), \
- new/datum/stack_recipe("wooden door", /obj/structure/mineral_door/wood, 10, time = 20, one_per_turf = 1, on_floor = 1), \
- new/datum/stack_recipe("coffin", /obj/structure/closet/coffin, 5, time = 15, one_per_turf = 1, on_floor = 1), \
- )
-
-/obj/item/stack/sheet/wood
- name = "wooden planks"
- desc = "One can only guess that this is a bunch of wood."
- singular_name = "wood plank"
- icon_state = "sheet-wood"
- origin_tech = "materials=1;biotech=1"
-
-/obj/item/stack/sheet/wood/New(var/loc, var/amount=null)
- recipes = wood_recipes
- return ..()
-
-/*
- * Cloth
- */
-/obj/item/stack/sheet/cloth
- name = "cloth"
- desc = "This roll of cloth is made from only the finest chemicals and bunny rabbits."
- singular_name = "cloth roll"
- icon_state = "sheet-cloth"
- origin_tech = "materials=2"
-
-/*
- * Cardboard
- */
-var/global/list/datum/stack_recipe/cardboard_recipes = list ( \
- new/datum/stack_recipe("box", /obj/item/weapon/storage/box), \
- new/datum/stack_recipe("light tubes", /obj/item/weapon/storage/lightbox/tubes), \
- new/datum/stack_recipe("light bulbs", /obj/item/weapon/storage/lightbox/bulbs), \
- new/datum/stack_recipe("mouse traps", /obj/item/weapon/storage/mousetraps), \
- new/datum/stack_recipe("cardborg suit", /obj/item/clothing/suit/cardborg, 3), \
- new/datum/stack_recipe("cardborg helmet", /obj/item/clothing/head/cardborg), \
- new/datum/stack_recipe("pizza box", /obj/item/pizzabox), \
-)
-
-/obj/item/stack/sheet/cardboard //BubbleWrap
- name = "cardboard"
- desc = "Large sheets of card, like boxes folded flat."
- singular_name = "cardboard sheet"
- icon_state = "sheet-card"
- flags = FPRINT | TABLEPASS
- origin_tech = "materials=1"
-
-/obj/item/stack/sheet/cardboard/New(var/loc, var/amount=null)
- recipes = cardboard_recipes
+/* Diffrent misc types of sheets
+ * Contains:
+ * Metal
+ * Plasteel
+ * Wood
+ * Cloth
+ * Cardboard
+ */
+
+/*
+ * Metal
+ */
+var/global/list/datum/stack_recipe/metal_recipes = list ( \
+ new/datum/stack_recipe("stool", /obj/structure/stool, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("chair", /obj/structure/stool/bed/chair, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("bed", /obj/structure/stool/bed, 2, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("table parts", /obj/item/weapon/table_parts, 2), \
+ new/datum/stack_recipe("rack parts", /obj/item/weapon/rack_parts), \
+ new/datum/stack_recipe("closet", /obj/structure/closet, 2, time = 15, one_per_turf = 1, on_floor = 1), \
+ null, \
+ new/datum/stack_recipe("canister", /obj/machinery/portable_atmospherics/canister, 10, time = 15, one_per_turf = 1, on_floor = 1), \
+ null, \
+ new/datum/stack_recipe("floor tile", /obj/item/stack/tile/plasteel, 1, 4, 20), \
+ new/datum/stack_recipe("metal rod", /obj/item/stack/rods, 1, 2, 60), \
+ null, \
+ new/datum/stack_recipe("computer frame", /obj/structure/computerframe, 5, time = 25, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("wall girders", /obj/structure/girder, 2, time = 50, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("airlock assembly", /obj/structure/door_assembly, 4, time = 50, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("machine frame", /obj/machinery/constructable_frame/machine_frame, 5, time = 25, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("turret frame", /obj/machinery/porta_turret_construct, 5, time = 25, one_per_turf = 1, on_floor = 1), \
+ null, \
+ new/datum/stack_recipe("apc frame", /obj/item/apc_frame, 2), \
+ new/datum/stack_recipe("grenade casing", /obj/item/weapon/grenade/chem_grenade), \
+ new/datum/stack_recipe("light fixture frame", /obj/item/light_fixture_frame, 2), \
+ new/datum/stack_recipe("small light fixture frame", /obj/item/light_fixture_frame/small, 1), \
+ null, \
+ new/datum/stack_recipe("iron door", /obj/structure/mineral_door/iron, 20, one_per_turf = 1, on_floor = 1), \
+)
+
+/obj/item/stack/sheet/metal
+ name = "metal"
+ desc = "Sheets made out off metal. It has been dubbed Metal Sheets."
+ singular_name = "metal sheet"
+ icon_state = "sheet-metal"
+ m_amt = 3750
+ throwforce = 14.0
+ flags = FPRINT | TABLEPASS | CONDUCT
+ origin_tech = "materials=1"
+
+/obj/item/stack/sheet/metal/cyborg
+ name = "metal"
+ desc = "Sheets made out off metal. It has been dubbed Metal Sheets."
+ singular_name = "metal sheet"
+ icon_state = "sheet-metal"
+ m_amt = 0
+ throwforce = 14.0
+ flags = FPRINT | TABLEPASS | CONDUCT
+
+/obj/item/stack/sheet/metal/New(var/loc, var/amount=null)
+ recipes = metal_recipes
+ return ..()
+
+
+/*
+ * Plasteel
+ */
+var/global/list/datum/stack_recipe/plasteel_recipes = list ( \
+ new/datum/stack_recipe("AI core", /obj/structure/AIcore, 4, time = 50, one_per_turf = 1), \
+ )
+
+/obj/item/stack/sheet/plasteel
+ name = "plasteel"
+ singular_name = "plasteel sheet"
+ desc = "This sheet is an alloy of iron and plasma."
+ icon_state = "sheet-plasteel"
+ item_state = "sheet-metal"
+ m_amt = 7500
+ throwforce = 15.0
+ flags = FPRINT | TABLEPASS | CONDUCT
+ origin_tech = "materials=2"
+
+/obj/item/stack/sheet/plasteel/New(var/loc, var/amount=null)
+ recipes = plasteel_recipes
+ return ..()
+
+/*
+ * Wood
+ */
+var/global/list/datum/stack_recipe/wood_recipes = list ( \
+ new/datum/stack_recipe("wooden sandals", /obj/item/clothing/shoes/sandal, 1), \
+ new/datum/stack_recipe("wood floor tile", /obj/item/stack/tile/wood, 1, 4, 20), \
+ new/datum/stack_recipe("table parts", /obj/item/weapon/table_parts/wood, 2), \
+ new/datum/stack_recipe("wooden chair", /obj/structure/stool/bed/chair/wood/normal, 3, time = 10, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("wooden barricade", /obj/structure/barricade/wooden, 5, time = 50, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("wooden door", /obj/structure/mineral_door/wood, 10, time = 20, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("coffin", /obj/structure/closet/coffin, 5, time = 15, one_per_turf = 1, on_floor = 1), \
+ )
+
+/obj/item/stack/sheet/wood
+ name = "wooden planks"
+ desc = "One can only guess that this is a bunch of wood."
+ singular_name = "wood plank"
+ icon_state = "sheet-wood"
+ origin_tech = "materials=1;biotech=1"
+
+/obj/item/stack/sheet/wood/New(var/loc, var/amount=null)
+ recipes = wood_recipes
+ return ..()
+
+/*
+ * Cloth
+ */
+/obj/item/stack/sheet/cloth
+ name = "cloth"
+ desc = "This roll of cloth is made from only the finest chemicals and bunny rabbits."
+ singular_name = "cloth roll"
+ icon_state = "sheet-cloth"
+ origin_tech = "materials=2"
+
+/*
+ * Cardboard
+ */
+var/global/list/datum/stack_recipe/cardboard_recipes = list ( \
+ new/datum/stack_recipe("box", /obj/item/weapon/storage/box), \
+ new/datum/stack_recipe("light tubes", /obj/item/weapon/storage/lightbox/tubes), \
+ new/datum/stack_recipe("light bulbs", /obj/item/weapon/storage/lightbox/bulbs), \
+ new/datum/stack_recipe("mouse traps", /obj/item/weapon/storage/mousetraps), \
+ new/datum/stack_recipe("cardborg suit", /obj/item/clothing/suit/cardborg, 3), \
+ new/datum/stack_recipe("cardborg helmet", /obj/item/clothing/head/cardborg), \
+ new/datum/stack_recipe("pizza box", /obj/item/pizzabox), \
+)
+
+/obj/item/stack/sheet/cardboard //BubbleWrap
+ name = "cardboard"
+ desc = "Large sheets of card, like boxes folded flat."
+ singular_name = "cardboard sheet"
+ icon_state = "sheet-card"
+ flags = FPRINT | TABLEPASS
+ origin_tech = "materials=1"
+
+/obj/item/stack/sheet/cardboard/New(var/loc, var/amount=null)
+ recipes = cardboard_recipes
return ..()
\ No newline at end of file
diff --git a/code/game/objects/items/trash.dm b/code/game/objects/items/trash.dm
index 68330ee797f..15530ff720f 100644
--- a/code/game/objects/items/trash.dm
+++ b/code/game/objects/items/trash.dm
@@ -22,7 +22,7 @@
name = "Popcorn"
icon_state = "popcorn"
sosjerky
- name = "Sosjerky"
+ name = "Scaredy's Private Reserve Beef Jerky"
icon_state = "sosjerky"
syndi_cakes
name = "Syndi cakes"
diff --git a/code/game/objects/items/weapons/Bedsheets.dm b/code/game/objects/items/weapons/Bedsheets.dm
deleted file mode 100644
index 440a6c08f58..00000000000
--- a/code/game/objects/items/weapons/Bedsheets.dm
+++ /dev/null
@@ -1,14 +0,0 @@
-/obj/item/weapon/bedsheet/ex_act(severity)
- if (severity <= 2)
- del(src)
- return
- return
-
-/obj/item/weapon/bedsheet/attack_self(mob/user as mob)
- user.drop_item()
- if(layer == initial(layer))
- layer = 5
- else
- layer = initial(layer)
- add_fingerprint(user)
- return
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/explosives.dm b/code/game/objects/items/weapons/explosives.dm
index 2586f4e4ce0..2f069f931a6 100644
--- a/code/game/objects/items/weapons/explosives.dm
+++ b/code/game/objects/items/weapons/explosives.dm
@@ -16,8 +16,8 @@
log_attack(" [user.real_name] ([user.ckey]) tried planting [name] on [target:real_name] ([target:ckey])")
user.visible_message("\red [user.name] is trying to plant some kind of explosive on [target.name]!")
- log_admin("ATTACK: [user.real_name] ([user.ckey]) tried planting [name] on [target:real_name] ([target:ckey])")
- msg_admin_attack("ATTACK: [user.real_name] ([user.ckey]) tried planting [name] on [target:real_name] ([target:ckey])") //BS12 EDIT ALG
+ log_admin("ATTACK: [user.real_name] ([user.ckey]) tried planting [name] on [target:real_name] ([target:ckey])")
+ msg_admin_attack("ATTACK: [user.real_name] ([user.ckey]) tried planting [name] on [target:real_name] ([target:ckey])") //BS12 EDIT ALG
if(do_after(user, 50) && in_range(user, target))
user.drop_item()
diff --git a/code/game/objects/items/weapons/grenades/spawnergrenade.dm b/code/game/objects/items/weapons/grenades/spawnergrenade.dm
index fe15703fa2a..9f911085228 100644
--- a/code/game/objects/items/weapons/grenades/spawnergrenade.dm
+++ b/code/game/objects/items/weapons/grenades/spawnergrenade.dm
@@ -47,6 +47,6 @@
/obj/item/weapon/grenade/spawnergrenade/spesscarp
name = "carp delivery grenade"
- spawner_type = /mob/living/simple_animal/carp
+ spawner_type = /mob/living/simple_animal/hostile/carp
deliveryamt = 5
origin_tech = "materials=3;magnets=4;syndicate=4"
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/secstorage/secstorage.dm b/code/game/objects/items/weapons/secstorage/secstorage.dm
index d85a749498d..af8af6e92b6 100644
--- a/code/game/objects/items/weapons/secstorage/secstorage.dm
+++ b/code/game/objects/items/weapons/secstorage/secstorage.dm
@@ -192,11 +192,9 @@
usr << "\red [src] is locked and cannot be opened!"
else if ((src.loc == user) && (!src.locked))
playsound(src.loc, "rustle", 50, 1, -5)
- if (user.s_active == src)
+ if (user.s_active)
user.s_active.close(user) //Close and re-open
- src.show_to(user)
- else
- user.s_active.close(user) //Just close
+ src.show_to(user)
else
..()
for(var/mob/M in range(1))
diff --git a/code/game/objects/items/weapons/storage/briefcase.dm b/code/game/objects/items/weapons/storage/briefcase.dm
index 6c1ed7ef324..0101b7c103e 100644
--- a/code/game/objects/items/weapons/storage/briefcase.dm
+++ b/code/game/objects/items/weapons/storage/briefcase.dm
@@ -1,12 +1,5 @@
/obj/item/weapon/storage/briefcase/New()
..()
- new /obj/item/weapon/paper(src)
- new /obj/item/weapon/paper(src)
- new /obj/item/weapon/paper(src)
- new /obj/item/weapon/paper(src)
- new /obj/item/weapon/paper(src)
- new /obj/item/weapon/paper(src)
- new /obj/item/weapon/pen(src)
/obj/item/weapon/storage/briefcase/attack(mob/living/M as mob, mob/living/user as mob)
//..()
diff --git a/code/game/objects/items/weapons/storage/toolbox.dm b/code/game/objects/items/weapons/storage/toolbox.dm
index 512d8ef88de..b0743f0a698 100644
--- a/code/game/objects/items/weapons/storage/toolbox.dm
+++ b/code/game/objects/items/weapons/storage/toolbox.dm
@@ -4,6 +4,8 @@
new /obj/item/weapon/extinguisher/mini(src)
if(prob(50))
new /obj/item/device/flashlight(src)
+ else
+ new /obj/item/device/flashlight/flare(src)
new /obj/item/device/radio(src)
/obj/item/weapon/storage/toolbox/mechanical/New()
diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm
index 901a7a270a7..2dcfe954ae2 100644
--- a/code/game/objects/items/weapons/tools.dm
+++ b/code/game/objects/items/weapons/tools.dm
@@ -231,9 +231,8 @@
message_admins("[key_name_admin(user)] triggered a fueltank explosion.")
log_game("[key_name(user)] triggered a fueltank explosion.")
user << "\red That was stupid of you."
- explosion(O.loc,-1,0,2)
- if(O)
- del(O)
+ var/obj/structure/reagent_dispensers/fueltank/tank = O
+ tank.explode()
return
if (src.welding)
remove_fuel(1)
diff --git a/code/game/objects/items/weapons/trashbag.dm b/code/game/objects/items/weapons/trashbag.dm
index e9471f60f17..21c76f0cbdb 100644
--- a/code/game/objects/items/weapons/trashbag.dm
+++ b/code/game/objects/items/weapons/trashbag.dm
@@ -1,14 +1,14 @@
/obj/item/weapon/trashbag
+ name = "trash bag"
+ desc = "A heavy-duty, no fun allowed trash bag."
icon = 'icons/obj/trash.dmi'
icon_state = "trashbag0"
item_state = "trashbag"
- name = "Trash bag"
- desc = "A heavy-duty, no fun allowed trash bag."
- var/mode = 1; //0 = pick one at a time, 1 = pick all on tile
- var/capacity = 25; //the number of trash it can carry.
flags = FPRINT | TABLEPASS
slot_flags = SLOT_BELT
w_class = 2.0
+ var/mode = 1; //0 = pick one at a time, 1 = pick all on tile
+ var/capacity = 25; //the number of trash it can carry.
/obj/item/weapon/trashbag/update_icon()
if(contents.len == 0)
@@ -21,21 +21,20 @@
/obj/item/weapon/trashbag/attackby(obj/item/W as obj, mob/living/user as mob)
..()
- if (contents.len < capacity)
- if (istype(W, /obj/item))
- if (W.w_class <= 2)
+ if(contents.len < capacity)
+ if(istype(W, /obj/item))
+ if(W.w_class <= 2)
var/obj/item/O = W
- src.contents += O
+ contents += O
else
- user << "\blue The bag is full!"
+ user << "[src] is full!"
/obj/item/weapon/trashbag/attack_self(mob/living/user as mob)
-
if(contents.len > 0)
- for(var/obj/item/I in src.contents)
+ for(var/obj/item/I in contents)
I.loc = user.loc
update_icon()
- user << "\blue You drop all the trash onto the floor."
+ user << "You empty [src] onto [user.loc]."
/obj/item/weapon/trashbag/afterattack(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, flag)
if(istype(target, /obj/item))
@@ -43,23 +42,23 @@
if(W.w_class <= 2)
if(mode == 1)
if(contents.len < capacity) //slightly redundant, but it makes it prettier in the chatbox. -Pete
- user << "\blue You pick up all the trash."
+ user << "You pick up all the trash."
for(var/obj/item/O in get_turf(W))
if(istype(O, /obj/item/weapon/disk/nuclear)) continue //No nuke disks - Nodrak
if(contents.len < capacity)
if(O.w_class <= 2)
contents += O;
else
- user << "\blue The bag is full!"
+ user << "[src] is full!"
break
else
- user << "\blue The bag is full!"
+ user << "[src] is full!"
else
if(istype(W, /obj/item/weapon/disk/nuclear)) return //No nuke disks - Nodrak
if(contents.len < capacity)
contents += W;
else
- user << "\blue The bag is full!"
+ user << "[src] is full!"
update_icon()
return
@@ -68,8 +67,7 @@
set category = "Object"
mode = !mode
- switch (mode)
- if(1)
- usr << "The bag now picks up all trash in a tile at once."
- else
- usr << "The bag now picks up one piece of trash at a time."
\ No newline at end of file
+ if(mode == 1)
+ usr << "[src] now picks up all trash in a tile at once."
+ else
+ usr << "[src] now picks up one piece of trash at a time."
\ No newline at end of file
diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm
index d286eba22da..a14d078878e 100644
--- a/code/game/objects/structures/bedsheet_bin.dm
+++ b/code/game/objects/structures/bedsheet_bin.dm
@@ -1,38 +1,168 @@
-// BEDSHEET BIN
+/*
+CONTAINS:
+BEDSHEETS
+LINEN BINS
+*/
+
+/obj/item/weapon/bedsheet
+ name = "bedsheet"
+ desc = "A surprisingly soft linen bedsheet."
+ icon = 'icons/obj/items.dmi'
+ icon_state = "sheet"
+ item_state = "bedsheet"
+ layer = 4.0
+ throwforce = 1
+ throw_speed = 1
+ throw_range = 2
+ w_class = 1.0
+ color = "white"
+
+
+/obj/item/weapon/bedsheet/attack_self(mob/user as mob)
+ user.drop_item()
+ if(layer == initial(layer))
+ layer = 5
+ else
+ layer = initial(layer)
+ add_fingerprint(user)
+ return
+
+
+/obj/item/weapon/bedsheet/blue
+ icon_state = "sheetblue"
+ color = "blue"
+
+/obj/item/weapon/bedsheet/green
+ icon_state = "sheetgreen"
+ color = "green"
+
+/obj/item/weapon/bedsheet/orange
+ icon_state = "sheetorange"
+ color = "orange"
+
+/obj/item/weapon/bedsheet/purple
+ icon_state = "sheetpurple"
+ color = "purple"
+
+/obj/item/weapon/bedsheet/rainbow
+ icon_state = "sheetrainbow"
+ color = "rainbow"
+
+/obj/item/weapon/bedsheet/red
+ icon_state = "sheetred"
+ color = "red"
+
+/obj/item/weapon/bedsheet/yellow
+ icon_state = "sheetyellow"
+ color = "yellow"
+
+/obj/item/weapon/bedsheet/mime
+ icon_state = "sheetmime"
+ color = "mime"
+
+/obj/item/weapon/bedsheet/clown
+ icon_state = "sheetclown"
+ color = "clown"
+
+/obj/item/weapon/bedsheet/captain
+ icon_state = "sheetcaptain"
+ color = "captain"
+
+/obj/item/weapon/bedsheet/rd
+ icon_state = "sheetrd"
+ color = "director"
+
+/obj/item/weapon/bedsheet/medical
+ icon_state = "sheetmedical"
+ color = "medical"
+
+/obj/item/weapon/bedsheet/hos
+ icon_state = "sheethos"
+ color = "hosred"
+
+/obj/item/weapon/bedsheet/hop
+ icon_state = "sheethop"
+ color = "hop"
+
+/obj/item/weapon/bedsheet/ce
+ icon_state = "sheetce"
+ color = "chief"
+
+/obj/item/weapon/bedsheet/brown
+ icon_state = "sheetbrown"
+ color = "brown"
+
+
+
/obj/structure/bedsheetbin
name = "linen bin"
- desc = "A bin for containing bedsheets. It looks rather cosy."
- icon = 'icons/obj/items.dmi'
- icon_state = "bedbin"
- var/amount = 23.0
- anchored = 1.0
+ desc = "A linen bin. It looks rather cosy."
+ icon = 'icons/obj/structures.dmi'
+ icon_state = "linenbin-full"
+ anchored = 1
+ var/amount = 20
+ var/list/sheets = list()
+ var/obj/item/hidden = null
-/obj/structure/bedsheetbin/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if (istype(W, /obj/item/weapon/bedsheet))
- del(W)
- src.amount++
- return
-
-/obj/structure/bedsheetbin/attack_paw(mob/user as mob)
- return src.attack_hand(user)
-
-/obj/structure/bedsheetbin/attack_hand(mob/user as mob)
- if (src.amount >= 1)
- src.amount--
- new /obj/item/weapon/bedsheet( src.loc )
- add_fingerprint(user)
/obj/structure/bedsheetbin/examine()
- set src in oview(1)
-
- src.amount = round(src.amount)
- if (src.amount <= 0)
- src.amount = 0
+ usr << desc
+ if(amount < 1)
usr << "There are no bed sheets in the bin."
- else
- if (src.amount == 1)
- usr << "There is one bed sheet in the bin."
+ return
+ if(amount == 1)
+ usr << "There is one bed sheet in the bin."
+ return
+ usr << "There are [amount] bed sheets in the bin."
+
+
+/obj/structure/bedsheetbin/update_icon()
+ switch(amount)
+ if(0) icon_state = "linenbin-empty"
+ if(1 to amount / 2) icon_state = "linenbin-half"
+ else icon_state = "linenbin-full"
+
+
+/obj/structure/bedsheetbin/attackby(obj/item/I as obj, mob/user as mob)
+ if(istype(I, /obj/item/weapon/bedsheet))
+ user.drop_item()
+ I.loc = src
+ sheets.Add(I)
+ amount++
+ user << "You put [I] in [src]."
+ else if(amount && !hidden && I.w_class < 4) //make sure there's sheets to hide it among, make sure nothing else is hidden in there.
+ user.drop_item()
+ I.loc = src
+ hidden = I
+ user << "You hide [I] among the sheets."
+
+
+
+/obj/structure/bedsheetbin/attack_paw(mob/user as mob)
+ return attack_hand(user)
+
+
+/obj/structure/bedsheetbin/attack_hand(mob/user as mob)
+ if(amount >= 1)
+ amount--
+
+ var/obj/item/weapon/bedsheet/B
+ if(sheets.len > 0)
+ B = sheets[sheets.len]
+ sheets.Remove(B)
+
else
- usr << text("There are [] bed sheets in the bin.", src.amount)
- return
\ No newline at end of file
+ B = new /obj/item/weapon/bedsheet(loc)
+
+ B.loc = user.loc
+ user.put_in_hands(B)
+ user << "You take [B] out of [src]."
+
+ if(hidden)
+ hidden.loc = user.loc
+ user << "[hidden] falls out of [B]!"
+ hidden = null
+
+
+ add_fingerprint(user)
\ No newline at end of file
diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm
index 96fd8c8a518..f360d942fd4 100644
--- a/code/game/objects/structures/crates_lockers/closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets.dm
@@ -15,6 +15,14 @@
var/storage_capacity = 20 //This is so that someone can't pack hundreds of items in a locker/crate
//then open it in a populated area to crash clients.
+/obj/structure/closet/New()
+ ..()
+ spawn(1)
+ if(!opened) // if closed, any item at the crate's loc is put in the contents
+ for(var/obj/item/I in src.loc)
+ if(I.density || I.anchored || I == src) continue
+ I.loc = src
+
/obj/structure/closet/alter_health()
return get_turf(src)
@@ -147,6 +155,13 @@
return
+/obj/structure/closet/attack_animal(mob/living/simple_animal/user as mob)
+ if(user.wall_smash)
+ visible_message("\red [user] destroys the [src]. ")
+ for(var/atom/movable/A as mob|obj in src)
+ A.loc = src.loc
+ del(src)
+
// this should probably use dump_contents()
/obj/structure/closet/blob_act()
if(prob(75))
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
index 71c9aa4b3d6..4518a721534 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
@@ -176,6 +176,8 @@
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/suit/forensics/blue(src)
+ new /obj/item/clothing/suit/forensics/red(src)
new /obj/item/clothing/gloves/black(src)
new /obj/item/clothing/head/det_hat(src)
new /obj/item/clothing/shoes/brown(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm
index 1706e5acc67..adac90b75bf 100644
--- a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm
@@ -141,7 +141,6 @@
/*
* Radiation Closet
*/
-
/obj/structure/closet/radiation
name = "radiation suit closet"
desc = "It's a storage unit for rad-protective suits."
@@ -157,7 +156,7 @@
/*
* Bombsuit closet
*/
- /obj/structure/closet/bombcloset
+/obj/structure/closet/bombcloset
name = "\improper EOD closet"
desc = "It's a storage unit for explosion-protective suits."
icon_state = "bombsuit"
diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm
index c09bae884c0..bd337661b2d 100644
--- a/code/game/objects/structures/crates_lockers/crates.dm
+++ b/code/game/objects/structures/crates_lockers/crates.dm
@@ -197,13 +197,6 @@
// new /obj/item/weapon/pestspray(src)
// new /obj/item/weapon/pestspray(src)
-/obj/structure/closet/crate/New()
- ..()
- spawn(1)
- if(!opened) // if closed, any item at the crate's loc is put in the contents
- for(var/obj/item/I in src.loc)
- if(I.density || I.anchored || I == src) continue
- I.loc = src
/obj/structure/closet/crate/secure/New()
..()
diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm
index 7c0fe9edba7..b3e8f852125 100644
--- a/code/game/objects/structures/false_walls.dm
+++ b/code/game/objects/structures/false_walls.dm
@@ -143,7 +143,7 @@
if(istype(W, /obj/item/weapon/screwdriver))
var/turf/T = get_turf(src)
user.visible_message("[user] tightens some bolts on the wall.", "You tighten the bolts on the wall.")
- if(!mineral)
+ if(!mineral || mineral == "metal")
T.ReplaceWithWall()
else
T.ReplaceWithMineralWall(mineral)
diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm
index 7b4687bf478..425fd06558f 100644
--- a/code/game/objects/structures/grille.dm
+++ b/code/game/objects/structures/grille.dm
@@ -14,202 +14,208 @@
var/destroyed = 0
explosion_resistance = 5
- ex_act(severity)
- switch(severity)
- if(1.0)
+/obj/structure/grille/ex_act(severity)
+ switch(severity)
+ if(1.0)
+ del(src)
+ return
+ if(2.0)
+ if(prob(50))
del(src)
return
- if(2.0)
- if(prob(50))
- del(src)
- return
- if(3.0)
- if(prob(25))
- src.health -= 11
- healthcheck()
- return
+ if(3.0)
+ if(prob(25))
+ src.health -= 11
+ healthcheck()
+ return
+
+/obj/structure/grille/blob_act()
+ del(src)
+ return
+
+/obj/structure/grille/Bumped(atom/user)
+ if(ismob(user)) shock(user, 70)
- blob_act()
- del(src)
- return
-
- Bumped(atom/user)
- if(ismob(user)) shock(user, 70)
+/obj/structure/grille/meteorhit(var/obj/M)
+ if (M.icon_state == "flaming")
+ src.health -= 2
+ healthcheck()
+ return
- meteorhit(var/obj/M)
- if (M.icon_state == "flaming")
- src.health -= 2
- healthcheck()
- return
+/obj/structure/grille/attack_hand(var/mob/user)
+ playsound(src.loc, 'sound/effects/grillehit.ogg', 80, 1)
+ user.visible_message("[user.name] kicks the [src.name].", \
+ "You kick the [src.name].", \
+ "You hear a noise")
+ if((HULK in usr.mutations) || (SUPRSTR in usr.augmentations))
+ src.health -= 5
+ else if(!shock(user, 70))
+ src.health -= 3
+ healthcheck()
+ return
- attack_hand(var/mob/user)
- playsound(src.loc, 'sound/effects/grillehit.ogg', 80, 1)
- user.visible_message("[user.name] kicks the [src.name].", \
- "You kick the [src.name].", \
- "You hear a noise")
- if((HULK in usr.mutations) || (SUPRSTR in usr.augmentations))
- src.health -= 5
- else if(!shock(user, 70))
- src.health -= 3
+/obj/structure/grille/attack_paw(var/mob/user)
+ attack_hand(user)
+
+
+/obj/structure/grille/attack_alien(var/mob/user)
+ if (istype(usr, /mob/living/carbon/alien/larva)) return
+ playsound(src.loc, 'sound/effects/grillehit.ogg', 80, 1)
+ user.visible_message("[user.name] mangles the [src.name].", \
+ "You mangle the [src.name].", \
+ "You hear a noise")
+ if(!shock(usr, 70))
+ src.health -= 5
healthcheck()
return
+/obj/structure/grille/attack_metroid(var/mob/user)
+ if(!istype(usr, /mob/living/carbon/metroid/adult)) return
+ playsound(src.loc, 'sound/effects/grillehit.ogg', 80, 1)
+ user.visible_message("[user.name] smashes against the [src.name].", \
+ "You smash against the [src.name].", \
+ "You hear a noise")
+ src.health -= rand(2,3)
+ healthcheck()
+ return
- attack_paw(var/mob/user)
- attack_hand(user)
+/obj/structure/grille/attack_animal(var/mob/living/simple_animal/M as mob)
+ if(M.melee_damage_upper == 0) return
+ playsound(src.loc, 'sound/effects/grillehit.ogg', 80, 1)
+ M.visible_message("[M.name] smashes against the [src.name].", \
+ "You smash against the [src.name].", \
+ "You hear a noise")
+ src.health -= M.melee_damage_upper
+ healthcheck()
+ return
-
- attack_alien(var/mob/user)
- if (istype(usr, /mob/living/carbon/alien/larva)) return
- playsound(src.loc, 'sound/effects/grillehit.ogg', 80, 1)
- user.visible_message("[user.name] mangles the [src.name].", \
- "You mangle the [src.name].", \
- "You hear a noise")
- if(!shock(usr, 70))
- src.health -= 5
- healthcheck()
- return
-
- attack_metroid(var/mob/user)
- if(!istype(usr, /mob/living/carbon/metroid/adult)) return
- playsound(src.loc, 'sound/effects/grillehit.ogg', 80, 1)
- user.visible_message("[user.name] smashes against the [src.name].", \
- "You smash against the [src.name].", \
- "You hear a noise")
- src.health -= rand(2,3)
- healthcheck()
- return
-
- attack_animal(var/mob/living/simple_animal/M as mob)
- if(M.melee_damage_upper == 0) return
- playsound(src.loc, 'sound/effects/grillehit.ogg', 80, 1)
- M.visible_message("[M.name] smashes against the [src.name].", \
- "You smash against the [src.name].", \
- "You hear a noise")
- src.health -= M.melee_damage_upper
- healthcheck()
- return
-
- CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
- if(air_group || (height==0)) return 1
- if(istype(mover) && mover.checkpass(PASSGRILLE))
- return 1
+/obj/structure/grille/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
+ if(air_group || (height==0)) return 1
+ if(istype(mover) && mover.checkpass(PASSGRILLE))
+ return 1
+ else
+ if (istype(mover, /obj/item/projectile))
+ return prob(30)
else
- if (istype(mover, /obj/item/projectile))
- return prob(30)
+ return !src.density
+
+
+/obj/structure/grille/attackby(obj/item/weapon/W, mob/user)
+ if(iswirecutter(W))
+ if(!shock(user, 100))
+ playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1)
+ src.health = 0
+ if(!destroyed)
+ src.health = -100
+ else if ((isscrewdriver(W)) && (istype(src.loc, /turf/simulated) || src.anchored))
+ if(!shock(user, 90))
+ playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1)
+ src.anchored = !( src.anchored )
+ user << (src.anchored ? "You have fastened the grille to the floor." : "You have unfastened the grill.")
+ for(var/mob/O in oviewers())
+ O << text("\red [user] [src.anchored ? "fastens" : "unfastens"] the grille.")
+ return
+ else if( istype(W,/obj/item/stack/sheet/rglass) || istype(W,/obj/item/stack/sheet/glass) )
+ var/dir_to_set = 1
+ if(src.loc == usr.loc)
+ dir_to_set = usr.dir
+ else
+ if( ( src.x == usr.x ) || (src.y == usr.y) ) //Only supposed to work for cardinal directions.
+ if( src.x == usr.x )
+ if( src.y > usr.y )
+ dir_to_set = 2
+ else
+ dir_to_set = 1
+ else if( src.y == usr.y )
+ if( src.x > usr.x )
+ dir_to_set = 8
+ else
+ dir_to_set = 4
else
- return !src.density
-
-
- attackby(obj/item/weapon/W, mob/user)
- if(iswirecutter(W))
- if(!shock(user, 100))
- playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1)
- src.health = 0
- if(!destroyed)
- src.health = -100
- else if ((isscrewdriver(W)) && (istype(src.loc, /turf/simulated) || src.anchored))
- if(!shock(user, 90))
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1)
- src.anchored = !( src.anchored )
- user << (src.anchored ? "You have fastened the grille to the floor." : "You have unfastened the grill.")
- for(var/mob/O in oviewers())
- O << text("\red [user] [src.anchored ? "fastens" : "unfastens"] the grille.")
+ usr << "\red You can't reach there.."
+ return //Only works for cardinal direcitons, diagonals aren't supposed to work like this.
+ for(var/obj/structure/window/WINDOW in src.loc)
+ if(WINDOW.dir == dir_to_set)
+ usr << "\red There is already a window facing this way there."
return
- else if( istype(W,/obj/item/stack/sheet/rglass) || istype(W,/obj/item/stack/sheet/glass) )
- var/dir_to_set = 1
- if(src.loc == usr.loc)
- dir_to_set = usr.dir
- else
- if( ( src.x == usr.x ) || (src.y == usr.y) ) //Only supposed to work for cardinal directions.
- if( src.x == usr.x )
- if( src.y > usr.y )
- dir_to_set = 2
- else
- dir_to_set = 1
- else if( src.y == usr.y )
- if( src.x > usr.x )
- dir_to_set = 8
- else
- dir_to_set = 4
- else
- usr << "\red You can't reach there.."
- return //Only works for cardinal direcitons, diagonals aren't supposed to work like this.
+ usr << "\blue You start placing the window"
+ if(do_after(user,20))
+ if(!src) return //Grille destroyed while waiting
for(var/obj/structure/window/WINDOW in src.loc)
- if(WINDOW.dir == dir_to_set)
+ if(WINDOW.dir == dir_to_set)//checking this for a 2nd time to check if a window was made while we were waiting.
usr << "\red There is already a window facing this way there."
return
- usr << "\blue You start placing the window"
- if(do_after(user,20))
- if(!src) return //Grille destroyed while waiting
- for(var/obj/structure/window/WINDOW in src.loc)
- if(WINDOW.dir == dir_to_set)//checking this for a 2nd time to check if a window was made while we were waiting.
- usr << "\red There is already a window facing this way there."
- return
- var/obj/structure/window/WD
- if(istype(W,/obj/item/stack/sheet/rglass))
- WD = new/obj/structure/window(src.loc,1) //reinforced window
- else
- WD = new/obj/structure/window(src.loc,0) //normal window
- WD.dir = dir_to_set
- WD.ini_dir = dir_to_set
- WD.anchored = 0
- WD.state = 0
- var/obj/item/stack/ST = W
- ST.use(1)
- usr << "\blue You place the [WD] on the [src]"
- return
- else if(istype(W, /obj/item/weapon/shard))
- src.health -= W.force * 0.1
- else if(!shock(user, 70))
- playsound(src.loc, 'sound/effects/grillehit.ogg', 80, 1)
- switch(W.damtype)
- if("fire")
- src.health -= W.force
- if("brute")
- src.health -= W.force * 0.1
- src.healthcheck()
- ..()
- return
-
-
- proc/healthcheck()
- if (src.health <= 0)
- if (!( src.destroyed ))
- src.icon_state = "brokengrille"
- src.density = 0
- src.destroyed = 1
- new /obj/item/stack/rods( src.loc )
-
+ var/obj/structure/window/WD
+ if(istype(W,/obj/item/stack/sheet/rglass))
+ WD = new/obj/structure/window(src.loc,1) //reinforced window
else
- if (src.health <= -10.0)
- new /obj/item/stack/rods( src.loc )
- //SN src = null
- del(src)
- return
+ WD = new/obj/structure/window(src.loc,0) //normal window
+ WD.dir = dir_to_set
+ WD.ini_dir = dir_to_set
+ WD.anchored = 0
+ WD.state = 0
+ var/obj/item/stack/ST = W
+ ST.use(1)
+ usr << "\blue You place the [WD] on the [src]"
return
+ else if(istype(W, /obj/item/weapon/shard))
+ src.health -= W.force * 0.1
+ else if(!shock(user, 70))
+ playsound(src.loc, 'sound/effects/grillehit.ogg', 80, 1)
+ switch(W.damtype)
+ if("fire")
+ src.health -= W.force
+ if("brute")
+ src.health -= W.force * 0.1
+ src.healthcheck()
+ ..()
+ return
+
+
+/obj/structure/grille/proc/healthcheck()
+ if (src.health <= 0)
+ if (!( src.destroyed ))
+ src.icon_state = "brokengrille"
+ src.density = 0
+ src.destroyed = 1
+ new /obj/item/stack/rods( src.loc )
+
+ else
+ if (src.health <= -10.0)
+ new /obj/item/stack/rods( src.loc )
+ //SN src = null
+ del(src)
+ return
+ return
// shock user with probability prb (if all connections & power are working)
// returns 1 if shocked, 0 otherwise
- proc/shock(mob/user, prb)
- if(!anchored || destroyed) // anchored/destroyed grilles are never connected
- return 0
- if(!prob(prb))
- return 0
- if(!in_range(src, usr))//To prevent TK and mech users from getting shocked
- return 0
- var/turf/T = get_turf(src)
- var/obj/structure/cable/C = T.get_cable_node()
- if(C)
- if (electrocute_mob(user, C, src))
- var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
- s.set_up(5, 1, src)
- s.start()
- return 1
- else
- return 0
+/obj/structure/grille/proc/shock(mob/user, prb)
+ if(!anchored || destroyed) // anchored/destroyed grilles are never connected
return 0
+ if(!prob(prb))
+ return 0
+ if(!in_range(src, usr))//To prevent TK and mech users from getting shocked
+ return 0
+ var/turf/T = get_turf(src)
+ var/obj/structure/cable/C = T.get_cable_node()
+ if(C)
+ if (electrocute_mob(user, C, src))
+ var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
+ s.set_up(5, 1, src)
+ s.start()
+ return 1
+ else
+ return 0
+ return 0
+
+/obj/structure/grille/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
+ if(!destroyed)
+ if(exposed_temperature > T0C + 1500)
+ src.health -= 1
+ healthcheck()
+ ..()
\ No newline at end of file
diff --git a/code/game/objects/structures/safe.dm b/code/game/objects/structures/safe.dm
new file mode 100644
index 00000000000..a79eddfdf7d
--- /dev/null
+++ b/code/game/objects/structures/safe.dm
@@ -0,0 +1,190 @@
+/*
+CONTAINS:
+SAFES
+FLOOR SAFES
+*/
+
+//SAFES
+/obj/structure/safe
+ name = "safe"
+ desc = "A huge chunk of metal with a dial embedded in it. Fine print on the dial reads \"Scarborough Arms - 2 tumbler safe, guaranteed thermite resistant, explosion resistant, and assistant resistant.\""
+ icon = 'icons/obj/structures.dmi'
+ icon_state = "safe"
+ anchored = 1
+ density = 1
+ var/open = 0 //is the safe open?
+ var/tumbler_1_pos //the tumbler position- from 0 to 72
+ var/tumbler_1_open //the tumbler position to open at- 0 to 72
+ var/tumbler_2_pos
+ var/tumbler_2_open
+ var/dial = 0 //where is the dial pointing?
+ var/space = 0 //the combined w_class of everything in the safe
+ var/maxspace = 24 //the maximum combined w_class of stuff in the safe
+
+
+/obj/structure/safe/New()
+ tumbler_1_pos = rand(0, 72)
+ tumbler_1_open = rand(0, 72)
+
+ tumbler_2_pos = rand(0, 72)
+ tumbler_2_open = rand(0, 72)
+
+
+/obj/structure/safe/initialize()
+ for(var/obj/item/I in loc)
+ if(space >= maxspace)
+ return
+ if(I.w_class + space <= maxspace)
+ space += I.w_class
+ I.loc = src
+
+
+/obj/structure/safe/proc/check_unlocked(mob/user as mob, canhear)
+ if(user && canhear)
+ if(tumbler_1_pos == tumbler_1_open)
+ user << "You hear a [pick("tonk", "krunk", "plunk")] from [src]."
+ if(tumbler_2_pos == tumbler_2_open)
+ user << "You hear a [pick("tink", "krink", "plink")] from [src]."
+ if(tumbler_1_pos == tumbler_1_open && tumbler_2_pos == tumbler_2_open)
+ if(user) visible_message("[pick("Spring", "Sprang", "Sproing", "Clunk", "Krunk")]!")
+ return 1
+ return 0
+
+
+/obj/structure/safe/proc/decrement(num)
+ num -= 1
+ if(num < 0)
+ num = 71
+ return num
+
+
+/obj/structure/safe/proc/increment(num)
+ num += 1
+ if(num > 71)
+ num = 0
+ return num
+
+
+/obj/structure/safe/update_icon()
+ if(open)
+ icon_state = "[initial(icon_state)]-open"
+ else
+ icon_state = initial(icon_state)
+
+
+/obj/structure/safe/attack_hand(mob/user as mob)
+ user.machine = src
+ var/dat = ""
+ dat += "[open ? "Close" : "Open"] [src] | - [dial * 5] +"
+ if(open)
+ dat += ""
+ for(var/i = contents.len, i>=1, i--)
+ var/obj/item/P = contents[i]
+ dat += "| [P.name] |
"
+ dat += "
"
+ user << browse("[name][dat]", "window=safe;size=350x300")
+
+
+/obj/structure/safe/Topic(href, href_list)
+ if(!ishuman(usr)) return
+ var/mob/living/carbon/human/user = usr
+
+ var/canhear = 0
+ if(istype(user.l_hand, /obj/item/clothing/tie/stethoscope) || istype(user.r_hand, /obj/item/clothing/tie/stethoscope))
+ canhear = 1
+
+ if(href_list["open"])
+ if(check_unlocked())
+ user << "You [open ? "close" : "open"] [src]."
+ open = !open
+ update_icon()
+ updateUsrDialog()
+ return
+ else
+ user << "You can't [open ? "close" : "open"] [src], the lock is engaged!"
+ return
+
+ if(href_list["decrement"])
+ dial = decrement(dial)
+ if(dial == tumbler_1_pos + 1 || dial == tumbler_1_pos - 71)
+ tumbler_1_pos = decrement(tumbler_1_pos)
+ if(canhear)
+ user << "You hear a [pick("clack", "scrape", "clank")] from [src]."
+ if(tumbler_1_pos == tumbler_2_pos + 37 || tumbler_1_pos == tumbler_2_pos - 35)
+ tumbler_2_pos = decrement(tumbler_2_pos)
+ if(canhear)
+ user << "You hear a [pick("click", "chink", "clink")] from [src]."
+ check_unlocked(user, canhear)
+ updateUsrDialog()
+ return
+
+ if(href_list["increment"])
+ dial = increment(dial)
+ if(dial == tumbler_1_pos - 1 || dial == tumbler_1_pos + 71)
+ tumbler_1_pos = increment(tumbler_1_pos)
+ if(canhear)
+ user << "You hear a [pick("clack", "scrape", "clank")] from [src]."
+ if(tumbler_1_pos == tumbler_2_pos - 37 || tumbler_1_pos == tumbler_2_pos + 35)
+ tumbler_2_pos = increment(tumbler_2_pos)
+ if(canhear)
+ user << "You hear a [pick("click", "chink", "clink")] from [src]."
+ check_unlocked(user, canhear)
+ updateUsrDialog()
+ return
+
+ if(href_list["retrieve"])
+ user << browse("", "window=safe") // Close the menu
+
+ var/obj/item/P = locate(href_list["retrieve"])
+ if(P && in_range(src, user))
+ user.put_in_hands(P)
+ updateUsrDialog()
+
+
+/obj/structure/safe/attackby(obj/item/I as obj, mob/user as mob)
+ if(open)
+ if(I.w_class + space <= maxspace)
+ space += I.w_class
+ user.drop_item()
+ I.loc = src
+ user << "You put [I] in [src]."
+ updateUsrDialog()
+ return
+ else
+ user << "[I] won't fit in [src]."
+ return
+ else
+ if(istype(I, /obj/item/clothing/tie/stethoscope))
+ user << "Hold [I] in one of your hands while you manipulate the dial."
+ return
+
+
+obj/structure/safe/blob_act()
+ return
+
+
+obj/structure/safe/ex_act(severity)
+ return
+
+
+obj/structure/safe/meteorhit(obj/O as obj)
+ return
+
+
+//FLOOR SAFES
+/obj/structure/safe/floor
+ name = "floor safe"
+ icon_state = "floorsafe"
+ density = 0
+ level = 1 //underfloor
+ layer = 2.5
+
+
+/obj/structure/safe/floor/initialize()
+ ..()
+ var/turf/T = loc
+ hide(T.intact)
+
+
+/obj/structure/safe/floor/hide(var/intact)
+ invisibility = intact ? 101 : 0
\ No newline at end of file
diff --git a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm
index 972bb244221..447913d225b 100644
--- a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm
+++ b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm
@@ -49,6 +49,11 @@
set category = "Object"
set src in oview(1)
+ if(!usr || !isturf(usr.loc))
+ return
+ if(usr.stat || usr.restrained())
+ return
+
src.dir = turn(src.dir, 90)
handle_rotation()
return
diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm
index 48fc036f0d5..97b708a458d 100644
--- a/code/game/objects/structures/tables_racks.dm
+++ b/code/game/objects/structures/tables_racks.dm
@@ -243,9 +243,7 @@
/obj/structure/table/attack_paw(mob/user as mob)
if ((HULK in usr.mutations))
usr << "\blue You destroy the table."
- for(var/mob/O in oviewers())
- if ((O.client && !( O.blinded )))
- O << "\red [user] smashes the table apart!"
+ visible_message("\red [user] smashes the table apart!")
if(istype(src, /obj/structure/table/reinforced))
new /obj/item/weapon/table_parts/reinforced( src.loc )
else if(istype(src, /obj/structure/table/woodentable))
@@ -258,18 +256,14 @@
step(user, get_dir(user, src))
if (user.loc == src.loc)
user.layer = TURF_LAYER
- for(var/mob/O in oviewers())
- if ((O.client && !( O.blinded )))
- O << "[user] hides under the table!"
+ visible_message("[user] hides under the table!")
//Foreach goto(69)
return
/obj/structure/table/attack_alien(mob/user as mob) //Removed code for larva since it doesn't work. Previous code is now a larva ability. /N
usr << "\green You destroy the table."
- for(var/mob/O in oviewers())
- if ((O.client && !( O.blinded )))
- O << "\red [user] slices the table apart!"
+ visible_message("\red [user] slices the table apart!")
if(istype(src, /obj/structure/table/reinforced))
new /obj/item/weapon/table_parts/reinforced( src.loc )
else if(istype(src, /obj/structure/table/woodentable))
@@ -281,12 +275,10 @@
return
-/obj/structure/table/attack_animal(mob/living/simple_animal/user as mob) //Removed code for larva since it doesn't work. Previous code is now a larva ability. /N
+/obj/structure/table/attack_animal(mob/living/simple_animal/user as mob)
if(user.wall_smash)
usr << "\red You destroy the table."
- for(var/mob/O in oviewers())
- if ((O.client && !( O.blinded )))
- O << "\red [user] smashes the table apart!"
+ visible_message("\red [user] smahes the table apart!")
if(istype(src, /obj/structure/table/reinforced))
new /obj/item/weapon/table_parts/reinforced( src.loc )
else if(istype(src, /obj/structure/table/woodentable))
@@ -303,9 +295,7 @@
/obj/structure/table/attack_hand(mob/user as mob)
if ((HULK in usr.mutations) || (SUPRSTR in usr.augmentations))
usr << "\blue You destroy the table."
- for(var/mob/O in oviewers())
- if ((O.client && !( O.blinded )))
- O << "\red [user] smashes the table apart!"
+ visible_message("\red [user] smahes the table apart!")
if(istype(src, /obj/structure/table/reinforced))
new /obj/item/weapon/table_parts/reinforced( src.loc )
else if(istype(src, /obj/structure/table/woodentable))
@@ -346,9 +336,7 @@
return
G.affecting.loc = src.loc
G.affecting.Weaken(5)
- for(var/mob/O in viewers(world.view, src))
- if (O.client)
- O << "\red [G.assailant] puts [G.affecting] on the table."
+ visible_message("\red [G.assailant] puts [G.affecting] on the table.")
del(W)
return
@@ -400,9 +388,7 @@
return
G.affecting.loc = src.loc
G.affecting.Weaken(5)
- for(var/mob/O in viewers(world.view, src))
- if (O.client)
- O << "\red [G.assailant] puts [G.affecting] on the wooden table."
+ visible_message("\red [G.assailant] puts [G.affecting] on the table.")
del(W)
return
if (istype(W, /obj/item/weapon/wrench))
@@ -451,9 +437,7 @@
return
G.affecting.loc = src.loc
G.affecting.Weaken(5)
- for(var/mob/O in viewers(world.view, src))
- if (O.client)
- O << "\red [G.assailant] puts [G.affecting] on the reinforced table."
+ visible_message("\red [G.assailant] puts [G.affecting] on the table.")
del(W)
return
diff --git a/code/game/objects/structures/tank_dispenser.dm b/code/game/objects/structures/tank_dispenser.dm
new file mode 100644
index 00000000000..af584e2ac74
--- /dev/null
+++ b/code/game/objects/structures/tank_dispenser.dm
@@ -0,0 +1,101 @@
+/obj/structure/dispenser
+ name = "tank storage unit"
+ desc = "A simple yet bulky storage device for gas tanks. Has room for up to ten oxygen tanks, and ten plasma tanks."
+ icon = 'icons/obj/objects.dmi'
+ icon_state = "dispenser"
+ density = 1
+ anchored = 1.0
+ var/oxygentanks = 10
+ var/plasmatanks = 10
+ var/list/oxytanks = list() //sorry for the similar var names
+ var/list/platanks = list()
+
+
+/obj/structure/dispenser/oxygen
+ plasmatanks = 0
+
+/obj/structure/dispenser/plasma
+ oxygentanks = 0
+
+
+/obj/structure/dispenser/New()
+ update_icon()
+
+
+/obj/structure/dispenser/update_icon()
+ overlays = null
+ switch(oxygentanks)
+ if(1 to 3) overlays += "oxygen-[oxygentanks]"
+ if(4 to INFINITY) overlays += "oxygen-4"
+ switch(plasmatanks)
+ if(1 to 4) overlays += "plasma-[plasmatanks]"
+ if(5 to INFINITY) overlays += "plasma-5"
+
+
+/obj/structure/dispenser/attack_hand(mob/user as mob)
+ user.machine = src
+ var/dat = "[src]
"
+ dat += "Oxygen tanks: [oxygentanks] - [oxygentanks ? "Dispense" : "empty"]
"
+ dat += "Plasma tanks: [plasmatanks] - [plasmatanks ? "Dispense" : "empty"]"
+ user << browse(dat, "window=dispenser")
+ onclose(user, "dispenser")
+ return
+
+
+/obj/structure/dispenser/attackby(obj/item/I as obj, mob/user as mob)
+ if(istype(I, /obj/item/weapon/tank/oxygen) || istype(I, /obj/item/weapon/tank/air) || istype(I, /obj/item/weapon/tank/anesthetic))
+ if(oxygentanks < 10)
+ user.drop_item()
+ I.loc = src
+ oxytanks.Add(I)
+ oxygentanks++
+ user << "You put [I] in [src]."
+ else
+ user << "[src] is full."
+ if(istype(I, /obj/item/weapon/tank/plasma))
+ if(plasmatanks < 10)
+ user.drop_item()
+ I.loc = src
+ platanks.Add(I)
+ plasmatanks++
+ user << "You put [I] in [src]."
+ else
+ user << "[src] is full."
+ updateUsrDialog()
+
+
+/obj/structure/dispenser/Topic(href, href_list)
+ if(usr.stat || usr.restrained())
+ return
+ if(get_dist(src, usr) <= 1)
+ usr.machine = src
+ if(href_list["oxygen"])
+ if(oxygentanks > 0)
+ var/obj/item/weapon/tank/oxygen/O
+ if(oxytanks.len == oxygentanks)
+ O = oxytanks[1]
+ oxytanks.Remove(O)
+ else
+ O = new /obj/item/weapon/tank/oxygen(loc)
+ O.loc = loc
+ usr << "You take [O] out of [src]."
+ oxygentanks--
+ update_icon()
+ if(href_list["plasma"])
+ if(plasmatanks > 0)
+ var/obj/item/weapon/tank/plasma/P
+ if(platanks.len == plasmatanks)
+ P = platanks[1]
+ platanks.Remove(P)
+ else
+ P = new /obj/item/weapon/tank/plasma(loc)
+ P.loc = loc
+ usr << "You take [P] out of [src]."
+ plasmatanks--
+ update_icon()
+ add_fingerprint(usr)
+ updateUsrDialog()
+ else
+ usr << browse(null, "window=dispenser")
+ return
+ return
\ No newline at end of file
diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm
index f31d7addfc9..ce11f1969d6 100644
--- a/code/game/objects/structures/window.dm
+++ b/code/game/objects/structures/window.dm
@@ -227,33 +227,38 @@
playsound(src.loc, 'sound/items/Crowbar.ogg', 75, 1)
user << (state ? "You have pried the window into the frame." : "You have pried the window out of the frame.")
else
-
- var/aforce = W.force
- if(reinf) aforce /= 2.0
if(W.damtype == BRUTE || W.damtype == BURN)
- src.health = max(0, src.health - aforce)
- playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1)
- if (src.health <= 7)
- src.anchored = 0
- update_nearby_icons()
- step(src, get_dir(user, src))
- if (src.health <= 0)
- if (src.dir == SOUTHWEST)
- var/index = null
- index = 0
- while(index < 2)
- new /obj/item/weapon/shard( src.loc )
- if(reinf) new /obj/item/stack/rods( src.loc)
- index++
- else
- new /obj/item/weapon/shard( src.loc )
- if(reinf) new /obj/item/stack/rods( src.loc)
- src.density = 0
- del(src)
- return
+ hit(W.force)
+ if (src.health <= 7)
+ src.anchored = 0
+ update_nearby_icons()
+ step(src, get_dir(user, src))
+ else
+ playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1)
..()
return
+/obj/structure/window/proc/hit(var/damage, var/sound_effect = 1)
+
+ if(reinf) damage /= 2.0
+ src.health = max(0, src.health - damage)
+ if(sound_effect)
+ playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1)
+ if (src.health <= 0)
+ if (src.dir == SOUTHWEST)
+ var/index = null
+ index = 0
+ while(index < 2)
+ new /obj/item/weapon/shard( src.loc )
+ if(reinf) new /obj/item/stack/rods( src.loc)
+ index++
+ else
+ new /obj/item/weapon/shard( src.loc )
+ if(reinf) new /obj/item/stack/rods( src.loc)
+ src.density = 0
+ del(src)
+ return
+
/obj/structure/window/verb/rotate()
set name = "Rotate Window Counter-Clockwise"
@@ -409,6 +414,11 @@
return
+/obj/structure/window/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
+ if(exposed_temperature > T0C + 800)
+ hit(round(exposed_volume / 100), 0)
+ ..()
+
/obj/structure/window/basic
diff --git a/code/game/sound.dm b/code/game/sound.dm
index 76221779c0b..35d80594ac8 100644
--- a/code/game/sound.dm
+++ b/code/game/sound.dm
@@ -78,12 +78,14 @@
client/verb/Toggle_Soundscape() //All new ambience should be added here so it works with this verb until someone better at things comes up with a fix that isn't awful
set category = "Special Verbs"
set name = "Toggle Ambience"
+
usr:client:no_ambi = !usr:client:no_ambi
+
if(usr:client:no_ambi)
- usr << sound(pick('sound/ambience/shipambience.ogg','sound/ambience/ambigen1.ogg','sound/ambience/ambigen3.ogg','sound/ambience/ambigen4.ogg','sound/ambience/ambigen5.ogg','sound/ambience/ambigen6.ogg','sound/ambience/ambigen7.ogg','sound/ambience/ambigen8.ogg','sound/ambience/ambigen9.ogg','sound/ambience/ambigen10.ogg','sound/ambience/ambigen11.ogg','sound/ambience/ambigen12.ogg','sound/ambience/ambigen14.ogg','sound/ambience/ambicha1.ogg','sound/ambience/ambicha2.ogg','sound/ambience/ambicha3.ogg','sound/ambience/ambicha4.ogg','sound/ambience/ambimalf.ogg','sound/ambience/ambispace.ogg','sound/ambience/ambimine.ogg','sound/music/title2.ogg'), repeat = 0, wait = 0, volume = 0, channel = 2)
- else
- usr << sound(pick('sound/ambience/shipambience.ogg','sound/ambience/ambigen1.ogg','sound/ambience/ambigen3.ogg','sound/ambience/ambigen4.ogg','sound/ambience/ambigen5.ogg','sound/ambience/ambigen6.ogg','sound/ambience/ambigen7.ogg','sound/ambience/ambigen8.ogg','sound/ambience/ambigen9.ogg','sound/ambience/ambigen10.ogg','sound/ambience/ambigen11.ogg','sound/ambience/ambigen12.ogg','sound/ambience/ambigen14.ogg','sound/ambience/ambicha1.ogg','sound/ambience/ambicha2.ogg','sound/ambience/ambicha3.ogg','sound/ambience/ambicha4.ogg','sound/ambience/ambimalf.ogg','sound/ambience/ambispace.ogg','sound/ambience/ambimine.ogg','sound/music/title2.ogg'), repeat = 1, wait = 0, volume = 35, channel = 2)
- usr << "Toggled ambience sound."
+ usr << sound(null, repeat = 0, wait = 0, volume = 0, channel = 1)
+ usr << sound(null, repeat = 0, wait = 0, volume = 0, channel = 2)
+
+ usr << "Toggled ambient sound [usr:client:no_ambi?"off":"on"]."
return
diff --git a/code/game/verbs/who.dm b/code/game/verbs/who.dm
index c3b9e40c66d..fb5fa7fac0b 100644
--- a/code/game/verbs/who.dm
+++ b/code/game/verbs/who.dm
@@ -27,7 +27,7 @@ proc/get_all_admin_clients()
for (var/client/C in client_list)
var/entry = "\t"
- if(usr.client.holder)
+ if(usr.client.holder && usr.client.holder.level >= 0) //Everything above admin-observers get this.
entry += "[C.key]"
if(C.holder && C.holder.fakekey)
entry += " (as [C.holder.fakekey])"
diff --git a/code/game/vote.dm b/code/game/vote.dm
deleted file mode 100644
index f0e80082448..00000000000
--- a/code/game/vote.dm
+++ /dev/null
@@ -1,436 +0,0 @@
-/datum/vote/New()
-
- nextvotetime = world.timeofday // + 10*config.vote_delay
-
-
-/datum/vote/proc/canvote()//marker1
- var/excess = world.timeofday - vote.nextvotetime
-
- if(excess < -10000) // handle clock-wrapping problems - very long delay (>20 hrs) if wrapped
- vote.nextvotetime = world.timeofday
- return 1
- return (excess >= 0)
-
-/datum/vote/proc/nextwait()
- return timetext( round( (nextvotetime - world.timeofday)/10) )
-
-/datum/vote/proc/endwait()
- return timetext( round( (votetime - world.timeofday)/10) )
-
-/datum/vote/proc/timetext(var/interval)
- var/minutes = round(interval / 60)
- var/seconds = round(interval % 60)
-
- var/tmin = "[minutes>0?num2text(minutes)+"min":null]"
- var/tsec = "[seconds>0?num2text(seconds)+"sec":null]"
-
- if(tmin && tsec) // hack to skip inter-space if either field is blank
- return "[tmin] [tsec]"
- else
- if(!tmin && !tsec) // return '0sec' if 0 time left
- return "0sec"
- return "[tmin][tsec]"
-
-/datum/vote/proc/getvotes()
- var/list/L = list()
- for(var/mob/M in player_list)
- if(M.client && M.client.inactivity < 1200) // clients inactive for 2 minutes don't count
- L[M.client.vote] += 1
-
- return L
-
-
-/datum/vote/proc/endvote()
-
- if(!voting) // means that voting was aborted by an admin
- return
-
- world << "\red ***Voting has closed."
-
- log_vote("Voting closed, result was [winner]")
- voting = 0
- nextvotetime = world.timeofday + 10*config.vote_delay
-
- for(var/mob/M in player_list) // clear vote window from all clients
- if(M.client)
- M << browse(null, "window=vote")
- M.client.showvote = 0
-
- calcwin()
-
- if(mode)
- if(!ticker)
- if(!going)
- world << "The game will start soon."
- going = 1
- var/wintext = capitalize(winner)
- if(winner=="default")
- world << "Result is \red No change."
- return
-
- // otherwise change mode
-
-
- world << "Result is change to \red [wintext]"
- world.save_mode(winner)
-
- if(ticker && ticker.mode)
- world <<"\red World will reboot in 10 seconds"
-
- feedback_set_details("end_error","mode vote - [winner]")
-
- if(blackbox)
- blackbox.save_all_data_to_sql()
-
- sleep(100)
- log_game("Rebooting due to mode vote")
- world.Reboot()
- else
- master_mode = winner
-
- else
-
- if(winner=="default")
- world << "Result is \red No restart."
- return
-
- world << "Result is \red Restart round."
-
- world <<"\red World will reboot in 5 seconds"
-
- feedback_set_details("end_error","restart vote")
-
- if(blackbox)
- blackbox.save_all_data_to_sql()
-
- sleep(50)
- log_game("Rebooting due to restart vote")
- world.Reboot()
- return
-
-
-/datum/vote/proc/calcwin()
-
- var/list/votes = getvotes()
-
- if(vote.mode)
- var/best = -1
-
- for(var/v in votes)
- if(v=="none")
- continue
- if(best < votes[v])
- best = votes[v]
-
-
- var/list/winners = list()
-
- for(var/v in votes)
- if(votes[v] == best)
- winners += v
-
- var/ret = ""
-
-
- for(var/w in winners)
- if(lentext(ret) > 0)
- ret += "/"
- if(w=="default")
- winners = list("default")
- ret = "No change"
- break
- else
- ret += capitalize(w)
-
-
-
- if(winners.len != 1)
- ret = "Tie: " + ret
-
-
- if(winners.len == 0)
- vote.winner = "default"
- ret = "No change"
- else
- vote.winner = pick(winners)
-
- return ret
- else
-
- if(votes["default"] < votes["restart"])
-
- vote.winner = "restart"
- return "Restart"
- else
- vote.winner = "default"
- return "No restart"
-
-
-/mob/verb/vote()
- set category = "OOC"
- set name = "Vote"
- usr.client.showvote = 1
-
-
- var/text = "Voting"
-
- var/footer = "
Close"
-
-
- if(config.vote_no_dead && usr.stat == 2)
- text += "Voting while dead has been disallowed."
- text += footer
- usr << browse(text, "window=vote")
- usr.client.showvote = 0
- usr.client.vote = "none"
- return
-
- if(vote.voting)
- // vote in progress, do the current
-
- text += "Vote to [vote.mode?"change mode":"restart round"] in progress.
"
- text += "[vote.endwait()] until voting is closed.
"
-
- var/list/votes = vote.getvotes()
-
- if(vote.mode) // true if changing mode
-
- text += "Current game mode is: [master_mode].
Select the mode to change to:"
-
- for(var/md in config.votable_modes)
- var/disp = capitalize(md)
- if(md=="default")
- disp = "No change"
-
- //world << "[md]|[disp]|[src.client.vote]|[votes[md]]"
-
- if(src.client.vote == md)
- text += "- [disp]"
- else
- text += "
- [disp]"
-
- text += "[votes[md]>0?" - [votes[md]] vote\s":null]
"
-
- text += "
"
-
- text +="Current winner: [vote.calcwin()]
"
-
- text += footer
-
- usr << browse(text, "window=vote")
-
- else // voting to restart
- text += "Vote to call crew transfer shuttle round in progress.
"
- text += "[vote.endwait()] until voting is closed.
"
-
- if(vote.instant_restart)
- text += "Restart the world? ONLY PRESS THIS IF THERE'S A ROUND-BREAKING GLITCH.
"
- else
- text += "Call the Crew Transfer Shuttle?
"
-
- text += "*** Please make sure to only vote 'no' if you yourself are currently enjoying the round. If you find the round to have gone stale, you should always vote 'yes', regardless of how others are feeling about the round.
"
-
- var/list/VL = list("default","restart")
-
- for(var/md in VL)
- var/disp = (md=="default"? "No":"Yes")
-
- if(src.client.vote == md)
- text += "- [disp]"
- else
- text += "
- [disp]"
-
- text += "[votes[md]>0?" - [votes[md]] vote\s":null]
"
-
- text += "
"
-
- text +="Current winner: [vote.calcwin()]
"
-
- text += footer
-
- usr << browse(text, "window=vote")
-
-
- else //no vote in progress
-
- if(shuttlecoming == 1)
- usr << "\blue Cannot start Vote - Shuttle has been called."
- return
-
- if(!config.allow_vote_restart && !config.allow_vote_mode)
- text += "
Player voting is disabled.