diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm
index fc8e7dda2f..30a7694e5f 100644
--- a/code/__DEFINES/misc.dm
+++ b/code/__DEFINES/misc.dm
@@ -382,6 +382,7 @@ GLOBAL_LIST_INIT(pda_reskins, list(PDA_SKIN_CLASSIC = 'icons/obj/pda.dmi', PDA_S
#define CLOCK_SILICONS 22
#define CLOCK_PROSELYTIZATION 23
#define SHUTTLE_HIJACK 24
+#define GANG_VICTORY 25
#define FIELD_TURF 1
#define FIELD_EDGE 2
diff --git a/code/__DEFINES/obj_flags.dm b/code/__DEFINES/obj_flags.dm
index 8566571928..1c3832001f 100644
--- a/code/__DEFINES/obj_flags.dm
+++ b/code/__DEFINES/obj_flags.dm
@@ -20,13 +20,12 @@
#define FORCE_STRING_OVERRIDE (1<<2) // used for tooltips
#define NEEDS_PERMIT (1<<3) //Used by security bots to determine if this item is safe for public use.
#define SLOWS_WHILE_IN_HAND (1<<4)
-#define NO_MAT_REDEMPTION (1<<5) // Stops you from putting things like an RCD or other items into an ORM or protolathe for materials.
-#define DROPDEL (1<<6) // When dropped, it calls qdel on itself
+#define NO_MAT_REDEMPTION (1<<5) // Stops you from putting things like an RCD or other items into an ORM or protolathe for materials.
+#define DROPDEL (1<<6) // When dropped, it calls qdel on itself
#define NOBLUDGEON (1<<7) // when an item has this it produces no "X has been hit by Y with Z" message in the default attackby()
-#define NODROP (1<<8) // This flag makes it so that an item literally cannot be removed at all, or at least that's how it should be. Only deleted.
-#define ABSTRACT (1<<9) // for all things that are technically items but used for various different stuff
-#define IMMUTABLE_SLOW (1<<10) //When players should not be able to change the slowdown of the item (Speed potions, ect)
-#define SURGICAL_TOOL (1<<12) //Tool commonly used for surgery: won't attack targets in an active surgical operation on help intent (in case of mistakes)
+#define ABSTRACT (1<<8) // for all things that are technically items but used for various different stuff
+#define IMMUTABLE_SLOW (1<<9) //When players should not be able to change the slowdown of the item (Speed potions, ect)
+#define SURGICAL_TOOL (1<<10) //Tool commonly used for surgery: won't attack targets in an active surgical operation on help intent (in case of mistakes)
// Flags for the clothing_flags var on /obj/item/clothing
diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm
index f6f0086138..dc2ff8832f 100644
--- a/code/__DEFINES/traits.dm
+++ b/code/__DEFINES/traits.dm
@@ -122,6 +122,9 @@
//non-mob traits
#define TRAIT_PARALYSIS "paralysis" //Used for limb-based paralysis, where replacing the limb will fix it
+// item traits
+#define TRAIT_NODROP "nodrop"
+
#define TRAIT_ALCOHOL_TOLERANCE "alcohol_tolerance"
#define TRAIT_AGEUSIA "ageusia"
#define TRAIT_HEAVY_SLEEPER "heavy_sleeper"
@@ -161,6 +164,12 @@
#define SPECIES_TRAIT "species"
#define ORGAN_TRAIT "organ"
#define JOB_TRAIT "job"
+#define CYBORG_ITEM_TRAIT "cyborg-item"
+#define ADMIN_TRAIT "admin" // (B)admins only.
+#define CHANGELING_TRAIT "changeling"
+#define CULT_TRAIT "cult"
+#define CURSED_ITEM_TRAIT "cursed-item" // The item is magically cursed
+#define ABSTRACT_ITEM_TRAIT "abstract-item"
#define ROUNDSTART_TRAIT "roundstart" //cannot be removed without admin intervention
// unique trait sources, still defines
@@ -173,3 +182,24 @@
#define STASIS_MUTE "stasis"
#define GENETICS_SPELL "genetics_spell"
#define EYES_COVERED "eyes_covered"
+#define CULT_TRAIT "cult"
+#define CLOWN_NUKE_TRAIT "clown-nuke"
+#define STICKY_MOUSTACHE_TRAIT "sticky-moustache"
+#define CHAINSAW_FRENZY_TRAIT "chainsaw-frenzy"
+#define CHRONO_GUN_TRAIT "chrono-gun"
+#define REVERSE_BEAR_TRAP_TRAIT "reverse-bear-trap"
+#define GLUED_ITEM_TRAIT "glued-item"
+#define CURSED_MASK_TRAIT "cursed-mask"
+#define HIS_GRACE_TRAIT "his-grace"
+#define HAND_REPLACEMENT_TRAIT "magic-hand"
+#define HOT_POTATO_TRAIT "hot-potato"
+#define SABRE_SUICIDE_TRAIT "sabre-suicide"
+#define ABDUCTOR_VEST_TRAIT "abductor-vest"
+#define CAPTURE_THE_FLAG_TRAIT "capture-the-flag"
+#define EYE_OF_GOD_TRAIT "eye-of-god"
+#define SHAMEBRERO_TRAIT "shamebrero"
+#define CHRONOSUIT_TRAIT "chronosuit"
+#define FLIGHTSUIT_TRAIT "flightsuit"
+#define LOCKED_HELMET_TRAIT "locked-helmet"
+#define NINJA_SUIT_TRAIT "ninja-suit"
+#define ANTI_DROP_IMPLANT_TRAIT "anti-drop-implant"
\ No newline at end of file
diff --git a/code/__HELPERS/names.dm b/code/__HELPERS/names.dm
index 09e0aa95b9..db2eba2422 100644
--- a/code/__HELPERS/names.dm
+++ b/code/__HELPERS/names.dm
@@ -151,6 +151,10 @@ GLOBAL_VAR(command_name)
GLOBAL_VAR(syndicate_code_phrase) //Code phrase for traitors.
GLOBAL_VAR(syndicate_code_response) //Code response for traitors.
+//Cached regex search - for checking if codewords are used.
+GLOBAL_DATUM(syndicate_code_phrase_regex, /regex)
+GLOBAL_DATUM(syndicate_code_response_regex, /regex)
+
/*
Should be expanded.
How this works:
diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm
index b861af633d..bb9fc98b8e 100644
--- a/code/_globalvars/bitfields.dm
+++ b/code/_globalvars/bitfields.dm
@@ -47,7 +47,6 @@ GLOBAL_LIST_INIT(bitfields, list(
"NO_MAT_REDEMPTION" = NO_MAT_REDEMPTION,
"DROPDEL" = DROPDEL,
"NOBLUDGEON" = NOBLUDGEON,
- "NODROP" = NODROP,
"ABSTRACT" = ABSTRACT,
),
"admin_flags" = list(
diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm
index 74f9ad0382..df96c44df7 100755
--- a/code/controllers/subsystem/ticker.dm
+++ b/code/controllers/subsystem/ticker.dm
@@ -127,9 +127,20 @@ SUBSYSTEM_DEF(ticker)
if(!GLOB.syndicate_code_phrase)
GLOB.syndicate_code_phrase = generate_code_phrase(return_list=TRUE)
+
+ var/codewords = jointext(GLOB.syndicate_code_phrase, "|")
+ var/regex/codeword_match = new("([codewords])", "ig")
+
+ GLOB.syndicate_code_phrase_regex = codeword_match
+
if(!GLOB.syndicate_code_response)
GLOB.syndicate_code_response = generate_code_phrase(return_list=TRUE)
+ var/codewords = jointext(GLOB.syndicate_code_response, "|")
+ var/regex/codeword_match = new("([codewords])", "ig")
+
+ GLOB.syndicate_code_response_regex = codeword_match
+
start_at = world.time + (CONFIG_GET(number/lobby_countdown) * 10)
if(CONFIG_GET(flag/randomize_shift_time))
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."
if(SHUTTLE_HIJACK)
news_message = "During routine evacuation procedures, the emergency shuttle of [station_name()] had its navigation protocols corrupted and went off course, but was recovered shortly after."
+ if(GANG_VICTORY)
+ news_message = "Company officials reaffirmed that sudden deployments of special forces are not in any way connected to rumors of [station_name()] being covered in graffiti."
+
+ if(SSblackbox.first_death)
+ var/list/ded = SSblackbox.first_death
+ if(ded.len)
+ news_message += " NT Sanctioned Psykers picked up faint traces of someone near the station, allegedly having had died. Their name was: [ded["name"]], [ded["role"]], at [ded["area"]].[ded["last_words"] ? " Their last words were: \"[ded["last_words"]]\"" : ""]"
+ else
+ news_message += " NT Sanctioned Psykers proudly confirm reports that nobody died this shift!"
if(news_message)
send2otherserver(news_source, news_message,"News_Report")
diff --git a/code/datums/components/nanites.dm b/code/datums/components/nanites.dm
index 426855f887..c7dd7123d2 100644
--- a/code/datums/components/nanites.dm
+++ b/code/datums/components/nanites.dm
@@ -2,10 +2,10 @@
dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS
var/mob/living/host_mob
- var/nanite_volume = 100 //amount of nanites in the system, used as fuel for nanite programs
- var/max_nanites = 500 //maximum amount of nanites in the system
+ var/nanite_volume = 50 //amount of nanites in the system, used as fuel for nanite programs
+ var/max_nanites = 250 //maximum amount of nanites in the system
var/regen_rate = 0.5 //nanites generated per second
- var/safety_threshold = 50 //how low nanites will get before they stop processing/triggering
+ var/safety_threshold = 25 //how low nanites will get before they stop processing/triggering
var/cloud_id = 0 //0 if not connected to the cloud, 1-100 to set a determined cloud backup to draw from
var/next_sync = 0
var/list/datum/nanite_program/programs = list()
@@ -311,4 +311,4 @@
mob_program["trigger_code"] = P.trigger_code
id++
mob_programs += list(mob_program)
- data["mob_programs"] = mob_programs
\ No newline at end of file
+ data["mob_programs"] = mob_programs
diff --git a/code/datums/components/storage/storage.dm b/code/datums/components/storage/storage.dm
index 52d0036154..0c701cb943 100644
--- a/code/datums/components/storage/storage.dm
+++ b/code/datums/components/storage/storage.dm
@@ -592,7 +592,7 @@
if(!stop_messages)
to_chat(M, "[IP] cannot hold [I] as it's a storage item of the same size!")
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, "\the [I] is stuck to your hand, you can't put it in \the [host]!")
return FALSE
var/datum/component/storage/concrete/master = master()
diff --git a/code/game/gamemodes/clown_ops/bananium_bomb.dm b/code/game/gamemodes/clown_ops/bananium_bomb.dm
index 0d5f0691c4..b63d5b2e79 100644
--- a/code/game/gamemodes/clown_ops/bananium_bomb.dm
+++ b/code/game/gamemodes/clown_ops/bananium_bomb.dm
@@ -42,18 +42,19 @@
var/obj/item/clothing/C
if(!H.w_uniform || H.dropItemToGround(H.w_uniform))
C = new /obj/item/clothing/under/rank/clown(H)
- C.item_flags |= NODROP //mwahaha
+ ADD_TRAIT(C, TRAIT_NODROP, CLOWN_NUKE_TRAIT)
H.equip_to_slot_or_del(C, SLOT_W_UNIFORM)
if(!H.shoes || H.dropItemToGround(H.shoes))
C = new /obj/item/clothing/shoes/clown_shoes(H)
- C.item_flags |= NODROP
+ ADD_TRAIT(C, TRAIT_NODROP, CLOWN_NUKE_TRAIT)
H.equip_to_slot_or_del(C, SLOT_SHOES)
if(!H.wear_mask || H.dropItemToGround(H.wear_mask))
C = new /obj/item/clothing/mask/gas/clown_hat(H)
- C.item_flags |= NODROP
+ ADD_TRAIT(C, TRAIT_NODROP, CLOWN_NUKE_TRAIT)
H.equip_to_slot_or_del(C, SLOT_WEAR_MASK)
H.dna.add_mutation(CLOWNMUT)
+ H.dna.add_mutation(SMILE)
H.gain_trauma(/datum/brain_trauma/mild/phobia, TRAUMA_RESILIENCE_LOBOTOMY, "clowns") //MWA HA HA
diff --git a/code/game/gamemodes/clown_ops/clown_ops.dm b/code/game/gamemodes/clown_ops/clown_ops.dm
index a666b57afd..66de72bad2 100644
--- a/code/game/gamemodes/clown_ops/clown_ops.dm
+++ b/code/game/gamemodes/clown_ops/clown_ops.dm
@@ -58,6 +58,7 @@
if(visualsOnly)
return
H.dna.add_mutation(CLOWNMUT)
+ H.dna.add_mutation(SMILE)
/datum/outfit/syndicate/clownop/leader
name = "Clown Operative Leader - Basic"
diff --git a/code/game/gamemodes/clown_ops/clown_weapons.dm b/code/game/gamemodes/clown_ops/clown_weapons.dm
index a3440fad39..9d1a3b650c 100644
--- a/code/game/gamemodes/clown_ops/clown_weapons.dm
+++ b/code/game/gamemodes/clown_ops/clown_weapons.dm
@@ -216,11 +216,11 @@
/obj/item/clothing/mask/fakemoustache/sticky/Initialize()
. = ..()
- item_flags |= NODROP
+ ADD_TRAIT(src, TRAIT_NODROP, STICKY_MOUSTACHE_TRAIT)
addtimer(CALLBACK(src, .proc/unstick), unstick_time)
/obj/item/clothing/mask/fakemoustache/sticky/proc/unstick()
- item_flags &= ~NODROP
+ ADD_TRAIT(src, TRAIT_NODROP, STICKY_MOUSTACHE_TRAIT)
//DARK H.O.N.K. AND CLOWN MECH WEAPONS
diff --git a/code/game/machinery/defibrillator_mount.dm b/code/game/machinery/defibrillator_mount.dm
index 7b7c8a3411..4210435f33 100644
--- a/code/game/machinery/defibrillator_mount.dm
+++ b/code/game/machinery/defibrillator_mount.dm
@@ -69,7 +69,7 @@
if(defib)
to_chat(user, "There's already a defibrillator in [src]!")
return
- if(I.item_flags & NODROP || !user.transferItemToLoc(I, src))
+ if(HAS_TRAIT(I, TRAIT_NODROP) || !user.transferItemToLoc(I, src))
to_chat(user, "[I] is stuck to your hand!")
return
user.visible_message("[user] hooks up [I] to [src]!", \
diff --git a/code/game/machinery/harvester.dm b/code/game/machinery/harvester.dm
index 0042da1c92..8be7becfdd 100644
--- a/code/game/machinery/harvester.dm
+++ b/code/game/machinery/harvester.dm
@@ -65,7 +65,7 @@
if(!isitem(A))
continue
var/obj/item/I = A
- if(!(I.item_flags & NODROP))
+ if(!HAS_TRAIT(I, TRAIT_NODROP))
say("Subject may not have abiotic items on.")
playsound(src, 'sound/machines/buzz-sigh.ogg', 30, 1)
return
diff --git a/code/game/objects/effects/decals/cleanable/misc.dm b/code/game/objects/effects/decals/cleanable/misc.dm
index 55a162ad38..cc69b88cc4 100644
--- a/code/game/objects/effects/decals/cleanable/misc.dm
+++ b/code/game/objects/effects/decals/cleanable/misc.dm
@@ -219,7 +219,7 @@
name = "stabilized plasma"
desc = "A puddle of stabilized plasma."
icon_state = "flour"
- color = "#C8A5DC"
+ color = "#9e0089"
/obj/effect/decal/cleanable/insectguts
name = "insect guts"
diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm
index 7e8094c9e7..32d91ee76a 100644
--- a/code/game/objects/effects/mines.dm
+++ b/code/game/objects/effects/mines.dm
@@ -131,7 +131,7 @@
var/obj/item/twohanded/required/chainsaw/doomslayer/chainsaw = new(victim.loc)
victim.log_message("entered a blood frenzy", LOG_ATTACK)
- chainsaw.item_flags |= NODROP
+ ADD_TRAIT(chainsaw, TRAIT_NODROP, CHAINSAW_FRENZY_TRAIT)
victim.drop_all_held_items()
victim.put_in_hands(chainsaw, forced = TRUE)
chainsaw.attack_self(victim)
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index cb979e8188..384a1e4ee4 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -817,6 +817,6 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
return ..()
/obj/item/throw_at(atom/target, range, speed, mob/thrower, spin=TRUE, diagonals_first = FALSE, var/datum/callback/callback)
- if (item_flags & NODROP)
+ if (HAS_TRAIT(src, TRAIT_NODROP))
return
return ..()
diff --git a/code/game/objects/items/chrono_eraser.dm b/code/game/objects/items/chrono_eraser.dm
index 344e7c5472..5db5aa416e 100644
--- a/code/game/objects/items/chrono_eraser.dm
+++ b/code/game/objects/items/chrono_eraser.dm
@@ -48,7 +48,7 @@
icon_state = "chronogun"
item_state = "chronogun"
w_class = WEIGHT_CLASS_NORMAL
- item_flags = NODROP | DROPDEL
+ item_flags = DROPDEL
ammo_type = list(/obj/item/ammo_casing/energy/chrono_beam)
can_charge = 0
fire_delay = 50
@@ -58,6 +58,7 @@
/obj/item/gun/energy/chrono_gun/Initialize()
. = ..()
+ ADD_TRAIT(src, TRAIT_NODROP, CHRONO_GUN_TRAIT)
if(istype(loc, /obj/item/chrono_eraser))
TED = loc
else //admin must have spawned it
@@ -150,8 +151,8 @@
gun = loc
. = ..()
-
-
+
+
/obj/effect/chrono_field
diff --git a/code/game/objects/items/devices/glue.dm b/code/game/objects/items/devices/glue.dm
index fed582d951..2c57ede706 100644
--- a/code/game/objects/items/devices/glue.dm
+++ b/code/game/objects/items/devices/glue.dm
@@ -19,11 +19,11 @@
return
if(istype(target, /obj/item))
var/obj/item/I = target
- if(I.item_flags & NODROP)
+ if(HAS_TRAIT_FROM(I, TRAIT_NODROP, GLUED_ITEM_TRAIT))
to_chat(user, "[I] is already sticky!")
return
uses -= 1
- I.item_flags |= NODROP
+ ADD_TRAIT(I, TRAIT_NODROP, GLUED_ITEM_TRAIT)
I.desc += " It looks sticky."
to_chat(user, "You smear the [I] with glue, making it incredibly sticky!")
if(uses == 0)
diff --git a/code/game/objects/items/devices/gps.dm b/code/game/objects/items/devices/gps.dm
index c362d9f7f2..637bb794d3 100644
--- a/code/game/objects/items/devices/gps.dm
+++ b/code/game/objects/items/devices/gps.dm
@@ -156,7 +156,10 @@ GLOBAL_LIST_EMPTY(GPS_list)
icon_state = "gps-b"
gpstag = "BORG0"
desc = "A mining cyborg internal positioning system. Used as a recovery beacon for damaged cyborg assets, or a collaboration tool for mining teams."
- item_flags = NODROP
+
+/obj/item/gps/cyborg/Initialize()
+ . = ..()
+ ADD_TRAIT(src, TRAIT_NODROP, CYBORG_ITEM_TRAIT)
/obj/item/gps/internal
icon_state = null
diff --git a/code/game/objects/items/devices/radio/electropack.dm b/code/game/objects/items/devices/radio/electropack.dm
index 2f8b111b4b..b74b0fa3d4 100644
--- a/code/game/objects/items/devices/radio/electropack.dm
+++ b/code/game/objects/items/devices/radio/electropack.dm
@@ -38,7 +38,7 @@
/obj/item/electropack/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/clothing/head/helmet))
- var/obj/item/assembly/shock_kit/A = new /obj/item/assembly/shock_kit( user )
+ var/obj/item/assembly/shock_kit/A = new /obj/item/assembly/shock_kit(user)
A.icon = 'icons/obj/assemblies.dmi'
if(!user.transferItemToLoc(W, A))
@@ -53,8 +53,6 @@
user.put_in_hands(A)
A.add_fingerprint(user)
- if(item_flags & NODROP)
- A.item_flags |= NODROP
else
return ..()
@@ -106,8 +104,7 @@
if(shock_cooldown != 0)
return
shock_cooldown = 1
- spawn(100)
- shock_cooldown = 0
+ addtimer(VARSET_CALLBACK(src, shock_cooldown, 0), 100)
var/mob/living/L = loc
step(L, pick(GLOB.cardinals))
diff --git a/code/game/objects/items/devices/reverse_bear_trap.dm b/code/game/objects/items/devices/reverse_bear_trap.dm
index 2f137861aa..20107373d3 100644
--- a/code/game/objects/items/devices/reverse_bear_trap.dm
+++ b/code/game/objects/items/devices/reverse_bear_trap.dm
@@ -49,7 +49,7 @@
if(iscarbon(user))
var/mob/living/carbon/C = user
if(C.get_item_by_slot(SLOT_HEAD) == src)
- if((item_flags & NODROP) && !struggling)
+ if(HAS_TRAIT_FROM(src, TRAIT_NODROP, REVERSE_BEAR_TRAP_TRAIT) && !struggling)
struggling = TRUE
var/fear_string
switch(time_left)
@@ -74,7 +74,7 @@
else
user.visible_message("The lock on [user]'s [name] pops open!", \
"You force open the padlock!", "You hear a single, pronounced click!")
- item_flags &= ~NODROP
+ REMOVE_TRAIT(src, TRAIT_NODROP, REVERSE_BEAR_TRAP_TRAIT)
struggling = FALSE
else
..()
@@ -116,7 +116,7 @@
/obj/item/reverse_bear_trap/proc/reset()
ticking = FALSE
- item_flags &= ~NODROP
+ REMOVE_TRAIT(src, TRAIT_NODROP, REVERSE_BEAR_TRAP_TRAIT)
soundloop.stop()
soundloop2.stop()
STOP_PROCESSING(SSprocessing, src)
@@ -125,7 +125,7 @@
ticking = TRUE
escape_chance = initial(escape_chance) //we keep these vars until re-arm, for tracking purposes
time_left = initial(time_left)
- item_flags |= NODROP
+ ADD_TRAIT(src, TRAIT_NODROP, REVERSE_BEAR_TRAP_TRAIT)
soundloop.start()
soundloop2.mid_length = initial(soundloop2.mid_length)
soundloop2.start()
diff --git a/code/game/objects/items/granters.dm b/code/game/objects/items/granters.dm
index 62c41f7155..21f6961e5d 100644
--- a/code/game/objects/items/granters.dm
+++ b/code/game/objects/items/granters.dm
@@ -279,9 +279,7 @@
/obj/item/book/granter/spell/barnyard/recoil(mob/living/carbon/user)
if(ishuman(user))
to_chat(user,"HORSIE HAS RISEN")
- var/obj/item/clothing/mask/horsehead/magichead = new /obj/item/clothing/mask/horsehead
- magichead.item_flags |= NODROP //curses!
- magichead.flags_inv &= ~HIDEFACE //so you can still see their face
+ var/obj/item/clothing/magichead = new /obj/item/clothing/mask/horsehead/cursed(user.drop_location())
user.dropItemToGround(user.wear_mask, TRUE)
user.equip_to_slot_if_possible(magichead, SLOT_WEAR_MASK, TRUE, TRUE)
qdel(src)
diff --git a/code/game/objects/items/his_grace.dm b/code/game/objects/items/his_grace.dm
index f9d00b6213..6e977331a6 100644
--- a/code/game/objects/items/his_grace.dm
+++ b/code/game/objects/items/his_grace.dm
@@ -90,7 +90,7 @@
do_attack_animation(master, null, src)
master.emote("scream")
master.remove_status_effect(STATUS_EFFECT_HISGRACE)
- item_flags &= ~NODROP
+ REMOVE_TRAIT(src, TRAIT_NODROP, HIS_GRACE_TRAIT)
master.Knockdown(60)
master.adjustBruteLoss(master.maxHealth)
playsound(master, 'sound/effects/splat.ogg', 100, 0)
@@ -198,20 +198,20 @@
update_stats()
/obj/item/his_grace/proc/update_stats()
- item_flags &= ~NODROP
+ REMOVE_TRAIT(src, TRAIT_NODROP, HIS_GRACE_TRAIT)
var/mob/living/master = get_atom_on_turf(src, /mob/living)
switch(bloodthirst)
if(HIS_GRACE_CONSUME_OWNER to HIS_GRACE_FALL_ASLEEP)
if(HIS_GRACE_CONSUME_OWNER > prev_bloodthirst)
master.visible_message("[src] enters a frenzy!")
if(HIS_GRACE_STARVING to HIS_GRACE_CONSUME_OWNER)
- item_flags |= NODROP
+ ADD_TRAIT(src, TRAIT_NODROP, HIS_GRACE_TRAIT)
if(HIS_GRACE_STARVING > prev_bloodthirst)
master.visible_message("[src] is starving!", "[src]'s bloodlust overcomes you. [src] must be fed, or you will become His meal.\
[force_bonus < 15 ? " And still, His power grows.":""]")
force_bonus = max(force_bonus, 15)
if(HIS_GRACE_FAMISHED to HIS_GRACE_STARVING)
- item_flags |= NODROP
+ ADD_TRAIT(src, TRAIT_NODROP, HIS_GRACE_TRAIT)
if(HIS_GRACE_FAMISHED > prev_bloodthirst)
master.visible_message("[src] is very hungry!", "Spines sink into your hand. [src] must feed immediately.\
[force_bonus < 10 ? " His power grows.":""]")
diff --git a/code/game/objects/items/holy_weapons.dm b/code/game/objects/items/holy_weapons.dm
index 06aef0a22b..0e8a9fef9e 100644
--- a/code/game/objects/items/holy_weapons.dm
+++ b/code/game/objects/items/holy_weapons.dm
@@ -280,12 +280,19 @@
righthand_file = 'icons/mob/inhands/items_righthand.dmi'
name = "god hand"
desc = "This hand of yours glows with an awesome power!"
- item_flags = ABSTRACT | NODROP | DROPDEL
+ item_flags = ABSTRACT | DROPDEL
w_class = WEIGHT_CLASS_HUGE
hitsound = 'sound/weapons/sear.ogg'
damtype = BURN
attack_verb = list("punched", "cross countered", "pummeled")
+
+/obj/item/nullrod/godhand/Initialize()
+ . = ..()
+ ADD_TRAIT(src, TRAIT_NODROP, HAND_REPLACEMENT_TRAIT)
+
+
+
/obj/item/nullrod/staff
icon_state = "godstaff-red"
item_state = "godstaff-red"
@@ -525,13 +532,14 @@
lefthand_file = 'icons/mob/inhands/weapons/chainsaw_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/chainsaw_righthand.dmi'
w_class = WEIGHT_CLASS_HUGE
- item_flags = NODROP | ABSTRACT
+ item_flags = ABSTRACT
sharpness = IS_SHARP
attack_verb = list("sawed", "torn", "cut", "chopped", "diced")
hitsound = 'sound/weapons/chainsawhit.ogg'
/obj/item/nullrod/chainsaw/Initialize()
. = ..()
+ ADD_TRAIT(src, TRAIT_NODROP, HAND_REPLACEMENT_TRAIT)
AddComponent(/datum/component/butchering, 30, 100, 0, hitsound)
/obj/item/nullrod/clown
@@ -601,12 +609,13 @@
item_state = "arm_blade"
lefthand_file = 'icons/mob/inhands/antag/changeling_lefthand.dmi'
righthand_file = 'icons/mob/inhands/antag/changeling_righthand.dmi'
- item_flags = ABSTRACT | NODROP
+ item_flags = ABSTRACT
w_class = WEIGHT_CLASS_HUGE
sharpness = IS_SHARP
/obj/item/nullrod/armblade/Initialize()
. = ..()
+ ADD_TRAIT(src, TRAIT_NODROP, HAND_REPLACEMENT_TRAIT)
AddComponent(/datum/component/butchering, 80, 70)
/obj/item/nullrod/armblade/tentacle
diff --git a/code/game/objects/items/hot_potato.dm b/code/game/objects/items/hot_potato.dm
index db7f38ddf3..e7b05d7a01 100644
--- a/code/game/objects/items/hot_potato.dm
+++ b/code/game/objects/items/hot_potato.dm
@@ -134,7 +134,7 @@
return
update_icon()
if(sticky)
- item_flags |= NODROP
+ ADD_TRAIT(src, TRAIT_NODROP, HOT_POTATO_TRAIT)
name = "primed [name]"
activation_time = timer + world.time
detonation_timerid = addtimer(CALLBACK(src, .proc/detonate), delay, TIMER_STOPPABLE)
@@ -147,7 +147,7 @@
/obj/item/hot_potato/proc/deactivate()
update_icon()
name = initial(name)
- item_flags &= ~NODROP
+ REMOVE_TRAIT(src, TRAIT_NODROP, HOT_POTATO_TRAIT)
deltimer(detonation_timerid)
STOP_PROCESSING(SSfastprocess, src)
detonation_timerid = null
diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm
index 33a48c17bb..0d45960767 100644
--- a/code/game/objects/items/melee/misc.dm
+++ b/code/game/objects/items/melee/misc.dm
@@ -42,7 +42,7 @@
force = 20
throwforce = 10
hitsound = 'sound/weapons/bladeslice.ogg'
- attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
+ attack_verb = list("attacked", "impaled", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
sharpness = IS_SHARP
/obj/item/melee/synthetic_arm_blade/Initialize()
@@ -92,8 +92,7 @@
/obj/item/melee/sabre/suicide_act(mob/living/user)
user.visible_message("[user] is trying to cut off all [user.p_their()] limbs with [src]! it looks like [user.p_theyre()] trying to commit suicide!")
var/i = 0
- var/originally_nodropped = item_flags & NODROP
- item_flags |= NODROP
+ ADD_TRAIT(src, TRAIT_NODROP, SABRE_SUICIDE_TRAIT)
if(iscarbon(user))
var/mob/living/carbon/Cuser = user
var/obj/item/bodypart/holding_bodypart = Cuser.get_holding_bodypart_of_item(src)
@@ -118,7 +117,7 @@
for(bodypart in limbs_to_dismember)
i++
addtimer(CALLBACK(src, .proc/suicide_dismember, user, bodypart), speedbase * i)
- addtimer(CALLBACK(src, .proc/manual_suicide, user, originally_nodropped), (5 SECONDS) * i)
+ addtimer(CALLBACK(src, .proc/manual_suicide, user), (5 SECONDS) * i)
return MANUAL_SUICIDE
/obj/item/melee/sabre/proc/suicide_dismember(mob/living/user, obj/item/bodypart/affecting)
@@ -131,8 +130,29 @@
if(!QDELETED(user))
user.adjustBruteLoss(200)
user.death(FALSE)
- if(!originally_nodropped)
- item_flags &= ~NODROP
+ REMOVE_TRAIT(src, TRAIT_NODROP, SABRE_SUICIDE_TRAIT)
+
+/obj/item/melee/rapier
+ name = "plastitanium rapier"
+ desc = "A impossibly thin blade made of plastitanium with a tip made of diamond. It looks to be able to cut through any armor."
+ icon = 'icons/obj/items_and_weapons.dmi'
+ icon_state = "rapier"
+ item_state = "rapier"
+ lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
+ force = 25
+ throwforce = 35
+ block_chance = 0
+ armour_penetration = 100
+ flags_1 = CONDUCT_1
+ obj_flags = UNIQUE_RENAME
+ w_class = WEIGHT_CLASS_BULKY
+ sharpness = IS_SHARP_ACCURATE //It cant be sharpend cook -_-
+ attack_verb = list("slashed", "cut", "pierces", "pokes")
+
+/obj/item/melee/rapier/Initialize()
+ . = ..()
+ AddComponent(/datum/component/butchering, 20, 65, 0)
/obj/item/melee/classic_baton
name = "police baton"
diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm
index e2d7fdf9d7..e3494e36cf 100755
--- a/code/game/objects/items/storage/belt.dm
+++ b/code/game/objects/items/storage/belt.dm
@@ -664,6 +664,32 @@
/obj/item/melee/sabre
))
+/obj/item/storage/belt/sabre/rapier
+ name = "rapier sheath"
+ desc = "A black, thin sheath that looks to house only a long thin blade. Feels like its made of metal."
+ icon_state = "rsheath"
+ item_state = "rsheath"
+ force = 5
+ throwforce = 15
+ block_chance = 30
+ w_class = WEIGHT_CLASS_BULKY
+ attack_verb = list("bashed", "slashes", "prods", "pokes")
+
+/obj/item/storage/belt/sabre/rapier/ComponentInitialize()
+ . = ..()
+ GET_COMPONENT(STR, /datum/component/storage)
+ STR.max_items = 1
+ STR.rustle_sound = FALSE
+ STR.max_w_class = WEIGHT_CLASS_BULKY
+ STR.can_hold = typecacheof(list(
+ /obj/item/melee/rapier
+ ))
+
+/obj/item/storage/belt/sabre/rapier/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
+ if(attack_type == PROJECTILE_ATTACK)
+ final_block_chance = 0 //To thin to block bullets
+ return ..()
+
/obj/item/storage/belt/sabre/examine(mob/user)
..()
if(length(contents))
@@ -681,8 +707,8 @@
to_chat(user, "[src] is empty.")
/obj/item/storage/belt/sabre/update_icon()
- icon_state = "sheath"
- item_state = "sheath"
+ icon_state = initial(icon_state)
+ item_state = initial(item_state)
if(contents.len)
icon_state += "-sabre"
item_state += "-sabre"
@@ -694,3 +720,7 @@
/obj/item/storage/belt/sabre/PopulateContents()
new /obj/item/melee/sabre(src)
update_icon()
+
+/obj/item/storage/belt/sabre/rapier/PopulateContents()
+ new /obj/item/melee/rapier(src)
+ update_icon()
diff --git a/code/game/objects/items/storage/book.dm b/code/game/objects/items/storage/book.dm
index 830c3aea96..df7b203f91 100644
--- a/code/game/objects/items/storage/book.dm
+++ b/code/game/objects/items/storage/book.dm
@@ -74,6 +74,7 @@ GLOBAL_LIST_INIT(bibleitemstates, list("bible", "koran", "scrapbook", "bible",
if(B.icon_state == "honk1" || B.icon_state == "honk2")
var/mob/living/carbon/human/H = usr
H.dna.add_mutation(CLOWNMUT)
+ H.dna.add_mutation(SMILE)
H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/clown_hat(H), SLOT_WEAR_MASK)
GLOB.bible_icon_state = B.icon_state
@@ -138,7 +139,7 @@ GLOBAL_LIST_INIT(bibleitemstates, list("bible", "koran", "scrapbook", "bible",
smack = 0
else if(iscarbon(M))
var/mob/living/carbon/C = M
- if(!istype(C.head, /obj/item/clothing/head))
+ if(!istype(C.head, /obj/item/clothing/head))
C.adjustBrainLoss(10, 80)
to_chat(C, "You feel dumber.")
diff --git a/code/game/objects/items/tools/crowbar.dm b/code/game/objects/items/tools/crowbar.dm
index 6cee5def2a..97375221d4 100644
--- a/code/game/objects/items/tools/crowbar.dm
+++ b/code/game/objects/items/tools/crowbar.dm
@@ -34,6 +34,12 @@
icon_state = "crowbar_brass"
toolspeed = 0.5
+/obj/item/crowbar/bronze
+ name = "bronze plated crowbar"
+ desc = "A bronze plated crowbar."
+ icon_state = "crowbar_brass"
+ toolspeed = 0.95
+
/obj/item/crowbar/abductor
name = "alien crowbar"
desc = "A hard-light crowbar. It appears to pry by itself, without any effort required."
@@ -42,7 +48,6 @@
icon_state = "crowbar"
toolspeed = 0.1
-
/obj/item/crowbar/large
name = "crowbar"
desc = "It's a big crowbar. It doesn't fit in your pockets, because it's big."
diff --git a/code/game/objects/items/tools/screwdriver.dm b/code/game/objects/items/tools/screwdriver.dm
index 217b53c928..e5808de088 100644
--- a/code/game/objects/items/tools/screwdriver.dm
+++ b/code/game/objects/items/tools/screwdriver.dm
@@ -86,6 +86,14 @@
toolspeed = 0.5
random_color = FALSE
+/obj/item/screwdriver/bronze
+ name = "bronze screwdriver"
+ desc = "A screwdriver plated with bronze."
+ icon_state = "screwdriver_brass"
+ item_state = "screwdriver_brass"
+ toolspeed = 0.95
+ random_color = FALSE
+
/obj/item/screwdriver/abductor
name = "alien screwdriver"
desc = "An ultrasonic screwdriver."
diff --git a/code/game/objects/items/tools/weldingtool.dm b/code/game/objects/items/tools/weldingtool.dm
index 54f199969f..718035a9a5 100644
--- a/code/game/objects/items/tools/weldingtool.dm
+++ b/code/game/objects/items/tools/weldingtool.dm
@@ -363,6 +363,13 @@
icon_state = "brasswelder"
item_state = "brasswelder"
+/obj/item/weldingtool/bronze
+ name = "bronze plated welding tool"
+ desc = "A bronze plated welder."
+ max_fuel = 21
+ toolspeed = 0.95
+ icon_state = "brasswelder"
+ item_state = "brasswelder"
/obj/item/weldingtool/experimental/process()
..()
diff --git a/code/game/objects/items/tools/wirecutters.dm b/code/game/objects/items/tools/wirecutters.dm
index 2bf9c93ff9..1a35196bd8 100644
--- a/code/game/objects/items/tools/wirecutters.dm
+++ b/code/game/objects/items/tools/wirecutters.dm
@@ -69,6 +69,13 @@
random_color = FALSE
toolspeed = 0.5
+/obj/item/wirecutters/bronze
+ name = "bronze plated wirecutters"
+ desc = "A pair of wirecutters plated with bronze."
+ icon_state = "cutters_brass"
+ random_color = FALSE
+ toolspeed = 0.95 //Wire cutters have 0 time bars though
+
/obj/item/wirecutters/abductor
name = "alien wirecutters"
desc = "Extremely sharp wirecutters, made out of a silvery-green metal."
diff --git a/code/game/objects/items/tools/wrench.dm b/code/game/objects/items/tools/wrench.dm
index dc78e9aace..4fd99e9adf 100644
--- a/code/game/objects/items/tools/wrench.dm
+++ b/code/game/objects/items/tools/wrench.dm
@@ -35,6 +35,12 @@
icon_state = "wrench_brass"
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
name = "alien wrench"
desc = "A polarized wrench. It causes anything placed between the jaws to turn."
@@ -43,7 +49,6 @@
usesound = 'sound/effects/empulse.ogg'
toolspeed = 0.1
-
/obj/item/wrench/power
name = "hand drill"
desc = "A simple powered hand drill. It's fitted with a bolt bit."
diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm
index 9239973247..9ac5261e5f 100644
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys.dm
@@ -249,8 +249,8 @@
// Copied from /obj/item/melee/transforming/energy/sword/attackby
/obj/item/toy/sword/attackby(obj/item/W, mob/living/user, params)
if(istype(W, /obj/item/toy/sword))
- if((W.item_flags & NODROP) || (item_flags & NODROP))
- to_chat(user, "\the [item_flags & NODROP ? src : W] is stuck to your hand, you can't attach it to \the [item_flags & NODROP ? W : src]!")
+ if(HAS_TRAIT(W, TRAIT_NODROP) || HAS_TRAIT(src, TRAIT_NODROP))
+ to_chat(user, "\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]!")
return
else
to_chat(user, "You attach the ends of the two plastic swords, making a single double-bladed toy! You're fake-cool.")
diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm
index ccc703296e..48681c3d6d 100644
--- a/code/game/objects/items/weaponry.dm
+++ b/code/game/objects/items/weaponry.dm
@@ -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
desc = "THERE CAN BE ONLY ONE, AND IT WILL BE YOU!!!\nActivate it in your hand to point to the nearest victim."
flags_1 = CONDUCT_1
- item_flags = NODROP | DROPDEL
+ item_flags = DROPDEL
slot_flags = null
block_chance = 0 //RNG WON'T HELP YOU NOW, PANSY
light_range = 3
@@ -91,6 +91,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
/obj/item/claymore/highlander/Initialize()
. = ..()
+ ADD_TRAIT(src, TRAIT_NODROP, HIGHLANDER)
START_PROCESSING(SSobj, src)
/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
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)
user.visible_message("[user] is slitting [user.p_their()] stomach open with [src]! It looks like [user.p_theyre()] trying to commit seppuku!")
@@ -255,7 +259,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
user.put_in_hands(S)
to_chat(user, "You fasten the glass shard to the top of the rod with the cable.")
- 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
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"
lefthand_file = 'icons/mob/inhands/weapons/chainsaw_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/chainsaw_righthand.dmi'
- item_flags = NODROP | ABSTRACT | DROPDEL
+ item_flags = ABSTRACT | DROPDEL
w_class = WEIGHT_CLASS_HUGE
force = 24
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")
hitsound = 'sound/weapons/chainsawhit.ogg'
+/obj/item/mounted_chainsaw/Initialize()
+ . = ..()
+ ADD_TRAIT(src, TRAIT_NODROP, HAND_REPLACEMENT_TRAIT)
+
/obj/item/mounted_chainsaw/Destroy()
var/obj/item/bodypart/part
new /obj/item/twohanded/required/chainsaw(get_turf(src))
diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm
index cbdb0750e2..2c4463928c 100644
--- a/code/game/objects/structures/crates_lockers/closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets.dm
@@ -147,47 +147,48 @@
/obj/structure/closet/proc/insert(atom/movable/AM)
if(contents.len >= storage_capacity)
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(!isliving(AM)) //let's not put ghosts or camera mobs inside closets...
- return
+ return FALSE
var/mob/living/L = AM
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(horizontal && L.density)
- return
+ return FALSE
if(L.mob_size > max_mob_size)
- return
+ return FALSE
var/mobs_stored = 0
for(var/mob/living/M in contents)
if(++mobs_stored >= mob_storage_capacity)
- return
+ return FALSE
L.stop_pulling()
+
else if(istype(AM, /obj/structure/closet))
- return
+ return FALSE
else if(istype(AM, /obj/effect))
- return
+ return FALSE
else if(isobj(AM))
- if (istype(AM, /obj/item))
- var/obj/item/I = AM
- if (I.item_flags & NODROP)
- return
+ if((!allow_dense && AM.density) || AM.anchored || AM.has_buckled_mobs())
+ return FALSE
+ if(isitem(AM) && !HAS_TRAIT(AM, TRAIT_NODROP))
+ return TRUE
else if(!allow_objects && !istype(AM, /obj/effect/dummy/chameleon))
- return
- if(!allow_dense && AM.density)
- return
- if(AM.anchored || AM.has_buckled_mobs())
- return
+ return FALSE
else
- return
+ return FALSE
- AM.forceMove(src)
-
- return 1
+ return TRUE
/obj/structure/closet/proc/close(mob/living/user)
if(!opened || !can_close(user))
diff --git a/code/game/objects/structures/manned_turret.dm b/code/game/objects/structures/manned_turret.dm
index aa55cd81b1..80ffced5a2 100644
--- a/code/game/objects/structures/manned_turret.dm
+++ b/code/game/objects/structures/manned_turret.dm
@@ -180,12 +180,13 @@
icon = 'icons/obj/items_and_weapons.dmi'
icon_state = "offhand"
w_class = WEIGHT_CLASS_HUGE
- item_flags = ABSTRACT | NODROP | NOBLUDGEON | DROPDEL
+ item_flags = ABSTRACT | NOBLUDGEON | DROPDEL
resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF
var/obj/machinery/manned_turret/turret
/obj/item/gun_control/Initialize()
. = ..()
+ ADD_TRAIT(src, TRAIT_NODROP, ABSTRACT_ITEM_TRAIT)
turret = loc
if(!istype(turret))
return INITIALIZE_HINT_QDEL
diff --git a/code/modules/admin/secrets.dm b/code/modules/admin/secrets.dm
index 66358dc080..7d74387c43 100644
--- a/code/modules/admin/secrets.dm
+++ b/code/modules/admin/secrets.dm
@@ -422,7 +422,7 @@
H.equip_to_slot_or_del(I, SLOT_W_UNIFORM)
qdel(olduniform)
if(droptype == "Yes")
- I.item_flags |= NODROP
+ ADD_TRAIT(I, TRAIT_NODROP, ADMIN_TRAIT)
else
to_chat(H, "You're not kawaii enough for this.")
diff --git a/code/modules/antagonists/abductor/equipment/abduction_gear.dm b/code/modules/antagonists/abductor/equipment/abduction_gear.dm
index ca491d8cab..1573204d88 100644
--- a/code/modules/antagonists/abductor/equipment/abduction_gear.dm
+++ b/code/modules/antagonists/abductor/equipment/abduction_gear.dm
@@ -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)
/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))
- to_chat(loc, "Your vest is now [item_flags & NODROP ? "locked" : "unlocked"].")
+ to_chat(loc, "Your vest is now [HAS_TRAIT_FROM(src, TRAIT_NODROP, ABDUCTOR_VEST_TRAIT) ? "locked" : "unlocked"].")
/obj/item/clothing/suit/armor/abductor/vest/proc/flip_mode()
switch(mode)
diff --git a/code/modules/antagonists/abductor/equipment/abduction_outfits.dm b/code/modules/antagonists/abductor/equipment/abduction_outfits.dm
index e2b881d147..a69c8fdeff 100644
--- a/code/modules/antagonists/abductor/equipment/abduction_outfits.dm
+++ b/code/modules/antagonists/abductor/equipment/abduction_outfits.dm
@@ -17,7 +17,7 @@
var/obj/item/clothing/suit/armor/abductor/vest/V = locate() in H
if(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
if(B)
diff --git a/code/modules/antagonists/abductor/machinery/console.dm b/code/modules/antagonists/abductor/machinery/console.dm
index 52bda50b86..46d69ba9bb 100644
--- a/code/modules/antagonists/abductor/machinery/console.dm
+++ b/code/modules/antagonists/abductor/machinery/console.dm
@@ -75,7 +75,7 @@
dat+="
"
dat += "Select Agent Vest Disguise
"
- dat += "[vest.item_flags & NODROP ? "Unlock" : "Lock"] Vest
"
+ dat += "[HAS_TRAIT_FROM(vest, TRAIT_NODROP, ABDUCTOR_VEST_TRAIT) ? "Unlock" : "Lock"] Vest
"
else
dat += "NO AGENT VEST DETECTED"
var/datum/browser/popup = new(user, "computer", "Abductor Console", 400, 500)
diff --git a/code/modules/antagonists/changeling/powers/mutations.dm b/code/modules/antagonists/changeling/powers/mutations.dm
index ede3c2fc58..4e0595362c 100644
--- a/code/modules/antagonists/changeling/powers/mutations.dm
+++ b/code/modules/antagonists/changeling/powers/mutations.dm
@@ -155,7 +155,7 @@
item_state = "arm_blade"
lefthand_file = 'icons/mob/inhands/antag/changeling_lefthand.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
force = 25
throwforce = 0 //Just to be on the safe side
@@ -169,6 +169,7 @@
/obj/item/melee/arm_blade/Initialize(mapload,silent,synthetic)
. = ..()
+ ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
if(ismob(loc) && !silent)
loc.visible_message("A grotesque blade forms around [loc.name]\'s arm!", "Our arm twists and mutates, transforming it into a deadly blade.", "You hear organic matter ripping and tearing!")
if(synthetic)
@@ -242,7 +243,7 @@
item_state = "tentacle"
lefthand_file = 'icons/mob/inhands/antag/changeling_lefthand.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
w_class = WEIGHT_CLASS_HUGE
ammo_type = /obj/item/ammo_casing/magic/tentacle
@@ -256,6 +257,7 @@
/obj/item/gun/magic/tentacle/Initialize(mapload, silent)
. = ..()
+ ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
if(ismob(loc))
if(!silent)
loc.visible_message("[loc.name]\'s arm starts stretching inhumanly!", "Our arm twists and mutates, transforming it into a tentacle.", "You hear organic matter ripping and tearing!")
@@ -427,7 +429,7 @@
/obj/item/shield/changeling
name = "shield-like mass"
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_state = "ling_shield"
lefthand_file = 'icons/mob/inhands/antag/changeling_lefthand.dmi'
@@ -438,6 +440,7 @@
/obj/item/shield/changeling/Initialize()
. = ..()
+ ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
if(ismob(loc))
loc.visible_message("The end of [loc.name]\'s hand inflates rapidly, forming a huge shield-like mass!", "We inflate our hand into a strong shield.", "You hear organic matter ripping and tearing!")
@@ -479,13 +482,14 @@
name = "flesh mass"
icon_state = "lingspacesuit"
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)
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.
/obj/item/clothing/suit/space/changeling/Initialize()
. = ..()
+ ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
if(ismob(loc))
loc.visible_message("[loc.name]\'s flesh rapidly inflates, forming a bloated mass around [loc.p_their()] body!", "We inflate our flesh, creating a spaceproof suit!", "You hear organic matter ripping and tearing!")
START_PROCESSING(SSobj, src)
@@ -499,11 +503,15 @@
name = "flesh mass"
icon_state = "lingspacehelmet"
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
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90)
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
+/obj/item/clothing/head/helmet/space/changeling/Initialize()
+ . = ..()
+ ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
+
/***************************************\
|*****************ARMOR*****************|
\***************************************/
@@ -529,7 +537,7 @@
name = "chitinous mass"
desc = "A tough, hard covering of black chitin."
icon_state = "lingarmor"
- item_flags = NODROP | DROPDEL
+ item_flags = DROPDEL
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)
flags_inv = HIDEJUMPSUIT
@@ -538,6 +546,7 @@
/obj/item/clothing/suit/armor/changeling/Initialize()
. = ..()
+ ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
if(ismob(loc))
loc.visible_message("[loc.name]\'s flesh turns black, quickly transforming into a hard, chitinous mass!", "We harden our flesh, creating a suit of armor!", "You hear organic matter ripping and tearing!")
@@ -545,6 +554,10 @@
name = "chitinous mass"
desc = "A tough, hard covering of black chitin with transparent chitin in front."
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)
flags_inv = HIDEEARS|HIDEHAIR|HIDEEYES|HIDEFACIALHAIR|HIDEFACE
+
+/obj/item/clothing/head/helmet/changeling/Initialize()
+ . = ..()
+ ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
diff --git a/code/modules/antagonists/changeling/powers/transform.dm b/code/modules/antagonists/changeling/powers/transform.dm
index 767c7d2621..795ba772d6 100644
--- a/code/modules/antagonists/changeling/powers/transform.dm
+++ b/code/modules/antagonists/changeling/powers/transform.dm
@@ -11,7 +11,11 @@
/obj/item/clothing/glasses/changeling
name = "flesh"
- item_flags = NODROP
+
+/obj/item/clothing/glasses/changeling/Initialize()
+ . = ..()
+ ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
+
//ATTACK HAND IGNORING PARENT RETURN VALUE
/obj/item/clothing/glasses/changeling/attack_hand(mob/user)
@@ -23,7 +27,11 @@
/obj/item/clothing/under/changeling
name = "flesh"
- item_flags = NODROP
+
+/obj/item/clothing/under/changeling/Initialize()
+ . = ..()
+ ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
+
//ATTACK HAND IGNORING PARENT RETURN VALUE
/obj/item/clothing/under/changeling/attack_hand(mob/user)
@@ -35,9 +43,13 @@
/obj/item/clothing/suit/changeling
name = "flesh"
- item_flags = NODROP
allowed = list(/obj/item/changeling)
+/obj/item/clothing/suit/changeling/Initialize()
+ . = ..()
+ ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
+
+
//ATTACK HAND IGNORING PARENT RETURN VALUE
/obj/item/clothing/suit/changeling/attack_hand(mob/user)
if(loc == user && user.mind && user.mind.has_antag_datum(/datum/antagonist/changeling))
@@ -48,7 +60,10 @@
/obj/item/clothing/head/changeling
name = "flesh"
- item_flags = NODROP
+
+/obj/item/clothing/head/changeling/Initialize()
+ . = ..()
+ ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
//ATTACK HAND IGNORING PARENT RETURN VALUE
/obj/item/clothing/head/changeling/attack_hand(mob/user)
@@ -60,7 +75,11 @@
/obj/item/clothing/shoes/changeling
name = "flesh"
- item_flags = NODROP
+
+/obj/item/clothing/shoes/changeling/Initialize()
+ . = ..()
+ ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
+
//ATTACK HAND IGNORING PARENT RETURN VALUE
/obj/item/clothing/shoes/changeling/attack_hand(mob/user)
@@ -72,7 +91,11 @@
/obj/item/clothing/gloves/changeling
name = "flesh"
- item_flags = NODROP
+
+/obj/item/clothing/gloves/changeling/Initialize()
+ . = ..()
+ ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
+
//ATTACK HAND IGNORING PARENT RETURN VALUE
/obj/item/clothing/gloves/changeling/attack_hand(mob/user)
@@ -84,7 +107,11 @@
/obj/item/clothing/mask/changeling
name = "flesh"
- item_flags = NODROP
+
+/obj/item/clothing/mask/changeling/Initialize()
+ . = ..()
+ ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
+
//ATTACK HAND IGNORING PARENT RETURN VALUE
/obj/item/clothing/mask/changeling/attack_hand(mob/user)
@@ -96,10 +123,14 @@
/obj/item/changeling
name = "flesh"
- item_flags = NODROP
slot_flags = ALL
allowed = list(/obj/item/changeling)
+/obj/item/changeling/Initialize()
+ . = ..()
+ ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
+
+
//ATTACK HAND IGNORING PARENT RETURN VALUE
/obj/item/changeling/attack_hand(mob/user)
if(loc == user && user.mind && user.mind.has_antag_datum(/datum/antagonist/changeling))
diff --git a/code/modules/antagonists/cult/blood_magic.dm b/code/modules/antagonists/cult/blood_magic.dm
index dae1066cf9..244a6d8f28 100644
--- a/code/modules/antagonists/cult/blood_magic.dm
+++ b/code/modules/antagonists/cult/blood_magic.dm
@@ -339,7 +339,7 @@
icon = 'icons/obj/items_and_weapons.dmi'
icon_state = "disintegrate"
item_state = null
- item_flags = NEEDS_PERMIT | ABSTRACT | NODROP | DROPDEL
+ item_flags = NEEDS_PERMIT | ABSTRACT | DROPDEL
w_class = WEIGHT_CLASS_HUGE
throwforce = 0
@@ -350,11 +350,13 @@
var/health_cost = 0 //The amount of health taken from the user when invoking the spell
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
uses = source.charges
health_cost = source.health_cost
- ..()
+
/obj/item/melee/blood_magic/Destroy()
if(!QDELETED(source))
diff --git a/code/modules/antagonists/cult/cult_items.dm b/code/modules/antagonists/cult/cult_items.dm
index 6bef6fd021..9a17c3270b 100644
--- a/code/modules/antagonists/cult/cult_items.dm
+++ b/code/modules/antagonists/cult/cult_items.dm
@@ -64,9 +64,14 @@
/obj/item/melee/cultblade/ghost
name = "eldritch sword"
force = 19 //can't break normal airlocks
- item_flags = NEEDS_PERMIT | NODROP | DROPDEL
+ item_flags = NEEDS_PERMIT | DROPDEL
flags_1 = NONE
+/obj/item/melee/cultblade/ghost/Initialize()
+ . = ..()
+ ADD_TRAIT(src, TRAIT_NODROP, CULT_TRAIT)
+
+
/obj/item/melee/cultblade/pickup(mob/living/user)
..()
if(!iscultist(user))
@@ -298,7 +303,12 @@
item_state = "cult_hoodalt"
/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
name = "cultist robes"
@@ -307,7 +317,11 @@
item_state = "cultrobesalt"
/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
name = "magus helm"
@@ -796,7 +810,7 @@
icon = 'icons/obj/items_and_weapons.dmi'
icon_state = "disintegrate"
item_state = null
- item_flags = ABSTRACT | NODROP | DROPDEL
+ item_flags = ABSTRACT | DROPDEL
w_class = WEIGHT_CLASS_HUGE
throwforce = 0
throw_range = 0
@@ -805,6 +819,9 @@
var/firing = FALSE
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)
. = ..()
diff --git a/code/modules/antagonists/highlander/highlander.dm b/code/modules/antagonists/highlander/highlander.dm
index c0246ba978..51e8d9a13b 100644
--- a/code/modules/antagonists/highlander/highlander.dm
+++ b/code/modules/antagonists/highlander/highlander.dm
@@ -60,7 +60,7 @@
W.access += get_all_centcom_access()
W.assignment = "Highlander"
W.registered_name = H.real_name
- W.item_flags |= NODROP
+ ADD_TRAIT(W, TRAIT_NODROP, HIGHLANDER)
W.update_label(H.real_name)
H.equip_to_slot_or_del(W, SLOT_WEAR_ID)
diff --git a/code/modules/antagonists/nukeop/equipment/pinpointer.dm b/code/modules/antagonists/nukeop/equipment/pinpointer.dm
index d8dc709975..538feba008 100644
--- a/code/modules/antagonists/nukeop/equipment/pinpointer.dm
+++ b/code/modules/antagonists/nukeop/equipment/pinpointer.dm
@@ -65,9 +65,13 @@
/obj/item/pinpointer/syndicate_cyborg // Cyborg pinpointers just look for a random operative.
name = "cyborg syndicate pinpointer"
desc = "An integrated tracking device, jury-rigged to search for living Syndicate operatives."
- item_flags = NODROP
flags_1 = NONE
+
+/obj/item/pinpointer/syndicate_cyborg/Initialize()
+ . = ..()
+ ADD_TRAIT(src, TRAIT_NODROP, CYBORG_ITEM_TRAIT)
+
/obj/item/pinpointer/syndicate_cyborg/scan_for_target()
target = null
var/list/possible_targets = list()
diff --git a/code/modules/antagonists/traitor/datum_traitor.dm b/code/modules/antagonists/traitor/datum_traitor.dm
index 828e19e3f6..e43c2f6254 100644
--- a/code/modules/antagonists/traitor/datum_traitor.dm
+++ b/code/modules/antagonists/traitor/datum_traitor.dm
@@ -358,8 +358,14 @@
return result.Join("
")
/datum/antagonist/traitor/roundend_report_footer()
- return "
The code phrases were: [GLOB.syndicate_code_phrase]
\
- The code responses were: [GLOB.syndicate_code_response]
"
+ var/phrases = jointext(GLOB.syndicate_code_phrase, ", ")
+ var/responses = jointext(GLOB.syndicate_code_response, ", ")
+
+ var message = "
The code phrases were: [phrases]
\
+ The code responses were: [responses]
"
+
+ return message
+
/datum/antagonist/traitor/is_gamemode_hero()
return SSticker.mode.name == "traitor"
diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm
index 6ea571935b..3bf54a1178 100644
--- a/code/modules/atmospherics/machinery/airalarm.dm
+++ b/code/modules/atmospherics/machinery/airalarm.dm
@@ -650,7 +650,7 @@
if(0)
add_overlay(AALARM_OVERLAY_GREEN)
overlay_state = AALARM_OVERLAY_GREEN
- light_color = LIGHT_COLOR_PALEBLUE
+ light_color = LIGHT_COLOR_GREEN
set_light(brightness_on)
if(1)
add_overlay(AALARM_OVERLAY_WARN)
diff --git a/code/modules/awaymissions/capture_the_flag.dm b/code/modules/awaymissions/capture_the_flag.dm
index 881e25f138..fcfdd7c455 100644
--- a/code/modules/awaymissions/capture_the_flag.dm
+++ b/code/modules/awaymissions/capture_the_flag.dm
@@ -497,14 +497,14 @@
W.registered_name = H.real_name
W.update_label(W.registered_name, W.assignment)
- // The shielded hardsuit is already NODROP
+ // The shielded hardsuit is already TRAIT_NODROP
no_drops += H.get_item_by_slot(SLOT_GLOVES)
no_drops += H.get_item_by_slot(SLOT_SHOES)
no_drops += H.get_item_by_slot(SLOT_W_UNIFORM)
no_drops += H.get_item_by_slot(SLOT_EARS)
for(var/i in no_drops)
var/obj/item/I = i
- I.item_flags |= NODROP
+ ADD_TRAIT(I, TRAIT_NODROP, CAPTURE_THE_FLAG_TRAIT)
/datum/outfit/ctf/instagib
r_hand = /obj/item/gun/energy/laser/instakill
diff --git a/code/modules/clothing/chameleon.dm b/code/modules/clothing/chameleon.dm
index 7e7da2839e..04a8e17b7b 100644
--- a/code/modules/clothing/chameleon.dm
+++ b/code/modules/clothing/chameleon.dm
@@ -60,7 +60,7 @@
to_chat(owner, "You shouldn't be able to toggle a camogear helmetmask if you're not wearing it")
if(new_headgear)
// Force drop the item in the headslot, even though
- // it's NODROP_1
+ // it's TRAIT_NODROP
D.dropItemToGround(target, TRUE)
qdel(old_headgear)
// where is `SLOT_HEAD` defined? WHO KNOWS
@@ -418,12 +418,12 @@
/obj/item/clothing/head/chameleon/drone
// The camohat, I mean, holographic hat projection, is part of the
// drone itself.
- item_flags = NODROP
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
// which means it offers no protection, it's just air and light
/obj/item/clothing/head/chameleon/drone/Initialize()
. = ..()
+ ADD_TRAIT(src, TRAIT_NODROP, ABSTRACT_ITEM_TRAIT)
chameleon_action.random_look()
var/datum/action/item_action/chameleon/drone/togglehatmask/togglehatmask_action = new(src)
togglehatmask_action.UpdateButtonIcon()
@@ -472,13 +472,13 @@
/obj/item/clothing/mask/chameleon/drone
//Same as the drone chameleon hat, undroppable and no protection
- item_flags = NODROP
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
// Can drones use the voice changer part? Let's not find out.
vchange = 0
/obj/item/clothing/mask/chameleon/drone/Initialize()
. = ..()
+ ADD_TRAIT(src, TRAIT_NODROP, ABSTRACT_ITEM_TRAIT)
chameleon_action.random_look()
var/datum/action/item_action/chameleon/drone/togglehatmask/togglehatmask_action = new(src)
togglehatmask_action.UpdateButtonIcon()
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index 767b700051..ed3e9f9b89 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -43,6 +43,8 @@
/obj/item/clothing/Initialize()
. = ..()
+ if(CHECK_BITFIELD(clothing_flags, VOICEBOX_TOGGLABLE))
+ actions_types += /datum/action/item_action/toggle_voice_box
if(ispath(pocket_storage_component_path))
LoadComponent(pocket_storage_component_path)
@@ -135,7 +137,7 @@
update_clothes_damaged_state(TRUE)
if(ismob(loc)) //It's not important enough to warrant a message if nobody's wearing it
var/mob/M = loc
- M.visible_message("[M]'s [name] starts to fall apart!", "Your [name] starts to fall apart!")
+ to_chat(M, "Your [name] starts to fall apart!")
/obj/item/clothing/proc/update_clothes_damaged_state(damaging = TRUE)
var/index = "[REF(initial(icon))]-[initial(icon_state)]"
diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm
index 6e25db1fa6..097b10cae5 100644
--- a/code/modules/clothing/glasses/_glasses.dm
+++ b/code/modules/clothing/glasses/_glasses.dm
@@ -378,10 +378,13 @@
vision_flags = SEE_TURFS|SEE_MOBS|SEE_OBJS
darkness_view = 8
scan_reagents = TRUE
- item_flags = NODROP
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
resistance_flags = LAVA_PROOF | FIRE_PROOF
+/obj/item/clothing/glasses/godeye/Initialize()
+ . = ..()
+ ADD_TRAIT(src, TRAIT_NODROP, EYE_OF_GOD_TRAIT)
+
/obj/item/clothing/glasses/godeye/attackby(obj/item/W as obj, mob/user as mob, params)
if(istype(W, src) && W != src && W.loc == user)
if(W.icon_state == "godeye")
diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm
index 429401a626..23e1825c3d 100644
--- a/code/modules/clothing/head/jobs.dm
+++ b/code/modules/clothing/head/jobs.dm
@@ -121,9 +121,12 @@
/obj/item/clothing/head/beret/highlander
desc = "That was white fabric. Was."
- item_flags = NODROP
dog_fashion = null //THIS IS FOR SLAUGHTER, NOT PUPPIES
+/obj/item/clothing/head/beret/highlander/Initialize()
+ . = ..()
+ ADD_TRAIT(src, TRAIT_NODROP, HIGHLANDER)
+
//Security
/obj/item/clothing/head/HoS
diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm
index 277ce2a8ad..73fde5d50f 100644
--- a/code/modules/clothing/head/misc.dm
+++ b/code/modules/clothing/head/misc.dm
@@ -221,9 +221,12 @@
icon_state = "shamebrero"
item_state = "shamebrero"
desc = "Once it's on, it never comes off."
- item_flags = NODROP
dog_fashion = null
+/obj/item/clothing/head/sombrero/shamebrero/Initialize()
+ . = ..()
+ ADD_TRAIT(src, TRAIT_NODROP, SHAMEBRERO_TRAIT)
+
/obj/item/clothing/head/cone
desc = "This cone is trying to warn you of something!"
name = "warning cone"
diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm
index 1716992e45..5dfa7d6047 100644
--- a/code/modules/clothing/masks/miscellaneous.dm
+++ b/code/modules/clothing/masks/miscellaneous.dm
@@ -75,7 +75,7 @@
/obj/item/clothing/mask/pig
name = "pig mask"
- desc = "A rubber pig mask."
+ desc = "A rubber pig mask with a builtin voice modulator."
icon_state = "pig"
item_state = "pig"
flags_inv = HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
@@ -92,7 +92,11 @@
desc = "It looks like a mask, but closer inspection reveals it's melded onto this persons face!" //It's only ever going to be attached to your face.
flags_inv = HIDEFACIALHAIR
clothing_flags = NONE
- item_flags = NODROP
+
+/obj/item/clothing/mask/pig/cursed/Initialize()
+ . = ..()
+ ADD_TRAIT(src, TRAIT_NODROP, CURSED_MASK_TRAIT)
+ playsound(get_turf(src), 'sound/magic/pighead_curse.ogg', 50, 1)
///frog mask - reeee!!
/obj/item/clothing/mask/frog
@@ -114,16 +118,19 @@
/obj/item/clothing/mask/frog/cursed
clothing_flags = NONE
- item_flags = NODROP //reee!!
+
+/obj/item/clothing/mask/frog/cursed/Initialize()
+ . = ..()
+ ADD_TRAIT(src, TRAIT_NODROP, CURSED_MASK_TRAIT)
/obj/item/clothing/mask/frog/cursed/equipped(mob/user, slot)
var/mob/living/carbon/C = user
- if(C.wear_mask == src)
- to_chat(user, "[src] was cursed! Ree!!")
+ if(C.wear_mask == src && HAS_TRAIT_FROM(src, TRAIT_NODROP, CURSED_ITEM_TRAIT))
+ to_chat(user, "[src] was cursed! Ree!!")
return ..()
/obj/item/clothing/mask/cowmask
- name = "Cow mask"
+ name = "Cow mask with a builtin voice modulator."
desc = "A rubber cow mask,"
icon = 'icons/mob/mask.dmi'
icon_state = "cowmask"
@@ -137,12 +144,17 @@
if(!CHECK_BITFIELD(clothing_flags, VOICEBOX_DISABLED))
speech_args[SPEECH_MESSAGE] = pick("Moooooooo!","Moo!","Moooo!")
+
/obj/item/clothing/mask/cowmask/cursed
name = "cow face"
desc = "It looks like a cow mask, but closer inspection reveals it's melded onto this persons face!"
flags_inv = HIDEFACIALHAIR
clothing_flags = NONE
- item_flags = NODROP
+
+/obj/item/clothing/mask/cowmask/cursed/Initialize()
+ . = ..()
+ ADD_TRAIT(src, TRAIT_NODROP, CURSED_MASK_TRAIT)
+ playsound(get_turf(src), 'sound/magic/cowhead_curse.ogg', 50, 1)
/obj/item/clothing/mask/horsehead
name = "horse head mask"
@@ -157,12 +169,17 @@
if(!CHECK_BITFIELD(clothing_flags, VOICEBOX_DISABLED))
speech_args[SPEECH_MESSAGE] = pick("NEEIIGGGHHHH!", "NEEEIIIIGHH!", "NEIIIGGHH!", "HAAWWWWW!", "HAAAWWW!")
+
/obj/item/clothing/mask/horsehead/cursed
name = "horse face"
desc = "It initially looks like a mask, but it's melded into the poor person's face."
clothing_flags = NONE
flags_inv = HIDEFACIALHAIR
- item_flags = NODROP
+
+/obj/item/clothing/mask/horsehead/cursed/Initialize()
+ . = ..()
+ ADD_TRAIT(src, TRAIT_NODROP, CURSED_MASK_TRAIT)
+ playsound(get_turf(src), 'sound/magic/horsehead_curse.ogg', 50, 1)
/obj/item/clothing/mask/rat
name = "rat mask"
diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm
index d314a4c48e..e6554f6125 100644
--- a/code/modules/clothing/shoes/miscellaneous.dm
+++ b/code/modules/clothing/shoes/miscellaneous.dm
@@ -157,7 +157,11 @@
icon_state = "cultalt"
/obj/item/clothing/shoes/cult/alt/ghost
- item_flags = NODROP | DROPDEL
+ item_flags = DROPDEL
+
+/obj/item/clothing/shoes/cult/alt/ghost/Initialize()
+ . = ..()
+ ADD_TRAIT(src, TRAIT_NODROP, CULT_TRAIT)
/obj/item/clothing/shoes/cyborg
name = "cyborg boots"
diff --git a/code/modules/clothing/spacesuits/chronosuit.dm b/code/modules/clothing/spacesuits/chronosuit.dm
index d0820304fe..5a53e2776a 100644
--- a/code/modules/clothing/spacesuits/chronosuit.dm
+++ b/code/modules/clothing/spacesuits/chronosuit.dm
@@ -27,7 +27,6 @@
armor = list("melee" = 60, "bullet" = 60, "laser" = 60, "energy" = 60, "bomb" = 30, "bio" = 90, "rad" = 90, "fire" = 100, "acid" = 1000)
resistance_flags = FIRE_PROOF | ACID_PROOF
var/list/chronosafe_items = list(/obj/item/chrono_eraser, /obj/item/gun/energy/chrono_gun)
- var/list/hands_nodrop = list()
var/obj/item/clothing/head/helmet/space/chronos/helmet = null
var/obj/effect/chronos_cam/camera = null
var/datum/action/innate/chrono_teleport/teleport_now = new
@@ -97,8 +96,7 @@
user.anchored = FALSE
teleporting = 0
for(var/obj/item/I in user.held_items)
- if(I in hands_nodrop)
- I.item_flags &= ~NODROP
+ REMOVE_TRAIT(I, TRAIT_NODROP, CHRONOSUIT_TRAIT)
if(camera)
camera.remove_target_ui()
camera.forceMove(user)
@@ -131,11 +129,8 @@
user.ExtinguishMob()
- hands_nodrop = list()
for(var/obj/item/I in user.held_items)
- if(!(I.item_flags & NODROP))
- hands_nodrop += I
- I.item_flags |= NODROP
+ ADD_TRAIT(I, TRAIT_NODROP, CHRONOSUIT_TRAIT)
user.animate_movement = NO_STEPS
user.changeNext_move(8 + phase_in_ds)
user.notransform = 1
@@ -194,9 +189,9 @@
if(user.head && istype(user.head, /obj/item/clothing/head/helmet/space/chronos))
to_chat(user, "\[ ok \] Mounting /dev/helm")
helmet = user.head
- helmet.item_flags |= NODROP
+ ADD_TRAIT(helmet, TRAIT_NODROP, CHRONOSUIT_TRAIT)
helmet.suit = src
- src.item_flags |= NODROP
+ ADD_TRAIT(src, TRAIT_NODROP, CHRONOSUIT_TRAIT)
to_chat(user, "\[ ok \] Starting brainwave scanner")
to_chat(user, "\[ ok \] Starting ui display driver")
to_chat(user, "\[ ok \] Initializing chronowalk4-view")
@@ -215,7 +210,7 @@
activating = 1
var/mob/living/carbon/human/user = src.loc
var/hard_landing = teleporting && force
- item_flags &= ~NODROP
+ REMOVE_TRAIT(src, TRAIT_NODROP, CHRONOSUIT_TRAIT)
cooldown = world.time + cooldowntime * 1.5
activated = 0
activating = 0
@@ -236,7 +231,7 @@
to_chat(user, "\[ ok \] Unmounting /dev/helmet")
to_chat(user, "logout")
if(helmet)
- helmet.item_flags &= ~NODROP
+ REMOVE_TRAIT(helmet, TRAIT_NODROP, CHRONOSUIT_TRAIT)
helmet.suit = null
helmet = null
if(camera)
diff --git a/code/modules/clothing/spacesuits/flightsuit.dm b/code/modules/clothing/spacesuits/flightsuit.dm
index 176bc81665..b105b72234 100644
--- a/code/modules/clothing/spacesuits/flightsuit.dm
+++ b/code/modules/clothing/spacesuits/flightsuit.dm
@@ -897,7 +897,7 @@
usermessage("You're already wearing something on your back!", "boldwarning")
return FALSE
user.equip_to_slot_if_possible(pack,SLOT_BACK,0,0,1)
- pack.item_flags |= NODROP
+ ADD_TRAIT(pack, TRAIT_NODROP, FLIGHTSUIT_TRAIT)
resync()
user.visible_message("A [pack.name] extends from [user]'s [name] and clamps to [user.p_their()] back!")
user.update_inv_wear_suit()
@@ -911,7 +911,7 @@
return FALSE
if(pack.flight && forced)
pack.disable_flight(1)
- pack.item_flags &= ~NODROP
+ REMOVE_TRAIT_FROM(pack, TRAIT_NODROP, FLIGHTSUIT_TRAIT)
resync()
if(user)
user.transferItemToLoc(pack, src, TRUE)
@@ -935,14 +935,14 @@
usermessage("You're already wearing something on your feet!", "boldwarning")
return FALSE
user.equip_to_slot_if_possible(shoes,SLOT_SHOES,0,0,1)
- shoes.item_flags |= NODROP
+ ADD_TRAIT(shoes, TRAIT_NODROP, FLIGHTSUIT_TRAIT)
user.visible_message("[user]'s [name] extends a pair of [shoes.name] over [user.p_their()] feet!")
user.update_inv_wear_suit()
playsound(src.loc, 'sound/mecha/mechmove03.ogg', 50, 1)
deployedshoes = TRUE
/obj/item/clothing/suit/space/hardsuit/flightsuit/proc/retract_flightshoes(forced = FALSE)
- shoes.item_flags &= ~NODROP
+ REMOVE_TRAIT_FROM(shoes, TRAIT_NODROP, FLIGHTSUIT_TRAIT)
playsound(src, 'sound/mecha/mechmove03.ogg', 50, 1)
if(user)
user.transferItemToLoc(shoes, src, TRUE)
diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm
index 22eac9f5aa..85503c720a 100644
--- a/code/modules/clothing/spacesuits/hardsuit.dm
+++ b/code/modules/clothing/spacesuits/hardsuit.dm
@@ -766,12 +766,15 @@
icon_state = "ert_medical"
item_state = "ert_medical"
item_color = "ert_medical"
- item_flags = NODROP //Dont want people changing into the other teams gear
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/shielded/ctf
armor = list("melee" = 0, "bullet" = 30, "laser" = 30, "energy" = 30, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 95, "acid" = 95)
slowdown = 0
max_charges = 5
+/obj/item/clothing/suit/space/hardsuit/shielded/ctf/Initialize()
+ . = ..()
+ ADD_TRAIT(src, TRAIT_NODROP, CAPTURE_THE_FLAG_TRAIT)
+
/obj/item/clothing/suit/space/hardsuit/shielded/ctf/red
name = "red shielded hardsuit"
icon_state = "ert_security"
diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm
index 6d7c1036be..5d718a8173 100644
--- a/code/modules/clothing/spacesuits/miscellaneous.dm
+++ b/code/modules/clothing/spacesuits/miscellaneous.dm
@@ -171,10 +171,13 @@ Contains:
item_color = "ert_commander"
armor = list("melee" = 65, "bullet" = 50, "laser" = 50, "energy" = 50, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 80)
strip_delay = 130
- item_flags = NODROP
brightness_on = 7
resistance_flags = ACID_PROOF
+/obj/item/clothing/head/helmet/space/hardsuit/ert/Initialize()
+ . = ..()
+ ADD_TRAIT(src, TRAIT_NODROP, LOCKED_HELMET_TRAIT)
+
/obj/item/clothing/suit/space/hardsuit/ert
name = "emergency response team suit"
desc = "Standard issue command suit for the ERT."
@@ -237,8 +240,6 @@ Contains:
item_state = "hardsuit0-ert_commander-alert"
item_color = "ert_commander-alert"
armor = list("melee" = 70, "bullet" = 55, "laser" = 50, "energy" = 50, "bomb" = 65, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100)
- strip_delay = 130
- item_flags = NODROP
brightness_on = 8
resistance_flags = FIRE_PROOF | ACID_PROOF
@@ -248,11 +249,8 @@ Contains:
icon_state = "ert_command-alert"
item_state = "ert_command-alert"
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert/alert
- allowed = list(/obj/item/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/restraints/handcuffs, /obj/item/tank/internals)
armor = list("melee" = 70, "bullet" = 55, "laser" = 50, "energy" = 50, "bomb" = 65, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100)
- strip_delay = 130
resistance_flags = FIRE_PROOF | ACID_PROOF
- tauric = TRUE //Citadel Add for tauric hardsuits
//ERT Security
/obj/item/clothing/head/helmet/space/hardsuit/ert/alert/sec
@@ -342,9 +340,13 @@ Contains:
armor = list("melee" = -20, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 75, "fire" = 60, "acid" = 75) //As whimpy as a space carp
brightness_on = 0 //luminosity when on
actions_types = list()
- item_flags = NODROP
mutantrace_variation = NO_MUTANTRACE_VARIATION
+/obj/item/clothing/head/helmet/space/hardsuit/carp/Initialize()
+ . = ..()
+ ADD_TRAIT(src, TRAIT_NODROP, LOCKED_HELMET_TRAIT)
+
+
/obj/item/clothing/suit/space/hardsuit/carp
name = "carp space suit"
desc = "A slimming piece of dubious space carp technology, you suspect it won't stand up to hand-to-hand blows."
diff --git a/code/modules/clothing/suits/cloaks.dm b/code/modules/clothing/suits/cloaks.dm
index 173d50ba64..c3276213e1 100644
--- a/code/modules/clothing/suits/cloaks.dm
+++ b/code/modules/clothing/suits/cloaks.dm
@@ -15,7 +15,6 @@
icon_state = "golhood"
desc = "A hood for a cloak."
body_parts_covered = HEAD
- item_flags = NODROP
flags_inv = HIDEHAIR|HIDEEARS
/obj/item/clothing/neck/cloak/suicide_act(mob/user)
diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm
index 9d039e0cb6..dc1b2b6dc3 100644
--- a/code/modules/clothing/suits/miscellaneous.dm
+++ b/code/modules/clothing/suits/miscellaneous.dm
@@ -237,7 +237,10 @@
desc = "Forced to live on your shameful acting as a fake Mexican, you and your poncho have grown inseparable. Literally."
icon_state = "ponchoshame"
item_state = "ponchoshame"
- item_flags = NODROP
+
+/obj/item/clothing/suit/poncho/ponchoshame/Initialize()
+ . = ..()
+ ADD_TRAIT(src, TRAIT_NODROP, SHAMEBRERO_TRAIT)
/obj/item/clothing/suit/whitedress
name = "white dress"
diff --git a/code/modules/clothing/under/color.dm b/code/modules/clothing/under/color.dm
index 324c16fec7..c239f48b05 100644
--- a/code/modules/clothing/under/color.dm
+++ b/code/modules/clothing/under/color.dm
@@ -22,7 +22,11 @@
resistance_flags = NONE
/obj/item/clothing/under/color/black/ghost
- item_flags = NODROP | DROPDEL
+ item_flags = DROPDEL
+
+/obj/item/clothing/under/color/black/ghost/Initialize()
+ . = ..()
+ ADD_TRAIT(src, TRAIT_NODROP, CULT_TRAIT)
/obj/item/clothing/under/color/grey
name = "grey jumpsuit"
diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm
index 91fde0dbd0..16848e393a 100644
--- a/code/modules/clothing/under/miscellaneous.dm
+++ b/code/modules/clothing/under/miscellaneous.dm
@@ -388,7 +388,10 @@
/obj/item/clothing/under/kilt/highlander
desc = "You're the only one worthy of this kilt."
- item_flags = NODROP
+
+/obj/item/clothing/under/kilt/highlander/Initialize()
+ . = ..()
+ ADD_TRAIT(src, TRAIT_NODROP, HIGHLANDER)
/obj/item/clothing/under/sexymime
name = "sexy mime outfit"
diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm
index a76be1ff45..ca51fec347 100644
--- a/code/modules/crafting/recipes.dm
+++ b/code/modules/crafting/recipes.dm
@@ -791,6 +791,56 @@
time = 40
category = CAT_MISC
+/datum/crafting_recipe/bronze_driver
+ name = "Bronze Plated Screwdriver"
+ result = /obj/item/screwdriver/bronze
+ reqs = list(/obj/item/screwdriver = 1,
+ /obj/item/stack/cable_coil = 10,
+ /obj/item/stack/tile/bronze = 1,
+ /datum/reagent/water = 15)
+ time = 40
+ category = CAT_MISC
+
+/datum/crafting_recipe/bronze_welder
+ name = "Bronze Plated Welding Tool"
+ result = /obj/item/weldingtool/bronze
+ reqs = list(/obj/item/weldingtool = 1,
+ /obj/item/stack/cable_coil = 10,
+ /obj/item/stack/tile/bronze = 1,
+ /datum/reagent/water = 15)
+ time = 40
+ category = CAT_MISC
+
+/datum/crafting_recipe/bronze_wirecutters
+ name = "Bronze Plated Wirecutters"
+ result = /obj/item/wirecutters/bronze
+ reqs = list(/obj/item/wirecutters = 1,
+ /obj/item/stack/cable_coil = 10,
+ /obj/item/stack/tile/bronze = 1,
+ /datum/reagent/water = 15)
+ time = 40
+ category = CAT_MISC
+
+/datum/crafting_recipe/bronze_crowbar
+ name = "Bronze Plated Crowbar"
+ result = /obj/item/crowbar/bronze
+ reqs = list(/obj/item/crowbar = 1,
+ /obj/item/stack/cable_coil = 10,
+ /obj/item/stack/tile/bronze = 1,
+ /datum/reagent/water = 15)
+ time = 40
+ category = CAT_MISC
+
+/datum/crafting_recipe/bronze_wrench
+ name = "Bronze Plated Wrench"
+ result = /obj/item/wrench/bronze
+ reqs = list(/obj/item/wrench = 1,
+ /obj/item/stack/cable_coil = 10,
+ /obj/item/stack/tile/bronze = 1,
+ /datum/reagent/water = 15)
+ time = 40
+ category = CAT_MISC
+
/datum/crafting_recipe/smartdart
name = "Medical smartdart"
result = /obj/item/reagent_containers/syringe/dart
diff --git a/code/modules/events/wizard/curseditems.dm b/code/modules/events/wizard/curseditems.dm
index a6e08fbd8c..41ee4246b1 100644
--- a/code/modules/events/wizard/curseditems.dm
+++ b/code/modules/events/wizard/curseditems.dm
@@ -50,7 +50,8 @@
var/obj/item/I = new J //dumb but required because of byond throwing a fit anytime new gets too close to a list
H.dropItemToGround(H.get_item_by_slot(i), TRUE)
H.equip_to_slot_or_del(I, i)
- I.item_flags |= NODROP | DROPDEL
+ ADD_TRAIT(I, TRAIT_NODROP, CURSED_ITEM_TRAIT)
+ I.item_flags |= DROPDEL
I.name = "cursed " + I.name
for(var/mob/living/carbon/human/H in GLOB.alive_mob_list)
diff --git a/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm
index 23172841e4..dd33f696c9 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm
@@ -94,7 +94,7 @@ God bless America.
else if(default_deconstruction_screwdriver(user, "fryer_off", "fryer_off" ,I)) //where's the open maint panel icon?!
return
else
- if(is_type_in_typecache(I, deepfry_blacklisted_items) || (I.item_flags & (ABSTRACT | NODROP | DROPDEL)))
+ if(is_type_in_typecache(I, deepfry_blacklisted_items) || HAS_TRAIT(I, TRAIT_NODROP) || (I.item_flags & (ABSTRACT | DROPDEL)))
return ..()
else if(!frying && user.transferItemToLoc(I, src))
to_chat(user, "You put [I] into [src].")
diff --git a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm
index d8d4e843dc..e02c3c1334 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm
@@ -78,7 +78,7 @@
if(!ignore_clothing)
for(var/obj/item/I in C.held_items + C.get_equipped_items())
- if(!(I.item_flags & NODROP))
+ if(!HAS_TRAIT(I, TRAIT_NODROP))
to_chat(user, "Subject may not have abiotic items on.")
return
diff --git a/code/modules/jobs/job_types/civilian.dm b/code/modules/jobs/job_types/civilian.dm
index 46e3d66f55..f21ff69e8e 100644
--- a/code/modules/jobs/job_types/civilian.dm
+++ b/code/modules/jobs/job_types/civilian.dm
@@ -61,6 +61,7 @@ Clown
return
H.dna.add_mutation(CLOWNMUT)
+ H.dna.add_mutation(SMILE)
/*
Mime
diff --git a/code/modules/mining/equipment/mining_tools.dm b/code/modules/mining/equipment/mining_tools.dm
index 0d6c337444..e02f38b7e3 100644
--- a/code/modules/mining/equipment/mining_tools.dm
+++ b/code/modules/mining/equipment/mining_tools.dm
@@ -65,9 +65,12 @@
/obj/item/pickaxe/drill/cyborg
name = "cyborg mining drill"
desc = "An integrated electric mining drill."
- item_flags = NODROP
flags_1 = NONE
+/obj/item/pickaxe/drill/cyborg/Initialize()
+ . = ..()
+ ADD_TRAIT(src, TRAIT_NODROP, CYBORG_ITEM_TRAIT)
+
/obj/item/pickaxe/drill/diamonddrill
name = "diamond-tipped mining drill"
icon_state = "diamonddrill"
diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm
index eaac1984e3..abcb6d5911 100644
--- a/code/modules/mining/lavaland/necropolis_chests.dm
+++ b/code/modules/mining/lavaland/necropolis_chests.dm
@@ -143,7 +143,7 @@
//Rod of Asclepius
/obj/item/rod_of_asclepius
- name = "Rod of Asclepius"
+ name = "\improper Rod of Asclepius"
desc = "A wooden rod about the size of your forearm with a snake carved around it, winding it's way up the sides of the rod. Something about it seems to inspire in you the responsibilty and duty to help others."
icon = 'icons/obj/lavaland/artefacts.dmi'
icon_state = "asclepius_dormant"
@@ -189,7 +189,8 @@
activated()
/obj/item/rod_of_asclepius/proc/activated()
- item_flags = NODROP | DROPDEL
+ item_flags = DROPDEL
+ ADD_TRAIT(src, TRAIT_NODROP, CURSED_ITEM_TRAIT)
desc = "A short wooden rod with a mystical snake inseparably gripping itself and the rod to your forearm. It flows with a healing energy that disperses amongst yourself and those around you. "
icon_state = "asclepius_active"
activated = TRUE
diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm
index c2518bfc9b..9569d4826c 100644
--- a/code/modules/mob/inventory.dm
+++ b/code/modules/mob/inventory.dm
@@ -275,7 +275,7 @@
/mob/proc/canUnEquip(obj/item/I, force)
if(!I)
return TRUE
- if((I.item_flags & NODROP) && !force)
+ if(HAS_TRAIT(I, TRAIT_NODROP) && !force)
return FALSE
return TRUE
@@ -309,13 +309,13 @@
//DO NOT CALL THIS PROC
//use one of the above 3 helper procs
//you may override it, but do not modify the args
-/mob/proc/doUnEquip(obj/item/I, force, newloc, no_move, invdrop = TRUE) //Force overrides NODROP_1 for things like wizarditis and admin undress.
+/mob/proc/doUnEquip(obj/item/I, force, newloc, no_move, invdrop = TRUE) //Force overrides TRAIT_NODROP for things like wizarditis and admin undress.
//Use no_move if the item is just gonna be immediately moved afterward
//Invdrop is used to prevent stuff in pockets dropping. only set to false if it's going to immediately be replaced
- if(!I) //If there's nothing to drop, the drop is automatically succesfull. If(unEquip) should generally be used to check for NODROP_1.
+ if(!I) //If there's nothing to drop, the drop is automatically succesfull. If(unEquip) should generally be used to check for TRAIT_NODROP.
return TRUE
- if((I.item_flags & NODROP) && !force)
+ if(HAS_TRAIT(I, TRAIT_NODROP) && !force)
return FALSE
var/hand_index = get_held_index_of_item(I)
diff --git a/code/modules/mob/living/bloodcrawl.dm b/code/modules/mob/living/bloodcrawl.dm
index 2a5fdeaa33..cc11c0e8bb 100644
--- a/code/modules/mob/living/bloodcrawl.dm
+++ b/code/modules/mob/living/bloodcrawl.dm
@@ -138,7 +138,11 @@
name = "blood crawl"
desc = "You are unable to hold anything while in this form."
icon = 'icons/effects/blood.dmi'
- item_flags = NODROP | ABSTRACT
+ item_flags = ABSTRACT
+
+/obj/item/bloodcrawl/Initialize()
+ . = ..()
+ ADD_TRAIT(src, TRAIT_NODROP, ABSTRACT_ITEM_TRAIT)
/mob/living/proc/exit_blood_effect(obj/effect/decal/cleanable/B)
playsound(get_turf(src), 'sound/magic/exit_blood.ogg', 100, 1, -1)
diff --git a/code/modules/mob/living/carbon/alien/humanoid/queen.dm b/code/modules/mob/living/carbon/alien/humanoid/queen.dm
index 79eed6b82b..76ede9276c 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/queen.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/queen.dm
@@ -103,9 +103,13 @@
name = "\improper royal parasite"
desc = "Inject this into one of your grown children to promote her to a Praetorian!"
icon_state = "alien_medal"
- item_flags = ABSTRACT | NODROP | DROPDEL
+ item_flags = ABSTRACT | DROPDEL
icon = 'icons/mob/alien.dmi'
+/obj/item/queenpromote/Initialize()
+ . = ..()
+ ADD_TRAIT(src, TRAIT_NODROP, ABSTRACT_ITEM_TRAIT)
+
/obj/item/queenpromote/attack(mob/living/M, mob/living/carbon/alien/humanoid/user)
if(!isalienadult(M) || isalienroyal(M))
to_chat(user, "You may only use this with your adult, non-royal children!")
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 634092e864..9b494c3daf 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -176,7 +176,7 @@
if(start_T && end_T)
log_combat(src, throwable_mob, "thrown", addition="grab from tile in [AREACOORD(start_T)] towards tile at [AREACOORD(end_T)]")
- else if(!(I.item_flags & (NODROP | ABSTRACT)))
+ else if(!CHECK_BITFIELD(I.item_flags, ABSTRACT) && !HAS_TRAIT(I, TRAIT_NODROP))
thrown_thing = I
dropItemToGround(I)
@@ -410,7 +410,7 @@
return initial(pixel_y)
/mob/living/carbon/proc/accident(obj/item/I)
- if(!I || (I.item_flags & (NODROP | ABSTRACT)))
+ if(!I || (I.item_flags & ABSTRACT) || HAS_TRAIT(I, TRAIT_NODROP))
return
//dropItemToGround(I) CIT CHANGE - makes it so the item doesn't drop if the modifier rolls above 100
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index a4fca9dd78..57dd1af749 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -252,7 +252,7 @@
var/delay_denominator = 1
if(pocket_item && !(pocket_item.item_flags & ABSTRACT))
- if(pocket_item.item_flags & NODROP)
+ if(HAS_TRAIT(pocket_item, TRAIT_NODROP))
to_chat(usr, "You try to empty [src]'s [pocket_side] pocket, it seems to be stuck!")
to_chat(usr, "You try to empty [src]'s [pocket_side] pocket.")
else if(place_item && place_item.mob_can_equip(src, usr, pocket_id, 1) && !(place_item.item_flags & ABSTRACT))
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index 1b61ddc53b..76d8a10474 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -279,7 +279,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
if(mutanthands)
// Drop items in hands
- // If you're lucky enough to have a NODROP_1 item, then it stays.
+ // If you're lucky enough to have a TRAIT_NODROP item, then it stays.
for(var/V in C.held_items)
var/obj/item/I = V
if(istype(I))
@@ -1072,7 +1072,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
return FALSE
return equip_delay_self_check(I, H, bypass_equip_delay_self)
if(SLOT_L_STORE)
- if(I.item_flags & NODROP) //Pockets aren't visible, so you can't move NODROP_1 items into them.
+ if(HAS_TRAIT(I, TRAIT_NODROP)) //Pockets aren't visible, so you can't move TRAIT_NODROP items into them.
return FALSE
if(H.l_store)
return FALSE
@@ -1088,7 +1088,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
if( I.w_class <= WEIGHT_CLASS_SMALL || (I.slot_flags & ITEM_SLOT_POCKET) )
return TRUE
if(SLOT_R_STORE)
- if(I.item_flags & NODROP)
+ if(HAS_TRAIT(I, TRAIT_NODROP))
return FALSE
if(H.r_store)
return FALSE
@@ -1105,7 +1105,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
return TRUE
return FALSE
if(SLOT_S_STORE)
- if(I.item_flags & NODROP)
+ if(HAS_TRAIT(I, TRAIT_NODROP))
return FALSE
if(H.s_store)
return FALSE
diff --git a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm
index b574df7d79..11a25cea6c 100644
--- a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm
@@ -171,12 +171,13 @@
armour_penetration = 35
lefthand_file = 'icons/mob/inhands/antag/changeling_lefthand.dmi'
righthand_file = 'icons/mob/inhands/antag/changeling_righthand.dmi'
- item_flags = ABSTRACT | NODROP | DROPDEL
+ item_flags = ABSTRACT | DROPDEL
w_class = WEIGHT_CLASS_HUGE
sharpness = IS_SHARP
/obj/item/light_eater/Initialize()
. = ..()
+ ADD_TRAIT(src, TRAIT_NODROP, HAND_REPLACEMENT_TRAIT)
AddComponent(/datum/component/butchering, 80, 70)
/obj/item/light_eater/afterattack(atom/movable/AM, mob/user, proximity)
diff --git a/code/modules/mob/living/carbon/monkey/combat.dm b/code/modules/mob/living/carbon/monkey/combat.dm
index 85436178fe..25bc243f07 100644
--- a/code/modules/mob/living/carbon/monkey/combat.dm
+++ b/code/modules/mob/living/carbon/monkey/combat.dm
@@ -115,7 +115,7 @@
/mob/living/carbon/monkey/proc/handle_combat()
if(pickupTarget)
- if(restrained() || blacklistItems[pickupTarget] || (pickupTarget.item_flags & NODROP))
+ if(restrained() || blacklistItems[pickupTarget] || HAS_TRAIT(pickupTarget, TRAIT_NODROP))
pickupTarget = null
else
pickupTimer++
diff --git a/code/modules/mob/living/carbon/say.dm b/code/modules/mob/living/carbon/say.dm
index 47c9b6beb8..452c8f8b78 100644
--- a/code/modules/mob/living/carbon/say.dm
+++ b/code/modules/mob/living/carbon/say.dm
@@ -28,12 +28,7 @@
message = trauma.on_hear(message, speaker, message_language, raw_message, radio_freq)
if (src.mind.has_antag_datum(/datum/antagonist/traitor))
- for (var/codeword in GLOB.syndicate_code_phrase)
- var/regex/codeword_match = new("([codeword])", "ig")
- message = codeword_match.Replace(message, "$1")
-
- for (var/codeword in GLOB.syndicate_code_response)
- var/regex/codeword_match = new("([codeword])", "ig")
- message = codeword_match.Replace(message, "$1")
+ message = GLOB.syndicate_code_phrase_regex.Replace(message, "$1")
+ message = GLOB.syndicate_code_response_regex.Replace(message, "$1")
return message
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 532316259f..c322de21f6 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -709,7 +709,7 @@
// The src mob is trying to strip an item from someone
// Override if a certain type of mob should be behave differently when stripping items (can't, for example)
/mob/living/stripPanelUnequip(obj/item/what, mob/who, where)
- if(what.item_flags & NODROP)
+ if(HAS_TRAIT(what, TRAIT_NODROP))
to_chat(src, "You can't remove \the [what.name], it appears to be stuck!")
return
who.visible_message("[src] tries to remove [who]'s [what.name].", \
@@ -734,7 +734,7 @@
// Override if a certain mob should be behave differently when placing items (can't, for example)
/mob/living/stripPanelEquip(obj/item/what, mob/who, where)
what = src.get_active_held_item()
- if(what && (what.item_flags & NODROP))
+ if(what && HAS_TRAIT(what, TRAIT_NODROP))
to_chat(src, "You can't put \the [what.name] on [who], it's stuck to your hand!")
return
if(what)
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index 38ad3b8e5a..7b95ced63f 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -119,7 +119,7 @@
if(I.loc != src)
I.forceMove(src)
modules += I
- I.item_flags |= NODROP
+ ADD_TRAIT(I, TRAIT_NODROP, CYBORG_ITEM_TRAIT)
I.mouse_opacity = MOUSE_OPACITY_OPAQUE
if(nonstandard)
added_modules += I
diff --git a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm
index e6bf7b3f20..6d3121474c 100644
--- a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm
+++ b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm
@@ -93,7 +93,7 @@
var/obj/item/I = new default_hatmask(src)
equip_to_slot_or_del(I, SLOT_HEAD)
- access_card.item_flags |= NODROP
+ ADD_TRAIT(access_card, TRAIT_NODROP, ABSTRACT_ITEM_TRAIT)
alert_drones(DRONE_NET_CONNECT)
diff --git a/code/modules/ninja/suit/gloves.dm b/code/modules/ninja/suit/gloves.dm
index a01b354ca1..276de652bc 100644
--- a/code/modules/ninja/suit/gloves.dm
+++ b/code/modules/ninja/suit/gloves.dm
@@ -79,5 +79,5 @@
/obj/item/clothing/gloves/space_ninja/examine(mob/user)
..()
- if(item_flags & NODROP)
+ if(HAS_TRAIT_FROM(src, TRAIT_NODROP, NINJA_SUIT_TRAIT))
to_chat(user, "The energy drain mechanism is [candrain?"active":"inactive"].")
diff --git a/code/modules/ninja/suit/suit.dm b/code/modules/ninja/suit/suit.dm
index 6110f2b0c0..b98ef764c0 100644
--- a/code/modules/ninja/suit/suit.dm
+++ b/code/modules/ninja/suit/suit.dm
@@ -111,15 +111,15 @@ Contents:
to_chat(H, "ERROR: 110223 UNABLE TO LOCATE HAND GEAR\nABORTING...")
return FALSE
affecting = H
- item_flags |= NODROP //colons make me go all |=
+ ADD_TRAIT(src, TRAIT_NODROP, NINJA_SUIT_TRAIT) //colons make me go all |=
slowdown = 0
n_hood = H.head
- n_hood.item_flags |= NODROP
+ ADD_TRAIT(n_hood, TRAIT_NODROP, NINJA_SUIT_TRAIT)
n_shoes = H.shoes
- n_shoes.item_flags |= NODROP
+ ADD_TRAIT(n_shoes, TRAIT_NODROP, NINJA_SUIT_TRAIT)
n_shoes.slowdown--
n_gloves = H.gloves
- n_gloves.item_flags |= NODROP
+ ADD_TRAIT(n_gloves, TRAIT_NODROP, NINJA_SUIT_TRAIT)
return TRUE
/obj/item/clothing/suit/space/space_ninja/proc/lockIcons(mob/living/carbon/human/H)
@@ -131,18 +131,18 @@ Contents:
//This proc allows the suit to be taken off.
/obj/item/clothing/suit/space/space_ninja/proc/unlock_suit()
affecting = null
- item_flags &= ~NODROP
+ REMOVE_TRAIT(src, TRAIT_NODROP, NINJA_SUIT_TRAIT)
slowdown = 1
icon_state = "s-ninja"
if(n_hood)//Should be attached, might not be attached.
- n_hood.item_flags &= ~NODROP
+ REMOVE_TRAIT(n_hood, TRAIT_NODROP, NINJA_SUIT_TRAIT)
if(n_shoes)
- n_shoes.item_flags &= ~NODROP
+ REMOVE_TRAIT(n_shoes, TRAIT_NODROP, NINJA_SUIT_TRAIT)
n_shoes.slowdown++
if(n_gloves)
n_gloves.icon_state = "s-ninja"
n_gloves.item_state = "s-ninja"
- n_gloves.item_flags &= ~NODROP
+ REMOVE_TRAIT(n_gloves, TRAIT_NODROP, NINJA_SUIT_TRAIT)
n_gloves.candrain=0
n_gloves.draining=0
diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm
index b77ea9d13a..f82f0ee8e6 100644
--- a/code/modules/power/lighting.dm
+++ b/code/modules/power/lighting.dm
@@ -89,7 +89,7 @@
if(!cell_connectors)
to_chat(user, "This [name] can't support a power cell!")
return
- if(W.item_flags & NODROP)
+ if(HAS_TRAIT(W, TRAIT_NODROP))
to_chat(user, "[W] is stuck to your hand!")
return
user.dropItemToGround(W)
diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm
index 40f71b81d4..d805713fa6 100644
--- a/code/modules/power/singularity/emitter.dm
+++ b/code/modules/power/singularity/emitter.dm
@@ -440,10 +440,14 @@
name = "turret controls"
icon_state = "offhand"
w_class = WEIGHT_CLASS_HUGE
- item_flags = ABSTRACT | NODROP | NOBLUDGEON
+ item_flags = ABSTRACT | NOBLUDGEON
resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF
var/delay = 0
+/obj/item/turret_control/Initialize()
+ . = ..()
+ ADD_TRAIT(src, TRAIT_NODROP, ABSTRACT_ITEM_TRAIT)
+
/obj/item/turret_control/afterattack(atom/targeted_atom, mob/user, proxflag, clickparams)
. = ..()
var/obj/machinery/power/emitter/E = user.buckled
diff --git a/code/modules/reagents/chemistry/reagents/blob_reagents.dm b/code/modules/reagents/chemistry/reagents/blob_reagents.dm
index af85b6b35f..ada4cd8d8e 100644
--- a/code/modules/reagents/chemistry/reagents/blob_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/blob_reagents.dm
@@ -187,7 +187,7 @@
description = "will do toxin damage and cause targets to believe they are fully healed."
analyzerdescdamage = "Does toxin damage and injects a toxin that causes the target to believe they are fully healed."
taste_description = "heaven"
- color = "#C8A5DC"
+ color = "#5e7842"
complementary_color = "#CD7794"
message_living = ", and you feel alive"
diff --git a/code/modules/reagents/chemistry/reagents/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drink_reagents.dm
index 8b9be8948a..bfefc073f8 100644
--- a/code/modules/reagents/chemistry/reagents/drink_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/drink_reagents.dm
@@ -743,7 +743,7 @@
name = "Triple Citrus"
id = "triple_citrus"
description = "A solution."
- color = "#C8A5DC"
+ color = "#fff12b"
quality = DRINK_NICE
taste_description = "extreme bitterness"
glass_icon_state = "triplecitrus" //needs own sprite mine are trash
diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm
index d6306148d4..5719ec81b6 100644
--- a/code/modules/reagents/chemistry/reagents/food_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm
@@ -567,14 +567,14 @@
name = "Corn Starch"
id = "corn_starch"
description = "A slippery solution."
- color = "#C8A5DC"
+ color = "#f7f6e4"
taste_description = "slime"
/datum/reagent/consumable/corn_syrup
name = "Corn Syrup"
id = "corn_syrup"
description = "Decays into sugar."
- color = "#C8A5DC"
+ color = "#fff882"
metabolization_rate = 3 * REAGENTS_METABOLISM
taste_description = "sweet slime"
diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
index 6017e5107c..eb7438aa20 100644
--- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
@@ -18,8 +18,8 @@
name = "Leporazine"
id = "leporazine"
description = "Leporazine will effectively regulate a patient's body temperature, ensuring it never leaves safe levels."
- color = "#C8A5DC" // rgb: 200, 165, 220
pH = 8.4
+ color = "#82b8aa"
/datum/reagent/medicine/leporazine/on_mob_life(mob/living/carbon/M)
if(M.bodytemperature > BODYTEMP_NORMAL)
@@ -32,7 +32,7 @@
name = "Adminordrazine"
id = "adminordrazine"
description = "It's magic. We don't have to explain it."
- color = "#C8A5DC" // rgb: 200, 165, 220
+ color = "#ffffff"
can_synth = FALSE
taste_description = "badmins"
@@ -224,7 +224,7 @@
name = "Spaceacillin"
id = "spaceacillin"
description = "Spaceacillin will prevent a patient from conventionally spreading any diseases they are currently infected with."
- color = "#C8A5DC" // rgb: 200, 165, 220
+ color = "#f2f2f2"
metabolization_rate = 0.1 * REAGENTS_METABOLISM
pH = 8.1
@@ -234,8 +234,8 @@
id = "silver_sulfadiazine"
description = "If used in touch-based applications, immediately restores burn wounds as well as restoring more over time. If ingested through other means, deals minor toxin damage."
reagent_state = LIQUID
- color = "#C8A5DC"
pH = 7.2
+ color = "#ffeac9"
/datum/reagent/medicine/silver_sulfadiazine/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1)
if(iscarbon(M) && M.stat != DEAD)
@@ -988,7 +988,7 @@
id = "bicaridine"
description = "Restores bruising. Overdose causes it instead."
reagent_state = LIQUID
- color = "#C8A5DC"
+ color = "#fc2626"
overdose_threshold = 30
pH = 5
@@ -1007,7 +1007,7 @@
id = "dexalin"
description = "Restores oxygen loss. Overdose causes it instead."
reagent_state = LIQUID
- color = "#C8A5DC"
+ color = "#13d2f0"
overdose_threshold = 30
pH = 9.7
@@ -1026,7 +1026,7 @@
id = "kelotane"
description = "Restores fire damage. Overdose causes it instead."
reagent_state = LIQUID
- color = "#C8A5DC"
+ color = "#ffc400"
overdose_threshold = 30
pH = 9
@@ -1045,7 +1045,7 @@
id = "antitoxin"
description = "Heals toxin damage and removes toxins in the bloodstream. Overdose causes toxin damage."
reagent_state = LIQUID
- color = "#C8A5DC"
+ color = "#6aff00"
overdose_threshold = 30
taste_description = "a roll of gauze"
pH = 10
@@ -1067,8 +1067,8 @@
id = "inaprovaline"
description = "Stabilizes the breathing of patients. Good for those in critical condition."
reagent_state = LIQUID
- color = "#C8A5DC"
pH = 8.5
+ color = "#5dc1f0"
/datum/reagent/medicine/inaprovaline/on_mob_life(mob/living/carbon/M)
if(M.losebreath >= 5)
@@ -1080,7 +1080,7 @@
id = "tricordrazine"
description = "Has a high chance to heal all types of damage. Overdose instead causes it."
reagent_state = LIQUID
- color = "#C8A5DC"
+ color = "#e650c0"
overdose_threshold = 30
taste_description = "grossness"
@@ -1216,7 +1216,7 @@
name = "Lavaland Extract"
id = "lavaland_extract"
description = "An extract of lavaland atmospheric and mineral elements. Heals the user in small doses, but is extremely toxic otherwise."
- color = "#C8A5DC" // rgb: 200, 165, 220
+ color = "#a1a1a1"
overdose_threshold = 3 //To prevent people stacking massive amounts of a very strong healing reagent
can_synth = FALSE
pH = 14
@@ -1238,7 +1238,7 @@
name = "Changeling Adrenaline"
id = "changelingadrenaline"
description = "Reduces the duration of unconciousness, knockdown and stuns. Restores stamina, but deals toxin damage when overdosed."
- color = "#C8A5DC"
+ color = "#918e53"
overdose_threshold = 30
/datum/reagent/medicine/changelingadrenaline/on_mob_life(mob/living/carbon/M as mob)
@@ -1259,7 +1259,7 @@
name = "Changeling Haste"
id = "changelinghaste"
description = "Drastically increases movement speed, but deals toxin damage."
- color = "#C8A5DC"
+ color = "#669153"
metabolization_rate = 1
/datum/reagent/medicine/changelinghaste/on_mob_metabolize(mob/living/L)
diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm
index c7b85efe81..22e230e671 100644
--- a/code/modules/reagents/chemistry/reagents/other_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm
@@ -927,7 +927,7 @@
name = "Sterilizine"
id = "sterilizine"
description = "Sterilizes wounds in preparation for surgery."
- color = "#C8A5DC" // rgb: 200, 165, 220
+ color = "#e6f1f5" // rgb: 200, 165, 220
taste_description = "bitterness"
pH = 10.5
@@ -947,7 +947,7 @@
taste_description = "iron"
pH = 6
- color = "#C8A5DC" // rgb: 200, 165, 220
+ color = "#c2391d"
/datum/reagent/iron/on_mob_life(mob/living/carbon/C)
if(C.blood_volume < (BLOOD_VOLUME_NORMAL*C.blood_ratio))
@@ -1149,7 +1149,7 @@
name = "Cryptobiolin"
id = "cryptobiolin"
description = "Cryptobiolin causes confusion and dizziness."
- color = "#C8A5DC" // rgb: 200, 165, 220
+ color = "#7529b3" // rgb: 200, 165, 220
metabolization_rate = 1.5 * REAGENTS_METABOLISM
taste_description = "sourness"
pH = 11.9
@@ -1165,7 +1165,7 @@
name = "Impedrezene"
id = "impedrezene"
description = "Impedrezene is a narcotic that impedes one's ability by slowing down the higher brain cell functions."
- color = "#C8A5DC" // rgb: 200, 165, 220A
+ color = "#587a31" // rgb: 200, 165, 220A
taste_description = "numbness"
pH = 9.1
@@ -1504,7 +1504,7 @@
id = "oil"
description = "Burns in a small smoky fire, mostly used to get Ash."
reagent_state = LIQUID
- color = "#C8A5DC"
+ color = "#292929"
taste_description = "oil"
/datum/reagent/stable_plasma
@@ -1512,7 +1512,7 @@
id = "stable_plasma"
description = "Non-flammable plasma locked into a liquid form that cannot ignite or become gaseous/solid."
reagent_state = LIQUID
- color = "#C8A5DC"
+ color = "#6b008f"
taste_description = "bitterness"
taste_mult = 1.5
pH = 1.5
@@ -1526,7 +1526,7 @@
id = "iodine"
description = "Commonly added to table salt as a nutrient. On its own it tastes far less pleasing."
reagent_state = LIQUID
- color = "#C8A5DC"
+ color = "#694600"
taste_description = "metal"
pH = 4.5
@@ -1535,8 +1535,8 @@
id = "carpet"
description = "For those that need a more creative way to roll out a red carpet."
reagent_state = LIQUID
- color = "#C8A5DC"
- taste_description = "carpet" // Your tounge feels furry. Ick
+ color = "#b51d05"
+ taste_description = "carpet" // Your tounge feels furry.
/datum/reagent/carpet/reaction_turf(turf/T, reac_volume)
if(isplatingturf(T) || istype(T, /turf/open/floor/plasteel))
@@ -1549,7 +1549,7 @@
id = "bromine"
description = "A brownish liquid that's highly reactive. Useful for stopping free radicals, but not intended for human consumption."
reagent_state = LIQUID
- color = "#C8A5DC"
+ color = "#b37740"
taste_description = "chemicals"
pH = 7.8
@@ -1558,16 +1558,16 @@
id = "phenol"
description = "An aromatic ring of carbon with a hydroxyl group. A useful precursor to some medicines, but has no healing properties on its own."
reagent_state = LIQUID
- color = "#C8A5DC"
taste_description = "sweet and tarry" //Again, not a strong acid.
pH = 5.5
+ color = "#e6e8ff"
/datum/reagent/ash
name = "Ash"
id = "ash"
description = "Supposedly phoenixes rise from these, but you've never seen it."
reagent_state = LIQUID
- color = "#C8A5DC"
+ color = "#665c56"
taste_description = "ash"
pH = 6.5
@@ -1576,15 +1576,15 @@
id = "acetone"
description = "A slick, slightly carcinogenic liquid. Has a multitude of mundane uses in everyday life."
reagent_state = LIQUID
- color = "#C8A5DC"
taste_description = "solvent"//It's neutral though..?
+ color = "#e6e6e6"
/datum/reagent/colorful_reagent
name = "Colorful Reagent"
id = "colorful_reagent"
description = "Thoroughly sample the rainbow."
reagent_state = LIQUID
- color = "#C8A5DC"
+ color = "#FFFF00"
var/list/random_color_list = list("#00aedb","#a200ff","#f47835","#d41243","#d11141","#00b159","#00aedb","#f37735","#ffc425","#008744","#0057e7","#d62d20","#ffa700")
taste_description = "rainbows"
var/no_mob_color = FALSE
@@ -1614,7 +1614,7 @@
id = "hair_dye"
description = "Has a high chance of making you look like a mad scientist."
reagent_state = LIQUID
- color = "#C8A5DC"
+ color = "#ff00dd"
var/list/potential_colors = list("0ad","a0f","f73","d14","d14","0b5","0ad","f73","fc2","084","05e","d22","fa0") // fucking hair code
taste_description = "sourness"
@@ -1631,7 +1631,7 @@
id = "barbers_aid"
description = "A solution to hair loss across the world."
reagent_state = LIQUID
- color = "#C8A5DC"
+ color = "#fac34b"
taste_description = "sourness"
/datum/reagent/barbers_aid/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
@@ -1649,7 +1649,7 @@
id = "concentrated_barbers_aid"
description = "A concentrated solution to hair loss across the world."
reagent_state = LIQUID
- color = "#C8A5DC"
+ color = "#ffaf00"
taste_description = "sourness"
/datum/reagent/concentrated_barbers_aid/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
diff --git a/code/modules/research/designs/autolathe_desings/autolathe_designs_tools.dm b/code/modules/research/designs/autolathe_desings/autolathe_designs_tools.dm
index 435af80aea..0300658a84 100644
--- a/code/modules/research/designs/autolathe_desings/autolathe_designs_tools.dm
+++ b/code/modules/research/designs/autolathe_desings/autolathe_designs_tools.dm
@@ -147,4 +147,4 @@
build_type = AUTOLATHE
materials = list(MAT_METAL = 150, MAT_GLASS = 150)
build_path = /obj/item/geiger_counter
- category = list("initial", "Tools")
\ No newline at end of file
+ category = list("initial", "Tools")
diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm
index 2dea40d382..ac20f97dee 100644
--- a/code/modules/research/techweb/all_nodes.dm
+++ b/code/modules/research/techweb/all_nodes.dm
@@ -231,23 +231,22 @@
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
export_price = 5000
-/datum/techweb_node/adv_bluespace
- id = "adv_bluespace"
- display_name = "Advanced Bluespace Research"
- description = "Deeper understanding of how the Bluespace dimension works"
- prereq_ids = list("practical_bluespace", "high_efficiency")
- design_ids = list("bluespace_matter_bin", "femto_mani", "triphasic_scanning", "tele_station", "tele_hub", "quantumpad", "launchpad", "launchpad_console",
- "teleconsole", "bluespace_crystal", "wormholeprojector")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 15000)
- export_price = 5000
-
/datum/techweb_node/practical_bluespace
id = "practical_bluespace"
display_name = "Applied Bluespace Research"
description = "Using bluespace to make things faster and better."
prereq_ids = list("bluespace_basic", "engineering")
- design_ids = list("bs_rped","biobag_holding","minerbag_holding", "bluespacebeaker", "bluespacesyringe", "phasic_scanning", "roastingstick", "ore_silo", "bluespacesmartdart")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 7500)
+ design_ids = list("bs_rped","biobag_holding","minerbag_holding", "bluespacebeaker", "bluespacesyringe", "phasic_scanning", "bluespacesmartdart")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000)
+ export_price = 5000
+
+/datum/techweb_node/adv_bluespace
+ id = "adv_bluespace"
+ display_name = "Advanced Bluespace Research"
+ description = "Deeper understanding of how the Bluespace dimension works"
+ prereq_ids = list("practical_bluespace", "high_efficiency")
+ design_ids = list("bluespace_matter_bin", "femto_mani", "triphasic_scanning", "bluespace_crystal")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 10000)
export_price = 5000
/datum/techweb_node/bluespace_power
@@ -259,7 +258,7 @@
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
export_price = 5000
-/datum/techweb_node/bluespace_holding //Bluespace-memery
+/datum/techweb_node/bluespace_holding
id = "bluespace_holding"
display_name = "Bluespace Pockets"
description = "Studies into the mysterious alternate dimension known as bluespace and how to place items in the threads of reality."
@@ -267,6 +266,25 @@
design_ids = list( "bluespacebodybag","bag_holding", "bluespace_pod", "borg_upgrade_trashofholding", "blutrash", "satchel_holding")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5500)
export_price = 5000
+
+/datum/techweb_node/bluespace_portal
+ id = "bluespace_portal"
+ display_name = "Bluespace Portals"
+ description = "Allows for Bluespace Tech to be used tandem with Wormhole tech."
+ prereq_ids = list("adv_weaponry", "adv_bluespace")
+ design_ids = list("wormholeprojector")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
+ export_price = 5000
+
+/datum/techweb_node/bluespace_warping
+ id = "bluespace_warping"
+ display_name = "Bluespace Teleportation tech"
+ description = "Traversing through space at an instant with Bluespace."
+ prereq_ids = list("adv_power", "adv_bluespace")
+ design_ids = list( "tele_station", "tele_hub", "quantumpad", "launchpad", "launchpad_console", "teleconsole", "roastingstick")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
+ export_price = 5000
+
/////////////////////////plasma tech/////////////////////////
/datum/techweb_node/basic_plasma
id = "basic_plasma"
@@ -545,7 +563,7 @@
display_name = "Advanced Mining Technology"
description = "Efficiency Level 127" //dumb mc references
prereq_ids = list("basic_mining", "adv_engi", "adv_power", "adv_plasma")
- design_ids = list("drill_diamond", "jackhammer", "hypermod", "plasmacutter_adv")
+ design_ids = list("drill_diamond", "jackhammer", "hypermod", "plasmacutter_adv", "ore_silo")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
export_price = 5000
diff --git a/code/modules/research/xenobiology/crossbreeding/_weapons.dm b/code/modules/research/xenobiology/crossbreeding/_weapons.dm
index 1138f65105..141e6b1fe1 100644
--- a/code/modules/research/xenobiology/crossbreeding/_weapons.dm
+++ b/code/modules/research/xenobiology/crossbreeding/_weapons.dm
@@ -7,7 +7,7 @@
item_state = "bloodgun"
lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi'
- item_flags = ABSTRACT | DROPDEL | NODROP
+ item_flags = ABSTRACT | DROPDEL
w_class = WEIGHT_CLASS_HUGE
force = 5
max_charges = 1 //Recharging costs blood.
@@ -15,6 +15,10 @@
ammo_type = /obj/item/ammo_casing/magic/bloodchill
fire_sound = 'sound/effects/attackblob.ogg'
+/obj/item/gun/magic/bloodchill/Initialize()
+ . = ..()
+ ADD_TRAIT(src, TRAIT_NODROP, HAND_REPLACEMENT_TRAIT)
+
/obj/item/gun/magic/bloodchill/process()
charge_tick++
if(charge_tick < recharge_rate || charges >= max_charges)
diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm
index 85819da52a..ce36be8e42 100644
--- a/code/modules/research/xenobiology/xenobiology.dm
+++ b/code/modules/research/xenobiology/xenobiology.dm
@@ -708,7 +708,7 @@
imp.implant(SM, user)
SM.access_card = new /obj/item/card/id/syndicate(SM)
- SM.access_card.item_flags |= NODROP
+ ADD_TRAIT(SM.access_card, TRAIT_NODROP, ABSTRACT_ITEM_TRAIT)
/obj/item/slimepotion/transference
name = "consciousness transference potion"
diff --git a/code/modules/shuttle/special.dm b/code/modules/shuttle/special.dm
index fd5f2f59fd..d1435a554c 100644
--- a/code/modules/shuttle/special.dm
+++ b/code/modules/shuttle/special.dm
@@ -165,7 +165,7 @@
var/datum/job/captain/C = new /datum/job/captain
access_card.access = C.get_access()
access_card.access |= ACCESS_CENT_BAR
- access_card.item_flags |= NODROP
+ ADD_TRAIT(access_card, TRAIT_NODROP, ABSTRACT_ITEM_TRAIT)
/mob/living/simple_animal/hostile/alien/maid/barmaid/Destroy()
qdel(access_card)
diff --git a/code/modules/spells/spell_types/barnyard.dm b/code/modules/spells/spell_types/barnyard.dm
index b6a7878470..ccb0280779 100644
--- a/code/modules/spells/spell_types/barnyard.dm
+++ b/code/modules/spells/spell_types/barnyard.dm
@@ -38,18 +38,14 @@
return
var/list/masks = list(/obj/item/clothing/mask/pig/cursed, /obj/item/clothing/mask/cowmask/cursed, /obj/item/clothing/mask/horsehead/cursed)
- var/list/mSounds = list('sound/magic/pighead_curse.ogg', 'sound/magic/cowhead_curse.ogg', 'sound/magic/horsehead_curse.ogg')
- var/randM = rand(1,3)
-
- var/choice = masks[randM]
- var/obj/item/clothing/mask/magichead = new choice
+ var/choice = pick(masks)
+ var/obj/item/clothing/mask/magichead = new choice(get_turf(target))
magichead.flags_inv = null
target.visible_message("[target]'s face bursts into flames, and a barnyard animal's head takes its place!", \
"Your face burns up, and shortly after the fire you realise you have the face of a barnyard animal!")
if(!target.dropItemToGround(target.wear_mask))
qdel(target.wear_mask)
target.equip_to_slot_if_possible(magichead, SLOT_WEAR_MASK, 1, 1)
- playsound(get_turf(target), mSounds[randM], 50, 1)
target.flash_act()
diff --git a/code/modules/spells/spell_types/godhand.dm b/code/modules/spells/spell_types/godhand.dm
index 06d1fc3dc5..a5f371ffc2 100644
--- a/code/modules/spells/spell_types/godhand.dm
+++ b/code/modules/spells/spell_types/godhand.dm
@@ -7,7 +7,7 @@
icon = 'icons/obj/items_and_weapons.dmi'
icon_state = "syndballoon"
item_state = null
- item_flags = NEEDS_PERMIT | ABSTRACT | NODROP | DROPDEL
+ item_flags = NEEDS_PERMIT | ABSTRACT | DROPDEL
w_class = WEIGHT_CLASS_HUGE
force = 0
throwforce = 0
@@ -15,6 +15,10 @@
throw_speed = 0
var/charges = 1
+/obj/item/melee/touch_attack/Initialize()
+ . = ..()
+ ADD_TRAIT(src, TRAIT_NODROP, ABSTRACT_ITEM_TRAIT)
+
/obj/item/melee/touch_attack/attack(mob/target, mob/living/carbon/user)
if(!iscarbon(user)) //Look ma, no hands
return
diff --git a/code/modules/spells/spell_types/lichdom.dm b/code/modules/spells/spell_types/lichdom.dm
index d88ee7fb22..efc80101f6 100644
--- a/code/modules/spells/spell_types/lichdom.dm
+++ b/code/modules/spells/spell_types/lichdom.dm
@@ -34,7 +34,7 @@
for(var/obj/item/item in hand_items)
// I ensouled the nuke disk once. But it's probably a really
// mean tactic, so probably should discourage it.
- if((item.item_flags & ABSTRACT) || (item.item_flags & NODROP) || SEND_SIGNAL(item, COMSIG_ITEM_IMBUE_SOUL, user))
+ if((item.item_flags & ABSTRACT) || HAS_TRAIT(item, TRAIT_NODROP) || SEND_SIGNAL(item, COMSIG_ITEM_IMBUE_SOUL, user))
continue
marked_item = item
to_chat(M, "You begin to focus your very being into [item]...")
diff --git a/code/modules/spells/spell_types/summonitem.dm b/code/modules/spells/spell_types/summonitem.dm
index 2bc347b185..6d46c53a9d 100644
--- a/code/modules/spells/spell_types/summonitem.dm
+++ b/code/modules/spells/spell_types/summonitem.dm
@@ -25,7 +25,7 @@
for(var/obj/item/item in hand_items)
if(item.item_flags & ABSTRACT)
continue
- if(item.item_flags & NODROP)
+ if(HAS_TRAIT(item, TRAIT_NODROP))
message += "Though it feels redundant, "
marked_item = item
message += "You mark [item] for recall."
diff --git a/code/modules/surgery/cavity_implant.dm b/code/modules/surgery/cavity_implant.dm
index e57f8f686b..72874e0308 100644
--- a/code/modules/surgery/cavity_implant.dm
+++ b/code/modules/surgery/cavity_implant.dm
@@ -29,7 +29,7 @@
/datum/surgery_step/handle_cavity/success(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery)
var/obj/item/bodypart/chest/CH = target.get_bodypart(BODY_ZONE_CHEST)
if(tool)
- if(IC || tool.w_class > WEIGHT_CLASS_NORMAL || (tool.item_flags & NODROP) || istype(tool, /obj/item/organ))
+ if(IC || tool.w_class > WEIGHT_CLASS_NORMAL || HAS_TRAIT(tool, TRAIT_NODROP) || istype(tool, /obj/item/organ))
to_chat(user, "You can't seem to fit [tool] in [target]'s [target_zone]!")
return 0
var/obj/item/electronic_assembly/EA = tool
diff --git a/code/modules/surgery/organs/augments_arms.dm b/code/modules/surgery/organs/augments_arms.dm
index f09258f19f..cb004ce599 100644
--- a/code/modules/surgery/organs/augments_arms.dm
+++ b/code/modules/surgery/organs/augments_arms.dm
@@ -89,7 +89,7 @@
holder = item
- holder.item_flags |= NODROP
+ ADD_TRAIT(holder, TRAIT_NODROP, HAND_REPLACEMENT_TRAIT)
holder.resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
holder.slot_flags = null
holder.materials = null
diff --git a/code/modules/surgery/organs/augments_internal.dm b/code/modules/surgery/organs/augments_internal.dm
index 6d1aebc6a3..06d523721d 100644
--- a/code/modules/surgery/organs/augments_internal.dm
+++ b/code/modules/surgery/organs/augments_internal.dm
@@ -51,8 +51,7 @@
active = !active
if(active)
for(var/obj/item/I in owner.held_items)
- if(!(I.item_flags & NODROP))
- stored_items += I
+ stored_items += I
var/list/L = owner.get_empty_held_indexes()
if(LAZYLEN(L) == owner.held_items.len)
@@ -62,7 +61,7 @@
else
for(var/obj/item/I in stored_items)
to_chat(owner, "Your [owner.get_held_index_name(owner.get_held_index_of_item(I))]'s grip tightens.")
- I.item_flags |= NODROP
+ ADD_TRAIT(I, TRAIT_NODROP, ANTI_DROP_IMPLANT_TRAIT)
else
release_items()
@@ -83,10 +82,9 @@
to_chat(owner, "Your [owner.get_held_index_name(owner.get_held_index_of_item(I))] spasms and throws the [I.name]!")
stored_items = list()
-
/obj/item/organ/cyberimp/brain/anti_drop/proc/release_items()
for(var/obj/item/I in stored_items)
- I.item_flags &= ~NODROP
+ REMOVE_TRAIT(I, TRAIT_NODROP, ANTI_DROP_IMPLANT_TRAIT)
stored_items = list()
diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm
index 7fc0b1882e..2ec320f20f 100644
--- a/code/modules/uplink/uplink_items.dm
+++ b/code/modules/uplink/uplink_items.dm
@@ -411,6 +411,15 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
surplus = 20
include_modes = list(/datum/game_mode/nuclear)
+/datum/uplink_item/dangerous/rapier
+ name = "Rapier"
+ desc = "A fancy rapier with a diamond tip piercing anything that it comes into contack with. \
+ The rapier comes with its own shielf, this is rather noticeable as only the captain is known to carry a shielf. \
+ The shielf itself can be used to block melee attacks only. Its also jet black colours."
+ item = /obj/item/storage/belt/sabre/rapier
+ cost = 8
+ exclude_modes = list(/datum/game_mode/nuclear/clown_ops)
+
/datum/uplink_item/dangerous/flamethrower
name = "Flamethrower"
desc = "A flamethrower, fueled by a portion of highly flammable biotoxins stolen previously from Nanotrasen \
diff --git a/code/modules/zombie/items.dm b/code/modules/zombie/items.dm
index 8b56ccf00d..9a2455f56d 100644
--- a/code/modules/zombie/items.dm
+++ b/code/modules/zombie/items.dm
@@ -4,7 +4,7 @@
humans, butchering all other living things to \
sustain the zombie, smashing open airlock doors and opening \
child-safe caps on bottles."
- item_flags = NODROP | ABSTRACT | DROPDEL
+ item_flags = ABSTRACT | DROPDEL
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
icon = 'icons/effects/blood.dmi'
icon_state = "bloodhand_left"
@@ -14,7 +14,9 @@
force = 21 // Just enough to break airlocks with melee attacks
damtype = "brute"
- var/removing_airlock = FALSE
+/obj/item/zombie_hand/Initialize()
+ . = ..()
+ ADD_TRAIT(src, TRAIT_NODROP, HAND_REPLACEMENT_TRAIT)
/obj/item/zombie_hand/equipped(mob/user, slot)
. = ..()
diff --git a/html/browser/roundend.css b/html/browser/roundend.css
index 865b42999e..e69635e888 100644
--- a/html/browser/roundend.css
+++ b/html/browser/roundend.css
@@ -10,6 +10,10 @@
color: #ef2f3c;
font-weight: bold;
}
+.bluetext {
+ color: #517fff;
+ font-weight: bold;
+}
.neutraltext {
font-weight: bold; /* If you feel these should have some color feel free to change */
}
diff --git a/html/changelogs/AutoChangeLog-pr-7544.yml b/html/changelogs/AutoChangeLog-pr-7544.yml
new file mode 100644
index 0000000000..f70a0e0e30
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-7544.yml
@@ -0,0 +1,4 @@
+author: "deathride58"
+delete-after: True
+changes:
+ - balance: "Reduced the default/baseline nanite pool amount from 100 nanites to 25 nanites, and reduced the maximum nanite amount from 500 nanites to 125 nanites. The safety threshold was reduced from 50 nanites to 12 nanites."
diff --git a/html/changelogs/AutoChangeLog-pr-8676.yml b/html/changelogs/AutoChangeLog-pr-8676.yml
new file mode 100644
index 0000000000..e82a965985
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8676.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - rscadd: "rapier"
diff --git a/html/changelogs/AutoChangeLog-pr-8693.yml b/html/changelogs/AutoChangeLog-pr-8693.yml
new file mode 100644
index 0000000000..1e5e3fda58
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8693.yml
@@ -0,0 +1,4 @@
+author: "Ghommie (original PR by Tlaltecuhtli)"
+delete-after: True
+changes:
+ - bugfix: "Other people's clothes burning no longer spam you"
diff --git a/html/changelogs/AutoChangeLog-pr-8724.yml b/html/changelogs/AutoChangeLog-pr-8724.yml
new file mode 100644
index 0000000000..5fc86dd9c9
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8724.yml
@@ -0,0 +1,5 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - rscadd: "new nodes"
+ - balance: "points and node gear"
diff --git a/html/changelogs/AutoChangeLog-pr-8725.yml b/html/changelogs/AutoChangeLog-pr-8725.yml
new file mode 100644
index 0000000000..d42840ef0a
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8725.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - rscadd: "stuff n things"
diff --git a/html/changelogs/AutoChangeLog-pr-8785.yml b/html/changelogs/AutoChangeLog-pr-8785.yml
new file mode 100644
index 0000000000..0dd9cb0df4
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8785.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - rscadd: "Joy, Happiness, Honk"
diff --git a/html/changelogs/AutoChangeLog-pr-8796.yml b/html/changelogs/AutoChangeLog-pr-8796.yml
new file mode 100644
index 0000000000..2ffdee9b37
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8796.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - bugfix: "small mix up in terms"
diff --git a/html/changelogs/AutoChangeLog-pr-8877.yml b/html/changelogs/AutoChangeLog-pr-8877.yml
new file mode 100644
index 0000000000..205ff8f2c3
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8877.yml
@@ -0,0 +1,4 @@
+author: "BurgerLUA"
+delete-after: True
+changes:
+ - bugfix: "Fixed most reagents having a placeholder color."
diff --git a/html/changelogs/AutoChangeLog-pr-8880.yml b/html/changelogs/AutoChangeLog-pr-8880.yml
new file mode 100644
index 0000000000..e720f00ccb
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8880.yml
@@ -0,0 +1,4 @@
+author: "CameronWoof"
+delete-after: True
+changes:
+ - tweak: "air alarms are green now instead of blue when the atmosphere is ideal"
diff --git a/html/changelogs/AutoChangeLog-pr-8887.yml b/html/changelogs/AutoChangeLog-pr-8887.yml
new file mode 100644
index 0000000000..45826fe571
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8887.yml
@@ -0,0 +1,6 @@
+author: "Poojawa"
+delete-after: True
+changes:
+ - rscadd: "NT Newscasters have had repeated reports of gang activity and are now looking into it."
+ - rscadd: "NT Psykers keep mumbling about last words of someone who died. Somehow they even have a newsletter for this..."
+ - bugfix: "Gangster greeting messages are a batch message rather than 5 laggy to_chats"
diff --git a/icons/mob/belt.dmi b/icons/mob/belt.dmi
index 1ae0b0a2b5..02fdc52b45 100644
Binary files a/icons/mob/belt.dmi and b/icons/mob/belt.dmi differ
diff --git a/icons/mob/inhands/weapons/swords_lefthand.dmi b/icons/mob/inhands/weapons/swords_lefthand.dmi
index d6950f4e1e..d306e22892 100644
Binary files a/icons/mob/inhands/weapons/swords_lefthand.dmi and b/icons/mob/inhands/weapons/swords_lefthand.dmi differ
diff --git a/icons/mob/inhands/weapons/swords_righthand.dmi b/icons/mob/inhands/weapons/swords_righthand.dmi
index 9655829113..3e0c3424d3 100644
Binary files a/icons/mob/inhands/weapons/swords_righthand.dmi and b/icons/mob/inhands/weapons/swords_righthand.dmi differ
diff --git a/icons/obj/clothing/belts.dm b/icons/obj/clothing/belts.dm
new file mode 100644
index 0000000000..34c716f5d8
Binary files /dev/null and b/icons/obj/clothing/belts.dm differ
diff --git a/icons/obj/clothing/belts.dmi b/icons/obj/clothing/belts.dmi
index 3e56574fbf..34c716f5d8 100644
Binary files a/icons/obj/clothing/belts.dmi and b/icons/obj/clothing/belts.dmi differ
diff --git a/icons/obj/items_and_weapons.dmi b/icons/obj/items_and_weapons.dmi
index 655d37d4a6..0d68f00c8b 100644
Binary files a/icons/obj/items_and_weapons.dmi and b/icons/obj/items_and_weapons.dmi differ
diff --git a/icons/obj/monitors.dmi b/icons/obj/monitors.dmi
index 9880707010..e38760b84d 100644
Binary files a/icons/obj/monitors.dmi and b/icons/obj/monitors.dmi differ
diff --git a/modular_citadel/code/game/gamemodes/gangs/dominator.dm b/modular_citadel/code/game/gamemodes/gangs/dominator.dm
index 0d89c78010..5ad740ed2e 100644
--- a/modular_citadel/code/game/gamemodes/gangs/dominator.dm
+++ b/modular_citadel/code/game/gamemodes/gangs/dominator.dm
@@ -108,6 +108,7 @@
else
Cinematic(CINEMATIC_MALF,world) //Here is the gang victory trigger on the dominator ending.
gang.winner = TRUE
+ SSticker.news_report = GANG_VICTORY
SSticker.force_ending = TRUE
if(!.)
diff --git a/modular_citadel/code/game/gamemodes/gangs/gang.dm b/modular_citadel/code/game/gamemodes/gangs/gang.dm
index 00ce3f81a9..fa25701ac4 100644
--- a/modular_citadel/code/game/gamemodes/gangs/gang.dm
+++ b/modular_citadel/code/game/gamemodes/gangs/gang.dm
@@ -343,11 +343,12 @@
return "