mirror of
https://github.com/CHOMPstation/CHOMPstation.git
synced 2026-08-30 07:26:39 +01:00
Merge branch 'dev' of https://github.com/Baystation12/Baystation12 into dev
Conflicts: code/modules/admin/topic.dm
This commit is contained in:
@@ -841,6 +841,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"
|
||||
@@ -856,6 +857,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"
|
||||
@@ -1280,6 +1318,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"
|
||||
@@ -1427,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
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
+1
-3
@@ -15,7 +15,6 @@
|
||||
return
|
||||
|
||||
if(control_disabled || stat) return
|
||||
next_move = world.time + 9
|
||||
|
||||
if(ismob(A))
|
||||
ai_actual_track(A)
|
||||
@@ -52,9 +51,8 @@
|
||||
CtrlClickOn(A)
|
||||
return
|
||||
|
||||
if(world.time <= next_move)
|
||||
if(!canClick())
|
||||
return
|
||||
next_move = world.time + 9
|
||||
|
||||
if(aiCamera.in_camera_mode)
|
||||
aiCamera.camera_mode_off()
|
||||
|
||||
+45
-46
@@ -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,78 @@
|
||||
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
|
||||
setMoveCooldown(5) //taking an item off of an inventory slot
|
||||
else
|
||||
next_move = world.time + 8 // in a box/bag or in your square
|
||||
|
||||
// No adjacency needed
|
||||
setMoveCooldown(10) //getting something out of a backpack
|
||||
|
||||
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
|
||||
setMoveCooldown(10)
|
||||
|
||||
if(W)
|
||||
if(W.flags&USEDELAY)
|
||||
next_move += 5
|
||||
|
||||
// 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 +203,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)
|
||||
@@ -231,7 +231,6 @@
|
||||
/mob/living/carbon/MiddleClickOn(var/atom/A)
|
||||
swap_hand()
|
||||
|
||||
|
||||
// In case of use break glass
|
||||
/*
|
||||
/atom/proc/MiddleClick(var/mob/M as mob)
|
||||
@@ -307,7 +306,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
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -32,8 +32,8 @@
|
||||
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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -48,12 +48,14 @@
|
||||
..()
|
||||
|
||||
/mob/living/carbon/human/proc/HardsuitClickOn(atom/A)
|
||||
if(!canClick())
|
||||
return
|
||||
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)
|
||||
if(ismob(A)) // No instant mob attacking - though modules have their own cooldowns
|
||||
setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
|
||||
@@ -111,12 +111,16 @@ var/const/tk_maxrange = 15
|
||||
if(0)
|
||||
;
|
||||
if(1 to 5) // not adjacent may mean blocked by window
|
||||
if(!proximity)
|
||||
user.next_move += 2
|
||||
;
|
||||
//TODO replace these with movement timeouts
|
||||
//if(!proximity)
|
||||
// user.next_move += 2
|
||||
if(5 to 7)
|
||||
user.next_move += 5
|
||||
;
|
||||
//user.next_move += 5
|
||||
if(8 to tk_maxrange)
|
||||
user.next_move += 10
|
||||
;
|
||||
//user.next_move += 10
|
||||
else
|
||||
user << "<span class='notice'>Your mind won't reach that far.</span>"
|
||||
return
|
||||
|
||||
@@ -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])"
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -266,6 +266,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)
|
||||
|
||||
@@ -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>")
|
||||
|
||||
@@ -338,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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
var/active_w_class
|
||||
sharp = 0
|
||||
edge = 0
|
||||
armor_penetration = 50
|
||||
flags = NOBLOODY
|
||||
|
||||
/obj/item/weapon/melee/energy/proc/activate(mob/living/user)
|
||||
@@ -173,7 +174,8 @@
|
||||
name = "energy blade"
|
||||
desc = "A concentrated beam of energy in the shape of a blade. Very stylish... and lethal."
|
||||
icon_state = "blade"
|
||||
force = 70.0//Normal attacks deal very high damage.
|
||||
force = 40 //Normal attacks deal very high damage - about the same as wielded fire axe
|
||||
armor_penetration = 100
|
||||
sharp = 1
|
||||
edge = 1
|
||||
anchored = 1 // Never spawned outside of inventory, should be fine.
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
|
||||
var/damtype = "brute"
|
||||
var/force = 0
|
||||
var/armor_penetration = 0
|
||||
|
||||
/obj/Destroy()
|
||||
processing_objects -= src
|
||||
|
||||
@@ -341,9 +341,12 @@
|
||||
if(!req_breakout())
|
||||
return
|
||||
|
||||
if(!escapee.canClick())
|
||||
return
|
||||
|
||||
escapee.setClickCooldown(100)
|
||||
|
||||
//okay, so the closet is either welded or locked... resist!!!
|
||||
escapee.next_move = world.time + 100
|
||||
escapee.last_special = world.time + 100
|
||||
escapee << "<span class='warning'>You lean on the back of \the [src] and start pushing the door open. (this will take about [breakout_time] minutes)</span>"
|
||||
|
||||
visible_message("<span class='danger'>The [src] begins to shake violently!</span>")
|
||||
|
||||
@@ -30,6 +30,7 @@
|
||||
|
||||
/obj/structure/grille/attack_hand(mob/user as mob)
|
||||
|
||||
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
|
||||
playsound(loc, 'sound/effects/grillehit.ogg', 80, 1)
|
||||
user.do_attack_animation(src)
|
||||
|
||||
@@ -155,7 +156,8 @@
|
||||
//window placing end
|
||||
|
||||
else if(!(W.flags & CONDUCT) || !shock(user, 70))
|
||||
user.do_attack_animation(src)
|
||||
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
|
||||
user.do_attack_animation(src)
|
||||
playsound(loc, 'sound/effects/grillehit.ogg', 80, 1)
|
||||
switch(W.damtype)
|
||||
if("fire")
|
||||
|
||||
@@ -171,6 +171,7 @@
|
||||
playsound(loc, 'sound/effects/Glasshit.ogg', 50, 1)
|
||||
|
||||
/obj/structure/window/attack_hand(mob/user as mob)
|
||||
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
|
||||
if(HULK in user.mutations)
|
||||
user.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!"))
|
||||
user.visible_message("<span class='danger'>[user] smashes through [src]!</span>")
|
||||
@@ -198,6 +199,7 @@
|
||||
return
|
||||
|
||||
/obj/structure/window/attack_generic(var/mob/user, var/damage)
|
||||
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
|
||||
if(!damage)
|
||||
return
|
||||
if(damage >= 10)
|
||||
@@ -268,6 +270,7 @@
|
||||
new glasstype(loc)
|
||||
qdel(src)
|
||||
else
|
||||
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
|
||||
if(W.damtype == BRUTE || W.damtype == BURN)
|
||||
user.do_attack_animation(src)
|
||||
hit(W.force)
|
||||
|
||||
@@ -56,6 +56,7 @@
|
||||
|
||||
radiate()
|
||||
add_fingerprint(user)
|
||||
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
|
||||
var/rotting = (locate(/obj/effect/overlay/wallrot) in src)
|
||||
if (HULK in user.mutations)
|
||||
if (rotting || !prob(material.hardness))
|
||||
@@ -69,6 +70,7 @@
|
||||
/turf/simulated/wall/attack_generic(var/mob/user, var/damage, var/attack_message, var/wallbreaker)
|
||||
|
||||
radiate()
|
||||
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
|
||||
var/rotting = (locate(/obj/effect/overlay/wallrot) in src)
|
||||
if(!damage || !wallbreaker)
|
||||
try_touch(user, rotting)
|
||||
@@ -86,6 +88,7 @@
|
||||
|
||||
/turf/simulated/wall/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
|
||||
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
|
||||
if (!user.)
|
||||
user << "<span class='warning'>You don't have the dexterity to do this!</span>"
|
||||
return
|
||||
|
||||
+11
-104
@@ -604,110 +604,17 @@ proc/admin_notice(var/message, var/rights)
|
||||
if(!check_rights(0)) return
|
||||
|
||||
var/dat = "<B>The first rule of adminbuse is: you don't talk about the adminbuse.</B><HR>"
|
||||
|
||||
if(check_rights(R_ADMIN,0))
|
||||
dat += {"
|
||||
<B>Admin Secrets</B><BR>
|
||||
<BR>
|
||||
<A href='?src=\ref[src];secretsadmin=list_bombers'>Bombing List</A><BR>
|
||||
<A href='?src=\ref[src];secretsadmin=check_antagonist'>Show current traitors and objectives</A><BR>
|
||||
<A href='?src=\ref[src];secretsadmin=list_signalers'>Show last [length(lastsignalers)] signalers</A><BR>
|
||||
<A href='?src=\ref[src];secretsadmin=list_lawchanges'>Show last [length(lawchanges)] law changes</A><BR>
|
||||
<A href='?src=\ref[src];secretsadmin=showailaws'>Show AI Laws</A><BR>
|
||||
<A href='?src=\ref[src];secretsadmin=showgm'>Show Game Mode</A><BR>
|
||||
<A href='?src=\ref[src];secretsadmin=manifest'>Show Crew Manifest</A><BR>
|
||||
<A href='?src=\ref[src];secretsadmin=DNA'>List DNA (Blood)</A><BR>
|
||||
<A href='?src=\ref[src];secretsadmin=fingerprints'>List Fingerprints</A><BR><BR>
|
||||
<BR>
|
||||
"}
|
||||
|
||||
if(check_rights(R_FUN,0))
|
||||
dat += {"
|
||||
<B>'Random' Events</B><BR>
|
||||
<BR>
|
||||
<A href='?src=\ref[src];secretsfun=gravity'>Toggle station artificial gravity</A><BR>
|
||||
<A href='?src=\ref[src];secretsfun=wave'>Spawn a wave of meteors (aka lagocolyptic shower)</A><BR>
|
||||
<A href='?src=\ref[src];secretsfun=gravanomalies'>Spawn a gravitational anomaly (aka lagitational anomolag)</A><BR>
|
||||
<A href='?src=\ref[src];secretsfun=timeanomalies'>Spawn wormholes</A><BR>
|
||||
<A href='?src=\ref[src];secretsfun=goblob'>Spawn blob</A><BR>
|
||||
<A href='?src=\ref[src];secretsfun=aliens'>Trigger a Xenomorph infestation</A><BR>
|
||||
<A href='?src=\ref[src];secretsfun=borers'>Trigger a Cortical Borer infestation</A><BR>
|
||||
<A href='?src=\ref[src];secretsfun=alien_silent'>Spawn an Alien silently</A><BR>
|
||||
<A href='?src=\ref[src];secretsfun=spiders'>Trigger a Spider infestation</A><BR>
|
||||
<A href='?src=\ref[src];secretsfun=spaceninja'>Send in a space ninja</A><BR>
|
||||
<A href='?src=\ref[src];secretsfun=striketeam'>Send in a strike team</A><BR>
|
||||
<A href='?src=\ref[src];secretsfun=carp'>Trigger an Carp migration</A><BR>
|
||||
<A href='?src=\ref[src];secretsfun=radiation'>Irradiate the station</A><BR>
|
||||
<A href='?src=\ref[src];secretsfun=prison_break'>Trigger a Prison Break</A><BR>
|
||||
<A href='?src=\ref[src];secretsfun=virus'>Trigger a Virus Outbreak</A><BR>
|
||||
<A href='?src=\ref[src];secretsfun=immovable'>Spawn an Immovable Rod</A><BR>
|
||||
<A href='?src=\ref[src];secretsfun=lightsout'>Toggle a "lights out" event</A><BR>
|
||||
<A href='?src=\ref[src];secretsfun=ionstorm'>Spawn an Ion Storm</A><BR>
|
||||
<A href='?src=\ref[src];secretsfun=spacevines'>Spawn Space-Vines</A><BR>
|
||||
<A href='?src=\ref[src];secretsfun=comms_blackout'>Trigger a communication blackout</A><BR>
|
||||
<BR>
|
||||
<B>Fun Secrets</B><BR>
|
||||
<BR>
|
||||
<A href='?src=\ref[src];secretsfun=sec_clothes'>Remove 'internal' clothing</A><BR>
|
||||
<A href='?src=\ref[src];secretsfun=sec_all_clothes'>Remove ALL clothing</A><BR>
|
||||
<A href='?src=\ref[src];secretsfun=monkey'>Turn all humans into monkeys</A><BR>
|
||||
<A href='?src=\ref[src];secretsfun=sec_classic1'>Remove firesuits, grilles, and pods</A><BR>
|
||||
<A href='?src=\ref[src];secretsfun=power'>Make all areas powered</A><BR>
|
||||
<A href='?src=\ref[src];secretsfun=unpower'>Make all areas unpowered</A><BR>
|
||||
<A href='?src=\ref[src];secretsfun=quickpower'>Power all SMES</A><BR>
|
||||
<A href='?src=\ref[src];secretsfun=toggleprisonstatus'>Toggle Prison Shuttle Status(Use with S/R)</A><BR>
|
||||
<A href='?src=\ref[src];secretsfun=activateprison'>Send Prison Shuttle</A><BR>
|
||||
<A href='?src=\ref[src];secretsfun=deactivateprison'>Return Prison Shuttle</A><BR>
|
||||
<A href='?src=\ref[src];secretsfun=prisonwarp'>Warp all Players to Prison</A><BR>
|
||||
<A href='?src=\ref[src];secretsfun=tripleAI'>Triple AI mode (needs to be used in the lobby)</A><BR>
|
||||
<A href='?src=\ref[src];secretsfun=traitor_all'>Everyone is the traitor</A><BR>
|
||||
<A href='?src=\ref[src];secretsfun=onlyone'>There can only be one!</A><BR>
|
||||
<A href='?src=\ref[src];secretsfun=flicklights'>Ghost Mode</A><BR>
|
||||
<A href='?src=\ref[src];secretsfun=retardify'>Make all players retarded</A><BR>
|
||||
<A href='?src=\ref[src];secretsfun=fakeguns'>Make all items look like guns</A><BR>
|
||||
<A href='?src=\ref[src];secretsfun=paintball'>Paintball Mode</A><BR>
|
||||
<A href='?src=\ref[src];secretsfun=schoolgirl'>Japanese Animes Mode</A><BR>
|
||||
<A href='?src=\ref[src];secretsfun=eagles'>Egalitarian Station Mode</A><BR>
|
||||
<A href='?src=\ref[src];secretsfun=launchshuttle'>Launch a shuttle</A><BR>
|
||||
<A href='?src=\ref[src];secretsfun=forcelaunchshuttle'>Force launch a shuttle</A><BR>
|
||||
<A href='?src=\ref[src];secretsfun=jumpshuttle'>Jump a shuttle</A><BR>
|
||||
<A href='?src=\ref[src];secretsfun=moveshuttle'>Move a shuttle</A><BR>
|
||||
<A href='?src=\ref[src];secretsfun=blackout'>Break all lights</A><BR>
|
||||
<A href='?src=\ref[src];secretsfun=whiteout'>Fix all lights</A><BR>
|
||||
<A href='?src=\ref[src];secretsfun=friendai'>Best Friend AI</A><BR>
|
||||
<A href='?src=\ref[src];secretsfun=floorlava'>The floor is lava! (DANGEROUS: extremely lame)</A><BR>
|
||||
"}
|
||||
|
||||
if(check_rights(R_SERVER,0))
|
||||
dat += "<A href='?src=\ref[src];secretsfun=togglebombcap'>Toggle bomb cap</A><BR>"
|
||||
|
||||
if(check_rights(R_SERVER|R_FUN,0))
|
||||
dat += {"
|
||||
<BR>
|
||||
<B>Final Solutions</B><BR>
|
||||
<I>(Warning, these will end the round!)</I><BR>
|
||||
<BR>
|
||||
<A href='?src=\ref[src];secretsfun=hellonearth'>Summon Nar-Sie</A><BR>
|
||||
<A href='?src=\ref[src];secretsfun=supermattercascade'>Start a Supermatter Cascade</A><BR>
|
||||
"}
|
||||
|
||||
dat += "<BR>"
|
||||
|
||||
if(check_rights(R_DEBUG,0))
|
||||
dat += {"
|
||||
<B>Security Level Elevated</B><BR>
|
||||
<BR>
|
||||
<A href='?src=\ref[src];secretscoder=maint_access_engiebrig'>Change all maintenance doors to engie/brig access only</A><BR>
|
||||
<A href='?src=\ref[src];secretscoder=maint_access_brig'>Change all maintenance doors to brig access only</A><BR>
|
||||
<A href='?src=\ref[src];secretscoder=infinite_sec'>Remove cap on security officers</A><BR>
|
||||
<BR>
|
||||
<B>Coder Secrets</B><BR>
|
||||
<BR>
|
||||
<A href='?src=\ref[src];secretsadmin=list_job_debug'>Show Job Debug</A><BR>
|
||||
<A href='?src=\ref[src];secretscoder=spawn_objects'>Admin Log</A><BR>
|
||||
<BR>
|
||||
"}
|
||||
|
||||
for(var/datum/admin_secret_category/category in admin_secrets.categories)
|
||||
if(!category.can_view(usr))
|
||||
continue
|
||||
dat += "<B>[category.name]</B><br>"
|
||||
if(category.desc)
|
||||
dat += "<I>[category.desc]</I><BR>"
|
||||
for(var/datum/admin_secret_item/item in category.items)
|
||||
if(!item.can_view(usr))
|
||||
continue
|
||||
dat += "<A href='?src=\ref[src];admin_secrets=\ref[item]'>[item.name()]</A><BR>"
|
||||
dat += "<BR>"
|
||||
usr << browse(dat, "window=secrets")
|
||||
return
|
||||
|
||||
|
||||
@@ -0,0 +1,110 @@
|
||||
var/datum/admin_secrets/admin_secrets = new()
|
||||
|
||||
/datum/admin_secrets
|
||||
var/list/datum/admin_secret_category/categories
|
||||
var/list/datum/admin_secret_item/items
|
||||
|
||||
/datum/admin_secrets/New()
|
||||
..()
|
||||
categories = init_subtypes(/datum/admin_secret_category)
|
||||
items = list()
|
||||
var/list/category_assoc = list()
|
||||
for(var/datum/admin_secret_category/category in categories)
|
||||
category_assoc[category.type] = category
|
||||
|
||||
for(var/item_type in (typesof(/datum/admin_secret_item) - /datum/admin_secret_item))
|
||||
var/datum/admin_secret_item/secret_item = item_type
|
||||
if(!initial(secret_item.name))
|
||||
continue
|
||||
|
||||
var/datum/admin_secret_item/item = new item_type()
|
||||
var/datum/admin_secret_category/category = category_assoc[item.category]
|
||||
dd_insertObjectList(category.items, item)
|
||||
items += item
|
||||
|
||||
/datum/admin_secret_category
|
||||
var/name = ""
|
||||
var/desc = ""
|
||||
var/list/datum/admin_secret_item/items
|
||||
|
||||
/datum/admin_secret_category
|
||||
..()
|
||||
items = list()
|
||||
|
||||
/datum/admin_secret_category/proc/can_view(var/mob/user)
|
||||
for(var/datum/admin_secret_item/item in items)
|
||||
if(item.can_view(user))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/datum/admin_secret_item
|
||||
var/name = ""
|
||||
var/category = null
|
||||
var/log = 1
|
||||
var/feedback = 1
|
||||
var/permissions = R_HOST
|
||||
var/warn_before_use = 0
|
||||
|
||||
/datum/admin_secret_item/dd_SortValue()
|
||||
return "[name]"
|
||||
|
||||
/datum/admin_secret_item/proc/name()
|
||||
return name
|
||||
|
||||
/datum/admin_secret_item/proc/can_view(var/mob/user)
|
||||
return check_rights(permissions, 0, user)
|
||||
|
||||
/datum/admin_secret_item/proc/can_execute(var/mob/user)
|
||||
if(can_view(user))
|
||||
if(!warn_before_use || alert("Execute the command '[name]'?", name, "No","Yes") == "Yes")
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/datum/admin_secret_item/proc/execute(var/mob/user)
|
||||
if(!can_execute(user))
|
||||
return 0
|
||||
|
||||
if(log)
|
||||
log_and_message_admins("used secret '[name]'", user)
|
||||
if(feedback)
|
||||
feedback_inc("admin_secrets_used",1)
|
||||
feedback_add_details("admin_secrets_used","[name]")
|
||||
return 1
|
||||
|
||||
/*************************
|
||||
* Pre-defined categories *
|
||||
*************************/
|
||||
/datum/admin_secret_category/admin_secrets
|
||||
name = "Admin Secrets"
|
||||
|
||||
/datum/admin_secret_category/random_events
|
||||
name = "'Random' Events"
|
||||
|
||||
/datum/admin_secret_category/fun_secrets
|
||||
name = "Fun Secrets"
|
||||
|
||||
/datum/admin_secret_category/final_solutions
|
||||
name = "Final Solutions"
|
||||
desc = "(Warning, these will end the round!)"
|
||||
|
||||
/*************************
|
||||
* Pre-defined base items *
|
||||
*************************/
|
||||
/datum/admin_secret_item/admin_secret
|
||||
category = /datum/admin_secret_category/admin_secrets
|
||||
log = 0
|
||||
permissions = R_ADMIN
|
||||
|
||||
/datum/admin_secret_item/random_event
|
||||
category = /datum/admin_secret_category/random_events
|
||||
permissions = R_FUN
|
||||
warn_before_use = 1
|
||||
|
||||
/datum/admin_secret_item/fun_secret
|
||||
category = /datum/admin_secret_category/fun_secrets
|
||||
permissions = R_FUN
|
||||
warn_before_use = 1
|
||||
|
||||
/datum/admin_secret_item/final_solution
|
||||
category = /datum/admin_secret_category/final_solutions
|
||||
permissions = R_FUN|R_SERVER|R_ADMIN
|
||||
@@ -0,0 +1,13 @@
|
||||
/datum/admin_secret_item/admin_secret/admin_logs
|
||||
name = "Admin Logs"
|
||||
|
||||
/datum/admin_secret_item/admin_secret/admin_logs/execute(var/mob/user)
|
||||
. = ..()
|
||||
if(!.)
|
||||
return
|
||||
var/dat = "<B>Admin Log<HR></B>"
|
||||
for(var/l in admin_log)
|
||||
dat += "<li>[l]</li>"
|
||||
if(!admin_log.len)
|
||||
dat += "No-one has done anything this round!"
|
||||
user << browse(dat, "window=admin_log")
|
||||
@@ -0,0 +1,14 @@
|
||||
/datum/admin_secret_item/admin_secret/alter_narise
|
||||
name = "Alter Nar-Sie"
|
||||
|
||||
/datum/admin_secret_item/admin_secret/alter_narise/execute(var/mob/user)
|
||||
. = ..()
|
||||
if(!.)
|
||||
return
|
||||
var/choice = input(user, "How do you wish for Nar-Sie to interact with its surroundings?") as null|anything in list("CultStation13", "Nar-Singulo")
|
||||
if(choice == "CultStation13")
|
||||
log_and_message_admins("has set narsie's behaviour to \"CultStation13\".", user)
|
||||
narsie_behaviour = choice
|
||||
if(choice == "Nar-Singulo")
|
||||
log_and_message_admins("has set narsie's behaviour to \"Nar-Singulo\".", user)
|
||||
narsie_behaviour = choice
|
||||
@@ -0,0 +1,12 @@
|
||||
/datum/admin_secret_item/admin_secret/bombing_list
|
||||
name = "Bombing List"
|
||||
|
||||
/datum/admin_secret_item/admin_secret/bombing_list/execute(var/mob/user)
|
||||
. = ..()
|
||||
if(!.)
|
||||
return
|
||||
|
||||
var/dat = "<B>Bombing List<HR>"
|
||||
for(var/l in bombers)
|
||||
dat += text("[l]<BR>")
|
||||
user << browse(dat, "window=bombers")
|
||||
@@ -0,0 +1,36 @@
|
||||
/datum/admin_secret_item/admin_secret/jump_shuttle
|
||||
name = "Jump a Shuttle"
|
||||
|
||||
/datum/admin_secret_item/admin_secret/jump_shuttle/can_execute(var/mob/user)
|
||||
if(!shuttle_controller) return 0
|
||||
return ..()
|
||||
|
||||
/datum/admin_secret_item/admin_secret/jump_shuttle/execute(var/mob/user)
|
||||
. = ..()
|
||||
if(!.)
|
||||
return
|
||||
var/shuttle_tag = input(user, "Which shuttle do you want to jump?") as null|anything in shuttle_controller.shuttles
|
||||
if (!shuttle_tag) return
|
||||
|
||||
var/datum/shuttle/S = shuttle_controller.shuttles[shuttle_tag]
|
||||
|
||||
var/origin_area = input(user, "Which area is the shuttle at now? (MAKE SURE THIS IS CORRECT OR THINGS WILL BREAK)") as null|area in world
|
||||
if (!origin_area) return
|
||||
|
||||
var/destination_area = input(user, "Which area is the shuttle at now? (MAKE SURE THIS IS CORRECT OR THINGS WILL BREAK)") as null|area in world
|
||||
if (!destination_area) return
|
||||
|
||||
var/long_jump = alert(user, "Is there a transition area for this jump?","", "Yes", "No")
|
||||
if (long_jump == "Yes")
|
||||
var/transition_area = input(user, "Which area is the transition area? (MAKE SURE THIS IS CORRECT OR THINGS WILL BREAK)") as null|area in world
|
||||
if (!transition_area) return
|
||||
|
||||
var/move_duration = input(user, "How many seconds will this jump take?") as num
|
||||
|
||||
S.long_jump(origin_area, destination_area, transition_area, move_duration)
|
||||
message_admins("<span class='notice'>[key_name_admin(user)] has initiated a jump from [origin_area] to [destination_area] lasting [move_duration] seconds for the [shuttle_tag] shuttle</span>", 1)
|
||||
log_admin("[key_name_admin(user)] has initiated a jump from [origin_area] to [destination_area] lasting [move_duration] seconds for the [shuttle_tag] shuttle")
|
||||
else
|
||||
S.short_jump(origin_area, destination_area)
|
||||
message_admins("<span class='notice'>[key_name_admin(user)] has initiated a jump from [origin_area] to [destination_area] for the [shuttle_tag] shuttle</span>", 1)
|
||||
log_admin("[key_name_admin(user)] has initiated a jump from [origin_area] to [destination_area] for the [shuttle_tag] shuttle")
|
||||
@@ -0,0 +1,26 @@
|
||||
/datum/admin_secret_item/admin_secret/launch_shuttle
|
||||
name = "Launch a Shuttle"
|
||||
|
||||
/datum/admin_secret_item/admin_secret/launch_shuttle/can_execute(var/mob/user)
|
||||
if(!shuttle_controller) return 0
|
||||
return ..()
|
||||
|
||||
/datum/admin_secret_item/admin_secret/launch_shuttle/execute(var/mob/user)
|
||||
. = ..()
|
||||
if(!.)
|
||||
return
|
||||
var/list/valid_shuttles = list()
|
||||
for (var/shuttle_tag in shuttle_controller.shuttles)
|
||||
if (istype(shuttle_controller.shuttles[shuttle_tag], /datum/shuttle/ferry))
|
||||
valid_shuttles += shuttle_tag
|
||||
|
||||
var/shuttle_tag = input(user, "Which shuttle do you want to launch?") as null|anything in valid_shuttles
|
||||
if (!shuttle_tag)
|
||||
return
|
||||
|
||||
var/datum/shuttle/ferry/S = shuttle_controller.shuttles[shuttle_tag]
|
||||
if (S.can_launch())
|
||||
S.launch(user)
|
||||
log_and_message_admins("launched the [shuttle_tag] shuttle", user)
|
||||
else
|
||||
alert(user, "The [shuttle_tag] shuttle cannot be launched at this time. It's probably busy.")
|
||||
@@ -0,0 +1,26 @@
|
||||
/datum/admin_secret_item/admin_secret/launch_shuttle_forced
|
||||
name = "Launch a Shuttle (Forced)"
|
||||
|
||||
/datum/admin_secret_item/admin_secret/launch_shuttle_forced/can_execute(var/mob/user)
|
||||
if(!shuttle_controller) return 0
|
||||
return ..()
|
||||
|
||||
/datum/admin_secret_item/admin_secret/launch_shuttle_forced/execute(var/mob/user)
|
||||
. = ..()
|
||||
if(!.)
|
||||
return
|
||||
var/list/valid_shuttles = list()
|
||||
for (var/shuttle_tag in shuttle_controller.shuttles)
|
||||
if (istype(shuttle_controller.shuttles[shuttle_tag], /datum/shuttle/ferry))
|
||||
valid_shuttles += shuttle_tag
|
||||
|
||||
var/shuttle_tag = input(user, "Which shuttle's launch do you want to force?") as null|anything in valid_shuttles
|
||||
if (!shuttle_tag)
|
||||
return
|
||||
|
||||
var/datum/shuttle/ferry/S = shuttle_controller.shuttles[shuttle_tag]
|
||||
if (S.can_force())
|
||||
S.force_launch(user)
|
||||
log_and_message_admins("forced the [shuttle_tag] shuttle", user)
|
||||
else
|
||||
alert(user, "The [shuttle_tag] shuttle launch cannot be forced at this time. It's busy, or hasn't been launched yet.")
|
||||
@@ -0,0 +1,14 @@
|
||||
/datum/admin_secret_item/admin_secret/list_dna
|
||||
name = "List DNA (Blood)"
|
||||
|
||||
/datum/admin_secret_item/admin_secret/list_dna/execute(var/mob/user)
|
||||
. = ..()
|
||||
if(!.)
|
||||
return
|
||||
var/dat = "<B>Showing DNA from blood.</B><HR>"
|
||||
dat += "<table cellspacing=5><tr><th>Name</th><th>DNA</th><th>Blood Type</th></tr>"
|
||||
for(var/mob/living/carbon/human/H in mob_list)
|
||||
if(H.dna && H.ckey)
|
||||
dat += "<tr><td>[H]</td><td>[H.dna.unique_enzymes]</td><td>[H.b_type]</td></tr>"
|
||||
dat += "</table>"
|
||||
user << browse(dat, "window=DNA;size=440x410")
|
||||
@@ -0,0 +1,19 @@
|
||||
/datum/admin_secret_item/admin_secret/list_fingerprints
|
||||
name = "List Fingerprints"
|
||||
|
||||
/datum/admin_secret_item/admin_secret/list_fingerprints/execute(var/mob/user)
|
||||
. = ..()
|
||||
if(!.)
|
||||
return
|
||||
var/dat = "<B>Showing Fingerprints.</B><HR>"
|
||||
dat += "<table cellspacing=5><tr><th>Name</th><th>Fingerprints</th></tr>"
|
||||
for(var/mob/living/carbon/human/H in mob_list)
|
||||
if(H.ckey)
|
||||
if(H.dna && H.dna.uni_identity)
|
||||
dat += "<tr><td>[H]</td><td>[md5(H.dna.uni_identity)]</td></tr>"
|
||||
else if(H.dna && !H.dna.uni_identity)
|
||||
dat += "<tr><td>[H]</td><td>H.dna.uni_identity = null</td></tr>"
|
||||
else if(!H.dna)
|
||||
dat += "<tr><td>[H]</td><td>H.dna = null</td></tr>"
|
||||
dat += "</table>"
|
||||
user << browse(dat, "window=fingerprints;size=440x410")
|
||||
@@ -0,0 +1,28 @@
|
||||
/datum/admin_secret_item/admin_secret/move_shuttle
|
||||
name = "Move a Shuttle"
|
||||
|
||||
/datum/admin_secret_item/admin_secret/move_shuttle/can_execute(var/mob/user)
|
||||
if(!shuttle_controller) return 0
|
||||
return ..()
|
||||
|
||||
/datum/admin_secret_item/admin_secret/move_shuttle/execute(var/mob/user)
|
||||
. = ..()
|
||||
if(!.)
|
||||
return
|
||||
var/confirm = alert(user, "This command directly moves a shuttle from one area to another. DO NOT USE THIS UNLESS YOU ARE DEBUGGING A SHUTTLE AND YOU KNOW WHAT YOU ARE DOING.", "Are you sure?", "Ok", "Cancel")
|
||||
if (confirm == "Cancel")
|
||||
return
|
||||
|
||||
var/shuttle_tag = input(user, "Which shuttle do you want to jump?") as null|anything in shuttle_controller.shuttles
|
||||
if (!shuttle_tag) return
|
||||
|
||||
var/datum/shuttle/S = shuttle_controller.shuttles[shuttle_tag]
|
||||
|
||||
var/origin_area = input(user, "Which area is the shuttle at now? (MAKE SURE THIS IS CORRECT OR THINGS WILL BREAK)") as null|area in world
|
||||
if (!origin_area) return
|
||||
|
||||
var/destination_area = input(user, "Which area is the shuttle at now? (MAKE SURE THIS IS CORRECT OR THINGS WILL BREAK)") as null|area in world
|
||||
if (!destination_area) return
|
||||
|
||||
S.move(origin_area, destination_area)
|
||||
log_and_message_admins("moved the [shuttle_tag] shuttle", user)
|
||||
@@ -0,0 +1,38 @@
|
||||
/datum/admin_secret_item/admin_secret/prison_warp
|
||||
name = "Prison Warp"
|
||||
|
||||
/datum/admin_secret_item/admin_secret/prison_warp/can_execute(var/mob/user)
|
||||
if(!ticker) return 0
|
||||
return ..()
|
||||
|
||||
/datum/admin_secret_item/admin_secret/prison_warp/execute(var/mob/user)
|
||||
. = ..()
|
||||
if(!.)
|
||||
return
|
||||
for(var/mob/living/carbon/human/H in mob_list)
|
||||
var/turf/T = get_turf(H)
|
||||
var/security = 0
|
||||
if((T && T in config.admin_levels) || prisonwarped.Find(H))
|
||||
//don't warp them if they aren't ready or are already there
|
||||
continue
|
||||
H.Paralyse(5)
|
||||
if(H.wear_id)
|
||||
var/obj/item/weapon/card/id/id = H.get_idcard()
|
||||
for(var/A in id.access)
|
||||
if(A == access_security)
|
||||
security++
|
||||
if(!security)
|
||||
//strip their stuff before they teleport into a cell :downs:
|
||||
for(var/obj/item/weapon/W in H)
|
||||
if(istype(W, /obj/item/organ/external))
|
||||
continue
|
||||
//don't strip organs
|
||||
H.drop_from_inventory(W)
|
||||
//teleport person to cell
|
||||
H.loc = pick(prisonwarp)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/under/color/orange(H), slot_w_uniform)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/orange(H), slot_shoes)
|
||||
else
|
||||
//teleport security person
|
||||
H.loc = pick(prisonsecuritywarp)
|
||||
prisonwarped += H
|
||||
@@ -0,0 +1,7 @@
|
||||
/datum/admin_secret_item/admin_secret/show_ai_laws
|
||||
name = "Show AI laws"
|
||||
|
||||
/datum/admin_secret_item/admin_secret/show_ai_laws/execute(var/mob/user)
|
||||
. = ..()
|
||||
if(.)
|
||||
user.client.holder.output_ai_laws()
|
||||
@@ -0,0 +1,12 @@
|
||||
/datum/admin_secret_item/admin_secret/show_crew_manifest
|
||||
name = "Show Crew Manifest"
|
||||
|
||||
/datum/admin_secret_item/admin_secret/show_crew_manifest/execute(var/mob/user)
|
||||
. = ..()
|
||||
if(!.)
|
||||
return
|
||||
var/dat
|
||||
dat += "<h4>Crew Manifest</h4>"
|
||||
dat += data_core.get_manifest()
|
||||
|
||||
user << browse(dat, "window=manifest;size=370x420;can_close=1")
|
||||
@@ -0,0 +1,14 @@
|
||||
/datum/admin_secret_item/admin_secret/show_game_mode
|
||||
name = "Show Game Mode"
|
||||
|
||||
/datum/admin_secret_item/admin_secret/show_game_mode/can_execute(var/mob/user)
|
||||
if(!ticker)
|
||||
return 0
|
||||
return ..()
|
||||
|
||||
/datum/admin_secret_item/admin_secret/show_game_mode/execute(var/mob/user)
|
||||
. = ..()
|
||||
if(!.)
|
||||
return
|
||||
if (ticker.mode) alert("The game mode is [ticker.mode.name]")
|
||||
else alert("For some reason there's a ticker, but not a game mode")
|
||||
@@ -0,0 +1,15 @@
|
||||
/datum/admin_secret_item/admin_secret/show_law_changes
|
||||
name = "Show law changes"
|
||||
|
||||
/datum/admin_secret_item/admin_secret/show_law_changes/name()
|
||||
return "Show Last [length(lawchanges)] Law change\s"
|
||||
|
||||
/datum/admin_secret_item/admin_secret/show_law_changes/execute(var/mob/user)
|
||||
. = ..()
|
||||
if(!.)
|
||||
return
|
||||
|
||||
var/dat = "<B>Showing last [length(lawchanges)] law changes.</B><HR>"
|
||||
for(var/sig in lawchanges)
|
||||
dat += "[sig]<BR>"
|
||||
user << browse(dat, "window=lawchanges;size=800x500")
|
||||
@@ -0,0 +1,15 @@
|
||||
/datum/admin_secret_item/admin_secret/show_signalers
|
||||
name = "Show Last Signalers"
|
||||
|
||||
/datum/admin_secret_item/admin_secret/show_signalers/name()
|
||||
return "Show Last [length(lastsignalers)] Signaler\s"
|
||||
|
||||
/datum/admin_secret_item/admin_secret/show_signalers/execute(var/mob/user)
|
||||
. = ..()
|
||||
if(!.)
|
||||
return
|
||||
|
||||
var/dat = "<B>Showing last [length(lastsignalers)] signalers.</B><HR>"
|
||||
for(var/sig in lastsignalers)
|
||||
dat += "[sig]<BR>"
|
||||
user << browse(dat, "window=lastsignalers;size=800x500")
|
||||
@@ -0,0 +1,7 @@
|
||||
/datum/admin_secret_item/admin_secret/traitors_and_objectives
|
||||
name = "Show current traitors and objectives"
|
||||
|
||||
/datum/admin_secret_item/admin_secret/traitors_and_objectives/execute(var/mob/user)
|
||||
. = ..()
|
||||
if(.)
|
||||
user.client.holder.check_antagonists()
|
||||
@@ -0,0 +1,11 @@
|
||||
/datum/admin_secret_item/final_solution/summon_narsie
|
||||
name = "Summon Nar-Sie"
|
||||
|
||||
/datum/admin_secret_item/final_solution/summon_narsie/execute(var/mob/user)
|
||||
. = ..()
|
||||
if(!.)
|
||||
return
|
||||
var/choice = input(user, "You sure you want to end the round and summon Nar-Sie at your location? Misuse of this could result in removal of flags or hilarity.") in list("PRAISE SATAN", "Cancel")
|
||||
if(choice == "PRAISE SATAN")
|
||||
new /obj/singularity/narsie/large(get_turf(user))
|
||||
log_and_message_admins("has summoned Nar-Sie and brought about a new realm of suffering.", user)
|
||||
@@ -0,0 +1,13 @@
|
||||
/datum/admin_secret_item/final_solution/supermatter_cascade
|
||||
name = "Supermatter Cascade"
|
||||
|
||||
/datum/admin_secret_item/final_solution/supermatter_cascade/execute(var/mob/user)
|
||||
. = ..()
|
||||
if(!.)
|
||||
return
|
||||
var/choice = input(user, "You sure you want to destroy the universe and create a large explosion at your location? Misuse of this could result in removal of flags or hilarity.") in list("NO TIME TO EXPLAIN", "Cancel")
|
||||
if(choice == "NO TIME TO EXPLAIN")
|
||||
explosion(get_turf(user), 8, 16, 24, 32, 1)
|
||||
new /turf/unsimulated/wall/supermatter(get_turf(user))
|
||||
SetUniversalState(/datum/universal_state/supermatter_cascade)
|
||||
message_admins("[key_name_admin(user)] has managed to destroy the universe with a supermatter cascade. Good job, [key_name_admin(user)]")
|
||||
@@ -0,0 +1,7 @@
|
||||
/datum/admin_secret_item/fun_secret/break_all_lights
|
||||
name = "Break All Lights"
|
||||
|
||||
/datum/admin_secret_item/fun_secret/break_all_lights/execute(var/mob/user)
|
||||
. = ..()
|
||||
if(.)
|
||||
lightsout(0,0)
|
||||
@@ -0,0 +1,7 @@
|
||||
/datum/admin_secret_item/fun_secret/break_some_lights
|
||||
name = "Break Some Lights"
|
||||
|
||||
/datum/admin_secret_item/fun_secret/break_some_lights/execute(var/mob/user)
|
||||
. = ..()
|
||||
if(.)
|
||||
lightsout(1,2)
|
||||
@@ -0,0 +1,10 @@
|
||||
/datum/admin_secret_item/fun_secret/fix_all_lights
|
||||
name = "Fix All Lights"
|
||||
|
||||
/datum/admin_secret_item/fun_secret/fix_all_lights/execute(var/mob/user)
|
||||
. = ..()
|
||||
if(!.)
|
||||
return
|
||||
|
||||
for(var/obj/machinery/light/L in world)
|
||||
L.fix()
|
||||
@@ -0,0 +1,48 @@
|
||||
/datum/admin_secret_item/fun_secret/ghost_mode
|
||||
name = "Ghost Mode"
|
||||
var/list/affected_mobs
|
||||
|
||||
/datum/admin_secret_item/fun_secret/ghost_mode/New()
|
||||
..()
|
||||
affected_mobs = list()
|
||||
|
||||
/datum/admin_secret_item/fun_secret/ghost_mode/execute(var/mob/user)
|
||||
. = ..()
|
||||
if(!.)
|
||||
return
|
||||
|
||||
var/list/affected_areas = list()
|
||||
for(var/mob/M in living_mob_list)
|
||||
if(M.stat == CONSCIOUS && !(M in affected_mobs))
|
||||
affected_mobs |= M
|
||||
switch(rand(1,4))
|
||||
if(1)
|
||||
M.show_message(text("<span class='notice'>You shudder as if cold...</span>"), 1)
|
||||
if(2)
|
||||
M.show_message(text("<span class='notice'>You feel something gliding across your back...</span>"), 1)
|
||||
if(3)
|
||||
M.show_message(text("<span class='notice'>Your eyes twitch, you feel like something you can't see is here...</span>"), 1)
|
||||
if(4)
|
||||
M.show_message(text("<span class='notice'>You notice something moving out of the corner of your eye, but nothing is there...</span>"), 1)
|
||||
|
||||
for(var/obj/W in orange(5,M))
|
||||
if(prob(25) && !W.anchored)
|
||||
step_rand(W)
|
||||
|
||||
var/area/A = get_area(M)
|
||||
if(A.requires_power && !A.always_unpowered && A.power_light && (A.z in config.player_levels))
|
||||
affected_areas |= get_area(M)
|
||||
|
||||
affected_mobs |= user
|
||||
for(var/area/AffectedArea in affected_areas)
|
||||
AffectedArea.power_light = 0
|
||||
AffectedArea.power_change()
|
||||
spawn(rand(25,50))
|
||||
AffectedArea.power_light = 1
|
||||
AffectedArea.power_change()
|
||||
|
||||
sleep(100)
|
||||
for(var/mob/M in affected_mobs)
|
||||
M.show_message(text("<span class='notice'>The chilling wind suddenly stops...</span>"), 1)
|
||||
affected_mobs.Cut()
|
||||
affected_areas.Cut()
|
||||
@@ -0,0 +1,7 @@
|
||||
/datum/admin_secret_item/fun_secret/make_all_areas_powered
|
||||
name = "Make All Areas Powered"
|
||||
|
||||
/datum/admin_secret_item/fun_secret/make_all_areas_powered/execute(var/mob/user)
|
||||
. = ..()
|
||||
if(.)
|
||||
power_restore()
|
||||
@@ -0,0 +1,7 @@
|
||||
/datum/admin_secret_item/fun_secret/make_all_areas_unpowered
|
||||
name = "Make All Areas Unpowered"
|
||||
|
||||
/datum/admin_secret_item/fun_secret/make_all_areas_unpowered/execute(var/mob/user)
|
||||
. = ..()
|
||||
if(.)
|
||||
power_failure()
|
||||
@@ -0,0 +1,7 @@
|
||||
/datum/admin_secret_item/fun_secret/only_one
|
||||
name = "There Can Be Only One"
|
||||
|
||||
/datum/admin_secret_item/fun_secret/only_one/execute(var/mob/user)
|
||||
. = ..()
|
||||
if(.)
|
||||
only_one()
|
||||
@@ -0,0 +1,14 @@
|
||||
/datum/admin_secret_item/fun_secret/paintbal_mode
|
||||
name = "Paintball Mode"
|
||||
|
||||
/datum/admin_secret_item/fun_secret/paintbal_mode/execute(var/mob/user)
|
||||
. = ..()
|
||||
if(!.)
|
||||
return
|
||||
|
||||
for(var/species in all_species)
|
||||
var/datum/species/S = all_species[species]
|
||||
S.blood_color = "rainbow"
|
||||
for(var/obj/effect/decal/cleanable/blood/B in world)
|
||||
B.basecolor = "rainbow"
|
||||
B.update_icon()
|
||||
@@ -0,0 +1,7 @@
|
||||
/datum/admin_secret_item/fun_secret/power_all_smes
|
||||
name = "Power All SMES"
|
||||
|
||||
/datum/admin_secret_item/fun_secret/power_all_smes/execute(var/mob/user)
|
||||
. = ..()
|
||||
if(.)
|
||||
power_restore_quick()
|
||||
@@ -0,0 +1,10 @@
|
||||
/datum/admin_secret_item/fun_secret/remove_all_clothing
|
||||
name = "Remove ALL Clothing"
|
||||
|
||||
/datum/admin_secret_item/fun_secret/remove_all_clothing/execute(var/mob/user)
|
||||
. = ..()
|
||||
if(!.)
|
||||
return
|
||||
|
||||
for(var/obj/item/clothing/O in world)
|
||||
qdel(O)
|
||||
@@ -0,0 +1,10 @@
|
||||
/datum/admin_secret_item/fun_secret/remove_internal_clothing
|
||||
name = "Remove 'Internal' Clothing"
|
||||
|
||||
/datum/admin_secret_item/fun_secret/remove_internal_clothing/execute(var/mob/user)
|
||||
. = ..()
|
||||
if(!.)
|
||||
return
|
||||
|
||||
for(var/obj/item/clothing/under/O in world)
|
||||
qdel(O)
|
||||
@@ -0,0 +1,11 @@
|
||||
/datum/admin_secret_item/fun_secret/send_strike_team
|
||||
name = "Send Strike Team"
|
||||
|
||||
/datum/admin_secret_item/fun_secret/send_strike_team/can_execute(var/mob/user)
|
||||
if(!ticker) return 0
|
||||
return ..()
|
||||
|
||||
/datum/admin_secret_item/fun_secret/send_strike_team/execute(var/mob/user)
|
||||
. = ..()
|
||||
if(.)
|
||||
return user.client.strike_team()
|
||||
@@ -0,0 +1,21 @@
|
||||
/datum/admin_secret_item/fun_secret/toggle_bomb_cap
|
||||
name = "Toggle Bomb Cap"
|
||||
permissions = R_SERVER
|
||||
|
||||
/datum/admin_secret_item/fun_secret/toggle_bomb_cap/execute(var/mob/user)
|
||||
. = ..()
|
||||
if(!.)
|
||||
return
|
||||
|
||||
switch(max_explosion_range)
|
||||
if(14) max_explosion_range = 16
|
||||
if(16) max_explosion_range = 20
|
||||
if(20) max_explosion_range = 28
|
||||
if(28) max_explosion_range = 56
|
||||
if(56) max_explosion_range = 128
|
||||
if(128) max_explosion_range = 14
|
||||
var/range_dev = max_explosion_range *0.25
|
||||
var/range_high = max_explosion_range *0.5
|
||||
var/range_low = max_explosion_range
|
||||
message_admins("<span class='danger'>[key_name_admin(user)] changed the bomb cap to [range_dev], [range_high], [range_low]</span>", 1)
|
||||
log_admin("[key_name_admin(user)] changed the bomb cap to [max_explosion_range]")
|
||||
@@ -0,0 +1,13 @@
|
||||
/datum/admin_secret_item/fun_secret/triple_ai_mode
|
||||
name = "Triple AI Mode"
|
||||
|
||||
/datum/admin_secret_item/fun_secret/triple_ai_mode/can_execute(var/mob/user)
|
||||
if(ticker && ticker.current_state > GAME_STATE_PREGAME)
|
||||
return 0
|
||||
|
||||
return ..()
|
||||
|
||||
/datum/admin_secret_item/admin_secret/triple_ai_mode/execute(var/mob/user)
|
||||
. = ..()
|
||||
if(.)
|
||||
user.client.triple_ai()
|
||||
@@ -0,0 +1,11 @@
|
||||
/datum/admin_secret_item/fun_secret/turn_humans_into_corgies
|
||||
name = "Turn All Humans Into Corgies"
|
||||
|
||||
/datum/admin_secret_item/fun_secret/turn_humans_into_corgies/execute(var/mob/user)
|
||||
. = ..()
|
||||
if(!.)
|
||||
return
|
||||
|
||||
for(var/mob/living/carbon/human/H in mob_list)
|
||||
spawn(0)
|
||||
H.corgize()
|
||||
@@ -0,0 +1,11 @@
|
||||
/datum/admin_secret_item/fun_secret/turn_humans_into_monkeys
|
||||
name = "Turn All Humans Into Monkeys"
|
||||
|
||||
/datum/admin_secret_item/fun_secret/turn_humans_into_monkeys/execute(var/mob/user)
|
||||
. = ..()
|
||||
if(!.)
|
||||
return
|
||||
|
||||
for(var/mob/living/carbon/human/H in mob_list)
|
||||
spawn(0)
|
||||
H.monkeyize()
|
||||
@@ -0,0 +1,31 @@
|
||||
/**********
|
||||
* Gravity *
|
||||
**********/
|
||||
/datum/admin_secret_item/random_event/gravity
|
||||
name = "Toggle Station Artificial Gravity"
|
||||
|
||||
/datum/admin_secret_item/random_event/gravity/can_execute(var/mob/user)
|
||||
if(!(ticker && ticker.mode))
|
||||
return 0
|
||||
|
||||
return ..()
|
||||
|
||||
/datum/admin_secret_item/random_event/gravity/execute(var/mob/user)
|
||||
. = ..()
|
||||
if(!.)
|
||||
return
|
||||
|
||||
gravity_is_on = !gravity_is_on
|
||||
for(var/area/A in world)
|
||||
A.gravitychange(gravity_is_on,A)
|
||||
|
||||
feedback_inc("admin_secrets_fun_used",1)
|
||||
feedback_add_details("admin_secrets_fun_used","Grav")
|
||||
if(gravity_is_on)
|
||||
log_admin("[key_name(user)] toggled gravity on.", 1)
|
||||
message_admins("<span class='notice'>[key_name_admin(user)] toggled gravity on.", 1)
|
||||
command_announcement.Announce("Gravity generators are again functioning within normal parameters. Sorry for any inconvenience.</span>")
|
||||
else
|
||||
log_admin("[key_name(user)] toggled gravity off.", 1)
|
||||
message_admins("<span class='notice'>[key_name_admin(usr)] toggled gravity off.", 1)
|
||||
command_announcement.Announce("Feedback surge detected in mass-distributions systems. Artificial gravity has been disabled whilst the system reinitializes. Further failures may result in a gravitational collapse and formation of blackholes. Have a nice day.</span>")
|
||||
@@ -0,0 +1,7 @@
|
||||
/datum/admin_secret_item/random_event/trigger_cordical_borer_infestation
|
||||
name = "Trigger a Cortical Borer infestation"
|
||||
|
||||
/datum/admin_secret_item/random_event/trigger_cordical_borer_infestation/execute(var/mob/user)
|
||||
. = ..()
|
||||
if(.)
|
||||
return borers.attempt_random_spawn()
|
||||
@@ -0,0 +1,7 @@
|
||||
/datum/admin_secret_item/random_event/trigger_xenomorph_infestation
|
||||
name = "Trigger a Xenomorph Infestation"
|
||||
|
||||
/datum/admin_secret_item/random_event/trigger_xenomorph_infestation/execute(var/mob/user)
|
||||
. = ..()
|
||||
if(.)
|
||||
return xenomorphs.attempt_random_spawn()
|
||||
+9
-739
@@ -1328,15 +1328,15 @@
|
||||
return
|
||||
|
||||
if(L.can_centcom_reply())
|
||||
var/input = sanitize(input(src.owner, "Please enter a message to reply to [key_name(L)] via their headset.","Outgoing message from [boss_short]", ""))
|
||||
var/input = sanitize(input(src.owner, "Please enter a message to reply to [key_name(L)] via their headset.","Outgoing message from Centcomm", ""))
|
||||
if(!input) return
|
||||
|
||||
src.owner << "You sent [input] to [L] via a secure channel."
|
||||
log_admin("[src.owner] replied to [key_name(L)]'s [boss_short] message with the message [input].")
|
||||
message_admins("[src.owner] replied to [key_name(L)]'s [boss_short] message with: \"[input]\"")
|
||||
log_admin("[src.owner] replied to [key_name(L)]'s Centcomm message with the message [input].")
|
||||
message_admins("[src.owner] replied to [key_name(L)]'s Centcom message with: \"[input]\"")
|
||||
if(!L.isMobAI())
|
||||
L << "<span class='info'>You hear something crackle in your headset for a moment before a voice speaks.</span>"
|
||||
L << "<span class='info'>Please stand by for a message from [boss_name].</span>"
|
||||
L << "<span class='info'>Please stand by for a message from Central Command.</span>"
|
||||
L << "<span class='info'>Message as follows.</span>"
|
||||
L << "<span class='notice'>[input]</span>"
|
||||
L << "<span class='info'>Message ends.</span>"
|
||||
@@ -1401,7 +1401,7 @@
|
||||
var/obj/machinery/photocopier/faxmachine/fax = locate(href_list["originfax"])
|
||||
|
||||
//todo: sanitize
|
||||
var/input = input(src.owner, "Please enter a message to reply to [key_name(sender)] via secure connection. NOTE: BBCode does not work, but HTML tags do! Use <br> for line breaks.", "Outgoing message from [boss_short]", "") as message|null
|
||||
var/input = input(src.owner, "Please enter a message to reply to [key_name(sender)] via secure connection. NOTE: BBCode does not work, but HTML tags do! Use <br> for line breaks.", "Outgoing message from Centcomm", "") as message|null
|
||||
if(!input) return
|
||||
|
||||
var/customname = input(src.owner, "Pick a title for the report", "Title") as text|null
|
||||
@@ -1419,7 +1419,7 @@
|
||||
P.stamped = new
|
||||
P.stamped += /obj/item/weapon/stamp
|
||||
P.overlays += stampoverlay
|
||||
P.stamps += "<HR><i>This paper has been stamped by the [boss_name] Quantum Relay.</i>"
|
||||
P.stamps += "<HR><i>This paper has been stamped by the Central Command Quantum Relay.</i>"
|
||||
|
||||
if(fax.recievefax(P))
|
||||
src.owner << "\blue Message reply to transmitted successfully."
|
||||
@@ -1654,739 +1654,9 @@
|
||||
log_and_message_admins("created [number] [english_list(paths)]")
|
||||
return
|
||||
|
||||
else if(href_list["secretsfun"])
|
||||
if(!check_rights(R_FUN)) return
|
||||
|
||||
var/ok = 0
|
||||
switch(href_list["secretsfun"])
|
||||
if("sec_clothes")
|
||||
feedback_inc("admin_secrets_fun_used",1)
|
||||
feedback_add_details("admin_secrets_fun_used","SC")
|
||||
for(var/obj/item/clothing/under/O in world)
|
||||
qdel(O)
|
||||
ok = 1
|
||||
if("sec_all_clothes")
|
||||
feedback_inc("admin_secrets_fun_used",1)
|
||||
feedback_add_details("admin_secrets_fun_used","SAC")
|
||||
for(var/obj/item/clothing/O in world)
|
||||
qdel(O)
|
||||
ok = 1
|
||||
if("sec_classic1")
|
||||
feedback_inc("admin_secrets_fun_used",1)
|
||||
feedback_add_details("admin_secrets_fun_used","SC1")
|
||||
for(var/obj/item/clothing/suit/fire/O in world)
|
||||
qdel(O)
|
||||
for(var/obj/structure/grille/O in world)
|
||||
qdel(O)
|
||||
/* for(var/obj/machinery/vehicle/pod/O in world)
|
||||
for(var/mob/M in src)
|
||||
M.loc = src.loc
|
||||
if (M.client)
|
||||
M.client.perspective = MOB_PERSPECTIVE
|
||||
M.client.eye = M
|
||||
qdel(O)
|
||||
ok = 1*/
|
||||
if("monkey")
|
||||
feedback_inc("admin_secrets_fun_used",1)
|
||||
feedback_add_details("admin_secrets_fun_used","M")
|
||||
for(var/mob/living/carbon/human/H in mob_list)
|
||||
spawn(0)
|
||||
H.monkeyize()
|
||||
ok = 1
|
||||
if("corgi")
|
||||
feedback_inc("admin_secrets_fun_used",1)
|
||||
feedback_add_details("admin_secrets_fun_used","M")
|
||||
for(var/mob/living/carbon/human/H in mob_list)
|
||||
spawn(0)
|
||||
H.corgize()
|
||||
ok = 1
|
||||
if("striketeam")
|
||||
if(usr.client.strike_team())
|
||||
feedback_inc("admin_secrets_fun_used",1)
|
||||
feedback_add_details("admin_secrets_fun_used","Strike")
|
||||
if("tripleAI")
|
||||
usr.client.triple_ai()
|
||||
feedback_inc("admin_secrets_fun_used",1)
|
||||
feedback_add_details("admin_secrets_fun_used","TriAI")
|
||||
if("gravity")
|
||||
if(!(ticker && ticker.mode))
|
||||
usr << "Please wait until the game starts! Not sure how it will work otherwise."
|
||||
return
|
||||
gravity_is_on = !gravity_is_on
|
||||
for(var/area/A in world)
|
||||
A.gravitychange(gravity_is_on,A)
|
||||
feedback_inc("admin_secrets_fun_used",1)
|
||||
feedback_add_details("admin_secrets_fun_used","Grav")
|
||||
if(gravity_is_on)
|
||||
log_admin("[key_name(usr)] toggled gravity on.", 1)
|
||||
message_admins("\blue [key_name_admin(usr)] toggled gravity on.", 1)
|
||||
command_announcement.Announce("Gravity generators are again functioning within normal parameters. Sorry for any inconvenience.")
|
||||
else
|
||||
log_admin("[key_name(usr)] toggled gravity off.", 1)
|
||||
message_admins("\blue [key_name_admin(usr)] toggled gravity off.", 1)
|
||||
command_announcement.Announce("Feedback surge detected in mass-distributions systems. Artifical gravity has been disabled whilst the system reinitializes. Further failures may result in a gravitational collapse and formation of blackholes. Have a nice day.")
|
||||
if("wave")
|
||||
feedback_inc("admin_secrets_fun_used",1)
|
||||
feedback_add_details("admin_secrets_fun_used","Meteor")
|
||||
log_admin("[key_name(usr)] spawned a meteor wave", 1)
|
||||
message_admins("\blue [key_name_admin(usr)] spawned a meteor wave.", 1)
|
||||
new /datum/event/meteor_wave
|
||||
if("goblob")
|
||||
feedback_inc("admin_secrets_fun_used",1)
|
||||
feedback_add_details("admin_secrets_fun_used","Blob")
|
||||
log_admin("[key_name(usr)] spawned a blob", 1)
|
||||
message_admins("\blue [key_name_admin(usr)] spawned a blob.", 1)
|
||||
new /datum/event/blob
|
||||
|
||||
if("aliens")
|
||||
feedback_inc("admin_secrets_fun_used",1)
|
||||
feedback_add_details("admin_secrets_fun_used","Aliens")
|
||||
log_admin("[key_name(usr)] spawned an alien infestation", 1)
|
||||
message_admins("\blue [key_name_admin(usr)] attempted an alien infestation", 1)
|
||||
xenomorphs.attempt_random_spawn()
|
||||
if("borers")
|
||||
feedback_inc("admin_secrets_fun_used",1)
|
||||
feedback_add_details("admin_secrets_fun_used","Borers")
|
||||
log_admin("[key_name(usr)] spawned a cortical borer infestation.", 1)
|
||||
message_admins("\blue [key_name_admin(usr)] spawned a cortical borer infestation.", 1)
|
||||
borers.attempt_random_spawn()
|
||||
|
||||
if("power")
|
||||
feedback_inc("admin_secrets_fun_used",1)
|
||||
feedback_add_details("admin_secrets_fun_used","P")
|
||||
log_admin("[key_name(usr)] made all areas powered", 1)
|
||||
message_admins("\blue [key_name_admin(usr)] made all areas powered", 1)
|
||||
power_restore()
|
||||
if("unpower")
|
||||
feedback_inc("admin_secrets_fun_used",1)
|
||||
feedback_add_details("admin_secrets_fun_used","UP")
|
||||
log_admin("[key_name(usr)] made all areas unpowered", 1)
|
||||
message_admins("\blue [key_name_admin(usr)] made all areas unpowered", 1)
|
||||
power_failure()
|
||||
if("quickpower")
|
||||
feedback_inc("admin_secrets_fun_used",1)
|
||||
feedback_add_details("admin_secrets_fun_used","QP")
|
||||
log_admin("[key_name(usr)] made all SMESs powered", 1)
|
||||
message_admins("\blue [key_name_admin(usr)] made all SMESs powered", 1)
|
||||
power_restore_quick()
|
||||
if("activateprison")
|
||||
feedback_inc("admin_secrets_fun_used",1)
|
||||
feedback_add_details("admin_secrets_fun_used","AP")
|
||||
world << "\blue <B>Transit signature detected.</B>"
|
||||
world << "\blue <B>Incoming shuttle.</B>"
|
||||
/*
|
||||
var/A = locate(/area/shuttle_prison)
|
||||
for(var/atom/movable/AM as mob|obj in A)
|
||||
AM.z = 1
|
||||
AM.Move()
|
||||
*/
|
||||
message_admins("\blue [key_name_admin(usr)] sent the prison shuttle to the station.", 1)
|
||||
if("deactivateprison")
|
||||
/*
|
||||
feedback_inc("admin_secrets_fun_used",1)
|
||||
feedback_add_details("admin_secrets_fun_used","DP")
|
||||
var/A = locate(/area/shuttle_prison)
|
||||
for(var/atom/movable/AM as mob|obj in A)
|
||||
AM.z = 2
|
||||
AM.Move()
|
||||
*/
|
||||
message_admins("\blue [key_name_admin(usr)] sent the prison shuttle back.", 1)
|
||||
if("toggleprisonstatus")
|
||||
feedback_inc("admin_secrets_fun_used",1)
|
||||
feedback_add_details("admin_secrets_fun_used","TPS")
|
||||
for(var/obj/machinery/computer/prison_shuttle/PS in world)
|
||||
PS.allowedtocall = !(PS.allowedtocall)
|
||||
message_admins("\blue [key_name_admin(usr)] toggled status of prison shuttle to [PS.allowedtocall].", 1)
|
||||
if("prisonwarp")
|
||||
if(!ticker)
|
||||
alert("The game hasn't started yet!", null, null, null, null, null)
|
||||
return
|
||||
feedback_inc("admin_secrets_fun_used",1)
|
||||
feedback_add_details("admin_secrets_fun_used","PW")
|
||||
message_admins("\blue [key_name_admin(usr)] teleported all players to the prison station.", 1)
|
||||
for(var/mob/living/carbon/human/H in mob_list)
|
||||
var/turf/loc = find_loc(H)
|
||||
var/security = 0
|
||||
if(loc.z > 1 || prisonwarped.Find(H))
|
||||
//don't warp them if they aren't ready or are already there
|
||||
continue
|
||||
H.Paralyse(5)
|
||||
if(H.wear_id)
|
||||
var/obj/item/weapon/card/id/id = H.get_idcard()
|
||||
for(var/A in id.access)
|
||||
if(A == access_security)
|
||||
security++
|
||||
if(!security)
|
||||
//strip their stuff before they teleport into a cell :downs:
|
||||
for(var/obj/item/weapon/W in H)
|
||||
if(istype(W, /obj/item/organ/external))
|
||||
continue
|
||||
//don't strip organs
|
||||
H.drop_from_inventory(W)
|
||||
//teleport person to cell
|
||||
H.loc = pick(prisonwarp)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/under/color/orange(H), slot_w_uniform)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/orange(H), slot_shoes)
|
||||
else
|
||||
//teleport security person
|
||||
H.loc = pick(prisonsecuritywarp)
|
||||
prisonwarped += H
|
||||
if("launchshuttle")
|
||||
if(!shuttle_controller) return // Something is very wrong, the shuttle controller has not been created.
|
||||
|
||||
feedback_inc("admin_secrets_fun_used",1)
|
||||
feedback_add_details("admin_secrets_fun_used","ShL")
|
||||
|
||||
var/list/valid_shuttles = list()
|
||||
for (var/shuttle_tag in shuttle_controller.shuttles)
|
||||
if (istype(shuttle_controller.shuttles[shuttle_tag], /datum/shuttle/ferry))
|
||||
valid_shuttles += shuttle_tag
|
||||
|
||||
var/shuttle_tag = input("Which shuttle do you want to launch?") as null|anything in valid_shuttles
|
||||
|
||||
if (!shuttle_tag)
|
||||
return
|
||||
|
||||
var/datum/shuttle/ferry/S = shuttle_controller.shuttles[shuttle_tag]
|
||||
if (S.can_launch())
|
||||
S.launch(usr)
|
||||
message_admins("\blue [key_name_admin(usr)] launched the [shuttle_tag] shuttle", 1)
|
||||
log_admin("[key_name(usr)] launched the [shuttle_tag] shuttle")
|
||||
else
|
||||
alert("The [shuttle_tag] shuttle cannot be launched at this time. It's probably busy.")
|
||||
|
||||
if("forcelaunchshuttle")
|
||||
if(!shuttle_controller) return // Something is very wrong, the shuttle controller has not been created.
|
||||
|
||||
feedback_inc("admin_secrets_fun_used",1)
|
||||
feedback_add_details("admin_secrets_fun_used","ShFL")
|
||||
|
||||
var/list/valid_shuttles = list()
|
||||
for (var/shuttle_tag in shuttle_controller.shuttles)
|
||||
if (istype(shuttle_controller.shuttles[shuttle_tag], /datum/shuttle/ferry))
|
||||
valid_shuttles += shuttle_tag
|
||||
|
||||
var/shuttle_tag = input("Which shuttle's launch do you want to force?") as null|anything in valid_shuttles
|
||||
|
||||
if (!shuttle_tag)
|
||||
return
|
||||
|
||||
var/datum/shuttle/ferry/S = shuttle_controller.shuttles[shuttle_tag]
|
||||
if (S.can_force())
|
||||
S.force_launch(usr)
|
||||
message_admins("\blue [key_name_admin(usr)] has forced the [shuttle_tag] shuttle launch", 1)
|
||||
log_admin("[key_name(usr)] has forced the [shuttle_tag] shuttle launch")
|
||||
else
|
||||
alert("The [shuttle_tag] shuttle launch cannot be forced at this time. It's busy, or hasn't been launched yet.")
|
||||
|
||||
if("jumpshuttle")
|
||||
if(!shuttle_controller) return // Something is very wrong, the shuttle controller has not been created.
|
||||
|
||||
feedback_inc("admin_secrets_fun_used",1)
|
||||
feedback_add_details("admin_secrets_fun_used","ShJ")
|
||||
|
||||
var/shuttle_tag = input("Which shuttle do you want to jump?") as null|anything in shuttle_controller.shuttles
|
||||
if (!shuttle_tag) return
|
||||
|
||||
var/datum/shuttle/S = shuttle_controller.shuttles[shuttle_tag]
|
||||
|
||||
var/origin_area = input("Which area is the shuttle at now? (MAKE SURE THIS IS CORRECT OR THINGS WILL BREAK)") as null|area in world
|
||||
if (!origin_area) return
|
||||
|
||||
var/destination_area = input("Which area is the shuttle at now? (MAKE SURE THIS IS CORRECT OR THINGS WILL BREAK)") as null|area in world
|
||||
if (!destination_area) return
|
||||
|
||||
var/long_jump = alert("Is there a transition area for this jump?","", "Yes", "No")
|
||||
if (long_jump == "Yes")
|
||||
var/transition_area = input("Which area is the transition area? (MAKE SURE THIS IS CORRECT OR THINGS WILL BREAK)") as null|area in world
|
||||
if (!transition_area) return
|
||||
|
||||
var/move_duration = input("How many seconds will this jump take?") as num
|
||||
|
||||
S.long_jump(origin_area, destination_area, transition_area, move_duration)
|
||||
message_admins("\blue [key_name_admin(usr)] has initiated a jump from [origin_area] to [destination_area] lasting [move_duration] seconds for the [shuttle_tag] shuttle", 1)
|
||||
log_admin("[key_name_admin(usr)] has initiated a jump from [origin_area] to [destination_area] lasting [move_duration] seconds for the [shuttle_tag] shuttle")
|
||||
else
|
||||
S.short_jump(origin_area, destination_area)
|
||||
message_admins("\blue [key_name_admin(usr)] has initiated a jump from [origin_area] to [destination_area] for the [shuttle_tag] shuttle", 1)
|
||||
log_admin("[key_name_admin(usr)] has initiated a jump from [origin_area] to [destination_area] for the [shuttle_tag] shuttle")
|
||||
|
||||
if("moveshuttle")
|
||||
|
||||
if(!shuttle_controller) return // Something is very wrong, the shuttle controller has not been created.
|
||||
|
||||
feedback_inc("admin_secrets_fun_used",1)
|
||||
feedback_add_details("admin_secrets_fun_used","ShM")
|
||||
|
||||
var/confirm = alert("This command directly moves a shuttle from one area to another. DO NOT USE THIS UNLESS YOU ARE DEBUGGING A SHUTTLE AND YOU KNOW WHAT YOU ARE DOING.", "Are you sure?", "Ok", "Cancel")
|
||||
if (confirm == "Cancel")
|
||||
return
|
||||
|
||||
var/shuttle_tag = input("Which shuttle do you want to jump?") as null|anything in shuttle_controller.shuttles
|
||||
if (!shuttle_tag) return
|
||||
|
||||
var/datum/shuttle/S = shuttle_controller.shuttles[shuttle_tag]
|
||||
|
||||
var/origin_area = input("Which area is the shuttle at now? (MAKE SURE THIS IS CORRECT OR THINGS WILL BREAK)") as null|area in world
|
||||
if (!origin_area) return
|
||||
|
||||
var/destination_area = input("Which area is the shuttle at now? (MAKE SURE THIS IS CORRECT OR THINGS WILL BREAK)") as null|area in world
|
||||
if (!destination_area) return
|
||||
|
||||
S.move(origin_area, destination_area)
|
||||
message_admins("\blue [key_name_admin(usr)] moved the [shuttle_tag] shuttle", 1)
|
||||
log_admin("[key_name(usr)] moved the [shuttle_tag] shuttle")
|
||||
|
||||
if("togglebombcap")
|
||||
feedback_inc("admin_secrets_fun_used",1)
|
||||
feedback_add_details("admin_secrets_fun_used","BC")
|
||||
switch(max_explosion_range)
|
||||
if(14) max_explosion_range = 16
|
||||
if(16) max_explosion_range = 20
|
||||
if(20) max_explosion_range = 28
|
||||
if(28) max_explosion_range = 56
|
||||
if(56) max_explosion_range = 128
|
||||
if(128) max_explosion_range = 14
|
||||
var/range_dev = max_explosion_range *0.25
|
||||
var/range_high = max_explosion_range *0.5
|
||||
var/range_low = max_explosion_range
|
||||
message_admins("\red <b> [key_name_admin(usr)] changed the bomb cap to [range_dev], [range_high], [range_low]</b>", 1)
|
||||
log_admin("[key_name_admin(usr)] changed the bomb cap to [max_explosion_range]")
|
||||
|
||||
if("flicklights")
|
||||
feedback_inc("admin_secrets_fun_used",1)
|
||||
feedback_add_details("admin_secrets_fun_used","FL")
|
||||
while(!usr.stat)
|
||||
//knock yourself out to stop the ghosts
|
||||
for(var/mob/M in player_list)
|
||||
if(M.stat != 2 && prob(25))
|
||||
var/area/AffectedArea = get_area(M)
|
||||
if(AffectedArea.name != "Space" && AffectedArea.name != "Engine Walls" && AffectedArea.name != "Chemical Lab Test Chamber" && AffectedArea.name != "Escape Shuttle" && AffectedArea.name != "Arrival Area" && AffectedArea.name != "Arrival Shuttle" && AffectedArea.name != "start area" && AffectedArea.name != "Engine Combustion Chamber")
|
||||
AffectedArea.power_light = 0
|
||||
AffectedArea.power_change()
|
||||
spawn(rand(55,185))
|
||||
AffectedArea.power_light = 1
|
||||
AffectedArea.power_change()
|
||||
var/Message = rand(1,4)
|
||||
switch(Message)
|
||||
if(1)
|
||||
M.show_message(text("\blue You shudder as if cold..."), 1)
|
||||
if(2)
|
||||
M.show_message(text("\blue You feel something gliding across your back..."), 1)
|
||||
if(3)
|
||||
M.show_message(text("\blue Your eyes twitch, you feel like something you can't see is here..."), 1)
|
||||
if(4)
|
||||
M.show_message(text("\blue You notice something moving out of the corner of your eye, but nothing is there..."), 1)
|
||||
for(var/obj/W in orange(5,M))
|
||||
if(prob(25) && !W.anchored)
|
||||
step_rand(W)
|
||||
sleep(rand(100,1000))
|
||||
for(var/mob/M in player_list)
|
||||
if(M.stat != 2)
|
||||
M.show_message(text("\blue The chilling wind suddenly stops..."), 1)
|
||||
/* if("shockwave")
|
||||
ok = 1
|
||||
world << "\red <B><big>ALERT: STATION STRESS CRITICAL</big></B>"
|
||||
sleep(60)
|
||||
world << "\red <B><big>ALERT: STATION STRESS CRITICAL. TOLERABLE LEVELS EXCEEDED!</big></B>"
|
||||
sleep(80)
|
||||
world << "\red <B><big>ALERT: STATION STRUCTURAL STRESS CRITICAL. SAFETY MECHANISMS FAILED!</big></B>"
|
||||
sleep(40)
|
||||
for(var/mob/M in world)
|
||||
shake_camera(M, 400, 1)
|
||||
for(var/obj/structure/window/W in world)
|
||||
spawn(0)
|
||||
sleep(rand(10,400))
|
||||
W.ex_act(rand(2,1))
|
||||
for(var/obj/structure/grille/G in world)
|
||||
spawn(0)
|
||||
sleep(rand(20,400))
|
||||
G.ex_act(rand(2,1))
|
||||
for(var/obj/machinery/door/D in world)
|
||||
spawn(0)
|
||||
sleep(rand(20,400))
|
||||
D.ex_act(rand(2,1))
|
||||
for(var/turf/station/floor/Floor in world)
|
||||
spawn(0)
|
||||
sleep(rand(30,400))
|
||||
Floor.ex_act(rand(2,1))
|
||||
for(var/obj/structure/cable/Cable in world)
|
||||
spawn(0)
|
||||
sleep(rand(30,400))
|
||||
Cable.ex_act(rand(2,1))
|
||||
for(var/obj/structure/closet/Closet in world)
|
||||
spawn(0)
|
||||
sleep(rand(30,400))
|
||||
Closet.ex_act(rand(2,1))
|
||||
for(var/obj/machinery/Machinery in world)
|
||||
spawn(0)
|
||||
sleep(rand(30,400))
|
||||
Machinery.ex_act(rand(1,3))
|
||||
for(var/turf/station/wall/Wall in world)
|
||||
spawn(0)
|
||||
sleep(rand(30,400))
|
||||
Wall.ex_act(rand(2,1)) */
|
||||
if("wave")
|
||||
feedback_inc("admin_secrets_fun_used",1)
|
||||
feedback_add_details("admin_secrets_fun_used","MW")
|
||||
new /datum/event/meteor_wave
|
||||
|
||||
if("gravanomalies")
|
||||
feedback_inc("admin_secrets_fun_used",1)
|
||||
feedback_add_details("admin_secrets_fun_used","GA")
|
||||
command_announcement.Announce("Gravitational anomalies detected on the station. There is no additional data.", "Anomaly Alert", 'sound/AI/granomalies.ogg')
|
||||
var/turf/T = pick(blobstart)
|
||||
var/obj/effect/bhole/bh = new /obj/effect/bhole( T.loc, 30 )
|
||||
spawn(rand(100, 600))
|
||||
qdel(bh)
|
||||
|
||||
if("timeanomalies") //dear god this code was awful :P Still needs further optimisation
|
||||
feedback_inc("admin_secrets_fun_used",1)
|
||||
feedback_add_details("admin_secrets_fun_used","STA")
|
||||
//moved to its own dm so I could split it up and prevent the spawns copying variables over and over
|
||||
//can be found in code\game\game_modes\events\wormholes.dm
|
||||
wormhole_event()
|
||||
|
||||
if("goblob")
|
||||
feedback_inc("admin_secrets_fun_used",1)
|
||||
feedback_add_details("admin_secrets_fun_used","BL")
|
||||
mini_blob_event()
|
||||
message_admins("[key_name_admin(usr)] has spawned blob", 1)
|
||||
if("aliens")
|
||||
feedback_inc("admin_secrets_fun_used",1)
|
||||
feedback_add_details("admin_secrets_fun_used","AL")
|
||||
if(xenomorphs.attempt_random_spawn())
|
||||
message_admins("[key_name_admin(usr)] has spawned aliens", 1)
|
||||
if("spiders")
|
||||
feedback_inc("admin_secrets_fun_used",1)
|
||||
feedback_add_details("admin_secrets_fun_used","SL")
|
||||
new /datum/event/spider_infestation
|
||||
message_admins("[key_name_admin(usr)] has spawned spiders", 1)
|
||||
if("comms_blackout")
|
||||
feedback_inc("admin_secrets_fun_used",1)
|
||||
feedback_add_details("admin_secrets_fun_used","CB")
|
||||
var/answer = alert(usr, "Would you like to alert the crew?", "Alert", "Yes", "No")
|
||||
if(answer == "Yes")
|
||||
communications_blackout(0)
|
||||
else
|
||||
communications_blackout(1)
|
||||
message_admins("[key_name_admin(usr)] triggered a communications blackout.", 1)
|
||||
if("carp")
|
||||
feedback_inc("admin_secrets_fun_used",1)
|
||||
feedback_add_details("admin_secrets_fun_used","C")
|
||||
var/choice = input("You sure you want to spawn carp?") in list("Badmin", "Cancel")
|
||||
if(choice == "Badmin")
|
||||
message_admins("[key_name_admin(usr)] has spawned carp.", 1)
|
||||
new /datum/event/carp_migration
|
||||
if("radiation")
|
||||
feedback_inc("admin_secrets_fun_used",1)
|
||||
feedback_add_details("admin_secrets_fun_used","R")
|
||||
message_admins("[key_name_admin(usr)] has has irradiated the station", 1)
|
||||
new /datum/event/radiation_storm
|
||||
if("immovable")
|
||||
feedback_inc("admin_secrets_fun_used",1)
|
||||
feedback_add_details("admin_secrets_fun_used","IR")
|
||||
message_admins("[key_name_admin(usr)] has sent an immovable rod to the station", 1)
|
||||
immovablerod()
|
||||
if("prison_break")
|
||||
feedback_inc("admin_secrets_fun_used",1)
|
||||
feedback_add_details("admin_secrets_fun_used","PB")
|
||||
message_admins("[key_name_admin(usr)] has allowed a prison break", 1)
|
||||
prison_break()
|
||||
if("lightout")
|
||||
feedback_inc("admin_secrets_fun_used",1)
|
||||
feedback_add_details("admin_secrets_fun_used","LO")
|
||||
message_admins("[key_name_admin(usr)] has broke a lot of lights", 1)
|
||||
lightsout(1,2)
|
||||
if("blackout")
|
||||
feedback_inc("admin_secrets_fun_used",1)
|
||||
feedback_add_details("admin_secrets_fun_used","BO")
|
||||
message_admins("[key_name_admin(usr)] broke all lights", 1)
|
||||
lightsout(0,0)
|
||||
if("whiteout")
|
||||
feedback_inc("admin_secrets_fun_used",1)
|
||||
feedback_add_details("admin_secrets_fun_used","WO")
|
||||
for(var/obj/machinery/light/L in world)
|
||||
L.fix()
|
||||
message_admins("[key_name_admin(usr)] fixed all lights", 1)
|
||||
if("friendai")
|
||||
feedback_inc("admin_secrets_fun_used",1)
|
||||
feedback_add_details("admin_secrets_fun_used","FA")
|
||||
for(var/mob/eye/aiEye/aE in mob_list)
|
||||
aE.icon_state = "ai_friend"
|
||||
for(var/obj/machinery/M in machines)
|
||||
if(istype(M, /obj/machinery/ai_status_display))
|
||||
var/obj/machinery/ai_status_display/A = M
|
||||
A.emotion = "Friend Computer"
|
||||
else if(istype(M, /obj/machinery/status_display))
|
||||
var/obj/machinery/status_display/A = M
|
||||
A.friendc = 1
|
||||
message_admins("[key_name_admin(usr)] turned all AIs into best friends.", 1)
|
||||
if("floorlava")
|
||||
if(floorIsLava)
|
||||
usr << "The floor is lava already."
|
||||
return
|
||||
feedback_inc("admin_secrets_fun_used",1)
|
||||
feedback_add_details("admin_secrets_fun_used","LF")
|
||||
|
||||
//Options
|
||||
var/length = input(usr, "How long will the lava last? (in seconds)", "Length", 180) as num
|
||||
length = min(abs(length), 1200)
|
||||
|
||||
var/damage = input(usr, "How deadly will the lava be?", "Damage", 2) as num
|
||||
damage = min(abs(damage), 100)
|
||||
|
||||
var/sure = alert(usr, "Are you sure you want to do this?", "Confirmation", "YES!", "Nah")
|
||||
if(sure == "Nah")
|
||||
return
|
||||
floorIsLava = 1
|
||||
|
||||
message_admins("[key_name_admin(usr)] made the floor LAVA! It'll last [length] seconds and it will deal [damage] damage to everyone.", 1)
|
||||
|
||||
for(var/turf/simulated/floor/F in world)
|
||||
if(F.z in config.station_levels)
|
||||
F.name = "lava"
|
||||
F.desc = "The floor is LAVA!"
|
||||
F.overlays += "lava"
|
||||
F.lava = 1
|
||||
|
||||
spawn(0)
|
||||
for(var/i = i, i < length, i++) // 180 = 3 minutes
|
||||
if(damage)
|
||||
for(var/mob/living/carbon/L in living_mob_list)
|
||||
if(istype(L.loc, /turf/simulated/floor)) // Are they on LAVA?!
|
||||
var/turf/simulated/floor/F = L.loc
|
||||
if(F.lava)
|
||||
var/safe = 0
|
||||
for(var/obj/structure/O in F.contents)
|
||||
if(O.level > F.level && !istype(O, /obj/structure/window)) // Something to stand on and it isn't under the floor!
|
||||
safe = 1
|
||||
break
|
||||
if(!safe)
|
||||
L.adjustFireLoss(damage)
|
||||
|
||||
|
||||
sleep(10)
|
||||
|
||||
for(var/turf/simulated/floor/F in world) // Reset everything.
|
||||
if(F.z in config.station_levels)
|
||||
F.name = initial(F.name)
|
||||
F.desc = initial(F.desc)
|
||||
F.overlays.Cut()
|
||||
F.lava = 0
|
||||
F.update_icon()
|
||||
floorIsLava = 0
|
||||
return
|
||||
if("virus")
|
||||
feedback_inc("admin_secrets_fun_used",1)
|
||||
feedback_add_details("admin_secrets_fun_used","V")
|
||||
var/answer = alert("Do you want this to be a greater disease or a lesser one?",,"Greater","Lesser")
|
||||
if(answer=="Lesser")
|
||||
virus2_lesser_infection()
|
||||
message_admins("[key_name_admin(usr)] has triggered a lesser virus outbreak.", 1)
|
||||
else
|
||||
virus2_greater_infection()
|
||||
message_admins("[key_name_admin(usr)] has triggered a greater virus outbreak.", 1)
|
||||
if("retardify")
|
||||
feedback_inc("admin_secrets_fun_used",1)
|
||||
feedback_add_details("admin_secrets_fun_used","RET")
|
||||
for(var/mob/living/carbon/human/H in player_list)
|
||||
H << "\red <B>You suddenly feel stupid.</B>"
|
||||
H.setBrainLoss(60)
|
||||
message_admins("[key_name_admin(usr)] made everybody retarded")
|
||||
if("fakeguns")
|
||||
feedback_inc("admin_secrets_fun_used",1)
|
||||
feedback_add_details("admin_secrets_fun_used","FG")
|
||||
for(var/obj/item/W in world)
|
||||
if(istype(W, /obj/item/clothing) || istype(W, /obj/item/weapon/card/id) || istype(W, /obj/item/weapon/disk) || istype(W, /obj/item/weapon/tank))
|
||||
continue
|
||||
W.icon = 'icons/obj/gun.dmi'
|
||||
W.icon_state = "revolver"
|
||||
W.item_state = "gun"
|
||||
message_admins("[key_name_admin(usr)] made every item look like a gun")
|
||||
if("schoolgirl")
|
||||
feedback_inc("admin_secrets_fun_used",1)
|
||||
feedback_add_details("admin_secrets_fun_used","SG")
|
||||
for(var/obj/item/clothing/under/W in world)
|
||||
W.icon_state = "schoolgirl"
|
||||
W.item_state = "w_suit"
|
||||
message_admins("[key_name_admin(usr)] activated Japanese Animes mode")
|
||||
world << sound('sound/AI/animes.ogg')
|
||||
if("paintball")
|
||||
feedback_inc("admin_secrets_fun_used",1)
|
||||
feedback_add_details("admin_secrets_fun_used","PB")
|
||||
for(var/species in all_species)
|
||||
var/datum/species/S = all_species[species]
|
||||
S.blood_color = "rainbow"
|
||||
for(var/obj/effect/decal/cleanable/blood/B in world)
|
||||
B.basecolor = "rainbow"
|
||||
B.update_icon()
|
||||
message_admins("[key_name_admin(usr)] activated Paintball mode")
|
||||
if("eagles")//SCRAW
|
||||
feedback_inc("admin_secrets_fun_used",1)
|
||||
feedback_add_details("admin_secrets_fun_used","EgL")
|
||||
for(var/obj/machinery/door/airlock/W in world)
|
||||
if(W.z in config.station_levels && !istype(get_area(W), /area/bridge) && !istype(get_area(W), /area/crew_quarters) && !istype(get_area(W), /area/security/prison))
|
||||
W.req_access = list()
|
||||
message_admins("[key_name_admin(usr)] activated Egalitarian Station mode")
|
||||
command_announcement.Announce("[boss_short] airlock control override activated. Please take this time to get acquainted with your coworkers.", new_sound = 'sound/AI/commandreport.ogg')
|
||||
if("dorf")
|
||||
feedback_inc("admin_secrets_fun_used",1)
|
||||
feedback_add_details("admin_secrets_fun_used","DF")
|
||||
for(var/mob/living/carbon/human/B in mob_list)
|
||||
B.f_style = "Dward Beard"
|
||||
B.update_hair()
|
||||
message_admins("[key_name_admin(usr)] activated dorf mode")
|
||||
if("ionstorm")
|
||||
feedback_inc("admin_secrets_fun_used",1)
|
||||
feedback_add_details("admin_secrets_fun_used","I")
|
||||
IonStorm()
|
||||
message_admins("[key_name_admin(usr)] triggered an ion storm")
|
||||
var/show_log = alert(usr, "Show ion message?", "Message", "Yes", "No")
|
||||
if(show_log == "Yes")
|
||||
command_announcement.Announce("Ion storm detected near the station. Please check all AI-controlled equipment for errors.", "Anomaly Alert", new_sound = 'sound/AI/ionstorm.ogg')
|
||||
if("onlyone")
|
||||
feedback_inc("admin_secrets_fun_used",1)
|
||||
feedback_add_details("admin_secrets_fun_used","OO")
|
||||
only_one()
|
||||
message_admins("[key_name_admin(usr)] has triggered a battle to the death (only one)")
|
||||
|
||||
if("togglenarsie")
|
||||
feedback_inc("admin_secrets_fun_used",1)
|
||||
feedback_add_details("admin_secrets_fun_used","NA")
|
||||
var/choice = input("How do you wish for narsie to interact with her surroundings?") in list("CultStation13", "Nar-Singulo")
|
||||
if(choice == "CultStation13")
|
||||
message_admins("[key_name_admin(usr)] has set narsie's behaviour to \"CultStation13\".")
|
||||
narsie_behaviour = "CultStation13"
|
||||
if(choice == "Nar-Singulo")
|
||||
message_admins("[key_name_admin(usr)] has set narsie's behaviour to \"Nar-Singulo\".")
|
||||
narsie_behaviour = "Nar-Singulo"
|
||||
if("hellonearth")
|
||||
feedback_inc("admin_secrets_fun_used",1)
|
||||
feedback_add_details("admin_secrets_fun_used","NS")
|
||||
var/choice = input("You sure you want to end the round and summon narsie at your location? Misuse of this could result in removal of flags or hilarity.") in list("PRAISE SATAN", "Cancel")
|
||||
if(choice == "PRAISE SATAN")
|
||||
new /obj/singularity/narsie/large(get_turf(usr))
|
||||
message_admins("[key_name_admin(usr)] has summoned narsie and brought about a new realm of suffering.")
|
||||
if("supermattercascade")
|
||||
feedback_inc("admin_secrets_fun_used",1)
|
||||
feedback_add_details("admin_secrets_fun_used","SC")
|
||||
var/choice = input("You sure you want to destroy the universe and create a large explosion at your location? Misuse of this could result in removal of flags or hilarity.") in list("NO TIME TO EXPLAIN", "Cancel")
|
||||
if(choice == "NO TIME TO EXPLAIN")
|
||||
explosion(get_turf(usr), 8, 16, 24, 32, 1)
|
||||
new /turf/unsimulated/wall/supermatter(get_turf(usr))
|
||||
SetUniversalState(/datum/universal_state/supermatter_cascade)
|
||||
message_admins("[key_name_admin(usr)] has managed to destroy the universe with a supermatter cascade. Good job, [key_name_admin(usr)]")
|
||||
if(usr)
|
||||
log_admin("[key_name(usr)] used secret [href_list["secretsfun"]]")
|
||||
if (ok)
|
||||
world << text("<B>A secret has been activated by []!</B>", usr.key)
|
||||
|
||||
else if(href_list["secretsadmin"])
|
||||
if(!check_rights(R_ADMIN)) return
|
||||
|
||||
var/ok = 0
|
||||
switch(href_list["secretsadmin"])
|
||||
if("clear_bombs")
|
||||
//I do nothing
|
||||
if("list_bombers")
|
||||
var/dat = "<B>Bombing List<HR>"
|
||||
for(var/l in bombers)
|
||||
dat += text("[l]<BR>")
|
||||
usr << browse(dat, "window=bombers")
|
||||
if("list_signalers")
|
||||
var/dat = "<B>Showing last [length(lastsignalers)] signalers.</B><HR>"
|
||||
for(var/sig in lastsignalers)
|
||||
dat += "[sig]<BR>"
|
||||
usr << browse(dat, "window=lastsignalers;size=800x500")
|
||||
if("list_lawchanges")
|
||||
var/dat = "<B>Showing last [length(lawchanges)] law changes.</B><HR>"
|
||||
for(var/sig in lawchanges)
|
||||
dat += "[sig]<BR>"
|
||||
usr << browse(dat, "window=lawchanges;size=800x500")
|
||||
if("list_job_debug")
|
||||
var/dat = "<B>Job Debug info.</B><HR>"
|
||||
if(job_master)
|
||||
for(var/line in job_master.job_debug)
|
||||
dat += "[line]<BR>"
|
||||
dat+= "*******<BR><BR>"
|
||||
for(var/datum/job/job in job_master.occupations)
|
||||
if(!job) continue
|
||||
dat += "job: [job.title], current_positions: [job.current_positions], total_positions: [job.total_positions] <BR>"
|
||||
usr << browse(dat, "window=jobdebug;size=600x500")
|
||||
if("showailaws")
|
||||
output_ai_laws()
|
||||
if("showgm")
|
||||
if(!ticker)
|
||||
alert("The game hasn't started yet!")
|
||||
else if (ticker.mode)
|
||||
alert("The game mode is [ticker.mode.name]")
|
||||
else alert("For some reason there's a ticker, but not a game mode")
|
||||
if("manifest")
|
||||
var/dat = "<B>Showing Crew Manifest.</B><HR>"
|
||||
dat += "<table cellspacing=5><tr><th>Name</th><th>Position</th></tr>"
|
||||
for(var/mob/living/carbon/human/H in mob_list)
|
||||
if(H.ckey)
|
||||
dat += text("<tr><td>[]</td><td>[]</td></tr>", H.name, H.get_assignment())
|
||||
dat += "</table>"
|
||||
usr << browse(dat, "window=manifest;size=440x410")
|
||||
if("check_antagonist")
|
||||
check_antagonists()
|
||||
if("DNA")
|
||||
var/dat = "<B>Showing DNA from blood.</B><HR>"
|
||||
dat += "<table cellspacing=5><tr><th>Name</th><th>DNA</th><th>Blood Type</th></tr>"
|
||||
for(var/mob/living/carbon/human/H in mob_list)
|
||||
if(H.dna && H.ckey)
|
||||
dat += "<tr><td>[H]</td><td>[H.dna.unique_enzymes]</td><td>[H.b_type]</td></tr>"
|
||||
dat += "</table>"
|
||||
usr << browse(dat, "window=DNA;size=440x410")
|
||||
if("fingerprints")
|
||||
var/dat = "<B>Showing Fingerprints.</B><HR>"
|
||||
dat += "<table cellspacing=5><tr><th>Name</th><th>Fingerprints</th></tr>"
|
||||
for(var/mob/living/carbon/human/H in mob_list)
|
||||
if(H.ckey)
|
||||
if(H.dna && H.dna.uni_identity)
|
||||
dat += "<tr><td>[H]</td><td>[md5(H.dna.uni_identity)]</td></tr>"
|
||||
else if(H.dna && !H.dna.uni_identity)
|
||||
dat += "<tr><td>[H]</td><td>H.dna.uni_identity = null</td></tr>"
|
||||
else if(!H.dna)
|
||||
dat += "<tr><td>[H]</td><td>H.dna = null</td></tr>"
|
||||
dat += "</table>"
|
||||
usr << browse(dat, "window=fingerprints;size=440x410")
|
||||
else
|
||||
if (usr)
|
||||
log_admin("[key_name(usr)] used secret [href_list["secretsadmin"]]")
|
||||
if (ok)
|
||||
world << text("<B>A secret has been activated by []!</B>", usr.key)
|
||||
|
||||
else if(href_list["secretscoder"])
|
||||
if(!check_rights(R_DEBUG)) return
|
||||
|
||||
switch(href_list["secretscoder"])
|
||||
if("spawn_objects")
|
||||
var/dat = "<B>Admin Log<HR></B>"
|
||||
for(var/l in admin_log)
|
||||
dat += "<li>[l]</li>"
|
||||
if(!admin_log.len)
|
||||
dat += "No-one has done anything this round!"
|
||||
usr << browse(dat, "window=admin_log")
|
||||
if("maint_access_brig")
|
||||
for(var/obj/machinery/door/airlock/maintenance/M in world)
|
||||
if (access_maint_tunnels in M.req_access)
|
||||
M.req_access = list(access_brig)
|
||||
message_admins("[key_name_admin(usr)] made all maint doors brig access-only.")
|
||||
if("maint_access_engiebrig")
|
||||
for(var/obj/machinery/door/airlock/maintenance/M in world)
|
||||
if (access_maint_tunnels in M.req_access)
|
||||
M.req_access = list()
|
||||
M.req_one_access = list(access_brig,access_engine)
|
||||
message_admins("[key_name_admin(usr)] made all maint doors engineering and brig access-only.")
|
||||
if("infinite_sec")
|
||||
var/datum/job/J = job_master.GetJob("Security Officer")
|
||||
if(!J) return
|
||||
J.total_positions = -1
|
||||
J.spawn_positions = -1
|
||||
message_admins("[key_name_admin(usr)] has removed the cap on security officers.")
|
||||
else if(href_list["admin_secrets"])
|
||||
var/datum/admin_secret_item/item = locate(href_list["admin_secrets"]) in admin_secrets.items
|
||||
item.execute(usr)
|
||||
|
||||
else if(href_list["ac_view_wanted"]) //Admin newscaster Topic() stuff be here
|
||||
src.admincaster_screen = 18 //The ac_ prefix before the hrefs stands for AdminCaster.
|
||||
|
||||
@@ -234,6 +234,7 @@
|
||||
|
||||
/obj/effect/plant/attackby(var/obj/item/weapon/W, var/mob/user)
|
||||
|
||||
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
|
||||
plant_controller.add_plant(src)
|
||||
|
||||
if(istype(W, /obj/item/weapon/wirecutters) || istype(W, /obj/item/weapon/scalpel))
|
||||
|
||||
@@ -533,6 +533,7 @@
|
||||
user << "You [anchored ? "wrench" : "unwrench"] \the [src]."
|
||||
|
||||
else if(O.force && seed)
|
||||
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
|
||||
user.visible_message("<span class='danger'>\The [seed.display_name] has been attacked by [user] with \the [O]!</span>")
|
||||
if(!dead)
|
||||
health -= O.force
|
||||
|
||||
@@ -492,7 +492,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
||||
host << "<span class='info'>You are now a mouse. Try to avoid interaction with players, and do not give hints away that you are more than a simple rodent.</span>"
|
||||
|
||||
/mob/dead/observer/verb/view_manfiest()
|
||||
set name = "View Crew Manifest"
|
||||
set name = "Show Crew Manifest"
|
||||
set category = "Ghost"
|
||||
|
||||
var/dat
|
||||
|
||||
@@ -24,6 +24,10 @@
|
||||
for(var/turf/t in c.can_see())
|
||||
visible[t] = t
|
||||
|
||||
for(var/mob/living/silicon/ai/AI in living_mob_list)
|
||||
for(var/turf/t in AI.seen_camera_turfs())
|
||||
visible[t] = t
|
||||
|
||||
// Create a new camera chunk, since the chunks are made as they are needed.
|
||||
|
||||
/datum/chunk/camera/New(loc, x, y, z)
|
||||
@@ -31,3 +35,15 @@
|
||||
if(c.can_use())
|
||||
cameras += c
|
||||
..()
|
||||
|
||||
/mob/living/silicon/proc/provides_camera_vision()
|
||||
return 0
|
||||
|
||||
/mob/living/silicon/ai/provides_camera_vision()
|
||||
return stat != DEAD
|
||||
|
||||
/mob/living/silicon/robot/provides_camera_vision()
|
||||
return src.camera && src.camera.network.len
|
||||
|
||||
/mob/living/silicon/ai/proc/seen_camera_turfs()
|
||||
return seen_turfs_in_range(src, world.view)
|
||||
|
||||
@@ -4,13 +4,13 @@
|
||||
|
||||
// Update the portable camera everytime the Robot moves.
|
||||
// This might be laggy, comment it out if there are problems.
|
||||
/mob/living/silicon/robot/var/updating = 0
|
||||
/mob/living/silicon/var/updating = 0
|
||||
|
||||
/mob/living/silicon/robot/Move()
|
||||
var/oldLoc = src.loc
|
||||
. = ..()
|
||||
if(.)
|
||||
if(src.camera && src.camera.network.len)
|
||||
if(provides_camera_vision())
|
||||
if(!updating)
|
||||
updating = 1
|
||||
spawn(BORG_CAMERA_BUFFER)
|
||||
@@ -18,6 +18,21 @@
|
||||
cameranet.updatePortableCamera(src.camera)
|
||||
updating = 0
|
||||
|
||||
/mob/living/silicon/AI/Move()
|
||||
var/oldLoc = src.loc
|
||||
. = ..()
|
||||
if(.)
|
||||
if(provides_camera_vision())
|
||||
if(!updating)
|
||||
updating = 1
|
||||
spawn(BORG_CAMERA_BUFFER)
|
||||
if(oldLoc != src.loc)
|
||||
cameranet.updateVisibility(oldLoc, 0)
|
||||
cameranet.updateVisibility(loc, 0)
|
||||
updating = 0
|
||||
|
||||
#undef BORG_CAMERA_BUFFER
|
||||
|
||||
// CAMERA
|
||||
|
||||
// An addition to deactivate which removes/adds the camera from the chunk list based on if it works or not.
|
||||
@@ -42,8 +57,19 @@
|
||||
update_coverage(1)
|
||||
|
||||
/obj/machinery/camera/Destroy()
|
||||
cameranet.cameras -= src
|
||||
clear_all_networks()
|
||||
cameranet.cameras -= src
|
||||
..()
|
||||
|
||||
#undef BORG_CAMERA_BUFFER
|
||||
// Mobs
|
||||
/mob/living/silicon/ai/rejuvenate()
|
||||
var/was_dead = stat == DEAD
|
||||
..()
|
||||
if(was_dead && stat != DEAD)
|
||||
// Arise!
|
||||
cameranet.updateVisibility(src, 0)
|
||||
|
||||
/mob/living/silicon/ai/death(gibbed)
|
||||
if(..())
|
||||
// If true, the mob went from living to dead (assuming everyone has been overriding as they should...)
|
||||
cameranet.updateVisibility(src, 0)
|
||||
|
||||
@@ -41,12 +41,15 @@ mob/eye/Destroy()
|
||||
updateallghostimages()
|
||||
..()
|
||||
|
||||
// Movement code. Returns 0 to stop air movement from moving it.
|
||||
/mob/eye/Move(n, direct)
|
||||
if(owner == src)
|
||||
EyeMove(n, direct)
|
||||
return EyeMove(n, direct)
|
||||
return 0
|
||||
|
||||
/mob/eye/airflow_hit(atom/A)
|
||||
airflow_speed = 0
|
||||
airflow_dest = null
|
||||
|
||||
/mob/eye/examinate()
|
||||
set popup_menu = 0
|
||||
set src = usr.contents
|
||||
@@ -110,3 +113,4 @@ mob/eye/Destroy()
|
||||
sprint = min(sprint + 0.5, max_sprint)
|
||||
else
|
||||
sprint = initial
|
||||
return 1
|
||||
|
||||
@@ -11,27 +11,24 @@
|
||||
|
||||
/datum/chunk/cult/acquireVisibleTurfs(var/list/visible)
|
||||
for(var/mob/living/L in living_mob_list)
|
||||
for(var/turf/t in L.seen_turfs())
|
||||
for(var/turf/t in L.seen_cult_turfs())
|
||||
visible[t] = t
|
||||
|
||||
/mob/living/proc/seen_turfs()
|
||||
/mob/living/proc/seen_cult_turfs()
|
||||
return seen_turfs_in_range(src, 3)
|
||||
|
||||
/mob/living/carbon/human/seen_turfs()
|
||||
/*if(src.isSynthetic())
|
||||
return list()*/
|
||||
|
||||
/mob/living/carbon/human/seen_cult_turfs()
|
||||
if(mind in cult.current_antagonists)
|
||||
return seen_turfs_in_range(src, client ? client.view : 7)
|
||||
return seen_turfs_in_range(src, world.view)
|
||||
return ..()
|
||||
|
||||
/mob/living/silicon/seen_turfs()
|
||||
/mob/living/silicon/seen_cult_turfs()
|
||||
return list()
|
||||
|
||||
/mob/living/simple_animal/seen_turfs()
|
||||
/mob/living/simple_animal/seen_cult_turfs()
|
||||
return seen_turfs_in_range(src, 1)
|
||||
|
||||
/mob/living/simple_animal/shade/narsie/seen_turfs()
|
||||
/mob/living/simple_animal/shade/narsie/seen_cult_turfs()
|
||||
return view(2, src)
|
||||
|
||||
/proc/seen_turfs_in_range(var/source, var/range)
|
||||
|
||||
@@ -1311,9 +1311,10 @@
|
||||
set desc = "Pop a joint back into place. Extremely painful."
|
||||
set src in view(1)
|
||||
|
||||
if(!isliving(usr) || usr.next_move > world.time)
|
||||
if(!isliving(usr) || !usr.canClick())
|
||||
return
|
||||
usr.next_move = world.time + 20
|
||||
|
||||
usr.setClickCooldown(20)
|
||||
|
||||
if(usr.stat > 0)
|
||||
usr << "You are unconcious and cannot do that!"
|
||||
|
||||
@@ -227,7 +227,7 @@ emp_act
|
||||
else
|
||||
visible_message("\red <B>[src] has been attacked in the [hit_area] with [I.name] by [user]!</B>")
|
||||
|
||||
var/armor = run_armor_check(affecting, "melee", "Your armor has protected your [hit_area].", "Your armor has softened hit to your [hit_area].")
|
||||
var/armor = run_armor_check(affecting, "melee", I.armor_penetration, "Your armor has protected your [hit_area].", "Your armor has softened hit to your [hit_area].")
|
||||
var/weapon_sharp = is_sharp(I)
|
||||
var/weapon_edge = has_edge(I)
|
||||
if ((weapon_sharp || weapon_edge) && prob(getarmor(target_zone, "melee")))
|
||||
@@ -342,7 +342,7 @@ emp_act
|
||||
var/hit_area = affecting.name
|
||||
|
||||
src.visible_message("\red [src] has been hit in the [hit_area] by [O].")
|
||||
var/armor = run_armor_check(affecting, "melee", "Your armor has protected your [hit_area].", "Your armor has softened hit to your [hit_area].") //I guess "melee" is the best fit here
|
||||
var/armor = run_armor_check(affecting, "melee", O.armor_penetration, "Your armor has protected your [hit_area].", "Your armor has softened hit to your [hit_area].") //I guess "melee" is the best fit here
|
||||
|
||||
if(armor < 2)
|
||||
apply_damage(throw_damage, dtype, zone, armor, is_sharp(O), has_edge(O), O)
|
||||
|
||||
@@ -27,10 +27,11 @@
|
||||
spawn() escape_legcuffs()
|
||||
|
||||
/mob/living/carbon/proc/escape_handcuffs()
|
||||
if(!(last_special <= world.time)) return
|
||||
//if(!(last_special <= world.time)) return
|
||||
|
||||
next_move = world.time + 100
|
||||
last_special = world.time + 100
|
||||
//These two lines represent a significant buff to grabs...
|
||||
if(!canClick()) return
|
||||
setClickCooldown(100)
|
||||
|
||||
if(can_break_cuffs()) //Don't want to do a lot of logic gating here.
|
||||
break_handcuffs()
|
||||
@@ -60,11 +61,11 @@
|
||||
)
|
||||
drop_from_inventory(handcuffed)
|
||||
|
||||
/mob/living/carbon/proc/escape_legcuffs()
|
||||
if(!(last_special <= world.time)) return
|
||||
/mob/living/carbon/proc/escape_legcuffs()
|
||||
if(!canClick())
|
||||
return
|
||||
|
||||
next_move = world.time + 100
|
||||
last_special = world.time + 100
|
||||
setClickCooldown(100)
|
||||
|
||||
if(can_break_cuffs()) //Don't want to do a lot of logic gating here.
|
||||
break_legcuffs()
|
||||
@@ -149,14 +150,15 @@
|
||||
return ..()
|
||||
|
||||
/mob/living/carbon/escape_buckle()
|
||||
if(!canClick())
|
||||
return
|
||||
|
||||
setClickCooldown(100)
|
||||
if(!buckled) return
|
||||
if(!(last_special <= world.time)) return
|
||||
|
||||
if(!restrained())
|
||||
..()
|
||||
else
|
||||
next_move = world.time + 100
|
||||
last_special = world.time + 100
|
||||
visible_message(
|
||||
"<span class='danger'>[usr] attempts to unbuckle themself!</span>",
|
||||
"<span class='warning'>You attempt to unbuckle yourself. (This will take around 2 minutes and you need to stand still)</span>"
|
||||
|
||||
@@ -574,7 +574,7 @@ default behaviour is:
|
||||
set category = "IC"
|
||||
|
||||
if(can_resist())
|
||||
next_move = world.time + 20
|
||||
setClickCooldown(20)
|
||||
process_resist()
|
||||
|
||||
/mob/living/proc/can_resist()
|
||||
@@ -582,7 +582,7 @@ default behaviour is:
|
||||
//so just check weakened instead.
|
||||
if(stat || weakened)
|
||||
return 0
|
||||
if(next_move > world.time)
|
||||
if(!canClick())
|
||||
return 0
|
||||
return 1
|
||||
|
||||
|
||||
@@ -10,24 +10,36 @@
|
||||
1 - halfblock
|
||||
2 - fullblock
|
||||
*/
|
||||
/mob/living/proc/run_armor_check(var/def_zone = null, var/attack_flag = "melee", var/absorb_text = null, var/soften_text = null)
|
||||
/mob/living/proc/run_armor_check(var/def_zone = null, var/attack_flag = "melee", var/armour_pen = 0, var/absorb_text = null, var/soften_text = null)
|
||||
if(armour_pen >= 100)
|
||||
return 0 //might as well just skip the processing
|
||||
|
||||
var/armor = getarmor(def_zone, attack_flag)
|
||||
var/absorb = 0
|
||||
|
||||
//Roll armour
|
||||
if(prob(armor))
|
||||
absorb += 1
|
||||
if(prob(armor))
|
||||
absorb += 1
|
||||
|
||||
//Roll penetration
|
||||
if(prob(armour_pen))
|
||||
absorb -= 1
|
||||
if(prob(armour_pen))
|
||||
absorb -= 1
|
||||
|
||||
if(absorb >= 2)
|
||||
if(absorb_text)
|
||||
show_message("[absorb_text]")
|
||||
else
|
||||
show_message("\red Your armor absorbs the blow!")
|
||||
show_message("<span class='warning'>Your armor absorbs the blow!</span>")
|
||||
return 2
|
||||
if(absorb == 1)
|
||||
if(absorb_text)
|
||||
show_message("[soften_text]",4)
|
||||
else
|
||||
show_message("\red Your armor softens the blow!")
|
||||
show_message("<span class='warning'>Your armor softens the blow!</span>")
|
||||
return 1
|
||||
return 0
|
||||
|
||||
@@ -64,7 +76,7 @@
|
||||
return
|
||||
|
||||
//Armor
|
||||
var/absorb = run_armor_check(def_zone, P.check_armour)
|
||||
var/absorb = run_armor_check(def_zone, P.check_armour, P.armor_penetration)
|
||||
var/proj_sharp = is_sharp(P)
|
||||
var/proj_edge = has_edge(P)
|
||||
if ((proj_sharp || proj_edge) && prob(getarmor(def_zone, P.check_armour)))
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
/mob/living/silicon/ai/SelfMove(turf/n, direct)
|
||||
return 0
|
||||
@@ -35,7 +35,7 @@
|
||||
return
|
||||
|
||||
/mob/living/captive_brain/can_resist()
|
||||
return !(stat || next_move > world.time)
|
||||
return !(stat || !canClick())
|
||||
|
||||
/mob/living/captive_brain/process_resist()
|
||||
//Resisting control by an alien mind.
|
||||
|
||||
@@ -269,7 +269,6 @@
|
||||
|
||||
/mob/living/simple_animal/attackby(var/obj/item/O, var/mob/user)
|
||||
if(istype(O, /obj/item/stack/medical))
|
||||
user.changeNext_move(4)
|
||||
if(stat != DEAD)
|
||||
var/obj/item/stack/medical/MED = O
|
||||
if(health < maxHealth)
|
||||
@@ -286,12 +285,12 @@
|
||||
if(meat_type && (stat == DEAD)) //if the animal has a meat, and if it is dead.
|
||||
if(istype(O, /obj/item/weapon/material/knife) || istype(O, /obj/item/weapon/material/knife/butch))
|
||||
harvest(user)
|
||||
else
|
||||
else
|
||||
attacked_with_item(O, user)
|
||||
|
||||
//TODO: refactor mob attackby(), attacked_by(), and friends.
|
||||
/mob/living/simple_animal/proc/attacked_with_item(var/obj/item/O, var/mob/user)
|
||||
user.changeNext_move(8)
|
||||
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
|
||||
if(!O.force)
|
||||
visible_message("<span class='notice'>[user] gently taps [src] with \the [O].</span>")
|
||||
return
|
||||
@@ -308,7 +307,7 @@
|
||||
usr << "<span class='danger'>This weapon is ineffective, it does no damage.</span>"
|
||||
|
||||
visible_message("<span class='danger'>\The [src] has been attacked with \the [O] by [user].</span>")
|
||||
user.do_attack_animation(src)
|
||||
user.do_attack_animation(src)
|
||||
|
||||
/mob/living/simple_animal/movement_delay()
|
||||
var/tally = 0 //Incase I need to add stuff other than "speed" later
|
||||
|
||||
@@ -277,8 +277,6 @@
|
||||
if (W)
|
||||
W.attack_self(src)
|
||||
update_inv_r_hand()
|
||||
if(next_move < world.time)
|
||||
next_move = world.time + 2
|
||||
return
|
||||
|
||||
/*
|
||||
@@ -886,9 +884,9 @@ mob/proc/yank_out_object()
|
||||
set desc = "Remove an embedded item at the cost of bleeding and pain."
|
||||
set src in view(1)
|
||||
|
||||
if(!isliving(usr) || usr.next_move > world.time)
|
||||
if(!isliving(usr) || !usr.canClick())
|
||||
return
|
||||
usr.next_move = world.time + 20
|
||||
usr.setClickCooldown(20)
|
||||
|
||||
if(usr.stat == 1)
|
||||
usr << "You are unconcious and cannot do that!"
|
||||
|
||||
@@ -209,7 +209,7 @@
|
||||
return
|
||||
if(state == GRAB_UPGRADING)
|
||||
return
|
||||
if(assailant.next_move > world.time)
|
||||
if(!assailant.canClick())
|
||||
return
|
||||
if(world.time < (last_action + UPGRADE_COOLDOWN))
|
||||
return
|
||||
@@ -250,7 +250,7 @@
|
||||
hud.name = "kill"
|
||||
affecting.Stun(10) //10 ticks of ensured grab
|
||||
else if(state < GRAB_UPGRADING)
|
||||
assailant.visible_message("<span class='danger'>[assailant] starts to tighten \his grip on [affecting]'s neck!</span>")
|
||||
assailant.visible_message("<span class='danger'>[assailant] starts to tighten \his grip on [affecting]'s neck!</span>")
|
||||
hud.icon_state = "kill1"
|
||||
|
||||
state = GRAB_KILL
|
||||
@@ -259,10 +259,10 @@
|
||||
assailant.attack_log += "\[[time_stamp()]\] <font color='red'>Strangled (kill intent) [affecting.name] ([affecting.ckey])</font>"
|
||||
msg_admin_attack("[key_name(assailant)] strangled (kill intent) [key_name(affecting)]")
|
||||
|
||||
assailant.next_move = world.time + 10
|
||||
affecting.setClickCooldown(10)
|
||||
affecting.losebreath += 1
|
||||
affecting.set_dir(WEST)
|
||||
adjust_position()
|
||||
adjust_position()
|
||||
|
||||
|
||||
//This is used to make sure the victim hasn't managed to yackety sax away before using the grab.
|
||||
|
||||
@@ -10,6 +10,9 @@
|
||||
return (!mover.density || !density || lying)
|
||||
return
|
||||
|
||||
/mob/proc/setMoveCooldown(var/timeout)
|
||||
if(client)
|
||||
client.move_delay = max(world.time + timeout, client.move_delay)
|
||||
|
||||
/client/North()
|
||||
..()
|
||||
|
||||
@@ -0,0 +1,139 @@
|
||||
/obj/machinery/papershredder
|
||||
name = "paper shredder"
|
||||
desc = "For those documents you don't want seen."
|
||||
icon = 'icons/obj/bureaucracy.dmi'
|
||||
icon_state = "papershredder0"
|
||||
density = 1
|
||||
anchored = 1
|
||||
var/max_paper = 10
|
||||
var/paperamount = 0
|
||||
var/list/shred_amounts = list(
|
||||
/obj/item/weapon/photo = 1,
|
||||
/obj/item/weapon/shreddedp = 1,
|
||||
/obj/item/weapon/paper = 1,
|
||||
/obj/item/weapon/newspaper = 3,
|
||||
/obj/item/weapon/card/id = 3,
|
||||
/obj/item/weapon/paper_bundle = 3,
|
||||
)
|
||||
|
||||
/obj/machinery/papershredder/attackby(var/obj/item/W, var/mob/user)
|
||||
|
||||
if(istype(W, /obj/item/weapon/storage))
|
||||
empty_bin(user, W)
|
||||
return
|
||||
else
|
||||
var/paper_result
|
||||
for(var/shred_type in shred_amounts)
|
||||
if(istype(W, shred_type))
|
||||
paper_result = shred_amounts[shred_type]
|
||||
if(paper_result)
|
||||
if(paperamount == max_paper)
|
||||
user << "<span class='warning'>\The [src] is full; please empty it before you continue.</span>"
|
||||
return
|
||||
paperamount += paper_result
|
||||
user.drop_from_inventory(W)
|
||||
qdel(W)
|
||||
playsound(src.loc, 'sound/items/pshred.ogg', 75, 1)
|
||||
if(paperamount > max_paper)
|
||||
user <<"<span class='danger'>\The [src] was too full, and shredded paper goes everywhere!</span>"
|
||||
for(var/i=(paperamount-max_paper);i>0;i--)
|
||||
var/obj/item/weapon/shreddedp/SP = get_shredded_paper()
|
||||
SP.loc = get_turf(src)
|
||||
SP.throw_at(get_edge_target_turf(src,pick(alldirs)),1,5)
|
||||
paperamount = max_paper
|
||||
update_icon()
|
||||
return
|
||||
return ..()
|
||||
|
||||
/obj/machinery/papershredder/verb/empty_contents()
|
||||
set name = "Empty bin"
|
||||
set category = "Object"
|
||||
set src in range(1)
|
||||
|
||||
if(usr.stat || usr.restrained() || usr.weakened || usr.paralysis || usr.lying || usr.stunned)
|
||||
return
|
||||
|
||||
if(!paperamount)
|
||||
usr << "<span class='notice'>\The [src] is empty.</span>"
|
||||
return
|
||||
|
||||
empty_bin(usr)
|
||||
|
||||
/obj/machinery/papershredder/proc/empty_bin(var/mob/living/user, var/obj/item/weapon/storage/empty_into)
|
||||
|
||||
// Sanity.
|
||||
if(empty_into && !istype(empty_into))
|
||||
empty_into = null
|
||||
|
||||
if(empty_into && empty_into.contents.len >= empty_into.storage_slots)
|
||||
user << "<span class='notice'>\The [empty_into] is full.</span>"
|
||||
return
|
||||
|
||||
while(paperamount)
|
||||
var/obj/item/weapon/shreddedp/SP = get_shredded_paper()
|
||||
if(!SP) break
|
||||
if(empty_into)
|
||||
empty_into.handle_item_insertion(SP)
|
||||
if(empty_into.contents.len >= empty_into.storage_slots)
|
||||
break
|
||||
if(empty_into)
|
||||
if(paperamount)
|
||||
user << "<span class='notice'>You fill \the [empty_into] with as much shredded paper as it will carry.</span>"
|
||||
else
|
||||
user << "<span class='notice'>You empty \the [src] into \the [empty_into].</span>"
|
||||
|
||||
else
|
||||
user << "<span class='notice'>You empty \the [src].</span>"
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/papershredder/proc/get_shredded_paper()
|
||||
if(!paperamount)
|
||||
return
|
||||
paperamount--
|
||||
return PoolOrNew(/obj/item/weapon/shreddedp, get_turf(src))
|
||||
|
||||
/obj/machinery/papershredder/update_icon()
|
||||
icon_state = "papershredder[max(0,min(5,Floor(paperamount/2)))]"
|
||||
|
||||
/obj/item/weapon/shreddedp/attackby(var/obj/item/W as obj, var/mob/user)
|
||||
if(istype(W, /obj/item/weapon/flame/lighter))
|
||||
burnpaper(W, user)
|
||||
else
|
||||
..()
|
||||
|
||||
/obj/item/weapon/shreddedp/proc/burnpaper(var/obj/item/weapon/flame/lighter/P, var/mob/user)
|
||||
if(user.restrained())
|
||||
return
|
||||
if(!P.lit)
|
||||
user << "<span class='warning'>\The [P] is not lit.</span>"
|
||||
return
|
||||
user.visible_message("<span class='warning'>\The [user] holds \the [P] up to \the [src]. It looks like \he's trying to burn it!</span>", \
|
||||
"<span class='warning'>You hold \the [P] up to \the [src], burning it slowly.</span>")
|
||||
if(!do_after(user,20))
|
||||
user << "<span class='warning'>You must hold \the [P] steady to burn \the [src].</span>"
|
||||
return
|
||||
user.visible_message("<span class='danger'>\The [user] burns right through \the [src], turning it to ash. It flutters through the air before settling on the floor in a heap.</span>", \
|
||||
"<span class='danger'>You burn right through \the [src], turning it to ash. It flutters through the air before settling on the floor in a heap.</span>")
|
||||
FireBurn()
|
||||
|
||||
/obj/item/weapon/shreddedp/proc/FireBurn()
|
||||
var/mob/living/M = loc
|
||||
if(istype(M))
|
||||
M.drop_from_inventory(src)
|
||||
PoolOrNew(/obj/effect/decal/cleanable/ash,get_turf(src))
|
||||
qdel(src)
|
||||
|
||||
/obj/item/weapon/shreddedp
|
||||
name = "shredded paper"
|
||||
icon = 'icons/obj/bureaucracy.dmi'
|
||||
icon_state = "shredp"
|
||||
throwforce = 0
|
||||
w_class = 1
|
||||
throw_range = 3
|
||||
throw_speed = 1
|
||||
|
||||
/obj/item/weapon/shreddedp/New()
|
||||
..()
|
||||
pixel_x = rand(-5,5)
|
||||
pixel_y = rand(-5,5)
|
||||
if(prob(65)) color = pick("#BABABA","#7F7F7F")
|
||||
@@ -151,10 +151,10 @@
|
||||
if (world.time % 3) //to prevent spam
|
||||
user << "<span class='warning'>[src] is not ready to fire again!</span>"
|
||||
return
|
||||
|
||||
|
||||
var/shoot_time = (burst - 1)* burst_delay
|
||||
user.next_move = world.time + shoot_time //no clicking on things while shooting
|
||||
if(user.client) user.client.move_delay = world.time + shoot_time //no moving while shooting either
|
||||
user.setClickCooldown(shoot_time) //no clicking on things while shooting
|
||||
user.setMoveCooldown(shoot_time) //no moving while shooting either
|
||||
next_fire_time = world.time + shoot_time
|
||||
|
||||
//actually attempt to shoot
|
||||
@@ -186,9 +186,9 @@
|
||||
update_held_icon()
|
||||
|
||||
//update timing
|
||||
user.next_move = world.time + 4
|
||||
if(user.client) user.client.move_delay = world.time + move_delay
|
||||
next_fire_time = world.time + fire_delay
|
||||
user.setClickCooldown(4)
|
||||
user.setMoveCooldown(move_delay)
|
||||
next_fire_time = world.time + fire_delay
|
||||
|
||||
if(muzzle_flash)
|
||||
set_light(0)
|
||||
|
||||
@@ -7,10 +7,9 @@
|
||||
slot_flags = SLOT_BELT|SLOT_BACK
|
||||
w_class = 3
|
||||
force = 10
|
||||
origin_tech = list(TECH_COMBAT = 3, TECH_MAGNET = 2)
|
||||
matter = list(DEFAULT_WALL_MATERIAL = 2000)
|
||||
projectile_type = /obj/item/projectile/beam
|
||||
fire_delay = 1 //rapid fire
|
||||
origin_tech = list(TECH_COMBAT = 3, TECH_MAGNET = 2)
|
||||
matter = list(DEFAULT_WALL_MATERIAL = 2000)
|
||||
projectile_type = /obj/item/projectile/beam/midlaser
|
||||
|
||||
/obj/item/weapon/gun/energy/laser/mounted
|
||||
self_recharge = 1
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
throw_speed = 2
|
||||
throw_range = 10
|
||||
force = 5.0
|
||||
flags = CONDUCT | USEDELAY
|
||||
flags = CONDUCT
|
||||
slot_flags = 0
|
||||
origin_tech = list(TECH_COMBAT = 8, TECH_MATERIAL = 5)
|
||||
fire_sound = 'sound/effects/bang.ogg'
|
||||
|
||||
@@ -23,10 +23,15 @@
|
||||
check_armour = "laser"
|
||||
eyeblur = 2
|
||||
|
||||
/obj/item/projectile/beam/midlaser
|
||||
damage = 40
|
||||
armor_penetration = 10
|
||||
|
||||
/obj/item/projectile/beam/heavylaser
|
||||
name = "heavy laser"
|
||||
icon_state = "heavylaser"
|
||||
damage = 60
|
||||
armor_penetration = 30
|
||||
|
||||
muzzle_type = /obj/effect/projectile/laser_heavy/muzzle
|
||||
tracer_type = /obj/effect/projectile/laser_heavy/tracer
|
||||
@@ -35,7 +40,8 @@
|
||||
/obj/item/projectile/beam/xray
|
||||
name = "xray beam"
|
||||
icon_state = "xray"
|
||||
damage = 30
|
||||
damage = 25
|
||||
armor_penetration = 50
|
||||
|
||||
muzzle_type = /obj/effect/projectile/xray/muzzle
|
||||
tracer_type = /obj/effect/projectile/xray/tracer
|
||||
@@ -45,6 +51,7 @@
|
||||
name = "pulse"
|
||||
icon_state = "u_laser"
|
||||
damage = 50
|
||||
armor_penetration = 30
|
||||
|
||||
muzzle_type = /obj/effect/projectile/laser_pulse/muzzle
|
||||
tracer_type = /obj/effect/projectile/laser_pulse/tracer
|
||||
@@ -122,7 +129,8 @@
|
||||
/obj/item/projectile/beam/sniper
|
||||
name = "sniper beam"
|
||||
icon_state = "xray"
|
||||
damage = 60
|
||||
damage = 50
|
||||
armor_penetration = 10
|
||||
stun = 3
|
||||
weaken = 3
|
||||
stutter = 3
|
||||
|
||||
@@ -119,7 +119,8 @@
|
||||
|
||||
/obj/item/projectile/bullet/shotgun
|
||||
name = "slug"
|
||||
damage = 60
|
||||
damage = 50
|
||||
armor_penetration = 15
|
||||
|
||||
/obj/item/projectile/bullet/shotgun/beanbag //because beanbags are not bullets
|
||||
name = "beanbag"
|
||||
@@ -139,21 +140,24 @@
|
||||
|
||||
/* "Rifle" rounds */
|
||||
|
||||
/obj/item/projectile/bullet/rifle/a762
|
||||
damage = 30
|
||||
/obj/item/projectile/bullet/rifle
|
||||
armor_penetration = 20
|
||||
penetrating = 1
|
||||
|
||||
/obj/item/projectile/bullet/rifle/a762
|
||||
damage = 25
|
||||
|
||||
/obj/item/projectile/bullet/rifle/a556
|
||||
damage = 35
|
||||
|
||||
/obj/item/projectile/bullet/rifle/a145
|
||||
damage = 80
|
||||
stun = 3
|
||||
weaken = 3
|
||||
penetrating = 5
|
||||
armor_penetration = 80
|
||||
hitscan = 1 //so the PTR isn't useless as a sniper weapon
|
||||
|
||||
/obj/item/projectile/bullet/rifle/a556
|
||||
damage = 40
|
||||
penetrating = 1
|
||||
|
||||
/* Miscellaneous */
|
||||
|
||||
/obj/item/projectile/bullet/suffocationbullet//How does this even work?
|
||||
|
||||
@@ -40,6 +40,8 @@
|
||||
|
||||
playsound(src.loc, 'sound/effects/spray2.ogg', 50, 1, -6)
|
||||
|
||||
user.setClickCooldown(4)
|
||||
|
||||
if(reagents.has_reagent("sacid"))
|
||||
message_admins("[key_name_admin(user)] fired sulphuric acid from \a [src].")
|
||||
log_game("[key_name(user)] fired sulphuric acid from \a [src].")
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
################################
|
||||
# Example Changelog File
|
||||
#
|
||||
# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
|
||||
#
|
||||
# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
|
||||
# When it is, any changes listed below will disappear.
|
||||
#
|
||||
# Valid Prefixes:
|
||||
# bugfix
|
||||
# wip (For works in progress)
|
||||
# tweak
|
||||
# soundadd
|
||||
# sounddel
|
||||
# rscadd (general adding of nice things)
|
||||
# rscdel (general deleting of nice things)
|
||||
# imageadd
|
||||
# imagedel
|
||||
# maptweak
|
||||
# spellcheck (typo fixes)
|
||||
# experiment
|
||||
#################################
|
||||
|
||||
# Your name.
|
||||
author: HarpyEagle
|
||||
|
||||
# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
|
||||
delete-after: True
|
||||
|
||||
changes:
|
||||
- rscadd: "Adds armour penetration mechanic for projectiles and melee weapons."
|
||||
- rscadd: "Laser carbines, LWAP, and shotgun now have a small amount of armour penetration, ballistic rifles (not SMGs) have moderate amounts, laser cannon has high armour penetration, and the PTR mostly ignores body armour."
|
||||
- tweak: "Shotgun slugs and Z8/STS damage has been lowered slightly to accomodate for their higher penetration. In general ballistics deal less damage but have higher penetration than comparable laser weapons. Notable exception: X-Ray lasers have had their damage lowered slightly but gain very high armour penetration."
|
||||
- rscadd: "Energy swords now have very high armour penetration. Ninja blades do less damage but ignore armour completely."
|
||||
@@ -0,0 +1,6 @@
|
||||
author: Kelenius
|
||||
|
||||
delete-after: True
|
||||
|
||||
changes:
|
||||
- experiment: "Click cooldowns have been removed on pretty much everything that isn't an attack."
|
||||
@@ -0,0 +1,5 @@
|
||||
author: PsiOmegaDelta
|
||||
delete-after: True
|
||||
|
||||
changes:
|
||||
- tweak: "Active AI cores now provides coverage on the AI camera network. Does not utilize actual cameras, thus will not show up on security consoles."
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user