Merge branch 'master' into Unmodular

This commit is contained in:
Trilbyspaceclone
2019-07-14 18:27:37 -04:00
committed by GitHub
315 changed files with 2368 additions and 1362 deletions
@@ -17294,7 +17294,7 @@
lootcount = 2; lootcount = 2;
name = "2maintenance loot spawner" name = "2maintenance loot spawner"
}, },
/obj/item/clothing/gloves/color/random, /obj/effect/spawner/lootdrop/gloves,
/turf/open/floor/plating, /turf/open/floor/plating,
/area/maintenance/department/crew_quarters/bar) /area/maintenance/department/crew_quarters/bar)
"aPD" = ( "aPD" = (
+10
View File
@@ -131,6 +131,16 @@
#define COMSIG_MOB_ATTACK_RANGED "mob_attack_ranged" //from base of mob/RangedAttack(): (atom/A, params) #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_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_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 // /mob/living signals
#define COMSIG_LIVING_RESIST "living_resist" //from base of mob/living/resist() (/mob/living) #define COMSIG_LIVING_RESIST "living_resist" //from base of mob/living/resist() (/mob/living)
+1
View File
@@ -8,6 +8,7 @@
#define ENABLE_BITFIELD(variable, flag) (variable |= (flag)) #define ENABLE_BITFIELD(variable, flag) (variable |= (flag))
#define DISABLE_BITFIELD(variable, flag) (variable &= ~(flag)) #define DISABLE_BITFIELD(variable, flag) (variable &= ~(flag))
#define CHECK_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)) GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768))
+1
View File
@@ -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_SILICONS 22
#define CLOCK_PROSELYTIZATION 23 #define CLOCK_PROSELYTIZATION 23
#define SHUTTLE_HIJACK 24 #define SHUTTLE_HIJACK 24
#define GANG_VICTORY 25
#define FIELD_TURF 1 #define FIELD_TURF 1
#define FIELD_EDGE 2 #define FIELD_EDGE 2
+7 -5
View File
@@ -20,12 +20,12 @@
#define FORCE_STRING_OVERRIDE (1<<2) // used for tooltips #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 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 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 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 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 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<<8) // for all things that are technically items but used for various different stuff
#define ABSTRACT (1<<9) // 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 IMMUTABLE_SLOW (1<<10) //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 // Flags for the clothing_flags var on /obj/item/clothing
@@ -35,3 +35,5 @@
#define MASKINTERNALS (1<<3) // mask allows internals #define MASKINTERNALS (1<<3) // mask allows internals
#define NOSLIP (1<<4) //prevents from slipping on wet floors, in space etc #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 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.
+1 -1
View File
@@ -81,7 +81,7 @@
#define INIT_ORDER_STICKY_BAN -10 #define INIT_ORDER_STICKY_BAN -10
#define INIT_ORDER_LIGHTING -20 #define INIT_ORDER_LIGHTING -20
#define INIT_ORDER_SHUTTLE -21 #define INIT_ORDER_SHUTTLE -21
#define INIT_ORDER_SQUEAK -40 #define INIT_ORDER_MINOR_MAPPING -40
#define INIT_ORDER_PATH -50 #define INIT_ORDER_PATH -50
#define INIT_ORDER_PERSISTENCE -100 #define INIT_ORDER_PERSISTENCE -100
+31
View File
@@ -112,6 +112,7 @@
#define TRAIT_PARALYSIS_R_ARM "para-r-arm" #define TRAIT_PARALYSIS_R_ARM "para-r-arm"
#define TRAIT_PARALYSIS_L_LEG "para-l-leg" #define TRAIT_PARALYSIS_L_LEG "para-l-leg"
#define TRAIT_PARALYSIS_R_LEG "para-r-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_LAW_ENFORCEMENT_METABOLISM "law-enforcement-metabolism"
#define TRAIT_STRONG_GRABBER "strong_grabber" #define TRAIT_STRONG_GRABBER "strong_grabber"
#define TRAIT_CALCIUM_HEALER "calcium_healer" #define TRAIT_CALCIUM_HEALER "calcium_healer"
@@ -119,6 +120,9 @@
//non-mob traits //non-mob traits
#define TRAIT_PARALYSIS "paralysis" //Used for limb-based paralysis, where replacing the limb will fix it #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_ALCOHOL_TOLERANCE "alcohol_tolerance"
#define TRAIT_AGEUSIA "ageusia" #define TRAIT_AGEUSIA "ageusia"
#define TRAIT_HEAVY_SLEEPER "heavy_sleeper" #define TRAIT_HEAVY_SLEEPER "heavy_sleeper"
@@ -155,6 +159,12 @@
#define SPECIES_TRAIT "species" #define SPECIES_TRAIT "species"
#define ORGAN_TRAIT "organ" #define ORGAN_TRAIT "organ"
#define JOB_TRAIT "job" #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 #define ROUNDSTART_TRAIT "roundstart" //cannot be removed without admin intervention
// unique trait sources, still defines // unique trait sources, still defines
@@ -167,3 +177,24 @@
#define STASIS_MUTE "stasis" #define STASIS_MUTE "stasis"
#define GENETICS_SPELL "genetics_spell" #define GENETICS_SPELL "genetics_spell"
#define EYES_COVERED "eyes_covered" #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"
+3 -3
View File
@@ -8,11 +8,11 @@
//facial hair //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) 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 //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 //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 //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) //bodypart accessories (blizzard intensifies)
init_sprite_accessory_subtypes(/datum/sprite_accessory/body_markings, GLOB.body_markings_list) 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) init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/lizard, GLOB.tails_list_lizard)
+13 -14
View File
@@ -20,35 +20,34 @@
else else
return "000" 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) if(!GLOB.underwear_list.len)
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)
return "Nude" switch(gender)
/*switch(gender)
if(MALE) if(MALE)
return pick(GLOB.underwear_m) return pick(GLOB.underwear_m)
if(FEMALE) if(FEMALE)
return pick(GLOB.underwear_f) return pick(GLOB.underwear_f)
else 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) if(!GLOB.undershirt_list.len)
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)
return "Nude" switch(gender)
/*switch(gender)
if(MALE) if(MALE)
return pick(GLOB.undershirt_m) return pick(GLOB.undershirt_m)
if(FEMALE) if(FEMALE)
return pick(GLOB.undershirt_f) return pick(GLOB.undershirt_f)
else 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) if(!GLOB.socks_list.len)
init_sprite_accessory_subtypes(/datum/sprite_accessory/socks, GLOB.socks_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/underwear/socks, GLOB.socks_list)
return "Nude" return pick(GLOB.socks_list)
//return pick(GLOB.socks_list)
/proc/random_features() /proc/random_features()
if(!GLOB.tails_list_human.len) if(!GLOB.tails_list_human.len)
+4
View File
@@ -151,6 +151,10 @@ GLOBAL_VAR(command_name)
GLOBAL_VAR(syndicate_code_phrase) //Code phrase for traitors. GLOBAL_VAR(syndicate_code_phrase) //Code phrase for traitors.
GLOBAL_VAR(syndicate_code_response) //Code response 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. Should be expanded.
How this works: How this works:
+24
View File
@@ -767,3 +767,27 @@ GLOBAL_LIST_INIT(binary, list("0","1"))
return "twelfth" return "twelfth"
else else
return "[number]\th" 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
+8 -6
View File
@@ -1239,19 +1239,21 @@ GLOBAL_REAL_VAR(list/stack_trace_storage)
pixel_x = initialpixelx pixel_x = initialpixelx
pixel_y = initialpixely pixel_y = initialpixely
/atom/proc/do_jiggle(targetangle = 45) /atom/proc/do_jiggle(targetangle = 45, timer = 20)
var/matrix/OM = matrix(transform) var/matrix/OM = matrix(transform)
var/matrix/M = matrix(transform) var/matrix/M = matrix(transform)
var/halftime = timer * 0.5
M.Turn(pick(-targetangle, targetangle)) M.Turn(pick(-targetangle, targetangle))
animate(src, transform = M, time = 10, easing = ELASTIC_EASING) animate(src, transform = M, time = halftime, easing = ELASTIC_EASING)
animate(src, transform = OM, time = 10, 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/OM = matrix(transform)
var/matrix/M = matrix(transform) var/matrix/M = matrix(transform)
var/halftime = timer * 0.5
M.Scale(squishx, squishy) M.Scale(squishx, squishy)
animate(src, transform = M, time = 10, easing = BOUNCE_EASING) animate(src, transform = M, time = halftime, easing = BOUNCE_EASING)
animate(src, transform = OM, time = 10, easing = BOUNCE_EASING) animate(src, transform = OM, time = halftime, easing = BOUNCE_EASING)
/proc/weightclass2text(var/w_class) /proc/weightclass2text(var/w_class)
switch(w_class) switch(w_class)
+7 -1
View File
@@ -47,7 +47,6 @@ GLOBAL_LIST_INIT(bitfields, list(
"NO_MAT_REDEMPTION" = NO_MAT_REDEMPTION, "NO_MAT_REDEMPTION" = NO_MAT_REDEMPTION,
"DROPDEL" = DROPDEL, "DROPDEL" = DROPDEL,
"NOBLUDGEON" = NOBLUDGEON, "NOBLUDGEON" = NOBLUDGEON,
"NODROP" = NODROP,
"ABSTRACT" = ABSTRACT, "ABSTRACT" = ABSTRACT,
), ),
"admin_flags" = list( "admin_flags" = list(
@@ -140,6 +139,8 @@ GLOBAL_LIST_INIT(bitfields, list(
"MASKINTERNALS" = MASKINTERNALS, "MASKINTERNALS" = MASKINTERNALS,
"NOSLIP" = NOSLIP, "NOSLIP" = NOSLIP,
"THICKMATERIAL" = THICKMATERIAL, "THICKMATERIAL" = THICKMATERIAL,
"VOICEBOX_TOGGLABLE" = VOICEBOX_TOGGLABLE,
"VOICEBOX_DISABLED" = VOICEBOX_DISABLED,
), ),
"tesla_flags" = list( "tesla_flags" = list(
"TESLA_MOB_DAMAGE" = TESLA_MOB_DAMAGE, "TESLA_MOB_DAMAGE" = TESLA_MOB_DAMAGE,
@@ -171,4 +172,9 @@ GLOBAL_LIST_INIT(bitfields, list(
"RAD_PROTECT_CONTENTS" = RAD_PROTECT_CONTENTS, "RAD_PROTECT_CONTENTS" = RAD_PROTECT_CONTENTS,
"RAD_NO_CONTAMINATE" = RAD_NO_CONTAMINATE, "RAD_NO_CONTAMINATE" = RAD_NO_CONTAMINATE,
), ),
"disease_flags" = list(
"CURABLE" = CURABLE,
"CAN_CARRY" = CAN_CARRY,
"CAN_RESIST" = CAN_RESIST
),
)) ))
+3 -3
View File
@@ -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_male_list) //stores only hair names
GLOBAL_LIST_EMPTY(facial_hair_styles_female_list) //stores only hair names GLOBAL_LIST_EMPTY(facial_hair_styles_female_list) //stores only hair names
//Underwear //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_m) //stores only underwear name
GLOBAL_LIST_EMPTY(underwear_f) //stores only underwear name GLOBAL_LIST_EMPTY(underwear_f) //stores only underwear name
//Undershirts //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_m) //stores only undershirt name
GLOBAL_LIST_EMPTY(undershirt_f) //stores only undershirt name GLOBAL_LIST_EMPTY(undershirt_f) //stores only undershirt name
//Socks //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) //Lizard Bits (all datum lists indexed by name)
GLOBAL_LIST_EMPTY(body_markings_list) GLOBAL_LIST_EMPTY(body_markings_list)
GLOBAL_LIST_EMPTY(tails_list_lizard) GLOBAL_LIST_EMPTY(tails_list_lizard)
+2 -3
View File
@@ -43,7 +43,7 @@ GLOBAL_LIST_INIT(maintenance_loot, list(
/obj/item/assembly/timer = 3, /obj/item/assembly/timer = 3,
/obj/item/flashlight = 4, /obj/item/flashlight = 4,
/obj/item/flashlight/pen = 1, /obj/item/flashlight/pen = 1,
/obj/item/flashlight/glowstick/random = 4, /obj/effect/spawner/lootdrop/glowstick = 4,
/obj/effect/spawner/lootdrop/mre = 3, /obj/effect/spawner/lootdrop/mre = 3,
/obj/item/multitool = 2, /obj/item/multitool = 2,
/obj/item/radio/off = 2, /obj/item/radio/off = 2,
@@ -69,7 +69,6 @@ GLOBAL_LIST_INIT(maintenance_loot, list(
/obj/item/crowbar = 1, /obj/item/crowbar = 1,
/obj/item/crowbar/red = 1, /obj/item/crowbar/red = 1,
/obj/item/extinguisher = 11, /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/hand_labeler = 1,
/obj/item/paper/crumpled = 1, /obj/item/paper/crumpled = 1,
/obj/item/pen = 1, /obj/item/pen = 1,
@@ -102,7 +101,7 @@ GLOBAL_LIST_INIT(maintenance_loot, list(
/obj/item/assembly/signaler = 2, /obj/item/assembly/signaler = 2,
/obj/item/assembly/mousetrap = 2, /obj/item/assembly/mousetrap = 2,
/obj/item/reagent_containers/syringe = 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/clothing/shoes/laceup = 1,
/obj/item/storage/secure/briefcase = 3, /obj/item/storage/secure/briefcase = 3,
/obj/item/storage/toolbox/artistic = 2, /obj/item/storage/toolbox/artistic = 2,
+1 -1
View File
@@ -64,7 +64,7 @@
to_chat(user, "<span class='warning'>You're too exhausted.</span>") // CIT CHANGE - ditto to_chat(user, "<span class='warning'>You're too exhausted.</span>") // CIT CHANGE - ditto
return // 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>") to_chat(user, "<span class='warning'>You don't want to harm other living beings!</span>")
return return
@@ -1,22 +1,14 @@
// The Squeak SUBSYSTEM_DEF(minor_mapping)
// because this is about placement of mice mobs, and nothing to do with name = "Minor Mapping"
// mice - the computer peripheral init_order = INIT_ORDER_MINOR_MAPPING
SUBSYSTEM_DEF(squeak)
name = "Squeak"
init_order = INIT_ORDER_SQUEAK
flags = SS_NO_FIRE flags = SS_NO_FIRE
var/list/exposed_wires = list() /datum/controller/subsystem/minor_mapping/Initialize(timeofday)
/datum/controller/subsystem/squeak/Initialize(timeofday)
trigger_migration(CONFIG_GET(number/mice_roundstart)) trigger_migration(CONFIG_GET(number/mice_roundstart))
return ..() return ..()
/datum/controller/subsystem/squeak/proc/trigger_migration(num_mice=10) /datum/controller/subsystem/minor_mapping/proc/trigger_migration(num_mice=10)
if(!num_mice) var/list/exposed_wires = find_exposed_wires()
return
find_exposed_wires()
var/mob/living/simple_animal/mouse/M var/mob/living/simple_animal/mouse/M
var/turf/proposed_turf var/turf/proposed_turf
@@ -31,7 +23,8 @@ SUBSYSTEM_DEF(squeak)
num_mice -= 1 num_mice -= 1
M = null M = null
/datum/controller/subsystem/squeak/proc/find_exposed_wires() /proc/find_exposed_wires()
var/list/exposed_wires = list()
exposed_wires.Cut() exposed_wires.Cut()
var/list/all_turfs var/list/all_turfs
for (var/z in SSmapping.levels_by_trait(ZTRAIT_STATION)) for (var/z in SSmapping.levels_by_trait(ZTRAIT_STATION))
@@ -41,3 +34,5 @@ SUBSYSTEM_DEF(squeak)
continue continue
if(locate(/obj/structure/cable) in T) if(locate(/obj/structure/cable) in T)
exposed_wires += T exposed_wires += T
return shuffle(exposed_wires)
+20
View File
@@ -127,9 +127,20 @@ SUBSYSTEM_DEF(ticker)
if(!GLOB.syndicate_code_phrase) if(!GLOB.syndicate_code_phrase)
GLOB.syndicate_code_phrase = generate_code_phrase(return_list=TRUE) 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) if(!GLOB.syndicate_code_response)
GLOB.syndicate_code_response = generate_code_phrase(return_list=TRUE) 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) start_at = world.time + (CONFIG_GET(number/lobby_countdown) * 10)
if(CONFIG_GET(flag/randomize_shift_time)) if(CONFIG_GET(flag/randomize_shift_time))
gametime_offset = rand(0, 23) HOURS gametime_offset = rand(0, 23) HOURS
@@ -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." 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) 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." 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) if(news_message)
send2otherserver(news_source, news_message,"News_Report") send2otherserver(news_source, news_message,"News_Report")
+4 -2
View File
@@ -32,16 +32,18 @@
//Called when given to a mob //Called when given to a mob
/datum/brain_trauma/proc/on_gain() /datum/brain_trauma/proc/on_gain()
to_chat(owner, gain_text) to_chat(owner, gain_text)
RegisterSignal(owner, COMSIG_MOB_SAY, .proc/handle_speech)
//Called when removed from a mob //Called when removed from a mob
/datum/brain_trauma/proc/on_lose(silent) /datum/brain_trauma/proc/on_lose(silent)
if(!silent) if(!silent)
to_chat(owner, lose_text) to_chat(owner, lose_text)
UnregisterSignal(owner, COMSIG_MOB_SAY)
//Called when hearing a spoken message //Called when hearing a spoken message
/datum/brain_trauma/proc/on_hear(message, speaker, message_language, raw_message, radio_freq) /datum/brain_trauma/proc/on_hear(message, speaker, message_language, raw_message, radio_freq)
return message return message
//Called when speaking //Called when speaking
/datum/brain_trauma/proc/on_say(message) /datum/brain_trauma/proc/handle_speech(datum/source, list/speech_args)
return message UnregisterSignal(owner, COMSIG_MOB_SAY)
+4 -10
View File
@@ -68,18 +68,12 @@
lose_text = "" lose_text = ""
/datum/brain_trauma/mild/speech_impediment/on_gain() /datum/brain_trauma/mild/speech_impediment/on_gain()
owner.dna.add_mutation(UNINTELLIGIBLE) ADD_TRAIT(owner, TRAIT_UNINTELLIGIBLE_SPEECH, TRAUMA_TRAIT)
..() . = ..()
//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()
..()
/datum/brain_trauma/mild/speech_impediment/on_lose() /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 /datum/brain_trauma/mild/concussion
name = "Concussion" name = "Concussion"
+3 -4
View File
@@ -78,14 +78,13 @@
break break
return message 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) for(var/word in trigger_words)
var/reg = regex("(\\b|\\A)[REGEX_QUOTE(word)]'?s*(\\b|\\Z)", "i") 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>") to_chat(owner, "<span class='warning'>You can't bring yourself to say the word \"[word]\"!</span>")
return "" speech_args[SPEECH_MESSAGE] = ""
return message
/datum/brain_trauma/mild/phobia/proc/freak_out(atom/reason, trigger_word) /datum/brain_trauma/mild/phobia/proc/freak_out(atom/reason, trigger_word)
next_scare = world.time + 120 next_scare = world.time + 120
@@ -199,10 +199,9 @@
addtimer(CALLBACK(src, /datum/brain_trauma/severe/split_personality.proc/switch_personalities), 10) addtimer(CALLBACK(src, /datum/brain_trauma/severe/split_personality.proc/switch_personalities), 10)
return message return message
/datum/brain_trauma/severe/split_personality/brainwashing/on_say(message) /datum/brain_trauma/severe/split_personality/brainwashing/handle_speech(datum/source, list/speech_args)
if(findtext(message, codeword)) if(findtext(speech_args[SPEECH_MESSAGE], codeword))
return "" //oh hey did you want to tell people about the secret word to bring you back? speech_args[SPEECH_MESSAGE] = "" //oh hey did you want to tell people about the secret word to bring you back?
return message
/mob/living/split_personality/traitor /mob/living/split_personality/traitor
name = "split personality" name = "split personality"
+40
View File
@@ -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)
+3 -3
View File
@@ -2,10 +2,10 @@
dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS
var/mob/living/host_mob var/mob/living/host_mob
var/nanite_volume = 100 //amount of nanites in the system, used as fuel for nanite programs var/nanite_volume = 50 //amount of nanites in the system, used as fuel for nanite programs
var/max_nanites = 500 //maximum amount of nanites in the system var/max_nanites = 250 //maximum amount of nanites in the system
var/regen_rate = 0.5 //nanites generated per second 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/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/next_sync = 0
var/list/datum/nanite_program/programs = list() var/list/datum/nanite_program/programs = list()
+1 -1
View File
@@ -592,7 +592,7 @@
if(!stop_messages) if(!stop_messages)
to_chat(M, "<span class='warning'>[IP] cannot hold [I] as it's a storage item of the same size!</span>") 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. 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>") to_chat(M, "<span class='warning'>\the [I] is stuck to your hand, you can't put it in \the [host]!</span>")
return FALSE return FALSE
var/datum/component/storage/concrete/master = master() var/datum/component/storage/concrete/master = master()
+27
View File
@@ -26,3 +26,30 @@
if(4) if(4)
if(prob(5)) if(prob(5))
affected_mob.say( pick( list("HONK!", "Honk!", "Honk.", "Honk?", "Honk!!", "Honk?!", "Honk...") ) , forced = "pierrot's throat") 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 ..()
-19
View File
@@ -185,25 +185,6 @@
if(DNA_TAUR_BLOCK) if(DNA_TAUR_BLOCK)
construct_block(GLOB.taur_list.Find(features["taur"]), GLOB.taur_list.len) 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) /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(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) if(species.type == D.species.type && features == D.features && blood_type == D.blood_type)
-7
View File
@@ -105,13 +105,6 @@ GLOBAL_LIST_EMPTY(mutations_list)
return 0 return 0
return 1 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() /mob/living/carbon/proc/update_mutations_overlay()
return return
+7 -3
View File
@@ -15,6 +15,7 @@
ADD_TRAIT(owner, TRAIT_PUSHIMMUNE, TRAIT_HULK) ADD_TRAIT(owner, TRAIT_PUSHIMMUNE, TRAIT_HULK)
owner.update_body_parts() owner.update_body_parts()
SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, "hulk", /datum/mood_event/hulk) 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) /datum/mutation/human/hulk/on_attack_hand(mob/living/carbon/human/owner, atom/target, proximity)
if(proximity) //no telekinetic hulk attack if(proximity) //no telekinetic hulk attack
@@ -32,8 +33,11 @@
REMOVE_TRAIT(owner, TRAIT_PUSHIMMUNE, TRAIT_HULK) REMOVE_TRAIT(owner, TRAIT_PUSHIMMUNE, TRAIT_HULK)
owner.update_body_parts() owner.update_body_parts()
SEND_SIGNAL(owner, COMSIG_CLEAR_MOOD_EVENT, "hulk") 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) if(message)
message = "[uppertext(replacetext(message, ".", "!"))]!!" message = "[replacetext(message, ".", "!")]!!"
return message wrapped_message[1] = message
return COMPONENT_UPPERCASE_SPEECH
+87 -35
View File
@@ -17,9 +17,20 @@
text_gain_indication = "<span class='sans'>You feel an off sensation in your voicebox.</span>" 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>" text_lose_indication = "<span class='notice'>The off sensation passes.</span>"
/datum/mutation/human/wacky/get_spans() /datum/mutation/human/wacky/on_acquiring(mob/living/carbon/human/owner)
return list(SPAN_SANS) . = ..()
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 /datum/mutation/human/mute
name = "Mute" name = "Mute"
@@ -28,12 +39,14 @@
text_lose_indication = "<span class='danger'>You feel able to speak freely again.</span>" 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) /datum/mutation/human/mute/on_acquiring(mob/living/carbon/human/owner)
if(..()) . = ..()
if(.)
return return
ADD_TRAIT(owner, TRAIT_MUTE, GENETIC_MUTATION) ADD_TRAIT(owner, TRAIT_MUTE, GENETIC_MUTATION)
/datum/mutation/human/mute/on_losing(mob/living/carbon/human/owner) /datum/mutation/human/mute/on_losing(mob/living/carbon/human/owner)
if(..()) . = ..()
if(.)
return return
REMOVE_TRAIT(owner, TRAIT_MUTE, GENETIC_MUTATION) 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_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>" 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) if(message)
message = " [message] " message = " [message] "
//Time for a friendly game of SS13 //Time for a friendly game of SS13
@@ -92,7 +118,7 @@
message = replacetext(message," cunt "," privates ") message = replacetext(message," cunt "," privates ")
message = replacetext(message," dick "," jerk ") message = replacetext(message," dick "," jerk ")
message = replacetext(message," vagina "," privates ") message = replacetext(message," vagina "," privates ")
return trim(message) speech_args[SPEECH_MESSAGE] = trim(message)
/datum/mutation/human/unintelligible /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_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>" text_lose_indication = "<span class='danger'>Your mind feels more clear.</span>"
/datum/mutation/human/unintelligible/say_mod(message) /datum/mutation/human/unintelligible/on_acquiring(mob/living/carbon/human/owner)
if(message) . = ..()
var/prefix=copytext(message,1,2) if(.)
if(prefix == ";") return
message = copytext(message,2) ADD_TRAIT(owner, TRAIT_UNINTELLIGIBLE_SPEECH, GENETIC_MUTATION)
else if(prefix in list(":","#"))
prefix += copytext(message,2,3)
message = copytext(message,3)
else
prefix=""
var/list/words = splittext(message," ") /datum/mutation/human/unintelligible/on_losing(mob/living/carbon/human/owner)
var/list/rearranged = list() . = ..()
for(var/i=1;i<=words.len;i++) if(.)
var/cword = pick(words) return
words.Remove(cword) REMOVE_TRAIT(owner, TRAIT_UNINTELLIGIBLE_SPEECH, GENETIC_MUTATION)
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/swedish /datum/mutation/human/swedish
@@ -135,7 +148,20 @@
text_gain_indication = "<span class='notice'>You feel Swedish, however that works.</span>" 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>" 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) if(message)
message = replacetext(message,"w","v") message = replacetext(message,"w","v")
message = replacetext(message,"j","y") message = replacetext(message,"j","y")
@@ -144,7 +170,7 @@
message = replacetext(message,"o",pick("","","o")) message = replacetext(message,"o",pick("","","o"))
if(prob(30)) if(prob(30))
message += " Bork[pick("",", bork",", bork, bork")]!" message += " Bork[pick("",", bork",", bork, bork")]!"
return message speech_args[SPEECH_MESSAGE] = trim(message)
/datum/mutation/human/chav /datum/mutation/human/chav
@@ -154,7 +180,20 @@
text_gain_indication = "<span class='notice'>Ye feel like a reet prat like, innit?</span>" 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>" 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) if(message)
message = " [message] " message = " [message] "
message = replacetext(message," looking at "," gawpin' at ") message = replacetext(message," looking at "," gawpin' at ")
@@ -178,7 +217,7 @@
message = replacetext(message," break "," do ") message = replacetext(message," break "," do ")
message = replacetext(message," your "," yer ") message = replacetext(message," your "," yer ")
message = replacetext(message," security "," coppers ") message = replacetext(message," security "," coppers ")
return trim(message) speech_args[SPEECH_MESSAGE] = trim(message)
/datum/mutation/human/elvis /datum/mutation/human/elvis
@@ -199,7 +238,20 @@
if(prob(15)) 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")]!") 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) if(message)
message = " [message] " message = " [message] "
message = replacetext(message," i'm not "," I aint ") message = replacetext(message," i'm not "," I aint ")
@@ -211,7 +263,7 @@
message = replacetext(message," yes ",pick(" sure", "yea ")) message = replacetext(message," yes ",pick(" sure", "yea "))
message = replacetext(message," faggot "," square ") message = replacetext(message," faggot "," square ")
message = replacetext(message," muh valids "," getting my kicks ") message = replacetext(message," muh valids "," getting my kicks ")
return trim(message) speech_args[SPEECH_MESSAGE] = trim(message)
/datum/mutation/human/stoner /datum/mutation/human/stoner
+1
View File
@@ -14,6 +14,7 @@
var/verb_exclaim = "exclaims" var/verb_exclaim = "exclaims"
var/verb_whisper = "whispers" var/verb_whisper = "whispers"
var/verb_yell = "yells" var/verb_yell = "yells"
var/speech_span
var/inertia_dir = 0 var/inertia_dir = 0
var/atom/inertia_last_loc var/atom/inertia_last_loc
var/inertia_moving = 0 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 var/datum/dna/chosen_dna = chosen_prof.dna
user.real_name = chosen_prof.name user.real_name = chosen_prof.name
user.underwear = chosen_prof.underwear user.underwear = chosen_prof.underwear
user.undie_color = chosen_prof.undie_color
user.undershirt = chosen_prof.undershirt user.undershirt = chosen_prof.undershirt
user.shirt_color =chosen_prof.shirt_color
user.socks = chosen_prof.socks user.socks = chosen_prof.socks
user.socks_color =chosen_prof.socks_color
chosen_dna.transfer_identity(user, 1) chosen_dna.transfer_identity(user, 1)
user.updateappearance(mutcolor_update=1) user.updateappearance(mutcolor_update=1)
+5 -1
View File
@@ -275,7 +275,7 @@ Credit where due:
gloves = /obj/item/clothing/gloves/color/yellow gloves = /obj/item/clothing/gloves/color/yellow
belt = /obj/item/storage/belt/utility/servant belt = /obj/item/storage/belt/utility/servant
backpack_contents = list(/obj/item/storage/box/engineer = 1, \ 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 id = /obj/item/pda
var/plasmaman //We use this to determine if we should activate internals in post_equip() var/plasmaman //We use this to determine if we should activate internals in post_equip()
@@ -338,6 +338,10 @@ Credit where due:
CLOCKCULTCHANGELOG\ CLOCKCULTCHANGELOG\
</ul>\ </ul>\
<hr>\ <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>" <b>Good luck!</b>"
/obj/item/paper/servant_primer/Initialize() /obj/item/paper/servant_primer/Initialize()
@@ -42,18 +42,19 @@
var/obj/item/clothing/C var/obj/item/clothing/C
if(!H.w_uniform || H.dropItemToGround(H.w_uniform)) if(!H.w_uniform || H.dropItemToGround(H.w_uniform))
C = new /obj/item/clothing/under/rank/clown(H) 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) H.equip_to_slot_or_del(C, SLOT_W_UNIFORM)
if(!H.shoes || H.dropItemToGround(H.shoes)) if(!H.shoes || H.dropItemToGround(H.shoes))
C = new /obj/item/clothing/shoes/clown_shoes(H) 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) H.equip_to_slot_or_del(C, SLOT_SHOES)
if(!H.wear_mask || H.dropItemToGround(H.wear_mask)) if(!H.wear_mask || H.dropItemToGround(H.wear_mask))
C = new /obj/item/clothing/mask/gas/clown_hat(H) 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.equip_to_slot_or_del(C, SLOT_WEAR_MASK)
H.dna.add_mutation(CLOWNMUT) 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 H.gain_trauma(/datum/brain_trauma/mild/phobia, TRAUMA_RESILIENCE_LOBOTOMY, "clowns") //MWA HA HA
@@ -58,6 +58,7 @@
if(visualsOnly) if(visualsOnly)
return return
H.dna.add_mutation(CLOWNMUT) H.dna.add_mutation(CLOWNMUT)
H.dna.add_mutation(SMILE)
/datum/outfit/syndicate/clownop/leader /datum/outfit/syndicate/clownop/leader
name = "Clown Operative Leader - Basic" name = "Clown Operative Leader - Basic"
@@ -216,11 +216,11 @@
/obj/item/clothing/mask/fakemoustache/sticky/Initialize() /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) addtimer(CALLBACK(src, .proc/unstick), unstick_time)
/obj/item/clothing/mask/fakemoustache/sticky/proc/unstick() /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 //DARK H.O.N.K. AND CLOWN MECH WEAPONS
+2 -2
View File
@@ -96,10 +96,10 @@ GLOBAL_LIST_EMPTY(announcement_systems)
message = "The arrivals shuttle has been damaged. Docking for repairs..." message = "The arrivals shuttle has been damaged. Docking for repairs..."
if(channels.len == 0) if(channels.len == 0)
radio.talk_into(src, message, null, list(SPAN_ROBOT), get_default_language()) radio.talk_into(src, message, null)
else else
for(var/channel in channels) 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 //config stuff
+1 -4
View File
@@ -49,12 +49,9 @@
if(next_warning < world.time && prob(15)) if(next_warning < world.time && prob(15))
var/area/A = get_area(loc) var/area/A = get_area(loc)
var/message = "Unauthorized credit withdrawal underway in [A.map_name]!!" 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 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) /obj/machinery/computer/bank_machine/ui_interact(mob/user)
. = ..() . = ..()
var/dat = "[station_name()] secure vault. Authorized personnel only.<br>" var/dat = "[station_name()] secure vault. Authorized personnel only.<br>"
+1 -1
View File
@@ -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 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 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 /obj/machinery/clonepod
name = "cloning pod" name = "cloning pod"
+1 -1
View File
@@ -69,7 +69,7 @@
if(defib) if(defib)
to_chat(user, "<span class='warning'>There's already a defibrillator in [src]!</span>") to_chat(user, "<span class='warning'>There's already a defibrillator in [src]!</span>")
return 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>") to_chat(user, "<span class='warning'>[I] is stuck to your hand!</span>")
return return
user.visible_message("<span class='notice'>[user] hooks up [I] to [src]!</span>", \ user.visible_message("<span class='notice'>[user] hooks up [I] to [src]!</span>", \
+1 -1
View File
@@ -65,7 +65,7 @@
if(!isitem(A)) if(!isitem(A))
continue continue
var/obj/item/I = A var/obj/item/I = A
if(!(I.item_flags & NODROP)) if(!HAS_TRAIT(I, TRAIT_NODROP))
say("Subject may not have abiotic items on.") say("Subject may not have abiotic items on.")
playsound(src, 'sound/machines/buzz-sigh.ogg', 30, 1) playsound(src, 'sound/machines/buzz-sigh.ogg', 30, 1)
return return
+2 -2
View File
@@ -323,7 +323,7 @@ GLOBAL_LIST_EMPTY(allConsoles)
emergency = "Medical" emergency = "Medical"
if(radio_freq) if(radio_freq)
Radio.set_frequency(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() update_icon()
addtimer(CALLBACK(src, .proc/clear_emergency), 3000) addtimer(CALLBACK(src, .proc/clear_emergency), 3000)
@@ -382,7 +382,7 @@ GLOBAL_LIST_EMPTY(allConsoles)
screen = 6 screen = 6
if(radio_freq) 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) switch(priority)
if(2) if(2)
@@ -219,7 +219,7 @@
name = "stabilized plasma" name = "stabilized plasma"
desc = "A puddle of stabilized plasma." desc = "A puddle of stabilized plasma."
icon_state = "flour" icon_state = "flour"
color = "#C8A5DC" color = "#9e0089"
/obj/effect/decal/cleanable/insectguts /obj/effect/decal/cleanable/insectguts
name = "insect guts" name = "insect guts"
+1 -1
View File
@@ -131,7 +131,7 @@
var/obj/item/twohanded/required/chainsaw/doomslayer/chainsaw = new(victim.loc) var/obj/item/twohanded/required/chainsaw/doomslayer/chainsaw = new(victim.loc)
victim.log_message("entered a blood frenzy", LOG_ATTACK) 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.drop_all_held_items()
victim.put_in_hands(chainsaw, forced = TRUE) victim.put_in_hands(chainsaw, forced = TRUE)
chainsaw.attack_self(victim) chainsaw.attack_self(victim)
@@ -120,6 +120,33 @@
loot = GLOB.maintenance_loot 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 /obj/effect/spawner/lootdrop/crate_spawner
name = "lootcrate spawner" //USE PROMO CODE "SELLOUT" FOR 20% OFF! name = "lootcrate spawner" //USE PROMO CODE "SELLOUT" FOR 20% OFF!
lootdoubles = FALSE lootdoubles = FALSE
+1 -9
View File
@@ -230,9 +230,6 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
research_msg += "." research_msg += "."
to_chat(user, research_msg.Join()) to_chat(user, research_msg.Join())
/obj/item/proc/speechModification(message) //for message modding by mask slot.
return message
/obj/item/interact(mob/user) /obj/item/interact(mob/user)
add_fingerprint(user) add_fingerprint(user)
ui_interact(user) ui_interact(user)
@@ -647,11 +644,6 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
else 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) /obj/item/hitby(atom/movable/AM)
return return
@@ -825,6 +817,6 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
return ..() return ..()
/obj/item/throw_at(atom/target, range, speed, mob/thrower, spin=TRUE, diagonals_first = FALSE, var/datum/callback/callback) /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
return ..() return ..()
+4
View File
@@ -233,6 +233,10 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list(
playsound(get_turf(user), 'sound/items/deconstruct.ogg', 50, 1) playsound(get_turf(user), 'sound/items/deconstruct.ogg', 50, 1)
return(BRUTELOSS) 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, \ /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) datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
+2 -1
View File
@@ -48,7 +48,7 @@
icon_state = "chronogun" icon_state = "chronogun"
item_state = "chronogun" item_state = "chronogun"
w_class = WEIGHT_CLASS_NORMAL w_class = WEIGHT_CLASS_NORMAL
item_flags = NODROP | DROPDEL item_flags = DROPDEL
ammo_type = list(/obj/item/ammo_casing/energy/chrono_beam) ammo_type = list(/obj/item/ammo_casing/energy/chrono_beam)
can_charge = 0 can_charge = 0
fire_delay = 50 fire_delay = 50
@@ -58,6 +58,7 @@
/obj/item/gun/energy/chrono_gun/Initialize() /obj/item/gun/energy/chrono_gun/Initialize()
. = ..() . = ..()
ADD_TRAIT(src, TRAIT_NODROP, CHRONO_GUN_TRAIT)
if(istype(loc, /obj/item/chrono_eraser)) if(istype(loc, /obj/item/chrono_eraser))
TED = loc TED = loc
else //admin must have spawned it else //admin must have spawned it
@@ -512,17 +512,6 @@
name = "pink glowstick" name = "pink glowstick"
color = LIGHT_COLOR_PINK 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 /obj/item/flashlight/spotlight //invisible lighting source
name = "disco light" name = "disco light"
desc = "Groovy..." desc = "Groovy..."
+2 -2
View File
@@ -19,11 +19,11 @@
return return
if(istype(target, /obj/item)) if(istype(target, /obj/item))
var/obj/item/I = target 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>") to_chat(user, "<span class='warning'>[I] is already sticky!</span>")
return return
uses -= 1 uses -= 1
I.item_flags |= NODROP ADD_TRAIT(I, TRAIT_NODROP, GLUED_ITEM_TRAIT)
I.desc += " It looks sticky." I.desc += " It looks sticky."
to_chat(user, "<span class='notice'>You smear the [I] with glue, making it incredibly sticky!</span>") to_chat(user, "<span class='notice'>You smear the [I] with glue, making it incredibly sticky!</span>")
if(uses == 0) if(uses == 0)
+4 -1
View File
@@ -156,7 +156,10 @@ GLOBAL_LIST_EMPTY(GPS_list)
icon_state = "gps-b" icon_state = "gps-b"
gpstag = "BORG0" 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." 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 /obj/item/gps/internal
icon_state = null icon_state = null
@@ -234,11 +234,18 @@
w_class = WEIGHT_CLASS_SMALL w_class = WEIGHT_CLASS_SMALL
actions_types = list(/datum/action/item_action/instrument) 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)) if(song.playing && ismob(loc))
to_chat(loc, "<span class='warning'>You stop playing the harmonica to talk...</span>") to_chat(loc, "<span class='warning'>You stop playing the harmonica to talk...</span>")
song.playing = FALSE 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 /obj/item/instrument/bikehorn
name = "gilded bike horn" name = "gilded bike horn"
+18 -6
View File
@@ -17,13 +17,25 @@
user.say("AAAAAAAAAAAARGHHHHH", forced="megaphone suicide")//he must have died while coding this user.say("AAAAAAAAAAAARGHHHHH", forced="megaphone suicide")//he must have died while coding this
return OXYLOSS return OXYLOSS
/obj/item/megaphone/get_held_item_speechspans(mob/living/carbon/user) /obj/item/megaphone/equipped(mob/M, slot)
if(spamcheck > world.time) . = ..()
to_chat(user, "<span class='warning'>\The [src] needs to recharge!</span>") if (slot == SLOT_HANDS)
RegisterSignal(M, COMSIG_MOB_SAY, .proc/handle_speech)
else else
playsound(loc, 'sound/items/megaphone.ogg', 100, 0, 1) UnregisterSignal(M, COMSIG_MOB_SAY)
spamcheck = world.time + 50
return voicespan /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) /obj/item/megaphone/emag_act(mob/user)
if(obj_flags & EMAGGED) if(obj_flags & EMAGGED)
@@ -38,7 +38,7 @@
/obj/item/electropack/attackby(obj/item/W, mob/user, params) /obj/item/electropack/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/clothing/head/helmet)) 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' A.icon = 'icons/obj/assemblies.dmi'
if(!user.transferItemToLoc(W, A)) if(!user.transferItemToLoc(W, A))
@@ -53,8 +53,6 @@
user.put_in_hands(A) user.put_in_hands(A)
A.add_fingerprint(user) A.add_fingerprint(user)
if(item_flags & NODROP)
A.item_flags |= NODROP
else else
return ..() return ..()
@@ -106,8 +104,7 @@
if(shock_cooldown != 0) if(shock_cooldown != 0)
return return
shock_cooldown = 1 shock_cooldown = 1
spawn(100) addtimer(VARSET_CALLBACK(src, shock_cooldown, 0), 100)
shock_cooldown = 0
var/mob/living/L = loc var/mob/living/L = loc
step(L, pick(GLOB.cardinals)) step(L, pick(GLOB.cardinals))
@@ -189,7 +189,7 @@
/obj/item/radio/talk_into(atom/movable/M, message, channel, list/spans, datum/language/language) /obj/item/radio/talk_into(atom/movable/M, message, channel, list/spans, datum/language/language)
if(!spans) if(!spans)
spans = M.get_spans() spans = list(M.speech_span)
if(!language) if(!language)
language = M.get_default_language() language = M.get_default_language()
INVOKE_ASYNC(src, .proc/talk_into_impl, M, message, channel, spans.Copy(), language) INVOKE_ASYNC(src, .proc/talk_into_impl, M, message, channel, spans.Copy(), language)
@@ -49,7 +49,7 @@
if(iscarbon(user)) if(iscarbon(user))
var/mob/living/carbon/C = user var/mob/living/carbon/C = user
if(C.get_item_by_slot(SLOT_HEAD) == src) 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 struggling = TRUE
var/fear_string var/fear_string
switch(time_left) switch(time_left)
@@ -74,7 +74,7 @@
else else
user.visible_message("<span class='warning'>The lock on [user]'s [name] pops open!</span>", \ 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>") "<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 struggling = FALSE
else else
..() ..()
@@ -116,7 +116,7 @@
/obj/item/reverse_bear_trap/proc/reset() /obj/item/reverse_bear_trap/proc/reset()
ticking = FALSE ticking = FALSE
item_flags &= ~NODROP REMOVE_TRAIT(src, TRAIT_NODROP, REVERSE_BEAR_TRAP_TRAIT)
soundloop.stop() soundloop.stop()
soundloop2.stop() soundloop2.stop()
STOP_PROCESSING(SSprocessing, src) STOP_PROCESSING(SSprocessing, src)
@@ -125,7 +125,7 @@
ticking = TRUE ticking = TRUE
escape_chance = initial(escape_chance) //we keep these vars until re-arm, for tracking purposes escape_chance = initial(escape_chance) //we keep these vars until re-arm, for tracking purposes
time_left = initial(time_left) time_left = initial(time_left)
item_flags |= NODROP ADD_TRAIT(src, TRAIT_NODROP, REVERSE_BEAR_TRAP_TRAIT)
soundloop.start() soundloop.start()
soundloop2.mid_length = initial(soundloop2.mid_length) soundloop2.mid_length = initial(soundloop2.mid_length)
soundloop2.start() soundloop2.start()
+2 -6
View File
@@ -279,12 +279,8 @@
/obj/item/book/granter/spell/barnyard/recoil(mob/living/carbon/user) /obj/item/book/granter/spell/barnyard/recoil(mob/living/carbon/user)
if(ishuman(user)) if(ishuman(user))
to_chat(user,"<font size='15' color='red'><b>HORSIE HAS RISEN</b></font>") 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 var/obj/item/clothing/magichead = new /obj/item/clothing/mask/horsehead/cursed(user.drop_location())
magichead.item_flags |= NODROP //curses! user.dropItemToGround(user.wear_mask, TRUE)
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)
user.equip_to_slot_if_possible(magichead, SLOT_WEAR_MASK, TRUE, TRUE) user.equip_to_slot_if_possible(magichead, SLOT_WEAR_MASK, TRUE, TRUE)
qdel(src) qdel(src)
else else
+5 -5
View File
@@ -8,7 +8,7 @@
name = "artistic toolbox" name = "artistic toolbox"
desc = "A toolbox painted bright green. Looking at it makes you feel uneasy." desc = "A toolbox painted bright green. Looking at it makes you feel uneasy."
icon_state = "his_grace" icon_state = "his_grace"
item_state = "artistic_toolbox" item_state = "toolbox_green"
lefthand_file = 'icons/mob/inhands/equipment/toolbox_lefthand.dmi' lefthand_file = 'icons/mob/inhands/equipment/toolbox_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/toolbox_righthand.dmi' righthand_file = 'icons/mob/inhands/equipment/toolbox_righthand.dmi'
icon = 'icons/obj/items_and_weapons.dmi' icon = 'icons/obj/items_and_weapons.dmi'
@@ -90,7 +90,7 @@
do_attack_animation(master, null, src) do_attack_animation(master, null, src)
master.emote("scream") master.emote("scream")
master.remove_status_effect(STATUS_EFFECT_HISGRACE) master.remove_status_effect(STATUS_EFFECT_HISGRACE)
item_flags &= ~NODROP REMOVE_TRAIT(src, TRAIT_NODROP, HIS_GRACE_TRAIT)
master.Knockdown(60) master.Knockdown(60)
master.adjustBruteLoss(master.maxHealth) master.adjustBruteLoss(master.maxHealth)
playsound(master, 'sound/effects/splat.ogg', 100, 0) playsound(master, 'sound/effects/splat.ogg', 100, 0)
@@ -198,20 +198,20 @@
update_stats() update_stats()
/obj/item/his_grace/proc/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) var/mob/living/master = get_atom_on_turf(src, /mob/living)
switch(bloodthirst) switch(bloodthirst)
if(HIS_GRACE_CONSUME_OWNER to HIS_GRACE_FALL_ASLEEP) if(HIS_GRACE_CONSUME_OWNER to HIS_GRACE_FALL_ASLEEP)
if(HIS_GRACE_CONSUME_OWNER > prev_bloodthirst) if(HIS_GRACE_CONSUME_OWNER > prev_bloodthirst)
master.visible_message("<span class='userdanger'>[src] enters a frenzy!</span>") master.visible_message("<span class='userdanger'>[src] enters a frenzy!</span>")
if(HIS_GRACE_STARVING to HIS_GRACE_CONSUME_OWNER) 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) 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.\ 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 < 15 ? " And still, His power grows.":""]</span>")
force_bonus = max(force_bonus, 15) force_bonus = max(force_bonus, 15)
if(HIS_GRACE_FAMISHED to HIS_GRACE_STARVING) 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) 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.\ 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>") [force_bonus < 10 ? " His power grows.":""]</span>")
+12 -3
View File
@@ -280,12 +280,19 @@
righthand_file = 'icons/mob/inhands/items_righthand.dmi' righthand_file = 'icons/mob/inhands/items_righthand.dmi'
name = "god hand" name = "god hand"
desc = "This hand of yours glows with an awesome power!" desc = "This hand of yours glows with an awesome power!"
item_flags = ABSTRACT | NODROP | DROPDEL item_flags = ABSTRACT | DROPDEL
w_class = WEIGHT_CLASS_HUGE w_class = WEIGHT_CLASS_HUGE
hitsound = 'sound/weapons/sear.ogg' hitsound = 'sound/weapons/sear.ogg'
damtype = BURN damtype = BURN
attack_verb = list("punched", "cross countered", "pummeled") attack_verb = list("punched", "cross countered", "pummeled")
/obj/item/nullrod/godhand/Initialize()
. = ..()
ADD_TRAIT(src, TRAIT_NODROP, HAND_REPLACEMENT_TRAIT)
/obj/item/nullrod/staff /obj/item/nullrod/staff
icon_state = "godstaff-red" icon_state = "godstaff-red"
item_state = "godstaff-red" item_state = "godstaff-red"
@@ -525,13 +532,14 @@
lefthand_file = 'icons/mob/inhands/weapons/chainsaw_lefthand.dmi' lefthand_file = 'icons/mob/inhands/weapons/chainsaw_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/chainsaw_righthand.dmi' righthand_file = 'icons/mob/inhands/weapons/chainsaw_righthand.dmi'
w_class = WEIGHT_CLASS_HUGE w_class = WEIGHT_CLASS_HUGE
item_flags = NODROP | ABSTRACT item_flags = ABSTRACT
sharpness = IS_SHARP sharpness = IS_SHARP
attack_verb = list("sawed", "torn", "cut", "chopped", "diced") attack_verb = list("sawed", "torn", "cut", "chopped", "diced")
hitsound = 'sound/weapons/chainsawhit.ogg' hitsound = 'sound/weapons/chainsawhit.ogg'
/obj/item/nullrod/chainsaw/Initialize() /obj/item/nullrod/chainsaw/Initialize()
. = ..() . = ..()
ADD_TRAIT(src, TRAIT_NODROP, HAND_REPLACEMENT_TRAIT)
AddComponent(/datum/component/butchering, 30, 100, 0, hitsound) AddComponent(/datum/component/butchering, 30, 100, 0, hitsound)
/obj/item/nullrod/clown /obj/item/nullrod/clown
@@ -601,12 +609,13 @@
item_state = "arm_blade" item_state = "arm_blade"
lefthand_file = 'icons/mob/inhands/antag/changeling_lefthand.dmi' lefthand_file = 'icons/mob/inhands/antag/changeling_lefthand.dmi'
righthand_file = 'icons/mob/inhands/antag/changeling_righthand.dmi' righthand_file = 'icons/mob/inhands/antag/changeling_righthand.dmi'
item_flags = ABSTRACT | NODROP item_flags = ABSTRACT
w_class = WEIGHT_CLASS_HUGE w_class = WEIGHT_CLASS_HUGE
sharpness = IS_SHARP sharpness = IS_SHARP
/obj/item/nullrod/armblade/Initialize() /obj/item/nullrod/armblade/Initialize()
. = ..() . = ..()
ADD_TRAIT(src, TRAIT_NODROP, HAND_REPLACEMENT_TRAIT)
AddComponent(/datum/component/butchering, 80, 70) AddComponent(/datum/component/butchering, 80, 70)
/obj/item/nullrod/armblade/tentacle /obj/item/nullrod/armblade/tentacle
+2 -2
View File
@@ -134,7 +134,7 @@
return return
update_icon() update_icon()
if(sticky) if(sticky)
item_flags |= NODROP ADD_TRAIT(src, TRAIT_NODROP, HOT_POTATO_TRAIT)
name = "primed [name]" name = "primed [name]"
activation_time = timer + world.time activation_time = timer + world.time
detonation_timerid = addtimer(CALLBACK(src, .proc/detonate), delay, TIMER_STOPPABLE) detonation_timerid = addtimer(CALLBACK(src, .proc/detonate), delay, TIMER_STOPPABLE)
@@ -147,7 +147,7 @@
/obj/item/hot_potato/proc/deactivate() /obj/item/hot_potato/proc/deactivate()
update_icon() update_icon()
name = initial(name) name = initial(name)
item_flags &= ~NODROP REMOVE_TRAIT(src, TRAIT_NODROP, HOT_POTATO_TRAIT)
deltimer(detonation_timerid) deltimer(detonation_timerid)
STOP_PROCESSING(SSfastprocess, src) STOP_PROCESSING(SSfastprocess, src)
detonation_timerid = null detonation_timerid = null
+26 -6
View File
@@ -42,7 +42,7 @@
force = 20 force = 20
throwforce = 10 throwforce = 10
hitsound = 'sound/weapons/bladeslice.ogg' 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 sharpness = IS_SHARP
/obj/item/melee/synthetic_arm_blade/Initialize() /obj/item/melee/synthetic_arm_blade/Initialize()
@@ -92,8 +92,7 @@
/obj/item/melee/sabre/suicide_act(mob/living/user) /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>") 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/i = 0
var/originally_nodropped = item_flags & NODROP ADD_TRAIT(src, TRAIT_NODROP, SABRE_SUICIDE_TRAIT)
item_flags |= NODROP
if(iscarbon(user)) if(iscarbon(user))
var/mob/living/carbon/Cuser = user var/mob/living/carbon/Cuser = user
var/obj/item/bodypart/holding_bodypart = Cuser.get_holding_bodypart_of_item(src) var/obj/item/bodypart/holding_bodypart = Cuser.get_holding_bodypart_of_item(src)
@@ -118,7 +117,7 @@
for(bodypart in limbs_to_dismember) for(bodypart in limbs_to_dismember)
i++ i++
addtimer(CALLBACK(src, .proc/suicide_dismember, user, bodypart), speedbase * 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 return MANUAL_SUICIDE
/obj/item/melee/sabre/proc/suicide_dismember(mob/living/user, obj/item/bodypart/affecting) /obj/item/melee/sabre/proc/suicide_dismember(mob/living/user, obj/item/bodypart/affecting)
@@ -131,8 +130,29 @@
if(!QDELETED(user)) if(!QDELETED(user))
user.adjustBruteLoss(200) user.adjustBruteLoss(200)
user.death(FALSE) user.death(FALSE)
if(!originally_nodropped) REMOVE_TRAIT(src, TRAIT_NODROP, SABRE_SUICIDE_TRAIT)
item_flags &= ~NODROP
/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 /obj/item/melee/classic_baton
name = "police baton" name = "police baton"
+2 -2
View File
@@ -15,7 +15,7 @@
var/mopping = 0 var/mopping = 0
var/mopcount = 0 var/mopcount = 0
var/mopcap = 5 var/mopcap = 5
var/stamusage = 5 var/stamusage = 2
force_string = "robust... against germs" force_string = "robust... against germs"
var/insertable = TRUE var/insertable = TRUE
@@ -94,7 +94,7 @@
force = 6 force = 6
throwforce = 8 throwforce = 8
throw_range = 4 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_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_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 var/refill_reagent = "water" //Determins what reagent to use for refilling, just in case someone wanted to make a HOLY MOP OF PURGING
+1 -9
View File
@@ -578,10 +578,6 @@
icon_state = "vulken" icon_state = "vulken"
item_state = "vulken" item_state = "vulken"
/obj/item/toy/plush/snakeplushie/jecca
icon_state = "jecca"
item_state = "jecca"
/obj/item/toy/plush/nukeplushie /obj/item/toy/plush/nukeplushie
name = "operative plushie" name = "operative plushie"
desc = "A stuffed toy that resembles a syndicate nuclear operative. The tag claims operatives to be purely fictitious." desc = "A stuffed toy that resembles a syndicate nuclear operative. The tag claims operatives to be purely fictitious."
@@ -634,13 +630,9 @@
/obj/item/toy/plush/mothplushie /obj/item/toy/plush/mothplushie
name = "insect plushie" name = "insect plushie"
desc = "An adorable stuffed toy that resembles some kind of insect" 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" icon_state = "bumble"
item_state = "bumble" item_state = "bumble"
squeak_override = list('modular_citadel/sound/voice/mothsqueak.ogg' = 1)
/obj/item/toy/plush/mothplushie/nameko /obj/item/toy/plush/mothplushie/nameko
icon_state = "nameko" icon_state = "nameko"
+9 -4
View File
@@ -159,11 +159,13 @@
armor = list("melee" = 25, "bullet" = 25, "laser" = 5, "energy" = 0, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 70, "acid" = 80) 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' lefthand_file = 'icons/mob/inhands/equipment/shields_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/shields_righthand.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) materials = list(MAT_METAL = 18000)
slot_flags = null slot_flags = null
block_chance = 25 block_chance = 35
force = 5 force = 10
throwforce = 7 throwforce = 7
/obj/item/shield/riot/tower /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." 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 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" item_state = "metal"
icon_state = "metal"
icon = 'icons/obj/items_and_weapons.dmi'
block_chance = 75 //1/4 shots will hit* block_chance = 75 //1/4 shots will hit*
force = 10 force = 16
slowdown = 2 slowdown = 2
throwforce = 15 //Massive pice of metal throwforce = 15 //Massive pice of metal
w_class = WEIGHT_CLASS_HUGE w_class = WEIGHT_CLASS_HUGE
item_flags = SLOWS_WHILE_IN_HAND
@@ -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 - 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 - 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), \ 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 throw_range = 3
turf_type = /turf/open/floor/clockwork turf_type = /turf/open/floor/clockwork
novariants = FALSE 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 merge_type = /obj/item/stack/tile/brass
/obj/item/stack/tile/brass/narsie_act() /obj/item/stack/tile/brass/narsie_act()
+32 -2
View File
@@ -664,6 +664,32 @@
/obj/item/melee/sabre /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) /obj/item/storage/belt/sabre/examine(mob/user)
..() ..()
if(length(contents)) if(length(contents))
@@ -681,8 +707,8 @@
to_chat(user, "[src] is empty.") to_chat(user, "[src] is empty.")
/obj/item/storage/belt/sabre/update_icon() /obj/item/storage/belt/sabre/update_icon()
icon_state = "sheath" icon_state = initial(icon_state)
item_state = "sheath" item_state = initial(item_state)
if(contents.len) if(contents.len)
icon_state += "-sabre" icon_state += "-sabre"
item_state += "-sabre" item_state += "-sabre"
@@ -694,3 +720,7 @@
/obj/item/storage/belt/sabre/PopulateContents() /obj/item/storage/belt/sabre/PopulateContents()
new /obj/item/melee/sabre(src) new /obj/item/melee/sabre(src)
update_icon() update_icon()
/obj/item/storage/belt/sabre/rapier/PopulateContents()
new /obj/item/melee/rapier(src)
update_icon()
+1
View File
@@ -74,6 +74,7 @@ GLOBAL_LIST_INIT(bibleitemstates, list("bible", "koran", "scrapbook", "bible",
if(B.icon_state == "honk1" || B.icon_state == "honk2") if(B.icon_state == "honk1" || B.icon_state == "honk2")
var/mob/living/carbon/human/H = usr var/mob/living/carbon/human/H = usr
H.dna.add_mutation(CLOWNMUT) 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) 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 GLOB.bible_icon_state = B.icon_state
+60 -6
View File
@@ -1,3 +1,5 @@
GLOBAL_LIST_EMPTY(rubber_toolbox_icons)
/obj/item/storage/toolbox /obj/item/storage/toolbox
name = "toolbox" name = "toolbox"
desc = "Danger. Very robust." desc = "Danger. Very robust."
@@ -16,21 +18,25 @@
hitsound = 'sound/weapons/smash.ogg' hitsound = 'sound/weapons/smash.ogg'
var/latches = "single_latch" var/latches = "single_latch"
var/has_latches = TRUE var/has_latches = TRUE
var/can_rubberify = TRUE
/obj/item/storage/toolbox/Initialize() /obj/item/storage/toolbox/Initialize(mapload)
. = ..() . = ..()
if(has_latches) if(has_latches)
if(prob(10)) if(prob(10))
latches = "double_latch" latches = "double_latch"
if(prob(1)) if(prob(1))
latches = "triple_latch" latches = "triple_latch"
if(mapload && can_rubberify && prob(5))
rubberify()
update_icon() update_icon()
/obj/item/storage/toolbox/update_icon() /obj/item/storage/toolbox/update_icon()
..() ..()
cut_overlays() cut_overlays()
if(has_latches) 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) /obj/item/storage/toolbox/suicide_act(mob/user)
@@ -39,8 +45,6 @@
/obj/item/storage/toolbox/emergency /obj/item/storage/toolbox/emergency
name = "emergency toolbox" name = "emergency toolbox"
icon_state = "red"
item_state = "toolbox_red"
/obj/item/storage/toolbox/emergency/PopulateContents() /obj/item/storage/toolbox/emergency/PopulateContents()
new /obj/item/crowbar/red(src) new /obj/item/crowbar/red(src)
@@ -59,6 +63,7 @@
name = "rusty red toolbox" name = "rusty red toolbox"
icon_state = "toolbox_red_old" icon_state = "toolbox_red_old"
has_latches = FALSE has_latches = FALSE
can_rubberify = FALSE
/obj/item/storage/toolbox/mechanical /obj/item/storage/toolbox/mechanical
name = "mechanical toolbox" name = "mechanical toolbox"
@@ -77,6 +82,7 @@
name = "rusty blue toolbox" name = "rusty blue toolbox"
icon_state = "toolbox_blue_old" icon_state = "toolbox_blue_old"
has_latches = FALSE has_latches = FALSE
can_rubberify = FALSE
/obj/item/storage/toolbox/mechanical/old/heirloom /obj/item/storage/toolbox/mechanical/old/heirloom
name = "old, robust toolbox" //this will be named "X family toolbox" name = "old, robust toolbox" //this will be named "X family toolbox"
@@ -151,6 +157,7 @@
resistance_flags = FIRE_PROOF | ACID_PROOF resistance_flags = FIRE_PROOF | ACID_PROOF
w_class = WEIGHT_CLASS_HUGE w_class = WEIGHT_CLASS_HUGE
attack_verb = list("robusted", "crushed", "smashed") attack_verb = list("robusted", "crushed", "smashed")
can_rubberify = FALSE
var/fabricator_type = /obj/item/clockwork/replica_fabricator/scarab var/fabricator_type = /obj/item/clockwork/replica_fabricator/scarab
/obj/item/storage/toolbox/brass/ComponentInitialize() /obj/item/storage/toolbox/brass/ComponentInitialize()
@@ -191,6 +198,7 @@
item_state = "toolbox_blue" item_state = "toolbox_blue"
w_class = WEIGHT_CLASS_HUGE //heyo no bohing this! w_class = WEIGHT_CLASS_HUGE //heyo no bohing this!
force = 18 //spear damage force = 18 //spear damage
can_rubberify = FALSE
/obj/item/storage/toolbox/plastitanium/afterattack(atom/A, mob/user, proximity) /obj/item/storage/toolbox/plastitanium/afterattack(atom/A, mob/user, proximity)
. = ..() . = ..()
@@ -204,7 +212,7 @@
name = "artistic toolbox" 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." 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" icon_state = "green"
item_state = "artistic_toolbox" item_state = "toolbox_green"
w_class = WEIGHT_CLASS_GIGANTIC //Holds more than a regular toolbox! w_class = WEIGHT_CLASS_GIGANTIC //Holds more than a regular toolbox!
/obj/item/storage/toolbox/artistic/ComponentInitialize() /obj/item/storage/toolbox/artistic/ComponentInitialize()
@@ -253,9 +261,55 @@
/obj/item/storage/toolbox/gold_fake // used in crafting /obj/item/storage/toolbox/gold_fake // used in crafting
name = "golden toolbox" 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" icon_state = "gold"
item_state = "gold" item_state = "gold"
has_latches = FALSE has_latches = FALSE
force = 0 force = 0
throwforce = 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)
+2 -3
View File
@@ -6,10 +6,9 @@
w_class = WEIGHT_CLASS_TINY w_class = WEIGHT_CLASS_TINY
var/taste_sensitivity = 15 speech_span = null
/obj/item/taster/get_spans() var/taste_sensitivity = 15
return list()
/obj/item/taster/afterattack(atom/O, mob/user, proximity) /obj/item/taster/afterattack(atom/O, mob/user, proximity)
. = ..() . = ..()
+6 -1
View File
@@ -34,6 +34,12 @@
icon_state = "crowbar_brass" icon_state = "crowbar_brass"
toolspeed = 0.5 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 /obj/item/crowbar/abductor
name = "alien crowbar" name = "alien crowbar"
desc = "A hard-light crowbar. It appears to pry by itself, without any effort required." desc = "A hard-light crowbar. It appears to pry by itself, without any effort required."
@@ -42,7 +48,6 @@
icon_state = "crowbar" icon_state = "crowbar"
toolspeed = 0.1 toolspeed = 0.1
/obj/item/crowbar/large /obj/item/crowbar/large
name = "crowbar" name = "crowbar"
desc = "It's a big crowbar. It doesn't fit in your pockets, because it's big." desc = "It's a big crowbar. It doesn't fit in your pockets, because it's big."
@@ -86,6 +86,14 @@
toolspeed = 0.5 toolspeed = 0.5
random_color = FALSE 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 /obj/item/screwdriver/abductor
name = "alien screwdriver" name = "alien screwdriver"
desc = "An ultrasonic screwdriver." desc = "An ultrasonic screwdriver."
@@ -363,6 +363,13 @@
icon_state = "brasswelder" icon_state = "brasswelder"
item_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() /obj/item/weldingtool/experimental/process()
..() ..()
@@ -69,6 +69,13 @@
random_color = FALSE random_color = FALSE
toolspeed = 0.5 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 /obj/item/wirecutters/abductor
name = "alien wirecutters" name = "alien wirecutters"
desc = "Extremely sharp wirecutters, made out of a silvery-green metal." desc = "Extremely sharp wirecutters, made out of a silvery-green metal."
+6 -1
View File
@@ -35,6 +35,12 @@
icon_state = "wrench_brass" icon_state = "wrench_brass"
toolspeed = 0.5 toolspeed = 0.5
/obj/item/wrench/bronze
name = "bronze plated wrench"
desc = "A bronze plated wrench."
icon_state = "wrench_brass"
toolspeed = 0.95
/obj/item/wrench/abductor /obj/item/wrench/abductor
name = "alien wrench" name = "alien wrench"
desc = "A polarized wrench. It causes anything placed between the jaws to turn." desc = "A polarized wrench. It causes anything placed between the jaws to turn."
@@ -43,7 +49,6 @@
usesound = 'sound/effects/empulse.ogg' usesound = 'sound/effects/empulse.ogg'
toolspeed = 0.1 toolspeed = 0.1
/obj/item/wrench/power /obj/item/wrench/power
name = "hand drill" name = "hand drill"
desc = "A simple powered hand drill. It's fitted with a bolt bit." desc = "A simple powered hand drill. It's fitted with a bolt bit."
+3 -3
View File
@@ -249,8 +249,8 @@
// Copied from /obj/item/melee/transforming/energy/sword/attackby // Copied from /obj/item/melee/transforming/energy/sword/attackby
/obj/item/toy/sword/attackby(obj/item/W, mob/living/user, params) /obj/item/toy/sword/attackby(obj/item/W, mob/living/user, params)
if(istype(W, /obj/item/toy/sword)) if(istype(W, /obj/item/toy/sword))
if((W.item_flags & NODROP) || (item_flags & NODROP)) if(HAS_TRAIT(W, TRAIT_NODROP) || HAS_TRAIT(src, TRAIT_NODROP))
to_chat(user, "<span class='warning'>\the [item_flags & NODROP ? src : W] is stuck to your hand, you can't attach it to \the [item_flags & NODROP ? W : src]!</span>") to_chat(user, "<span class='warning'>\the [HAS_TRAIT(src, TRAIT_NODROP) ? src : W] is stuck to your hand, you can't attach it to \the [HAS_TRAIT(src, TRAIT_NODROP) ? W : src]!</span>")
return return
else else
to_chat(user, "<span class='notice'>You attach the ends of the two plastic swords, making a single double-bladed toy! You're fake-cool.</span>") to_chat(user, "<span class='notice'>You attach the ends of the two plastic swords, making a single double-bladed toy! You're fake-cool.</span>")
@@ -294,7 +294,7 @@
name = "windup toolbox" name = "windup toolbox"
desc = "A replica toolbox that rumbles when you turn the key." desc = "A replica toolbox that rumbles when you turn the key."
icon_state = "his_grace" icon_state = "his_grace"
item_state = "artistic_toolbox" item_state = "toolbox_green"
lefthand_file = 'icons/mob/inhands/equipment/toolbox_lefthand.dmi' lefthand_file = 'icons/mob/inhands/equipment/toolbox_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/toolbox_righthand.dmi' righthand_file = 'icons/mob/inhands/equipment/toolbox_righthand.dmi'
var/active = FALSE var/active = FALSE
+12 -4
View File
@@ -81,7 +81,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
/obj/item/claymore/highlander //ALL COMMENTS MADE REGARDING THIS SWORD MUST BE MADE IN ALL CAPS /obj/item/claymore/highlander //ALL COMMENTS MADE REGARDING THIS SWORD MUST BE MADE IN ALL CAPS
desc = "<b><i>THERE CAN BE ONLY ONE, AND IT WILL BE YOU!!!</i></b>\nActivate it in your hand to point to the nearest victim." desc = "<b><i>THERE CAN BE ONLY ONE, AND IT WILL BE YOU!!!</i></b>\nActivate it in your hand to point to the nearest victim."
flags_1 = CONDUCT_1 flags_1 = CONDUCT_1
item_flags = NODROP | DROPDEL item_flags = DROPDEL
slot_flags = null slot_flags = null
block_chance = 0 //RNG WON'T HELP YOU NOW, PANSY block_chance = 0 //RNG WON'T HELP YOU NOW, PANSY
light_range = 3 light_range = 3
@@ -91,6 +91,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
/obj/item/claymore/highlander/Initialize() /obj/item/claymore/highlander/Initialize()
. = ..() . = ..()
ADD_TRAIT(src, TRAIT_NODROP, HIGHLANDER)
START_PROCESSING(SSobj, src) START_PROCESSING(SSobj, src)
/obj/item/claymore/highlander/Destroy() /obj/item/claymore/highlander/Destroy()
@@ -225,7 +226,10 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
/obj/item/katana/cursed /obj/item/katana/cursed
slot_flags = null slot_flags = null
item_flags = NODROP
/obj/item/katana/Initialize()
. = ..()
ADD_TRAIT(src, TRAIT_NODROP, CURSED_ITEM_TRAIT)
/obj/item/katana/suicide_act(mob/user) /obj/item/katana/suicide_act(mob/user)
user.visible_message("<span class='suicide'>[user] is slitting [user.p_their()] stomach open with [src]! It looks like [user.p_theyre()] trying to commit seppuku!</span>") user.visible_message("<span class='suicide'>[user] is slitting [user.p_their()] stomach open with [src]! It looks like [user.p_theyre()] trying to commit seppuku!</span>")
@@ -255,7 +259,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
user.put_in_hands(S) user.put_in_hands(S)
to_chat(user, "<span class='notice'>You fasten the glass shard to the top of the rod with the cable.</span>") to_chat(user, "<span class='notice'>You fasten the glass shard to the top of the rod with the cable.</span>")
else if(istype(I, /obj/item/assembly/igniter) && !(I.item_flags & NODROP)) else if(istype(I, /obj/item/assembly/igniter) && !HAS_TRAIT(I, TRAIT_NODROP))
var/obj/item/melee/baton/cattleprod/P = new /obj/item/melee/baton/cattleprod var/obj/item/melee/baton/cattleprod/P = new /obj/item/melee/baton/cattleprod
remove_item_from_storage(user) remove_item_from_storage(user)
@@ -418,7 +422,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
item_state = "mounted_chainsaw" item_state = "mounted_chainsaw"
lefthand_file = 'icons/mob/inhands/weapons/chainsaw_lefthand.dmi' lefthand_file = 'icons/mob/inhands/weapons/chainsaw_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/chainsaw_righthand.dmi' righthand_file = 'icons/mob/inhands/weapons/chainsaw_righthand.dmi'
item_flags = NODROP | ABSTRACT | DROPDEL item_flags = ABSTRACT | DROPDEL
w_class = WEIGHT_CLASS_HUGE w_class = WEIGHT_CLASS_HUGE
force = 24 force = 24
throwforce = 0 throwforce = 0
@@ -428,6 +432,10 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
attack_verb = list("sawed", "torn", "cut", "chopped", "diced") attack_verb = list("sawed", "torn", "cut", "chopped", "diced")
hitsound = 'sound/weapons/chainsawhit.ogg' hitsound = 'sound/weapons/chainsawhit.ogg'
/obj/item/mounted_chainsaw/Initialize()
. = ..()
ADD_TRAIT(src, TRAIT_NODROP, HAND_REPLACEMENT_TRAIT)
/obj/item/mounted_chainsaw/Destroy() /obj/item/mounted_chainsaw/Destroy()
var/obj/item/bodypart/part var/obj/item/bodypart/part
new /obj/item/twohanded/required/chainsaw(get_turf(src)) new /obj/item/twohanded/required/chainsaw(get_turf(src))
+6 -1
View File
@@ -48,7 +48,12 @@
/obj/hitby(atom/movable/AM) /obj/hitby(atom/movable/AM)
..() ..()
take_damage(AM.throwforce, BRUTE, "melee", 1, get_dir(src, AM)) var/throwdamage = AM.throwforce
if(isobj(AM))
var/obj/O = AM
if(O.damtype == STAMINA)
throwdamage = 0
take_damage(throwdamage, BRUTE, "melee", 1, get_dir(src, AM))
/obj/ex_act(severity, target) /obj/ex_act(severity, target)
if(resistance_flags & INDESTRUCTIBLE) if(resistance_flags & INDESTRUCTIBLE)
+1 -3
View File
@@ -2,6 +2,7 @@
/obj /obj
var/crit_fail = FALSE var/crit_fail = FALSE
animate_movement = 2 animate_movement = 2
speech_span = SPAN_ROBOT
var/obj_flags = CAN_BE_HIT var/obj_flags = CAN_BE_HIT
var/set_obj_flags // ONLY FOR MAPPING: Sets flags from a string list, handled in Initialize. Usage: set_obj_flags = "EMAGGED;!CAN_BE_HIT" to set EMAGGED and clear CAN_BE_HIT. var/set_obj_flags // ONLY FOR MAPPING: Sets flags from a string list, handled in Initialize. Usage: set_obj_flags = "EMAGGED;!CAN_BE_HIT" to set EMAGGED and clear CAN_BE_HIT.
@@ -204,9 +205,6 @@
if(!anchored || current_size >= STAGE_FIVE) if(!anchored || current_size >= STAGE_FIVE)
step_towards(src,S) step_towards(src,S)
/obj/get_spans()
return ..() | SPAN_ROBOT
/obj/get_dumping_location(datum/component/storage/source,mob/user) /obj/get_dumping_location(datum/component/storage/source,mob/user)
return get_turf(src) return get_turf(src)
+10
View File
@@ -294,6 +294,16 @@
icon = "the_lightbulb" icon = "the_lightbulb"
desc = "A cafe popular among moths and moffs. Once shut down for a week after the bartender used mothballs to protect her spare uniforms." desc = "A cafe popular among moths and moffs. Once shut down for a week after the bartender used mothballs to protect her spare uniforms."
/datum/barsign/cybersylph
name = "Cyber Sylph's"
icon = "cybersylph"
desc = "A cafe renowed for its out-of-boundaries futuristic insignia."
/datum/barsign/meow_mix
name = "Meow Mix"
icon = "meow_mix"
desc = "No, we don't serve catnip, officer!"
/datum/barsign/hiddensigns /datum/barsign/hiddensigns
hidden = TRUE hidden = TRUE
@@ -147,47 +147,48 @@
/obj/structure/closet/proc/insert(atom/movable/AM) /obj/structure/closet/proc/insert(atom/movable/AM)
if(contents.len >= storage_capacity) if(contents.len >= storage_capacity)
return -1 return -1
if(insertion_allowed(AM))
AM.forceMove(src)
return TRUE
else
return FALSE
/obj/structure/closet/proc/insertion_allowed(atom/movable/AM)
if(ismob(AM)) if(ismob(AM))
if(!isliving(AM)) //let's not put ghosts or camera mobs inside closets... if(!isliving(AM)) //let's not put ghosts or camera mobs inside closets...
return return FALSE
var/mob/living/L = AM var/mob/living/L = AM
if(L.anchored || L.buckled || L.incorporeal_move || L.has_buckled_mobs()) if(L.anchored || L.buckled || L.incorporeal_move || L.has_buckled_mobs())
return return FALSE
if(L.mob_size > MOB_SIZE_TINY) // Tiny mobs are treated as items. if(L.mob_size > MOB_SIZE_TINY) // Tiny mobs are treated as items.
if(horizontal && L.density) if(horizontal && L.density)
return return FALSE
if(L.mob_size > max_mob_size) if(L.mob_size > max_mob_size)
return return FALSE
var/mobs_stored = 0 var/mobs_stored = 0
for(var/mob/living/M in contents) for(var/mob/living/M in contents)
if(++mobs_stored >= mob_storage_capacity) if(++mobs_stored >= mob_storage_capacity)
return return FALSE
L.stop_pulling() L.stop_pulling()
else if(istype(AM, /obj/structure/closet)) else if(istype(AM, /obj/structure/closet))
return return FALSE
else if(istype(AM, /obj/effect)) else if(istype(AM, /obj/effect))
return return FALSE
else if(isobj(AM)) else if(isobj(AM))
if (istype(AM, /obj/item)) if((!allow_dense && AM.density) || AM.anchored || AM.has_buckled_mobs())
var/obj/item/I = AM return FALSE
if (I.item_flags & NODROP) if(isitem(AM) && !HAS_TRAIT(AM, TRAIT_NODROP))
return return TRUE
else if(!allow_objects && !istype(AM, /obj/effect/dummy/chameleon)) else if(!allow_objects && !istype(AM, /obj/effect/dummy/chameleon))
return return FALSE
if(!allow_dense && AM.density)
return
if(AM.anchored || AM.has_buckled_mobs())
return
else else
return return FALSE
AM.forceMove(src) return TRUE
return 1
/obj/structure/closet/proc/close(mob/living/user) /obj/structure/closet/proc/close(mob/living/user)
if(!opened || !can_close(user)) if(!opened || !can_close(user))
+53 -26
View File
@@ -21,35 +21,62 @@
/obj/structure/dresser/attack_hand(mob/user) /obj/structure/dresser/attack_hand(mob/user)
. = ..() . = ..()
if(.) if(. || !ishuman(user) || !user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
return return
if(!Adjacent(user))//no tele-grooming var/mob/living/carbon/human/H = user
if(H.dna && H.dna.species && (NO_UNDERWEAR in H.dna.species.species_traits))
to_chat(H, "<span class='warning'>You are not capable of wearing underwear.</span>")
return return
if(ishuman(user))
var/mob/living/carbon/human/H = user
if(H.dna && H.dna.species && (NO_UNDERWEAR in H.dna.species.species_traits)) var/list/undergarment_choices = list("Underwear", "Underwear Color", "Undershirt", "Undershirt Color", "Socks", "Socks Color")
to_chat(user, "<span class='warning'>You are not capable of wearing underwear.</span>") if(!UNDIE_COLORABLE(GLOB.underwear_list[H.underwear]))
return undergarment_choices -= "Underwear Color"
if(!UNDIE_COLORABLE(GLOB.undershirt_list[H.undershirt]))
undergarment_choices -= "Undershirt Color"
if(!UNDIE_COLORABLE(GLOB.socks_list[H.socks]))
undergarment_choices -= "Socks Color"
var/choice = input(user, "Underwear, Undershirt, or Socks?", "Changing") as null|anything in list("Underwear","Undershirt","Socks") var/choice = input(H, "Underwear, Undershirt, or Socks?", "Changing") as null|anything in undergarment_choices
if(!H.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
return
var/dye_undie = FALSE
var/dye_shirt = FALSE
var/dye_socks = FALSE
switch(choice)
if("Underwear")
var/new_undies = input(H, "Select your underwear", "Changing") as null|anything in GLOB.underwear_list
if(H.underwear)
H.underwear = new_undies
H.saved_underwear = new_undies
var/datum/sprite_accessory/underwear/bottom/B = GLOB.underwear_list[new_undies]
dye_undie = B?.has_color
if("Undershirt")
var/new_undershirt = input(H, "Select your undershirt", "Changing") as null|anything in GLOB.undershirt_list
if(new_undershirt)
H.undershirt = new_undershirt
H.saved_undershirt = new_undershirt
var/datum/sprite_accessory/underwear/top/T = GLOB.undershirt_list[new_undershirt]
dye_shirt = T?.has_color
if("Socks")
var/new_socks = input(H, "Select your socks", "Changing") as null|anything in GLOB.socks_list
if(new_socks)
H.socks = new_socks
H.saved_socks = new_socks
var/datum/sprite_accessory/underwear/socks/S = GLOB.socks_list[new_socks]
dye_socks = S?.has_color
if(dye_undie || choice == "Underwear Color")
H.undie_color = recolor_undergarment(H, "underwear", H.undie_color)
if(dye_shirt || choice == "Undershirt Color")
H.shirt_color = recolor_undergarment(H, "undershirt", H.shirt_color)
if(dye_socks || choice == "Socks Color")
H.socks_color = recolor_undergarment(H, "socks", H.socks_color)
if(!Adjacent(user)) add_fingerprint(H)
return H.update_body()
switch(choice)
if("Underwear")
var/new_undies = input(user, "Select your underwear", "Changing") as null|anything in GLOB.underwear_list
if(new_undies)
H.underwear = new_undies
if("Undershirt") /obj/structure/dresser/proc/recolor_undergarment(mob/living/carbon/human/H, garment_type = "underwear", default_color)
var/new_undershirt = input(user, "Select your undershirt", "Changing") as null|anything in GLOB.undershirt_list var/n_color = input(H, "Choose your [garment_type]'\s color.", "Character Preference", default_color) as color|null
if(new_undershirt) if(!n_color || !H.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
H.undershirt = new_undershirt return default_color
if("Socks") return n_color
var/new_socks = input(user, "Select your socks", "Changing") as null|anything in GLOB.socks_list
if(new_socks)
H.socks= new_socks
add_fingerprint(H)
H.update_body()
+1 -1
View File
@@ -262,7 +262,7 @@
if(isobj(AM)) if(isobj(AM))
if(prob(50) && anchored && !broken) if(prob(50) && anchored && !broken)
var/obj/O = AM var/obj/O = AM
if(O.throwforce != 0)//don't want to let people spam tesla bolts, this way it will break after time if(O.throwforce != 0 && O.damtype != STAMINA)//don't want to let people spam tesla bolts, this way it will break after time
var/turf/T = get_turf(src) var/turf/T = get_turf(src)
var/obj/structure/cable/C = T.get_cable_node() var/obj/structure/cable/C = T.get_cable_node()
if(C) if(C)
@@ -180,12 +180,13 @@
icon = 'icons/obj/items_and_weapons.dmi' icon = 'icons/obj/items_and_weapons.dmi'
icon_state = "offhand" icon_state = "offhand"
w_class = WEIGHT_CLASS_HUGE w_class = WEIGHT_CLASS_HUGE
item_flags = ABSTRACT | NODROP | NOBLUDGEON | DROPDEL item_flags = ABSTRACT | NOBLUDGEON | DROPDEL
resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF
var/obj/machinery/manned_turret/turret var/obj/machinery/manned_turret/turret
/obj/item/gun_control/Initialize() /obj/item/gun_control/Initialize()
. = ..() . = ..()
ADD_TRAIT(src, TRAIT_NODROP, ABSTRACT_ITEM_TRAIT)
turret = loc turret = loc
if(!istype(turret)) if(!istype(turret))
return INITIALIZE_HINT_QDEL return INITIALIZE_HINT_QDEL
+2 -6
View File
@@ -23,7 +23,7 @@ GLOBAL_LIST_INIT(freqtospan, list(
return return
if(message == "" || !message) if(message == "" || !message)
return return
spans |= get_spans() spans |= speech_span
if(!language) if(!language)
language = get_default_language() language = get_default_language()
send_speech(message, 7, src, , spans, message_language=language) send_speech(message, 7, src, , spans, message_language=language)
@@ -40,10 +40,6 @@ GLOBAL_LIST_INIT(freqtospan, list(
var/atom/movable/AM = _AM var/atom/movable/AM = _AM
AM.Hear(rendered, src, message_language, message, , spans, message_mode) AM.Hear(rendered, src, message_language, message, , spans, message_mode)
//To get robot span classes, stuff like that.
/atom/movable/proc/get_spans()
return list()
/atom/movable/proc/compose_message(atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode, face_name = FALSE) /atom/movable/proc/compose_message(atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode, face_name = FALSE)
//This proc uses text() because it is faster than appending strings. Thanks BYOND. //This proc uses text() because it is faster than appending strings. Thanks BYOND.
//Basic span //Basic span
@@ -87,7 +83,7 @@ GLOBAL_LIST_INIT(freqtospan, list(
else else
return verb_say return verb_say
/atom/movable/proc/say_quote(input, list/spans=list(), message_mode) /atom/movable/proc/say_quote(input, list/spans=list(speech_span), message_mode)
if(!input) if(!input)
input = "..." input = "..."
+3
View File
@@ -164,8 +164,11 @@
vr_human.name = H.name vr_human.name = H.name
vr_human.real_name = H.real_name vr_human.real_name = H.real_name
vr_human.socks = H.socks vr_human.socks = H.socks
vr_human.socks_color = H.socks_color
vr_human.undershirt = H.undershirt vr_human.undershirt = H.undershirt
vr_human.shirt_color = H.shirt_color
vr_human.underwear = H.underwear vr_human.underwear = H.underwear
vr_human.undie_color = H.undie_color
vr_human.updateappearance(TRUE, TRUE, TRUE) vr_human.updateappearance(TRUE, TRUE, TRUE)
vr_human.give_genitals(TRUE) //CITADEL ADD vr_human.give_genitals(TRUE) //CITADEL ADD
if(outfit) if(outfit)
+3
View File
@@ -15,6 +15,9 @@
H.real_name = random_unique_name(H.gender) H.real_name = random_unique_name(H.gender)
H.name = H.real_name H.name = H.real_name
H.underwear = random_underwear(H.gender) H.underwear = random_underwear(H.gender)
H.undie_color = random_color()
H.undershirt = random_undershirt(H.gender)
H.shirt_color = random_color()
H.skin_tone = random_skin_tone() H.skin_tone = random_skin_tone()
H.hair_style = random_hair_style(H.gender) H.hair_style = random_hair_style(H.gender)
H.facial_hair_style = random_facial_hair_style(H.gender) H.facial_hair_style = random_facial_hair_style(H.gender)
+1 -1
View File
@@ -422,7 +422,7 @@
H.equip_to_slot_or_del(I, SLOT_W_UNIFORM) H.equip_to_slot_or_del(I, SLOT_W_UNIFORM)
qdel(olduniform) qdel(olduniform)
if(droptype == "Yes") if(droptype == "Yes")
I.item_flags |= NODROP ADD_TRAIT(I, TRAIT_NODROP, ADMIN_TRAIT)
else else
to_chat(H, "You're not kawaii enough for this.") to_chat(H, "You're not kawaii enough for this.")
@@ -30,9 +30,12 @@
var/combat_armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 50, "bomb" = 50, "bio" = 50, "rad" = 50, "fire" = 90, "acid" = 90) var/combat_armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 50, "bomb" = 50, "bio" = 50, "rad" = 50, "fire" = 90, "acid" = 90)
/obj/item/clothing/suit/armor/abductor/vest/proc/toggle_nodrop() /obj/item/clothing/suit/armor/abductor/vest/proc/toggle_nodrop()
item_flags ^= NODROP if(HAS_TRAIT_FROM(src, TRAIT_NODROP, ABDUCTOR_VEST_TRAIT))
REMOVE_TRAIT(src, TRAIT_NODROP, ABDUCTOR_VEST_TRAIT)
else
ADD_TRAIT(src, TRAIT_NODROP, ABDUCTOR_VEST_TRAIT)
if(ismob(loc)) if(ismob(loc))
to_chat(loc, "<span class='notice'>Your vest is now [item_flags & NODROP ? "locked" : "unlocked"].</span>") to_chat(loc, "<span class='notice'>Your vest is now [HAS_TRAIT_FROM(src, TRAIT_NODROP, ABDUCTOR_VEST_TRAIT) ? "locked" : "unlocked"].</span>")
/obj/item/clothing/suit/armor/abductor/vest/proc/flip_mode() /obj/item/clothing/suit/armor/abductor/vest/proc/flip_mode()
switch(mode) switch(mode)
@@ -17,7 +17,7 @@
var/obj/item/clothing/suit/armor/abductor/vest/V = locate() in H var/obj/item/clothing/suit/armor/abductor/vest/V = locate() in H
if(V) if(V)
console.AddVest(V) console.AddVest(V)
V.item_flags |= NODROP ADD_TRAIT(V, TRAIT_NODROP, ABDUCTOR_VEST_TRAIT)
var/obj/item/storage/backpack/B = locate() in H var/obj/item/storage/backpack/B = locate() in H
if(B) if(B)
@@ -75,7 +75,7 @@
dat+="<br>" dat+="<br>"
dat += "<a href='?src=[REF(src)];select_disguise=1'>Select Agent Vest Disguise</a><br>" dat += "<a href='?src=[REF(src)];select_disguise=1'>Select Agent Vest Disguise</a><br>"
dat += "<a href='?src=[REF(src)];toggle_vest=1'>[vest.item_flags & NODROP ? "Unlock" : "Lock"] Vest</a><br>" dat += "<a href='?src=[REF(src)];toggle_vest=1'>[HAS_TRAIT_FROM(vest, TRAIT_NODROP, ABDUCTOR_VEST_TRAIT) ? "Unlock" : "Lock"] Vest</a><br>"
else else
dat += "<span class='bad'>NO AGENT VEST DETECTED</span>" dat += "<span class='bad'>NO AGENT VEST DETECTED</span>"
var/datum/browser/popup = new(user, "computer", "Abductor Console", 400, 500) var/datum/browser/popup = new(user, "computer", "Abductor Console", 400, 500)
@@ -57,7 +57,7 @@
return ..() return ..()
/mob/living/simple_animal/hostile/blob/proc/blob_chat(msg) /mob/living/simple_animal/hostile/blob/proc/blob_chat(msg)
var/spanned_message = say_quote(msg, get_spans()) var/spanned_message = say_quote(msg)
var/rendered = "<font color=\"#EE4000\"><b>\[Blob Telepathy\] [real_name]</b> [spanned_message]</font>" var/rendered = "<font color=\"#EE4000\"><b>\[Blob Telepathy\] [real_name]</b> [spanned_message]</font>"
for(var/M in GLOB.mob_list) for(var/M in GLOB.mob_list)
if(isovermind(M) || istype(M, /mob/living/simple_animal/hostile/blob)) if(isovermind(M) || istype(M, /mob/living/simple_animal/hostile/blob))
@@ -210,7 +210,7 @@ GLOBAL_LIST_EMPTY(blob_nodes)
src.log_talk(message, LOG_SAY) src.log_talk(message, LOG_SAY)
var/message_a = say_quote(message, get_spans()) var/message_a = say_quote(message)
var/rendered = "<span class='big'><font color=\"#EE4000\"><b>\[Blob Telepathy\] [name](<font color=\"[blob_reagent_datum.color]\">[blob_reagent_datum.name]</font>)</b> [message_a]</font></span>" var/rendered = "<span class='big'><font color=\"#EE4000\"><b>\[Blob Telepathy\] [name](<font color=\"[blob_reagent_datum.color]\">[blob_reagent_datum.name]</font>)</b> [message_a]</font></span>"
for(var/mob/M in GLOB.mob_list) for(var/mob/M in GLOB.mob_list)
@@ -269,8 +269,11 @@
prof.protected = protect prof.protected = protect
prof.underwear = H.underwear prof.underwear = H.underwear
prof.undie_color = H.undie_color
prof.undershirt = H.undershirt prof.undershirt = H.undershirt
prof.shirt_color = H.shirt_color
prof.socks = H.socks prof.socks = H.socks
prof.socks_color = H.socks_color
var/list/slots = list("head", "wear_mask", "back", "wear_suit", "w_uniform", "shoes", "belt", "gloves", "glasses", "ears", "wear_id", "s_store") var/list/slots = list("head", "wear_mask", "back", "wear_suit", "w_uniform", "shoes", "belt", "gloves", "glasses", "ears", "wear_id", "s_store")
for(var/slot in slots) for(var/slot in slots)
@@ -503,8 +506,11 @@
var/list/item_state_list = list() var/list/item_state_list = list()
var/underwear var/underwear
var/undie_color
var/undershirt var/undershirt
var/shirt_color
var/socks var/socks
var/socks_color
/datum/changelingprofile/Destroy() /datum/changelingprofile/Destroy()
qdel(dna) qdel(dna)
@@ -155,7 +155,7 @@
item_state = "arm_blade" item_state = "arm_blade"
lefthand_file = 'icons/mob/inhands/antag/changeling_lefthand.dmi' lefthand_file = 'icons/mob/inhands/antag/changeling_lefthand.dmi'
righthand_file = 'icons/mob/inhands/antag/changeling_righthand.dmi' righthand_file = 'icons/mob/inhands/antag/changeling_righthand.dmi'
item_flags = NEEDS_PERMIT | ABSTRACT | NODROP | DROPDEL item_flags = NEEDS_PERMIT | ABSTRACT | DROPDEL
w_class = WEIGHT_CLASS_HUGE w_class = WEIGHT_CLASS_HUGE
force = 25 force = 25
throwforce = 0 //Just to be on the safe side throwforce = 0 //Just to be on the safe side
@@ -169,6 +169,7 @@
/obj/item/melee/arm_blade/Initialize(mapload,silent,synthetic) /obj/item/melee/arm_blade/Initialize(mapload,silent,synthetic)
. = ..() . = ..()
ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
if(ismob(loc) && !silent) if(ismob(loc) && !silent)
loc.visible_message("<span class='warning'>A grotesque blade forms around [loc.name]\'s arm!</span>", "<span class='warning'>Our arm twists and mutates, transforming it into a deadly blade.</span>", "<span class='italics'>You hear organic matter ripping and tearing!</span>") loc.visible_message("<span class='warning'>A grotesque blade forms around [loc.name]\'s arm!</span>", "<span class='warning'>Our arm twists and mutates, transforming it into a deadly blade.</span>", "<span class='italics'>You hear organic matter ripping and tearing!</span>")
if(synthetic) if(synthetic)
@@ -242,7 +243,7 @@
item_state = "tentacle" item_state = "tentacle"
lefthand_file = 'icons/mob/inhands/antag/changeling_lefthand.dmi' lefthand_file = 'icons/mob/inhands/antag/changeling_lefthand.dmi'
righthand_file = 'icons/mob/inhands/antag/changeling_righthand.dmi' righthand_file = 'icons/mob/inhands/antag/changeling_righthand.dmi'
item_flags = NEEDS_PERMIT | ABSTRACT | NODROP | DROPDEL | NOBLUDGEON item_flags = NEEDS_PERMIT | ABSTRACT | DROPDEL | NOBLUDGEON
flags_1 = NONE flags_1 = NONE
w_class = WEIGHT_CLASS_HUGE w_class = WEIGHT_CLASS_HUGE
ammo_type = /obj/item/ammo_casing/magic/tentacle ammo_type = /obj/item/ammo_casing/magic/tentacle
@@ -256,6 +257,7 @@
/obj/item/gun/magic/tentacle/Initialize(mapload, silent) /obj/item/gun/magic/tentacle/Initialize(mapload, silent)
. = ..() . = ..()
ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
if(ismob(loc)) if(ismob(loc))
if(!silent) if(!silent)
loc.visible_message("<span class='warning'>[loc.name]\'s arm starts stretching inhumanly!</span>", "<span class='warning'>Our arm twists and mutates, transforming it into a tentacle.</span>", "<span class='italics'>You hear organic matter ripping and tearing!</span>") loc.visible_message("<span class='warning'>[loc.name]\'s arm starts stretching inhumanly!</span>", "<span class='warning'>Our arm twists and mutates, transforming it into a tentacle.</span>", "<span class='italics'>You hear organic matter ripping and tearing!</span>")
@@ -427,7 +429,7 @@
/obj/item/shield/changeling /obj/item/shield/changeling
name = "shield-like mass" name = "shield-like mass"
desc = "A mass of tough, boney tissue. You can still see the fingers as a twisted pattern in the shield." desc = "A mass of tough, boney tissue. You can still see the fingers as a twisted pattern in the shield."
item_flags = ABSTRACT | NODROP | DROPDEL item_flags = ABSTRACT | DROPDEL
icon = 'icons/obj/items_and_weapons.dmi' icon = 'icons/obj/items_and_weapons.dmi'
icon_state = "ling_shield" icon_state = "ling_shield"
lefthand_file = 'icons/mob/inhands/antag/changeling_lefthand.dmi' lefthand_file = 'icons/mob/inhands/antag/changeling_lefthand.dmi'
@@ -438,6 +440,7 @@
/obj/item/shield/changeling/Initialize() /obj/item/shield/changeling/Initialize()
. = ..() . = ..()
ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
if(ismob(loc)) if(ismob(loc))
loc.visible_message("<span class='warning'>The end of [loc.name]\'s hand inflates rapidly, forming a huge shield-like mass!</span>", "<span class='warning'>We inflate our hand into a strong shield.</span>", "<span class='italics'>You hear organic matter ripping and tearing!</span>") loc.visible_message("<span class='warning'>The end of [loc.name]\'s hand inflates rapidly, forming a huge shield-like mass!</span>", "<span class='warning'>We inflate our hand into a strong shield.</span>", "<span class='italics'>You hear organic matter ripping and tearing!</span>")
@@ -479,13 +482,14 @@
name = "flesh mass" name = "flesh mass"
icon_state = "lingspacesuit" icon_state = "lingspacesuit"
desc = "A huge, bulky mass of pressure and temperature-resistant organic tissue, evolved to facilitate space travel." desc = "A huge, bulky mass of pressure and temperature-resistant organic tissue, evolved to facilitate space travel."
item_flags = NODROP | DROPDEL item_flags = DROPDEL
clothing_flags = STOPSPRESSUREDAMAGE //Not THICKMATERIAL because it's organic tissue, so if somebody tries to inject something into it, it still ends up in your blood. (also balance but muh fluff) clothing_flags = STOPSPRESSUREDAMAGE //Not THICKMATERIAL because it's organic tissue, so if somebody tries to inject something into it, it still ends up in your blood. (also balance but muh fluff)
allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/oxygen) allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/oxygen)
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90) //No armor at all. armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90) //No armor at all.
/obj/item/clothing/suit/space/changeling/Initialize() /obj/item/clothing/suit/space/changeling/Initialize()
. = ..() . = ..()
ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
if(ismob(loc)) if(ismob(loc))
loc.visible_message("<span class='warning'>[loc.name]\'s flesh rapidly inflates, forming a bloated mass around [loc.p_their()] body!</span>", "<span class='warning'>We inflate our flesh, creating a spaceproof suit!</span>", "<span class='italics'>You hear organic matter ripping and tearing!</span>") loc.visible_message("<span class='warning'>[loc.name]\'s flesh rapidly inflates, forming a bloated mass around [loc.p_their()] body!</span>", "<span class='warning'>We inflate our flesh, creating a spaceproof suit!</span>", "<span class='italics'>You hear organic matter ripping and tearing!</span>")
START_PROCESSING(SSobj, src) START_PROCESSING(SSobj, src)
@@ -499,11 +503,15 @@
name = "flesh mass" name = "flesh mass"
icon_state = "lingspacehelmet" icon_state = "lingspacehelmet"
desc = "A covering of pressure and temperature-resistant organic tissue with a glass-like chitin front." desc = "A covering of pressure and temperature-resistant organic tissue with a glass-like chitin front."
item_flags = NODROP | DROPDEL item_flags = DROPDEL
clothing_flags = STOPSPRESSUREDAMAGE clothing_flags = STOPSPRESSUREDAMAGE
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90) armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90)
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
/obj/item/clothing/head/helmet/space/changeling/Initialize()
. = ..()
ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
/***************************************\ /***************************************\
|*****************ARMOR*****************| |*****************ARMOR*****************|
\***************************************/ \***************************************/
@@ -529,7 +537,7 @@
name = "chitinous mass" name = "chitinous mass"
desc = "A tough, hard covering of black chitin." desc = "A tough, hard covering of black chitin."
icon_state = "lingarmor" icon_state = "lingarmor"
item_flags = NODROP | DROPDEL item_flags = DROPDEL
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
armor = list("melee" = 40, "bullet" = 40, "laser" = 40, "energy" = 20, "bomb" = 10, "bio" = 4, "rad" = 0, "fire" = 90, "acid" = 90) armor = list("melee" = 40, "bullet" = 40, "laser" = 40, "energy" = 20, "bomb" = 10, "bio" = 4, "rad" = 0, "fire" = 90, "acid" = 90)
flags_inv = HIDEJUMPSUIT flags_inv = HIDEJUMPSUIT
@@ -538,6 +546,7 @@
/obj/item/clothing/suit/armor/changeling/Initialize() /obj/item/clothing/suit/armor/changeling/Initialize()
. = ..() . = ..()
ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
if(ismob(loc)) if(ismob(loc))
loc.visible_message("<span class='warning'>[loc.name]\'s flesh turns black, quickly transforming into a hard, chitinous mass!</span>", "<span class='warning'>We harden our flesh, creating a suit of armor!</span>", "<span class='italics'>You hear organic matter ripping and tearing!</span>") loc.visible_message("<span class='warning'>[loc.name]\'s flesh turns black, quickly transforming into a hard, chitinous mass!</span>", "<span class='warning'>We harden our flesh, creating a suit of armor!</span>", "<span class='italics'>You hear organic matter ripping and tearing!</span>")
@@ -545,6 +554,10 @@
name = "chitinous mass" name = "chitinous mass"
desc = "A tough, hard covering of black chitin with transparent chitin in front." desc = "A tough, hard covering of black chitin with transparent chitin in front."
icon_state = "lingarmorhelmet" icon_state = "lingarmorhelmet"
item_flags = NODROP | DROPDEL item_flags = DROPDEL
armor = list("melee" = 40, "bullet" = 40, "laser" = 40, "energy" = 20, "bomb" = 10, "bio" = 4, "rad" = 0, "fire" = 90, "acid" = 90) armor = list("melee" = 40, "bullet" = 40, "laser" = 40, "energy" = 20, "bomb" = 10, "bio" = 4, "rad" = 0, "fire" = 90, "acid" = 90)
flags_inv = HIDEEARS|HIDEHAIR|HIDEEYES|HIDEFACIALHAIR|HIDEFACE flags_inv = HIDEEARS|HIDEHAIR|HIDEEYES|HIDEFACIALHAIR|HIDEFACE
/obj/item/clothing/head/helmet/changeling/Initialize()
. = ..()
ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
@@ -11,7 +11,11 @@
/obj/item/clothing/glasses/changeling /obj/item/clothing/glasses/changeling
name = "flesh" name = "flesh"
item_flags = NODROP
/obj/item/clothing/glasses/changeling/Initialize()
. = ..()
ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
//ATTACK HAND IGNORING PARENT RETURN VALUE //ATTACK HAND IGNORING PARENT RETURN VALUE
/obj/item/clothing/glasses/changeling/attack_hand(mob/user) /obj/item/clothing/glasses/changeling/attack_hand(mob/user)
@@ -23,7 +27,11 @@
/obj/item/clothing/under/changeling /obj/item/clothing/under/changeling
name = "flesh" name = "flesh"
item_flags = NODROP
/obj/item/clothing/under/changeling/Initialize()
. = ..()
ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
//ATTACK HAND IGNORING PARENT RETURN VALUE //ATTACK HAND IGNORING PARENT RETURN VALUE
/obj/item/clothing/under/changeling/attack_hand(mob/user) /obj/item/clothing/under/changeling/attack_hand(mob/user)
@@ -35,9 +43,13 @@
/obj/item/clothing/suit/changeling /obj/item/clothing/suit/changeling
name = "flesh" name = "flesh"
item_flags = NODROP
allowed = list(/obj/item/changeling) allowed = list(/obj/item/changeling)
/obj/item/clothing/suit/changeling/Initialize()
. = ..()
ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
//ATTACK HAND IGNORING PARENT RETURN VALUE //ATTACK HAND IGNORING PARENT RETURN VALUE
/obj/item/clothing/suit/changeling/attack_hand(mob/user) /obj/item/clothing/suit/changeling/attack_hand(mob/user)
if(loc == user && user.mind && user.mind.has_antag_datum(/datum/antagonist/changeling)) if(loc == user && user.mind && user.mind.has_antag_datum(/datum/antagonist/changeling))
@@ -48,7 +60,10 @@
/obj/item/clothing/head/changeling /obj/item/clothing/head/changeling
name = "flesh" name = "flesh"
item_flags = NODROP
/obj/item/clothing/head/changeling/Initialize()
. = ..()
ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
//ATTACK HAND IGNORING PARENT RETURN VALUE //ATTACK HAND IGNORING PARENT RETURN VALUE
/obj/item/clothing/head/changeling/attack_hand(mob/user) /obj/item/clothing/head/changeling/attack_hand(mob/user)
@@ -60,7 +75,11 @@
/obj/item/clothing/shoes/changeling /obj/item/clothing/shoes/changeling
name = "flesh" name = "flesh"
item_flags = NODROP
/obj/item/clothing/shoes/changeling/Initialize()
. = ..()
ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
//ATTACK HAND IGNORING PARENT RETURN VALUE //ATTACK HAND IGNORING PARENT RETURN VALUE
/obj/item/clothing/shoes/changeling/attack_hand(mob/user) /obj/item/clothing/shoes/changeling/attack_hand(mob/user)
@@ -72,7 +91,11 @@
/obj/item/clothing/gloves/changeling /obj/item/clothing/gloves/changeling
name = "flesh" name = "flesh"
item_flags = NODROP
/obj/item/clothing/gloves/changeling/Initialize()
. = ..()
ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
//ATTACK HAND IGNORING PARENT RETURN VALUE //ATTACK HAND IGNORING PARENT RETURN VALUE
/obj/item/clothing/gloves/changeling/attack_hand(mob/user) /obj/item/clothing/gloves/changeling/attack_hand(mob/user)
@@ -84,7 +107,11 @@
/obj/item/clothing/mask/changeling /obj/item/clothing/mask/changeling
name = "flesh" name = "flesh"
item_flags = NODROP
/obj/item/clothing/mask/changeling/Initialize()
. = ..()
ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
//ATTACK HAND IGNORING PARENT RETURN VALUE //ATTACK HAND IGNORING PARENT RETURN VALUE
/obj/item/clothing/mask/changeling/attack_hand(mob/user) /obj/item/clothing/mask/changeling/attack_hand(mob/user)
@@ -96,10 +123,14 @@
/obj/item/changeling /obj/item/changeling
name = "flesh" name = "flesh"
item_flags = NODROP
slot_flags = ALL slot_flags = ALL
allowed = list(/obj/item/changeling) allowed = list(/obj/item/changeling)
/obj/item/changeling/Initialize()
. = ..()
ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
//ATTACK HAND IGNORING PARENT RETURN VALUE //ATTACK HAND IGNORING PARENT RETURN VALUE
/obj/item/changeling/attack_hand(mob/user) /obj/item/changeling/attack_hand(mob/user)
if(loc == user && user.mind && user.mind.has_antag_datum(/datum/antagonist/changeling)) if(loc == user && user.mind && user.mind.has_antag_datum(/datum/antagonist/changeling))
@@ -21,17 +21,17 @@
/obj/item/clothing/head/helmet/clockwork/ratvar_act() /obj/item/clothing/head/helmet/clockwork/ratvar_act()
if(GLOB.ratvar_awakens) if(GLOB.ratvar_awakens)
armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100) armor = getArmor(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 100, bio = 100, rad = 100, fire = 100, acid = 100)
clothing_flags |= STOPSPRESSUREDAMAGE clothing_flags |= STOPSPRESSUREDAMAGE
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT
else if(GLOB.ratvar_approaches) else if(GLOB.ratvar_approaches)
armor = list("melee" = 70, "bullet" = 80, "laser" = -15, "energy" = 25, "bomb" = 70, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100) armor = getArmor(melee = 70, bullet = 80, laser = -15, energy = 25, bomb = 70, bio = 0, rad = 0, fire = 100, acid = 100)
clothing_flags |= STOPSPRESSUREDAMAGE clothing_flags |= STOPSPRESSUREDAMAGE
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT
else else
armor = list("melee" = 60, "bullet" = 70, "laser" = -25, "energy" = 0, "bomb" = 60, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100) armor = getArmor(melee = 60, bullet = 70, laser = -25, energy = 0, bomb = 60, bio = 0, rad = 0, fire = 100, acid = 100)
clothing_flags &= ~STOPSPRESSUREDAMAGE clothing_flags &= ~STOPSPRESSUREDAMAGE
max_heat_protection_temperature = initial(max_heat_protection_temperature) max_heat_protection_temperature = initial(max_heat_protection_temperature)
min_cold_protection_temperature = initial(min_cold_protection_temperature) min_cold_protection_temperature = initial(min_cold_protection_temperature)
@@ -69,7 +69,7 @@
heat_protection = CHEST|GROIN|LEGS heat_protection = CHEST|GROIN|LEGS
resistance_flags = FIRE_PROOF | ACID_PROOF resistance_flags = FIRE_PROOF | ACID_PROOF
armor = list("melee" = 60, "bullet" = 70, "laser" = -25, "energy" = 0, "bomb" = 60, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100) armor = list("melee" = 60, "bullet" = 70, "laser" = -25, "energy" = 0, "bomb" = 60, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100)
allowed = list(/obj/item/clockwork, /obj/item/clothing/glasses/wraith_spectacles, /obj/item/clothing/glasses/judicial_visor, /obj/item/mmi/posibrain/soul_vessel) allowed = list(/obj/item/clockwork, /obj/item/clothing/glasses/wraith_spectacles, /obj/item/clothing/glasses/judicial_visor, /obj/item/mmi/posibrain/soul_vessel, /obj/item/reagent_containers/food/drinks/holyoil)
/obj/item/clothing/suit/armor/clockwork/Initialize() /obj/item/clothing/suit/armor/clockwork/Initialize()
. = ..() . = ..()
@@ -82,17 +82,17 @@
/obj/item/clothing/suit/armor/clockwork/ratvar_act() /obj/item/clothing/suit/armor/clockwork/ratvar_act()
if(GLOB.ratvar_awakens) if(GLOB.ratvar_awakens)
armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100) armor = getArmor(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 100, bio = 100, rad = 100, fire = 100, acid = 100)
clothing_flags |= STOPSPRESSUREDAMAGE clothing_flags |= STOPSPRESSUREDAMAGE
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT
else if(GLOB.ratvar_approaches) else if(GLOB.ratvar_approaches)
armor = list("melee" = 70, "bullet" = 80, "laser" = -15, "energy" = 25, "bomb" = 70, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100) armor = getArmor(melee = 70, bullet = 80, laser = -15, energy = 25, bomb = 70, bio = 0, rad = 0, fire = 100, acid = 100)
clothing_flags |= STOPSPRESSUREDAMAGE clothing_flags |= STOPSPRESSUREDAMAGE
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT
else else
armor = list("melee" = 60, "bullet" = 70, "laser" = -25, "energy" = 0, "bomb" = 60, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100) armor = getArmor(melee = 60, bullet = 70, laser = -25, energy = 0, bomb = 60, bio = 0, rad = 0, fire = 100, acid = 100)
clothing_flags &= ~STOPSPRESSUREDAMAGE clothing_flags &= ~STOPSPRESSUREDAMAGE
max_heat_protection_temperature = initial(max_heat_protection_temperature) max_heat_protection_temperature = initial(max_heat_protection_temperature)
min_cold_protection_temperature = initial(min_cold_protection_temperature) min_cold_protection_temperature = initial(min_cold_protection_temperature)
@@ -148,12 +148,12 @@
/obj/item/clothing/gloves/clockwork/ratvar_act() /obj/item/clothing/gloves/clockwork/ratvar_act()
if(GLOB.ratvar_awakens) if(GLOB.ratvar_awakens)
armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100) armor = getArmor(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 100, bio = 100, rad = 100, fire = 100, acid = 100)
clothing_flags |= STOPSPRESSUREDAMAGE clothing_flags |= STOPSPRESSUREDAMAGE
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT
else else
armor = list("melee" = 80, "bullet" = 70, "laser" = -25, "energy" = 0, "bomb" = 60, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100) armor = getArmor(melee = 80, bullet = 70, laser = -25, energy = 0, bomb = 60, bio = 0, rad = 0, fire = 100, acid = 100)
clothing_flags &= ~STOPSPRESSUREDAMAGE clothing_flags &= ~STOPSPRESSUREDAMAGE
max_heat_protection_temperature = initial(max_heat_protection_temperature) max_heat_protection_temperature = initial(max_heat_protection_temperature)
min_cold_protection_temperature = initial(min_cold_protection_temperature) min_cold_protection_temperature = initial(min_cold_protection_temperature)
@@ -19,6 +19,7 @@
bubble_icon = "clock" bubble_icon = "clock"
light_color = "#E42742" light_color = "#E42742"
death_sound = 'sound/magic/clockwork/anima_fragment_death.ogg' death_sound = 'sound/magic/clockwork/anima_fragment_death.ogg'
speech_span = SPAN_ROBOT
var/playstyle_string = "<span class='heavy_brass'>You are a bug, yell at whoever spawned you!</span>" var/playstyle_string = "<span class='heavy_brass'>You are a bug, yell at whoever spawned you!</span>"
var/empower_string = "<span class='heavy_brass'>You have nothing to empower, yell at the coders!</span>" //Shown to the mob when the herald beacon activates var/empower_string = "<span class='heavy_brass'>You have nothing to empower, yell at the coders!</span>" //Shown to the mob when the herald beacon activates
@@ -26,9 +27,6 @@
. = ..() . = ..()
update_values() update_values()
/mob/living/simple_animal/hostile/clockwork/get_spans()
return ..() | SPAN_ROBOT
/mob/living/simple_animal/hostile/clockwork/Login() /mob/living/simple_animal/hostile/clockwork/Login()
..() ..()
add_servant_of_ratvar(src, TRUE) add_servant_of_ratvar(src, TRUE)
+5 -3
View File
@@ -339,7 +339,7 @@
icon = 'icons/obj/items_and_weapons.dmi' icon = 'icons/obj/items_and_weapons.dmi'
icon_state = "disintegrate" icon_state = "disintegrate"
item_state = null item_state = null
item_flags = NEEDS_PERMIT | ABSTRACT | NODROP | DROPDEL item_flags = NEEDS_PERMIT | ABSTRACT | DROPDEL
w_class = WEIGHT_CLASS_HUGE w_class = WEIGHT_CLASS_HUGE
throwforce = 0 throwforce = 0
@@ -350,11 +350,13 @@
var/health_cost = 0 //The amount of health taken from the user when invoking the spell var/health_cost = 0 //The amount of health taken from the user when invoking the spell
var/datum/action/innate/cult/blood_spell/source var/datum/action/innate/cult/blood_spell/source
/obj/item/melee/blood_magic/New(loc, spell) /obj/item/melee/blood_magic/Initialize(mapload, spell)
. = ..()
ADD_TRAIT(src, TRAIT_NODROP, CULT_TRAIT)
source = spell source = spell
uses = source.charges uses = source.charges
health_cost = source.health_cost health_cost = source.health_cost
..()
/obj/item/melee/blood_magic/Destroy() /obj/item/melee/blood_magic/Destroy()
if(!QDELETED(source)) if(!QDELETED(source))
+21 -4
View File
@@ -64,9 +64,14 @@
/obj/item/melee/cultblade/ghost /obj/item/melee/cultblade/ghost
name = "eldritch sword" name = "eldritch sword"
force = 19 //can't break normal airlocks force = 19 //can't break normal airlocks
item_flags = NEEDS_PERMIT | NODROP | DROPDEL item_flags = NEEDS_PERMIT | DROPDEL
flags_1 = NONE flags_1 = NONE
/obj/item/melee/cultblade/ghost/Initialize()
. = ..()
ADD_TRAIT(src, TRAIT_NODROP, CULT_TRAIT)
/obj/item/melee/cultblade/pickup(mob/living/user) /obj/item/melee/cultblade/pickup(mob/living/user)
..() ..()
if(!iscultist(user)) if(!iscultist(user))
@@ -298,7 +303,12 @@
item_state = "cult_hoodalt" item_state = "cult_hoodalt"
/obj/item/clothing/head/culthood/alt/ghost /obj/item/clothing/head/culthood/alt/ghost
item_flags = NODROP | DROPDEL item_flags = DROPDEL
/obj/item/clothing/head/culthood/alt/ghost/Initialize()
. = ..()
ADD_TRAIT(src, TRAIT_NODROP, CULT_TRAIT)
/obj/item/clothing/suit/cultrobes/alt /obj/item/clothing/suit/cultrobes/alt
name = "cultist robes" name = "cultist robes"
@@ -307,7 +317,11 @@
item_state = "cultrobesalt" item_state = "cultrobesalt"
/obj/item/clothing/suit/cultrobes/alt/ghost /obj/item/clothing/suit/cultrobes/alt/ghost
item_flags = NODROP | DROPDEL item_flags = DROPDEL
/obj/item/clothing/suit/cultrobes/alt/ghost/Initialize()
. = ..()
ADD_TRAIT(src, TRAIT_NODROP, CULT_TRAIT)
/obj/item/clothing/head/magus /obj/item/clothing/head/magus
name = "magus helm" name = "magus helm"
@@ -796,7 +810,7 @@
icon = 'icons/obj/items_and_weapons.dmi' icon = 'icons/obj/items_and_weapons.dmi'
icon_state = "disintegrate" icon_state = "disintegrate"
item_state = null item_state = null
item_flags = ABSTRACT | NODROP | DROPDEL item_flags = ABSTRACT | DROPDEL
w_class = WEIGHT_CLASS_HUGE w_class = WEIGHT_CLASS_HUGE
throwforce = 0 throwforce = 0
throw_range = 0 throw_range = 0
@@ -805,6 +819,9 @@
var/firing = FALSE var/firing = FALSE
var/angle var/angle
/obj/item/blood_beam/Initialize()
. = ..()
ADD_TRAIT(src, TRAIT_NODROP, CULT_TRAIT)
/obj/item/blood_beam/afterattack(atom/A, mob/living/user, flag, params) /obj/item/blood_beam/afterattack(atom/A, mob/living/user, flag, params)
. = ..() . = ..()
@@ -60,7 +60,7 @@
W.access += get_all_centcom_access() W.access += get_all_centcom_access()
W.assignment = "Highlander" W.assignment = "Highlander"
W.registered_name = H.real_name W.registered_name = H.real_name
W.item_flags |= NODROP ADD_TRAIT(W, TRAIT_NODROP, HIGHLANDER)
W.update_label(H.real_name) W.update_label(H.real_name)
H.equip_to_slot_or_del(W, SLOT_WEAR_ID) H.equip_to_slot_or_del(W, SLOT_WEAR_ID)

Some files were not shown because too many files have changed in this diff Show More