Merge remote-tracking branch 'origin/master' into TGUI-CHAT-TGUI-CHAT-TGUI-CHAT
This commit is contained in:
@@ -171,7 +171,11 @@ GLOBAL_LIST_INIT(admin_verbs_debug, world.AVerbsDebug())
|
||||
/client/proc/cmd_display_overlay_log,
|
||||
/client/proc/reload_configuration,
|
||||
/datum/admins/proc/create_or_modify_area,
|
||||
/client/proc/generate_wikichem_list //DO NOT PRESS UNLESS YOU WANT SUPERLAG
|
||||
#ifdef REFERENCE_TRACKING
|
||||
/datum/admins/proc/view_refs,
|
||||
/datum/admins/proc/view_del_failures,
|
||||
#endif
|
||||
/client/proc/generate_wikichem_list, //DO NOT PRESS UNLESS YOU WANT SUPERLAG
|
||||
)
|
||||
GLOBAL_PROTECT(admin_verbs_debug)
|
||||
GLOBAL_LIST_INIT(admin_verbs_possess, list(/proc/possess, /proc/release))
|
||||
|
||||
@@ -254,6 +254,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
|
||||
//message from the initiator without a target, all admins will see this
|
||||
//won't bug irc
|
||||
/datum/admin_help/proc/MessageNoRecipient(msg)
|
||||
msg = sanitize(copytext_char(msg, 1, MAX_MESSAGE_LEN))
|
||||
var/ref_src = "[REF(src)]"
|
||||
//Message to be sent to all admins
|
||||
var/admin_msg = "<span class='adminnotice'><span class='adminhelp'>Ticket [TicketHref("#[id]", ref_src)]</span><b>: [LinkedReplyName(ref_src)] [FullMonty(ref_src)]:</b> <span class='linkify'>[keywords_lookup(msg)]</span></span>"
|
||||
|
||||
@@ -55,7 +55,7 @@
|
||||
|
||||
if(AH)
|
||||
message_admins("[key_name_admin(src)] has started replying to [key_name(C, 0, 0)]'s admin help.")
|
||||
var/msg = stripped_multiline_input(src,"Message:", "Private message to [key_name(C, 0, 0)]")
|
||||
var/msg = input(src,"Message:", "Private message to [C.holder?.fakekey ? "an Administrator" : key_name(C, 0, 0)].") as message|null
|
||||
if (!msg)
|
||||
message_admins("[key_name_admin(src)] has cancelled their reply to [key_name(C, 0, 0)]'s admin help.")
|
||||
return
|
||||
@@ -90,7 +90,7 @@
|
||||
if(!ircreplyamount) //to prevent people from spamming irc/discord
|
||||
return
|
||||
if(!msg)
|
||||
msg = stripped_multiline_input(src,"Message:", "Private message to Administrator")
|
||||
msg = input(src,"Message:", "Private message to Administrator") as message|null
|
||||
|
||||
if(!msg)
|
||||
return
|
||||
@@ -112,7 +112,7 @@
|
||||
|
||||
//get message text, limit it's length.and clean/escape html
|
||||
if(!msg)
|
||||
msg = stripped_multiline_input(src,"Message:", "Private message to [key_name(recipient, 0, 0)]")
|
||||
msg = input(src,"Message:", "Private message to [recipient.holder?.fakekey ? "an Administrator" : key_name(recipient, 0, 0)].") as message|null
|
||||
msg = trim(msg)
|
||||
if(!msg)
|
||||
return
|
||||
@@ -133,7 +133,7 @@
|
||||
|
||||
//clean the message if it's not sent by a high-rank admin
|
||||
if(!check_rights(R_SERVER|R_DEBUG,0)||irc)//no sending html to the poor bots
|
||||
msg = trim(sanitize(msg), MAX_MESSAGE_LEN)
|
||||
msg = sanitize(copytext_char(msg, 1, MAX_MESSAGE_LEN))
|
||||
if(!msg)
|
||||
return
|
||||
|
||||
@@ -188,10 +188,10 @@
|
||||
|
||||
//AdminPM popup for ApocStation and anybody else who wants to use it. Set it with POPUP_ADMIN_PM in config.txt ~Carn
|
||||
if(CONFIG_GET(flag/popup_admin_pm))
|
||||
spawn() //so we don't hold the caller proc up
|
||||
spawn() //so we don't hold the caller proc up. Please functionalize this
|
||||
var/sender = src
|
||||
var/sendername = key
|
||||
var/reply = stripped_multiline_input(recipient, msg,"Admin PM from-[sendername]", "") //show message and await a reply
|
||||
var/reply = input(recipient, msg,"Admin PM from-[sendername]", "") as message|null //show message and await a reply
|
||||
if(recipient && reply)
|
||||
if(sender)
|
||||
recipient.cmd_admin_pm(sender,reply) //sender is still about, let's reply to them
|
||||
|
||||
@@ -0,0 +1,225 @@
|
||||
#ifdef REFERENCE_TRACKING
|
||||
|
||||
GLOBAL_LIST_EMPTY(deletion_failures)
|
||||
|
||||
/world/proc/enable_reference_tracking()
|
||||
if (fexists(EXTOOLS))
|
||||
call(EXTOOLS, "ref_tracking_initialize")()
|
||||
|
||||
/proc/get_back_references(datum/D)
|
||||
CRASH("/proc/get_back_references not hooked by extools, reference tracking will not function!")
|
||||
|
||||
/proc/get_forward_references(datum/D)
|
||||
CRASH("/proc/get_forward_references not hooked by extools, reference tracking will not function!")
|
||||
|
||||
/proc/clear_references(datum/D)
|
||||
return
|
||||
|
||||
/datum/admins/proc/view_refs(atom/D in world) //it actually supports datums as well but byond no likey
|
||||
set category = "Debug"
|
||||
set name = "View References"
|
||||
|
||||
if(!check_rights(R_DEBUG) || !D)
|
||||
return
|
||||
|
||||
var/list/backrefs = get_back_references(D)
|
||||
if(isnull(backrefs))
|
||||
var/datum/browser/popup = new(usr, "ref_view", "<div align='center'>Error</div>")
|
||||
popup.set_content("Reference tracking not enabled")
|
||||
popup.open(FALSE)
|
||||
return
|
||||
|
||||
var/list/frontrefs = get_forward_references(D)
|
||||
var/list/dat = list()
|
||||
dat += "<h1>References of \ref[D] - [D]</h1><br><a href='?_src_=vars;[HrefToken()];[VV_HK_VIEW_REFERENCES]=TRUE;[VV_HK_TARGET]=[REF(D)]'>\[Refresh\]</a><hr>"
|
||||
dat += "<h3>Back references - these things hold references to this object.</h3>"
|
||||
dat += "<table>"
|
||||
dat += "<tr><th>Ref</th><th>Type</th><th>Variable Name</th><th>Follow</th>"
|
||||
for(var/ref in backrefs)
|
||||
var/datum/backreference = ref
|
||||
if(isnull(backreference))
|
||||
dat += "<tr><td>GC'd Reference</td></tr>"
|
||||
if(istype(backreference))
|
||||
dat += "<tr><td><a href='?_src_=vars;[HrefToken()];Vars=[REF(backreference)]'>[REF(backreference)]</td><td>[backreference.type]</td><td>[backrefs[backreference]]</td><td><a href='?_src_=vars;[HrefToken()];[VV_HK_VIEW_REFERENCES]=TRUE;[VV_HK_TARGET]=[REF(backreference)]'>\[Follow\]</a></td></tr>"
|
||||
else if(islist(backreference))
|
||||
dat += "<tr><td><a href='?_src_=vars;[HrefToken()];Vars=[REF(backreference)]'>[REF(backreference)]</td><td>list</td><td>[backrefs[backreference]]</td><td><a href='?_src_=vars;[HrefToken()];[VV_HK_VIEW_REFERENCES]=TRUE;[VV_HK_TARGET]=[REF(backreference)]'>\[Follow\]</a></td></tr>"
|
||||
else
|
||||
dat += "<tr><td>Weird reference type. Add more debugging checks.</td></tr>"
|
||||
dat += "</table><hr>"
|
||||
dat += "<h3>Forward references - this object is referencing those things.</h3>"
|
||||
dat += "<table>"
|
||||
dat += "<tr><th>Variable name</th><th>Ref</th><th>Type</th><th>Follow</th>"
|
||||
for(var/ref in frontrefs)
|
||||
var/datum/backreference = frontrefs[ref]
|
||||
dat += "<tr><td>[ref]</td><td><a href='?_src_=vars;[HrefToken()];Vars=[REF(backreference)]'>[REF(backreference)]</a></td><td>[backreference.type]</td><td><a href='?_src_=vars;[HrefToken()];[VV_HK_VIEW_REFERENCES]=TRUE;[VV_HK_TARGET]=[REF(backreference)]'>\[Follow\]</a></td></tr>"
|
||||
dat += "</table><hr>"
|
||||
dat = dat.Join()
|
||||
|
||||
var/datum/browser/popup = new(usr, "ref_view", "<div align='center'>References of \ref[D]</div>")
|
||||
popup.set_content(dat)
|
||||
popup.open(FALSE)
|
||||
|
||||
|
||||
/datum/admins/proc/view_del_failures()
|
||||
set category = "Debug"
|
||||
set name = "View Deletion Failures"
|
||||
|
||||
if(!check_rights(R_DEBUG))
|
||||
return
|
||||
|
||||
var/list/dat = list("<table>")
|
||||
for(var/t in GLOB.deletion_failures)
|
||||
if(isnull(t))
|
||||
dat += "<tr><td>GC'd Reference | <a href='byond://?src=[REF(src)];[HrefToken(TRUE)];delfail_clearnulls=TRUE'>Clear Nulls</a></td></tr>"
|
||||
continue
|
||||
var/datum/thing = t
|
||||
dat += "<tr><td>\ref[thing] | [thing.type][thing.gc_destroyed ? " (destroyed)" : ""] [ADMIN_VV(thing)]</td></tr>"
|
||||
dat += "</table><hr>"
|
||||
dat = dat.Join()
|
||||
|
||||
var/datum/browser/popup = new(usr, "del_failures", "<div align='center'>Deletion Failures</div>")
|
||||
popup.set_content(dat)
|
||||
popup.open(FALSE)
|
||||
|
||||
|
||||
/datum/proc/find_references()
|
||||
testing("Beginning search for references to a [type].")
|
||||
var/list/backrefs = get_back_references(src)
|
||||
for(var/ref in backrefs)
|
||||
if(isnull(ref))
|
||||
log_world("## TESTING: Datum reference found, but gone now.")
|
||||
continue
|
||||
if(islist(ref))
|
||||
log_world("## TESTING: Found [type] \ref[src] in list.")
|
||||
continue
|
||||
var/datum/datum_ref = ref
|
||||
if(!istype(datum_ref))
|
||||
log_world("## TESTING: Found [type] \ref[src] in unknown type reference: [datum_ref].")
|
||||
return
|
||||
log_world("## TESTING: Found [type] \ref[src] in [datum_ref.type][datum_ref.gc_destroyed ? " (destroyed)" : ""]")
|
||||
message_admins("Found [type] \ref[src] [ADMIN_VV(src)] in [datum_ref.type][datum_ref.gc_destroyed ? " (destroyed)" : ""] [ADMIN_VV(datum_ref)]")
|
||||
testing("Completed search for references to a [type].")
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef LEGACY_REFERENCE_TRACKING
|
||||
|
||||
/datum/verb/legacy_find_refs()
|
||||
set category = "Debug"
|
||||
set name = "Find References"
|
||||
set src in world
|
||||
|
||||
find_references(FALSE)
|
||||
|
||||
|
||||
/datum/proc/find_references_legacy(skip_alert)
|
||||
running_find_references = type
|
||||
if(usr?.client)
|
||||
if(usr.client.running_find_references)
|
||||
testing("CANCELLED search for references to a [usr.client.running_find_references].")
|
||||
usr.client.running_find_references = null
|
||||
running_find_references = null
|
||||
//restart the garbage collector
|
||||
SSgarbage.can_fire = TRUE
|
||||
SSgarbage.next_fire = world.time + world.tick_lag
|
||||
return
|
||||
|
||||
if(!skip_alert && alert("Running this will lock everything up for about 5 minutes. Would you like to begin the search?", "Find References", "Yes", "No") != "Yes")
|
||||
running_find_references = null
|
||||
return
|
||||
|
||||
//this keeps the garbage collector from failing to collect objects being searched for in here
|
||||
SSgarbage.can_fire = FALSE
|
||||
|
||||
if(usr?.client)
|
||||
usr.client.running_find_references = type
|
||||
|
||||
testing("Beginning search for references to a [type].")
|
||||
last_find_references = world.time
|
||||
|
||||
DoSearchVar(GLOB) //globals
|
||||
for(var/datum/thing in world) //atoms (don't beleive its lies)
|
||||
DoSearchVar(thing, "World -> [thing]")
|
||||
|
||||
for(var/datum/thing) //datums
|
||||
DoSearchVar(thing, "World -> [thing]")
|
||||
|
||||
for(var/client/thing) //clients
|
||||
DoSearchVar(thing, "World -> [thing]")
|
||||
|
||||
testing("Completed search for references to a [type].")
|
||||
if(usr?.client)
|
||||
usr.client.running_find_references = null
|
||||
running_find_references = null
|
||||
|
||||
//restart the garbage collector
|
||||
SSgarbage.can_fire = TRUE
|
||||
SSgarbage.next_fire = world.time + world.tick_lag
|
||||
|
||||
|
||||
/datum/verb/qdel_then_find_references()
|
||||
set category = "Debug"
|
||||
set name = "qdel() then Find References"
|
||||
set src in world
|
||||
|
||||
qdel(src, TRUE) //force a qdel
|
||||
if(!running_find_references)
|
||||
find_references(TRUE)
|
||||
|
||||
|
||||
/datum/verb/qdel_then_if_fail_find_references()
|
||||
set category = "Debug"
|
||||
set name = "qdel() then Find References if GC failure"
|
||||
set src in world
|
||||
|
||||
qdel_and_find_ref_if_fail(src, TRUE)
|
||||
|
||||
|
||||
/datum/proc/DoSearchVar(potential_container, container_name, recursive_limit = 64)
|
||||
if(usr?.client && !usr.client.running_find_references)
|
||||
return
|
||||
|
||||
if(!recursive_limit)
|
||||
return
|
||||
|
||||
if(istype(potential_container, /datum))
|
||||
var/datum/datum_container = potential_container
|
||||
if(datum_container.last_find_references == last_find_references)
|
||||
return
|
||||
|
||||
datum_container.last_find_references = last_find_references
|
||||
var/list/vars_list = datum_container.vars
|
||||
|
||||
for(var/varname in vars_list)
|
||||
if (varname == "vars")
|
||||
continue
|
||||
var/variable = vars_list[varname]
|
||||
|
||||
if(variable == src)
|
||||
testing("Found [type] \ref[src] in [datum_container.type]'s [varname] var. [container_name]")
|
||||
|
||||
else if(islist(variable))
|
||||
DoSearchVar(variable, "[container_name] -> list", recursive_limit - 1)
|
||||
|
||||
else if(islist(potential_container))
|
||||
var/normal = IS_NORMAL_LIST(potential_container)
|
||||
for(var/element_in_list in potential_container)
|
||||
if(element_in_list == src)
|
||||
testing("Found [type] \ref[src] in list [container_name].")
|
||||
|
||||
else if(element_in_list && !isnum(element_in_list) && normal && potential_container[element_in_list] == src)
|
||||
testing("Found [type] \ref[src] in list [container_name]\[[element_in_list]\]")
|
||||
|
||||
else if(islist(element_in_list))
|
||||
DoSearchVar(element_in_list, "[container_name] -> list", recursive_limit - 1)
|
||||
|
||||
#ifndef FIND_REF_NO_CHECK_TICK
|
||||
CHECK_TICK
|
||||
#endif
|
||||
|
||||
|
||||
/proc/qdel_and_find_ref_if_fail(datum/thing_to_del, force = FALSE)
|
||||
SSgarbage.reference_find_on_fail[REF(thing_to_del)] = TRUE
|
||||
qdel(thing_to_del, force)
|
||||
|
||||
#endif
|
||||
@@ -45,6 +45,16 @@
|
||||
usr.client.admin_delete(target)
|
||||
if (isturf(src)) // show the turf that took its place
|
||||
usr.client.debug_variables(src)
|
||||
return
|
||||
#ifdef REFERENCE_TRACKING
|
||||
if(href_list[VV_HK_VIEW_REFERENCES])
|
||||
var/datum/D = locate(href_list[VV_HK_TARGET])
|
||||
if(!D)
|
||||
to_chat(usr, "<span class='warning'>Unable to locate item.</span>")
|
||||
return
|
||||
usr.client.holder.view_refs(target)
|
||||
return
|
||||
#endif
|
||||
if(href_list[VV_HK_MARK])
|
||||
usr.client.mark_datum(target)
|
||||
if(href_list[VV_HK_ADDCOMPONENT])
|
||||
|
||||
@@ -61,6 +61,7 @@
|
||||
"Set len" = VV_HREF_TARGETREF_INTERNAL(refid, VV_HK_LIST_SET_LENGTH),
|
||||
"Shuffle" = VV_HREF_TARGETREF_INTERNAL(refid, VV_HK_LIST_SHUFFLE),
|
||||
"Show VV To Player" = VV_HREF_TARGETREF_INTERNAL(refid, VV_HK_EXPOSE),
|
||||
"View References" = VV_HREF_TARGETREF_INTERNAL(refid, VV_HK_VIEW_REFERENCES),
|
||||
"---"
|
||||
)
|
||||
for(var/i in 1 to length(dropdownoptions))
|
||||
|
||||
@@ -6,5 +6,5 @@
|
||||
zone = BODY_ZONE_PRECISE_GROIN
|
||||
slot = ORGAN_SLOT_WOMB
|
||||
genital_flags = GENITAL_INTERNAL|GENITAL_FUID_PRODUCTION
|
||||
fluid_id = /datum/reagent/consumable/femcum
|
||||
fluid_id = /datum/reagent/consumable/semen/femcum
|
||||
linked_organ_slot = ORGAN_SLOT_VAGINA
|
||||
|
||||
@@ -323,7 +323,7 @@
|
||||
name = "pipes"
|
||||
|
||||
/datum/asset/spritesheet/pipes/register()
|
||||
for (var/each in list('icons/obj/atmospherics/pipes/pipe_item.dmi', 'icons/obj/atmospherics/pipes/disposal.dmi', 'icons/obj/atmospherics/pipes/transit_tube.dmi')) //, 'icons/obj/plumbing/fluid_ducts.dmi'))
|
||||
for (var/each in list('icons/obj/atmospherics/pipes/pipe_item.dmi', 'icons/obj/atmospherics/pipes/disposal.dmi', 'icons/obj/atmospherics/pipes/transit_tube.dmi', 'icons/obj/plumbing/fluid_ducts.dmi'))
|
||||
InsertAll("", each, GLOB.alldirs)
|
||||
..()
|
||||
|
||||
@@ -447,9 +447,11 @@
|
||||
Insert("polycrystal", 'icons/obj/telescience.dmi', "polycrystal")
|
||||
..()
|
||||
|
||||
|
||||
/datum/asset/spritesheet/mafia
|
||||
name = "mafia"
|
||||
|
||||
/datum/asset/spritesheet/mafia/register()
|
||||
InsertAll("", 'icons/obj/mafia.dmi')
|
||||
..()
|
||||
|
||||
|
||||
@@ -791,9 +791,9 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
|
||||
dat += "</b></center></td></tr>"
|
||||
dat += "<tr><td colspan=4><hr></td></tr>"
|
||||
|
||||
|
||||
dat += "<tr><td colspan=4><center><b>"
|
||||
|
||||
|
||||
if(!length(GLOB.loadout_categories[gear_category]))
|
||||
dat += "No subcategories detected. Something is horribly wrong!"
|
||||
else
|
||||
@@ -1636,7 +1636,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
if("mam_tail")
|
||||
var/list/snowflake_tails_list = list()
|
||||
for(var/path in GLOB.mam_tails_list)
|
||||
var/datum/sprite_accessory/mam_tails/instance = GLOB.mam_tails_list[path]
|
||||
var/datum/sprite_accessory/tails/mam_tails/instance = GLOB.mam_tails_list[path]
|
||||
if(istype(instance, /datum/sprite_accessory))
|
||||
var/datum/sprite_accessory/S = instance
|
||||
if(!show_mismatched_markings && S.recommended_species && !S.recommended_species.Find(pref_species.id))
|
||||
@@ -1661,7 +1661,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
if("snout")
|
||||
var/list/snowflake_snouts_list = list()
|
||||
for(var/path in GLOB.snouts_list)
|
||||
var/datum/sprite_accessory/mam_snouts/instance = GLOB.snouts_list[path]
|
||||
var/datum/sprite_accessory/snouts/mam_snouts/instance = GLOB.snouts_list[path]
|
||||
if(istype(instance, /datum/sprite_accessory))
|
||||
var/datum/sprite_accessory/S = instance
|
||||
if(!show_mismatched_markings && S.recommended_species && !S.recommended_species.Find(pref_species.id))
|
||||
@@ -1678,7 +1678,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
if("mam_snouts")
|
||||
var/list/snowflake_mam_snouts_list = list()
|
||||
for(var/path in GLOB.mam_snouts_list)
|
||||
var/datum/sprite_accessory/mam_snouts/instance = GLOB.mam_snouts_list[path]
|
||||
var/datum/sprite_accessory/snouts/mam_snouts/instance = GLOB.mam_snouts_list[path]
|
||||
if(istype(instance, /datum/sprite_accessory))
|
||||
var/datum/sprite_accessory/S = instance
|
||||
if(!show_mismatched_markings && S.recommended_species && !S.recommended_species.Find(pref_species.id))
|
||||
@@ -1827,7 +1827,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
if("mam_ears")
|
||||
var/list/snowflake_ears_list = list()
|
||||
for(var/path in GLOB.mam_ears_list)
|
||||
var/datum/sprite_accessory/mam_ears/instance = GLOB.mam_ears_list[path]
|
||||
var/datum/sprite_accessory/ears/mam_ears/instance = GLOB.mam_ears_list[path]
|
||||
if(istype(instance, /datum/sprite_accessory))
|
||||
var/datum/sprite_accessory/S = instance
|
||||
if(!show_mismatched_markings && S.recommended_species && !S.recommended_species.Find(pref_species.id))
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
// You do not need to raise this if you are adding new values that have sane defaults.
|
||||
// Only raise this value when changing the meaning/format/name/layout of an existing value
|
||||
// where you would want the updater procs below to run
|
||||
#define SAVEFILE_VERSION_MAX 34
|
||||
#define SAVEFILE_VERSION_MAX 35
|
||||
|
||||
/*
|
||||
SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Carn
|
||||
@@ -200,6 +200,10 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
features["silicon_flavor_text"] = html_encode(features["silicon_flavor_text"])
|
||||
features["ooc_notes"] = html_encode(features["ooc_notes"])
|
||||
|
||||
if(current_version < 35)
|
||||
if(S["species"] == "lizard")
|
||||
features["mam_snouts"] = features["snout"]
|
||||
|
||||
/datum/preferences/proc/load_path(ckey,filename="preferences.sav")
|
||||
if(!ckey)
|
||||
return
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
ship_name = pick(strings(PIRATE_NAMES_FILE, "ship_names"))
|
||||
|
||||
/datum/round_event/pirates/announce(fake)
|
||||
priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") // CITADEL EDIT metabreak
|
||||
priority_announce("A business proposition has been downloaded and printed out at all communication consoles.", "Incoming Business Proposition", "commandreport")
|
||||
if(fake)
|
||||
return
|
||||
threat_message = new
|
||||
@@ -49,6 +49,7 @@
|
||||
else
|
||||
priority_announce("Trying to cheat us? You'll regret this!",sender_override = ship_name)
|
||||
if(!shuttle_spawned)
|
||||
priority_announce("You won't listen to reason? Then we'll take what's yours or die trying!",sender_override = ship_name)
|
||||
spawn_shuttle()
|
||||
|
||||
/datum/round_event/pirates/start()
|
||||
@@ -83,8 +84,7 @@
|
||||
announce_to_ghosts(M)
|
||||
else
|
||||
announce_to_ghosts(spawner)
|
||||
|
||||
priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") //CITADEL EDIT also metabreak here too
|
||||
priority_announce("Unidentified ship detected near the station.")
|
||||
|
||||
//Shuttle equipment
|
||||
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
var/self_sufficiency_req = 20 //Required total dose to make a self-sufficient hydro tray. 1:1 with earthsblood.
|
||||
var/self_sufficiency_progress = 0
|
||||
var/self_sustaining = FALSE //If the tray generates nutrients and water on its own
|
||||
|
||||
var/canirrigate = TRUE //tin
|
||||
|
||||
/obj/machinery/hydroponics/constructable
|
||||
name = "hydroponics tray"
|
||||
@@ -847,12 +847,13 @@
|
||||
if (!anchored)
|
||||
to_chat(user, "<span class='warning'>Anchor the tray first!</span>")
|
||||
return
|
||||
using_irrigation = !using_irrigation
|
||||
O.play_tool_sound(src)
|
||||
user.visible_message("<span class='notice'>[user] [using_irrigation ? "" : "dis"]connects [src]'s irrigation hoses.</span>", \
|
||||
"<span class='notice'>You [using_irrigation ? "" : "dis"]connect [src]'s irrigation hoses.</span>")
|
||||
for(var/obj/machinery/hydroponics/h in range(1,src))
|
||||
h.update_icon()
|
||||
if(canirrigate)
|
||||
using_irrigation = !using_irrigation
|
||||
O.play_tool_sound(src)
|
||||
user.visible_message("<span class='notice'>[user] [using_irrigation ? "" : "dis"]connects [src]'s irrigation hoses.</span>", \
|
||||
"<span class='notice'>You [using_irrigation ? "" : "dis"]connect [src]'s irrigation hoses.</span>")
|
||||
for(var/obj/machinery/hydroponics/h in range(1,src))
|
||||
h.update_icon()
|
||||
|
||||
else if(istype(O, /obj/item/shovel/spade))
|
||||
if(!myseed && !weedlevel)
|
||||
@@ -910,11 +911,14 @@
|
||||
harvest = 0
|
||||
lastproduce = age
|
||||
if(istype(myseed, /obj/item/seeds/replicapod))
|
||||
to_chat(user, "<span class='notice'>You harvest from the [myseed.plantname].</span>")
|
||||
if(user)//runtimes
|
||||
to_chat(user, "<span class='notice'>You harvest from the [myseed.plantname].</span>")
|
||||
else if(myseed.getYield() <= 0)
|
||||
to_chat(user, "<span class='warning'>You fail to harvest anything useful!</span>")
|
||||
if(user)
|
||||
to_chat(user, "<span class='warning'>You fail to harvest anything useful!</span>")
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You harvest [myseed.getYield()] items from the [myseed.plantname].</span>")
|
||||
if(user)
|
||||
to_chat(user, "<span class='notice'>You harvest [myseed.getYield()] items from the [myseed.plantname].</span>")
|
||||
if(!myseed.get_gene(/datum/plant_gene/trait/repeated_harvest))
|
||||
qdel(myseed)
|
||||
myseed = null
|
||||
|
||||
@@ -190,6 +190,31 @@ obj/item/seeds/proc/is_gene_forbidden(typepath)
|
||||
parent.update_tray(user)
|
||||
return result
|
||||
|
||||
/obj/item/seeds/proc/harvest_userless()
|
||||
var/obj/machinery/hydroponics/parent = loc //for ease of access
|
||||
var/t_amount = 0
|
||||
var/list/result = list()
|
||||
var/output_loc = parent.loc
|
||||
var/product_name
|
||||
while(t_amount < getYield())
|
||||
var/obj/item/reagent_containers/food/snacks/grown/t_prod = new product(output_loc, src)
|
||||
if(parent.myseed.plantname != initial(parent.myseed.plantname))
|
||||
t_prod.name = lowertext(parent.myseed.plantname)
|
||||
if(productdesc)
|
||||
t_prod.desc = productdesc
|
||||
t_prod.seed.name = parent.myseed.name
|
||||
t_prod.seed.desc = parent.myseed.desc
|
||||
t_prod.seed.plantname = parent.myseed.plantname
|
||||
result.Add(t_prod) // User gets a consumable
|
||||
if(!t_prod)
|
||||
return
|
||||
t_amount++
|
||||
product_name = parent.myseed.plantname
|
||||
if(getYield() >= 1)
|
||||
SSblackbox.record_feedback("tally", "food_harvested", getYield(), product_name)
|
||||
parent.investigate_log("autmoatic harvest of [getYield()] of [src], with seed traits [english_list(genes)] and reagents_add [english_list(reagents_add)] and potency [potency].", INVESTIGATE_BOTANY)
|
||||
parent.update_tray()
|
||||
return result
|
||||
|
||||
/obj/item/seeds/proc/prepare_result(var/obj/item/reagent_containers/food/snacks/grown/T)
|
||||
if(!T.reagents)
|
||||
|
||||
@@ -46,6 +46,7 @@
|
||||
var/minimal_player_age = 0
|
||||
|
||||
var/outfit = null
|
||||
var/plasma_outfit = null //the outfit given to plasmamen
|
||||
|
||||
var/exp_requirements = 0
|
||||
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
exp_type = EXP_TYPE_CREW
|
||||
|
||||
outfit = /datum/outfit/job/atmos
|
||||
plasma_outfit = /datum/outfit/plasmaman/atmospherics
|
||||
|
||||
access = list(ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_TECH_STORAGE, ACCESS_MAINT_TUNNELS,
|
||||
ACCESS_EXTERNAL_AIRLOCKS, ACCESS_CONSTRUCTION, ACCESS_ATMOSPHERICS, ACCESS_MINERAL_STOREROOM)
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
exp_type_department = EXP_TYPE_SERVICE // This is so the jobs menu can work properly
|
||||
|
||||
outfit = /datum/outfit/job/bartender
|
||||
plasma_outfit = /datum/outfit/plasmaman/bar
|
||||
|
||||
access = list(ACCESS_HYDROPONICS, ACCESS_BAR, ACCESS_KITCHEN, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM)
|
||||
minimal_access = list(ACCESS_BAR, ACCESS_MINERAL_STOREROOM)
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
selection_color = "#bbe291"
|
||||
|
||||
outfit = /datum/outfit/job/botanist
|
||||
plasma_outfit = /datum/outfit/plasmaman/botany
|
||||
|
||||
access = list(ACCESS_HYDROPONICS, ACCESS_BAR, ACCESS_KITCHEN, ACCESS_MORGUE, ACCESS_MINERAL_STOREROOM)
|
||||
minimal_access = list(ACCESS_HYDROPONICS, ACCESS_MORGUE, ACCESS_MINERAL_STOREROOM)
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
|
||||
|
||||
outfit = /datum/outfit/job/captain
|
||||
plasma_outfit = /datum/outfit/plasmaman/captain
|
||||
|
||||
access = list() //See get_access()
|
||||
minimal_access = list() //See get_access()
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
selection_color = "#ca8f55"
|
||||
|
||||
outfit = /datum/outfit/job/cargo_tech
|
||||
plasma_outfit = /datum/outfit/plasmaman/cargo
|
||||
|
||||
access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_CARGO_BOT, ACCESS_MINING,
|
||||
ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM)
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
selection_color = "#dddddd"
|
||||
|
||||
outfit = /datum/outfit/job/chaplain
|
||||
plasma_outfit = /datum/outfit/plasmaman/chaplain
|
||||
|
||||
access = list(ACCESS_MORGUE, ACCESS_CHAPEL_OFFICE, ACCESS_CREMATORIUM, ACCESS_THEATRE)
|
||||
minimal_access = list(ACCESS_MORGUE, ACCESS_CHAPEL_OFFICE, ACCESS_CREMATORIUM, ACCESS_THEATRE)
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
exp_requirements = 60
|
||||
|
||||
outfit = /datum/outfit/job/chemist
|
||||
plasma_outfit = /datum/outfit/plasmaman/chemist
|
||||
|
||||
access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_CHEMISTRY, ACCESS_VIROLOGY, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_MINERAL_STOREROOM)
|
||||
minimal_access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_CHEMISTRY, ACCESS_MINERAL_STOREROOM)
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
exp_type_department = EXP_TYPE_ENGINEERING
|
||||
|
||||
outfit = /datum/outfit/job/ce
|
||||
plasma_outfit = /datum/outfit/plasmaman/ce
|
||||
|
||||
access = list(ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_TECH_STORAGE, ACCESS_MAINT_TUNNELS,
|
||||
ACCESS_EXTERNAL_AIRLOCKS, ACCESS_ATMOSPHERICS, ACCESS_EVA,
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
exp_type_department = EXP_TYPE_MEDICAL
|
||||
|
||||
outfit = /datum/outfit/job/cmo
|
||||
plasma_outfit = /datum/outfit/plasmaman/cmo
|
||||
|
||||
access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_HEADS, ACCESS_MINERAL_STOREROOM,
|
||||
ACCESS_CHEMISTRY, ACCESS_VIROLOGY, ACCESS_CMO, ACCESS_SURGERY, ACCESS_RC_ANNOUNCE,
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
selection_color = "#dddddd"
|
||||
|
||||
outfit = /datum/outfit/job/clown
|
||||
plasma_outfit = /datum/outfit/plasmaman/clown
|
||||
|
||||
access = list(ACCESS_THEATRE)
|
||||
minimal_access = list(ACCESS_THEATRE)
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
var/cooks = 0 //Counts cooks amount
|
||||
|
||||
outfit = /datum/outfit/job/cook
|
||||
plasma_outfit = /datum/outfit/plasmaman/chef
|
||||
|
||||
access = list(ACCESS_HYDROPONICS, ACCESS_BAR, ACCESS_KITCHEN, ACCESS_MORGUE, ACCESS_MINERAL_STOREROOM)
|
||||
minimal_access = list(ACCESS_KITCHEN, ACCESS_MORGUE, ACCESS_MINERAL_STOREROOM)
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
selection_color = "#dddddd"
|
||||
|
||||
outfit = /datum/outfit/job/curator
|
||||
plasma_outfit = /datum/outfit/plasmaman/curator
|
||||
|
||||
access = list(ACCESS_LIBRARY)
|
||||
minimal_access = list(ACCESS_LIBRARY, ACCESS_CONSTRUCTION, ACCESS_MINING_STATION)
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
exp_type = EXP_TYPE_CREW
|
||||
|
||||
outfit = /datum/outfit/job/detective
|
||||
plasma_outfit = /datum/outfit/plasmaman/detective
|
||||
|
||||
access = list(ACCESS_SEC_DOORS, ACCESS_FORENSICS_LOCKERS, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_COURT, ACCESS_BRIG, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM)
|
||||
minimal_access = list(ACCESS_SEC_DOORS, ACCESS_FORENSICS_LOCKERS, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_COURT, ACCESS_BRIG, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM)
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
exp_requirements = 60
|
||||
|
||||
outfit = /datum/outfit/job/geneticist
|
||||
plasma_outfit = /datum/outfit/plasmaman/genetics
|
||||
|
||||
access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_CHEMISTRY, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_RESEARCH, ACCESS_XENOBIOLOGY, ACCESS_ROBOTICS, ACCESS_MINERAL_STOREROOM, ACCESS_TECH_STORAGE)
|
||||
minimal_access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_RESEARCH, ACCESS_MINERAL_STOREROOM)
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
exp_type_department = EXP_TYPE_SERVICE
|
||||
|
||||
outfit = /datum/outfit/job/hop
|
||||
plasma_outfit = /datum/outfit/plasmaman/hop
|
||||
|
||||
access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_COURT, ACCESS_WEAPONS,
|
||||
ACCESS_MEDICAL, ACCESS_ENGINE, ACCESS_CHANGE_IDS, ACCESS_AI_UPLOAD, ACCESS_EVA, ACCESS_HEADS,
|
||||
|
||||
@@ -17,6 +17,8 @@
|
||||
exp_type_department = EXP_TYPE_SECURITY
|
||||
|
||||
outfit = /datum/outfit/job/hos
|
||||
plasma_outfit = /datum/outfit/plasmaman/hos
|
||||
|
||||
mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM)
|
||||
|
||||
access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_COURT, ACCESS_WEAPONS, ACCESS_ENTER_GENPOP, ACCESS_LEAVE_GENPOP,
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
selection_color = "#bbe291"
|
||||
|
||||
outfit = /datum/outfit/job/janitor
|
||||
plasma_outfit = /datum/outfit/plasmaman/janitor
|
||||
|
||||
access = list(ACCESS_JANITOR, ACCESS_MAINT_TUNNELS, ACCESS_MINERAL_STOREROOM)
|
||||
minimal_access = list(ACCESS_JANITOR, ACCESS_MAINT_TUNNELS, ACCESS_MINERAL_STOREROOM)
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
var/lawyers = 0 //Counts lawyer amount
|
||||
|
||||
outfit = /datum/outfit/job/lawyer
|
||||
plasma_outfit = /datum/outfit/plasmaman/bar //yes, this is correct, there's no 'lawyer' plasmeme outfit
|
||||
|
||||
access = list(ACCESS_LAWYER, ACCESS_COURT, ACCESS_SEC_DOORS)
|
||||
minimal_access = list(ACCESS_LAWYER, ACCESS_COURT, ACCESS_SEC_DOORS)
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
selection_color = "#74b5e0"
|
||||
|
||||
outfit = /datum/outfit/job/doctor
|
||||
plasma_outfit = /datum/outfit/plasmaman/medical
|
||||
|
||||
access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_CHEMISTRY, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_VIROLOGY, ACCESS_MINERAL_STOREROOM)
|
||||
minimal_access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_CLONING, ACCESS_MINERAL_STOREROOM)
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
selection_color = "#dddddd"
|
||||
|
||||
outfit = /datum/outfit/job/mime
|
||||
plasma_outfit = /datum/outfit/plasmaman/mime
|
||||
|
||||
access = list(ACCESS_THEATRE)
|
||||
minimal_access = list(ACCESS_THEATRE)
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
exp_type = EXP_TYPE_CREW
|
||||
|
||||
outfit = /datum/outfit/job/rd
|
||||
plasma_outfit = /datum/outfit/plasmaman/rd
|
||||
|
||||
access = list(ACCESS_RD, ACCESS_HEADS, ACCESS_TOX, ACCESS_GENETICS, ACCESS_MORGUE,
|
||||
ACCESS_TOX_STORAGE, ACCESS_TELEPORTER, ACCESS_SEC_DOORS,
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
exp_type = EXP_TYPE_CREW
|
||||
|
||||
outfit = /datum/outfit/job/roboticist
|
||||
plasma_outfit = /datum/outfit/plasmaman/robotics
|
||||
|
||||
access = list(ACCESS_ROBOTICS, ACCESS_TOX, ACCESS_TOX_STORAGE, ACCESS_TECH_STORAGE, ACCESS_MORGUE, ACCESS_RESEARCH, ACCESS_MINERAL_STOREROOM, ACCESS_XENOBIOLOGY, ACCESS_GENETICS)
|
||||
minimal_access = list(ACCESS_ROBOTICS, ACCESS_TECH_STORAGE, ACCESS_MORGUE, ACCESS_RESEARCH, ACCESS_MINERAL_STOREROOM)
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
exp_type = EXP_TYPE_CREW
|
||||
|
||||
outfit = /datum/outfit/job/scientist
|
||||
plasma_outfit = /datum/outfit/plasmaman/science
|
||||
|
||||
access = list(ACCESS_ROBOTICS, ACCESS_TOX, ACCESS_TOX_STORAGE, ACCESS_RESEARCH, ACCESS_XENOBIOLOGY, ACCESS_MINERAL_STOREROOM, ACCESS_TECH_STORAGE, ACCESS_GENETICS)
|
||||
minimal_access = list(ACCESS_TOX, ACCESS_TOX_STORAGE, ACCESS_RESEARCH, ACCESS_XENOBIOLOGY, ACCESS_MINERAL_STOREROOM)
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
exp_type = EXP_TYPE_CREW
|
||||
|
||||
outfit = /datum/outfit/job/security
|
||||
plasma_outfit = /datum/outfit/plasmaman/security
|
||||
|
||||
access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_COURT, ACCESS_MAINT_TUNNELS, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_ENTER_GENPOP, ACCESS_LEAVE_GENPOP, ACCESS_FORENSICS_LOCKERS, ACCESS_MINERAL_STOREROOM)
|
||||
minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_COURT, ACCESS_WEAPONS, ACCESS_ENTER_GENPOP, ACCESS_LEAVE_GENPOP, ACCESS_MINERAL_STOREROOM) // See /datum/job/officer/get_access()
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
|
||||
|
||||
outfit = /datum/outfit/job/miner
|
||||
plasma_outfit = /datum/outfit/plasmaman/mining
|
||||
|
||||
access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_CARGO_BOT, ACCESS_MINING,
|
||||
ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM)
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
exp_type = EXP_TYPE_CREW
|
||||
|
||||
outfit = /datum/outfit/job/engineer
|
||||
plasma_outfit = /datum/outfit/plasmaman/engineering
|
||||
|
||||
access = list(ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_TECH_STORAGE, ACCESS_MAINT_TUNNELS,
|
||||
ACCESS_EXTERNAL_AIRLOCKS, ACCESS_CONSTRUCTION, ACCESS_ATMOSPHERICS, ACCESS_TCOMSAT, ACCESS_MINERAL_STOREROOM)
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
exp_requirements = 60
|
||||
|
||||
outfit = /datum/outfit/job/virologist
|
||||
plasma_outfit = /datum/outfit/plasmaman/viro
|
||||
|
||||
access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_CHEMISTRY, ACCESS_VIROLOGY, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_MINERAL_STOREROOM)
|
||||
minimal_access = list(ACCESS_MEDICAL, ACCESS_VIROLOGY, ACCESS_MINERAL_STOREROOM)
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
exp_type = EXP_TYPE_CREW
|
||||
|
||||
outfit = /datum/outfit/job/warden
|
||||
plasma_outfit = /datum/outfit/plasmaman/warden
|
||||
|
||||
access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_COURT, ACCESS_MAINT_TUNNELS, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_ENTER_GENPOP, ACCESS_LEAVE_GENPOP, ACCESS_FORENSICS_LOCKERS, ACCESS_MINERAL_STOREROOM)
|
||||
minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_COURT, ACCESS_WEAPONS, ACCESS_ENTER_GENPOP, ACCESS_LEAVE_GENPOP, ACCESS_MINERAL_STOREROOM) // See /datum/job/warden/get_access()
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
/datum/sprite_accessory/mam_tails/shark/datashark
|
||||
/datum/sprite_accessory/tails/mam_tails/shark/datashark
|
||||
name = "DataShark"
|
||||
icon_state = "datashark"
|
||||
ckeys_allowed = list("rubyflamewing")
|
||||
|
||||
/datum/sprite_accessory/mam_tails_animated/shark/datashark
|
||||
/datum/sprite_accessory/tails_animated/mam_tails_animated/shark/datashark
|
||||
name = "DataShark"
|
||||
icon_state = "datashark"
|
||||
ckeys_allowed = list("rubyflamewing")
|
||||
@@ -14,19 +14,19 @@
|
||||
ckeys_allowed = list("rubyflamewing")
|
||||
|
||||
//Sabresune
|
||||
/datum/sprite_accessory/mam_ears/sabresune
|
||||
/datum/sprite_accessory/ears/mam_ears/sabresune
|
||||
name = "Sabresune"
|
||||
icon_state = "sabresune"
|
||||
ckeys_allowed = list("poojawa")
|
||||
extra = TRUE
|
||||
extra_color_src = MUTCOLORS3
|
||||
|
||||
/datum/sprite_accessory/mam_tails/sabresune
|
||||
/datum/sprite_accessory/tails/mam_tails/sabresune
|
||||
name = "Sabresune"
|
||||
icon_state = "sabresune"
|
||||
ckeys_allowed = list("poojawa")
|
||||
|
||||
/datum/sprite_accessory/mam_tails_animated/sabresune
|
||||
/datum/sprite_accessory/tails_animated/mam_tails_animated/sabresune
|
||||
name = "Sabresune"
|
||||
icon_state = "sabresune"
|
||||
ckeys_allowed = list("poojawa")
|
||||
@@ -37,17 +37,17 @@
|
||||
ckeys_allowed = list("poojawa")
|
||||
|
||||
//Lunasune
|
||||
/datum/sprite_accessory/mam_ears/lunasune
|
||||
/datum/sprite_accessory/ears/mam_ears/lunasune
|
||||
name = "lunasune"
|
||||
icon_state = "lunasune"
|
||||
ckeys_allowed = list("invader4352")
|
||||
|
||||
/datum/sprite_accessory/mam_tails/lunasune
|
||||
/datum/sprite_accessory/tails/mam_tails/lunasune
|
||||
name = "lunasune"
|
||||
icon_state = "lunasune"
|
||||
ckeys_allowed = list("invader4352")
|
||||
|
||||
/datum/sprite_accessory/mam_tails_animated/lunasune
|
||||
/datum/sprite_accessory/tails_animated/mam_tails_animated/lunasune
|
||||
name = "lunasune"
|
||||
icon_state = "lunasune"
|
||||
ckeys_allowed = list("invader4352")
|
||||
|
||||
@@ -76,6 +76,9 @@
|
||||
//For soft-restricting markings to species IDs
|
||||
var/list/recommended_species
|
||||
|
||||
/datum/sprite_accessory/proc/is_not_visible(var/mob/living/carbon/human/H, var/tauric) //return if the accessory shouldn't be shown
|
||||
return FALSE
|
||||
|
||||
/datum/sprite_accessory/underwear
|
||||
icon = 'icons/mob/clothing/underwear.dmi'
|
||||
var/has_color = FALSE
|
||||
|
||||
@@ -7,6 +7,9 @@
|
||||
mutant_part_string = "xenodorsal"
|
||||
relevant_layers = list(BODY_BEHIND_LAYER, BODY_FRONT_LAYER)
|
||||
|
||||
/datum/sprite_accessory/xeno_dorsal/is_not_visible(var/mob/living/carbon/human/H, var/tauric)
|
||||
return (!H.dna.features["xenodorsal"] || H.dna.features["xenodorsal"] == "None" || (H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT)))
|
||||
|
||||
/datum/sprite_accessory/xeno_dorsal/standard
|
||||
name = "Standard"
|
||||
icon_state = "standard"
|
||||
@@ -27,6 +30,9 @@
|
||||
mutant_part_string = "tail"
|
||||
relevant_layers = list(BODY_BEHIND_LAYER, BODY_FRONT_LAYER)
|
||||
|
||||
/datum/sprite_accessory/xeno_tail/is_not_visible(var/mob/living/carbon/human/H, var/tauric)
|
||||
return (!H.dna.features["xenotail"] || H.dna.features["xenotail"] == "None" || H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT))
|
||||
|
||||
/datum/sprite_accessory/xeno_tail/none
|
||||
name = "None"
|
||||
relevant_layers = null
|
||||
@@ -43,6 +49,10 @@
|
||||
mutant_part_string = "xhead"
|
||||
relevant_layers = list(BODY_ADJ_LAYER)
|
||||
|
||||
/datum/sprite_accessory/xeno_head/is_not_visible(var/mob/living/carbon/human/H, var/tauric)
|
||||
var/obj/item/bodypart/head/HD = H.get_bodypart(BODY_ZONE_HEAD)
|
||||
return (!H.dna.features["xenohead"] || H.dna.features["xenohead"] == "None" || H.head && (H.head.flags_inv & HIDEHAIR) || (H.wear_mask && (H.wear_mask.flags_inv & HIDEHAIR)) || !HD || HD.status == BODYPART_ROBOTIC)
|
||||
|
||||
/datum/sprite_accessory/xeno_head/standard
|
||||
name = "Standard"
|
||||
icon_state = "standard"
|
||||
|
||||
@@ -224,6 +224,9 @@
|
||||
color_src = 0
|
||||
relevant_layers = list(BODY_FRONT_LAYER)
|
||||
|
||||
/datum/sprite_accessory/insect_fluff/is_not_visible(var/mob/living/carbon/human/H, var/tauric)
|
||||
return (!H.dna.features["insect_fluff"] || H.dna.features["insect_fluff"] == "None" || H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT))
|
||||
|
||||
/datum/sprite_accessory/insect_fluff/none
|
||||
name = "None"
|
||||
icon_state = "none"
|
||||
|
||||
@@ -3,6 +3,10 @@
|
||||
mutant_part_string = "ears"
|
||||
relevant_layers = list(BODY_BEHIND_LAYER, BODY_ADJ_LAYER, BODY_FRONT_LAYER)
|
||||
|
||||
/datum/sprite_accessory/ears/is_not_visible(var/mob/living/carbon/human/H, var/tauric)
|
||||
var/obj/item/bodypart/head/HD = H.get_bodypart(BODY_ZONE_HEAD)
|
||||
return (!H.dna.features["ears"] || H.dna.features["ears"] == "None" || H.head && (H.head.flags_inv & HIDEEARS) || (H.wear_mask && (H.wear_mask.flags_inv & HIDEEARS)) || !HD || HD.status == BODYPART_ROBOTIC)
|
||||
|
||||
/datum/sprite_accessory/ears/none
|
||||
name = "None"
|
||||
icon_state = "none"
|
||||
@@ -175,50 +179,54 @@
|
||||
*************** Furry Ears ****************
|
||||
*******************************************/
|
||||
|
||||
/datum/sprite_accessory/mam_ears
|
||||
/datum/sprite_accessory/ears/mam_ears
|
||||
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
|
||||
color_src = MATRIXED
|
||||
mutant_part_string = "ears"
|
||||
relevant_layers = list(BODY_BEHIND_LAYER, BODY_ADJ_LAYER, BODY_FRONT_LAYER)
|
||||
|
||||
/datum/sprite_accessory/mam_ears/none
|
||||
/datum/sprite_accessory/ears/mam_ears/is_not_visible(var/mob/living/carbon/human/H, var/tauric)
|
||||
var/obj/item/bodypart/head/HD = H.get_bodypart(BODY_ZONE_HEAD)
|
||||
return (!H.dna.features["mam_ears"] || H.dna.features["mam_ears"] == "None" || H.head && (H.head.flags_inv & HIDEEARS) || (H.wear_mask && (H.wear_mask.flags_inv & HIDEEARS)) || !HD || HD.status == BODYPART_ROBOTIC)
|
||||
|
||||
/datum/sprite_accessory/ears/mam_ears/none
|
||||
name = "None"
|
||||
icon_state = "none"
|
||||
relevant_layers = null
|
||||
|
||||
/datum/sprite_accessory/mam_ears/axolotl
|
||||
/datum/sprite_accessory/ears/mam_ears/axolotl
|
||||
name = "Axolotl"
|
||||
icon_state = "axolotl"
|
||||
|
||||
/datum/sprite_accessory/mam_ears/bat
|
||||
/datum/sprite_accessory/ears/mam_ears/bat
|
||||
name = "Bat"
|
||||
icon_state = "bat"
|
||||
|
||||
/datum/sprite_accessory/mam_ears/bear
|
||||
/datum/sprite_accessory/ears/mam_ears/bear
|
||||
name = "Bear"
|
||||
icon_state = "bear"
|
||||
|
||||
/datum/sprite_accessory/mam_ears/bigwolf
|
||||
/datum/sprite_accessory/ears/mam_ears/bigwolf
|
||||
name = "Big Wolf"
|
||||
icon_state = "bigwolf"
|
||||
|
||||
/datum/sprite_accessory/mam_ears/bigwolfinner
|
||||
/datum/sprite_accessory/ears/mam_ears/bigwolfinner
|
||||
name = "Big Wolf (ALT)"
|
||||
icon_state = "bigwolfinner"
|
||||
extra = TRUE
|
||||
extra_color_src = NONE
|
||||
|
||||
/datum/sprite_accessory/mam_ears/bigwolfdark
|
||||
/datum/sprite_accessory/ears/mam_ears/bigwolfdark
|
||||
name = "Dark Big Wolf"
|
||||
icon_state = "bigwolfdark"
|
||||
|
||||
/datum/sprite_accessory/mam_ears/bigwolfinnerdark
|
||||
/datum/sprite_accessory/ears/mam_ears/bigwolfinnerdark
|
||||
name = "Dark Big Wolf (ALT)"
|
||||
icon_state = "bigwolfinnerdark"
|
||||
extra = TRUE
|
||||
extra_color_src = NONE
|
||||
|
||||
/datum/sprite_accessory/mam_ears/cat
|
||||
/datum/sprite_accessory/ears/mam_ears/cat
|
||||
name = "Cat"
|
||||
icon_state = "cat"
|
||||
icon = 'icons/mob/mutant_bodyparts.dmi'
|
||||
@@ -226,100 +234,100 @@
|
||||
extra = TRUE
|
||||
extra_color_src = NONE
|
||||
|
||||
/datum/sprite_accessory/mam_ears/catbig
|
||||
/datum/sprite_accessory/ears/mam_ears/catbig
|
||||
name = "Cat, Big"
|
||||
icon_state = "catbig"
|
||||
|
||||
/datum/sprite_accessory/mam_ears/cow
|
||||
/datum/sprite_accessory/ears/mam_ears/cow
|
||||
name = "Cow"
|
||||
icon_state = "cow"
|
||||
|
||||
/datum/sprite_accessory/mam_ears/curled
|
||||
/datum/sprite_accessory/ears/mam_ears/curled
|
||||
name = "Curled Horn"
|
||||
icon_state = "horn1"
|
||||
color_src = MUTCOLORS3
|
||||
|
||||
/datum/sprite_accessory/mam_ears/deer
|
||||
/datum/sprite_accessory/ears/mam_ears/deer
|
||||
name = "Deer"
|
||||
icon_state = "deer"
|
||||
color_src = MUTCOLORS3
|
||||
|
||||
/datum/sprite_accessory/mam_ears/eevee
|
||||
/datum/sprite_accessory/ears/mam_ears/eevee
|
||||
name = "Eevee"
|
||||
icon_state = "eevee"
|
||||
|
||||
|
||||
/datum/sprite_accessory/mam_ears/elf
|
||||
/datum/sprite_accessory/ears/mam_ears/elf
|
||||
name = "Elf"
|
||||
icon_state = "elf"
|
||||
color_src = MUTCOLORS3
|
||||
|
||||
|
||||
/datum/sprite_accessory/mam_ears/elephant
|
||||
/datum/sprite_accessory/ears/mam_ears/elephant
|
||||
name = "Elephant"
|
||||
icon_state = "elephant"
|
||||
|
||||
/datum/sprite_accessory/mam_ears/fennec
|
||||
/datum/sprite_accessory/ears/mam_ears/fennec
|
||||
name = "Fennec"
|
||||
icon_state = "fennec"
|
||||
|
||||
/datum/sprite_accessory/mam_ears/fish
|
||||
/datum/sprite_accessory/ears/mam_ears/fish
|
||||
name = "Fish"
|
||||
icon_state = "fish"
|
||||
|
||||
/datum/sprite_accessory/mam_ears/fox
|
||||
/datum/sprite_accessory/ears/mam_ears/fox
|
||||
name = "Fox"
|
||||
icon_state = "fox"
|
||||
|
||||
/datum/sprite_accessory/mam_ears/husky
|
||||
/datum/sprite_accessory/ears/mam_ears/husky
|
||||
name = "Husky"
|
||||
icon_state = "wolf"
|
||||
|
||||
/datum/sprite_accessory/mam_ears/kangaroo
|
||||
/datum/sprite_accessory/ears/mam_ears/kangaroo
|
||||
name = "kangaroo"
|
||||
icon_state = "kangaroo"
|
||||
|
||||
/datum/sprite_accessory/mam_ears/jellyfish
|
||||
/datum/sprite_accessory/ears/mam_ears/jellyfish
|
||||
name = "Jellyfish"
|
||||
icon_state = "jellyfish"
|
||||
color_src = HAIR
|
||||
|
||||
/datum/sprite_accessory/mam_ears/lab
|
||||
/datum/sprite_accessory/ears/mam_ears/lab
|
||||
name = "Dog, Long"
|
||||
icon_state = "lab"
|
||||
|
||||
/datum/sprite_accessory/mam_ears/murid
|
||||
/datum/sprite_accessory/ears/mam_ears/murid
|
||||
name = "Murid"
|
||||
icon_state = "murid"
|
||||
|
||||
/datum/sprite_accessory/mam_ears/otie
|
||||
/datum/sprite_accessory/ears/mam_ears/otie
|
||||
name = "Otusian"
|
||||
icon_state = "otie"
|
||||
|
||||
/datum/sprite_accessory/mam_ears/squirrel
|
||||
/datum/sprite_accessory/ears/mam_ears/squirrel
|
||||
name = "Squirrel"
|
||||
icon_state = "squirrel"
|
||||
|
||||
/datum/sprite_accessory/mam_ears/pede
|
||||
/datum/sprite_accessory/ears/mam_ears/pede
|
||||
name = "Scolipede"
|
||||
icon_state = "pede"
|
||||
|
||||
/datum/sprite_accessory/mam_ears/rabbit
|
||||
/datum/sprite_accessory/ears/mam_ears/rabbit
|
||||
name = "Rabbit"
|
||||
icon_state = "rabbit"
|
||||
|
||||
/datum/sprite_accessory/mam_ears/sergal
|
||||
/datum/sprite_accessory/ears/mam_ears/sergal
|
||||
name = "Sergal"
|
||||
icon_state = "sergal"
|
||||
|
||||
/datum/sprite_accessory/mam_ears/skunk
|
||||
/datum/sprite_accessory/ears/mam_ears/skunk
|
||||
name = "skunk"
|
||||
icon_state = "skunk"
|
||||
|
||||
/datum/sprite_accessory/mam_ears/wolf
|
||||
/datum/sprite_accessory/ears/mam_ears/wolf
|
||||
name = "Wolf"
|
||||
icon_state = "wolf"
|
||||
|
||||
/datum/sprite_accessory/mam_ears/bunny
|
||||
/datum/sprite_accessory/ears/mam_ears/bunny
|
||||
name = "Bunny"
|
||||
icon_state = "bunny"
|
||||
|
||||
@@ -2,6 +2,10 @@
|
||||
icon = 'icons/mob/mutant_bodyparts.dmi'
|
||||
relevant_layers = list(BODY_ADJ_LAYER)
|
||||
|
||||
/datum/sprite_accessory/frills/is_not_visible(var/mob/living/carbon/human/H, var/tauric)
|
||||
var/obj/item/bodypart/head/HD = H.get_bodypart(BODY_ZONE_HEAD)
|
||||
return (!H.dna.features["frills"] || H.dna.features["frills"] == "None" || H.head && (H.head.flags_inv & HIDEEARS) || !HD || HD.status == BODYPART_ROBOTIC)
|
||||
|
||||
/datum/sprite_accessory/frills/none
|
||||
name = "None"
|
||||
icon_state = "none"
|
||||
|
||||
@@ -3,6 +3,10 @@
|
||||
color_src = HORNCOLOR
|
||||
relevant_layers = list(HORNS_LAYER)
|
||||
|
||||
/datum/sprite_accessory/horns/is_not_visible(var/mob/living/carbon/human/H, var/tauric)
|
||||
var/obj/item/bodypart/head/HD = H.get_bodypart(BODY_ZONE_HEAD)
|
||||
return (!H.dna.features["horns"] || H.dna.features["horns"] == "None" || H.head && (H.head.flags_inv & HIDEHAIR) || (H.wear_mask && (H.wear_mask.flags_inv & HIDEHAIR)) || !HD || HD.status == BODYPART_ROBOTIC)
|
||||
|
||||
/datum/sprite_accessory/horns/none
|
||||
name = "None"
|
||||
icon_state = "none"
|
||||
|
||||
@@ -30,6 +30,9 @@
|
||||
var/alt_taur_mode = NONE //Same as above.
|
||||
var/hide_legs = USE_QUADRUPED_CLIP_MASK
|
||||
|
||||
/datum/sprite_accessory/taur/is_not_visible(var/mob/living/carbon/human/H, var/tauric)
|
||||
return (!tauric || (H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR)))
|
||||
|
||||
/datum/sprite_accessory/taur/New()
|
||||
switch(hide_legs)
|
||||
if(USE_QUADRUPED_CLIP_MASK)
|
||||
|
||||
@@ -3,6 +3,10 @@
|
||||
mutant_part_string = "snout"
|
||||
relevant_layers = list(BODY_ADJ_LAYER, BODY_FRONT_LAYER)
|
||||
|
||||
/datum/sprite_accessory/snouts/is_not_visible(var/mob/living/carbon/human/H, var/tauric)
|
||||
var/obj/item/bodypart/head/HD = H.get_bodypart(BODY_ZONE_HEAD)
|
||||
return ((H.wear_mask && (H.wear_mask.flags_inv & HIDESNOUT)) || (H.head && (H.head.flags_inv & HIDESNOUT)) || !HD || HD.status == BODYPART_ROBOTIC)
|
||||
|
||||
/datum/sprite_accessory/snouts/sharp
|
||||
name = "Sharp"
|
||||
icon_state = "sharp"
|
||||
@@ -150,136 +154,140 @@
|
||||
************** Mammal Snouts **************
|
||||
*******************************************/
|
||||
|
||||
/datum/sprite_accessory/mam_snouts
|
||||
/datum/sprite_accessory/snouts/mam_snouts
|
||||
color_src = MATRIXED
|
||||
icon = 'modular_citadel/icons/mob/mam_snouts.dmi'
|
||||
recommended_species = list("mammal", "slimeperson", "insect", "podweak")
|
||||
mutant_part_string = "snout"
|
||||
relevant_layers = list(BODY_ADJ_LAYER, BODY_FRONT_LAYER)
|
||||
|
||||
/datum/sprite_accessory/mam_snouts/none
|
||||
/datum/sprite_accessory/snouts/mam_snouts/is_not_visible(var/mob/living/carbon/human/H, var/tauric)
|
||||
var/obj/item/bodypart/head/HD = H.get_bodypart(BODY_ZONE_HEAD)
|
||||
return ((H.wear_mask && (H.wear_mask.flags_inv & HIDESNOUT)) || (H.head && (H.head.flags_inv & HIDESNOUT)) || !HD || HD.status == BODYPART_ROBOTIC)
|
||||
|
||||
/datum/sprite_accessory/snouts/mam_snouts/none
|
||||
name = "None"
|
||||
icon_state = "none"
|
||||
recommended_species = null
|
||||
relevant_layers = null
|
||||
|
||||
/datum/sprite_accessory/mam_snouts/bird
|
||||
/datum/sprite_accessory/snouts/mam_snouts/bird
|
||||
name = "Beak"
|
||||
icon_state = "bird"
|
||||
|
||||
/datum/sprite_accessory/mam_snouts/bigbeak
|
||||
/datum/sprite_accessory/snouts/mam_snouts/bigbeak
|
||||
name = "Big Beak"
|
||||
icon_state = "bigbeak"
|
||||
|
||||
/datum/sprite_accessory/mam_snouts/bug
|
||||
/datum/sprite_accessory/snouts/mam_snouts/bug
|
||||
name = "Bug"
|
||||
icon_state = "bug"
|
||||
color_src = MUTCOLORS
|
||||
extra2 = TRUE
|
||||
extra2_color_src = MUTCOLORS3
|
||||
|
||||
/datum/sprite_accessory/mam_snouts/elephant
|
||||
/datum/sprite_accessory/snouts/mam_snouts/elephant
|
||||
name = "Elephant"
|
||||
icon_state = "elephant"
|
||||
extra = TRUE
|
||||
extra_color_src = MUTCOLORS3
|
||||
|
||||
/datum/sprite_accessory/mam_snouts/skulldog
|
||||
/datum/sprite_accessory/snouts/mam_snouts/skulldog
|
||||
name = "Skulldog"
|
||||
icon_state = "skulldog"
|
||||
extra = TRUE
|
||||
extra_color_src = MATRIXED
|
||||
|
||||
/datum/sprite_accessory/mam_snouts/lcanid
|
||||
/datum/sprite_accessory/snouts/mam_snouts/lcanid
|
||||
name = "Mammal, Long"
|
||||
icon_state = "lcanid"
|
||||
|
||||
/datum/sprite_accessory/mam_snouts/lcanidalt
|
||||
/datum/sprite_accessory/snouts/mam_snouts/lcanidalt
|
||||
name = "Mammal, Long ALT"
|
||||
icon_state = "lcanidalt"
|
||||
|
||||
/datum/sprite_accessory/mam_snouts/scanid
|
||||
/datum/sprite_accessory/snouts/mam_snouts/scanid
|
||||
name = "Mammal, Short"
|
||||
icon_state = "scanid"
|
||||
|
||||
/datum/sprite_accessory/mam_snouts/scanidalt
|
||||
/datum/sprite_accessory/snouts/mam_snouts/scanidalt
|
||||
name = "Mammal, Short ALT"
|
||||
icon_state = "scanidalt"
|
||||
|
||||
/datum/sprite_accessory/mam_snouts/scanidalt2
|
||||
/datum/sprite_accessory/snouts/mam_snouts/scanidalt2
|
||||
name = "Mammal, Short ALT 2"
|
||||
icon_state = "scanidalt2"
|
||||
|
||||
/datum/sprite_accessory/mam_snouts/wolf
|
||||
/datum/sprite_accessory/snouts/mam_snouts/wolf
|
||||
name = "Mammal, Thick"
|
||||
icon_state = "wolf"
|
||||
|
||||
/datum/sprite_accessory/mam_snouts/wolfalt
|
||||
/datum/sprite_accessory/snouts/mam_snouts/wolfalt
|
||||
name = "Mammal, Thick ALT"
|
||||
icon_state = "wolfalt"
|
||||
|
||||
/datum/sprite_accessory/mam_snouts/redpanda
|
||||
/datum/sprite_accessory/snouts/mam_snouts/redpanda
|
||||
name = "WahCoon"
|
||||
icon_state = "wah"
|
||||
|
||||
/datum/sprite_accessory/mam_snouts/redpandaalt
|
||||
/datum/sprite_accessory/snouts/mam_snouts/redpandaalt
|
||||
name = "WahCoon ALT"
|
||||
icon_state = "wahalt"
|
||||
|
||||
/datum/sprite_accessory/mam_snouts/rhino
|
||||
/datum/sprite_accessory/snouts/mam_snouts/rhino
|
||||
name = "Horn"
|
||||
icon_state = "rhino"
|
||||
extra = TRUE
|
||||
extra = MUTCOLORS3
|
||||
|
||||
/datum/sprite_accessory/mam_snouts/rodent
|
||||
/datum/sprite_accessory/snouts/mam_snouts/rodent
|
||||
name = "Rodent"
|
||||
icon_state = "rodent"
|
||||
|
||||
/datum/sprite_accessory/mam_snouts/husky
|
||||
/datum/sprite_accessory/snouts/mam_snouts/husky
|
||||
name = "Husky"
|
||||
icon_state = "husky"
|
||||
|
||||
/datum/sprite_accessory/mam_snouts/otie
|
||||
/datum/sprite_accessory/snouts/mam_snouts/otie
|
||||
name = "Otie"
|
||||
icon_state = "otie"
|
||||
|
||||
/datum/sprite_accessory/mam_snouts/pede
|
||||
/datum/sprite_accessory/snouts/mam_snouts/pede
|
||||
name = "Scolipede"
|
||||
icon_state = "pede"
|
||||
|
||||
/datum/sprite_accessory/mam_snouts/sergal
|
||||
/datum/sprite_accessory/snouts/mam_snouts/sergal
|
||||
name = "Sergal"
|
||||
icon_state = "sergal"
|
||||
|
||||
/datum/sprite_accessory/mam_snouts/shark
|
||||
/datum/sprite_accessory/snouts/mam_snouts/shark
|
||||
name = "Shark"
|
||||
icon_state = "shark"
|
||||
|
||||
/datum/sprite_accessory/mam_snouts/hshark
|
||||
/datum/sprite_accessory/snouts/mam_snouts/hshark
|
||||
name = "hShark"
|
||||
icon_state = "hshark"
|
||||
|
||||
/datum/sprite_accessory/mam_snouts/toucan
|
||||
/datum/sprite_accessory/snouts/mam_snouts/toucan
|
||||
name = "Toucan"
|
||||
icon_state = "toucan"
|
||||
|
||||
/datum/sprite_accessory/mam_snouts/sharp
|
||||
/datum/sprite_accessory/snouts/mam_snouts/sharp
|
||||
name = "Sharp"
|
||||
icon_state = "sharp"
|
||||
color_src = MUTCOLORS
|
||||
|
||||
/datum/sprite_accessory/mam_snouts/round
|
||||
/datum/sprite_accessory/snouts/mam_snouts/round
|
||||
name = "Round"
|
||||
icon_state = "round"
|
||||
color_src = MUTCOLORS
|
||||
|
||||
/datum/sprite_accessory/mam_snouts/sharplight
|
||||
/datum/sprite_accessory/snouts/mam_snouts/sharplight
|
||||
name = "Sharp + Light"
|
||||
icon_state = "sharplight"
|
||||
color_src = MUTCOLORS
|
||||
|
||||
/datum/sprite_accessory/mam_snouts/roundlight
|
||||
/datum/sprite_accessory/snouts/mam_snouts/roundlight
|
||||
name = "Round + Light"
|
||||
icon_state = "roundlight"
|
||||
color_src = MUTCOLORS
|
||||
@@ -289,109 +297,109 @@
|
||||
**************** Snouts *******************
|
||||
*************but higher up*****************/
|
||||
|
||||
/datum/sprite_accessory/mam_snouts/fbird
|
||||
/datum/sprite_accessory/snouts/mam_snouts/fbird
|
||||
name = "Beak (Top)"
|
||||
icon_state = "fbird"
|
||||
|
||||
/datum/sprite_accessory/mam_snouts/fbigbeak
|
||||
/datum/sprite_accessory/snouts/mam_snouts/fbigbeak
|
||||
name = "Big Beak (Top)"
|
||||
icon_state = "fbigbeak"
|
||||
|
||||
/datum/sprite_accessory/mam_snouts/fbug
|
||||
/datum/sprite_accessory/snouts/mam_snouts/fbug
|
||||
name = "Bug (Top)"
|
||||
icon_state = "fbug"
|
||||
color_src = MUTCOLORS
|
||||
extra2 = TRUE
|
||||
extra2_color_src = MUTCOLORS3
|
||||
|
||||
/datum/sprite_accessory/mam_snouts/felephant
|
||||
/datum/sprite_accessory/snouts/mam_snouts/felephant
|
||||
name = "Elephant (Top)"
|
||||
icon_state = "felephant"
|
||||
extra = TRUE
|
||||
extra_color_src = MUTCOLORS3
|
||||
|
||||
/datum/sprite_accessory/mam_snouts/flcanid
|
||||
/datum/sprite_accessory/snouts/mam_snouts/flcanid
|
||||
name = "Mammal, Long (Top)"
|
||||
icon_state = "flcanid"
|
||||
|
||||
/datum/sprite_accessory/mam_snouts/flcanidalt
|
||||
/datum/sprite_accessory/snouts/mam_snouts/flcanidalt
|
||||
name = "Mammal, Long ALT (Top)"
|
||||
icon_state = "flcanidalt"
|
||||
|
||||
/datum/sprite_accessory/mam_snouts/fscanid
|
||||
/datum/sprite_accessory/snouts/mam_snouts/fscanid
|
||||
name = "Mammal, Short (Top)"
|
||||
icon_state = "fscanid"
|
||||
|
||||
/datum/sprite_accessory/mam_snouts/fscanidalt
|
||||
/datum/sprite_accessory/snouts/mam_snouts/fscanidalt
|
||||
name = "Mammal, Short ALT (Top)"
|
||||
icon_state = "fscanidalt"
|
||||
|
||||
/datum/sprite_accessory/mam_snouts/fscanidalt2
|
||||
/datum/sprite_accessory/snouts/mam_snouts/fscanidalt2
|
||||
name = "Mammal, Short ALT 2 (Top)"
|
||||
icon_state = "fscanidalt2"
|
||||
|
||||
/datum/sprite_accessory/mam_snouts/fwolf
|
||||
/datum/sprite_accessory/snouts/mam_snouts/fwolf
|
||||
name = "Mammal, Thick (Top)"
|
||||
icon_state = "fwolf"
|
||||
|
||||
/datum/sprite_accessory/mam_snouts/fwolfalt
|
||||
/datum/sprite_accessory/snouts/mam_snouts/fwolfalt
|
||||
name = "Mammal, Thick ALT (Top)"
|
||||
icon_state = "fwolfalt"
|
||||
|
||||
/datum/sprite_accessory/mam_snouts/fredpanda
|
||||
/datum/sprite_accessory/snouts/mam_snouts/fredpanda
|
||||
name = "WahCoon (Top)"
|
||||
icon_state = "fwah"
|
||||
|
||||
/datum/sprite_accessory/mam_snouts/frhino
|
||||
/datum/sprite_accessory/snouts/mam_snouts/frhino
|
||||
name = "Horn (Top)"
|
||||
icon_state = "frhino"
|
||||
extra = TRUE
|
||||
extra = MUTCOLORS3
|
||||
|
||||
/datum/sprite_accessory/mam_snouts/frodent
|
||||
/datum/sprite_accessory/snouts/mam_snouts/frodent
|
||||
name = "Rodent (Top)"
|
||||
icon_state = "frodent"
|
||||
|
||||
/datum/sprite_accessory/mam_snouts/fhusky
|
||||
/datum/sprite_accessory/snouts/mam_snouts/fhusky
|
||||
name = "Husky (Top)"
|
||||
icon_state = "fhusky"
|
||||
|
||||
/datum/sprite_accessory/mam_snouts/fotie
|
||||
/datum/sprite_accessory/snouts/mam_snouts/fotie
|
||||
name = "Otie (Top)"
|
||||
icon_state = "fotie"
|
||||
|
||||
/datum/sprite_accessory/mam_snouts/fpede
|
||||
/datum/sprite_accessory/snouts/mam_snouts/fpede
|
||||
name = "Scolipede (Top)"
|
||||
icon_state = "fpede"
|
||||
|
||||
/datum/sprite_accessory/mam_snouts/fsergal
|
||||
/datum/sprite_accessory/snouts/mam_snouts/fsergal
|
||||
name = "Sergal (Top)"
|
||||
icon_state = "fsergal"
|
||||
|
||||
/datum/sprite_accessory/mam_snouts/fshark
|
||||
/datum/sprite_accessory/snouts/mam_snouts/fshark
|
||||
name = "Shark (Top)"
|
||||
icon_state = "fshark"
|
||||
|
||||
/datum/sprite_accessory/mam_snouts/ftoucan
|
||||
/datum/sprite_accessory/snouts/mam_snouts/ftoucan
|
||||
name = "Toucan (Top)"
|
||||
icon_state = "ftoucan"
|
||||
|
||||
/datum/sprite_accessory/mam_snouts/fsharp
|
||||
/datum/sprite_accessory/snouts/mam_snouts/fsharp
|
||||
name = "Sharp (Top)"
|
||||
icon_state = "fsharp"
|
||||
color_src = MUTCOLORS
|
||||
|
||||
/datum/sprite_accessory/mam_snouts/fround
|
||||
/datum/sprite_accessory/snouts/mam_snouts/fround
|
||||
name = "Round (Top)"
|
||||
icon_state = "fround"
|
||||
color_src = MUTCOLORS
|
||||
|
||||
/datum/sprite_accessory/mam_snouts/fsharplight
|
||||
/datum/sprite_accessory/snouts/mam_snouts/fsharplight
|
||||
name = "Sharp + Light (Top)"
|
||||
icon_state = "fsharplight"
|
||||
color_src = MUTCOLORS
|
||||
|
||||
/datum/sprite_accessory/mam_snouts/froundlight
|
||||
/datum/sprite_accessory/snouts/mam_snouts/froundlight
|
||||
name = "Round + Light (Top)"
|
||||
icon_state = "froundlight"
|
||||
color_src = MUTCOLORS
|
||||
|
||||
@@ -2,10 +2,16 @@
|
||||
icon = 'icons/mob/mutant_bodyparts.dmi'
|
||||
relevant_layers = list(BODY_BEHIND_LAYER, BODY_ADJ_LAYER)
|
||||
|
||||
/datum/sprite_accessory/spines/is_not_visible(var/mob/living/carbon/human/H, var/tauric)
|
||||
return (!H.dna.features["spines"] || H.dna.features["spines"] == "None" || H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR))
|
||||
|
||||
/datum/sprite_accessory/spines_animated
|
||||
icon = 'icons/mob/mutant_bodyparts.dmi'
|
||||
relevant_layers = list(BODY_BEHIND_LAYER, BODY_ADJ_LAYER)
|
||||
|
||||
/datum/sprite_accessory/spines_animated/is_not_visible(var/mob/living/carbon/human/H, var/tauric)
|
||||
return ((!H.dna.features["spines"] || H.dna.features["spines"] == "None" || H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR)) || H.dna.species.mutant_bodyparts["tail"])
|
||||
|
||||
/datum/sprite_accessory/spines/none
|
||||
name = "None"
|
||||
icon_state = "none"
|
||||
|
||||
@@ -1,24 +1,24 @@
|
||||
//Synth snouts (This is the most important part)
|
||||
/datum/sprite_accessory/mam_snouts/synthliz
|
||||
/datum/sprite_accessory/snouts/mam_snouts/synthliz
|
||||
recommended_species = list("synthliz")
|
||||
icon = 'modular_citadel/icons/mob/synthliz_snouts.dmi'
|
||||
color_src = MUTCOLORS
|
||||
name = "Synthetic Lizard - Snout"
|
||||
icon_state = "synthliz_basic"
|
||||
|
||||
/datum/sprite_accessory/mam_snouts/synthliz/synthliz_under
|
||||
/datum/sprite_accessory/snouts/mam_snouts/synthliz/synthliz_under
|
||||
icon = 'modular_citadel/icons/mob/synthliz_snouts.dmi'
|
||||
color_src = MATRIXED
|
||||
name = "Synthetic Lizard - Snout Under"
|
||||
icon_state = "synthliz_under"
|
||||
|
||||
/datum/sprite_accessory/mam_snouts/synthliz/synthliz_tert
|
||||
/datum/sprite_accessory/snouts/mam_snouts/synthliz/synthliz_tert
|
||||
icon = 'modular_citadel/icons/mob/synthliz_snouts.dmi'
|
||||
color_src = MATRIXED
|
||||
name = "Synthetic Lizard - Snout Tertiary"
|
||||
icon_state = "synthliz_tert"
|
||||
|
||||
/datum/sprite_accessory/mam_snouts/synthliz/synthliz_tertunder
|
||||
/datum/sprite_accessory/snouts/mam_snouts/synthliz/synthliz_tertunder
|
||||
icon = 'modular_citadel/icons/mob/synthliz_snouts.dmi'
|
||||
color_src = MATRIXED
|
||||
name = "Synthetic Lizard - Snout Tertiary Under"
|
||||
@@ -42,14 +42,14 @@
|
||||
icon_state = "synthlizpecslight"
|
||||
|
||||
//Synth tails
|
||||
/datum/sprite_accessory/mam_tails/synthliz
|
||||
/datum/sprite_accessory/tails/mam_tails/synthliz
|
||||
recommended_species = list("synthliz")
|
||||
icon = 'modular_citadel/icons/mob/synthliz_tails.dmi'
|
||||
color_src = MUTCOLORS
|
||||
name = "Synthetic Lizard"
|
||||
icon_state = "synthliz"
|
||||
|
||||
/datum/sprite_accessory/mam_tails_animated/synthliz
|
||||
/datum/sprite_accessory/tails_animated/mam_tails_animated/synthliz
|
||||
recommended_species = list("synthliz")
|
||||
icon = 'modular_citadel/icons/mob/synthliz_tails.dmi'
|
||||
color_src = MUTCOLORS
|
||||
|
||||
@@ -3,6 +3,9 @@
|
||||
mutant_part_string = "tail"
|
||||
relevant_layers = list(BODY_BEHIND_LAYER, BODY_FRONT_LAYER)
|
||||
|
||||
/datum/sprite_accessory/tails/is_not_visible(var/mob/living/carbon/human/H, var/tauric)
|
||||
return ((H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR)) || tauric)
|
||||
|
||||
/datum/sprite_accessory/tails_animated
|
||||
icon = 'icons/mob/mutant_bodyparts.dmi'
|
||||
mutant_part_string = "tailwag"
|
||||
@@ -12,6 +15,9 @@
|
||||
************* Lizard Tails ****************
|
||||
*******************************************/
|
||||
|
||||
/datum/sprite_accessory/tails_animated/lizard/is_not_visible(var/mob/living/carbon/human/H, var/tauric)
|
||||
return (((H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR)) || tauric) || H.dna.species.mutant_bodyparts["tail_lizard"])
|
||||
|
||||
/datum/sprite_accessory/tails/lizard/smooth
|
||||
name = "Smooth"
|
||||
icon_state = "smooth"
|
||||
@@ -98,6 +104,9 @@
|
||||
icon_state = "none"
|
||||
relevant_layers = null
|
||||
|
||||
/datum/sprite_accessory/tails_animated/human/is_not_visible(var/mob/living/carbon/human/H, var/tauric)
|
||||
return (((H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR)) || tauric)|| H.dna.species.mutant_bodyparts["tail_human"])
|
||||
|
||||
/datum/sprite_accessory/tails/human/ailurus
|
||||
name = "Red Panda"
|
||||
icon_state = "wah"
|
||||
@@ -122,22 +131,22 @@
|
||||
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
|
||||
color_src = MATRIXED
|
||||
|
||||
/datum/sprite_accessory/mam_tails/batl
|
||||
/datum/sprite_accessory/tails/mam_tails/batl
|
||||
name = "Bat (Long)"
|
||||
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
|
||||
icon_state = "batl"
|
||||
|
||||
/datum/sprite_accessory/mam_tails_animated/batl
|
||||
/datum/sprite_accessory/tails_animated/mam_tails_animated/batl
|
||||
name = "Bat (Long)"
|
||||
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
|
||||
icon_state = "batl"
|
||||
|
||||
/datum/sprite_accessory/mam_tails/bats
|
||||
/datum/sprite_accessory/tails/mam_tails/bats
|
||||
name = "Bat (Short)"
|
||||
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
|
||||
icon_state = "bats"
|
||||
|
||||
/datum/sprite_accessory/mam_tails_animated/bats
|
||||
/datum/sprite_accessory/tails_animated/mam_tails_animated/bats
|
||||
name = "Bat (Short)"
|
||||
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
|
||||
icon_state = "bats"
|
||||
@@ -518,368 +527,371 @@
|
||||
************** Furry Tails ****************
|
||||
*******************************************/
|
||||
|
||||
/datum/sprite_accessory/mam_tails
|
||||
/datum/sprite_accessory/tails/mam_tails
|
||||
color_src = MATRIXED
|
||||
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
|
||||
recommended_species = list("mammal", "slimeperson", "podweak", "felinid", "insect")
|
||||
mutant_part_string = "tail"
|
||||
relevant_layers = list(BODY_BEHIND_LAYER, BODY_FRONT_LAYER)
|
||||
|
||||
/datum/sprite_accessory/mam_tails/none
|
||||
/datum/sprite_accessory/tails/mam_tails/none
|
||||
name = "None"
|
||||
icon_state = "none"
|
||||
recommended_species = null
|
||||
relevant_layers = null
|
||||
|
||||
/datum/sprite_accessory/mam_tails_animated
|
||||
/datum/sprite_accessory/tails_animated/mam_tails_animated
|
||||
color_src = MATRIXED
|
||||
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
|
||||
mutant_part_string = "tailwag"
|
||||
relevant_layers = list(BODY_BEHIND_LAYER, BODY_FRONT_LAYER)
|
||||
|
||||
/datum/sprite_accessory/mam_tails_animated/none
|
||||
/datum/sprite_accessory/tails_animated/mam_tails_animated/is_not_visible(var/mob/living/carbon/human/H, var/tauric)
|
||||
return (((H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR)) || tauric) || H.dna.species.mutant_bodyparts["mam_tail"])
|
||||
|
||||
/datum/sprite_accessory/tails_animated/mam_tails_animated/none
|
||||
name = "None"
|
||||
icon_state = "none"
|
||||
relevant_layers = null
|
||||
|
||||
/datum/sprite_accessory/mam_tails/ailurus
|
||||
/datum/sprite_accessory/tails/mam_tails/ailurus
|
||||
name = "Red Panda"
|
||||
icon_state = "wah"
|
||||
extra = TRUE
|
||||
|
||||
/datum/sprite_accessory/mam_tails_animated/ailurus
|
||||
/datum/sprite_accessory/tails_animated/mam_tails_animated/ailurus
|
||||
name = "Red Panda"
|
||||
icon_state = "wah"
|
||||
extra = TRUE
|
||||
|
||||
/datum/sprite_accessory/mam_tails/axolotl
|
||||
/datum/sprite_accessory/tails/mam_tails/axolotl
|
||||
name = "Axolotl"
|
||||
icon_state = "axolotl"
|
||||
|
||||
/datum/sprite_accessory/mam_tails_animated/axolotl
|
||||
/datum/sprite_accessory/tails_animated/mam_tails_animated/axolotl
|
||||
name = "Axolotl"
|
||||
icon_state = "axolotl"
|
||||
|
||||
/datum/sprite_accessory/mam_tails/batl
|
||||
/datum/sprite_accessory/tails/mam_tails/batl
|
||||
name = "Bat (Long)"
|
||||
icon_state = "batl"
|
||||
|
||||
/datum/sprite_accessory/mam_tails_animated/batl
|
||||
/datum/sprite_accessory/tails_animated/mam_tails_animated/batl
|
||||
name = "Bat (Long)"
|
||||
icon_state = "batl"
|
||||
|
||||
/datum/sprite_accessory/mam_tails/bats
|
||||
/datum/sprite_accessory/tails/mam_tails/bats
|
||||
name = "Bat (Short)"
|
||||
icon_state = "bats"
|
||||
|
||||
/datum/sprite_accessory/mam_tails_animated/bats
|
||||
/datum/sprite_accessory/tails_animated/mam_tails_animated/bats
|
||||
name = "Bat (Short)"
|
||||
icon_state = "bats"
|
||||
|
||||
/datum/sprite_accessory/mam_tails/bee
|
||||
/datum/sprite_accessory/tails/mam_tails/bee
|
||||
name = "Bee"
|
||||
icon_state = "bee"
|
||||
|
||||
/datum/sprite_accessory/mam_tails_animated/bee
|
||||
/datum/sprite_accessory/tails_animated/mam_tails_animated/bee
|
||||
name = "Bee"
|
||||
icon_state = "bee"
|
||||
|
||||
/datum/sprite_accessory/mam_tails/cat
|
||||
/datum/sprite_accessory/tails/mam_tails/cat
|
||||
name = "Cat"
|
||||
icon_state = "cat"
|
||||
color_src = HAIR
|
||||
|
||||
/datum/sprite_accessory/mam_tails_animated/cat
|
||||
/datum/sprite_accessory/tails_animated/mam_tails_animated/cat
|
||||
name = "Cat"
|
||||
icon_state = "cat"
|
||||
color_src = HAIR
|
||||
|
||||
/datum/sprite_accessory/mam_tails/catbig
|
||||
/datum/sprite_accessory/tails/mam_tails/catbig
|
||||
name = "Cat, Big"
|
||||
icon_state = "catbig"
|
||||
|
||||
/datum/sprite_accessory/mam_tails_animated/catbig
|
||||
/datum/sprite_accessory/tails_animated/mam_tails_animated/catbig
|
||||
name = "Cat, Big"
|
||||
icon_state = "catbig"
|
||||
|
||||
/datum/sprite_accessory/mam_tails/twocat
|
||||
/datum/sprite_accessory/tails/mam_tails/twocat
|
||||
name = "Cat, Double"
|
||||
icon_state = "twocat"
|
||||
|
||||
/datum/sprite_accessory/mam_tails_animated/twocat
|
||||
/datum/sprite_accessory/tails_animated/mam_tails_animated/twocat
|
||||
name = "Cat, Double"
|
||||
icon_state = "twocat"
|
||||
|
||||
/datum/sprite_accessory/mam_tails/corvid
|
||||
/datum/sprite_accessory/tails/mam_tails/corvid
|
||||
name = "Corvid"
|
||||
icon_state = "crow"
|
||||
|
||||
/datum/sprite_accessory/mam_tails_animated/corvid
|
||||
/datum/sprite_accessory/tails_animated/mam_tails_animated/corvid
|
||||
name = "Corvid"
|
||||
icon_state = "crow"
|
||||
|
||||
/datum/sprite_accessory/mam_tail/cow
|
||||
/datum/sprite_accessory/tails/mam_tail/cow
|
||||
name = "Cow"
|
||||
icon_state = "cow"
|
||||
|
||||
/datum/sprite_accessory/mam_tails_animated/cow
|
||||
/datum/sprite_accessory/tails_animated/mam_tails_animated/cow
|
||||
name = "Cow"
|
||||
icon_state = "cow"
|
||||
|
||||
/datum/sprite_accessory/mam_tails/eevee
|
||||
/datum/sprite_accessory/tails/mam_tails/eevee
|
||||
name = "Eevee"
|
||||
icon_state = "eevee"
|
||||
|
||||
/datum/sprite_accessory/mam_tails_animated/eevee
|
||||
/datum/sprite_accessory/tails_animated/mam_tails_animated/eevee
|
||||
name = "Eevee"
|
||||
icon_state = "eevee"
|
||||
|
||||
/datum/sprite_accessory/mam_tails/fennec
|
||||
/datum/sprite_accessory/tails/mam_tails/fennec
|
||||
name = "Fennec"
|
||||
icon_state = "fennec"
|
||||
|
||||
/datum/sprite_accessory/mam_tails_animated/fennec
|
||||
/datum/sprite_accessory/tails_animated/mam_tails_animated/fennec
|
||||
name = "Fennec"
|
||||
icon_state = "fennec"
|
||||
|
||||
/datum/sprite_accessory/mam_tails/human/fish
|
||||
/datum/sprite_accessory/tails/mam_tails/human/fish
|
||||
name = "Fish"
|
||||
icon_state = "fish"
|
||||
|
||||
/datum/sprite_accessory/mam_tails_animated/human/fish
|
||||
/datum/sprite_accessory/tails_animated/mam_tails_animated/human/fish
|
||||
name = "Fish"
|
||||
icon_state = "fish"
|
||||
|
||||
/datum/sprite_accessory/mam_tails/fox
|
||||
/datum/sprite_accessory/tails/mam_tails/fox
|
||||
name = "Fox"
|
||||
icon_state = "fox"
|
||||
|
||||
/datum/sprite_accessory/mam_tails_animated/fox
|
||||
/datum/sprite_accessory/tails_animated/mam_tails_animated/fox
|
||||
name = "Fox"
|
||||
icon_state = "fox"
|
||||
|
||||
/datum/sprite_accessory/mam_tails/hawk
|
||||
/datum/sprite_accessory/tails/mam_tails/hawk
|
||||
name = "Hawk"
|
||||
icon_state = "hawk"
|
||||
|
||||
/datum/sprite_accessory/mam_tails_animated/hawk
|
||||
/datum/sprite_accessory/tails_animated/mam_tails_animated/hawk
|
||||
name = "Hawk"
|
||||
icon_state = "hawk"
|
||||
|
||||
/datum/sprite_accessory/mam_tails/horse
|
||||
/datum/sprite_accessory/tails/mam_tails/horse
|
||||
name = "Horse"
|
||||
icon_state = "horse"
|
||||
color_src = HAIR
|
||||
|
||||
/datum/sprite_accessory/mam_tails_animated/horse
|
||||
/datum/sprite_accessory/tails_animated/mam_tails_animated/horse
|
||||
name = "Horse"
|
||||
icon_state = "horse"
|
||||
color_src = HAIR
|
||||
|
||||
/datum/sprite_accessory/mam_tails/husky
|
||||
/datum/sprite_accessory/tails/mam_tails/husky
|
||||
name = "Husky"
|
||||
icon_state = "husky"
|
||||
|
||||
/datum/sprite_accessory/mam_tails_animated/husky
|
||||
/datum/sprite_accessory/tails_animated/mam_tails_animated/husky
|
||||
name = "Husky"
|
||||
icon_state = "husky"
|
||||
|
||||
datum/sprite_accessory/mam_tails/insect
|
||||
datum/sprite_accessory/tails/mam_tails/insect
|
||||
name = "Insect"
|
||||
icon_state = "insect"
|
||||
|
||||
/datum/sprite_accessory/mam_tails_animated/insect
|
||||
/datum/sprite_accessory/tails_animated/mam_tails_animated/insect
|
||||
name = "Insect"
|
||||
icon_state = "insect"
|
||||
|
||||
/datum/sprite_accessory/mam_tails/kangaroo
|
||||
/datum/sprite_accessory/tails/mam_tails/kangaroo
|
||||
name = "kangaroo"
|
||||
icon_state = "kangaroo"
|
||||
|
||||
/datum/sprite_accessory/mam_tails_animated/kangaroo
|
||||
/datum/sprite_accessory/tails_animated/mam_tails_animated/kangaroo
|
||||
name = "kangaroo"
|
||||
icon_state = "kangaroo"
|
||||
|
||||
/datum/sprite_accessory/mam_tails/kitsune
|
||||
/datum/sprite_accessory/tails/mam_tails/kitsune
|
||||
name = "Kitsune"
|
||||
icon_state = "kitsune"
|
||||
|
||||
/datum/sprite_accessory/mam_tails_animated/kitsune
|
||||
/datum/sprite_accessory/tails_animated/mam_tails_animated/kitsune
|
||||
name = "Kitsune"
|
||||
icon_state = "kitsune"
|
||||
|
||||
/datum/sprite_accessory/mam_tails/lab
|
||||
/datum/sprite_accessory/tails/mam_tails/lab
|
||||
name = "Lab"
|
||||
icon_state = "lab"
|
||||
|
||||
/datum/sprite_accessory/mam_tails_animated/lab
|
||||
/datum/sprite_accessory/tails_animated/mam_tails_animated/lab
|
||||
name = "Lab"
|
||||
icon_state = "lab"
|
||||
|
||||
/datum/sprite_accessory/mam_tails/murid
|
||||
/datum/sprite_accessory/tails/mam_tails/murid
|
||||
name = "Murid"
|
||||
icon_state = "murid"
|
||||
|
||||
/datum/sprite_accessory/mam_tails_animated/murid
|
||||
/datum/sprite_accessory/tails_animated/mam_tails_animated/murid
|
||||
name = "Murid"
|
||||
icon_state = "murid"
|
||||
|
||||
/datum/sprite_accessory/mam_tails/otie
|
||||
/datum/sprite_accessory/tails/mam_tails/otie
|
||||
name = "Otusian"
|
||||
icon_state = "otie"
|
||||
|
||||
/datum/sprite_accessory/mam_tails_animated/otie
|
||||
/datum/sprite_accessory/tails_animated/mam_tails_animated/otie
|
||||
name = "Otusian"
|
||||
icon_state = "otie"
|
||||
|
||||
/datum/sprite_accessory/mam_tails/orca
|
||||
/datum/sprite_accessory/tails/mam_tails/orca
|
||||
name = "Orca"
|
||||
icon_state = "orca"
|
||||
|
||||
/datum/sprite_accessory/mam_tails_animated/orca
|
||||
/datum/sprite_accessory/tails_animated/mam_tails_animated/orca
|
||||
name = "Orca"
|
||||
icon_state = "orca"
|
||||
|
||||
/datum/sprite_accessory/mam_tails/pede
|
||||
/datum/sprite_accessory/tails/mam_tails/pede
|
||||
name = "Scolipede"
|
||||
icon_state = "pede"
|
||||
|
||||
/datum/sprite_accessory/mam_tails_animated/pede
|
||||
/datum/sprite_accessory/tails_animated/mam_tails_animated/pede
|
||||
name = "Scolipede"
|
||||
icon_state = "pede"
|
||||
|
||||
/datum/sprite_accessory/mam_tails/rabbit
|
||||
/datum/sprite_accessory/tails/mam_tails/rabbit
|
||||
name = "Rabbit"
|
||||
icon_state = "rabbit"
|
||||
|
||||
/datum/sprite_accessory/mam_tails_animated/rabbit
|
||||
/datum/sprite_accessory/tails_animated/mam_tails_animated/rabbit
|
||||
name = "Rabbit"
|
||||
icon_state = "rabbit"
|
||||
|
||||
/datum/sprite_accessory/mam_tails/sergal
|
||||
/datum/sprite_accessory/tails/mam_tails/sergal
|
||||
name = "Sergal"
|
||||
icon_state = "sergal"
|
||||
|
||||
/datum/sprite_accessory/mam_tails_animated/sergal
|
||||
/datum/sprite_accessory/tails_animated/mam_tails_animated/sergal
|
||||
name = "Sergal"
|
||||
icon_state = "sergal"
|
||||
|
||||
/datum/sprite_accessory/mam_tails/skunk
|
||||
/datum/sprite_accessory/tails/mam_tails/skunk
|
||||
name = "Skunk"
|
||||
icon_state = "skunk"
|
||||
|
||||
/datum/sprite_accessory/mam_tails_animated/skunk
|
||||
/datum/sprite_accessory/tails_animated/mam_tails_animated/skunk
|
||||
name = "Skunk"
|
||||
icon_state = "skunk"
|
||||
|
||||
/datum/sprite_accessory/mam_tails/smooth
|
||||
/datum/sprite_accessory/tails/mam_tails/smooth
|
||||
name = "Smooth"
|
||||
icon_state = "smooth"
|
||||
color_src = MUTCOLORS
|
||||
icon = 'icons/mob/mutant_bodyparts.dmi'
|
||||
|
||||
/datum/sprite_accessory/mam_tails_animated/smooth
|
||||
/datum/sprite_accessory/tails_animated/mam_tails_animated/smooth
|
||||
name = "Smooth"
|
||||
icon_state = "smooth"
|
||||
color_src = MUTCOLORS
|
||||
icon = 'icons/mob/mutant_bodyparts.dmi'
|
||||
|
||||
/datum/sprite_accessory/mam_tails_animated/spikes
|
||||
/datum/sprite_accessory/tails_animated/mam_tails_animated/spikes
|
||||
name = "Spikes"
|
||||
icon_state = "spikes"
|
||||
color_src = MUTCOLORS
|
||||
icon = 'icons/mob/mutant_bodyparts.dmi'
|
||||
|
||||
/datum/sprite_accessory/mam_tails/spikes
|
||||
/datum/sprite_accessory/tails/mam_tails/spikes
|
||||
name = "Spikes"
|
||||
icon_state = "spikes"
|
||||
color_src = MUTCOLORS
|
||||
icon = 'icons/mob/mutant_bodyparts.dmi'
|
||||
|
||||
/datum/sprite_accessory/mam_tails/shark
|
||||
/datum/sprite_accessory/tails/mam_tails/shark
|
||||
name = "Shark"
|
||||
icon_state = "shark"
|
||||
|
||||
/datum/sprite_accessory/mam_tails_animated/shark
|
||||
/datum/sprite_accessory/tails_animated/mam_tails_animated/shark
|
||||
name = "Shark"
|
||||
icon_state = "shark"
|
||||
|
||||
/datum/sprite_accessory/mam_tails/shepherd
|
||||
/datum/sprite_accessory/tails/mam_tails/shepherd
|
||||
name = "Shepherd"
|
||||
icon_state = "shepherd"
|
||||
|
||||
/datum/sprite_accessory/mam_tails_animated/shepherd
|
||||
/datum/sprite_accessory/tails_animated/mam_tails_animated/shepherd
|
||||
name = "Shepherd"
|
||||
icon_state = "shepherd"
|
||||
|
||||
/datum/sprite_accessory/mam_tails/straighttail
|
||||
/datum/sprite_accessory/tails/mam_tails/straighttail
|
||||
name = "Straight Tail"
|
||||
icon_state = "straighttail"
|
||||
|
||||
/datum/sprite_accessory/mam_tails_animated/straighttail
|
||||
/datum/sprite_accessory/tails_animated/mam_tails_animated/straighttail
|
||||
name = "Straight Tail"
|
||||
icon_state = "straighttail"
|
||||
|
||||
/datum/sprite_accessory/mam_tails/squirrel
|
||||
/datum/sprite_accessory/tails/mam_tails/squirrel
|
||||
name = "Squirrel"
|
||||
icon_state = "squirrel"
|
||||
|
||||
/datum/sprite_accessory/mam_tails_animated/squirrel
|
||||
/datum/sprite_accessory/tails_animated/mam_tails_animated/squirrel
|
||||
name = "Squirrel"
|
||||
icon_state = "squirrel"
|
||||
|
||||
/datum/sprite_accessory/mam_tails/tamamo_kitsune
|
||||
/datum/sprite_accessory/tails/mam_tails/tamamo_kitsune
|
||||
name = "Tamamo Kitsune Tails"
|
||||
icon_state = "9sune"
|
||||
|
||||
/datum/sprite_accessory/mam_tails_animated/tamamo_kitsune
|
||||
/datum/sprite_accessory/tails_animated/mam_tails_animated/tamamo_kitsune
|
||||
name = "Tamamo Kitsune Tails"
|
||||
icon_state = "9sune"
|
||||
|
||||
/datum/sprite_accessory/mam_tails/tentacle
|
||||
/datum/sprite_accessory/tails/mam_tails/tentacle
|
||||
name = "Tentacle"
|
||||
icon_state = "tentacle"
|
||||
|
||||
/datum/sprite_accessory/mam_tails_animated/tentacle
|
||||
/datum/sprite_accessory/tails_animated/mam_tails_animated/tentacle
|
||||
name = "Tentacle"
|
||||
icon_state = "tentacle"
|
||||
|
||||
/datum/sprite_accessory/mam_tails/tiger
|
||||
/datum/sprite_accessory/tails/mam_tails/tiger
|
||||
name = "Tiger"
|
||||
icon_state = "tiger"
|
||||
|
||||
/datum/sprite_accessory/mam_tails_animated/tiger
|
||||
/datum/sprite_accessory/tails_animated/mam_tails_animated/tiger
|
||||
name = "Tiger"
|
||||
icon_state = "tiger"
|
||||
|
||||
/datum/sprite_accessory/mam_tails/dtiger
|
||||
/datum/sprite_accessory/tails/mam_tails/dtiger
|
||||
name = "Dark Tiger"
|
||||
icon_state = "dtiger"
|
||||
color_src = MUTCOLORS
|
||||
icon = 'icons/mob/mutant_bodyparts.dmi'
|
||||
|
||||
/datum/sprite_accessory/mam_tails_animated/dtiger
|
||||
/datum/sprite_accessory/tails_animated/mam_tails_animated/dtiger
|
||||
name = "Dark Tiger"
|
||||
icon_state = "dtiger"
|
||||
color_src = MUTCOLORS
|
||||
icon = 'icons/mob/mutant_bodyparts.dmi'
|
||||
|
||||
/datum/sprite_accessory/mam_tails/ltiger
|
||||
/datum/sprite_accessory/tails/mam_tails/ltiger
|
||||
name = "Light Tiger"
|
||||
icon_state = "ltiger"
|
||||
color_src = MUTCOLORS
|
||||
icon = 'icons/mob/mutant_bodyparts.dmi'
|
||||
|
||||
/datum/sprite_accessory/mam_tails_animated/ltiger
|
||||
/datum/sprite_accessory/tails_animated/mam_tails_animated/ltiger
|
||||
name = "Light Tiger"
|
||||
icon_state = "ltiger"
|
||||
color_src = MUTCOLORS
|
||||
icon = 'icons/mob/mutant_bodyparts.dmi'
|
||||
|
||||
/datum/sprite_accessory/mam_tails/wolf
|
||||
/datum/sprite_accessory/tails/mam_tails/wolf
|
||||
name = "Wolf"
|
||||
icon_state = "wolf"
|
||||
|
||||
/datum/sprite_accessory/mam_tails_animated/wolf
|
||||
/datum/sprite_accessory/tails_animated/mam_tails_animated/wolf
|
||||
name = "Wolf"
|
||||
icon_state = "wolf"
|
||||
|
||||
@@ -5,10 +5,16 @@
|
||||
icon_state = "none"
|
||||
relevant_layers = null
|
||||
|
||||
/datum/sprite_accessory/wings/is_not_visible(var/mob/living/carbon/human/H, var/tauric)
|
||||
return (!H.dna.features["wings"] || H.dna.features["wings"] == "None" || (H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT) && (!H.wear_suit.species_exception || !is_type_in_list(src, H.wear_suit.species_exception))))
|
||||
|
||||
/datum/sprite_accessory/wings_open
|
||||
icon = 'icons/mob/wings.dmi'
|
||||
relevant_layers = list(BODY_BEHIND_LAYER, BODY_ADJ_LAYER, BODY_FRONT_LAYER)
|
||||
|
||||
/datum/sprite_accessory/wings_open/is_not_visible(var/mob/living/carbon/human/H, var/tauric)
|
||||
return (H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT) && (!H.wear_suit.species_exception || !is_type_in_list(src, H.wear_suit.species_exception)) || H.dna.species.mutant_bodyparts["wings"])
|
||||
|
||||
/datum/sprite_accessory/wings_open/angel
|
||||
name = "Angel"
|
||||
icon_state = "angel"
|
||||
|
||||
@@ -642,106 +642,19 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
|
||||
if(!mutant_bodyparts)
|
||||
return
|
||||
|
||||
var/obj/item/bodypart/head/HD = H.get_bodypart(BODY_ZONE_HEAD)
|
||||
var/tauric = mutant_bodyparts["taur"] && H.dna.features["taur"] && H.dna.features["taur"] != "None"
|
||||
|
||||
if(mutant_bodyparts["tail_lizard"])
|
||||
if((H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR)) || tauric)
|
||||
bodyparts_to_add -= "tail_lizard"
|
||||
|
||||
if(mutant_bodyparts["waggingtail_lizard"])
|
||||
if((H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR)) || tauric)
|
||||
bodyparts_to_add -= "waggingtail_lizard"
|
||||
else if (mutant_bodyparts["tail_lizard"])
|
||||
bodyparts_to_add -= "waggingtail_lizard"
|
||||
|
||||
if(mutant_bodyparts["tail_human"])
|
||||
if((H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR)) || tauric)
|
||||
bodyparts_to_add -= "tail_human"
|
||||
|
||||
if(mutant_bodyparts["waggingtail_human"])
|
||||
if((H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR)) || tauric)
|
||||
bodyparts_to_add -= "waggingtail_human"
|
||||
else if (mutant_bodyparts["tail_human"])
|
||||
bodyparts_to_add -= "waggingtail_human"
|
||||
|
||||
if(mutant_bodyparts["spines"])
|
||||
if(!H.dna.features["spines"] || H.dna.features["spines"] == "None" || H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR))
|
||||
bodyparts_to_add -= "spines"
|
||||
|
||||
if(mutant_bodyparts["waggingspines"])
|
||||
if(!H.dna.features["spines"] || H.dna.features["spines"] == "None" || H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR))
|
||||
bodyparts_to_add -= "waggingspines"
|
||||
else if (mutant_bodyparts["tail"])
|
||||
bodyparts_to_add -= "waggingspines"
|
||||
|
||||
if(mutant_bodyparts["snout"]) //Take a closer look at that snout!
|
||||
if((H.wear_mask && (H.wear_mask.flags_inv & HIDESNOUT)) || (H.head && (H.head.flags_inv & HIDESNOUT)) || !HD || HD.status == BODYPART_ROBOTIC)
|
||||
bodyparts_to_add -= "snout"
|
||||
|
||||
if(mutant_bodyparts["frills"])
|
||||
if(!H.dna.features["frills"] || H.dna.features["frills"] == "None" || H.head && (H.head.flags_inv & HIDEEARS) || !HD || HD.status == BODYPART_ROBOTIC)
|
||||
bodyparts_to_add -= "frills"
|
||||
|
||||
if(mutant_bodyparts["horns"])
|
||||
if(!H.dna.features["horns"] || H.dna.features["horns"] == "None" || H.head && (H.head.flags_inv & HIDEHAIR) || (H.wear_mask && (H.wear_mask.flags_inv & HIDEHAIR)) || !HD || HD.status == BODYPART_ROBOTIC)
|
||||
bodyparts_to_add -= "horns"
|
||||
|
||||
if(mutant_bodyparts["ears"])
|
||||
if(!H.dna.features["ears"] || H.dna.features["ears"] == "None" || H.head && (H.head.flags_inv & HIDEEARS) || (H.wear_mask && (H.wear_mask.flags_inv & HIDEEARS)) || !HD || HD.status == BODYPART_ROBOTIC)
|
||||
bodyparts_to_add -= "ears"
|
||||
|
||||
if(mutant_bodyparts["wings"])
|
||||
if(!H.dna.features["wings"] || H.dna.features["wings"] == "None" || (H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT) && (!H.wear_suit.species_exception || !is_type_in_list(src, H.wear_suit.species_exception))))
|
||||
bodyparts_to_add -= "wings"
|
||||
|
||||
if(mutant_bodyparts["wings_open"])
|
||||
if(H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT) && (!H.wear_suit.species_exception || !is_type_in_list(src, H.wear_suit.species_exception)))
|
||||
bodyparts_to_add -= "wings_open"
|
||||
else if (mutant_bodyparts["wings"])
|
||||
bodyparts_to_add -= "wings_open"
|
||||
|
||||
if(mutant_bodyparts["insect_fluff"])
|
||||
if(!H.dna.features["insect_fluff"] || H.dna.features["insect_fluff"] == "None" || H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT))
|
||||
bodyparts_to_add -= "insect_fluff"
|
||||
|
||||
//CITADEL EDIT
|
||||
//Race specific bodyparts:
|
||||
//Xenos
|
||||
if(mutant_bodyparts["xenodorsal"])
|
||||
if(!H.dna.features["xenodorsal"] || H.dna.features["xenodorsal"] == "None" || (H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT)))
|
||||
bodyparts_to_add -= "xenodorsal"
|
||||
if(mutant_bodyparts["xenohead"])//This is an overlay for different castes using different head crests
|
||||
if(!H.dna.features["xenohead"] || H.dna.features["xenohead"] == "None" || H.head && (H.head.flags_inv & HIDEHAIR) || (H.wear_mask && (H.wear_mask.flags_inv & HIDEHAIR)) || !HD || HD.status == BODYPART_ROBOTIC)
|
||||
bodyparts_to_add -= "xenohead"
|
||||
if(mutant_bodyparts["xenotail"])
|
||||
if(!H.dna.features["xenotail"] || H.dna.features["xenotail"] == "None" || H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT))
|
||||
bodyparts_to_add -= "xenotail"
|
||||
|
||||
//Other Races
|
||||
if(mutant_bodyparts["mam_tail"])
|
||||
if((H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR)) || tauric)
|
||||
bodyparts_to_add -= "mam_tail"
|
||||
|
||||
if(mutant_bodyparts["mam_waggingtail"])
|
||||
if((H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR)) || tauric)
|
||||
bodyparts_to_add -= "mam_waggingtail"
|
||||
else if (mutant_bodyparts["mam_tail"])
|
||||
bodyparts_to_add -= "mam_waggingtail"
|
||||
|
||||
if(mutant_bodyparts["mam_ears"])
|
||||
if(!H.dna.features["mam_ears"] || H.dna.features["mam_ears"] == "None" || H.head && (H.head.flags_inv & HIDEEARS) || (H.wear_mask && (H.wear_mask.flags_inv & HIDEEARS)) || !HD || HD.status == BODYPART_ROBOTIC)
|
||||
bodyparts_to_add -= "mam_ears"
|
||||
|
||||
if(mutant_bodyparts["mam_snouts"]) //Take a closer look at that snout!
|
||||
if((H.wear_mask && (H.wear_mask.flags_inv & HIDESNOUT)) || (H.head && (H.head.flags_inv & HIDESNOUT)) || !HD || HD.status == BODYPART_ROBOTIC)
|
||||
bodyparts_to_add -= "mam_snouts"
|
||||
|
||||
if(mutant_bodyparts["taur"])
|
||||
if(!tauric || (H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR)))
|
||||
bodyparts_to_add -= "taur"
|
||||
|
||||
//END EDIT
|
||||
for(var/mutant_part in mutant_bodyparts)
|
||||
var/reference_list = GLOB.mutant_reference_list[mutant_part]
|
||||
if(reference_list)
|
||||
var/datum/sprite_accessory/S
|
||||
var/transformed_part = GLOB.mutant_transform_list[mutant_part]
|
||||
if(transformed_part)
|
||||
S = reference_list[H.dna.features[transformed_part]]
|
||||
else
|
||||
S = reference_list[H.dna.features[mutant_part]]
|
||||
if(!S || S.is_not_visible(H, tauric))
|
||||
bodyparts_to_add -= mutant_part
|
||||
|
||||
//Digitigrade legs are stuck in the phantom zone between true limbs and mutant bodyparts. Mainly it just needs more agressive updating than most limbs.
|
||||
var/update_needed = FALSE
|
||||
@@ -778,76 +691,22 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
|
||||
var/list/dna_feature_as_text_string = list()
|
||||
|
||||
for(var/bodypart in bodyparts_to_add)
|
||||
var/datum/sprite_accessory/S
|
||||
switch(bodypart)
|
||||
if("tail_lizard")
|
||||
S = GLOB.tails_list_lizard[H.dna.features["tail_lizard"]]
|
||||
if("waggingtail_lizard")
|
||||
S = GLOB.animated_tails_list_lizard[H.dna.features["tail_lizard"]]
|
||||
if("tail_human")
|
||||
S = GLOB.tails_list_human[H.dna.features["tail_human"]]
|
||||
if("waggingtail_human")
|
||||
S = GLOB.animated_tails_list_human[H.dna.features["tail_human"]]
|
||||
if("spines")
|
||||
S = GLOB.spines_list[H.dna.features["spines"]]
|
||||
if("waggingspines")
|
||||
S = GLOB.animated_spines_list[H.dna.features["spines"]]
|
||||
if("snout")
|
||||
S = GLOB.snouts_list[H.dna.features["snout"]]
|
||||
if("frills")
|
||||
S = GLOB.frills_list[H.dna.features["frills"]]
|
||||
if("horns")
|
||||
S = GLOB.horns_list[H.dna.features["horns"]]
|
||||
if("ears")
|
||||
S = GLOB.ears_list[H.dna.features["ears"]]
|
||||
if("body_markings")
|
||||
S = GLOB.body_markings_list[H.dna.features["body_markings"]]
|
||||
if("wings")
|
||||
S = GLOB.wings_list[H.dna.features["wings"]]
|
||||
if("wingsopen")
|
||||
S = GLOB.wings_open_list[H.dna.features["wings"]]
|
||||
if("deco_wings")
|
||||
S = GLOB.deco_wings_list[H.dna.features["deco_wings"]]
|
||||
if("legs")
|
||||
S = GLOB.legs_list[H.dna.features["legs"]]
|
||||
if("insect_wings")
|
||||
S = GLOB.insect_wings_list[H.dna.features["insect_wings"]]
|
||||
if("insect_fluff")
|
||||
S = GLOB.insect_fluffs_list[H.dna.features["insect_fluff"]]
|
||||
if("insect_markings")
|
||||
S = GLOB.insect_markings_list[H.dna.features["insect_markings"]]
|
||||
if("caps")
|
||||
S = GLOB.caps_list[H.dna.features["caps"]]
|
||||
if("ipc_screen")
|
||||
S = GLOB.ipc_screens_list[H.dna.features["ipc_screen"]]
|
||||
if("ipc_antenna")
|
||||
S = GLOB.ipc_antennas_list[H.dna.features["ipc_antenna"]]
|
||||
if("mam_tail")
|
||||
S = GLOB.mam_tails_list[H.dna.features["mam_tail"]]
|
||||
if("mam_waggingtail")
|
||||
S = GLOB.mam_tails_animated_list[H.dna.features["mam_tail"]]
|
||||
if("mam_body_markings")
|
||||
S = GLOB.mam_body_markings_list[H.dna.features["mam_body_markings"]]
|
||||
if("mam_ears")
|
||||
S = GLOB.mam_ears_list[H.dna.features["mam_ears"]]
|
||||
if("mam_snouts")
|
||||
S = GLOB.mam_snouts_list[H.dna.features["mam_snouts"]]
|
||||
if("taur")
|
||||
S = GLOB.taur_list[H.dna.features["taur"]]
|
||||
if("xenodorsal")
|
||||
S = GLOB.xeno_dorsal_list[H.dna.features["xenodorsal"]]
|
||||
if("xenohead")
|
||||
S = GLOB.xeno_head_list[H.dna.features["xenohead"]]
|
||||
if("xenotail")
|
||||
S = GLOB.xeno_tail_list[H.dna.features["xenotail"]]
|
||||
var/reference_list = GLOB.mutant_reference_list[bodypart]
|
||||
if(reference_list)
|
||||
var/datum/sprite_accessory/S
|
||||
var/transformed_part = GLOB.mutant_transform_list[bodypart]
|
||||
if(transformed_part)
|
||||
S = reference_list[H.dna.features[transformed_part]]
|
||||
else
|
||||
S = reference_list[H.dna.features[bodypart]]
|
||||
|
||||
if(!S || S.icon_state == "none")
|
||||
continue
|
||||
if(!S || S.icon_state == "none")
|
||||
continue
|
||||
|
||||
for(var/L in S.relevant_layers)
|
||||
LAZYADD(relevant_layers["[L]"], S)
|
||||
if(!S.mutant_part_string)
|
||||
dna_feature_as_text_string[S] = bodypart
|
||||
for(var/L in S.relevant_layers)
|
||||
LAZYADD(relevant_layers["[L]"], S)
|
||||
if(!S.mutant_part_string)
|
||||
dna_feature_as_text_string[S] = bodypart
|
||||
|
||||
var/static/list/layer_text = list(
|
||||
"[BODY_BEHIND_LAYER]" = "BEHIND",
|
||||
@@ -2046,17 +1905,8 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
|
||||
return
|
||||
|
||||
/**
|
||||
|
||||
|
||||
|
||||
* The human species version of [/mob/living/carbon/proc/get_biological_state]. Depends on the HAS_FLESH and HAS_BONE species traits, having bones lets you have bone wounds, having flesh lets you have burn, slash, and piercing wounds
|
||||
|
||||
|
||||
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/datum/species/proc/get_biological_state(mob/living/carbon/human/H)
|
||||
. = BIO_INORGANIC
|
||||
if(HAS_FLESH in species_traits)
|
||||
@@ -2072,7 +1922,6 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
|
||||
if(HAS_TRAIT(H, TRAIT_NOBREATH))
|
||||
return TRUE
|
||||
|
||||
|
||||
/datum/species/proc/handle_environment(datum/gas_mixture/environment, mob/living/carbon/human/H)
|
||||
if(!environment)
|
||||
return
|
||||
@@ -2264,7 +2113,6 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
|
||||
/datum/species/proc/spec_stun(mob/living/carbon/human/H,amount)
|
||||
if(H)
|
||||
stop_wagging_tail(H)
|
||||
|
||||
. = stunmod * H.physiology.stun_mod * amount
|
||||
|
||||
//////////////
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
// Cold temperatures hurt faster as it is harder to move with out the heat energy
|
||||
bodytemp_cold_damage_limit = (T20C - 10) // about 10c
|
||||
*/
|
||||
hair_color = "fixedmutcolor"
|
||||
hair_color = "mutcolor"
|
||||
hair_alpha = 140
|
||||
var/current_color
|
||||
var/EMPeffect = FALSE
|
||||
|
||||
@@ -504,7 +504,7 @@
|
||||
else if (select_alteration == "Ears")
|
||||
var/list/snowflake_ears_list = list("Normal" = null)
|
||||
for(var/path in GLOB.mam_ears_list)
|
||||
var/datum/sprite_accessory/mam_ears/instance = GLOB.mam_ears_list[path]
|
||||
var/datum/sprite_accessory/ears/mam_ears/instance = GLOB.mam_ears_list[path]
|
||||
if(istype(instance, /datum/sprite_accessory))
|
||||
var/datum/sprite_accessory/S = instance
|
||||
if((!S.ckeys_allowed) || (S.ckeys_allowed.Find(H.client.ckey)))
|
||||
@@ -518,7 +518,7 @@
|
||||
else if (select_alteration == "Snout")
|
||||
var/list/snowflake_snouts_list = list("Normal" = null)
|
||||
for(var/path in GLOB.mam_snouts_list)
|
||||
var/datum/sprite_accessory/mam_snouts/instance = GLOB.mam_snouts_list[path]
|
||||
var/datum/sprite_accessory/snouts/mam_snouts/instance = GLOB.mam_snouts_list[path]
|
||||
if(istype(instance, /datum/sprite_accessory))
|
||||
var/datum/sprite_accessory/S = instance
|
||||
if((!S.ckeys_allowed) || (S.ckeys_allowed.Find(H.client.ckey)))
|
||||
@@ -549,7 +549,7 @@
|
||||
else if (select_alteration == "Tail")
|
||||
var/list/snowflake_tails_list = list("Normal" = null)
|
||||
for(var/path in GLOB.mam_tails_list)
|
||||
var/datum/sprite_accessory/mam_tails/instance = GLOB.mam_tails_list[path]
|
||||
var/datum/sprite_accessory/tails/mam_tails/instance = GLOB.mam_tails_list[path]
|
||||
if(istype(instance, /datum/sprite_accessory))
|
||||
var/datum/sprite_accessory/S = instance
|
||||
if((!S.ckeys_allowed) || (S.ckeys_allowed.Find(H.client.ckey)))
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
mutanttail = /obj/item/organ/tail/lizard
|
||||
coldmod = 1.5
|
||||
heatmod = 0.67
|
||||
mutant_bodyparts = list("mcolor" = "0F0", "mcolor2" = "0F0", "mcolor3" = "0F0", "tail_lizard" = "Smooth", "snout" = "Round",
|
||||
mutant_bodyparts = list("mcolor" = "0F0", "mcolor2" = "0F0", "mcolor3" = "0F0", "tail_lizard" = "Smooth", "mam_snouts" = "Round",
|
||||
"horns" = "None", "frills" = "None", "spines" = "None", "body_markings" = "None",
|
||||
"legs" = "Digitigrade", "taur" = "None", "deco_wings" = "None")
|
||||
attack_verb = "slash"
|
||||
|
||||
@@ -57,89 +57,10 @@
|
||||
..()
|
||||
|
||||
/datum/species/plasmaman/before_equip_job(datum/job/J, mob/living/carbon/human/H, visualsOnly = FALSE)
|
||||
var/current_job = J?.title
|
||||
var/datum/outfit/plasmaman/O = new /datum/outfit/plasmaman
|
||||
switch(current_job)
|
||||
if("Chaplain")
|
||||
O = new /datum/outfit/plasmaman/chaplain
|
||||
|
||||
if("Curator")
|
||||
O = new /datum/outfit/plasmaman/curator
|
||||
|
||||
if("Janitor")
|
||||
O = new /datum/outfit/plasmaman/janitor
|
||||
|
||||
if("Botanist")
|
||||
O = new /datum/outfit/plasmaman/botany
|
||||
|
||||
if("Bartender", "Lawyer")
|
||||
O = new /datum/outfit/plasmaman/bar
|
||||
|
||||
if("Cook")
|
||||
O = new /datum/outfit/plasmaman/chef
|
||||
|
||||
if("Security Officer")
|
||||
O = new /datum/outfit/plasmaman/security
|
||||
|
||||
if("Detective")
|
||||
O = new /datum/outfit/plasmaman/detective
|
||||
|
||||
if("Warden")
|
||||
O = new /datum/outfit/plasmaman/warden
|
||||
|
||||
if("Cargo Technician", "Quartermaster")
|
||||
O = new /datum/outfit/plasmaman/cargo
|
||||
|
||||
if("Shaft Miner")
|
||||
O = new /datum/outfit/plasmaman/mining
|
||||
|
||||
if("Medical Doctor")
|
||||
O = new /datum/outfit/plasmaman/medical
|
||||
|
||||
if("Chemist")
|
||||
O = new /datum/outfit/plasmaman/chemist
|
||||
|
||||
if("Geneticist")
|
||||
O = new /datum/outfit/plasmaman/genetics
|
||||
|
||||
if("Roboticist")
|
||||
O = new /datum/outfit/plasmaman/robotics
|
||||
|
||||
if("Virologist")
|
||||
O = new /datum/outfit/plasmaman/viro
|
||||
|
||||
if("Scientist")
|
||||
O = new /datum/outfit/plasmaman/science
|
||||
|
||||
if("Station Engineer")
|
||||
O = new /datum/outfit/plasmaman/engineering
|
||||
|
||||
if("Atmospheric Technician")
|
||||
O = new /datum/outfit/plasmaman/atmospherics
|
||||
|
||||
if("Captain")
|
||||
O = new /datum/outfit/plasmaman/captain
|
||||
|
||||
if("Head of Personnel")
|
||||
O = new /datum/outfit/plasmaman/hop
|
||||
|
||||
if("Head of Security")
|
||||
O = new /datum/outfit/plasmaman/hos
|
||||
|
||||
if("Chief Engineer")
|
||||
O = new /datum/outfit/plasmaman/ce
|
||||
|
||||
if("Chief Medical Officer")
|
||||
O = new /datum/outfit/plasmaman/cmo
|
||||
|
||||
if("Research Director")
|
||||
O = new /datum/outfit/plasmaman/rd
|
||||
|
||||
if("Mime")
|
||||
O = new /datum/outfit/plasmaman/mime
|
||||
|
||||
if("Clown")
|
||||
O = new /datum/outfit/plasmaman/clown
|
||||
if(J)
|
||||
if(J.plasma_outfit)
|
||||
O = new J.plasma_outfit
|
||||
|
||||
H.equipOutfit(O, visualsOnly)
|
||||
H.internal = H.get_item_for_held_index(2)
|
||||
|
||||
@@ -82,13 +82,11 @@
|
||||
M.AddSpell(SW)
|
||||
shadowwalk = SW
|
||||
|
||||
|
||||
/obj/item/organ/brain/nightmare/Remove(special = FALSE)
|
||||
if(shadowwalk && owner)
|
||||
owner.RemoveSpell(shadowwalk)
|
||||
return ..()
|
||||
|
||||
|
||||
/obj/item/organ/heart/nightmare
|
||||
name = "heart of darkness"
|
||||
desc = "An alien organ that twists and writhes when exposed to light."
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
burnmod = 1
|
||||
..()
|
||||
|
||||
/datum/species/skeleton/greater/check_roundstart_eligible()
|
||||
/datum/species/skeleton/check_roundstart_eligible()
|
||||
if(SSevents.holidays && SSevents.holidays[HALLOWEEN])
|
||||
return TRUE
|
||||
return ..()
|
||||
|
||||
@@ -22,4 +22,4 @@
|
||||
|
||||
tail_type = "mam_tail"
|
||||
wagging_type = "mam_waggingtail"
|
||||
species_type = "robotic"
|
||||
species_type = "robotic"
|
||||
|
||||
@@ -100,14 +100,12 @@
|
||||
else
|
||||
return ..()
|
||||
|
||||
|
||||
/datum/species/synth/handle_body(mob/living/carbon/human/H)
|
||||
if(fake_species)
|
||||
fake_species.handle_body(H)
|
||||
else
|
||||
return ..()
|
||||
|
||||
|
||||
/datum/species/synth/handle_mutant_bodyparts(mob/living/carbon/human/H, forced_colour)
|
||||
if(fake_species)
|
||||
fake_species.handle_body(H,forced_colour)
|
||||
|
||||
@@ -313,7 +313,7 @@
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/obj/effect/decal/cleanable/insectguts,
|
||||
/obj/effect/decal/cleanable/semen,
|
||||
/obj/effect/decal/cleanable/femcum,
|
||||
/obj/effect/decal/cleanable/semen/femcum,
|
||||
/obj/effect/decal/cleanable/generic,
|
||||
/obj/effect/decal/cleanable/glass,,
|
||||
/obj/effect/decal/cleanable/cobweb,
|
||||
|
||||
@@ -0,0 +1,433 @@
|
||||
/*
|
||||
All the important duct code:
|
||||
/code/datums/components/plumbing/plumbing.dm
|
||||
/code/datums/ductnet.dm
|
||||
*/
|
||||
/obj/machinery/duct
|
||||
name = "fluid duct"
|
||||
icon = 'icons/obj/plumbing/fluid_ducts.dmi'
|
||||
icon_state = "nduct"
|
||||
|
||||
///bitfield with the directions we're connected in
|
||||
var/connects
|
||||
///set to TRUE to disable smart duct behaviour
|
||||
var/dumb = FALSE
|
||||
///wheter we allow our connects to be changed after initialization or not
|
||||
var/lock_connects = FALSE
|
||||
///our ductnet, wich tracks what we're connected to
|
||||
var/datum/ductnet/duct
|
||||
///amount we can transfer per process. note that the ductnet can carry as much as the lowest capacity duct
|
||||
var/capacity = 10
|
||||
|
||||
///the color of our duct
|
||||
var/duct_color = null
|
||||
///TRUE to ignore colors, so yeah we also connect with other colors without issue
|
||||
var/ignore_colors = FALSE
|
||||
///1,2,4,8,16
|
||||
var/duct_layer = DUCT_LAYER_DEFAULT
|
||||
///whether we allow our layers to be altered
|
||||
var/lock_layers = FALSE
|
||||
///TRUE to let colors connect when forced with a wrench, false to just not do that at all
|
||||
var/color_to_color_support = TRUE
|
||||
///wheter to even bother with plumbing code or not
|
||||
var/active = TRUE
|
||||
///track ducts we're connected to. Mainly for ducts we connect to that we normally wouldn't, like different layers and colors, for when we regenerate the ducts
|
||||
var/list/neighbours = list()
|
||||
///wheter we just unanchored or drop whatever is in the variable. either is safe
|
||||
var/drop_on_wrench = /obj/item/stack/ducts
|
||||
|
||||
/obj/machinery/duct/Initialize(mapload, no_anchor, color_of_duct = "#ffffff", layer_of_duct = DUCT_LAYER_DEFAULT, force_connects)
|
||||
. = ..()
|
||||
|
||||
if(no_anchor)
|
||||
active = FALSE
|
||||
set_anchored(FALSE)
|
||||
else if(!can_anchor())
|
||||
qdel(src)
|
||||
CRASH("Overlapping ducts detected")
|
||||
|
||||
if(force_connects)
|
||||
connects = force_connects //skip change_connects() because we're still initializing and we need to set our connects at one point
|
||||
if(!lock_layers)
|
||||
duct_layer = layer_of_duct
|
||||
if(!ignore_colors)
|
||||
duct_color = color_of_duct
|
||||
if(duct_color)
|
||||
add_atom_colour(duct_color, FIXED_COLOUR_PRIORITY)
|
||||
|
||||
handle_layer()
|
||||
|
||||
for(var/obj/machinery/duct/D in loc)
|
||||
if(D == src)
|
||||
continue
|
||||
if(D.duct_layer & duct_layer)
|
||||
disconnect_duct()
|
||||
|
||||
if(active)
|
||||
attempt_connect()
|
||||
|
||||
|
||||
///start looking around us for stuff to connect to
|
||||
/obj/machinery/duct/proc/attempt_connect()
|
||||
|
||||
for(var/atom/movable/AM in loc)
|
||||
var/datum/component/plumbing/P = AM.GetComponent(/datum/component/plumbing)
|
||||
if(P?.active)
|
||||
disconnect_duct() //let's not built under plumbing machinery
|
||||
return
|
||||
for(var/D in GLOB.cardinals)
|
||||
if(dumb && !(D & connects))
|
||||
continue
|
||||
for(var/atom/movable/AM in get_step(src, D))
|
||||
if(connect_network(AM, D))
|
||||
add_connects(D)
|
||||
update_icon()
|
||||
|
||||
///see if whatever we found can be connected to
|
||||
/obj/machinery/duct/proc/connect_network(atom/movable/AM, direction, ignore_color)
|
||||
if(istype(AM, /obj/machinery/duct))
|
||||
return connect_duct(AM, direction, ignore_color)
|
||||
|
||||
var/plumber = AM.GetComponent(/datum/component/plumbing)
|
||||
if(!plumber)
|
||||
return
|
||||
return connect_plumber(plumber, direction)
|
||||
|
||||
///connect to a duct
|
||||
/obj/machinery/duct/proc/connect_duct(obj/machinery/duct/D, direction, ignore_color)
|
||||
var/opposite_dir = turn(direction, 180)
|
||||
if(!active || !D.active)
|
||||
return
|
||||
|
||||
if(!dumb && D.dumb && !(opposite_dir & D.connects))
|
||||
return
|
||||
if(dumb && D.dumb && !(connects & D.connects)) //we eliminated a few more scenarios in attempt connect
|
||||
return
|
||||
|
||||
if((duct == D.duct) && duct)//check if we're not just comparing two null values
|
||||
add_neighbour(D, direction)
|
||||
|
||||
D.add_connects(opposite_dir)
|
||||
D.update_icon()
|
||||
return TRUE //tell the current pipe to also update it's sprite
|
||||
if(!(D in neighbours)) //we cool
|
||||
if((duct_color != D.duct_color) && !(ignore_colors || D.ignore_colors))
|
||||
return
|
||||
if(!(duct_layer & D.duct_layer))
|
||||
return
|
||||
|
||||
if(D.duct)
|
||||
if(duct)
|
||||
duct.assimilate(D.duct)
|
||||
else
|
||||
D.duct.add_duct(src)
|
||||
else
|
||||
if(duct)
|
||||
duct.add_duct(D)
|
||||
else
|
||||
create_duct()
|
||||
duct.add_duct(D)
|
||||
add_neighbour(D, direction)
|
||||
//tell our buddy its time to pass on the torch of connecting to pipes. This shouldn't ever infinitely loop since it only works on pipes that havent been inductrinated
|
||||
D.attempt_connect()
|
||||
|
||||
return TRUE
|
||||
|
||||
///connect to a plumbing object
|
||||
/obj/machinery/duct/proc/connect_plumber(datum/component/plumbing/P, direction)
|
||||
var/opposite_dir = turn(direction, 180)
|
||||
if(duct_layer != DUCT_LAYER_DEFAULT) //plumbing devices don't support multilayering. 3 is the default layer so we only use that. We can change this later
|
||||
return FALSE
|
||||
|
||||
if(!P.active)
|
||||
return
|
||||
|
||||
var/comp_directions = P.supply_connects + P.demand_connects //they should never, ever have supply and demand connects overlap or catastrophic failure
|
||||
if(opposite_dir & comp_directions)
|
||||
if(!duct)
|
||||
create_duct()
|
||||
if(duct.add_plumber(P, opposite_dir))
|
||||
neighbours[P.parent] = direction
|
||||
return TRUE
|
||||
|
||||
///we disconnect ourself from our neighbours. we also destroy our ductnet and tell our neighbours to make a new one
|
||||
/obj/machinery/duct/proc/disconnect_duct(skipanchor)
|
||||
if(!skipanchor) //since set_anchored calls us too.
|
||||
set_anchored(FALSE)
|
||||
active = FALSE
|
||||
if(duct)
|
||||
duct.remove_duct(src)
|
||||
lose_neighbours()
|
||||
reset_connects(0)
|
||||
update_icon()
|
||||
if(ispath(drop_on_wrench) && !QDELING(src))
|
||||
new drop_on_wrench(drop_location())
|
||||
qdel(src)
|
||||
|
||||
///''''''''''''''''optimized''''''''''''''''' proc for quickly reconnecting after a duct net was destroyed
|
||||
/obj/machinery/duct/proc/reconnect()
|
||||
if(neighbours.len && !duct)
|
||||
create_duct()
|
||||
for(var/atom/movable/AM in neighbours)
|
||||
if(istype(AM, /obj/machinery/duct))
|
||||
var/obj/machinery/duct/D = AM
|
||||
if(D.duct)
|
||||
if(D.duct == duct) //we're already connected
|
||||
continue
|
||||
else
|
||||
duct.assimilate(D.duct)
|
||||
continue
|
||||
else
|
||||
duct.add_duct(D)
|
||||
D.reconnect()
|
||||
else
|
||||
var/datum/component/plumbing/P = AM.GetComponent(/datum/component/plumbing)
|
||||
if(AM in get_step(src, neighbours[AM])) //did we move?
|
||||
if(P)
|
||||
connect_plumber(P, neighbours[AM])
|
||||
else
|
||||
neighbours -= AM //we moved
|
||||
|
||||
///Special proc to draw a new connect frame based on neighbours. not the norm so we can support multiple duct kinds
|
||||
/obj/machinery/duct/proc/generate_connects()
|
||||
if(lock_connects)
|
||||
return
|
||||
connects = 0
|
||||
for(var/A in neighbours)
|
||||
connects |= neighbours[A]
|
||||
update_icon()
|
||||
|
||||
///create a new duct datum
|
||||
/obj/machinery/duct/proc/create_duct()
|
||||
duct = new()
|
||||
duct.add_duct(src)
|
||||
|
||||
///add a duct as neighbour. this means we're connected and will connect again if we ever regenerate
|
||||
/obj/machinery/duct/proc/add_neighbour(obj/machinery/duct/D, direction)
|
||||
if(!(D in neighbours))
|
||||
neighbours[D] = direction
|
||||
if(!(src in D.neighbours))
|
||||
D.neighbours[src] = turn(direction, 180)
|
||||
|
||||
///remove all our neighbours, and remove us from our neighbours aswell
|
||||
/obj/machinery/duct/proc/lose_neighbours()
|
||||
for(var/obj/machinery/duct/D in neighbours)
|
||||
D.neighbours.Remove(src)
|
||||
neighbours = list()
|
||||
|
||||
///add a connect direction
|
||||
/obj/machinery/duct/proc/add_connects(new_connects) //make this a define to cut proc calls?
|
||||
if(!lock_connects)
|
||||
connects |= new_connects
|
||||
|
||||
///remove a connect direction
|
||||
/obj/machinery/duct/proc/remove_connects(dead_connects)
|
||||
if(!lock_connects)
|
||||
connects &= ~dead_connects
|
||||
|
||||
///remove our connects
|
||||
/obj/machinery/duct/proc/reset_connects()
|
||||
if(!lock_connects)
|
||||
connects = 0
|
||||
|
||||
///get a list of the ducts we can connect to if we are dumb
|
||||
/obj/machinery/duct/proc/get_adjacent_ducts()
|
||||
var/list/adjacents = list()
|
||||
for(var/A in GLOB.cardinals)
|
||||
if(A & connects)
|
||||
for(var/obj/machinery/duct/D in get_step(src, A))
|
||||
if((turn(A, 180) & D.connects) && D.active)
|
||||
adjacents += D
|
||||
return adjacents
|
||||
|
||||
/obj/machinery/duct/update_icon_state()
|
||||
var/temp_icon = initial(icon_state)
|
||||
for(var/D in GLOB.cardinals)
|
||||
if(D & connects)
|
||||
if(D == NORTH)
|
||||
temp_icon += "_n"
|
||||
if(D == SOUTH)
|
||||
temp_icon += "_s"
|
||||
if(D == EAST)
|
||||
temp_icon += "_e"
|
||||
if(D == WEST)
|
||||
temp_icon += "_w"
|
||||
icon_state = temp_icon
|
||||
|
||||
///update the layer we are on
|
||||
/obj/machinery/duct/proc/handle_layer()
|
||||
var/offset
|
||||
switch(duct_layer)//it's a bitfield, but it's fine because it only works when there's one layer, and multiple layers should be handled differently
|
||||
if(FIRST_DUCT_LAYER)
|
||||
offset = -10
|
||||
if(SECOND_DUCT_LAYER)
|
||||
offset = -5
|
||||
if(THIRD_DUCT_LAYER)
|
||||
offset = 0
|
||||
if(FOURTH_DUCT_LAYER)
|
||||
offset = 5
|
||||
if(FIFTH_DUCT_LAYER)
|
||||
offset = 10
|
||||
pixel_x = offset
|
||||
pixel_y = offset
|
||||
|
||||
|
||||
/obj/machinery/duct/set_anchored(anchorvalue)
|
||||
. = ..()
|
||||
if(isnull(.))
|
||||
return
|
||||
if(anchorvalue)
|
||||
active = TRUE
|
||||
attempt_connect()
|
||||
else
|
||||
disconnect_duct(TRUE)
|
||||
|
||||
/obj/machinery/duct/wrench_act(mob/living/user, obj/item/I) //I can also be the RPD
|
||||
..()
|
||||
add_fingerprint(user)
|
||||
I.play_tool_sound(src)
|
||||
if(anchored || can_anchor())
|
||||
set_anchored(!anchored)
|
||||
user.visible_message( \
|
||||
"[user] [anchored ? null : "un"]fastens \the [src].", \
|
||||
"<span class='notice'>You [anchored ? null : "un"]fasten \the [src].</span>", \
|
||||
"<span class='hear'>You hear ratcheting.</span>")
|
||||
return TRUE
|
||||
///collection of all the sanity checks to prevent us from stacking ducts that shouldn't be stacked
|
||||
/obj/machinery/duct/proc/can_anchor(turf/T)
|
||||
if(!T)
|
||||
T = get_turf(src)
|
||||
for(var/obj/machinery/duct/D in T)
|
||||
if(!anchored || D == src)
|
||||
continue
|
||||
for(var/A in GLOB.cardinals)
|
||||
if(A & connects && A & D.connects)
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/duct/doMove(destination)
|
||||
. = ..()
|
||||
disconnect_duct()
|
||||
anchored = FALSE
|
||||
|
||||
/obj/machinery/duct/Destroy()
|
||||
disconnect_duct()
|
||||
return ..()
|
||||
|
||||
/obj/machinery/duct/MouseDrop_T(atom/A, mob/living/user)
|
||||
if(!istype(A, /obj/machinery/duct))
|
||||
return
|
||||
var/obj/machinery/duct/D = A
|
||||
var/obj/item/I = user.get_active_held_item()
|
||||
if(I?.tool_behaviour != TOOL_WRENCH)
|
||||
to_chat(user, "<span class='warning'>You need to be holding a wrench in your active hand to do that!</span>")
|
||||
return
|
||||
if(get_dist(src, D) != 1)
|
||||
return
|
||||
var/direction = get_dir(src, D)
|
||||
if(!(direction in GLOB.cardinals))
|
||||
return
|
||||
if(duct_layer != D.duct_layer)
|
||||
return
|
||||
|
||||
add_connects(direction) //the connect of the other duct is handled in connect_network, but do this here for the parent duct because it's not necessary in normal cases
|
||||
add_neighbour(D, direction)
|
||||
connect_network(D, direction, TRUE)
|
||||
update_icon()
|
||||
|
||||
///has a total of 5 layers and doesnt give a shit about color. its also dumb so doesnt autoconnect.
|
||||
/obj/machinery/duct/multilayered
|
||||
name = "duct layer-manifold"
|
||||
icon = 'icons/obj/2x2.dmi'
|
||||
icon_state = "multiduct"
|
||||
pixel_x = -15
|
||||
pixel_y = -15
|
||||
|
||||
color_to_color_support = FALSE
|
||||
duct_layer = FIRST_DUCT_LAYER | SECOND_DUCT_LAYER | THIRD_DUCT_LAYER | FOURTH_DUCT_LAYER | FIFTH_DUCT_LAYER
|
||||
drop_on_wrench = null
|
||||
|
||||
lock_connects = TRUE
|
||||
lock_layers = TRUE
|
||||
ignore_colors = TRUE
|
||||
dumb = TRUE
|
||||
|
||||
active = FALSE
|
||||
anchored = FALSE
|
||||
|
||||
/obj/machinery/duct/multilayered/Initialize(mapload, no_anchor, color_of_duct, layer_of_duct = DUCT_LAYER_DEFAULT, force_connects)
|
||||
. = ..()
|
||||
update_connects()
|
||||
|
||||
/obj/machinery/duct/multilayered/ComponentInitialize()
|
||||
. = ..()
|
||||
AddElement(/datum/element/update_icon_blocker)
|
||||
|
||||
/obj/machinery/duct/multilayered/wrench_act(mob/living/user, obj/item/I)
|
||||
. = ..()
|
||||
update_connects()
|
||||
|
||||
/obj/machinery/duct/multilayered/proc/update_connects()
|
||||
if(dir & NORTH || dir & SOUTH)
|
||||
connects = NORTH | SOUTH
|
||||
else
|
||||
connects = EAST | WEST
|
||||
|
||||
///don't connect to other multilayered stuff because honestly it shouldn't be done and I dont wanna deal with it
|
||||
/obj/machinery/duct/multilayered/connect_duct(obj/machinery/duct/D, direction, ignore_color)
|
||||
if(istype(D, /obj/machinery/duct/multilayered))
|
||||
return
|
||||
return ..()
|
||||
|
||||
/obj/machinery/duct/multilayered/handle_layer()
|
||||
return
|
||||
|
||||
/obj/item/stack/ducts
|
||||
name = "stack of duct"
|
||||
desc = "A stack of fluid ducts."
|
||||
singular_name = "duct"
|
||||
icon = 'icons/obj/plumbing/fluid_ducts.dmi'
|
||||
icon_state = "ducts"
|
||||
custom_materials = list(/datum/material/iron=500)
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
novariants = FALSE
|
||||
max_amount = 50
|
||||
item_flags = NOBLUDGEON
|
||||
merge_type = /obj/item/stack/ducts
|
||||
///Color of our duct
|
||||
var/duct_color = "grey"
|
||||
///Default layer of our duct
|
||||
var/duct_layer = "Default Layer"
|
||||
///Assoc index with all the available layers. yes five might be a bit much. Colors uses a global by the way
|
||||
var/list/layers = list("First Layer" = FIRST_DUCT_LAYER, "Second Layer" = SECOND_DUCT_LAYER, "Default Layer" = DUCT_LAYER_DEFAULT,
|
||||
"Fourth Layer" = FOURTH_DUCT_LAYER, "Fifth Layer" = FIFTH_DUCT_LAYER)
|
||||
|
||||
/obj/item/stack/ducts/examine(mob/user)
|
||||
. = ..()
|
||||
. += "<span class='notice'>It's current color and layer are [duct_color] and [duct_layer]. Use in-hand to change.</span>"
|
||||
|
||||
/obj/item/stack/ducts/attack_self(mob/user)
|
||||
var/new_layer = input("Select a layer", "Layer") as null|anything in layers
|
||||
if(new_layer)
|
||||
duct_layer = new_layer
|
||||
var/new_color = input("Select a color", "Color") as null|anything in GLOB.pipe_paint_colors
|
||||
if(new_color)
|
||||
duct_color = new_color
|
||||
add_atom_colour(GLOB.pipe_paint_colors[new_color], FIXED_COLOUR_PRIORITY)
|
||||
|
||||
/obj/item/stack/ducts/afterattack(atom/A, user, proximity)
|
||||
. = ..()
|
||||
if(!proximity)
|
||||
return
|
||||
if(istype(A, /obj/machinery/duct))
|
||||
var/obj/machinery/duct/D = A
|
||||
if(!D.anchored)
|
||||
add(1)
|
||||
qdel(D)
|
||||
if(istype(A, /turf/open) && use(1))
|
||||
var/turf/open/OT = A
|
||||
new /obj/machinery/duct(OT, FALSE, GLOB.pipe_paint_colors[duct_color], layers[duct_layer])
|
||||
playsound(get_turf(src), 'sound/machines/click.ogg', 50, TRUE)
|
||||
|
||||
/obj/item/stack/ducts/fifty
|
||||
amount = 50
|
||||
@@ -0,0 +1,98 @@
|
||||
/**Basic plumbing object.
|
||||
* It doesn't really hold anything special, YET.
|
||||
* Objects that are plumbing but not a subtype are as of writing liquid pumps and the reagent_dispenser tank
|
||||
* Also please note that the plumbing component is toggled on and off by the component using a signal from default_unfasten_wrench, so dont worry about it
|
||||
*/
|
||||
/obj/machinery/plumbing
|
||||
name = "pipe thing"
|
||||
icon = 'icons/obj/plumbing/plumbers.dmi'
|
||||
icon_state = "pump"
|
||||
density = TRUE
|
||||
active_power_usage = 30
|
||||
use_power = ACTIVE_POWER_USE
|
||||
resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF
|
||||
///Plumbing machinery is always gonna need reagents, so we might aswell put it here
|
||||
var/buffer = 50
|
||||
///Flags for reagents, like INJECTABLE, TRANSPARENT bla bla everything thats in DEFINES/reagents.dm
|
||||
var/reagent_flags = TRANSPARENT
|
||||
///wheter we partake in rcd construction or not
|
||||
var/rcd_constructable = TRUE
|
||||
///cost of the plumbing rcd construction
|
||||
var/rcd_cost = 15
|
||||
///delay of constructing it throught the plumbing rcd
|
||||
var/rcd_delay = 10
|
||||
|
||||
/obj/machinery/plumbing/Initialize(mapload, bolt = TRUE)
|
||||
. = ..()
|
||||
anchored = bolt
|
||||
create_reagents(buffer, reagent_flags)
|
||||
AddComponent(/datum/component/simple_rotation, ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_COUNTERCLOCKWISE | ROTATION_VERBS, null, CALLBACK(src, .proc/can_be_rotated))
|
||||
|
||||
/obj/machinery/plumbing/proc/can_be_rotated(mob/user,rotation_type)
|
||||
return TRUE
|
||||
|
||||
|
||||
/obj/machinery/plumbing/examine(mob/user)
|
||||
. = ..()
|
||||
. += "<span class='notice'>The maximum volume display reads: <b>[reagents.maximum_volume] units</b>.</span>"
|
||||
|
||||
/obj/machinery/plumbing/wrench_act(mob/living/user, obj/item/I)
|
||||
..()
|
||||
default_unfasten_wrench(user, I)
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/plumbing/plunger_act(obj/item/plunger/P, mob/living/user, reinforced)
|
||||
to_chat(user, "<span class='notice'>You start furiously plunging [name].")
|
||||
if(do_after(user, 30, target = src))
|
||||
to_chat(user, "<span class='notice'>You finish plunging the [name].")
|
||||
reagents.reaction(get_turf(src), TOUCH) //splash on the floor
|
||||
reagents.clear_reagents()
|
||||
|
||||
/obj/machinery/plumbing/welder_act(mob/living/user, obj/item/I)
|
||||
. = ..()
|
||||
if(anchored)
|
||||
to_chat(user, "<span class='warning'>The [name] needs to be unbolted to do that!</span")
|
||||
if(I.tool_start_check(user, amount=0))
|
||||
to_chat(user, "<span class='notice'>You start slicing the [name] apart.</span")
|
||||
if(I.use_tool(src, user, rcd_delay * 2, volume=50))
|
||||
deconstruct(TRUE)
|
||||
to_chat(user, "<span class='notice'>You slice the [name] apart.</span")
|
||||
return TRUE
|
||||
|
||||
///We can empty beakers in here and everything
|
||||
/obj/machinery/plumbing/input
|
||||
name = "input gate"
|
||||
desc = "Can be manually filled with reagents from containers."
|
||||
icon_state = "pipe_input"
|
||||
reagent_flags = TRANSPARENT | REFILLABLE
|
||||
rcd_cost = 5
|
||||
rcd_delay = 5
|
||||
|
||||
/obj/machinery/plumbing/input/Initialize(mapload, bolt)
|
||||
. = ..()
|
||||
AddComponent(/datum/component/plumbing/simple_supply, bolt)
|
||||
|
||||
///We can fill beakers in here and everything. we dont inheret from input because it has nothing that we need
|
||||
/obj/machinery/plumbing/output
|
||||
name = "output gate"
|
||||
desc = "A manual output for plumbing systems, for taking reagents directly into containers."
|
||||
icon_state = "pipe_output"
|
||||
reagent_flags = TRANSPARENT | DRAINABLE
|
||||
rcd_cost = 5
|
||||
rcd_delay = 5
|
||||
|
||||
/obj/machinery/plumbing/output/Initialize(mapload, bolt)
|
||||
. = ..()
|
||||
AddComponent(/datum/component/plumbing/simple_demand, bolt)
|
||||
|
||||
/obj/machinery/plumbing/tank
|
||||
name = "chemical tank"
|
||||
desc = "A massive chemical holding tank."
|
||||
icon_state = "tank"
|
||||
buffer = 400
|
||||
rcd_cost = 25
|
||||
rcd_delay = 20
|
||||
|
||||
/obj/machinery/plumbing/tank/Initialize(mapload, bolt)
|
||||
. = ..()
|
||||
AddComponent(/datum/component/plumbing/tank, bolt)
|
||||
@@ -0,0 +1,105 @@
|
||||
//we cant use defines in tgui, so use a string instead of magic numbers
|
||||
#define COOLING "Cooling"
|
||||
#define HEATING "Heating"
|
||||
#define NEUTRAL "Neutral"
|
||||
|
||||
///this the plumbing version of a heater/freezer.
|
||||
/obj/machinery/plumbing/acclimator
|
||||
name = "chemical acclimator"
|
||||
desc = "An efficient cooler and heater for the perfect showering temperature or illicit chemical factory."
|
||||
|
||||
icon_state = "acclimator"
|
||||
buffer = 200
|
||||
|
||||
///towards wich temperature do we build?
|
||||
var/target_temperature = 300
|
||||
///I cant find a good name for this. Basically if target is 300, and this is 10, it will still target 300 but will start emptying itself at 290 and 310.
|
||||
var/allowed_temperature_difference = 1
|
||||
///cool/heat power
|
||||
var/heater_coefficient = 0.1
|
||||
///Are we turned on or off? this is from the on and off button
|
||||
var/enabled = TRUE
|
||||
///COOLING, HEATING or NEUTRAL. We track this for change, so we dont needlessly update our icon
|
||||
var/acclimate_state
|
||||
/**We can't take anything in, at least till we're emptied. Down side of the round robin chem transfer, otherwise while emptying 5u of an unreacted chem gets added,
|
||||
and you get nasty leftovers
|
||||
*/
|
||||
var/emptying = FALSE
|
||||
ui_x = 320
|
||||
ui_y = 310
|
||||
|
||||
/obj/machinery/plumbing/acclimator/Initialize(mapload, bolt)
|
||||
. = ..()
|
||||
AddComponent(/datum/component/plumbing/acclimator, bolt)
|
||||
|
||||
/obj/machinery/plumbing/acclimator/process()
|
||||
if(stat & NOPOWER || !enabled || !reagents.total_volume || reagents.chem_temp == target_temperature)
|
||||
if(acclimate_state != NEUTRAL)
|
||||
acclimate_state = NEUTRAL
|
||||
update_icon()
|
||||
if(!reagents.total_volume)
|
||||
emptying = FALSE
|
||||
return
|
||||
|
||||
if(reagents.chem_temp < target_temperature && acclimate_state != HEATING) //note that we check if the temperature is the same at the start
|
||||
acclimate_state = HEATING
|
||||
update_icon()
|
||||
else if(reagents.chem_temp > target_temperature && acclimate_state != COOLING)
|
||||
acclimate_state = COOLING
|
||||
update_icon()
|
||||
if(!emptying)
|
||||
if(reagents.chem_temp >= target_temperature && target_temperature + allowed_temperature_difference >= reagents.chem_temp) //cooling here
|
||||
emptying = TRUE
|
||||
if(reagents.chem_temp <= target_temperature && target_temperature - allowed_temperature_difference <= reagents.chem_temp) //heating here
|
||||
emptying = TRUE
|
||||
|
||||
reagents.adjust_thermal_energy((target_temperature - reagents.chem_temp) * heater_coefficient * SPECIFIC_HEAT_DEFAULT * reagents.total_volume) //keep constant with chem heater
|
||||
reagents.handle_reactions()
|
||||
|
||||
/obj/machinery/plumbing/acclimator/update_icon()
|
||||
icon_state = initial(icon_state)
|
||||
switch(acclimate_state)
|
||||
if(COOLING)
|
||||
icon_state += "_cold"
|
||||
if(HEATING)
|
||||
icon_state += "_hot"
|
||||
|
||||
/obj/machinery/plumbing/acclimator/ui_interact(mob/user, datum/tgui/ui)
|
||||
ui = SStgui.try_update_ui(user, src, ui)
|
||||
if(!ui)
|
||||
ui = new(user, src, "ChemAcclimator", name)
|
||||
ui.open()
|
||||
|
||||
/obj/machinery/plumbing/acclimator/ui_data(mob/user)
|
||||
var/list/data = list()
|
||||
|
||||
data["enabled"] = enabled
|
||||
data["chem_temp"] = reagents.chem_temp
|
||||
data["target_temperature"] = target_temperature
|
||||
data["allowed_temperature_difference"] = allowed_temperature_difference
|
||||
data["acclimate_state"] = acclimate_state
|
||||
data["max_volume"] = reagents.maximum_volume
|
||||
data["reagent_volume"] = reagents.total_volume
|
||||
data["emptying"] = emptying
|
||||
return data
|
||||
|
||||
/obj/machinery/plumbing/acclimator/ui_act(action, params)
|
||||
if(..())
|
||||
return
|
||||
. = TRUE
|
||||
switch(action)
|
||||
if("set_target_temperature")
|
||||
var/target = text2num(params["temperature"])
|
||||
target_temperature = clamp(target, 0, 1000)
|
||||
if("set_allowed_temperature_difference")
|
||||
var/target = text2num(params["temperature"])
|
||||
allowed_temperature_difference = clamp(target, 0, 1000)
|
||||
if("toggle_power")
|
||||
enabled = !enabled
|
||||
if("change_volume")
|
||||
var/target = text2num(params["volume"])
|
||||
reagents.maximum_volume = clamp(round(target), 1, buffer)
|
||||
|
||||
#undef COOLING
|
||||
#undef HEATING
|
||||
#undef NEUTRAL
|
||||
@@ -0,0 +1,65 @@
|
||||
/obj/machinery/hydroponics/constructable/automagic
|
||||
name = "automated hydroponics system"
|
||||
desc = "The bane of botanists everywhere. Accepts chemical reagents via plumbing, automatically harvests and removes dead plants."
|
||||
obj_flags = CAN_BE_HIT | UNIQUE_RENAME
|
||||
circuit = /obj/item/circuitboard/machine/hydroponics/automagic
|
||||
self_sufficiency_req = 400 //automating hydroponics makes gaia sad so she needs more drugs to turn they tray godly.
|
||||
canirrigate = FALSE
|
||||
|
||||
|
||||
/obj/machinery/hydroponics/constructable/automagic/attackby(obj/item/O, mob/user, params)
|
||||
if(istype(O, /obj/item/reagent_containers))
|
||||
return FALSE //avoid fucky wuckies
|
||||
..()
|
||||
|
||||
/obj/machinery/hydroponics/constructable/automagic/default_unfasten_wrench(mob/user, obj/item/I, time = 20)
|
||||
. = ..()
|
||||
if(. == SUCCESSFUL_UNFASTEN)
|
||||
user.visible_message("<span class='notice'>[user.name] [anchored ? "fasten" : "unfasten"] [src]</span>", \
|
||||
"<span class='notice'>You [anchored ? "fasten" : "unfasten"] [src]</span>")
|
||||
var/datum/component/plumbing/CP = GetComponent(/datum/component/plumbing)
|
||||
if(anchored)
|
||||
CP.enable()
|
||||
else
|
||||
CP.disable()
|
||||
|
||||
/obj/machinery/hydroponics/constructable/automagic/Destroy()
|
||||
. = ..()
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
|
||||
/obj/machinery/hydroponics/constructable/automagic/Initialize(mapload)
|
||||
. = ..()
|
||||
START_PROCESSING(SSobj, src)
|
||||
create_reagents(100 , AMOUNT_VISIBLE)
|
||||
|
||||
/obj/machinery/hydroponics/constructable/automagic/ComponentInitialize()
|
||||
. = ..()
|
||||
AddComponent(/datum/component/simple_rotation, ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_COUNTERCLOCKWISE | ROTATION_VERBS, null, CALLBACK(src, .proc/can_be_rotated))
|
||||
AddComponent(/datum/component/plumbing/simple_demand)
|
||||
|
||||
/obj/machinery/hydroponics/constructable/proc/can_be_rotated(mob/user, rotation_type)
|
||||
return !anchored
|
||||
|
||||
/obj/machinery/hydroponics/constructable/automagic/process()
|
||||
if(reagents)
|
||||
applyChemicals(reagents)
|
||||
reagents.clear_reagents()
|
||||
if(dead)
|
||||
dead = 0
|
||||
qdel(myseed)
|
||||
myseed = null
|
||||
update_icon()
|
||||
name = initial(name)
|
||||
desc = initial(desc)
|
||||
if(harvest)
|
||||
myseed.harvest_userless()
|
||||
harvest = 0
|
||||
lastproduce = age
|
||||
if(!myseed.get_gene(/datum/plant_gene/trait/repeated_harvest))
|
||||
qdel(myseed)
|
||||
myseed = null
|
||||
dead = 0
|
||||
name = initial(name)
|
||||
desc = initial(desc)
|
||||
update_icon()
|
||||
..()
|
||||
@@ -0,0 +1,79 @@
|
||||
/obj/machinery/plumbing/bottler
|
||||
name = "chemical bottler"
|
||||
desc = "Puts reagents into containers, like bottles and beakers."
|
||||
icon_state = "bottler"
|
||||
layer = ABOVE_ALL_MOB_LAYER
|
||||
reagent_flags = TRANSPARENT | DRAINABLE
|
||||
rcd_cost = 50
|
||||
rcd_delay = 50
|
||||
buffer = 100
|
||||
///how much do we fill
|
||||
var/wanted_amount = 10
|
||||
///where things are sent
|
||||
var/turf/goodspot = null
|
||||
///where things are taken
|
||||
var/turf/inputspot = null
|
||||
///where beakers that are already full will be sent
|
||||
var/turf/badspot = null
|
||||
|
||||
/obj/machinery/plumbing/bottler/Initialize(mapload, bolt)
|
||||
. = ..()
|
||||
AddComponent(/datum/component/plumbing/simple_demand, bolt)
|
||||
setDir(dir)
|
||||
|
||||
/obj/machinery/plumbing/bottler/can_be_rotated(mob/user, rotation_type)
|
||||
if(anchored)
|
||||
to_chat(user, "<span class='warning'>It is fastened to the floor!</span>")
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
///changes the tile array
|
||||
/obj/machinery/plumbing/bottler/setDir(newdir)
|
||||
. = ..()
|
||||
switch(dir)
|
||||
if(NORTH)
|
||||
goodspot = get_step(get_turf(src), NORTH)
|
||||
inputspot = get_step(get_turf(src), SOUTH)
|
||||
badspot = get_step(get_turf(src), EAST)
|
||||
if(SOUTH)
|
||||
goodspot = get_step(get_turf(src), SOUTH)
|
||||
inputspot = get_step(get_turf(src), NORTH)
|
||||
badspot = get_step(get_turf(src), WEST)
|
||||
if(WEST)
|
||||
goodspot = get_step(get_turf(src), WEST)
|
||||
inputspot = get_step(get_turf(src), EAST)
|
||||
badspot = get_step(get_turf(src), NORTH)
|
||||
if(EAST)
|
||||
goodspot = get_step(get_turf(src), EAST)
|
||||
inputspot = get_step(get_turf(src), WEST)
|
||||
badspot = get_step(get_turf(src), SOUTH)
|
||||
|
||||
///changing input ammount with a window
|
||||
/obj/machinery/plumbing/bottler/interact(mob/user)
|
||||
. = ..()
|
||||
wanted_amount = clamp(round(input(user,"maximum is 100u","set ammount to fill with") as num|null, 1), 1, 100)
|
||||
reagents.clear_reagents()
|
||||
to_chat(user, "<span class='notice'> The [src] will now fill for [wanted_amount]u.</span>")
|
||||
|
||||
/obj/machinery/plumbing/bottler/process()
|
||||
if(stat & NOPOWER)
|
||||
return
|
||||
///see if machine has enough to fill
|
||||
if(reagents.total_volume >= wanted_amount && anchored)
|
||||
var/obj/AM = pick(inputspot.contents)///pick a reagent_container that could be used
|
||||
if(istype(AM, /obj/item/reagent_containers) && (!istype(AM, /obj/item/reagent_containers/hypospray/medipen)))
|
||||
var/obj/item/reagent_containers/B = AM
|
||||
///see if it would overflow else inject
|
||||
if((B.reagents.total_volume + wanted_amount) <= B.reagents.maximum_volume)
|
||||
reagents.trans_to(B, wanted_amount)
|
||||
B.forceMove(goodspot)
|
||||
return
|
||||
///glass was full so we move it away
|
||||
AM.forceMove(badspot)
|
||||
if(istype(AM, /obj/item/slime_extract)) ///slime extracts need inject
|
||||
AM.forceMove(goodspot)
|
||||
reagents.trans_to(AM, wanted_amount)
|
||||
return
|
||||
if(istype(AM, /obj/item/slimecross/industrial)) ///no need to move slimecross industrial things
|
||||
reagents.trans_to(AM, wanted_amount)
|
||||
return
|
||||
@@ -0,0 +1,21 @@
|
||||
/obj/machinery/plumbing/disposer
|
||||
name = "chemical disposer"
|
||||
desc = "Breaks down chemicals and annihilates them."
|
||||
icon_state = "disposal"
|
||||
///we remove 10 reagents per second
|
||||
var/disposal_rate = 10
|
||||
|
||||
/obj/machinery/plumbing/disposer/Initialize(mapload, bolt)
|
||||
. = ..()
|
||||
AddComponent(/datum/component/plumbing/simple_demand, bolt)
|
||||
|
||||
/obj/machinery/plumbing/disposer/process()
|
||||
if(stat & NOPOWER)
|
||||
return
|
||||
if(reagents.total_volume)
|
||||
if(icon_state != initial(icon_state) + "_working") //threw it here instead of update icon since it only has two states
|
||||
icon_state = initial(icon_state) + "_working"
|
||||
reagents.remove_any(disposal_rate)
|
||||
else
|
||||
if(icon_state != initial(icon_state))
|
||||
icon_state = initial(icon_state)
|
||||
@@ -0,0 +1,59 @@
|
||||
/obj/machinery/plumbing/fermenter //FULLY AUTOMATIC BEER BREWING. TRULY, THE FUTURE.
|
||||
name = "chemical fermenter"
|
||||
desc = "Turns plants into various types of booze."
|
||||
icon_state = "fermenter"
|
||||
layer = ABOVE_ALL_MOB_LAYER
|
||||
reagent_flags = TRANSPARENT | DRAINABLE
|
||||
rcd_cost = 30
|
||||
rcd_delay = 30
|
||||
buffer = 400
|
||||
///input dir
|
||||
var/eat_dir = SOUTH
|
||||
|
||||
/obj/machinery/plumbing/fermenter/Initialize(mapload, bolt)
|
||||
. = ..()
|
||||
AddComponent(/datum/component/plumbing/simple_supply, bolt)
|
||||
|
||||
/obj/machinery/plumbing/fermenter/can_be_rotated(mob/user,rotation_type)
|
||||
if(anchored)
|
||||
to_chat(user, "<span class='warning'>It is fastened to the floor!</span>")
|
||||
return FALSE
|
||||
switch(eat_dir)
|
||||
if(WEST)
|
||||
eat_dir = NORTH
|
||||
return TRUE
|
||||
if(EAST)
|
||||
eat_dir = SOUTH
|
||||
return TRUE
|
||||
if(NORTH)
|
||||
eat_dir = EAST
|
||||
return TRUE
|
||||
if(SOUTH)
|
||||
eat_dir = WEST
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/plumbing/fermenter/CanPass(atom/movable/AM)
|
||||
. = ..()
|
||||
if(!anchored)
|
||||
return
|
||||
var/move_dir = get_dir(loc, AM.loc)
|
||||
if(move_dir == eat_dir)
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/plumbing/fermenter/Crossed(atom/movable/AM)
|
||||
. = ..()
|
||||
ferment(AM)
|
||||
|
||||
/obj/machinery/plumbing/fermenter/proc/ferment(atom/AM)
|
||||
if(stat & NOPOWER)
|
||||
return
|
||||
if(reagents.holder_full())
|
||||
return
|
||||
if(!isitem(AM))
|
||||
return
|
||||
if(istype(AM, /obj/item/reagent_containers/food/snacks/grown))
|
||||
var/obj/item/reagent_containers/food/snacks/grown/G = AM
|
||||
if(G.distill_reagent)
|
||||
var/amount = G.seed.potency * 0.25
|
||||
reagents.add_reagent(G.distill_reagent, amount)
|
||||
qdel(G)
|
||||
@@ -0,0 +1,65 @@
|
||||
///chemical plumbing filter. If it's not filtered by left and right, it goes straight.
|
||||
/obj/machinery/plumbing/filter
|
||||
name = "chemical filter"
|
||||
desc = "A chemical filter for filtering chemicals. The left and right outputs appear to be from the perspective of the input port."
|
||||
icon_state = "filter"
|
||||
density = FALSE
|
||||
|
||||
///whitelist of chems id's that go to the left side. Empty to disable port
|
||||
var/list/left = list()
|
||||
///whitelist of chem id's that go to the right side. Empty to disable port
|
||||
var/list/right = list()
|
||||
///whitelist of chems but their name instead of path
|
||||
var/list/english_left = list()
|
||||
///whitelist of chems but their name instead of path
|
||||
var/list/english_right = list()
|
||||
|
||||
/obj/machinery/plumbing/filter/Initialize(mapload, bolt)
|
||||
. = ..()
|
||||
AddComponent(/datum/component/plumbing/filter, bolt)
|
||||
|
||||
/obj/machinery/plumbing/filter/ui_interact(mob/user, datum/tgui/ui)
|
||||
ui = SStgui.try_update_ui(user, src, ui)
|
||||
if(!ui)
|
||||
ui = new(user, src, "ChemFilter", name)
|
||||
ui.open()
|
||||
|
||||
/obj/machinery/plumbing/filter/ui_data(mob/user)
|
||||
var/list/data = list()
|
||||
data["left"] = english_left
|
||||
data["right"] = english_right
|
||||
return data
|
||||
|
||||
/obj/machinery/plumbing/filter/ui_act(action, params)
|
||||
if(..())
|
||||
return
|
||||
. = TRUE
|
||||
switch(action)
|
||||
if("add")
|
||||
var/new_chem_name = params["name"]
|
||||
var/chem_id = get_chem_id(new_chem_name)
|
||||
if(chem_id)
|
||||
switch(params["which"])
|
||||
if("left")
|
||||
if(!left.Find(chem_id))
|
||||
english_left += new_chem_name
|
||||
left += chem_id
|
||||
if("right")
|
||||
if(!right.Find(chem_id))
|
||||
english_right += new_chem_name
|
||||
right += chem_id
|
||||
else
|
||||
to_chat(usr, "<span class='warning'>No such known reagent exists!</span>")
|
||||
|
||||
if("remove")
|
||||
var/chem_name = params["reagent"]
|
||||
var/chem_id = get_chem_id(chem_name)
|
||||
switch(params["which"])
|
||||
if("left")
|
||||
if(english_left.Find(chem_name))
|
||||
english_left -= chem_name
|
||||
left -= chem_id
|
||||
if("right")
|
||||
if(english_right.Find(chem_name))
|
||||
english_right -= chem_name
|
||||
right -= chem_id
|
||||
@@ -0,0 +1,64 @@
|
||||
/obj/machinery/plumbing/grinder_chemical
|
||||
name = "chemical grinder"
|
||||
desc = "chemical grinder."
|
||||
icon_state = "grinder_chemical"
|
||||
layer = ABOVE_ALL_MOB_LAYER
|
||||
reagent_flags = TRANSPARENT | DRAINABLE
|
||||
rcd_cost = 30
|
||||
rcd_delay = 30
|
||||
buffer = 400
|
||||
var/eat_dir = NORTH
|
||||
|
||||
/obj/machinery/plumbing/grinder_chemical/Initialize(mapload, bolt)
|
||||
. = ..()
|
||||
AddComponent(/datum/component/plumbing/simple_supply, bolt)
|
||||
|
||||
/obj/machinery/plumbing/grinder_chemical/can_be_rotated(mob/user,rotation_type)
|
||||
if(anchored)
|
||||
to_chat(user, "<span class='warning'>It is fastened to the floor!</span>")
|
||||
return FALSE
|
||||
switch(eat_dir)
|
||||
if(WEST)
|
||||
eat_dir = NORTH
|
||||
return TRUE
|
||||
if(EAST)
|
||||
eat_dir = SOUTH
|
||||
return TRUE
|
||||
if(NORTH)
|
||||
eat_dir = EAST
|
||||
return TRUE
|
||||
if(SOUTH)
|
||||
eat_dir = WEST
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/plumbing/grinder_chemical/CanPass(atom/movable/AM)
|
||||
. = ..()
|
||||
if(!anchored)
|
||||
return
|
||||
var/move_dir = get_dir(loc, AM.loc)
|
||||
if(move_dir == eat_dir)
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/plumbing/grinder_chemical/Crossed(atom/movable/AM)
|
||||
. = ..()
|
||||
grind(AM)
|
||||
|
||||
/obj/machinery/plumbing/grinder_chemical/proc/grind(atom/AM)
|
||||
if(stat & NOPOWER)
|
||||
return
|
||||
if(reagents.holder_full())
|
||||
return
|
||||
if(!isitem(AM))
|
||||
return
|
||||
var/obj/item/I = AM
|
||||
if(I.juice_results || I.grind_results)
|
||||
if(I.juice_results)
|
||||
I.on_juice()
|
||||
reagents.add_reagent_list(I.juice_results)
|
||||
if(I.reagents)
|
||||
I.reagents.trans_to(src, I.reagents.total_volume)
|
||||
qdel(I)
|
||||
return
|
||||
I.on_grind()
|
||||
reagents.add_reagent_list(I.grind_results)
|
||||
qdel(I)
|
||||
@@ -0,0 +1,94 @@
|
||||
/obj/machinery/medipen_refiller
|
||||
name = "Medipen Refiller"
|
||||
desc = "A machine that refills used medipens with chemicals."
|
||||
icon = 'icons/obj/machines/medipen_refiller.dmi'
|
||||
icon_state = "medipen_refiller"
|
||||
density = TRUE
|
||||
circuit = /obj/item/circuitboard/machine/medipen_refiller
|
||||
idle_power_usage = 100
|
||||
/// list of medipen subtypes it can refill
|
||||
var/list/allowed = list(/obj/item/reagent_containers/hypospray/medipen = /datum/reagent/medicine/epinephrine,
|
||||
/obj/item/reagent_containers/hypospray/medipen/ekit = /datum/reagent/medicine/epinephrine,
|
||||
/obj/item/reagent_containers/hypospray/medipen/firelocker = /datum/reagent/medicine/oxandrolone,
|
||||
/obj/item/reagent_containers/hypospray/medipen/stimpack = /datum/reagent/medicine/ephedrine,
|
||||
/obj/item/reagent_containers/hypospray/medipen/blood_loss = /datum/reagent/medicine/coagulant/weak)
|
||||
/// var to prevent glitches in the animation
|
||||
var/busy = FALSE
|
||||
|
||||
/obj/machinery/medipen_refiller/Initialize()
|
||||
. = ..()
|
||||
create_reagents(100, TRANSPARENT)
|
||||
for(var/obj/item/stock_parts/matter_bin/B in component_parts)
|
||||
reagents.maximum_volume += 100 * B.rating
|
||||
AddComponent(/datum/component/plumbing/simple_demand)
|
||||
|
||||
|
||||
/obj/machinery/medipen_refiller/RefreshParts()
|
||||
var/new_volume = 100
|
||||
for(var/obj/item/stock_parts/matter_bin/B in component_parts)
|
||||
new_volume += 100 * B.rating
|
||||
if(!reagents)
|
||||
create_reagents(new_volume, TRANSPARENT)
|
||||
reagents.maximum_volume = new_volume
|
||||
return TRUE
|
||||
|
||||
/// handles the messages and animation, calls refill to end the animation
|
||||
/obj/machinery/medipen_refiller/attackby(obj/item/I, mob/user, params)
|
||||
if(busy)
|
||||
to_chat(user, "<span class='danger'>The machine is busy.</span>")
|
||||
return
|
||||
if(istype(I, /obj/item/reagent_containers) && I.is_open_container())
|
||||
var/obj/item/reagent_containers/RC = I
|
||||
var/units = RC.reagents.trans_to(src, RC.amount_per_transfer_from_this)
|
||||
if(units)
|
||||
to_chat(user, "<span class='notice'>You transfer [units] units of the solution to the [name].</span>")
|
||||
return
|
||||
else
|
||||
to_chat(user, "<span class='danger'>The [name] is full.</span>")
|
||||
return
|
||||
if(istype(I, /obj/item/reagent_containers/hypospray/medipen))
|
||||
var/obj/item/reagent_containers/hypospray/medipen/P = I
|
||||
if(!(LAZYFIND(allowed, P.type)))
|
||||
to_chat(user, "<span class='danger'>Error! Unknown schematics.</span>")
|
||||
return
|
||||
if(P.reagents?.reagent_list.len)
|
||||
to_chat(user, "<span class='notice'>The medipen is already filled.</span>")
|
||||
return
|
||||
if(reagents.has_reagent(allowed[P.type], 10))
|
||||
busy = TRUE
|
||||
add_overlay("active")
|
||||
addtimer(CALLBACK(src, .proc/refill, P, user), 20)
|
||||
qdel(P)
|
||||
return
|
||||
to_chat(user, "<span class='danger'>There aren't enough reagents to finish this operation.</span>")
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/machinery/medipen_refiller/plunger_act(obj/item/plunger/P, mob/living/user, reinforced)
|
||||
to_chat(user, "<span class='notice'>You start furiously plunging [name].</span>")
|
||||
if(do_after(user, 30, target = src))
|
||||
to_chat(user, "<span class='notice'>You finish plunging the [name].</span>")
|
||||
reagents.clear_reagents()
|
||||
|
||||
/obj/machinery/medipen_refiller/wrench_act(mob/living/user, obj/item/I)
|
||||
..()
|
||||
default_unfasten_wrench(user, I)
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/medipen_refiller/crowbar_act(mob/user, obj/item/I)
|
||||
..()
|
||||
default_deconstruction_crowbar(I)
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/medipen_refiller/screwdriver_act(mob/living/user, obj/item/I)
|
||||
. = ..()
|
||||
if(!.)
|
||||
return default_deconstruction_screwdriver(user, "medipen_refiller_open", "medipen_refiller", I)
|
||||
|
||||
/// refills the medipen
|
||||
/obj/machinery/medipen_refiller/proc/refill(obj/item/reagent_containers/hypospray/medipen/P, mob/user)
|
||||
new P.type(loc)
|
||||
reagents.remove_reagent(allowed[P.type], 10)
|
||||
cut_overlays()
|
||||
busy = FALSE
|
||||
to_chat(user, "<span class='notice'>Medipen refilled.</span>")
|
||||
@@ -0,0 +1,127 @@
|
||||
///We take a constant input of reagents, and produce a pill once a set volume is reached
|
||||
/obj/machinery/plumbing/pill_press
|
||||
name = "chemical press"
|
||||
desc = "A press that makes pills, patches and bottles."
|
||||
icon_state = "pill_press"
|
||||
///maximum size of a pill
|
||||
var/max_pill_volume = 50
|
||||
///maximum size of a patch
|
||||
var/max_patch_volume = 40
|
||||
///maximum size of a bottle
|
||||
var/max_bottle_volume = 30
|
||||
///current operating product (pills or patches)
|
||||
var/product = "pill"
|
||||
///the minimum size a pill or patch can be
|
||||
var/min_volume = 5
|
||||
///the maximum size a pill or patch can be
|
||||
var/max_volume = 50
|
||||
///selected size of the product
|
||||
var/current_volume = 10
|
||||
///prefix for the product name
|
||||
var/product_name = "factory"
|
||||
///the icon_state number for the pill.
|
||||
var/pill_number = RANDOM_PILL_STYLE
|
||||
///list of id's and icons for the pill selection of the ui
|
||||
var/list/pill_styles
|
||||
///list of products stored in the machine, so we dont have 610 pills on one tile
|
||||
var/list/stored_products = list()
|
||||
///max amount of pills allowed on our tile before we start storing them instead
|
||||
var/max_floor_products = 50 //haha massive pill piles
|
||||
|
||||
/obj/machinery/plumbing/pill_press/examine(mob/user)
|
||||
. = ..()
|
||||
. += "<span class='notice'>The [name] currently has [stored_products.len] stored. There needs to be less than [max_floor_products ] on the floor to continue dispensing.</span>"
|
||||
|
||||
/obj/machinery/plumbing/pill_press/Initialize(mapload, bolt)
|
||||
. = ..()
|
||||
AddComponent(/datum/component/plumbing/simple_demand, bolt)
|
||||
|
||||
//expertly copypasted from chemmasters
|
||||
var/datum/asset/spritesheet/simple/assets = get_asset_datum(/datum/asset/spritesheet/simple/pills)
|
||||
pill_styles = list()
|
||||
for (var/x in 1 to PILL_STYLE_COUNT)
|
||||
var/list/SL = list()
|
||||
SL["id"] = x
|
||||
SL["htmltag"] = assets.icon_tag("pill[x]")
|
||||
pill_styles += list(SL)
|
||||
|
||||
|
||||
/obj/machinery/plumbing/pill_press/process()
|
||||
if(stat & NOPOWER)
|
||||
return
|
||||
if(reagents.total_volume >= current_volume)
|
||||
if (product == "pill")
|
||||
var/obj/item/reagent_containers/pill/P = new(src)
|
||||
reagents.trans_to(P, current_volume)
|
||||
P.name = trim("[product_name] pill")
|
||||
stored_products += P
|
||||
if(pill_number == RANDOM_PILL_STYLE)
|
||||
P.icon_state = "pill[rand(1,21)]"
|
||||
else
|
||||
P.icon_state = "pill[pill_number]"
|
||||
if(P.icon_state == "pill4") //mirrored from chem masters
|
||||
P.desc = "A tablet or capsule, but not just any, a red one, one taken by the ones not scared of knowledge, freedom, uncertainty and the brutal truths of reality."
|
||||
else if (product == "patch")
|
||||
var/obj/item/reagent_containers/pill/patch/P = new(src)
|
||||
reagents.trans_to(P, current_volume)
|
||||
P.name = trim("[product_name] patch")
|
||||
stored_products += P
|
||||
else if (product == "bottle")
|
||||
var/obj/item/reagent_containers/glass/bottle/P = new(src)
|
||||
reagents.trans_to(P, current_volume)
|
||||
P.name = trim("[product_name] bottle")
|
||||
stored_products += P
|
||||
if(stored_products.len)
|
||||
var/pill_amount = 0
|
||||
for(var/obj/item/reagent_containers/pill/P in loc)
|
||||
pill_amount++
|
||||
if(pill_amount >= max_floor_products) //too much so just stop
|
||||
break
|
||||
if(pill_amount < max_floor_products)
|
||||
var/atom/movable/AM = stored_products[1] //AM because forceMove is all we need
|
||||
stored_products -= AM
|
||||
AM.forceMove(drop_location())
|
||||
|
||||
|
||||
/obj/machinery/plumbing/pill_press/ui_assets(mob/user)
|
||||
return list(
|
||||
get_asset_datum(/datum/asset/spritesheet/simple/pills),
|
||||
)
|
||||
|
||||
/obj/machinery/plumbing/pill_press/ui_interact(mob/user, datum/tgui/ui)
|
||||
ui = SStgui.try_update_ui(user, src, ui)
|
||||
if(!ui)
|
||||
ui = new(user, src, "ChemPress", name)
|
||||
ui.open()
|
||||
|
||||
/obj/machinery/plumbing/pill_press/ui_data(mob/user)
|
||||
var/list/data = list()
|
||||
data["pill_style"] = pill_number
|
||||
data["current_volume"] = current_volume
|
||||
data["product_name"] = product_name
|
||||
data["pill_styles"] = pill_styles
|
||||
data["product"] = product
|
||||
data["min_volume"] = min_volume
|
||||
data["max_volume"] = max_volume
|
||||
return data
|
||||
|
||||
/obj/machinery/plumbing/pill_press/ui_act(action, params)
|
||||
if(..())
|
||||
return
|
||||
. = TRUE
|
||||
switch(action)
|
||||
if("change_pill_style")
|
||||
pill_number = clamp(text2num(params["id"]), 1 , PILL_STYLE_COUNT)
|
||||
if("change_current_volume")
|
||||
current_volume = clamp(text2num(params["volume"]), min_volume, max_volume)
|
||||
if("change_product_name")
|
||||
product_name = html_encode(params["name"])
|
||||
if("change_product")
|
||||
product = params["product"]
|
||||
if (product == "pill")
|
||||
max_volume = max_pill_volume
|
||||
else if (product == "patch")
|
||||
max_volume = max_patch_volume
|
||||
else if (product == "bottle")
|
||||
max_volume = max_bottle_volume
|
||||
current_volume = clamp(current_volume, min_volume, max_volume)
|
||||
@@ -0,0 +1,64 @@
|
||||
///We pump liquids from activated(plungerated) geysers to a plumbing outlet. We don't need to be wired.
|
||||
/obj/machinery/plumbing/liquid_pump
|
||||
name = "liquid pump"
|
||||
desc = "Pump up those sweet liquids from under the surface. Uses thermal energy from geysers to power itself." //better than placing 200 cables, because it wasnt fun
|
||||
icon = 'icons/obj/plumbing/plumbers.dmi'
|
||||
icon_state = "pump"
|
||||
anchored = FALSE
|
||||
density = TRUE
|
||||
idle_power_usage = 10
|
||||
active_power_usage = 1000
|
||||
|
||||
rcd_cost = 30
|
||||
rcd_delay = 40
|
||||
|
||||
///units we pump per process (2 seconds)
|
||||
var/pump_power = 2
|
||||
///set to true if the loop couldnt find a geyser in process, so it remembers and stops checking every loop until moved. more accurate name would be absolutely_no_geyser_under_me_so_dont_try
|
||||
var/geyserless = FALSE
|
||||
///The geyser object
|
||||
var/obj/structure/geyser/geyser
|
||||
///volume of our internal buffer
|
||||
var/volume = 200
|
||||
|
||||
/obj/machinery/plumbing/liquid_pump/Initialize(mapload, bolt)
|
||||
. = ..()
|
||||
AddComponent(/datum/component/plumbing/simple_supply, bolt)
|
||||
|
||||
///please note that the component has a hook in the parent call, wich handles activating and deactivating
|
||||
/obj/machinery/plumbing/liquid_pump/default_unfasten_wrench(mob/user, obj/item/I, time = 20)
|
||||
. = ..()
|
||||
if(. == SUCCESSFUL_UNFASTEN)
|
||||
geyser = null
|
||||
update_icon()
|
||||
geyserless = FALSE //we switched state, so lets just set this back aswell
|
||||
|
||||
/obj/machinery/plumbing/liquid_pump/process()
|
||||
if(!anchored || panel_open || geyserless)
|
||||
return
|
||||
|
||||
if(!geyser)
|
||||
for(var/obj/structure/geyser/G in loc.contents)
|
||||
geyser = G
|
||||
update_icon()
|
||||
if(!geyser) //we didnt find one, abort
|
||||
geyserless = TRUE
|
||||
visible_message("<span class='warning'>The [name] makes a sad beep!</span>")
|
||||
playsound(src, 'sound/machines/buzz-sigh.ogg', 50)
|
||||
return
|
||||
|
||||
pump()
|
||||
|
||||
///pump up that sweet geyser nectar
|
||||
/obj/machinery/plumbing/liquid_pump/proc/pump()
|
||||
if(!geyser || !geyser.reagents)
|
||||
return
|
||||
geyser.reagents.trans_to(src, pump_power)
|
||||
|
||||
/obj/machinery/plumbing/liquid_pump/update_icon_state()
|
||||
if(geyser)
|
||||
icon_state = initial(icon_state) + "-on"
|
||||
else if(panel_open)
|
||||
icon_state = initial(icon_state) + "-open"
|
||||
else
|
||||
icon_state = initial(icon_state)
|
||||
@@ -0,0 +1,63 @@
|
||||
///a reaction chamber for plumbing. pretty much everything can react, but this one keeps the reagents seperated and only reacts under your given terms
|
||||
/obj/machinery/plumbing/reaction_chamber
|
||||
name = "reaction chamber"
|
||||
desc = "Keeps chemicals seperated until given conditions are met."
|
||||
icon_state = "reaction_chamber"
|
||||
buffer = 200
|
||||
reagent_flags = TRANSPARENT | NO_REACT
|
||||
|
||||
/**list of set reagents that the reaction_chamber allows in, and must all be present before mixing is enabled.
|
||||
* example: list(/datum/reagent/water = 20, /datum/reagent/fuel/oil = 50)
|
||||
*/
|
||||
var/list/required_reagents = list()
|
||||
///our reagent goal has been reached, so now we lock our inputs and start emptying
|
||||
var/emptying = FALSE
|
||||
|
||||
/obj/machinery/plumbing/reaction_chamber/Initialize(mapload, bolt)
|
||||
. = ..()
|
||||
AddComponent(/datum/component/plumbing/reaction_chamber, bolt)
|
||||
|
||||
/obj/machinery/plumbing/reaction_chamber/on_reagent_change()
|
||||
if(reagents.total_volume == 0 && emptying) //we were emptying, but now we aren't
|
||||
emptying = FALSE
|
||||
reagent_flags |= NO_REACT
|
||||
|
||||
/obj/machinery/plumbing/reaction_chamber/power_change()
|
||||
. = ..()
|
||||
if(use_power != NO_POWER_USE)
|
||||
icon_state = initial(icon_state) + "_on"
|
||||
else
|
||||
icon_state = initial(icon_state)
|
||||
|
||||
/obj/machinery/plumbing/reaction_chamber/ui_interact(mob/user, datum/tgui/ui)
|
||||
ui = SStgui.try_update_ui(user, src, ui)
|
||||
if(!ui)
|
||||
ui = new(user, src, "ChemReactionChamber", name)
|
||||
ui.open()
|
||||
|
||||
/obj/machinery/plumbing/reaction_chamber/ui_data(mob/user)
|
||||
var/list/data = list()
|
||||
var/list/text_reagents = list()
|
||||
for(var/A in required_reagents) //make a list where the key is text, because that looks alot better in the ui than a typepath
|
||||
var/datum/reagent/R = A
|
||||
text_reagents[initial(R.name)] = required_reagents[R]
|
||||
|
||||
data["reagents"] = text_reagents
|
||||
data["emptying"] = emptying
|
||||
return data
|
||||
|
||||
/obj/machinery/plumbing/reaction_chamber/ui_act(action, params)
|
||||
if(..())
|
||||
return
|
||||
. = TRUE
|
||||
switch(action)
|
||||
if("remove")
|
||||
var/reagent = get_chem_id(params["chem"])
|
||||
if(reagent)
|
||||
required_reagents.Remove(reagent)
|
||||
if("add")
|
||||
var/input_reagent = get_chem_id(params["chem"])
|
||||
if(input_reagent && !required_reagents.Find(input_reagent))
|
||||
var/input_amount = text2num(params["amount"])
|
||||
if(input_amount)
|
||||
required_reagents[input_reagent] = input_amount
|
||||
@@ -0,0 +1,50 @@
|
||||
///it splits the reagents however you want. So you can "every 60 units, 45 goes left and 15 goes straight". The side direction is EAST, you can change this in the component
|
||||
/obj/machinery/plumbing/splitter
|
||||
name = "Chemical Splitter"
|
||||
desc = "A chemical splitter for smart chemical factorization. Waits till a set of conditions is met and then stops all input and splits the buffer evenly or other in two ducts."
|
||||
icon_state = "splitter"
|
||||
buffer = 100
|
||||
density = FALSE
|
||||
|
||||
///constantly switches between TRUE and FALSE. TRUE means the batch tick goes straight, FALSE means the next batch goes in the side duct.
|
||||
var/turn_straight = TRUE
|
||||
///how much we must transfer straight. note input can be as high as 10 reagents per process, usually
|
||||
var/transfer_straight = 5
|
||||
///how much we must transfer to the side
|
||||
var/transfer_side = 5
|
||||
//the maximum you can set the transfer to
|
||||
var/max_transfer = 9
|
||||
|
||||
|
||||
/obj/machinery/plumbing/splitter/Initialize(mapload, bolt)
|
||||
. = ..()
|
||||
AddComponent(/datum/component/plumbing/splitter, bolt)
|
||||
|
||||
/obj/machinery/plumbing/splitter/ui_interact(mob/user, datum/tgui/ui)
|
||||
ui = SStgui.try_update_ui(user, src, ui)
|
||||
if(!ui)
|
||||
ui = new(user, src, "ChemSplitter", name)
|
||||
ui.open()
|
||||
|
||||
/obj/machinery/plumbing/splitter/ui_data(mob/user)
|
||||
var/list/data = list()
|
||||
data["straight"] = transfer_straight
|
||||
data["side"] = transfer_side
|
||||
data["max_transfer"] = max_transfer
|
||||
return data
|
||||
|
||||
/obj/machinery/plumbing/splitter/ui_act(action, params)
|
||||
if(..())
|
||||
return
|
||||
. = TRUE
|
||||
switch(action)
|
||||
if("set_amount")
|
||||
var/direction = params["target"]
|
||||
var/value = clamp(text2num(params["amount"]), 1, max_transfer)
|
||||
switch(direction)
|
||||
if("straight")
|
||||
transfer_straight = value
|
||||
if("side")
|
||||
transfer_side = value
|
||||
else
|
||||
return FALSE
|
||||
@@ -0,0 +1,111 @@
|
||||
///A single machine that produces a single chem. Can be placed in unison with others through plumbing to create chemical factories
|
||||
/obj/machinery/plumbing/synthesizer
|
||||
name = "chemical synthesizer"
|
||||
desc = "Produces a single chemical at a given volume. Must be plumbed. Most effective when working in unison with other chemical synthesizers, heaters and filters."
|
||||
|
||||
icon_state = "synthesizer"
|
||||
icon = 'icons/obj/plumbing/plumbers.dmi'
|
||||
rcd_cost = 25
|
||||
rcd_delay = 15
|
||||
|
||||
///Amount we produce for every process. Ideally keep under 5 since thats currently the standard duct capacity
|
||||
var/amount = 1
|
||||
///The maximum we can produce for every process
|
||||
buffer = 5
|
||||
///I track them here because I have no idea how I'd make tgui loop like that
|
||||
var/static/list/possible_amounts = list(0,1,2,3,4,5)
|
||||
///The reagent we are producing. We are a typepath, but are also typecast because there's several occations where we need to use initial.
|
||||
var/datum/reagent/reagent_id = null
|
||||
///straight up copied from chem dispenser. Being a subtype would be extremely tedious and making it global would restrict potential subtypes using different dispensable_reagents
|
||||
var/list/dispensable_reagents = list(
|
||||
/datum/reagent/aluminium,
|
||||
/datum/reagent/bromine,
|
||||
/datum/reagent/carbon,
|
||||
/datum/reagent/chlorine,
|
||||
/datum/reagent/copper,
|
||||
/datum/reagent/consumable/ethanol,
|
||||
/datum/reagent/fluorine,
|
||||
/datum/reagent/hydrogen,
|
||||
/datum/reagent/iodine,
|
||||
/datum/reagent/iron,
|
||||
/datum/reagent/lithium,
|
||||
/datum/reagent/mercury,
|
||||
/datum/reagent/nitrogen,
|
||||
/datum/reagent/oxygen,
|
||||
/datum/reagent/phosphorus,
|
||||
/datum/reagent/potassium,
|
||||
/datum/reagent/radium,
|
||||
/datum/reagent/silicon,
|
||||
/datum/reagent/silver,
|
||||
/datum/reagent/sodium,
|
||||
/datum/reagent/stable_plasma,
|
||||
/datum/reagent/consumable/sugar,
|
||||
/datum/reagent/sulfur,
|
||||
/datum/reagent/toxin/acid,
|
||||
/datum/reagent/water,
|
||||
/datum/reagent/fuel,
|
||||
)
|
||||
|
||||
/obj/machinery/plumbing/synthesizer/Initialize(mapload, bolt)
|
||||
. = ..()
|
||||
AddComponent(/datum/component/plumbing/simple_supply, bolt)
|
||||
|
||||
/obj/machinery/plumbing/synthesizer/process()
|
||||
if(stat & NOPOWER || !reagent_id || !amount)
|
||||
return
|
||||
if(reagents.total_volume >= amount) //otherwise we get leftovers, and we need this to be precise
|
||||
return
|
||||
reagents.add_reagent(reagent_id, amount)
|
||||
|
||||
/obj/machinery/plumbing/synthesizer/ui_interact(mob/user, datum/tgui/ui)
|
||||
ui = SStgui.try_update_ui(user, src, ui)
|
||||
if(!ui)
|
||||
ui = new(user, src, "ChemSynthesizer", name)
|
||||
ui.open()
|
||||
|
||||
/obj/machinery/plumbing/synthesizer/ui_data(mob/user)
|
||||
var/list/data = list()
|
||||
|
||||
var/is_hallucinating = user.hallucinating()
|
||||
var/list/chemicals = list()
|
||||
|
||||
for(var/A in dispensable_reagents)
|
||||
var/datum/reagent/R = GLOB.chemical_reagents_list[A]
|
||||
if(R)
|
||||
var/chemname = R.name
|
||||
if(is_hallucinating && prob(5))
|
||||
chemname = "[pick_list_replacements("hallucination.json", "chemicals")]"
|
||||
chemicals.Add(list(list("title" = chemname, "id" = ckey(R.name))))
|
||||
data["chemicals"] = chemicals
|
||||
data["amount"] = amount
|
||||
data["possible_amounts"] = possible_amounts
|
||||
|
||||
data["current_reagent"] = ckey(initial(reagent_id.name))
|
||||
return data
|
||||
|
||||
/obj/machinery/plumbing/synthesizer/ui_act(action, params)
|
||||
if(..())
|
||||
return
|
||||
. = TRUE
|
||||
switch(action)
|
||||
if("amount")
|
||||
var/new_amount = text2num(params["target"])
|
||||
if(new_amount in possible_amounts)
|
||||
amount = new_amount
|
||||
. = TRUE
|
||||
if("select")
|
||||
var/new_reagent = GLOB.name2reagent[params["reagent"]]
|
||||
if(new_reagent in dispensable_reagents)
|
||||
reagent_id = new_reagent
|
||||
. = TRUE
|
||||
update_icon()
|
||||
reagents.clear_reagents()
|
||||
|
||||
/obj/machinery/plumbing/synthesizer/update_overlays()
|
||||
. = ..()
|
||||
var/mutable_appearance/r_overlay = mutable_appearance(icon, "[icon_state]_overlay")
|
||||
if(reagent_id)
|
||||
r_overlay.color = initial(reagent_id.color)
|
||||
else
|
||||
r_overlay.color = "#FFFFFF"
|
||||
. += r_overlay
|
||||
@@ -76,7 +76,8 @@
|
||||
return 1
|
||||
|
||||
/obj/item/ammo_box/attackby(obj/item/A, mob/user, params, silent = FALSE, replace_spent = 0)
|
||||
if(INTERACTING_WITH(user, A))
|
||||
if(INTERACTING_WITH(user, src) || INTERACTING_WITH(user, A))
|
||||
to_chat(user, "<span class='notice'>You're already doing that!</span>")
|
||||
return FALSE
|
||||
var/num_loaded = 0
|
||||
if(!can_load(user))
|
||||
@@ -84,13 +85,16 @@
|
||||
if(istype(A, /obj/item/ammo_box))
|
||||
var/obj/item/ammo_box/AM = A
|
||||
for(var/obj/item/ammo_casing/AC in AM.stored_ammo)
|
||||
if(load_delay && do_after(user, load_delay, target = src))
|
||||
var/did_load = give_round(AC, replace_spent)
|
||||
if(did_load)
|
||||
AM.stored_ammo -= AC
|
||||
num_loaded++
|
||||
if(!did_load || !multiload)
|
||||
break
|
||||
if(load_delay || AM.load_delay)
|
||||
var/loadtime = max(AM.load_delay, load_delay)
|
||||
if(!do_after(user, loadtime, target = src))
|
||||
return FALSE
|
||||
var/did_load = give_round(AC, replace_spent)
|
||||
if(did_load)
|
||||
AM.stored_ammo -= AC
|
||||
num_loaded++
|
||||
if(!did_load || !multiload)
|
||||
break
|
||||
if(istype(A, /obj/item/ammo_casing))
|
||||
var/obj/item/ammo_casing/AC = A
|
||||
if(give_round(AC, replace_spent))
|
||||
|
||||
@@ -53,6 +53,8 @@
|
||||
..()
|
||||
if (istype(A, /obj/item/ammo_box/magazine))
|
||||
var/obj/item/ammo_box/magazine/AM = A
|
||||
if(AM.load_delay && !do_after(user, AM.load_delay, target = src))
|
||||
return FALSE
|
||||
if (!magazine && istype(AM, mag_type))
|
||||
if(user.transferItemToLoc(AM, src))
|
||||
magazine = AM
|
||||
|
||||
@@ -1165,3 +1165,9 @@
|
||||
random_reagents += R
|
||||
var/picked_reagent = pick(random_reagents)
|
||||
return picked_reagent
|
||||
|
||||
/proc/get_chem_id(chem_name)
|
||||
for(var/X in GLOB.chemical_reagents_list)
|
||||
var/datum/reagent/R = GLOB.chemical_reagents_list[X]
|
||||
if(ckey(chem_name) == ckey(lowertext(R.name)))
|
||||
return X
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
#define PILL_STYLE_COUNT 22 //Update this if you add more pill icons or you die
|
||||
#define RANDOM_PILL_STYLE 22 //Dont change this one though
|
||||
|
||||
/obj/machinery/chem_master
|
||||
name = "ChemMaster 3000"
|
||||
|
||||
@@ -36,6 +36,14 @@
|
||||
for(var/obj/item/stock_parts/matter_bin/B in component_parts)
|
||||
reagents.maximum_volume += REAGENTS_BASE_VOLUME * B.rating
|
||||
|
||||
/obj/machinery/smoke_machine/ComponentInitialize()
|
||||
. = ..()
|
||||
AddComponent(/datum/component/simple_rotation, ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_COUNTERCLOCKWISE | ROTATION_VERBS, null, CALLBACK(src, .proc/can_be_rotated))
|
||||
AddComponent(/datum/component/plumbing/simple_demand) //this SURELY CANT' LEAD TO BAD THINGS HAPPENING.
|
||||
|
||||
/obj/machinery/smoke_machine/proc/can_be_rotated(mob/user, rotation_type)
|
||||
return !anchored
|
||||
|
||||
/obj/machinery/smoke_machine/update_icon_state()
|
||||
if((!is_operational()) || (!on) || (reagents.total_volume == 0))
|
||||
if (panel_open)
|
||||
|
||||
@@ -8,6 +8,7 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent())
|
||||
if (length(initial(R.name)))
|
||||
.[ckey(initial(R.name))] = t
|
||||
|
||||
|
||||
//Various reagents
|
||||
//Toxin & acid reagents
|
||||
//Hydroponics stuff
|
||||
@@ -52,6 +53,14 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent())
|
||||
var/metabolizing = FALSE
|
||||
var/chemical_flags // See fermi/readme.dm REAGENT_DEAD_PROCESS, REAGENT_DONOTSPLIT, REAGENT_ONLYINVERSE, REAGENT_ONMOBMERGE, REAGENT_INVISIBLE, REAGENT_FORCEONNEW, REAGENT_SNEAKYNAME
|
||||
var/value = REAGENT_VALUE_NONE //How much does it sell for in cargo?
|
||||
var/datum/material/material //are we made of material?
|
||||
|
||||
/datum/reagent/New()
|
||||
. = ..()
|
||||
|
||||
if(material)
|
||||
material = SSmaterials.GetMaterialRef(material)
|
||||
|
||||
|
||||
/datum/reagent/Destroy() // This should only be called by the holder, so it's already handled clearing its references
|
||||
. = ..()
|
||||
@@ -220,4 +229,3 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent())
|
||||
bloodsuckerdatum.handle_eat_human_food(disgust, blood_puke, force)
|
||||
if(blood_change)
|
||||
bloodsuckerdatum.AddBloodVolume(blood_change)
|
||||
|
||||
|
||||
@@ -132,8 +132,8 @@
|
||||
"<span class='userdanger'>You're covered in boiling oil!</span>")
|
||||
M.emote("scream")
|
||||
playsound(M, 'sound/machines/fryer/deep_fryer_emerge.ogg', 25, TRUE)
|
||||
var/oil_damage = max((holder.chem_temp / fry_temperature) * 0.33,1) //Damage taken per unit
|
||||
M.adjustFireLoss(oil_damage * max(reac_volume,20)) //Damage caps at 20
|
||||
var/oil_damage = min((holder.chem_temp / fry_temperature) * 0.33,1) //Damage taken per unit
|
||||
M.adjustFireLoss(oil_damage * min(reac_volume,20)) //Damage caps at 20
|
||||
else
|
||||
..()
|
||||
return TRUE
|
||||
|
||||
@@ -515,12 +515,13 @@
|
||||
overdose_threshold = 30
|
||||
pH = 2
|
||||
value = REAGENT_VALUE_UNCOMMON
|
||||
var/healing = 0.5
|
||||
|
||||
/datum/reagent/medicine/omnizine/on_mob_life(mob/living/carbon/M)
|
||||
M.adjustToxLoss(-0.5*REM, 0)
|
||||
M.adjustOxyLoss(-0.5*REM, 0)
|
||||
M.adjustBruteLoss(-0.5*REM, 0)
|
||||
M.adjustFireLoss(-0.5*REM, 0)
|
||||
M.adjustToxLoss(-healing*REM, 0)
|
||||
M.adjustOxyLoss(-healing*REM, 0)
|
||||
M.adjustBruteLoss(-healing*REM, 0)
|
||||
M.adjustFireLoss(-healing*REM, 0)
|
||||
..()
|
||||
. = 1
|
||||
|
||||
@@ -532,6 +533,12 @@
|
||||
..()
|
||||
. = 1
|
||||
|
||||
/datum/reagent/medicine/omnizine/protozine
|
||||
name = "Protozine"
|
||||
description = "A less environmentally friendly and somewhat weaker variant of omnizine."
|
||||
color = "#d8c7b7"
|
||||
healing = 0.2
|
||||
|
||||
/datum/reagent/medicine/calomel
|
||||
name = "Calomel"
|
||||
description = "Quickly purges the body of all chemicals. Toxin damage is dealt if the patient is in good condition."
|
||||
|
||||
@@ -313,6 +313,13 @@
|
||||
metabolization_rate = 45 * REAGENTS_METABOLISM
|
||||
. = 1
|
||||
|
||||
/datum/reagent/water/hollowwater
|
||||
name = "Hollow Water"
|
||||
description = "An ubiquitous chemical substance that is composed of hydrogen and oxygen, but it looks kinda hollow."
|
||||
color = "#88878777"
|
||||
taste_description = "emptyiness"
|
||||
|
||||
|
||||
/datum/reagent/water/holywater
|
||||
name = "Holy Water"
|
||||
description = "Water blessed by some deity."
|
||||
@@ -950,6 +957,7 @@
|
||||
color = "#1C1300" // rgb: 30, 20, 0
|
||||
taste_description = "sour chalk"
|
||||
pH = 5
|
||||
material = /datum/material/diamond
|
||||
|
||||
/datum/reagent/carbon/reaction_turf(turf/T, reac_volume)
|
||||
if(!isspaceturf(T))
|
||||
@@ -1072,6 +1080,7 @@
|
||||
pH = 6
|
||||
overdose_threshold = 30
|
||||
color = "#c2391d"
|
||||
material = /datum/material/iron
|
||||
|
||||
/datum/reagent/iron/on_mob_life(mob/living/carbon/C)
|
||||
if((HAS_TRAIT(C, TRAIT_NOMARROW)))
|
||||
@@ -1103,6 +1112,7 @@
|
||||
reagent_state = SOLID
|
||||
color = "#F7C430" // rgb: 247, 196, 48
|
||||
taste_description = "expensive metal"
|
||||
material = /datum/material/gold
|
||||
|
||||
/datum/reagent/silver
|
||||
name = "Silver"
|
||||
@@ -1110,6 +1120,7 @@
|
||||
reagent_state = SOLID
|
||||
color = "#D0D0D0" // rgb: 208, 208, 208
|
||||
taste_description = "expensive yet reasonable metal"
|
||||
material = /datum/material/silver
|
||||
|
||||
/datum/reagent/silver/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
|
||||
if(M.has_bane(BANE_SILVER))
|
||||
@@ -1123,6 +1134,7 @@
|
||||
color = "#B8B8C0" // rgb: 184, 184, 192
|
||||
taste_description = "the inside of a reactor"
|
||||
pH = 4
|
||||
material = /datum/material/uranium
|
||||
|
||||
/datum/reagent/uranium/on_mob_life(mob/living/carbon/M)
|
||||
M.apply_effect(1/M.metabolism_efficiency,EFFECT_IRRADIATE,0)
|
||||
@@ -1144,6 +1156,7 @@
|
||||
taste_description = "fizzling blue"
|
||||
pH = 12
|
||||
value = REAGENT_VALUE_RARE
|
||||
material = /datum/material/bluespace
|
||||
|
||||
/datum/reagent/bluespace/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
|
||||
if(method == TOUCH || method == VAPOR)
|
||||
@@ -1182,6 +1195,7 @@
|
||||
color = "#A8A8A8" // rgb: 168, 168, 168
|
||||
taste_mult = 0
|
||||
pH = 10
|
||||
material = /datum/material/glass
|
||||
|
||||
/datum/reagent/fuel
|
||||
name = "Welding fuel"
|
||||
@@ -2206,6 +2220,66 @@
|
||||
color = "#f7685e"
|
||||
metabolization_rate = REAGENTS_METABOLISM * 0.25
|
||||
|
||||
/datum/reagent/wittel
|
||||
name = "Wittel"
|
||||
description = "An extremely rare metallic-white substance only found on demon-class planets."
|
||||
color = "#FFFFFF" // rgb: 255, 255, 255
|
||||
taste_mult = 0 // oderless and tasteless
|
||||
|
||||
/datum/reagent/metalgen
|
||||
name = "Metalgen"
|
||||
data = list("material"=null)
|
||||
description = "A purple metal morphic liquid, said to impose it's metallic properties on whatever it touches."
|
||||
color = "#b000aa"
|
||||
taste_mult = 0 // oderless and tasteless
|
||||
var/applied_material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR
|
||||
var/minumum_material_amount = 100
|
||||
|
||||
/datum/reagent/metalgen/reaction_obj(obj/O, volume)
|
||||
metal_morph(O)
|
||||
return
|
||||
|
||||
/datum/reagent/metalgen/reaction_turf(turf/T, volume)
|
||||
metal_morph(T)
|
||||
return
|
||||
|
||||
///turn an object into a special material
|
||||
/datum/reagent/metalgen/proc/metal_morph(atom/A)
|
||||
var/metal_ref = data["material"]
|
||||
if(!metal_ref)
|
||||
return
|
||||
var/metal_amount = 0
|
||||
|
||||
for(var/B in A.custom_materials) //list with what they're made of
|
||||
metal_amount += A.custom_materials[B]
|
||||
|
||||
if(!metal_amount)
|
||||
metal_amount = minumum_material_amount //some stuff doesn't have materials at all. To still give them properties, we give them a material. Basically doesnt exist
|
||||
|
||||
var/list/metal_dat = list()
|
||||
metal_dat[metal_ref] = metal_amount //if we pass the list directly, byond turns metal_ref into "metal_ref" kjewrg8fwcyvf
|
||||
|
||||
A.material_flags = applied_material_flags
|
||||
A.set_custom_materials(metal_dat)
|
||||
|
||||
/datum/reagent/gravitum
|
||||
name = "Gravitum"
|
||||
description = "A rare kind of null fluid, capable of temporalily removing all weight of whatever it touches." //i dont even
|
||||
color = "#050096" // rgb: 5, 0, 150
|
||||
taste_mult = 0 // oderless and tasteless
|
||||
metabolization_rate = 0.1 * REAGENTS_METABOLISM //20 times as long, so it's actually viable to use
|
||||
var/time_multiplier = 1 MINUTES //1 minute per unit of gravitum on objects. Seems overpowered, but the whole thing is very niche
|
||||
|
||||
/datum/reagent/gravitum/reaction_obj(obj/O, volume)
|
||||
O.AddElement(/datum/element/forced_gravity, 0)
|
||||
|
||||
addtimer(CALLBACK(O, .proc/_RemoveElement, /datum/element/forced_gravity, 0), volume * time_multiplier)
|
||||
|
||||
/datum/reagent/gravitum/on_mob_add(mob/living/L)
|
||||
L.AddElement(/datum/element/forced_gravity, 0) //0 is the gravity, and in this case weightless
|
||||
|
||||
/datum/reagent/gravitum/on_mob_end_metabolize(mob/living/L)
|
||||
L.RemoveElement(/datum/element/forced_gravity, 0)
|
||||
|
||||
//body bluids
|
||||
/datum/reagent/consumable/semen
|
||||
@@ -2218,6 +2292,7 @@
|
||||
color = "#FFFFFF" // rgb: 255, 255, 255
|
||||
can_synth = FALSE
|
||||
nutriment_factor = 0.5 * REAGENTS_METABOLISM
|
||||
var/decal_path = /obj/effect/decal/cleanable/semen
|
||||
|
||||
/datum/reagent/consumable/semen/reaction_turf(turf/T, reac_volume)
|
||||
if(!istype(T))
|
||||
@@ -2227,7 +2302,7 @@
|
||||
|
||||
var/obj/effect/decal/cleanable/semen/S = locate() in T
|
||||
if(!S)
|
||||
S = new(T)
|
||||
S = new decal_path(T)
|
||||
if(data["blood_DNA"])
|
||||
S.add_blood_DNA(list(data["blood_DNA"] = data["blood_type"]))
|
||||
|
||||
@@ -2251,51 +2326,20 @@
|
||||
blood_DNA |= S.blood_DNA
|
||||
return ..()
|
||||
|
||||
/datum/reagent/consumable/femcum
|
||||
/datum/reagent/consumable/semen/femcum
|
||||
name = "Female Ejaculate"
|
||||
description = "Vaginal lubricant found in most mammals and other animals of similar nature. Where you found this is your own business."
|
||||
taste_description = "something with a tang" // wew coders who haven't eaten out a girl.
|
||||
taste_mult = 2
|
||||
data = list("donor"=null,"viruses"=null,"donor_DNA"=null,"blood_type"=null,"resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null)
|
||||
reagent_state = LIQUID
|
||||
color = "#AAAAAA77"
|
||||
can_synth = FALSE
|
||||
nutriment_factor = 0.5 * REAGENTS_METABOLISM
|
||||
decal_path = /obj/effect/decal/cleanable/semen/femcum
|
||||
|
||||
/obj/effect/decal/cleanable/femcum
|
||||
/obj/effect/decal/cleanable/semen/femcum
|
||||
name = "female ejaculate"
|
||||
desc = null
|
||||
gender = PLURAL
|
||||
density = 0
|
||||
layer = ABOVE_NORMAL_TURF_LAYER
|
||||
icon = 'icons/obj/genitals/effects.dmi'
|
||||
icon_state = "fem1"
|
||||
random_icon_states = list("fem1", "fem2", "fem3", "fem4")
|
||||
blood_state = null
|
||||
bloodiness = null
|
||||
|
||||
/obj/effect/decal/cleanable/femcum/Initialize(mapload)
|
||||
. = ..()
|
||||
dir = GLOB.cardinals
|
||||
add_blood_DNA(list("Non-human DNA" = "A+"))
|
||||
|
||||
/obj/effect/decal/cleanable/femcum/replace_decal(obj/effect/decal/cleanable/femcum/F)
|
||||
if(F.blood_DNA)
|
||||
blood_DNA |= F.blood_DNA
|
||||
return ..()
|
||||
|
||||
/datum/reagent/consumable/femcum/reaction_turf(turf/T, reac_volume)
|
||||
if(!istype(T))
|
||||
return
|
||||
if(reac_volume < 10)
|
||||
return
|
||||
|
||||
var/obj/effect/decal/cleanable/femcum/S = locate() in T
|
||||
if(!S)
|
||||
S = new(T)
|
||||
if(data["blood_DNA"])
|
||||
S.add_blood_DNA(list(data["blood_DNA"] = data["blood_type"]))
|
||||
|
||||
/datum/reagent/determination
|
||||
name = "Determination"
|
||||
description = "For when you need to push on a little more. Do NOT allow near plants."
|
||||
@@ -2364,6 +2408,7 @@ datum/reagent/eldritch
|
||||
color = "#E6E6DA"
|
||||
taste_mult = 0
|
||||
|
||||
|
||||
/datum/reagent/hairball
|
||||
name = "Hairball"
|
||||
description = "A bundle of keratinous bits and fibers, not easily digestible."
|
||||
|
||||
@@ -64,6 +64,7 @@
|
||||
toxpwr = 3
|
||||
pH = 4
|
||||
value = REAGENT_VALUE_RARE //sheets are worth more
|
||||
material = /datum/material/plasma
|
||||
|
||||
/datum/reagent/toxin/plasma/on_mob_life(mob/living/carbon/C)
|
||||
if(holder.has_reagent(/datum/reagent/medicine/epinephrine))
|
||||
|
||||
@@ -219,6 +219,12 @@
|
||||
results = list(/datum/reagent/medicine/strange_reagent = 3)
|
||||
required_reagents = list(/datum/reagent/medicine/omnizine = 1, /datum/reagent/water/holywater = 1, /datum/reagent/toxin/mutagen = 1)
|
||||
|
||||
/datum/chemical_reaction/strange_reagent/alt
|
||||
name = "Strange Reagent"
|
||||
id = /datum/reagent/medicine/strange_reagent
|
||||
results = list(/datum/reagent/medicine/strange_reagent = 2)
|
||||
required_reagents = list(/datum/reagent/medicine/omnizine/protozine = 1, /datum/reagent/water/holywater = 1, /datum/reagent/toxin/mutagen = 1)
|
||||
|
||||
/datum/chemical_reaction/mannitol
|
||||
name = "Mannitol"
|
||||
id = /datum/reagent/medicine/mannitol
|
||||
@@ -345,4 +351,20 @@
|
||||
/datum/chemical_reaction/medmesh/on_reaction(datum/reagents/holder, created_volume)
|
||||
var/location = get_turf(holder.my_atom)
|
||||
for(var/i = 1, i <= created_volume, i++)
|
||||
new /obj/item/stack/medical/mesh/advanced(location)
|
||||
new /obj/item/stack/medical/mesh/advanced(location)
|
||||
|
||||
/datum/chemical_reaction/suture
|
||||
required_reagents = list(/datum/reagent/cellulose = 2, /datum/reagent/medicine/styptic_powder = 2)
|
||||
|
||||
/datum/chemical_reaction/suture/on_reaction(datum/reagents/holder, created_volume)
|
||||
var/location = get_turf(holder.my_atom)
|
||||
for(var/i = 1, i <= created_volume, i++)
|
||||
new /obj/item/stack/medical/suture/(location)
|
||||
|
||||
/datum/chemical_reaction/mesh
|
||||
required_reagents = list(/datum/reagent/cellulose = 2, /datum/reagent/medicine/silver_sulfadiazine = 2)
|
||||
|
||||
/datum/chemical_reaction/mesh/on_reaction(datum/reagents/holder, created_volume)
|
||||
var/location = get_turf(holder.my_atom)
|
||||
for(var/i = 1, i <= created_volume, i++)
|
||||
new /obj/item/stack/medical/mesh/(location)
|
||||
|
||||
@@ -1,3 +1,34 @@
|
||||
/datum/chemical_reaction/metalgen
|
||||
name = "metalgen"
|
||||
id = /datum/reagent/metalgen
|
||||
required_reagents = list(/datum/reagent/wittel = 1, /datum/reagent/bluespace = 1, /datum/reagent/toxin/mutagen = 1)
|
||||
results = list(/datum/reagent/metalgen = 1)
|
||||
|
||||
/datum/chemical_reaction/metalgen_imprint
|
||||
name = "metalgen imprint"
|
||||
id = /datum/reagent/metalgen
|
||||
required_reagents = list(/datum/reagent/metalgen = 1, /datum/reagent/liquid_dark_matter = 1)
|
||||
results = list(/datum/reagent/metalgen = 1)
|
||||
|
||||
/datum/chemical_reaction/holywater
|
||||
name = "Holy Water"
|
||||
id = /datum/reagent/water/holywater
|
||||
results = list(/datum/reagent/water/holywater = 1)
|
||||
required_reagents = list(/datum/reagent/water/hollowwater = 1)
|
||||
required_catalysts = list(/datum/reagent/water/holywater = 1)
|
||||
|
||||
/datum/chemical_reaction/metalgen_imprint/on_reaction(datum/reagents/holder, created_volume)
|
||||
var/datum/reagent/metalgen/MM = holder.get_reagent(/datum/reagent/metalgen)
|
||||
for(var/datum/reagent/R in holder.reagent_list)
|
||||
if(R.material && R.volume >= 40)
|
||||
MM.data["material"] = R.material
|
||||
holder.remove_reagent(R.type, 40)
|
||||
|
||||
/datum/chemical_reaction/gravitum
|
||||
name = "gravitum"
|
||||
id = /datum/reagent/gravitum
|
||||
required_reagents = list(/datum/reagent/wittel = 1, /datum/reagent/sorium = 10)
|
||||
results = list(/datum/reagent/gravitum = 10)
|
||||
|
||||
/datum/chemical_reaction/sterilizine
|
||||
name = "Sterilizine"
|
||||
@@ -711,7 +742,7 @@
|
||||
/datum/chemical_reaction/slime_extractification/on_reaction(datum/reagents/holder, created_volume)
|
||||
var/location = get_turf(holder.my_atom)
|
||||
new /obj/item/slime_extract/grey(location)
|
||||
|
||||
|
||||
// Liquid Carpets
|
||||
|
||||
/datum/chemical_reaction/carpet
|
||||
|
||||
@@ -24,7 +24,8 @@
|
||||
|
||||
/obj/structure/reagent_dispensers/Initialize()
|
||||
create_reagents(tank_volume, DRAINABLE | AMOUNT_VISIBLE)
|
||||
reagents.add_reagent(reagent_id, tank_volume)
|
||||
if(reagent_id)
|
||||
reagents.add_reagent(reagent_id, tank_volume)
|
||||
. = ..()
|
||||
|
||||
/obj/structure/reagent_dispensers/proc/boom()
|
||||
@@ -91,6 +92,38 @@
|
||||
user.put_in_hands(S)
|
||||
paper_cups--
|
||||
|
||||
/obj/structure/reagent_dispensers/plumbed
|
||||
name = "stationairy water tank"
|
||||
anchored = TRUE
|
||||
icon_state = "water_stationairy"
|
||||
desc = "A stationairy, plumbed, water tank."
|
||||
|
||||
/obj/structure/reagent_dispensers/plumbed/wrench_act(mob/living/user, obj/item/I)
|
||||
default_unfasten_wrench(user, I)
|
||||
return TRUE
|
||||
|
||||
/obj/structure/reagent_dispensers/plumbed/default_unfasten_wrench(mob/user, obj/item/I, time = 20)
|
||||
. = ..()
|
||||
if(. == SUCCESSFUL_UNFASTEN)
|
||||
user.visible_message("<span class='notice'>[user.name] [anchored ? "fasten" : "unfasten"] [src]</span>", \
|
||||
"<span class='notice'>You [anchored ? "fasten" : "unfasten"] [src]</span>")
|
||||
var/datum/component/plumbing/CP = GetComponent(/datum/component/plumbing)
|
||||
if(anchored)
|
||||
CP.enable()
|
||||
else
|
||||
CP.disable()
|
||||
|
||||
/obj/structure/reagent_dispensers/plumbed/ComponentInitialize()
|
||||
AddComponent(/datum/component/plumbing/simple_supply)
|
||||
|
||||
/obj/structure/reagent_dispensers/plumbed/storage
|
||||
name = "stationairy storage tank"
|
||||
icon_state = "tank_stationairy"
|
||||
reagent_id = null //start empty
|
||||
|
||||
/obj/structure/reagent_dispensers/plumbed/storage/ComponentInitialize()
|
||||
AddComponent(/datum/component/plumbing/tank)
|
||||
|
||||
//////////////
|
||||
//Fuel Tanks//
|
||||
//////////////
|
||||
@@ -271,5 +304,3 @@
|
||||
icon_state = "bluekeg"
|
||||
reagent_id = /datum/reagent/consumable/ethanol/neurotoxin
|
||||
tank_volume = 100 //2.5x less than the other kegs because it's harder to get
|
||||
|
||||
|
||||
|
||||
@@ -105,3 +105,11 @@
|
||||
build_path = /obj/item/circuitboard/machine/bloodbankgen
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
|
||||
category = list ("Medical Machinery")
|
||||
|
||||
/datum/design/board/medipen_refiller
|
||||
name = "Machine Design (Medipen Refiller)"
|
||||
desc = "The circuit board for a Medipen Refiller."
|
||||
id = "medipen_refiller"
|
||||
build_path = /obj/item/circuitboard/machine/medipen_refiller
|
||||
category = list ("Medical Machinery")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
|
||||
|
||||
@@ -81,6 +81,14 @@
|
||||
category = list ("Hydroponics Machinery")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_SERVICE
|
||||
|
||||
/datum/design/board/hydroponics/auto
|
||||
name = "Machine Design (Automatic Hydroponics Tray Board)"
|
||||
desc = "The circuit board for an automatic hydroponics tray. GIVE ME THE PLANT, CAPTAIN."
|
||||
id = "autohydrotray"
|
||||
build_path = /obj/machinery/hydroponics/constructable/automagic
|
||||
category = list ("Hydroponics Machinery")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_SERVICE | DEPARTMENTAL_FLAG_MEDICAL
|
||||
|
||||
/datum/design/board/monkey_recycler
|
||||
name = "Machine Design (Monkey Recycler Board)"
|
||||
desc = "The circuit board for a monkey recycler."
|
||||
|
||||
@@ -961,3 +961,158 @@
|
||||
build_path = /obj/item/bodypart/r_arm/robot/surplus_upgraded
|
||||
category = list("Medical Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
|
||||
|
||||
|
||||
/datum/design/acclimator
|
||||
name = "Plumbing Acclimator"
|
||||
desc = "A heating and cooling device for pipes!"
|
||||
id = "acclimator"
|
||||
build_type = PROTOLATHE
|
||||
materials = list(/datum/material/iron = 1000, /datum/material/glass = 500)
|
||||
construction_time = 15
|
||||
build_path = /obj/machinery/plumbing/acclimator
|
||||
category = list("Misc","Medical Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
|
||||
|
||||
/datum/design/disposer
|
||||
name = "Plumbing Disposer"
|
||||
desc = "Using the power of Science, dissolves reagents into nothing (almost)."
|
||||
id = "disposer"
|
||||
build_type = PROTOLATHE
|
||||
materials = list(/datum/material/iron = 500, /datum/material/glass = 100)
|
||||
construction_time = 15
|
||||
build_path = /obj/machinery/plumbing/disposer
|
||||
category = list("Misc","Medical Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
|
||||
|
||||
/datum/design/plumb_filter
|
||||
name = "Plumbing Filter"
|
||||
desc = "Filters out chemicals by their NTDB ID."
|
||||
id = "plumb_filter"
|
||||
build_type = PROTOLATHE
|
||||
materials = list(/datum/material/iron = 1000, /datum/material/glass = 500)
|
||||
construction_time = 15
|
||||
build_path = /obj/machinery/plumbing/filter
|
||||
category = list("Misc","Medical Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
|
||||
|
||||
/datum/design/plumb_synth
|
||||
name = "Plumbing Synthesizer"
|
||||
desc = "Using standard mass-energy dynamic autoconverters, generates reagents from power and puts them in a pipe."
|
||||
id = "plumb_synth"
|
||||
build_type = PROTOLATHE
|
||||
materials = list(/datum/material/iron = 5000, /datum/material/glass = 1000, /datum/material/plastic = 1000)
|
||||
construction_time = 15
|
||||
build_path = /obj/machinery/plumbing/synthesizer
|
||||
category = list("Misc","Medical Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
|
||||
|
||||
/datum/design/plumb_grinder
|
||||
name = "Plumbing-Linked Autogrinder"
|
||||
desc = "Automatically extracts reagents from an item by grinding it. Think of the possibilities! Note: does not grind people."
|
||||
id = "plumb_grinder"
|
||||
build_type = PROTOLATHE
|
||||
materials = list(/datum/material/iron = 2000, /datum/material/glass = 1500)
|
||||
construction_time = 15
|
||||
build_path = /obj/machinery/plumbing/grinder_chemical
|
||||
category = list("Misc","Medical Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
|
||||
|
||||
/datum/design/reaction_chamber
|
||||
name = "Plumbing Reaction Chamber"
|
||||
desc = "You can set a list of allowed reagents and amounts. Once the chamber has these reagents, will let the products through."
|
||||
id = "reaction_chamber"
|
||||
build_type = PROTOLATHE
|
||||
materials = list(/datum/material/iron = 1000, /datum/material/glass = 500)
|
||||
construction_time = 15
|
||||
build_path = /obj/machinery/plumbing/reaction_chamber
|
||||
category = list("Misc","Medical Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
|
||||
|
||||
/datum/design/duct_print
|
||||
name = "Plumbing Ducts"
|
||||
desc = "Ducts for plumbing! Now lathed for efficiency."
|
||||
id = "duct_print"
|
||||
build_type = PROTOLATHE
|
||||
materials = list(/datum/material/plastic = 400)
|
||||
construction_time = 1
|
||||
build_path = /obj/item/stack/ducts
|
||||
category = list("Misc","Medical Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
|
||||
|
||||
/datum/design/plumb_splitter
|
||||
name = "Plumbing Chemical Splitter"
|
||||
desc = "A splitter. Has 2 outputs. Can be configured to allow a certain amount through each side."
|
||||
id = "plumb_splitter"
|
||||
build_type = PROTOLATHE
|
||||
materials = list(/datum/material/iron = 750, /datum/material/glass = 250)
|
||||
construction_time = 15
|
||||
build_path = /obj/machinery/plumbing/splitter
|
||||
category = list("Misc","Medical Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
|
||||
|
||||
/datum/design/pill_press
|
||||
name = "Plumbing Automatic Pill Former"
|
||||
desc = "Automatically forms pills to the required parameters with piped reagents! A good replacement for those lazy, useless chemists."
|
||||
id = "pill_press"
|
||||
build_type = PROTOLATHE
|
||||
materials = list(/datum/material/iron = 1000, /datum/material/glass = 500)
|
||||
construction_time = 15
|
||||
build_path = /obj/machinery/plumbing/pill_press
|
||||
category = list("Misc","Medical Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
|
||||
|
||||
/datum/design/plumb_pump
|
||||
name = "Liquid Extraction Pump"
|
||||
desc = "Use it for extracting liquids from lavaland's geysers!"
|
||||
id = "plumb_pump"
|
||||
build_type = PROTOLATHE
|
||||
materials = list(/datum/material/iron = 1000, /datum/material/glass = 500)
|
||||
construction_time = 15
|
||||
build_path = /obj/machinery/plumbing/liquid_pump
|
||||
category = list("Misc","Medical Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
|
||||
|
||||
/datum/design/plumb_in
|
||||
name = "Plumbing Input Device"
|
||||
desc = "A big piped funnel for putting stuff in the pipe network."
|
||||
id = "plumb_in"
|
||||
build_type = PROTOLATHE
|
||||
materials = list(/datum/material/iron = 400, /datum/material/glass = 400)
|
||||
construction_time = 15
|
||||
build_path = /obj/machinery/plumbing/input
|
||||
category = list("Misc","Medical Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
|
||||
|
||||
/datum/design/plumb_out
|
||||
name = "Plumbing Output Device"
|
||||
desc = "A big piped funnel for taking stuff out of the pipe network."
|
||||
id = "plumb_out"
|
||||
build_type = PROTOLATHE
|
||||
materials = list(/datum/material/iron = 400, /datum/material/glass = 400)
|
||||
construction_time = 15
|
||||
build_path = /obj/machinery/plumbing/output
|
||||
category = list("Misc","Medical Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
|
||||
|
||||
/datum/design/plumb_tank
|
||||
name = "Plumbed Storage Tank"
|
||||
desc = "A tank for storing plumbed reagents."
|
||||
id = "plumb_tank"
|
||||
build_type = PROTOLATHE
|
||||
materials = list(/datum/material/iron = 10000, /datum/material/glass = 10000, /datum/material/plastic = 4000)
|
||||
construction_time = 15
|
||||
build_path = /obj/machinery/plumbing/tank
|
||||
category = list("Misc","Medical Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
|
||||
|
||||
/datum/design/plumb_rcd
|
||||
name = "Plumbed Autoconstruction Device"
|
||||
desc = "A RCD for plumbing machines! Cannot make ducts."
|
||||
id = "plumb_rcd"
|
||||
build_type = PROTOLATHE
|
||||
materials = list(/datum/material/iron = 20000, /datum/material/glass = 10000, /datum/material/plastic = 20000, /datum/material/titanium = 2000, /datum/material/diamond = 800, /datum/material/gold = 2000, /datum/material/silver = 2000)
|
||||
construction_time = 150
|
||||
build_path = /obj/item/construction/plumbing
|
||||
category = list("Misc","Medical Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
|
||||
|
||||
@@ -10,6 +10,9 @@
|
||||
/datum/nanite_extra_setting/text/get_copy()
|
||||
return new /datum/nanite_extra_setting/text(value)
|
||||
|
||||
/datum/nanite_extra_setting/text/get_value()
|
||||
return html_encode(value)
|
||||
|
||||
/datum/nanite_extra_setting/text/get_frontend_list(name)
|
||||
return list(list(
|
||||
"name" = name,
|
||||
|
||||
@@ -176,7 +176,7 @@
|
||||
sent_message = message_setting.get_value()
|
||||
if(host_mob.stat == DEAD)
|
||||
return
|
||||
to_chat(host_mob, "<i>You hear a strange, robotic voice in your head...</i> \"<span class='robot'>[sent_message]</span>\"")
|
||||
to_chat(host_mob, "<i>You hear a strange, robotic voice in your head...</i> \"<span class='robot'>[html_encode(sent_message)]</span>\"")
|
||||
|
||||
/datum/nanite_program/comm/hallucination
|
||||
name = "Hallucination"
|
||||
|
||||
@@ -24,6 +24,23 @@
|
||||
design_ids = list("defib_decay", "defib_shock", "defib_heal", "defib_speed")
|
||||
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
|
||||
|
||||
/datum/techweb_node/plumbing
|
||||
id = "plumbing"
|
||||
display_name = "Reagent Plumbing Technology"
|
||||
description = "Plastic tubes, and machinery used for manipulating things in them."
|
||||
prereq_ids = list("base")
|
||||
design_ids = list("acclimator", "disposer", "plumb_filter", "plumb_synth", "plumb_grinder", "reaction_chamber", "duct_print", "plumb_splitter", "pill_press", "plumb_pump", "plumb_in", "plumb_out", "plumb_tank", "medipen_refiller")
|
||||
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1000)
|
||||
|
||||
|
||||
/datum/techweb_node/advplumbing
|
||||
id = "advplumbing"
|
||||
display_name = "Advanced Plumbing Technology"
|
||||
description = "Plumbing RCD."
|
||||
prereq_ids = list("plumbing", "adv_engi")
|
||||
design_ids = list("plumb_rcd", "autohydrotray")
|
||||
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
|
||||
|
||||
//////////////////////Cybernetics/////////////////////
|
||||
|
||||
/datum/techweb_node/surplus_limbs
|
||||
|
||||
@@ -43,6 +43,7 @@ GLOBAL_LIST_EMPTY(custom_shuttle_machines) //Machines that require updating (He
|
||||
. = ..()
|
||||
internal_shuttle_creator = new()
|
||||
internal_shuttle_creator.owner_rsd = src
|
||||
desc += " Attention, the max size of the shuttle is [SHUTTLE_CREATOR_MAX_SIZE]."
|
||||
overlay_holder = new()
|
||||
|
||||
/obj/item/shuttle_creator/Destroy()
|
||||
@@ -237,13 +238,13 @@ GLOBAL_LIST_EMPTY(custom_shuttle_machines) //Machines that require updating (He
|
||||
|
||||
port.register()
|
||||
|
||||
icon_state = "rsd_used"
|
||||
icon_state = "rsd_empty"
|
||||
|
||||
//Clear highlights
|
||||
overlay_holder.clear_highlights()
|
||||
GLOB.custom_shuttle_count ++
|
||||
message_admins("[ADMIN_LOOKUPFLW(user)] created a new shuttle with a [src] at [ADMIN_VERBOSEJMP(user)] ([GLOB.custom_shuttle_count] custom shuttles, limit is [CUSTOM_SHUTTLE_LIMIT])")
|
||||
log_game("[key_name(user)] created a new shuttle with a [src] at [AREACOORD(user)] ([GLOB.custom_shuttle_count] custom shuttles, limit is [CUSTOM_SHUTTLE_LIMIT])")
|
||||
message_admins("[ADMIN_LOOKUPFLW(user)] created a new shuttle with a [src] at [ADMIN_VERBOSEJMP(user)] ([GLOB.custom_shuttle_count] custom shuttles)")
|
||||
log_game("[key_name(user)] created a new shuttle with a [src] at [AREACOORD(user)] ([GLOB.custom_shuttle_count] custom shuttles)")
|
||||
return TRUE
|
||||
|
||||
/obj/item/shuttle_creator/proc/create_shuttle_area(mob/user)
|
||||
@@ -350,7 +351,7 @@ GLOBAL_LIST_EMPTY(custom_shuttle_machines) //Machines that require updating (He
|
||||
loggedOldArea = get_area(get_turf(user))
|
||||
loggedTurfs |= turfs
|
||||
overlay_holder.highlight_area(turfs)
|
||||
//TODO READD THIS SHIT: icon_state = "rsd_used"
|
||||
//TODO READD THIS SHIT: icon_state = "rsd_empty"
|
||||
to_chat(user, "<span class='notice'>You add the area into the buffer of the [src], you made add more areas or select an airlock to act as a docking port to complete the shuttle.</span>")
|
||||
return turfs
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user