mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-07-20 04:26:03 +01:00
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:
@@ -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
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
. = ..()
|
||||
|
||||
@@ -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
|
||||
*
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
. = ..()
|
||||
|
||||
@@ -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
|
||||
*
|
||||
|
||||
@@ -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,4 +1,5 @@
|
||||
/atom/movable
|
||||
abstract_type = /atom/movable
|
||||
layer = OBJ_LAYER
|
||||
glide_size = 8
|
||||
appearance_flags = TILE_BOUND|PIXEL_SCALE|LONG_GLIDE
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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,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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -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,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,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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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,5 +1,6 @@
|
||||
|
||||
/obj
|
||||
abstract_type = /obj
|
||||
animate_movement = SLIDE_STEPS
|
||||
speech_span = SPAN_ROBOT
|
||||
var/obj_flags = CAN_BE_HIT
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,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,4 +1,5 @@
|
||||
/turf/open
|
||||
abstract_type = /turf/open
|
||||
layer = LOW_FLOOR_LAYER
|
||||
plane = FLOOR_PLANE
|
||||
///negative for faster, positive for slower
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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].
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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,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"
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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,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
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,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
Reference in New Issue
Block a user