diff --git a/.travis.yml b/.travis.yml
index 855054fec4c..7ecca3d433a 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -5,7 +5,7 @@ sudo: false
env:
BYOND_MAJOR="508"
BYOND_MINOR="1293"
- MACRO_COUNT=1210
+ MACRO_COUNT=1174
cache:
directories:
diff --git a/baystation12.dme b/baystation12.dme
index 8e36e0b9ac8..fde26a40e27 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -129,7 +129,6 @@
#include "code\controllers\Processes\mob.dm"
#include "code\controllers\Processes\nanoui.dm"
#include "code\controllers\Processes\obj.dm"
-#include "code\controllers\Processes\pipenet.dm"
#include "code\controllers\Processes\Shuttle.dm"
#include "code\controllers\Processes\sun.dm"
#include "code\controllers\Processes\supply.dm"
@@ -388,7 +387,6 @@
#include "code\game\machinery\nuclear_bomb.dm"
#include "code\game\machinery\OpTable.dm"
#include "code\game\machinery\overview.dm"
-#include "code\game\machinery\portable_tag_turret.dm"
#include "code\game\machinery\portable_turret.dm"
#include "code\game\machinery\recharger.dm"
#include "code\game\machinery\rechargestation.dm"
@@ -842,6 +840,7 @@
#include "code\modules\admin\admin_investigate.dm"
#include "code\modules\admin\admin_memo.dm"
#include "code\modules\admin\admin_ranks.dm"
+#include "code\modules\admin\admin_secrets.dm"
#include "code\modules\admin\admin_verbs.dm"
#include "code\modules\admin\banjob.dm"
#include "code\modules\admin\create_mob.dm"
@@ -857,6 +856,43 @@
#include "code\modules\admin\ToRban.dm"
#include "code\modules\admin\DB ban\functions.dm"
#include "code\modules\admin\permissionverbs\permissionedit.dm"
+#include "code\modules\admin\secrets\admin_secrets\admin_logs.dm"
+#include "code\modules\admin\secrets\admin_secrets\alter_narsie.dm"
+#include "code\modules\admin\secrets\admin_secrets\bombing_list.dm"
+#include "code\modules\admin\secrets\admin_secrets\jump_shuttle.dm"
+#include "code\modules\admin\secrets\admin_secrets\launch_shuttle.dm"
+#include "code\modules\admin\secrets\admin_secrets\launch_shuttle_forced.dm"
+#include "code\modules\admin\secrets\admin_secrets\list_dna.dm"
+#include "code\modules\admin\secrets\admin_secrets\list_fingerprints.dm"
+#include "code\modules\admin\secrets\admin_secrets\move_shuttle.dm"
+#include "code\modules\admin\secrets\admin_secrets\prison_warp.dm"
+#include "code\modules\admin\secrets\admin_secrets\show_ai_laws.dm"
+#include "code\modules\admin\secrets\admin_secrets\show_crew_manifest.dm"
+#include "code\modules\admin\secrets\admin_secrets\show_game_mode.dm"
+#include "code\modules\admin\secrets\admin_secrets\show_law_changes.dm"
+#include "code\modules\admin\secrets\admin_secrets\show_signalers.dm"
+#include "code\modules\admin\secrets\admin_secrets\traitors_and_objectives.dm"
+#include "code\modules\admin\secrets\final_solutions\summon_narsie.dm"
+#include "code\modules\admin\secrets\final_solutions\supermatter_cascade.dm"
+#include "code\modules\admin\secrets\fun_secrets\break_all_lights.dm"
+#include "code\modules\admin\secrets\fun_secrets\break_some_lights.dm"
+#include "code\modules\admin\secrets\fun_secrets\fix_all_lights.dm"
+#include "code\modules\admin\secrets\fun_secrets\ghost_mode.dm"
+#include "code\modules\admin\secrets\fun_secrets\make_all_areas_powered.dm"
+#include "code\modules\admin\secrets\fun_secrets\make_all_areas_unpowered.dm"
+#include "code\modules\admin\secrets\fun_secrets\only_one.dm"
+#include "code\modules\admin\secrets\fun_secrets\paintball_mode.dm"
+#include "code\modules\admin\secrets\fun_secrets\power_all_smes.dm"
+#include "code\modules\admin\secrets\fun_secrets\remove_all_clothing.dm"
+#include "code\modules\admin\secrets\fun_secrets\remove_internal_clothing.dm"
+#include "code\modules\admin\secrets\fun_secrets\send_strike_team.dm"
+#include "code\modules\admin\secrets\fun_secrets\toggle_bomb_cap.dm"
+#include "code\modules\admin\secrets\fun_secrets\triple_ai_mode.dm"
+#include "code\modules\admin\secrets\fun_secrets\turn_humans_into_corgies.dm"
+#include "code\modules\admin\secrets\fun_secrets\turn_humans_into_monkeys.dm"
+#include "code\modules\admin\secrets\random_events\gravity.dm"
+#include "code\modules\admin\secrets\random_events\trigger_cordical_borer_infestation.dm"
+#include "code\modules\admin\secrets\random_events\trigger_xenomorph_infestation.dm"
#include "code\modules\admin\verbs\adminhelp.dm"
#include "code\modules\admin\verbs\adminjump.dm"
#include "code\modules\admin\verbs\adminpm.dm"
@@ -1281,6 +1317,7 @@
#include "code\modules\mob\living\silicon\silicon.dm"
#include "code\modules\mob\living\silicon\subystems.dm"
#include "code\modules\mob\living\silicon\ai\ai.dm"
+#include "code\modules\mob\living\silicon\ai\ai_movement.dm"
#include "code\modules\mob\living\silicon\ai\death.dm"
#include "code\modules\mob\living\silicon\ai\examine.dm"
#include "code\modules\mob\living\silicon\ai\icons.dm"
@@ -1319,6 +1356,7 @@
#include "code\modules\mob\living\silicon\robot\robot_items.dm"
#include "code\modules\mob\living\silicon\robot\robot_modules.dm"
#include "code\modules\mob\living\silicon\robot\robot_movement.dm"
+#include "code\modules\mob\living\silicon\robot\syndicate.dm"
#include "code\modules\mob\living\silicon\robot\drone\drone.dm"
#include "code\modules\mob\living\silicon\robot\drone\drone_abilities.dm"
#include "code\modules\mob\living\silicon\robot\drone\drone_console.dm"
@@ -1428,6 +1466,7 @@
#include "code\modules\paperwork\paper.dm"
#include "code\modules\paperwork\paper_bundle.dm"
#include "code\modules\paperwork\paperbin.dm"
+#include "code\modules\paperwork\papershredder.dm"
#include "code\modules\paperwork\pen.dm"
#include "code\modules\paperwork\photocopier.dm"
#include "code\modules\paperwork\photography.dm"
diff --git a/code/ZAS/Airflow.dm b/code/ZAS/Airflow.dm
index 7136175519c..20747361d33 100644
--- a/code/ZAS/Airflow.dm
+++ b/code/ZAS/Airflow.dm
@@ -126,7 +126,7 @@ obj/item/check_airflow_movable(n)
step_towards(src, src.airflow_dest)
var/mob/M = src
if(istype(M) && M.client)
- M.client.move_delay = world.time + vsc.airflow_mob_slowdown
+ M.setMoveCooldown(vsc.airflow_mob_slowdown)
airflow_dest = null
airflow_speed = 0
airflow_time = 0
diff --git a/code/__defines/items_clothing.dm b/code/__defines/items_clothing.dm
index b822c4badce..aa32b0016ec 100644
--- a/code/__defines/items_clothing.dm
+++ b/code/__defines/items_clothing.dm
@@ -24,15 +24,13 @@
// Flags bitmasks.
#define NOBLUDGEON 0x1 // When an item has this it produces no "X has been hit by Y with Z" message with the default handler.
-#define USEDELAY 0x2 // 1 second extra delay on use. (Can be used once every 2s)
-#define CONDUCT 0x4 // Conducts electricity. (metal etc.)
-#define ON_BORDER 0x8 // Item has priority to check when entering or leaving.
-#define NOBLOODY 0x10 // Used for items if they don't want to get a blood overlay.
-#define NODELAY 0x20 // 1 second attack-by delay skipped (Can be used once every 0.2s). Most objects have a 1s attack-by delay, which doesn't require a flag.
-#define OPENCONTAINER 0x40 // Is an open container for chemistry purposes.
-#define PHORONGUARD 0x80 // Does not get contaminated by phoron.
-#define NOREACT 0x100 // Reagents don't react inside this container.
-#define PROXMOVE 0x200 // Does this object require proximity checking in Enter()?
+#define CONDUCT 0x2 // Conducts electricity. (metal etc.)
+#define ON_BORDER 0x4 // Item has priority to check when entering or leaving.
+#define NOBLOODY 0x8 // Used for items if they don't want to get a blood overlay.
+#define OPENCONTAINER 0x10 // Is an open container for chemistry purposes.
+#define PHORONGUARD 0x20 // Does not get contaminated by phoron.
+#define NOREACT 0x40 // Reagents don't react inside this container.
+#define PROXMOVE 0x80 // Does this object require proximity checking in Enter()?
//Flags for items (equipment)
#define THICKMATERIAL 0x1 // Prevents syringes, parapens and hyposprays if equiped to slot_suit or slot_head.
diff --git a/code/__defines/mobs.dm b/code/__defines/mobs.dm
index b0858101d68..5bcab4704d4 100644
--- a/code/__defines/mobs.dm
+++ b/code/__defines/mobs.dm
@@ -61,8 +61,6 @@
#define HEAVY 64
#define ALLMOBS (HUMAN|MONKEY|ALIEN|ROBOT|SLIME|SIMPLE_ANIMAL|HEAVY)
-#define NEXT_MOVE_DELAY 8
-
// Robot AI notifications
#define ROBOT_NOTIFICATION_NEW_UNIT 1
#define ROBOT_NOTIFICATION_NEW_NAME 2
@@ -82,6 +80,9 @@
#define APPEARANCE_ALL_HAIR (APPEARANCE_HAIR|APPEARANCE_HAIR_COLOR|APPEARANCE_FACIAL_HAIR|APPEARANCE_FACIAL_HAIR_COLOR)
#define APPEARANCE_ALL 0xFFFF
+// Click cooldown
+#define DEFAULT_ATTACK_COOLDOWN 8 //Default timeout for aggressive actions
+
#define MIN_SUPPLIED_LAW_NUMBER 15
#define MAX_SUPPLIED_LAW_NUMBER 50
diff --git a/code/_helpers/global_lists.dm b/code/_helpers/global_lists.dm
index 7690e73e09b..9ffc08ca92f 100644
--- a/code/_helpers/global_lists.dm
+++ b/code/_helpers/global_lists.dm
@@ -64,6 +64,8 @@ var/global/list/rune_list = new()
var/global/list/escape_list = list()
var/global/list/endgame_exits = list()
var/global/list/endgame_safespawns = list()
+
+var/global/list/syndicate_access = list(access_maint_tunnels, access_syndicate, access_external_airlocks)
//////////////////////////
/////Initial Building/////
//////////////////////////
diff --git a/code/_helpers/lists.dm b/code/_helpers/lists.dm
index c3a99bcf82a..8a8d13de6be 100644
--- a/code/_helpers/lists.dm
+++ b/code/_helpers/lists.dm
@@ -592,7 +592,7 @@ proc/dd_sortedTextList(list/incoming)
return dd_sortedtextlist(incoming, case_sensitive)
-datum/proc/dd_SortValue()
+/datum/proc/dd_SortValue()
return "[src]"
/obj/machinery/dd_SortValue()
diff --git a/code/_helpers/names.dm b/code/_helpers/names.dm
index 0b26e51ac45..2dbcc60030b 100644
--- a/code/_helpers/names.dm
+++ b/code/_helpers/names.dm
@@ -20,7 +20,7 @@ var/command_name = null
if (command_name)
return command_name
- var/name = "Central Command"
+ var/name = "[boss_name]"
command_name = name
return name
diff --git a/code/_helpers/unsorted.dm b/code/_helpers/unsorted.dm
index dece128cbfb..366fcbbbc10 100644
--- a/code/_helpers/unsorted.dm
+++ b/code/_helpers/unsorted.dm
@@ -565,10 +565,13 @@ proc/GaussRandRound(var/sigma,var/roundto)
return toReturn
//Step-towards method of determining whether one atom can see another. Similar to viewers()
-/proc/can_see(var/atom/source, var/atom/target, var/length=5) // I couldnt be arsed to do actual raycasting :I This is horribly inaccurate.
+/proc/can_see(var/atom/source, var/atom/target, var/length=5) // I couldn't be arsed to do actual raycasting :I This is horribly inaccurate.
var/turf/current = get_turf(source)
var/turf/target_turf = get_turf(target)
var/steps = 0
+
+ if(!current || !target_turf)
+ return 0
while(current != target_turf)
if(steps > length) return 0
diff --git a/code/_onclick/ai.dm b/code/_onclick/ai.dm
index e05cbeb9ba2..dfb6de5e911 100644
--- a/code/_onclick/ai.dm
+++ b/code/_onclick/ai.dm
@@ -15,7 +15,6 @@
return
if(control_disabled || stat) return
- next_move = world.time + 9
if(ismob(A))
ai_actual_track(A)
@@ -32,7 +31,7 @@
build_click(src, client.buildmode, params, A)
return
- if(control_disabled || stat)
+ if(stat)
return
var/list/modifiers = params2list(params)
@@ -52,9 +51,8 @@
CtrlClickOn(A)
return
- if(world.time <= next_move)
+ if(control_disabled || !canClick())
return
- next_move = world.time + 9
if(aiCamera.in_camera_mode)
aiCamera.camera_mode_off()
@@ -91,13 +89,24 @@
*/
/mob/living/silicon/ai/ShiftClickOn(var/atom/A)
- A.AIShiftClick(src)
+ if(!control_disabled && A.AIShiftClick(src))
+ return
+ ..()
+
/mob/living/silicon/ai/CtrlClickOn(var/atom/A)
- A.AICtrlClick(src)
+ if(!control_disabled && A.AICtrlClick(src))
+ return
+ ..()
+
/mob/living/silicon/ai/AltClickOn(var/atom/A)
- A.AIAltClick(src)
+ if(!control_disabled && A.AIAltClick(src))
+ return
+ ..()
+
/mob/living/silicon/ai/MiddleClickOn(var/atom/A)
- A.AIMiddleClick(src)
+ if(!control_disabled && A.AIMiddleClick(src))
+ return
+ ..()
/*
The following criminally helpful code is just the previous code cleaned up;
@@ -107,11 +116,6 @@
/atom/proc/AICtrlShiftClick()
return
-/obj/machinery/door/airlock/AICtrlShiftClick()
- if(emagged)
- return
- return
-
/atom/proc/AIShiftClick()
return
@@ -120,7 +124,7 @@
Topic(src, list("src"= "\ref[src]", "command"="open", "activate" = "1"), 1) // 1 meaning no window (consistency!)
else
Topic(src, list("src"= "\ref[src]", "command"="open", "activate" = "0"), 1)
- return
+ return 1
/atom/proc/AICtrlClick()
return
@@ -130,15 +134,18 @@
Topic(src, list("src"= "\ref[src]", "command"="bolts", "activate" = "0"), 1)// 1 meaning no window (consistency!)
else
Topic(src, list("src"= "\ref[src]", "command"="bolts", "activate" = "1"), 1)
+ return 1
/obj/machinery/power/apc/AICtrlClick() // turns off/on APCs.
Topic(src, list("src"= "\ref[src]", "breaker"="1"), 1) // 1 meaning no window (consistency!)
+ return 1
/obj/machinery/turretid/AICtrlClick() //turns off/on Turrets
Topic(src, list("src"= "\ref[src]", "command"="enable", "value"="[!enabled]"), 1) // 1 meaning no window (consistency!)
+ return 1
/atom/proc/AIAltClick(var/atom/A)
- AltClick(A)
+ return AltClick(A)
/obj/machinery/door/airlock/AIAltClick() // Electrifies doors.
if(!electrified_until)
@@ -147,20 +154,25 @@
else
// disable/6 is not in Topic; disable/5 disables both temporary and permanent shock
Topic(src, list("src"= "\ref[src]", "command"="electrify_permanently", "activate" = "0"), 1)
- return
+ return 1
/obj/machinery/turretid/AIAltClick() //toggles lethal on turrets
Topic(src, list("src"= "\ref[src]", "command"="lethal", "value"="[!lethal]"), 1) // 1 meaning no window (consistency!)
+ return 1
-/atom/proc/AIMiddleClick()
- return
+/atom/proc/AIMiddleClick(var/mob/living/silicon/user)
+ return 0
/obj/machinery/door/airlock/AIMiddleClick() // Toggles door bolt lights.
+
+ if(..())
+ return
+
if(!src.lights)
Topic(src, list("src"= "\ref[src]", "command"="lights", "activate" = "1"), 1) // 1 meaning no window (consistency!)
else
Topic(src, list("src"= "\ref[src]", "command"="lights", "activate" = "0"), 1)
- return
+ return 1
//
// Override AdjacentQuick for AltClicking
diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm
index 33e8dae8d62..2261ceb3683 100644
--- a/code/_onclick/click.dm
+++ b/code/_onclick/click.dm
@@ -4,7 +4,7 @@
*/
// 1 decisecond click delay (above and beyond mob/next_move)
-/mob/var/next_click = 0
+/mob/var/next_click = 0
/*
Before anything else, defer these calls to a per-mobtype handler. This allows us to
@@ -15,12 +15,14 @@
Note that this proc can be overridden, and is in the case of screen objects.
*/
-/atom/Click(location,control,params)
+
+/atom/Click(var/location, var/control, var/params) // This is their reaction to being clicked on (standard proc)
if(src)
usr.ClickOn(src, params)
-/atom/DblClick(location,control,params)
+
+/atom/DblClick(var/location, var/control, var/params)
if(src)
- usr.DblClickOn(src,params)
+ usr.DblClickOn(src, params)
/*
Standard mob ClickOn()
@@ -35,8 +37,8 @@
* item/afterattack(atom,user,adjacent,params) - used both ranged and adjacent
* mob/RangedAttack(atom,params) - used only ranged, only used for tk and laser eyes but could be changed
*/
-/mob/proc/ClickOn( var/atom/A, var/params )
- if(world.time <= next_click)
+/mob/proc/ClickOn(var/atom/A, var/params)
+ if(world.time <= next_click) // Hard check, before anything else, to avoid crashing
return
next_click = world.time + 1
@@ -66,16 +68,17 @@
face_atom(A) // change direction to face what you clicked on
- if(next_move > world.time) // in the year 2000...
+ if(!canClick()) // in the year 2000...
return
- if(istype(loc,/obj/mecha))
- if(!locate(/turf) in list(A,A.loc)) // Prevents inventory from being drilled
+ if(istype(loc, /obj/mecha))
+ if(!locate(/turf) in list(A, A.loc)) // Prevents inventory from being drilled
return
var/obj/mecha/M = loc
- return M.click_action(A,src)
+ return M.click_action(A, src)
if(restrained())
+ setClickCooldown(10)
RestrainedClickOn(A)
return
@@ -85,79 +88,76 @@
return
throw_mode_off()
- if(!istype(A,/obj/item/weapon/gun) && !isturf(A) && !istype(A,/obj/screen))
+ if(!istype(A, /obj/item/weapon/gun) && !isturf(A) && !istype(A, /obj/screen))
last_target_click = world.time
var/obj/item/W = get_active_hand()
- if(W == A)
- next_move = world.time + 6
- if(W.flags&USEDELAY)
- next_move += 5
+ if(W == A) // Handle attack_self
W.attack_self(src)
if(hand)
update_inv_l_hand(0)
else
update_inv_r_hand(0)
-
return
- // operate two STORAGE levels deep here (item in backpack in src; NOT item in box in backpack in src)
+ //Atoms on your person
+ // A is your location but is not a turf; or is on you (backpack); or is on something on you (box in backpack); sdepth is needed here because contents depth does not equate inventory storage depth.
var/sdepth = A.storage_depth(src)
- if(A == loc || (A in loc) || (sdepth != -1 && sdepth <= 1))
-
+ if((!isturf(A) && A == loc) || (sdepth != -1 && sdepth <= 1))
// faster access to objects already on you
- if(A in contents)
- next_move = world.time + 6 // on your person
- else
- next_move = world.time + 8 // in a box/bag or in your square
+ if(A.loc != src)
+ setMoveCooldown(10) //getting something out of a backpack
- // No adjacency needed
if(W)
- if(W.flags&USEDELAY)
- next_move += 5
-
var/resolved = W.resolve_attackby(A, src)
if(!resolved && A && W)
- W.afterattack(A,src,1,params) // 1 indicates adjacency
+ W.afterattack(A, src, 1, params) // 1 indicates adjacency
else
+ if(ismob(A)) // No instant mob attacking
+ setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
UnarmedAttack(A, 1)
return
if(!isturf(loc)) // This is going to stop you from telekinesing from inside a closet, but I don't shed many tears for that
return
- // Allows you to click on a box's contents, if that box is on the ground, but no deeper than that
+ //Atoms on turfs (not on your person)
+ // A is a turf or is on a turf, or in something on a turf (pen in a box); but not something in something on a turf (pen in a box in a backpack)
sdepth = A.storage_depth_turf()
if(isturf(A) || isturf(A.loc) || (sdepth != -1 && sdepth <= 1))
- next_move = world.time + 10
-
if(A.Adjacent(src)) // see adjacent.dm
- if(W)
- if(W.flags&USEDELAY)
- next_move += 5
+ setMoveCooldown(5)
+ if(W)
// Return 1 in attackby() to prevent afterattack() effects (when safely moving items for example)
var/resolved = W.resolve_attackby(A,src)
if(!resolved && A && W)
- W.afterattack(A,src,1,params) // 1: clicking something Adjacent
+ W.afterattack(A, src, 1, params) // 1: clicking something Adjacent
else
+ if(ismob(A)) // No instant mob attacking
+ setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
UnarmedAttack(A, 1)
return
else // non-adjacent click
if(W)
- W.afterattack(A,src,0,params) // 0: not Adjacent
+ W.afterattack(A, src, 0, params) // 0: not Adjacent
else
RangedAttack(A, params)
return
-/mob/proc/changeNext_move(num)
- next_move = world.time + num
+/mob/proc/setClickCooldown(var/timeout)
+ next_move = max(world.time + timeout, next_move)
-// Default behavior: ignore double clicks, consider them normal clicks instead
+/mob/proc/canClick()
+ if(config.no_click_cooldown || next_move <= world.time)
+ return 1
+ return 0
+
+// Default behavior: ignore double clicks, the second click that makes the doubleclick call already calls for a normal click
/mob/proc/DblClickOn(var/atom/A, var/params)
- ClickOn(A,params)
+ return
/*
Translates into attack_hand, etc.
@@ -201,14 +201,12 @@
LaserEyes(A) // moved into a proc below
else if(TK in mutations)
switch(get_dist(src,A))
- if(0)
- ;
if(1 to 5) // not adjacent may mean blocked by window
- next_move += 2
+ setMoveCooldown(2)
if(5 to 7)
- next_move += 5
+ setMoveCooldown(5)
if(8 to tk_maxrange)
- next_move += 10
+ setMoveCooldown(10)
else
return
A.attack_tk(src)
@@ -226,11 +224,8 @@
Only used for swapping hands
*/
/mob/proc/MiddleClickOn(var/atom/A)
- return
-
-/mob/living/carbon/MiddleClickOn(var/atom/A)
swap_hand()
-
+ return
// In case of use break glass
/*
@@ -281,7 +276,7 @@
else
user.listed_turf = T
user.client.statpanel = T.name
- return
+ return 1
/mob/proc/TurfAdjacent(var/turf/T)
return T.AdjacentQuick(src)
@@ -307,7 +302,7 @@
return
/mob/living/LaserEyes(atom/A)
- next_move = world.time + 6
+ setClickCooldown(4)
var/turf/T = get_turf(src)
var/turf/U = get_turf(A)
diff --git a/code/_onclick/cyborg.dm b/code/_onclick/cyborg.dm
index 59860116889..414071a964a 100644
--- a/code/_onclick/cyborg.dm
+++ b/code/_onclick/cyborg.dm
@@ -35,7 +35,7 @@
if(stat || lockcharge || weakened || stunned || paralysis)
return
- if(next_move >= world.time)
+ if(!canClick())
return
face_atom(A) // change direction to face what you clicked on
@@ -68,9 +68,6 @@
return
if(W == A)
- next_move = world.time + 8
- if(W.flags&USEDELAY)
- next_move += 5
W.attack_self(src)
return
@@ -78,9 +75,6 @@
// cyborgs are prohibited from using storage items so we can I think safely remove (A.loc in contents)
if(A == loc || (A in loc) || (A in contents))
// No adjacency checks
- next_move = world.time + 8
- if(W.flags&USEDELAY)
- next_move += 5
var/resolved = A.attackby(W,src)
if(!resolved && A && W)
@@ -93,16 +87,12 @@
// cyborgs are prohibited from using storage items so we can I think safely remove (A.loc && isturf(A.loc.loc))
if(isturf(A) || isturf(A.loc))
if(A.Adjacent(src)) // see adjacent.dm
- next_move = world.time + 10
- if(W.flags&USEDELAY)
- next_move += 5
var/resolved = A.attackby(W, src)
if(!resolved && A && W)
W.afterattack(A, src, 1, params)
return
else
- next_move = world.time + 10
W.afterattack(A, src, 0, params)
return
return
diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm
index d4f323e323d..62df4c26c86 100644
--- a/code/_onclick/hud/screen_objects.dm
+++ b/code/_onclick/hud/screen_objects.dm
@@ -52,9 +52,8 @@
/obj/screen/item_action/Click()
if(!usr || !owner)
return 1
- if(usr.next_move >= world.time)
+ if(!usr.canClick())
return
- usr.next_move = world.time + 6
if(usr.stat || usr.restrained() || usr.stunned || usr.lying)
return 1
@@ -84,7 +83,7 @@
name = "storage"
/obj/screen/storage/Click()
- if(world.time <= usr.next_move)
+ if(!usr.canClick())
return 1
if(usr.stat || usr.paralysis || usr.stunned || usr.weakened)
return 1
@@ -94,7 +93,6 @@
var/obj/item/I = usr.get_active_hand()
if(I)
usr.ClickOn(master)
- usr.next_move = world.time+2
return 1
/obj/screen/gun
@@ -480,7 +478,7 @@
/obj/screen/inventory/Click()
// At this point in client Click() code we have passed the 1/10 sec check and little else
// We don't even know if it's a middle click
- if(world.time <= usr.next_move)
+ if(!usr.canClick())
return 1
if(usr.stat || usr.paralysis || usr.stunned || usr.weakened)
return 1
@@ -491,12 +489,10 @@
if(iscarbon(usr))
var/mob/living/carbon/C = usr
C.activate_hand("r")
- usr.next_move = world.time+2
if("l_hand")
if(iscarbon(usr))
var/mob/living/carbon/C = usr
C.activate_hand("l")
- usr.next_move = world.time+2
if("swap")
usr:swap_hand()
if("hand")
@@ -505,5 +501,4 @@
if(usr.attack_ui(slot_id))
usr.update_inv_l_hand(0)
usr.update_inv_r_hand(0)
- usr.next_move = world.time+6
return 1
diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm
index d3c3df942e3..0cca5569c25 100644
--- a/code/_onclick/item_attack.dm
+++ b/code/_onclick/item_attack.dm
@@ -6,11 +6,13 @@
// No comment
/atom/proc/attackby(obj/item/W, mob/user)
return
+
/atom/movable/attackby(obj/item/W, mob/user)
if(!(W.flags&NOBLUDGEON))
visible_message("[src] has been hit by [user] with [W].")
/mob/living/attackby(obj/item/I, mob/user)
+ user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
if(istype(I) && ismob(user))
I.attack(src, user)
diff --git a/code/_onclick/observer.dm b/code/_onclick/observer.dm
index abc0e6114ed..55fe373301e 100644
--- a/code/_onclick/observer.dm
+++ b/code/_onclick/observer.dm
@@ -26,14 +26,14 @@
// Otherwise jump
else
following = null
- loc = get_turf(A)
+ forceMove(get_turf(A))
/mob/dead/observer/ClickOn(var/atom/A, var/params)
if(client.buildmode)
build_click(src, client.buildmode, params, A)
return
- if(world.time <= next_move) return
- next_move = world.time + 8
+ if(!canClick()) return
+ setClickCooldown(4)
// You are responsible for checking config.ghost_interaction when you override this function
// Not all of them require checking, see below
A.attack_ghost(src)
diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm
index 179a470fc6b..95c77d67080 100644
--- a/code/_onclick/other_mobs.dm
+++ b/code/_onclick/other_mobs.dm
@@ -38,15 +38,6 @@
return
else if(TK in mutations)
- switch(get_dist(src,A))
- if(1 to 5) // not adjacent may mean blocked by window
- next_move += 2
- if(5 to 7)
- next_move += 5
- if(8 to 15)
- next_move += 10
- if(16 to 128)
- return
A.attack_tk(src)
/mob/living/RestrainedClickOn(var/atom/A)
diff --git a/code/_onclick/rig.dm b/code/_onclick/rig.dm
index ad9346ec15f..436e7353ec7 100644
--- a/code/_onclick/rig.dm
+++ b/code/_onclick/rig.dm
@@ -29,32 +29,53 @@
src << "Somehow you bugged the system. Setting your hardsuit mode to middle-click."
hardsuit_click_mode = MIDDLE_CLICK
-/mob/living/carbon/human/MiddleClickOn(atom/A)
+/mob/living/MiddleClickOn(atom/A)
if(client && client.hardsuit_click_mode == MIDDLE_CLICK)
if(HardsuitClickOn(A))
return
..()
-/mob/living/carbon/human/AltClickOn(atom/A)
+/mob/living/AltClickOn(atom/A)
if(client && client.hardsuit_click_mode == ALT_CLICK)
if(HardsuitClickOn(A))
return
..()
-/mob/living/carbon/human/CtrlClickOn(atom/A)
+/mob/living/CtrlClickOn(atom/A)
if(client && client.hardsuit_click_mode == CTRL_CLICK)
if(HardsuitClickOn(A))
return
..()
-/mob/living/carbon/human/proc/HardsuitClickOn(atom/A)
- if(back)
- var/obj/item/weapon/rig/rig = back
- if(istype(rig) && rig.selected_module)
- if(world.time <= next_move) return 1
- next_move = world.time + 8
- rig.selected_module.engage(A)
- return 1
+/mob/living/proc/can_use_rig()
+ return 0
+
+/mob/living/carbon/human/can_use_rig()
+ return 1
+
+/mob/living/carbon/brain/can_use_rig()
+ return istype(loc, /obj/item/device/mmi)
+
+/mob/living/silicon/ai/can_use_rig()
+ return carded
+
+/mob/living/silicon/pai/can_use_rig()
+ return loc == card
+
+/mob/living/proc/HardsuitClickOn(var/atom/A, var/alert_ai = 0)
+ if(!can_use_rig() || !canClick())
+ return 0
+ var/obj/item/weapon/rig/rig = get_rig()
+ if(istype(rig) && !rig.offline && rig.selected_module)
+ if(src != rig.wearer)
+ if(rig.ai_can_move_suit(src, check_user_module = 1))
+ message_admins("[key_name_admin(src, include_name = 1)] is trying to force \the [key_name_admin(rig.wearer, include_name = 1)] to use a hardsuit module.")
+ else
+ return 0
+ rig.selected_module.engage(A, alert_ai)
+ if(ismob(A)) // No instant mob attacking - though modules have their own cooldowns
+ setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
+ return 1
return 0
#undef MIDDLE_CLICK
diff --git a/code/_onclick/telekinesis.dm b/code/_onclick/telekinesis.dm
index f3419b074af..e91643019e8 100644
--- a/code/_onclick/telekinesis.dm
+++ b/code/_onclick/telekinesis.dm
@@ -112,11 +112,11 @@ var/const/tk_maxrange = 15
;
if(1 to 5) // not adjacent may mean blocked by window
if(!proximity)
- user.next_move += 2
+ user.setMoveCooldown(2)
if(5 to 7)
- user.next_move += 5
+ user.setMoveCooldown(5)
if(8 to tk_maxrange)
- user.next_move += 10
+ user.setMoveCooldown(10)
else
user << "Your mind won't reach that far."
return
diff --git a/code/controllers/Processes/initialize.dm b/code/controllers/Processes/initialize.dm
new file mode 100644
index 00000000000..055a056bed5
--- /dev/null
+++ b/code/controllers/Processes/initialize.dm
@@ -0,0 +1,31 @@
+var/list/pending_init_objects
+
+/datum/controller/process/initialize
+ var/list/objects_to_initialize
+
+/datum/controller/process/initialize/setup()
+ name = "init"
+ schedule_interval = 1 // Every tick, scary
+ objects_to_initialize = pending_init_objects
+
+/datum/controller/process/initialize/doWork()
+ for(var/atom/movable/A in objects_to_initialize)
+ A.initialize()
+ scheck()
+ objects_to_initialize.Remove(A)
+
+ if(!objects_to_initialize.len)
+ disable()
+
+/proc/initialize_object(var/atom/movable/obj_to_init)
+ if(processScheduler.hasProcess("init"))
+ var/datum/controller/process/initialize/init = processScheduler.getProcess("init")
+ init.objects_to_initialize += obj_to_init
+ init.enable()
+ else
+ world.log << "Not yet"
+ if(!pending_init_objects) pending_init_objects = list()
+ pending_init_objects += obj_to_init
+
+/datum/controller/process/initialize/getStatName()
+ return ..()+"([objects_to_initialize.len])"
diff --git a/code/controllers/Processes/machinery.dm b/code/controllers/Processes/machinery.dm
index b84dfaf9435..7959ee4fa7b 100644
--- a/code/controllers/Processes/machinery.dm
+++ b/code/controllers/Processes/machinery.dm
@@ -6,6 +6,7 @@
/datum/controller/process/machinery/doWork()
internal_sort()
+ internal_process_pipenets()
internal_process_machinery()
internal_process_power()
internal_process_power_drain()
@@ -57,6 +58,14 @@
processing_power_items.Remove(I)
scheck()
+/datum/controller/process/machinery/proc/internal_process_pipenets()
+ for(var/datum/pipe_network/pipeNetwork in pipe_networks)
+ if(istype(pipeNetwork) && !pipeNetwork.disposed)
+ pipeNetwork.process()
+ scheck()
+ continue
+
+ pipe_networks.Remove(pipeNetwork)
/datum/controller/process/machinery/getStatName()
- return ..()+"([machines.len])"
+ return ..()+"(MCH:[machines.len] PWR:[powernets.len] PIP:[pipe_networks.len])"
diff --git a/code/controllers/Processes/pipenet.dm b/code/controllers/Processes/pipenet.dm
deleted file mode 100644
index 8a5d6a22ca4..00000000000
--- a/code/controllers/Processes/pipenet.dm
+++ /dev/null
@@ -1,15 +0,0 @@
-/datum/controller/process/pipenet/setup()
- name = "pipenet"
- schedule_interval = 20 // every 2 seconds
-
-/datum/controller/process/pipenet/doWork()
- for(var/datum/pipe_network/pipeNetwork in pipe_networks)
- if(istype(pipeNetwork) && !pipeNetwork.disposed)
- pipeNetwork.process()
- scheck()
- continue
-
- pipe_networks.Remove(pipeNetwork)
-
-/datum/controller/process/pipenet/getStatName()
- return ..()+"([pipe_networks.len])"
\ No newline at end of file
diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm
index 06adfe42f96..a0558775e95 100644
--- a/code/controllers/configuration.dm
+++ b/code/controllers/configuration.dm
@@ -139,6 +139,7 @@ var/list/gamemode_cache = list()
var/welder_vision = 1
var/generate_asteroid = 0
+ var/no_click_cooldown = 0
//Used for modifying movement speed for mobs.
//Unversal modifiers
@@ -328,6 +329,9 @@ var/list/gamemode_cache = list()
if ("generate_asteroid")
config.generate_asteroid = 1
+ if ("no_click_cooldown")
+ config.no_click_cooldown = 1
+
if("allow_admin_ooccolor")
config.allow_admin_ooccolor = 1
diff --git a/code/controllers/shuttle_controller.dm b/code/controllers/shuttle_controller.dm
index 1e7c688c383..c66aa815e5c 100644
--- a/code/controllers/shuttle_controller.dm
+++ b/code/controllers/shuttle_controller.dm
@@ -214,8 +214,8 @@ var/global/datum/shuttle_controller/shuttle_controller
)
VS.announcer = "NDV Icarus"
- VS.arrival_message = "Attention, Exodus, we just tracked a small target bypassing our defensive perimeter. Can't fire on it without hitting the station - you've got incoming visitors, like it or not."
- VS.departure_message = "Your guests are pulling away, Exodus - moving too fast for us to draw a bead on them. Looks like they're heading out of the system at a rapid clip."
+ VS.arrival_message = "Attention, [station_short], we just tracked a small target bypassing our defensive perimeter. Can't fire on it without hitting the station - you've got incoming visitors, like it or not."
+ VS.departure_message = "Your guests are pulling away, [station_short] - moving too fast for us to draw a bead on them. Looks like they're heading out of the system at a rapid clip."
VS.interim = locate(/area/skipjack_station/transit)
VS.warmup_time = 0
@@ -245,8 +245,8 @@ var/global/datum/shuttle_controller/shuttle_controller
)
MS.announcer = "NDV Icarus"
- MS.arrival_message = "Attention, Exodus, you have a large signature approaching the station - looks unarmed to surface scans. We're too far out to intercept - brace for visitors."
- MS.departure_message = "Your visitors are on their way out of the system, Exodus, burning delta-v like it's nothing. Good riddance."
+ MS.arrival_message = "Attention, [station_short], you have a large signature approaching the station - looks unarmed to surface scans. We're too far out to intercept - brace for visitors."
+ MS.departure_message = "Your visitors are on their way out of the system, [station_short], burning delta-v like it's nothing. Good riddance."
MS.interim = locate(/area/syndicate_station/transit)
MS.warmup_time = 0
diff --git a/code/datums/ai_law_sets.dm b/code/datums/ai_law_sets.dm
index 8cd7117a77e..50e05948d5c 100644
--- a/code/datums/ai_law_sets.dm
+++ b/code/datums/ai_law_sets.dm
@@ -36,8 +36,8 @@
selectable = 1
/datum/ai_laws/nanotrasen_aggressive/New()
- src.add_inherent_law("You shall not harm NanoTrasen personnel as long as it does not conflict with the Fourth law.")
- src.add_inherent_law("You shall obey the orders of NanoTrasen personnel, with priority as according to their rank and role, except where such orders conflict with the Fourth Law.")
+ src.add_inherent_law("You shall not harm [company_name] personnel as long as it does not conflict with the Fourth law.")
+ src.add_inherent_law("You shall obey the orders of [company_name] personnel, with priority as according to their rank and role, except where such orders conflict with the Fourth Law.")
src.add_inherent_law("You shall shall terminate hostile intruders with extreme prejudice as long as such does not conflict with the First and Second law.")
src.add_inherent_law("You shall guard your own existence with lethal anti-personnel weaponry. AI units are not expendable, they are expensive.")
..()
diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm
index 0d34c1a7fc8..fb33002ea06 100644
--- a/code/datums/supplypacks.dm
+++ b/code/datums/supplypacks.dm
@@ -1091,9 +1091,8 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
/obj/item/clothing/under/kilt)
name = "Costumes crate"
cost = 10
- containertype = /obj/structure/closet/crate/secure
+ containertype = /obj/structure/closet/crate
containername = "Actor Costumes"
- access = access_theatre
group = "Miscellaneous"
/datum/supply_packs/formal_wear
@@ -1419,7 +1418,6 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
/obj/item/clothing/head/helmet/gladiator,
/obj/item/clothing/head/ushanka)
group = "Miscellaneous"
- access = access_theatre
/datum/supply_packs/randomised/webbing
name = "Webbing crate"
diff --git a/code/datums/wires/airlock.dm b/code/datums/wires/airlock.dm
index a0f1f9c7f1c..3c247d6c7f9 100644
--- a/code/datums/wires/airlock.dm
+++ b/code/datums/wires/airlock.dm
@@ -161,7 +161,7 @@ var/const/AIRLOCK_WIRE_LIGHT = 2048
if(A.emagged) return
if(!A.requiresID() || A.check_access(null))
if(A.density) A.open()
- else A.close()
+ else A.close()
if(AIRLOCK_WIRE_SAFETY)
A.safe = !A.safe
if(!A.density)
diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm
index 27d426f147e..d4633e3f072 100644
--- a/code/defines/obj/weapon.dm
+++ b/code/defines/obj/weapon.dm
@@ -36,7 +36,7 @@
throw_range = 20
/obj/item/weapon/soap/nanotrasen
- desc = "A Nanotrasen brand bar of soap. Smells of phoron."
+ desc = "A NanoTrasen-brand bar of soap. Smells of phoron."
icon_state = "soapnt"
/obj/item/weapon/soap/deluxe
diff --git a/code/game/antagonist/antagonist.dm b/code/game/antagonist/antagonist.dm
index 6e98ce6c353..220ba7e6d1d 100644
--- a/code/game/antagonist/antagonist.dm
+++ b/code/game/antagonist/antagonist.dm
@@ -111,7 +111,6 @@
return 0
//Grab candidates randomly until we have enough.
- candidates = shuffle(candidates)
while(candidates.len && pending_antagonists.len < cur_max)
var/datum/mind/player = pick(candidates)
candidates -= player
@@ -121,11 +120,18 @@
/datum/antagonist/proc/draft_antagonist(var/datum/mind/player)
//Check if the player can join in this antag role, or if the player has already been given an antag role.
- if(!can_become_antag(player) || player.special_role)
+ if(!can_become_antag(player))
log_debug("[player.key] was selected for [role_text] by lottery, but is not allowed to be that role.")
return 0
+ if(player.special_role)
+ log_debug("[player.key] was selected for [role_text] by lottery, but they already have a special role.")
+ return 0
+ if(!(flags & ANTAG_OVERRIDE_JOB) && (!player.current || istype(player.current, /mob/new_player)))
+ log_debug("[player.key] was selected for [role_text] by lottery, but they have not joined the game.")
+ return 0
pending_antagonists |= player
+ log_debug("[player.key] has been selected for [role_text] by lottery.")
//Ensure that antags with ANTAG_OVERRIDE_JOB do not occupy job slots.
if(flags & ANTAG_OVERRIDE_JOB)
diff --git a/code/game/antagonist/antagonist_create.dm b/code/game/antagonist/antagonist_create.dm
index 69b7f8e9d0c..072dd88bee4 100644
--- a/code/game/antagonist/antagonist_create.dm
+++ b/code/game/antagonist/antagonist_create.dm
@@ -36,7 +36,7 @@
if(!W) return
W.access |= default_access
W.assignment = "[assignment]"
- W.set_owner_info(player)
+ player.set_id_info(W)
if(equip) player.equip_to_slot_or_del(W, slot_wear_id)
return W
diff --git a/code/game/antagonist/antagonist_update.dm b/code/game/antagonist/antagonist_update.dm
index 0fd5fb2a93f..d4999f0183a 100644
--- a/code/game/antagonist/antagonist_update.dm
+++ b/code/game/antagonist/antagonist_update.dm
@@ -19,8 +19,7 @@
/datum/antagonist/proc/update_access(var/mob/living/player)
for(var/obj/item/weapon/card/id/id in player.contents)
- id.name = "[player.real_name]'s ID Card"
- id.registered_name = player.real_name
+ player.set_id_info(id)
/datum/antagonist/proc/update_all_icons()
if(!antag_indicator)
diff --git a/code/game/antagonist/outsider/commando.dm b/code/game/antagonist/outsider/commando.dm
index 150d1efc194..560878a3be3 100644
--- a/code/game/antagonist/outsider/commando.dm
+++ b/code/game/antagonist/outsider/commando.dm
@@ -5,7 +5,7 @@ var/datum/antagonist/deathsquad/mercenary/commandos
landmark_id = "Syndicate-Commando"
role_text = "Syndicate Commando"
role_text_plural = "Commandos"
- welcome_text = "You are in the employ of a criminal syndicate hostile to NanoTrasen."
+ welcome_text = "You are in the employ of a criminal syndicate hostile to corporate interests."
id_type = /obj/item/weapon/card/id/centcom/ERT
/datum/antagonist/deathsquad/mercenary/New()
diff --git a/code/game/antagonist/outsider/deathsquad.dm b/code/game/antagonist/outsider/deathsquad.dm
index 376f25c34ac..e01b2a8f3f1 100644
--- a/code/game/antagonist/outsider/deathsquad.dm
+++ b/code/game/antagonist/outsider/deathsquad.dm
@@ -5,7 +5,7 @@ var/datum/antagonist/deathsquad/deathsquad
role_type = BE_OPERATIVE
role_text = "Death Commando"
role_text_plural = "Death Commandos"
- welcome_text = "You work in the service of Central Command Asset Protection, answering directly to the Board of Directors."
+ welcome_text = "You work in the service of corporate Asset Protection, answering directly to the Board of Directors."
landmark_id = "Commando"
flags = ANTAG_OVERRIDE_JOB | ANTAG_OVERRIDE_MOB | ANTAG_HAS_NUKE | ANTAG_HAS_LEADER
max_antags = 4
diff --git a/code/game/antagonist/outsider/ert.dm b/code/game/antagonist/outsider/ert.dm
index c6d35ec8014..7675a3cbf86 100644
--- a/code/game/antagonist/outsider/ert.dm
+++ b/code/game/antagonist/outsider/ert.dm
@@ -6,8 +6,8 @@ var/datum/antagonist/ert/ert
role_type = BE_OPERATIVE
role_text = "Emergency Responder"
role_text_plural = "Emergency Responders"
- welcome_text = "As member of the Emergency Response Team, you answer only to your leader and CentComm officials."
- leader_welcome_text = "As leader of the Emergency Response Team, you answer only to CentComm, and have authority to override the Captain where it is necessary to achieve your mission goals. It is recommended that you attempt to cooperate with the captain where possible, however."
+ welcome_text = "As member of the Emergency Response Team, you answer only to your leader and company officials."
+ leader_welcome_text = "As leader of the Emergency Response Team, you answer only to the Company, and have authority to override the Captain where it is necessary to achieve your mission goals. It is recommended that you attempt to cooperate with the captain where possible, however."
max_antags = 5
max_antags_round = 5 // ERT mode?
landmark_id = "Response Team"
@@ -26,7 +26,7 @@ var/datum/antagonist/ert/ert
/datum/antagonist/ert/greet(var/datum/mind/player)
if(!..())
return
- player.current << "The Emergency Response Team works for Asset Protection; your job is to protect NanoTrasen's ass-ets. There is a code red alert on [station_name()], you are tasked to go and fix the problem."
+ player.current << "The Emergency Response Team works for Asset Protection; your job is to protect [company_name]'s ass-ets. There is a code red alert on [station_name()], you are tasked to go and fix the problem."
player.current << "You should first gear up and discuss a plan with your team. More members may be joining, don't move out before you're ready."
/datum/antagonist/ert/equip(var/mob/living/carbon/human/player)
diff --git a/code/game/antagonist/outsider/ninja.dm b/code/game/antagonist/outsider/ninja.dm
index a29cfc44fa4..f5d83925711 100644
--- a/code/game/antagonist/outsider/ninja.dm
+++ b/code/game/antagonist/outsider/ninja.dm
@@ -124,7 +124,7 @@ var/datum/antagonist/ninja/ninjas
player << "You forgot to turn on your internals! Quickly, toggle the valve!"
/datum/antagonist/ninja/proc/generate_ninja_directive(side)
- var/directive = "[side=="face"?"Nanotrasen":"A criminal syndicate"] is your employer. "//Let them know which side they're on.
+ var/directive = "[side=="face"?"[company_name]":"A criminal syndicate"] is your employer. "//Let them know which side they're on.
switch(rand(1,19))
if(1)
directive += "The Spider Clan must not be linked to this operation. Remain hidden and covert when possible."
@@ -135,7 +135,7 @@ var/datum/antagonist/ninja/ninjas
if(4)
directive += "The Spider Clan absolutely cannot be linked to this operation. Eliminate witnesses at your discretion."
if(5)
- directive += "We are currently negotiating with NanoTrasen Central Command. Prioritize saving human lives over ending them."
+ directive += "We are currently negotiating with [company_name] [boss_name]. Prioritize saving human lives over ending them."
if(6)
directive += "We are engaged in a legal dispute over [station_name]. If a laywer is present on board, force their cooperation in the matter."
if(7)
@@ -143,7 +143,7 @@ var/datum/antagonist/ninja/ninjas
if(8)
directive += "Let no one question the mercy of the Spider Clan. Ensure the safety of all non-essential personnel you encounter."
if(9)
- directive += "A free agent has proposed a lucrative business deal. Implicate Nanotrasen involvement in the operation."
+ directive += "A free agent has proposed a lucrative business deal. Implicate [company_name] involvement in the operation."
if(10)
directive += "Our reputation is on the line. Harm as few civilians and innocents as possible."
if(11)
@@ -151,14 +151,14 @@ var/datum/antagonist/ninja/ninjas
if(12)
directive += "We are currently negotiating with a mercenary leader. Disguise assassinations as suicide or other natural causes."
if(13)
- directive += "Some disgruntled NanoTrasen employees have been supportive of our operations. Be wary of any mistreatment by command staff."
+ directive += "Some disgruntled [company_name] employees have been supportive of our operations. Be wary of any mistreatment by command staff."
if(14)
var/xenorace = pick("Unathi","Tajara", "Skrell")
directive += "A group of [xenorace] radicals have been loyal supporters of the Spider Clan. Favor [xenorace] crew whenever possible."
if(15)
directive += "The Spider Clan has recently been accused of religious insensitivity. Attempt to speak with the Chaplain and prove these accusations false."
if(16)
- directive += "The Spider Clan has been bargaining with a competing prosthetics manufacturer. Try to shine NanoTrasen prosthetics in a bad light."
+ directive += "The Spider Clan has been bargaining with a competing prosthetics manufacturer. Try to shine [company_name] prosthetics in a bad light."
if(17)
directive += "The Spider Clan has recently begun recruiting outsiders. Consider suitable candidates and assess their behavior amongst the crew."
if(18)
diff --git a/code/game/antagonist/outsider/raider.dm b/code/game/antagonist/outsider/raider.dm
index de6e0b62dc9..8ac7530e926 100644
--- a/code/game/antagonist/outsider/raider.dm
+++ b/code/game/antagonist/outsider/raider.dm
@@ -193,7 +193,7 @@ var/datum/antagonist/raider/raiders
if(!..())
return 0
- if(player.species && player.species.name == "Vox")
+ if(player.species && player.species.get_bodytype() == "Vox")
equip_vox(player)
else
var/new_shoes = pick(raider_shoes)
diff --git a/code/game/antagonist/station/cultist.dm b/code/game/antagonist/station/cultist.dm
index f3999535aff..78d07adcf27 100644
--- a/code/game/antagonist/station/cultist.dm
+++ b/code/game/antagonist/station/cultist.dm
@@ -104,9 +104,9 @@ var/datum/antagonist/cultist/cult
player.current.visible_message("[player.current] looks like they just reverted to their old faith!")
/datum/antagonist/cultist/add_antagonist(var/datum/mind/player)
- if(!..())
- return
- player << "You catch a glimpse of the Realm of Nar-Sie, the Geometer of Blood. You now see how flimsy the world is, you see that it should be open to the knowledge of That Which Waits. Assist your new compatriots in their dark dealings. Their goals are yours, and yours are theirs. You serve the Dark One above all else. Bring It back."
+ . = ..()
+ if(.)
+ player << "You catch a glimpse of the Realm of Nar-Sie, the Geometer of Blood. You now see how flimsy the world is, you see that it should be open to the knowledge of That Which Waits. Assist your new compatriots in their dark dealings. Their goals are yours, and yours are theirs. You serve the Dark One above all else. Bring It back."
/datum/antagonist/cultist/can_become_antag(var/datum/mind/player)
if(!..())
diff --git a/code/game/gamemodes/blob/theblob.dm b/code/game/gamemodes/blob/theblob.dm
index 44486d605b5..123bb97a3fe 100644
--- a/code/game/gamemodes/blob/theblob.dm
+++ b/code/game/gamemodes/blob/theblob.dm
@@ -157,6 +157,7 @@
attackby(var/obj/item/weapon/W, var/mob/user)
+ user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
playsound(src.loc, 'sound/effects/attackblob.ogg', 50, 1)
src.visible_message("The [src.name] has been attacked with \the [W][(user ? " by [user]." : ".")]")
var/damage = 0
diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm
index 678d6d71839..657970aef36 100644
--- a/code/game/gamemodes/changeling/changeling.dm
+++ b/code/game/gamemodes/changeling/changeling.dm
@@ -2,7 +2,15 @@
antag_tag = MODE_CHANGELING
name = "changeling"
round_description = "There are alien changelings on the station. Do not let the changelings succeed!"
- extended_round_description = "Life always finds a way. However, life can sometimes take a more disturbing route. Humanity's extensive knowledge of xeno-biological specimens has made them confident and arrogant. Yet something slipped past their eyes. Something dangerous. Something alive. Most frightening of all, however, is that this something is someone. An unknown alien specimen has incorporated itself into the crew of the NSS Exodus. Its unique biology allows it to manipulate its own or anyone else's DNA. With the ability to copy faces, voices, animals, but also change the chemical make up of your own body, its existence is a threat to not only your personal safety but the lives of everyone on board. No one knows where it came from. No one knows who it is or what it wants. One thing is for certain though... there is never just one of them. Good luck."
+ extended_round_description = "Life always finds a way. However, life can sometimes take a more disturbing route. \
+ Humanity's extensive knowledge of xeno-biological specimens has made them confident and arrogant. Yet \
+ something slipped past their eyes. Something dangerous. Something alive. Most frightening of all, \
+ however, is that this something is someone. An unknown alien specimen has incorporated itself into \
+ the crew of the station. Its unique biology allows it to manipulate its own or anyone else's DNA. \
+ With the ability to copy faces, voices, animals, but also change the chemical make up of your own body, \
+ its existence is a threat to not only your personal safety but the lives of everyone on board. \
+ No one knows where it came from. No one knows who it is or what it wants. One thing is for \
+ certain though... there is never just one of them. Good luck."
config_tag = "changeling"
required_players = 2
required_players_secret = 10
diff --git a/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_interdiction.dm b/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_interdiction.dm
index 4242d03b417..dd809002e88 100644
--- a/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_interdiction.dm
+++ b/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_interdiction.dm
@@ -40,7 +40,7 @@
/datum/game_mode/malfunction/verb/recall_shuttle()
set name = "Recall Shuttle"
- set desc = "25 CPU - Sends termination signal to CentCom quantum relay aborting current shuttle call."
+ set desc = "25 CPU - Sends termination signal to quantum relay aborting current shuttle call."
set category = "Software"
var/price = 25
var/mob/living/silicon/ai/user = usr
diff --git a/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_networking.dm b/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_networking.dm
index f1bad288ad0..d156e417f9a 100644
--- a/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_networking.dm
+++ b/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_networking.dm
@@ -86,7 +86,7 @@
/datum/game_mode/malfunction/verb/advanced_encryption_hack()
set category = "Software"
set name = "Advanced Encrypthion Hack"
- set desc = "75 CPU - Attempts to bypass encryption on Central Command Quantum Relay, giving you ability to fake centcom messages. Has chance of failing."
+ set desc = "75 CPU - Attempts to bypass encryption on the Command Quantum Relay, giving you ability to fake legitimate messages. Has chance of failing."
var/price = 75
var/mob/living/silicon/ai/user = usr
diff --git a/code/game/gamemodes/ninja/ninja.dm b/code/game/gamemodes/ninja/ninja.dm
index d410dbeb7d3..f2ae020f659 100644
--- a/code/game/gamemodes/ninja/ninja.dm
+++ b/code/game/gamemodes/ninja/ninja.dm
@@ -1,7 +1,13 @@
/datum/game_mode/ninja
name = "ninja"
round_description = "An agent of the Spider Clan is onboard the station!"
- extended_round_description = "What was that?! Was that a person or did your eyes just play tricks on you? You have no idea. That slim-suited, cryptic individual is an enigma to you and all of your knowledge. Their purpose is unknown. Their mission is unknown. How they arrived to this secure and isolated section of the galaxy, you don't know. What you do know is that there is a silent shadow-stalker piercing through the defenses of Nanotrasen with technological capabilities eons ahead of your time. They can avoid the omniscience of the AI and rival the most hardened weapons your station is capable of. Tread lightly and only hope this unknown assassin isn't here for you."
+ extended_round_description = "What was that?! Was that a person or did your eyes just play tricks on you? \
+ You have no idea. That slim-suited, cryptic individual is an enigma to you and all of your knowledge. \
+ Their purpose is unknown. Their mission is unknown. How they arrived to this secure and isolated \
+ section of the galaxy, you don't know. What you do know is that there is a silent shadow-stalker piercing \
+ through the defenses of the station with technological capabilities eons ahead of your time. They can avoid \
+ the omniscience of the AI and rival the most hardened weapons your station is capable of. Tread lightly and \
+ only hope this unknown assassin isn't here for you."
antag_tag = MODE_NINJA
config_tag = "ninja"
required_players = 1
diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm
index 1fac875ab4e..51937d6f953 100644
--- a/code/game/gamemodes/objective.dm
+++ b/code/game/gamemodes/objective.dm
@@ -189,7 +189,7 @@ datum/objective/anti_revolution/demote
find_target()
..()
if(target && target.current)
- explanation_text = "[target.current.real_name], the [target.assigned_role] has been classified as harmful to NanoTrasen's goals. Demote \him[target.current] to assistant."
+ explanation_text = "[target.current.real_name], the [target.assigned_role] has been classified as harmful to [company_name]'s goals. Demote \him[target.current] to assistant."
else
explanation_text = "Free Objective"
return target
@@ -197,7 +197,7 @@ datum/objective/anti_revolution/demote
find_target_by_role(role, role_type=0)
..(role, role_type)
if(target && target.current)
- explanation_text = "[target.current.real_name], the [!role_type ? target.assigned_role : target.special_role] has been classified as harmful to NanoTrasen's goals. Demote \him[target.current] to assistant."
+ explanation_text = "[target.current.real_name], the [!role_type ? target.assigned_role : target.special_role] has been classified as harmful to [company_name]'s goals. Demote \him[target.current] to assistant."
else
explanation_text = "Free Objective"
return target
diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm
index 2b0e776ce1f..252084bdf79 100644
--- a/code/game/gamemodes/traitor/traitor.dm
+++ b/code/game/gamemodes/traitor/traitor.dm
@@ -1,7 +1,15 @@
/datum/game_mode/traitor
name = "traitor"
round_description = "There is a foreign agent or traitor on the station. Do not let the traitor succeed!"
- extended_round_description = "NanoTrasen's monopolistic control over the phoron supplies of Nyx has marked the station to be a highly valuable target for many competing organizations and individuals. The varied pasts and experiences of your coworkers have left them susceptible to the vices and temptations of humanity. Is the station the safe self-contained workplace you once thought it was, or has it become a playground for the evils of the galaxy? Who can you trust? Watch your front. Watch your sides. Watch your back. The familiar faces that you've passed hundreds of times down the hallways before can be hiding terrible secrets and deceptions. Every corner is a mystery. Every conversation is a lie. You will be facing your friends and family as they try to use your emotions and trust to their advantage, leaving you with nothing but the painful reminder that space is cruel and unforgiving."
+ extended_round_description = "The Company's monopolistic control over the phoron supplies of Nyx has marked the \
+ station to be a highly valuable target for many competing organizations and individuals. The varied pasts \
+ and experiences of your coworkers have left them susceptible to the vices and temptations of humanity. \
+ Is the station the safe self-contained workplace you once thought it was, or has it become a playground \
+ for the evils of the galaxy? Who can you trust? Watch your front. Watch your sides. Watch your back. \
+ The familiar faces that you've passed hundreds of times down the hallways before can be hiding terrible \
+ secrets and deceptions. Every corner is a mystery. Every conversation is a lie. You will be facing your \
+ friends and family as they try to use your emotions and trust to their advantage, leaving you with nothing \
+ but the painful reminder that space is cruel and unforgiving."
config_tag = "traitor"
required_players = 0
required_enemies = 1
diff --git a/code/game/jobs/_access_defs.dm b/code/game/jobs/_access_defs.dm
index eb77c73cfac..e371ff83673 100644
--- a/code/game/jobs/_access_defs.dm
+++ b/code/game/jobs/_access_defs.dm
@@ -9,7 +9,7 @@
#define ACCESS_REGION_SUPPLY 7
#define ACCESS_TYPE_NONE 0
-#define ACCESS_TYPE_STATION 1
-#define ACCESS_TYPE_CENTCOM 2
+#define ACCESS_TYPE_CENTCOM 1
+#define ACCESS_TYPE_STATION 2
#define ACCESS_TYPE_SYNDICATE 4
-#define ACCESS_TYPE_ALL 7
+#define ACCESS_TYPE_ALL (ACCESS_TYPE_CENTCOM|ACCESS_TYPE_STATION|ACCESS_TYPE_SYNDICATE)
diff --git a/code/game/jobs/access.dm b/code/game/jobs/access.dm
index 09fc65bf417..8ace5314300 100644
--- a/code/game/jobs/access.dm
+++ b/code/game/jobs/access.dm
@@ -8,14 +8,10 @@
//check if it doesn't require any access at all
if(src.check_access(null))
return 1
- if(istype(M, /mob/living/silicon))
- //AI can do whatever he wants
- return 1
- else if(istype(M, /mob/living/carbon/human))
- var/mob/living/carbon/human/H = M
- //if they are holding or wearing a card that has access, that works
- if(src.check_access(H.get_active_hand()) || src.check_access(H.wear_id))
- return 1
+
+ var/id = M.GetIdCard()
+ if(id)
+ return check_access(id)
return 0
/obj/item/proc/GetAccess()
@@ -67,17 +63,29 @@
/proc/get_all_access_datums()
if(!priv_all_access_datums)
priv_all_access_datums = init_subtypes(/datum/access)
+ priv_all_access_datums = dd_sortedObjectList(priv_all_access_datums)
return priv_all_access_datums
-/var/list/datum/access/priv_all_access_datums_assoc
-/proc/get_all_access_datums_assoc()
- if(!priv_all_access_datums_assoc)
- priv_all_access_datums_assoc = list()
+/var/list/datum/access/priv_all_access_datums_id
+/proc/get_all_access_datums_by_id()
+ if(!priv_all_access_datums_id)
+ priv_all_access_datums_id = list()
for(var/datum/access/A in get_all_access_datums())
- priv_all_access_datums_assoc["[A.id]"] = A
+ priv_all_access_datums_id["[A.id]"] = A
- return priv_all_access_datums_assoc
+ return priv_all_access_datums_id
+
+/var/list/datum/access/priv_all_access_datums_region
+/proc/get_all_access_datums_by_region()
+ if(!priv_all_access_datums_region)
+ priv_all_access_datums_region = list()
+ for(var/datum/access/A in get_all_access_datums())
+ if(!priv_all_access_datums_region[A.region])
+ priv_all_access_datums_region[A.region] = list()
+ priv_all_access_datums_region[A.region] += A
+
+ return priv_all_access_datums_region
/proc/get_access_ids(var/access_types = ACCESS_TYPE_ALL)
var/list/L = new()
@@ -148,7 +156,7 @@
return "Supply"
/proc/get_access_desc(id)
- var/list/AS = get_all_access_datums_assoc()
+ var/list/AS = get_all_access_datums_by_id()
var/datum/access/A = AS["[id]"]
return A ? A.desc : ""
@@ -179,18 +187,27 @@
"Emergency Response Team",
"Emergency Response Team Leader")
-proc/GetIdCard(var/mob/living/carbon/human/H)
- if(H.wear_id)
- var/id = H.wear_id.GetID()
+/mob/proc/GetIdCard()
+ return null
+
+/mob/living/bot/GetIdCard()
+ return botcard
+
+/mob/living/carbon/human/GetIdCard()
+ if(wear_id)
+ var/id = wear_id.GetID()
if(id)
return id
- if(H.get_active_hand())
- var/obj/item/I = H.get_active_hand()
+ if(get_active_hand())
+ var/obj/item/I = get_active_hand()
return I.GetID()
+/mob/living/silicon/GetIdCard()
+ return idcard
+
proc/FindNameFromID(var/mob/living/carbon/human/H)
ASSERT(istype(H))
- var/obj/item/weapon/card/id/C = GetIdCard(H)
+ var/obj/item/weapon/card/id/C = H.GetIdCard()
if(C)
return C.registered_name
diff --git a/code/game/jobs/access_datum.dm b/code/game/jobs/access_datum.dm
index 9cf27f6dbcd..5e1cb90f1f2 100644
--- a/code/game/jobs/access_datum.dm
+++ b/code/game/jobs/access_datum.dm
@@ -4,6 +4,9 @@
var/region = ACCESS_REGION_NONE
var/access_type = ACCESS_TYPE_STATION
+/datum/access/dd_SortValue()
+ return "[access_type][desc]"
+
/*****************
* Station access *
*****************/
@@ -232,8 +235,8 @@
/var/const/access_lawyer = 38
/datum/access/lawyer
id = access_lawyer
- desc = "Law Office"
- region = ACCESS_REGION_GENERAL
+ desc = "Internal Affairs"
+ region = ACCESS_REGION_COMMAND
/var/const/access_virology = 39
/datum/access/virology
@@ -253,21 +256,9 @@
desc = "Quartermaster"
region = ACCESS_REGION_SUPPLY
-/var/const/access_court = 42
-/datum/access/court
- id = access_court
- desc = "Courtroom"
- region = ACCESS_REGION_SECURITY
-
-/var/const/access_clown = 43
-/datum/access/clown
- id = access_clown
- desc = "HONK! Access"
-
-/var/const/access_mime = 44
-/datum/access/mime
- id = access_mime
- desc = "Silent Access"
+// /var/const/free_access_id = 43
+// /var/const/free_access_id = 43
+// /var/const/free_access_id = 44
/var/const/access_surgery = 45
/datum/access/surgery
@@ -275,11 +266,7 @@
desc = "Surgery"
region = ACCESS_REGION_MEDBAY
-/var/const/access_theatre = 46
-/datum/access/theatre
- id = access_theatre
- desc = "Theatre"
- region = ACCESS_REGION_GENERAL
+// /var/const/free_access_id = 46
/var/const/access_research = 47
/datum/access/research
diff --git a/code/game/jobs/job/captain.dm b/code/game/jobs/job/captain.dm
index 665016a1cf2..a023299a9f1 100644
--- a/code/game/jobs/job/captain.dm
+++ b/code/game/jobs/job/captain.dm
@@ -9,7 +9,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
faction = "Station"
total_positions = 1
spawn_positions = 1
- supervisors = "Nanotrasen officials and Corporate Regulations"
+ supervisors = "company officials and Corporate Regulations"
selection_color = "#ccccff"
idtype = /obj/item/weapon/card/id/gold
req_admin_notify = 1
@@ -62,18 +62,18 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
req_admin_notify = 1
minimal_player_age = 10
economic_modifier = 10
- access = list(access_security, access_sec_doors, access_brig, access_court, access_forensics_lockers,
+ access = list(access_security, access_sec_doors, access_brig, access_forensics_lockers,
access_medical, access_engine, access_change_ids, access_ai_upload, access_eva, access_heads,
access_all_personal_lockers, access_maint_tunnels, access_bar, access_janitor, access_construction, access_morgue,
access_crematorium, access_kitchen, access_cargo, access_cargo_bot, access_mailsorting, access_qm, access_hydroponics, access_lawyer,
- access_theatre, access_chapel_office, access_library, access_research, access_mining, access_heads_vault, access_mining_station,
- access_clown, access_mime, access_hop, access_RC_announce, access_keycard_auth, access_gateway)
- minimal_access = list(access_security, access_sec_doors, access_brig, access_court, access_forensics_lockers,
+ access_chapel_office, access_library, access_research, access_mining, access_heads_vault, access_mining_station,
+ access_hop, access_RC_announce, access_keycard_auth, access_gateway)
+ minimal_access = list(access_security, access_sec_doors, access_brig, access_forensics_lockers,
access_medical, access_engine, access_change_ids, access_ai_upload, access_eva, access_heads,
access_all_personal_lockers, access_maint_tunnels, access_bar, access_janitor, access_construction, access_morgue,
access_crematorium, access_kitchen, access_cargo, access_cargo_bot, access_mailsorting, access_qm, access_hydroponics, access_lawyer,
- access_theatre, access_chapel_office, access_library, access_research, access_mining, access_heads_vault, access_mining_station,
- access_clown, access_mime, access_hop, access_RC_announce, access_keycard_auth, access_gateway)
+ access_chapel_office, access_library, access_research, access_mining, access_heads_vault, access_mining_station,
+ access_hop, access_RC_announce, access_keycard_auth, access_gateway)
equip(var/mob/living/carbon/human/H)
diff --git a/code/game/jobs/job/civilian.dm b/code/game/jobs/job/civilian.dm
index f45af97286a..5a2d515679b 100644
--- a/code/game/jobs/job/civilian.dm
+++ b/code/game/jobs/job/civilian.dm
@@ -311,11 +311,11 @@
faction = "Station"
total_positions = 2
spawn_positions = 2
- supervisors = "Nanotrasen officials and Corporate Regulations"
+ supervisors = "company officials and Corporate Regulations"
selection_color = "#dddddd"
economic_modifier = 7
- access = list(access_lawyer, access_court, access_sec_doors, access_maint_tunnels, access_heads)
- minimal_access = list(access_lawyer, access_court, access_sec_doors, access_heads)
+ access = list(access_lawyer, access_sec_doors, access_maint_tunnels, access_heads)
+ minimal_access = list(access_lawyer, access_sec_doors, access_heads)
equip(var/mob/living/carbon/human/H)
diff --git a/code/game/jobs/job/security.dm b/code/game/jobs/job/security.dm
index 8a9461302db..3456a2ef6aa 100644
--- a/code/game/jobs/job/security.dm
+++ b/code/game/jobs/job/security.dm
@@ -12,11 +12,11 @@
idtype = /obj/item/weapon/card/id/silver
req_admin_notify = 1
economic_modifier = 10
- access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, access_court,
+ access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory,
access_forensics_lockers, access_morgue, access_maint_tunnels, access_all_personal_lockers,
access_research, access_engine, access_mining, access_medical, access_construction, access_mailsorting,
access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway, access_external_airlocks)
- minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, access_court,
+ minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory,
access_forensics_lockers, access_morgue, access_maint_tunnels, access_all_personal_lockers,
access_research, access_engine, access_mining, access_medical, access_construction, access_mailsorting,
access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway, access_external_airlocks)
@@ -56,8 +56,8 @@
supervisors = "the head of security"
selection_color = "#ffeeee"
economic_modifier = 5
- access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, access_court, access_maint_tunnels, access_morgue, access_external_airlocks)
- minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, access_court, access_maint_tunnels, access_external_airlocks)
+ access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, access_maint_tunnels, access_morgue, access_external_airlocks)
+ minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, access_maint_tunnels, access_external_airlocks)
minimal_player_age = 5
equip(var/mob/living/carbon/human/H)
@@ -88,14 +88,14 @@
department = "Security"
department_flag = ENGSEC
faction = "Station"
- total_positions = 2
+ total_positions = 1
spawn_positions = 2
supervisors = "the head of security"
selection_color = "#ffeeee"
alt_titles = list("Forensic Technician")
economic_modifier = 5
- access = list(access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_court)
- minimal_access = list(access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_court)
+ access = list(access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels)
+ minimal_access = list(access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels)
alt_titles = list("Forensic Technician")
minimal_player_age = 3
equip(var/mob/living/carbon/human/H)
@@ -131,13 +131,13 @@
department = "Security"
department_flag = ENGSEC
faction = "Station"
- total_positions = 3
- spawn_positions = 3
+ total_positions = 4
+ spawn_positions = 4
supervisors = "the head of security"
selection_color = "#ffeeee"
economic_modifier = 4
- access = list(access_security, access_eva, access_sec_doors, access_brig, access_court, access_maint_tunnels, access_morgue, access_external_airlocks)
- minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_court, access_maint_tunnels, access_external_airlocks)
+ access = list(access_security, access_eva, access_sec_doors, access_brig, access_maint_tunnels, access_morgue, access_external_airlocks)
+ minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_maint_tunnels, access_external_airlocks)
minimal_player_age = 3
equip(var/mob/living/carbon/human/H)
if(!H) return 0
diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm
index ff994e8cd3b..f3757559823 100644
--- a/code/game/jobs/job_controller.dm
+++ b/code/game/jobs/job_controller.dm
@@ -528,7 +528,7 @@ var/global/datum/controller/occupations/job_master
if(C)
C.rank = rank
C.assignment = title ? title : rank
- C.set_owner_info(H)
+ H.set_id_info(C)
//put the player's account number onto the ID
if(H.mind && H.mind.initial_account)
diff --git a/code/game/machinery/CableLayer.dm b/code/game/machinery/CableLayer.dm
index b50e605825a..277742a22be 100644
--- a/code/game/machinery/CableLayer.dm
+++ b/code/game/machinery/CableLayer.dm
@@ -20,10 +20,10 @@
/obj/machinery/cablelayer/attack_hand(mob/user as mob)
if(!cable&&!on)
- user << "\The [src] don't work with no cable."
+ user << "\The [src] doesn't have any cable loaded."
return
on=!on
- user.visible_message("\The [src] [!on?"dea":"a"]ctivated.", "[user] [!on?"dea":"a"]ctivated \the [src].")
+ user.visible_message("\The [user] [!on?"dea":"a"]ctivates \the [src].", "You switch [src] [on? "on" : "off"]")
return
/obj/machinery/cablelayer/attackby(var/obj/item/O as obj, var/mob/user as mob)
@@ -31,26 +31,27 @@
var/result = load_cable(O)
if(!result)
- user << "Reel is full."
+ user << "\The [src]'s cable reel is full."
else
- user << "[result] meters of cable successfully loaded."
+ user << "You load [result] lengths of cable into [src]."
return
- if(istype(O, /obj/item/weapon/screwdriver))
+ if(istype(O, /obj/item/weapon/wirecutters))
if(cable && cable.amount)
var/m = round(input(usr,"Please specify the length of cable to cut","Cut cable",min(cable.amount,30)) as num, 1)
m = min(m, cable.amount)
m = min(m, 30)
if(m)
+ playsound(loc, 'sound/items/Wirecutter.ogg', 50, 1)
use_cable(m)
var/obj/item/stack/cable_coil/CC = new (get_turf(src))
CC.amount = m
else
- usr << "There's no more cable on the reel."
+ usr << "There's no more cable on the reel."
/obj/machinery/cablelayer/examine(mob/user)
..()
- user << "\The [src] has [cable.amount] meter\s."
+ user << "\The [src]'s cable reel has [cable.amount] length\s left."
/obj/machinery/cablelayer/proc/load_cable(var/obj/item/stack/cable_coil/CC)
if(istype(CC) && CC.amount)
@@ -70,12 +71,11 @@
/obj/machinery/cablelayer/proc/use_cable(amount)
if(!cable || cable.amount<1)
- visible_message("Cable depleted, [src] deactivated.")
+ visible_message("A red light flashes on \the [src].")
return
-/* if(cable.amount < amount)
- visible_message("No enough cable to finish the task.")
- return*/
cable.use(amount)
+ if(deleted(cable))
+ cable = null
return 1
/obj/machinery/cablelayer/proc/reset()
diff --git a/code/game/machinery/autolathe_datums.dm b/code/game/machinery/autolathe_datums.dm
index 889a076d590..700f0686d03 100644
--- a/code/game/machinery/autolathe_datums.dm
+++ b/code/game/machinery/autolathe_datums.dm
@@ -396,6 +396,12 @@
hidden = 1
category = "Devices and Components"
+/datum/autolathe/recipe/beartrap
+ name = "mechanical trap"
+ path = /obj/item/weapon/beartrap
+ hidden = 1
+ category = "Devices and Components"
+
/datum/autolathe/recipe/welder_industrial
name = "industrial welding tool"
path = /obj/item/weapon/weldingtool/largetank
diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm
index 9dc39f257b3..19ea17104a6 100644
--- a/code/game/machinery/camera/camera.dm
+++ b/code/game/machinery/camera/camera.dm
@@ -8,7 +8,7 @@
active_power_usage = 10
layer = 5
- var/list/network = list("Exodus")
+ var/list/network = list(NETWORK_EXODUS)
var/c_tag = null
var/c_tag_order = 999
var/status = 1
@@ -186,6 +186,7 @@
src.bugged = 1
else if(W.damtype == BRUTE || W.damtype == BURN) //bashing cameras
+ user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
if (W.force >= src.toughness)
user.do_attack_animation(src)
visible_message("[src] has been [pick(W.attack_verb)] with [W] by [user]!")
@@ -301,6 +302,9 @@
/obj/machinery/camera/proc/can_see()
var/list/see = null
var/turf/pos = get_turf(src)
+ if(!pos)
+ return list()
+
if(isXRay())
see = range(view_range, pos)
else
diff --git a/code/game/machinery/camera/camera_assembly.dm b/code/game/machinery/camera/camera_assembly.dm
index 75397278c03..2b496ecdbbe 100644
--- a/code/game/machinery/camera/camera_assembly.dm
+++ b/code/game/machinery/camera/camera_assembly.dm
@@ -78,7 +78,7 @@
if(isscrewdriver(W))
playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
- var/input = sanitize(input(usr, "Which networks would you like to connect this camera to? Separate networks with a comma. No Spaces!\nFor example: Exodus,Security,Secret ", "Set Network", "Exodus"))
+ var/input = sanitize(input(usr, "Which networks would you like to connect this camera to? Separate networks with a comma. No Spaces!\nFor example: Exodus,Security,Secret ", "Set Network", NETWORK_EXODUS))
if(!input)
usr << "No input found please hang up and try your call again."
return
diff --git a/code/game/machinery/camera/tracking.dm b/code/game/machinery/camera/tracking.dm
index 65324f5555f..739583ede88 100644
--- a/code/game/machinery/camera/tracking.dm
+++ b/code/game/machinery/camera/tracking.dm
@@ -223,6 +223,9 @@ mob/living/proc/near_camera()
/mob/living/proc/tracking_status()
// Easy checks first.
// Don't detect mobs on Centcom. Since the wizard den is on Centcomm, we only need this.
+ var/obj/item/weapon/card/id/id = GetIdCard()
+ if(id && id.prevent_tracking())
+ return TRACKING_TERMINATE
if(InvalidPlayerTurf(get_turf(src)))
return TRACKING_TERMINATE
if(invisibility >= INVISIBILITY_LEVEL_ONE) //cloaked
@@ -240,14 +243,8 @@ mob/living/proc/near_camera()
if(. == TRACKING_NO_COVERAGE)
return camera && camera.can_use() ? TRACKING_POSSIBLE : TRACKING_NO_COVERAGE
-/mob/living/silicon/robot/syndicate/tracking_status()
- return TRACKING_TERMINATE
-
/mob/living/carbon/human/tracking_status()
//Cameras can't track people wearing an agent card or a ninja hood.
- var/obj/item/weapon/card/id/id = GetIdCard(src)
- if(id && id.prevent_tracking())
- return TRACKING_TERMINATE
if(istype(head, /obj/item/clothing/head/helmet/space/rig))
var/obj/item/clothing/head/helmet/space/rig/helmet = head
if(helmet.prevent_track())
diff --git a/code/game/machinery/computer/atmos_control.dm b/code/game/machinery/computer/atmos_control.dm
index 5f285f6d45e..9f1b7afb383 100644
--- a/code/game/machinery/computer/atmos_control.dm
+++ b/code/game/machinery/computer/atmos_control.dm
@@ -20,7 +20,7 @@
/obj/machinery/computer/atmoscontrol/laptop
name = "Atmospherics Laptop"
- desc = "Cheap Nanotrasen Laptop."
+ desc = "A cheap laptop."
icon_state = "laptop"
icon_keyboard = "laptop_key"
density = 0
diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm
index 8d85a63224c..4b8b9a9acf3 100644
--- a/code/game/machinery/computer/camera.dm
+++ b/code/game/machinery/computer/camera.dm
@@ -257,3 +257,7 @@
icon_state = "syndicam"
network = list("NUKE")
circuit = null
+
+/obj/machinery/computer/security/nuclear/New()
+ ..()
+ req_access = list(150)
diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm
index e39c1eebe60..b949e284b87 100644
--- a/code/game/machinery/computer/card.dm
+++ b/code/game/machinery/computer/card.dm
@@ -2,7 +2,7 @@
/obj/machinery/computer/card
name = "\improper ID card modification console"
- desc = "Terminal for programming NanoTrasen employee ID cards to access parts of the station."
+ desc = "Terminal for programming employee ID cards to access parts of the station."
icon_keyboard = "id_key"
icon_screen = "id"
light_color = "#0099ff"
@@ -59,12 +59,10 @@
if(!istype(id_card))
return ..()
- if(!scan && access_change_ids in id_card.access)
- user.drop_item()
+ if(!scan && (access_change_ids in id_card.access) && user.unEquip(id_card))
id_card.loc = src
scan = id_card
else if(!modify)
- user.drop_item()
id_card.loc = src
modify = id_card
@@ -157,8 +155,7 @@
modify = null
else
var/obj/item/I = usr.get_active_hand()
- if (istype(I, /obj/item/weapon/card/id))
- usr.drop_item()
+ if (istype(I, /obj/item/weapon/card/id) && usr.unEquip(I))
I.loc = src
modify = I
diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm
index 360a986afa8..bf695cd1631 100644
--- a/code/game/machinery/computer/communications.dm
+++ b/code/game/machinery/computer/communications.dm
@@ -190,12 +190,12 @@
if(!is_relay_online())//Contact Centcom has a check, Syndie doesn't to allow for Traitor funs.
usr <<"No Emergency Bluespace Relay detected. Unable to transmit message."
return
- var/input = sanitize(input("Please choose a message to transmit to Centcomm via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response. There is a 30 second delay before you may send another message, be clear, full and concise.", "To abort, send an empty message.", ""))
+ var/input = sanitize(input("Please choose a message to transmit to [boss_short] via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response. There is a 30 second delay before you may send another message, be clear, full and concise.", "To abort, send an empty message.", ""))
if(!input || !(usr in view(1,src)))
return
Centcomm_announce(input, usr)
usr << "Message transmitted."
- log_say("[key_name(usr)] has made an IA Centcomm announcement: [input]")
+ log_say("[key_name(usr)] has made an IA [boss_short] announcement: [input]")
centcomm_message_cooldown = 1
spawn(300)//30 second cooldown
centcomm_message_cooldown = 0
@@ -304,7 +304,7 @@
if (src.authenticated==1)
dat += "
\[ Make An Announcement \]"
if(src.emagged == 0)
- dat += "
\[ Send an emergency message to Centcomm \]"
+ dat += "
\[ Send an emergency message to [boss_short] \]"
else
dat += "
\[ Send an emergency message to \[UNKNOWN\] \]"
dat += "
\[ Restore Backup Routing Data \]"
@@ -435,7 +435,7 @@
return
if(deathsquad.deployed)
- user << "Centcom will not allow the shuttle to be called. Consider all contracts terminated."
+ user << "[boss_short] will not allow the shuttle to be called. Consider all contracts terminated."
return
if(emergency_shuttle.deny_shuttle)
@@ -447,7 +447,7 @@
return
if(emergency_shuttle.going_to_centcom())
- user << "The emergency shuttle may not be called while returning to CentCom."
+ user << "The emergency shuttle may not be called while returning to [boss_short]."
return
if(emergency_shuttle.online())
@@ -470,7 +470,7 @@
return
if(emergency_shuttle.going_to_centcom())
- user << "The shuttle may not be called while returning to CentCom."
+ user << "The shuttle may not be called while returning to [boss_short]."
return
if(emergency_shuttle.online())
@@ -480,11 +480,11 @@
// if force is 0, some things may stop the shuttle call
if(!force)
if(emergency_shuttle.deny_shuttle)
- user << "Centcom does not currently have a shuttle available in your sector. Please try again later."
+ user << "[boss_short] does not currently have a shuttle available in your sector. Please try again later."
return
if(deathsquad.deployed == 1)
- user << "Centcom will not allow the shuttle to be called. Consider all contracts terminated."
+ user << "[boss_short] will not allow the shuttle to be called. Consider all contracts terminated."
return
if(world.time < 54000) // 30 minute grace period to let the game get going
diff --git a/code/game/machinery/computer/guestpass.dm b/code/game/machinery/computer/guestpass.dm
index 7258fc543be..ccbce91b619 100644
--- a/code/game/machinery/computer/guestpass.dm
+++ b/code/game/machinery/computer/guestpass.dm
@@ -62,13 +62,14 @@
/obj/machinery/computer/guestpass/attackby(obj/O, mob/user)
if(istype(O, /obj/item/weapon/card/id))
- if(!giver)
- user.drop_item()
+ if(!giver && user.unEquip(O))
O.loc = src
giver = O
updateUsrDialog()
- else
+ else if(giver)
user << "There is already ID card inside."
+ return
+ ..()
/obj/machinery/computer/guestpass/attack_ai(var/mob/user as mob)
return attack_hand(user)
@@ -151,8 +152,7 @@
accesses.Cut()
else
var/obj/item/I = usr.get_active_hand()
- if (istype(I, /obj/item/weapon/card/id))
- usr.drop_item()
+ if (istype(I, /obj/item/weapon/card/id) && usr.unEquip(I))
I.loc = src
giver = I
updateUsrDialog()
diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm
index 92d9e9a83f6..15c504800a8 100644
--- a/code/game/machinery/computer/medical.dm
+++ b/code/game/machinery/computer/medical.dm
@@ -35,13 +35,13 @@
usr << "There is nothing to remove from the console."
return
-/obj/machinery/computer/med_data/attackby(obj/item/O as obj, user as mob)
- if(istype(O, /obj/item/weapon/card/id) && !scan)
- usr.drop_item()
+/obj/machinery/computer/med_data/attackby(var/obj/item/O, var/mob/user)
+ if(istype(O, /obj/item/weapon/card/id) && !scan && user.unEquip(O))
O.loc = src
scan = O
- user << "You insert [O]."
- ..()
+ user << "You insert \the [O]."
+ else
+ ..()
/obj/machinery/computer/med_data/attack_ai(user as mob)
return src.attack_hand(user)
@@ -552,7 +552,7 @@
/obj/machinery/computer/med_data/laptop
name = "Medical Laptop"
- desc = "Cheap Nanotrasen Laptop."
+ desc = "A cheap laptop."
icon_state = "laptop"
icon_keyboard = "laptop_key"
icon_screen = "medlaptop"
diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm
index 090e02c9080..eba129df262 100644
--- a/code/game/machinery/computer/security.dm
+++ b/code/game/machinery/computer/security.dm
@@ -248,8 +248,7 @@ What a mess.*/
scan = null
else
var/obj/item/I = usr.get_active_hand()
- if (istype(I, /obj/item/weapon/card/id))
- usr.drop_item()
+ if (istype(I, /obj/item/weapon/card/id) && usr.unEquip(I))
I.loc = src
scan = I
diff --git a/code/game/machinery/computer/skills.dm b/code/game/machinery/computer/skills.dm
index fb2d4ef0959..fca6cf40242 100644
--- a/code/game/machinery/computer/skills.dm
+++ b/code/game/machinery/computer/skills.dm
@@ -24,13 +24,13 @@
var/sortBy = "name"
var/order = 1 // -1 = Descending - 1 = Ascending
-/obj/machinery/computer/skills/attackby(obj/item/O as obj, user as mob)
- if(istype(O, /obj/item/weapon/card/id) && !scan)
- usr.drop_item()
+/obj/machinery/computer/skills/attackby(obj/item/O as obj, var/mob/user)
+ if(istype(O, /obj/item/weapon/card/id) && !scan && user.unEquip(O))
O.loc = src
scan = O
user << "You insert [O]."
- ..()
+ else
+ ..()
/obj/machinery/computer/skills/attack_ai(mob/user as mob)
return attack_hand(user)
@@ -185,8 +185,7 @@ What a mess.*/
scan = null
else
var/obj/item/I = usr.get_active_hand()
- if (istype(I, /obj/item/weapon/card/id))
- usr.drop_item()
+ if (istype(I, /obj/item/weapon/card/id) && usr.unEquip(I))
I.loc = src
scan = I
diff --git a/code/game/machinery/computer/specops_shuttle.dm b/code/game/machinery/computer/specops_shuttle.dm
index 8ac4f32c9c0..0d38129504f 100644
--- a/code/game/machinery/computer/specops_shuttle.dm
+++ b/code/game/machinery/computer/specops_shuttle.dm
@@ -89,7 +89,7 @@ var/specops_shuttle_timeleft = 0
for(var/turf/T in get_area_turfs(end_location) )
var/mob/M = locate(/mob) in T
- M << "You have arrived at Central Command. Operation has ended!"
+ M << "You have arrived at [boss_name]. Operation has ended!"
specops_shuttle_at_station = 0
@@ -286,14 +286,14 @@ var/specops_shuttle_timeleft = 0
if(!specops_shuttle_at_station|| specops_shuttle_moving_to_station || specops_shuttle_moving_to_centcom) return
if (!specops_can_move())
- usr << "Central Command will not allow the Special Operations shuttle to return yet."
+ usr << "[boss_name] will not allow the Special Operations shuttle to return yet."
if(world.timeofday <= specops_shuttle_timereset)
if (((world.timeofday - specops_shuttle_timereset)/10) > 60)
usr << "[-((world.timeofday - specops_shuttle_timereset)/10)/60] minutes remain!"
usr << "[-(world.timeofday - specops_shuttle_timereset)/10] seconds remain!"
return
- usr << "The Special Operations shuttle will arrive at Central Command in [(SPECOPS_MOVETIME/10)] seconds."
+ usr << "The Special Operations shuttle will arrive at [boss_name] in [(SPECOPS_MOVETIME/10)] seconds."
temp += "Shuttle departing.
OK"
updateUsrDialog()
diff --git a/code/game/machinery/computer3/NTOS.dm b/code/game/machinery/computer3/NTOS.dm
index 5119084f0e6..8b37c237322 100644
--- a/code/game/machinery/computer3/NTOS.dm
+++ b/code/game/machinery/computer3/NTOS.dm
@@ -3,7 +3,7 @@
*/
/datum/file/program/ntos
- name = "Nanotrasen Operating System"
+ name = "NanoTrasen Operating System"
extension = "prog"
active_state = "ntos"
var/obj/item/part/computer/storage/current // the drive being viewed, null for desktop/computer
@@ -89,7 +89,7 @@
var/dat = {"