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 917e6415716..9608e613e34 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"
@@ -494,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"
@@ -525,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"
@@ -590,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"
@@ -710,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"
@@ -734,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"
@@ -793,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"
@@ -871,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"
@@ -906,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"
@@ -1110,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"
@@ -1142,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"
@@ -1181,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"
@@ -1352,4 +1355,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/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/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 29beb26066a..ad7fd93e45e 100644
--- a/code/datums/disease.dm
+++ b/code/datums/disease.dm
@@ -43,12 +43,12 @@ 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()
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/mind.dm b/code/datums/mind.dm
index 595852b69fd..9a881b644ec 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -347,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
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 10f6facf010..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."
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 39e9fddb756..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)
@@ -215,7 +207,7 @@
// world << sound('sound/AI/outbreak7.ogg')
var/virus_type
if(!virus)
- virus_type = pick(/datum/disease/dnaspread,/datum/disease/flu,/datum/disease/cold,/datum/disease/brainrot,/datum/disease/magnitis)
+ virus_type = pick(/datum/disease/dnaspread,/datum/disease/flu,/datum/disease/cold,/datum/disease/brainrot,/datum/disease/magnitis,/datum/disease/pierrot_throat)
else
switch(virus)
if("fake gbs")
@@ -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/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/access.dm b/code/game/jobs/access.dm
index 42deb3b4818..58edea29c82 100644
--- a/code/game/jobs/access.dm
+++ b/code/game/jobs/access.dm
@@ -196,9 +196,9 @@
if("Captain")
return get_all_accesses()
if("Security Officer")
- return list(access_security, access_brig, access_court)
+ return list(access_security, access_brig, access_court,access_maint_tunnels) // Massively requested that sec get there maintenance access back //
if("Warden")
- return list(access_security, access_brig, access_armory, access_court)
+ return list(access_security, access_brig, access_armory, access_court,access_maint_tunnels)
if("Scientist")
return list(access_tox, access_tox_storage, access_research, access_xenobiology)
if("Head of Security")
@@ -229,7 +229,7 @@
if("Chef")
return list(access_kitchen, access_morgue)
if("Roboticist")
- return list(access_robotics, access_tech_storage, access_morgue) //As a job that handles so many corpses, it makes sense for them to have morgue access.
+ return list(access_robotics, access_tech_storage, access_morgue) //As a job that handles so many corpses, it makes sense for them to have morgue access.
if("Cargo Technician")
return list(access_maint_tunnels, access_cargo, access_cargo_bot, access_mailsorting)
if("Shaft Miner")
diff --git a/code/game/jobs/job/captain.dm b/code/game/jobs/job/captain.dm
index 4959200761f..3c81adadc97 100644
--- a/code/game/jobs/job/captain.dm
+++ b/code/game/jobs/job/captain.dm
@@ -22,6 +22,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/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 1e6fc13a975..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
@@ -313,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/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/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/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/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/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 c3144088e9f..eb5c3b2582c 100644
--- a/code/game/objects/items/devices/radio/radio.dm
+++ b/code/game/objects/items/devices/radio/radio.dm
@@ -216,8 +216,7 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
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/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/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/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/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 32f1bf697d6..425fd06558f 100644
--- a/code/game/objects/structures/grille.dm
+++ b/code/game/objects/structures/grille.dm
@@ -14,212 +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
- var/turf/T = get_turf(src)
- var/obj/structure/cable/C = T.get_cable_node()
- if(C)
- if (C.powernet.avail)
- 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 !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.