Merge branch 'master' into Kristopher-Uniform-Patreon

This commit is contained in:
QuoteFox
2021-04-27 19:28:13 +01:00
committed by GitHub
148 changed files with 6694 additions and 5936 deletions
+1
View File
@@ -79,6 +79,7 @@
#define ADMIN_PUNISHMENT_FAKEBWOINK "Fake Bwoink"
#define ADMIN_PUNISHMENT_NUGGET "Nugget"
#define ADMIN_PUNISHMENT_BREADIFY ":b:read"
#define ADMIN_PUNISHMENT_BOOKIFY "Bookify"
#define AHELP_ACTIVE 1
#define AHELP_CLOSED 2
+2 -1
View File
@@ -17,6 +17,7 @@
#define COLOR_FLOORTILE_GRAY "#8D8B8B"
#define COLOR_ALMOST_BLACK "#333333"
#define COLOR_SILVER "#C0C0C0"
#define COLOR_BLACK "#000000"
#define COLOR_RED "#FF0000"
#define COLOR_RED_LIGHT "#FF3333"
@@ -63,4 +64,4 @@
#define COLOR_ASSEMBLY_LBLUE "#5D99BE"
#define COLOR_ASSEMBLY_BLUE "#38559E"
#define COLOR_ASSEMBLY_PURPLE "#6F6192"
#define COLOR_ASSEMBLY_PINK "#ff4adc"
#define COLOR_ASSEMBLY_PINK "#ff4adc"
+5
View File
@@ -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"
+4 -3
View File
@@ -6,6 +6,10 @@
#define PLANE_SPACE -95
#define PLANE_SPACE_PARALLAX -90
#define OPENSPACE_LAYER 17 //Openspace layer over all
#define OPENSPACE_PLANE -4 //Openspace plane below all turfs
#define OPENSPACE_BACKDROP_PLANE -3 //Black square just over openspace plane to guaranteed cover all in openspace turf
#define FLOOR_PLANE -2
#define GAME_PLANE -1
#define BLACKNESS_PLANE 0 //To keep from conflicts with SEE_BLACKNESS internals
@@ -87,9 +91,6 @@
#define ABOVE_LIGHTING_PLANE 16
#define ABOVE_LIGHTING_LAYER 16
#define FLOOR_OPENSPACE_PLANE 17
#define OPENSPACE_LAYER 17
#define BYOND_LIGHTING_PLANE 18
#define BYOND_LIGHTING_LAYER 18
-2
View File
@@ -226,5 +226,3 @@
#define FORCE_BOOLEAN(x) ((x)? TRUE : FALSE)
#define TILES_TO_PIXELS(tiles) (tiles * PIXELS)
#define CLAMP(CLVALUE,CLMIN,CLMAX) clamp(CLVALUE, CLMIN, CLMAX)
+7
View File
@@ -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.
-11
View File
@@ -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"
+3 -5
View File
@@ -522,10 +522,8 @@
used_key_list[input_key] = 1
return input_key
#if DM_VERSION > 513
#error Remie said that lummox was adding a way to get a lists
#error contents via list.values, if that is true remove this
#error otherwise, update the version and bug lummox
#if DM_VERSION < 513
#error For the love of god do not compile the server below 513
#endif
//Flattens a keyed list into a list of it's contents
/proc/flatten_list(list/key_list)
@@ -578,4 +576,4 @@
var/list/ret = list()
for(var/key in input)
ret += key
return ret
return ret
+1
View File
@@ -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)
+16 -5
View File
@@ -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()
+2 -5
View File
@@ -444,11 +444,8 @@ Turf and target are separate in case you want to teleport some distance from a t
var/y = min(world.maxy, max(1, A.y + dy))
return locate(x,y,A.z)
#if DM_VERSION > 513
#warn if you're getting this warning it means 513 is stable
#warn and you should remove this tidbit
#endif
#if DM_VERSION < 513
#warn what the fuck are you doing? Compile on 513+ not below.
/proc/arctan(x)
var/y=arcsin(x/sqrt(1+x*x))
return y
@@ -1616,4 +1613,4 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new)
if(190)
return "."
if(189)
return "-"
return "-"
+29 -10
View File
@@ -8,7 +8,7 @@
var/last_parallax_shift //world.time of last update
var/parallax_throttle = 0 //ds between updates
var/parallax_movedir = 0
var/parallax_layers_max = 3
var/parallax_layers_max = 4
var/parallax_animate_timer
/datum/hud/proc/create_parallax(mob/viewmob)
@@ -22,6 +22,8 @@
C.parallax_layers_cached += new /obj/screen/parallax_layer/layer_1(null, C.view)
C.parallax_layers_cached += new /obj/screen/parallax_layer/layer_2(null, C.view)
C.parallax_layers_cached += new /obj/screen/parallax_layer/planet(null, C.view)
if(SSparallax.random_layer)
C.parallax_layers_cached += new SSparallax.random_layer
C.parallax_layers_cached += new /obj/screen/parallax_layer/layer_3(null, C.view)
C.parallax_layers = C.parallax_layers_cached.Copy()
@@ -64,12 +66,12 @@
switch(C.prefs.parallax)
if (PARALLAX_INSANE)
C.parallax_throttle = FALSE
C.parallax_layers_max = 4
C.parallax_layers_max = 5
return TRUE
if (PARALLAX_MED)
C.parallax_throttle = PARALLAX_DELAY_MED
C.parallax_layers_max = 2
C.parallax_layers_max = 3
return TRUE
if (PARALLAX_LOW)
@@ -81,7 +83,7 @@
return FALSE
C.parallax_throttle = PARALLAX_DELAY_DEFAULT
C.parallax_layers_max = 3
C.parallax_layers_max = 4
return TRUE
/datum/hud/proc/update_parallax_pref(mob/viewmob)
@@ -167,7 +169,7 @@
/datum/hud/proc/update_parallax()
var/client/C = mymob.client
var/turf/posobj = get_turf(C.eye)
if(!posobj)
if(!posobj)
return
var/area/areaobj = posobj.loc
@@ -296,6 +298,23 @@
speed = 1.4
layer = 3
/obj/screen/parallax_layer/random
blend_mode = BLEND_OVERLAY
speed = 3
layer = 3
/obj/screen/parallax_layer/random/space_gas
icon_state = "space_gas"
/obj/screen/parallax_layer/random/space_gas/Initialize(mapload, view)
src.add_atom_colour(SSparallax.random_parallax_color, ADMIN_COLOUR_PRIORITY)
/obj/screen/parallax_layer/random/asteroids
icon_state = "asteroids"
/obj/screen/parallax_layer/random/nebula
icon_state = "nebula1"
/obj/screen/parallax_layer/planet
icon_state = "planet"
blend_mode = BLEND_OVERLAY
@@ -304,11 +323,11 @@
layer = 30
/obj/screen/parallax_layer/planet/update_status(mob/M)
var/turf/T = get_turf(M)
if(is_station_level(T.z))
invisibility = 0
else
invisibility = INVISIBILITY_ABSTRACT
var/client/C = M.client
var/turf/posobj = get_turf(C.eye)
if(!posobj)
return
invisibility = is_station_level(posobj.z) ? 0 : INVISIBILITY_ABSTRACT
/obj/screen/parallax_layer/planet/update_o()
return //Shit wont move
+1 -1
View File
@@ -18,7 +18,7 @@
/obj/screen/plane_master/openspace
name = "open space plane master"
plane = FLOOR_OPENSPACE_PLANE
plane = OPENSPACE_BACKDROP_PLANE
appearance_flags = PLANE_MASTER
blend_mode = BLEND_MULTIPLY
alpha = 255
+31 -17
View File
@@ -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)
+7 -1
View File
@@ -7,9 +7,15 @@ SUBSYSTEM_DEF(parallax)
var/list/currentrun
var/planet_x_offset = 128
var/planet_y_offset = 128
var/random_layer
var/random_parallax_color
/datum/controller/subsystem/parallax/Initialize(timeofday)
//These are cached per client so needs to be done asap so people joining at roundstart do not miss these.
/datum/controller/subsystem/parallax/PreInit()
. = ..()
if(prob(70)) //70% chance to pick a special extra layer
random_layer = pick(/obj/screen/parallax_layer/random/space_gas, /obj/screen/parallax_layer/random/asteroids, /obj/screen/parallax_layer/random/nebula)
random_parallax_color = pick(COLOR_TEAL, COLOR_GREEN, COLOR_SILVER, COLOR_YELLOW, COLOR_CYAN, COLOR_ORANGE, COLOR_PURPLE)//Special color for random_layer1. Has to be done here so everyone sees the same color.
planet_y_offset = rand(100, 160)
planet_x_offset = rand(100, 160)
+6
View File
@@ -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]),
+2
View File
@@ -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
View File
@@ -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()
+188
View File
@@ -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
View File
@@ -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))
+6 -6
View File
@@ -105,12 +105,6 @@
name = "Empty Shell"
description = "Cosy, rural property availible for young professional couple. Only twelve parsecs from the nearest hyperspace lane!"
/datum/map_template/ruin/space/gas_the_lizards
id = "gas-the-lizards"
suffix = "gasthelizards.dmm"
name = "Disposal Facility 17"
description = "Gas efficiency at 95.6%, fluid elimination at 96.2%. Will require renewed supplies of 'carpet' before the end of the quarter."
/datum/map_template/ruin/space/intact_empty_ship
id = "intact-empty-ship"
suffix = "intactemptyship.dmm"
@@ -318,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."
+5
View File
@@ -1375,3 +1375,8 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
/area/crew_quarters/fitness/pool
name = "Pool Area"
icon_state = "pool"
/area/xenoarch/nothinghere
name = "Nothing Here"
icon_state = "yellow"
ambientsounds = SPOOKY
+3 -7
View File
@@ -58,6 +58,9 @@
/area/ruin/space/has_grav/powered/cat_man
name = "Kitty Den"
/area/ruin/space/has_grav/powered/wiz_home
name = "Wizards Cabin"
/area/ruin/space/has_grav/powered/authorship
name = "Authorship"
@@ -178,13 +181,6 @@
name = "Mech Transport"
icon_state = "green"
//Ruin of gas the lizard
/area/ruin/space/has_grav/gasthelizard
name = "Gas the lizard"
//Ruin of Deep Storage
/area/ruin/space/has_grav/deepstorage
+8 -6
View File
@@ -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)
+15 -5
View File
@@ -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
@@ -50,6 +50,9 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \
//END OF CIT CHANGES
new/datum/stack_recipe("bed", /obj/structure/bed, 2, one_per_turf = TRUE, on_floor = TRUE), \
null, \
//add this when I can find a way to make them easily constructible > new/datum/stack_recipe("sink", /obj/structure/sink, 2, one_per_turf = TRUE, on_floor = TRUE),
new/datum/stack_recipe("shower", /obj/machinery/shower/crafted, 2, one_per_turf = TRUE, on_floor = TRUE), \
null, \
new/datum/stack_recipe("rack parts", /obj/item/rack_parts), \
new/datum/stack_recipe("closet", /obj/structure/closet, 2, time = 15, one_per_turf = TRUE, on_floor = TRUE), \
null, \
@@ -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."
+10
View File
@@ -891,6 +891,16 @@ obj/item/storage/belt/slut/ComponentInitialize()
final_block_chance = 0 //Too thin to block bullets
return ..()
/obj/item/storage/belt/sabre/chloesabre
name = "Ornate Sheath"
desc = "An ornate and rather sinister looking sabre sheathe."
icon = 'icons/obj/custom.dmi'
alternate_worn_icon = 'icons/mob/custom_w.dmi'
icon_state = "darksheath"
item_state = "darksheath"
fitting_swords = list(/obj/item/toy/sword/chloesabre, /obj/item/melee/sabre, /obj/item/melee/baton/stunsword)
starting_sword = /obj/item/toy/sword/chloesabre
/obj/item/storage/belt/botany
name = "botanical belt"
desc = "A belt made for holding hydroponics supplies."
+2
View File
@@ -31,6 +31,8 @@
var/renamedByPlayer = FALSE //set when a player uses a pen on a renamable object
vis_flags = VIS_INHERIT_PLANE //when this be added to vis_contents of something it inherit something.plane, important for visualisation of obj in openspace.
/obj/vv_edit_var(vname, vval)
switch(vname)
if("anchored")
+41 -16
View File
@@ -219,8 +219,8 @@
var/watertemp = "normal" //freezing, normal, or boiling
var/datum/looping_sound/showering/soundloop
/*/obj/machinery/shower/crafted //When created from sheets of metal
anchored = FALSE */ //Stop exploiting this ree
/obj/machinery/shower/crafted //When created from sheets of metal
anchored = FALSE
/obj/machinery/shower/Initialize()
. = ..()
@@ -292,19 +292,43 @@
if (user.a_intent != INTENT_HELP)
return ..()
if (I.tool_behaviour == TOOL_WRENCH)
to_chat(user, "<span class='notice'>You begin to adjust the temperature valve with \the [I]...</span>")
if(I.use_tool(src, user, 50))
switch(watertemp)
if("normal")
watertemp = "freezing"
if("freezing")
watertemp = "boiling"
if("boiling")
watertemp = "normal"
user.visible_message("<span class='notice'>[user] adjusts the shower with \the [I].</span>", "<span class='notice'>You adjust the shower with \the [I] to [watertemp] temperature.</span>")
log_game("[key_name(user)] has wrenched a shower to [watertemp] at ([x],[y],[z])")
add_hiddenprint(user)
switch (I.tool_behaviour)
if (TOOL_WRENCH)
if (!anchored)
user.visible_message("<span class='notice'>[user] starts to take apart [src]...</span>", "<span class='notice'>You start dismantling [src]...</span>")
I.play_tool_sound(src)
if(I.use_tool(src, user, 20))
deconstruct(TRUE)
else
to_chat(user, "<span class='notice'>You begin to adjust the temperature valve with \the [I]...</span>")
if(I.use_tool(src, user, 50))
switch(watertemp)
if("normal")
watertemp = "freezing"
if("freezing")
watertemp = "boiling"
if("boiling")
watertemp = "normal"
user.visible_message("<span class='notice'>[user] adjusts the shower with \the [I].</span>", "<span class='notice'>You adjust the shower with \the [I] to [watertemp] temperature.</span>")
log_game("[key_name(user)] has wrenched a shower to [watertemp] at ([x],[y],[z])")
add_hiddenprint(user)
if (TOOL_SCREWDRIVER)
if (!anchored)
to_chat(user, "<span class='notice'>You begin screwing in [src] to the floor...</span>")
I.play_tool_sound(src)
if(I.use_tool(src, user, 30))
user.visible_message("<span class='notice'>[user] connects [src] to the floor.</span>", "<span class='notice'>You connect [src] to the floor.</span>")
anchored = TRUE
else
to_chat(user, "<span class='notice'>You start to take out [src]'s screws...</span>")
on = FALSE
soundloop.stop()
update_icon()
I.play_tool_sound(src)
if(I.use_tool(src, user, 20))
user.visible_message("<span class='notice'>[user] disconnects [src] from the floor.</span>", "<span class='notice'>You disconnect [src] from the floor.</span>")
anchored = FALSE
/obj/machinery/shower/examine()
. += ..()
@@ -429,6 +453,7 @@
H.update_inv_wear_mask()
else
H.lip_style = null
H.nail_style = null
H.update_body()
if(H.glasses && washglasses && wash_obj(H.glasses))
H.update_inv_glasses()
@@ -468,7 +493,7 @@
return PROCESS_KILL
/obj/machinery/shower/deconstruct(disassembled = TRUE)
new /obj/item/stack/sheet/metal (loc, 3)
new /obj/item/stack/sheet/metal (loc, 2)
qdel(src)
/obj/machinery/shower/proc/check_heat(mob/living/carbon/C)
+18 -2
View File
@@ -1,7 +1,20 @@
GLOBAL_DATUM_INIT(openspace_backdrop_one_for_all, /atom/movable/openspace_backdrop, new)
/atom/movable/openspace_backdrop
name = "openspace_backdrop"
anchored = TRUE
icon = 'icons/turf/floors.dmi'
icon_state = "grey"
plane = OPENSPACE_BACKDROP_PLANE
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
layer = SPLASHSCREEN_LAYER
/turf/open/openspace
name = "open space"
desc = "Watch your step!"
icon_state = "grey"
icon_state = "transparent"
baseturfs = /turf/open/openspace
CanAtmosPassVertical = ATMOS_PASS_YES
//mouse_opacity = MOUSE_OPACITY_TRANSPARENT
@@ -14,8 +27,11 @@
/turf/open/openspace/Initialize() // handle plane and layer here so that they don't cover other obs/turfs in Dream Maker
. = ..()
plane = FLOOR_OPENSPACE_PLANE
plane = OPENSPACE_PLANE
layer = OPENSPACE_LAYER
vis_contents += GLOB.openspace_backdrop_one_for_all //Special grey square for projecting backdrop darkness filter on it.
return INITIALIZE_HINT_LATELOAD
/turf/open/openspace/LateInitialize()
+1 -1
View File
@@ -18,7 +18,7 @@
light_power = 0.25
dynamic_lighting = DYNAMIC_LIGHTING_DISABLED
bullet_bounce_sound = null
vis_flags = VIS_INHERIT_ID //when this be added to vis_contents of something it be associated with something on clicking, important for visualisation of turf in openspace and interraction with openspace that show you turf.
/turf/open/space/basic/New() //Do not convert to Initialize
//This is used to optimize the map loader
+2
View File
@@ -32,6 +32,8 @@
//IE if the turf is supposed to be water, set TRUE.
var/tiled_dirt = FALSE // use smooth tiled dirt decal
vis_flags = VIS_INHERIT_PLANE|VIS_INHERIT_ID //when this be added to vis_contents of something it inherit something.plane and be associated with something on clicking, important for visualisation of turf in openspace and interraction with openspace that show you turf.
/turf/vv_edit_var(var_name, new_value)
var/static/list/banned_edits = list("x", "y", "z")
+1
View File
@@ -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,
+4 -1
View File
@@ -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()
+15 -1
View File
@@ -1247,6 +1247,11 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits
var/obj/item/reagent_containers/food/snacks/store/bread/plain/funnyBread = new(get_turf(target))
target.forceMove(funnyBread)
/client/proc/bookify(atom/movable/target)
var/obj/item/reagent_containers/food/snacks/store/book/funnyBook = new(get_turf(target))
target.forceMove(funnyBook)
funnyBook.name = "Book of " + target.name
/client/proc/smite(mob/living/carbon/human/target as mob)
set name = "Smite"
set category = "Fun"
@@ -1268,7 +1273,8 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits
ADMIN_PUNISHMENT_TABLETIDESTATIONWIDE,
ADMIN_PUNISHMENT_FAKEBWOINK,
ADMIN_PUNISHMENT_NUGGET,
ADMIN_PUNISHMENT_BREADIFY)
ADMIN_PUNISHMENT_BREADIFY,
ADMIN_PUNISHMENT_BOOKIFY)
var/punishment = input("Choose a punishment", "DIVINE SMITING") as null|anything in punishment_list
@@ -1379,6 +1385,14 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits
target.transformation_animation(bread_appearance, time = BREADIFY_TIME, transform_overlay=transform_scanline, reset_after=TRUE)
addtimer(CALLBACK(GLOBAL_PROC, .proc/breadify, target), BREADIFY_TIME)
#undef BREADIFY_TIME
if(ADMIN_PUNISHMENT_BOOKIFY)
#define BOOKIFY_TIME (2 SECONDS)
var/mutable_appearance/book_appearance = mutable_appearance('icons/obj/library.dmi', "book")
var/mutable_appearance/transform_scanline = mutable_appearance('icons/effects/effects.dmi', "transform_effect")
target.transformation_animation(book_appearance, time = BOOKIFY_TIME, transform_overlay=transform_scanline, reset_after=TRUE)
addtimer(CALLBACK(GLOBAL_PROC, .proc/bookify, target), BOOKIFY_TIME)
playsound(target, 'hyperstation/sound/misc/bookify.ogg', 60, 1)
#undef BOOKIFY_TIME
punish_log(target, punishment)
@@ -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)
@@ -203,6 +203,7 @@ GLOBAL_LIST_INIT(nonreactive_gases, typecacheof(list(/datum/gas/oxygen, /datum/g
anchored = TRUE // should only appear in vis_contents, but to be safe
layer = FLY_LAYER
appearance_flags = TILE_BOUND
vis_flags = NONE
/obj/effect/overlay/gas/New(state, alph)
. = ..()
@@ -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)
+18
View File
@@ -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))
-26
View File
@@ -94,32 +94,6 @@
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
/obj/item/clothing/head/stalhelm
name = "Stalhelm"
desc = "Ein Helm, um die Nazi-Interesse an fremden Raumstationen zu sichern."
icon_state = "stalhelm"
item_state = "stalhelm"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
/obj/item/clothing/head/panzer
name = "Panzer Cap"
desc = "Command any mech in style."
icon_state = "panzercap"
item_state = "panzercap"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
/obj/item/clothing/head/naziofficer
name = "Officer Cap"
desc = "Style is all that matters."
icon_state = "officercap"
item_state = "officercap"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
/obj/item/clothing/head/russobluecamohat
name = "russian blue camo beret"
desc = "A symbol of discipline, honor, and lots and lots of removal of some type of skewered food."
@@ -1,25 +1,5 @@
//VG Ports
/obj/item/clothing/head/helmet/space/hardsuit/nazi
name = "nazi hardhelmet"
desc = "This is the face of das vaterland's top elite. Gas or energy are your only escapes."
item_state = "hardsuit0-nazi"
icon_state = "hardsuit0-nazi"
armor = list(melee = 40, bullet = 30, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 20)
item_color = "nazi"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
/obj/item/clothing/suit/space/hardsuit/nazi
name = "nazi hardsuit"
desc = "The attire of a true krieger. All shall fall, and only das vaterland will remain."
item_state = "hardsuit-nazi"
icon_state = "hardsuit-nazi"
slowdown = 1
armor = list(melee = 40, bullet = 30, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 20)
allowed = list(/obj/item/gun,/obj/item/flashlight,/obj/item/tank,/obj/item/melee/)
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/nazi
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
/obj/item/clothing/head/helmet/space/hardsuit/soviet
name = "soviet hardhelmet"
desc = "Crafted with the pride of the proletariat. The vengeful gaze of the visor roots out all fascists and capitalists."
+1 -1
View File
@@ -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
@@ -378,3 +378,16 @@ All foods are distributed among various categories. Use common sense.
TB.MouseDrop(over)
else
return ..()
/obj/item/reagent_containers/food/snacks/store/book
name = "book"
desc = "Could it be? A LoR reference? And is it... Edible?"
icon = 'icons/obj/library.dmi'
icon_state = "book"
tastes = list("broken dreams and promises" = 10)
foodtype = GROSS
dunkable = TRUE
volume = 80
bitesize = 4
bonus_reagents = list(/datum/reagent/consumable/nutriment = 1)
list_reagents = list(/datum/reagent/consumable/sodiumchloride = 1)
@@ -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
+1 -1
View File
@@ -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
+5 -5
View File
@@ -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"
+16 -7
View File
@@ -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"
@@ -50,7 +59,7 @@ Captain
suit = /obj/item/clothing/suit/armor/vest/capcarapace
shoes = /obj/item/clothing/shoes/sneakers/brown
head = /obj/item/clothing/head/caphat
backpack_contents = list(/obj/item/melee/classic_baton/telescopic=1, /obj/item/station_charter=1)
backpack_contents = list(/obj/item/melee/classic_baton/telescopic=1, /obj/item/station_charter=1, /obj/item/modular_computer/tablet/preset/advanced = 1)
backpack = /obj/item/storage/backpack/captain
satchel = /obj/item/storage/backpack/satchel/cap
+2 -1
View File
@@ -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
+1 -1
View File
@@ -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)
+13 -13
View File
@@ -5,16 +5,16 @@
alt_titles = list("Head Engineer", "Construction Coordinator", "Project Manager")
/datum/job/engineer
alt_titles = list("Maintenance Technician", "Engine Technician", "Electrician", "Structural Engineer", "Station Architect")
alt_titles = list("Maintenance Technician", "Engine Technician", "Electrician", "Structural Engineer", "Mechanic", "Station Architect")
/datum/job/atmos
alt_titles = list("Firefighter", "Life Support Specialist")
alt_titles = list("Firefighter", "Life Support Specialist", "Disposals Technician")
/datum/job/junior_engineer
//Service
/datum/job/assistant
alt_titles = list("Civilian", "Visitor", "Businessman", "Trader", "Entertainer", "Tourist")
alt_titles = list("Civilian", "Morale Officer", "Stripper", "Off-Duty", "Escort", "Visitor", "Businessman", "Trader", "Entertainer", "Tourist")
/datum/job/cook
alt_titles = list("Cook", "Culinary Artist", "Butcher", "Chef de partie")
@@ -23,7 +23,7 @@
alt_titles = list("Gardener", "Herbalist", "Botanical Researcher", "Hydroponicist", "Farmer", "Beekeeper")
/datum/job/curator
alt_titles = list("Journalist", "Librarian")
alt_titles = list("Journalist", "Librarian", "Keeper")
/datum/job/chaplain
alt_titles = list("Priest", "Priestess", "Bishop", "Prior", "Monk", "Nun", "Counselor")
@@ -38,10 +38,10 @@
alt_titles = list("Jester", "Comedian")
/datum/job/mime
alt_titles = list("Performer")
alt_titles = list("Performer", "Pantomime", "Mimic")
/datum/job/bartender
alt_titles = list("Mixologist", "Bar Owner")
alt_titles = list("Mixologist", "Bar Owner", "Barmaid")
//Science
/datum/job/rd
@@ -57,7 +57,7 @@
//Medical
/datum/job/cmo
alt_titles = list("Medical Director")
alt_titles = list("Medical Director", "Medical Administrator")
/datum/job/doctor
alt_titles = list("Nurse", "Surgeon", "Physician", "Paramedic")
@@ -69,7 +69,7 @@
alt_titles = list("Microbiologist", "Biochemist", "Pathologist")
/datum/job/geneticist
alt_titles = list("Gene Therapist")
alt_titles = list("Gene Therapist", "Genetics Researcher")
/datum/job/psychologist
alt_titles = list("Therapist", "Psychiatrist")
@@ -78,13 +78,13 @@
//Security
/datum/job/hos
alt_titles = list("Chief of Security", "Security Commander")
alt_titles = list("Chief of Security", "Security Commander", "Sheriff")
/datum/job/warden
alt_titles = list("Prison Chief", "Armory Manager", "Prison Administrator")
alt_titles = list("Prison Chief", "Armory Manager", "Prison Administrator", "Brig Superintendent")
/datum/job/officer
alt_titles = list("Security Agent", "Probation Officer", "Security Peacekeeper", "Security Cadet")
alt_titles = list("Security Agent", "Probation Officer", "Security Peacekeeper", "Security Guard", "Guardsman", "Security Cadet")
/datum/job/detective
alt_titles = list("Forensics Technician", "Private Investigator", "Gumshoe")
@@ -103,7 +103,7 @@
//Command
/datum/job/captain
alt_titles = list("Station Director", "Station Commander", "Station Overseer")
alt_titles = list("Station Director", "Station Commander", "Station Overseer", "Stationmaster", "Commissar")
/datum/job/hop
alt_titles = list("Personnel Manager", "Staff Administrator")
alt_titles = list("Personnel Manager", "Staff Administrator", "Records Administrator")
+1 -1
View File
@@ -42,7 +42,7 @@ Chief Medical Officer
suit = /obj/item/clothing/suit/toggle/labcoat/cmo
l_hand = /obj/item/storage/firstaid/regular
suit_store = /obj/item/flashlight/pen
backpack_contents = list(/obj/item/melee/classic_baton/telescopic=1)
backpack_contents = list(/obj/item/melee/classic_baton/telescopic=1, /obj/item/modular_computer/tablet/preset/advanced = 1)
backpack = /obj/item/storage/backpack/medic
satchel = /obj/item/storage/backpack/satchel/med
+1 -1
View File
@@ -55,7 +55,7 @@ Head of Security
suit_store = /obj/item/gun/energy/e_gun
r_pocket = /obj/item/assembly/flash/handheld
l_pocket = /obj/item/restraints/handcuffs
backpack_contents = list(/obj/item/melee/classic_baton/telescopic=1)
backpack_contents = list(/obj/item/melee/classic_baton/telescopic=1, /obj/item/modular_computer/tablet/preset/advanced = 1)
backpack = /obj/item/storage/backpack/security
satchel = /obj/item/storage/backpack/satchel/sec
+1 -1
View File
@@ -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
@@ -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)
@@ -24,6 +24,9 @@
var/lip_style = null //no lipstick by default- arguably misleading, as it could be used for general makeup
var/lip_color = "white"
var/nail_style = null
var/nail_color = "white"
var/age = 30 //Player's age
var/underwear = "Nude" //Which underwear the player wants
@@ -81,7 +81,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
var/fixed_mut_color2 = ""
var/fixed_mut_color3 = ""
var/whitelisted = 0 //Is this species restricted to certain players?
var/whitelist = list() //List the ckeys that can use this species, if it's whitelisted.: list("John Doe", "poopface666", "SeeALiggerPullTheTrigger") Spaces & capitalization can be included or ignored entirely for each key as it checks for both.
var/whitelist = list() //List the ckeys that can use this species, if it's whitelisted.: list("John Doe", "poopface666") Spaces & capitalization can be included or ignored entirely for each key as it checks for both.
var/icon_limbs //Overrides the icon used for the limbs of this species. Mainly for downstream, and also because hardcoded icons disgust me. Implemented and maintained as a favor in return for a downstream's implementation of synths.
@@ -550,6 +550,12 @@ GLOBAL_LIST_EMPTY(roundstart_races)
MA.color = "#[H.socks_color]"
standing += MA
// nail paint (hyper)
if(H.nail_style)
var/mutable_appearance/nail_overlay = mutable_appearance('hyperstation/icons/mobs/nails.dmi', "nails", -HANDS_PART_LAYER)
nail_overlay.color = H.nail_color
standing += nail_overlay
if(standing.len)
H.overlays_standing[BODY_LAYER] = standing
+1 -1
View File
@@ -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
View File
@@ -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)
+2 -2
View File
@@ -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.
@@ -142,3 +140,5 @@
var/typing_indicator_timerid
/// Current state of our typing indicator. Used for cut overlay, DO NOT RUNTIME ASSIGN OTHER THAN FROM SHOW/CLEAR. Used to absolutely ensure we do not get stuck overlays.
var/mutable_appearance/typing_indicator_current
vis_flags = VIS_INHERIT_PLANE //when this be added to vis_contents of something it inherit something.plane, important for visualisation of mob in openspace.
-25
View File
@@ -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
+1 -1
View File
@@ -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
@@ -14,7 +14,7 @@
taste_description = "alcohol"
var/boozepwr = 65 //Higher numbers equal higher hardness, higher hardness equals more intense alcohol poisoning
pH = 7.33
hydration = 1 * REAGENTS_METABOLISM
hydration = 1
/*
Boozepwr Chart
@@ -11,7 +11,7 @@
glass_icon_state = "glass_orange"
glass_name = "glass of orange juice"
glass_desc = "Vitamins! Yay!"
hydration = 4 * REAGENTS_METABOLISM
hydration = 4
pH = 3.3
/datum/reagent/consumable/orangejuice/on_mob_life(mob/living/carbon/M)
@@ -28,7 +28,7 @@
glass_icon_state = "glass_red"
glass_name = "glass of tomato juice"
glass_desc = "Are you sure this is tomato juice?"
hydration = 4 * REAGENTS_METABOLISM
hydration = 4
/datum/reagent/consumable/tomatojuice/on_mob_life(mob/living/carbon/M)
if(M.getFireLoss() && prob(20))
@@ -45,7 +45,7 @@
glass_name = "glass of lime juice"
glass_desc = "A glass of sweet-sour lime juice."
pH = 2.2
hydration = 3 * REAGENTS_METABOLISM
hydration = 4
/datum/reagent/consumable/limejuice/on_mob_life(mob/living/carbon/M)
if(M.getToxLoss() && prob(20))
@@ -61,7 +61,7 @@
glass_icon_state = "carrotjuice"
glass_name = "glass of carrot juice"
glass_desc = "It's just like a carrot but without crunching."
hydration = 4 * REAGENTS_METABOLISM
hydration = 4
/datum/reagent/consumable/carrotjuice/on_mob_life(mob/living/carbon/M)
M.adjust_blurriness(-1)
@@ -83,7 +83,7 @@
glass_icon_state = "berryjuice"
glass_name = "glass of berry juice"
glass_desc = "Berry juice. Or maybe it's jam. Who cares?"
hydration = 4 * REAGENTS_METABOLISM
hydration = 4
/datum/reagent/consumable/applejuice
name = "Apple Juice"
@@ -91,7 +91,7 @@
color = "#ECFF56" // rgb: 236, 255, 86
taste_description = "apples"
pH = 3.2 // ~ 2.7 -> 3.7
hydration = 4 * REAGENTS_METABOLISM
hydration = 4
/datum/reagent/consumable/poisonberryjuice
name = "Poison Berry Juice"
@@ -101,7 +101,7 @@
glass_icon_state = "poisonberryjuice"
glass_name = "glass of berry juice"
glass_desc = "Berry juice. Or maybe it's poison. Who cares?"
hydration = 2 * REAGENTS_METABOLISM
hydration = 4
/datum/reagent/consumable/poisonberryjuice/on_mob_life(mob/living/carbon/M)
M.adjustToxLoss(1, 0)
@@ -116,7 +116,7 @@
glass_icon_state = "glass_red"
glass_name = "glass of watermelon juice"
glass_desc = "A glass of watermelon juice."
hydration = 4 * REAGENTS_METABOLISM
hydration = 4
/datum/reagent/consumable/lemonjuice
name = "Lemon Juice"
@@ -127,7 +127,7 @@
glass_name = "glass of lemon juice"
glass_desc = "Sour..."
pH = 2
hydration = 4 * REAGENTS_METABOLISM
hydration = 4
/datum/reagent/consumable/strawberryjuice
name = "Strawberry Juice"
@@ -136,7 +136,7 @@
taste_description = "strawberry"
glass_name = "glass of strawberry juice"
glass_desc = "Refreshing seasonal summer drink."
hydration = 4 * REAGENTS_METABOLISM
hydration = 4
/datum/reagent/consumable/banana
name = "Banana Juice"
@@ -146,7 +146,7 @@
glass_icon_state = "banana"
glass_name = "glass of banana juice"
glass_desc = "The raw essence of a banana. HONK."
hydration = 1 * REAGENTS_METABOLISM
hydration = 4
/datum/reagent/consumable/banana/on_mob_life(mob/living/carbon/M)
if((ishuman(M) && M.job == "Clown") || ismonkey(M))
@@ -210,7 +210,7 @@
description = "The juice of a bunch of grapes. Guaranteed non-alcoholic."
color = "#290029" // dark purple
taste_description = "grape soda"
hydration = 2 * REAGENTS_METABOLISM
hydration = 4
/datum/reagent/consumable/milk
name = "Milk"
@@ -221,7 +221,7 @@
glass_name = "milk drum"
glass_desc = "White and nutritious goodness!"
pH = 6.5
hydration = 2 * REAGENTS_METABOLISM
hydration = 3
/datum/reagent/consumable/milk/on_mob_life(mob/living/carbon/M)
if(HAS_TRAIT(M, TRAIT_CALCIUM_HEALER))
@@ -243,7 +243,7 @@
glass_icon_state = "glass_white"
glass_name = "glass of soy milk"
glass_desc = "White and nutritious soy goodness!"
hydration = 2 * REAGENTS_METABOLISM
hydration = 3
/datum/reagent/consumable/soymilk/on_mob_life(mob/living/carbon/M)
if(M.getBruteLoss() && prob(20))
@@ -260,7 +260,7 @@
glass_icon_state = "glass_white"
glass_name = "glass of coconut milk"
glass_desc = "White and nutritious goodness!"
hydration = 4 * REAGENTS_METABOLISM
hydration = 3
/datum/reagent/consumable/coconutmilk/on_mob_life(mob/living/carbon/M)
if(M.getBruteLoss() && prob(20))
@@ -276,7 +276,7 @@
glass_icon_state = "glass_white"
glass_name = "glass of cream"
glass_desc = "Ewwww..."
hydration = 2 * REAGENTS_METABOLISM
hydration = 3
/datum/reagent/consumable/cream/on_mob_life(mob/living/carbon/M)
if(M.getBruteLoss() && prob(20))
@@ -294,7 +294,7 @@
glass_icon_state = "glass_brown"
glass_name = "glass of coffee"
glass_desc = "Don't drop it, or you'll send scalding liquid and glass shards everywhere."
hydration = 2 * REAGENTS_METABOLISM
hydration = 3
/datum/reagent/consumable/coffee/overdose_process(mob/living/M)
M.Jitter(5)
@@ -320,7 +320,7 @@
glass_icon_state = "teaglass"
glass_name = "glass of tea"
glass_desc = "Drinking it from here would not seem right."
hydration = 2 * REAGENTS_METABOLISM
hydration = 4
/datum/reagent/consumable/tea/on_mob_life(mob/living/carbon/M)
M.dizziness = max(0,M.dizziness-2)
@@ -341,7 +341,7 @@
glass_icon_state = "lemonpitcher"
glass_name = "pitcher of lemonade"
glass_desc = "This drink leaves you feeling nostalgic for some reason."
hydration = 4 * REAGENTS_METABOLISM
hydration = 4
/datum/reagent/consumable/tea/arnold_palmer
name = "Arnold Palmer"
@@ -353,7 +353,7 @@
glass_icon_state = "arnold_palmer"
glass_name = "Arnold Palmer"
glass_desc = "You feel like taking a few golf swings after a few swigs of this."
hydration = 4 * REAGENTS_METABOLISM
hydration = 4
/datum/reagent/consumable/tea/arnold_palmer/on_mob_life(mob/living/carbon/M)
if(prob(5))
@@ -370,7 +370,7 @@
glass_icon_state = "icedcoffeeglass"
glass_name = "iced coffee"
glass_desc = "A drink to perk you up and refresh you!"
hydration = 2 * REAGENTS_METABOLISM
hydration = 3
/datum/reagent/consumable/icecoffee/on_mob_life(mob/living/carbon/M)
M.dizziness = max(0,M.dizziness-5)
@@ -390,7 +390,7 @@
glass_icon_state = "icedteaglass"
glass_name = "iced tea"
glass_desc = "All natural, antioxidant-rich flavour sensation."
hydration = 2 * REAGENTS_METABOLISM
hydration = 3
/datum/reagent/consumable/icetea/on_mob_life(mob/living/carbon/M)
M.dizziness = max(0,M.dizziness-2)
@@ -410,7 +410,7 @@
glass_icon_state = "glass_brown"
glass_name = "glass of Space Cola"
glass_desc = "A glass of refreshing Space Cola."
hydration = 2 * REAGENTS_METABOLISM
hydration = 3
/datum/reagent/consumable/space_cola/on_mob_life(mob/living/carbon/M)
M.drowsyness = max(0,M.drowsyness-5)
@@ -426,7 +426,7 @@
glass_icon_state = "nuka_colaglass"
glass_name = "glass of Nuka Cola"
glass_desc = "Don't cry, Don't raise your eye, It's only nuclear wasteland."
hydration = 2 * REAGENTS_METABOLISM
hydration = 3
/datum/reagent/consumable/nuka_cola/on_mob_metabolize(mob/living/L)
..()
@@ -471,7 +471,7 @@
glass_icon_state = "dr_gibb_glass"
glass_name = "glass of Dr. Gibb"
glass_desc = "Dr. Gibb. Not as dangerous as the glass_name might imply."
hydration = 2 * REAGENTS_METABOLISM
hydration = 3
/datum/reagent/consumable/dr_gibb/on_mob_life(mob/living/carbon/M)
M.drowsyness = max(0,M.drowsyness-6)
@@ -486,7 +486,7 @@
glass_icon_state = "space-up_glass"
glass_name = "glass of Space-Up"
glass_desc = "Space-up. It helps you keep your cool."
hydration = 5 * REAGENTS_METABOLISM
hydration = 3
/datum/reagent/consumable/space_up/on_mob_life(mob/living/carbon/M)
M.adjust_bodytemperature(-8 * TEMPERATURE_DAMAGE_COEFFICIENT, BODYTEMP_NORMAL)
@@ -500,7 +500,7 @@
glass_icon_state = "glass_yellow"
glass_name = "glass of lemon-lime"
glass_desc = "You're pretty certain a real fruit has never actually touched this."
hydration = 2 * REAGENTS_METABOLISM
hydration = 3
/datum/reagent/consumable/lemon_lime/on_mob_life(mob/living/carbon/M)
M.adjust_bodytemperature(-8 * TEMPERATURE_DAMAGE_COEFFICIENT, BODYTEMP_NORMAL)
@@ -514,7 +514,7 @@
glass_icon_state = "glass_red"
glass_name = "glass of Pwr Game"
glass_desc = "Goes well with a Vlad's salad."
hydration = 2 * REAGENTS_METABOLISM
hydration = 3
/datum/reagent/consumable/pwr_game/on_mob_life(mob/living/carbon/M)
M.adjust_bodytemperature(-8 * TEMPERATURE_DAMAGE_COEFFICIENT, BODYTEMP_NORMAL)
@@ -528,7 +528,7 @@
glass_icon_state = "glass_red"
glass_name = "glass of Shambler's juice"
glass_desc = "Mmm mm, shambly."
hydration = 2 * REAGENTS_METABOLISM
hydration = 3
/datum/reagent/consumable/shamblers/on_mob_life(mob/living/carbon/M)
M.adjust_bodytemperature(-8 * TEMPERATURE_DAMAGE_COEFFICIENT, BODYTEMP_NORMAL)
@@ -543,7 +543,7 @@
glass_icon_state = "grey_bull_glass"
glass_name = "glass of Grey Bull"
glass_desc = "Surprisingly it isnt grey."
hydration = 2 * REAGENTS_METABOLISM
hydration = 3
/datum/reagent/consumable/grey_bull/on_mob_metabolize(mob/living/L)
..()
@@ -569,7 +569,7 @@
glass_icon_state = "glass_clear"
glass_name = "glass of soda water"
glass_desc = "Soda water. Why not make a scotch and soda?"
hydration = 4 * REAGENTS_METABOLISM
hydration = 4
/datum/reagent/consumable/sodawater/on_mob_life(mob/living/carbon/M)
M.dizziness = max(0,M.dizziness-5)
@@ -585,7 +585,7 @@
glass_icon_state = "glass_clear"
glass_name = "glass of tonic water"
glass_desc = "Quinine tastes funny, but at least it'll keep that Space Malaria away."
hydration = 4 * REAGENTS_METABOLISM
hydration = 4
/datum/reagent/consumable/tonic/on_mob_life(mob/living/carbon/M)
M.dizziness = max(0,M.dizziness-5)
@@ -604,7 +604,7 @@
glass_icon_state = "iceglass"
glass_name = "glass of ice"
glass_desc = "Generally, you're supposed to put something else in there too..."
hydration = 5 * REAGENTS_METABOLISM //ice is water dummy, just as good.
hydration = 5
/datum/reagent/consumable/ice/on_mob_life(mob/living/carbon/M)
M.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT, BODYTEMP_NORMAL)
@@ -619,7 +619,7 @@
glass_icon_state = "soy_latte"
glass_name = "soy latte"
glass_desc = "A nice and refreshing beverage while you're reading."
hydration = 2 * REAGENTS_METABOLISM
hydration = 3
/datum/reagent/consumable/soy_latte/on_mob_life(mob/living/carbon/M)
M.dizziness = max(0,M.dizziness-5)
@@ -641,7 +641,7 @@
glass_icon_state = "cafe_latte"
glass_name = "cafe latte"
glass_desc = "A nice, strong and refreshing beverage while you're reading."
hydration = 2 * REAGENTS_METABOLISM
hydration = 3
/datum/reagent/consumable/cafe_latte/on_mob_life(mob/living/carbon/M)
M.dizziness = max(0,M.dizziness-5)
@@ -663,7 +663,7 @@
glass_icon_state = "doctorsdelightglass"
glass_name = "Doctor's Delight"
glass_desc = "The space doctor's favorite. Guaranteed to restore bodily injury; side effects include cravings and hunger."
hydration = 2 * REAGENTS_METABOLISM
hydration = 3
/datum/reagent/consumable/doctor_delight/on_mob_life(mob/living/carbon/M)
M.adjustBruteLoss(-0.5, 0)
@@ -730,7 +730,7 @@
glass_icon_state = "pumpkin_latte"
glass_name = "pumpkin latte"
glass_desc = "A mix of coffee and pumpkin juice."
hydration = 2 * REAGENTS_METABOLISM
hydration = 3
/datum/reagent/consumable/gibbfloats
name = "Gibb Floats"
@@ -742,14 +742,14 @@
glass_icon_state = "gibbfloats"
glass_name = "Gibbfloat"
glass_desc = "Dr. Gibb with ice cream on top."
hydration = 3 * REAGENTS_METABOLISM
hydration = 3
/datum/reagent/consumable/pumpkinjuice
name = "Pumpkin Juice"
description = "Juiced from real pumpkin."
color = "#FFA500"
taste_description = "pumpkin"
hydration = 2 * REAGENTS_METABOLISM
hydration = 3
/datum/reagent/consumable/blumpkinjuice
name = "Blumpkin Juice"
@@ -766,7 +766,7 @@
glass_icon_state = "triplecitrus" //needs own sprite mine are trash
glass_name = "glass of triple citrus"
glass_desc = "A mixture of citrus juices. Tangy, yet smooth."
hydration = 2 * REAGENTS_METABOLISM
hydration = 3
/datum/reagent/consumable/grape_soda
name = "Grape soda"
@@ -775,7 +775,7 @@
taste_description = "grape soda"
glass_name = "glass of grape juice"
glass_desc = "It's grape (soda)!"
hydration = 2 * REAGENTS_METABOLISM
hydration = 3
/datum/reagent/consumable/grape_soda/on_mob_life(mob/living/carbon/M)
M.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT, BODYTEMP_NORMAL)
@@ -788,7 +788,7 @@
color = "#7D4E29"
quality = DRINK_NICE
taste_description = "chocolate milk"
hydration = 2 * REAGENTS_METABOLISM
hydration = 3
/datum/reagent/consumable/menthol
name = "Menthol"
@@ -810,7 +810,7 @@
taste_description = "sweet pomegranates"
glass_name = "glass of grenadine"
glass_desc = "Delicious flavored syrup."
hydration = 1 * REAGENTS_METABOLISM
hydration = 4
/datum/reagent/consumable/parsnipjuice
name = "Parsnip Juice"
@@ -818,7 +818,7 @@
color = "#FFA500"
taste_description = "parsnip"
glass_name = "glass of parsnip juice"
hydration = 1 * REAGENTS_METABOLISM
hydration = 4
/datum/reagent/consumable/pineapplejuice
name = "Pineapple Juice"
@@ -827,7 +827,7 @@
taste_description = "pineapple"
glass_name = "glass of pineapple juice"
glass_desc = "Tart, tropical, and hotly debated."
hydration = 2 * REAGENTS_METABOLISM
hydration = 4
/datum/reagent/consumable/peachjuice //Intended to be extremely rare due to being the limiting ingredients in the blazaam drink
name = "Peach Juice"
@@ -835,7 +835,7 @@
color = "#E78108"
taste_description = "peaches"
glass_name = "glass of peach juice"
hydration = 2 * REAGENTS_METABOLISM
hydration = 4
/datum/reagent/consumable/cream_soda
name = "Cream Soda"
@@ -846,7 +846,7 @@
glass_icon_state = "cream_soda"
glass_name = "Cream Soda"
glass_desc = "A classic space-American vanilla flavored soft drink."
hydration = 2 * REAGENTS_METABOLISM
hydration = 4
/datum/reagent/consumable/cream_soda/on_mob_life(mob/living/carbon/M)
M.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT, BODYTEMP_NORMAL)
@@ -888,7 +888,7 @@
taste_description = "sweet strawberry and milk cream"
glass_name = "tall glass of strawberry milk"
glass_desc = "Delicious flavored strawberry syrup mixed with milk."
hydration = 3 * REAGENTS_METABOLISM
hydration = 4
/datum/reagent/consumable/pinkmilk/on_mob_life(mob/living/carbon/M)
if(prob(15))
@@ -905,7 +905,7 @@
taste_description = "sweet tea with a hint of strawberry"
glass_name = "mug of strawberry tea"
glass_desc = "Delicious traditional tea flavored with strawberries."
hydration = 2 * REAGENTS_METABOLISM
hydration = 4
/datum/reagent/consumable/tea/pinktea/on_mob_life(mob/living/carbon/M)
if(prob(10))
@@ -921,7 +921,7 @@
glass_icon_state = "monkey_energy_glass"
glass_name = "glass of Monkey Energy"
glass_desc = "You can unleash the ape, but without the pop of the can?"
hydration = 1 * REAGENTS_METABOLISM
hydration = 4
/datum/reagent/consumable/monkey_energy/on_mob_life(mob/living/carbon/M)
M.Jitter(20)
@@ -939,7 +939,7 @@
glass_icon_state = "glass_yellow"
glass_name = "glass of bungo juice"
glass_desc = "Exotic! You feel like you are on vacation already."
hydration = 1 * REAGENTS_METABOLISM
hydration = 5
/datum/reagent/consumable/aloejuice
name = "Aloe Juice"
@@ -949,7 +949,7 @@
glass_icon_state = "glass_yellow"
glass_name = "glass of aloe juice"
glass_desc = "A healthy and refreshing juice."
hydration = 2 * REAGENTS_METABOLISM
hydration = 5
/datum/reagent/consumable/aloejuice/on_mob_life(mob/living/M)
if(prob(30))
@@ -984,7 +984,7 @@
glass_icon_state = "wockyslush"
glass_name = "Wocky Slush"
glass_desc = "That thang bleedin' to the-... ya know I mean?"
hydration = 3 * REAGENTS_METABOLISM
hydration = 3
/datum/reagent/consumable/wockyslush/on_mob_life(mob/living/carbon/M)
M.emote(pick("twitch","giggle","stare"))
@@ -18,6 +18,7 @@
/datum/reagent/consumable/on_mob_life(mob/living/carbon/M)
current_cycle++
M.nutrition += nutriment_factor
M.thirst += hydration
holder.remove_reagent(type, metabolization_rate)
/datum/reagent/consumable/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
@@ -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.")
..()
@@ -258,7 +258,7 @@
glass_name = "glass of water"
glass_desc = "The father of all refreshments."
shot_glass_icon_state = "shotglassclear"
hydration = 10 * REAGENTS_METABOLISM
hydration = 5
/*
* Water reaction to turf
@@ -1242,6 +1242,7 @@
var/mob/living/carbon/human/H = M
if(H.lip_style)
H.lip_style = null
H.nail_style = null
H.update_body()
for(var/obj/item/I in C.held_items)
SEND_SIGNAL(I, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK)
@@ -327,11 +327,11 @@
/obj/item/reagent_containers/glass/beaker/waterbottle
name = "bottle of water"
desc = "A bottle of water filled at an old Earth bottling facility."
desc = "A bottle of water filled at some factory in space."
icon = 'icons/obj/drinks.dmi'
icon_state = "smallbottle"
item_state = "bottle"
list_reagents = list(/datum/reagent/water = 49.5, /datum/reagent/fluorine = 0.5)//see desc, don't think about it too hard
list_reagents = list(/datum/reagent/water = 50)//see desc, don't think about it too hard
materials = list(MAT_GLASS=0)
volume = 50
amount_per_transfer_from_this = 10
@@ -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)
+8 -8
View File
@@ -1773,7 +1773,7 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
cost = 2
restricted_roles = list("Curator")
limited_stock = 1 //please don't spam deadchat
/* Disabled because this is waaaay too chaotic for hyper
/datum/uplink_item/role_restricted/his_grace
name = "His Grace"
desc = "An incredibly dangerous weapon recovered from a station overcome by the grey tide. Once activated, He will thirst for blood and must be used to kill to sate that thirst. \
@@ -1784,24 +1784,24 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
cost = 20
restricted_roles = list("Chaplain")
surplus = 5 //Very low chance to get it in a surplus crate even without being the chaplain
///datum/uplink_item/role_restricted/clockwork_slab
/datum/uplink_item/dangerous/clockwork_slab
*/
/datum/uplink_item/role_restricted/clockwork_slab
name = "Clockwork Slab"
desc = "A reverse engineered clockwork slab. Is this really a good idea?"
item = /obj/item/clockwork/slab/traitor
cost = 20
refundable = TRUE
//restricted_roles = list("Chaplain","Curator")
restricted_roles = list("Chaplain","Curator")
cant_discount = TRUE
///datum/uplink_item/role_restricted/arcane_tome
/datum/uplink_item/dangerous/arcane_tome
/datum/uplink_item/role_restricted/arcane_tome
name = "Arcane Tome"
desc = "A 'replica' of a Nar'sian tome. This is probably a bad idea..."
item = /obj/item/tome/traitor
cost = 20
refundable = TRUE
//restricted_roles = list("Chaplain","Curator")
restricted_roles = list("Chaplain","Curator")
cant_discount = TRUE
/datum/uplink_item/role_restricted/explosive_hot_potato
name = "Exploding Hot Potato"
+1
View File
@@ -102,6 +102,7 @@
/obj/item/clothing/suit/toggle/jacket_purple = 3,
/obj/item/clothing/suit/toggle/jacket_white = 3,
/obj/item/clothing/suit/jacket/letterman_red = 3,
/obj/item/clothing/suit/fluffyhalfcrop = 3,
/obj/item/clothing/ears/headphones = 10,
/obj/item/clothing/suit/apron/purple_bartender = 4,
/obj/item/clothing/under/rank/bartender/purple = 4,
+19
View File
@@ -16,3 +16,22 @@
contraband = list(/obj/item/reagent_containers/glass/bottle/wizarditis = 1) //No one can get to the machine to hack it anyways; for the lulz - Microwave
armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50, "magic" = 100)
resistance_flags = FIRE_PROOF
/obj/machinery/vending/magivend_novirus
name = "\improper MagiVend"
desc = "A magic vending machine."
icon_state = "MagiVend"
product_slogans = "Sling spells the proper way with MagiVend!;Be your own Houdini! Use MagiVend!"
vend_reply = "Have an enchanted evening!"
product_ads = "EI NATH;Destroy the station!;Admin conspiracies since forever!;Space-time bending hardware!;Now-magic proofing venders!"
products = list(/obj/item/clothing/head/wizard = 1,
/obj/item/clothing/suit/wizrobe = 1,
/obj/item/clothing/head/wizard/red = 1,
/obj/item/clothing/suit/wizrobe/red = 1,
/obj/item/clothing/head/wizard/yellow = 1,
/obj/item/clothing/suit/wizrobe/yellow = 1,
/obj/item/clothing/shoes/sandal/magic = 1,
/obj/item/staff = 2)
contraband = list(/obj/item/coin/antagtoken = 1)
armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50, "magic" = 100)
resistance_flags = FIRE_PROOF