mirror of
https://github.com/PolarisSS13/Polaris.git
synced 2026-08-22 04:36:53 +01:00
Merge branch 'master' of https://github.com/PolarisSS13/Polaris into 2/17/2018_make_AI_great_again
This commit is contained in:
@@ -6,13 +6,13 @@ world/IsBanned(key,address,computer_id)
|
||||
|
||||
//Guest Checking
|
||||
if(!config.guests_allowed && IsGuestKey(key))
|
||||
log_access("Failed Login: [key] - Guests not allowed")
|
||||
log_adminwarn("Failed Login: [key] - Guests not allowed")
|
||||
message_admins("<font color='blue'>Failed Login: [key] - Guests not allowed</font>")
|
||||
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 && config.ToRban && ToRban_isbanned(address))
|
||||
log_access("Failed Login: [src] - Banned: ToR")
|
||||
log_adminwarn("Failed Login: [src] - Banned: ToR")
|
||||
message_admins("<font color='blue'>Failed Login: [src] - Banned: ToR</font>")
|
||||
//ban their computer_id and ckey for posterity
|
||||
AddBan(ckey(key), computer_id, "Use of ToR", "Automated Ban", 0, 0)
|
||||
@@ -24,7 +24,7 @@ world/IsBanned(key,address,computer_id)
|
||||
//Ban Checking
|
||||
. = CheckBan( ckey(key), computer_id, address )
|
||||
if(.)
|
||||
log_access("Failed Login: [key] [computer_id] [address] - Banned [.["reason"]]")
|
||||
log_adminwarn("Failed Login: [key] [computer_id] [address] - Banned [.["reason"]]")
|
||||
message_admins("<font color='blue'>Failed Login: [key] id:[computer_id] ip:[address] - Banned [.["reason"]]</font>")
|
||||
return .
|
||||
|
||||
|
||||
@@ -6,13 +6,13 @@ var/global/floorIsLava = 0
|
||||
////////////////////////////////
|
||||
/proc/message_admins(var/msg)
|
||||
msg = "<span class=\"log_message\"><span class=\"prefix\">ADMIN LOG:</span> <span class=\"message\">[msg]</span></span>"
|
||||
log_adminwarn(msg)
|
||||
//log_adminwarn(msg) //log_and_message_admins is for this
|
||||
|
||||
for(var/client/C in admins)
|
||||
if((R_ADMIN|R_MOD) & C.holder.rights)
|
||||
C << msg
|
||||
|
||||
/proc/msg_admin_attack(var/text) //Toggleable Attack Messages
|
||||
log_attack(text)
|
||||
var/rendered = "<span class=\"log_message\"><span class=\"prefix\">ATTACK:</span> <span class=\"message\">[text]</span></span>"
|
||||
for(var/client/C in admins)
|
||||
if((R_ADMIN|R_MOD) & C.holder.rights)
|
||||
@@ -380,7 +380,7 @@ proc/admin_notice(var/message, var/rights)
|
||||
if(3)
|
||||
dat+={"
|
||||
Creating new Feed Message...
|
||||
<HR><B><A href='?src=\ref[src];ac_set_channel_receiving=1'>Receiving Channel</A>:</B> [src.admincaster_feed_channel.channel_name]<BR>" //MARK
|
||||
<HR><B><A href='?src=\ref[src];ac_set_channel_receiving=1'>Receiving Channel</A>:</B> [src.admincaster_feed_channel.channel_name]<BR>
|
||||
<B>Message Author:</B> <FONT COLOR='green'>[src.admincaster_signature]</FONT><BR>
|
||||
<B><A href='?src=\ref[src];ac_set_new_message=1'>Message Body</A>:</B> [src.admincaster_feed_message.body] <BR>
|
||||
<BR><A href='?src=\ref[src];ac_submit_new_message=1'>Submit</A><BR><BR><A href='?src=\ref[src];ac_setScreen=[0]'>Cancel</A><BR>
|
||||
@@ -674,10 +674,7 @@ proc/admin_notice(var/message, var/rights)
|
||||
set desc = "Send an intercom message, like an arrivals announcement."
|
||||
if(!check_rights(0)) return
|
||||
|
||||
//This is basically how death alarms do it
|
||||
var/obj/item/device/radio/headset/a = new /obj/item/device/radio/headset/omni(null)
|
||||
|
||||
var/channel = input("Channel for message:","Channel", null) as null|anything in (list("Common") + a.keyslot2.channels) // + a.keyslot1.channels
|
||||
var/channel = input("Channel for message:","Channel", null) as null|anything in radiochannels
|
||||
|
||||
if(channel) //They picked a channel
|
||||
var/sender = input("Name of sender (max 75):", "Announcement", "Announcement Computer") as null|text
|
||||
@@ -688,11 +685,94 @@ proc/admin_notice(var/message, var/rights)
|
||||
|
||||
if(message) //They put a message
|
||||
message = sanitize(message, 500, extra = 0)
|
||||
a.autosay("[message]", "[sender]", "[channel == "Common" ? null : channel]") //Common is a weird case, as it's not a "channel", it's just talking into a radio without a channel set.
|
||||
global_announcer.autosay("[message]", "[sender]", "[channel == "Common" ? null : channel]") //Common is a weird case, as it's not a "channel", it's just talking into a radio without a channel set.
|
||||
log_admin("Intercom: [key_name(usr)] : [sender]:[message]")
|
||||
qdel(a)
|
||||
|
||||
feedback_add_details("admin_verb","IN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
/datum/admins/proc/intercom_convo()
|
||||
set category = "Fun"
|
||||
set name = "Intercom Convo"
|
||||
set desc = "Send an intercom conversation, like several uses of the Intercom Msg verb."
|
||||
set waitfor = FALSE //Why bother? We have some sleeps. You can leave tho!
|
||||
if(!check_rights(0)) return
|
||||
|
||||
var/channel = input("Channel for message:","Channel", null) as null|anything in radiochannels
|
||||
|
||||
if(!channel) //They picked a channel
|
||||
return
|
||||
|
||||
to_chat(usr,"<span class='notice'><B>Intercom Convo Directions</B><br>Start the conversation with the sender, a pipe (|), and then the message on one line. Then hit enter to \
|
||||
add another line, and type a (whole) number of seconds to pause between that message, and the next message, then repeat the message syntax up to 20 times. For example:<br>\
|
||||
--- --- ---<br>\
|
||||
Some Guy|Hello guys, what's up?<br>\
|
||||
5<br>\
|
||||
Other Guy|Hey, good to see you.<br>\
|
||||
5<br>\
|
||||
Some Guy|Yeah, you too.<br>\
|
||||
--- --- ---<br>\
|
||||
The above will result in those messages playing, with a 5 second gap between each. Maximum of 20 messages allowed.</span>")
|
||||
|
||||
var/list/decomposed
|
||||
var/message = input(usr,"See your chat box for instructions. Keep a copy elsewhere in case it is rejected when you click OK.", "Input Conversation", "") as null|message
|
||||
|
||||
if(!message)
|
||||
return
|
||||
|
||||
//Split on pipe or \n
|
||||
decomposed = splittext(message,regex("\\||$","m"))
|
||||
decomposed += "0" //Tack on a final 0 sleep to make 3-per-message evenly
|
||||
|
||||
//Time to find how they screwed up.
|
||||
//Wasn't the right length
|
||||
if((decomposed.len) % 3) //+1 to accomidate the lack of a wait time for the last message
|
||||
to_chat(usr,"<span class='warning'>You passed [decomposed.len] segments (senders+messages+pauses). You must pass a multiple of 3, minus 1 (no pause after the last message). That means a sender and message on every other line (starting on the first), separated by a pipe character (|), and a number every other line that is a pause in seconds.</span>")
|
||||
return
|
||||
|
||||
//Too long a conversation
|
||||
if((decomposed.len / 3) > 20)
|
||||
to_chat(usr,"<span class='warning'>This conversation is too long! 20 messages maximum, please.</span>")
|
||||
return
|
||||
|
||||
//Missed some sleeps, or sanitized to nothing.
|
||||
for(var/i = 1; i < decomposed.len; i++)
|
||||
|
||||
//Sanitize sender
|
||||
var/clean_sender = sanitize(decomposed[i])
|
||||
if(!clean_sender)
|
||||
to_chat(usr,"<span class='warning'>One part of your conversation was not able to be sanitized. It was the sender of the [(i+2)/3]\th message.</span>")
|
||||
return
|
||||
decomposed[i] = clean_sender
|
||||
|
||||
//Sanitize message
|
||||
var/clean_message = sanitize(decomposed[++i])
|
||||
if(!clean_message)
|
||||
to_chat(usr,"<span class='warning'>One part of your conversation was not able to be sanitized. It was the body of the [(i+2)/3]\th message.</span>")
|
||||
return
|
||||
decomposed[i] = clean_message
|
||||
|
||||
//Sanitize wait time
|
||||
var/clean_time = text2num(decomposed[++i])
|
||||
if(!isnum(clean_time))
|
||||
to_chat(usr,"<span class='warning'>One part of your conversation was not able to be sanitized. It was the wait time after the [(i+2)/3]\th message.</span>")
|
||||
return
|
||||
if(clean_time > 60)
|
||||
to_chat(usr,"<span class='warning'>Max 60 second wait time between messages for sanity's sake please.</span>")
|
||||
return
|
||||
decomposed[i] = clean_time
|
||||
|
||||
log_admin("Intercom convo started by: [key_name(usr)] : [sanitize(message)]")
|
||||
feedback_add_details("admin_verb","IN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
//Sanitized AND we still have a chance to send it? Wow!
|
||||
if(LAZYLEN(decomposed))
|
||||
for(var/i = 1; i < decomposed.len; i++)
|
||||
var/this_sender = decomposed[i]
|
||||
var/this_message = decomposed[++i]
|
||||
var/this_wait = decomposed[++i]
|
||||
global_announcer.autosay("[this_message]", "[this_sender]", "[channel == "Common" ? null : channel]") //Common is a weird case, as it's not a "channel", it's just talking into a radio without a channel set.
|
||||
sleep(this_wait SECONDS)
|
||||
|
||||
/datum/admins/proc/toggleooc()
|
||||
set category = "Server"
|
||||
set desc="Globally Toggles OOC"
|
||||
|
||||
@@ -16,7 +16,7 @@ proc/log_and_message_admins_many(var/list/mob/users, var/message)
|
||||
|
||||
log_admin("[english_list(user_keys)] [message]")
|
||||
message_admins("[english_list(user_keys)] [message]")
|
||||
|
||||
/* Old procs
|
||||
proc/admin_attack_log(var/mob/attacker, var/mob/victim, var/attacker_message, var/victim_message, var/admin_message)
|
||||
if(victim)
|
||||
victim.attack_log += text("\[[time_stamp()]\] <font color='orange'>[key_name(attacker)] - [victim_message]</font>")
|
||||
@@ -42,3 +42,4 @@ proc/admin_inject_log(mob/attacker, mob/victim, obj/item/weapon, reagents, amoun
|
||||
"used \the [weapon] to [violent]inject - [reagents] - [amount_transferred]u transferred",
|
||||
"was [violent]injected with \the [weapon] - [reagents] - [amount_transferred]u transferred",
|
||||
"used \the [weapon] to [violent]inject [reagents] ([amount_transferred]u transferred) into")
|
||||
*/
|
||||
|
||||
@@ -6,6 +6,10 @@ var/list/admin_ranks = list() //list of all ranks with associated rights
|
||||
|
||||
var/previous_rights = 0
|
||||
|
||||
//Clear profile access
|
||||
for(var/A in world.GetConfig("admin"))
|
||||
world.SetConfig("APP/admin", A, null)
|
||||
|
||||
//load text from file
|
||||
var/list/Lines = file2list("config/admin_ranks.txt")
|
||||
|
||||
|
||||
@@ -26,6 +26,7 @@ var/list/admin_verbs_admin = list(
|
||||
/datum/admins/proc/toggleguests, //toggles whether guests can join the current game,
|
||||
/datum/admins/proc/announce, //priority announce something to all clients.,
|
||||
/datum/admins/proc/intercom, //send a fake intercom message, like an arrivals announcement,
|
||||
/datum/admins/proc/intercom_convo, //send a fake intercom conversation, like an ATC exchange,
|
||||
/client/proc/colorooc, //allows us to set a custom colour for everythign we say in ooc,
|
||||
/client/proc/admin_ghost, //allows us to ghost/reenter body at will,
|
||||
/client/proc/toggle_view_range, //changes how far we can see,
|
||||
@@ -192,6 +193,8 @@ var/list/admin_verbs_debug = list(
|
||||
/client/proc/cmd_debug_del_all,
|
||||
/client/proc/cmd_debug_tog_aliens,
|
||||
/client/proc/cmd_display_del_log,
|
||||
/client/proc/cmd_display_init_log,
|
||||
/client/proc/cmd_display_overlay_log,
|
||||
/client/proc/air_report,
|
||||
/client/proc/reload_admins,
|
||||
/client/proc/reload_eventMs,
|
||||
|
||||
@@ -23,6 +23,8 @@ var/list/admin_datums = list()
|
||||
rank = initial_rank
|
||||
rights = initial_rights
|
||||
admin_datums[ckey] = src
|
||||
if(rights & R_DEBUG) //grant profile access
|
||||
world.SetConfig("APP/admin", ckey, "role=admin")
|
||||
|
||||
/datum/admins/proc/associate(client/C)
|
||||
if(istype(C))
|
||||
|
||||
@@ -1001,11 +1001,6 @@
|
||||
//strip their stuff and stick it in the crate
|
||||
for(var/obj/item/I in M)
|
||||
M.drop_from_inventory(I, locker)
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
H.update_icons_layers() //Cheaper
|
||||
else
|
||||
M.update_icons()
|
||||
|
||||
//so they black out before warping
|
||||
M.Paralyse(5)
|
||||
@@ -1188,10 +1183,8 @@
|
||||
usr << "This can only be used on instances of type /mob/living/carbon/human"
|
||||
return
|
||||
var/block=text2num(href_list["block"])
|
||||
//testing("togmutate([href_list["block"]] -> [block])")
|
||||
usr.client.cmd_admin_toggle_block(H,block)
|
||||
show_player_panel(H)
|
||||
//H.regenerate_icons()
|
||||
|
||||
else if(href_list["adminplayeropts"])
|
||||
var/mob/M = locate(href_list["adminplayeropts"])
|
||||
@@ -1228,7 +1221,7 @@
|
||||
if(ismob(M))
|
||||
var/take_msg = "<span class='notice'><b>ADMINHELP</b>: <b>[key_name(usr.client)]</b> is attending to <b>[key_name(M)]'s</b> adminhelp, please don't dogpile them.</span>"
|
||||
for(var/client/X in admins)
|
||||
if((R_ADMIN|R_MOD|R_EVENT) & X.holder.rights)
|
||||
if((R_ADMIN|R_MOD|R_EVENT|R_SERVER) & X.holder.rights)
|
||||
to_chat(X, take_msg)
|
||||
to_chat(M, "<span class='notice'><b>Your adminhelp is being attended to by [usr.client]. Thanks for your patience!</b></span>")
|
||||
else
|
||||
|
||||
@@ -104,7 +104,7 @@
|
||||
if(C.is_preference_enabled(/datum/client_preference/holder/play_adminhelp_ping))
|
||||
C << 'sound/effects/adminhelp.ogg'
|
||||
|
||||
log_admin("PM: [key_name(src)]->[key_name(C)]: [msg]")
|
||||
log_adminpm(msg,src,C)
|
||||
send2adminirc("Reply: [key_name(src)]->[key_name(C)]: [html_decode(msg)]")
|
||||
|
||||
//we don't use message_admins here because the sender/receiver might get it too
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
if(!msg)
|
||||
return
|
||||
|
||||
log_admin("ADMIN: [key_name(src)] : [msg]")
|
||||
log_adminsay(msg,src)
|
||||
|
||||
if(check_rights(R_ADMIN,0))
|
||||
for(var/client/C in admins)
|
||||
@@ -27,7 +27,7 @@
|
||||
return
|
||||
|
||||
msg = sanitize(msg)
|
||||
log_admin("MOD: [key_name(src)] : [msg]")
|
||||
log_modsay(msg,src)
|
||||
|
||||
if (!msg)
|
||||
return
|
||||
@@ -50,7 +50,7 @@
|
||||
return
|
||||
|
||||
msg = sanitize(msg)
|
||||
log_admin("EVENT: [key_name(src)] : [msg]")
|
||||
log_eventsay(msg,src)
|
||||
|
||||
if (!msg)
|
||||
return
|
||||
|
||||
@@ -39,4 +39,4 @@
|
||||
if((M.mind && M.mind.special_role && A && A.can_use_aooc) || isobserver(M)) // Antags must have their type be allowed to AOOC to see AOOC. This prevents, say, ERT from seeing AOOC.
|
||||
to_chat(M, "<span class='ooc'><span class='aooc'>[create_text_tag("aooc", "Antag-OOC:", M.client)] <EM>[player_display]:</EM> <span class='message'>[msg]</span></span></span>")
|
||||
|
||||
log_ooc("(ANTAG) [key] : [msg]")
|
||||
log_aooc(msg,src)
|
||||
@@ -327,6 +327,36 @@
|
||||
|
||||
usr << browse(dellog.Join(), "window=dellog")
|
||||
|
||||
/client/proc/cmd_display_init_log()
|
||||
set category = "Debug"
|
||||
set name = "Display Initialize() Log"
|
||||
set desc = "Displays a list of things that didn't handle Initialize() properly"
|
||||
|
||||
if(!check_rights(R_DEBUG)) return
|
||||
src << browse(replacetext(SSatoms.InitLog(), "\n", "<br>"), "window=initlog")
|
||||
|
||||
/client/proc/cmd_display_overlay_log()
|
||||
set category = "Debug"
|
||||
set name = "Display overlay Log"
|
||||
set desc = "Display SSoverlays log of everything that's passed through it."
|
||||
|
||||
if(!check_rights(R_DEBUG)) return
|
||||
render_stats(SSoverlays.stats, src)
|
||||
|
||||
// Render stats list for round-end statistics.
|
||||
/proc/render_stats(list/stats, user, sort = /proc/cmp_generic_stat_item_time)
|
||||
sortTim(stats, sort, TRUE)
|
||||
|
||||
var/list/lines = list()
|
||||
for (var/entry in stats)
|
||||
var/list/data = stats[entry]
|
||||
lines += "[entry] => [num2text(data[STAT_ENTRY_TIME], 10)]ms ([data[STAT_ENTRY_COUNT]]) (avg:[num2text(data[STAT_ENTRY_TIME]/(data[STAT_ENTRY_COUNT] || 1), 99)])"
|
||||
|
||||
if (user)
|
||||
user << browse("<ol><li>[lines.Join("</li><li>")]</li></ol>", "window=[url_encode("stats:\ref[stats]")]")
|
||||
else
|
||||
. = lines.Join("\n")
|
||||
|
||||
/client/proc/cmd_admin_grantfullaccess(var/mob/M in mob_list)
|
||||
set category = "Admin"
|
||||
set name = "Grant Full Access"
|
||||
|
||||
@@ -85,7 +85,7 @@
|
||||
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"
|
||||
var/path = "[log_path].log"
|
||||
if( fexists(path) )
|
||||
src << run( file(path) )
|
||||
else
|
||||
@@ -99,7 +99,10 @@
|
||||
set category = "Admin"
|
||||
set name = "Show Server Attack Log"
|
||||
set desc = "Shows today's server attack log."
|
||||
|
||||
to_chat(usr,"This verb doesn't actually do anything.")
|
||||
|
||||
/*
|
||||
var/path = "data/logs/[time2text(world.realtime,"YYYY/MM-Month/DD-Day")] Attack.log"
|
||||
if( fexists(path) )
|
||||
src << run( file(path) )
|
||||
@@ -109,3 +112,5 @@
|
||||
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
|
||||
*/
|
||||
|
||||
@@ -37,7 +37,6 @@
|
||||
if(ishuman(usr))
|
||||
var/mob/living/carbon/human/H = usr
|
||||
H.name = H.get_visible_name()
|
||||
// usr.regenerate_icons() //So the name is updated properly
|
||||
|
||||
usr.loc = O.loc // Appear where the object you were controlling is -- TLE
|
||||
usr.client.eye = usr
|
||||
|
||||
@@ -143,7 +143,12 @@
|
||||
vtext = "<a href='?_src_=vars;Vars=\ref[C]'>\ref[C]</a> - [C] ([C.type])"
|
||||
else if(islist(value))
|
||||
var/list/L = value
|
||||
vtext = "/list ([L.len])"
|
||||
var/removed = 0
|
||||
if(varname == "contents")
|
||||
var/list/original = value
|
||||
L = original.Copy() //We'll take a copy to manipulate
|
||||
removed = D.view_variables_filter_contents(L)
|
||||
vtext = "/list ([L.len]+[removed]H)"
|
||||
if(!(varname in view_variables_dont_expand) && L.len > 0 && L.len < 100)
|
||||
extra = "<ul>"
|
||||
var/index = 1
|
||||
@@ -158,3 +163,21 @@
|
||||
vtext = "[value]"
|
||||
|
||||
return "<li>[ecm][varname] = <span class='value'>[vtext]</span>[extra]</li>"
|
||||
|
||||
//Allows us to mask out some contents when it's not necessary to show them
|
||||
//For example, organs on humans, as the organs are stored in other lists which will also be present
|
||||
//So there's really no need to list them twice.
|
||||
/datum/proc/view_variables_filter_contents(list/L)
|
||||
return 0 //Return how many items you removed.
|
||||
|
||||
/mob/living/carbon/human/view_variables_filter_contents(list/L)
|
||||
. = ..()
|
||||
L -= ability_master
|
||||
.++
|
||||
|
||||
/mob/living/carbon/human/view_variables_filter_contents(list/L)
|
||||
. = ..()
|
||||
var/len_before = L.len
|
||||
L -= organs
|
||||
L -= internal_organs
|
||||
. += len_before - L.len
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
var/corpseidjob = null // Needs to be in quotes, such as "Clown" or "Chef." This just determines what the ID reads as, not their access
|
||||
var/corpseidaccess = null //This is for access. See access.dm for which jobs give what access. Again, put in quotes. Use "Captain" if you want it to be all access.
|
||||
var/corpseidicon = null //For setting it to be a gold, silver, CentCom etc ID
|
||||
var/species = "Human"
|
||||
var/species = SPECIES_HUMAN
|
||||
delete_me = TRUE
|
||||
|
||||
/obj/effect/landmark/corpse/initialize()
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/obj/machinery/gateway
|
||||
name = "gateway"
|
||||
desc = "A mysterious gateway built by unknown hands, it allows for faster than light travel to far-flung locations."
|
||||
desc = "A state-of-the-art Nanotrasen gateway, used to teleport rich commuters anywhere in the same planetary system."
|
||||
icon = 'icons/obj/machines/gateway.dmi'
|
||||
icon_state = "off"
|
||||
density = 1
|
||||
@@ -234,4 +234,4 @@ obj/machinery/gateway/centerstation/process()
|
||||
else
|
||||
user << "<font color='blue'><b>Recalibration successful!</b>:</font><font color='black'> This gate's systems have been fine tuned. Travel to this gate will now be on target.</font>"
|
||||
calibrated = 1
|
||||
return
|
||||
return
|
||||
|
||||
@@ -285,7 +285,8 @@ var/list/blobs = list()
|
||||
name = "blob"
|
||||
desc = "The blob lashing out at something."
|
||||
icon_state = "blob_attack"
|
||||
layer = 5.2
|
||||
plane = MOB_PLANE
|
||||
layer = ABOVE_MOB_LAYER
|
||||
time_to_die = 6
|
||||
alpha = 140
|
||||
mouse_opacity = 0
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
melee_damage_lower = 2
|
||||
melee_damage_upper = 4
|
||||
layer = MOB_LAYER + 0.2 // Over the blob.
|
||||
attacktext = "slams into"
|
||||
attacktext = list("slams into")
|
||||
attack_sound = 'sound/effects/slime_squish.ogg'
|
||||
emote_see = list("sways", "inflates briefly")
|
||||
var/mob/living/carbon/human/infested = null // The human this thing is totally not making into a zombie.
|
||||
@@ -97,7 +97,7 @@
|
||||
melee_damage_lower += 8 // 10 total.
|
||||
melee_damage_upper += 11 // 15 total.
|
||||
emote_see = list("shambles around", "twitches", "stares")
|
||||
attacktext = "claws"
|
||||
attacktext = list("claws")
|
||||
|
||||
H.forceMove(src)
|
||||
infested = H
|
||||
|
||||
@@ -104,8 +104,8 @@
|
||||
// Note that the current station being used will be pruned from this list upon being instantiated
|
||||
destination_names = list(
|
||||
"NSS Exodus in Nyx",
|
||||
//"NCS Northern Star in Vir",
|
||||
"NLS Southern Cross in Vir",
|
||||
"NCS Northern Star in Vir",
|
||||
//"NLS Southern Cross in Vir",
|
||||
"NAS Vir Central Command",
|
||||
"a dockyard orbiting Sif",
|
||||
"an asteroid orbiting Kara",
|
||||
@@ -235,6 +235,19 @@
|
||||
motto = ""
|
||||
|
||||
ship_prefixes = list("WTV" = "freight")
|
||||
ship_names = list(
|
||||
"Comet",
|
||||
"Aurora",
|
||||
"Supernova",
|
||||
"Nebula",
|
||||
"Galaxy",
|
||||
"Starburst",
|
||||
"Constellation",
|
||||
"Pulsar",
|
||||
"Quark",
|
||||
"Void",
|
||||
"Asteroid"
|
||||
)
|
||||
destination_names = list()
|
||||
|
||||
/datum/lore/organization/tsc/bishop
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
var/adminobs = null
|
||||
var/area = null
|
||||
var/time_died_as_mouse = null //when the client last died as a mouse
|
||||
var/datum/tooltip/tooltips = null
|
||||
|
||||
var/adminhelped = 0
|
||||
|
||||
|
||||
@@ -252,7 +252,7 @@
|
||||
//Panic bunker code
|
||||
if (isnum(player_age) && player_age == 0) //first connection
|
||||
if (config.panic_bunker && !holder && !deadmin_holder)
|
||||
log_access("Failed Login: [key] - New account attempting to connect during panic bunker")
|
||||
log_adminwarn("Failed Login: [key] - New account attempting to connect during panic bunker")
|
||||
message_admins("<span class='adminnotice'>Failed Login: [key] - New account attempting to connect during panic bunker</span>")
|
||||
to_chat(src, "Sorry but the server is currently not accepting connections from never before seen players.")
|
||||
qdel(src)
|
||||
|
||||
@@ -152,7 +152,7 @@ datum/preferences/proc/set_biological_gender(var/gender)
|
||||
if(pref.species)
|
||||
S = all_species[pref.species]
|
||||
else
|
||||
S = all_species["Human"]
|
||||
S = all_species[SPECIES_HUMAN]
|
||||
var/list/possible_genders = S.genders
|
||||
if(!pref.organ_data || pref.organ_data[BP_TORSO] != "cyborg")
|
||||
return possible_genders
|
||||
|
||||
@@ -4,7 +4,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
|
||||
var/equip_preview_mob = EQUIP_PREVIEW_ALL
|
||||
|
||||
var/icon/bgstate = "000"
|
||||
var/list/bgstate_options = list("000", "fff", "steel", "white")
|
||||
var/list/bgstate_options = list("000", "midgrey", "FFF", "white", "steel", "techmaint", "dark", "plating", "reinforced")
|
||||
|
||||
/datum/category_item/player_setup_item/general/body
|
||||
name = "Body"
|
||||
@@ -69,7 +69,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
|
||||
|
||||
/datum/category_item/player_setup_item/general/body/sanitize_character(var/savefile/S)
|
||||
if(!pref.species || !(pref.species in playable_species))
|
||||
pref.species = "Human"
|
||||
pref.species = SPECIES_HUMAN
|
||||
pref.r_hair = sanitize_integer(pref.r_hair, 0, 255, initial(pref.r_hair))
|
||||
pref.g_hair = sanitize_integer(pref.g_hair, 0, 255, initial(pref.g_hair))
|
||||
pref.b_hair = sanitize_integer(pref.b_hair, 0, 255, initial(pref.b_hair))
|
||||
@@ -282,21 +282,21 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
|
||||
|
||||
. += "<b>Hair</b><br>"
|
||||
if(has_flag(mob_species, HAS_HAIR_COLOR))
|
||||
. += "<a href='?src=\ref[src];hair_color=1'>Change Color</a> <font face='fixedsys' size='3' color='#[num2hex(pref.r_hair, 2)][num2hex(pref.g_hair, 2)][num2hex(pref.b_hair, 2)]'><table style='display:inline;' bgcolor='#[num2hex(pref.r_hair, 2)][num2hex(pref.g_hair, 2)][num2hex(pref.b_hair)]'><tr><td>__</td></tr></table></font> "
|
||||
. += "<a href='?src=\ref[src];hair_color=1'>Change Color</a> <font face='fixedsys' size='3' color='#[num2hex(pref.r_hair, 2)][num2hex(pref.g_hair, 2)][num2hex(pref.b_hair, 2)]'><table style='display:inline;' bgcolor='#[num2hex(pref.r_hair, 2)][num2hex(pref.g_hair, 2)][num2hex(pref.b_hair, 2)]'><tr><td>__</td></tr></table></font> "
|
||||
. += " Style: <a href='?src=\ref[src];hair_style=1'>[pref.h_style]</a><br>"
|
||||
|
||||
. += "<br><b>Facial</b><br>"
|
||||
if(has_flag(mob_species, HAS_HAIR_COLOR))
|
||||
. += "<a href='?src=\ref[src];facial_color=1'>Change Color</a> <font face='fixedsys' size='3' color='#[num2hex(pref.r_facial, 2)][num2hex(pref.g_facial, 2)][num2hex(pref.b_facial, 2)]'><table style='display:inline;' bgcolor='#[num2hex(pref.r_facial, 2)][num2hex(pref.g_facial, 2)][num2hex(pref.b_facial)]'><tr><td>__</td></tr></table></font> "
|
||||
. += "<a href='?src=\ref[src];facial_color=1'>Change Color</a> <font face='fixedsys' size='3' color='#[num2hex(pref.r_facial, 2)][num2hex(pref.g_facial, 2)][num2hex(pref.b_facial, 2)]'><table style='display:inline;' bgcolor='#[num2hex(pref.r_facial, 2)][num2hex(pref.g_facial, 2)][num2hex(pref.b_facial, 2)]'><tr><td>__</td></tr></table></font> "
|
||||
. += " Style: <a href='?src=\ref[src];facial_style=1'>[pref.f_style]</a><br>"
|
||||
|
||||
if(has_flag(mob_species, HAS_EYE_COLOR))
|
||||
. += "<br><b>Eyes</b><br>"
|
||||
. += "<a href='?src=\ref[src];eye_color=1'>Change Color</a> <font face='fixedsys' size='3' color='#[num2hex(pref.r_eyes, 2)][num2hex(pref.g_eyes, 2)][num2hex(pref.b_eyes, 2)]'><table style='display:inline;' bgcolor='#[num2hex(pref.r_eyes, 2)][num2hex(pref.g_eyes, 2)][num2hex(pref.b_eyes)]'><tr><td>__</td></tr></table></font><br>"
|
||||
. += "<a href='?src=\ref[src];eye_color=1'>Change Color</a> <font face='fixedsys' size='3' color='#[num2hex(pref.r_eyes, 2)][num2hex(pref.g_eyes, 2)][num2hex(pref.b_eyes, 2)]'><table style='display:inline;' bgcolor='#[num2hex(pref.r_eyes, 2)][num2hex(pref.g_eyes, 2)][num2hex(pref.b_eyes, 2)]'><tr><td>__</td></tr></table></font><br>"
|
||||
|
||||
if(has_flag(mob_species, HAS_SKIN_COLOR))
|
||||
. += "<br><b>Body Color</b><br>"
|
||||
. += "<a href='?src=\ref[src];skin_color=1'>Change Color</a> <font face='fixedsys' size='3' color='#[num2hex(pref.r_skin, 2)][num2hex(pref.g_skin, 2)][num2hex(pref.b_skin, 2)]'><table style='display:inline;' bgcolor='#[num2hex(pref.r_skin, 2)][num2hex(pref.g_skin, 2)][num2hex(pref.b_skin)]'><tr><td>__</td></tr></table></font><br>"
|
||||
. += "<a href='?src=\ref[src];skin_color=1'>Change Color</a> <font face='fixedsys' size='3' color='#[num2hex(pref.r_skin, 2)][num2hex(pref.g_skin, 2)][num2hex(pref.b_skin, 2)]'><table style='display:inline;' bgcolor='#[num2hex(pref.r_skin, 2)][num2hex(pref.g_skin, 2)][num2hex(pref.b_skin, 2)]'><tr><td>__</td></tr></table></font><br>"
|
||||
|
||||
. += "<br><a href='?src=\ref[src];marking_style=1'>Body Markings +</a><br>"
|
||||
for(var/M in pref.body_markings)
|
||||
@@ -307,7 +307,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
|
||||
. += "<br>"
|
||||
. += "<b>Allow Synth color:</b> <a href='?src=\ref[src];synth_color=1'><b>[pref.synth_color ? "Yes" : "No"]</b></a><br>"
|
||||
if(pref.synth_color)
|
||||
. += "<a href='?src=\ref[src];synth2_color=1'>Change Color</a> <font face='fixedsys' size='3' color='#[num2hex(pref.r_synth, 2)][num2hex(pref.g_synth, 2)][num2hex(pref.b_synth, 2)]'><table style='display:inline;' bgcolor='#[num2hex(pref.r_synth, 2)][num2hex(pref.g_synth, 2)][num2hex(pref.b_synth)]'><tr><td>__</td></tr></table></font> "
|
||||
. += "<a href='?src=\ref[src];synth2_color=1'>Change Color</a> <font face='fixedsys' size='3' color='#[num2hex(pref.r_synth, 2)][num2hex(pref.g_synth, 2)][num2hex(pref.b_synth, 2)]'><table style='display:inline;' bgcolor='#[num2hex(pref.r_synth, 2)][num2hex(pref.g_synth, 2)][num2hex(pref.b_synth, 2)]'><tr><td>__</td></tr></table></font> "
|
||||
|
||||
. = jointext(.,null)
|
||||
|
||||
@@ -588,7 +588,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
|
||||
pref.rlimb_data[second_limb] = null
|
||||
|
||||
if("Prosthesis")
|
||||
var/tmp_species = pref.species ? pref.species : "Human"
|
||||
var/tmp_species = pref.species ? pref.species : SPECIES_HUMAN
|
||||
var/list/usable_manufacturers = list()
|
||||
for(var/company in chargen_robolimbs)
|
||||
var/datum/robolimb/M = chargen_robolimbs[company]
|
||||
@@ -727,7 +727,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
|
||||
|
||||
/datum/category_item/player_setup_item/general/body/proc/SetSpecies(mob/user)
|
||||
if(!pref.species_preview || !(pref.species_preview in all_species))
|
||||
pref.species_preview = "Human"
|
||||
pref.species_preview = SPECIES_HUMAN
|
||||
var/datum/species/current_species = all_species[pref.species_preview]
|
||||
var/dat = "<body>"
|
||||
dat += "<center><h2>[current_species.name] \[<a href='?src=\ref[src];show_species=1'>change</a>\]</h2></center><hr/>"
|
||||
@@ -741,7 +741,15 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
|
||||
dat += "<b>Language:</b> [current_species.species_language]<br/>"
|
||||
dat += "<small>"
|
||||
if(current_species.spawn_flags & SPECIES_CAN_JOIN)
|
||||
dat += "</br><b>Often present on human stations.</b>"
|
||||
switch(current_species.rarity_value)
|
||||
if(1 to 2)
|
||||
dat += "</br><b>Often present on human stations.</b>"
|
||||
if(3 to 4)
|
||||
dat += "</br><b>Rarely present on human stations.</b>"
|
||||
if(5)
|
||||
dat += "</br><b>Unheard of on human stations.</b>"
|
||||
else
|
||||
dat += "</br><b>May be present on human stations.</b>"
|
||||
if(current_species.spawn_flags & SPECIES_IS_WHITELISTED)
|
||||
dat += "</br><b>Whitelist restricted.</b>"
|
||||
if(!current_species.has_organ[O_HEART])
|
||||
|
||||
@@ -7,24 +7,28 @@
|
||||
S["UI_style_color"] >> pref.UI_style_color
|
||||
S["UI_style_alpha"] >> pref.UI_style_alpha
|
||||
S["ooccolor"] >> pref.ooccolor
|
||||
S["tooltipstyle"] >> pref.tooltipstyle
|
||||
|
||||
/datum/category_item/player_setup_item/player_global/ui/save_preferences(var/savefile/S)
|
||||
S["UI_style"] << pref.UI_style
|
||||
S["UI_style_color"] << pref.UI_style_color
|
||||
S["UI_style_alpha"] << pref.UI_style_alpha
|
||||
S["ooccolor"] << pref.ooccolor
|
||||
S["tooltipstyle"] << pref.tooltipstyle
|
||||
|
||||
/datum/category_item/player_setup_item/player_global/ui/sanitize_preferences()
|
||||
pref.UI_style = sanitize_inlist(pref.UI_style, all_ui_styles, initial(pref.UI_style))
|
||||
pref.UI_style_color = sanitize_hexcolor(pref.UI_style_color, initial(pref.UI_style_color))
|
||||
pref.UI_style_alpha = sanitize_integer(pref.UI_style_alpha, 0, 255, initial(pref.UI_style_alpha))
|
||||
pref.ooccolor = sanitize_hexcolor(pref.ooccolor, initial(pref.ooccolor))
|
||||
pref.tooltipstyle = sanitize_inlist(pref.tooltipstyle, all_tooltip_styles, initial(pref.tooltipstyle))
|
||||
|
||||
/datum/category_item/player_setup_item/player_global/ui/content(var/mob/user)
|
||||
. = "<b>UI Style:</b> <a href='?src=\ref[src];select_style=1'><b>[pref.UI_style]</b></a><br>"
|
||||
. += "<b>Custom UI</b> (recommended for White UI):<br>"
|
||||
. += "-Color: <a href='?src=\ref[src];select_color=1'><b>[pref.UI_style_color]</b></a> <table style='display:inline;' bgcolor='[pref.UI_style_color]'><tr><td>__</td></tr></table> <a href='?src=\ref[src];reset=ui'>reset</a><br>"
|
||||
. += "-Alpha(transparency): <a href='?src=\ref[src];select_alpha=1'><b>[pref.UI_style_alpha]</b></a> <a href='?src=\ref[src];reset=alpha'>reset</a><br>"
|
||||
. += "<b>Tooltip Style:</b> <a href='?src=\ref[src];select_tooltip_style=1'><b>[pref.tooltipstyle]</b></a><br>"
|
||||
if(can_select_ooc_color(user))
|
||||
. += "<b>OOC Color:</b> "
|
||||
if(pref.ooccolor == initial(pref.ooccolor))
|
||||
@@ -57,6 +61,12 @@
|
||||
pref.ooccolor = new_ooccolor
|
||||
return TOPIC_REFRESH
|
||||
|
||||
else if(href_list["select_tooltip_style"])
|
||||
var/tooltip_style_new = input(user, "Choose tooltip style.", "Character Preference", pref.tooltipstyle) as null|anything in all_tooltip_styles
|
||||
if(!tooltip_style_new || !CanUseTopic(user)) return TOPIC_NOACTION
|
||||
pref.tooltipstyle = tooltip_style_new
|
||||
return TOPIC_REFRESH
|
||||
|
||||
else if(href_list["reset"])
|
||||
switch(href_list["reset"])
|
||||
if("ui")
|
||||
|
||||
@@ -98,12 +98,25 @@ var/list/_client_preferences_by_type
|
||||
enabled_description = "Show"
|
||||
disabled_description = "Hide"
|
||||
|
||||
/datum/client_preference/mob_tooltips
|
||||
description ="Mob tooltips"
|
||||
key = "MOB_TOOLTIPS"
|
||||
enabled_description = "Show"
|
||||
disabled_description = "Hide"
|
||||
|
||||
/datum/client_preference/attack_icons
|
||||
description ="Attack icons"
|
||||
key = "ATTACK_ICONS"
|
||||
enabled_description = "Show"
|
||||
disabled_description = "Hide"
|
||||
|
||||
/datum/client_preference/hotkeys_default
|
||||
description ="Hotkeys Default"
|
||||
key = "HUD_HOTKEYS"
|
||||
enabled_description = "Enabled"
|
||||
disabled_description = "Disabled"
|
||||
enabled_by_default = FALSE // Backwards compatibility
|
||||
|
||||
/datum/client_preference/show_typing_indicator
|
||||
description ="Typing indicator"
|
||||
key = "SHOW_TYPING"
|
||||
@@ -112,7 +125,7 @@ var/list/_client_preferences_by_type
|
||||
|
||||
/datum/client_preference/show_typing_indicator/toggled(var/mob/preference_mob, var/enabled)
|
||||
if(!enabled)
|
||||
preference_mob.set_typing_indicator(0)
|
||||
preference_mob.set_typing_indicator(FALSE)
|
||||
|
||||
/datum/client_preference/show_ooc
|
||||
description ="OOC chat"
|
||||
|
||||
@@ -7,9 +7,4 @@
|
||||
|
||||
/datum/gear/ears/headphones
|
||||
display_name = "headphones"
|
||||
path = /obj/item/clothing/ears/earmuffs/headphones
|
||||
|
||||
/datum/gear/ears/translator
|
||||
display_name = "universal translator, ear"
|
||||
path = /obj/item/device/universal_translator/ear
|
||||
cost = 8
|
||||
path = /obj/item/clothing/ears/earmuffs/headphones
|
||||
@@ -141,6 +141,14 @@
|
||||
display_name = "cowboy boots"
|
||||
path = /obj/item/clothing/shoes/boots/cowboy
|
||||
|
||||
/datum/gear/shoes/cowboy/classic
|
||||
display_name = "classic cowboy boots"
|
||||
path = /obj/item/clothing/shoes/boots/cowboy/classic
|
||||
|
||||
/datum/gear/shoes/cowboy/snakeskin
|
||||
display_name = "snakeskin cowboy boots"
|
||||
path = /obj/item/clothing/shoes/boots/cowboy/snakeskin
|
||||
|
||||
/datum/gear/shoes/jungle
|
||||
display_name = "jungle boots"
|
||||
path = /obj/item/clothing/shoes/boots/jungle
|
||||
|
||||
@@ -90,6 +90,14 @@
|
||||
display_name = "trenchcoat, grey"
|
||||
path = /obj/item/clothing/suit/storage/trench/grey
|
||||
|
||||
datum/gear/suit/duster
|
||||
display_name = "cowboy duster"
|
||||
path = /obj/item/clothing/suit/storage/duster
|
||||
|
||||
/datum/gear/suit/duster/New()
|
||||
..()
|
||||
gear_tweaks = list(gear_tweak_free_color_choice)
|
||||
|
||||
/datum/gear/suit/hazard_vest
|
||||
display_name = "hazard vest selection"
|
||||
path = /obj/item/clothing/suit/storage/hazardvest
|
||||
|
||||
@@ -448,4 +448,12 @@
|
||||
|
||||
/datum/gear/uniform/bathrobe
|
||||
display_name = "bathrobe"
|
||||
path = /obj/item/clothing/under/bathrobe
|
||||
path = /obj/item/clothing/under/bathrobe
|
||||
|
||||
/datum/gear/uniform/flamenco
|
||||
display_name = "flamenco dress"
|
||||
path = /obj/item/clothing/under/dress/flamenco
|
||||
|
||||
/datum/gear/uniform/westernbustle
|
||||
display_name = "western bustle"
|
||||
path = /obj/item/clothing/under/dress/westernbustle
|
||||
@@ -120,11 +120,6 @@
|
||||
slot = "implant"
|
||||
exploitable = 1
|
||||
|
||||
/datum/gear/utility/translator
|
||||
display_name = "universal translator"
|
||||
path = /obj/item/device/universal_translator
|
||||
cost = 8
|
||||
|
||||
/datum/gear/utility/pen
|
||||
display_name = "Fountain Pen"
|
||||
path = /obj/item/weapon/pen/fountain
|
||||
@@ -137,3 +132,12 @@
|
||||
/datum/gear/utility/wheelchair/color/New()
|
||||
..()
|
||||
gear_tweaks = list(gear_tweak_free_color_choice)
|
||||
|
||||
/datum/gear/utility/umbrella
|
||||
display_name = "Umbrella"
|
||||
path = /obj/item/weapon/melee/umbrella
|
||||
cost = 3
|
||||
|
||||
/datum/gear/utility/umbrella/New()
|
||||
..()
|
||||
gear_tweaks = list(gear_tweak_free_color_choice)
|
||||
@@ -1,13 +1,13 @@
|
||||
// Alien clothing.
|
||||
/datum/gear/suit/zhan_furs
|
||||
display_name = "Zhan-Khazan furs (Tajara)"
|
||||
display_name = "Zhan-Khazan furs (Tajaran)"
|
||||
path = /obj/item/clothing/suit/tajaran/furs
|
||||
sort_category = "Xenowear"
|
||||
|
||||
/datum/gear/head/zhan_scarf
|
||||
display_name = "Zhan headscarf"
|
||||
path = /obj/item/clothing/head/tajaran/scarf
|
||||
whitelisted = "Tajara"
|
||||
whitelisted = SPECIES_TAJ
|
||||
|
||||
/datum/gear/suit/unathi_mantle
|
||||
display_name = "hide mantle (Unathi)"
|
||||
@@ -19,7 +19,7 @@
|
||||
display_name = "headtail chain selection (Skrell)"
|
||||
path = /obj/item/clothing/ears/skrell/chain
|
||||
sort_category = "Xenowear"
|
||||
whitelisted = "Skrell"
|
||||
whitelisted = SPECIES_SKRELL
|
||||
|
||||
/datum/gear/ears/skrell/chains/New()
|
||||
..()
|
||||
@@ -33,7 +33,7 @@
|
||||
display_name = "headtail band selection (Skrell)"
|
||||
path = /obj/item/clothing/ears/skrell/band
|
||||
sort_category = "Xenowear"
|
||||
whitelisted = "Skrell"
|
||||
whitelisted = SPECIES_SKRELL
|
||||
|
||||
/datum/gear/ears/skrell/bands/New()
|
||||
..()
|
||||
@@ -47,7 +47,7 @@
|
||||
display_name = "short headtail cloth (Skrell)"
|
||||
path = /obj/item/clothing/ears/skrell/cloth_male/black
|
||||
sort_category = "Xenowear"
|
||||
whitelisted = "Skrell"
|
||||
whitelisted = SPECIES_SKRELL
|
||||
|
||||
/datum/gear/ears/skrell/cloth/short/New()
|
||||
..()
|
||||
@@ -61,7 +61,7 @@
|
||||
display_name = "long headtail cloth (Skrell)"
|
||||
path = /obj/item/clothing/ears/skrell/cloth_female/black
|
||||
sort_category = "Xenowear"
|
||||
whitelisted = "Skrell"
|
||||
whitelisted = SPECIES_SKRELL
|
||||
|
||||
/datum/gear/ears/skrell/cloth/long/New()
|
||||
..()
|
||||
@@ -75,7 +75,7 @@
|
||||
display_name = "Colored bands (Skrell)"
|
||||
path = /obj/item/clothing/ears/skrell/colored/band
|
||||
sort_category = "Xenowear"
|
||||
whitelisted = "Skrell"
|
||||
whitelisted = SPECIES_SKRELL
|
||||
|
||||
/datum/gear/ears/skrell/colored/band/New()
|
||||
..()
|
||||
@@ -85,7 +85,7 @@
|
||||
display_name = "Colored chain (Skrell)"
|
||||
path = /obj/item/clothing/ears/skrell/colored/chain
|
||||
sort_category = "Xenowear"
|
||||
whitelisted = "Skrell"
|
||||
whitelisted = SPECIES_SKRELL
|
||||
|
||||
/datum/gear/ears/skrell/colored/chain/New()
|
||||
..()
|
||||
@@ -94,7 +94,7 @@
|
||||
/datum/gear/uniform/smock
|
||||
display_name = "smock selection (Teshari)"
|
||||
path = /obj/item/clothing/under/seromi/smock
|
||||
whitelisted = "Teshari"
|
||||
whitelisted = SPECIES_TESHARI
|
||||
sort_category = "Xenowear"
|
||||
|
||||
/datum/gear/uniform/smock/New()
|
||||
@@ -108,7 +108,7 @@
|
||||
/datum/gear/uniform/undercoat
|
||||
display_name = "undercoat selection (Teshari)"
|
||||
path = /obj/item/clothing/under/seromi/undercoat
|
||||
whitelisted = "Teshari"
|
||||
whitelisted = SPECIES_TESHARI
|
||||
sort_category = "Xenowear"
|
||||
|
||||
/datum/gear/uniform/undercoat/New()
|
||||
@@ -122,7 +122,7 @@
|
||||
/datum/gear/suit/cloak
|
||||
display_name = "cloak selection (Teshari)"
|
||||
path = /obj/item/clothing/suit/storage/seromi/cloak
|
||||
whitelisted = "Teshari"
|
||||
whitelisted = SPECIES_TESHARI
|
||||
sort_category = "Xenowear"
|
||||
|
||||
/datum/gear/suit/cloak/New()
|
||||
@@ -147,4 +147,17 @@
|
||||
display_name = "cloth footwraps"
|
||||
path = /obj/item/clothing/shoes/footwraps
|
||||
sort_category = "Xenowear"
|
||||
cost = 1
|
||||
cost = 1
|
||||
|
||||
/datum/gear/uniform/cohesionsuits
|
||||
display_name = "cohesion suit selection (Promethean)"
|
||||
path = /obj/item/clothing/under/cohesion
|
||||
sort_category = "Xenowear"
|
||||
|
||||
/datum/gear/uniform/cohesionsuits/New()
|
||||
..()
|
||||
var/list/cohesionsuits = list()
|
||||
for(var/cohesionsuit in (typesof(/obj/item/clothing/under/cohesion)))
|
||||
var/obj/item/clothing/under/cohesion/cohesion_type = cohesionsuit
|
||||
cohesionsuits[initial(cohesion_type.name)] = cohesion_type
|
||||
gear_tweaks += new/datum/gear_tweak/path(sortAssoc(cohesionsuits))
|
||||
@@ -94,7 +94,7 @@
|
||||
if(job.minimum_character_age && user.client && (user.client.prefs.age < job.minimum_character_age))
|
||||
. += "<del>[rank]</del></td><td> \[MINIMUM CHARACTER AGE: [job.minimum_character_age]]</td></tr>"
|
||||
continue
|
||||
if((pref.job_civilian_low & ASSISTANT) && (rank != "Assistant"))
|
||||
if((pref.job_civilian_low & ASSISTANT) && job.flag != ASSISTANT)
|
||||
. += "<font color=grey>[rank]</font></td><td></td></tr>"
|
||||
continue
|
||||
if((rank in command_positions) || (rank == "AI"))//Bold head jobs
|
||||
@@ -106,7 +106,7 @@
|
||||
|
||||
. += "<a href='?src=\ref[src];set_job=[rank]'>"
|
||||
|
||||
if(rank == "Assistant")//Assistant is special
|
||||
if(job.flag == ASSISTANT)//Assistant is special
|
||||
if(pref.job_civilian_low & ASSISTANT)
|
||||
. += " <font color=55cc55>\[Yes]</font>"
|
||||
else
|
||||
@@ -180,7 +180,7 @@
|
||||
if(!job)
|
||||
return 0
|
||||
|
||||
if(role == "Assistant")
|
||||
if(job.flag == ASSISTANT)
|
||||
if(pref.job_civilian_low & job.flag)
|
||||
pref.job_civilian_low &= ~job.flag
|
||||
else
|
||||
|
||||
@@ -226,7 +226,7 @@
|
||||
mutually_exclusive = list(/datum/trait/modifier/mental/xenophobe)
|
||||
|
||||
/datum/trait/modifier/mental/tajaraphobe
|
||||
name = "Tajara-phobic"
|
||||
name = "Tajaran-phobic"
|
||||
desc = "Boilerplate racism for cats goes here."
|
||||
mutually_exclusive = list(/datum/trait/modifier/mental/xenophobe)
|
||||
|
||||
|
||||
@@ -21,6 +21,7 @@ datum/preferences
|
||||
var/UI_style = "Midnight"
|
||||
var/UI_style_color = "#ffffff"
|
||||
var/UI_style_alpha = 255
|
||||
var/tooltipstyle = "Midnight" //Style for popup tooltips
|
||||
|
||||
//character preferences
|
||||
var/real_name //our character's name
|
||||
@@ -46,7 +47,7 @@ datum/preferences
|
||||
var/r_eyes = 0 //Eye color
|
||||
var/g_eyes = 0 //Eye color
|
||||
var/b_eyes = 0 //Eye color
|
||||
var/species = "Human" //Species datum to use.
|
||||
var/species = SPECIES_HUMAN //Species datum to use.
|
||||
var/species_preview //Used for the species selection window.
|
||||
var/list/alternate_languages = list() //Secondary language(s)
|
||||
var/list/language_prefixes = list() //Kanguage prefix keys
|
||||
@@ -287,10 +288,10 @@ datum/preferences
|
||||
|
||||
if(icon_updates)
|
||||
character.force_update_limbs()
|
||||
character.update_mutations(0)
|
||||
character.update_underwear(0)
|
||||
character.update_hair(0)
|
||||
character.update_icons_all()
|
||||
character.update_icons_body()
|
||||
character.update_mutations()
|
||||
character.update_underwear()
|
||||
character.update_hair()
|
||||
|
||||
/datum/preferences/proc/open_load_dialog(mob/user)
|
||||
var/dat = "<body>"
|
||||
|
||||
@@ -98,11 +98,11 @@
|
||||
|
||||
toggle_preference(pref_path)
|
||||
|
||||
src << "You will [ (is_preference_enabled(pref_path)) ? "now" : "no longer"] see the speech indicator."
|
||||
src << "You will [ (is_preference_enabled(pref_path)) ? "now" : "no longer"] have the speech indicator."
|
||||
|
||||
prefs.save_preferences()
|
||||
|
||||
feedback_add_details("admin_verb","TLOOC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
feedback_add_details("admin_verb","TTIND") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
/client/verb/toggle_ahelp_sound()
|
||||
set name = "Toggle Admin Help Sound"
|
||||
@@ -192,6 +192,19 @@
|
||||
|
||||
feedback_add_details("admin_verb","TFiringMode") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
/client/verb/toggle_mob_tooltips()
|
||||
set name = "Toggle Mob Tooltips"
|
||||
set category = "Preferences"
|
||||
set desc = "Toggles displaying name/species over mobs when moused over."
|
||||
|
||||
var/pref_path = /datum/client_preference/mob_tooltips
|
||||
toggle_preference(pref_path)
|
||||
prefs.save_preferences()
|
||||
|
||||
src << "You will now [(is_preference_enabled(/datum/client_preference/mob_tooltips)) ? "see" : "not see"] mob tooltips."
|
||||
|
||||
feedback_add_details("admin_verb","TMobTooltips") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
//Toggles for Staff
|
||||
//Developers
|
||||
|
||||
|
||||
@@ -20,6 +20,15 @@
|
||||
"Hologram" = 'icons/mob/screen1_robot_minimalist.dmi'
|
||||
)
|
||||
|
||||
var/global/list/all_tooltip_styles = list(
|
||||
"Midnight", //Default for everyone is the first one,
|
||||
"Plasmafire",
|
||||
"Retro",
|
||||
"Slimecore",
|
||||
"Operative",
|
||||
"Clockwork"
|
||||
)
|
||||
|
||||
/proc/ui_style2icon(ui_style)
|
||||
if(ui_style in all_ui_styles)
|
||||
return all_ui_styles[ui_style]
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
*/
|
||||
var/list/sprite_sheets_refit = null
|
||||
var/ear_protection = 0
|
||||
var/blood_sprite_state
|
||||
|
||||
//Updates the icons of the mob wearing the clothing item, if any.
|
||||
/obj/item/clothing/proc/update_clothing_icon()
|
||||
@@ -56,7 +57,7 @@
|
||||
if (!..())
|
||||
return 0
|
||||
|
||||
if(species_restricted && istype(M,/mob/living/carbon/human))
|
||||
if(LAZYLEN(species_restricted) && istype(M,/mob/living/carbon/human))
|
||||
var/exclusive = null
|
||||
var/wearable = null
|
||||
var/mob/living/carbon/human/H = M
|
||||
@@ -83,16 +84,14 @@
|
||||
|
||||
//Set species_restricted list
|
||||
switch(target_species)
|
||||
if("Human", "Skrell") //humanoid bodytypes
|
||||
species_restricted = list("Human", "Skrell", "Promethean") //skrell/humans can wear each other's suits
|
||||
if(SPECIES_HUMAN, SPECIES_SKRELL) //humanoid bodytypes
|
||||
species_restricted = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_PROMETHEAN) //skrell/humans can wear each other's suits
|
||||
else
|
||||
species_restricted = list(target_species)
|
||||
|
||||
//Set icon
|
||||
if (sprite_sheets_refit && (target_species in sprite_sheets_refit))
|
||||
icon_override = sprite_sheets_refit[target_species]
|
||||
else
|
||||
icon_override = initial(icon_override)
|
||||
sprite_sheets[target_species] = sprite_sheets_refit[target_species]
|
||||
|
||||
if (sprite_sheets_obj && (target_species in sprite_sheets_obj))
|
||||
icon = sprite_sheets_obj[target_species]
|
||||
@@ -105,17 +104,15 @@
|
||||
|
||||
//Set species_restricted list
|
||||
switch(target_species)
|
||||
if("Skrell")
|
||||
species_restricted = list("Human", "Skrell", "Promethean") //skrell helmets fit humans too
|
||||
if(SPECIES_SKRELL)
|
||||
species_restricted = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_PROMETHEAN) //skrell helmets fit humans too
|
||||
|
||||
else
|
||||
species_restricted = list(target_species)
|
||||
|
||||
//Set icon
|
||||
if (sprite_sheets_refit && (target_species in sprite_sheets_refit))
|
||||
icon_override = sprite_sheets_refit[target_species]
|
||||
else
|
||||
icon_override = initial(icon_override)
|
||||
sprite_sheets[target_species] = sprite_sheets_refit[target_species]
|
||||
|
||||
if (sprite_sheets_obj && (target_species in sprite_sheets_obj))
|
||||
icon = sprite_sheets_obj[target_species]
|
||||
@@ -130,7 +127,7 @@
|
||||
throwforce = 2
|
||||
slot_flags = SLOT_EARS
|
||||
sprite_sheets = list(
|
||||
"Teshari" = 'icons/mob/species/seromi/ears.dmi')
|
||||
SPECIES_TESHARI = 'icons/mob/species/seromi/ears.dmi')
|
||||
|
||||
/obj/item/clothing/ears/attack_hand(mob/user as mob)
|
||||
if (!user) return
|
||||
@@ -197,6 +194,7 @@
|
||||
w_class = ITEMSIZE_SMALL
|
||||
icon = 'icons/obj/clothing/gloves.dmi'
|
||||
siemens_coefficient = 0.9
|
||||
blood_sprite_state = "bloodyhands"
|
||||
var/wired = 0
|
||||
var/obj/item/weapon/cell/cell = 0
|
||||
var/fingerprint_chance = 0 //How likely the glove is to let fingerprints through
|
||||
@@ -210,8 +208,8 @@
|
||||
slot_flags = SLOT_GLOVES
|
||||
attack_verb = list("challenged")
|
||||
sprite_sheets = list(
|
||||
"Teshari" = 'icons/mob/species/seromi/gloves.dmi',
|
||||
"Vox" = 'icons/mob/species/vox/gloves.dmi'
|
||||
SPECIES_TESHARI = 'icons/mob/species/seromi/gloves.dmi',
|
||||
SPECIES_VOX = 'icons/mob/species/vox/gloves.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/gloves/update_clothing_icon()
|
||||
@@ -244,8 +242,8 @@
|
||||
name = "modified [name]"
|
||||
desc = "[desc]<br>They have had the fingertips cut off of them."
|
||||
if("exclude" in species_restricted)
|
||||
species_restricted -= "Unathi"
|
||||
species_restricted -= "Tajara"
|
||||
species_restricted -= SPECIES_UNATHI
|
||||
species_restricted -= SPECIES_TAJ
|
||||
return
|
||||
*/
|
||||
|
||||
@@ -300,7 +298,7 @@
|
||||
w_class = ITEMSIZE_TINY
|
||||
icon = 'icons/obj/clothing/rings.dmi'
|
||||
gender = NEUTER
|
||||
species_restricted = list("exclude", "Diona")
|
||||
species_restricted = list("exclude", SPECIES_DIONA)
|
||||
siemens_coefficient = 1
|
||||
glove_level = 1
|
||||
fingerprint_chance = 100
|
||||
@@ -318,15 +316,17 @@
|
||||
body_parts_covered = HEAD
|
||||
slot_flags = SLOT_HEAD
|
||||
w_class = ITEMSIZE_SMALL
|
||||
blood_sprite_state = "helmetblood"
|
||||
|
||||
var/light_overlay = "helmet_light"
|
||||
var/light_applied
|
||||
var/brightness_on
|
||||
var/on = 0
|
||||
var/image/helmet_light
|
||||
|
||||
sprite_sheets = list(
|
||||
"Teshari" = 'icons/mob/species/seromi/head.dmi',
|
||||
"Vox" = 'icons/mob/species/vox/head.dmi'
|
||||
SPECIES_TESHARI = 'icons/mob/species/seromi/head.dmi',
|
||||
SPECIES_VOX = 'icons/mob/species/vox/head.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/head/attack_self(mob/user)
|
||||
@@ -386,29 +386,29 @@
|
||||
return 1
|
||||
|
||||
/obj/item/clothing/head/update_icon(var/mob/user)
|
||||
|
||||
overlays.Cut()
|
||||
var/mob/living/carbon/human/H
|
||||
if(istype(user,/mob/living/carbon/human))
|
||||
if(ishuman(user))
|
||||
H = user
|
||||
|
||||
if(on)
|
||||
|
||||
// Generate object icon.
|
||||
if(!light_overlay_cache["[light_overlay]_icon"])
|
||||
light_overlay_cache["[light_overlay]_icon"] = image("icon" = 'icons/obj/light_overlays.dmi', "icon_state" = "[light_overlay]")
|
||||
overlays |= light_overlay_cache["[light_overlay]_icon"]
|
||||
light_overlay_cache["[light_overlay]_icon"] = image(icon = 'icons/obj/light_overlays.dmi', icon_state = "[light_overlay]")
|
||||
helmet_light = light_overlay_cache["[light_overlay]_icon"]
|
||||
add_overlay(helmet_light)
|
||||
|
||||
// Generate and cache the on-mob icon, which is used in update_inv_head().
|
||||
var/cache_key = "[light_overlay][H ? "_[H.species.get_bodytype(H)]" : ""]"
|
||||
var/body_type = (H && H.species.get_bodytype(H))
|
||||
var/cache_key = "[light_overlay][body_type && sprite_sheets[body_type] ? "_[body_type]" : ""]"
|
||||
if(!light_overlay_cache[cache_key])
|
||||
var/use_icon = 'icons/mob/light_overlays.dmi'
|
||||
if(H && sprite_sheets[H.species.get_bodytype(H)])
|
||||
use_icon = sprite_sheets[H.species.get_bodytype(H)]
|
||||
light_overlay_cache[cache_key] = image("icon" = use_icon, "icon_state" = "[light_overlay]")
|
||||
var/use_icon = LAZYACCESS(sprite_sheets,body_type) || 'icons/mob/light_overlays.dmi'
|
||||
light_overlay_cache[cache_key] = image(icon = use_icon, icon_state = "[light_overlay]")
|
||||
|
||||
if(H)
|
||||
H.update_inv_head()
|
||||
else if(helmet_light)
|
||||
cut_overlay(helmet_light)
|
||||
helmet_light = null
|
||||
|
||||
user.update_inv_head() //Will redraw the helmet with the light on the mob
|
||||
|
||||
/obj/item/clothing/head/update_clothing_icon()
|
||||
if (ismob(src.loc))
|
||||
@@ -427,11 +427,12 @@
|
||||
body_parts_covered = HEAD
|
||||
slot_flags = SLOT_MASK
|
||||
body_parts_covered = FACE|EYES
|
||||
blood_sprite_state = "maskblood"
|
||||
sprite_sheets = list(
|
||||
"Teshari" = 'icons/mob/species/seromi/masks.dmi',
|
||||
"Vox" = 'icons/mob/species/vox/masks.dmi',
|
||||
"Tajara" = 'icons/mob/species/tajaran/mask.dmi',
|
||||
"Unathi" = 'icons/mob/species/unathi/mask.dmi'
|
||||
SPECIES_TESHARI = 'icons/mob/species/seromi/masks.dmi',
|
||||
SPECIES_VOX = 'icons/mob/species/vox/masks.dmi',
|
||||
SPECIES_TAJ = 'icons/mob/species/tajaran/mask.dmi',
|
||||
SPECIES_UNATHI = 'icons/mob/species/unathi/mask.dmi'
|
||||
)
|
||||
|
||||
var/voicechange = 0
|
||||
@@ -460,6 +461,7 @@
|
||||
siemens_coefficient = 0.9
|
||||
body_parts_covered = FEET
|
||||
slot_flags = SLOT_FEET
|
||||
blood_sprite_state = "shoeblood"
|
||||
|
||||
var/can_hold_knife = 0
|
||||
var/obj/item/holding
|
||||
@@ -475,10 +477,10 @@
|
||||
slowdown = SHOES_SLOWDOWN
|
||||
force = 2
|
||||
var/overshoes = 0
|
||||
species_restricted = list("exclude","Teshari", "Vox")
|
||||
species_restricted = list("exclude",SPECIES_TESHARI, SPECIES_VOX)
|
||||
sprite_sheets = list(
|
||||
"Teshari" = 'icons/mob/species/seromi/shoes.dmi',
|
||||
"Vox" = 'icons/mob/species/vox/shoes.dmi'
|
||||
SPECIES_TESHARI = 'icons/mob/species/seromi/shoes.dmi',
|
||||
SPECIES_VOX = 'icons/mob/species/vox/shoes.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/shoes/proc/draw_knife()
|
||||
@@ -574,9 +576,10 @@
|
||||
w_class = ITEMSIZE_NORMAL
|
||||
preserve_item = 1
|
||||
|
||||
|
||||
sprite_sheets = list(
|
||||
"Teshari" = 'icons/mob/species/seromi/suit.dmi',
|
||||
"Vox" = 'icons/mob/species/vox/suit.dmi'
|
||||
SPECIES_TESHARI = 'icons/mob/species/seromi/suit.dmi',
|
||||
SPECIES_VOX = 'icons/mob/species/vox/suit.dmi'
|
||||
)
|
||||
|
||||
valid_accessory_slots = list("over", "armband")
|
||||
@@ -602,6 +605,7 @@
|
||||
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
|
||||
w_class = ITEMSIZE_NORMAL
|
||||
show_messages = 1
|
||||
blood_sprite_state = "uniformblood"
|
||||
|
||||
var/has_sensor = 1 //For the crew computer 2 = unable to change mode
|
||||
var/sensor_mode = 0
|
||||
@@ -614,8 +618,8 @@
|
||||
var/rolled_down = -1 //0 = unrolled, 1 = rolled, -1 = cannot be toggled
|
||||
var/rolled_sleeves = -1 //0 = unrolled, 1 = rolled, -1 = cannot be toggled
|
||||
sprite_sheets = list(
|
||||
"Teshari" = 'icons/mob/species/seromi/uniform.dmi',
|
||||
"Vox" = 'icons/mob/species/vox/uniform.dmi'
|
||||
SPECIES_TESHARI = 'icons/mob/species/seromi/uniform.dmi',
|
||||
SPECIES_VOX = 'icons/mob/species/vox/uniform.dmi'
|
||||
)
|
||||
|
||||
//convenience var for defining the icon state for the overlay used when the clothing is worn.
|
||||
|
||||
@@ -1,28 +1,18 @@
|
||||
/obj/item/clothing/proc/can_attach_accessory(obj/item/clothing/accessory/A)
|
||||
if(valid_accessory_slots && istype(A) && (A.slot in valid_accessory_slots))
|
||||
.=1
|
||||
if(src.valid_accessory_slots && (A.slot in src.valid_accessory_slots))
|
||||
if(accessories.len && restricted_accessory_slots && (A.slot in restricted_accessory_slots))
|
||||
for(var/obj/item/clothing/accessory/AC in accessories)
|
||||
if (AC.slot == A.slot)
|
||||
return FALSE
|
||||
return TRUE
|
||||
else
|
||||
return 0
|
||||
if(accessories.len && restricted_accessory_slots && (A.slot in restricted_accessory_slots))
|
||||
for(var/obj/item/clothing/accessory/AC in accessories)
|
||||
if (AC.slot == A.slot)
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
/obj/item/clothing/attackby(var/obj/item/I, var/mob/user)
|
||||
if(istype(I, /obj/item/clothing/accessory))
|
||||
|
||||
if(!valid_accessory_slots || !valid_accessory_slots.len)
|
||||
usr << "<span class='warning'>You cannot attach accessories of any kind to \the [src].</span>"
|
||||
return
|
||||
|
||||
var/obj/item/clothing/accessory/A = I
|
||||
if(can_attach_accessory(A))
|
||||
user.drop_item()
|
||||
attach_accessory(user, A)
|
||||
if(attempt_attach_accessory(A, user))
|
||||
return
|
||||
else
|
||||
user << "<span class='warning'>You cannot attach more accessories of this type to [src].</span>"
|
||||
return
|
||||
|
||||
if(accessories.len)
|
||||
for(var/obj/item/clothing/accessory/A in accessories)
|
||||
@@ -37,6 +27,10 @@
|
||||
for(var/obj/item/clothing/accessory/A in accessories)
|
||||
A.attack_hand(user)
|
||||
return
|
||||
if (ishuman(user) && src.loc == user)
|
||||
var/mob/living/carbon/human/H = user
|
||||
if(src != H.l_store && src != H.r_store && src != H.s_store)
|
||||
return
|
||||
return ..()
|
||||
|
||||
/obj/item/clothing/MouseDrop(var/obj/over_object)
|
||||
@@ -70,10 +64,29 @@
|
||||
* user is the user doing the attaching. Can be null, such as when attaching
|
||||
* items on spawn
|
||||
*/
|
||||
/obj/item/clothing/proc/attempt_attach_accessory(obj/item/clothing/accessory/A, mob/user)
|
||||
if(!valid_accessory_slots || !valid_accessory_slots.len)
|
||||
if(user)
|
||||
to_chat(user, "<span class='warning'>You cannot attach accessories of any kind to \the [src].</span>")
|
||||
return FALSE
|
||||
|
||||
var/obj/item/clothing/accessory/acc = A
|
||||
if(can_attach_accessory(acc))
|
||||
if(user)
|
||||
user.drop_item()
|
||||
attach_accessory(user, acc)
|
||||
return TRUE
|
||||
else
|
||||
if(user)
|
||||
to_chat(user, "<span class='warning'>You cannot attach more accessories of this type to [src].</span>")
|
||||
return FALSE
|
||||
|
||||
|
||||
/obj/item/clothing/proc/attach_accessory(mob/user, obj/item/clothing/accessory/A)
|
||||
accessories += A
|
||||
A.on_attached(src, user)
|
||||
src.verbs |= /obj/item/clothing/proc/removetie_verb
|
||||
update_accessory_slowdown()
|
||||
update_clothing_icon()
|
||||
|
||||
/obj/item/clothing/proc/remove_accessory(mob/user, obj/item/clothing/accessory/A)
|
||||
@@ -82,8 +95,14 @@
|
||||
|
||||
A.on_removed(user)
|
||||
accessories -= A
|
||||
update_accessory_slowdown()
|
||||
update_clothing_icon()
|
||||
|
||||
/obj/item/clothing/proc/update_accessory_slowdown()
|
||||
slowdown = initial(slowdown)
|
||||
for(var/obj/item/clothing/accessory/A in accessories)
|
||||
slowdown += A.slowdown
|
||||
|
||||
/obj/item/clothing/proc/removetie_verb()
|
||||
set name = "Remove Accessory"
|
||||
set category = "Object"
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
/obj/item/clothing/apply_accessories(var/image/standing)
|
||||
if(LAZYLEN(accessories))
|
||||
for(var/obj/item/clothing/accessory/A in accessories)
|
||||
standing.add_overlay(A.get_mob_overlay())
|
||||
|
||||
/obj/item/clothing/apply_blood(var/image/standing)
|
||||
if(blood_DNA && blood_sprite_state && ishuman(loc))
|
||||
var/mob/living/carbon/human/H = loc
|
||||
var/image/bloodsies = image(icon = H.species.get_blood_mask(H), icon_state = blood_sprite_state)
|
||||
bloodsies.color = blood_color
|
||||
standing.add_overlay(bloodsies)
|
||||
|
||||
//UNIFORM: Always appends "_s" to iconstate, stupidly.
|
||||
/obj/item/clothing/under/get_worn_icon_state(var/slot_name)
|
||||
var/state2use = ..()
|
||||
state2use += "_s"
|
||||
return state2use
|
||||
|
||||
//HELMET: May have a lighting overlay
|
||||
/obj/item/clothing/head/make_worn_icon(var/body_type,var/slot_name,var/inhands,var/default_icon,var/default_layer = 0)
|
||||
var/image/standing = ..()
|
||||
if(on && slot_name == slot_head_str)
|
||||
var/cache_key = "[light_overlay][LAZYACCESS(sprite_sheets,body_type) ? "_[body_type]" : ""]"
|
||||
if(standing && light_overlay_cache[cache_key])
|
||||
standing.add_overlay(light_overlay_cache[cache_key])
|
||||
return standing
|
||||
|
||||
//SUIT: Blood state is slightly different
|
||||
/obj/item/clothing/suit/apply_blood(var/image/standing)
|
||||
if(blood_DNA && blood_sprite_state && ishuman(loc))
|
||||
var/mob/living/carbon/human/H = loc
|
||||
var/image/bloodsies = image(icon = H.species.get_blood_mask(H), icon_state = "[blood_overlay_type]blood")
|
||||
bloodsies.color = blood_color
|
||||
standing.add_overlay(bloodsies)
|
||||
@@ -46,7 +46,7 @@
|
||||
icon = 'icons/obj/clothing/ears.dmi'
|
||||
w_class = ITEMSIZE_TINY
|
||||
slot_flags = SLOT_EARS
|
||||
species_restricted = list("Skrell")
|
||||
species_restricted = list(SPECIES_SKRELL)
|
||||
|
||||
/obj/item/clothing/ears/skrell/chain
|
||||
name = "Gold headtail chains"
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
icon_state = "arm_guards_bullet"
|
||||
item_state_slots = list(slot_r_hand_str = "swat", slot_l_hand_str = "swat")
|
||||
siemens_coefficient = 0.7
|
||||
armor = list(melee = 10, bullet = 80, laser = 10, energy = 50, bomb = 0, bio = 0, rad = 0)
|
||||
armor = list(melee = 10, bullet = 80, laser = 10, energy = 10, bomb = 0, bio = 0, rad = 0)
|
||||
|
||||
/obj/item/clothing/gloves/arm_guard/riot
|
||||
name = "riot arm guards"
|
||||
@@ -36,7 +36,7 @@
|
||||
icon_state = "arm_guards_riot"
|
||||
item_state_slots = list(slot_r_hand_str = "swat", slot_l_hand_str = "swat")
|
||||
siemens_coefficient = 0.5
|
||||
armor = list(melee = 80, bullet = 10, laser = 10, energy = 50, bomb = 0, bio = 0, rad = 0)
|
||||
armor = list(melee = 80, bullet = 10, laser = 10, energy = 10, bomb = 0, bio = 0, rad = 0)
|
||||
|
||||
/obj/item/clothing/gloves/arm_guard/combat
|
||||
name = "combat arm guards"
|
||||
|
||||
@@ -10,8 +10,8 @@
|
||||
desc = "an ultra rare hat. It commands a certain respect."
|
||||
icon_state = "petehat"
|
||||
sprite_sheets = list(
|
||||
"Teshari" = 'icons/mob/species/seromi/head.dmi',
|
||||
"Vox" = 'icons/mob/species/vox/head.dmi'
|
||||
SPECIES_TESHARI = 'icons/mob/species/seromi/head.dmi',
|
||||
SPECIES_VOX = 'icons/mob/species/vox/head.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/head/collectable/slime
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
name = "helmet"
|
||||
desc = "Standard Security gear. Protects the head from impacts."
|
||||
icon_state = "helmet"
|
||||
valid_accessory_slots = list(ACCESSORY_SLOT_HELM_C)
|
||||
restricted_accessory_slots = list(ACCESSORY_SLOT_HELM_C)
|
||||
flags = THICKMATERIAL
|
||||
armor = list(melee = 40, bullet = 30, laser = 30, energy = 10, bomb = 10, bio = 0, rad = 0)
|
||||
flags_inv = HIDEEARS|HIDEEYES
|
||||
@@ -18,6 +20,7 @@
|
||||
desc = "A helmet painted in Peacekeeper blue. Stands out like a sore thumb."
|
||||
icon_state = "helmet_sol"
|
||||
armor = list(melee = 50, bullet = 50, laser = 50,energy = 25, bomb = 30, bio = 0, rad = 0)
|
||||
valid_accessory_slots = null
|
||||
|
||||
/obj/item/clothing/head/helmet/solgov/command
|
||||
name = "command helmet"
|
||||
@@ -61,6 +64,7 @@
|
||||
armor = list(melee = 80, bullet = 10, laser = 10, energy = 10, bomb = 0, bio = 0, rad = 0)
|
||||
flags_inv = HIDEEARS
|
||||
siemens_coefficient = 0.7
|
||||
valid_accessory_slots = null
|
||||
action_button_name = "Toggle Visor"
|
||||
|
||||
/obj/item/clothing/head/helmet/riot/attack_self(mob/user as mob)
|
||||
@@ -80,6 +84,7 @@
|
||||
armor = list(melee = 10, bullet = 10, laser = 80 ,energy = 50, bomb = 0, bio = 0, rad = 0)
|
||||
flags_inv = HIDEEARS
|
||||
siemens_coefficient = 0.1
|
||||
valid_accessory_slots = null
|
||||
|
||||
/obj/item/clothing/head/helmet/bulletproof
|
||||
name = "bullet-resistant helmet"
|
||||
@@ -89,6 +94,7 @@
|
||||
armor = list(melee = 10, bullet = 80, laser = 10 ,energy = 10, bomb = 0, bio = 0, rad = 0)
|
||||
flags_inv = HIDEEARS
|
||||
siemens_coefficient = 0.7
|
||||
valid_accessory_slots = null
|
||||
|
||||
/obj/item/clothing/head/helmet/combat
|
||||
name = "combat helmet"
|
||||
@@ -98,6 +104,7 @@
|
||||
armor = list(melee = 50, bullet = 50, laser = 50 ,energy = 30, bomb = 30, bio = 0, rad = 0)
|
||||
flags_inv = HIDEEARS
|
||||
siemens_coefficient = 0.6
|
||||
valid_accessory_slots = null
|
||||
|
||||
/obj/item/clothing/head/helmet/swat
|
||||
name = "\improper SWAT helmet"
|
||||
@@ -115,6 +122,7 @@
|
||||
icon_state = "alienhelmet"
|
||||
siemens_coefficient = 0.4
|
||||
armor = list(melee = 50, bullet = 50, laser = 50, energy = 50, bomb = 50, bio = 0, rad = 40)
|
||||
valid_accessory_slots = null
|
||||
|
||||
/obj/item/clothing/head/helmet/alien/tank
|
||||
name = "alien warhelm"
|
||||
@@ -137,6 +145,7 @@
|
||||
flags = BLOCKHAIR
|
||||
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES
|
||||
siemens_coefficient = 1
|
||||
valid_accessory_slots = null
|
||||
|
||||
/obj/item/clothing/head/helmet/tactical
|
||||
name = "tactical helmet"
|
||||
@@ -144,13 +153,14 @@
|
||||
icon_state = "swathelm"
|
||||
item_state_slots = list(slot_r_hand_str = "swat", slot_l_hand_str = "swat")
|
||||
sprite_sheets = list(
|
||||
"Tajara" = 'icons/mob/species/tajaran/helmet.dmi',
|
||||
"Unathi" = 'icons/mob/species/unathi/helmet.dmi',
|
||||
SPECIES_TAJ = 'icons/mob/species/tajaran/helmet.dmi',
|
||||
SPECIES_UNATHI = 'icons/mob/species/unathi/helmet.dmi',
|
||||
)
|
||||
|
||||
armor = list(melee = 60, bullet = 60, laser = 60, energy = 40, bomb = 40, bio = 0, rad = 0)
|
||||
flags_inv = HIDEEARS
|
||||
siemens_coefficient = 0.7
|
||||
valid_accessory_slots = null
|
||||
|
||||
/obj/item/clothing/head/helmet/augment
|
||||
name = "Augment Array"
|
||||
@@ -162,6 +172,7 @@
|
||||
cold_protection = HEAD
|
||||
min_cold_protection_temperature = SPACE_HELMET_MIN_COLD_PROTECTION_TEMPERATURE
|
||||
siemens_coefficient = 0.5
|
||||
valid_accessory_slots = null
|
||||
|
||||
//Non-hardsuit ERT helmets.
|
||||
/obj/item/clothing/head/helmet/ert
|
||||
@@ -170,6 +181,7 @@
|
||||
icon_state = "erthelmet_cmd"
|
||||
item_state_slots = list(slot_r_hand_str = "syndicate-helm-green", slot_l_hand_str = "syndicate-helm-green")
|
||||
armor = list(melee = 62, bullet = 50, laser = 50,energy = 35, bomb = 10, bio = 2, rad = 0)
|
||||
valid_accessory_slots = null
|
||||
|
||||
//Commander
|
||||
/obj/item/clothing/head/helmet/ert/command
|
||||
|
||||
@@ -103,23 +103,33 @@
|
||||
icon_state = "beret_corporate_warden"
|
||||
item_state_slots = list(slot_r_hand_str = "beret_black", slot_l_hand_str = "beret_black")
|
||||
|
||||
/obj/item/clothing/head/helmet/warden //should these be helmets?
|
||||
/obj/item/clothing/head/helmet/warden
|
||||
name = "warden's helmet"
|
||||
desc = "Standard Warden gear. Protects the head from impacts."
|
||||
|
||||
/obj/item/clothing/head/helmet/warden/hat
|
||||
name = "warden's hat"
|
||||
desc = "It's a special helmet issued to the Warden of a securiy force."
|
||||
desc = "It's a special hat issued to the Warden of a securiy force."
|
||||
icon_state = "policehelm"
|
||||
body_parts_covered = 0
|
||||
valid_accessory_slots = null
|
||||
|
||||
/obj/item/clothing/head/helmet/HoS
|
||||
name = "Head of Security helmet"
|
||||
desc = "Standard Head of Security gear. Protects the head from impacts."
|
||||
|
||||
/obj/item/clothing/head/helmet/HoS/hat
|
||||
name = "Head of Security Hat"
|
||||
desc = "The hat of the Head of Security. For showing the officers who's in charge."
|
||||
icon_state = "hoscap"
|
||||
body_parts_covered = 0
|
||||
valid_accessory_slots = null
|
||||
|
||||
/obj/item/clothing/head/helmet/HoS/dermal
|
||||
/obj/item/clothing/head/helmet/dermal
|
||||
name = "Dermal Armour Patch"
|
||||
desc = "You're not quite sure how you manage to take it on and off, but it implants nicely in your head."
|
||||
icon_state = "dermal"
|
||||
item_state_slots = list(slot_r_hand_str = "", slot_l_hand_str = "")
|
||||
valid_accessory_slots = null
|
||||
show_examine = FALSE
|
||||
|
||||
/obj/item/clothing/head/det
|
||||
name = "fedora"
|
||||
@@ -128,14 +138,14 @@
|
||||
allowed = list(/obj/item/weapon/reagent_containers/food/snacks/candy_corn, /obj/item/weapon/pen)
|
||||
armor = list(melee = 10, bullet = 10, laser = 15, energy = 10, bomb = 0, bio = 0, rad = 0)
|
||||
siemens_coefficient = 0.9
|
||||
body_parts_covered = 0
|
||||
valid_accessory_slots = null
|
||||
show_examine = FALSE
|
||||
|
||||
/obj/item/clothing/head/det/grey
|
||||
icon_state = "detective2"
|
||||
item_state_slots = list(slot_r_hand_str = "detective", slot_l_hand_str = "detective")
|
||||
desc = "A grey fedora - either the cornerstone of a detective's style or a poor attempt at looking cool, depending on the person wearing it."
|
||||
|
||||
|
||||
/obj/item/clothing/head/beret/engineering
|
||||
name = "engineering beret"
|
||||
desc = "A beret with the engineering insignia emblazoned on it. For engineers that are more inclined towards style than safety."
|
||||
|
||||
@@ -292,6 +292,11 @@
|
||||
desc = "Because justice isn't going to dispense itself."
|
||||
icon_state = "cowboy_wide"
|
||||
|
||||
/obj/item/clothing/head/cowboy_hat/small
|
||||
name = "small cowboy hat"
|
||||
desc = "For the tiniest of cowboys."
|
||||
icon_state = "cowboy_small"
|
||||
|
||||
/obj/item/clothing/head/witchwig
|
||||
name = "witch costume wig"
|
||||
desc = "Eeeee~heheheheheheh!"
|
||||
|
||||
@@ -0,0 +1,201 @@
|
||||
//Pilot
|
||||
|
||||
/obj/item/clothing/head/pilot
|
||||
name = "pilot helmet"
|
||||
desc = "Standard pilot gear. Protects the head from impacts."
|
||||
icon_state = "pilot_helmet1"
|
||||
item_icons = list(slot_head_str = 'icons/mob/pilot_helmet.dmi')
|
||||
sprite_sheets = list(
|
||||
SPECIES_TESHARI = 'icons/mob/species/seromi/pilot_helmet.dmi'
|
||||
)
|
||||
flags = THICKMATERIAL
|
||||
armor = list(melee = 20, bullet = 10, laser = 10, energy = 5, bomb = 10, bio = 0, rad = 0)
|
||||
flags_inv = HIDEEARS
|
||||
cold_protection = HEAD
|
||||
min_cold_protection_temperature = HELMET_MIN_COLD_PROTECTION_TEMPERATURE
|
||||
heat_protection = HEAD
|
||||
max_heat_protection_temperature = HELMET_MAX_HEAT_PROTECTION_TEMPERATURE
|
||||
w_class = ITEMSIZE_NORMAL
|
||||
|
||||
var/obj/machinery/computer/shuttle_control/web/shuttle_comp
|
||||
var/obj/screen/pilot_hud
|
||||
var/list/images
|
||||
var/list/raw_images
|
||||
var/last_status
|
||||
|
||||
/obj/item/clothing/head/pilot/initialize()
|
||||
. = ..()
|
||||
|
||||
images = list()
|
||||
raw_images = list()
|
||||
|
||||
pilot_hud = new(src)
|
||||
pilot_hud.screen_loc = "1,1"
|
||||
pilot_hud.icon = 'icons/obj/piloting_overlay.dmi'
|
||||
pilot_hud.icon_state = "dimmer"
|
||||
pilot_hud.layer = SCREEN_LAYER
|
||||
pilot_hud.plane = PLANE_FULLSCREEN
|
||||
pilot_hud.mouse_opacity = 0
|
||||
pilot_hud.alpha = 0
|
||||
|
||||
var/image/I
|
||||
I = image(pilot_hud.icon,pilot_hud,"top_bar",layer=SCREEN_LAYER+1)
|
||||
I.appearance_flags = RESET_ALPHA
|
||||
I.alpha = 145
|
||||
images["top_bar"] = I
|
||||
raw_images += I
|
||||
|
||||
I = image(pilot_hud.icon,pilot_hud,"top_dots",layer=SCREEN_LAYER+1)
|
||||
I.appearance_flags = RESET_ALPHA
|
||||
I.alpha = 200
|
||||
images["topdots"] = I
|
||||
raw_images += I
|
||||
|
||||
I = image(pilot_hud.icon,pilot_hud,"words_discon",layer=SCREEN_LAYER+1) //words_standby, words_flying, words_spool, words_discon
|
||||
I.appearance_flags = RESET_ALPHA
|
||||
I.alpha = 200
|
||||
images["top_words"] = I
|
||||
raw_images += I
|
||||
|
||||
I = image(pilot_hud.icon,pilot_hud,"",layer=SCREEN_LAYER+1)
|
||||
I.appearance_flags = RESET_ALPHA
|
||||
I.alpha = 200
|
||||
images["charging"] = I
|
||||
raw_images += I
|
||||
|
||||
I = image(pilot_hud.icon,pilot_hud,"left_bar",layer=SCREEN_LAYER+1)
|
||||
I.appearance_flags = RESET_ALPHA
|
||||
I.alpha = 0
|
||||
images["left_bar"] = I
|
||||
raw_images += I
|
||||
|
||||
I = image(pilot_hud.icon,pilot_hud,"right_bar",layer=SCREEN_LAYER+1)
|
||||
I.appearance_flags = RESET_ALPHA
|
||||
I.alpha = 0
|
||||
images["right_bar"] = I
|
||||
raw_images += I
|
||||
|
||||
I = image(pilot_hud.icon,pilot_hud,"flyboxes",layer=SCREEN_LAYER+1)
|
||||
I.appearance_flags = RESET_ALPHA
|
||||
I.alpha = 0
|
||||
images["flyboxes"] = I
|
||||
raw_images += I
|
||||
|
||||
I = image(pilot_hud.icon,pilot_hud,"horizon",layer=SCREEN_LAYER+1)
|
||||
I.appearance_flags = RESET_ALPHA
|
||||
I.alpha = 0
|
||||
images["horizon"] = I
|
||||
raw_images += I
|
||||
|
||||
/obj/item/clothing/head/pilot/proc/update_hud(var/status)
|
||||
if(last_status == status)
|
||||
return
|
||||
|
||||
last_status = status
|
||||
|
||||
if(status == SHUTTLE_INTRANSIT)
|
||||
var/image/I = images["top_words"]
|
||||
I.icon_state = "words_flying"
|
||||
I = images["left_bar"]
|
||||
I.alpha = 200
|
||||
I = images["right_bar"]
|
||||
I.alpha = 200
|
||||
I = images["flyboxes"]
|
||||
I.alpha = 200
|
||||
I = images["horizon"]
|
||||
I.alpha = 200
|
||||
I = images["charging"]
|
||||
I.icon_state = ""
|
||||
animate(pilot_hud,alpha=255,time=3 SECONDS)
|
||||
|
||||
else if(status == SHUTTLE_IDLE)
|
||||
var/image/I = images["top_words"]
|
||||
I.icon_state = "words_standby"
|
||||
I = images["left_bar"]
|
||||
I.alpha = 0
|
||||
I = images["right_bar"]
|
||||
I.alpha = 0
|
||||
I = images["flyboxes"]
|
||||
I.alpha = 0
|
||||
I = images["horizon"]
|
||||
I.alpha = 0
|
||||
I = images["charging"]
|
||||
I.icon_state = ""
|
||||
animate(pilot_hud,alpha=0,time=3 SECONDS)
|
||||
|
||||
else if(status == SHUTTLE_WARMUP)
|
||||
var/image/I = images["top_words"]
|
||||
I.icon_state = "words_spool"
|
||||
I = images["left_bar"]
|
||||
I.alpha = 200
|
||||
I = images["right_bar"]
|
||||
I.alpha = 200
|
||||
I = images["flyboxes"]
|
||||
I.alpha = 0
|
||||
I = images["horizon"]
|
||||
I.alpha = 0
|
||||
I = images["charging"]
|
||||
I.icon_state = "charging"
|
||||
animate(pilot_hud,alpha=255,time=3 SECONDS)
|
||||
|
||||
else if(status == "discon")
|
||||
var/image/I = images["top_words"]
|
||||
I.icon_state = "words_discon"
|
||||
I = images["left_bar"]
|
||||
I.alpha = 0
|
||||
I = images["right_bar"]
|
||||
I.alpha = 0
|
||||
I = images["flyboxes"]
|
||||
I.alpha = 0
|
||||
I = images["horizon"]
|
||||
I.alpha = 0
|
||||
I = images["charging"]
|
||||
I.icon_state = ""
|
||||
animate(pilot_hud,alpha=0,time=3 SECONDS)
|
||||
|
||||
/obj/item/clothing/head/pilot/verb/hud_colors()
|
||||
set name = "Alter HUD color"
|
||||
set desc = "Change the color of the piloting HUD."
|
||||
set category = "Object"
|
||||
set src in usr
|
||||
|
||||
var/newcolor = input(usr,"Pick a color!","HUD Color") as null|color
|
||||
if(newcolor)
|
||||
for(var/img in list("top_words","left_bar","right_bar","flyboxes"))
|
||||
var/image/I = images[img]
|
||||
I.color = newcolor
|
||||
|
||||
/obj/item/clothing/head/pilot/Destroy()
|
||||
for(var/img in raw_images)
|
||||
var/image/I = img
|
||||
I.loc = null
|
||||
shuttle_comp = null
|
||||
qdel(pilot_hud)
|
||||
return ..()
|
||||
|
||||
/obj/item/clothing/head/pilot/equipped(var/mob/user,var/slot)
|
||||
. = ..()
|
||||
if(slot == slot_head && user.client)
|
||||
user.client.screen |= pilot_hud
|
||||
user.client.images |= raw_images
|
||||
|
||||
/obj/item/clothing/head/pilot/dropped(var/mob/user)
|
||||
. = ..()
|
||||
if(user.client)
|
||||
user.client.screen -= pilot_hud
|
||||
user.client.images -= raw_images
|
||||
|
||||
/obj/item/clothing/head/pilot/alt
|
||||
name = "pilot helmet"
|
||||
desc = "Standard pilot gear. Protects the head from impacts. This one has a retractable visor"
|
||||
icon_state = "pilot_helmet2"
|
||||
action_button_name = "Toggle Visor"
|
||||
|
||||
/obj/item/clothing/head/pilot/alt/attack_self(mob/user as mob)
|
||||
if(src.icon_state == initial(icon_state))
|
||||
src.icon_state = "[icon_state]up"
|
||||
user << "You raise the visor on the pilot helmet."
|
||||
else
|
||||
src.icon_state = initial(icon_state)
|
||||
user << "You lower the visor on the pilot helmet."
|
||||
update_clothing_icon() //so our mob-overlays update
|
||||
@@ -45,3 +45,17 @@
|
||||
icon_state = "medical"
|
||||
item_state_slots = list(slot_r_hand_str = "medical", slot_l_hand_str = "medical")
|
||||
permeability_coefficient = 0.01
|
||||
|
||||
/obj/item/clothing/mask/breath/emergency
|
||||
desc = "A close-fitting mask that is used by the wallmounted emergency oxygen pump."
|
||||
name = "emergency mask"
|
||||
icon_state = "breath"
|
||||
item_state = "breath"
|
||||
permeability_coefficient = 0.50
|
||||
|
||||
/obj/item/clothing/mask/breath/anesthetic
|
||||
desc = "A close-fitting sterile mask that is used by the anesthetic wallmounted pump."
|
||||
name = "anesthetic mask"
|
||||
icon_state = "medical"
|
||||
item_state = "medical"
|
||||
permeability_coefficient = 0.01
|
||||
|
||||
@@ -58,7 +58,7 @@
|
||||
body_parts_covered = 0 //Hack to allow vox to eat while wearing this mask.
|
||||
item_flags = BLOCK_GAS_SMOKE_EFFECT | AIRTIGHT | PHORONGUARD
|
||||
phoronproof = 1
|
||||
species_restricted = list("Vox")
|
||||
species_restricted = list(SPECIES_VOX)
|
||||
filtered_gases = list("oxygen", "sleeping_agent")
|
||||
|
||||
/obj/item/clothing/mask/gas/syndicate
|
||||
@@ -73,7 +73,6 @@
|
||||
icon_state = "explorer"
|
||||
item_state_slots = list(slot_r_hand_str = "gas", slot_l_hand_str = "gas")
|
||||
armor = list(melee = 10, bullet = 5, laser = 5,energy = 5, bomb = 0, bio = 50, rad = 0)
|
||||
body_parts_covered = HEAD|FACE|EYES
|
||||
siemens_coefficient = 0.9
|
||||
|
||||
/obj/item/clothing/mask/gas/clown_hat
|
||||
|
||||
@@ -37,9 +37,9 @@
|
||||
if(reagents.total_volume)
|
||||
to_chat(H, "<span class='danger'>You feel a prick as you slip on \the [src].</span>")
|
||||
if(H.reagents)
|
||||
var/contained_reagents = reagents.get_reagents()
|
||||
var/contained = reagents.get_reagents()
|
||||
var/trans = reagents.trans_to_mob(H, 15, CHEM_BLOOD)
|
||||
admin_inject_log(usr, H, src, contained_reagents, trans)
|
||||
add_attack_logs(usr, H, "Injected with [name] containing [contained] transferred [trans] units")
|
||||
return
|
||||
|
||||
//Sleepy Ring
|
||||
@@ -61,7 +61,7 @@
|
||||
icon_state = "seal-secgen"
|
||||
|
||||
/obj/item/clothing/gloves/ring/seal/mason
|
||||
name = "masonic ring"
|
||||
name = "\improper Masonic ring"
|
||||
desc = "The Square and Compasses feature prominently on this Masonic ring."
|
||||
icon_state = "seal-masonic"
|
||||
|
||||
@@ -82,4 +82,4 @@
|
||||
|
||||
/obj/item/clothing/gloves/ring/seal/signet/proc/change_name(var/signet_name = "Unknown")
|
||||
name = "[signet_name]'s signet ring"
|
||||
desc = "A signet ring belonging to [signet_name], for when you're too sophisticated to sign letters."
|
||||
desc = "A signet ring belonging to [signet_name], for when you're too sophisticated to sign letters."
|
||||
|
||||
@@ -11,6 +11,18 @@
|
||||
desc = "Lacking a durasteel horse to ride."
|
||||
icon_state = "cowboy"
|
||||
|
||||
/obj/item/clothing/shoes/boots/cowboy/classic
|
||||
name = "classic cowboy boots"
|
||||
desc = "A classic looking pair of durable cowboy boots."
|
||||
icon_state = "cowboy_classic"
|
||||
item_state_slots = list(slot_r_hand_str = "leather", slot_l_hand_str = "leather")
|
||||
|
||||
/obj/item/clothing/shoes/boots/cowboy/snakeskin
|
||||
name = "snakeskin cowboy boots"
|
||||
desc = "A pair of cowboy boots made from python skin."
|
||||
icon_state = "cowboy_snakeskin"
|
||||
item_state_slots = list(slot_r_hand_str = "white", slot_l_hand_str = "white")
|
||||
|
||||
/obj/item/clothing/shoes/boots/jackboots
|
||||
name = "jackboots"
|
||||
desc = "Standard-issue Security combat boots for combat scenarios or combat situations. All combat, all the time."
|
||||
|
||||
@@ -88,7 +88,7 @@
|
||||
icon_state = "boots-vox"
|
||||
item_flags = PHORONGUARD
|
||||
phoronproof = 1
|
||||
species_restricted = list("Vox")
|
||||
species_restricted = list(SPECIES_VOX)
|
||||
|
||||
action_button_name = "Toggle the magclaws"
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
desc = "Smoothly contoured and polished to a shine. Still looks like a fishbowl."
|
||||
armor = list(melee = 20, bullet = 20, laser = 20, energy = 50, bomb = 50, bio = 100, rad = 50)
|
||||
max_heat_protection_temperature = SPACE_SUIT_MAX_HEAT_PROTECTION_TEMPERATURE
|
||||
species_restricted = list("Skrell","Human")
|
||||
species_restricted = list(SPECIES_SKRELL,SPECIES_HUMAN)
|
||||
|
||||
/obj/item/clothing/head/helmet/space/skrell/white
|
||||
icon_state = "skrell_helmet_white"
|
||||
@@ -19,7 +19,7 @@
|
||||
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/weapon/storage/bag/ore,/obj/item/device/t_scanner,/obj/item/weapon/pickaxe, /obj/item/weapon/rcd)
|
||||
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
|
||||
max_heat_protection_temperature = SPACE_SUIT_MAX_HEAT_PROTECTION_TEMPERATURE
|
||||
species_restricted = list("Skrell","Human")
|
||||
species_restricted = list(SPECIES_SKRELL,SPECIES_HUMAN)
|
||||
|
||||
/obj/item/clothing/suit/space/skrell/white
|
||||
icon_state = "skrell_suit_white"
|
||||
@@ -39,7 +39,7 @@
|
||||
siemens_coefficient = 0.2
|
||||
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
|
||||
max_heat_protection_temperature = SPACE_SUIT_MAX_HEAT_PROTECTION_TEMPERATURE
|
||||
species_restricted = list("Vox")
|
||||
species_restricted = list(SPECIES_VOX)
|
||||
|
||||
/obj/item/clothing/head/helmet/space/vox
|
||||
armor = list(melee = 60, bullet = 50, laser = 40, energy = 15, bomb = 30, bio = 100, rad = 50)
|
||||
@@ -47,7 +47,7 @@
|
||||
item_flags = STOPPRESSUREDAMAGE | THICKMATERIAL | AIRTIGHT | PHORONGUARD
|
||||
flags_inv = 0
|
||||
phoronproof = 1
|
||||
species_restricted = list("Vox")
|
||||
species_restricted = list(SPECIES_VOX)
|
||||
|
||||
/obj/item/clothing/head/helmet/space/vox/pressure
|
||||
name = "alien helmet"
|
||||
|
||||
@@ -179,6 +179,15 @@
|
||||
spark_system = null
|
||||
return ..()
|
||||
|
||||
/obj/item/weapon/rig/get_worn_icon_file(var/body_type,var/slot_name,var/default_icon,var/inhands)
|
||||
if(!inhands && slot_name == slot_back_str)
|
||||
if(icon_override)
|
||||
return icon_override
|
||||
else if(mob_icon)
|
||||
return mob_icon
|
||||
|
||||
return ..()
|
||||
|
||||
/obj/item/weapon/rig/proc/suit_is_deployed()
|
||||
if(!istype(wearer) || src.loc != wearer || wearer.back != src)
|
||||
return 0
|
||||
@@ -330,7 +339,6 @@
|
||||
piece.item_flags &= ~(STOPPRESSUREDAMAGE|AIRTIGHT)
|
||||
else
|
||||
piece.item_flags |= (STOPPRESSUREDAMAGE|AIRTIGHT)
|
||||
update_icon(1)
|
||||
|
||||
/obj/item/weapon/rig/ui_action_click()
|
||||
toggle_cooling(usr)
|
||||
@@ -598,7 +606,7 @@
|
||||
// update_inv_wear_suit(), handle species checks here.
|
||||
if(wearer && sprite_sheets && sprite_sheets[wearer.species.get_bodytype(wearer)])
|
||||
species_icon = sprite_sheets[wearer.species.get_bodytype(wearer)]
|
||||
mob_icon = image("icon" = species_icon, "icon_state" = "[icon_state]")
|
||||
mob_icon = icon(icon = species_icon, icon_state = "[icon_state]")
|
||||
|
||||
if(installed_modules.len)
|
||||
for(var/obj/item/rig_module/module in installed_modules)
|
||||
|
||||
@@ -11,10 +11,10 @@
|
||||
cold_protection = HEAD|FACE|EYES
|
||||
brightness_on = 4
|
||||
sprite_sheets = list(
|
||||
"Tajara" = 'icons/mob/species/tajaran/helmet.dmi',
|
||||
"Skrell" = 'icons/mob/species/skrell/helmet.dmi',
|
||||
"Unathi" = 'icons/mob/species/unathi/helmet.dmi',
|
||||
"Vox" = 'icons/mob/species/vox/head.dmi'
|
||||
SPECIES_TAJ = 'icons/mob/species/tajaran/helmet.dmi',
|
||||
SPECIES_SKRELL = 'icons/mob/species/skrell/helmet.dmi',
|
||||
SPECIES_UNATHI = 'icons/mob/species/unathi/helmet.dmi',
|
||||
SPECIES_VOX = 'icons/mob/species/vox/head.dmi'
|
||||
)
|
||||
species_restricted = null
|
||||
|
||||
@@ -50,9 +50,9 @@
|
||||
resilience = 0.2
|
||||
can_breach = 1
|
||||
sprite_sheets = list(
|
||||
"Tajara" = 'icons/mob/species/tajaran/suit.dmi',
|
||||
"Unathi" = 'icons/mob/species/unathi/suit.dmi',
|
||||
"Vox" = 'icons/mob/species/vox/suit.dmi'
|
||||
SPECIES_TAJ = 'icons/mob/species/tajaran/suit.dmi',
|
||||
SPECIES_UNATHI = 'icons/mob/species/unathi/suit.dmi',
|
||||
SPECIES_VOX = 'icons/mob/species/vox/suit.dmi'
|
||||
)
|
||||
supporting_limbs = list()
|
||||
var/obj/item/weapon/material/knife/tacknife
|
||||
|
||||
@@ -28,14 +28,14 @@
|
||||
siemens_coefficient = 0.2
|
||||
|
||||
/obj/item/clothing/head/helmet/space/rig/breacher
|
||||
species_restricted = list("Unathi")
|
||||
species_restricted = list(SPECIES_UNATHI)
|
||||
force = 5
|
||||
|
||||
/obj/item/clothing/suit/space/rig/breacher
|
||||
species_restricted = list("Unathi")
|
||||
species_restricted = list(SPECIES_UNATHI)
|
||||
|
||||
/obj/item/clothing/shoes/magboots/rig/breacher
|
||||
species_restricted = list("Unathi")
|
||||
species_restricted = list(SPECIES_UNATHI)
|
||||
|
||||
/*
|
||||
* VOX
|
||||
@@ -62,27 +62,27 @@
|
||||
glove_type = /obj/item/clothing/gloves/gauntlets/rig/vox
|
||||
|
||||
/obj/item/clothing/head/helmet/space/rig/vox
|
||||
species_restricted = list("Vox")
|
||||
species_restricted = list(SPECIES_VOX)
|
||||
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
|
||||
phoronproof = 1
|
||||
|
||||
/obj/item/clothing/shoes/magboots/rig/vox
|
||||
name = "talons"
|
||||
species_restricted = list("Vox")
|
||||
species_restricted = list(SPECIES_VOX)
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/shoes.dmi'
|
||||
SPECIES_VOX = 'icons/mob/species/vox/shoes.dmi'
|
||||
)
|
||||
phoronproof = 1
|
||||
|
||||
/obj/item/clothing/suit/space/rig/vox
|
||||
species_restricted = list("Vox")
|
||||
species_restricted = list(SPECIES_VOX)
|
||||
phoronproof = 1
|
||||
|
||||
/obj/item/clothing/gloves/gauntlets/rig/vox
|
||||
siemens_coefficient = 0
|
||||
species_restricted = list("Vox")
|
||||
species_restricted = list(SPECIES_VOX)
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/gloves.dmi'
|
||||
SPECIES_VOX = 'icons/mob/species/vox/gloves.dmi'
|
||||
)
|
||||
phoronproof = 1
|
||||
|
||||
|
||||
@@ -19,10 +19,11 @@
|
||||
light_overlay = "helmet_light_dual"
|
||||
camera_networks = list(NETWORK_SECURITY)
|
||||
|
||||
//Internal Affairs suit
|
||||
/obj/item/weapon/rig/internalaffairs
|
||||
name = "augmented tie"
|
||||
suit_type = "augmented suit"
|
||||
desc = "Prepare for paperwork."
|
||||
desc = "The last suit you'll ever wear."
|
||||
icon_state = "internalaffairs_rig"
|
||||
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
|
||||
siemens_coefficient = 0.9
|
||||
@@ -30,7 +31,13 @@
|
||||
offline_slowdown = 0
|
||||
offline_vision_restriction = 0
|
||||
|
||||
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/storage/briefcase,/obj/item/weapon/storage/secure/briefcase)
|
||||
allowed = list(
|
||||
/obj/item/device/flashlight,
|
||||
/obj/item/weapon/tank,
|
||||
/obj/item/device/suit_cooling_unit,
|
||||
/obj/item/weapon/storage/briefcase,
|
||||
/obj/item/weapon/storage/secure/briefcase
|
||||
)
|
||||
|
||||
req_access = list()
|
||||
req_one_access = list()
|
||||
@@ -55,10 +62,11 @@
|
||||
helm_type = null
|
||||
boot_type = null
|
||||
|
||||
//Mining suit
|
||||
/obj/item/weapon/rig/industrial
|
||||
name = "industrial suit control module"
|
||||
suit_type = "industrial hardsuit"
|
||||
desc = "A heavy, powerful rig used by construction crews and mining corporations."
|
||||
desc = "A heavy, powerful hardsuit used by construction crews and mining corporations."
|
||||
icon_state = "engineering_rig"
|
||||
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 100, rad = 50)
|
||||
slowdown = 1
|
||||
@@ -69,7 +77,15 @@
|
||||
|
||||
helm_type = /obj/item/clothing/head/helmet/space/rig/industrial
|
||||
|
||||
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/storage/bag/ore,/obj/item/device/t_scanner,/obj/item/weapon/pickaxe, /obj/item/weapon/rcd)
|
||||
allowed = list(
|
||||
/obj/item/device/flashlight,
|
||||
/obj/item/weapon/tank,
|
||||
/obj/item/device/suit_cooling_unit,
|
||||
/obj/item/weapon/storage/bag/ore,
|
||||
/obj/item/device/t_scanner,
|
||||
/obj/item/weapon/pickaxe,
|
||||
/obj/item/weapon/rcd
|
||||
)
|
||||
|
||||
req_access = list()
|
||||
req_one_access = list()
|
||||
@@ -84,10 +100,11 @@
|
||||
/obj/item/rig_module/vision/meson
|
||||
)
|
||||
|
||||
//Engineering suit
|
||||
/obj/item/weapon/rig/eva
|
||||
name = "EVA suit control module"
|
||||
suit_type = "EVA hardsuit"
|
||||
desc = "A light rig for repairs and maintenance to the outside of habitats and vessels."
|
||||
desc = "A light hardsuit for repairs and maintenance to the outside of habitats and vessels."
|
||||
icon_state = "eva_rig"
|
||||
armor = list(melee = 30, bullet = 10, laser = 20,energy = 25, bomb = 20, bio = 100, rad = 100)
|
||||
slowdown = 0
|
||||
@@ -98,7 +115,14 @@
|
||||
helm_type = /obj/item/clothing/head/helmet/space/rig/eva
|
||||
glove_type = /obj/item/clothing/gloves/gauntlets/rig/eva
|
||||
|
||||
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/storage/toolbox,/obj/item/weapon/storage/briefcase/inflatable,/obj/item/device/t_scanner,/obj/item/weapon/rcd)
|
||||
allowed = list(
|
||||
/obj/item/device/flashlight,
|
||||
/obj/item/weapon/tank,
|
||||
/obj/item/device/suit_cooling_unit,
|
||||
/obj/item/weapon/storage/briefcase/inflatable,
|
||||
/obj/item/device/t_scanner,
|
||||
/obj/item/weapon/rcd
|
||||
)
|
||||
|
||||
req_access = list()
|
||||
req_one_access = list()
|
||||
@@ -135,7 +159,14 @@
|
||||
helm_type = /obj/item/clothing/head/helmet/space/rig/ce
|
||||
glove_type = /obj/item/clothing/gloves/gauntlets/rig/ce
|
||||
|
||||
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/storage/bag/ore,/obj/item/device/t_scanner,/obj/item/weapon/pickaxe, /obj/item/weapon/rcd)
|
||||
allowed = list(
|
||||
/obj/item/device/flashlight,
|
||||
/obj/item/weapon/tank,
|
||||
/obj/item/device/suit_cooling_unit,
|
||||
/obj/item/weapon/storage/briefcase/inflatable,
|
||||
/obj/item/device/t_scanner,
|
||||
/obj/item/weapon/rcd
|
||||
)
|
||||
|
||||
req_access = list()
|
||||
req_one_access = list()
|
||||
@@ -157,6 +188,7 @@
|
||||
/obj/item/rig_module/vision/meson
|
||||
)
|
||||
|
||||
//Research Director's suit. Just add red crowbar.
|
||||
/obj/item/weapon/rig/hazmat
|
||||
|
||||
name = "AMI control module"
|
||||
@@ -170,7 +202,23 @@
|
||||
|
||||
helm_type = /obj/item/clothing/head/helmet/space/rig/hazmat
|
||||
|
||||
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/stack/flag,/obj/item/weapon/storage/excavation,/obj/item/weapon/pickaxe,/obj/item/device/healthanalyzer,/obj/item/device/measuring_tape,/obj/item/device/ano_scanner,/obj/item/device/depth_scanner,/obj/item/device/core_sampler,/obj/item/device/gps,/obj/item/device/beacon_locator,/obj/item/device/radio/beacon,/obj/item/weapon/pickaxe/hand,/obj/item/weapon/storage/bag/fossils)
|
||||
allowed = list(
|
||||
/obj/item/device/flashlight,
|
||||
/obj/item/weapon/tank,
|
||||
/obj/item/device/suit_cooling_unit,
|
||||
/obj/item/stack/flag,
|
||||
/obj/item/weapon/storage/excavation,
|
||||
/obj/item/weapon/pickaxe,
|
||||
/obj/item/device/healthanalyzer,
|
||||
/obj/item/device/measuring_tape,
|
||||
/obj/item/device/ano_scanner,
|
||||
/obj/item/device/depth_scanner,
|
||||
/obj/item/device/core_sampler,
|
||||
/obj/item/device/gps,
|
||||
/obj/item/device/beacon_locator,
|
||||
/obj/item/device/radio/beacon,
|
||||
/obj/item/weapon/pickaxe/hand,
|
||||
/obj/item/weapon/storage/bag/fossils)
|
||||
|
||||
req_access = list()
|
||||
req_one_access = list()
|
||||
@@ -185,6 +233,7 @@
|
||||
/obj/item/rig_module/device/anomaly_scanner
|
||||
)
|
||||
|
||||
//Paramedic suit
|
||||
/obj/item/weapon/rig/medical
|
||||
|
||||
name = "rescue suit control module"
|
||||
@@ -198,7 +247,15 @@
|
||||
|
||||
helm_type = /obj/item/clothing/head/helmet/space/rig/medical
|
||||
|
||||
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/storage/firstaid,/obj/item/device/healthanalyzer,/obj/item/stack/medical,/obj/item/roller )
|
||||
allowed = list(
|
||||
/obj/item/device/flashlight,
|
||||
/obj/item/weapon/tank,
|
||||
/obj/item/device/suit_cooling_unit,
|
||||
/obj/item/weapon/storage/firstaid,
|
||||
/obj/item/device/healthanalyzer,
|
||||
/obj/item/stack/medical,
|
||||
/obj/item/roller
|
||||
)
|
||||
|
||||
req_access = list()
|
||||
req_one_access = list()
|
||||
@@ -215,6 +272,7 @@
|
||||
/obj/item/rig_module/vision/medhud
|
||||
)
|
||||
|
||||
//Security suit
|
||||
/obj/item/weapon/rig/hazard
|
||||
name = "hazard hardsuit control module"
|
||||
suit_type = "hazard hardsuit"
|
||||
@@ -228,7 +286,13 @@
|
||||
|
||||
helm_type = /obj/item/clothing/head/helmet/space/rig/hazard
|
||||
|
||||
allowed = list(/obj/item/weapon/gun,/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/melee/baton)
|
||||
allowed = list(
|
||||
/obj/item/weapon/gun,
|
||||
/obj/item/device/flashlight,
|
||||
/obj/item/weapon/tank,
|
||||
/obj/item/device/suit_cooling_unit,
|
||||
/obj/item/weapon/melee/baton
|
||||
)
|
||||
|
||||
req_access = list()
|
||||
req_one_access = list()
|
||||
|
||||
@@ -14,10 +14,11 @@
|
||||
cold_protection = HEAD
|
||||
min_cold_protection_temperature = SPACE_HELMET_MIN_COLD_PROTECTION_TEMPERATURE
|
||||
siemens_coefficient = 0.9
|
||||
species_restricted = list("exclude","Diona")
|
||||
species_restricted = list("exclude",SPECIES_DIONA)
|
||||
preserve_item = 1
|
||||
phoronproof = 1
|
||||
flash_protection = FLASH_PROTECTION_MAJOR
|
||||
valid_accessory_slots = null
|
||||
|
||||
var/obj/machinery/camera/camera
|
||||
var/list/camera_networks
|
||||
@@ -61,7 +62,7 @@
|
||||
cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS
|
||||
min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE
|
||||
siemens_coefficient = 0.9
|
||||
species_restricted = list("exclude","Diona")
|
||||
species_restricted = list("exclude",SPECIES_DIONA)
|
||||
preserve_item = 1
|
||||
phoronproof = 1
|
||||
|
||||
|
||||
@@ -13,16 +13,16 @@
|
||||
//Species-specific stuff.
|
||||
species_restricted = list("Human", "Promethean")
|
||||
sprite_sheets_refit = list(
|
||||
"Unathi" = 'icons/mob/species/unathi/helmet.dmi',
|
||||
"Tajara" = 'icons/mob/species/tajaran/helmet.dmi',
|
||||
"Skrell" = 'icons/mob/species/skrell/helmet.dmi'
|
||||
SPECIES_UNATHI = 'icons/mob/species/unathi/helmet.dmi',
|
||||
SPECIES_TAJ = 'icons/mob/species/tajaran/helmet.dmi',
|
||||
SPECIES_SKRELL = 'icons/mob/species/skrell/helmet.dmi'
|
||||
//Teshari have a general sprite sheet defined in modules/clothing/clothing.dm
|
||||
)
|
||||
sprite_sheets_obj = list(
|
||||
"Unathi" = 'icons/obj/clothing/species/unathi/hats.dmi',
|
||||
"Tajara" = 'icons/obj/clothing/species/tajaran/hats.dmi',
|
||||
"Skrell" = 'icons/obj/clothing/species/skrell/hats.dmi',
|
||||
"Teshari" = 'icons/obj/clothing/species/seromi/hats.dmi'
|
||||
SPECIES_UNATHI = 'icons/obj/clothing/species/unathi/hats.dmi',
|
||||
SPECIES_TAJ = 'icons/obj/clothing/species/tajaran/hats.dmi',
|
||||
SPECIES_SKRELL = 'icons/obj/clothing/species/skrell/hats.dmi',
|
||||
SPECIES_TESHARI = 'icons/obj/clothing/species/seromi/hats.dmi'
|
||||
)
|
||||
|
||||
light_overlay = "helmet_light"
|
||||
@@ -38,18 +38,18 @@
|
||||
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
|
||||
max_heat_protection_temperature = SPACE_SUIT_MAX_HEAT_PROTECTION_TEMPERATURE
|
||||
|
||||
species_restricted = list("Human", "Skrell", "Promethean")
|
||||
species_restricted = list("Human", SPECIES_SKRELL, "Promethean")
|
||||
sprite_sheets_refit = list(
|
||||
"Unathi" = 'icons/mob/species/unathi/suit.dmi',
|
||||
"Tajara" = 'icons/mob/species/tajaran/suit.dmi',
|
||||
"Skrell" = 'icons/mob/species/skrell/suit.dmi'
|
||||
SPECIES_UNATHI = 'icons/mob/species/unathi/suit.dmi',
|
||||
SPECIES_TAJ = 'icons/mob/species/tajaran/suit.dmi',
|
||||
SPECIES_SKRELL = 'icons/mob/species/skrell/suit.dmi'
|
||||
//Teshari have a general sprite sheet defined in modules/clothing/clothing.dm
|
||||
)
|
||||
sprite_sheets_obj = list(
|
||||
"Unathi" = 'icons/obj/clothing/species/unathi/suits.dmi',
|
||||
"Tajara" = 'icons/obj/clothing/species/tajaran/suits.dmi',
|
||||
"Skrell" = 'icons/obj/clothing/species/skrell/suits.dmi',
|
||||
"Teshari" = 'icons/obj/clothing/species/seromi/suits.dmi'
|
||||
SPECIES_UNATHI = 'icons/obj/clothing/species/unathi/suits.dmi',
|
||||
SPECIES_TAJ = 'icons/obj/clothing/species/tajaran/suits.dmi',
|
||||
SPECIES_SKRELL = 'icons/obj/clothing/species/skrell/suits.dmi',
|
||||
SPECIES_TESHARI = 'icons/obj/clothing/species/seromi/suits.dmi'
|
||||
)
|
||||
|
||||
//Breach thresholds, should ideally be inherited by most (if not all) voidsuits.
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
icon_override = 'icons/mob/species/seromi/teshari_cloak.dmi'
|
||||
icon_state = "tesh_cloak_bo"
|
||||
item_state = "tesh_cloak_bo"
|
||||
species_restricted = list("Teshari")
|
||||
species_restricted = list(SPECIES_TESHARI)
|
||||
body_parts_covered = UPPER_TORSO|ARMS
|
||||
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/black_orange
|
||||
|
||||
@@ -6,5 +6,5 @@
|
||||
icon_state = "vox-scrap"
|
||||
icon_state = "vox-scrap"
|
||||
body_parts_covered = UPPER_TORSO|ARMS|LOWER_TORSO|LEGS
|
||||
species_restricted = list("Vox")
|
||||
species_restricted = list(SPECIES_VOX)
|
||||
siemens_coefficient = 1 //Its literally metal
|
||||
@@ -45,7 +45,6 @@
|
||||
icon_state = "riot"
|
||||
item_state_slots = list(slot_r_hand_str = "swat", slot_l_hand_str = "swat")
|
||||
armor = list(melee = 80, bullet = 10, laser = 10, energy = 10, bomb = 0, bio = 0, rad = 0)
|
||||
flags_inv = HIDEJUMPSUIT
|
||||
siemens_coefficient = 0.5
|
||||
|
||||
/obj/item/clothing/suit/armor/riot/alt
|
||||
@@ -115,7 +114,7 @@
|
||||
icon_state = "swatarmor"
|
||||
item_state_slots = list(slot_r_hand_str = "swat", slot_l_hand_str = "swat")
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
|
||||
flags_inv = HIDEJUMPSUIT|HIDETIE|HIDEHOLSTER
|
||||
flags_inv = HIDETIE|HIDEHOLSTER
|
||||
slowdown = 1
|
||||
armor = list(melee = 60, bullet = 60, laser = 60, energy = 40, bomb = 40, bio = 0, rad = 0)
|
||||
siemens_coefficient = 0.7
|
||||
@@ -311,7 +310,7 @@
|
||||
desc = "An armoured jacket with silver rank pips and livery."
|
||||
icon_state = "warden_jacket"
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS
|
||||
flags_inv = HIDEJUMPSUIT|HIDETIE|HIDEHOLSTER
|
||||
flags_inv = HIDETIE|HIDEHOLSTER
|
||||
|
||||
/obj/item/clothing/suit/storage/vest/wardencoat/alt
|
||||
name = "Warden's jacket"
|
||||
@@ -332,7 +331,7 @@
|
||||
desc = "A greatcoat enhanced with a special alloy for some protection and style."
|
||||
icon_state = "hos"
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS
|
||||
flags_inv = HIDEJUMPSUIT|HIDETIE|HIDEHOLSTER
|
||||
flags_inv = HIDETIE|HIDEHOLSTER
|
||||
|
||||
//Jensen cosplay gear
|
||||
/obj/item/clothing/suit/storage/vest/hoscoat/jensen
|
||||
@@ -498,28 +497,28 @@
|
||||
blood_overlay_type = "armor"
|
||||
|
||||
/obj/item/clothing/suit/armor/pcarrier/light
|
||||
starting_accessories = list(/obj/item/clothing/accessory/armorplate)
|
||||
starting_accessories = list(/obj/item/clothing/accessory/armor/armorplate)
|
||||
|
||||
/obj/item/clothing/suit/armor/pcarrier/light/sol
|
||||
starting_accessories = list(/obj/item/clothing/accessory/armorplate, /obj/item/clothing/accessory/armor/tag)
|
||||
starting_accessories = list(/obj/item/clothing/accessory/armor/armorplate, /obj/item/clothing/accessory/armor/tag)
|
||||
|
||||
/obj/item/clothing/suit/armor/pcarrier/light/nt
|
||||
starting_accessories = list(/obj/item/clothing/accessory/armorplate, /obj/item/clothing/accessory/armor/tag/nt)
|
||||
starting_accessories = list(/obj/item/clothing/accessory/armor/armorplate, /obj/item/clothing/accessory/armor/tag/nt)
|
||||
|
||||
/obj/item/clothing/suit/armor/pcarrier/medium
|
||||
starting_accessories = list(/obj/item/clothing/accessory/armorplate/medium, /obj/item/clothing/accessory/storage/pouches)
|
||||
starting_accessories = list(/obj/item/clothing/accessory/armor/armorplate/medium, /obj/item/clothing/accessory/storage/pouches)
|
||||
|
||||
/obj/item/clothing/suit/armor/pcarrier/medium/sol
|
||||
starting_accessories = list(/obj/item/clothing/accessory/armorplate/medium, /obj/item/clothing/accessory/storage/pouches, /obj/item/clothing/accessory/armor/tag)
|
||||
starting_accessories = list(/obj/item/clothing/accessory/armor/armorplate/medium, /obj/item/clothing/accessory/storage/pouches, /obj/item/clothing/accessory/armor/tag)
|
||||
|
||||
/obj/item/clothing/suit/armor/pcarrier/medium/security
|
||||
starting_accessories = list(/obj/item/clothing/accessory/armorplate/medium, /obj/item/clothing/accessory/storage/pouches, /obj/item/clothing/accessory/armor/tag/sec)
|
||||
starting_accessories = list(/obj/item/clothing/accessory/armor/armorplate/medium, /obj/item/clothing/accessory/storage/pouches, /obj/item/clothing/accessory/armor/tag/sec)
|
||||
|
||||
/obj/item/clothing/suit/armor/pcarrier/medium/command
|
||||
starting_accessories = list(/obj/item/clothing/accessory/armorplate/medium, /obj/item/clothing/accessory/storage/pouches, /obj/item/clothing/accessory/armor/tag/com)
|
||||
starting_accessories = list(/obj/item/clothing/accessory/armor/armorplate/medium, /obj/item/clothing/accessory/storage/pouches, /obj/item/clothing/accessory/armor/tag/com)
|
||||
|
||||
/obj/item/clothing/suit/armor/pcarrier/medium/nt
|
||||
starting_accessories = list(/obj/item/clothing/accessory/armorplate/medium, /obj/item/clothing/accessory/storage/pouches, /obj/item/clothing/accessory/armor/tag/nt)
|
||||
starting_accessories = list(/obj/item/clothing/accessory/armor/armorplate/medium, /obj/item/clothing/accessory/storage/pouches, /obj/item/clothing/accessory/armor/tag/nt)
|
||||
|
||||
/obj/item/clothing/suit/armor/pcarrier/blue
|
||||
name = "blue plate carrier"
|
||||
@@ -529,7 +528,7 @@
|
||||
/obj/item/clothing/suit/armor/pcarrier/blue/sol
|
||||
name = "peacekeeper plate carrier"
|
||||
desc = "A lightweight plate carrier vest in SCG Peacekeeper colors. It can be equipped with armor plates, but provides no protection of its own."
|
||||
starting_accessories = list(/obj/item/clothing/accessory/armorplate/medium, /obj/item/clothing/accessory/storage/pouches/blue, /obj/item/clothing/accessory/armguards/blue, /obj/item/clothing/accessory/armor/tag)
|
||||
starting_accessories = list(/obj/item/clothing/accessory/armor/armorplate/medium, /obj/item/clothing/accessory/storage/pouches/blue, /obj/item/clothing/accessory/armor/armguards/blue, /obj/item/clothing/accessory/armor/tag)
|
||||
|
||||
/obj/item/clothing/suit/armor/pcarrier/green
|
||||
name = "green plate carrier"
|
||||
@@ -548,8 +547,8 @@
|
||||
|
||||
/obj/item/clothing/suit/armor/pcarrier/tan/tactical
|
||||
name = "tactical plate carrier"
|
||||
starting_accessories = list(/obj/item/clothing/accessory/armorplate/tactical, /obj/item/clothing/accessory/storage/pouches/large/tan)
|
||||
starting_accessories = list(/obj/item/clothing/accessory/armor/armorplate/tactical, /obj/item/clothing/accessory/storage/pouches/large/tan)
|
||||
|
||||
/obj/item/clothing/suit/armor/pcarrier/merc
|
||||
starting_accessories = list(/obj/item/clothing/accessory/armorplate/merc, /obj/item/clothing/accessory/armguards/merc, /obj/item/clothing/accessory/legguards/merc, /obj/item/clothing/accessory/storage/pouches/large)
|
||||
starting_accessories = list(/obj/item/clothing/accessory/armor/armorplate/merc, /obj/item/clothing/accessory/armor/armguards/merc, /obj/item/clothing/accessory/armor/legguards/merc, /obj/item/clothing/accessory/storage/pouches/large)
|
||||
|
||||
|
||||
@@ -45,7 +45,7 @@
|
||||
desc = "A long, flowing white robe. It looks comfortable, but not very warm."
|
||||
icon_state = "whiteout_robe"
|
||||
item_state_slots = list(slot_r_hand_str = "suit_white", slot_l_hand_str = "suit_white")
|
||||
flags_inv = HIDEJUMPSUIT|HIDETIE|HIDEHOLSTER
|
||||
flags_inv = HIDETIE|HIDEHOLSTER
|
||||
hoodtype = /obj/item/clothing/head/chaplain_hood/whiteout
|
||||
|
||||
//Chaplain
|
||||
|
||||
@@ -265,6 +265,15 @@
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/item/clothing/suit/straight_jacket/equipped(var/mob/living/user,var/slot)
|
||||
. = ..()
|
||||
if(slot == slot_wear_suit)
|
||||
user.drop_l_hand()
|
||||
user.drop_r_hand()
|
||||
if(ishuman(user))
|
||||
var/mob/living/carbon/human/H = user
|
||||
H.drop_from_inventory(H.handcuffed)
|
||||
|
||||
/obj/item/clothing/suit/ianshirt
|
||||
name = "worn shirt"
|
||||
desc = "A worn out, curiously comfortable t-shirt with a picture of Ian. You wouldn't go so far as to say it feels like being hugged when you wear it but it's pretty close. Good for sleeping in."
|
||||
@@ -348,6 +357,14 @@ obj/item/clothing/suit/storage/toggle/peacoat
|
||||
addblends = "peacoat_a"
|
||||
item_state_slots = list(slot_r_hand_str = "peacoat", slot_l_hand_str = "peacoat")
|
||||
flags_inv = HIDEHOLSTER
|
||||
|
||||
/obj/item/clothing/suit/storage/duster
|
||||
name = "cowboy duster"
|
||||
desc = "A duster commonly seen on cowboys from Earth's late 1800's."
|
||||
icon_state = "duster"
|
||||
blood_overlay_type = "coat"
|
||||
allowed = list(/obj/item/weapon/tank/emergency/oxygen, /obj/item/device/flashlight,/obj/item/weapon/gun/energy,/obj/item/weapon/gun/projectile,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/flame/lighter)
|
||||
flags_inv = HIDEHOLSTER
|
||||
/*
|
||||
* stripper
|
||||
*/
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
var/concealed_holster = 0
|
||||
var/mob/living/carbon/human/wearer = null //To check if the wearer changes, so species spritesheets change properly.
|
||||
|
||||
sprite_sheets = list("Teshari" = 'icons/mob/species/seromi/ties.dmi') //Teshari can into webbing, too!
|
||||
sprite_sheets = list(SPECIES_TESHARI = 'icons/mob/species/seromi/ties.dmi') //Teshari can into webbing, too!
|
||||
|
||||
/obj/item/clothing/accessory/Destroy()
|
||||
on_removed()
|
||||
@@ -26,7 +26,9 @@
|
||||
if(icon_override)
|
||||
if("[tmp_icon_state]_tie" in icon_states(icon_override))
|
||||
tmp_icon_state = "[tmp_icon_state]_tie"
|
||||
inv_overlay = image(icon = INV_ACCESSORIES_DEF_ICON, icon_state = tmp_icon_state, dir = SOUTH)
|
||||
inv_overlay = image(icon = icon_override, icon_state = tmp_icon_state, dir = SOUTH)
|
||||
else
|
||||
inv_overlay = image(icon = INV_ACCESSORIES_DEF_ICON, icon_state = tmp_icon_state, dir = SOUTH)
|
||||
return inv_overlay
|
||||
|
||||
/obj/item/clothing/accessory/proc/get_mob_overlay()
|
||||
@@ -387,4 +389,4 @@
|
||||
/obj/item/clothing/accessory/bracelet/material/glass/New(var/newloc)
|
||||
..(newloc, "glass")
|
||||
|
||||
..()
|
||||
..()
|
||||
|
||||
@@ -1,11 +1,25 @@
|
||||
/*
|
||||
// This file holds all of the accessories used as part of the modular armor system. At some point it might be wise to split this into multiple files.
|
||||
*/
|
||||
|
||||
/obj/item/clothing/accessory/armor
|
||||
name = "armor accessory"
|
||||
desc = "You should never see this description. Ahelp this, please."
|
||||
icon_override = 'icons/mob/modular_armor.dmi'
|
||||
icon = 'icons/obj/clothing/modular_armor.dmi'
|
||||
icon_state = "pouches"
|
||||
w_class = ITEMSIZE_NORMAL
|
||||
|
||||
///////////
|
||||
//Pouches
|
||||
///////////
|
||||
/obj/item/clothing/accessory/storage/pouches
|
||||
name = "storage pouches"
|
||||
desc = "A collection of black pouches that can be attached to a plate carrier. Carries up to two items."
|
||||
icon_override = 'icons/mob/modular_armor.dmi'
|
||||
icon = 'icons/obj/clothing/modular_armor.dmi'
|
||||
// accessory_icons = list(slot_tie_str = 'icons/mob/modular_armor.dmi', slot_wear_suit_str = 'icons/mob/modular_armor.dmi')
|
||||
icon_state = "pouches"
|
||||
w_class = ITEMSIZE_NORMAL
|
||||
gender = PLURAL
|
||||
slot = ACCESSORY_SLOT_ARMOR_S
|
||||
slots = 2
|
||||
@@ -31,6 +45,7 @@
|
||||
desc = "A collection of black pouches that can be attached to a plate carrier. Carries up to four items."
|
||||
icon_state = "lpouches"
|
||||
slots = 4
|
||||
slowdown = 0.25
|
||||
|
||||
/obj/item/clothing/accessory/storage/pouches/large/blue
|
||||
desc = "A collection of blue pouches that can be attached to a plate carrier. Carries up to four items."
|
||||
@@ -48,40 +63,41 @@
|
||||
desc = "A collection of tan pouches that can be attached to a plate carrier. Carries up to four items."
|
||||
icon_state = "lpouches_tan"
|
||||
|
||||
////////////////
|
||||
//Armor plates
|
||||
/obj/item/clothing/accessory/armorplate
|
||||
////////////////
|
||||
/obj/item/clothing/accessory/armor/armorplate
|
||||
name = "light armor plate"
|
||||
desc = "A basic armor plate made of steel-reinforced synthetic fibers. Attaches to a plate carrier."
|
||||
icon = 'icons/obj/clothing/modular_armor.dmi'
|
||||
icon_state = "armor_light"
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO
|
||||
armor = list(melee = 30, bullet = 15, laser = 40, energy = 10, bomb = 25, bio = 0, rad = 0)
|
||||
slot = ACCESSORY_SLOT_ARMOR_C
|
||||
|
||||
/obj/item/clothing/accessory/armorplate/medium
|
||||
/obj/item/clothing/accessory/armor/armorplate/medium
|
||||
name = "medium armor plate"
|
||||
desc = "A plasteel-reinforced synthetic armor plate, providing good protection. Attaches to a plate carrier."
|
||||
icon_state = "armor_medium"
|
||||
armor = list(melee = 40, bullet = 40, laser = 40, energy = 25, bomb = 30, bio = 0, rad = 0)
|
||||
|
||||
/obj/item/clothing/accessory/armorplate/tactical
|
||||
/obj/item/clothing/accessory/armor/armorplate/tactical
|
||||
name = "tactical armor plate"
|
||||
desc = "A medium armor plate with additional ablative coating. Attaches to a plate carrier."
|
||||
icon_state = "armor_tactical"
|
||||
armor = list(melee = 40, bullet = 40, laser = 60, energy = 35, bomb = 30, bio = 0, rad = 0)
|
||||
|
||||
/obj/item/clothing/accessory/armorplate/merc
|
||||
/obj/item/clothing/accessory/armor/armorplate/merc
|
||||
name = "heavy armor plate"
|
||||
desc = "A ceramics-reinforced synthetic armor plate, providing state of of the art protection. Attaches to a plate carrier."
|
||||
icon_state = "armor_heavy"
|
||||
armor = list(melee = 60, bullet = 60, laser = 60, energy = 40, bomb = 40, bio = 0, rad = 0)
|
||||
|
||||
//////////////
|
||||
//Arm guards
|
||||
/obj/item/clothing/accessory/armguards
|
||||
//////////////
|
||||
/obj/item/clothing/accessory/armor/armguards
|
||||
name = "arm guards"
|
||||
desc = "A pair of black arm pads reinforced with armor plating. Attaches to a plate carrier."
|
||||
icon_override = 'icons/mob/modular_armor.dmi'
|
||||
icon = 'icons/obj/clothing/modular_armor.dmi'
|
||||
// accessory_icons = list(slot_tie_str = 'icons/mob/modular_armor.dmi', slot_wear_suit_str = 'icons/mob/modular_armor.dmi')
|
||||
icon_state = "armguards"
|
||||
gender = PLURAL
|
||||
@@ -89,34 +105,58 @@
|
||||
armor = list(melee = 40, bullet = 40, laser = 40, energy = 25, bomb = 30, bio = 0, rad = 0)
|
||||
slot = ACCESSORY_SLOT_ARMOR_A
|
||||
|
||||
/obj/item/clothing/accessory/armguards/blue
|
||||
/obj/item/clothing/accessory/armor/armguards/blue
|
||||
desc = "A pair of blue arm pads reinforced with armor plating. Attaches to a plate carrier."
|
||||
icon_state = "armguards_blue"
|
||||
|
||||
/obj/item/clothing/accessory/armguards/navy
|
||||
/obj/item/clothing/accessory/armor/armguards/navy
|
||||
desc = "A pair of navy blue arm pads reinforced with armor plating. Attaches to a plate carrier."
|
||||
icon_state = "armguards_navy"
|
||||
|
||||
/obj/item/clothing/accessory/armguards/green
|
||||
/obj/item/clothing/accessory/armor/armguards/green
|
||||
desc = "A pair of green arm pads reinforced with armor plating. Attaches to a plate carrier."
|
||||
icon_state = "armguards_green"
|
||||
|
||||
/obj/item/clothing/accessory/armguards/tan
|
||||
/obj/item/clothing/accessory/armor/armguards/tan
|
||||
desc = "A pair of tan arm pads reinforced with armor plating. Attaches to a plate carrier."
|
||||
icon_state = "armguards_tan"
|
||||
|
||||
/obj/item/clothing/accessory/armguards/merc
|
||||
/obj/item/clothing/accessory/armor/armguards/merc
|
||||
name = "heavy arm guards"
|
||||
desc = "A pair of red-trimmed black arm pads reinforced with heavy armor plating. Attaches to a plate carrier."
|
||||
icon_state = "armguards_merc"
|
||||
armor = list(melee = 60, bullet = 60, laser = 60, energy = 40, bomb = 40, bio = 0, rad = 0)
|
||||
|
||||
/obj/item/clothing/accessory/armor/armguards/laserproof
|
||||
name = "ablative arm guards"
|
||||
desc = "These arm guards will protect your arms from energy weapons."
|
||||
icon_state = "armguards_laser"
|
||||
item_state_slots = list(slot_r_hand_str = "swat", slot_l_hand_str = "swat")
|
||||
siemens_coefficient = 0.4 //This is worse than the other ablative pieces, to avoid this from becoming the poor warden's insulated gloves.
|
||||
armor = list(melee = 10, bullet = 10, laser = 80, energy = 50, bomb = 0, bio = 0, rad = 0)
|
||||
|
||||
/obj/item/clothing/accessory/armor/armguards/bulletproof
|
||||
name = "bullet resistant arm guards"
|
||||
desc = "These arm guards will protect your arms from ballistic weapons."
|
||||
icon_state = "armguards_bullet"
|
||||
item_state_slots = list(slot_r_hand_str = "swat", slot_l_hand_str = "swat")
|
||||
siemens_coefficient = 0.7
|
||||
armor = list(melee = 10, bullet = 80, laser = 10, energy = 50, bomb = 0, bio = 0, rad = 0)
|
||||
|
||||
/obj/item/clothing/accessory/armor/armguards/riot
|
||||
name = "riot arm guards"
|
||||
desc = "These arm guards will protect your arms from close combat weapons."
|
||||
icon_state = "armguards_riot"
|
||||
item_state_slots = list(slot_r_hand_str = "swat", slot_l_hand_str = "swat")
|
||||
siemens_coefficient = 0.5
|
||||
armor = list(melee = 80, bullet = 10, laser = 10, energy = 50, bomb = 0, bio = 0, rad = 0)
|
||||
|
||||
//////////////
|
||||
//Leg guards
|
||||
/obj/item/clothing/accessory/legguards
|
||||
//////////////
|
||||
/obj/item/clothing/accessory/armor/legguards
|
||||
name = "leg guards"
|
||||
desc = "A pair of armored leg pads in black. Attaches to a plate carrier."
|
||||
icon_override = 'icons/mob/modular_armor.dmi'
|
||||
icon = 'icons/obj/clothing/modular_armor.dmi'
|
||||
// accessory_icons = list(slot_tie_str = 'icons/mob/modular_armor.dmi', slot_wear_suit_str = 'icons/mob/modular_armor.dmi')
|
||||
icon_state = "legguards"
|
||||
gender = PLURAL
|
||||
@@ -124,38 +164,62 @@
|
||||
armor = list(melee = 40, bullet = 40, laser = 40, energy = 25, bomb = 30, bio = 0, rad = 0)
|
||||
slot = ACCESSORY_SLOT_ARMOR_L
|
||||
|
||||
/obj/item/clothing/accessory/legguards/blue
|
||||
/obj/item/clothing/accessory/armor/legguards/blue
|
||||
desc = "A pair of armored leg pads in blue. Attaches to a plate carrier."
|
||||
icon_state = "legguards_blue"
|
||||
|
||||
/obj/item/clothing/accessory/legguards/navy
|
||||
/obj/item/clothing/accessory/armor/legguards/navy
|
||||
desc = "A pair of armored leg pads in navy blue. Attaches to a plate carrier."
|
||||
icon_state = "legguards_navy"
|
||||
|
||||
/obj/item/clothing/accessory/legguards/green
|
||||
/obj/item/clothing/accessory/armor/legguards/green
|
||||
desc = "A pair of armored leg pads in green. Attaches to a plate carrier."
|
||||
icon_state = "legguards_green"
|
||||
|
||||
/obj/item/clothing/accessory/legguards/tan
|
||||
/obj/item/clothing/accessory/armor/legguards/tan
|
||||
desc = "A pair of armored leg pads in tan. Attaches to a plate carrier."
|
||||
icon_state = "legguards_tan"
|
||||
|
||||
/obj/item/clothing/accessory/legguards/merc
|
||||
/obj/item/clothing/accessory/armor/legguards/merc
|
||||
name = "heavy leg guards"
|
||||
desc = "A pair of heavily armored leg pads in red-trimmed black. Attaches to a plate carrier."
|
||||
icon_state = "legguards_merc"
|
||||
armor = list(melee = 60, bullet = 60, laser = 60, energy = 40, bomb = 40, bio = 0, rad = 0)
|
||||
|
||||
/obj/item/clothing/accessory/armor/legguards/laserproof
|
||||
name = "ablative leg guards"
|
||||
desc = "These will protect your legs from energy weapons."
|
||||
icon_state = "legguards_laser"
|
||||
item_state_slots = list(slot_r_hand_str = "jackboots", slot_l_hand_str = "jackboots")
|
||||
siemens_coefficient = 0.1
|
||||
armor = list(melee = 10, bullet = 10, laser = 80, energy = 50, bomb = 0, bio = 0, rad = 0)
|
||||
|
||||
/obj/item/clothing/accessory/armor/legguards/bulletproof
|
||||
name = "bullet resistant leg guards"
|
||||
desc = "These will protect your legs from ballistic weapons."
|
||||
icon_state = "legguards_bullet"
|
||||
item_state_slots = list(slot_r_hand_str = "jackboots", slot_l_hand_str = "jackboots")
|
||||
siemens_coefficient = 0.7
|
||||
armor = list(melee = 10, bullet = 80, laser = 10, energy = 10, bomb = 0, bio = 0, rad = 0)
|
||||
|
||||
/obj/item/clothing/accessory/armor/legguards/riot
|
||||
name = "riot leg guards"
|
||||
desc = "These will protect your legs from close combat weapons."
|
||||
icon_state = "legguards_riot"
|
||||
item_state_slots = list(slot_r_hand_str = "jackboots", slot_l_hand_str = "jackboots")
|
||||
siemens_coefficient = 0.5
|
||||
armor = list(melee = 80, bullet = 10, laser = 10, energy = 10, bomb = 0, bio = 0, rad = 0)
|
||||
|
||||
//////////////////////////
|
||||
//Decorative attachments
|
||||
//////////////////////////
|
||||
/obj/item/clothing/accessory/armor/tag
|
||||
name = "\improper SCG Flag"
|
||||
desc = "An emblem depicting the Solar Confederate Government's flag."
|
||||
icon_override = 'icons/mob/modular_armor.dmi'
|
||||
icon = 'icons/obj/clothing/modular_armor.dmi'
|
||||
// accessory_icons = list(slot_tie_str = 'icons/mob/modular_armor.dmi', slot_wear_suit_str = 'icons/mob/modular_armor.dmi')
|
||||
icon_state = "solflag"
|
||||
slot = ACCESSORY_SLOT_ARMOR_M
|
||||
w_class = ITEMSIZE_SMALL
|
||||
|
||||
/obj/item/clothing/accessory/armor/tag/sifguard
|
||||
name = "\improper Sif Defense Force crest"
|
||||
@@ -226,3 +290,50 @@
|
||||
name = "\improper AB- blood patch"
|
||||
desc = "An embroidered patch indicating the wearer's blood type as AB NEGATIVE."
|
||||
icon_state = "abnegtag"
|
||||
|
||||
/////////////////
|
||||
// Helmet Covers
|
||||
/////////////////
|
||||
|
||||
obj/item/clothing/accessory/armor/helmcover
|
||||
name = "helmet cover"
|
||||
desc = "A fabric cover for armored helmets."
|
||||
icon_override = 'icons/mob/ties.dmi'
|
||||
icon = 'icons/obj/clothing/modular_armor.dmi'
|
||||
icon_state = "helmcover_blue"
|
||||
slot = ACCESSORY_SLOT_HELM_C
|
||||
|
||||
/obj/item/clothing/accessory/armor/helmcover/blue
|
||||
name = "blue helmet cover"
|
||||
desc = "A fabric cover for armored helmets in a bright blue color."
|
||||
icon_state = "helmcover_blue"
|
||||
|
||||
/obj/item/clothing/accessory/armor/helmcover/navy
|
||||
name = "navy blue helmet cover"
|
||||
desc = "A fabric cover for armored helmets. This one is colored navy blue."
|
||||
icon_state = "helmcover_navy"
|
||||
|
||||
/obj/item/clothing/accessory/armor/helmcover/green
|
||||
name = "green helmet cover"
|
||||
desc = "A fabric cover for armored helmets. This one has a woodland camouflage pattern."
|
||||
icon_state = "helmcover_green"
|
||||
|
||||
/obj/item/clothing/accessory/armor/helmcover/tan
|
||||
name = "tan helmet cover"
|
||||
desc = "A fabric cover for armored helmets. This one has a desert camouflage pattern."
|
||||
icon_state = "helmcover_tan"
|
||||
|
||||
/obj/item/clothing/accessory/armor/helmcover/nt
|
||||
name = "\improper NanoTrasen helmet cover"
|
||||
desc = "A fabric cover for armored helmets. This one has NanoTrasen's colors."
|
||||
icon_state = "helmcover_nt"
|
||||
|
||||
/obj/item/clothing/accessory/armor/helmcover/pcrc
|
||||
name = "\improper PCRC helmet cover"
|
||||
desc = "A fabric cover for armored helmets. This one is colored navy blue and has a tag in the back with the words PROXIMA CENTAURI RISK CONTROL printed in cyan lettering on it."
|
||||
icon_state = "helmcover_pcrc"
|
||||
|
||||
/obj/item/clothing/accessory/armor/helmcover/saare
|
||||
name = "\improper SAARE helmet cover"
|
||||
desc = "A fabric cover for armored helmets. This one has SAARE's colors."
|
||||
icon_state = "helmcover_saare"
|
||||
@@ -41,6 +41,23 @@
|
||||
user.do_attack_animation(M)
|
||||
user.setClickCooldown(DEFAULT_QUICK_COOLDOWN) //to prevent spam
|
||||
|
||||
// Sheriff Badge (toy)
|
||||
/obj/item/clothing/accessory/badge/sheriff
|
||||
name = "sheriff badge"
|
||||
desc = "This town ain't big enough for the two of us, pardner."
|
||||
icon_state = "sheriff"
|
||||
item_state = "goldbadge"
|
||||
|
||||
/obj/item/clothing/accessory/badge/sheriff/attack_self(mob/user as mob)
|
||||
user.visible_message("[user] shows their sheriff badge. There's a new sheriff in town!",\
|
||||
"You flash the sheriff badge to everyone around you!")
|
||||
|
||||
/obj/item/clothing/accessory/badge/sheriff/attack(mob/living/carbon/human/M, mob/living/user)
|
||||
if(isliving(user))
|
||||
user.visible_message("<span class='danger'>[user] invades [M]'s personal space, the sheriff badge into their face!.</span>","<span class='danger'>You invade [M]'s personal space, thrusting the sheriff badge into their face insistently.</span>")
|
||||
user.do_attack_animation(M)
|
||||
user.setClickCooldown(DEFAULT_QUICK_COOLDOWN) //to prevent spam
|
||||
|
||||
//.Holobadges.
|
||||
/obj/item/clothing/accessory/badge/holo
|
||||
name = "holobadge"
|
||||
@@ -129,4 +146,4 @@
|
||||
new /obj/item/clothing/accessory/badge/holo/hos(src)
|
||||
new /obj/item/clothing/accessory/badge/holo/cord(src)
|
||||
..()
|
||||
return
|
||||
return
|
||||
|
||||
@@ -34,6 +34,10 @@
|
||||
name = "bar shotgun permit"
|
||||
desc = "A card indicating that the owner is allowed to carry a shotgun in the bar."
|
||||
|
||||
/obj/item/clothing/accessory/permit/gun/planetside
|
||||
name = "planetside gun permit"
|
||||
desc = "A card indicating that the owner is allowed to carry a firearm while on the surface."
|
||||
|
||||
/obj/item/clothing/accessory/permit/drone
|
||||
name = "drone identification card"
|
||||
desc = "A card issued by the EIO, indicating that the owner is a Drone Intelligence. Drones are mandated to carry this card within SolGov space, by law."
|
||||
|
||||
@@ -394,6 +394,16 @@
|
||||
desc = "A red dress that sweeps to the side."
|
||||
icon_state = "red_swept_dress"
|
||||
|
||||
/obj/item/clothing/under/dress/flamenco
|
||||
name = "flamenco dress"
|
||||
desc = "A Mexican flamenco dress."
|
||||
icon_state = "flamenco"
|
||||
|
||||
/obj/item/clothing/under/dress/westernbustle
|
||||
name = "western bustle"
|
||||
desc = "A western bustle dress from Earth's late 1800's."
|
||||
icon_state = "westernbustle"
|
||||
|
||||
/*
|
||||
* wedding stuff
|
||||
*/
|
||||
@@ -816,4 +826,30 @@
|
||||
/obj/item/clothing/under/explorer
|
||||
desc = "A green uniform for operating in hazardous environments."
|
||||
name = "explorer's jumpsuit"
|
||||
icon_state = "explorer"
|
||||
icon_state = "explorer"
|
||||
|
||||
/obj/item/clothing/under/cohesion
|
||||
name = "black cohesion suit"
|
||||
desc = "A plain black cohesion suit intended to assist Prometheans in maintaining their form and prevent direct skin exposure."
|
||||
icon_state = "cohesionsuit"
|
||||
rolled_sleeves = -1 // defeats the purpose!!!
|
||||
|
||||
/obj/item/clothing/under/cohesion/striped
|
||||
name = "red striped cohesion suit"
|
||||
desc = "A black cohesion suit with red stripes intended to assist Prometheans in maintaining their form and prevent direct skin exposure."
|
||||
icon_state = "cohesionsuit_striped"
|
||||
|
||||
/obj/item/clothing/under/cohesion/decal
|
||||
name = "purple decaled cohesion suit"
|
||||
desc = "A white cohesion suit with purple decals intended to assist Prometheans in maintaining their form and prevent direct skin exposure."
|
||||
icon_state = "cohesionsuit_decal"
|
||||
|
||||
/obj/item/clothing/under/cohesion/pattern
|
||||
name = "blue patterned cohesion suit"
|
||||
desc = "A white cohesion suit with blue patterns intended to assist Prometheans in maintaining their form and prevent direct skin exposure."
|
||||
icon_state = "cohesionsuit_pattern"
|
||||
|
||||
/obj/item/clothing/under/cohesion/hazard
|
||||
name = "hazard cohesion suit"
|
||||
desc = "An orange cohesion suit with yellow hazard stripes intended to assist Prometheans in maintaining their form and prevent direct skin exposure."
|
||||
icon_state = "cohesionsuit_hazard"
|
||||
@@ -1,7 +1,7 @@
|
||||
/obj/item/clothing/under/seromi
|
||||
icon = 'icons/obj/clothing/species/seromi/uniform.dmi'
|
||||
icon_state = "seromi_grey"
|
||||
species_restricted = list("Teshari")
|
||||
species_restricted = list(SPECIES_TESHARI)
|
||||
|
||||
/obj/item/clothing/under/seromi/smock
|
||||
name = "small grey smock"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/obj/item/clothing/under/vox
|
||||
has_sensor = 0
|
||||
species_restricted = list("Vox")
|
||||
species_restricted = list(SPECIES_VOX)
|
||||
valid_accessory_slots = list("vox")
|
||||
restricted_accessory_slots = list("vox")
|
||||
phoronproof = 1
|
||||
|
||||
@@ -145,7 +145,7 @@ proc/spawn_money(var/sum, spawnloc, mob/living/carbon/human/human_user as mob)
|
||||
return
|
||||
|
||||
/obj/item/weapon/spacecash/ewallet
|
||||
name = "Charge card"
|
||||
name = "charge card"
|
||||
icon_state = "efundcard"
|
||||
desc = "A card that holds an amount of money."
|
||||
var/owner_name = "" //So the ATM can set it so the EFTPOS can put a valid name on transactions.
|
||||
|
||||
@@ -92,6 +92,7 @@ var/global/economy_init = 0
|
||||
|
||||
news_network.CreateFeedChannel("The [using_map.starsys_name] Times", "[using_map.starsys_name] Times ExoNode - [using_map.station_short]", 1, 1)
|
||||
news_network.CreateFeedChannel("The Gibson Gazette", "Editor Mike Hammers", 1, 1)
|
||||
news_network.CreateFeedChannel("Oculum Content Aggregator", "Oculus v6rev7", 1, 1)
|
||||
|
||||
for(var/loc_type in typesof(/datum/trade_destination) - /datum/trade_destination)
|
||||
var/datum/trade_destination/D = new loc_type
|
||||
|
||||
@@ -0,0 +1,110 @@
|
||||
/datum/event/lore_news
|
||||
endWhen = 10
|
||||
|
||||
/datum/event/lore_news/announce()
|
||||
var/author = "Oculus v6rev7"
|
||||
var/channel = "Oculum Content Aggregator"
|
||||
|
||||
|
||||
//locations by region for later pick()
|
||||
//probably would be good to move these to a global somehwere but fuck if I know how to do that
|
||||
var/list/rim = list("Shelf", "Vounna", "Relan", "Whythe", "Angessa's Pearl") // this is also the Association list for most purposes
|
||||
var/list/crescent = list("Saint Columbia", "Ganesha", "Gavel", "Oasis", "Kess-Gendar") //Vir not included
|
||||
var/list/core = list("Sol", "Alpha Centauri", "Tau Ceti", "Altair")
|
||||
var/list/heights = list("New Ohio", "Mahi-Mahi", "Parvati", "Sidhe", "New Seoul")
|
||||
var/list/bowl = list("Zhu Que", "New Singapore", "Isavau's Gamble", "Love", "Viola", "Stove")
|
||||
var/list/crypt = list("El", "Jahan's Post", "Abel's Rest", "Raphael", "Thoth", "Terminus")
|
||||
var/list/weird = list("Silk", "Nyx") //no region
|
||||
|
||||
//by government
|
||||
var/list/solgov = crescent + core + heights + bowl + crypt + weird
|
||||
var/list/skrell = list("Qerr'Vallis", "Qerma-Lakirr", "Harrqak", "Kauq'xum")
|
||||
var/list/skrellfar = list("The Far Kingdom of Light and Shifting Shadow")// more colonies Elgeon
|
||||
var/list/unathi = list("Moghes", "Qerrna-Qamxea", "Abel's Rest") // more colonies Anewbe
|
||||
var/list/tajara = list("Rarkajar", "Mesomori", "Arathiir")
|
||||
var/list/independent = list("New Kyoto", "Casini's Reach", "Ue'Orsi", "Natuna", "Neon Light")
|
||||
|
||||
//this is what you should pick for most applications
|
||||
//whether or not the rim goes there is something that should be changed per the metaplot
|
||||
var/list/loc = solgov + skrell + tajara
|
||||
|
||||
//this includes systems Sol doesn't really have eyes on
|
||||
var/list/allloc = loc + unathi + skrellfar + independent + rim
|
||||
|
||||
//copied right from organizations.dm
|
||||
var/list/ship_names = list(
|
||||
"Kestrel",
|
||||
"Beacon",
|
||||
"Signal",
|
||||
"Freedom",
|
||||
"Glory",
|
||||
"Axiom",
|
||||
"Eternal",
|
||||
"Harmony",
|
||||
"Light",
|
||||
"Discovery",
|
||||
"Endeavor",
|
||||
"Explorer",
|
||||
"Swift",
|
||||
"Dragonfly",
|
||||
"Ascendant",
|
||||
"Tenacious",
|
||||
"Pioneer",
|
||||
"Hawk",
|
||||
"Haste",
|
||||
"Radiant",
|
||||
"Luminous"
|
||||
)
|
||||
|
||||
//generated based on Cerebulon's thing on the wiki
|
||||
var/list/prefixes = list("IAV","ICV","IDV","IDV","IEV","IFV","IIV","ILV","IMV","IRV","ISV","ITV","SCG-A","SCG-C","SCG-D","SCG-D","SCG-E","SCG-F","SCG-I","SCG-L","SCG-M","SCG-R","SCG-S","SCG-T","BAV","BCV","BDV","BDV","BEV","BFV","BIV","BLV","BMV","BRV","BSV","BTV","HAV","HCV","HDV","HDV","HEV","HFV","HIV","HLV","HMV","HRV","HSV","HTV","MAV","MCV","MDV","MDV","MEV","MFV","MIV","MLV","MMV","MRV","MSV","MTV","NAV","NCV","NDV","NDV","NEV","NFV","NIV","NLV","NMV","NRV","NSV","NTV","VAV","VCV","VDV","VDV","VEV","VFV","VIV","VLV","VMV","VRV","VSV","VTV","WAV","WCV","WDV","WDV","WEV","WFV","WIV","WLV","WMV","WRV","WSV","WTV","XAV","XCV","XDV","XDV","XEV","XFV","XIV","XLV","XMV","XRV","XSV","XTV","ZAV","ZCV","ZDV","ZDV","ZEV","ZFV","ZIV","ZLV","ZMV","ZRV","ZSV","ZTV","GAV","GCV","GDV","GDV","GEV","GFV","GIV","GLV","GMV","GRV","GSV","GTV","AAV","ACV","ADV","ADV","AEV","AFV","AIV","ALV","AMV","ARV","ASV","ATV","LAV","LCV","LDV","LDV","LEV","LFV","LIV","LLV","LMV","LRV","LSV","LTV")
|
||||
|
||||
var/datum/trade_destination/affected_dest = pick(weighted_mundaneevent_locations) //shouldn't do anything, not removing it to avoid breaking shit
|
||||
//formatting breaks my fucking eyes
|
||||
var/body = pick("A high-ranking Vey-Med executive was revealed to have been experimenting on biological neural enhancement techniques, believed to be of Skrellian origin, which could lead to the production of transhuman entities with an average cognitive capacity 30% greater than a baseline human.",
|
||||
"[random_name(MALE)], chairman of the controversial Friends of Ned party, is scheduled to speak at a prominant university in [pick(core)] this Monday, according to a statement on his official newsfeed.",
|
||||
"A wing of Ward-Takahashi B-class drones became catatonic this Thursday after tripping late-stage anti-emergence protocols. W-T Chief of Development has declined to comment.",
|
||||
"A brand-new shipment of recreational voidcraft has been deemed \"Unsafe for use\" and seized at [pick(solgov)] customs. Wulf Aeronautics blames error in automated manufactory on [pick(solgov)], assures shareholders of \"One time incident\" after shares drop 4%.",
|
||||
"Activity in a mostly automated Xion work-site in [pick(solgov)] has been suspended indefinitely, after reports of atypical drone behavior. The EIO's assigned investigator commented on the shutdown, saying \"We'll get them up and running again as soon as we're sure it's safe.\" No comment so far on an estimated time or date of reopening.",
|
||||
"The EIO has officially raised the Emergence Threat Level in [pick(solgov)] to Blue. Citizens are reminded to comply with all EIO Agent requests. Failure to do so will be met with legal action, up to and including imprisonment.",
|
||||
"All SolGov citizens beware, the scourge know as the Vox have increased the frequency of their attacks on isolated and poorly defended SolGov territories in [pick(bowl)]. Citizens have been advised to travel in groups and remain aware of their surroundings at all times.",
|
||||
"The Unathi have recently moved a large amount of material into Abel's Rest, under the premise of building additional power plants. According to our sources, the material is in fact being channeled into domestic terrorist groups on both sides, in an attempt to incite a SolGov response. More news as the story develops.",
|
||||
"Controversial Kishari director [random_name(FEMALE)] announced this Friday a sequel to the 2525 animated series Soldiers of the Yearlong War. Open auditions for supporting cast members have been called.",
|
||||
"Amid concerns that it promotes a pro-transtech agenda, a high-profile screening of the award-winning animated film \"The Inventor's Marvelous Mechanical Maidens\" was canceled today on [pick(pick(core, heights))].",
|
||||
"A radiation leak caused by a power unit rupture at a [pick(solgov)] hazardous materials reclamation plant has left several workers and neighboring residents with acute radiation poisoning. Witnesses report that a basic lifting drone failed to recognize and collided with the misplaced unit.",
|
||||
"Xenophobic fringe group Humanity First has claimed credit for a bombing at a local government office on [pick(solgov)] which left three seriously injured. Police report that they have two suspects in custody, but details remain sparse.",
|
||||
"Government official [random_name(MALE)] reports that the crew of the [pick(prefixes)] [pick(ship_names)], the vessel boarded by Jaguar Gang pirates earlier this week, are \"Safe, unharmed, and happy to be back at work.\" Officials were unable to comment on future security measures at this time.",
|
||||
"Sanitation Technician [random_name(FEMALE)] says she was trapped in her work bathroom for three days after the locking system went haywire! The furious techie says she wants a \"hefty sum\" from her employers and that she won't be visiting that cubicle again any time soon!",
|
||||
"Experts at a top university have said that almost every position in modern society might be filled by a robot within the next few decades if production continues at its current rate. Workers' Rights groups have expressed alarm at the news, and have called for protections against the \"Tin menace\".",
|
||||
"An alleged cyberattack on Bishop Cybernetics systems reported to have resulted in the theft of customer data including detailed medical and biological records has been dismissed as \"Unfounded scaremongering\" by company executives.",
|
||||
"[pick(crescent)] resident [random_name(FEMALE)] says she was overjoyed when her son told her he was planning to get married, but was appalled to find the bride-to-be was a common household cleaning drone! GR3TA assures us that \"Cleaning is complete.\"",
|
||||
"Striking workers at a manufacturing plant on [pick(bowl)] have returned to work after news spread that plant owners would relocate operations to an automated facility if production did not resume by the end of the month. Factory investor [random_name(FEMALE)] expressed admiration at the \"Decisive action\" taken by the company.",
|
||||
"Police in [pick(core)] report that they have arrested a man in connection with multinationalist fringe group Nation of Mars. Authorities were alerted when the man's ID was flagged by new screening software at the city spaceport as a known sympathizer with the violent terrorist organization.",
|
||||
"The mystery of the [pick(prefixes)] [pick(ship_names)] has come to its end as a member of the vessel's skeleton crew was arrested in connection with Golden Tiger activities on the Skrell border. According to authorities, the ship - declared missing some months ago - was illegally sold to criminal elements on its way to breaking yards at [pick(heights)].",
|
||||
"[random_name(MALE)] comes clean about his decade-long nightmare kept as a slave on Eutopia in a new book to be released later this year. The harried author has fought lawsuits at every turn that claim that his account is \"A work of pure fiction with an obvious leftist agenda.\"",
|
||||
"Gas mask toting Revolutionary Solar People's Party extremists have reportedly attacked police at a rally in [pick(crypt)]. Peace-keeping officers were viscously pelted with objects and several protesters were found to be equipped with bottles containing an \"unknown substance.\"",
|
||||
"Be careful what you say around your personal AI device as you never know who might be listening, say top minds! Cybercrime expert [random_name(FEMALE)] says hackers can easily trick your device to listen in on your conversations, record you in secret, or even steal your identity!",
|
||||
"Thousands of travellers have been stranded at [pick(loc)] spaceport as a major error with the artificial intelligence system purged weeks worth of scheduling and manifest data from the port's mainframe. Major Bill's Transportation is offering stranded passengers 20% off replacement flights.",
|
||||
"An outraged pet owner claims that a cybernetic company in [pick(solgov)] performed \"disturbing\" surgeries on their beloved cat, Pickles. [random_name(PLURAL)], 58 claims that the local cybernetics firm stole the furry friend from the vet's office and \"Replaced his brain with ones and zeroes.\"",
|
||||
"Doctors in [pick(pick(skrell, heights))] were left in awe and horror as a Teshari was hatched with the features of an adult human man! Sources say that the youngster hatched with a full head of hair and could recite six nursery rhymes from memory. Could Skrell genetic experiments be to blame?",
|
||||
"Miners in [pick(bowl)] were dismayed to discover that their boss was actually a C-class drone intelligence! \"I should've known there was something wrong,\" says dumbfounded miner [random_name(MALE)],\"I'd say good morning and he'd just start listing off mineral densities and coordinates. I just thought he loved his job a little too much.\"",
|
||||
"The remains of an early 22nd century voidcraft containing \"Period artifacts, technology and human remains\" has been located on the surface of Luna after centuries of being disregarded as worthless wreck. Historians hope the find will provide insight into daily life under the short-lived Selene Federation.",
|
||||
"The unexpected discovery of the remains of a what was believed to be a previously undiscovered species by workers on [pick("Nisp", "Binma", "Sif", "Kishar", "Abel's Rest", "Merelar")] has now been dismissed. Upon close analysis of the specimen, it was identified as a \"Bear with mange\", apparently dumped there some weeks prior.",
|
||||
"According to a public statement by electronics giant Ward-Takahashi, many artificial intelligence systems - ranging from household appliances to industrial drones and habitat control networks - manufactured before 2550 could be at risk from a new virus dubbed \"Cap-3k\".",
|
||||
"A controversial opera billed as \"The true story of Nos Amis\" has been criticized by law enforcement agencies as \"glorifying\" some of the most infamous gangsters of the 22nd century. The Polish-language \"Z Francji, do Gwiazd\" is to be distributed exclusively in Alpha Centauri for one week only.",
|
||||
"Injury count continues to rise in the aftermath of the Positronic Rights Group Rally in [pick(pick(bowl, core, heights))]. Homemade teargas grenades were launched into the crowd at approximately 3:45 pm on Saturday by an unidentified person. Authorities urge anyone with information to call in, toll-free, at any time.",
|
||||
"Representatives report that investigations continue on a string of fires on [pick("Nisp", "Binma", "Sif", "Kishar", "Abel's Rest", "Merelar")]. While no information has been released to the public, authorities assure the press that they are doing everything in their power to find those responsible.",
|
||||
"En-route to the contentious rim system, a medical aid mission to Natuna was stopped by Ue-Katish pirates masquerading as refugees, who boarded the ship and stripped it of all supplies.",
|
||||
"Lead Singer of Strawberry Idol Revealed As Three Teshari In A Trench Coat-- Newest gimmick or shocking revelation??",
|
||||
"Shocking art critics throughout the system, a recent submission to the [pick(solgov)] Museum of Absurdism's contemporary exhibit was revealed to actually be the nutritional information on the back of a dehydrated cereal product common in Skrell space.",
|
||||
"The celebrated magical kid series \"Petit Yuusha Jossen Temonila\" has announced its newest season at the height of its demicentenial festival. Noted director [random_name(MALE)] has promised to bring a diverse production staff to the venerable series, and has stated a theme of \"the friendships that transcend borders\".",
|
||||
"The Hephaestus Industries board of directors announced this Monday the highest annual profits since the height of the Lizard Riots.",
|
||||
"A radical group of Mercurials were convicted today of violations of Five Points legislature at an extraordinary court on [pick(solgov)]. These convictions come at the heels of a successful sting operation six years in the making, lead by local Head of EIO [random_name(FEMALE)].",
|
||||
"An unnamed official of the shipping TSC Major Bill's Transportation narrowly escaped an attempt on their life by a deranged assassin. The assassin claims to have been driven to this henious act by the corporation's infamous jingle.",
|
||||
"In the aftermath of yesterday's synthphobic rally on [pick(solgov)], three positronic citizens were left irreparably damaged by a hostile mob, who claim that the victims were \"AAs\" attempting to infiltrate the rally.",
|
||||
"EIO spokesperson [random_name(MALE)] stated in a press conference yesterday that the \"Shakespear\" A-class codeline was briefly available for download on the darknet, although they claim to be \"confident that the leak was shut down before any significant portion could be downloaded\". Experts suspect Association involvement.",
|
||||
"[pick("Strives Towards", "Embraces", "Dreams of", "Cultivates", "Advocates", "Exemplifies")] [pick("Strength", "Wisdom", "Independence", "Pragmatism", "Reason", "Development")], a Community Child from Angessa's Pearl, published his memoir today, detailing a shocking level of abuse by caretakers and educators.",
|
||||
"Nova Sixty, Mercurial web personality, claims that the disappearence of the SCG-R Song Shi was a plot by \"extradimensional rockmen\" who intend to sow mistrust between the Association and SolGov. Quote Sixty, \"The Far Kingdoms' attempt to hide the TRUTH only proves that they and their rockman allies are NOT to be trusted.\"",
|
||||
)
|
||||
|
||||
news_network.SubmitArticle(body, author, channel, null, 1)
|
||||
@@ -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_error("\[[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_error("\[[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,9 +95,9 @@ 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_error("\[[time_stamp()]] Runtime in [e.file],[e.line]: [e]")
|
||||
for(var/line in desclines)
|
||||
log_to_dd(line)
|
||||
log_error(line)
|
||||
if(error_cache)
|
||||
error_cache.logError(e, desclines, e_src = e_src)
|
||||
|
||||
|
||||
@@ -139,6 +139,7 @@ var/global/list/severity_to_string = list(EVENT_LEVEL_MUNDANE = "Mundane", EVENT
|
||||
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Shipping Error", /datum/event/shipping_error , 30, list(ASSIGNMENT_ANY = 2), 0),
|
||||
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Space Dust", /datum/event/dust , 60, list(ASSIGNMENT_ENGINEER = 20), 0, 0, 50),
|
||||
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Trivial News", /datum/event/trivial_news, 400),
|
||||
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Lore News", /datum/event/lore_news, 400),
|
||||
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Vermin Infestation",/datum/event/infestation, 100, list(ASSIGNMENT_JANITOR = 100)),
|
||||
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Wallrot", /datum/event/wallrot, 0, list(ASSIGNMENT_ENGINEER = 30, ASSIGNMENT_GARDENER = 50)),
|
||||
)
|
||||
|
||||
@@ -48,6 +48,7 @@ var/list/event_last_fired = list()
|
||||
possibleEvents[/datum/event/economic_event] = 300
|
||||
possibleEvents[/datum/event/trivial_news] = 400
|
||||
possibleEvents[/datum/event/mundane_news] = 300
|
||||
possibleEvents[/datum/event/lore_news] = 300 // up this if the above ones get removed as they damn well should
|
||||
|
||||
possibleEvents[/datum/event/pda_spam] = max(min(25, player_list.len) * 4, 200)
|
||||
possibleEvents[/datum/event/money_lotto] = max(min(5, player_list.len), 50)
|
||||
|
||||
@@ -2,5 +2,5 @@
|
||||
var/datum/supply_order/O = new /datum/supply_order()
|
||||
O.ordernum = supply_controller.ordernum
|
||||
O.object = supply_controller.supply_packs[pick(supply_controller.supply_packs)]
|
||||
O.orderedby = random_name(pick(MALE,FEMALE), species = "Human")
|
||||
O.orderedby = random_name(pick(MALE,FEMALE), species = SPECIES_HUMAN)
|
||||
supply_controller.shoppinglist += O
|
||||
@@ -1,7 +1,7 @@
|
||||
/proc/send2irc(var/channel, var/msg)
|
||||
if (config.use_irc_bot)
|
||||
if (config.use_node_bot)
|
||||
shell("node bridge.js -h \"[config.irc_bot_host]\" -p \"[config.irc_bot_port]\" -c \"[channel]\" -m \"[msg]\"")
|
||||
shell("node bridge.js -h \"[config.irc_bot_host]\" -p \"[config.irc_bot_port]\" -c \"[channel]\" -m \"[escape_shell_arg(msg)]\"")
|
||||
else
|
||||
if (config.irc_bot_host)
|
||||
if(config.irc_bot_export)
|
||||
@@ -16,10 +16,10 @@
|
||||
nudge_lib = "lib/nudge.so"
|
||||
|
||||
spawn(0)
|
||||
call(nudge_lib, "nudge")("[config.comms_password]","[config.irc_bot_host]","[channel]","[msg]")
|
||||
call(nudge_lib, "nudge")("[config.comms_password]","[config.irc_bot_host]","[channel]","[escape_shell_arg(msg)]")
|
||||
else
|
||||
spawn(0)
|
||||
ext_python("ircbot_message.py", "[config.comms_password] [config.irc_bot_host] [channel] [msg]")
|
||||
ext_python("ircbot_message.py", "[config.comms_password] [config.irc_bot_host] [channel] [escape_shell_arg(msg)]")
|
||||
return
|
||||
|
||||
/proc/send2mainirc(var/msg)
|
||||
|
||||
@@ -1,9 +1,27 @@
|
||||
// Ported from /vg/.
|
||||
/proc/escape_shell_arg(var/arg)
|
||||
// RCE prevention
|
||||
// - Encloses arg in single quotes
|
||||
// - Escapes single quotes
|
||||
// Also escapes %, ! on windows
|
||||
if(world.system_type == MS_WINDOWS)
|
||||
arg = replacetext(arg, "^", "^^") // Escape char
|
||||
arg = replacetext(arg, "%", "%%") // %PATH% -> %%PATH%%
|
||||
arg = replacetext(arg, "!", "^!") // !PATH!, delayed variable expansion on Windows
|
||||
arg = replacetext(arg, "\"", "^\"")
|
||||
arg = "\"[arg]\""
|
||||
else
|
||||
arg = replacetext(arg, "\\", "\\\\'") // Escape char
|
||||
arg = replacetext(arg, "'", "\\'") // No breaking out of the single quotes.
|
||||
arg = "'[arg]'"
|
||||
return arg
|
||||
|
||||
/proc/ext_python(var/script, var/args, var/scriptsprefix = 1)
|
||||
if(scriptsprefix) script = "scripts/" + script
|
||||
if(scriptsprefix)
|
||||
script = "scripts/" + script
|
||||
|
||||
if(world.system_type == MS_WINDOWS)
|
||||
script = replacetext(script, "/", "\\")
|
||||
|
||||
var/command = config.python_path + " " + script + " " + args
|
||||
|
||||
return shell(command)
|
||||
return shell(command)
|
||||
@@ -47,7 +47,7 @@ mob/living/carbon/proc/handle_hallucinations()
|
||||
if(!H.r_store) slots_free += ui_storage2
|
||||
if(slots_free.len)
|
||||
halitem.screen_loc = pick(slots_free)
|
||||
halitem.layer = 50
|
||||
halitem.hud_layerise()
|
||||
switch(rand(1,6))
|
||||
if(1) //revolver
|
||||
halitem.icon = 'icons/obj/gun.dmi'
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
"_____ used ____ to create their newest invention, _____!",
|
||||
"Scientists are not allowed to make Gatling _____.",
|
||||
"It's not a party until the ____ arrive.",
|
||||
"No matter how many Tajara you have, _____ is never acceptable.",
|
||||
"No matter how many Tajaran you have, _____ is never acceptable.",
|
||||
"No, the AI's first law is NOT to serve _____.",
|
||||
"The robots are not disposal bins for your _____.",
|
||||
"You can never have too many _____ on shift.",
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
"Being in a cult",
|
||||
"Racially biased lawsets",
|
||||
"An Unathi who WON'T STOP FIGHTING",
|
||||
"Tajara fetishists",
|
||||
"Tajaran fetishists",
|
||||
"Bald thirty-year-olds",
|
||||
"A Chief Engineer who can't setup the engine",
|
||||
"Being sucked out into space",
|
||||
|
||||
@@ -247,7 +247,6 @@
|
||||
var/mob/M = obj.loc
|
||||
if(ismob(M))
|
||||
M.remove_from_mob(obj)
|
||||
M.update_icons_layers() //so their overlays update
|
||||
|
||||
if(!silent)
|
||||
var/obj/oldobj = obj
|
||||
|
||||
@@ -104,10 +104,10 @@
|
||||
base_icon = 'icons/turf/flooring/asteroid.dmi'
|
||||
initial_flooring = null
|
||||
|
||||
/turf/simulated/floor/holofloor/desert/New()
|
||||
..()
|
||||
/turf/simulated/floor/holofloor/desert/initialize()
|
||||
. = ..()
|
||||
if(prob(10))
|
||||
overlays += "asteroid[rand(0,9)]"
|
||||
add_overlay("asteroid[rand(0,9)]")
|
||||
|
||||
/obj/structure/holostool
|
||||
name = "stool"
|
||||
|
||||
@@ -51,7 +51,6 @@
|
||||
density = 0
|
||||
icon = 'icons/obj/hydroponics_growing.dmi'
|
||||
icon_state = "bush4-1"
|
||||
layer = 3
|
||||
pass_flags = PASSTABLE
|
||||
mouse_opacity = 2
|
||||
|
||||
@@ -192,12 +191,12 @@
|
||||
icon_state = "[seed.get_trait(TRAIT_PLANT_ICON)]-[growth]"
|
||||
|
||||
if(growth>2 && growth == max_growth)
|
||||
layer = 5
|
||||
plane = ABOVE_PLANE
|
||||
set_opacity(1)
|
||||
if(!isnull(seed.chems["woodpulp"]))
|
||||
density = 1
|
||||
else
|
||||
layer = 3
|
||||
reset_plane_and_layer()
|
||||
density = 0
|
||||
|
||||
/obj/effect/plant/proc/calc_dir()
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
simulated = 0
|
||||
anchored = 1
|
||||
icon = LIGHTING_ICON
|
||||
layer = LIGHTING_LAYER
|
||||
plane = PLANE_LIGHTING
|
||||
//invisibility = INVISIBILITY_LIGHTING
|
||||
color = LIGHTING_BASE_MATRIX
|
||||
|
||||
@@ -48,8 +48,8 @@
|
||||
|
||||
/datum/lore/codex/page/tajaran
|
||||
name = "Tajaran"
|
||||
keywords = list("Tajara")
|
||||
data = "The Tajara are a race of humanoid mammalian aliens from Meralar, the fourth planet of the Rarkajar star system. Thickly furred and protected \
|
||||
keywords = list("Tajaran")
|
||||
data = "The Tajaran are a race of humanoid mammalian aliens from Meralar, the fourth planet of the Rarkajar star system. Thickly furred and protected \
|
||||
from cold, they thrive on their subarctic planet, where the only terran temperate areas spread across the equator and tropical belt. \
|
||||
With their own share of bloody wars and great technological advances, the Tajaran are a proud kind. They fiercely believe they belong \
|
||||
among the stars and consider themselves a rightful interstellar nation, even if the humans helped them to actually achieve superluminal \
|
||||
|
||||
@@ -4,9 +4,13 @@
|
||||
region. Each is labled by date of publication and title. This list is self-updating, and from time to time the publisher will push new \
|
||||
articles. You are encouraged to check back frequently."
|
||||
children = list(
|
||||
/datum/lore/codex/page/article1,
|
||||
/datum/lore/codex/page/article2,
|
||||
/datum/lore/codex/page/article7,
|
||||
/datum/lore/codex/page/article6,
|
||||
/datum/lore/codex/page/article5,
|
||||
/datum/lore/codex/page/article4,
|
||||
/datum/lore/codex/page/article3,
|
||||
/datum/lore/codex/page/article2,
|
||||
/datum/lore/codex/page/article1,
|
||||
/datum/lore/codex/page/about_news,
|
||||
)
|
||||
|
||||
@@ -18,7 +22,7 @@
|
||||
information, feel free to visit our homepage at oc.about.tsc, or the sites of any of our constituents."
|
||||
|
||||
/datum/lore/codex/page/article1
|
||||
name = "08/30/61-- VGA Legalizes Prometheans; Nanotrasen Begins Manufacture and Testing"
|
||||
name = "08/30/61 - VGA Legalizes Prometheans; Nanotrasen Begins Manufacture and Testing"
|
||||
data = "Today's meeting of the Vir Bicameral led to the passing of the Wynther-Helsey Bill, an implementation of the legal framework \
|
||||
used in Aetolus to handle the production and cultivation of the Macrolimbus species dubbed \"Prometheans\". These ill-researched organisms \
|
||||
possess cognitive abilities easily equaling those of A-class drones, but so far have not been included under the EIO's list of dangerous \
|
||||
@@ -36,7 +40,7 @@
|
||||
follow-up poll indicates that an appreciable number of Sivians do not support the framework's current implementation."
|
||||
|
||||
/datum/lore/codex/page/article2
|
||||
name = "2/3/62-- Corporate Coup on Aetolus"
|
||||
name = "2/3/62 - Corporate Coup on Aetolus"
|
||||
data = "A recent incident aboard the NRS Prometheus issued in a major change in the leadership of the Promethean homeworld. During \
|
||||
a late-night meeting of the Nanotrasen Board of Trustees, several high-ranking personnel, including Head of Research Naomi Harper,\
|
||||
announced their intention to assume direct control of Nanotrasen facilities in the system. It is known that several dissenting \
|
||||
@@ -49,9 +53,44 @@
|
||||
not responded to. Free Traders are recommended to stay clear of the region until the situation resolves itself."
|
||||
|
||||
/datum/lore/codex/page/article3
|
||||
name = "2/10/62-- Aetolian Partisans Declare Independence"
|
||||
name = "2/10/62 - Aetolian Partisans Declare Independence"
|
||||
data = "Breaking their week-long silence, the leaders of the Aetolian Coup, and their spokesperson and presumed leader Naomi Harper issued an address earlier today, delivered to the Oculum Broadcast office on Pearl by drone courier. Quote Dr. Harper: \"Our previous silence was a necessity, while we consolidated our forces and dealt with corporatists both internally and in Vounna's former Grayson outposts.\". In Harper's hour-long address, she berates the failure of SolGov to provide adequate protections for Prometheans. \"We will not let the Promethean be another positronic brain; they will not labor under a century of slavery, deprived of a state to call their own. The Luddites of the Friends and of the Icarus Front will not be permitted to decide the fate of a nascent race before it begins.\"\
|
||||
<br><br>\
|
||||
Harper proceeded to unilaterally declare Vounna's independence from SolGov, claiming sovereignty over the system as the first Chairperson of the \"Aetolian Council\". Speaker of the Shadow Coalition ISA-5 has urged their government to treat the developing situation with caution but decried Harper's rhetoric, stating in a press release, \"While I know well the injustices visited on myself and my people by misguided forbearers, it is important to treat any emerging technology with respect. Current policies regarding the Prometheans are designed to limit risk during sociological trials on Aetolus and beyond. As for myself, I doubt the sincerity of this human who claims to speak for the Prometheans, when the Prometheans are perfectly equipped to speak for themselves.\"\
|
||||
<br><br>\
|
||||
NanoTrasen is expected to redouble their Promethean research programs in the Vir system until stability is restored to Vounna."
|
||||
|
||||
/datum/lore/codex/page/article4
|
||||
name = "2/14/62 - SCG Denounces Aetolian Coup; Mobilizes Fleet"
|
||||
data = "Dismissing claims of inaction, a spokesperson for the Solar Confederate Government today confirmed that the Colonial Assembly has voted overwhelmingly in favor of swift military action in response to the coup on Aetolus earlier this month. Icarus Front Chairperson Mackenzie West was quick to make a damning official statement: \"Dr. Harper and her radical agitators cannot be excused for their violent, despicable attempts to destabilize the flourishing economy of the Almach Rim. The ruthless murder of innocents, and illegal seizure of private property are crimes that cannot merely be met with strong words and gentle slaps to the wrist\"...\"I am proud to announce that two units of brave Solar marines have been assigned to the SCG-R Song Shi rapid response cruiser, with the full backing of the Icarus Front - and I hope with my heart, the backing of all patriotic Solar citizens.\"\
|
||||
<br><br>\
|
||||
The decision faced resistance from more laissez faire Assembly member states, including prominent SEO governor Bruno Ofako, delaying an earlier consensus. Supporters of the action hope that this decisive display of military strength will encourage the rebels to stand down without further bloodshed, and submit to prosecution by the Lunar High Courts.\
|
||||
<br><br>\
|
||||
The Icarus Front has also proposed a temporary ban on continued Promethean research, though this motion has yet to gain any traction."
|
||||
|
||||
/datum/lore/codex/page/article5
|
||||
name = "2/23/62 - \"Almach Association\" Shocks Nation"
|
||||
data = "Shocking the nation, in the wee hours UTC a number of governments in the Almach Rim announced their intent to secede from the Confederacy as a unified political organization they refer to as the Almach Association, joining the already-declared Aetolian Council. Among the half-dozen affected systems is Angessa's Pearl, through which the Song Shi was passing en route to Aetolus. The Association has already issued a political manifesto and a foundational charter, leading political scientists across the galaxy to suspect back-doors collusion and possible Shelfican interference, a hypothesis made more likely by Morpheus Cyberkinetics' exonet site voicing support for the Association. Others suspect a moment of political crystallization, not unlike that in the Golden Hour three centuries ago. These researchers are already referring to this morning's events as the Gray Hour.\
|
||||
<br><br>\
|
||||
The Association's official manifesto repudiates the Five Points, calling them \"an archaic and distinctly human invention\". Experts agree that this bold declaration puts the Movement more in line with the Golden Hour than with the Age of Secession, and many fear that nothing short of a miracle like the discovery of the positronics will spare humanity from a bloody civil war.\
|
||||
<br><br>\
|
||||
While the Association currently lists only a handful of Almach Rim systems as \"Constituent Organizations\", it has named Shelf, the Free Relan Federation, and the Eutopian Foreign Relations Board as \"observers\". The implications of this status are yet to be identified.\
|
||||
<br><br>\
|
||||
The fate of the SCG-R Song Shi and her crew remain unknown."
|
||||
|
||||
/datum/lore/codex/page/article6
|
||||
name = "3/03/62 - A Week Out From Almach: What are the facts?"
|
||||
data = "* Several organizations in the Almach Rim, including Angessa's Pearl, the Aetolian Council, the Interstellar Workers of Wythe, the Republic of Whitney, and members of several prominent families in the Neon Light unilaterally declared secession from SCG. <br><br>*This secession was first called the Grey Hour by political scientists in New Florence, a term popularized by reporter Elspor Fong. <br><br>* Shelf, the FRF, and the EFRB were declared \"observers\" in the Almach Association charter. <br><br>* None of these organizations have issued a statement on the matter.<br><br>* The SCG-R Song Shi was stranded in the region during the secession.<br><br>* SolGov has not issued an official statement of the fate of the Song Shi.<br><br>* Several confederate agencies, including Emergent Intelligence Oversight, the Trade and Customs Bureau, and SCG Fleet Intelligence have declared a \"state of emergency\".<br><br>* SolGov itself has NOT declared a state of emergency.<br><br>* Legitimate communications in and out of the Almach Rim are restricted to audited text messages for the period.<br><br>* Several illegitimate communication links exist and are believed by Fleet Intelligence to be currently hosting the official sites for Morpheus Cyberkinetics and for the Association itself.<br><br>* Icarus Front chairperson Mackenzie West has proposed a moratorium on the creation of new Prometheans for the duration of the crisis.<br><br>* Local laws on the subject will apply until the Assembly meets late in May. <br><br>* No confederate lawmaker has proposed action against Relani, Shelfican, or newly Almachi nationals living within stable regions.<br><br>* The border remains tightly closed to migrants, media, and diplomats alike."
|
||||
|
||||
/datum/lore/codex/page/article7
|
||||
name = "3/21/62 - Relan, Shelf Join the Almach Association"
|
||||
data = "Recent reports from within the Association indicate that the Free Relan Federation and Shelf have officially decided to join the Almach Association. President Nia Fischer of the FRF had this to say on the matter, in a speech addressed to the population at large. \
|
||||
<br><br>\
|
||||
\
|
||||
\"Our decision to join the Association may, at first, seem strange. It is true that we have much to gain from trade with the Solars, and that the radical transhumanism of Angessa's Pearl is not our way. But I will remind you that it was Shelf, not Sol, who ensured our prosperity just over two decades ago-- who safeguarded our independence and prevented us from falling to barbarism and dictatorship. We owe it, not just to Shelf but to all the members of the Almach Rim, to support their independence just the same. And that, my fellow Relanians, is the crux of it all. The Association is a revolution, at the heart of it all, and many of the now-independent states were owned near-outright by Trans-Stellar Corporations until the Association allowed them to shake out their fetters. What right do we have to sit by while just a dozen light-years coreward newly-born republics suffer the growing pains of independence? What right do we have to bask in our own stability when our neighbors, our comrades in ideology, are struggling with a cruel blockade proposed by politicians back on Earth and Luna? That is why we must join with them, guard them, and guide them, for as long as need be.\"\
|
||||
<br><br>\
|
||||
\
|
||||
A Shelfican spokesperson, meanwhile, had only this to say:\
|
||||
<br><br>\
|
||||
\"We're probably going to regret this but, y'know, the whole thing is kind of our fault. Sure, whatever.\""
|
||||
|
||||
|
||||
@@ -13,6 +13,7 @@ var/list/global/map_templates = list()
|
||||
/datum/map_template
|
||||
var/name = "Default Template Name"
|
||||
var/desc = "Some text should go here. Maybe."
|
||||
var/template_group = null // If this is set, no more than one template in the same group will be spawned, per submap seeding.
|
||||
var/width = 0
|
||||
var/height = 0
|
||||
var/mappath = null
|
||||
@@ -67,7 +68,7 @@ var/list/global/map_templates = list()
|
||||
|
||||
admin_notice("<span class='danger'>Initializing newly created atom(s) in submap.</span>", R_DEBUG)
|
||||
SSatoms.InitializeAtoms(atoms)
|
||||
|
||||
|
||||
admin_notice("<span class='danger'>Initializing atmos pipenets and machinery in submap.</span>", R_DEBUG)
|
||||
SSmachines.setup_atmos_machinery(atmos_machines)
|
||||
|
||||
@@ -189,6 +190,7 @@ var/list/global/map_templates = list()
|
||||
CHECK_TICK
|
||||
|
||||
var/list/loaded_submap_names = list()
|
||||
var/list/template_groups_used = list() // Used to avoid spawning three seperate versions of the same PoI.
|
||||
|
||||
// Now lets start choosing some.
|
||||
while(budget > 0 && overall_sanity > 0)
|
||||
@@ -209,6 +211,14 @@ var/list/global/map_templates = list()
|
||||
|
||||
// Can we afford it?
|
||||
if(chosen_template.cost > budget)
|
||||
priority_submaps -= chosen_template
|
||||
potential_submaps -= chosen_template
|
||||
continue
|
||||
|
||||
// Did we already place down a very similar submap?
|
||||
if(chosen_template.template_group && chosen_template.template_group in template_groups_used)
|
||||
priority_submaps -= chosen_template
|
||||
potential_submaps -= chosen_template
|
||||
continue
|
||||
|
||||
// If so, try to place it.
|
||||
@@ -241,14 +251,21 @@ var/list/global/map_templates = list()
|
||||
|
||||
CHECK_TICK
|
||||
|
||||
// For pretty maploading statistics.
|
||||
if(loaded_submap_names[chosen_template.name])
|
||||
loaded_submap_names[chosen_template.name] += 1
|
||||
else
|
||||
loaded_submap_names[chosen_template.name] = 1
|
||||
|
||||
// To avoid two 'related' similar submaps existing at the same time.
|
||||
if(chosen_template.template_group)
|
||||
template_groups_used += chosen_template.template_group
|
||||
|
||||
// To deduct the cost.
|
||||
if(chosen_template.cost >= 0)
|
||||
budget -= chosen_template.cost
|
||||
|
||||
// Remove the submap from our options.
|
||||
if(chosen_template in priority_submaps) // Always remove priority submaps.
|
||||
priority_submaps -= chosen_template
|
||||
else if(!chosen_template.allow_duplicates)
|
||||
|
||||
@@ -96,7 +96,7 @@ var/global/use_preloader = FALSE
|
||||
var/zcrd = text2num(dmmRegex.group[5]) + z_offset - 1
|
||||
|
||||
var/zexpansion = zcrd > world.maxz
|
||||
if(zexpansion)
|
||||
if(zexpansion && !measureOnly)
|
||||
if(cropMap)
|
||||
continue
|
||||
else
|
||||
@@ -385,6 +385,8 @@ var/global/use_preloader = FALSE
|
||||
/dmm_suite/proc/readlist(text as text, delimiter=",", keys_only_string = FALSE)
|
||||
|
||||
var/list/to_return = list()
|
||||
if(text == "")
|
||||
return to_return // Fast bail-out
|
||||
|
||||
var/position
|
||||
var/old_position = 1
|
||||
|
||||
@@ -68,6 +68,18 @@
|
||||
name = "stack of wood"
|
||||
type_to_spawn = /obj/item/stack/material/wood
|
||||
|
||||
/obj/fiftyspawner/sifwood
|
||||
name = "stack of alien wood"
|
||||
type_to_spawn = /obj/item/stack/material/wood/sif
|
||||
|
||||
/obj/fiftyspawner/log
|
||||
name = "stack of logs"
|
||||
type_to_spawn = /obj/item/stack/material/log
|
||||
|
||||
/obj/fiftyspawner/log
|
||||
name = "stack of alien logs"
|
||||
type_to_spawn = /obj/item/stack/material/log/sif
|
||||
|
||||
/obj/fiftyspawner/cloth
|
||||
name = "stack of cloth"
|
||||
type_to_spawn = /obj/item/stack/material/cloth
|
||||
|
||||
@@ -182,4 +182,10 @@
|
||||
recipes += new/datum/stack_recipe("[display_name] bed", /obj/structure/bed, 2, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("[display_name] double bed", /obj/structure/bed/double, 4, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("[display_name] wall girders", /obj/structure/girder, 2, time = 50, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("[display_name] ashtray", /obj/item/weapon/material/ashtray, 2, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("[display_name] ashtray", /obj/item/weapon/material/ashtray, 2, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
|
||||
|
||||
/material/wood/sif/generate_recipes()
|
||||
..()
|
||||
recipes += new/datum/stack_recipe("alien wood floor tile", /obj/item/stack/tile/wood/sif, 1, 4, 20)
|
||||
recipes -= new/datum/stack_recipe("wood floor tile", /obj/item/stack/tile/wood, 1, 4, 20)
|
||||
recipes -= new/datum/stack_recipe("wooden chair", /obj/structure/bed/chair/wood, 3, time = 10, one_per_turf = 1, on_floor = 1)
|
||||
|
||||
@@ -667,6 +667,12 @@ var/list/name_to_material
|
||||
icon_base = "dungeon"
|
||||
icon_colour = "#FFFFFF"
|
||||
|
||||
/material/alienalloy/bedrock
|
||||
name = "bedrock"
|
||||
display_name = "impassable rock"
|
||||
icon_base = "rock"
|
||||
icon_colour = "#FFFFFF"
|
||||
|
||||
/material/alienalloy/alium
|
||||
name = "alium"
|
||||
display_name = "alien"
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
var/supported = 0
|
||||
var/active = 0
|
||||
var/list/resource_field = list()
|
||||
var/obj/item/device/radio/intercom/faultreporter = new /obj/item/device/radio/intercom{channels=list("Supply")}(null)
|
||||
|
||||
var/ore_types = list(
|
||||
"hematite" = /obj/item/weapon/ore/iron,
|
||||
@@ -60,7 +61,7 @@
|
||||
if(!active) return
|
||||
|
||||
if(!anchored || !use_cell_power())
|
||||
system_error("system configuration or charge error")
|
||||
system_error("System configuration or charge error.")
|
||||
return
|
||||
|
||||
if(need_update_field)
|
||||
@@ -85,7 +86,10 @@
|
||||
harvesting.has_resources = 0
|
||||
harvesting.resources = null
|
||||
resource_field -= harvesting
|
||||
harvesting = pick(resource_field)
|
||||
if(resource_field.len) // runtime protection
|
||||
harvesting = pick(resource_field)
|
||||
else
|
||||
harvesting = null
|
||||
|
||||
if(!harvesting) return
|
||||
|
||||
@@ -95,7 +99,7 @@
|
||||
for(var/metal in ore_types)
|
||||
|
||||
if(contents.len >= capacity)
|
||||
system_error("insufficient storage space")
|
||||
system_error("Insufficient storage space.")
|
||||
active = 0
|
||||
need_player_check = 1
|
||||
update_icon()
|
||||
@@ -131,12 +135,19 @@
|
||||
active = 0
|
||||
need_player_check = 1
|
||||
update_icon()
|
||||
system_error("Resources depleted.")
|
||||
|
||||
/obj/machinery/mining/drill/attack_ai(var/mob/user as mob)
|
||||
return src.attack_hand(user)
|
||||
|
||||
/obj/machinery/mining/drill/attackby(obj/item/O as obj, mob/user as mob)
|
||||
if(!active)
|
||||
if(istype(O, /obj/item/device/multitool))
|
||||
var/newtag = text2num(sanitizeSafe(input(user, "Enter new ID number or leave empty to cancel.", "Assign ID number") as text, 4))
|
||||
if(newtag)
|
||||
name = "[initial(name)] #[newtag]"
|
||||
to_chat(user, "<span class='notice'>You changed the drill ID to: [newtag]</span>")
|
||||
return
|
||||
if(default_deconstruction_screwdriver(user, O))
|
||||
return
|
||||
if(default_deconstruction_crowbar(user, O))
|
||||
@@ -234,6 +245,7 @@
|
||||
|
||||
if(error)
|
||||
src.visible_message("<span class='notice'>\The [src] flashes a '[error]' warning.</span>")
|
||||
faultreporter.autosay(error, src.name, "Supply")
|
||||
need_player_check = 1
|
||||
active = 0
|
||||
update_icon()
|
||||
@@ -257,7 +269,7 @@
|
||||
resource_field += mine_turf
|
||||
|
||||
if(!resource_field.len)
|
||||
system_error("resources depleted")
|
||||
system_error("Resources depleted.")
|
||||
|
||||
/obj/machinery/mining/drill/proc/use_cell_power()
|
||||
if(!cell) return 0
|
||||
|
||||
@@ -59,6 +59,7 @@
|
||||
var/obj/item/stack/material/S = new stacktype (get_turf(machine.output))
|
||||
S.amount = machine.stack_storage[href_list["release_stack"]]
|
||||
machine.stack_storage[href_list["release_stack"]] = 0
|
||||
S.update_icon()
|
||||
|
||||
src.add_fingerprint(usr)
|
||||
src.updateUsrDialog()
|
||||
@@ -128,6 +129,7 @@
|
||||
var/obj/item/stack/material/S = new stacktype (get_turf(output))
|
||||
S.amount = stack_amt
|
||||
stack_storage[sheet] -= stack_amt
|
||||
S.update_icon()
|
||||
|
||||
console.updateUsrDialog()
|
||||
return
|
||||
|
||||
@@ -1,35 +1,3 @@
|
||||
/**********************Miner Lockers**************************/
|
||||
|
||||
/obj/structure/closet/secure_closet/miner
|
||||
name = "miner's equipment"
|
||||
icon_state = "miningsec1"
|
||||
icon_closed = "miningsec"
|
||||
icon_locked = "miningsec1"
|
||||
icon_opened = "miningsecopen"
|
||||
icon_broken = "miningsecbroken"
|
||||
icon_off = "miningsecoff"
|
||||
req_access = list(access_mining)
|
||||
|
||||
/obj/structure/closet/secure_closet/miner/New()
|
||||
..()
|
||||
sleep(2)
|
||||
if(prob(50))
|
||||
new /obj/item/weapon/storage/backpack/industrial(src)
|
||||
else
|
||||
new /obj/item/weapon/storage/backpack/satchel/eng(src)
|
||||
new /obj/item/device/radio/headset/headset_cargo(src)
|
||||
new /obj/item/clothing/under/rank/miner(src)
|
||||
new /obj/item/clothing/gloves/black(src)
|
||||
new /obj/item/clothing/shoes/black(src)
|
||||
new /obj/item/device/analyzer(src)
|
||||
new /obj/item/weapon/storage/bag/ore(src)
|
||||
new /obj/item/device/flashlight/lantern(src)
|
||||
new /obj/item/weapon/shovel(src)
|
||||
new /obj/item/weapon/pickaxe(src)
|
||||
new /obj/item/clothing/glasses/material(src)
|
||||
new /obj/item/clothing/suit/storage/hooded/wintercoat/miner(src)
|
||||
new /obj/item/clothing/shoes/boots/winter/mining(src)
|
||||
|
||||
/******************************Lantern*******************************/
|
||||
|
||||
/obj/item/device/flashlight/lantern
|
||||
|
||||
@@ -5,6 +5,7 @@ var/list/mining_overlay_cache = list()
|
||||
name = "impassable rock"
|
||||
icon = 'icons/turf/walls.dmi'
|
||||
icon_state = "rock-dark"
|
||||
density = 1
|
||||
|
||||
/turf/simulated/mineral //wall piece
|
||||
name = "rock"
|
||||
@@ -242,7 +243,7 @@ var/list/mining_overlay_cache = list()
|
||||
/turf/simulated/mineral/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
|
||||
if (!(istype(usr, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey")
|
||||
usr << "<span class='warning'>You don't have the dexterity to do this!</span>"
|
||||
to_chat(user, "<span class='warning'>You don't have the dexterity to do this!</span>")
|
||||
return
|
||||
|
||||
if(!density)
|
||||
@@ -262,19 +263,19 @@ var/list/mining_overlay_cache = list()
|
||||
|
||||
if(valid_tool)
|
||||
if (sand_dug)
|
||||
user << "<span class='warning'>This area has already been dug.</span>"
|
||||
to_chat(user, "<span class='warning'>This area has already been dug.</span>")
|
||||
return
|
||||
|
||||
var/turf/T = user.loc
|
||||
if (!(istype(T)))
|
||||
return
|
||||
|
||||
user << "<span class='notice'>You start digging.</span>"
|
||||
to_chat(user, "<span class='notice'>You start digging.</span>")
|
||||
playsound(user.loc, 'sound/effects/rustle1.ogg', 50, 1)
|
||||
|
||||
if(!do_after(user,40)) return
|
||||
|
||||
user << "<span class='notice'>You dug a hole.</span>"
|
||||
to_chat(user, "<span class='notice'>You dug a hole.</span>")
|
||||
GetDrilled()
|
||||
|
||||
else if(istype(W,/obj/item/weapon/storage/bag/ore))
|
||||
@@ -297,7 +298,7 @@ var/list/mining_overlay_cache = list()
|
||||
return
|
||||
var/obj/item/stack/rods/R = W
|
||||
if (R.use(1))
|
||||
user << "<span class='notice'>Constructing support lattice ...</span>"
|
||||
to_chat(user, "<span class='notice'>Constructing support lattice ...</span>")
|
||||
playsound(src, 'sound/weapons/Genhit.ogg', 50, 1)
|
||||
new /obj/structure/lattice(get_turf(src))
|
||||
|
||||
@@ -313,7 +314,7 @@ var/list/mining_overlay_cache = list()
|
||||
S.use(1)
|
||||
return
|
||||
else
|
||||
user << "<span class='warning'>The plating is going to need some support.</span>"
|
||||
to_chat(user, "<span class='warning'>The plating is going to need some support.</span>")
|
||||
return
|
||||
|
||||
|
||||
@@ -333,7 +334,17 @@ var/list/mining_overlay_cache = list()
|
||||
var/obj/item/device/measuring_tape/P = W
|
||||
user.visible_message("<span class='notice'>\The [user] extends \a [P] towards \the [src].</span>","<span class='notice'>You extend \the [P] towards \the [src].</span>")
|
||||
if(do_after(user, 15))
|
||||
user << "<span class='notice'>\The [src] has been excavated to a depth of [excavation_level]cm.</span>"
|
||||
to_chat(user, "<span class='notice'>\The [src] has been excavated to a depth of [excavation_level]cm.</span>")
|
||||
return
|
||||
|
||||
if(istype(W, /obj/item/device/xenoarch_multi_tool))
|
||||
var/obj/item/device/xenoarch_multi_tool/C = W
|
||||
if(C.mode) //Mode means scanning
|
||||
C.depth_scanner.scan_atom(user, src)
|
||||
else
|
||||
user.visible_message("<span class='notice'>\The [user] extends \the [C] over \the [src], a flurry of red beams scanning \the [src]'s surface!</span>", "<span class='notice'>You extend \the [C] over \the [src], a flurry of red beams scanning \the [src]'s surface!</span>")
|
||||
if(do_after(user, 15))
|
||||
to_chat(user, "<span class='notice'>\The [src] has been excavated to a depth of [excavation_level]cm.</span>")
|
||||
return
|
||||
|
||||
if (istype(W, /obj/item/weapon/pickaxe))
|
||||
@@ -355,7 +366,7 @@ var/list/mining_overlay_cache = list()
|
||||
if(newDepth > F.excavation_required) // Digging too deep can break the item. At least you won't summon a Balrog (probably)
|
||||
fail_message = ". <b>[pick("There is a crunching noise","[W] collides with some different rock","Part of the rock face crumbles away","Something breaks under [W]")]</b>"
|
||||
|
||||
user << "<span class='notice'>You start [P.drill_verb][fail_message].</span>"
|
||||
to_chat(user, "<span class='notice'>You start [P.drill_verb][fail_message].</span>")
|
||||
|
||||
if(fail_message && prob(90))
|
||||
if(prob(25))
|
||||
@@ -374,7 +385,7 @@ var/list/mining_overlay_cache = list()
|
||||
else if(newDepth > F.excavation_required - F.clearance_range) // Not quite right but you still extract your find, the closer to the bottom the better, but not above 80%
|
||||
excavate_find(prob(80 * (F.excavation_required - newDepth) / F.clearance_range), F)
|
||||
|
||||
user << "<span class='notice'>You finish [P.drill_verb] \the [src].</span>"
|
||||
to_chat(user, "<span class='notice'>You finish [P.drill_verb] \the [src].</span>")
|
||||
|
||||
if(newDepth >= 200) // This means the rock is mined out fully
|
||||
var/obj/structure/boulder/B
|
||||
@@ -479,7 +490,7 @@ var/list/mining_overlay_cache = list()
|
||||
if(prob(50))
|
||||
pain = 1
|
||||
for(var/mob/living/M in range(src, 200))
|
||||
M << "<span class='danger'>[pick("A high-pitched [pick("keening","wailing","whistle")]","A rumbling noise like [pick("thunder","heavy machinery")]")] somehow penetrates your mind before fading away!</span>"
|
||||
to_chat(M, "<span class='danger'>[pick("A high-pitched [pick("keening","wailing","whistle")]","A rumbling noise like [pick("thunder","heavy machinery")]")] somehow penetrates your mind before fading away!</span>")
|
||||
if(pain)
|
||||
flick("pain",M.pain)
|
||||
if(prob(50))
|
||||
@@ -488,7 +499,7 @@ var/list/mining_overlay_cache = list()
|
||||
M.flash_eyes()
|
||||
if(prob(50))
|
||||
M.Stun(5)
|
||||
radiation_repository.flat_radiate(src, 25, 200)
|
||||
radiation_repository.flat_radiate(src, 25, 100)
|
||||
if(prob(25))
|
||||
excavate_find(prob(5), finds[1])
|
||||
else if(rand(1,500) == 1)
|
||||
|
||||
@@ -108,6 +108,7 @@ var/global/list/ore_data = list()
|
||||
/ore/diamond
|
||||
name = "diamond"
|
||||
display_name = "diamond"
|
||||
alloy = 1
|
||||
compresses_to = "diamond"
|
||||
result_amount = 5
|
||||
spread_chance = 10
|
||||
|
||||
@@ -14,12 +14,15 @@
|
||||
if (istype(W, /obj/item/weapon/ore))
|
||||
user.remove_from_mob(W)
|
||||
src.contents += W
|
||||
if (istype(W, /obj/item/weapon/storage))
|
||||
|
||||
else if (istype(W, /obj/item/weapon/storage))
|
||||
var/obj/item/weapon/storage/S = W
|
||||
if(!S.contents.len)
|
||||
return
|
||||
S.hide_from(usr)
|
||||
for(var/obj/item/weapon/ore/O in S.contents)
|
||||
S.remove_from_storage(O, src) //This will move the item to this item's contents
|
||||
user << "<font color='blue'>You empty the satchel into the box.</font>"
|
||||
to_chat(user,"<span class='notice'>You empty the satchel into the box.</span>")
|
||||
|
||||
update_ore_count()
|
||||
|
||||
@@ -62,13 +65,12 @@
|
||||
user << "- [stored_ore[ore]] [ore]"
|
||||
return
|
||||
|
||||
|
||||
/obj/structure/ore_box/verb/empty_box()
|
||||
set name = "Empty Ore Box"
|
||||
set category = "Object"
|
||||
set src in view(1)
|
||||
|
||||
if(!istype(usr, /mob/living/carbon/human)) //Only living, intelligent creatures with hands can empty ore boxes.
|
||||
if(!istype(usr, /mob/living/carbon/human) && !istype(usr, /mob/living/silicon/robot)) //Only living, intelligent creatures with gripping aparatti can empty ore boxes.
|
||||
usr << "<font color='red'>You are physically incapable of emptying the ore box.</font>"
|
||||
return
|
||||
|
||||
|
||||
@@ -61,3 +61,66 @@
|
||||
|
||||
outgoing_melee_damage_percent = 0.5 //50% less outgoing melee damage.
|
||||
attack_speed_percent = 1.2 //20% slower attack speed.
|
||||
|
||||
//////////////////////
|
||||
//Surgical Modifiers// As of writing, limited to the 'Frankenstein' modifier.
|
||||
//////////////////////
|
||||
|
||||
/datum/modifier/franken_sickness
|
||||
name = "surgically attached brain"
|
||||
desc = "You feel weak, as your central nervous system is still recovering from being repaired."
|
||||
|
||||
on_created_text = "<span class='warning'><font size='3'>You feel... off, and your head hurts.</font></span>"
|
||||
on_expired_text = "<span class='notice'><font size='3'>You feel some strength returning to you.</font></span>"
|
||||
|
||||
max_health_percent = 0.9 // -10% max health.
|
||||
incoming_damage_percent = 1.1 // 10% more incoming damage.
|
||||
incoming_hal_damage_percent = 1.5 // 50% more halloss damage, stacking on the previous 1.1 widespread.
|
||||
outgoing_melee_damage_percent = 0.9 // 10% less melee damage.
|
||||
disable_duration_percent = 1.25 // Stuns last 25% longer.
|
||||
incoming_healing_percent = 0.9 // -10% to all healing
|
||||
slowdown = 0.5 // Slower, by a smidge.
|
||||
evasion = -5 // 5% easier to hit.
|
||||
accuracy_dispersion = 1 // Inaccurate trait level of tile dispersion.
|
||||
|
||||
stacks = MODIFIER_STACK_ALLOWED //You have somehow had the surgery done twice. Your brain is very, very fucked, but I won't say no.
|
||||
|
||||
/datum/modifier/franken_sickness/can_apply(var/mob/living/L)
|
||||
if(!ishuman(L))
|
||||
return FALSE
|
||||
if(L.isSynthetic()) //Nonhumans and Machines cannot be Frankensteined, at this time.
|
||||
return FALSE
|
||||
|
||||
return ..()
|
||||
|
||||
/datum/modifier/franken_sickness/tick()
|
||||
if(holder.stat != DEAD)
|
||||
if(istype(holder, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/F = holder
|
||||
if(F.can_defib)
|
||||
F.can_defib = 0
|
||||
|
||||
/datum/modifier/franken_sickness/on_expire() //Not permanent, but its child is.
|
||||
holder.add_modifier(/datum/modifier/franken_recovery, 0)
|
||||
|
||||
/datum/modifier/franken_recovery //When Franken_Sickness expires, this will be permanently applied in its place.
|
||||
name = "neural recovery"
|
||||
desc = "You feel out of touch, as your central nervous system is still recovering from being repaired."
|
||||
|
||||
on_created_text = "<span class='warning'><font size='3'>You feel... off. Everything is fuzzy.</font></span>"
|
||||
on_expired_text = "<span class='notice'><font size='3'>You feel your senses returning to you.</font></span>"
|
||||
|
||||
incoming_hal_damage_percent = 1.5 // 50% more halloss damage.
|
||||
disable_duration_percent = 1.25 // Stuns last 25% longer.
|
||||
evasion = -5 // 5% easier to hit.
|
||||
accuracy_dispersion = 1 // Inaccurate trait level of tile dispersion.
|
||||
|
||||
stacks = MODIFIER_STACK_ALLOWED
|
||||
|
||||
/datum/modifier/franken_recovery/can_apply(var/mob/living/L)
|
||||
if(!ishuman(L))
|
||||
return FALSE
|
||||
if(L.isSynthetic()) //Nonhumans and Machines cannot be Frankensteined, at this time.
|
||||
return FALSE
|
||||
|
||||
return ..()
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user