Merge branch 'dev' into ofMechfabAndPanic

Conflicts:
	code/game/mecha/mech_fabricator.dm
	maps/exodus-1.dmm
This commit is contained in:
Kelenius
2015-08-24 18:16:36 +03:00
294 changed files with 7810 additions and 7252 deletions
+1 -1
View File
@@ -5,7 +5,7 @@ sudo: false
env:
BYOND_MAJOR="508"
BYOND_MINOR="1293"
MACRO_COUNT=1210
MACRO_COUNT=1174
cache:
directories:
+41 -2
View File
@@ -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"
+1 -1
View File
@@ -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
+7 -9
View File
@@ -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.
+3 -2
View File
@@ -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
+2
View File
@@ -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/////
//////////////////////////
+1 -1
View File
@@ -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()
+1 -1
View File
@@ -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
+4 -1
View File
@@ -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
+31 -19
View File
@@ -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
+46 -51
View File
@@ -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)
+1 -11
View File
@@ -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
+3 -8
View File
@@ -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
+2
View File
@@ -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("<span class='danger'>[src] has been hit by [user] with [W].</span>")
/mob/living/attackby(obj/item/I, mob/user)
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
if(istype(I) && ismob(user))
I.attack(src, user)
+3 -3
View File
@@ -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)
-9
View File
@@ -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)
+32 -11
View File
@@ -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
+3 -3
View File
@@ -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 << "<span class='notice'>Your mind won't reach that far.</span>"
return
+31
View File
@@ -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])"
+10 -1
View File
@@ -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])"
-15
View File
@@ -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])"
+4
View File
@@ -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
+4 -4
View File
@@ -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
+2 -2
View File
@@ -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.")
..()
+1 -3
View File
@@ -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"
+1 -1
View File
@@ -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)
+1 -1
View File
@@ -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
+8 -2
View File
@@ -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)
+1 -1
View File
@@ -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
+1 -2
View File
@@ -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)
+1 -1
View File
@@ -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()
+1 -1
View File
@@ -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
+3 -3
View File
@@ -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)
+5 -5
View File
@@ -124,7 +124,7 @@ var/datum/antagonist/ninja/ninjas
player << "<span class='danger'>You forgot to turn on your internals! Quickly, toggle the valve!</span>"
/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)
+1 -1
View File
@@ -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)
+3 -3
View File
@@ -104,9 +104,9 @@ var/datum/antagonist/cultist/cult
player.current.visible_message("<FONT size = 3>[player.current] looks like they just reverted to their old faith!</FONT>")
/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(!..())
+1
View File
@@ -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("<span class='danger'>The [src.name] has been attacked with \the [W][(user ? " by [user]." : ".")]</span>")
var/damage = 0
+9 -1
View File
@@ -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
@@ -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
@@ -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
+7 -1
View File
@@ -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
+2 -2
View File
@@ -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
+9 -1
View File
@@ -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
+3 -3
View File
@@ -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)
+38 -21
View File
@@ -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
+9 -22
View File
@@ -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
+7 -7
View File
@@ -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)
+3 -3
View File
@@ -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)
+11 -11
View File
@@ -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
+1 -1
View File
@@ -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)
+11 -11
View File
@@ -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 << "<span class='warning'>\The [src] doesn't have any cable loaded.</span>"
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 << "<span class='warning'>\The [src]'s cable reel is full.</span>"
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 << "<span class='warning'>There's no more cable on the reel.</span>"
/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()
+6
View File
@@ -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
+5 -1
View File
@@ -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("<span class='warning'><b>[src] has been [pick(W.attack_verb)] with [W] by [user]!</b></span>")
@@ -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
@@ -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
+3 -6
View File
@@ -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())
@@ -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
+4
View File
@@ -257,3 +257,7 @@
icon_state = "syndicam"
network = list("NUKE")
circuit = null
/obj/machinery/computer/security/nuclear/New()
..()
req_access = list(150)
+3 -6
View File
@@ -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
@@ -190,12 +190,12 @@
if(!is_relay_online())//Contact Centcom has a check, Syndie doesn't to allow for Traitor funs.
usr <<"<span class='warning'>No Emergency Bluespace Relay detected. Unable to transmit message.</span>"
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 << "<span class='notice'>Message transmitted.</span>"
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 += "<BR>\[ <A HREF='?src=\ref[src];operation=announce'>Make An Announcement</A> \]"
if(src.emagged == 0)
dat += "<BR>\[ <A HREF='?src=\ref[src];operation=MessageCentcomm'>Send an emergency message to Centcomm</A> \]"
dat += "<BR>\[ <A HREF='?src=\ref[src];operation=MessageCentcomm'>Send an emergency message to [boss_short]</A> \]"
else
dat += "<BR>\[ <A HREF='?src=\ref[src];operation=MessageSyndicate'>Send an emergency message to \[UNKNOWN\]</A> \]"
dat += "<BR>\[ <A HREF='?src=\ref[src];operation=RestoreBackup'>Restore Backup Routing Data</A> \]"
@@ -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
+5 -5
View File
@@ -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 << "<span class='warning'>There is already ID card inside.</span>"
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()
+6 -6
View File
@@ -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"
+1 -2
View File
@@ -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
+5 -6
View File
@@ -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
@@ -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 << "<span class='notice'>You have arrived at Central Command. Operation has ended!</span>"
M << "<span class='notice'>You have arrived at [boss_name]. Operation has ended!</span>"
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 << "<span class='notice'>Central Command will not allow the Special Operations shuttle to return yet.</span>"
usr << "<span class='notice'>[boss_name] will not allow the Special Operations shuttle to return yet.</span>"
if(world.timeofday <= specops_shuttle_timereset)
if (((world.timeofday - specops_shuttle_timereset)/10) > 60)
usr << "<span class='notice'>[-((world.timeofday - specops_shuttle_timereset)/10)/60] minutes remain!</span>"
usr << "<span class='notice'>[-(world.timeofday - specops_shuttle_timereset)/10] seconds remain!</span>"
return
usr << "<span class='notice'>The Special Operations shuttle will arrive at Central Command in [(SPECOPS_MOVETIME/10)] seconds.</span>"
usr << "<span class='notice'>The Special Operations shuttle will arrive at [boss_name] in [(SPECOPS_MOVETIME/10)] seconds.</span>"
temp += "Shuttle departing.<BR><BR><A href='?src=\ref[src];mainmenu=1'>OK</A>"
updateUsrDialog()
+3 -3
View File
@@ -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 = {"
<html>
<head>
<title>Nanotrasen Operating System</title>
<title>Operating System</title>
<style>
div.filewin {
position:absolute;
@@ -212,7 +212,7 @@
var/obj/item/part/computer/C = locate(href_list["viewperipheral"])
if(!istype(C) || (C.loc != src.computer))
return
if(istype(C,/obj/item/part/computer/storage))
current = C
interact()
@@ -37,7 +37,7 @@
/datum/file/program/arcade
desc = "The best arcade game ever produced by Nanotrasen's short-lived entertainment divison."
desc = "The best arcade game ever produced by the Company's short-lived entertainment divison."
//headcanon: they also ported E.T. for the atari 2600, superman 64, and basically every other movie tie-in game ever
active_state = "generic"
@@ -187,7 +187,7 @@
/datum/file/program/security
name = "camera monitor"
desc = "Connects to the Nanotrasen Camera Network"
desc = "Connects to the station camera network."
image = 'icons/ntos/camera.png'
active_state = "camera-static"
@@ -333,7 +333,7 @@
return get_all_centcom_jobs() + "Custom"
accessblock()
var/accesses = "<h5>Central Command:</h5>"
var/accesses = "<h5>[boss_name]:</h5>"
for(var/A in get_all_centcom_access())
if(A in writer.access)
accesses += topic_link(src,"access=[A]","<font color='red'>[replacetext(get_centcom_access_desc(A), " ", "&nbsp")]</font>") + " "
@@ -192,12 +192,12 @@
if(centcomm_message_cooldown)
usr << "Arrays recycling. Please stand by."
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.", "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.", "To abort, send an empty message.", ""))
if(!input || !interactable())
return
Centcomm_announce(input, usr)
usr << "Message transmitted."
log_say("[key_name(usr)] has made a Centcomm announcement: [input]")
log_say("[key_name(usr)] has made a [boss_short] announcement: [input]")
centcomm_message_cooldown = 1
spawn(600)//10 minute cooldown
centcomm_message_cooldown = 0
@@ -288,7 +288,7 @@
if (authenticated==2)
dat += "<BR>\[ <A HREF='?src=\ref[src];announce'>Make An Announcement</A> \]"
if(computer.emagged == 0)
dat += "<BR>\[ <A HREF='?src=\ref[src];MessageCentcomm'>Send an emergency message to Centcomm</A> \]"
dat += "<BR>\[ <A HREF='?src=\ref[src];MessageCentcomm'>Send an emergency message to [boss_short]</A> \]"
else
dat += "<BR>\[ <A HREF='?src=\ref[src];MessageSyndicate'>Send an emergency message to \[UNKNOWN\]</A> \]"
dat += "<BR>\[ <A HREF='?src=\ref[src];RestoreBackup'>Restore Backup Routing Data</A> \]"
@@ -181,7 +181,7 @@
scan = null
else
var/obj/item/I = usr.get_active_hand()
if (istype(I, /obj/item/weapon/card/id))
if (istype(I, /obj/item/weapon/card/id) && usr.drop_item(I))
computer.cardslot.insert(I, 1)
scan = I
@@ -194,7 +194,7 @@
scan2 = null
else
var/obj/item/I = usr.get_active_hand()
if (istype(I, /obj/item/weapon/card/id))
if (istype(I, /obj/item/weapon/card/id) && usr.drop_item(I))
computer.cardslot.insert(I, 2)
scan2 = I
@@ -254,7 +254,7 @@ What a mess.*/
scan = null
else
var/obj/item/I = usr.get_active_hand()
if (istype(I, /obj/item/weapon/card/id))
if (istype(I, /obj/item/weapon/card/id) && usr.drop_item(I))
computer.cardslot.insert(I, 1)
scan = I
@@ -267,7 +267,7 @@ What a mess.*/
scan2 = null
else
var/obj/item/I = usr.get_active_hand()
if (istype(I, /obj/item/weapon/card/id))
if (istype(I, /obj/item/weapon/card/id) && usr.drop_item(I))
computer.cardslot.insert(I, 2)
scan2 = I
@@ -15,13 +15,13 @@
return
var/dat = ""
dat += "<center><span style='font-size:24pt'><b>Welcome to NTOS</b></span></center>"
dat += "<center><span style='font-size:8pt'>Thank you for choosing NTOS, your gateway to the future of mobile computing technology, sponsored by Nanotrasen (R)</span></center><br>"
dat += "<center><span style='font-size:8pt'>Thank you for choosing NTOS, your gateway to the future of mobile computing technology, sponsored by [company_name] (R)</span></center><br>"
dat += "<span style='font-size:12pt'><b>Getting started with NTOS:</b></span><br>"
dat += "To leave a current program, click the X button in the top right corner of the window. This will return you to the NTOS desktop. \
From the desktop, you can open the hard drive, usually located in the top left corner to access all the programs installed on your computer. \
When you rented your laptop, you were supplied with programs that your Nanotrasen Issued ID has given you access to use. \
When you rented your laptop, you were supplied with programs that your [company_name] Issued ID has given you access to use. \
In the event of a serious error, the right click menu will give you the ability to reset your computer. To open and close your laptop, alt-click your device.\
If you have any questions or technical issues, please contact your local computer technical experts at your local Central Command."
If you have any questions or technical issues, please contact your local computer technical experts at your local [boss_name]."
popup.set_content(dat)
popup.set_title_image(usr.browse_rsc_icon(computer.icon, computer.icon_state))
popup.open()
+2 -2
View File
@@ -227,7 +227,7 @@
else
usr << "\icon[src]<span class='warning'>Unable to access account. Check security settings and try again.</span>"
else
usr << "\icon[src]<span class='warning'>Unable to access vendor account. Please record the machine ID and call CentComm Support.</span>"
usr << "\icon[src]<span class='warning'>Unable to access vendor account. Please record the machine ID and call [boss_short] Support.</span>"
else
transfer_and_vend(CH, C)
@@ -380,7 +380,7 @@
usr << "\icon[src]<span class='warning'>Unable to access account. Check security settings and try again.</span>"
return 0
else
usr << "\icon[src]<span class='warning'>Unable to access vendor account. Please record the machine ID and call CentComm Support.</span>"
usr << "\icon[src]<span class='warning'>Unable to access vendor account. Please record the machine ID and call [boss_short] Support.</span>"
return 0
else
transfer_and_reimburse(CH)
+4 -2
View File
@@ -64,7 +64,7 @@ for reference:
var/health = 100
var/maxhealth = 100
var/material/material
/obj/structure/barricade/New(var/newloc, var/material_name)
..(newloc)
if(!material_name)
@@ -77,7 +77,7 @@ for reference:
desc = "This space is blocked off by a barricade made of [material.display_name]."
color = material.icon_colour
maxhealth = material.integrity
health = maxhealth
health = maxhealth
/obj/structure/barricade/get_material()
return material
@@ -99,6 +99,7 @@ for reference:
return
return
else
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
switch(W.damtype)
if("fire")
src.health -= W.force * 1
@@ -111,6 +112,7 @@ for reference:
qdel(src)
return
..()
/obj/structure/barricade/proc/dismantle()
material.place_dismantled_product(get_turf(src))
qdel(src)
+2
View File
@@ -254,6 +254,7 @@
health = between(health, health + repairing.amount*DOOR_REPAIR_AMOUNT, maxhealth)
update_icon()
qdel(repairing)
repairing = null
return
if(repairing && istype(I, /obj/item/weapon/crowbar))
@@ -266,6 +267,7 @@
//psa to whoever coded this, there are plenty of objects that need to call attack() on doors without bludgeoning them.
if(src.density && istype(I, /obj/item/weapon) && user.a_intent == I_HURT && !istype(I, /obj/item/weapon/card))
var/obj/item/weapon/W = I
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
if(W.damtype == BRUTE || W.damtype == BURN)
user.do_attack_animation(src)
if(W.force < min_force)
+1
View File
@@ -229,6 +229,7 @@
//If it's a weapon, smash windoor. Unless it's an id card, agent card, ect.. then ignore it (Cards really shouldnt damage a door anyway)
if(src.density && istype(I, /obj/item/weapon) && !istype(I, /obj/item/weapon/card))
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
var/aforce = I.force
playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1)
visible_message("<span class='danger'>[src] was hit by [I].</span>")
+14 -14
View File
@@ -123,7 +123,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
/obj/machinery/newscaster
name = "newscaster"
desc = "A standard Nanotrasen-licensed newsfeed handler for use in commercial space stations. All the news you absolutely have no use for, in one place!"
desc = "A standard newsfeed handler for use on commercial space stations. All the news you absolutely have no use for, in one place!"
icon = 'icons/obj/terminals.dmi'
icon_state = "newscaster_normal"
var/isbroken = 0 //1 if someone banged it with something heavy
@@ -277,7 +277,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
dat+="<HR><B>Feed Security functions:</B><BR>"
dat+="<BR><A href='?src=\ref[src];menu_wanted=1'>[(wanted_already) ? ("Manage") : ("Publish")] \"Wanted\" Issue</A>"
dat+="<BR><A href='?src=\ref[src];menu_censor_story=1'>Censor Feed Stories</A>"
dat+="<BR><A href='?src=\ref[src];menu_censor_channel=1'>Mark Feed Channel with Nanotrasen D-Notice</A>"
dat+="<BR><A href='?src=\ref[src];menu_censor_channel=1'>Mark Feed Channel with [company_name] D-Notice</A>"
dat+="<BR><HR>The newscaster recognises you as: <FONT COLOR='green'>[src.scanned_user]</FONT>"
if(1)
dat+= "Station Feed Channels<HR>"
@@ -358,7 +358,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
if(9)
dat+="<B>[src.viewing_channel.channel_name]: </B><FONT SIZE=1>\[created by: <FONT COLOR='maroon'>[src.viewing_channel.author]</FONT>\]</FONT><HR>"
if(src.viewing_channel.censored)
dat+="<FONT COLOR='red'><B>ATTENTION: </B></FONT>This channel has been deemed as threatening to the welfare of the station, and marked with a Nanotrasen D-Notice.<BR>"
dat+="<FONT COLOR='red'><B>ATTENTION: </B></FONT>This channel has been deemed as threatening to the welfare of the station, and marked with a [company_name] D-Notice.<BR>"
dat+="No further feed story additions are allowed while the D-Notice is in effect.</FONT><BR><BR>"
else
if( isemptylist(src.viewing_channel.messages) )
@@ -378,7 +378,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
dat+="<BR><HR><A href='?src=\ref[src];refresh=1'>Refresh</A>"
dat+="<BR><A href='?src=\ref[src];setScreen=[1]'>Back</A>"
if(10)
dat+="<B>Nanotrasen Feed Censorship Tool</B><BR>"
dat+="<B>[company_name] Feed Censorship Tool</B><BR>"
dat+="<FONT SIZE=1>NOTE: Due to the nature of news Feeds, total deletion of a Feed Story is not possible.<BR>"
dat+="Keep in mind that users attempting to view a censored feed will instead see the \[REDACTED\] tag above it.</FONT>"
dat+="<HR>Select Feed channel to get Stories from:<BR>"
@@ -389,7 +389,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
dat+="<A href='?src=\ref[src];pick_censor_channel=\ref[CHANNEL]'>[CHANNEL.channel_name]</A> [(CHANNEL.censored) ? ("<FONT COLOR='red'>***</FONT>") : ()]<BR>"
dat+="<BR><A href='?src=\ref[src];setScreen=[0]'>Cancel</A>"
if(11)
dat+="<B>Nanotrasen D-Notice Handler</B><HR>"
dat+="<B>[company_name] D-Notice Handler</B><HR>"
dat+="<FONT SIZE=1>A D-Notice is to be bestowed upon the channel if the handling Authority deems it as harmful for the station's"
dat+="morale, integrity or disciplinary behaviour. A D-Notice will render a channel unable to be updated by anyone, without deleting any feed"
dat+="stories it might contain at the time. You can lift a D-Notice if you have the required access at any time.</FONT><HR>"
@@ -416,7 +416,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
dat+="<B>[src.viewing_channel.channel_name]: </B><FONT SIZE=1>\[ created by: <FONT COLOR='maroon'>[src.viewing_channel.author]</FONT> \]</FONT><BR>"
dat+="Channel messages listed below. If you deem them dangerous to the station, you can <A href='?src=\ref[src];toggle_d_notice=\ref[src.viewing_channel]'>Bestow a D-Notice upon the channel</A>.<HR>"
if(src.viewing_channel.censored)
dat+="<FONT COLOR='red'><B>ATTENTION: </B></FONT>This channel has been deemed as threatening to the welfare of the station, and marked with a Nanotrasen D-Notice.<BR>"
dat+="<FONT COLOR='red'><B>ATTENTION: </B></FONT>This channel has been deemed as threatening to the welfare of the station, and marked with a [company_name] D-Notice.<BR>"
dat+="No further feed story additions are allowed while the D-Notice is in effect.</FONT><BR><BR>"
else
if( isemptylist(src.viewing_channel.messages) )
@@ -622,7 +622,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
src.screen = 15
else
if(news_network.wanted_issue.is_admin_message)
alert("The wanted issue has been distributed by a Nanotrasen higherup. You cannot edit it.","Ok")
alert("The wanted issue has been distributed by a [company_name] higherup. You cannot edit it.","Ok")
return
news_network.wanted_issue.author = src.channel_name
news_network.wanted_issue.body = src.msg
@@ -635,7 +635,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
else if(href_list["cancel_wanted"])
if(news_network.wanted_issue.is_admin_message)
alert("The wanted issue has been distributed by a Nanotrasen higherup. You cannot take it down.","Ok")
alert("The wanted issue has been distributed by a [company_name] higherup. You cannot take it down.","Ok")
return
var/choice = alert("Please confirm Wanted Issue removal","Network Security Handler","Confirm","Cancel")
if(choice=="Confirm")
@@ -651,7 +651,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
else if(href_list["censor_channel_author"])
var/datum/feed_channel/FC = locate(href_list["censor_channel_author"])
if(FC.is_admin_channel)
alert("This channel was created by a Nanotrasen Officer. You cannot censor it.","Ok")
alert("This channel was created by a [company_name] Officer. You cannot censor it.","Ok")
return
if(FC.author != "<B>\[REDACTED\]</B>")
FC.backup_author = FC.author
@@ -664,7 +664,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
else if(href_list["censor_channel_story_author"])
var/datum/feed_message/MSG = locate(href_list["censor_channel_story_author"])
if(MSG.is_admin_message)
alert("This message was created by a Nanotrasen Officer. You cannot censor its author.","Ok")
alert("This message was created by a [company_name] Officer. You cannot censor its author.","Ok")
return
if(MSG.author != "<B>\[REDACTED\]</B>")
MSG.backup_author = MSG.author
@@ -677,7 +677,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
else if(href_list["censor_channel_story_body"])
var/datum/feed_message/MSG = locate(href_list["censor_channel_story_body"])
if(MSG.is_admin_message)
alert("This channel was created by a Nanotrasen Officer. You cannot censor it.","Ok")
alert("This channel was created by a [company_name] Officer. You cannot censor it.","Ok")
return
if(MSG.body != "<B>\[REDACTED\]</B>")
MSG.backup_body = MSG.body
@@ -703,7 +703,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
else if(href_list["toggle_d_notice"])
var/datum/feed_channel/FC = locate(href_list["toggle_d_notice"])
if(FC.is_admin_channel)
alert("This channel was created by a Nanotrasen Officer. You cannot place a D-Notice upon it.","Ok")
alert("This channel was created by a [company_name] Officer. You cannot place a D-Notice upon it.","Ok")
return
FC.censored = !FC.censored
FC.update()
@@ -806,7 +806,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
/obj/item/weapon/newspaper
name = "newspaper"
desc = "An issue of The Griffon, the newspaper circulating aboard Nanotrasen Space Stations."
desc = "An issue of The Griffon, the newspaper circulating aboard most stations."
icon = 'icons/obj/bureaucracy.dmi'
icon_state = "newspaper"
w_class = 2 //Let's make it fit in trashbags!
@@ -827,7 +827,7 @@ obj/item/weapon/newspaper/attack_self(mob/user as mob)
switch(screen)
if(0) //Cover
dat+="<DIV ALIGN='center'><B><FONT SIZE=6>The Griffon</FONT></B></div>"
dat+="<DIV ALIGN='center'><FONT SIZE=2>Nanotrasen-standard newspaper, for use on Nanotrasen© Space Facilities</FONT></div><HR>"
dat+="<DIV ALIGN='center'><FONT SIZE=2>[company_name]-standard newspaper, for use on [company_name]© Space Facilities</FONT></div><HR>"
if(isemptylist(src.news_content))
if(src.important_message)
dat+="Contents:<BR><ul><B><FONT COLOR='red'>**</FONT>Important Security Announcement<FONT COLOR='red'>**</FONT></B> <FONT SIZE=2>\[page [src.pages+2]\]</FONT><BR></ul>"
-124
View File
@@ -1,124 +0,0 @@
#define TURRET_PRIORITY_TARGET 2
#define TURRET_SECONDARY_TARGET 1
#define TURRET_NOT_TARGET 0
/obj/machinery/porta_turret/tag
// Reasonable defaults, in case someone manually spawns us
var/lasercolor = "r" //Something to do with lasertag turrets, blame Sieve for not adding a comment.
installation = /obj/item/weapon/gun/energy/lasertag/red
/obj/machinery/porta_turret/tag/red
/obj/machinery/porta_turret/tag/blue
lasercolor = "b"
installation = /obj/item/weapon/gun/energy/lasertag/blue
/obj/machinery/porta_turret/tag/New()
..()
icon_state = "[lasercolor]grey_target_prism"
/obj/machinery/porta_turret/tag/weapon_setup(var/obj/item/weapon/gun/energy/E)
switch(E.type)
if(/obj/item/weapon/gun/energy/lasertag/blue)
eprojectile = /obj/item/weapon/gun/energy/lasertag/blue
lasercolor = "b"
req_access = list(access_maint_tunnels, access_theatre)
check_arrest = 0
check_records = 0
check_weapons = 1
check_access = 0
check_anomalies = 0
shot_delay = 30
if(/obj/item/weapon/gun/energy/lasertag/red)
eprojectile = /obj/item/weapon/gun/energy/lasertag/red
lasercolor = "r"
req_access = list(access_maint_tunnels, access_theatre)
check_arrest = 0
check_records = 0
check_weapons = 1
check_access = 0
check_anomalies = 0
shot_delay = 30
iconholder = 1
/obj/machinery/porta_turret/tag/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
var/data[0]
data["access"] = !isLocked(user)
data["locked"] = locked
data["enabled"] = enabled
data["is_lethal"] = 0
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
ui = new(user, src, ui_key, "turret_control.tmpl", "Turret Controls", 500, 300)
ui.set_initial_data(data)
ui.open()
ui.set_auto_update(1)
/obj/machinery/porta_turret/tag/update_icon()
if(!anchored)
icon_state = "turretCover"
return
if(stat & BROKEN)
icon_state = "[lasercolor]destroyed_target_prism"
else
if(powered())
if(enabled)
if(iconholder)
//lasers have a orange icon
icon_state = "[lasercolor]orange_target_prism"
else
//almost everything has a blue icon
icon_state = "[lasercolor]target_prism"
else
icon_state = "[lasercolor]grey_target_prism"
else
icon_state = "[lasercolor]grey_target_prism"
/obj/machinery/porta_turret/tag/bullet_act(obj/item/projectile/Proj)
..()
if(lasercolor == "b" && disabled == 0)
if(istype(Proj, /obj/item/weapon/gun/energy/lasertag/red))
disabled = 1
qdel(Proj)
sleep(100)
disabled = 0
if(lasercolor == "r" && disabled == 0)
if(istype(Proj, /obj/item/weapon/gun/energy/lasertag/blue))
disabled = 1
qdel(Proj)
sleep(100)
disabled = 0
/obj/machinery/porta_turret/tag/assess_living(var/mob/living/L)
if(!L)
return TURRET_NOT_TARGET
if(L.lying)
return TURRET_NOT_TARGET
var/target_suit
var/target_weapon
switch(lasercolor)
if("b")
target_suit = /obj/item/clothing/suit/redtag
target_weapon = /obj/item/weapon/gun/energy/lasertag/red
if("r")
target_suit = /obj/item/clothing/suit/bluetag
target_weapon = /obj/item/weapon/gun/energy/lasertag/blue
if(target_suit)//Lasertag turrets target the opposing team, how great is that? -Sieve
if((istype(L.r_hand, target_weapon)) || (istype(L.l_hand, target_weapon)))
return TURRET_PRIORITY_TARGET
if(istype(L, /mob/living/carbon/human))
var/mob/living/carbon/human/H = L
if(istype(H.wear_suit, target_suit))
return TURRET_PRIORITY_TARGET
if(istype(H.belt, target_weapon))
return TURRET_SECONDARY_TARGET
return TURRET_NOT_TARGET
+13 -8
View File
@@ -3,6 +3,10 @@
This code is slightly more documented than normal, as requested by XSI on IRC.
*/
#define TURRET_PRIORITY_TARGET 2
#define TURRET_SECONDARY_TARGET 1
#define TURRET_NOT_TARGET 0
/obj/machinery/porta_turret
name = "turret"
icon = 'icons/obj/turrets.dmi'
@@ -334,7 +338,7 @@ var/list/turret_icons
else
//if the turret was attacked with the intention of harming it:
user.changeNext_move(NEXT_MOVE_DELAY)
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
take_damage(I.force * 0.5)
if(I.force * 0.5 > 1) //if the force of impact dealt at least 1 damage, the turret gets pissed off
if(!attacked && !emagged)
@@ -343,7 +347,7 @@ var/list/turret_icons
sleep(60)
attacked = 0
..()
/obj/machinery/porta_turret/emag_act(var/remaining_charges, var/mob/user)
if(!emagged)
//Emagging the turret makes it go bonkers and stun everyone. It also makes
@@ -503,7 +507,7 @@ var/list/turret_icons
if(isanimal(L) || issmall(L)) // Animals are not so dangerous
return check_anomalies ? TURRET_SECONDARY_TARGET : TURRET_NOT_TARGET
if(isxenomorph(L) || isalien(L)) // Xenos are dangerous
return check_anomalies ? TURRET_PRIORITY_TARGET : TURRET_NOT_TARGET
@@ -759,11 +763,7 @@ var/list/turret_icons
installation = I.type //installation becomes I.type
gun_charge = E.power_supply.charge //the gun's charge is stored in gun_charge
user << "<span class='notice'>You add [I] to the turret.</span>"
if(istype(installation, /obj/item/weapon/gun/energy/lasertag/blue) || istype(installation, /obj/item/weapon/gun/energy/lasertag/red))
target_type = /obj/machinery/porta_turret/tag
else
target_type = /obj/machinery/porta_turret
target_type = /obj/machinery/porta_turret
build_step = 4
qdel(I) //delete the gun :(
@@ -880,3 +880,8 @@ var/list/turret_icons
/atom/movable/porta_turret_cover
icon = 'icons/obj/turrets.dmi'
#undef TURRET_PRIORITY_TARGET
#undef TURRET_SECONDARY_TARGET
#undef TURRET_NOT_TARGET
+1 -1
View File
@@ -1,5 +1,5 @@
/obj/mecha/combat/durand
desc = "An aging combat exosuit utilized by the Nanotrasen corporation. Originally developed to combat hostile alien lifeforms."
desc = "An aging combat exosuit utilized by many corporations. Originally developed to combat hostile alien lifeforms."
name = "Durand"
icon_state = "durand"
initial_icon = "durand"
+1 -1
View File
@@ -17,7 +17,7 @@
max_equip = 3
/obj/mecha/combat/gygax/dark
desc = "A lightweight exosuit used by NanoTrasen Heavy Asset Protection. A significantly upgraded Gygax security mech."
desc = "A lightweight exosuit used by Heavy Asset Protection. A significantly upgraded Gygax security mech."
name = "Dark Gygax"
icon_state = "darkgygax"
initial_icon = "darkgygax"
+9 -3
View File
@@ -144,7 +144,7 @@
sync()
else
sync_message = ""
return 1
/obj/machinery/mecha_part_fabricator/attackby(var/obj/item/I, var/mob/user)
@@ -155,7 +155,7 @@
return
if(default_deconstruction_crowbar(user, I))
return
if(default_part_replacement(user, I))
if(default_part_replacement(user, I))
return
var/material
@@ -206,7 +206,7 @@
sleep(15)
visible_message("\icon[src] <b>[src]</b> beeps: \"User DB corrupted \[Code 0x00FA\]. Truncating data structure...\"")
sleep(30)
visible_message("\icon[src] <b>[src]</b> beeps: \"User DB truncated. Please contact your Nanotrasen system operator for future assistance.\"")
visible_message("\icon[src] <b>[src]</b> beeps: \"User DB truncated. Please contact your [company_name] system operator for future assistance.\"")
req_access = null
emagged = 1
return 1
@@ -335,13 +335,19 @@
/obj/machinery/mecha_part_fabricator/proc/sync()
sync_message = "Error: no console found."
world << "Syncing"
for(var/obj/machinery/computer/rdconsole/RDC in get_area_all_atoms(get_area(src)))
if(!RDC.sync)
continue
for(var/datum/tech/T in RDC.files.known_tech)
world << "Adding [T]"
sleep(3)
files.AddTech2Known(T)
for(var/datum/design/D in RDC.files.known_designs)
world << "Adding [D]"
sleep(3)
files.AddDesign2Known(D)
world << "Refreshing"
files.RefreshResearch()
sync_message = "Sync complete."
update_categories()
+3
View File
@@ -505,6 +505,7 @@
return
/obj/mecha/attack_hand(mob/user as mob)
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
src.log_message("Attack by hand/paw. Attacker - [user].",1)
if(istype(user,/mob/living/carbon/human))
@@ -664,6 +665,7 @@
return
/obj/mecha/proc/dynattackby(obj/item/weapon/W as obj, mob/user as mob)
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
src.log_message("Attacked by [W]. Attacker - [user]")
if(prob(src.deflect_chance))
user << "<span class='danger'>\The [W] bounces off [src.name].</span>"
@@ -1683,6 +1685,7 @@
/obj/mecha/attack_generic(var/mob/user, var/damage, var/attack_message)
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
if(!damage)
return 0
+3
View File
@@ -98,6 +98,7 @@
return
/obj/effect/alien/resin/attack_hand()
usr.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
if (HULK in usr.mutations)
usr << "<span class='notice'>You easily destroy the [name].</span>"
for(var/mob/O in oviewers(src))
@@ -124,6 +125,7 @@
/obj/effect/alien/resin/attackby(obj/item/weapon/W as obj, mob/user as mob)
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
var/aforce = W.force
health = max(0, health - aforce)
playsound(loc, 'sound/effects/attackblob.ogg', 100, 1)
@@ -231,6 +233,7 @@ Alien plants should do something if theres a lot of poison
return
/obj/effect/alien/weeds/attackby(var/obj/item/weapon/W, var/mob/user)
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
if(W.attack_verb.len)
visible_message("<span class='danger'>\The [src] have been [pick(W.attack_verb)] with \the [W][(user ? " by [user]." : ".")]</span>")
else
@@ -37,12 +37,12 @@
/datum/poster/bay_8
icon_state="bsposter8"
name = "Pinup Girl Cindy"
desc = "This particular one is of Nanotrasen's PR girl, Cindy, in a particularly feminine pose."
desc = "This particular one is of a historical corporate PR girl, Cindy, in a particularly feminine pose."
/datum/poster/bay_9
icon_state="bsposter9"
name = "Pinup Girl Amy"
desc = "This particular one is of Amy, the nymphomaniac Urban Legend of Nanotrasen Space Stations. How this photograph came to be is not known."
desc = "This particular one is of Amy, the nymphomaniac urban legend of deep space. How this photograph came to be is not known."
/datum/poster/bay_10
icon_state="bsposter10"
@@ -52,12 +52,12 @@
/datum/poster/bay_11
icon_state="bsposter11"
name = "Underwater Laboratory"
desc = "This particular one is of the fabled last crew of Nanotrasen's previous project before going big on phoron research."
desc = "This particular one is of the fabled last crew of a previous Company project."
/datum/poster/bay_12
icon_state="bsposter12"
name = "Rogue AI"
desc = "This particular one depicts the shell of the infamous AI that catastropically comandeered one of Nanotrasen's earliest space stations. Back then, the corporation was just known as TriOptimum."
desc = "This particular one depicts the shell of the infamous AI that catastropically comandeered one of humanity's earliest space stations. Back then, the Company was just known as TriOptimum."
/datum/poster/bay_13
icon_state="bsposter13"
@@ -172,7 +172,7 @@
/datum/poster/bay_35
icon_state="bsposter35"
name = "Lamarr"
desc = "This is a poster depicting the pet and mascot of the NSS Exodus science department."
desc = "This is a poster depicting the pet and mascot of the science department."
/datum/poster/bay_36
icon_state="bsposter36"
+2 -3
View File
@@ -172,7 +172,6 @@
else
if(isliving(src.loc))
return
user.next_move = max(user.next_move+2,world.time + 2)
user.put_in_active_hand(src)
return
@@ -607,10 +606,10 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out.
usr.visible_message("[zoomdevicename ? "[usr] looks up from the [src.name]" : "[usr] lowers the [src.name]"].")
return
/obj/item/proc/pwr_drain()
return 0 // Process Kill
/obj/item/proc/resolve_attackby(atom/A, mob/source)
return A.attackby(src,source)
+1 -1
View File
@@ -48,7 +48,7 @@
var/area/A = get_area()
var/text = {"<HTML><head><title>[src]</title></head><BODY>
<h2>[station_name()] blueprints</h2>
<small>Property of Nanotrasen. For heads of staff only. Store in high-secure storage.</small><hr>
<small>Property of [company_name]. For heads of staff only. Store in high-secure storage.</small><hr>
"}
switch (get_area_type())
if (AREA_SPACE)
+9 -8
View File
@@ -1142,21 +1142,22 @@ var/global/list/obj/item/device/pda/PDAs = list()
if(choice == 1)
if (id)
remove_id()
return 1
else
var/obj/item/I = user.get_active_hand()
if (istype(I, /obj/item/weapon/card/id))
user.drop_item()
if (istype(I, /obj/item/weapon/card/id) && user.unEquip(I))
I.loc = src
id = I
return 1
else
var/obj/item/weapon/card/I = user.get_active_hand()
if (istype(I, /obj/item/weapon/card/id) && I:registered_name)
if (istype(I, /obj/item/weapon/card/id) && I:registered_name && user.unEquip(I))
var/obj/old_id = id
user.drop_item()
I.loc = src
id = I
user.put_in_hands(old_id)
return
return 1
return 0
// access to status display signals
/obj/item/device/pda/attackby(obj/item/C as obj, mob/user as mob)
@@ -1184,9 +1185,9 @@ var/global/list/obj/item/device/pda/PDAs = list()
else
//Basic safety check. If either both objects are held by user or PDA is on ground and card is in hand.
if(((src in user.contents) && (C in user.contents)) || (istype(loc, /turf) && in_range(src, user) && (C in user.contents)) )
id_check(user, 2)
user << "<span class='notice'>You put the ID into \the [src]'s slot.</span>"
updateSelfDialog()//Update self dialog on success.
if(id_check(user, 2))
user << "<span class='notice'>You put the ID into \the [src]'s slot.</span>"
updateSelfDialog()//Update self dialog on success.
return //Return in case of failed check or when successful.
updateSelfDialog()//For the non-input related code.
else if(istype(C, /obj/item/device/paicard) && !src.pai)
+1 -1
View File
@@ -1,6 +1,6 @@
/obj/item/radio/integrated
name = "\improper PDA radio module"
desc = "An electronic radio system of nanotrasen origin."
desc = "An electronic radio system."
icon = 'icons/obj/module.dmi'
icon_state = "power_mod"
var/obj/item/device/pda/hostpda = null
+11 -7
View File
@@ -105,12 +105,13 @@
if(istype(ai.loc, /turf/))
new /obj/structure/AIcore/deactivated(get_turf(ai))
ai.carded = 1
admin_attack_log(user, ai, "Carded with [src.name]", "Was carded with [src.name]", "used the [src.name] to card")
src.name = "[initial(name)] - [ai.name]"
ai.loc = src
ai.cancel_camera()
ai.destroy_eyeobj(src)
ai.cancel_camera()
ai.control_disabled = 1
ai.aiRestorePowerRoutine = 0
carded_ai = ai
@@ -120,10 +121,14 @@
if(user.client)
user << "<span class='notice'><b>Transfer successful:</b></span> [ai.name] ([rand(1000,9999)].exe) removed from host terminal and stored within local memory."
ai.canmove = 1
update_icon()
return 1
/obj/item/device/aicard/proc/clear()
if(carded_ai && istype(carded_ai.loc, /turf))
carded_ai.canmove = 0
carded_ai.carded = 0
name = initial(name)
carded_ai = null
update_icon()
@@ -140,10 +145,9 @@
carded_ai.show_message(rendered, type)
..()
/*
/obj/item/device/aicard/relaymove(var/mob/user, var/direction)
if(src.loc && istype(src.loc.loc, /obj/item/rig_module))
var/obj/item/rig_module/module = src.loc.loc
if(!module.holder || !direction)
return
module.holder.forced_move(direction)*/
if(user.stat || user.stunned)
return
var/obj/item/weapon/rig/rig = src.get_rig()
if(istype(rig))
rig.forced_move(direction, user)
@@ -20,7 +20,7 @@
icon_state = "[initial(icon_state)]-on"
set_light(brightness_on)
else
icon_state = initial(icon_state)
icon_state = "[initial(icon_state)]"
set_light(0)
/obj/item/device/flashlight/proc/update_brightness(var/mob/user = null)
@@ -141,7 +141,7 @@
/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'."
desc = "A red standard-issue flare. There are instructions on the side reading 'pull cord, make light'."
w_class = 2.0
brightness_on = 7 // Pretty bright.
light_color = "#e58775"
+6 -6
View File
@@ -10,12 +10,12 @@
var/looking_for_personality = 0
var/mob/living/silicon/pai/pai
/*/obj/item/device/paicard/relaymove(var/mob/user, var/direction)
if(src.loc && istype(src.loc.loc, /obj/item/rig_module))
var/obj/item/rig_module/module = src.loc.loc
if(!module.holder || !direction)
return
module.holder.forced_move(direction)*/
/obj/item/device/paicard/relaymove(var/mob/user, var/direction)
if(user.stat || user.stunned)
return
var/obj/item/weapon/rig/rig = src.get_rig()
if(istype(rig))
rig.forced_move(direction, user)
/obj/item/device/paicard/New()
..()
@@ -120,5 +120,5 @@
channels = list("Service" = 1)
/obj/item/device/encryptionkey/ert
name = "\improper NanoTrasen ERT radio encryption key"
name = "\improper ERT radio encryption key"
channels = list("Response Team" = 1, "Science" = 1, "Command" = 1, "Medical" = 1, "Engineering" = 1, "Security" = 1, "Supply" = 1, "Service" = 1)
@@ -379,6 +379,12 @@ datum/uplink_item/dd_SortValue()
..()
antag_roles = list(MODE_MERCENARY)
/datum/uplink_item/item/tools/money
name = "Operations Funding"
item_cost = 3
path = /obj/item/weapon/storage/secure/briefcase/money
desc = "A briefcase with 10,000 untraceable thalers for funding your sneaky activities."
/***********
* Implants *
***********/
@@ -616,7 +622,7 @@ var/image/default_abstract_uplink_icon
if(!user)
return 0
var/obj/item/weapon/card/id/I = GetIdCard(user)
var/obj/item/weapon/card/id/I = user.GetIdCard()
var/datum/data/record/random_general_record
var/datum/data/record/random_medical_record
if(data_core.general.len)
+2 -2
View File
@@ -33,12 +33,12 @@ obj/item/device/hailer/attack_self(mob/living/carbon/user as mob)
if(isnull(insults))
playsound(get_turf(src), 'sound/voice/halt.ogg', 100, 1, vary = 0)
user.show_message("<span class='warning'>[user]'s [name] rasps, \"[use_message]\"</span>",1)
user.audible_message("<span class='warning'>[user]'s [name] rasps, \"[use_message]\"</span>", "<span class='warning'>\The [user] holds up \the [name].</span>")
else
if(insults > 0)
playsound(get_turf(src), 'sound/voice/binsult.ogg', 100, 1, vary = 0)
// Yes, it used to show the transcription of the sound clip. That was a) inaccurate b) immature as shit.
user.show_message("<span class='warning'>[user]'s [name] gurgles something indecipherable and deeply offensive.</span>")
user.audible_message("<span class='warning'>[user]'s [name] gurgles something indecipherable and deeply offensive.</span>", "<span class='warning'>\The [user] holds up \the [name].</span>")
insults--
else
user << "<span class='danger'>*BZZZZZZZZT*</span>"
+2 -2
View File
@@ -43,7 +43,7 @@
user << "You set about modifying the helmet into [src]."
var/mob/living/carbon/human/H = user
if(istype(H))
species_restricted = list(H.species.name)
species_restricted = list(H.species.get_bodytype())
kit.use(1,user)
return 1
return ..()
@@ -62,7 +62,7 @@
user << "You set about modifying the suit into [src]."
var/mob/living/carbon/human/H = user
if(istype(H))
species_restricted = list(H.species.name)
species_restricted = list(H.species.get_bodytype())
kit.use(1,user)
return 1
return ..()
@@ -29,10 +29,10 @@
R.modtype = initial(R.modtype)
R.hands.icon_state = initial(R.hands.icon_state)
R.choose_icon(1, R.set_module_sprites(list("Default" = "robot")))
R.notify_ai(ROBOT_NOTIFICATION_MODULE_RESET, R.module.name)
R.module.Reset(R)
qdel(R.module)
R.module = null
R.updatename("Default")
return 1
+3 -5
View File
@@ -184,11 +184,9 @@
if(!uses_charge)
amount -= used
if (amount <= 0)
spawn(0) //delete the empty stack once the current context yields
if (amount <= 0) //check again in case someone transferred stuff to us
if(usr)
usr.remove_from_mob(src)
qdel(src)
if(usr)
usr.remove_from_mob(src)
qdel(src) //should be safe to qdel immediately since if someone is still using this stack it will persist for a little while longer
return 1
else
if(get_amount() < used)
+1 -1
View File
@@ -104,7 +104,7 @@
/obj/item/toy/nanotrasenballoon
name = "criminal balloon"
desc = "Across the balloon the following is printed: \"Man, I love NT soooo much. I use only NanoTrasen products. You have NO idea.\""
desc = "Across the balloon the following is printed: \"Man, I love NanoTrasen soooo much. I use only NT products. You have NO idea.\""
throwforce = 0
throw_speed = 4
throw_range = 20
@@ -35,7 +35,7 @@ AI MODULES
return
if(ticker && ticker.mode && ticker.mode.name == "blob")
usr << "Law uploads have been disabled by NanoTrasen!"
usr << "Law uploads have been disabled by [company_name]!"
return
if (comp.current.stat == 2 || comp.current.control_disabled == 1)

Some files were not shown because too many files have changed in this diff Show More