mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-21 20:20:33 +01:00
Merge branch 'master' into seperate-job-files
This commit is contained in:
@@ -38,6 +38,7 @@
|
||||
#define INSULATED /datum/mutation/human/insulated
|
||||
#define SHOCKTOUCH /datum/mutation/human/shock
|
||||
#define OLFACTION /datum/mutation/human/olfaction
|
||||
#define YELLING /datum/mutation/human/yelling
|
||||
|
||||
#define UI_CHANGED "ui changed"
|
||||
#define UE_CHANGED "ue changed"
|
||||
|
||||
@@ -14,6 +14,10 @@
|
||||
#define RUNELESS_MAX_BLOODCHARGE 1
|
||||
#define CULT_RISEN 0.2 //percent before rise
|
||||
#define CULT_ASCENDENT 0.4 //percent before ascend
|
||||
#define BLOOD_SPEAR_COST 150
|
||||
#define BLOOD_BARRAGE_COST 300
|
||||
#define BLOOD_BEAM_COST 500
|
||||
#define METAL_TO_CONSTRUCT_SHELL_CONVERSION 50
|
||||
//screen locations
|
||||
#define DEFAULT_BLOODSPELLS "6:-29,4:-2"
|
||||
#define DEFAULT_BLOODTIP "14:6,14:27"
|
||||
|
||||
@@ -27,3 +27,5 @@
|
||||
#define DEL_REAGENT 1 // reagent deleted (fully cleared)
|
||||
#define ADD_REAGENT 2 // reagent added
|
||||
#define REM_REAGENT 3 // reagent removed (may still exist)
|
||||
|
||||
#define MIMEDRINK_SILENCE_DURATION 30 //ends up being 60 seconds given 1 tick every 2 seconds
|
||||
|
||||
@@ -354,6 +354,10 @@
|
||||
/datum/config_entry/string/client_error_message
|
||||
config_entry_value = "Your version of byond is too old, may have issues, and is blocked from accessing this server."
|
||||
|
||||
/datum/config_entry/number/client_error_build
|
||||
config_entry_value = null
|
||||
min_val = 0
|
||||
|
||||
/datum/config_entry/number/minute_topic_limit
|
||||
config_entry_value = null
|
||||
min_val = 0
|
||||
|
||||
@@ -178,7 +178,7 @@
|
||||
// If set, use the custom icon that we set instead
|
||||
// of the item appearence
|
||||
..()
|
||||
else if(target && current_button.appearance_cache != target.appearance) //replace with /ref comparison if this is not valid.
|
||||
else if((target && current_button.appearance_cache != target.appearance) || force) //replace with /ref comparison if this is not valid.
|
||||
var/obj/item/I = target
|
||||
var/old_layer = I.layer
|
||||
var/old_plane = I.plane
|
||||
@@ -244,6 +244,14 @@
|
||||
/datum/action/item_action/toggle_helmet_light
|
||||
name = "Toggle Helmet Light"
|
||||
|
||||
/datum/action/item_action/toggle_welding_screen
|
||||
name = "Toggle Welding Screen"
|
||||
|
||||
/datum/action/item_action/toggle_welding_screen/Trigger()
|
||||
var/obj/item/clothing/head/hardhat/weldhat/H = target
|
||||
if(istype(H))
|
||||
H.toggle_welding_screen(owner)
|
||||
|
||||
/datum/action/item_action/toggle_headphones
|
||||
name = "Toggle Headphones"
|
||||
desc = "UNTZ UNTZ UNTZ"
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
var/can_gain = TRUE
|
||||
var/random_gain = TRUE //can this be gained through random traumas?
|
||||
var/resilience = TRAUMA_RESILIENCE_BASIC //how hard is this to cure?
|
||||
var/clonable = TRUE // will this transfer if the brain is cloned?
|
||||
|
||||
/datum/brain_trauma/Destroy()
|
||||
if(brain && brain.traumas)
|
||||
@@ -24,6 +25,10 @@
|
||||
owner = null
|
||||
return ..()
|
||||
|
||||
/datum/brain_trauma/proc/on_clone()
|
||||
if(clonable)
|
||||
return new type
|
||||
|
||||
//Called on life ticks
|
||||
/datum/brain_trauma/proc/on_life()
|
||||
return
|
||||
|
||||
@@ -31,6 +31,11 @@
|
||||
trigger_species = SStraumas.phobia_species[phobia_type]
|
||||
..()
|
||||
|
||||
|
||||
/datum/brain_trauma/mild/phobia/on_clone()
|
||||
if(clonable)
|
||||
return new type(phobia_type)
|
||||
|
||||
/datum/brain_trauma/mild/phobia/on_life()
|
||||
..()
|
||||
if(owner.has_trait(TRAIT_FEARLESS))
|
||||
|
||||
@@ -69,7 +69,8 @@
|
||||
//for descriptions
|
||||
|
||||
/datum/brain_trauma/severe/paralysis/New(specific_type)
|
||||
paralysis_type = specific_type
|
||||
if(specific_type)
|
||||
paralysis_type = specific_type
|
||||
if(!paralysis_type)
|
||||
paralysis_type = pick("full","left","right","arms","legs","r_arm","l_arm","r_leg","l_leg")
|
||||
var/subject
|
||||
@@ -117,6 +118,11 @@
|
||||
owner.remove_trait(X, "trauma_paralysis")
|
||||
owner.update_disabled_bodyparts()
|
||||
|
||||
/datum/brain_trauma/severe/paralysis/paraplegic
|
||||
random_gain = FALSE
|
||||
paralysis_type = "legs"
|
||||
resilience = TRAUMA_RESILIENCE_ABSOLUTE
|
||||
|
||||
/datum/brain_trauma/severe/narcolepsy
|
||||
name = "Narcolepsy"
|
||||
desc = "Patient may involuntarily fall asleep during normal activities."
|
||||
|
||||
@@ -33,12 +33,12 @@
|
||||
UnregisterSignal(user, COMSIG_MOB_RECEIVE_MAGIC)
|
||||
|
||||
/datum/component/anti_magic/proc/protect(datum/source, mob/user, _magic, _holy, major, self, list/protection_sources)
|
||||
if(((_magic && magic) || (_holy && holy)) && (self && blocks_self))
|
||||
if(((_magic && magic) || (_holy && holy)) && (!self || blocks_self))
|
||||
protection_sources += parent
|
||||
reaction.Invoke(user, major)
|
||||
reaction?.Invoke(user, major)
|
||||
if(major)
|
||||
charges--
|
||||
if(charges <= 0)
|
||||
expire.Invoke(user)
|
||||
expire?.Invoke(user)
|
||||
return COMPONENT_BLOCK_MAGIC
|
||||
|
||||
|
||||
@@ -116,12 +116,57 @@
|
||||
|
||||
/datum/component/mood/proc/update_mood_icon()
|
||||
var/mob/living/owner = parent
|
||||
if(owner.client && owner.hud_used)
|
||||
if(!(owner.client || owner.hud_used))
|
||||
return
|
||||
screen_obj.cut_overlays()
|
||||
screen_obj.color = initial(screen_obj.color)
|
||||
//lets see if we have any special icons to show instead of the normal mood levels
|
||||
var/list/conflicting_moodies = list()
|
||||
var/highest_absolute_mood = 0
|
||||
for(var/i in mood_events) //adds overlays and sees which special icons need to vie for which one gets the icon_state
|
||||
var/datum/mood_event/event = mood_events[i]
|
||||
if(!event.special_screen_obj)
|
||||
continue
|
||||
if(!event.special_screen_replace)
|
||||
screen_obj.add_overlay(event.special_screen_obj)
|
||||
else
|
||||
conflicting_moodies += event
|
||||
var/absmood = abs(event.mood_change)
|
||||
if(absmood > highest_absolute_mood)
|
||||
highest_absolute_mood = absmood
|
||||
|
||||
if(!conflicting_moodies.len) //no special icons- go to the normal icon states
|
||||
if(sanity < 25)
|
||||
screen_obj.icon_state = "mood_insane"
|
||||
else
|
||||
screen_obj.icon_state = "mood[mood_level]"
|
||||
screen_obj_sanity.icon_state = "sanity[sanity_level]"
|
||||
return
|
||||
|
||||
for(var/i in conflicting_moodies)
|
||||
var/datum/mood_event/event = i
|
||||
if(abs(event.mood_change) == highest_absolute_mood)
|
||||
screen_obj.icon_state = "[event.special_screen_obj]"
|
||||
switch(mood_level)
|
||||
if(1)
|
||||
screen_obj.color = "#747690"
|
||||
if(2)
|
||||
screen_obj.color = "#f15d36"
|
||||
if(3)
|
||||
screen_obj.color = "#f38a43"
|
||||
if(4)
|
||||
screen_obj.color = "#dfa65b"
|
||||
if(5)
|
||||
screen_obj.color = "#4b96c4"
|
||||
if(6)
|
||||
screen_obj.color = "#a8d259"
|
||||
if(7)
|
||||
screen_obj.color = "#86d656"
|
||||
if(8)
|
||||
screen_obj.color = "#30dd26"
|
||||
if(9)
|
||||
screen_obj.color = "#2eeb9a"
|
||||
break
|
||||
|
||||
/datum/component/mood/process() //Called on SSmood process
|
||||
var/mob/living/owner = parent
|
||||
|
||||
@@ -7,6 +7,11 @@
|
||||
mood_change = 2
|
||||
timeout = 3600
|
||||
|
||||
/datum/mood_event/wrong_brand
|
||||
description = "<span class='warning'>I hate that brand of cigarettes.</span>\n"
|
||||
mood_change = -2
|
||||
timeout = 3600
|
||||
|
||||
/datum/mood_event/overdose
|
||||
mood_change = -8
|
||||
timeout = 3000
|
||||
@@ -46,8 +51,10 @@
|
||||
description = "<span class='nicegreen'>YES! YES!! YES!!!</span>\n"
|
||||
mood_change = 100
|
||||
timeout = 300
|
||||
special_screen_obj = "mood_happiness_good"
|
||||
|
||||
/datum/mood_event/happiness_drug_bad_od
|
||||
description = "<span class='boldwarning'>NO! NO!! NO!!!</span>\n"
|
||||
mood_change = -100
|
||||
timeout = 300
|
||||
special_screen_obj = "mood_happiness_bad"
|
||||
|
||||
@@ -59,12 +59,16 @@
|
||||
description = "I'm a fucking badass and everyone around me knows it. Just look at them; they're all fucking shaking at the mere thought of me around."
|
||||
mood_change = 15
|
||||
hidden = TRUE
|
||||
special_screen_obj = "badass_sun"
|
||||
special_screen_replace = FALSE
|
||||
|
||||
/datum/mood_event/creeping
|
||||
description = "<span class='greentext'>I'm so close to my obsession and I never want this to end.</span>\n" //creeps get it when they are around their obsession
|
||||
mood_change = 18
|
||||
timeout = 30
|
||||
hidden = TRUE
|
||||
special_screen_obj = "creep_inlove"
|
||||
special_screen_replace = FALSE
|
||||
|
||||
/datum/mood_event/creeping/add_effects(name)
|
||||
description = "<span class='greentext'>I'm so close to [name] and I NEVER want this to end.</span>\n"
|
||||
|
||||
@@ -4,6 +4,8 @@
|
||||
var/timeout = 0
|
||||
var/hidden = FALSE//Not shown on examine
|
||||
var/category //string of what category this mood was added in as
|
||||
var/special_screen_obj //if it isn't null, it will replace or add onto the mood icon with this (same file). see happiness drug for example
|
||||
var/special_screen_replace = TRUE //if false, it will be an overlay instead
|
||||
var/mob/owner
|
||||
|
||||
/datum/mood_event/New(mob/M, param)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/datum/mutation/human/geladikinesis
|
||||
name = "Geladikinetic Creation"
|
||||
name = "Geladikinesis"
|
||||
desc = "Allows the user to concentrate moisture and sub-zero forces into snow."
|
||||
quality = POSITIVE
|
||||
text_gain_indication = "<span class='notice'>Your hand feels cold.</span>"
|
||||
|
||||
@@ -219,3 +219,16 @@
|
||||
..()
|
||||
owner.grant_language(/datum/language/common)
|
||||
owner.remove_language(/datum/language/beachbum)
|
||||
|
||||
/datum/mutation/human/yelling
|
||||
name = "Yelling"
|
||||
desc = "A mutation that forces the host to constantly yell their sentences out."
|
||||
quality = MINOR_NEGATIVE
|
||||
locked = TRUE
|
||||
text_gain_indication = "<span class='danger'>You feel really angry.</span>"
|
||||
text_lose_indication = "<span class='notice'>You feel calmer.</span>"
|
||||
|
||||
/datum/mutation/human/yelling/say_mod(message)
|
||||
if(message)
|
||||
message = "[uppertext(replacetext(message, ".", "!"))]!"
|
||||
return (message)
|
||||
|
||||
@@ -265,6 +265,41 @@
|
||||
to_chat(quirk_holder, "<span class='boldannounce'>Your antagonistic nature has caused you to renounce your pacifism.</span>")
|
||||
qdel(src)
|
||||
|
||||
/datum/quirk/paraplegic
|
||||
name = "Paraplegic"
|
||||
desc = "Your legs do not function. Nothing will ever fix this. But hey, free wheelchair!"
|
||||
value = -3
|
||||
human_only = TRUE
|
||||
gain_text = null // Handled by trauma.
|
||||
lose_text = null
|
||||
medical_record_text = "Patient has an untreatable impairment in motor function in the lower extremities."
|
||||
|
||||
/datum/quirk/paraplegic/add()
|
||||
var/datum/brain_trauma/severe/paralysis/paraplegic/T = new()
|
||||
var/mob/living/carbon/human/H = quirk_holder
|
||||
H.gain_trauma(T, TRAUMA_RESILIENCE_ABSOLUTE)
|
||||
|
||||
/datum/quirk/paraplegic/on_spawn()
|
||||
if(quirk_holder.buckled) // Handle late joins being buckled to arrival shuttle chairs.
|
||||
quirk_holder.buckled.unbuckle_mob(quirk_holder)
|
||||
|
||||
var/turf/T = get_turf(quirk_holder)
|
||||
var/obj/structure/chair/spawn_chair = locate() in T
|
||||
|
||||
var/obj/vehicle/ridden/wheelchair/wheels = new(T)
|
||||
if(spawn_chair) // Makes spawning on the arrivals shuttle more consistent looking
|
||||
wheels.setDir(spawn_chair.dir)
|
||||
|
||||
wheels.buckle_mob(quirk_holder)
|
||||
|
||||
// During the spawning process, they may have dropped what they were holding, due to the paralysis
|
||||
// So put the things back in their hands.
|
||||
|
||||
for(var/obj/item/I in T)
|
||||
if(I.fingerprintslast == quirk_holder.ckey)
|
||||
quirk_holder.put_in_hands(I)
|
||||
|
||||
|
||||
/datum/quirk/poor_aim
|
||||
name = "Poor Aim"
|
||||
desc = "You're terrible with guns and can't line up a straight shot to save your life. Dual-wielding is right out."
|
||||
@@ -370,3 +405,114 @@
|
||||
if(prob(1))
|
||||
new/obj/item/reagent_containers/food/snacks/spaghetti/pastatomato(get_turf(H)) //now that's what I call spaghetti code
|
||||
|
||||
//If you want to make some kind of junkie variant, just extend this quirk.
|
||||
/datum/quirk/junkie
|
||||
name = "Junkie"
|
||||
desc = "You can't get enough of hard drugs."
|
||||
value = -2
|
||||
gain_text = "<span class='danger'>You suddenly feel the craving for drugs.</span>"
|
||||
lose_text = "<span class='notice'>You feel like you should kick your drug habit.</span>"
|
||||
medical_record_text = "Patient has a history of hard drugs."
|
||||
var/drug_list = list("crank", "krokodil", "morphine", "happiness", "methamphetamine") //List of possible IDs
|
||||
var/reagent_id //ID picked from list
|
||||
var/datum/reagent/reagent_type //If this is defined, reagent_id will be unused and the defined reagent type will be instead.
|
||||
var/datum/reagent/reagent_instance
|
||||
var/where_drug
|
||||
var/obj/item/drug_container_type //If this is defined before pill generation, pill generation will be skipped. This is the type of the pill bottle.
|
||||
var/obj/item/drug_instance
|
||||
var/where_accessory
|
||||
var/obj/item/accessory_type //If this is null, it won't be spawned.
|
||||
var/obj/item/accessory_instance
|
||||
var/tick_counter = 0
|
||||
|
||||
/datum/quirk/junkie/on_spawn()
|
||||
var/mob/living/carbon/human/H = quirk_holder
|
||||
reagent_id = pick(drug_list)
|
||||
if (!reagent_type)
|
||||
var/datum/reagent/prot_holder = GLOB.chemical_reagents_list[reagent_id]
|
||||
reagent_type = prot_holder.type
|
||||
reagent_instance = new reagent_type()
|
||||
H.reagents.addiction_list.Add(reagent_instance)
|
||||
var/current_turf = get_turf(quirk_holder)
|
||||
if (!drug_container_type)
|
||||
drug_container_type = /obj/item/storage/pill_bottle
|
||||
drug_instance = new drug_container_type(current_turf)
|
||||
if (istype(drug_instance, /obj/item/storage/pill_bottle))
|
||||
var/pill_state = "pill[rand(1,20)]"
|
||||
for(var/i in 1 to 7)
|
||||
var/obj/item/reagent_containers/pill/P = new(drug_instance)
|
||||
P.icon_state = pill_state
|
||||
P.list_reagents = list("[reagent_id]" = 1)
|
||||
|
||||
if (accessory_type)
|
||||
accessory_instance = new accessory_type(current_turf)
|
||||
var/list/slots = list(
|
||||
"in your left pocket" = SLOT_L_STORE,
|
||||
"in your right pocket" = SLOT_R_STORE,
|
||||
"in your backpack" = SLOT_IN_BACKPACK
|
||||
)
|
||||
where_drug = H.equip_in_one_of_slots(drug_instance, slots, FALSE) || "at your feet"
|
||||
if (accessory_instance)
|
||||
where_accessory = H.equip_in_one_of_slots(accessory_instance, slots, FALSE) || "at your feet"
|
||||
announce_drugs()
|
||||
|
||||
/datum/quirk/junkie/post_add()
|
||||
if(where_drug == "in your backpack" || where_accessory == "in your backpack")
|
||||
var/mob/living/carbon/human/H = quirk_holder
|
||||
SEND_SIGNAL(H.back, COMSIG_TRY_STORAGE_SHOW, H)
|
||||
|
||||
/datum/quirk/junkie/proc/announce_drugs()
|
||||
to_chat(quirk_holder, "<span class='boldnotice'>There is a [drug_instance.name] of [reagent_instance.name] [where_drug]. Better hope you don't run out...</span>")
|
||||
|
||||
/datum/quirk/junkie/on_process()
|
||||
var/mob/living/carbon/human/H = quirk_holder
|
||||
if (tick_counter == 60) //Halfassed optimization, increase this if there's slowdown due to this quirk
|
||||
var/in_list = FALSE
|
||||
for (var/datum/reagent/entry in H.reagents.addiction_list)
|
||||
if(istype(entry, reagent_type))
|
||||
in_list = TRUE
|
||||
break
|
||||
if(!in_list)
|
||||
H.reagents.addiction_list += reagent_instance
|
||||
reagent_instance.addiction_stage = 0
|
||||
to_chat(quirk_holder, "<span class='danger'>You thought you kicked it, but you suddenly feel like you need [reagent_instance.name] again...")
|
||||
tick_counter = 0
|
||||
else
|
||||
++tick_counter
|
||||
|
||||
/datum/quirk/junkie/smoker
|
||||
name = "Smoker"
|
||||
desc = "Sometimes you just really want a smoke. Probably not great for your lungs."
|
||||
value = -1
|
||||
gain_text = "<span class='danger'>You could really go for a smoke right about now.</span>"
|
||||
lose_text = "<span class='notice'>You feel like you should quit smoking.</span>"
|
||||
medical_record_text = "Patient is a current smoker."
|
||||
reagent_type = /datum/reagent/drug/nicotine
|
||||
accessory_type = /obj/item/lighter/greyscale
|
||||
|
||||
/datum/quirk/junkie/smoker/on_spawn()
|
||||
drug_container_type = pick(/obj/item/storage/fancy/cigarettes,
|
||||
/obj/item/storage/fancy/cigarettes/cigpack_midori,
|
||||
/obj/item/storage/fancy/cigarettes/cigpack_uplift,
|
||||
/obj/item/storage/fancy/cigarettes/cigpack_robust,
|
||||
/obj/item/storage/fancy/cigarettes/cigpack_robustgold,
|
||||
/obj/item/storage/fancy/cigarettes/cigpack_carp,
|
||||
/obj/item/storage/fancy/cigarettes/cigars,
|
||||
/obj/item/storage/fancy/cigarettes/cigars/cohiba,
|
||||
/obj/item/storage/fancy/cigarettes/cigars/havana)
|
||||
. = ..()
|
||||
|
||||
/datum/quirk/junkie/smoker/announce_drugs()
|
||||
to_chat(quirk_holder, "<span class='boldnotice'>There is a [drug_instance.name] [where_drug], and a lighter [where_accessory]. Make sure you get your favorite brand when you run out.</span>")
|
||||
|
||||
|
||||
/datum/quirk/junkie/smoker/on_process()
|
||||
. = ..()
|
||||
var/mob/living/carbon/human/H = quirk_holder
|
||||
var/obj/item/I = H.get_item_by_slot(SLOT_WEAR_MASK)
|
||||
if (istype(I, /obj/item/clothing/mask/cigarette))
|
||||
var/obj/item/storage/fancy/cigarettes/C = drug_instance
|
||||
if(istype(I, C.spawn_type))
|
||||
SEND_SIGNAL(quirk_holder, COMSIG_CLEAR_MOOD_EVENT, "wrong_cigs")
|
||||
return
|
||||
SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, "wrong_cigs", /datum/mood_event/wrong_brand)
|
||||
|
||||
@@ -83,7 +83,7 @@
|
||||
return T.zPassOut(src, direction, destination) && destination.zPassIn(src, direction, T)
|
||||
|
||||
/atom/movable/vv_edit_var(var_name, var_value)
|
||||
var/static/list/banned_edits = list("step_x", "step_y", "step_size")
|
||||
var/static/list/banned_edits = list("step_x", "step_y", "step_size", "bounds")
|
||||
var/static/list/careful_edits = list("bound_x", "bound_y", "bound_width", "bound_height")
|
||||
if(var_name in banned_edits)
|
||||
return FALSE //PLEASE no.
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
if(C == owner)
|
||||
continue
|
||||
var/datum/status_effect/hive_track/mark = C.has_status_effect(STATUS_EFFECT_HIVE_TRACKER)
|
||||
if(mark?.tracked_by == owner)
|
||||
if(mark && mark.tracked_by == owner)
|
||||
trackable_targets_exist = TRUE
|
||||
var/their_loc = get_turf(C)
|
||||
var/distance = get_dist_euclidian(my_loc, their_loc)
|
||||
|
||||
@@ -137,7 +137,7 @@
|
||||
return examine(user)
|
||||
|
||||
//Start growing a human clone in the pod!
|
||||
/obj/machinery/clonepod/proc/growclone(clonename, ui, mutation_index, mindref, last_death, datum/species/mrace, list/features, factions, list/quirks, datum/bank_account/insurance)
|
||||
/obj/machinery/clonepod/proc/growclone(clonename, ui, mutation_index, mindref, last_death, datum/species/mrace, list/features, factions, list/quirks, datum/bank_account/insurance, list/traumas)
|
||||
if(panel_open)
|
||||
return NONE
|
||||
if(mess || attempting)
|
||||
@@ -218,6 +218,12 @@
|
||||
var/datum/quirk/Q = new V(H)
|
||||
Q.on_clone(quirks[V])
|
||||
|
||||
for(var/t in traumas)
|
||||
var/datum/brain_trauma/BT = t
|
||||
var/datum/brain_trauma/cloned_trauma = BT.on_clone()
|
||||
if(cloned_trauma)
|
||||
H.gain_trauma(cloned_trauma, BT.resilience)
|
||||
|
||||
H.set_cloned_appearance()
|
||||
|
||||
H.set_suicide(FALSE)
|
||||
@@ -388,7 +394,6 @@
|
||||
mob_occupant.remove_trait(TRAIT_NOCRITDAMAGE, CLONING_POD_TRAIT)
|
||||
mob_occupant.remove_trait(TRAIT_NOBREATH, CLONING_POD_TRAIT)
|
||||
|
||||
|
||||
if(grab_ghost_when == CLONER_MATURE_CLONE)
|
||||
mob_occupant.grab_ghost()
|
||||
to_chat(occupant, "<span class='notice'><b>There is a bright flash!</b><br><i>You feel like a new being.</i></span>")
|
||||
|
||||
@@ -63,7 +63,7 @@
|
||||
. = pod
|
||||
|
||||
/proc/grow_clone_from_record(obj/machinery/clonepod/pod, datum/data/record/R)
|
||||
return pod.growclone(R.fields["name"], R.fields["UI"], R.fields["SE"], R.fields["mind"], R.fields["last_death"], R.fields["mrace"], R.fields["features"], R.fields["factions"], R.fields["quirks"], R.fields["bank_account"])
|
||||
return pod.growclone(R.fields["name"], R.fields["UI"], R.fields["SE"], R.fields["mind"], R.fields["last_death"], R.fields["mrace"], R.fields["features"], R.fields["factions"], R.fields["quirks"], R.fields["bank_account"], R.fields["traumas"])
|
||||
|
||||
/obj/machinery/computer/cloning/process()
|
||||
if(!(scanner && LAZYLEN(pods) && autoprocess))
|
||||
@@ -474,7 +474,7 @@
|
||||
else if(pod.occupant)
|
||||
temp = "<font class='bad'>Cloning cycle already in progress.</font>"
|
||||
playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
|
||||
else
|
||||
else
|
||||
var/result = grow_clone_from_record(pod, C)
|
||||
if(result & CLONING_SUCCESS)
|
||||
temp = "[C.fields["name"]] => <font class='good'>Cloning cycle in progress...</font>"
|
||||
@@ -488,7 +488,7 @@
|
||||
active_record = null
|
||||
menu = 1
|
||||
records -= C
|
||||
|
||||
|
||||
if(!success)
|
||||
temp = "[C.fields["name"]] => <font class='bad'>Initialisation failure.</font>"
|
||||
playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
|
||||
@@ -567,11 +567,17 @@
|
||||
R.fields["features"] = dna.features
|
||||
R.fields["factions"] = mob_occupant.faction
|
||||
R.fields["quirks"] = list()
|
||||
R.fields["bank_account"] = has_bank_account
|
||||
for(var/V in mob_occupant.roundstart_quirks)
|
||||
var/datum/quirk/T = V
|
||||
R.fields["quirks"][T.type] = T.clone_data()
|
||||
|
||||
R.fields["traumas"] = list()
|
||||
if(ishuman(mob_occupant))
|
||||
R.fields["traumas"] = C.get_traumas()
|
||||
if(isbrain(mob_occupant))
|
||||
R.fields["traumas"] = B.get_traumas()
|
||||
|
||||
R.fields["bank_account"] = has_bank_account
|
||||
R.fields["mind"] = "[REF(mob_occupant.mind)]"
|
||||
R.fields["last_death"] = mob_occupant.stat == DEAD ? mob_occupant.mind.last_death : -1
|
||||
|
||||
@@ -591,4 +597,4 @@
|
||||
else
|
||||
scantemp = "Subject successfully scanned."
|
||||
records += R
|
||||
playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
|
||||
playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50)
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
var/obj/item/clothing/head/helmet/space/helmet = null
|
||||
var/obj/item/clothing/mask/mask = null
|
||||
var/obj/item/storage = null
|
||||
// if you add more storage slots, update cook() to clear their radiation too.
|
||||
|
||||
var/suit_type = null
|
||||
var/helmet_type = null
|
||||
@@ -248,9 +249,25 @@
|
||||
else
|
||||
visible_message("<span class='warning'>[src]'s door slides open, barraging you with the nauseating smell of charred flesh.</span>")
|
||||
playsound(src, 'sound/machines/airlockclose.ogg', 25, 1)
|
||||
for(var/obj/item/I in src) //Scorches away blood and forensic evidence, although the SSU itself is unaffected
|
||||
SEND_SIGNAL(I, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRONG)
|
||||
var/datum/component/radioactive/contamination = I.GetComponent(/datum/component/radioactive)
|
||||
var/list/things_to_clear = list() //Done this way since using GetAllContents on the SSU itself would include circuitry and such.
|
||||
if(suit)
|
||||
things_to_clear += suit
|
||||
things_to_clear += suit.GetAllContents()
|
||||
if(helmet)
|
||||
things_to_clear += helmet
|
||||
things_to_clear += helmet.GetAllContents()
|
||||
if(mask)
|
||||
things_to_clear += mask
|
||||
things_to_clear += mask.GetAllContents()
|
||||
if(storage)
|
||||
things_to_clear += storage
|
||||
things_to_clear += storage.GetAllContents()
|
||||
if(occupant)
|
||||
things_to_clear += occupant
|
||||
things_to_clear += occupant.GetAllContents()
|
||||
for(var/atom/movable/AM in things_to_clear) //Scorches away blood and forensic evidence, although the SSU itself is unaffected
|
||||
SEND_SIGNAL(AM, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRONG)
|
||||
var/datum/component/radioactive/contamination = AM.GetComponent(/datum/component/radioactive)
|
||||
if(contamination)
|
||||
qdel(contamination)
|
||||
open_machine(FALSE)
|
||||
|
||||
@@ -541,7 +541,7 @@
|
||||
var/oldloc = loc
|
||||
if(internal_damage & MECHA_INT_CONTROL_LOST)
|
||||
move_result = mechsteprand()
|
||||
else if(dir != direction && !strafe)
|
||||
else if(dir != direction && (!strafe || occupant.client.keys_held["Alt"]))
|
||||
move_result = mechturn(direction)
|
||||
else
|
||||
move_result = mechstep(direction)
|
||||
|
||||
@@ -128,7 +128,7 @@
|
||||
|
||||
|
||||
/datum/action/innate/mecha/strafe
|
||||
name = "Toggle Strafing"
|
||||
name = "Toggle Strafing. Disabled when Alt is held."
|
||||
button_icon_state = "strafe"
|
||||
|
||||
/datum/action/innate/mecha/strafe/Activate()
|
||||
|
||||
@@ -342,6 +342,7 @@
|
||||
SSblackbox.record_feedback("tally", "handcuffs", 1, type)
|
||||
to_chat(C, "<span class='userdanger'>\The [src] ensnares you!</span>")
|
||||
C.Paralyze(knockdown)
|
||||
playsound(src, 'sound/effects/snap.ogg', 50, TRUE)
|
||||
|
||||
/obj/item/restraints/legcuffs/bola/tactical//traitor variant
|
||||
name = "reinforced bola"
|
||||
|
||||
@@ -84,5 +84,5 @@
|
||||
singular_name = "snow tile"
|
||||
desc = "A layer of snow."
|
||||
icon_state = "tile_snow"
|
||||
turf_type = /turf/open/floor/grass/snow
|
||||
turf_type = /turf/open/floor/grass/snow/safe
|
||||
mineralType = "snow"
|
||||
@@ -8,6 +8,7 @@
|
||||
new /obj/item/clothing/neck/cloak/ce(src)
|
||||
new /obj/item/clothing/under/rank/chief_engineer(src)
|
||||
new /obj/item/clothing/head/hardhat/white(src)
|
||||
new /obj/item/clothing/head/hardhat/weldhat/white(src)
|
||||
new /obj/item/clothing/head/welding(src)
|
||||
new /obj/item/clothing/gloves/color/yellow(src)
|
||||
new /obj/item/clothing/shoes/sneakers/brown(src)
|
||||
|
||||
@@ -104,6 +104,7 @@
|
||||
new /obj/item/radio/headset/headset_sec(src)
|
||||
new /obj/item/clothing/suit/armor/vest/warden(src)
|
||||
new /obj/item/clothing/head/warden(src)
|
||||
new /obj/item/clothing/head/warden/drill(src)
|
||||
new /obj/item/clothing/head/beret/sec/navywarden(src)
|
||||
new /obj/item/clothing/suit/armor/vest/warden/alt(src)
|
||||
new /obj/item/clothing/under/rank/warden/navyblue(src)
|
||||
|
||||
@@ -134,6 +134,10 @@
|
||||
icon_state = "basalt[rand(0, 12)]"
|
||||
set_basalt_light(src)
|
||||
|
||||
/turf/open/floor/grass/snow/safe
|
||||
slowdown = 1.5
|
||||
planetary_atmos = FALSE
|
||||
|
||||
|
||||
/turf/open/floor/grass/fakebasalt //Heart is not a real planeteer power
|
||||
name = "aesthetic volcanic flooring"
|
||||
|
||||
@@ -52,25 +52,22 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
|
||||
var/procname = input("Proc path, eg: /proc/fake_blood","Path:", null) as text|null
|
||||
if(!procname)
|
||||
return
|
||||
|
||||
//hascall() doesn't support proc paths (eg: /proc/gib(), it only supports "gib")
|
||||
var/testname = procname
|
||||
if(targetselected)
|
||||
//Find one of the 3 possible ways they could have written /proc/PROCNAME
|
||||
if(findtext(procname, "/proc/"))
|
||||
testname = replacetext(procname, "/proc/", "")
|
||||
else if(findtext(procname, "/proc"))
|
||||
testname = replacetext(procname, "/proc", "")
|
||||
else if(findtext(procname, "proc/"))
|
||||
testname = replacetext(procname, "proc/", "")
|
||||
//Clear out any parenthesis if they're a dummy
|
||||
testname = replacetext(testname, "()", "")
|
||||
|
||||
if(targetselected && !hascall(target,testname))
|
||||
to_chat(usr, "<font color='red'>Error: callproc(): type [target.type] has no proc named [procname].</font>")
|
||||
|
||||
//strip away everything but the proc name
|
||||
var/list/proclist = splittext(procname, "/")
|
||||
if (!length(proclist))
|
||||
return
|
||||
procname = proclist[proclist.len]
|
||||
|
||||
var/proctype = "proc"
|
||||
if ("verb" in proclist)
|
||||
proctype = "verb"
|
||||
|
||||
if(targetselected && !hascall(target, procname))
|
||||
to_chat(usr, "<font color='red'>Error: callproc(): type [target.type] has no [proctype] named [procname].</font>")
|
||||
return
|
||||
else
|
||||
var/procpath = text2path(procname)
|
||||
var/procpath = text2path("[proctype]/[procname]")
|
||||
if (!procpath)
|
||||
to_chat(usr, "<font color='red'>Error: callproc(): proc [procname] does not exist. (Did you forget the /proc/ part?)</font>")
|
||||
return
|
||||
|
||||
@@ -176,7 +176,7 @@
|
||||
|
||||
/datum/action/innate/cult/blood_spell/construction
|
||||
name = "Twisted Construction"
|
||||
desc = "<u>A sinister spell used to convert:</u><br>Plasteel into runed metal<br>25 metal into a construct shell<br>Cyborgs directly into constructs<br>Cyborg shells into construct shells<br>Airlocks into runed airlocks (harm intent)"
|
||||
desc = "<u>A sinister spell used to convert:</u><br>Plasteel into runed metal<br>50 metal into a construct shell<br>Cyborgs directly into constructs<br>Cyborg shells into construct shells<br>Airlocks into runed airlocks (harm intent)"
|
||||
button_icon_state = "transmute"
|
||||
magic_path = "/obj/item/melee/blood_magic/construction"
|
||||
health_cost = 12
|
||||
@@ -549,7 +549,7 @@
|
||||
. = ..()
|
||||
|
||||
|
||||
//Construction: Creates a construct shell out of 50 metal sheets, or converts plasteel into runed metal
|
||||
//Construction: Converts 50 metal to a construct shell, plasteel to runed metal, airlock to brittle runed airlock, a borg to a construct, or borg shell to a construct shell
|
||||
/obj/item/melee/blood_magic/construction
|
||||
name = "Corrupting Aura"
|
||||
desc = "Corrupts metal and plasteel into more sinister forms."
|
||||
@@ -561,13 +561,14 @@
|
||||
var/turf/T = get_turf(target)
|
||||
if(istype(target, /obj/item/stack/sheet/metal))
|
||||
var/obj/item/stack/sheet/candidate = target
|
||||
if(candidate.use(50))
|
||||
if(candidate.use(METAL_TO_CONSTRUCT_SHELL_CONVERSION))
|
||||
uses--
|
||||
to_chat(user, "<span class='warning'>A dark cloud emanates from your hand and swirls around the metal, twisting it into a construct shell!</span>")
|
||||
new /obj/structure/constructshell(T)
|
||||
SEND_SOUND(user, sound('sound/effects/magic.ogg',0,1,25))
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You need 50 metal to produce a construct shell!</span>")
|
||||
to_chat(user, "<span class='warning'>You need [METAL_TO_CONSTRUCT_SHELL_CONVERSION] metal to produce a construct shell!</span>")
|
||||
return
|
||||
else if(istype(target, /obj/item/stack/sheet/plasteel))
|
||||
var/obj/item/stack/sheet/plasteel/candidate = target
|
||||
var/quantity = candidate.amount
|
||||
@@ -600,6 +601,7 @@
|
||||
qdel(candidate)
|
||||
else
|
||||
candidate.color = prev_color
|
||||
return
|
||||
else
|
||||
uses--
|
||||
to_chat(user, "<span class='warning'>A dark cloud emanates from you hand and swirls around [candidate] - twisting it into a construct shell!</span>")
|
||||
@@ -613,6 +615,8 @@
|
||||
uses--
|
||||
user.visible_message("<span class='warning'>Black ribbons suddenly emanate from [user]'s hand and cling to the airlock - twisting and corrupting it!</span>")
|
||||
SEND_SOUND(user, sound('sound/effects/magic.ogg',0,1,25))
|
||||
else
|
||||
return
|
||||
else
|
||||
to_chat(user, "<span class='warning'>The spell will not work on [target]!</span>")
|
||||
return
|
||||
@@ -762,10 +766,10 @@
|
||||
return
|
||||
switch(choice)
|
||||
if("Blood Spear (150)")
|
||||
if(uses < 150)
|
||||
to_chat(user, "<span class='cultitalic'>You need 150 charges to perform this rite.</span>")
|
||||
if(uses < BLOOD_SPEAR_COST)
|
||||
to_chat(user, "<span class='cultitalic'>You need [BLOOD_SPEAR_COST] charges to perform this rite.</span>")
|
||||
else
|
||||
uses -= 150
|
||||
uses -= BLOOD_SPEAR_COST
|
||||
var/turf/T = get_turf(user)
|
||||
qdel(src)
|
||||
var/datum/action/innate/cult/spear/S = new(user)
|
||||
@@ -778,11 +782,11 @@
|
||||
user.visible_message("<span class='warning'>A [rite.name] appears at [user]'s feet!</span>", \
|
||||
"<span class='cultitalic'>A [rite.name] materializes at your feet.</span>")
|
||||
if("Blood Bolt Barrage (300)")
|
||||
if(uses < 300)
|
||||
to_chat(user, "<span class='cultitalic'>You need 300 charges to perform this rite.</span>")
|
||||
if(uses < BLOOD_BARRAGE_COST)
|
||||
to_chat(user, "<span class='cultitalic'>You need [BLOOD_BARRAGE_COST] charges to perform this rite.</span>")
|
||||
else
|
||||
var/obj/rite = new /obj/item/gun/ballistic/shotgun/boltaction/enchanted/arcane_barrage/blood()
|
||||
uses -= 300
|
||||
uses -= BLOOD_BARRAGE_COST
|
||||
qdel(src)
|
||||
if(user.put_in_hands(rite))
|
||||
to_chat(user, "<span class='cult'><b>Your hands glow with power!</b></span>")
|
||||
@@ -790,11 +794,11 @@
|
||||
to_chat(user, "<span class='cultitalic'>You need a free hand for this rite!</span>")
|
||||
qdel(rite)
|
||||
if("Blood Beam (500)")
|
||||
if(uses < 500)
|
||||
to_chat(user, "<span class='cultitalic'>You need 500 charges to perform this rite.</span>")
|
||||
if(uses < BLOOD_BEAM_COST)
|
||||
to_chat(user, "<span class='cultitalic'>You need [BLOOD_BEAM_COST] charges to perform this rite.</span>")
|
||||
else
|
||||
var/obj/rite = new /obj/item/blood_beam()
|
||||
uses -= 500
|
||||
uses -= BLOOD_BEAM_COST
|
||||
qdel(src)
|
||||
if(user.put_in_hands(rite))
|
||||
to_chat(user, "<span class='cultlarge'><b>Your hands glow with POWER OVERWHELMING!!!</b></span>")
|
||||
|
||||
@@ -1942,7 +1942,6 @@
|
||||
/obj/item/clothing/shoes/sneakers/black,
|
||||
/obj/item/clothing/gloves/color/white,
|
||||
/obj/item/clothing/mask/gas/mime,
|
||||
/obj/item/clothing/head/beret,
|
||||
/obj/item/clothing/head/frenchberet,
|
||||
/obj/item/clothing/suit/suspenders,
|
||||
/obj/item/reagent_containers/food/drinks/bottle/bottleofnothing,
|
||||
|
||||
@@ -273,12 +273,13 @@ GLOBAL_LIST_EMPTY(external_rsc_urls)
|
||||
connection_timeofday = world.timeofday
|
||||
winset(src, null, "command=\".configure graphics-hwmode on\"")
|
||||
var/cev = CONFIG_GET(number/client_error_version)
|
||||
var/ceb = CONFIG_GET(number/client_error_build)
|
||||
var/cwv = CONFIG_GET(number/client_warn_version)
|
||||
if (byond_version < cev) //Out of date client.
|
||||
if (byond_version < cev || byond_build < ceb) //Out of date client.
|
||||
to_chat(src, "<span class='danger'><b>Your version of BYOND is too old:</b></span>")
|
||||
to_chat(src, CONFIG_GET(string/client_error_message))
|
||||
to_chat(src, "Your version: [byond_version]")
|
||||
to_chat(src, "Required version: [cev] or later")
|
||||
to_chat(src, "Your version: [byond_version].[byond_build]")
|
||||
to_chat(src, "Required version: [cev].[ceb] or later")
|
||||
to_chat(src, "Visit <a href=\"https://secure.byond.com/download\">BYOND's website</a> to get the latest version of BYOND.")
|
||||
if (connecting_admin)
|
||||
to_chat(src, "Because you are an admin, you are being allowed to walk past this limitation, But it is still STRONGLY suggested you upgrade")
|
||||
@@ -697,8 +698,14 @@ GLOBAL_LIST_EMPTY(external_rsc_urls)
|
||||
/client/Click(atom/object, atom/location, control, params)
|
||||
var/ab = FALSE
|
||||
var/list/L = params2list(params)
|
||||
|
||||
var/dragged = L["drag"]
|
||||
if(dragged && !L[dragged])
|
||||
return
|
||||
|
||||
if (object && object == middragatom && L["left"])
|
||||
ab = max(0, 5 SECONDS-(world.time-middragtime)*0.1)
|
||||
|
||||
var/mcl = CONFIG_GET(number/minute_click_limit)
|
||||
if (!holder && mcl)
|
||||
var/minute = round(world.time, 600)
|
||||
@@ -718,7 +725,6 @@ GLOBAL_LIST_EMPTY(external_rsc_urls)
|
||||
log_game("[key_name(src)] is using the middle click aimbot exploit")
|
||||
message_admins("[ADMIN_LOOKUPFLW(src)] [ADMIN_KICK(usr)] is using the middle click aimbot exploit</span>")
|
||||
add_system_note("aimbot", "Is using the middle click aimbot exploit")
|
||||
|
||||
log_game("[key_name(src)] Has hit the per-minute click limit of [mcl] clicks in a given game minute")
|
||||
message_admins("[ADMIN_LOOKUPFLW(src)] [ADMIN_KICK(usr)] Has hit the per-minute click limit of [mcl] clicks in a given game minute")
|
||||
to_chat(src, "<span class='danger'>[msg]</span>")
|
||||
|
||||
@@ -14,19 +14,27 @@
|
||||
|
||||
dog_fashion = /datum/dog_fashion/head
|
||||
|
||||
/obj/item/clothing/head/hardhat/attack_self(mob/user)
|
||||
on = !on
|
||||
icon_state = "hardhat[on]_[item_color]"
|
||||
item_state = "hardhat[on]_[item_color]"
|
||||
user.update_inv_head() //so our mob-overlays update
|
||||
/obj/item/clothing/head/hardhat/attack_self(mob/living/user)
|
||||
toggle_helmet_light(user)
|
||||
|
||||
/obj/item/clothing/head/hardhat/proc/toggle_helmet_light(mob/living/user)
|
||||
on = !on
|
||||
if(on)
|
||||
turn_on(user)
|
||||
else
|
||||
turn_off(user)
|
||||
update_icon()
|
||||
|
||||
/obj/item/clothing/head/hardhat/update_icon()
|
||||
icon_state = "hardhat[on]_[item_color]"
|
||||
item_state = "hardhat[on]_[item_color]"
|
||||
if(ishuman(loc))
|
||||
var/mob/living/carbon/human/H = loc
|
||||
H.update_inv_head()
|
||||
for(var/X in actions)
|
||||
var/datum/action/A = X
|
||||
A.UpdateButtonIcon()
|
||||
A.UpdateButtonIcon(force = TRUE)
|
||||
..()
|
||||
|
||||
/obj/item/clothing/head/hardhat/proc/turn_on(mob/user)
|
||||
set_light(brightness_on)
|
||||
@@ -81,4 +89,69 @@
|
||||
heat_protection = HEAD
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
|
||||
cold_protection = HEAD
|
||||
min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT
|
||||
min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT
|
||||
|
||||
/obj/item/clothing/head/hardhat/weldhat
|
||||
name = "welding hard hat"
|
||||
desc = "A piece of headgear used in dangerous working conditions to protect the head. Comes with a built-in flashlight AND welding shield! The bulb seems a little smaller though."
|
||||
brightness_on = 3 //Needs a little bit of tradeoff
|
||||
dog_fashion = null
|
||||
actions_types = list(/datum/action/item_action/toggle_helmet_light, /datum/action/item_action/toggle_welding_screen)
|
||||
flash_protect = 2
|
||||
tint = 2
|
||||
flags_inv = HIDEEYES | HIDEFACE
|
||||
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
|
||||
visor_vars_to_toggle = VISOR_FLASHPROTECT | VISOR_TINT
|
||||
visor_flags_inv = HIDEEYES | HIDEFACE
|
||||
visor_flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
|
||||
|
||||
/obj/item/clothing/head/hardhat/weldhat/Initialize()
|
||||
. = ..()
|
||||
update_icon()
|
||||
|
||||
/obj/item/clothing/head/hardhat/weldhat/attack_self(mob/living/user)
|
||||
toggle_helmet_light(user)
|
||||
|
||||
/obj/item/clothing/head/hardhat/weldhat/AltClick(mob/user)
|
||||
if(user.canUseTopic(src, BE_CLOSE))
|
||||
toggle_welding_screen(user)
|
||||
|
||||
/obj/item/clothing/head/hardhat/weldhat/proc/toggle_welding_screen(mob/living/user)
|
||||
if(weldingvisortoggle(user))
|
||||
playsound(src, 'sound/mecha/mechmove03.ogg', 50, 1) //Visors don't just come from nothing
|
||||
update_icon()
|
||||
|
||||
/obj/item/clothing/head/hardhat/weldhat/worn_overlays(isinhands)
|
||||
. = ..()
|
||||
if(!isinhands)
|
||||
. += mutable_appearance('icons/mob/head.dmi', "weldhelmet")
|
||||
if(!up)
|
||||
. += mutable_appearance('icons/mob/head.dmi', "weldvisor")
|
||||
|
||||
/obj/item/clothing/head/hardhat/weldhat/update_icon()
|
||||
cut_overlays()
|
||||
if(!up)
|
||||
add_overlay("weldvisor")
|
||||
..()
|
||||
|
||||
/obj/item/clothing/head/hardhat/weldhat/orange
|
||||
icon_state = "hardhat0_orange"
|
||||
item_state = "hardhat0_orange"
|
||||
item_color = "orange"
|
||||
|
||||
/obj/item/clothing/head/hardhat/weldhat/white
|
||||
desc = "A piece of headgear used in dangerous working conditions to protect the head. Comes with a built-in flashlight AND welding shield!" //This bulb is not smaller
|
||||
icon_state = "hardhat0_white"
|
||||
item_state = "hardhat0_white"
|
||||
brightness_on = 4 //Boss always takes the best stuff
|
||||
item_color = "white"
|
||||
clothing_flags = STOPSPRESSUREDAMAGE
|
||||
heat_protection = HEAD
|
||||
max_heat_protection_temperature = FIRE_HELM_MAX_TEMP_PROTECT
|
||||
cold_protection = HEAD
|
||||
min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT
|
||||
|
||||
/obj/item/clothing/head/hardhat/weldhat/dblue
|
||||
icon_state = "hardhat0_dblue"
|
||||
item_state = "hardhat0_dblue"
|
||||
item_color = "dblue"
|
||||
@@ -145,6 +145,21 @@
|
||||
strip_delay = 60
|
||||
dog_fashion = /datum/dog_fashion/head/warden
|
||||
|
||||
/obj/item/clothing/head/warden/drill
|
||||
name = "warden's drill hat"
|
||||
desc = "A special armored campaign hat with the security insignia emblazoned on it. Uses reinforced fabric to offer sufficient protection. Has the letters 'FMJ' enscribed on its side."
|
||||
icon_state = "wardendrill"
|
||||
item_state = "wardendrill"
|
||||
dog_fashion = null
|
||||
|
||||
/obj/item/clothing/head/warden/drill/equipped(mob/living/carbon/human/user, slot)
|
||||
..()
|
||||
if(slot == SLOT_HEAD)
|
||||
user.dna.add_mutation(YELLING)
|
||||
|
||||
/obj/item/clothing/head/warden/drill/dropped(mob/living/carbon/human/user)
|
||||
user.dna.remove_mutation(YELLING)
|
||||
|
||||
/obj/item/clothing/head/beret/sec
|
||||
name = "security beret"
|
||||
desc = "A robust beret with the security insignia emblazoned on it. Uses reinforced fabric to offer sufficient protection."
|
||||
|
||||
@@ -347,7 +347,7 @@
|
||||
/obj/item/clothing/head/frenchberet
|
||||
name = "french beret"
|
||||
desc = "A quality beret, infused with the aroma of chain-smoking, wine-swilling Parisians. You feel less inclined to engage military conflict, for some reason."
|
||||
icon_state = "beretblack"
|
||||
icon_state = "beret"
|
||||
dynamic_hair_suffix = ""
|
||||
|
||||
/obj/item/clothing/head/frenchberet/speechModification(M)
|
||||
|
||||
@@ -244,6 +244,7 @@
|
||||
if(paranoia)
|
||||
QDEL_NULL(paranoia)
|
||||
paranoia = new()
|
||||
paranoia.clonable = FALSE
|
||||
|
||||
user.gain_trauma(paranoia, TRAUMA_RESILIENCE_MAGIC)
|
||||
to_chat(user, "<span class='warning'>As you don the foiled hat, an entire world of conspiracy theories and seemingly insane ideas suddenly rush into your mind. What you once thought unbelievable suddenly seems.. undeniable. Everything is connected and nothing happens just by accident. You know too much and now they're out to get you. </span>")
|
||||
|
||||
@@ -288,4 +288,4 @@
|
||||
icon_state = "empoweredburger"
|
||||
list_reagents = list("nutriment" = 8, "liquidelectricity" = 5)
|
||||
tastes = list("bun" = 2, "pure electricity" = 4)
|
||||
foodtype = GRAIN | TOXIC
|
||||
foodtype = GRAIN | TOXIC
|
||||
|
||||
@@ -33,7 +33,6 @@
|
||||
suit = /obj/item/clothing/suit/suspenders
|
||||
backpack_contents = list(/obj/item/reagent_containers/food/drinks/bottle/bottleofnothing=1)
|
||||
|
||||
accessory = /obj/item/clothing/accessory/pocketprotector/cosmetology
|
||||
backpack = /obj/item/storage/backpack/mime
|
||||
satchel = /obj/item/storage/backpack/mime
|
||||
|
||||
|
||||
@@ -94,7 +94,7 @@
|
||||
if(get_dist(user, src) <= 1) //people with TK won't get smeared with blood
|
||||
user.add_mob_blood(src)
|
||||
if(ishuman(user))
|
||||
var/mob/living/carbon/human/dirtyboy
|
||||
var/mob/living/carbon/human/dirtyboy = user
|
||||
dirtyboy.adjust_hygiene(-10)
|
||||
if(affecting.body_zone == BODY_ZONE_HEAD)
|
||||
if(wear_mask)
|
||||
|
||||
@@ -7,9 +7,7 @@
|
||||
return TRUE
|
||||
if(istype(mover, /obj/item/projectile))
|
||||
var/obj/item/projectile/P = mover
|
||||
if(P.can_hit_target(src, P.permutated, src == P.original, TRUE))
|
||||
P.Bump(src)
|
||||
return TRUE
|
||||
return !P.can_hit_target(src, P.permutated, src == P.original, TRUE)
|
||||
if(mover.throwing)
|
||||
return (!density || !(mobility_flags & MOBILITY_STAND))
|
||||
if(buckled == mover)
|
||||
|
||||
@@ -179,10 +179,7 @@
|
||||
/obj/effect/decal/cleanable/vomit,
|
||||
/obj/effect/decal/cleanable/robot_debris,
|
||||
/obj/effect/decal/cleanable/molten_object,
|
||||
/obj/effect/decal/cleanable/food/tomato_smudge,
|
||||
/obj/effect/decal/cleanable/food/egg_smudge,
|
||||
/obj/effect/decal/cleanable/food/pie_smudge,
|
||||
/obj/effect/decal/cleanable/food/flour,
|
||||
/obj/effect/decal/cleanable/food,
|
||||
/obj/effect/decal/cleanable/ash,
|
||||
/obj/effect/decal/cleanable/greenglow,
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
|
||||
mob_size = MOB_SIZE_LARGE
|
||||
var/icon_aggro = null
|
||||
var/crusher_drop_mod = 5
|
||||
var/crusher_drop_mod = 25
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/Initialize(mapload)
|
||||
. = ..()
|
||||
@@ -58,7 +58,7 @@
|
||||
/mob/living/simple_animal/hostile/asteroid/death(gibbed)
|
||||
SSblackbox.record_feedback("tally", "mobs_killed_mining", 1, type)
|
||||
var/datum/status_effect/crusher_damage/C = has_status_effect(STATUS_EFFECT_CRUSHERDAMAGETRACKING)
|
||||
if(C && crusher_loot && prob((C.total_damage/maxHealth) * crusher_drop_mod)) //on average, you'll need to kill 20 creatures before getting the item
|
||||
if(C && crusher_loot && prob((C.total_damage/maxHealth) * crusher_drop_mod)) //on average, you'll need to kill 4 creatures before getting the item
|
||||
spawn_crusher_loot()
|
||||
..(gibbed)
|
||||
|
||||
|
||||
@@ -214,7 +214,7 @@
|
||||
|
||||
/obj/item/suppressor
|
||||
name = "suppressor"
|
||||
desc = "A nigh-universal syndicate small-arms suppressor for maximum espionage."
|
||||
desc = "A syndicate small-arms suppressor for maximum espionage."
|
||||
icon = 'icons/obj/guns/projectile.dmi'
|
||||
icon_state = "suppressor"
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
|
||||
@@ -565,7 +565,7 @@
|
||||
|
||||
/obj/item/projectile/beam/beam_rifle/hitscan/aiming_beam/prehit(atom/target)
|
||||
qdel(src)
|
||||
return BULLET_ACT_HIT
|
||||
return FALSE
|
||||
|
||||
/obj/item/projectile/beam/beam_rifle/hitscan/aiming_beam/on_hit()
|
||||
qdel(src)
|
||||
|
||||
@@ -230,13 +230,6 @@
|
||||
if(hitscan)
|
||||
store_hitscan_collision(pcache)
|
||||
return TRUE
|
||||
if(firer && !ignore_source_check)
|
||||
var/mob/checking = firer
|
||||
if((A == firer) || (((A in firer.buckled_mobs) || (istype(checking) && (A == checking.buckled))) && (A != original)) || (A == firer.loc && ismecha(A))) //cannot shoot yourself or your mech
|
||||
trajectory_ignore_forcemove = TRUE
|
||||
forceMove(T)
|
||||
trajectory_ignore_forcemove = FALSE
|
||||
return FALSE
|
||||
|
||||
var/distance = get_dist(T, starting) // Get the distance between the turf shot from and the mob we hit and use that for the calculations.
|
||||
def_zone = ran_zone(def_zone, max(100-(7*distance), 5)) //Lower accurancy/longer range tradeoff. 7 is a balanced number to use.
|
||||
@@ -529,6 +522,10 @@
|
||||
/obj/item/projectile/proc/can_hit_target(atom/target, list/passthrough, direct_target = FALSE, ignore_loc = FALSE)
|
||||
if(QDELETED(target))
|
||||
return FALSE
|
||||
if(!ignore_source_check && firer)
|
||||
var/mob/M = firer
|
||||
if((target == firer) || ((target == firer.loc) && ismecha(firer.loc)) || (target in firer.buckled_mobs) || (istype(M) && (M.buckled == target)))
|
||||
return FALSE
|
||||
if(!ignore_loc && (loc != target.loc))
|
||||
return FALSE
|
||||
if(target in passthrough)
|
||||
|
||||
@@ -128,7 +128,6 @@
|
||||
return
|
||||
replace_beaker(user, B)
|
||||
to_chat(user, "<span class='notice'>You add [B] to [src].</span>")
|
||||
updateUsrDialog()
|
||||
update_icon()
|
||||
return TRUE //no afterattack
|
||||
|
||||
|
||||
@@ -1169,6 +1169,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
|
||||
|
||||
/datum/reagent/consumable/ethanol/silencer/on_mob_life(mob/living/carbon/M)
|
||||
if(ishuman(M) && M.job == "Mime")
|
||||
M.silent = max(M.silent, MIMEDRINK_SILENCE_DURATION)
|
||||
M.heal_bodypart_damage(1,1)
|
||||
. = 1
|
||||
return ..() || .
|
||||
@@ -1855,6 +1856,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
|
||||
|
||||
/datum/reagent/consumable/ethanol/blank_paper/on_mob_life(mob/living/carbon/M)
|
||||
if(ishuman(M) && M.job == "Mime")
|
||||
M.silent = max(M.silent, MIMEDRINK_SILENCE_DURATION)
|
||||
M.heal_bodypart_damage(1,1)
|
||||
. = 1
|
||||
return ..()
|
||||
|
||||
@@ -154,6 +154,7 @@
|
||||
|
||||
/datum/reagent/consumable/nothing/on_mob_life(mob/living/carbon/M)
|
||||
if(ishuman(M) && M.job == "Mime")
|
||||
M.silent = max(M.silent, MIMEDRINK_SILENCE_DURATION)
|
||||
M.heal_bodypart_damage(1,1, 0)
|
||||
. = 1
|
||||
..()
|
||||
|
||||
@@ -52,12 +52,11 @@
|
||||
var/smoke_message = pick("You feel relaxed.", "You feel calmed.","You feel alert.","You feel rugged.")
|
||||
to_chat(M, "<span class='notice'>[smoke_message]</span>")
|
||||
SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "smoked", /datum/mood_event/smoked, name)
|
||||
M.AdjustStun(-20, FALSE)
|
||||
M.AdjustKnockdown(-20, FALSE)
|
||||
M.AdjustUnconscious(-20, FALSE)
|
||||
M.AdjustParalyzed(-20, FALSE)
|
||||
M.AdjustImmobilized(-20, FALSE)
|
||||
M.adjustStaminaLoss(-0.5*REM, 0)
|
||||
M.AdjustStun(-5, FALSE)
|
||||
M.AdjustKnockdown(-5, FALSE)
|
||||
M.AdjustUnconscious(-5, FALSE)
|
||||
M.AdjustParalyzed(-5, FALSE)
|
||||
M.AdjustImmobilized(-5, FALSE)
|
||||
..()
|
||||
. = 1
|
||||
|
||||
|
||||
@@ -914,7 +914,6 @@
|
||||
toxpwr = 0
|
||||
taste_description = "bone hurting"
|
||||
overdose_threshold = 50
|
||||
metabolization_rate = 2
|
||||
|
||||
/datum/reagent/toxin/bonehurtingjuice/on_mob_add(mob/living/carbon/M)
|
||||
M.say("oof ouch my bones", forced = "bonehurtingjuice")
|
||||
|
||||
@@ -265,8 +265,8 @@
|
||||
departmental_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_SCIENCE
|
||||
|
||||
/datum/design/suppressor
|
||||
name = "Universal Suppressor"
|
||||
desc = "A reverse-engineered universal suppressor that fits on most small arms with threaded barrels."
|
||||
name = "Suppressor"
|
||||
desc = "A reverse-engineered suppressor that fits on most small arms with threaded barrels."
|
||||
id = "suppressor"
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 2000, MAT_SILVER = 500)
|
||||
|
||||
@@ -131,7 +131,7 @@ Slimecrossing Armor
|
||||
desc = "A full suit of adamantine plate armor. Impressively resistant to damage, but weighs about as much as you do."
|
||||
icon_state = "adamsuit"
|
||||
item_state = "adamsuit"
|
||||
flags_inv = list()
|
||||
flags_inv = NONE
|
||||
obj_flags = IMMUTABLE_SLOW
|
||||
slowdown = 4
|
||||
var/hit_reflect_chance = 40
|
||||
|
||||
@@ -547,10 +547,15 @@
|
||||
if(can_interact(usr))
|
||||
return ..()
|
||||
|
||||
/obj/item/storage/pod/AltClick(mob/user)
|
||||
if(!can_interact(user))
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/item/storage/pod/can_interact(mob/user)
|
||||
if(!..())
|
||||
return FALSE
|
||||
if(GLOB.security_level == SEC_LEVEL_RED || GLOB.security_level == SEC_LEVEL_DELTA || unlocked)
|
||||
if(GLOB.security_level >= SEC_LEVEL_RED || unlocked)
|
||||
return TRUE
|
||||
to_chat(user, "The storage unit will only unlock during a Red or Delta security alert.")
|
||||
|
||||
|
||||
@@ -581,9 +581,8 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
|
||||
exclude_modes = list(/datum/game_mode/nuclear)
|
||||
|
||||
/datum/uplink_item/stealthy_weapons/suppressor
|
||||
name = "Universal Suppressor"
|
||||
desc = "Fitted for use on any small caliber weapon with a threaded barrel, this suppressor will silence the \
|
||||
shots of the weapon for increased stealth and superior ambushing capability."
|
||||
name = "Suppressor"
|
||||
desc = "This suppressor will silence the shots of the weapon it is attached to for increased stealth and superior ambushing capability. It is compatible with many small ballistic guns including the Stechkin and C-20r, but not revolvers or energy guns."
|
||||
item = /obj/item/suppressor
|
||||
cost = 3
|
||||
surplus = 10
|
||||
|
||||
@@ -43,7 +43,9 @@
|
||||
addtimer(VARSET_CALLBACK(src, canmove , TRUE), 20)
|
||||
return FALSE
|
||||
var/datum/component/riding/D = GetComponent(/datum/component/riding)
|
||||
D.vehicle_move_delay = 10/H.get_num_arms()
|
||||
//1.5 (movespeed as of this change) multiplied by 6.7 gets ABOUT 10 (rounded), the old constant for the wheelchair that gets divided by how many arms they have
|
||||
//if that made no sense this simply makes the wheelchair speed change along with movement speed delay
|
||||
D.vehicle_move_delay = round(CONFIG_GET(number/movedelay/run_delay) * 6.7) / min(H.get_num_arms(), 2)
|
||||
..()
|
||||
|
||||
/obj/vehicle/ridden/wheelchair/Moved()
|
||||
@@ -100,3 +102,10 @@
|
||||
if(isobserver(user) && CONFIG_GET(flag/ghost_interaction))
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/obj/vehicle/ridden/wheelchair/the_whip/driver_move(mob/living/user, direction)
|
||||
var/mob/living/carbon/human/H = user
|
||||
if(istype(H))
|
||||
var/datum/component/riding/D = GetComponent(/datum/component/riding)
|
||||
D.vehicle_move_delay = round(CONFIG_GET(number/movedelay/run_delay) * 6.7) / H.get_num_arms()
|
||||
..()
|
||||
|
||||
@@ -77,7 +77,8 @@
|
||||
/obj/item/clothing/under/rank/engineer/hazard = 3,
|
||||
/obj/item/clothing/suit/hazardvest = 3,
|
||||
/obj/item/clothing/shoes/workboots = 3,
|
||||
/obj/item/clothing/head/hardhat = 3)
|
||||
/obj/item/clothing/head/hardhat = 3,
|
||||
/obj/item/clothing/head/hardhat/weldhat = 3)
|
||||
refill_canister = /obj/item/vending_refill/wardrobe/engi_wardrobe
|
||||
payment_department = ACCOUNT_ENG
|
||||
/obj/item/vending_refill/wardrobe/engi_wardrobe
|
||||
|
||||
Reference in New Issue
Block a user