Merge pull request #1 from Aurorastation/master

I'm terrible.
This commit is contained in:
Meowykins
2014-10-03 14:36:47 -05:00
181 changed files with 14995 additions and 11693 deletions
+6 -4
View File
@@ -21,7 +21,7 @@ var/list/gravity_field_generators = list() // We will keep track of this by addi
/client/proc/cmd_dev_reset_gravity()
set category = "Debug"
set name = "Restore Default Gravity"
set desc = "Resets all gravity on the entire server(This spams Scopes like mad.)"
set desc = "Resets all gravity on the entire server."
if(!check_rights(R_DEBUG|R_DEV)) return
@@ -36,7 +36,7 @@ var/list/gravity_field_generators = list() // We will keep track of this by addi
src << "\red The game hasn't started yet!"
return
if(alert(usr, "Be sure to warn Scopes, Chris, and Skull. This could be very spammy for their logs", "Restore gravity", "No", "Yes") == "No")
if(alert(usr, "Make people fall on their face?", "Restore gravity", "No", "Yes") == "No")
return 0
world << "\red \b Resetting Gravity Simulation."
@@ -47,12 +47,10 @@ var/list/gravity_field_generators = list() // We will keep track of this by addi
continue
A.has_gravity = 1
msg_scopes("Gravity reset in: [A.name]")
for(var/area/SubA in A.related)
SubA.has_gravity = 1
for(var/mob/living/carbon/human/M in SubA)
M:float(0)
msg_scopes("Did you enjoy that insane amount of things")
world << "\red Gravity Simulation reset."
feedback_add_details("admin_verb","RSG")
@@ -348,6 +346,8 @@ var/list/gravity_field_generators = list() // We will keep track of this by addi
gravity_is_on = 0
investigate_log("was brought offline and there is now no gravity for this level.", "gravity")
message_admins("The gravity generator was brought offline with no backup generator. (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>[area.name]</a>)")
message_mods("The gravity generator was brought offline with no backup generator. (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>[area.name]</a>)")
update_icon()
update_list()
@@ -488,6 +488,8 @@ var/list/gravity_field_generators = list() // We will keep track of this by addi
)
for (var/type in SPECIALS)
if ( istype(A,type) )
if(A.type == /area/prison/gas_chamber)
return AREA_STATION
return AREA_SPECIAL
return AREA_STATION
+2
View File
@@ -179,10 +179,12 @@
if(env.temperature != set_temperature + T0C)
var/transfer_moles = 0.25 * env.total_moles()
msg_scopes("transfer_moles: [transfer_moles]")
var/datum/gas_mixture/removed = env.remove(transfer_moles)
if(removed)
var/heat_capacity = removed.heat_capacity()
msg_scopes("heat_capacity: [heat_capacity]")
if(heat_capacity) // Added check to avoid divide by zero (oshi-) runtime errors -- TLE
if(removed.temperature > set_temperature + T0C)
removed.temperature = min(removed.temperature - cooling_power/heat_capacity, TCMB) // Added min() check to try and avoid wacky superheating issues in low gas scenarios -- TLE
+5
View File
@@ -552,6 +552,8 @@
#include "code\game\objects\items\devices\debugger.dm"
#include "code\game\objects\items\devices\flash.dm"
#include "code\game\objects\items\devices\flashlight.dm"
#include "code\game\objects\items\devices\isocube.dm"
#include "code\game\objects\items\devices\laserpointer.dm"
#include "code\game\objects\items\devices\lightreplacer.dm"
#include "code\game\objects\items\devices\megaphone.dm"
#include "code\game\objects\items\devices\modkit.dm"
@@ -722,6 +724,7 @@
#include "code\game\objects\structures\stool_bed_chair_nest\bed.dm"
#include "code\game\objects\structures\stool_bed_chair_nest\chairs.dm"
#include "code\game\objects\structures\stool_bed_chair_nest\stools.dm"
#include "code\game\objects\structures\stool_bed_chair_nest\wheelchair.dm"
#include "code\game\turfs\simulated.dm"
#include "code\game\turfs\turf.dm"
#include "code\game\turfs\unsimulated.dm"
@@ -883,6 +886,7 @@
#include "code\modules\detectivework\detective_work.dm"
#include "code\modules\detectivework\evidence.dm"
#include "code\modules\detectivework\footprints_and_rag.dm"
#include "code\modules\detectivework\forensics.dm"
#include "code\modules\detectivework\scanner.dm"
#include "code\modules\economy\Accounts.dm"
#include "code\modules\economy\Accounts_DB.dm"
@@ -1230,6 +1234,7 @@
#include "code\modules\projectiles\guns\energy\erifles.dm"
#include "code\modules\projectiles\guns\energy\laser.dm"
#include "code\modules\projectiles\guns\energy\lawgiver.dm"
#include "code\modules\projectiles\guns\energy\modular.dm"
#include "code\modules\projectiles\guns\energy\nuclear.dm"
#include "code\modules\projectiles\guns\energy\pulse.dm"
#include "code\modules\projectiles\guns\energy\special.dm"
@@ -15,16 +15,16 @@
"/obj/item/weapon/stock_parts/subspace/amplifier" = 1,
"/obj/item/weapon/stock_parts/console_screen" = 1,
"/obj/item/weapon/cable_coil" = 5)
/*
datum/design/shield_gen_ex
name = "Circuit Design (Experimental hull shield generator)"
desc = "Allows for the construction of circuit boards used to build an experimental hull shield generator."
id = "shield_gen"
req_tech = list("bluespace" = 4, "plasmatech" = 3)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20, "$plasma" = 10000, "$diamond" = 5000, "$gold" = 10000)
build_type = PROTOLATHE
materials = list("$glass" = 2000, "$plasma" = 5000, "$diamond" = 5000, "$gold" = 5000)
build_path = "/obj/machinery/shield_gen/external"
*/
////////////////////////////////////////
// Shield Generator
@@ -41,16 +41,16 @@ datum/design/shield_gen_ex
"/obj/item/weapon/stock_parts/subspace/amplifier" = 1,
"/obj/item/weapon/stock_parts/console_screen" = 1,
"/obj/item/weapon/cable_coil" = 5)
/*
datum/design/shield_gen
name = "Circuit Design (Experimental shield generator)"
desc = "Allows for the construction of circuit boards used to build an experimental shield generator."
id = "shield_gen"
req_tech = list("bluespace" = 4, "plasmatech" = 3)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20, "$plasma" = 10000, "$diamond" = 5000, "$gold" = 10000)
build_type = PROTOLATHE
materials = list("$glass" = 2000, "$plasma" = 5000, "$diamond" = 5000, "$gold" = 5000)
build_path = "/obj/machinery/shield_gen/external"
*/
////////////////////////////////////////
// Shield Capacitor
@@ -67,12 +67,13 @@ datum/design/shield_gen
"/obj/item/weapon/stock_parts/subspace/analyzer" = 1,
"/obj/item/weapon/stock_parts/console_screen" = 1,
"/obj/item/weapon/cable_coil" = 5)
/*
datum/design/shield_cap
name = "Circuit Design (Experimental shield capacitor)"
desc = "Allows for the construction of circuit boards used to build an experimental shielding capacitor."
id = "shield_cap"
req_tech = list("magnets" = 3, "powerstorage" = 4)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20, "$plasma" = 10000, "$diamond" = 5000, "$silver" = 10000)
build_type = PROTOLATHE
materials = list("$glass" = 2000, "$plasma" = 5000, "$diamond" = 5000, "$silver" = 5000)
build_path = "/obj/machinery/shield_gen/external"
*/
+8
View File
@@ -366,3 +366,11 @@ datum/projectile_data
var/dest_y = src_y + distance*cos(rotation);
return new /datum/projectile_data(src_x, src_y, time, distance, power_x, power_y, dest_x, dest_y)
/proc/flick_overlay(image/I, list/show_to, duration)
for(var/client/C in show_to)
C.images += I
sleep(duration)
for(var/client/C in show_to)
C.images -= I
+15 -5
View File
@@ -82,9 +82,19 @@
diary << "\[[time_stamp()]]MISC: [text][log_end]"
//SoundScopes extra stuffs
/proc/msg_scopes(var/msg)
msg = "<span class=\"prefix\">Scopes Log:</span> <span class=\"message\">[msg]</span>"
//I'm sending debug messages through here for when an admin log is made at the same time.
//What's the point in making 2 recorded logs for one thing.
/proc/msg_scopes(var/msg, tell_devs = 0)
if(tell_devs)
msg = "DEBUG: [msg]"
else
msg = "[time_stamp()] <span class=\"prefix\">Scopes Log [tell_devs]:</span> <span class=\"message\">[msg]</span>"
for(var/client/C in admins)
if((R_DEV & C.holder.rights) && (R_MOD & C.holder.rights))
if(C.prefs.toggles & CHAT_SCOPES_DEBUG)
C << msg
if(R_DEV & C.holder.rights)
if(tell_devs)
if((C.prefs.toggles & CHAT_DEBUGLOGS) && !(R_ADMIN & C.holder.rights))
C << msg
if(R_ADMIN & C.holder.rights)
if(C.prefs.toggles & CHAT_SCOPES_DEBUG)
C << msg
+8
View File
@@ -14,6 +14,7 @@ var/datum/global_hud/global_hud = new()
var/obj/screen/blurry
var/list/vimpaired
var/list/darkMask
var/obj/screen/lum
var/obj/screen/nvg
/datum/global_hud/New()
@@ -38,6 +39,13 @@ var/datum/global_hud/global_hud = new()
nvg.layer = 17
nvg.mouse_opacity = 0
lum = new /obj/screen()
lum.screen_loc = "1,1"
lum.icon = 'icons/obj/nvg_hud_full.dmi'
lum.icon_state = "luminol_hud"
lum.layer = 17
lum.mouse_opacity = 0
var/obj/screen/O
var/i
//that nasty looking dither you get when you're short-sighted
+1 -1
View File
@@ -39,7 +39,7 @@
user.attack_log += "\[[time_stamp()]\]<font color='red'> Attacked [M.name] ([M.ckey]) with [name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(damtype)])</font>"
M.attack_log += "\[[time_stamp()]\]<font color='orange'> Attacked by [user.name] ([user.ckey]) with [name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(damtype)])</font>"
msg_admin_attack("[key_name(user)] attacked [key_name(M)] with [name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(damtype)])" )
msg_admin_attack("[key_name(user)] attacked [key_name(M)] with [name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(damtype)]) - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>" )
//spawn(1800) // this wont work right
// M.lastattacker = null
+1 -1
View File
@@ -23,7 +23,7 @@
/mob/living/carbon/human/RangedAttack(var/atom/A)
if(!gloves && !mutations.len) return
var/obj/item/clothing/gloves/G = gloves
if((LASER in mutations) && a_intent == "harm")
if((LASER in mutations) && a_intent == "hurt")
LaserEyes(A) // moved into a proc below
else if(istype(G) && G.Touch(A,0)) // for magic gloves
+1
View File
@@ -144,6 +144,7 @@ datum/controller/game_controller/proc/process()
world << "<font color='red'><b>RUNTIMES IN ATMOS TICKER. Killing air simulation!</font></b>"
world.log << "### ZAS SHUTDOWN"
message_admins("ZASALERT: unable to run [air_master.tick_progress], shutting down!")
msg_scopes("ZASALERT: unable to run [air_master.tick_progress], shutting down!")
log_admin("ZASALERT: unable run zone/process() -- [air_master.tick_progress]")
air_processing_killed = 1
air_master.failed_ticks = 0
+1
View File
@@ -25,6 +25,7 @@
supply_shuttle.process()
feedback_add_details("admin_verb","RSupply")
message_admins("Admin [key_name_admin(usr)] has restarted the [controller] controller.")
msg_scopes("Admin [key_name_admin(usr)] has restarted the [controller] controller.")
return
+10 -8
View File
@@ -181,7 +181,7 @@ datum/controller/vote
log_game("Rebooting due to restart vote")
world.Reboot()
last_vote_time = world.time
last_vote_time = time_stamp()
return .
proc/submit_vote(var/ckey, var/vote)
@@ -236,14 +236,16 @@ datum/controller/vote
mode = vote_type
initiator = initiator_key
started_time = world.time
var/timedifference = round((world.time - last_vote_time))
var/timedifference_text
timedifference_text = time2text(timedifference, "hh:mm:ss")
msg_scopes("timedifference_text debug: [timedifference]")
timedifference_text = time2text(timedifference,"mm:ss")
msg_scopes("timedifference: [timedifference] timedifference_text: [timedifference_text] started_time: [started_time]")
// var/timedifference = round((world.time - last_vote_time))
// var/timedifference_text
// timedifference_text = time2text(timedifference, "hh:mm:ss")
// msg_scopes("timedifference_text debug: [timedifference]")
// timedifference_text = time2text(timedifference,"mm:ss")
// msg_scopes("timedifference: [timedifference] timedifference_text: [timedifference_text] started_time: [started_time]")
for(var/client/C in admins)
C << "Time since last vote: [timedifference_text]"
if((C.holder.rights & R_ADMIN) || (C.holder.rights & R_MOD))
C << "Time last vote: [last_vote_time]"
C << "Time: [time_stamp()]"
var/text = "[capitalize(mode)] vote started by [initiator]."
if(mode == "custom")
text += "\n[question]"
+12 -9
View File
@@ -430,6 +430,7 @@ client
if( !new_name || !M ) return
message_admins("Admin [key_name_admin(usr)] renamed [key_name_admin(M)] to [new_name].")
msg_scopes("[key_name_admin(usr)] renamed [key_name_admin(M)] to [new_name].", 1) //The 1 makes dev's see it too
M.fully_replace_character_name(M.real_name,new_name)
href_list["datumrefresh"] = href_list["rename"]
@@ -464,7 +465,7 @@ client
cmd_mass_modify_object_variables(A, href_list["varnamemass"])
else if(href_list["mob_player_panel"])
if(!check_rights(0)) return
if(!check_rights(R_ADMIN|R_MOD)) return
var/mob/M = locate(href_list["mob_player_panel"])
if(!istype(M))
@@ -495,7 +496,7 @@ client
src.give_disease(M)
href_list["datumrefresh"] = href_list["give_spell"]
else if(href_list["give_disease2"])
if(!check_rights(R_ADMIN|R_FUN)) return
@@ -614,6 +615,7 @@ client
return
log_admin("[key_name(usr)] deleted all objects of type [O_type] ([i] objects deleted) ")
message_admins("\blue [key_name(usr)] deleted all objects of type [O_type] ([i] objects deleted) ")
msg_scopes("\blue [key_name(usr)] deleted all objects of type [O_type] ([i] objects deleted) ", 1)
if("Type and subtypes")
var/i = 0
for(var/obj/Obj in world)
@@ -625,6 +627,7 @@ client
return
log_admin("[key_name(usr)] deleted all objects of type or subtype of [O_type] ([i] objects deleted) ")
message_admins("\blue [key_name(usr)] deleted all objects of type or subtype of [O_type] ([i] objects deleted) ")
msg_scopes("\blue [key_name(usr)] deleted all objects of type or subtype of [O_type] ([i] objects deleted) ", 1)
else if(href_list["explode"])
if(!check_rights(R_DEBUG|R_FUN)) return
@@ -829,7 +832,7 @@ client
if(!check_rights(R_DEBUG|R_DEV)) return
var/mob/living/H = locate(href_list["addverb"])
if(!istype(H))
usr << "This can only be done to instances of type /mob/living"
return
@@ -845,7 +848,7 @@ client
possibleverbs += typesof(/mob/living/silicon/proc,/mob/living/silicon/ai/proc,/mob/living/silicon/ai/verb)
possibleverbs -= H.verbs
possibleverbs += "Cancel" // ...And one for the bottom
var/verb = input("Select a verb!", "Verbs",null) as anything in possibleverbs
if(!H)
usr << "Mob doesn't exist anymore"
@@ -854,7 +857,7 @@ client
return
else
H.verbs += verb
else if(href_list["remverb"])
if(!check_rights(R_DEBUG|R_DEV)) return
@@ -872,7 +875,7 @@ client
else
H.verbs -= verb
else if(href_list["fix_nano"])
if(!check_rights(R_DEBUG)) return
@@ -881,11 +884,11 @@ client
if(!istype(H) || !H.client)
usr << "This can only be done on mobs with clients"
return
nanomanager.send_resources(H.client)
usr << "Resource files sent"
H << "Your NanoUI Resource files have been refreshed"
+13
View File
@@ -69,6 +69,7 @@ datum/mind
proc/transfer_to(mob/living/new_character)
if(!istype(new_character))
msg_scopes("transfer_to(): Some idiot has tried to transfer_to() a non mob/living mob.")
world.log << "## DEBUG: transfer_to(): Some idiot has tried to transfer_to() a non mob/living mob. Please inform Carn"
if(current) //remove ourself from our old body's mind variable
if(changeling)
@@ -1229,6 +1230,18 @@ datum/mind
// fail |= !ticker.mode.equip_traitor(current, 1)
fail |= !ticker.mode.equip_revolutionary(current)
//Look here again to make sure it works right -- SoundScopes
proc/make_Vampire()
if(!(src in ticker.mode.vampires))
ticker.mode.vampires += src
ticker.mode.grant_vampire_powers(current)
special_role = "Vampire"
current << "<B><font color='red'>Your powers are awoken. Your lust for blood grows... You are a Vampire!</font></B>"
log_admin("[key_name_admin(usr)] has vampired [current].")
if (!config.objectives_disabled)
ticker.mode.forge_vampire_objectives(src)
ticker.mode.greet_vampire(src)
// check whether this mind's mob has been brigged for the given duration
// have to call this periodically for the duration to work properly
+1 -1
View File
@@ -46,7 +46,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
usr << "\red You shouldn't have this spell! Something's wrong."
return 0
if(usr.z == 2 && !centcomm_cancast) //Certain spells are not allowed on the centcomm zlevel
if(usr.z == 2 && !centcomm_cancast || usr.weakened > 100) //Certain spells are not allowed on the centcomm zlevel
return 0
if(!skipcharge)
+3 -3
View File
@@ -60,9 +60,10 @@
else
break
if(!success)
if(target.weakened > 100)//if you are megastunned by the isocube, there is no escape
target <<"An outside force prevents you from teleporting."
else if(!success)
target.loc = pick(L)
return
/obj/effect/proc_holder/spell/targeted/area_teleport/invocation(area/chosenarea = null)
@@ -78,5 +79,4 @@
playsound(usr.loc, pick('sound/misc/null.ogg','sound/misc/null.ogg'), 100, 1)
if("whisper")
usr.whisper("[invocation] [uppertext(chosenarea.name)]")
return
+103 -11
View File
@@ -43,6 +43,18 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
group = "Security"
hidden = 1
/datum/supply_packs/forensics
name = "Auxiliary forensic tools"
contains = list(/obj/item/weapon/storage/box/swabs,
/obj/item/weapon/storage/box/swabs,
/obj/item/weapon/storage/box/swabs,
/obj/item/weapon/storage/box/slides,
/obj/item/weapon/reagent_containers/spray/luminol)
cost = 15
containertype = /obj/structure/closet/crate
containername = "Auxiliary forensic tools"
group = "Security"
/datum/supply_packs/food
name = "Kitchen supply crate"
contains = list(/obj/item/weapon/reagent_containers/food/snacks/flour,
@@ -724,17 +736,15 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
/datum/supply_packs/shotgunammo
name = "Shotgun shells"
contains = list(/obj/item/ammo_casing/shotgun,
/obj/item/ammo_casing/shotgun,
/obj/item/ammo_casing/shotgun,
/obj/item/ammo_casing/shotgun,
/obj/item/ammo_casing/shotgun,
/obj/item/ammo_casing/shotgun,
/obj/item/ammo_casing/shotgun,
/obj/item/ammo_casing/shotgun,
/obj/item/ammo_casing/shotgun,
/obj/item/ammo_casing/shotgun)
cost = 20
contains = list(/obj/item/ammo_magazine/shotgun,
/obj/item/ammo_magazine/shotgun,
/obj/item/ammo_magazine/shotgun,
/obj/item/ammo_magazine/shotgun,
/obj/item/ammo_magazine/shotgun/beanbag,
/obj/item/ammo_magazine/shotgun/beanbag,
/obj/item/ammo_magazine/shotgun/incendiary,
/obj/item/ammo_magazine/shotgun/incendiary)
cost = 40
containertype = /obj/structure/closet/crate/secure
containername = "Shotgun shells"
access = access_armory
@@ -1112,6 +1122,88 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
access = access_hydroponics
group = "Hydroponics"
//My foray into encryption key crates. - Duck
/datum/supply_packs/sec_keys
name = "Security Encryption Keys"
contains = list(/obj/item/device/encryptionkey/headset_sec,
/obj/item/device/encryptionkey/headset_sec,
/obj/item/device/encryptionkey/headset_sec,
/obj/item/device/encryptionkey/headset_sec,
/obj/item/device/encryptionkey/headset_sec)
cost = 20
containertype = /obj/structure/closet/crate/secure
containername = "Security Encryption Keys"
group = "Operations"
access = access_security
/datum/supply_packs/sci_keys
name = "Science Encryption Keys"
contains = list(/obj/item/device/encryptionkey/headset_sci,
/obj/item/device/encryptionkey/headset_sci,
/obj/item/device/encryptionkey/headset_sci,
/obj/item/device/encryptionkey/headset_sci,
/obj/item/device/encryptionkey/headset_sci)
cost = 20
containertype = /obj/structure/closet/crate/secure
containername = "Science Encryption Keys"
group = "Operations"
access = access_research
/datum/supply_packs/eng_keys
name = "Engineering Encryption Keys"
contains = list(/obj/item/device/encryptionkey/headset_eng,
/obj/item/device/encryptionkey/headset_eng,
/obj/item/device/encryptionkey/headset_eng,
/obj/item/device/encryptionkey/headset_eng,
/obj/item/device/encryptionkey/headset_eng)
cost = 20
containertype = /obj/structure/closet/crate/secure
containername = "Engineering Encryption Keys"
group = "Operations"
access = access_engine
/datum/supply_packs/med_keys
name = "Medical Encryption Keys"
contains = list(/obj/item/device/encryptionkey/headset_med,
/obj/item/device/encryptionkey/headset_med,
/obj/item/device/encryptionkey/headset_med,
/obj/item/device/encryptionkey/headset_med,
/obj/item/device/encryptionkey/headset_med)
cost = 20
containertype = /obj/structure/closet/crate/secure
containername = "Medical Encryption Keys"
group = "Operations"
access = access_medical
/datum/supply_packs/cargo_keys
name = "Cargo Encryption Keys"
contains = list(/obj/item/device/encryptionkey/headset_cargo,
/obj/item/device/encryptionkey/headset_cargo,
/obj/item/device/encryptionkey/headset_cargo,
/obj/item/device/encryptionkey/headset_cargo,
/obj/item/device/encryptionkey/headset_cargo)
cost = 20
containertype = /obj/structure/closet/crate/secure
containername = "Cargo Encryption Keys"
group = "Operations"
access = access_cargo
/datum/supply_packs/head_keys
name = "Head Encryption Keys"
contains = list(/obj/item/device/encryptionkey/heads/captain,
/obj/item/device/encryptionkey/heads/rd,
/obj/item/device/encryptionkey/heads/hos,
/obj/item/device/encryptionkey/heads/ce,
/obj/item/device/encryptionkey/heads/cmo,
/obj/item/device/encryptionkey/heads/hop)
cost = 50
containertype = /obj/structure/closet/crate/secure
containername = "Head Encryption Keys"
group = "Operations"
access = access_heads
/*
*Skull's additions to satisfy the cravings of any atmospheric tech begin here.
*/
+2 -2
View File
@@ -6,6 +6,7 @@
var/list/fingerprintshidden
var/fingerprintslast = null
var/list/blood_DNA
var/list/stored_DNA = list()
var/blood_color
var/last_bumped = 0
var/pass_flags = 0
@@ -417,7 +418,6 @@ its easier to just keep the beam vertical.
if(toxvomit)
this.icon_state = "vomittox_[pick(1,4)]"
/atom/proc/clean_blood()
src.germ_level = 0
if(istype(blood_DNA, /list))
@@ -442,4 +442,4 @@ its easier to just keep the beam vertical.
return 0
/atom/proc/checkpass(passflag)
return pass_flags&passflag
return pass_flags&passflag
+7 -4
View File
@@ -51,13 +51,16 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
var/list/datum/mind/possible_changelings = get_players_for_role(BE_CHANGELING)
for(var/datum/mind/player in possible_changelings)
//This could be the fuckup with game start
if(player.current.client.prefs.species == "Machine") //Removing ipc's
possible_changelings -= player
msg_scopes("[player.key] has an invalid mob for this role.")
continue
for(var/job in restricted_jobs)//Removing robots from the list
if(player.assigned_role == job)
possible_changelings -= player
continue
//This could be the fuckup with game start
// if(player.current.isipc()) //Removing ipc's
// possible_changelings -= player
msg_scopes("[player.key] has an invalid job for this role.")
break
changeling_amount = 1 + round(num_players() / 10)
@@ -161,6 +161,7 @@
switch(stage)
if(1)
src << "<span class='notice'>This creature is compatible. We must hold still...</span>"
src.visible_message("<span class='warning'>[src]'s skin begins to shift and squirm!</span>")
if(2)
src << "<span class='notice'>We extend a proboscis.</span>"
src.visible_message("<span class='warning'>[src] extends a proboscis!</span>")
@@ -460,7 +461,7 @@
// let us move again
C.update_canmove()
// re-add out changeling powers
// re-add our changeling powers
C.make_changeling()
// sending display messages
@@ -492,12 +493,12 @@
//Recover from stuns.
/mob/proc/changeling_unstun()
set category = "Changeling"
set name = "Epinephrine Sacs (45)"
set name = "Epinephrine Sacs (20)"
set desc = "Removes all stuns"
var/datum/changeling/changeling = changeling_power(45,0,100,UNCONSCIOUS)
if(!changeling) return 0
changeling.chem_charges -= 45
changeling.chem_charges -= 20
var/mob/living/carbon/human/C = src
C.stat = 0
@@ -505,6 +506,7 @@
C.SetStunned(0)
C.SetWeakened(0)
C.lying = 0
C.setHalLoss(0)
C.update_canmove()
src.verbs -= /mob/proc/changeling_unstun
@@ -567,6 +569,7 @@
C.adjustToxLoss(-10)
C.adjustOxyLoss(-10)
C.adjustFireLoss(-10)
C.adjustHalLoss(-10)
sleep(10)
src.verbs -= /mob/proc/changeling_rapidregen
@@ -682,7 +685,7 @@ var/list/datum/dna/hivemind_bank = list()
return 0
//Handles the general sting code to reduce on copypasta (seeming as somebody decided to make SO MANY dumb abilities)
/mob/proc/changeling_sting(var/required_chems=0, var/verb_path)
/mob/proc/changeling_sting(var/required_chems=0, var/verb_path, var/stealthy = 0)
var/datum/changeling/changeling = changeling_power(required_chems)
if(!changeling) return
@@ -691,6 +694,7 @@ var/list/datum/dna/hivemind_bank = list()
victims += C
var/mob/living/carbon/T = input(src, "Who will we sting?") as null|anything in victims
if(!T) return
if(!(T in view(changeling.sting_range))) return
if(!sting_can_reach(T, changeling.sting_range)) return
@@ -701,9 +705,13 @@ var/list/datum/dna/hivemind_bank = list()
src.verbs -= verb_path
spawn(10) src.verbs += verb_path
src << "<span class='notice'>We stealthily sting [T].</span>"
if(stealthy == 1)
src << "<span class='notice'>We stealthily sting [T].</span>"
// T << "<span class='warning'>You feel a tiny prick.</span>"
else
src.visible_message(pick("<span class='warning'>[src]'s eyes balloon and burst out in a welter of blood, burrowing into [T]!</span>", "<span class='warning'>[src]'s arm rapidly shifts into a giant scorpion-stinger and stabs into [T]!</span>", "<span class='warning'>[src]'s throat lengthens and twists before vomitting a chunky red spew all over [T]!</span>", "<span class='warning'>[src]'s tongue stretches an impossible length and stabs into [T]!</span>", "<span class='warning'>[src] sneezes a cloud of shrieking spiders at [T]!</span>", "<span class='warning'>[src] erupts a grotesque tail and impales [T]!</span>", "<span class='warning'>[src]'s chin skin bulges and tears, launching a bone-dart at [T]!</span>"))
if(!T.mind || !T.mind.changeling) return T //T will be affected by the sting
T << "<span class='warning'>You feel a tiny prick.</span>"
return
@@ -712,7 +720,7 @@ var/list/datum/dna/hivemind_bank = list()
set name = "Hallucination Sting (15)"
set desc = "Causes terror in the target."
var/mob/living/carbon/T = changeling_sting(15,/mob/proc/changeling_lsdsting)
var/mob/living/carbon/T = changeling_sting(15,/mob/proc/changeling_lsdsting, 1)
if(!T) return 0
spawn(rand(300,600))
if(T) T.hallucination += 400
@@ -724,7 +732,7 @@ var/list/datum/dna/hivemind_bank = list()
set name = "Silence sting (10)"
set desc="Sting target"
var/mob/living/carbon/T = changeling_sting(10,/mob/proc/changeling_silence_sting)
var/mob/living/carbon/T = changeling_sting(10,/mob/proc/changeling_silence_sting, 1)
if(!T) return 0
T.silent += 30
feedback_add_details("changeling_powers","SS")
@@ -735,7 +743,7 @@ var/list/datum/dna/hivemind_bank = list()
set name = "Blind sting (20)"
set desc="Sting target"
var/mob/living/carbon/T = changeling_sting(20,/mob/proc/changeling_blind_sting)
var/mob/living/carbon/T = changeling_sting(20,/mob/proc/changeling_blind_sting, 0)
if(!T) return 0
T << "<span class='danger'>Your eyes burn horrificly!</span>"
T.disabilities |= NEARSIGHTED
@@ -750,7 +758,7 @@ var/list/datum/dna/hivemind_bank = list()
set name = "Deaf sting (5)"
set desc="Sting target:"
var/mob/living/carbon/T = changeling_sting(5,/mob/proc/changeling_deaf_sting)
var/mob/living/carbon/T = changeling_sting(5,/mob/proc/changeling_deaf_sting, 0)
if(!T) return 0
T << "<span class='danger'>Your ears pop and begin ringing loudly!</span>"
T.sdisabilities |= DEAF
@@ -763,7 +771,7 @@ var/list/datum/dna/hivemind_bank = list()
set name = "Paralysis sting (30)"
set desc="Sting target"
var/mob/living/carbon/T = changeling_sting(30,/mob/proc/changeling_paralysis_sting)
var/mob/living/carbon/T = changeling_sting(30,/mob/proc/changeling_paralysis_sting, 0)
if(!T) return 0
T << "<span class='danger'>Your muscles begin to painfully tighten.</span>"
T.Weaken(20)
@@ -791,7 +799,7 @@ var/list/datum/dna/hivemind_bank = list()
if(!chosen_dna)
return
var/mob/living/carbon/T = changeling_sting(40,/mob/proc/changeling_transformation_sting)
var/mob/living/carbon/T = changeling_sting(40,/mob/proc/changeling_transformation_sting, 1)
if(!T) return 0
if((HUSK in T.mutations) || (!ishuman(T) && !ismonkey(T)))
src << "<span class='warning'>Our sting appears ineffective against its DNA.</span>"
@@ -809,9 +817,9 @@ var/list/datum/dna/hivemind_bank = list()
set name = "Unfat sting (5)"
set desc = "Sting target"
var/mob/living/carbon/T = changeling_sting(5,/mob/proc/changeling_unfat_sting)
var/mob/living/carbon/T = changeling_sting(5,/mob/proc/changeling_unfat_sting, 0)
if(!T) return 0
T << "<span class='danger'>you feel a small prick as stomach churns violently and you become to feel skinnier.</span>"
T << "<span class='danger'>Your stomach churns violently before you suddenly become skinnier.</span>"
T.overeatduration = 0
T.nutrition -= 100
feedback_add_details("changeling_powers","US")
@@ -822,7 +830,7 @@ var/list/datum/dna/hivemind_bank = list()
set name = "Death Sting (40)"
set desc = "Causes spasms onto death."
var/mob/living/carbon/T = changeling_sting(40,/mob/proc/changeling_DEATHsting)
var/mob/living/carbon/T = changeling_sting(40,/mob/proc/changeling_DEATHsting, 0)
if(!T) return 0
T << "<span class='danger'>You feel a small prick and your chest becomes tight.</span>"
T.silent = 10
@@ -831,7 +839,7 @@ var/list/datum/dna/hivemind_bank = list()
if(T.reagents) T.reagents.add_reagent("lexorin", 40)
//Becase a deadly powerful attack should be logged
msg_admin_attack("[usr.name] ([usr.ckey]) Death Stung [T.name] ([T.ckey])")
msg_admin_attack("[usr.name] ([usr.ckey]) Death Stung [T.name] ([T.ckey]) - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[usr.x];Y=[usr.y];Z=[usr.z]'>JMP</a>")
usr.attack_log += text("\[[time_stamp()]\] <font color='red'>Death stung [T.name] ([T.ckey])</font>")
T.attack_log += text("\[[time_stamp()]\] <font color='orange'>Was death stung by [usr.name] ([usr.ckey])</font>")
feedback_add_details("changeling_powers","DTHS")
@@ -848,7 +856,7 @@ var/list/datum/dna/hivemind_bank = list()
if(!changeling)
return 0
var/mob/living/carbon/T = changeling_sting(40, /mob/proc/changeling_extract_dna_sting)
var/mob/living/carbon/T = changeling_sting(40, /mob/proc/changeling_extract_dna_sting, 1)
if(!T) return 0
T.dna.real_name = T.real_name
+1
View File
@@ -68,6 +68,7 @@
for(var/datum/mind/player in cultists_possible)
for(var/job in restricted_jobs)//Removing heads and such from the list
if(player.assigned_role == job)
msg_scopes("[player.key] has an invalid job for this role.")
cultists_possible -= player
for(var/cultists_number = 1 to max_cultists_to_start)
@@ -86,6 +86,8 @@
continue
S.charge = S.capacity
S.output = 200000
spawn(600)
S.output = S.last_output
S.online = 1
S.updateicon()
S.power_change()
+6
View File
@@ -92,12 +92,16 @@ Implants;
if((player.client)&&(player.ready))
playerC++
msg_scopes("playerC: [playerC]")
if(master_mode=="secret")
msg_scopes("req [required_players_secret]")
if(playerC >= required_players_secret)
return 1
else
msg_scopes("req [required_players]")
if(playerC >= required_players)
return 1
msg_scopes("Nope, players not here or something")
return 0
@@ -282,6 +286,7 @@ Implants;
if(BE_CULTIST) roletext="cultist"
if(BE_NINJA) roletext="ninja"
if(BE_RAIDER) roletext="raider"
if(BE_VAMPIRE) roletext="vampire"
// Assemble a list of active players without jobbans.
for(var/mob/new_player/player in player_list)
@@ -311,6 +316,7 @@ Implants;
// Remove candidates who want to be antagonist but have a job that precludes it
if(restricted_jobs)
msg_scopes("going through restricted jobs")
for(var/datum/mind/player in candidates)
for(var/job in restricted_jobs)
if(player.assigned_role == job)
+3
View File
@@ -76,6 +76,7 @@ var/global/datum/controller/gameticker/ticker
if((master_mode=="random") || (master_mode=="secret"))
runnable_modes = config.get_runnable_modes()
if (runnable_modes.len==0)
msg_scopes("Well we can't continue runnable_modes.0")
current_state = GAME_STATE_PREGAME
world << "<B>Unable to choose playable game mode.</B> Reverting to pre-game lobby."
return 0
@@ -92,6 +93,7 @@ var/global/datum/controller/gameticker/ticker
else
src.mode = config.pick_mode(master_mode)
if (!src.mode.can_start())
msg_scopes("Well we can't continue can_start")
world << "<B>Unable to start [mode.name].</B> Not enough players, [mode.required_players] players needed. Reverting to pre-game lobby."
del(mode)
current_state = GAME_STATE_PREGAME
@@ -104,6 +106,7 @@ var/global/datum/controller/gameticker/ticker
if(!can_continue)
del(mode)
current_state = GAME_STATE_PREGAME
msg_scopes("Well we can't continue pre_setup")
world << "<B>Error setting up [master_mode].</B> Reverting to pre-game lobby."
job_master.ResetOccupations()
return 0
@@ -296,6 +296,7 @@ mob/living/carbon/human/proc
src << "\red Attempting to convert [M]..."
log_admin("[src]([src.ckey]) attempted to convert [M].")
message_admins("\red [src]([src.ckey]) attempted to convert [M].")
message_mods("\red [src]([src.ckey]) attempted to convert [M].")
var/choice = alert(M,"Asked by [src]: Do you want to join the revolution?","Align Thyself with the Revolution!","No!","Yes!")
if(choice == "Yes!")
ticker.mode:add_revolutionary(M.mind)
@@ -186,6 +186,7 @@
src << "\red Attempting to convert [M]..."
log_admin("[src]([src.ckey]) attempted to convert [M].")
message_admins("\red [src]([src.ckey]) attempted to convert [M].")
message_mods("\red [src]([src.ckey]) attempted to convert [M].")
var/choice = alert(M,"Asked by [src]: Do you want to join the revolution?","Align Thyself with the Revolution!","No!","Yes!")
if(choice == "Yes!")
ticker.mode:add_revolutionary(M.mind)
+11 -7
View File
@@ -52,16 +52,19 @@
var/list/datum/mind/possible_vampires = get_players_for_role(BE_VAMPIRE)
for(var/datum/mind/player in possible_vampires)
for(var/job in restricted_jobs)//Removing robots from the list
//This could be the fuckup with game start
if(player.current.client.prefs.species == "Machine")
possible_vampires -= player
msg_scopes("[player.key] has an invalid mob for this role.")
continue
for(var/job in restricted_jobs)
if(player.assigned_role == job)
possible_vampires -= player
continue
//This could be the fuckup with game start
// if(player.current.isipc())
// possible_vampires -= player
msg_scopes("[player.key] has an invalid job for this role.")
break
vampire_amount = max(1,round(num_players() / 10)) //1 + round(num_players() / 10)
msg_scopes("vampire_amount: [vampire_amount]")
if(possible_vampires.len>0)
for(var/i = 0, i < vampire_amount, i++)
if(!possible_vampires.len) break
@@ -71,6 +74,7 @@
modePlayer += vampires
return 1
else
msg_scopes("possible_vampires went poof")
return 0
/datum/game_mode/vampire/post_setup()
@@ -289,7 +293,7 @@ You are weak to holy things and starlight. Don't go into space and avoid the Cha
blood = min(10, H.vessel.get_reagent_amount("blood"))// if they have less than 10 blood, give them the remnant else they get 10 blood
src.mind.vampire.bloodtotal += blood
src.mind.vampire.bloodusable += blood
H.adjustCloneLoss(10) // beep boop 10 damage
// H.adjustCloneLoss(10) // beep boop 10 damage //probably not necessary actually honestly okay
else
blood = min(5, H.vessel.get_reagent_amount("blood"))// The dead only give 5 bloods
src.mind.vampire.bloodtotal += blood
+13 -11
View File
@@ -98,12 +98,12 @@
/client/vampire/proc/vampire_hypnotise()
set category = "Abilities"
set name = "Hypnotise (20)"
set name = "Hypnotise" // (20)
set desc= "A piercing stare that incapacitates your victim for a good length of time."
var/datum/mind/M = usr.mind
if(!M) return
var/mob/living/carbon/C = M.current.vampire_active(20, 0, 1)
var/mob/living/carbon/C = M.current.vampire_active(0, 0, 1) //(20, 0, 1)
if(!C) return
if(C==usr)
@@ -111,9 +111,9 @@
return
M.current.visible_message("<span class='warning'>[M]'s eyes flash briefly as he stares into [C.name]'s eyes</span>")
// M.current.remove_vampire_blood(20) Moved to remove if it works only.
if(M.current.vampire_power(20, 0))
if(M.current.vampire_power(0, 0)) //if(M.current.vampire_power(20, 0))
M.current.verbs -= /client/vampire/proc/vampire_hypnotise
spawn(900)
spawn(1200)
M.current.verbs += /client/vampire/proc/vampire_hypnotise
if(do_mob(M.current, C, 50))
if(C.mind && C.mind.vampire)
@@ -126,7 +126,7 @@
C.Weaken(20)
C.Stun(20)
C.stuttering = 20
M.current.remove_vampire_blood(20)
// M.current.remove_vampire_blood(20)
else
M.current << "\red You broke your gaze."
return
@@ -175,7 +175,7 @@
shutdown.speed = 1
shutdown.stage = 2
shutdown.clicks = 185
msg_admin_attack("[usr.name] ([usr.ckey]) gave [C.name] ([C.ckey]) the shutdown disease")
msg_admin_attack("[usr.name] ([usr.ckey]) gave [C.name] ([C.ckey]) the shutdown disease - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[C.x];Y=[C.y];Z=[C.z]'>JMP</a>")
usr.attack_log += text("\[[time_stamp()]\] <font color='red'>Gave [C.name] ([C.ckey]) the shutdown disease</font>")
C.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been given the shutdown disease by [usr.name] ([usr.ckey])</font>")
infect_virus2(C,shutdown,0)
@@ -354,7 +354,7 @@
src << "\red You have successfully Enthralled [H.name]. <i>If they refuse to do as you say just adminhelp.</i>"
ticker.mode.update_vampire_icons_added(H.mind)
ticker.mode.update_vampire_icons_added(src.mind)
msg_admin_attack("[name]([ckey]) has mind-slaved [H.name]([H.ckey]).")
msg_admin_attack("[name]([ckey]) has mind-slaved [H.name]([H.ckey]) - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[H.x];Y=[H.y];Z=[H.z]'>JMP</a>.")
/client/vampire/proc/vampire_bats()
set category = "Abilities"
@@ -379,7 +379,7 @@
new /mob/living/simple_animal/hostile/scarybat(M.current.loc, M.current)
else // we had no good locations so make two on top of us
new /mob/living/simple_animal/hostile/scarybat(M.current.loc, M.current)
// new /mob/living/simple_animal/hostile/scarybat(M.current.loc, M.current)
new /mob/living/simple_animal/hostile/scarybat(M.current.loc, M.current)
M.current.remove_vampire_blood(60)
M.current.verbs -= /client/vampire/proc/vampire_bats
spawn(1200) M.current.verbs += /client/vampire/proc/vampire_bats
@@ -387,13 +387,13 @@
/client/vampire/proc/vampire_jaunt()
//AHOY COPY PASTE INCOMING
set category = "Abilities"
set name = "Mist Form (45)"
set name = "Mist Form (30)"
set desc = "You take on the form of mist for a short period of time."
var/jaunt_duration = 50 //in deciseconds
var/datum/mind/M = usr.mind
if(!M) return
if(M.current.vampire_power(45, 0))
if(M.current.vampire_power(30, 0))
if(M.current.buckled) M.current.buckled.unbuckle()
spawn(0)
var/originalloc = get_turf(M.current.loc)
@@ -407,6 +407,8 @@
animation.layer = 5
animation.master = holder
M.current.ExtinguishMob()
M.current.weakened = 0
M.current.stunned = 0
if(M.current.buckled)
M.current.buckled.unbuckle()
flick("liquify",animation)
@@ -437,7 +439,7 @@
M.current.client.eye = M.current
del(animation)
del(holder)
M.current.remove_vampire_blood(45)
M.current.remove_vampire_blood(30)
M.current.verbs -= /client/vampire/proc/vampire_jaunt
spawn(600) M.current.verbs += /client/vampire/proc/vampire_jaunt
+45 -11
View File
@@ -95,11 +95,9 @@
spawn_positions = 1
supervisors = "the head of security"
selection_color = "#ffeeee"
alt_titles = list("Forensic Technician")
access = list(access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_court)
minimal_access = list(access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_court)
alt_titles = list("Forensic Technician")
minimal_player_age = 3
equip(var/mob/living/carbon/human/H)
if(!H) return 0
@@ -108,28 +106,64 @@
if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back)
if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_norm(H), slot_back)
if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/clothing/under/det(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/navy/det(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/laceup(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/device/pda/detective(H), slot_belt)
/* var/obj/item/clothing/mask/cigarette/CIG = new /obj/item/clothing/mask/cigarette(H)
CIG.light("")
H.equip_to_slot_or_del(CIG, slot_wear_mask) */
H.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(H), slot_gloves)
if(H.mind.role_alt_title && H.mind.role_alt_title == "Forensic Technician")
H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/forensics/blue(H), slot_wear_suit)
else
H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/det_suit(H), slot_wear_suit)
H.equip_to_slot_or_del(new /obj/item/clothing/head/det_hat(H), slot_head)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/det_suit(H), slot_wear_suit)
H.equip_to_slot_or_del(new /obj/item/weapon/lighter/zippo(H), slot_l_store)
if(H.backbag == 1)//Why cant some of these things spawn in his office?
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/evidence(H), slot_l_hand)
H.equip_to_slot_or_del(new /obj/item/device/detective_scanner(H), slot_r_store)
else
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/evidence(H), slot_in_backpack)
H.equip_to_slot_or_del(new /obj/item/device/detective_scanner(H), slot_in_backpack)
return 1
/datum/job/forensics
title = "Forensic Technician"
flag = FORENSICS
department_flag = ENGSEC
faction = "Station"
total_positions = 1
spawn_positions = 1
supervisors = "the head of security"
selection_color = "#ffeeee"
access = list(access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_court)
minimal_access = list(access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_court)
alt_titles = list("Crime Scene Investigator")
minimal_player_age = 3
equip(var/mob/living/carbon/human/H)
if(!H) return 0
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sec(H), slot_l_ear)
switch(H.backbag)
if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back)
if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_norm(H), slot_back)
if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/clothing/under/det/slob(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/laceup(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/device/pda/detective(H), slot_belt)
/* var/obj/item/clothing/mask/cigarette/CIG = new /obj/item/clothing/mask/cigarette(H)
CIG.light("")
H.equip_to_slot_or_del(CIG, slot_wear_mask) */
H.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(H), slot_gloves)
if(H.mind.role_alt_title && H.mind.role_alt_title == "Crime Scene Investigator")
H.equip_to_slot_or_del(new /obj/item/clothing/suit/armor/det_suit(H), slot_wear_suit)
else
H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/labcoat(H), slot_wear_suit)
if(H.backbag == 1)//Why cant some of these things spawn in his office?
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/evidence(H), slot_l_hand)
else
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/evidence(H), slot_in_backpack)
return 1
+4
View File
@@ -407,6 +407,10 @@ var/global/datum/controller/occupations/job_master
S = locate("start*[rank]") // use old stype
if(istype(S, /obj/effect/landmark/start) && istype(S.loc, /turf))
H.loc = S.loc
// Moving wheelchair if they have one
if(H.buckled && istype(H.buckled, /obj/structure/stool/bed/chair/wheelchair))
H.buckled.loc = H.loc
H.buckled.dir = H.dir
//give them an account in the station database
var/datum/money_account/M = create_account(H.real_name, rand(50,500)*10, null)
+2
View File
@@ -13,6 +13,7 @@ var/const/AI =(1<<8)
var/const/CYBORG =(1<<9)
var/const/INTERN_SEC =(1<<10)
var/const/INTERN_ENG =(1<<11)
var/const/FORENSICS =(1<<12)
var/const/MEDSCI =(1<<1)
@@ -113,6 +114,7 @@ var/list/security_positions = list(
"Head of Security",
"Warden",
"Detective",
"Forensic Technician",
"Security Officer",
"Security Cadet"
)
+4
View File
@@ -66,6 +66,10 @@ var/global/list/autolathe_recipes_hidden = list( \
new /obj/item/ammo_magazine/c45m(), \
new /obj/item/ammo_casing/shotgun(), \
new /obj/item/ammo_casing/shotgun/dart(), \
new /obj/item/ammo_casing/shotgun/incendiary(), \
new /obj/item/ammo_magazine/shotgun(), \
new /obj/item/ammo_magazine/shotgun/beanbag(), \
new /obj/item/ammo_magazine/shotgun/incendiary, \
/* new /obj/item/weapon/shield/riot(), */ \
)
+3
View File
@@ -178,6 +178,9 @@
playsound(loc, "sparks", 50, 1)
visible_message("\blue The camera has been sliced apart by [] with an energy blade!")
del(src)
else if(istype(W, /obj/item/device/laser_pointer))
var/obj/item/device/laser_pointer/L = W
L.laser_act(src, user)
else
..()
return
@@ -148,9 +148,11 @@
emagged = !emagged
if(emagged)
message_admins("[key_name_admin(usr)] overrode the holodeck's safeties")
message_mods("[key_name_admin(usr)] overrode the holodeck's safeties")
log_game("[key_name(usr)] overrided the holodeck's safeties")
else
message_admins("[key_name_admin(usr)] restored the holodeck's safeties")
message_mods("[key_name_admin(usr)] restored the holodeck's safeties")
log_game("[key_name(usr)] restored the holodeck's safeties")
src.add_fingerprint(usr)
@@ -447,7 +449,7 @@
if(isrobot(user))
return
..()
/obj/structure/table/holotable/wood
+1
View File
@@ -158,6 +158,7 @@
new /obj/effect/spawner/newbomb/timer/syndicate(src.loc)
new /obj/item/clothing/head/collectable/petehat(src.loc)
message_admins("[key_name_admin(usr)] has outbombed Cuban Pete and been awarded a bomb.")
message_mods("[key_name_admin(usr)] has outbombed Cuban Pete and been awarded a bomb.")
log_game("[key_name_admin(usr)] has outbombed Cuban Pete and been awarded a bomb.")
src.New()
emagged = 0
@@ -552,6 +552,7 @@
emergency_shuttle.incall(2)
log_game("All the AIs, comm consoles and boards are destroyed. Shuttle called.")
message_admins("All the AIs, comm consoles and boards are destroyed. Shuttle called.", 1)
message_mods("All the AIs, comm consoles and boards are destroyed. Shuttle called.")
captain_announce("The emergency shuttle has been called. It will arrive in [round(emergency_shuttle.timeleft()/60)] minutes.")
world << sound('sound/AI/shuttlecalled.ogg')
+3
View File
@@ -122,6 +122,7 @@
if(src.check_access(I))
if (!status)
message_admins("\blue [key_name_admin(usr)] has initiated the global cyborg killswitch!")
message_mods("\blue [key_name_admin(usr)] has initiated the global cyborg killswitch!")
log_game("\blue [key_name(usr)] has initiated the global cyborg killswitch!")
src.status = 1
src.start_sequence()
@@ -167,6 +168,7 @@
else
message_admins("\blue [key_name_admin(usr)] detonated [R.name]!")
message_mods("\blue [key_name_admin(usr)] detonated [R.name]!")
log_game("\blue [key_name_admin(usr)] detonated [R.name]!")
R.self_destruct()
else
@@ -180,6 +182,7 @@
if(choice == "Confirm")
if(R && istype(R))
message_admins("\blue [key_name_admin(usr)] [R.canmove ? "locked down" : "released"] [R.name]!")
message_mods("\blue [key_name_admin(usr)] [R.canmove ? "locked down" : "released"] [R.name]!")
log_game("[key_name(usr)] [R.canmove ? "locked down" : "released"] [R.name]!")
R.canmove = !R.canmove
if (R.lockcharge)
+1
View File
@@ -324,6 +324,7 @@ obj/machinery/computer/cryopod/Topic(href, href_list)
// Book keeping!
log_admin("[key_name_admin(M)] has entered a stasis pod.")
message_admins("\blue [key_name_admin(M)] has entered a stasis pod.")
message_mods("\blue [key_name_admin(M)] has entered a stasis pod.")
//Despawning occurs when process() is called with an occupant without a client.
src.add_fingerprint(M)
+8
View File
@@ -81,6 +81,14 @@
else
flick("door_deny", src)
return
if(istype(AM, /obj/structure/stool/bed/chair/wheelchair))
var/obj/structure/stool/bed/chair/wheelchair/wheel = AM
if(density)
if(wheel.pulling && (src.allowed(wheel.pulling)))
open()
else
flick("door_deny", src)
return
return
+5 -1
View File
@@ -341,7 +341,11 @@ obj/machinery/hydroponics/proc/mutatespecie() // Mutagent produced a new plant!
else if ( istype(myseed, /obj/item/seeds/appleseed ))
del(myseed)
myseed = new /obj/item/seeds/goldappleseed
switch(rand(1,100))
if(1 to 50)
myseed = new /obj/item/seeds/goldappleseed
if(51 to 100)
myseed = new /obj/item/seeds/poisonedappleseed
else if ( istype(myseed, /obj/item/seeds/berryseed ))
del(myseed)
+16 -12
View File
@@ -22,29 +22,24 @@
if(istype(G)) // handle grabbed mob
if(ismob(G.affecting))
var/mob/living/GM = G.affecting
for (var/mob/V in viewers(usr))
V.show_message("[usr] starts pushing [GM.name] into the fryer.", 3)
user.visible_message("<span class='warning'>[user] starts pushing [GM.name] into the fryer.</span>", "<span class='warning'>You try to force [GM.name] towards the fryer.</span>", "You hear a struggle.")
if(do_after(usr, 20))
var/body_part = fry_mob_by_limb(GM, user.zone_sel.selecting)
if(!body_part) //If you fry a valid part this will be set
for (var/mob/V in viewers(usr))
if(GM.sleeping||GM.resting)
V.show_message("[GM.name] is to much of a dead weight to be place in the fryer")
else
V.show_message("[GM.name] breaks free.", 3)
if(GM.sleeping||GM.resting)
user.visible_message("[GM.name] falls limp.", "[GM.name] is to much of a dead weight to be place in the fryer", "You hear a thump.")
else
GM.visible_message("[GM.name] breaks free.", "You broke free from [user]'s grip", "You stop hearing a struggle.")
return
for (var/mob/C in viewers(src))
C.show_message("\red [GM.name]'s [body_part] has been placed in the [src] by [user].", 3)
user.visible_message("[GM.name]'s [body_part] has been placed in the [src] by [user]", "You place [GM.name]'s [body_part] in the fryer", "You hear a sizzling.")
del(G)
usr.attack_log += text("\[[time_stamp()]\] <font color='red'>Has placed [GM.name] ([GM.ckey]) in in the fryer.</font>")
GM.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been fried by [usr.name] ([usr.ckey])</font>")
msg_admin_attack("[usr] ([usr.ckey]) placed [GM] ([GM.ckey]) in a fryer. (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[usr.x];Y=[usr.y];Z=[usr.z]'>JMP</a>)")
else
for (var/mob/V in viewers(usr))
V.show_message("[usr] broke free")
GM.visible_message("[GM.name] breaks free.", "You broke free from [user]'s grip", "You stop hearing a struggle.")
return
else
@@ -65,42 +60,51 @@
if("head")
M.apply_damage(40, BURN, limb)
M << "\red Your thoughts are overwritten by the pain, as searing hot oil encompasses your head."
M.say("*scream")
return "head"
if("l_leg")
M.apply_damage(20, BURN, limb)
M.apply_damage(30, BURN, "l_foot")
M << "\red Your thoughts are overwritten by the pain, as searing hot oil encompasses your left leg and foot."
M.say("*scream")
return "left leg"
if("l_foot")
M.apply_damage(20, BURN, limb)
M << "\red Your thoughts are overwritten by the pain, as searing hot oil encompasses your left foot."
M.say("*scream")
return "left foot"
if("r_leg")
M.apply_damage(20, BURN, limb)
M.apply_damage(30, BURN, "r_foot")
M << "\red Your thoughts are overwritten by the pain, as searing hot oil encompasses your right leg and foot."
M.say("*scream")
return "right leg"
if("r_foot")
M.apply_damage(20, BURN, limb)
M << "\red Your thoughts are overwritten by the pain, as searing hot oil encompasses your right foot."
M.say("*scream")
return "right foot"
if("l_arm")
M.apply_damage(20, BURN, limb)
M.apply_damage(30, BURN, "l_hand")
M << "\red Your thoughts are overwritten by the pain, as searing hot oil encompasses your left arm and hand."
M.say("*scream")
return "left arm"
if("l_hand")
M.apply_damage(20, BURN, limb)
M << "\red Your thoughts are overwritten by the pain, as searing hot oil encompasses your left hand."
M.say("*scream")
return "left hand"
if("r_arm")
M.apply_damage(20, BURN, limb)
M.apply_damage(30, BURN, "r_hand")
M << "\red Your thoughts are overwritten by the pain, as searing hot oil encompasses your right arm and hand."
M.say("*scream")
return "right arm"
if("r_hand")
M.apply_damage(20, BURN, limb)
M << "\red Your thoughts are overwritten by the pain, as searing hot oil encompasses your right hand."
M.say("*scream")
return "right hand"
return null
+1 -1
View File
@@ -212,7 +212,7 @@
if(src.occupant.client) // Gibbed a cow with a client in it? log that shit
src.occupant.attack_log += "\[[time_stamp()]\] Was gibbed by <b>[user]/[user.ckey]</b>"
user.attack_log += "\[[time_stamp()]\] Gibbed <b>[src.occupant]/[src.occupant.ckey]</b>"
msg_admin_attack("\[[time_stamp()]\] <b>[key_name(user)]</b> gibbed <b>[key_name(src.occupant)]</b>")
msg_admin_attack("\[[time_stamp()]\] <b>[key_name(user)]</b> gibbed <b>[key_name(src.occupant)]</b> - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[src.x];Y=[src.y];Z=[src.z]'>JMP</a>")
src.occupant.death(1)
src.occupant.ghostize()
+13 -7
View File
@@ -27,7 +27,7 @@
var/raised = 0 // if the turret cover is "open" and the turret is raised
var/raising= 0 // if the turret is currently opening or closing its cover
var/health = 80 // the turret's health
var/locked = 1 // if the turret's behaviour control access is locked
var/locked = 0 // if the turret's behaviour control access is locked
var/installation // the type of weapon installed
var/gun_charge = 0 // the charge of the gun inserted
@@ -66,7 +66,7 @@
spark_system.attach(src)
sleep(10)
if(!installation)// if for some reason the turret has no gun (ie, admin spawned) it resorts to basic taser shots
projectile = /obj/item/projectile/energy/electrode//holder for the projectile, here it is being set
projectile = /obj/item/projectile/energy/electrode/high//holder for the projectile, here it is being set
eprojectile = /obj/item/projectile/beam//holder for the projectile when emagged, if it is different
reqpower = 200
sound = 1
@@ -128,13 +128,13 @@
reqpower = 700
if(/obj/item/weapon/gun/energy/taser)
projectile = /obj/item/projectile/energy/electrode
projectile = /obj/item/projectile/energy/electrode/high
eprojectile = projectile
iconholder = 1
reqpower = 200
if(/obj/item/weapon/gun/energy/stunrevolver)
projectile = /obj/item/projectile/energy/electrode
projectile = /obj/item/projectile/energy/electrode/high
eprojectile = projectile
iconholder = 1
reqpower = 200
@@ -169,8 +169,14 @@
iconholder = null
reqpower = 500
if(/obj/item/weapon/gun/energy/laser) //laser rifles are cool and all.
projectile = /obj/item/projectile/beam //but captainlaser and retrolaser still use energy/laser pathing.
eprojectile = projectile
iconholder = null
reqpower = 500
else // Energy gun shots
projectile = /obj/item/projectile/energy/electrode// if it hasn't been emagged, it uses normal taser shots
projectile = /obj/item/projectile/energy/electrode/high// if it hasn't been emagged, it uses normal taser shots
eprojectile = /obj/item/projectile/beam//If it has, going to kill mode
iconholder = 1
egun = 1
@@ -395,8 +401,8 @@ Status: []<BR>"},
check_records=pick(0,1)
criminals=pick(0,1)
auth_weapons=pick(0,1)
stun_all=pick(0,0,0,0,1) // stun_all is a pretty big deal, so it's least likely to get turned on
if(prob(5)) emagged=1
stun_all=pick(0,1) // stun_all is a pretty big deal, so it's least likely to get turned on //but think of the fun
if(prob(50)) emagged=1
on=0
sleep(rand(60,600))
if(!on)
+2 -2
View File
@@ -322,7 +322,7 @@
icon_state = "Shield_Gen"
anchored = 0
density = 1
req_access = list(access_teleporter)
req_access = list(access_research)
var/active = 0
var/power = 0
var/state = 0
@@ -330,7 +330,7 @@
var/last_check = 0
var/check_delay = 10
var/recalc = 0
var/locked = 1
var/locked = 0
var/destroyed = 0
var/directwired = 1
// var/maxshieldload = 200
@@ -15,7 +15,7 @@
var/list/viewingcode = list()
var/obj/machinery/telecomms/server/SelectedServer
var/network = "NULL" // the network to probe
var/network = "tcommsat" // the network to probe
var/temp = "" // temporary feedback messages
var/storedcode = "" // code stored
+1 -1
View File
@@ -233,7 +233,7 @@
A.original = target
use_power(500)
else
A = new /obj/item/projectile/energy/electrode( loc )
A = new /obj/item/projectile/energy/electrode/high( loc )
use_power(200)
A.current = T
A.yo = U.y - T.y
+3
View File
@@ -43,6 +43,9 @@
for(var/atom/A in contents)
A.clean_blood()
for(var/obj/item/clothing/C in contents)
C.gsr = 0
for(var/obj/item/I in contents)
I.decontaminate()
+1 -1
View File
@@ -12,7 +12,7 @@
use_power = 1
idle_power_usage = 20
active_power_usage = 5000
req_access = list(access_robotics)
req_access = list(access_research)
var/time_coeff = 1.5 //can be upgraded with research
var/resource_coeff = 1.5 //can be upgraded with research
var/list/resources = list(
+1 -1
View File
@@ -86,7 +86,7 @@
message_admins("A chemical smoke reaction has taken place in ([whereLink])[contained]. Last associated key is [carry.my_atom.fingerprintslast][more].", 0, 1)
log_game("A chemical smoke reaction has taken place in ([where])[contained]. Last associated key is [carry.my_atom.fingerprintslast].")
else
message_admins("A chemical smoke reaction has taken place in ([whereLink]). No associated key.", 0, 1)
message_admins("A chemical smoke reaction has taken place in ([whereLink])[contained]. No associated key.", 0, 1)
log_game("A chemical smoke reaction has taken place in ([where])[contained]. No associated key.")
@@ -50,8 +50,15 @@ var/global/list/image/splatter_cache=list()
return
if(amount < 1)
return
if(invisibility != 0)
return
if(perp.shoes)//Adding blood to shoes
var/datum/organ/external/l_foot = perp.get_organ("l_foot")
var/datum/organ/external/r_foot = perp.get_organ("r_foot")
var/hasfeet = 1
if((!l_foot || l_foot.status & ORGAN_DESTROYED) && (!r_foot || r_foot.status & ORGAN_DESTROYED))
hasfeet = 0
if(perp.shoes && !perp.buckled)//Adding blood to shoes
perp.shoes.blood_color = basecolor
perp.shoes:track_blood = max(amount,perp.shoes:track_blood)
if(!perp.shoes.blood_overlay)
@@ -62,16 +69,20 @@ var/global/list/image/splatter_cache=list()
perp.shoes.overlays += perp.shoes.blood_overlay
perp.shoes.blood_DNA |= blood_DNA.Copy()
else//Or feet
else if (hasfeet)//Or feet
perp.feet_blood_color = basecolor
perp.track_blood = max(amount,perp.track_blood)
if(!perp.feet_blood_DNA)
perp.feet_blood_DNA = list()
perp.feet_blood_DNA |= blood_DNA.Copy()
else if (perp.buckled && istype(perp.buckled, /obj/structure/stool/bed/chair/wheelchair))
var/obj/structure/stool/bed/chair/wheelchair/W = perp.buckled
W.bloodiness = 4
perp.update_inv_shoes(1)
amount--
/obj/effect/decal/cleanable/blood/proc/dry()
name = "dried [src.name]"
desc = "It's dry and crusty. Someone is not doing their job."
+16 -1
View File
@@ -4,6 +4,7 @@
var/image/blood_overlay = null //this saves our blood splatter overlay, which will be processed not to go over the edges of the sprite
var/abstract = 0
var/item_state = null
var/wasbloody = 0
var/r_speed = 1.0
var/health = null
var/burn_point = null
@@ -103,7 +104,7 @@
size = "huge"
else
//if ((CLUMSY in usr.mutations) && prob(50)) t = "funny-looking"
usr << "This is a [src.blood_DNA ? "bloody " : ""]\icon[src][src.name]. It is a [size] item."
usr << "This is a [src.blood_DNA ? "bloody " : ""][src.wasbloody == 2 ? "luminol covered " : ""]\icon[src][src.name]. It is a [size] item."
if(src.desc)
usr << src.desc
return
@@ -552,9 +553,21 @@
. = ..()
if(blood_overlay)
overlays.Remove(blood_overlay)
blood_overlay = null
if(istype(src, /obj/item/clothing/gloves))
var/obj/item/clothing/gloves/G = src
G.transfer_blood = 0
if(wasbloody == 2)
wasbloody = 1
return
/obj/item/proc/reveal_blood()
if(wasbloody == 1)
wasbloody = 2
generate_blood_overlay()
blood_overlay.color = "#007fff"
/*blood_overlay.invisibility = INVISIBILITY_LUMINOL*/
overlays += blood_overlay
/obj/item/add_blood(mob/living/carbon/human/M as mob)
@@ -578,6 +591,8 @@
if(blood_DNA[M.dna.unique_enzymes])
return 0 //already bloodied with this blood. Cannot add more.
blood_DNA[M.dna.unique_enzymes] = M.dna.b_type
stored_DNA[M.dna.unique_enzymes] = M.dna.b_type
wasbloody = 1
return 1 //we applied blood to the item
/obj/item/proc/generate_blood_overlay()
@@ -760,10 +760,12 @@ var/global/list/obj/item/device/pda/PDAs = list()
detonate_act(src)
log_admin("[key_name(U)] just attempted to blow up [P] with the Detomatix cartridge but failed, blowing themselves up")
message_admins("[key_name_admin(U)] just attempted to blow up [P] with the Detomatix cartridge but failed.", 1)
message_mods("[key_name_admin(U)] just attempted to blow up [P] with the Detomatix cartridge but failed.")
else
U.show_message("\blue Success!", 1)
log_admin("[key_name(U)] just attempted to blow up [P] with the Detomatix cartridge and succeeded")
message_admins("[key_name_admin(U)] just attempted to blow up [P] with the Detomatix cartridge and succeeded.", 1)
message_mods("[key_name_admin(U)] just attempted to blow up [P] with the Detomatix cartridge and succeeded.")
detonate_act(P)
else
U << "No charges left."
+62 -8
View File
@@ -13,6 +13,8 @@
var/times_used = 0 //Number of times it's been used.
var/broken = 0 //Is the flash burnt out?
var/last_used = 0 //last world.time it was used.
var/flashready = 0 //overcharge flashes
var/overcharge = 0 //overcharge check
/obj/item/device/flash/proc/clown_check(var/mob/user)
if(user && (CLUMSY in user.mutations) && prob(50))
@@ -51,7 +53,11 @@
switch(times_used)
if(0 to 5)
last_used = world.time
if(prob(times_used)) //if you use it 5 times in a minute it has a 10% chance to break!
if(overcharge == 1)
icon_state = "cellflashburnt"
broken = 1
user << "<span class='warning'>The bulb has burnt out!</span>"
else if(prob(times_used)) //if you use it 5 times in a minute it has a 10% chance to break!
broken = 1
user << "<span class='warning'>The bulb has burnt out!</span>"
icon_state = "flashburnt"
@@ -65,6 +71,13 @@
if(iscarbon(M))
var/safety = M:eyecheck()
if(overcharge == 1)
M.adjust_fire_stacks(5)
M.IgniteMob()
user.visible_message("<span class='notice'>[user]'s supercharged flash ignites [M]!</span>")
// broken = 1
// if(overcharge == 1)
// icon_state = "cellflashburnt"
if(safety <= 0)
M.Weaken(10)
flick("e_flash", M.flash)
@@ -90,7 +103,11 @@
flashfail = 1
else if(issilicon(M))
M.Weaken(rand(5,10))
M.Weaken(10) //why are robots more resistant to flashes than humans when it is their only weakness. besides ion rifles. used to be rand(5,10). changed to 10.
if(overcharge == 1)
M.adjust_fire_stacks(5)
M.IgniteMob()
user.visible_message("<span class='notice'>[user]'s supercharged flash ignites [M]!</span>")
else
flashfail = 1
@@ -106,7 +123,10 @@
del(animation)
if(!flashfail)
flick("flash2", src)
if(overcharge == 0)
flick("flash2", src)
else if(overcharge == 1)
flick("cellflash2", src)
if(!issilicon(M))
user.visible_message("<span class='disarm'>[user] blinds [M] with the flash!</span>")
@@ -134,7 +154,11 @@
//It will never break on the first use.
switch(times_used)
if(0 to 5)
if(prob(2*times_used)) //if you use it 5 times in a minute it has a 10% chance to break!
if(overcharge == 1)
icon_state = "cellflashburnt"
broken = 1
user << "<span class='warning'>The bulb has burnt out!</span>"
else if(prob(2*times_used)) //if you use it 5 times in a minute it has a 10% chance to break!
broken = 1
user << "<span class='warning'>The bulb has burnt out!</span>"
icon_state = "flashburnt"
@@ -144,7 +168,10 @@
user.show_message("<span class='warning'>*click* *click*</span>", 2)
return
playsound(src.loc, 'sound/weapons/flash.ogg', 100, 1)
flick("flash2", src)
if(overcharge == 0)
flick("flash2", src)
else if(overcharge == 1)
flick("cellflash2", src)
if(user && isrobot(user))
spawn(0)
var/atom/movable/overlay/animation = new(user.loc)
@@ -176,7 +203,10 @@
if(0 to 5)
if(prob(2*times_used))
broken = 1
icon_state = "flashburnt"
if(overcharge == 1)
icon_state = "cellflashburnt"
else if(overcharge == 0)
icon_state = "flashburnt"
return
times_used++
if(istype(loc, /mob/living/carbon))
@@ -202,11 +232,35 @@
if(!broken)
broken = 1
user << "\red The bulb has burnt out!"
icon_state = "flashburnt"
if(overcharge == 0)
icon_state = "flashburnt"
else if(overcharge == 1)
icon_state = "cellflashburnt"
/obj/item/device/flash/synthetic/attack_self(mob/living/carbon/user as mob, flag = 0, emp = 0)
..()
if(!broken)
broken = 1
user << "\red The bulb has burnt out!"
icon_state = "flashburnt"
if(overcharge == 0)
icon_state = "flashburnt"
else if(overcharge == 1)
icon_state = "cellflashburnt"
/obj/item/device/flash/attackby(obj/item/W, mob/user)
if(istype(W,/obj/item/weapon/cell))
if(flashready == 1 && overcharge == 0)
del(W)
overcharge = 1
icon_state = "cellflash"
user << "\red You attach the cell to the flash."
name = "cell/flash assembly"
desc = "When blinding and being an asshole just isn't enough."
else if(overcharge == 1)
user << "\red This flash already has a cell attached!"
else if(istype(W, /obj/item/weapon/screwdriver))
if(overcharge == 0)
user << "\red You ready the flash for modification."
flashready = 1
else if(flashready == 1)
user << "\red This flash has already been modified!."
+136
View File
@@ -0,0 +1,136 @@
/obj/item/device/isocube
name = "Isocube"
icon = 'icons/obj/wizard.dmi'
icon_state = "soulstone"
item_state = "electronic"
desc = "two weeks in the isocubes."
w_class = 3
unacidable = 1
flags = FPRINT | TABLEPASS
slot_flags = SLOT_BELT
origin_tech = "bluespace=4;materials=4"
//////////////////////////////Capturing////////////////////////////////////////////////////////
attack(mob/living/carbon/human/M as mob, mob/user as mob)
if(!istype(M, /mob/living/carbon/human))//If target is not a human.
return ..()
if(istype(M, /mob/living/carbon/human/dummy))
return..()
if(M.has_brain_worms()) //Borer stuff - RR
user << "<span class='warning'>The isocube spits out an error message: multiple lifeforms detected.</span>"
return..()
M.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been imprisoned with [src.name] by [user.name] ([user.ckey])</font>")
user.attack_log += text("\[[time_stamp()]\] <font color='red'>Used the [src.name] to imprison [M.name] ([M.ckey])</font>")
msg_admin_attack("[user.name] ([user.ckey]) is attemptin to imprison [M.name] ([M.ckey]) with the [src.name] (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>)")
isolate("VICTIM", M, user)
return
attack_self(mob/user)
if (!in_range(src, user))
return
user.set_machine(src)
var/dat = "<TT><B>Isocube</B><BR>"
for(var/mob/living/carbon/human/A in src)
dat += "Prisoner: [A.name]<br>"
dat += {"<A href='byond://?src=\ref[src];choice=Release'>Release Prisoner</A>"}
dat += "<br>"
dat += {"<a href='byond://?src=\ref[src];choice=Disable'>Disable Prisoner</a>"}
dat += "<br>"
dat += {"<a href='byond://?src=\ref[src];choice=Enable'>Enable Prisoner</a>"}
dat += "<br>"
dat += {"<a href='byond://?src=\ref[src];choice=Close'> Close</a>"}
user << browse(dat, "window=aicard")
onclose(user, "aicard")
return
Topic(href, href_list)
var/mob/U = usr
if (!in_range(src, U)||U.machine!=src)
U << browse(null, "window=aicard")
U.unset_machine()
return
add_fingerprint(U)
U.set_machine(src)
switch(href_list["choice"])//Now we switch based on choice.
if ("Close")
U << browse(null, "window=aicard")
U.unset_machine()
return
if ("Release")
for(var/mob/living/carbon/human/A in src)
A.status_flags &= ~GODMODE
A.canmove = 1
A << "<b>You feel a sickening lurch as the isocube dumps you out, weak and disoriented.</b>"
for(var/mob/O in viewers(U, null))
O.show_message(text("<b>[U] fiddles with the isocube, releasing [A]!</b>"), 1)
A.loc = U.loc
A.weakened = 10
A.paralysis = 0
A.cancel_camera()
src.icon_state = "soulstone"
for(var/obj/O in src)
O.loc = U.loc
if ("Disable")
for(var/mob/living/carbon/human/A in src)
if (A.paralysis < 100)
A << "<b>You feel a sudden, crippling agony, then darkness creeps over you.</b>"
for(var/mob/O in viewers(U, null))
O.show_message(text("You hear an ominous crunch."), 1)
A.paralysis = 9000000
if ("Enable")
for(var/mob/living/carbon/human/A in src)
if (A.paralysis > 10)
A << "<b>You feel a jolt of consciousness.</b>"
for(var/mob/O in viewers(U, null))
O.show_message(text("Something whirrs."), 1)
A.paralysis = 0
attack_self(U)
/obj/item/proc/isolate(var/choice as text, var/target, var/mob/U as mob).
if("VICTIM")
var/mob/living/carbon/human/T = target
var/obj/item/device/isocube/C = src
if(C.contents.len)
U << "\red <b>The isocube is full!</b>"
else if (U == T)
U << "\red <b>The isocube's safeties prevent you from capturing yourself.</b>"
return
else
for(var/mob/O in viewers(U, null))
O.show_message("\red <B>[U] is trying to pull [T] into an isocube!</B>", 1)
var/turf/p_loc = U.loc
var/turf/p_loc_m = T.loc
spawn(30)
if(!T) return
if(p_loc == U.loc && p_loc_m == T.loc)
/* var/atom/movable/overlay/animation = new /atom/movable/overlay( T.loc )
animation.icon_state = "blank"
animation.icon = 'icons/mob/mob.dmi'
animation.master = T
flick("dust-h", animation)
del(animation)*/
T.loc = C //put dummy in isocube
T.status_flags |= GODMODE //So they won't die inside the stone somehow
T.canmove = 0//Can't move out of the soul stone
if (T.client)
T.cancel_camera()
C.icon_state = "soulstone2"
T << "You feel a heavy weightlessness and find yourself barely able to move. The outside world seems larger."
U << "\blue <b>[T.real_name] has been successfully captured within the isocube.</b> "
T.Weaken(9000000)
msg_admin_attack("[U.name] ([U.ckey]) used the [src.name] to imprison [T.name] ([T.ckey]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[U.x];Y=[U.y];Z=[U.z]'>JMP</a>)")
return
@@ -0,0 +1,208 @@
/obj/item/device/laser_pointer
name = "laser pointer"
desc = "Don't shine it in your eyes!"
icon = 'icons/obj/device.dmi'
icon_state = "pointer"
item_state = "pen"
var/pointer_icon_state
flags = FPRINT | TABLEPASS | CONDUCT | USEDELAY
slot_flags = SLOT_BELT
m_amt = 500
g_amt = 500
w_class = 2 //Increased to 2, because diodes are w_class 2. Conservation of matter.
origin_tech = "combat=1"
origin_tech = "magnets=2"
var/turf/pointer_loc
var/energy = 8
var/max_energy = 8
var/effectchance = 33
var/recharging = 0
var/recharge_locked = 0
var/obj/item/weapon/stock_parts/micro_laser/diode //used for upgrading!
/obj/item/device/laser_pointer/red
pointer_icon_state = "red_laser"
/obj/item/device/laser_pointer/green
pointer_icon_state = "green_laser"
/obj/item/device/laser_pointer/blue
pointer_icon_state = "blue_laser"
/obj/item/device/laser_pointer/purple
pointer_icon_state = "purple_laser"
/obj/item/device/laser_pointer/New()
..()
diode = new(src)
if(!pointer_icon_state)
pointer_icon_state = pick("red_laser","green_laser","blue_laser","purple_laser")
/obj/item/device/laser_pointer/upgraded/New()
..()
diode = new /obj/item/weapon/stock_parts/micro_laser/ultra
/obj/item/device/laser_pointer/attack(mob/living/M, mob/user)
laser_act(M, user)
/obj/item/device/laser_pointer/attackby(obj/item/W, mob/user)
if(istype(W, /obj/item/weapon/stock_parts/micro_laser))
if(!diode)
user.drop_item()
W.loc = src
diode = W
user << "<span class='notice'>You install a [diode.name] in [src].</span>"
else
user << "<span class='notice'>[src] already has a cell.</span>"
else if(istype(W, /obj/item/weapon/screwdriver))
if(diode)
user << "<span class='notice'>You remove the [diode.name] from the [src].</span>"
diode.loc = get_turf(src.loc)
diode = null
return
..()
return
/obj/item/device/laser_pointer/afterattack(var/atom/target, var/mob/living/user, flag, params)
if(flag) //we're placing the object on a table or in backpack
return
laser_act(target, user)
/obj/item/device/laser_pointer/proc/laser_act(var/atom/target, var/mob/living/user)
if( !(user in (viewers(7,target))) )
return
if (!diode)
user << "<span class='notice'>You point [src] at [target], but nothing happens!</span>"
return
if (!user.IsAdvancedToolUser())
user << "<span class='warning'>You don't have the dexterity to do this!</span>"
return
add_fingerprint(user)
//nothing happens if the battery is drained
if(recharge_locked)
user << "<span class='notice'>You point [src] at [target], but it's still charging.</span>"
return
var/outmsg
var/turf/targloc = get_turf(target)
//human/alien mobs
if(iscarbon(target))
if(user.zone_sel.selecting == "eyes")
var/mob/living/carbon/C = target
//20% chance to actually hit the eyes
if(prob(effectchance * diode.rating))
//msg_admin_attack(user, C, "shone in the eyes", object="laser pointer")
msg_admin_attack("[user.name] ([user.ckey]) used a laser pointer to blind [C]")
//eye target check
outmsg = "<span class='notice'>You blind [C] by shining [src] in their eyes.</span>"
var/eye_prot = C.eyecheck()
if(C.blinded || eye_prot >= 2)
eye_prot = 4
var/severity = 3 - eye_prot
if(prob(33))
severity += 1
else if(prob(50))
severity -= 1
severity = min(max(severity, 0), 4)
var/mob/living/carbon/human/H = C
var/datum/organ/internal/eyes/E = H.internal_organs_by_name["eyes"]
switch(severity)
if(0)
//no effect
C << "<span class='info'>A small, bright dot appears in your vision.</span>"
if(1)
//industrial grade eye protection
//E.damage += rand(0, 2)
C << "<span class='notice'>Something bright flashes in the corner of your vision!</span>"
if(2)
//basic eye protection (sunglasses)
flick("flash", C.flash)
//E.damage += rand(2, 4)
C << "<span class='danger'>Your eyes were blinded!</span>"
if(3)
//no eye protection
if(prob(10))
C.Weaken(1)
flick("e_flash", C.flash)
E.damage += 1
C << "<span class='danger'>Your eyes were blinded!</span>"
if(4)
//the effect has been worsened by something
if(prob(5))
C.Weaken(1)
flick("e_flash", C.flash)
E.damage += 2
C << "<span class='danger'>Your eyes were blinded!</span>"
else
outmsg = "<span class='notice'>You fail to blind [C] by shining [src] at their eyes.</span>"
//robots and AI
else if(issilicon(target))
var/mob/living/silicon/S = target
//20% chance to actually hit the sensors
if(prob(effectchance * diode.rating))
S.Weaken(rand(5,10))
S << "<span class='warning'>Your sensors were overloaded by a laser!</span>"
outmsg = "<span class='notice'>You overload [S] by shining [src] at their sensors.</span>"
S.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has had a laser pointer shone in their eyes by [user.name] ([user.ckey])</font>")
user.attack_log += text("\[[time_stamp()]\] <font color='orange'>Shone a laser pointer in the eyes of [S.name] ([S.ckey])</font>")
msg_admin_attack("<font color='orange'>[user.name] ([user.ckey]) Shone a laser pointer in the eyes of [S.name] ([S.ckey])</font>")
else
outmsg = "<span class='notice'>You fail to overload [S] by shining [src] at their sensors.</span>"
//cameras
else if(istype(target, /obj/machinery/camera))
var/obj/machinery/camera/C = target
if(prob(effectchance * diode.rating))
C.emp_act(1)
outmsg = "<span class='notice'>You hit the lens of [C] with [src], temporarily disabling the camera!</span>"
msg_admin_attack("[user.name] ([user.ckey]) EMPd a camera with a laser pointer")
user.attack_log += text("\[[time_stamp()]\] [user.name] ([user.ckey]) EMPd a camera with a laser pointer")
else
outmsg = "<span class='info'>You missed the lens of [C] with [src].</span>"
//laser pointer image
icon_state = "pointer_[pointer_icon_state]"
var/list/showto = list()
for(var/mob/M in range(7,targloc))
if(M.client)
showto.Add(M.client)
var/image/I = image('icons/obj/projectiles.dmi',targloc,pointer_icon_state,10)
I.pixel_x = target.pixel_x + rand(-5,5)
I.pixel_y = target.pixel_y + rand(-5,5)
if(outmsg)
user << outmsg
else
user << "<span class='info'>You point [src] at [target].</span>"
energy -= 1
if(energy <= max_energy)
if(!recharging)
recharging = 1
processing_objects.Add(src)
if(energy <= 0)
user << "<span class='warning'>You've overused the battery of [src], now it needs time to recharge!</span>"
recharge_locked = 1
flick_overlay(I, showto, 10)
icon_state = "pointer"
/obj/item/device/laser_pointer/process()
if(prob(20 - recharge_locked*5))
energy += 1
if(energy >= max_energy)
energy = max_energy
recharging = 0
recharge_locked = 0
..()
@@ -52,6 +52,7 @@
bombers += "[key_name(user)] attached a [item] to a transfer valve."
message_admins("[key_name_admin(user)] attached a [item] to a transfer valve.")
message_mods("[key_name_admin(user)] attached a [item] to a transfer valve.")
log_game("[key_name_admin(user)] attached a [item] to a transfer valve.")
attacher = user
nanomanager.update_uis(src) // update all UIs attached to src
@@ -66,7 +67,7 @@
/obj/item/device/transfer_valve/attack_self(mob/user as mob)
ui_interact(user)
/obj/item/device/transfer_valve/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null)
// this is the data which will be sent to the ui
@@ -77,13 +78,13 @@
data["valveOpen"] = valve_open ? 1 : 0
// update the ui if it exists, returns null if no ui is passed/found
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data)
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data)
if (!ui)
// the ui does not exist, so we'll create a new() one
// for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm
ui = new(user, src, ui_key, "transfer_valve.tmpl", "Tank Transfer Valve", 460, 280)
// when the ui is first opened this is the data it will use
ui.set_initial_data(data)
ui.set_initial_data(data)
// open the new ui window
ui.open()
// auto update every Master Controller tick
@@ -191,6 +192,7 @@
log_str += " Last touched by: [src.fingerprintslast][last_touch_info]"
bombers += log_str
message_admins(log_str, 0, 1)
message_mods(log_str)
log_game(log_str)
merge_gases()
spawn(20) // In case one tank bursts
@@ -71,6 +71,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
var/lastHolder = null
var/smoketime = 300
var/chem_volume = 15
var/can_hurt_mob = 1
/obj/item/clothing/mask/cigarette/New()
..()
@@ -117,6 +118,86 @@ CIGARETTE PACKETS ARE IN FANCY.DM
user.update_inv_r_hand(1)
return
/obj/item/clothing/mask/cigarette/attack(mob/M as mob, mob/user as mob)
if(!can_hurt_mob)
return ..()
var/mob/living/carbon/human/H
if(ishuman(M))
H = M
else
return ..()
if(lit)
if (user.a_intent == "hurt")
switch(user.zone_sel.selecting)
if("eyes")
H.apply_damage(6, BURN, "eyes")
for(var/mob/O in viewers(H, null))
O.show_message("\red <B>[user] has shoved [src] in [M] eyes!</B>", 1)
H.say("*scream")
if("mouth")
H.apply_damage(6, BURN, "mouth")
for(var/mob/O in viewers(H, null))
O.show_message("\red <B>[user] has shoved [src] in [M] mouth!</B>", 1)
H.say("*scream")
if("head")
H.apply_damage(6, BURN, "head")
for(var/mob/O in viewers(H, null))
O.show_message("\red <B>[user] has shoved [src] in [M] face!</B>", 1)
H.say("*scream")
if("chest")
H.apply_damage(6, BURN, "chest")
for(var/mob/O in viewers(H, null))
O.show_message("\red <B>[user] has shoved [src] in [M] chest!</B>", 1)
H.say("*scream")
if("groin")
H.apply_damage(6, BURN, "groin")
for(var/mob/O in viewers(H, null))
O.show_message("\red <B>[user] has shoved [src] in [M] groin!</B>", 1)
H.say("*scream")
if("l_arm")
H.apply_damage(6, BURN, "l_arm")
for(var/mob/O in viewers(H, null))
O.show_message("\red <B>[user] has shoved [src] in [M] left arm!</B>", 1)
H.say("*scream")
if("r_arm")
H.apply_damage(6, BURN, "r_arm")
for(var/mob/O in viewers(H, null))
O.show_message("\red <B>[user] has shoved [src] in [M] right arm!</B>", 1)
H.say("*scream")
if("l_leg")
H.apply_damage(6, BURN, "l_leg")
for(var/mob/O in viewers(H, null))
O.show_message("\red <B>[user] has shoved [src] in [M] left leg!</B>", 1)
H.say("*scream")
if("l_hand")
H.apply_damage(6, BURN, "l_hand")
for(var/mob/O in viewers(H, null))
O.show_message("\red <B>[user] has shoved [src] in [M] left hand!</B>", 1)
H.say("*scream")
if("r_hand")
H.apply_damage(6, BURN, "r_hand")
for(var/mob/O in viewers(H, null))
O.show_message("\red <B>[user] has shoved [src] in [M] right hand!</B>", 1)
H.say("*scream")
if("r_foot")
H.apply_damage(6, BURN, "r_foot")
for(var/mob/O in viewers(H, null))
O.show_message("\red <B>[user] has shoved [src] in [M] left foot!</B>", 1)
H.say("*scream")
if("l_foot")
H.apply_damage(6, BURN, "l_foot")
for(var/mob/O in viewers(H, null))
O.show_message("\red <B>[user] has shoved [src] in [M] right foot!</B>", 1)
H.say("*scream")
else
return ..()
M.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been burnt with [src.name] by [user.name] ([user.ckey])</font>")
user.attack_log += text("\[[time_stamp()]\] <font color='red'>Used the [src.name] to burn [M.name] ([M.ckey])</font>")
msg_admin_attack("[key_name(user)] burnt [key_name(user)] with [src.name] (INTENT: [uppertext(user.a_intent)]) - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>")
/obj/item/clothing/mask/cigarette/afterattack(obj/item/weapon/reagent_containers/glass/glass, mob/user as mob, proximity)
..()
@@ -217,6 +298,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
item_state = "cigaroff"
smoketime = 1500
chem_volume = 20
can_hurt_mob = 1
/obj/item/clothing/mask/cigarette/cigar/cohiba
name = "\improper Cohiba Robusto cigar"
@@ -224,6 +306,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
icon_state = "cigar2off"
icon_on = "cigar2on"
icon_off = "cigar2off"
can_hurt_mob = 1
/obj/item/clothing/mask/cigarette/cigar/havana
name = "premium Havanian cigar"
@@ -233,6 +316,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
icon_off = "cigar2off"
smoketime = 7200
chem_volume = 30
can_hurt_mob = 1
/obj/item/weapon/cigbutt
name = "cigarette butt"
@@ -294,6 +378,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
icon_on = "pipeon" //Note - these are in masks.dmi
icon_off = "pipeoff"
smoketime = 100
can_hurt_mob = 0
/obj/item/clothing/mask/cigarette/pipe/light(var/flavor_text = "[usr] lights the [name].")
if(!src.lit)
@@ -368,6 +453,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
icon_on = "cobpipeon" //Note - these are in masks.dmi
icon_off = "cobpipeoff"
smoketime = 400
can_hurt_mob = 0
@@ -430,9 +516,9 @@ CIGARETTE PACKETS ARE IN FANCY.DM
icon_state = icon_off
item_state = icon_off
if(istype(src, /obj/item/weapon/lighter/zippo) )
user.visible_message("<span class='rose'>You hear a quiet click, as [user] shuts off [src] without even looking at what they're doing.")
user.visible_message("<span class='rose'>You hear a quiet click, as [user] shuts off [src] without even looking at what they're doing.</span>")
else
user.visible_message("<span class='notice'>[user] quietly shuts off the [src].")
user.visible_message("<span class='notice'>[user] quietly shuts off the [src].</span>")
user.SetLuminosity(user.luminosity - 2)
processing_objects.Remove(src)
+1 -1
View File
@@ -109,7 +109,7 @@
playsound(get_turf(src), 'sound/weapons/Egloves.ogg', 50, 1, -1)
user.attack_log += "\[[time_stamp()]\]<font color='red'> Defibrillated [H.name] ([H.ckey]) with [src.name]</font>"
H.attack_log += "\[[time_stamp()]\]<font color='orange'> Defibrillated by [user.name] ([user.ckey]) with [src.name]</font>"
msg_admin_attack("<font color='red'>[user.name] ([user.ckey]) defibrillated [H.name] ([H.ckey]) with [src.name]</font>" )
msg_admin_attack("<font color='red'>[user.name] ([user.ckey]) defibrillated [H.name] ([H.ckey]) with [src.name]</font> - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[H.x];Y=[H.y];Z=[H.z]'>JMP</a>" )
if(!iscarbon(user))
M.LAssailant = null
else
@@ -128,6 +128,7 @@
testing("Isolated block [block] injector with contents: [GetValue()]")
if (GetState() && block == MONKEYBLOCK && istype(M, /mob/living/carbon/human) )
message_admins("[key_name_admin(user)] injected [key_name_admin(M)] with the Isolated [name] \red(MONKEY)")
message_mods("[key_name_admin(user)] injected [key_name_admin(M)] with the Isolated [name] \red(MONKEY)")
log_attack("[key_name(user)] injected [key_name(M)] with the Isolated [name] (MONKEY)")
log_game("[key_name_admin(user)] injected [key_name_admin(M)] with the Isolated [name] \red(MONKEY)")
else
@@ -136,6 +137,7 @@
testing("DNA injector with contents: [english_list(buf.dna.SE)]")
if (GetState(MONKEYBLOCK) && istype(M, /mob/living/carbon/human) )
message_admins("[key_name_admin(user)] injected [key_name_admin(M)] with the [name] \red(MONKEY)")
message_mods("[key_name_admin(user)] injected [key_name_admin(M)] with the [name] \red(MONKEY)")
log_attack("[key_name(user)] injected [key_name(M)] with the [name] (MONKEY)")
log_game("[key_name_admin(user)] injected [key_name_admin(M)] with the [name] \red(MONKEY)")
else
@@ -163,6 +165,7 @@
testing("Isolated block [block] injector with contents: [GetValue()]")
if (GetState() && block == MONKEYBLOCK && istype(M, /mob/living/carbon/human) )
message_admins("[key_name_admin(user)] injected [key_name_admin(M)] with the Isolated [name] \red(MONKEY)")
message_mods("[key_name_admin(user)] injected [key_name_admin(M)] with the Isolated [name] \red(MONKEY)")
log_attack("[key_name(user)] injected [key_name(M)] with the Isolated [name] (MONKEY)")
log_game("[key_name_admin(user)] injected [key_name_admin(M)] with the Isolated [name] \red(MONKEY)")
else
@@ -171,6 +174,7 @@
testing("DNA injector with contents: [english_list(buf.dna.SE)]")
if (GetState(MONKEYBLOCK) && istype(M, /mob/living/carbon/human))
message_admins("[key_name_admin(user)] injected [key_name_admin(M)] with the [name] \red(MONKEY)")
message_mods("[key_name_admin(user)] injected [key_name_admin(M)] with the [name] \red(MONKEY)")
log_game("[key_name(user)] injected [key_name(M)] with the [name] (MONKEY)")
else
// message_admins("[key_name_admin(user)] injected [key_name_admin(M)] with the [name]")
@@ -5,12 +5,12 @@
icon_state = "fire_extinguisher0"
item_state = "fire_extinguisher"
hitsound = 'sound/weapons/smash.ogg'
flags = FPRINT | USEDELAY | TABLEPASS | CONDUCT
flags = FPRINT | TABLEPASS | CONDUCT
throwforce = 10
w_class = 3.0
throw_speed = 2
throw_range = 10
force = 10
force = 10.0
m_amt = 90
attack_verb = list("slammed", "whacked", "bashed", "thunked", "battered", "bludgeoned", "thrashed")
var/max_water = 50
@@ -24,7 +24,7 @@
icon_state = "miniFE0"
item_state = "miniFE"
hitsound = null //it is much lighter, after all.
flags = FPRINT | USEDELAY | TABLEPASS
flags = FPRINT | TABLEPASS
throwforce = 2
w_class = 2.0
force = 3.0
@@ -78,8 +78,12 @@
if(usr.buckled && isobj(usr.buckled) && !usr.buckled.anchored )
spawn(0)
var/obj/structure/stool/bed/chair/C = null
if(istype(usr.buckled, /obj/structure/stool/bed/chair))
C = usr.buckled
var/obj/B = usr.buckled
var/movementdirection = turn(direction,180)
if(C) C.propelled = 1
B.Move(get_step(usr,movementdirection), movementdirection)
sleep(1)
B.Move(get_step(usr,movementdirection), movementdirection)
@@ -91,6 +95,7 @@
B.Move(get_step(usr,movementdirection), movementdirection)
sleep(2)
B.Move(get_step(usr,movementdirection), movementdirection)
if(C) C.propelled = 0
sleep(3)
B.Move(get_step(usr,movementdirection), movementdirection)
sleep(3)
@@ -117,18 +122,15 @@
for(var/b=0, b<5, b++)
step_towards(W,my_target)
if(!W) return
if(!W.reagents) return
W.reagents.reaction(get_turf(W))
for(var/atom/atm in get_turf(W))
if(!W) return
W.reagents.reaction(atm)
if(isliving(atm)) //For extinguishing mobs on fire
var/mob/living/M = atm
M.ExtinguishMob()
if(W.loc == my_target) break
sleep(2)
W.delete()
// spawn(20)
W.Del()
if((istype(usr.loc, /turf/space)) || (usr.lastarea.has_gravity == 0))
user.inertia_dir = get_dir(target, user)
step(user, user.inertia_dir)
@@ -185,7 +185,7 @@
H.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been wrapped with [src.name] by [user.name] ([user.ckey])</font>")
user.attack_log += text("\[[time_stamp()]\] <font color='red'>Used the [src.name] to wrap [H.name] ([H.ckey])</font>")
msg_admin_attack("[key_name(user)] used [src] to wrap [key_name(H)]")
msg_admin_attack("[key_name(user)] used [src] to wrap [key_name(H)] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[H.x];Y=[H.y];Z=[H.z]'>JMP</a>")
else
user << "\blue You need more paper."
+1 -1
View File
@@ -54,7 +54,7 @@
C.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been handcuffed (attempt) by [user.name] ([user.ckey])</font>")
user.attack_log += text("\[[time_stamp()]\] <font color='red'>Attempted to handcuff [C.name] ([C.ckey])</font>")
msg_admin_attack("[key_name(user)] attempted to handcuff [key_name(C)]")
msg_admin_attack("[key_name(user)] attempted to handcuff [key_name(C)] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[C.x];Y=[C.y];Z=[C.z]'>JMP</a>")
var/obj/effect/equip_e/human/O = new /obj/effect/equip_e/human( )
O.source = user
@@ -203,7 +203,7 @@
/obj/item/weapon/grown/deathnettle/changePotency(newValue) //-QualityVan
potency = newValue
force = round((5+potency/2.5), 1)
force = round((5+potency), 1) ///2.5. deadly nettles because you have earned it.
/*
@@ -163,6 +163,7 @@ Implant Specifics:<BR>"}
if(istype(imp_in, /mob/))
var/mob/T = imp_in
message_admins("Explosive implant triggered in [T] ([T.key]). (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[T.x];Y=[T.y];Z=[T.z]'>JMP</a>) ")
message_mods("Explosive implant triggered in [T] ([T.key]). (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[T.x];Y=[T.y];Z=[T.z]'>JMP</a>) ")
log_game("Explosive implant triggered in [T] ([T.key]).")
need_gib = 1
+4 -2
View File
@@ -83,8 +83,10 @@
else
break
if(!success)
user.loc = pick(L)
if(user.weakened > 100)//if you are megastunned by the isocube, there is no escape
user <<"An outside force prevents you from teleporting."
else if(!success)
user.loc = pick(L)
smoke.start()
src.uses -= 1
+4 -4
View File
@@ -88,7 +88,7 @@
user.attack_log += "\[[time_stamp()]\]<font color='red'> Stunned [H.name] ([H.ckey]) with [src.name]</font>"
H.attack_log += "\[[time_stamp()]\]<font color='orange'> Stunned by [user.name] ([user.ckey]) with [src.name]</font>"
msg_admin_attack("[key_name(user)] stunned [key_name(H)] with [src.name]")
msg_admin_attack("[key_name(user)] stunned [key_name(H)] with [src.name] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[H.x];Y=[H.y];Z=[H.z]'>JMP</a>")
playsound(src.loc, 'sound/weapons/Egloves.ogg', 50, 1, -1)
if(charges < 1)
@@ -115,7 +115,7 @@
H.visible_message("<span class='danger'>[src], thrown by [foundmob.name], strikes [H] and stuns them!</span>")
H.attack_log += "\[[time_stamp()]\]<font color='orange'> Stunned by thrown [src.name] last touched by ([src.fingerprintslast])</font>"
msg_admin_attack("Flying [src.name], last touched by ([src.fingerprintslast]) stunned [key_name(H)]" )
msg_admin_attack("Flying [src.name], last touched by ([src.fingerprintslast]) stunned [key_name(H)] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[H.x];Y=[H.y];Z=[H.z]'>JMP</a>" )
/obj/item/weapon/melee/baton/emp_act(severity)
switch(severity)
@@ -228,7 +228,7 @@
user.attack_log += "\[[time_stamp()]\]<font color='red'> Stunned [H.name] ([H.ckey]) with [src.name]</font>"
H.attack_log += "\[[time_stamp()]\]<font color='orange'> Stunned by [user.name] ([user.ckey]) with [src.name]</font>"
msg_admin_attack("[key_name(user)] stunned [key_name(H)] with [src.name]")
msg_admin_attack("[key_name(user)] stunned [key_name(H)] with [src.name] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[H.x];Y=[H.y];Z=[H.z]'>JMP</a>")
playsound(src.loc, 'sound/weapons/Egloves.ogg', 50, 1, -1)
if(charges < 1)
@@ -256,7 +256,7 @@
H.visible_message("<span class='danger'>[src], thrown by [foundmob.name], strikes [H] and stuns them!</span>")
H.attack_log += "\[[time_stamp()]\]<font color='orange'> Stunned by thrown [src.name] last touched by ([src.fingerprintslast])</font>"
msg_admin_attack("Flying [src.name], last touched by ([src.fingerprintslast]) stunned [key_name(H)]" )
msg_admin_attack("Flying [src.name], last touched by ([src.fingerprintslast]) stunned [key_name(H)] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[H.x];Y=[H.y];Z=[H.z]'>JMP</a>" )
/obj/item/weapon/melee/baton/stunrod/emp_act(severity)
switch(severity)
@@ -104,7 +104,7 @@
M.Weaken(5)
M.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been attacked with [src.name] by [user.name] ([user.ckey])</font>")
user.attack_log += text("\[[time_stamp()]\] <font color='red'>Used the [src.name] to attack [M.name] ([M.ckey])</font>")
msg_admin_attack("[key_name(user)] attacked [key_name(user)] with [src.name] (INTENT: [uppertext(user.a_intent)])")
msg_admin_attack("[key_name(user)] attacked [key_name(user)] with [src.name] (INTENT: [uppertext(user.a_intent)]) - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>")
src.add_fingerprint(user)
for(var/mob/O in viewers(M))
@@ -181,7 +181,7 @@
// var/obj/item/c_hand UNFUCK WHEN YOU HAVE TIME AND KNOWLEDGE
// var/hand
if(user.zone_sel.selecting == "r_leg" || user.zone_sel.selecting == "l_leg")
target.Weaken(20)
target.Weaken(10) //nerfed, because yes.
/* if(user.zone_sel.selecting == "l_hand" || user.zone_sel.selecting == "l_arm")
c_hand = "l_hand"
target.u_equip(c_hand)
@@ -77,6 +77,7 @@
src.bomb.detonate()
log_admin("[user.real_name]([user.ckey]) has triggered [src.bomb] with [src].")
message_admins("\red [user.real_name]([user.ckey]) has triggered [src.bomb] with [src].")
message_mods("\red [user.real_name]([user.ckey]) has triggered [src.bomb] with [src].")
if("Close the lighter.")
src.icon_state = "c-4detonator_0"
@@ -27,7 +27,7 @@
src.air_contents.volume = volume //liters
src.air_contents.temperature = T20C
processing_objects.Add(src)
processing_objects.Add(src)
return
/obj/item/weapon/tank/Del()
@@ -141,8 +141,8 @@
data["defaultReleasePressure"] = round(TANK_DEFAULT_RELEASE_PRESSURE)
data["maxReleasePressure"] = round(TANK_MAX_RELEASE_PRESSURE)
data["valveOpen"] = using_internal ? 1 : 0
data["maskConnected"] = 0
data["maskConnected"] = 0
if(istype(loc,/mob/living/carbon))
var/mob/living/carbon/location = loc
if(location.internal == src || (location.wear_mask && (location.wear_mask.flags & MASKINTERNALS)))
@@ -239,6 +239,7 @@
if(pressure > TANK_FRAGMENT_PRESSURE)
if(!istype(src.loc,/obj/item/device/transfer_valve))
message_admins("Explosive tank rupture! last key to touch the tank was [src.fingerprintslast].")
message_mods("Explosive tank rupture! last key to touch the tank was [src.fingerprintslast].")
log_game("Explosive tank rupture! last key to touch the tank was [src.fingerprintslast].")
//world << "\blue[x],[y] tank is exploding: [pressure] kPa"
//Give the gas a chance to build up more pressure through reacting
+1
View File
@@ -260,6 +260,7 @@
tank.armed = 1
user.visible_message("[user] begins heating the [O].", "You start to heat the [O].")
message_admins("[key_name_admin(user)] is attempting a welder bomb at ([loc.x],[loc.y],[loc.z]) - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[O.x];Y=[O.y];Z=[O.z]'>JMP</a>")
message_mods("[key_name_admin(user)] is attempting a welder bomb at ([loc.x],[loc.y],[loc.z]) - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[O.x];Y=[O.y];Z=[O.z]'>JMP</a>")
if(do_after(user,100))
// var/obj/structure/reagent_dispensers/fueltank/tank = O
if(tank.defuse)
@@ -232,6 +232,31 @@
new /obj/item/device/encryptionkey/headset_med(src)
return
/obj/structure/closet/secure_closet/forensics
name = "Forensic tech's closet"
req_access = list(access_forensics_lockers)
icon_state = "sec1"
icon_closed = "sec"
icon_locked = "sec1"
icon_opened = "secopen"
icon_broken = "secbroken"
icon_off = "secoff"
New()
..()
sleep(2)
new /obj/item/clothing/under/rank/navy/det/forensics(src)
new /obj/item/clothing/suit/storage/forensics/blue(src)
new /obj/item/clothing/suit/storage/forensics/red(src)
new /obj/item/clothing/gloves/black(src)
new /obj/item/clothing/shoes/brown(src)
new /obj/item/weapon/storage/box/evidence(src)
new /obj/item/device/radio/headset/headset_sec(src)
new /obj/item/clothing/suit/armor/det_suit(src)
new /obj/item/taperoll/police(src)
new /obj/item/clothing/tie/holobadge(src)
return
/obj/structure/closet/secure_closet/detective
name = "Detective's Cabinet"
@@ -248,24 +273,17 @@
sleep(2)
new /obj/item/clothing/under/det(src)
new /obj/item/clothing/under/det/black(src)
new /obj/item/clothing/under/det/slob(src)
new /obj/item/clothing/suit/storage/det_suit(src)
new /obj/item/clothing/suit/storage/det_suit/black(src)
new /obj/item/clothing/suit/storage/forensics/blue(src)
new /obj/item/clothing/suit/storage/forensics/red(src)
new /obj/item/clothing/gloves/black(src)
new /obj/item/clothing/head/det_hat(src)
new /obj/item/clothing/head/det_hat/black(src)
new /obj/item/clothing/shoes/brown(src)
new /obj/item/weapon/storage/box/evidence(src)
new /obj/item/device/radio/headset/headset_sec(src)
new /obj/item/device/detective_scanner(src)
new /obj/item/clothing/suit/armor/det_suit(src)
new /obj/item/ammo_magazine/c45r(src)
new /obj/item/ammo_magazine/c45r(src)
new /obj/item/taperoll/police(src)
new /obj/item/weapon/gun/projectile/detective/semiauto(src)
new /obj/item/clothing/tie/holster/armpit(src)
new /obj/item/clothing/tie/holobadge(src)
return
/obj/structure/closet/secure_closet/detective/update_icon()
@@ -12,6 +12,7 @@
desc = "This is used to lie in, sleep in or strap on."
icon_state = "bed"
var/mob/living/buckled_mob
var/movable = 0
/obj/structure/stool/bed/psych
name = "psych bed"
@@ -49,6 +50,8 @@
buckled_mob.buckled = null
buckled_mob.anchored = initial(buckled_mob.anchored)
buckled_mob.update_canmove()
if(!buckled_mob.mob_has_gravity(buckled_mob.loc))
buckled_mob.float(1)
buckled_mob = null
return
@@ -95,6 +98,8 @@
M.loc = src.loc
M.dir = src.dir
M.update_canmove()
if(!M.mob_has_gravity(M.loc))
M.float(0)
src.buckled_mob = M
src.add_fingerprint(user)
return
@@ -3,6 +3,8 @@
desc = "You sit in this. Either by will or force."
icon_state = "chair"
var/propelled = 0 // Check for fire-extinguisher-driven chairs
/obj/structure/stool/MouseDrop(atom/over_object)
return
@@ -115,13 +117,39 @@
/obj/structure/stool/bed/chair/office/Move()
..()
if(buckled_mob)
buckled_mob.buckled = null //Temporary, so Move() succeeds.
var/moved = buckled_mob.Move(src.loc)
buckled_mob.buckled = src
if(!moved)
unbuckle()
var/mob/living/occupant = buckled_mob
occupant.buckled = null
occupant.Move(src.loc)
occupant.buckled = src
if (occupant && (src.loc != occupant.loc))
if (propelled)
for (var/mob/O in src.loc)
if (O != occupant)
Bump(O)
else
unbuckle()
handle_rotation()
/obj/structure/stool/bed/chair/office/Bump(atom/A)
..()
if(!buckled_mob) return
if(propelled)
var/mob/living/occupant = buckled_mob
unbuckle()
occupant.throw_at(A, 3, 2)
occupant.apply_effect(6, STUN, 0)
occupant.apply_effect(6, WEAKEN, 0)
occupant.apply_effect(6, STUTTER, 0)
playsound(src.loc, 'sound/weapons/punch1.ogg', 50, 1, -1)
if(istype(A, /mob/living))
var/mob/living/victim = A
victim.apply_effect(6, STUN, 0)
victim.apply_effect(6, WEAKEN, 0)
victim.apply_effect(6, STUTTER, 0)
victim.take_organ_damage(10)
occupant.visible_message("<span class='danger'>[occupant] clashed into \the [A]!</span>")
/obj/structure/stool/bed/chair/office/light
icon_state = "officechair_white"
@@ -0,0 +1,187 @@
/obj/structure/stool/bed/chair/wheelchair
name = "wheelchair"
desc = "You sit in this. Either by will or force."
icon_state = "wheelchair"
anchored = 0
movable = 1
var/driving = 0
var/mob/living/pulling = null
var/bloodiness
/obj/structure/stool/bed/chair/wheelchair/handle_rotation()
overlays = null
var/image/O = image(icon = 'icons/obj/objects.dmi', icon_state = "w_overlay", layer = FLY_LAYER, dir = src.dir)
overlays += O
if(buckled_mob)
buckled_mob.dir = dir
/obj/structure/stool/bed/chair/wheelchair/relaymove(mob/user, direction)
// Redundant check?
if(user.stat || user.stunned || user.weakened || user.paralysis || user.lying || user.restrained())
if(user==pulling)
pulling = null
user.pulledby = null
user << "\red You lost your grip!"
return
if(buckled_mob && pulling && user == buckled_mob)
if(pulling.stat || pulling.stunned || pulling.weakened || pulling.paralysis || pulling.lying || pulling.restrained())
pulling.pulledby = null
pulling = null
if(user.pulling && (user == pulling))
pulling = null
user.pulledby = null
return
if(propelled)
return
if(pulling && (get_dist(src, pulling) > 1))
pulling = null
user.pulledby = null
if(user==pulling)
return
if(pulling && (get_dir(src.loc, pulling.loc) == direction))
user << "\red You cannot go there."
return
if(pulling && buckled_mob && (buckled_mob == user))
user << "\red You cannot drive while being pushed."
return
// Let's roll
driving = 1
var/turf/T = null
//--1---Move occupant---1--//
if(buckled_mob)
buckled_mob.buckled = null
step(buckled_mob, direction)
buckled_mob.buckled = src
//--2----Move driver----2--//
if(pulling)
T = pulling.loc
if(get_dist(src, pulling) >= 1)
step(pulling, get_dir(pulling.loc, src.loc))
//--3--Move wheelchair--3--//
step(src, direction)
if(buckled_mob) // Make sure it stays beneath the occupant
Move(buckled_mob.loc)
dir = direction
handle_rotation()
if(pulling) // Driver
if(pulling.loc == src.loc) // We moved onto the wheelchair? Revert!
pulling.loc = T
else
spawn(0)
if(get_dist(src, pulling) > 1) // We are too far away? Losing control.
pulling = null
user.pulledby = null
pulling.dir = get_dir(pulling, src) // When everything is right, face the wheelchair
if(bloodiness)
create_track()
driving = 0
/obj/structure/stool/bed/chair/wheelchair/Move()
..()
if(buckled_mob)
var/mob/living/occupant = buckled_mob
if(!driving)
occupant.buckled = null
occupant.Move(src.loc)
occupant.buckled = src
if (occupant && (src.loc != occupant.loc))
if (propelled)
for (var/mob/O in src.loc)
if (O != occupant)
Bump(O)
else
unbuckle()
if (pulling && (get_dist(src, pulling) > 1))
pulling.pulledby = null
pulling << "\red You lost your grip!"
pulling = null
else
if (occupant && (src.loc != occupant.loc))
src.loc = occupant.loc // Failsafe to make sure the wheelchair stays beneath the occupant after driving
handle_rotation()
/obj/structure/stool/bed/chair/wheelchair/attack_hand(mob/user as mob)
if (pulling)
MouseDrop(usr)
else
manual_unbuckle(user)
return
/obj/structure/stool/bed/chair/wheelchair/MouseDrop(over_object, src_location, over_location)
..()
if(over_object == usr && in_range(src, usr))
if(!ishuman(usr)) return
if(usr == buckled_mob)
usr << "\red You realize you are unable to push the wheelchair you sit in."
return
if(!pulling)
pulling = usr
usr.pulledby = src
if(usr.pulling)
usr.stop_pulling()
usr.dir = get_dir(usr, src)
usr << "You grip \the [name]'s handles."
else
if(usr != pulling)
for(var/mob/O in viewers(pulling, null))
O.show_message("\red [usr] breaks [pulling]'s grip on the wheelchair.", 1)
else
usr << "You let go of \the [name]'s handles."
pulling.pulledby = null
pulling = null
return
/obj/structure/stool/bed/chair/wheelchair/Bump(atom/A)
..()
if(!buckled_mob) return
if(propelled || (pulling && (pulling.a_intent == "hurt")))
var/mob/living/occupant = buckled_mob
unbuckle()
if (pulling && (pulling.a_intent == "hurt"))
occupant.throw_at(A, 3, 3, pulling)
else if (propelled)
occupant.throw_at(A, 3, propelled)
occupant.apply_effect(6, STUN, 0)
occupant.apply_effect(6, WEAKEN, 0)
occupant.apply_effect(6, STUTTER, 0)
playsound(src.loc, 'sound/weapons/punch1.ogg', 50, 1, -1)
if(istype(A, /mob/living))
var/mob/living/victim = A
victim.apply_effect(6, STUN, 0)
victim.apply_effect(6, WEAKEN, 0)
victim.apply_effect(6, STUTTER, 0)
victim.take_organ_damage(10)
if(pulling)
occupant.visible_message("<span class='danger'>[pulling] has thrusted \the [name] into \the [A], throwing \the [occupant] out of it!</span>")
pulling.attack_log += "\[[time_stamp()]\]<font color='red'> Crashed [occupant.name]'s ([occupant.ckey]) [name] into \a [A]</font>"
occupant.attack_log += "\[[time_stamp()]\]<font color='orange'> Thrusted into \a [A] by [pulling.name] ([pulling.ckey]) with \the [name]</font>"
msg_admin_attack("[pulling.name] ([pulling.ckey]) has thrusted [occupant.name]'s ([occupant.ckey]) [name] into \a [A] (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[pulling.x];Y=[pulling.y];Z=[pulling.z]'>JMP</a>)")
else
occupant.visible_message("<span class='danger'>[occupant] crashed into \the [A]!</span>")
/obj/structure/stool/bed/chair/wheelchair/proc/create_track()
var/obj/effect/decal/cleanable/blood/tracks/B = new(loc)
var/newdir = get_dir(get_step(loc, dir), loc)
if(newdir == dir)
B.dir = newdir
else
newdir = newdir | dir
if(newdir == 3)
newdir = 1
else if(newdir == 12)
newdir = 4
B.dir = newdir
bloodiness--
/obj/structure/stool/bed/chair/wheelchair/buckle_mob(mob/M as mob, mob/user as mob)
if(M == pulling)
pulling = null
usr.pulledby = null
..()
+8 -7
View File
@@ -21,7 +21,7 @@
throwpass = 1 //You can throw objects over this, despite it's density.")
var/parts = /obj/item/weapon/table_parts
var/flipped = 0
var/health = 100
var/health = 200
/obj/structure/table/proc/update_adjacent()
for(var/direction in list(1,2,4,8,5,6,9,10))
@@ -274,6 +274,7 @@
/obj/structure/table/attack_alien(mob/user)
visible_message("<span class='danger'>[user] slices [src] apart!</span>")
destroy()
/obj/structure/table/attack_animal(mob/living/simple_animal/user)
if(user.wall_smash)
@@ -310,14 +311,14 @@
if (get_dist(P.starting, loc) <= 1) //Tables won't help you if people are THIS close
return 1
if (get_turf(P.original) == cover)
var/chance = 20
var/chance = 30
if (ismob(P.original))
var/mob/M = P.original
if (M.lying)
chance += 20 //Lying down lets you catch less bullets
chance += 50 //Lying down lets you catch less bullets
if(flipped)
if(get_dir(loc, from) == dir) //Flipped tables catch mroe bullets
chance += 20
chance += 50
else
return 1 //But only from one side
if(prob(chance))
@@ -363,7 +364,7 @@
if (prob(15)) M.Weaken(5)
M.apply_damage(8,def_zone = "head")
visible_message("\red [G.assailant] slams [G.affecting]'s face against \the [src]!")
msg_admin_attack("[user.name]([user.ckey]) slams [M.name]'s([M.ckey]) face against \the [src]!")
msg_admin_attack("[user.name]([user.ckey]) slams [M.name]'s([M.ckey]) face against \the [src]! - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[M.x];Y=[M.y];Z=[M.z]'>JMP</a>")
playsound(src.loc, 'sound/weapons/tablehit1.ogg', 50, 1)
else
user << "\red You need a better grip to do that!"
@@ -544,7 +545,7 @@
desc = "Do not apply fire to this. Rumour says it burns easily."
icon_state = "wood_table"
parts = /obj/item/weapon/table_parts/wood
health = 50
health = 100
/*
* Reinforced tables
*/
@@ -552,7 +553,7 @@
name = "reinforced table"
desc = "A version of the four legged table. It is stronger."
icon_state = "reinf_table"
health = 200
health = 400
var/status = 2
parts = /obj/item/weapon/table_parts/reinforced
@@ -79,10 +79,14 @@
/obj/structure/target_stake/proc/unbuckle()
if(buckled_mob)
if(buckled_mob.buckled == src) //this is probably unneccesary, but it doesn't hurt
if(!buckled_mob.mob_has_gravity(buckled_mob.loc))
buckled_mob.float(1)
buckled_mob.buckled = null
buckled_mob.anchored = initial(buckled_mob.anchored)
buckled_mob.update_canmove()
buckled_mob = null
return
/obj/structure/target_stake/proc/manual_unbuckle(mob/user as mob)
@@ -138,6 +142,8 @@
M.loc = src.loc
M.dir = src.dir
M.update_canmove()
if(!M.mob_has_gravity(M.loc))
M.float(0)
src.buckled_mob = M
src.add_fingerprint(user)
return
@@ -344,6 +344,14 @@
M.clean_blood()
if(ishuman(M))
M:update_inv_gloves()
if(ishuman(M))
var/mob/living/carbon/human/B = M
if(B.gloves)
var/obj/item/clothing/gloves/C = B.gloves
C.gsr = 0
else
B.gsr = 0
for(var/mob/V in viewers(src, null))
V.show_message("\blue [M] washes their hands using \the [src].")
@@ -392,6 +400,11 @@
if(user.get_active_hand() != I) return //Person has switched hands or the item in their hands
O.clean_blood()
if(istype(O, /obj/item/clothing))
var/obj/item/clothing/G = O
G.gsr = 0
user.visible_message( \
"\blue [user] washes \a [I] using \the [src].", \
"\blue You wash \a [I] using \the [src].")
+3 -3
View File
@@ -180,20 +180,20 @@
M.apply_damage(7)
hit(10)
visible_message("\red [user] slams [M] against \the [src]!")
msg_admin_attack("[user.name]([user.ckey]) slams [M.name]'s([M.ckey]) against \the [src]!")
msg_admin_attack("[user.name]([user.ckey]) slams [M.name]'s([M.ckey]) against \the [src]! - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[M.x];Y=[M.y];Z=[M.z]'>JMP</a>")
if(2)
if (prob(50))
M.Weaken(1)
M.apply_damage(10)
hit(25)
visible_message("\red <b>[user] bashes [M] against \the [src]!</b>")
msg_admin_attack("[user.name]([user.ckey]) bashes [M.name]'s([M.ckey]) against \the [src]!")
msg_admin_attack("[user.name]([user.ckey]) bashes [M.name]'s([M.ckey]) against \the [src]! - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[M.x];Y=[M.y];Z=[M.z]'>JMP</a>")
if(3)
M.Weaken(5)
M.apply_damage(20)
hit(50)
visible_message("\red <big><b>[user] crushes [M] against \the [src]!</b></big>")
msg_admin_attack("[user.name]([user.ckey]) crushes [M.name]'s([M.ckey]) against \the [src]!")
msg_admin_attack("[user.name]([user.ckey]) crushes [M.name]'s([M.ckey]) against \the [src]! - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[M.x];Y=[M.y];Z=[M.z]'>JMP</a>")
return
if(istype(W, /obj/item/weapon/screwdriver))
if(reinf && state >= 1)
+3 -3
View File
@@ -155,12 +155,12 @@
var/obj/item/weapon/grab/G = W
if (istype(G.affecting, /mob/living))
var/mob/living/M = G.affecting
if (G.state < 2)
if(user.a_intent == "hurt")
if(user.a_intent == "hurt")
if (G.state >= 2)
if (prob(15)) M.Weaken(5)
M.apply_damage(8,def_zone = "head")
visible_message("\red [G.assailant] slams [G.affecting]'s face against \the [src]!")
msg_admin_attack("[user.name]([user.ckey]) slams [M.name]'s([M.ckey]) face against \the [src]!")
msg_admin_attack("[user.name]([user.ckey]) slams [M.name]'s([M.ckey]) face against \the [src]! - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[M.x];Y=[M.y];Z=[M.z]'>JMP</a>")
// switch(rand(1,3))
// if(1)
// playsound(src.loc, 'sound/weapons/genhit1.ogg', 50, 1)
@@ -43,12 +43,12 @@
var/obj/item/weapon/grab/G = W
if (istype(G.affecting, /mob/living))
var/mob/living/M = G.affecting
if (G.state < 2)
if(user.a_intent == "hurt")
if(user.a_intent == "hurt")
if (G.state >= 2)
if (prob(15)) M.Weaken(5)
M.apply_damage(16,def_zone = "head")
visible_message("\red [G.assailant] slams [G.affecting]'s face against \the [src]!")
msg_admin_attack("[user.name]([user.ckey]) slams [M.name]'s([M.ckey]) face against \the [src]!")
msg_admin_attack("[user.name]([user.ckey]) slams [M.name]'s([M.ckey]) face against \the [src]! - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[M.x];Y=[M.y];Z=[M.z]'>JMP</a>")
// switch(rand(1,3))
// if(1)
// playsound(src.loc, 'sound/weapons/genhit1.ogg', 50, 1)
+56 -33
View File
@@ -11,11 +11,17 @@ var/global/floorIsLava = 0
if(R_ADMIN & C.holder.rights)
C << msg
/proc/message_mods(var/msg)
msg = "<span class=\"admin\"><span class=\"prefix\">MOD LOG:</span> <span class=\"message\">[msg]</span></span>"
for(var/client/C in admins)
if(R_MOD & C.holder.rights && !(R_ADMIN & C.holder.rights))
C << msg
/proc/msg_admin_attack(var/text) //Toggleable Attack Messages
log_attack(text)
var/rendered = "<span class=\"admin\"><span class=\"prefix\">ATTACK:</span> <span class=\"message\">[text]</span></span>"
for(var/client/C in admins)
if(R_MOD || R_ADMIN & C.holder.rights)
if((R_ADMIN & C.holder.rights) || (R_MOD & C.holder.rights))
if(C.prefs.toggles & CHAT_ATTACKLOGS)
var/msg = rendered
C << msg
@@ -28,9 +34,12 @@ var/global/floorIsLava = 0
set name = "Show Player Panel"
set desc="Edit player (respawn, ban, heal, etc)"
// if(!check_rights(R_ADMIN|R_MOD)) return
if(!M)
usr << "You seem to be selecting a mob that doesn't exist anymore."
return
if (!istype(src,/datum/admins))
src = usr.client.holder
if (!istype(src,/datum/admins))
@@ -51,39 +60,48 @@ var/global/floorIsLava = 0
body += {"
<br><br>\[
<a href='?_src_=vars;Vars=\ref[M]'>VV</a> -
<a href='?src=\ref[src];traitor=\ref[M]'>TP</a> -
<a href='?src=\ref[usr];priv_msg=\ref[M]'>PM</a> -
<a href='?src=\ref[src];subtlemessage=\ref[M]'>SM</a> -
<a href='?src=\ref[src];adminplayerobservejump=\ref[M]'>JMP</a>\] </b><br>
<b>Mob type</b> = [M.type]<br><br>
<A href='?src=\ref[src];boot2=\ref[M]'>Kick</A> |
<A href='?_src_=holder;warn=[M.ckey]'>Warn</A> |
<A href='?src=\ref[src];newban=\ref[M]'>Ban</A> |
<A href='?src=\ref[src];jobban2=\ref[M]'>Jobban</A> |
<A href='?src=\ref[src];notes=show;mob=\ref[M]'>Notes</A>
<a href='?src=\ref[usr];priv_msg=\ref[M]'>PM</a>
"}
if(M.client)
body += "| <A HREF='?src=\ref[src];sendtoprison=\ref[M]'>Prison</A> | "
var/muted = M.client.prefs.muted
body += {"<br><b>Mute: </b>
\[<A href='?src=\ref[src];mute=\ref[M];mute_type=[MUTE_IC]'><font color='[(muted & MUTE_IC)?"red":"blue"]'>IC</font></a> |
<A href='?src=\ref[src];mute=\ref[M];mute_type=[MUTE_OOC]'><font color='[(muted & MUTE_OOC)?"red":"blue"]'>OOC</font></a> |
<A href='?src=\ref[src];mute=\ref[M];mute_type=[MUTE_PRAY]'><font color='[(muted & MUTE_PRAY)?"red":"blue"]'>PRAY</font></a> |
<A href='?src=\ref[src];mute=\ref[M];mute_type=[MUTE_ADMINHELP]'><font color='[(muted & MUTE_ADMINHELP)?"red":"blue"]'>ADMINHELP</font></a> |
<A href='?src=\ref[src];mute=\ref[M];mute_type=[MUTE_DEADCHAT]'><font color='[(muted & MUTE_DEADCHAT)?"red":"blue"]'>DEADCHAT</font></a>\]
(<A href='?src=\ref[src];mute=\ref[M];mute_type=[MUTE_ALL]'><font color='[(muted & MUTE_ALL)?"red":"blue"]'>toggle all</font></a>)
if(check_rights(R_ADMIN|R_MOD))
body += {"
-<a href='?src=\ref[src];traitor=\ref[M]'>TP</a> -
<a href='?src=\ref[src];subtlemessage=\ref[M]'>SM</a> -
<a href='?src=\ref[src];adminplayerobservejump=\ref[M]'>JMP</a>\] </b><br>
<b>Mob type</b> = [M.type]<br><br>
<A href='?src=\ref[src];boot2=\ref[M]'>Kick</A> |
<A href='?_src_=holder;warn=[M.ckey]'>Warn</A> |
<A href='?src=\ref[src];newban=\ref[M]'>Ban</A> |
<A href='?src=\ref[src];jobban2=\ref[M]'>Jobban</A> |
<A href='?src=\ref[src];notes=show;mob=\ref[M]'>Notes</A>
"}
body += {"<br><br>
<A href='?src=\ref[src];jumpto=\ref[M]'><b>Jump to</b></A> |
<A href='?src=\ref[src];getmob=\ref[M]'>Get</A> |
<A href='?src=\ref[src];sendmob=\ref[M]'>Send To</A>
<br><br>
[check_rights(R_ADMIN|R_MOD,0) ? "<A href='?src=\ref[src];traitor=\ref[M]'>Traitor panel</A> | " : "" ]
<A href='?src=\ref[src];narrateto=\ref[M]'>Narrate to</A> |
<A href='?src=\ref[src];subtlemessage=\ref[M]'>Subtle message</A>
"}
if(M.client)
body += "| <A HREF='?src=\ref[src];sendtoprison=\ref[M]'>Prison</A> | "
var/muted = M.client.prefs.muted
body += {"<br><b>Mute: </b>
\[<A href='?src=\ref[src];mute=\ref[M];mute_type=[MUTE_IC]'><font color='[(muted & MUTE_IC)?"red":"blue"]'>IC</font></a> |
<A href='?src=\ref[src];mute=\ref[M];mute_type=[MUTE_OOC]'><font color='[(muted & MUTE_OOC)?"red":"blue"]'>OOC</font></a> |
<A href='?src=\ref[src];mute=\ref[M];mute_type=[MUTE_PRAY]'><font color='[(muted & MUTE_PRAY)?"red":"blue"]'>PRAY</font></a> |
<A href='?src=\ref[src];mute=\ref[M];mute_type=[MUTE_ADMINHELP]'><font color='[(muted & MUTE_ADMINHELP)?"red":"blue"]'>ADMINHELP</font></a> |
<A href='?src=\ref[src];mute=\ref[M];mute_type=[MUTE_DEADCHAT]'><font color='[(muted & MUTE_DEADCHAT)?"red":"blue"]'>DEADCHAT</font></a>\]
(<A href='?src=\ref[src];mute=\ref[M];mute_type=[MUTE_ALL]'><font color='[(muted & MUTE_ALL)?"red":"blue"]'>toggle all</font></a>)
"}
body += {"<br><br>
<A href='?src=\ref[src];jumpto=\ref[M]'><b>Jump to</b></A> |
<A href='?src=\ref[src];getmob=\ref[M]'>Get</A> |
<A href='?src=\ref[src];sendmob=\ref[M]'>Send To</A>
<br><br>
[check_rights(R_ADMIN|R_MOD,0) ? "<A href='?src=\ref[src];traitor=\ref[M]'>Traitor panel</A> | " : "" ]
<A href='?src=\ref[src];narrateto=\ref[M]'>Narrate to</A> |
<A href='?src=\ref[src];subtlemessage=\ref[M]'>Subtle message</A>
"}
else
body += {"
] </b><br>
<b>Mob type</b> = [M.type]<br><br>
"}
if (M.client)
if(!istype(M, /mob/new_player))
@@ -192,11 +210,14 @@ var/global/floorIsLava = 0
/datum/admins/proc/PlayerNotes()
set category = "Admin"
set name = "Player Notes"
if (!istype(src,/datum/admins))
/* if (!istype(src,/datum/admins))
src = usr.client.holder
if (!istype(src,/datum/admins))
usr << "Error: you are not an admin!"
return
*/
if(!check_rights(R_ADMIN|R_MOD))
return
PlayerNotesPage(1)
/datum/admins/proc/PlayerNotesPage(page)
@@ -246,7 +267,6 @@ var/global/floorIsLava = 0
if(!infos || !infos.len) return 0
else return 1
/datum/admins/proc/show_player_info(var/key as text)
set category = "Admin"
set name = "Show Player Info"
@@ -855,11 +875,12 @@ var/global/floorIsLava = 0
set desc="Delay the game start/end"
set name="Delay"
if(!check_rights(R_SERVER|R_DEV)) return
if(!check_rights(R_SERVER|R_DEBUG)) return
if (!ticker || ticker.current_state != GAME_STATE_PREGAME)
ticker.delay_end = !ticker.delay_end
log_admin("[key_name(usr)] [ticker.delay_end ? "delayed the round end" : "has made the round end normally"].")
message_admins("\blue [key_name(usr)] [ticker.delay_end ? "delayed the round end" : "has made the round end normally"].", 1)
message_mods("\blue [key_name(usr)] [ticker.delay_end ? "delayed the round end" : "has made the round end normally"].", 1)
return //alert("Round end delayed", null, null, null, null, null)
going = !( going )
if (!( going ))
@@ -1237,6 +1258,7 @@ proc/move_alien_ship()
log_admin("[key_name(usr)] winded [key_name(M)]!")
message_admins("[key_name_admin(usr)] winded [key_name_admin(M)]!", 1)
message_mods("[key_name_admin(usr)] winded [key_name_admin(M)]!")
// feedback_add_details("admin_verb","WIND") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
// Chop chop.
return
@@ -1249,4 +1271,5 @@ proc/move_alien_ship()
log_admin("[key_name(usr)] unwinded [key_name(M)]!")
message_admins("[key_name_admin(usr)] unwinded [key_name_admin(M)]!", 1)
message_mods("[key_name_admin(usr)] unwinded [key_name_admin(M)]!", 1)
return
+40 -12
View File
@@ -1,17 +1,17 @@
//admin verb groups - They can overlap if you so wish. Only one of each verb will exist in the verbs list regardless
var/list/admin_verbs_default = list(
/datum/admins/proc/show_player_panel, /*shows an interface for individual players, with various links (links require additional flags*/
/client/proc/player_panel,
/client/proc/toggleadminhelpsound, /*toggles whether we hear a sound when adminhelps/PMs are used*/
/client/proc/deadmin_self, /*destroys our own admin datum so we can play as a regular player*/
/client/proc/hide_verbs, /*hides all our adminverbs*/
/client/proc/hide_most_verbs, /*hides all our hideable adminverbs*/
/client/proc/debug_variables, /*allows us to -see- the variables of any instance in the game. +VAREDIT needed to modify*/
/client/proc/check_antagonists, /*shows all antags*/
/client/proc/cmd_mentor_check_new_players
// /client/proc/deadchat /*toggles deadchat on/off*/
)
var/list/admin_verbs_admin = list(
/datum/admins/proc/show_player_panel, /*shows an interface for individual players, with various links (links require additional flags*/
/client/proc/check_antagonists, /*shows all antags*/
/client/proc/alertlevels,
/client/proc/cmd_admin_wind,
/client/proc/cmd_admin_unwind,
@@ -53,11 +53,11 @@ var/list/admin_verbs_admin = list(
/client/proc/check_antagonists,
/client/proc/admin_memo, /*admin memo system. show/delete/write. +SERVER needed to delete admin memos of others*/
/client/proc/dsay, /*talk in deadchat using our ckey/fakekey*/
/client/proc/toggleprayers, /*toggles prayers on/off*/
// /client/proc/toggle_hear_deadcast, /*toggles whether we hear deadchat*/
/client/proc/toggle_hear_radio, /*toggles whether we hear the radio*/
/client/proc/investigate_show, /*various admintools for investigation. Such as a singulo grief-log*/
/client/proc/secrets,
/client/proc/toggleprayers,
/datum/admins/proc/toggleooc, /*toggles ooc on/off for everyone*/
/datum/admins/proc/togglelooc,
/datum/admins/proc/toggleoocdead, /*toggles ooc on/off for everyone who is dead*/
@@ -96,7 +96,7 @@ var/list/admin_verbs_fun = list(
/client/proc/cmd_admin_dress,
/client/proc/cmd_admin_gib_self,
/client/proc/drop_bomb,
/client/proc/everyone_random,
/client/proc/everyone_random,
/client/proc/cinematic,
/client/proc/one_click_antag,
/datum/admins/proc/toggle_aliens,
@@ -105,6 +105,7 @@ var/list/admin_verbs_fun = list(
/client/proc/cmd_admin_add_freeform_ai_law,
/client/proc/cmd_admin_add_random_ai_law,
/client/proc/make_sound,
/client/proc/make_area_sound,
/client/proc/toggle_random_events,
/client/proc/set_ooc,
/client/proc/editappear
@@ -112,8 +113,6 @@ var/list/admin_verbs_fun = list(
var/list/admin_verbs_dev = list(
/client/proc/dsay,
/client/proc/togglebuildmodeself,
/datum/admins/proc/restart,
/datum/admins/proc/delay,
/client/proc/giveruntimelog,
/client/proc/getruntimelog,
/client/proc/cmd_admin_list_open_jobs,
@@ -128,12 +127,11 @@ var/list/admin_verbs_dev = list(
/client/proc/cmd_admin_delete,
/client/proc/cmd_debug_del_all,
/client/proc/cmd_debug_tog_aliens,
/datum/admins/proc/restart,
/client/proc/air_report,
/client/proc/reload_admins,
/client/proc/restart_controller,
/client/proc/enable_debug_verbs,
/client/proc/callproc,
/client/proc/toggleattacklogs,
/client/proc/toggledebuglogs,
/client/proc/SDQL_query,
/client/proc/SDQL2_query,
@@ -168,8 +166,10 @@ var/list/admin_verbs_server = list(
/client/proc/check_customitem_activity
)
var/list/admin_verbs_debug = list(
/client/proc/getruntimelog, /*allows us to access runtime logs to somebody*/
/client/proc/getruntimelog, /*allows us to access runtime logs to somebody*/
/client/proc/cmd_admin_list_open_jobs,
/datum/admins/proc/restart,
/datum/admins/proc/delay,
/client/proc/Debug2,
/client/proc/kill_air,
/client/proc/ZASSettings,
@@ -188,7 +188,6 @@ var/list/admin_verbs_debug = list(
/client/proc/toggledebuglogs,
/client/proc/SDQL_query,
/client/proc/SDQL2_query,
/client/proc/cmd_dev_bst,
/client/proc/cmd_dev_reset_gravity
)
var/list/admin_verbs_possess = list(
@@ -240,6 +239,7 @@ var/list/admin_verbs_hideable = list(
/client/proc/cmd_admin_add_random_ai_law,
/client/proc/cmd_admin_create_centcom_report,
/client/proc/make_sound,
/client/proc/make_area_sound,
/client/proc/toggle_random_events,
/client/proc/cmd_admin_add_random_ai_law,
/client/proc/Set_Holiday,
@@ -274,6 +274,8 @@ var/list/admin_verbs_hideable = list(
/proc/release
)
var/list/admin_verbs_mod = list(
/client/proc/check_antagonists, /*shows all antags*/
/client/proc/cmd_admin_check_contents,
/client/proc/cmd_admin_wind,
/client/proc/cmd_admin_unwind,
/client/proc/cmd_admin_pm_context, /*right-click adminPM interface*/
@@ -281,9 +283,11 @@ var/list/admin_verbs_mod = list(
/client/proc/debug_variables, /*allows us to -see- the variables of any instance in the game.*/
/client/proc/toggleattacklogs,
/client/proc/toggledebuglogs,
/client/proc/toggleprayers,
/datum/admins/proc/PlayerNotes,
/client/proc/admin_ghost, /*allows us to ghost/reenter body at will*/
/client/proc/cmd_mod_say,
/client/proc/check_ai_laws,
/datum/admins/proc/show_player_info,
/client/proc/player_panel_new,
/client/proc/dsay,
@@ -520,7 +524,7 @@ var/list/admin_verbs_mod = list(
#define AUTOBANTIME 10
/client/proc/warn(warned_ckey)
if(!check_rights(R_ADMIN)) return
if(!check_rights(R_ADMIN|R_MOD)) return
if(!warned_ckey || !istext(warned_ckey)) return
if(warned_ckey in admin_datums)
@@ -540,18 +544,22 @@ var/list/admin_verbs_mod = list(
ban_unban_log_save("[ckey] warned [warned_ckey], resulting in a [AUTOBANTIME] minute autoban.")
if(C)
message_admins("[key_name_admin(src)] has warned [key_name_admin(C)] resulting in a [AUTOBANTIME] minute ban.")
message_mods("[key_name_admin(src)] has warned [key_name_admin(C)] resulting in a [AUTOBANTIME] minute ban.")
C << "<font color='red'><BIG><B>You have been autobanned due to a warning by [ckey].</B></BIG><br>This is a temporary ban, it will be removed in [AUTOBANTIME] minutes."
del(C)
else
message_admins("[key_name_admin(src)] has warned [warned_ckey] resulting in a [AUTOBANTIME] minute ban.")
message_mods("[key_name_admin(src)] has warned [warned_ckey] resulting in a [AUTOBANTIME] minute ban.")
AddBan(warned_ckey, D.last_id, "Autobanning due to too many formal warnings", ckey, 1, AUTOBANTIME)
feedback_inc("ban_warn",1)
else
if(C)
C << "<font color='red'><BIG><B>You have been formally warned by an administrator.</B></BIG><br>Further warnings will result in an autoban.</font>"
message_admins("[key_name_admin(src)] has warned [key_name_admin(C)]. They have [MAX_WARNS-D.warns] strikes remaining.")
message_mods("[key_name_admin(src)] has warned [key_name_admin(C)]. They have [MAX_WARNS-D.warns] strikes remaining.")
else
message_admins("[key_name_admin(src)] has warned [warned_ckey] (DC). They have [MAX_WARNS-D.warns] strikes remaining.")
message_mods("[key_name_admin(src)] has warned [warned_ckey] (DC). They have [MAX_WARNS-D.warns] strikes remaining.")
feedback_add_details("admin_verb","WARN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -658,6 +666,23 @@ var/list/admin_verbs_mod = list(
message_admins("\blue [key_name_admin(usr)] made [O] at [O.x], [O.y], [O.z]. make a sound", 1)
feedback_add_details("admin_verb","MS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/make_area_sound(var/turf/T in world) // -- TLE
set category = "Special Verbs"
set name = "Make Area Sound"
set desc = "Display a message to everyone in the area (Experimental)"
if(T)
var/message = input("What do you want the message to be?", "Make Area Sound (Experimental)") as text|null
if(!message)
return
var/area/A = get_area(T)
if(!A == A.master)
A = A.master
for(var/area/SubA in A.related)
for (var/mob/V in SubA)
V.show_message(message, 2)
log_admin("[key_name(usr)] made [A.name] make a sound")
message_admins("\blue [key_name_admin(usr)] made [A.name] make a sound", 1)
feedback_add_details("admin_verb","MAS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/togglebuildmodeself()
set name = "Toggle Build Mode Self"
@@ -797,6 +822,9 @@ var/list/admin_verbs_mod = list(
/client/proc/playernotes()
set name = "Show Player Info"
set category = "Admin"
if(!check_rights(R_ADMIN|R_MOD))
return
if(holder)
holder.PlayerNotes()
return
@@ -926,7 +954,7 @@ var/list/admin_verbs_mod = list(
set desc = "SoundScopes Advanced debug logs, this will create spam for yourself"
if(!check_rights(R_DEV)) return
if(!check_rights(R_MOD)) return
if(!check_rights(R_ADMIN)) return
prefs.toggles ^= CHAT_SCOPES_DEBUG
if (prefs.toggles & CHAT_SCOPES_DEBUG)
+17 -8
View File
@@ -323,7 +323,13 @@
if (!usr.client.holder)
return
var/dat = "<html><head><title>Player Menu</title></head>"
dat += "<body><table border=1 cellspacing=5><B><tr><th>Name</th><th>Real Name</th><th>Assigned Job</th><th>Key</th><th>Options</th><th>PM</th><th>Traitor?</th></tr></B>"
dat += "<body><table border=1 cellspacing=5><B><tr><th>Name</th><th>Real Name</th><th>Assigned Job</th><th>Key</th><th>Options</th><th>PM</th>"
if(check_rights(R_ADMIN|R_MOD, 0))
dat += "<th>Traitor?</th></tr></B>"
else
dat += "<th>View Var's</th></tr></B>"
//add <th>IP:</th> to this if wanting to add back in IP checking
//add <td>(IP: [M.lastKnownIP])</td> if you want to know their ip to the lists below
var/list/mobs = sortmobs()
@@ -364,13 +370,16 @@
<td align=center><A HREF='?src=\ref[src];adminplayeropts=\ref[M]'>X</A></td>
<td align=center><A href='?src=\ref[usr];priv_msg=\ref[M]'>PM</A></td>
"}
switch(is_special_character(M))
if(0)
dat += {"<td align=center><A HREF='?src=\ref[src];traitor=\ref[M]'>Traitor?</A></td>"}
if(1)
dat += {"<td align=center><A HREF='?src=\ref[src];traitor=\ref[M]'><font color=red>Traitor?</font></A></td>"}
if(2)
dat += {"<td align=center><A HREF='?src=\ref[src];traitor=\ref[M]'><font color=red><b>Traitor?</b></font></A></td>"}
if(!check_rights(R_ADMIN|R_MOD, 0))
dat += {"<td align=center><a HREF='?_src_=vars;Vars=\ref[M]'>VV</a></td>"}
else
switch(is_special_character(M))
if(0)
dat += {"<td align=center><A HREF='?src=\ref[src];traitor=\ref[M]'>Traitor?</A></td>"}
if(1)
dat += {"<td align=center><A HREF='?src=\ref[src];traitor=\ref[M]'><font color=red>Traitor?</font></A></td>"}
if(2)
dat += {"<td align=center><A HREF='?src=\ref[src];traitor=\ref[M]'><font color=red><b>Traitor?</b></font></A></td>"}
dat += "</table></body></html>"
+21 -1
View File
@@ -48,6 +48,10 @@
log_admin("[key_name(usr)] has spawned vox raiders.")
if(!src.makeVoxRaiders())
usr << "\red Unfortunately there weren't enough candidates available."
if("12")
log_admin("[key_name(usr)] has spawned a vampire.")
if(!src.makeVampire())
usr << "\red Unfortunately there weren't enough candidates available."
else if(href_list["dbsearchckey"] || href_list["dbsearchadmin"])
var/adminckey = href_list["dbsearchadmin"]
var/playerckey = href_list["dbsearchckey"]
@@ -248,6 +252,7 @@
ticker.delay_end = !ticker.delay_end
log_admin("[key_name(usr)] [ticker.delay_end ? "delayed the round end" : "has made the round end normally"].")
message_admins("\blue [key_name(usr)] [ticker.delay_end ? "delayed the round end" : "has made the round end normally"].", 1)
message_mods("\blue [key_name(usr)] [ticker.delay_end ? "delayed the round end" : "has made the round end normally"].")
href_list["secretsadmin"] = "check_antagonist"
else if(href_list["simplemake"])
@@ -1306,7 +1311,7 @@
check_antagonists()
else if(href_list["adminplayerobservecoodjump"])
if(!check_rights(R_ADMIN)) return
if(!check_rights(R_MOD,0) && !check_rights(R_ADMIN)) return
var/x = text2num(href_list["X"])
var/y = text2num(href_list["Y"])
@@ -1470,6 +1475,20 @@
log_admin("[src.owner] replied to [key_name(H)]'s Syndicate message with the message [input].")
H << "You hear something crackle in your headset for a moment before a voice speaks. \"Please stand by for a message from your benefactor. Message as follows, agent. <b>\"[input]\"</b> Message ends.\""
else if(href_list["CentcommAIReply"])
var/mob/living/silicon/ai/H = locate(href_list["CentcommAIReply"])
if(!istype(H))
usr << "This can only be used on instances of type /mob/living/silicon"
return
var/input = input(src.owner, "Please enter a message to reply to [key_name(H)] via encripted.","Outgoing message from Central Command", "")
if(!input) return
src.owner << "You sent [input] to [H] via a secure channel."
log_admin("[src.owner] replied to [key_name(H)]'s Centcomm message with the message [input].")
message_admins("[src.owner] replied to [key_name(H)]'s Centcom message with: \"[input]\"")
H << "An encripted connection was made and a file was uploaded to your systems. \"Please stand by for a message from Central Command. Message as follows. <b>\"[input]\"</b> Message ends.\""
else if(href_list["CentcommFaxView"])
var/info = locate(href_list["CentcommFaxView"])
@@ -1510,6 +1529,7 @@
src.owner << "Message reply to transmitted successfully."
log_admin("[key_name(src.owner)] replied to a fax message from [key_name(H)]: [input]")
message_admins("[key_name_admin(src.owner)] replied to a fax message from [key_name_admin(H)]", 1)
message_mods("[key_name_admin(src.owner)] replied to a fax message from [key_name_admin(H)]")
else if(href_list["jumpto"])
+4 -2
View File
@@ -33,7 +33,7 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey","
if(!msg) return
var/original_msg = msg
//explode the input msg into a list
var/list/msglist = text2list(msg, " ")
@@ -94,9 +94,11 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey","
msg = "\blue <b><font color=red>HELP: </font>[get_options_bar(mob, 2, 1, 1)][ai_found ? " (<A HREF='?_src_=holder;adminchecklaws=[ref_mob]'>CL</A>)" : ""]:</b> [msg]"
//send this msg to all admins
var/admin_number_present = 0
var/admin_number_afk = 0
for(var/client/X in admins)
if((R_ADMIN|R_MOD) & X.holder.rights)
admin_number_present++
if(X.is_afk())
admin_number_afk++
if(X.prefs.toggles & SOUND_ADMINHELP)
@@ -106,7 +108,7 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey","
//show it to the person adminhelping too
src << "<font color='blue'>PM to-<b>Admins</b>: [original_msg]</font>"
var/admin_number_present = admins.len - admin_number_afk
admin_number_present = (admin_number_present - admin_number_afk)
log_admin("HELP: [key_name(src)]: [original_msg] - heard by [admin_number_present] non-AFK admins.")
if(admin_number_present <= 0)
if(!admin_number_afk)
+6 -2
View File
@@ -7,10 +7,12 @@
Debug2 = 0
message_admins("[key_name(src)] toggled debugging off.")
log_admin("[key_name(src)] toggled debugging off.")
log_debug("[key_name(src)] toggled debugging off.")
else
Debug2 = 1
message_admins("[key_name(src)] toggled debugging on.")
log_admin("[key_name(src)] toggled debugging on.")
log_debug("[key_name(src)] toggled debugging off.")
feedback_add_details("admin_verb","DG2") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -29,7 +31,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
set category = "Debug"
set name = "Advanced ProcCall"
if(!check_rights(R_DEBUG|R_DEV)) return
if(!check_rights(R_DEBUG)) return
spawn(0)
var/target = null
@@ -434,6 +436,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
GLOBAL_RADIO_TYPE = !GLOBAL_RADIO_TYPE // toggle
log_admin("[key_name(src)] has turned the experimental radio system [GLOBAL_RADIO_TYPE ? "on" : "off"].")
message_admins("[key_name_admin(src)] has turned the experimental radio system [GLOBAL_RADIO_TYPE ? "on" : "off"].", 0)
msg_scopes("[key_name_admin(src)] has turned the experimental radio system [GLOBAL_RADIO_TYPE ? "on" : "off"].", 1)
feedback_add_details("admin_verb","SRM") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_admin_areatest()
@@ -1100,11 +1103,12 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
return
/client/proc/startSinglo()
set category = "Debug"
set name = "Start Singularity"
set desc = "Sets up the singularity and all machines to get power flowing through the station"
if(!check_rights(R_DEBUG)) return
if(alert("Are you sure? This will start up the engine. Should only be used during debug!",,"Yes","No") != "Yes")
return
+1 -1
View File
@@ -144,7 +144,7 @@ var/list/debug_verbs = list (
,/client/proc/splash
,/client/proc/cmd_admin_areatest
,/client/proc/cmd_admin_rejuvenate
,/datum/admins/proc/show_traitor_panel
// ,/datum/admins/proc/show_traitor_panel //What has this got to do with mapping
,/client/proc/print_jobban_old
,/client/proc/print_jobban_old_filter
,/client/proc/forceEvent
+2 -1
View File
@@ -372,4 +372,5 @@
A.vars[variable] = O.vars[variable]
log_admin("[key_name(src)] mass modified [original_name]'s [variable] to [O.vars[variable]]")
message_admins("[key_name_admin(src)] mass modified [original_name]'s [variable] to [O.vars[variable]]", 1)
message_admins("[key_name_admin(src)] mass modified [original_name]'s [variable] to [O.vars[variable]]", 1)
msg_scopes("[key_name_admin(src)] mass modified [original_name]'s [variable] to [O.vars[variable]]", 1)//Tell the devs
+7 -1
View File
@@ -264,6 +264,12 @@ var/list/forbidden_varedit_object_types = list(
if("marked datum")
L[L.Find(variable)] = holder.marked_datum
//Runtimes >_< List's are like organised messes.
//This worked the other day.
// world.log << "### VarEdit by [src]: [variable]=[html_encode("[L[L.Find(variable)]]")]"
// log_admin("[key_name(src)] modified [variable] to [L[L.Find(variable)]]")
// message_admins("[key_name_admin(src)] modified [variable] to [L[L.Find(variable)]]", 1)
// msg_scopes("[key_name_admin(src)] modified [variable] to [L[L.Find(variable)]]", 1) // Tell dev's to but not log twice
/client/proc/modify_variables(var/atom/O, var/param_var_name = null, var/autodetect_class = 0)
if(!check_rights(R_VAREDIT|R_DEV)) return
@@ -498,4 +504,4 @@ var/list/forbidden_varedit_object_types = list(
world.log << "### VarEdit by [src]: [O.type] [variable]=[html_encode("[O.vars[variable]]")]"
log_admin("[key_name(src)] modified [original_name]'s [variable] to [O.vars[variable]]")
message_admins("[key_name_admin(src)] modified [original_name]'s [variable] to [O.vars[variable]]", 1)
msg_scopes("[key_name_admin(src)] modified [original_name]'s [variable] to [O.vars[variable]]", 1) // Tell dev's to but not log twice
+37 -4
View File
@@ -18,6 +18,7 @@ client/proc/one_click_antag()
<a href='?src=\ref[src];makeAntag=5'>Make Malf AI</a><br>
<a href='?src=\ref[src];makeAntag=6'>Make Wizard (Requires Ghosts)</a><br>
<a href='?src=\ref[src];makeAntag=11'>Make Vox Raiders (Requires Ghosts)</a><br>
<a href='?src=\ref[src];makeAntag=12'>Make Vampire</a><br>
"}
/* These dont work just yet
Ninja, aliens and deathsquad I have not looked into yet
@@ -100,9 +101,10 @@ client/proc/one_click_antag()
if(!applicant.stat)
if(applicant.mind)
if (!applicant.mind.special_role)
if(!jobban_isbanned(applicant, "changeling") && !jobban_isbanned(applicant, "Syndicate"))
if(!(applicant.job in temp.restricted_jobs))
candidates += applicant
if(applicant.species.name != "Machine")
if(!jobban_isbanned(applicant, "changeling") && !jobban_isbanned(applicant, "Syndicate"))
if(!(applicant.job in temp.restricted_jobs))
candidates += applicant
if(candidates.len)
var/numChanglings = min(candidates.len, 3)
@@ -520,4 +522,35 @@ client/proc/one_click_antag()
ticker.mode.traitors += new_vox.mind
new_vox.equip_vox_raider()
return new_vox
return new_vox
/datum/admins/proc/makeVampire()
var/datum/game_mode/vampire/temp = new
if(config.protect_roles_from_antagonist)
temp.restricted_jobs += temp.protected_jobs
var/list/mob/living/carbon/human/candidates = list()
var/mob/living/carbon/human/H = null
for(var/mob/living/carbon/human/applicant in player_list)
if(applicant.client.prefs.be_special & BE_VAMPIRE)
if(!applicant.stat)
if(applicant.mind)
if (!applicant.mind.special_role)
if(applicant.species.name != "Machine")
if(!jobban_isbanned(applicant, "vampire") && !jobban_isbanned(applicant, "Syndicate"))
if(!(applicant.job in temp.restricted_jobs))
candidates += applicant
if(candidates.len)
var/numVampires = min(candidates.len, 3)
for(var/i = 0, i<numVampires, i++)
H = pick(candidates)
H.mind.make_Vampire()
candidates.Remove(H)
return 1
return 0
+13 -5
View File
@@ -20,19 +20,27 @@
msg = "\blue \icon[cross] <b><font color=purple>PRAY: </font>[key_name(src, 1)] (<A HREF='?_src_=holder;adminmoreinfo=\ref[src]'>?</A>) (<A HREF='?_src_=holder;adminplayeropts=\ref[src]'>PP</A>) (<A HREF='?_src_=vars;Vars=\ref[src]'>VV</A>) (<A HREF='?_src_=holder;subtlemessage=\ref[src]'>SM</A>) (<A HREF='?_src_=holder;adminplayerobservejump=\ref[src]'>JMP</A>) (<A HREF='?_src_=holder;secretsadmin=check_antagonist'>CA</A>) (<A HREF='?_src_=holder;adminspawncookie=\ref[src]'>SC</a>):</b> [msg]"
for(var/client/C in admins)
if(C.prefs.toggles & CHAT_PRAYER)
if(((R_ADMIN & C.holder.rights) || (R_MOD & C.holder.rights)) && (C.prefs.toggles & CHAT_PRAYER))
C << msg
usr << "Your prayers have been received by the gods."
feedback_add_details("admin_verb","PR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
//log_admin("HELP: [key_name(src)]: [msg]")
/proc/Centcomm_announce(var/text , var/mob/Sender , var/iamessage)
//Stealing the second var because why not)
/proc/Centcomm_announce(var/text , var/mob/Sender , var/silicon = 0 , var/iamessage)
var/msg = copytext(sanitize(text), 1, MAX_MESSAGE_LEN)
msg = "\blue <b><font color=orange>CENTCOMM[iamessage ? " IA" : ""]:</font>[key_name(Sender, 1)] (<A HREF='?_src_=holder;adminplayeropts=\ref[Sender]'>PP</A>) (<A HREF='?_src_=vars;Vars=\ref[Sender]'>VV</A>) (<A HREF='?_src_=holder;subtlemessage=\ref[Sender]'>SM</A>) (<A HREF='?_src_=holder;adminplayerobservejump=\ref[Sender]'>JMP</A>) (<A HREF='?_src_=holder;secretsadmin=check_antagonist'>CA</A>) (<A HREF='?_src_=holder;BlueSpaceArtillery=\ref[Sender]'>BSA</A>) (<A HREF='?_src_=holder;CentcommReply=\ref[Sender]'>RPLY</A>):</b> [msg]"
admins << msg
if(silicon)
msg = "\blue <b><font color=orange>CENTCOMM(A.L.I.C.E.):</font>[key_name(Sender, 1)] (<A HREF='?_src_=holder;adminplayeropts=\ref[Sender]'>PP</A>) (<A HREF='?_src_=vars;Vars=\ref[Sender]'>VV</A>) (<A HREF='?_src_=holder;subtlemessage=\ref[Sender]'>SM</A>) (<A HREF='?_src_=holder;adminplayerobservejump=\ref[Sender]'>JMP</A>) (<A HREF='?_src_=holder;secretsadmin=check_antagonist'>CA</A>) (<A HREF='?_src_=holder;BlueSpaceArtillery=\ref[Sender]'>BSA</A>) (<A HREF='?_src_=holder;CentcommAIReply=\ref[Sender]'>RPLY</A>):</b> [msg]"
else
msg = "\blue <b><font color=orange>CENTCOMM[iamessage ? " IA" : ""]:</font>[key_name(Sender, 1)] (<A HREF='?_src_=holder;adminplayeropts=\ref[Sender]'>PP</A>) (<A HREF='?_src_=vars;Vars=\ref[Sender]'>VV</A>) (<A HREF='?_src_=holder;subtlemessage=\ref[Sender]'>SM</A>) (<A HREF='?_src_=holder;adminplayerobservejump=\ref[Sender]'>JMP</A>) (<A HREF='?_src_=holder;secretsadmin=check_antagonist'>CA</A>) (<A HREF='?_src_=holder;BlueSpaceArtillery=\ref[Sender]'>BSA</A>) (<A HREF='?_src_=holder;CentcommReply=\ref[Sender]'>RPLY</A>):</b> [msg]"
for(var/client/C in admins)
if((R_ADMIN & C.holder.rights) || (R_MOD & C.holder.rights))
C << msg
/proc/Syndicate_announce(var/text , var/mob/Sender)
var/msg = copytext(sanitize(text), 1, MAX_MESSAGE_LEN)
msg = "\blue <b><font color=crimson>SYNDICATE:</font>[key_name(Sender, 1)] (<A HREF='?_src_=holder;adminplayeropts=\ref[Sender]'>PP</A>) (<A HREF='?_src_=vars;Vars=\ref[Sender]'>VV</A>) (<A HREF='?_src_=holder;subtlemessage=\ref[Sender]'>SM</A>) (<A HREF='?_src_=holder;adminplayerobservejump=\ref[Sender]'>JMP</A>) (<A HREF='?_src_=holder;secretsadmin=check_antagonist'>CA</A>) (<A HREF='?_src_=holder;BlueSpaceArtillery=\ref[Sender]'>BSA</A>) (<A HREF='?_src_=holder;SyndicateReply=\ref[Sender]'>RPLY</A>):</b> [msg]"
admins << msg
for(var/client/C in admins)
if((R_ADMIN & C.holder.rights) || (R_MOD & C.holder.rights))
C << msg
+2
View File
@@ -993,8 +993,10 @@ Traitors and the like can also be revived with the previous role mostly intact.
config.allow_random_events = 1
usr << "Random events enabled"
message_admins("Admin [key_name_admin(usr)] has enabled random events.", 1)
msg_scopes("Admin [key_name_admin(usr)] has enabled random events.", 0)
else
config.allow_random_events = 0
usr << "Random events disabled"
message_admins("Admin [key_name_admin(usr)] has disabled random events.", 1)
msg_scopes("Admin [key_name_admin(usr)] has disabled random events.", 0)
feedback_add_details("admin_verb","TRE") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+1
View File
@@ -12,6 +12,7 @@
if(newtick && newtick <= 2 && newtick > 0)
log_admin("[key_name(src)] has modified world.tick_lag to [newtick]", 0)
message_admins("[key_name(src)] has modified world.tick_lag to [newtick]", 0)
msg_scopes("[key_name(src)] has modified world.tick_lag to [newtick]", 0)
world.tick_lag = newtick
feedback_add_details("admin_verb","TICKLAG") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+1
View File
@@ -46,6 +46,7 @@
status = 1
bombers += "[key_name(user)] welded a single tank bomb. Temp: [bombtank.air_contents.temperature-T0C]"
message_admins("[key_name_admin(user)] welded a single tank bomb. Temp: [bombtank.air_contents.temperature-T0C]")
message_mods("[key_name_admin(user)] welded a single tank bomb. Temp: [bombtank.air_contents.temperature-T0C]")
user << "<span class='notice'>A pressure hole has been bored to [bombtank] valve. \The [bombtank] can now be ignited.</span>"
else
status = 0
+1
View File
@@ -18,6 +18,7 @@
var/obj/item/weapon/weldingtool/T = W
if(T.welding & prob(50))
message_admins("[key_name_admin(user)] triggered a welderpack explosion at ([loc.x],[loc.y],[loc.z]) - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[src.x];Y=[src.y];Z=[src.z]'>JMP</a>")
message_mods("[key_name_admin(user)] triggered a welderpack explosion at ([loc.x],[loc.y],[loc.z]) - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[src.x];Y=[src.y];Z=[src.z]'>JMP</a>")
log_game("[key_name(user)] triggered a fueltank explosion.")
user << "\red That was stupid of you."
explosion(get_turf(src),-1,0,2)
+8 -2
View File
@@ -54,7 +54,7 @@
return
cmd_admin_irc_pm()
return
//Logs all hrefs
@@ -155,6 +155,12 @@
if(holder)
add_admin_verbs()
admin_memo_show()
if(!ooc_allowed)
src << "<span class='alert'>OOC is Disabled</span>"
if(!looc_allowed)
src << "<span class='alert'>LOOC is Disabled</span>"
if(!dsay_allowed)
src << "<span class='alert'>Deadchat is Disabled</span>"
log_client_to_db()
@@ -255,7 +261,7 @@
//send resources to the client. It's here in its own proc so we can move it around easiliy if need be
/client/proc/send_resources()
// preload_vox() //Causes long delays with initial start window and subsequent windows when first logged in.
getFiles(
'html/search.js',
'html/panels.css',
+12
View File
@@ -1401,6 +1401,17 @@ datum/preferences
else continue
// Wheelchair necessary?
var/datum/organ/external/l_foot = character.get_organ("l_foot")
var/datum/organ/external/r_foot = character.get_organ("r_foot")
if((!l_foot || l_foot.status & ORGAN_DESTROYED) && (!r_foot || r_foot.status & ORGAN_DESTROYED))
var/obj/structure/stool/bed/chair/wheelchair/W = new /obj/structure/stool/bed/chair/wheelchair (character.loc)
character.buckled = W
character.update_canmove()
W.dir = character.dir
W.buckled_mob = character
W.add_fingerprint(character)
if(underwear > underwear_m.len || underwear < 1)
underwear = 0 //I'm sure this is 100% unnecessary, but I'm paranoid... sue me. //HAH NOW NO MORE MAGIC CLONING UNDIES
character.underwear = underwear
@@ -1416,6 +1427,7 @@ datum/preferences
//Debugging report to track down a bug, which randomly assigned the plural gender to people.
if(character.gender in list(PLURAL, NEUTER))
if(isliving(src)) //Ghosts get neuter by default
msg_scopes("[character] ([character.ckey]) has spawned with their gender as plural or neuter.")
message_admins("[character] ([character.ckey]) has spawned with their gender as plural or neuter. Please notify coders.")
character.gender = MALE
+53 -8
View File
@@ -25,7 +25,7 @@ proc/populate_gear_list()
path = /obj/item/weapon/dice/d20
cost = 1
/datum/gear/dice
/datum/gear/wallet
display_name = "wallet"
path = /obj/item/weapon/storage/wallet
cost = 2
@@ -41,6 +41,51 @@ proc/populate_gear_list()
path = /obj/item/weapon/cane
cost = 2
/datum/gear/briefcase
display_name = "briefcase"
path = /obj/item/weapon/storage/briefcase
cost = 2
/datum/gear/securebriefcase
display_name = "secure briefcase"
path = /obj/item/weapon/storage/secure/briefcase
cost = 3
/datum/gear/zippolighter
display_name = "zippo lighter"
path = /obj/item/weapon/lighter/zippo
cost = 1
/datum/gear/recorder
display_name = "universal recorder"
path = /obj/item/device/taperecorder
cost = 2
/datum/gear/camera
display_name = "camera"
path = /obj/item/device/camera
cost = 1
/datum/gear/clipboard
display_name = "clipboard"
path = /obj/item/weapon/clipboard
cost = 1
/datum/gear/redpen
display_name = "red pen"
path = /obj/item/weapon/pen/red
cost = 1
/datum/gear/bluepen
display_name = "blue pen"
path = /obj/item/weapon/pen/blue
cost = 1
/datum/gear/flask
display_name = "flask"
path = /obj/item/weapon/reagent_containers/food/drinks/flask/barflask
cost = 2
/datum/gear/tie_horrible
display_name = "horrible tie"
path = /obj/item/clothing/tie/horrible
@@ -395,12 +440,6 @@ proc/populate_gear_list()
// slot = slot_w_uniform
cost = 3
/datum/gear/exec_suit
display_name = "executive suit"
path = /obj/item/clothing/under/suit_jacket/really_black
// slot = slot_w_uniform
cost = 3
/datum/gear/oldmansuit
display_name = "old man suit"
path = /obj/item/clothing/under/lawyer/oldman
@@ -423,10 +462,16 @@ proc/populate_gear_list()
/datum/gear/armpit
display_name = "shoulder holster"
// path = /obj/item/clothing/tie/holster/armpit
path = /obj/item/clothing/tie/holster/armpit
cost = 3
allowed_roles = list("Captain", "Head of Personnel", "Security Officer", "Head of Security")
/datum/gear/normal_beret
display_name = "beret"
path = /obj/item/clothing/head/beret
cost = 3
/datum/gear/sec_beret
display_name = "security beret"
path = /obj/item/clothing/head/beret/sec
+1
View File
@@ -1,6 +1,7 @@
/obj/item/clothing
name = "clothing"
var/list/species_restricted = null //Only these species can wear this kit.
var/gsr = 0
//BS12: Species-restricted clothing check.
/obj/item/clothing/mob_can_equip(M as mob, slot)
+2 -2
View File
@@ -390,14 +390,14 @@
desc = "A special helmet designed for work in a hazardous, low pressure environment. Has minor radiation shielding."
icon_state = "rig0-medical"
item_state = "medical_helm"
species_restricted = list("tajara")
species_restricted = list("Tajaran")
/obj/item/clothing/head/helmet/space/rig/medical/unathi
name = "medical hardsuit helmet"
desc = "A special helmet designed for work in a hazardous, low pressure environment. Has minor radiation shielding."
icon_state = "rig0-medical"
item_state = "medical_helm"
species_restricted = list("unathi")
species_restricted = list("Unathi")
/obj/item/clothing/head/helmet/space/rig/medical/skrell
name = "medical hardsuit helmet"

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