mirror of
https://github.com/KabKebab/GS13.git
synced 2026-07-15 01:46:41 +01:00
Revert "Revert "Merge branch 'master' into cumcom""
This reverts commit c2cc5c49c6.
This commit is contained in:
@@ -294,6 +294,7 @@
|
||||
#define SPEECH_LANGUAGE 5
|
||||
#define SPEECH_IGNORE_SPAM 6
|
||||
#define SPEECH_FORCED 7 */
|
||||
#define COMSIG_MOB_ANTAG_ON_GAIN "mob_antag_on_gain" //from base of /datum/antagonist/on_gain(): (antag_datum)
|
||||
|
||||
///from base of /mob/Login(): ()
|
||||
#define COMSIG_MOB_LOGIN "mob_login"
|
||||
@@ -378,6 +379,7 @@
|
||||
|
||||
///from base of mob/living/carbon/soundbang_act(): (list(intensity))
|
||||
#define COMSIG_CARBON_SOUNDBANG "carbon_soundbang"
|
||||
#define COMSIG_CARBON_IDENTITY_TRANSFERRED_TO "carbon_id_transferred_to" //from datum/dna/transfer_identity(): (datum/dna, transfer_SE)
|
||||
///from /item/organ/proc/Insert() (/obj/item/organ/)
|
||||
#define COMSIG_CARBON_GAIN_ORGAN "carbon_gain_organ"
|
||||
///from /item/organ/proc/Remove() (/obj/item/organ/)
|
||||
@@ -566,6 +568,9 @@
|
||||
#define COMSIG_HUMAN_MELEE_UNARMED_ATTACKBY "human_melee_unarmed_attackby"
|
||||
///Hit by successful disarm attack (mob/living/carbon/human/attacker,zone_targeted)
|
||||
#define COMSIG_HUMAN_DISARM_HIT "human_disarm_hit"
|
||||
#define COMSIG_HUMAN_PREFS_COPIED_TO "human_prefs_copied_to" //from datum/preferences/copy_to(): (datum/preferences, icon_updates, roundstart_checks)
|
||||
#define COMSIG_HUMAN_HARDSET_DNA "human_hardset_dna" //from mob/living/carbon/human/hardset_dna(): (ui, se, newreal_name, newblood_type, datum/species, newfeatures)
|
||||
#define COMSIG_HUMAN_ON_RANDOMIZE "humman_on_randomize" //from base of proc/randomize_human()
|
||||
///Whenever EquipRanked is called, called after job is set
|
||||
#define COMSIG_JOB_RECEIVED "job_received"
|
||||
|
||||
|
||||
@@ -187,6 +187,13 @@
|
||||
#define TRAIT_NEVER_CLONE "donotclone"
|
||||
#define TRAIT_COLDBLOODED "coldblooded" // Your body is literal room temperature. Does not make you immune to the temp.
|
||||
#define TRAIT_FLIMSY "flimsy" //you have 20% less maxhealth
|
||||
|
||||
|
||||
//Hyper
|
||||
#define TRAIT_VIRILE "virile" //you have 20% more chance of impreg
|
||||
#define TRAIT_MACROPHILE "macrophile" //likes the big
|
||||
#define TRAIT_MICROPHILE "microphile" //likes the small
|
||||
|
||||
#define TRAIT_TOUGH "tough" //you have 10% more maxhealth
|
||||
#define TRAIT_AUTO_CATCH_ITEM "auto_catch_item"
|
||||
#define TRAIT_CLOWN_MENTALITY "clown_mentality" // The future is now, clownman.
|
||||
|
||||
@@ -104,17 +104,6 @@ GLOBAL_VAR_INIT(miscreants_allowed, FALSE)
|
||||
if(!src.holder) return
|
||||
message_admins("[key_name_admin(usr)] manually reloaded mentors")
|
||||
|
||||
//Flavor Text
|
||||
/mob/living/carbon/human/verb/set_flavor()
|
||||
set name = "Set Flavor Text"
|
||||
set desc = "Sets an extended description of your character's features."
|
||||
set category = "IC"
|
||||
|
||||
var/new_flavor = input(src, "Enter your new flavor text:", "Flavor text", null) as message|null
|
||||
if(!isnull(new_flavor))
|
||||
flavor_text = sanitize(new_flavor)
|
||||
to_chat(src, "Your flavor text has been updated.")
|
||||
|
||||
//LOOC toggles
|
||||
/client/verb/listen_looc()
|
||||
set name = "Show/Hide LOOC"
|
||||
|
||||
@@ -231,6 +231,7 @@
|
||||
"ipc_screen" = snowflake_ipc_antenna_list ? pick(snowflake_ipc_antenna_list) : "None",
|
||||
"ipc_antenna" = "None",
|
||||
"flavor_text" = "",
|
||||
"silicon_flavor_text" = "",
|
||||
"ooc_text" = ""))
|
||||
|
||||
/proc/random_hair_style(gender)
|
||||
|
||||
@@ -163,6 +163,7 @@
|
||||
set waitfor = FALSE
|
||||
|
||||
to_chat(world, "<BR><BR><BR><span class='big bold'>The round has ended.</span>")
|
||||
var/botmsg = "**The Round has ended!**```Round ID: [GLOB.round_id]\nRound Time: [DisplayTimeText(world.time - SSticker.round_start_time)]\nTotal Population: [GLOB.joined_player_list.len]```"
|
||||
if(LAZYLEN(GLOB.round_end_notifiees))
|
||||
send2irc("Notice", "[GLOB.round_end_notifiees.Join(", ")] the round has ended.")
|
||||
|
||||
@@ -179,6 +180,20 @@
|
||||
var/popcount = gather_roundend_feedback()
|
||||
display_report(popcount)
|
||||
|
||||
|
||||
CHECK_TICK
|
||||
|
||||
//Hyper bot list players
|
||||
botmsg += "\n**The Crew!** ```"
|
||||
for(var/p in GLOB.player_list)
|
||||
var/mob/living/P = p //the living crew members
|
||||
if(P)
|
||||
botmsg += "[P.real_name]"
|
||||
if(P.job)
|
||||
botmsg += " ([P.job])"
|
||||
botmsg += "\n"
|
||||
botmsg += "```"
|
||||
|
||||
CHECK_TICK
|
||||
|
||||
// Add AntagHUD to everyone, see who was really evil the whole time!
|
||||
@@ -208,10 +223,6 @@
|
||||
if(length(CONFIG_GET(keyed_list/cross_server)))
|
||||
send_news_report()
|
||||
|
||||
//tell the nice people on discord what went on before the salt cannon happens.
|
||||
world.TgsTargetedChatBroadcast("The current round has ended. Please standby for your shift interlude Kinaris News Network's report!", FALSE)
|
||||
world.TgsTargetedChatBroadcast(send_news_report(),FALSE)
|
||||
|
||||
CHECK_TICK
|
||||
|
||||
//These need update to actually reflect the real antagonists
|
||||
@@ -226,7 +237,6 @@
|
||||
total_antagonists[A.name] += "[key_name(A.owner)]"
|
||||
|
||||
CHECK_TICK
|
||||
|
||||
//Now print them all into the log!
|
||||
log_game("Antagonists at round end were...")
|
||||
for(var/antag_name in total_antagonists)
|
||||
@@ -243,6 +253,7 @@
|
||||
SSblackbox.Seal()
|
||||
|
||||
sleep(50)
|
||||
world.hypermessage(botmsg)
|
||||
ready_for_reboot = TRUE
|
||||
standard_reboot()
|
||||
|
||||
|
||||
@@ -14,6 +14,7 @@ SUBSYSTEM_DEF(job)
|
||||
|
||||
var/overflow_role = "Assistant"
|
||||
|
||||
|
||||
/datum/controller/subsystem/job/Initialize(timeofday)
|
||||
SSmapping.HACK_LoadMapConfig()
|
||||
if(!occupations.len)
|
||||
@@ -390,7 +391,6 @@ SUBSYSTEM_DEF(job)
|
||||
var/datum/job/job = GetJob(rank)
|
||||
|
||||
H.job = rank
|
||||
equip_loadout(N, H)
|
||||
|
||||
//If we joined at roundstart we should be positioned at our workstation
|
||||
if(!joined_late)
|
||||
@@ -416,22 +416,36 @@ SUBSYSTEM_DEF(job)
|
||||
if(H.mind)
|
||||
H.mind.assigned_role = rank
|
||||
|
||||
//Job loadout, equipping, and flavortext when spawning
|
||||
if(job)
|
||||
var/new_mob = job.equip(H, null, null, joined_late)
|
||||
if(ismob(new_mob))
|
||||
var/list/handle_storage = equip_loadout(N, H) //Loadout gear
|
||||
var/new_mob = job.equip(H, null, null, joined_late) //Job gear
|
||||
|
||||
if(ismob(new_mob)) //The above doesnt return a value, but we check this anyways or else everything breaks!
|
||||
H = new_mob
|
||||
if(!joined_late)
|
||||
N.new_character = H
|
||||
else
|
||||
M = H
|
||||
|
||||
SSpersistence.antag_rep_change[M.client.ckey] += job.GetAntagRep()
|
||||
if(LAZYLEN(handle_storage)) //equip_loadout returned a list. This list is backpack contents we should store, as by now we should have a backpack and a single reference mob
|
||||
if(ishuman(H))
|
||||
var/mob/living/carbon/human/_H = H
|
||||
if(_H.back)
|
||||
for(var/atom/movable/A in handle_storage)
|
||||
if(!SEND_SIGNAL(_H.back, COMSIG_TRY_STORAGE_INSERT, A, null, TRUE, TRUE))
|
||||
A.forceMove(get_turf(H)) //Try and store into the backpack. If the backpack is full, drop it to the ground
|
||||
else //No backpack
|
||||
for(var/atom/movable/A in handle_storage)
|
||||
A.forceMove(get_turf(H))
|
||||
|
||||
//Flavortext
|
||||
var/display_rank = rank
|
||||
if(M.client && M.client.prefs && M.client.prefs.alt_titles_preferences[rank])
|
||||
display_rank = M.client.prefs.alt_titles_preferences[rank]
|
||||
|
||||
to_chat(M, "<b>You are the [display_rank].</b>")
|
||||
|
||||
var/display_rank = rank
|
||||
if(M.client && M.client.prefs && M.client.prefs.alt_titles_preferences[rank])
|
||||
display_rank = M.client.prefs.alt_titles_preferences[rank]
|
||||
to_chat(M, "<b>You are the [display_rank].</b>")
|
||||
if(job)
|
||||
to_chat(M, "<b>As the [display_rank] you answer directly to [job.supervisors]. Special circumstances may change this.</b>")
|
||||
to_chat(M, "<b>To speak on your departments radio, use the :h button. To see others, look closely at your headset.</b>")
|
||||
if(job.req_admin_notify)
|
||||
@@ -441,15 +455,15 @@ SUBSYSTEM_DEF(job)
|
||||
if(CONFIG_GET(number/minimal_access_threshold))
|
||||
to_chat(M, "<span class='notice'><B>As this station was initially staffed with a [CONFIG_GET(flag/jobs_have_minimal_access) ? "full crew, only your job's necessities" : "skeleton crew, additional access may"] have been added to your ID card.</B></span>")
|
||||
|
||||
job.after_spawn(H, M, joined_late)
|
||||
|
||||
//Account ID. ID is handled by human initialization
|
||||
if(ishuman(H))
|
||||
var/mob/living/carbon/human/wageslave = H
|
||||
to_chat(M, "<b><span class = 'big'>Your account ID is [wageslave.account_id]</span></b>")
|
||||
to_chat(M, "<b><span class = 'notice'>You do not have a pin, can set your pin at a ATM.</b>")
|
||||
H.add_memory("Your account ID is [wageslave.account_id].")
|
||||
|
||||
if(job && H)
|
||||
job.after_spawn(H, M, joined_late) // note: this happens before the mob has a key! M will always have a client, H might not.
|
||||
equip_loadout(N, H, TRUE)//CIT CHANGE - makes players spawn with in-backpack loadout items properly. A little hacky but it works
|
||||
to_chat(M, "<b><span class='big'>Your account ID is [wageslave.account_id]</span></b>")
|
||||
to_chat(M, "<b><span class='notice'>You do not have a pin, can set your pin at an ATM.</b>")
|
||||
if(H.mind)
|
||||
H.mind.memory += "Your account ID is [wageslave.account_id].<BR>"
|
||||
|
||||
return H
|
||||
|
||||
@@ -643,4 +657,4 @@ SUBSYSTEM_DEF(job)
|
||||
. |= player.mind
|
||||
|
||||
/datum/controller/subsystem/job/proc/JobDebug(message)
|
||||
log_job_debug(message)
|
||||
log_job_debug(message)
|
||||
|
||||
@@ -46,6 +46,12 @@
|
||||
|
||||
//begin playsound shenanigans//
|
||||
|
||||
//for big characters, add alittle boom
|
||||
if(LM.size_multiplier > 1.5)
|
||||
var/stompsound = pick( 'sound/effects/footstep/giant1.ogg','sound/effects/footstep/giant2.ogg')
|
||||
var/giantvolume = LM.size_multiplier * 9
|
||||
playsound(T, stompsound, giantvolume)
|
||||
|
||||
//for barefooted non-clawed mobs like monkeys
|
||||
if(isbarefoot(LM))
|
||||
playsound(T, pick(GLOB.barefootstep[T.barefootstep][1]),
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
var/insanity_effect = 0 //is the owner being punished for low mood? If so, how much?
|
||||
var/holdmyinsanityeffect = 0 //before we edit our sanity lets take a look
|
||||
var/obj/screen/mood/screen_obj
|
||||
var/lastupdate = 0
|
||||
|
||||
/datum/component/mood/Initialize()
|
||||
if(!isliving(parent))
|
||||
@@ -91,6 +92,7 @@
|
||||
mood += event.mood_change
|
||||
if(!event.hidden)
|
||||
shown_mood += event.mood_change
|
||||
|
||||
mood *= mood_modifier
|
||||
shown_mood *= mood_modifier
|
||||
|
||||
|
||||
+5
-2
@@ -54,11 +54,12 @@
|
||||
if(ishuman(destination))
|
||||
var/mob/living/carbon/human/H = destination
|
||||
H.give_genitals(TRUE)//This gives the body the genitals of this DNA. Used for any transformations based on DNA
|
||||
destination.flavor_text = destination.dna.features["flavor_text"] //Update the flavor_text to use new dna text
|
||||
destination.ooc_text = destination.dna.features["ooc_text"] //Update the flavor_text to use new dna text
|
||||
if(transfer_SE)
|
||||
destination.dna.mutation_index = mutation_index
|
||||
|
||||
SEND_SIGNAL(destination, COMSIG_CARBON_IDENTITY_TRANSFERRED_TO, src, transfer_SE)
|
||||
|
||||
/datum/dna/proc/copy_dna(datum/dna/new_dna)
|
||||
new_dna.unique_enzymes = unique_enzymes
|
||||
new_dna.mutation_index = mutation_index
|
||||
@@ -356,7 +357,6 @@
|
||||
|
||||
if(newfeatures)
|
||||
dna.features = newfeatures
|
||||
flavor_text = dna.features["flavor_text"] //Update the flavor_text to use new dna text
|
||||
ooc_text = dna.features["ooc_text"] //Update the flavor_text to use new dna text
|
||||
|
||||
if(mrace)
|
||||
@@ -379,6 +379,9 @@
|
||||
dna.mutation_index = mutation_index
|
||||
domutcheck()
|
||||
|
||||
SEND_SIGNAL(src, COMSIG_HUMAN_HARDSET_DNA, ui, newreal_name, newblood_type, mrace, newfeatures)
|
||||
// change to SEND_SIGNAL(src, COMSIG_HUMAN_HARDSET_DNA, ui, se, newreal_name, newblood_type, mrace, newfeatures) if we add structural enzymes.
|
||||
|
||||
if(mrace || newfeatures || ui)
|
||||
update_body()
|
||||
update_hair()
|
||||
|
||||
@@ -0,0 +1,188 @@
|
||||
GLOBAL_LIST_EMPTY(mobs_with_editable_flavor_text) //et tu, hacky code
|
||||
|
||||
/datum/element/flavor_text
|
||||
element_flags = ELEMENT_BESPOKE|ELEMENT_DETACH
|
||||
id_arg_index = 3
|
||||
var/flavor_name = "Flavor Text"
|
||||
var/list/texts_by_atom = list()
|
||||
var/addendum = ""
|
||||
var/always_show = FALSE
|
||||
var/max_len = MAX_FLAVOR_LEN
|
||||
var/can_edit = TRUE
|
||||
/// For preference/DNA saving/loading. Null to prevent. Prefs are only loaded from obviously if it exists in preferences.features.
|
||||
var/save_key
|
||||
/// Do not attempt to render a preview on examine. If this is on, it will display as \[flavor_name\]
|
||||
var/examine_no_preview = FALSE
|
||||
var/examineTabOutput = ""
|
||||
|
||||
/datum/element/flavor_text/Attach(datum/target, text = "", _name = "Flavor Text", _addendum, _max_len = MAX_FLAVOR_LEN, _always_show = FALSE, _edit = TRUE, _save_key, _examine_no_preview = FALSE)
|
||||
. = ..()
|
||||
|
||||
if(. == ELEMENT_INCOMPATIBLE || !isatom(target)) //no reason why this shouldn't work on atoms too.
|
||||
return ELEMENT_INCOMPATIBLE
|
||||
|
||||
if(_max_len)
|
||||
max_len = _max_len
|
||||
texts_by_atom[target] = copytext(text, 1, max_len)
|
||||
if(_name)
|
||||
flavor_name = _name
|
||||
if(!isnull(addendum))
|
||||
addendum = _addendum
|
||||
always_show = _always_show
|
||||
can_edit = _edit
|
||||
save_key = _save_key
|
||||
examine_no_preview = _examine_no_preview
|
||||
|
||||
RegisterSignal(target, COMSIG_PARENT_EXAMINE, .proc/show_flavor)
|
||||
|
||||
if(can_edit && ismob(target)) //but only mobs receive the proc/verb for the time being
|
||||
var/mob/M = target
|
||||
LAZYOR(GLOB.mobs_with_editable_flavor_text[M], src)
|
||||
M.verbs |= /mob/proc/manage_flavor_tests
|
||||
|
||||
if(save_key && ishuman(target))
|
||||
RegisterSignal(target, COMSIG_HUMAN_PREFS_COPIED_TO, .proc/update_prefs_flavor_text)
|
||||
|
||||
/datum/element/flavor_text/Detach(atom/A)
|
||||
. = ..()
|
||||
UnregisterSignal(A, list(COMSIG_PARENT_EXAMINE, COMSIG_HUMAN_PREFS_COPIED_TO))
|
||||
texts_by_atom -= A
|
||||
if(can_edit && ismob(A))
|
||||
var/mob/M = A
|
||||
LAZYREMOVE(GLOB.mobs_with_editable_flavor_text[M], src)
|
||||
if(!GLOB.mobs_with_editable_flavor_text[M])
|
||||
GLOB.mobs_with_editable_flavor_text -= M
|
||||
M.verbs -= /mob/proc/manage_flavor_tests
|
||||
|
||||
/datum/element/flavor_text/proc/show_flavor(atom/target, mob/user, list/examine_list)
|
||||
if(!always_show && isliving(target))
|
||||
var/mob/living/L = target
|
||||
var/unknown = L.get_visible_name() == "Unknown"
|
||||
if(!unknown && iscarbon(target))
|
||||
var/mob/living/carbon/C = L
|
||||
unknown = (C.wear_mask && (C.wear_mask.flags_inv & HIDEFACE)) || (C.head && (C.head.flags_inv & HIDEFACE))
|
||||
if(unknown)
|
||||
if(!("...?" in examine_list)) //can't think of anything better in case of multiple flavor texts.
|
||||
examine_list += "...?"
|
||||
return
|
||||
var/text = texts_by_atom[target]
|
||||
if(!text)
|
||||
return
|
||||
if(examine_no_preview)
|
||||
examine_list += "<span class='notice'><a href='?src=[REF(src)];show_flavor=[REF(target)]'>\[[flavor_name]\]</a></span>"
|
||||
return
|
||||
var/msg = replacetext(text, "\n", " ")
|
||||
if(length_char(msg) <= 40)
|
||||
examine_list += "<span class='notice'>[msg]</span>"
|
||||
else
|
||||
examine_list += "<span class='notice'>[copytext_char(msg, 1, 37)]... <a href='?src=[REF(src)];show_flavor=[REF(target)]'>More...</span></a>"
|
||||
|
||||
//Examine Tab stuff - Hyperstation
|
||||
examineTabOutput = "<center>"
|
||||
if(ishuman(target)) //user just returned, y'know, the user's own species. dumb.
|
||||
var/mob/living/carbon/human/L = target
|
||||
if(L.gender)
|
||||
examineTabOutput += "[icon2html('hyperstation/icons/chat/gender.dmi', world, L.gender)]"
|
||||
examineTabOutput += "[L.name] "
|
||||
examineTabOutput += "([L.dna.custom_species ? L.dna.custom_species : L.dna.species.name])"
|
||||
examineTabOutput += "</center>"
|
||||
examineTabOutput += "<br>[url_encode(msg)]"
|
||||
if(ismob(target))
|
||||
var/mob/M = target
|
||||
if(M.ooc_text)
|
||||
examineTabOutput += "<br><br><i><b>OOC</b>"
|
||||
examineTabOutput += "<br>[url_encode(M.ooc_text)]"
|
||||
user.client << output(examineTabOutput, "statbrowser:update_examine") //open the examine window
|
||||
user.client << output(null, "statbrowser:create_mobexamine") //open the examine window
|
||||
|
||||
/datum/element/flavor_text/Topic(href, href_list)
|
||||
. = ..()
|
||||
if(.)
|
||||
return
|
||||
if(href_list["show_flavor"])
|
||||
var/atom/target = locate(href_list["show_flavor"])
|
||||
var/text = texts_by_atom[target]
|
||||
if(text)
|
||||
usr << browse("<HTML><HEAD><meta http-equiv='Content-Type' content='text/html; charset=UTF-8'><TITLE>[target.name]</TITLE></HEAD><BODY><TT>[replacetext(texts_by_atom[target], "\n", "<BR>")]</TT></BODY></HTML>", "window=[target.name];size=500x200")
|
||||
onclose(usr, "[target.name]")
|
||||
return TRUE
|
||||
|
||||
/mob/proc/manage_flavor_tests()
|
||||
set name = "Manage Flavor Texts"
|
||||
set desc = "Used to manage your various flavor texts."
|
||||
set category = "IC"
|
||||
|
||||
var/list/L = GLOB.mobs_with_editable_flavor_text[src]
|
||||
|
||||
if(length(L) == 1)
|
||||
var/datum/element/flavor_text/F = L[1]
|
||||
F.set_flavor(src)
|
||||
return
|
||||
|
||||
var/list/choices = list()
|
||||
|
||||
for(var/i in L)
|
||||
var/datum/element/flavor_text/F = i
|
||||
choices[F.flavor_name] = F
|
||||
|
||||
var/chosen = input(src, "Which flavor text would you like to modify?") as null|anything in choices
|
||||
if(!chosen)
|
||||
return
|
||||
var/datum/element/flavor_text/F = choices[chosen]
|
||||
F.set_flavor(src)
|
||||
|
||||
/datum/element/flavor_text/proc/set_flavor(mob/user)
|
||||
if(!(user in texts_by_atom))
|
||||
return FALSE
|
||||
|
||||
var/lower_name = lowertext(flavor_name)
|
||||
var/new_text = stripped_multiline_input(user, "Set the [lower_name] displayed on 'examine'. [addendum]", flavor_name, html_decode(texts_by_atom[usr]), max_len, TRUE)
|
||||
if(!isnull(new_text) && (user in texts_by_atom))
|
||||
texts_by_atom[user] = new_text
|
||||
to_chat(src, "Your [lower_name] has been updated.")
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/datum/element/flavor_text/proc/update_prefs_flavor_text(mob/living/carbon/human/H, datum/preferences/P, icon_updates = TRUE, roundstart_checks = TRUE)
|
||||
if(P.features.Find(save_key))
|
||||
texts_by_atom[H] = P.features[save_key]
|
||||
|
||||
//subtypes with additional hooks for DNA and preferences.
|
||||
/datum/element/flavor_text/carbon
|
||||
//list of antagonists etcetera that should have nothing to do with people's snowflakes.
|
||||
var/static/list/i_dont_even_know_who_you_are = typecacheof(list(/datum/antagonist/abductor, /datum/antagonist/ert,
|
||||
/datum/antagonist/nukeop, /datum/antagonist/wizard))
|
||||
|
||||
/datum/element/flavor_text/carbon/Attach(datum/target, text = "", _name = "Flavor Text", _addendum, _max_len = MAX_FLAVOR_LEN, _always_show = FALSE, _edit = TRUE, _save_key = "flavor_text", _examine_no_preview = FALSE)
|
||||
if(!iscarbon(target))
|
||||
return ELEMENT_INCOMPATIBLE
|
||||
. = ..()
|
||||
if(. == ELEMENT_INCOMPATIBLE)
|
||||
return
|
||||
RegisterSignal(target, COMSIG_CARBON_IDENTITY_TRANSFERRED_TO, .proc/update_dna_flavor_text)
|
||||
RegisterSignal(target, COMSIG_MOB_ANTAG_ON_GAIN, .proc/on_antag_gain)
|
||||
if(ishuman(target))
|
||||
RegisterSignal(target, COMSIG_HUMAN_HARDSET_DNA, .proc/update_dna_flavor_text)
|
||||
RegisterSignal(target, COMSIG_HUMAN_ON_RANDOMIZE, .proc/unset_flavor)
|
||||
|
||||
/datum/element/flavor_text/carbon/Detach(mob/living/carbon/C)
|
||||
. = ..()
|
||||
UnregisterSignal(C, list(COMSIG_CARBON_IDENTITY_TRANSFERRED_TO, COMSIG_MOB_ANTAG_ON_GAIN, COMSIG_HUMAN_PREFS_COPIED_TO, COMSIG_HUMAN_HARDSET_DNA, COMSIG_HUMAN_ON_RANDOMIZE))
|
||||
|
||||
/datum/element/flavor_text/carbon/proc/update_dna_flavor_text(mob/living/carbon/C)
|
||||
texts_by_atom[C] = C.dna.features[save_key]
|
||||
|
||||
/datum/element/flavor_text/carbon/set_flavor(mob/living/carbon/user)
|
||||
. = ..()
|
||||
if(. && user.dna)
|
||||
user.dna.features[save_key] = texts_by_atom[user]
|
||||
|
||||
/datum/element/flavor_text/carbon/proc/unset_flavor(mob/living/carbon/user)
|
||||
texts_by_atom[user] = ""
|
||||
|
||||
|
||||
/datum/element/flavor_text/carbon/proc/on_antag_gain(mob/living/carbon/user, datum/antagonist/antag)
|
||||
if(is_type_in_typecache(antag, i_dont_even_know_who_you_are))
|
||||
texts_by_atom[user] = ""
|
||||
if(user.dna)
|
||||
user.dna.features[save_key] = ""
|
||||
+34
-37
@@ -39,52 +39,49 @@
|
||||
pre_equip(H, visualsOnly)
|
||||
|
||||
//Start with uniform,suit,backpack for additional slots
|
||||
if(uniform)
|
||||
H.equip_to_slot_or_store_and_del(new uniform(H),SLOT_W_UNIFORM)
|
||||
if(suit)
|
||||
H.equip_to_slot_or_store_and_del(new suit(H),SLOT_WEAR_SUIT)
|
||||
if(back)
|
||||
H.equip_to_slot_or_del(new back(H),SLOT_BACK)
|
||||
|
||||
if(!visualsOnly) // Items in pockets or backpack don't show up on mob's icon.
|
||||
if(l_pocket)
|
||||
H.equip_to_slot_or_store_and_del(new l_pocket(H),SLOT_L_STORE)
|
||||
if(r_pocket)
|
||||
H.equip_to_slot_or_store_and_del(new r_pocket(H),SLOT_R_STORE)
|
||||
if(backpack_contents)
|
||||
if(!visualsOnly && backpack_contents) //Keep things organized when we can't equip other stuff by having this first
|
||||
for(var/path in backpack_contents)
|
||||
var/number = backpack_contents[path]
|
||||
if(!isnum(number))//Default to 1
|
||||
number = 1
|
||||
for(var/i in 1 to number)
|
||||
H.equip_to_slot_or_del(new path(H),SLOT_IN_BACKPACK)
|
||||
if(belt)
|
||||
H.equip_to_slot_or_store_and_del(new belt(H),SLOT_BELT)
|
||||
if(gloves)
|
||||
H.equip_to_slot_or_store_and_del(new gloves(H),SLOT_GLOVES)
|
||||
if(shoes)
|
||||
H.equip_to_slot_or_store_and_del(new shoes(H),SLOT_SHOES)
|
||||
if(head)
|
||||
H.equip_to_slot_or_store_and_del(new head(H),SLOT_HEAD)
|
||||
if(mask)
|
||||
H.equip_to_slot_or_store_and_del(new mask(H),SLOT_WEAR_MASK)
|
||||
if(neck)
|
||||
H.equip_to_slot_or_store_and_del(new neck(H),SLOT_NECK)
|
||||
if(ears)
|
||||
H.equip_to_slot_or_store_and_del(new ears(H),SLOT_EARS)
|
||||
if(glasses)
|
||||
H.equip_to_slot_or_store_and_del(new glasses(H),SLOT_GLASSES)
|
||||
if(id)
|
||||
H.equip_to_slot_or_store_and_del(new id(H),SLOT_WEAR_ID)
|
||||
if(suit_store)
|
||||
H.equip_to_slot_or_store_and_del(new suit_store(H),SLOT_S_STORE)
|
||||
|
||||
if(accessory)
|
||||
var/obj/item/clothing/under/U = H.w_uniform
|
||||
if(U)
|
||||
|
||||
if(uniform)
|
||||
var/obj/item/clothing/under/U = new uniform(H)
|
||||
H.equip_to_slot_or_store(U,SLOT_W_UNIFORM)
|
||||
if(accessory)
|
||||
U.attach_accessory(new accessory(H))
|
||||
else
|
||||
WARNING("Unable to equip accessory [accessory] in outfit [name]. No uniform present!")
|
||||
if(suit)
|
||||
H.equip_to_slot_or_store(new suit(H),SLOT_WEAR_SUIT)
|
||||
|
||||
if(!visualsOnly)
|
||||
if(l_pocket)
|
||||
H.equip_to_slot_or_store(new l_pocket(H),SLOT_L_STORE)
|
||||
if(r_pocket)
|
||||
H.equip_to_slot_or_store(new r_pocket(H),SLOT_R_STORE)
|
||||
if(belt)
|
||||
H.equip_to_slot_or_store(new belt(H),SLOT_BELT)
|
||||
if(gloves)
|
||||
H.equip_to_slot_or_store(new gloves(H),SLOT_GLOVES)
|
||||
if(shoes)
|
||||
H.equip_to_slot_or_store(new shoes(H),SLOT_SHOES)
|
||||
if(head)
|
||||
H.equip_to_slot_or_store(new head(H),SLOT_HEAD)
|
||||
if(mask)
|
||||
H.equip_to_slot_or_store(new mask(H),SLOT_WEAR_MASK)
|
||||
if(neck)
|
||||
H.equip_to_slot_or_store(new neck(H),SLOT_NECK)
|
||||
if(ears)
|
||||
H.equip_to_slot_or_store(new ears(H),SLOT_EARS)
|
||||
if(glasses)
|
||||
H.equip_to_slot_or_store(new glasses(H),SLOT_GLASSES)
|
||||
if(id)
|
||||
H.equip_to_slot_or_store(new id(H),SLOT_WEAR_ID)
|
||||
if(suit_store)
|
||||
H.equip_to_slot_or_store(new suit_store(H),SLOT_S_STORE)
|
||||
|
||||
if(l_hand)
|
||||
H.put_in_l_hand(new l_hand(H))
|
||||
|
||||
@@ -312,3 +312,9 @@
|
||||
suffix = "advancedlab.dmm"
|
||||
name = "Abductor Replication Lab"
|
||||
description = "Some scientists tried and almost succeeded to recreate abductor tools. Somewhat slower and a bit less modern than their originals, these tools are the best you can get if you aren't an alien."
|
||||
|
||||
/datum/map_template/ruin/space/wiz_home
|
||||
id = "wizhome"
|
||||
suffix = "wizardden.dmm"
|
||||
name = "Wizards Cabin"
|
||||
description = "The wooden cabin of a wizard in space, it smells like mana in there."
|
||||
|
||||
@@ -58,8 +58,8 @@
|
||||
/area/ruin/space/has_grav/powered/cat_man
|
||||
name = "Kitty Den"
|
||||
|
||||
/area/ruin/space/has_grav/powered/wiz_home/area/ruin/space/has_grav/powered/wiz_home
|
||||
name = "Wizard's Cabin"
|
||||
/area/ruin/space/has_grav/powered/wiz_home
|
||||
name = "Wizards Cabin"
|
||||
|
||||
/area/ruin/space/has_grav/powered/authorship
|
||||
name = "Authorship"
|
||||
|
||||
+8
-6
@@ -864,14 +864,16 @@ Proc for attack log creation, because really why not
|
||||
filters += filter(arglist(arguments))
|
||||
|
||||
/atom/movable/proc/get_filter(name)
|
||||
if(filter_data && filter_data[name])
|
||||
return filters[filter_data.Find(name)]
|
||||
if(filter_data)
|
||||
if(filter_data[name])
|
||||
return filters[filter_data.Find(name)]
|
||||
|
||||
/atom/movable/proc/remove_filter(name)
|
||||
if(filter_data[name])
|
||||
filter_data -= name
|
||||
update_filters()
|
||||
return TRUE
|
||||
if(filter_data)
|
||||
if(filter_data[name])
|
||||
filter_data -= name
|
||||
update_filters()
|
||||
return TRUE
|
||||
|
||||
/atom/proc/intercept_zImpact(atom/movable/AM, levels = 1)
|
||||
. |= SEND_SIGNAL(src, COMSIG_ATOM_INTERCEPT_Z_FALL, AM, levels)
|
||||
|
||||
@@ -133,6 +133,7 @@
|
||||
|
||||
/obj/machinery/door/airlock/LateInitialize()
|
||||
. = ..()
|
||||
autorotation() //auto rotate door
|
||||
if (cyclelinkeddir)
|
||||
cyclelinkairlock()
|
||||
if(abandoned)
|
||||
@@ -159,11 +160,20 @@
|
||||
update_icon()
|
||||
|
||||
|
||||
/obj/machinery/door/airlock/proc/getrotation() //for auto rotating doors, because im sick of doing it
|
||||
for(var/turf/O in get_step(src,SOUTH))
|
||||
log_mapping("[src]: [O]")
|
||||
if(O.density)
|
||||
log_mapping("[src]: [O] is dense")
|
||||
/obj/machinery/door/airlock/proc/autorotation() //for auto rotating doors, because im sick of doing it
|
||||
var/turf/N = get_step(src, NORTH)
|
||||
var/turf/S = get_step(src, SOUTH)
|
||||
|
||||
if(istype(N, /turf/closed)) //Wall
|
||||
dir = 4
|
||||
if(istype(S, /turf/closed))
|
||||
dir = 4
|
||||
var/obj/structure/window/W = locate(/obj/structure/window, N) //Window
|
||||
if(W)
|
||||
dir = 4
|
||||
var/obj/structure/window/R = locate(/obj/structure/window, S)
|
||||
if(R)
|
||||
dir = 4
|
||||
|
||||
/obj/machinery/door/airlock/ComponentInitialize()
|
||||
. = ..()
|
||||
|
||||
@@ -350,7 +350,10 @@
|
||||
icon = 'icons/obj/doors/airlocks/external/external.dmi'
|
||||
overlays_file = 'icons/obj/doors/airlocks/external/overlays.dmi'
|
||||
note_overlay_file = 'icons/obj/doors/airlocks/external/overlays.dmi'
|
||||
color_overlay_file = 'icons/obj/doors/airlocks/external/color.dmi'
|
||||
assemblytype = /obj/structure/door_assembly/door_assembly_ext
|
||||
basecolor = "#ff0000" //red
|
||||
|
||||
|
||||
/obj/machinery/door/airlock/external/glass
|
||||
opacity = 0
|
||||
|
||||
@@ -319,6 +319,9 @@
|
||||
new R(src)
|
||||
revealed = TRUE
|
||||
|
||||
/obj/item/storage/backpack/satchel/flat/secret/chloe_ruin
|
||||
reward_one_of_these = list(/obj/item/book/granter/spell/summonitem, /obj/item/book_of_babel)
|
||||
|
||||
/obj/item/storage/backpack/duffelbag
|
||||
name = "duffel bag"
|
||||
desc = "A large duffel bag for holding extra things."
|
||||
|
||||
@@ -72,6 +72,7 @@ GLOBAL_LIST_INIT(admin_verbs_admin, world.AVerbsAdmin())
|
||||
/client/proc/cmd_admin_pm_panel, /*admin-pm list*/
|
||||
/client/proc/panicbunker,
|
||||
/client/proc/addbunkerbypass,
|
||||
/client/proc/discordmessage,
|
||||
/client/proc/revokebunkerbypass,
|
||||
/client/proc/stop_sounds,
|
||||
/client/proc/debugstatpanel,
|
||||
|
||||
@@ -37,7 +37,10 @@
|
||||
H.dna.features["moth_wings"] = pick(GLOB.moth_wings_list)
|
||||
H.dna.features["moth_fluff"] = pick(GLOB.moth_fluffs_list)
|
||||
H.dna.features["deco_wings"] = pick(GLOB.deco_wings_list)
|
||||
H.dna.features["flavor_text"] = "" //Oh no.
|
||||
|
||||
SEND_SIGNAL(H, COMSIG_HUMAN_ON_RANDOMIZE)
|
||||
|
||||
H.update_body()
|
||||
H.update_hair()
|
||||
H.update_body_parts()
|
||||
H.update_body_parts()
|
||||
|
||||
@@ -72,6 +72,7 @@ GLOBAL_LIST_EMPTY(antagonists)
|
||||
give_antag_moodies()
|
||||
if(is_banned(owner.current) && replace_banned)
|
||||
replace_banned_player()
|
||||
SEND_SIGNAL(owner.current, COMSIG_MOB_ANTAG_ON_GAIN, src)
|
||||
|
||||
/datum/antagonist/proc/is_banned(mob/M)
|
||||
if(!M)
|
||||
|
||||
@@ -134,6 +134,9 @@
|
||||
else
|
||||
to_chat(user, status())
|
||||
|
||||
/obj/machinery/meter/attack_ghost(mob/user)
|
||||
to_chat(user, status())
|
||||
|
||||
/obj/machinery/meter/singularity_pull(S, current_size)
|
||||
..()
|
||||
if(current_size >= STAGE_FIVE)
|
||||
@@ -141,6 +144,7 @@
|
||||
|
||||
// TURF METER - REPORTS A TILE'S AIR CONTENTS
|
||||
// why are you yelling?
|
||||
// i hope they aren't mad
|
||||
/obj/machinery/meter/turf
|
||||
|
||||
/obj/machinery/meter/turf/reattach_to_layer()
|
||||
|
||||
@@ -377,6 +377,17 @@
|
||||
air_update_turf() // Update the environment if needed.
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/portable_atmospherics/canister/attack_ghost(mob/user)
|
||||
if(user.client)
|
||||
if(IsAdminGhost(user))
|
||||
attack_ai(user)
|
||||
return FALSE
|
||||
else if(user.client.prefs.inquisitive_ghost)
|
||||
user.examinate(src)
|
||||
return FALSE
|
||||
atmosanalyzer_scan(air_contents, user, src, FALSE)
|
||||
return FALSE
|
||||
|
||||
/obj/machinery/portable_atmospherics/canister/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \
|
||||
datum/tgui/master_ui = null, datum/ui_state/state = GLOB.physical_state)
|
||||
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
|
||||
|
||||
@@ -181,6 +181,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
"ipc_screen" = "Sunburst",
|
||||
"ipc_antenna" = "None",
|
||||
"flavor_text" = "",
|
||||
"silicon_flavor_text" = "",
|
||||
"ooc_text" = ""
|
||||
)
|
||||
|
||||
@@ -393,6 +394,15 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
dat += "[features["flavor_text"]]"
|
||||
else
|
||||
dat += "[TextPreview(features["flavor_text"])]...<BR>"
|
||||
dat += "<h2>Silicon Flavor Text</h2>"
|
||||
dat += "<a href='?_src_=prefs;preference=silicon_flavor_text;task=input'><b>Set Silicon Examine Text</b></a><br>"
|
||||
if(length(features["silicon_flavor_text"]) <= 40)
|
||||
if(!length(features["silicon_flavor_text"]))
|
||||
dat += "\[...\]"
|
||||
else
|
||||
dat += "[features["silicon_flavor_text"]]"
|
||||
else
|
||||
dat += "[TextPreview(features["silicon_flavor_text"])]...<BR>"
|
||||
dat += "<h2>OOC Text</h2>"
|
||||
dat += "<a href='?_src_=prefs;preference=ooc_text;task=input'><b>Set OOC Text</b></a><br>"
|
||||
if(length(features["ooc_text"]) <= 40)
|
||||
@@ -1711,6 +1721,12 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
msg = msg
|
||||
features["flavor_text"] = msg
|
||||
|
||||
if("silicon_flavor_text")
|
||||
var/msg = stripped_multiline_input(usr, "Set the silicon flavor text in your 'examine' verb. This can also be used for OOC notes and preferences!", "Silicon Flavor Text", features["silicon_flavor_text"], MAX_FLAVOR_LEN, TRUE)
|
||||
if(msg)
|
||||
msg = msg
|
||||
features["silicon_flavor_text"] = msg
|
||||
|
||||
if("ooc_text")
|
||||
var/msg = stripped_multiline_input(usr, "Set the OOC text in your 'examine' verb. This should be OOC only!", "OOC Text", html_decode(features["ooc_text"]), MAX_MESSAGE_LEN, TRUE)
|
||||
if(msg)
|
||||
@@ -2754,6 +2770,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
else
|
||||
character.Digitigrade_Leg_Swap(TRUE)
|
||||
|
||||
SEND_SIGNAL(character, COMSIG_HUMAN_PREFS_COPIED_TO, src, icon_updates, roundstart_checks)
|
||||
|
||||
//speech stuff
|
||||
if(custom_tongue != "default")
|
||||
var/new_tongue = GLOB.roundstart_tongues[custom_tongue]
|
||||
|
||||
@@ -436,6 +436,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
else //We have no old flavortext, default to new
|
||||
S["feature_flavor_text"] >> features["flavor_text"]
|
||||
|
||||
S["feature_silicon_flavor_text"] >> features["silicon_flavor_text"]
|
||||
if((S["ooc_text"] != "") && (S["ooc_text"] != null) && S["ooc_text"])
|
||||
S["ooc_text"] >> features["ooc_text"]
|
||||
|
||||
@@ -513,6 +514,9 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
custom_speech_verb = sanitize_inlist(custom_speech_verb, GLOB.speech_verbs, "default")
|
||||
custom_tongue = sanitize_inlist(custom_tongue, GLOB.roundstart_tongues, "default")
|
||||
|
||||
features["flavor_text"] = copytext(features["flavor_text"], 1, MAX_FLAVOR_LEN)
|
||||
features["silicon_flavor_text"] = copytext(features["silicon_flavor_text"], 1, MAX_FLAVOR_LEN)
|
||||
|
||||
joblessrole = sanitize_integer(joblessrole, 1, 3, initial(joblessrole))
|
||||
job_civilian_high = sanitize_integer(job_civilian_high, 0, 65535, initial(job_civilian_high))
|
||||
job_civilian_med = sanitize_integer(job_civilian_med, 0, 65535, initial(job_civilian_med))
|
||||
|
||||
@@ -796,6 +796,7 @@
|
||||
item_color = "greenplaidshirt"
|
||||
body_parts_covered = CHEST|GROIN|ARMS|LEGS
|
||||
can_adjust = FALSE
|
||||
fitted = NO_FEMALE_UNIFORM
|
||||
//yes
|
||||
|
||||
//Enzo_Leon patron stuff
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
for(var/V in GLOB.player_list)
|
||||
var/mob/M = V
|
||||
if((M.client.prefs.toggles & SOUND_MIDI) && is_station_level(M.z))
|
||||
M.playsound_local(M, 'sound/ambience/aurora_caelus_new.ogg', 40, FALSE, pressure_affected = FALSE) //ogg is "The Fire is Gone" by Heaven Pierce Her, used in the videogame ULTRAKILL. All respects and credits to the equivalent artists who worked on it.
|
||||
M.playsound_local(M, pick('sound/ambience/aurora_caelus_new.ogg','sound/ambience/aurora_caelus.ogg'), 40, FALSE, pressure_affected = FALSE) //ogg is "The Fire is Gone" by Heaven Pierce Her, used in the videogame ULTRAKILL. All respects and credits to the equivalent artists who worked on it.
|
||||
start_checking()
|
||||
|
||||
/datum/round_event/aurora_caelus/proc/start_checking()
|
||||
|
||||
@@ -540,7 +540,7 @@
|
||||
/obj/item/reagent_containers/food/drinks/soda_cans/monkey_energy
|
||||
name = "Monkey Energy"
|
||||
desc = "Unleash the ape!"
|
||||
icon_state = "monkey_energy"
|
||||
icon_state = "menergy"
|
||||
list_reagents = list(/datum/reagent/consumable/monkey_energy = 50)
|
||||
foodtype = SUGAR | JUNKFOOD
|
||||
price = 3
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
/obj/machinery/gibber/RefreshParts()
|
||||
var/gib_time = 40
|
||||
for(var/obj/item/stock_parts/matter_bin/B in component_parts)
|
||||
meat_produced += B.rating
|
||||
meat_produced += 1.6 * B.rating
|
||||
for(var/obj/item/stock_parts/manipulator/M in component_parts)
|
||||
gib_time -= 5 * M.rating
|
||||
gibtime = gib_time
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
GLOBAL_LIST_EMPTY(monkey_recyclers)
|
||||
|
||||
/obj/machinery/monkey_recycler
|
||||
name = "monkey recycler"
|
||||
desc = "A machine used for recycling dead monkeys into monkey cubes. It currently produces 1 cube for every 5 monkeys inserted." // except it literally never does
|
||||
desc = "A machine used for recycling dead monkeys into monkey cubes. You can use a multitool to link it to a xenobiology console. It currently produces 0.2 cubes for every monkey inserted."
|
||||
icon = 'icons/obj/kitchen.dmi'
|
||||
icon_state = "grinder"
|
||||
layer = BELOW_OBJ_LAYER
|
||||
@@ -9,20 +11,29 @@
|
||||
idle_power_usage = 5
|
||||
active_power_usage = 50
|
||||
circuit = /obj/item/circuitboard/machine/monkey_recycler
|
||||
var/grinded = 0
|
||||
var/required_grind = 5
|
||||
var/cube_production = 1
|
||||
var/stored_matter = 0
|
||||
var/cube_production = 0.2
|
||||
var/list/connected = list() //Xenobio consoles
|
||||
|
||||
/obj/machinery/monkey_recycler/Initialize(mapload)
|
||||
. = ..()
|
||||
GLOB.monkey_recyclers += src
|
||||
|
||||
/obj/machinery/monkey_recycler/RefreshParts()
|
||||
var/req_grind = 5
|
||||
var/cubes_made = 1
|
||||
/obj/machinery/monkey_recycler/Destroy()
|
||||
if(src in GLOB.monkey_recyclers)
|
||||
GLOB.monkey_recyclers -= src
|
||||
for(var/obj/machinery/computer/camera_advanced/xenobio/C in connected)
|
||||
var/obj/machinery/computer/camera_advanced/xenobio/console = C
|
||||
console.connected_recycler = null
|
||||
return ..()
|
||||
|
||||
/obj/machinery/monkey_recycler/RefreshParts() //Ranges from 0.2 to 0.8 per monkey recycled
|
||||
cube_production = 0
|
||||
for(var/obj/item/stock_parts/manipulator/B in component_parts)
|
||||
req_grind -= B.rating
|
||||
cube_production += B.rating * 0.1
|
||||
for(var/obj/item/stock_parts/matter_bin/M in component_parts)
|
||||
cubes_made = M.rating
|
||||
cube_production = cubes_made
|
||||
required_grind = req_grind
|
||||
src.desc = "A machine used for recycling dead monkeys into monkey cubes. It currently produces [cubes_made] cube(s) for every [required_grind] monkey(s) inserted."
|
||||
cube_production += M.rating * 0.1
|
||||
desc = "A machine used for recycling dead monkeys into monkey cubes. You can use a multitool to link it to a xenobiology console. It currently produces [cube_production] cubes for every monkey inserted."
|
||||
|
||||
/obj/machinery/monkey_recycler/attackby(obj/item/O, mob/user, params)
|
||||
if(default_deconstruction_screwdriver(user, "grinder_open", "grinder", O))
|
||||
@@ -64,17 +75,23 @@
|
||||
var/offset = prob(50) ? -2 : 2
|
||||
animate(src, pixel_x = pixel_x + offset, time = 0.2, loop = 200) //start shaking
|
||||
use_power(500)
|
||||
grinded++
|
||||
stored_matter += cube_production
|
||||
addtimer(VARSET_CALLBACK(src, pixel_x, initial(pixel_x)))
|
||||
addtimer(CALLBACK(GLOBAL_PROC, /proc/to_chat, user, "<span class='notice'>The machine now has [grinded] monkey\s worth of material stored.</span>"))
|
||||
addtimer(CALLBACK(GLOBAL_PROC, /proc/to_chat, user, "<span class='notice'>The machine now has [stored_matter] monkey\s worth of material stored.</span>"))
|
||||
|
||||
/obj/machinery/monkey_recycler/interact(mob/user)
|
||||
if(grinded >= required_grind)
|
||||
to_chat(user, "<span class='notice'>The machine hisses loudly as it condenses the grinded monkey meat. After a moment, it dispenses a brand new monkey cube.</span>")
|
||||
if(stored_matter >= 1)
|
||||
to_chat(user, "<span class='notice'>The machine hisses loudly as it condenses the ground monkey meat. After a moment, it dispenses a brand new monkey cube.</span>")
|
||||
playsound(src.loc, 'sound/machines/hiss.ogg', 50, 1)
|
||||
grinded -= required_grind
|
||||
for(var/i = 0, i < cube_production, i++)
|
||||
new /obj/item/reagent_containers/food/snacks/monkeycube(src.loc)
|
||||
to_chat(user, "<span class='notice'>The machine's display flashes that it has [grinded] monkeys worth of material left.</span>")
|
||||
for(var/i in 1 to max(stored_matter, 1))
|
||||
new /obj/item/reagent_containers/food/snacks/monkeycube(loc)
|
||||
stored_matter--
|
||||
to_chat(user, "<span class='notice'>The machine's display flashes that it has [stored_matter] monkeys worth of material left.</span>")
|
||||
else
|
||||
to_chat(user, "<span class='danger'>The machine needs at least [required_grind] monkey(s) worth of material to produce a monkey cube. It only has [grinded].</span>")
|
||||
to_chat(user, "<span class='danger'>The machine needs at least 1 monkey worth of material to produce a monkey cube. It currently has [stored_matter].</span>")
|
||||
|
||||
/obj/machinery/monkey_recycler/multitool_act(mob/living/user, obj/item/multitool/I)
|
||||
if(istype(I))
|
||||
to_chat(user, "<span class='notice'>You log [src] in the multitool's buffer.</span>")
|
||||
I.buffer = src
|
||||
return TRUE
|
||||
|
||||
@@ -368,7 +368,7 @@
|
||||
C.reagents.add_reagent(/datum/reagent/fermi/eigenstate, 30)
|
||||
if(5)
|
||||
visible_message("<b>[src]</b> waves their arms around, <span class='spooky'>\"A new familiar for me, and you'll see it's thee!\"</span>")
|
||||
C.reagents.add_reagent("secretcatchem", 30)
|
||||
C.reagents.add_reagent(/datum/reagent/fermi/secretcatchem, 30)
|
||||
if(6)
|
||||
visible_message("<b>[src]</b> waves their arms around, <span class='spooky'>\"While you may not be a ghost, for this sheet you'll always be it's host.\"</span>")
|
||||
var/mob/living/carbon/human/H = C
|
||||
|
||||
@@ -29,13 +29,13 @@
|
||||
distill_reagent = /datum/reagent/saltpetre
|
||||
|
||||
|
||||
// Laughin' Peas
|
||||
// Laughing Peas
|
||||
/obj/item/seeds/peas/laugh
|
||||
name = "pack of laughin' peas"
|
||||
desc = "These seeds give off a very soft purple glow.. they should grow into Laughin' Peas."
|
||||
name = "pack of laughing peas"
|
||||
desc = "These seeds give off a very soft purple glow.. they should grow into Laughing Peas."
|
||||
icon_state = "seed-laughpeas"
|
||||
species = "laughpeas"
|
||||
plantname = "Laughin' Peas"
|
||||
plantname = "Laughing Peas"
|
||||
product = /obj/item/reagent_containers/food/snacks/grown/laugh
|
||||
maturation = 7
|
||||
potency = 10
|
||||
@@ -53,7 +53,7 @@
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/grown/laugh
|
||||
seed = /obj/item/seeds/peas/laugh
|
||||
name = "pod of laughin' peas"
|
||||
name = "pod of laughing peas"
|
||||
desc = "Ridens Cicer, guaranteed to improve your mood dramatically upon consumption!"
|
||||
icon_state = "laughpeas"
|
||||
filling_color = "#ee7bee"
|
||||
|
||||
@@ -29,13 +29,22 @@ Captain
|
||||
/datum/job/captain/get_access()
|
||||
return get_all_accesses()
|
||||
|
||||
/datum/job/captain/announce(mob/living/carbon/human/H)
|
||||
..()
|
||||
var/displayed_rank = H.client.prefs.alt_titles_preferences[title]
|
||||
if(!displayed_rank)
|
||||
displayed_rank = "Captain"
|
||||
SSticker.OnRoundstart(CALLBACK(GLOBAL_PROC, .proc/minor_announce, "[displayed_rank] [H.nameless ? "" : "[H.real_name] "]on deck!"))
|
||||
/datum/job/captain/announce(mob/living/carbon/human/H, tried=FALSE)
|
||||
if(!H)
|
||||
return
|
||||
if(!H.client && !tried) //Roundstart mobs don't have clients when announce() gets called
|
||||
SSticker.OnRoundstart(CALLBACK(src, .proc/announce, H, TRUE)) //So we try again...
|
||||
return
|
||||
if(tried && !H.client) //We don't want to endlessly call ourselves when we don't have a client
|
||||
throw EXCEPTION("[H.nameless ? "Captain" : "Captain [H.real_name]"] ([H.x],[H.y],[H.z]) has no client.")
|
||||
return
|
||||
|
||||
var/displayed_rank = H.client.prefs.alt_titles_preferences[title]
|
||||
if(!displayed_rank) //Default to Captain
|
||||
displayed_rank = "Captain"
|
||||
|
||||
minor_announce("[displayed_rank] [H.nameless ? "" : "[H.real_name] "]on deck!")
|
||||
..()
|
||||
|
||||
/datum/outfit/job/captain
|
||||
name = "Captain"
|
||||
|
||||
@@ -18,7 +18,7 @@ Clown
|
||||
minimal_access = list(ACCESS_THEATRE)
|
||||
|
||||
/datum/job/clown/after_spawn(mob/living/carbon/human/H, mob/M)
|
||||
. = ..()
|
||||
..()
|
||||
H.apply_pref_name("clown", M.client)
|
||||
|
||||
/datum/outfit/job/clown
|
||||
@@ -83,6 +83,7 @@ Mime
|
||||
minimal_access = list(ACCESS_THEATRE)
|
||||
|
||||
/datum/job/mime/after_spawn(mob/living/carbon/human/H, mob/M)
|
||||
..()
|
||||
H.apply_pref_name("mime", M.client)
|
||||
|
||||
/datum/outfit/job/mime
|
||||
|
||||
@@ -66,7 +66,7 @@
|
||||
//Only override this proc
|
||||
//H is usually a human unless an /equip override transformed it
|
||||
/datum/job/proc/after_spawn(mob/living/H, mob/M, latejoin = FALSE)
|
||||
//do actions on H but send messages to M as the key may not have been transferred_yet
|
||||
//do actions on H but send messages to M as the key may not have been transferred yet
|
||||
if(mind_traits)
|
||||
for(var/t in mind_traits)
|
||||
ADD_TRAIT(H.mind, t, JOB_TRAIT)
|
||||
|
||||
@@ -21,7 +21,7 @@ AI
|
||||
. = H.AIize(latejoin)
|
||||
|
||||
/datum/job/ai/after_spawn(mob/H, mob/M, latejoin)
|
||||
. = ..()
|
||||
..()
|
||||
if(latejoin)
|
||||
var/obj/structure/AIcore/latejoin_inactive/lateJoinCore
|
||||
for(var/obj/structure/AIcore/latejoin_inactive/P in GLOB.latejoin_ai_cores)
|
||||
|
||||
@@ -597,7 +597,7 @@
|
||||
if (H.custom_body_size) //Do they have it set?
|
||||
H.resize(H.custom_body_size * 0.01)
|
||||
if (H.breedable == TRUE)
|
||||
H.impregchance = 30
|
||||
H.impregchance = 25
|
||||
. = H
|
||||
new_character = .
|
||||
if(transfer_after)
|
||||
|
||||
@@ -17,3 +17,8 @@
|
||||
name = "Round + Light"
|
||||
icon_state = "roundlight"
|
||||
|
||||
/datum/sprite_accessory/snouts/gator
|
||||
name = "Gator"
|
||||
icon_state = "gator"
|
||||
color_src = MATRIXED
|
||||
|
||||
|
||||
@@ -11,14 +11,20 @@
|
||||
toggle_combat_mode(TRUE, TRUE)
|
||||
|
||||
. = ..()
|
||||
|
||||
|
||||
for(var/T in get_traumas())
|
||||
var/datum/brain_trauma/BT = T
|
||||
BT.on_death()
|
||||
|
||||
|
||||
if(SSticker.mode)
|
||||
SSticker.mode.check_win() //Calls the rounds wincheck, mainly for wizard, malf, and changeling now
|
||||
|
||||
//watching someone die is traumatic
|
||||
for(var/mob/living/carbon/human/H in oview(5, src))
|
||||
SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "death", /datum/mood_event/deathsaw)
|
||||
if(prob(10)) //10% chance to pump adrenaline into their body
|
||||
H.jitteriness += 5
|
||||
|
||||
/mob/living/carbon/gib(no_brain, no_organs, no_bodyparts)
|
||||
var/atom/Tsec = drop_location()
|
||||
for(var/mob/M in src)
|
||||
|
||||
@@ -8,7 +8,6 @@
|
||||
var/t_is = p_are()
|
||||
var/obscure_name
|
||||
var/dispSize = round(12*size_multiplier) // gets the character's sprite size percent and converts it to the nearest half foot
|
||||
var/output = ""
|
||||
|
||||
if(isliving(user))
|
||||
var/mob/living/L = user
|
||||
@@ -24,25 +23,13 @@
|
||||
if (vassDesc != "")
|
||||
. += vassDesc
|
||||
|
||||
output = "<center>"
|
||||
var/list/obscured = check_obscured_slots()
|
||||
var/skipface = (wear_mask && (wear_mask.flags_inv & HIDEFACE)) || (head && (head.flags_inv & HIDEFACE))
|
||||
|
||||
if(ishuman(src)) //user just returned, y'know, the user's own species. dumb.
|
||||
var/mob/living/carbon/human/H = src
|
||||
if(gender)
|
||||
output += "[icon2html('hyperstation/icons/chat/gender.dmi', world, gender)]"
|
||||
|
||||
output += "<b>[src.name]</b>"
|
||||
var/datum/species/pref_species = H.dna.species
|
||||
if(get_visible_name() == "Unknown") // same as flavor text, but hey it works.
|
||||
. += "You can't make out what species they are."
|
||||
else if(skipface)
|
||||
. += "You can't make out what species they are."
|
||||
else
|
||||
. += "[t_He] [t_is] a [H.dna.custom_species ? H.dna.custom_species : pref_species.name]!"
|
||||
output += "([H.dna.custom_species ? H.dna.custom_species : pref_species.name])"
|
||||
output += "</center>"
|
||||
|
||||
if(skipface || get_visible_name() == "Unknown")
|
||||
. += "You can't make out what species they are."
|
||||
else
|
||||
. += "[t_He] [t_is] a [dna.custom_species ? dna.custom_species : dna.species.name]!"
|
||||
|
||||
//uniform
|
||||
if(w_uniform && !(SLOT_W_UNIFORM in obscured))
|
||||
@@ -416,30 +403,9 @@
|
||||
else if(isobserver(user) && traitstring)
|
||||
. += "<span class='info'><b>Traits:</b> [traitstring]</span>"
|
||||
|
||||
|
||||
if(print_flavor_text())
|
||||
output += "<br><b>General</b>"
|
||||
if(get_visible_name() == "Unknown") //Are we sure we know who this is? Don't show flavor text unless we can recognize them. Prevents certain metagaming with impersonation.
|
||||
. += "...?"
|
||||
output += "<br>...?"
|
||||
else if(skipface) //Sometimes we're not unknown, but impersonating someone in a hardsuit, let's not reveal our flavor text then either.
|
||||
. += "...?"
|
||||
output += "<br>...?"
|
||||
else
|
||||
. += "[print_flavor_text()]"
|
||||
output += "<br>[url_encode(flavor_text)]"
|
||||
if(ooc_text)
|
||||
output += "<br><br><i><b>OOC</b>"
|
||||
output += "<br>[url_encode(ooc_text)]"
|
||||
|
||||
SEND_SIGNAL(src, COMSIG_PARENT_EXAMINE, user, msg)
|
||||
SEND_SIGNAL(src, COMSIG_PARENT_EXAMINE, user, .) //This also handles flavor texts now
|
||||
. += "*---------*</span>"
|
||||
|
||||
//stat panel
|
||||
if(ishuman(src))
|
||||
user.client << output(output, "statbrowser:update_examine") //open the examine window
|
||||
user.client << output(null, "statbrowser:create_mobexamine") //open the examine window
|
||||
|
||||
/mob/living/proc/status_effect_examines(pronoun_replacement) //You can include this in any mob's examine() to show the examine texts of status effects!
|
||||
var/list/dat = list()
|
||||
if(!pronoun_replacement)
|
||||
|
||||
@@ -37,6 +37,8 @@
|
||||
if(!CONFIG_GET(flag/disable_human_mood))
|
||||
AddComponent(/datum/component/mood)
|
||||
AddElement(/datum/element/mob_holder/micro, "micro")
|
||||
AddElement(/datum/element/flavor_text/carbon, "", "Flavor Text", "", MAX_FLAVOR_LEN, FALSE, TRUE, "flavor_text")
|
||||
AddElement(/datum/element/flavor_text, "", "Temporary Flavor Text", "This should be used only for things pertaining to the current round!")
|
||||
|
||||
/mob/living/carbon/human/Destroy()
|
||||
QDEL_NULL(physiology)
|
||||
|
||||
@@ -58,7 +58,7 @@
|
||||
//H13 custom body size and impregnation
|
||||
var/custom_body_size = 100
|
||||
var/breedable = 0
|
||||
var/impregchance = 0
|
||||
var/impregchance = 30
|
||||
//h13 noncon settings
|
||||
var/Noncon = 0
|
||||
var/ERP = 0
|
||||
|
||||
@@ -437,11 +437,11 @@
|
||||
|
||||
var/obj/item/reagent_containers/spray/cyborg_drying/CD = locate(/obj/item/reagent_containers/spray/cyborg_drying) in basic_modules
|
||||
if(CD)
|
||||
CD.reagents.add_reagent("drying_agent", 5 * coeff)
|
||||
CD.reagents.add_reagent(/datum/reagent/drying_agent, 5 * coeff)
|
||||
|
||||
var/obj/item/reagent_containers/spray/cyborg_lube/CL = locate(/obj/item/reagent_containers/spray/cyborg_lube) in emag_modules
|
||||
if(CL)
|
||||
CL.reagents.add_reagent("lube", 2 * coeff)
|
||||
CL.reagents.add_reagent(/datum/reagent/lube, 2 * coeff)
|
||||
|
||||
/obj/item/robot_module/clown
|
||||
name = "Clown"
|
||||
|
||||
@@ -55,6 +55,11 @@
|
||||
diag_hud_set_status()
|
||||
diag_hud_set_health()
|
||||
|
||||
/mob/living/silicon/ComponentInitialize()
|
||||
. = ..()
|
||||
AddElement(/datum/element/flavor_text, "", "Silicon Flavor Text", "", MAX_FLAVOR_LEN, FALSE, TRUE, "silicon_flavor_text")
|
||||
AddElement(/datum/element/flavor_text, "", "Temporary Flavor Text", "This should be used only for things pertaining to the current round!")
|
||||
|
||||
/mob/living/silicon/med_hud_set_health()
|
||||
return //we use a different hud
|
||||
|
||||
|
||||
@@ -316,9 +316,9 @@ GLOBAL_VAR_INIT(floor_cluwnes, 0)
|
||||
to_chat(H, "<span class='userdanger'>WHAT THE FUCK IS THAT?!</span>")
|
||||
to_chat(H, "<i>.KNOH !nuf hcum os si uoy htiw gniyalP .KNOH KNOH KNOH</i>")
|
||||
H.playsound_local(src,'sound/hallucinations/im_here1.ogg', 25)
|
||||
H.reagents.add_reagent("mindbreaker", 3)
|
||||
H.reagents.add_reagent("laughter", 5)
|
||||
H.reagents.add_reagent("mercury", 3)
|
||||
H.reagents.add_reagent(/datum/reagent/toxin/mindbreaker, 3)
|
||||
H.reagents.add_reagent(/datum/reagent/consumable/laughter, 5)
|
||||
H.reagents.add_reagent(/datum/reagent/mercury, 3)
|
||||
Appear()
|
||||
manifested = FALSE
|
||||
addtimer(CALLBACK(src, /mob/living/simple_animal/hostile/floor_cluwne/.proc/Manifest), 2)
|
||||
|
||||
+5
-11
@@ -240,10 +240,11 @@ mob/visible_message(message, self_message, blind_message, vision_distance = DEFA
|
||||
return FALSE
|
||||
if(!W.mob_can_equip(src, null, slot, disable_warning, bypass_equip_delay_self))
|
||||
if(store && istype(src, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = src
|
||||
var/obj/item/storage/backpack/BP = H.back
|
||||
if(BP)
|
||||
return SEND_SIGNAL(BP, COMSIG_TRY_STORAGE_INSERT, W, null, TRUE, TRUE)
|
||||
equip_to_slot(W, SLOT_IN_BACKPACK, FALSE)
|
||||
return TRUE
|
||||
else if(store && !qdel_on_fail)
|
||||
W.forceMove(get_turf(src))
|
||||
|
||||
if(qdel_on_fail)
|
||||
qdel(W)
|
||||
else if(!disable_warning)
|
||||
@@ -524,13 +525,6 @@ mob/visible_message(message, self_message, blind_message, vision_distance = DEFA
|
||||
unset_machine()
|
||||
src << browse(null, t1)
|
||||
|
||||
if(href_list["flavor_more"])
|
||||
usr << browse(text("<HTML><HEAD><TITLE>[]</TITLE></HEAD><BODY><TT>[]</TT></BODY></HTML>", name, replacetext(flavor_text, "\n", "<BR>")), text("window=[];size=500x200", name))
|
||||
onclose(usr, "[name]")
|
||||
|
||||
if(href_list["flavor_change"])
|
||||
update_flavor_text()
|
||||
|
||||
if(href_list["refresh"])
|
||||
if(machine && in_range(src, usr))
|
||||
show_inv(machine)
|
||||
|
||||
@@ -129,9 +129,7 @@
|
||||
///Whether the mob is updating glide size when movespeed updates or not
|
||||
var/updating_glide_size = TRUE
|
||||
|
||||
var/flavor_text = ""
|
||||
var/ooc_text = ""
|
||||
var/flavor_text_2 = "" //version of the above that only lasts for the current round.
|
||||
|
||||
///////TYPING INDICATORS///////
|
||||
/// Set to true if we want to show typing indicators.
|
||||
|
||||
@@ -2,31 +2,6 @@
|
||||
////////////////////SUBTLE COMMAND////////////////////
|
||||
//////////////////////////////////////////////////////
|
||||
|
||||
/mob/proc/update_flavor_text()
|
||||
set src in usr
|
||||
if(usr != src)
|
||||
to_chat(usr, "No.")
|
||||
var/msg = stripped_multiline_input(usr, "Set the flavor text in your 'examine' verb. IC only!", "Flavor Text", html_decode(flavor_text), MAX_MESSAGE_LEN, TRUE)
|
||||
|
||||
if(msg)
|
||||
flavor_text = html_encode(msg)
|
||||
|
||||
flavor_text = msg
|
||||
|
||||
/mob/proc/warn_flavor_changed()
|
||||
if(flavor_text && flavor_text != "") // don't spam people that don't use it!
|
||||
to_chat(src, "<h2 class='alert'>OOC Warning:</h2>")
|
||||
to_chat(src, "<span class='alert'>Your flavor text is likely out of date! <a href='?src=[REF(src)];flavor_change=1'>Change</a></span>")
|
||||
|
||||
/mob/proc/print_flavor_text()
|
||||
if(flavor_text && flavor_text != "")
|
||||
// We are decoding and then encoding to not only get correct amount of characters, but also to prevent partial escaping characters being shown.
|
||||
var/msg = html_decode(replacetext(flavor_text, "\n", " "))
|
||||
if(length_char(msg) <= 40)
|
||||
return "<span class='notice'>[html_encode(msg)]</span>"
|
||||
else
|
||||
return "<span class='notice'>[html_encode(copytext_char(msg, 1, 37))]... <a href='?src=[REF(src)];flavor_more=1'>More...</span></a>"
|
||||
|
||||
/mob/proc/get_top_level_mob()
|
||||
if(istype(src.loc,/mob)&&src.loc!=src)
|
||||
var/mob/M=src.loc
|
||||
|
||||
@@ -171,7 +171,7 @@
|
||||
|
||||
/turf/open/pool/attackby(obj/item/W, mob/living/user)
|
||||
if(istype(W, /obj/item/mop) && filled)
|
||||
W.reagents.add_reagent("water", 5)
|
||||
W.reagents.add_reagent(/datum/reagent/water, 5)
|
||||
to_chat(user, "<span class='notice'>You wet [W] in [src].</span>")
|
||||
playsound(src, 'sound/effects/slosh.ogg', 25, TRUE)
|
||||
else
|
||||
|
||||
@@ -465,7 +465,7 @@
|
||||
has_panel_overlay = FALSE
|
||||
amount = 10
|
||||
pixel_y = 6
|
||||
layer = WALL_OBJ_LAYER
|
||||
layer = 4
|
||||
circuit = /obj/item/circuitboard/machine/chem_dispenser/drinks
|
||||
working_state = null
|
||||
nopower_state = null
|
||||
|
||||
@@ -221,7 +221,8 @@
|
||||
. = ..()
|
||||
if(iscarbon(M))
|
||||
var/mob/living/carbon/patient = M
|
||||
if(reac_volume >= 5 && HAS_TRAIT_FROM(patient, TRAIT_HUSK, "burn") && patient.getFireLoss() < THRESHOLD_UNHUSK) //One carp yields 12u rezadone.
|
||||
var/vol = reac_volume + M.reagents.get_reagent_amount(/datum/reagent/medicine/rezadone)
|
||||
if(vol >= 5 && HAS_TRAIT_FROM(patient, TRAIT_HUSK, "burn") && patient.getFireLoss() < THRESHOLD_UNHUSK) //One carp yields 12u rezadone.
|
||||
patient.cure_husk("burn")
|
||||
patient.visible_message("<span class='nicegreen'>[patient]'s body rapidly absorbs moisture from the enviroment, taking on a more healthy appearance.")
|
||||
|
||||
@@ -428,7 +429,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
|
||||
overdose_threshold = 40
|
||||
value = 6
|
||||
|
||||
/datum/reagent/medicine/synthflesh/reaction_mob(mob/living/M, method=TOUCH, reac_volume,show_message = 1)
|
||||
/datum/reagent/medicine/synthflesh/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1)
|
||||
if(iscarbon(M))
|
||||
if (M.stat == DEAD)
|
||||
show_message = 0
|
||||
@@ -445,8 +446,9 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
|
||||
if(show_message)
|
||||
to_chat(M, "<span class='danger'>You feel your burns and bruises healing! It stings like hell!</span>")
|
||||
SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "painful_medicine", /datum/mood_event/painful_medicine)
|
||||
var/vol = reac_volume + M.reagents.get_reagent_amount(/datum/reagent/medicine/synthflesh)
|
||||
//Has to be at less than THRESHOLD_UNHUSK burn damage and have 100 synthflesh before unhusking. Corpses dont metabolize.
|
||||
if(HAS_TRAIT_FROM(M, TRAIT_HUSK, "burn") && M.getFireLoss() < THRESHOLD_UNHUSK && M.reagents.has_reagent(/datum/reagent/medicine/synthflesh, 100))
|
||||
if(HAS_TRAIT_FROM(M, TRAIT_HUSK, "burn") && M.getFireLoss() < THRESHOLD_UNHUSK && (vol >= 100))
|
||||
M.cure_husk("burn")
|
||||
M.visible_message("<span class='nicegreen'>Most of [M]'s burnt off or charred flesh has been restored.")
|
||||
..()
|
||||
|
||||
@@ -337,70 +337,6 @@
|
||||
construction_time = 600
|
||||
category = list("Durand")
|
||||
|
||||
//H.O.N.K
|
||||
/datum/design/honk_chassis
|
||||
name = "Exosuit Chassis (\"H.O.N.K\")"
|
||||
id = "honk_chassis"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/chassis/honker
|
||||
materials = list(MAT_METAL=20000)
|
||||
construction_time = 100
|
||||
category = list("H.O.N.K")
|
||||
|
||||
/datum/design/honk_torso
|
||||
name = "Exosuit Torso (\"H.O.N.K\")"
|
||||
id = "honk_torso"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/part/honker_torso
|
||||
materials = list(MAT_METAL=20000,MAT_GLASS=10000,MAT_BANANIUM=10000)
|
||||
construction_time = 300
|
||||
category = list("H.O.N.K")
|
||||
|
||||
/datum/design/honk_head
|
||||
name = "Exosuit Head (\"H.O.N.K\")"
|
||||
id = "honk_head"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/part/honker_head
|
||||
materials = list(MAT_METAL=10000,MAT_GLASS=5000,MAT_BANANIUM=5000)
|
||||
construction_time = 200
|
||||
category = list("H.O.N.K")
|
||||
|
||||
/datum/design/honk_left_arm
|
||||
name = "Exosuit Left Arm (\"H.O.N.K\")"
|
||||
id = "honk_left_arm"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/part/honker_left_arm
|
||||
materials = list(MAT_METAL=15000,MAT_BANANIUM=5000)
|
||||
construction_time = 200
|
||||
category = list("H.O.N.K")
|
||||
|
||||
/datum/design/honk_right_arm
|
||||
name = "Exosuit Right Arm (\"H.O.N.K\")"
|
||||
id = "honk_right_arm"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/part/honker_right_arm
|
||||
materials = list(MAT_METAL=15000,MAT_BANANIUM=5000)
|
||||
construction_time = 200
|
||||
category = list("H.O.N.K")
|
||||
|
||||
/datum/design/honk_left_leg
|
||||
name = "Exosuit Left Leg (\"H.O.N.K\")"
|
||||
id = "honk_left_leg"
|
||||
build_type = MECHFAB
|
||||
build_path =/obj/item/mecha_parts/part/honker_left_leg
|
||||
materials = list(MAT_METAL=20000,MAT_BANANIUM=5000)
|
||||
construction_time = 200
|
||||
category = list("H.O.N.K")
|
||||
|
||||
/datum/design/honk_right_leg
|
||||
name = "Exosuit Right Leg (\"H.O.N.K\")"
|
||||
id = "honk_right_leg"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/part/honker_right_leg
|
||||
materials = list(MAT_METAL=20000,MAT_BANANIUM=5000)
|
||||
construction_time = 200
|
||||
category = list("H.O.N.K")
|
||||
|
||||
|
||||
//Phazon
|
||||
/datum/design/phazon_chassis
|
||||
|
||||
@@ -464,16 +464,6 @@
|
||||
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3000)
|
||||
export_price = 5000
|
||||
|
||||
/////////////////////////Clown tech/////////////////////////
|
||||
/datum/techweb_node/clown
|
||||
id = "clown"
|
||||
display_name = "Clown Technology"
|
||||
description = "Honk?!"
|
||||
prereq_ids = list("base")
|
||||
design_ids = list("air_horn", "honker_main", "honker_peri", "honker_targ", "honk_chassis", "honk_head", "honk_torso", "honk_left_arm", "honk_right_arm",
|
||||
"honk_left_leg", "honk_right_leg", "mech_banana_mortar", "mech_mousetrap_mortar", "mech_honker", "mech_punching_face", "implant_trombone", "borg_transform_clown")
|
||||
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
|
||||
export_price = 5000
|
||||
|
||||
////////////////////////Computer tech////////////////////////
|
||||
/datum/techweb_node/comptech
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
//Xenobio control console
|
||||
/mob/camera/aiEye/remote/xenobio
|
||||
visible_icon = 1
|
||||
visible_icon = TRUE
|
||||
icon = 'icons/obj/abductor.dmi'
|
||||
icon_state = "camera_target"
|
||||
var/allowed_area = null
|
||||
@@ -22,15 +22,11 @@
|
||||
desc = "A computer used for remotely handling slimes."
|
||||
networks = list("ss13")
|
||||
circuit = /obj/item/circuitboard/computer/xenobiology
|
||||
var/datum/action/innate/slime_place/slime_place_action
|
||||
var/datum/action/innate/slime_pick_up/slime_up_action
|
||||
var/datum/action/innate/feed_slime/feed_slime_action
|
||||
var/datum/action/innate/monkey_recycle/monkey_recycle_action
|
||||
var/datum/action/innate/slime_scan/scan_action
|
||||
var/datum/action/innate/feed_potion/potion_action
|
||||
var/datum/action/innate/hotkey_help/hotkey_help
|
||||
|
||||
var/datum/component/redirect/listener
|
||||
|
||||
var/obj/machinery/monkey_recycler/connected_recycler
|
||||
var/list/stored_slimes
|
||||
var/obj/item/slimepotion/slime/current_potion
|
||||
var/max_slimes = 5
|
||||
@@ -43,14 +39,13 @@
|
||||
|
||||
/obj/machinery/computer/camera_advanced/xenobio/Initialize()
|
||||
. = ..()
|
||||
slime_place_action = new
|
||||
slime_up_action = new
|
||||
feed_slime_action = new
|
||||
monkey_recycle_action = new
|
||||
scan_action = new
|
||||
potion_action = new
|
||||
hotkey_help = new
|
||||
stored_slimes = list()
|
||||
listener = AddComponent(/datum/component/redirect, list(COMSIG_ATOM_CONTENTS_DEL = CALLBACK(src, .proc/on_contents_del)))
|
||||
for(var/obj/machinery/monkey_recycler/recycler in GLOB.monkey_recyclers)
|
||||
if(get_area(src) == get_area(recycler))
|
||||
connected_recycler = recycler
|
||||
connected_recycler.connected += src
|
||||
|
||||
/obj/machinery/computer/camera_advanced/xenobio/Destroy()
|
||||
stored_slimes = null
|
||||
@@ -61,45 +56,56 @@
|
||||
S.forceMove(drop_location())
|
||||
return ..()
|
||||
|
||||
/obj/machinery/computer/camera_advanced/xenobio/examine(mob/user)
|
||||
. = ..()
|
||||
var/thing = "It has "
|
||||
if((upgradetier & XENOBIO_UPGRADE_SLIMEADV))
|
||||
thing += "an advanced slime upgrade disk "
|
||||
if((upgradetier & XENOBIO_UPGRADE_MONKEYS))
|
||||
thing += "and a monkey upgrade disk "
|
||||
else if((upgradetier & XENOBIO_UPGRADE_SLIMEBASIC))
|
||||
thing += "a basic slime upgrade disk "
|
||||
if((upgradetier & XENOBIO_UPGRADE_MONKEYS))
|
||||
thing += "and a monkey upgrade disk "
|
||||
else if((upgradetier & XENOBIO_UPGRADE_MONKEYS))
|
||||
thing += "a monkey upgrade disk "
|
||||
else
|
||||
thing += "no upgrades installed."
|
||||
. += thing
|
||||
return
|
||||
thing += "installed."
|
||||
. += thing
|
||||
|
||||
/obj/machinery/computer/camera_advanced/xenobio/CreateEye()
|
||||
eyeobj = new /mob/camera/aiEye/remote/xenobio(get_turf(src))
|
||||
eyeobj.origin = src
|
||||
eyeobj.visible_icon = 1
|
||||
eyeobj.visible_icon = TRUE
|
||||
eyeobj.icon = 'icons/obj/abductor.dmi'
|
||||
eyeobj.icon_state = "camera_target"
|
||||
|
||||
/obj/machinery/computer/camera_advanced/xenobio/GrantActions(mob/living/user)
|
||||
..()
|
||||
|
||||
if(slime_up_action && (upgradetier & XENOBIO_UPGRADE_SLIMEBASIC)) //CIT CHANGE - makes slime-related actions require XENOBIO_UPGRADE_SLIMEBASIC
|
||||
slime_up_action.target = src
|
||||
slime_up_action.Grant(user)
|
||||
actions += slime_up_action
|
||||
if(hotkey_help)
|
||||
hotkey_help.target = src
|
||||
hotkey_help.Grant(user)
|
||||
actions += hotkey_help
|
||||
|
||||
if(slime_place_action && (upgradetier & XENOBIO_UPGRADE_SLIMEBASIC)) //CIT CHANGE - makes slime-related actions require XENOBIO_UPGRADE_SLIMEBASIC
|
||||
slime_place_action.target = src
|
||||
slime_place_action.Grant(user)
|
||||
actions += slime_place_action
|
||||
RegisterSignal(user, COMSIG_XENO_SLIME_CLICK_CTRL, .proc/XenoSlimeClickCtrl)
|
||||
RegisterSignal(user, COMSIG_XENO_SLIME_CLICK_ALT, .proc/XenoSlimeClickAlt)
|
||||
RegisterSignal(user, COMSIG_XENO_SLIME_CLICK_SHIFT, .proc/XenoSlimeClickShift)
|
||||
RegisterSignal(user, COMSIG_XENO_TURF_CLICK_SHIFT, .proc/XenoTurfClickShift)
|
||||
RegisterSignal(user, COMSIG_XENO_TURF_CLICK_CTRL, .proc/XenoTurfClickCtrl)
|
||||
RegisterSignal(user, COMSIG_XENO_MONKEY_CLICK_CTRL, .proc/XenoMonkeyClickCtrl)
|
||||
|
||||
if(feed_slime_action && (upgradetier & XENOBIO_UPGRADE_MONKEYS)) //CIT CHANGE - makes monkey-related actions require XENOBIO_UPGRADE_MONKEYS
|
||||
feed_slime_action.target = src
|
||||
feed_slime_action.Grant(user)
|
||||
actions += feed_slime_action
|
||||
|
||||
if(monkey_recycle_action && (upgradetier & XENOBIO_UPGRADE_MONKEYS)) //CIT CHANGE - makes monkey-related actions require XENOBIO_UPGRADE_MONKEYS
|
||||
monkey_recycle_action.target = src
|
||||
monkey_recycle_action.Grant(user)
|
||||
actions += monkey_recycle_action
|
||||
|
||||
if(scan_action)
|
||||
scan_action.target = src
|
||||
scan_action.Grant(user)
|
||||
actions += scan_action
|
||||
|
||||
if(potion_action && (upgradetier & XENOBIO_UPGRADE_SLIMEADV)) // CIT CHANGE - makes giving slimes potions via console require XENOBIO_UPGRADE_SLIMEADV
|
||||
potion_action.target = src
|
||||
potion_action.Grant(user)
|
||||
actions += potion_action
|
||||
/obj/machinery/computer/camera_advanced/xenobio/remove_eye_control(mob/living/user)
|
||||
UnregisterSignal(user, COMSIG_XENO_SLIME_CLICK_CTRL)
|
||||
UnregisterSignal(user, COMSIG_XENO_SLIME_CLICK_ALT)
|
||||
UnregisterSignal(user, COMSIG_XENO_SLIME_CLICK_SHIFT)
|
||||
UnregisterSignal(user, COMSIG_XENO_TURF_CLICK_SHIFT)
|
||||
UnregisterSignal(user, COMSIG_XENO_TURF_CLICK_CTRL)
|
||||
UnregisterSignal(user, COMSIG_XENO_MONKEY_CLICK_CTRL)
|
||||
..()
|
||||
|
||||
/obj/machinery/computer/camera_advanced/xenobio/proc/on_contents_del(atom/deleted)
|
||||
if(current_potion == deleted)
|
||||
@@ -134,135 +140,161 @@
|
||||
current_potion = O
|
||||
to_chat(user, "<span class='notice'>You load [O] in the console's potion slot[replaced ? ", replacing the one that was there before" : ""].</span>")
|
||||
return
|
||||
else if(istype(O, /obj/item/multitool))
|
||||
var/obj/item/multitool/M = O
|
||||
if(istype(M.buffer))
|
||||
to_chat(user, "<span class='notice'>You link [src] with [M.buffer] in [M] buffer.</span>")
|
||||
connected_recycler = M.buffer
|
||||
connected_recycler += src
|
||||
return
|
||||
else
|
||||
to_chat(user, "<span class='warning'>[M] has no buffer.</span>")
|
||||
return
|
||||
..()
|
||||
|
||||
/datum/action/innate/slime_place
|
||||
name = "Place Slimes"
|
||||
/datum/action/innate/hotkey_help
|
||||
name = "Hotkey Help"
|
||||
icon_icon = 'icons/mob/actions/actions_silicon.dmi'
|
||||
button_icon_state = "slime_down"
|
||||
button_icon_state = "hotkey_help"
|
||||
|
||||
/datum/action/innate/slime_place/Activate()
|
||||
/datum/action/innate/hotkey_help/Activate()
|
||||
if(!target || !isliving(owner))
|
||||
return
|
||||
var/mob/living/C = owner
|
||||
var/mob/camera/aiEye/remote/xenobio/remote_eye = C.remote_control
|
||||
var/obj/machinery/computer/camera_advanced/xenobio/X = target
|
||||
to_chat(owner, "<b>Click shortcuts:</b>")
|
||||
to_chat(owner, "Shift-click a slime to pick it up, or the floor to drop all held slimes.")
|
||||
to_chat(owner, "Ctrl-click a slime to scan it.")
|
||||
to_chat(owner, "Alt-click a slime to feed it a potion.")
|
||||
to_chat(owner, "Ctrl-click on a dead monkey to recycle it, or the floor to place a new monkey.")
|
||||
|
||||
if(GLOB.cameranet.checkTurfVis(remote_eye.loc))
|
||||
for(var/mob/living/simple_animal/slime/S in X.stored_slimes)
|
||||
S.forceMove(remote_eye.loc)
|
||||
//
|
||||
// Alternate clicks for slime, monkey and open turf if using a xenobio console
|
||||
|
||||
//Picks up slime
|
||||
/mob/living/simple_animal/slime/ShiftClick(mob/user)
|
||||
SEND_SIGNAL(user, COMSIG_XENO_SLIME_CLICK_SHIFT, src)
|
||||
..()
|
||||
|
||||
//Place slimes
|
||||
/turf/open/ShiftClick(mob/user)
|
||||
SEND_SIGNAL(user, COMSIG_XENO_TURF_CLICK_SHIFT, src)
|
||||
..()
|
||||
|
||||
//Place monkey
|
||||
/turf/open/CtrlClick(mob/user)
|
||||
SEND_SIGNAL(user, COMSIG_XENO_TURF_CLICK_CTRL, src)
|
||||
..()
|
||||
|
||||
//Pick up monkey
|
||||
/mob/living/carbon/monkey/CtrlClick(mob/user)
|
||||
SEND_SIGNAL(user, COMSIG_XENO_MONKEY_CLICK_CTRL, src)
|
||||
..()
|
||||
|
||||
// Scans slime
|
||||
/mob/living/simple_animal/slime/CtrlClick(mob/user)
|
||||
SEND_SIGNAL(user, COMSIG_XENO_SLIME_CLICK_CTRL, src)
|
||||
..()
|
||||
|
||||
//Feeds a potion to slime
|
||||
/mob/living/simple_animal/slime/AltClick(mob/user)
|
||||
SEND_SIGNAL(user, COMSIG_XENO_SLIME_CLICK_ALT, src)
|
||||
..()
|
||||
|
||||
//Picks up slime
|
||||
/obj/machinery/computer/camera_advanced/xenobio/proc/XenoSlimeClickShift(mob/living/user, mob/living/simple_animal/slime/S)
|
||||
if(!(upgradetier & XENOBIO_UPGRADE_SLIMEBASIC))
|
||||
return
|
||||
if(!GLOB.cameranet.checkTurfVis(S.loc))
|
||||
to_chat(user, "<span class='warning'>Target is not near a camera. Cannot proceed.</span>")
|
||||
return
|
||||
var/area/mobarea = get_area(S.loc)
|
||||
var/mob/camera/aiEye/remote/xenobio/X = eyeobj
|
||||
if(mobarea.name == X.allowed_area || mobarea.xenobiology_compatible)
|
||||
if(stored_slimes.len >= max_slimes)
|
||||
to_chat(user, "<span class='warning'>Slime storage is full.</span>")
|
||||
return
|
||||
if(S.ckey)
|
||||
to_chat(user, "<span class='warning'>The slime wiggled free!</span>")
|
||||
return
|
||||
if(S.buckled)
|
||||
S.Feedstop(silent = TRUE)
|
||||
S.visible_message("[S] vanishes in a flash of light!")
|
||||
S.forceMove(src)
|
||||
stored_slimes += S
|
||||
|
||||
//Place slimes
|
||||
/obj/machinery/computer/camera_advanced/xenobio/proc/XenoTurfClickShift(mob/living/user, turf/open/T)
|
||||
if(!(upgradetier & XENOBIO_UPGRADE_SLIMEBASIC))
|
||||
return
|
||||
if(!GLOB.cameranet.checkTurfVis(T))
|
||||
to_chat(user, "<span class='warning'>Target is not near a camera. Cannot proceed.</span>")
|
||||
return
|
||||
var/area/turfarea = get_area(T)
|
||||
var/mob/camera/aiEye/remote/xenobio/X = eyeobj
|
||||
if(turfarea.name == X.allowed_area || turfarea.xenobiology_compatible)
|
||||
for(var/mob/living/simple_animal/slime/S in stored_slimes)
|
||||
S.forceMove(T)
|
||||
S.visible_message("[S] warps in!")
|
||||
X.stored_slimes -= S
|
||||
else
|
||||
to_chat(owner, "<span class='notice'>Target is not near a camera. Cannot proceed.</span>")
|
||||
stored_slimes -= S
|
||||
|
||||
/datum/action/innate/slime_pick_up
|
||||
name = "Pick up Slime"
|
||||
icon_icon = 'icons/mob/actions/actions_silicon.dmi'
|
||||
button_icon_state = "slime_up"
|
||||
|
||||
/datum/action/innate/slime_pick_up/Activate()
|
||||
if(!target || !isliving(owner))
|
||||
//Place monkey
|
||||
/obj/machinery/computer/camera_advanced/xenobio/proc/XenoTurfClickCtrl(mob/living/user, turf/open/T)
|
||||
if(!(upgradetier & XENOBIO_UPGRADE_MONKEYS))
|
||||
return
|
||||
var/mob/living/C = owner
|
||||
var/mob/camera/aiEye/remote/xenobio/remote_eye = C.remote_control
|
||||
var/obj/machinery/computer/camera_advanced/xenobio/X = target
|
||||
|
||||
if(GLOB.cameranet.checkTurfVis(remote_eye.loc))
|
||||
for(var/mob/living/simple_animal/slime/S in remote_eye.loc)
|
||||
if(X.stored_slimes.len >= X.max_slimes)
|
||||
break
|
||||
if(!S.ckey)
|
||||
if(S.buckled)
|
||||
S.Feedstop(silent = TRUE)
|
||||
S.visible_message("[S] vanishes in a flash of light!")
|
||||
S.forceMove(X)
|
||||
X.stored_slimes += S
|
||||
else
|
||||
to_chat(owner, "<span class='notice'>Target is not near a camera. Cannot proceed.</span>")
|
||||
|
||||
|
||||
/datum/action/innate/feed_slime
|
||||
name = "Feed Slimes"
|
||||
icon_icon = 'icons/mob/actions/actions_silicon.dmi'
|
||||
button_icon_state = "monkey_down"
|
||||
|
||||
/datum/action/innate/feed_slime/Activate()
|
||||
if(!target || !isliving(owner))
|
||||
if(!GLOB.cameranet.checkTurfVis(T))
|
||||
to_chat(user, "<span class='warning'>Target is not near a camera. Cannot proceed.</span>")
|
||||
return
|
||||
var/mob/living/C = owner
|
||||
var/mob/camera/aiEye/remote/xenobio/remote_eye = C.remote_control
|
||||
var/obj/machinery/computer/camera_advanced/xenobio/X = target
|
||||
var/area/turfarea = get_area(T)
|
||||
var/mob/camera/aiEye/remote/xenobio/X = eyeobj
|
||||
if(turfarea.name == X.allowed_area || turfarea.xenobiology_compatible)
|
||||
if(monkeys >= 1)
|
||||
var/mob/living/carbon/monkey/food = new/mob/living/carbon/monkey(T, TRUE, user)
|
||||
if(!QDELETED(food))
|
||||
food.LAssailant = user
|
||||
monkeys = round(monkeys-1, 0.1)
|
||||
to_chat(user, "[src] now has [monkeys] monkeys stored.")
|
||||
|
||||
if(GLOB.cameranet.checkTurfVis(remote_eye.loc))
|
||||
if(X.monkeys >= 1)
|
||||
var/mob/living/carbon/monkey/food = new /mob/living/carbon/monkey(remote_eye.loc, TRUE, owner)
|
||||
if (!QDELETED(food))
|
||||
food.LAssailant = C
|
||||
X.monkeys --
|
||||
to_chat(owner, "[X] now has [X.monkeys] monkeys left.")
|
||||
else
|
||||
to_chat(owner, "<span class='notice'>Target is not near a camera. Cannot proceed.</span>")
|
||||
|
||||
|
||||
/datum/action/innate/monkey_recycle
|
||||
name = "Recycle Monkeys"
|
||||
icon_icon = 'icons/mob/actions/actions_silicon.dmi'
|
||||
button_icon_state = "monkey_up"
|
||||
|
||||
/datum/action/innate/monkey_recycle/Activate()
|
||||
if(!target || !isliving(owner))
|
||||
//Pick up monkey
|
||||
/obj/machinery/computer/camera_advanced/xenobio/proc/XenoMonkeyClickCtrl(mob/living/user, mob/living/carbon/monkey/M)
|
||||
if(!(upgradetier & XENOBIO_UPGRADE_MONKEYS))
|
||||
return
|
||||
var/mob/living/C = owner
|
||||
var/mob/camera/aiEye/remote/xenobio/remote_eye = C.remote_control
|
||||
var/obj/machinery/computer/camera_advanced/xenobio/X = target
|
||||
|
||||
if(GLOB.cameranet.checkTurfVis(remote_eye.loc))
|
||||
for(var/mob/living/carbon/monkey/M in remote_eye.loc)
|
||||
if(M.stat)
|
||||
M.visible_message("[M] vanishes as [M.p_theyre()] reclaimed for recycling!")
|
||||
X.monkeys = round(X.monkeys + 0.2,0.1)
|
||||
qdel(M)
|
||||
else
|
||||
to_chat(owner, "<span class='notice'>Target is not near a camera. Cannot proceed.</span>")
|
||||
|
||||
/datum/action/innate/slime_scan
|
||||
name = "Scan Slime"
|
||||
icon_icon = 'icons/mob/actions/actions_silicon.dmi'
|
||||
button_icon_state = "slime_scan"
|
||||
|
||||
/datum/action/innate/slime_scan/Activate()
|
||||
if(!target || !isliving(owner))
|
||||
if(!connected_recycler)
|
||||
to_chat(user, "<span class='notice'>There is no connected monkey recycler. You can connect one with a multitool.</span>")
|
||||
return
|
||||
var/mob/living/C = owner
|
||||
var/mob/camera/aiEye/remote/xenobio/remote_eye = C.remote_control
|
||||
|
||||
if(GLOB.cameranet.checkTurfVis(remote_eye.loc))
|
||||
for(var/mob/living/simple_animal/slime/S in remote_eye.loc)
|
||||
slime_scan(S, C)
|
||||
else
|
||||
to_chat(owner, "<span class='notice'>Target is not near a camera. Cannot proceed.</span>")
|
||||
|
||||
/datum/action/innate/feed_potion
|
||||
name = "Apply Potion"
|
||||
icon_icon = 'icons/mob/actions/actions_silicon.dmi'
|
||||
button_icon_state = "slime_potion"
|
||||
|
||||
/datum/action/innate/feed_potion/Activate()
|
||||
if(!target || !isliving(owner))
|
||||
if(!GLOB.cameranet.checkTurfVis(M.loc))
|
||||
to_chat(user, "<span class='warning'>Target is not near a camera. Cannot proceed.</span>")
|
||||
return
|
||||
var/area/mobarea = get_area(M.loc)
|
||||
var/mob/camera/aiEye/remote/xenobio/X = eyeobj
|
||||
if(mobarea.name == X.allowed_area || mobarea.xenobiology_compatible)
|
||||
if(!M.stat)
|
||||
return
|
||||
M.visible_message("[M] vanishes as [M.p_theyre()] reclaimed for recycling!")
|
||||
connected_recycler.use_power(500)
|
||||
monkeys += connected_recycler.cube_production
|
||||
to_chat(user, "[src] now has [monkeys] monkeys available.")
|
||||
qdel(M)
|
||||
|
||||
var/mob/living/C = owner
|
||||
var/mob/camera/aiEye/remote/xenobio/remote_eye = C.remote_control
|
||||
var/obj/machinery/computer/camera_advanced/xenobio/X = target
|
||||
|
||||
if(QDELETED(X.current_potion))
|
||||
to_chat(owner, "<span class='notice'>No potion loaded.</span>")
|
||||
// Scans slime
|
||||
/obj/machinery/computer/camera_advanced/xenobio/proc/XenoSlimeClickCtrl(mob/living/user, mob/living/simple_animal/slime/S)
|
||||
if(!GLOB.cameranet.checkTurfVis(S.loc))
|
||||
to_chat(user, "<span class='warning'>Target is not near a camera. Cannot proceed.</span>")
|
||||
return
|
||||
var/area/mobarea = get_area(S.loc)
|
||||
var/mob/camera/aiEye/remote/xenobio/X = eyeobj
|
||||
if(mobarea.name == X.allowed_area || mobarea.xenobiology_compatible)
|
||||
slime_scan(S, user)
|
||||
|
||||
if(GLOB.cameranet.checkTurfVis(remote_eye.loc))
|
||||
for(var/mob/living/simple_animal/slime/S in remote_eye.loc)
|
||||
X.current_potion.attack(S, C)
|
||||
break
|
||||
else
|
||||
to_chat(owner, "<span class='notice'>Target is not near a camera. Cannot proceed.</span>")
|
||||
//Feeds a potion to slime
|
||||
/obj/machinery/computer/camera_advanced/xenobio/proc/XenoSlimeClickAlt(mob/living/user, mob/living/simple_animal/slime/S)
|
||||
if(!(upgradetier & XENOBIO_UPGRADE_SLIMEBASIC))
|
||||
return
|
||||
if(!GLOB.cameranet.checkTurfVis(S.loc))
|
||||
to_chat(user, "<span class='warning'>Target is not near a camera. Cannot proceed.</span>")
|
||||
return
|
||||
var/area/mobarea = get_area(S.loc)
|
||||
if(QDELETED(current_potion))
|
||||
to_chat(user, "<span class='warning'>No potion loaded.</span>")
|
||||
return
|
||||
var/mob/camera/aiEye/remote/xenobio/X = eyeobj
|
||||
if(mobarea.name == X.allowed_area || mobarea.xenobiology_compatible)
|
||||
current_potion.attack(S, user)
|
||||
|
||||
@@ -854,10 +854,10 @@
|
||||
var/obj/vehicle/V = C
|
||||
var/datum/component/riding/R = V.GetComponent(/datum/component/riding)
|
||||
if(R)
|
||||
if(R.vehicle_move_delay <= 1 )
|
||||
if(R.vehicle_move_delay <= 2 )
|
||||
to_chat(user, "<span class='warning'>The [C] can't be made any faster!</span>")
|
||||
return ..()
|
||||
R.vehicle_move_delay = 1
|
||||
R.vehicle_move_delay = 2
|
||||
|
||||
to_chat(user, "<span class='notice'>You slather the red gunk over the [C], making it faster.</span>")
|
||||
C.remove_atom_colour(WASHABLE_COLOUR_PRIORITY)
|
||||
|
||||
Reference in New Issue
Block a user