Merge remote-tracking branch 'upstream/master' into face_lock

# Conflicts:
#	code/modules/mob/mob.dm
This commit is contained in:
tigercat2000
2018-05-17 20:21:39 -07:00
944 changed files with 11247 additions and 15005 deletions
+8 -9
View File
@@ -1,11 +1,11 @@
//Blocks an attempt to connect before even creating our client datum thing.
world/IsBanned(key,address,computer_id)
if(!key || !address || !computer_id)
log_access("Failed Login (invalid data): [key] [address]-[computer_id]")
log_adminwarn("Failed Login (invalid data): [key] [address]-[computer_id]")
return list("reason"="invalid login data", "desc"="Error: Could not check ban status, please try again. Error message: Your computer provided invalid or blank information to the server on connection (BYOND Username, IP, and Computer ID). Provided information for reference: Username: '[key]' IP: '[address]' Computer ID: '[computer_id]'. If you continue to get this error, please restart byond or contact byond support.")
if(text2num(computer_id) == 2147483647) //this cid causes stickybans to go haywire
log_access("Failed Login (invalid cid): [key] [address]-[computer_id]")
log_adminwarn("Failed Login (invalid cid): [key] [address]-[computer_id]")
return list("reason"="invalid login data", "desc"="Error: Could not check ban status, Please try again. Error message: Your computer provided an invalid Computer ID.")
var/admin = 0
var/ckey = ckey(key)
@@ -16,13 +16,13 @@ world/IsBanned(key,address,computer_id)
//Guest Checking
if(!guests_allowed && IsGuestKey(key))
log_access("Failed Login: [key] [computer_id] [address] - Guests not allowed")
log_adminwarn("Failed Login: [key] [computer_id] [address] - Guests not allowed")
// message_admins("<span class='notice'>Failed Login: [key] - Guests not allowed</span>")
return list("reason"="guest", "desc"="\nReason: Guests not allowed. Please sign in with a BYOND account.")
//check if the IP address is a known Tor node
if(config.ToRban && ToRban_isbanned(address))
log_access("Failed Login: [key] [computer_id] [address] - Banned: Tor")
log_adminwarn("Failed Login: [key] [computer_id] [address] - Banned: Tor")
message_admins("<span class='adminnotice'>Failed Login: [key] - Banned: Tor</span>")
//ban their computer_id and ckey for posterity
AddBan(ckey(key), computer_id, "Use of Tor", "Automated Ban", 0, 0)
@@ -41,14 +41,13 @@ world/IsBanned(key,address,computer_id)
message_admins("<span class='adminnotice'>The admin [key] has been allowed to bypass a matching ban on [.["key"]]</span>")
addclientmessage(ckey,"<span class='adminnotice'>You have been allowed to bypass a matching ban on [.["key"]].</span>")
else
log_access("Failed Login: [key] [computer_id] [address] - Banned [.["reason"]]")
log_adminwarn("Failed Login: [key] [computer_id] [address] - Banned [.["reason"]]")
return .
else
var/ckeytext = ckey(key)
if(!establish_db_connection())
log_to_dd("Ban database connection failure. Key [ckeytext] not checked")
diary << "Ban database connection failure. Key [ckeytext] not checked"
log_world("Ban database connection failure. Key [ckeytext] not checked")
return
var/ipquery = ""
@@ -100,7 +99,7 @@ world/IsBanned(key,address,computer_id)
. = list("reason"="[bantype]", "desc"="[desc]")
log_access("Failed Login: [key] [computer_id] [address] - Banned [.["reason"]]")
log_adminwarn("Failed Login: [key] [computer_id] [address] - Banned [.["reason"]]")
return .
. = ..() //default pager ban stuff
@@ -114,6 +113,6 @@ world/IsBanned(key,address,computer_id)
addclientmessage(ckey,"<span class='adminnotice'>You have been allowed to bypass a matching host/sticky ban.</span>")
return null
else
log_access("Failed Login: [key] [computer_id] [address] - Banned [.["message"]]")
log_adminwarn("Failed Login: [key] [computer_id] [address] - Banned [.["message"]]")
return .
+3 -3
View File
@@ -22,7 +22,7 @@
/proc/ToRban_update()
spawn(0)
diary << "Downloading updated ToR data..."
log_world("Downloading updated ToR data...")
var/http[] = world.Export("http://exitlist.torproject.org/exit-addresses")
var/list/rawlist = file2list(http["CONTENT"])
@@ -36,11 +36,11 @@
if(!cleaned) continue
F[cleaned] << 1
to_chat(F["last_update"], world.realtime)
diary << "ToR data updated!"
log_world("ToR data updated!")
if(usr)
to_chat(usr, "ToRban updated.")
return 1
diary << "ToR data update aborted: no data."
log_world("ToR data update aborted: no data.")
return 0
/client/proc/ToRban(task in list("update","toggle","show","remove","remove all","find"))
+3 -5
View File
@@ -4,14 +4,12 @@ var/global/nologevent = 0
////////////////////////////////
/proc/message_admins(var/msg)
msg = "<span class=\"admin\"><span class=\"prefix\">ADMIN LOG:</span> <span class=\"message\">[msg]</span></span>"
log_adminwarn(msg)
for(var/client/C in admins)
if(R_ADMIN & C.holder.rights)
if(C.prefs && !(C.prefs.toggles & CHAT_NO_ADMINLOGS))
to_chat(C, msg)
/proc/msg_admin_attack(var/text) //Toggleable Attack Messages
log_attack(text)
if(!nologevent)
var/rendered = "<span class=\"admin\"><span class=\"prefix\">ATTACK:</span> <span class=\"message\">[text]</span></span>"
for(var/client/C in admins)
@@ -866,13 +864,13 @@ var/global/nologevent = 0
for(var/mob/living/silicon/S in mob_list)
ai_number++
if(isAI(S))
to_chat(usr, "<b>AI [key_name(S, usr)]'s laws:</b>")
to_chat(usr, "<b>AI [key_name(S, TRUE)]'s laws:</b>")
else if(isrobot(S))
var/mob/living/silicon/robot/R = S
to_chat(usr, "<b>CYBORG [key_name(S, usr)]'s [R.connected_ai?"(Slaved to: [R.connected_ai])":"(Independent)"] laws:</b>")
to_chat(usr, "<b>CYBORG [key_name(S, TRUE)]'s [R.connected_ai?"(Slaved to: [R.connected_ai])":"(Independent)"] laws:</b>")
else if(ispAI(S))
var/mob/living/silicon/pai/P = S
to_chat(usr, "<b>pAI [key_name(S, usr)]'s laws:</b>")
to_chat(usr, "<b>pAI [key_name(S, TRUE)]'s laws:</b>")
to_chat(usr, "[P.pai_law0]")
if(P.pai_laws)
to_chat(usr, "[P.pai_laws]")
+2 -2
View File
@@ -40,8 +40,8 @@
if("hrefs") //persistant logs and stuff
if(config && config.log_hrefs)
if(href_logfile)
src << browse(href_logfile,"window=investigate[subject];size=800x300")
if(GLOB.world_href_log)
src << browse(file(GLOB.world_href_log), "window=investigate[subject];size=800x300")
else
to_chat(src, "<font color='red'>Error: admin_investigate: No href logfile found.</font>")
return
+2 -4
View File
@@ -104,8 +104,7 @@ var/list/admin_ranks = list() //list of all ranks with associated rights
establish_db_connection()
if(!dbcon.IsConnected())
log_to_dd("Failed to connect to database in load_admins(). Reverting to legacy system.")
diary << "Failed to connect to database in load_admins(). Reverting to legacy system."
log_world("Failed to connect to database in load_admins(). Reverting to legacy system.")
config.admin_legacy_system = 1
load_admins()
return
@@ -124,8 +123,7 @@ var/list/admin_ranks = list() //list of all ranks with associated rights
//find the client for a ckey if they are connected and associate them with the new admin datum
D.associate(directory[ckey])
if(!admin_datums)
log_to_dd("The database query in load_admins() resulted in no admins being added to the list. Reverting to legacy system.")
diary << "The database query in load_admins() resulted in no admins being added to the list. Reverting to legacy system."
log_world("The database query in load_admins() resulted in no admins being added to the list. Reverting to legacy system.")
config.admin_legacy_system = 1
load_admins()
return
+5 -9
View File
@@ -19,17 +19,13 @@ var/list/admin_verbs_admin = list(
/client/proc/resetcolorooc, /*allows us to set a reset our ooc color*/
/client/proc/admin_ghost, /*allows us to ghost/reenter body at will*/
/client/proc/toggle_view_range, /*changes how far we can see*/
/datum/admins/proc/view_txt_log, /*shows the server log (diary) for today*/
/datum/admins/proc/view_atk_log, /*shows the server combat-log, doesn't do anything presently*/
/client/proc/cmd_admin_pm_context, /*right-click adminPM interface*/
/client/proc/cmd_admin_pm_panel, /*admin-pm list*/
/client/proc/cmd_admin_pm_by_key_panel, /*admin-pm list by key*/
/client/proc/cmd_admin_subtle_message, /*send an message to somebody as a 'voice in their head'*/
/client/proc/cmd_admin_delete, /*delete an instance/object/mob/etc*/
/client/proc/cmd_admin_check_contents, /*displays the contents of an instance*/
/client/proc/giveruntimelog, /*allows us to give access to runtime logs to somebody*/
/client/proc/getruntimelog, /*allows us to access runtime logs to somebody*/
/client/proc/getserverlog, /*allows us to fetch server logs (diary) for other days*/
/client/proc/getserverlogs, /*allows us to fetch server logs (diary) for other days*/
/client/proc/jumptocoord, /*we ghost and jump to a coordinate*/
/client/proc/Getmob, /*teleports a mob to our location*/
/client/proc/Getkey, /*teleports a mob with a certain ckey to our location*/
@@ -830,8 +826,8 @@ var/list/admin_verbs_ticket = list(
if(!istype(H))
if(istype(H, /mob/living/carbon/brain))
var/mob/living/carbon/brain/B = H
if(istype(B.container, /obj/item/device/mmi/posibrain/ipc))
var/obj/item/device/mmi/posibrain/ipc/C = B.container
if(istype(B.container, /obj/item/mmi/posibrain/ipc))
var/obj/item/mmi/posibrain/ipc/C = B.container
var/obj/item/organ/internal/brain/mmi_holder/posibrain/P = C.loc
if(istype(P.owner, /mob/living/carbon/human))
H = P.owner
@@ -856,8 +852,8 @@ var/list/admin_verbs_ticket = list(
if(!istype(H))
if(istype(H, /mob/living/carbon/brain))
var/mob/living/carbon/brain/B = H
if(istype(B.container, /obj/item/device/mmi/posibrain/ipc))
var/obj/item/device/mmi/posibrain/ipc/C = B.container
if(istype(B.container, /obj/item/mmi/posibrain/ipc))
var/obj/item/mmi/posibrain/ipc/C = B.container
var/obj/item/organ/internal/brain/mmi_holder/posibrain/P = C.loc
if(istype(P.owner, /mob/living/carbon/human))
H = P.owner
+1 -2
View File
@@ -52,8 +52,7 @@ DEBUG
log_admin("appearance_keylist was empty")
else
if(!establish_db_connection())
log_to_dd("Database connection failed. Reverting to the legacy ban system.")
diary << "Database connection failed. Reverting to the legacy ban system."
log_world("Database connection failed. Reverting to the legacy ban system.")
config.ban_legacy_system = 1
appearance_loadbanfile()
return
+1 -2
View File
@@ -78,8 +78,7 @@ DEBUG
log_runtime(EXCEPTION("Skipping malformed job ban: [s]"))
else
if(!establish_db_connection())
log_to_dd("Database connection failed. Reverting to the legacy ban system.")
diary << "Database connection failed. Reverting to the legacy ban system."
log_world("Database connection failed. Reverting to the legacy ban system.")
config.ban_legacy_system = 1
jobban_loadbanfile()
return
+1 -1
View File
@@ -1,5 +1,5 @@
var/create_object_html = null
var/list/create_object_forms = list(/obj, /obj/structure, /obj/machinery, /obj/effect, /obj/item, /obj/mecha, /obj/item, /obj/item/clothing, /obj/item/stack, /obj/item/device, /obj/item/reagent_containers, /obj/item/gun)
var/list/create_object_forms = list(/obj, /obj/structure, /obj/machinery, /obj/effect, /obj/item, /obj/mecha, /obj/item/clothing, /obj/item/stack, /obj/item/reagent_containers, /obj/item/gun)
/datum/admins/proc/create_object(var/mob/user)
if(!create_object_html)
+7 -7
View File
@@ -1679,7 +1679,7 @@
if(!istype(H))
to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human")
return
if(!istype(H.l_ear, /obj/item/device/radio/headset) && !istype(H.r_ear, /obj/item/device/radio/headset))
if(!istype(H.l_ear, /obj/item/radio/headset) && !istype(H.r_ear, /obj/item/radio/headset))
to_chat(usr, "The person you are trying to contact is not wearing a headset")
return
@@ -1734,7 +1734,7 @@
P.update_icon()
//fax.receivefax(P) // this does not work, it does not preserve the type, we have to physically teleport the fax paper instead
P.loc = fax.loc
if(istype(H) && H.stat == CONSCIOUS && (istype(H.l_ear, /obj/item/device/radio/headset) || istype(H.r_ear, /obj/item/device/radio/headset)))
if(istype(H) && H.stat == CONSCIOUS && (istype(H.l_ear, /obj/item/radio/headset) || istype(H.r_ear, /obj/item/radio/headset)))
to_chat(H, "Your headset pings, notifying you that a reply to your fax has arrived.")
to_chat(src.owner, "You sent a [eviltype] fax to [H]")
log_admin("[key_name(src.owner)] sent [key_name(H)] a [eviltype] fax")
@@ -2026,7 +2026,7 @@
P.stamps += "<HR><img src=large_stamp-[stampvalue].png>"
P.update_icon()
fax.receivefax(P)
if(istype(H) && H.stat == CONSCIOUS && (istype(H.l_ear, /obj/item/device/radio/headset) || istype(H.r_ear, /obj/item/device/radio/headset)))
if(istype(H) && H.stat == CONSCIOUS && (istype(H.l_ear, /obj/item/radio/headset) || istype(H.r_ear, /obj/item/radio/headset)))
to_chat(H, "Your headset pings, notifying you that a reply to your fax has arrived.")
to_chat(src.owner, "You sent a standard '[stype]' fax to [H]")
log_admin("[key_name(src.owner)] sent [key_name(H)] a standard '[stype]' fax")
@@ -2042,7 +2042,7 @@
if(H.stat != 0)
to_chat(usr, "The person you are trying to contact is not conscious.")
return
if(!istype(H.l_ear, /obj/item/device/radio/headset) && !istype(H.r_ear, /obj/item/device/radio/headset))
if(!istype(H.l_ear, /obj/item/radio/headset) && !istype(H.r_ear, /obj/item/radio/headset))
to_chat(usr, "The person you are trying to contact is not wearing a headset")
return
var/input = input(src.owner, "Please enter a message to reply to [key_name(H)] via their headset.","Outgoing message from The Syndicate", "")
@@ -2057,7 +2057,7 @@
if(!istype(H))
to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human")
return
if(!istype(H.l_ear, /obj/item/device/radio/headset) && !istype(H.r_ear, /obj/item/device/radio/headset))
if(!istype(H.l_ear, /obj/item/radio/headset) && !istype(H.r_ear, /obj/item/radio/headset))
to_chat(usr, "The person you are trying to contact is not wearing a headset")
return
@@ -2080,7 +2080,7 @@
if(H.stat != 0)
to_chat(usr, "The person you are trying to contact is not conscious.")
return
if(!istype(H.l_ear, /obj/item/device/radio/headset) && !istype(H.r_ear, /obj/item/device/radio/headset))
if(!istype(H.l_ear, /obj/item/radio/headset) && !istype(H.r_ear, /obj/item/radio/headset))
to_chat(usr, "The person you are trying to contact is not wearing a headset")
return
@@ -2274,7 +2274,7 @@
to_chat(src.owner, "<span class='notice'>Message transmitted successfully.</span>")
if(notify == "Yes")
var/mob/living/carbon/human/H = sender
if(istype(H) && H.stat == CONSCIOUS && (istype(H.l_ear, /obj/item/device/radio/headset) || istype(H.r_ear, /obj/item/device/radio/headset)))
if(istype(H) && H.stat == CONSCIOUS && (istype(H.l_ear, /obj/item/radio/headset) || istype(H.r_ear, /obj/item/radio/headset)))
to_chat(sender, "Your headset pings, notifying you that a reply to your fax has arrived.")
if(sender)
log_admin("[key_name(src.owner)] replied to a fax message from [key_name(sender)]: [input]")
+2 -2
View File
@@ -109,7 +109,7 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey","
switch(selected_type)
if("Mentorhelp")
msg = "<span class='mentorhelp'>[selected_type]: </span><span class='boldnotice'>[key_name(src, 1, 1, selected_type)] (<A HREF='?_src_=holder;adminmoreinfo=[ref_mob]'>?</A>) (<A HREF='?_src_=holder;adminplayeropts=[ref_mob]'>PP</A>) (<A HREF='?_src_=vars;Vars=[mob.UID()]'>VV</A>) (<A HREF='?_src_=holder;subtlemessage=[ref_mob]'>SM</A>) ([admin_jump_link(mob)]) (<A HREF='?_src_=holder;check_antagonist=1'>CA</A>) (<A HREF='?_src_=holder;rejectadminhelp=[ref_client]'>REJT</A>) [ai_found ? " (<A HREF='?_src_=holder;adminchecklaws=[ref_mob]'>CL</A>)" : ""] (<A HREF='?_src_=holder;take_question=[mob.UID()];is_mhelp=1'>TAKE</A>) :</span> <span class='mentorhelp'>[msg]</span>"
msg = "<span class='mentorhelp'>[selected_type]: </span><span class='boldnotice'>[key_name(src, TRUE, selected_type)] (<A HREF='?_src_=holder;adminmoreinfo=[ref_mob]'>?</A>) (<A HREF='?_src_=holder;adminplayeropts=[ref_mob]'>PP</A>) (<A HREF='?_src_=vars;Vars=[mob.UID()]'>VV</A>) (<A HREF='?_src_=holder;subtlemessage=[ref_mob]'>SM</A>) ([admin_jump_link(mob)]) (<A HREF='?_src_=holder;check_antagonist=1'>CA</A>) (<A HREF='?_src_=holder;rejectadminhelp=[ref_client]'>REJT</A>) [ai_found ? " (<A HREF='?_src_=holder;adminchecklaws=[ref_mob]'>CL</A>)" : ""] (<A HREF='?_src_=holder;take_question=[mob.UID()];is_mhelp=1'>TAKE</A>) :</span> <span class='mentorhelp'>[msg]</span>"
for(var/client/X in mentorholders + modholders + adminholders)
if(X.prefs.sound & SOUND_ADMINHELP)
X << 'sound/effects/adminhelp.ogg'
@@ -123,7 +123,7 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey","
T.addResponse(usr.client, msg)
else
ticketNum = globAdminTicketHolder.getTicketCounter() // ticketNum is the ticket ready to be assigned.
msg = "<span class='adminhelp'>[selected_type]: </span><span class='boldnotice'>[key_name(src, 1, 1, selected_type)] (<A HREF='?_src_=holder;adminmoreinfo=[ref_mob]'>?</A>) (<A HREF='?_src_=holder;adminplayeropts=[ref_mob]'>PP</A>) (<A HREF='?_src_=vars;Vars=[mob.UID()]'>VV</A>) (<A HREF='?_src_=holder;subtlemessage=[ref_mob]'>SM</A>) ([admin_jump_link(mob)]) (<A HREF='?_src_=holder;check_antagonist=1'>CA</A>) (<A HREF='?_src_=holder;openadminticket=[ticketNum]'>TICKET</A>) [ai_found ? " (<A HREF='?_src_=holder;adminchecklaws=[ref_mob]'>CL</A>)" : ""](<A HREF='?_src_=holder;take_question=[mob.UID()]'>TAKE</A>) :</span> <span class='adminhelp'>[msg]</span>"
msg = "<span class='adminhelp'>[selected_type]: </span><span class='boldnotice'>[key_name(src, TRUE, selected_type)] (<A HREF='?_src_=holder;adminmoreinfo=[ref_mob]'>?</A>) (<A HREF='?_src_=holder;adminplayeropts=[ref_mob]'>PP</A>) (<A HREF='?_src_=vars;Vars=[mob.UID()]'>VV</A>) (<A HREF='?_src_=holder;subtlemessage=[ref_mob]'>SM</A>) ([admin_jump_link(mob)]) (<A HREF='?_src_=holder;check_antagonist=1'>CA</A>) (<A HREF='?_src_=holder;openadminticket=[ticketNum]'>TICKET</A>) [ai_found ? " (<A HREF='?_src_=holder;adminchecklaws=[ref_mob]'>CL</A>)" : ""](<A HREF='?_src_=holder;take_question=[mob.UID()]'>TAKE</A>) :</span> <span class='adminhelp'>[msg]</span>"
//Open a new adminticket and inform the user.
globAdminTicketHolder.newTicket(src, prunedmsg, msg)
for(var/client/X in modholders + adminholders)
+7 -7
View File
@@ -88,7 +88,7 @@
//get message text, limit it's length.and clean/escape html
if(!msg)
msg = input(src,"Message:", "Private message to [key_name(C, 0, 0)]") as text|null
msg = input(src,"Message:", "Private message to [holder ? key_name(C, FALSE) : key_name_hidden(C, FALSE)]") as text|null
if(!msg)
return
@@ -152,9 +152,9 @@
var/emoji_msg = "<span class='emoji_enabled'>[msg]</span>"
recieve_message = "<span class='[recieve_span]'>[type] from-<b>[recieve_pm_type][key_name(src, C, C.holder ? 1 : 0, type)]</b>: [emoji_msg]</span>"
recieve_message = "<span class='[recieve_span]'>[type] from-<b>[recieve_pm_type][C.holder ? key_name(src, TRUE, type) : key_name_hidden(src, TRUE, type)]</b>: [emoji_msg]</span>"
to_chat(C, recieve_message)
to_chat(src, "<font color='blue'>[send_pm_type][type] to-<b>[key_name(C, src, holder ? 1 : 0, type)]</b>: [emoji_msg]</font>")
to_chat(src, "<font color='blue'>[send_pm_type][type] to-<b>[holder ? key_name(C, TRUE, type) : key_name_hidden(C, TRUE, type)]</b>: [emoji_msg]</font>")
/*if(holder && !C.holder)
C.last_pm_recieved = world.time
@@ -175,13 +175,13 @@
switch(type)
if("Mentorhelp")
if(check_rights(R_ADMIN|R_MOD|R_MENTOR, 0, X.mob))
to_chat(X, "<span class='mentorhelp'>[type]: [key_name(src, X, 0, type)]-&gt;[key_name(C, X, 0, type)]: [emoji_msg]</span>")
to_chat(X, "<span class='mentorhelp'>[type]: [key_name(src, TRUE, type)]-&gt;[key_name(C, TRUE, type)]: [emoji_msg]</span>")
if("Adminhelp")
if(check_rights(R_ADMIN|R_MOD, 0, X.mob))
to_chat(X, "<span class='adminhelp'>[type]: [key_name(src, X, 0, type)]-&gt;[key_name(C, X, 0, type)]: [emoji_msg]</span>")
to_chat(X, "<span class='adminhelp'>[type]: [key_name(src, TRUE, type)]-&gt;[key_name(C, TRUE, type)]: [emoji_msg]</span>")
else
if(check_rights(R_ADMIN|R_MOD, 0, X.mob))
to_chat(X, "<span class='boldnotice'>[type]: [key_name(src, X, 0, type)]-&gt;[key_name(C, X, 0, type)]: [emoji_msg]</span>")
to_chat(X, "<span class='boldnotice'>[type]: [key_name(src, TRUE, type)]-&gt;[key_name(C, TRUE, type)]: [emoji_msg]</span>")
//Check if the mob being PM'd has any open admin tickets.
var/tickets = list()
@@ -226,4 +226,4 @@
if(X == src)
continue
if(check_rights(R_ADMIN|R_MOD|R_MENTOR, 0, X.mob))
to_chat(X, "<B><font color='blue'>PM: [key_name(src, X, 0)]-&gt;IRC-Admins:</B> <span class='notice'>[msg]</span></font>")
to_chat(X, "<B><font color='blue'>PM: [key_name(src, TRUE, 0)]-&gt;IRC-Admins:</B> <span class='notice'>[msg]</span></font>")
+2 -2
View File
@@ -7,7 +7,7 @@
msg = sanitize(copytext(msg, 1, MAX_MESSAGE_LEN))
if(!msg) return
log_admin("[key_name(src)] : [msg]")
log_adminsay(msg, src)
if(check_rights(R_ADMIN,0))
for(var/client/C in admins)
@@ -25,7 +25,7 @@
return
msg = sanitize(copytext(msg, 1, MAX_MESSAGE_LEN))
log_admin("MENTOR: [key_name(src)] : [msg]")
log_mentorsay(msg, src)
if(!msg)
return
+1 -1
View File
@@ -17,4 +17,4 @@
to_chat(M, "<font color='#960018'><span class='ooc'><span class='prefix'>AOOC:</span> <EM>[display_name]:</EM> <span class='message'>[msg]</span></span></font>")
log_ooc("(ANTAG) [key] : [msg]")
log_aooc(msg, src)
+1 -1
View File
@@ -51,7 +51,7 @@
return
feedback_add_details("admin_verb","CPOW") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
for(var/datum/powernet/PN in powernets)
for(var/datum/powernet/PN in SSmachines.powernets)
if(!PN.nodes || !PN.nodes.len)
if(PN.cables && (PN.cables.len > 1))
var/obj/structure/cable/C = PN.cables[1]
+5 -5
View File
@@ -269,7 +269,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
var/confirm = input("[choice.key] isn't ghosting right now. Are you sure you want to yank him out of them out of their body and place them in this pAI?", "Spawn pAI Confirmation", "No") in list("Yes", "No")
if(confirm != "Yes")
return 0
var/obj/item/device/paicard/card = new(T)
var/obj/item/paicard/card = new(T)
var/mob/living/silicon/pai/pai = new(card)
pai.name = input(choice, "Enter your pAI name:", "pAI Name", "Personal AI") as text
pai.real_name = pai.name
@@ -387,7 +387,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
if(!check_rights(R_DEBUG))
return
makepowernets()
SSmachines.makepowernets()
log_admin("[key_name(src)] has remade the powernet. makepowernets() called.")
message_admins("[key_name_admin(src)] has remade the powernets. makepowernets() called.", 0)
feedback_add_details("admin_verb","MPWN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -406,8 +406,8 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
var/mob/living/carbon/human/H = M
if(H.wear_id)
var/obj/item/card/id/id = H.wear_id
if(istype(H.wear_id, /obj/item/device/pda))
var/obj/item/device/pda/pda = H.wear_id
if(istype(H.wear_id, /obj/item/pda))
var/obj/item/pda/pda = H.wear_id
id = pda.id
id.icon_state = "gold"
id:access = get_all_accesses()+get_all_centcom_access()+get_all_syndicate_access()
@@ -507,7 +507,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
continue
areas_with_LS |= A.type
for(var/obj/item/device/radio/intercom/I in world)
for(var/obj/item/radio/intercom/I in world)
var/area/A = get_area(I)
if(!A)
continue
+1 -1
View File
@@ -118,7 +118,7 @@ var/global/list/frozen_mob_list = list()
M.addVerb(/obj/mecha/verb/eject)
to_chat(M.occupant, "<b><font color= red>You have been unfrozen by <a href='?priv_msg=\ref[usr.client]'>[key]</a></b></font>")
message_admins("<span class='notice'>[key_name_admin(usr)] unfroze [key_name(M.occupant)] in a [M.name]</span>")
log_admin("[key_name(usr)] unfroze [M.occupant.name]/[M.occupant.ckey] in a [M.name]")
log_admin("[key_name(usr)] unfroze [key_name(M.occupant)] in a [M.name]")
else
message_admins("<span class='notice'>[key_name_admin(usr)] unfroze an empty [M.name]</span>")
log_admin("[key_name(usr)] unfroze an empty [M.name]")
+15 -90
View File
@@ -14,56 +14,11 @@
*/
//This proc allows Game Masters to grant a client access to the .getruntimelog verb
//Permissions expire at the end of each round.
//Runtimes can be used to meta or spot game-crashing exploits so it's advised to only grant coders that
//you trust access. Also, it may be wise to ensure that they are not going to play in the current round.
/client/proc/giveruntimelog()
set name = ".giveruntimelog"
set desc = "Give somebody access to any session logfiles saved to the /log/runtime/ folder."
set category = null
if(!src.holder)
to_chat(src, "<font color='red'>Only Admins may use this command.</font>")
return
var/client/target = input(src,"Choose somebody to grant access to the server's runtime logs (permissions expire at the end of each round):","Grant Permissions",null) as null|anything in clients
if(!istype(target,/client))
to_chat(src, "<font color='red'>Error: giveruntimelog(): Client not found.</font>")
return
target.verbs |= /client/proc/getruntimelog
to_chat(target, "<font color='red'>You have been granted access to runtime logs. Please use them responsibly or risk being banned.</font>")
return
//This proc allows download of runtime logs saved within the data/logs/ folder by dreamdeamon.
//It works similarly to show-server-log.
/client/proc/getruntimelog()
set name = ".getruntimelog"
set desc = "Retrieve any session logfiles saved by dreamdeamon."
set category = null
var/path = browse_files("data/logs/runtime/")
if(!path)
return
if(file_spam_check())
return
message_admins("[key_name_admin(src)] accessed file: [path]")
src << ftp(file(path))
to_chat(src, "Attempting to send file, this may take a fair few minutes if the file is very large.")
return
//This proc allows download of past server logs saved within the data/logs/ folder.
//It works similarly to show-server-log.
/client/proc/getserverlog()
set name = ".getserverlog"
set desc = "Fetch logfiles from data/logs"
set category = null
/client/proc/getserverlogs()
set name = "Get Server Logs"
set desc = "View/retrieve logfiles."
set category = "Admin"
var/path = browse_files("data/logs/")
if(!path)
@@ -73,44 +28,14 @@
return
message_admins("[key_name_admin(src)] accessed file: [path]")
src << ftp(file(path))
to_chat(src, "Attempting to send file, this may take a fair few minutes if the file is very large.")
return
//Other log stuff put here for the sake of organisation
//Shows today's server log
/datum/admins/proc/view_txt_log()
set category = "Admin"
set name = "Show Server Log"
set desc = "Shows today's server log."
var/path = "data/logs/[time2text(world.realtime,"YYYY/MM-Month/DD-Day")].log"
if( fexists(path) )
src << ftp(file(path))
else
to_chat(src, "<font color='red'>Error: view_txt_log(): File not found/Invalid path([path]).</font>")
return
feedback_add_details("admin_verb","VTL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
return
//Shows today's attack log
/datum/admins/proc/view_atk_log()
set category = "Admin"
set name = "Show Server Attack Log"
set desc = "Shows today's server attack log."
var/path = "data/logs/[time2text(world.realtime,"YYYY/MM-Month/DD-Day")] Attack.log"
if( fexists(path) )
src << ftp(file(path))
else
to_chat(src, "<font color='red'>Error: view_atk_log(): File not found/Invalid path([path]).</font>")
return
usr << run(file(path))
feedback_add_details("admin_verb","SSAL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
return
switch(alert("View (in game), Open (in your system's text editor), or Download?", path, "View", "Open", "Download"))
if ("View")
src << browse("<pre style='word-wrap: break-word;'>[html_encode(file2text(file(path)))]</pre>", list2params(list("window" = "viewfile.[path]")))
if ("Open")
src << run(file(path))
if ("Download")
src << ftp(file(path))
else
return
to_chat(src, "Attempting to send [path], this may take a fair few minutes if the file is very large.")
return
+1 -1
View File
@@ -70,7 +70,7 @@
H.dna.ready_dna(H)
H.mind_initialize()
H.mind.assigned_role = "MODE"
H.mind.assigned_role = "Event Character"
H.mind.special_role = "Event Character"
H.key = thisplayer.key
+3 -3
View File
@@ -91,7 +91,7 @@ var/global/sent_honksquad = 0
//Creates mind stuff.
new_honksquad.mind_initialize()
new_honksquad.mind.assigned_role = "MODE"
new_honksquad.mind.assigned_role = SPECIAL_ROLE_HONKSQUAD
new_honksquad.mind.special_role = SPECIAL_ROLE_HONKSQUAD
new_honksquad.add_language("Clownish")
ticker.mode.traitors |= new_honksquad.mind//Adds them to current traitor list. Which is really the extra antagonist list.
@@ -100,7 +100,7 @@ var/global/sent_honksquad = 0
/mob/living/carbon/human/proc/equip_honksquad(honk_leader_selected = 0)
var/obj/item/device/radio/R = new /obj/item/device/radio/headset(src)
var/obj/item/radio/R = new /obj/item/radio/headset(src)
R.set_frequency(1442)
equip_to_slot_or_del(R, slot_l_ear)
equip_to_slot_or_del(new /obj/item/storage/backpack/clown(src), slot_back)
@@ -112,7 +112,7 @@ var/global/sent_honksquad = 0
equip_to_slot_or_del(new /obj/item/clothing/under/rank/clown(src), slot_w_uniform)
equip_to_slot_or_del(new /obj/item/clothing/mask/gas/clown_hat(src), slot_wear_mask)
equip_to_slot_or_del(new /obj/item/clothing/shoes/clown_shoes(src), slot_shoes)
equip_to_slot_or_del(new /obj/item/device/pda/clown(src), slot_wear_pda)
equip_to_slot_or_del(new /obj/item/pda/clown(src), slot_wear_pda)
equip_to_slot_or_del(new /obj/item/clothing/mask/gas/clown_hat(src), slot_wear_mask)
equip_to_slot_or_del(new /obj/item/reagent_containers/food/snacks/grown/banana(src), slot_in_backpack)
equip_to_slot_or_del(new /obj/item/bikehorn(src), slot_in_backpack)
@@ -149,7 +149,7 @@ var/global/sent_syndicate_infiltration_team = 0
//Creates mind stuff.
new_syndicate_infiltrator.mind_initialize()
new_syndicate_infiltrator.mind.assigned_role = "MODE"
new_syndicate_infiltrator.mind.assigned_role = "Syndicate Infiltrator"
new_syndicate_infiltrator.mind.special_role = "Syndicate Infiltrator"
ticker.mode.traitors |= new_syndicate_infiltrator.mind //Adds them to extra antag list
new_syndicate_infiltrator.equip_syndicate_infiltrator(syndicate_leader_selected, uplink_tc, is_mgmt)
@@ -163,7 +163,7 @@ var/global/sent_syndicate_infiltration_team = 0
equip_to_slot_or_del(new /obj/item/storage/box/survival(src), slot_in_backpack)
equip_to_slot_or_del(new /obj/item/clothing/under/chameleon(src), slot_w_uniform)
if(!flag_mgmt)
equip_to_slot_or_del(new /obj/item/device/flashlight(src), slot_in_backpack)
equip_to_slot_or_del(new /obj/item/flashlight(src), slot_in_backpack)
equip_to_slot_or_del(new /obj/item/storage/belt/utility/full/multitool(src), slot_belt)
var/obj/item/clothing/gloves/combat/G = new /obj/item/clothing/gloves/combat(src)
@@ -183,10 +183,10 @@ var/global/sent_syndicate_infiltration_team = 0
D.implant(src)
// Radio & PDA
var/obj/item/device/radio/R = new /obj/item/device/radio/headset/syndicate/syndteam(src)
var/obj/item/radio/R = new /obj/item/radio/headset/syndicate/syndteam(src)
R.set_frequency(SYNDTEAM_FREQ)
equip_to_slot_or_del(R, slot_l_ear)
equip_or_collect(new /obj/item/device/pda(src), slot_in_backpack)
equip_or_collect(new /obj/item/pda(src), slot_in_backpack)
// Other gear
equip_to_slot_or_del(new /obj/item/clothing/shoes/syndigaloshes(src), slot_shoes)
+1 -1
View File
@@ -118,7 +118,7 @@ var/intercom_range_display_status = 0
qdel(M)
if(intercom_range_display_status)
for(var/obj/item/device/radio/intercom/I in world)
for(var/obj/item/radio/intercom/I in world)
for(var/turf/T in orange(7,I))
var/obj/effect/debugging/marker/F = new/obj/effect/debugging/marker(T)
if(!(F in view(7,I.loc)))
+1 -1
View File
@@ -201,7 +201,7 @@
if(rejected)
to_chat(src, "[rejected] out of [count] objects rejected your edit")
log_to_dd("### MassVarEdit by [src]: [O.type] (A/R [accepted]/[rejected]) [variable]=[html_encode("[O.vars[variable]]")]([list2params(value)])")
log_world("### MassVarEdit by [src]: [O.type] (A/R [accepted]/[rejected]) [variable]=[html_encode("[O.vars[variable]]")]([list2params(value)])")
log_admin("[key_name(src)] mass modified [original_name]'s [variable] to [O.vars[variable]] ([accepted] objects modified)")
message_admins("[key_name_admin(src)] mass modified [original_name]'s [variable] to [O.vars[variable]] ([accepted] objects modified)")
+7 -7
View File
@@ -342,7 +342,7 @@ var/list/VVpixelmovement = list("step_x", "step_y", "step_size", "bound_height",
if(!O.vv_edit_var(objectvar, L))
to_chat(src, "Your edit was rejected by the object.")
return
log_to_dd("### ListVarEdit by [src]: [(O ? O.type : "/list")] [objectvar]: ADDED=[var_value]")
log_world("### ListVarEdit by [src]: [(O ? O.type : "/list")] [objectvar]: ADDED=[var_value]")
log_admin("[key_name(src)] modified [original_name]'s [objectvar]: ADDED=[var_value]")
message_admins("[key_name_admin(src)] modified [original_name]'s [objectvar]: ADDED=[var_value]")
@@ -385,7 +385,7 @@ var/list/VVpixelmovement = list("step_x", "step_y", "step_size", "bound_height",
if(!O.vv_edit_var(objectvar, L))
to_chat(src, "Your edit was rejected by the object.")
return
log_to_dd("### ListVarEdit by [src]: [O.type] [objectvar]: CLEAR NULLS")
log_world("### ListVarEdit by [src]: [O.type] [objectvar]: CLEAR NULLS")
log_admin("[key_name(src)] modified [original_name]'s [objectvar]: CLEAR NULLS")
message_admins("[key_name_admin(src)] modified [original_name]'s list [objectvar]: CLEAR NULLS")
return
@@ -395,7 +395,7 @@ var/list/VVpixelmovement = list("step_x", "step_y", "step_size", "bound_height",
if(!O.vv_edit_var(objectvar, L))
to_chat(src, "Your edit was rejected by the object.")
return
log_to_dd("### ListVarEdit by [src]: [O.type] [objectvar]: CLEAR DUPES")
log_world("### ListVarEdit by [src]: [O.type] [objectvar]: CLEAR DUPES")
log_admin("[key_name(src)] modified [original_name]'s [objectvar]: CLEAR DUPES")
message_admins("[key_name_admin(src)] modified [original_name]'s list [objectvar]: CLEAR DUPES")
return
@@ -405,7 +405,7 @@ var/list/VVpixelmovement = list("step_x", "step_y", "step_size", "bound_height",
if(!O.vv_edit_var(objectvar, L))
to_chat(src, "Your edit was rejected by the object.")
return
log_to_dd("### ListVarEdit by [src]: [O.type] [objectvar]: SHUFFLE")
log_world("### ListVarEdit by [src]: [O.type] [objectvar]: SHUFFLE")
log_admin("[key_name(src)] modified [original_name]'s [objectvar]: SHUFFLE")
message_admins("[key_name_admin(src)] modified [original_name]'s list [objectvar]: SHUFFLE")
return
@@ -482,7 +482,7 @@ var/list/VVpixelmovement = list("step_x", "step_y", "step_size", "bound_height",
if(!O.vv_edit_var(objectvar, L))
to_chat(src, "Your edit was rejected by the object.")
return
log_to_dd("### ListVarEdit by [src]: [O.type] [objectvar]: REMOVED=[html_encode("[original_var]")]")
log_world("### ListVarEdit by [src]: [O.type] [objectvar]: REMOVED=[html_encode("[original_var]")]")
log_admin("[key_name(src)] modified [original_name]'s [objectvar]: REMOVED=[original_var]")
message_admins("[key_name_admin(src)] modified [original_name]'s [objectvar]: REMOVED=[original_var]")
return
@@ -501,7 +501,7 @@ var/list/VVpixelmovement = list("step_x", "step_y", "step_size", "bound_height",
if(!O.vv_edit_var(objectvar, L))
to_chat(src, "Your edit was rejected by the object.")
return
log_to_dd("### ListVarEdit by [src]: [(O ? O.type : "/list")] [objectvar]: [original_var]=[new_var]")
log_world("### ListVarEdit by [src]: [(O ? O.type : "/list")] [objectvar]: [original_var]=[new_var]")
log_admin("[key_name(src)] modified [original_name]'s [objectvar]: [original_var]=[new_var]")
message_admins("[key_name_admin(src)] modified [original_name]'s varlist [objectvar]: [original_var]=[new_var]")
@@ -612,7 +612,7 @@ var/list/VVpixelmovement = list("step_x", "step_y", "step_size", "bound_height",
if(!O.vv_edit_var(variable, var_new))
to_chat(src, "Your edit was rejected by the object.")
return
log_to_dd("### VarEdit by [src]: [O.type] [variable]=[html_encode("[var_new]")]")
log_world("### VarEdit by [src]: [O.type] [variable]=[html_encode("[var_new]")]")
log_admin("[key_name(src)] modified [original_name]'s [variable] to [var_new]")
var/msg = "[key_name_admin(src)] modified [original_name]'s [variable] to [var_new]"
message_admins(msg)
+1 -1
View File
@@ -411,7 +411,7 @@ client/proc/one_click_antag()
//Creates mind stuff.
new_syndicate_commando.mind_initialize()
new_syndicate_commando.mind.assigned_role = "MODE"
new_syndicate_commando.mind.assigned_role = SPECIAL_ROLE_SYNDICATE_DEATHSQUAD
new_syndicate_commando.mind.special_role = SPECIAL_ROLE_SYNDICATE_DEATHSQUAD
//Adds them to current traitor list. Which is really the extra antagonist list.
+1 -1
View File
@@ -35,7 +35,7 @@
qdel(I)
H.equip_to_slot_or_del(new /obj/item/clothing/under/kilt(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/captain(H), slot_l_ear)
H.equip_to_slot_or_del(new /obj/item/radio/headset/heads/captain(H), slot_l_ear)
H.equip_to_slot_or_del(new /obj/item/clothing/head/beret(H), slot_head)
H.equip_to_slot_or_del(new /obj/item/claymore/highlander(H), slot_r_hand)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(H), slot_shoes)
+1 -1
View File
@@ -24,7 +24,7 @@
to_chat(H, "<B>You are part of the [station_name()] dodgeball tournament. Throw dodgeballs at crewmembers wearing a different color than you. OOC: Use THROW on an EMPTY-HAND to catch thrown dodgeballs.</B>")
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/captain(H), slot_l_ear)
H.equip_to_slot_or_del(new /obj/item/radio/headset/heads/captain(H), slot_l_ear)
H.equip_to_slot_or_del(new /obj/item/beach_ball/dodgeball(H), slot_r_hand)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes)
+1 -1
View File
@@ -93,7 +93,7 @@ var/list/sounds_cache = list()
ignore_power = 1
for(var/O in global_intercoms)
var/obj/item/device/radio/intercom/I = O
var/obj/item/radio/intercom/I = O
if(!is_station_level(I.z) && !ignore_z)
continue
if(!I.on && !ignore_power)
+1 -1
View File
@@ -429,7 +429,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
//Announces the character on all the systems, based on the record.
if(!issilicon(new_character))//If they are not a cyborg/AI.
if(!record_found&&new_character.mind.assigned_role!="MODE")//If there are no records for them. If they have a record, this info is already in there. MODE people are not announced anyway.
if(!record_found && new_character.mind.assigned_role != new_character.mind.special_role)//If there are no records for them. If they have a record, this info is already in there. Offstation special characters announced anyway.
//Power to the user!
if(alert(new_character,"Warning: No data core entry detected. Would you like to announce the arrival of this character by adding them to various databases, such as medical records?",,"No","Yes")=="Yes")
data_core.manifest_inject(new_character)
+76 -54
View File
@@ -5,14 +5,16 @@ var/global/sent_strike_team = 0
/client/proc/strike_team()
if(!ticker)
to_chat(usr, "<font color='red'>The game hasn't started yet!</font>")
to_chat(usr, "<span class='userdanger'>The game hasn't started yet!</span>")
return
if(sent_strike_team == 1)
to_chat(usr, "<font color='red'>CentComm is already sending a team.</font>")
to_chat(usr, "<span class='userdanger'>CentComm is already sending a team.</span>")
return
if(alert("Do you want to send in the CentComm death squad? Once enabled, this is irreversible.",,"Yes","No")!="Yes")
return
alert("This 'mode' will go on until everyone is dead or the station is destroyed. You may also admin-call the evac shuttle when appropriate. Spawned commandos have internals cameras which are viewable through a monitor inside the Spec. Ops. Office. Assigning the team's detailed task is recommended from there. While you will be able to manually pick the candidates from active ghosts, their assignment in the squad will be random.")
alert("This 'mode' will go on until everyone is dead or the station is destroyed. You may also admin-call the evac shuttle when appropriate. Spawned commandos have internals cameras which are viewable through a monitor inside the Spec. Ops. Office. The first one selected/spawned will be the team leader.")
message_admins("<span class='notice'>[key_name_admin(usr)] has started to spawn a CentComm DeathSquad.</span>", 1)
var/input = null
while(!input)
@@ -25,13 +27,7 @@ var/global/sent_strike_team = 0
to_chat(usr, "Looks like someone beat you to it.")
return
sent_strike_team = 1
shuttle_master.cancelEvac()
var/commando_number = commandos_possible //for selecting a leader
var/leader_selected = 0 //when the leader is chosen. The last person spawned.
//Code for spawning a nuke auth code.
// Find the nuclear auth code
var/nuke_code
var/temp_code
for(var/obj/machinery/nuclearbomb/N in world)
@@ -40,42 +36,69 @@ var/global/sent_strike_team = 0
nuke_code = N.r_code
break
//Generates a list of commandos from active ghosts. Then the user picks which characters to respawn as the commandos.
var/list/candidates = list() //candidates for being a commando out of all the active ghosts in world.
var/list/commandos = list() //actual commando ghosts as picked by the user.
for(var/mob/dead/observer/G in player_list)
if(!G.client.holder && !G.client.is_afk()) //Whoever called/has the proc won't be added to the list.
if(!(G.mind && G.mind.current && G.mind.current.stat != DEAD))
candidates += G.key
for(var/i=commandos_possible,(i>0&&candidates.len),i--)//Decrease with every commando selected.
var/candidate = input("Pick characters to spawn as the commandos. This will go on until there either no more ghosts to pick from or the slots are full.", "Active Players") as null|anything in candidates //It will auto-pick a person when there is only one candidate.
candidates -= candidate //Subtract from candidates.
commandos += candidate//Add their ghost to commandos.
// Find ghosts willing to be DS
var/list/commando_ckeys = pollCandidatesByKeyWithVeto(src, usr, commandos_possible, "Join the DeathSquad?",, 21, 600, 1, role_playtime_requirements[ROLE_DEATHSQUAD], TRUE, FALSE)
if(!commando_ckeys.len)
to_chat(usr, "<span class='userdanger'>Nobody volunteered to join the DeathSquad.</span>")
return
//Spawns commandos and equips them.
sent_strike_team = 1
// Spawns commandos and equips them.
var/commando_number = commandos_possible //for selecting a leader
var/is_leader = TRUE // set to FALSE after leader is spawned
for(var/obj/effect/landmark/L in landmarks_list)
if(commando_number<=0) break
if(L.name == "Commando")
leader_selected = commando_number == 1?1:0
var/mob/living/carbon/human/new_commando = create_death_commando(L, leader_selected)
spawn(0)
var/use_ds_borg = FALSE
var/ghost_key // Ghost ckey that we intend to put into the commando. Can remain undefined if we don't have one.
if(commando_ckeys.len)
ghost_key = pick(commando_ckeys)
commando_ckeys -= ghost_key
if(!is_leader)
var/new_gender = alert(src, "Select Deathsquad Type.", "DS Character Generation", "Organic", "Cyborg")
if(new_gender == "Cyborg")
use_ds_borg = TRUE
if(commandos.len)
new_commando.key = pick(commandos)
commandos -= new_commando.key
new_commando.internal = new_commando.s_store
new_commando.update_action_buttons_icon()
//So they don't forget their code or mission.
if(nuke_code)
new_commando.mind.store_memory("<B>Nuke Code:</B> <span class='warning'>[nuke_code].</span>")
new_commando.mind.store_memory("<B>Mission:</B> <span class='warning'>[input].</span>")
to_chat(new_commando, "<span class='notice'>You are a Special Ops. [!leader_selected ? "commando" : "<B>LEADER</B>"] in the service of Central Command. Check the table ahead for detailed instructions.\nYour current mission is: <span class='danger'>[input]</span></span>")
if(use_ds_borg)
var/mob/living/silicon/robot/deathsquad/R = new()
R.forceMove(get_turf(L))
var/rnum = rand(1,1000)
var/borgname = "Epsilon [rnum]"
R.name = borgname
R.custom_name = borgname
R.real_name = R.name
R.mind = new
R.mind.current = R
R.mind.original = R
R.mind.assigned_role = SPECIAL_ROLE_DEATHSQUAD
R.mind.special_role = SPECIAL_ROLE_DEATHSQUAD
if(!(R.mind in ticker.minds))
ticker.minds += R.mind
ticker.mode.traitors += R.mind
if(ghost_key)
R.key = ghost_key
if(nuke_code)
R.mind.store_memory("<B>Nuke Code:</B> <span class='warning'>[nuke_code].</span>")
R.mind.store_memory("<B>Mission:</B> <span class='warning'>[input].</span>")
to_chat(R, "<span class='userdanger'>You are a Special Operations cyborg, in the service of Central Command. \nYour current mission is: <span class='danger'>[input]</span></span>")
else
var/mob/living/carbon/human/new_commando = create_death_commando(L, is_leader)
if(ghost_key)
new_commando.key = ghost_key
new_commando.internal = new_commando.s_store
new_commando.update_action_buttons_icon()
if(nuke_code)
new_commando.mind.store_memory("<B>Nuke Code:</B> <span class='warning'>[nuke_code].</span>")
new_commando.mind.store_memory("<B>Mission:</B> <span class='warning'>[input].</span>")
to_chat(new_commando, "<span class='userdanger'>You are a Special Ops [is_leader ? "<B>TEAM LEADER</B>" : "commando"] in the service of Central Command. Check the table ahead for detailed instructions.\nYour current mission is: <span class='danger'>[input]</span></span>")
is_leader = FALSE
commando_number--
//Spawns the rest of the commando gear.
//Spawns the rest of the commando gear.
for(var/obj/effect/landmark/L in landmarks_list)
if(L.name == "Commando_Manual")
//new /obj/item/gun/energy/pulse_rifle(L.loc)
@@ -92,18 +115,18 @@ var/global/sent_strike_team = 0
new /obj/effect/spawner/newbomb/timer/syndicate(L.loc)
qdel(L)
message_admins("<span class='notice'>[key_name_admin(usr)] has spawned a CentComm strike squad.</span>", 1)
message_admins("<span class='notice'>[key_name_admin(usr)] has spawned a CentComm DeathSquad.</span>", 1)
log_admin("[key_name(usr)] used Spawn Death Squad.")
return 1
/client/proc/create_death_commando(obj/spawn_location, leader_selected = 0)
/client/proc/create_death_commando(obj/spawn_location, is_leader = FALSE)
var/mob/living/carbon/human/new_commando = new(spawn_location.loc)
var/commando_leader_rank = pick("Lieutenant", "Captain", "Major")
var/commando_rank = pick("Corporal", "Sergeant", "Staff Sergeant", "Sergeant 1st Class", "Master Sergeant", "Sergeant Major")
var/commando_name = pick(last_names)
var/datum/preferences/A = new()//Randomize appearance for the commando.
if(leader_selected)
if(is_leader)
A.age = rand(35,45)
A.real_name = "[commando_leader_rank] [commando_name]"
else
@@ -114,21 +137,21 @@ var/global/sent_strike_team = 0
//Creates mind stuff.
new_commando.mind_initialize()
new_commando.mind.assigned_role = "MODE"
new_commando.mind.assigned_role = SPECIAL_ROLE_DEATHSQUAD
new_commando.mind.special_role = SPECIAL_ROLE_DEATHSQUAD
ticker.mode.traitors |= new_commando.mind//Adds them to current traitor list. Which is really the extra antagonist list.
new_commando.equip_death_commando(leader_selected)
new_commando.equip_death_commando(is_leader)
return new_commando
/mob/living/carbon/human/proc/equip_death_commando(leader_selected = 0)
/mob/living/carbon/human/proc/equip_death_commando(is_leader = FALSE)
var/obj/item/device/radio/R = new /obj/item/device/radio/headset/alt(src)
var/obj/item/radio/R = new /obj/item/radio/headset/alt(src)
R.set_frequency(DTH_FREQ)
equip_to_slot_or_del(R, slot_l_ear)
if(leader_selected == 0)
equip_to_slot_or_del(new /obj/item/clothing/under/color/green(src), slot_w_uniform)
else
if(is_leader)
equip_to_slot_or_del(new /obj/item/clothing/under/rank/centcom_officer(src), slot_w_uniform)
else
equip_to_slot_or_del(new /obj/item/clothing/under/color/green(src), slot_w_uniform)
equip_to_slot_or_del(new /obj/item/clothing/shoes/magboots/advance(src), slot_shoes)
equip_to_slot_or_del(new /obj/item/clothing/suit/space/deathsquad(src), slot_wear_suit)
equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(src), slot_gloves)
@@ -142,21 +165,20 @@ var/global/sent_strike_team = 0
equip_to_slot_or_del(new /obj/item/ammo_box/a357(src), slot_in_backpack)
equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/combat/nanites(src), slot_in_backpack)
equip_to_slot_or_del(new /obj/item/storage/box/flashbangs(src), slot_in_backpack)
equip_to_slot_or_del(new /obj/item/device/flashlight(src), slot_in_backpack)
if(!leader_selected)
equip_to_slot_or_del(new /obj/item/grenade/plastic/x4(src), slot_in_backpack)
else
equip_to_slot_or_del(new /obj/item/pinpointer(src), slot_in_backpack)
equip_to_slot_or_del(new /obj/item/flashlight(src), slot_in_backpack)
equip_to_slot_or_del(new /obj/item/pinpointer(src), slot_in_backpack)
if(is_leader)
equip_to_slot_or_del(new /obj/item/disk/nuclear(src), slot_in_backpack)
else
equip_to_slot_or_del(new /obj/item/grenade/plastic/x4(src), slot_in_backpack)
equip_to_slot_or_del(new /obj/item/melee/energy/sword/saber(src), slot_l_store)
equip_to_slot_or_del(new /obj/item/shield/energy(src), slot_r_store)
equip_to_slot_or_del(new /obj/item/tank/emergency_oxygen/double/full(src), slot_s_store)
equip_to_slot_or_del(new /obj/item/gun/projectile/revolver/mateba(src), slot_belt)
equip_to_slot_or_del(new /obj/item/gun/energy/pulse(src), slot_r_hand)
var/obj/item/implant/mindshield/L = new/obj/item/implant/mindshield(src)
L.implant(src)
@@ -17,7 +17,9 @@ var/global/sent_syndicate_strike_team = 0
return
if(alert("Do you want to send in the Syndicate Strike Team? Once enabled, this is irreversible.",,"Yes","No")=="No")
return
alert("This 'mode' will go on until everyone is dead or the station is destroyed. You may also admin-call the evac shuttle when appropriate. Spawned syndicates have internals cameras which are viewable through a monitor inside the Syndicate Mothership Bridge. Assigning the team's detailed task is recommended from there. While you will be able to manually pick the candidates from active ghosts, their assignment in the squad will be random.")
alert("This 'mode' will go on until everyone is dead or the station is destroyed. You may also admin-call the evac shuttle when appropriate. Spawned syndicates have internals cameras which are viewable through a monitor inside the Syndicate Mothership Bridge. Assigning the team's detailed task is recommended from there. The first one selected/spawned will be the team leader.")
message_admins("<span class='notice'>[key_name_admin(usr)] has started to spawn a Syndicate Strike Team.</span>", 1)
var/input = null
while(!input)
@@ -30,15 +32,10 @@ var/global/sent_syndicate_strike_team = 0
to_chat(src, "Looks like someone beat you to it.")
return
sent_syndicate_strike_team = 1
//if(emergency_shuttle.can_recall())
// emergency_shuttle.recall() //why, exactly? Admins can do this themselves.
var/syndicate_commando_number = syndicate_commandos_possible //for selecting a leader
var/syndicate_leader_selected = 0 //when the leader is chosen. The last person spawned.
var/is_leader = TRUE // set to FALSE after leader is spawned
//Code for spawning a nuke auth code.
// Find the nuclear auth code
var/nuke_code
var/temp_code
for(var/obj/machinery/nuclearbomb/N in world)
@@ -47,29 +44,23 @@ var/global/sent_syndicate_strike_team = 0
nuke_code = N.r_code
break
//Generates a list of commandos from active ghosts. Then the user picks which characters to respawn as the commandos.
var/list/candidates = list() //candidates for being a commando out of all the active ghosts in world.
var/list/commandos = list() //actual commando ghosts as picked by the user.
for(var/mob/dead/observer/G in player_list)
if(!G.client.holder && !G.client.is_afk()) //Whoever called/has the proc won't be added to the list.
if(!(G.mind && G.mind.current && G.mind.current.stat != DEAD))
candidates += G.key
for(var/i=commandos_possible,(i>0&&candidates.len),i--)//Decrease with every commando selected.
var/candidate = input("Pick characters to spawn as the commandos. This will go on until there either no more ghosts to pick from or the slots are full.", "Active Players") as null|anything in candidates //It will auto-pick a person when there is only one candidate.
candidates -= candidate //Subtract from candidates.
commandos += candidate//Add their ghost to commandos.
// Find ghosts willing to be SST
var/list/commando_ckeys = pollCandidatesByKeyWithVeto(src, usr, syndicate_commandos_possible, "Join the Syndicate Strike Team?",, 21, 600, 1, role_playtime_requirements[ROLE_DEATHSQUAD], TRUE, FALSE)
if(!commando_ckeys.len)
to_chat(usr, "<span class='userdanger'>Nobody volunteered to join the SST.</span>")
return
//Spawns commandos and equips them.
sent_syndicate_strike_team = 1
//Spawns commandos and equips them.
for(var/obj/effect/landmark/L in landmarks_list)
if(syndicate_commando_number<=0) break
if(L.name == "Syndicate-Commando")
syndicate_leader_selected = syndicate_commando_number == 1?1:0
var/mob/living/carbon/human/new_syndicate_commando = create_syndicate_death_commando(L, is_leader)
var/mob/living/carbon/human/new_syndicate_commando = create_syndicate_death_commando(L, syndicate_leader_selected)
if(commandos.len)
new_syndicate_commando.key = pick(commandos)
commandos -= new_syndicate_commando.key
if(commando_ckeys.len)
new_syndicate_commando.key = pick(commando_ckeys)
commando_ckeys -= new_syndicate_commando.key
new_syndicate_commando.internal = new_syndicate_commando.s_store
new_syndicate_commando.update_action_buttons_icon()
@@ -78,8 +69,9 @@ var/global/sent_syndicate_strike_team = 0
new_syndicate_commando.mind.store_memory("<B>Nuke Code:</B> <span class='warning'>[nuke_code]</span>.")
new_syndicate_commando.mind.store_memory("<B>Mission:</B> <span class='warning'>[input]</span>.")
to_chat(new_syndicate_commando, "<span class='notice'>You are an Elite Syndicate. [!syndicate_leader_selected ? "commando" : "<B>LEADER</B>"] in the service of the Syndicate. \nYour current mission is: <span class='danger'>[input]</span></span>")
to_chat(new_syndicate_commando, "<span class='notice'>You are an Elite Syndicate [is_leader ? "<B>TEAM LEADER</B>" : "commando"] in the service of the Syndicate. \nYour current mission is: <span class='userdanger'>[input]</span></span>")
new_syndicate_commando.faction += "syndicate"
is_leader = FALSE
syndicate_commando_number--
for(var/obj/effect/landmark/L in landmarks_list)
@@ -91,14 +83,14 @@ var/global/sent_syndicate_strike_team = 0
log_admin("[key_name(usr)] used Spawn Syndicate Squad.")
feedback_add_details("admin_verb","SDTHS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/create_syndicate_death_commando(obj/spawn_location, syndicate_leader_selected = 0)
/client/proc/create_syndicate_death_commando(obj/spawn_location, is_leader = FALSE)
var/mob/living/carbon/human/new_syndicate_commando = new(spawn_location.loc)
var/syndicate_commando_leader_rank = pick("Lieutenant", "Captain", "Major")
var/syndicate_commando_rank = pick("Corporal", "Sergeant", "Staff Sergeant", "Sergeant 1st Class", "Master Sergeant", "Sergeant Major")
var/syndicate_commando_name = pick(last_names)
var/datum/preferences/A = new()//Randomize appearance for the commando.
if(syndicate_leader_selected)
if(is_leader)
A.age = rand(35,45)
A.real_name = "[syndicate_commando_leader_rank] [syndicate_commando_name]"
else
@@ -109,29 +101,29 @@ var/global/sent_syndicate_strike_team = 0
//Creates mind stuff.
new_syndicate_commando.mind_initialize()
new_syndicate_commando.mind.assigned_role = "MODE"
new_syndicate_commando.mind.assigned_role = SPECIAL_ROLE_SYNDICATE_DEATHSQUAD
new_syndicate_commando.mind.special_role = SPECIAL_ROLE_SYNDICATE_DEATHSQUAD
ticker.mode.traitors |= new_syndicate_commando.mind //Adds them to current traitor list. Which is really the extra antagonist list.
new_syndicate_commando.equip_syndicate_commando(syndicate_leader_selected)
new_syndicate_commando.equip_syndicate_commando(is_leader)
qdel(spawn_location)
return new_syndicate_commando
/mob/living/carbon/human/proc/equip_syndicate_commando(syndicate_leader_selected = 0)
/mob/living/carbon/human/proc/equip_syndicate_commando(is_leader = FALSE)
var/obj/item/device/radio/R = new /obj/item/device/radio/headset/syndicate/alt/syndteam(src)
var/obj/item/radio/R = new /obj/item/radio/headset/syndicate/alt/syndteam(src)
R.set_frequency(SYNDTEAM_FREQ)
equip_to_slot_or_del(R, slot_l_ear)
equip_to_slot_or_del(new /obj/item/clothing/under/syndicate(src), slot_w_uniform)
equip_to_slot_or_del(new /obj/item/clothing/shoes/magboots/syndie/advance(src), slot_shoes)
if(!syndicate_leader_selected)
equip_to_slot_or_del(new /obj/item/clothing/suit/space/syndicate/black/strike(src), slot_wear_suit)
else
if(is_leader)
equip_to_slot_or_del(new /obj/item/clothing/suit/space/syndicate/black/red/strike(src), slot_wear_suit)
equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(src), slot_gloves)
if(!syndicate_leader_selected)
equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/syndicate/black/strike(src), slot_head)
else
equip_to_slot_or_del(new /obj/item/clothing/suit/space/syndicate/black/strike(src), slot_wear_suit)
equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(src), slot_gloves)
if(is_leader)
equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/syndicate/black/red/strike(src), slot_head)
else
equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/syndicate/black/strike(src), slot_head)
equip_to_slot_or_del(new /obj/item/clothing/mask/gas/syndicate(src), slot_wear_mask)
equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal(src), slot_glasses)
@@ -141,14 +133,13 @@ var/global/sent_syndicate_strike_team = 0
equip_to_slot_or_del(new /obj/item/ammo_box/magazine/m45(src), slot_in_backpack)
equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/combat/nanites(src), slot_in_backpack)
equip_to_slot_or_del(new /obj/item/grenade/plastic/x4(src), slot_in_backpack)
equip_to_slot_or_del(new /obj/item/device/flashlight(src), slot_in_backpack)
if(!syndicate_leader_selected)
equip_to_slot_or_del(new /obj/item/grenade/plastic/x4(src), slot_in_backpack)
equip_to_slot_or_del(new /obj/item/card/emag(src), slot_in_backpack)
else
equip_to_slot_or_del(new /obj/item/flashlight(src), slot_in_backpack)
if(is_leader)
equip_to_slot_or_del(new /obj/item/pinpointer(src), slot_in_backpack)
equip_to_slot_or_del(new /obj/item/disk/nuclear(src), slot_in_backpack)
else
equip_to_slot_or_del(new /obj/item/grenade/plastic/x4(src), slot_in_backpack)
equip_to_slot_or_del(new /obj/item/card/emag(src), slot_in_backpack)
equip_to_slot_or_del(new /obj/item/melee/energy/sword/saber(src), slot_l_store)
equip_to_slot_or_del(new /obj/item/grenade/empgrenade(src), slot_r_store)
equip_to_slot_or_del(new /obj/item/tank/emergency_oxygen/double/full(src), slot_s_store)
+5 -5
View File
@@ -2,7 +2,7 @@ var/global/vox_tick = 1
/mob/living/carbon/human/proc/equip_vox_raider()
var/obj/item/device/radio/R = new /obj/item/device/radio/headset/syndicate(src)
var/obj/item/radio/R = new /obj/item/radio/headset/syndicate(src)
R.set_frequency(SYND_FREQ) //Same frequency as the syndicate team in Nuke mode.
equip_to_slot_or_del(R, slot_l_ear)
@@ -16,7 +16,7 @@ var/global/vox_tick = 1
equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/vox/carapace(src), slot_head)
equip_to_slot_or_del(new /obj/item/melee/classic_baton/telescopic(src), slot_belt)
equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/monocle(src), slot_glasses) // REPLACE WITH CODED VOX ALTERNATIVE.
equip_to_slot_or_del(new /obj/item/device/chameleon(src), slot_l_store)
equip_to_slot_or_del(new /obj/item/chameleon(src), slot_l_store)
var/obj/item/gun/projectile/automatic/spikethrower/W = new(src)
equip_to_slot_or_del(W, slot_r_hand)
@@ -28,7 +28,7 @@ var/global/vox_tick = 1
equip_to_slot_or_del(new /obj/item/storage/belt/utility/full(src), slot_belt)
equip_to_slot_or_del(new /obj/item/clothing/glasses/meson(src), slot_glasses) // REPLACE WITH CODED VOX ALTERNATIVE.
equip_to_slot_or_del(new /obj/item/storage/box/emps(src), slot_r_hand)
equip_to_slot_or_del(new /obj/item/device/multitool(src), slot_l_hand)
equip_to_slot_or_del(new /obj/item/multitool(src), slot_l_hand)
if(3) // Vox saboteur!
@@ -38,7 +38,7 @@ var/global/vox_tick = 1
equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/monocle(src), slot_glasses) // REPLACE WITH CODED VOX ALTERNATIVE.
equip_to_slot_or_del(new /obj/item/card/emag(src), slot_l_store)
equip_to_slot_or_del(new /obj/item/gun/dartgun/vox/raider(src), slot_r_hand)
equip_to_slot_or_del(new /obj/item/device/multitool(src), slot_l_hand)
equip_to_slot_or_del(new /obj/item/multitool(src), slot_l_hand)
if(4) // Vox medic!
equip_to_slot_or_del(new /obj/item/clothing/suit/space/vox/medic(src), slot_wear_suit)
@@ -50,7 +50,7 @@ var/global/vox_tick = 1
equip_to_slot_or_del(new /obj/item/clothing/mask/breath/vox(src), slot_wear_mask)
equip_to_slot_or_del(new /obj/item/tank/nitrogen(src), slot_back)
equip_to_slot_or_del(new /obj/item/device/flashlight(src), slot_r_store)
equip_to_slot_or_del(new /obj/item/flashlight(src), slot_r_store)
var/obj/item/card/id/syndicate/vox/W = new(src)
W.name = "[real_name]'s Legitimate Human ID Card"
@@ -27,11 +27,11 @@
team = "Blue"
avatar_y_offset = 1
/obj/machinery/computer/mob_battle_terminal/red/initialize()
/obj/machinery/computer/mob_battle_terminal/red/Initialize()
..()
check_connection()
/obj/machinery/computer/mob_battle_terminal/blue/initialize()
/obj/machinery/computer/mob_battle_terminal/blue/Initialize()
..()
check_connection()
+7 -7
View File
@@ -21,7 +21,7 @@
update_self()
forceMove(mob_info.spawn_point)
if(!mob_info.is_trap)
addtimer(src, "despawn", mob_info.lifetime)
addtimer(CALLBACK(src, .proc/despawn), mob_info.lifetime)
/obj/effect/nanomob/proc/update_self()
if(!mob_info)
@@ -37,18 +37,18 @@
add_alt_appearance("nanomob_avatar", avatar)
/obj/effect/nanomob/attackby(obj/item/O, mob/user)
if(istype(O, /obj/item/device/pda))
var/obj/item/device/pda/P = O
if(istype(O, /obj/item/pda))
var/obj/item/pda/P = O
attempt_capture(P, -20) //attempting a melee capture reduces the mob's effective run_chance by 20% to balance the risk of triggering a trap mob
return 1
/obj/effect/nanomob/hitby(atom/movable/AM)
if(istype(AM, /obj/item/device/pda))
var/obj/item/device/pda/P = AM
if(istype(AM, /obj/item/pda))
var/obj/item/pda/P = AM
attempt_capture(P) //attempting a ranged capture does not affect the mob's effective run_chance but does prevent you from being shocked by a trap mob
return 1
/obj/effect/nanomob/proc/attempt_capture(obj/item/device/pda/P, catch_mod = 0) //negative catch_mods lower effective run chance,
/obj/effect/nanomob/proc/attempt_capture(obj/item/pda/P, catch_mod = 0) //negative catch_mods lower effective run chance,
if(!P || !P.current_app || !istype(P.current_app, /datum/data/pda/app/mob_hunter_game) || !P.cartridge)
return
@@ -150,7 +150,7 @@
else
icon_state = mob_info.icon_state_normal
/obj/effect/nanomob/battle/attempt_capture(obj/item/device/pda/P, catch_mod = 0)
/obj/effect/nanomob/battle/attempt_capture(obj/item/pda/P, catch_mod = 0)
//you can't capture battle avatars, since they belong to someone already
return
+7 -7
View File
@@ -1,4 +1,4 @@
/obj/item/device/assembly
/obj/item/assembly
name = "assembly"
desc = "A small electronic device that should never exist."
icon = 'icons/obj/assemblies/new_assemblies.dmi'
@@ -17,7 +17,7 @@
var/secured = 1
var/list/attached_overlays = null
var/obj/item/device/assembly_holder/holder = null
var/obj/item/assembly_holder/holder = null
var/cooldown = 0//To prevent spam
var/wires = WIRE_RECEIVE | WIRE_PULSE
var/datum/wires/connected = null // currently only used by timer/signaler
@@ -64,8 +64,8 @@
return 1
Destroy()
if(istype(src.loc, /obj/item/device/assembly_holder) || istype(holder))
var/obj/item/device/assembly_holder/A = src.loc
if(istype(src.loc, /obj/item/assembly_holder) || istype(holder))
var/obj/item/assembly_holder/A = src.loc
if(A.a_left == src)
A.a_left = null
else if(A.a_right == src)
@@ -113,8 +113,8 @@
return secured
attach_assembly(var/obj/item/device/assembly/A, var/mob/user)
holder = new/obj/item/device/assembly_holder(get_turf(src))
attach_assembly(var/obj/item/assembly/A, var/mob/user)
holder = new/obj/item/assembly_holder(get_turf(src))
if(holder.attach(A,src,user))
to_chat(user, "<span class='notice'>You attach \the [A] to \the [src]!</span>")
return 1
@@ -123,7 +123,7 @@
attackby(obj/item/W as obj, mob/user as mob, params)
if(isassembly(W))
var/obj/item/device/assembly/A = W
var/obj/item/assembly/A = W
if((!A.secured) && (!secured))
attach_assembly(A,user)
return
+16 -15
View File
@@ -1,4 +1,4 @@
/obj/item/device/onetankbomb
/obj/item/onetankbomb
name = "bomb"
icon = 'icons/obj/tank.dmi'
item_state = "assembly"
@@ -8,15 +8,15 @@
throw_range = 4
flags = CONDUCT //Copied this from old code, so this may or may not be necessary
var/status = 0 //0 - not readied //1 - bomb finished with welder
var/obj/item/device/assembly_holder/bombassembly = null //The first part of the bomb is an assembly holder, holding an igniter+some device
var/obj/item/assembly_holder/bombassembly = null //The first part of the bomb is an assembly holder, holding an igniter+some device
var/obj/item/tank/bombtank = null //the second part of the bomb is a plasma tank
origin_tech = "materials=1;engineering=1"
/obj/item/device/onetankbomb/examine(mob/user)
/obj/item/onetankbomb/examine(mob/user)
..(user)
user.examinate(bombtank)
/obj/item/device/onetankbomb/update_icon()
/obj/item/onetankbomb/update_icon()
if(bombtank)
icon_state = bombtank.icon_state
if(bombassembly)
@@ -24,8 +24,8 @@
overlays += bombassembly.overlays
overlays += "bomb_assembly"
/obj/item/device/onetankbomb/attackby(obj/item/W as obj, mob/user as mob, params)
if(istype(W, /obj/item/device/analyzer))
/obj/item/onetankbomb/attackby(obj/item/W as obj, mob/user as mob, params)
if(istype(W, /obj/item/analyzer))
bombtank.attackby(W, user, params)
return
if(istype(W, /obj/item/wrench) && !status) //This is basically bomb assembly code inverted. apparently it works.
@@ -47,6 +47,7 @@
status = 1
bombers += "[key_name(user)] welded a single tank bomb. Temperature: [bombtank.air_contents.temperature-T0C]"
msg_admin_attack("[key_name_admin(user)] welded a single tank bomb. Temperature: [bombtank.air_contents.temperature-T0C]")
log_game("[key_name(user)] welded a single tank bomb. Temperature: [bombtank.air_contents.temperature - T0C]")
to_chat(user, "<span class='notice'>A pressure hole has been bored to [bombtank] valve. \The [bombtank] can now be ignited.</span>")
else
status = 0
@@ -55,12 +56,12 @@
add_fingerprint(user)
..()
/obj/item/device/onetankbomb/attack_self(mob/user as mob) //pressing the bomb accesses its assembly
/obj/item/onetankbomb/attack_self(mob/user as mob) //pressing the bomb accesses its assembly
bombassembly.attack_self(user, 1)
add_fingerprint(user)
return
/obj/item/device/onetankbomb/receive_signal() //This is mainly called by the sensor through sense() to the holder, and from the holder to here.
/obj/item/onetankbomb/receive_signal() //This is mainly called by the sensor through sense() to the holder, and from the holder to here.
visible_message("[bicon(src)] *beep* *beep*", "*beep* *beep*")
sleep(10)
if(!src)
@@ -70,37 +71,37 @@
else
bombtank.release()
/obj/item/device/onetankbomb/HasProximity(atom/movable/AM as mob|obj)
/obj/item/onetankbomb/HasProximity(atom/movable/AM as mob|obj)
if(bombassembly)
bombassembly.HasProximity(AM)
/obj/item/device/onetankbomb/Crossed(atom/movable/AM as mob|obj) //for mousetraps
/obj/item/onetankbomb/Crossed(atom/movable/AM as mob|obj) //for mousetraps
if(bombassembly)
bombassembly.Crossed(AM)
/obj/item/device/onetankbomb/on_found(mob/finder as mob) //for mousetraps
/obj/item/onetankbomb/on_found(mob/finder as mob) //for mousetraps
if(bombassembly)
bombassembly.on_found(finder)
/obj/item/device/onetankbomb/hear_talk(mob/living/M as mob, msg)
/obj/item/onetankbomb/hear_talk(mob/living/M as mob, msg)
if(bombassembly)
bombassembly.hear_talk(M, msg)
/obj/item/device/onetankbomb/hear_message(mob/living/M as mob, msg)
/obj/item/onetankbomb/hear_message(mob/living/M as mob, msg)
if(bombassembly)
bombassembly.hear_message(M, msg)
// ---------- Procs below are for tanks that are used exclusively in 1-tank bombs ----------
/obj/item/tank/proc/bomb_assemble(W,user) //Bomb assembly proc. This turns assembly+tank into a bomb
var/obj/item/device/assembly_holder/S = W
var/obj/item/assembly_holder/S = W
var/mob/M = user
if(!S.secured) //Check if the assembly is secured
return
if(isigniter(S.a_left) == isigniter(S.a_right)) //Check if either part of the assembly has an igniter, but if both parts are igniters, then fuck it
return
var/obj/item/device/onetankbomb/R = new /obj/item/device/onetankbomb(loc)
var/obj/item/onetankbomb/R = new /obj/item/onetankbomb(loc)
M.drop_item() //Remove the assembly from your hands
M.remove_from_mob(src) //Remove the tank from your character,in case you were holding it
+9 -9
View File
@@ -1,4 +1,4 @@
/obj/item/device/assembly/health
/obj/item/assembly/health
name = "health sensor"
desc = "Used for scanning and monitoring health."
icon_state = "health"
@@ -12,12 +12,12 @@
/obj/item/device/assembly/health/activate()
/obj/item/assembly/health/activate()
if(!..()) return 0//Cooldown check
toggle_scan()
return 0
/obj/item/device/assembly/health/toggle_secure()
/obj/item/assembly/health/toggle_secure()
secured = !secured
if(secured && scanning)
processing_objects.Add(src)
@@ -27,8 +27,8 @@
update_icon()
return secured
/obj/item/device/assembly/health/attackby(obj/item/W as obj, mob/user as mob)
if(istype(W, /obj/item/device/multitool))
/obj/item/assembly/health/attackby(obj/item/W as obj, mob/user as mob)
if(istype(W, /obj/item/multitool))
if(alarm_health == 0)
alarm_health = -90
user.show_message("You toggle [src] to \"detect death\" mode.")
@@ -39,7 +39,7 @@
else
return ..()
/obj/item/device/assembly/health/process()
/obj/item/assembly/health/process()
if(!scanning || !secured)
return
@@ -60,7 +60,7 @@
return
return
/obj/item/device/assembly/health/proc/toggle_scan()
/obj/item/assembly/health/proc/toggle_scan()
if(!secured) return 0
scanning = !scanning
if(scanning)
@@ -69,7 +69,7 @@
processing_objects.Remove(src)
return
/obj/item/device/assembly/health/interact(mob/user as mob)//TODO: Change this to the wires thingy
/obj/item/assembly/health/interact(mob/user as mob)//TODO: Change this to the wires thingy
if(!secured)
user.show_message("<span class='warning'>The [name] is unsecured!</span>")
return 0
@@ -83,7 +83,7 @@
return
/obj/item/device/assembly/health/Topic(href, href_list)
/obj/item/assembly/health/Topic(href, href_list)
..()
if(!ismob(usr))
return
+6 -6
View File
@@ -1,30 +1,30 @@
/proc/isassembly(O)
if(istype(O, /obj/item/device/assembly))
if(istype(O, /obj/item/assembly))
return 1
return 0
/proc/isigniter(O)
if(istype(O, /obj/item/device/assembly/igniter))
if(istype(O, /obj/item/assembly/igniter))
return 1
return 0
/proc/isinfared(O)
if(istype(O, /obj/item/device/assembly/infra))
if(istype(O, /obj/item/assembly/infra))
return 1
return 0
/proc/isprox(O)
if(istype(O, /obj/item/device/assembly/prox_sensor))
if(istype(O, /obj/item/assembly/prox_sensor))
return 1
return 0
/proc/issignaler(O)
if(istype(O, /obj/item/device/assembly/signaler))
if(istype(O, /obj/item/assembly/signaler))
return 1
return 0
/proc/istimer(O)
if(istype(O, /obj/item/device/assembly/timer))
if(istype(O, /obj/item/assembly/timer))
return 1
return 0
+6 -6
View File
@@ -1,4 +1,4 @@
/obj/item/device/assembly_holder
/obj/item/assembly_holder
name = "Assembly"
icon = 'icons/obj/assemblies/new_assemblies.dmi'
icon_state = "holder"
@@ -10,13 +10,13 @@
throw_range = 10
var/secured = 0
var/obj/item/device/assembly/a_left = null
var/obj/item/device/assembly/a_right = null
var/obj/item/assembly/a_left = null
var/obj/item/assembly/a_right = null
proc/attach(var/obj/item/device/D, var/obj/item/device/D2, var/mob/user)
proc/attach(var/obj/item/D, var/obj/item/D2, var/mob/user)
return
proc/process_activation(var/obj/item/device/D)
proc/process_activation(var/obj/item/D)
return
@@ -31,7 +31,7 @@
a_right.holder = null
return ..()
attach(var/obj/item/device/D, var/obj/item/device/D2, var/mob/user)
attach(var/obj/item/D, var/obj/item/D2, var/mob/user)
if((!D)||(!D2)) return 0
if((!isassembly(D))||(!isassembly(D2))) return 0
if((D:secured)||(D2:secured)) return 0
+7 -7
View File
@@ -1,4 +1,4 @@
/obj/item/device/assembly/igniter
/obj/item/assembly/igniter
name = "igniter"
desc = "A small electronic device able to ignite combustable substances."
icon_state = "igniter"
@@ -6,25 +6,25 @@
origin_tech = "magnets=1"
var/datum/effect_system/spark_spread/sparks = new /datum/effect_system/spark_spread
/obj/item/device/assembly/igniter/New()
/obj/item/assembly/igniter/New()
..()
sparks.set_up(2, 0, src)
sparks.attach(src)
/obj/item/device/assembly/igniter/Destroy()
/obj/item/assembly/igniter/Destroy()
QDEL_NULL(sparks)
return ..()
/obj/item/device/assembly/igniter/describe()
/obj/item/assembly/igniter/describe()
return "The igniter is [secured?"secured.":"unsecured."]"
/obj/item/device/assembly/igniter/activate()
/obj/item/assembly/igniter/activate()
if(!..()) return 0//Cooldown check
var/turf/location = get_turf(loc)
if(location) location.hotspot_expose(1000,1000)
if(istype(src.loc,/obj/item/device/assembly_holder))
if(istype(src.loc,/obj/item/assembly_holder))
if(istype(src.loc.loc, /obj/structure/reagent_dispensers/fueltank/))
var/obj/structure/reagent_dispensers/fueltank/tank = src.loc.loc
if(tank)
@@ -38,7 +38,7 @@
return 1
/obj/item/device/assembly/igniter/attack_self(mob/user as mob)
/obj/item/assembly/igniter/attack_self(mob/user as mob)
activate()
add_fingerprint(user)
return
+22 -22
View File
@@ -1,4 +1,4 @@
/obj/item/device/assembly/infra
/obj/item/assembly/infra
name = "infrared emitter"
desc = "Emits a visible or invisible beam and is triggered when the beam is interrupted."
icon_state = "infrared"
@@ -18,27 +18,27 @@
var/emission_cycles = 0
var/emission_cap = 20
/obj/item/device/assembly/infra/Destroy()
/obj/item/assembly/infra/Destroy()
if(first)
QDEL_NULL(first)
last = null
fire_location = null
return ..()
/obj/item/device/assembly/infra/describe()
/obj/item/assembly/infra/describe()
return "The assembly is [secured ? "secure" : "not secure"]. The infrared trigger is [on ? "on" : "off"]."
/obj/item/device/assembly/infra/examine(mob/user)
/obj/item/assembly/infra/examine(mob/user)
..()
to_chat(user, describe())
/obj/item/device/assembly/infra/activate()
/obj/item/assembly/infra/activate()
if(!..()) return 0//Cooldown check
on = !on
update_icon()
return 1
/obj/item/device/assembly/infra/toggle_secure()
/obj/item/assembly/infra/toggle_secure()
secured = !secured
if(secured)
processing_objects.Add(src)
@@ -50,17 +50,17 @@
update_icon()
return secured
/obj/item/device/assembly/infra/New()
/obj/item/assembly/infra/New()
..()
if(!secured)
toggle_secure()
/obj/item/device/assembly/infra/proc/arm() // Forces the device to arm no matter its current state.
/obj/item/assembly/infra/proc/arm() // Forces the device to arm no matter its current state.
if(!secured) // Checked because arm() might be called sometime after the object is spawned.
toggle_secure()
on = 1
/obj/item/device/assembly/infra/update_icon()
/obj/item/assembly/infra/update_icon()
overlays.Cut()
attached_overlays = list()
if(on)
@@ -70,7 +70,7 @@
if(holder)
holder.update_icon()
/obj/item/device/assembly/infra/process()
/obj/item/assembly/infra/process()
var/turf/T = get_turf(src)
if(first && (!on || !fire_location || fire_location != T || emission_cycles >= emission_cap))
qdel(first)
@@ -99,30 +99,30 @@
I.limit = 8
I.process()
/obj/item/device/assembly/infra/attack_hand()
/obj/item/assembly/infra/attack_hand()
qdel(first)
..()
/obj/item/device/assembly/infra/Move()
/obj/item/assembly/infra/Move()
var/t = dir
..()
dir = t
qdel(first)
/obj/item/device/assembly/infra/holder_movement()
/obj/item/assembly/infra/holder_movement()
if(!holder) return 0
qdel(first)
return 1
/obj/item/device/assembly/infra/equipped(var/mob/user, var/slot)
/obj/item/assembly/infra/equipped(var/mob/user, var/slot)
qdel(first)
return ..()
/obj/item/device/assembly/infra/pickup(mob/user)
/obj/item/assembly/infra/pickup(mob/user)
qdel(first)
return ..()
/obj/item/device/assembly/infra/proc/trigger_beam()
/obj/item/assembly/infra/proc/trigger_beam()
if(!secured || !on || cooldown > 0)
return 0
pulse(0)
@@ -133,7 +133,7 @@
spawn(10)
process_cooldown()
/obj/item/device/assembly/infra/interact(mob/user as mob)//TODO: change this this to the wire control panel
/obj/item/assembly/infra/interact(mob/user as mob)//TODO: change this this to the wire control panel
if(!secured) return
user.set_machine(src)
var/dat = {"<TT><B>Infrared Laser</B>
@@ -148,7 +148,7 @@
popup.open(0)
onclose(user, "infra")
/obj/item/device/assembly/infra/Topic(href, href_list)
/obj/item/assembly/infra/Topic(href, href_list)
..()
if(!usr.canmove || usr.stat || usr.restrained() || !in_range(loc, usr))
usr << browse(null, "window=infra")
@@ -169,7 +169,7 @@
if(usr)
attack_self(usr)
/obj/item/device/assembly/infra/verb/rotate()//This could likely be better
/obj/item/assembly/infra/verb/rotate()//This could likely be better
set name = "Rotate Infrared Laser"
set category = "Object"
set src in usr
@@ -187,7 +187,7 @@
/obj/item/device/assembly/infra/armed/New()
/obj/item/assembly/infra/armed/New()
..()
spawn(3)
if(holder)
@@ -195,7 +195,7 @@
dir = holder.master.dir
arm()
/obj/item/device/assembly/infra/armed/stealth
/obj/item/assembly/infra/armed/stealth
visible = 0
@@ -207,7 +207,7 @@
icon_state = "ibeam"
var/obj/effect/beam/i_beam/next = null
var/obj/effect/beam/i_beam/previous = null
var/obj/item/device/assembly/infra/master = null
var/obj/item/assembly/infra/master = null
var/limit = null
var/visible = 0.0
var/left = null
+3 -3
View File
@@ -1,4 +1,4 @@
/obj/item/device/assembly/mousetrap
/obj/item/assembly/mousetrap
name = "mousetrap"
desc = "A handy little spring-loaded trap for catching pesty rodents."
icon_state = "mousetrap"
@@ -128,12 +128,12 @@
triggered(null)
/obj/item/device/assembly/mousetrap/armed
/obj/item/assembly/mousetrap/armed
icon_state = "mousetraparmed"
armed = 1
/obj/item/device/assembly/mousetrap/verb/hide_under()
/obj/item/assembly/mousetrap/verb/hide_under()
set src in oview(1)
set name = "Hide"
set category = "Object"
+1 -1
View File
@@ -1,4 +1,4 @@
/obj/item/device/assembly/prox_sensor
/obj/item/assembly/prox_sensor
name = "proximity sensor"
desc = "Used for scanning and alerting when someone enters a certain proximity."
icon_state = "prox"
+1 -1
View File
@@ -4,7 +4,7 @@
icon = 'icons/obj/assemblies.dmi'
icon_state = "shock_kit"
var/obj/item/clothing/head/helmet/part1 = null
var/obj/item/device/radio/electropack/part2 = null
var/obj/item/radio/electropack/part2 = null
var/status = 0
w_class = WEIGHT_CLASS_HUGE
flags = CONDUCT
+17 -16
View File
@@ -1,4 +1,4 @@
/obj/item/device/assembly/signaler
/obj/item/assembly/signaler
name = "remote signaling device"
desc = "Used to remotely activate devices."
icon_state = "signaller"
@@ -18,25 +18,26 @@
var/datum/radio_frequency/radio_connection
var/airlock_wire = null
/obj/item/device/assembly/signaler/New()
/obj/item/assembly/signaler/New()
..()
if(radio_controller)
set_frequency(frequency)
/obj/item/device/assembly/signaler/initialize()
/obj/item/assembly/signaler/Initialize()
..()
if(radio_controller)
set_frequency(frequency)
/obj/item/device/assembly/signaler/Destroy()
/obj/item/assembly/signaler/Destroy()
if(radio_controller)
radio_controller.remove_object(src, frequency)
radio_connection = null
return ..()
/obj/item/device/assembly/signaler/describe()
/obj/item/assembly/signaler/describe()
return "\The [src]'s power light is [receiving?"on":"off"]"
/obj/item/device/assembly/signaler/activate()
/obj/item/assembly/signaler/activate()
if(cooldown > 0) return 0
cooldown = 2
spawn(10)
@@ -45,12 +46,12 @@
signal()
return 1
/obj/item/device/assembly/signaler/update_icon()
/obj/item/assembly/signaler/update_icon()
if(holder)
holder.update_icon()
return
/obj/item/device/assembly/signaler/interact(mob/user as mob, flag1)
/obj/item/assembly/signaler/interact(mob/user as mob, flag1)
var/t1 = "-------"
// if((src.b_stat && !( flag1 )))
// t1 = text("-------<BR>\nGreen Wire: []<BR>\nRed Wire: []<BR>\nBlue Wire: []<BR>\n", (src.wires & 4 ? "<A href='?src=[UID()];wires=4'>Cut Wire</A>" : "<A href='?src=[UID()];wires=4'>Mend Wire</A>"), (src.wires & 2 ? "<A href='?src=[UID()];wires=2'>Cut Wire</A>" : "<A href='?src=[UID()];wires=2'>Mend Wire</A>"), (src.wires & 1 ? "<A href='?src=[UID()];wires=1'>Cut Wire</A>" : "<A href='?src=[UID()];wires=1'>Mend Wire</A>"))
@@ -89,7 +90,7 @@
return
/obj/item/device/assembly/signaler/Topic(href, href_list)
/obj/item/assembly/signaler/Topic(href, href_list)
..()
if(!usr.canmove || usr.stat || usr.restrained() || !in_range(loc, usr))
@@ -120,7 +121,7 @@
return
/obj/item/device/assembly/signaler/proc/signal()
/obj/item/assembly/signaler/proc/signal()
if(!radio_connection) return
var/datum/signal/signal = new
@@ -136,13 +137,13 @@
return
/obj/item/device/assembly/signaler/pulse(var/radio = 0)
/obj/item/assembly/signaler/pulse(var/radio = 0)
if(src.connected && src.wires)
connected.Pulse(src)
else
return ..(radio)
/obj/item/device/assembly/signaler/receive_signal(datum/signal/signal)
/obj/item/assembly/signaler/receive_signal(datum/signal/signal)
if( !receiving || !signal )
return 0
@@ -156,7 +157,7 @@
O.show_message("[bicon(src)] *beep* *beep*", 3, "*beep* *beep*", 2)
return
/obj/item/device/assembly/signaler/proc/set_frequency(new_frequency)
/obj/item/assembly/signaler/proc/set_frequency(new_frequency)
if(!radio_controller)
sleep(20)
if(!radio_controller)
@@ -167,17 +168,17 @@
return
// Embedded signaller used in anomalies.
/obj/item/device/assembly/signaler/anomaly
/obj/item/assembly/signaler/anomaly
name = "anomaly core"
desc = "The neutralized core of an anomaly. It'd probably be valuable for research."
icon_state = "anomaly core"
item_state = "electronic"
receiving = 1
/obj/item/device/assembly/signaler/anomaly/receive_signal(datum/signal/signal)
/obj/item/assembly/signaler/anomaly/receive_signal(datum/signal/signal)
..()
for(var/obj/effect/anomaly/A in orange(0, src))
A.anomalyNeutralize()
/obj/item/device/assembly/signaler/anomaly/attack_self()
/obj/item/assembly/signaler/anomaly/attack_self()
return
+2 -2
View File
@@ -1,4 +1,4 @@
/obj/item/device/assembly/timer
/obj/item/assembly/timer
name = "timer"
desc = "Used to time things. Works well with contraptions which has to count down. Tick tock."
icon_state = "timer"
@@ -112,7 +112,7 @@
if(href_list["time"])
timing = !timing
if(timing && istype(holder, /obj/item/device/transfer_valve))
if(timing && istype(holder, /obj/item/transfer_valve))
message_admins("[key_name_admin(usr)] activated [src] attachment on [holder].")
bombers += "[key_name(usr)] activated [src] attachment for [loc]"
log_game("[key_name(usr)] activated [src] attachment for [loc]")
+1 -1
View File
@@ -1,4 +1,4 @@
/obj/item/device/assembly/voice
/obj/item/assembly/voice
name = "voice analyzer"
desc = "A small electronic device able to record a voice sample, and send a signal when that sample is repeated."
icon_state = "voice"
+16 -15
View File
@@ -29,7 +29,8 @@
var/brute_damage = 0
var/oxy_damage = 0
/obj/effect/landmark/corpse/initialize()
/obj/effect/landmark/corpse/Initialize()
..()
if(istype(src,/obj/effect/landmark/corpse/clown))
var/obj/effect/landmark/corpse/clown/C = src
C.chooseRank()
@@ -103,7 +104,7 @@
corpsesuit = /obj/item/clothing/suit/armor/vest
corpseshoes = /obj/item/clothing/shoes/combat
corpsegloves = /obj/item/clothing/gloves/combat
corpseradio = /obj/item/device/radio/headset
corpseradio = /obj/item/radio/headset
corpsemask = /obj/item/clothing/mask/gas
corpsehelmet = /obj/item/clothing/head/helmet/swat
corpseback = /obj/item/storage/backpack
@@ -119,7 +120,7 @@
corpsesuit = /obj/item/clothing/suit/space/hardsuit/syndi
corpseshoes = /obj/item/clothing/shoes/magboots/syndie
corpsegloves = /obj/item/clothing/gloves/combat
corpseradio = /obj/item/device/radio/headset
corpseradio = /obj/item/radio/headset
corpsemask = /obj/item/clothing/mask/gas/syndicate
corpsehelmet = /obj/item/clothing/head/helmet/space/hardsuit/syndi
corpseback = /obj/item/tank/jetpack/oxygen
@@ -139,7 +140,7 @@
corpseshoes = /obj/item/clothing/shoes/black
corpsehelmet = /obj/item/clothing/head/chefhat
corpseback = /obj/item/storage/backpack
corpseradio = /obj/item/device/radio/headset
corpseradio = /obj/item/radio/headset
corpseid = 1
corpseidjob = "Chef"
corpseidaccess = "Chef"
@@ -147,11 +148,11 @@
/obj/effect/landmark/corpse/doctor
name = "Doctor"
corpseradio = /obj/item/device/radio/headset/headset_med
corpseradio = /obj/item/radio/headset/headset_med
corpseuniform = /obj/item/clothing/under/rank/medical
corpsesuit = /obj/item/clothing/suit/storage/labcoat
corpseback = /obj/item/storage/backpack/medic
corpsepocket1 = /obj/item/device/flashlight/pen
corpsepocket1 = /obj/item/flashlight/pen
corpseshoes = /obj/item/clothing/shoes/black
corpseid = 1
corpseidjob = "Medical Doctor"
@@ -159,7 +160,7 @@
/obj/effect/landmark/corpse/engineer
name = "Engineer"
corpseradio = /obj/item/device/radio/headset/headset_eng
corpseradio = /obj/item/radio/headset/headset_eng
corpseuniform = /obj/item/clothing/under/rank/engineer
corpseback = /obj/item/storage/backpack/industrial
corpseshoes = /obj/item/clothing/shoes/workboots
@@ -183,7 +184,7 @@
corpseuniform = /obj/item/clothing/under/officeruniform
corpsesuit = /obj/item/clothing/suit/officercoat
corpseshoes = /obj/item/clothing/shoes/clown_shoes
corpseradio = /obj/item/device/radio/headset
corpseradio = /obj/item/radio/headset
corpsemask = /obj/item/clothing/mask/gas/clown_hat
corpsepocket1 = /obj/item/bikehorn
corpseback = /obj/item/storage/backpack/clown
@@ -197,7 +198,7 @@
corpseuniform = /obj/item/clothing/under/soldieruniform
corpsesuit = /obj/item/clothing/suit/soldiercoat
corpseshoes = /obj/item/clothing/shoes/clown_shoes
corpseradio = /obj/item/device/radio/headset
corpseradio = /obj/item/radio/headset
corpsemask = /obj/item/clothing/mask/gas/clown_hat
corpsepocket1 = /obj/item/bikehorn
corpseback = /obj/item/storage/backpack/clown
@@ -211,7 +212,7 @@
name = "Clown King"
corpseuniform = /obj/item/clothing/under/rank/clown
corpseshoes = /obj/item/clothing/shoes/clown_shoes
corpseradio = /obj/item/device/radio/headset
corpseradio = /obj/item/radio/headset
corpsemask = /obj/item/clothing/mask/gas/clown_hat
corpsehelmet = /obj/item/clothing/head/crown
corpsepocket1 = /obj/item/bikehorn
@@ -226,7 +227,7 @@
name = "Mime"
corpseuniform = /obj/item/clothing/under/mime
corpseshoes = /obj/item/clothing/shoes/black
corpseradio = /obj/item/device/radio/headset
corpseradio = /obj/item/radio/headset
corpsemask = /obj/item/clothing/mask/gas/mime
corpseback = /obj/item/storage/backpack
corpseid = 1
@@ -236,7 +237,7 @@
/obj/effect/landmark/corpse/scientist
name = "Scientist"
corpseradio = /obj/item/device/radio/headset/headset_sci
corpseradio = /obj/item/radio/headset/headset_sci
corpseuniform = /obj/item/clothing/under/rank/scientist
corpsesuit = /obj/item/clothing/suit/storage/labcoat/science
corpseback = /obj/item/storage/backpack
@@ -246,7 +247,7 @@
corpseidaccess = "Scientist"
/obj/effect/landmark/corpse/miner
corpseradio = /obj/item/device/radio/headset/headset_cargo
corpseradio = /obj/item/radio/headset/headset_cargo
corpseuniform = /obj/item/clothing/under/rank/miner
corpsegloves = /obj/item/clothing/gloves/fingerless
corpseback = /obj/item/storage/backpack/industrial
@@ -265,7 +266,7 @@
/obj/effect/landmark/corpse/bridgeofficer
name = "Bridge Officer"
corpseradio = /obj/item/device/radio/headset/heads/hop
corpseradio = /obj/item/radio/headset/heads/hop
corpseuniform = /obj/item/clothing/under/rank/centcom_officer
corpsesuit = /obj/item/clothing/suit/armor/bulletproof
corpseshoes = /obj/item/clothing/shoes/black
@@ -278,7 +279,7 @@
name = "Commander"
corpseuniform = /obj/item/clothing/under/rank/centcom_commander
corpsesuit = /obj/item/clothing/suit/armor/bulletproof
corpseradio = /obj/item/device/radio/headset/heads/captain
corpseradio = /obj/item/radio/headset/heads/captain
corpseglasses = /obj/item/clothing/glasses/eyepatch
corpsemask = /obj/item/clothing/mask/cigarette/cigar/cohiba
corpsehelmet = /obj/item/clothing/head/centhat
+7 -7
View File
@@ -9,7 +9,7 @@ var/obj/machinery/gateway/centerstation/the_gateway = null
unacidable = 1
var/active = 0
/obj/machinery/gateway/initialize()
/obj/machinery/gateway/Initialize()
..()
update_icon()
update_density_from_dir()
@@ -44,7 +44,7 @@ var/obj/machinery/gateway/centerstation/the_gateway = null
if(!the_gateway)
the_gateway = src
/obj/machinery/gateway/centerstation/initialize()
/obj/machinery/gateway/centerstation/Initialize()
..()
update_icon()
wait = world.time + config.gateway_delay //+ thirty minutes default
@@ -152,8 +152,8 @@ var/obj/machinery/gateway/centerstation/the_gateway = null
return
/obj/machinery/gateway/centerstation/attackby(obj/item/device/W as obj, mob/user as mob, params)
if(istype(W,/obj/item/device/multitool))
/obj/machinery/gateway/centerstation/attackby(obj/item/W as obj, mob/user as mob, params)
if(istype(W,/obj/item/multitool))
to_chat(user, "The gate is already calibrated, there is no work for you to do here.")
return
@@ -170,7 +170,7 @@ var/obj/machinery/gateway/centerstation/the_gateway = null
var/obj/machinery/gateway/centeraway/stationgate = null
/obj/machinery/gateway/centeraway/initialize()
/obj/machinery/gateway/centeraway/Initialize()
..()
update_icon()
stationgate = locate(/obj/machinery/gateway/centerstation) in world
@@ -258,8 +258,8 @@ var/obj/machinery/gateway/centerstation/the_gateway = null
return 1
return 0
/obj/machinery/gateway/centeraway/attackby(obj/item/device/W as obj, mob/user as mob, params)
if(istype(W,/obj/item/device/multitool))
/obj/machinery/gateway/centeraway/attackby(obj/item/W as obj, mob/user as mob, params)
if(istype(W,/obj/item/multitool))
if(calibrated)
to_chat(user, "<span class='notice'>The gate is already calibrated, there is no work for you to do here.</span>")
return
+2 -1
View File
@@ -5,7 +5,8 @@
var/lootdoubles = 0 //if the same item can be spawned twice
var/loot = "" //a list of possible items to spawn- a string of paths
/obj/effect/spawner/away/lootdrop/initialize()
/obj/effect/spawner/away/lootdrop/Initialize()
..()
var/list/things = params2list(loot)
if(things && things.len)
+2 -7
View File
@@ -18,13 +18,8 @@
template_name = tname
if(template_name)
template = map_templates[template_name]
// Catches the interim-zone of worldstart and roundstart
// I want both the ticker to exist (so mapped-in maploaders don't trip this)
// but also not have started yet (since the zlevel system would handle this on its own otherwise)
if((ticker && ticker.current_state < GAME_STATE_PLAYING))
attempt_init()
/obj/effect/landmark/map_loader/initialize()
/obj/effect/landmark/map_loader/Initialize()
..()
if(template)
load(template)
@@ -48,7 +43,7 @@
/obj/effect/landmark/map_loader/random
var/template_list = ""
/obj/effect/landmark/map_loader/random/initialize()
/obj/effect/landmark/map_loader/random/Initialize()
..()
if(template_list)
template_name = safepick(splittext(template_list, ";"))
@@ -422,13 +422,6 @@ var/global/dmm_suite/preloader/_preloader = new
return to_return
//atom creation method that preloads variables at creation
/atom/New()
if(use_preloader && (src.type == _preloader.target_path))//in case the instanciated atom is creating other atoms in New()
_preloader.load(src)
. = ..()
/dmm_suite/Destroy()
..()
return QDEL_HINT_HARDDEL_NOW
@@ -584,7 +584,7 @@ proc/SwapMaps_CreateFromTemplate(template_id)
else if(swapmaps_mode!=SWAPMAPS_TEXT && fexists("map_[template_id].txt"))
text=1
else
log_to_dd("SwapMaps error in SwapMaps_CreateFromTemplate(): map_[template_id] file not found.")
log_world("SwapMaps error in SwapMaps_CreateFromTemplate(): map_[template_id] file not found.")
return
if(text)
S=new
@@ -611,7 +611,7 @@ proc/SwapMaps_LoadChunk(chunk_id,turf/locorner)
else if(swapmaps_mode!=SWAPMAPS_TEXT && fexists("map_[chunk_id].txt"))
text=1
else
log_to_dd("SwapMaps error in SwapMaps_LoadChunk(): map_[chunk_id] file not found.")
log_world("SwapMaps error in SwapMaps_LoadChunk(): map_[chunk_id] file not found.")
return
if(text)
S=new
@@ -629,9 +629,9 @@ proc/SwapMaps_LoadChunk(chunk_id,turf/locorner)
proc/SwapMaps_SaveChunk(chunk_id,turf/corner1,turf/corner2)
if(!corner1 || !corner2)
log_to_dd("SwapMaps error in SwapMaps_SaveChunk():")
if(!corner1) log_to_dd(" corner1 turf is null")
if(!corner2) log_to_dd(" corner2 turf is null")
log_world("SwapMaps error in SwapMaps_SaveChunk():")
if(!corner1) log_world(" corner1 turf is null")
if(!corner2) log_world(" corner2 turf is null")
return
var/swapmap/M=new
M.id=chunk_id
@@ -658,7 +658,7 @@ proc/SwapMaps_GetSize(id)
else if(swapmaps_mode!=SWAPMAPS_TEXT && fexists("map_[id].txt"))
text=1
else
log_to_dd("SwapMaps error in SwapMaps_GetSize(): map_[id] file not found.")
log_world("SwapMaps error in SwapMaps_GetSize(): map_[id] file not found.")
return
if(text)
S=new
@@ -12,7 +12,7 @@
var/water_timer = 0
/obj/effect/waterfall/New()
water_timer = addtimer(src, "drip", water_frequency)
water_timer = addtimer(CALLBACK(src, .proc/drip), water_frequency, TIMER_STOPPABLE)
/obj/effect/waterfall/Destroy()
if(water_timer)
@@ -25,4 +25,4 @@
W.dir = dir
spawn(1)
W.loc = get_step(W, dir)
water_timer = addtimer(src, "drip", water_frequency)
water_timer = addtimer(CALLBACK(src, .proc/drip), water_frequency, TIMER_STOPPABLE)
@@ -54,7 +54,7 @@
name = "space hotel pamphlet"
info = "<h3>Welcome to Deep Space Hotel 419!</h3>Thank you for choosing our hotel. Simply hand your credit or debit card to the concierge and get your room key! To check out, hand your credit card back.<small><h4>Conditions:</h4><ul><li>The hotel is not responsible for any losses due to time or space anomalies.<li>The hotel is not responsible for events that occur outside of the hotel station, including, but not limited to, events that occur inside of dimensional pockets.<li>The hotel is not responsible for overcharging your account.<li>The hotel is not responsible for missing persons.<li>The hotel is not responsible for mind-altering effects due to drugs, magic, demons, or space worms.</ul></small>"
/obj/effect/landmark/map_loader/hotel_room/initialize()
/obj/effect/landmark/map_loader/hotel_room/Initialize()
..()
// load and randomly assign rooms
var/global/list/south_room_templates = list()
@@ -194,7 +194,7 @@
var/list/vacant_rooms[0] // list of vacant room doors
var/list/guests[0] // assoc list of [guest mob]=room id
var/obj/item/device/radio/radio // for shouting at deadbeats
var/obj/item/radio/radio // for shouting at deadbeats
/obj/effect/hotel_controller/New()
..()
@@ -238,7 +238,7 @@
return null
D.occupant = occupant
D.roomtimer = addtimer(src, "process_room", PAY_INTERVAL, 0, roomid)
D.roomtimer = addtimer(CALLBACK(src, .proc/process_room, roomid), PAY_INTERVAL, TIMER_STOPPABLE)
vacant_rooms -= D
guests[occupant] = roomid
@@ -252,7 +252,7 @@
return
if(D.account.charge(100, transaction_purpose = "10 minutes", dest_name = name))
D.roomtimer = addtimer(src, "process_room", PAY_INTERVAL, 0, roomid)
D.roomtimer = addtimer(CALLBACK(src, .proc/process_room, roomid), PAY_INTERVAL, TIMER_STOPPABLE)
else
force_checkout(roomid)
@@ -148,7 +148,7 @@ var/sc_safecode5 = "[rand(0,9)]"
l_code = "[sc_safecode1][sc_safecode2][sc_safecode3][sc_safecode4][sc_safecode5]"
l_set = 1
new /obj/item/gun/energy/mindflayer(src)
new /obj/item/device/soulstone(src)
new /obj/item/soulstone(src)
new /obj/item/clothing/head/helmet/space/cult(src)
new /obj/item/clothing/suit/space/cult(src)
//new /obj/item/teleportation_scroll(src)
@@ -217,14 +217,15 @@
C.update_canmove()
return 1
/obj/item/device/wildwest_communicator
/obj/item/wildwest_communicator
name = "Syndicate Comms Device"
icon = 'icons/obj/device.dmi'
icon_state = "gangtool-red"
item_state = "walkietalkie"
desc = "Use to communicate with the syndicate base commander."
var/used = FALSE
/obj/item/device/wildwest_communicator/attack_self(mob/living/user)
/obj/item/wildwest_communicator/attack_self(mob/living/user)
if(!is_away_level(user.z))
to_chat(user, "<span class='warning'>The communicator emits a faint beep. Perhaps it is out of range?</span>")
@@ -270,7 +271,7 @@
stand_down()
used = TRUE
/obj/item/device/wildwest_communicator/proc/stand_down()
/obj/item/wildwest_communicator/proc/stand_down()
for(var/mob/living/simple_animal/hostile/syndicate/ranged/wildwest/W in living_mob_list)
W.on_alert = FALSE
+4 -4
View File
@@ -57,7 +57,7 @@ var/global/list/potentialRandomZlevels = generateMapList(filename = "config/away
maploader.load_map(file, z_offset = zlev)
late_setup_level(block(locate(1, 1, zlev), locate(world.maxx, world.maxy, zlev)))
space_manager.remove_dirt(zlev)
log_to_dd(" Away mission loaded: [map]")
log_world(" Away mission loaded: [map]")
for(var/obj/effect/landmark/L in landmarks_list)
if(L.name != "awaystart")
@@ -88,7 +88,7 @@ var/global/list/potentialRandomZlevels = generateMapList(filename = "config/away
maploader.load_map(file, z_offset = zlev)
late_setup_level(block(locate(1, 1, zlev), locate(world.maxx, world.maxy, zlev)))
space_manager.remove_dirt(zlev)
log_to_dd(" Away mission loaded: [map]")
log_world(" Away mission loaded: [map]")
//map_transition_config.Add(AWAY_MISSION_LIST)
@@ -168,7 +168,7 @@ var/global/list/potentialRandomZlevels = generateMapList(filename = "config/away
if(!valid)
continue
log_to_dd(" Ruin \"[ruin.name]\" loaded in [stop_watch(watch)]s at ([T.x], [T.y], [T.z]).")
log_world(" Ruin \"[ruin.name]\" loaded in [stop_watch(watch)]s at ([T.x], [T.y], [T.z]).")
var/obj/effect/ruin_loader/R = new /obj/effect/ruin_loader(T)
R.Load(ruins,ruin)
@@ -179,7 +179,7 @@ var/global/list/potentialRandomZlevels = generateMapList(filename = "config/away
if(initialbudget == budget) //Kill me
log_to_dd(" No ruins loaded.")
log_world(" No ruins loaded.")
/obj/effect/ruin_loader
+2 -2
View File
@@ -22,7 +22,7 @@
..()
levels += src
/obj/effect/levelref/initialize()
/obj/effect/levelref/Initialize()
..()
for(var/obj/effect/levelref/O in levels)
if(id == O.id && O != src)
@@ -161,7 +161,7 @@
..()
portals += src
/obj/effect/view_portal/initialize()
/obj/effect/view_portal/Initialize()
..()
if(id)
for(var/obj/effect/view_portal/O in portals)
+6 -6
View File
@@ -65,7 +65,7 @@
//search the href for script injection
if( findtext(href,"<script",1,0) )
log_to_dd("Attempted use of scripts within a topic call, by [src]")
log_world("Attempted use of scripts within a topic call, by [src]")
log_runtime(EXCEPTION("Attempted use of scripts within a topic call, by [src]"), src)
message_admins("Attempted use of scripts within a topic call, by [src]")
return
@@ -94,8 +94,8 @@
//Logs all hrefs
if(config && config.log_hrefs && href_logfile)
to_chat(href_logfile, "<small>[time2text(world.timeofday,"hh:mm")] [src] (usr:[usr])</small> || [hsrc ? "[hsrc] " : ""][href]<br>")
if(config && config.log_hrefs)
log_href("[src] (usr:[usr]\[[COORD(usr)]\]) : [hsrc ? "[hsrc] " : ""][href]")
if(href_list["karmashop"])
if(config.disable_karma)
@@ -559,7 +559,7 @@
//Log all the alts
if(related_accounts_cid.len)
log_access("Alts: [key_name(src)]:[jointext(related_accounts_cid, " - ")]")
log_admin("[key_name(src)] alts:[jointext(related_accounts_cid, " - ")]")
var/watchreason = check_watchlist(ckey)
@@ -668,7 +668,7 @@
cidcheck_failedckeys[ckey] = TRUE
note_randomizer_user()
log_access("Failed Login: [key] [computer_id] [address] - CID randomizer confirmed (oldcid: [oldcid])")
log_adminwarn("Failed Login: [key] [computer_id] [address] - CID randomizer confirmed (oldcid: [oldcid])")
del(src)
return TRUE
@@ -710,7 +710,7 @@
/client/proc/cid_check_reconnect()
var/token = md5("[rand(0,9999)][world.time][rand(0,9999)][ckey][rand(0,9999)][address][rand(0,9999)][computer_id][rand(0,9999)]")
. = token
log_access("Failed Login: [key] [computer_id] [address] - CID randomizer check")
log_adminwarn("Failed Login: [key] [computer_id] [address] - CID randomizer check")
var/url = winget(src, null, "url")
//special javascript to make them reconnect under a new window.
src << browse("<a id='link' href='byond://[url]?token=[token]'>\
@@ -152,3 +152,7 @@
/datum/gear/hat/flowerpin
display_name = "hair flower"
path = /obj/item/clothing/head/hairflower
/datum/gear/hat/kitty
display_name = "kitty headband"
path = /obj/item/clothing/head/kitty
+1 -1
View File
@@ -550,7 +550,7 @@ BLIND // can't see anything
permeability_coefficient = 0.02
flags = STOPSPRESSUREDMAGE | THICKMATERIAL
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
allowed = list(/obj/item/device/flashlight,/obj/item/tank)
allowed = list(/obj/item/flashlight,/obj/item/tank)
slowdown = 1
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 50)
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAIL
+3 -3
View File
@@ -36,9 +36,9 @@
w_class = WEIGHT_CLASS_NORMAL
allowed = list(/obj/item/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/melee/baton,/obj/item/melee/energy/sword/saber,/obj/item/restraints/handcuffs,/obj/item/tank)
armor = list(melee = 45, bullet = 25, laser = 30, energy = 10, bomb = 25, bio = 100, rad = 50)
allowed = list(/obj/item/device/flashlight, /obj/item/tank, /obj/item/device/t_scanner, /obj/item/rcd, /obj/item/crowbar, \
/obj/item/screwdriver, /obj/item/weldingtool, /obj/item/wirecutters, /obj/item/wrench, /obj/item/device/multitool, \
/obj/item/device/radio, /obj/item/device/analyzer, /obj/item/gun/energy/laser, /obj/item/gun/energy/pulse, \
allowed = list(/obj/item/flashlight, /obj/item/tank, /obj/item/t_scanner, /obj/item/rcd, /obj/item/crowbar, \
/obj/item/screwdriver, /obj/item/weldingtool, /obj/item/wirecutters, /obj/item/wrench, /obj/item/multitool, \
/obj/item/radio, /obj/item/analyzer, /obj/item/gun/energy/laser, /obj/item/gun/energy/pulse, \
/obj/item/gun/energy/gun/advtaser, /obj/item/melee/baton, /obj/item/gun/energy/gun)
strip_delay = 130
species_fit = list("Drask")
+7 -7
View File
@@ -6,7 +6,7 @@
item_state = "eng_helm"
hardsuit_restrict_helmet = 1
armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 75)
allowed = list(/obj/item/device/flashlight)
allowed = list(/obj/item/flashlight)
var/brightness_on = 4 //luminosity when on
var/on = 0
item_color = "engineering" //Determines used sprites: hardsuit[on]-[color] and hardsuit[on]-[color]2 (lying down sprite)
@@ -67,7 +67,7 @@
icon_state = "hardsuit-engineering"
item_state = "eng_hardsuit"
armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 75)
allowed = list(/obj/item/device/flashlight,/obj/item/tank,/obj/item/device/t_scanner, /obj/item/rcd)
allowed = list(/obj/item/flashlight,/obj/item/tank,/obj/item/t_scanner, /obj/item/rcd)
siemens_coefficient = 0
species_restricted = list("exclude","Diona","Wryn")
@@ -261,7 +261,7 @@
icon_state = "hardsuit-engineering"
item_state = "eng_hardsuit"
armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 75)
allowed = list(/obj/item/device/flashlight,/obj/item/tank,/obj/item/device/t_scanner, /obj/item/rcd)
allowed = list(/obj/item/flashlight,/obj/item/tank,/obj/item/t_scanner, /obj/item/rcd)
//Chief Engineer's hardsuit
/obj/item/clothing/head/helmet/space/hardsuit/elite
@@ -298,7 +298,7 @@
desc = "A special suit that protects against hazardous, low pressure environments. Has reinforced plating."
item_state = "mining_hardsuit"
armor = list(melee = 30, bullet = 5, laser = 10, energy = 5, bomb = 50, bio = 100, rad = 50)
allowed = list(/obj/item/device/flashlight,/obj/item/tank,/obj/item/storage/bag/ore,/obj/item/pickaxe)
allowed = list(/obj/item/flashlight,/obj/item/tank,/obj/item/storage/bag/ore,/obj/item/pickaxe)
//Syndicate hardsuit
@@ -496,7 +496,7 @@
name = "medical hardsuit"
desc = "A special helmet designed for work in a hazardous, low pressure environment. Built with lightweight materials for extra comfort."
item_state = "medical_hardsuit"
allowed = list(/obj/item/device/flashlight,/obj/item/tank,/obj/item/storage/firstaid,/obj/item/device/healthanalyzer,/obj/item/stack/medical,/obj/item/device/rad_laser)
allowed = list(/obj/item/flashlight,/obj/item/tank,/obj/item/storage/firstaid,/obj/item/healthanalyzer,/obj/item/stack/medical,/obj/item/rad_laser)
armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 50)
//Security
@@ -514,7 +514,7 @@
desc = "A special suit that protects against hazardous, low pressure environments. Has an additional layer of armor."
item_state = "sec_hardsuit"
armor = list(melee = 30, bullet = 15, laser = 30, energy = 10, bomb = 10, bio = 100, rad = 50)
allowed = list(/obj/item/gun,/obj/item/device/flashlight,/obj/item/tank,/obj/item/melee/baton,/obj/item/reagent_containers/spray/pepper,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/restraints/handcuffs)
allowed = list(/obj/item/gun,/obj/item/flashlight,/obj/item/tank,/obj/item/melee/baton,/obj/item/reagent_containers/spray/pepper,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/restraints/handcuffs)
//Atmospherics hardsuit (BS12)
@@ -577,7 +577,7 @@
name = "shielded hardsuit"
desc = "A hardsuit with built in energy shielding. Will rapidly recharge when not under fire."
icon_state = "hardsuit-hos"
allowed = list(/obj/item/device/flashlight,/obj/item/tank, /obj/item/gun,/obj/item/reagent_containers/spray/pepper,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/melee/baton,/obj/item/restraints/handcuffs)
allowed = list(/obj/item/flashlight,/obj/item/tank, /obj/item/gun,/obj/item/reagent_containers/spray/pepper,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/melee/baton,/obj/item/restraints/handcuffs)
armor = list(melee = 30, bullet = 15, laser = 30, energy = 10, bomb = 10, bio = 100, rad = 50)
var/current_charges = 3
var/max_charges = 3 //How many charges total the shielding has
@@ -29,7 +29,7 @@
icon_state = "caparmor"
item_state = "capspacesuit"
w_class = WEIGHT_CLASS_BULKY
allowed = list(/obj/item/tank, /obj/item/device/flashlight,/obj/item/gun/energy, /obj/item/gun/projectile, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton,/obj/item/restraints/handcuffs)
allowed = list(/obj/item/tank, /obj/item/flashlight,/obj/item/gun/energy, /obj/item/gun/projectile, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton,/obj/item/restraints/handcuffs)
armor = list(melee = 40, bullet = 50, laser = 50, energy = 25, bomb = 50, bio = 100, rad = 50)
species_restricted = list("exclude", "Diona", "Wryn")
species_fit = list("Vox")
+11 -1
View File
@@ -391,10 +391,20 @@
name = "blood red plasmaman suit"
icon_state = "plasmaman_Nukeops"
armor = list(melee = 60, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 50)
allowed = list(/obj/item/device/flashlight,/obj/item/tank,/obj/item/gun,/obj/item/ammo_casing,/obj/item/ammo_casing,/obj/item/melee/baton,/obj/item/melee/energy/sword/saber,/obj/item/restraints/handcuffs)
allowed = list(/obj/item/flashlight,/obj/item/tank,/obj/item/gun,/obj/item/ammo_casing,/obj/item/ammo_casing,/obj/item/melee/baton,/obj/item/melee/energy/sword/saber,/obj/item/restraints/handcuffs)
/obj/item/clothing/head/helmet/space/eva/plasmaman/nuclear
name = "blood red plasmaman helmet"
icon_state = "plasmaman_Nukeops_helmet0"
base_state = "plasmaman_Nukeops_helmet"
armor = list(melee = 60, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 50)
//WIZARD
/obj/item/clothing/suit/space/eva/plasmaman/wizard
name = "robed plasmaman suit"
icon_state = "plasmamanWizardBlue_suit"
/obj/item/clothing/head/helmet/space/eva/plasmaman/wizard
name = "wizard hat"
icon_state = "plasmamanWizardBlue_helmet0"
base_state = "plasmamanWizardBlue_helmet"
@@ -14,7 +14,7 @@
icon_state = "flash"
interface_name = "mounted flash"
interface_desc = "Stuns your target by blinding them with a bright light."
device_type = /obj/item/device/flash
device_type = /obj/item/flash
/obj/item/rig_module/grenade_launcher
@@ -74,14 +74,14 @@
else
target_ai = locate(/mob/living/silicon/ai) in input_device.contents
var/obj/item/device/aicard/card = ai_card
var/obj/item/aicard/card = ai_card
// Downloading from/loading to a terminal.
if(istype(input_device,/obj/machinery/computer/aifixer) || istype(input_device,/mob/living/silicon/ai) || istype(input_device,/obj/structure/AIcore/deactivated))
// If we're stealing an AI, make sure we have a card for it.
if(!card)
card = new /obj/item/device/aicard(src)
card = new /obj/item/aicard(src)
// Terminal interaction only works with an intellicarded AI.
if(!istype(card))
@@ -99,10 +99,10 @@
update_verb_holder()
return 1
if(istype(input_device,/obj/item/device/aicard))
if(istype(input_device,/obj/item/aicard))
// We are carding the AI in our suit.
if(integrated_ai)
var/obj/item/device/aicard/ext_card = input_device
var/obj/item/aicard/ext_card = input_device
ext_card.afterattack(integrated_ai, user, 1)
// If the transfer was successful, we can clear out our vars.
if(integrated_ai.loc != src)
@@ -116,7 +116,7 @@
return 1
// Okay, it wasn't a terminal being touched, check for all the simple insertions.
if(input_device.type in list(/obj/item/device/paicard, /obj/item/device/mmi, /obj/item/device/mmi/posibrain))
if(input_device.type in list(/obj/item/paicard, /obj/item/mmi, /obj/item/mmi/posibrain))
if(integrated_ai)
integrated_ai.attackby(input_device,user)
// If the transfer was successful, we can clear out our vars.
@@ -138,7 +138,7 @@
if(!target)
if(ai_card)
if(istype(ai_card,/obj/item/device/aicard))
if(istype(ai_card,/obj/item/aicard))
ai_card.ui_interact(H, state = deep_inventory_state)
else
eject_ai(H)
@@ -157,7 +157,7 @@
/obj/item/rig_module/ai_container/proc/eject_ai(var/mob/user)
if(ai_card)
if(istype(ai_card, /obj/item/device/aicard))
if(istype(ai_card, /obj/item/aicard))
if(integrated_ai && !integrated_ai.stat)
if(user)
to_chat(user, "<span class='danger'>You cannot eject your currently stored AI. Purge it manually.</span>")
@@ -182,14 +182,14 @@
var/mob/living/ai_mob = locate(/mob/living) in ai.contents
if(ai_mob)
if(ai_mob.key && ai_mob.client)
if(istype(ai, /obj/item/device/aicard))
if(istype(ai, /obj/item/aicard))
var/mob/living/silicon/ai/ROBUTT = ai_mob
if(istype(ROBUTT))
if(!ai_card)
ai_card = new /obj/item/device/aicard(src)
ai_card = new /obj/item/aicard(src)
var/obj/item/device/aicard/source_card = ai
var/obj/item/device/aicard/target_card = ai_card
var/obj/item/aicard/source_card = ai
var/obj/item/aicard/target_card = ai_card
if(istype(source_card) && istype(target_card))
ROBUTT.forceMove(target_card)
ROBUTT.aiRestorePowerRoutine = 0//So the AI initially has power.
@@ -10,7 +10,7 @@
deactivate_string = "Retract"
var/device_type
var/obj/item/device
var/obj/item
/obj/item/rig_module/handheld/activate()
if(!..())
@@ -46,7 +46,7 @@
interface_name = "health scanner"
interface_desc = "Shows an informative health readout when used on a subject."
device_type = /obj/item/device/healthanalyzer
device_type = /obj/item/healthanalyzer
/obj/item/rig_module/device/drill
name = "hardsuit drill mount"
@@ -67,7 +67,7 @@
engage_string = "Begin Scan"
usable = 1
selectable = 0
device_type = /obj/item/device/mining_scanner
device_type = /obj/item/mining_scanner
/*
/obj/item/rig_module/device/rcd
name = "RCD mount"
@@ -43,7 +43,7 @@
if(open)
// Hacking.
if(istype(W,/obj/item/wirecutters) || istype(W,/obj/item/device/multitool))
if(istype(W,/obj/item/wirecutters) || istype(W,/obj/item/multitool))
if(open)
wires.Interact(user)
else
@@ -71,7 +71,7 @@
/obj/item/clothing/suit/space/new_rig
name = "chestpiece"
allowed = list(/obj/item/device/flashlight,/obj/item/tank)
allowed = list(/obj/item/flashlight,/obj/item/tank)
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
cold_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
@@ -122,7 +122,7 @@
/obj/item/clothing/suit/lightrig
name = "suit"
allowed = list(/obj/item/device/flashlight)
allowed = list(/obj/item/flashlight)
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
cold_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
@@ -11,7 +11,7 @@
offline_vision_restriction = 1
helm_type = /obj/item/clothing/head/helmet/space/new_rig/combat
allowed = list(/obj/item/gun,/obj/item/device/flashlight,/obj/item/tank,/obj/item/melee/baton)
allowed = list(/obj/item/gun,/obj/item/flashlight,/obj/item/tank,/obj/item/melee/baton)
/obj/item/rig/combat/equipped
@@ -11,9 +11,9 @@
req_access = list(access_cent_specops)
armor = list(melee = 45, bullet = 25, laser = 30, energy = 10, bomb = 25, bio = 100, rad = 50)
allowed = list(/obj/item/device/flashlight, /obj/item/tank, /obj/item/device/t_scanner, /obj/item/rcd, /obj/item/crowbar, \
/obj/item/screwdriver, /obj/item/weldingtool, /obj/item/wirecutters, /obj/item/wrench, /obj/item/device/multitool, \
/obj/item/device/radio, /obj/item/device/analyzer,/obj/item/storage/briefcase/inflatable, /obj/item/melee/baton, /obj/item/gun, \
allowed = list(/obj/item/flashlight, /obj/item/tank, /obj/item/t_scanner, /obj/item/rcd, /obj/item/crowbar, \
/obj/item/screwdriver, /obj/item/weldingtool, /obj/item/wirecutters, /obj/item/wrench, /obj/item/multitool, \
/obj/item/radio, /obj/item/analyzer,/obj/item/storage/briefcase/inflatable, /obj/item/melee/baton, /obj/item/gun, \
/obj/item/storage/firstaid, /obj/item/reagent_containers/hypospray, /obj/item/roller)
initial_modules = list(
@@ -11,7 +11,7 @@
offline_vision_restriction = 1
helm_type = /obj/item/clothing/head/helmet/space/new_rig/merc
allowed = list(/obj/item/device/flashlight,/obj/item/tank,/obj/item/gun,/obj/item/ammo_casing,/obj/item/melee/baton,/obj/item/melee/energy/sword,/obj/item/restraints/handcuffs)
allowed = list(/obj/item/flashlight,/obj/item/tank,/obj/item/gun,/obj/item/ammo_casing,/obj/item/melee/baton,/obj/item/melee/energy/sword,/obj/item/restraints/handcuffs)
initial_modules = list(
/obj/item/rig_module/mounted,
@@ -21,7 +21,7 @@
offline_slowdown = 0
offline_vision_restriction = 0
allowed = list(/obj/item/device/flashlight,/obj/item/tank,/obj/item/storage/briefcase,/obj/item/storage/secure/briefcase)
allowed = list(/obj/item/flashlight,/obj/item/tank,/obj/item/storage/briefcase,/obj/item/storage/secure/briefcase)
req_access = list()
req_one_access = list()
@@ -59,7 +59,7 @@
helm_type = /obj/item/clothing/head/helmet/space/new_rig/industrial
allowed = list(/obj/item/device/flashlight,/obj/item/tank,/obj/item/storage/bag/ore,/obj/item/device/t_scanner,/obj/item/pickaxe, /obj/item/rcd)
allowed = list(/obj/item/flashlight,/obj/item/tank,/obj/item/storage/bag/ore,/obj/item/t_scanner,/obj/item/pickaxe, /obj/item/rcd)
req_access = list()
req_one_access = list()
@@ -86,7 +86,7 @@
helm_type = /obj/item/clothing/head/helmet/space/new_rig/eva
allowed = list(/obj/item/device/flashlight,/obj/item/tank,/obj/item/storage/toolbox,/obj/item/storage/briefcase/inflatable,/obj/item/device/t_scanner,/obj/item/rcd)
allowed = list(/obj/item/flashlight,/obj/item/tank,/obj/item/storage/toolbox,/obj/item/storage/briefcase/inflatable,/obj/item/t_scanner,/obj/item/rcd)
req_access = list()
req_one_access = list()
@@ -114,7 +114,7 @@
helm_type = /obj/item/clothing/head/helmet/space/new_rig/ce
allowed = list(/obj/item/device/flashlight,/obj/item/tank,/obj/item/storage/bag/ore,/obj/item/device/t_scanner,/obj/item/pickaxe, /obj/item/rcd)
allowed = list(/obj/item/flashlight,/obj/item/tank,/obj/item/storage/bag/ore,/obj/item/t_scanner,/obj/item/pickaxe, /obj/item/rcd)
req_access = list()
@@ -156,7 +156,7 @@
helm_type = /obj/item/clothing/head/helmet/space/new_rig/ert
allowed = list(/obj/item/device/flashlight,/obj/item/tank,/obj/item/pickaxe,/obj/item/device/healthanalyzer,/obj/item/device/gps,/obj/item/device/radio/beacon)
allowed = list(/obj/item/flashlight,/obj/item/tank,/obj/item/pickaxe,/obj/item/healthanalyzer,/obj/item/gps,/obj/item/radio/beacon)
req_access = list()
req_one_access = list()
@@ -181,7 +181,7 @@
helm_type = /obj/item/clothing/head/helmet/space/new_rig/medical
allowed = list(/obj/item/device/flashlight,/obj/item/tank,/obj/item/storage/firstaid,/obj/item/device/healthanalyzer,/obj/item/stack/medical,/obj/item/roller )
allowed = list(/obj/item/flashlight,/obj/item/tank,/obj/item/storage/firstaid,/obj/item/healthanalyzer,/obj/item/stack/medical,/obj/item/roller )
req_access = list()
req_one_access = list()
@@ -207,7 +207,7 @@
helm_type = /obj/item/clothing/head/helmet/space/new_rig/hazard
allowed = list(/obj/item/gun,/obj/item/device/flashlight,/obj/item/tank,/obj/item/melee/baton)
allowed = list(/obj/item/gun,/obj/item/flashlight,/obj/item/tank,/obj/item/melee/baton)
req_access = list()
req_one_access = list()
+1 -1
View File
@@ -12,7 +12,7 @@
icon_state = "void-red"
item_state = "void"
desc = "A high tech, NASA Centcom branch designed space suit. Used for AI satellite maintenance."
allowed = list(/obj/item/device/flashlight,/obj/item/tank,/obj/item/device/multitool)
allowed = list(/obj/item/flashlight,/obj/item/tank,/obj/item/multitool)
//Colors!!!
/obj/item/clothing/head/helmet/space/nasavoid/green
+2 -2
View File
@@ -1,5 +1,5 @@
/obj/item/clothing/suit/armor
allowed = list(/obj/item/gun/energy,/obj/item/reagent_containers/spray/pepper,/obj/item/gun/projectile,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/melee/baton,/obj/item/restraints/handcuffs,/obj/item/device/flashlight/seclite,/obj/item/melee/classic_baton/telescopic,/obj/item/kitchen/knife/combat)
allowed = list(/obj/item/gun/energy,/obj/item/reagent_containers/spray/pepper,/obj/item/gun/projectile,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/melee/baton,/obj/item/restraints/handcuffs,/obj/item/flashlight/seclite,/obj/item/melee/classic_baton/telescopic,/obj/item/kitchen/knife/combat)
body_parts_covered = UPPER_TORSO|LOWER_TORSO
cold_protection = UPPER_TORSO|LOWER_TORSO
min_cold_protection_temperature = ARMOR_MIN_TEMP_PROTECT
@@ -243,7 +243,7 @@
item_state = "armor"
blood_overlay_type = "armor"
flags_size = ONESIZEFITSALL
allowed = list(/obj/item/tank/emergency_oxygen,/obj/item/reagent_containers/spray/pepper,/obj/item/device/flashlight,/obj/item/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/melee/baton,/obj/item/restraints/handcuffs,/obj/item/storage/fancy/cigarettes,/obj/item/lighter,/obj/item/device/detective_scanner,/obj/item/device/taperecorder)
allowed = list(/obj/item/tank/emergency_oxygen,/obj/item/reagent_containers/spray/pepper,/obj/item/flashlight,/obj/item/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/melee/baton,/obj/item/restraints/handcuffs,/obj/item/storage/fancy/cigarettes,/obj/item/lighter,/obj/item/detective_scanner,/obj/item/taperecorder)
burn_state = FLAMMABLE
//Reactive armor
+1 -1
View File
@@ -22,7 +22,7 @@
flags_size = ONESIZEFITSALL
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
slowdown = 1
allowed = list(/obj/item/tank/emergency_oxygen,/obj/item/pen,/obj/item/device/flashlight/pen)
allowed = list(/obj/item/tank/emergency_oxygen,/obj/item/pen,/obj/item/flashlight/pen)
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 20)
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAIL
strip_delay = 70
+9 -9
View File
@@ -8,7 +8,7 @@
icon_state = "paramedic-vest"
item_state = "paramedic-vest"
allowed = list(/obj/item/stack/medical, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/hypospray, /obj/item/reagent_containers/syringe, \
/obj/item/device/healthanalyzer, /obj/item/device/flashlight, /obj/item/device/radio, /obj/item/tank/emergency_oxygen,/obj/item/device/rad_laser)
/obj/item/healthanalyzer, /obj/item/flashlight, /obj/item/radio, /obj/item/tank/emergency_oxygen,/obj/item/rad_laser)
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 10)
species_fit = list("Vox")
sprite_sheets = list(
@@ -22,8 +22,8 @@
icon_state = "brigphysician-vest"
item_state = "brigphysician-vest"
allowed = list(/obj/item/stack/medical, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/hypospray, /obj/item/reagent_containers/syringe, \
/obj/item/device/healthanalyzer, /obj/item/device/flashlight, \
/obj/item/device/radio, /obj/item/tank/emergency_oxygen,/obj/item/device/rad_laser)
/obj/item/healthanalyzer, /obj/item/flashlight, \
/obj/item/radio, /obj/item/tank/emergency_oxygen,/obj/item/rad_laser)
armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 0)
species_fit = list("Vox")
sprite_sheets = list(
@@ -38,7 +38,7 @@
item_state = "apron"
blood_overlay_type = "armor"
body_parts_covered = UPPER_TORSO|LOWER_TORSO
allowed = list(/obj/item/reagent_containers/spray/plantbgone,/obj/item/device/plant_analyzer,/obj/item/seeds,/obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/cultivator,/obj/item/reagent_containers/spray/pestspray,/obj/item/hatchet,/obj/item/storage/bag/plants)
allowed = list(/obj/item/reagent_containers/spray/plantbgone,/obj/item/plant_analyzer,/obj/item/seeds,/obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/cultivator,/obj/item/reagent_containers/spray/pestspray,/obj/item/hatchet,/obj/item/storage/bag/plants)
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi'
@@ -53,7 +53,7 @@
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
flags_inv = HIDEJUMPSUIT
flags_size = ONESIZEFITSALL
allowed = list(/obj/item/disk, /obj/item/stamp, /obj/item/reagent_containers/food/drinks/flask, /obj/item/melee, /obj/item/storage/lockbox/medal, /obj/item/device/flash, /obj/item/storage/box/matches, /obj/item/lighter, /obj/item/clothing/mask/cigarette, /obj/item/storage/fancy/cigarettes, /obj/item/tank/emergency_oxygen)
allowed = list(/obj/item/disk, /obj/item/stamp, /obj/item/reagent_containers/food/drinks/flask, /obj/item/melee, /obj/item/storage/lockbox/medal, /obj/item/flash, /obj/item/storage/box/matches, /obj/item/lighter, /obj/item/clothing/mask/cigarette, /obj/item/storage/fancy/cigarettes, /obj/item/tank/emergency_oxygen)
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi'
@@ -159,7 +159,7 @@
item_state = "det_suit"
blood_overlay_type = "coat"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
allowed = list(/obj/item/tank/emergency_oxygen,/obj/item/reagent_containers/spray/pepper,/obj/item/device/flashlight,/obj/item/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/melee/baton,/obj/item/restraints/handcuffs,/obj/item/storage/fancy/cigarettes,/obj/item/lighter,/obj/item/device/detective_scanner,/obj/item/device/taperecorder)
allowed = list(/obj/item/tank/emergency_oxygen,/obj/item/reagent_containers/spray/pepper,/obj/item/flashlight,/obj/item/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/melee/baton,/obj/item/restraints/handcuffs,/obj/item/storage/fancy/cigarettes,/obj/item/lighter,/obj/item/detective_scanner,/obj/item/taperecorder)
armor = list(melee = 25, bullet = 10, laser = 25, energy = 10, bomb = 0, bio = 0, rad = 0)
cold_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
@@ -196,7 +196,7 @@
item_state = "blueshieldcoat"
blood_overlay_type = "coat"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
allowed = list(/obj/item/gun/energy,/obj/item/reagent_containers/spray/pepper,/obj/item/gun/projectile,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/melee/baton,/obj/item/restraints/handcuffs,/obj/item/device/flashlight/seclite,/obj/item/melee/classic_baton/telescopic)
allowed = list(/obj/item/gun/energy,/obj/item/reagent_containers/spray/pepper,/obj/item/gun/projectile,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/melee/baton,/obj/item/restraints/handcuffs,/obj/item/flashlight/seclite,/obj/item/melee/classic_baton/telescopic)
armor = list(melee = 25, bullet = 10, laser = 25, energy = 10, bomb = 0, bio = 0, rad = 0)
cold_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
@@ -213,7 +213,7 @@
icon_state = "hazard"
item_state = "hazard"
blood_overlay_type = "armor"
allowed = list (/obj/item/device/flashlight, /obj/item/device/t_scanner, /obj/item/tank/emergency_oxygen)
allowed = list (/obj/item/flashlight, /obj/item/t_scanner, /obj/item/tank/emergency_oxygen)
burn_state = FIRE_PROOF
species_fit = list("Vox")
sprite_sheets = list(
@@ -299,7 +299,7 @@
item_state = "fr_jacket_open"
blood_overlay_type = "armor"
allowed = list(/obj/item/stack/medical, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/hypospray, /obj/item/reagent_containers/syringe, \
/obj/item/device/healthanalyzer, /obj/item/device/flashlight, /obj/item/device/radio, /obj/item/tank/emergency_oxygen,/obj/item/device/rad_laser)
/obj/item/healthanalyzer, /obj/item/flashlight, /obj/item/radio, /obj/item/tank/emergency_oxygen,/obj/item/rad_laser)
ignore_suitadjust = 0
suit_adjusted = 1
actions_types = list(/datum/action/item_action/button)
+1 -1
View File
@@ -7,7 +7,7 @@
suit_adjusted = 1
blood_overlay_type = "coat"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
allowed = list(/obj/item/device/analyzer,/obj/item/stack/medical,/obj/item/dnainjector,/obj/item/reagent_containers/dropper,/obj/item/reagent_containers/syringe,/obj/item/reagent_containers/hypospray,/obj/item/device/healthanalyzer,/obj/item/device/flashlight/pen,/obj/item/reagent_containers/glass/bottle,/obj/item/reagent_containers/glass/beaker,/obj/item/reagent_containers/food/pill,/obj/item/storage/pill_bottle,/obj/item/paper,/obj/item/device/rad_laser)
allowed = list(/obj/item/analyzer,/obj/item/stack/medical,/obj/item/dnainjector,/obj/item/reagent_containers/dropper,/obj/item/reagent_containers/syringe,/obj/item/reagent_containers/hypospray,/obj/item/healthanalyzer,/obj/item/flashlight/pen,/obj/item/reagent_containers/glass/bottle,/obj/item/reagent_containers/glass/beaker,/obj/item/reagent_containers/food/pill,/obj/item/storage/pill_bottle,/obj/item/paper,/obj/item/rad_laser)
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 50, rad = 0)
species_fit = list("Vox","Grey")
sprite_sheets = list(
+15 -15
View File
@@ -136,7 +136,7 @@
item_state = "syndicate-black-red"
desc = "A plastic replica of the syndicate space suit, you'll look just like a real murderous syndicate agent in this! This is a toy, it is not made for use in space!"
w_class = WEIGHT_CLASS_NORMAL
allowed = list(/obj/item/device/flashlight,/obj/item/tank/emergency_oxygen,/obj/item/toy)
allowed = list(/obj/item/flashlight,/obj/item/tank/emergency_oxygen,/obj/item/toy)
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
burn_state = FIRE_PROOF
@@ -344,7 +344,7 @@
cold_protection = UPPER_TORSO|LOWER_TORSO|ARMS
min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 0)
allowed = list(/obj/item/device/flashlight, /obj/item/tank/emergency_oxygen, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter)
allowed = list(/obj/item/flashlight, /obj/item/tank/emergency_oxygen, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter)
species_fit = list("Vox")
sprite_sheets = list("Vox" = 'icons/mob/species/vox/suit.dmi')
@@ -364,7 +364,7 @@
name = "captain's winter coat"
icon_state = "wintercoat_captain"
armor = list(melee = 25, bullet = 30, laser = 30, energy = 10, bomb = 25, bio = 0, rad = 0)
allowed = list(/obj/item/gun/energy, /obj/item/reagent_containers/spray/pepper, /obj/item/gun/projectile, /obj/item/ammo_box,/obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/restraints/handcuffs, /obj/item/device/flashlight/seclite, /obj/item/melee/classic_baton/telescopic)
allowed = list(/obj/item/gun/energy, /obj/item/reagent_containers/spray/pepper, /obj/item/gun/projectile, /obj/item/ammo_box,/obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/restraints/handcuffs, /obj/item/flashlight/seclite, /obj/item/melee/classic_baton/telescopic)
hoodtype = /obj/item/clothing/head/winterhood/captain
/obj/item/clothing/head/winterhood/captain
@@ -374,7 +374,7 @@
name = "security winter coat"
icon_state = "wintercoat_sec"
armor = list(melee = 10, bullet = 10, laser = 10, energy = 5, bomb = 15, bio = 0, rad = 0)
allowed = list(/obj/item/gun/energy, /obj/item/reagent_containers/spray/pepper, /obj/item/gun/projectile, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/restraints/handcuffs, /obj/item/device/flashlight/seclite, /obj/item/melee/classic_baton/telescopic)
allowed = list(/obj/item/gun/energy, /obj/item/reagent_containers/spray/pepper, /obj/item/gun/projectile, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/restraints/handcuffs, /obj/item/flashlight/seclite, /obj/item/melee/classic_baton/telescopic)
hoodtype = /obj/item/clothing/head/winterhood/security
/obj/item/clothing/head/winterhood/security
@@ -383,7 +383,7 @@
/obj/item/clothing/suit/hooded/wintercoat/medical
name = "medical winter coat"
icon_state = "wintercoat_med"
allowed = list(/obj/item/device/analyzer, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/device/healthanalyzer,/obj/item/device/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic)
allowed = list(/obj/item/analyzer, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer,/obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic)
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 50, rad = 0)
hoodtype = /obj/item/clothing/head/winterhood/medical
@@ -393,7 +393,7 @@
/obj/item/clothing/suit/hooded/wintercoat/science
name = "science winter coat"
icon_state = "wintercoat_sci"
allowed = list(/obj/item/device/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/device/healthanalyzer,/obj/item/device/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic)
allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer,/obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic)
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 10, bio = 0, rad = 0)
hoodtype = /obj/item/clothing/head/winterhood/science
@@ -404,7 +404,7 @@
name = "engineering winter coat"
icon_state = "wintercoat_engi"
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 20)
allowed = list(/obj/item/device/flashlight, /obj/item/tank/emergency_oxygen, /obj/item/device/t_scanner, /obj/item/rcd)
allowed = list(/obj/item/flashlight, /obj/item/tank/emergency_oxygen, /obj/item/t_scanner, /obj/item/rcd)
hoodtype = /obj/item/clothing/head/winterhood/engineering
/obj/item/clothing/head/winterhood/engineering
@@ -421,7 +421,7 @@
/obj/item/clothing/suit/hooded/wintercoat/hydro
name = "hydroponics winter coat"
icon_state = "wintercoat_hydro"
allowed = list(/obj/item/reagent_containers/spray, /obj/item/device/plant_analyzer, /obj/item/seeds, /obj/item/reagent_containers/glass/bottle, /obj/item/hatchet, /obj/item/storage/bag/plants)
allowed = list(/obj/item/reagent_containers/spray, /obj/item/plant_analyzer, /obj/item/seeds, /obj/item/reagent_containers/glass/bottle, /obj/item/hatchet, /obj/item/storage/bag/plants)
hoodtype = /obj/item/clothing/head/winterhood/hydro
/obj/item/clothing/head/winterhood/hydro
@@ -438,7 +438,7 @@
/obj/item/clothing/suit/hooded/wintercoat/miner
name = "mining winter coat"
icon_state = "wintercoat_miner"
allowed = list(/obj/item/pickaxe, /obj/item/device/flashlight, /obj/item/tank/emergency_oxygen, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter)
allowed = list(/obj/item/pickaxe, /obj/item/flashlight, /obj/item/tank/emergency_oxygen, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter)
armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
hoodtype = /obj/item/clothing/head/winterhood/miner
@@ -457,7 +457,7 @@
icon_state = "black_hoodie"
item_state = "blueshieldcoat"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
allowed = list(/obj/item/device/flashlight, /obj/item/tank/emergency_oxygen)
allowed = list(/obj/item/flashlight, /obj/item/tank/emergency_oxygen)
hoodtype = /obj/item/clothing/head/hood
species_fit = list("Vox")
sprite_sheets = list(
@@ -650,7 +650,7 @@
ignore_suitadjust = 1
actions_types = list()
adjust_flavour = null
allowed = list(/obj/item/device/flashlight,/obj/item/tank/emergency_oxygen,/obj/item/toy,/obj/item/storage/fancy/cigarettes,/obj/item/lighter,/obj/item/gun/projectile/automatic/pistol,/obj/item/gun/projectile/revolver,/obj/item/gun/projectile/revolver/detective)
allowed = list(/obj/item/flashlight,/obj/item/tank/emergency_oxygen,/obj/item/toy,/obj/item/storage/fancy/cigarettes,/obj/item/lighter,/obj/item/gun/projectile/automatic/pistol,/obj/item/gun/projectile/revolver,/obj/item/gun/projectile/revolver/detective)
/obj/item/clothing/suit/jacket/miljacket/navy
name = "navy military jacket"
@@ -719,7 +719,7 @@
permeability_coefficient = 0.01
flags_size = ONESIZEFITSALL
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
allowed = list(/obj/item/tank/emergency_oxygen,/obj/item/pen,/obj/item/device/flashlight/pen)
allowed = list(/obj/item/tank/emergency_oxygen,/obj/item/pen,/obj/item/flashlight/pen)
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 20)
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAIL
@@ -740,7 +740,7 @@
icon_state = "bomber"
item_state = "bomber"
ignore_suitadjust = 0
allowed = list(/obj/item/device/flashlight,/obj/item/tank/emergency_oxygen,/obj/item/toy,/obj/item/storage/fancy/cigarettes,/obj/item/lighter)
allowed = list(/obj/item/flashlight,/obj/item/tank/emergency_oxygen,/obj/item/toy,/obj/item/storage/fancy/cigarettes,/obj/item/lighter)
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
cold_protection = UPPER_TORSO|LOWER_TORSO|ARMS
actions_types = list(/datum/action/item_action/zipper)
@@ -757,7 +757,7 @@
item_state = "bombersec"
ignore_suitadjust = 0
//Inherited from Security armour.
allowed = list(/obj/item/gun/energy,/obj/item/reagent_containers/spray/pepper,/obj/item/gun/projectile,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/melee/baton,/obj/item/restraints/handcuffs,/obj/item/device/flashlight/seclite,/obj/item/melee/classic_baton/telescopic,/obj/item/kitchen/knife/combat)
allowed = list(/obj/item/gun/energy,/obj/item/reagent_containers/spray/pepper,/obj/item/gun/projectile,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/melee/baton,/obj/item/restraints/handcuffs,/obj/item/flashlight/seclite,/obj/item/melee/classic_baton/telescopic,/obj/item/kitchen/knife/combat)
heat_protection = UPPER_TORSO|LOWER_TORSO
min_cold_protection_temperature = ARMOR_MIN_TEMP_PROTECT
max_heat_protection_temperature = ARMOR_MAX_TEMP_PROTECT
@@ -816,7 +816,7 @@
item_state = "owl_wings"
body_parts_covered = ARMS
armor = list(melee = 5, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
allowed = list(/obj/item/gun/energy,/obj/item/reagent_containers/spray/pepper,/obj/item/gun/projectile,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/melee/baton,/obj/item/restraints/handcuffs,/obj/item/device/flashlight/seclite)
allowed = list(/obj/item/gun/energy,/obj/item/reagent_containers/spray/pepper,/obj/item/gun/projectile,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/melee/baton,/obj/item/restraints/handcuffs,/obj/item/flashlight/seclite)
actions_types = list(/datum/action/item_action/toggle_wings)
+2 -2
View File
@@ -18,7 +18,7 @@
gas_transfer_coefficient = 0.90
permeability_coefficient = 0.50
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
allowed = list(/obj/item/device/flashlight,/obj/item/tank/emergency_oxygen,/obj/item/extinguisher)
allowed = list(/obj/item/flashlight,/obj/item/tank/emergency_oxygen,/obj/item/extinguisher)
slowdown = 1
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAIL
flags = STOPSPRESSUREDMAGE | THICKMATERIAL
@@ -147,7 +147,7 @@
permeability_coefficient = 0.50
flags = THICKMATERIAL
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
allowed = list(/obj/item/device/flashlight,/obj/item/tank/emergency_oxygen)
allowed = list(/obj/item/flashlight,/obj/item/tank/emergency_oxygen)
slowdown = 1.5
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 60, rad = 100)
flags_inv = HIDEJUMPSUIT|HIDETAIL
@@ -253,14 +253,14 @@
user.visible_message("<span class='warning'>[user] displays their Nanotrasen Internal Security Legal Authorization Badge.\nIt reads: [stored_name], NT Security.</span>","<span class='warning'>You display your Nanotrasen Internal Security Legal Authorization Badge.\nIt reads: [stored_name], NT Security.</span>")
/obj/item/clothing/accessory/holobadge/attackby(var/obj/item/O as obj, var/mob/user as mob, params)
if(istype(O, /obj/item/card/id) || istype(O, /obj/item/device/pda))
if(istype(O, /obj/item/card/id) || istype(O, /obj/item/pda))
var/obj/item/card/id/id_card = null
if(istype(O, /obj/item/card/id))
id_card = O
else
var/obj/item/device/pda/pda = O
var/obj/item/pda/pda = O
id_card = pda.id
if(access_security in id_card.access || emagged)
@@ -644,7 +644,7 @@
return
var/area/t = get_area(M)
var/obj/item/device/radio/headset/a = new /obj/item/device/radio/headset(src)
var/obj/item/radio/headset/a = new /obj/item/radio/headset(src)
if(istype(t, /area/syndicate_station) || istype(t, /area/syndicate_mothership) || istype(t, /area/shuttle/syndicate_elite) )
//give the syndicats a bit of stealth
a.autosay("[M] has been vandalized in Space!", "[M]'s Death Alarm")
+7 -1
View File
@@ -51,12 +51,18 @@
for(var/A in L)
var/turf/T = A
if(T.Adjacent(user))
. += T.contents
for(var/B in T)
var/atom/movable/AM = B
if(AM.flags_2 & HOLOGRAM_2)
continue
. += AM
/datum/personal_crafting/proc/get_surroundings(mob/user)
. = list()
for(var/obj/item/I in get_environment(user))
if(I.flags_2 & HOLOGRAM_2)
continue
if(istype(I, /obj/item/stack))
var/obj/item/stack/S = I
.[I.type] += S.amount
+24 -14
View File
@@ -19,7 +19,7 @@
result = /obj/item/grenade/iedcasing
reqs = list(/datum/reagent/fuel = 50,
/obj/item/stack/cable_coil = 1,
/obj/item/device/assembly/igniter = 1,
/obj/item/assembly/igniter = 1,
/obj/item/reagent_containers/food/drinks/cans = 1)
parts = list(/obj/item/reagent_containers/food/drinks/cans = 1)
time = 15
@@ -48,7 +48,7 @@
result = /obj/item/melee/baton/cattleprod
reqs = list(/obj/item/restraints/handcuffs/cable = 1,
/obj/item/stack/rods = 1,
/obj/item/device/assembly/igniter = 1)
/obj/item/assembly/igniter = 1)
time = 40
category = CAT_WEAPON
@@ -72,7 +72,7 @@
/obj/item/stack/cable_coil = 1,
/obj/item/gun/energy/gun/advtaser = 1,
/obj/item/stock_parts/cell = 1,
/obj/item/device/assembly/prox_sensor = 1)
/obj/item/assembly/prox_sensor = 1)
tools = list(/obj/item/weldingtool, /obj/item/screwdriver)
time = 60
category = CAT_ROBOT
@@ -80,10 +80,10 @@
/datum/crafting_recipe/secbot
name = "Secbot"
result = /mob/living/simple_animal/bot/secbot
reqs = list(/obj/item/device/assembly/signaler = 1,
reqs = list(/obj/item/assembly/signaler = 1,
/obj/item/clothing/head/helmet = 1,
/obj/item/melee/baton = 1,
/obj/item/device/assembly/prox_sensor = 1,
/obj/item/assembly/prox_sensor = 1,
/obj/item/robot_parts/r_arm = 1)
tools = list(/obj/item/weldingtool)
time = 60
@@ -93,7 +93,7 @@
name = "Cleanbot"
result = /mob/living/simple_animal/bot/cleanbot
reqs = list(/obj/item/reagent_containers/glass/bucket = 1,
/obj/item/device/assembly/prox_sensor = 1,
/obj/item/assembly/prox_sensor = 1,
/obj/item/robot_parts/r_arm = 1)
time = 40
category = CAT_ROBOT
@@ -103,7 +103,7 @@
result = /mob/living/simple_animal/bot/floorbot
reqs = list(/obj/item/storage/toolbox/mechanical = 1,
/obj/item/stack/tile/plasteel = 1,
/obj/item/device/assembly/prox_sensor = 1,
/obj/item/assembly/prox_sensor = 1,
/obj/item/robot_parts/r_arm = 1)
time = 40
category = CAT_ROBOT
@@ -111,9 +111,9 @@
/datum/crafting_recipe/medbot
name = "Medbot"
result = /mob/living/simple_animal/bot/medbot
reqs = list(/obj/item/device/healthanalyzer = 1,
reqs = list(/obj/item/healthanalyzer = 1,
/obj/item/storage/firstaid = 1,
/obj/item/device/assembly/prox_sensor = 1,
/obj/item/assembly/prox_sensor = 1,
/obj/item/robot_parts/r_arm = 1)
time = 40
category = CAT_ROBOT
@@ -122,9 +122,9 @@
name = "Flamethrower"
result = /obj/item/flamethrower
reqs = list(/obj/item/weldingtool = 1,
/obj/item/device/assembly/igniter = 1,
/obj/item/assembly/igniter = 1,
/obj/item/stack/rods = 1)
parts = list(/obj/item/device/assembly/igniter = 1,
parts = list(/obj/item/assembly/igniter = 1,
/obj/item/weldingtool = 1)
tools = list(/obj/item/screwdriver)
time = 10
@@ -243,11 +243,11 @@
/datum/crafting_recipe/spooky_camera
name = "Camera Obscura"
result = /obj/item/device/camera/spooky
result = /obj/item/camera/spooky
time = 15
reqs = list(/obj/item/device/camera = 1,
reqs = list(/obj/item/camera = 1,
/datum/reagent/holywater = 10)
parts = list(/obj/item/device/camera = 1)
parts = list(/obj/item/camera = 1)
/datum/crafting_recipe/papersack
name = "Paper Sack"
@@ -354,3 +354,13 @@
reqs = list(/obj/item/grown/log = 5)
result = /obj/structure/bonfire
category = CAT_PRIMAL
/datum/crafting_recipe/guillotine
name = "Guillotine"
result = /obj/structure/guillotine
time = 150 // Building a functioning guillotine takes time
reqs = list(/obj/item/stack/sheet/plasteel = 3,
/obj/item/stack/sheet/wood = 20,
/obj/item/stack/cable_coil = 10)
tools = list(/obj/item/screwdriver, /obj/item/wrench, /obj/item/weldingtool)
category = CAT_MISC
+62 -57
View File
@@ -10,10 +10,10 @@
////////// Usable Items //////////
//////////////////////////////////
/obj/item/device/fluff
/obj/item/fluff
var/used = 0
/obj/item/device/fluff/tattoo_gun // Generic tattoo gun, make subtypes for different folks
/obj/item/fluff/tattoo_gun // Generic tattoo gun, make subtypes for different folks
name = "disposable tattoo pen"
desc = "A cheap plastic tattoo application pen."
icon = 'icons/obj/custom_items.dmi'
@@ -29,7 +29,7 @@
toolspeed = 1
usesound = 'sound/items/Welder2.ogg'
/obj/item/device/fluff/tattoo_gun/attack(mob/living/carbon/M as mob, mob/user as mob)
/obj/item/fluff/tattoo_gun/attack(mob/living/carbon/M as mob, mob/user as mob)
if(user.a_intent == INTENT_HARM)
user.visible_message("<span class='warning'>[user] stabs [M] with the [src]!</span>", "<span class='warning'>You stab [M] with the [src]!</span>")
to_chat(M, "<span class='userdanger'>[user] stabs you with the [src]!<br></span><span class = 'warning'>You feel a tiny prick!</span>")
@@ -75,7 +75,7 @@
used = 1
update_icon()
/obj/item/device/fluff/tattoo_gun/update_icon()
/obj/item/fluff/tattoo_gun/update_icon()
..()
overlays.Cut()
@@ -85,11 +85,11 @@
ink.icon += rgb(tattoo_r, tattoo_g, tattoo_b, 190)
overlays += ink
/obj/item/device/fluff/tattoo_gun/New()
/obj/item/fluff/tattoo_gun/New()
..()
update_icon()
/obj/item/device/fluff/tattoo_gun/elliot_cybernetic_tat
/obj/item/fluff/tattoo_gun/elliot_cybernetic_tat
desc = "A cheap plastic tattoo application pen.<br>This one seems heavily used."
tattoo_name = "circuitry tattoo"
tattoo_icon = "Elliot Circuit Tattoo"
@@ -97,7 +97,7 @@
tattoo_g = 138
tattoo_b = 176
/obj/item/device/fluff/tattoo_gun/elliot_cybernetic_tat/attack_self(mob/user as mob)
/obj/item/fluff/tattoo_gun/elliot_cybernetic_tat/attack_self(mob/user as mob)
if(!used)
var/ink_color = input("Please select an ink color.", "Tattoo Ink Color", rgb(tattoo_r, tattoo_g, tattoo_b)) as color|null
if(ink_color && !(user.incapacitated() || used) )
@@ -112,13 +112,13 @@
else
to_chat(user, "<span class='notice'>The [src] is out of ink!</span>")
/obj/item/device/fluff/bird_painter // BirdtTalon: Kahkiri
/obj/item/fluff/bird_painter // BirdtTalon: Kahkiri
name = "Orb of Onyx"
desc = "It is imbued with such dark power as to corrupt the very appearance of those who gaze into its depths."
icon_state = "bird_orb"
icon = 'icons/obj/custom_items.dmi'
/obj/item/device/fluff/bird_painter/attack_self(mob/user)
/obj/item/fluff/bird_painter/attack_self(mob/user)
if(ishuman(user))
var/mob/living/carbon/human/H = user
H.s_tone = -115
@@ -159,12 +159,12 @@
desc = "A weathered Vox thermonocle, doesn't seem to work anymore."
icon_state = "thermoncle"
/obj/item/device/fluff/rapid_wheelchair_kit //Rapidvalj: Hakikarahiti
/obj/item/fluff/rapid_wheelchair_kit //Rapidvalj: Hakikarahiti
name = "wheelchair conversion kit"
desc = "An assorted set of exchangable parts for a wheelchair."
icon_state = "modkit"
/obj/item/device/fluff/rapid_wheelchair_kit/afterattack(atom/target, mob/user, proximity)
/obj/item/fluff/rapid_wheelchair_kit/afterattack(atom/target, mob/user, proximity)
if(!proximity || !ishuman(user) || user.incapacitated())
return
@@ -245,7 +245,7 @@
new /obj/item/reagent_containers/food/drinks/cans/cola(src)
/obj/item/device/instrument/guitar/jello_guitar //Antcolon3: Dan Jello
/obj/item/instrument/guitar/jello_guitar //Antcolon3: Dan Jello
name = "Dan Jello's Pink Guitar"
desc = "Dan Jello's special pink guitar."
icon = 'icons/obj/custom_items.dmi'
@@ -262,7 +262,6 @@
force = 0
throwforce = 0
w_class = WEIGHT_CLASS_SMALL
var/used = 0
/obj/item/fluff/wingler_comb/attack_self(mob/user)
if(used)
@@ -276,13 +275,13 @@
to_chat(target, "<span class='notice'>You comb your tail with the [src].</span>")
used = 1
/obj/item/device/fluff/desolate_coat_kit //DesolateG: Micheal Smith
/obj/item/fluff/desolate_coat_kit //DesolateG: Micheal Smith
name = "armored jacket conversion kit"
desc = "Flaps of dark fabric, probably used to somehow modify some sort of an armored garment. Won't help with protection, though."
icon_state = "modkit"
w_class = WEIGHT_CLASS_SMALL
/obj/item/device/fluff/desolate_coat_kit/afterattack(atom/target, mob/user, proximity)
/obj/item/fluff/desolate_coat_kit/afterattack(atom/target, mob/user, proximity)
if(!proximity || !ishuman(user) || user.incapacitated())
return
@@ -308,13 +307,13 @@
user.update_inv_wear_suit()
qdel(src)
/obj/item/device/fluff/fei_gasmask_kit //Fei Hazelwood: Tariq Yon-Dale
/obj/item/fluff/fei_gasmask_kit //Fei Hazelwood: Tariq Yon-Dale
name = "gas mask conversion kit"
desc = "A gas mask conversion kit."
icon_state = "modkit"
w_class = WEIGHT_CLASS_SMALL
/obj/item/device/fluff/fei_gasmask_kit/afterattack(atom/target, mob/user, proximity)
/obj/item/fluff/fei_gasmask_kit/afterattack(atom/target, mob/user, proximity)
if(!proximity || !ishuman(user) || user.incapacitated())
return
@@ -335,14 +334,14 @@
to_chat(user, "<span class='warning'>You can't modify [target]!</span>")
/obj/item/device/fluff/desolate_baton_kit //DesolateG: Micheal Smith
/obj/item/fluff/desolate_baton_kit //DesolateG: Micheal Smith
name = "stun baton conversion kit"
desc = "Some sci-fi looking parts for a stun baton."
icon = 'icons/obj/custom_items.dmi'
icon_state = "scifikit"
w_class = WEIGHT_CLASS_SMALL
/obj/item/device/fluff/desolate_baton_kit/afterattack(atom/target, mob/user, proximity)
/obj/item/fluff/desolate_baton_kit/afterattack(atom/target, mob/user, proximity)
if(!proximity || !ishuman(user) || user.incapacitated())
return
@@ -361,7 +360,7 @@
to_chat(user, "<span class='warning'>You can't modify [target]!</span>")
/obj/item/device/fluff/cardgage_helmet_kit //captain cardgage: Richard Ulery
/obj/item/fluff/cardgage_helmet_kit //captain cardgage: Richard Ulery
name = "welding helmet modkit"
desc = "Some spraypaint and a stencil, perfect for painting flames onto a welding helmet!"
icon_state = "modkit"
@@ -369,7 +368,7 @@
force = 0
throwforce = 0
/obj/item/device/fluff/cardgage_helmet_kit/afterattack(atom/target, mob/user, proximity)
/obj/item/fluff/cardgage_helmet_kit/afterattack(atom/target, mob/user, proximity)
if(!proximity || !ishuman(user) || user.incapacitated())
return
@@ -386,7 +385,7 @@
#define USED_MOD_HELM 1
#define USED_MOD_SUIT 2
/obj/item/device/fluff/shadey_plasman_modkit
/obj/item/fluff/shadey_plasman_modkit
name = "plasmaman suit modkit"
desc = "A kit containing nanites that are able to modify the look of a plasmaman suit and helmet without exposing the wearer to hostile environments."
icon_state = "modkit"
@@ -394,7 +393,7 @@
force = 0
throwforce = 0
/obj/item/device/fluff/shadey_plasman_modkit/afterattack(atom/target, mob/user, proximity)
/obj/item/fluff/shadey_plasman_modkit/afterattack(atom/target, mob/user, proximity)
if(!proximity || !ishuman(user) || user.incapacitated())
return
var/mob/living/carbon/human/H = user
@@ -432,7 +431,7 @@
return
to_chat(user, "<span class='warning'>You can't modify [target]!</span>")
/obj/item/device/fluff/lighty_plasman_modkit // LightFire53: Ikelos
/obj/item/fluff/lighty_plasman_modkit // LightFire53: Ikelos
name = "plasmaman suit modkit"
desc = "A kit containing nanites that are able to modify the look of a plasmaman suit and helmet without exposing the wearer to hostile environments."
icon_state = "modkit"
@@ -449,7 +448,7 @@
"Gold" = "plasmaman_ikelosgold",
"Red" = "plasmaman_ikelossecurity")
/obj/item/device/fluff/lighty_plasman_modkit/afterattack(atom/target, mob/user, proximity)
/obj/item/fluff/lighty_plasman_modkit/afterattack(atom/target, mob/user, proximity)
if(!proximity || !ishuman(user) || user.incapacitated())
return
var/mob/living/carbon/human/H = user
@@ -497,15 +496,15 @@
#undef USED_MOD_HELM
#undef USED_MOD_SUIT
/obj/item/device/fluff/merchant_sallet_modkit //Travelling Merchant: Trav Noble. This is what they spawn in with
name = "sallet modkit"
desc = "A modkit that can make most helmets look like a steel sallet."
/obj/item/fluff/merchant_sallet_modkit //Travelling Merchant: Trav Noble. This is what they spawn in with
name = "SG Helmet modkit"
desc = "A modkit that can make most helmets look like a Shellguard Helmet."
icon_state = "modkit"
w_class = WEIGHT_CLASS_SMALL
force = 0
throwforce = 0
/obj/item/device/fluff/merchant_sallet_modkit/afterattack(atom/target, mob/user, proximity)
/obj/item/fluff/merchant_sallet_modkit/afterattack(atom/target, mob/user, proximity)
if(!proximity || !ishuman(user) || user.incapacitated())
return
@@ -540,7 +539,7 @@
else
to_chat(user, "<span class='warning'>You can't modify [target]!</span>")
/obj/item/device/fluff/k3_webbing_modkit //IK3I: Yakikatachi
/obj/item/fluff/k3_webbing_modkit //IK3I: Yakikatachi
name = "webbing modkit"
desc = "A modkit that can be used to turn certain vests and labcoats into lightweight webbing"
icon_state = "modkit"
@@ -548,7 +547,7 @@
force = 0
throwforce = 0
/obj/item/device/fluff/k3_webbing_modkit/afterattack(atom/target, mob/user, proximity)
/obj/item/fluff/k3_webbing_modkit/afterattack(atom/target, mob/user, proximity)
if(!proximity || !ishuman(user) || user.incapacitated())
return
@@ -650,53 +649,59 @@
icon_state = "kakicharakiti"
/obj/item/clothing/head/helmet/fluff/merchant_sallet //Travelling Merchant: Trav Noble. This >>IS NOT<< what they spawn in with
name = "Steel Sallet"
desc = "A heavy steel sallet with the word Noble scratched into the side. Comes with a Bevor attached."
name = "Shellguard Helmet"
desc = "A Shellguard Helmet with the name Noble written on the inside."
icon = 'icons/obj/custom_items.dmi'
icon_state = "merchant_sallet_visor_bevor"
item_state = "merchant_sallet_visor_bevor"
actions_types = list(/datum/action/item_action/toggle_helmet_mode)
toggle_cooldown = 20
toggle_sound = 'sound/items/ZippoClose.ogg'
toggle_sound = 'sound/items/change_jaws.ogg'
flags = BLOCKHAIR
flags_inv = HIDEEYES|HIDEMASK|HIDEFACE|HIDEEARS
var/state = "Visor & Bevor"
var/state = "Soldier Up"
/obj/item/clothing/head/helmet/fluff/merchant_sallet/attack_self(mob/user)
if(!user.incapacitated() && (world.time > cooldown + toggle_cooldown) && Adjacent(user))
var/list/options = list()
options["Visor & Bevor"] = list(
options["Soldier Up"] = list(
"icon_state" = "merchant_sallet_visor_bevor",
"visor_flags" = HIDEEYES,
"mask_flags" = HIDEMASK|HIDEFACE
)
options["Visor Only"] = list(
"icon_state" = "merchant_sallet_visor",
"visor_flags" = HIDEEYES,
"mask_flags" = HIDEFACE
)
options["Bevor Only"] = list(
"icon_state" = "merchant_sallet_bevor",
"visor_flags" = null,
"mask_flags" = HIDEMASK|HIDEFACE
)
options["Neither Visor nor Bevor"] = list(
"icon_state" = "merchant_sallet",
"visor_flags" = null,
"mask_flags" = null
)
options["Soldier Down"] = list(
"icon_state" = "merchant_sallet_visor",
"visor_flags" = HIDEEYES,
"mask_flags" = HIDEMASK|HIDEFACE
)
options["Technician Up"] = list(
"icon_state" = "merchant_sallet_bevor",
"visor_flags" = null,
"mask_flags" = null
)
options["Technician Down"] = list(
"icon_state" = "merchant_sallet",
"visor_flags" = HIDEEYES,
"mask_flags" = HIDEMASK|HIDEFACE
)
var/choice = input(user, "How would you like to adjust the sallet?", "Adjust Sallet") as null|anything in options
var/choice = input(user, "How would you like to adjust the helmet?", "Adjust Helmet") as null|anything in options
if(choice && choice != state && !user.incapacitated() && Adjacent(user))
var/list/new_state = options[choice]
icon_state = new_state["icon_state"]
state = choice
to_chat(user, "You adjust the sallet.")
to_chat(user, "You adjust the helmet.")
playsound(src.loc, "[toggle_sound]", 100, 0, 4)
user.update_inv_head()
return 1
/obj/item/clothing/head/beret/fluff/elo //V-Force_Bomber: E.L.O.
name = "E.L.O.'s medical beret"
desc = "E.L.O.s personal medical beret, issued by Nanotrassen and awarded along with her medal."
icon = 'icons/obj/custom_items.dmi'
icon_state = "elo-beret"
//////////// Suits ////////////
/obj/item/clothing/suit/fluff
icon = 'icons/obj/custom_items.dmi'
@@ -766,7 +771,7 @@
item_state = "supplymaster_jacket_open"
ignore_suitadjust = 0
suit_adjusted = 1
allowed = list(/obj/item/device/flashlight,/obj/item/tank/emergency_oxygen,/obj/item/toy,/obj/item/storage/fancy/cigarettes,/obj/item/lighter)
allowed = list(/obj/item/flashlight,/obj/item/tank/emergency_oxygen,/obj/item/toy,/obj/item/storage/fancy/cigarettes,/obj/item/lighter)
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
cold_protection = UPPER_TORSO|LOWER_TORSO|ARMS
actions_types = list(/datum/action/item_action/button)
@@ -927,7 +932,7 @@
icon_state = "xantholne_wintercoat"
hoodtype = /obj/item/clothing/head/hood/fluff/xantholne
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
allowed = list(/obj/item/device/flashlight, /obj/item/tank/emergency_oxygen, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter)
allowed = list(/obj/item/flashlight, /obj/item/tank/emergency_oxygen, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter)
/obj/item/clothing/head/hood/fluff/xantholne // Xantholne: Meex Zwichsnicrur
@@ -1312,12 +1317,12 @@
displays_id = FALSE
/obj/item/device/fluff/decemviri_spacepod_kit //Decemviri: Sylus Cain
/obj/item/fluff/decemviri_spacepod_kit //Decemviri: Sylus Cain
name = "Spacepod mod kit"
desc = "a kit on tools and a blueprint detailing how to reconfigure a spacepod"
icon_state = "modkit"
/obj/item/device/fluff/decemviri_spacepod_kit/afterattack(atom/target, mob/user, proximity)
/obj/item/fluff/decemviri_spacepod_kit/afterattack(atom/target, mob/user, proximity)
if(!proximity || !ishuman(user) || user.incapacitated())
return
@@ -17,19 +17,19 @@ atom/proc/add_fibers(mob/living/carbon/human/M)
if(M.wear_suit)
fibertext = "Material from \a [M.wear_suit]."
if(prob(10*item_multiplier) && !(fibertext in suit_fibers) && M.wear_suit.can_leave_fibers)
//log_to_dd("Added fibertext: [fibertext]")
//log_world("Added fibertext: [fibertext]")
suit_fibers += fibertext
if(!(M.wear_suit.body_parts_covered & UPPER_TORSO))
if(M.w_uniform)
fibertext = "Fibers from \a [M.w_uniform]."
if(prob(12*item_multiplier) && !(fibertext in suit_fibers) && M.w_uniform.can_leave_fibers) //Wearing a suit means less of the uniform exposed.
//log_to_dd("Added fibertext: [fibertext]")
//log_world("Added fibertext: [fibertext]")
suit_fibers += fibertext
if(!(M.wear_suit.body_parts_covered & HANDS))
if(M.gloves)
fibertext = "Material from a pair of [M.gloves.name]."
if(prob(20*item_multiplier) && !(fibertext in suit_fibers) && M.gloves.can_leave_fibers)
//log_to_dd("Added fibertext: [fibertext]")
//log_world("Added fibertext: [fibertext]")
suit_fibers += fibertext
else if(M.w_uniform)
fibertext = "Fibers from \a [M.w_uniform]."
@@ -39,10 +39,10 @@ atom/proc/add_fibers(mob/living/carbon/human/M)
if(M.gloves)
fibertext = "Material from a pair of [M.gloves.name]."
if(prob(20*item_multiplier) && !(fibertext in suit_fibers) && M.gloves.can_leave_fibers)
//log_to_dd("Added fibertext: [fibertext]")
//log_world("Added fibertext: [fibertext]")
suit_fibers += "Material from a pair of [M.gloves.name]."
else if(M.gloves)
fibertext = "Material from a pair of [M.gloves.name]."
if(prob(20*item_multiplier) && !(fibertext in suit_fibers) && M.gloves.can_leave_fibers)
//log_to_dd("Added fibertext: [fibertext]")
//log_world("Added fibertext: [fibertext]")
suit_fibers += "Material from a pair of [M.gloves.name]."
+8 -8
View File
@@ -2,7 +2,7 @@
// TODO: Split everything into easy to manage procs.
/obj/item/device/detective_scanner
/obj/item/detective_scanner
name = "forensic scanner"
desc = "Used to remotely scan objects and biomass for DNA and fingerprints. Can print a report of the findings."
icon = 'icons/goonstation/objects/objects.dmi'
@@ -16,7 +16,7 @@
var/list/log = list()
actions_types = list(/datum/action/item_action/print_report)
/obj/item/device/detective_scanner/attack_self(var/mob/user)
/obj/item/detective_scanner/attack_self(var/mob/user)
var/search = input(user, "Enter name, fingerprint or blood DNA.", "Find record", "")
if(!search || user.stat || user.incapacitated())
@@ -59,10 +59,10 @@
to_chat(user, "<span class='warning'>No match found in station records.</span>")
/obj/item/device/detective_scanner/ui_action_click()
/obj/item/detective_scanner/ui_action_click()
print_scanner_report()
/obj/item/device/detective_scanner/proc/print_scanner_report()
/obj/item/detective_scanner/proc/print_scanner_report()
if(log.len && !scanning)
scanning = 1
to_chat(usr, "<span class='notice'>Printing report, please wait...</span>")
@@ -89,14 +89,14 @@
to_chat(usr, "<span class='notice'>The scanner has no logs or is in use.</span>")
/obj/item/device/detective_scanner/attack(mob/living/M as mob, mob/user as mob)
/obj/item/detective_scanner/attack(mob/living/M as mob, mob/user as mob)
return
/obj/item/device/detective_scanner/afterattack(atom/A, mob/user as mob, proximity)
/obj/item/detective_scanner/afterattack(atom/A, mob/user as mob, proximity)
scan(A, user)
/obj/item/device/detective_scanner/proc/scan(var/atom/A, var/mob/user)
/obj/item/detective_scanner/proc/scan(var/atom/A, var/mob/user)
if(!scanning)
// Can remotely scan objects and mobs.
@@ -210,7 +210,7 @@
scanning = 0
return
/obj/item/device/detective_scanner/proc/add_log(var/msg, var/broadcast = 1)
/obj/item/detective_scanner/proc/add_log(var/msg, var/broadcast = 1)
if(scanning)
if(broadcast && ismob(loc))
var/mob/M = loc
+5 -33
View File
@@ -38,7 +38,7 @@ log transactions
..()
machine_id = "[station_name()] RT #[num_financial_terminals++]"
/obj/machinery/atm/initialize()
/obj/machinery/atm/Initialize()
..()
reconnect_database()
@@ -122,6 +122,8 @@ log transactions
if(issilicon(user))
to_chat(user, "<span class='warning'>Artificial unit recognized. Artificial units do not currently receive monetary compensation, as per Nanotrasen regulation #1005.</span>")
return
if(!linked_db)
reconnect_database()
ui_interact(user)
/obj/machinery/atm/attack_ghost(mob/user)
@@ -199,12 +201,9 @@ log transactions
authenticated_account.security_level = new_sec_level
if("attempt_auth")
if(linked_db)
// check if they have low security enabled
scan_user(usr)
if(!ticks_left_locked_down && held_card)
if(!ticks_left_locked_down)
var/tried_account_num = text2num(href_list["account_num"])
if(!tried_account_num)
if(!tried_account_num && held_card)
tried_account_num = held_card.associated_account_number
var/tried_pin = text2num(href_list["account_pin"])
@@ -323,30 +322,3 @@ log transactions
//create the most effective combination of notes to make up the requested amount
/obj/machinery/atm/proc/withdraw_arbitrary_sum(arbitrary_sum)
new /obj/item/stack/spacecash(get_step(get_turf(src), turn(dir, 180)), arbitrary_sum)
//stolen wholesale and then edited a bit from newscasters, which are awesome and by Agouri
/obj/machinery/atm/proc/scan_user(mob/living/carbon/human/H)
if(!authenticated_account && linked_db)
if(H.wear_id)
var/obj/item/card/id/I
if(istype(H.wear_id, /obj/item/card/id) )
I = H.wear_id
else if(istype(H.wear_id, /obj/item/device/pda) )
var/obj/item/device/pda/P = H.wear_id
I = P.id
if(I)
authenticated_account = attempt_account_access(I.associated_account_number)
if(authenticated_account)
to_chat(H, "[bicon(src)]<span class='notice'>Access granted. Welcome user '[authenticated_account.owner_name].'</span>")
//create a transaction log entry
var/datum/transaction/T = new()
T.target_name = authenticated_account.owner_name
T.purpose = "Remote terminal access"
T.source_terminal = machine_id
T.date = current_date_string
T.time = station_time_timestamp()
authenticated_account.transaction_log.Add(T)
view_screen = NO_SCREEN
SSnanoui.update_uis(src)
+10 -10
View File
@@ -1,4 +1,4 @@
/obj/item/device/eftpos
/obj/item/eftpos
name = "EFTPOS scanner"
desc = "Swipe your ID card to make purchases electronically."
icon = 'icons/obj/device.dmi'
@@ -13,7 +13,7 @@
var/obj/machinery/computer/account_database/linked_db
var/datum/money_account/linked_account
/obj/item/device/eftpos/New()
/obj/item/eftpos/New()
..()
machine_id = "[station_name()] EFTPOS #[num_financial_terminals++]"
access_code = rand(1111,111111)
@@ -25,7 +25,7 @@
//the user of the EFTPOS device can change the target account though, and no-one will be the wiser (except whoever's being charged)
linked_account = station_account
/obj/item/device/eftpos/proc/print_reference()
/obj/item/eftpos/proc/print_reference()
playsound(loc, 'sound/goonstation/machines/printer_thermal.ogg', 50, 1)
var/obj/item/paper/R = new(loc)
R.name = "Reference: [eftpos_name]"
@@ -49,7 +49,7 @@
D.wrapped = R
D.name = "small parcel - 'EFTPOS access code'"
/obj/item/device/eftpos/proc/reconnect_database()
/obj/item/eftpos/proc/reconnect_database()
var/turf/location = get_turf(src)
if(!location)
return
@@ -59,10 +59,10 @@
linked_db = DB
break
/obj/item/device/eftpos/attack_self(mob/user)
/obj/item/eftpos/attack_self(mob/user)
ui_interact(user)
/obj/item/device/eftpos/attackby(obj/O, mob/user, params)
/obj/item/eftpos/attackby(obj/O, mob/user, params)
if(istype(O, /obj/item/card))
//attempt to connect to a new db, and if that doesn't work then fail
if(!linked_db)
@@ -78,13 +78,13 @@
else
..()
/obj/item/device/eftpos/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
/obj/item/eftpos/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
ui = SSnanoui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
ui = new(user, src, ui_key, "eftpos.tmpl", name, 790, 310)
ui.open()
/obj/item/device/eftpos/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
/obj/item/eftpos/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
var/data[0]
data["eftpos_name"] = eftpos_name
data["machine_id"] = machine_id
@@ -95,7 +95,7 @@
data["linked_account"] = linked_account ? linked_account.owner_name : null
return data
/obj/item/device/eftpos/Topic(href, list/href_list)
/obj/item/eftpos/Topic(href, list/href_list)
if(..())
return 1
@@ -175,7 +175,7 @@
SSnanoui.update_uis(src)
return 1
/obj/item/device/eftpos/proc/scan_card(obj/item/card/I, mob/user)
/obj/item/eftpos/proc/scan_card(obj/item/card/I, mob/user)
if(istype(I, /obj/item/card/id))
var/obj/item/card/id/C = I
visible_message("<span class='info'>[user] swipes a card through [src].</span>")
+6 -5
View File
@@ -8,7 +8,7 @@ var/total_runtimes_skipped = 0
#ifdef DEBUG
/world/Error(var/exception/e, var/datum/e_src)
if(!istype(e)) // Something threw an unusual exception
log_to_dd("\[[time_stamp()]] Uncaught exception: [e]")
log_world("\[[time_stamp()]] Uncaught exception: [e]")
return ..()
if(!error_last_seen) // A runtime is occurring too early in start-up initialization
return ..()
@@ -39,7 +39,7 @@ var/total_runtimes_skipped = 0
var/skipcount = abs(error_cooldown[erroruid]) - 1
error_cooldown[erroruid] = 0
if(skipcount > 0)
log_to_dd("\[[time_stamp()]] Skipped [skipcount] runtimes in [e.file],[e.line].")
log_world("\[[time_stamp()]] Skipped [skipcount] runtimes in [e.file],[e.line].")
error_cache.logError(e, skipCount = skipcount)
error_last_seen[erroruid] = world.time
error_cooldown[erroruid] = cooldown
@@ -95,12 +95,13 @@ var/total_runtimes_skipped = 0
desclines += " (This error will now be silenced for [ERROR_SILENCE_TIME / 600] minutes)"
// Now to actually output the error info...
log_to_dd("\[[time_stamp()]] Runtime in [e.file],[e.line]: [e]")
log_world("\[[time_stamp()]] Runtime in [e.file],[e.line]: [e]")
log_runtime_txt("Runtime in [e.file],[e.line]: [e]")
for(var/line in desclines)
log_to_dd(line)
log_world(line)
log_runtime_txt(line)
if(error_cache)
error_cache.logError(e, desclines, e_src = e_src)
#endif
/proc/log_runtime(exception/e, datum/e_src, extra_info)
+3 -3
View File
@@ -16,9 +16,9 @@
var/turf/T = pick(get_area_turfs(impact_area))
if(T)
// Calculate new position (searches through beacons in world)
var/obj/item/device/radio/beacon/chosen
var/obj/item/radio/beacon/chosen
var/list/possible = list()
for(var/obj/item/device/radio/beacon/W in world)
for(var/obj/item/radio/beacon/W in world)
if(!is_station_level(W.z))
continue
possible += W
@@ -43,7 +43,7 @@
var/y_distance = TO.y - FROM.y
var/x_distance = TO.x - FROM.x
for(var/atom/movable/A in range(12, FROM )) // iterate thru list of mobs in the area
if(istype(A, /obj/item/device/radio/beacon)) continue // don't teleport beacons because that's just insanely stupid
if(istype(A, /obj/item/radio/beacon)) continue // don't teleport beacons because that's just insanely stupid
if(A.anchored) continue
var/turf/newloc = locate(A.x + x_distance, A.y + y_distance, TO.z) // calculate the new place
+51
View File
@@ -0,0 +1,51 @@
/datum/event/aurora_caelus
announceWhen = 5
startWhen = 1
endWhen = 50
var/list/aurora_colors = list("#A2FF80", "#A2FF8B", "#A2FF96", "#A2FFA5", "#A2FFB6", "#A2FFC7", "#A2FFDE")
var/aurora_progress = 0 //this cycles from 1 to 7, slowly changing colors from gentle green to gentle blue
/datum/event/aurora_caelus/announce()
event_announcement.Announce("[station_name()]: A harmless cloud of ions is approaching your station, and will exhaust their energy battering the hull. \
Nanotrasen has approved a short break for all employees to relax and observe this very rare event. \
During this time, starlight will be bright but gentle, shifting between quiet green and blue colors. \
Any staff who would like to view these lights for themselves may proceed to the area nearest to them with viewing ports to open space. \
We hope you enjoy the lights.", "Harmless ions approaching", new_sound = 'sound/misc/notice2.ogg', from = "Nanotrasen Meteorology Division")
for(var/V in player_list)
var/mob/M = V
if((M.client.prefs.toggles & SOUND_MIDI) && is_station_level(M.z))
M.playsound_local(null, 'sound/ambience/aurora_caelus.ogg', 20, FALSE, pressure_affected = FALSE)
/datum/event/aurora_caelus/start()
for(var/s in GLOB.station_level_space_turfs)
var/turf/space/S = s
S.set_light(S.light_range * 3, S.light_power * 0.5, aurora_colors[1])
CHECK_TICK
/datum/event/aurora_caelus/tick()
if(aurora_progress >= aurora_colors.len)
return
if(activeFor % 5 == 0)
aurora_progress++
var/aurora_color = aurora_colors[aurora_progress]
for(var/s in GLOB.station_level_space_turfs)
var/turf/space/S = s
S.set_light(l_color = aurora_color)
CHECK_TICK
/datum/event/aurora_caelus/end()
for(var/s in GLOB.station_level_space_turfs)
var/turf/space/S = s
fade_to_black(S)
event_announcement.Announce("The Aurora Caelus event is now ending. Starlight conditions will slowly return to normal. \
When this has concluded, please return to your workplace and continue work as normal. \
Have a pleasant shift, [station_name()], and thank you for watching with us.",
"Harmless ions approaching", new_sound = 'sound/misc/notice2.ogg', from = "Nanotrasen Meteorology Division")
/datum/event/aurora_caelus/proc/fade_to_black(turf/space/S)
set waitfor = FALSE
var/new_light = config.starlight
while(S.light_range > new_light)
S.set_light(S.light_range - 0.2)
sleep(30)
S.set_light(new_light, 1, l_color = "") // we should be able to use `, null` as the last arg but BYOND is a piece of FUCKING SHIT AND SET_LIGHT DOESN'T WORK THAT WAY DESPITE EVERY FUCKING THING ABOUT IT INDICATING THAT IT GODDAMN WELL SHOULD AAAAAAAAAAAAAAAAA
+2 -1
View File
@@ -138,7 +138,8 @@ var/list/event_last_fired = list()
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Mundane News", /datum/event/mundane_news, 300),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Vermin Infestation",/datum/event/infestation, 100, list(ASSIGNMENT_JANITOR = 100)),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Sentience", /datum/event/sentience, 50),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Wallrot", /datum/event/wallrot, 0, list(ASSIGNMENT_ENGINEER = 30, ASSIGNMENT_GARDENER = 50))
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Wallrot", /datum/event/wallrot, 0, list(ASSIGNMENT_ENGINEER = 30, ASSIGNMENT_GARDENER = 50)),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Aurora Caelus", /datum/event/aurora_caelus, 15, is_one_shot = TRUE)
)
/datum/event_container/moderate
+1 -1
View File
@@ -493,7 +493,7 @@
/proc/generate_static_ion_law()
/var/list/players = list()
for(var/mob/living/carbon/human/player in player_list)
if( !player.mind || player.mind.assigned_role == "MODE" || player.client.inactivity > MinutesToTicks(10))
if( !player.mind || player.mind.assigned_role == player.mind.special_role || player.client.inactivity > MinutesToTicks(10))
continue
players += player.real_name
var/random_player = "The Captain"
+2 -2
View File
@@ -28,7 +28,7 @@
if(prob(5))
// /obj/machinery/message_server/proc/send_pda_message(var/recipient = "",var/sender = "",var/message = "")
var/list/viables = list()
for(var/obj/item/device/pda/check_pda in PDAs)
for(var/obj/item/pda/check_pda in PDAs)
var/datum/data/pda/app/messenger/check_m = check_pda.find_program(/datum/data/pda/app/messenger)
if(!check_m || !check_m.can_receive())
@@ -37,7 +37,7 @@
if(!viables.len)
return
var/obj/item/device/pda/P = pick(viables)
var/obj/item/pda/P = pick(viables)
var/datum/data/pda/app/messenger/PM = P.find_program(/datum/data/pda/app/messenger)
var/sender
+1 -1
View File
@@ -50,7 +50,7 @@ var/global/list/unused_trade_stations = list("sol")
switch(station)
if("sol")
M = new /mob/living/carbon/human(picked_loc)
M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear)
M.equip_to_slot_or_del(new /obj/item/radio/headset(M), slot_l_ear)
M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/cargotech(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/storage/backpack/industrial(M), slot_back)
+2 -2
View File
@@ -11,7 +11,7 @@
dream_images += pick_n_take(dreams)
dreaming++
for(var/i in 1 to dream_images.len)
addtimer(src, "experience_dream", ((i - 1) * rand(30,60)), FALSE, dream_images[i], FALSE)
addtimer(CALLBACK(src, .proc/experience_dream, dream_images[i], FALSE), ((i - 1) * rand(30,60)))
return TRUE
@@ -33,7 +33,7 @@
dream_images += pick_n_take(nightmares)
nightmare++
for(var/i in 1 to dream_images.len)
addtimer(src, "experience_dream", ((i - 1) * rand(30,60)), FALSE, nightmares[i], TRUE)
addtimer(CALLBACK(src, .proc/experience_dream, nightmares[i], TRUE), ((i - 1) * rand(30,60)))
return TRUE
/mob/living/carbon/proc/handle_dreams()
+9 -9
View File
@@ -339,7 +339,7 @@ Gunshots/explosions/opening doors/less rare audio (done)
s.loc = get_step(get_turf(s), get_dir(s, target))
s.Show()
s.Eat()
addtimer(src, "wake_and_restore", rand(50, 100))
addtimer(CALLBACK(src, .proc/wake_and_restore), rand(50, 100))
qdel(s)
/obj/effect/hallucination/simple/singularity
@@ -365,9 +365,9 @@ Gunshots/explosions/opening doors/less rare audio (done)
for(var/i=0,i<hits,i++)
target.playsound_local(null, 'sound/weapons/Laser.ogg', 25, 1)
if(prob(75))
addtimer(target, "playsound_local", rand(10,20), null, 'sound/weapons/sear.ogg', 25, 1)
addtimer(CALLBACK(target, /mob/.proc/playsound_local, null, 'sound/weapons/sear.ogg', 25, 1), rand(10,20))
else
addtimer(target, "playsound_local", rand(10,20), null, 'sound/weapons/effects/searwall.ogg', 25, 1)
addtimer(CALLBACK(target, /mob/.proc/playsound_local, null, 'sound/weapons/effects/searwall.ogg', 25, 1), rand(10,20))
sleep(rand(CLICK_CD_RANGE, CLICK_CD_RANGE + 8))
target.playsound_local(null, get_sfx("bodyfall"), 25)
if(2) //Esword fight
@@ -381,9 +381,9 @@ Gunshots/explosions/opening doors/less rare audio (done)
for(var/i=0,i<hits,i++)
target.playsound_local(null, get_sfx("gunshot"), 25)
if(prob(75))
addtimer(target, "playsound_local", rand(10,20), null, 'sound/weapons/pierce.ogg', 25, 1)
addtimer(CALLBACK(target, /mob/.proc/playsound_local, null, 'sound/weapons/pierce.ogg', 25, 1), rand(10,20))
else
addtimer(target, "playsound_local", rand(10,20), null, "ricochet", 25, 1)
addtimer(CALLBACK(target, /mob/.proc/playsound_local, null, "ricochet", 25, 1), rand(10,20))
sleep(rand(CLICK_CD_RANGE, CLICK_CD_RANGE + 8))
target.playsound_local(null, get_sfx("bodyfall"), 25, 1)
if(4) //Stunprod + cablecuff
@@ -681,13 +681,13 @@ var/list/non_fakeattack_weapons = list(/obj/item/gun/projectile, /obj/item/ammo_
/obj/item/cartridge/syndicate, /obj/item/clothing/under/chameleon,\
/obj/item/clothing/shoes/syndigaloshes, /obj/item/card/id/syndicate,\
/obj/item/clothing/mask/gas/voice, /obj/item/clothing/glasses/thermal,\
/obj/item/device/chameleon, /obj/item/card/emag,\
/obj/item/chameleon, /obj/item/card/emag,\
/obj/item/storage/toolbox/syndicate, /obj/item/aiModule,\
/obj/item/device/radio/headset/syndicate, /obj/item/grenade/plastic/c4,\
/obj/item/device/powersink, /obj/item/storage/box/syndie_kit,\
/obj/item/radio/headset/syndicate, /obj/item/grenade/plastic/c4,\
/obj/item/powersink, /obj/item/storage/box/syndie_kit,\
/obj/item/toy/syndicateballoon, /obj/item/gun/energy/laser/captain,\
/obj/item/hand_tele, /obj/item/rcd, /obj/item/tank/jetpack,\
/obj/item/clothing/under/rank/captain, /obj/item/device/aicard,\
/obj/item/clothing/under/rank/captain, /obj/item/aicard,\
/obj/item/clothing/shoes/magboots, /obj/item/areaeditor/blueprints, /obj/item/disk/nuclear,\
/obj/item/clothing/suit/space/nasavoid, /obj/item/tank)

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