Merge branch 'master' of https://github.com/Citadel-Station-13/Citadel-Station-13 into Ghommie-cit28
This commit is contained in:
@@ -131,6 +131,16 @@
|
||||
#define COMSIG_MOB_ATTACK_RANGED "mob_attack_ranged" //from base of mob/RangedAttack(): (atom/A, params)
|
||||
#define COMSIG_MOB_THROW "mob_throw" //from base of /mob/throw_item(): (atom/target)
|
||||
#define COMSIG_MOB_UPDATE_SIGHT "mob_update_sight" //from base of /mob/update_sight(): ()
|
||||
#define COMSIG_MOB_SAY "mob_say" // from /mob/living/say(): (proc args list)
|
||||
#define COMPONENT_UPPERCASE_SPEECH 1
|
||||
// used to access COMSIG_MOB_SAY argslist
|
||||
#define SPEECH_MESSAGE 1
|
||||
// #define SPEECH_BUBBLE_TYPE 2
|
||||
#define SPEECH_SPANS 3
|
||||
/* #define SPEECH_SANITIZE 4
|
||||
#define SPEECH_LANGUAGE 5
|
||||
#define SPEECH_IGNORE_SPAM 6
|
||||
#define SPEECH_FORCED 7 */
|
||||
|
||||
// /mob/living signals
|
||||
#define COMSIG_LIVING_RESIST "living_resist" //from base of mob/living/resist() (/mob/living)
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
#define ENABLE_BITFIELD(variable, flag) (variable |= (flag))
|
||||
#define DISABLE_BITFIELD(variable, flag) (variable &= ~(flag))
|
||||
#define CHECK_BITFIELD(variable, flag) (variable & flag)
|
||||
#define TOGGLE_BITFIELD(variable, flag) (variable ^= (flag))
|
||||
|
||||
GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768))
|
||||
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
#define INVESTIGATE_EXONET "exonet"
|
||||
#define INVESTIGATE_NANITES "nanites"
|
||||
#define INVESTIGATE_CIRCUIT "circuit"
|
||||
#define INVESTIGATE_RCD "rcd"
|
||||
|
||||
// Logging types for log_message()
|
||||
#define LOG_ATTACK (1 << 0)
|
||||
|
||||
@@ -382,6 +382,7 @@ GLOBAL_LIST_INIT(pda_reskins, list(PDA_SKIN_CLASSIC = 'icons/obj/pda.dmi', PDA_S
|
||||
#define CLOCK_SILICONS 22
|
||||
#define CLOCK_PROSELYTIZATION 23
|
||||
#define SHUTTLE_HIJACK 24
|
||||
#define GANG_VICTORY 25
|
||||
|
||||
#define FIELD_TURF 1
|
||||
#define FIELD_EDGE 2
|
||||
@@ -489,4 +490,7 @@ GLOBAL_LIST_INIT(pda_reskins, list(PDA_SKIN_CLASSIC = 'icons/obj/pda.dmi', PDA_S
|
||||
#define AREASELECT_CORNERA "corner A"
|
||||
#define AREASELECT_CORNERB "corner B"
|
||||
|
||||
#define PREF_SAVELOAD_COOLDOWN 5
|
||||
#define PREF_SAVELOAD_COOLDOWN 5
|
||||
|
||||
#define VOMIT_TOXIC 1
|
||||
#define VOMIT_PURPLE 2
|
||||
@@ -20,12 +20,12 @@
|
||||
#define FORCE_STRING_OVERRIDE (1<<2) // used for tooltips
|
||||
#define NEEDS_PERMIT (1<<3) //Used by security bots to determine if this item is safe for public use.
|
||||
#define SLOWS_WHILE_IN_HAND (1<<4)
|
||||
#define NO_MAT_REDEMPTION (1<<5) // Stops you from putting things like an RCD or other items into an ORM or protolathe for materials.
|
||||
#define DROPDEL (1<<6) // When dropped, it calls qdel on itself
|
||||
#define NO_MAT_REDEMPTION (1<<5) // Stops you from putting things like an RCD or other items into an ORM or protolathe for materials.
|
||||
#define DROPDEL (1<<6) // When dropped, it calls qdel on itself
|
||||
#define NOBLUDGEON (1<<7) // when an item has this it produces no "X has been hit by Y with Z" message in the default attackby()
|
||||
#define NODROP (1<<8) // This flag makes it so that an item literally cannot be removed at all, or at least that's how it should be. Only deleted.
|
||||
#define ABSTRACT (1<<9) // for all things that are technically items but used for various different stuff
|
||||
#define IMMUTABLE_SLOW (1<<10) //When players should not be able to change the slowdown of the item (Speed potions, ect)
|
||||
#define ABSTRACT (1<<8) // for all things that are technically items but used for various different stuff
|
||||
#define IMMUTABLE_SLOW (1<<9) //When players should not be able to change the slowdown of the item (Speed potions, ect)
|
||||
#define SURGICAL_TOOL (1<<10) //Tool commonly used for surgery: won't attack targets in an active surgical operation on help intent (in case of mistakes)
|
||||
|
||||
// Flags for the clothing_flags var on /obj/item/clothing
|
||||
|
||||
@@ -35,3 +35,5 @@
|
||||
#define MASKINTERNALS (1<<3) // mask allows internals
|
||||
#define NOSLIP (1<<4) //prevents from slipping on wet floors, in space etc
|
||||
#define THICKMATERIAL (1<<5) //prevents syringes, parapens and hypos if the external suit or helmet (if targeting head) has this flag. Example: space suits, biosuit, bombsuits, thick suits that cover your body.
|
||||
#define VOICEBOX_TOGGLABLE (1<<6) // The voicebox in this clothing can be toggled.
|
||||
#define VOICEBOX_DISABLED (1<<7) // The voicebox is currently turned off.
|
||||
@@ -81,7 +81,7 @@
|
||||
#define INIT_ORDER_STICKY_BAN -10
|
||||
#define INIT_ORDER_LIGHTING -20
|
||||
#define INIT_ORDER_SHUTTLE -21
|
||||
#define INIT_ORDER_SQUEAK -40
|
||||
#define INIT_ORDER_MINOR_MAPPING -40
|
||||
#define INIT_ORDER_PATH -50
|
||||
#define INIT_ORDER_PERSISTENCE -100
|
||||
|
||||
|
||||
@@ -112,12 +112,17 @@
|
||||
#define TRAIT_PARALYSIS_R_ARM "para-r-arm"
|
||||
#define TRAIT_PARALYSIS_L_LEG "para-l-leg"
|
||||
#define TRAIT_PARALYSIS_R_LEG "para-r-leg"
|
||||
#define TRAIT_UNINTELLIGIBLE_SPEECH "unintelligible-speech"
|
||||
#define TRAIT_LAW_ENFORCEMENT_METABOLISM "law-enforcement-metabolism"
|
||||
#define TRAIT_STRONG_GRABBER "strong_grabber"
|
||||
#define TRAIT_CALCIUM_HEALER "calcium_healer"
|
||||
|
||||
//non-mob traits
|
||||
#define TRAIT_PARALYSIS "paralysis" //Used for limb-based paralysis, where replacing the limb will fix it
|
||||
|
||||
// item traits
|
||||
#define TRAIT_NODROP "nodrop"
|
||||
|
||||
#define TRAIT_ALCOHOL_TOLERANCE "alcohol_tolerance"
|
||||
#define TRAIT_AGEUSIA "ageusia"
|
||||
#define TRAIT_HEAVY_SLEEPER "heavy_sleeper"
|
||||
@@ -153,6 +158,13 @@
|
||||
#define TRAUMA_TRAIT "trauma"
|
||||
#define SPECIES_TRAIT "species"
|
||||
#define ORGAN_TRAIT "organ"
|
||||
#define JOB_TRAIT "job"
|
||||
#define CYBORG_ITEM_TRAIT "cyborg-item"
|
||||
#define ADMIN_TRAIT "admin" // (B)admins only.
|
||||
#define CHANGELING_TRAIT "changeling"
|
||||
#define CULT_TRAIT "cult"
|
||||
#define CURSED_ITEM_TRAIT "cursed-item" // The item is magically cursed
|
||||
#define ABSTRACT_ITEM_TRAIT "abstract-item"
|
||||
#define ROUNDSTART_TRAIT "roundstart" //cannot be removed without admin intervention
|
||||
|
||||
// unique trait sources, still defines
|
||||
@@ -165,3 +177,24 @@
|
||||
#define STASIS_MUTE "stasis"
|
||||
#define GENETICS_SPELL "genetics_spell"
|
||||
#define EYES_COVERED "eyes_covered"
|
||||
#define CULT_TRAIT "cult"
|
||||
#define CLOWN_NUKE_TRAIT "clown-nuke"
|
||||
#define STICKY_MOUSTACHE_TRAIT "sticky-moustache"
|
||||
#define CHAINSAW_FRENZY_TRAIT "chainsaw-frenzy"
|
||||
#define CHRONO_GUN_TRAIT "chrono-gun"
|
||||
#define REVERSE_BEAR_TRAP_TRAIT "reverse-bear-trap"
|
||||
#define GLUED_ITEM_TRAIT "glued-item"
|
||||
#define CURSED_MASK_TRAIT "cursed-mask"
|
||||
#define HIS_GRACE_TRAIT "his-grace"
|
||||
#define HAND_REPLACEMENT_TRAIT "magic-hand"
|
||||
#define HOT_POTATO_TRAIT "hot-potato"
|
||||
#define SABRE_SUICIDE_TRAIT "sabre-suicide"
|
||||
#define ABDUCTOR_VEST_TRAIT "abductor-vest"
|
||||
#define CAPTURE_THE_FLAG_TRAIT "capture-the-flag"
|
||||
#define EYE_OF_GOD_TRAIT "eye-of-god"
|
||||
#define SHAMEBRERO_TRAIT "shamebrero"
|
||||
#define CHRONOSUIT_TRAIT "chronosuit"
|
||||
#define FLIGHTSUIT_TRAIT "flightsuit"
|
||||
#define LOCKED_HELMET_TRAIT "locked-helmet"
|
||||
#define NINJA_SUIT_TRAIT "ninja-suit"
|
||||
#define ANTI_DROP_IMPLANT_TRAIT "anti-drop-implant"
|
||||
@@ -8,11 +8,11 @@
|
||||
//facial hair
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/facial_hair, GLOB.facial_hair_styles_list, GLOB.facial_hair_styles_male_list, GLOB.facial_hair_styles_female_list)
|
||||
//underwear
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/underwear, GLOB.underwear_list, GLOB.underwear_m, GLOB.underwear_f)
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/underwear/bottom, GLOB.underwear_list, GLOB.underwear_m, GLOB.underwear_f)
|
||||
//undershirt
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/undershirt, GLOB.undershirt_list, GLOB.undershirt_m, GLOB.undershirt_f)
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/underwear/top, GLOB.undershirt_list, GLOB.undershirt_m, GLOB.undershirt_f)
|
||||
//socks
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/socks, GLOB.socks_list)
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/underwear/socks, GLOB.socks_list)
|
||||
//bodypart accessories (blizzard intensifies)
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/body_markings, GLOB.body_markings_list)
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/lizard, GLOB.tails_list_lizard)
|
||||
|
||||
+13
-14
@@ -20,35 +20,34 @@
|
||||
else
|
||||
return "000"
|
||||
|
||||
/proc/random_underwear(gender)//Cit change - makes random underwear always return nude
|
||||
#define UNDIE_COLORABLE(U) (U?.has_color)
|
||||
|
||||
/proc/random_underwear(gender)
|
||||
if(!GLOB.underwear_list.len)
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/underwear, GLOB.underwear_list, GLOB.underwear_m, GLOB.underwear_f)
|
||||
return "Nude"
|
||||
/*switch(gender)
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/underwear/bottom, GLOB.underwear_list, GLOB.underwear_m, GLOB.underwear_f)
|
||||
switch(gender)
|
||||
if(MALE)
|
||||
return pick(GLOB.underwear_m)
|
||||
if(FEMALE)
|
||||
return pick(GLOB.underwear_f)
|
||||
else
|
||||
return pick(GLOB.underwear_list)*/
|
||||
return pick(GLOB.underwear_list)
|
||||
|
||||
/proc/random_undershirt(gender)//Cit change - makes random undershirts always return nude
|
||||
/proc/random_undershirt(gender)
|
||||
if(!GLOB.undershirt_list.len)
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/undershirt, GLOB.undershirt_list, GLOB.undershirt_m, GLOB.undershirt_f)
|
||||
return "Nude"
|
||||
/*switch(gender)
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/underwear/top, GLOB.undershirt_list, GLOB.undershirt_m, GLOB.undershirt_f)
|
||||
switch(gender)
|
||||
if(MALE)
|
||||
return pick(GLOB.undershirt_m)
|
||||
if(FEMALE)
|
||||
return pick(GLOB.undershirt_f)
|
||||
else
|
||||
return pick(GLOB.undershirt_list)*/
|
||||
return pick(GLOB.undershirt_list)
|
||||
|
||||
/proc/random_socks()//Cit change - makes random socks always return nude
|
||||
/proc/random_socks()
|
||||
if(!GLOB.socks_list.len)
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/socks, GLOB.socks_list)
|
||||
return "Nude"
|
||||
//return pick(GLOB.socks_list)
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/underwear/socks, GLOB.socks_list)
|
||||
return pick(GLOB.socks_list)
|
||||
|
||||
/proc/random_features()
|
||||
if(!GLOB.tails_list_human.len)
|
||||
|
||||
@@ -151,6 +151,10 @@ GLOBAL_VAR(command_name)
|
||||
GLOBAL_VAR(syndicate_code_phrase) //Code phrase for traitors.
|
||||
GLOBAL_VAR(syndicate_code_response) //Code response for traitors.
|
||||
|
||||
//Cached regex search - for checking if codewords are used.
|
||||
GLOBAL_DATUM(syndicate_code_phrase_regex, /regex)
|
||||
GLOBAL_DATUM(syndicate_code_response_regex, /regex)
|
||||
|
||||
/*
|
||||
Should be expanded.
|
||||
How this works:
|
||||
|
||||
@@ -767,3 +767,27 @@ GLOBAL_LIST_INIT(binary, list("0","1"))
|
||||
return "twelfth"
|
||||
else
|
||||
return "[number]\th"
|
||||
|
||||
/proc/unintelligize(message)
|
||||
var/prefix=copytext(message,1,2)
|
||||
if(prefix == ";")
|
||||
message = copytext(message,2)
|
||||
else if(prefix in list(":","#"))
|
||||
prefix += copytext(message,2,3)
|
||||
message = copytext(message,3)
|
||||
else
|
||||
prefix=""
|
||||
|
||||
var/list/words = splittext(message," ")
|
||||
var/list/rearranged = list()
|
||||
for(var/i=1;i<=words.len;i++)
|
||||
var/cword = pick(words)
|
||||
words.Remove(cword)
|
||||
var/suffix = copytext(cword,length(cword)-1,length(cword))
|
||||
while(length(cword)>0 && suffix in list(".",",",";","!",":","?"))
|
||||
cword = copytext(cword,1 ,length(cword)-1)
|
||||
suffix = copytext(cword,length(cword)-1,length(cword) )
|
||||
if(length(cword))
|
||||
rearranged += cword
|
||||
message = "[prefix][jointext(rearranged," ")]"
|
||||
. = message
|
||||
|
||||
@@ -1239,19 +1239,21 @@ GLOBAL_REAL_VAR(list/stack_trace_storage)
|
||||
pixel_x = initialpixelx
|
||||
pixel_y = initialpixely
|
||||
|
||||
/atom/proc/do_jiggle(targetangle = 45)
|
||||
/atom/proc/do_jiggle(targetangle = 45, timer = 20)
|
||||
var/matrix/OM = matrix(transform)
|
||||
var/matrix/M = matrix(transform)
|
||||
var/halftime = timer * 0.5
|
||||
M.Turn(pick(-targetangle, targetangle))
|
||||
animate(src, transform = M, time = 10, easing = ELASTIC_EASING)
|
||||
animate(src, transform = OM, time = 10, easing = ELASTIC_EASING)
|
||||
animate(src, transform = M, time = halftime, easing = ELASTIC_EASING)
|
||||
animate(src, transform = OM, time = halftime, easing = ELASTIC_EASING)
|
||||
|
||||
/atom/proc/do_squish(squishx = 1.2, squishy = 0.6)
|
||||
/atom/proc/do_squish(squishx = 1.2, squishy = 0.6, timer = 20)
|
||||
var/matrix/OM = matrix(transform)
|
||||
var/matrix/M = matrix(transform)
|
||||
var/halftime = timer * 0.5
|
||||
M.Scale(squishx, squishy)
|
||||
animate(src, transform = M, time = 10, easing = BOUNCE_EASING)
|
||||
animate(src, transform = OM, time = 10, easing = BOUNCE_EASING)
|
||||
animate(src, transform = M, time = halftime, easing = BOUNCE_EASING)
|
||||
animate(src, transform = OM, time = halftime, easing = BOUNCE_EASING)
|
||||
|
||||
/proc/weightclass2text(var/w_class)
|
||||
switch(w_class)
|
||||
@@ -1483,7 +1485,9 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new)
|
||||
/obj/item/reagent_containers/food/snacks/grown,
|
||||
/obj/item/reagent_containers/food/snacks/grown/mushroom,
|
||||
/obj/item/reagent_containers/food/snacks/grown/nettle, // base type
|
||||
/obj/item/reagent_containers/food/snacks/deepfryholder
|
||||
/obj/item/reagent_containers/food/snacks/deepfryholder,
|
||||
/obj/item/reagent_containers/food/snacks/grown/shell,
|
||||
/obj/item/reagent_containers/food/snacks/store/bread
|
||||
)
|
||||
blocked |= typesof(/obj/item/reagent_containers/food/snacks/customizable)
|
||||
|
||||
|
||||
@@ -47,7 +47,6 @@ GLOBAL_LIST_INIT(bitfields, list(
|
||||
"NO_MAT_REDEMPTION" = NO_MAT_REDEMPTION,
|
||||
"DROPDEL" = DROPDEL,
|
||||
"NOBLUDGEON" = NOBLUDGEON,
|
||||
"NODROP" = NODROP,
|
||||
"ABSTRACT" = ABSTRACT,
|
||||
),
|
||||
"admin_flags" = list(
|
||||
@@ -140,6 +139,8 @@ GLOBAL_LIST_INIT(bitfields, list(
|
||||
"MASKINTERNALS" = MASKINTERNALS,
|
||||
"NOSLIP" = NOSLIP,
|
||||
"THICKMATERIAL" = THICKMATERIAL,
|
||||
"VOICEBOX_TOGGLABLE" = VOICEBOX_TOGGLABLE,
|
||||
"VOICEBOX_DISABLED" = VOICEBOX_DISABLED,
|
||||
),
|
||||
"tesla_flags" = list(
|
||||
"TESLA_MOB_DAMAGE" = TESLA_MOB_DAMAGE,
|
||||
@@ -171,4 +172,9 @@ GLOBAL_LIST_INIT(bitfields, list(
|
||||
"RAD_PROTECT_CONTENTS" = RAD_PROTECT_CONTENTS,
|
||||
"RAD_NO_CONTAMINATE" = RAD_NO_CONTAMINATE,
|
||||
),
|
||||
))
|
||||
"disease_flags" = list(
|
||||
"CURABLE" = CURABLE,
|
||||
"CAN_CARRY" = CAN_CARRY,
|
||||
"CAN_RESIST" = CAN_RESIST
|
||||
),
|
||||
))
|
||||
@@ -7,15 +7,15 @@ GLOBAL_LIST_EMPTY(facial_hair_styles_list) //stores /datum/sprite_accessory/faci
|
||||
GLOBAL_LIST_EMPTY(facial_hair_styles_male_list) //stores only hair names
|
||||
GLOBAL_LIST_EMPTY(facial_hair_styles_female_list) //stores only hair names
|
||||
//Underwear
|
||||
GLOBAL_LIST_EMPTY(underwear_list) //stores /datum/sprite_accessory/underwear indexed by name
|
||||
GLOBAL_LIST_EMPTY(underwear_list) //stores /datum/sprite_accessory/underwear/bottom indexed by name
|
||||
GLOBAL_LIST_EMPTY(underwear_m) //stores only underwear name
|
||||
GLOBAL_LIST_EMPTY(underwear_f) //stores only underwear name
|
||||
//Undershirts
|
||||
GLOBAL_LIST_EMPTY(undershirt_list) //stores /datum/sprite_accessory/undershirt indexed by name
|
||||
GLOBAL_LIST_EMPTY(undershirt_list) //stores /datum/sprite_accessory/underwear/top indexed by name
|
||||
GLOBAL_LIST_EMPTY(undershirt_m) //stores only undershirt name
|
||||
GLOBAL_LIST_EMPTY(undershirt_f) //stores only undershirt name
|
||||
//Socks
|
||||
GLOBAL_LIST_EMPTY(socks_list) //stores /datum/sprite_accessory/socks indexed by name
|
||||
GLOBAL_LIST_EMPTY(socks_list) //stores /datum/sprite_accessory/underwear/socks indexed by name
|
||||
//Lizard Bits (all datum lists indexed by name)
|
||||
GLOBAL_LIST_EMPTY(body_markings_list)
|
||||
GLOBAL_LIST_EMPTY(tails_list_lizard)
|
||||
|
||||
@@ -43,7 +43,7 @@ GLOBAL_LIST_INIT(maintenance_loot, list(
|
||||
/obj/item/assembly/timer = 3,
|
||||
/obj/item/flashlight = 4,
|
||||
/obj/item/flashlight/pen = 1,
|
||||
/obj/item/flashlight/glowstick/random = 4,
|
||||
/obj/effect/spawner/lootdrop/glowstick = 4,
|
||||
/obj/effect/spawner/lootdrop/mre = 3,
|
||||
/obj/item/multitool = 2,
|
||||
/obj/item/radio/off = 2,
|
||||
@@ -69,7 +69,6 @@ GLOBAL_LIST_INIT(maintenance_loot, list(
|
||||
/obj/item/crowbar = 1,
|
||||
/obj/item/crowbar/red = 1,
|
||||
/obj/item/extinguisher = 11,
|
||||
//obj/item/gun/ballistic/revolver/russian = 1, //disabled until lootdrop is a proper world proc.
|
||||
/obj/item/hand_labeler = 1,
|
||||
/obj/item/paper/crumpled = 1,
|
||||
/obj/item/pen = 1,
|
||||
@@ -102,16 +101,18 @@ GLOBAL_LIST_INIT(maintenance_loot, list(
|
||||
/obj/item/assembly/signaler = 2,
|
||||
/obj/item/assembly/mousetrap = 2,
|
||||
/obj/item/reagent_containers/syringe = 2,
|
||||
/obj/item/clothing/gloves/color/random = 8,
|
||||
/obj/effect/spawner/lootdrop/gloves = 8,
|
||||
/obj/item/clothing/shoes/laceup = 1,
|
||||
/obj/item/storage/secure/briefcase = 3,
|
||||
/obj/item/storage/toolbox/artistic = 2,
|
||||
/obj/item/toy/eightball = 1,
|
||||
/obj/item/reagent_containers/pill/floorpill = 1,
|
||||
/obj/item/reagent_containers/food/snacks/cannedpeaches/maint = 1,
|
||||
/obj/item/storage/daki = 3, //VERY IMPORTANT CIT CHANGE - adds bodypillows to maint
|
||||
/obj/item/storage/pill_bottle/penis_enlargement = 2,
|
||||
/obj/item/clothing/shoes/wheelys = 1,
|
||||
/obj/item/clothing/shoes/kindleKicks = 1,
|
||||
/obj/item/autosurgeon/penis = 1,
|
||||
/obj/item/autosurgeon/testicles = 1,
|
||||
"" = 3
|
||||
))
|
||||
|
||||
@@ -366,11 +366,15 @@
|
||||
SEND_SIGNAL(src, COMSIG_CLICK_ALT, user)
|
||||
var/turf/T = get_turf(src)
|
||||
if(T && user.TurfAdjacent(T))
|
||||
if(user.listed_turf == T)
|
||||
user.listed_turf = null
|
||||
else
|
||||
user.listed_turf = T
|
||||
user.client.statpanel = T.name
|
||||
user.listed_turf = T
|
||||
user.client.statpanel = T.name
|
||||
|
||||
// Use this instead of /mob/proc/AltClickOn(atom/A) where you only want turf content listing without additional atom alt-click interaction
|
||||
/atom/proc/AltClickNoInteract(mob/user, atom/A)
|
||||
var/turf/T = get_turf(A)
|
||||
if(T && user.TurfAdjacent(T))
|
||||
user.listed_turf = T
|
||||
user.client.statpanel = T.name
|
||||
|
||||
/mob/proc/TurfAdjacent(turf/T)
|
||||
return T.Adjacent(src)
|
||||
|
||||
@@ -20,10 +20,23 @@
|
||||
else
|
||||
return TRUE
|
||||
|
||||
/obj/screen/movable/action_button/MouseDrop()
|
||||
if (!can_use(usr))
|
||||
/obj/screen/movable/action_button/MouseDrop(over_object)
|
||||
if(!can_use(usr))
|
||||
return
|
||||
return ..()
|
||||
if((istype(over_object, /obj/screen/movable/action_button) && !istype(over_object, /obj/screen/movable/action_button/hide_toggle)))
|
||||
if(locked)
|
||||
to_chat(usr, "<span class='warning'>Action button \"[name]\" is locked, unlock it first.</span>")
|
||||
return
|
||||
var/obj/screen/movable/action_button/B = over_object
|
||||
var/list/actions = usr.actions
|
||||
actions.Swap(actions.Find(src.linked_action), actions.Find(B.linked_action))
|
||||
moved = FALSE
|
||||
ordered = TRUE
|
||||
B.moved = FALSE
|
||||
B.ordered = TRUE
|
||||
usr.update_action_buttons()
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/screen/movable/action_button/Click(location,control,params)
|
||||
if (!can_use(usr))
|
||||
|
||||
@@ -64,7 +64,7 @@
|
||||
to_chat(user, "<span class='warning'>You're too exhausted.</span>") // CIT CHANGE - ditto
|
||||
return // CIT CHANGE - ditto
|
||||
|
||||
if(force && HAS_TRAIT(user, TRAIT_PACIFISM))
|
||||
if(force && damtype != STAMINA && HAS_TRAIT(user, TRAIT_PACIFISM))
|
||||
to_chat(user, "<span class='warning'>You don't want to harm other living beings!</span>")
|
||||
return
|
||||
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
ShiftClickOn(A)
|
||||
return
|
||||
if(modifiers["alt"])
|
||||
AltClickOn(A)
|
||||
AltClickNoInteract(src, A)
|
||||
return
|
||||
if(modifiers["ctrl"])
|
||||
CtrlClickOn(A)
|
||||
|
||||
+10
-15
@@ -1,22 +1,14 @@
|
||||
// The Squeak
|
||||
// because this is about placement of mice mobs, and nothing to do with
|
||||
// mice - the computer peripheral
|
||||
|
||||
SUBSYSTEM_DEF(squeak)
|
||||
name = "Squeak"
|
||||
init_order = INIT_ORDER_SQUEAK
|
||||
SUBSYSTEM_DEF(minor_mapping)
|
||||
name = "Minor Mapping"
|
||||
init_order = INIT_ORDER_MINOR_MAPPING
|
||||
flags = SS_NO_FIRE
|
||||
|
||||
var/list/exposed_wires = list()
|
||||
|
||||
/datum/controller/subsystem/squeak/Initialize(timeofday)
|
||||
/datum/controller/subsystem/minor_mapping/Initialize(timeofday)
|
||||
trigger_migration(CONFIG_GET(number/mice_roundstart))
|
||||
return ..()
|
||||
|
||||
/datum/controller/subsystem/squeak/proc/trigger_migration(num_mice=10)
|
||||
if(!num_mice)
|
||||
return
|
||||
find_exposed_wires()
|
||||
/datum/controller/subsystem/minor_mapping/proc/trigger_migration(num_mice=10)
|
||||
var/list/exposed_wires = find_exposed_wires()
|
||||
|
||||
var/mob/living/simple_animal/mouse/M
|
||||
var/turf/proposed_turf
|
||||
@@ -31,7 +23,8 @@ SUBSYSTEM_DEF(squeak)
|
||||
num_mice -= 1
|
||||
M = null
|
||||
|
||||
/datum/controller/subsystem/squeak/proc/find_exposed_wires()
|
||||
/proc/find_exposed_wires()
|
||||
var/list/exposed_wires = list()
|
||||
exposed_wires.Cut()
|
||||
var/list/all_turfs
|
||||
for (var/z in SSmapping.levels_by_trait(ZTRAIT_STATION))
|
||||
@@ -41,3 +34,5 @@ SUBSYSTEM_DEF(squeak)
|
||||
continue
|
||||
if(locate(/obj/structure/cable) in T)
|
||||
exposed_wires += T
|
||||
|
||||
return shuffle(exposed_wires)
|
||||
@@ -126,9 +126,20 @@ SUBSYSTEM_DEF(ticker)
|
||||
|
||||
|
||||
if(!GLOB.syndicate_code_phrase)
|
||||
GLOB.syndicate_code_phrase = generate_code_phrase()
|
||||
GLOB.syndicate_code_phrase = generate_code_phrase(return_list=TRUE)
|
||||
|
||||
var/codewords = jointext(GLOB.syndicate_code_phrase, "|")
|
||||
var/regex/codeword_match = new("([codewords])", "ig")
|
||||
|
||||
GLOB.syndicate_code_phrase_regex = codeword_match
|
||||
|
||||
if(!GLOB.syndicate_code_response)
|
||||
GLOB.syndicate_code_response = generate_code_phrase()
|
||||
GLOB.syndicate_code_response = generate_code_phrase(return_list=TRUE)
|
||||
|
||||
var/codewords = jointext(GLOB.syndicate_code_response, "|")
|
||||
var/regex/codeword_match = new("([codewords])", "ig")
|
||||
|
||||
GLOB.syndicate_code_response_regex = codeword_match
|
||||
|
||||
start_at = world.time + (CONFIG_GET(number/lobby_countdown) * 10)
|
||||
if(CONFIG_GET(flag/randomize_shift_time))
|
||||
@@ -561,6 +572,15 @@ SUBSYSTEM_DEF(ticker)
|
||||
news_message = "The burst of energy released near [station_name()] has been confirmed as merely a test of a new weapon. However, due to an unexpected mechanical error, their communications system has been knocked offline."
|
||||
if(SHUTTLE_HIJACK)
|
||||
news_message = "During routine evacuation procedures, the emergency shuttle of [station_name()] had its navigation protocols corrupted and went off course, but was recovered shortly after."
|
||||
if(GANG_VICTORY)
|
||||
news_message = "Company officials reaffirmed that sudden deployments of special forces are not in any way connected to rumors of [station_name()] being covered in graffiti."
|
||||
|
||||
if(SSblackbox.first_death)
|
||||
var/list/ded = SSblackbox.first_death
|
||||
if(ded.len)
|
||||
news_message += " NT Sanctioned Psykers picked up faint traces of someone near the station, allegedly having had died. Their name was: [ded["name"]], [ded["role"]], at [ded["area"]].[ded["last_words"] ? " Their last words were: \"[ded["last_words"]]\"" : ""]"
|
||||
else
|
||||
news_message += " NT Sanctioned Psykers proudly confirm reports that nobody died this shift!"
|
||||
|
||||
if(news_message)
|
||||
send2otherserver(news_source, news_message,"News_Report")
|
||||
|
||||
@@ -71,7 +71,6 @@ SUBSYSTEM_DEF(timer)
|
||||
for(var/I in second_queue)
|
||||
log_world(get_timer_debug_string(I))
|
||||
|
||||
var/cut_start_index = 1
|
||||
var/next_clienttime_timer_index = 0
|
||||
var/len = length(clienttime_timers)
|
||||
|
||||
@@ -94,14 +93,14 @@ SUBSYSTEM_DEF(timer)
|
||||
|
||||
if(ctime_timer.flags & TIMER_LOOP)
|
||||
ctime_timer.spent = 0
|
||||
clienttime_timers.Insert(ctime_timer, 1)
|
||||
cut_start_index++
|
||||
ctime_timer.timeToRun = REALTIMEOFDAY + ctime_timer.wait
|
||||
BINARY_INSERT(ctime_timer, clienttime_timers, datum/timedevent, timeToRun)
|
||||
else
|
||||
qdel(ctime_timer)
|
||||
|
||||
|
||||
if (next_clienttime_timer_index)
|
||||
clienttime_timers.Cut(cut_start_index,next_clienttime_timer_index+1)
|
||||
clienttime_timers.Cut(1, next_clienttime_timer_index+1)
|
||||
|
||||
if (MC_TICK_CHECK)
|
||||
return
|
||||
|
||||
@@ -72,7 +72,7 @@ SUBSYSTEM_DEF(traumas)
|
||||
"security" = typecacheof(list(/obj/item/clothing/under/rank/security, /obj/item/clothing/under/rank/warden,
|
||||
/obj/item/clothing/under/rank/head_of_security, /obj/item/clothing/under/rank/det,
|
||||
/obj/item/melee/baton, /obj/item/gun/energy/taser, /obj/item/restraints/handcuffs,
|
||||
/obj/machinery/door/airlock/security)),
|
||||
/obj/machinery/door/airlock/security, /obj/effect/hallucination/simple/securitron)),
|
||||
|
||||
"clowns" = typecacheof(list(/obj/item/clothing/under/rank/clown, /obj/item/clothing/shoes/clown_shoes,
|
||||
/obj/item/clothing/mask/gas/clown_hat, /obj/item/instrument/bikehorn,
|
||||
@@ -160,22 +160,22 @@ SUBSYSTEM_DEF(traumas)
|
||||
/obj/item/grown/bananapeel/mimanapeel, /obj/item/cartridge/virus/mime, /obj/item/clothing/shoes/sneakers/mime,
|
||||
/obj/item/bedsheet/mime, /obj/item/reagent_containers/food/snacks/burger/mime, /obj/item/clothing/head/beret, /obj/item/clothing/mask/gas/sexymime,
|
||||
/obj/item/clothing/under/sexymime, /obj/item/toy/figure/mime, /obj/item/toy/crayon/mime, /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/silenced, /obj/mecha/combat/reticence)),
|
||||
|
||||
|
||||
"cats" = typecacheof(list(/obj/item/organ/ears/cat, /obj/item/organ/tail/cat, /obj/item/laser_pointer, /obj/item/toy/cattoy, /obj/item/clothing/head/kitty,
|
||||
/obj/item/clothing/head/collectable/kitty, /obj/item/melee/chainofcommand/tailwhip/kitty, /obj/item/stack/sheet/animalhide/cat)),
|
||||
|
||||
|
||||
"syndicate" = typecacheof(list(/obj/item/stack/tile/mineral/plastitanium, /obj/machinery/computer/shuttle/syndicate, /obj/machinery/computer/shuttle/syndicate/recall, /obj/machinery/computer/shuttle/syndicate/drop_pod, /obj/machinery/computer/camera_advanced/shuttle_docker/syndicate, /obj/machinery/recharge_station,
|
||||
/obj/machinery/porta_turret/syndicate, /obj/structure/closet/syndicate, /obj/machinery/suit_storage_unit/syndicate, /obj/item/clothing/under/syndicate, /obj/item/folder/syndicate, /obj/item/documents/syndicate, /obj/item/clothing/glasses/phantomthief/syndicate, /obj/item/antag_spawner/nuke_ops, /obj/item/storage/box/syndicate,
|
||||
/obj/structure/fluff/empty_sleeper/syndicate, /obj/item/implant/radio/syndicate, /obj/item/clothing/head/helmet/space/syndicate, /obj/machinery/nuclearbomb/syndicate, /obj/item/grenade/syndieminibomb, /obj/item/storage/backpack/duffelbag/syndie, /obj/item/gun/ballistic/automatic/pistol, /obj/item/gun/ballistic/revolver/syndie,
|
||||
/obj/item/gun/ballistic/automatic/shotgun/bulldog, /obj/item/gun/ballistic/automatic/c20r, /obj/item/gun/ballistic/automatic/m90, /obj/item/gun/ballistic/automatic/l6_saw, /obj/item/storage/belt/grenade/full, /obj/item/gun/ballistic/automatic/sniper_rifle/syndicate, /obj/item/gun/energy/kinetic_accelerator/crossbow,
|
||||
/obj/item/melee/transforming/energy/sword/saber, /obj/item/twohanded/dualsaber, /obj/item/melee/powerfist, /obj/item/storage/box/syndie_kit, /obj/item/grenade/spawnergrenade/manhacks, /obj/item/grenade/chem_grenade/bioterrorfoam, /obj/item/reagent_containers/spray/chemsprayer/bioterror, /obj/item/ammo_box/magazine/m10mm,
|
||||
/obj/item/melee/transforming/energy/sword/saber, /obj/item/twohanded/dualsaber, /obj/item/melee/powerfist, /obj/item/storage/box/syndie_kit, /obj/item/grenade/spawnergrenade/manhacks, /obj/item/grenade/chem_grenade/bioterrorfoam, /obj/item/reagent_containers/spray/chemsprayer/bioterror, /obj/item/ammo_box/magazine/m10mm,
|
||||
/obj/item/ammo_box/magazine/pistolm9mm, /obj/item/ammo_box/a357, /obj/item/ammo_box/magazine/m12g, /obj/item/ammo_box/magazine/mm195x129, /obj/item/antag_spawner/nuke_ops, /obj/mecha/combat/gygax/dark, /obj/mecha/combat/marauder/mauler, /obj/item/soap/syndie, /obj/item/gun/syringe/syndicate, /obj/item/cartridge/virus/syndicate,
|
||||
/obj/item/cartridge/virus/frame, /obj/item/chameleon, /obj/item/storage/box/syndie_kit/cutouts, /obj/item/clothing/suit/space/hardsuit/syndi, /obj/item/card/emag, /obj/item/storage/toolbox/syndicate, /obj/item/storage/book/bible/syndicate, /obj/item/encryptionkey/binary, /obj/item/encryptionkey/syndicate, /obj/item/aiModule/syndicate,
|
||||
/obj/item/clothing/shoes/magboots/syndie, /obj/item/powersink, /obj/item/sbeacondrop, /obj/item/sbeacondrop/bomb, /obj/item/syndicatedetonator, /obj/item/shield/energy, /obj/item/assault_pod, /obj/item/slimepotion/slime/sentience/nuclear, /obj/item/stack/telecrystal, /obj/item/jammer, /obj/item/codespeak_manual/unlimited,
|
||||
/obj/item/toy/cards/deck/syndicate, /obj/item/storage/secure/briefcase/syndie, /obj/item/storage/fancy/cigarettes/cigpack_syndicate, /obj/item/toy/syndicateballoon, /obj/item/clothing/gloves/rapid, /obj/item/paper/fluff/ruins/thederelict/syndie_mission, /obj/item/organ/cyberimp/eyes/hud/security/syndicate, /obj/item/clothing/head/HoS/syndicate,
|
||||
/obj/machinery/computer/pod/old/syndicate, /obj/machinery/vending/medical/syndicate_access, /obj/item/mmi/syndie, /obj/item/target/syndicate, /obj/machinery/vending/cigarette/syndicate, /obj/item/robot_module/syndicate, /obj/item/clothing/mask/gas/syndicate, /obj/machinery/power/singularity_beacon/syndicate, /obj/item/clothing/head/syndicatefake,
|
||||
/obj/item/radio/headset/syndicate, /obj/item/gun/ballistic/automatic/pistol/antitank/syndicate, /obj/item/pda/syndicate, /obj/item/clothing/suit/armor/vest/capcarapace/syndicate, /obj/item/gun/ballistic/automatic/flechette, /obj/item/ammo_box/magazine/flechette, /obj/item/clothing/suit/toggle/lawyer/black/syndie, /obj/item/melee/transforming/energy/sword/cx/traitor,
|
||||
/obj/structure/sign/poster/contraband/syndicate_pistol, /obj/structure/sign/poster/contraband/syndicate_recruitment, /obj/item/bedsheet/syndie, /obj/item/borg/upgrade/syndicate, /obj/item/tank/jetpack/oxygen/harness, /obj/item/firing_pin/implant/pindicate, /obj/item/reagent_containers/glass/bottle/traitor, /obj/item/storage/belt/military,
|
||||
/obj/item/clothing/shoes/magboots/syndie, /obj/item/powersink, /obj/item/sbeacondrop, /obj/item/sbeacondrop/bomb, /obj/item/syndicatedetonator, /obj/item/shield/energy, /obj/item/assault_pod, /obj/item/slimepotion/slime/sentience/nuclear, /obj/item/stack/telecrystal, /obj/item/jammer, /obj/item/codespeak_manual/unlimited,
|
||||
/obj/item/toy/cards/deck/syndicate, /obj/item/storage/secure/briefcase/syndie, /obj/item/storage/fancy/cigarettes/cigpack_syndicate, /obj/item/toy/syndicateballoon, /obj/item/clothing/gloves/rapid, /obj/item/paper/fluff/ruins/thederelict/syndie_mission, /obj/item/organ/cyberimp/eyes/hud/security/syndicate, /obj/item/clothing/head/HoS/syndicate,
|
||||
/obj/machinery/computer/pod/old/syndicate, /obj/machinery/vending/medical/syndicate_access, /obj/item/mmi/syndie, /obj/item/target/syndicate, /obj/machinery/vending/cigarette/syndicate, /obj/item/robot_module/syndicate, /obj/item/clothing/mask/gas/syndicate, /obj/machinery/power/singularity_beacon/syndicate, /obj/item/clothing/head/syndicatefake,
|
||||
/obj/item/radio/headset/syndicate, /obj/item/gun/ballistic/automatic/pistol/antitank/syndicate, /obj/item/pda/syndicate, /obj/item/clothing/suit/armor/vest/capcarapace/syndicate, /obj/item/gun/ballistic/automatic/flechette, /obj/item/ammo_box/magazine/flechette, /obj/item/clothing/suit/toggle/lawyer/black/syndie, /obj/item/melee/transforming/energy/sword/cx/traitor,
|
||||
/obj/structure/sign/poster/contraband/syndicate_pistol, /obj/structure/sign/poster/contraband/syndicate_recruitment, /obj/item/bedsheet/syndie, /obj/item/borg/upgrade/syndicate, /obj/item/tank/jetpack/oxygen/harness, /obj/item/firing_pin/implant/pindicate, /obj/item/reagent_containers/glass/bottle/traitor, /obj/item/storage/belt/military,
|
||||
/obj/item/twohanded/shockpaddles/syndicate, /obj/item/clothing/mask/cigarette/syndicate, /obj/item/toy/plush/nukeplushie)),
|
||||
|
||||
"eye" = typecacheof(list(/obj/item/organ/eyes, /obj/item/reagent_containers/syringe))
|
||||
@@ -199,7 +199,7 @@ SUBSYSTEM_DEF(traumas)
|
||||
"anime" = typecacheof(list(/datum/species/human/felinid)),
|
||||
"cats" = typecacheof(list(/datum/species/human/felinid)),
|
||||
"syndicate" = typecacheof(list(/datum/species/corporate, /datum/species/zombie/infectious))
|
||||
)
|
||||
)
|
||||
|
||||
return ..()
|
||||
|
||||
|
||||
@@ -9,7 +9,8 @@
|
||||
var/obj/item/organ/brain/brain //the poor bastard's brain
|
||||
var/gain_text = "<span class='notice'>You feel traumatized.</span>"
|
||||
var/lose_text = "<span class='notice'>You no longer feel traumatized.</span>"
|
||||
var/can_gain = TRUE //can this be gained through random traumas?
|
||||
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?
|
||||
|
||||
/datum/brain_trauma/Destroy()
|
||||
@@ -23,7 +24,7 @@
|
||||
//Called on life ticks
|
||||
/datum/brain_trauma/proc/on_life()
|
||||
return
|
||||
|
||||
|
||||
//Called on death
|
||||
/datum/brain_trauma/proc/on_death()
|
||||
return
|
||||
@@ -31,16 +32,18 @@
|
||||
//Called when given to a mob
|
||||
/datum/brain_trauma/proc/on_gain()
|
||||
to_chat(owner, gain_text)
|
||||
RegisterSignal(owner, COMSIG_MOB_SAY, .proc/handle_speech)
|
||||
|
||||
//Called when removed from a mob
|
||||
/datum/brain_trauma/proc/on_lose(silent)
|
||||
if(!silent)
|
||||
to_chat(owner, lose_text)
|
||||
UnregisterSignal(owner, COMSIG_MOB_SAY)
|
||||
|
||||
//Called when hearing a spoken message
|
||||
/datum/brain_trauma/proc/on_hear(message, speaker, message_language, raw_message, radio_freq)
|
||||
return message
|
||||
|
||||
//Called when speaking
|
||||
/datum/brain_trauma/proc/on_say(message)
|
||||
return message
|
||||
/datum/brain_trauma/proc/handle_speech(datum/source, list/speech_args)
|
||||
UnregisterSignal(owner, COMSIG_MOB_SAY)
|
||||
|
||||
@@ -68,18 +68,12 @@
|
||||
lose_text = ""
|
||||
|
||||
/datum/brain_trauma/mild/speech_impediment/on_gain()
|
||||
owner.dna.add_mutation(UNINTELLIGIBLE)
|
||||
..()
|
||||
|
||||
//no fiddling with genetics to get out of this one
|
||||
/datum/brain_trauma/mild/speech_impediment/on_life()
|
||||
if(!(GLOB.mutations_list[UNINTELLIGIBLE] in owner.dna.mutations))
|
||||
on_gain()
|
||||
..()
|
||||
ADD_TRAIT(owner, TRAIT_UNINTELLIGIBLE_SPEECH, TRAUMA_TRAIT)
|
||||
. = ..()
|
||||
|
||||
/datum/brain_trauma/mild/speech_impediment/on_lose()
|
||||
owner.dna.remove_mutation(UNINTELLIGIBLE)
|
||||
..()
|
||||
REMOVE_TRAIT(owner, TRAIT_UNINTELLIGIBLE_SPEECH, TRAUMA_TRAIT)
|
||||
. = ..()
|
||||
|
||||
/datum/brain_trauma/mild/concussion
|
||||
name = "Concussion"
|
||||
|
||||
@@ -78,14 +78,13 @@
|
||||
break
|
||||
return message
|
||||
|
||||
/datum/brain_trauma/mild/phobia/on_say(message)
|
||||
/datum/brain_trauma/mild/phobia/handle_speech(datum/source, list/speech_args)
|
||||
for(var/word in trigger_words)
|
||||
var/reg = regex("(\\b|\\A)[REGEX_QUOTE(word)]'?s*(\\b|\\Z)", "i")
|
||||
|
||||
if(findtext(message, reg))
|
||||
|
||||
if(findtext(speech_args[SPEECH_MESSAGE], reg))
|
||||
to_chat(owner, "<span class='warning'>You can't bring yourself to say the word \"[word]\"!</span>")
|
||||
return ""
|
||||
return message
|
||||
speech_args[SPEECH_MESSAGE] = ""
|
||||
|
||||
/datum/brain_trauma/mild/phobia/proc/freak_out(atom/reason, trigger_word)
|
||||
next_scare = world.time + 120
|
||||
@@ -119,3 +118,7 @@
|
||||
owner.confused += 10
|
||||
owner.Jitter(10)
|
||||
owner.stuttering += 10
|
||||
|
||||
/datum/brain_trauma/mild/phobia/security
|
||||
phobia_type = "security"
|
||||
random_gain = FALSE
|
||||
|
||||
@@ -134,3 +134,71 @@
|
||||
|
||||
/datum/brain_trauma/special/psychotic_brawling/bath_salts
|
||||
name = "Chemical Violent Psychosis"
|
||||
random_gain = FALSE
|
||||
|
||||
/datum/brain_trauma/special/beepsky
|
||||
name = "Criminal"
|
||||
desc = "Patient seems to be a criminal."
|
||||
scan_desc = "criminal mind"
|
||||
gain_text = "<span class='warning'>Justice is coming for you.</span>"
|
||||
lose_text = "<span class='notice'>You were absolved for your crimes.</span>"
|
||||
random_gain = FALSE
|
||||
var/obj/effect/hallucination/simple/securitron/beepsky
|
||||
|
||||
/datum/brain_trauma/special/beepsky/on_gain()
|
||||
create_securitron()
|
||||
..()
|
||||
|
||||
/datum/brain_trauma/special/beepsky/proc/create_securitron()
|
||||
var/turf/where = locate(owner.x + pick(-12, 12), owner.y + pick(-12, 12), owner.z)
|
||||
beepsky = new(where, owner)
|
||||
beepsky.victim = owner
|
||||
|
||||
/datum/brain_trauma/special/beepsky/on_lose()
|
||||
QDEL_NULL(beepsky)
|
||||
..()
|
||||
|
||||
/datum/brain_trauma/special/beepsky/on_life()
|
||||
if(QDELETED(beepsky) || !beepsky.loc || beepsky.z != owner.z)
|
||||
QDEL_NULL(beepsky)
|
||||
if(prob(30))
|
||||
create_securitron()
|
||||
else
|
||||
return
|
||||
if(get_dist(owner, beepsky) >= 10 && prob(20))
|
||||
QDEL_NULL(beepsky)
|
||||
create_securitron()
|
||||
if(owner.stat != CONSCIOUS)
|
||||
if(prob(20))
|
||||
owner.playsound_local(beepsky, 'sound/voice/beepsky/iamthelaw.ogg', 50)
|
||||
return
|
||||
if(get_dist(owner, beepsky) <= 1)
|
||||
owner.playsound_local(owner, 'sound/weapons/egloves.ogg', 50)
|
||||
owner.visible_message("<span class='warning'>[owner]'s body jerks as if it was shocked.</span>", "<span class='userdanger'>You feel the fist of the LAW.</span>")
|
||||
owner.take_bodypart_damage(0,0,rand(40, 70))
|
||||
QDEL_NULL(beepsky)
|
||||
if(prob(20) && get_dist(owner, beepsky) <= 8)
|
||||
owner.playsound_local(beepsky, 'sound/voice/beepsky/criminal.ogg', 40)
|
||||
..()
|
||||
|
||||
/obj/effect/hallucination/simple/securitron
|
||||
name = "Securitron"
|
||||
desc = "The LAW is coming."
|
||||
image_icon = 'icons/mob/aibots.dmi'
|
||||
image_state = "secbot-c"
|
||||
var/victim
|
||||
|
||||
/obj/effect/hallucination/simple/securitron/New()
|
||||
name = pick ( "officer Beepsky", "officer Johnson", "officer Pingsky")
|
||||
START_PROCESSING(SSfastprocess,src)
|
||||
..()
|
||||
|
||||
/obj/effect/hallucination/simple/securitron/process()
|
||||
if(prob(60))
|
||||
forceMove(get_step_towards(src, victim))
|
||||
if(prob(5))
|
||||
to_chat(victim, "<span class='name'>[name]</span> exclaims, \"<span class='robotic'>Level 10 infraction alert!\"</span>")
|
||||
|
||||
/obj/effect/hallucination/simple/securitron/Destroy()
|
||||
STOP_PROCESSING(SSfastprocess,src)
|
||||
return ..()
|
||||
@@ -199,10 +199,9 @@
|
||||
addtimer(CALLBACK(src, /datum/brain_trauma/severe/split_personality.proc/switch_personalities), 10)
|
||||
return message
|
||||
|
||||
/datum/brain_trauma/severe/split_personality/brainwashing/on_say(message)
|
||||
if(findtext(message, codeword))
|
||||
return "" //oh hey did you want to tell people about the secret word to bring you back?
|
||||
return message
|
||||
/datum/brain_trauma/severe/split_personality/brainwashing/handle_speech(datum/source, list/speech_args)
|
||||
if(findtext(speech_args[SPEECH_MESSAGE], codeword))
|
||||
speech_args[SPEECH_MESSAGE] = "" //oh hey did you want to tell people about the secret word to bring you back?
|
||||
|
||||
/mob/living/split_personality/traitor
|
||||
name = "split personality"
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
/datum/component/bouncy
|
||||
dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS
|
||||
var/bouncy_mod = 1
|
||||
var/list/bounce_signals = list(COMSIG_MOVABLE_IMPACT, COMSIG_ITEM_HIT_REACT, COMSIG_ITEM_ATTACK)
|
||||
|
||||
/datum/component/bouncy/Initialize(_bouncy_mod, list/_bounce_signals)
|
||||
if(!ismovableatom(parent))
|
||||
return COMPONENT_INCOMPATIBLE
|
||||
if(_bouncy_mod)
|
||||
bouncy_mod = _bouncy_mod
|
||||
if(_bounce_signals)
|
||||
bounce_signals = _bounce_signals
|
||||
|
||||
/datum/component/bouncy/InheritComponent(datum/component/bouncy/B, original, _bouncy_mod, list/_bounce_signals)
|
||||
if(_bouncy_mod)
|
||||
bouncy_mod = max(bouncy_mod, _bouncy_mod)
|
||||
if(_bounce_signals)
|
||||
var/list/diff_bounces = difflist(bounce_signals, _bounce_signals, TRUE)
|
||||
for(var/bounce in diff_bounces)
|
||||
bounce_signals += bounce
|
||||
RegisterSignal(parent, bounce, .proc/bounce_up)
|
||||
|
||||
/datum/component/bouncy/RegisterWithParent()
|
||||
RegisterSignal(parent, bounce_signals, .proc/bounce_up)
|
||||
|
||||
/datum/component/bouncy/UnregisterFromParent()
|
||||
UnregisterSignal(parent, bounce_signals)
|
||||
|
||||
/datum/component/bouncy/proc/bounce_up(datum/source)
|
||||
var/atom/movable/A = parent
|
||||
switch(rand(1, 3))
|
||||
if(1)
|
||||
A.do_jiggle(45 + rand(-10, 10) * bouncy_mod, 14)
|
||||
if(2)
|
||||
var/min_b = 0.6/bouncy_mod
|
||||
var/max_b = 1.2 * bouncy_mod
|
||||
A.do_squish(rand(min_b, max_b), rand(min_b, max_b), 14)
|
||||
if(3)
|
||||
var/pixelshift = 8 * bouncy_mod
|
||||
A.Shake(pixelshift, pixelshift, duration = 15)
|
||||
@@ -2,10 +2,10 @@
|
||||
dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS
|
||||
|
||||
var/mob/living/host_mob
|
||||
var/nanite_volume = 100 //amount of nanites in the system, used as fuel for nanite programs
|
||||
var/max_nanites = 500 //maximum amount of nanites in the system
|
||||
var/nanite_volume = 50 //amount of nanites in the system, used as fuel for nanite programs
|
||||
var/max_nanites = 250 //maximum amount of nanites in the system
|
||||
var/regen_rate = 0.5 //nanites generated per second
|
||||
var/safety_threshold = 50 //how low nanites will get before they stop processing/triggering
|
||||
var/safety_threshold = 25 //how low nanites will get before they stop processing/triggering
|
||||
var/cloud_id = 0 //0 if not connected to the cloud, 1-100 to set a determined cloud backup to draw from
|
||||
var/next_sync = 0
|
||||
var/list/datum/nanite_program/programs = list()
|
||||
@@ -311,4 +311,4 @@
|
||||
mob_program["trigger_code"] = P.trigger_code
|
||||
id++
|
||||
mob_programs += list(mob_program)
|
||||
data["mob_programs"] = mob_programs
|
||||
data["mob_programs"] = mob_programs
|
||||
|
||||
@@ -7,12 +7,28 @@
|
||||
. = ..()
|
||||
RegisterSignal(parent, COMSIG_ATOM_EMAG_ACT, .proc/unlock_me)
|
||||
|
||||
/datum/component/storage/concrete/emergency/on_attack_hand(datum/source, mob/user)
|
||||
var/atom/A = parent
|
||||
if(!attack_hand_interact)
|
||||
return
|
||||
if(user.active_storage == src && A.loc == user) //if you're already looking inside the storage item
|
||||
user.active_storage.close(user)
|
||||
close(user)
|
||||
. = COMPONENT_NO_ATTACK_HAND
|
||||
return
|
||||
. = COMPONENT_NO_ATTACK_HAND
|
||||
if(!check_locked(source, user, TRUE))
|
||||
show_to(user)
|
||||
A.do_jiggle()
|
||||
if(rustle_sound)
|
||||
playsound(A, "rustle", 50, 1, -5)
|
||||
|
||||
/datum/component/storage/concrete/emergency/signal_insertion_attempt(datum/source, obj/item/I, mob/M, silent = FALSE, force = FALSE)
|
||||
if(!silent && istype(I, /obj/item/card/emag))
|
||||
silent = TRUE // suppresses the message
|
||||
return ..()
|
||||
|
||||
/datum/component/storage/concrete/check_locked(datum/source, mob/user, message = FALSE)
|
||||
/datum/component/storage/concrete/emergency/check_locked(datum/source, mob/user, message = FALSE)
|
||||
. = locked && GLOB.security_level < SEC_LEVEL_RED
|
||||
if(message && . && user)
|
||||
to_chat(user, "The storage unit will only unlock during a Red or Delta security alert.")
|
||||
|
||||
@@ -531,11 +531,9 @@
|
||||
if(!istype(M))
|
||||
return FALSE
|
||||
A.add_fingerprint(M)
|
||||
if(locked && !force)
|
||||
to_chat(M, "<span class='warning'>[parent] seems to be locked!</span>")
|
||||
if(!force && (check_locked(null, M) || !M.CanReach(parent, view_only = TRUE)))
|
||||
return FALSE
|
||||
if(force || M.CanReach(parent, view_only = TRUE))
|
||||
show_to(M)
|
||||
show_to(M)
|
||||
|
||||
/datum/component/storage/proc/mousedrop_receive(datum/source, atom/movable/O, mob/M)
|
||||
if(isitem(O))
|
||||
@@ -594,7 +592,7 @@
|
||||
if(!stop_messages)
|
||||
to_chat(M, "<span class='warning'>[IP] cannot hold [I] as it's a storage item of the same size!</span>")
|
||||
return FALSE //To prevent the stacking of same sized storage items.
|
||||
if(I.item_flags & NODROP) //SHOULD be handled in unEquip, but better safe than sorry.
|
||||
if(HAS_TRAIT(I, TRAIT_NODROP)) //SHOULD be handled in unEquip, but better safe than sorry.
|
||||
to_chat(M, "<span class='warning'>\the [I] is stuck to your hand, you can't put it in \the [host]!</span>")
|
||||
return FALSE
|
||||
var/datum/component/storage/concrete/master = master()
|
||||
@@ -749,7 +747,8 @@
|
||||
if(!quickdraw)
|
||||
A.add_fingerprint(user)
|
||||
user_show_to_mob(user)
|
||||
playsound(A, "rustle", 50, 1, -5)
|
||||
if(rustle_sound)
|
||||
playsound(A, "rustle", 50, 1, -5)
|
||||
return
|
||||
|
||||
if(!user.incapacitated())
|
||||
|
||||
@@ -21,6 +21,9 @@ GLOBAL_LIST_EMPTY(uplinks)
|
||||
var/datum/uplink_purchase_log/purchase_log
|
||||
var/list/uplink_items
|
||||
var/hidden_crystals = 0
|
||||
var/unlock_note
|
||||
var/unlock_code
|
||||
var/failsafe_code
|
||||
|
||||
/datum/component/uplink/Initialize(_owner, _lockable = TRUE, _enabled = FALSE, datum/game_mode/_gamemode, starting_tc = 20)
|
||||
if(!isitem(parent))
|
||||
@@ -219,7 +222,10 @@ GLOBAL_LIST_EMPTY(uplinks)
|
||||
|
||||
/datum/component/uplink/proc/new_ringtone(datum/source, mob/living/user, new_ring_text)
|
||||
var/obj/item/pda/master = parent
|
||||
if(trim(lowertext(new_ring_text)) != trim(lowertext(master.lock_code))) //why is the lock code stored on the pda?
|
||||
if(trim(lowertext(new_ring_text)) != trim(lowertext(unlock_code)))
|
||||
if(trim(lowertext(new_ring_text)) == trim(lowertext(failsafe_code)))
|
||||
failsafe()
|
||||
return COMPONENT_STOP_RINGTONE_CHANGE
|
||||
return
|
||||
locked = FALSE
|
||||
interact(null, user)
|
||||
@@ -233,7 +239,9 @@ GLOBAL_LIST_EMPTY(uplinks)
|
||||
/datum/component/uplink/proc/new_frequency(datum/source, list/arguments)
|
||||
var/obj/item/radio/master = parent
|
||||
var/frequency = arguments[1]
|
||||
if(frequency != master.traitor_frequency)
|
||||
if(frequency != unlock_code)
|
||||
if(frequency == failsafe_code)
|
||||
failsafe()
|
||||
return
|
||||
locked = FALSE
|
||||
if(ismob(master.loc))
|
||||
@@ -243,9 +251,38 @@ GLOBAL_LIST_EMPTY(uplinks)
|
||||
|
||||
/datum/component/uplink/proc/pen_rotation(datum/source, degrees, mob/living/carbon/user)
|
||||
var/obj/item/pen/master = parent
|
||||
if(degrees != master.traitor_unlock_degrees)
|
||||
if(degrees != unlock_code)
|
||||
if(degrees == failsafe_code) //Getting failsafes on pens is risky business
|
||||
failsafe()
|
||||
return
|
||||
locked = FALSE
|
||||
master.degrees = 0
|
||||
interact(null, user)
|
||||
to_chat(user, "<span class='warning'>Your pen makes a clicking noise, before quickly rotating back to 0 degrees!</span>")
|
||||
to_chat(user, "<span class='warning'>Your pen makes a clicking noise, before quickly rotating back to 0 degrees!</span>")
|
||||
|
||||
/datum/component/uplink/proc/setup_unlock_code()
|
||||
unlock_code = generate_code()
|
||||
var/obj/item/P = parent
|
||||
if(istype(parent,/obj/item/pda))
|
||||
unlock_note = "<B>Uplink Passcode:</B> [unlock_code] ([P.name])."
|
||||
else if(istype(parent,/obj/item/radio))
|
||||
unlock_note = "<B>Radio Frequency:</B> [format_frequency(unlock_code)] ([P.name])."
|
||||
else if(istype(parent,/obj/item/pen))
|
||||
unlock_note = "<B>Uplink Degrees:</B> [unlock_code] ([P.name])."
|
||||
|
||||
/datum/component/uplink/proc/generate_code()
|
||||
if(istype(parent,/obj/item/pda))
|
||||
return "[rand(100,999)] [pick(GLOB.phonetic_alphabet)]"
|
||||
else if(istype(parent,/obj/item/radio))
|
||||
return sanitize_frequency(rand(MIN_FREQ, MAX_FREQ))
|
||||
else if(istype(parent,/obj/item/pen))
|
||||
return rand(1, 360)
|
||||
|
||||
/datum/component/uplink/proc/failsafe()
|
||||
if(!parent)
|
||||
return
|
||||
var/turf/T = get_turf(parent)
|
||||
if(!T)
|
||||
return
|
||||
explosion(T,1,2,3)
|
||||
qdel(parent) //Alternatively could brick the uplink.
|
||||
|
||||
@@ -26,3 +26,30 @@
|
||||
if(4)
|
||||
if(prob(5))
|
||||
affected_mob.say( pick( list("HONK!", "Honk!", "Honk.", "Honk?", "Honk!!", "Honk?!", "Honk...") ) , forced = "pierrot's throat")
|
||||
|
||||
/datum/disease/pierrot_throat/after_add()
|
||||
RegisterSignal(affected_mob, COMSIG_MOB_SAY, .proc/handle_speech)
|
||||
|
||||
/datum/disease/pierrot_throat/proc/handle_speech(datum/source, list/speech_args)
|
||||
var/message = speech_args[SPEECH_MESSAGE]
|
||||
var/list/split_message = splittext(message, " ") //List each word in the message
|
||||
var/applied = 0
|
||||
for (var/i in 1 to length(split_message))
|
||||
if(prob(3 * stage)) //Stage 1: 3% Stage 2: 6% Stage 3: 9% Stage 4: 12%
|
||||
if(findtext(split_message[i], "*") || findtext(split_message[i], ";") || findtext(split_message[i], ":"))
|
||||
continue
|
||||
split_message[i] = "HONK"
|
||||
if (applied++ > stage)
|
||||
break
|
||||
if (applied)
|
||||
speech_args[SPEECH_SPANS] |= SPAN_CLOWN // a little bonus
|
||||
message = jointext(split_message, " ")
|
||||
speech_args[SPEECH_MESSAGE] = message
|
||||
|
||||
/datum/disease/pierrot_throat/Destroy()
|
||||
UnregisterSignal(affected_mob, COMSIG_MOB_SAY)
|
||||
return ..()
|
||||
|
||||
/datum/disease/pierrot_throat/remove_disease()
|
||||
UnregisterSignal(affected_mob, COMSIG_MOB_SAY)
|
||||
return ..()
|
||||
@@ -185,25 +185,6 @@
|
||||
if(DNA_TAUR_BLOCK)
|
||||
construct_block(GLOB.taur_list.Find(features["taur"]), GLOB.taur_list.len)
|
||||
|
||||
/datum/dna/proc/mutations_say_mods(message)
|
||||
if(message)
|
||||
for(var/datum/mutation/human/M in mutations)
|
||||
message = M.say_mod(message)
|
||||
return message
|
||||
|
||||
/datum/dna/proc/mutations_get_spans()
|
||||
var/list/spans = list()
|
||||
for(var/datum/mutation/human/M in mutations)
|
||||
spans |= M.get_spans()
|
||||
return spans
|
||||
|
||||
/datum/dna/proc/species_get_spans()
|
||||
var/list/spans = list()
|
||||
if(species)
|
||||
spans |= species.get_spans()
|
||||
return spans
|
||||
|
||||
|
||||
/datum/dna/proc/is_same_as(datum/dna/D)
|
||||
if(uni_identity == D.uni_identity && struc_enzymes == D.struc_enzymes && real_name == D.real_name && nameless == D.nameless && custom_species == D.custom_species)
|
||||
if(species.type == D.species.type && features == D.features && blood_type == D.blood_type)
|
||||
|
||||
@@ -198,7 +198,8 @@ GLOBAL_LIST_EMPTY(explosions)
|
||||
var/list/items = list()
|
||||
for(var/I in T)
|
||||
var/atom/A = I
|
||||
items += A.GetAllContents()
|
||||
if (!A.prevent_content_explosion()) //The atom/contents_explosion() proc returns null if the contents ex_acting has been handled by the atom, and TRUE if it hasn't.
|
||||
items += A.GetAllContents()
|
||||
for(var/O in items)
|
||||
var/atom/A = O
|
||||
if(!QDELETED(A))
|
||||
|
||||
+3
-7
@@ -11,7 +11,6 @@
|
||||
|
||||
chance (num) Chance per loop to play a mid_sound
|
||||
volume (num) Sound output volume
|
||||
muted (bool) Private. Used to stop the sound loop.
|
||||
max_loops (num) The max amount of loops to run for.
|
||||
direct (bool) If true plays directly to provided atoms instead of from them
|
||||
*/
|
||||
@@ -68,7 +67,7 @@
|
||||
if(!chance || prob(chance))
|
||||
play(get_sound(starttime))
|
||||
if(!timerid)
|
||||
timerid = addtimer(CALLBACK(src, .proc/sound_loop, world.time), mid_length, TIMER_STOPPABLE | TIMER_LOOP)
|
||||
timerid = addtimer(CALLBACK(src, .proc/sound_loop, world.time), mid_length, TIMER_CLIENT_TIME | TIMER_STOPPABLE | TIMER_LOOP)
|
||||
|
||||
/datum/looping_sound/proc/play(soundfile)
|
||||
var/list/atoms_cache = output_atoms
|
||||
@@ -84,10 +83,7 @@
|
||||
playsound(thing, S, volume)
|
||||
|
||||
/datum/looping_sound/proc/get_sound(starttime, _mid_sounds)
|
||||
if(!_mid_sounds)
|
||||
. = mid_sounds
|
||||
else
|
||||
. = _mid_sounds
|
||||
. = _mid_sounds || mid_sounds
|
||||
while(!isfile(.) && !isnull(.))
|
||||
. = pickweight(.)
|
||||
|
||||
@@ -96,7 +92,7 @@
|
||||
if(start_sound)
|
||||
play(start_sound)
|
||||
start_wait = start_length
|
||||
addtimer(CALLBACK(src, .proc/sound_loop), start_wait)
|
||||
addtimer(CALLBACK(src, .proc/sound_loop), start_wait, TIMER_CLIENT_TIME)
|
||||
|
||||
/datum/looping_sound/proc/on_stop()
|
||||
if(end_sound)
|
||||
@@ -195,7 +195,7 @@
|
||||
/obj/item/clothing/gloves/krav_maga/combatglovesplus
|
||||
name = "combat gloves plus"
|
||||
desc = "These tactical gloves are fireproof and shock resistant, and using nanochip technology it teaches you the powers of krav maga."
|
||||
icon_state = "black"
|
||||
icon_state = "combat"
|
||||
item_state = "blackglovesplus"
|
||||
siemens_coefficient = 0
|
||||
permeability_coefficient = 0.05
|
||||
|
||||
+17
-31
@@ -233,13 +233,10 @@
|
||||
/datum/mind/proc/remove_antag_equip()
|
||||
var/list/Mob_Contents = current.get_contents()
|
||||
for(var/obj/item/I in Mob_Contents)
|
||||
if(istype(I, /obj/item/pda))
|
||||
var/obj/item/pda/P = I
|
||||
P.lock_code = ""
|
||||
|
||||
else if(istype(I, /obj/item/radio))
|
||||
var/obj/item/radio/R = I
|
||||
R.traitor_frequency = 0
|
||||
var/datum/component/uplink/O = I.GetComponent(/datum/component/uplink)
|
||||
//Todo make this reset signal
|
||||
if(O)
|
||||
O.unlock_code = null
|
||||
|
||||
/datum/mind/proc/remove_all_antag() //For the Lazy amongst us.
|
||||
remove_changeling()
|
||||
@@ -304,33 +301,22 @@
|
||||
. = 0
|
||||
else
|
||||
. = uplink_loc
|
||||
uplink_loc.AddComponent(/datum/component/uplink, traitor_mob.key)
|
||||
var/unlock_note
|
||||
|
||||
if(uplink_loc == R)
|
||||
R.traitor_frequency = sanitize_frequency(rand(MIN_FREQ, MAX_FREQ))
|
||||
|
||||
if(!silent)
|
||||
to_chat(traitor_mob, "[employer] has cunningly disguised a Syndicate Uplink as your [R.name]. Simply dial the frequency [format_frequency(R.traitor_frequency)] to unlock its hidden features.")
|
||||
unlock_note = "<B>Radio Frequency:</B> [format_frequency(R.traitor_frequency)] ([R.name])."
|
||||
else if(uplink_loc == PDA)
|
||||
PDA.lock_code = "[rand(100,999)] [pick(GLOB.phonetic_alphabet)]"
|
||||
|
||||
if(!silent)
|
||||
to_chat(traitor_mob, "[employer] has cunningly disguised a Syndicate Uplink as your [PDA.name]. Simply enter the code \"[PDA.lock_code]\" into the ringtone select to unlock its hidden features.")
|
||||
unlock_note = "<B>Uplink Passcode:</B> [PDA.lock_code] ([PDA.name])."
|
||||
|
||||
else if(uplink_loc == P)
|
||||
P.traitor_unlock_degrees = rand(1, 360)
|
||||
|
||||
if(!silent)
|
||||
to_chat(traitor_mob, "[employer] has cunningly disguised a Syndicate Uplink as your [P.name]. Simply twist the top of the pen [P.traitor_unlock_degrees] from its starting position to unlock its hidden features.")
|
||||
unlock_note = "<B>Uplink Degrees:</B> [P.traitor_unlock_degrees] ([P.name])."
|
||||
var/datum/component/uplink/U = uplink_loc.AddComponent(/datum/component/uplink, traitor_mob.key)
|
||||
if(!U)
|
||||
CRASH("Uplink creation failed.")
|
||||
U.setup_unlock_code()
|
||||
if(!silent)
|
||||
if(uplink_loc == R)
|
||||
to_chat(traitor_mob, "[employer] has cunningly disguised a Syndicate Uplink as your [R.name]. Simply dial the frequency [format_frequency(U.unlock_code)] to unlock its hidden features.")
|
||||
else if(uplink_loc == PDA)
|
||||
to_chat(traitor_mob, "[employer] has cunningly disguised a Syndicate Uplink as your [PDA.name]. Simply enter the code \"[U.unlock_code]\" into the ringtone select to unlock its hidden features.")
|
||||
else if(uplink_loc == P)
|
||||
to_chat(traitor_mob, "[employer] has cunningly disguised a Syndicate Uplink as your [P.name]. Simply twist the top of the pen [U.unlock_code] from its starting position to unlock its hidden features.")
|
||||
|
||||
if(uplink_owner)
|
||||
uplink_owner.antag_memory += unlock_note + "<br>"
|
||||
uplink_owner.antag_memory += U.unlock_note + "<br>"
|
||||
else
|
||||
traitor_mob.mind.store_memory(unlock_note)
|
||||
traitor_mob.mind.store_memory(U.unlock_note)
|
||||
|
||||
//Link a new mobs mind to the creator of said mob. They will join any team they are currently on, and will only switch teams when their creator does.
|
||||
|
||||
|
||||
@@ -105,13 +105,6 @@ GLOBAL_LIST_EMPTY(mutations_list)
|
||||
return 0
|
||||
return 1
|
||||
|
||||
/datum/mutation/human/proc/say_mod(message)
|
||||
if(message)
|
||||
return message
|
||||
|
||||
/datum/mutation/human/proc/get_spans()
|
||||
return list()
|
||||
|
||||
/mob/living/carbon/proc/update_mutations_overlay()
|
||||
return
|
||||
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
ADD_TRAIT(owner, TRAIT_PUSHIMMUNE, TRAIT_HULK)
|
||||
owner.update_body_parts()
|
||||
SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, "hulk", /datum/mood_event/hulk)
|
||||
RegisterSignal(owner, COMSIG_MOB_SAY, .proc/handle_speech)
|
||||
|
||||
/datum/mutation/human/hulk/on_attack_hand(mob/living/carbon/human/owner, atom/target, proximity)
|
||||
if(proximity) //no telekinetic hulk attack
|
||||
@@ -32,8 +33,11 @@
|
||||
REMOVE_TRAIT(owner, TRAIT_PUSHIMMUNE, TRAIT_HULK)
|
||||
owner.update_body_parts()
|
||||
SEND_SIGNAL(owner, COMSIG_CLEAR_MOOD_EVENT, "hulk")
|
||||
UnregisterSignal(owner, COMSIG_MOB_SAY)
|
||||
|
||||
/datum/mutation/human/hulk/say_mod(message)
|
||||
/datum/mutation/human/hulk/proc/handle_speech(original_message, wrapped_message)
|
||||
var/message = wrapped_message[1]
|
||||
if(message)
|
||||
message = "[uppertext(replacetext(message, ".", "!"))]!!"
|
||||
return message
|
||||
message = "[replacetext(message, ".", "!")]!!"
|
||||
wrapped_message[1] = message
|
||||
return COMPONENT_UPPERCASE_SPEECH
|
||||
|
||||
@@ -17,9 +17,20 @@
|
||||
text_gain_indication = "<span class='sans'>You feel an off sensation in your voicebox.</span>"
|
||||
text_lose_indication = "<span class='notice'>The off sensation passes.</span>"
|
||||
|
||||
/datum/mutation/human/wacky/get_spans()
|
||||
return list(SPAN_SANS)
|
||||
/datum/mutation/human/wacky/on_acquiring(mob/living/carbon/human/owner)
|
||||
. = ..()
|
||||
if(.)
|
||||
return
|
||||
RegisterSignal(owner, COMSIG_MOB_SAY, .proc/handle_speech)
|
||||
|
||||
/datum/mutation/human/wacky/on_losing(mob/living/carbon/human/owner)
|
||||
. = ..()
|
||||
if(.)
|
||||
return
|
||||
UnregisterSignal(owner, COMSIG_MOB_SAY)
|
||||
|
||||
/datum/mutation/human/wacky/proc/handle_speech(datum/source, list/speech_args)
|
||||
speech_args[SPEECH_SPANS] |= SPAN_SANS
|
||||
|
||||
/datum/mutation/human/mute
|
||||
name = "Mute"
|
||||
@@ -28,12 +39,14 @@
|
||||
text_lose_indication = "<span class='danger'>You feel able to speak freely again.</span>"
|
||||
|
||||
/datum/mutation/human/mute/on_acquiring(mob/living/carbon/human/owner)
|
||||
if(..())
|
||||
. = ..()
|
||||
if(.)
|
||||
return
|
||||
ADD_TRAIT(owner, TRAIT_MUTE, GENETIC_MUTATION)
|
||||
|
||||
/datum/mutation/human/mute/on_losing(mob/living/carbon/human/owner)
|
||||
if(..())
|
||||
. = ..()
|
||||
if(.)
|
||||
return
|
||||
REMOVE_TRAIT(owner, TRAIT_MUTE, GENETIC_MUTATION)
|
||||
|
||||
@@ -45,7 +58,20 @@
|
||||
text_gain_indication = "<span class='notice'>You feel so happy. Nothing can be wrong with anything. :)</span>"
|
||||
text_lose_indication = "<span class='notice'>Everything is terrible again. :(</span>"
|
||||
|
||||
/datum/mutation/human/smile/say_mod(message)
|
||||
/datum/mutation/human/smile/on_acquiring(mob/living/carbon/human/owner)
|
||||
. = ..()
|
||||
if(.)
|
||||
return
|
||||
RegisterSignal(owner, COMSIG_MOB_SAY, .proc/handle_speech)
|
||||
|
||||
/datum/mutation/human/smile/on_losing(mob/living/carbon/human/owner)
|
||||
. = ..()
|
||||
if(.)
|
||||
return
|
||||
UnregisterSignal(owner, COMSIG_MOB_SAY)
|
||||
|
||||
/datum/mutation/human/smile/proc/handle_speech(datum/source, list/speech_args)
|
||||
var/message = speech_args[SPEECH_MESSAGE]
|
||||
if(message)
|
||||
message = " [message] "
|
||||
//Time for a friendly game of SS13
|
||||
@@ -92,7 +118,7 @@
|
||||
message = replacetext(message," cunt "," privates ")
|
||||
message = replacetext(message," dick "," jerk ")
|
||||
message = replacetext(message," vagina "," privates ")
|
||||
return trim(message)
|
||||
speech_args[SPEECH_MESSAGE] = trim(message)
|
||||
|
||||
|
||||
/datum/mutation/human/unintelligible
|
||||
@@ -102,30 +128,17 @@
|
||||
text_gain_indication = "<span class='danger'>You can't seem to form any coherent thoughts!</span>"
|
||||
text_lose_indication = "<span class='danger'>Your mind feels more clear.</span>"
|
||||
|
||||
/datum/mutation/human/unintelligible/say_mod(message)
|
||||
if(message)
|
||||
var/prefix=copytext(message,1,2)
|
||||
if(prefix == ";")
|
||||
message = copytext(message,2)
|
||||
else if(prefix in list(":","#"))
|
||||
prefix += copytext(message,2,3)
|
||||
message = copytext(message,3)
|
||||
else
|
||||
prefix=""
|
||||
/datum/mutation/human/unintelligible/on_acquiring(mob/living/carbon/human/owner)
|
||||
. = ..()
|
||||
if(.)
|
||||
return
|
||||
ADD_TRAIT(owner, TRAIT_UNINTELLIGIBLE_SPEECH, GENETIC_MUTATION)
|
||||
|
||||
var/list/words = splittext(message," ")
|
||||
var/list/rearranged = list()
|
||||
for(var/i=1;i<=words.len;i++)
|
||||
var/cword = pick(words)
|
||||
words.Remove(cword)
|
||||
var/suffix = copytext(cword,length(cword)-1,length(cword))
|
||||
while(length(cword)>0 && suffix in list(".",",",";","!",":","?"))
|
||||
cword = copytext(cword,1 ,length(cword)-1)
|
||||
suffix = copytext(cword,length(cword)-1,length(cword) )
|
||||
if(length(cword))
|
||||
rearranged += cword
|
||||
message ="[prefix][jointext(rearranged," ")]"
|
||||
return message
|
||||
/datum/mutation/human/unintelligible/on_losing(mob/living/carbon/human/owner)
|
||||
. = ..()
|
||||
if(.)
|
||||
return
|
||||
REMOVE_TRAIT(owner, TRAIT_UNINTELLIGIBLE_SPEECH, GENETIC_MUTATION)
|
||||
|
||||
|
||||
/datum/mutation/human/swedish
|
||||
@@ -135,7 +148,20 @@
|
||||
text_gain_indication = "<span class='notice'>You feel Swedish, however that works.</span>"
|
||||
text_lose_indication = "<span class='notice'>The feeling of Swedishness passes.</span>"
|
||||
|
||||
/datum/mutation/human/swedish/say_mod(message)
|
||||
/datum/mutation/human/swedish/on_acquiring(mob/living/carbon/human/owner)
|
||||
. = ..()
|
||||
if(.)
|
||||
return
|
||||
RegisterSignal(owner, COMSIG_MOB_SAY, .proc/handle_speech)
|
||||
|
||||
/datum/mutation/human/swedish/on_losing(mob/living/carbon/human/owner)
|
||||
. = ..()
|
||||
if(.)
|
||||
return
|
||||
UnregisterSignal(owner, COMSIG_MOB_SAY)
|
||||
|
||||
/datum/mutation/human/swedish/proc/handle_speech(datum/source, list/speech_args)
|
||||
var/message = speech_args[SPEECH_MESSAGE]
|
||||
if(message)
|
||||
message = replacetext(message,"w","v")
|
||||
message = replacetext(message,"j","y")
|
||||
@@ -144,7 +170,7 @@
|
||||
message = replacetext(message,"o",pick("�","�","o"))
|
||||
if(prob(30))
|
||||
message += " Bork[pick("",", bork",", bork, bork")]!"
|
||||
return message
|
||||
speech_args[SPEECH_MESSAGE] = trim(message)
|
||||
|
||||
|
||||
/datum/mutation/human/chav
|
||||
@@ -154,7 +180,20 @@
|
||||
text_gain_indication = "<span class='notice'>Ye feel like a reet prat like, innit?</span>"
|
||||
text_lose_indication = "<span class='notice'>You no longer feel like being rude and sassy.</span>"
|
||||
|
||||
/datum/mutation/human/chav/say_mod(message)
|
||||
/datum/mutation/human/chav/on_acquiring(mob/living/carbon/human/owner)
|
||||
. = ..()
|
||||
if(.)
|
||||
return
|
||||
RegisterSignal(owner, COMSIG_MOB_SAY, .proc/handle_speech)
|
||||
|
||||
/datum/mutation/human/chav/on_losing(mob/living/carbon/human/owner)
|
||||
. = ..()
|
||||
if(.)
|
||||
return
|
||||
UnregisterSignal(owner, COMSIG_MOB_SAY)
|
||||
|
||||
/datum/mutation/human/chav/proc/handle_speech(datum/source, list/speech_args)
|
||||
var/message = speech_args[SPEECH_MESSAGE]
|
||||
if(message)
|
||||
message = " [message] "
|
||||
message = replacetext(message," looking at "," gawpin' at ")
|
||||
@@ -178,7 +217,7 @@
|
||||
message = replacetext(message," break "," do ")
|
||||
message = replacetext(message," your "," yer ")
|
||||
message = replacetext(message," security "," coppers ")
|
||||
return trim(message)
|
||||
speech_args[SPEECH_MESSAGE] = trim(message)
|
||||
|
||||
|
||||
/datum/mutation/human/elvis
|
||||
@@ -199,7 +238,20 @@
|
||||
if(prob(15))
|
||||
owner.visible_message("<b>[owner]</b> [pick("jiggles their hips", "rotates their hips", "gyrates their hips", "taps their foot", "dances to an imaginary song", "jiggles their legs", "snaps their fingers")]!")
|
||||
|
||||
/datum/mutation/human/elvis/say_mod(message)
|
||||
/datum/mutation/human/elvis/on_acquiring(mob/living/carbon/human/owner)
|
||||
. = ..()
|
||||
if(.)
|
||||
return
|
||||
RegisterSignal(owner, COMSIG_MOB_SAY, .proc/handle_speech)
|
||||
|
||||
/datum/mutation/human/elvis/on_losing(mob/living/carbon/human/owner)
|
||||
. = ..()
|
||||
if(.)
|
||||
return
|
||||
UnregisterSignal(owner, COMSIG_MOB_SAY)
|
||||
|
||||
/datum/mutation/human/elvis/proc/handle_speech(datum/source, list/speech_args)
|
||||
var/message = speech_args[SPEECH_MESSAGE]
|
||||
if(message)
|
||||
message = " [message] "
|
||||
message = replacetext(message," i'm not "," I aint ")
|
||||
@@ -211,7 +263,7 @@
|
||||
message = replacetext(message," yes ",pick(" sure", "yea "))
|
||||
message = replacetext(message," faggot "," square ")
|
||||
message = replacetext(message," muh valids "," getting my kicks ")
|
||||
return trim(message)
|
||||
speech_args[SPEECH_MESSAGE] = trim(message)
|
||||
|
||||
|
||||
/datum/mutation/human/stoner
|
||||
|
||||
+4
-1
@@ -289,8 +289,11 @@
|
||||
to_chat(user, "<span class='warning'>You can't move while buckled to [src]!</span>")
|
||||
return
|
||||
|
||||
/atom/proc/prevent_content_explosion()
|
||||
return FALSE
|
||||
|
||||
/atom/proc/contents_explosion(severity, target)
|
||||
return
|
||||
return //For handling the effects of explosions on contents that would not normally be effected
|
||||
|
||||
/atom/proc/ex_act(severity, target)
|
||||
set waitfor = FALSE
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
var/verb_exclaim = "exclaims"
|
||||
var/verb_whisper = "whispers"
|
||||
var/verb_yell = "yells"
|
||||
var/speech_span
|
||||
var/inertia_dir = 0
|
||||
var/atom/inertia_last_loc
|
||||
var/inertia_moving = 0
|
||||
|
||||
@@ -86,8 +86,11 @@ GLOBAL_VAR(changeling_team_objective_type) //If this is not null, we hand our th
|
||||
var/datum/dna/chosen_dna = chosen_prof.dna
|
||||
user.real_name = chosen_prof.name
|
||||
user.underwear = chosen_prof.underwear
|
||||
user.undie_color = chosen_prof.undie_color
|
||||
user.undershirt = chosen_prof.undershirt
|
||||
user.shirt_color =chosen_prof.shirt_color
|
||||
user.socks = chosen_prof.socks
|
||||
user.socks_color =chosen_prof.socks_color
|
||||
|
||||
chosen_dna.transfer_identity(user, 1)
|
||||
user.updateappearance(mutcolor_update=1)
|
||||
|
||||
@@ -275,7 +275,7 @@ Credit where due:
|
||||
gloves = /obj/item/clothing/gloves/color/yellow
|
||||
belt = /obj/item/storage/belt/utility/servant
|
||||
backpack_contents = list(/obj/item/storage/box/engineer = 1, \
|
||||
/obj/item/clockwork/replica_fabricator = 1, /obj/item/stack/tile/brass/fifty = 1, /obj/item/paper/servant_primer = 1)
|
||||
/obj/item/clockwork/replica_fabricator = 1, /obj/item/stack/tile/brass/fifty = 1, /obj/item/paper/servant_primer = 1, /obj/item/reagent_containers/food/drinks/holyoil = 1)
|
||||
id = /obj/item/pda
|
||||
var/plasmaman //We use this to determine if we should activate internals in post_equip()
|
||||
|
||||
@@ -338,6 +338,10 @@ Credit where due:
|
||||
CLOCKCULTCHANGELOG\
|
||||
</ul>\
|
||||
<hr>\
|
||||
<li><b>Zelus oil:</b> A new reagent. It can be used to heal the faithful to Ratvar, or kill heretics and moreso stun blood cultists,\
|
||||
or splashed onto metal sheets to make brass. This chemical can be found in minimal quantities by grinding brass sheets.\
|
||||
<li><b>Brass Flasks:</b>Intended to store Zelus Oil in, but can also be used as fragile single use throwing weapons in a pinch! \
|
||||
These are crafted with a single sheet of brass and fit in the Clockwork Cuirass' suit storage.\
|
||||
<b>Good luck!</b>"
|
||||
|
||||
/obj/item/paper/servant_primer/Initialize()
|
||||
|
||||
@@ -42,18 +42,19 @@
|
||||
var/obj/item/clothing/C
|
||||
if(!H.w_uniform || H.dropItemToGround(H.w_uniform))
|
||||
C = new /obj/item/clothing/under/rank/clown(H)
|
||||
C.item_flags |= NODROP //mwahaha
|
||||
ADD_TRAIT(C, TRAIT_NODROP, CLOWN_NUKE_TRAIT)
|
||||
H.equip_to_slot_or_del(C, SLOT_W_UNIFORM)
|
||||
|
||||
if(!H.shoes || H.dropItemToGround(H.shoes))
|
||||
C = new /obj/item/clothing/shoes/clown_shoes(H)
|
||||
C.item_flags |= NODROP
|
||||
ADD_TRAIT(C, TRAIT_NODROP, CLOWN_NUKE_TRAIT)
|
||||
H.equip_to_slot_or_del(C, SLOT_SHOES)
|
||||
|
||||
if(!H.wear_mask || H.dropItemToGround(H.wear_mask))
|
||||
C = new /obj/item/clothing/mask/gas/clown_hat(H)
|
||||
C.item_flags |= NODROP
|
||||
ADD_TRAIT(C, TRAIT_NODROP, CLOWN_NUKE_TRAIT)
|
||||
H.equip_to_slot_or_del(C, SLOT_WEAR_MASK)
|
||||
|
||||
H.dna.add_mutation(CLOWNMUT)
|
||||
H.dna.add_mutation(SMILE)
|
||||
H.gain_trauma(/datum/brain_trauma/mild/phobia, TRAUMA_RESILIENCE_LOBOTOMY, "clowns") //MWA HA HA
|
||||
|
||||
@@ -58,6 +58,7 @@
|
||||
if(visualsOnly)
|
||||
return
|
||||
H.dna.add_mutation(CLOWNMUT)
|
||||
H.dna.add_mutation(SMILE)
|
||||
|
||||
/datum/outfit/syndicate/clownop/leader
|
||||
name = "Clown Operative Leader - Basic"
|
||||
|
||||
@@ -216,11 +216,11 @@
|
||||
|
||||
/obj/item/clothing/mask/fakemoustache/sticky/Initialize()
|
||||
. = ..()
|
||||
item_flags |= NODROP
|
||||
ADD_TRAIT(src, TRAIT_NODROP, STICKY_MOUSTACHE_TRAIT)
|
||||
addtimer(CALLBACK(src, .proc/unstick), unstick_time)
|
||||
|
||||
/obj/item/clothing/mask/fakemoustache/sticky/proc/unstick()
|
||||
item_flags &= ~NODROP
|
||||
ADD_TRAIT(src, TRAIT_NODROP, STICKY_MOUSTACHE_TRAIT)
|
||||
|
||||
//DARK H.O.N.K. AND CLOWN MECH WEAPONS
|
||||
|
||||
|
||||
@@ -96,10 +96,10 @@ GLOBAL_LIST_EMPTY(announcement_systems)
|
||||
message = "The arrivals shuttle has been damaged. Docking for repairs..."
|
||||
|
||||
if(channels.len == 0)
|
||||
radio.talk_into(src, message, null, list(SPAN_ROBOT), get_default_language())
|
||||
radio.talk_into(src, message, null)
|
||||
else
|
||||
for(var/channel in channels)
|
||||
radio.talk_into(src, message, channel, list(SPAN_ROBOT), get_default_language())
|
||||
radio.talk_into(src, message, channel)
|
||||
|
||||
//config stuff
|
||||
|
||||
|
||||
@@ -49,12 +49,9 @@
|
||||
if(next_warning < world.time && prob(15))
|
||||
var/area/A = get_area(loc)
|
||||
var/message = "Unauthorized credit withdrawal underway in [A.map_name]!!"
|
||||
radio.talk_into(src, message, radio_channel, get_spans())
|
||||
radio.talk_into(src, message, radio_channel)
|
||||
next_warning = world.time + minimum_time_between_warnings
|
||||
|
||||
/obj/machinery/computer/bank_machine/get_spans()
|
||||
. = ..() | SPAN_ROBOT
|
||||
|
||||
/obj/machinery/computer/bank_machine/ui_interact(mob/user)
|
||||
. = ..()
|
||||
var/dat = "[station_name()] secure vault. Authorized personnel only.<br>"
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
#define CLONE_INITIAL_DAMAGE 150 //Clones in clonepods start with 150 cloneloss damage and 150 brainloss damage, thats just logical
|
||||
#define MINIMUM_HEAL_LEVEL 40
|
||||
|
||||
#define SPEAK(message) radio.talk_into(src, message, radio_channel, get_spans(), get_default_language())
|
||||
#define SPEAK(message) radio.talk_into(src, message, radio_channel)
|
||||
|
||||
/obj/machinery/clonepod
|
||||
name = "cloning pod"
|
||||
|
||||
@@ -31,7 +31,6 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new)
|
||||
|
||||
var/list/jobs = new/list()
|
||||
jobs["Captain"] = 00
|
||||
jobs["Head of Personnel"] = 50
|
||||
jobs["Head of Security"] = 10
|
||||
jobs["Warden"] = 11
|
||||
jobs["Security Officer"] = 12
|
||||
@@ -47,9 +46,10 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new)
|
||||
jobs["Chief Engineer"] = 40
|
||||
jobs["Station Engineer"] = 41
|
||||
jobs["Atmospheric Technician"] = 42
|
||||
jobs["Quartermaster"] = 51
|
||||
jobs["Shaft Miner"] = 52
|
||||
jobs["Cargo Technician"] = 53
|
||||
jobs["Quartermaster"] = 50
|
||||
jobs["Shaft Miner"] = 51
|
||||
jobs["Cargo Technician"] = 52
|
||||
jobs["Head of Personnel"] = 60
|
||||
jobs["Bartender"] = 61
|
||||
jobs["Cook"] = 62
|
||||
jobs["Botanist"] = 63
|
||||
|
||||
@@ -69,7 +69,7 @@
|
||||
if(defib)
|
||||
to_chat(user, "<span class='warning'>There's already a defibrillator in [src]!</span>")
|
||||
return
|
||||
if(I.item_flags & NODROP || !user.transferItemToLoc(I, src))
|
||||
if(HAS_TRAIT(I, TRAIT_NODROP) || !user.transferItemToLoc(I, src))
|
||||
to_chat(user, "<span class='warning'>[I] is stuck to your hand!</span>")
|
||||
return
|
||||
user.visible_message("<span class='notice'>[user] hooks up [I] to [src]!</span>", \
|
||||
|
||||
@@ -65,7 +65,7 @@
|
||||
if(!isitem(A))
|
||||
continue
|
||||
var/obj/item/I = A
|
||||
if(!(I.item_flags & NODROP))
|
||||
if(!HAS_TRAIT(I, TRAIT_NODROP))
|
||||
say("Subject may not have abiotic items on.")
|
||||
playsound(src, 'sound/machines/buzz-sigh.ogg', 30, 1)
|
||||
return
|
||||
|
||||
@@ -81,12 +81,6 @@
|
||||
to_chat(usr, "<span class='danger'>The drip beeps: Warning, incompatible creature!</span>")
|
||||
return
|
||||
|
||||
var/mob/living/L
|
||||
if(isliving(target))
|
||||
L = target
|
||||
if(!L.can_inject(usr, 1))
|
||||
return
|
||||
|
||||
if(Adjacent(target) && usr.Adjacent(target))
|
||||
if(beaker)
|
||||
usr.visible_message("<span class='warning'>[usr] attaches [src] to [target].</span>", "<span class='notice'>You attach [src] to [target].</span>")
|
||||
|
||||
@@ -323,7 +323,7 @@ GLOBAL_LIST_EMPTY(allConsoles)
|
||||
emergency = "Medical"
|
||||
if(radio_freq)
|
||||
Radio.set_frequency(radio_freq)
|
||||
Radio.talk_into(src,"[emergency] emergency in [department]!!",radio_freq,get_spans(),get_default_language())
|
||||
Radio.talk_into(src,"[emergency] emergency in [department]!!",radio_freq)
|
||||
update_icon()
|
||||
addtimer(CALLBACK(src, .proc/clear_emergency), 3000)
|
||||
|
||||
@@ -382,7 +382,7 @@ GLOBAL_LIST_EMPTY(allConsoles)
|
||||
screen = 6
|
||||
|
||||
if(radio_freq)
|
||||
Radio.talk_into(src,"[alert]: <i>[message]</i>",radio_freq,get_spans(),get_default_language())
|
||||
Radio.talk_into(src, "[alert]: <i>[message]</i>", radio_freq)
|
||||
|
||||
switch(priority)
|
||||
if(2)
|
||||
|
||||
@@ -305,7 +305,7 @@
|
||||
name = "\improper SRM-8 missile rack"
|
||||
desc = "A weapon for combat exosuits. Shoots light explosive missiles."
|
||||
icon_state = "mecha_missilerack"
|
||||
projectile = /obj/item/projectile/bullet/srmrocket
|
||||
projectile = /obj/item/projectile/bullet/a84mm_he
|
||||
fire_sound = 'sound/weapons/grenadelaunch.ogg'
|
||||
projectiles = 8
|
||||
projectile_energy_cost = 1000
|
||||
|
||||
@@ -537,7 +537,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()
|
||||
|
||||
@@ -219,7 +219,7 @@
|
||||
name = "stabilized plasma"
|
||||
desc = "A puddle of stabilized plasma."
|
||||
icon_state = "flour"
|
||||
color = "#C8A5DC"
|
||||
color = "#9e0089"
|
||||
|
||||
/obj/effect/decal/cleanable/insectguts
|
||||
name = "insect guts"
|
||||
|
||||
@@ -131,7 +131,7 @@
|
||||
var/obj/item/twohanded/required/chainsaw/doomslayer/chainsaw = new(victim.loc)
|
||||
victim.log_message("entered a blood frenzy", LOG_ATTACK)
|
||||
|
||||
chainsaw.item_flags |= NODROP
|
||||
ADD_TRAIT(chainsaw, TRAIT_NODROP, CHAINSAW_FRENZY_TRAIT)
|
||||
victim.drop_all_held_items()
|
||||
victim.put_in_hands(chainsaw, forced = TRUE)
|
||||
chainsaw.attack_self(victim)
|
||||
|
||||
@@ -30,6 +30,18 @@
|
||||
loot_spawned++
|
||||
return INITIALIZE_HINT_QDEL
|
||||
|
||||
/obj/effect/spawner/lootdrop/bedsheet
|
||||
icon = 'icons/obj/bedsheets.dmi'
|
||||
icon_state = "random_bedsheet"
|
||||
name = "random dorms bedsheet"
|
||||
loot = list(/obj/item/bedsheet = 8, /obj/item/bedsheet/blue = 8, /obj/item/bedsheet/green = 8,
|
||||
/obj/item/bedsheet/grey = 8, /obj/item/bedsheet/orange = 8, /obj/item/bedsheet/purple = 8,
|
||||
/obj/item/bedsheet/red = 8, /obj/item/bedsheet/yellow = 8, /obj/item/bedsheet/brown = 8,
|
||||
/obj/item/bedsheet/black = 8, /obj/item/bedsheet/patriot = 3, /obj/item/bedsheet/rainbow = 3,
|
||||
/obj/item/bedsheet/ian = 3, /obj/item/bedsheet/runtime = 3, /obj/item/bedsheet/nanotrasen = 3,
|
||||
/obj/item/bedsheet/pirate = 1, /obj/item/bedsheet/cosmos = 1, /obj/item/bedsheet/gondola = 1
|
||||
)
|
||||
|
||||
/obj/effect/spawner/lootdrop/armory_contraband
|
||||
name = "armory contraband gun spawner"
|
||||
lootdoubles = FALSE
|
||||
@@ -108,6 +120,33 @@
|
||||
loot = GLOB.maintenance_loot
|
||||
. = ..()
|
||||
|
||||
/obj/effect/spawner/lootdrop/glowstick
|
||||
name = "random colored glowstick"
|
||||
icon = 'icons/obj/lighting.dmi'
|
||||
icon_state = "random_glowstick"
|
||||
|
||||
/obj/effect/spawner/lootdrop/glowstick/Initialize()
|
||||
loot = typesof(/obj/item/flashlight/glowstick)
|
||||
. = ..()
|
||||
|
||||
|
||||
/obj/effect/spawner/lootdrop/gloves
|
||||
name = "random gloves"
|
||||
desc = "These gloves are supposed to be a random color..."
|
||||
icon = 'icons/obj/clothing/gloves.dmi'
|
||||
icon_state = "random_gloves"
|
||||
loot = list(
|
||||
/obj/item/clothing/gloves/color/orange = 1,
|
||||
/obj/item/clothing/gloves/color/red = 1,
|
||||
/obj/item/clothing/gloves/color/blue = 1,
|
||||
/obj/item/clothing/gloves/color/purple = 1,
|
||||
/obj/item/clothing/gloves/color/green = 1,
|
||||
/obj/item/clothing/gloves/color/grey = 1,
|
||||
/obj/item/clothing/gloves/color/light_brown = 1,
|
||||
/obj/item/clothing/gloves/color/brown = 1,
|
||||
/obj/item/clothing/gloves/color/white = 1,
|
||||
/obj/item/clothing/gloves/color/rainbow = 1)
|
||||
|
||||
/obj/effect/spawner/lootdrop/crate_spawner
|
||||
name = "lootcrate spawner" //USE PROMO CODE "SELLOUT" FOR 20% OFF!
|
||||
lootdoubles = FALSE
|
||||
|
||||
@@ -230,9 +230,6 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
|
||||
research_msg += "."
|
||||
to_chat(user, research_msg.Join())
|
||||
|
||||
/obj/item/proc/speechModification(message) //for message modding by mask slot.
|
||||
return message
|
||||
|
||||
/obj/item/interact(mob/user)
|
||||
add_fingerprint(user)
|
||||
ui_interact(user)
|
||||
@@ -647,11 +644,6 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
|
||||
else
|
||||
. = ""
|
||||
|
||||
|
||||
//when an item modify our speech spans when in our active hand. Override this to modify speech spans.
|
||||
/obj/item/proc/get_held_item_speechspans(mob/living/carbon/user)
|
||||
return
|
||||
|
||||
/obj/item/hitby(atom/movable/AM)
|
||||
return
|
||||
|
||||
@@ -825,6 +817,6 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
|
||||
return ..()
|
||||
|
||||
/obj/item/throw_at(atom/target, range, speed, mob/thrower, spin=TRUE, diagonals_first = FALSE, var/datum/callback/callback)
|
||||
if (item_flags & NODROP)
|
||||
if (HAS_TRAIT(src, TRAIT_NODROP))
|
||||
return
|
||||
return ..()
|
||||
|
||||
@@ -414,10 +414,12 @@ RLD
|
||||
return FALSE
|
||||
if(do_after(user, rcd_results["delay"] * delay_mod, target = A))
|
||||
if(checkResource(rcd_results["cost"], user))
|
||||
var/atom/cached = A
|
||||
if(A.rcd_act(user, src, rcd_results["mode"]))
|
||||
useResource(rcd_results["cost"], user)
|
||||
activate()
|
||||
playsound(src.loc, 'sound/machines/click.ogg', 50, 1)
|
||||
investigate_log("[user] used [src] on [cached] (now [A]) with cost [rcd_results["cost"]], delay [rcd_results["delay"]], mode [rcd_results["mode"]].", INVESTIGATE_RCD)
|
||||
playsound(src, 'sound/machines/click.ogg', 50, 1)
|
||||
return TRUE
|
||||
|
||||
/obj/item/construction/rcd/Initialize()
|
||||
@@ -622,6 +624,7 @@ RLD
|
||||
sheetmultiplier = 16
|
||||
var/mode = LIGHT_MODE
|
||||
actions_types = list(/datum/action/item_action/pick_color)
|
||||
ammo_sections = 5
|
||||
|
||||
var/wallcost = 10
|
||||
var/floorcost = 15
|
||||
@@ -642,7 +645,7 @@ RLD
|
||||
..()
|
||||
|
||||
/obj/item/construction/rld/update_icon()
|
||||
icon_state = "rld-[round(matter/35)]"
|
||||
icon_state = "rld-[round((matter/max_matter) * 5, 1)]"
|
||||
..()
|
||||
|
||||
|
||||
|
||||
@@ -233,6 +233,10 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list(
|
||||
playsound(get_turf(user), 'sound/items/deconstruct.ogg', 50, 1)
|
||||
return(BRUTELOSS)
|
||||
|
||||
/obj/item/pipe_dispenser/ui_base_html(html)
|
||||
var/datum/asset/spritesheet/assets = get_asset_datum(/datum/asset/spritesheet/pipes)
|
||||
. = replacetext(html, "<!--customheadhtml-->", assets.css_tag())
|
||||
|
||||
/obj/item/pipe_dispenser/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \
|
||||
datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
|
||||
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
|
||||
|
||||
@@ -48,7 +48,7 @@
|
||||
icon_state = "chronogun"
|
||||
item_state = "chronogun"
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
item_flags = NODROP | DROPDEL
|
||||
item_flags = DROPDEL
|
||||
ammo_type = list(/obj/item/ammo_casing/energy/chrono_beam)
|
||||
can_charge = 0
|
||||
fire_delay = 50
|
||||
@@ -58,6 +58,7 @@
|
||||
|
||||
/obj/item/gun/energy/chrono_gun/Initialize()
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_NODROP, CHRONO_GUN_TRAIT)
|
||||
if(istype(loc, /obj/item/chrono_eraser))
|
||||
TED = loc
|
||||
else //admin must have spawned it
|
||||
@@ -150,8 +151,8 @@
|
||||
gun = loc
|
||||
. = ..()
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/obj/effect/chrono_field
|
||||
|
||||
@@ -19,6 +19,9 @@
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/toy/plush/carpplushie/dehy_carp/plop(obj/item/toy/plush/Daddy)
|
||||
return FALSE
|
||||
|
||||
/obj/item/toy/plush/carpplushie/dehy_carp/proc/Swell()
|
||||
desc = "It's growing!"
|
||||
visible_message("<span class='notice'>[src] swells up!</span>")
|
||||
|
||||
@@ -23,7 +23,7 @@ GLOBAL_LIST_EMPTY(PDAs)
|
||||
/obj/item/pda
|
||||
name = "\improper PDA"
|
||||
desc = "A portable microcomputer by Thinktronic Systems, LTD. Functionality determined by a preprogrammed ROM cartridge."
|
||||
icon = 'icons/obj/pda.dmi'
|
||||
icon = 'icons/obj/pda_alt.dmi'
|
||||
icon_state = "pda"
|
||||
item_state = "electronic"
|
||||
lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
|
||||
@@ -68,7 +68,6 @@ GLOBAL_LIST_EMPTY(PDAs)
|
||||
var/last_everyone //No text for everyone spamming
|
||||
var/last_noise //Also no honk spamming that's bad too
|
||||
var/ttone = "beep" //The ringtone!
|
||||
var/lock_code = "" // Lockcode to unlock uplink
|
||||
var/honkamt = 0 //How many honks left when infected with honk.exe
|
||||
var/mimeamt = 0 //How many silence left when infected with mime.exe
|
||||
var/note = "Congratulations, your station has chosen the Thinktronic 5230 Personal Data Assistant! To help with navigation, we have provided the following definitions. North: Fore. South: Aft. West: Port. East: Starboard. Quarter is either side of aft." //Current note in the notepad function
|
||||
@@ -123,7 +122,7 @@ GLOBAL_LIST_EMPTY(PDAs)
|
||||
inserted_item = new inserted_item(src)
|
||||
else
|
||||
inserted_item = new /obj/item/pen(src)
|
||||
update_icon()
|
||||
update_icon(FALSE, TRUE)
|
||||
|
||||
/obj/item/pda/CtrlShiftClick(mob/living/user)
|
||||
. = ..()
|
||||
@@ -144,8 +143,7 @@ GLOBAL_LIST_EMPTY(PDAs)
|
||||
if(QDELETED(src) || isnull(new_icon) || new_icon == icon || M.incapacitated() || !in_range(M,src))
|
||||
return
|
||||
icon = new_icon
|
||||
set_new_overlays()
|
||||
update_icon()
|
||||
update_icon(FALSE, TRUE)
|
||||
to_chat(M, "[src] is now skinned as '[choice]'.")
|
||||
|
||||
/obj/item/pda/proc/set_new_overlays()
|
||||
@@ -187,8 +185,7 @@ GLOBAL_LIST_EMPTY(PDAs)
|
||||
var/pref_skin = GLOB.pda_reskins[user.client.prefs.pda_skin]
|
||||
if(icon != pref_skin)
|
||||
icon = pref_skin
|
||||
set_new_overlays()
|
||||
update_icon()
|
||||
update_icon(FALSE, TRUE)
|
||||
equipped = TRUE
|
||||
|
||||
/obj/item/pda/proc/update_label()
|
||||
@@ -203,7 +200,9 @@ GLOBAL_LIST_EMPTY(PDAs)
|
||||
/obj/item/pda/GetID()
|
||||
return id
|
||||
|
||||
/obj/item/pda/update_icon(alert = FALSE)
|
||||
/obj/item/pda/update_icon(alert = FALSE, new_overlays = FALSE)
|
||||
if(new_overlays)
|
||||
set_new_overlays()
|
||||
cut_overlays()
|
||||
add_overlay(alert ? current_overlays[PDA_OVERLAY_ALERT] : current_overlays[PDA_OVERLAY_SCREEN])
|
||||
var/mutable_appearance/overlay = new()
|
||||
|
||||
@@ -87,7 +87,7 @@
|
||||
|
||||
/obj/item/cartridge/detective
|
||||
name = "\improper D.E.T.E.C.T. cartridge"
|
||||
icon_state = "cart-s"
|
||||
icon_state = "cart-eye"
|
||||
access = CART_SECURITY | CART_MEDICAL | CART_MANIFEST
|
||||
bot_access_flags = SEC_BOT
|
||||
|
||||
@@ -100,23 +100,25 @@
|
||||
|
||||
/obj/item/cartridge/lawyer
|
||||
name = "\improper P.R.O.V.E. cartridge"
|
||||
icon_state = "cart-s"
|
||||
icon_state = "cart-law"
|
||||
access = CART_SECURITY
|
||||
spam_enabled = 1
|
||||
|
||||
/obj/item/cartridge/curator
|
||||
name = "\improper Lib-Tweet cartridge"
|
||||
icon_state = "cart-s"
|
||||
icon_state = "cart-lib"
|
||||
access = CART_NEWSCASTER
|
||||
|
||||
/obj/item/cartridge/roboticist
|
||||
name = "\improper B.O.O.P. Remote Control cartridge"
|
||||
desc = "Packed with heavy duty triple-bot interlink!"
|
||||
icon_state = "cart-robo"
|
||||
bot_access_flags = FLOOR_BOT | CLEAN_BOT | MED_BOT | FIRE_BOT
|
||||
access = CART_DRONEPHONE
|
||||
|
||||
/obj/item/cartridge/signal
|
||||
name = "generic signaler cartridge"
|
||||
icon_state = "cart-sig"
|
||||
desc = "A data cartridge with an integrated radio signaler module."
|
||||
|
||||
/obj/item/cartridge/signal/toxins
|
||||
|
||||
@@ -53,7 +53,6 @@
|
||||
|
||||
/obj/item/cartridge/virus/syndicate
|
||||
name = "\improper Detomatix cartridge"
|
||||
icon_state = "cart"
|
||||
access = CART_REMOTE_DOOR
|
||||
remote_door_id = "smindicate" //Make sure this matches the syndicate shuttle's shield/door id!! //don't ask about the name, testing.
|
||||
charges = 4
|
||||
@@ -85,7 +84,7 @@
|
||||
|
||||
/obj/item/cartridge/virus/frame
|
||||
name = "\improper F.R.A.M.E. cartridge"
|
||||
icon_state = "cart"
|
||||
icon_state = "cart-f"
|
||||
var/telecrystals = 0
|
||||
|
||||
/obj/item/cartridge/virus/frame/send_virus(obj/item/pda/target, mob/living/U)
|
||||
@@ -99,7 +98,7 @@
|
||||
GET_COMPONENT_FROM(hidden_uplink, /datum/component/uplink, target)
|
||||
if(!hidden_uplink)
|
||||
hidden_uplink = target.AddComponent(/datum/component/uplink)
|
||||
target.lock_code = lock_code
|
||||
hidden_uplink.unlock_code = lock_code
|
||||
else
|
||||
hidden_uplink.hidden_crystals += hidden_uplink.telecrystals //Temporarially hide the PDA's crystals, so you can't steal telecrystals.
|
||||
hidden_uplink.telecrystals = telecrystals
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
var/eject_port = "ingestion"
|
||||
var/escape_in_progress = FALSE
|
||||
var/message_cooldown
|
||||
var/breakout_time = 300
|
||||
var/breakout_time = 150
|
||||
var/tmp/last_hearcheck = 0
|
||||
var/tmp/list/hearing_mobs
|
||||
var/list/items_preserved = list()
|
||||
@@ -77,7 +77,7 @@
|
||||
to_chat(user, "<span class='warning'>Your [src] is already occupied.</span>")
|
||||
return
|
||||
user.visible_message("<span class='warning'>[hound.name] is carefully inserting [target.name] into their [src].</span>", "<span class='notice'>You start placing [target] into your [src]...</span>")
|
||||
if(!patient && iscarbon(target) && !target.buckled && do_after (user, 50, target = target))
|
||||
if(!patient && iscarbon(target) && !target.buckled && do_after (user, 100, target = target))
|
||||
|
||||
if(!in_range(src, target)) //Proximity is probably old news by now, do a new check.
|
||||
return //If they moved away, you can't eat them.
|
||||
@@ -420,6 +420,7 @@
|
||||
desc = "Equipment for medical hound. A mounted sleeper that stabilizes patients and can inject reagents in the borg's reserves."
|
||||
icon = 'icons/mob/dogborg.dmi'
|
||||
icon_state = "sleeper"
|
||||
breakout_time = 30 //Medical sleepers should be designed to be as easy as possible to get out of.
|
||||
|
||||
/obj/item/dogborg/sleeper/K9 //The K9 portabrig
|
||||
name = "Mobile Brig"
|
||||
@@ -429,6 +430,7 @@
|
||||
inject_amount = 0
|
||||
min_health = -100
|
||||
injection_chems = null //So they don't have all the same chems as the medihound!
|
||||
breakout_time = 300
|
||||
|
||||
/obj/item/storage/attackby(obj/item/dogborg/sleeper/K9, mob/user, proximity)
|
||||
if(istype(K9))
|
||||
|
||||
@@ -512,17 +512,6 @@
|
||||
name = "pink glowstick"
|
||||
color = LIGHT_COLOR_PINK
|
||||
|
||||
/obj/item/flashlight/glowstick/random
|
||||
name = "random colored glowstick"
|
||||
icon_state = "random_glowstick"
|
||||
color = null
|
||||
|
||||
/obj/item/flashlight/glowstick/random/Initialize()
|
||||
..()
|
||||
var/T = pick(typesof(/obj/item/flashlight/glowstick) - /obj/item/flashlight/glowstick/random)
|
||||
new T(loc)
|
||||
return INITIALIZE_HINT_QDEL
|
||||
|
||||
/obj/item/flashlight/spotlight //invisible lighting source
|
||||
name = "disco light"
|
||||
desc = "Groovy..."
|
||||
|
||||
@@ -19,11 +19,11 @@
|
||||
return
|
||||
if(istype(target, /obj/item))
|
||||
var/obj/item/I = target
|
||||
if(I.item_flags & NODROP)
|
||||
if(HAS_TRAIT_FROM(I, TRAIT_NODROP, GLUED_ITEM_TRAIT))
|
||||
to_chat(user, "<span class='warning'>[I] is already sticky!</span>")
|
||||
return
|
||||
uses -= 1
|
||||
I.item_flags |= NODROP
|
||||
ADD_TRAIT(I, TRAIT_NODROP, GLUED_ITEM_TRAIT)
|
||||
I.desc += " It looks sticky."
|
||||
to_chat(user, "<span class='notice'>You smear the [I] with glue, making it incredibly sticky!</span>")
|
||||
if(uses == 0)
|
||||
|
||||
@@ -156,7 +156,10 @@ GLOBAL_LIST_EMPTY(GPS_list)
|
||||
icon_state = "gps-b"
|
||||
gpstag = "BORG0"
|
||||
desc = "A mining cyborg internal positioning system. Used as a recovery beacon for damaged cyborg assets, or a collaboration tool for mining teams."
|
||||
item_flags = NODROP
|
||||
|
||||
/obj/item/gps/cyborg/Initialize()
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_NODROP, CYBORG_ITEM_TRAIT)
|
||||
|
||||
/obj/item/gps/internal
|
||||
icon_state = null
|
||||
|
||||
@@ -234,11 +234,18 @@
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
actions_types = list(/datum/action/item_action/instrument)
|
||||
|
||||
/obj/item/instrument/harmonica/speechModification(message)
|
||||
/obj/item/instrument/harmonica/proc/handle_speech(datum/source, list/speech_args)
|
||||
if(song.playing && ismob(loc))
|
||||
to_chat(loc, "<span class='warning'>You stop playing the harmonica to talk...</span>")
|
||||
song.playing = FALSE
|
||||
return message
|
||||
|
||||
/obj/item/instrument/harmonica/equipped(mob/M, slot)
|
||||
. = ..()
|
||||
RegisterSignal(M, COMSIG_MOB_SAY, .proc/handle_speech)
|
||||
|
||||
/obj/item/instrument/harmonica/dropped(mob/M)
|
||||
. = ..()
|
||||
UnregisterSignal(M, COMSIG_MOB_SAY)
|
||||
|
||||
/obj/item/instrument/bikehorn
|
||||
name = "gilded bike horn"
|
||||
|
||||
@@ -17,13 +17,25 @@
|
||||
user.say("AAAAAAAAAAAARGHHHHH", forced="megaphone suicide")//he must have died while coding this
|
||||
return OXYLOSS
|
||||
|
||||
/obj/item/megaphone/get_held_item_speechspans(mob/living/carbon/user)
|
||||
if(spamcheck > world.time)
|
||||
to_chat(user, "<span class='warning'>\The [src] needs to recharge!</span>")
|
||||
/obj/item/megaphone/equipped(mob/M, slot)
|
||||
. = ..()
|
||||
if (slot == SLOT_HANDS)
|
||||
RegisterSignal(M, COMSIG_MOB_SAY, .proc/handle_speech)
|
||||
else
|
||||
playsound(loc, 'sound/items/megaphone.ogg', 100, 0, 1)
|
||||
spamcheck = world.time + 50
|
||||
return voicespan
|
||||
UnregisterSignal(M, COMSIG_MOB_SAY)
|
||||
|
||||
/obj/item/megaphone/dropped(mob/M)
|
||||
. = ..()
|
||||
UnregisterSignal(M, COMSIG_MOB_SAY)
|
||||
|
||||
/obj/item/megaphone/proc/handle_speech(mob/living/carbon/user, list/speech_args)
|
||||
if (user.get_active_held_item() == src)
|
||||
if(spamcheck > world.time)
|
||||
to_chat(user, "<span class='warning'>\The [src] needs to recharge!</span>")
|
||||
else
|
||||
playsound(loc, 'sound/items/megaphone.ogg', 100, 0, 1)
|
||||
spamcheck = world.time + 50
|
||||
speech_args[SPEECH_SPANS] |= voicespan
|
||||
|
||||
/obj/item/megaphone/emag_act(mob/user)
|
||||
. = ..()
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
|
||||
/obj/item/electropack/attackby(obj/item/W, mob/user, params)
|
||||
if(istype(W, /obj/item/clothing/head/helmet))
|
||||
var/obj/item/assembly/shock_kit/A = new /obj/item/assembly/shock_kit( user )
|
||||
var/obj/item/assembly/shock_kit/A = new /obj/item/assembly/shock_kit(user)
|
||||
A.icon = 'icons/obj/assemblies.dmi'
|
||||
|
||||
if(!user.transferItemToLoc(W, A))
|
||||
@@ -53,8 +53,6 @@
|
||||
|
||||
user.put_in_hands(A)
|
||||
A.add_fingerprint(user)
|
||||
if(item_flags & NODROP)
|
||||
A.item_flags |= NODROP
|
||||
else
|
||||
return ..()
|
||||
|
||||
@@ -106,8 +104,7 @@
|
||||
if(shock_cooldown != 0)
|
||||
return
|
||||
shock_cooldown = 1
|
||||
spawn(100)
|
||||
shock_cooldown = 0
|
||||
addtimer(VARSET_CALLBACK(src, shock_cooldown, 0), 100)
|
||||
var/mob/living/L = loc
|
||||
step(L, pick(GLOB.cardinals))
|
||||
|
||||
|
||||
@@ -16,7 +16,6 @@
|
||||
|
||||
var/on = TRUE
|
||||
var/frequency = FREQ_COMMON
|
||||
var/traitor_frequency = 0 // If tuned to this frequency, uplink will be unlocked.
|
||||
var/canhear_range = 3 // The range around the radio in which mobs can hear what it receives.
|
||||
var/emped = 0 // Tracks the number of EMPs currently stacked.
|
||||
|
||||
@@ -190,7 +189,7 @@
|
||||
|
||||
/obj/item/radio/talk_into(atom/movable/M, message, channel, list/spans, datum/language/language)
|
||||
if(!spans)
|
||||
spans = M.get_spans()
|
||||
spans = list(M.speech_span)
|
||||
if(!language)
|
||||
language = M.get_default_language()
|
||||
INVOKE_ASYNC(src, .proc/talk_into_impl, M, message, channel, spans.Copy(), language)
|
||||
|
||||
@@ -49,7 +49,7 @@
|
||||
if(iscarbon(user))
|
||||
var/mob/living/carbon/C = user
|
||||
if(C.get_item_by_slot(SLOT_HEAD) == src)
|
||||
if((item_flags & NODROP) && !struggling)
|
||||
if(HAS_TRAIT_FROM(src, TRAIT_NODROP, REVERSE_BEAR_TRAP_TRAIT) && !struggling)
|
||||
struggling = TRUE
|
||||
var/fear_string
|
||||
switch(time_left)
|
||||
@@ -74,7 +74,7 @@
|
||||
else
|
||||
user.visible_message("<span class='warning'>The lock on [user]'s [name] pops open!</span>", \
|
||||
"<span class='userdanger'>You force open the padlock!</span>", "<i>You hear a single, pronounced click!</i>")
|
||||
item_flags &= ~NODROP
|
||||
REMOVE_TRAIT(src, TRAIT_NODROP, REVERSE_BEAR_TRAP_TRAIT)
|
||||
struggling = FALSE
|
||||
else
|
||||
..()
|
||||
@@ -116,7 +116,7 @@
|
||||
|
||||
/obj/item/reverse_bear_trap/proc/reset()
|
||||
ticking = FALSE
|
||||
item_flags &= ~NODROP
|
||||
REMOVE_TRAIT(src, TRAIT_NODROP, REVERSE_BEAR_TRAP_TRAIT)
|
||||
soundloop.stop()
|
||||
soundloop2.stop()
|
||||
STOP_PROCESSING(SSprocessing, src)
|
||||
@@ -125,7 +125,7 @@
|
||||
ticking = TRUE
|
||||
escape_chance = initial(escape_chance) //we keep these vars until re-arm, for tracking purposes
|
||||
time_left = initial(time_left)
|
||||
item_flags |= NODROP
|
||||
ADD_TRAIT(src, TRAIT_NODROP, REVERSE_BEAR_TRAP_TRAIT)
|
||||
soundloop.start()
|
||||
soundloop2.mid_length = initial(soundloop2.mid_length)
|
||||
soundloop2.start()
|
||||
|
||||
@@ -279,12 +279,8 @@
|
||||
/obj/item/book/granter/spell/barnyard/recoil(mob/living/carbon/user)
|
||||
if(ishuman(user))
|
||||
to_chat(user,"<font size='15' color='red'><b>HORSIE HAS RISEN</b></font>")
|
||||
var/obj/item/clothing/mask/horsehead/magichead = new /obj/item/clothing/mask/horsehead
|
||||
magichead.item_flags |= NODROP //curses!
|
||||
magichead.flags_inv &= ~HIDEFACE //so you can still see their face
|
||||
magichead.voicechange = TRUE //NEEEEIIGHH
|
||||
if(!user.dropItemToGround(user.wear_mask))
|
||||
qdel(user.wear_mask)
|
||||
var/obj/item/clothing/magichead = new /obj/item/clothing/mask/horsehead/cursed(user.drop_location())
|
||||
user.dropItemToGround(user.wear_mask, TRUE)
|
||||
user.equip_to_slot_if_possible(magichead, SLOT_WEAR_MASK, TRUE, TRUE)
|
||||
qdel(src)
|
||||
else
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
name = "artistic toolbox"
|
||||
desc = "A toolbox painted bright green. Looking at it makes you feel uneasy."
|
||||
icon_state = "his_grace"
|
||||
item_state = "artistic_toolbox"
|
||||
item_state = "toolbox_green"
|
||||
lefthand_file = 'icons/mob/inhands/equipment/toolbox_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/equipment/toolbox_righthand.dmi'
|
||||
icon = 'icons/obj/items_and_weapons.dmi'
|
||||
@@ -90,7 +90,7 @@
|
||||
do_attack_animation(master, null, src)
|
||||
master.emote("scream")
|
||||
master.remove_status_effect(STATUS_EFFECT_HISGRACE)
|
||||
item_flags &= ~NODROP
|
||||
REMOVE_TRAIT(src, TRAIT_NODROP, HIS_GRACE_TRAIT)
|
||||
master.Knockdown(60)
|
||||
master.adjustBruteLoss(master.maxHealth)
|
||||
playsound(master, 'sound/effects/splat.ogg', 100, 0)
|
||||
@@ -198,20 +198,20 @@
|
||||
update_stats()
|
||||
|
||||
/obj/item/his_grace/proc/update_stats()
|
||||
item_flags &= ~NODROP
|
||||
REMOVE_TRAIT(src, TRAIT_NODROP, HIS_GRACE_TRAIT)
|
||||
var/mob/living/master = get_atom_on_turf(src, /mob/living)
|
||||
switch(bloodthirst)
|
||||
if(HIS_GRACE_CONSUME_OWNER to HIS_GRACE_FALL_ASLEEP)
|
||||
if(HIS_GRACE_CONSUME_OWNER > prev_bloodthirst)
|
||||
master.visible_message("<span class='userdanger'>[src] enters a frenzy!</span>")
|
||||
if(HIS_GRACE_STARVING to HIS_GRACE_CONSUME_OWNER)
|
||||
item_flags |= NODROP
|
||||
ADD_TRAIT(src, TRAIT_NODROP, HIS_GRACE_TRAIT)
|
||||
if(HIS_GRACE_STARVING > prev_bloodthirst)
|
||||
master.visible_message("<span class='boldwarning'>[src] is starving!</span>", "<span class='his_grace big'>[src]'s bloodlust overcomes you. [src] must be fed, or you will become His meal.\
|
||||
[force_bonus < 15 ? " And still, His power grows.":""]</span>")
|
||||
force_bonus = max(force_bonus, 15)
|
||||
if(HIS_GRACE_FAMISHED to HIS_GRACE_STARVING)
|
||||
item_flags |= NODROP
|
||||
ADD_TRAIT(src, TRAIT_NODROP, HIS_GRACE_TRAIT)
|
||||
if(HIS_GRACE_FAMISHED > prev_bloodthirst)
|
||||
master.visible_message("<span class='warning'>[src] is very hungry!</span>", "<span class='his_grace big'>Spines sink into your hand. [src] must feed immediately.\
|
||||
[force_bonus < 10 ? " His power grows.":""]</span>")
|
||||
|
||||
@@ -280,12 +280,19 @@
|
||||
righthand_file = 'icons/mob/inhands/items_righthand.dmi'
|
||||
name = "god hand"
|
||||
desc = "This hand of yours glows with an awesome power!"
|
||||
item_flags = ABSTRACT | NODROP | DROPDEL
|
||||
item_flags = ABSTRACT | DROPDEL
|
||||
w_class = WEIGHT_CLASS_HUGE
|
||||
hitsound = 'sound/weapons/sear.ogg'
|
||||
damtype = BURN
|
||||
attack_verb = list("punched", "cross countered", "pummeled")
|
||||
|
||||
|
||||
/obj/item/nullrod/godhand/Initialize()
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_NODROP, HAND_REPLACEMENT_TRAIT)
|
||||
|
||||
|
||||
|
||||
/obj/item/nullrod/staff
|
||||
icon_state = "godstaff-red"
|
||||
item_state = "godstaff-red"
|
||||
@@ -525,13 +532,14 @@
|
||||
lefthand_file = 'icons/mob/inhands/weapons/chainsaw_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/weapons/chainsaw_righthand.dmi'
|
||||
w_class = WEIGHT_CLASS_HUGE
|
||||
item_flags = NODROP | ABSTRACT
|
||||
item_flags = ABSTRACT
|
||||
sharpness = IS_SHARP
|
||||
attack_verb = list("sawed", "torn", "cut", "chopped", "diced")
|
||||
hitsound = 'sound/weapons/chainsawhit.ogg'
|
||||
|
||||
/obj/item/nullrod/chainsaw/Initialize()
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_NODROP, HAND_REPLACEMENT_TRAIT)
|
||||
AddComponent(/datum/component/butchering, 30, 100, 0, hitsound)
|
||||
|
||||
/obj/item/nullrod/clown
|
||||
@@ -601,12 +609,13 @@
|
||||
item_state = "arm_blade"
|
||||
lefthand_file = 'icons/mob/inhands/antag/changeling_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/antag/changeling_righthand.dmi'
|
||||
item_flags = ABSTRACT | NODROP
|
||||
item_flags = ABSTRACT
|
||||
w_class = WEIGHT_CLASS_HUGE
|
||||
sharpness = IS_SHARP
|
||||
|
||||
/obj/item/nullrod/armblade/Initialize()
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_NODROP, HAND_REPLACEMENT_TRAIT)
|
||||
AddComponent(/datum/component/butchering, 80, 70)
|
||||
|
||||
/obj/item/nullrod/armblade/tentacle
|
||||
|
||||
@@ -134,7 +134,7 @@
|
||||
return
|
||||
update_icon()
|
||||
if(sticky)
|
||||
item_flags |= NODROP
|
||||
ADD_TRAIT(src, TRAIT_NODROP, HOT_POTATO_TRAIT)
|
||||
name = "primed [name]"
|
||||
activation_time = timer + world.time
|
||||
detonation_timerid = addtimer(CALLBACK(src, .proc/detonate), delay, TIMER_STOPPABLE)
|
||||
@@ -147,7 +147,7 @@
|
||||
/obj/item/hot_potato/proc/deactivate()
|
||||
update_icon()
|
||||
name = initial(name)
|
||||
item_flags &= ~NODROP
|
||||
REMOVE_TRAIT(src, TRAIT_NODROP, HOT_POTATO_TRAIT)
|
||||
deltimer(detonation_timerid)
|
||||
STOP_PROCESSING(SSfastprocess, src)
|
||||
detonation_timerid = null
|
||||
|
||||
@@ -42,7 +42,7 @@
|
||||
force = 20
|
||||
throwforce = 10
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
|
||||
attack_verb = list("attacked", "impaled", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
|
||||
sharpness = IS_SHARP
|
||||
|
||||
/obj/item/melee/synthetic_arm_blade/Initialize()
|
||||
@@ -92,8 +92,7 @@
|
||||
/obj/item/melee/sabre/suicide_act(mob/living/user)
|
||||
user.visible_message("<span class='suicide'>[user] is trying to cut off all [user.p_their()] limbs with [src]! it looks like [user.p_theyre()] trying to commit suicide!</span>")
|
||||
var/i = 0
|
||||
var/originally_nodropped = item_flags & NODROP
|
||||
item_flags |= NODROP
|
||||
ADD_TRAIT(src, TRAIT_NODROP, SABRE_SUICIDE_TRAIT)
|
||||
if(iscarbon(user))
|
||||
var/mob/living/carbon/Cuser = user
|
||||
var/obj/item/bodypart/holding_bodypart = Cuser.get_holding_bodypart_of_item(src)
|
||||
@@ -118,7 +117,7 @@
|
||||
for(bodypart in limbs_to_dismember)
|
||||
i++
|
||||
addtimer(CALLBACK(src, .proc/suicide_dismember, user, bodypart), speedbase * i)
|
||||
addtimer(CALLBACK(src, .proc/manual_suicide, user, originally_nodropped), (5 SECONDS) * i)
|
||||
addtimer(CALLBACK(src, .proc/manual_suicide, user), (5 SECONDS) * i)
|
||||
return MANUAL_SUICIDE
|
||||
|
||||
/obj/item/melee/sabre/proc/suicide_dismember(mob/living/user, obj/item/bodypart/affecting)
|
||||
@@ -131,8 +130,29 @@
|
||||
if(!QDELETED(user))
|
||||
user.adjustBruteLoss(200)
|
||||
user.death(FALSE)
|
||||
if(!originally_nodropped)
|
||||
item_flags &= ~NODROP
|
||||
REMOVE_TRAIT(src, TRAIT_NODROP, SABRE_SUICIDE_TRAIT)
|
||||
|
||||
/obj/item/melee/rapier
|
||||
name = "plastitanium rapier"
|
||||
desc = "A impossibly thin blade made of plastitanium with a tip made of diamond. It looks to be able to cut through any armor."
|
||||
icon = 'icons/obj/items_and_weapons.dmi'
|
||||
icon_state = "rapier"
|
||||
item_state = "rapier"
|
||||
lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
|
||||
force = 25
|
||||
throwforce = 35
|
||||
block_chance = 0
|
||||
armour_penetration = 100
|
||||
flags_1 = CONDUCT_1
|
||||
obj_flags = UNIQUE_RENAME
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
sharpness = IS_SHARP_ACCURATE //It cant be sharpend cook -_-
|
||||
attack_verb = list("slashed", "cut", "pierces", "pokes")
|
||||
|
||||
/obj/item/melee/rapier/Initialize()
|
||||
. = ..()
|
||||
AddComponent(/datum/component/butchering, 20, 65, 0)
|
||||
|
||||
/obj/item/melee/classic_baton
|
||||
name = "police baton"
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
var/mopping = 0
|
||||
var/mopcount = 0
|
||||
var/mopcap = 5
|
||||
var/stamusage = 5
|
||||
var/stamusage = 2
|
||||
force_string = "robust... against germs"
|
||||
var/insertable = TRUE
|
||||
|
||||
@@ -94,7 +94,7 @@
|
||||
force = 6
|
||||
throwforce = 8
|
||||
throw_range = 4
|
||||
stamusage = 2
|
||||
stamusage = 1
|
||||
var/refill_enabled = TRUE //Self-refill toggle for when a janitor decides to mop with something other than water.
|
||||
var/refill_rate = 1 //Rate per process() tick mop refills itself
|
||||
var/refill_reagent = "water" //Determins what reagent to use for refilling, just in case someone wanted to make a HOLY MOP OF PURGING
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
var/obj/item/toy/plush/plush_child
|
||||
var/obj/item/toy/plush/paternal_parent //who initiated creation
|
||||
var/obj/item/toy/plush/maternal_parent //who owns, see love()
|
||||
var/static/list/breeding_blacklist = typecacheof(/obj/item/toy/plush/carpplushie/dehy_carp) // you cannot have sexual relations with this plush
|
||||
var/list/scorned = list() //who the plush hates
|
||||
var/list/scorned_by = list() //who hates the plush, to remove external references on Destroy()
|
||||
var/heartbroken = FALSE
|
||||
@@ -203,9 +204,9 @@
|
||||
else if(Kisser.partner == src && !plush_child) //the one advancing does not take ownership of the child and we have a one child policy in the toyshop
|
||||
user.visible_message("<span class='notice'>[user] is going to break [Kisser] and [src] by bashing them like that.</span>",
|
||||
"<span class='notice'>[Kisser] passionately embraces [src] in your hands. Look away you perv!</span>")
|
||||
plop(Kisser)
|
||||
user.visible_message("<span class='notice'>Something drops at the feet of [user].</span>",
|
||||
"<span class='notice'>The miracle of oh god did that just come out of [src]?!</span>")
|
||||
if(plop(Kisser))
|
||||
user.visible_message("<span class='notice'>Something drops at the feet of [user].</span>",
|
||||
"<span class='notice'>The miracle of oh god did that just come out of [src]?!</span>")
|
||||
|
||||
//then comes protection, or abstinence if we are catholic
|
||||
else if(Kisser.partner == src && plush_child)
|
||||
@@ -271,7 +272,10 @@
|
||||
|
||||
/obj/item/toy/plush/proc/plop(obj/item/toy/plush/Daddy)
|
||||
if(partner != Daddy)
|
||||
return //we do not have bastards in our toyshop
|
||||
return FALSE //we do not have bastards in our toyshop
|
||||
|
||||
if(is_type_in_typecache(Daddy, breeding_blacklist))
|
||||
return FALSE // some love is forbidden
|
||||
|
||||
if(prob(50)) //it has my eyes
|
||||
plush_child = new type(get_turf(loc))
|
||||
@@ -574,10 +578,6 @@
|
||||
icon_state = "vulken"
|
||||
item_state = "vulken"
|
||||
|
||||
/obj/item/toy/plush/snakeplushie/jecca
|
||||
icon_state = "jecca"
|
||||
item_state = "jecca"
|
||||
|
||||
/obj/item/toy/plush/nukeplushie
|
||||
name = "operative plushie"
|
||||
desc = "A stuffed toy that resembles a syndicate nuclear operative. The tag claims operatives to be purely fictitious."
|
||||
@@ -630,13 +630,9 @@
|
||||
/obj/item/toy/plush/mothplushie
|
||||
name = "insect plushie"
|
||||
desc = "An adorable stuffed toy that resembles some kind of insect"
|
||||
icon_state = "cydia"
|
||||
item_state = "cydia"
|
||||
squeak_override = list('modular_citadel/sound/voice/mothsqueak.ogg' = 1)
|
||||
|
||||
/obj/item/toy/plush/mothplushie/bumble
|
||||
icon_state = "bumble"
|
||||
item_state = "bumble"
|
||||
squeak_override = list('modular_citadel/sound/voice/mothsqueak.ogg' = 1)
|
||||
|
||||
/obj/item/toy/plush/mothplushie/nameko
|
||||
icon_state = "nameko"
|
||||
|
||||
@@ -159,11 +159,13 @@
|
||||
armor = list("melee" = 25, "bullet" = 25, "laser" = 5, "energy" = 0, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 70, "acid" = 80)
|
||||
lefthand_file = 'icons/mob/inhands/equipment/shields_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/equipment/shields_righthand.dmi'
|
||||
item_state = "makeshift_shield"
|
||||
icon = 'icons/obj/items_and_weapons.dmi'
|
||||
item_state = "metal"
|
||||
icon_state = "makeshift_shield"
|
||||
materials = list(MAT_METAL = 18000)
|
||||
slot_flags = null
|
||||
block_chance = 25
|
||||
force = 5
|
||||
block_chance = 35
|
||||
force = 10
|
||||
throwforce = 7
|
||||
|
||||
/obj/item/shield/riot/tower
|
||||
@@ -171,8 +173,11 @@
|
||||
desc = "A massive shield that can block a lot of attacks, can take a lot of abuse before braking."
|
||||
armor = list("melee" = 95, "bullet" = 95, "laser" = 75, "energy" = 60, "bomb" = 90, "bio" = 90, "rad" = 0, "fire" = 90, "acid" = 10) //Armor for the item, dosnt transfer to user
|
||||
item_state = "metal"
|
||||
icon_state = "metal"
|
||||
icon = 'icons/obj/items_and_weapons.dmi'
|
||||
block_chance = 75 //1/4 shots will hit*
|
||||
force = 10
|
||||
force = 16
|
||||
slowdown = 2
|
||||
throwforce = 15 //Massive pice of metal
|
||||
w_class = WEIGHT_CLASS_HUGE
|
||||
item_flags = SLOWS_WHILE_IN_HAND
|
||||
|
||||
@@ -36,6 +36,7 @@ GLOBAL_LIST_INIT(human_recipes, list( \
|
||||
GLOBAL_LIST_INIT(gondola_recipes, list ( \
|
||||
new/datum/stack_recipe("gondola mask", /obj/item/clothing/mask/gondola, 1), \
|
||||
new/datum/stack_recipe("gondola suit", /obj/item/clothing/under/gondola, 2), \
|
||||
new/datum/stack_recipe("gondola bedsheet", /obj/item/bedsheet/gondola, 1), \
|
||||
))
|
||||
|
||||
/obj/item/stack/sheet/animalhide/gondola
|
||||
|
||||
@@ -424,6 +424,8 @@ GLOBAL_LIST_INIT(brass_recipes, list ( \
|
||||
new/datum/stack_recipe("receiver - brass skewer", /obj/structure/destructible/clockwork/trap/brass_skewer, 2, time = 20, one_per_turf = TRUE, on_floor = TRUE, placement_checks = STACK_CHECK_ADJACENT), \
|
||||
new/datum/stack_recipe("receiver - steam vent", /obj/structure/destructible/clockwork/trap/steam_vent, 3, time = 30, one_per_turf = TRUE, on_floor = TRUE, placement_checks = STACK_CHECK_CARDINALS), \
|
||||
new/datum/stack_recipe("receiver - power nullifier", /obj/structure/destructible/clockwork/trap/power_nullifier, 5, time = 20, one_per_turf = TRUE, on_floor = TRUE, placement_checks = STACK_CHECK_CARDINALS), \
|
||||
null,
|
||||
new/datum/stack_recipe("brass flask", /obj/item/reagent_containers/food/drinks/holyoil/null), \
|
||||
|
||||
))
|
||||
|
||||
@@ -441,7 +443,7 @@ GLOBAL_LIST_INIT(brass_recipes, list ( \
|
||||
throw_range = 3
|
||||
turf_type = /turf/open/floor/clockwork
|
||||
novariants = FALSE
|
||||
grind_results = list("iron" = 5, "teslium" = 15)
|
||||
grind_results = list("iron" = 5, "teslium" = 15, "holyoil" = 1)
|
||||
merge_type = /obj/item/stack/tile/brass
|
||||
|
||||
/obj/item/stack/tile/brass/narsie_act()
|
||||
|
||||
@@ -487,7 +487,7 @@
|
||||
item_state = "duffel-syndieammo"
|
||||
|
||||
/obj/item/storage/backpack/duffelbag/syndie/ammo/shotgun
|
||||
desc = "A large duffel bag, packed to the brim with Bulldog shotgun ammo."
|
||||
desc = "A large duffel bag, packed to the brim with Bulldog shotgun drum magazines."
|
||||
|
||||
/obj/item/storage/backpack/duffelbag/syndie/ammo/shotgun/PopulateContents()
|
||||
for(var/i in 1 to 6)
|
||||
@@ -497,14 +497,14 @@
|
||||
new /obj/item/ammo_box/magazine/m12g/dragon(src)
|
||||
|
||||
/obj/item/storage/backpack/duffelbag/syndie/ammo/smg
|
||||
desc = "A large duffel bag, packed to the brim with C20r magazines."
|
||||
desc = "A large duffel bag, packed to the brim with C-20r magazines."
|
||||
|
||||
/obj/item/storage/backpack/duffelbag/syndie/ammo/smg/PopulateContents()
|
||||
for(var/i in 1 to 9)
|
||||
new /obj/item/ammo_box/magazine/smgm45(src)
|
||||
|
||||
/obj/item/storage/backpack/duffelbag/syndie/c20rbundle
|
||||
desc = "A large duffel bag containing a C20r, some magazines, and a cheap looking suppressor."
|
||||
desc = "A large duffel bag containing a C-20r, some magazines, and a cheap looking suppressor."
|
||||
|
||||
/obj/item/storage/backpack/duffelbag/syndie/c20rbundle/PopulateContents()
|
||||
new /obj/item/ammo_box/magazine/smgm45(src)
|
||||
@@ -513,7 +513,7 @@
|
||||
new /obj/item/suppressor/specialoffer(src)
|
||||
|
||||
/obj/item/storage/backpack/duffelbag/syndie/bulldogbundle
|
||||
desc = "A large duffel bag containing a Bulldog, several drums, and a collapsed hardsuit."
|
||||
desc = "A large duffel bag containing a Bulldog, some drums, and a pair of thermal imaging glasses."
|
||||
|
||||
/obj/item/storage/backpack/duffelbag/syndie/bulldogbundle/PopulateContents()
|
||||
new /obj/item/ammo_box/magazine/m12g(src)
|
||||
@@ -522,16 +522,7 @@
|
||||
new /obj/item/clothing/glasses/thermal/syndi(src)
|
||||
|
||||
/obj/item/storage/backpack/duffelbag/syndie/med/medicalbundle
|
||||
desc = "A large duffel bag containing a medical equipment, a Donksoft machine gun, a big jumbo box of darts, and a knock-off pair of magboots."
|
||||
|
||||
/obj/item/storage/backpack/duffelbag/syndie/med/medicalbundle/PopulateContents()
|
||||
new /obj/item/clothing/shoes/magboots/syndie(src)
|
||||
new /obj/item/storage/firstaid/tactical(src)
|
||||
new /obj/item/gun/ballistic/automatic/l6_saw/toy(src)
|
||||
new /obj/item/ammo_box/foambox/riot(src)
|
||||
|
||||
/obj/item/storage/backpack/duffelbag/syndie/med/medicalbundle
|
||||
desc = "A large duffel bag containing a medical equipment, a Donksoft machine gun, a big jumbo box of darts, and a knock-off pair of magboots."
|
||||
desc = "A large duffel bag containing a tactical medkit, a Donksoft machine gun, a big jumbo box of riot darts, and a knock-off pair of magboots."
|
||||
|
||||
/obj/item/storage/backpack/duffelbag/syndie/med/medicalbundle/PopulateContents()
|
||||
new /obj/item/clothing/shoes/magboots/syndie(src)
|
||||
@@ -540,7 +531,7 @@
|
||||
new /obj/item/ammo_box/foambox/riot(src)
|
||||
|
||||
/obj/item/storage/backpack/duffelbag/syndie/med/bioterrorbundle
|
||||
desc = "A large duffel bag containing a deadly chemicals, a chemical spray, chemical grenade, a Donksoft assault rifle, riot grade darts, a minature syringe gun, and a box of syringes."
|
||||
desc = "A large duffel bag containing deadly chemicals, a handheld chem sprayer, Bioterror foam grenade, a Donksoft assault rifle, box of riot grade darts, a dart pistol, and a box of syringes."
|
||||
|
||||
/obj/item/storage/backpack/duffelbag/syndie/med/bioterrorbundle/PopulateContents()
|
||||
new /obj/item/reagent_containers/spray/chemsprayer/bioterror(src)
|
||||
@@ -562,7 +553,7 @@
|
||||
new /obj/item/grenade/plastic/x4(src)
|
||||
|
||||
/obj/item/storage/backpack/duffelbag/syndie/firestarter
|
||||
desc = "A large duffel bag containing New Russian pyro backpack sprayer, a pistol, a pipebomb, fireproof hardsuit, ammo, and other equipment."
|
||||
desc = "A large duffel bag containing a New Russian pyro backpack sprayer, Elite hardsuit, a Stechkin APS pistol, minibomb, ammo, and other equipment."
|
||||
|
||||
/obj/item/storage/backpack/duffelbag/syndie/firestarter/PopulateContents()
|
||||
new /obj/item/clothing/under/syndicate/soviet(src)
|
||||
|
||||
@@ -664,6 +664,32 @@
|
||||
/obj/item/melee/sabre
|
||||
))
|
||||
|
||||
/obj/item/storage/belt/sabre/rapier
|
||||
name = "rapier sheath"
|
||||
desc = "A black, thin sheath that looks to house only a long thin blade. Feels like its made of metal."
|
||||
icon_state = "rsheath"
|
||||
item_state = "rsheath"
|
||||
force = 5
|
||||
throwforce = 15
|
||||
block_chance = 30
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
attack_verb = list("bashed", "slashes", "prods", "pokes")
|
||||
|
||||
/obj/item/storage/belt/sabre/rapier/ComponentInitialize()
|
||||
. = ..()
|
||||
GET_COMPONENT(STR, /datum/component/storage)
|
||||
STR.max_items = 1
|
||||
STR.rustle_sound = FALSE
|
||||
STR.max_w_class = WEIGHT_CLASS_BULKY
|
||||
STR.can_hold = typecacheof(list(
|
||||
/obj/item/melee/rapier
|
||||
))
|
||||
|
||||
/obj/item/storage/belt/sabre/rapier/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
|
||||
if(attack_type == PROJECTILE_ATTACK)
|
||||
final_block_chance = 0 //To thin to block bullets
|
||||
return ..()
|
||||
|
||||
/obj/item/storage/belt/sabre/examine(mob/user)
|
||||
..()
|
||||
if(length(contents))
|
||||
@@ -681,8 +707,8 @@
|
||||
to_chat(user, "[src] is empty.")
|
||||
|
||||
/obj/item/storage/belt/sabre/update_icon()
|
||||
icon_state = "sheath"
|
||||
item_state = "sheath"
|
||||
icon_state = initial(icon_state)
|
||||
item_state = initial(item_state)
|
||||
if(contents.len)
|
||||
icon_state += "-sabre"
|
||||
item_state += "-sabre"
|
||||
@@ -694,3 +720,7 @@
|
||||
/obj/item/storage/belt/sabre/PopulateContents()
|
||||
new /obj/item/melee/sabre(src)
|
||||
update_icon()
|
||||
|
||||
/obj/item/storage/belt/sabre/rapier/PopulateContents()
|
||||
new /obj/item/melee/rapier(src)
|
||||
update_icon()
|
||||
|
||||
@@ -74,6 +74,7 @@ GLOBAL_LIST_INIT(bibleitemstates, list("bible", "koran", "scrapbook", "bible",
|
||||
if(B.icon_state == "honk1" || B.icon_state == "honk2")
|
||||
var/mob/living/carbon/human/H = usr
|
||||
H.dna.add_mutation(CLOWNMUT)
|
||||
H.dna.add_mutation(SMILE)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/clown_hat(H), SLOT_WEAR_MASK)
|
||||
|
||||
GLOB.bible_icon_state = B.icon_state
|
||||
@@ -138,7 +139,7 @@ GLOBAL_LIST_INIT(bibleitemstates, list("bible", "koran", "scrapbook", "bible",
|
||||
smack = 0
|
||||
else if(iscarbon(M))
|
||||
var/mob/living/carbon/C = M
|
||||
if(!istype(C.head, /obj/item/clothing/head))
|
||||
if(!istype(C.head, /obj/item/clothing/head))
|
||||
C.adjustBrainLoss(10, 80)
|
||||
to_chat(C, "<span class='danger'>You feel dumber.</span>")
|
||||
|
||||
|
||||
@@ -68,9 +68,8 @@
|
||||
..()
|
||||
|
||||
/obj/item/storage/briefcase/sniperbundle
|
||||
desc = "It's label reads genuine hardened Captain leather, but suspiciously has no other tags or branding. Smells like L'Air du Temps."
|
||||
desc = "Its label reads \"genuine hardened Captain leather\", but suspiciously has no other tags or branding. Smells like L'Air du Temps."
|
||||
force = 10
|
||||
|
||||
/obj/item/storage/briefcase/sniperbundle/PopulateContents()
|
||||
..() // in case you need any paperwork done after your rampage
|
||||
new /obj/item/gun/ballistic/automatic/sniper_rifle/syndicate(src)
|
||||
@@ -82,7 +81,7 @@
|
||||
|
||||
|
||||
/obj/item/storage/briefcase/modularbundle
|
||||
desc = "It's label reads genuine hardened Captain leather, but suspiciously has no other tags or branding."
|
||||
desc = "Its label reads \"genuine hardened Captain leather\", but suspiciously has no other tags or branding."
|
||||
force = 10
|
||||
|
||||
/obj/item/storage/briefcase/modularbundle/PopulateContents()
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
GLOBAL_LIST_EMPTY(rubber_toolbox_icons)
|
||||
|
||||
/obj/item/storage/toolbox
|
||||
name = "toolbox"
|
||||
desc = "Danger. Very robust."
|
||||
@@ -16,21 +18,25 @@
|
||||
hitsound = 'sound/weapons/smash.ogg'
|
||||
var/latches = "single_latch"
|
||||
var/has_latches = TRUE
|
||||
var/can_rubberify = TRUE
|
||||
|
||||
/obj/item/storage/toolbox/Initialize()
|
||||
/obj/item/storage/toolbox/Initialize(mapload)
|
||||
. = ..()
|
||||
if(has_latches)
|
||||
if(prob(10))
|
||||
latches = "double_latch"
|
||||
if(prob(1))
|
||||
latches = "triple_latch"
|
||||
if(mapload && can_rubberify && prob(5))
|
||||
rubberify()
|
||||
update_icon()
|
||||
|
||||
/obj/item/storage/toolbox/update_icon()
|
||||
..()
|
||||
cut_overlays()
|
||||
if(has_latches)
|
||||
add_overlay(latches)
|
||||
var/icon/I = icon('icons/obj/storage.dmi', latches)
|
||||
add_overlay(I)
|
||||
|
||||
|
||||
/obj/item/storage/toolbox/suicide_act(mob/user)
|
||||
@@ -39,8 +45,6 @@
|
||||
|
||||
/obj/item/storage/toolbox/emergency
|
||||
name = "emergency toolbox"
|
||||
icon_state = "red"
|
||||
item_state = "toolbox_red"
|
||||
|
||||
/obj/item/storage/toolbox/emergency/PopulateContents()
|
||||
new /obj/item/crowbar/red(src)
|
||||
@@ -59,6 +63,7 @@
|
||||
name = "rusty red toolbox"
|
||||
icon_state = "toolbox_red_old"
|
||||
has_latches = FALSE
|
||||
can_rubberify = FALSE
|
||||
|
||||
/obj/item/storage/toolbox/mechanical
|
||||
name = "mechanical toolbox"
|
||||
@@ -77,6 +82,7 @@
|
||||
name = "rusty blue toolbox"
|
||||
icon_state = "toolbox_blue_old"
|
||||
has_latches = FALSE
|
||||
can_rubberify = FALSE
|
||||
|
||||
/obj/item/storage/toolbox/mechanical/old/heirloom
|
||||
name = "old, robust toolbox" //this will be named "X family toolbox"
|
||||
@@ -151,6 +157,7 @@
|
||||
resistance_flags = FIRE_PROOF | ACID_PROOF
|
||||
w_class = WEIGHT_CLASS_HUGE
|
||||
attack_verb = list("robusted", "crushed", "smashed")
|
||||
can_rubberify = FALSE
|
||||
var/fabricator_type = /obj/item/clockwork/replica_fabricator/scarab
|
||||
|
||||
/obj/item/storage/toolbox/brass/ComponentInitialize()
|
||||
@@ -191,8 +198,9 @@
|
||||
item_state = "toolbox_blue"
|
||||
w_class = WEIGHT_CLASS_HUGE //heyo no bohing this!
|
||||
force = 18 //spear damage
|
||||
can_rubberify = FALSE
|
||||
|
||||
/obj/item/storage/toolbox/durasteel/afterattack(atom/A, mob/user, proximity)
|
||||
/obj/item/storage/toolbox/plastitanium/afterattack(atom/A, mob/user, proximity)
|
||||
. = ..()
|
||||
if(proximity && isobj(A) && !isitem(A))
|
||||
var/obj/O = A
|
||||
@@ -204,7 +212,7 @@
|
||||
name = "artistic toolbox"
|
||||
desc = "A toolbox painted bright green. Why anyone would store art supplies in a toolbox is beyond you, but it has plenty of extra space."
|
||||
icon_state = "green"
|
||||
item_state = "artistic_toolbox"
|
||||
item_state = "toolbox_green"
|
||||
w_class = WEIGHT_CLASS_GIGANTIC //Holds more than a regular toolbox!
|
||||
|
||||
/obj/item/storage/toolbox/artistic/ComponentInitialize()
|
||||
@@ -253,9 +261,55 @@
|
||||
|
||||
/obj/item/storage/toolbox/gold_fake // used in crafting
|
||||
name = "golden toolbox"
|
||||
desc = "A gold plated toolbox, fancy and harmless do to the gold plating being on cardboard!"
|
||||
desc = "A gold plated toolbox, fancy and harmless due to the gold plating being on cardboard!"
|
||||
icon_state = "gold"
|
||||
item_state = "gold"
|
||||
has_latches = FALSE
|
||||
force = 0
|
||||
throwforce = 0
|
||||
can_rubberify = FALSE
|
||||
|
||||
/obj/item/storage/toolbox/proc/rubberify()
|
||||
name = "rubber [name]"
|
||||
desc = replacetext(desc, "Danger", "Bouncy")
|
||||
desc = replacetext(desc, "robust", "safe")
|
||||
desc = replacetext(desc, "heavier", "bouncier")
|
||||
DISABLE_BITFIELD(flags_1, CONDUCT_1)
|
||||
materials = null
|
||||
damtype = STAMINA
|
||||
force += 3 //to compensate the higher stamina K.O. threshold compared to actual health.
|
||||
throwforce += 3
|
||||
attack_verb += "bounced"
|
||||
hitsound = 'sound/effects/clownstep1.ogg'
|
||||
if(!GLOB.rubber_toolbox_icons[icon_state])
|
||||
generate_rubber_toolbox_icon()
|
||||
icon = GLOB.rubber_toolbox_icons[icon_state]
|
||||
AddComponent(/datum/component/bouncy)
|
||||
. = ..()
|
||||
|
||||
/obj/item/storage/toolbox/proc/generate_rubber_toolbox_icon()
|
||||
var/icon/new_icon = icon(icon, icon_state)
|
||||
var/icon/smooth = icon('icons/obj/storage.dmi', "rubber_toolbox_blend")
|
||||
new_icon.Blend(smooth, ICON_MULTIPLY)
|
||||
new_icon = fcopy_rsc(new_icon)
|
||||
GLOB.rubber_toolbox_icons[icon_state] = new_icon
|
||||
|
||||
/obj/item/storage/toolbox/rubber
|
||||
name = "rubber toolbox"
|
||||
desc = "Bouncy. Very safe."
|
||||
flags_1 = null
|
||||
materials = null
|
||||
damtype = STAMINA
|
||||
force = 17
|
||||
throwforce = 17
|
||||
attack_verb = list("robusted", "bounced")
|
||||
can_rubberify = FALSE //we are already the future.
|
||||
|
||||
/obj/item/storage/toolbox/rubber/Initialize()
|
||||
icon_state = pick("blue", "red", "yellow", "green")
|
||||
item_state = "toolbox_[icon_state]"
|
||||
if(!GLOB.rubber_toolbox_icons[icon_state])
|
||||
generate_rubber_toolbox_icon()
|
||||
icon = GLOB.rubber_toolbox_icons[icon_state]
|
||||
. = ..()
|
||||
AddComponent(/datum/component/bouncy)
|
||||
@@ -6,10 +6,9 @@
|
||||
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
|
||||
var/taste_sensitivity = 15
|
||||
speech_span = null
|
||||
|
||||
/obj/item/taster/get_spans()
|
||||
return list()
|
||||
var/taste_sensitivity = 15
|
||||
|
||||
/obj/item/taster/afterattack(atom/O, mob/user, proximity)
|
||||
. = ..()
|
||||
|
||||
@@ -34,6 +34,12 @@
|
||||
icon_state = "crowbar_brass"
|
||||
toolspeed = 0.5
|
||||
|
||||
/obj/item/crowbar/bronze
|
||||
name = "bronze plated crowbar"
|
||||
desc = "A bronze plated crowbar."
|
||||
icon_state = "crowbar_brass"
|
||||
toolspeed = 0.95
|
||||
|
||||
/obj/item/crowbar/abductor
|
||||
name = "alien crowbar"
|
||||
desc = "A hard-light crowbar. It appears to pry by itself, without any effort required."
|
||||
@@ -42,7 +48,6 @@
|
||||
icon_state = "crowbar"
|
||||
toolspeed = 0.1
|
||||
|
||||
|
||||
/obj/item/crowbar/large
|
||||
name = "crowbar"
|
||||
desc = "It's a big crowbar. It doesn't fit in your pockets, because it's big."
|
||||
|
||||
@@ -86,6 +86,14 @@
|
||||
toolspeed = 0.5
|
||||
random_color = FALSE
|
||||
|
||||
/obj/item/screwdriver/bronze
|
||||
name = "bronze screwdriver"
|
||||
desc = "A screwdriver plated with bronze."
|
||||
icon_state = "screwdriver_brass"
|
||||
item_state = "screwdriver_brass"
|
||||
toolspeed = 0.95
|
||||
random_color = FALSE
|
||||
|
||||
/obj/item/screwdriver/abductor
|
||||
name = "alien screwdriver"
|
||||
desc = "An ultrasonic screwdriver."
|
||||
|
||||
@@ -363,6 +363,13 @@
|
||||
icon_state = "brasswelder"
|
||||
item_state = "brasswelder"
|
||||
|
||||
/obj/item/weldingtool/bronze
|
||||
name = "bronze plated welding tool"
|
||||
desc = "A bronze plated welder."
|
||||
max_fuel = 21
|
||||
toolspeed = 0.95
|
||||
icon_state = "brasswelder"
|
||||
item_state = "brasswelder"
|
||||
|
||||
/obj/item/weldingtool/experimental/process()
|
||||
..()
|
||||
|
||||
@@ -69,6 +69,13 @@
|
||||
random_color = FALSE
|
||||
toolspeed = 0.5
|
||||
|
||||
/obj/item/wirecutters/bronze
|
||||
name = "bronze plated wirecutters"
|
||||
desc = "A pair of wirecutters plated with bronze."
|
||||
icon_state = "cutters_brass"
|
||||
random_color = FALSE
|
||||
toolspeed = 0.95 //Wire cutters have 0 time bars though
|
||||
|
||||
/obj/item/wirecutters/abductor
|
||||
name = "alien wirecutters"
|
||||
desc = "Extremely sharp wirecutters, made out of a silvery-green metal."
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user