Merge branch 'master' into seperate-job-files

This commit is contained in:
Jack Edge
2019-02-01 08:37:19 +00:00
82 changed files with 1108 additions and 1630 deletions
+1
View File
@@ -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"
+4
View File
@@ -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"
+2
View File
@@ -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
+9 -1
View File
@@ -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"
+5
View File
@@ -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
+5
View File
@@ -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))
+7 -1
View File
@@ -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."
+3 -3
View File
@@ -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
+46 -1
View File
@@ -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
View File
@@ -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"
+2
View File
@@ -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 -1
View File
@@ -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>"
+13
View File
@@ -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)
+146
View File
@@ -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)
+1 -1
View File
@@ -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.
+1 -1
View File
@@ -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)
+7 -2
View File
@@ -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>")
+11 -5
View File
@@ -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)
+20 -3
View File
@@ -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)
+1 -1
View File
@@ -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)
+1 -1
View File
@@ -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()
+1
View File
@@ -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"
+14 -17
View File
@@ -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
+17 -13
View File
@@ -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>")
-1
View File
@@ -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,
+10 -4
View File
@@ -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>")
+80 -7
View File
@@ -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"
+15
View File
@@ -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."
+1 -1
View File
@@ -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
-1
View File
@@ -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)
+1 -3
View File
@@ -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)
+1 -1
View File
@@ -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)
+4 -7
View File
@@ -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
+6 -1
View File
@@ -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.")
+2 -3
View File
@@ -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
+10 -1
View File
@@ -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()
..()
+2 -1
View File
@@ -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