moves abstract_type up to datum, spawners wont spawn them (#92909)

## About The Pull Request
moves all implementations (im aware of) for "Im a parent type dont spawn
me please" to the datum layer to standardized behavior
adds a standerized proc for filtering out "bad" items that we dont want
spawning. applies to it the subtype vendor, gifts, and a new spawner and
mystery box for a random gun (neither playerfacing)
"port" of https://github.com/shiptest-ss13/Shiptest/pull/4621



https://github.com/user-attachments/assets/22f6f0b2-b44e-411a-b3dc-6b97dc0287aa

small warning: I dont have EVERY abstract type defined right now but,
ive done a good enough job for now. Im tired of data entry rn
## Why It's Good For The Game
standardizing behavior. Might be a micro hit to performance however

having this lets us not rely on icon state to determine whether
something is a parent type and makes it much easier to tell something is
a parent type (could be applied further to things like admin spawning
menus and things like that).

need feedback on if this is actually good for the game.
## Changelog
🆑
add: Soda cans show up in the silver slime drink table.
add: Examine tag for items that are not mean to show up ingame.
refactor: Standardizes how gifts rule out abstract types.
fix: gifts no longer check if something has an inhand, massively
expanding the list of potential items.
/🆑
This commit is contained in:
FalloutFalcon
2025-09-12 17:36:15 -05:00
committed by GitHub
parent 71c49cb4d1
commit d2f34e33be
165 changed files with 289 additions and 101 deletions
+17
View File
@@ -0,0 +1,17 @@
// Its not full proof but it standerizes behavoir between gifts and lootboxes
/// Used for random item gen to try and generate a list of types that arent weird parent types and similar
/proc/get_sane_item_types(requested_type)
if(!ispath(requested_type, /obj/item))
return list()
var/list/all_valid_types = list()
for(var/obj/item/iter_type as anything in typesof(requested_type))
if((iter_type.abstract_type == iter_type) || (iter_type.item_flags & ABSTRACT))
continue
if(iter_type.spawn_blacklisted)
continue
// The original behavior also included inhand icon states but that seems dumb
// if(!iter_type.icon_state || !iter_type.inhand_icon_state)
if(!iter_type.icon_state)
continue // With the existance of abstract_type we could prob depricate this handling at some point
all_valid_types += iter_type
return all_valid_types
+11 -32
View File
@@ -3,45 +3,24 @@
var/static/list/allowed_food = list()
if(!LAZYLEN(allowed_food)) //it's static so we only ever do this once
var/list/blocked = list(
/obj/item/food/bowled,
/obj/item/food/bread,
/obj/item/food/breadslice,
/obj/item/food/cake,
/obj/item/food/cakeslice,
/obj/item/food/clothing,
/obj/item/food/drug,
/obj/item/food/grown,
/obj/item/food/grown/ash_flora,
/obj/item/food/grown/mushroom,
/obj/item/food/grown/nettle,
/obj/item/food/kebab,
/obj/item/food/meat,
/obj/item/food/meat/slab,
/obj/item/food/meat/slab/human/mutant,
/obj/item/food/pie,
/obj/item/food/pieslice,
/obj/item/food/pizza,
/obj/item/food/pizzaslice,
/obj/item/food/salad,
/obj/item/food/spaghetti,
)
var/list/blocked = list() // This used to be populated
var/list/unfiltered_allowed_food = subtypesof(/obj/item/food) - blocked
for(var/obj/item/food/food as anything in unfiltered_allowed_food)
if(!initial(food.icon_state)) //food with no icon_state should probably not be spawned
continue
allowed_food.Add(food)
allowed_food = get_sane_item_types(/obj/item/food) - blocked
return pick(allowed_food)
///Gets a random drink excluding the blocked type
/proc/get_random_drink()
var/list/blocked = list(
/obj/item/reagent_containers/cup/soda_cans,
/obj/item/reagent_containers/cup/glass/bottle
var/static/list/allowed_drinks = list()
if(!LAZYLEN(allowed_drinks))
var/list/blocked = list(
/obj/item/reagent_containers/cup/glass/bottle
)
return pick(subtypesof(/obj/item/reagent_containers/cup/glass) - blocked)
allowed_drinks = get_sane_item_types(/obj/item/reagent_containers/cup/glass) + get_sane_item_types(/obj/item/reagent_containers/cup/soda_cans) - blocked
return pick(allowed_drinks)
///Picks a string of symbols to display as the law number for hacked or ion laws
/proc/ion_num() //! is at the start to prevent us from changing say modes via get_message_mode()
+1 -1
View File
@@ -120,7 +120,7 @@ GLOBAL_LIST_INIT(blood_types, init_blood_types())
/proc/init_blood_types()
. = list()
for(var/datum/blood_type/blood_type_path as anything in subtypesof(/datum/blood_type))
if(blood_type_path::root_abstract_type == blood_type_path) // Don't instantiate abstract blood types
if(blood_type_path::abstract_type == blood_type_path) // Don't instantiate abstract blood types
continue
var/datum/blood_type/new_type = new blood_type_path()
.[new_type.id] = new_type
@@ -1,4 +1,6 @@
/datum/config_entry
/// Do not instantiate if type matches this
abstract_type = /datum/config_entry
/// Read-only, this is determined by the last portion of the derived entry type
var/name
/// The configured value for this entry. This shouldn't be initialized in code, instead set default
@@ -13,8 +15,6 @@
var/deprecated_by
/// The /datum/config_entry type that supersedes this one
var/protection = NONE
/// Do not instantiate if type matches this
var/abstract_type = /datum/config_entry
/// Force validate and set on VV. VAS proccall guard will run regardless.
var/vv_VAS = TRUE
/// Controls if error is thrown when duplicate configuration values for this entry type are encountered
+2 -3
View File
@@ -4,6 +4,8 @@
// of the trauma.
/datum/brain_trauma
/// Tracks abstract types of brain traumas, useful for determining traumas that should not exist
abstract_type = /datum/brain_trauma
var/name = "Brain Trauma"
var/desc = "A trauma caused by brain damage, which causes issues to the patient."
var/scan_desc = "generic brain trauma" //description when detected by a health scanner
@@ -15,9 +17,6 @@
var/random_gain = TRUE //can this be gained through random traumas?
var/resilience = TRAUMA_RESILIENCE_BASIC //how hard is this to cure?
/// Tracks abstract types of brain traumas, useful for determining traumas that should not exist
var/abstract_type = /datum/brain_trauma
/datum/brain_trauma/Destroy()
// Handles our references with our brain
brain?.remove_trauma_from_traumas(src)
@@ -1,6 +1,8 @@
//Gun crafting parts til they can be moved elsewhere
// PARTS //
/obj/item/weaponcrafting
abstract_type = /obj/item/weaponcrafting
/obj/item/weaponcrafting/Initialize(mapload)
. = ..()
+8
View File
@@ -82,6 +82,14 @@
///The layout pref we take from the player looking at this datum's UI to know what layout to give.
var/datum/preference/choiced/layout_prefs_used = /datum/preference/choiced/tgui_layout
/**
* Parent types.
*
* Use path Ex:(abstract_type = /obj/item). Generally for abstract code objects, atoms with a set abstract_type can never be selected by spawner.
* These should be things that should never show up in a round, this does not include things that require init behavoir to function.
*/
var/abstract_type = /datum
/**
* Called when a href for this datum is clicked
*
+2 -2
View File
@@ -1,11 +1,11 @@
/// A possible genetic meltdown that occurs when someone exceeds 100 genetic instability
/datum/instability_meltdown
/// Used to ensure that abstract subtypes do not get picked
abstract_type = /datum/instability_meltdown
/// How likely a meltdown is to be picked
var/meltdown_weight = 1
/// If this meltdown is considered "fatal" or not
var/fatal = FALSE
/// Used to ensure that abstract subtypes do not get picked
var/abstract_type = /datum/instability_meltdown
/// Code that runs when this meltdown is picked
/datum/instability_meltdown/proc/meltdown(mob/living/carbon/human/victim)
+1
View File
@@ -214,6 +214,7 @@
//Krav Maga Gloves
/obj/item/clothing/gloves/krav_maga
abstract_type = /obj/item/clothing/gloves/krav_maga
clothing_traits = list(TRAIT_FAST_CUFFING)
/obj/item/clothing/gloves/krav_maga/Initialize(mapload)
+1 -1
View File
@@ -24,7 +24,7 @@ GLOBAL_LIST_INIT_TYPED(all_quirk_constant_data, /datum/quirk_constant_data, gene
/// A singleton datum representing constant data and procs used by quirks.
/datum/quirk_constant_data
/// Abstract in OOP terms. If this is our type, we will not be instantiated.
var/abstract_type = /datum/quirk_constant_data
abstract_type = /datum/quirk_constant_data
/// The typepath of the quirk we will be associated with in the global list. This is what we represent.
var/datum/quirk/associated_typepath
+2 -2
View File
@@ -3,6 +3,8 @@ GLOBAL_LIST_EMPTY(lobby_station_traits)
///Base class of station traits. These are used to influence rounds in one way or the other by influencing the levers of the station.
/datum/station_trait
/// Trait should not be instantiated in a round if its type matches this type
abstract_type = /datum/station_trait
///Name of the trait
var/name = "unnamed station trait"
///The type of this trait. Used to classify how this trait influences the station
@@ -33,8 +35,6 @@ GLOBAL_LIST_EMPTY(lobby_station_traits)
var/list/lobby_buttons = list()
/// The ID that we look for in dynamic.json. Not synced with 'name' because I can already see this go wrong
var/dynamic_threat_id
/// Trait should not be instantiated in a round if its type matches this type
var/abstract_type = /datum/station_trait
/datum/station_trait/New()
. = ..()
+4
View File
@@ -5,6 +5,7 @@
* as much as possible to the components/elements system
*/
/atom
abstract_type = /atom
layer = ABOVE_NORMAL_TURF_LAYER
plane = GAME_PLANE
appearance_flags = TILE_BOUND|LONG_GLIDE
@@ -137,6 +138,9 @@
/// Flags to check for in can_perform_action for mouse drag & drop checks. To bypass checks see interaction_flags_atom mouse drop flags
var/interaction_flags_mouse_drop = NONE
/// Generally for niche objects, atoms blacklisted can spawn if enabled by spawner.
var/spawn_blacklisted = FALSE
/**
* Top level of the destroy chain for most atoms
*
+3 -6
View File
@@ -4,12 +4,6 @@
/// Text that appears preceding the name in [/atom/proc/examine_title]
var/examine_thats = "That's"
/mob/living/carbon/human
examine_thats = "This is"
/mob/living/silicon/robot
examine_thats = "This is"
/**
* Called when a mob examines this atom: [/mob/verb/examinate]
*
@@ -80,6 +74,9 @@
*/
/atom/proc/examine_tags(mob/user)
. = list()
if(abstract_type == type)
.[span_hypnophrase("abstract")] = "This is an abstract concept, you should report this to a strange entity called GITHUB!"
SEND_SIGNAL(src, COMSIG_ATOM_EXAMINE_TAGS, user, .)
/// What this atom should be called in examine tags
+1
View File
@@ -1,4 +1,5 @@
/atom/movable
abstract_type = /atom/movable
layer = OBJ_LAYER
glide_size = 8
appearance_flags = TILE_BOUND|PIXEL_SCALE|LONG_GLIDE
+1
View File
@@ -88,6 +88,7 @@
name = "machinery"
icon = 'icons/obj/machines/fax.dmi'
desc = "Some kind of machine."
abstract_type = /obj/machinery
verb_say = "beeps"
verb_yell = "blares"
pressure_resistance = 15
@@ -1,6 +1,7 @@
/obj/effect/decal/cleanable
gender = PLURAL
layer = CLEANABLE_FLOOR_OBJECT_LAYER
abstract_type = /obj/effect/decal/cleanable
flags_1 = UNPAINTABLE_1
var/list/random_icon_states = null
/// When two of these are on a same tile or do we need to merge them into just one?
@@ -2,6 +2,7 @@
name = "decal"
layer = ABOVE_OPEN_TURF_LAYER
plane = FLOOR_PLANE
abstract_type = /obj/effect/decal
anchored = TRUE
resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF
+1
View File
@@ -3,6 +3,7 @@
//Effects are mostly temporary visual effects like sparks, smoke, as well as decals, etc...
/obj/effect
icon = 'icons/effects/effects.dmi'
abstract_type = /obj/effect
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF
move_resist = INFINITY
obj_flags = NONE
+8
View File
@@ -45,6 +45,14 @@
/// Override to define loot blacklist behavior
/obj/effect/spawner/proc/can_spawn(atom/loot)
if(!ispath(loot))
// Means its something evil like /obj/item/stack/sheet/mineral/diamond{amount = 15}
// (modified instances?) which is not a path and cannot be checked as one
return TRUE
if(loot.abstract_type == loot)
return FALSE
if(loot.spawn_blacklisted)
return FALSE
return TRUE
/obj/effect/list_container
@@ -0,0 +1,10 @@
/obj/effect/spawner/random/weapon
icon_state = "laser_gun"
/obj/effect/spawner/random/weapon/full_gun
loot_subtype_path = /obj/item/gun
/obj/effect/spawner/random/weapon/full_gun/make_item(spawn_loc, type_path_to_make)
var/obj/item/gun/spawned_gun = new type_path_to_make(spawn_loc)
spawned_gun.unlock()
return spawned_gun
+1
View File
@@ -2,6 +2,7 @@
/obj/item
name = "item"
icon = 'icons/obj/anomaly.dmi'
abstract_type = /obj/item
blocks_emissive = EMISSIVE_BLOCK_GENERIC
burning_particles = /particles/smoke/burning/small
pass_flags_self = PASSITEM
+1
View File
@@ -2,6 +2,7 @@
name = "blank chromosome"
icon = 'icons/obj/science/chromosomes.dmi'
icon_state = ""
abstract_type = /obj/item/chromosome
desc = "A tube holding chromosomal data."
force = 0
w_class = WEIGHT_CLASS_SMALL
@@ -12,6 +12,7 @@
inhand_icon_state = "electronic"
lefthand_file = 'icons/mob/inhands/items/devices_lefthand.dmi'
righthand_file = 'icons/mob/inhands/items/devices_righthand.dmi'
abstract_type = /obj/item/circuitboard
custom_materials = list(/datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT)
w_class = WEIGHT_CLASS_SMALL
grind_results = list(/datum/reagent/silicon = 20)
@@ -67,6 +68,7 @@ micro-manipulator, console screen, beaker, Microlaser, matter bin, power cells.
*/
/obj/item/circuitboard/machine
abstract_type = /obj/item/circuitboard/machine
name_extension = "(Machine Board)"
/// Whether this machine must be anchored to be constructed.
var/needs_anchored = TRUE
@@ -1,5 +1,6 @@
/obj/item/circuitboard/computer
name = "Generic"
abstract_type = /obj/item/circuitboard/computer
name_extension = "(Computer Board)"
/obj/item/circuitboard/computer/examine()
+2
View File
@@ -1,4 +1,6 @@
/* This file contains standalone items for debug purposes. */
/obj/item/debug
abstract_type = /obj/item/debug
/obj/item/debug/human_spawner
name = "human spawner"
+1
View File
@@ -328,6 +328,7 @@
inhand_icon_state = "defibpaddles0"
lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi'
spawn_blacklisted = TRUE
force = 0
throwforce = 6
@@ -1064,6 +1064,7 @@
/obj/item/flashlight/eyelight
name = "eyelight"
desc = "This shouldn't exist outside of someone's head, how are you seeing this?"
spawn_blacklisted = TRUE
obj_flags = CONDUCTS_ELECTRICITY
item_flags = DROPDEL
actions_types = list()
+1
View File
@@ -2,6 +2,7 @@
name = "generic drug"
desc = "I am error"
icon = 'icons/obj/medical/drugs.dmi'
abstract_type = /obj/item/food/drug
foodtypes = GROSS
food_flags = FOOD_FINGER_FOOD
max_volume = 50
+1
View File
@@ -8,6 +8,7 @@
icon_state = null
lefthand_file = 'icons/mob/inhands/items/food_lefthand.dmi'
righthand_file = 'icons/mob/inhands/items/food_righthand.dmi'
abstract_type = /obj/item/food
obj_flags = UNIQUE_RENAME
grind_results = list()
material_flags = MATERIAL_NO_EDIBILITY
+1
View File
@@ -2,6 +2,7 @@
name = "this is bait"
desc = "you got baited."
icon = 'icons/obj/fishing.dmi'
abstract_type = /obj/item/food/bait
/// Quality trait of this bait
var/bait_quality = TRAIT_BASIC_QUALITY_BAIT
/// Icon state added to main fishing rod icon when this bait is equipped
+2
View File
@@ -4,6 +4,7 @@
name = "bread?"
desc = "You shouldn't see this, call the coders."
icon = 'icons/obj/food/burgerbread.dmi'
abstract_type = /obj/item/food/bread
max_volume = 80
tastes = list("bread" = 10)
foodtypes = GRAIN
@@ -29,6 +30,7 @@
name = "breadslice?"
desc = "You shouldn't see this, call the coders."
icon = 'icons/obj/food/burgerbread.dmi'
abstract_type = /obj/item/food/breadslice
foodtypes = GRAIN
food_flags = FOOD_FINGER_FOOD
eat_time = 0.5 SECONDS
+2
View File
@@ -1,5 +1,6 @@
/obj/item/food/cake
icon = 'icons/obj/food/piecake.dmi'
abstract_type = /obj/item/food/cake
bite_consumption = 3
max_volume = 80
food_reagents = list(
@@ -24,6 +25,7 @@
/obj/item/food/cakeslice
icon = 'icons/obj/food/piecake.dmi'
abstract_type = /obj/item/food/cakeslice
food_reagents = list(
/datum/reagent/consumable/nutriment = 4,
/datum/reagent/consumable/nutriment/vitamin = 1,
+1
View File
@@ -6,6 +6,7 @@
/obj/item/food/cheese
name = "the concept of cheese"
desc = "This probably shouldn't exist."
abstract_type = /obj/item/food/cheese
tastes = list("cheese" = 1)
food_reagents = list(/datum/reagent/consumable/nutriment/fat = 3)
foodtypes = DAIRY
+2
View File
@@ -4,6 +4,7 @@
name = "donut"
desc = "Goes great with robust coffee."
icon = 'icons/obj/food/donuts.dmi'
abstract_type = /obj/item/food/donut
inhand_icon_state = "donut1"
bite_consumption = 5
food_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/sugar = 3)
@@ -377,6 +378,7 @@
/obj/item/food/donut/jelly/slimejelly
name = "jelly donut"
desc = "You jelly?"
abstract_type = /obj/item/food/donut/jelly/slimejelly
extra_reagent = /datum/reagent/toxin/slimejelly
foodtypes = GRAIN|DAIRY|JUNKFOOD|SUGAR|FRIED|BREAKFAST|TOXIC
+1
View File
@@ -578,6 +578,7 @@
/obj/item/food/pizza/flatbread
icon = 'icons/obj/food/lizard.dmi'
icon_state = null
abstract_type = /obj/item/food/pizza/flatbread
slice_type = null
/obj/item/food/pizza/flatbread/rustic
+1
View File
@@ -882,6 +882,7 @@
trash_type = /obj/item/stack/rods
icon = 'icons/obj/food/meat.dmi'
icon_state = "kebab"
abstract_type = /obj/item/food/kebab
w_class = WEIGHT_CLASS_NORMAL
food_reagents = list(/datum/reagent/consumable/nutriment/protein = 14)
tastes = list("meat" = 3, "metal" = 1)
+4
View File
@@ -2,6 +2,7 @@
custom_materials = list(/datum/material/meat = MEATSLAB_MATERIAL_AMOUNT)
w_class = WEIGHT_CLASS_SMALL
icon = 'icons/obj/food/meat.dmi'
abstract_type = /obj/item/food/meat
var/subjectname = ""
var/subjectjob = null
var/blood_decal_type = /obj/effect/decal/cleanable/blood
@@ -67,6 +68,9 @@
/obj/item/food/meat/slab/human/make_processable()
AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/plain/human, 3, 3 SECONDS, table_required = TRUE, screentip_verb = "Cut")
/obj/item/food/meat/slab/human/mutant
abstract_type = /obj/item/food/meat/slab/human/mutant
/obj/item/food/meat/slab/human/mutant/slime
icon_state = "slimemeat"
desc = "Because jello wasn't offensive enough to vegans."
+2
View File
@@ -2,6 +2,7 @@
/obj/item/food/pizza
name = "pizza"
icon = 'icons/obj/food/pizza.dmi'
abstract_type = /obj/item/food/pizza
w_class = WEIGHT_CLASS_NORMAL
max_volume = 80
icon_state = "pizzamargherita"
@@ -124,6 +125,7 @@
/obj/item/food/pizzaslice
name = "pizza slice"
icon = 'icons/obj/food/pizza.dmi'
abstract_type = /obj/item/food/pizzaslice
food_reagents = list(/datum/reagent/consumable/nutriment = 5)
icon_state = "pizzamargheritaslice"
foodtypes = GRAIN
+1
View File
@@ -2,6 +2,7 @@
////////////////////////////////////////////SALAD////////////////////////////////////////////
/obj/item/food/salad
icon = 'icons/obj/food/soupsalad.dmi'
abstract_type = /obj/item/food/salad
trash_type = /obj/item/reagent_containers/cup/bowl
bite_consumption = 3
w_class = WEIGHT_CLASS_NORMAL
+2 -1
View File
@@ -1,6 +1,7 @@
/obj/item/food/bowled
w_class = WEIGHT_CLASS_NORMAL
icon = 'icons/obj/food/soupsalad.dmi'
abstract_type = /obj/item/food/bowled
bite_consumption = 5
max_volume = 80
foodtypes = NONE
@@ -24,7 +25,7 @@
desc = "A wish come true!"
reagents.add_reagent(/datum/reagent/consumable/nutriment, 9)
reagents.add_reagent(/datum/reagent/consumable/nutriment/vitamin, 1)
/obj/item/food/bowled/mammi
name = "Mammi"
desc = "A bowl of mushy bread and milk. It reminds you, not too fondly, of a bowel movement."
@@ -1,6 +1,7 @@
///spaghetti prototype used by all subtypes
/obj/item/food/spaghetti
icon = 'icons/obj/food/spaghetti.dmi'
abstract_type = /obj/item/food/spaghetti
food_reagents = list(
/datum/reagent/consumable/nutriment = 1,
/datum/reagent/consumable/nutriment/vitamin = 1,
+1 -7
View File
@@ -111,13 +111,7 @@
var/static/list/obj/item/possible_gifts = null
if(isnull(possible_gifts))
possible_gifts = list()
for(var/type in subtypesof(/obj/item))
var/obj/item/thing = type
if(!initial(thing.icon_state) || !initial(thing.inhand_icon_state) || (initial(thing.item_flags) & ABSTRACT))
continue
possible_gifts += type
possible_gifts = get_sane_item_types(/obj/item)
var/gift_type = pick(possible_gifts)
return gift_type
+1
View File
@@ -9,6 +9,7 @@
*/
/obj/item/restraints
abstract_type = /obj/item/restraints
breakouttime = 1 MINUTES
dye_color = DYE_PRISONER
icon = 'icons/obj/weapons/restraints.dmi'
+1
View File
@@ -12,6 +12,7 @@
icon = 'icons/obj/service/kitchen.dmi'
lefthand_file = 'icons/mob/inhands/equipment/kitchen_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/kitchen_righthand.dmi'
abstract_type = /obj/item/kitchen
worn_icon_state = "kitchen_tool"
/obj/item/kitchen/Initialize(mapload)
+1
View File
@@ -1,5 +1,6 @@
/obj/item/melee/energy
icon = 'icons/obj/weapons/transforming_energy.dmi'
abstract_type = /obj/item/melee/energy
icon_angle = -45
max_integrity = 200
armor_type = /datum/armor/melee_energy
+1
View File
@@ -1,5 +1,6 @@
// Deprecated, you do not need to use this type for melee weapons.
/obj/item/melee
abstract_type = /obj/item/melee
item_flags = NEEDS_PERMIT
/obj/item/melee/chainofcommand
+1
View File
@@ -5,6 +5,7 @@
/obj/item/construction
name = "not for ingame use"
desc = "A device used to rapidly build and deconstruct. Reload with iron, plasteel, glass or compressed matter cartridges."
abstract_type = /obj/item/construction
opacity = FALSE
density = FALSE
anchored = FALSE
+1
View File
@@ -299,6 +299,7 @@
icon_state = null
worn_icon = 'icons/mob/clothing/head/helmet.dmi'
inhand_icon_state = null
abstract_type = /obj/item/clothing/head/helmet/plate/crusader/prophet
flags_1 = 0
armor_type = /datum/armor/crusader_prophet
worn_y_offset = 6
@@ -11,6 +11,7 @@
/obj/item/borg
icon = 'icons/mob/silicon/robot_items.dmi'
abstract_type = /obj/item/borg
/// Cost to use the stun arm
#define CYBORG_STUN_CHARGE_COST (0.2 * STANDARD_CELL_CHARGE)
+2 -1
View File
@@ -5,6 +5,7 @@
icon = 'icons/obj/weapons/shields.dmi'
lefthand_file = 'icons/mob/inhands/equipment/shields_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/shields_righthand.dmi'
abstract_type = /obj/item/shield
block_chance = 50
slot_flags = ITEM_SLOT_BACK
force = 10
@@ -343,7 +344,7 @@
var/effective_block_chance = final_block_chance
if(attack_type == OVERWHELMING_ATTACK)
effective_block_chance -= 25
if(attack_type == PROJECTILE_ATTACK)
var/obj/projectile/our_projectile = hitby
@@ -3,6 +3,7 @@
lefthand_file = 'icons/mob/inhands/items/sheets_lefthand.dmi'
righthand_file = 'icons/mob/inhands/items/sheets_righthand.dmi'
icon_state = "sheet-metal_3"
abstract_type = /obj/item/stack/sheet
full_w_class = WEIGHT_CLASS_NORMAL
force = 5
throwforce = 5
+1
View File
@@ -15,6 +15,7 @@
material_modifier = 0.05 //5%, so that a 50 sheet stack has the effect of 5k materials instead of 100k.
max_integrity = 100
item_flags = SKIP_FANTASY_ON_SPAWN
abstract_type = /obj/item/stack
/// A list to all recipies this stack item can create.
var/list/datum/stack_recipe/recipes
/// What's the name of just 1 of this stack. You have a stack of leather, but one piece of leather
+1
View File
@@ -19,6 +19,7 @@
// Generic non-item
/obj/item/storage/bag
abstract_type = /obj/item/storage/bag
slot_flags = ITEM_SLOT_BELT
w_class = WEIGHT_CLASS_BULKY
storage_type = /datum/storage/bag
+1
View File
@@ -7,6 +7,7 @@
worn_icon_state = "utility"
lefthand_file = 'icons/mob/inhands/equipment/belt_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/belt_righthand.dmi'
abstract_type = /obj/item/storage/belt
slot_flags = ITEM_SLOT_BELT
attack_verb_continuous = list("whips", "lashes", "disciplines")
attack_verb_simple = list("whip", "lash", "discipline")
+1
View File
@@ -15,6 +15,7 @@
/obj/item/storage/fancy
icon = 'icons/obj/food/containers.dmi'
abstract_type = /obj/item/storage/fancy
resistance_flags = FLAMMABLE
custom_materials = list(/datum/material/cardboard = SHEET_MATERIAL_AMOUNT)
/// Used by examine to report what this thing is holding.
@@ -1,6 +1,7 @@
/obj/item/storage
name = "storage"
icon = 'icons/obj/storage/storage.dmi'
abstract_type = /obj/item/storage
w_class = WEIGHT_CLASS_NORMAL
interaction_flags_click = ALLOW_RESTING | FORBID_TELEKINESIS_REACH
action_slots = ALL
+5
View File
@@ -27,6 +27,7 @@
* Intento
*/
/obj/item/toy
abstract_type = /obj/item/toy
throwforce = 0
throw_speed = 3
throw_range = 7
@@ -296,6 +297,7 @@
inhand_icon_state = "balloon"
lefthand_file = 'icons/mob/inhands/items/balloons_lefthand.dmi'
righthand_file = 'icons/mob/inhands/items/balloons_righthand.dmi'
abstract_type = /obj/item/toy/balloon_animal
throwforce = 0
throw_speed = 2
throw_range = 5
@@ -549,6 +551,9 @@
span_hear("You hear a gunshot!"))
return ITEM_INTERACT_SUCCESS
/obj/item/toy/ammo
abstract_type = /obj/item/toy/ammo
/obj/item/toy/ammo/gun
name = "capgun ammo"
desc = "Make sure to recycle the box in an autolathe when it gets empty."
+1
View File
@@ -3,6 +3,7 @@
icon = 'icons/obj/service/janitor.dmi'
lefthand_file = 'icons/mob/inhands/items/food_lefthand.dmi'
righthand_file = 'icons/mob/inhands/items/food_righthand.dmi'
abstract_type = /obj/item/trash
desc = "This is rubbish."
w_class = WEIGHT_CLASS_TINY
resistance_flags = FLAMMABLE
+1
View File
@@ -1,5 +1,6 @@
/obj
abstract_type = /obj
animate_movement = SLIDE_STEPS
speech_span = SPAN_ROBOT
var/obj_flags = CAN_BE_HIT
+1
View File
@@ -1,6 +1,7 @@
/// Inert structures, such as girders, machine frames, and crates/lockers.
/obj/structure
icon = 'icons/obj/structures.dmi'
abstract_type = /obj/structure
pressure_resistance = 8
max_integrity = 300
interaction_flags_atom = INTERACT_ATOM_ATTACK_HAND | INTERACT_ATOM_UI_INTERACT
+7 -9
View File
@@ -173,15 +173,7 @@ GLOBAL_LIST_INIT(mystery_fishing, list(
/// This proc is used to define what item types valid_types is filled with
/obj/structure/mystery_box/proc/generate_valid_types()
valid_types = list()
for(var/iter_path in typesof(selectable_base_type))
if(!ispath(iter_path, /obj/item))
continue
var/obj/item/iter_item = iter_path
if((initial(iter_item.item_flags) & ABSTRACT) || !initial(iter_item.icon_state) || !initial(iter_item.inhand_icon_state))
continue
valid_types += iter_path
valid_types = get_sane_item_types(selectable_base_type)
/// The box has been activated, play the sound and spawn the prop item
/obj/structure/mystery_box/proc/activate(mob/living/user)
@@ -275,6 +267,12 @@ GLOBAL_LIST_INIT(mystery_fishing, list(
/obj/structure/mystery_box/wands/generate_valid_types()
valid_types = GLOB.mystery_magic
/obj/structure/mystery_box/wildcard
desc = "A wooden crate that seems equally magical and mysterious, capable of granting the user all kinds of different pieces of gear. This one has an EXTREAMLY extended array of weaponry."
/obj/structure/mystery_box/wildcard/generate_valid_types()
valid_types = GLOB.summoned_all_guns
///A fishing and pirate-themed mystery box, rarely found by fishing in the ocean, then another cannot be caught for the next 30 minutes.
/obj/structure/mystery_box/fishing
name = "treasure chest"
+1
View File
@@ -1,6 +1,7 @@
/turf/closed
layer = CLOSED_TURF_LAYER
plane = WALL_PLANE
abstract_type = /turf/closed
turf_flags = IS_SOLID
opacity = TRUE
density = TRUE
@@ -2,6 +2,7 @@
name = "mineral wall"
desc = "This shouldn't exist"
icon_state = ""
abstract_type = /turf/closed/wall/mineral
smoothing_flags = SMOOTH_BITMASK
canSmoothWith = null
rcd_memory = null
+1
View File
@@ -1,4 +1,5 @@
/turf/open
abstract_type = /turf/open
layer = LOW_FLOOR_LAYER
plane = FLOOR_PLANE
///negative for faster, positive for slower
+1
View File
@@ -3,6 +3,7 @@ GLOBAL_LIST_EMPTY(station_turfs)
/// Any floor or wall. What makes up the station and the rest of the map.
/turf
icon = 'icons/turf/floors.dmi'
abstract_type = /turf
datum_flags = DF_STATIC_OBJECT
vis_flags = VIS_INHERIT_ID // Important for interaction with and visualization of openspace.
luminosity = 1
@@ -1,4 +1,5 @@
/obj/item/antag_spawner
abstract_type = /obj/item/antag_spawner
throw_speed = 1
throw_range = 5
w_class = WEIGHT_CLASS_TINY
@@ -2,6 +2,7 @@
icon = 'icons/obj/antags/abductor.dmi'
lefthand_file = 'icons/mob/inhands/antag/abductor_lefthand.dmi'
righthand_file = 'icons/mob/inhands/antag/abductor_righthand.dmi'
abstract_type = /obj/item/abductor
/obj/item/proc/AbductorCheck(mob/user)
if (HAS_TRAIT(user, TRAIT_ABDUCTOR_TRAINING))
@@ -3,6 +3,7 @@
*/
/datum/action/changeling
abstract_type = /datum/action/changeling
name = "Prototype Sting - Debug button, ahelp this"
background_icon_state = "bg_changeling"
overlay_icon_state = "bg_changeling_border"
@@ -11,6 +11,7 @@
//Parent to shields and blades because muh copypasted code.
/datum/action/changeling/weapon
abstract_type = /datum/action/changeling/weapon
name = "Organic Weapon"
desc = "Go tell a coder if you see this"
helptext = "Yell at Miauw and/or Perakp"
@@ -87,6 +88,7 @@
//Parent to space suits and armor.
/datum/action/changeling/suit
abstract_type = /datum/action/changeling/suit
name = "Organic Suit"
desc = "Go tell a coder if you see this"
helptext = "Yell at Miauw and/or Perakp"
@@ -9,6 +9,7 @@
/obj/item/clothing/glasses/changeling
name = "flesh"
spawn_blacklisted = TRUE
item_flags = DROPDEL
//ATTACK HAND IGNORING PARENT RETURN VALUE
@@ -24,6 +25,7 @@
/obj/item/clothing/under/changeling
name = "flesh"
spawn_blacklisted = TRUE
item_flags = DROPDEL
//ATTACK HAND IGNORING PARENT RETURN VALUE
@@ -39,6 +41,7 @@
/obj/item/clothing/suit/changeling
name = "flesh"
spawn_blacklisted = TRUE
allowed = list(/obj/item/changeling)
item_flags = DROPDEL
@@ -56,6 +59,7 @@
/obj/item/clothing/head/changeling
name = "flesh"
icon_state = null
spawn_blacklisted = TRUE
item_flags = DROPDEL
//ATTACK HAND IGNORING PARENT RETURN VALUE
@@ -71,6 +75,7 @@
/obj/item/clothing/shoes/changeling
name = "flesh"
spawn_blacklisted = TRUE
item_flags = DROPDEL
//ATTACK HAND IGNORING PARENT RETURN VALUE
@@ -86,6 +91,7 @@
/obj/item/clothing/gloves/changeling
name = "flesh"
spawn_blacklisted = TRUE
item_flags = DROPDEL
//ATTACK HAND IGNORING PARENT RETURN VALUE
@@ -101,6 +107,7 @@
/obj/item/clothing/mask/changeling
name = "flesh"
spawn_blacklisted = TRUE
item_flags = DROPDEL
//ATTACK HAND IGNORING PARENT RETURN VALUE
@@ -116,6 +123,7 @@
/obj/item/changeling
name = "flesh"
spawn_blacklisted = TRUE
slot_flags = ALL
item_flags = DROPDEL
+2 -2
View File
@@ -7,6 +7,8 @@
desc = "Placeholder. Yell at Firecage if you SOMEHOW see this."
icon = 'icons/obj/art/statue.dmi'
icon_state = ""
/// Abstract root type
abstract_type = /obj/structure/statue
density = TRUE
anchored = FALSE
max_integrity = 100
@@ -18,8 +20,6 @@
var/impressiveness = 15
/// Art component subtype added to this statue
var/art_type = /datum/element/art
/// Abstract root type
var/abstract_type = /obj/structure/statue
/obj/structure/statue/Initialize(mapload)
. = ..()
@@ -79,6 +79,9 @@ GLOBAL_LIST_INIT(preference_entries_by_key, init_preference_entries_by_key())
/// Represents an individual preference.
/datum/preference
/// Do not instantiate if type matches this.
abstract_type = /datum/preference
/// The key inside the savefile to use.
/// This is also sent to the UI.
/// Once you pick this, don't change it.
@@ -89,9 +92,6 @@ GLOBAL_LIST_INIT(preference_entries_by_key, init_preference_entries_by_key())
/// It is up to the PreferencesMenu UI itself to interpret it.
var/category = "misc"
/// Do not instantiate if type matches this.
var/abstract_type = /datum/preference
/// What savefile should this preference be read from?
/// Valid values are PREFERENCE_CHARACTER and PREFERENCE_PLAYER.
/// See the documentation in [code/__DEFINES/preferences.dm].
+2
View File
@@ -1,5 +1,6 @@
/obj/item/clothing
name = "clothing"
abstract_type = /obj/item/clothing
resistance_flags = FLAMMABLE
max_integrity = 200
integrity_failure = 0.4
@@ -85,6 +86,7 @@
/obj/item/food/clothing
name = "temporary moth clothing snack item"
desc = "If you're reading this it means I messed up. This is related to moths eating clothes and I didn't know a better way to do it than making a new food object. <--- stinky idiot wrote this"
spawn_blacklisted = TRUE
bite_consumption = 1
// sigh, ok, so it's not ACTUALLY infinite nutrition. this is so you can eat clothes more than...once.
// bite_consumption limits how much you actually get, and the take_damage in after eat makes sure you can't abuse this.
+1
View File
@@ -4,6 +4,7 @@
name = "ears"
lefthand_file = 'icons/mob/inhands/clothing/ears_lefthand.dmi'
righthand_file = 'icons/mob/inhands/clothing/ears_righthand.dmi'
abstract_type = /obj/item/clothing/ears
w_class = WEIGHT_CLASS_TINY
throwforce = 0
slot_flags = ITEM_SLOT_EARS
@@ -4,6 +4,7 @@
icon = 'icons/obj/clothing/glasses.dmi'
lefthand_file = 'icons/mob/inhands/clothing/glasses_lefthand.dmi'
righthand_file = 'icons/mob/inhands/clothing/glasses_righthand.dmi'
abstract_type = /obj/item/clothing/glasses
w_class = WEIGHT_CLASS_SMALL
slot_flags = ITEM_SLOT_EYES
strip_delay = 2 SECONDS
+1
View File
@@ -6,6 +6,7 @@
inhand_icon_state = "greyscale_gloves"
lefthand_file = 'icons/mob/inhands/clothing/gloves_lefthand.dmi'
righthand_file = 'icons/mob/inhands/clothing/gloves_righthand.dmi'
abstract_type = /obj/item/clothing/gloves
greyscale_colors = null
greyscale_config_inhand_left = /datum/greyscale_config/gloves_inhand_left
greyscale_config_inhand_right = /datum/greyscale_config/gloves_inhand_right
@@ -1,4 +1,5 @@
/obj/item/clothing/gloves/color
abstract_type = /obj/item/clothing/gloves/color
dying_key = DYE_REGISTRY_GLOVES
greyscale_colors = null
+1
View File
@@ -4,6 +4,7 @@
worn_icon = 'icons/mob/clothing/head/default.dmi'
lefthand_file = 'icons/mob/inhands/clothing/hats_lefthand.dmi'
righthand_file = 'icons/mob/inhands/clothing/hats_righthand.dmi'
abstract_type = /obj/item/clothing/head
body_parts_covered = HEAD
slot_flags = ITEM_SLOT_HEAD
@@ -7,6 +7,7 @@
icon = 'icons/obj/clothing/head/costume.dmi'
worn_icon = 'icons/mob/clothing/head/costume.dmi'
icon_state = null
abstract_type = /obj/item/clothing/head/collectable
/obj/item/clothing/head/collectable/Initialize(mapload)
. = ..()
+1
View File
@@ -1,6 +1,7 @@
/obj/item/clothing/head/costume
icon = 'icons/obj/clothing/head/costume.dmi'
worn_icon = 'icons/mob/clothing/head/costume.dmi'
abstract_type = /obj/item/clothing/head/costume
/obj/item/clothing/head/costume/powdered_wig
name = "powdered wig"
+4
View File
@@ -1,6 +1,7 @@
/obj/item/clothing/head/hats
icon = 'icons/obj/clothing/head/hats.dmi'
worn_icon = 'icons/mob/clothing/head/hats.dmi'
abstract_type = /obj/item/clothing/head/hats
/obj/item/clothing/head/hats/centhat
name = "\improper CentCom hat"
@@ -356,6 +357,9 @@
upsprite = "ushankaup_polar"
downsprite = "ushankadown_polar"
/obj/item/clothing/head/costume/nightcap
abstract_type = /obj/item/clothing/head/costume/nightcap
/obj/item/clothing/head/costume/nightcap/blue
name = "blue nightcap"
desc = "A blue nightcap for all the dreamers and snoozers out there."
+1
View File
@@ -398,6 +398,7 @@
/obj/item/clothing/head/hats/hos
name = "generic head of security hat"
desc = "Please contact the Nanotrasen Costuming Department if found."
abstract_type = /obj/item/clothing/head/hats/hos
armor_type = /datum/armor/hats_hos
strip_delay = 8 SECONDS
+1
View File
@@ -3,6 +3,7 @@
icon = 'icons/obj/clothing/masks.dmi'
lefthand_file = 'icons/mob/inhands/clothing/masks_lefthand.dmi'
righthand_file = 'icons/mob/inhands/clothing/masks_righthand.dmi'
abstract_type = /obj/item/clothing/mask
body_parts_covered = HEAD
slot_flags = ITEM_SLOT_MASK
strip_delay = 4 SECONDS
@@ -14,6 +14,7 @@ GLOBAL_LIST_INIT(cursed_animal_masks, list(
))
/obj/item/clothing/mask/animal
abstract_type = /obj/item/clothing/mask
w_class = WEIGHT_CLASS_SMALL
clothing_flags = VOICEBOX_TOGGLABLE
var/modifies_speech = TRUE
@@ -193,6 +194,7 @@ GLOBAL_LIST_INIT(cursed_animal_masks, list(
/obj/item/clothing/mask/animal/small
name = "A small animal mask"
desc = "If you're seeing this, yell at a coder."
abstract_type = /obj/item/clothing/mask/animal/small
flags_inv = HIDEFACE|HIDESNOUT
/obj/item/clothing/mask/animal/small/make_cursed()
+1
View File
@@ -1,6 +1,7 @@
/obj/item/clothing/neck
name = "necklace"
icon = 'icons/obj/clothing/neck.dmi'
abstract_type = /obj/item/clothing/neck
body_parts_covered = NECK
slot_flags = ITEM_SLOT_NECK
interaction_flags_click = NEED_DEXTERITY
+1
View File
@@ -3,6 +3,7 @@
icon = 'icons/obj/clothing/shoes.dmi'
lefthand_file = 'icons/mob/inhands/clothing/shoes_lefthand.dmi'
righthand_file = 'icons/mob/inhands/clothing/shoes_righthand.dmi'
abstract_type = /obj/item/clothing/shoes
desc = "Comfortable-looking shoes."
pickup_sound = 'sound/items/handling/shoes/sneakers_pickup1.ogg'
drop_sound = 'sound/items/handling/shoes/sneakers_drop1.ogg'
+1
View File
@@ -3,6 +3,7 @@
icon = 'icons/obj/clothing/suits/default.dmi'
lefthand_file = 'icons/mob/inhands/clothing/suits_lefthand.dmi'
righthand_file = 'icons/mob/inhands/clothing/suits_righthand.dmi'
abstract_type = /obj/item/clothing/suit
var/fire_resist = T0C+100
allowed = list(
/obj/item/tank/internals/emergency_oxygen,
+4
View File
@@ -2,6 +2,7 @@
name = "armor"
icon = 'icons/obj/clothing/suits/armor.dmi'
worn_icon = 'icons/mob/clothing/suits/armor.dmi'
abstract_type = /obj/item/clothing/suit/armor
allowed = null
body_parts_covered = CHEST
cold_protection = CHEST|GROIN
@@ -755,6 +756,9 @@
acid = 50
wound = 30
/obj/item/clothing/suit/armor/durability
abstract_type = /obj/item/clothing/suit/armor/durability
/obj/item/clothing/suit/armor/durability/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK, damage_type = BRUTE)
take_damage(1, BRUTE, 0, 0)
+1
View File
@@ -1,6 +1,7 @@
/obj/item/clothing/suit/costume
icon = 'icons/obj/clothing/suits/costume.dmi'
worn_icon = 'icons/mob/clothing/suits/costume.dmi'
abstract_type = /obj/item/clothing/suit/costume
/obj/item/clothing/suit/hooded/flashsuit
name = "flashy costume"
+2 -1
View File
@@ -28,8 +28,9 @@
desc = "This is obviously just a bedsheet, but maybe try it on?"
icon = 'icons/obj/clothing/suits/costume.dmi'
worn_icon = 'icons/mob/clothing/suits/costume.dmi'
user_vars_to_edit = list("name" = "Spooky Ghost", "real_name" = "Spooky Ghost" , "incorporeal_move" = INCORPOREAL_MOVE_BASIC, "appearance_flags" = KEEP_TOGETHER|TILE_BOUND, "alpha" = 150)
icon_state = "ghost_sheet"
inhand_icon_state = null
user_vars_to_edit = list("name" = "Spooky Ghost", "real_name" = "Spooky Ghost", "incorporeal_move" = INCORPOREAL_MOVE_BASIC, "appearance_flags" = KEEP_TOGETHER|TILE_BOUND, "alpha" = 150)
throwforce = 0
throw_speed = 1
throw_range = 2
+2
View File
@@ -1,6 +1,7 @@
/obj/item/clothing/suit/jacket
icon = 'icons/obj/clothing/suits/jacket.dmi'
worn_icon = 'icons/mob/clothing/suits/jacket.dmi'
abstract_type = /obj/item/clothing/suit/jacket
allowed = list(
/obj/item/flashlight,
/obj/item/tank/internals/emergency_oxygen,
@@ -22,6 +23,7 @@
/obj/item/clothing/suit/toggle/jacket
icon = 'icons/obj/clothing/suits/jacket.dmi'
worn_icon = 'icons/mob/clothing/suits/jacket.dmi'
abstract_type = /obj/item/clothing/suit/toggle/jacket
allowed = list(
/obj/item/flashlight,
/obj/item/tank/internals/emergency_oxygen,
+4
View File
@@ -58,9 +58,13 @@
return
/obj/item/clothing/suit/toggle
abstract_type = /obj/item/clothing/suit/toggle
/// The noun that is displayed to the user on toggle. EX: "Toggles the suit's [buttons]".
var/toggle_noun = "buttons"
/obj/item/clothing/suit/toggle/Initialize(mapload)
. = ..()
AddComponent(/datum/component/toggle_icon, toggle_noun)
/obj/item/clothing/head/hooded
abstract_type = /obj/item/clothing/head/hooded
+2
View File
@@ -4,6 +4,7 @@
worn_icon = 'icons/mob/clothing/under/default.dmi'
lefthand_file = 'icons/mob/inhands/clothing/suits_lefthand.dmi'
righthand_file = 'icons/mob/inhands/clothing/suits_righthand.dmi'
abstract_type = /obj/item/clothing/under
body_parts_covered = CHEST|GROIN|LEGS|ARMS
slot_flags = ITEM_SLOT_ICLOTHING
interaction_flags_click = NEED_DEXTERITY
@@ -533,4 +534,5 @@
return ..()
/obj/item/clothing/under/rank
abstract_type = /obj/item/clothing/under/rank
dying_key = DYE_REGISTRY_UNDER
@@ -15,6 +15,7 @@
worn_icon = 'icons/mob/clothing/accessories.dmi'
icon_state = "plasma"
inhand_icon_state = "" //no inhands
abstract_type = /obj/item/clothing/accessory
slot_flags = NONE
w_class = WEIGHT_CLASS_SMALL
item_flags = NOBLUDGEON
@@ -1,6 +1,7 @@
/obj/item/clothing/under/rank/cargo
icon = 'icons/obj/clothing/under/cargo.dmi'
worn_icon = 'icons/mob/clothing/under/cargo.dmi'
abstract_type = /obj/item/clothing/under/rank/cargo
/obj/item/clothing/under/rank/cargo/qm
name = "quartermaster's uniform"
@@ -1,6 +1,7 @@
/obj/item/clothing/under/rank/centcom
icon = 'icons/obj/clothing/under/centcom.dmi'
worn_icon = 'icons/mob/clothing/under/centcom.dmi'
abstract_type = /obj/item/clothing/under/rank/centcom
/obj/item/clothing/under/rank/centcom/commander
name = "\improper CentCom commander's suit"
@@ -3,6 +3,7 @@
/obj/item/clothing/under/rank/civilian
icon = 'icons/obj/clothing/under/civilian.dmi'
worn_icon = 'icons/mob/clothing/under/civilian.dmi'
abstract_type = /obj/item/clothing/under/rank/civilian
/obj/item/clothing/under/rank/civilian/purple_bartender
desc = "It looks like it has lots of flair!"
@@ -113,6 +114,7 @@
desc = "Slick threads."
icon = 'icons/obj/clothing/under/suits.dmi'
worn_icon = 'icons/mob/clothing/under/suits.dmi'
abstract_type = /obj/item/clothing/under/rank/civilian/lawyer
can_adjust = FALSE
/obj/item/clothing/under/rank/civilian/lawyer/dye_item(dye_color, dye_key_override)
@@ -3,6 +3,7 @@
/obj/item/clothing/under/rank/engineering
icon = 'icons/obj/clothing/under/engineering.dmi'
worn_icon = 'icons/mob/clothing/under/engineering.dmi'
abstract_type = /obj/item/clothing/under/rank/engineering
armor_type = /datum/armor/clothing_under/rank_engineering
resistance_flags = NONE
@@ -1,6 +1,7 @@
/obj/item/clothing/under/rank/medical
icon = 'icons/obj/clothing/under/medical.dmi'
worn_icon = 'icons/mob/clothing/under/medical.dmi'
abstract_type = /obj/item/clothing/under/rank/medical
armor_type = /datum/armor/clothing_under/rank_medical
/datum/armor/clothing_under/rank_medical
+1
View File
@@ -1,6 +1,7 @@
/obj/item/clothing/under/rank/rnd
icon = 'icons/obj/clothing/under/rnd.dmi'
worn_icon = 'icons/mob/clothing/under/rnd.dmi'
abstract_type = /obj/item/clothing/under/rank/rnd
armor_type = /datum/armor/clothing_under/science
/datum/armor/clothing_under/science

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